ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/yangyong/combineICEB/physUtils.cc
(Generate patch)

Comparing UserCode/yangyong/combineICEB/physUtils.cc (file contents):
Revision 1.1 by yangyong, Mon Dec 26 17:27:05 2011 UTC vs.
Revision 1.2 by yangyong, Tue Apr 10 19:41:12 2012 UTC

# Line 0 | Line 1
1 +
2 +
3 +
4 +
5 + ///to access xEBAll[ieta][iphi]
6 + /// input ieta -85,0,84
7 + int getIndetaxyzEBAll(int ieta){
8 +  return ieta+85;
9 + }
10 +
11 + ////something not consistent with 167,152?
12 +
13 +
14 + ///input 0, 359 after convxtalid
15 + int getIndphixyzEBAll(int iphi){
16 +  
17 +  iphi = iphi-1;
18 +  if(iphi<0) return 359;
19 +  else return iphi;
20 +  
21 + }
22 +
23 + double DeltaPhi(double phi1, double phi2){
24 +  
25 +  //double diff = fabs(phi2 - phi1);
26 +  double diff = phi1 - phi2;
27 +  
28 +  while (diff >acos(-1)) diff -= 2*acos(-1);
29 +  while (diff <= -acos(-1)) diff += 2*acos(-1);
30 +  
31 +  return diff;
32 +  
33 + }
34 +
35 +
36 + double GetDeltaR(double eta1, double eta2, double phi1, double phi2){
37 +  
38 +  return sqrt( (eta1-eta2)*(eta1-eta2)
39 +               + DeltaPhi(phi1, phi2)*DeltaPhi(phi1, phi2) );
40 +  
41 + }
42 +
43 +
44 +
45 +
46 + Float_t getcosd(Float_t eta1, Float_t phi1, Float_t eta2, Float_t phi2) {
47 +  Float_t theta1 = 2*atan(exp(-eta1));
48 +  Float_t theta2 = 2*atan(exp(-eta2));
49 +  Float_t cosd;
50 +  Float_t dphi = DeltaPhi(phi1,phi2);
51 +  cosd = cos(theta1)*cos(theta2)+sin(theta1)*sin(theta2)*cos(dphi);  //opening angle
52 +  return cosd;
53 + }
54 + void separation(Float_t sceta1, Float_t scphi1, Float_t sceta2, Float_t scphi2, Float_t &dr)
55 + {
56 +  float dphi=fabs(scphi1-scphi2);
57 +  if(dphi > (2*acos(-1)-fabs(scphi1-scphi2))) dphi = ( 2*acos(-1)-fabs(scphi1-scphi2));
58 +  dr=sqrt((sceta1- sceta2)*(sceta1- sceta2)+dphi*dphi);
59 + }
60 +
61 +
62 +
63 + void calcPairObjects(int pid1, int pid2,float en[],float eta[],float phi[],float res[]){
64 +  
65 +  TLorentzVector vpht[2];
66 +  
67 +  TLorentzVector vpair;
68 +  
69 +  float mass[2]={0,0};
70 +  
71 +  if(pid1==11) mass[0] = 0.511*0.001;
72 +  else if(pid1==13) mass[0] = 0.105658;
73 +  else if(pid1==22) mass[0] = 0;
74 +  else{
75 +    cout<<"calcPairMuPht, mass.pid1 "<<endl;
76 +    exit(1);
77 +  }
78 +  
79 +  if(pid2==11) mass[1] = 0.511*0.001;
80 +  else if(pid2==13) mass[1] = 0.105658;
81 +  else if(pid2 ==22) mass[1] = 0;
82 +  else {
83 +    cout<<"calcPairMuPht, mass. pid2"<<endl;
84 +    exit(1);
85 +  }
86 +  
87 +
88 +  if( en[0] < mass[0] || en[1] < mass[1]) {
89 +    cout<<"warning calcPairObjects E<m? "<< en[0]<<" "<<en[1] <<" "<< pid1<<" "<<pid2<<endl;
90 +    exit(1);
91 +  }
92 +  
93 +  for( int j= 0; j<2; j++){
94 +    
95 +    float e = sqrt( en[j] * en[j] - mass[j]*mass[j]);
96 +    float px = e * sin ( 2*atan(exp(-eta[j]))) * cos(phi[j]);
97 +    float py = e * sin ( 2*atan(exp(-eta[j]))) * sin(phi[j]);
98 +    float pz = e * cos ( 2*atan(exp(-eta[j]))) ;
99 +    
100 +    vpht[j].SetXYZT(px,py,pz,e);
101 +    
102 +  }
103 +  
104 +  vpair = vpht[0] + vpht[1];
105 +
106 +  res[0] = vpair.M();
107 +  res[1] = vpair.Eta();
108 +  res[2] = vpair.Phi();
109 +  res[3] = vpair.Pt();
110 +  
111 +  
112 +  
113 +  
114 + }
115 +
116 +
117 + void calcPairPhoton(float en[],float eta[],float phi[],float res[]){
118 +  
119 +  TLorentzVector vpht[2];
120 +  
121 +  TLorentzVector vpair;
122 +  
123 +  
124 +  for( int j= 0; j<2; j++){
125 +    
126 +    float e = en[j];
127 +    float px = e * sin ( 2*atan(exp(-eta[j]))) * cos(phi[j]);
128 +    float py = e * sin ( 2*atan(exp(-eta[j]))) * sin(phi[j]);
129 +    float pz = e * cos ( 2*atan(exp(-eta[j]))) ;
130 +    
131 +    vpht[j].SetXYZT(px,py,pz,e);
132 +    
133 +  }
134 +  
135 +  vpair = vpht[0] + vpht[1];
136 +
137 +  res[0] = vpair.M();
138 +  res[1] = vpair.Eta();
139 +  res[2] = vpair.Phi();
140 +  res[3] = vpair.Pt();
141 +  
142 +  
143 +  
144 +  
145 + }
146 +
147 + void phinorm(Float_t & PHI)
148 + {
149 +  while (PHI<0)  PHI= PHI + 2*acos(-1);
150 +  if(PHI>2*acos(-1))  PHI= PHI - 2*acos(-1);
151 +  
152 + }
153 +
154 +
155 + ////change to [-pi,pi];
156 + float phinorm2(float phi){
157 +  while( phi > acos(-1) ) phi -= 2*acos(-1);
158 +  while(phi< -acos(-1)) phi += 2*acos(-1);
159 +
160 +  return phi;
161 +
162 +
163 + }
164 +
165 +
166 +
167 +
168 + ///input phi : [-pi,pi];
169 + ////this is the not exactly the same as;
170 + ////RecoEcal/EgammaCoreTools/src/LogPositionCalc.cc
171 + ///need x,y,z information of each crystal to do that.
172 +
173 + /////center iphi = 190 or 191 phi change signs. 3.133, -3.133
174 +
175 + void simpleLogWeightedEtaPhi(int nxt, float esum, float energy[],float eta[],float phi[],int phimax, float res[]){
176 +  
177 +  
178 +  
179 +  float etasum = 0;
180 +  float phisum = 0;
181 +  float wtsum = 0;
182 +  
183 +  if(phimax==190 || phimax==191){
184 +    for( int j=0; j<nxt; j++){
185 +      phinorm(phi[j]);
186 +    }
187 +  }
188 +    
189 +  
190 +  for( int j=0; j<nxt; j++){
191 +    float mw=4.2+log(fabs(energy[j])/esum);
192 +    if(mw < 0.) mw=0.;
193 +    wtsum += mw;
194 +    etasum += mw * eta[j];
195 +    phisum += mw * phi[j];
196 +    
197 +  }
198 +  
199 +  
200 +  etasum /= wtsum;
201 +  phisum /= wtsum;
202 +  
203 +  ///change to [-pi,pi]
204 +  phinorm2(phisum);
205 +  
206 +  
207 +  res[0] = etasum;
208 +  res[1] = phisum;
209 +  
210 +  ////cluster shape
211 +
212 +  
213 +
214 +  
215 + }
216 +
217 + // // ///cluster shape SigmaEtaEta, SigmaEtaPhi,SigmaPhiPhi
218 + // // ///
219 +
220 +
221 + void Calculate_ClusterCovariance(int nxt, float esum,float ceta,float cphi,float en[],float eta[],float phi[],float res[]){
222 +  
223 +  double numeratorEtaEta = 0;
224 +  double numeratorEtaPhi = 0;
225 +  double numeratorPhiPhi = 0;
226 +  double denominator     = 0;
227 +  
228 +  for( int j=0; j<nxt; j++){
229 +    
230 +    float dPhi = phi[j] - cphi;
231 +
232 +    if(dPhi > acos(-1)) dPhi = 2*acos(-1) - dPhi;
233 +    if(dPhi <-acos(-1)) dPhi = 2*acos(-1) + dPhi;
234 +    
235 +    float dEta = eta[j] - ceta;
236 +    
237 +    
238 +    float w=4.2+log(fabs(en[j])/esum);
239 +    if(w < 0.) w=0.;
240 +    
241 +    
242 +    denominator += w;
243 +    numeratorEtaEta += w * dEta * dEta;
244 +    numeratorEtaPhi += w * dEta * dPhi;
245 +    numeratorPhiPhi += w * dPhi * dPhi;
246 +    
247 +  }
248 +  
249 +    
250 +  res[0] = numeratorEtaEta / denominator;
251 +  res[1] = numeratorEtaPhi / denominator;
252 +  res[2] = numeratorPhiPhi / denominator;
253 +  
254 +    
255 +
256 +
257 + }
258 +  
259 +
260 +
261 +
262 + float Calculate_LAT(int nxt, float xclus, float yclus, float zclus,float en[],float x[],float y[],float z[]){
263 +  
264 +  if( nxt <3) return 10;
265 +  
266 +  TVector3 clVect(xclus,yclus,zclus);
267 +  
268 +  TVector3 clDir = clVect;
269 +  clDir *= 1.0/clDir.Mag();
270 +  
271 +  float redmoment = 0;
272 +  
273 +  float e12 = en[0] + en[1];
274 +  TVector3 gblPos;
275 +  for( int j=2; j< nxt; j++){
276 +    gblPos.SetXYZ(x[j],y[j],z[j]);
277 +    TVector3 diff = gblPos - clVect;
278 +
279 +    TVector3 DigiVect =  diff - diff.Dot(clDir)*clDir;
280 +    float r = DigiVect.Mag();
281 +    redmoment += r*r*fabs(en[j]);
282 +  }
283 +  
284 +  float lat = redmoment/(redmoment + 2.19*2.19*e12);
285 +
286 +  return lat;
287 +  
288 +
289 + }
290 +
291 +
292 + ///change [-85,84] to bin 1, to bin 170
293 + ///change [0,359] to bin 1, 260;
294 +
295 + void getBinEtaPhi(int eta, int phi, float res[]){
296 +  
297 +  if( eta <0) {
298 +    res[0] = eta + 85 +1+0.001;
299 +    
300 +    res[2] = eta;
301 +    
302 +  }
303 +  else {
304 +    res[0] = eta + 85 +2+0.001;
305 +    res[2] = eta +1;
306 +  }
307 +  
308 +  if( phi==0) {
309 +    res[1] = 360;
310 +    res[3] = 360;
311 +  }
312 +  else {
313 +    res[1] = phi+0.001;
314 +    res[3] = phi;
315 +  }
316 +  
317 +  
318 +  
319 +
320 + }
321 +
322 +
323 +
324 + ////check crystal at boader of em obj boader
325 +
326 + int IsatBoaderEMObjPhi(int iphi){
327 +  
328 +  // if( iphi ==0 || iphi ==1) return 1;
329 +
330 +  if( iphi%20 ==0 || (iphi-1)%20 ==0) return 1;
331 +  
332 +  return 0;
333 +
334 + }
335 +
336 + int IsatBoaderEMObjEta(int ieta){
337 +  
338 +  if( ieta ==0 || ieta == -1) return 1;
339 +  if( ieta ==19 || ieta==20) return 1;
340 +  if( ieta ==39 || ieta==40) return 1;
341 +  if( ieta == 59 || ieta ==60) return 1;
342 +  
343 +  
344 +  if( ieta==-20 || ieta==-21) return 1;
345 +  if( ieta==-40 || ieta==-41) return 1;
346 +  if( ieta==-60 || ieta==-61) return 1;
347 +    
348 +  
349 +  return 0;
350 +
351 + }
352 +
353 +
354 +
355 + //convert ietaTT , iphiTT to ieta,iphi of central crystal
356 +
357 + void convertindTTindCrystal(int ietaT,int iphiT, int &ieta, int &iphi){
358 +
359 +  if( iphiT >= 71) iphi = (iphiT-71)*5+3;
360 +  else if( iphiT >=1 && iphiT <=70){
361 +    iphi = (iphiT+1)*5+3;
362 +  }else{
363 +    cout<<"fatal error ..iphiT "<<iphiT<<endl;
364 +    exit(1);
365 +  }
366 +
367 +  ieta = abs(ietaT)*5-2;
368 +
369 +  if(ietaT<0) ieta *= -1;
370 +  
371 +
372 +  if( ieta >85 || ieta <-85 || ieta ==0){
373 +    cout<<"convertindTTindCrystal...  "<<ieta<<" "<<ietaT<<endl;
374 +    exit(1);
375 +  }
376 +  
377 +  if( iphi <0 || iphi >360){
378 +    cout<<"convertindTTindCrystal...  "<<iphi<<" "<<iphiT<<endl;
379 +    exit(1);
380 +  }
381 +  
382 + }
383 +
384 +
385 + ////invariant mass of two obejcts given, pid each.
386 + void calcPairPtEtaPhi(float pt[2],float eta[2],float phi[2],int pid1,int pid2,float res[]){
387 +  //void calcPairMuPht(double pt[2],double eta[2],double phi[2],int pid1,int pid2,double res[]){
388 +  
389 +  TLorentzVector vpht[2];
390 +  
391 +  TLorentzVector vpair;
392 +  
393 +  double mass[2]={0,0};
394 +  
395 +  if(pid1==11) mass[0] = 0.511*0.001;
396 +  else if(pid1==13) mass[0] = 0.105658;
397 +  else if(pid1==22) mass[0] = 0;
398 +  else{
399 +    cout<<"calcPairMuPht, mass.pid1 "<<endl;
400 +    exit(1);
401 +  }
402 +  
403 +  if(pid2==11) mass[1] = 0.511*0.001;
404 +  else if(pid2==13) mass[1] = 0.105658;
405 +  else if(pid2 ==22) mass[1] = 0;
406 +  else {
407 +    cout<<"calcPairMuPht, mass. pid2"<<endl;
408 +    exit(1);
409 +  }
410 +  
411 +  
412 +  
413 +  
414 +  for( int j= 0; j<2; j++){
415 +    
416 +    double p = pt[j]/sin(2*atan(exp(-eta[j])));
417 +    double e = sqrt(p*p+mass[j]*mass[j]);
418 +    double px = p * sin ( 2*atan(exp(-eta[j]))) * cos(phi[j]);
419 +    double py = p * sin ( 2*atan(exp(-eta[j]))) * sin(phi[j]);
420 +    double pz = p * cos ( 2*atan(exp(-eta[j]))) ;
421 +    
422 +    vpht[j].SetXYZT(px,py,pz,e);
423 +    
424 +  }
425 +  
426 +  vpair = vpht[0] + vpht[1];
427 +  
428 +  res[0] = vpair.M();
429 +  res[1] = vpair.Eta();
430 +  res[2] = vpair.Phi();
431 +  res[3] = vpair.Pt();
432 +  res[4] = vpht[0].DeltaR(vpht[1]);
433 +  
434 +  
435 +  ///cout<<"dot: "<< vpht[0].E() <<" "<< vpht[1].E()<< " "<< vpht[0].X() <<" "<< vpht[1].X()<<" "<< vpht[0].Y() <<" "<< vpht[1].Y() <<" "<< vpht[0].Z() <<" "<< vpht[1].Z()<<endl;
436 +  
437 +  
438 +  // res[5] = vpht[0].Dot(vpht[1])/vpht[0].P()/vpht[1].P();
439 +  
440 +  
441 +  
442 + }
443 +
444 +
445 +
446 +
447 +
448 +
449 +
450 +
451 +
452 + ////invariant mass of two obejcts given, pid each.
453 + //void calcMass3Objects(float pt[3],float eta[3],float phi[3],int pid1,int pid2,int pid3,float res[]){
454 + void calcMass3Objects(double pt[3],double eta[3],double phi[3],int pid1,int pid2,int pid3,double res[]){
455 +  
456 +  TLorentzVector vpht[3];
457 +  
458 +  TLorentzVector vpair;
459 +  
460 +  float mass[3]={0,0,0};
461 +  
462 +  if(pid1==11) mass[0] = 0.511*0.001;
463 +  else if(pid1==13) mass[0] = 0.105658;
464 +  else if(pid1==22) mass[0] = 0;
465 +  else{
466 +    cout<<"calcPairMuPht, mass.pid1 "<<endl;
467 +    exit(1);
468 +  }
469 +  
470 +  if(pid2==11) mass[1] = 0.511*0.001;
471 +  else if(pid2==13) mass[1] = 0.105658;
472 +  else if(pid2 ==22) mass[1] = 0;
473 +  else {
474 +    cout<<"calcPairMuPht, mass. pid2"<<endl;
475 +    exit(1);
476 +  }
477 +  
478 +  if(pid3==11) mass[2] = 0.511*0.001;
479 +  else if(pid3==13) mass[2] = 0.105658;
480 +  else if(pid3 ==22) mass[2] = 0;
481 +  else {
482 +    cout<<"calcPairMuPht, mass. pid3"<<endl;
483 +    exit(1);
484 +  }
485 +  
486 +  
487 +  
488 +  
489 +  for( int j= 0; j<3; j++){
490 +    
491 +    float p = pt[j]/sin(2*atan(exp(-eta[j])));
492 +    float e = sqrt(p*p+mass[j]*mass[j]);
493 +    float px = p * sin ( 2*atan(exp(-eta[j]))) * cos(phi[j]);
494 +    float py = p * sin ( 2*atan(exp(-eta[j]))) * sin(phi[j]);
495 +    float pz = p * cos ( 2*atan(exp(-eta[j]))) ;
496 +    
497 +    vpht[j].SetXYZT(px,py,pz,e);
498 +    
499 +  }
500 +  
501 +  vpair = vpht[0] + vpht[1] + vpht[2];
502 +  
503 +  res[0] = vpair.M();
504 +  res[1] = vpair.Eta();
505 +  res[2] = vpair.Phi();
506 +  res[3] = vpair.Pt();
507 +  res[4] = vpht[0].DeltaR(vpht[1]);
508 +  
509 +  
510 +  
511 +
512 +  
513 + }
514 +
515 +
516 +
517 +
518 +
519 +
520 + void printRatioTwoHist(TH1F *h1, TH1F *h2){
521 +  
522 +  int nbins = h1->GetNbinsX();
523 +  
524 +  float xmin = h1->GetXaxis()->GetXmin() ;
525 +  float xmax = h1->GetXaxis()->GetXmax() ;
526 +  
527 +  TH1F *hh = new TH1F("hh","eff",nbins,xmin,xmax);
528 +  
529 +    
530 +  for(int j=1; j<= nbins; j++){
531 +    
532 +    float y1 = h1->GetBinContent(j);
533 +    float y2 = h2->GetBinContent(j);
534 +
535 +    float eff = 0;
536 +    float effErr = 0;
537 +    if(y1>0 && y2>0){
538 +      eff = y2/y1;
539 +      effErr = sqrt(eff*(1-eff)/y1);
540 +      
541 +      hh->SetBinContent(j,eff);
542 +      hh->SetBinError(j,effErr);
543 +    }
544 +  }
545 +  
546 +  // TCanvas *can0 = new TCanvas("can0","c000",200,10,550,500);
547 +  hh->Draw();
548 +  
549 +  
550 + }
551 +
552 + double etaTransformation(  float EtaParticle , float Zvertex)  {
553 +  
554 +  //---Definitions
555 +  const float pi = 3.1415927;
556 +
557 +  //---Definitions for ECAL
558 +  const float R_ECAL           = 136.5;
559 +  const float Z_Endcap         = 328.0;
560 +  const float etaBarrelEndcap  = 1.479;
561 +  
562 +  //---ETA correction
563 +
564 +  float Theta = 0.0  ;
565 +  float ZEcal = R_ECAL*sinh(EtaParticle)+Zvertex;
566 +
567 +  if(ZEcal != 0.0) Theta = atan(R_ECAL/ZEcal);
568 +  if(Theta<0.0) Theta = Theta+pi ;
569 +  double ETA = - log(tan(0.5*Theta));
570 +        
571 +  if( fabs(ETA) > etaBarrelEndcap )
572 +    {
573 +      float Zend = Z_Endcap ;
574 +      if(EtaParticle<0.0 )  Zend = -Zend ;
575 +      float Zlen = Zend - Zvertex ;
576 +      float RR = Zlen/sinh(EtaParticle);
577 +      Theta = atan(RR/Zend);
578 +      if(Theta<0.0) Theta = Theta+pi ;
579 +      ETA = - log(tan(0.5*Theta));                    
580 +    }
581 +  //---Return the result
582 +  return ETA;
583 +  //---end
584 + }
585 +
586 + ////transform eta ( z, pho), to eta at ecal ( w.r.t 0,0,0,)
587 + double ecalEta(double EtaParticle ,double Zvertex, double RhoVertex){
588 +  
589 +  
590 +  //  const Double_t PI    = 3.1415927;
591 +  double PI    = acos(-1);
592 +  
593 +  //---Definitions for ECAL
594 +  double R_ECAL           = 136.5;
595 +  double Z_Endcap         = 328.0;
596 +  double etaBarrelEndcap  = 1.479;
597 +
598 +  if (EtaParticle!= 0.)
599 +    {
600 +      double Theta = 0.0  ;
601 +      double ZEcal = (R_ECAL-RhoVertex)*sinh(EtaParticle)+Zvertex;
602 +      
603 +      if(ZEcal != 0.0) Theta = atan(R_ECAL/ZEcal);
604 +      if(Theta<0.0) Theta = Theta+PI;
605 +
606 +      double ETA = - log(tan(0.5*Theta));
607 +      
608 +      if( fabs(ETA) > etaBarrelEndcap )
609 +        {
610 +          double Zend = Z_Endcap ;
611 +          if(EtaParticle<0.0 )  Zend = -Zend ;
612 +          double Zlen = Zend - Zvertex ;
613 +          double RR = Zlen/sinh(EtaParticle);
614 +          Theta = atan((RR+RhoVertex)/Zend);
615 +          if(Theta<0.0) Theta = Theta+PI;
616 +          ETA = - log(tan(0.5*Theta));
617 +        }
618 +      return ETA;
619 +    }
620 +  else
621 +    {
622 +      return EtaParticle;
623 +    }
624 + }
625 +
626 +
627 + double ecalPhi(double phi,double x0,double y0){
628 +  
629 +  //double R_ECAL = 136.5; ///cm
630 +  double r = 136.5;
631 +
632 +  double r0 = sqrt(x0*x0 + y0*y0);
633 +  
634 +  if(r0<1E-5) return phi;
635 +  
636 +  if( r0 >= r){
637 +    cout<<"warning. ecalPhi vtx outside ecal return input" << r0 <<" "<< r <<endl;
638 +    return phi;
639 +  }
640 +  
641 +  double theta0 ;
642 +  if(fabs(y0)>0) theta0= y0/fabs(y0) * acos(x0/r0);
643 +  else theta0 = acos(x0/r0);
644 +  
645 +  ///  cout<<theta0<<" "<<phi<<endl;
646 +  
647 +  double theta = phi + asin( r0/r *sin(theta0-phi));
648 +
649 +  //phinorm2(theta);
650 +  double PI    = acos(-1);
651 +  while ( theta < -PI) theta += PI;
652 +  while ( theta > PI) theta -= PI;
653 +  
654 +  return theta;
655 +  
656 +  
657 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines