CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes
PFECALSuperClusterAlgo Class Reference

\ Algorithm for box particle flow super clustering in the ECAL More...

#include <PFECALSuperClusterAlgo.h>

Classes

class  CalibratedPFCluster
 

Public Types

typedef std::shared_ptr< CalibratedPFClusterCalibratedClusterPtr
 
typedef std::vector< CalibratedClusterPtrCalibratedClusterPtrVector
 
enum  clustering_type { kBOX =1, kMustache =2 }
 
enum  energy_weight { kRaw, kCalibratedNoPS, kCalibratedTotal }
 

Public Member Functions

std::unique_ptr< reco::SuperClusterCollection > & getEBOutputSCCollection ()
 
std::unique_ptr< reco::SuperClusterCollection > & getEEOutputSCCollection ()
 
void loadAndSortPFClusters (const edm::Event &evt)
 
 PFECALSuperClusterAlgo ()
 constructor More...
 
void run ()
 
void setClusteringType (clustering_type thetype)
 
void setCrackCorrections (bool applyCrackCorrections)
 
void setDropUnseedable (const bool d)
 
void setEnergyWeighting (energy_weight thetype)
 
void setEtawidthSuperClusterBarrel (double etawidth)
 
void setEtawidthSuperClusterEndcap (double etawidth)
 
void setIsOOTCollection (bool isOOTCollection)
 
void setMajorityFraction (const double f)
 
void setPFClusterCalibration (const std::shared_ptr< PFEnergyCalibration > &)
 
void setPhiwidthSuperClusterBarrel (double phiwidth)
 
void setPhiwidthSuperClusterEndcap (double phiwidth)
 
void setSatelliteMerging (const bool doit)
 
void setSatelliteThreshold (const double t)
 
void setThreshPFClusterBarrel (double thresh)
 
void setThreshPFClusterEndcap (double thresh)
 
void setThreshPFClusterSeedBarrel (double thresh)
 
void setThreshPFClusterSeedEndcap (double thresh)
 
void setThreshSuperClusterEt (double thresh)
 
void setTokens (const edm::ParameterSet &, edm::ConsumesCollector &&)
 
void setUseDynamicDPhi (bool useit)
 
void setUseETForSeeding (bool useET)
 
void setUseRegression (bool useRegression)
 
void setVerbosityLevel (bool verbose)
 
void update (const edm::EventSetup &)
 

Private Member Functions

void buildAllSuperClusters (CalibratedClusterPtrVector &, double seedthresh)
 
void buildSuperCluster (CalibratedClusterPtr &, CalibratedClusterPtrVector &)
 

Private Attributes

CalibratedClusterPtrVector _clustersEB
 
CalibratedClusterPtrVector _clustersEE
 
clustering_type _clustype
 
energy_weight _eweight
 
std::shared_ptr< PFEnergyCalibration_pfEnergyCalibration
 
bool applyCrackCorrections_
 
const EcalRecHitCollectionbarrelRecHits_
 
const reco::BeamSpotbeamSpot_
 
const ESChannelStatuschannelStatus_
 
bool doSatelliteClusterMerge_
 
bool dropUnseedable_
 
const reco::PFCluster::EEtoPSAssociationEEtoPS_
 
const EcalRecHitCollectionendcapRecHits_
 
double etawidthSuperClusterBarrel_
 
double etawidthSuperClusterEndcap_
 
double fractionForMajority_
 
edm::EDGetTokenT< EcalRecHitCollectioninputTagBarrelRecHits_
 
edm::EDGetTokenT< reco::BeamSpotinputTagBeamSpot_
 
edm::EDGetTokenT< EcalRecHitCollectioninputTagEndcapRecHits_
 
edm::EDGetTokenT< edm::View< reco::PFCluster > > inputTagPFClusters_
 
edm::EDGetTokenT< reco::PFCluster::EEtoPSAssociationinputTagPFClustersES_
 
bool isOOTCollection_
 
double phiwidthSuperClusterBarrel_
 
double phiwidthSuperClusterEndcap_
 
std::unique_ptr< SCEnergyCorrectorSemiParmregr_
 
double satelliteThreshold_
 
std::unique_ptr< reco::SuperClusterCollectionsuperClustersEB_
 
std::unique_ptr< reco::SuperClusterCollectionsuperClustersEE_
 
bool threshIsET_
 
double threshPFClusterBarrel_
 
double threshPFClusterEndcap_
 
double threshPFClusterSeedBarrel_
 
double threshPFClusterSeedEndcap_
 
double threshSuperClusterEt_
 
bool useDynamicDPhi_
 
bool useRegression_
 
bool verbose_
 

Detailed Description

\ Algorithm for box particle flow super clustering in the ECAL

Original Author: Nicolas Chanon Additional Authors (Mustache): Y. Gershtein, R. Patel, L. Gray

Date
July 2012

Definition at line 43 of file PFECALSuperClusterAlgo.h.

Member Typedef Documentation

Definition at line 63 of file PFECALSuperClusterAlgo.h.

Definition at line 64 of file PFECALSuperClusterAlgo.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

PFECALSuperClusterAlgo::PFECALSuperClusterAlgo ( )

constructor

Definition at line 126 of file PFECALSuperClusterAlgo.cc.

References setPFClusterCalibration().

126 : beamSpot_(nullptr) { }
const reco::BeamSpot * beamSpot_

Member Function Documentation

void PFECALSuperClusterAlgo::buildAllSuperClusters ( CalibratedClusterPtrVector ,
double  seedthresh 
)
private

Definition at line 268 of file PFECALSuperClusterAlgo.cc.

References buildSuperCluster(), fastPrimaryVertexProducer_cfi::clusters, and threshIsET_.

Referenced by run().

269  {
270  auto seedable = std::bind(isSeed, _1, seedthresh, threshIsET_);
271  // make sure only seeds appear at the front of the list of clusters
272  std::stable_partition(clusters.begin(),clusters.end(),seedable);
273  // in each iteration we are working on a list that is already sorted
274  // in the cluster energy and remains so through each iteration
275  // NB: since clusters is sorted in loadClusters any_of has O(1)
276  // timing until you run out of seeds!
277  while( std::any_of(clusters.cbegin(), clusters.cend(), seedable) ) {
279  }
280 }
void buildSuperCluster(CalibratedClusterPtr &, CalibratedClusterPtrVector &)
void PFECALSuperClusterAlgo::buildSuperCluster ( CalibratedClusterPtr ,
CalibratedClusterPtrVector  
)
private

Definition at line 282 of file PFECALSuperClusterAlgo.cc.

References _clustype, _eweight, _pfEnergyCalibration, reco::SuperCluster::addCluster(), reco::CaloCluster::addHitAndFraction(), reco::SuperCluster::addPreshowerCluster(), applyCrackCorrections_, barrelRecHits_, beamSpot_, channelStatus_, TauDecayModes::dec, doSatelliteClusterMerge_, dropUnseedable_, PFLayer::ECAL_BARREL, PFLayer::ECAL_ENDCAP, EEtoPS_, endcapRecHits_, reco::PFCluster::energy(), reco::CaloCluster::energy(), etawidthSuperClusterBarrel_, etawidthSuperClusterEndcap_, Exception, ESCondObjectContainer< T >::find(), edm::SortedCollection< T, SORT >::find(), fractionForMajority_, edm::Ptr< T >::get(), ESCondObjectContainer< T >::getMap(), PFLayer::HGCAL, mps_fire::i, isOOTCollection_, kCalibratedNoPS, kCalibratedTotal, EcalRecHit::kOutOfTime, kRaw, reco::PFCluster::layer(), PFClusterWidthAlgo::pflowEtaWidth(), PFClusterWidthAlgo::pflowPhiWidth(), phiwidthSuperClusterBarrel_, phiwidthSuperClusterEndcap_, reco::BeamSpot::position(), reco::CaloCluster::position(), RecoTauValidation_cfi::posX, RecoTauValidation_cfi::posY, reco::SuperCluster::preshowerClustersBegin(), reco::SuperCluster::preshowerClustersEnd(), PFLayer::PS1, PFLayer::PS2, ptFast(), reco::SuperCluster::rawEnergy(), reco::PFCluster::recHitFractions(), regr_, satelliteThreshold_, reco::SuperCluster::seed(), reco::CaloCluster::setCorrectedEnergy(), reco::SuperCluster::setEtaWidth(), reco::SuperCluster::setPhiWidth(), reco::SuperCluster::setPreshowerEnergy(), reco::SuperCluster::setPreshowerEnergyPlane1(), reco::SuperCluster::setPreshowerEnergyPlane2(), reco::SuperCluster::setSeed(), sortByKey(), superClustersEB_, superClustersEE_, threshSuperClusterEt_, useDynamicDPhi_, useRegression_, and verbose_.

Referenced by buildAllSuperClusters().

283 {
284  double etawidthSuperCluster = 0.0;
285  double phiwidthSuperCluster = 0.0;
286  bool isEE = false;
287  switch( seed->the_ptr()->layer() )
288  {
290  phiwidthSuperCluster = phiwidthSuperClusterBarrel_;
291  etawidthSuperCluster = etawidthSuperClusterBarrel_;
292  edm::LogInfo("PFClustering") << "Building SC number "
293  << superClustersEB_->size() + 1
294  << " in the ECAL barrel!";
295  break;
296  case PFLayer::HGCAL:
297  case PFLayer::ECAL_ENDCAP:
298 
299  phiwidthSuperCluster = phiwidthSuperClusterEndcap_;
300  etawidthSuperCluster = etawidthSuperClusterEndcap_;
301  edm::LogInfo("PFClustering") << "Building SC number "
302  << superClustersEE_->size() + 1
303  << " in the ECAL endcap!" << std::endl;
304  isEE = true;
305  break;
306  default:
307  break;
308  }
309  auto isClusteredWithSeed = std::bind(isClustered, _1, seed,_clustype,useDynamicDPhi_, etawidthSuperCluster, phiwidthSuperCluster);
310  auto matchesSeedByRecHit = std::bind(isLinkedByRecHit, _1, seed,satelliteThreshold_, fractionForMajority_,0.1,0.2);
311 
312  // this function shuffles the list of clusters into a list
313  // where all clustered sub-clusters are at the front
314  // and returns a pointer to the first unclustered cluster.
315  // The relative ordering of clusters is preserved
316  // (i.e. both resulting sub-lists are sorted by energy).
317  auto not_clustered = std::stable_partition(clusters.begin(),clusters.end(),
318  isClusteredWithSeed);
319  // satellite cluster merging
320  // it was found that large clusters can split!
321  if( doSatelliteClusterMerge_ ) {
322  not_clustered = std::stable_partition(not_clustered,clusters.end(),
323  matchesSeedByRecHit);
324  }
325 
326  if(verbose_) {
327  edm::LogInfo("PFClustering") << "Dumping cluster detail";
328  edm::LogVerbatim("PFClustering")
329  << "\tPassed seed: e = " << seed->energy_nocalib()
330  << " eta = " << seed->eta() << " phi = " << seed->phi()
331  << std::endl;
332  for( auto clus = clusters.cbegin(); clus != not_clustered; ++clus ) {
333  edm::LogVerbatim("PFClustering")
334  << "\t\tClustered cluster: e = " << (*clus)->energy_nocalib()
335  << " eta = " << (*clus)->eta() << " phi = " << (*clus)->phi()
336  << std::endl;
337  }
338  for( auto clus = not_clustered; clus != clusters.end(); ++clus ) {
339  edm::LogVerbatim("PFClustering")
340  << "\tNon-Clustered cluster: e = " << (*clus)->energy_nocalib()
341  << " eta = " << (*clus)->eta() << " phi = " << (*clus)->phi()
342  << std::endl;
343  }
344  }
345 
346  if (not_clustered == clusters.begin()) {
347  if(dropUnseedable_){
348  clusters.erase(clusters.begin());
349  return;
350  }
351  else {
352  throw cms::Exception("PFECALSuperClusterAlgo::buildSuperCluster")
353  << "Cluster is not seedable!" << std::endl
354  << "\tNon-Clustered cluster: e = " << (*not_clustered)->energy_nocalib()
355  << " eta = " << (*not_clustered)->eta() << " phi = " << (*not_clustered)->phi()
356  << std::endl;
357  }
358  }
359 
360  // move the clustered clusters out of available cluster list
361  // and into a temporary vector for building the SC
362  CalibratedClusterPtrVector clustered(clusters.begin(),not_clustered);
363  clusters.erase(clusters.begin(),not_clustered);
364  // need the vector of raw pointers for a PF width class
365  std::vector<const reco::PFCluster*> bare_ptrs;
366  // calculate necessary parameters and build the SC
367  double posX(0), posY(0), posZ(0),
368  corrSCEnergy(0), corrPS1Energy(0), corrPS2Energy(0),
369  ePS1(0), ePS2(0), energyweight(0), energyweighttot(0);
370  std::vector<double> ps1_energies, ps2_energies;
371  int condP1(1), condP2(1);
372  for( auto& clus : clustered ) {
373  ePS1 = ePS2 = 0;
374  energyweight = clus->energy_nocalib();
375  bare_ptrs.push_back(clus->the_ptr().get());
376  // update EE calibrated super cluster energies
377  if( isEE ) {
378  ePS1 = ePS2 = 0;
379  condP1 = condP2 = 1;
380  ps1_energies.clear();
381  ps2_energies.clear();
382  auto ee_key_val =
383  std::make_pair(clus->the_ptr().key(),edm::Ptr<reco::PFCluster>());
384  const auto clustops = std::equal_range(EEtoPS_->begin(),
385  EEtoPS_->end(),
386  ee_key_val,
387  sortByKey);
388  for( auto i_ps = clustops.first; i_ps != clustops.second; ++i_ps) {
389  edm::Ptr<reco::PFCluster> psclus(i_ps->second);
390 
391  auto const& recH_Frac = psclus->recHitFractions();
392 
393  switch( psclus->layer() ) {
394  case PFLayer::PS1:
395  ps1_energies.push_back(psclus->energy());
396  for (auto const& recH : recH_Frac){
397  ESDetId strip1 = recH.recHitRef()->detId();
398  if(strip1 != ESDetId(0)){
400  // getStatusCode() == 1 => dead channel
401  //apply correction if all recHits in dead region
402  if(status_p1->getStatusCode() == 0) condP1 = 0; //active
403  }
404  }
405  break;
406  case PFLayer::PS2:
407  ps2_energies.push_back(psclus->energy());
408  for (auto const& recH : recH_Frac){
409  ESDetId strip2 = recH.recHitRef()->detId();
410  if(strip2 != ESDetId(0)) {
412  if(status_p2->getStatusCode() == 0) condP2 = 0;
413  }
414  }
415  break;
416  default:
417  break;
418  }
419  }
420  if(condP1 == 1) ePS1 = -1.;
421  if(condP2 == 1) ePS2 = -1.;
422  _pfEnergyCalibration->energyEm(*(clus->the_ptr()),
423  ps1_energies,ps2_energies,
424  ePS1,ePS2,
426  }
427 
428  if(ePS1 == -1.) ePS1 = 0;
429  if(ePS2 == -1.) ePS2 = 0;
430 
431  switch( _eweight ) {
432  case kRaw: // energyweight is initialized to raw cluster energy
433  break;
434  case kCalibratedNoPS:
435  energyweight = clus->energy() - ePS1 - ePS2;
436  break;
437  case kCalibratedTotal:
438  energyweight = clus->energy();
439  break;
440  default:
441  break;
442  }
443  const math::XYZPoint& cluspos = clus->the_ptr()->position();
444  posX += energyweight * cluspos.X();
445  posY += energyweight * cluspos.Y();
446  posZ += energyweight * cluspos.Z();
447 
448  energyweighttot += energyweight;
449  corrSCEnergy += clus->energy();
450  corrPS1Energy += ePS1;
451  corrPS2Energy += ePS2;
452  }
453  posX /= energyweighttot;
454  posY /= energyweighttot;
455  posZ /= energyweighttot;
456 
457  // now build the supercluster
458  reco::SuperCluster new_sc(corrSCEnergy,math::XYZPoint(posX,posY,posZ));
459  new_sc.setCorrectedEnergy(corrSCEnergy);
460  new_sc.setSeed(clustered.front()->the_ptr());
461  new_sc.setPreshowerEnergy(corrPS1Energy+corrPS2Energy);
462  new_sc.setPreshowerEnergyPlane1(corrPS1Energy);
463  new_sc.setPreshowerEnergyPlane2(corrPS2Energy);
464  for( const auto& clus : clustered ) {
465  new_sc.addCluster(clus->the_ptr());
466 
467  auto& hits_and_fractions = clus->the_ptr()->hitsAndFractions();
468  for( auto& hit_and_fraction : hits_and_fractions ) {
469  new_sc.addHitAndFraction(hit_and_fraction.first,hit_and_fraction.second);
470  }
471  if( isEE ) {
472  auto ee_key_val =
473  std::make_pair(clus->the_ptr().key(),edm::Ptr<reco::PFCluster>());
474  const auto clustops = std::equal_range(EEtoPS_->begin(),
475  EEtoPS_->end(),
476  ee_key_val,
477  sortByKey);
478  // EE rechits should be uniquely matched to sets of pre-shower
479  // clusters at this point, so we throw an exception if otherwise
480  // now wrapped in EDM debug flags
481  for( auto i_ps = clustops.first; i_ps != clustops.second; ++i_ps) {
482  edm::Ptr<reco::PFCluster> psclus(i_ps->second);
483 #ifdef EDM_ML_DEBUG
484  auto found_pscluster = std::find_if(new_sc.preshowerClustersBegin(),
485  new_sc.preshowerClustersEnd(),
486  [&i_ps](const auto& i) { return i.key() == i_ps->first;});
487  if( found_pscluster == new_sc.preshowerClustersEnd() ) {
488 #endif
489  new_sc.addPreshowerCluster(psclus);
490 #ifdef EDM_ML_DEBUG
491  } else {
492  throw cms::Exception("PFECALSuperClusterAlgo::buildSuperCluster")
493  << "Found a PS cluster matched to more than one EE cluster!"
494  << std::endl << std::hex << psclus.get() << " == "
495  << found_pscluster->get() << std::dec << std::endl;
496  }
497 #endif
498  }
499  }
500  }
501 
502  // calculate linearly weighted cluster widths
503  PFClusterWidthAlgo pfwidth(bare_ptrs);
504  new_sc.setEtaWidth(pfwidth.pflowEtaWidth());
505  new_sc.setPhiWidth(pfwidth.pflowPhiWidth());
506 
507  // cache the value of the raw energy
508  new_sc.rawEnergy();
509 
510  //apply regression energy corrections
511  if( useRegression_ ) {
512  regr_->modifyObject(new_sc);
513  }
514 
515  // save the super cluster to the appropriate list (if it passes the final
516  // Et threshold)
517  //Note that Et is computed here with respect to the beamspot position
518  //in order to be consistent with the cut applied in the
519  //ElectronSeedProducer
520  double scEtBS =
521  ptFast(new_sc.energy(),new_sc.position(),beamSpot_->position());
522 
523  if ( scEtBS > threshSuperClusterEt_ ) {
524  switch( seed->the_ptr()->layer() ) {
526  if(isOOTCollection_) {
527  DetId seedId = new_sc.seed()->seed();
529  if (!seedRecHit->checkFlag(EcalRecHit::kOutOfTime)) break;
530  }
531  superClustersEB_->push_back(new_sc);
532  break;
533  case PFLayer::HGCAL:
534  case PFLayer::ECAL_ENDCAP:
535  if(isOOTCollection_) {
536  DetId seedId = new_sc.seed()->seed();
538  if (!seedRecHit->checkFlag(EcalRecHit::kOutOfTime)) break;
539  }
540  superClustersEE_->push_back(new_sc);
541  break;
542  default:
543  break;
544  }
545  }
546 }
const ESChannelStatus * channelStatus_
std::unique_ptr< SCEnergyCorrectorSemiParm > regr_
std::unique_ptr< reco::SuperClusterCollection > superClustersEB_
const self & getMap() const
std::vector< EcalRecHit >::const_iterator const_iterator
const reco::BeamSpot * beamSpot_
const reco::PFCluster::EEtoPSAssociation * EEtoPS_
double ptFast(const double energy, const math::XYZPoint &position, const math::XYZPoint &origin)
std::unique_ptr< reco::SuperClusterCollection > superClustersEE_
std::vector< CalibratedClusterPtr > CalibratedClusterPtrVector
std::shared_ptr< PFEnergyCalibration > _pfEnergyCalibration
const_iterator find(uint32_t rawId) const
Definition: DetId.h:18
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
bool sortByKey(const EEPSPair &a, const EEPSPair &b)
std::vector< Item >::const_iterator const_iterator
iterator find(key_type k)
const Point & position() const
position
Definition: BeamSpot.h:62
const EcalRecHitCollection * barrelRecHits_
const EcalRecHitCollection * endcapRecHits_
std::unique_ptr<reco::SuperClusterCollection>& PFECALSuperClusterAlgo::getEBOutputSCCollection ( )
inline

Definition at line 110 of file PFECALSuperClusterAlgo.h.

References superClustersEB_.

110 { return superClustersEB_; }
std::unique_ptr< reco::SuperClusterCollection > superClustersEB_
std::unique_ptr<reco::SuperClusterCollection>& PFECALSuperClusterAlgo::getEEOutputSCCollection ( )
inline

Definition at line 112 of file PFECALSuperClusterAlgo.h.

References loadAndSortPFClusters(), run(), and superClustersEE_.

112 { return superClustersEE_; }
std::unique_ptr< reco::SuperClusterCollection > superClustersEE_
void PFECALSuperClusterAlgo::loadAndSortPFClusters ( const edm::Event evt)

Definition at line 176 of file PFECALSuperClusterAlgo.cc.

References _clustersEB, _clustersEE, barrelRecHits_, beamSpot_, fastPrimaryVertexProducer_cfi::clusters, PFLayer::ECAL_BARREL, PFLayer::ECAL_ENDCAP, EEtoPS_, endcapRecHits_, Exception, edm::Event::getByToken(), PFLayer::HGCAL, mps_fire::i, inputTagBarrelRecHits_, inputTagBeamSpot_, inputTagEndcapRecHits_, inputTagPFClusters_, inputTagPFClustersES_, isOOTCollection_, edm::HandleBase::isValid(), LogDebug, edm::Handle< T >::product(), regr_, superClustersEB_, superClustersEE_, threshPFClusterBarrel_, threshPFClusterEndcap_, and useRegression_.

Referenced by getEEOutputSCCollection(), and update().

176  {
177 
178  //load input collections
179  //Load the pfcluster collections
180  edm::Handle<edm::View<reco::PFCluster> > pfclustersHandle;
181  iEvent.getByToken( inputTagPFClusters_, pfclustersHandle );
182 
184  iEvent.getByToken( inputTagPFClustersES_, psAssociationHandle);
185 
186  const PFClusterView& clusters = *pfclustersHandle.product();
187  const reco::PFCluster::EEtoPSAssociation& psclusters = *psAssociationHandle.product();
188 
189  //load BeamSpot
191  iEvent.getByToken( inputTagBeamSpot_, bsHandle);
192  beamSpot_ = bsHandle.product();
193 
194  //initialize regression for this event
195  if (useRegression_) {
196  regr_->setEvent(iEvent);
197  }
198 
199  // reset the system for running
200  superClustersEB_ = std::make_unique<reco::SuperClusterCollection>();
201  _clustersEB.clear();
202  superClustersEE_ = std::make_unique<reco::SuperClusterCollection>();
203  _clustersEE.clear();
204  EEtoPS_ = &psclusters;
205 
206  //Select PF clusters available for the clustering
207  for ( size_t i = 0; i < clusters.size(); ++i ){
208  auto cluster = clusters.ptrAt(i);
209  LogDebug("PFClustering")
210  << "Loading PFCluster i="<<cluster.key()
211  <<" energy="<<cluster->energy()<<std::endl;
212 
213  // protection for sim clusters
214  if( cluster->caloID().detectors() == 0 &&
215  cluster->hitsAndFractions().empty() ) continue;
216 
217  CalibratedClusterPtr calib_cluster(new CalibratedPFCluster(cluster));
218  switch( cluster->layer() ) {
220  if( calib_cluster->energy() > threshPFClusterBarrel_ ) {
221  _clustersEB.push_back(calib_cluster);
222  }
223  break;
224  case PFLayer::HGCAL:
225  case PFLayer::ECAL_ENDCAP:
226  if( calib_cluster->energy() > threshPFClusterEndcap_ ) {
227  _clustersEE.push_back(calib_cluster);
228  }
229  break;
230  default:
231  break;
232  }
233  }
234  // sort full cluster collections by their calibrated energy
235  // this will put all the seeds first by construction
236  std::sort(_clustersEB.begin(), _clustersEB.end(), greaterByEt);
237  std::sort(_clustersEE.begin(), _clustersEE.end(), greaterByEt);
238 
239  // set recHit collections for OOT photons
240  if (isOOTCollection_)
241  {
242  edm::Handle<EcalRecHitCollection> barrelRecHitsHandle;
243  iEvent.getByToken(inputTagBarrelRecHits_, barrelRecHitsHandle);
244  if (!barrelRecHitsHandle.isValid()) {
245  throw cms::Exception("PFECALSuperClusterAlgo")
246  << "If you use OOT photons, need to specify proper barrel rec hit collection";
247  }
248  barrelRecHits_ = barrelRecHitsHandle.product();
249 
250  edm::Handle<EcalRecHitCollection> endcapRecHitsHandle;
251  iEvent.getByToken(inputTagEndcapRecHits_, endcapRecHitsHandle);
252  if (!endcapRecHitsHandle.isValid()) {
253  throw cms::Exception("PFECALSuperClusterAlgo")
254  << "If you use OOT photons, need to specify proper endcap rec hit collection";
255  }
256  endcapRecHits_ = endcapRecHitsHandle.product();
257  }
258 }
#define LogDebug(id)
edm::EDGetTokenT< edm::View< reco::PFCluster > > inputTagPFClusters_
std::unique_ptr< SCEnergyCorrectorSemiParm > regr_
std::unique_ptr< reco::SuperClusterCollection > superClustersEB_
edm::EDGetTokenT< EcalRecHitCollection > inputTagBarrelRecHits_
const reco::BeamSpot * beamSpot_
const reco::PFCluster::EEtoPSAssociation * EEtoPS_
std::unique_ptr< reco::SuperClusterCollection > superClustersEE_
edm::EDGetTokenT< EcalRecHitCollection > inputTagEndcapRecHits_
std::shared_ptr< CalibratedPFCluster > CalibratedClusterPtr
int iEvent
Definition: GenABIO.cc:230
std::vector< std::pair< CaloClusterPtr::key_type, edm::Ptr< PFCluster > > > EEtoPSAssociation
Definition: PFCluster.h:50
CalibratedClusterPtrVector _clustersEE
bool isValid() const
Definition: HandleBase.h:74
edm::EDGetTokenT< reco::PFCluster::EEtoPSAssociation > inputTagPFClustersES_
T const * product() const
Definition: Handle.h:81
edm::EDGetTokenT< reco::BeamSpot > inputTagBeamSpot_
const EcalRecHitCollection * barrelRecHits_
CalibratedClusterPtrVector _clustersEB
const EcalRecHitCollection * endcapRecHits_
void PFECALSuperClusterAlgo::run ( )

Definition at line 260 of file PFECALSuperClusterAlgo.cc.

References _clustersEB, _clustersEE, buildAllSuperClusters(), threshPFClusterSeedBarrel_, and threshPFClusterSeedEndcap_.

Referenced by getEEOutputSCCollection().

260  {
261  // clusterize the EB
263  // clusterize the EE
265 }
void buildAllSuperClusters(CalibratedClusterPtrVector &, double seedthresh)
CalibratedClusterPtrVector _clustersEE
CalibratedClusterPtrVector _clustersEB
void PFECALSuperClusterAlgo::setClusteringType ( clustering_type  thetype)
inline

Definition at line 72 of file PFECALSuperClusterAlgo.h.

References _clustype.

72 { _clustype = thetype; }
void PFECALSuperClusterAlgo::setCrackCorrections ( bool  applyCrackCorrections)
inline
void PFECALSuperClusterAlgo::setDropUnseedable ( const bool  d)
inline
void PFECALSuperClusterAlgo::setEnergyWeighting ( energy_weight  thetype)
inline

Definition at line 74 of file PFECALSuperClusterAlgo.h.

References _eweight.

74 { _eweight = thetype; }
void PFECALSuperClusterAlgo::setEtawidthSuperClusterBarrel ( double  etawidth)
inline

Definition at line 90 of file PFECALSuperClusterAlgo.h.

References etawidthSuperClusterBarrel_.

void PFECALSuperClusterAlgo::setEtawidthSuperClusterEndcap ( double  etawidth)
inline
void PFECALSuperClusterAlgo::setIsOOTCollection ( bool  isOOTCollection)
inline
void PFECALSuperClusterAlgo::setMajorityFraction ( const double  f)
inline

Definition at line 98 of file PFECALSuperClusterAlgo.h.

References f, and fractionForMajority_.

double f[11][100]
void PFECALSuperClusterAlgo::setPFClusterCalibration ( const std::shared_ptr< PFEnergyCalibration > &  calib)

Definition at line 129 of file PFECALSuperClusterAlgo.cc.

References _pfEnergyCalibration, and calib.

Referenced by PFECALSuperClusterAlgo(), and setEtawidthSuperClusterEndcap().

129  {
131 }
MVATrainerComputer * calib
Definition: MVATrainer.cc:64
std::shared_ptr< PFEnergyCalibration > _pfEnergyCalibration
void PFECALSuperClusterAlgo::setPhiwidthSuperClusterBarrel ( double  phiwidth)
inline

Definition at line 89 of file PFECALSuperClusterAlgo.h.

References phiwidthSuperClusterBarrel_.

void PFECALSuperClusterAlgo::setPhiwidthSuperClusterEndcap ( double  phiwidth)
inline

Definition at line 91 of file PFECALSuperClusterAlgo.h.

References phiwidthSuperClusterEndcap_.

void PFECALSuperClusterAlgo::setSatelliteMerging ( const bool  doit)
inline

Definition at line 96 of file PFECALSuperClusterAlgo.h.

References doSatelliteClusterMerge_.

void PFECALSuperClusterAlgo::setSatelliteThreshold ( const double  t)
inline
void PFECALSuperClusterAlgo::setThreshPFClusterBarrel ( double  thresh)
inline
void PFECALSuperClusterAlgo::setThreshPFClusterEndcap ( double  thresh)
inline
void PFECALSuperClusterAlgo::setThreshPFClusterSeedBarrel ( double  thresh)
inline
void PFECALSuperClusterAlgo::setThreshPFClusterSeedEndcap ( double  thresh)
inline
void PFECALSuperClusterAlgo::setThreshSuperClusterEt ( double  thresh)
inline
void PFECALSuperClusterAlgo::setTokens ( const edm::ParameterSet iConfig,
edm::ConsumesCollector &&  cc 
)

Definition at line 133 of file PFECALSuperClusterAlgo.cc.

References edm::ParameterSet::getParameter(), inputTagBarrelRecHits_, inputTagBeamSpot_, inputTagEndcapRecHits_, inputTagPFClusters_, inputTagPFClustersES_, isOOTCollection_, regr_, and useRegression_.

Referenced by setCrackCorrections().

133  {
134 
136  cc.consumes<edm::View<reco::PFCluster> >(iConfig.getParameter<edm::InputTag>("PFClusters"));
140  cc.consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("BeamSpot"));
141 
142  if (useRegression_) {
143  const edm::ParameterSet &regconf = iConfig.getParameter<edm::ParameterSet>("regressionConfig");
144 
145  regr_.reset(new SCEnergyCorrectorSemiParm());
146  regr_->setTokens(regconf, cc);
147  }
148 
149  if (isOOTCollection_) { // OOT photons only
151  cc.consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("barrelRecHits"));
153  cc.consumes<EcalRecHitCollection>(iConfig.getParameter<edm::InputTag>("endcapRecHits"));
154  }
155 }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
T getParameter(std::string const &) const
edm::EDGetTokenT< edm::View< reco::PFCluster > > inputTagPFClusters_
std::unique_ptr< SCEnergyCorrectorSemiParm > regr_
edm::EDGetTokenT< EcalRecHitCollection > inputTagBarrelRecHits_
edm::EDGetTokenT< EcalRecHitCollection > inputTagEndcapRecHits_
std::vector< std::pair< CaloClusterPtr::key_type, edm::Ptr< PFCluster > > > EEtoPSAssociation
Definition: PFCluster.h:50
edm::EDGetTokenT< reco::PFCluster::EEtoPSAssociation > inputTagPFClustersES_
edm::EDGetTokenT< reco::BeamSpot > inputTagBeamSpot_
void PFECALSuperClusterAlgo::setUseDynamicDPhi ( bool  useit)
inline

Definition at line 78 of file PFECALSuperClusterAlgo.h.

References useDynamicDPhi_.

void PFECALSuperClusterAlgo::setUseETForSeeding ( bool  useET)
inline

Definition at line 76 of file PFECALSuperClusterAlgo.h.

References threshIsET_.

void PFECALSuperClusterAlgo::setUseRegression ( bool  useRegression)
inline
void PFECALSuperClusterAlgo::setVerbosityLevel ( bool  verbose)
inline

Definition at line 70 of file PFECALSuperClusterAlgo.h.

References verbose, and verbose_.

void PFECALSuperClusterAlgo::update ( const edm::EventSetup setup)

Definition at line 157 of file PFECALSuperClusterAlgo.cc.

References _pfEnergyCalibration, channelStatus_, edm::EventSetup::get(), loadAndSortPFClusters(), edm::ESHandle< T >::product(), regr_, and useRegression_.

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), Vispa.Gui.VispaWidget.VispaWidget::autosize(), Vispa.Views.LineDecayView.LineDecayContainer::createObject(), Vispa.Views.LineDecayView.LineDecayContainer::deselectAllObjects(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::deselectAllWidgets(), Vispa.Gui.VispaWidget.VispaWidget::enableAutosizing(), progressbar.ProgressBar::finish(), Vispa.Gui.MenuWidget.MenuWidget::leaveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseMoveEvent(), Vispa.Gui.MenuWidget.MenuWidget::mouseMoveEvent(), Vispa.Views.LineDecayView.LineDecayContainer::mouseMoveEvent(), Vispa.Gui.VispaWidgetOwner.VispaWidgetOwner::mouseReleaseEvent(), Vispa.Views.LineDecayView.LineDecayContainer::objectMoved(), MatrixUtil.Steps::overwrite(), Vispa.Views.LineDecayView.LineDecayContainer::removeObject(), Vispa.Gui.ConnectableWidget.ConnectableWidget::removePorts(), Vispa.Gui.FindDialog.FindDialog::reset(), Vispa.Gui.PortConnection.PointToPointConnection::select(), Vispa.Gui.VispaWidget.VispaWidget::select(), Vispa.Views.LineDecayView.LineDecayContainer::select(), setCrackCorrections(), Vispa.Gui.VispaWidget.VispaWidget::setText(), Vispa.Gui.VispaWidget.VispaWidget::setTitle(), Vispa.Gui.ZoomableWidget.ZoomableWidget::setZoom(), Vispa.Views.LineDecayView.LineDecayContainer::setZoom(), and Vispa.Gui.PortConnection.PointToPointConnection::updateConnection().

157  {
158 
159  if (useRegression_) {
160  regr_->setEventSetup(setup);
161  }
162 
163  edm::ESHandle<ESEEIntercalibConstants> esEEInterCalibHandle_;
164  setup.get<ESEEIntercalibConstantsRcd>().get(esEEInterCalibHandle_);
165  _pfEnergyCalibration->initAlphaGamma_ESplanes_fromDB(esEEInterCalibHandle_.product());
166 
167  edm::ESHandle<ESChannelStatus> esChannelStatusHandle_;
168  setup.get<ESChannelStatusRcd>().get(esChannelStatusHandle_);
169  channelStatus_ = esChannelStatusHandle_.product();
170 
171 }
const ESChannelStatus * channelStatus_
std::unique_ptr< SCEnergyCorrectorSemiParm > regr_
std::shared_ptr< PFEnergyCalibration > _pfEnergyCalibration
T get() const
Definition: EventSetup.h:68
T const * product() const
Definition: ESHandle.h:84

Member Data Documentation

CalibratedClusterPtrVector PFECALSuperClusterAlgo::_clustersEB
private

Definition at line 127 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and run().

CalibratedClusterPtrVector PFECALSuperClusterAlgo::_clustersEE
private

Definition at line 128 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and run().

clustering_type PFECALSuperClusterAlgo::_clustype
private

Definition at line 133 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setClusteringType().

energy_weight PFECALSuperClusterAlgo::_eweight
private

Definition at line 134 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setEnergyWeighting().

std::shared_ptr<PFEnergyCalibration> PFECALSuperClusterAlgo::_pfEnergyCalibration
private

Definition at line 132 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), setPFClusterCalibration(), and update().

bool PFECALSuperClusterAlgo::applyCrackCorrections_
private

Definition at line 164 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setCrackCorrections().

const EcalRecHitCollection* PFECALSuperClusterAlgo::barrelRecHits_
private

Definition at line 171 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and loadAndSortPFClusters().

const reco::BeamSpot* PFECALSuperClusterAlgo::beamSpot_
private

Definition at line 124 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and loadAndSortPFClusters().

const ESChannelStatus* PFECALSuperClusterAlgo::channelStatus_
private

Definition at line 125 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and update().

bool PFECALSuperClusterAlgo::doSatelliteClusterMerge_
private

Definition at line 158 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setSatelliteMerging().

bool PFECALSuperClusterAlgo::dropUnseedable_
private

Definition at line 160 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setDropUnseedable().

const reco::PFCluster::EEtoPSAssociation* PFECALSuperClusterAlgo::EEtoPS_
private

Definition at line 131 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and loadAndSortPFClusters().

const EcalRecHitCollection* PFECALSuperClusterAlgo::endcapRecHits_
private

Definition at line 172 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and loadAndSortPFClusters().

double PFECALSuperClusterAlgo::etawidthSuperClusterBarrel_
private

Definition at line 154 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setEtawidthSuperClusterBarrel().

double PFECALSuperClusterAlgo::etawidthSuperClusterEndcap_
private

Definition at line 156 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setEtawidthSuperClusterEndcap().

double PFECALSuperClusterAlgo::fractionForMajority_
private

Definition at line 159 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setMajorityFraction().

edm::EDGetTokenT<EcalRecHitCollection> PFECALSuperClusterAlgo::inputTagBarrelRecHits_
private

Definition at line 169 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setTokens().

edm::EDGetTokenT<reco::BeamSpot> PFECALSuperClusterAlgo::inputTagBeamSpot_
private

Definition at line 122 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setTokens().

edm::EDGetTokenT<EcalRecHitCollection> PFECALSuperClusterAlgo::inputTagEndcapRecHits_
private

Definition at line 170 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setTokens().

edm::EDGetTokenT<edm::View<reco::PFCluster> > PFECALSuperClusterAlgo::inputTagPFClusters_
private

Definition at line 120 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setTokens().

edm::EDGetTokenT<reco::PFCluster::EEtoPSAssociation> PFECALSuperClusterAlgo::inputTagPFClustersES_
private

Definition at line 121 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setTokens().

bool PFECALSuperClusterAlgo::isOOTCollection_
private
double PFECALSuperClusterAlgo::phiwidthSuperClusterBarrel_
private

Definition at line 153 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setPhiwidthSuperClusterBarrel().

double PFECALSuperClusterAlgo::phiwidthSuperClusterEndcap_
private

Definition at line 155 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setPhiwidthSuperClusterEndcap().

std::unique_ptr<SCEnergyCorrectorSemiParm> PFECALSuperClusterAlgo::regr_
private
double PFECALSuperClusterAlgo::satelliteThreshold_
private

Definition at line 159 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setSatelliteThreshold().

std::unique_ptr<reco::SuperClusterCollection> PFECALSuperClusterAlgo::superClustersEB_
private
std::unique_ptr<reco::SuperClusterCollection> PFECALSuperClusterAlgo::superClustersEE_
private
bool PFECALSuperClusterAlgo::threshIsET_
private

Definition at line 165 of file PFECALSuperClusterAlgo.h.

Referenced by buildAllSuperClusters(), and setUseETForSeeding().

double PFECALSuperClusterAlgo::threshPFClusterBarrel_
private

Definition at line 149 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setThreshPFClusterBarrel().

double PFECALSuperClusterAlgo::threshPFClusterEndcap_
private

Definition at line 151 of file PFECALSuperClusterAlgo.h.

Referenced by loadAndSortPFClusters(), and setThreshPFClusterEndcap().

double PFECALSuperClusterAlgo::threshPFClusterSeedBarrel_
private

Definition at line 148 of file PFECALSuperClusterAlgo.h.

Referenced by run(), and setThreshPFClusterSeedBarrel().

double PFECALSuperClusterAlgo::threshPFClusterSeedEndcap_
private

Definition at line 150 of file PFECALSuperClusterAlgo.h.

Referenced by run(), and setThreshPFClusterSeedEndcap().

double PFECALSuperClusterAlgo::threshSuperClusterEt_
private

Definition at line 146 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setThreshSuperClusterEt().

bool PFECALSuperClusterAlgo::useDynamicDPhi_
private

Definition at line 162 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setUseDynamicDPhi().

bool PFECALSuperClusterAlgo::useRegression_
private
bool PFECALSuperClusterAlgo::verbose_
private

Definition at line 140 of file PFECALSuperClusterAlgo.h.

Referenced by buildSuperCluster(), and setVerbosityLevel().