diff --git a/src/proto_nd_flow/reco/charge/calib_prompt_hits.py b/src/proto_nd_flow/reco/charge/calib_prompt_hits.py index 8254c6f..9c4e35c 100644 --- a/src/proto_nd_flow/reco/charge/calib_prompt_hits.py +++ b/src/proto_nd_flow/reco/charge/calib_prompt_hits.py @@ -156,7 +156,7 @@ class CalibHitBuilder(H5FlowStage): # get event boundaries if np.count_nonzero(mask): raw_hits_arr = raw_hits.data[rh_mask] - mask = (packets_data['packet_type'] == 0) & mask + mask = (packets_data['packet_type'] == 1) & mask n = np.count_nonzero(mask) packets_arr = packets_data.data[mask] if resources['RunData'].is_mc: @@ -392,12 +392,15 @@ class CalibHitBuilder(H5FlowStage): vcm_arr[mask] += vcm_corrs vref_arr[mask] += vref_corrs - - return (dw / adc_counts * (vref_arr - vcm_arr) + vcm_arr - ped) / gain + return charge_from_dataword(dw, vref, vcm, ped, adc_counts, gain) + #return (dw / adc_counts * (vref_arr - vcm_arr) + vcm_arr - ped) / gain @staticmethod def charge_from_dataword(dw, vref, vcm, ped, adc_counts, gain): - return (dw / adc_counts * (vref - vcm) + vcm - ped) / gain + #return (dw / adc_counts * (vref - vcm) + vcm - ped) / gain + print(dw[:3], vref[:3], ped[:3]) + print((dw[:3] * vref[:3] * 2 / 1023. - ped[:3]) / 3.4) + return (dw * vref * 2 / 1023. - ped) / 3.4 def load_pedestals(self): if self.pedestal_file != '': diff --git a/src/proto_nd_flow/reco/charge/external_trigger_finder.py b/src/proto_nd_flow/reco/charge/external_trigger_finder.py index 5a05405..434f3fe 100644 --- a/src/proto_nd_flow/reco/charge/external_trigger_finder.py +++ b/src/proto_nd_flow/reco/charge/external_trigger_finder.py @@ -181,6 +181,6 @@ class ExternalTriggerFinder(H5FlowStage): trigs = np.empty(events.shape, dtype=self.ext_trigs_dtype) trigs['ts'] = metadata['ts']['ts'] trigs['ts_raw'] = events['timestamp'] - trigs['type'] = events['trigger_type'] * (events['packet_type'] != 0) + -1 * (events['packet_type'] == 0) + trigs['type'] = events['trigger_type'] * (events['packet_type'] != 1) + -1 * (events['packet_type'] == 1) trigs['iogroup'] = events['io_group'] return ma.array(trigs, mask=~trigger_mask) diff --git a/src/proto_nd_flow/reco/charge/make_pedestal_hist.py b/src/proto_nd_flow/reco/charge/make_pedestal_hist.py index 7988199..57dcc2d 100644 --- a/src/proto_nd_flow/reco/charge/make_pedestal_hist.py +++ b/src/proto_nd_flow/reco/charge/make_pedestal_hist.py @@ -86,7 +86,7 @@ class MakePedestalHist(H5FlowGenerator): tile_ids = resources['Geometry'].tile_id[(self.packets['io_group'], self.packets['io_channel'])] self.pixel_unique_ids = pf.get_pixel_unique_ids(self.packets, tile_ids) - self.mask = (self.packets['valid_parity'].astype(bool) & (self.packets['packet_type'] == 0)) # data packets + self.mask = (self.packets['valid_parity'].astype(bool) & (self.packets['packet_type'] == 1)) # data packets def finish(self): super(MakePedestalHist, self).finish() diff --git a/src/proto_nd_flow/reco/charge/pps_delay_extractor.py b/src/proto_nd_flow/reco/charge/pps_delay_extractor.py index c1be35c..341e35d 100644 --- a/src/proto_nd_flow/reco/charge/pps_delay_extractor.py +++ b/src/proto_nd_flow/reco/charge/pps_delay_extractor.py @@ -63,7 +63,7 @@ class PPSDelayExtractor: pkts = all_pkts[np.min(pkt_idcs) - self.window :np.max(pkt_idcs) + self.window] rollover = resources['RunData'].rollover_ticks - data_pkts = pkts[pkts['packet_type'] == 0] + data_pkts = pkts[pkts['packet_type'] == 1] if len(data_pkts) < self.min_packets: continue delay = np.float64(rollover) - np.median(data_pkts['timestamp']) diff --git a/src/proto_nd_flow/reco/charge/raw_event_builder.py b/src/proto_nd_flow/reco/charge/raw_event_builder.py index 768fc3a..d32b4c2 100644 --- a/src/proto_nd_flow/reco/charge/raw_event_builder.py +++ b/src/proto_nd_flow/reco/charge/raw_event_builder.py @@ -136,7 +136,7 @@ class RawEventBuilder(object): # means that a SYNC arrived while the packet was traveling across # the tile. In that case, subtract the timestamp of the preceding SYNC. oops_mask = (mask & - (packets['packet_type'] == 0) & + (packets['packet_type'] == 1) & (packets['receipt_timestamp'] < packets['timestamp'])) last_sync_ts = fill_with_last(sync_ts) offsets[oops_mask] -= last_sync_ts[oops_mask] @@ -350,7 +350,7 @@ class SymmetricWindowRawEventBuilder(RawEventBuilder): # calculate time distance between hits min_ts, max_ts = np.min(ts), np.max(ts) bin_edges = np.linspace(min_ts - 1, max_ts + 1, int((max_ts - min_ts + 2) // self.window)) - ts_data = ts[packets['packet_type'] == 0] + ts_data = ts[packets['packet_type'] == 1] hist, bin_edges = np.histogram(ts_data, bins=bin_edges) # find high correlation regions diff --git a/src/proto_nd_flow/reco/charge/raw_event_generator.py b/src/proto_nd_flow/reco/charge/raw_event_generator.py index 45b8a05..8c419bb 100644 --- a/src/proto_nd_flow/reco/charge/raw_event_generator.py +++ b/src/proto_nd_flow/reco/charge/raw_event_generator.py @@ -436,7 +436,7 @@ class RawEventGenerator(H5FlowGenerator): else: mc_assn = None - mask = (block['valid_parity'].astype(bool) & (block['packet_type'] == 0)) # data packets + mask = (block['valid_parity'].astype(bool) & (block['packet_type'] == 1)) # data packets mask = mask | (block['packet_type'] == 4) # timestamp packets mask = mask | (block['packet_type'] == 7) # external trigger packets mask = mask | (block['packet_type'] == 6) # sync packets diff --git a/src/proto_nd_flow/reco/charge/raw_hit_builder.py b/src/proto_nd_flow/reco/charge/raw_hit_builder.py index acb791a..5648717 100644 --- a/src/proto_nd_flow/reco/charge/raw_hit_builder.py +++ b/src/proto_nd_flow/reco/charge/raw_hit_builder.py @@ -104,7 +104,7 @@ class RawHitBuilder(H5FlowStage): # get event boundaries if np.count_nonzero(mask): - mask = (packets_data['packet_type'] == 0) & mask + mask = (packets_data['packet_type'] == 1) & mask n = np.count_nonzero(mask) packets_arr = packets_data.data[mask] ts_arr = ts_data.data[mask] diff --git a/src/proto_nd_flow/util/pixel_functions.py b/src/proto_nd_flow/util/pixel_functions.py index 5e24ec5..8f9b7fd 100644 --- a/src/proto_nd_flow/util/pixel_functions.py +++ b/src/proto_nd_flow/util/pixel_functions.py @@ -26,7 +26,7 @@ def adc2mv(adc, vref, vcm, adc_counts): :param adc_counts: nominally 2^N, where N is the total bits in the ADC (usually 8) :returns: array of pedestal-corrected datawords converted to mV units ''' - return (vref-vcm) * adc/adc_counts + vcm + return adc * 2 * vref / 1023 def dac2mv(dac, vdda, adc_counts): ''' @@ -36,4 +36,4 @@ def dac2mv(dac, vdda, adc_counts): :param vdda: VDDA voltage (usually ~1800 mV) [mV] :param adc_counts: nominally 2^N, where N is the total bits in the ADC (usually 8) ''' - return vdda * dac/adc_counts \ No newline at end of file + return vdda * dac/adc_counts diff --git a/yamls/fsd_flow/reco/charge/CalibHitBuilderData.yaml b/yamls/fsd_flow/reco/charge/CalibHitBuilderData.yaml index 5eefa78..3f8e051 100644 --- a/yamls/fsd_flow/reco/charge/CalibHitBuilderData.yaml +++ b/yamls/fsd_flow/reco/charge/CalibHitBuilderData.yaml @@ -22,15 +22,12 @@ params: calib_hits_dset_name: 'charge/calib_prompt_hits' # configuration parameters - vref_mv: 1504.2 - vcm_mv: 458.7 - adc_counts: 256 - gain: 2.46 + vref_mv: 1750 #flag to perform electron liftime calibration - elifetime_calibration: True + elifetime_calibration: False - pedestal_file: '/global/common/software/dune/inputs/FSD/pedestals/FSD_pedestals_20241112.json' + pedestal_file: '/data/v3/FSDCube/Feb2026/cold_processed/pedestal_prc-1280_rolling-2026_02_26_16_18_05_PST.flow.json' #pedestal_file: 'data/module0_flow/datalog_2021_04_02_19_00_46_CESTevd_ped.json' # download link: https://portal.nersc.gov/project/dune/data/Module0/TPC1+2/configFiles/datalog_2021_04_02_19_00_46_CESTevd_ped.json #configuration_file: 'data/module0_flow/evd_config_21-03-31_12-36-13.json' diff --git a/yamls/fsd_flow/reco/charge/GeneratePedestalJson.yaml b/yamls/fsd_flow/reco/charge/GeneratePedestalJson.yaml index 98f550e..aa7aed6 100644 --- a/yamls/fsd_flow/reco/charge/GeneratePedestalJson.yaml +++ b/yamls/fsd_flow/reco/charge/GeneratePedestalJson.yaml @@ -6,9 +6,8 @@ params: pedestal_dset_name: 'charge/channel_pedestals' vref_dac: 223 - vcm_dac: 68 adc_counts: 255 - vdda: 1720 + vdda: 2000 mean_trunc: 3 # ADCs diff --git a/yamls/fsd_flow/reco/charge/MakePedestalHist.yaml b/yamls/fsd_flow/reco/charge/MakePedestalHist.yaml index 2cb41d6..ce64aee 100644 --- a/yamls/fsd_flow/reco/charge/MakePedestalHist.yaml +++ b/yamls/fsd_flow/reco/charge/MakePedestalHist.yaml @@ -6,6 +6,6 @@ params: hist_dset_name: 'charge/hist_data' buffer_size: 100000 - adc_counts: 255 + adc_counts: 1023 diff --git a/yamls/fsd_flow/reco/charge/RawEventGenerator.yaml b/yamls/fsd_flow/reco/charge/RawEventGenerator.yaml index b5d3525..b049e24 100644 --- a/yamls/fsd_flow/reco/charge/RawEventGenerator.yaml +++ b/yamls/fsd_flow/reco/charge/RawEventGenerator.yaml @@ -10,11 +10,11 @@ params: buffer_size: 100000 nhit_cut: 5 sync_noise_cut: [100, 11000000] # Stephen says no need to cut > first 10 usec - sync_noise_cut_enabled: True + sync_noise_cut_enabled: False event_builder_class: 'ExtTrigRawEventBuilder' #'SymmetricWindowRawEventBuilder' event_builder_config: - window: 3300 # 0.1 usec ticks; 10% buffer added to previous 3000 - trig_io_grp: 4 + window: 5500 # 0.1 usec ticks; 10% buffer added to previous 3000 + trig_io_grp: 1 extendable: True build_off_beam_events : True shifted_event_dt : -5 diff --git a/yamls/fsd_flow/reco/charge/TimestampCorrector.yaml b/yamls/fsd_flow/reco/charge/TimestampCorrector.yaml index af38e8a..8a25fde 100644 --- a/yamls/fsd_flow/reco/charge/TimestampCorrector.yaml +++ b/yamls/fsd_flow/reco/charge/TimestampCorrector.yaml @@ -14,7 +14,7 @@ params: # configuration parameters correction: - 1: [-14.033, 2.123e-6, 10000020] - 2: [-13.962, 2.094e-6, 10000020] - 3: [-13.964, 1.559e-6, 10000014] - 4: [-16.020, 1.912e-6, 10000018] + 1: [0, 0] + 2: [0, 0] + 3: [0, 0] + 4: [0, 0] diff --git a/yamls/fsd_flow/resources/LArData.yaml b/yamls/fsd_flow/resources/LArData.yaml index ce5d040..4ed59c5 100644 --- a/yamls/fsd_flow/resources/LArData.yaml +++ b/yamls/fsd_flow/resources/LArData.yaml @@ -4,8 +4,8 @@ params: path: 'lar_info' # electron_lifetime_file: 'data/module0_flow/ElecLifetimeFit_Module0.npz' # download link: https://portal.nersc.gov/project/dune/data/Module0/electronLifetime/ElecLifetimeFit_Module0.root - electron_lifetime: 2200 # us - electron_lifetime_file: "data/fsd_flow/lifetime.json" + #electron_lifetime: 2200 # us + #electron_lifetime_file: "data/fsd_flow/lifetime.json" #: Recombination :math:`\alpha` constant for the Box model box_alpha: 0.93 #: Recombination :math:`\beta` value for the Box model in :math:`(kV/cm)(g/cm^2)/MeV`