30 LogTrace(
"GsfElectronAlgo") <<
"========== " << title <<
" ==========";
31 LogTrace(
"GsfElectronAlgo") <<
"Event: " <<
event.id();
32 LogTrace(
"GsfElectronAlgo") <<
"Number of electrons: " << electrons.size();
33 for (
auto const& ele : electrons) {
34 LogTrace(
"GsfElectronAlgo") <<
"Electron with charge, pt, eta, phi: " << ele.charge() <<
" , " << ele.pt()
35 <<
" , " << ele.eta() <<
" , " << ele.phi();
37 LogTrace(
"GsfElectronAlgo") <<
"=================================================";
60 desc.
add<
bool>(
"checkHcalStatus",
true);
63 desc.
add<
bool>(
"gedElectronMode",
true);
64 desc.
add<
bool>(
"useCombinationRegression",
true);
65 desc.
add<
bool>(
"ecalDrivenEcalEnergyFromClassBasedParameterization",
false);
66 desc.
add<
bool>(
"ecalDrivenEcalErrorFromClassBasedParameterization",
false);
67 desc.
add<
bool>(
"applyPreselection",
true);
68 desc.
add<
bool>(
"useEcalRegression",
true);
69 desc.
add<
bool>(
"applyAmbResolution",
false);
70 desc.
add<
bool>(
"useGsfPfRecTracks",
true);
71 desc.
add<
bool>(
"pureTrackerDrivenEcalErrorFromSimpleParameterization",
true);
72 desc.
add<
unsigned int>(
"ambSortingStrategy", 1);
73 desc.
add<
unsigned int>(
"ambClustersOverlapStrategy", 1);
74 desc.
add<
bool>(
"addPflowElectrons",
true);
75 desc.
add<
bool>(
"fillConvVtxFitProb",
true);
78 desc.
add<std::vector<std::string>>(
"recHitFlagsToBeExcludedBarrel");
79 desc.
add<std::vector<std::string>>(
"recHitFlagsToBeExcludedEndcaps");
80 desc.
add<std::vector<std::string>>(
"recHitSeverityToBeExcludedBarrel");
81 desc.
add<std::vector<std::string>>(
"recHitSeverityToBeExcludedEndcaps");
88 desc.
add<
bool>(
"useNumCrystals",
true);
89 desc.
add<
double>(
"etMinBarrel", 0.0);
90 desc.
add<
double>(
"etMinEndcaps", 0.11);
91 desc.
add<
double>(
"etMinHcal", 0.0);
92 desc.
add<
double>(
"eMinBarrel", 0.095);
93 desc.
add<
double>(
"eMinEndcaps", 0.0);
94 desc.
add<
double>(
"intRadiusEcalBarrel", 3.0);
95 desc.
add<
double>(
"intRadiusEcalEndcaps", 3.0);
96 desc.
add<
double>(
"intRadiusHcal", 0.15);
97 desc.
add<
double>(
"jurassicWidth", 1.5);
98 desc.
add<
bool>(
"vetoClustered",
false);
101 psd0.
add<
std::string>(
"propagatorAlongTISE",
"PropagatorWithMaterial");
102 psd0.
add<
std::string>(
"propagatorOppositeTISE",
"PropagatorWithMaterialOpposite");
107 desc.
add<
bool>(
"ctfTracksCheck",
true);
110 desc.
add<
double>(
"MaxElePtForOnlyMVA", 50.0);
111 desc.
add<
double>(
"PreSelectMVA", -0.1);
115 psd0.
add<
double>(
"minSCEtBarrel", 0.0);
116 psd0.
add<
double>(
"minSCEtEndcaps", 0.0);
117 psd0.
add<
double>(
"minEOverPBarrel", 0.0);
118 psd0.
add<
double>(
"minEOverPEndcaps", 0.0);
119 psd0.
add<
double>(
"maxEOverPBarrel", 999999999.0);
120 psd0.
add<
double>(
"maxEOverPEndcaps", 999999999.0);
121 psd0.
add<
double>(
"maxDeltaEtaBarrel", 999999999.0);
122 psd0.
add<
double>(
"maxDeltaEtaEndcaps", 999999999.0);
123 psd0.
add<
double>(
"maxDeltaPhiBarrel", 999999999.0);
124 psd0.
add<
double>(
"maxDeltaPhiEndcaps", 999999999.0);
125 psd0.
add<
double>(
"hOverEConeSize", 0.15);
126 psd0.
add<
double>(
"hOverEPtMin", 0.0);
127 psd0.
add<
double>(
"maxHOverEBarrelCone", 999999999.0);
128 psd0.
add<
double>(
"maxHOverEEndcapsCone", 999999999.0);
129 psd0.
add<
double>(
"maxHBarrelCone", 0.0);
130 psd0.
add<
double>(
"maxHEndcapsCone", 0.0);
131 psd0.
add<
double>(
"maxHOverEBarrelTower", 999999999.0);
132 psd0.
add<
double>(
"maxHOverEEndcapsTower", 999999999.0);
133 psd0.
add<
double>(
"maxHBarrelTower", 0.0);
134 psd0.
add<
double>(
"maxHEndcapsTower", 0.0);
135 psd0.
add<
double>(
"maxSigmaIetaIetaBarrel", 999999999.0);
136 psd0.
add<
double>(
"maxSigmaIetaIetaEndcaps", 999999999.0);
137 psd0.
add<
double>(
"maxFbremBarrel", 999999999.0);
138 psd0.
add<
double>(
"maxFbremEndcaps", 999999999.0);
139 psd0.
add<
bool>(
"isBarrel",
false);
140 psd0.
add<
bool>(
"isEndcaps",
false);
141 psd0.
add<
bool>(
"isFiducial",
false);
142 psd0.
add<
bool>(
"seedFromTEC",
true);
143 psd0.
add<
double>(
"maxTIP", 999999999.0);
144 psd0.
add<
double>(
"minMVA", -0.4);
145 psd0.
add<
double>(
"minMvaByPassForIsolated", -0.4);
153 desc.
add<
std::string>(
"superClusterErrorFunction",
"EcalClusterEnergyUncertaintyObjectSpecific");
154 desc.
add<
std::string>(
"crackCorrectionFunction",
"EcalClusterCrackCorrection");
156 desc.
add<
bool>(
"ecalWeightsFromDB",
true);
157 desc.
add<std::vector<std::string>>(
"ecalRefinedRegressionWeightFiles", {})
158 ->setComment(
"if not from DB. Otherwise, keep empty");
159 desc.
add<
bool>(
"combinationWeightsFromDB",
true);
160 desc.
add<std::vector<std::string>>(
"combinationRegressionWeightFile", {})
161 ->setComment(
"if not from DB. Otherwise, keep empty");
164 desc.
add<std::vector<std::string>>(
"ecalRefinedRegressionWeightLabels", {});
165 desc.
add<std::vector<std::string>>(
"combinationRegressionWeightLabels", {});
168 desc.
add<
bool>(
"useIsolationValues",
false);
185 desc.
add<std::vector<std::string>>(
186 "ElecMVAFilesString",
188 "RecoEgamma/ElectronIdentification/data/TMVA_Category_BDTSimpleCat_10_17Feb2011.weights.xml",
189 "RecoEgamma/ElectronIdentification/data/TMVA_Category_BDTSimpleCat_12_17Feb2011.weights.xml",
190 "RecoEgamma/ElectronIdentification/data/TMVA_Category_BDTSimpleCat_20_17Feb2011.weights.xml",
191 "RecoEgamma/ElectronIdentification/data/TMVA_Category_BDTSimpleCat_22_17Feb2011.weights.xml",
193 desc.
add<std::vector<std::string>>(
194 "SoftElecMVAFilesString",
196 "RecoEgamma/ElectronIdentification/data/TMVA_BDTSoftElectrons_7Feb2014.weights.xml",
207 .maxEOverPBarrel = pset.
getParameter<
double>(
"maxEOverPBarrel"),
209 .minEOverPBarrel = pset.
getParameter<
double>(
"minEOverPBarrel"),
210 .minEOverPEndcaps = pset.
getParameter<
double>(
"minEOverPEndcaps"),
211 .maxHOverEBarrelCone = pset.
getParameter<
double>(
"maxHOverEBarrelCone"),
213 .maxHBarrelCone = pset.
getParameter<
double>(
"maxHBarrelCone"),
214 .maxHEndcapsCone = pset.
getParameter<
double>(
"maxHEndcapsCone"),
215 .maxHOverEBarrelTower = pset.
getParameter<
double>(
"maxHOverEBarrelTower"),
217 .maxHBarrelTower = pset.
getParameter<
double>(
"maxHBarrelTower"),
218 .maxHEndcapsTower = pset.
getParameter<
double>(
"maxHEndcapsTower"),
219 .maxDeltaEtaBarrel = pset.
getParameter<
double>(
"maxDeltaEtaBarrel"),
221 .maxDeltaPhiBarrel = pset.
getParameter<
double>(
"maxDeltaPhiBarrel"),
223 .maxSigmaIetaIetaBarrel = pset.
getParameter<
double>(
"maxSigmaIetaIetaBarrel"),
224 .maxSigmaIetaIetaEndcaps = pset.
getParameter<
double>(
"maxSigmaIetaIetaEndcaps"),
225 .maxFbremBarrel = pset.
getParameter<
double>(
"maxFbremBarrel"),
226 .maxFbremEndcaps = pset.
getParameter<
double>(
"maxFbremEndcaps"),
231 .minMvaByPassForIsolated = pset.
getParameter<
double>(
"minMvaByPassForIsolated"),
239 : cutsCfg_(makeCutsConfiguration(cfg.getParameter<
edm::
ParameterSet>(
"preselection"))),
240 cutsCfgPflow_(makeCutsConfiguration(cfg.getParameter<
edm::
ParameterSet>(
"preselectionPflow"))),
241 ecalSeedingParametersChecked_(
false),
280 cfg.
getParameter<
bool>(
"ecalDrivenEcalEnergyFromClassBasedParameterization");
282 cfg.
getParameter<
bool>(
"ecalDrivenEcalErrorFromClassBasedParameterization");
284 cfg.
getParameter<
bool>(
"pureTrackerDrivenEcalErrorFromSimpleParameterization");
317 auto const& flagnamesbarrel = cfg.
getParameter<std::vector<std::string>>(
"recHitFlagsToBeExcludedBarrel");
318 recHitsCfg.recHitFlagsToBeExcludedBarrel = StringToEnumValue<EcalRecHit::Flags>(flagnamesbarrel);
319 auto const& flagnamesendcaps = cfg.
getParameter<std::vector<std::string>>(
"recHitFlagsToBeExcludedEndcaps");
320 recHitsCfg.recHitFlagsToBeExcludedEndcaps = StringToEnumValue<EcalRecHit::Flags>(flagnamesendcaps);
321 auto const& severitynamesbarrel = cfg.
getParameter<std::vector<std::string>>(
"recHitSeverityToBeExcludedBarrel");
322 recHitsCfg.recHitSeverityToBeExcludedBarrel =
323 StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesbarrel);
324 auto const& severitynamesendcaps = cfg.
getParameter<std::vector<std::string>>(
"recHitSeverityToBeExcludedEndcaps");
325 recHitsCfg.recHitSeverityToBeExcludedEndcaps =
326 StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesendcaps);
333 .intRadiusEcalBarrel = cfg.
getParameter<
double>(
"intRadiusEcalBarrel"),
334 .intRadiusEcalEndcaps = cfg.
getParameter<
double>(
"intRadiusEcalEndcaps"),
335 .jurassicWidth = cfg.
getParameter<
double>(
"jurassicWidth"),
338 .etMinEndcaps = cfg.
getParameter<
double>(
"etMinEndcaps"),
341 .useNumCrystals = cfg.
getParameter<
bool>(
"useNumCrystals")};
345 .ecalWeightsFromDB = cfg.
getParameter<
bool>(
"ecalWeightsFromDB"),
346 .ecalRegressionWeightFiles = cfg.
getParameter<std::vector<std::string>>(
"ecalRefinedRegressionWeightFiles"),
348 cfg.
getParameter<std::vector<std::string>>(
"combinationRegressionWeightLabels"),
349 .combinationWeightsFromDB = cfg.
getParameter<
bool>(
"combinationWeightsFromDB"),
350 .combinationRegressionWeightFiles =
351 cfg.
getParameter<std::vector<std::string>>(
"combinationRegressionWeightFile")};
354 algo_ = std::make_unique<GsfElectronAlgo>(
370 consumesCollector());
383 <<
"Cannot check consistency of parameters with ecal seeding ones," 384 <<
" because the original collection of seeds is not any more available.";
393 logElectrons(electrons, event,
"GsfElectronAlgo Info (before preselection)");
397 std::remove_if(electrons.begin(), electrons.end(), [
this](
auto const& ele) {
return !
isPreselected(ele); }),
399 logElectrons(electrons, event,
"GsfElectronAlgo Info (after preselection)");
406 logElectrons(electrons, event,
"GsfElectronAlgo Info (after amb. solving)");
413 if (!pset.
exists(
"SeedConfiguration")) {
418 if (seedConfiguration.
getParameter<
bool>(
"applyHOverECut")) {
423 << seedConfiguration.
getParameter<
double>(
"hOverEConeSize") <<
").";
427 <<
"The max barrel cone H/E is lower than during ecal seeding.";
431 <<
"The max endcaps cone H/E is lower than during ecal seeding.";
437 <<
"The minimum super-cluster Et in barrel is lower than during ecal seeding.";
441 <<
"The minimum super-cluster Et in endcaps is lower than during ecal seeding.";
451 bool ignoreNotPreselected)
const {
464 throw cms::Exception(
"GsfElectronAlgo|UnknownAmbiguitySortingStrategy")
476 for (
auto&
e1 : electrons) {
479 if (gsfPfRecTrack.gsfTrackRef() ==
e1.gsfTrack()) {
481 edm::LogWarning(
"GsfElectronAlgo") <<
"associated gsfPfRecTrack already found";
484 for (
auto const& duplicate : gsfPfRecTrack.convBremGsfPFRecTrackRef()) {
485 e1.addAmbiguousGsfTrack(duplicate->gsfTrackRef());
494 for (
auto e1 = electrons.begin();
e1 != electrons.end(); ++
e1) {
502 LogDebug(
"GsfElectronAlgo") <<
"Blessing electron with E/P " <<
e1->eSuperClusterOverP() <<
", cluster " 503 << scRef1.
get() <<
" & track " <<
e1->gsfTrack().get();
505 for (
auto e2 =
e1 + 1; e2 != electrons.end(); ++e2) {
515 bool sameCluster =
false;
517 sameCluster = (scRef1 == scRef2);
527 throw cms::Exception(
"GsfElectronAlgo|UnknownAmbiguityClustersOverlapStrategy")
533 LogDebug(
"GsfElectronAlgo") <<
"Discarding electron with E/P " << e2->eSuperClusterOverP() <<
", cluster " 534 << scRef2.
get() <<
" and track " << e2->gsfTrack().get();
535 e1->addAmbiguousGsfTrack(e2->gsfTrack());
536 e2->setAmbiguous(
true);
537 }
else if (
e1->gsfTrack() == e2->gsfTrack()) {
538 edm::LogWarning(
"GsfElectronAlgo") <<
"Forgetting electron with E/P " << e2->eSuperClusterOverP()
539 <<
", cluster " << scRef2.
get() <<
" and track " << e2->gsfTrack().get();
540 e2->setAmbiguous(
true);
556 return passmva && passCutBased;
560 return (passCutBased || passPF || passmva);
562 return passCutBased || passPF;
T getParameter(std::string const &) const
void setAmbiguityData(reco::GsfElectronCollection &electrons, edm::Event const &event, bool ignoreNotPreselected=true) const
unsigned ambClustersOverlapStrategy
std::unique_ptr< GsfElectronAlgo > algo_
edm::EDGetTokenT< reco::ConversionCollection > conversions
edm::EDGetTokenT< CaloTowerCollection > hcalTowersTag
edm::EDGetTokenT< reco::GsfPFRecTrackCollection > gsfPfRecTracksTag
std::vector< std::string > ecalRegressionWeightLabels
void checkEcalSeedingParameters(edm::ParameterSet const &)
bool ecalDrivenEcalErrorFromClassBasedParameterization
unsigned ambSortingStrategy
bool useCombinationRegression
bool exists(std::string const ¶meterName) const
checks if a parameter exists
double pt() const final
transverse momentum
bool passingCutBasedPreselection() const
edm::EDGetTokenT< reco::VertexCollection > vtxCollectionTag
bool passingMvaPreselection() const
edm::EDGetTokenT< EcalRecHitCollection > endcapRecHitCollection
std::vector< GsfElectron > GsfElectronCollection
collection of GsfElectron objects
static void fillDescriptions(edm::ConfigurationDescriptions &)
edm::ParameterSet pfIsoVals_
edm::EDGetTokenT< reco::GsfElectronCoreCollection > gsfElectronCores
edm::EDGetTokenT< reco::GsfElectronCollection > pflowGsfElectronsTag
void fillEvent(reco::GsfElectronCollection &electrons, edm::Event &event)
std::vector< std::string > getParameterNamesForType(bool trackiness=true) const
bool isBetterElectron(reco::GsfElectron const &, reco::GsfElectron const &)
bool isInnermostElectron(reco::GsfElectron const &, reco::GsfElectron const &)
#define DEFINE_FWK_MODULE(type)
double maxHOverEBarrelCone
void addDefault(ParameterSetDescription const &psetDescription)
combinationRegressionWeightLabels
edm::EDGetTokenT< reco::BeamSpot > beamSpotTag
bool pureTrackerDrivenEcalErrorFromSimpleParameterization
edm::EDGetTokenT< reco::TrackCollection > ctfTracks
static edm::ParameterSetDescription pSetDescript()
T const * get() const
Returns C++ pointer to the item.
edm::EDGetTokenT< reco::ElectronSeedCollection > seedsTag
ParameterDescriptionBase * add(U const &iLabel, T const &value)
ElectronHcalHelper::Configuration hcalCfg_
ElectronHcalHelper::Configuration hcalCfgPflow_
~GsfElectronBaseProducer() override
bool ecalSeedingParametersChecked_
edm::ParameterSet edIsoVals_
bool ecalDrivenEcalEnergyFromClassBasedParameterization
GsfElectronAlgo::StrategyConfiguration strategyCfg_
void beginEvent(edm::Event &, const edm::EventSetup &)
edm::EDGetTokenT< edm::ValueMap< float > > pfMVA_
float sharedEnergy(reco::CaloCluster const &clu1, reco::CaloCluster const &clu2, EcalRecHitCollection const &barrelRecHits, EcalRecHitCollection const &endcapRecHits)
edm::EDGetTokenT< reco::GsfElectronCollection > previousGsfElectrons
const edm::EDPutTokenT< reco::GsfElectronCollection > electronPutToken_
GsfElectronBaseProducer(const edm::ParameterSet &, const GsfElectronAlgo::HeavyObjectCache *)
GsfElectronAlgo::Tokens inputCfg_
bool isPreselected(reco::GsfElectron const &ele) const
edm::EDGetTokenT< EcalRecHitCollection > barrelRecHitCollection
edm::EDGetTokenT< CaloTowerCollection > hcalTowers
double maxHOverEEndcapsCone
const GsfElectronAlgo::CutsConfiguration cutsCfgPflow_
ParameterSet const & parameterSet(Provenance const &provenance)
edm::OrphanHandle< reco::GsfElectronCollection > orphanHandle_
Provenance const * provenance() const
const GsfElectronAlgo::CutsConfiguration cutsCfg_
bool ecalDrivenSeed() const
bool passingPflowPreselection() const