1 | """ Sample LET reduction scrip """ |
---|
2 | |
---|
3 | from ReductionWrapper import * |
---|
4 | try: |
---|
5 | import reduce_vars as rv |
---|
6 | except: |
---|
7 | rv = None |
---|
8 | |
---|
9 | # |
---|
10 | def find_binning_range(energy,ebin): |
---|
11 | """ function finds the binning range used in multirep mode |
---|
12 | for merlin ls=11.8,lm2=10. mult=2.8868 dt_DAE=1; |
---|
13 | for LET ls=25,lm2=23.5 mult=4.1 dt_DAE=1.6; |
---|
14 | all these values have to be already present in IDF and should be taken from there |
---|
15 | |
---|
16 | # THIS FUNCTION SHOULD BE MADE GENERIG AND MOVED OUT OF HERE |
---|
17 | """ |
---|
18 | |
---|
19 | InstrName = config['default.instrument'][0:3]; |
---|
20 | if InstrName.find('LET')>-1: |
---|
21 | ls =25; |
---|
22 | lm2 =23.5; |
---|
23 | mult=4.1; |
---|
24 | dt_DAE = 1.6 |
---|
25 | elif InstrName.find('MER')>-1: |
---|
26 | ls =11.8; |
---|
27 | lm2=10; |
---|
28 | mult=2.8868; |
---|
29 | dt_DAE = 1 |
---|
30 | else: |
---|
31 | raise RuntimeError("Find_binning_range: unsupported/unknown instrument found") |
---|
32 | |
---|
33 | energy=float(energy) |
---|
34 | |
---|
35 | emin=(1.0-ebin[2])*energy #minimum energy is with 80% energy loss |
---|
36 | lam=(81.81/energy)**0.5 |
---|
37 | lam_max=(81.81/emin)**0.5 |
---|
38 | tsam=252.82*lam*ls #time at sample |
---|
39 | tmon2=252.82*lam*lm2 #time to monitor 6 on LET |
---|
40 | tmax=tsam+(252.82*lam_max*mult) #maximum time to measure inelastic signal to |
---|
41 | t_elastic=tsam+(252.82*lam*mult) #maximum time of elastic signal |
---|
42 | tbin=[int(tmon2),dt_DAE,int(tmax)] |
---|
43 | energybin=[float("{0: 6.4f}".format(elem*energy)) for elem in ebin] |
---|
44 | |
---|
45 | return (energybin,tbin,t_elastic); |
---|
46 | #-------------------------------------------------------------------------------------------------------- |
---|
47 | def find_background(ws_name,bg_range): |
---|
48 | """ Function to find background from multirep event workspace |
---|
49 | dt_DAE = 1 for MERLIN and 1.6 for LET |
---|
50 | should be precalculated or taken from IDF |
---|
51 | |
---|
52 | # THIS FUNCTION SHOULD BE MADE GENERIC AND MOVED OUT OF HERE |
---|
53 | """ |
---|
54 | InstrName = config['default.instrument'][0:3]; |
---|
55 | if InstrName.find('LET')>-1: |
---|
56 | dt_DAE = 1.6 |
---|
57 | elif InstrName.find('MER')>-1: |
---|
58 | dt_DAE = 1 |
---|
59 | else: |
---|
60 | raise RuntimeError("Find_binning_range: unsupported/unknown instrument found") |
---|
61 | |
---|
62 | bg_ws_name = 'bg'; |
---|
63 | delta=bg_range[1]-bg_range[0] |
---|
64 | Rebin(InputWorkspace='w1',OutputWorkspace=bg_ws_name,Params=[bg_range[0],delta,bg_range[1]],PreserveEvents=False) |
---|
65 | v=(delta)/dt_DAE |
---|
66 | CreateSingleValuedWorkspace(OutputWorkspace='d',DataValue=v) |
---|
67 | Divide(LHSWorkspace=bg_ws_name,RHSWorkspace='d',OutputWorkspace=bg_ws_name) |
---|
68 | return bg_ws_name; |
---|
69 | |
---|
70 | |
---|
71 | class ReduceLET_OneRep(ReductionWrapper): |
---|
72 | @MainProperties |
---|
73 | def def_main_properties(self): |
---|
74 | """ Define main properties used in reduction """ |
---|
75 | |
---|
76 | |
---|
77 | prop = {}; |
---|
78 | ei = 7.0 |
---|
79 | ebin = [-1,0.002,0.95] |
---|
80 | |
---|
81 | prop['sample_run'] = 'LET00006278.nxs' |
---|
82 | prop['wb_run'] = 'LET00005545.raw' |
---|
83 | prop['incident_energy'] = ei; |
---|
84 | prop['energy_bins'] = ebin |
---|
85 | |
---|
86 | |
---|
87 | # Absolute units reduction properties. |
---|
88 | #prop['monovan_run'] = 17589 |
---|
89 | #prop['sample_mass'] = 10/(94.4/13) # -- this number allows to get approximately the same system test intensities for MAPS as the old test |
---|
90 | #prop['sample_rmm'] = 435.96 # |
---|
91 | return prop |
---|
92 | |
---|
93 | @AdvancedProperties |
---|
94 | def def_advanced_properties(self): |
---|
95 | """ separation between simple and advanced properties depends |
---|
96 | on scientist, experiment and user. |
---|
97 | main properties override advanced properties. |
---|
98 | """ |
---|
99 | |
---|
100 | prop = {}; |
---|
101 | prop['map_file'] = 'c:\Users\wkc26243\Documents\work\InstrumentFiles\let\one2one_103.map' |
---|
102 | prop['hardmaskOnly'] ='LET_hard.msk' |
---|
103 | prop['det_cal_file'] = 'det_corrected7.dat' |
---|
104 | prop['save_format']='' |
---|
105 | prop['bleed'] = False |
---|
106 | prop['norm_method']='current' |
---|
107 | prop['detector_van_range']=[0.5,200] |
---|
108 | prop['load_monitors_with_workspace']=False |
---|
109 | prop['use_hard_mask_only']=True |
---|
110 | #TODO: this has to be loaded from the workspace and work without this |
---|
111 | #prop['ei-mon1-spec']=40966 |
---|
112 | |
---|
113 | |
---|
114 | return prop; |
---|
115 | # |
---|
116 | @iliad |
---|
117 | def main(self,input_file=None,output_directory=None): |
---|
118 | # run reduction, write auxiliary script to add something here. |
---|
119 | |
---|
120 | prop = self.iliad_prop; |
---|
121 | # |
---|
122 | sample_run = prop.sample_run |
---|
123 | white_run = prop.wb_run |
---|
124 | white_ws = 'wb_wksp' |
---|
125 | LoadRaw(Filename=white_run,OutputWorkspace=white_ws) |
---|
126 | #prop.wb_run = mtd[white_ws] |
---|
127 | |
---|
128 | sample_ws = 'w1' |
---|
129 | monitors_ws = sample_ws + '_monitors' |
---|
130 | LoadEventNexus(Filename=sample_run,OutputWorkspace=sample_ws, |
---|
131 | SingleBankPixelsOnly='0',LoadMonitors='1', |
---|
132 | MonitorsAsEvents='0') |
---|
133 | #ConjoinWorkspaces(InputWorkspace1=sample_ws, InputWorkspace2=monitors_ws) |
---|
134 | |
---|
135 | |
---|
136 | ebin = prop.energy_bins |
---|
137 | ei = prop.incident_energy; |
---|
138 | |
---|
139 | (energybin,tbin,t_elastic) = find_binning_range(ei,ebin); |
---|
140 | #Rebin(InputWorkspace=sample_ws,OutputWorkspace=sample_ws, Params=tbin, PreserveEvents='1') |
---|
141 | |
---|
142 | prop.bkgd_range=[int(t_elastic),int(tbin[2])] |
---|
143 | |
---|
144 | ebinstring = str(energybin[0])+','+str(energybin[1])+','+str(energybin[2]) |
---|
145 | self.iliad_prop.energy_bins = ebinstring; |
---|
146 | |
---|
147 | red = DirectEnergyConversion(); |
---|
148 | |
---|
149 | prop.energy_bins = None |
---|
150 | prop.apply_detector_eff = False |
---|
151 | |
---|
152 | red.initialise(prop); |
---|
153 | outWS = red.convert_to_energy(white_ws,sample_ws); |
---|
154 | #SaveNexus(ws,Filename = 'MARNewReduction.nxs') |
---|
155 | |
---|
156 | #when run from web service, return additional path for web server to copy data to"; |
---|
157 | return outWS |
---|
158 | |
---|
159 | def __init__(self): |
---|
160 | """ sets properties defaults for the instrument with Name""" |
---|
161 | ReductionWrapper.__init__(self,'LET',rv) |
---|
162 | #---------------------------------------------------------------------------------------------------------------------- |
---|
163 | |
---|
164 | if __name__=="__main__": |
---|
165 | maps_dir = 'd:/Data/MantidSystemTests/Data' |
---|
166 | data_dir ='d:/Data/Mantid_Testing/14_11_27' |
---|
167 | ref_data_dir = 'd:/Data/MantidSystemTests/SystemTests/AnalysisTests/ReferenceResults' |
---|
168 | config.setDataSearchDirs('{0};{1};{2}'.format(data_dir,maps_dir,ref_data_dir)) |
---|
169 | #config.appendDataSearchDir('d:/Data/Mantid_GIT/Test/AutoTestData') |
---|
170 | config['defaultsave.directory'] = data_dir # folder to save resulting spe/nxspe files. Defaults are in |
---|
171 | |
---|
172 | # execute stuff from Mantid |
---|
173 | rd = ReduceLET_OneRep(); |
---|
174 | rd.def_advanced_properties(); |
---|
175 | rd.def_main_properties(); |
---|
176 | |
---|
177 | |
---|
178 | using_web_data = False; |
---|
179 | if not using_web_data: |
---|
180 | run_dir=os.path.dirname(os.path.realpath(__file__)) |
---|
181 | file = os.path.join(run_dir,'reduce_vars.py'); |
---|
182 | rd.export_changed_values(file); |
---|
183 | |
---|
184 | rd.main(); |
---|