def _load_indirect_instrument(instr, parameters): from mantid.simpleapi import LoadEmptyInstrument, \ LoadParameterFile, AddSampleLog, config # Create a workspace from an indirect instrument out = LoadEmptyInstrument(InstrumentName=instr) if instr in parameters: LoadParameterFile(out, Filename=os.path.join( config.getInstrumentDirectory(), parameters[instr])) if not out.run().hasProperty('EMode'): # EMode would usually get attached via data loading # We skip that so have to apply manually AddSampleLog(out, LogName='EMode', LogText='Indirect', LogType='String') return out
def _create_waves_indirect_elastic(self, workspace): """ Creates a wavelength workspace, from the workspace with the specified input workspace name, using an Elastic instrument definition file. E-Mode must be Indirect and the y-axis of the input workspace must be in units of Q. :param workspace: The input workspace. :return: The output wavelength workspace. """ self._indirect_elastic = True self._q_values = workspace.getAxis(1).extractValues() instrument_name = workspace.getInstrument().getName() self._isis_instrument = instrument_name == "IRIS" or instrument_name == "OSIRIS" # ---------- Load Elastic Instrument Definition File ---------- if self._isis_instrument: idf_name = instrument_name + '_elastic_Definition.xml' idf_path = os.path.join(config.getInstrumentDirectory(), idf_name) logger.information('IDF = %s' % idf_path) load_alg = self.createChildAlgorithm("LoadInstrument", enableLogging=True) load_alg.setProperty("Workspace", workspace) load_alg.setProperty("Filename", idf_path) load_alg.setProperty("RewriteSpectraMap", True) load_alg.execute() e_fixed = float(self._efixed) logger.information('Efixed = %f' % e_fixed) # ---------- Set Instrument Parameters ---------- sip_alg = self.createChildAlgorithm("SetInstrumentParameter", enableLogging=False) sip_alg.setProperty("Workspace", workspace) sip_alg.setProperty("ParameterName", 'EFixed') sip_alg.setProperty("ParameterType", 'Number') sip_alg.setProperty("Value", str(e_fixed)) sip_alg.execute() # ---------- Calculate Wavelength ---------- wave = math.sqrt(81.787 / e_fixed) logger.information('Wavelength = %f' % wave) workspace.getAxis(0).setUnit('Wavelength') # ---------- Format Input Workspace --------- convert_alg = self.createChildAlgorithm("ConvertToHistogram", enableLogging=False) convert_alg.setProperty("InputWorkspace", workspace) convert_alg.execute() workspace = self._crop_ws( convert_alg.getProperty("OutputWorkspace").value) # --------- Set wavelengths as X-values in Output Workspace ---------- waves = (0.01 * np.arange(-1, workspace.blocksize())) + wave logger.information('Waves for the dummy workspace: ' + str(waves)) nhist = workspace.getNumberHistograms() for idx in range(nhist): workspace.setX(idx, waves) if self._isis_instrument: workspace.replaceAxis(1, SpectraAxis.create(workspace)) self._update_instrument_angles(workspace, self._q_values, wave) return workspace