3 #include "vdt/vdtMath.h" 8 bool sortByKey(
const EEPSPair&
a,
const EEPSPair&
b) {
9 return a.first < b.first;
12 double getOffset(
const double lo,
const double hi) {
return lo + 0.5*(hi-lo); }
13 double getScale(
const double lo,
const double hi) {
return 0.5*(hi-lo); }
25 if (applyMVACorrections_) {
59 "ecalPFClusterCorV2_EB_pfSize1_mean_25ns",
60 "ecalPFClusterCorV2_EB_pfSize2_mean_25ns",
61 "ecalPFClusterCorV2_EB_pfSize3_ptbin1_mean_25ns",
62 "ecalPFClusterCorV2_EB_pfSize3_ptbin2_mean_25ns",
63 "ecalPFClusterCorV2_EB_pfSize3_ptbin3_mean_25ns",
64 "ecalPFClusterCorV2_EE_pfSize1_mean_25ns",
65 "ecalPFClusterCorV2_EE_pfSize2_mean_25ns",
66 "ecalPFClusterCorV2_EE_pfSize3_ptbin1_mean_25ns",
67 "ecalPFClusterCorV2_EE_pfSize3_ptbin2_mean_25ns",
68 "ecalPFClusterCorV2_EE_pfSize3_ptbin3_mean_25ns"});
70 "ecalPFClusterCorV2_EB_pfSize1_sigma_25ns",
71 "ecalPFClusterCorV2_EB_pfSize2_sigma_25ns",
72 "ecalPFClusterCorV2_EB_pfSize3_ptbin1_sigma_25ns",
73 "ecalPFClusterCorV2_EB_pfSize3_ptbin2_sigma_25ns",
74 "ecalPFClusterCorV2_EB_pfSize3_ptbin3_sigma_25ns",
75 "ecalPFClusterCorV2_EE_pfSize1_sigma_25ns",
76 "ecalPFClusterCorV2_EE_pfSize2_sigma_25ns",
77 "ecalPFClusterCorV2_EE_pfSize3_ptbin1_sigma_25ns",
78 "ecalPFClusterCorV2_EE_pfSize3_ptbin2_sigma_25ns",
79 "ecalPFClusterCorV2_EE_pfSize3_ptbin3_sigma_25ns"});
81 "ecalPFClusterCorV2_EB_pfSize1_mean_50ns",
82 "ecalPFClusterCorV2_EB_pfSize2_mean_50ns",
83 "ecalPFClusterCorV2_EB_pfSize3_ptbin1_mean_50ns",
84 "ecalPFClusterCorV2_EB_pfSize3_ptbin2_mean_50ns",
85 "ecalPFClusterCorV2_EB_pfSize3_ptbin3_mean_50ns",
86 "ecalPFClusterCorV2_EE_pfSize1_mean_50ns",
87 "ecalPFClusterCorV2_EE_pfSize2_mean_50ns",
88 "ecalPFClusterCorV2_EE_pfSize3_ptbin1_mean_50ns",
89 "ecalPFClusterCorV2_EE_pfSize3_ptbin2_mean_50ns",
90 "ecalPFClusterCorV2_EE_pfSize3_ptbin3_mean_50ns"});
92 "ecalPFClusterCorV2_EB_pfSize1_sigma_50ns",
93 "ecalPFClusterCorV2_EB_pfSize2_sigma_50ns",
94 "ecalPFClusterCorV2_EB_pfSize3_ptbin1_sigma_50ns",
95 "ecalPFClusterCorV2_EB_pfSize3_ptbin2_sigma_50ns",
96 "ecalPFClusterCorV2_EB_pfSize3_ptbin3_sigma_50ns",
97 "ecalPFClusterCorV2_EE_pfSize1_sigma_50ns",
98 "ecalPFClusterCorV2_EE_pfSize2_sigma_50ns",
99 "ecalPFClusterCorV2_EE_pfSize3_ptbin1_sigma_50ns",
100 "ecalPFClusterCorV2_EE_pfSize3_ptbin2_sigma_50ns",
101 "ecalPFClusterCorV2_EE_pfSize3_ptbin3_sigma_50ns"});
103 if (srfAwareCorrection_) {
114 "ecalPFClusterCor2017V2_EB_ZS_mean_25ns",
115 "ecalPFClusterCor2017V2_EB_Full_ptbin1_mean_25ns",
116 "ecalPFClusterCor2017V2_EB_Full_ptbin2_mean_25ns",
117 "ecalPFClusterCor2017V2_EB_Full_ptbin3_mean_25ns",
118 "ecalPFClusterCor2017V2_EE_ZS_mean_25ns",
119 "ecalPFClusterCor2017V2_EE_Full_ptbin1_mean_25ns",
120 "ecalPFClusterCor2017V2_EE_Full_ptbin2_mean_25ns",
121 "ecalPFClusterCor2017V2_EE_Full_ptbin3_mean_25ns"});
124 "ecalPFClusterCor2017V2_EB_ZS_sigma_25ns",
125 "ecalPFClusterCor2017V2_EB_Full_ptbin1_sigma_25ns",
126 "ecalPFClusterCor2017V2_EB_Full_ptbin2_sigma_25ns",
127 "ecalPFClusterCor2017V2_EB_Full_ptbin3_sigma_25ns",
128 "ecalPFClusterCor2017V2_EE_ZS_sigma_25ns",
129 "ecalPFClusterCor2017V2_EE_Full_ptbin1_sigma_25ns",
130 "ecalPFClusterCor2017V2_EE_Full_ptbin2_sigma_25ns",
131 "ecalPFClusterCor2017V2_EE_Full_ptbin3_sigma_25ns"});
145 for (
unsigned int idx = 0;
idx<cs.size(); ++
idx) {
148 float ePS1=0., ePS2=0.;
163 int bunchspacing = 450;
167 bunchspacing = *bunchSpacingH;
175 const unsigned int ncor = condnames_mean.size();
176 std::vector<edm::ESHandle<GBRForestD> > forestH_mean(ncor);
177 std::vector<edm::ESHandle<GBRForestD> > forestH_sigma(ncor);
179 for (
unsigned int icor=0; icor<ncor; ++icor) {
184 std::array<float,5> eval;
185 for (
unsigned int idx = 0;
idx<cs.size(); ++
idx) {
188 float ePS1=0., ePS2=0.;
193 double pt = cluster.
pt();
198 double invE = (e == 0.) ? 0. : 1./
e;
199 int size = lazyTool.n5x5(cluster);
205 ietaix = ebseed.
ieta();
206 iphiiy = ebseed.iphi();
209 ietaix = eeseed.
ix();
210 iphiiy = eeseed.iy();
227 const GBRForestD &meanforest = *forestH_mean[coridx].product();
228 const GBRForestD &sigmaforest = *forestH_sigma[coridx].product();
240 double rawmean = meanforest.
GetResponse(eval.data());
241 double rawsigma = sigmaforest.
GetResponse(eval.data());
249 double ecor = vdt::fast_exp(mean)*
e;
250 double sigmacor = sigma*ecor;
266 throw cms::Exception(
"PFClusterEMEnergyCorrector") <<
"This version of PFCluster corrections requires the SrFlagCollection information to proceed!\n";
270 std::vector<edm::ESHandle<GBRForestD> > forestH_mean(ncor);
271 std::vector<edm::ESHandle<GBRForestD> > forestH_sigma(ncor);
273 for (
unsigned int icor=0; icor<ncor; ++icor) {
278 std::array<float,6> evalEB;
279 std::array<float,5> evalEE;
281 for (
unsigned int idx = 0;
idx<cs.size(); ++
idx) {
285 float ePS1=0., ePS2=0.;
290 double pt = cluster.
pt();
295 double invE = (e == 0.) ? 0. : 1./
e;
296 int size = lazyTool.n5x5(cluster);
297 int reducedHits =
size;
305 ietaix = ebseed.
ieta();
306 iphiiy = ebseed.iphi();
309 ietaix = eeseed.
ix();
310 iphiiy = eeseed.iy();
314 int signeta = (ietaix > 0) ? 1 : -1;
315 int ietamod20 = (
std::abs(ietaix) < 26) ? ietaix - signeta : (ietaix - 26*signeta) % 20;
316 int iphimod20 = (iphiiy-1) % 20;
322 if (srf != ebSrFlags->
end())
323 clusFlag = srf->value();
329 if (srf != eeSrFlags->
end())
330 clusFlag = srf->value();
338 if (!iseb) regind = 4;
349 int ZS_bit = clusFlag>>0&1;
350 int FR_bit = clusFlag>>1&1;
354 if (ZS_bit!=0 && FR_bit==0)
357 if (pt<2.5) coridx = 1 + regind;
358 else if (pt>=2.5 && pt<6.) coridx = 2 + regind;
359 else if (pt>=6.) coridx = 3 + regind;
361 if (ZS_bit==0 || clusFlag > 7) {
362 edm::LogWarning(
"PFClusterEMEnergyCorrector") <<
"We can only correct regions readout in ZS (flag 1,5) or FULL readout (flag 3,7). Flag " << clusFlag <<
" is not recognized." 363 <<
"\n" <<
"Assuming FULL readout and continuing";
366 const GBRForestD &meanforest = *forestH_mean[coridx].product();
367 const GBRForestD &sigmaforest = *forestH_sigma[coridx].product();
374 evalEB[3] = ietamod20;
375 evalEB[4] = iphimod20;
376 evalEB[5] = reducedHits;
381 evalEE[3] = (ePS1+ePS2)*invE;
382 evalEE[4] = reducedHits;
405 double ecor = iseb ? vdt::fast_exp(mean)*e : vdt::fast_exp(mean)*(e+ePS1+ePS2);
406 double sigmacor = sigma*ecor;
408 LogDebug(
"PFClusterEMEnergyCorrector") <<
"ieta : iphi : ietamod20 : iphimod20 : size : reducedHits = " 409 << ietaix <<
" " << iphiiy <<
" " 410 << ietamod20 <<
" " << iphimod20 <<
" " 411 << size <<
" " << reducedHits
412 <<
"\n" <<
"isEB : eraw : ePS1 : ePS2 : (eps1+eps2)/raw : Flag = " 413 << iseb <<
" " << evale <<
" " << ePS1 <<
" " << ePS2 <<
" " << (ePS1+ePS2)/evale <<
" " << clusFlag
414 <<
"\n" <<
"response : correction = " 415 <<
exp(mean) <<
" " << ecor;
430 const auto clustops = std::equal_range(assoc.begin(),
434 for(
auto i_ps = clustops.first; i_ps != clustops.second; ++i_ps) {
436 switch( psclus->
layer() ) {
PFLayer::Layer layer() const
cluster layer, see PFLayer.h in this directory
T getParameter(std::string const &) const
double GetResponse(const float *vector) const
bool applyMVACorrections_
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
bool getByToken(EDGetToken token, Handle< PROD > &result) const
unique_ptr< ClusterSequence > cs
std::vector< T >::const_iterator const_iterator
PFClusterEMEnergyCorrector(const edm::ParameterSet &conf, edm::ConsumesCollector &&cc)
double pt() const
transverse momentum, massless approximation
bool applyCrackCorrections_
edm::EDGetTokenT< EESrFlagCollection > eeSrFlagToken_
std::unique_ptr< PFEnergyCalibration > calibrator_
edm::EDGetTokenT< unsigned int > bunchSpacing_
edm::EDGetTokenT< EcalRecHitCollection > recHitsEE_
std::vector< std::string > condnames_mean_50ns_
std::vector< std::string > condnames_sigma_25ns_
Container::value_type value_type
std::vector< std::string > condnames_mean_25ns_
void setCorrectedEnergy(double cenergy)
std::vector< std::pair< CaloClusterPtr::key_type, edm::Ptr< PFCluster > > > EEtoPSAssociation
Abs< T >::type abs(const T &t)
int ieta() const
get the crystal ieta
std::vector< std::string > condnames_sigma_
double energy() const
cluster energy
const_iterator end() const
DetId seed() const
return DetId of seed
edm::EDGetTokenT< EcalRecHitCollection > recHitsEB_
reco::PFCluster::EEtoPSAssociation::value_type EEPSPair
bool sortByKey(const EEPSPair &a, const EEPSPair &b)
bool setEnergyUncertainty_
iterator find(key_type k)
double maxPtForMVAEvaluation_
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
edm::EDGetTokenT< EBSrFlagCollection > ebSrFlagToken_
std::vector< std::string > condnames_sigma_50ns_
bool autoDetectBunchSpacing_
void correctEnergies(const edm::Event &evt, const edm::EventSetup &es, const reco::PFCluster::EEtoPSAssociation &assoc, reco::PFClusterCollection &cs)
void setCorrectedEnergyUncertainty(float energyerr)
void getAssociatedPSEnergy(const size_t clusIdx, const reco::PFCluster::EEtoPSAssociation &assoc, float &e1, float &e2)
std::vector< std::string > condnames_mean_