Go to the documentation of this file.00001 #include "../interface/EcalClusterLocal.h"
00002
00003 #include "FWCore/Framework/interface/EventSetup.h"
00004 #include "FWCore/Framework/interface/ESHandle.h"
00005 #include "Geometry/Records/interface/CaloGeometryRecord.h"
00006 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00007 #include "Geometry/CaloGeometry/interface/TruncatedPyramid.h"
00008 #include "DataFormats/EcalDetId/interface/EBDetId.h"
00009 #include "DataFormats/EcalDetId/interface/EEDetId.h"
00010 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00011 #include "DataFormats/Math/interface/deltaR.h"
00012 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00013 #include "TMath.h"
00014 #include "TVector2.h"
00015
00016 EcalClusterLocal::EcalClusterLocal()
00017 {}
00018
00019 EcalClusterLocal::~EcalClusterLocal()
00020 {}
00021
00022 void EcalClusterLocal::localCoordsEB( const reco::BasicCluster &bclus, const edm::EventSetup &es, float &etacry, float &phicry, int &ieta, int &iphi, float &thetatilt, float &phitilt) const
00023 {
00024
00025 assert(bclus.hitsAndFractions().at(0).first.subdetId()==EcalBarrel);
00026
00027 edm::ESHandle<CaloGeometry> pG;
00028 es.get<CaloGeometryRecord>().get(pG);
00029
00030 const CaloSubdetectorGeometry* geom=pG->getSubdetectorGeometry(DetId::Ecal,EcalBarrel);
00031
00032 const math::XYZPoint position_ = bclus.position();
00033 double Theta = -position_.theta()+0.5*TMath::Pi();
00034 double Eta = position_.eta();
00035 double Phi = TVector2::Phi_mpi_pi(position_.phi());
00036
00037
00038
00039 const float X0 = 0.89; const float T0 = 7.4;
00040 double depth = X0 * (T0 + log(bclus.energy()));
00041
00042
00043 std::vector< std::pair<DetId, float> > crystals_vector = bclus.hitsAndFractions();
00044 float drmin = 999.;
00045 EBDetId crystalseed;
00046
00047 for (unsigned int icry=0; icry!=crystals_vector.size(); ++icry) {
00048
00049 EBDetId crystal(crystals_vector[icry].first);
00050
00051 const CaloCellGeometry* cell=geom->getGeometry(crystal);
00052 GlobalPoint center_pos = (dynamic_cast<const TruncatedPyramid*>(cell))->getPosition(depth);
00053 double EtaCentr = center_pos.eta();
00054 double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
00055
00056 float dr = reco::deltaR(Eta,Phi,EtaCentr,PhiCentr);
00057 if (dr<drmin) {
00058 drmin = dr;
00059 crystalseed = crystal;
00060 }
00061
00062 }
00063
00064 ieta = crystalseed.ieta();
00065 iphi = crystalseed.iphi();
00066
00067
00068 const CaloCellGeometry* cell=geom->getGeometry(crystalseed);
00069 const TruncatedPyramid *cpyr = dynamic_cast<const TruncatedPyramid*>(cell);
00070
00071 thetatilt = cpyr->getThetaAxis();
00072 phitilt = cpyr->getPhiAxis();
00073
00074 GlobalPoint center_pos = cpyr->getPosition(depth);
00075
00076 double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
00077 double PhiWidth = (TMath::Pi()/180.);
00078 phicry = (TVector2::Phi_mpi_pi(Phi-PhiCentr))/PhiWidth;
00079
00080 if (ieta<0) phicry *= -1.;
00081
00082 double ThetaCentr = -center_pos.theta()+0.5*TMath::Pi();
00083 double ThetaWidth = (TMath::Pi()/180.)*TMath::Cos(ThetaCentr);
00084 etacry = (Theta-ThetaCentr)/ThetaWidth;
00085
00086 if (ieta<0) etacry *= -1.;
00087
00088 return;
00089
00090 }
00091
00092 void EcalClusterLocal::localCoordsEE( const reco::BasicCluster &bclus, const edm::EventSetup &es, float &xcry, float &ycry, int &ix, int &iy, float &thetatilt, float &phitilt) const
00093 {
00094
00095 assert(bclus.hitsAndFractions().at(0).first.subdetId()==EcalEndcap);
00096
00097 edm::ESHandle<CaloGeometry> pG;
00098 es.get<CaloGeometryRecord>().get(pG);
00099
00100 const CaloSubdetectorGeometry* geom=pG->getSubdetectorGeometry(DetId::Ecal,EcalEndcap);
00101
00102 const math::XYZPoint position_ = bclus.position();
00103
00104 double Eta = position_.eta();
00105 double Phi = TVector2::Phi_mpi_pi(position_.phi());
00106 double X = position_.x();
00107 double Y = position_.y();
00108
00109
00110
00111 const float X0 = 0.89; float T0 = 1.2;
00112
00113 if (TMath::Abs(bclus.eta())<1.653) T0 = 3.1;
00114
00115 double depth = X0 * (T0 + log(bclus.energy()));
00116
00117
00118 std::vector< std::pair<DetId, float> > crystals_vector = bclus.hitsAndFractions();
00119 float drmin = 999.;
00120 EEDetId crystalseed;
00121
00122 for (unsigned int icry=0; icry!=crystals_vector.size(); ++icry) {
00123
00124 EEDetId crystal(crystals_vector[icry].first);
00125
00126 const CaloCellGeometry* cell=geom->getGeometry(crystal);
00127 GlobalPoint center_pos = (dynamic_cast<const TruncatedPyramid*>(cell))->getPosition(depth);
00128 double EtaCentr = center_pos.eta();
00129 double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
00130
00131 float dr = reco::deltaR(Eta,Phi,EtaCentr,PhiCentr);
00132 if (dr<drmin) {
00133 drmin = dr;
00134 crystalseed = crystal;
00135 }
00136
00137 }
00138
00139 ix = crystalseed.ix();
00140 iy = crystalseed.iy();
00141
00142
00143 const CaloCellGeometry* cell=geom->getGeometry(crystalseed);
00144 const TruncatedPyramid *cpyr = dynamic_cast<const TruncatedPyramid*>(cell);
00145
00146 thetatilt = cpyr->getThetaAxis();
00147 phitilt = cpyr->getPhiAxis();
00148
00149 GlobalPoint center_pos = cpyr->getPosition(depth);
00150
00151 double XCentr = center_pos.x();
00152 double XWidth = 2.59;
00153 xcry = (X-XCentr)/XWidth;
00154
00155
00156 double YCentr = center_pos.y();
00157 double YWidth = 2.59;
00158 ycry = (Y-YCentr)/YWidth;
00159
00160 return;
00161
00162 }
00163
00164