From bc5f1ccff36b58312e243616a4b88d585855d68d Mon Sep 17 00:00:00 2001 From: Paolo Girotti Date: Thu, 8 Oct 2026 11:39:04 -0500 Subject: [PATCH 1/8] Add time calibration to reco digis --- CaloReco/src/CaloRecoDigiMaker_module.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CaloReco/src/CaloRecoDigiMaker_module.cc b/CaloReco/src/CaloRecoDigiMaker_module.cc index 0f873482e2..664c59282d 100644 --- a/CaloReco/src/CaloRecoDigiMaker_module.cc +++ b/CaloReco/src/CaloRecoDigiMaker_module.cc @@ -142,6 +142,7 @@ void CaloRecoDigiMaker::extractRecoDigi(const art::ValidHandle& waveform = caloDigi.waveform(); @@ -164,7 +165,7 @@ void CaloRecoDigiMaker::extractRecoDigi(const art::ValidHandlenPeaks(); ++i) { double eDep = waveformProcessor_->amplitude(i) * adc2MeV; double eDepErr = waveformProcessor_->amplitudeErr(i) * adc2MeV; - double time = waveformProcessor_->time(i) - pbtOffset; // correct to time since protons + double time = waveformProcessor_->time(i) - pbtOffset - timeOffset; double timeErr = waveformProcessor_->timeErr(i); bool isPileUp = waveformProcessor_->isPileUp(i); double chi2 = waveformProcessor_->chi2(); From 0728f73cd46aea28a7f70f1e89cc1e68b1b9d567 Mon Sep 17 00:00:00 2001 From: Paolo Girotti Date: Tue, 13 Oct 2026 11:15:17 -0500 Subject: [PATCH 2/8] HitsFromDTCEvents now uses prodition, and applies both energy and time calibs --- DAQ/src/CaloHitsFromDTCEvents_module.cc | 29 ++++++++++--------------- 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/DAQ/src/CaloHitsFromDTCEvents_module.cc b/DAQ/src/CaloHitsFromDTCEvents_module.cc index c3d9a7c6e1..0f57b735b4 100644 --- a/DAQ/src/CaloHitsFromDTCEvents_module.cc +++ b/DAQ/src/CaloHitsFromDTCEvents_module.cc @@ -15,6 +15,7 @@ #include "artdaq-core-mu2e/Overlays/FragmentType.hh" #include +#include "Offline/CaloConditions/inc/CalCalib.hh" #include "Offline/CaloConditions/inc/CalDAQMap.hh" #include "Offline/DAQ/inc/CaloDAQUtilities.hh" #include "Offline/DataProducts/inc/CaloConst.hh" @@ -84,6 +85,7 @@ class art::CaloHitsFromDataDTCEvents : public EDProducer { virtual void endJob(); private: + mu2e::ProditionsHandle _caloCalib_h; mu2e::ProditionsHandle _calodaqconds_h; void analyze_calorimeter_(mu2e::CalDAQMap const& calodaqconds, @@ -109,9 +111,6 @@ class art::CaloHitsFromDataDTCEvents : public EDProducer { pulseMap_; // Temporary hack until the Calorimeter channel map is finalized mu2e::CaloDAQUtilities caloDAQUtil_; - std::array peakADC2MeV_; - std::array timeCalib_; - long int total_events; long int total_hits; long int total_hits_good; @@ -121,17 +120,6 @@ class art::CaloHitsFromDataDTCEvents : public EDProducer { // ====================================================================== -void art::CaloHitsFromDataDTCEvents::beginRun(art::Run& Run) { - - // FIX ME! - // here we need to load the prodition-service with the calibrations - // for converting teh peakADC into MeV and sync times - for (size_t i = 0; i < peakADC2MeV_.size(); ++i) { - peakADC2MeV_[i] = 0.0461333; - timeCalib_[i] = 0.; - } -} - void art::CaloHitsFromDataDTCEvents::addPulse( uint16_t& crystalID, float& time, float& eDep, std::unique_ptr const& hits_calo, @@ -201,6 +189,7 @@ void art::CaloHitsFromDataDTCEvents::produce(Event& event) { art::EventNumber_t eventNumber = event.event(); mu2e::CalDAQMap const& calodaqconds = _calodaqconds_h.get(event.id()); + mu2e::CalCalib const& calCalib = _caloCalib_h.get(event.id()); // Collection of CaloHits for the event std::unique_ptr calo_hits(new mu2e::CaloHitCollection); @@ -310,6 +299,8 @@ void art::CaloHitsFromDataDTCEvents::analyze_calorimeter_( mu2e::CaloRawSiPMId rawId(thisHitPacket.BoardID, thisHitPacket.ChannelID); mu2e::CaloSiPMId offlineId = calodaqconds.offlineId(rawId); uint16_t SiPMID = offlineId.id(); + double adc2MeV = calCalib.ADC2MeV(SiPMID); + double timeOffset = calCalib.timeoffset(SiPMID); //Check that the channel is valid in the offline world if (SiPMID >= mu2e::CaloConst::_nChannel){ @@ -325,8 +316,8 @@ void art::CaloHitsFromDataDTCEvents::analyze_calorimeter_( uint16_t crystalID = offlineId.crystal().id(); size_t peakIndex = thisHitPacket.IndexOfMaxDigitizerSample; - float eDep = thisHitPeak * peakADC2MeV_[SiPMID]; - float time = (thisHitPacket.Time + peakIndex) * mu2e::CaloConst::_digitizationPeriod + timeCalib_[SiPMID]; // packet Time is in clock ticks + float eDep = thisHitPeak * adc2MeV; + float time = (thisHitPacket.Time + peakIndex) * mu2e::CaloConst::_digitizationPeriod - timeOffset; // packet Time is in clock ticks bool isCaphri = offlineId.crystal().isCaphri(); if(!isCaphri) ++nhits[offlineId.crystal().disk()]; @@ -385,6 +376,8 @@ void art::CaloHitsFromDataDTCEvents::analyze_calorimeter_( mu2e::CaloRawSiPMId rawId(thisHitPacket.BoardID, thisHitPacket.ChannelID); mu2e::CaloSiPMId offlineId = calodaqconds.offlineId(rawId); uint16_t SiPMID = offlineId.id(); + double adc2MeV = calCalib.ADC2MeV(SiPMID); + double timeOffset = calCalib.timeoffset(SiPMID); //Check that the channel is valid in the offline world if (SiPMID >= mu2e::CaloConst::_nChannel){ @@ -400,8 +393,8 @@ void art::CaloHitsFromDataDTCEvents::analyze_calorimeter_( uint16_t crystalID = offlineId.crystal().id(); size_t peakIndex = thisHitPacket.IndexOfMaxDigitizerSample; - float eDep = thisHitPeak * peakADC2MeV_[SiPMID]; - float time = (thisHitPacket.Time + peakIndex) * mu2e::CaloConst::_digitizationPeriod + timeCalib_[SiPMID]; // packet Time is in clock ticks + float eDep = thisHitPeak * adc2MeV; + float time = (thisHitPacket.Time + peakIndex) * mu2e::CaloConst::_digitizationPeriod - timeOffset; // packet Time is in clock ticks bool isCaphri = offlineId.crystal().isCaphri(); if(!isCaphri) ++nhits[offlineId.crystal().disk()]; From 0f1d93113a19061f8c7a252662bd851f14786d09 Mon Sep 17 00:00:00 2001 From: Paolo Girotti Date: Tue, 13 Oct 2026 11:30:29 -0500 Subject: [PATCH 3/8] CaloHitMakerFast now uses prodition, and applies both energy and time calibs --- CaloReco/src/CaloHitMakerFast_module.cc | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/CaloReco/src/CaloHitMakerFast_module.cc b/CaloReco/src/CaloHitMakerFast_module.cc index 5767593d5e..05d6603ff9 100644 --- a/CaloReco/src/CaloHitMakerFast_module.cc +++ b/CaloReco/src/CaloHitMakerFast_module.cc @@ -4,8 +4,10 @@ #include "art/Framework/Principal/Handle.h" #include "fhiclcpp/types/Sequence.h" +#include "Offline/CaloConditions/inc/CalCalib.hh" #include "Offline/DataProducts/inc/CaloConst.hh" #include "Offline/DataProducts/inc/CaloSiPMId.hh" +#include "Offline/ProditionsService/inc/ProditionsHandle.hh" #include "Offline/RecoDataProducts/inc/CaloDigi.hh" #include "Offline/RecoDataProducts/inc/CaloHit.hh" #include "Offline/RecoDataProducts/inc/ProtonBunchTime.hh" @@ -74,6 +76,8 @@ namespace mu2e { private: + ProditionsHandle calCalibHandle_; + using pulseMapType = std::map>; void extractHits(const CaloDigiCollection& caloDigis, CaloHitCollection& caloHitsColl, CaloHitCollection& caphriHitsColl, IntensityInfoCalo& intCalo, double pbtOffset); @@ -101,6 +105,7 @@ namespace mu2e { auto pbtH = event.getValidHandle(pbttoken_); const ProtonBunchTime& pbt(*pbtH); double pbtOffset = pbt.pbtime_; + CalCalib const& calCalib = calCalibHandle_.get(event.id()); const auto& caloDigisHandle = event.getValidHandle(caloDigisToken_); const auto& caloDigis(*caloDigisHandle); @@ -108,7 +113,7 @@ namespace mu2e { auto caloHitsColl = std::make_unique(); auto caphriHitsColl = std::make_unique(); auto intInfo = std::make_unique(); - extractHits(caloDigis,*caloHitsColl,*caphriHitsColl,*intInfo,pbtOffset); + extractHits(caloDigis,*caloHitsColl,*caphriHitsColl,*intInfo,pbtOffset,calCalib); event.put(std::move(caloHitsColl), "calo"); event.put(std::move(caphriHitsColl),"caphri"); @@ -120,7 +125,7 @@ namespace mu2e { //-------------------------------------------------------------------------------------------------------------- - void CaloHitMakerFast::extractHits(const CaloDigiCollection& caloDigis, CaloHitCollection& caloHitsColl, CaloHitCollection& caphriHitsColl, IntensityInfoCalo& intInfo, double pbtOffset) + void CaloHitMakerFast::extractHits(const CaloDigiCollection& caloDigis, CaloHitCollection& caloHitsColl, CaloHitCollection& caphriHitsColl, IntensityInfoCalo& intInfo, double pbtOffset, CalCalib const& calCalib) { std::vector digis(caloDigis.size()); std::iota(digis.begin(),digis.end(),0); @@ -143,9 +148,13 @@ namespace mu2e { for (size_t i=0; i 2) std::cout<<"[CaloHitMakerFast] extracted Digi with crystalID="< Date: Tue, 13 Oct 2026 11:32:36 -0500 Subject: [PATCH 5/8] bugfix --- CaloReco/src/CaloHitMakerFast_module.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CaloReco/src/CaloHitMakerFast_module.cc b/CaloReco/src/CaloHitMakerFast_module.cc index edc71ce54c..0397d066df 100644 --- a/CaloReco/src/CaloHitMakerFast_module.cc +++ b/CaloReco/src/CaloHitMakerFast_module.cc @@ -79,7 +79,7 @@ namespace mu2e { using pulseMapType = std::map>; - void extractHits(const CaloDigiCollection& caloDigis, CaloHitCollection& caloHitsColl, CaloHitCollection& caphriHitsColl, IntensityInfoCalo& intCalo, double pbtOffset); + void extractHits(const CaloDigiCollection& caloDigis, CaloHitCollection& caloHitsColl, CaloHitCollection& caphriHitsColl, IntensityInfoCalo& intCalo, double pbtOffset, CalCalib const& calCalib); void addPulse(pulseMapType& pulseMap, unsigned crystalID, float time, float eDep); art::ProductToken caloDigisToken_; From e4d763ed02a2d058d15636bc00e7fa42f39fb1a2 Mon Sep 17 00:00:00 2001 From: Paolo Girotti Date: Tue, 13 Oct 2026 11:35:26 -0500 Subject: [PATCH 6/8] Forgot to forward calCalib inside function --- DAQ/src/CaloHitsFromDTCEvents_module.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DAQ/src/CaloHitsFromDTCEvents_module.cc b/DAQ/src/CaloHitsFromDTCEvents_module.cc index 0f57b735b4..8f7e809940 100644 --- a/DAQ/src/CaloHitsFromDTCEvents_module.cc +++ b/DAQ/src/CaloHitsFromDTCEvents_module.cc @@ -89,6 +89,7 @@ class art::CaloHitsFromDataDTCEvents : public EDProducer { mu2e::ProditionsHandle _calodaqconds_h; void analyze_calorimeter_(mu2e::CalDAQMap const& calodaqconds, + mu2e::CalCalib const& calCalib, const mu2e::CalorimeterDataDecoder& cc, std::unique_ptr const& calo_hits, std::unique_ptr const& caphri_hits, @@ -210,7 +211,7 @@ void art::CaloHitsFromDataDTCEvents::produce(Event& event) { for (auto& subevent : caloSEvents) { decoderColl->emplace_back(subevent); auto& decoder = decoderColl->back(); - analyze_calorimeter_(calodaqconds, decoder, calo_hits, caphri_hits, int_info); + analyze_calorimeter_(calodaqconds, calCalib, decoder, calo_hits, caphri_hits, int_info); for (size_t i = 0; i < decoder.block_count(); ++i) { totalSize += decoder.blockSizeBytes(i); } @@ -246,7 +247,7 @@ void art::CaloHitsFromDataDTCEvents::produce(Event& event) { } // produce() void art::CaloHitsFromDataDTCEvents::analyze_calorimeter_( - mu2e::CalDAQMap const& calodaqconds, const mu2e::CalorimeterDataDecoder& cc, + mu2e::CalDAQMap const& calodaqconds, mu2e::CalCalib const& calCalib, const mu2e::CalorimeterDataDecoder& cc, std::unique_ptr const& calo_hits, std::unique_ptr const& caphri_hits, std::unique_ptr const& int_info) { From 5c0bc8e61885f363190c07f6c6ac4922e0ceba79 Mon Sep 17 00:00:00 2001 From: Paolo Girotti Date: Tue, 13 Oct 2026 11:43:32 -0500 Subject: [PATCH 7/8] removed unused beginRun --- DAQ/src/CaloHitsFromDTCEvents_module.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/DAQ/src/CaloHitsFromDTCEvents_module.cc b/DAQ/src/CaloHitsFromDTCEvents_module.cc index 8f7e809940..59a67fa81c 100644 --- a/DAQ/src/CaloHitsFromDTCEvents_module.cc +++ b/DAQ/src/CaloHitsFromDTCEvents_module.cc @@ -78,8 +78,6 @@ class art::CaloHitsFromDataDTCEvents : public EDProducer { explicit CaloHitsFromDataDTCEvents(const art::EDProducer::Table& config); virtual ~CaloHitsFromDataDTCEvents() {} - virtual void beginRun(art::Run&) override; - // --- Production: virtual void produce(Event&); virtual void endJob(); From 80044dc8f71852f8b924f84587030134f079b679 Mon Sep 17 00:00:00 2001 From: Paolo Girotti Date: Tue, 13 Oct 2026 11:46:37 -0500 Subject: [PATCH 8/8] Removed adc2mev fcl parameter --- CaloReco/fcl/prolog.fcl | 1 - CaloReco/src/CaloHitMakerFast_module.cc | 1 - 2 files changed, 2 deletions(-) diff --git a/CaloReco/fcl/prolog.fcl b/CaloReco/fcl/prolog.fcl index e5eb694347..98e1126c91 100644 --- a/CaloReco/fcl/prolog.fcl +++ b/CaloReco/fcl/prolog.fcl @@ -67,7 +67,6 @@ CaloReco : { nPEperMeV : 30 nSigmaNoise : 4 noiseLevelMeV : 5.5e-1 - ADCToMeV : @local::ADCToMeV diagLevel : 0 } } diff --git a/CaloReco/src/CaloHitMakerFast_module.cc b/CaloReco/src/CaloHitMakerFast_module.cc index 0397d066df..4176d3d690 100644 --- a/CaloReco/src/CaloHitMakerFast_module.cc +++ b/CaloReco/src/CaloHitMakerFast_module.cc @@ -50,7 +50,6 @@ namespace mu2e { fhicl::Atom nSigmaNoise { Name("nSigmaNoise"), Comment("Maxnumber of sigma Noise to combine digi") }; fhicl::Atom caphriEDepMax { Name("caphriEDepMax"), Comment("Maximum CAPHRI hit energy in MeV")}; fhicl::Atom caphriEDepMin { Name("caphriEDepMin"), Comment("Minimum CAPHRI hit energy in MeV")}; - fhicl::Atom ADCToMeV { Name("ADCToMeV"), Comment("ADC to MeV conversion factor") }; fhicl::Atom diagLevel { Name("diagLevel"), Comment("Diag Level"),0 }; };