CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
PFPhotonClusters.cc
Go to the documentation of this file.
5 
6 #include <TMath.h>
7 #include <TVector2.h>
8 using namespace reco;
10  PFClusterRef_(PFClusterRef)
11 {
12  if(PFClusterRef_->layer()==PFLayer:: ECAL_BARREL )isEB_=true;
13  else isEB_=false;
14  SetSeed();
15  PFCrystalCoor();
16  for(int i=0; i<5; ++i)
17  for(int j=0; j<5; ++j)e5x5_[i][j]=0;
20 }
21 
23  double PFSeedE=0;
24  math::XYZVector axis;
26  DetId idseed;
27  const std::vector< reco::PFRecHitFraction >& PFRecHits=
28  PFClusterRef_->recHitFractions();
29 
30  for(std::vector< reco::PFRecHitFraction >::const_iterator it = PFRecHits.begin();
31  it != PFRecHits.end(); ++it){
32  const PFRecHitRef& RefPFRecHit = it->recHitRef();
33  double frac=it->fraction();
34  float E= RefPFRecHit->energy()* frac;
35  if(E>PFSeedE){
36  PFSeedE=E;
37  axis=RefPFRecHit->getAxisXYZ();
38  position=RefPFRecHit->position();
39  idseed = RefPFRecHit->detId();
40  }
41  }
42  idseed_=idseed;
44  seedAxis_=axis;
45 }
46 
48  if(PFClusterRef_->layer()==PFLayer:: ECAL_BARREL ){//is Barrel
49  isEB_=true;
50  EBDetId EBidSeed=EBDetId(idseed_.rawId());
51  CrysIEta_=EBidSeed.ieta();
52  CrysIPhi_=EBidSeed.iphi();
53  double depth = PFClusterRef_->getDepthCorrection(PFClusterRef_->energy(), false, false);
54  math::XYZVector center_pos = seedPosition_+depth*seedAxis_;
55  //Crystal Coordinates:
56  double Pi=TMath::Pi();
57  float Phi=PFClusterRef_->position().phi();
58  double Theta = -(PFClusterRef_->position().theta())+0.5* Pi;
59  double PhiCentr = TVector2::Phi_mpi_pi(center_pos.phi());
60  double PhiWidth = (Pi/180.);
61  double PhiCry = (TVector2::Phi_mpi_pi(Phi-PhiCentr))/PhiWidth;
62  double ThetaCentr = -center_pos.theta()+0.5*Pi;
63  double ThetaWidth = (Pi/180.)*cos(ThetaCentr);
64 
65  double EtaCry = (Theta-ThetaCentr)/ThetaWidth;
66  CrysEta_=EtaCry;
67  CrysPhi_=PhiCry;
68 
69  if(abs(CrysIEta_)==1 || abs(CrysIEta_)==2 )
70  CrysIEtaCrack_=abs(CrysIEta_);
71  if(abs(CrysIEta_)>2 && abs(CrysIEta_)<24)
73  if(abs(CrysIEta_)==24)
75  if(abs(CrysIEta_)==25)
77  if(abs(CrysIEta_)==26)
79  if(abs(CrysIEta_)==27)
81  if(abs(CrysIEta_)>27 && abs(CrysIEta_)<44)
83  if(abs(CrysIEta_)==44)
85  if(abs(CrysIEta_)==45)
86  CrysIEtaCrack_=10;
87  if(abs(CrysIEta_)==46)
88  CrysIEtaCrack_=11;
89  if(abs(CrysIEta_)==47)
90  CrysIEtaCrack_=12;
91  if(abs(CrysIEta_)>47 && abs(CrysIEta_)<64)
92  CrysIEtaCrack_=13;
93  if(abs(CrysIEta_)==64)
94  CrysIEtaCrack_=14;
95  if(abs(CrysIEta_)==65)
96  CrysIEtaCrack_=15;
97  if(abs(CrysIEta_)==66)
98  CrysIEtaCrack_=16;
99  if(abs(CrysIEta_)==67)
100  CrysIEtaCrack_=17;
101  if(abs(CrysIEta_)>67 && abs(CrysIEta_)<84)
102  CrysIEtaCrack_=18;
103  if(abs(CrysIEta_)==84)
104  CrysIEtaCrack_=19;
105  if(abs(CrysIEta_)==85)
106  CrysIEtaCrack_=20;
107  }
108  else{
109  isEB_=false;
110  EEDetId EEidSeed=EEDetId(idseed_.rawId());
111  CrysIX_=EEidSeed.ix();
112  CrysIY_=EEidSeed.iy();
113  float X0 = 0.89; float T0 = 1.2;
114  if(fabs(PFClusterRef_->eta())>1.653)T0=3.1;
115  double depth = X0 * (T0 + log(PFClusterRef_->energy()));
116  math::XYZVector center_pos=(seedPosition_)+depth*seedAxis_;
117  double XCentr = center_pos.x();
118  double YCentr = center_pos.y();
119  double XWidth = 2.59;
120  double YWidth = 2.59;
121 
122  CrysX_=(PFClusterRef_->x()-XCentr)/XWidth;
123  CrysY_=(PFClusterRef_->y()-YCentr)/YWidth;
124  }
125 }
126 
128  const std::vector< reco::PFRecHitFraction >& PFRecHits=PFClusterRef_->recHitFractions();
129  for(std::vector< reco::PFRecHitFraction >::const_iterator it = PFRecHits.begin(); it != PFRecHits.end(); ++it){
130  const PFRecHitRef& RefPFRecHit = it->recHitRef();
131  DetId id=RefPFRecHit->detId();
132  double frac=it->fraction();
133  float E=RefPFRecHit->energy()*frac;
134  if(isEB_){
135  int deta=EBDetId::distanceEta(id,idseed_);
136  int dphi=EBDetId::distancePhi(id,idseed_);
137 
138  if(abs(deta)>2 ||abs(dphi)>2)continue;
139 
140  //f(abs(dphi)<=2 && abs(deta)<=2){
141  EBDetId EBidSeed=EBDetId(idseed_.rawId());
142  EBDetId EBid=EBDetId(id.rawId());
143  int ind1=EBidSeed.ieta()-EBid.ieta();
144  int ind2=EBidSeed.iphi()-EBid.iphi();
145  if(EBidSeed.ieta() * EBid.ieta() > 0){
146  ind1=EBid.ieta()-EBidSeed.ieta();
147  }
148  else{ //near EB+ EB-
149  int shift(EBidSeed.ieta()>0 ? -1 : 1);
150  ind1=EBidSeed.ieta()-EBid.ieta()+shift;
151  }
152 
153  // more tricky edges in phi. Note that distance is already <2 at this point
154  if( (EBidSeed.iphi()<5&&EBid.iphi()>355) || (EBidSeed.iphi()>355&&EBid.iphi()<5)) {
155  int shift(EBidSeed.iphi()<180 ? EBDetId::MAX_IPHI:-EBDetId::MAX_IPHI) ;
156  ind2 = shift + EBidSeed.iphi() - EBid.iphi();
157  // std::cout << " Phi check " << EBidSeed.iphi() << " " << EBid.iphi() << " " << ind2 << std::endl;
158  }
159 
160  int iEta=ind1+2;
161  int iPhi=ind2+2;
162  //std::cout<<"IEta, IPhi "<<iEta<<", "<<iPhi<<std::endl;
163 // if(iPhi >= 5 || iPhi <0) {
164 // std::cout << "dphi "<< EBDetId::distancePhi(id,idseed_) << " iphi " << EBid.iphi() << " iphiseed " << EBidSeed.iphi() << " iPhi " << iPhi << std::endl;}
165 // if(iEta >= 5 || iEta <0) {
166 // std::cout << "deta "<< EBDetId::distanceEta(id,idseed_) << " ieta " << EBid.ieta() << " ietaseed " << EBidSeed.ieta() << "ind1 " << ind1 << " iEta " << iEta << " " ;
167 // ind1=ind1prime;
168 // iEta=ind1+2;
169 // std::cout << " new iEta " << iEta << std::endl;
170 // }
171 // assert(iEta < 5);
172 // assert(iEta >= 0);
173 // assert(iPhi < 5);
174 // assert(iPhi >= 0);
175  e5x5_[iEta][iPhi]=E;
176  }
177  else{
178  int dx=EEDetId::distanceX(id,idseed_);
179  int dy=EEDetId::distanceY(id,idseed_);
180  if(abs(dx)>2 ||abs(dy>2))continue;
181  EEDetId EEidSeed=EEDetId(idseed_.rawId());
182  EEDetId EEid=EEDetId(id.rawId());
183  int ind1=EEid.ix()-EEidSeed.ix();
184  int ind2=EEid.iy()-EEidSeed.iy();
185  int ix=ind1+2;
186  int iy=ind2+2;
187  //std::cout<<"IX, IY "<<ix<<", "<<iy<<std::endl;
188 // assert(ix < 5);
189 // assert(ix >= 0);
190 // assert(iy < 5);
191 // assert(iy >= 0);
192  e5x5_[ix][iy]=E;
193  }
194  }
195 }
196 
198  double numeratorEtaWidth = 0.;
199  double numeratorPhiWidth = 0.;
200  double numeratorEtaPhiWidth = 0.;
201  double ClustEta=PFClusterRef_->eta();
202  double ClustPhi=PFClusterRef_->phi();
203  const std::vector< reco::PFRecHitFraction >& PFRecHits=PFClusterRef_->recHitFractions();
204  for(std::vector< reco::PFRecHitFraction >::const_iterator it = PFRecHits.begin(); it != PFRecHits.end(); ++it){
205  const PFRecHitRef& RefPFRecHit = it->recHitRef();
206  float E=RefPFRecHit->energy() * it->fraction();
207  double dEta = RefPFRecHit->position().eta() - ClustEta;
208  double dPhi = RefPFRecHit->position().phi() - ClustPhi;
209  if (dPhi > + TMath::Pi()) { dPhi = TMath::TwoPi() - dPhi; }
210  if (dPhi < - TMath::Pi()) { dPhi = TMath::TwoPi() + dPhi; }
211  numeratorEtaWidth += E * dEta * dEta;
212  numeratorPhiWidth += E * dPhi * dPhi;
213  numeratorEtaPhiWidth += E * fabs(dPhi) * fabs(dEta);
214  }
215  double denominator=PFClusterRef_->energy();
216  sigetaeta_ = sqrt(numeratorEtaWidth / denominator);
217  sigphiphi_ = sqrt(numeratorPhiWidth / denominator);
218  sigetaphi_ = sqrt(numeratorEtaPhiWidth / denominator);
219 }
const double TwoPi
const double Pi
int i
Definition: DBlmapReader.cc:9
int ix() const
Definition: EEDetId.h:76
static int distanceX(const EEDetId &a, const EEDetId &b)
Definition: EEDetId.cc:577
double Phi_mpi_pi(double x)
Definition: JetUtil.h:24
static int position[TOTALCHAMBERS][3]
Definition: ReadPGInfo.cc:509
reco::PFClusterRef PFClusterRef_
int iphi() const
get the crystal iphi
Definition: EBDetId.h:53
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
static int distanceEta(const EBDetId &a, const EBDetId &b)
Definition: EBDetId.cc:135
list denominator
Definition: cuy.py:484
math::XYZVector seedAxis_
double dPhi(double phi1, double phi2)
Definition: JetUtil.h:30
T sqrt(T t)
Definition: SSEVec.h:48
static int distancePhi(const EBDetId &a, const EBDetId &b)
Definition: EBDetId.cc:143
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int j
Definition: DBlmapReader.cc:9
PFPhotonClusters(reco::PFClusterRef PFClusterRef)
int iy() const
Definition: EEDetId.h:82
int ieta() const
get the crystal ieta
Definition: EBDetId.h:51
static int distanceY(const EEDetId &a, const EEDetId &b)
Definition: EEDetId.cc:582
Definition: DetId.h:18
static const int MAX_IPHI
Definition: EBDetId.h:144
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
double e5x5_[5][5]
static unsigned int const shift
static const double X0
math::XYZVector seedPosition_