Adding new code for kink and V0 reconstruction (AliESDkink and AliESDV0MI classes...
[u/mrichter/AliRoot.git] / ANALYSIS / AliAODPair.h
CommitLineData
78d7c6d3 1#ifndef AliAODPair_H
2#define AliAODPair_H
3//_________________________________________________________________________
4///////////////////////////////////////////////////////////////////////////
5//
6// class AliAODPair
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 "AliVAODParticle.h"
16
17
18class AliAODPair: public TObject
19{
20 public:
21 AliAODPair(Bool_t rev = kFALSE); //contructor
22 AliAODPair(AliVAODParticle* part1, AliVAODParticle* part2, Bool_t rev = kFALSE); //contructor
23 AliAODPair(const AliAODPair& in);
24
25 virtual ~AliAODPair(){}
26
27 AliAODPair& operator=(const AliAODPair& in);
28
29 void SetParticles(AliVAODParticle* p1,AliVAODParticle* p2); //sets particles in the pair
30 AliAODPair* GetSwappedPair() {return fSwappedPair;} //returns pair with swapped particles
31
32 AliVAODParticle* Particle1() const {return fPart1;} //returns pointer to first particle
33 AliVAODParticle* Particle2() const {return fPart2;} //returns pointer to decond particle
34
35 virtual 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 GetQSideLCMS(); //returns Q Side CMS longitudionally co-moving
42 virtual Double_t GetQOutLCMS(); //returns Q out CMS longitudionally co-moving
43 virtual Double_t GetQLongLCMS(); //returns Q Long CMS longitudionally co-moving
f422a7da 44 virtual Double_t GetQtLCMS(); //returns Q transverse CMS longitudionally co-moving
45
fb629e2d 46 virtual Double_t GetQt(); //returns Q transverse to Kt
78d7c6d3 47
48
49 virtual Double_t GetKt(); //returns K transverse
50 virtual Double_t GetKStar();
a40c0433 51 virtual Double_t GetKStarOut(); //z.ch.
52 virtual Double_t GetKStarSide(); //z.ch.
53 virtual Double_t GetKStarLong(); //z.ch.
78d7c6d3 54
a40c0433 55
78d7c6d3 56 virtual Double_t GetAvarageDistance();//returns avarage distnace between two tracks
57
b327f095 58 virtual Double_t GetDeltaE(); //return difference of Energies
59 virtual Double_t GetDeltaP(); //return difference of momenta (scalar difference)
60 virtual Double_t GetDeltaPvector(); //return legth of difference vector of momenta
78d7c6d3 61 virtual Double_t GetDeltaPt();
62 virtual Double_t GetDeltaPx();
63 virtual Double_t GetDeltaPy();
64 virtual Double_t GetDeltaPz();
65
66 virtual Double_t GetDeltaTheta();
67 virtual Double_t GetDeltaPhi();
68
69 virtual Double_t GetGammaToLCMS();
70 virtual Double_t GetPIDProb() const {return fPart1->GetPidProb()*fPart2->GetPidProb();}
71
8ea30edc 72 virtual Double_t GetRStar() ;
73 virtual Double_t GetR() ;//returns distance between particle production points
74
78d7c6d3 75 protected:
76 AliVAODParticle* fPart1; //pointer to first particle
77 AliVAODParticle* fPart2; //pointer to second particle
78
79 AliAODPair* fSwappedPair; //pointer to swapped pair
80
81/************************************************************/
82/************CMS (LC) Q's *********************************/
83/************************************************************/
84 //Center Mass System - Longitudinally Comoving
85
86 Double_t fQSideLCMS; //value of Q side CMS longitudially co-moving
87 Bool_t fQSideLCMSNotCalc; //flag indicating if fQSideLCMS is already calculated for this pair
88
89 Double_t fQOutLCMS; //value of Q out CMS longitudially co-moving
90 Bool_t fQOutLCMSNotCalc;//flag indicating if fQOutLCMS is already calculated for this pair
91
92 Double_t fQLongLCMS; //value of Q long CMS longitudially co-moving
93 Bool_t fQLongLCMSNotCalc;//flag indicating if fQLongLCMS is already calculated for this pair
f422a7da 94
fb629e2d 95 Double_t fQtLCMS; //value of Qt CMS longitudially co-moving (hypot(qsidelcms,qoutlcms))
f422a7da 96 Bool_t fQtLCMSNotCalc;//flag indicating if fQLongLCMS is already calculated for this pair
fb629e2d 97
98 Double_t fQt; //value of Qt, projection of 3-mom diff to Kt
99 Bool_t fQtNotCalc;//flag indicating if fQt is already calculated for this pair
100
78d7c6d3 101/************************************************************/
102/************************************************************/
103 Double_t fQInv; //half of differnece of 4-momenta
104 Bool_t fQInvNotCalc;//flag indicating if fQInv is already calculated for this pair
105
106 Double_t fInvMass; //invariant mass
107 Bool_t fInvMassNotCalc;//flag indicating if fInvMass is already calculated for this pair
108
109 Double_t fKt; //K == sum vector of particle's momenta. Kt transverse component
110 Bool_t fKtNotCalc;//flag indicating if fKt is already calculated for this pair
111
112 Double_t fKStar; // KStar
113 Bool_t fKStarNotCalc;// flag indicating if fKStar is calculated
a40c0433 114 Double_t fKStarOut; // KStarOut z.ch.
115 Double_t fKStarSide;// KStarSide z.ch.
116 Double_t fKStarLong;// KStarLong z.ch.
117
118 Bool_t fKStarCompNotCalc; // flag indicating if CalcuteKStarComp() is calculated z.ch.
119
78d7c6d3 120 Double_t fPInv; //invariant momentum
121
122 Double_t fQSide; //Q Side
123 Double_t fOut;//Q Out
124 Double_t fQLong;//Q Long
125
126 Double_t fMt;//Transverse coordinate of Inv. Mass
127 Bool_t fMtNotCalc;//flag indicating if Mt is calculated for current pair
128
129 Double_t fInvMassSqr;//squre of invariant mass
130 Bool_t fMassSqrNotCalc; //flag indicating if fInvMassSqr for this pair
131 void CalculateInvMassSqr();
132
133 Double_t fQInvL; //Qinv in longitudional direction
134 Bool_t fQInvLNotCalc;//flag indicating if fQInvL is calculated for current pair
135 void CalculateQInvL();
136
137 Double_t fAvarageDistance;//value of the avarage distance calculated out of track points
138 Bool_t fAvarageDistanceNotCalc;//flag indicating if the avarage distance is calculated
139
140 Double_t fPxSum;// Sum of Px momenta
141 Double_t fPySum;// Sum of Py momenta
142 Double_t fPzSum;// Sum of Pz momenta
143 Double_t fESum;// Sum of energies
144 Bool_t fSumsNotCalc;//flag indicating if fPxSum,fPxSum,fPxSum and fESum is calculated for current pair
145 void CalculateSums();
a40c0433 146 void CalculateKStarComp();
78d7c6d3 147
148 Double_t fPxDiff;// Difference of Px momenta
149 Double_t fPyDiff;// Difference of Px momenta
150 Double_t fPzDiff;// Difference of Px momenta
151 Double_t fEDiff;// Difference of Px momenta
152 Bool_t fDiffsNotCalc;//flag indicating if fPxDiff,fPxDiff,fPxDiff and fEDiff is calculated for current pair
153 void CalculateDiffs();
154
155 Double_t fGammaLCMS;//gamma of boost in LCMS
156 Bool_t fGammaLCMSNotCalc;//flag indicating if fGammaLCMS is calculated for current pair
157 /***************************************************/
158 Bool_t fChanged;//flag indicating if object has been changed
159
160 void CalculateBase();
161 Double_t AvDistance();
162
163
164 private:
165 ClassDef(AliAODPair,1)
166};
167/****************************************************************/
168inline
169void AliAODPair::SetParticles(AliVAODParticle* p1,AliVAODParticle* p2)
170{
171 //sets the particle to the pair
172
173 fPart1 = p1;
174 fPart2 = p2;
175 if (fSwappedPair) //if we have Swapped (so we are not)
176 fSwappedPair->SetParticles(p2,p1); //set particles for him too
177 Changed();
178 //and do nothing until will be asked for
179}
180/****************************************************************/
181
182inline
183void AliAODPair::Changed()
184{
185 // Resel all calculations (flags)
186 fChanged = kTRUE;
187 fSumsNotCalc = kTRUE;
188 fDiffsNotCalc = kTRUE;
189 fMassSqrNotCalc = kTRUE;
190 fInvMassNotCalc = kTRUE;
191 fQInvNotCalc = kTRUE;
192 fMtNotCalc = kTRUE;
193 fQSideLCMSNotCalc = kTRUE;
194 fQOutLCMSNotCalc = kTRUE;
195 fQLongLCMSNotCalc = kTRUE;
fb629e2d 196 fQtLCMSNotCalc = kTRUE;
197 fQtNotCalc = kTRUE;
78d7c6d3 198 fKtNotCalc = kTRUE;
199 fKStarNotCalc = kTRUE;
a40c0433 200 fKStarCompNotCalc = kTRUE;
78d7c6d3 201 fQInvLNotCalc = kTRUE;
202 fGammaLCMSNotCalc = kTRUE;
203 fAvarageDistanceNotCalc = kTRUE;
204}
205/****************************************************************/
206inline
207void AliAODPair::CalculateInvMassSqr()
208 {
209 //calculates square of qinv
210 if (fMassSqrNotCalc)
211 {
212 CalculateSums();
213
214 Double_t fPart12s= (fPxSum*fPxSum) + (fPySum*fPySum) + (fPzSum*fPzSum);
215
216 fInvMassSqr=fESum*fESum-fPart12s;
217
218 fMassSqrNotCalc = kFALSE;
219 }
220 }
221/****************************************************************/
222inline
223void AliAODPair::CalculateQInvL()
224 {
225 //Calculates square root of Qinv
226 if (fQInvLNotCalc)
227 {
228 CalculateDiffs();
229 fQInvL = fEDiff*fEDiff - ( fPxDiff*fPxDiff + fPyDiff*fPyDiff + fPzDiff*fPzDiff );
230 fQInvLNotCalc = kFALSE;
231 }
232 }
233/****************************************************************/
234inline
235void AliAODPair::CalculateSums()
236 {
237 //calculates momenta and energy sums
238 if(fSumsNotCalc)
239 {
240 fPxSum = fPart1->Px()+fPart2->Px();
241 fPySum = fPart1->Py()+fPart2->Py();
242 fPzSum = fPart1->Pz()+fPart2->Pz();
243 fESum = fPart1->E() + fPart2->E();
244 fSumsNotCalc = kFALSE;
245 }
246 }
247/****************************************************************/
a40c0433 248inline
249void AliAODPair::CalculateKStarComp()
250{
251
252 if (fKStarCompNotCalc)
253 {
254 CalculateSums();
255
256 Double_t ptrans = fPxSum*fPxSum + fPySum*fPySum;
257 Double_t mtrans = fESum*fESum - fPzSum*fPzSum;
258 Double_t pinv = TMath::Sqrt(mtrans - ptrans);
259 ptrans = TMath::Sqrt(ptrans);
260 mtrans = TMath::Sqrt(mtrans);
261
262 Double_t px1 = fPart1->Px();
263 Double_t py1 = fPart1->Py();
264 Double_t pz1 = fPart1->Pz();
265 Double_t pE1 = fPart1->E();
266
267 // boost to LCMS
268 Double_t beta = fPzSum / fESum;
269 Double_t gamma = fESum / mtrans;
270
271 fKStarLong = gamma * (pz1 - beta * pE1);
272 double temp = gamma * (pE1 - beta * pz1);
273
274 // rotate in transverse plane
275 fKStarSide = (-px1*fPySum + py1*fPxSum)/ptrans;
276 fKStarOut = ( px1*fPxSum + py1*fPySum)/ptrans;
277
278 // go from LCMS to CMS
279 gamma = mtrans/pinv;
280 beta = ptrans/mtrans;
281 fKStarOut = gamma * (fKStarOut - beta * temp);
282
283 fKStarCompNotCalc = kFALSE;
284 }
285}
286
287/****************************************************************/
78d7c6d3 288inline
289void AliAODPair::CalculateDiffs()
290 {
291 //calculates momenta and energy differences
292 if(fDiffsNotCalc)
293 {
294 fPxDiff = fPart1->Px()-fPart2->Px();
295 fPyDiff = fPart1->Py()-fPart2->Py();
296 fPzDiff = fPart1->Pz()-fPart2->Pz();
297 fEDiff = fPart1->E() - fPart2->E();
298 fDiffsNotCalc = kFALSE;
299 }
300 }
301
302/****************************************************************/
b327f095 303
304inline
305Double_t AliAODPair::GetDeltaE()
306{
307 //returns difference of energies
308 return fPart1->E() - fPart2->E();
309}
310/****************************************************************/
311
312inline
313Double_t AliAODPair::GetDeltaP()
314{
315 //returns difference of momenta (scalars)
316 return fPart1->P() - fPart2->P();
317}
318/****************************************************************/
319
78d7c6d3 320inline
b327f095 321Double_t AliAODPair::GetDeltaPvector() //return difference of momenta
78d7c6d3 322{
b327f095 323 //returns legth of the momenta difference vector
78d7c6d3 324 CalculateDiffs();
325 return TMath::Sqrt(fPxDiff*fPxDiff + fPyDiff*fPyDiff + fPzDiff*fPzDiff);
326}
327/****************************************************************/
328
329inline
330Double_t AliAODPair::GetDeltaPt()
331 {
332 //returns difference of Pz
333 return fPart1->Pt()-fPart2->Pt();
334 }
335/****************************************************************/
336
337inline
338Double_t AliAODPair::GetDeltaPx()
339 {
340 //returns difference of Pz
341 CalculateDiffs();
342 return fPxDiff;
343 }
344/****************************************************************/
345inline
346Double_t AliAODPair::GetDeltaPy()
347 {
348 //returns difference of Py
349 CalculateDiffs();
350 return fPyDiff;
351 }
352
353/****************************************************************/
354inline
355Double_t AliAODPair::GetDeltaPz()
356 {
357 //returns difference of Pz
358 CalculateDiffs();
359 return fPzDiff;
360 }
361/****************************************************************/
362
363inline
364Double_t AliAODPair::GetDeltaPhi()
365 {
366 //returns difference of Phi
367 Double_t phi1 = fPart1->Phi();
368 Double_t phi2 = fPart2->Phi();
369 Double_t diff = phi1-phi2;
370 if (TMath::Abs(diff) > TMath::Pi())
371 {
372 if (phi1 > TMath::Pi())
373 {
374 phi1-=TMath::TwoPi();
375 }
376 else
377 {
378 phi2-=TMath::TwoPi();
379 }
380 diff = phi1-phi2;
381 }
382 return diff;
383 }
384/****************************************************************/
385
386inline
387Double_t AliAODPair::GetDeltaTheta()
388 {
389 //returns difference of Theta
390 return fPart1->Theta()-fPart2->Theta();
391 }
392/****************************************************************/
393
394
395#endif