Пример #1
0
def pdcalibration_groups(data_ws,
                         group_ws,
                         cc_diffcal,
                         to_skip,
                         output_basename="_tmp_group_pd_calibration",
                         previous_calibration=None,
                         PeakPositions=DIAMOND,
                         TofBinning=(300,-.001,16666.7),
                         PeakFunction='IkedaCarpenterPV',
                         PeakWindow=0.1,
                         PeakWidthPercent=None,
                         BadCalibThreshold=100):
    """This will perform PDCalibration of the group data and combine the
    results with the results of `cc_calibrate_groups`.

    This works by converting the data into d-spacing using the diffcal
    from the cross-correlation, then grouping the data using
    DiffractionFocussing after which it's converted back into TOF
    using an arbitarty diffcal (the combined of all detectors in the
    group). PDCalibration is performed on this grouped workspace after
    which the diffcal's are all combined according to

    .. math::

        DIFC_{effective} = DIFC_{PD} * DIFC_{CC} / DIFC_{arbitarty}

    :param data_ws: Input calibration raw data (in TOF), assumed to already be correctly masked
    :param group_ws: grouping workspace, e.g. output from LoadDetectorsGroupingFile
    :param cc_diffcal: DiffCal workspace which is the output from cc_calibrate_groups
    :param to_skip: Groups to skip the cross correlation stage
    :param output_basename: Optional name to use for temporay and output workspace
    :param previous_calibration: Optional previous diffcal workspace
    :param PeakPositions: PeakPositions parameter of PDCalibration, default Diamond peaks
    :param TofBinning: TofBinning parameter of PDCalibration, default (300,-.001,16666.7)
    :param PeakFunction: PeakFunction parameter of PDCalibration, default 'IkedaCarpenterPV'
    :param PeakWindow: PeakWindow parameter of PDCalibration, default 0.1
    :param PeakWidthPercent: PeakWidthPercent parameter of PDCalibration, default None
    :param BadCalibThreshold: Threshold for relative difference between calibrated DIFC and engineering value.
    :return: tuple of DiffCal and Mask (both as TableWorkspace objects) holding the combined DiffCal.
    """

    CreateDetectorTable(data_ws, DetectorTableWorkspace="calib_table_bak")

    ApplyDiffCal(data_ws, CalibrationWorkspace=cc_diffcal)
    ConvertUnits(data_ws, Target='dSpacing', OutputWorkspace='_tmp_data_aligned')
    DiffractionFocussing('_tmp_data_aligned', GroupingWorkspace=group_ws, OutputWorkspace='_tmp_data_aligned')

    ConvertUnits('_tmp_data_aligned', Target='TOF', OutputWorkspace='_tmp_data_aligned')

    instrument = data_ws.getInstrument().getName()

    if instrument != 'POWGEN':
        PDCalibration(InputWorkspace='_tmp_data_aligned',
                      TofBinning=TofBinning,
                      PreviousCalibrationTable=previous_calibration,
                      PeakFunction=PeakFunction,
                      PeakPositions=PeakPositions,
                      PeakWindow=PeakWindow,
                      PeakWidthPercent=PeakWidthPercent,
                      OutputCalibrationTable=f'{output_basename}_pd_diffcal',
                      DiagnosticWorkspaces=f'{output_basename}_pd_diag')
        if to_skip:
            ExtractSpectra(data_ws, WorkspaceIndexList=to_skip, OutputWorkspace='_tmp_group_to_skip')
            ExtractUnmaskedSpectra('_tmp_group_to_skip', OutputWorkspace='_tmp_group_to_skip')
            PDCalibration(InputWorkspace='_tmp_group_to_skip',
                          TofBinning=TofBinning,
                          PreviousCalibrationTable=previous_calibration,
                          PeakFunction=PeakFunction,
                          PeakPositions=PeakPositions,
                          PeakWindow=PeakWindow,
                          PeakWidthPercent=PeakWidthPercent,
                          OutputCalibrationTable=f'{output_basename}_pd_diffcal_skip',
                          DiagnosticWorkspaces=f'{output_basename}_pd_diag_skip')
    else:
        pdcalib_for_powgen(mtd['_tmp_data_aligned'],
                           TofBinning,
                           previous_calibration,
                           PeakFunction,
                           PeakPositions,
                           PeakWindow,
                           PeakWidthPercent,
                           f'{output_basename}_pd_diffcal',
                           f'{output_basename}_pd_diag')
        if to_skip:
            ExtractSpectra(data_ws, WorkspaceIndexList=to_skip, OutputWorkspace='_tmp_group_to_skip')
            ExtractUnmaskedSpectra('_tmp_group_to_skip', OutputWorkspace='_tmp_group_to_skip')
            pdcalib_for_powgen(mtd['_tmp_group_to_skip'],
                               [300,-0.0008,16667],
                               previous_calibration,
                               PeakFunction,
                               PeakPositions,
                               PeakWindow,
                               PeakWidthPercent,
                               f'{output_basename}_pd_diffcal_skip',
                               f'{output_basename}_pd_diag_skip')

    CombineDiffCal(PixelCalibration=cc_diffcal,
                   GroupedCalibration=f'{output_basename}_pd_diffcal',
                   CalibrationWorkspace='_tmp_data_aligned',
                   MaskWorkspace=f'{output_basename}_pd_diffcal_mask',
                   OutputWorkspace=f'{output_basename}_cc_pd_diffcal_tmp')

    DeleteWorkspace('_tmp_data_aligned')

    out_table = CreateEmptyTableWorkspace(OutputWorkspace=f'{output_basename}_cc_pd_diffcal')
    out_table.addColumn("int", "detid")
    out_table.addColumn("double", "difc")
    out_table.addColumn("double", "difa")
    out_table.addColumn("double", "tzero")
    num_hist = data_ws.getNumberHistograms()
    for i in range(num_hist):
        difc_bak = mtd['calib_table_bak'].row(i)['DIFC']
        if i in to_skip:
            difc_calib = mtd[f'{output_basename}_pd_diffcal_skip'].row(i)['difc']
        else:
            difc_calib = mtd[f'{output_basename}_cc_pd_diffcal_tmp'].row(i)['difc']
        if mtd[f'{output_basename}_pd_diffcal_mask'].readY(i)[0] == 0.0:
            diff_difc = abs(difc_bak - difc_calib) / difc_calib * 100.0
        else:
            diff_difc = np.inf
        if diff_difc >= BadCalibThreshold:
            difc_calib = difc_bak
        new_row = { 'detid': mtd[f'{output_basename}_cc_pd_diffcal_tmp'].row(i)['detid'],
                    'difc': difc_calib,
                    'difa': mtd[f'{output_basename}_cc_pd_diffcal_tmp'].row(i)['difa'],
                    'tzero': mtd[f'{output_basename}_cc_pd_diffcal_tmp'].row(i)['tzero'] }
        out_table.addRow(new_row)

    DeleteWorkspace(f'{output_basename}_cc_pd_diffcal_tmp')

    return mtd[f'{output_basename}_cc_pd_diffcal']
Пример #2
0
 def _run_create_detector_table(self, ws):
     CreateDetectorTable(InputWorkspace=ws)