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 5767593d5e..4176d3d690 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" @@ -48,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 }; }; @@ -62,7 +63,6 @@ namespace mu2e { nSigmaNoise_ (config().nSigmaNoise()), caphriEDepMax_ (config().caphriEDepMax()), caphriEDepMin_ (config().caphriEDepMin()), - ADCToMeV_ (config().ADCToMeV()), diagLevel_ (config().diagLevel()) { produces("calo"); @@ -74,9 +74,11 @@ namespace mu2e { private: + ProditionsHandle calCalibHandle_; + 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_; @@ -87,7 +89,6 @@ namespace mu2e { float nSigmaNoise_; float caphriEDepMax_; float caphriEDepMin_; - float ADCToMeV_; int diagLevel_; }; @@ -101,6 +102,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 +110,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 +122,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 +145,13 @@ namespace mu2e { for (size_t i=0; i 2) std::cout<<"[CaloHitMakerFast] extracted Digi with crystalID="< +#include "Offline/CaloConditions/inc/CalCalib.hh" #include "Offline/CaloConditions/inc/CalDAQMap.hh" #include "Offline/DAQ/inc/CaloDAQUtilities.hh" #include "Offline/DataProducts/inc/CaloConst.hh" @@ -77,16 +78,16 @@ 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(); private: + mu2e::ProditionsHandle _caloCalib_h; 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, @@ -109,9 +110,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 +119,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 +188,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); @@ -221,7 +209,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); } @@ -257,7 +245,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) { @@ -310,6 +298,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 +315,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 +375,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 +392,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()];