]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PHOS/AliPHOSFastRecParticle.cxx
correct mask for V0 charge decoding in STU payload
[u/mrichter/AliRoot.git] / PHOS / AliPHOSFastRecParticle.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 /* History of cvs commits:
19  *
20  * $Log$
21  * Revision 1.39  2005/05/28 14:19:04  schutz
22  * Compilation warnings fixed by T.P.
23  *
24  */
25
26 //_________________________________________________________________________
27 //  A  Particle modified by PHOS response and produced by AliPHOSvFast
28 //  To become a general class of AliRoot ?    
29 //--
30 //  This is also a base class for AliPHOSRecParticle produced by AliPHOSPIDv1
31 //  The rec.particle type is to be defined by AliPHOSvFast or AliPHOSPIDv1
32 //--
33 //*-- Author: Yves Schutz (SUBATECH)
34
35 // --- ROOT system ---
36
37 // --- Standard library ---
38
39 // --- AliRoot header files ---
40 #include "AliLog.h"
41 #include "AliPHOSFastRecParticle.h"
42 #include "TPad.h"
43 #include "TPaveText.h"
44
45 ClassImp(AliPHOSFastRecParticle) 
46
47 //____________________________________________________________________________
48 AliPHOSFastRecParticle::AliPHOSFastRecParticle() :
49   fIndexInList(0),
50   fTof(0.f),
51   fType(0)
52 {
53   // ctor
54
55   for(Int_t i=0; i<AliPID::kSPECIESN; i++) {
56     fPID[i] = -111.;
57   }
58   
59 }
60
61 //____________________________________________________________________________
62  AliPHOSFastRecParticle::AliPHOSFastRecParticle(const AliPHOSFastRecParticle & rp)
63    : TParticle(rp),
64      fIndexInList(rp.fIndexInList),//?
65      fTof(rp.fTof),//?
66      fType(rp.fType)
67 {
68   // copy ctor
69   fPdgCode     = rp.fPdgCode;
70   fStatusCode  = rp.fStatusCode;
71   fMother[0]   = rp.fMother[0];
72   fMother[1]   = rp.fMother[1];
73   fDaughter[0] = rp.fDaughter[0];
74   fDaughter[1] = rp.fDaughter[1];
75   fWeight      = rp.fWeight;
76   fCalcMass    = rp.fCalcMass;
77   fPx          = rp.fPx;
78   fPy          = rp.fPy;
79   fPz          = rp.fPz;
80   fE           = rp.fE;
81   fVx          = rp.fVx;
82   fVy          = rp.fVy;
83   fVz          = rp.fVz;
84   fVt          = rp.fVt;
85   fPolarTheta  = rp.fPolarTheta;
86   fPolarPhi    = rp.fPolarPhi;
87   fParticlePDG = rp.fParticlePDG;
88
89   for(Int_t i=0; i<AliPID::kSPECIESN; i++) {
90     fPID[i] = rp.fPID[i];
91   }
92  
93 }
94
95 //____________________________________________________________________________
96  AliPHOSFastRecParticle::AliPHOSFastRecParticle(const TParticle & pp) :
97    fIndexInList(0),
98    fTof(0.f),
99    fType(0)
100 {
101   // ctor from a TParticle (crummy?!)
102   TParticle & pnoconst = (TParticle &)(pp) ;
103   AliPHOSFastRecParticle & p = (AliPHOSFastRecParticle &)(pnoconst) ;
104   fPdgCode     = p.fPdgCode;
105   fStatusCode  = p.fStatusCode;
106   fMother[0]   = p.fMother[0];
107   fMother[1]   = p.fMother[1];
108   fDaughter[0] = p.fDaughter[0];
109   fDaughter[1] = p.fDaughter[1];
110   fWeight      = p.fWeight;
111   fCalcMass    = p.fCalcMass;
112   fPx          = p.fPx;
113   fPy          = p.fPy;
114   fPz          = p.fPz;
115   fE           = p.fE;
116   fVx          = p.fVx;
117   fVy          = p.fVy;
118   fVz          = p.fVz;
119   fVt          = p.fVt;
120   fPolarTheta  = p.fPolarTheta;
121   fPolarPhi    = p.fPolarPhi;
122   fParticlePDG = p.fParticlePDG; 
123   
124   for(Int_t i=0; i<AliPID::kSPECIESN; i++) {
125     fPID[i] = p.fPID[i];
126   }
127   
128 }
129
130 //____________________________________________________________________________
131 Int_t AliPHOSFastRecParticle::DistancetoPrimitive(Int_t px, Int_t py)
132 {
133   //  Compute distance from point px,py to a AliPHOSFastRecParticle considered as a Tmarker
134   //  Compute the closest distance of approach from point px,py to this marker.
135   //  The distance is computed in pixels units.
136
137   Double_t kRADDEG = 180. / TMath::Pi() ; 
138   Coord_t x = Phi() * kRADDEG     ;
139   Coord_t y = Theta() * kRADDEG     ;
140   const Int_t kMaxDiff = 10;
141   Int_t pxm  = gPad->XtoAbsPixel(x);
142   Int_t pym  = gPad->YtoAbsPixel(y);
143   Int_t dist = (px-pxm)*(px-pxm) + (py-pym)*(py-pym);
144   
145   if (dist > kMaxDiff) return 9999;
146   return dist;
147 }
148
149 //___________________________________________________________________________
150  void AliPHOSFastRecParticle::Draw(Option_t *option)
151  {
152    // Draw this AliPHOSFastRecParticle with its current attributes
153     
154    AppendPad(option);
155  }
156
157 //______________________________________________________________________________
158 void AliPHOSFastRecParticle::ExecuteEvent(Int_t event, Int_t , Int_t )
159 {
160   //  Execute action corresponding to one event
161   //  This member function is called when a AliPHOSFastRecParticle is clicked with the locator
162   
163   if (!gPad->IsEditable()) 
164     return ;
165   
166   static TPaveText * clustertext = 0 ; 
167   
168   switch (event) {
169     
170   case kButton1Down: {
171     Double_t kRADDEG = 180. / TMath::Pi() ; 
172     Coord_t x = Phi() * kRADDEG     ;
173     Coord_t y = Theta() * kRADDEG     ;
174     clustertext = new TPaveText(x-1, y+1, x+5, y+3, "") ;
175     Text_t  line1[40] ;
176     Text_t  line2[40] ;
177     snprintf( line1,40, "PID: %s ", (const char*)Name() ) ;
178     snprintf( line2,40, "ENERGY: %f ", Energy() ) ;
179     clustertext ->AddText(line1) ;
180     clustertext ->AddText(line2) ;
181     clustertext ->Draw("");   
182     gPad->Update() ; 
183     break ;
184   }
185   
186   case kButton1Up: {
187     delete clustertext ; 
188     clustertext = 0 ; 
189     gPad->Update() ; 
190     break ;
191   }
192   }
193   
194 }
195
196 //____________________________________________________________________________
197 Bool_t AliPHOSFastRecParticle::IsPhoton(TString purity) const
198 {
199   // Rec.Particle is a photon if it has a photon-like shape, fast and neutral
200   // photon-like shape is defined with a purity "low", "medium" or "high"
201
202   purity.ToLower();
203   Bool_t photonLike = kFALSE;
204   if      (purity == "low"   ) photonLike = TestPIDBit(6);
205   else if (purity == "medium") photonLike = TestPIDBit(7);
206   else if (purity == "high"  ) photonLike = TestPIDBit(8);
207   if (photonLike                                   && //  photon by PCA
208       (TestPIDBit(5)||TestPIDBit(4)||TestPIDBit(3))&& //  fast by TOF
209       (TestPIDBit(2)||TestPIDBit(1)||TestPIDBit(0))&& //  neutral by CPV
210       !TestPIDBit(14))                              //  no charged track
211     return kTRUE ;
212   else
213     return kFALSE;
214 }
215
216 //____________________________________________________________________________
217 Bool_t AliPHOSFastRecParticle::IsPi0(TString purity) const
218 {
219   // Rec.Particle is a pi0 if it has a pi0-like shape, fast and neutral
220   // pi0-like shape is defined with a purity "low", "medium" or "high"
221
222   purity.ToLower();
223   Bool_t pi0Like = kFALSE;
224   if      (purity == "low"   ) pi0Like = TestPIDBit(9);
225   else if (purity == "medium") pi0Like = TestPIDBit(10);
226   else if (purity == "high"  ) pi0Like = TestPIDBit(11);
227   else 
228     AliError(Form("Wrong purity type: %s",purity.Data()));
229   if (pi0Like                                      && //  pi0 by PCA
230       (TestPIDBit(5)||TestPIDBit(4)||TestPIDBit(3))&& //  fast by TOF
231       (TestPIDBit(2)||TestPIDBit(1)||TestPIDBit(0))&& //  neutral by CPV
232       !TestPIDBit(14))                              //  no charged track
233     return kTRUE ;
234   else
235     return kFALSE;
236 }
237
238 //____________________________________________________________________________
239 Bool_t AliPHOSFastRecParticle::IsElectron(TString purity) const
240 {
241   // Rec.Particle is an electron if it has a photon-like shape, fast and charged
242   // photon-like shape is defined with a purity "low", "medium" or "high"
243
244   purity.ToLower();
245   Bool_t photonLike = kFALSE;
246   if      (purity == "low"   ) photonLike = TestPIDBit(6);
247   else if (purity == "medium") photonLike = TestPIDBit(7);
248   else if (purity == "high"  ) photonLike = TestPIDBit(8);
249   else 
250     AliError(Form("Wrong purity type: %s",purity.Data()));
251   
252   if (photonLike                                   && //  photon by PCA
253       (TestPIDBit(5)|| TestPIDBit(4)|| TestPIDBit(3))&& //  fast by TOF
254       (!TestPIDBit(2)||!TestPIDBit(1)||!TestPIDBit(0))&& //  charged by CPV
255       TestPIDBit(14))                                  //  no charged track
256     return kTRUE ;
257   else
258     return kFALSE;
259 }
260
261 //____________________________________________________________________________
262 Bool_t AliPHOSFastRecParticle::IsEleCon(TString purity) const
263 {
264   // Rec.Particle is an electron if it has a photon-like shape, fast and charged
265   // photon-like shape is defined with a purity "low", "medium" or "high"
266
267   purity.ToLower();
268   Bool_t photonLike = kFALSE;
269   if      (purity == "low"   ) photonLike = TestPIDBit(6);
270   else if (purity == "medium") photonLike = TestPIDBit(7);
271   else if (purity == "high"  ) photonLike = TestPIDBit(8);
272   else 
273     AliError(Form("Wrong purity type: %s",purity.Data()));
274   
275   if (photonLike                                   && //  photon by PCA
276       (TestPIDBit(5)|| TestPIDBit(4)|| TestPIDBit(3))&& //  fast by TOF
277       (!TestPIDBit(2)||!TestPIDBit(1)||!TestPIDBit(0))&& //  charged by CPV
278       !TestPIDBit(14))                                  //  no charged track
279     return kTRUE ;
280   else
281     return kFALSE;
282 }
283
284 //____________________________________________________________________________
285 Bool_t AliPHOSFastRecParticle::IsHardPhoton() const
286 {
287   // Rec.Particle is a hard photon (E > 30 GeV) if its second moment M2x
288   // corresponds to photons
289   if (TestPIDBit(12) && !TestPIDBit(14))
290     return kTRUE;
291   else
292     return kFALSE;
293 }
294
295 //____________________________________________________________________________
296 Bool_t AliPHOSFastRecParticle::IsHardPi0() const
297 {
298   // Rec.Particle is a hard pi0 (E > 30 GeV) if its second moment M2x
299   // corresponds to pi0
300   if (TestPIDBit(13)&& !TestPIDBit(14))
301     return kTRUE;
302   else
303     return kFALSE;
304 }
305
306 //____________________________________________________________________________
307 Bool_t AliPHOSFastRecParticle::IsHadron() const
308 {
309   // Rec.Particle is an hadron if it does not look like
310   // a low-purity photon nor low-purity pi0
311
312   if ( !TestPIDBit(6) && !TestPIDBit(9) )             // not photon nor pi0
313     return kTRUE ;
314   else
315     return kFALSE;
316 }
317
318 //____________________________________________________________________________
319 Bool_t AliPHOSFastRecParticle::IsChargedHadron() const
320 {
321   // Rec.Particle is a charged hadron if it does not look like
322   // a low-purity photon nor low-purity pi0 and is low-purity charged
323
324   if ( !TestPIDBit(6) && !TestPIDBit(9) &&            // not photon nor pi0
325        !TestPIDBit(2))                                // charged by CPV
326     return kTRUE ;
327   else
328     return kFALSE;
329 }
330
331 //____________________________________________________________________________
332 Bool_t AliPHOSFastRecParticle::IsNeutralHadron() const
333 {
334   // Rec.Particle is a neutral hadron if it does not look like
335   // a low-purity photon nor low-purity pi0 and is high-purity neutral
336
337   if ( !TestPIDBit(6) && !TestPIDBit(9) &&            // not photon nor pi0
338         TestPIDBit(2))                                // neutral by CPV
339     return kTRUE ;
340   else
341     return kFALSE;
342 }
343
344 //____________________________________________________________________________
345 Bool_t AliPHOSFastRecParticle::IsFastChargedHadron() const
346 {
347   // Rec.Particle is a fast charged hadron if it does not look like
348   // a low-purity photon nor low-purity pi0, is low-purity charged
349   // and is high-purity fast
350
351   if ( !TestPIDBit(6) && !TestPIDBit(9) &&            // not photon nor pi0
352        !TestPIDBit(2) &&                              // charged by CPV
353         TestPIDBit(5))                                // fast by TOF
354     return kTRUE ;
355   else
356     return kFALSE;
357 }
358
359 //____________________________________________________________________________
360 Bool_t AliPHOSFastRecParticle::IsSlowChargedHadron() const
361 {
362   // Rec.Particle is a slow neutral hadron if it does not look like
363   // a low-purity photon nor low-purity pi0, is high-purity neutral
364   // and is not high-purity fast
365
366   if ( !TestPIDBit(6) && !TestPIDBit(9) &&            // not photon nor pi0
367        !TestPIDBit(2) &&                              // charged by CPV
368        !TestPIDBit(5))                                // slow by TOF
369     return kTRUE ;
370   else
371     return kFALSE;
372
373 }
374
375 //____________________________________________________________________________
376 Bool_t AliPHOSFastRecParticle::IsFastNeutralHadron() const
377 {
378   // Rec.Particle is a fast neutral hadron if it does not look like
379   // a low-purity photon nor low-purity pi0, is high-purity neutral
380   // and is high-purity fast
381
382   if ( !TestPIDBit(6) && !TestPIDBit(9) &&            // not photon nor pi0
383         TestPIDBit(2) &&                              // neutral by CPV
384         TestPIDBit(5))                                // fast by TOF
385     return kTRUE ;
386   else
387     return kFALSE;
388 }
389
390 //____________________________________________________________________________
391 Bool_t AliPHOSFastRecParticle::IsSlowNeutralHadron() const
392 {
393   // Rec.Particle is a slow neutral hadron if it does not look like
394   // a low-purity photon nor low-purity pi0, is high-purity neutral
395   // and is not high-purity fast
396
397   if ( !TestPIDBit(6) && !TestPIDBit(9) &&            // not photon nor pi0
398         TestPIDBit(2) &&                              // neutral by CPV
399        !TestPIDBit(5))                                // slow by TOF
400     return kTRUE ;
401   else
402     return kFALSE;
403 }
404
405 //____________________________________________________________________________
406 TString AliPHOSFastRecParticle::Name() const
407 {
408   // Returns the name of the particle type (only valid if PIDv1 is employed)
409
410   TString  name ; 
411
412   name = "Undefined particle" ;
413   
414   if      (IsPhoton("low"))
415     name = "Photon low purity, ";
416   else if (IsPhoton("medium"))
417     name = "Photon medium purity, ";
418   else if (IsPhoton("high"))
419     name = "Photon high purity, ";
420
421   if      (IsPi0("low"))
422     name = "Pi0 low purity, ";
423   else if (IsPi0("medium"))
424     name = "Pi0 medium purity, ";
425   else if (IsPi0("high"))
426     name = "Pi0 high purity, ";
427
428   if      (IsElectron("low"))
429     name = "Electron low purity, ";
430   else if (IsElectron("medium"))
431     name = "Electron medium purity, ";
432   else if (IsElectron("high"))
433     name = "Electron high purity, ";
434
435   if     (IsHadron()) {
436     name = "hadron";
437     if      (IsChargedHadron()) {
438       name.Prepend("charged, ");
439       if      (IsFastChargedHadron())
440         name.Prepend("fast, ");
441       else if (IsSlowChargedHadron())
442         name.Prepend("slow, ");
443     }
444     else if (IsNeutralHadron()) {
445       name.Prepend("neutral, ");
446       if      (IsFastNeutralHadron())
447         name.Prepend("fast, ");
448       else if (IsSlowNeutralHadron())
449         name.Prepend("slow, ");
450     }
451   }
452
453   return name ; 
454 }
455
456
457 //______________________________________________________________________________
458 void AliPHOSFastRecParticle::SetType(Int_t type) { 
459   // sets the particle type 
460   // bit-mask of the particle type means the following:
461   // bits 0,1,2   - neutral particle with low, medium and high purity
462   // bits 3.4,5   - fast particle with low, medium and high purity
463   // bits 6.7,8   - photon shower with low, medium and high purity
464   // bits 9,10,11 - hard-pi0 shower with low, medium and high purity
465
466   fType = type ; 
467   
468   if((type == 127) || (fType == 511) || (fType == 255) ||(fType == 383)||(fType == 447)){
469     fPdgCode = 22 ; 
470     return ;
471   }
472   
473   if ((fType == 63)|| ((fType < 8)&&(fType > 0)) ){
474     fPdgCode = 2112 ; 
475     return ;
476   }
477   if ( ((fType == 504) || (fType == 505) ||(fType == 248)||(fType == 249)||(fType == 120)||(fType == 121)) ){
478     fPdgCode = 11 ; 
479     return ;
480   }
481   if ((fType == 448) || (fType == 449) ||(fType == 192)||(fType == 193)||(fType == 64)||(fType == 64)){
482     fPdgCode = 13 ; 
483     return ;
484   }
485   if((fType == 56)||(fType == 57)){
486     fPdgCode = 211 ; 
487     return ;
488   }
489   if (fType == 0){
490     fPdgCode = 2212 ; 
491     return ;
492   }
493
494 }           
495
496 //______________________________________________________________________________
497 void AliPHOSFastRecParticle::Paint(Option_t *)
498 {
499   // Paint this ALiRecParticle in theta,phi coordinate as a TMarker  with its current attributes
500
501   Double_t kRADDEG = 180. / TMath::Pi() ; 
502   Coord_t x = Phi() * kRADDEG     ;
503   Coord_t y = Theta() * kRADDEG     ;
504   Color_t markercolor = 1 ;
505   Size_t  markersize  = 1. ;
506   Style_t markerstyle = 5 ;
507   
508   if (!gPad->IsBatch()) {
509     gVirtualX->SetMarkerColor(markercolor) ;
510     gVirtualX->SetMarkerSize (markersize)  ;
511     gVirtualX->SetMarkerStyle(markerstyle) ;
512   }
513   gPad->SetAttMarkerPS(markercolor,markerstyle,markersize) ;
514   gPad->PaintPolyMarker(1,&x,&y,"") ;
515 }
516
517 //____________________________________________________________________________
518 void AliPHOSFastRecParticle::Print(const Option_t *)const
519 {
520   // Print the type, energy and momentum of the reconstructed particle
521
522   AliInfo(Form("Print  -----------------------------")) ;  
523   printf("PID bits are %d%d%d %d%d%d %d%d%d %d%d%d",  
524          TestPIDBit(0),TestPIDBit(1),
525          TestPIDBit(2),TestPIDBit(3),
526          TestPIDBit(4),TestPIDBit(5),
527          TestPIDBit(6),TestPIDBit(7),
528          TestPIDBit(8),TestPIDBit(9),
529          TestPIDBit(10),TestPIDBit(11)) ; 
530   printf(", type is \"%s\"\n", Name().Data()) ; 
531   printf("  (E,Px,Py,Pz) = (% .3e, % .3e, % .3e, % .3e) GeV\n",     
532          Energy(), 
533          Px(), 
534          Py(),
535          Pz() ) ; 
536   printf("  TOF = %.3e ns\n", ToF() ) ; 
537   printf("  PID weight: \n" ) ;
538   printf("             photon ->              %f\n", fPID[AliPID::kPhoton] ) ; 
539   printf("             electron ->            %f\n", fPID[AliPID::kElectron] ) ; 
540   printf("             Conversion electron -> %f\n", fPID[AliPID::kEleCon] ) ; 
541   printf("             muon ->                %f\n", fPID[AliPID::kMuon] ) ; 
542   printf("             neutral pion ->        %f\n", fPID[AliPID::kPi0] ) ; 
543   printf("             charged pion ->        %f\n", fPID[AliPID::kPion] ) ; 
544   printf("             charged kaon ->        %f\n", fPID[AliPID::kKaon] ) ; 
545   printf("             neutral kaon ->        %f\n", fPID[AliPID::kKaon0] ) ; 
546   printf("             proton ->              %f\n", fPID[AliPID::kProton] ) ; 
547   printf("             neutron ->             %f\n", fPID[AliPID::kNeutron] ) ; 
548
549 }