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