From 790445eb3798bb9469fba6a3ff78f1dc06639932 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Mon, 2 Jun 2025 12:25:42 -0500 Subject: [PATCH 01/10] move PMTBeamSignal data product from icaruscode/IcarusObj to sbnobj/Common --- .../OpReco/ICARUSBeamStructureAna_module.cc | 24 ++++---- .../PMT/OpReco/ICARUSFlashAssAna_module.cc | 22 +++---- .../Timing/PMTBeamSignalsExtractor_module.cc | 58 +++++++++---------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/icaruscode/PMT/OpReco/ICARUSBeamStructureAna_module.cc b/icaruscode/PMT/OpReco/ICARUSBeamStructureAna_module.cc index cb684dbfc..22e3d14f7 100644 --- a/icaruscode/PMT/OpReco/ICARUSBeamStructureAna_module.cc +++ b/icaruscode/PMT/OpReco/ICARUSBeamStructureAna_module.cc @@ -38,7 +38,7 @@ #include "sbnobj/Common/Trigger/ExtraTriggerInfo.h" #include "icaruscode/CRT/CRTUtils/CRTPMTMatchingUtils.h" #include "sbnobj/Common/CRT/CRTPMTMatching.hh" -#include "icaruscode/IcarusObj/PMTBeamSignal.h" +#include "sbnobj/Common/PMT/Data/PMTBeamSignal.hh" // ROOT libraries #include "TTree.h" @@ -156,7 +156,7 @@ class opana::ICARUSBeamStructureAna : public art::EDAnalyzer std::vector m_crtregion; // RWM times - std::vector fRWMTimes; + std::vector fRWMTimes; }; // -------------------------------------------------------------------------- @@ -289,9 +289,9 @@ void opana::ICARUSBeamStructureAna::analyze(art::Event const &e) // ---- // RWM times - fRWMTimes = e.getProduct>(fRWMLabel); + fRWMTimes = e.getProduct>(fRWMLabel); if (fRWMTimes.empty()) - mf::LogTrace("ICARUSBeamStructureAna") << "Data product std::vector for '" << fRWMLabel.label() + mf::LogTrace("ICARUSBeamStructureAna") << "Data product std::vector for '" << fRWMLabel.label() << "' is empty in " << m_gate_name << " event!"; // ---- @@ -420,11 +420,11 @@ void opana::ICARUSBeamStructureAna::analyze(art::Event const &e) m_hit_rise_time_rwm.push_back(getRWMRelativeTime(ch, risemap[ch])); m_hit_pe.push_back(pemap[ch]); } - + // get the flash interaction time w.r.t. RWM // this is currently the mean between the first ophits on opposite walls m_flash_time_rwm = getFlashBunchTime(m_channel_id, m_hit_rise_time_rwm); - + fOpFlashTrees[iFlashLabel]->Fill(); clear(); @@ -461,7 +461,7 @@ double opana::ICARUSBeamStructureAna::getRWMRelativeTime(int channel, double t) { if (fRWMTimes.empty()) - return icarus::timing::NoTime; + return sbn::timing::NoTime; auto rwm = fRWMTimes.at(channel); if (!rwm.isValid()) @@ -470,7 +470,7 @@ double opana::ICARUSBeamStructureAna::getRWMRelativeTime(int channel, double t) << "(Crate " << rwm.crate << ", Board " << rwm.digitizerLabel << ", SpecialChannel " << rwm.specialChannel << ")" << " in event " << m_event << " gate " << m_gate_name; - return icarus::timing::NoTime; + return sbn::timing::NoTime; } double rwm_trigger = rwm.startTime; // rwm time w.r.t. trigger time [us] @@ -486,9 +486,9 @@ double opana::ICARUSBeamStructureAna::getFlashBunchTime(std::vector channel double tfirst_right = std::numeric_limits::max(); // if no RWM info available, all pmt_start_time_rwm are invalid - // return icarus::timing::NoTime as well for the flash + // return sbn::timing::NoTime as well for the flash if (fRWMTimes.empty()) - return icarus::timing::NoTime; + return sbn::timing::NoTime; int nleft = 0; int nright = 0; @@ -501,9 +501,9 @@ double opana::ICARUSBeamStructureAna::getFlashBunchTime(std::vector channel // if any RWM copy is missing (therefore missing for an entire PMT crate), // it might not be possible to use the first hits (they might not have a RMW time) - // so return icarus::timing::NoTime as in other bad cases + // so return sbn::timing::NoTime as in other bad cases if (!fRWMTimes[i].isValid()) - return icarus::timing::NoTime; + return sbn::timing::NoTime; // count hits separetely on the two walls if (side == 0) diff --git a/icaruscode/PMT/OpReco/ICARUSFlashAssAna_module.cc b/icaruscode/PMT/OpReco/ICARUSFlashAssAna_module.cc index acd96a95e..ff0909af8 100644 --- a/icaruscode/PMT/OpReco/ICARUSFlashAssAna_module.cc +++ b/icaruscode/PMT/OpReco/ICARUSFlashAssAna_module.cc @@ -42,7 +42,7 @@ #include "lardataobj/Simulation/BeamGateInfo.h" #include "lardataobj/RawData/TriggerData.h" #include "sbnobj/Common/Trigger/ExtraTriggerInfo.h" -#include "icaruscode/IcarusObj/PMTBeamSignal.h" +#include "sbnobj/Common/PMT/Data/PMTBeamSignal.hh" #include "sbnobj/ICARUS/PMT/Data/WaveformBaseline.h" #include "TTree.h" @@ -102,7 +102,7 @@ class opana::ICARUSFlashAssAna : public art::EDAnalyzer fhicl::Atom RWMLabel{ Name("RWMLabel"), - Comment("Tag for the RWM std::vector data product")}; + Comment("Tag for the RWM std::vector data product")}; fhicl::Atom PEOpHitThreshold{ Name("PEOpHitThreshold"), @@ -251,7 +251,7 @@ class opana::ICARUSFlashAssAna : public art::EDAnalyzer geo::GeometryCore const* fGeom; geo::WireReadoutGeom const* fChannelMapAlg; - std::vector fRWMTimes; + std::vector fRWMTimes; }; // ---------------------------------------------------------------------------- @@ -485,7 +485,7 @@ float opana::ICARUSFlashAssAna::getRWMRelativeTime(int channel, float t) { if (fRWMTimes.empty()) - return icarus::timing::NoTime; + return sbn::timing::NoTime; auto rwm = fRWMTimes.at(channel); if (!rwm.isValid()) @@ -494,7 +494,7 @@ float opana::ICARUSFlashAssAna::getRWMRelativeTime(int channel, float t) << "(Crate " << rwm.crate << ", Board " << rwm.digitizerLabel << ", SpecialChannel " << rwm.specialChannel << ")" << " in event " << m_event << " gate " << m_gate_name; - return icarus::timing::NoTime; + return sbn::timing::NoTime; } float rwm_trigger = rwm.startTime; // rwm time w.r.t. trigger time [us] @@ -511,9 +511,9 @@ float opana::ICARUSFlashAssAna::getFlashBunchTime(std::vector pmt_start_ float tfirst_right = std::numeric_limits::max(); // if no RWM info available, all pmt_start_time_rwm are invalid - // return icarus::timing::NoTime as well for the flash + // return sbn::timing::NoTime as well for the flash if (fRWMTimes.empty()) - return icarus::timing::NoTime; + return sbn::timing::NoTime; int nleft = 0; int nright = 0; @@ -530,9 +530,9 @@ float opana::ICARUSFlashAssAna::getFlashBunchTime(std::vector pmt_start_ // if any RWM copy is missing (therefore missing for an entire PMT crate), // it might not be possible to use the first hits (they might not have a RMW time) - // so return icarus::timing::NoTime as in other bad cases + // so return sbn::timing::NoTime as in other bad cases if (!fRWMTimes[i].isValid()) - return icarus::timing::NoTime; + return sbn::timing::NoTime; // count hits separetely on the two walls if (side == 0) @@ -768,9 +768,9 @@ void opana::ICARUSFlashAssAna::analyze(art::Event const &e) if (!fRWMLabel.empty()) { - fRWMTimes = e.getProduct>(fRWMLabel); + fRWMTimes = e.getProduct>(fRWMLabel); if (fRWMTimes.empty()) - mf::LogTrace("ICARUSFlashAssAna") << "Data product std::vector for '" + mf::LogTrace("ICARUSFlashAssAna") << "Data product std::vector for '" << fRWMLabel.label() << "' is empty in " << m_gate_name << " event!"; } diff --git a/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc b/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc index c190f770f..aca507192 100644 --- a/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc +++ b/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////// /** * @file icaruscode/Timing/PMTBeamSignalsExtractor_module.cc - * @brief `icarus::timing::PMTBeamSignalsExtractor` producer module. + * @brief `sbn::timing::PMTBeamSignalsExtractor` producer module. * @author Matteo Vicenzi (mvicenzi@bnl.gov) * @date Sun Feb 11 11:37:14 2024 **/ @@ -18,7 +18,7 @@ #include "sbnobj/Common/Trigger/ExtraTriggerInfo.h" #include "icaruscode/Decode/ChannelMapping/IICARUSChannelMap.h" #include "icaruscode/IcarusObj/PMTWaveformTimeCorrection.h" -#include "icaruscode/IcarusObj/PMTBeamSignal.h" +#include "sbnobj/Common/PMT/Data/PMTBeamSignal.hh" #include "lardataalg/DetectorInfo/DetectorTimingTypes.h" // electronics_time #include "lardataalg/Utilities/quantities/spacetime.h" #include "lardataobj/RawData/OpDetWaveform.h" @@ -35,7 +35,7 @@ #include #include -namespace icarus::timing +namespace sbn::timing { class PMTBeamSignalsExtractor; } @@ -59,7 +59,7 @@ namespace icarus::timing * * `EWlabel` (input tag): tag for the `std::vector` * product containign the EW special waveforms. * * `TriggerCorrectionLabel` (input tag): tag for the - * std::vector product that + * std::vector product that * stores the channel-by-channel waveform timing corrections * * `BoardSetup` (fhicl parameter set): description of the current * V1730 setup from `CAEN_V1730_setup_icarus.fcl` mapping the special signals. @@ -91,7 +91,7 @@ namespace icarus::timing * Output products * ------------------------- * - * This modules produces two `std::vector` + * This modules produces two `std::vector` * with 360 elements each, representing the relevent RWM or EW time for * the corresponding PMT channel. When the discrimination algorithm decides * the "peak" on a waveform to be noise, the corresponding entries are placed @@ -122,7 +122,7 @@ namespace icarus::timing * * `wf` (only if `SaveWaveforms` is set): full waveform. */ -class icarus::timing::PMTBeamSignalsExtractor : public art::EDProducer +class sbn::timing::PMTBeamSignalsExtractor : public art::EDProducer { public: explicit PMTBeamSignalsExtractor(fhicl::ParameterSet const &pset); @@ -208,16 +208,16 @@ class icarus::timing::PMTBeamSignalsExtractor : public art::EDProducer std::vector m_wf; // prepare pointers for data products - using BeamSignalCollection = std::vector; + using BeamSignalCollection = std::vector; using BeamSignalCollectionPtr = std::unique_ptr; - std::map> fBeamSignals; + std::map> fBeamSignals; std::map fSignalCollection; }; // ----------------------------------------------------------------------------- -icarus::timing::PMTBeamSignalsExtractor::PMTBeamSignalsExtractor(fhicl::ParameterSet const &pset) +sbn::timing::PMTBeamSignalsExtractor::PMTBeamSignalsExtractor(fhicl::ParameterSet const &pset) : EDProducer{pset}, fChannelMap(*(art::ServiceHandle{})), fDebugTrees(pset.get("DebugTrees")), @@ -240,7 +240,7 @@ icarus::timing::PMTBeamSignalsExtractor::PMTBeamSignalsExtractor(fhicl::Paramete // ----------------------------------------------------------------------------- -void icarus::timing::PMTBeamSignalsExtractor::beginJob() +void sbn::timing::PMTBeamSignalsExtractor::beginJob() { // prepare outupt TTrees if requested if (!fDebugTrees) @@ -277,7 +277,7 @@ void icarus::timing::PMTBeamSignalsExtractor::beginJob() // ----------------------------------------------------------------------------- -void icarus::timing::PMTBeamSignalsExtractor::beginRun(art::Run &run) +void sbn::timing::PMTBeamSignalsExtractor::beginRun(art::Run &run) { // pre-save the association between digitizer_label and effective fragment ID // needs to be done at the begin of each run in case mapping changed @@ -292,7 +292,7 @@ void icarus::timing::PMTBeamSignalsExtractor::beginRun(art::Run &run) // ----------------------------------------------------------------------------- -void icarus::timing::PMTBeamSignalsExtractor::produce(art::Event &e) +void sbn::timing::PMTBeamSignalsExtractor::produce(art::Event &e) { // initialize the data products @@ -365,7 +365,7 @@ void icarus::timing::PMTBeamSignalsExtractor::produce(art::Event &e) // ----------------------------------------------------------------------------- -void icarus::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event &e, art::InputTag const &label) +void sbn::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event &e, art::InputTag const &label) { std::string const &l = label.instance(); @@ -382,7 +382,7 @@ void icarus::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event & // get the start sample of the signals, one instance per PMT crate // use threshold to skip spikes from electric crosstalk see SBN-doc-34928, slides 4-5. - // if no signal is found, set both times to icarus::timing::NoTime + // if no signal is found, set both times to sbn::timing::NoTime // so that `isValid()` in PMTBeamSignal will complain if someone checks it for (auto const &wave : waveforms) { @@ -394,12 +394,12 @@ void icarus::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event & m_channel = wave.ChannelNumber(); m_wfstart = tstart.value(); - m_utime_abs = (m_sample != icarus::timing::NoSample) ? tstart.value() + fPMTsamplingTick * m_sample : icarus::timing::NoTime; - m_time_abs = (m_sample != icarus::timing::NoSample) ? m_utime_abs + getTriggerCorrection(m_channel) : icarus::timing::NoTime; - m_time = (m_sample != icarus::timing::NoSample) ? m_time_abs - ftriggerTime : icarus::timing::NoTime; + m_utime_abs = (m_sample != sbn::timing::NoSample) ? tstart.value() + fPMTsamplingTick * m_sample : sbn::timing::NoTime; + m_time_abs = (m_sample != sbn::timing::NoSample) ? m_utime_abs + getTriggerCorrection(m_channel) : sbn::timing::NoTime; + m_time = (m_sample != sbn::timing::NoSample) ? m_time_abs - ftriggerTime : sbn::timing::NoTime; std::string crate = getCrate(m_channel); - icarus::timing::PMTBeamSignal beamTime{m_channel, getDigitizerLabel(m_channel), crate, m_sample, m_time_abs, m_time}; + sbn::timing::PMTBeamSignal beamTime{m_channel, getDigitizerLabel(m_channel), crate, m_sample, m_time_abs, m_time}; fBeamSignals[l].emplace(crate, std::move(beamTime)); if (fDebugTrees) @@ -417,7 +417,7 @@ void icarus::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event & // --------------------------------------------------------------------------- template -T icarus::timing::PMTBeamSignalsExtractor::Median(std::vector data) +T sbn::timing::PMTBeamSignalsExtractor::Median(std::vector data) { std::nth_element(data.begin(), data.begin() + data.size() / 2, data.end()); @@ -427,7 +427,7 @@ T icarus::timing::PMTBeamSignalsExtractor::Median(std::vector data) // ----------------------------------------------------------------------------- template -std::size_t icarus::timing::PMTBeamSignalsExtractor::getMinBin( +std::size_t sbn::timing::PMTBeamSignalsExtractor::getMinBin( std::vector const &vv, std::size_t startElement, std::size_t endElement) { @@ -441,7 +441,7 @@ std::size_t icarus::timing::PMTBeamSignalsExtractor::getMinBin( // ----------------------------------------------------------------------------- template -std::size_t icarus::timing::PMTBeamSignalsExtractor::getMaxBin( +std::size_t sbn::timing::PMTBeamSignalsExtractor::getMaxBin( std::vector const &vv, std::size_t startElement, std::size_t endElement) { @@ -456,7 +456,7 @@ std::size_t icarus::timing::PMTBeamSignalsExtractor::getMaxBin( // ----------------------------------------------------------------------------- template -std::size_t icarus::timing::PMTBeamSignalsExtractor::getStartSample(std::vector const &vv, T thres) +std::size_t sbn::timing::PMTBeamSignalsExtractor::getStartSample(std::vector const &vv, T thres) { // We are thinking in inverted polarity @@ -471,7 +471,7 @@ std::size_t icarus::timing::PMTBeamSignalsExtractor::getStartSample(std::vector< auto delta = vv[maxbin] - vv[minbin]; if (delta < thres) // just noise - return icarus::timing::NoSample; // return no sample + return sbn::timing::NoSample; // return no sample for (std::size_t bin = maxbin; bin < minbin; bin++) { @@ -493,7 +493,7 @@ std::size_t icarus::timing::PMTBeamSignalsExtractor::getStartSample(std::vector< // ----------------------------------------------------------------------------- -std::map icarus::timing::PMTBeamSignalsExtractor::extractBoardBySpecialChannel( +std::map sbn::timing::PMTBeamSignalsExtractor::extractBoardBySpecialChannel( std::vector const &setup) { @@ -512,7 +512,7 @@ std::map icarus::timing::PMTBeamSignalsExtractor::extractBoard // ----------------------------------------------------------------------------- -std::string icarus::timing::PMTBeamSignalsExtractor::getDigitizerLabel(int channel) const +std::string sbn::timing::PMTBeamSignalsExtractor::getDigitizerLabel(int channel) const { // get the board name, convert to digitizer_label @@ -531,7 +531,7 @@ std::string icarus::timing::PMTBeamSignalsExtractor::getDigitizerLabel(int chann // ----------------------------------------------------------------------------- -std::string icarus::timing::PMTBeamSignalsExtractor::getCrate(int channel) const +std::string sbn::timing::PMTBeamSignalsExtractor::getCrate(int channel) const { std::string digitizer_label = getDigitizerLabel(channel); @@ -540,7 +540,7 @@ std::string icarus::timing::PMTBeamSignalsExtractor::getCrate(int channel) const // ----------------------------------------------------------------------------- -double icarus::timing::PMTBeamSignalsExtractor::getTriggerCorrection(int channel) const +double sbn::timing::PMTBeamSignalsExtractor::getTriggerCorrection(int channel) const { std::string digitizer_label = getDigitizerLabel(channel); @@ -558,7 +558,7 @@ double icarus::timing::PMTBeamSignalsExtractor::getTriggerCorrection(int channel // ----------------------------------------------------------------------------- -void icarus::timing::PMTBeamSignalsExtractor::associateBeamSignalsToChannels(art::InputTag const &label) +void sbn::timing::PMTBeamSignalsExtractor::associateBeamSignalsToChannels(art::InputTag const &label) { std::string const &l = label.instance(); @@ -593,4 +593,4 @@ void icarus::timing::PMTBeamSignalsExtractor::associateBeamSignalsToChannels(art } // for each crate } -DEFINE_ART_MODULE(icarus::timing::PMTBeamSignalsExtractor) +DEFINE_ART_MODULE(sbn::timing::PMTBeamSignalsExtractor) From ffbcc3502dcac549a23e19a367d2fb071e1b11c2 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Mon, 2 Jun 2025 12:29:19 -0500 Subject: [PATCH 02/10] remove old PMTBeamSignal definition --- icaruscode/IcarusObj/PMTBeamSignal.h | 69 ---------------------------- icaruscode/IcarusObj/classes.h | 2 +- icaruscode/IcarusObj/classes_def.xml | 6 --- 3 files changed, 1 insertion(+), 76 deletions(-) delete mode 100644 icaruscode/IcarusObj/PMTBeamSignal.h diff --git a/icaruscode/IcarusObj/PMTBeamSignal.h b/icaruscode/IcarusObj/PMTBeamSignal.h deleted file mode 100644 index 842af0375..000000000 --- a/icaruscode/IcarusObj/PMTBeamSignal.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @file icaruscode/IcarusObj/PMTBeamSignal.h - * @brief Holds the event-by-event RWM or EW times - * @author Matteo Vicenzi (mvicenzi@bnl.gov) - * @date March 14 2024 - */ - -#ifndef ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H -#define ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H - -// C/C++ standard libraries -#include -#include -#include - -namespace icarus::timing -{ - - /// Special value to denote no special channel information. - static constexpr auto NoChannel = std::numeric_limits::max(); - /// Special value to denote no time channel information. - static constexpr double NoTime = std::numeric_limits::max(); - // Special value to denote no sample information. - static constexpr std::size_t NoSample = 0; - - /** - * @brief Beam time as seen by a PMT readout board. - * - * This could either be an early warning (EW) or a resistive wall monitor (RWM) time. - * These signals are delivered via fibers and digitized in special PMT channels. - * - * Both the time in @ref DetectorClocksElectronicsTime "electronics time scale" - * and time time relative to the hardware trigger are included. - * - * The information in this object may be missing: its validity should - * always be checked in advance with `isValid()`. - */ - - struct PMTBeamSignal - { - - /// Special channel this time was extracted from. - /// These are defined in `CAEN_V1730_setup_icarus.fcl`. - unsigned int specialChannel = NoChannel; - - /// Board on which the special channel is on (e.g: WW-TOP-A). - /// Should match the same format as `icarusDB::PMTChannelInfo_t::digitizerLabel`. - std::string digitizerLabel = ""; - - /// Crate this time applies to (e.g.: WW-TOP). - /// Corresponds to the first part of `digitizerLabel`. - std::string crate = ""; - - /// Sample within the waveform where the reference signal is found. - std::size_t sample = NoSample; - - /// Start time in electronics time [us]. - double startTimeAbs = NoTime; - - /// Start time relative to trigger time [us]. - double startTime = NoTime; - - /// Returns whether the time is valid. - bool isValid() const { return (sample != NoSample); } - }; - -} // namespace icarus::timing - -#endif // ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H diff --git a/icaruscode/IcarusObj/classes.h b/icaruscode/IcarusObj/classes.h index 05e6001ae..fe98b3547 100644 --- a/icaruscode/IcarusObj/classes.h +++ b/icaruscode/IcarusObj/classes.h @@ -6,7 +6,7 @@ #include "icaruscode/IcarusObj/CRTTPCMatchingInfo.h" #include "icaruscode/IcarusObj/OpDetWaveformMeta.h" #include "icaruscode/IcarusObj/PMTWaveformTimeCorrection.h" -#include "icaruscode/IcarusObj/PMTBeamSignal.h" +//#include "icaruscode/IcarusObj/PMTBeamSignal.h" #include "icaruscode/IcarusObj/Hit.h" //#include "icaruscode/IcarusObj/CRTPMTMatching.h" diff --git a/icaruscode/IcarusObj/classes_def.xml b/icaruscode/IcarusObj/classes_def.xml index 4abf7c8bd..5c32eb98c 100644 --- a/icaruscode/IcarusObj/classes_def.xml +++ b/icaruscode/IcarusObj/classes_def.xml @@ -41,12 +41,6 @@ - - - - - - From 4b44b744cde619bbf17e0b3e15ee93b9abad4815 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Mon, 2 Jun 2025 12:45:26 -0500 Subject: [PATCH 03/10] remove "#include icaruscode/IcarusObj/PMTBeamSignal.h" from classes.h --- icaruscode/IcarusObj/classes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icaruscode/IcarusObj/classes.h b/icaruscode/IcarusObj/classes.h index fe98b3547..e7f634196 100644 --- a/icaruscode/IcarusObj/classes.h +++ b/icaruscode/IcarusObj/classes.h @@ -6,7 +6,7 @@ #include "icaruscode/IcarusObj/CRTTPCMatchingInfo.h" #include "icaruscode/IcarusObj/OpDetWaveformMeta.h" #include "icaruscode/IcarusObj/PMTWaveformTimeCorrection.h" -//#include "icaruscode/IcarusObj/PMTBeamSignal.h" + #include "icaruscode/IcarusObj/Hit.h" //#include "icaruscode/IcarusObj/CRTPMTMatching.h" From 8a5a79b51eff0f5d092854c803032c70aad5e831 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Mon, 2 Jun 2025 15:15:05 -0500 Subject: [PATCH 04/10] keep icarus::timing namespace in PMTBeamSignalsExtractor_module --- .../Timing/PMTBeamSignalsExtractor_module.cc | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc b/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc index aca507192..0616af686 100644 --- a/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc +++ b/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc @@ -35,7 +35,7 @@ #include #include -namespace sbn::timing +namespace icarus::timing { class PMTBeamSignalsExtractor; } @@ -59,7 +59,7 @@ namespace sbn::timing * * `EWlabel` (input tag): tag for the `std::vector` * product containign the EW special waveforms. * * `TriggerCorrectionLabel` (input tag): tag for the - * std::vector product that + * std::vector product that * stores the channel-by-channel waveform timing corrections * * `BoardSetup` (fhicl parameter set): description of the current * V1730 setup from `CAEN_V1730_setup_icarus.fcl` mapping the special signals. @@ -122,7 +122,7 @@ namespace sbn::timing * * `wf` (only if `SaveWaveforms` is set): full waveform. */ -class sbn::timing::PMTBeamSignalsExtractor : public art::EDProducer +class icarus::timing::PMTBeamSignalsExtractor : public art::EDProducer { public: explicit PMTBeamSignalsExtractor(fhicl::ParameterSet const &pset); @@ -217,7 +217,7 @@ class sbn::timing::PMTBeamSignalsExtractor : public art::EDProducer // ----------------------------------------------------------------------------- -sbn::timing::PMTBeamSignalsExtractor::PMTBeamSignalsExtractor(fhicl::ParameterSet const &pset) +icarus::timing::PMTBeamSignalsExtractor::PMTBeamSignalsExtractor(fhicl::ParameterSet const &pset) : EDProducer{pset}, fChannelMap(*(art::ServiceHandle{})), fDebugTrees(pset.get("DebugTrees")), @@ -234,13 +234,13 @@ sbn::timing::PMTBeamSignalsExtractor::PMTBeamSignalsExtractor(fhicl::ParameterSe consumes>(fRWMlabel); // Call appropriate produces<>() functions here. - produces>("RWM"); - produces>("EW"); + produces>("RWM"); + produces>("EW"); } // ----------------------------------------------------------------------------- -void sbn::timing::PMTBeamSignalsExtractor::beginJob() +void icarus::timing::PMTBeamSignalsExtractor::beginJob() { // prepare outupt TTrees if requested if (!fDebugTrees) @@ -277,7 +277,7 @@ void sbn::timing::PMTBeamSignalsExtractor::beginJob() // ----------------------------------------------------------------------------- -void sbn::timing::PMTBeamSignalsExtractor::beginRun(art::Run &run) +void icarus::timing::PMTBeamSignalsExtractor::beginRun(art::Run &run) { // pre-save the association between digitizer_label and effective fragment ID // needs to be done at the begin of each run in case mapping changed @@ -292,7 +292,7 @@ void sbn::timing::PMTBeamSignalsExtractor::beginRun(art::Run &run) // ----------------------------------------------------------------------------- -void sbn::timing::PMTBeamSignalsExtractor::produce(art::Event &e) +void icarus::timing::PMTBeamSignalsExtractor::produce(art::Event &e) { // initialize the data products @@ -365,7 +365,7 @@ void sbn::timing::PMTBeamSignalsExtractor::produce(art::Event &e) // ----------------------------------------------------------------------------- -void sbn::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event &e, art::InputTag const &label) +void icarus::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event &e, art::InputTag const &label) { std::string const &l = label.instance(); @@ -417,7 +417,7 @@ void sbn::timing::PMTBeamSignalsExtractor::extractBeamSignalTime(art::Event &e, // --------------------------------------------------------------------------- template -T sbn::timing::PMTBeamSignalsExtractor::Median(std::vector data) +T icarus::timing::PMTBeamSignalsExtractor::Median(std::vector data) { std::nth_element(data.begin(), data.begin() + data.size() / 2, data.end()); @@ -427,7 +427,7 @@ T sbn::timing::PMTBeamSignalsExtractor::Median(std::vector data) // ----------------------------------------------------------------------------- template -std::size_t sbn::timing::PMTBeamSignalsExtractor::getMinBin( +std::size_t icarus::timing::PMTBeamSignalsExtractor::getMinBin( std::vector const &vv, std::size_t startElement, std::size_t endElement) { @@ -441,7 +441,7 @@ std::size_t sbn::timing::PMTBeamSignalsExtractor::getMinBin( // ----------------------------------------------------------------------------- template -std::size_t sbn::timing::PMTBeamSignalsExtractor::getMaxBin( +std::size_t icarus::timing::PMTBeamSignalsExtractor::getMaxBin( std::vector const &vv, std::size_t startElement, std::size_t endElement) { @@ -456,7 +456,7 @@ std::size_t sbn::timing::PMTBeamSignalsExtractor::getMaxBin( // ----------------------------------------------------------------------------- template -std::size_t sbn::timing::PMTBeamSignalsExtractor::getStartSample(std::vector const &vv, T thres) +std::size_t icarus::timing::PMTBeamSignalsExtractor::getStartSample(std::vector const &vv, T thres) { // We are thinking in inverted polarity @@ -493,7 +493,7 @@ std::size_t sbn::timing::PMTBeamSignalsExtractor::getStartSample(std::vector // ----------------------------------------------------------------------------- -std::map sbn::timing::PMTBeamSignalsExtractor::extractBoardBySpecialChannel( +std::map icarus::timing::PMTBeamSignalsExtractor::extractBoardBySpecialChannel( std::vector const &setup) { @@ -512,7 +512,7 @@ std::map sbn::timing::PMTBeamSignalsExtractor::extractBoardByS // ----------------------------------------------------------------------------- -std::string sbn::timing::PMTBeamSignalsExtractor::getDigitizerLabel(int channel) const +std::string icarus::timing::PMTBeamSignalsExtractor::getDigitizerLabel(int channel) const { // get the board name, convert to digitizer_label @@ -531,7 +531,7 @@ std::string sbn::timing::PMTBeamSignalsExtractor::getDigitizerLabel(int channel) // ----------------------------------------------------------------------------- -std::string sbn::timing::PMTBeamSignalsExtractor::getCrate(int channel) const +std::string icarus::timing::PMTBeamSignalsExtractor::getCrate(int channel) const { std::string digitizer_label = getDigitizerLabel(channel); @@ -540,7 +540,7 @@ std::string sbn::timing::PMTBeamSignalsExtractor::getCrate(int channel) const // ----------------------------------------------------------------------------- -double sbn::timing::PMTBeamSignalsExtractor::getTriggerCorrection(int channel) const +double icarus::timing::PMTBeamSignalsExtractor::getTriggerCorrection(int channel) const { std::string digitizer_label = getDigitizerLabel(channel); @@ -558,7 +558,7 @@ double sbn::timing::PMTBeamSignalsExtractor::getTriggerCorrection(int channel) c // ----------------------------------------------------------------------------- -void sbn::timing::PMTBeamSignalsExtractor::associateBeamSignalsToChannels(art::InputTag const &label) +void icarus::timing::PMTBeamSignalsExtractor::associateBeamSignalsToChannels(art::InputTag const &label) { std::string const &l = label.instance(); @@ -593,4 +593,4 @@ void sbn::timing::PMTBeamSignalsExtractor::associateBeamSignalsToChannels(art::I } // for each crate } -DEFINE_ART_MODULE(sbn::timing::PMTBeamSignalsExtractor) +DEFINE_ART_MODULE(icarus::timing::PMTBeamSignalsExtractor) From 0ec30cd3d44b7abea784b55b87700d4f8d34b90d Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Mon, 2 Jun 2025 15:19:10 -0500 Subject: [PATCH 05/10] fix typo in comment for PMTBeamSignalsExtractor producer namespace --- icaruscode/Timing/PMTBeamSignalsExtractor_module.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc b/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc index 0616af686..b4400c58a 100644 --- a/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc +++ b/icaruscode/Timing/PMTBeamSignalsExtractor_module.cc @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////////////////// /** * @file icaruscode/Timing/PMTBeamSignalsExtractor_module.cc - * @brief `sbn::timing::PMTBeamSignalsExtractor` producer module. + * @brief `icarus::timing::PMTBeamSignalsExtractor` producer module. * @author Matteo Vicenzi (mvicenzi@bnl.gov) * @date Sun Feb 11 11:37:14 2024 **/ From 12f66d12828b13d39c27f53e9dad3526687f4588 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Tue, 3 Jun 2025 13:23:53 -0500 Subject: [PATCH 06/10] Revert "remove old PMTBeamSignal definition" This reverts commit ffbcc3502dcac549a23e19a367d2fb071e1b11c2. --- icaruscode/IcarusObj/PMTBeamSignal.h | 69 ++++++++++++++++++++++++++++ icaruscode/IcarusObj/classes.h | 2 +- icaruscode/IcarusObj/classes_def.xml | 6 +++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 icaruscode/IcarusObj/PMTBeamSignal.h diff --git a/icaruscode/IcarusObj/PMTBeamSignal.h b/icaruscode/IcarusObj/PMTBeamSignal.h new file mode 100644 index 000000000..842af0375 --- /dev/null +++ b/icaruscode/IcarusObj/PMTBeamSignal.h @@ -0,0 +1,69 @@ +/** + * @file icaruscode/IcarusObj/PMTBeamSignal.h + * @brief Holds the event-by-event RWM or EW times + * @author Matteo Vicenzi (mvicenzi@bnl.gov) + * @date March 14 2024 + */ + +#ifndef ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H +#define ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H + +// C/C++ standard libraries +#include +#include +#include + +namespace icarus::timing +{ + + /// Special value to denote no special channel information. + static constexpr auto NoChannel = std::numeric_limits::max(); + /// Special value to denote no time channel information. + static constexpr double NoTime = std::numeric_limits::max(); + // Special value to denote no sample information. + static constexpr std::size_t NoSample = 0; + + /** + * @brief Beam time as seen by a PMT readout board. + * + * This could either be an early warning (EW) or a resistive wall monitor (RWM) time. + * These signals are delivered via fibers and digitized in special PMT channels. + * + * Both the time in @ref DetectorClocksElectronicsTime "electronics time scale" + * and time time relative to the hardware trigger are included. + * + * The information in this object may be missing: its validity should + * always be checked in advance with `isValid()`. + */ + + struct PMTBeamSignal + { + + /// Special channel this time was extracted from. + /// These are defined in `CAEN_V1730_setup_icarus.fcl`. + unsigned int specialChannel = NoChannel; + + /// Board on which the special channel is on (e.g: WW-TOP-A). + /// Should match the same format as `icarusDB::PMTChannelInfo_t::digitizerLabel`. + std::string digitizerLabel = ""; + + /// Crate this time applies to (e.g.: WW-TOP). + /// Corresponds to the first part of `digitizerLabel`. + std::string crate = ""; + + /// Sample within the waveform where the reference signal is found. + std::size_t sample = NoSample; + + /// Start time in electronics time [us]. + double startTimeAbs = NoTime; + + /// Start time relative to trigger time [us]. + double startTime = NoTime; + + /// Returns whether the time is valid. + bool isValid() const { return (sample != NoSample); } + }; + +} // namespace icarus::timing + +#endif // ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H diff --git a/icaruscode/IcarusObj/classes.h b/icaruscode/IcarusObj/classes.h index e7f634196..05e6001ae 100644 --- a/icaruscode/IcarusObj/classes.h +++ b/icaruscode/IcarusObj/classes.h @@ -6,7 +6,7 @@ #include "icaruscode/IcarusObj/CRTTPCMatchingInfo.h" #include "icaruscode/IcarusObj/OpDetWaveformMeta.h" #include "icaruscode/IcarusObj/PMTWaveformTimeCorrection.h" - +#include "icaruscode/IcarusObj/PMTBeamSignal.h" #include "icaruscode/IcarusObj/Hit.h" //#include "icaruscode/IcarusObj/CRTPMTMatching.h" diff --git a/icaruscode/IcarusObj/classes_def.xml b/icaruscode/IcarusObj/classes_def.xml index 5c32eb98c..4abf7c8bd 100644 --- a/icaruscode/IcarusObj/classes_def.xml +++ b/icaruscode/IcarusObj/classes_def.xml @@ -41,6 +41,12 @@ + + + + + + From 2f6a05d6d2981fda95908cb0827b4e6c2d17d2bf Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Tue, 3 Jun 2025 17:04:33 -0500 Subject: [PATCH 07/10] keep PMTBeamSignal defined in icaruscode for backward compatibility --- icaruscode/IcarusObj/{ => Legacy}/PMTBeamSignal.h | 10 ++++++---- icaruscode/IcarusObj/classes.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) rename icaruscode/IcarusObj/{ => Legacy}/PMTBeamSignal.h (84%) diff --git a/icaruscode/IcarusObj/PMTBeamSignal.h b/icaruscode/IcarusObj/Legacy/PMTBeamSignal.h similarity index 84% rename from icaruscode/IcarusObj/PMTBeamSignal.h rename to icaruscode/IcarusObj/Legacy/PMTBeamSignal.h index 842af0375..314898210 100644 --- a/icaruscode/IcarusObj/PMTBeamSignal.h +++ b/icaruscode/IcarusObj/Legacy/PMTBeamSignal.h @@ -1,12 +1,14 @@ /** - * @file icaruscode/IcarusObj/PMTBeamSignal.h + * @file icaruscode/IcarusObj/Legacy/PMTBeamSignal.h * @brief Holds the event-by-event RWM or EW times * @author Matteo Vicenzi (mvicenzi@bnl.gov) * @date March 14 2024 + * @note PLEASE NOTE : This is a old/LEGACY header for the previous namespace. + @see sbnobj/Common/PMT/Data/PMTBeamSignal.hh for new/current data product. */ -#ifndef ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H -#define ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H +#ifndef ICARUSCODE_ICARUSOBJ_LEGACY_PMTBEAMSIGNAL_H +#define ICARUSCODE_ICARUSOBJ_LEGACY_PMTBEAMSIGNAL_H // C/C++ standard libraries #include @@ -66,4 +68,4 @@ namespace icarus::timing } // namespace icarus::timing -#endif // ICARUSCODE_ICARUSOBJ_PMTBEAMSIGNAL_H +#endif // ICARUSCODE_ICARUSOBJ_LEGACY_PMTBEAMSIGNAL_H diff --git a/icaruscode/IcarusObj/classes.h b/icaruscode/IcarusObj/classes.h index 05e6001ae..1f8d689cb 100644 --- a/icaruscode/IcarusObj/classes.h +++ b/icaruscode/IcarusObj/classes.h @@ -6,7 +6,7 @@ #include "icaruscode/IcarusObj/CRTTPCMatchingInfo.h" #include "icaruscode/IcarusObj/OpDetWaveformMeta.h" #include "icaruscode/IcarusObj/PMTWaveformTimeCorrection.h" -#include "icaruscode/IcarusObj/PMTBeamSignal.h" +#include "icaruscode/IcarusObj/Legacy/PMTBeamSignal.h" #include "icaruscode/IcarusObj/Hit.h" //#include "icaruscode/IcarusObj/CRTPMTMatching.h" From 4023a327c4aa5263166ba1db8e7b0b7d13179739 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Tue, 3 Jun 2025 17:08:13 -0500 Subject: [PATCH 08/10] fix typo and add information in comment --- icaruscode/IcarusObj/Legacy/PMTBeamSignal.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/icaruscode/IcarusObj/Legacy/PMTBeamSignal.h b/icaruscode/IcarusObj/Legacy/PMTBeamSignal.h index 314898210..443371cb6 100644 --- a/icaruscode/IcarusObj/Legacy/PMTBeamSignal.h +++ b/icaruscode/IcarusObj/Legacy/PMTBeamSignal.h @@ -1,9 +1,9 @@ /** * @file icaruscode/IcarusObj/Legacy/PMTBeamSignal.h * @brief Holds the event-by-event RWM or EW times - * @author Matteo Vicenzi (mvicenzi@bnl.gov) - * @date March 14 2024 - * @note PLEASE NOTE : This is a old/LEGACY header for the previous namespace. + * @author Matteo Vicenzi (mvicenzi@bnl.gov), moved to legacy by A. Heggestuen + * @date March 14 2024, moved June 3, 2025 + * @note PLEASE NOTE : This is an old/LEGACY header for the previous namespace. @see sbnobj/Common/PMT/Data/PMTBeamSignal.hh for new/current data product. */ From e695592fb5784d5f82d96473c598d1d3216e8f80 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Fri, 6 Jun 2025 14:51:06 -0500 Subject: [PATCH 09/10] add simple producer module to convert PMTBeamSignal namespace from icarus::timing to sbn::timing --- icaruscode/Timing/CMakeLists.txt | 2 + .../PMTBeamSignalNamespaceConverter_module.cc | 102 ++++++++++++++++++ .../Timing/pmtbeamsignalnsconverter.fcl | 8 ++ .../pmtbeamsignalnsconverter_icarus.fcl | 48 +++++++++ 4 files changed, 160 insertions(+) create mode 100644 icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc create mode 100644 icaruscode/Timing/pmtbeamsignalnsconverter.fcl create mode 100644 icaruscode/Timing/pmtbeamsignalnsconverter_icarus.fcl diff --git a/icaruscode/Timing/CMakeLists.txt b/icaruscode/Timing/CMakeLists.txt index 85fc1cc05..5e9d6603c 100644 --- a/icaruscode/Timing/CMakeLists.txt +++ b/icaruscode/Timing/CMakeLists.txt @@ -37,6 +37,8 @@ cet_build_plugin( PMTTimingCorrectionService art::service LIBRARIES PUBLIC ${SER cet_build_plugin( PMTBeamSignalsExtractor art::producer LIBRARIES PUBLIC ${MODULE_LIBRARIES}) +cet_build_plugin( PMTBeamSignalNamespaceConverter art::producer LIBRARIES PUBLIC ${MODULE_LIBRARIES}) + install_headers() install_fhicl() install_source() diff --git a/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc b/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc new file mode 100644 index 000000000..ba4ea79c5 --- /dev/null +++ b/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc @@ -0,0 +1,102 @@ +//////////////////////////////////////////////////////////////////////// +// Class: PMTBeamSignalNameSpaceConverter_module +// Plugin Type: producer (Unknown Unknown) +// File: PMTBeamSignalNameSpaceConverter_module.cc +// +// Generated at Thu Jun 5 14:59:32 2025 by Anna Heggestuen using cetskelgen +// from cetlib version 3.18.02. +//////////////////////////////////////////////////////////////////////// +#include "sbnobj/Common/PMT/Data/PMTBeamSignal.hh" +#include "icaruscode/IcarusObj/Legacy/PMTBeamSignal.h" + +#include "art/Framework/Core/EDProducer.h" +#include "art/Framework/Core/ModuleMacros.h" +#include "art/Framework/Principal/Event.h" +#include "art/Framework/Principal/Handle.h" +#include "art/Framework/Principal/Run.h" +#include "art/Framework/Principal/SubRun.h" +#include "canvas/Utilities/InputTag.h" +#include "fhiclcpp/ParameterSet.h" +#include "messagefacility/MessageLogger/MessageLogger.h" + +#include + +namespace sbn::timing { + class PMTBeamSignalNamespaceConverter; +} +/** + * @brief Copy PMTBeamSignal data product from icaruscode/IcarusObj namespace to sbnobj/Common + * + * This producer module simply copies what is stored in the icaruscode/IcarusObj data product + * `std::vector` to a new sbnobj/Common data product + * `std::vector`. This is to help with backward compatibility for + * files that are produced with the `icarus::timing::PMTBeamSignal` data product. Converting + * the icarus::timing namespace to sbn::timing allows us to fill this variable in the CAFs. + * + */ + +class sbn::timing::PMTBeamSignalNamespaceConverter : public art::EDProducer { +public: + explicit PMTBeamSignalNamespaceConverter(fhicl::ParameterSet const& p); + // The compiler-generated destructor is fine for non-base + // classes without bare pointers or other resource use. + + // Plugins should not be copied or assigned. + PMTBeamSignalNamespaceConverter(PMTBeamSignalNamespaceConverter const&) = delete; + PMTBeamSignalNamespaceConverter(PMTBeamSignalNamespaceConverter&&) = delete; + PMTBeamSignalNamespaceConverter& operator=(PMTBeamSignalNamespaceConverter const&) = delete; + PMTBeamSignalNamespaceConverter& operator=(PMTBeamSignalNamespaceConverter&&) = delete; + + // Required functions. + void produce(art::Event& e) override; + +private: + + /// RWM waveform instance label + art::InputTag const fRWMlabel; + + // RWM times + std::vector fRWMTimes; + using BeamSignalCollection = std::vector; +}; + + +sbn::timing::PMTBeamSignalNamespaceConverter::PMTBeamSignalNamespaceConverter(fhicl::ParameterSet const& p) + : EDProducer{p}, + fRWMlabel(p.get("RWMlabel")) +{ + // Call appropriate produces<>() functions here. + produces>("RWM"); + + // Call appropriate consumes<>() for any products to be retrieved by this module. + consumes>(fRWMlabel); +} + +void sbn::timing::PMTBeamSignalNamespaceConverter::produce(art::Event& e) +{ + //old `icarus::timing::PMTBeamSignal` data product + fRWMTimes = e.getProduct>(fRWMlabel); + + //new `sbn::timing::PMTBeamSignal` data product + auto PMTBeamSignalColl = std::make_unique>(); + + if (fRWMTimes.empty()) + mf::LogTrace("ICARUSBeamStructureAna") << "Data product std::vector for '" << fRWMlabel.label() + << "' is empty in event!"; + else{ + for (size_t i = 0; i < fRWMTimes.size(); i++){ + //std::cout << "i: " << i << ", fRWMTimes[i].specialChannel = " << fRWMTimes[i].specialChannel << "\n"; + sbn::timing::PMTBeamSignal newRWMTimes;// = fRWMTimes[i]; + newRWMTimes.specialChannel = fRWMTimes[i].specialChannel; + newRWMTimes.digitizerLabel = fRWMTimes[i].digitizerLabel; + newRWMTimes.crate = fRWMTimes[i].crate; + newRWMTimes.sample = fRWMTimes[i].sample; + newRWMTimes.startTimeAbs = fRWMTimes[i].startTimeAbs; + newRWMTimes.startTime = fRWMTimes[i].startTime; + PMTBeamSignalColl->push_back(newRWMTimes); + } + } + e.put(std::move(PMTBeamSignalColl), "RWM"); +} + +DEFINE_ART_MODULE(sbn::timing::PMTBeamSignalNamespaceConverter) diff --git a/icaruscode/Timing/pmtbeamsignalnsconverter.fcl b/icaruscode/Timing/pmtbeamsignalnsconverter.fcl new file mode 100644 index 000000000..0766d8de7 --- /dev/null +++ b/icaruscode/Timing/pmtbeamsignalnsconverter.fcl @@ -0,0 +1,8 @@ +BEGIN_PROLOG + +pmtbeamsignalnsconverter:{ + module_type: "PMTBeamSignalNamespaceConverter" + RWMlabel: "beamTiming:RWM" +} + +END_PROLOG \ No newline at end of file diff --git a/icaruscode/Timing/pmtbeamsignalnsconverter_icarus.fcl b/icaruscode/Timing/pmtbeamsignalnsconverter_icarus.fcl new file mode 100644 index 000000000..b2836df4a --- /dev/null +++ b/icaruscode/Timing/pmtbeamsignalnsconverter_icarus.fcl @@ -0,0 +1,48 @@ +#include "pmtbeamsignalnsconverter.fcl" + +process_name: PMTBeamSignalNamespaceConverter + +services: +{ + scheduler: { defaultExceptions: false } # Make all uncaught exceptions fatal. + + # Load the service that manages root files for histograms. + TFileService: { fileName: "supplemental-%ifb-%p.root" } +} + +# The 'source' section tells the script to expect an input file with art::Event records. +source: +{ + module_type: RootInput + # Number of events to analyze; "-1" means all of the events in the input + # file. You can override this value with the "-n" option on the command line. + maxEvents: -1 +} + +outputs: +{ + out1: + { + module_type: RootOutput + fileName: "%ifb_%tc_reco.root" + dataTier: "reconstructed" + saveMemoryObjectThreshold: 0 + compressionLevel: 1 + fastCloning: false + } +} + +physics: +{ + producers: + { + beamTiming: @local::pmtbeamsignalnsconverter + } + # Schedule job step(s) for execution by defining the analysis module for this job. + reco: [ beamTiming ] + stream1: [ out1 ] + trigger_paths: [reco] + # "end_paths" is a keyword and contains the modules that do not modify the art::Event; + # i.e., analyzers and output streams. + end_paths: [ stream1 ] +} \ No newline at end of file From 2e7c592d852f75ee08a53c8c14053a26a5378151 Mon Sep 17 00:00:00 2001 From: Anna Heggestuen Date: Mon, 9 Jun 2025 16:11:41 -0500 Subject: [PATCH 10/10] keep producer general to also convert the beamTime:EW product if needed --- .../PMTBeamSignalNamespaceConverter_module.cc | 67 +++++++++++-------- .../Timing/pmtbeamsignalnsconverter.fcl | 2 +- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc b/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc index ba4ea79c5..36e7566c8 100644 --- a/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc +++ b/icaruscode/Timing/PMTBeamSignalNamespaceConverter_module.cc @@ -21,7 +21,7 @@ #include -namespace sbn::timing { +namespace icarus::timing { class PMTBeamSignalNamespaceConverter; } /** @@ -32,10 +32,23 @@ namespace sbn::timing { * `std::vector`. This is to help with backward compatibility for * files that are produced with the `icarus::timing::PMTBeamSignal` data product. Converting * the icarus::timing namespace to sbn::timing allows us to fill this variable in the CAFs. + + * This module is set up to convert either the "RWM" or "EW" instance of the data product + * following what is set in the `SignalLabel` input parameter. + * + * Input parameters + * ------------------------ + * * `SignalLabel` (input tag): tag for the "RWM" or "EW" instance of the + * std::vector data product. + * + * Output products + * ------------------------- + * This module produces a `std::vector` with 360 elements + * representing the "RWM" or "EW" time for the corresponding PMT channel. * */ -class sbn::timing::PMTBeamSignalNamespaceConverter : public art::EDProducer { +class icarus::timing::PMTBeamSignalNamespaceConverter : public art::EDProducer { public: explicit PMTBeamSignalNamespaceConverter(fhicl::ParameterSet const& p); // The compiler-generated destructor is fine for non-base @@ -52,51 +65,49 @@ class sbn::timing::PMTBeamSignalNamespaceConverter : public art::EDProducer { private: - /// RWM waveform instance label - art::InputTag const fRWMlabel; + // RWM or EW waveform instance label from fcl + art::InputTag const fSignalLabel; - // RWM times - std::vector fRWMTimes; - using BeamSignalCollection = std::vector; + // Vector for input data product + std::vector fPMTBeamSignal; }; -sbn::timing::PMTBeamSignalNamespaceConverter::PMTBeamSignalNamespaceConverter(fhicl::ParameterSet const& p) +icarus::timing::PMTBeamSignalNamespaceConverter::PMTBeamSignalNamespaceConverter(fhicl::ParameterSet const& p) : EDProducer{p}, - fRWMlabel(p.get("RWMlabel")) + fSignalLabel(p.get("SignalLabel")) { // Call appropriate produces<>() functions here. - produces>("RWM"); + produces>(fSignalLabel.instance()); // Call appropriate consumes<>() for any products to be retrieved by this module. - consumes>(fRWMlabel); + consumes>(fSignalLabel); } - -void sbn::timing::PMTBeamSignalNamespaceConverter::produce(art::Event& e) + +void icarus::timing::PMTBeamSignalNamespaceConverter::produce(art::Event& e) { //old `icarus::timing::PMTBeamSignal` data product - fRWMTimes = e.getProduct>(fRWMlabel); + fPMTBeamSignal = e.getProduct>(fSignalLabel); //new `sbn::timing::PMTBeamSignal` data product auto PMTBeamSignalColl = std::make_unique>(); - if (fRWMTimes.empty()) - mf::LogTrace("ICARUSBeamStructureAna") << "Data product std::vector for '" << fRWMlabel.label() + if (fPMTBeamSignal.empty()) + mf::LogTrace("ICARUSBeamStructureAna") << "Data product std::vector for '" << fSignalLabel.label() << "' is empty in event!"; else{ - for (size_t i = 0; i < fRWMTimes.size(); i++){ - //std::cout << "i: " << i << ", fRWMTimes[i].specialChannel = " << fRWMTimes[i].specialChannel << "\n"; - sbn::timing::PMTBeamSignal newRWMTimes;// = fRWMTimes[i]; - newRWMTimes.specialChannel = fRWMTimes[i].specialChannel; - newRWMTimes.digitizerLabel = fRWMTimes[i].digitizerLabel; - newRWMTimes.crate = fRWMTimes[i].crate; - newRWMTimes.sample = fRWMTimes[i].sample; - newRWMTimes.startTimeAbs = fRWMTimes[i].startTimeAbs; - newRWMTimes.startTime = fRWMTimes[i].startTime; - PMTBeamSignalColl->push_back(newRWMTimes); + for (size_t i = 0; i < fPMTBeamSignal.size(); i++){ + sbn::timing::PMTBeamSignal newPMTBeamSignal; + newPMTBeamSignal.specialChannel = fPMTBeamSignal[i].specialChannel; + newPMTBeamSignal.digitizerLabel = fPMTBeamSignal[i].digitizerLabel; + newPMTBeamSignal.crate = fPMTBeamSignal[i].crate; + newPMTBeamSignal.sample = fPMTBeamSignal[i].sample; + newPMTBeamSignal.startTimeAbs = fPMTBeamSignal[i].startTimeAbs; + newPMTBeamSignal.startTime = fPMTBeamSignal[i].startTime; + PMTBeamSignalColl->push_back(newPMTBeamSignal); } } - e.put(std::move(PMTBeamSignalColl), "RWM"); + e.put(std::move(PMTBeamSignalColl), fSignalLabel.instance()); } -DEFINE_ART_MODULE(sbn::timing::PMTBeamSignalNamespaceConverter) +DEFINE_ART_MODULE(icarus::timing::PMTBeamSignalNamespaceConverter) diff --git a/icaruscode/Timing/pmtbeamsignalnsconverter.fcl b/icaruscode/Timing/pmtbeamsignalnsconverter.fcl index 0766d8de7..6312d92b4 100644 --- a/icaruscode/Timing/pmtbeamsignalnsconverter.fcl +++ b/icaruscode/Timing/pmtbeamsignalnsconverter.fcl @@ -2,7 +2,7 @@ BEGIN_PROLOG pmtbeamsignalnsconverter:{ module_type: "PMTBeamSignalNamespaceConverter" - RWMlabel: "beamTiming:RWM" + SignalLabel: "beamTiming:RWM" } END_PROLOG \ No newline at end of file