29 #include "CLHEP/Matrix/Matrix.h"
30 #include "CLHEP/Matrix/SymMatrix.h"
35 : ebDigiCollection_(ps.getParameter<edm::
InputTag>(
"EBdigiCollection")),
36 eeDigiCollection_(ps.getParameter<edm::
InputTag>(
"EEdigiCollection")),
37 tdcRecInfoCollection_(ps.getParameter<edm::
InputTag>(
"tdcRecInfoCollection")),
38 ebHitCollection_(ps.getParameter<std::
string>(
"EBhitCollection")),
39 eeHitCollection_(ps.getParameter<std::
string>(
"EEhitCollection")),
49 nbTimeBin_(ps.getParameter<int>(
"nbTimeBin")),
50 use2004OffsetConvention_(ps.getUntrackedParameter<bool>(
"use2004OffsetConvention",
false)) {
64 if (!pEBDigis.isValid()) {
67 EBdigis = pEBDigis.product();
69 LogDebug(
"EcalUncalibRecHitInfo") <<
"total # EBdigis: " << EBdigis->size();
78 if (!pEEDigis.isValid()) {
81 EEdigis = pEEDigis.product();
83 LogDebug(
"EcalUncalibRecHitInfo") <<
"total # EEdigis: " << EEdigis->size();
88 if (!EBdigis && !EEdigis)
94 if (pRecTDC.isValid()) {
95 recTDC = pRecTDC.product();
108 LogDebug(
"EcalUncalibRecHitDebug") <<
"Fetching EcalTBWeights from DB ";
113 LogDebug(
"EcalUncalibRecHitDebug") <<
"EcalTBWeightMap.size(): " << std::setprecision(3) << wgts.getMap().size();
118 LogDebug(
"EcalUncalibRecHitDebug") <<
"fetching pedestals....";
122 LogDebug(
"EcalUncalibRecHitDebug") <<
"done.";
126 auto EBuncalibRechits = std::make_unique<EBUncalibratedRecHitCollection>();
127 auto EEuncalibRechits = std::make_unique<EEUncalibratedRecHitCollection>();
135 EcalTBWeights::EcalTBWeightMap::const_iterator wit;
141 if (recTDC->offset() == -999.) {
142 edm::LogError(
"EcalUncalibRecHitError") <<
"TDC bin completely out of range. Returning";
147 for (
unsigned int idig = 0; idig < EBdigis->size(); ++idig) {
152 LogDebug(
"EcalUncalibRecHitDebug") <<
"looking up pedestal for crystal: " <<
EBDetId(itdg.
id());
154 pedIter = pedMap.find(itdg.
id().
rawId());
155 if (pedIter == pedMap.end()) {
157 <<
"error!! could not find pedestals for channel: " <<
EBDetId(itdg.
id())
158 <<
"\n no uncalib rechit will be made for this digi!";
164 pedVec[0] = aped.mean_x12;
165 pedVec[1] = aped.mean_x6;
166 pedVec[2] = aped.mean_x1;
167 pedRMSVec[0] = aped.rms_x12;
168 pedRMSVec[1] = aped.rms_x6;
169 pedRMSVec[2] = aped.rms_x1;
173 LogDebug(
"EcalUncalibRecHitDebug") <<
"looking up gainRatios for crystal: " <<
EBDetId(itdg.
id());
175 gainIter = gainMap.find(itdg.
id().
rawId());
176 if (gainIter == gainMap.end()) {
178 <<
"error!! could not find gain ratios for channel: " <<
EBDetId(itdg.
id())
179 <<
"\n no uncalib rechit will be made for this digi!";
183 double gainRatios[3];
189 git = grpMap.find(itdg.
id().
rawId());
190 if (git == grpMap.end()) {
192 <<
"No group id found for this crystal. something wrong with EcalWeightXtalGroups in your DB?"
193 <<
"\n no uncalib rechit will be made for digi with id: " <<
EBDetId(itdg.
id());
199 double sampleGainRef = 1;
200 int sampleSwitch = 999;
203 if (gainSample != sampleGainRef) {
204 sampleGainRef = gainSample;
212 if (recTDC->offset() <= 0.)
214 else if (recTDC->offset() >= 1.)
217 tdcBin = int(recTDC->offset() * float(
nbTimeBin_)) + 1;
221 <<
"TDC bin out of range " << tdcBin <<
" offset " << recTDC->offset();
238 wit = wgts.getMap().find(std::make_pair(gid, tdcid));
239 if (wit == wgts.getMap().end()) {
241 <<
"No weights found for EcalGroupId: " << gid.
id() <<
" and EcalTDCId: " << tdcid
242 <<
"\n skipping digi with id: " <<
EBDetId(itdg.
id());
250 LogDebug(
"EcalUncalibRecHitDebug") <<
"accessing matrices of weights...";
270 EBuncalibRechits->push_back(aHit);
273 LogDebug(
"EcalUncalibRecHitDebug") <<
"processed EBDataFrame with id: " <<
EBDetId(itdg.
id()) <<
"\n"
274 <<
"uncalib rechit amplitude: " << aHit.
amplitude();
283 for (
unsigned int idig = 0; idig < EEdigis->size(); ++idig) {
288 LogDebug(
"EcalUncalibRecHitDebug") <<
"looking up pedestal for crystal: " <<
EEDetId(itdg.
id());
290 pedIter = pedMap.find(itdg.
id().
rawId());
291 if (pedIter == pedMap.end()) {
293 <<
"error!! could not find pedestals for channel: " <<
EEDetId(itdg.
id())
294 <<
"\n no uncalib rechit will be made for this digi!";
300 pedVec[0] = aped.mean_x12;
301 pedVec[1] = aped.mean_x6;
302 pedVec[2] = aped.mean_x1;
303 pedRMSVec[0] = aped.rms_x12;
304 pedRMSVec[1] = aped.rms_x6;
305 pedRMSVec[2] = aped.rms_x1;
309 LogDebug(
"EcalUncalibRecHitDebug") <<
"looking up gainRatios for crystal: " <<
EEDetId(itdg.
id());
311 gainIter = gainMap.find(itdg.
id().
rawId());
312 if (gainIter == gainMap.end()) {
314 <<
"error!! could not find gain ratios for channel: " <<
EEDetId(itdg.
id())
315 <<
"\n no uncalib rechit will be made for this digi!";
319 double gainRatios[3];
325 git = grpMap.find(itdg.
id().
rawId());
326 if (git == grpMap.end()) {
328 <<
"No group id found for this crystal. something wrong with EcalWeightXtalGroups in your DB?"
329 <<
"\n no uncalib rechit will be made for digi with id: " <<
EEDetId(itdg.
id());
335 double sampleGainRef = 1;
336 int sampleSwitch = 999;
339 if (gainSample != sampleGainRef) {
340 sampleGainRef = gainSample;
348 if (recTDC->offset() <= 0.)
350 else if (recTDC->offset() >= 1.)
353 tdcBin = int(recTDC->offset() * float(
nbTimeBin_)) + 1;
357 <<
"TDC bin out of range " << tdcBin <<
" offset " << recTDC->offset();
374 wit = wgts.getMap().find(std::make_pair(gid, tdcid));
375 if (wit == wgts.getMap().end()) {
377 <<
"No weights found for EcalGroupId: " << gid.
id() <<
" and EcalTDCId: " << tdcid
378 <<
"\n skipping digi with id: " <<
EEDetId(itdg.
id());
386 LogDebug(
"EcalUncalibRecHitDebug") <<
"accessing matrices of weights...";
406 EEuncalibRechits->push_back(aHit);
409 LogDebug(
"EcalUncalibRecHitDebug") <<
"processed EEDataFrame with id: " <<
EEDetId(itdg.
id()) <<
"\n"
410 <<
"uncalib rechit amplitude: " << aHit.
amplitude();
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
const std::string ebHitCollection_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
const self & getMap() const
constexpr uint32_t rawId() const
get the raw id
EcalMGPASample sample(int i) const
const edm::ESGetToken< EcalTBWeights, EcalTBWeightsRcd > tbWeightsToken_
math::Matrix< 3, 10 >::type EcalWeightMatrix
Log< level::Error, false > LogError
int gainId() const
get the gainId (2 bits)
const edm::EDGetTokenT< EcalTBTDCRecInfo > tbTDCRecInfoToken_
const edm::EDGetTokenT< EEDigiCollection > eeDigiToken_
bool getData(T &iHolder) const
EcalUncalibRecHitRecWeightsAlgo< EBDataFrame > ebAlgo_
const bool use2004OffsetConvention_
const edm::ESGetToken< EcalPedestals, EcalPedestalsRcd > pedestalsToken_
const std::string eeHitCollection_
const EBShape testbeamEBShape
const edm::ESGetToken< EcalGainRatios, EcalGainRatiosRcd > gainRatiosToken_
EcalPedestalsMap::const_iterator EcalPedestalsMapIterator
EcalTBWeightUncalibRecHitProducer(const edm::ParameterSet &ps)
virtual EcalUncalibratedRecHit makeRecHit(const C &dataFrame, const double *pedestals, const double *pedestalsRMS, const double *gainRatios, const EcalWeightSet::EcalWeightMatrix **weights, const EcalShapeBase &testbeamPulseShape)
Compute parameters.
const edm::EDGetTokenT< EBDigiCollection > ebDigiToken_
EcalWeightMatrix & getWeightsAfterGainSwitch()
EcalUncalibRecHitRecWeightsAlgo< EEDataFrame > eeAlgo_
EcalWeightMatrix & getWeightsBeforeGainSwitch()
std::vector< Item >::const_iterator const_iterator
float gain12Over6() const
const EEShape testbeamEEShape
void produce(edm::Event &evt, const edm::EventSetup &es) override
const edm::InputTag eeDigiCollection_
~EcalTBWeightUncalibRecHitProducer() override
const edm::InputTag ebDigiCollection_
const edm::ESGetToken< EcalWeightXtalGroups, EcalWeightXtalGroupsRcd > weightXtalGroupsToken_