36 template <
class TauType,
class ElectronType>
38 : isInitialized_(
false),
39 mva_NoEleMatch_woGwoGSF_BL_(nullptr),
40 mva_NoEleMatch_wGwoGSF_BL_(nullptr),
41 mva_woGwGSF_BL_(nullptr),
42 mva_wGwGSF_BL_(nullptr),
43 mva_NoEleMatch_woGwoGSF_EC_(nullptr),
44 mva_NoEleMatch_wGwoGSF_EC_(nullptr),
45 mva_woGwGSF_EC_(nullptr),
46 mva_wGwGSF_EC_(nullptr),
47 mva_NoEleMatch_woGwoGSF_VFEC_(nullptr),
48 mva_NoEleMatch_wGwoGSF_VFEC_(nullptr),
49 mva_woGwGSF_VFEC_(nullptr),
50 mva_wGwGSF_VFEC_(nullptr),
51 isPhase2_(
cfg.getParameter<
bool>(
"isPhase2")),
53 verbosity_(
cfg.getParameter<
int>(
"verbosity")) {
56 if (
cfg.exists(
"inputFileName")) {
60 <<
"Requested to load tau MVA input from ROOT file but no file provided in cfg file";
104 for (
const auto&
inputTag :
cfg.getParameter<std::vector<edm::InputTag>>(
"hgcalElectronIDs")) {
114 template <
class TauType,
class ElectronType>
116 if (!loadMVAfromDB_) {
117 delete mva_NoEleMatch_woGwoGSF_BL_;
118 delete mva_NoEleMatch_wGwoGSF_BL_;
119 delete mva_woGwGSF_BL_;
120 delete mva_wGwGSF_BL_;
121 delete mva_NoEleMatch_woGwoGSF_EC_;
122 delete mva_NoEleMatch_wGwoGSF_EC_;
123 delete mva_woGwGSF_EC_;
124 delete mva_wGwGSF_EC_;
126 delete mva_NoEleMatch_woGwoGSF_VFEC_;
127 delete mva_NoEleMatch_wGwoGSF_VFEC_;
128 delete mva_woGwGSF_VFEC_;
129 delete mva_wGwGSF_VFEC_;
133 for (std::vector<TFile*>::iterator it = inputFilesToDelete_.begin(); it != inputFilesToDelete_.end(); ++it) {
142 throw cms::Exception(
"PFRecoTauDiscriminationAgainstElectronMVA6::loadMVA")
143 <<
" Failed to load MVA = " <<
mvaName.data() <<
" from file "
152 return mva.product();
156 template <
class TauType,
class ElectronType>
158 if (!isInitialized_) {
159 if (loadMVAfromDB_) {
160 mva_NoEleMatch_woGwoGSF_BL_ =
loadMVAfromDB(es, mvaName_NoEleMatch_woGwoGSF_BL_);
161 mva_NoEleMatch_wGwoGSF_BL_ =
loadMVAfromDB(es, mvaName_NoEleMatch_wGwoGSF_BL_);
164 mva_NoEleMatch_woGwoGSF_EC_ =
loadMVAfromDB(es, mvaName_NoEleMatch_woGwoGSF_EC_);
165 mva_NoEleMatch_wGwoGSF_EC_ =
loadMVAfromDB(es, mvaName_NoEleMatch_wGwoGSF_EC_);
169 mva_NoEleMatch_woGwoGSF_VFEC_ =
loadMVAfromDB(es, mvaName_NoEleMatch_woGwoGSF_VFEC_);
170 mva_NoEleMatch_wGwoGSF_VFEC_ =
loadMVAfromDB(es, mvaName_NoEleMatch_wGwoGSF_VFEC_);
171 mva_woGwGSF_VFEC_ =
loadMVAfromDB(es, mvaName_woGwGSF_VFEC_);
176 throw cms::Exception(
"PFRecoTauDiscriminationAgainstElectronMVA6::loadMVA")
177 <<
" Failed to find File = " << inputFileName_ <<
" !!\n";
178 TFile*
inputFile =
new TFile(inputFileName_.fullPath().data());
180 mva_NoEleMatch_woGwoGSF_BL_ = loadMVAfromFile(
inputFile, mvaName_NoEleMatch_woGwoGSF_BL_);
181 mva_NoEleMatch_wGwoGSF_BL_ = loadMVAfromFile(
inputFile, mvaName_NoEleMatch_wGwoGSF_BL_);
182 mva_woGwGSF_BL_ = loadMVAfromFile(
inputFile, mvaName_woGwGSF_BL_);
183 mva_wGwGSF_BL_ = loadMVAfromFile(
inputFile, mvaName_wGwGSF_BL_);
184 mva_NoEleMatch_woGwoGSF_EC_ = loadMVAfromFile(
inputFile, mvaName_NoEleMatch_woGwoGSF_EC_);
185 mva_NoEleMatch_wGwoGSF_EC_ = loadMVAfromFile(
inputFile, mvaName_NoEleMatch_wGwoGSF_EC_);
186 mva_woGwGSF_EC_ = loadMVAfromFile(
inputFile, mvaName_woGwGSF_EC_);
187 mva_wGwGSF_EC_ = loadMVAfromFile(
inputFile, mvaName_wGwGSF_EC_);
189 mva_NoEleMatch_woGwoGSF_VFEC_ = loadMVAfromFile(
inputFile, mvaName_NoEleMatch_woGwoGSF_VFEC_);
190 mva_NoEleMatch_wGwoGSF_VFEC_ = loadMVAfromFile(
inputFile, mvaName_NoEleMatch_wGwoGSF_VFEC_);
191 mva_woGwGSF_VFEC_ = loadMVAfromFile(
inputFile, mvaName_woGwGSF_VFEC_);
192 mva_wGwGSF_VFEC_ = loadMVAfromFile(
inputFile, mvaName_wGwGSF_VFEC_);
194 inputFilesToDelete_.push_back(
inputFile);
196 isInitialized_ =
true;
198 positionAtECalEntrance_.beginEvent(es);
201 for (
const auto& eId_token : electronIds_tokens_) {
202 electronIds_[eId_token.first] = evt.
getHandle(eId_token.second);
207 template <
class TauType,
class ElectronType>
225 dEta2 += (pt_i * eta_i * eta_i);
226 dPhi2 += (pt_i * phi_i * phi_i);
230 if (tauVars.
pt > 0.) {
253 dEta2 += (pt_i * eta_i * eta_i);
254 dPhi2 += (pt_i * phi_i * phi_i);
258 if (tauVars.
pt > 0.) {
269 return mvaValue(tauVars, tauGammaMoms, elecVars);
271 return mvaValuePhase2(tauVars, tauGammaMoms, elecVars);
275 template <
class TauType,
class ElectronType>
279 if (!isInitialized_) {
280 throw cms::Exception(
"ClassNotInitialized") <<
" AntiElectronMVA6 not properly initialized !!\n";
283 double mvaValue = -99.;
285 float elecDeltaPinPoutOverPin = (elecVars.
pIn > 0.0) ? (
std::abs(elecVars.
pIn - elecVars.
pOut) / elecVars.
pIn) : 1.0;
286 float elecEecalOverPout = (elecVars.
pOut > 0.0) ? (elecVars.
eEcal / elecVars.
pOut) : 20.0;
287 float elecNumHitsDiffOverSum =
299 var_NoEleMatch_woGwoGSF_Barrel_[4] = tauVars.
emFraction;
302 var_NoEleMatch_woGwoGSF_Barrel_[7] = tauVars.
visMassIn;
303 var_NoEleMatch_woGwoGSF_Barrel_[8] = tauVars.
dCrackEta;
304 var_NoEleMatch_woGwoGSF_Barrel_[9] = tauVars.
dCrackPhi;
305 mvaValue = mva_NoEleMatch_woGwoGSF_BL_->GetClassifier(var_NoEleMatch_woGwoGSF_Barrel_.data());
311 var_NoEleMatch_woGwoGSF_Endcap_[4] = tauVars.
emFraction;
314 var_NoEleMatch_woGwoGSF_Endcap_[7] = tauVars.
visMassIn;
315 var_NoEleMatch_woGwoGSF_Endcap_[8] = tauVars.
dCrackEta;
316 mvaValue = mva_NoEleMatch_woGwoGSF_EC_->GetClassifier(var_NoEleMatch_woGwoGSF_Endcap_.data());
325 var_NoEleMatch_wGwoGSF_Barrel_[4] = tauVars.
emFraction;
330 var_NoEleMatch_wGwoGSF_Barrel_[9] = tauVars.
visMassIn;
331 var_NoEleMatch_wGwoGSF_Barrel_[10] = tauGammaMoms.
gammaEtaMomIn;
333 var_NoEleMatch_wGwoGSF_Barrel_[12] = tauGammaMoms.
gammaPhiMomIn;
335 var_NoEleMatch_wGwoGSF_Barrel_[14] = tauGammaMoms.
gammaEnFracIn;
337 var_NoEleMatch_wGwoGSF_Barrel_[16] = tauVars.
dCrackEta;
338 var_NoEleMatch_wGwoGSF_Barrel_[17] = tauVars.
dCrackPhi;
339 mvaValue = mva_NoEleMatch_wGwoGSF_BL_->GetClassifier(var_NoEleMatch_wGwoGSF_Barrel_.data());
345 var_NoEleMatch_wGwoGSF_Endcap_[4] = tauVars.
emFraction;
350 var_NoEleMatch_wGwoGSF_Endcap_[9] = tauVars.
visMassIn;
351 var_NoEleMatch_wGwoGSF_Endcap_[10] = tauGammaMoms.
gammaEtaMomIn;
353 var_NoEleMatch_wGwoGSF_Endcap_[12] = tauGammaMoms.
gammaPhiMomIn;
355 var_NoEleMatch_wGwoGSF_Endcap_[14] = tauGammaMoms.
gammaEnFracIn;
357 var_NoEleMatch_wGwoGSF_Endcap_[16] = tauVars.
dCrackEta;
358 mvaValue = mva_NoEleMatch_wGwoGSF_EC_->GetClassifier(var_NoEleMatch_wGwoGSF_Endcap_.data());
367 var_woGwGSF_Barrel_[5] = elecNumHitsDiffOverSum;
369 var_woGwGSF_Barrel_[7] =
std::min(elecDeltaPinPoutOverPin, 1.
f);
370 var_woGwGSF_Barrel_[8] =
std::min(elecEecalOverPout, 20.
f);
371 var_woGwGSF_Barrel_[9] = elecVars.
deltaEta;
372 var_woGwGSF_Barrel_[10] = elecVars.
deltaPhi;
383 var_woGwGSF_Barrel_[21] = tauVars.
visMassIn;
384 var_woGwGSF_Barrel_[22] = tauVars.
dCrackEta;
385 var_woGwGSF_Barrel_[23] = tauVars.
dCrackPhi;
386 mvaValue = mva_woGwGSF_BL_->GetClassifier(var_woGwGSF_Barrel_.data());
393 var_woGwGSF_Endcap_[5] = elecNumHitsDiffOverSum;
395 var_woGwGSF_Endcap_[7] =
std::min(elecDeltaPinPoutOverPin, 1.
f);
396 var_woGwGSF_Endcap_[8] =
std::min(elecEecalOverPout, 20.
f);
397 var_woGwGSF_Endcap_[9] = elecVars.
deltaEta;
398 var_woGwGSF_Endcap_[10] = elecVars.
deltaPhi;
409 var_woGwGSF_Endcap_[21] = tauVars.
visMassIn;
410 var_woGwGSF_Endcap_[22] = tauVars.
dCrackEta;
411 mvaValue = mva_woGwGSF_EC_->GetClassifier(var_woGwGSF_Endcap_.data());
420 var_wGwGSF_Barrel_[5] = elecNumHitsDiffOverSum;
422 var_wGwGSF_Barrel_[7] =
std::min(elecDeltaPinPoutOverPin, 1.
f);
423 var_wGwGSF_Barrel_[8] =
std::min(elecEecalOverPout, 20.
f);
424 var_wGwGSF_Barrel_[9] = elecVars.
deltaEta;
425 var_wGwGSF_Barrel_[10] = elecVars.
deltaPhi;
438 var_wGwGSF_Barrel_[23] = tauVars.
visMassIn;
445 var_wGwGSF_Barrel_[30] = tauVars.
dCrackEta;
446 var_wGwGSF_Barrel_[31] = tauVars.
dCrackPhi;
447 mvaValue = mva_wGwGSF_BL_->GetClassifier(var_wGwGSF_Barrel_.data());
454 var_wGwGSF_Endcap_[5] = elecNumHitsDiffOverSum;
456 var_wGwGSF_Endcap_[7] =
std::min(elecDeltaPinPoutOverPin, 1.
f);
457 var_wGwGSF_Endcap_[8] =
std::min(elecEecalOverPout, 20.
f);
458 var_wGwGSF_Endcap_[9] = elecVars.
deltaEta;
459 var_wGwGSF_Endcap_[10] = elecVars.
deltaPhi;
472 var_wGwGSF_Endcap_[23] = tauVars.
visMassIn;
479 var_wGwGSF_Endcap_[30] = tauVars.
dCrackEta;
480 mvaValue = mva_wGwGSF_EC_->GetClassifier(var_wGwGSF_Endcap_.data());
486 template <
class TauType,
class ElectronType>
490 if (!isInitialized_) {
491 throw cms::Exception(
"ClassNotInitialized") <<
" AntiElectronMVA6 not properly initialized !!\n";
494 double mvaValue = -99.;
501 float elecDeltaPinPoutOverPin = (elecVars.
pIn > 0.0) ? (
std::abs(elecVars.
pIn - elecVars.
pOut) / elecVars.
pIn) : 1.0;
502 float elecEecalOverPout = (elecVars.
pOut > 0.0) ? (elecVars.
eEcal / elecVars.
pOut) : 20.0;
503 float elecNumHitsDiffOverSum =
512 var_NoEleMatch_woGwoGSF_Barrel_[2] = tauVars.
emFraction;
515 var_NoEleMatch_woGwoGSF_Barrel_[5] = tauVars.
visMassIn;
516 var_NoEleMatch_woGwoGSF_Barrel_[6] = tauVars.
dCrackEta;
519 mvaValue = mva_NoEleMatch_woGwoGSF_BL_->GetClassifier(var_NoEleMatch_woGwoGSF_Barrel_.data());
523 var_NoEleMatch_woGwoGSF_Endcap_[2] = tauVars.
visMassIn;
524 var_NoEleMatch_woGwoGSF_Endcap_[3] = tauVars.
dCrackEta;
527 mvaValue = mva_NoEleMatch_woGwoGSF_EC_->GetClassifier(var_NoEleMatch_woGwoGSF_Endcap_.data());
531 var_NoEleMatch_woGwoGSF_VFEndcap_[2] = tauVars.
visMassIn;
532 var_NoEleMatch_woGwoGSF_VFEndcap_[3] = tauVars.
dCrackEta;
535 mvaValue = mva_NoEleMatch_woGwoGSF_VFEC_->GetClassifier(var_NoEleMatch_woGwoGSF_VFEndcap_.data());
541 var_NoEleMatch_wGwoGSF_Barrel_[2] = tauVars.
emFraction;
546 var_NoEleMatch_wGwoGSF_Barrel_[7] = tauVars.
visMassIn;
547 var_NoEleMatch_wGwoGSF_Barrel_[7] = tauGammaMoms.
gammaEtaMomIn;
549 var_NoEleMatch_wGwoGSF_Barrel_[10] = tauGammaMoms.
gammaPhiMomIn;
551 var_NoEleMatch_wGwoGSF_Barrel_[12] = tauGammaMoms.
gammaEnFracIn;
553 var_NoEleMatch_wGwoGSF_Barrel_[14] = tauVars.
dCrackEta;
556 mvaValue = mva_NoEleMatch_wGwoGSF_BL_->GetClassifier(var_NoEleMatch_wGwoGSF_Barrel_.data());
562 var_NoEleMatch_wGwoGSF_Endcap_[4] = tauVars.
visMassIn;
563 var_NoEleMatch_wGwoGSF_Endcap_[5] = tauGammaMoms.
gammaEtaMomIn;
565 var_NoEleMatch_wGwoGSF_Endcap_[7] = tauGammaMoms.
gammaPhiMomIn;
567 var_NoEleMatch_wGwoGSF_Endcap_[9] = tauGammaMoms.
gammaEnFracIn;
569 var_NoEleMatch_wGwoGSF_Endcap_[11] = tauVars.
dCrackEta;
572 mvaValue = mva_NoEleMatch_wGwoGSF_EC_->GetClassifier(var_NoEleMatch_wGwoGSF_Endcap_.data());
578 var_NoEleMatch_wGwoGSF_VFEndcap_[4] = tauVars.
visMassIn;
579 var_NoEleMatch_wGwoGSF_VFEndcap_[5] = tauGammaMoms.
gammaEtaMomIn;
580 var_NoEleMatch_wGwoGSF_VFEndcap_[6] = tauGammaMoms.
gammaEtaMomOut;
581 var_NoEleMatch_wGwoGSF_VFEndcap_[7] = tauGammaMoms.
gammaPhiMomIn;
582 var_NoEleMatch_wGwoGSF_VFEndcap_[8] = tauGammaMoms.
gammaPhiMomOut;
583 var_NoEleMatch_wGwoGSF_VFEndcap_[9] = tauGammaMoms.
gammaEnFracIn;
584 var_NoEleMatch_wGwoGSF_VFEndcap_[10] = tauGammaMoms.
gammaEnFracOut;
585 var_NoEleMatch_wGwoGSF_VFEndcap_[11] = tauVars.
dCrackEta;
588 mvaValue = mva_NoEleMatch_wGwoGSF_VFEC_->GetClassifier(var_NoEleMatch_wGwoGSF_VFEndcap_.data());
596 var_woGwGSF_Barrel_[4] = elecNumHitsDiffOverSum;
598 var_woGwGSF_Barrel_[6] =
std::min(elecDeltaPinPoutOverPin, 1.
f);
599 var_woGwGSF_Barrel_[7] =
std::min(elecEecalOverPout, 20.
f);
608 var_woGwGSF_Barrel_[16] = tauVars.
visMassIn;
609 var_woGwGSF_Barrel_[17] = tauVars.
dCrackEta;
612 var_woGwGSF_Barrel_[20] = elecVars.
deltaEta;
613 var_woGwGSF_Barrel_[21] = elecVars.
deltaPhi;
616 var_woGwGSF_Barrel_[24] = elecVars.
r9;
619 mvaValue = mva_woGwGSF_BL_->GetClassifier(var_woGwGSF_Barrel_.data());
625 var_woGwGSF_Endcap_[4] = elecNumHitsDiffOverSum;
627 var_woGwGSF_Endcap_[6] = elecVars.
eEcal;
630 var_woGwGSF_Endcap_[9] = tauVars.
visMassIn;
631 var_woGwGSF_Endcap_[10] = tauVars.
dCrackEta;
647 var_woGwGSF_Endcap_[26] = elecVars.
deltaEta;
648 var_woGwGSF_Endcap_[27] = elecVars.
deltaPhi;
652 mvaValue = mva_woGwGSF_EC_->GetClassifier(var_woGwGSF_Endcap_.data());
655 var_woGwGSF_VFEndcap_[1] = elecVars.
gsfNumHits;
658 var_woGwGSF_VFEndcap_[4] = elecNumHitsDiffOverSum;
660 var_woGwGSF_VFEndcap_[6] = elecVars.
eEcal;
663 var_woGwGSF_VFEndcap_[9] = tauVars.
visMassIn;
664 var_woGwGSF_VFEndcap_[10] = tauVars.
dCrackEta;
681 var_woGwGSF_VFEndcap_[27] = elecVars.
deltaEta;
682 var_woGwGSF_VFEndcap_[28] = elecVars.
deltaPhi;
686 mvaValue = mva_woGwGSF_VFEC_->GetClassifier(var_woGwGSF_VFEndcap_.data());
694 var_wGwGSF_Barrel_[4] = elecNumHitsDiffOverSum;
696 var_wGwGSF_Barrel_[6] =
std::min(elecDeltaPinPoutOverPin, 1.
f);
697 var_wGwGSF_Barrel_[7] =
std::min(elecEecalOverPout, 20.
f);
708 var_wGwGSF_Barrel_[18] = tauVars.
visMassIn;
715 var_wGwGSF_Barrel_[25] = tauVars.
dCrackEta;
718 var_wGwGSF_Barrel_[28] = elecVars.
deltaEta;
719 var_wGwGSF_Barrel_[29] = elecVars.
deltaPhi;
726 mvaValue = mva_wGwGSF_BL_->GetClassifier(var_wGwGSF_Barrel_.data());
732 var_wGwGSF_Endcap_[4] = elecNumHitsDiffOverSum;
734 var_wGwGSF_Endcap_[6] = elecVars.
eEcal;
739 var_wGwGSF_Endcap_[11] = tauVars.
visMassIn;
746 var_wGwGSF_Endcap_[18] = tauVars.
dCrackEta;
761 var_wGwGSF_Endcap_[33] = elecVars.
deltaEta;
762 var_wGwGSF_Endcap_[34] = elecVars.
deltaPhi;
766 mvaValue = mva_wGwGSF_EC_->GetClassifier(var_wGwGSF_Endcap_.data());
769 var_wGwGSF_VFEndcap_[1] = elecVars.
gsfNumHits;
772 var_wGwGSF_VFEndcap_[4] = elecNumHitsDiffOverSum;
774 var_wGwGSF_VFEndcap_[6] = elecVars.
eEcal;
779 var_wGwGSF_VFEndcap_[11] = tauVars.
visMassIn;
786 var_wGwGSF_VFEndcap_[18] = tauVars.
dCrackEta;
803 var_wGwGSF_VFEndcap_[35] = elecVars.
deltaEta;
804 var_wGwGSF_VFEndcap_[36] = elecVars.
deltaPhi;
808 mvaValue = mva_wGwGSF_VFEC_->GetClassifier(var_wGwGSF_VFEndcap_.data());
814 template <
class TauType,
class ElectronType>
825 return mvaValue(tauVars, tauGammaVecs, elecVars);
828 template <
class TauType,
class ElectronType>
838 return mvaValue(tauVars, tauGammaVecs, elecVars);
841 template <
class TauType,
class ElectronType>
845 tauVars = getTauVarsTypeSpecific(theTau);
848 <<
"Unsupported TauType used. You must use either reco::PFTau or pat::Tau.";
850 tauVars.
pt = theTau.pt();
854 float signalrad = std::clamp(3.0 /
std::max(1.0, theTau.pt()), 0.05, 0.10);
855 for (
const auto&
gamma : theTau.signalGammaCands()) {
856 float dR =
deltaR(
gamma->p4(), theTau.leadChargedHadrCand()->p4());
858 if (
dR < signalrad) {
859 pfGammaSum +=
gamma->p4();
862 for (
const auto& charged : theTau.signalChargedHadrCands()) {
863 float dR =
deltaR(charged->p4(), theTau.leadChargedHadrCand()->p4());
865 if (
dR < signalrad) {
866 pfChargedSum += charged->p4();
872 if (theTau.leadChargedHadrCand().isNonnull()) {
874 dynamic_cast<const pat::PackedCandidate*>(theTau.leadChargedHadrCand().get());
875 if (packedLeadChCand !=
nullptr) {
880 dynamic_cast<const reco::PFCandidate*>(theTau.leadChargedHadrCand().get());
891 template <
class TauType,
class ElectronType>
895 float signalrad = std::clamp(3.0 /
std::max(1.0, theTau.pt()), 0.05, 0.10);
896 for (
const auto&
gamma : theTau.signalGammaCands()) {
897 float dR =
deltaR(
gamma->p4(), theTau.leadChargedHadrCand()->p4());
899 if (
dR < signalrad) {
914 template <
class TauType,
class ElectronType>
918 elecVars.
eta = theEleRef->eta();
919 elecVars.
phi = theEleRef->phi();
923 float elecEgamma = 0.;
928 pfCluster != pfSuperCluster->clustersEnd();
930 double pfClusterEn = (*pfCluster)->energy();
931 if (pfCluster == pfSuperCluster->clustersBegin())
932 elecEe += pfClusterEn;
934 elecEgamma += pfClusterEn;
942 elecVars.
r9 = theEleRef->r9();
946 elecVars.
pIn =
std::sqrt(theEleRef->trackMomentumAtVtx().Mag2());
947 elecVars.
pOut =
std::sqrt(theEleRef->trackMomentumOut().Mag2());
948 elecVars.
eTotOverPin = (elecVars.
pIn > 0.0) ? ((elecEe + elecEgamma) / elecVars.
pIn) : -0.1;
949 elecVars.
eEcal = theEleRef->ecalEnergy();
951 elecVars.
deltaEta = theEleRef->deltaEtaSeedClusterTrackAtCalo();
952 elecVars.
deltaPhi = theEleRef->deltaPhiSeedClusterTrackAtCalo();
954 elecVars.
deltaEta = theEleRef->deltaEtaEleClusterTrackAtCalo();
955 elecVars.
deltaPhi = theEleRef->deltaPhiEleClusterTrackAtCalo();
967 elecVars.
chi2NormGSF = theEleRef->gsfTrack()->normalizedChi2();
968 elecVars.
gsfNumHits = theEleRef->gsfTrack()->numberOfValidHits();
969 if (theEleRef->gsfTrack()->pt() > 0.) {
970 elecVars.
gsfTrackResol = theEleRef->gsfTrack()->ptError() / theEleRef->gsfTrack()->pt();
978 if (theEleRef->closestCtfTrackRef().
isNonnull()) {
979 elecVars.
chi2NormKF = theEleRef->closestCtfTrackRef()->normalizedChi2();
980 elecVars.
kfNumHits = theEleRef->closestCtfTrackRef()->numberOfValidHits();
984 if (isPhase2_ && !theEleRef->isEB()) {
986 getElecVarsHGCalTypeSpecific(theEleRef, elecVars);
989 <<
"Unsupported ElectronType used. You must use either reco::GsfElectron or pat::Electron.";
995 template <
class TauType,
class ElectronType>
1006 std::array<double, 18> fill_cPhi() {
1007 constexpr
double pi =
M_PI;
1008 std::array<double, 18> cPhi;
1011 for (
unsigned iCrack = 1; iCrack <= 17; ++iCrack) {
1012 cPhi[iCrack] = cPhi[0] - 2. * iCrack *
pi / 18;
1017 const std::array<double, 18> cPhi = fill_cPhi();
1021 template <
class TauType,
class ElectronType>
1025 constexpr
double pi =
M_PI;
1028 constexpr
double delta_cPhi = 0.00638;
1030 double retVal = 99.;
1032 if (
eta >= -1.47464 &&
eta <= 1.47464) {
1045 if (
phi < cPhi[17] ||
phi >= cPhi[0]) {
1048 retVal = minimum(
phi - cPhi[0],
phi - cPhi[17] - 2. *
pi);
1052 unsigned iCrack = 16;
1054 if (
phi < cPhi[iCrack]) {
1055 retVal = minimum(
phi - cPhi[iCrack + 1],
phi - cPhi[iCrack]);
1072 template <
class TauType,
class ElectronType>
1077 double cracks[5] = {0., 4.44747e-01, 7.92824e-01, 1.14090e+00, 1.47464e+00};
1079 double retVal = 99.;
1081 for (
int iCrack = 0; iCrack < 5; ++iCrack) {
1082 double d = minimum(
eta - cracks[iCrack],
eta + cracks[iCrack]);
1092 template <
class TauType,
class ElectronType>
1098 tauVars.
phi = theTau.
phi();
1100 if (!usePhiAtEcalEntranceExtrapolation_) {
1103 float etaAtECal = 0.;
1104 float phiAtECal = 0.;
1105 bool success = energyWeightedEtaAndPhiAtECal(theTau, etaAtECal, phiAtECal);
1107 tauVars.
phi = phiAtECal;
1112 if (
std::abs(theTau.
eta()) >= ecalBarrelEndcapEtaBorder_) {
1120 float phiAtECal = 0.;
1121 float etaAtECal = 0.;
1122 success = energyWeightedEtaAndPhiAtECal(theTau, etaAtECal, phiAtECal);
1142 template <
class TauType,
class ElectronType>
1148 float sumEtaTimesEnergy = 0.;
1149 float sumPhiTimesEnergy = 0.;
1150 float sumEnergy = 0.;
1151 tauVars.
phi = theTau.
phi();
1153 bool isFromPFCands =
1156 for (
const auto& candidate : theTau.
signalCands()) {
1157 float etaAtECalEntrance = candidate->eta();
1158 float phiAtECalEntrance = candidate->phi();
1160 if (isFromPFCands) {
1161 const reco::PFCandidate* pfCandidate = static_cast<const reco::PFCandidate*>(candidate.get());
1163 if (!usePhiAtEcalEntranceExtrapolation_) {
1169 phiAtECalEntrance = posAtECal.phi();
1172 track = getTrackFromPFCand(pfCandidate);
1177 etaAtECalEntrance = posAtECal.eta();
1178 phiAtECalEntrance = posAtECal.phi();
1180 track = candidate->bestTrack();
1182 if (
track !=
nullptr) {
1188 sumEtaTimesEnergy += etaAtECalEntrance * candidate->energy();
1189 sumPhiTimesEnergy += phiAtECalEntrance * candidate->energy();
1190 sumEnergy += candidate->energy();
1192 if (sumEnergy > 0.) {
1194 tauVars.
phi = sumPhiTimesEnergy / sumEnergy;
1198 for (
const auto& candidate : theTau.
signalCands()) {
1199 float etaAtECalEntrance = candidate->eta();
1201 if (isFromPFCands) {
1202 const reco::PFCandidate* pfCandidate = static_cast<const reco::PFCandidate*>(candidate.get());
1204 if (
std::abs(theTau.
eta()) >= ecalBarrelEndcapEtaBorder_) {
1208 etaAtECalEntrance = posAtECal.eta();
1211 track = getTrackFromPFCand(pfCandidate);
1216 etaAtECalEntrance = posAtECal.eta();
1218 track = candidate->bestTrack();
1220 if (
track !=
nullptr) {
1226 sumEtaTimesEnergy += etaAtECalEntrance * candidate->energy();
1227 sumEnergy += candidate->energy();
1229 if (sumEnergy > 0.) {
1232 if (isFromPFCands) {
1240 if (patLeadCandiate !=
nullptr) {
1248 if (isFromPFCands) {
1256 if (patLeadCandiate !=
nullptr) {
1260 (1. - patLeadCandiate->
hcalFraction()) / patLeadCandiate->
p();
1269 template <
class TauType,
class ElectronType>
1273 if (!(electronIds_.find(
"hgcElectronID:sigmaUU") != electronIds_.end() &&
1274 electronIds_.at(
"hgcElectronID:sigmaUU").isValid()))
1277 elecVars.
hgcalSigmaUU = (*electronIds_.at(
"hgcElectronID:sigmaUU"))[theEleRef];
1278 elecVars.
hgcalSigmaVV = (*electronIds_.at(
"hgcElectronID:sigmaVV"))[theEleRef];
1279 elecVars.
hgcalSigmaEE = (*electronIds_.at(
"hgcElectronID:sigmaEE"))[theEleRef];
1280 elecVars.
hgcalSigmaPP = (*electronIds_.at(
"hgcElectronID:sigmaPP"))[theEleRef];
1281 elecVars.
hgcalNLayers = (*electronIds_.at(
"hgcElectronID:nLayers"))[theEleRef];
1282 elecVars.
hgcalFirstLayer = (*electronIds_.at(
"hgcElectronID:firstLayer"))[theEleRef];
1283 elecVars.
hgcalLastLayer = (*electronIds_.at(
"hgcElectronID:lastLayer"))[theEleRef];
1284 elecVars.
hgcalLayerEfrac10 = (*electronIds_.at(
"hgcElectronID:layerEfrac10"))[theEleRef];
1285 elecVars.
hgcalLayerEfrac90 = (*electronIds_.at(
"hgcElectronID:layerEfrac90"))[theEleRef];
1286 elecVars.
hgcalEcEnergyEE = (*electronIds_.at(
"hgcElectronID:ecEnergyEE"))[theEleRef];
1287 elecVars.
hgcalEcEnergyFH = (*electronIds_.at(
"hgcElectronID:ecEnergyFH"))[theEleRef];
1288 elecVars.
hgcalMeasuredDepth = (*electronIds_.at(
"hgcElectronID:measuredDepth"))[theEleRef];
1289 elecVars.
hgcalExpectedDepth = (*electronIds_.at(
"hgcElectronID:expectedDepth"))[theEleRef];
1290 elecVars.
hgcalExpectedSigma = (*electronIds_.at(
"hgcElectronID:expectedSigma"))[theEleRef];
1295 template <
class TauType,
class ElectronType>
1299 if (!theEleRef->hasUserFloat(
"hgcElectronID:sigmaUU"))
1302 elecVars.
hgcalSigmaUU = theEleRef->userFloat(
"hgcElectronID:sigmaUU");
1303 elecVars.
hgcalSigmaVV = theEleRef->userFloat(
"hgcElectronID:sigmaVV");
1304 elecVars.
hgcalSigmaEE = theEleRef->userFloat(
"hgcElectronID:sigmaEE");
1305 elecVars.
hgcalSigmaPP = theEleRef->userFloat(
"hgcElectronID:sigmaPP");
1306 elecVars.
hgcalNLayers = theEleRef->userFloat(
"hgcElectronID:nLayers");
1307 elecVars.
hgcalFirstLayer = theEleRef->userFloat(
"hgcElectronID:firstLayer");
1308 elecVars.
hgcalLastLayer = theEleRef->userFloat(
"hgcElectronID:lastLayer");
1309 elecVars.
hgcalLayerEfrac10 = theEleRef->userFloat(
"hgcElectronID:layerEfrac10");
1310 elecVars.
hgcalLayerEfrac90 = theEleRef->userFloat(
"hgcElectronID:layerEfrac90");
1311 elecVars.
hgcalEcEnergyEE = theEleRef->userFloat(
"hgcElectronID:ecEnergyEE");
1312 elecVars.
hgcalEcEnergyFH = theEleRef->userFloat(
"hgcElectronID:ecEnergyFH");
1319 template <
class TauType,
class ElectronType>
1325 float sumEnergy = 0.;
1326 for (
const auto& candidate : theTau.
signalCands()) {
1327 float etaAtECalEntrance = candidate->eta();
1328 float phiAtECalEntrance = candidate->phi();
1332 etaAtECalEntrance = posAtECal.eta();
1333 phiAtECalEntrance = posAtECal.phi();
1335 eta += etaAtECalEntrance * candidate->energy();
1336 phi += phiAtECalEntrance * candidate->energy();
1337 sumEnergy += candidate->energy();
1339 if (sumEnergy > 0.) {
1346 return (sumEnergy > 0.);