def _check_region_grouping_ws_exists(grouping_ws_name: str, inst_ws) -> bool: """ Check that the required grouping workspace for this focus exists, and if not present for a North/South bank focus, retrieve them from the user directories or create them (expected if first focus with loaded calibration) :param grouping_ws_name: Name of the grouping workspace whose presence in the ADS is being checked :param inst_ws: Workspace containing the instrument data for use in making a bank grouping workspace :return: True if the required workspace exists (or has just been loaded/created), False if not """ if not Ads.doesExist(grouping_ws_name): if "North" in grouping_ws_name: logger.notice( "NorthBank grouping workspace not present in ADS, loading") EnggUtils.get_bank_grouping_workspace(1, inst_ws) return True elif "South" in grouping_ws_name: logger.notice( "SouthBank grouping workspace not present in ADS, loading") EnggUtils.get_bank_grouping_workspace(2, inst_ws) return True else: logger.warning( f"Cannot focus as the grouping workspace \"{grouping_ws_name}\" is not present." ) return False return True
def run_calibration(ceria_ws, bank, calfile, spectrum_numbers, full_calib): """ Creates Engineering calibration files with PDCalibration :param ceria_ws: The workspace with the ceria data. :param bank: The bank to crop to, both if none. :param calfile: The custom calibration file to crop to, not used if none. :param spectrum_numbers: The spectrum numbers to crop to, no crop if none. :return: dict containing calibrated diffractometer constants, and copy of the raw ceria workspace """ def run_pd_calibration(kwargs_to_pass) -> list: """ Call PDCalibration using the keyword arguments supplied, and return it's default list of output workspaces :param kwargs_to_pass: Keyword arguments to supply to the algorithm :return: List of output workspaces from PDCalibration """ return PDCalibration(**kwargs_to_pass) def calibrate_region_of_interest(ceria_d_ws, roi: str, grouping_kwarg: dict, cal_output: dict) -> None: """ Focus the processed ceria workspace (dSpacing) over the chosen region of interest, and run the calibration using this result :param ceria_d_ws: Workspace containing the processed ceria data converted to dSpacing :param roi: String describing chosen region of interest :param grouping_kwarg: Dict containing kwarg to pass to DiffractionFocussing to select the roi :param cal_output: Dictionary to append with the output of PDCalibration for the chosen roi """ # focus ceria focused_ceria = DiffractionFocussing(InputWorkspace=ceria_d_ws, **grouping_kwarg) ApplyDiffCal(InstrumentWorkspace=focused_ceria, ClearCalibration=True) ConvertUnits(InputWorkspace=focused_ceria, OutputWorkspace=focused_ceria, Target='TOF') # calibration of focused data over chosen region of interest kwargs["InputWorkspace"] = focused_ceria kwargs["OutputCalibrationTable"] = "engggui_calibration_" + roi kwargs["DiagnosticWorkspaces"] = "diag_" + roi cal_roi = run_pd_calibration(kwargs)[0] cal_output[roi] = cal_roi # need to clone the data as PDCalibration rebins ceria_raw = CloneWorkspace(InputWorkspace=ceria_ws) # initial process of ceria ws NormaliseByCurrent(InputWorkspace=ceria_ws, OutputWorkspace=ceria_ws) ApplyDiffCal(InstrumentWorkspace=ceria_ws, CalibrationWorkspace=full_calib) ConvertUnits(InputWorkspace=ceria_ws, OutputWorkspace=ceria_ws, Target='dSpacing') kwargs = { "PeakPositions": EnggUtils.default_ceria_expected_peaks(final=True), "TofBinning": [15500, -0.0003, 52000], # using a finer binning now have better stats "PeakWindow": 0.04, "MinimumPeakHeight": 0.5, "PeakFunction": 'BackToBackExponential', "CalibrationParameters": 'DIFC+TZERO+DIFA', "UseChiSq": True } cal_output = dict() grp_ws = None if (spectrum_numbers or calfile) is None: if bank == '1' or bank is None: grp_ws = EnggUtils.get_bank_grouping_workspace(1, ceria_raw) grouping_kwarg = {"GroupingWorkspace": grp_ws} calibrate_region_of_interest(ceria_ws, "bank_1", grouping_kwarg, cal_output) if bank == '2' or bank is None: grp_ws = EnggUtils.get_bank_grouping_workspace(2, ceria_raw) grouping_kwarg = {"GroupingWorkspace": grp_ws} calibrate_region_of_interest(ceria_ws, "bank_2", grouping_kwarg, cal_output) elif calfile is None: grp_ws = EnggUtils.create_grouping_workspace_from_spectra_list( spectrum_numbers, ceria_raw) grouping_kwarg = {"GroupingWorkspace": grp_ws} calibrate_region_of_interest(ceria_ws, "Cropped", grouping_kwarg, cal_output) else: grp_ws = EnggUtils.create_grouping_workspace_from_calfile( calfile, ceria_raw) grouping_kwarg = {"GroupingWorkspace": grp_ws} calibrate_region_of_interest(ceria_ws, "Custom", grouping_kwarg, cal_output) cal_params = list() # in the output calfile, rows are present for all detids, only read one from the region of interest for bank_cal in cal_output: mask_ws_name = "engggui_calibration_" + bank_cal + "_mask" mask_ws = Ads.retrieve(mask_ws_name) row_no = EnggUtils.get_first_unmasked_specno_from_mask_ws(mask_ws) row = cal_output[bank_cal].row(row_no) current_fit_params = { 'difc': row['difc'], 'difa': row['difa'], 'tzero': row['tzero'] } cal_params.append(current_fit_params) return cal_params, ceria_raw, grp_ws