示例#1
0
    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()
示例#2
0
 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)
示例#3
0
 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")
示例#4
0
 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)
示例#5
0
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)
示例#6
0
    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)
示例#7
0
    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)