]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectronPair.h
-fix beam energy issue for polarization parameters
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronPair.h
1 #ifndef ALIDIELECTRONPAIR_H
2 #define ALIDIELECTRONPAIR_H
3 /* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 //#############################################################
7 //#                                                           # 
8 //#                  AliDielectronPair                        #
9 //#               Class to store pair information             #
10 //#                                                           #
11 //#                                                           #
12 //#  Authors:                                                 #
13 //#   Anton     Andronic, GSI / A.Andronic@gsi.de             #
14 //#   Ionut C.  Arsene,   GSI / I.C.Arsene@gsi.de             #
15 //#   Julian    Book,     Uni Ffm / Julian.Book@cern.ch       #
16 //#   Frederick Kramer,   Uni Ffm, / Frederick.Kramer@cern.ch #
17 //#   Magnus    Mager,    CERN / Magnus.Mager@cern.ch         #
18 //#   WooJin J. Park,     GSI / W.J.Park@gsi.de               #
19 //#   Jens      Wiechula, Uni HD / Jens.Wiechula@cern.ch      #
20 //#                                                           #
21 //#############################################################
22
23 #include <TMath.h>
24 #include <TRef.h>
25 #include <TLorentzVector.h>
26
27 #include <AliKFParticle.h>
28 #include <AliVParticle.h>
29 #include <AliVEvent.h>
30
31 class AliVVertex;
32 class AliVTrack;
33
34 //TODO
35 //TODO: Should we inherit from AliVTrack in order to built another AliDielectronPair of KF with it?
36 //TODO
37 class AliDielectronPair : public AliVParticle {
38 public:
39   AliDielectronPair();
40   virtual ~AliDielectronPair();
41   
42   AliDielectronPair(AliVTrack * const particle1, Int_t pid1,
43                     AliVTrack * const particle2, Int_t pid2, Char_t type);
44
45   AliDielectronPair(const AliKFParticle * const particle1,
46                     const AliKFParticle * const particle2,
47                     AliVTrack * const refParticle1,
48                     AliVTrack * const refParticle2,
49                     Char_t type);
50   
51 //TODO:  copy constructor + assignment operator
52   
53   void SetTracks(AliVTrack * const particle1, Int_t pid1,
54                  AliVTrack * const particle2, Int_t pid2);
55
56   void SetGammaTracks(AliVTrack * const particle1, Int_t pid1,
57                       AliVTrack * const particle2, Int_t pid2);
58
59
60   void SetTracks(const AliKFParticle * const particle1,
61                  const AliKFParticle * const particle2,
62                  AliVTrack * const refParticle1,
63                  AliVTrack * const refParticle2);
64     
65   //AliVParticle interface
66   // kinematics
67   virtual Double_t Px() const { return fPair.GetPx(); }
68   virtual Double_t Py() const { return fPair.GetPy(); }
69   virtual Double_t Pz() const { return fPair.GetPz(); }
70   virtual Double_t Pt() const { return fPair.GetPt(); }
71   virtual Double_t P() const  { return fPair.GetP();  }
72   virtual Bool_t   PxPyPz(Double_t p[3]) const { p[0]=Px(); p[1]=Py(); p[2]=Pz(); return kTRUE; }
73   
74   virtual Double_t Xv() const { return fPair.GetX(); }
75   virtual Double_t Yv() const { return fPair.GetY(); }
76   virtual Double_t Zv() const { return fPair.GetZ(); }
77   virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0]=Xv(); x[1]=Yv(); x[2]=Zv(); return kTRUE; }
78   
79   virtual Double_t OneOverPt() const { return Pt()>0.?1./Pt():0.; }  //TODO: check
80   virtual Double_t Phi()       const { return fPair.GetPhi();}
81   virtual Double_t Theta()     const { return Pz()!=0?TMath::ATan(Pt()/Pz()):0.; } //TODO: check
82   
83   
84   virtual Double_t E() const { return fPair.GetE();    }
85   virtual Double_t M() const { return fPair.GetMass(); }
86   
87   virtual Double_t Eta() const { return fPair.GetEta();}
88   virtual Double_t Y()  const  { 
89     if((E()*E()-Px()*Px()-Py()*Py()-Pz()*Pz())>0.) return TLorentzVector(Px(),Py(),Pz(),E()).Rapidity();
90     else return -1111.;
91   }
92   
93   virtual Short_t Charge() const    { return fPair.GetQ();}
94   virtual Int_t   GetLabel() const  { return fLabel;      }
95   // PID
96   virtual const Double_t *PID() const { return 0;} //TODO: check
97
98   //
99   // Double_t GetLXY(const AliVVertex * const vtx) const;
100   // Double_t GetPseudoProperTime(const AliVVertex * const vtx) const;
101
102
103   UChar_t GetType() const { return fType; }
104   void SetType(Char_t type) { fType=type; }
105   static void SetBeamEnergy(AliVEvent *ev, Double_t beamEbyHand=-1.);
106
107   // MC information
108   void SetLabel(Int_t label) {fLabel=label;}
109   void SetPdgCode(Int_t pdgCode) { fPdgCode=pdgCode; }
110   Int_t PdgCode() const {return fPdgCode;}
111
112   void SetProductionVertex(const AliKFParticle &Vtx) { fPair.SetProductionVertex(Vtx); }
113   
114   //inter leg information
115   Double_t GetKFChi2()            const { return fPair.GetChi2();                               }
116   Int_t    GetKFNdf()             const { return fPair.GetNDF();                                }
117   Double_t OpeningAngle()         const { return fD1.GetAngle(fD2);                             }
118   Double_t DistanceDaughters()    const { return fD1.GetDistanceFromParticle(fD2);              }
119   Double_t DistanceDaughtersXY()  const { return fD1.GetDistanceFromParticleXY(fD2);            }
120   Double_t DeviationDaughters()   const { return fD1.GetDeviationFromParticle(fD2);             }
121   Double_t DeviationDaughtersXY() const { return fD1.GetDeviationFromParticleXY(fD2);           }
122   Double_t DeltaEta()             const { return TMath::Abs(fD1.GetEta()-fD2.GetEta());         }
123   Double_t DeltaPhi()             const { Double_t dphi=TMath::Abs(fD1.GetPhi()-fD2.GetPhi());
124                                           return (dphi>TMath::Pi())?dphi-TMath::Pi():dphi;      }
125
126   // calculate cos(theta*) and phi* in HE and CS pictures
127   void GetThetaPhiCM(Double_t &thetaHE, Double_t &phiHE, Double_t &thetaCS, Double_t &phiCS) const;
128   
129   Double_t ThetaPhiCM(Bool_t isHE, Bool_t isTheta) const;
130   static Double_t ThetaPhiCM(const AliVParticle* d1, const AliVParticle* d2, 
131                                                const Bool_t isHE, const Bool_t isTheta);
132
133   Double_t PsiPair(Double_t MagField)const; //Angle cut w.r.t. to magnetic field
134   Double_t PhivPair(Double_t MagField)const; //Angle of ee plane w.r.t. to magnetic field
135   Double_t GetCosPointingAngle(const AliVVertex *primVtx) const;
136   // internal KF particle
137   const AliKFParticle& GetKFParticle()       const { return fPair; }
138   const AliKFParticle& GetKFFirstDaughter()  const { return fD1;   }
139   const AliKFParticle& GetKFSecondDaughter() const { return fD2;   }
140   
141   // daughter references
142   void SetRefFirstDaughter(AliVParticle * const track)  {fRefD1 = track;}
143   void SetRefSecondDaughter(AliVParticle * const track) {fRefD2 = track;}
144   
145   AliVParticle* GetFirstDaughter()   const { return dynamic_cast<AliVParticle*>(fRefD1.GetObject()); }
146   AliVParticle* GetSecondDaughter()  const { return dynamic_cast<AliVParticle*>(fRefD2.GetObject()); }
147
148   void SetKFUsage(Bool_t KFUsage) {fKFUsage = KFUsage;}
149   Bool_t GetKFUsage() const {return fKFUsage;}
150
151
152   
153 private:
154   Char_t   fType;         // type of the pair e.g. like sign SE, unlike sign SE, ... see AliDielectron
155   Int_t    fLabel;        // MC label
156   Int_t    fPdgCode;      // pdg code in case it is a MC particle
157   static Double_t fBeamEnergy; //!beam energy
158   
159   AliKFParticle fPair;   // KF particle internally used for pair calculation
160   AliKFParticle fD1;     // KF particle first daughter
161   AliKFParticle fD2;     // KF particle1 second daughter
162   
163   TRef fRefD1;           // Reference to first daughter
164   TRef fRefD2;           // Reference to second daughter
165
166   Bool_t fKFUsage;       // Use KF for vertexing
167   
168   ClassDef(AliDielectronPair,5)
169 };
170
171 #endif