CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
PhotonProducer Class Reference
Inheritance diagram for PhotonProducer:
edm::stream::EDProducer<>

Public Member Functions

 PhotonProducer (const edm::ParameterSet &ps)
 
void produce (edm::Event &evt, const edm::EventSetup &es) override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
 EDProducer (const EDProducer &)=delete
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginProcessBlocks () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndProcessBlocks () const final
 
bool hasAbilityToProduceInEndRuns () const final
 
const EDProduceroperator= (const EDProducer &)=delete
 

Private Member Functions

void fillPhotonCollection (edm::Event &evt, edm::EventSetup const &es, const edm::Handle< reco::PhotonCoreCollection > &photonCoreHandle, const CaloTopology *topology, const HcalPFCuts *hcalCuts, const EcalRecHitCollection *ecalBarrelHits, const EcalRecHitCollection *ecalEndcapHits, ElectronHcalHelper const &hcalHelperCone, ElectronHcalHelper const &hcalHelperBc, reco::VertexCollection &pvVertices, reco::PhotonCollection &outputCollection, int &iSC)
 

Private Attributes

edm::EDGetTokenT< EcalRecHitCollectionbarrelEcalHits_
 
const edm::ESGetToken< CaloGeometry, CaloGeometryRecordcaloGeomToken_
 
std::string candidateP4type_
 
bool cutsFromDB_
 
edm::EDGetTokenT< EcalRecHitCollectionendcapEcalHits_
 
std::vector< int > flagsexclEB_
 
std::vector< int > flagsexclEE_
 
edm::EDGetTokenT< HBHERecHitCollectionhbheRecHits_
 
edm::ESGetToken< HcalPFCuts, HcalPFCutsRcdhcalCutsToken_
 
std::unique_ptr< ElectronHcalHelperhcalHelperBc_
 
std::unique_ptr< ElectronHcalHelperhcalHelperCone_
 
bool hcalRun2EffDepth_
 
double highEt_
 
double hOverEConeSize_
 
double minR9Barrel_
 
double minR9Endcap_
 
std::string PhotonCollection_
 
edm::EDGetTokenT< reco::PhotonCoreCollectionphotonCoreProducer_
 
PhotonEnergyCorrector photonEnergyCorrector_
 
PhotonIsolationCalculator photonIsolationCalculator_
 
const PhotonMIPHaloTagger photonMIPHaloTagger_
 
std::unique_ptr< const PhotonMVABasedHaloTaggerphotonMVABasedHaloTagger_ = nullptr
 
PositionCalc posCalculator_
 
std::vector< double > preselCutValuesBarrel_
 
std::vector< double > preselCutValuesEndcap_
 
bool runMIPTagger_
 
bool runMVABasedHaloTagger_
 
std::vector< int > severitiesexclEB_
 
std::vector< int > severitiesexclEE_
 
const edm::ESGetToken< CaloTopology, CaloTopologyRecordtopologyToken_
 
bool usePrimaryVertex_
 
bool validConversions_
 
bool validPixelSeeds_
 
edm::EDGetTokenT< reco::VertexCollectionvertexProducer_
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
using CacheTypes = CacheContexts< T... >
 
using GlobalCache = typename CacheTypes::GlobalCache
 
using HasAbility = AbilityChecker< T... >
 
using InputProcessBlockCache = typename CacheTypes::InputProcessBlockCache
 
using LuminosityBlockCache = typename CacheTypes::LuminosityBlockCache
 
using LuminosityBlockContext = LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCache >
 
using LuminosityBlockSummaryCache = typename CacheTypes::LuminosityBlockSummaryCache
 
using RunCache = typename CacheTypes::RunCache
 
using RunContext = RunContextT< RunCache, GlobalCache >
 
using RunSummaryCache = typename CacheTypes::RunSummaryCache
 

Detailed Description

Author
Nancy Marinelli, U. of Notre Dame, US

Definition at line 48 of file PhotonProducer.cc.

Constructor & Destructor Documentation

◆ PhotonProducer()

PhotonProducer::PhotonProducer ( const edm::ParameterSet ps)

Definition at line 125 of file PhotonProducer.cc.

128  flagsexclEB_{StringToEnumValue<EcalRecHit::Flags>(
129  config.getParameter<std::vector<std::string>>("RecHitFlagToBeExcludedEB"))},
130  flagsexclEE_{StringToEnumValue<EcalRecHit::Flags>(
131  config.getParameter<std::vector<std::string>>("RecHitFlagToBeExcludedEE"))},
132  severitiesexclEB_{StringToEnumValue<EcalSeverityLevel::SeverityLevel>(
133  config.getParameter<std::vector<std::string>>("RecHitSeverityToBeExcludedEB"))},
134  severitiesexclEE_{StringToEnumValue<EcalSeverityLevel::SeverityLevel>(
135  config.getParameter<std::vector<std::string>>("RecHitSeverityToBeExcludedEE"))},
136  photonIsolationCalculator_(config.getParameter<edm::ParameterSet>("isolationSumsCalculatorSet"),
137  flagsexclEB_,
138  flagsexclEE_,
141  consumesCollector()),
142  photonMIPHaloTagger_(config.getParameter<edm::ParameterSet>("mipVariableSet"), consumesCollector()),
143  photonEnergyCorrector_(config, consumesCollector()) {
144  // use configuration file to setup input/output collection names
145 
146  photonCoreProducer_ = consumes<reco::PhotonCoreCollection>(config.getParameter<edm::InputTag>("photonCoreProducer"));
147  barrelEcalHits_ = consumes<EcalRecHitCollection>(config.getParameter<edm::InputTag>("barrelEcalHits"));
148  endcapEcalHits_ = consumes<EcalRecHitCollection>(config.getParameter<edm::InputTag>("endcapEcalHits"));
149  vertexProducer_ = consumes<reco::VertexCollection>(config.getParameter<edm::InputTag>("primaryVertexProducer"));
150  hbheRecHits_ = consumes<HBHERecHitCollection>(config.getParameter<edm::InputTag>("hbheRecHits"));
151  hOverEConeSize_ = config.getParameter<double>("hOverEConeSize");
152  highEt_ = config.getParameter<double>("highEt");
153  // R9 value to decide converted/unconverted
154  minR9Barrel_ = config.getParameter<double>("minR9Barrel");
155  minR9Endcap_ = config.getParameter<double>("minR9Endcap");
156  usePrimaryVertex_ = config.getParameter<bool>("usePrimaryVertex");
157  runMIPTagger_ = config.getParameter<bool>("runMIPTagger");
158  runMVABasedHaloTagger_ = config.getParameter<bool>("runMVABasedHaloTagger");
159 
160  candidateP4type_ = config.getParameter<std::string>("candidateP4type");
161 
162  edm::ParameterSet posCalcParameters = config.getParameter<edm::ParameterSet>("posCalcParameters");
164 
165  //Retrieve HCAL PF thresholds - from config or from DB
166  cutsFromDB_ = config.getParameter<bool>("usePFThresholdsFromDB");
167  if (cutsFromDB_) {
168  hcalCutsToken_ = esConsumes<HcalPFCuts, HcalPFCutsRcd>(edm::ESInputTag("", "withTopo"));
169  }
170 
171  ElectronHcalHelper::Configuration cfgCone, cfgBc;
173  if (cfgCone.hOverEConeSize > 0) {
174  cfgCone.onlyBehindCluster = false;
175  cfgCone.checkHcalStatus = false;
176 
177  cfgCone.hbheRecHits = hbheRecHits_;
178 
179  cfgCone.eThresHB = config.getParameter<EgammaHcalIsolation::arrayHB>("recHitEThresholdHB");
180  cfgCone.maxSeverityHB = config.getParameter<int>("maxHcalRecHitSeverity");
181  cfgCone.eThresHE = config.getParameter<EgammaHcalIsolation::arrayHE>("recHitEThresholdHE");
182  cfgCone.maxSeverityHE = cfgCone.maxSeverityHB;
183  }
184 
185  cfgBc.hOverEConeSize = 0.;
186  cfgBc.onlyBehindCluster = true;
187  cfgBc.checkHcalStatus = false;
188 
189  cfgBc.hbheRecHits = hbheRecHits_;
190 
191  cfgBc.eThresHB = config.getParameter<EgammaHcalIsolation::arrayHB>("recHitEThresholdHB");
192  cfgBc.maxSeverityHB = config.getParameter<int>("maxHcalRecHitSeverity");
193  cfgBc.eThresHE = config.getParameter<EgammaHcalIsolation::arrayHE>("recHitEThresholdHE");
194  cfgBc.maxSeverityHE = cfgBc.maxSeverityHB;
195 
196  hcalHelperCone_ = std::make_unique<ElectronHcalHelper>(cfgCone, consumesCollector());
197  hcalHelperBc_ = std::make_unique<ElectronHcalHelper>(cfgBc, consumesCollector());
198 
199  hcalRun2EffDepth_ = config.getParameter<bool>("hcalRun2EffDepth");
200 
201  //AA
202 
203  //
204 
205  // Parameters for the position calculation:
206  // std::map<std::string,double> providedParameters;
207  // providedParameters.insert(std::make_pair("LogWeighted",config.getParameter<bool>("posCalc_logweight")));
208  //providedParameters.insert(std::make_pair("T0_barl",config.getParameter<double>("posCalc_t0_barl")));
209  //providedParameters.insert(std::make_pair("T0_endc",config.getParameter<double>("posCalc_t0_endc")));
210  //providedParameters.insert(std::make_pair("T0_endcPresh",config.getParameter<double>("posCalc_t0_endcPresh")));
211  //providedParameters.insert(std::make_pair("W0",config.getParameter<double>("posCalc_w0")));
212  //providedParameters.insert(std::make_pair("X0",config.getParameter<double>("posCalc_x0")));
213  //posCalculator_ = PositionCalc(providedParameters);
214  // cut values for pre-selection
215  preselCutValuesBarrel_.push_back(config.getParameter<double>("minSCEtBarrel"));
216  preselCutValuesBarrel_.push_back(config.getParameter<double>("maxHoverEBarrel"));
217  preselCutValuesBarrel_.push_back(config.getParameter<double>("ecalRecHitSumEtOffsetBarrel"));
218  preselCutValuesBarrel_.push_back(config.getParameter<double>("ecalRecHitSumEtSlopeBarrel"));
219  preselCutValuesBarrel_.push_back(config.getParameter<double>("hcalRecHitSumEtOffsetBarrel"));
220  preselCutValuesBarrel_.push_back(config.getParameter<double>("hcalRecHitSumEtSlopeBarrel"));
221  preselCutValuesBarrel_.push_back(config.getParameter<double>("nTrackSolidConeBarrel"));
222  preselCutValuesBarrel_.push_back(config.getParameter<double>("nTrackHollowConeBarrel"));
223  preselCutValuesBarrel_.push_back(config.getParameter<double>("trackPtSumSolidConeBarrel"));
224  preselCutValuesBarrel_.push_back(config.getParameter<double>("trackPtSumHollowConeBarrel"));
225  preselCutValuesBarrel_.push_back(config.getParameter<double>("sigmaIetaIetaCutBarrel"));
226  //
227  preselCutValuesEndcap_.push_back(config.getParameter<double>("minSCEtEndcap"));
228  preselCutValuesEndcap_.push_back(config.getParameter<double>("maxHoverEEndcap"));
229  preselCutValuesEndcap_.push_back(config.getParameter<double>("ecalRecHitSumEtOffsetEndcap"));
230  preselCutValuesEndcap_.push_back(config.getParameter<double>("ecalRecHitSumEtSlopeEndcap"));
231  preselCutValuesEndcap_.push_back(config.getParameter<double>("hcalRecHitSumEtOffsetEndcap"));
232  preselCutValuesEndcap_.push_back(config.getParameter<double>("hcalRecHitSumEtSlopeEndcap"));
233  preselCutValuesEndcap_.push_back(config.getParameter<double>("nTrackSolidConeEndcap"));
234  preselCutValuesEndcap_.push_back(config.getParameter<double>("nTrackHollowConeEndcap"));
235  preselCutValuesEndcap_.push_back(config.getParameter<double>("trackPtSumSolidConeEndcap"));
236  preselCutValuesEndcap_.push_back(config.getParameter<double>("trackPtSumHollowConeEndcap"));
237  preselCutValuesEndcap_.push_back(config.getParameter<double>("sigmaIetaIetaCutEndcap"));
238  //
239 
240  // Register the product
241  produces<reco::PhotonCollection>(PhotonCollection_);
242 }
edm::EDGetTokenT< reco::VertexCollection > vertexProducer_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
std::vector< double > preselCutValuesEndcap_
std::unique_ptr< ElectronHcalHelper > hcalHelperCone_
edm::EDGetTokenT< HBHERecHitCollection > hbheRecHits_
PositionCalc posCalculator_
const edm::ESGetToken< CaloTopology, CaloTopologyRecord > topologyToken_
Definition: config.py:1
PhotonEnergyCorrector photonEnergyCorrector_
edm::EDGetTokenT< HBHERecHitCollection > hbheRecHits
bool runMVABasedHaloTagger_
edm::EDGetTokenT< reco::PhotonCoreCollection > photonCoreProducer_
double hOverEConeSize_
edm::EDGetTokenT< EcalRecHitCollection > endcapEcalHits_
PhotonIsolationCalculator photonIsolationCalculator_
const PhotonMIPHaloTagger photonMIPHaloTagger_
std::unique_ptr< ElectronHcalHelper > hcalHelperBc_
std::vector< int > flagsexclEB_
std::vector< int > flagsexclEE_
std::string candidateP4type_
std::vector< int > severitiesexclEE_
std::vector< int > severitiesexclEB_
std::string PhotonCollection_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
std::vector< double > preselCutValuesBarrel_
edm::ESGetToken< HcalPFCuts, HcalPFCutsRcd > hcalCutsToken_
edm::EDGetTokenT< EcalRecHitCollection > barrelEcalHits_
EgammaHcalIsolation::arrayHB eThresHB
EgammaHcalIsolation::arrayHE eThresHE
std::array< double, 4 > arrayHB
std::array< double, 7 > arrayHE

Member Function Documentation

◆ fillPhotonCollection()

void PhotonProducer::fillPhotonCollection ( edm::Event evt,
edm::EventSetup const &  es,
const edm::Handle< reco::PhotonCoreCollection > &  photonCoreHandle,
const CaloTopology topology,
const HcalPFCuts hcalCuts,
const EcalRecHitCollection ecalBarrelHits,
const EcalRecHitCollection ecalEndcapHits,
ElectronHcalHelper const &  hcalHelperCone,
ElectronHcalHelper const &  hcalHelperBc,
reco::VertexCollection pvVertices,
reco::PhotonCollection outputCollection,
int &  iSC 
)
private

fill shower shape block

fill full5x5 shower shape block

get ecal photon specific corrected energy plus values from regressions and store them in the Photon
Pre-selection loose isolation cuts

Definition at line 336 of file PhotonProducer.cc.

References PhotonEnergyCorrector::calculate(), PhotonIsolationCalculator::calculate(), PositionCalc::Calculate_Location(), caloGeomToken_, candidateP4type_, EcalClusterToolsT< noZS >::covariances(), EgHLTOffHistBins_cfi::e1x5, EcalClusterToolsT< noZS >::e1x5(), reco::Photon::ShowerShape::e1x5, EgHLTOffHistBins_cfi::e2x5, reco::Photon::ShowerShape::e2x5, EcalClusterToolsT< noZS >::e2x5Max(), EcalClusterToolsT< noZS >::e3x3(), reco::Photon::ShowerShape::e3x3, EcalClusterToolsT< noZS >::e5x5(), reco::Photon::ShowerShape::e5x5, electrons_cff::e5x5, DetId::Ecal, reco::Photon::ecal_photons, EcalBarrel, EcalEndcap, EcalPreshower, cosmicPhotonAnalyzer_cfi::eMax, EcalClusterToolsT< noZS >::eMax(), flagsexclEB_, flagsexclEE_, HLT_2024v14_cff::full5x5_sigmaIetaIeta, relativeConstraints::geometry, edm::EventSetup::getData(), ElectronHcalHelper::hcalESum(), reco::Photon::ShowerShape::hcalOverEcal, reco::Photon::ShowerShape::hcalOverEcalBc, ElectronHcalHelper::hcalTowersBehindClusters(), reco::Photon::ShowerShape::hcalTowersBehindClusters, highEt_, hfClusterShapes_cfi::hits, EcalPhiSymFlatTableProducers_cfi::id, PhotonEnergyCorrector::init(), createfilelist::int, EcalClusterToolsT< noZS >::localCovariances(), reco::Photon::ShowerShape::maxEnergyXtal, EgHLTOffEleSelection_cfi::minR9, minR9Barrel_, minR9Endcap_, PhotonMIPHaloTagger::mipCalculate(), gedPhotons_cfi::outputPhotonCollection, MaterialEffects_cfi::photonEnergy, photonEnergyCorrector_, photonIsolationCalculator_, photonMIPHaloTagger_, posCalculator_, reco::Photon::ShowerShape::pre7DepthHcal, preselCutValuesBarrel_, preselCutValuesEndcap_, electrons_cff::r9, reco::Photon::regression1, runMIPTagger_, severitiesexclEB_, severitiesexclEE_, reco::Photon::ShowerShape::sigmaEtaEta, HLT_2024v14_cff::sigmaEtaEta, run3scouting_cff::sigmaIetaIeta, reco::Photon::ShowerShape::sigmaIetaIeta, mathSSE::sqrt(), parallelization::uint, spclusmultinvestigator_cfi::vertexCollection, and L1BJetProducer_cff::vtx.

Referenced by produce().

347  {
348  // get the geometry from the event setup:
349  const CaloGeometry* geometry = &es.getData(caloGeomToken_);
350  const CaloSubdetectorGeometry* subDetGeometry = nullptr;
351  const CaloSubdetectorGeometry* geometryES = geometry->getSubdetectorGeometry(DetId::Ecal, EcalPreshower);
352  const EcalRecHitCollection* hits = nullptr;
353  std::vector<double> preselCutValues;
354  float minR9 = 0;
355 
357 
358  std::vector<int> flags_, severitiesexcl_;
359 
360  for (unsigned int lSC = 0; lSC < photonCoreHandle->size(); lSC++) {
361  reco::PhotonCoreRef coreRef(reco::PhotonCoreRef(photonCoreHandle, lSC));
362  reco::SuperClusterRef scRef = coreRef->superCluster();
363  iSC++;
364 
365  int subdet = scRef->seed()->hitsAndFractions()[0].first.subdetId();
366  subDetGeometry = geometry->getSubdetectorGeometry(DetId::Ecal, subdet);
367 
368  if (subdet == EcalBarrel) {
369  preselCutValues = preselCutValuesBarrel_;
371  hits = ecalBarrelHits;
372  flags_ = flagsexclEB_;
373  severitiesexcl_ = severitiesexclEB_;
374  } else if (subdet == EcalEndcap) {
375  preselCutValues = preselCutValuesEndcap_;
377  hits = ecalEndcapHits;
378  flags_ = flagsexclEE_;
379  severitiesexcl_ = severitiesexclEE_;
380  } else {
381  edm::LogWarning("") << "PhotonProducer: do not know if it is a barrel or endcap SuperCluster";
382  }
383  if (hits == nullptr)
384  continue;
385 
386  // SC energy preselection
387  if (scRef->energy() / cosh(scRef->eta()) <= preselCutValues[0])
388  continue;
389 
390  // recalculate position of seed BasicCluster taking shower depth for unconverted photon
391  math::XYZPoint unconvPos =
392  posCalculator_.Calculate_Location(scRef->seed()->hitsAndFractions(), hits, subDetGeometry, geometryES);
393 
394  float maxXtal = EcalClusterTools::eMax(*(scRef->seed()), &(*hits));
395  //AA
396  //Change these to consider severity level of hits
397  float e1x5 = EcalClusterTools::e1x5(*(scRef->seed()), &(*hits), &(*topology));
398  float e2x5 = EcalClusterTools::e2x5Max(*(scRef->seed()), &(*hits), &(*topology));
399  float e3x3 = EcalClusterTools::e3x3(*(scRef->seed()), &(*hits), &(*topology));
400  float e5x5 = EcalClusterTools::e5x5(*(scRef->seed()), &(*hits), &(*topology));
401  const auto& cov = EcalClusterTools::covariances(*(scRef->seed()), &(*hits), &(*topology), geometry);
402  const auto& locCov = EcalClusterTools::localCovariances(*(scRef->seed()), &(*hits), &(*topology));
403 
404  float sigmaEtaEta = sqrt(cov[0]);
405  float sigmaIetaIeta = sqrt(locCov[0]);
406  float r9 = e3x3 / (scRef->rawEnergy());
407 
408  float full5x5_maxXtal = noZS::EcalClusterTools::eMax(*(scRef->seed()), &(*hits));
409  //AA
410  //Change these to consider severity level of hits
411  float full5x5_e1x5 = noZS::EcalClusterTools::e1x5(*(scRef->seed()), &(*hits), &(*topology));
412  float full5x5_e2x5 = noZS::EcalClusterTools::e2x5Max(*(scRef->seed()), &(*hits), &(*topology));
413  float full5x5_e3x3 = noZS::EcalClusterTools::e3x3(*(scRef->seed()), &(*hits), &(*topology));
414  float full5x5_e5x5 = noZS::EcalClusterTools::e5x5(*(scRef->seed()), &(*hits), &(*topology));
415  const auto& full5x5_cov = noZS::EcalClusterTools::covariances(*(scRef->seed()), &(*hits), &(*topology), geometry);
416  const auto& full5x5_locCov = noZS::EcalClusterTools::localCovariances(*(scRef->seed()), &(*hits), &(*topology));
417 
418  float full5x5_sigmaEtaEta = sqrt(full5x5_cov[0]);
419  float full5x5_sigmaIetaIeta = sqrt(full5x5_locCov[0]);
420 
421  // compute position of ECAL shower
422  math::XYZPoint caloPosition;
423  if (r9 > minR9) {
424  caloPosition = unconvPos;
425  } else {
426  caloPosition = scRef->position();
427  }
428 
430  double photonEnergy = 1.;
431  math::XYZPoint vtx(0., 0., 0.);
432  if (!vertexCollection.empty())
433  vtx = vertexCollection.begin()->position();
434  // compute momentum vector of photon from primary vertex and cluster position
435  math::XYZVector direction = caloPosition - vtx;
436  math::XYZVector momentum = direction.unit();
437 
438  // Create dummy candidate with unit momentum and zero energy to allow setting of all variables. The energy is set for last.
439  math::XYZTLorentzVectorD p4(momentum.x(), momentum.y(), momentum.z(), photonEnergy);
440  reco::Photon newCandidate(p4, caloPosition, coreRef, vtx);
441 
442  // Calculate fiducial flags and isolation variable. Blocked are filled from the isolationCalculator
443  reco::Photon::FiducialFlags fiducialFlags;
444  reco::Photon::IsolationVariables isolVarR03, isolVarR04;
445  photonIsolationCalculator_.calculate(&newCandidate, evt, es, fiducialFlags, isolVarR04, isolVarR03, hcalCuts);
446  newCandidate.setFiducialVolumeFlags(fiducialFlags);
447  newCandidate.setIsolationVariables(isolVarR04, isolVarR03);
448 
450  reco::Photon::ShowerShape showerShape;
451  showerShape.e1x5 = e1x5;
452  showerShape.e2x5 = e2x5;
453  showerShape.e3x3 = e3x3;
454  showerShape.e5x5 = e5x5;
455  showerShape.maxEnergyXtal = maxXtal;
456  showerShape.sigmaEtaEta = sigmaEtaEta;
457  showerShape.sigmaIetaIeta = sigmaIetaIeta;
458  for (uint id = 0; id < showerShape.hcalOverEcal.size(); ++id) {
459  showerShape.hcalOverEcal[id] = hcalHelperCone.hcalESum(*scRef, id + 1, hcalCuts) / scRef->energy();
460  showerShape.hcalOverEcalBc[id] = hcalHelperBc.hcalESum(*scRef, id + 1, hcalCuts) / scRef->energy();
461  }
462  showerShape.hcalTowersBehindClusters = hcalHelperBc.hcalTowersBehindClusters(*scRef);
463  showerShape.pre7DepthHcal = false;
464  newCandidate.setShowerShapeVariables(showerShape);
465 
467  reco::Photon::ShowerShape full5x5_showerShape;
468  full5x5_showerShape.e1x5 = full5x5_e1x5;
469  full5x5_showerShape.e2x5 = full5x5_e2x5;
470  full5x5_showerShape.e3x3 = full5x5_e3x3;
471  full5x5_showerShape.e5x5 = full5x5_e5x5;
472  full5x5_showerShape.maxEnergyXtal = full5x5_maxXtal;
473  full5x5_showerShape.sigmaEtaEta = full5x5_sigmaEtaEta;
474  full5x5_showerShape.sigmaIetaIeta = full5x5_sigmaIetaIeta;
475  for (uint id = 0; id < full5x5_showerShape.hcalOverEcal.size(); ++id) {
476  full5x5_showerShape.hcalOverEcal[id] = hcalHelperCone.hcalESum(*scRef, id + 1, hcalCuts) / full5x5_e5x5;
477  full5x5_showerShape.hcalOverEcalBc[id] = hcalHelperBc.hcalESum(*scRef, id + 1, hcalCuts) / full5x5_e5x5;
478  }
479  full5x5_showerShape.hcalTowersBehindClusters = hcalHelperBc.hcalTowersBehindClusters(*scRef);
480  full5x5_showerShape.pre7DepthHcal = false;
481  newCandidate.full5x5_setShowerShapeVariables(full5x5_showerShape);
482 
485  // Photon candidate takes by default (set in photons_cfi.py) a 4-momentum derived from the ecal photon-specific corrections.
486  photonEnergyCorrector_.calculate(evt, newCandidate, subdet, vertexCollection, es);
487  if (candidateP4type_ == "fromEcalEnergy") {
488  newCandidate.setP4(newCandidate.p4(reco::Photon::ecal_photons));
489  newCandidate.setCandidateP4type(reco::Photon::ecal_photons);
490  } else if (candidateP4type_ == "fromRegression") {
491  newCandidate.setP4(newCandidate.p4(reco::Photon::regression1));
492  newCandidate.setCandidateP4type(reco::Photon::regression1);
493  }
494 
495  // fill MIP Vairables for Halo: Block for MIP are filled from PhotonMIPHaloTagger
496  if (subdet == EcalBarrel && runMIPTagger_) {
497  auto mipVar = photonMIPHaloTagger_.mipCalculate(newCandidate, evt, es);
498  newCandidate.setMIPVariables(mipVar);
499  }
500 
502  bool isLooseEM = true;
503  if (newCandidate.pt() < highEt_) {
504  if (newCandidate.hadronicOverEm() >= preselCutValues[1])
505  isLooseEM = false;
506  if (newCandidate.ecalRecHitSumEtConeDR04() > preselCutValues[2] + preselCutValues[3] * newCandidate.pt())
507  isLooseEM = false;
508  if (newCandidate.hcalTowerSumEtConeDR04() > preselCutValues[4] + preselCutValues[5] * newCandidate.pt())
509  isLooseEM = false;
510  if (newCandidate.nTrkSolidConeDR04() > int(preselCutValues[6]))
511  isLooseEM = false;
512  if (newCandidate.nTrkHollowConeDR04() > int(preselCutValues[7]))
513  isLooseEM = false;
514  if (newCandidate.trkSumPtSolidConeDR04() > preselCutValues[8])
515  isLooseEM = false;
516  if (newCandidate.trkSumPtHollowConeDR04() > preselCutValues[9])
517  isLooseEM = false;
518  if (newCandidate.sigmaIetaIeta() > preselCutValues[10])
519  isLooseEM = false;
520  }
521 
522  if (isLooseEM)
523  outputPhotonCollection.push_back(newCandidate);
524  }
525 }
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 HcalPFCuts *hcalCuts) const
std::vector< double > preselCutValuesEndcap_
std::vector< CaloTowerDetId > hcalTowersBehindClusters
Definition: Photon.h:159
ROOT::Math::LorentzVector< ROOT::Math::PxPyPzE4D< double > > XYZTLorentzVectorD
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:14
static float eMax(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits)
PositionCalc posCalculator_
std::array< float, 7 > hcalOverEcalBc
Definition: Photon.h:158
PhotonEnergyCorrector photonEnergyCorrector_
static std::array< float, 3 > covariances(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, const CaloGeometry *geometry, float w0=4.7)
PhotonIsolationCalculator photonIsolationCalculator_
const PhotonMIPHaloTagger photonMIPHaloTagger_
static std::array< float, 3 > localCovariances(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, float w0=EgammaLocalCovParamDefaults::kRelEnCut, const EcalPFRecHitThresholds *thresholds=nullptr, float multEB=0.0, float multEE=0.0)
reco::Photon::MIPVariables mipCalculate(const reco::Photon &, const edm::Event &, const edm::EventSetup &es) const
std::vector< int > flagsexclEB_
T sqrt(T t)
Definition: SSEVec.h:23
std::vector< int > flagsexclEE_
std::string candidateP4type_
std::vector< int > severitiesexclEE_
static float e2x5Max(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
math::XYZPoint Calculate_Location(const HitsAndFractions &iDetIds, const edm::SortedCollection< HitType > *iRecHits, const CaloSubdetectorGeometry *iSubGeom, const CaloSubdetectorGeometry *iESGeom=nullptr)
Definition: PositionCalc.h:65
void init(const edm::EventSetup &theEventSetup)
std::vector< int > severitiesexclEB_
const edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeomToken_
void calculate(edm::Event &evt, reco::Photon &, int subdet, const reco::VertexCollection &vtxcol, const edm::EventSetup &iSetup)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
std::array< float, 7 > hcalOverEcal
Definition: Photon.h:156
std::vector< double > preselCutValuesBarrel_
static float e3x3(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
Log< level::Warning, false > LogWarning
static float e1x5(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)
static float e5x5(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology)

◆ produce()

void PhotonProducer::produce ( edm::Event evt,
const edm::EventSetup es 
)
override

Definition at line 244 of file PhotonProducer.cc.

References barrelEcalHits_, HLT_2024v14_cff::barrelRecHits, cutsFromDB_, endcapEcalHits_, HLT_2024v14_cff::endcapRecHits, fillPhotonCollection(), edm::Event::getByToken(), edm::EventSetup::getData(), hcalCutsToken_, hcalHelperBc_, hcalHelperCone_, hcalRun2EffDepth_, edm::HandleBase::isValid(), eostools::move(), gedPhotons_cfi::outputPhotonCollection, PhotonCollection_, photonCoreProducer_, edm::Handle< T >::product(), edm::Event::put(), HLT_2024v14_cff::topology, topologyToken_, usePrimaryVertex_, spclusmultinvestigator_cfi::vertexCollection, and vertexProducer_.

244  {
245  HcalPFCuts const* hcalCuts = nullptr;
246  if (cutsFromDB_) {
247  hcalCuts = &theEventSetup.getData(hcalCutsToken_);
248  }
249  using namespace edm;
250  // nEvt_++;
251 
253  auto outputPhotonCollection_p = std::make_unique<reco::PhotonCollection>();
254 
255  // Get the PhotonCore collection
256  bool validPhotonCoreHandle = true;
257  Handle<reco::PhotonCoreCollection> photonCoreHandle;
258  theEvent.getByToken(photonCoreProducer_, photonCoreHandle);
259  if (!photonCoreHandle.isValid()) {
260  edm::LogError("PhotonProducer") << "Error! Can't get the photonCoreProducer";
261  validPhotonCoreHandle = false;
262  }
263 
264  // Get EcalRecHits
265  bool validEcalRecHits = true;
266  Handle<EcalRecHitCollection> barrelHitHandle;
268  theEvent.getByToken(barrelEcalHits_, barrelHitHandle);
269  if (!barrelHitHandle.isValid()) {
270  edm::LogError("PhotonProducer") << "Error! Can't get the barrelEcalHits";
271  validEcalRecHits = false;
272  }
273  if (validEcalRecHits)
274  barrelRecHits = *(barrelHitHandle.product());
275 
276  Handle<EcalRecHitCollection> endcapHitHandle;
277  theEvent.getByToken(endcapEcalHits_, endcapHitHandle);
279  if (!endcapHitHandle.isValid()) {
280  edm::LogError("PhotonProducer") << "Error! Can't get the endcapEcalHits";
281  validEcalRecHits = false;
282  }
283  if (validEcalRecHits)
284  endcapRecHits = *(endcapHitHandle.product());
285 
286  const CaloTopology* topology = &theEventSetup.getData(topologyToken_);
287 
288  // prepare access to hcal data
289  hcalHelperCone_->beginEvent(theEvent, theEventSetup);
290  hcalHelperBc_->beginEvent(theEvent, theEventSetup);
291 
292  // Get the primary event vertex
293  Handle<reco::VertexCollection> vertexHandle;
295  bool validVertex = true;
296  if (usePrimaryVertex_) {
297  theEvent.getByToken(vertexProducer_, vertexHandle);
298  if (!vertexHandle.isValid()) {
299  edm::LogWarning("PhotonProducer") << "Error! Can't get the product primary Vertex Collection "
300  << "\n";
301  validVertex = false;
302  }
303  if (validVertex)
304  vertexCollection = *(vertexHandle.product());
305  }
306 
307  int iSC = 0; // index in photon collection
308  // Loop over barrel and endcap SC collections and fill the photon collection
309  if (validPhotonCoreHandle)
310  fillPhotonCollection(theEvent,
311  theEventSetup,
312  photonCoreHandle,
313  topology,
314  hcalCuts,
315  &barrelRecHits,
316  &endcapRecHits,
318  *hcalHelperBc_,
321  iSC);
322 
323  // put the product in the event
324  edm::LogInfo("PhotonProducer") << " Put in the event " << iSC << " Photon Candidates \n";
325  outputPhotonCollection_p->assign(outputPhotonCollection.begin(), outputPhotonCollection.end());
326 
327  // go back to run2-like 2 effective depths if desired - depth 1 is the normal depth 1, depth 2 is the sum over the rest
328  if (hcalRun2EffDepth_) {
329  for (auto& pho : *outputPhotonCollection_p)
330  pho.hcalToRun2EffDepth();
331  }
332 
333  theEvent.put(std::move(outputPhotonCollection_p), PhotonCollection_);
334 }
edm::EDGetTokenT< reco::VertexCollection > vertexProducer_
T const * product() const
Definition: Handle.h:70
std::unique_ptr< ElectronHcalHelper > hcalHelperCone_
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
const edm::ESGetToken< CaloTopology, CaloTopologyRecord > topologyToken_
Log< level::Error, false > LogError
edm::EDGetTokenT< reco::PhotonCoreCollection > photonCoreProducer_
edm::EDGetTokenT< EcalRecHitCollection > endcapEcalHits_
std::unique_ptr< ElectronHcalHelper > hcalHelperBc_
void fillPhotonCollection(edm::Event &evt, edm::EventSetup const &es, const edm::Handle< reco::PhotonCoreCollection > &photonCoreHandle, const CaloTopology *topology, const HcalPFCuts *hcalCuts, const EcalRecHitCollection *ecalBarrelHits, const EcalRecHitCollection *ecalEndcapHits, ElectronHcalHelper const &hcalHelperCone, ElectronHcalHelper const &hcalHelperBc, reco::VertexCollection &pvVertices, reco::PhotonCollection &outputCollection, int &iSC)
std::string PhotonCollection_
Log< level::Info, false > LogInfo
std::vector< Photon > PhotonCollection
collectin of Photon objects
Definition: PhotonFwd.h:9
edm::ESGetToken< HcalPFCuts, HcalPFCutsRcd > hcalCutsToken_
bool isValid() const
Definition: HandleBase.h:70
HLT enums.
edm::EDGetTokenT< EcalRecHitCollection > barrelEcalHits_
Log< level::Warning, false > LogWarning
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

◆ barrelEcalHits_

edm::EDGetTokenT<EcalRecHitCollection> PhotonProducer::barrelEcalHits_
private

Definition at line 71 of file PhotonProducer.cc.

Referenced by produce().

◆ caloGeomToken_

const edm::ESGetToken<CaloGeometry, CaloGeometryRecord> PhotonProducer::caloGeomToken_
private

Definition at line 75 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ candidateP4type_

std::string PhotonProducer::candidateP4type_
private

Definition at line 111 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ cutsFromDB_

bool PhotonProducer::cutsFromDB_
private

Definition at line 119 of file PhotonProducer.cc.

Referenced by produce().

◆ endcapEcalHits_

edm::EDGetTokenT<EcalRecHitCollection> PhotonProducer::endcapEcalHits_
private

Definition at line 72 of file PhotonProducer.cc.

Referenced by produce().

◆ flagsexclEB_

std::vector<int> PhotonProducer::flagsexclEB_
private

Definition at line 81 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ flagsexclEE_

std::vector<int> PhotonProducer::flagsexclEE_
private

Definition at line 82 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ hbheRecHits_

edm::EDGetTokenT<HBHERecHitCollection> PhotonProducer::hbheRecHits_
private

Definition at line 73 of file PhotonProducer.cc.

◆ hcalCutsToken_

edm::ESGetToken<HcalPFCuts, HcalPFCutsRcd> PhotonProducer::hcalCutsToken_
private

Definition at line 118 of file PhotonProducer.cc.

Referenced by produce().

◆ hcalHelperBc_

std::unique_ptr<ElectronHcalHelper> PhotonProducer::hcalHelperBc_
private

Definition at line 115 of file PhotonProducer.cc.

Referenced by produce().

◆ hcalHelperCone_

std::unique_ptr<ElectronHcalHelper> PhotonProducer::hcalHelperCone_
private

Definition at line 114 of file PhotonProducer.cc.

Referenced by produce().

◆ hcalRun2EffDepth_

bool PhotonProducer::hcalRun2EffDepth_
private

Definition at line 116 of file PhotonProducer.cc.

Referenced by produce().

◆ highEt_

double PhotonProducer::highEt_
private

Definition at line 87 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ hOverEConeSize_

double PhotonProducer::hOverEConeSize_
private

Definition at line 86 of file PhotonProducer.cc.

◆ minR9Barrel_

double PhotonProducer::minR9Barrel_
private

Definition at line 88 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ minR9Endcap_

double PhotonProducer::minR9Endcap_
private

Definition at line 89 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ PhotonCollection_

std::string PhotonProducer::PhotonCollection_
private

Definition at line 69 of file PhotonProducer.cc.

Referenced by produce().

◆ photonCoreProducer_

edm::EDGetTokenT<reco::PhotonCoreCollection> PhotonProducer::photonCoreProducer_
private

Definition at line 70 of file PhotonProducer.cc.

Referenced by produce().

◆ photonEnergyCorrector_

PhotonEnergyCorrector PhotonProducer::photonEnergyCorrector_
private

Definition at line 110 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ photonIsolationCalculator_

PhotonIsolationCalculator PhotonProducer::photonIsolationCalculator_
private

Definition at line 100 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ photonMIPHaloTagger_

const PhotonMIPHaloTagger PhotonProducer::photonMIPHaloTagger_
private

Definition at line 103 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ photonMVABasedHaloTagger_

std::unique_ptr<const PhotonMVABasedHaloTagger> PhotonProducer::photonMVABasedHaloTagger_ = nullptr
private

Definition at line 105 of file PhotonProducer.cc.

◆ posCalculator_

PositionCalc PhotonProducer::posCalculator_
private

Definition at line 97 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ preselCutValuesBarrel_

std::vector<double> PhotonProducer::preselCutValuesBarrel_
private

Definition at line 107 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ preselCutValuesEndcap_

std::vector<double> PhotonProducer::preselCutValuesEndcap_
private

Definition at line 108 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ runMIPTagger_

bool PhotonProducer::runMIPTagger_
private

Definition at line 90 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ runMVABasedHaloTagger_

bool PhotonProducer::runMVABasedHaloTagger_
private

Definition at line 91 of file PhotonProducer.cc.

◆ severitiesexclEB_

std::vector<int> PhotonProducer::severitiesexclEB_
private

Definition at line 83 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ severitiesexclEE_

std::vector<int> PhotonProducer::severitiesexclEE_
private

Definition at line 84 of file PhotonProducer.cc.

Referenced by fillPhotonCollection().

◆ topologyToken_

const edm::ESGetToken<CaloTopology, CaloTopologyRecord> PhotonProducer::topologyToken_
private

Definition at line 76 of file PhotonProducer.cc.

Referenced by produce().

◆ usePrimaryVertex_

bool PhotonProducer::usePrimaryVertex_
private

Definition at line 95 of file PhotonProducer.cc.

Referenced by produce().

◆ validConversions_

bool PhotonProducer::validConversions_
private

Definition at line 93 of file PhotonProducer.cc.

◆ validPixelSeeds_

bool PhotonProducer::validPixelSeeds_
private

Definition at line 99 of file PhotonProducer.cc.

◆ vertexProducer_

edm::EDGetTokenT<reco::VertexCollection> PhotonProducer::vertexProducer_
private

Definition at line 74 of file PhotonProducer.cc.

Referenced by produce().