From 7a444580de7b125df3faebc2c3c561e9092ba870 Mon Sep 17 00:00:00 2001 From: Laurent Mercadier <laurent.mercadier@xfel.eu> Date: Wed, 20 Oct 2021 10:59:19 +0200 Subject: [PATCH] Fix digitizer check params --- src/toolbox_scs/detectors/digitizers.py | 42 +++++++++++++++++++------ src/toolbox_scs/routines/knife_edge.py | 2 +- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/toolbox_scs/detectors/digitizers.py b/src/toolbox_scs/detectors/digitizers.py index eb3ba8f..3dadcb9 100644 --- a/src/toolbox_scs/detectors/digitizers.py +++ b/src/toolbox_scs/detectors/digitizers.py @@ -286,7 +286,8 @@ def get_peaks(run, if digitizer == 'ADQ412': min_distance = 440 if autoFind: - trace = arr.isel(trainId=slice(0, 300)).mean(dim='trainId') + stride = int(np.max([1, np.floor(arr.sizes['trainId']/200)])) + trace = arr.isel(trainId=slice(0, None, stride)).mean(dim='trainId') try: integParams = find_integ_params(trace, min_distance=min_distance) except ValueError as err: @@ -581,25 +582,50 @@ def get_peak_params(run, mnemonic, raw_trace=None, ntrains=200): if mnemonic not in run_mnemonics: raise ToolBoxValueError("mnemonic must be a ToolBox mnemonics") if "raw" not in mnemonic: - mnemo_raw = mnemonic.replace('peaks', 'raw').replace('apd', 'raw') params = channel_peak_params(run, mnemonic) if 'enable' in params and params['enable'] == 0: log.warning('The digitizer did not record peak-integrated data.') title = 'Digitizer peak params' else: - mnemo_raw = mnemonic digitizer = digitizer_type(mnemonic, run_mnemonics) min_distance = 24 if digitizer == "FastADC" else 440 title = 'Auto-find peak params' if raw_trace is None: - sel = run.select_trains(np.s_[:ntrains]) - raw_trace = sel.get_array(*run_mnemonics[mnemo_raw].values()) - raw_trace = raw_trace.mean(dim='trainId') + raw_trace = get_coarse_average(run, mnemonic) params = find_integ_params(raw_trace, min_distance=min_distance) log.debug(f'{title} for {mnemonic}: {params}') return params +def get_coarse_average(run, mnemonic, ntrains=200): + """ + Compute the average over ntrains evenly spaced accross all trains + of a digitizer trace. + + Parameters + ---------- + run: extra_data.DataCollection + DataCollection containing the digitizer data. + mnemonic: str + ToolBox mnemonic of the digitizer data, e.g. 'MCP2apd'. + ntrains: int + Number of trains used to calculate the average raw trace. + + Returns + ------- + trace: DataArray + The average digitizer trace + """ + run_mnemonics = mnemonics_for_run(run) + total_tid = len(run.train_ids) + stride = int(np.max([1, np.floor(total_tid/ntrains)])) + s = np.s_[0:None:stride] + sel = run.select_trains(s) + raw_trace = sel.get_array(*run_mnemonics[mnemonic].values()) + raw_trace = raw_trace.mean(dim='trainId') + return raw_trace + + def check_peak_params(run, mnemonic, raw_trace=None, ntrains=200, params=None, plot=True, show_all=False, bunchPattern='sase3'): """ @@ -646,9 +672,7 @@ def check_peak_params(run, mnemonic, raw_trace=None, ntrains=200, params=None, mnemo_raw = mnemonic.replace('peaks', 'raw').replace('apd', 'raw') title = 'Digitizer peak params' if raw_trace is None: - sel = run.select_trains(np.s_[:ntrains]) - raw_trace = sel.get_array(*run_mnemonics[mnemo_raw].values()) - raw_trace = raw_trace.mean(dim='trainId') + raw_trace = get_coarse_average(run, mnemonic) if params is None: params = get_peak_params(run, mnemonic, raw_trace) if 'enable' in params and params['enable'] == 0: diff --git a/src/toolbox_scs/routines/knife_edge.py b/src/toolbox_scs/routines/knife_edge.py index 1b22dc8..78ad7d5 100644 --- a/src/toolbox_scs/routines/knife_edge.py +++ b/src/toolbox_scs/routines/knife_edge.py @@ -15,7 +15,7 @@ __all__ = [ def knife_edge(ds, axisKey='scannerX', signalKey='FastADC4peaks', - axisRange=[None, None], p0=None, full=False, plot=False, + axisRange=None, p0=None, full=False, plot=False, display=False): """ Calculates the beam radius at 1/e^2 from a knife-edge scan by -- GitLab