def test_calibration_json(): """Test reduce data with calibration file (.json)""" # Get simulated test data project_file_name = 'tests/data/HB2B_000.h5' calib_file = 'tests/data/HB2B_CAL_Si333.json' # Import file calib_obj = calibration_file_io.read_calibration_json_file(calib_file) shift, shift_error, wave_length, wl_error, status = calib_obj # Verify result assert shift assert shift_error assert abs(wave_length - 1.4499332864) < 1E-8 assert wl_error assert status == 3 # Import project file project_file = HidraProjectFile(project_file_name, 'r') # Reduce test_workspace = workspaces.HidraWorkspace('test calibration') test_workspace.load_hidra_project(project_file, load_raw_counts=True, load_reduced_diffraction=False) # Test set and get wave length test_workspace.set_wavelength(wave_length, True) wave_length_i = test_workspace.get_wavelength(True, True) assert wave_length_i == wave_length
def test_rw_raw(): """Test read a project to workspace and write in the scope of raw data Returns ------- """ raw_project_name = os.path.join(os.getcwd(), 'data/HZB_Raw_Project.h5') # Read to workspace source_project = HidraProjectFile(raw_project_name, 'r') # To the workspace source_workspace = workspaces.HidraWorkspace('Source HZB') source_workspace.load_hidra_project(source_project, load_raw_counts=True, load_reduced_diffraction=False) # Export target_project = HidraProjectFile('HZB_HiDra_Test.h5', 'w') # Experiment data source_workspace.save_experimental_data(target_project, sub_runs=range(1, 41)) # Instrument detector_setup = source_workspace.get_instrument_setup() instrument_setup = HidraSetup(detector_setup=detector_setup) target_project.write_instrument_geometry(instrument_setup) # Save target_project.save(True) return
def init_session(self, session_name, hidra_ws=None): """ Initialize a new session of reduction and thus to store data according to session name :return: """ # Check inputs checkdatatypes.check_string_variable('Reduction session name', session_name) if session_name == '': raise RuntimeError('Session name {} is empty'.format(session_name)) elif session_name in self._session_dict: print( '[WARNING] Session {} is previously taken. The HidraWorkspace associated ' 'will be replaced if new HidraWorkspace is not None ({})' ''.format(session_name, hidra_ws is None)) if hidra_ws is None: # session is initialized without HidraWorkspace self._curr_workspace = workspaces.HidraWorkspace() else: # session starts with a HidraWorkspace checkdatatypes.check_type('HidraWorkspace', hidra_ws, workspaces.HidraWorkspace) self._curr_workspace = hidra_ws self._session_dict[session_name] = self._curr_workspace
def load_vanadium(self, van_project_file): """Load vanadium from HiDRA project file Parameters ---------- van_project_file : str vanadium HiDRA project file or NeXus file Returns ------- ~numpy.narray, float 1D array as vanadium counts and duration of vanadium run (second) """ checkdatatypes.check_file_name(van_project_file, True, False, False, 'Vanadium project/NeXus file') if van_project_file.endswith('.nxs.h5'): # Input is nexus file # reduce with PyRS/Python converter = NeXusConvertingApp(van_project_file, mask_file_name=None) self._van_ws = converter.convert(use_mantid=False) else: # Input is HiDRA project file self._van_ws = workspaces.HidraWorkspace(name=van_project_file) # PyRS HDF5 project_h5_file = HidraProjectFile( van_project_file, mode=HidraProjectFileMode.READONLY) # Load self._van_ws.load_hidra_project(project_h5_file, load_raw_counts=True, load_reduced_diffraction=False) # Close project file project_h5_file.close() # Process the vanadium counts sub_runs = self._van_ws.get_sub_runs() assert len( sub_runs ) == 1, 'There shall be more than 1 sub run in vanadium project file' # get vanadium data van_array = self._van_ws.get_detector_counts(sub_runs[0]).astype( np.float64) # get vanadium run duration van_duration = self._van_ws.get_sample_log_value( HidraConstants.SUB_RUN_DURATION, sub_runs[0]) return van_array, van_duration
def __init__(self, nexus_file_name, mask_file_name=None, extra_logs=list()): """Initialization Parameters ---------- nexus_file_name : str Name of NeXus file mask_file_name : str Name of masking file extra_logs : list, tuple list of string with no default logs to keep in project file """ # configure logging for this class self._log = Logger(__name__) # validate NeXus file exists checkdatatypes.check_file_name(nexus_file_name, True, False, False, 'NeXus file') self._nexus_name = nexus_file_name # validate mask file exists if mask_file_name is None: self._mask_file_name = None else: checkdatatypes.check_file_name(mask_file_name, True, False, False, 'Mask file') self._mask_file_name = mask_file_name if not mask_file_name.lower().endswith('.xml'): raise NotImplementedError( 'Only Mantid mask in XML format is supported now. File ' '{} with type {} is not supported yet.' ''.format(mask_file_name, mask_file_name.split('.')[-1])) # workspaces self._event_ws_name = os.path.basename(nexus_file_name).split('.')[0] logs_to_keep = list(extra_logs) logs_to_keep.extend(DEFAULT_KEEP_LOGS) self.__load_logs(logs_to_keep) # load the mask self.mask_array = None # TODO to promote direct access if mask_file_name: self.__load_mask(mask_file_name) # create the hidra workspace self._hidra_workspace = workspaces.HidraWorkspace(self._nexus_name) # Set a default instrument with this workspace # set up instrument # initialize instrument with hard coded values instrument = DENEXDetectorGeometry(NUM_PIXEL_1D, NUM_PIXEL_1D, PIXEL_SIZE, PIXEL_SIZE, ARM_LENGTH, False) self._hidra_workspace.set_instrument_geometry(instrument) # project file self._project_file = None