CMS 3D CMS Logo

List of all members | Public Member Functions | Private Attributes
EGRegressionModifierV2 Class Reference
Inheritance diagram for EGRegressionModifierV2:
ModifyObjectValueBase

Public Member Functions

 EGRegressionModifierV2 (const edm::ParameterSet &conf, edm::ConsumesCollector &cc)
 
void modifyObject (reco::GsfElectron &) const final
 
void modifyObject (reco::Photon &) const final
 
void modifyObject (pat::Electron &ele) const final
 
void modifyObject (pat::Photon &pho) const final
 
void setEvent (const edm::Event &) final
 
void setEventContent (const edm::EventSetup &) final
 
- Public Member Functions inherited from ModifyObjectValueBase
virtual void modifyObject (reco::Muon &) const
 
virtual void modifyObject (reco::BaseTau &) const
 
virtual void modifyObject (reco::Jet &) const
 
virtual void modifyObject (pat::Muon &) const
 
virtual void modifyObject (pat::Tau &) const
 
virtual void modifyObject (pat::Jet &) const
 
 ModifyObjectValueBase (const edm::ParameterSet &conf)
 
const std::string & name () const
 
virtual ~ModifyObjectValueBase ()
 

Private Attributes

CaloGeometry const * caloGeometry_ = nullptr
 
const edm::ESGetToken< CaloGeometry, CaloGeometryRecordcaloGeometryToken_
 
EGRegressionModifierCondTokens eleCondTokens_
 
std::vector< const GBRForestD * > eleForestsMean_
 
std::vector< const GBRForestD * > eleForestsSigma_
 
const double eOverPEcalTrkThr_
 
const double epDiffSigEcalTrackThr_
 
const double epSigEcalTrackThr_
 
const bool forceHighEnergyEcalTrainingIfSaturated_
 
const double highEnergyEcalTrackThr_
 
const double lowEnergyEcalOnlyThr_
 
const double lowEnergyEcalTrackThr_
 
EGRegressionModifierCondTokens phoCondTokens_
 
std::vector< const GBRForestD * > phoForestsMean_
 
std::vector< const GBRForestD * > phoForestsSigma_
 
const edm::EDGetTokenT< double > rhoToken_
 
float rhoValue_
 

Detailed Description

Definition at line 16 of file EGRegressionModifierV2.cc.

Constructor & Destructor Documentation

◆ EGRegressionModifierV2()

EGRegressionModifierV2::EGRegressionModifierV2 ( const edm::ParameterSet conf,
edm::ConsumesCollector cc 
)

Definition at line 55 of file EGRegressionModifierV2.cc.

References gpuPixelDoublets::cc, and edm::ParameterSet::getParameterSet().

56  : ModifyObjectValueBase(conf),
57  eleCondTokens_{conf.getParameterSet("electron_config"), "regressionKey", "uncertaintyKey", cc},
58  phoCondTokens_{conf.getParameterSet("photon_config"), "regressionKey", "uncertaintyKey", cc},
59 
60  rhoToken_(cc.consumes(conf.getParameter<edm::InputTag>("rhoCollection"))),
61  caloGeometryToken_(cc.esConsumes()),
62  lowEnergyEcalOnlyThr_(conf.getParameter<double>("lowEnergy_ECALonlyThr")),
63  lowEnergyEcalTrackThr_(conf.getParameter<double>("lowEnergy_ECALTRKThr")),
64  highEnergyEcalTrackThr_(conf.getParameter<double>("highEnergy_ECALTRKThr")),
65  eOverPEcalTrkThr_(conf.getParameter<double>("eOverP_ECALTRKThr")),
66  epDiffSigEcalTrackThr_(conf.getParameter<double>("epDiffSig_ECALTRKThr")),
67  epSigEcalTrackThr_(conf.getParameter<double>("epSig_ECALTRKThr")),
68  forceHighEnergyEcalTrainingIfSaturated_(conf.getParameter<bool>("forceHighEnergyEcalTrainingIfSaturated")) {
69  unsigned int encor = eleCondTokens_.mean.size();
70  eleForestsMean_.reserve(2 * encor);
71  eleForestsSigma_.reserve(2 * encor);
72 
73  unsigned int ncor = phoCondTokens_.mean.size();
74  phoForestsMean_.reserve(ncor);
75  phoForestsSigma_.reserve(ncor);
76 }
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
std::vector< edm::ESGetToken< GBRForestD, GBRDWrapperRcd > > mean
uint32_t cc[maxCellsPerHit]
Definition: gpuFishbone.h:49
ParameterSet const & getParameterSet(std::string const &) const
EGRegressionModifierCondTokens eleCondTokens_
std::vector< const GBRForestD * > phoForestsSigma_
const edm::EDGetTokenT< double > rhoToken_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryToken_
std::vector< const GBRForestD * > phoForestsMean_
ModifyObjectValueBase(const edm::ParameterSet &conf)
const bool forceHighEnergyEcalTrainingIfSaturated_
EGRegressionModifierCondTokens phoCondTokens_
std::vector< const GBRForestD * > eleForestsMean_
std::vector< const GBRForestD * > eleForestsSigma_

Member Function Documentation

◆ modifyObject() [1/4]

void EGRegressionModifierV2::modifyObject ( reco::GsfElectron ele) const
finalvirtual

Reimplemented from ModifyObjectValueBase.

Definition at line 90 of file EGRegressionModifierV2.cc.

References funct::abs(), caloGeometry_, ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), reco::GsfElectron::correctMomentum(), reco::deltaPhi(), reco::GsfElectron::ShowerShape::e5x5, reco::GsfElectron::ecalDrivenSeed(), eleForestsMean_, eleForestsSigma_, EgHLTOffHistBins_cfi::eOverP, eOverPEcalTrkThr_, epDiffSigEcalTrackThr_, epSigEcalTrackThr_, electrons_cff::fbrem, reco::GsfElectron::fbrem(), forceHighEnergyEcalTrainingIfSaturated_, reco::GsfElectron::full5x5_showerShape(), reco::GsfElectron::gsfTrack(), reco::GsfElectron::hcalOverEcalBc(), hcalRecHitTable_cff::ieta, hcalRecHitTable_cff::iphi, edm::Ref< C, T, F >::isAvailable(), electrons_cff::isEB, reco::GsfElectron::isEB(), EcalTools::isHGCalDet(), CastorSimpleRecAlgoImpl::isSaturated(), ALPAKA_ACCELERATOR_NAMESPACE::ecal::reconstruction::internal::endcap::ix(), ALPAKA_ACCELERATOR_NAMESPACE::ecal::reconstruction::internal::endcap::iy(), egammaTools::localEcalClusterCoordsEB(), egammaTools::localEcalClusterCoordsEE(), lowEnergyEcalOnlyThr_, lowEnergyEcalTrackThr_, SiStripPI::max, SiStripPI::mean, reco::GsfElectron::nSaturatedXtals(), electrons_cff::numberOfClusters, reco::GsfElectron::p4(), electrons_cff::rawEnergy, jetsAK4_CHS_cff::rawPt, rhoValue_, fileCollector::seed, reco::GsfElectron::setCorrectedEcalEnergy(), reco::GsfElectron::setCorrectedEcalEnergyError(), mathSSE::sqrt(), reco::GsfElectron::superCluster(), reco::GsfElectron::ClassificationVariables::trackFbrem, reco::GsfElectron::trackMomentumError(), run3scouting_cff::trkEta, and run3scouting_cff::trkPhi.

90  {
91  // regression calculation needs no additional valuemaps
92 
93  const reco::SuperClusterRef& superClus = ele.superCluster();
94  const edm::Ptr<reco::CaloCluster>& seed = superClus->seed();
95 
96  // skip HGCAL for now
97  if (EcalTools::isHGCalDet(seed->seed().det()))
98  return;
99 
100  const int numberOfClusters = superClus->clusters().size();
101  const bool missing_clusters = !superClus->clusters()[numberOfClusters - 1].isAvailable();
102  if (missing_clusters)
103  return; // do not apply corrections in case of missing info (slimmed MiniAOD electrons)
104 
105  //check if fbrem is filled as its needed for E/p combination so abort if its set to the default value
106  //this will be the case for <5 (or current cuts) for miniAOD electrons
108  return;
109 
110  const bool isEB = ele.isEB();
111 
112  std::array<float, 32> eval;
113  const double rawEnergy = superClus->rawEnergy();
114  const double raw_es_energy = superClus->preshowerEnergy();
115  const auto& full5x5_ess = ele.full5x5_showerShape();
116 
117  float e5x5Inverse = full5x5_ess.e5x5 != 0. ? vdt::fast_inv(full5x5_ess.e5x5) : 0.;
118 
119  eval[0] = rawEnergy;
120  eval[1] = superClus->etaWidth();
121  eval[2] = superClus->phiWidth();
122  eval[3] = superClus->seed()->energy() / rawEnergy;
123  eval[4] = full5x5_ess.e5x5 / rawEnergy;
124  eval[5] = ele.hcalOverEcalBc();
125  eval[6] = rhoValue_;
126  eval[7] = seed->eta() - superClus->position().Eta();
127  eval[8] = reco::deltaPhi(seed->phi(), superClus->position().Phi());
128  eval[9] = full5x5_ess.r9;
129  eval[10] = full5x5_ess.sigmaIetaIeta;
130  eval[11] = full5x5_ess.sigmaIetaIphi;
131  eval[12] = full5x5_ess.sigmaIphiIphi;
132  eval[13] = full5x5_ess.eMax * e5x5Inverse;
133  eval[14] = full5x5_ess.e2nd * e5x5Inverse;
134  eval[15] = full5x5_ess.eTop * e5x5Inverse;
135  eval[16] = full5x5_ess.eBottom * e5x5Inverse;
136  eval[17] = full5x5_ess.eLeft * e5x5Inverse;
137  eval[18] = full5x5_ess.eRight * e5x5Inverse;
138  eval[19] = full5x5_ess.e2x5Max * e5x5Inverse;
139  eval[20] = full5x5_ess.e2x5Left * e5x5Inverse;
140  eval[21] = full5x5_ess.e2x5Right * e5x5Inverse;
141  eval[22] = full5x5_ess.e2x5Top * e5x5Inverse;
142  eval[23] = full5x5_ess.e2x5Bottom * e5x5Inverse;
143  eval[24] = ele.nSaturatedXtals();
144  eval[25] = std::max(0, numberOfClusters);
145 
146  // calculate coordinate variables
147  if (isEB) {
148  float dummy;
149  int ieta;
150  int iphi;
152  eval[26] = ieta;
153  eval[27] = iphi;
154  int signieta = ieta > 0 ? +1 : -1;
155  eval[28] = (ieta - signieta) % 5;
156  eval[29] = (iphi - 1) % 2;
157  eval[30] = (abs(ieta) <= 25) * ((ieta - signieta)) + (abs(ieta) > 25) * ((ieta - 26 * signieta) % 20);
158  eval[31] = (iphi - 1) % 20;
159 
160  } else {
161  float dummy;
162  int ix;
163  int iy;
165  eval[26] = ix;
166  eval[27] = iy;
167  eval[28] = raw_es_energy / rawEnergy;
168  }
169 
170  //magic numbers for MINUIT-like transformation of BDT output onto limited range
171  //(These should be stored inside the conditions object in the future as well)
172  constexpr double meanlimlow = -1.0;
173  constexpr double meanlimhigh = 3.0;
174  constexpr double meanoffset = meanlimlow + 0.5 * (meanlimhigh - meanlimlow);
175  constexpr double meanscale = 0.5 * (meanlimhigh - meanlimlow);
176 
177  constexpr double sigmalimlow = 0.0002;
178  constexpr double sigmalimhigh = 0.5;
179  constexpr double sigmaoffset = sigmalimlow + 0.5 * (sigmalimhigh - sigmalimlow);
180  constexpr double sigmascale = 0.5 * (sigmalimhigh - sigmalimlow);
181 
182  size_t coridx = 0;
183  float rawPt = rawEnergy * superClus->position().rho() / superClus->position().r();
184  bool isSaturated = ele.nSaturatedXtals() != 0;
185 
187  if (isEB)
188  coridx = 1;
189  else
190  coridx = 3;
191  } else {
192  if (isEB)
193  coridx = 0;
194  else
195  coridx = 2;
196  }
197 
198  //these are the actual BDT responses
199  double rawmean = eleForestsMean_[coridx]->GetResponse(eval.data());
200  double rawsigma = eleForestsSigma_[coridx]->GetResponse(eval.data());
201 
202  //apply transformation to limited output range (matching the training)
203  double mean = meanoffset + meanscale * vdt::fast_sin(rawmean);
204  double sigma = sigmaoffset + sigmascale * vdt::fast_sin(rawsigma);
205 
206  // Correct the energy. A negative energy means that the correction went
207  // outside the boundaries of the training. In this case uses raw.
208  // The resolution estimation, on the other hand should be ok.
209  if (mean < 0.)
210  mean = 1.0;
211 
212  const double ecor = mean * (rawEnergy + raw_es_energy);
213  const double sigmacor = sigma * ecor;
214 
215  ele.setCorrectedEcalEnergy(ecor);
216  ele.setCorrectedEcalEnergyError(sigmacor);
217 
218  double combinedEnergy = ecor;
219  double combinedEnergyError = sigmacor;
220 
221  auto el_track = ele.gsfTrack();
222  const float trkMomentum = el_track->pMode();
223  const float trkEta = el_track->etaMode();
224  const float trkPhi = el_track->phiMode();
225  const float trkMomentumError = std::abs(el_track->qoverpModeError()) * trkMomentum * trkMomentum;
226 
227  const float eOverP = (rawEnergy + raw_es_energy) * mean / trkMomentum;
228  const float fbrem = ele.fbrem();
229 
230  // E-p combination
231  if (ecor < highEnergyEcalTrackThr_ && eOverP > eOverPEcalTrkThr_ &&
232  std::abs(ecor - trkMomentum) <
233  epDiffSigEcalTrackThr_ * std::sqrt(trkMomentumError * trkMomentumError + sigmacor * sigmacor) &&
234  trkMomentumError < epSigEcalTrackThr_ * trkMomentum) {
235  rawPt = ecor / cosh(trkEta);
237  coridx = 4;
238  else if (isEB && rawPt >= lowEnergyEcalTrackThr_)
239  coridx = 5;
240  else if (!isEB && rawPt < lowEnergyEcalTrackThr_)
241  coridx = 6;
242  else if (!isEB && rawPt >= lowEnergyEcalTrackThr_)
243  coridx = 7;
244 
245  eval[0] = ecor;
246  eval[1] = sigma / mean;
247  eval[2] = trkMomentumError / trkMomentum;
248  eval[3] = eOverP;
249  eval[4] = ele.ecalDrivenSeed();
250  eval[5] = full5x5_ess.r9;
251  eval[6] = fbrem;
252  eval[7] = trkEta;
253  eval[8] = trkPhi;
254 
255  float ecalEnergyVar = (rawEnergy + raw_es_energy) * sigma;
256  float rawcombNormalization = (trkMomentumError * trkMomentumError + ecalEnergyVar * ecalEnergyVar);
257  float rawcomb = (ecor * trkMomentumError * trkMomentumError + trkMomentum * ecalEnergyVar * ecalEnergyVar) /
258  rawcombNormalization;
259 
260  //these are the actual BDT responses
261  double rawmean_trk = eleForestsMean_[coridx]->GetResponse(eval.data());
262  double rawsigma_trk = eleForestsSigma_[coridx]->GetResponse(eval.data());
263 
264  //apply transformation to limited output range (matching the training)
265  double mean_trk = meanoffset + meanscale * vdt::fast_sin(rawmean_trk);
266  double sigma_trk = sigmaoffset + sigmascale * vdt::fast_sin(rawsigma_trk);
267 
268  // Final correction
269  // A negative energy means that the correction went
270  // outside the boundaries of the training. In this case uses raw.
271  // The resolution estimation, on the other hand should be ok.
272  if (mean_trk < 0.)
273  mean_trk = 1.0;
274 
275  combinedEnergy = mean_trk * rawcomb;
276  combinedEnergyError = sigma_trk * rawcomb;
277  }
278 
279  math::XYZTLorentzVector oldFourMomentum = ele.p4();
280  math::XYZTLorentzVector newFourMomentum(oldFourMomentum.x() * combinedEnergy / oldFourMomentum.t(),
281  oldFourMomentum.y() * combinedEnergy / oldFourMomentum.t(),
282  oldFourMomentum.z() * combinedEnergy / oldFourMomentum.t(),
283  combinedEnergy);
284 
285  ele.correctMomentum(newFourMomentum, ele.trackMomentumError(), combinedEnergyError);
286 }
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
static bool isHGCalDet(DetId::Detector thedet)
identify HGCal cells
Definition: EcalTools.h:49
void localEcalClusterCoordsEB(const reco::CaloCluster &bclus, const CaloGeometry &geom, float &etacry, float &phicry, int &ieta, int &iphi, float &thetatilt, float &phitilt)
bool ecalDrivenSeed() const
Definition: GsfElectron.h:158
float trackMomentumError() const
Definition: GsfElectron.h:884
void correctMomentum(const LorentzVector &p4, float trackMomentumError, float p4Error)
Definition: GsfElectron.h:905
CaloGeometry const * caloGeometry_
float hcalOverEcalBc(const ShowerShape &ss, int depth) const
Definition: GsfElectron.h:442
bool isEB() const
Definition: GsfElectron.h:328
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
GsfTrackRef gsfTrack() const override
reference to a GsfTrack
Definition: GsfElectron.h:156
void setCorrectedEcalEnergyError(float newEnergyError)
Definition: GsfElectron.cc:170
const ShowerShape & full5x5_showerShape() const
Definition: GsfElectron.h:488
T sqrt(T t)
Definition: SSEVec.h:19
bool isAvailable() const
Definition: Ref.h:541
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void localEcalClusterCoordsEE(const reco::CaloCluster &bclus, const CaloGeometry &geom, float &xcry, float &ycry, int &ix, int &iy, float &thetatilt, float &phitilt)
const LorentzVector & p4(P4Kind kind) const
Definition: GsfElectron.cc:217
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id)
const bool forceHighEnergyEcalTrainingIfSaturated_
void setCorrectedEcalEnergy(float newEnergy)
Definition: GsfElectron.cc:174
float fbrem() const
Definition: GsfElectron.h:809
bool isSaturated(const Digi &digi, const int &maxADCvalue, int ifirst, int n)
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id)
std::vector< const GBRForestD * > eleForestsMean_
std::vector< const GBRForestD * > eleForestsSigma_
SuperClusterRef superCluster() const override
reference to a SuperCluster
Definition: GsfElectron.h:155
float nSaturatedXtals() const
Definition: GsfElectron.h:519

◆ modifyObject() [2/4]

void EGRegressionModifierV2::modifyObject ( reco::Photon pho) const
finalvirtual

Reimplemented from ModifyObjectValueBase.

Definition at line 288 of file EGRegressionModifierV2.cc.

References funct::abs(), caloGeometry_, ALPAKA_ACCELERATOR_NAMESPACE::brokenline::constexpr(), reco::deltaPhi(), reco::Photon::ShowerShape::e5x5, forceHighEnergyEcalTrainingIfSaturated_, reco::Photon::full5x5_r9(), reco::Photon::full5x5_showerShapeVariables(), reco::Photon::hadronicOverEm(), hcalRecHitTable_cff::ieta, hcalRecHitTable_cff::iphi, edm::Ref< C, T, F >::isAvailable(), reco::Photon::isEB(), electrons_cff::isEB, EcalTools::isHGCalDet(), CastorSimpleRecAlgoImpl::isSaturated(), ALPAKA_ACCELERATOR_NAMESPACE::ecal::reconstruction::internal::endcap::ix(), ALPAKA_ACCELERATOR_NAMESPACE::ecal::reconstruction::internal::endcap::iy(), egammaTools::localEcalClusterCoordsEB(), egammaTools::localEcalClusterCoordsEE(), lowEnergyEcalOnlyThr_, SiStripPI::max, SiStripPI::mean, reco::Photon::nSaturatedXtals(), electrons_cff::numberOfClusters, phoForestsMean_, phoForestsSigma_, electrons_cff::rawEnergy, jetsAK4_CHS_cff::rawPt, rhoValue_, fileCollector::seed, reco::Photon::setCorrectedEnergy(), and reco::Photon::superCluster().

288  {
289  // regression calculation needs no additional valuemaps
290 
291  const reco::SuperClusterRef& superClus = pho.superCluster();
292  const edm::Ptr<reco::CaloCluster>& seed = superClus->seed();
293 
294  // skip HGCAL for now
295  if (EcalTools::isHGCalDet(seed->seed().det()))
296  return;
297 
298  const int numberOfClusters = superClus->clusters().size();
299  const bool missing_clusters = !superClus->clusters()[numberOfClusters - 1].isAvailable();
300  if (missing_clusters)
301  return; // do not apply corrections in case of missing info (slimmed MiniAOD electrons)
302 
303  const bool isEB = pho.isEB();
304 
305  std::array<float, 32> eval;
306  const double rawEnergy = superClus->rawEnergy();
307  const double raw_es_energy = superClus->preshowerEnergy();
308  const auto& full5x5_pss = pho.full5x5_showerShapeVariables();
309 
310  float e5x5Inverse = full5x5_pss.e5x5 != 0. ? vdt::fast_inv(full5x5_pss.e5x5) : 0.;
311 
312  eval[0] = rawEnergy;
313  eval[1] = superClus->etaWidth();
314  eval[2] = superClus->phiWidth();
315  eval[3] = superClus->seed()->energy() / rawEnergy;
316  eval[4] = full5x5_pss.e5x5 / rawEnergy;
317  eval[5] = pho.hadronicOverEm();
318  eval[6] = rhoValue_;
319  eval[7] = seed->eta() - superClus->position().Eta();
320  eval[8] = reco::deltaPhi(seed->phi(), superClus->position().Phi());
321  eval[9] = pho.full5x5_r9();
322  eval[10] = full5x5_pss.sigmaIetaIeta;
323  eval[11] = full5x5_pss.sigmaIetaIphi;
324  eval[12] = full5x5_pss.sigmaIphiIphi;
325  eval[13] = full5x5_pss.maxEnergyXtal * e5x5Inverse;
326  eval[14] = full5x5_pss.e2nd * e5x5Inverse;
327  eval[15] = full5x5_pss.eTop * e5x5Inverse;
328  eval[16] = full5x5_pss.eBottom * e5x5Inverse;
329  eval[17] = full5x5_pss.eLeft * e5x5Inverse;
330  eval[18] = full5x5_pss.eRight * e5x5Inverse;
331  eval[19] = full5x5_pss.e2x5Max * e5x5Inverse;
332  eval[20] = full5x5_pss.e2x5Left * e5x5Inverse;
333  eval[21] = full5x5_pss.e2x5Right * e5x5Inverse;
334  eval[22] = full5x5_pss.e2x5Top * e5x5Inverse;
335  eval[23] = full5x5_pss.e2x5Bottom * e5x5Inverse;
336  eval[24] = pho.nSaturatedXtals();
337  eval[25] = std::max(0, numberOfClusters);
338 
339  // calculate coordinate variables
340 
341  if (isEB) {
342  float dummy;
343  int ieta;
344  int iphi;
346  eval[26] = ieta;
347  eval[27] = iphi;
348  int signieta = ieta > 0 ? +1 : -1;
349  eval[28] = (ieta - signieta) % 5;
350  eval[29] = (iphi - 1) % 2;
351  eval[30] = (abs(ieta) <= 25) * ((ieta - signieta)) + (abs(ieta) > 25) * ((ieta - 26 * signieta) % 20);
352  eval[31] = (iphi - 1) % 20;
353 
354  } else {
355  float dummy;
356  int ix;
357  int iy;
359  eval[26] = ix;
360  eval[27] = iy;
361  eval[28] = raw_es_energy / rawEnergy;
362  }
363 
364  //magic numbers for MINUIT-like transformation of BDT output onto limited range
365  //(These should be stored inside the conditions object in the future as well)
366  constexpr double meanlimlow = -1.0;
367  constexpr double meanlimhigh = 3.0;
368  constexpr double meanoffset = meanlimlow + 0.5 * (meanlimhigh - meanlimlow);
369  constexpr double meanscale = 0.5 * (meanlimhigh - meanlimlow);
370 
371  constexpr double sigmalimlow = 0.0002;
372  constexpr double sigmalimhigh = 0.5;
373  constexpr double sigmaoffset = sigmalimlow + 0.5 * (sigmalimhigh - sigmalimlow);
374  constexpr double sigmascale = 0.5 * (sigmalimhigh - sigmalimlow);
375 
376  size_t coridx = 0;
377  float rawPt = rawEnergy * superClus->position().rho() / superClus->position().r();
378  bool isSaturated = pho.nSaturatedXtals();
379 
381  if (isEB)
382  coridx = 1;
383  else
384  coridx = 3;
385  } else {
386  if (isEB)
387  coridx = 0;
388  else
389  coridx = 2;
390  }
391 
392  //these are the actual BDT responses
393  double rawmean = phoForestsMean_[coridx]->GetResponse(eval.data());
394  double rawsigma = phoForestsSigma_[coridx]->GetResponse(eval.data());
395 
396  //apply transformation to limited output range (matching the training)
397  double mean = meanoffset + meanscale * vdt::fast_sin(rawmean);
398  double sigma = sigmaoffset + sigmascale * vdt::fast_sin(rawsigma);
399 
400  // Correct the energy. A negative energy means that the correction went
401  // outside the boundaries of the training. In this case uses raw.
402  // The resolution estimation, on the other hand should be ok.
403  if (mean < 0.)
404  mean = 1.0;
405 
406  const double ecor = mean * (rawEnergy + raw_es_energy);
407  const double sigmacor = sigma * ecor;
408 
409  pho.setCorrectedEnergy(reco::Photon::P4type::regression2, ecor, sigmacor, true);
410 }
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:26
static bool isHGCalDet(DetId::Detector thedet)
identify HGCal cells
Definition: EcalTools.h:49
void localEcalClusterCoordsEB(const reco::CaloCluster &bclus, const CaloGeometry &geom, float &etacry, float &phicry, int &ieta, int &iphi, float &thetatilt, float &phitilt)
void setCorrectedEnergy(P4type type, float E, float dE, bool toCand=true)
const ShowerShape & full5x5_showerShapeVariables() const
Definition: Photon.h:216
CaloGeometry const * caloGeometry_
bool isEB() const
Definition: Photon.h:126
float nSaturatedXtals() const
Definition: Photon.h:312
std::vector< const GBRForestD * > phoForestsSigma_
reco::SuperClusterRef superCluster() const override
Ref to SuperCluster.
bool isAvailable() const
Definition: Ref.h:541
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::vector< const GBRForestD * > phoForestsMean_
void localEcalClusterCoordsEE(const reco::CaloCluster &bclus, const CaloGeometry &geom, float &xcry, float &ycry, int &ix, int &iy, float &thetatilt, float &phitilt)
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t ix(uint32_t id)
float hadronicOverEm(int depth=0) const
Definition: Photon.h:239
const bool forceHighEnergyEcalTrainingIfSaturated_
bool isSaturated(const Digi &digi, const int &maxADCvalue, int ifirst, int n)
ALPAKA_FN_ACC ALPAKA_FN_INLINE uint32_t iy(uint32_t id)
float full5x5_r9() const
Definition: Photon.h:291

◆ modifyObject() [3/4]

void EGRegressionModifierV2::modifyObject ( pat::Electron ele) const
inlinefinalvirtual

Reimplemented from ModifyObjectValueBase.

Definition at line 27 of file EGRegressionModifierV2.cc.

References modifyObject().

Referenced by modifyObject().

27 { modifyObject(static_cast<reco::GsfElectron&>(ele)); }
void modifyObject(reco::GsfElectron &) const final

◆ modifyObject() [4/4]

void EGRegressionModifierV2::modifyObject ( pat::Photon pho) const
inlinefinalvirtual

Reimplemented from ModifyObjectValueBase.

Definition at line 28 of file EGRegressionModifierV2.cc.

References modifyObject().

Referenced by modifyObject().

28 { modifyObject(static_cast<reco::Photon&>(pho)); }
void modifyObject(reco::GsfElectron &) const final

◆ setEvent()

void EGRegressionModifierV2::setEvent ( const edm::Event evt)
finalvirtual

Reimplemented from ModifyObjectValueBase.

Definition at line 78 of file EGRegressionModifierV2.cc.

References edm::Event::get(), rhoToken_, and rhoValue_.

78 { rhoValue_ = evt.get(rhoToken_); }
bool get(ProductID const &oid, Handle< PROD > &result) const
Definition: Event.h:344
const edm::EDGetTokenT< double > rhoToken_

◆ setEventContent()

void EGRegressionModifierV2::setEventContent ( const edm::EventSetup evs)
finalvirtual

Reimplemented from ModifyObjectValueBase.

Definition at line 80 of file EGRegressionModifierV2.cc.

References caloGeometry_, caloGeometryToken_, eleCondTokens_, eleForestsMean_, eleForestsSigma_, edm::EventSetup::getData(), EGRegressionModifierCondTokens::mean, phoCondTokens_, phoForestsMean_, phoForestsSigma_, retrieveGBRForests(), and EGRegressionModifierCondTokens::sigma.

80  {
83 
86 
88 }
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
std::vector< edm::ESGetToken< GBRForestD, GBRDWrapperRcd > > mean
CaloGeometry const * caloGeometry_
EGRegressionModifierCondTokens eleCondTokens_
std::vector< const GBRForestD * > phoForestsSigma_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryToken_
std::vector< const GBRForestD * > phoForestsMean_
EGRegressionModifierCondTokens phoCondTokens_
std::vector< edm::ESGetToken< GBRForestD, GBRDWrapperRcd > > sigma
std::vector< const GBRForestD * > retrieveGBRForests(edm::EventSetup const &evs, std::vector< edm::ESGetToken< GBRForestD, GBRDWrapperRcd >> const &tokens)
std::vector< const GBRForestD * > eleForestsMean_
std::vector< const GBRForestD * > eleForestsSigma_

Member Data Documentation

◆ caloGeometry_

CaloGeometry const* EGRegressionModifierV2::caloGeometry_ = nullptr
private

Definition at line 37 of file EGRegressionModifierV2.cc.

Referenced by modifyObject(), and setEventContent().

◆ caloGeometryToken_

const edm::ESGetToken<CaloGeometry, CaloGeometryRecord> EGRegressionModifierV2::caloGeometryToken_
private

Definition at line 36 of file EGRegressionModifierV2.cc.

Referenced by setEventContent().

◆ eleCondTokens_

EGRegressionModifierCondTokens EGRegressionModifierV2::eleCondTokens_
private

Definition at line 31 of file EGRegressionModifierV2.cc.

Referenced by setEventContent().

◆ eleForestsMean_

std::vector<const GBRForestD*> EGRegressionModifierV2::eleForestsMean_
private

Definition at line 41 of file EGRegressionModifierV2.cc.

Referenced by modifyObject(), and setEventContent().

◆ eleForestsSigma_

std::vector<const GBRForestD*> EGRegressionModifierV2::eleForestsSigma_
private

Definition at line 42 of file EGRegressionModifierV2.cc.

Referenced by modifyObject(), and setEventContent().

◆ eOverPEcalTrkThr_

const double EGRegressionModifierV2::eOverPEcalTrkThr_
private

Definition at line 47 of file EGRegressionModifierV2.cc.

Referenced by modifyObject().

◆ epDiffSigEcalTrackThr_

const double EGRegressionModifierV2::epDiffSigEcalTrackThr_
private

Definition at line 48 of file EGRegressionModifierV2.cc.

Referenced by modifyObject().

◆ epSigEcalTrackThr_

const double EGRegressionModifierV2::epSigEcalTrackThr_
private

Definition at line 49 of file EGRegressionModifierV2.cc.

Referenced by modifyObject().

◆ forceHighEnergyEcalTrainingIfSaturated_

const bool EGRegressionModifierV2::forceHighEnergyEcalTrainingIfSaturated_
private

Definition at line 50 of file EGRegressionModifierV2.cc.

Referenced by modifyObject().

◆ highEnergyEcalTrackThr_

const double EGRegressionModifierV2::highEnergyEcalTrackThr_
private

Definition at line 46 of file EGRegressionModifierV2.cc.

◆ lowEnergyEcalOnlyThr_

const double EGRegressionModifierV2::lowEnergyEcalOnlyThr_
private

Definition at line 44 of file EGRegressionModifierV2.cc.

Referenced by modifyObject().

◆ lowEnergyEcalTrackThr_

const double EGRegressionModifierV2::lowEnergyEcalTrackThr_
private

Definition at line 45 of file EGRegressionModifierV2.cc.

Referenced by modifyObject().

◆ phoCondTokens_

EGRegressionModifierCondTokens EGRegressionModifierV2::phoCondTokens_
private

Definition at line 32 of file EGRegressionModifierV2.cc.

Referenced by setEventContent().

◆ phoForestsMean_

std::vector<const GBRForestD*> EGRegressionModifierV2::phoForestsMean_
private

Definition at line 39 of file EGRegressionModifierV2.cc.

Referenced by modifyObject(), and setEventContent().

◆ phoForestsSigma_

std::vector<const GBRForestD*> EGRegressionModifierV2::phoForestsSigma_
private

Definition at line 40 of file EGRegressionModifierV2.cc.

Referenced by modifyObject(), and setEventContent().

◆ rhoToken_

const edm::EDGetTokenT<double> EGRegressionModifierV2::rhoToken_
private

Definition at line 35 of file EGRegressionModifierV2.cc.

Referenced by setEvent().

◆ rhoValue_

float EGRegressionModifierV2::rhoValue_
private

Definition at line 34 of file EGRegressionModifierV2.cc.

Referenced by modifyObject(), and setEvent().