<http://savannah.cern.ch/bugs/?102190>
[u/mrichter/AliRoot.git] / PYTHIA6 / AliPythia6.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: AliPythia.cxx,v 1.40 2007/10/09 08:43:24 morsch Exp $ */
17
18 #include "AliPythia6.h"
19 #include "AliStack.h"
20 #include "AliPythiaRndm.h"
21 #include "AliFastGlauber.h"
22 #include "AliQuenchingWeights.h"
23
24 #include "TVector3.h"
25 #include "TParticle.h"
26 #include "PyquenCommon.h"
27
28 ClassImp(AliPythia6)
29
30 #ifndef WIN32
31 # define pyclus pyclus_
32 # define pycell pycell_
33 # define pyshow pyshow_
34 # define pyshowq pyshowq_
35 # define pyrobo pyrobo_
36 # define pyquen pyquen_
37 # define pyevnw pyevnw_
38 # define pyjoin pyjoin_
39 # define qpygin0 qpygin0_
40 # define type_of_call
41 #else
42 # define pyclus PYCLUS
43 # define pycell PYCELL
44 # define pyshow PYSHOW
45 # define pyshowq PYSHOWQ
46 # define pyrobo PYROBO
47 # define pyquen PYQUEN
48 # define pyevnw PYEVNW
49 # define pyjoin PYJOIN
50 # define qpygin0 QPYGIN0
51 # define type_of_call _stdcall
52 #endif
53
54 extern "C" void type_of_call pyjoin(Int_t &, Int_t * );
55 extern "C" void type_of_call pyclus(Int_t & );
56 extern "C" void type_of_call pycell(Int_t & );
57 extern "C" void type_of_call pyshow(Int_t &, Int_t &, Double_t &);
58 extern "C" void type_of_call pyshowq(Int_t &, Int_t &, Double_t &);
59 extern "C" void type_of_call qpygin0();
60 extern "C" void type_of_call pyrobo(Int_t &, Int_t &, Double_t &, Double_t &, Double_t &, Double_t &, Double_t &);
61 extern "C" void type_of_call pyquen(Double_t &, Int_t &, Double_t &);
62 extern "C" void type_of_call pyevnw();
63
64
65 //_____________________________________________________________________________
66
67 AliPythia6* AliPythia6::fgAliPythia=NULL;
68
69 AliPythia6::AliPythia6():
70     TPythia6(),
71     AliPythiaBase(),
72     fProcess(kPyMb),
73     fEcms(0.),
74     fStrucFunc(kCTEQ5L),
75     fProjectile("p"),
76     fTarget("p"),
77     fXJet(0.),
78     fYJet(0.),
79     fNGmax(30),
80     fZmax(0.97),
81     fGlauber(0),
82     fQuenchingWeights(0)
83 {
84 // Default Constructor
85 //
86 //  Set random number
87     Int_t i;
88     for (i = 0; i <  501; i++) fDefMDCY[i] = 0;
89     for (i = 0; i < 2001; i++) fDefMDME[i] = 0;
90     for (i = 0; i <    4; i++) fZQuench[i] = 0;
91
92     if (!AliPythiaRndm::GetPythiaRandom()) 
93       AliPythiaRndm::SetPythiaRandom(GetRandom());
94     fGlauber          = 0;
95     fQuenchingWeights = 0;
96 }
97
98 AliPythia6::AliPythia6(const AliPythia6& pythia):
99     TPythia6(),
100     AliPythiaBase(),
101     fProcess(kPyMb),
102     fEcms(0.),
103     fStrucFunc(kCTEQ5L),
104     fProjectile("p"),
105     fTarget("p"),
106     fXJet(0.),
107     fYJet(0.),
108     fNGmax(30),
109     fZmax(0.97),
110     fGlauber(0),
111     fQuenchingWeights(0)
112 {
113     // Copy Constructor
114     Int_t i;
115     for (i = 0; i <  501; i++) fDefMDCY[i] = 0;
116     for (i = 0; i < 2001; i++) fDefMDME[i] = 0;
117     for (i = 0; i <    4; i++) fZQuench[i] = 0;
118     pythia.Copy(*this);
119 }
120
121 void AliPythia6::ProcInit(Process_t process, Float_t energy, StrucFunc_t strucfunc, Int_t /*tune*/)
122 {
123 // Initialise the process to generate 
124     if (!AliPythiaRndm::GetPythiaRandom()) 
125       AliPythiaRndm::SetPythiaRandom(GetRandom());
126     
127     fProcess = process;
128     fEcms = energy;
129     fStrucFunc = strucfunc;
130 //...Switch off decay of pi0, K0S, Lambda, Sigma+-, Xi0-, Omega-.
131     SetMDCY(Pycomp(111) ,1,0);
132     SetMDCY(Pycomp(310) ,1,0);
133     SetMDCY(Pycomp(3122),1,0);
134     SetMDCY(Pycomp(3112),1,0);
135     SetMDCY(Pycomp(3212),1,0);
136     SetMDCY(Pycomp(3222),1,0);
137     SetMDCY(Pycomp(3312),1,0);
138     SetMDCY(Pycomp(3322),1,0);
139     SetMDCY(Pycomp(3334),1,0);
140     // Select structure function 
141     SetMSTP(52,2);
142     SetMSTP(51,AliStructFuncType::PDFsetIndex(strucfunc));
143     // Particles produced in string fragmentation point directly to either of the two endpoints
144     // of the string (depending in the side they were generated from).
145     SetMSTU(16,2);
146
147 //
148 // Pythia initialisation for selected processes//
149 //
150 // Make MSEL clean
151 //
152     for (Int_t i=1; i<= 200; i++) {
153         SetMSUB(i,0);
154     }
155 //  select charm production
156     switch (process) 
157     {
158     case kPyOldUEQ2ordered:  //Old underlying events with Q2 ordered QCD processes
159 //        Multiple interactions on.
160         SetMSTP(81,1);
161 // Double Gaussian matter distribution.
162         SetMSTP(82,4);
163         SetPARP(83,0.5);
164         SetPARP(84,0.4);
165 //  pT0.
166         SetPARP(82,2.0);
167 //  Reference energy for pT0 and energy rescaling pace.
168         SetPARP(89,1800);
169         SetPARP(90,0.25);
170 //  String drawing almost completely minimizes string length.
171         SetPARP(85,0.9);
172         SetPARP(86,0.95);
173 // ISR and FSR activity.
174         SetPARP(67,4);
175         SetPARP(71,4);
176 // Lambda_FSR scale.
177         SetPARJ(81,0.29);
178         break;
179     case kPyOldUEQ2ordered2:   
180 // Old underlying events with Q2 ordered QCD processes
181 // Multiple interactions on.
182         SetMSTP(81,1);
183 // Double Gaussian matter distribution.
184         SetMSTP(82,4);
185         SetPARP(83,0.5);
186         SetPARP(84,0.4);
187 // pT0.
188         SetPARP(82,2.0);
189 // Reference energy for pT0 and energy rescaling pace.
190         SetPARP(89,1800);
191         SetPARP(90,0.16);  // here is the difference with  kPyOldUEQ2ordered
192 // String drawing almost completely minimizes string length.
193         SetPARP(85,0.9);
194         SetPARP(86,0.95);
195 // ISR and FSR activity.
196         SetPARP(67,4);
197         SetPARP(71,4);
198 // Lambda_FSR scale.
199         SetPARJ(81,0.29);       
200         break;
201     case kPyOldPopcorn:  
202 // Old production mechanism: Old Popcorn
203         SetMSEL(1);
204         SetMSTJ(12,3); 
205 // (D=2) Like MSTJ(12)=2 but added prod ofthe 1er rank baryon
206         SetMSTP(88,2); 
207 // (D=1)see can be used to form  baryons (BARYON JUNCTION)
208         SetMSTJ(1,1);  
209         AtlasTuning();
210         break;
211     case kPyCharm:
212         SetMSEL(4);
213 //  heavy quark masses
214
215         SetPMAS(4,1,1.2);
216 //
217 //    primordial pT
218         SetMSTP(91,1);
219         SetPARP(91,1.);
220         SetPARP(93,5.);
221 //
222         break;
223     case kPyBeauty:
224         SetMSEL(5);
225         SetPMAS(5,1,4.75);
226         break;
227     case kPyJpsi:
228         SetMSEL(0);
229 // gg->J/Psi g
230         SetMSUB(86,1);
231         break;
232     case kPyJpsiChi:
233         SetMSEL(0);
234 // gg->J/Psi g
235         SetMSUB(86,1);
236 // gg-> chi_0c g
237         SetMSUB(87,1);
238 // gg-> chi_1c g
239         SetMSUB(88,1);
240 // gg-> chi_2c g
241         SetMSUB(89,1);  
242         break;
243     case kPyCharmUnforced:
244         SetMSEL(0);
245 // gq->qg   
246         SetMSUB(28,1);
247 // gg->qq
248         SetMSUB(53,1);
249 // gg->gg
250         SetMSUB(68,1);
251         break;
252     case kPyBeautyUnforced:
253         SetMSEL(0);
254 // gq->qg   
255         SetMSUB(28,1);
256 // gg->qq
257         SetMSUB(53,1);
258 // gg->gg
259         SetMSUB(68,1);
260         break;
261     case kPyMb:
262 // Minimum Bias pp-Collisions
263 //
264 //   
265 //      select Pythia min. bias model
266         SetMSEL(0);
267         SetMSUB(92,1);             // single diffraction AB-->XB
268         SetMSUB(93,1);             // single diffraction AB-->AX
269         SetMSUB(94,1);             // double diffraction
270         SetMSUB(95,1);             // low pt production
271
272         AtlasTuning();
273         break;
274     case kPyMbAtlasTuneMC09:
275 // Minimum Bias pp-Collisions
276 //
277 //   
278 //      select Pythia min. bias model
279         SetMSEL(0);
280         SetMSUB(92,1);             // single diffraction AB-->XB
281         SetMSUB(93,1);             // single diffraction AB-->AX
282         SetMSUB(94,1);             // double diffraction
283         SetMSUB(95,1);             // low pt production
284
285         AtlasTuningMC09();
286         break;
287
288     case kPyMbWithDirectPhoton:
289 // Minimum Bias pp-Collisions with direct photon processes added 
290 //
291 //   
292 //      select Pythia min. bias model
293         SetMSEL(0);
294         SetMSUB(92,1);             // single diffraction AB-->XB
295         SetMSUB(93,1);             // single diffraction AB-->AX
296         SetMSUB(94,1);             // double diffraction
297         SetMSUB(95,1);             // low pt production
298
299         SetMSUB(14,1);             //
300         SetMSUB(18,1);             //
301         SetMSUB(29,1);             //
302         SetMSUB(114,1);            //
303         SetMSUB(115,1);            //
304
305
306         AtlasTuning();
307         break;
308
309     case kPyMbDefault:
310 // Minimum Bias pp-Collisions
311 //
312 //   
313 //      select Pythia min. bias model
314         SetMSEL(0);
315         SetMSUB(92,1);             // single diffraction AB-->XB
316         SetMSUB(93,1);             // single diffraction AB-->AX
317         SetMSUB(94,1);             // double diffraction
318         SetMSUB(95,1);             // low pt production
319
320         break;
321     case kPyLhwgMb:
322 // Les Houches Working Group 05 Minimum Bias pp-Collisions: hep-ph/0604120
323 //  -> Pythia 6.3 or above is needed
324 //   
325         SetMSEL(0);
326         SetMSUB(92,1);             // single diffraction AB-->XB
327         SetMSUB(93,1);             // single diffraction AB-->AX
328         SetMSUB(94,1);             // double diffraction
329         SetMSUB(95,1);             // low pt production
330         SetMSTP(51,AliStructFuncType::PDFsetIndex(kCTEQ6ll));
331         SetMSTP(52,2);
332         SetMSTP(68,1);
333         SetMSTP(70,2);
334         SetMSTP(81,1);             // Multiple Interactions ON
335         SetMSTP(82,4);             // Double Gaussian Model
336         SetMSTP(88,1);
337
338         SetPARP(82,2.3);           // [GeV]    PT_min at Ref. energy
339         SetPARP(83,0.5);           // Core density in proton matter distribution (def.value)
340         SetPARP(84,0.5);           // Core radius
341         SetPARP(85,0.9);           // Regulates gluon prod. mechanism
342         SetPARP(90,0.2);           // 2*epsilon (exponent in power law)
343
344         break;
345     case kPyMbNonDiffr:
346 // Minimum Bias pp-Collisions
347 //
348 //   
349 //      select Pythia min. bias model
350         SetMSEL(0);
351         SetMSUB(95,1);             // low pt production
352
353         AtlasTuning();
354         break;
355     case kPyMbMSEL1:
356         ConfigHeavyFlavor();
357 // Intrinsic <kT^2>
358         SetMSTP(91,1);// Width (1=gaussian) primordial kT dist. inside hadrons
359         SetPARP(91,1.);     // <kT^2> = PARP(91,1.)^2
360         SetPARP(93,5.);     // Upper cut-off
361 // Set Q-quark mass
362         SetPMAS(4,1,1.2);   // Charm quark mass
363         SetPMAS(5,1,4.78);  // Beauty quark mass
364         SetPARP(71,4.);     // Defaut value
365 // Atlas Tuning
366         AtlasTuning();
367         break;
368     case kPyJets:
369 //
370 //  QCD Jets
371 //
372         SetMSEL(1);
373  // Pythia Tune A (CDF)
374  //
375        SetPARP(67,2.5);           // Regulates Initial State Radiation (value from best fit to D0 dijet analysis)
376        SetMSTP(82,4);             // Double Gaussian Model
377        SetPARP(82,2.0);           // [GeV]    PT_min at Ref. energy
378        SetPARP(84,0.4);           // Core radius
379        SetPARP(85,0.90) ;         // Regulates gluon prod. mechanism
380        SetPARP(86,0.95);          // Regulates gluon prod. mechanism
381        SetPARP(89,1800.);         // [GeV]   Ref. energy
382        SetPARP(90,0.25);          // 2*epsilon (exponent in power law)
383        break;
384     case kPyDirectGamma:
385         SetMSEL(10);
386         break;
387     case kPyCharmPbPbMNR:
388     case kPyD0PbPbMNR:
389     case kPyDPlusPbPbMNR:
390     case kPyDPlusStrangePbPbMNR:
391       // Tuning of Pythia parameters aimed to get a resonable agreement
392       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
393       // c-cbar single inclusive and double differential distributions.
394       // This parameter settings are meant to work with Pb-Pb collisions
395       // (AliGenPythia::SetNuclei) and with kCTEQ4L PDFs.
396       // To get a good agreement the minimum ptHard (AliGenPythia::SetPtHard)
397       // has to be set to 2.1GeV. Example in ConfigCharmPPR.C.
398         ConfigHeavyFlavor();
399       // Intrinsic <kT>
400       SetMSTP(91,1);
401       SetPARP(91,1.304);
402       SetPARP(93,6.52);
403       // Set c-quark mass
404       SetPMAS(4,1,1.2);
405       break;
406     case kPyCharmpPbMNR:
407     case kPyD0pPbMNR:
408     case kPyDPluspPbMNR:
409     case kPyDPlusStrangepPbMNR:
410       // Tuning of Pythia parameters aimed to get a resonable agreement
411       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
412       // c-cbar single inclusive and double differential distributions.
413       // This parameter settings are meant to work with p-Pb collisions
414       // (AliGenPythia::SetNuclei) and with kCTEQ4L PDFs.
415       // To get a good agreement the minimum ptHard (AliGenPythia::SetPtHard)
416       // has to be set to 2.1GeV. Example in ConfigCharmPPR.C.
417         ConfigHeavyFlavor();
418       // Intrinsic <kT>
419         SetMSTP(91,1);
420         SetPARP(91,1.16);
421         SetPARP(93,5.8);
422         
423       // Set c-quark mass
424         SetPMAS(4,1,1.2);
425       break;
426     case kPyCharmppMNR:
427     case kPyD0ppMNR:
428     case kPyDPlusppMNR:
429     case kPyDPlusStrangeppMNR:
430     case kPyLambdacppMNR:
431       // Tuning of Pythia parameters aimed to get a resonable agreement
432       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
433       // c-cbar single inclusive and double differential distributions.
434       // This parameter settings are meant to work with pp collisions
435       // (AliGenPythia::SetNuclei) and with kCTEQ4L PDFs.
436       // To get a good agreement the minimum ptHard (AliGenPythia::SetPtHard)
437       // has to be set to 2.1GeV. Example in ConfigCharmPPR.C.
438         ConfigHeavyFlavor();
439       // Intrinsic <kT^2>
440         SetMSTP(91,1);
441         SetPARP(91,1.);
442         SetPARP(93,5.);
443         
444       // Set c-quark mass
445         SetPMAS(4,1,1.2);
446       break;
447     case kPyCharmppMNRwmi:
448       // Tuning of Pythia parameters aimed to get a resonable agreement
449       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
450       // c-cbar single inclusive and double differential distributions.
451       // This parameter settings are meant to work with pp collisions
452       // and with kCTEQ5L PDFs.
453       // Added multiple interactions according to ATLAS tune settings.
454       // To get a "reasonable" agreement with MNR results, events have to be 
455       // generated with the minimum ptHard (AliGenPythia::SetPtHard)
456       // set to 2.76 GeV.
457       // To get a "perfect" agreement with MNR results, events have to be 
458       // generated in four ptHard bins with the following relative 
459       // normalizations:
460       // 2.76-3 GeV: 25%
461       //    3-4 GeV: 40%
462       //    4-8 GeV: 29%
463       //     >8 GeV:  6%
464         ConfigHeavyFlavor();
465       // Intrinsic <kT^2>
466         SetMSTP(91,1);
467         SetPARP(91,1.);
468         SetPARP(93,5.);
469
470       // Set c-quark mass
471         SetPMAS(4,1,1.2);
472         AtlasTuning();
473         break;
474     case kPyBeautyPbPbMNR:
475       // Tuning of Pythia parameters aimed to get a resonable agreement
476       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
477       // b-bbar single inclusive and double differential distributions.
478       // This parameter settings are meant to work with Pb-Pb collisions
479       // (AliGenPythia::SetNuclei) and with kCTEQ4L PDFs.
480       // To get a good agreement the minimum ptHard (AliGenPythia::SetPtHard)
481       // has to be set to 2.75GeV. Example in ConfigBeautyPPR.C.
482         ConfigHeavyFlavor();
483       // QCD scales
484         SetPARP(67,1.0);
485         SetPARP(71,1.0);
486       // Intrinsic <kT>
487         SetMSTP(91,1);
488         SetPARP(91,2.035);
489         SetPARP(93,10.17);
490       // Set b-quark mass
491         SetPMAS(5,1,4.75);
492       break;
493     case kPyBeautypPbMNR:
494       // Tuning of Pythia parameters aimed to get a resonable agreement
495       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
496       // b-bbar single inclusive and double differential distributions.
497       // This parameter settings are meant to work with p-Pb collisions
498       // (AliGenPythia::SetNuclei) and with kCTEQ4L PDFs.
499       // To get a good agreement the minimum ptHard (AliGenPythia::SetPtHard)
500       // has to be set to 2.75GeV. Example in ConfigBeautyPPR.C.
501         ConfigHeavyFlavor();
502       // QCD scales
503         SetPARP(67,1.0);
504         SetPARP(71,1.0);
505       // Intrinsic <kT>
506         SetMSTP(91,1);
507         SetPARP(91,1.60);
508         SetPARP(93,8.00);
509       // Set b-quark mass
510         SetPMAS(5,1,4.75);
511       break;
512     case kPyBeautyppMNR:
513       // Tuning of Pythia parameters aimed to get a resonable agreement
514       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
515       // b-bbar single inclusive and double differential distributions.
516       // This parameter settings are meant to work with pp collisions
517       // (AliGenPythia::SetNuclei) and with kCTEQ4L PDFs.
518       // To get a good agreement the minimum ptHard (AliGenPythia::SetPtHard)
519       // has to be set to 2.75GeV. Example in ConfigBeautyPPR.C.
520         ConfigHeavyFlavor();
521       // QCD scales
522         SetPARP(67,1.0);
523         SetPARP(71,1.0);
524         
525         // Intrinsic <kT>
526         SetMSTP(91,1);
527         SetPARP(91,1.);
528         SetPARP(93,5.);
529         
530         // Set b-quark mass
531         SetPMAS(5,1,4.75);
532       break;
533      case kPyBeautyJets: 
534      case kPyBeautyppMNRwmi:
535       // Tuning of Pythia parameters aimed to get a resonable agreement
536       // between with the NLO calculation by Mangano, Nason, Ridolfi for the
537       // b-bbar single inclusive and double differential distributions.
538       // This parameter settings are meant to work with pp collisions
539       // and with kCTEQ5L PDFs.
540       // Added multiple interactions according to ATLAS tune settings.
541       // To get a "reasonable" agreement with MNR results, events have to be 
542       // generated with the minimum ptHard (AliGenPythia::SetPtHard)
543       // set to 2.76 GeV.
544       // To get a "perfect" agreement with MNR results, events have to be 
545       // generated in four ptHard bins with the following relative 
546       // normalizations:
547       // 2.76-4 GeV:  5% 
548       //    4-6 GeV: 31%
549       //    6-8 GeV: 28%
550       //     >8 GeV: 36%
551          ConfigHeavyFlavor();
552       // QCD scales
553          SetPARP(67,1.0);
554          SetPARP(71,1.0);
555          
556          // Intrinsic <kT>
557          SetMSTP(91,1);
558          SetPARP(91,1.);
559          SetPARP(93,5.);
560
561       // Set b-quark mass
562          SetPMAS(5,1,4.75);
563
564          AtlasTuning();
565          break; 
566     case kPyW:
567
568       //Inclusive production of W+/-
569       SetMSEL(0);
570       //f fbar -> W+ 
571       SetMSUB(2,1);
572       //        //f fbar -> g W+
573       //        SetMSUB(16,1);
574       //        //f fbar -> gamma W+
575       //        SetMSUB(20,1);
576       //        //f g -> f W+  
577       //        SetMSUB(31,1);
578       //        //f gamma -> f W+
579       //        SetMSUB(36,1);
580       
581       // Initial/final parton shower on (Pythia default)
582       // With parton showers on we are generating "W inclusive process"
583       SetMSTP(61,1); //Initial QCD & QED showers on
584       SetMSTP(71,1); //Final QCD & QED showers on
585       
586       break;  
587
588     case kPyZ:
589
590       //Inclusive production of Z
591       SetMSEL(0);
592       //f fbar -> Z/gamma
593       SetMSUB(1,1);
594       
595       //       // f fbar -> g Z/gamma
596       //       SetMSUB(15,1);
597       //       // f fbar -> gamma Z/gamma
598       //       SetMSUB(19,1);
599       //       // f g -> f Z/gamma
600       //       SetMSUB(30,1);
601       //       // f gamma -> f Z/gamma
602       //       SetMSUB(35,1);
603       
604       //only Z included, not gamma
605       SetMSTP(43,2);
606       
607       // Initial/final parton shower on (Pythia default)
608       // With parton showers on we are generating "Z inclusive process"
609       SetMSTP(61,1); //Initial QCD & QED showers on
610       SetMSTP(71,1); //Final QCD & QED showers on
611       break;
612       case kPyMBRSingleDiffraction:
613       case kPyMBRDoubleDiffraction:
614       case kPyMBRCentralDiffraction:
615       break;  
616       case kPyJetsPWHG:
617       //    N.B.
618       //    ====
619       //    For the case of jet production the following parameter setting
620       //    limits the transverse momentum of secondary scatterings, due
621       //    to multiple parton interactions, to be less than that of the
622       //    primary interaction (see POWHEG Dijet paper arXiv:1012.3380
623       //    [hep-ph] sec. 4.1 and also the PYTHIA Manual).
624       SetMSTP(86,1);
625       //    maximum number of errors before pythia aborts (def=10)
626       SetMSTU(22,10);
627       //    number of warnings printed on the shell
628       SetMSTU(26,20);
629       break;
630     }
631 //
632 //  Initialize PYTHIA
633     SetMSTP(41,1);   // all resonance decays switched on
634     if (process == kPyJetsPWHG || process == kPyCharmPWHG || process == kPyBeautyPWHG) {
635       Initialize("USER","","",0.);
636     } else {    
637       Initialize("CMS",fProjectile,fTarget,fEcms);
638     }
639 }
640
641 Int_t AliPythia6::CheckedLuComp(Int_t kf)
642 {
643 // Check Lund particle code (for debugging)
644     Int_t kc=Pycomp(kf);
645     return kc;
646 }
647
648 void AliPythia6::SetNuclei(Int_t a1, Int_t a2)
649 {
650 // Treat protons as inside nuclei with mass numbers a1 and a2  
651 //    The MSTP array in the PYPARS common block is used to enable and 
652 //    select the nuclear structure functions. 
653 //    MSTP(52)  : (D=1) choice of proton and nuclear structure-function library
654 //            =1: internal PYTHIA acording to MSTP(51) 
655 //            =2: PDFLIB proton  s.f., with MSTP(51)  = 1000xNGROUP+NSET
656 //    If the following mass number both not equal zero, nuclear corrections of the stf are used.
657 //    MSTP(192) : Mass number of nucleus side 1
658 //    MSTP(193) : Mass number of nucleus side 2
659     SetMSTP(52,2);
660     SetMSTP(192, a1);
661     SetMSTP(193, a2);  
662 }
663         
664
665 AliPythia6* AliPythia6::Instance()
666
667 // Set random number generator 
668     if (fgAliPythia) {
669         return fgAliPythia;
670     } else {
671         fgAliPythia = new AliPythia6();
672         return fgAliPythia;
673     }
674 }
675
676 void AliPythia6::PrintParticles()
677
678 // Print list of particl properties
679     Int_t np = 0;
680     char*   name = new char[16];    
681     for (Int_t kf=0; kf<1000000; kf++) {
682         for (Int_t c = 1;  c > -2; c-=2) {
683             Int_t kc = Pycomp(c*kf);
684             if (kc) {
685                 Float_t mass  = GetPMAS(kc,1);
686                 Float_t width = GetPMAS(kc,2);  
687                 Float_t tau   = GetPMAS(kc,4);
688
689                 Pyname(kf,name);
690         
691                 np++;
692                 
693                 printf("\n mass, width, tau: %6d %s %10.3f %10.3e %10.3e", 
694                        c*kf, name, mass, width, tau);
695             }
696         }
697     }
698     printf("\n Number of particles %d \n \n", np);
699 }
700
701 void  AliPythia6::ResetDecayTable()
702 {
703 //  Set default values for pythia decay switches
704     Int_t i;
705     for (i = 1; i <  501; i++) SetMDCY(i,1,fDefMDCY[i]);
706     for (i = 1; i < 2001; i++) SetMDME(i,1,fDefMDME[i]);
707 }
708
709 void  AliPythia6::SetDecayTable()
710 {
711 //  Set default values for pythia decay switches
712 //
713     Int_t i;
714     for (i = 1; i <  501; i++) fDefMDCY[i] = GetMDCY(i,1);
715     for (i = 1; i < 2001; i++) fDefMDME[i] = GetMDME(i,1);
716 }
717
718 void  AliPythia6::Pyjoin(Int_t& npart, Int_t *ipart)
719 {
720 //  Call Pythia join alogorithm to set up a string between
721 //  npart partons, given by indices in array ipart[npart]
722 //
723     pyjoin(npart, ipart);
724 }
725
726 void  AliPythia6::Pyshowq(Int_t ip1, Int_t ip2, Double_t qmax)
727 {
728 //  Call qPythia showering
729 //
730     pyshowq(ip1, ip2, qmax);
731 }
732
733 void AliPythia6::Qpygin0()
734 {
735     //position of the hard scattering in the nuclear overlapping area.
736     //just for qpythia.
737     qpygin0();
738 }
739
740 void  AliPythia6::Pyclus(Int_t& njet)
741 {
742 //  Call Pythia clustering algorithm
743 //
744     pyclus(njet);
745 }
746
747 void  AliPythia6::Pycell(Int_t& njet)
748 {
749 //  Call Pythia jet reconstruction algorithm
750 //
751     pycell(njet);
752 }
753
754 void AliPythia6::GetJet(Int_t i, Float_t& px, Float_t& py, Float_t& pz, Float_t& e)
755 {
756     // Get jet number i
757     Int_t n = GetN();
758     px    = GetPyjets()->P[0][n+i];
759     py    = GetPyjets()->P[1][n+i];
760     pz    = GetPyjets()->P[2][n+i];
761     e     = GetPyjets()->P[3][n+i];
762 }
763
764 void  AliPythia6::Pyshow(Int_t ip1, Int_t ip2, Double_t qmax)
765 {
766 //  Call Pythia showering
767 //
768     pyshow(ip1, ip2, qmax);
769 }
770
771 void AliPythia6::Pyrobo(Int_t imi, Int_t ima, Double_t the, Double_t phi, Double_t bex, Double_t bey, Double_t bez)
772 {
773     pyrobo(imi, ima, the, phi, bex, bey, bez);
774 }
775
776
777
778 void AliPythia6::InitQuenching(Float_t cMin, Float_t cMax, Float_t k, Int_t iECMethod, Float_t zmax, Int_t ngmax)
779 {
780 // Initializes 
781 // (1) The quenching model using quenching weights according to C. Salgado and U. Wiedemann
782 // (2) The nuclear geometry using the Glauber Model
783 //     
784     
785     fGlauber = AliFastGlauber::Instance();
786     fGlauber->Init(2);
787     fGlauber->SetCentralityClass(cMin, cMax); 
788
789     fQuenchingWeights = new AliQuenchingWeights();
790     fQuenchingWeights->InitMult();
791     fQuenchingWeights->SetK(k);
792     fQuenchingWeights->SetECMethod(AliQuenchingWeights::kECMethod(iECMethod));
793     fNGmax = ngmax;
794     fZmax  = zmax;
795     
796 }
797
798
799 void  AliPythia6::Quench()
800 {
801 //
802 //
803 //  Simple Jet Quenching routine:
804 //  =============================
805 //  The jet formed by all final state partons radiated by the parton created 
806 //  in the hard collisions is quenched by a factor (1-z) using light cone variables in 
807 //  the initial parton reference frame:
808 //  (E + p_z)new = (1-z) (E + p_z)old
809 //
810 //
811 //
812 //
813 //   The lost momentum is first balanced by one gluon with virtuality > 0.   
814 //   Subsequently the gluon splits to yield two gluons with E = p.
815 //
816 //
817 // 
818     static Float_t eMean = 0.;
819     static Int_t   icall = 0;
820     
821     Double_t p0[4][5];
822     Double_t p1[4][5];
823     Double_t p2[4][5];
824     Int_t   klast[4] = {-1, -1, -1, -1};
825
826     Int_t numpart   = fPyjets->N;
827     Double_t px = 0., py = 0., pz = 0., e = 0., m = 0., p = 0., pt = 0., theta = 0., phi = 0.;
828     Double_t pxq[4], pyq[4], pzq[4], eq[4], yq[4], mq[4], pq[4], phiq[4], thetaq[4], ptq[4];
829     Bool_t  quenched[4];
830     Double_t wjtKick[4] = {0., 0., 0., 0.};
831     Int_t nGluon[4];
832     Int_t qPdg[4];
833     Int_t   imo, kst, pdg;
834     
835 //
836 //  Sore information about Primary partons
837 //
838 //  j =
839 //  0, 1 partons from hard scattering
840 //  2, 3 partons from initial state radiation
841 // 
842     for (Int_t i = 2; i <= 7; i++) {
843         Int_t j = 0;
844         // Skip gluons that participate in hard scattering
845         if (i == 4 || i == 5) continue;
846         // Gluons from hard Scattering
847         if (i == 6 || i == 7) {
848             j = i - 6;
849             pxq[j]    = fPyjets->P[0][i];
850             pyq[j]    = fPyjets->P[1][i];
851             pzq[j]    = fPyjets->P[2][i];
852             eq[j]     = fPyjets->P[3][i];
853             mq[j]     = fPyjets->P[4][i];
854         } else {
855             // Gluons from initial state radiation
856             //
857             // Obtain 4-momentum vector from difference between original parton and parton after gluon 
858             // radiation. Energy is calculated independently because initial state radition does not 
859             // conserve strictly momentum and energy for each partonic system independently.
860             //
861             // Not very clean. Should be improved !
862             //
863             //
864             j = i;
865             pxq[j]    = fPyjets->P[0][i] - fPyjets->P[0][i+2];
866             pyq[j]    = fPyjets->P[1][i] - fPyjets->P[1][i+2];
867             pzq[j]    = fPyjets->P[2][i] - fPyjets->P[2][i+2];
868             mq[j]     = fPyjets->P[4][i];
869             eq[j]     = TMath::Sqrt(pxq[j] * pxq[j] + pyq[j] * pyq[j] + pzq[j] * pzq[j] + mq[j] * mq[j]);
870         }
871 //
872 //  Calculate some kinematic variables
873 //
874         yq[j]     = 0.5 * TMath::Log((eq[j] + pzq[j] + 1.e-14) / (eq[j] - pzq[j] + 1.e-14));
875         pq[j]     = TMath::Sqrt(pxq[j] * pxq[j] + pyq[j] * pyq[j] + pzq[j] * pzq[j]);
876         phiq[j]   = TMath::Pi()+TMath::ATan2(-pyq[j], -pxq[j]);
877         ptq[j]    = TMath::Sqrt(pxq[j] * pxq[j] + pyq[j] * pyq[j]);
878         thetaq[j] = TMath::ATan2(ptq[j], pzq[j]);
879         qPdg[j]   =  fPyjets->K[1][i];
880     }
881   
882     Double_t int0[4];
883     Double_t int1[4];
884     
885     fGlauber->GetI0I1ForPythiaAndXY(4, phiq, int0, int1, fXJet, fYJet, 15.);
886
887     for (Int_t j = 0; j < 4; j++) {
888         //
889         // Quench only central jets and with E > 10.
890         //
891
892
893         Int_t itype = (qPdg[j] == 21) ? 2 : 1;
894         //      Double_t eloss = fQuenchingWeights->GetELossRandomKFast(itype, int0[j], int1[j], eq[j]);
895         Double_t eloss = fQuenchingWeights->GetELossRandomK(itype, int0[j], int1[j], eq[j]);
896
897         if (TMath::Abs(yq[j]) > 2.5 || eq[j] < 10.) {
898             fZQuench[j] = 0.;
899         } else {
900             if (eq[j] > 40. && TMath::Abs(yq[j]) < 0.5) {
901                 icall ++;
902                 eMean += eloss;
903             }
904             //
905             // Extra pt
906             Double_t l =   fQuenchingWeights->CalcLk(int0[j], int1[j]);     
907             wjtKick[j] = TMath::Sqrt(l *  fQuenchingWeights->CalcQk(int0[j], int1[j]));
908             //
909             // Fractional energy loss
910             fZQuench[j] = eloss / eq[j];
911             //
912             // Avoid complete loss
913             //
914             if (fZQuench[j] > fZmax) fZQuench[j] = fZmax;
915             //
916             // Some debug printing
917
918             
919 //          printf("Initial parton # %3d, Type %3d Energy %10.3f Phi %10.3f Length %10.3f Loss %10.3f Kick %10.3f Mean: %10.3f %10.3f\n", 
920 //                 j, itype, eq[j], phiq[j], l, eloss, wjtKick[j], eMean / Float_t(icall+1), yq[j]);
921             
922 //          fZQuench[j] = 0.8;
923 //          while (fZQuench[j] >= 0.95)  fZQuench[j] = gRandom->Exp(0.2);
924         }
925         
926         quenched[j] = (fZQuench[j] > 0.01);
927     } // primary partons
928     
929     
930
931     Double_t pNew[1000][4];
932     Int_t    kNew[1000];
933     Int_t icount = 0;
934     Double_t zquench[4];
935     
936 //
937 //  System Loop    
938     for (Int_t isys = 0; isys < 4; isys++) {
939 //      Skip to next system if not quenched.
940         if (!quenched[isys]) continue;
941         
942         nGluon[isys]   = 1 + Int_t(fZQuench[isys] / (1. - fZQuench[isys]));
943         if (nGluon[isys] > fNGmax) nGluon[isys] = fNGmax;
944         zquench[isys] = 1. - TMath::Power(1. - fZQuench[isys], 1./Double_t(nGluon[isys]));
945         wjtKick[isys]  = wjtKick[isys] / TMath::Sqrt(Double_t(nGluon[isys]));
946
947
948         
949         Int_t igMin = -1;
950         Int_t igMax = -1;
951         Double_t pg[4] = {0., 0., 0., 0.};
952         
953 //
954 // Loop on radiation events
955
956         for (Int_t iglu = 0; iglu < nGluon[isys]; iglu++) {
957             while (1) {
958                 icount = 0;
959                 for (Int_t k = 0; k < 4; k++)
960                 {
961                     p0[isys][k] = 0.;
962                     p1[isys][k] = 0.;
963                     p2[isys][k] = 0.;
964                 }
965 //      Loop over partons
966                 for (Int_t i = 0; i < numpart; i++)
967                 {
968                     imo =  fPyjets->K[2][i];
969                     kst =  fPyjets->K[0][i];
970                     pdg =  fPyjets->K[1][i];
971                     
972                 
973                 
974 //      Quarks and gluons only
975                     if (pdg != 21 && TMath::Abs(pdg) > 6) continue;
976 //      Particles from hard scattering only
977                     
978                     if (imo > 8 && imo < 1000) imo = fPyjets->K[2][imo - 1];
979                     Int_t imom = imo % 1000;
980                     if ((isys == 0 || isys == 1) && ((imom != (isys + 7)))) continue;
981                     if ((isys == 2 || isys == 3) && ((imom != (isys + 1)))) continue;               
982                     
983                     
984 //      Skip comment lines
985                     if (kst != 1 && kst != 2) continue;
986 //
987 //      Parton kinematic
988                     px    = fPyjets->P[0][i];
989                     py    = fPyjets->P[1][i];
990                     pz    = fPyjets->P[2][i];
991                     e     = fPyjets->P[3][i];
992                     m     = fPyjets->P[4][i];
993                     pt    = TMath::Sqrt(px * px + py * py);
994                     p     = TMath::Sqrt(px * px + py * py + pz * pz); 
995                     phi   = TMath::Pi() + TMath::ATan2(-py, -px);
996                     theta = TMath::ATan2(pt, pz);
997                 
998 //
999 //      Save 4-momentum sum for balancing
1000                     Int_t index = isys;
1001                     
1002                     p0[index][0] += px;
1003                     p0[index][1] += py;
1004                     p0[index][2] += pz;
1005                     p0[index][3] += e;
1006                 
1007                     klast[index] = i;
1008                     
1009 //
1010 //      Fractional energy loss
1011                     Double_t z = zquench[index];
1012                     
1013                     
1014 //      Don't fully quench radiated gluons
1015 //
1016                     if (imo > 1000) {
1017 //      This small factor makes sure that the gluons are not too close in phase space to avoid recombination
1018 //
1019
1020                         z = 0.02;
1021                     }
1022 //                  printf("z: %d %f\n", imo, z);
1023                     
1024
1025 //
1026                     
1027                     //
1028                     //
1029                     //      Transform into frame in which initial parton is along z-axis
1030                     //
1031                     TVector3 v(px, py, pz);
1032                     v.RotateZ(-phiq[index]);  v.RotateY(-thetaq[index]);
1033                     Double_t pxs = v.X(); Double_t pys = v.Y(); Double_t pl  = v.Z();
1034
1035                     Double_t jt  = TMath::Sqrt(pxs * pxs + pys * pys);
1036                     Double_t mt2 = jt * jt + m * m;
1037                     Double_t zmax = 1.;     
1038                     //
1039                     // Kinematic limit on z
1040                     //
1041                     if (m > 0.) zmax = 1. - m / TMath::Sqrt(m * m + jt * jt);
1042                     //
1043                     // Change light-cone kinematics rel. to initial parton
1044                     //  
1045                     Double_t eppzOld = e + pl;
1046                     Double_t empzOld = e - pl;
1047                     
1048                     Double_t eppzNew = (1. - z) * eppzOld;
1049                     Double_t empzNew = empzOld - mt2 * z / eppzOld;
1050                     Double_t eNew    = 0.5 * (eppzNew + empzNew);
1051                     Double_t plNew   = 0.5 * (eppzNew - empzNew);
1052                     
1053                     Double_t jtNew;
1054                     //
1055                     // if mt very small (or sometimes even < 0 for numerical reasons) set it to 0
1056                     Double_t mt2New = eppzNew * empzNew;
1057                     if (mt2New < 1.e-8) mt2New = 0.;
1058                     if (z < zmax) {
1059                         if (m * m > mt2New) {
1060                             //
1061                             // This should not happen 
1062                             //
1063                             Fatal("Quench()", "This should never happen %e %e %e!", m, eppzNew, empzNew);
1064                             jtNew = 0;
1065                         } else {
1066                             jtNew    = TMath::Sqrt(mt2New - m * m);
1067                         }
1068                     } else {
1069                         // If pT is to small (probably a leading massive particle) we scale only the energy
1070                         // This can cause negative masses of the radiated gluon
1071                         // Let's hope for the best ...
1072                         jtNew = jt;
1073                         eNew  = TMath::Sqrt(plNew * plNew + mt2);
1074                         
1075                     }
1076                     //
1077                     //     Calculate new px, py
1078                     //
1079                     Double_t pxNew = 0;
1080                     Double_t pyNew = 0;
1081
1082                     if (jt > 0.) {
1083                         pxNew   = jtNew / jt * pxs;
1084                         pyNew   = jtNew / jt * pys;     
1085                     }
1086                     
1087 //                  Double_t dpx = pxs - pxNew;
1088 //                  Double_t dpy = pys - pyNew;
1089 //                  Double_t dpz = pl  - plNew;
1090 //                  Double_t de  = e   - eNew;
1091 //                  Double_t dmass2 = de * de  - dpx * dpx - dpy * dpy - dpz * dpz;
1092 //                  printf("New mass (1) %e %e %e %e %e %e %e \n", dmass2, jt, jtNew, pl, plNew, e, eNew);
1093 //                  printf("New mass (2) %e %e \n", pxNew, pyNew);
1094                     //
1095                     //      Rotate back
1096                     //  
1097                     TVector3 w(pxNew, pyNew, plNew);
1098                     w.RotateY(thetaq[index]); w.RotateZ(phiq[index]);
1099                     pxNew = w.X(); pyNew = w.Y(); plNew = w.Z();
1100                 
1101                     p1[index][0] += pxNew;
1102                     p1[index][1] += pyNew;
1103                     p1[index][2] += plNew;
1104                     p1[index][3] += eNew;       
1105                     //
1106                     // Updated 4-momentum vectors
1107                     //
1108                     pNew[icount][0]  = pxNew;
1109                     pNew[icount][1]  = pyNew;
1110                     pNew[icount][2]  = plNew;
1111                     pNew[icount][3]  = eNew;
1112                     kNew[icount]     = i;
1113                     icount++;
1114                 } // parton loop
1115                 //
1116                 // Check if there was phase-space for quenching
1117                 //
1118
1119                 if (icount == 0) quenched[isys] = kFALSE;
1120                 if (!quenched[isys]) break;
1121                 
1122                 for (Int_t j = 0; j < 4; j++) 
1123                 {
1124                     p2[isys][j] = p0[isys][j] - p1[isys][j];
1125                 }
1126                 p2[isys][4] = p2[isys][3] * p2[isys][3] - p2[isys][0] * p2[isys][0] - p2[isys][1] * p2[isys][1] - p2[isys][2] * p2[isys][2];
1127                 if (p2[isys][4] > 0.) {
1128                     p2[isys][4] = TMath::Sqrt(p2[isys][4]);
1129                     break;
1130                 } else {
1131                     printf("Warning negative mass squared in system %d %f ! \n", isys, zquench[isys]);
1132                     printf("4-Momentum: %10.3e %10.3e %10.3e %10.3e %10.3e \n", p2[isys][0], p2[isys][1], p2[isys][2], p2[isys][3], p2[isys][4]);
1133                     if (p2[isys][4] < -0.01) {
1134                         printf("Negative mass squared !\n");
1135                         // Here we have to put the gluon back to mass shell
1136                         // This will lead to a small energy imbalance
1137                         p2[isys][4]  = 0.;
1138                         p2[isys][3]  = TMath::Sqrt(p2[isys][0] * p2[isys][0] + p2[isys][1] * p2[isys][1] + p2[isys][2] * p2[isys][2]);
1139                         break;
1140                     } else {
1141                         p2[isys][4] = 0.;
1142                         break;
1143                     }
1144                 }
1145                 /*
1146                 zHeavy *= 0.98;
1147                 printf("zHeavy lowered to %f\n", zHeavy);
1148                 if (zHeavy < 0.01) {
1149                     printf("No success ! \n");
1150                     icount = 0;
1151                     quenched[isys] = kFALSE;
1152                     break;
1153                 }
1154                 */
1155             } // iteration on z (while)
1156             
1157 //          Update  event record
1158             for (Int_t k = 0; k < icount; k++) {
1159 //              printf("%6d %6d %10.3e %10.3e %10.3e %10.3e\n", k, kNew[k], pNew[k][0],pNew[k][1], pNew[k][2], pNew[k][3] );
1160                 fPyjets->P[0][kNew[k]] = pNew[k][0];
1161                 fPyjets->P[1][kNew[k]] = pNew[k][1];
1162                 fPyjets->P[2][kNew[k]] = pNew[k][2];
1163                 fPyjets->P[3][kNew[k]] = pNew[k][3];
1164             }
1165             //
1166             // Add the gluons
1167             //
1168             Int_t ish = 0;    
1169             Int_t iGlu;
1170             if (!quenched[isys]) continue;
1171 //
1172 //      Last parton from shower i
1173             Int_t in = klast[isys];
1174 //
1175 //      Continue if no parton in shower i selected
1176             if (in == -1) continue;
1177 //  
1178 //      If this is the second initial parton and it is behind the first move pointer by previous ish
1179             if (isys == 1 && klast[1] > klast[0]) in += ish;
1180 //
1181 //      Starting index
1182             
1183 //          jmin = in - 1;
1184 // How many additional gluons will be generated
1185             ish  = 1;
1186             if (p2[isys][4] > 0.05) ish = 2;
1187 //
1188 //      Position of gluons
1189             iGlu = numpart;
1190             if (iglu == 0) igMin = iGlu;
1191             igMax = iGlu;
1192             numpart += ish;
1193             (fPyjets->N) += ish;
1194             
1195             if (ish == 1) {
1196                 fPyjets->P[0][iGlu] = p2[isys][0];
1197                 fPyjets->P[1][iGlu] = p2[isys][1];
1198                 fPyjets->P[2][iGlu] = p2[isys][2];
1199                 fPyjets->P[3][iGlu] = p2[isys][3];
1200                 fPyjets->P[4][iGlu] = p2[isys][4];
1201                 
1202                 fPyjets->K[0][iGlu] = 1;
1203                 if (iglu == nGluon[isys] - 1) fPyjets->K[0][iGlu] = 1;
1204                 fPyjets->K[1][iGlu] = 21;       
1205                 fPyjets->K[2][iGlu] = fPyjets->K[2][in] + 1000;
1206                 fPyjets->K[3][iGlu] = -1;       
1207                 fPyjets->K[4][iGlu] = -1;
1208                 
1209                 pg[0] += p2[isys][0];
1210                 pg[1] += p2[isys][1];
1211                 pg[2] += p2[isys][2];
1212                 pg[3] += p2[isys][3];
1213             } else {
1214                 //
1215                 // Split gluon in rest frame.
1216                 //
1217                 Double_t bx   =  p2[isys][0] / p2[isys][3];
1218                 Double_t by   =  p2[isys][1] / p2[isys][3];
1219                 Double_t bz   =  p2[isys][2] / p2[isys][3];
1220                 Double_t pst  =  p2[isys][4] / 2.;
1221                 //
1222                 // Isotropic decay ????
1223                 Double_t cost = 2. * gRandom->Rndm() - 1.;
1224                 Double_t sint = TMath::Sqrt((1.-cost)*(1.+cost));
1225                 Double_t phis =  2. * TMath::Pi() * gRandom->Rndm();
1226                 
1227                 Double_t pz1 =   pst * cost;
1228                 Double_t pz2 =  -pst * cost;
1229                 Double_t pt1 =   pst * sint;
1230                 Double_t pt2 =  -pst * sint;
1231                 Double_t px1 =   pt1 * TMath::Cos(phis);
1232                 Double_t py1 =   pt1 * TMath::Sin(phis);            
1233                 Double_t px2 =   pt2 * TMath::Cos(phis);
1234                 Double_t py2 =   pt2 * TMath::Sin(phis);            
1235                 
1236                 fPyjets->P[0][iGlu] = px1;
1237                 fPyjets->P[1][iGlu] = py1;
1238                 fPyjets->P[2][iGlu] = pz1;
1239                 fPyjets->P[3][iGlu] = pst;
1240                 fPyjets->P[4][iGlu] = 0.;
1241                 
1242                 fPyjets->K[0][iGlu] = 1 ;
1243                 fPyjets->K[1][iGlu] = 21;       
1244                 fPyjets->K[2][iGlu] = fPyjets->K[2][in] + 1000;
1245                 fPyjets->K[3][iGlu] = -1;       
1246                 fPyjets->K[4][iGlu] = -1;
1247                 
1248                 fPyjets->P[0][iGlu+1] = px2;
1249                 fPyjets->P[1][iGlu+1] = py2;
1250                 fPyjets->P[2][iGlu+1] = pz2;
1251                 fPyjets->P[3][iGlu+1] = pst;
1252                 fPyjets->P[4][iGlu+1] = 0.;
1253                 
1254                 fPyjets->K[0][iGlu+1] = 1;
1255                 if (iglu == nGluon[isys] - 1) fPyjets->K[0][iGlu+1] = 1;
1256                 fPyjets->K[1][iGlu+1] = 21;     
1257                 fPyjets->K[2][iGlu+1] = fPyjets->K[2][in] + 1000;
1258                 fPyjets->K[3][iGlu+1] = -1;     
1259                 fPyjets->K[4][iGlu+1] = -1;
1260                 SetMSTU(1,0);
1261                 SetMSTU(2,0);
1262                 //
1263                 // Boost back
1264                 //
1265                 Pyrobo(iGlu + 1, iGlu + 2, 0., 0., bx, by, bz);
1266             }
1267 /*    
1268             for (Int_t ig = iGlu; ig < iGlu+ish; ig++) {
1269                 Double_t px, py, pz;
1270                 px = fPyjets->P[0][ig]; 
1271                 py = fPyjets->P[1][ig]; 
1272                 pz = fPyjets->P[2][ig]; 
1273                 TVector3 v(px, py, pz);
1274                 v.RotateZ(-phiq[isys]);
1275                 v.RotateY(-thetaq[isys]);
1276                 Double_t pxs     = v.X(); Double_t pys = v.Y(); Double_t pzs  = v.Z();     
1277                 Double_t r       = AliPythiaRndm::GetPythiaRandom()->Rndm();
1278                 Double_t jtKick  = 0.3 * TMath::Sqrt(-TMath::Log(r));
1279                 if (ish == 2)   jtKick  = wjtKick[i] * TMath::Sqrt(-TMath::Log(r)) / TMath::Sqrt(2.);
1280                 Double_t phiKick = 2. * TMath::Pi() * AliPythiaRndm::GetPythiaRandom()->Rndm();
1281                 pxs += jtKick * TMath::Cos(phiKick);
1282                 pys += jtKick * TMath::Sin(phiKick);
1283                 TVector3 w(pxs, pys, pzs);
1284                 w.RotateY(thetaq[isys]);
1285                 w.RotateZ(phiq[isys]);
1286                 fPyjets->P[0][ig] = w.X(); 
1287                 fPyjets->P[1][ig] = w.Y(); 
1288                 fPyjets->P[2][ig] = w.Z(); 
1289                 fPyjets->P[2][ig] = w.Mag();
1290             }
1291 */
1292         } // kGluon         
1293         
1294         
1295     // Check energy conservation
1296         Double_t pxs = 0.;
1297         Double_t pys = 0.;
1298         Double_t pzs = 0.;      
1299         Double_t es  = 14000.;
1300         
1301         for (Int_t i = 0; i < numpart; i++)
1302         {
1303             kst =  fPyjets->K[0][i];
1304             if (kst != 1 && kst != 2) continue;
1305             pxs += fPyjets->P[0][i];
1306             pys += fPyjets->P[1][i];
1307             pzs += fPyjets->P[2][i];        
1308             es  -= fPyjets->P[3][i];        
1309         }
1310         if (TMath::Abs(pxs) > 1.e-2 ||
1311             TMath::Abs(pys) > 1.e-2 ||
1312             TMath::Abs(pzs) > 1.e-1) {
1313             printf("%e %e %e %e\n", pxs, pys, pzs, es);
1314 //              Fatal("Quench()", "4-Momentum non-conservation");
1315         }
1316         
1317     } // end quenching loop (systems)
1318 // Clean-up
1319     for (Int_t i = 0; i < numpart; i++)
1320     {
1321         imo =  fPyjets->K[2][i];
1322         if (imo > 1000) {
1323             fPyjets->K[2][i] = fPyjets->K[2][i] % 1000;
1324         }
1325     }
1326 //      this->Pylist(1);
1327 } // end quench
1328
1329
1330 void AliPythia6::Pyquen(Double_t a, Int_t ibf, Double_t b)
1331 {
1332     // Igor Lokthine's quenching routine
1333     // http://lokhtin.web.cern.ch/lokhtin/pyquen/pyquen.txt
1334
1335     pyquen(a, ibf, b);
1336 }
1337
1338 void AliPythia6::SetPyquenParameters(Double_t t0, Double_t tau0, Int_t nf, Int_t iengl, Int_t iangl)
1339 {
1340     // Set the parameters for the PYQUEN package.
1341     // See comments in PyquenCommon.h
1342     
1343     
1344     PYQPAR.t0    = t0;
1345     PYQPAR.tau0  = tau0;
1346     PYQPAR.nf    = nf;
1347     PYQPAR.iengl = iengl;
1348     PYQPAR.iangl = iangl;
1349 }
1350
1351 void  AliPythia6::LoadEvent(AliStack* stack, Int_t flag, Int_t reHadr)
1352 {
1353 //
1354 // Load event into Pythia Common Block
1355 //
1356
1357     Int_t npart = stack -> GetNprimary();
1358     Int_t n0 = 0;
1359     
1360     if (!flag) {
1361         GetPyjets()->N = npart;
1362     } else {
1363         n0 = GetPyjets()->N;
1364         GetPyjets()->N = n0 + npart;
1365     }
1366     
1367     
1368     for (Int_t part = 0; part < npart; part++) {
1369         TParticle *mPart = stack->Particle(part);
1370         
1371         Int_t kf     =  mPart->GetPdgCode();
1372         Int_t ks     =  mPart->GetStatusCode();
1373         Int_t idf    =  mPart->GetFirstDaughter();
1374         Int_t idl    =  mPart->GetLastDaughter();
1375         
1376         if (reHadr) {
1377             if (ks == 11 || ks == 12) {
1378                 ks  -= 10;
1379                 idf  = -1;
1380                 idl  = -1;
1381             }
1382         }
1383         
1384         Float_t px = mPart->Px();
1385         Float_t py = mPart->Py();
1386         Float_t pz = mPart->Pz();
1387         Float_t e  = mPart->Energy();
1388         Float_t m  = mPart->GetCalcMass();
1389         
1390         
1391         (GetPyjets())->P[0][part+n0] = px;
1392         (GetPyjets())->P[1][part+n0] = py;
1393         (GetPyjets())->P[2][part+n0] = pz;
1394         (GetPyjets())->P[3][part+n0] = e;
1395         (GetPyjets())->P[4][part+n0] = m;
1396         
1397         (GetPyjets())->K[1][part+n0] = kf;
1398         (GetPyjets())->K[0][part+n0] = ks;
1399         (GetPyjets())->K[3][part+n0] = idf + 1;
1400         (GetPyjets())->K[4][part+n0] = idl + 1;
1401         (GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1402     }
1403 }
1404
1405
1406 void AliPythia6::Pyevnw()
1407 {
1408     // New multiple interaction scenario
1409     pyevnw();
1410 }
1411
1412 void AliPythia6::GetQuenchingParameters(Double_t& xp, Double_t& yp, Double_t z[4])
1413 {
1414     // Return event specific quenching parameters
1415     xp = fXJet;
1416     yp = fYJet;
1417     for (Int_t i = 0; i < 4; i++) z[i] = fZQuench[i];
1418
1419 }
1420
1421 void AliPythia6::ConfigHeavyFlavor()
1422 {
1423     //
1424     // Default configuration for Heavy Flavor production
1425     //
1426     // All QCD processes
1427     //
1428     SetMSEL(1);
1429     
1430     // No multiple interactions
1431     SetMSTP(81,0);
1432     SetPARP(81, 0.);
1433     SetPARP(82, 0.);    
1434     // Initial/final parton shower on (Pythia default)
1435     SetMSTP(61,1);
1436     SetMSTP(71,1);
1437     
1438     // 2nd order alpha_s
1439     SetMSTP(2,2);
1440     
1441     // QCD scales
1442     SetMSTP(32,2);
1443     SetPARP(34,1.0);
1444 }
1445
1446 void AliPythia6::AtlasTuning()
1447 {
1448     //
1449     // Configuration for the ATLAS tuning
1450         SetMSTP(51,AliStructFuncType::PDFsetIndex(kCTEQ5L));
1451         SetMSTP(81,1);             // Multiple Interactions ON
1452         SetMSTP(82,4);             // Double Gaussian Model
1453         SetPARP(81,1.9);           // Min. pt for multiple interactions (default in 6.2-14) 
1454         SetPARP(82,1.8);           // [GeV]    PT_min at Ref. energy
1455         SetPARP(89,1000.);         // [GeV]   Ref. energy
1456         SetPARP(90,0.16);          // 2*epsilon (exponent in power law)
1457         SetPARP(83,0.5);           // Core density in proton matter distribution (def.value)
1458         SetPARP(84,0.5);           // Core radius
1459         SetPARP(85,0.33);          // Regulates gluon prod. mechanism
1460         SetPARP(86,0.66);          // Regulates gluon prod. mechanism
1461         SetPARP(67,1);             // Regulates Initial State Radiation
1462 }
1463
1464 void AliPythia6::AtlasTuningMC09()
1465 {
1466     //
1467     // Configuration for the ATLAS tuning
1468     printf("ATLAS New TUNE MC09\n");
1469     SetMSTP(81,21);             // treatment for MI, ISR, FSR and beam remnants: MI on, new model
1470     SetMSTP(82, 4);             // Double Gaussian Model
1471     SetMSTP(52, 2);             // External PDF
1472     SetMSTP(51, 20650);         // MRST LO*
1473   
1474     
1475     SetMSTP(70, 0);             // (was 2: def manual 1, def code 0) virtuality scale for ISR 
1476     SetMSTP(72, 1);             // (was 0: def 1) maximum scale for FSR
1477     SetMSTP(88, 1);             // (was 0: def 1) strategy for qq junction to di-quark or baryon in beam remnant
1478     SetMSTP(90, 0);             // (was 1: def 0) strategy of compensate the primordial kT
1479
1480     SetPARP(78, 0.3);           // the amount of color reconnection in the final state
1481     SetPARP(80, 0.1);           // probability of color partons kicked out from beam remnant
1482     SetPARP(82, 2.3);           // [GeV]    PT_min at Ref. energy    
1483     SetPARP(83, 0.8);           // Core density in proton matter distribution (def.value)    
1484     SetPARP(84, 0.7);           // Core radius
1485     SetPARP(90, 0.25);          //  2*epsilon (exponent in power law)
1486     SetPARJ(81, 0.29);          // (was 0.14: def 0.29) Labmda value in running alpha_s for parton showers
1487
1488     SetMSTP(95, 6);
1489     SetPARJ(41, 0.3);           // a and b parameters of the symmm. Lund FF
1490     SetPARJ(42, 0.58);
1491     SetPARJ(46, 0.75);          // mod. of the Lund FF for heavy end-point quarks
1492     SetPARP(89,1800.);         // [GeV]   Ref. energy
1493 }
1494
1495 void AliPythia6::SetPtHardRange(Float_t ptmin, Float_t ptmax)
1496 {
1497     // Set the pt hard range
1498     SetCKIN(3, ptmin);
1499     SetCKIN(4, ptmax);
1500 }
1501
1502 void AliPythia6::SetYHardRange(Float_t ymin, Float_t ymax)
1503 {
1504     // Set the y hard range
1505     SetCKIN(7, ymin);
1506     SetCKIN(8, ymax);
1507 }
1508
1509
1510 void AliPythia6::SetFragmentation(Int_t flag)
1511 {
1512     // Switch fragmentation on/off
1513     SetMSTP(111, flag);
1514 }
1515
1516 void AliPythia6::SetInitialAndFinalStateRadiation(Int_t flag1, Int_t flag2)
1517 {
1518 //  initial state radiation    
1519     SetMSTP(61, flag1);
1520 //  final state radiation
1521     SetMSTP(71, flag2);
1522 }
1523
1524 void AliPythia6::SetIntrinsicKt(Float_t kt)
1525 {
1526     // Set the inreinsic kt
1527     if (kt > 0.) {
1528         SetMSTP(91,1);
1529         SetPARP(91,kt); 
1530         SetPARP(93, 4. * kt);
1531     } else {
1532         SetMSTP(91,0);
1533     }
1534 }
1535
1536 void AliPythia6::SwitchHFOff()
1537 {
1538     // Switch off heavy flavor
1539     // Maximum number of quark flavours used in pdf 
1540     SetMSTP(58, 3);
1541     // Maximum number of flavors that can be used in showers
1542     SetMSTJ(45, 3);     
1543 }
1544
1545 void AliPythia6::SetPycellParameters(Float_t etamax, Int_t neta, Int_t nphi,
1546                                        Float_t thresh, Float_t etseed, Float_t minet, Float_t r)
1547 {
1548 // Set pycell parameters
1549     SetPARU(51, etamax);
1550     SetMSTU(51, neta);
1551     SetMSTU(52, nphi);
1552     SetPARU(58, thresh);
1553     SetPARU(52, etseed);
1554     SetPARU(53, minet);
1555     SetPARU(54, r);
1556     SetMSTU(54,  2);
1557 }
1558
1559 void AliPythia6::ModifiedSplitting()
1560 {
1561     // Modified splitting probability as a model for quenching
1562     SetPARJ(200, 0.8);
1563     SetMSTJ(41, 1);  // QCD radiation only
1564     SetMSTJ(42, 2);  // angular ordering
1565     SetMSTJ(44, 2);  // option to run alpha_s
1566     SetMSTJ(47, 0);  // No correction back to hard scattering element
1567     SetMSTJ(50, 0);  // No coherence in first branching
1568     SetPARJ(82, 1.); // Cut off for parton showers
1569 }
1570
1571 void AliPythia6::SwitchHadronisationOff()
1572 {
1573     // Switch off hadronisarion
1574     SetMSTJ(1, 0);
1575 }
1576
1577 void AliPythia6::SwitchHadronisationOn()
1578 {
1579     // Switch on hadronisarion
1580     SetMSTJ(1, 1);
1581 }
1582
1583
1584 void AliPythia6::GetXandQ(Float_t& x1, Float_t& x2, Float_t& q)
1585 {
1586     // Get x1, x2 and Q for this event
1587     
1588     q  = GetVINT(51);
1589     x1 = GetVINT(41);
1590     x2 = GetVINT(42);
1591 }
1592
1593 Float_t AliPythia6::GetXSection()
1594 {
1595     // Get the total cross-section
1596     return (GetPARI(1));
1597 }
1598
1599 Float_t AliPythia6::GetPtHard()
1600 {
1601     // Get the pT hard for this event
1602     return GetVINT(47);
1603 }
1604
1605 Int_t AliPythia6::ProcessCode()
1606 {
1607     // Get the subprocess code
1608     return GetMSTI(1);
1609 }
1610
1611 void AliPythia6::PrintStatistics()
1612 {
1613     // End of run statistics
1614     Pystat(1);
1615 }
1616
1617 void AliPythia6::EventListing()
1618 {
1619     // End of run statistics
1620     Pylist(2);
1621 }
1622
1623 AliPythia6& AliPythia6::operator=(const  AliPythia6& rhs)
1624 {
1625 // Assignment operator
1626     rhs.Copy(*this);
1627     return *this;
1628 }
1629
1630  void AliPythia6::Copy(TObject&) const
1631 {
1632     //
1633     // Copy 
1634     //
1635     Fatal("Copy","Not implemented!\n");
1636 }