1 #include "AliAODPair.h"
2 //_________________________________________________________________________
3 ///////////////////////////////////////////////////////////////////////////
7 // class implements pair of particles and taking care of caluclation (almost)
8 // all of pair properties (Qinv, InvMass,...)
10 // more info: http://alisoft.cern.ch/people/skowron/analyzer/index.html
12 ////////////////////////////////////////////////////////////////////////////
14 #include "AliVAODParticle.h"
15 #include "AliTrackPoints.h"
19 /************************************************************************/
20 AliAODPair::AliAODPair(Bool_t rev):
25 fQSideLCMSNotCalc(kTRUE),
27 fQOutLCMSNotCalc(kTRUE),
29 fQLongLCMSNotCalc(kTRUE),
31 fQtLCMSNotCalc(kTRUE),
37 fInvMassNotCalc(kTRUE),
45 fKStarCompNotCalc(kTRUE),
53 fMassSqrNotCalc(kTRUE),
56 fAvarageDistance(0.0),
57 fAvarageDistanceNotCalc(kTRUE),
69 fGammaLCMSNotCalc(kTRUE),
72 //value of rev defines if it is Swapped
73 //if you pass kTRUE swpaped pair will NOT be created
74 //though you wont be able to get the swaped pair from this pair
76 if(!rev) fSwappedPair = new AliAODPair(kTRUE); //if false create swaped pair
79 /************************************************************************/
81 AliAODPair::AliAODPair(AliVAODParticle* part1, AliVAODParticle* part2, Bool_t rev):
86 fQSideLCMSNotCalc(kTRUE),
88 fQOutLCMSNotCalc(kTRUE),
90 fQLongLCMSNotCalc(kTRUE),
92 fQtLCMSNotCalc(kTRUE),
96 fInvMassNotCalc(kTRUE),
100 fKStarNotCalc(kTRUE),
104 fKStarCompNotCalc(kTRUE),
112 fMassSqrNotCalc(kTRUE),
114 fQInvLNotCalc(kTRUE),
115 fAvarageDistance(0.0),
116 fAvarageDistanceNotCalc(kTRUE),
126 fDiffsNotCalc(kTRUE),
128 fGammaLCMSNotCalc(kTRUE),
131 //value of rev defines if it is Swapped
132 //if you pass kTRUE swpaped pair will NOT be created
133 //though you wont be able to get the swaped pair from this pair
135 if(!rev) fSwappedPair = new AliAODPair(part2,part1,kTRUE); //if false create swaped pair
138 /************************************************************************/
139 AliAODPair::AliAODPair(const AliAODPair& in):
145 fQSideLCMSNotCalc(kTRUE),
147 fQOutLCMSNotCalc(kTRUE),
149 fQLongLCMSNotCalc(kTRUE),
151 fQtLCMSNotCalc(kTRUE),
155 fInvMassNotCalc(kTRUE),
159 fKStarNotCalc(kTRUE),
163 fKStarCompNotCalc(kTRUE),
171 fMassSqrNotCalc(kTRUE),
173 fQInvLNotCalc(kTRUE),
174 fAvarageDistance(0.0),
175 fAvarageDistanceNotCalc(kTRUE),
185 fDiffsNotCalc(kTRUE),
187 fGammaLCMSNotCalc(kTRUE),
193 /************************************************************************/
195 AliAODPair& AliAODPair::operator=(const AliAODPair& in)
201 /************************************************************************/
203 Double_t AliAODPair::GetInvMass()
205 //Returns qinv value for a pair
208 CalculateInvMassSqr(); //method is inline so we not waste th time for jumping into method
210 if(fInvMassSqr<0) fInvMass = TMath::Sqrt(-fInvMassSqr);
211 else fInvMass = TMath::Sqrt(fInvMassSqr);
213 fInvMassNotCalc = kFALSE;
217 /************************************************************************/
219 Double_t AliAODPair::GetQSideLCMS()
221 //return Q Side in Central Of Mass System in Longitudialy Comoving Frame
223 if (fQSideLCMSNotCalc)
225 fQSideLCMS = (fPart1->Px()*fPart2->Py()-fPart2->Px()*fPart1->Py())/GetKt();
226 fQSideLCMSNotCalc = kFALSE;
230 /************************************************************************/
232 Double_t AliAODPair::GetQOutLCMS()
234 //caculates Qout in Center Of Mass Longitudionally Co-Moving
240 if (fPart1->Mass() != fPart2->Mass())
244 Double_t beta = fPzSum/fESum;
245 Double_t gamma = GetGammaToLCMS();
246 Double_t el = gamma * (fPart1->E() - beta * fPart1->Pz());
247 Double_t x = ( fPart1->Px()*fPxSum + fPart1->Py()*fPySum) / ( 2.0*GetKt() );
248 beta = 2.0*GetKt()/GetMt();
249 gamma = GetMt()/GetQInv();
250 fQOutLCMS = gamma * (x - beta * el);
253 //beta=fPzSum/fESum; // Longit. V == beta
254 Double_t beta=fPzSum/fESum;
255 Double_t gamma = GetGammaToLCMS();
257 Double_t cosphi=fPxSum/(2.0*GetKt()); // cos(phi)
258 Double_t sinphi=fPySum/(2.0*GetKt()); // sin(phi)
260 // ROTATE(part1Px,part1Py,SPHI,CPHI,part1Px,part1Py);//ROT8
261 // ROTATE(part2Px,part2Py,SPHI,CPHI,part2Px,part2Py);//ROT8
263 tmp = fPart1->Px()*cosphi + fPart1->Py()*sinphi;
264 Double_t part1Py = fPart1->Py()*cosphi - fPart1->Px()*sinphi;
265 Double_t part1Px = tmp;
267 tmp = fPart2->Px()*cosphi + fPart2->Py()*sinphi;
268 Double_t part2Py = fPart2->Py()*cosphi - fPart2->Px()*sinphi;
269 Double_t part2Px = tmp;
272 // LTR(part1Pz,E1,beta,GetGammaToLCMS(),part1Pz,E1a);
273 // LTR(part2Pz,E2,beta,GetGammaToLCMS(),part2Pz,E2a);
274 Double_t part1Pz=gamma*(fPart1->Pz()-beta*fPart1->E());
275 Double_t part2Pz=gamma*(fPart2->Pz()-beta*fPart2->E());
277 Double_t part1P2=part1Px*part1Px+part1Py*part1Py+part1Pz*part1Pz;
278 Double_t part2P2=part2Px*part2Px+part2Py*part2Py+part2Pz*part2Pz;
279 Double_t part1E=TMath::Sqrt(fPart1->Mass()*fPart1->Mass()+part1P2);
280 Double_t part2E=TMath::Sqrt(fPart2->Mass()*fPart2->Mass()+part2P2);
281 Double_t sumE=part1E+part2E;
282 Double_t sumPx=part1Px+part2Px;
283 Double_t sumPy=part1Py+part2Py;
284 Double_t sumPZ=part1Pz+part2Pz;
285 Double_t sumP2=sumPx*sumPx+sumPy*sumPy+sumPZ*sumPZ;
287 Double_t relmass=TMath::Sqrt(sumE*sumE-sumP2);
288 Double_t hf = (fPart1->Mass()*fPart1->Mass() - fPart2->Mass()*fPart2->Mass())/(relmass*relmass);
289 fQOutLCMS=(part1Px-part2Px);//== id
290 fQOutLCMS=fQOutLCMS-sumPx*hf; //sumPx == fPxSum ale po rotacji i transf
294 Double_t k2 = fPxSum*fPxDiff+fPySum*fPyDiff;
295 fQOutLCMS = 0.5*k2/GetKt();
296 // if (non-id) fQOutLCMS=fQOutLCMS - sumPx*HF;
300 fQOutLCMSNotCalc = kFALSE;
304 /************************************************************************/
306 Double_t AliAODPair::GetQLongLCMS()
308 //return Q Long in Central Of Mass System in Longitudialy Comoving Frame
309 if (fQLongLCMSNotCalc)
313 Double_t beta = fPzSum/fESum;
314 fQLongLCMS = GetGammaToLCMS() * ( fPzDiff - beta*fEDiff );
315 fQLongLCMSNotCalc = kFALSE;
319 /************************************************************************/
321 Double_t AliAODPair::GetQtLCMS()
323 //returns Q transverse CMS longitudionally co-moving
326 fQtLCMS = TMath::Hypot(GetQOutLCMS(),GetQSideLCMS());
327 fQtLCMSNotCalc = kFALSE;
331 /************************************************************************/
333 Double_t AliAODPair::GetQt()
335 //returns Q transverse CMS longitudionally co-moving
341 Double_t dotprod = fPxSum*fPxDiff + fPySum*fPyDiff + fPzSum*fPzDiff;
342 Double_t klen = fPxSum*fPxSum + fPySum*fPySum + fPzSum*fPzSum;
343 klen = TMath::Sqrt(klen);
344 Double_t qlen = fPxDiff*fPxDiff + fPyDiff*fPyDiff + fPzDiff*fPzDiff;
345 qlen = TMath::Sqrt(qlen);
346 Double_t tmp = klen*qlen;
353 Double_t cosopenangle = dotprod/tmp;
354 Double_t sinopenangle = TMath::Sqrt(1.0 - cosopenangle*cosopenangle);
356 fQt = sinopenangle*qlen;
361 /************************************************************************/
363 Double_t AliAODPair::GetKt()
365 //calculates the evarage momentum of the pair
369 fKt = 0.5*TMath::Hypot(fPxSum,fPySum);
374 /************************************************************************/
376 Double_t AliAODPair::GetKStar()
378 //calculates invariant velocity difference
383 Double_t ptrans = fPxSum*fPxSum + fPySum*fPySum;
384 Double_t mtrans = fESum*fESum - fPzSum*fPzSum;
387 Error("GetKStar","Tranverse momentum bigger than transverse mass. Not normal for on-shell particles");
388 Error("GetKStar","Particle1:");
390 Error("GetKStar","Particle2:");
392 Error("GetKStar","");
395 fKStarNotCalc = kFALSE;
398 Double_t pinv = TMath::Sqrt(mtrans - ptrans);
400 Double_t q = (fPart1->Mass()*fPart1->Mass() - fPart2->Mass()*fPart2->Mass())/pinv;
407 Info("GetKStar","Sqrt of negative number q = %f",q);
408 Error("GetKStar","Particle1:");
410 Error("GetKStar","Particle2:");
413 fKStarNotCalc = kFALSE;
419 fKStarNotCalc = kFALSE;
423 /************************************************************************/
424 Double_t AliAODPair::GetKStarOut()
426 CalculateKStarComp();
429 /************************************************************************/
430 Double_t AliAODPair::GetKStarSide()
432 CalculateKStarComp();
435 /************************************************************************/
436 Double_t AliAODPair::GetKStarLong()
438 CalculateKStarComp();
441 /************************************************************************/
443 Double_t AliAODPair::GetQInv()
446 //warning for non-id particles you want to use 2*KStar
450 fQInv = TMath::Sqrt(TMath::Abs(fQInvL));
451 fQInvNotCalc = kFALSE;
455 /************************************************************************/
457 Double_t AliAODPair::GetGammaToLCMS()
459 //calculates gamma factor of the boost to LCMS
460 if(fGammaLCMSNotCalc)
463 Double_t beta = fPzSum/fESum;
464 fGammaLCMS = 1.0/TMath::Sqrt(1.0 - beta*beta);
465 fGammaLCMSNotCalc = kFALSE;
469 /************************************************************************/
471 Double_t AliAODPair::GetMt()
473 //Calculates transverse mass of the pair
477 fMt = TMath::Sqrt(fESum*fESum - fPzSum*fPzSum);
482 /************************************************************************/
484 Double_t AliAODPair::GetAvarageDistance()
486 //returns and buffers avarage distance between two tracks calculated
487 // out of track points (see AliAODTrackPoints class)
489 if (fAvarageDistanceNotCalc)
491 fAvarageDistance = AvDistance();
492 fAvarageDistanceNotCalc = kFALSE;
494 return fAvarageDistance;
496 /************************************************************************/
498 Double_t AliAODPair::AvDistance()
500 //returns avarage distance between two tracks in range
501 //as defined in Track-Points of AliVAODParticle
502 //returns negative value if error uccured f.g. tracks do not have track-points
503 AliTrackPoints* tpts1 = fPart1->GetTPCTrackPoints();
505 {//it could be simulated pair
506 // Warning("GetValue","Track 1 does not have Track Points. Pair NOT Passed.");
510 AliTrackPoints* tpts2 = fPart2->GetTPCTrackPoints();
513 // Warning("GetValue","Track 2 does not have Track Points. Pair NOT Passed.");
517 return tpts1->AvarageDistance(*tpts2);