From f8687208a3025120eba677efa5f8a79d68324ad4 Mon Sep 17 00:00:00 2001 From: VCLanNguyen Date: Tue, 12 Aug 2025 20:06:49 -0500 Subject: [PATCH 1/4] first commit --- sbncode/CAFMaker/CAFMakerParams.h | 12 ++++++++++++ sbncode/CAFMaker/CAFMaker_module.cc | 25 +++++++++++++++++++++++++ sbncode/CAFMaker/FillReco.cxx | 25 +++++++++++++++++++++++++ sbncode/CAFMaker/FillReco.h | 9 +++++++++ 4 files changed, 71 insertions(+) diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index 253f0d4c2..2f44fea03 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -338,6 +338,18 @@ namespace caf "crttracks" // sbnd }; + Atom SBNDFrameShiftInfoLabel { + Name("SBNDFrameShiftInfoLabel"), + Comment("Label of sbnd frame shift."), + "reco1" // sbnd + }; + + Atom SBNDTimingInfoLabel { + Name("SBNDTimingInfoLabel"), + Comment("Label of sbnd timing shift."), + "reco1" // sbnd + }; + Atom CRTPMTLabel { Name("CRTPMTLabel"), Comment("Label for the CRTPMT Matched variables from the crtpmt data product"), diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 48da84e8f..cb99173a9 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -1603,6 +1603,8 @@ void CAFMaker::produce(art::Event& evt) noexcept { std::vector srcrttracks; std::vector srcrtspacepoints; std::vector srsbndcrttracks; + std::vector srsbndframeshiftinfo; + std::vector srsbndtiminginfo; if(fDet == kICARUS) { @@ -1651,6 +1653,29 @@ void CAFMaker::produce(art::Event& evt) noexcept { FillSBNDCRTTrack(sbndcrttracks[i], srsbndcrttracks.back()); } } + + art::Handle> sbndframeshiftinfo_handle; + GetByLabelStrict(evt, fParams.SBNDFrameShiftInfoLabel(), sbndframeshiftinfo_handle); + // fill into event + if (sbndframeshiftinfo_handle.isValid()) { + const std::vector &sbndframeshiftinfo = *sbndframeshiftinfo_handle; + for (unsigned i = 0; i < sbndframeshiftinfo.size(); i++) { + srsbndframeshiftinfo.emplace_back(); + FillSBNDFrameShiftInfo(sbndframeshiftinfo[i], srsbndframeshiftinfo.back()); + } + } + + art::Handle> sbndtiminginfo_handle; + GetByLabelStrict(evt, fParams.SBNDTimingInfoLabel(), sbndtiminginfo_handle); + // fill into event + if (sbndtiminginfo_handle.isValid()) { + const std::vector &sbndtiminginfo = *sbndtiminginfo_handle; + for (unsigned i = 0; i < sbndtiminginfo.size(); i++) { + srsbndtiminginfo.emplace_back(); + FillSBNDTimingInfo(sbndtiminginfo[i], srsbndtiminginfo.back()); + } + } + } // Get all of the CRTPMT Matches diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index d81cb5890..89b6e378e 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -141,6 +141,31 @@ namespace caf srsbndcrttrack.tof = track.ToF(); } + void FillSBNDFrameShiftInfo(const raw::FrameShiftInfo &frame, + caf::SRSBNDFrameShiftInfo &srsbndframe, + bool allowEmpty) + { + srsbndframe.frameTdcCrtt1 = frame.frameTdcCrtt1; + srsbndframe.frameTdcBes = frame.frameTdcBes; + srsbndframe.frameTdcRwm = frame.frameTdcRwm; + srsbndframe.frameHltCrtt1 = frame.frameHltCrtt1; + srsbndframe.frameHltBeamGate = frame.frameHltBeamGate; + srsbndframe.frameDataToMC = frame.frameDataToMC; + } + + void FillSBNDTimingInfo(const raw::TimingInfo &timing, + caf::SRSBNDTimingInfo &srsbndtiming, + bool allowEmpty) + { + srsbndtiming.tdcCrtt1 = timing.tdcCrtt1; + srsbndtiming.tdcBes = timing.tdcBes; + srsbndtiming.tdcRwm = timing.tdcRwm; + srsbndtiming.tdcEtrig = timing.tdcEtrig; + srsbndtiming.hltCrtt1 = timing.hltCrtt1; + srsbndtiming.hltEtrig = timing.hltEtrig; + srsbndtiming.hltBeamGate = timing.hltBeamGate; + } + void FillCRTPMTMatch(const sbn::crt::CRTPMTMatching &match, caf::SRCRTPMTMatch &srmatch, bool allowEmpty){ diff --git a/sbncode/CAFMaker/FillReco.h b/sbncode/CAFMaker/FillReco.h index 6e8ecf292..a301faba5 100644 --- a/sbncode/CAFMaker/FillReco.h +++ b/sbncode/CAFMaker/FillReco.h @@ -44,6 +44,7 @@ #include "sbnobj/Common/CRT/CRTHitT0TaggingInfo.hh" #include "nusimdata/SimulationBase/MCParticle.h" #include "nusimdata/SimulationBase/MCTruth.h" +#include "sbndcode/Timing/SBNDRawTimingObj.h" #include "sbnanaobj/StandardRecord/SRSlice.h" #include "sbnanaobj/StandardRecord/StandardRecord.h" @@ -279,6 +280,14 @@ namespace caf caf::SRPFP& srpfp, bool allowEmpty = false); + void FillSBNDFrameShiftInfo(const raw::FrameShiftInfo &frame, + caf::SRSBNDFrameShiftInfo &srsbndframe, + bool allowEmpty = false); + + void FillSBNDTimingInfo(const raw::TimingInfo &timing, + caf::SRSBNDTimingInfo &srsbndtiming, + bool allowEmpty = false); + template void CopyPropertyIfSet( const std::map& props, const std::string& search, U& value ); } From b0dd48bfc485f35f5ba2043c78ba407aa61fee28 Mon Sep 17 00:00:00 2001 From: VCLanNguyen Date: Mon, 25 Aug 2025 19:35:52 -0500 Subject: [PATCH 2/4] correct timing in Caf --- sbncode/CAFMaker/CAFMakerParams.h | 4 +- sbncode/CAFMaker/CAFMaker_module.cc | 65 ++++++++++++++++++++++++++++- sbncode/CAFMaker/FillReco.cxx | 3 +- 3 files changed, 68 insertions(+), 4 deletions(-) diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index 2f44fea03..adc0ae0df 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -341,13 +341,13 @@ namespace caf Atom SBNDFrameShiftInfoLabel { Name("SBNDFrameShiftInfoLabel"), Comment("Label of sbnd frame shift."), - "reco1" // sbnd + "framshift" // sbnd }; Atom SBNDTimingInfoLabel { Name("SBNDTimingInfoLabel"), Comment("Label of sbnd timing shift."), - "reco1" // sbnd + "frameshift" // sbnd }; Atom CRTPMTLabel { diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index cb99173a9..68b3fb529 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -316,6 +316,9 @@ class CAFMaker : public art::EDProducer { void FixPMTReferenceTimes(StandardRecord &rec, double PMT_reference_time); void FixCRTReferenceTimes(StandardRecord &rec, double CRTT0_reference_time, double CRTT1_reference_time); + void SBNDShiftCRTReference(StandardRecord &rec, double SBNDFrame); + void SBNDShiftPMTReference(StandardRecord &rec, double SBNDFrame); + /// Equivalent of FindManyP except a return that is !isValid() prints a /// messsage and aborts if StrictMode is true. template @@ -499,6 +502,41 @@ void CAFMaker::BlindEnergyParameters(StandardRecord* brec) { } } +void CAFMaker::SBNDShiftCRTReference(StandardRecord &rec, double SBNDFrame){ + + //CRT Space Point + for (SRCRTSpacePoint &sp: rec.crt_spacepoints){ + sp.time += SBNDFrame; //ns + } + + //CRT Track + for (SRSBNDCRTTrack &trk: rec.sbnd_crt_tracks){ + trk.time += SBNDFrame; //ns + } + + //CRT Space Point and Track Match + for (SRPFP &pfp: rec.reco.pfp) { + pfp.trk.crtspacepoint.spacepoint.time += SBNDFrame; + pfp.trk.crtsbndtrack.track.time += SBNDFrame; + } +} + +void CAFMaker::SBNDShiftPMTReference(StandardRecord &rec, double SBNDFrame){ + + double SBNDFrame_us = SBNDFrame / 1000.0; //convert ns to us + + //Op Flash + for (SROpFlash &opf: rec.opflashes) { + opf.time += SBNDFrame_us; + opf.firsttime += SBNDFrame_us; + } + + //OpT0 match to slice + for (SRSlice &s: rec.slc) { + s.opt0.time += SBNDFrame_us; + } +} + void CAFMaker::FixPMTReferenceTimes(StandardRecord &rec, double PMT_reference_time) { // Fix the flashes for (SROpFlash &f: rec.opflashes) { @@ -2382,6 +2420,11 @@ void CAFMaker::produce(art::Event& evt) noexcept { rec.nsbnd_crt_tracks = srsbndcrttracks.size(); rec.opflashes = srflashes; rec.nopflashes = srflashes.size(); + rec.sbnd_frames = srsbndframeshiftinfo; + rec.nsbnd_frames = srsbndframeshiftinfo.size(); + rec.sbnd_timings = srsbndtiminginfo; + rec.nsbnd_timings = srsbndtiminginfo.size(); + if (fParams.FillTrueParticles()) { rec.true_particles = true_particles; } @@ -2389,7 +2432,7 @@ void CAFMaker::produce(art::Event& evt) noexcept { rec.crtpmt_matches = srcrtpmtmatches; rec.ncrtpmt_matches = srcrtpmtmatches.size(); - // Fix the Reference time + // ICARUS: Fix the Reference time // // We want MC and Data to have the same reference time. // In MC/LArSoft the "reference time" is canonically defined @@ -2421,6 +2464,26 @@ void CAFMaker::produce(art::Event& evt) noexcept { FixPMTReferenceTimes(rec, PMT_reference_time); // TODO: TPC? + + // SBND: Fix the Reference time (See docdb# ????? and FrameShift module on sbndcode repo) + + if (isRealData & (fDet == kSBND)) + { + mf::LogInfo("CAFMaker") << "Setting Reference Timing for timing object in SBND" ; + + //Should only be 1 set of frame per event, if not, something is really wrong and nothing should be corrected + if (rec.nsbnd_frames == 1) + { + SRSBNDFrameShiftInfo frame = rec.sbnd_frames.at(0); + + //shift reference frame for CRT objects: crt trk, crt sp, crt sp match, crt trk match + SBNDShiftCRTReference(rec, frame.frameApplyAtCaf); + + //shift reference frame for PMT objects: opflash, opt0 + SBNDShiftPMTReference(rec, frame.frameApplyAtCaf); + } + + } // Get metadata information for header unsigned int run = evt.run(); diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 89b6e378e..29cb2bf5a 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -145,12 +145,13 @@ namespace caf caf::SRSBNDFrameShiftInfo &srsbndframe, bool allowEmpty) { + srsbndframe.timingType = frame.timingType; srsbndframe.frameTdcCrtt1 = frame.frameTdcCrtt1; srsbndframe.frameTdcBes = frame.frameTdcBes; srsbndframe.frameTdcRwm = frame.frameTdcRwm; srsbndframe.frameHltCrtt1 = frame.frameHltCrtt1; srsbndframe.frameHltBeamGate = frame.frameHltBeamGate; - srsbndframe.frameDataToMC = frame.frameDataToMC; + srsbndframe.frameApplyAtCaf = frame.frameApplyAtCaf; } void FillSBNDTimingInfo(const raw::TimingInfo &timing, From 4f49aba2eb0be7ec0a15782c6c81d437c2780731 Mon Sep 17 00:00:00 2001 From: VCLanNguyen Date: Tue, 26 Aug 2025 15:30:41 -0500 Subject: [PATCH 3/4] add fixes --- sbncode/CAFMaker/CAFMakerParams.h | 2 +- sbncode/CAFMaker/CAFMaker_module.cc | 50 ++++++++++------------------- sbncode/CAFMaker/FillReco.cxx | 1 + 3 files changed, 19 insertions(+), 34 deletions(-) diff --git a/sbncode/CAFMaker/CAFMakerParams.h b/sbncode/CAFMaker/CAFMakerParams.h index adc0ae0df..2ee91d866 100644 --- a/sbncode/CAFMaker/CAFMakerParams.h +++ b/sbncode/CAFMaker/CAFMakerParams.h @@ -341,7 +341,7 @@ namespace caf Atom SBNDFrameShiftInfoLabel { Name("SBNDFrameShiftInfoLabel"), Comment("Label of sbnd frame shift."), - "framshift" // sbnd + "frameshift" // sbnd }; Atom SBNDTimingInfoLabel { diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 68b3fb529..0cc74b544 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -1641,8 +1641,8 @@ void CAFMaker::produce(art::Event& evt) noexcept { std::vector srcrttracks; std::vector srcrtspacepoints; std::vector srsbndcrttracks; - std::vector srsbndframeshiftinfo; - std::vector srsbndtiminginfo; + caf::SRSBNDFrameShiftInfo srsbndframeshiftinfo; + caf::SRSBNDTimingInfo srsbndtiminginfo; if(fDet == kICARUS) { @@ -1691,29 +1691,22 @@ void CAFMaker::produce(art::Event& evt) noexcept { FillSBNDCRTTrack(sbndcrttracks[i], srsbndcrttracks.back()); } } - - art::Handle> sbndframeshiftinfo_handle; + + art::Handle sbndframeshiftinfo_handle; GetByLabelStrict(evt, fParams.SBNDFrameShiftInfoLabel(), sbndframeshiftinfo_handle); // fill into event if (sbndframeshiftinfo_handle.isValid()) { - const std::vector &sbndframeshiftinfo = *sbndframeshiftinfo_handle; - for (unsigned i = 0; i < sbndframeshiftinfo.size(); i++) { - srsbndframeshiftinfo.emplace_back(); - FillSBNDFrameShiftInfo(sbndframeshiftinfo[i], srsbndframeshiftinfo.back()); - } + raw::FrameShiftInfo const& sbndframeshiftinfo(*sbndframeshiftinfo_handle); + FillSBNDFrameShiftInfo(sbndframeshiftinfo, srsbndframeshiftinfo); } - art::Handle> sbndtiminginfo_handle; + art::Handle sbndtiminginfo_handle; GetByLabelStrict(evt, fParams.SBNDTimingInfoLabel(), sbndtiminginfo_handle); // fill into event if (sbndtiminginfo_handle.isValid()) { - const std::vector &sbndtiminginfo = *sbndtiminginfo_handle; - for (unsigned i = 0; i < sbndtiminginfo.size(); i++) { - srsbndtiminginfo.emplace_back(); - FillSBNDTimingInfo(sbndtiminginfo[i], srsbndtiminginfo.back()); - } + raw::TimingInfo const& sbndtiminginfo(*sbndtiminginfo_handle); + FillSBNDTimingInfo(sbndtiminginfo, srsbndtiminginfo); } - } // Get all of the CRTPMT Matches @@ -2421,9 +2414,7 @@ void CAFMaker::produce(art::Event& evt) noexcept { rec.opflashes = srflashes; rec.nopflashes = srflashes.size(); rec.sbnd_frames = srsbndframeshiftinfo; - rec.nsbnd_frames = srsbndframeshiftinfo.size(); rec.sbnd_timings = srsbndtiminginfo; - rec.nsbnd_timings = srsbndtiminginfo.size(); if (fParams.FillTrueParticles()) { rec.true_particles = true_particles; @@ -2465,24 +2456,17 @@ void CAFMaker::produce(art::Event& evt) noexcept { // TODO: TPC? - // SBND: Fix the Reference time (See docdb# ????? and FrameShift module on sbndcode repo) - + // SBND: Fix the Reference time in data depending on the stream (See FrameShift module on sbndcode repo) if (isRealData & (fDet == kSBND)) { - mf::LogInfo("CAFMaker") << "Setting Reference Timing for timing object in SBND" ; - - //Should only be 1 set of frame per event, if not, something is really wrong and nothing should be corrected - if (rec.nsbnd_frames == 1) - { - SRSBNDFrameShiftInfo frame = rec.sbnd_frames.at(0); - - //shift reference frame for CRT objects: crt trk, crt sp, crt sp match, crt trk match - SBNDShiftCRTReference(rec, frame.frameApplyAtCaf); - - //shift reference frame for PMT objects: opflash, opt0 - SBNDShiftPMTReference(rec, frame.frameApplyAtCaf); - } + mf::LogInfo("CAFMaker") << "Setting Reference Timing for timing object in SBND \n" + << " Shift Apply At Caf Level = " << rec.sbnd_frames.frameApplyAtCaf << " ns\n"; + + //shift reference frame for CRT objects: crt trk, crt sp, crt sp match, crt trk match + SBNDShiftCRTReference(rec, rec.sbnd_frames.frameApplyAtCaf); + //shift reference frame for PMT objects: opflash, opt0 + SBNDShiftPMTReference(rec, rec.sbnd_frames.frameApplyAtCaf); } // Get metadata information for header diff --git a/sbncode/CAFMaker/FillReco.cxx b/sbncode/CAFMaker/FillReco.cxx index 29cb2bf5a..15356240e 100644 --- a/sbncode/CAFMaker/FillReco.cxx +++ b/sbncode/CAFMaker/FillReco.cxx @@ -158,6 +158,7 @@ namespace caf caf::SRSBNDTimingInfo &srsbndtiming, bool allowEmpty) { + srsbndtiming.rawDAQHeaderTimestamp = timing.rawDAQHeaderTimestamp; srsbndtiming.tdcCrtt1 = timing.tdcCrtt1; srsbndtiming.tdcBes = timing.tdcBes; srsbndtiming.tdcRwm = timing.tdcRwm; From ce919163e2ec245bd6e3e65bc3aa7f6d0b9b66ed Mon Sep 17 00:00:00 2001 From: VCLanNguyen Date: Wed, 27 Aug 2025 23:56:33 -0500 Subject: [PATCH 4/4] undo frame shift for crt matched --- sbncode/CAFMaker/CAFMaker_module.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sbncode/CAFMaker/CAFMaker_module.cc b/sbncode/CAFMaker/CAFMaker_module.cc index 0cc74b544..5965e0e2a 100644 --- a/sbncode/CAFMaker/CAFMaker_module.cc +++ b/sbncode/CAFMaker/CAFMaker_module.cc @@ -514,11 +514,11 @@ void CAFMaker::SBNDShiftCRTReference(StandardRecord &rec, double SBNDFrame){ trk.time += SBNDFrame; //ns } - //CRT Space Point and Track Match - for (SRPFP &pfp: rec.reco.pfp) { - pfp.trk.crtspacepoint.spacepoint.time += SBNDFrame; - pfp.trk.crtsbndtrack.track.time += SBNDFrame; - } + //TODO: CRT Space Point and Track Match + //for (SRPFP &pfp: rec.reco.pfp) { + // pfp.trk.crtspacepoint.spacepoint.time += SBNDFrame; + // pfp.trk.crtsbndtrack.track.time += SBNDFrame; + //} } void CAFMaker::SBNDShiftPMTReference(StandardRecord &rec, double SBNDFrame){