]>
Commit | Line | Data |
---|---|---|
4c039060 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
16 | /* | |
17 | $Log$ | |
127b88a2 | 18 | Revision 1.3 1999/09/29 09:24:08 fca |
19 | Introduction of the Copyright and cvs Log | |
20 | ||
4c039060 | 21 | */ |
22 | ||
fe4da5cc | 23 | // |
24 | // | |
25 | // | |
26 | // | |
dafbc1c5 | 27 | #include "AliDimuCombinator.h" |
fe4da5cc | 28 | #include "AliRun.h" |
127b88a2 | 29 | #include "AliPDG.h" |
fe4da5cc | 30 | #include "TRandom.h" |
31 | // | |
dafbc1c5 | 32 | ClassImp(AliDimuCombinator) |
fe4da5cc | 33 | // |
34 | // Iterators | |
35 | // | |
1578254f | 36 | TParticle* AliDimuCombinator::FirstMuon() |
fe4da5cc | 37 | { |
38 | fimuon1=fimin1; | |
1578254f | 39 | fmuon1 = (TParticle*) fPartArray->UncheckedAt(fimuon1); |
127b88a2 | 40 | while(Type(fmuon1)!=kMuonPlus && Type(fmuon1)!=kMuonMinus) { |
fe4da5cc | 41 | fimuon1++; |
42 | if (fimuon1 >= fimax1) {fmuon1=0; break;} | |
1578254f | 43 | fmuon1 = (TParticle*) fPartArray->UncheckedAt(fimuon1); |
fe4da5cc | 44 | } |
45 | return fmuon1; | |
46 | } | |
47 | ||
1578254f | 48 | TParticle* AliDimuCombinator::FirstMuonSelected() |
fe4da5cc | 49 | { |
1578254f | 50 | TParticle * muon=FirstMuon(); |
fe4da5cc | 51 | while(muon!=0 && !Selected(muon)) {muon=NextMuon();} |
52 | return muon; | |
53 | } | |
54 | ||
55 | ||
1578254f | 56 | TParticle* AliDimuCombinator::NextMuon() |
fe4da5cc | 57 | { |
58 | fimuon1++; | |
59 | if (fimuon1>=fNParticle) {fmuon1 = 0; return fmuon1;} | |
60 | ||
1578254f | 61 | fmuon1 = (TParticle*) fPartArray->UncheckedAt(fimuon1); |
127b88a2 | 62 | while(Type(fmuon1)!=kMuonPlus && Type(fmuon1)!=kMuonMinus) { |
fe4da5cc | 63 | fimuon1++; |
64 | if (fimuon1>=fimax1) {fmuon1 = 0; break;} | |
1578254f | 65 | fmuon1 = (TParticle*) fPartArray->UncheckedAt(fimuon1); |
fe4da5cc | 66 | } |
67 | return fmuon1; | |
68 | } | |
69 | ||
1578254f | 70 | TParticle* AliDimuCombinator::NextMuonSelected() |
fe4da5cc | 71 | { |
1578254f | 72 | TParticle * muon=NextMuon(); |
fe4da5cc | 73 | while(muon !=0 && !Selected(muon)) {muon=NextMuon();} |
74 | return muon; | |
75 | } | |
76 | ||
77 | ||
dafbc1c5 | 78 | void AliDimuCombinator::FirstPartner() |
fe4da5cc | 79 | { |
80 | if (fimin1==fimin2) { | |
81 | fimuon2=fimuon1+1; | |
82 | } else { | |
83 | fimuon2=fimin2; | |
84 | } | |
85 | if (fimuon2 >= fimax2) {fmuon2=0; return;} | |
1578254f | 86 | fmuon2 = (TParticle*) fPartArray->UncheckedAt(fimuon2); |
127b88a2 | 87 | while(Type(fmuon2)!=kMuonPlus && Type(fmuon2)!=kMuonMinus) { |
fe4da5cc | 88 | fimuon2++; |
89 | if (fimuon2 >= fimax2) {fmuon2=0; break;} | |
1578254f | 90 | fmuon2 = (TParticle*) fPartArray->UncheckedAt(fimuon2); |
fe4da5cc | 91 | } |
92 | } | |
dafbc1c5 | 93 | void AliDimuCombinator::FirstPartnerSelected() |
fe4da5cc | 94 | { |
95 | FirstPartner(); | |
96 | while(fmuon2 !=0 && !Selected(fmuon2)) {NextPartner();} | |
97 | } | |
98 | ||
99 | ||
dafbc1c5 | 100 | void AliDimuCombinator::NextPartner() |
fe4da5cc | 101 | { |
102 | fimuon2++; | |
103 | if (fimuon2>=fimax2) {fmuon2 = 0; return;} | |
104 | ||
105 | ||
1578254f | 106 | fmuon2 = (TParticle*) fPartArray->UncheckedAt(fimuon2); |
fe4da5cc | 107 | |
127b88a2 | 108 | while(Type(fmuon2)!=kMuonPlus && Type(fmuon2)!=kMuonMinus) { |
fe4da5cc | 109 | fimuon2++; |
110 | if (fimuon2>=fimax2) {fmuon2 = 0; break;} | |
1578254f | 111 | fmuon2 = (TParticle*) fPartArray->UncheckedAt(fimuon2); |
fe4da5cc | 112 | } |
113 | ||
114 | } | |
115 | ||
dafbc1c5 | 116 | void AliDimuCombinator::NextPartnerSelected() |
fe4da5cc | 117 | { |
118 | NextPartner(); | |
119 | while(fmuon2 !=0 && !Selected(fmuon2)) {NextPartner();} | |
120 | } | |
121 | ||
122 | ||
1578254f | 123 | TParticle* AliDimuCombinator::Partner() |
fe4da5cc | 124 | { |
125 | return fmuon2; | |
126 | } | |
127 | ||
1578254f | 128 | void AliDimuCombinator::FirstMuonPair(TParticle* & muon1, TParticle* & muon2) |
fe4da5cc | 129 | { |
130 | FirstMuon(); | |
131 | FirstPartner(); | |
132 | muon1=fmuon1; | |
133 | muon2=fmuon2; | |
134 | } | |
1578254f | 135 | void AliDimuCombinator::NextMuonPair(TParticle* & muon1, TParticle* & muon2) |
fe4da5cc | 136 | { |
137 | NextPartner(); | |
138 | if (!Partner()) { | |
139 | NextMuon(); | |
140 | FirstPartner(); | |
141 | } | |
142 | muon1=fmuon1; | |
143 | muon2=fmuon2; | |
144 | } | |
1578254f | 145 | void AliDimuCombinator::FirstMuonPairSelected(TParticle* & muon1, TParticle* & muon2) |
fe4da5cc | 146 | { |
147 | FirstMuonSelected(); | |
148 | FirstPartnerSelected(); | |
149 | muon1=fmuon1; | |
150 | muon2=fmuon2; | |
151 | } | |
1578254f | 152 | void AliDimuCombinator::NextMuonPairSelected(TParticle* & muon1, TParticle* & muon2) |
fe4da5cc | 153 | { |
154 | NextPartnerSelected(); | |
155 | if (!Partner()) { | |
156 | NextMuonSelected(); | |
157 | FirstPartnerSelected(); | |
158 | } | |
159 | muon1=fmuon1; | |
160 | muon2=fmuon2; | |
161 | } | |
dafbc1c5 | 162 | void AliDimuCombinator::ResetRange() |
fe4da5cc | 163 | { |
164 | fimin1=fimin2=0; | |
165 | fimax1=fimax2=fNParticle; | |
166 | } | |
167 | ||
dafbc1c5 | 168 | void AliDimuCombinator::SetFirstRange(Int_t from, Int_t to) |
fe4da5cc | 169 | { |
170 | fimin1=from; | |
171 | fimax1=to; | |
172 | if (fimax1 > fNParticle) fimax1=fNParticle; | |
173 | } | |
174 | ||
dafbc1c5 | 175 | void AliDimuCombinator::SetSecondRange(Int_t from, Int_t to) |
fe4da5cc | 176 | { |
177 | fimin2=from; | |
178 | fimax2=to; | |
179 | if (fimax2 > fNParticle) fimax2=fNParticle; | |
180 | } | |
181 | // | |
182 | // Selection | |
183 | // | |
184 | ||
1578254f | 185 | Bool_t AliDimuCombinator::Selected(TParticle* part) |
fe4da5cc | 186 | { |
187 | // | |
188 | // | |
189 | if (part==0) {return 0;} | |
190 | ||
1578254f | 191 | if (part->Pt() > fPtMin && part->Eta()>fEtaMin && part->Eta()<fEtaMax) { |
fe4da5cc | 192 | return 1; |
193 | } else { | |
194 | return 0; | |
195 | } | |
196 | ||
197 | ||
198 | } | |
199 | ||
1578254f | 200 | Bool_t AliDimuCombinator::Selected(TParticle* part1, TParticle* part2) |
fe4da5cc | 201 | { |
202 | return Selected(part1)*Selected(part2); | |
203 | } | |
204 | // | |
205 | // Kinematics | |
206 | // | |
1578254f | 207 | Float_t AliDimuCombinator::Mass(TParticle* part1, TParticle* part2) |
fe4da5cc | 208 | { |
209 | Float_t px,py,pz,e; | |
1578254f | 210 | px=part1->Px()+part2->Px(); |
211 | py=part1->Py()+part2->Py(); | |
212 | pz=part1->Pz()+part2->Pz(); | |
213 | e =part1->Energy()+part2->Energy(); | |
fe4da5cc | 214 | Float_t p=px*px+py*py+pz*pz; |
215 | if (e*e < p) { | |
216 | return -1; | |
217 | } else { | |
218 | return TMath::Sqrt(e*e-p); | |
219 | } | |
220 | } | |
221 | ||
1578254f | 222 | Float_t AliDimuCombinator::PT(TParticle* part1, TParticle* part2) |
fe4da5cc | 223 | { |
224 | Float_t px,py; | |
1578254f | 225 | px=part1->Px()+part2->Px(); |
226 | py=part1->Py()+part2->Py(); | |
fe4da5cc | 227 | return TMath::Sqrt(px*px+py*py); |
228 | } | |
229 | ||
1578254f | 230 | Float_t AliDimuCombinator::Pz(TParticle* part1, TParticle* part2) |
fe4da5cc | 231 | { |
1578254f | 232 | return part1->Pz()+part2->Pz(); |
fe4da5cc | 233 | } |
234 | ||
1578254f | 235 | Float_t AliDimuCombinator::Y(TParticle* part1, TParticle* part2) |
fe4da5cc | 236 | { |
237 | Float_t pz,e; | |
1578254f | 238 | pz=part1->Pz()+part2->Pz(); |
239 | e =part1->Energy()+part2->Energy(); | |
fe4da5cc | 240 | return 0.5*TMath::Log((e+pz)/(e-pz)); |
241 | } | |
242 | // Response | |
243 | // | |
dafbc1c5 | 244 | void AliDimuCombinator::SmearGauss(Float_t width, Float_t & value) |
fe4da5cc | 245 | { |
246 | value+=gRandom->Gaus(0, width); | |
247 | } | |
248 | // Weighting | |
249 | // | |
250 | ||
1578254f | 251 | Float_t AliDimuCombinator::Decay_Prob(TParticle* part) |
fe4da5cc | 252 | { |
7d566a7d | 253 | Float_t d, h, theta, CTau; |
1578254f | 254 | TParticle* parent = Parent(part); |
7d566a7d | 255 | Int_t ipar=Type(parent); |
256 | if (ipar==8 || ipar==9) { | |
257 | CTau=780.4; | |
258 | } else if (ipar==11 || ipar==12) { | |
259 | CTau=370.9; | |
260 | } else { | |
261 | CTau=0; | |
262 | } | |
263 | ||
264 | ||
1578254f | 265 | Float_t GammaBeta=(parent->P())/(parent->GetMass()); |
7d566a7d | 266 | // |
267 | // this part is still very ALICE muon-arm specific | |
268 | // | |
1578254f | 269 | theta=parent->Theta(); |
7d566a7d | 270 | h=90*TMath::Tan(theta); |
271 | ||
272 | if (h<4) { | |
273 | d=4/TMath::Sin(theta); | |
fe4da5cc | 274 | } else { |
7d566a7d | 275 | d=90/TMath::Cos(theta); |
276 | } | |
277 | ||
278 | if (CTau > 0) { | |
279 | return 1-TMath::Exp(-d/CTau/GammaBeta); | |
280 | } else { | |
281 | return 1; | |
fe4da5cc | 282 | } |
283 | } | |
284 | ||
1578254f | 285 | Float_t AliDimuCombinator::Weight(TParticle* part1, TParticle* part2) |
7d566a7d | 286 | { |
1578254f | 287 | Float_t wgt=(part1->GetWeight())*(part2->GetWeight()); |
7d566a7d | 288 | |
289 | if (Correlated(part1, part2)) { | |
1578254f | 290 | return wgt/(Parent(part1)->GetWeight())*fRate1; |
7d566a7d | 291 | } else { |
292 | return wgt*fRate1*fRate2; | |
293 | } | |
294 | } | |
295 | ||
296 | ||
1578254f | 297 | Float_t AliDimuCombinator::Weight(TParticle* part) |
fe4da5cc | 298 | { |
1578254f | 299 | return (part->GetWeight())*(Parent(part)->GetWeight())*fRate1; |
7d566a7d | 300 | } |
1578254f | 301 | Bool_t AliDimuCombinator::Correlated(TParticle* part1, TParticle* part2) |
7d566a7d | 302 | { |
303 | if (Origin(part1) == Origin(part2)) { | |
304 | return kTRUE; | |
305 | } else { | |
306 | return kFALSE; | |
307 | } | |
308 | } | |
1578254f | 309 | |
310 | TParticle* AliDimuCombinator::Parent(TParticle* part) | |
7d566a7d | 311 | { |
1578254f | 312 | return (TParticle*) (fPartArray->UncheckedAt(part->GetFirstMother())); |
7d566a7d | 313 | } |
314 | ||
1578254f | 315 | Int_t AliDimuCombinator::Origin(TParticle* part) |
7d566a7d | 316 | { |
1578254f | 317 | Int_t iparent= part->GetFirstMother(); |
7d566a7d | 318 | if (iparent < 0) return iparent; |
319 | Int_t ip; | |
320 | while(1) { | |
1578254f | 321 | ip=((TParticle*) fPartArray->UncheckedAt(iparent))->GetFirstMother(); |
7d566a7d | 322 | if (ip < 0) { |
323 | break; | |
324 | } else { | |
325 | iparent=ip; | |
326 | } | |
327 | } | |
328 | return iparent; | |
fe4da5cc | 329 | } |
330 |