]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PYTHIA6/AliGenPythia.cxx
Increasing histo clu. lay.1 upper lim.
[u/mrichter/AliRoot.git] / PYTHIA6 / AliGenPythia.cxx
CommitLineData
8d2cd130 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
7cdba479 16/* $Id$ */
8d2cd130 17
18//
19// Generator using the TPythia interface (via AliPythia)
20// to generate pp collisions.
21// Using SetNuclei() also nuclear modifications to the structure functions
22// can be taken into account. This makes, of course, only sense for the
23// generation of the products of hard processes (heavy flavor, jets ...)
24//
25// andreas.morsch@cern.ch
26//
27
37b09b91 28#include <TClonesArray.h>
8d2cd130 29#include <TDatabasePDG.h>
30#include <TParticle.h>
31#include <TPDGCode.h>
1058d9df 32#include <TObjArray.h>
8d2cd130 33#include <TSystem.h>
34#include <TTree.h>
8d2cd130 35#include "AliConst.h"
36#include "AliDecayerPythia.h"
37#include "AliGenPythia.h"
cd07c39b 38#include "AliFastGlauber.h"
5fa4b20b 39#include "AliHeader.h"
8d2cd130 40#include "AliGenPythiaEventHeader.h"
41#include "AliPythia.h"
7cdba479 42#include "AliPythiaRndm.h"
8d2cd130 43#include "AliRun.h"
7ea3ea5b 44#include "AliStack.h"
45#include "AliRunLoader.h"
5d12ce38 46#include "AliMC.h"
c93255fe 47#include "AliLog.h"
e2d34d35 48#include "PyquenCommon.h"
800be8b7 49#include "AliLog.h"
8d2cd130 50
014a9521 51ClassImp(AliGenPythia)
8d2cd130 52
e8a8adcd 53
54AliGenPythia::AliGenPythia():
55 AliGenMC(),
56 fProcess(kPyCharm),
efe3b1cd 57 fItune(-1),
e8a8adcd 58 fStrucFunc(kCTEQ5L),
e8a8adcd 59 fKineBias(0.),
60 fTrials(0),
61 fTrialsRun(0),
62 fQ(0.),
63 fX1(0.),
64 fX2(0.),
65 fEventTime(0.),
66 fInteractionRate(0.),
67 fTimeWindow(0.),
68 fCurSubEvent(0),
69 fEventsTime(0),
70 fNev(0),
71 fFlavorSelect(0),
72 fXsection(0.),
73 fPythia(0),
74 fPtHardMin(0.),
75 fPtHardMax(1.e4),
76 fYHardMin(-1.e10),
77 fYHardMax(1.e10),
78 fGinit(1),
79 fGfinal(1),
80 fHadronisation(1),
03358a32 81 fPatchOmegaDalitz(0),
e8a8adcd 82 fNpartons(0),
83 fReadFromFile(0),
84 fQuench(0),
cd07c39b 85 fQhat(0.),
86 fLength(0.),
66b8652c 87 fpyquenT(1.),
88 fpyquenTau(0.1),
89 fpyquenNf(0),
90 fpyquenEloss(0),
91 fpyquenAngle(0),
e6fe9b82 92 fImpact(0.),
e8a8adcd 93 fPtKick(1.),
94 fFullEvent(kTRUE),
95 fDecayer(new AliDecayerPythia()),
96 fDebugEventFirst(-1),
97 fDebugEventLast(-1),
98 fEtMinJet(0.),
99 fEtMaxJet(1.e4),
100 fEtaMinJet(-20.),
101 fEtaMaxJet(20.),
102 fPhiMinJet(0.),
103 fPhiMaxJet(2.* TMath::Pi()),
104 fJetReconstruction(kCell),
105 fEtaMinGamma(-20.),
106 fEtaMaxGamma(20.),
107 fPhiMinGamma(0.),
108 fPhiMaxGamma(2. * TMath::Pi()),
109 fPycellEtaMax(2.),
110 fPycellNEta(274),
111 fPycellNPhi(432),
112 fPycellThreshold(0.),
113 fPycellEtSeed(4.),
114 fPycellMinEtJet(10.),
115 fPycellMaxRadius(1.),
116 fStackFillOpt(kFlavorSelection),
117 fFeedDownOpt(kTRUE),
118 fFragmentation(kTRUE),
119 fSetNuclei(kFALSE),
120 fNewMIS(kFALSE),
121 fHFoff(kFALSE),
20e47f08 122 fNucPdf(0),
e8a8adcd 123 fTriggerParticle(0),
124 fTriggerEta(0.9),
2591bd0e 125 fTriggerMinPt(-1),
126 fTriggerMaxPt(1000),
700b9416 127 fTriggerMultiplicity(0),
128 fTriggerMultiplicityEta(0),
38112f3f 129 fTriggerMultiplicityPtMin(0),
e8a8adcd 130 fCountMode(kCountAll),
131 fHeader(0),
132 fRL(0),
777e69b0 133 fkFileName(0),
9fd8e520 134 fFragPhotonInCalo(kFALSE),
ec2c406e 135 fPi0InCalo(kFALSE) ,
90a236ce 136 fPhotonInCalo(kFALSE),
9dfe63b3 137 fEleInEMCAL(kFALSE),
9fd8e520 138 fCheckEMCAL(kFALSE),
139 fCheckPHOS(kFALSE),
90a236ce 140 fCheckPHOSeta(kFALSE),
9fd8e520 141 fFragPhotonOrPi0MinPt(0),
90a236ce 142 fPhotonMinPt(0),
9dfe63b3 143 fElectronMinPt(0),
9fd8e520 144 fPHOSMinPhi(219.),
145 fPHOSMaxPhi(321.),
146 fPHOSEta(0.13),
147 fEMCALMinPhi(79.),
148 fEMCALMaxPhi(191.),
800be8b7 149 fEMCALEta(0.71),
150 fkTuneForDiff(0),
151 fProcDiff(0)
8d2cd130 152{
153// Default Constructor
e7c989e4 154 fEnergyCMS = 5500.;
7cdba479 155 if (!AliPythiaRndm::GetPythiaRandom())
e8a8adcd 156 AliPythiaRndm::SetPythiaRandom(GetRandom());
8d2cd130 157}
158
159AliGenPythia::AliGenPythia(Int_t npart)
e8a8adcd 160 :AliGenMC(npart),
161 fProcess(kPyCharm),
efe3b1cd 162 fItune(-1),
e8a8adcd 163 fStrucFunc(kCTEQ5L),
e8a8adcd 164 fKineBias(0.),
165 fTrials(0),
166 fTrialsRun(0),
167 fQ(0.),
168 fX1(0.),
169 fX2(0.),
170 fEventTime(0.),
171 fInteractionRate(0.),
172 fTimeWindow(0.),
173 fCurSubEvent(0),
174 fEventsTime(0),
175 fNev(0),
176 fFlavorSelect(0),
177 fXsection(0.),
178 fPythia(0),
179 fPtHardMin(0.),
180 fPtHardMax(1.e4),
181 fYHardMin(-1.e10),
182 fYHardMax(1.e10),
183 fGinit(kTRUE),
184 fGfinal(kTRUE),
185 fHadronisation(kTRUE),
03358a32 186 fPatchOmegaDalitz(0),
e8a8adcd 187 fNpartons(0),
188 fReadFromFile(kFALSE),
189 fQuench(kFALSE),
cd07c39b 190 fQhat(0.),
191 fLength(0.),
66b8652c 192 fpyquenT(1.),
193 fpyquenTau(0.1),
194 fpyquenNf(0),
195 fpyquenEloss(0),
196 fpyquenAngle(0),
e6fe9b82 197 fImpact(0.),
e8a8adcd 198 fPtKick(1.),
199 fFullEvent(kTRUE),
200 fDecayer(new AliDecayerPythia()),
201 fDebugEventFirst(-1),
202 fDebugEventLast(-1),
203 fEtMinJet(0.),
204 fEtMaxJet(1.e4),
205 fEtaMinJet(-20.),
206 fEtaMaxJet(20.),
207 fPhiMinJet(0.),
208 fPhiMaxJet(2.* TMath::Pi()),
209 fJetReconstruction(kCell),
210 fEtaMinGamma(-20.),
211 fEtaMaxGamma(20.),
212 fPhiMinGamma(0.),
213 fPhiMaxGamma(2. * TMath::Pi()),
214 fPycellEtaMax(2.),
215 fPycellNEta(274),
216 fPycellNPhi(432),
217 fPycellThreshold(0.),
218 fPycellEtSeed(4.),
219 fPycellMinEtJet(10.),
220 fPycellMaxRadius(1.),
221 fStackFillOpt(kFlavorSelection),
222 fFeedDownOpt(kTRUE),
223 fFragmentation(kTRUE),
224 fSetNuclei(kFALSE),
225 fNewMIS(kFALSE),
226 fHFoff(kFALSE),
20e47f08 227 fNucPdf(0),
e8a8adcd 228 fTriggerParticle(0),
2591bd0e 229 fTriggerEta(0.9),
230 fTriggerMinPt(-1),
231 fTriggerMaxPt(1000),
700b9416 232 fTriggerMultiplicity(0),
233 fTriggerMultiplicityEta(0),
38112f3f 234 fTriggerMultiplicityPtMin(0),
e8a8adcd 235 fCountMode(kCountAll),
236 fHeader(0),
237 fRL(0),
777e69b0 238 fkFileName(0),
9fd8e520 239 fFragPhotonInCalo(kFALSE),
ec2c406e 240 fPi0InCalo(kFALSE) ,
90a236ce 241 fPhotonInCalo(kFALSE),
9dfe63b3 242 fEleInEMCAL(kFALSE),
9fd8e520 243 fCheckEMCAL(kFALSE),
244 fCheckPHOS(kFALSE),
90a236ce 245 fCheckPHOSeta(kFALSE),
9fd8e520 246 fFragPhotonOrPi0MinPt(0),
90a236ce 247 fPhotonMinPt(0),
9dfe63b3 248 fElectronMinPt(0),
9fd8e520 249 fPHOSMinPhi(219.),
250 fPHOSMaxPhi(321.),
251 fPHOSEta(0.13),
252 fEMCALMinPhi(79.),
253 fEMCALMaxPhi(191.),
800be8b7 254 fEMCALEta(0.71),
255 fkTuneForDiff(0),
256 fProcDiff(0)
8d2cd130 257{
258// default charm production at 5. 5 TeV
259// semimuonic decay
260// structure function GRVHO
261//
e7c989e4 262 fEnergyCMS = 5500.;
8d2cd130 263 fName = "Pythia";
264 fTitle= "Particle Generator using PYTHIA";
8d2cd130 265 SetForceDecay();
8d2cd130 266 // Set random number generator
7cdba479 267 if (!AliPythiaRndm::GetPythiaRandom())
268 AliPythiaRndm::SetPythiaRandom(GetRandom());
76d6ba9a 269 }
8d2cd130 270
8d2cd130 271AliGenPythia::~AliGenPythia()
272{
273// Destructor
9d7108a7 274 if(fEventsTime) delete fEventsTime;
275}
276
277void AliGenPythia::SetInteractionRate(Float_t rate,Float_t timewindow)
278{
279// Generate pileup using user specified rate
280 fInteractionRate = rate;
281 fTimeWindow = timewindow;
282 GeneratePileup();
283}
284
285void AliGenPythia::GeneratePileup()
286{
287// Generate sub events time for pileup
288 fEventsTime = 0;
289 if(fInteractionRate == 0.) {
290 Warning("GeneratePileup","Zero interaction specified. Skipping pileup generation.\n");
291 return;
292 }
293
294 Int_t npart = NumberParticles();
295 if(npart < 0) {
296 Warning("GeneratePileup","Negative number of particles. Skipping pileup generation.\n");
297 return;
298 }
299
300 if(fEventsTime) delete fEventsTime;
301 fEventsTime = new TArrayF(npart);
302 TArrayF &array = *fEventsTime;
303 for(Int_t ipart = 0; ipart < npart; ipart++)
304 array[ipart] = 0.;
305
306 Float_t eventtime = 0.;
307 while(1)
308 {
309 eventtime += (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
310 if(eventtime > fTimeWindow) break;
311 array.Set(array.GetSize()+1);
312 array[array.GetSize()-1] = eventtime;
313 }
314
315 eventtime = 0.;
316 while(1)
317 {
318 eventtime -= (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
319 if(TMath::Abs(eventtime) > fTimeWindow) break;
320 array.Set(array.GetSize()+1);
321 array[array.GetSize()-1] = eventtime;
322 }
323
324 SetNumberParticles(fEventsTime->GetSize());
8d2cd130 325}
326
592f8307 327void AliGenPythia::SetPycellParameters(Float_t etamax, Int_t neta, Int_t nphi,
328 Float_t thresh, Float_t etseed, Float_t minet, Float_t r)
329{
330// Set pycell parameters
331 fPycellEtaMax = etamax;
332 fPycellNEta = neta;
333 fPycellNPhi = nphi;
334 fPycellThreshold = thresh;
335 fPycellEtSeed = etseed;
336 fPycellMinEtJet = minet;
337 fPycellMaxRadius = r;
338}
339
340
341
8d2cd130 342void AliGenPythia::SetEventListRange(Int_t eventFirst, Int_t eventLast)
343{
344 // Set a range of event numbers, for which a table
345 // of generated particle will be printed
346 fDebugEventFirst = eventFirst;
347 fDebugEventLast = eventLast;
348 if (fDebugEventLast==-1) fDebugEventLast=fDebugEventFirst;
349}
350
351void AliGenPythia::Init()
352{
353// Initialisation
354
355 SetMC(AliPythia::Instance());
b88f5cea 356 fPythia=(AliPythia*) fMCEvGen;
e2bddf81 357
8d2cd130 358//
359 fParentWeight=1./Float_t(fNpart);
360//
8d2cd130 361
362
363 fPythia->SetCKIN(3,fPtHardMin);
364 fPythia->SetCKIN(4,fPtHardMax);
365 fPythia->SetCKIN(7,fYHardMin);
366 fPythia->SetCKIN(8,fYHardMax);
367
20e47f08 368 if (fAProjectile > 0 && fATarget > 0) fPythia->SetNuclei(fAProjectile, fATarget, fNucPdf);
8d2cd130 369 // Fragmentation?
370 if (fFragmentation) {
371 fPythia->SetMSTP(111,1);
372 } else {
373 fPythia->SetMSTP(111,0);
374 }
375
376
377// initial state radiation
378 fPythia->SetMSTP(61,fGinit);
379// final state radiation
380 fPythia->SetMSTP(71,fGfinal);
381// pt - kick
382 if (fPtKick > 0.) {
383 fPythia->SetMSTP(91,1);
688950ef 384 fPythia->SetPARP(91,fPtKick);
385 fPythia->SetPARP(93, 4. * fPtKick);
8d2cd130 386 } else {
387 fPythia->SetMSTP(91,0);
388 }
389
5fa4b20b 390
391 if (fReadFromFile) {
777e69b0 392 fRL = AliRunLoader::Open(fkFileName, "Partons");
5fa4b20b 393 fRL->LoadKinematics();
394 fRL->LoadHeader();
395 } else {
396 fRL = 0x0;
397 }
fdea4387 398 //
efe3b1cd 399 fPythia->ProcInit(fProcess,fEnergyCMS,fStrucFunc, fItune);
fdea4387 400 // Forward Paramters to the AliPythia object
401 fDecayer->SetForceDecay(fForceDecay);
beac474c 402// Switch off Heavy Flavors on request
403 if (fHFoff) {
51387949 404 // Maximum number of quark flavours used in pdf
beac474c 405 fPythia->SetMSTP(58, 3);
51387949 406 // Maximum number of flavors that can be used in showers
beac474c 407 fPythia->SetMSTJ(45, 3);
51387949 408 // Switch off g->QQbar splitting in decay table
409 ((AliDecayerPythia*) fDecayer)->HeavyFlavourOff();
beac474c 410 }
fdea4387 411
51387949 412 fDecayer->Init();
413
8d2cd130 414
415// Parent and Children Selection
416 switch (fProcess)
417 {
65f2626c 418 case kPyOldUEQ2ordered:
419 case kPyOldUEQ2ordered2:
420 case kPyOldPopcorn:
421 break;
8d2cd130 422 case kPyCharm:
423 case kPyCharmUnforced:
adf4d898 424 case kPyCharmPbPbMNR:
aabc7187 425 case kPyCharmpPbMNR:
e0e89f40 426 case kPyCharmppMNR:
427 case kPyCharmppMNRwmi:
8d2cd130 428 fParentSelect[0] = 411;
429 fParentSelect[1] = 421;
430 fParentSelect[2] = 431;
431 fParentSelect[3] = 4122;
9ccc3d0e 432 fParentSelect[4] = 4232;
433 fParentSelect[5] = 4132;
434 fParentSelect[6] = 4332;
8d2cd130 435 fFlavorSelect = 4;
436 break;
adf4d898 437 case kPyD0PbPbMNR:
438 case kPyD0pPbMNR:
439 case kPyD0ppMNR:
8d2cd130 440 fParentSelect[0] = 421;
441 fFlavorSelect = 4;
442 break;
90d7b703 443 case kPyDPlusPbPbMNR:
444 case kPyDPluspPbMNR:
445 case kPyDPlusppMNR:
446 fParentSelect[0] = 411;
447 fFlavorSelect = 4;
448 break;
e0e89f40 449 case kPyDPlusStrangePbPbMNR:
450 case kPyDPlusStrangepPbMNR:
451 case kPyDPlusStrangeppMNR:
452 fParentSelect[0] = 431;
453 fFlavorSelect = 4;
454 break;
68504d42 455 case kPyLambdacppMNR:
456 fParentSelect[0] = 4122;
457 fFlavorSelect = 4;
458 break;
8d2cd130 459 case kPyBeauty:
9dfe63b3 460 case kPyBeautyJets:
adf4d898 461 case kPyBeautyPbPbMNR:
462 case kPyBeautypPbMNR:
463 case kPyBeautyppMNR:
e0e89f40 464 case kPyBeautyppMNRwmi:
8d2cd130 465 fParentSelect[0]= 511;
466 fParentSelect[1]= 521;
467 fParentSelect[2]= 531;
468 fParentSelect[3]= 5122;
469 fParentSelect[4]= 5132;
470 fParentSelect[5]= 5232;
471 fParentSelect[6]= 5332;
472 fFlavorSelect = 5;
473 break;
474 case kPyBeautyUnforced:
475 fParentSelect[0] = 511;
476 fParentSelect[1] = 521;
477 fParentSelect[2] = 531;
478 fParentSelect[3] = 5122;
479 fParentSelect[4] = 5132;
480 fParentSelect[5] = 5232;
481 fParentSelect[6] = 5332;
482 fFlavorSelect = 5;
483 break;
484 case kPyJpsiChi:
485 case kPyJpsi:
486 fParentSelect[0] = 443;
487 break;
f529e69b 488 case kPyMbDefault:
0bd3d7c5 489 case kPyMbAtlasTuneMC09:
8d2cd130 490 case kPyMb:
04081a91 491 case kPyMbWithDirectPhoton:
8d2cd130 492 case kPyMbNonDiffr:
d7de4a67 493 case kPyMbMSEL1:
8d2cd130 494 case kPyJets:
495 case kPyDirectGamma:
e33acb67 496 case kPyLhwgMb:
8d2cd130 497 break;
589380c6 498 case kPyW:
0f6ee828 499 case kPyZ:
589380c6 500 break;
8d2cd130 501 }
502//
592f8307 503//
504// JetFinder for Trigger
505//
506// Configure detector (EMCAL like)
507//
d7de4a67 508 fPythia->SetPARU(51, fPycellEtaMax);
509 fPythia->SetMSTU(51, fPycellNEta);
510 fPythia->SetMSTU(52, fPycellNPhi);
592f8307 511//
512// Configure Jet Finder
513//
d7de4a67 514 fPythia->SetPARU(58, fPycellThreshold);
515 fPythia->SetPARU(52, fPycellEtSeed);
516 fPythia->SetPARU(53, fPycellMinEtJet);
517 fPythia->SetPARU(54, fPycellMaxRadius);
518 fPythia->SetMSTU(54, 2);
592f8307 519//
8d2cd130 520// This counts the total number of calls to Pyevnt() per run.
521 fTrialsRun = 0;
522 fQ = 0.;
523 fX1 = 0.;
524 fX2 = 0.;
525 fNev = 0 ;
526//
1d568bc2 527//
528//
8d2cd130 529 AliGenMC::Init();
1d568bc2 530//
531//
532//
533 if (fSetNuclei) {
534 fDyBoost = 0;
535 Warning("Init","SetNuclei used. Use SetProjectile + SetTarget instead. fDyBoost has been reset to 0\n");
536 }
d7de4a67 537
cd07c39b 538 fPythia->SetPARJ(200, 0.0);
539 fPythia->SetPARJ(199, 0.0);
540 fPythia->SetPARJ(198, 0.0);
541 fPythia->SetPARJ(197, 0.0);
542
543 if (fQuench == 1) {
5fa4b20b 544 fPythia->InitQuenching(0., 0.1, 0.6e6, 0);
32d6ef7d 545 }
3a709cfa 546
66b8652c 547 if(fQuench ==2){fPythia->SetPyquenParameters(fpyquenT,fpyquenTau,fpyquenNf,fpyquenEloss,fpyquenAngle);}
548
b976f7d8 549 if (fQuench == 3) {
550 // Nestor's change of the splittings
551 fPythia->SetPARJ(200, 0.8);
552 fPythia->SetMSTJ(41, 1); // QCD radiation only
553 fPythia->SetMSTJ(42, 2); // angular ordering
554 fPythia->SetMSTJ(44, 2); // option to run alpha_s
555 fPythia->SetMSTJ(47, 0); // No correction back to hard scattering element
556 fPythia->SetMSTJ(50, 0); // No coherence in first branching
557 fPythia->SetPARJ(82, 1.); // Cut off for parton showers
cd07c39b 558 } else if (fQuench == 4) {
559 // Armesto-Cunqueiro-Salgado change of the splittings.
560 AliFastGlauber* glauber = AliFastGlauber::Instance();
561 glauber->Init(2);
562 //read and store transverse almonds corresponding to differnt
563 //impact parameters.
cd07c39b 564 glauber->SetCentralityClass(0.,0.1);
565 fPythia->SetPARJ(200, 1.);
566 fPythia->SetPARJ(198, fQhat);
567 fPythia->SetPARJ(199, fLength);
cd07c39b 568 fPythia->SetMSTJ(42, 2); // angular ordering
569 fPythia->SetMSTJ(44, 2); // option to run alpha_s
cd07c39b 570 fPythia->SetPARJ(82, 1.); // Cut off for parton showers
b976f7d8 571 }
8d2cd130 572}
573
574void AliGenPythia::Generate()
575{
576// Generate one event
19ef8cf0 577 if (!fPythia) fPythia=(AliPythia*) fMCEvGen;
8d2cd130 578 fDecayer->ForceDecay();
579
13cca24a 580 Double_t polar[3] = {0,0,0};
581 Double_t origin[3] = {0,0,0};
582 Double_t p[4];
8d2cd130 583// converts from mm/c to s
584 const Float_t kconv=0.001/2.999792458e8;
585//
586 Int_t nt=0;
587 Int_t jev=0;
588 Int_t j, kf;
589 fTrials=0;
f913ec4f 590 fEventTime = 0.;
591
2590ccf9 592
8d2cd130 593
594 // Set collision vertex position
2590ccf9 595 if (fVertexSmear == kPerEvent) Vertex();
596
8d2cd130 597// event loop
598 while(1)
599 {
32d6ef7d 600//
5fa4b20b 601// Produce event
32d6ef7d 602//
32d6ef7d 603//
5fa4b20b 604// Switch hadronisation off
605//
606 fPythia->SetMSTJ(1, 0);
cd07c39b 607
608 if (fQuench ==4){
609 Double_t bimp;
610 // Quenching comes through medium-modified splitting functions.
611 AliFastGlauber::Instance()->GetRandomBHard(bimp);
e6fe9b82 612 fPythia->SetPARJ(197, bimp);
613 fImpact = bimp;
6c43eccb 614 fPythia->Qpygin0();
cd07c39b 615 }
32d6ef7d 616//
5fa4b20b 617// Either produce new event or read partons from file
618//
619 if (!fReadFromFile) {
beac474c 620 if (!fNewMIS) {
621 fPythia->Pyevnt();
622 } else {
623 fPythia->Pyevnw();
624 }
5fa4b20b 625 fNpartons = fPythia->GetN();
626 } else {
33c3c91a 627 printf("Loading Event %d\n",AliRunLoader::Instance()->GetEventNumber());
628 fRL->GetEvent(AliRunLoader::Instance()->GetEventNumber());
5fa4b20b 629 fPythia->SetN(0);
630 LoadEvent(fRL->Stack(), 0 , 1);
631 fPythia->Pyedit(21);
632 }
633
32d6ef7d 634//
635// Run quenching routine
636//
5fa4b20b 637 if (fQuench == 1) {
638 fPythia->Quench();
639 } else if (fQuench == 2){
640 fPythia->Pyquen(208., 0, 0.);
b976f7d8 641 } else if (fQuench == 3) {
642 // Quenching is via multiplicative correction of the splittings
5fa4b20b 643 }
b976f7d8 644
32d6ef7d 645//
5fa4b20b 646// Switch hadronisation on
32d6ef7d 647//
20e47f08 648 if (fHadronisation) {
649 fPythia->SetMSTJ(1, 1);
5fa4b20b 650//
651// .. and perform hadronisation
aea21c57 652// printf("Calling hadronisation %d\n", fPythia->GetN());
03358a32 653
654 if (fPatchOmegaDalitz) {
655 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 0);
656 fPythia->Pyexec();
657 fPythia->DalitzDecays();
658 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 1);
659 }
660 fPythia->Pyexec();
20e47f08 661 }
8d2cd130 662 fTrials++;
8507138f 663 fPythia->ImportParticles(&fParticles,"All");
03358a32 664
df275cfa 665 if (TMath::Abs(fDyBoost) > 1.e-4) Boost();
e1cf8975 666 if(TMath::Abs(fXingAngleY) > 1.e-10) BeamCrossAngle();
f64640b5 667
8d2cd130 668//
669//
670//
671 Int_t i;
672
dbd64db6 673 fNprimaries = 0;
8507138f 674 Int_t np = fParticles.GetEntriesFast();
5fa4b20b 675
7c21f297 676 if (np == 0) continue;
8d2cd130 677//
2590ccf9 678
8d2cd130 679//
680 Int_t* pParent = new Int_t[np];
681 Int_t* pSelected = new Int_t[np];
682 Int_t* trackIt = new Int_t[np];
5fa4b20b 683 for (i = 0; i < np; i++) {
8d2cd130 684 pParent[i] = -1;
685 pSelected[i] = 0;
686 trackIt[i] = 0;
687 }
688
689 Int_t nc = 0; // Total n. of selected particles
690 Int_t nParents = 0; // Selected parents
691 Int_t nTkbles = 0; // Trackable particles
f529e69b 692 if (fProcess != kPyMbDefault &&
693 fProcess != kPyMb &&
6d2ec66d 694 fProcess != kPyMbAtlasTuneMC09 &&
04081a91 695 fProcess != kPyMbWithDirectPhoton &&
f529e69b 696 fProcess != kPyJets &&
8d2cd130 697 fProcess != kPyDirectGamma &&
589380c6 698 fProcess != kPyMbNonDiffr &&
d7de4a67 699 fProcess != kPyMbMSEL1 &&
f529e69b 700 fProcess != kPyW &&
701 fProcess != kPyZ &&
702 fProcess != kPyCharmppMNRwmi &&
9dfe63b3 703 fProcess != kPyBeautyppMNRwmi &&
704 fProcess != kPyBeautyJets) {
8d2cd130 705
5fa4b20b 706 for (i = 0; i < np; i++) {
8507138f 707 TParticle* iparticle = (TParticle *) fParticles.At(i);
8d2cd130 708 Int_t ks = iparticle->GetStatusCode();
709 kf = CheckPDGCode(iparticle->GetPdgCode());
710// No initial state partons
711 if (ks==21) continue;
712//
713// Heavy Flavor Selection
714//
715 // quark ?
716 kf = TMath::Abs(kf);
717 Int_t kfl = kf;
9ff6c04c 718 // Resonance
f913ec4f 719
9ff6c04c 720 if (kfl > 100000) kfl %= 100000;
183a5ca9 721 if (kfl > 10000) kfl %= 10000;
8d2cd130 722 // meson ?
723 if (kfl > 10) kfl/=100;
724 // baryon
725 if (kfl > 10) kfl/=10;
8d2cd130 726 Int_t ipa = iparticle->GetFirstMother()-1;
727 Int_t kfMo = 0;
f913ec4f 728//
729// Establish mother daughter relation between heavy quarks and mesons
730//
731 if (kf >= fFlavorSelect && kf <= 6) {
732 Int_t idau = iparticle->GetFirstDaughter() - 1;
733 if (idau > -1) {
8507138f 734 TParticle* daughter = (TParticle *) fParticles.At(idau);
f913ec4f 735 Int_t pdgD = daughter->GetPdgCode();
736 if (pdgD == 91 || pdgD == 92) {
737 Int_t jmin = daughter->GetFirstDaughter() - 1;
738 Int_t jmax = daughter->GetLastDaughter() - 1;
2ab330c9 739 for (Int_t jp = jmin; jp <= jmax; jp++)
740 ((TParticle *) fParticles.At(jp))->SetFirstMother(i+1);
f913ec4f 741 } // is string or cluster
742 } // has daughter
743 } // heavy quark
8d2cd130 744
f913ec4f 745
8d2cd130 746 if (ipa > -1) {
8507138f 747 TParticle * mother = (TParticle *) fParticles.At(ipa);
8d2cd130 748 kfMo = TMath::Abs(mother->GetPdgCode());
749 }
f913ec4f 750
8d2cd130 751 // What to keep in Stack?
752 Bool_t flavorOK = kFALSE;
753 Bool_t selectOK = kFALSE;
754 if (fFeedDownOpt) {
32d6ef7d 755 if (kfl >= fFlavorSelect) flavorOK = kTRUE;
8d2cd130 756 } else {
32d6ef7d 757 if (kfl > fFlavorSelect) {
758 nc = -1;
759 break;
760 }
761 if (kfl == fFlavorSelect) flavorOK = kTRUE;
8d2cd130 762 }
763 switch (fStackFillOpt) {
06956108 764 case kHeavyFlavor:
8d2cd130 765 case kFlavorSelection:
32d6ef7d 766 selectOK = kTRUE;
767 break;
8d2cd130 768 case kParentSelection:
32d6ef7d 769 if (ParentSelected(kf) || kf <= 10) selectOK = kTRUE;
770 break;
8d2cd130 771 }
772 if (flavorOK && selectOK) {
773//
774// Heavy flavor hadron or quark
775//
776// Kinematic seletion on final state heavy flavor mesons
777 if (ParentSelected(kf) && !KinematicSelection(iparticle, 0))
778 {
9ff6c04c 779 continue;
8d2cd130 780 }
781 pSelected[i] = 1;
782 if (ParentSelected(kf)) ++nParents; // Update parent count
783// printf("\n particle (HF) %d %d %d", i, pSelected[i], kf);
784 } else {
785// Kinematic seletion on decay products
786 if (fCutOnChild && ParentSelected(kfMo) && ChildSelected(kf)
9ff6c04c 787 && !KinematicSelection(iparticle, 1))
8d2cd130 788 {
9ff6c04c 789 continue;
8d2cd130 790 }
791//
792// Decay products
793// Select if mother was selected and is not tracked
794
795 if (pSelected[ipa] &&
796 !trackIt[ipa] && // mother will be tracked ?
797 kfMo != 5 && // mother is b-quark, don't store fragments
798 kfMo != 4 && // mother is c-quark, don't store fragments
799 kf != 92) // don't store string
800 {
801//
802// Semi-stable or de-selected: diselect decay products:
803//
804//
805 if (pSelected[i] == -1 || fDecayer->GetLifetime(kf) > fMaxLifeTime)
806 {
807 Int_t ipF = iparticle->GetFirstDaughter();
808 Int_t ipL = iparticle->GetLastDaughter();
809 if (ipF > 0) for (j = ipF-1; j < ipL; j++) pSelected[j] = -1;
810 }
811// printf("\n particle (decay) %d %d %d", i, pSelected[i], kf);
812 pSelected[i] = (pSelected[i] == -1) ? 0 : 1;
813 }
814 }
815 if (pSelected[i] == -1) pSelected[i] = 0;
816 if (!pSelected[i]) continue;
817 // Count quarks only if you did not include fragmentation
818 if (fFragmentation && kf <= 10) continue;
9ff6c04c 819
8d2cd130 820 nc++;
821// Decision on tracking
822 trackIt[i] = 0;
823//
824// Track final state particle
825 if (ks == 1) trackIt[i] = 1;
826// Track semi-stable particles
d25cfd65 827 if ((ks == 1) || (fDecayer->GetLifetime(kf) > fMaxLifeTime)) trackIt[i] = 1;
8d2cd130 828// Track particles selected by process if undecayed.
829 if (fForceDecay == kNoDecay) {
830 if (ParentSelected(kf)) trackIt[i] = 1;
831 } else {
832 if (ParentSelected(kf)) trackIt[i] = 0;
833 }
834 if (trackIt[i] == 1) ++nTkbles; // Update trackable counter
835//
836//
837
838 } // particle selection loop
839 if (nc > 0) {
840 for (i = 0; i<np; i++) {
841 if (!pSelected[i]) continue;
8507138f 842 TParticle * iparticle = (TParticle *) fParticles.At(i);
8d2cd130 843 kf = CheckPDGCode(iparticle->GetPdgCode());
844 Int_t ks = iparticle->GetStatusCode();
845 p[0] = iparticle->Px();
846 p[1] = iparticle->Py();
847 p[2] = iparticle->Pz();
a920faf9 848 p[3] = iparticle->Energy();
849
2590ccf9 850 origin[0] = fVertex[0]+iparticle->Vx()/10; // [cm]
851 origin[1] = fVertex[1]+iparticle->Vy()/10; // [cm]
852 origin[2] = fVertex[2]+iparticle->Vz()/10; // [cm]
853
21391258 854 Float_t tof = fTime + kconv*iparticle->T();
8d2cd130 855 Int_t ipa = iparticle->GetFirstMother()-1;
856 Int_t iparent = (ipa > -1) ? pParent[ipa] : -1;
a920faf9 857
858 PushTrack(fTrackIt*trackIt[i], iparent, kf,
859 p[0], p[1], p[2], p[3],
860 origin[0], origin[1], origin[2], tof,
861 polar[0], polar[1], polar[2],
862 kPPrimary, nt, 1., ks);
8d2cd130 863 pParent[i] = nt;
dbd64db6 864 KeepTrack(nt);
865 fNprimaries++;
642f15cf 866 } // PushTrack loop
8d2cd130 867 }
868 } else {
869 nc = GenerateMB();
870 } // mb ?
f913ec4f 871
872 GetSubEventTime();
8d2cd130 873
234f6d32 874 delete[] pParent;
875 delete[] pSelected;
876 delete[] trackIt;
8d2cd130 877
878 if (nc > 0) {
879 switch (fCountMode) {
880 case kCountAll:
881 // printf(" Count all \n");
882 jev += nc;
883 break;
884 case kCountParents:
885 // printf(" Count parents \n");
886 jev += nParents;
887 break;
888 case kCountTrackables:
889 // printf(" Count trackable \n");
890 jev += nTkbles;
891 break;
892 }
893 if (jev >= fNpart || fNpart == -1) {
894 fKineBias=Float_t(fNpart)/Float_t(fTrials);
e0e89f40 895
8d2cd130 896 fQ += fPythia->GetVINT(51);
897 fX1 += fPythia->GetVINT(41);
898 fX2 += fPythia->GetVINT(42);
899 fTrialsRun += fTrials;
900 fNev++;
901 MakeHeader();
902 break;
903 }
904 }
905 } // event loop
906 SetHighWaterMark(nt);
907// adjust weight due to kinematic selection
b88f5cea 908// AdjustWeights();
8d2cd130 909// get cross-section
910 fXsection=fPythia->GetPARI(1);
911}
912
913Int_t AliGenPythia::GenerateMB()
914{
915//
916// Min Bias selection and other global selections
917//
918 Int_t i, kf, nt, iparent;
919 Int_t nc = 0;
13cca24a 920 Double_t p[4];
921 Double_t polar[3] = {0,0,0};
922 Double_t origin[3] = {0,0,0};
8d2cd130 923// converts from mm/c to s
924 const Float_t kconv=0.001/2.999792458e8;
925
e0e89f40 926
927
8507138f 928 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
aea21c57 929
5fa4b20b 930
e0e89f40 931
8d2cd130 932 Int_t* pParent = new Int_t[np];
933 for (i=0; i< np; i++) pParent[i] = -1;
2f405d65 934 if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi) {
8507138f 935 TParticle* jet1 = (TParticle *) fParticles.At(6);
936 TParticle* jet2 = (TParticle *) fParticles.At(7);
234f6d32 937 if (!CheckTrigger(jet1, jet2)) {
938 delete [] pParent;
939 return 0;
940 }
8d2cd130 941 }
e0e89f40 942
9fd8e520 943 // Select jets with fragmentation photon or pi0 going to PHOS or EMCAL
944 if (fProcess == kPyJets && (fFragPhotonInCalo || fPi0InCalo) ) {
ec2c406e 945
946 Bool_t ok = kFALSE;
947
948 Int_t pdg = 0;
9fd8e520 949 if (fFragPhotonInCalo) pdg = 22 ; // Photon
6d2ec66d 950 else if (fPi0InCalo) pdg = 111 ; // Pi0
ec2c406e 951
952 for (i=0; i< np; i++) {
8507138f 953 TParticle* iparticle = (TParticle *) fParticles.At(i);
ec2c406e 954 if(iparticle->GetStatusCode()==1 && iparticle->GetPdgCode()==pdg &&
9fd8e520 955 iparticle->Pt() > fFragPhotonOrPi0MinPt){
562cbbcf 956 Int_t imother = iparticle->GetFirstMother() - 1;
8507138f 957 TParticle* pmother = (TParticle *) fParticles.At(imother);
9fd8e520 958 if(pdg == 111 ||
82e0bdff 959 (pdg == 22 && pmother->GetStatusCode() != 11)) //No photon from hadron decay
9fd8e520 960 {
961 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
82e0bdff 962 Float_t eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
9fd8e520 963 if((fCheckEMCAL && IsInEMCAL(phi,eta)) ||
964 (fCheckPHOS && IsInPHOS(phi,eta)) )
965 ok =kTRUE;
966 }
ec2c406e 967 }
968 }
1ee02229 969 if(!ok) {
970 delete[] pParent;
971 return 0;
972 }
ec2c406e 973 }
9dfe63b3 974
975 // Select beauty jets with electron in EMCAL
976 if (fProcess == kPyBeautyJets && fEleInEMCAL) {
977
978 Bool_t ok = kFALSE;
979
980 Int_t pdg = 11; //electron
981
70574ff8 982 Float_t pt = 0.;
983 Float_t eta = 0.;
984 Float_t phi = 0.;
9dfe63b3 985 for (i=0; i< np; i++) {
986 TParticle* iparticle = (TParticle *) fParticles.At(i);
987 if(iparticle->GetStatusCode()==1 && TMath::Abs(iparticle->GetPdgCode())==pdg &&
988 iparticle->Pt() > fElectronMinPt){
989 pt = iparticle->Pt();
990 phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
991 eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
992 if(IsInEMCAL(phi,eta))
993 ok =kTRUE;
994 }
995 }
92847124 996 if(!ok) {
997 delete[] pParent;
9dfe63b3 998 return 0;
92847124 999 }
1000
9dfe63b3 1001 AliDebug(5,Form("Found an electron jet (pt,eta,phi) = (%f,%f,%f)",pt,eta,phi));
1002 }
800be8b7 1003 // Check for diffraction
1004 if(fkTuneForDiff) {
c5dfa3e4 1005 if(fItune==320 && ( (TMath::Abs(fEnergyCMS - 900) < 1) || (TMath::Abs(fEnergyCMS - 2760) < 1) || (TMath::Abs(fEnergyCMS - 7000) < 1)) ) {
800be8b7 1006 if(!CheckDiffraction()) {
1007 delete [] pParent;
1008 return 0;
1009 }
1010 }
1011 }
1012
700b9416 1013 // Check for minimum multiplicity
1014 if (fTriggerMultiplicity > 0) {
1015 Int_t multiplicity = 0;
1016 for (i = 0; i < np; i++) {
8507138f 1017 TParticle * iparticle = (TParticle *) fParticles.At(i);
700b9416 1018
1019 Int_t statusCode = iparticle->GetStatusCode();
1020
1021 // Initial state particle
e296848e 1022 if (statusCode != 1)
700b9416 1023 continue;
38112f3f 1024 // eta cut
700b9416 1025 if (fTriggerMultiplicityEta > 0 && TMath::Abs(iparticle->Eta()) > fTriggerMultiplicityEta)
1026 continue;
38112f3f 1027 // pt cut
1028 if (iparticle->Pt() < fTriggerMultiplicityPtMin)
1029 continue;
1030
700b9416 1031 TParticlePDG* pdgPart = iparticle->GetPDG();
1032 if (pdgPart && pdgPart->Charge() == 0)
1033 continue;
1034
1035 ++multiplicity;
1036 }
1037
1038 if (multiplicity < fTriggerMultiplicity) {
1039 delete [] pParent;
1040 return 0;
1041 }
38112f3f 1042 Printf("Triggered on event with multiplicity of %d >= %d", multiplicity, fTriggerMultiplicity);
700b9416 1043 }
90a236ce 1044
1045 // Select events with a photon pt > min pt going to PHOS eta acceptance or exactly PHOS eta phi
1046 if ((fProcess == kPyJets || fProcess == kPyDirectGamma) && fPhotonInCalo && (fCheckPHOSeta || fCheckPHOS)){
1047
1048 Bool_t okd = kFALSE;
1049
1050 Int_t pdg = 22;
1051 Int_t iphcand = -1;
1052 for (i=0; i< np; i++) {
8507138f 1053 TParticle* iparticle = (TParticle *) fParticles.At(i);
90a236ce 1054 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
1055 Float_t eta =TMath::Abs(iparticle->Eta());//in calos etamin=-etamax
1056
1057 if(iparticle->GetStatusCode() == 1
1058 && iparticle->GetPdgCode() == pdg
1059 && iparticle->Pt() > fPhotonMinPt
04a26b0a 1060 && eta < fPHOSEta){
90a236ce 1061
1062 // first check if the photon is in PHOS phi
1063 if(IsInPHOS(phi,eta)){
1064 okd = kTRUE;
1065 break;
1066 }
1067 if(fCheckPHOSeta) iphcand = i; // candiate photon to rotate in phi
1068
1069 }
1070 }
1071
1072 if(!okd && iphcand != -1) // execute rotation in phi
1073 RotatePhi(iphcand,okd);
1074
b3305127 1075 if(!okd) {
1076 delete [] pParent;
1077 return 0;
1078 }
90a236ce 1079 }
1080
7ce1321b 1081 if (fTriggerParticle) {
1082 Bool_t triggered = kFALSE;
1083 for (i = 0; i < np; i++) {
8507138f 1084 TParticle * iparticle = (TParticle *) fParticles.At(i);
7ce1321b 1085 kf = CheckPDGCode(iparticle->GetPdgCode());
38db0ee6 1086 if (kf != fTriggerParticle) continue;
7ce1321b 1087 if (iparticle->Pt() == 0.) continue;
1088 if (TMath::Abs(iparticle->Eta()) > fTriggerEta) continue;
2591bd0e 1089 if ( iparticle->Pt() > fTriggerMaxPt || iparticle->Pt() < fTriggerMinPt ) continue;
7ce1321b 1090 triggered = kTRUE;
1091 break;
1092 }
234f6d32 1093 if (!triggered) {
1094 delete [] pParent;
1095 return 0;
1096 }
7ce1321b 1097 }
e0e89f40 1098
1099
1100 // Check if there is a ccbar or bbbar pair with at least one of the two
1101 // in fYMin < y < fYMax
2f405d65 1102
9dfe63b3 1103 if (fProcess == kPyCharmppMNRwmi || fProcess == kPyBeautyppMNRwmi || fProcess == kPyBeautyJets) {
9ccc3d0e 1104 TParticle *partCheck;
1105 TParticle *mother;
e0e89f40 1106 Bool_t theQ=kFALSE,theQbar=kFALSE,inYcut=kFALSE;
9ccc3d0e 1107 Bool_t theChild=kFALSE;
5d76923e 1108 Bool_t triggered=kFALSE;
9ccc3d0e 1109 Float_t y;
1110 Int_t pdg,mpdg,mpdgUpperFamily;
e0e89f40 1111 for(i=0; i<np; i++) {
9ccc3d0e 1112 partCheck = (TParticle*)fParticles.At(i);
1113 pdg = partCheck->GetPdgCode();
1114 if(TMath::Abs(pdg) == fFlavorSelect) { // quark
1115 if(pdg>0) { theQ=kTRUE; } else { theQbar=kTRUE; }
1116 y = 0.5*TMath::Log((partCheck->Energy()+partCheck->Pz()+1.e-13)/
1117 (partCheck->Energy()-partCheck->Pz()+1.e-13));
1118 if(y>fYMin && y<fYMax) inYcut=kTRUE;
1119 }
5d76923e 1120 if(fTriggerParticle) {
1121 if(TMath::Abs(pdg)==fTriggerParticle) triggered=kTRUE;
1122 }
9ccc3d0e 1123 if(fCutOnChild && TMath::Abs(pdg) == fPdgCodeParticleforAcceptanceCut) {
1124 Int_t mi = partCheck->GetFirstMother() - 1;
1125 if(mi<0) continue;
1126 mother = (TParticle*)fParticles.At(mi);
1127 mpdg=TMath::Abs(mother->GetPdgCode());
75fde694 1128 mpdgUpperFamily=(mpdg>1000 ? mpdg+1000 : mpdg+100); // keep e from c from b
9ccc3d0e 1129 if ( ParentSelected(mpdg) ||
1130 (fFlavorSelect==5 && ParentSelected(mpdgUpperFamily))) {
1131 if (KinematicSelection(partCheck,1)) {
1132 theChild=kTRUE;
1133 }
1134 }
1135 }
e0e89f40 1136 }
9ccc3d0e 1137 if (!theQ || !theQbar || !inYcut) { // one of the c/b conditions not satisfied
234f6d32 1138 delete[] pParent;
e0e89f40 1139 return 0;
1140 }
9ccc3d0e 1141 if (fCutOnChild && !theChild) { // one of the child conditions not satisfied
1142 delete[] pParent;
1143 return 0;
1144 }
5d76923e 1145 if(fTriggerParticle && !triggered) { // particle requested is not produced
1146 delete[] pParent;
1147 return 0;
1148 }
9ccc3d0e 1149
e0e89f40 1150 }
aea21c57 1151
0f6ee828 1152 //Introducing child cuts in case kPyW, kPyZ, kPyMb, and kPyMbNonDiff
f529e69b 1153 if ( (fProcess == kPyW ||
1154 fProcess == kPyZ ||
1155 fProcess == kPyMbDefault ||
1156 fProcess == kPyMb ||
6d2ec66d 1157 fProcess == kPyMbAtlasTuneMC09 ||
04081a91 1158 fProcess == kPyMbWithDirectPhoton ||
f529e69b 1159 fProcess == kPyMbNonDiffr)
0f6ee828 1160 && (fCutOnChild == 1) ) {
1161 if ( !CheckKinematicsOnChild() ) {
234f6d32 1162 delete[] pParent;
0f6ee828 1163 return 0;
1164 }
aea21c57 1165 }
1166
1167
f913ec4f 1168 for (i = 0; i < np; i++) {
8d2cd130 1169 Int_t trackIt = 0;
8507138f 1170 TParticle * iparticle = (TParticle *) fParticles.At(i);
8d2cd130 1171 kf = CheckPDGCode(iparticle->GetPdgCode());
1172 Int_t ks = iparticle->GetStatusCode();
1173 Int_t km = iparticle->GetFirstMother();
06956108 1174 if (
1175 (((ks == 1 && kf!=0 && KinematicSelection(iparticle, 0)) || (ks !=1)) && ((fStackFillOpt != kHeavyFlavor) || IsFromHeavyFlavor(i))) ||
1176 ((fProcess == kPyJets || fProcess == kPyBeautyJets) && ks == 21 && km == 0 && i>1)
1177 )
1178 {
1179 nc++;
8d2cd130 1180 if (ks == 1) trackIt = 1;
1181 Int_t ipa = iparticle->GetFirstMother()-1;
1182
1183 iparent = (ipa > -1) ? pParent[ipa] : -1;
1184
1185//
1186// store track information
1187 p[0] = iparticle->Px();
1188 p[1] = iparticle->Py();
1189 p[2] = iparticle->Pz();
a920faf9 1190 p[3] = iparticle->Energy();
1406f599 1191
a920faf9 1192
2590ccf9 1193 origin[0] = fVertex[0]+iparticle->Vx()/10; // [cm]
1194 origin[1] = fVertex[1]+iparticle->Vy()/10; // [cm]
1195 origin[2] = fVertex[2]+iparticle->Vz()/10; // [cm]
1196
21391258 1197 Float_t tof = fTime + fEventTime + kconv * iparticle->T();
a920faf9 1198
1199 PushTrack(fTrackIt*trackIt, iparent, kf,
1200 p[0], p[1], p[2], p[3],
1201 origin[0], origin[1], origin[2], tof,
1202 polar[0], polar[1], polar[2],
1203 kPPrimary, nt, 1., ks);
dbd64db6 1204 fNprimaries++;
8d2cd130 1205 KeepTrack(nt);
1206 pParent[i] = nt;
f913ec4f 1207 SetHighWaterMark(nt);
1208
8d2cd130 1209 } // select particle
1210 } // particle loop
1211
234f6d32 1212 delete[] pParent;
e0e89f40 1213
f913ec4f 1214 return 1;
8d2cd130 1215}
1216
1217
1218void AliGenPythia::FinishRun()
1219{
1220// Print x-section summary
1221 fPythia->Pystat(1);
2779fc64 1222
1223 if (fNev > 0.) {
1224 fQ /= fNev;
1225 fX1 /= fNev;
1226 fX2 /= fNev;
1227 }
1228
8d2cd130 1229 printf("\nTotal number of Pyevnt() calls %d\n", fTrialsRun);
1230 printf("\nMean Q, x1, x2: %f %f %f\n", fQ, fX1, fX2);
8d2cd130 1231}
1232
7184e472 1233void AliGenPythia::AdjustWeights() const
8d2cd130 1234{
1235// Adjust the weights after generation of all events
1236//
e2bddf81 1237 if (gAlice) {
1238 TParticle *part;
1239 Int_t ntrack=gAlice->GetMCApp()->GetNtrack();
1240 for (Int_t i=0; i<ntrack; i++) {
1241 part= gAlice->GetMCApp()->Particle(i);
1242 part->SetWeight(part->GetWeight()*fKineBias);
1243 }
8d2cd130 1244 }
1245}
1246
20e47f08 1247void AliGenPythia::SetNuclei(Int_t a1, Int_t a2, Int_t pdfset)
8d2cd130 1248{
1249// Treat protons as inside nuclei with mass numbers a1 and a2
1d568bc2 1250
1a626d4e 1251 fAProjectile = a1;
1252 fATarget = a2;
20e47f08 1253 fNucPdf = pdfset; // 0 EKS98 1 EPS08
1d568bc2 1254 fSetNuclei = kTRUE;
8d2cd130 1255}
1256
1257
1258void AliGenPythia::MakeHeader()
1259{
7184e472 1260//
1261// Make header for the simulated event
1262//
183a5ca9 1263 if (gAlice) {
1264 if (gAlice->GetEvNumber()>=fDebugEventFirst &&
f913ec4f 1265 gAlice->GetEvNumber()<=fDebugEventLast) fPythia->Pylist(2);
183a5ca9 1266 }
1267
8d2cd130 1268// Builds the event header, to be called after each event
e5c87a3d 1269 if (fHeader) delete fHeader;
1270 fHeader = new AliGenPythiaEventHeader("Pythia");
8d2cd130 1271//
1272// Event type
800be8b7 1273 if(fProcDiff>0){
1274 // if(fProcDiff == 92 || fProcDiff == 93) printf("\n\n\n\n\n");
1275 // printf("fPythia->GetMSTI(1) = %d fProcDiff = %d\n",fPythia->GetMSTI(1), fProcDiff);
1276 ((AliGenPythiaEventHeader*) fHeader)->SetProcessType(fProcDiff);
1277 }
1278 else
e5c87a3d 1279 ((AliGenPythiaEventHeader*) fHeader)->SetProcessType(fPythia->GetMSTI(1));
8d2cd130 1280//
1281// Number of trials
e5c87a3d 1282 ((AliGenPythiaEventHeader*) fHeader)->SetTrials(fTrials);
8d2cd130 1283//
1284// Event Vertex
d25cfd65 1285 fHeader->SetPrimaryVertex(fVertex);
21391258 1286 fHeader->SetInteractionTime(fTime+fEventTime);
dbd64db6 1287//
1288// Number of primaries
1289 fHeader->SetNProduced(fNprimaries);
8d2cd130 1290//
1291// Jets that have triggered
f913ec4f 1292
9dfe63b3 1293 //Need to store jets for b-jet studies too!
2f405d65 1294 if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi)
8d2cd130 1295 {
1296 Int_t ntrig, njet;
1297 Float_t jets[4][10];
1298 GetJets(njet, ntrig, jets);
9ff6c04c 1299
8d2cd130 1300
1301 for (Int_t i = 0; i < ntrig; i++) {
e5c87a3d 1302 ((AliGenPythiaEventHeader*) fHeader)->AddJet(jets[0][i], jets[1][i], jets[2][i],
8d2cd130 1303 jets[3][i]);
1304 }
1305 }
5fa4b20b 1306//
1307// Copy relevant information from external header, if present.
1308//
1309 Float_t uqJet[4];
1310
1311 if (fRL) {
1312 AliGenPythiaEventHeader* exHeader = (AliGenPythiaEventHeader*) (fRL->GetHeader()->GenEventHeader());
1313 for (Int_t i = 0; i < exHeader->NTriggerJets(); i++)
1314 {
1315 printf("Adding Jet %d %d \n", i, exHeader->NTriggerJets());
1316
1317
1318 exHeader->TriggerJet(i, uqJet);
1319 ((AliGenPythiaEventHeader*) fHeader)->AddUQJet(uqJet[0], uqJet[1], uqJet[2], uqJet[3]);
1320 }
1321 }
1322//
1323// Store quenching parameters
1324//
1325 if (fQuench){
b6262a45 1326 Double_t z[4] = {0.};
1327 Double_t xp = 0.;
1328 Double_t yp = 0.;
1329
7c21f297 1330 if (fQuench == 1) {
1331 // Pythia::Quench()
1332 fPythia->GetQuenchingParameters(xp, yp, z);
1bab4b79 1333 } else if (fQuench == 2){
7c21f297 1334 // Pyquen
1335 Double_t r1 = PARIMP.rb1;
1336 Double_t r2 = PARIMP.rb2;
1337 Double_t b = PARIMP.b1;
1338 Double_t r = 0.5 * TMath::Sqrt(2. * (r1 * r1 + r2 * r2) - b * b);
1339 Double_t phi = PARIMP.psib1;
1340 xp = r * TMath::Cos(phi);
1341 yp = r * TMath::Sin(phi);
1342
1bab4b79 1343 } else if (fQuench == 4) {
1344 // QPythia
5831e75f 1345 Double_t xy[2];
e9719084 1346 Double_t i0i1[2];
1347 AliFastGlauber::Instance()->GetSavedXY(xy);
1348 AliFastGlauber::Instance()->GetSavedI0I1(i0i1);
5831e75f 1349 xp = xy[0];
1350 yp = xy[1];
e6fe9b82 1351 ((AliGenPythiaEventHeader*) fHeader)->SetImpactParameter(fImpact);
7c21f297 1352 }
1bab4b79 1353
7c21f297 1354 ((AliGenPythiaEventHeader*) fHeader)->SetXYJet(xp, yp);
1355 ((AliGenPythiaEventHeader*) fHeader)->SetZQuench(z);
1bab4b79 1356 }
beac474c 1357//
1358// Store pt^hard
1359 ((AliGenPythiaEventHeader*) fHeader)->SetPtHard(fPythia->GetVINT(47));
5fa4b20b 1360//
cf57b268 1361// Pass header
5fa4b20b 1362//
cf57b268 1363 AddHeader(fHeader);
4c4eac97 1364 fHeader = 0x0;
8d2cd130 1365}
cf57b268 1366
c2fc9d31 1367Bool_t AliGenPythia::CheckTrigger(const TParticle* jet1, const TParticle* jet2)
8d2cd130 1368{
1369// Check the kinematic trigger condition
1370//
1371 Double_t eta[2];
1372 eta[0] = jet1->Eta();
1373 eta[1] = jet2->Eta();
1374 Double_t phi[2];
1375 phi[0] = jet1->Phi();
1376 phi[1] = jet2->Phi();
1377 Int_t pdg[2];
1378 pdg[0] = jet1->GetPdgCode();
1379 pdg[1] = jet2->GetPdgCode();
1380 Bool_t triggered = kFALSE;
1381
2f405d65 1382 if (fProcess == kPyJets || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi) {
8d2cd130 1383 Int_t njets = 0;
1384 Int_t ntrig = 0;
1385 Float_t jets[4][10];
1386//
1387// Use Pythia clustering on parton level to determine jet axis
1388//
1389 GetJets(njets, ntrig, jets);
1390
76d6ba9a 1391 if (ntrig || fEtMinJet == 0.) triggered = kTRUE;
8d2cd130 1392//
1393 } else {
1394 Int_t ij = 0;
1395 Int_t ig = 1;
1396 if (pdg[0] == kGamma) {
1397 ij = 1;
1398 ig = 0;
1399 }
1400 //Check eta range first...
1401 if ((eta[ij] < fEtaMaxJet && eta[ij] > fEtaMinJet) &&
1402 (eta[ig] < fEtaMaxGamma && eta[ig] > fEtaMinGamma))
1403 {
1404 //Eta is okay, now check phi range
1405 if ((phi[ij] < fPhiMaxJet && phi[ij] > fPhiMinJet) &&
1406 (phi[ig] < fPhiMaxGamma && phi[ig] > fPhiMinGamma))
1407 {
1408 triggered = kTRUE;
1409 }
1410 }
1411 }
1412 return triggered;
1413}
aea21c57 1414
1415
aea21c57 1416
7184e472 1417Bool_t AliGenPythia::CheckKinematicsOnChild(){
1418//
1419//Checking Kinematics on Child (status code 1, particle code ?, kin cuts
1420//
aea21c57 1421 Bool_t checking = kFALSE;
1422 Int_t j, kcode, ks, km;
1423 Int_t nPartAcc = 0; //number of particles in the acceptance range
1424 Int_t numberOfAcceptedParticles = 1;
1425 if (fNumberOfAcceptedParticles != 0) { numberOfAcceptedParticles = fNumberOfAcceptedParticles; }
8507138f 1426 Int_t npart = fParticles.GetEntriesFast();
aea21c57 1427
0f6ee828 1428 for (j = 0; j<npart; j++) {
8507138f 1429 TParticle * jparticle = (TParticle *) fParticles.At(j);
aea21c57 1430 kcode = TMath::Abs( CheckPDGCode(jparticle->GetPdgCode()) );
1431 ks = jparticle->GetStatusCode();
1432 km = jparticle->GetFirstMother();
1433
1434 if( (ks == 1) && (kcode == fPdgCodeParticleforAcceptanceCut) && (KinematicSelection(jparticle,1)) ){
1435 nPartAcc++;
1436 }
0f6ee828 1437 if( numberOfAcceptedParticles <= nPartAcc){
1438 checking = kTRUE;
1439 break;
1440 }
aea21c57 1441 }
0f6ee828 1442
aea21c57 1443 return checking;
aea21c57 1444}
1445
5fa4b20b 1446void AliGenPythia::LoadEvent(AliStack* stack, Int_t flag, Int_t reHadr)
8d2cd130 1447{
1058d9df 1448 //
1449 // Load event into Pythia Common Block
1450 //
1451
1452 Int_t npart = stack -> GetNprimary();
1453 Int_t n0 = 0;
1454
1455 if (!flag) {
1456 (fPythia->GetPyjets())->N = npart;
1457 } else {
1458 n0 = (fPythia->GetPyjets())->N;
1459 (fPythia->GetPyjets())->N = n0 + npart;
1460 }
1461
1462
1463 for (Int_t part = 0; part < npart; part++) {
1464 TParticle *mPart = stack->Particle(part);
32d6ef7d 1465
1058d9df 1466 Int_t kf = mPart->GetPdgCode();
1467 Int_t ks = mPart->GetStatusCode();
1468 Int_t idf = mPart->GetFirstDaughter();
1469 Int_t idl = mPart->GetLastDaughter();
1470
1471 if (reHadr) {
1472 if (ks == 11 || ks == 12) {
1473 ks -= 10;
1474 idf = -1;
1475 idl = -1;
1476 }
32d6ef7d 1477 }
1478
1058d9df 1479 Float_t px = mPart->Px();
1480 Float_t py = mPart->Py();
1481 Float_t pz = mPart->Pz();
1482 Float_t e = mPart->Energy();
1483 Float_t m = mPart->GetCalcMass();
32d6ef7d 1484
1058d9df 1485
1486 (fPythia->GetPyjets())->P[0][part+n0] = px;
1487 (fPythia->GetPyjets())->P[1][part+n0] = py;
1488 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1489 (fPythia->GetPyjets())->P[3][part+n0] = e;
1490 (fPythia->GetPyjets())->P[4][part+n0] = m;
1491
1492 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1493 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1494 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1495 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1496 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1497 }
1498}
1499
c2fc9d31 1500void AliGenPythia::LoadEvent(const TObjArray* stack, Int_t flag, Int_t reHadr)
1058d9df 1501{
1502 //
1503 // Load event into Pythia Common Block
1504 //
1505
1506 Int_t npart = stack -> GetEntries();
1507 Int_t n0 = 0;
1508
1509 if (!flag) {
1510 (fPythia->GetPyjets())->N = npart;
1511 } else {
1512 n0 = (fPythia->GetPyjets())->N;
1513 (fPythia->GetPyjets())->N = n0 + npart;
1514 }
1515
1516
1517 for (Int_t part = 0; part < npart; part++) {
1518 TParticle *mPart = dynamic_cast<TParticle *>(stack->At(part));
92847124 1519 if (!mPart) continue;
1520
1058d9df 1521 Int_t kf = mPart->GetPdgCode();
1522 Int_t ks = mPart->GetStatusCode();
1523 Int_t idf = mPart->GetFirstDaughter();
1524 Int_t idl = mPart->GetLastDaughter();
1525
1526 if (reHadr) {
92847124 1527 if (ks == 11 || ks == 12) {
1528 ks -= 10;
1529 idf = -1;
1530 idl = -1;
1531 }
8d2cd130 1532 }
1058d9df 1533
1534 Float_t px = mPart->Px();
1535 Float_t py = mPart->Py();
1536 Float_t pz = mPart->Pz();
1537 Float_t e = mPart->Energy();
1538 Float_t m = mPart->GetCalcMass();
1539
1540
1541 (fPythia->GetPyjets())->P[0][part+n0] = px;
1542 (fPythia->GetPyjets())->P[1][part+n0] = py;
1543 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1544 (fPythia->GetPyjets())->P[3][part+n0] = e;
1545 (fPythia->GetPyjets())->P[4][part+n0] = m;
1546
1547 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1548 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1549 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1550 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1551 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1552 }
8d2cd130 1553}
1554
5fa4b20b 1555
014a9521 1556void AliGenPythia::RecJetsUA1(Int_t& njets, Float_t jets [4][50])
8d2cd130 1557{
1558//
1559// Calls the Pythia jet finding algorithm to find jets in the current event
1560//
1561//
8d2cd130 1562//
1563// Save jets
1564 Int_t n = fPythia->GetN();
1565
1566//
1567// Run Jet Finder
1568 fPythia->Pycell(njets);
1569 Int_t i;
1570 for (i = 0; i < njets; i++) {
1571 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1572 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1573 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1574 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1575
1576 jets[0][i] = px;
1577 jets[1][i] = py;
1578 jets[2][i] = pz;
1579 jets[3][i] = e;
1580 }
1581}
1582
1583
1584
1585void AliGenPythia::GetJets(Int_t& nJets, Int_t& nJetsTrig, Float_t jets[4][10])
1586{
1587//
1588// Calls the Pythia clustering algorithm to find jets in the current event
1589//
1590 Int_t n = fPythia->GetN();
1591 nJets = 0;
1592 nJetsTrig = 0;
1593 if (fJetReconstruction == kCluster) {
1594//
1595// Configure cluster algorithm
1596//
1597 fPythia->SetPARU(43, 2.);
1598 fPythia->SetMSTU(41, 1);
1599//
1600// Call cluster algorithm
1601//
1602 fPythia->Pyclus(nJets);
1603//
1604// Loading jets from common block
1605//
1606 } else {
592f8307 1607
8d2cd130 1608//
1609// Run Jet Finder
1610 fPythia->Pycell(nJets);
1611 }
1612
1613 Int_t i;
1614 for (i = 0; i < nJets; i++) {
1615 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1616 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1617 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1618 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1619 Float_t pt = TMath::Sqrt(px * px + py * py);
a920faf9 1620 Float_t phi = TMath::Pi() + TMath::ATan2(-py, -px);
8d2cd130 1621 Float_t theta = TMath::ATan2(pt,pz);
1622 Float_t et = e * TMath::Sin(theta);
1623 Float_t eta = -TMath::Log(TMath::Tan(theta / 2.));
8d2cd130 1624 if (
1625 eta > fEtaMinJet && eta < fEtaMaxJet &&
675eb105 1626 phi > fPhiMinJet && phi < fPhiMaxJet &&
8d2cd130 1627 et > fEtMinJet && et < fEtMaxJet
1628 )
1629 {
1630 jets[0][nJetsTrig] = px;
1631 jets[1][nJetsTrig] = py;
1632 jets[2][nJetsTrig] = pz;
1633 jets[3][nJetsTrig] = e;
1634 nJetsTrig++;
5fa4b20b 1635// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
8d2cd130 1636 } else {
1637// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
1638 }
1639 }
1640}
1641
f913ec4f 1642void AliGenPythia::GetSubEventTime()
1643{
1644 // Calculates time of the next subevent
9d7108a7 1645 fEventTime = 0.;
1646 if (fEventsTime) {
1647 TArrayF &array = *fEventsTime;
1648 fEventTime = array[fCurSubEvent++];
1649 }
1650 // printf(" Event time: %d %f %p",fCurSubEvent,fEventTime,fEventsTime);
1651 return;
f913ec4f 1652}
8d2cd130 1653
c2fc9d31 1654Bool_t AliGenPythia::IsInEMCAL(Float_t phi, Float_t eta) const
ec2c406e 1655{
1656 // Is particle in EMCAL acceptance?
ec2c406e 1657 // phi in degrees, etamin=-etamax
9fd8e520 1658 if(phi > fEMCALMinPhi && phi < fEMCALMaxPhi &&
1659 eta < fEMCALEta )
ec2c406e 1660 return kTRUE;
1661 else
1662 return kFALSE;
1663}
1664
c2fc9d31 1665Bool_t AliGenPythia::IsInPHOS(Float_t phi, Float_t eta) const
ec2c406e 1666{
1667 // Is particle in PHOS acceptance?
1668 // Acceptance slightly larger considered.
1669 // phi in degrees, etamin=-etamax
9fd8e520 1670 if(phi > fPHOSMinPhi && phi < fPHOSMaxPhi &&
1671 eta < fPHOSEta )
ec2c406e 1672 return kTRUE;
1673 else
1674 return kFALSE;
1675}
1676
90a236ce 1677void AliGenPythia::RotatePhi(Int_t iphcand, Bool_t& okdd)
1678{
1679 //calculate the new position random between fPHOSMinPhi and fPHOSMaxPhi
1680 Double_t phiPHOSmin = TMath::Pi()*fPHOSMinPhi/180;
1681 Double_t phiPHOSmax = TMath::Pi()*fPHOSMaxPhi/180;
800be8b7 1682 Double_t phiPHOS = (AliPythiaRndm::GetPythiaRandom())->Uniform(phiPHOSmin,phiPHOSmax);
90a236ce 1683
1684 //calculate deltaphi
8507138f 1685 TParticle* ph = (TParticle *) fParticles.At(iphcand);
90a236ce 1686 Double_t phphi = ph->Phi();
1687 Double_t deltaphi = phiPHOS - phphi;
1688
1689
1690
1691 //loop for all particles and produce the phi rotation
8507138f 1692 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
90a236ce 1693 Double_t oldphi, newphi;
777e69b0 1694 Double_t newVx, newVy, r, vZ, time;
1695 Double_t newPx, newPy, pt, pz, e;
90a236ce 1696 for(Int_t i=0; i< np; i++) {
8507138f 1697 TParticle* iparticle = (TParticle *) fParticles.At(i);
90a236ce 1698 oldphi = iparticle->Phi();
1699 newphi = oldphi + deltaphi;
1700 if(newphi < 0) newphi = 2*TMath::Pi() + newphi; // correct angle
1701 if(newphi > 2*TMath::Pi()) newphi = newphi - 2*TMath::Pi(); // correct angle
1702
777e69b0 1703 r = iparticle->R();
1704 newVx = r * TMath::Cos(newphi);
1705 newVy = r * TMath::Sin(newphi);
1706 vZ = iparticle->Vz(); // don't transform
90a236ce 1707 time = iparticle->T(); // don't transform
1708
1709 pt = iparticle->Pt();
777e69b0 1710 newPx = pt * TMath::Cos(newphi);
1711 newPy = pt * TMath::Sin(newphi);
1712 pz = iparticle->Pz(); // don't transform
1713 e = iparticle->Energy(); // don't transform
90a236ce 1714
1715 // apply rotation
777e69b0 1716 iparticle->SetProductionVertex(newVx, newVy, vZ, time);
1717 iparticle->SetMomentum(newPx, newPy, pz, e);
90a236ce 1718
1719 } //end particle loop
1720
1721 // now let's check that we put correctly the candidate photon in PHOS
1722 Float_t phi = ph->Phi()*180./TMath::Pi(); //Convert to degrees
1723 Float_t eta =TMath::Abs(ph->Eta());//in calos etamin=-etamax
1724 if(IsInPHOS(phi,eta))
1725 okdd = kTRUE;
1726}
ec2c406e 1727
1728
589380c6 1729
c5dfa3e4 1730
800be8b7 1731Bool_t AliGenPythia::CheckDiffraction()
1732{
1733 // use this method only with Perugia-0 tune!
1734
1735 // printf("AAA\n");
1736
1737 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
1738
1739 Int_t iPart1=-1;
1740 Int_t iPart2=-1;
1741
1742 Double_t y1 = 1e10;
1743 Double_t y2 = -1e10;
1744
1745 const Int_t kNstable=20;
1746 const Int_t pdgStable[20] = {
1747 22, // Photon
1748 11, // Electron
1749 12, // Electron Neutrino
1750 13, // Muon
1751 14, // Muon Neutrino
1752 15, // Tau
1753 16, // Tau Neutrino
1754 211, // Pion
1755 321, // Kaon
1756 311, // K0
1757 130, // K0s
1758 310, // K0l
1759 2212, // Proton
1760 2112, // Neutron
1761 3122, // Lambda_0
1762 3112, // Sigma Minus
1763 3222, // Sigma Plus
1764 3312, // Xsi Minus
1765 3322, // Xsi0
1766 3334 // Omega
1767 };
1768
1769 for (Int_t i = 0; i < np; i++) {
1770 TParticle * part = (TParticle *) fParticles.At(i);
1771
1772 Int_t statusCode = part->GetStatusCode();
1773
1774 // Initial state particle
1775 if (statusCode != 1)
1776 continue;
1777
1778 Int_t pdg = TMath::Abs(part->GetPdgCode());
1779 Bool_t isStable = kFALSE;
1780 for (Int_t i1 = 0; i1 < kNstable; i1++) {
1781 if (pdg == pdgStable[i1]) {
1782 isStable = kTRUE;
1783 break;
1784 }
1785 }
1786 if(!isStable)
1787 continue;
1788
1789 Double_t y = part->Y();
1790
1791 if (y < y1)
1792 {
1793 y1 = y;
1794 iPart1 = i;
1795 }
1796 if (y > y2)
1797 {
1798 y2 = y;
1799 iPart2 = i;
1800 }
1801 }
1802
1803 if(iPart1<0 || iPart2<0) return kFALSE;
1804
1805 y1=TMath::Abs(y1);
1806 y2=TMath::Abs(y2);
1807
1808 TParticle * part1 = (TParticle *) fParticles.At(iPart1);
1809 TParticle * part2 = (TParticle *) fParticles.At(iPart2);
1810
1811 Int_t pdg1 = part1->GetPdgCode();
1812 Int_t pdg2 = part2->GetPdgCode();
1813
1814
1815 Int_t iPart = -1;
1816 if (pdg1 == 2212 && pdg2 == 2212)
1817 {
1818 if(y1 > y2)
1819 iPart = iPart1;
1820 else if(y1 < y2)
1821 iPart = iPart2;
1822 else {
1823 iPart = iPart1;
1824 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)>0.5) iPart = iPart2;
1825 }
1826 }
1827 else if (pdg1 == 2212)
1828 iPart = iPart1;
1829 else if (pdg2 == 2212)
1830 iPart = iPart2;
1831
1832
1833
1834
1835
1836 Double_t M=-1.;
1837 if(iPart>0) {
1838 TParticle * part = (TParticle *) fParticles.At(iPart);
1839 Double_t E= part->Energy();
1840 Double_t P= part->P();
1841 M= TMath::Sqrt((fEnergyCMS-E-P)*(fEnergyCMS-E+P));
1842 }
1843
c5dfa3e4 1844 Double_t Mmin, Mmax, wSD, wDD, wND;
1845 if(!GetWeightsDiffraction(M, Mmin, Mmax, wSD, wDD, wND)) return kFALSE;
1846
1847 if(M>-1 && M<Mmin) return kFALSE;
1848 if(M>Mmax) M=-1;
1849
1850 Int_t procType=fPythia->GetMSTI(1);
1851 Int_t proc0=2;
1852 if(procType== 94) proc0=1;
1853 if(procType== 92 || procType== 93) proc0=0;
1854
1855 Int_t proc=2;
1856 if(M>0) proc=0;
1857 else if(proc0==1) proc=1;
1858
1859 if(proc==1 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wDD) return kFALSE;
1860 if(proc==2 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wND) return kFALSE;
800be8b7 1861
1862
1863 // if(proc==1 || proc==2) return kFALSE;
1864
c5dfa3e4 1865 if(proc!=0) {
1866 if(proc0!=0) fProcDiff = procType;
1867 else fProcDiff = 95;
1868 return kTRUE;
1869 }
1870
1871 if(wSD<0) AliError("wSD<0 ! \n");
1872
1873 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)> wSD) return kFALSE;
1874
1875 // printf("iPart = %d\n", iPart);
1876
1877 if(iPart==iPart1) fProcDiff=93;
1878 else if(iPart==iPart2) fProcDiff=92;
1879 else {
1880 printf("EROOR: iPart!=iPart1 && iPart!=iPart2\n");
1881
800be8b7 1882 }
1883
c5dfa3e4 1884 return kTRUE;
1885}
1886
1887
1888
1889Bool_t AliGenPythia::GetWeightsDiffraction(Double_t M, Double_t &Mmin, Double_t &Mmax,
1890 Double_t &wSD, Double_t &wDD, Double_t &wND)
1891{
1892
1893 // 900 GeV
1894 if(TMath::Abs(fEnergyCMS-900)<1 ){
1895
1896const Int_t nbin=400;
1897Double_t bin[]={
18981.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
18994.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
19007.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
190110.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
190213.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
190315.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
190418.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
190521.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
190624.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
190727.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
190830.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
190933.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
191036.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
191139.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
191242.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
191345.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
191448.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
191551.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
191654.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
191757.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
191860.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
191963.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
192066.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
192169.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
192272.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
192375.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
192478.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
192581.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
192684.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
192787.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
192890.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
192993.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
193096.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
193199.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
1932102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
1933105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
1934108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
1935111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
1936114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
1937117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
1938120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
1939123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
1940126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
1941129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
1942132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
1943135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
1944138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
1945141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
1946144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
1947147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
1948150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
1949153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
1950156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
1951159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
1952162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
1953165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
1954168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
1955171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
1956174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
1957177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
1958180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
1959183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
1960186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
1961189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
1962192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
1963195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
1964198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
1965Double_t w[]={
19661.000000, 0.643457, 0.645609, 0.648347, 0.604563, 0.605002,
19670.602819, 0.611473, 0.576412, 0.562354, 0.550216, 0.529285,
19680.534558, 0.534364, 0.530358, 0.518475, 0.489253, 0.469754,
19690.469825, 0.450513, 0.455849, 0.435312, 0.437210, 0.456686,
19700.413577, 0.427093, 0.426894, 0.418834, 0.409475, 0.388483,
19710.412208, 0.388912, 0.389611, 0.382572, 0.389220, 0.370964,
19720.380463, 0.370873, 0.363701, 0.369363, 0.357361, 0.365759,
19730.348566, 0.337062, 0.348190, 0.332330, 0.359001, 0.335836,
19740.339154, 0.335599, 0.336035, 0.335204, 0.353440, 0.337836,
19750.333874, 0.307120, 0.294963, 0.324978, 0.313359, 0.317688,
19760.323758, 0.319304, 0.335317, 0.301765, 0.317257, 0.356331,
19770.323119, 0.297732, 0.303188, 0.326102, 0.316467, 0.294728,
19780.308135, 0.288857, 0.325692, 0.312493, 0.291100, 0.325921,
19790.313317, 0.295980, 0.308481, 0.328380, 0.313081, 0.296763,
19800.295431, 0.317325, 0.320462, 0.286918, 0.316035, 0.335208,
19810.283193, 0.333945, 0.292534, 0.294164, 0.330680, 0.296992,
19820.285509, 0.317260, 0.298269, 0.311299, 0.312129, 0.286822,
19830.287442, 0.319139, 0.283314, 0.318454, 0.297727, 0.301597,
19840.282483, 0.294792, 0.305569, 0.290957, 0.297817, 0.282908,
19850.272401, 0.305584, 0.300220, 0.297020, 0.298781, 0.278008,
19860.277727, 0.323777, 0.287419, 0.342074, 0.287259, 0.303658,
19870.302668, 0.279622, 0.280586, 0.313630, 0.276068, 0.257051,
19880.309996, 0.265534, 0.297138, 0.281738, 0.294610, 0.292882,
19890.286860, 0.312686, 0.293244, 0.293744, 0.271375, 0.278734,
19900.280308, 0.304739, 0.287907, 0.285261, 0.311180, 0.313476,
19910.289660, 0.289282, 0.319505, 0.271285, 0.272008, 0.289245,
19920.281038, 0.285284, 0.295836, 0.281416, 0.283501, 0.295417,
19930.304372, 0.297764, 0.291378, 0.321530, 0.315604, 0.329507,
19940.282609, 0.275576, 0.283721, 0.311714, 0.283760, 0.273188,
19950.312193, 0.264347, 0.281532, 0.301226, 0.281718, 0.336408,
19960.283157, 0.332010, 0.289974, 0.290256, 0.301569, 0.332228,
19970.288282, 0.326339, 0.313653, 0.300361, 0.289470, 0.264830,
19980.298659, 0.272359, 0.278878, 0.306001, 0.328168, 0.294991,
19990.327737, 0.278056, 0.302435, 0.284183, 0.279270, 0.307279,
20000.307917, 0.315196, 0.283803, 0.313333, 0.315730, 0.304818,
20010.307171, 0.295223, 0.333741, 0.346911, 0.310143, 0.336686,
20020.275459, 0.334781, 0.295405, 0.275816, 0.301678, 0.327242,
20030.320717, 0.309230, 0.292145, 0.294489, 0.305088, 0.300969,
20040.277438, 0.326159, 0.297065, 0.301177, 0.303843, 0.275382,
20050.304019, 0.284166, 0.289610, 0.331611, 0.317131, 0.310880,
20060.360456, 0.294052, 0.342694, 0.327166, 0.336797, 0.298040,
20070.295767, 0.260053, 0.325544, 0.335310, 0.320182, 0.301072,
20080.313117, 0.283407, 0.299206, 0.293525, 0.305067, 0.255978,
20090.327055, 0.316382, 0.317700, 0.278993, 0.283120, 0.314000,
20100.274396, 0.291208, 0.348813, 0.319603, 0.313076, 0.289155,
20110.343988, 0.311426, 0.322896, 0.328726, 0.337062, 0.389093,
20120.284122, 0.312184, 0.304008, 0.319170, 0.320778, 0.288390,
20130.337272, 0.356273, 0.343310, 0.312209, 0.330709, 0.297977,
20140.346146, 0.369162, 0.324385, 0.339831, 0.337037, 0.318739,
20150.343157, 0.277720, 0.368407, 0.321330, 0.338997, 0.314220,
20160.328861, 0.321824, 0.328013, 0.356925, 0.359144, 0.296314,
20170.345415, 0.396711, 0.347032, 0.294928, 0.343799, 0.322331,
20180.328656, 0.326098, 0.337338, 0.337038, 0.300179, 0.351391,
20190.324337, 0.330896, 0.302842, 0.310522, 0.337052, 0.359989,
20200.383250, 0.359355, 0.315382, 0.333113, 0.342598, 0.355348,
20210.320751, 0.320475, 0.351762, 0.351475, 0.338358, 0.326153,
20220.302507, 0.340048, 0.318685, 0.381646, 0.339320, 0.299453,
20230.426599, 0.393515, 0.353929, 0.328435, 0.413976, 0.292558,
20240.379340, 0.358344, 0.409259, 0.313821, 0.336675, 0.324521,
20250.408382, 0.346273, 0.312939, 0.362453, 0.343152, 0.330577,
20260.332831, 0.353299, 0.347745, 0.334818, 0.332234, 0.385585,
20270.395483, 0.395316, 0.326972, 0.349434, 0.317604, 0.328980,
20280.375056, 0.317290, 0.357083, 0.346165, 0.310444, 0.356873,
20290.359523, 0.365308, 0.365122, 0.383685, 0.370975, 0.396928,
20300.407654, 0.307755, 0.323033, 0.350580, 0.345231, 0.342462,
20310.400000, 0.318309, 0.403570, 0.322856, 0.383053, 0.422252,
20320.386112, 0.364314, 0.434375, 0.334629};
2033wDD = 0.379611;
2034wND = 0.496961;
2035wSD = -1;
2036
2037 Mmin = bin[0];
2038 Mmax = bin[nbin];
2039 if(M<Mmin || M>Mmax) return kTRUE;
2040
7873275c 2041 Int_t ibin=nbin-1;
93a60586 2042 for(Int_t i=1; i<=nbin; i++)
2ff57420 2043 if(M<=bin[i]) {
2044 ibin=i-1;
2045 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
800be8b7 2046 break;
2047 }
c5dfa3e4 2048 wSD=w[ibin];
2049 return kTRUE;
2050 }
2051 else if(TMath::Abs(fEnergyCMS-2760)<1 ){
800be8b7 2052
c5dfa3e4 2053const Int_t nbin=400;
2054Double_t bin[]={
20551.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
20564.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
20577.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
205810.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
205913.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
206015.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
206118.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
206221.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
206324.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
206427.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
206530.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
206633.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
206736.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
206839.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
206942.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
207045.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
207148.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
207251.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
207354.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
207457.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
207560.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
207663.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
207766.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
207869.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
207972.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
208075.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
208178.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
208281.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
208384.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
208487.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
208590.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
208693.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
208796.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
208899.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2089102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2090105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2091108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2092111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2093114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2094117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2095120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2096123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2097126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2098129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2099132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2100135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2101138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2102141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2103144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2104147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2105150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2106153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2107156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2108159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2109162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2110165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2111168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2112171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2113174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2114177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2115180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2116183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2117186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2118189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2119192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2120195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2121198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2122Double_t w[]={
21231.000000, 0.692593, 0.673384, 0.666273, 0.657285, 0.637723,
21240.625881, 0.643590, 0.606100, 0.589007, 0.567824, 0.578705,
21250.538530, 0.517937, 0.528278, 0.515918, 0.539461, 0.466186,
21260.489869, 0.468402, 0.465017, 0.453336, 0.460769, 0.474638,
21270.456347, 0.434471, 0.427478, 0.435435, 0.410934, 0.366431,
21280.382240, 0.379513, 0.394249, 0.386837, 0.353103, 0.382138,
21290.377497, 0.389479, 0.378736, 0.347933, 0.354605, 0.352077,
21300.324443, 0.358792, 0.339968, 0.359052, 0.330734, 0.318291,
21310.333703, 0.358644, 0.335819, 0.332213, 0.309051, 0.309975,
21320.331626, 0.304407, 0.309819, 0.312097, 0.312462, 0.320411,
21330.280401, 0.302311, 0.315863, 0.281479, 0.310003, 0.296911,
21340.313676, 0.281071, 0.294163, 0.306500, 0.283462, 0.274867,
21350.307149, 0.270555, 0.282264, 0.287373, 0.307849, 0.278675,
21360.286990, 0.278269, 0.300105, 0.286799, 0.265674, 0.275140,
21370.285702, 0.257352, 0.267714, 0.248204, 0.252220, 0.255678,
21380.282946, 0.268257, 0.282375, 0.262675, 0.275564, 0.248345,
21390.236259, 0.291914, 0.259936, 0.241338, 0.267389, 0.285044,
21400.289419, 0.253594, 0.284568, 0.231840, 0.260008, 0.268527,
21410.275363, 0.224115, 0.281260, 0.257913, 0.295152, 0.264399,
21420.232287, 0.282533, 0.223431, 0.255756, 0.244471, 0.221695,
21430.272450, 0.284244, 0.253682, 0.270717, 0.275403, 0.240323,
21440.245081, 0.241859, 0.216340, 0.244789, 0.220291, 0.238478,
21450.224691, 0.244058, 0.266117, 0.271478, 0.242012, 0.267321,
21460.248494, 0.253343, 0.255606, 0.235458, 0.241079, 0.233223,
21470.226813, 0.259224, 0.234239, 0.258606, 0.210892, 0.238186,
21480.243271, 0.222678, 0.213437, 0.273939, 0.247966, 0.232548,
21490.263438, 0.222089, 0.272111, 0.248818, 0.244295, 0.238368,
21500.236908, 0.248776, 0.232604, 0.231194, 0.227117, 0.231152,
21510.282140, 0.229778, 0.232631, 0.261794, 0.216633, 0.253471,
21520.242157, 0.227406, 0.269335, 0.230547, 0.210618, 0.285872,
21530.248776, 0.229875, 0.242728, 0.227388, 0.220567, 0.222062,
21540.235950, 0.224087, 0.228895, 0.208287, 0.235999, 0.208696,
21550.230367, 0.267667, 0.220484, 0.233402, 0.233815, 0.250455,
21560.253120, 0.219556, 0.230980, 0.236661, 0.222395, 0.226111,
21570.198315, 0.210555, 0.202813, 0.208594, 0.235976, 0.221490,
21580.243059, 0.204901, 0.216987, 0.229039, 0.231466, 0.221975,
21590.231220, 0.253638, 0.250448, 0.260291, 0.328345, 0.205739,
21600.222014, 0.251513, 0.279427, 0.270506, 0.248409, 0.222472,
21610.291632, 0.227796, 0.248769, 0.276896, 0.214742, 0.200139,
21620.230693, 0.226031, 0.268900, 0.185160, 0.245353, 0.205843,
21630.231155, 0.219122, 0.214811, 0.199763, 0.274179, 0.217598,
21640.274988, 0.237244, 0.211820, 0.225459, 0.252799, 0.235948,
21650.224986, 0.245385, 0.237770, 0.213373, 0.229737, 0.215487,
21660.234453, 0.249684, 0.239435, 0.250422, 0.257194, 0.214762,
21670.212266, 0.228988, 0.253798, 0.201607, 0.239946, 0.205245,
21680.231670, 0.212774, 0.206768, 0.231563, 0.189388, 0.227926,
21690.227203, 0.237754, 0.221628, 0.211138, 0.203322, 0.200985,
21700.231780, 0.220294, 0.232686, 0.234243, 0.218264, 0.255870,
21710.223213, 0.238670, 0.213713, 0.213064, 0.246700, 0.233446,
21720.221503, 0.206767, 0.200722, 0.226179, 0.237425, 0.239229,
21730.238611, 0.240419, 0.247806, 0.215923, 0.205298, 0.232778,
21740.272312, 0.226773, 0.258103, 0.223287, 0.269404, 0.203398,
21750.223782, 0.204213, 0.229664, 0.234040, 0.228419, 0.203936,
21760.263686, 0.199141, 0.236127, 0.214058, 0.204611, 0.224324,
21770.292140, 0.190735, 0.235157, 0.213018, 0.257085, 0.190554,
21780.203197, 0.213044, 0.237023, 0.214243, 0.193562, 0.262403,
21790.206256, 0.221396, 0.233588, 0.256611, 0.249731, 0.226683,
21800.199330, 0.251026, 0.222596, 0.201941, 0.186374, 0.221038,
21810.196555, 0.222560, 0.299419, 0.231979, 0.242924, 0.198310,
21820.217628, 0.235458, 0.278595, 0.218624, 0.277305, 0.239109,
21830.205600, 0.253715, 0.221173, 0.218195, 0.277647, 0.241974,
21840.268748, 0.268128, 0.292258, 0.249420, 0.191034, 0.219506,
21850.216502, 0.250677, 0.193386, 0.201310, 0.259464, 0.255351,
21860.269628, 0.221063, 0.294079, 0.196726, 0.233634, 0.221870,
21870.216236, 0.197259, 0.247433, 0.272765, 0.294079, 0.236336,
21880.206396, 0.238524, 0.247846, 0.269519, 0.237141, 0.230611,
21890.201712, 0.242225, 0.255565, 0.258738};
2190wDD = 0.512813;
2191wND = 0.518820;
2192wSD = -1;
2193
2194 Mmin = bin[0];
2195 Mmax = bin[nbin];
2196 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2197
c5dfa3e4 2198 Int_t ibin=nbin-1;
2199 for(Int_t i=1; i<=nbin; i++)
2200 if(M<=bin[i]) {
2201 ibin=i-1;
2202 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2203 break;
2204 }
2205 wSD=w[ibin];
2206 return kTRUE;
2207 }
800be8b7 2208
800be8b7 2209
c5dfa3e4 2210 else if(TMath::Abs(fEnergyCMS-7000)<1 ){
2211const Int_t nbin=400;
2212Double_t bin[]={
22131.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
22144.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
22157.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
221610.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
221713.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
221815.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
221918.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
222021.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
222124.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
222227.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
222330.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
222433.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
222536.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
222639.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
222742.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
222845.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
222948.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
223051.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
223154.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
223257.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
223360.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
223463.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
223566.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
223669.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
223772.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
223875.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
223978.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
224081.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
224184.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
224287.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
224390.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
224493.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
224596.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
224699.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2247102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2248105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2249108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2250111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2251114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2252117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2253120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2254123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2255126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2256129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2257132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2258135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2259138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2260141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2261144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2262147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2263150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2264153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2265156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2266159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2267162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2268165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2269168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2270171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2271174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2272177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2273180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2274183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2275186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2276189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2277192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2278195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2279198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2280Double_t w[]={
22811.000000, 0.798640, 0.770197, 0.717990, 0.699434, 0.692093,
22820.620940, 0.655294, 0.636496, 0.633483, 0.600518, 0.594548,
22830.550759, 0.550413, 0.528926, 0.525877, 0.506701, 0.504117,
22840.486973, 0.492930, 0.461833, 0.488695, 0.438874, 0.460274,
22850.451551, 0.454424, 0.449270, 0.387571, 0.427556, 0.428740,
22860.401682, 0.402260, 0.408961, 0.395417, 0.387426, 0.378602,
22870.357826, 0.359125, 0.348494, 0.363710, 0.356117, 0.340363,
22880.337637, 0.396084, 0.341777, 0.340551, 0.348838, 0.344014,
22890.340468, 0.317654, 0.355584, 0.326023, 0.373416, 0.312298,
22900.326522, 0.290540, 0.335557, 0.318689, 0.327544, 0.319501,
22910.331754, 0.312728, 0.282263, 0.274937, 0.303867, 0.307820,
22920.289344, 0.268934, 0.288908, 0.290018, 0.291369, 0.295242,
22930.289067, 0.277685, 0.267957, 0.267559, 0.320229, 0.265060,
22940.305931, 0.305352, 0.262064, 0.281879, 0.287780, 0.270033,
22950.270814, 0.276667, 0.271531, 0.275283, 0.258189, 0.287969,
22960.251247, 0.301527, 0.267230, 0.245860, 0.293125, 0.253421,
22970.272396, 0.243637, 0.236206, 0.278452, 0.246544, 0.263165,
22980.230484, 0.231102, 0.258281, 0.244707, 0.270111, 0.248295,
22990.246942, 0.245592, 0.272766, 0.254243, 0.199647, 0.262590,
23000.226710, 0.243836, 0.214153, 0.233535, 0.235207, 0.234245,
23010.247698, 0.248379, 0.241463, 0.265230, 0.223242, 0.236191,
23020.252700, 0.231865, 0.228352, 0.229101, 0.237385, 0.246485,
23030.254706, 0.245565, 0.224841, 0.257301, 0.240968, 0.202379,
23040.236943, 0.241683, 0.220809, 0.219014, 0.213015, 0.244470,
23050.221042, 0.198996, 0.225295, 0.264466, 0.200600, 0.228143,
23060.250138, 0.216784, 0.268002, 0.275734, 0.218144, 0.229866,
23070.235443, 0.208909, 0.215067, 0.189743, 0.216741, 0.242686,
23080.200234, 0.218882, 0.245991, 0.222815, 0.219576, 0.209773,
23090.205247, 0.203855, 0.202534, 0.192536, 0.223447, 0.225810,
23100.220583, 0.248421, 0.223424, 0.206033, 0.203130, 0.221225,
23110.223763, 0.239216, 0.252311, 0.206893, 0.228461, 0.233591,
23120.201512, 0.242382, 0.215147, 0.232578, 0.207116, 0.239213,
23130.196215, 0.184367, 0.235135, 0.189768, 0.274084, 0.206267,
23140.203283, 0.248828, 0.250214, 0.217465, 0.232080, 0.215150,
23150.207936, 0.176789, 0.191338, 0.188655, 0.196181, 0.223691,
23160.254257, 0.216874, 0.213536, 0.221399, 0.192024, 0.212534,
23170.218169, 0.226635, 0.201191, 0.212700, 0.211634, 0.232353,
23180.223636, 0.208605, 0.249132, 0.183681, 0.221842, 0.187136,
23190.203772, 0.249575, 0.217713, 0.205193, 0.193941, 0.219707,
23200.264226, 0.182105, 0.207183, 0.220845, 0.236571, 0.182390,
23210.212914, 0.186266, 0.195361, 0.217665, 0.204527, 0.188804,
23220.222832, 0.191193, 0.201073, 0.185616, 0.195011, 0.200828,
23230.181434, 0.233707, 0.202925, 0.211992, 0.173100, 0.205258,
23240.182695, 0.216520, 0.218422, 0.209490, 0.211257, 0.215801,
23250.220652, 0.211409, 0.195731, 0.194957, 0.198888, 0.234926,
23260.221377, 0.229822, 0.176700, 0.172322, 0.212265, 0.206133,
23270.170355, 0.253305, 0.198688, 0.240043, 0.225384, 0.174729,
23280.195820, 0.200093, 0.196912, 0.212308, 0.200490, 0.240415,
23290.159744, 0.173686, 0.223853, 0.213604, 0.193779, 0.179328,
23300.180873, 0.237481, 0.179640, 0.235857, 0.202847, 0.167690,
23310.245093, 0.215504, 0.205848, 0.184408, 0.201626, 0.209651,
23320.236306, 0.217803, 0.188534, 0.187861, 0.161663, 0.221718,
23330.152044, 0.190412, 0.173505, 0.208995, 0.174575, 0.180734,
23340.247704, 0.203388, 0.194184, 0.169679, 0.182703, 0.213402,
23350.191808, 0.178604, 0.178116, 0.198452, 0.174687, 0.169809,
23360.222851, 0.156811, 0.229170, 0.210359, 0.178557, 0.248570,
23370.208536, 0.192571, 0.178912, 0.224505, 0.170822, 0.205492,
23380.330973, 0.160924, 0.203724, 0.213255, 0.205827, 0.187162,
23390.181252, 0.191723, 0.238106, 0.182398, 0.202358, 0.212066,
23400.201255, 0.168159, 0.185219, 0.229176, 0.158222, 0.164092,
23410.215405, 0.200724, 0.234811, 0.184488, 0.213112, 0.198577,
23420.219622, 0.160671, 0.179349, 0.206681, 0.206091, 0.165618,
23430.165203, 0.174442, 0.179287, 0.187318, 0.163481, 0.217440,
23440.160381, 0.177025, 0.204385, 0.163676, 0.210733, 0.186519,
23450.230701, 0.191764, 0.185119, 0.190770, 0.242987, 0.186812,
23460.202906, 0.161935, 0.182426, 0.197922, 0.181475, 0.155903,
23470.175006, 0.223482, 0.202706, 0.218108};
2348wDD = 0.207705;
2349wND = 0.289628;
2350wSD = -1;
2351
2352 Mmin = bin[0];
2353 Mmax = bin[nbin];
2354
2355 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2356
c5dfa3e4 2357 Int_t ibin=nbin-1;
2358 for(Int_t i=1; i<=nbin; i++)
2359 if(M<=bin[i]) {
2360 ibin=i-1;
2361 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2362 break;
2363 }
2364 wSD=w[ibin];
800be8b7 2365 return kTRUE;
c5dfa3e4 2366 }
2367
2368 return kFALSE;
800be8b7 2369}
06956108 2370
2371Bool_t AliGenPythia::IsFromHeavyFlavor(Int_t ipart)
2372{
2373// Check if this is a heavy flavor decay product
2374 TParticle * part = (TParticle *) fParticles.At(ipart);
2375 Int_t mpdg = TMath::Abs(part->GetPdgCode());
2376 Int_t mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2377 //
2378 // Light hadron
2379 if (mfl >= 4 && mfl < 6) return kTRUE;
2380
2381 Int_t imo = part->GetFirstMother()-1;
2382 TParticle* pm = part;
2383 //
2384 // Heavy flavor hadron produced by generator
2385 while (imo > -1) {
2386 pm = (TParticle*)fParticles.At(imo);
2387 mpdg = TMath::Abs(pm->GetPdgCode());
2388 mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2389 if ((mfl > 3) && (mfl <6) && mpdg > 400) return kTRUE;
2390 imo = pm->GetFirstMother()-1;
2391 }
2392 return kFALSE;
2393}