45 const auto v = position - origin;
53 else if (step ==
"oot")
55 else if (step ==
"ootfinal")
57 else if (step ==
"tmp")
61 <<
" reconstructStep " << step <<
" is invalid, the options are: tmp, final,oot or ootfinal" << std::endl;
101 if (not pfEg.label().empty())
109 if (not hcTow.label().empty())
110 hcalTowers_ = consumes<CaloTowerCollection>(hcTow);
129 const std::vector<std::string> flagnamesEB =
130 config.
getParameter<std::vector<std::string>>(
"RecHitFlagToBeExcludedEB");
132 const std::vector<std::string> flagnamesEE =
133 config.
getParameter<std::vector<std::string>>(
"RecHitFlagToBeExcludedEE");
135 flagsexclEB_ = StringToEnumValue<EcalRecHit::Flags>(flagnamesEB);
137 flagsexclEE_ = StringToEnumValue<EcalRecHit::Flags>(flagnamesEE);
139 const std::vector<std::string> severitynamesEB =
140 config.
getParameter<std::vector<std::string>>(
"RecHitSeverityToBeExcludedEB");
142 severitiesexclEB_ = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesEB);
144 const std::vector<std::string> severitynamesEE =
145 config.
getParameter<std::vector<std::string>>(
"RecHitSeverityToBeExcludedEE");
147 severitiesexclEE_ = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesEE);
199 consumesCollector());
237 auto outputPhotonCollection_p = std::make_unique<reco::PhotonCollection>();
241 bool validPhotonCoreHandle =
false;
243 bool validPhotonHandle =
false;
275 validPhotonHandle =
true;
281 if (photonCoreHandle.
isValid()) {
282 validPhotonCoreHandle =
true;
290 bool validEcalRecHits =
true;
294 if (!barrelHitHandle.
isValid()) {
295 throw cms::Exception(
"GEDPhotonProducer") <<
"Error! Can't get the barrelEcalHits";
302 if (!endcapHitHandle.
isValid()) {
303 throw cms::Exception(
"GEDPhotonProducer") <<
"Error! Can't get the endcapEcalHits";
307 bool validPreshowerRecHits =
true;
311 if (!preshowerHitHandle.
isValid()) {
312 throw cms::Exception(
"GEDPhotonProducer") <<
"Error! Can't get the preshowerEcalHits";
314 if (validPreshowerRecHits)
315 preshowerRecHits = *(preshowerHitHandle.
product());
321 if (!pfEGCandidateHandle.
isValid()) {
322 throw cms::Exception(
"GEDPhotonProducer") <<
"Error! Can't get the pfEgammaCandidates";
333 throw cms::Exception(
"GEDPhotonProducer") <<
"Error! Can't get the pfCandidates";
363 bool validVertex =
true;
367 throw cms::Exception(
"GEDPhotonProducer") <<
"Error! Can't get the product primary Vertex Collection";
385 if (validPhotonCoreHandle)
396 outputPhotonCollection,
408 outputPhotonCollection,
410 phoChargedIsolationMap,
411 phoNeutralHadronIsolationMap,
412 phoPhotonIsolationMap,
413 phoChargedWorstVtxIsoMap,
414 phoChargedWorstVtxGeomVetoIsoMap,
415 phoChargedPFPVIsoMap,
416 phoPFECALClusIsolationMap,
417 phoPFHCALClusIsolationMap);
420 edm::LogInfo(
"GEDPhotonProducer") <<
" Put in the event " << iSC <<
" Photon Candidates \n";
421 outputPhotonCollection_p->assign(outputPhotonCollection.begin(), outputPhotonCollection.end());
427 auto pfEGCandToPhotonMap_p = std::make_unique<edm::ValueMap<reco::PhotonRef>>();
429 unsigned nObj = pfEGCandidateHandle->size();
430 std::vector<reco::PhotonRef>
values(nObj);
432 for (
unsigned int lCand = 0; lCand < nObj; lCand++) {
436 for (
unsigned int lSC = 0; lSC < photonOrphHandle->size(); lSC++) {
439 if (pfScRef != scRef)
441 values[lCand] = photonRef;
445 filler.insert(pfEGCandidateHandle, values.begin(), values.end());
464 std::vector<double> preselCutValues;
465 std::vector<int> flags_, severitiesexcl_;
467 for (
unsigned int lSC = 0; lSC < photonCoreHandle->size(); lSC++) {
475 DetId::Detector thedet = scRef->seed()->hitsAndFractions()[0].first.det();
476 int subdet = scRef->seed()->hitsAndFractions()[0].first.subdetId();
479 hits = ecalBarrelHits;
484 hits = ecalEndcapHits;
493 edm::LogWarning(
"") <<
"GEDPhotonProducer: do not know if it is a barrel or endcap SuperCluster: " << thedet
499 ptFast(parentSCRef->energy(), parentSCRef->position(),
math::XYZPoint(0, 0, 0)) <= preselCutValues[0])
506 std::vector<CaloTowerDetId> TowersBehindClus;
507 float hcalDepth1OverEcalBc, hcalDepth2OverEcalBc;
508 hcalDepth1OverEcalBc = hcalDepth2OverEcalBc = 0.f;
509 bool invalidHcal =
false;
515 HoE1 = towerIso1.
getTowerESum(&(*scRef)) / scRef->energy();
516 HoE2 = towerIso2.
getTowerESum(&(*scRef)) / scRef->energy();
520 TowersBehindClus = towerIsoBehindClus.
towersOf(*scRef);
521 hcalDepth1OverEcalBc = towerIsoBehindClus.
getDepth1HcalESum(TowersBehindClus) / scRef->energy();
522 hcalDepth2OverEcalBc = towerIsoBehindClus.
getDepth2HcalESum(TowersBehindClus) / scRef->energy();
524 if (
checkHcalStatus_ && hcalDepth1OverEcalBc == 0 && hcalDepth2OverEcalBc == 0) {
525 invalidHcal = !towerIsoBehindClus.
hasActiveHcal(TowersBehindClus);
536 float e2x5 = (hits !=
nullptr ? EcalClusterTools::e2x5Max(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
537 float e3x3 = (hits !=
nullptr ? EcalClusterTools::e3x3(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
538 float e5x5 = (hits !=
nullptr ? EcalClusterTools::e5x5(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
539 std::vector<float> cov =
540 (hits !=
nullptr ? EcalClusterTools::covariances(*(scRef->seed()), &(*hits), &(*topology),
geometry)
541 : std::vector<float>({0.f, 0.f, 0.f}));
542 std::vector<float> locCov =
543 (hits !=
nullptr ? EcalClusterTools::localCovariances(*(scRef->seed()), &(*hits), &(*topology))
544 : std::vector<float>({0.f, 0.f, 0.f}));
547 float sigmaIetaIeta =
sqrt(locCov[0]);
560 std::vector<float> full5x5_cov =
562 : std::vector<float>({0.f, 0.f, 0.f}));
563 std::vector<float> full5x5_locCov =
565 : std::vector<float>({0.f, 0.f, 0.f}));
567 float full5x5_sigmaEtaEta =
sqrt(full5x5_cov[0]);
576 if (!vertexCollection.empty())
577 vtx = vertexCollection.begin()->position();
596 newCandidate.setFiducialVolumeFlags(fiducialFlags);
597 newCandidate.setIsolationVariables(isolVarR04, isolVarR03);
603 showerShape.
e3x3 = e3x3;
604 showerShape.
e5x5 = e5x5;
616 const float sep = locCov[1];
619 showerShape.
e2nd = (hits !=
nullptr ? EcalClusterTools::e2nd(*(scRef->seed()), &(*hits)) : 0.
f);
620 showerShape.
eTop = (hits !=
nullptr ? EcalClusterTools::eTop(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
621 showerShape.
eLeft = (hits !=
nullptr ? EcalClusterTools::eLeft(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
622 showerShape.
eRight = (hits !=
nullptr ? EcalClusterTools::eRight(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
623 showerShape.
eBottom = (hits !=
nullptr ? EcalClusterTools::eBottom(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
624 showerShape.
e1x3 = (hits !=
nullptr ? EcalClusterTools::e1x3(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
625 showerShape.
e2x2 = (hits !=
nullptr ? EcalClusterTools::e2x2(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
626 showerShape.
e2x5Max = (hits !=
nullptr ? EcalClusterTools::e2x5Max(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
628 (hits !=
nullptr ? EcalClusterTools::e2x5Left(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
630 (hits !=
nullptr ? EcalClusterTools::e2x5Right(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
631 showerShape.
e2x5Top = (hits !=
nullptr ? EcalClusterTools::e2x5Top(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
633 (hits !=
nullptr ? EcalClusterTools::e2x5Bottom(*(scRef->seed()), &(*hits), &(*topology)) : 0.
f);
635 Cluster2ndMoments clus2ndMoments = EcalClusterTools::cluster2ndMoments(*(scRef->seed()), *hits);
647 const float sigmaRR = toolsforES.eseffsirir(*scRef);
649 newCandidate.setShowerShapeVariables(showerShape);
654 int nSaturatedXtals = 0;
655 bool isSeedSaturated =
false;
656 if (hits !=
nullptr) {
657 const auto hitsAndFractions = scRef->hitsAndFractions();
658 for (
auto&& hitFractionPair : hitsAndFractions) {
662 if (
ecalRecHit->checkFlag(EcalRecHit::Flags::kSaturated)) {
665 isSeedSaturated =
true;
671 newCandidate.setSaturationInfo(saturationInfo);
675 full5x5_showerShape.
e1x5 = full5x5_e1x5;
676 full5x5_showerShape.
e2x5 = full5x5_e2x5;
677 full5x5_showerShape.
e3x3 = full5x5_e3x3;
678 full5x5_showerShape.
e5x5 = full5x5_e5x5;
680 full5x5_showerShape.
sigmaEtaEta = full5x5_sigmaEtaEta;
683 const float full5x5_spp = (!
edm::isFinite(full5x5_locCov[2]) ? 0. :
sqrt(full5x5_locCov[2]));
684 const float full5x5_sep = full5x5_locCov[1];
688 full5x5_showerShape.
eTop =
690 full5x5_showerShape.
eLeft =
692 full5x5_showerShape.
eRight =
696 full5x5_showerShape.
e1x3 =
698 full5x5_showerShape.
e2x2 =
716 full5x5_showerShape.
smMajor = 0.f;
717 full5x5_showerShape.
smMinor = 0.f;
718 full5x5_showerShape.
smAlpha = 0.f;
722 newCandidate.full5x5_setShowerShapeVariables(full5x5_showerShape);
746 newCandidate.setP4(
p4);
750 fiducialFlags.
isEE =
true;
751 newCandidate.setFiducialVolumeFlags(fiducialFlags);
763 newCandidate.setMIPVariables(mipVar);
767 bool isLooseEM =
true;
768 if (newCandidate.pt() <
highEt_) {
769 if (newCandidate.hadronicOverEm() >= preselCutValues[1])
771 if (newCandidate.ecalRecHitSumEtConeDR04() > preselCutValues[2] + preselCutValues[3] * newCandidate.pt())
773 if (newCandidate.hcalTowerSumEtConeDR04() > preselCutValues[4] + preselCutValues[5] * newCandidate.pt())
775 if (newCandidate.nTrkSolidConeDR04() >
int(preselCutValues[6]))
777 if (newCandidate.nTrkHollowConeDR04() >
int(preselCutValues[7]))
779 if (newCandidate.trkSumPtSolidConeDR04() > preselCutValues[8])
781 if (newCandidate.trkSumPtHollowConeDR04() > preselCutValues[9])
783 if (newCandidate.sigmaIetaIeta() > preselCutValues[10])
788 outputPhotonCollection.push_back(newCandidate);
809 std::vector<double> preselCutValues;
811 for (
unsigned int lSC = 0; lSC < photonHandle->size(); lSC++) {
815 DetId::Detector thedet = scRef->seed()->hitsAndFractions()[0].first.det();
816 int subdet = scRef->seed()->hitsAndFractions()[0].first.subdetId();
824 edm::LogWarning(
"") <<
"GEDPhotonProducer: do not know if it is a barrel or endcap SuperCluster" << thedet <<
' ' 830 ptFast(parentSCRef->energy(), parentSCRef->position(),
math::XYZPoint(0, 0, 0)) <= preselCutValues[0])
888 outputPhotonCollection.push_back(newCandidate);
edm::InputTag photonProducer_
void setPflowIsolationVariables(const PflowIsolationVariables &pfisol)
Set Particle Flow Isolation variables.
T getParameter(std::string const &) const
PhotonEnergyCorrector * thePhotonEnergyCorrector_
PhotonMIPHaloTagger * thePhotonMIPHaloTagger_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
void calculate(const reco::Photon *, const edm::Event &, const edm::EventSetup &es, reco::Photon::FiducialFlags &phofid, reco::Photon::IsolationVariables &phoisolR03, reco::Photon::IsolationVariables &phoisolR04) const
bool isNonnull() const
Checks for non-null.
edm::EDGetTokenT< reco::PFCandidateCollection > pfCandidates_
edm::ESHandle< CaloGeometry > theCaloGeom_
std::vector< CaloTowerDetId > hcalTowersBehindClusters
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
void setCandidateP4type(const P4type type)
void beginRun(edm::Run const &r, edm::EventSetup const &es) final
edm::EDGetTokenT< CaloTowerCollection > hcalTowers_
isolationSumsCalculatorSet
CaloTopology const * topology(0)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
void MIPcalculate(const reco::Photon *, const edm::Event &, const edm::EventSetup &es, reco::Photon::MIPVariables &mipId)
void produce(edm::Event &evt, const edm::EventSetup &es) override
float hcalDepth2OverEcalBc
~GEDPhotonProducer() override
bool exists(std::string const ¶meterName) const
checks if a parameter exists
std::vector< int > flagsexclEB_
float chargedHadronWorstVtxGeomVetoIso
std::vector< Vertex > VertexCollection
collection of Vertex objects
edm::EDGetTokenT< EcalRecHitCollection > endcapEcalHits_
float chargedHadronWorstVtxIso
constexpr bool isFinite(T x)
PhotonIsolationCalculator * thePhotonIsolationCalculator_
std::vector< int > severitiesexclEE_
std::unique_ptr< ModifyObjectValueBase > & gedRegression()
double ptFast(const double energy, const math::XYZPoint &position, const math::XYZPoint &origin)
std::string photonCollection_
bool hasActiveHcal(const reco::SuperCluster &sc) const
RecoStepInfo(const std::string &recoStep)
edm::ESHandle< CaloTopology > theCaloTopo_
void setTowerCollection(const CaloTowerCollection *towercollection)
edm::EDGetTokenT< edm::ValueMap< float > > phoChargedPFPVIsoToken_
edm::EDGetTokenT< EcalRecHitCollection > barrelEcalHits_
PositionCalc posCalculator_
edm::EDGetTokenT< edm::ValueMap< float > > phoChargedWorstVtxGeomVetoIsoToken_
double getDepth1HcalESum(const reco::SuperCluster &sc) const
edm::EDGetTokenT< edm::ValueMap< float > > phoChargedIsolationToken_
void setup(const edm::ParameterSet &conf, std::vector< int > const &flagsEB_, std::vector< int > const &flagsEE_, std::vector< int > const &severitiesEB_, std::vector< int > const &severitiesEE_, edm::ConsumesCollector &&iC)
void setPflowIDVariables(const PflowIDVariables &pfid)
std::vector< int > flagsexclEE_
edm::EDGetTokenT< reco::PhotonCoreCollection > photonCoreProducerT_
edm::EDGetTokenT< edm::ValueMap< float > > phoPFHCALClusIsolationToken_
void init(const edm::EventSetup &theEventSetup)
void setup(const edm::ParameterSet &conf, edm::ConsumesCollector &&iC)
double getTowerESum(const reco::Candidate *cand, const std::vector< CaloTowerDetId > *detIdToExclude=0) const
edm::EDGetTokenT< reco::PFCandidateCollection > pfEgammaCandidates_
std::vector< int > severitiesexclEB_
const_iterator end() const
void calculate(edm::Event &evt, reco::Photon &, int subdet, const reco::VertexCollection &vtxcol, const edm::EventSetup &iSetup)
edm::EDGetTokenT< edm::ValueMap< float > > phoNeutralHadronIsolationToken_
DetId seed() const
return DetId of seed
GEDPhotonProducer(const edm::ParameterSet &ps)
float hcalDepth1OverEcalBc
edm::EDGetTokenT< edm::ValueMap< float > > phoChargedWorstVtxIsoToken_
T const * product() const
std::vector< double > preselCutValuesBarrel_
edm::EDGetTokenT< reco::PhotonCollection > photonProducerT_
XYZVectorD XYZVector
spatial vector with cartesian internal representation
XYZPointD XYZPoint
point in space with cartesian internal representation
std::vector< Photon > PhotonCollection
collectin of Photon objects
std::vector< double > preselCutValuesEndcap_
const LorentzVector & p4(P4type type) const
std::string candidateP4type_
void fillPhotonCollection(edm::Event &evt, edm::EventSetup const &es, const edm::Handle< reco::PhotonCoreCollection > &photonCoreHandle, const CaloTopology *topology, const EcalRecHitCollection *ecalBarrelHits, const EcalRecHitCollection *ecalEndcapHits, const EcalRecHitCollection *preshowerHits, const edm::Handle< CaloTowerCollection > &hcalTowersHandle, const reco::VertexCollection &pvVertices, reco::PhotonCollection &outputCollection, int &iSC)
edm::EDGetTokenT< edm::ValueMap< float > > phoPhotonIsolationToken_
void endRun(edm::Run const &, edm::EventSetup const &) final
std::vector< CaloTowerDetId > towersOf(const reco::SuperCluster &sc) const
float chargedHadronPFPVIso
double getDepth2HcalESum(const reco::SuperCluster &sc) const
ESHandle< TrackerGeometry > geometry
iterator find(key_type k)
static int position[264][3]
edm::EDGetTokenT< edm::ValueMap< float > > phoPFECALClusIsolationToken_
bool isUninitialized() const
edm::EDGetTokenT< reco::VertexCollection > vertexProducer_
T const * product() const
edm::EDGetTokenT< EcalRecHitCollection > preshowerHits_
void setP4(P4type type, const LorentzVector &p4, float p4Error, bool setToRecoCandidate)
std::string valueMapPFCandPhoton_