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