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