98a33b40e405e85b44563fedaa6df8d2b577e550
[u/mrichter/AliRoot.git] / HBTAN / AliHBTPair.h
1 #ifndef ALIHBTPAIR_H
2 #define ALIHBTPAIR_H
3 //_________________________________________________________________________
4 ///////////////////////////////////////////////////////////////////////////
5 //
6 // class AliHBTPair
7 //
8 // class implements pair of particles and taking care of caluclation (almost)
9 // all of pair properties (Qinv, InvMass,...)
10 // more info: http://alisoft.cern.ch/people/skowron/analyzer/index.html
11 //
12 ////////////////////////////////////////////////////////////////////////////
13
14 #include <TObject.h>
15 #include "AliHBTParticle.h"
16
17
18 class AliHBTPair: public TObject
19 {
20  public:
21    AliHBTPair(Bool_t rev = kFALSE); //contructor
22    AliHBTPair(AliHBTParticle* part1, AliHBTParticle* part2, Bool_t rev = kFALSE); //contructor
23    AliHBTPair(const AliHBTPair& in);
24    
25    virtual ~AliHBTPair(){}
26    
27    AliHBTPair& operator=(const AliHBTPair& in);
28    
29    void SetParticles(AliHBTParticle* p1,AliHBTParticle* p2); //sets particles in the pair
30    AliHBTPair* GetSwapedPair() {return fSwapedPair;} //returns pair with swapped particles
31    
32    AliHBTParticle* Particle1() const {return fPart1;} //returns pointer to first particle
33    AliHBTParticle* Particle2() const {return fPart2;} //returns pointer to decond particle
34    
35    void Changed();
36    //Center Mass System - Longitudinally Comoving
37    
38    virtual Double_t GetInvMass(); //returns invariant mass of the pair
39    virtual Double_t GetMt();
40    virtual Double_t GetQInv(); //returns Q invariant
41    virtual Double_t GetQSideCMSLC(); //returns Q Side CMS longitudionally co-moving
42    virtual Double_t GetQOutCMSLC(); //returns Q out CMS longitudionally co-moving
43    virtual Double_t GetQLongCMSLC(); //returns Q Long CMS longitudionally co-moving
44    
45    
46    virtual Double_t GetKt();  //returns K transverse
47    virtual Double_t GetKStar();
48    
49    virtual Double_t GetDeltaP(); //return difference of momenta
50    virtual Double_t GetDeltaPx();
51    virtual Double_t GetDeltaPy();
52    virtual Double_t GetDeltaPz();
53    
54    virtual Double_t GetGammaToCMSLC();
55    Double_t GetWeight();
56  protected:
57    AliHBTParticle* fPart1;  //pointer to first particle
58    AliHBTParticle* fPart2;  //pointer to second particle
59   
60    AliHBTPair* fSwapedPair; //pointer to swapped pair
61    
62 /************************************************************/
63 /************CMS (LC) Q's   *********************************/
64 /************************************************************/
65    //Center Mass System - Longitudinally Comoving
66    
67    Double_t fQSideCMSLC;  //value of Q side CMS longitudially co-moving
68    Bool_t   fQSideCMSLCNotCalc; //flag indicating if fQSideCMSLC is already calculated for this pair
69    
70    Double_t fQOutCMSLC; //value of Q out CMS longitudially co-moving
71    Bool_t   fQOutCMSLCNotCalc;//flag indicating if fQOutCMSLC is already calculated for this pair
72    
73    Double_t fQLongCMSLC; //value of Q long CMS longitudially co-moving
74    Bool_t   fQLongCMSLCNotCalc;//flag indicating if fQLongCMSLC is already calculated for this pair
75 /************************************************************/
76 /************************************************************/
77    Double_t fQInv;  //half of differnece of 4-momenta
78    Bool_t   fQInvNotCalc;//flag indicating if fQInv is already calculated for this pair
79    
80    Double_t fInvMass;  //invariant mass
81    Bool_t   fInvMassNotCalc;//flag indicating if fInvMass is already calculated for this pair
82    
83    Double_t fKt; //K == sum vector of particle's momenta. Kt transverse component
84    Bool_t   fKtNotCalc;//flag indicating if fKt is already calculated for this pair
85    
86    Double_t fKStar; // KStar
87    Bool_t   fKStarNotCalc;// flag indicating if fKStar is calculated
88    
89    Double_t fPInv;  //invariant momentum
90    
91    Double_t fQSide; //Q Side
92    Double_t fOut;//Q Out
93    Double_t fQLong;//Q Long
94
95    Double_t fMt;//Transverse coordinate of Inv. Mass
96    Bool_t   fMtNotCalc;//flag indicating if Mt is calculated for current pair
97       
98    Double_t fInvMassSqr;//squre of invariant mass
99    Bool_t   fMassSqrNotCalc; //flag indicating if fInvMassSqr for this pair
100    void     CalculateInvMassSqr();
101    
102    Double_t fQInvL; //Qinv in longitudional direction
103    Bool_t   fQInvLNotCalc;//flag indicating if fQInvL is calculated for current pair
104    void     CalculateQInvL();
105
106    Double_t fWeight;//Value of the weight
107    Bool_t   fWeightNotCalc;//flag indicating if fWeight is calculated for current pair
108    
109    Double_t fPxSum;// Sum of Px momenta
110    Double_t fPySum;// Sum of Py momenta
111    Double_t fPzSum;// Sum of Pz momenta
112    Double_t fESum;// Sum of energies
113    Bool_t   fSumsNotCalc;//flag indicating if fPxSum,fPxSum,fPxSum and fESum is calculated for current pair
114    void     CalculateSums();
115    
116    Double_t fPxDiff;// Difference of Px momenta
117    Double_t fPyDiff;// Difference of Px momenta
118    Double_t fPzDiff;// Difference of Px momenta
119    Double_t fEDiff;// Difference of Px momenta
120    Bool_t   fDiffsNotCalc;//flag indicating if fPxDiff,fPxDiff,fPxDiff and fEDiff is calculated for current pair
121    void     CalculateDiffs();
122    
123    Double_t fGammaCMSLC;//gamma of boost in CMSLC
124    Bool_t   fGammaCMSLCNotCalc;//flag indicating if fGammaCMSLC is calculated for current pair
125    /***************************************************/
126    void CalculateBase();
127    Bool_t fChanged;//flag indicating if object has been changed
128    
129    
130  private:
131   ClassDef(AliHBTPair,1)
132 };
133 /****************************************************************/
134 inline
135 void AliHBTPair::SetParticles(AliHBTParticle* p1,AliHBTParticle* p2)
136 {
137  //sets the particle to the pair
138  
139  fPart1 = p1;
140  fPart2 = p2;
141  if (fSwapedPair) //if we have Swaped (so we are not)
142    fSwapedPair->SetParticles(p2,p1); //set particles for him too
143  Changed();
144  //and do nothing until will be asked for
145
146 /****************************************************************/
147
148 inline
149 void AliHBTPair::Changed()
150 {
151  // Resel all calculations (flags)
152  fChanged           = kTRUE;
153  fSumsNotCalc       = kTRUE;
154  fDiffsNotCalc      = kTRUE;
155  fMassSqrNotCalc    = kTRUE;
156  fInvMassNotCalc    = kTRUE;
157  fQInvNotCalc       = kTRUE;
158  fMtNotCalc         = kTRUE;
159  fQSideCMSLCNotCalc = kTRUE;
160  fQOutCMSLCNotCalc  = kTRUE;
161  fQLongCMSLCNotCalc = kTRUE;
162  fKtNotCalc         = kTRUE;
163  fKStarNotCalc      = kTRUE;
164  fQInvLNotCalc      = kTRUE;
165  fGammaCMSLCNotCalc = kTRUE;
166  fWeightNotCalc = kTRUE;
167 }
168 /****************************************************************/
169 inline 
170 void AliHBTPair::CalculateInvMassSqr()
171  {
172   //calculates square of qinv
173   if (fMassSqrNotCalc)
174    {
175      CalculateSums();
176  
177      Double_t fPart12s= (fPxSum*fPxSum) + (fPySum*fPySum) + (fPzSum*fPzSum);
178  
179      fInvMassSqr=fESum*fESum-fPart12s;
180
181      fMassSqrNotCalc = kFALSE;
182    }
183  }
184 /****************************************************************/
185 inline 
186 void AliHBTPair::CalculateQInvL()
187  {
188  //Calculates square root of Qinv
189   if (fQInvLNotCalc)
190   {
191    CalculateDiffs();
192    fQInvL = fEDiff*fEDiff - ( fPxDiff*fPxDiff + fPyDiff*fPyDiff + fPzDiff*fPzDiff );
193    fQInvLNotCalc = kFALSE;
194   }
195  }
196 /****************************************************************/ 
197 inline 
198 void AliHBTPair::CalculateSums()
199  {
200    //calculates momenta and energy sums
201    if(fSumsNotCalc)
202     {
203      fPxSum = fPart1->Px()+fPart2->Px();
204      fPySum = fPart1->Py()+fPart2->Py();
205      fPzSum = fPart1->Pz()+fPart2->Pz();
206      fESum  = fPart1->Energy() + fPart2->Energy();
207      fSumsNotCalc = kFALSE;
208     }
209  }
210 /****************************************************************/
211 inline 
212 void AliHBTPair::CalculateDiffs()
213  {
214    //calculates momenta and energy differences 
215    if(fDiffsNotCalc)
216     {
217      fPxDiff = fPart1->Px()-fPart2->Px();
218      fPyDiff = fPart1->Py()-fPart2->Py();
219      fPzDiff = fPart1->Pz()-fPart2->Pz();
220      fEDiff  = fPart1->Energy() - fPart2->Energy();
221      fDiffsNotCalc = kFALSE;
222     }
223  }
224
225 /****************************************************************/
226 inline 
227 Double_t AliHBTPair::GetDeltaP() //return difference of momenta
228 {
229  //returns difference of momenta
230  CalculateDiffs();
231  return TMath::Sqrt(fPxDiff*fPxDiff + fPyDiff*fPyDiff + fPzDiff*fPzDiff);
232 }
233 /****************************************************************/
234 inline 
235 Double_t AliHBTPair::GetDeltaPx()
236  {
237    //returns difference of Pz
238    CalculateDiffs();
239    return fPxDiff;
240  }
241 /****************************************************************/
242 inline 
243 Double_t AliHBTPair::GetDeltaPy()
244  {
245    //returns difference of Py
246    CalculateDiffs();
247    return fPyDiff;
248  }
249
250 /****************************************************************/
251 inline 
252 Double_t AliHBTPair::GetDeltaPz()
253  {
254    //returns difference of Pz
255    CalculateDiffs();
256    return fPzDiff;
257  }
258
259
260 #endif