]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/RESONANCES/AliRsnPairParticle.h
fix for bug #70582 (change from L. Molnar)
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnPairParticle.h
1 //
2 // Class AliRsnPairParticle
3 //
4 // Implementation of a pair of tracks, for several purposes
5 // - computing the total 4-momentum & inv. mass for output histos filling
6 // - evaluating cut checks on the pair of particles
7 // - evaluating any kind of kinematic value over their sum
8 //
9 // authors: Martin Vala (martin.vala@cern.ch)
10 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
11 //
12
13 #ifndef ALIRSNPAIRPARTICLE_H
14 #define ALIRSNPAIRPARTICLE_H
15
16 #include <TMath.h>
17
18 #include "AliRsnDaughter.h"
19
20 class AliRsnPairDef;
21
22 class AliRsnPairParticle : public TObject
23 {
24   public:
25
26     AliRsnPairParticle();
27     AliRsnPairParticle(const AliRsnPairParticle &obj);
28     AliRsnPairParticle& operator=(const AliRsnPairParticle &obj);
29     virtual ~AliRsnPairParticle();
30
31     Double_t          GetInvMass(Double_t m1, Double_t m2);
32     Double_t          GetInvMassMC(Double_t m1, Double_t m2);
33
34     Double_t          GetEtot(Double_t m1, Double_t m2) const;
35     Double_t          GetEtot(Double_t mass) const {return TMath::Sqrt(mass*mass + GetP2());}
36     Double_t          GetP2() const {return (fPTot[0]*fPTot[0] + fPTot[1]*fPTot[1] + fPTot[2]*fPTot[2]);}
37     Double_t          GetPt2() const {return (fPTot[0]*fPTot[0] + fPTot[1]*fPTot[1]);}
38     Double_t          GetP() const {return TMath::Sqrt(GetP2());}
39     Double_t          GetPx() const {return fPTot[0];}
40     Double_t          GetPy() const {return fPTot[1];}
41     Double_t          GetPz() const {return fPTot[2];}
42     Double_t          GetPt() const {return TMath::Sqrt(GetPt2());}
43     Double_t          GetPhi() const {return TMath::Pi() + TMath::ATan2(-fPTot[1], -fPTot[0]);}
44     Double_t          GetTheta() const {
45       if (fPTot[2]==0.0) {return TMath::PiOver2();}
46       else {return TMath::ACos(fPTot[2]/GetP());}
47     }
48     Double_t          GetEta() const {Double_t a = TMath::Tan(0.5*GetTheta()); if (a > 0.) return -TMath::Log(a); return 999999.0;}
49     Double_t          GetY(Double_t m1, Double_t m2) const {return 0.5*TMath::Log((GetEtot(m1,m2)+fPTot[2])/(GetEtot(m1,m2)-fPTot[2]));}
50     Double_t          GetY(Double_t mass) const {return 0.5*TMath::Log((GetEtot(mass)+fPTot[2])/(GetEtot(mass)-fPTot[2]));}
51
52     Double_t          GetEtotMC(Double_t m1, Double_t m2) const;
53     Double_t          GetEtotMC(Double_t mass) const {return TMath::Sqrt(mass*mass + GetP2MC());}
54     Double_t          GetP2MC() const {return (fPTotMC[0]*fPTotMC[0] + fPTotMC[1]*fPTotMC[1] + fPTotMC[2]*fPTotMC[2]);}
55     Double_t          GetPt2MC() const {return (fPTotMC[0]*fPTotMC[0] + fPTotMC[1]*fPTotMC[1]);}
56     Double_t          GetPMC() const {return TMath::Sqrt(GetP2MC());}
57     Double_t          GetPxMC() const {return fPTotMC[0];}
58     Double_t          GetPyMC() const {return fPTotMC[1];}
59     Double_t          GetPzMC() const {return fPTotMC[2];}
60     Double_t          GetPtMC() const {return TMath::Sqrt(GetPt2MC());}
61     Double_t          GetPhiMC() const {return TMath::Pi() + TMath::ATan2(-fPTotMC[1], -fPTotMC[0]);}
62     Double_t          GetThetaMC() const {
63       if (fPTotMC[2]==0.0) {return TMath::PiOver2();}
64       else {return TMath::ACos(fPTotMC[2]/GetPMC());}
65     }
66     Double_t          GetEtaMC() const {return -TMath::Log(TMath::Tan(0.5*GetThetaMC()));}
67     Double_t          GetYMC(Double_t m1, Double_t m2) const {return 0.5*TMath::Log((GetEtotMC(m1,m2)+fPTotMC[2])/(GetEtotMC(m1,m2)-fPTotMC[2]));}
68     Double_t          GetYMC(Double_t mass) const {return 0.5*TMath::Log((GetEtotMC(mass)+fPTot[2])/(GetEtotMC(mass)-fPTot[2]));}
69
70     Double_t          GetAngle() const;
71
72     AliRsnDaughter*   GetDaughter(const Int_t &index) const {return fDaughter[index];}
73
74     Bool_t            IsLabelEqual() {return abs(fDaughter[0]->GetLabel()) == abs(fDaughter[1]->GetLabel());}
75     Bool_t            IsIndexEqual() {return (fDaughter[0]->GetID() == fDaughter[1]->GetID());}
76     Bool_t            IsTruePair(Int_t refPDG = 0);
77     Int_t             CommonMother();
78
79     void              SetPair(AliRsnDaughter * const daughter1, AliRsnDaughter * const daughter2);
80     void              ResetPair();
81     void              RotateTrack(Int_t i, Double_t angle, Bool_t isDegrees = kTRUE);
82     void              PrintInfo(const Option_t *option = "ALL");
83     Bool_t            MatchesDef(AliRsnPairDef *def);
84
85   private:
86
87     Double_t         fPTot[3];          // total momentum computed with rec. values
88     Double_t         fPTotMC[3];        // total momentum computed with MC values
89     Double_t         fPTrack[2][3];     // rec. momentum of single tracks
90     Double_t         fPTrackMC[2][3];   // MC momentum of single tracks
91
92     Int_t            fMotherLabel[2];   // GEANT label of tracks
93     Int_t            fMotherPDG[2];     // PDG code of mother of tracks
94
95     AliRsnDaughter  *fDaughter[2];      // elements of the pair
96
97     ClassDef(AliRsnPairParticle,1)
98 };
99
100 #endif