Go to the documentation of this file.00001 #ifndef RecoEcal_EgammaClusterAlgos_HybridClusterAlgo_h
00002 #define RecoEcal_EgammaClusterAlgos_HybridClusterAlgo_h
00003
00004 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00005 #include "DataFormats/EgammaReco/interface/BasicClusterFwd.h"
00006 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00007 #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h"
00008 #include "RecoCaloTools/Navigation/interface/EcalBarrelNavigator.h"
00009 #include "DataFormats/EcalRecHit/interface/EcalRecHit.h"
00010 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00011 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00012 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00013 #include "Geometry/CaloTopology/interface/EcalBarrelHardcodedTopology.h"
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015 #include "RecoEcal/EgammaCoreTools/interface/EcalEtaPhiRegion.h"
00016 #include "RecoEcal/EgammaCoreTools/interface/PositionCalc.h"
00017 #include "RecoEcal/EgammaCoreTools/interface/BremRecoveryPhiRoadAlgo.h"
00018 #include "RecoEcal/EgammaCoreTools/interface/SuperClusterShapeAlgo.h"
00019 #include "RecoLocalCalo/EcalRecAlgos/interface/EcalSeverityLevelAlgo.h"
00020
00021 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00022
00023 #include <vector>
00024 #include <set>
00025
00026
00027 struct less_mag : public std::binary_function<EcalRecHit, EcalRecHit, bool> {
00028 bool operator()(EcalRecHit x, EcalRecHit y) { return x.energy() > y.energy() ; }
00029 };
00030
00031 class HybridClusterAlgo
00032 {
00033 private:
00034
00035 typedef math::XYZPoint Point;
00036
00037
00038 double eb_st;
00039
00040
00041
00042
00043 int phiSteps_;
00044
00045
00046 double et25(EcalBarrelNavigator &navigator,
00047 const EcalRecHitCollection *hits,
00048 const CaloSubdetectorGeometry *geometry);
00049
00050
00051 BremRecoveryPhiRoadAlgo *phiRoadAlgo_;
00052
00053
00054 double eThres_;
00055 double eThresA_;
00056 double eThresB_;
00057
00058
00059 double Eseed;
00060
00061
00062 double Ewing;
00063
00064
00065 bool dynamicPhiRoad_;
00066
00067
00068 bool dynamicEThres_;
00069
00070
00071
00072
00073
00074
00075 const EcalRecHitCollection *recHits_;
00076
00077
00078 EcalBarrelHardcodedTopology *topo_;
00079
00080
00081
00082
00083 std::set<DetId> useddetids;
00084
00085
00086 std::vector<EcalRecHit> seeds;
00087
00088
00089 std::vector<reco::BasicCluster> seedClus_;
00090
00091
00092 std::map<int, std::vector<reco::BasicCluster> > clustered_;
00093
00094
00095 int debugLevel_;
00096
00097
00098 PositionCalc posCalculator_;
00099
00100
00101 std::vector<int> v_chstatus_;
00102
00103
00104 std::vector<int> v_severitylevel_;
00105 float severityRecHitThreshold_;
00106 EcalSeverityLevelAlgo::SpikeId spId_;
00107 float severitySpikeThreshold_;
00108
00109 bool excludeFromCluster_;
00110 std::set<DetId> excludedCrys_;
00111
00112 public:
00113 enum DebugLevel { pDEBUG = 0, pINFO = 1, pERROR = 2 };
00114
00115
00116 HybridClusterAlgo(){ }
00117
00118
00119 HybridClusterAlgo(double eb_str,
00120 int step,
00121 double ethres,
00122 double eseed,
00123 double ewing,
00124 std::vector<int> v_chstatus,
00125 const PositionCalc& posCalculator,
00126 DebugLevel debugLevel = pINFO,
00127 bool dynamicEThres = false,
00128 double eThresA = 0,
00129 double eThresB = 0.1,
00130 std::vector<int> severityToExclude=std::vector<int>(999),
00131 double severityRecHitThreshold=0.08,
00132 int severitySpikeId=1,
00133 double severitySpikeThreshold=0,
00134 bool excludeFromCluster=false
00135 );
00136
00137
00138
00139 ~HybridClusterAlgo()
00140 {
00141 if (dynamicPhiRoad_) delete phiRoadAlgo_;
00142 delete topo_;
00143
00144 }
00145
00146 void setDynamicPhiRoad(const edm::ParameterSet &bremRecoveryPset)
00147 {
00148 dynamicPhiRoad_ = true;
00149 phiRoadAlgo_ = new BremRecoveryPhiRoadAlgo(bremRecoveryPset);
00150 }
00151
00152
00153 void makeClusters(const EcalRecHitCollection*,
00154 const CaloSubdetectorGeometry * geometry,
00155 reco::BasicClusterCollection &basicClusters,
00156 bool regional = false,
00157 const std::vector<EcalEtaPhiRegion>& regions = std::vector<EcalEtaPhiRegion>(),
00158 const EcalChannelStatus *chStatus = new EcalChannelStatus());
00159
00160
00161 reco::SuperClusterCollection makeSuperClusters(const reco::CaloClusterPtrVector&);
00162
00163
00164 void mainSearch(const EcalRecHitCollection* hits, const CaloSubdetectorGeometry * geometry);
00165
00166
00167 double makeDomino(EcalBarrelNavigator &navigator, std::vector <EcalRecHit> &cells);
00168
00169 };
00170
00171 #endif