def test_minimal_inputs(self): in_ws = Load('INTER00013460.nxs', OutputWorkspace="13460") trans1 = Load('INTER00013463.nxs', OutputWorkspace="trans1") inst = trans1.getInstrument() out_ws, out_wsl_lam, thetafinal = ReflectometryReductionOneAuto(InputWorkspace=in_ws, AnalysisMode="PointDetectorAnalysis" ,OutputWorkspace="InQ", OutputWorkspaceWavelength="InLam") history = out_ws.getHistory() alg = history.lastAlgorithm() ''' Here we are checking that the applied values (passed to CreateTransmissionWorkspace come from the instrument parameters. ''' self.assertEqual(inst.getNumberParameter("LambdaMin")[0], alg.getProperty("WavelengthMin").value) self.assertEqual(inst.getNumberParameter("LambdaMax")[0], alg.getProperty("WavelengthMax").value) self.assertEqual(inst.getNumberParameter("MonitorBackgroundMin")[0], alg.getProperty("MonitorBackgroundWavelengthMin").value) self.assertEqual(inst.getNumberParameter("MonitorBackgroundMax")[0], alg.getProperty("MonitorBackgroundWavelengthMax").value) self.assertEqual(inst.getNumberParameter("MonitorIntegralMin")[0], alg.getProperty("MonitorIntegrationWavelengthMin").value) self.assertEqual(inst.getNumberParameter("MonitorIntegralMax")[0], alg.getProperty("MonitorIntegrationWavelengthMax").value) self.assertEqual(inst.getNumberParameter("I0MonitorIndex")[0], alg.getProperty("I0MonitorIndex").value) self.assertEqual(inst.getNumberParameter("PointDetectorStart")[0], float(alg.getProperty("ProcessingInstructions").value.split(',')[0])) self.assertEqual(inst.getNumberParameter("PointDetectorStop")[0], float(alg.getProperty("ProcessingInstructions").value.split(',')[1])) DeleteWorkspace(in_ws) DeleteWorkspace(trans1)
def beam_center_gravitational_drop(beam_center_file, sdd=1.13): ''' This method is used for correcting for gravitational drop @param beam_center_file :: file where the beam center was found @param sdd :: sample detector distance to apply the beam center ''' def calculate_neutron_drop(path_length, wavelength): ''' Calculate the gravitational drop of the neutrons path_length in meters wavelength in Angstrom ''' wavelength *= 1e-10 neutron_mass = 1.674927211e-27 gravity = 9.80665 h_planck = 6.62606896e-34 l_2 = (gravity * neutron_mass**2 / (2.0 * h_planck**2 )) * path_length**2 return wavelength**2 * l_2 # Get beam center used in the previous reduction pm = mantid.PropertyManagerDataService[ReductionSingleton().property_manager] beam_center_x = pm['LatestBeamCenterX'].value beam_center_y = pm['LatestBeamCenterY'].value Logger("CommandInterface").information("Beam Center before: [%.2f, %.2f] pixels" % (beam_center_x, beam_center_y)) try: # check if the workspace still exists wsname = "__beam_finder_" + os.path.splitext(beam_center_file)[0] ws = mantid.mtd[wsname] Logger("CommandInterface").debug("Using Workspace: %s." % (wsname)) except KeyError: # Let's try loading the file. For some reason the beamcenter ws is not there... try: ws = Load(beam_center_file) Logger("CommandInterface").debug("Using filename %s." % (beam_center_file)) except IOError: Logger("CommandInterface").error("Cannot read input file %s." % beam_center_file) return i = ws.getInstrument() y_pixel_size_mm = i.getNumberParameter('y-pixel-size')[0] Logger("CommandInterface").debug("Y Pixel size = %.2f mm" % y_pixel_size_mm) y_pixel_size = y_pixel_size_mm * 1e-3 # In meters distance_detector1 = i.getComponentByName("detector1").getPos()[2] path_length = distance_detector1 - sdd Logger("CommandInterface").debug("SDD detector1 = %.3f meters. SDD for wing = %.3f meters." % (distance_detector1, sdd)) Logger("CommandInterface").debug("Path length for gravitational drop = %.3f meters." % (path_length)) r = ws.run() wavelength = r.getProperty("wavelength").value Logger("CommandInterface").debug("Wavelength = %.2f A." % (wavelength)) drop = calculate_neutron_drop(path_length, wavelength) Logger("CommandInterface").debug("Gravitational drop = %.6f meters." % (drop)) # 1 pixel -> y_pixel_size # x pixel -> drop drop_in_pixels = drop / y_pixel_size new_beam_center_y = beam_center_y + drop_in_pixels Logger("CommandInterface").information("Beam Center after: [%.2f, %.2f] pixels" % (beam_center_x, new_beam_center_y)) return beam_center_x, new_beam_center_y
def calculate_ei(input_file): # Auto Find Eis by finding maximum data point in m2 (excluding end points) # and looking for neighbouring reps according to Fermi speed # Doesn't deal with cases where the peaks enter the 2nd frame (i.e 2 meV on MARI) print(input_file) w1 = Load(input_file) mon = LoadNexusMonitors(input_file) run = w1.getRun() # set up ================================================== monitor_spectra_2 = 41475 monitor_spectra_3 = 41476 monitor_index_2 = 2 monitor_index_3 = 3 log = 'Fermi_Speed' # Get instrument parameters =============================== inst = w1.getInstrument() source = inst.getSource() L_m2 = mon.getDetector(monitor_index_2).getDistance(source) L_m3 = mon.getDetector(monitor_index_3).getDistance(source) L_Fermi = inst.getComponentByName("chopper-position").getDistance(source) freq = run.getLogData(log).value[-1] period = L_m2 / L_Fermi * 1.e6 / freq / 2. # include pi-pulses # Find maximum value and identify strongest rep =========== m2spec = ExtractSingleSpectrum(mon,monitor_index_2) m2spec = Rebin(m2spec,"200,2,18000") maxm2 = Max(m2spec) TOF = maxm2.readX(0)[0] # Generate list of possible reps in m2 ==================== irep = -5 while True: t = TOF + irep*period if t > 0: ireps = numpy.array(range(irep,irep+20)) reps = TOF + period * ireps break else: irep += 1 # exclude all reps that go past the frame in m3 =========== reps_m3 = reps * L_m3 / L_m2 reps_m3 = [x for x in reps_m3 if x < 19999.] reps = reps[0:len(reps_m3)] # exclude all reps at short times reps = [x for x in reps if x > 200.] # try GetEi for the reps ================================== Ei = [] TOF = [] for t in reps: v_i = L_m2 / t # m/mus Ei_guess = 5.227e6 * v_i**2 # meV try: (En,TOF2,dummy,tzero) = GetEi(mon, monitor_spectra_2, monitor_spectra_3, Ei_guess) except: continue if abs(t - TOF2) > 20. or abs(tzero) > 100.: continue Ei.append(Ei_guess) TOF.append(TOF2) #========================================================= for ii in range(len(Ei)): print("%f meV at TOF = %f mus" % (Ei[ii],TOF[ii])) return Ei