56 const std::vector<std::string> flagnamesEB =
57 config.
getParameter<std::vector<std::string> >(
"RecHitFlagToBeExcludedEB");
59 const std::vector<std::string> flagnamesEE =
60 config.
getParameter<std::vector<std::string> >(
"RecHitFlagToBeExcludedEE");
62 flagsexclEB_ = StringToEnumValue<EcalRecHit::Flags>(flagnamesEB);
64 flagsexclEE_ = StringToEnumValue<EcalRecHit::Flags>(flagnamesEE);
66 const std::vector<std::string> severitynamesEB =
67 config.
getParameter<std::vector<std::string> >(
"RecHitSeverityToBeExcludedEB");
69 severitiesexclEB_ = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesEB);
71 const std::vector<std::string> severitynamesEE =
72 config.
getParameter<std::vector<std::string> >(
"RecHitSeverityToBeExcludedEE");
74 severitiesexclEE_ = StringToEnumValue<EcalSeverityLevel::SeverityLevel>(severitynamesEE);
117 isolationSumsCalculatorSet, flagsexclEB_, flagsexclEE_, severitiesexclEB_, severitiesexclEE_, consumesCollector());
131 auto outputPhotonCollection_p = std::make_unique<reco::PhotonCollection>();
134 bool validPhotonCoreHandle =
true;
137 if (!photonCoreHandle.
isValid()) {
138 edm::LogError(
"PhotonProducer") <<
"Error! Can't get the photonCoreProducer";
139 validPhotonCoreHandle =
false;
143 bool validEcalRecHits =
true;
147 if (!barrelHitHandle.
isValid()) {
148 edm::LogError(
"PhotonProducer") <<
"Error! Can't get the barrelEcalHits";
149 validEcalRecHits =
false;
151 if (validEcalRecHits)
152 barrelRecHits = *(barrelHitHandle.
product());
157 if (!endcapHitHandle.
isValid()) {
158 edm::LogError(
"PhotonProducer") <<
"Error! Can't get the endcapEcalHits";
159 validEcalRecHits =
false;
161 if (validEcalRecHits)
162 endcapRecHits = *(endcapHitHandle.
product());
181 bool validVertex =
true;
185 edm::LogWarning(
"PhotonProducer") <<
"Error! Can't get the product primary Vertex Collection " 190 vertexCollection = *(vertexHandle.
product());
195 if (validPhotonCoreHandle)
204 outputPhotonCollection,
209 edm::LogInfo(
"PhotonProducer") <<
" Put in the event " << iSC <<
" Photon Candidates \n";
210 outputPhotonCollection_p->assign(outputPhotonCollection.begin(), outputPhotonCollection.end());
233 std::vector<double> preselCutValues;
238 std::vector<int> flags_, severitiesexcl_;
240 for (
unsigned int lSC = 0; lSC < photonCoreHandle->size(); lSC++) {
245 int subdet = scRef->seed()->hitsAndFractions()[0].first.subdetId();
251 hits = ecalBarrelHits;
257 hits = ecalEndcapHits;
261 edm::LogWarning(
"") <<
"PhotonProducer: do not know if it is a barrel or endcap SuperCluster";
267 if (scRef->energy() / cosh(scRef->eta()) <= preselCutValues[0])
274 double HoE1 = towerIso1.
getTowerESum(&(*scRef)) / scRef->energy();
275 double HoE2 = towerIso2.
getTowerESum(&(*scRef)) / scRef->energy();
279 std::vector<CaloTowerDetId> TowersBehindClus = towerIsoBehindClus.
towersOf(*scRef);
280 float hcalDepth1OverEcalBc = towerIsoBehindClus.
getDepth1HcalESum(TowersBehindClus) / scRef->energy();
281 float hcalDepth2OverEcalBc = towerIsoBehindClus.
getDepth2HcalESum(TowersBehindClus) / scRef->energy();
291 float e2x5 = EcalClusterTools::e2x5Max(*(scRef->seed()), &(*hits), &(*topology));
292 float e3x3 = EcalClusterTools::e3x3(*(scRef->seed()), &(*hits), &(*topology));
293 float e5x5 = EcalClusterTools::e5x5(*(scRef->seed()), &(*hits), &(*topology));
294 std::vector<float> cov = EcalClusterTools::covariances(*(scRef->seed()), &(*hits), &(*topology),
geometry);
295 std::vector<float> locCov = EcalClusterTools::localCovariances(*(scRef->seed()), &(*hits), &(*topology));
298 float sigmaIetaIeta =
sqrt(locCov[0]);
299 float r9 = e3x3 / (scRef->rawEnergy());
308 std::vector<float> full5x5_cov =
310 std::vector<float> full5x5_locCov =
313 float full5x5_sigmaEtaEta =
sqrt(full5x5_cov[0]);
319 caloPosition = unconvPos;
321 caloPosition = scRef->position();
327 if (!vertexCollection.empty())
328 vtx = vertexCollection.begin()->position();
341 newCandidate.setFiducialVolumeFlags(fiducialFlags);
342 newCandidate.setIsolationVariables(isolVarR04, isolVarR03);
348 showerShape.
e3x3 = e3x3;
349 showerShape.
e5x5 = e5x5;
358 newCandidate.setShowerShapeVariables(showerShape);
362 full5x5_showerShape.
e1x5 = full5x5_e1x5;
363 full5x5_showerShape.
e2x5 = full5x5_e2x5;
364 full5x5_showerShape.
e3x3 = full5x5_e3x3;
365 full5x5_showerShape.
e5x5 = full5x5_e5x5;
367 full5x5_showerShape.
sigmaEtaEta = full5x5_sigmaEtaEta;
369 newCandidate.full5x5_setShowerShapeVariables(full5x5_showerShape);
387 newCandidate.setMIPVariables(mipVar);
391 bool isLooseEM =
true;
392 if (newCandidate.pt() <
highEt_) {
393 if (newCandidate.hadronicOverEm() >= preselCutValues[1])
395 if (newCandidate.ecalRecHitSumEtConeDR04() > preselCutValues[2] + preselCutValues[3] * newCandidate.pt())
397 if (newCandidate.hcalTowerSumEtConeDR04() > preselCutValues[4] + preselCutValues[5] * newCandidate.pt())
399 if (newCandidate.nTrkSolidConeDR04() >
int(preselCutValues[6]))
401 if (newCandidate.nTrkHollowConeDR04() >
int(preselCutValues[7]))
403 if (newCandidate.trkSumPtSolidConeDR04() > preselCutValues[8])
405 if (newCandidate.trkSumPtHollowConeDR04() > preselCutValues[9])
407 if (newCandidate.sigmaIetaIeta() > preselCutValues[10])
412 outputPhotonCollection.push_back(newCandidate);
T getParameter(std::string const &) const
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
edm::EDGetTokenT< reco::VertexCollection > vertexProducer_
edm::EDGetTokenT< CaloTowerCollection > hcalTowers_
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
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 edm::Handle< CaloTowerCollection > &hcalTowersHandle, reco::VertexCollection &pvVertices, reco::PhotonCollection &outputCollection, int &iSC, const EcalSeverityLevelAlgo *sevLv)
std::vector< double > preselCutValuesEndcap_
std::vector< CaloTowerDetId > hcalTowersBehindClusters
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
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)
float hcalDepth2OverEcalBc
std::vector< Vertex > VertexCollection
collection of Vertex objects
PositionCalc posCalculator_
PhotonEnergyCorrector photonEnergyCorrector_
edm::EDGetTokenT< reco::PhotonCoreCollection > photonCoreProducer_
PhotonMIPHaloTagger photonMIPHaloTagger_
void setTowerCollection(const CaloTowerCollection *towercollection)
edm::EDGetTokenT< EcalRecHitCollection > endcapEcalHits_
PhotonIsolationCalculator photonIsolationCalculator_
std::vector< int > flagsexclEB_
double getDepth1HcalESum(const reco::SuperCluster &sc) const
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)
std::vector< int > flagsexclEE_
std::string candidateP4type_
std::vector< int > severitiesexclEE_
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
std::vector< int > severitiesexclEB_
std::string PhotonCollection_
void calculate(edm::Event &evt, reco::Photon &, int subdet, const reco::VertexCollection &vtxcol, const edm::EventSetup &iSetup)
float hcalDepth1OverEcalBc
T const * product() const
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 > preselCutValuesBarrel_
std::vector< CaloTowerDetId > towersOf(const reco::SuperCluster &sc) const
double getDepth2HcalESum(const reco::SuperCluster &sc) const
ESHandle< TrackerGeometry > geometry
PhotonProducer(const edm::ParameterSet &ps)
edm::EDGetTokenT< EcalRecHitCollection > barrelEcalHits_
math::XYZPoint Calculate_Location(const HitsAndFractions &iDetIds, const edm::SortedCollection< HitType > *iRecHits, const CaloSubdetectorGeometry *iSubGeom, const CaloSubdetectorGeometry *iESGeom=0)
void produce(edm::Event &evt, const edm::EventSetup &es) override
T const * product() const