@@ -15,13 +15,16 @@ class CorrectionsModel:
15
15
def __init__ (self ) -> None :
16
16
self .algorithms_observers = set () # need to add them here so they stay in scope
17
17
self .error_callback = None
18
+ self .algorithm_running = False
18
19
19
20
def apply (
20
21
self ,
21
22
ws_name : str ,
22
23
detailed_balance : bool ,
23
24
hyspec_polarizer_transmission : bool ,
24
25
temperature : str = "" ,
26
+ magentic_structure_factor : bool = False ,
27
+ ion_name : str = "" ,
25
28
) -> None :
26
29
"""Apply corrections.
27
30
@@ -52,6 +55,8 @@ def apply(
52
55
output_ws_name = f"{ ws_name } _DB"
53
56
if hyspec_polarizer_transmission :
54
57
output_ws_name = f"{ output_ws_name } _PT"
58
+ if magentic_structure_factor :
59
+ output_ws_name = f"{ output_ws_name } _MSF"
55
60
56
61
if detailed_balance :
57
62
self .apply_detailed_balance (
@@ -64,14 +69,27 @@ def apply(
64
69
input_ws_name = ws_name
65
70
if detailed_balance :
66
71
# wait for detailed balance to finish
67
- while not mtd . doesExist ( output_ws_name ) :
72
+ while self . algorithm_running :
68
73
time .sleep (0.1 )
69
74
input_ws_name = output_ws_name
70
75
self .apply_scattered_transmission_correction (
71
76
input_ws_name ,
72
77
output_ws_name ,
73
78
)
74
79
80
+ if magentic_structure_factor :
81
+ input_ws_name = ws_name
82
+ if hyspec_polarizer_transmission or detailed_balance :
83
+ # wait for others to finish
84
+ while self .algorithm_running :
85
+ time .sleep (0.1 )
86
+ input_ws_name = output_ws_name
87
+ self .apply_magnetic_form_factor_correction (
88
+ input_ws_name ,
89
+ ion_name ,
90
+ output_ws_name ,
91
+ )
92
+
75
93
def apply_detailed_balance (
76
94
self ,
77
95
ws_name : str ,
@@ -99,6 +117,8 @@ def apply_detailed_balance(
99
117
)
100
118
self .algorithms_observers .add (alg_obs )
101
119
120
+ self .algorithm_running = True
121
+
102
122
alg = AlgorithmManager .create ("ApplyDetailedBalanceMD" )
103
123
104
124
alg_obs .observeFinish (alg )
@@ -115,6 +135,7 @@ def apply_detailed_balance(
115
135
logger .error (str (err ))
116
136
if self .error_callback :
117
137
self .error_callback (str (err ))
138
+ self .algorithm_running = False
118
139
119
140
def apply_scattered_transmission_correction (
120
141
self ,
@@ -143,6 +164,8 @@ def apply_scattered_transmission_correction(
143
164
)
144
165
self .algorithms_observers .add (alg_obs )
145
166
167
+ self .algorithm_running = True
168
+
146
169
exponent_factor = 1.0 / 11.0 # see ref above
147
170
148
171
logger .information (f"Applying DGS Scattered Transmission Correction with exponent factor { exponent_factor } " )
@@ -162,6 +185,56 @@ def apply_scattered_transmission_correction(
162
185
logger .error (str (err ))
163
186
if self .error_callback :
164
187
self .error_callback (str (err ))
188
+ self .algorithm_running = False
189
+
190
+ def apply_magnetic_form_factor_correction (
191
+ self ,
192
+ ws_name : str ,
193
+ ion_name : str ,
194
+ output_ws_name : str ,
195
+ ) -> None :
196
+ """Apply MagneticFormFactorCorrection to the workspace.
197
+
198
+ Parameters
199
+ ----------
200
+ ws_name : str
201
+ Workspace name
202
+ ion_name : str
203
+ Ion name
204
+ output_ws_name : str
205
+ Output workspace name
206
+
207
+ Returns
208
+ -------
209
+ None
210
+ """
211
+
212
+ alg_obs = MagneticFormFactorCorrectionMDObserver (
213
+ parent = self ,
214
+ ws_name = ws_name ,
215
+ )
216
+ self .algorithms_observers .add (alg_obs )
217
+
218
+ self .algorithm_running = True
219
+
220
+ logger .information (f"Applying Magnetic Form Factor Correction with ion name { ion_name } " )
221
+
222
+ alg = AlgorithmManager .create ("MagneticFormFactorCorrectionMD" )
223
+ alg_obs .observeFinish (alg )
224
+ alg_obs .observeError (alg )
225
+
226
+ alg .initialize ()
227
+ alg .setLogging (False )
228
+ try :
229
+ alg .setProperty ("InputWorkspace" , ws_name )
230
+ alg .setProperty ("IonName" , ion_name )
231
+ alg .setProperty ("OutputWorkspace" , output_ws_name )
232
+ alg .execute ()
233
+ except RuntimeError as err :
234
+ logger .error (str (err ))
235
+ if self .error_callback :
236
+ self .error_callback (str (err ))
237
+ self .algorithm_running = False
165
238
166
239
def connect_error_message (self , callback ):
167
240
"""Set the callback function for error messages.
@@ -208,6 +281,7 @@ def apply_detailed_balance_finished(
208
281
else :
209
282
logger .information (f"Finished ApplyDetailedBalanceMD for { ws_name } " )
210
283
self .algorithms_observers .remove (alg )
284
+ self .algorithm_running = False
211
285
212
286
def apply_scattered_transmission_correction_finished (
213
287
self ,
@@ -240,6 +314,40 @@ def apply_scattered_transmission_correction_finished(
240
314
else :
241
315
logger .information (f"Finished DgsScatteredTransmissionCorrectionMD for { ws_name } " )
242
316
self .algorithms_observers .remove (alg )
317
+ self .algorithm_running = False
318
+
319
+ def apply_magnetic_form_factor_correction_finished (
320
+ self ,
321
+ ws_name : str ,
322
+ alg : "MagneticFormFactorCorrectionMDObserver" ,
323
+ error : bool = False ,
324
+ msg = "" ,
325
+ ) -> None :
326
+ """Call when MagneticFormFactorCorrectionMD finishes.
327
+
328
+ Parameters
329
+ ----------
330
+ ws_name : str
331
+ Workspace name
332
+ alg : MagneticFormFactorCorrectionMDObserver
333
+ Observer
334
+ error : bool, optional
335
+ Error flag, by default False
336
+ msg : str, optional
337
+ Error message, by default ""
338
+
339
+ Returns
340
+ -------
341
+ None
342
+ """
343
+ if error :
344
+ logger .error (f"Error in MagneticFormFactorCorrectionMD for { ws_name } " )
345
+ if self .error_callback :
346
+ self .error_callback (msg )
347
+ else :
348
+ logger .information (f"Finished MagneticFormFactorCorrectionMD for { ws_name } " )
349
+ self .algorithms_observers .remove (alg )
350
+ self .algorithm_running = False
243
351
244
352
def get_ws_alg_histories (self , ws_name : str ) -> list :
245
353
"""Get algorithm histories of the workspace.
@@ -297,6 +405,26 @@ def has_scattered_transmission_correction(self, ws_name: str) -> bool:
297
405
return True
298
406
return False
299
407
408
+ def has_magnetic_form_factor_correction (self , ws_name : str ) -> Tuple [bool , str ]:
409
+ """Check if the workspace has MagneticFormFactorCorrectionMD applied.
410
+
411
+ Parameters
412
+ ----------
413
+ ws_name : str
414
+ Workspace name
415
+
416
+ Returns
417
+ -------
418
+ Tuple[bool, str]
419
+ True if the workspace has MagneticFormFactorCorrectionMD applied.
420
+ Ion name if the workspace has MagneticFormFactorCorrectionMD applied.
421
+ """
422
+ alg_histories = self .get_ws_alg_histories (ws_name )
423
+ for alg_history in alg_histories :
424
+ if alg_history .name () == "MagneticFormFactorCorrectionMD" :
425
+ return True , alg_history .getPropertyValue ("IonName" )
426
+ return False , ""
427
+
300
428
301
429
class ApplyDetailedBalanceMDObserver (AlgorithmObserver ):
302
430
"""Observer for ApplyDetailedBalanceMD algorithm"""
@@ -334,3 +462,31 @@ def errorHandle(self, msg): # pylint: disable=invalid-name
334
462
self .parent .apply_scattered_transmission_correction_finished (
335
463
ws_name = self .ws_name , alg = self , error = True , msg = msg
336
464
)
465
+
466
+
467
+ class MagneticFormFactorCorrectionMDObserver (AlgorithmObserver ):
468
+ """Observer for MagneticFormFactorCorrectionMD algorithm"""
469
+
470
+ def __init__ (self , parent , ws_name : str ) -> None :
471
+ super ().__init__ ()
472
+ self .parent = parent
473
+ self .ws_name = ws_name
474
+
475
+ def finishHandle (self ): # pylint: disable=invalid-name
476
+ """Call upon algorithm finishing"""
477
+ self .parent .apply_magnetic_form_factor_correction_finished (ws_name = self .ws_name , alg = self , error = False , msg = "" )
478
+
479
+ def errorHandle (self , msg ): # pylint: disable=invalid-name
480
+ """Call upon algorithm error"""
481
+ self .parent .apply_magnetic_form_factor_correction_finished (ws_name = self .ws_name , alg = self , error = True , msg = msg )
482
+
483
+
484
+ def get_ions_list ():
485
+ """Get the list of allowed ions from the MagneticFormFactorCorrectionMD algorithm"""
486
+ try :
487
+ alg = AlgorithmManager .create ("MagneticFormFactorCorrectionMD" )
488
+ except RuntimeError as err :
489
+ logger .error (str (err ))
490
+ return []
491
+ alg .initialize ()
492
+ return sorted (alg .getProperty ("IonName" ).allowedValues )
0 commit comments