| 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();  | 
|---|