diff --git a/doc/changelog.rst b/doc/changelog.rst index 895119a5da7d766566461c3b003e59b5da38c599..3551efba8490a6233e663909f22cb5c7a47ecf68 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -16,7 +16,7 @@ unreleased - remove calls to matplotlib tight_layout :mr:`206` - Improved hRIXS class and utilities :mr:`182` - Documentation on extracting digitizer peaks, clean up of digitizer functions :mr:`215` - - Improved peak-finding algorithm for digitizer traces :mr:`216` + - Improved peak-finding algorithm for digitizer traces :mr:`216`, :mr:`227` - **New Features** diff --git a/src/toolbox_scs/detectors/digitizers.py b/src/toolbox_scs/detectors/digitizers.py index 9fc8df4a5638c9265fa2ffe9da3ad88729fc0761..1a19a0a072da84fa42f48f29be4e593cc58402fe 100644 --- a/src/toolbox_scs/detectors/digitizers.py +++ b/src/toolbox_scs/detectors/digitizers.py @@ -293,11 +293,11 @@ def get_peaks(run, 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) + integParams = find_integ_params(trace) except ValueError as err: log.warning(f'{err}, trying with averaged trace over all trains.') trace = arr.mean(dim='trainId') - integParams = find_integ_params(trace, min_distance=min_distance) + integParams = find_integ_params(trace) log.debug(f'Auto find peaks result: {integParams}') required_keys = ['pulseStart', 'pulseStop', 'baseStart', @@ -540,7 +540,7 @@ def adq412_channel_peak_params(run, source, key=None, return result -def find_integ_params(trace, min_distance=1, height=None, width=1): +def find_integ_params(trace, height=None, width=1): """ Find integration parameters for peak integration of a raw digitizer trace. Based on scipy find_peaks(). @@ -549,8 +549,6 @@ def find_integ_params(trace, min_distance=1, height=None, width=1): ---------- trace: numpy array or xarray DataArray The digitier raw trace used to find peaks - min_distance: int - minimum number of samples between two peaks height: int minimum threshold for peak determination width: int @@ -597,10 +595,10 @@ def find_integ_params(trace, min_distance=1, height=None, width=1): distance = 1 elif len(ac_peaks[0]) == 1: period = ac_peaks[0][0] - distance = period-6 + distance = max(1, period-6) else: period = int(np.median(ac_peaks[0][1:] - ac_peaks[0][:-1])) - distance = period-6 # smaller than period to account for all peaks + distance = max(1, period-6) # smaller than period to account for all peaks # define min height to detect peaks depending on signal quality f = np.max([3, np.min([(SNR/10), 4])]) height = trace_norm.max() / f @@ -659,12 +657,10 @@ def get_peak_params(run, mnemonic, raw_trace=None, ntrains=200): log.warning('The digitizer did not record peak-integrated data.') title = 'Digitizer peak params' else: - digitizer = digitizer_type(mnemonic, run_mnemonics) - min_distance = 24 if digitizer == "FastADC" else 440 title = 'Auto-find peak params' if raw_trace is None: raw_trace = get_dig_avg_trace(run, mnemonic, ntrains) - params = find_integ_params(raw_trace, min_distance=min_distance) + params = find_integ_params(raw_trace) log.debug(f'{title} for {mnemonic}: {params}') return params