Source code for straxen.plugins.ref_mon_nv.ref_mon_nv

import strax
import numpy as np
from itertools import chain

export, __all__ = strax.exporter()


[docs]@export class nVeto_reflectivity(strax.Plugin): """Plugin which computes parameters used for the Reflectivity Monitor for the Neutron Veto. From the raw records, the start time of each trigger window is extracted (by taking the smallest "time" of all the channels) Using the hitlets, the delta times wrt the beginning of the trigger are computed Cuts can be made in area (of all the hitlets), time (since the beginning of the trigger window) and number of contributing PMTs (in each window) The returned values are the delta times (used for the reflectivity), PMT channels and areas """ __version__ = "0.1.0" parallel = "process" rechunk_on_save = True compressor = "zstd" depends_on = ("raw_records_nv", "hitlets_nv") provides = "ref_mon_nv" data_kind = "ref_mon_nv" dtype = strax.time_fields + [ (("Time with respect to the precedent trigger [ns]", "time_since_trigger"), np.int32), (("Channel of the hit", "channel"), np.int16), (("Area of the hit [PE]", "area"), np.float32), (("Number of event", "number"), np.int32), ]
[docs] def compute(self, raw_records_nv, hitlets_nv): split_time = 5000 # find the trigger times time_unique = np.unique(raw_records_nv["time"]) time_diff = np.diff(time_unique, prepend=time_unique[0]) time_unique_split = np.split(time_unique, np.where(time_diff >= split_time)[0]) trigger_times = np.array([i[0] for i in time_unique_split]) # split the hits in trigger windows difference = np.diff(hitlets_nv["time"], prepend=hitlets_nv["time"][0]) hits_split = np.split(hitlets_nv, np.where(difference > split_time)[0]) numbers = [np.repeat(i, len(hits_split[i])) for i in range(len(hits_split))] # compute the time differences times_wrt_trigger = [ hits_split[i]["time"] - trigger_times[np.argmin(np.abs(trigger_times - hits_split[i][0]["time"]))] for i in range(len(hits_split)) ] # reshape the arrays hits_split = np.array(list(chain.from_iterable(hits_split))) times_wrt_trigger = np.array(list(chain.from_iterable(times_wrt_trigger))) numbers = np.array(list(chain.from_iterable(numbers))) # fill the delta_times delta_times = np.zeros(len(hits_split), dtype=self.dtype) delta_times["time"] = hits_split["time"] delta_times["endtime"] = hits_split["time"] + hits_split["length"] * hits_split["dt"] delta_times["time_since_trigger"] = times_wrt_trigger delta_times["area"] = hits_split["area"] delta_times["channel"] = hits_split["channel"] delta_times["number"] = numbers return delta_times