00001 #ifndef RecoEcal_EgammaCoreTools_EcalClusterTools_h
00002 #define RecoEcal_EgammaCoreTools_EcalClusterTools_h
00003
00016 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00017 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00018 #include "DataFormats/EcalRecHit/interface/EcalRecHitCollections.h"
00019
00020
00021 #include "DataFormats/Math/interface/Vector3D.h"
00022
00023 #include <vector>
00024 #include <math.h>
00025 #include <TMath.h>
00026 #include <TMatrixT.h>
00027 #include <TMatrixD.h>
00028 #include <TVectorT.h>
00029 #include <TVectorD.h>
00030
00031
00032 class DetId;
00033 class CaloTopology;
00034 class CaloGeometry;
00035
00036 struct Cluster2ndMoments {
00037
00038
00039 float sMaj;
00040 float sMin;
00041
00042 float alpha;
00043
00044 };
00045
00046 class EcalClusterTools {
00047 public:
00048 EcalClusterTools() {};
00049 ~EcalClusterTools() {};
00050
00051
00052
00053
00054
00055 static float e1x3( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00056 static float e3x1( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00057 static float e1x5( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00058 static float e5x1( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00059 static float e2x2( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00060 static float e3x2( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00061 static float e3x3( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00062 static float e4x4( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00063 static float e5x5( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00064
00065
00066 static float e2x5Right( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00067
00068 static float e2x5Left( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00069
00070
00071 static float e2x5Top( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00072
00073 static float e2x5Bottom( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00074
00075
00076
00077 static float e2x5Max( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00078
00079 static float eLeft( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00080 static float eRight( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00081 static float eTop( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00082 static float eBottom( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology );
00083
00084 static float eMax( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits );
00085
00086 static float e2nd( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits );
00087
00088 static std::pair<DetId, float> getMaximum( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits);
00089
00090 static std::vector<float> energyBasketFractionEta( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits );
00091 static std::vector<float> energyBasketFractionPhi( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits );
00092
00093
00094 static std::vector<float> lat( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, bool logW = true, float w0 = 4.7 );
00095
00096 static std::vector<float> covariances(const reco::BasicCluster &cluster, const EcalRecHitCollection* recHits, const CaloTopology *topology, const CaloGeometry* geometry, float w0 = 4.7);
00097
00098
00099
00100
00101
00102
00103
00104
00105 static std::vector<float> localCovariances(const reco::BasicCluster &cluster, const EcalRecHitCollection* recHits, const CaloTopology *topology, float w0 = 4.7);
00106
00107 static std::vector<float> scLocalCovariances(const reco::SuperCluster &cluster, const EcalRecHitCollection* recHits,const CaloTopology *topology, float w0 = 4.7);
00108
00109
00110 static Cluster2ndMoments cluster2ndMoments( const reco::BasicCluster &basicCluster, const EcalRecHitCollection &recHits, double phiCorrectionFactor=0.8, double w0=4.7, bool useLogWeights=true);
00111 static Cluster2ndMoments cluster2ndMoments( const reco::SuperCluster &superCluster, const EcalRecHitCollection &recHits, double phiCorrectionFactor=0.8, double w0=4.7, bool useLogWeights=true);
00112 static Cluster2ndMoments cluster2ndMoments( std::vector<const EcalRecHit*> RH_ptrs, double phiCorrectionFactor=0.8, double w0=4.7, bool useLogWeights=true);
00113
00114 static double zernike20( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, double R0 = 6.6, bool logW = true, float w0 = 4.7 );
00115 static double zernike42( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, double R0 = 6.6, bool logW = true, float w0 = 4.7 );
00116
00117
00118
00119 static std::vector<DetId> matrixDetId( const CaloTopology* topology, DetId id, int ixMin, int ixMax, int iyMin, int iyMax );
00120
00121
00122 static float matrixEnergy( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology* topology, DetId id, int ixMin, int ixMax, int iyMin, int iyMax );
00123
00124 static std::pair<DetId, float> getMaximum( const std::vector< std::pair<DetId, float> > &v_id, const EcalRecHitCollection *recHits);
00125
00126 static float recHitEnergy(DetId id, const EcalRecHitCollection *recHits);
00127
00128
00129 static std::vector<float> roundnessBarrelSuperClusters( const reco::SuperCluster &superCluster ,const EcalRecHitCollection &recHits, int weightedPositionMethod = 0, float energyThreshold = 0.0);
00130 static std::vector<float> roundnessBarrelSuperClustersUserExtended( const reco::SuperCluster &superCluster ,const EcalRecHitCollection &recHits, int ieta_delta=0, int iphi_delta=0, float energyRHThresh=0.00000, int weightedPositionMethod=0);
00131 static std::vector<float> roundnessSelectedBarrelRecHits(std::vector<const EcalRecHit*>rhVector, int weightedPositionMethod = 0);
00132 private:
00133 struct EcalClusterEnergyDeposition
00134 {
00135 double deposited_energy;
00136 double r;
00137 double phi;
00138 };
00139
00140 static std::vector<EcalClusterEnergyDeposition> getEnergyDepTopology( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, bool logW, float w0 );
00141 static math::XYZVector meanClusterPosition( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloTopology *topology, const CaloGeometry *geometry );
00142
00143
00144 static std::pair<float,float> mean5x5PositionInLocalCrysCoord(const reco::BasicCluster &cluster, const EcalRecHitCollection* recHits,const CaloTopology *topology);
00145 static std::pair<float,float> mean5x5PositionInXY(const reco::BasicCluster &cluster, const EcalRecHitCollection* recHits,const CaloTopology *topology);
00146
00147 static double f00(double r) { return 1; }
00148 static double f11(double r) { return r; }
00149 static double f20(double r) { return 2.0*r*r-1.0; }
00150 static double f22(double r) { return r*r; }
00151 static double f31(double r) { return 3.0*r*r*r - 2.0*r; }
00152 static double f33(double r) { return r*r*r; }
00153 static double f40(double r) { return 6.0*r*r*r*r-6.0*r*r+1.0; }
00154 static double f42(double r) { return 4.0*r*r*r*r-3.0*r*r; }
00155 static double f44(double r) { return r*r*r*r; }
00156 static double f51(double r) { return 10.0*pow(r,5)-12.0*pow(r,3)+3.0*r; }
00157 static double f53(double r) { return 5.0*pow(r,5) - 4.0*pow(r,3); }
00158 static double f55(double r) { return pow(r,5); }
00159
00160 static double absZernikeMoment( const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, int n, int m, double R0, bool logW, float w0 );
00161 static double fast_AbsZernikeMoment(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, int n, int m, double R0, bool logW, float w0 );
00162 static double calc_AbsZernikeMoment(const reco::BasicCluster &cluster, const EcalRecHitCollection *recHits, const CaloGeometry *geometry, int n, int m, double R0, bool logW, float w0 );
00163
00164 static double factorial(int n) {
00165 double res = 1.;
00166 for (int i = 2; i <= n; ++i) res *= i;
00167 return res;
00168 }
00169
00170
00171 static float getIEta(const DetId& id);
00172 static float getIPhi(const DetId& id);
00173 static float getNormedIX(const DetId& id);
00174 static float getNormedIY(const DetId& id);
00175 static float getDPhiEndcap(const DetId& crysId,float meanX,float meanY);
00176 static float getNrCrysDiffInEta(const DetId& crysId,const DetId& orginId);
00177 static float getNrCrysDiffInPhi(const DetId& crysId,const DetId& orginId);
00178
00179
00180 static int deltaIEta(int seed_ieta, int rh_ieta);
00181 static int deltaIPhi(int seed_iphi, int rh_iphi);
00182 static std::vector<int> getSeedPosition(std::vector<const EcalRecHit*>RH_ptrs);
00183 static float getSumEnergy(std::vector<const EcalRecHit*>RH_ptrs);
00184 static float computeWeight(float eRH, float energyTotal, int weightedPositionMethod);
00185
00186 };
00187
00188 #endif