def _output_sample_logs(instrument, run_number, workspace, rb_num): def write_to_file(): with open(output_path, "w", newline="") as logfile: writer = csv.writer(logfile, ["Sample Log", "Avg Value"]) for log in output_dict: writer.writerow([log, output_dict[log]]) output_dict = {} sample_run = workspace.getRun() log_names = sample_run.keys() # Collect numerical sample logs. for name in log_names: try: output_dict[name] = sample_run.getPropertyAsSingleValue(name) except ValueError: logger.information( f"Could not convert {name} to a numerical value. It will not be included in the " f"sample logs output file.") focus_dir = path.join(path_handling.get_output_path(), "Focus") if not path.exists(focus_dir): makedirs(focus_dir) output_path = path.join( focus_dir, (instrument + "_" + run_number + "_sample_logs.csv")) write_to_file() if rb_num: focus_user_dir = path.join(path_handling.get_output_path(), "User", rb_num, "Focus") if not path.exists(focus_user_dir): makedirs(focus_user_dir) output_path = path.join( focus_user_dir, (instrument + "_" + run_number + "_sample_logs.csv")) write_to_file()
def _save_focused_output_files_as_gss(self, instrument, sample_path, bank, sample_workspace, rb_num): gss_output_path = path.join( path_handling.get_output_path(), "Focus", self._generate_output_file_name(instrument, sample_path, bank, ".gss")) SaveGSS(InputWorkspace=sample_workspace, Filename=gss_output_path) if rb_num: gss_output_path = path.join( path_handling.get_output_path(), "User", rb_num, "Focus", self._generate_output_file_name(instrument, sample_path, bank, ".gss")) SaveGSS(InputWorkspace=sample_workspace, Filename=gss_output_path)
def _save_output(self, instrument, sample_path, bank, sample_workspace, rb_num): """ Save a focused workspace to the file system. Saves separate copies to a User directory if an rb number has been set. :param instrument: The instrument the data is from. :param sample_path: The path to the data file that was focused. :param bank: The name of the bank being saved. :param sample_workspace: The name of the workspace to be saved. :param rb_num: Usually an experiment id, defines the name of the user directory. """ self._save_focused_output_files_as_nexus(instrument, sample_path, bank, sample_workspace, rb_num) self._save_focused_output_files_as_gss(instrument, sample_path, bank, sample_workspace, rb_num) self._save_focused_output_files_as_topas_xye(instrument, sample_path, bank, sample_workspace, rb_num) logger.notice( f"\n\nFocus files saved to: \"{path.join(path_handling.get_output_path(), 'Focus')}\"\n\n" ) if rb_num: output_path = path.join(path_handling.get_output_path(), 'User', rb_num, 'Focus') logger.notice(f"\n\nFocus files saved to: \"{output_path}\"\n\n")
def _save_focused_output_files_as_xye(self, instrument, sample_path, bank, sample_workspace, rb_num): xye_output_path = path.join( path_handling.get_output_path(), "Focus", self._generate_output_file_name(instrument, sample_path, bank, ".dat")) SaveFocusedXYE(InputWorkspace=sample_workspace, Filename=xye_output_path, SplitFiles=False) if rb_num: xye_output_path = path.join( path_handling.get_output_path(), "User", rb_num, "Focus", self._generate_output_file_name(instrument, sample_path, bank, ".dat")) SaveFocusedXYE(InputWorkspace=sample_workspace, Filename=xye_output_path, SplitFiles=False)
def _generate_saved_workspace_file_paths(vanadium_number, rb_num=""): """ Generate file paths based on a vanadium run number. :param vanadium_number: The number of the vanadium run. :param rb_num: User identifier, usually an experiment number. :return: The full path to the file. """ integrated_filename = vanadium_number + SAVED_FILE_INTEG_SUFFIX curves_filename = vanadium_number + SAVED_FILE_CURVE_SUFFIX if rb_num: vanadium_dir = path.join(path_handling.get_output_path(), "User", rb_num, VANADIUM_DIRECTORY_NAME) else: vanadium_dir = path.join(path_handling.get_output_path(), VANADIUM_DIRECTORY_NAME) if not path.exists(vanadium_dir): makedirs(vanadium_dir) return path.join(vanadium_dir, integrated_filename), path.join(vanadium_dir, curves_filename)
def test_save_output_files_with_no_RB_number(self, nexus, gss, xye): mocked_workspace = "mocked-workspace" output_file = path.join(path_handling.get_output_path(), "Focus", "ENGINX_123_bank_North.nxs") self.model._save_output("ENGINX", "Path/To/ENGINX000123.whatever", "North", mocked_workspace, None) self.assertEqual(1, nexus.call_count) self.assertEqual(1, gss.call_count) self.assertEqual(1, xye.call_count) nexus.assert_called_with(Filename=output_file, InputWorkspace=mocked_workspace)
def create_new_calibration(self, vanadium_path, sample_path, plot_output, instrument, rb_num=None, bank=None, spectrum_numbers=None): """ Create a new calibration from a vanadium run and sample run :param vanadium_path: Path to vanadium data file. :param sample_path: Path to sample (CeO2) data file :param plot_output: Whether the output should be plotted. :param instrument: The instrument the data relates to. :param rb_num: The RB number for file creation. :param bank: Optional parameter to crop by bank :param spectrum_numbers: Optional parameter to crop using spectrum numbers. """ van_integration, van_curves = vanadium_corrections.fetch_correction_workspaces( vanadium_path, instrument, rb_num=rb_num) sample_workspace = path_handling.load_workspace(sample_path) full_calib_path = get_setting(path_handling.INTERFACES_SETTINGS_GROUP, path_handling.ENGINEERING_PREFIX, "full_calibration") if full_calib_path is not None and path.exists(full_calib_path): full_calib = LoadAscii(full_calib_path, OutputWorkspace="det_pos", Separator="Tab") output = self.run_calibration(sample_workspace, van_integration, van_curves, bank, spectrum_numbers, full_calib_ws=full_calib) else: output = self.run_calibration(sample_workspace, van_integration, van_curves, bank, spectrum_numbers) if plot_output: self._plot_vanadium_curves() for i in range(len(output)): if spectrum_numbers: bank_name = "cropped" elif bank is None: bank_name = str(i + 1) else: bank_name = bank difa = output[i].DIFA difc = output[i].DIFC tzero = output[i].TZERO self._generate_tof_fit_workspace(difa, difc, tzero, bank_name) if bank is None and spectrum_numbers is None: self._plot_tof_fit() elif spectrum_numbers is None: self._plot_tof_fit_single_bank_or_custom(bank) else: self._plot_tof_fit_single_bank_or_custom("cropped") difa = [i.DIFC for i in output] difc = [i.DIFC for i in output] tzero = [i.TZERO for i in output] params_table = [] for i in range(len(difc)): params_table.append([i, difc[i], difa[i], tzero[i]]) self.update_calibration_params_table(params_table) calib_dir = path.join(path_handling.get_output_path(), "Calibration", "") self.create_output_files(calib_dir, difa, difc, tzero, sample_path, vanadium_path, instrument, bank, spectrum_numbers) if rb_num: user_calib_dir = path.join(path_handling.get_output_path(), "User", rb_num, "Calibration", "") self.create_output_files(user_calib_dir, difa, difc, tzero, sample_path, vanadium_path, instrument, bank, spectrum_numbers)