]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HBTAN/AliHBTPair.cxx
Protection if trigger TClonesArray is empty (Ch.F.)
[u/mrichter/AliRoot.git] / HBTAN / AliHBTPair.cxx
CommitLineData
1b446896 1#include "AliHBTPair.h"
58ee8590 2//_________________________________________________________________________
3///////////////////////////////////////////////////////////////////////////
4//
5// class AliHBTPair
6//
7// class implements pair of particles and taking care of caluclation (almost)
8// all of pair properties (Qinv, InvMass,...)
d012b7d0 9//
58ee8590 10// more info: http://alisoft.cern.ch/people/skowron/analyzer/index.html
11//
12////////////////////////////////////////////////////////////////////////////
13
1b446896 14#include "AliHBTParticle.h"
dd82cadc 15#include "AliHBTWeights.h"
1b446896 16
17ClassImp(AliHBTPair)
18
1b446896 19/************************************************************************/
ec6e4013 20AliHBTPair::AliHBTPair(Bool_t rev):
21 fPart1(0x0),
7261986f 22 fPart2(0x0),
23 fSwapedPair(0x0),
24 fQSideCMSLC(0.0),
25 fQSideCMSLCNotCalc(kTRUE),
26 fQOutCMSLC(0.0),
27 fQOutCMSLCNotCalc(kTRUE),
28 fQLongCMSLC(0.0),
29 fQLongCMSLCNotCalc(kTRUE),
30 fQInv(0.0),
31 fQInvNotCalc(kTRUE),
32 fInvMass(0.0),
33 fInvMassNotCalc(kTRUE),
34 fKt(0.0),
35 fKtNotCalc(kTRUE),
36 fKStar(0.0),
37 fKStarNotCalc(kTRUE),
38 fPInv(0.0),
39 fQSide(0.0),
40 fOut(0.0),
41 fQLong(0.0),
42 fMt(0.0),
43 fMtNotCalc(kTRUE),
44 fInvMassSqr(0.0),
45 fMassSqrNotCalc(kTRUE),
46 fQInvL(0.0),
47 fQInvLNotCalc(kTRUE),
dd82cadc 48 fWeight(0.0),
49 fWeightNotCalc(kTRUE),
7261986f 50 fPxSum(0.0),
51 fPySum(0.0),
52 fPzSum(0.0),
53 fESum(0.0),
54 fSumsNotCalc(kTRUE),
55 fPxDiff(0.0),
56 fPyDiff(0.0),
57 fPzDiff(0.0),
58 fEDiff(0.0),
59 fDiffsNotCalc(kTRUE),
60 fGammaCMSLC(0.0),
61 fGammaCMSLCNotCalc(kTRUE),
62 fChanged(kTRUE)
1b446896 63 {
64//value of rev defines if it is Swaped
65//if you pass kTRUE swpaped pair will NOT be created
66//though you wont be able to get the swaped pair from this pair
67
68 if(!rev) fSwapedPair = new AliHBTPair(kTRUE); //if false create swaped pair
1b446896 69
70 }
71/************************************************************************/
ec6e4013 72
73AliHBTPair::AliHBTPair(AliHBTParticle* part1, AliHBTParticle* part2, Bool_t rev):
74 fPart1(part1),
7261986f 75 fPart2(part2),
76 fSwapedPair(0x0),
77 fQSideCMSLC(0.0),
78 fQSideCMSLCNotCalc(kTRUE),
79 fQOutCMSLC(0.0),
80 fQOutCMSLCNotCalc(kTRUE),
81 fQLongCMSLC(0.0),
82 fQLongCMSLCNotCalc(kTRUE),
83 fQInv(0.0),
84 fQInvNotCalc(kTRUE),
85 fInvMass(0.0),
86 fInvMassNotCalc(kTRUE),
87 fKt(0.0),
88 fKtNotCalc(kTRUE),
89 fKStar(0.0),
90 fKStarNotCalc(kTRUE),
91 fPInv(0.0),
92 fQSide(0.0),
93 fOut(0.0),
94 fQLong(0.0),
95 fMt(0.0),
96 fMtNotCalc(kTRUE),
97 fInvMassSqr(0.0),
98 fMassSqrNotCalc(kTRUE),
99 fQInvL(0.0),
100 fQInvLNotCalc(kTRUE),
dd82cadc 101 fWeight(0.0),
102 fWeightNotCalc(kTRUE),
7261986f 103 fPxSum(0.0),
104 fPySum(0.0),
105 fPzSum(0.0),
106 fESum(0.0),
107 fSumsNotCalc(kTRUE),
108 fPxDiff(0.0),
109 fPyDiff(0.0),
110 fPzDiff(0.0),
111 fEDiff(0.0),
112 fDiffsNotCalc(kTRUE),
113 fGammaCMSLC(0.0),
114 fGammaCMSLCNotCalc(kTRUE),
115 fChanged(kTRUE)
ec6e4013 116 {
117//value of rev defines if it is Swaped
118//if you pass kTRUE swpaped pair will NOT be created
119//though you wont be able to get the swaped pair from this pair
120
121 if(!rev) fSwapedPair = new AliHBTPair(part2,part1,kTRUE); //if false create swaped pair
ec6e4013 122
123 }
124/************************************************************************/
d012b7d0 125AliHBTPair::AliHBTPair(const AliHBTPair& in):
126 TObject(in),
127 fPart1(0x0),
128 fPart2(0x0),
129 fSwapedPair(0x0),
130 fQSideCMSLC(0.0),
131 fQSideCMSLCNotCalc(kTRUE),
132 fQOutCMSLC(0.0),
133 fQOutCMSLCNotCalc(kTRUE),
134 fQLongCMSLC(0.0),
135 fQLongCMSLCNotCalc(kTRUE),
136 fQInv(0.0),
137 fQInvNotCalc(kTRUE),
138 fInvMass(0.0),
139 fInvMassNotCalc(kTRUE),
140 fKt(0.0),
141 fKtNotCalc(kTRUE),
142 fKStar(0.0),
143 fKStarNotCalc(kTRUE),
144 fPInv(0.0),
145 fQSide(0.0),
146 fOut(0.0),
147 fQLong(0.0),
148 fMt(0.0),
149 fMtNotCalc(kTRUE),
150 fInvMassSqr(0.0),
151 fMassSqrNotCalc(kTRUE),
152 fQInvL(0.0),
153 fQInvLNotCalc(kTRUE),
154 fWeight(0.0),
155 fWeightNotCalc(kTRUE),
156 fPxSum(0.0),
157 fPySum(0.0),
158 fPzSum(0.0),
159 fESum(0.0),
160 fSumsNotCalc(kTRUE),
161 fPxDiff(0.0),
162 fPyDiff(0.0),
163 fPzDiff(0.0),
164 fEDiff(0.0),
165 fDiffsNotCalc(kTRUE),
166 fGammaCMSLC(0.0),
167 fGammaCMSLCNotCalc(kTRUE),
168 fChanged(kTRUE)
169{
170 //cpy constructor
171 in.Copy(*this);
172}
173/************************************************************************/
174
34914285 175AliHBTPair& AliHBTPair::operator=(const AliHBTPair& in)
d012b7d0 176{
177 //Assigment operator
178 in.Copy(*this);
179 return *this;
180}
34914285 181/************************************************************************/
ec6e4013 182
1b446896 183Double_t AliHBTPair::GetInvMass()
184{
b928db6c 185//Returns qinv value for a pair
1b446896 186 if(fInvMassNotCalc)
187 {
188 CalculateInvMassSqr(); //method is inline so we not waste th time for jumping into method
189
190 if(fInvMassSqr<0) fInvMass = TMath::Sqrt(-fInvMassSqr);
191 else fInvMass = TMath::Sqrt(fInvMassSqr);
192
193 fInvMassNotCalc = kFALSE;
194 }
195 return fInvMass;
196}
197/************************************************************************/
198Double_t AliHBTPair::GetQSideCMSLC()
199{
200 //return Q Side in Central Of Mass System in Longitudialy Comoving Frame
201
202 if (fQSideCMSLCNotCalc)
203 {
204 fQSideCMSLC = (fPart1->Px()*fPart2->Py()-fPart2->Px()*fPart1->Py())/GetKt();
205 fQSideCMSLCNotCalc = kFALSE;
206 }
207 return fQSideCMSLC;
208}
209/************************************************************************/
210Double_t AliHBTPair::GetQOutCMSLC()
211{
58ee8590 212 //caculates Qout in Center Of Mass Longitudionally Co-Moving
1b446896 213 if(fQOutCMSLCNotCalc)
214 {
215 CalculateSums();
216 CalculateDiffs();
951aadb9 217
218 if (fPart1->GetMass() != fPart2->GetMass())
219 {
220/*
221 //STAR algorithm
222 Double_t beta = fPzSum/fESum;
223 Double_t gamma = GetGammaToCMSLC();
224 Double_t el = gamma * (fPart1->Energy() - beta * fPart1->Pz());
225 Double_t x = ( fPart1->Px()*fPxSum + fPart1->Py()*fPySum) / ( 2.0*GetKt() );
226 beta = 2.0*GetKt()/GetMt();
227 gamma = GetMt()/GetQInv();
228 fQOutCMSLC = gamma * (x - beta * el);
229*/
230
231 //beta=fPzSum/fESum; // Longit. V == beta
232 Double_t beta=fPzSum/fESum;
233 Double_t gamma = GetGammaToCMSLC();
234
235 Double_t cosphi=fPxSum/(2.0*GetKt()); // cos(phi)
236 Double_t sinphi=fPySum/(2.0*GetKt()); // sin(phi)
237
238// ROTATE(part1Px,part1Py,SPHI,CPHI,part1Px,part1Py);//ROT8
239// ROTATE(part2Px,part2Py,SPHI,CPHI,part2Px,part2Py);//ROT8
240 Double_t tmp;
241 tmp = fPart1->Px()*cosphi + fPart1->Py()*sinphi;
242 Double_t part1Py = fPart1->Py()*cosphi - fPart1->Px()*sinphi;
243 Double_t part1Px = tmp;
244
245 tmp = fPart2->Px()*cosphi + fPart2->Py()*sinphi;
246 Double_t part2Py = fPart2->Py()*cosphi - fPart2->Px()*sinphi;
247 Double_t part2Px = tmp;
248
249
250// LTR(part1Pz,E1,beta,GetGammaToCMSLC(),part1Pz,E1a);
251// LTR(part2Pz,E2,beta,GetGammaToCMSLC(),part2Pz,E2a);
252 Double_t part1Pz=gamma*(fPart1->Pz()-beta*fPart1->Energy());
253 Double_t part2Pz=gamma*(fPart2->Pz()-beta*fPart2->Energy());
254
255 Double_t part1P2=part1Px*part1Px+part1Py*part1Py+part1Pz*part1Pz;
256 Double_t part2P2=part2Px*part2Px+part2Py*part2Py+part2Pz*part2Pz;
257 Double_t part1E=TMath::Sqrt(fPart1->GetMass()*fPart1->GetMass()+part1P2);
258 Double_t part2E=TMath::Sqrt(fPart2->GetMass()*fPart2->GetMass()+part2P2);
259 Double_t sumE=part1E+part2E;
260 Double_t sumPx=part1Px+part2Px;
261 Double_t sumPy=part1Py+part2Py;
262 Double_t sumPZ=part1Pz+part2Pz;
263 Double_t sumP2=sumPx*sumPx+sumPy*sumPy+sumPZ*sumPZ;
264
265 Double_t relmass=TMath::Sqrt(sumE*sumE-sumP2);
266 Double_t hf = (fPart1->GetMass()*fPart1->GetMass() - fPart2->GetMass()*fPart2->GetMass())/(relmass*relmass);
267 fQOutCMSLC=(part1Px-part2Px);//== id
268 fQOutCMSLC=fQOutCMSLC-sumPx*hf; //sumPx == fPxSum ale po rotacji i transf
269 }
270 else
271 {
272 Double_t k2 = fPxSum*fPxDiff+fPySum*fPyDiff;
273 fQOutCMSLC = 0.5*k2/GetKt();
274 // if (non-id) fQOutCMSLC=fQOutCMSLC - sumPx*HF;
275 }
276
277
1b446896 278 fQOutCMSLCNotCalc = kFALSE;
279 }
280 return fQOutCMSLC;
281}
282/************************************************************************/
283Double_t AliHBTPair::GetQLongCMSLC()
284{
58ee8590 285 //return Q Long in Central Of Mass System in Longitudialy Comoving Frame
1b446896 286 if (fQLongCMSLCNotCalc)
287 {
288 CalculateSums();
289 CalculateDiffs();
290 Double_t beta = fPzSum/fESum;
951aadb9 291 fQLongCMSLC = GetGammaToCMSLC() * ( fPzDiff - beta*fEDiff );
1b446896 292 fQLongCMSLCNotCalc = kFALSE;
293 }
294 return fQLongCMSLC;
295}
296/************************************************************************/
297Double_t AliHBTPair::GetKt()
298{
58ee8590 299 //calculates the evarage momentum of the pair
1b446896 300 if(fKtNotCalc)
301 {
302 CalculateSums();
303 fKt = 0.5*TMath::Hypot(fPxSum,fPySum);
304 fKtNotCalc = kFALSE;
305 }
306 return fKt;
307}
308/************************************************************************/
309
310Double_t AliHBTPair::GetKStar()
311{
58ee8590 312 //calculates invariant velocity difference
1b446896 313 if (fKStarNotCalc)
314 {
1b446896 315 CalculateSums();
316
d012b7d0 317 Double_t ptrans = fPxSum*fPxSum + fPySum*fPySum;
318 Double_t mtrans = fESum*fESum - fPzSum*fPzSum;
319 Double_t pinv = TMath::Sqrt(mtrans - ptrans);
1b446896 320
d012b7d0 321 Double_t q = (fPart1->GetMass()*fPart1->GetMass() - fPart2->GetMass()*fPart2->GetMass())/pinv;
1b446896 322
323 CalculateQInvL();
324
d012b7d0 325 q = q*q - fQInvL;
326 if ( q < 0)
4453ae67 327 {
d012b7d0 328 Info("GetKStar","q = %f",q);
4453ae67 329 fPart1->Print();
330 fPart2->Print();
d012b7d0 331 q = TMath::Abs(q);
4453ae67 332 }
333
d012b7d0 334 q = TMath::Sqrt(q);
335 fKStar = q/2.;
1b446896 336 fKStarNotCalc = kFALSE;
337 }
338 return fKStar;
339}
340/************************************************************************/
341
342Double_t AliHBTPair::GetQInv()
343{
951aadb9 344//returns Qinv
345//warning for non-id particles you want to use 2*KStar
1b446896 346 if(fQInvNotCalc)
347 {
348 CalculateQInvL();
30025bb4 349 fQInv = TMath::Sqrt(TMath::Abs(fQInvL));
1b446896 350 fQInvNotCalc = kFALSE;
351 }
1b446896 352 return fQInv;
353}
30025bb4 354/************************************************************************/
951aadb9 355
356Double_t AliHBTPair::GetGammaToCMSLC()
357{
58ee8590 358 //calculates gamma factor of the boost to CMSLC
951aadb9 359 if(fGammaCMSLCNotCalc)
360 {
361 CalculateSums();
362 Double_t beta = fPzSum/fESum;
363 fGammaCMSLC = 1.0/TMath::Sqrt(1.0 - beta*beta);
364 fGammaCMSLCNotCalc = kFALSE;
365 }
366 return fGammaCMSLC;
367}
30025bb4 368/************************************************************************/
369
951aadb9 370Double_t AliHBTPair::GetMt()
371{
58ee8590 372 //Calculates transverse mass of the pair
951aadb9 373 if (fMtNotCalc)
374 {
375 CalculateSums();
376 fMt = TMath::Sqrt(fESum*fESum - fPzSum*fPzSum);
377 fMtNotCalc = kFALSE;
378 }
379 return fMt;
380}
30025bb4 381/************************************************************************/
1b446896 382
dd82cadc 383Double_t AliHBTPair::GetWeight()
47d9a058 384{
58ee8590 385 //returns and buffers weight for this pair
dd82cadc 386 if (fWeightNotCalc)
47d9a058 387 {
dd82cadc 388 fWeight = AliHBTWeights::Weight(this);
389 fWeightNotCalc = kFALSE;
47d9a058 390 }
dd82cadc 391 return fWeight;
47d9a058 392}