00001 #ifndef RecoEcal_EgammaClusterAlgos_PFECALSuperClusterAlgo_h 00002 #define RecoEcal_EgammaClusterAlgos_PFECALSuperClusterAlgo_h 00003 00004 00005 #include "DataFormats/ParticleFlowReco/interface/PFCluster.h" 00006 #include "DataFormats/ParticleFlowReco/interface/PFClusterFwd.h" 00007 #include "DataFormats/ParticleFlowReco/interface/PFRecHit.h" 00008 #include "DataFormats/ParticleFlowReco/interface/PFRecHitFwd.h" 00009 #include "DataFormats/ParticleFlowReco/interface/PFLayer.h" 00010 #include "DataFormats/Common/interface/OrphanHandle.h" 00011 00012 #include "DataFormats/EgammaReco/interface/SuperCluster.h" 00013 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h" 00014 #include "DataFormats/EgammaReco/interface/BasicCluster.h" 00015 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h" 00016 00017 #include "RecoParticleFlow/PFClusterTools/interface/PFEnergyCalibration.h" 00018 00019 #include "TVector2.h" 00020 00021 #include <string> 00022 #include <vector> 00023 #include <unordered_map> 00024 #include <set> 00025 00026 #include <memory> 00027 00028 class TFile; 00029 class TH2F; 00030 00032 00038 // hash function for edm::Ptr<reco::PFCluster 00039 namespace std { 00040 template <> struct hash<edm::Ptr<reco::PFCluster> > { 00041 size_t operator()(const edm::Ptr<reco::PFCluster> & x) const { 00042 return hash<ptrdiff_t>()((ptrdiff_t)x.get()); 00043 } 00044 }; 00045 } 00046 00047 class PFECALSuperClusterAlgo { 00048 public: 00049 enum clustering_type{kBOX=1, kMustache=2}; 00050 00051 // simple class for associating calibrated energies 00052 class CalibratedPFCluster { 00053 public: 00054 CalibratedPFCluster(const edm::Ptr<reco::PFCluster>& p, 00055 const double ce) : cluptr(p), calib_e(ce) {} 00056 00057 double energy() const { return calib_e; } 00058 double energy_nocalib() const { return cluptr->energy(); } 00059 double eta() const { return cluptr->positionREP().eta(); } 00060 double phi() const { return cluptr->positionREP().phi(); } 00061 00062 void resetCalibratedEnergy(const double ce) { calib_e = ce; } 00063 00064 edm::Ptr<reco::PFCluster> the_ptr() const { return cluptr; } 00065 00066 private: 00067 edm::Ptr<reco::PFCluster> cluptr; 00068 double calib_e; 00069 }; 00070 typedef std::shared_ptr<CalibratedPFCluster> CalibratedClusterPtr; 00071 typedef std::vector<CalibratedClusterPtr> CalibratedClusterPtrVector; 00072 00073 00075 PFECALSuperClusterAlgo(); 00076 00077 void setVerbosityLevel(bool verbose){ verbose_ = verbose;} 00078 00079 void setClusteringType(clustering_type thetype) { _clustype = thetype; } 00080 00081 void setUseDynamicDPhi(bool useit) { _useDynamicDPhi = useit; } 00082 00083 void setThreshPFClusterSeedBarrel(double thresh){ threshPFClusterSeedBarrel_ = thresh;} 00084 void setThreshPFClusterBarrel(double thresh){ threshPFClusterBarrel_ = thresh;} 00085 void setThreshPFClusterSeedEndcap(double thresh){ threshPFClusterSeedEndcap_ = thresh;} 00086 void setThreshPFClusterEndcap(double thresh){ threshPFClusterEndcap_ = thresh;} 00087 00088 void setPhiwidthSuperClusterBarrel( double phiwidth ){ phiwidthSuperClusterBarrel_ = phiwidth;} 00089 void setEtawidthSuperClusterBarrel( double etawidth ){ etawidthSuperClusterBarrel_ = etawidth;} 00090 void setPhiwidthSuperClusterEndcap( double phiwidth ){ phiwidthSuperClusterEndcap_ = phiwidth;} 00091 void setEtawidthSuperClusterEndcap( double etawidth ){ etawidthSuperClusterEndcap_ = etawidth;} 00092 void setUsePS( bool useit ){ usePS = useit; } 00093 00094 void setPFClusterCalibration(const std::shared_ptr<PFEnergyCalibration>&); 00095 00096 void setThreshPFClusterES(double thresh){threshPFClusterES_ = thresh;} 00097 00098 void setSatelliteMerging( const bool doit ) { doSatelliteClusterMerge_ = doit; } 00099 void setSatelliteThreshold( const double t ) { satelliteThreshold_ = t; } 00100 void setMajorityFraction( const double f ) { fractionForMajority_ = f; } 00101 //void setThreshPFClusterMustacheOutBarrel(double thresh){ threshPFClusterMustacheOutBarrel_ = thresh;} 00102 //void setThreshPFClusterMustacheOutEndcap(double thresh){ threshPFClusterMustacheOutEndcap_ = thresh;} 00103 00104 void setCrackCorrections( bool applyCrackCorrections) { applyCrackCorrections_ = applyCrackCorrections;} 00105 00106 std::auto_ptr<reco::SuperClusterCollection> 00107 getEBOutputSCCollection() { return superClustersEB_; } 00108 std::auto_ptr<reco::SuperClusterCollection> 00109 getEEOutputSCCollection() { return superClustersEE_; } 00110 00111 void loadAndSortPFClusters(const edm::View<reco::PFCluster>& ecalclusters, 00112 const edm::View<reco::PFCluster>& psclusters); 00113 00114 void run(); 00115 00116 private: 00117 00118 CalibratedClusterPtrVector _clustersEB; 00119 CalibratedClusterPtrVector _clustersEE; 00120 std::unordered_map<edm::Ptr<reco::PFCluster>, 00121 edm::PtrVector<reco::PFCluster> > _psclustersforee; 00122 std::auto_ptr<reco::SuperClusterCollection> superClustersEB_; 00123 std::auto_ptr<reco::SuperClusterCollection> superClustersEE_; 00124 std::shared_ptr<PFEnergyCalibration> _pfEnergyCalibration; 00125 clustering_type _clustype; 00126 void buildAllSuperClusters(CalibratedClusterPtrVector&, 00127 double seedthresh); 00128 void buildSuperCluster(CalibratedClusterPtr&, 00129 CalibratedClusterPtrVector&); 00130 00131 bool verbose_; 00132 00133 double threshPFClusterSeed_; 00134 double threshPFCluster_; 00135 double etawidthSuperCluster_; 00136 double phiwidthSuperCluster_; 00137 00138 double threshPFClusterSeedBarrel_; 00139 double threshPFClusterBarrel_; 00140 double threshPFClusterSeedEndcap_; 00141 double threshPFClusterEndcap_; 00142 double threshPFClusterES_; 00143 00144 double phiwidthSuperClusterBarrel_; 00145 double etawidthSuperClusterBarrel_; 00146 double phiwidthSuperClusterEndcap_; 00147 double etawidthSuperClusterEndcap_; 00148 00149 bool doSatelliteClusterMerge_; //rock it 00150 double satelliteThreshold_, fractionForMajority_; 00151 00152 bool _useDynamicDPhi; 00153 00154 bool applyCrackCorrections_; 00155 00156 bool usePS; 00157 00158 }; 00159 00160 #endif