]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/RESONANCES/AliRsnMiniPair.cxx
Merge branch 'master' into TPCdev
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / AliRsnMiniPair.cxx
1 #include "AliRsnMiniParticle.h"
2 #include "AliRsnMiniPair.h"
3
4 ClassImp(AliRsnMiniPair)
5
6 //__________________________________________________________________________________________________
7 void AliRsnMiniPair::Fill
8 (AliRsnMiniParticle *p1, AliRsnMiniParticle *p2, Double_t m1, Double_t m2, Double_t refMass)
9 {
10 //
11 // Fill this object with data coming
12 // from arguments
13 //
14    p1->Set4Vector(fP1[0], m1, kFALSE);
15    p2->Set4Vector(fP2[0], m2, kFALSE);
16    p1->Set4Vector(fP1[1], m1, kTRUE );
17    p2->Set4Vector(fP2[1], m2, kTRUE );
18    
19    fDCA1 = p1->DCA();
20    fDCA2 = p2->DCA();  
21
22    fMother = -1;
23    fIsFromB = kFALSE;
24    fIsQuarkFound = kFALSE;
25    fPmother[0] = -1.0;
26    fPmother[1] = -1.0;
27    fPmother[2] = -1.0;
28    if (p1->Mother() == p2->Mother()) {
29       fMother = p1->Mother();
30       fMotherPDG = p1->MotherPDG();
31       fPmother[0] = p1->PmotherX();
32       fPmother[1] = p1->PmotherY();
33       fPmother[2] = p1->PmotherZ();
34       fIsFromB = p1->IsFromB();
35       fIsQuarkFound = p1->IsQuarkFound();
36    }
37
38    Int_t i;
39    for (i = 0; i < 2; i++) {
40       fSum[i] = fP1[i] + fP2[i];
41       fRef[i].SetXYZM(fSum[i].X(), fSum[i].Y(), fSum[i].Z(), refMass);
42    }
43
44    fNSisters=-1;
45    if (p1->NTotSisters()==p2->NTotSisters()) fNSisters = p1->NTotSisters();
46 }
47
48 //__________________________________________________________________________________________________
49 Double_t AliRsnMiniPair::CosThetaStar(Bool_t useMC)
50 {
51 //
52 // Return cosine of angle of one daughter to the resonance momentum in its rest frame
53 //
54
55    TLorentzVector &mother    = fSum[ID(useMC)];
56    TLorentzVector &daughter0 = fP1[ID(useMC)];
57 //    TLorentzVector &daughter1 = fP2[ID(useMC)];
58    TVector3 momentumM(mother.Vect());
59    TVector3 normal(mother.Y() / momentumM.Mag(), -mother.X() / momentumM.Mag(), 0.0);
60
61    // Computes first the invariant mass of the mother
62 //    Double_t mass0      = daughter0.M();
63 //    Double_t mass1      = daughter1.M();
64 //    Double_t p0         = daughter0.Vect().Mag();
65 //    Double_t p1         = daughter1.Vect().Mag();
66 //    Double_t E0         = TMath::Sqrt(mass0 * mass0 + p0 * p0);
67 //    Double_t E1         = TMath::Sqrt(mass1 * mass1 + p1 * p1);
68 //    Double_t MotherMass = TMath::Sqrt((E0 + E1) * (E0 + E1) - (p0 * p0 + 2.0 * daughter0.Vect().Dot(daughter1.Vect()) + p1 * p1));
69 //    MotherMass = mother.M();
70
71    // Computes components of beta
72    Double_t betaX = -mother.X() / mother.E();
73    Double_t betaY = -mother.Y() / mother.E();
74    Double_t betaZ = -mother.Z() / mother.E();
75
76    // Computes Lorentz transformation of the momentum of the first daughter
77    // into the rest frame of the mother and theta*
78    daughter0.Boost(betaX, betaY, betaZ);
79    TVector3 momentumD = daughter0.Vect();
80
81    Double_t cosThetaStar = normal.Dot(momentumD) / momentumD.Mag();
82
83    return cosThetaStar;
84 }
85
86 //__________________________________________________________________________________________________
87 void AliRsnMiniPair::InvertP(Bool_t first)
88 {
89 //
90 // Inverts one 4-momentum and recompute sum
91 //
92
93    Int_t i;
94    for (i = 0; i < 2; i++) {
95       if (first) fP1[i].SetVect(fP1[i].Vect() *= -1.0);
96       else       fP2[i].SetVect(fP2[i].Vect() *= -1.0);
97       fSum[i] = fP1[i] + fP2[i];
98       fRef[i].SetXYZM(fSum[i].X(), fSum[i].Y(), fSum[i].Z(), fRef[i].M());
99    }
100 }
101
102 //__________________________________________________________________________________________________
103 void AliRsnMiniPair::FillRef(Double_t mass)
104 {
105 //
106 // Fill ref 4-vectors using the passed mass and the values in 'sum'
107 //
108
109    Int_t i;
110    for (i = 0; i < 2; i++) {
111       fRef[i].SetXYZM(fSum[i].X(), fSum[i].Y(), fSum[i].Z(), mass);
112    }
113 }
114
115 //__________________________________________________________________________________________________
116 Double_t AliRsnMiniPair::InvMassRes() const
117 {
118 //
119 // Return invariant mass resolution
120 //
121
122    if (fSum[1].M() <= 0.0) return 1E20;
123
124    return (fSum[0].M() - fSum[1].M()) / fSum[1].M();
125 }
126
127 //__________________________________________________________________________________________________
128 Double_t AliRsnMiniPair::InvMassDiff() const
129 {
130 //
131 // Return invariant mass resolution
132 //
133
134    if (fSum[1].M() <= 0.0) return 1E20;
135
136    return (fSum[0].M() - fSum[1].M());
137 }
138
139 //__________________________________________________________________________________________________
140 Double_t AliRsnMiniPair::PtRatio(Bool_t mc) const
141 {
142 //
143 // Return ratio of transverse momenta of daughters
144 //
145
146    Double_t num = TMath::Abs(fP1[ID(mc)].Perp() - fP2[ID(mc)].Perp());
147    Double_t den = TMath::Abs(fP1[ID(mc)].Perp() + fP2[ID(mc)].Perp());
148
149    if (den <= 0.0) return 1E20;
150
151    return num / den;
152 }
153
154 //__________________________________________________________________________________________________
155 Double_t AliRsnMiniPair::DipAngle(Bool_t mc) const
156 {
157 //
158 // Opening angle in a Z-T space
159 //
160
161    const TLorentzVector &p1 = fP1[ID(mc)];
162    const TLorentzVector &p2 = fP2[ID(mc)];
163
164    return ((p1.Perp() * p2.Perp() + p1.Z() * p2.Z()) / p1.Mag() / p2.Mag());
165 }
166
167 //__________________________________________________________________________________________________
168 Double_t AliRsnMiniPair::DaughterPt(Int_t daughterId, Bool_t mc)
169 {
170   //returns pt of the <id> daughter 
171   // if MC returns generated momenta
172   if (daughterId==0)
173     return fP1[ID(mc)].Pt();
174   else 
175     return fP2[ID(mc)].Pt();
176 }
177
178 //__________________________________________________________________________________________________
179 Double_t AliRsnMiniPair::DaughterDCA(Int_t daughterId)
180 {   
181   //
182   //returns dca to Primary Vertex of the <id> daughter 
183   //
184
185   if (daughterId==0)
186     return fDCA1;
187   else 
188     return fDCA2;
189 }
190
191 //__________________________________________________________________________________________________
192 Double_t AliRsnMiniPair::DCAProduct()
193 {
194   //
195   //returns products of the DCA of the 2 daughters
196   //
197   
198     return fDCA1*fDCA2;
199 }
200
201 //__________________________________________________________________________________________________
202 void AliRsnMiniPair::DaughterPxPyPz(Int_t daughterId, Bool_t mc, Double_t *pxpypz)
203 {
204   //returns px,py,pz of the <id> daughter by saving them into pxpypz
205   // if MC returns generated momenta
206   if (!pxpypz)    return;
207  
208   if (daughterId==0){
209     pxpypz[0]=fP1[ID(mc)].Px();
210     pxpypz[1]=fP1[ID(mc)].Py();
211     pxpypz[2]=fP1[ID(mc)].Pz();
212   } else {
213     pxpypz[0]=fP2[ID(mc)].Px();
214     pxpypz[1]=fP2[ID(mc)].Py();
215     pxpypz[2]=fP2[ID(mc)].Pz();
216   }
217   return;
218 }