]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PYTHIA8/AliDecayerPythia8.cxx
bug fix for fmd eventplane
[u/mrichter/AliRoot.git] / PYTHIA8 / AliDecayerPythia8.cxx
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 /* $Id$ */
17
18 // Implementation of AliDecayer using Pythia8
19 // Author: andreas.morsch@cern.ch
20 #include <TMath.h>
21 #include <TPDGCode.h>
22 #include <TLorentzVector.h>
23 #include "AliTPythia8.h"
24 #include "AliDecayerPythia8.h"
25 #include "ParticleData.h"
26
27 ClassImp(AliDecayerPythia8)
28
29 Bool_t AliDecayerPythia8::fgInit = kFALSE;
30
31 AliDecayerPythia8::AliDecayerPythia8():
32   TVirtualMCDecayer(),
33   fPythia8(AliTPythia8::Instance()),
34   fDebug(0),
35   fDecay(kAll),
36   fHeavyFlavour(kTRUE)
37 {
38     // Constructor
39    fPythia8->Pythia8()->readString("SoftQCD:elastic = on");
40    fPythia8->Pythia8()->init();
41 }
42
43 //___________________________________________________________________________
44 void AliDecayerPythia8::Decay(Int_t pdg, TLorentzVector* p)
45 {
46    // Decay a single particle
47    ClearEvent();
48    AppendParticle(pdg, p);
49    Int_t idPart = fPythia8->Pythia8()->event[0].id();
50    fPythia8->Pythia8()->particleData.mayDecay(idPart,kTRUE);
51    fPythia8->Pythia8()->moreDecays();
52    if (fDebug > 0) fPythia8->EventListing();
53 }
54
55 //___________________________________________________________________________
56 Int_t AliDecayerPythia8::ImportParticles(TClonesArray *particles)
57 {
58    //import the decay products into particles array
59    return (fPythia8->ImportParticles(particles, "All"));
60 }
61
62
63 void AliDecayerPythia8::Init()
64 {
65 // Initialisation
66 //
67     if (!fgInit) {
68         fgInit = kTRUE;
69         // fPythia->SetDecayTable();
70     }
71
72 // Switch on heavy flavor decays
73     
74     Int_t j;
75     Int_t heavy[14] = {411, 421, 431, 4122, 4132, 4232, 4332, 511, 521, 531, 5122, 5132, 5232, 5332};
76 //    fPythia->ResetDecayTable();
77     for (j=0; j < 14; j++) {
78         if (fDecay == kNoDecayHeavy) {
79             fPythia8->ReadString(Form("%d:onMode = off", heavy[j]));
80         } else {
81             fPythia8->ReadString(Form("%d:onMode = on", heavy[j]));
82         }
83     }
84     
85
86 //...Switch off decay of pi0, K0S, Lambda, Sigma+-, Xi0-, Omega-.
87     
88     if (fDecay != kNeutralPion) {
89         fPythia8->ReadString("111:onMode = off");
90     } else {
91         fPythia8->ReadString("111:onMode = on");
92     }
93
94     fPythia8->ReadString("310:onMode = off");
95     fPythia8->ReadString("3112:onMode = off");
96     fPythia8->ReadString("3212:onMode = off");
97     fPythia8->ReadString("3222:onMode = off");
98     fPythia8->ReadString("3312:onMode = off");
99     fPythia8->ReadString("3322:onMode = off");
100     fPythia8->ReadString("3334:onMode = off");
101 // .. Force decay channels
102     ForceDecay();
103 }
104
105 void AliDecayerPythia8::ForceDecay()
106 {
107 // 
108 // Force a particle decay mode
109 // Switch heavy flavour production off if requested
110     if (!fHeavyFlavour) SwitchOffHeavyFlavour();
111 //
112     Decay_t decay = fDecay;
113     fPythia8->ReadString("HadronLevel:Decay = on");
114     
115     if (decay == kNoDecayHeavy) return;
116
117 //
118 // select mode    
119     switch (decay) 
120     {
121     case kHardMuons:
122 //      B0 -> mu X 
123         fPythia8->ReadString("511:onMode = off");
124         fPythia8->ReadString("511:onIfAny = 13 443 100443");
125 //      B+/- -> mu X 
126         fPythia8->ReadString("521:onMode = off");
127         fPythia8->ReadString("521:onIfAny = 13 443 100443");
128 //      Bs -> mu X 
129         fPythia8->ReadString("531:onMode = off");
130         fPythia8->ReadString("531:onIfAny = 13 443 100443");
131 //      Lambda_b -> mu X 
132         fPythia8->ReadString("5122:onMode = off");
133         fPythia8->ReadString("5122:onIfAny = 13 443 100443");
134 //      Sigma_b- -> mu X 
135         fPythia8->ReadString("5132:onMode = off");
136         fPythia8->ReadString("5132:onIfAny = 13 443 100443");
137 //      Sigma_b0 -> mu X
138         fPythia8->ReadString("5232:onMode = off");
139         fPythia8->ReadString("5232:onIfAny = 13 443 100443");
140 //      Omega_b  -> mu X
141         fPythia8->ReadString("5332:onMode = off");
142         fPythia8->ReadString("5332:onIfAny = 13 443 100443");
143 //      Psi' -> mu+ mu-
144         fPythia8->ReadString("100443:onMode = off");
145         fPythia8->ReadString("100443:onIfAny = 443");
146 //      Psi  -> mu+ mu-
147         fPythia8->ReadString("443:onMode = off");
148         fPythia8->ReadString("443:onIfAll = 13 13");
149 //      D+/- -> mu X
150         fPythia8->ReadString("411:onMode = off");
151         fPythia8->ReadString("411:onIfAll = 13");
152 //      D0   -> mu X
153         fPythia8->ReadString("421:onMode = off");
154         fPythia8->ReadString("421:onIfAll = 13");
155 //      D_s  -> mu X
156         fPythia8->ReadString("431:onMode = off");
157         fPythia8->ReadString("431:onIfAll = 13");
158 //      Lambda_c -> mu X
159         fPythia8->ReadString("4122:onMode = off");
160         fPythia8->ReadString("4122:onIfAll = 13");
161 //      Sigma_c  -> mu X
162         fPythia8->ReadString("4132:onMode = off");
163         fPythia8->ReadString("4132:onIfAll = 13");
164 //      Sigma_c+ -> mu X
165         fPythia8->ReadString("4232:onMode = off");
166         fPythia8->ReadString("4232:onIfAll = 13");
167 //      Omega_c  -> mu X
168         fPythia8->ReadString("4332:onMode = off");
169         fPythia8->ReadString("4332:onIfAll = 13");
170
171         break;
172    case kChiToJpsiGammaToMuonMuon:
173 // Chi_1c  -> J/Psi  Gamma
174         fPythia8->ReadString("20443:onMode = off");
175         fPythia8->ReadString("20443:onIfAll = 443 22");
176 // Chi_2c  -> J/Psi  Gamma
177         fPythia8->ReadString("445:onMode = off");
178         fPythia8->ReadString("445:onIfAll = 443 22");
179 // J/Psi -> mu+ mu-
180         fPythia8->ReadString("443:onMode = off");
181         fPythia8->ReadString("443:onIfAll = 13 13");
182         break;
183     case kChiToJpsiGammaToElectronElectron:
184 // Chi_1c  -> J/Psi  Gamma
185         fPythia8->ReadString("20443:onMode = off");
186         fPythia8->ReadString("20443:onIfAll = 443 22");
187 // Chi_2c  -> J/Psi  Gamma
188         fPythia8->ReadString("445:onMode = off");
189         fPythia8->ReadString("445:onIfAll = 443 22");
190 // J/Psi -> e+ e-
191         fPythia8->ReadString("443:onMode = off");
192         fPythia8->ReadString("443:onIfAll = 11 11");
193         break;
194
195     case kBSemiMuonic:
196 //      B0 -> mu X 
197         fPythia8->ReadString("511:onMode = off");
198         fPythia8->ReadString("511:onIfAny = 13");
199 //      B+/- -> mu X 
200         fPythia8->ReadString("521:onMode = off");
201         fPythia8->ReadString("521:onIfAny = 13");
202 //      B_s -> mu X 
203         fPythia8->ReadString("531:onMode = off");
204         fPythia8->ReadString("531:onIfAny = 13");
205 //      Lambda_b -> mu X 
206         fPythia8->ReadString("5122:onMode = off");
207         fPythia8->ReadString("5122:onIfAny = 13");
208 //      Sigma_b -> mu X 
209         fPythia8->ReadString("5132:onMode = off");
210         fPythia8->ReadString("5132:onIfAny = 13");
211 //      Sigma_b0 -> mu X 
212         fPythia8->ReadString("5232:onMode = off");
213         fPythia8->ReadString("5232:onIfAny = 13");
214 //      Omega_b  -> mu X 
215         fPythia8->ReadString("5332:onMode = off");
216         fPythia8->ReadString("5332:onIfAny = 13");
217         break;
218     case kSemiMuonic:
219 //      D+- -> mu X
220         fPythia8->ReadString("411:onMode = off");
221         fPythia8->ReadString("411:onIfAll = 13");
222 //      D0  -> mu X
223         fPythia8->ReadString("421:onMode = off");
224         fPythia8->ReadString("421:onIfAll = 13");
225 //      D_s  -> mu X
226         fPythia8->ReadString("431:onMode = off");
227         fPythia8->ReadString("431:onIfAll = 13");
228 //      Lambda_c -> mu X
229         fPythia8->ReadString("4122:onMode = off");
230         fPythia8->ReadString("4122:onIfAll = 13");
231 //      Sigma_c  -> mu X
232         fPythia8->ReadString("4132:onMode = off");
233         fPythia8->ReadString("4132:onIfAll = 13");
234 //      Sigma  -> mu X
235         fPythia8->ReadString("4232:onMode = off");
236         fPythia8->ReadString("4232:onIfAll = 13");
237 //      Omega_c  -> mu X
238         fPythia8->ReadString("4332:onMode = off");
239         fPythia8->ReadString("4332:onIfAll = 13");
240 //      B0       -> mu X
241         fPythia8->ReadString("511:onMode = off");
242         fPythia8->ReadString("511:onIfAny = 13");
243 //      B+/-     -> mu X
244         fPythia8->ReadString("521:onMode = off");
245         fPythia8->ReadString("521:onIfAny = 13");
246 //      B_s      -> mu X
247         fPythia8->ReadString("531:onMode = off");
248         fPythia8->ReadString("531:onIfAny = 13");
249 //      Lambda_c -> mu X
250         fPythia8->ReadString("5122:onMode = off");
251         fPythia8->ReadString("5122:onIfAny = 13");
252 //      Sigma_c  -> mu X
253         fPythia8->ReadString("5132:onMode = off");
254         fPythia8->ReadString("5132:onIfAny = 13");
255 //      Sigma_c  -> mu X
256         fPythia8->ReadString("5232:onMode = off");
257         fPythia8->ReadString("5232:onIfAny = 13");
258 //      Omega_c  -> mu X
259         fPythia8->ReadString("5332:onMode = off");
260         fPythia8->ReadString("5332:onIfAny = 13");
261
262         break;
263     case kJpsiDiMuon:
264 //      J/Psi-> mu+ mu-
265         fPythia8->ReadString("443:onMode = off");
266         fPythia8->ReadString("443:onIfAll = 13 13");
267         break;
268     case kDiMuon:
269 //      Rho -> mu+ mu-
270         fPythia8->ReadString("113:onMode = off");
271         fPythia8->ReadString("113:onIfAll = 13 13");
272 //      Eta-> mu+ mu-
273         fPythia8->ReadString("221:onMode = off");
274         fPythia8->ReadString("221:onIfAll = 13 13");
275 //      omega-> mu+ mu-
276         fPythia8->ReadString("223:onMode = off");
277         fPythia8->ReadString("223:onIfAll = 13 13");
278 //      phi-> mu+ mu-
279         fPythia8->ReadString("333:onMode = off");
280         fPythia8->ReadString("333:onIfAll = 13 13");
281 //      J/Psi-> mu+ mu-
282         fPythia8->ReadString("443:onMode = off");
283         fPythia8->ReadString("443:onIfAll = 13 13");
284 //      Psi'-> mu+ mu-
285         fPythia8->ReadString("100443:onMode = off");
286         fPythia8->ReadString("100443:onIfAll = 13 13");
287 //      Ups-> mu+ mu-
288         fPythia8->ReadString("553:onMode = off");
289         fPythia8->ReadString("553:onIfAll = 13 13");
290 //      Ups'-> mu+ mu-
291         fPythia8->ReadString("100553:onMode = off");
292         fPythia8->ReadString("100553:onIfAll = 13 13"); 
293 //      Ups''-> mu+ mu-
294         fPythia8->ReadString("200553:onMode = off");
295         fPythia8->ReadString("200553:onIfAll = 13 13");
296         break;
297     case kBSemiElectronic:
298 //      B0 - > e+ e-
299         fPythia8->ReadString("511:onMode = off");
300         fPythia8->ReadString("511:onIfAny = 11");
301 //      B+- -> e+ e-
302         fPythia8->ReadString("521:onMode = off");
303         fPythia8->ReadString("521:onIfAny = 11");
304 //      B_s -> e+ e-
305         fPythia8->ReadString("531:onMode = off");
306         fPythia8->ReadString("531:onIfAny = 11");
307 //      Lambda_b -> e+ e-
308         fPythia8->ReadString("5122:onMode = off");
309         fPythia8->ReadString("5122:onIfAny = 11");
310 //      Sigma_b -> e+ e-
311         fPythia8->ReadString("5132:onMode = off");
312         fPythia8->ReadString("5132:onIfAny = 11");
313 //      Sigma_b -> e+ e-
314         fPythia8->ReadString("5232:onMode = off");
315         fPythia8->ReadString("5232:onIfAny = 11");
316 //      Omega_b ->e+ e-
317         fPythia8->ReadString("5332:onMode = off");
318         fPythia8->ReadString("5332:onIfAny = 11");
319         break;
320     case kSemiElectronic:
321 //      D+/- -> e X
322         fPythia8->ReadString("411:onMode = off");
323         fPythia8->ReadString("411:onIfAll = 11");
324 //      D0 -> e X
325         fPythia8->ReadString("421:onMode = off");
326         fPythia8->ReadString("421:onIfAll = 11");
327 //      D_s ->e X
328         fPythia8->ReadString("431:onMode = off");
329         fPythia8->ReadString("431:onIfAll = 11");
330 //      Lambda_c -> e X
331         fPythia8->ReadString("4122:onMode = off");
332         fPythia8->ReadString("4122:onIfAll = 11");
333 //      Sigma_c -> e X
334         fPythia8->ReadString("4132:onMode = off");
335         fPythia8->ReadString("4132:onIfAll = 11");
336 //      Sigma_c -> e X
337         fPythia8->ReadString("4232:onMode = off");
338         fPythia8->ReadString("4232:onIfAll = 11");
339 //      Omega_c -> e X
340         fPythia8->ReadString("4332:onMode = off");
341         fPythia8->ReadString("4332:onIfAll = 11");
342 //      B0 -> e X
343         fPythia8->ReadString("511:onMode = off");
344         fPythia8->ReadString("511:onIfAny = 11");
345 //      B+/- -> e X
346         fPythia8->ReadString("521:onMode = off");
347         fPythia8->ReadString("521:onIfAny = 11");
348 //      B_s -> e X
349         fPythia8->ReadString("531:onMode = off");
350         fPythia8->ReadString("531:onIfAny = 11");
351 //      Lambda_b -> e X
352         fPythia8->ReadString("5122:onMode = off");
353         fPythia8->ReadString("5122:onIfAny = 11");
354 //      Sigma_b -> e X
355         fPythia8->ReadString("5132:onMode = off");
356         fPythia8->ReadString("5132:onIfAny = 11");
357 //      Sigma_b -> e X
358         fPythia8->ReadString("5232:onMode = off");
359         fPythia8->ReadString("5232:onIfAny = 11");
360 //      Omega_b -> e X
361         fPythia8->ReadString("5332:onMode = off");
362         fPythia8->ReadString("5332:onIfAny = 11");
363         break;
364     case kDiElectron:
365 //      Rho -> e+e-
366         fPythia8->ReadString("113:onMode = off");
367         fPythia8->ReadString("113:onIfAll = 11 11");
368 //      Eta -> e+e-
369         fPythia8->ReadString("221:onMode = off");
370         fPythia8->ReadString("221:onIfAll = 11 11");
371 //      omega -> e+e-
372         fPythia8->ReadString("223:onMode = off");
373         fPythia8->ReadString("223:onIfAll = 11 11");
374 //      phi -> e+e-
375         fPythia8->ReadString("333:onMode = off");
376         fPythia8->ReadString("333:onIfAll = 11 11");
377 //      J/Psi -> e+e-
378         fPythia8->ReadString("443:onMode = off");
379         fPythia8->ReadString("443:onIfAll = 11 11");
380 //      Psi' -> e+e-
381         fPythia8->ReadString("100443:onMode = off");
382         fPythia8->ReadString("100443:onIfAll = 11 11");
383 //      Ups -> e+e-
384         fPythia8->ReadString("553:onMode = off");
385         fPythia8->ReadString("553:onIfAll = 11 11");
386 //      Ups' -> e+e-
387         fPythia8->ReadString("100553:onMode = off");
388         fPythia8->ReadString("100553:onIfAll = 11 11");
389 //      Ups'' -> e+e-
390         fPythia8->ReadString("200553:onMode = off");
391         fPythia8->ReadString("200553:onIfAll = 11 11");
392         break;
393     case kBJpsiDiMuon:
394 //      B0   -> J/Psi (Psi') X   
395         fPythia8->ReadString("511:onMode = off");
396         fPythia8->ReadString("511:onIfAny = 443 100443");
397 //      B+/-   -> J/Psi (Psi') X   
398         fPythia8->ReadString("521:onMode = off");
399         fPythia8->ReadString("521:onIfAny = 443 100443");
400 //      B_s   -> J/Psi (Psi') X   
401         fPythia8->ReadString("531:onMode = off");
402         fPythia8->ReadString("531:onIfAny = 443 100443");
403 //      Lambda_b -> J/Psi (Psi') X   
404         fPythia8->ReadString("5122:onMode = off");
405         fPythia8->ReadString("5122:onIfAny = 443 100443");
406 //
407 //      J/Psi -> mu+ mu-
408         fPythia8->ReadString("443:onMode = off");
409         fPythia8->ReadString("443:onIfAll = 13 13");
410 //      Psi' -> mu+ mu-
411         fPythia8->ReadString("100443:onMode = off");
412         fPythia8->ReadString("100443:onIfAll = 13 13");
413         break;
414     case kBPsiPrimeDiMuon:
415 //      B0   -> Psi' X   
416         fPythia8->ReadString("511:onMode = off");
417         fPythia8->ReadString("511:onIfAny = 100443");
418 //      B+/-   -> Psi' X   
419         fPythia8->ReadString("521:onMode = off");
420         fPythia8->ReadString("521:onIfAny = 100443");
421 //      B_s   -> Psi'  X   
422         fPythia8->ReadString("531:onMode = off");
423         fPythia8->ReadString("531:onIfAny = 100443");
424 //      Lambda_b -> Psi' X   
425         fPythia8->ReadString("5122:onMode = off");
426         fPythia8->ReadString("5122:onIfAny = 100443");
427 //
428 //      Psi' -> mu+ mu-
429         fPythia8->ReadString("100443:onMode = off");
430         fPythia8->ReadString("100443:onIfAll = 13 13");
431         break;
432     case kBJpsiDiElectron:
433 //      B0   -> Psi X   
434         fPythia8->ReadString("511:onMode = off");
435         fPythia8->ReadString("511:onIfAny = 443");
436 //      B+/-   -> Psi X   
437         fPythia8->ReadString("521:onMode = off");
438         fPythia8->ReadString("521:onIfAny = 443");
439 //      B_s   -> Psi  X   
440         fPythia8->ReadString("531:onMode = off");
441         fPythia8->ReadString("531:onIfAny = 443");
442 //      Lambda_b -> Psi X   
443         fPythia8->ReadString("5122:onMode = off");
444         fPythia8->ReadString("5122:onIfAny = 443");
445 //
446 //      Psi -> mu+ mu-
447         fPythia8->ReadString("443:onMode = off");
448         fPythia8->ReadString("443:onIfAll = 11 11");
449
450         break;
451     case kBJpsi:
452 //      B0   -> Psi X   
453         fPythia8->ReadString("511:onMode = off");
454         fPythia8->ReadString("511:onIfAny = 443");
455 //      B+/-   -> Psi X   
456         fPythia8->ReadString("521:onMode = off");
457         fPythia8->ReadString("521:onIfAny = 443");
458 //      B_s   -> Psi  X   
459         fPythia8->ReadString("531:onMode = off");
460         fPythia8->ReadString("531:onIfAny = 443");
461 //      Lambda_b -> Psi X   
462         fPythia8->ReadString("5122:onMode = off");
463         fPythia8->ReadString("5122:onIfAny = 443");
464         break;
465     case kBPsiPrimeDiElectron:
466 //      B0   -> Psi' X   
467         fPythia8->ReadString("511:onMode = off");
468         fPythia8->ReadString("511:onIfAny = 100443");
469 //      B+/-   -> Psi' X   
470         fPythia8->ReadString("521:onMode = off");
471         fPythia8->ReadString("521:onIfAny = 100443");
472 //      B_s   -> Psi'  X   
473         fPythia8->ReadString("531:onMode = off");
474         fPythia8->ReadString("531:onIfAny = 100443");
475 //      Lambda_b -> Psi' X   
476         fPythia8->ReadString("5122:onMode = off");
477         fPythia8->ReadString("5122:onIfAny = 100443");
478 //
479 //      Psi' -> mu+ mu-
480         fPythia8->ReadString("100443:onMode = off");
481         fPythia8->ReadString("100443:onIfAll = 11 11");
482         break;
483     case kPiToMu:
484 //      pi -> mu nu
485         fPythia8->ReadString("211:onMode = off");
486         fPythia8->ReadString("211:onIfAny = 13");
487         break;
488     case kKaToMu:
489 //      K -> mu nu
490         fPythia8->ReadString("321:onMode = off");
491         fPythia8->ReadString("321:onIfAny = 13");
492         break;
493     case kAllMuonic:
494 //      pi/K -> mu
495         fPythia8->ReadString("211:onMode = off");
496         fPythia8->ReadString("211:onIfAny = 13");
497         fPythia8->ReadString("321:onMode = off");
498         fPythia8->ReadString("321:onIfAny = 13");
499         break;
500     case kWToMuon:
501 //      W -> mu X
502         fPythia8->ReadString("24:onMode = off");
503         fPythia8->ReadString("24:onIfAny = 13");
504         break;
505     case kWToCharm:
506 //      W -> c X
507         fPythia8->ReadString("24:onMode = off");
508         fPythia8->ReadString("24:onIfAny = 4");
509         break;
510     case kWToCharmToMuon:
511 //      W -> c X
512         fPythia8->ReadString("24:onMode = off");
513         fPythia8->ReadString("24:onIfAny = 4");
514 //      D+- -> mu X
515         fPythia8->ReadString("411:onMode = off");
516         fPythia8->ReadString("411:onIfAll = 13");
517 //      D0 -> mu X
518         fPythia8->ReadString("421:onMode = off");
519         fPythia8->ReadString("421:onIfAll = 13");
520 //      D_s -> mu X
521         fPythia8->ReadString("431:onMode = off");
522         fPythia8->ReadString("431:onIfAll = 13");
523 //      Lambda_c -> mu X
524         fPythia8->ReadString("4122:onMode = off");
525         fPythia8->ReadString("4122:onIfAll = 13");
526 //      Sigma_c -> mu X
527         fPythia8->ReadString("4132:onMode = off");
528         fPythia8->ReadString("4132:onIfAll = 13");
529 //      Sigma_c -> mu X
530         fPythia8->ReadString("4232:onMode = off");
531         fPythia8->ReadString("4232:onIfAll = 13");
532 //      Omega_c -> mu X
533         fPythia8->ReadString("4332:onMode = off");
534         fPythia8->ReadString("4332:onIfAll = 13");
535         break;
536     case kZDiMuon:
537 //      Z -> mu+ mu-
538         fPythia8->ReadString("23:onMode = off");
539         fPythia8->ReadString("23:onIfAll = 13 13");
540         break;
541     case kZDiElectron:
542 //      Z -> e+ e-
543         fPythia8->ReadString("23:onMode = off");
544         fPythia8->ReadString("23:onIfAll = 11 11");
545         break;
546     case kHadronicD:
547         ForceHadronicD(1);
548         break;
549     case kHadronicDWithout4Bodies:
550         ForceHadronicD(0);
551         break;
552     case kPhiKK:
553         // Phi-> K+ K-
554         fPythia8->ReadString("333:onMode = off");
555         fPythia8->ReadString("333:onIfAll = 321 321");
556         break;
557     case kOmega:
558         // Omega -> Lambda K
559         fPythia8->ReadString("3334:onMode = off");
560         fPythia8->ReadString("3334:onIfAll = 3122 321 ");
561         break;
562     case kLambda:
563         // Lambda -> p pi-
564         fPythia8->ReadString("3122:onMode = off");
565         fPythia8->ReadString("3122:onIfAll = 2212 211 ");
566         break;
567     case kBeautyUpgrade:
568         fPythia8->ReadString("5122:onMode = off");
569         fPythia8->ReadString("4122:onMode = off");
570         fPythia8->ReadString("5122:onIfAll = 4122");
571         fPythia8->ReadString("4122:onIfAll = 3122");
572         break;
573     case kAll:
574         break;
575     case kNoDecay:
576         fPythia8->ReadString("HadronLevel:Decay = off");
577         break;
578     case kNoDecayHeavy:
579     case kNoDecayBeauty:
580     case kNeutralPion:
581     case kPsiPrimeJpsiDiElectron: 
582     case kElectronEM:
583     case kGammaEM:
584     case kDiElectronEM:
585         break;
586     }
587 }
588
589 Float_t AliDecayerPythia8::GetPartialBranchingRatio(Int_t ipart)
590 {
591     // Get the partial branching ration for the forced decay channels
592     
593     Pythia8::Pythia* thePythia       = fPythia8->Pythia8();
594     Pythia8::ParticleData & table    = thePythia->particleData;
595     Pythia8::ParticleDataEntry* pd   = table.particleDataEntryPtr(ipart);
596
597     Int_t nc = pd->sizeChannels();
598     Float_t br = 0.;
599 //
600 //  Loop over decay channels
601     for (Int_t ic = 0; ic < nc; ic++) {
602       Pythia8::DecayChannel& decCh = pd->channel(ic);
603         for (Int_t i = 0; i < decCh.multiplicity(); i++) {
604             br += decCh.bRatio();
605         }
606     }
607     return (br);
608 }
609
610
611 Float_t AliDecayerPythia8::GetLifetime(Int_t kf)
612 {
613     // Return lifetime of particle
614     Pythia8::Pythia* thePythia       = fPythia8->Pythia8();
615     Pythia8::ParticleData& table     = thePythia->particleData;
616     Float_t tau = table.tau0(kf);
617     return (tau);
618 }
619
620 void  AliDecayerPythia8::SwitchOffHeavyFlavour()
621 {
622     // Switch off heavy flavour production
623     //
624 // Maximum number of quark flavours used in pdf 
625     fPythia8->ReadString("PDFinProcess:nQuarkIn = 3");
626 // Maximum number of flavors that can be used in showers
627     fPythia8->ReadString("SpaceShower:nQuarkIn = 3");
628     fPythia8->ReadString("TimeShower:nGammaToQuark = 3");
629     fPythia8->ReadString("TimeShower:nGluonToQuark = 3");
630 }
631
632
633 void AliDecayerPythia8::ForceHadronicD(Int_t optUse4Bodies)
634 {
635 //
636 // Force golden D decay modes
637 //
638     // K* -> K pi
639     fPythia8->ReadString("313:onMode = off");
640     fPythia8->ReadString("313:onIfAll = 321 211");
641     // for Ds -> Phi pi+
642     fPythia8->ReadString("333:onMode = off");
643     fPythia8->ReadString("333:onIfAll = 321 321");
644     // for D0 -> rho0 pi+ k-
645     fPythia8->ReadString("113:onMode = off");
646     fPythia8->ReadString("113:onIfAll = 211 211");
647     // for Lambda_c -> Delta++ K-
648     fPythia8->ReadString("2224:onMode = off");
649     fPythia8->ReadString("2224:onIfAll = 2212 211");
650     // for Lambda_c -> Lambda(1520) K-
651     fPythia8->ReadString("3124:onMode = off");
652     fPythia8->ReadString("3124:onIfAll = 2212 321");
653
654
655     fPythia8->ReadString("411:onMode = off");
656     fPythia8->ReadString("421:onMode = off");
657     fPythia8->ReadString("431:onMode = off");
658     fPythia8->ReadString("4112:onMode = off");
659     fPythia8->ReadString("4122:onMode = off");
660
661     // D+/- -> K pi pi 
662     fPythia8->ReadString("411:onIfMatch = 321 211 211");
663     // D+/- -> K* pi
664     fPythia8->ReadString("411:onIfMatch = 313 211");
665     // D0 -> K pi
666     fPythia8->ReadString("421:onIfMatch = 321 211");
667
668     if (optUse4Bodies) {
669         // D0 -> K pi pi pi
670         fPythia8->ReadString("421:onIfMatch = 321 211 211 211");
671         // D0 -> K pi rho
672         fPythia8->ReadString("421:onIfMatch = 321 211 113");
673         // D0 -> K*0 pi pi
674         fPythia8->ReadString("421:onIfMatch = 313 211 211");
675     }
676     
677     // D_s -> K K*
678     fPythia8->ReadString("431:onIfMatch = 321 313");
679     // D_s -> Phi pi
680     fPythia8->ReadString("431:onIfMatch = 333 211");
681
682     // Lambda_c -> p K*
683     fPythia8->ReadString("4122:onIfMatch = 2212 313");
684     // Lambda_c -> Delta K
685     fPythia8->ReadString("4122:onIfMatch = 2224 321");
686     // Lambda_c -> Lambda(1520) pi
687     fPythia8->ReadString("4122:onIfMatch = 3124 211");
688     // Lambda_c -> p K pi
689     fPythia8->ReadString("4122:onIfMatch = 2212 321 211");
690     // Lambda_c -> Lambda pi 
691     fPythia8->ReadString("4122:onIfMatch = 3122 211");
692
693 }
694
695 //___________________________________________________________________________
696 void    AliDecayerPythia8::ReadDecayTable()
697 {
698    //to read a decay table (not yet implemented)
699 }
700
701
702 //___________________________________________________________________________
703 void AliDecayerPythia8::AppendParticle(Int_t pdg, TLorentzVector* p)
704 {
705    // Append a particle to the stack
706    fPythia8->Pythia8()->event.append(pdg, 11, 0, 0, p->Px(), p->Py(), p->Pz(), p->E(), p->M());   
707 }
708
709
710 //___________________________________________________________________________
711 void AliDecayerPythia8::ClearEvent()
712 {
713    // Clear the event stack
714    fPythia8->Pythia8()->event.clear();
715 }
716