]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PYTHIA6/AliGenPythia.cxx
- Fixed problems with axes and processing flags (shared clusters)
[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"
8d2cd130 49
014a9521 50ClassImp(AliGenPythia)
8d2cd130 51
e8a8adcd 52
53AliGenPythia::AliGenPythia():
54 AliGenMC(),
55 fProcess(kPyCharm),
efe3b1cd 56 fItune(-1),
e8a8adcd 57 fStrucFunc(kCTEQ5L),
e8a8adcd 58 fKineBias(0.),
59 fTrials(0),
60 fTrialsRun(0),
61 fQ(0.),
62 fX1(0.),
63 fX2(0.),
64 fEventTime(0.),
65 fInteractionRate(0.),
66 fTimeWindow(0.),
67 fCurSubEvent(0),
68 fEventsTime(0),
69 fNev(0),
70 fFlavorSelect(0),
71 fXsection(0.),
72 fPythia(0),
73 fPtHardMin(0.),
74 fPtHardMax(1.e4),
75 fYHardMin(-1.e10),
76 fYHardMax(1.e10),
77 fGinit(1),
78 fGfinal(1),
036662e5 79 fCRoff(0),
e8a8adcd 80 fHadronisation(1),
03358a32 81 fPatchOmegaDalitz(0),
d7d0c637 82 fDecayerExodus(0),
e8a8adcd 83 fNpartons(0),
84 fReadFromFile(0),
64da86aa 85 fReadLHEF(0),
e8a8adcd 86 fQuench(0),
cd07c39b 87 fQhat(0.),
88 fLength(0.),
66b8652c 89 fpyquenT(1.),
90 fpyquenTau(0.1),
91 fpyquenNf(0),
92 fpyquenEloss(0),
93 fpyquenAngle(0),
e6fe9b82 94 fImpact(0.),
e8a8adcd 95 fPtKick(1.),
96 fFullEvent(kTRUE),
97 fDecayer(new AliDecayerPythia()),
98 fDebugEventFirst(-1),
99 fDebugEventLast(-1),
100 fEtMinJet(0.),
101 fEtMaxJet(1.e4),
102 fEtaMinJet(-20.),
103 fEtaMaxJet(20.),
104 fPhiMinJet(0.),
105 fPhiMaxJet(2.* TMath::Pi()),
106 fJetReconstruction(kCell),
107 fEtaMinGamma(-20.),
108 fEtaMaxGamma(20.),
109 fPhiMinGamma(0.),
110 fPhiMaxGamma(2. * TMath::Pi()),
111 fPycellEtaMax(2.),
112 fPycellNEta(274),
113 fPycellNPhi(432),
114 fPycellThreshold(0.),
115 fPycellEtSeed(4.),
116 fPycellMinEtJet(10.),
117 fPycellMaxRadius(1.),
118 fStackFillOpt(kFlavorSelection),
119 fFeedDownOpt(kTRUE),
120 fFragmentation(kTRUE),
121 fSetNuclei(kFALSE),
fb355e51 122 fUseNuclearPDF(kFALSE),
123 fUseLorentzBoost(kTRUE),
e8a8adcd 124 fNewMIS(kFALSE),
125 fHFoff(kFALSE),
20e47f08 126 fNucPdf(0),
e8a8adcd 127 fTriggerParticle(0),
128 fTriggerEta(0.9),
1f0caa6a 129 fTriggerEtaMin(0.9),
2591bd0e 130 fTriggerMinPt(-1),
131 fTriggerMaxPt(1000),
700b9416 132 fTriggerMultiplicity(0),
133 fTriggerMultiplicityEta(0),
440c2873 134 fTriggerMultiplicityEtaMin(0),
135 fTriggerMultiplicityEtaMax(0),
38112f3f 136 fTriggerMultiplicityPtMin(0),
e8a8adcd 137 fCountMode(kCountAll),
138 fHeader(0),
139 fRL(0),
777e69b0 140 fkFileName(0),
64da86aa 141 fkNameLHEF(0),
9fd8e520 142 fFragPhotonInCalo(kFALSE),
43e3b80a 143 fHadronInCalo(kFALSE) ,
ec2c406e 144 fPi0InCalo(kFALSE) ,
40fe59d4 145 fEtaInCalo(kFALSE) ,
146 fPhotonInCalo(kFALSE), // not in use
147 fDecayPhotonInCalo(kFALSE),
148 fForceNeutralMeson2PhotonDecay(kFALSE),
149 fEleInCalo(kFALSE),
150 fEleInEMCAL(kFALSE), // not in use
151 fCheckBarrel(kFALSE),
9fd8e520 152 fCheckEMCAL(kFALSE),
153 fCheckPHOS(kFALSE),
90a236ce 154 fCheckPHOSeta(kFALSE),
40fe59d4 155 fPHOSRotateCandidate(-1),
43e3b80a 156 fTriggerParticleMinPt(0),
40fe59d4 157 fPhotonMinPt(0), // not in use
158 fElectronMinPt(0), // not in use
9fd8e520 159 fPHOSMinPhi(219.),
160 fPHOSMaxPhi(321.),
161 fPHOSEta(0.13),
162 fEMCALMinPhi(79.),
163 fEMCALMaxPhi(191.),
800be8b7 164 fEMCALEta(0.71),
165 fkTuneForDiff(0),
166 fProcDiff(0)
8d2cd130 167{
168// Default Constructor
e7c989e4 169 fEnergyCMS = 5500.;
7cdba479 170 if (!AliPythiaRndm::GetPythiaRandom())
e8a8adcd 171 AliPythiaRndm::SetPythiaRandom(GetRandom());
8d2cd130 172}
173
174AliGenPythia::AliGenPythia(Int_t npart)
e8a8adcd 175 :AliGenMC(npart),
176 fProcess(kPyCharm),
efe3b1cd 177 fItune(-1),
e8a8adcd 178 fStrucFunc(kCTEQ5L),
e8a8adcd 179 fKineBias(0.),
180 fTrials(0),
181 fTrialsRun(0),
182 fQ(0.),
183 fX1(0.),
184 fX2(0.),
185 fEventTime(0.),
186 fInteractionRate(0.),
187 fTimeWindow(0.),
188 fCurSubEvent(0),
189 fEventsTime(0),
190 fNev(0),
191 fFlavorSelect(0),
192 fXsection(0.),
193 fPythia(0),
194 fPtHardMin(0.),
195 fPtHardMax(1.e4),
196 fYHardMin(-1.e10),
197 fYHardMax(1.e10),
198 fGinit(kTRUE),
199 fGfinal(kTRUE),
036662e5 200 fCRoff(kFALSE),
e8a8adcd 201 fHadronisation(kTRUE),
d7d0c637 202 fPatchOmegaDalitz(0),
203 fDecayerExodus(0),
e8a8adcd 204 fNpartons(0),
205 fReadFromFile(kFALSE),
64da86aa 206 fReadLHEF(0),
e8a8adcd 207 fQuench(kFALSE),
cd07c39b 208 fQhat(0.),
209 fLength(0.),
66b8652c 210 fpyquenT(1.),
211 fpyquenTau(0.1),
212 fpyquenNf(0),
213 fpyquenEloss(0),
214 fpyquenAngle(0),
e6fe9b82 215 fImpact(0.),
e8a8adcd 216 fPtKick(1.),
217 fFullEvent(kTRUE),
218 fDecayer(new AliDecayerPythia()),
219 fDebugEventFirst(-1),
220 fDebugEventLast(-1),
221 fEtMinJet(0.),
222 fEtMaxJet(1.e4),
223 fEtaMinJet(-20.),
224 fEtaMaxJet(20.),
225 fPhiMinJet(0.),
226 fPhiMaxJet(2.* TMath::Pi()),
227 fJetReconstruction(kCell),
228 fEtaMinGamma(-20.),
229 fEtaMaxGamma(20.),
230 fPhiMinGamma(0.),
231 fPhiMaxGamma(2. * TMath::Pi()),
232 fPycellEtaMax(2.),
233 fPycellNEta(274),
234 fPycellNPhi(432),
235 fPycellThreshold(0.),
236 fPycellEtSeed(4.),
237 fPycellMinEtJet(10.),
238 fPycellMaxRadius(1.),
239 fStackFillOpt(kFlavorSelection),
240 fFeedDownOpt(kTRUE),
241 fFragmentation(kTRUE),
242 fSetNuclei(kFALSE),
fb355e51 243 fUseNuclearPDF(kFALSE),
244 fUseLorentzBoost(kTRUE),
e8a8adcd 245 fNewMIS(kFALSE),
246 fHFoff(kFALSE),
20e47f08 247 fNucPdf(0),
e8a8adcd 248 fTriggerParticle(0),
2591bd0e 249 fTriggerEta(0.9),
1f0caa6a 250 fTriggerEtaMin(0.9),
2591bd0e 251 fTriggerMinPt(-1),
252 fTriggerMaxPt(1000),
700b9416 253 fTriggerMultiplicity(0),
254 fTriggerMultiplicityEta(0),
440c2873 255 fTriggerMultiplicityEtaMin(0),
256 fTriggerMultiplicityEtaMax(0),
38112f3f 257 fTriggerMultiplicityPtMin(0),
e8a8adcd 258 fCountMode(kCountAll),
259 fHeader(0),
260 fRL(0),
777e69b0 261 fkFileName(0),
64da86aa 262 fkNameLHEF(0),
9fd8e520 263 fFragPhotonInCalo(kFALSE),
43e3b80a 264 fHadronInCalo(kFALSE) ,
ec2c406e 265 fPi0InCalo(kFALSE) ,
40fe59d4 266 fEtaInCalo(kFALSE) ,
267 fPhotonInCalo(kFALSE), // not in use
268 fDecayPhotonInCalo(kFALSE),
269 fForceNeutralMeson2PhotonDecay(kFALSE),
270 fEleInCalo(kFALSE),
271 fEleInEMCAL(kFALSE), // not in use
272 fCheckBarrel(kFALSE),
9fd8e520 273 fCheckEMCAL(kFALSE),
274 fCheckPHOS(kFALSE),
90a236ce 275 fCheckPHOSeta(kFALSE),
40fe59d4 276 fPHOSRotateCandidate(-1),
43e3b80a 277 fTriggerParticleMinPt(0),
40fe59d4 278 fPhotonMinPt(0), // not in use
279 fElectronMinPt(0), // not in use
9fd8e520 280 fPHOSMinPhi(219.),
281 fPHOSMaxPhi(321.),
282 fPHOSEta(0.13),
283 fEMCALMinPhi(79.),
284 fEMCALMaxPhi(191.),
800be8b7 285 fEMCALEta(0.71),
286 fkTuneForDiff(0),
287 fProcDiff(0)
8d2cd130 288{
289// default charm production at 5. 5 TeV
290// semimuonic decay
291// structure function GRVHO
292//
e7c989e4 293 fEnergyCMS = 5500.;
8d2cd130 294 fName = "Pythia";
295 fTitle= "Particle Generator using PYTHIA";
8d2cd130 296 SetForceDecay();
8d2cd130 297 // Set random number generator
7cdba479 298 if (!AliPythiaRndm::GetPythiaRandom())
299 AliPythiaRndm::SetPythiaRandom(GetRandom());
76d6ba9a 300 }
8d2cd130 301
8d2cd130 302AliGenPythia::~AliGenPythia()
303{
304// Destructor
9d7108a7 305 if(fEventsTime) delete fEventsTime;
306}
307
308void AliGenPythia::SetInteractionRate(Float_t rate,Float_t timewindow)
309{
310// Generate pileup using user specified rate
311 fInteractionRate = rate;
312 fTimeWindow = timewindow;
313 GeneratePileup();
314}
315
316void AliGenPythia::GeneratePileup()
317{
318// Generate sub events time for pileup
319 fEventsTime = 0;
320 if(fInteractionRate == 0.) {
321 Warning("GeneratePileup","Zero interaction specified. Skipping pileup generation.\n");
322 return;
323 }
324
325 Int_t npart = NumberParticles();
326 if(npart < 0) {
327 Warning("GeneratePileup","Negative number of particles. Skipping pileup generation.\n");
328 return;
329 }
330
331 if(fEventsTime) delete fEventsTime;
332 fEventsTime = new TArrayF(npart);
333 TArrayF &array = *fEventsTime;
334 for(Int_t ipart = 0; ipart < npart; ipart++)
335 array[ipart] = 0.;
336
337 Float_t eventtime = 0.;
338 while(1)
339 {
340 eventtime += (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
341 if(eventtime > fTimeWindow) break;
342 array.Set(array.GetSize()+1);
343 array[array.GetSize()-1] = eventtime;
344 }
345
346 eventtime = 0.;
347 while(1)
348 {
349 eventtime -= (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
350 if(TMath::Abs(eventtime) > fTimeWindow) break;
351 array.Set(array.GetSize()+1);
352 array[array.GetSize()-1] = eventtime;
353 }
354
355 SetNumberParticles(fEventsTime->GetSize());
8d2cd130 356}
357
592f8307 358void AliGenPythia::SetPycellParameters(Float_t etamax, Int_t neta, Int_t nphi,
359 Float_t thresh, Float_t etseed, Float_t minet, Float_t r)
360{
361// Set pycell parameters
362 fPycellEtaMax = etamax;
363 fPycellNEta = neta;
364 fPycellNPhi = nphi;
365 fPycellThreshold = thresh;
366 fPycellEtSeed = etseed;
367 fPycellMinEtJet = minet;
368 fPycellMaxRadius = r;
369}
370
371
372
8d2cd130 373void AliGenPythia::SetEventListRange(Int_t eventFirst, Int_t eventLast)
374{
375 // Set a range of event numbers, for which a table
376 // of generated particle will be printed
377 fDebugEventFirst = eventFirst;
378 fDebugEventLast = eventLast;
379 if (fDebugEventLast==-1) fDebugEventLast=fDebugEventFirst;
380}
381
382void AliGenPythia::Init()
383{
384// Initialisation
385
386 SetMC(AliPythia::Instance());
b88f5cea 387 fPythia=(AliPythia*) fMCEvGen;
e2bddf81 388
8d2cd130 389//
390 fParentWeight=1./Float_t(fNpart);
391//
8d2cd130 392
393
394 fPythia->SetCKIN(3,fPtHardMin);
395 fPythia->SetCKIN(4,fPtHardMax);
396 fPythia->SetCKIN(7,fYHardMin);
397 fPythia->SetCKIN(8,fYHardMax);
398
e28ccdaf 399 if (fProjectile != "p" || fTarget != "p") fPythia->SetCollisionSystem(fProjectile,fTarget);
400
fb355e51 401 if(fUseNuclearPDF)
402 fPythia->SetNuclei(fAProjectile, fATarget, fNucPdf);
8d2cd130 403 // Fragmentation?
404 if (fFragmentation) {
405 fPythia->SetMSTP(111,1);
406 } else {
407 fPythia->SetMSTP(111,0);
408 }
409
410
411// initial state radiation
412 fPythia->SetMSTP(61,fGinit);
413// final state radiation
414 fPythia->SetMSTP(71,fGfinal);
036662e5 415 //color reconnection strength
416 if(fCRoff==1)fPythia->SetMSTP(95,0);
8d2cd130 417// pt - kick
418 if (fPtKick > 0.) {
419 fPythia->SetMSTP(91,1);
688950ef 420 fPythia->SetPARP(91,fPtKick);
421 fPythia->SetPARP(93, 4. * fPtKick);
8d2cd130 422 } else {
423 fPythia->SetMSTP(91,0);
424 }
425
64da86aa 426 if (fReadLHEF) fPythia->OpenFortranFile(97, const_cast<char*>(fkNameLHEF));
427
5fa4b20b 428 if (fReadFromFile) {
777e69b0 429 fRL = AliRunLoader::Open(fkFileName, "Partons");
5fa4b20b 430 fRL->LoadKinematics();
431 fRL->LoadHeader();
432 } else {
433 fRL = 0x0;
434 }
fdea4387 435 //
efe3b1cd 436 fPythia->ProcInit(fProcess,fEnergyCMS,fStrucFunc, fItune);
fdea4387 437 // Forward Paramters to the AliPythia object
438 fDecayer->SetForceDecay(fForceDecay);
beac474c 439// Switch off Heavy Flavors on request
440 if (fHFoff) {
51387949 441 // Maximum number of quark flavours used in pdf
beac474c 442 fPythia->SetMSTP(58, 3);
51387949 443 // Maximum number of flavors that can be used in showers
beac474c 444 fPythia->SetMSTJ(45, 3);
51387949 445 // Switch off g->QQbar splitting in decay table
446 ((AliDecayerPythia*) fDecayer)->HeavyFlavourOff();
beac474c 447 }
fdea4387 448
51387949 449 fDecayer->Init();
450
8d2cd130 451
452// Parent and Children Selection
453 switch (fProcess)
454 {
65f2626c 455 case kPyOldUEQ2ordered:
456 case kPyOldUEQ2ordered2:
457 case kPyOldPopcorn:
458 break;
8d2cd130 459 case kPyCharm:
460 case kPyCharmUnforced:
adf4d898 461 case kPyCharmPbPbMNR:
aabc7187 462 case kPyCharmpPbMNR:
e0e89f40 463 case kPyCharmppMNR:
464 case kPyCharmppMNRwmi:
64da86aa 465 case kPyCharmPWHG:
8d2cd130 466 fParentSelect[0] = 411;
467 fParentSelect[1] = 421;
468 fParentSelect[2] = 431;
469 fParentSelect[3] = 4122;
9ccc3d0e 470 fParentSelect[4] = 4232;
471 fParentSelect[5] = 4132;
472 fParentSelect[6] = 4332;
8d2cd130 473 fFlavorSelect = 4;
474 break;
adf4d898 475 case kPyD0PbPbMNR:
476 case kPyD0pPbMNR:
477 case kPyD0ppMNR:
8d2cd130 478 fParentSelect[0] = 421;
479 fFlavorSelect = 4;
480 break;
90d7b703 481 case kPyDPlusPbPbMNR:
482 case kPyDPluspPbMNR:
483 case kPyDPlusppMNR:
484 fParentSelect[0] = 411;
485 fFlavorSelect = 4;
486 break;
e0e89f40 487 case kPyDPlusStrangePbPbMNR:
488 case kPyDPlusStrangepPbMNR:
489 case kPyDPlusStrangeppMNR:
490 fParentSelect[0] = 431;
491 fFlavorSelect = 4;
492 break;
68504d42 493 case kPyLambdacppMNR:
494 fParentSelect[0] = 4122;
495 fFlavorSelect = 4;
496 break;
8d2cd130 497 case kPyBeauty:
9dfe63b3 498 case kPyBeautyJets:
adf4d898 499 case kPyBeautyPbPbMNR:
500 case kPyBeautypPbMNR:
501 case kPyBeautyppMNR:
e0e89f40 502 case kPyBeautyppMNRwmi:
64da86aa 503 case kPyBeautyPWHG:
8d2cd130 504 fParentSelect[0]= 511;
505 fParentSelect[1]= 521;
506 fParentSelect[2]= 531;
507 fParentSelect[3]= 5122;
508 fParentSelect[4]= 5132;
509 fParentSelect[5]= 5232;
510 fParentSelect[6]= 5332;
511 fFlavorSelect = 5;
512 break;
513 case kPyBeautyUnforced:
514 fParentSelect[0] = 511;
515 fParentSelect[1] = 521;
516 fParentSelect[2] = 531;
517 fParentSelect[3] = 5122;
518 fParentSelect[4] = 5132;
519 fParentSelect[5] = 5232;
520 fParentSelect[6] = 5332;
521 fFlavorSelect = 5;
522 break;
523 case kPyJpsiChi:
524 case kPyJpsi:
525 fParentSelect[0] = 443;
526 break;
f529e69b 527 case kPyMbDefault:
0bd3d7c5 528 case kPyMbAtlasTuneMC09:
8d2cd130 529 case kPyMb:
04081a91 530 case kPyMbWithDirectPhoton:
8d2cd130 531 case kPyMbNonDiffr:
d7de4a67 532 case kPyMbMSEL1:
8d2cd130 533 case kPyJets:
64da86aa 534 case kPyJetsPWHG:
8d2cd130 535 case kPyDirectGamma:
e33acb67 536 case kPyLhwgMb:
8d2cd130 537 break;
df607629 538 case kPyWPWHG:
589380c6 539 case kPyW:
0f6ee828 540 case kPyZ:
df607629 541 case kPyZgamma:
9a8774a1 542 case kPyMBRSingleDiffraction:
543 case kPyMBRDoubleDiffraction:
544 case kPyMBRCentralDiffraction:
589380c6 545 break;
8d2cd130 546 }
547//
592f8307 548//
549// JetFinder for Trigger
550//
551// Configure detector (EMCAL like)
552//
d7de4a67 553 fPythia->SetPARU(51, fPycellEtaMax);
554 fPythia->SetMSTU(51, fPycellNEta);
555 fPythia->SetMSTU(52, fPycellNPhi);
592f8307 556//
557// Configure Jet Finder
558//
d7de4a67 559 fPythia->SetPARU(58, fPycellThreshold);
560 fPythia->SetPARU(52, fPycellEtSeed);
561 fPythia->SetPARU(53, fPycellMinEtJet);
562 fPythia->SetPARU(54, fPycellMaxRadius);
563 fPythia->SetMSTU(54, 2);
592f8307 564//
8d2cd130 565// This counts the total number of calls to Pyevnt() per run.
566 fTrialsRun = 0;
567 fQ = 0.;
568 fX1 = 0.;
569 fX2 = 0.;
570 fNev = 0 ;
571//
1d568bc2 572//
573//
8d2cd130 574 AliGenMC::Init();
fb355e51 575
576 // Reset Lorentz boost if demanded
577 if(!fUseLorentzBoost) {
578 fDyBoost = 0;
579 Warning("Init","Demand to discard Lorentz boost.\n");
580 }
1d568bc2 581//
582//
583//
584 if (fSetNuclei) {
fb355e51 585 fDyBoost = 0;
586 Warning("Init","Deprecated function SetNuclei() used (nPDFs + no boost). Use SetProjectile + SetTarget + SetUseNuclearPDF + SetUseLorentzBoost instead.\n");
1d568bc2 587 }
cd07c39b 588 fPythia->SetPARJ(200, 0.0);
589 fPythia->SetPARJ(199, 0.0);
590 fPythia->SetPARJ(198, 0.0);
591 fPythia->SetPARJ(197, 0.0);
592
593 if (fQuench == 1) {
5fa4b20b 594 fPythia->InitQuenching(0., 0.1, 0.6e6, 0);
32d6ef7d 595 }
3a709cfa 596
66b8652c 597 if(fQuench ==2){fPythia->SetPyquenParameters(fpyquenT,fpyquenTau,fpyquenNf,fpyquenEloss,fpyquenAngle);}
598
b976f7d8 599 if (fQuench == 3) {
600 // Nestor's change of the splittings
601 fPythia->SetPARJ(200, 0.8);
602 fPythia->SetMSTJ(41, 1); // QCD radiation only
603 fPythia->SetMSTJ(42, 2); // angular ordering
604 fPythia->SetMSTJ(44, 2); // option to run alpha_s
605 fPythia->SetMSTJ(47, 0); // No correction back to hard scattering element
606 fPythia->SetMSTJ(50, 0); // No coherence in first branching
607 fPythia->SetPARJ(82, 1.); // Cut off for parton showers
cd07c39b 608 } else if (fQuench == 4) {
609 // Armesto-Cunqueiro-Salgado change of the splittings.
610 AliFastGlauber* glauber = AliFastGlauber::Instance();
611 glauber->Init(2);
612 //read and store transverse almonds corresponding to differnt
613 //impact parameters.
cd07c39b 614 glauber->SetCentralityClass(0.,0.1);
615 fPythia->SetPARJ(200, 1.);
616 fPythia->SetPARJ(198, fQhat);
617 fPythia->SetPARJ(199, fLength);
cd07c39b 618 fPythia->SetMSTJ(42, 2); // angular ordering
619 fPythia->SetMSTJ(44, 2); // option to run alpha_s
cd07c39b 620 fPythia->SetPARJ(82, 1.); // Cut off for parton showers
b976f7d8 621 }
df607629 622
68c5eace 623 if ( AliLog::GetDebugLevel("","AliGenPythia") >= 1 ) {
624 fPythia->Pystat(4);
625 fPythia->Pystat(5);
626 }
8d2cd130 627}
628
629void AliGenPythia::Generate()
630{
631// Generate one event
19ef8cf0 632 if (!fPythia) fPythia=(AliPythia*) fMCEvGen;
8d2cd130 633 fDecayer->ForceDecay();
634
13cca24a 635 Double_t polar[3] = {0,0,0};
636 Double_t origin[3] = {0,0,0};
637 Double_t p[4];
8d2cd130 638// converts from mm/c to s
639 const Float_t kconv=0.001/2.999792458e8;
640//
641 Int_t nt=0;
642 Int_t jev=0;
643 Int_t j, kf;
644 fTrials=0;
f913ec4f 645 fEventTime = 0.;
646
2590ccf9 647
8d2cd130 648
649 // Set collision vertex position
2590ccf9 650 if (fVertexSmear == kPerEvent) Vertex();
651
8d2cd130 652// event loop
653 while(1)
654 {
32d6ef7d 655//
5fa4b20b 656// Produce event
32d6ef7d 657//
32d6ef7d 658//
5fa4b20b 659// Switch hadronisation off
660//
661 fPythia->SetMSTJ(1, 0);
cd07c39b 662
663 if (fQuench ==4){
664 Double_t bimp;
665 // Quenching comes through medium-modified splitting functions.
666 AliFastGlauber::Instance()->GetRandomBHard(bimp);
e6fe9b82 667 fPythia->SetPARJ(197, bimp);
668 fImpact = bimp;
6c43eccb 669 fPythia->Qpygin0();
cd07c39b 670 }
32d6ef7d 671//
5fa4b20b 672// Either produce new event or read partons from file
673//
674 if (!fReadFromFile) {
beac474c 675 if (!fNewMIS) {
676 fPythia->Pyevnt();
677 } else {
678 fPythia->Pyevnw();
679 }
5fa4b20b 680 fNpartons = fPythia->GetN();
681 } else {
33c3c91a 682 printf("Loading Event %d\n",AliRunLoader::Instance()->GetEventNumber());
683 fRL->GetEvent(AliRunLoader::Instance()->GetEventNumber());
5fa4b20b 684 fPythia->SetN(0);
685 LoadEvent(fRL->Stack(), 0 , 1);
686 fPythia->Pyedit(21);
687 }
688
32d6ef7d 689//
690// Run quenching routine
691//
5fa4b20b 692 if (fQuench == 1) {
693 fPythia->Quench();
694 } else if (fQuench == 2){
695 fPythia->Pyquen(208., 0, 0.);
b976f7d8 696 } else if (fQuench == 3) {
697 // Quenching is via multiplicative correction of the splittings
5fa4b20b 698 }
b976f7d8 699
32d6ef7d 700//
5fa4b20b 701// Switch hadronisation on
32d6ef7d 702//
20e47f08 703 if (fHadronisation) {
704 fPythia->SetMSTJ(1, 1);
5fa4b20b 705//
706// .. and perform hadronisation
aea21c57 707// printf("Calling hadronisation %d\n", fPythia->GetN());
03358a32 708
709 if (fPatchOmegaDalitz) {
710 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 0);
711 fPythia->Pyexec();
712 fPythia->DalitzDecays();
713 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 1);
714 }
d7d0c637 715
716 else if (fDecayerExodus) {
717
718 fPythia->SetMDCY(fPythia->Pycomp(22) ,1, 0);
719 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 0);
720 fPythia->SetMDCY(fPythia->Pycomp(221) ,1, 0);
721 fPythia->Pyexec();
722 fPythia->OmegaDalitz();
723 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 1);
724 fPythia->PizeroDalitz();
725 fPythia->PhiDalitz();
726 fPythia->SetMDCY(fPythia->Pycomp(221) ,1, 1);
727 fPythia->EtaDalitz();
728 fPythia->EtaprimeDalitz();
729 fPythia->SetMDCY(fPythia->Pycomp(22) ,1, 1);
730 fPythia->RhoDirect();
731 fPythia->OmegaDirect();
732 fPythia->PhiDirect();
733 fPythia->JPsiDirect();
734 }
735
736 fPythia->Pyexec();
737 }
8d2cd130 738 fTrials++;
8507138f 739 fPythia->ImportParticles(&fParticles,"All");
03358a32 740
df275cfa 741 if (TMath::Abs(fDyBoost) > 1.e-4) Boost();
e1cf8975 742 if(TMath::Abs(fXingAngleY) > 1.e-10) BeamCrossAngle();
f64640b5 743
8d2cd130 744//
745//
746//
747 Int_t i;
748
dbd64db6 749 fNprimaries = 0;
8507138f 750 Int_t np = fParticles.GetEntriesFast();
5fa4b20b 751
7c21f297 752 if (np == 0) continue;
8d2cd130 753//
2590ccf9 754
8d2cd130 755//
756 Int_t* pParent = new Int_t[np];
757 Int_t* pSelected = new Int_t[np];
758 Int_t* trackIt = new Int_t[np];
5fa4b20b 759 for (i = 0; i < np; i++) {
8d2cd130 760 pParent[i] = -1;
761 pSelected[i] = 0;
762 trackIt[i] = 0;
763 }
764
765 Int_t nc = 0; // Total n. of selected particles
766 Int_t nParents = 0; // Selected parents
767 Int_t nTkbles = 0; // Trackable particles
f529e69b 768 if (fProcess != kPyMbDefault &&
769 fProcess != kPyMb &&
6d2ec66d 770 fProcess != kPyMbAtlasTuneMC09 &&
04081a91 771 fProcess != kPyMbWithDirectPhoton &&
f529e69b 772 fProcess != kPyJets &&
8d2cd130 773 fProcess != kPyDirectGamma &&
589380c6 774 fProcess != kPyMbNonDiffr &&
d7de4a67 775 fProcess != kPyMbMSEL1 &&
f529e69b 776 fProcess != kPyW &&
777 fProcess != kPyZ &&
1f0caa6a 778 fProcess != kPyZgamma &&
f529e69b 779 fProcess != kPyCharmppMNRwmi &&
9dfe63b3 780 fProcess != kPyBeautyppMNRwmi &&
64da86aa 781 fProcess != kPyBeautyJets &&
1f0caa6a 782 fProcess != kPyWPWHG &&
783 fProcess != kPyJetsPWHG &&
784 fProcess != kPyCharmPWHG &&
785 fProcess != kPyBeautyPWHG) {
8d2cd130 786
5fa4b20b 787 for (i = 0; i < np; i++) {
8507138f 788 TParticle* iparticle = (TParticle *) fParticles.At(i);
8d2cd130 789 Int_t ks = iparticle->GetStatusCode();
790 kf = CheckPDGCode(iparticle->GetPdgCode());
791// No initial state partons
792 if (ks==21) continue;
793//
794// Heavy Flavor Selection
795//
796 // quark ?
797 kf = TMath::Abs(kf);
798 Int_t kfl = kf;
9ff6c04c 799 // Resonance
f913ec4f 800
9ff6c04c 801 if (kfl > 100000) kfl %= 100000;
183a5ca9 802 if (kfl > 10000) kfl %= 10000;
8d2cd130 803 // meson ?
804 if (kfl > 10) kfl/=100;
805 // baryon
806 if (kfl > 10) kfl/=10;
8d2cd130 807 Int_t ipa = iparticle->GetFirstMother()-1;
808 Int_t kfMo = 0;
f913ec4f 809//
810// Establish mother daughter relation between heavy quarks and mesons
811//
812 if (kf >= fFlavorSelect && kf <= 6) {
813 Int_t idau = iparticle->GetFirstDaughter() - 1;
814 if (idau > -1) {
8507138f 815 TParticle* daughter = (TParticle *) fParticles.At(idau);
f913ec4f 816 Int_t pdgD = daughter->GetPdgCode();
817 if (pdgD == 91 || pdgD == 92) {
818 Int_t jmin = daughter->GetFirstDaughter() - 1;
819 Int_t jmax = daughter->GetLastDaughter() - 1;
2ab330c9 820 for (Int_t jp = jmin; jp <= jmax; jp++)
821 ((TParticle *) fParticles.At(jp))->SetFirstMother(i+1);
f913ec4f 822 } // is string or cluster
823 } // has daughter
824 } // heavy quark
8d2cd130 825
f913ec4f 826
8d2cd130 827 if (ipa > -1) {
8507138f 828 TParticle * mother = (TParticle *) fParticles.At(ipa);
8d2cd130 829 kfMo = TMath::Abs(mother->GetPdgCode());
830 }
f913ec4f 831
8d2cd130 832 // What to keep in Stack?
833 Bool_t flavorOK = kFALSE;
834 Bool_t selectOK = kFALSE;
835 if (fFeedDownOpt) {
32d6ef7d 836 if (kfl >= fFlavorSelect) flavorOK = kTRUE;
8d2cd130 837 } else {
32d6ef7d 838 if (kfl > fFlavorSelect) {
839 nc = -1;
840 break;
841 }
842 if (kfl == fFlavorSelect) flavorOK = kTRUE;
8d2cd130 843 }
844 switch (fStackFillOpt) {
06956108 845 case kHeavyFlavor:
8d2cd130 846 case kFlavorSelection:
32d6ef7d 847 selectOK = kTRUE;
848 break;
8d2cd130 849 case kParentSelection:
32d6ef7d 850 if (ParentSelected(kf) || kf <= 10) selectOK = kTRUE;
851 break;
8d2cd130 852 }
853 if (flavorOK && selectOK) {
854//
855// Heavy flavor hadron or quark
856//
857// Kinematic seletion on final state heavy flavor mesons
858 if (ParentSelected(kf) && !KinematicSelection(iparticle, 0))
859 {
9ff6c04c 860 continue;
8d2cd130 861 }
862 pSelected[i] = 1;
863 if (ParentSelected(kf)) ++nParents; // Update parent count
864// printf("\n particle (HF) %d %d %d", i, pSelected[i], kf);
865 } else {
866// Kinematic seletion on decay products
867 if (fCutOnChild && ParentSelected(kfMo) && ChildSelected(kf)
9ff6c04c 868 && !KinematicSelection(iparticle, 1))
8d2cd130 869 {
9ff6c04c 870 continue;
8d2cd130 871 }
872//
873// Decay products
874// Select if mother was selected and is not tracked
875
876 if (pSelected[ipa] &&
877 !trackIt[ipa] && // mother will be tracked ?
878 kfMo != 5 && // mother is b-quark, don't store fragments
879 kfMo != 4 && // mother is c-quark, don't store fragments
880 kf != 92) // don't store string
881 {
882//
883// Semi-stable or de-selected: diselect decay products:
884//
885//
886 if (pSelected[i] == -1 || fDecayer->GetLifetime(kf) > fMaxLifeTime)
887 {
888 Int_t ipF = iparticle->GetFirstDaughter();
889 Int_t ipL = iparticle->GetLastDaughter();
890 if (ipF > 0) for (j = ipF-1; j < ipL; j++) pSelected[j] = -1;
891 }
892// printf("\n particle (decay) %d %d %d", i, pSelected[i], kf);
893 pSelected[i] = (pSelected[i] == -1) ? 0 : 1;
894 }
895 }
896 if (pSelected[i] == -1) pSelected[i] = 0;
897 if (!pSelected[i]) continue;
898 // Count quarks only if you did not include fragmentation
899 if (fFragmentation && kf <= 10) continue;
9ff6c04c 900
8d2cd130 901 nc++;
902// Decision on tracking
903 trackIt[i] = 0;
904//
905// Track final state particle
906 if (ks == 1) trackIt[i] = 1;
907// Track semi-stable particles
d25cfd65 908 if ((ks == 1) || (fDecayer->GetLifetime(kf) > fMaxLifeTime)) trackIt[i] = 1;
8d2cd130 909// Track particles selected by process if undecayed.
910 if (fForceDecay == kNoDecay) {
911 if (ParentSelected(kf)) trackIt[i] = 1;
912 } else {
913 if (ParentSelected(kf)) trackIt[i] = 0;
914 }
915 if (trackIt[i] == 1) ++nTkbles; // Update trackable counter
916//
917//
918
919 } // particle selection loop
920 if (nc > 0) {
921 for (i = 0; i<np; i++) {
922 if (!pSelected[i]) continue;
8507138f 923 TParticle * iparticle = (TParticle *) fParticles.At(i);
8d2cd130 924 kf = CheckPDGCode(iparticle->GetPdgCode());
925 Int_t ks = iparticle->GetStatusCode();
926 p[0] = iparticle->Px();
927 p[1] = iparticle->Py();
928 p[2] = iparticle->Pz();
a920faf9 929 p[3] = iparticle->Energy();
930
2590ccf9 931 origin[0] = fVertex[0]+iparticle->Vx()/10; // [cm]
932 origin[1] = fVertex[1]+iparticle->Vy()/10; // [cm]
933 origin[2] = fVertex[2]+iparticle->Vz()/10; // [cm]
934
21391258 935 Float_t tof = fTime + kconv*iparticle->T();
8d2cd130 936 Int_t ipa = iparticle->GetFirstMother()-1;
937 Int_t iparent = (ipa > -1) ? pParent[ipa] : -1;
a920faf9 938
939 PushTrack(fTrackIt*trackIt[i], iparent, kf,
940 p[0], p[1], p[2], p[3],
941 origin[0], origin[1], origin[2], tof,
942 polar[0], polar[1], polar[2],
943 kPPrimary, nt, 1., ks);
8d2cd130 944 pParent[i] = nt;
dbd64db6 945 KeepTrack(nt);
946 fNprimaries++;
642f15cf 947 } // PushTrack loop
8d2cd130 948 }
949 } else {
950 nc = GenerateMB();
951 } // mb ?
f913ec4f 952
953 GetSubEventTime();
8d2cd130 954
234f6d32 955 delete[] pParent;
956 delete[] pSelected;
957 delete[] trackIt;
8d2cd130 958
959 if (nc > 0) {
960 switch (fCountMode) {
961 case kCountAll:
962 // printf(" Count all \n");
963 jev += nc;
964 break;
965 case kCountParents:
966 // printf(" Count parents \n");
967 jev += nParents;
968 break;
969 case kCountTrackables:
970 // printf(" Count trackable \n");
971 jev += nTkbles;
972 break;
973 }
974 if (jev >= fNpart || fNpart == -1) {
975 fKineBias=Float_t(fNpart)/Float_t(fTrials);
e0e89f40 976
8d2cd130 977 fQ += fPythia->GetVINT(51);
978 fX1 += fPythia->GetVINT(41);
979 fX2 += fPythia->GetVINT(42);
980 fTrialsRun += fTrials;
981 fNev++;
982 MakeHeader();
983 break;
984 }
985 }
986 } // event loop
987 SetHighWaterMark(nt);
988// adjust weight due to kinematic selection
b88f5cea 989// AdjustWeights();
8d2cd130 990// get cross-section
991 fXsection=fPythia->GetPARI(1);
992}
993
994Int_t AliGenPythia::GenerateMB()
995{
996//
997// Min Bias selection and other global selections
998//
999 Int_t i, kf, nt, iparent;
1000 Int_t nc = 0;
13cca24a 1001 Double_t p[4];
1002 Double_t polar[3] = {0,0,0};
1003 Double_t origin[3] = {0,0,0};
8d2cd130 1004// converts from mm/c to s
1005 const Float_t kconv=0.001/2.999792458e8;
1006
e0e89f40 1007
8507138f 1008 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
aea21c57 1009
5fa4b20b 1010
e0e89f40 1011
8d2cd130 1012 Int_t* pParent = new Int_t[np];
1013 for (i=0; i< np; i++) pParent[i] = -1;
64da86aa 1014 if ((fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG)
0e9e66f0 1015 && fEtMinJet > 0.) {
bed3df2c 1016 TParticle* jet1 = (TParticle *) fParticles.At(6);
8507138f 1017 TParticle* jet2 = (TParticle *) fParticles.At(7);
bed3df2c 1018
1019 if (!jet1 || ! jet2 || !CheckTrigger(jet1, jet2)) {
234f6d32 1020 delete [] pParent;
1021 return 0;
1022 }
8d2cd130 1023 }
e0e89f40 1024
40fe59d4 1025
1026 // Select events with fragmentation photon, decay photon, pi0, eta or other hadrons going to PHOS or EMCAL or central barrel,
ac01c7c6 1027 // implemented primaryly for kPyJets, but extended to any kind of process.
40fe59d4 1028 if ((fFragPhotonInCalo || fPi0InCalo || fEtaInCalo || fEleInCalo || fHadronInCalo || fDecayPhotonInCalo) &&
1029 (fCheckPHOS || fCheckEMCAL || fCheckBarrel) ) {
1030 Bool_t ok = TriggerOnSelectedParticles(np);
43e3b80a 1031
1032 if(!ok) {
1033 delete[] pParent;
1034 return 0;
ec2c406e 1035 }
43e3b80a 1036 }
9dfe63b3 1037
800be8b7 1038 // Check for diffraction
1039 if(fkTuneForDiff) {
c5dfa3e4 1040 if(fItune==320 && ( (TMath::Abs(fEnergyCMS - 900) < 1) || (TMath::Abs(fEnergyCMS - 2760) < 1) || (TMath::Abs(fEnergyCMS - 7000) < 1)) ) {
800be8b7 1041 if(!CheckDiffraction()) {
1042 delete [] pParent;
1043 return 0;
1044 }
1045 }
1046 }
1047
700b9416 1048 // Check for minimum multiplicity
1049 if (fTriggerMultiplicity > 0) {
1050 Int_t multiplicity = 0;
1051 for (i = 0; i < np; i++) {
8507138f 1052 TParticle * iparticle = (TParticle *) fParticles.At(i);
700b9416 1053
1054 Int_t statusCode = iparticle->GetStatusCode();
1055
1056 // Initial state particle
e296848e 1057 if (statusCode != 1)
700b9416 1058 continue;
38112f3f 1059 // eta cut
700b9416 1060 if (fTriggerMultiplicityEta > 0 && TMath::Abs(iparticle->Eta()) > fTriggerMultiplicityEta)
1061 continue;
440c2873 1062 //multiplicity check for a given eta range
1063 if ((fTriggerMultiplicityEtaMin != fTriggerMultiplicityEtaMax) &&
1064 (iparticle->Eta() < fTriggerMultiplicityEtaMin || iparticle->Eta() > fTriggerMultiplicityEtaMax))
1065 continue;
38112f3f 1066 // pt cut
1067 if (iparticle->Pt() < fTriggerMultiplicityPtMin)
1068 continue;
1069
700b9416 1070 TParticlePDG* pdgPart = iparticle->GetPDG();
1071 if (pdgPart && pdgPart->Charge() == 0)
1072 continue;
1073
1074 ++multiplicity;
1075 }
1076
1077 if (multiplicity < fTriggerMultiplicity) {
1078 delete [] pParent;
1079 return 0;
1080 }
38112f3f 1081 Printf("Triggered on event with multiplicity of %d >= %d", multiplicity, fTriggerMultiplicity);
700b9416 1082 }
90a236ce 1083
90a236ce 1084
7ce1321b 1085 if (fTriggerParticle) {
1086 Bool_t triggered = kFALSE;
1087 for (i = 0; i < np; i++) {
8507138f 1088 TParticle * iparticle = (TParticle *) fParticles.At(i);
7ce1321b 1089 kf = CheckPDGCode(iparticle->GetPdgCode());
38db0ee6 1090 if (kf != fTriggerParticle) continue;
7ce1321b 1091 if (iparticle->Pt() == 0.) continue;
1f0caa6a 1092 if (fTriggerEtaMin == fTriggerEta) {
1093 if (TMath::Abs(iparticle->Eta()) > fTriggerEta) continue;
1094 } else {
1095 if (iparticle->Eta() > fTriggerEta || iparticle->Eta() < fTriggerEtaMin) continue;
1096 }
2591bd0e 1097 if ( iparticle->Pt() > fTriggerMaxPt || iparticle->Pt() < fTriggerMinPt ) continue;
7ce1321b 1098 triggered = kTRUE;
1099 break;
1100 }
234f6d32 1101 if (!triggered) {
1102 delete [] pParent;
1103 return 0;
1104 }
7ce1321b 1105 }
e0e89f40 1106
1107
1108 // Check if there is a ccbar or bbbar pair with at least one of the two
1109 // in fYMin < y < fYMax
2f405d65 1110
9dfe63b3 1111 if (fProcess == kPyCharmppMNRwmi || fProcess == kPyBeautyppMNRwmi || fProcess == kPyBeautyJets) {
9ccc3d0e 1112 TParticle *partCheck;
1113 TParticle *mother;
e0e89f40 1114 Bool_t theQ=kFALSE,theQbar=kFALSE,inYcut=kFALSE;
9ccc3d0e 1115 Bool_t theChild=kFALSE;
5d76923e 1116 Bool_t triggered=kFALSE;
9ccc3d0e 1117 Float_t y;
1f0caa6a 1118 Int_t pdg, mpdg, mpdgUpperFamily;
1119 for(i = 0; i < np; i++) {
9ccc3d0e 1120 partCheck = (TParticle*)fParticles.At(i);
1121 pdg = partCheck->GetPdgCode();
1122 if(TMath::Abs(pdg) == fFlavorSelect) { // quark
1123 if(pdg>0) { theQ=kTRUE; } else { theQbar=kTRUE; }
1124 y = 0.5*TMath::Log((partCheck->Energy()+partCheck->Pz()+1.e-13)/
1125 (partCheck->Energy()-partCheck->Pz()+1.e-13));
1126 if(y>fYMin && y<fYMax) inYcut=kTRUE;
1127 }
5d76923e 1128 if(fTriggerParticle) {
1129 if(TMath::Abs(pdg)==fTriggerParticle) triggered=kTRUE;
1130 }
9ccc3d0e 1131 if(fCutOnChild && TMath::Abs(pdg) == fPdgCodeParticleforAcceptanceCut) {
1132 Int_t mi = partCheck->GetFirstMother() - 1;
1133 if(mi<0) continue;
1134 mother = (TParticle*)fParticles.At(mi);
1135 mpdg=TMath::Abs(mother->GetPdgCode());
75fde694 1136 mpdgUpperFamily=(mpdg>1000 ? mpdg+1000 : mpdg+100); // keep e from c from b
9ccc3d0e 1137 if ( ParentSelected(mpdg) ||
1138 (fFlavorSelect==5 && ParentSelected(mpdgUpperFamily))) {
1139 if (KinematicSelection(partCheck,1)) {
1140 theChild=kTRUE;
1141 }
1142 }
1143 }
e0e89f40 1144 }
9ccc3d0e 1145 if (!theQ || !theQbar || !inYcut) { // one of the c/b conditions not satisfied
234f6d32 1146 delete[] pParent;
e0e89f40 1147 return 0;
1148 }
9ccc3d0e 1149 if (fCutOnChild && !theChild) { // one of the child conditions not satisfied
1150 delete[] pParent;
1151 return 0;
1152 }
5d76923e 1153 if(fTriggerParticle && !triggered) { // particle requested is not produced
1154 delete[] pParent;
1155 return 0;
1156 }
9ccc3d0e 1157
e0e89f40 1158 }
aea21c57 1159
0f6ee828 1160 //Introducing child cuts in case kPyW, kPyZ, kPyMb, and kPyMbNonDiff
e136a92a 1161 if ( (
1f0caa6a 1162 fProcess == kPyWPWHG ||
1163 fProcess == kPyW ||
f529e69b 1164 fProcess == kPyZ ||
1f0caa6a 1165 fProcess == kPyZgamma ||
f529e69b 1166 fProcess == kPyMbDefault ||
1167 fProcess == kPyMb ||
6d2ec66d 1168 fProcess == kPyMbAtlasTuneMC09 ||
04081a91 1169 fProcess == kPyMbWithDirectPhoton ||
f529e69b 1170 fProcess == kPyMbNonDiffr)
0f6ee828 1171 && (fCutOnChild == 1) ) {
1172 if ( !CheckKinematicsOnChild() ) {
234f6d32 1173 delete[] pParent;
0f6ee828 1174 return 0;
1175 }
aea21c57 1176 }
1f0caa6a 1177
aea21c57 1178
f913ec4f 1179 for (i = 0; i < np; i++) {
8d2cd130 1180 Int_t trackIt = 0;
8507138f 1181 TParticle * iparticle = (TParticle *) fParticles.At(i);
8d2cd130 1182 kf = CheckPDGCode(iparticle->GetPdgCode());
1183 Int_t ks = iparticle->GetStatusCode();
1184 Int_t km = iparticle->GetFirstMother();
06956108 1185 if (
1186 (((ks == 1 && kf!=0 && KinematicSelection(iparticle, 0)) || (ks !=1)) && ((fStackFillOpt != kHeavyFlavor) || IsFromHeavyFlavor(i))) ||
64da86aa 1187 ((fProcess == kPyJets || fProcess == kPyBeautyJets || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG) && ks == 21 && km == 0 && i>1)
06956108 1188 )
1189 {
1190 nc++;
8d2cd130 1191 if (ks == 1) trackIt = 1;
1192 Int_t ipa = iparticle->GetFirstMother()-1;
1193
1194 iparent = (ipa > -1) ? pParent[ipa] : -1;
1195
1196//
1197// store track information
1198 p[0] = iparticle->Px();
1199 p[1] = iparticle->Py();
1200 p[2] = iparticle->Pz();
a920faf9 1201 p[3] = iparticle->Energy();
1406f599 1202
a920faf9 1203
2590ccf9 1204 origin[0] = fVertex[0]+iparticle->Vx()/10; // [cm]
1205 origin[1] = fVertex[1]+iparticle->Vy()/10; // [cm]
1206 origin[2] = fVertex[2]+iparticle->Vz()/10; // [cm]
1207
21391258 1208 Float_t tof = fTime + fEventTime + kconv * iparticle->T();
a920faf9 1209
1210 PushTrack(fTrackIt*trackIt, iparent, kf,
1211 p[0], p[1], p[2], p[3],
1212 origin[0], origin[1], origin[2], tof,
1213 polar[0], polar[1], polar[2],
1214 kPPrimary, nt, 1., ks);
dbd64db6 1215 fNprimaries++;
8d2cd130 1216 KeepTrack(nt);
1217 pParent[i] = nt;
f913ec4f 1218 SetHighWaterMark(nt);
1219
8d2cd130 1220 } // select particle
1221 } // particle loop
1222
234f6d32 1223 delete[] pParent;
e0e89f40 1224
f913ec4f 1225 return 1;
8d2cd130 1226}
1227
1228
1229void AliGenPythia::FinishRun()
1230{
1231// Print x-section summary
1232 fPythia->Pystat(1);
2779fc64 1233
1234 if (fNev > 0.) {
1235 fQ /= fNev;
1236 fX1 /= fNev;
1237 fX2 /= fNev;
1238 }
1239
8d2cd130 1240 printf("\nTotal number of Pyevnt() calls %d\n", fTrialsRun);
1241 printf("\nMean Q, x1, x2: %f %f %f\n", fQ, fX1, fX2);
8d2cd130 1242}
1243
7184e472 1244void AliGenPythia::AdjustWeights() const
8d2cd130 1245{
1246// Adjust the weights after generation of all events
1247//
e2bddf81 1248 if (gAlice) {
1249 TParticle *part;
1250 Int_t ntrack=gAlice->GetMCApp()->GetNtrack();
1251 for (Int_t i=0; i<ntrack; i++) {
1252 part= gAlice->GetMCApp()->Particle(i);
1253 part->SetWeight(part->GetWeight()*fKineBias);
1254 }
8d2cd130 1255 }
1256}
1257
20e47f08 1258void AliGenPythia::SetNuclei(Int_t a1, Int_t a2, Int_t pdfset)
8d2cd130 1259{
1260// Treat protons as inside nuclei with mass numbers a1 and a2
1d568bc2 1261
fb355e51 1262 fAProjectile = a1;
1263 fATarget = a2;
1264 fNucPdf = pdfset; // 0 EKS98 9 EPS09LO 19 EPS09NLO
1265 fUseNuclearPDF = kTRUE;
1266 fSetNuclei = kTRUE;
8d2cd130 1267}
1268
1269
1270void AliGenPythia::MakeHeader()
1271{
7184e472 1272//
1273// Make header for the simulated event
1274//
183a5ca9 1275 if (gAlice) {
1276 if (gAlice->GetEvNumber()>=fDebugEventFirst &&
f913ec4f 1277 gAlice->GetEvNumber()<=fDebugEventLast) fPythia->Pylist(2);
183a5ca9 1278 }
1279
8d2cd130 1280// Builds the event header, to be called after each event
e5c87a3d 1281 if (fHeader) delete fHeader;
1282 fHeader = new AliGenPythiaEventHeader("Pythia");
8d2cd130 1283//
1284// Event type
800be8b7 1285 if(fProcDiff>0){
1286 // if(fProcDiff == 92 || fProcDiff == 93) printf("\n\n\n\n\n");
1287 // printf("fPythia->GetMSTI(1) = %d fProcDiff = %d\n",fPythia->GetMSTI(1), fProcDiff);
1288 ((AliGenPythiaEventHeader*) fHeader)->SetProcessType(fProcDiff);
1289 }
1290 else
e5c87a3d 1291 ((AliGenPythiaEventHeader*) fHeader)->SetProcessType(fPythia->GetMSTI(1));
8d2cd130 1292//
1293// Number of trials
e5c87a3d 1294 ((AliGenPythiaEventHeader*) fHeader)->SetTrials(fTrials);
8d2cd130 1295//
1296// Event Vertex
d25cfd65 1297 fHeader->SetPrimaryVertex(fVertex);
21391258 1298 fHeader->SetInteractionTime(fTime+fEventTime);
dbd64db6 1299//
1300// Number of primaries
1301 fHeader->SetNProduced(fNprimaries);
8d2cd130 1302//
a0027228 1303// Event weight
1304 fHeader->SetEventWeight(fPythia->GetVINT(97));
1305//
8d2cd130 1306// Jets that have triggered
f913ec4f 1307
9dfe63b3 1308 //Need to store jets for b-jet studies too!
64da86aa 1309 if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG)
8d2cd130 1310 {
1311 Int_t ntrig, njet;
1312 Float_t jets[4][10];
1313 GetJets(njet, ntrig, jets);
9ff6c04c 1314
8d2cd130 1315
1316 for (Int_t i = 0; i < ntrig; i++) {
e5c87a3d 1317 ((AliGenPythiaEventHeader*) fHeader)->AddJet(jets[0][i], jets[1][i], jets[2][i],
8d2cd130 1318 jets[3][i]);
1319 }
1320 }
5fa4b20b 1321//
1322// Copy relevant information from external header, if present.
1323//
1324 Float_t uqJet[4];
1325
1326 if (fRL) {
1327 AliGenPythiaEventHeader* exHeader = (AliGenPythiaEventHeader*) (fRL->GetHeader()->GenEventHeader());
1328 for (Int_t i = 0; i < exHeader->NTriggerJets(); i++)
1329 {
1330 printf("Adding Jet %d %d \n", i, exHeader->NTriggerJets());
1331
1332
1333 exHeader->TriggerJet(i, uqJet);
1334 ((AliGenPythiaEventHeader*) fHeader)->AddUQJet(uqJet[0], uqJet[1], uqJet[2], uqJet[3]);
1335 }
1336 }
1337//
1338// Store quenching parameters
1339//
1340 if (fQuench){
b6262a45 1341 Double_t z[4] = {0.};
1342 Double_t xp = 0.;
1343 Double_t yp = 0.;
1344
7c21f297 1345 if (fQuench == 1) {
1346 // Pythia::Quench()
1347 fPythia->GetQuenchingParameters(xp, yp, z);
1bab4b79 1348 } else if (fQuench == 2){
7c21f297 1349 // Pyquen
1350 Double_t r1 = PARIMP.rb1;
1351 Double_t r2 = PARIMP.rb2;
1352 Double_t b = PARIMP.b1;
1353 Double_t r = 0.5 * TMath::Sqrt(2. * (r1 * r1 + r2 * r2) - b * b);
1354 Double_t phi = PARIMP.psib1;
1355 xp = r * TMath::Cos(phi);
1356 yp = r * TMath::Sin(phi);
1357
1bab4b79 1358 } else if (fQuench == 4) {
1359 // QPythia
5831e75f 1360 Double_t xy[2];
e9719084 1361 Double_t i0i1[2];
1362 AliFastGlauber::Instance()->GetSavedXY(xy);
1363 AliFastGlauber::Instance()->GetSavedI0I1(i0i1);
5831e75f 1364 xp = xy[0];
1365 yp = xy[1];
e6fe9b82 1366 ((AliGenPythiaEventHeader*) fHeader)->SetImpactParameter(fImpact);
7c21f297 1367 }
1bab4b79 1368
7c21f297 1369 ((AliGenPythiaEventHeader*) fHeader)->SetXYJet(xp, yp);
1370 ((AliGenPythiaEventHeader*) fHeader)->SetZQuench(z);
1bab4b79 1371 }
beac474c 1372//
39ea8b7f 1373// Store pt^hard and cross-section
beac474c 1374 ((AliGenPythiaEventHeader*) fHeader)->SetPtHard(fPythia->GetVINT(47));
39ea8b7f 1375 ((AliGenPythiaEventHeader*) fHeader)->SetXsection(fPythia->GetPARI(1));
64da86aa 1376
1377//
1378// Store Event Weight
39ea8b7f 1379 ((AliGenPythiaEventHeader*) fHeader)->SetEventWeight(fPythia->GetPARI(7));
64da86aa 1380
5fa4b20b 1381//
cf57b268 1382// Pass header
5fa4b20b 1383//
cf57b268 1384 AddHeader(fHeader);
4c4eac97 1385 fHeader = 0x0;
8d2cd130 1386}
cf57b268 1387
c2fc9d31 1388Bool_t AliGenPythia::CheckTrigger(const TParticle* jet1, const TParticle* jet2)
8d2cd130 1389{
1390// Check the kinematic trigger condition
1391//
1392 Double_t eta[2];
1393 eta[0] = jet1->Eta();
1394 eta[1] = jet2->Eta();
1395 Double_t phi[2];
1396 phi[0] = jet1->Phi();
1397 phi[1] = jet2->Phi();
1398 Int_t pdg[2];
1399 pdg[0] = jet1->GetPdgCode();
1400 pdg[1] = jet2->GetPdgCode();
1401 Bool_t triggered = kFALSE;
1402
64da86aa 1403 if (fProcess == kPyJets || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG) {
8d2cd130 1404 Int_t njets = 0;
1405 Int_t ntrig = 0;
1406 Float_t jets[4][10];
1407//
1408// Use Pythia clustering on parton level to determine jet axis
1409//
1410 GetJets(njets, ntrig, jets);
1411
76d6ba9a 1412 if (ntrig || fEtMinJet == 0.) triggered = kTRUE;
8d2cd130 1413//
1414 } else {
1415 Int_t ij = 0;
1416 Int_t ig = 1;
1417 if (pdg[0] == kGamma) {
1418 ij = 1;
1419 ig = 0;
1420 }
1421 //Check eta range first...
1422 if ((eta[ij] < fEtaMaxJet && eta[ij] > fEtaMinJet) &&
1423 (eta[ig] < fEtaMaxGamma && eta[ig] > fEtaMinGamma))
1424 {
1425 //Eta is okay, now check phi range
1426 if ((phi[ij] < fPhiMaxJet && phi[ij] > fPhiMinJet) &&
1427 (phi[ig] < fPhiMaxGamma && phi[ig] > fPhiMinGamma))
1428 {
1429 triggered = kTRUE;
1430 }
1431 }
1432 }
1433 return triggered;
1434}
aea21c57 1435
1436
aea21c57 1437
7184e472 1438Bool_t AliGenPythia::CheckKinematicsOnChild(){
1439//
1440//Checking Kinematics on Child (status code 1, particle code ?, kin cuts
1441//
aea21c57 1442 Bool_t checking = kFALSE;
1443 Int_t j, kcode, ks, km;
1444 Int_t nPartAcc = 0; //number of particles in the acceptance range
1445 Int_t numberOfAcceptedParticles = 1;
1446 if (fNumberOfAcceptedParticles != 0) { numberOfAcceptedParticles = fNumberOfAcceptedParticles; }
8507138f 1447 Int_t npart = fParticles.GetEntriesFast();
aea21c57 1448
0f6ee828 1449 for (j = 0; j<npart; j++) {
8507138f 1450 TParticle * jparticle = (TParticle *) fParticles.At(j);
aea21c57 1451 kcode = TMath::Abs( CheckPDGCode(jparticle->GetPdgCode()) );
1452 ks = jparticle->GetStatusCode();
1453 km = jparticle->GetFirstMother();
1454
1455 if( (ks == 1) && (kcode == fPdgCodeParticleforAcceptanceCut) && (KinematicSelection(jparticle,1)) ){
1456 nPartAcc++;
1457 }
0f6ee828 1458 if( numberOfAcceptedParticles <= nPartAcc){
1459 checking = kTRUE;
1460 break;
1461 }
aea21c57 1462 }
0f6ee828 1463
aea21c57 1464 return checking;
aea21c57 1465}
1466
5fa4b20b 1467void AliGenPythia::LoadEvent(AliStack* stack, Int_t flag, Int_t reHadr)
8d2cd130 1468{
1058d9df 1469 //
1470 // Load event into Pythia Common Block
1471 //
1472
1473 Int_t npart = stack -> GetNprimary();
1474 Int_t n0 = 0;
1475
1476 if (!flag) {
1477 (fPythia->GetPyjets())->N = npart;
1478 } else {
1479 n0 = (fPythia->GetPyjets())->N;
1480 (fPythia->GetPyjets())->N = n0 + npart;
1481 }
1482
1483
1484 for (Int_t part = 0; part < npart; part++) {
1485 TParticle *mPart = stack->Particle(part);
32d6ef7d 1486
1058d9df 1487 Int_t kf = mPart->GetPdgCode();
1488 Int_t ks = mPart->GetStatusCode();
1489 Int_t idf = mPart->GetFirstDaughter();
1490 Int_t idl = mPart->GetLastDaughter();
1491
1492 if (reHadr) {
1493 if (ks == 11 || ks == 12) {
1494 ks -= 10;
1495 idf = -1;
1496 idl = -1;
1497 }
32d6ef7d 1498 }
1499
1058d9df 1500 Float_t px = mPart->Px();
1501 Float_t py = mPart->Py();
1502 Float_t pz = mPart->Pz();
1503 Float_t e = mPart->Energy();
1504 Float_t m = mPart->GetCalcMass();
32d6ef7d 1505
1058d9df 1506
1507 (fPythia->GetPyjets())->P[0][part+n0] = px;
1508 (fPythia->GetPyjets())->P[1][part+n0] = py;
1509 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1510 (fPythia->GetPyjets())->P[3][part+n0] = e;
1511 (fPythia->GetPyjets())->P[4][part+n0] = m;
1512
1513 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1514 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1515 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1516 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1517 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1518 }
1519}
1520
c2fc9d31 1521void AliGenPythia::LoadEvent(const TObjArray* stack, Int_t flag, Int_t reHadr)
1058d9df 1522{
1523 //
1524 // Load event into Pythia Common Block
1525 //
1526
1527 Int_t npart = stack -> GetEntries();
1528 Int_t n0 = 0;
1529
1530 if (!flag) {
1531 (fPythia->GetPyjets())->N = npart;
1532 } else {
1533 n0 = (fPythia->GetPyjets())->N;
1534 (fPythia->GetPyjets())->N = n0 + npart;
1535 }
1536
1537
1538 for (Int_t part = 0; part < npart; part++) {
1539 TParticle *mPart = dynamic_cast<TParticle *>(stack->At(part));
92847124 1540 if (!mPart) continue;
1541
1058d9df 1542 Int_t kf = mPart->GetPdgCode();
1543 Int_t ks = mPart->GetStatusCode();
1544 Int_t idf = mPart->GetFirstDaughter();
1545 Int_t idl = mPart->GetLastDaughter();
1546
1547 if (reHadr) {
92847124 1548 if (ks == 11 || ks == 12) {
1549 ks -= 10;
1550 idf = -1;
1551 idl = -1;
1552 }
8d2cd130 1553 }
1058d9df 1554
1555 Float_t px = mPart->Px();
1556 Float_t py = mPart->Py();
1557 Float_t pz = mPart->Pz();
1558 Float_t e = mPart->Energy();
1559 Float_t m = mPart->GetCalcMass();
1560
1561
1562 (fPythia->GetPyjets())->P[0][part+n0] = px;
1563 (fPythia->GetPyjets())->P[1][part+n0] = py;
1564 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1565 (fPythia->GetPyjets())->P[3][part+n0] = e;
1566 (fPythia->GetPyjets())->P[4][part+n0] = m;
1567
1568 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1569 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1570 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1571 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1572 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1573 }
8d2cd130 1574}
1575
5fa4b20b 1576
014a9521 1577void AliGenPythia::RecJetsUA1(Int_t& njets, Float_t jets [4][50])
8d2cd130 1578{
1579//
1580// Calls the Pythia jet finding algorithm to find jets in the current event
1581//
1582//
8d2cd130 1583//
1584// Save jets
1585 Int_t n = fPythia->GetN();
1586
1587//
1588// Run Jet Finder
1589 fPythia->Pycell(njets);
1590 Int_t i;
1591 for (i = 0; i < njets; i++) {
1592 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1593 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1594 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1595 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1596
1597 jets[0][i] = px;
1598 jets[1][i] = py;
1599 jets[2][i] = pz;
1600 jets[3][i] = e;
1601 }
1602}
1603
1604
1605
1606void AliGenPythia::GetJets(Int_t& nJets, Int_t& nJetsTrig, Float_t jets[4][10])
1607{
1608//
1609// Calls the Pythia clustering algorithm to find jets in the current event
1610//
1611 Int_t n = fPythia->GetN();
1612 nJets = 0;
1613 nJetsTrig = 0;
1614 if (fJetReconstruction == kCluster) {
1615//
1616// Configure cluster algorithm
1617//
1618 fPythia->SetPARU(43, 2.);
1619 fPythia->SetMSTU(41, 1);
1620//
1621// Call cluster algorithm
1622//
1623 fPythia->Pyclus(nJets);
1624//
1625// Loading jets from common block
1626//
1627 } else {
592f8307 1628
8d2cd130 1629//
1630// Run Jet Finder
1631 fPythia->Pycell(nJets);
1632 }
1633
1634 Int_t i;
1635 for (i = 0; i < nJets; i++) {
1636 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1637 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1638 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1639 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1640 Float_t pt = TMath::Sqrt(px * px + py * py);
a920faf9 1641 Float_t phi = TMath::Pi() + TMath::ATan2(-py, -px);
8d2cd130 1642 Float_t theta = TMath::ATan2(pt,pz);
1643 Float_t et = e * TMath::Sin(theta);
1644 Float_t eta = -TMath::Log(TMath::Tan(theta / 2.));
8d2cd130 1645 if (
1646 eta > fEtaMinJet && eta < fEtaMaxJet &&
675eb105 1647 phi > fPhiMinJet && phi < fPhiMaxJet &&
8d2cd130 1648 et > fEtMinJet && et < fEtMaxJet
1649 )
1650 {
1651 jets[0][nJetsTrig] = px;
1652 jets[1][nJetsTrig] = py;
1653 jets[2][nJetsTrig] = pz;
1654 jets[3][nJetsTrig] = e;
1655 nJetsTrig++;
5fa4b20b 1656// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
8d2cd130 1657 } else {
1658// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
1659 }
1660 }
1661}
1662
f913ec4f 1663void AliGenPythia::GetSubEventTime()
1664{
1665 // Calculates time of the next subevent
9d7108a7 1666 fEventTime = 0.;
1667 if (fEventsTime) {
1668 TArrayF &array = *fEventsTime;
1669 fEventTime = array[fCurSubEvent++];
1670 }
1671 // printf(" Event time: %d %f %p",fCurSubEvent,fEventTime,fEventsTime);
1672 return;
f913ec4f 1673}
8d2cd130 1674
e81f2bac 1675Bool_t AliGenPythia::IsInBarrel(Float_t eta) const
40fe59d4 1676{
1677 // Is particle in Central Barrel acceptance?
1678 // etamin=-etamax
1679 if( eta < fTriggerEta )
1680 return kTRUE;
1681 else
1682 return kFALSE;
1683}
1684
e81f2bac 1685Bool_t AliGenPythia::IsInEMCAL(Float_t phi, Float_t eta) const
ec2c406e 1686{
1687 // Is particle in EMCAL acceptance?
ec2c406e 1688 // phi in degrees, etamin=-etamax
9fd8e520 1689 if(phi > fEMCALMinPhi && phi < fEMCALMaxPhi &&
1690 eta < fEMCALEta )
ec2c406e 1691 return kTRUE;
1692 else
1693 return kFALSE;
1694}
1695
e81f2bac 1696Bool_t AliGenPythia::IsInPHOS(Float_t phi, Float_t eta, Int_t iparticle)
ec2c406e 1697{
1698 // Is particle in PHOS acceptance?
1699 // Acceptance slightly larger considered.
1700 // phi in degrees, etamin=-etamax
40fe59d4 1701 // iparticle is the index of the particle to be checked, for PHOS rotation case
1702
9fd8e520 1703 if(phi > fPHOSMinPhi && phi < fPHOSMaxPhi &&
1704 eta < fPHOSEta )
ec2c406e 1705 return kTRUE;
1706 else
40fe59d4 1707 {
1708 if( fCheckPHOSeta && eta < fPHOSEta) fPHOSRotateCandidate = iparticle;
1709
ec2c406e 1710 return kFALSE;
40fe59d4 1711 }
ec2c406e 1712}
1713
40fe59d4 1714void AliGenPythia::RotatePhi(Bool_t& okdd)
90a236ce 1715{
40fe59d4 1716 //Rotate event in phi to enhance events in PHOS acceptance
1717
1718 if(fPHOSRotateCandidate < 0) return ;
1719
90a236ce 1720 //calculate the new position random between fPHOSMinPhi and fPHOSMaxPhi
1721 Double_t phiPHOSmin = TMath::Pi()*fPHOSMinPhi/180;
1722 Double_t phiPHOSmax = TMath::Pi()*fPHOSMaxPhi/180;
800be8b7 1723 Double_t phiPHOS = (AliPythiaRndm::GetPythiaRandom())->Uniform(phiPHOSmin,phiPHOSmax);
90a236ce 1724
1725 //calculate deltaphi
40fe59d4 1726 TParticle* ph = (TParticle *) fParticles.At(fPHOSRotateCandidate);
90a236ce 1727 Double_t phphi = ph->Phi();
1728 Double_t deltaphi = phiPHOS - phphi;
40fe59d4 1729
90a236ce 1730
1731
1732 //loop for all particles and produce the phi rotation
8507138f 1733 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
90a236ce 1734 Double_t oldphi, newphi;
777e69b0 1735 Double_t newVx, newVy, r, vZ, time;
1736 Double_t newPx, newPy, pt, pz, e;
90a236ce 1737 for(Int_t i=0; i< np; i++) {
40fe59d4 1738 TParticle* iparticle = (TParticle *) fParticles.At(i);
1739 oldphi = iparticle->Phi();
1740 newphi = oldphi + deltaphi;
1741 if(newphi < 0) newphi = 2*TMath::Pi() + newphi; // correct angle
1742 if(newphi > 2*TMath::Pi()) newphi = newphi - 2*TMath::Pi(); // correct angle
1743
1744 r = iparticle->R();
1745 newVx = r * TMath::Cos(newphi);
1746 newVy = r * TMath::Sin(newphi);
1747 vZ = iparticle->Vz(); // don't transform
1748 time = iparticle->T(); // don't transform
1749
1750 pt = iparticle->Pt();
1751 newPx = pt * TMath::Cos(newphi);
1752 newPy = pt * TMath::Sin(newphi);
1753 pz = iparticle->Pz(); // don't transform
1754 e = iparticle->Energy(); // don't transform
1755
1756 // apply rotation
1757 iparticle->SetProductionVertex(newVx, newVy, vZ, time);
1758 iparticle->SetMomentum(newPx, newPy, pz, e);
1759
90a236ce 1760 } //end particle loop
1761
40fe59d4 1762 // now let's check that we put correctly the candidate photon in PHOS
1763 Float_t phi = ph->Phi()*180./TMath::Pi(); //Convert to degrees
1764 Float_t eta =TMath::Abs(ph->Eta());//in calos etamin=-etamax
1765 if(IsInPHOS(phi,eta,-1))
1766 okdd = kTRUE;
1767
1768 // reset the value for next event
1769 fPHOSRotateCandidate = -1;
1770
90a236ce 1771}
ec2c406e 1772
1773
800be8b7 1774Bool_t AliGenPythia::CheckDiffraction()
1775{
1776 // use this method only with Perugia-0 tune!
1777
1778 // printf("AAA\n");
1779
1780 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
1781
1782 Int_t iPart1=-1;
1783 Int_t iPart2=-1;
1784
1785 Double_t y1 = 1e10;
1786 Double_t y2 = -1e10;
1787
1788 const Int_t kNstable=20;
1789 const Int_t pdgStable[20] = {
1790 22, // Photon
1791 11, // Electron
1792 12, // Electron Neutrino
1793 13, // Muon
1794 14, // Muon Neutrino
1795 15, // Tau
1796 16, // Tau Neutrino
1797 211, // Pion
1798 321, // Kaon
1799 311, // K0
1800 130, // K0s
1801 310, // K0l
1802 2212, // Proton
1803 2112, // Neutron
1804 3122, // Lambda_0
1805 3112, // Sigma Minus
1806 3222, // Sigma Plus
1807 3312, // Xsi Minus
1808 3322, // Xsi0
1809 3334 // Omega
1810 };
1811
1812 for (Int_t i = 0; i < np; i++) {
1813 TParticle * part = (TParticle *) fParticles.At(i);
1814
1815 Int_t statusCode = part->GetStatusCode();
1816
1817 // Initial state particle
1818 if (statusCode != 1)
1819 continue;
1820
1821 Int_t pdg = TMath::Abs(part->GetPdgCode());
1822 Bool_t isStable = kFALSE;
1823 for (Int_t i1 = 0; i1 < kNstable; i1++) {
1824 if (pdg == pdgStable[i1]) {
1825 isStable = kTRUE;
1826 break;
1827 }
1828 }
1829 if(!isStable)
1830 continue;
1831
1832 Double_t y = part->Y();
1833
1834 if (y < y1)
1835 {
1836 y1 = y;
1837 iPart1 = i;
1838 }
1839 if (y > y2)
1840 {
1841 y2 = y;
1842 iPart2 = i;
1843 }
1844 }
1845
1846 if(iPart1<0 || iPart2<0) return kFALSE;
1847
1848 y1=TMath::Abs(y1);
1849 y2=TMath::Abs(y2);
1850
1851 TParticle * part1 = (TParticle *) fParticles.At(iPart1);
1852 TParticle * part2 = (TParticle *) fParticles.At(iPart2);
1853
1854 Int_t pdg1 = part1->GetPdgCode();
1855 Int_t pdg2 = part2->GetPdgCode();
1856
1857
1858 Int_t iPart = -1;
1859 if (pdg1 == 2212 && pdg2 == 2212)
1860 {
1861 if(y1 > y2)
1862 iPart = iPart1;
1863 else if(y1 < y2)
1864 iPart = iPart2;
1865 else {
1866 iPart = iPart1;
1867 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)>0.5) iPart = iPart2;
1868 }
1869 }
1870 else if (pdg1 == 2212)
1871 iPart = iPart1;
1872 else if (pdg2 == 2212)
1873 iPart = iPart2;
1874
1875
1876
1877
1878
1879 Double_t M=-1.;
1880 if(iPart>0) {
1881 TParticle * part = (TParticle *) fParticles.At(iPart);
1882 Double_t E= part->Energy();
1883 Double_t P= part->P();
4f813e90 1884 Double_t M2 = (fEnergyCMS-E-P)*(fEnergyCMS-E+P);
1885 if(M2<0) return kFALSE;
1886 M= TMath::Sqrt(M2);
800be8b7 1887 }
1888
c5dfa3e4 1889 Double_t Mmin, Mmax, wSD, wDD, wND;
1890 if(!GetWeightsDiffraction(M, Mmin, Mmax, wSD, wDD, wND)) return kFALSE;
1891
1892 if(M>-1 && M<Mmin) return kFALSE;
1893 if(M>Mmax) M=-1;
1894
1895 Int_t procType=fPythia->GetMSTI(1);
1896 Int_t proc0=2;
1897 if(procType== 94) proc0=1;
1898 if(procType== 92 || procType== 93) proc0=0;
1899
1900 Int_t proc=2;
1901 if(M>0) proc=0;
1902 else if(proc0==1) proc=1;
1903
1904 if(proc==1 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wDD) return kFALSE;
1905 if(proc==2 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wND) return kFALSE;
800be8b7 1906
1907
1908 // if(proc==1 || proc==2) return kFALSE;
1909
c5dfa3e4 1910 if(proc!=0) {
1911 if(proc0!=0) fProcDiff = procType;
1912 else fProcDiff = 95;
1913 return kTRUE;
1914 }
1915
1916 if(wSD<0) AliError("wSD<0 ! \n");
1917
1918 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)> wSD) return kFALSE;
1919
1920 // printf("iPart = %d\n", iPart);
1921
1922 if(iPart==iPart1) fProcDiff=93;
1923 else if(iPart==iPart2) fProcDiff=92;
1924 else {
1925 printf("EROOR: iPart!=iPart1 && iPart!=iPart2\n");
1926
800be8b7 1927 }
1928
c5dfa3e4 1929 return kTRUE;
1930}
1931
1932
1933
1934Bool_t AliGenPythia::GetWeightsDiffraction(Double_t M, Double_t &Mmin, Double_t &Mmax,
1935 Double_t &wSD, Double_t &wDD, Double_t &wND)
1936{
1937
1938 // 900 GeV
1939 if(TMath::Abs(fEnergyCMS-900)<1 ){
1940
1941const Int_t nbin=400;
1942Double_t bin[]={
19431.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
19444.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
19457.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
194610.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
194713.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
194815.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
194918.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
195021.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
195124.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
195227.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
195330.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
195433.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
195536.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
195639.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
195742.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
195845.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
195948.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
196051.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
196154.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
196257.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
196360.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
196463.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
196566.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
196669.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
196772.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
196875.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
196978.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
197081.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
197184.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
197287.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
197390.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
197493.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
197596.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
197699.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
1977102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
1978105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
1979108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
1980111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
1981114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
1982117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
1983120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
1984123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
1985126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
1986129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
1987132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
1988135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
1989138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
1990141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
1991144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
1992147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
1993150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
1994153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
1995156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
1996159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
1997162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
1998165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
1999168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2000171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2001174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2002177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2003180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2004183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2005186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2006189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2007192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2008195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2009198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2010Double_t w[]={
20111.000000, 0.643457, 0.645609, 0.648347, 0.604563, 0.605002,
20120.602819, 0.611473, 0.576412, 0.562354, 0.550216, 0.529285,
20130.534558, 0.534364, 0.530358, 0.518475, 0.489253, 0.469754,
20140.469825, 0.450513, 0.455849, 0.435312, 0.437210, 0.456686,
20150.413577, 0.427093, 0.426894, 0.418834, 0.409475, 0.388483,
20160.412208, 0.388912, 0.389611, 0.382572, 0.389220, 0.370964,
20170.380463, 0.370873, 0.363701, 0.369363, 0.357361, 0.365759,
20180.348566, 0.337062, 0.348190, 0.332330, 0.359001, 0.335836,
20190.339154, 0.335599, 0.336035, 0.335204, 0.353440, 0.337836,
20200.333874, 0.307120, 0.294963, 0.324978, 0.313359, 0.317688,
20210.323758, 0.319304, 0.335317, 0.301765, 0.317257, 0.356331,
20220.323119, 0.297732, 0.303188, 0.326102, 0.316467, 0.294728,
20230.308135, 0.288857, 0.325692, 0.312493, 0.291100, 0.325921,
20240.313317, 0.295980, 0.308481, 0.328380, 0.313081, 0.296763,
20250.295431, 0.317325, 0.320462, 0.286918, 0.316035, 0.335208,
20260.283193, 0.333945, 0.292534, 0.294164, 0.330680, 0.296992,
20270.285509, 0.317260, 0.298269, 0.311299, 0.312129, 0.286822,
20280.287442, 0.319139, 0.283314, 0.318454, 0.297727, 0.301597,
20290.282483, 0.294792, 0.305569, 0.290957, 0.297817, 0.282908,
20300.272401, 0.305584, 0.300220, 0.297020, 0.298781, 0.278008,
20310.277727, 0.323777, 0.287419, 0.342074, 0.287259, 0.303658,
20320.302668, 0.279622, 0.280586, 0.313630, 0.276068, 0.257051,
20330.309996, 0.265534, 0.297138, 0.281738, 0.294610, 0.292882,
20340.286860, 0.312686, 0.293244, 0.293744, 0.271375, 0.278734,
20350.280308, 0.304739, 0.287907, 0.285261, 0.311180, 0.313476,
20360.289660, 0.289282, 0.319505, 0.271285, 0.272008, 0.289245,
20370.281038, 0.285284, 0.295836, 0.281416, 0.283501, 0.295417,
20380.304372, 0.297764, 0.291378, 0.321530, 0.315604, 0.329507,
20390.282609, 0.275576, 0.283721, 0.311714, 0.283760, 0.273188,
20400.312193, 0.264347, 0.281532, 0.301226, 0.281718, 0.336408,
20410.283157, 0.332010, 0.289974, 0.290256, 0.301569, 0.332228,
20420.288282, 0.326339, 0.313653, 0.300361, 0.289470, 0.264830,
20430.298659, 0.272359, 0.278878, 0.306001, 0.328168, 0.294991,
20440.327737, 0.278056, 0.302435, 0.284183, 0.279270, 0.307279,
20450.307917, 0.315196, 0.283803, 0.313333, 0.315730, 0.304818,
20460.307171, 0.295223, 0.333741, 0.346911, 0.310143, 0.336686,
20470.275459, 0.334781, 0.295405, 0.275816, 0.301678, 0.327242,
20480.320717, 0.309230, 0.292145, 0.294489, 0.305088, 0.300969,
20490.277438, 0.326159, 0.297065, 0.301177, 0.303843, 0.275382,
20500.304019, 0.284166, 0.289610, 0.331611, 0.317131, 0.310880,
20510.360456, 0.294052, 0.342694, 0.327166, 0.336797, 0.298040,
20520.295767, 0.260053, 0.325544, 0.335310, 0.320182, 0.301072,
20530.313117, 0.283407, 0.299206, 0.293525, 0.305067, 0.255978,
20540.327055, 0.316382, 0.317700, 0.278993, 0.283120, 0.314000,
20550.274396, 0.291208, 0.348813, 0.319603, 0.313076, 0.289155,
20560.343988, 0.311426, 0.322896, 0.328726, 0.337062, 0.389093,
20570.284122, 0.312184, 0.304008, 0.319170, 0.320778, 0.288390,
20580.337272, 0.356273, 0.343310, 0.312209, 0.330709, 0.297977,
20590.346146, 0.369162, 0.324385, 0.339831, 0.337037, 0.318739,
20600.343157, 0.277720, 0.368407, 0.321330, 0.338997, 0.314220,
20610.328861, 0.321824, 0.328013, 0.356925, 0.359144, 0.296314,
20620.345415, 0.396711, 0.347032, 0.294928, 0.343799, 0.322331,
20630.328656, 0.326098, 0.337338, 0.337038, 0.300179, 0.351391,
20640.324337, 0.330896, 0.302842, 0.310522, 0.337052, 0.359989,
20650.383250, 0.359355, 0.315382, 0.333113, 0.342598, 0.355348,
20660.320751, 0.320475, 0.351762, 0.351475, 0.338358, 0.326153,
20670.302507, 0.340048, 0.318685, 0.381646, 0.339320, 0.299453,
20680.426599, 0.393515, 0.353929, 0.328435, 0.413976, 0.292558,
20690.379340, 0.358344, 0.409259, 0.313821, 0.336675, 0.324521,
20700.408382, 0.346273, 0.312939, 0.362453, 0.343152, 0.330577,
20710.332831, 0.353299, 0.347745, 0.334818, 0.332234, 0.385585,
20720.395483, 0.395316, 0.326972, 0.349434, 0.317604, 0.328980,
20730.375056, 0.317290, 0.357083, 0.346165, 0.310444, 0.356873,
20740.359523, 0.365308, 0.365122, 0.383685, 0.370975, 0.396928,
20750.407654, 0.307755, 0.323033, 0.350580, 0.345231, 0.342462,
20760.400000, 0.318309, 0.403570, 0.322856, 0.383053, 0.422252,
20770.386112, 0.364314, 0.434375, 0.334629};
2078wDD = 0.379611;
2079wND = 0.496961;
2080wSD = -1;
2081
2082 Mmin = bin[0];
2083 Mmax = bin[nbin];
2084 if(M<Mmin || M>Mmax) return kTRUE;
2085
7873275c 2086 Int_t ibin=nbin-1;
93a60586 2087 for(Int_t i=1; i<=nbin; i++)
2ff57420 2088 if(M<=bin[i]) {
2089 ibin=i-1;
2090 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
800be8b7 2091 break;
2092 }
c5dfa3e4 2093 wSD=w[ibin];
2094 return kTRUE;
2095 }
2096 else if(TMath::Abs(fEnergyCMS-2760)<1 ){
800be8b7 2097
c5dfa3e4 2098const Int_t nbin=400;
2099Double_t bin[]={
21001.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
21014.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
21027.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
210310.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
210413.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
210515.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
210618.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
210721.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
210824.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
210927.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
211030.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
211133.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
211236.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
211339.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
211442.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
211545.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
211648.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
211751.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
211854.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
211957.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
212060.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
212163.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
212266.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
212369.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
212472.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
212575.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
212678.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
212781.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
212884.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
212987.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
213090.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
213193.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
213296.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
213399.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2134102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2135105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2136108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2137111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2138114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2139117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2140120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2141123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2142126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2143129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2144132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2145135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2146138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2147141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2148144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2149147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2150150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2151153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2152156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2153159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2154162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2155165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2156168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2157171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2158174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2159177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2160180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2161183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2162186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2163189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2164192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2165195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2166198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2167Double_t w[]={
21681.000000, 0.692593, 0.673384, 0.666273, 0.657285, 0.637723,
21690.625881, 0.643590, 0.606100, 0.589007, 0.567824, 0.578705,
21700.538530, 0.517937, 0.528278, 0.515918, 0.539461, 0.466186,
21710.489869, 0.468402, 0.465017, 0.453336, 0.460769, 0.474638,
21720.456347, 0.434471, 0.427478, 0.435435, 0.410934, 0.366431,
21730.382240, 0.379513, 0.394249, 0.386837, 0.353103, 0.382138,
21740.377497, 0.389479, 0.378736, 0.347933, 0.354605, 0.352077,
21750.324443, 0.358792, 0.339968, 0.359052, 0.330734, 0.318291,
21760.333703, 0.358644, 0.335819, 0.332213, 0.309051, 0.309975,
21770.331626, 0.304407, 0.309819, 0.312097, 0.312462, 0.320411,
21780.280401, 0.302311, 0.315863, 0.281479, 0.310003, 0.296911,
21790.313676, 0.281071, 0.294163, 0.306500, 0.283462, 0.274867,
21800.307149, 0.270555, 0.282264, 0.287373, 0.307849, 0.278675,
21810.286990, 0.278269, 0.300105, 0.286799, 0.265674, 0.275140,
21820.285702, 0.257352, 0.267714, 0.248204, 0.252220, 0.255678,
21830.282946, 0.268257, 0.282375, 0.262675, 0.275564, 0.248345,
21840.236259, 0.291914, 0.259936, 0.241338, 0.267389, 0.285044,
21850.289419, 0.253594, 0.284568, 0.231840, 0.260008, 0.268527,
21860.275363, 0.224115, 0.281260, 0.257913, 0.295152, 0.264399,
21870.232287, 0.282533, 0.223431, 0.255756, 0.244471, 0.221695,
21880.272450, 0.284244, 0.253682, 0.270717, 0.275403, 0.240323,
21890.245081, 0.241859, 0.216340, 0.244789, 0.220291, 0.238478,
21900.224691, 0.244058, 0.266117, 0.271478, 0.242012, 0.267321,
21910.248494, 0.253343, 0.255606, 0.235458, 0.241079, 0.233223,
21920.226813, 0.259224, 0.234239, 0.258606, 0.210892, 0.238186,
21930.243271, 0.222678, 0.213437, 0.273939, 0.247966, 0.232548,
21940.263438, 0.222089, 0.272111, 0.248818, 0.244295, 0.238368,
21950.236908, 0.248776, 0.232604, 0.231194, 0.227117, 0.231152,
21960.282140, 0.229778, 0.232631, 0.261794, 0.216633, 0.253471,
21970.242157, 0.227406, 0.269335, 0.230547, 0.210618, 0.285872,
21980.248776, 0.229875, 0.242728, 0.227388, 0.220567, 0.222062,
21990.235950, 0.224087, 0.228895, 0.208287, 0.235999, 0.208696,
22000.230367, 0.267667, 0.220484, 0.233402, 0.233815, 0.250455,
22010.253120, 0.219556, 0.230980, 0.236661, 0.222395, 0.226111,
22020.198315, 0.210555, 0.202813, 0.208594, 0.235976, 0.221490,
22030.243059, 0.204901, 0.216987, 0.229039, 0.231466, 0.221975,
22040.231220, 0.253638, 0.250448, 0.260291, 0.328345, 0.205739,
22050.222014, 0.251513, 0.279427, 0.270506, 0.248409, 0.222472,
22060.291632, 0.227796, 0.248769, 0.276896, 0.214742, 0.200139,
22070.230693, 0.226031, 0.268900, 0.185160, 0.245353, 0.205843,
22080.231155, 0.219122, 0.214811, 0.199763, 0.274179, 0.217598,
22090.274988, 0.237244, 0.211820, 0.225459, 0.252799, 0.235948,
22100.224986, 0.245385, 0.237770, 0.213373, 0.229737, 0.215487,
22110.234453, 0.249684, 0.239435, 0.250422, 0.257194, 0.214762,
22120.212266, 0.228988, 0.253798, 0.201607, 0.239946, 0.205245,
22130.231670, 0.212774, 0.206768, 0.231563, 0.189388, 0.227926,
22140.227203, 0.237754, 0.221628, 0.211138, 0.203322, 0.200985,
22150.231780, 0.220294, 0.232686, 0.234243, 0.218264, 0.255870,
22160.223213, 0.238670, 0.213713, 0.213064, 0.246700, 0.233446,
22170.221503, 0.206767, 0.200722, 0.226179, 0.237425, 0.239229,
22180.238611, 0.240419, 0.247806, 0.215923, 0.205298, 0.232778,
22190.272312, 0.226773, 0.258103, 0.223287, 0.269404, 0.203398,
22200.223782, 0.204213, 0.229664, 0.234040, 0.228419, 0.203936,
22210.263686, 0.199141, 0.236127, 0.214058, 0.204611, 0.224324,
22220.292140, 0.190735, 0.235157, 0.213018, 0.257085, 0.190554,
22230.203197, 0.213044, 0.237023, 0.214243, 0.193562, 0.262403,
22240.206256, 0.221396, 0.233588, 0.256611, 0.249731, 0.226683,
22250.199330, 0.251026, 0.222596, 0.201941, 0.186374, 0.221038,
22260.196555, 0.222560, 0.299419, 0.231979, 0.242924, 0.198310,
22270.217628, 0.235458, 0.278595, 0.218624, 0.277305, 0.239109,
22280.205600, 0.253715, 0.221173, 0.218195, 0.277647, 0.241974,
22290.268748, 0.268128, 0.292258, 0.249420, 0.191034, 0.219506,
22300.216502, 0.250677, 0.193386, 0.201310, 0.259464, 0.255351,
22310.269628, 0.221063, 0.294079, 0.196726, 0.233634, 0.221870,
22320.216236, 0.197259, 0.247433, 0.272765, 0.294079, 0.236336,
22330.206396, 0.238524, 0.247846, 0.269519, 0.237141, 0.230611,
22340.201712, 0.242225, 0.255565, 0.258738};
2235wDD = 0.512813;
2236wND = 0.518820;
2237wSD = -1;
2238
2239 Mmin = bin[0];
2240 Mmax = bin[nbin];
2241 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2242
c5dfa3e4 2243 Int_t ibin=nbin-1;
2244 for(Int_t i=1; i<=nbin; i++)
2245 if(M<=bin[i]) {
2246 ibin=i-1;
2247 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2248 break;
2249 }
2250 wSD=w[ibin];
2251 return kTRUE;
2252 }
800be8b7 2253
800be8b7 2254
c5dfa3e4 2255 else if(TMath::Abs(fEnergyCMS-7000)<1 ){
2256const Int_t nbin=400;
2257Double_t bin[]={
22581.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
22594.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
22607.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
226110.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
226213.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
226315.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
226418.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
226521.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
226624.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
226727.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
226830.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
226933.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
227036.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
227139.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
227242.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
227345.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
227448.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
227551.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
227654.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
227757.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
227860.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
227963.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
228066.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
228169.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
228272.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
228375.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
228478.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
228581.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
228684.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
228787.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
228890.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
228993.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
229096.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
229199.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2292102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2293105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2294108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2295111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2296114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2297117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2298120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2299123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2300126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2301129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2302132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2303135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2304138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2305141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2306144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2307147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2308150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2309153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2310156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2311159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2312162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2313165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2314168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2315171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2316174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2317177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2318180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2319183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2320186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2321189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2322192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2323195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2324198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2325Double_t w[]={
23261.000000, 0.798640, 0.770197, 0.717990, 0.699434, 0.692093,
23270.620940, 0.655294, 0.636496, 0.633483, 0.600518, 0.594548,
23280.550759, 0.550413, 0.528926, 0.525877, 0.506701, 0.504117,
23290.486973, 0.492930, 0.461833, 0.488695, 0.438874, 0.460274,
23300.451551, 0.454424, 0.449270, 0.387571, 0.427556, 0.428740,
23310.401682, 0.402260, 0.408961, 0.395417, 0.387426, 0.378602,
23320.357826, 0.359125, 0.348494, 0.363710, 0.356117, 0.340363,
23330.337637, 0.396084, 0.341777, 0.340551, 0.348838, 0.344014,
23340.340468, 0.317654, 0.355584, 0.326023, 0.373416, 0.312298,
23350.326522, 0.290540, 0.335557, 0.318689, 0.327544, 0.319501,
23360.331754, 0.312728, 0.282263, 0.274937, 0.303867, 0.307820,
23370.289344, 0.268934, 0.288908, 0.290018, 0.291369, 0.295242,
23380.289067, 0.277685, 0.267957, 0.267559, 0.320229, 0.265060,
23390.305931, 0.305352, 0.262064, 0.281879, 0.287780, 0.270033,
23400.270814, 0.276667, 0.271531, 0.275283, 0.258189, 0.287969,
23410.251247, 0.301527, 0.267230, 0.245860, 0.293125, 0.253421,
23420.272396, 0.243637, 0.236206, 0.278452, 0.246544, 0.263165,
23430.230484, 0.231102, 0.258281, 0.244707, 0.270111, 0.248295,
23440.246942, 0.245592, 0.272766, 0.254243, 0.199647, 0.262590,
23450.226710, 0.243836, 0.214153, 0.233535, 0.235207, 0.234245,
23460.247698, 0.248379, 0.241463, 0.265230, 0.223242, 0.236191,
23470.252700, 0.231865, 0.228352, 0.229101, 0.237385, 0.246485,
23480.254706, 0.245565, 0.224841, 0.257301, 0.240968, 0.202379,
23490.236943, 0.241683, 0.220809, 0.219014, 0.213015, 0.244470,
23500.221042, 0.198996, 0.225295, 0.264466, 0.200600, 0.228143,
23510.250138, 0.216784, 0.268002, 0.275734, 0.218144, 0.229866,
23520.235443, 0.208909, 0.215067, 0.189743, 0.216741, 0.242686,
23530.200234, 0.218882, 0.245991, 0.222815, 0.219576, 0.209773,
23540.205247, 0.203855, 0.202534, 0.192536, 0.223447, 0.225810,
23550.220583, 0.248421, 0.223424, 0.206033, 0.203130, 0.221225,
23560.223763, 0.239216, 0.252311, 0.206893, 0.228461, 0.233591,
23570.201512, 0.242382, 0.215147, 0.232578, 0.207116, 0.239213,
23580.196215, 0.184367, 0.235135, 0.189768, 0.274084, 0.206267,
23590.203283, 0.248828, 0.250214, 0.217465, 0.232080, 0.215150,
23600.207936, 0.176789, 0.191338, 0.188655, 0.196181, 0.223691,
23610.254257, 0.216874, 0.213536, 0.221399, 0.192024, 0.212534,
23620.218169, 0.226635, 0.201191, 0.212700, 0.211634, 0.232353,
23630.223636, 0.208605, 0.249132, 0.183681, 0.221842, 0.187136,
23640.203772, 0.249575, 0.217713, 0.205193, 0.193941, 0.219707,
23650.264226, 0.182105, 0.207183, 0.220845, 0.236571, 0.182390,
23660.212914, 0.186266, 0.195361, 0.217665, 0.204527, 0.188804,
23670.222832, 0.191193, 0.201073, 0.185616, 0.195011, 0.200828,
23680.181434, 0.233707, 0.202925, 0.211992, 0.173100, 0.205258,
23690.182695, 0.216520, 0.218422, 0.209490, 0.211257, 0.215801,
23700.220652, 0.211409, 0.195731, 0.194957, 0.198888, 0.234926,
23710.221377, 0.229822, 0.176700, 0.172322, 0.212265, 0.206133,
23720.170355, 0.253305, 0.198688, 0.240043, 0.225384, 0.174729,
23730.195820, 0.200093, 0.196912, 0.212308, 0.200490, 0.240415,
23740.159744, 0.173686, 0.223853, 0.213604, 0.193779, 0.179328,
23750.180873, 0.237481, 0.179640, 0.235857, 0.202847, 0.167690,
23760.245093, 0.215504, 0.205848, 0.184408, 0.201626, 0.209651,
23770.236306, 0.217803, 0.188534, 0.187861, 0.161663, 0.221718,
23780.152044, 0.190412, 0.173505, 0.208995, 0.174575, 0.180734,
23790.247704, 0.203388, 0.194184, 0.169679, 0.182703, 0.213402,
23800.191808, 0.178604, 0.178116, 0.198452, 0.174687, 0.169809,
23810.222851, 0.156811, 0.229170, 0.210359, 0.178557, 0.248570,
23820.208536, 0.192571, 0.178912, 0.224505, 0.170822, 0.205492,
23830.330973, 0.160924, 0.203724, 0.213255, 0.205827, 0.187162,
23840.181252, 0.191723, 0.238106, 0.182398, 0.202358, 0.212066,
23850.201255, 0.168159, 0.185219, 0.229176, 0.158222, 0.164092,
23860.215405, 0.200724, 0.234811, 0.184488, 0.213112, 0.198577,
23870.219622, 0.160671, 0.179349, 0.206681, 0.206091, 0.165618,
23880.165203, 0.174442, 0.179287, 0.187318, 0.163481, 0.217440,
23890.160381, 0.177025, 0.204385, 0.163676, 0.210733, 0.186519,
23900.230701, 0.191764, 0.185119, 0.190770, 0.242987, 0.186812,
23910.202906, 0.161935, 0.182426, 0.197922, 0.181475, 0.155903,
23920.175006, 0.223482, 0.202706, 0.218108};
2393wDD = 0.207705;
2394wND = 0.289628;
2395wSD = -1;
2396
2397 Mmin = bin[0];
2398 Mmax = bin[nbin];
2399
2400 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2401
c5dfa3e4 2402 Int_t ibin=nbin-1;
2403 for(Int_t i=1; i<=nbin; i++)
2404 if(M<=bin[i]) {
2405 ibin=i-1;
2406 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2407 break;
2408 }
2409 wSD=w[ibin];
800be8b7 2410 return kTRUE;
c5dfa3e4 2411 }
2412
2413 return kFALSE;
800be8b7 2414}
06956108 2415
2416Bool_t AliGenPythia::IsFromHeavyFlavor(Int_t ipart)
2417{
2418// Check if this is a heavy flavor decay product
2419 TParticle * part = (TParticle *) fParticles.At(ipart);
2420 Int_t mpdg = TMath::Abs(part->GetPdgCode());
2421 Int_t mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2422 //
2423 // Light hadron
2424 if (mfl >= 4 && mfl < 6) return kTRUE;
2425
2426 Int_t imo = part->GetFirstMother()-1;
2427 TParticle* pm = part;
2428 //
2429 // Heavy flavor hadron produced by generator
2430 while (imo > -1) {
2431 pm = (TParticle*)fParticles.At(imo);
2432 mpdg = TMath::Abs(pm->GetPdgCode());
2433 mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2434 if ((mfl > 3) && (mfl <6) && mpdg > 400) return kTRUE;
2435 imo = pm->GetFirstMother()-1;
2436 }
2437 return kFALSE;
2438}
40fe59d4 2439
e81f2bac 2440Bool_t AliGenPythia::CheckDetectorAcceptance(Float_t phi, Float_t eta, Int_t iparticle)
40fe59d4 2441{
2442 // check the eta/phi correspond to the detectors acceptance
2443 // iparticle is the index of the particle to be checked, for PHOS rotation case
2444 if (fCheckPHOS && IsInPHOS (phi,eta,iparticle)) return kTRUE;
2445 else if(fCheckEMCAL && IsInEMCAL (phi,eta)) return kTRUE;
2446 else if(fCheckBarrel && IsInBarrel( eta)) return kTRUE;
2447 else return kFALSE;
2448}
2449
e81f2bac 2450Bool_t AliGenPythia::TriggerOnSelectedParticles(Int_t np)
40fe59d4 2451{
2452 // Select events with fragmentation photon, decay photon, pi0, eta or other hadrons going to PHOS or EMCAL or central barrel,
2453 // implemented primaryly for kPyJets, but extended to any kind of process.
2454
2455 //printf("Check: frag photon %d, pi0 %d, eta %d, electron %d, hadron %d, decay %d, PHOS %d, EMCAL %d, Barrel %d \n",
2456 // fFragPhotonInCalo,fPi0InCalo, fEtaInCalo,fEleInCalo,fHadronInCalo,fDecayPhotonInCalo,fCheckPHOS,fCheckEMCAL, fCheckBarrel);
2457
2458 Bool_t ok = kFALSE;
2459 for (Int_t i=0; i< np; i++) {
2460
2461 TParticle* iparticle = (TParticle *) fParticles.At(i);
2462
2463 Int_t pdg = iparticle->GetPdgCode();
2464 Int_t status = iparticle->GetStatusCode();
2465 Int_t imother = iparticle->GetFirstMother() - 1;
2466
2467 TParticle* pmother = 0x0;
2468 Int_t momStatus = -1;
2469 Int_t momPdg = -1;
2470 if(imother > 0 ){
2471 pmother = (TParticle *) fParticles.At(imother);
2472 momStatus = pmother->GetStatusCode();
2473 momPdg = pmother->GetPdgCode();
2474 }
2475
2476 ok = kFALSE;
2477
2478 //
2479 // Check the particle type: hadron (not pi0 or eta), electron, decay photon (from pi0 or eta or any), pi0 or eta
2480 //
2481 // Hadron
2482 if (fHadronInCalo && status == 1)
2483 {
2484 if(TMath::Abs(pdg) > 23 && pdg !=221 && pdg != 111) // avoid photons, electrons, muons, neutrinos and eta or pi0
2485 // (in case neutral mesons were declared stable)
2486 ok = kTRUE;
2487 }
2488 //Electron
2489 else if (fEleInCalo && status == 1 && TMath::Abs(pdg) == 11)
2490 {
2491 ok = kTRUE;
2492 }
2493 //Fragmentation photon
2494 else if (fFragPhotonInCalo && pdg == 22 && status == 1)
2495 {
2496 if(momStatus != 11) ok = kTRUE ; // No photon from hadron decay
2497 }
2498 // Decay photon
2499 else if (fDecayPhotonInCalo && !fForceNeutralMeson2PhotonDecay && pdg == 22) // pi0 status can be 1 or 11 depending on decay settings, work only for 11
2500 {
2501 if( momStatus == 11)
2502 {
2503 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Decay photon! pdg %d, status %d, pt %2.2f, mom: pdg %d, pt %2.2f\n",
2504 // pdg,status,iparticle->Pt(),momPdg,pmother->Pt());
2505 ok = kTRUE ; // photon from hadron decay
2506
2507 //In case only decays from pi0 or eta requested
2508 if(fPi0InCalo && momPdg!=111) ok = kFALSE;
2509 if(fEtaInCalo && momPdg!=221) ok = kFALSE;
2510 }
2511
2512 }
2513 // Pi0 or Eta particle
2514 else if ((fPi0InCalo || fEtaInCalo))
2515 {
2516 if(fDecayPhotonInCalo && !fForceNeutralMeson2PhotonDecay ) continue ;
2517
2518 if (fPi0InCalo && pdg == 111) // pi0 status can be 1 or 11 depending on decay settings
2519 {
2520 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Pi0! pdg %d, status %d, pt %2.2f\n",pdg,status,iparticle->Pt());
2521 ok = kTRUE;
2522 }
2523 else if (fEtaInCalo && pdg == 221)
2524 {
2525 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Eta! pdg %d, status %d, pt %2.2f\n",pdg,status,iparticle->Pt());
2526 ok = kTRUE;
2527 }
2528
2529 }// pi0 or eta
2530
2531 //
2532 // Check that the selected particle is in the calorimeter acceptance
2533 //
2534 if(ok && iparticle->Pt() > fTriggerParticleMinPt)
2535 {
2536 //Just check if the selected particle falls in the acceptance
2537 if(!fForceNeutralMeson2PhotonDecay )
2538 {
2539 //printf("\t Check acceptance! \n");
2540 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
2541 Float_t eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
2542
2543 if(CheckDetectorAcceptance(phi,eta,i))
2544 {
2545 ok =kTRUE;
2546 AliDebug(1,Form("Selected trigger pdg %d, status %d, pt %2.2f, eta %2.2f, phi %2.2f\n",pdg,status,iparticle->Pt(), eta, phi));
2547 //printf("\t Accept \n");
2548 break;
2549 }
2550 else ok = kFALSE;
2551 }
2552 //Mesons have several decay modes, select only those decaying into 2 photons
2553 else if(fForceNeutralMeson2PhotonDecay && (fPi0InCalo || fEtaInCalo))
2554 {
2555 // In case we want the pi0/eta trigger,
2556 // check the decay mode (2 photons)
2557
2558 //printf("\t Force decay 2 gamma\n");
2559
2560 Int_t ndaughters = iparticle->GetNDaughters();
2561 if(ndaughters != 2){
2562 ok=kFALSE;
2563 continue;
2564 }
2565
2566 TParticle*d1 = (TParticle *) fParticles.At(iparticle->GetDaughter(0)-1);
2567 TParticle*d2 = (TParticle *) fParticles.At(iparticle->GetDaughter(1)-1);
2568 if(!d1 || !d2) {
2569 ok=kFALSE;
2570 continue;
2571 }
2572
2573 //iparticle->Print();
2574 //d1->Print();
2575 //d2->Print();
2576
2577 Int_t pdgD1 = d1->GetPdgCode();
2578 Int_t pdgD2 = d2->GetPdgCode();
2579 //printf("\t \t 2 daughters pdg = %d - %d\n",pdgD1,pdgD2);
2580 //printf("mother %d - %d\n",d1->GetFirstMother(),d2->GetFirstMother());
2581
2582 if(pdgD1 != 22 || pdgD2 != 22){
2583 ok = kFALSE;
2584 continue;
2585 }
2586
2587 //printf("\t accept decay\n");
2588
2589 //Trigger on the meson, not on the daughter
2590 if(!fDecayPhotonInCalo){
2591
2592 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
2593 Float_t eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
2594
2595 if(CheckDetectorAcceptance(phi,eta,i))
2596 {
2597 //printf("\t Accept meson pdg %d\n",pdg);
2598 ok =kTRUE;
2599 AliDebug(1,Form("Selected trigger pdg %d (decay), status %d, pt %2.2f, eta %2.2f, phi %2.2f\n",pdg,status,iparticle->Pt(), eta, phi));
2600 break;
2601 } else {
2602 ok=kFALSE;
2603 continue;
2604 }
2605 }
2606
2607 //printf("Check daughters acceptance\n");
2608
2609 //Trigger on the meson daughters
2610 //Photon 1
2611 Float_t phi = d1->Phi()*180./TMath::Pi(); //Convert to degrees
2612 Float_t eta =TMath::Abs(d1->Eta()); //in calos etamin=-etamax
2613 if(d1->Pt() > fTriggerParticleMinPt)
2614 {
2615 //printf("\t Check acceptance photon 1! \n");
2616 if(CheckDetectorAcceptance(phi,eta,i))
2617 {
2618 //printf("\t Accept Photon 1\n");
2619 ok =kTRUE;
2620 AliDebug(1,Form("Selected trigger pdg %d (decay), status %d, pt %2.2f, eta %2.2f, phi %2.2f\n",pdg,status,iparticle->Pt(), eta, phi));
2621 break;
2622 }
2623 else ok = kFALSE;
2624 } // pt cut
2625 else ok = kFALSE;
2626
2627 //Photon 2
2628 phi = d2->Phi()*180./TMath::Pi(); //Convert to degrees
2629 eta =TMath::Abs(d2->Eta()); //in calos etamin=-etamax
2630
2631 if(d2->Pt() > fTriggerParticleMinPt)
2632 {
2633 //printf("\t Check acceptance photon 2! \n");
2634 if(CheckDetectorAcceptance(phi,eta,i))
2635 {
2636 //printf("\t Accept Photon 2\n");
2637 ok =kTRUE;
2638 AliDebug(1,Form("Selected trigger pdg %d (decay), status %d, pt %2.2f, eta %2.2f, phi %2.2f\n",pdg,status,iparticle->Pt(), eta, phi));
2639 break;
2640 }
2641 else ok = kFALSE;
2642 } // pt cut
2643 else ok = kFALSE;
2644 } // force 2 photon daughters in pi0/eta decays
2645 else ok = kFALSE;
2646 } else ok = kFALSE; // check acceptance
2647 } // primary loop
2648
2649 //
2650 // If requested, rotate the particles event in phi to enhance/speed PHOS selection
2651 // A particle passing all trigger conditions except phi position in PHOS, is used as reference
2652 //
2653 if(fCheckPHOSeta)
2654 {
2655 RotatePhi(ok);
2656 }
2657
2658 return ok;
2659}
2660