]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PYTHIA6/AliGenPythia.cxx
Remove spurious file
[u/mrichter/AliRoot.git] / PYTHIA6 / AliGenPythia.cxx
CommitLineData
8d2cd130 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
7cdba479 16/* $Id$ */
8d2cd130 17
18//
19// Generator using the TPythia interface (via AliPythia)
20// to generate pp collisions.
21// Using SetNuclei() also nuclear modifications to the structure functions
22// can be taken into account. This makes, of course, only sense for the
23// generation of the products of hard processes (heavy flavor, jets ...)
24//
25// andreas.morsch@cern.ch
26//
27
37b09b91 28#include <TClonesArray.h>
8d2cd130 29#include <TDatabasePDG.h>
30#include <TParticle.h>
31#include <TPDGCode.h>
1058d9df 32#include <TObjArray.h>
8d2cd130 33#include <TSystem.h>
34#include <TTree.h>
8d2cd130 35#include "AliConst.h"
36#include "AliDecayerPythia.h"
37#include "AliGenPythia.h"
cd07c39b 38#include "AliFastGlauber.h"
5fa4b20b 39#include "AliHeader.h"
8d2cd130 40#include "AliGenPythiaEventHeader.h"
41#include "AliPythia.h"
7cdba479 42#include "AliPythiaRndm.h"
8d2cd130 43#include "AliRun.h"
7ea3ea5b 44#include "AliStack.h"
45#include "AliRunLoader.h"
5d12ce38 46#include "AliMC.h"
c93255fe 47#include "AliLog.h"
e2d34d35 48#include "PyquenCommon.h"
800be8b7 49#include "AliLog.h"
8d2cd130 50
014a9521 51ClassImp(AliGenPythia)
8d2cd130 52
e8a8adcd 53
54AliGenPythia::AliGenPythia():
55 AliGenMC(),
56 fProcess(kPyCharm),
efe3b1cd 57 fItune(-1),
e8a8adcd 58 fStrucFunc(kCTEQ5L),
e8a8adcd 59 fKineBias(0.),
60 fTrials(0),
61 fTrialsRun(0),
62 fQ(0.),
63 fX1(0.),
64 fX2(0.),
65 fEventTime(0.),
66 fInteractionRate(0.),
67 fTimeWindow(0.),
68 fCurSubEvent(0),
69 fEventsTime(0),
70 fNev(0),
71 fFlavorSelect(0),
72 fXsection(0.),
73 fPythia(0),
74 fPtHardMin(0.),
75 fPtHardMax(1.e4),
76 fYHardMin(-1.e10),
77 fYHardMax(1.e10),
78 fGinit(1),
79 fGfinal(1),
80 fHadronisation(1),
03358a32 81 fPatchOmegaDalitz(0),
e8a8adcd 82 fNpartons(0),
83 fReadFromFile(0),
64da86aa 84 fReadLHEF(0),
e8a8adcd 85 fQuench(0),
cd07c39b 86 fQhat(0.),
87 fLength(0.),
66b8652c 88 fpyquenT(1.),
89 fpyquenTau(0.1),
90 fpyquenNf(0),
91 fpyquenEloss(0),
92 fpyquenAngle(0),
e6fe9b82 93 fImpact(0.),
e8a8adcd 94 fPtKick(1.),
95 fFullEvent(kTRUE),
96 fDecayer(new AliDecayerPythia()),
97 fDebugEventFirst(-1),
98 fDebugEventLast(-1),
99 fEtMinJet(0.),
100 fEtMaxJet(1.e4),
101 fEtaMinJet(-20.),
102 fEtaMaxJet(20.),
103 fPhiMinJet(0.),
104 fPhiMaxJet(2.* TMath::Pi()),
105 fJetReconstruction(kCell),
106 fEtaMinGamma(-20.),
107 fEtaMaxGamma(20.),
108 fPhiMinGamma(0.),
109 fPhiMaxGamma(2. * TMath::Pi()),
110 fPycellEtaMax(2.),
111 fPycellNEta(274),
112 fPycellNPhi(432),
113 fPycellThreshold(0.),
114 fPycellEtSeed(4.),
115 fPycellMinEtJet(10.),
116 fPycellMaxRadius(1.),
117 fStackFillOpt(kFlavorSelection),
118 fFeedDownOpt(kTRUE),
119 fFragmentation(kTRUE),
120 fSetNuclei(kFALSE),
fb355e51 121 fUseNuclearPDF(kFALSE),
122 fUseLorentzBoost(kTRUE),
e8a8adcd 123 fNewMIS(kFALSE),
124 fHFoff(kFALSE),
20e47f08 125 fNucPdf(0),
e8a8adcd 126 fTriggerParticle(0),
127 fTriggerEta(0.9),
2591bd0e 128 fTriggerMinPt(-1),
129 fTriggerMaxPt(1000),
700b9416 130 fTriggerMultiplicity(0),
131 fTriggerMultiplicityEta(0),
38112f3f 132 fTriggerMultiplicityPtMin(0),
e8a8adcd 133 fCountMode(kCountAll),
134 fHeader(0),
135 fRL(0),
777e69b0 136 fkFileName(0),
64da86aa 137 fkNameLHEF(0),
9fd8e520 138 fFragPhotonInCalo(kFALSE),
43e3b80a 139 fHadronInCalo(kFALSE) ,
ec2c406e 140 fPi0InCalo(kFALSE) ,
40fe59d4 141 fEtaInCalo(kFALSE) ,
142 fPhotonInCalo(kFALSE), // not in use
143 fDecayPhotonInCalo(kFALSE),
144 fForceNeutralMeson2PhotonDecay(kFALSE),
145 fEleInCalo(kFALSE),
146 fEleInEMCAL(kFALSE), // not in use
147 fCheckBarrel(kFALSE),
9fd8e520 148 fCheckEMCAL(kFALSE),
149 fCheckPHOS(kFALSE),
90a236ce 150 fCheckPHOSeta(kFALSE),
40fe59d4 151 fPHOSRotateCandidate(-1),
43e3b80a 152 fTriggerParticleMinPt(0),
40fe59d4 153 fPhotonMinPt(0), // not in use
154 fElectronMinPt(0), // not in use
9fd8e520 155 fPHOSMinPhi(219.),
156 fPHOSMaxPhi(321.),
157 fPHOSEta(0.13),
158 fEMCALMinPhi(79.),
159 fEMCALMaxPhi(191.),
800be8b7 160 fEMCALEta(0.71),
161 fkTuneForDiff(0),
162 fProcDiff(0)
8d2cd130 163{
164// Default Constructor
e7c989e4 165 fEnergyCMS = 5500.;
7cdba479 166 if (!AliPythiaRndm::GetPythiaRandom())
e8a8adcd 167 AliPythiaRndm::SetPythiaRandom(GetRandom());
8d2cd130 168}
169
170AliGenPythia::AliGenPythia(Int_t npart)
e8a8adcd 171 :AliGenMC(npart),
172 fProcess(kPyCharm),
efe3b1cd 173 fItune(-1),
e8a8adcd 174 fStrucFunc(kCTEQ5L),
e8a8adcd 175 fKineBias(0.),
176 fTrials(0),
177 fTrialsRun(0),
178 fQ(0.),
179 fX1(0.),
180 fX2(0.),
181 fEventTime(0.),
182 fInteractionRate(0.),
183 fTimeWindow(0.),
184 fCurSubEvent(0),
185 fEventsTime(0),
186 fNev(0),
187 fFlavorSelect(0),
188 fXsection(0.),
189 fPythia(0),
190 fPtHardMin(0.),
191 fPtHardMax(1.e4),
192 fYHardMin(-1.e10),
193 fYHardMax(1.e10),
194 fGinit(kTRUE),
195 fGfinal(kTRUE),
196 fHadronisation(kTRUE),
03358a32 197 fPatchOmegaDalitz(0),
e8a8adcd 198 fNpartons(0),
199 fReadFromFile(kFALSE),
64da86aa 200 fReadLHEF(0),
e8a8adcd 201 fQuench(kFALSE),
cd07c39b 202 fQhat(0.),
203 fLength(0.),
66b8652c 204 fpyquenT(1.),
205 fpyquenTau(0.1),
206 fpyquenNf(0),
207 fpyquenEloss(0),
208 fpyquenAngle(0),
e6fe9b82 209 fImpact(0.),
e8a8adcd 210 fPtKick(1.),
211 fFullEvent(kTRUE),
212 fDecayer(new AliDecayerPythia()),
213 fDebugEventFirst(-1),
214 fDebugEventLast(-1),
215 fEtMinJet(0.),
216 fEtMaxJet(1.e4),
217 fEtaMinJet(-20.),
218 fEtaMaxJet(20.),
219 fPhiMinJet(0.),
220 fPhiMaxJet(2.* TMath::Pi()),
221 fJetReconstruction(kCell),
222 fEtaMinGamma(-20.),
223 fEtaMaxGamma(20.),
224 fPhiMinGamma(0.),
225 fPhiMaxGamma(2. * TMath::Pi()),
226 fPycellEtaMax(2.),
227 fPycellNEta(274),
228 fPycellNPhi(432),
229 fPycellThreshold(0.),
230 fPycellEtSeed(4.),
231 fPycellMinEtJet(10.),
232 fPycellMaxRadius(1.),
233 fStackFillOpt(kFlavorSelection),
234 fFeedDownOpt(kTRUE),
235 fFragmentation(kTRUE),
236 fSetNuclei(kFALSE),
fb355e51 237 fUseNuclearPDF(kFALSE),
238 fUseLorentzBoost(kTRUE),
e8a8adcd 239 fNewMIS(kFALSE),
240 fHFoff(kFALSE),
20e47f08 241 fNucPdf(0),
e8a8adcd 242 fTriggerParticle(0),
2591bd0e 243 fTriggerEta(0.9),
244 fTriggerMinPt(-1),
245 fTriggerMaxPt(1000),
700b9416 246 fTriggerMultiplicity(0),
247 fTriggerMultiplicityEta(0),
38112f3f 248 fTriggerMultiplicityPtMin(0),
e8a8adcd 249 fCountMode(kCountAll),
250 fHeader(0),
251 fRL(0),
777e69b0 252 fkFileName(0),
64da86aa 253 fkNameLHEF(0),
9fd8e520 254 fFragPhotonInCalo(kFALSE),
43e3b80a 255 fHadronInCalo(kFALSE) ,
ec2c406e 256 fPi0InCalo(kFALSE) ,
40fe59d4 257 fEtaInCalo(kFALSE) ,
258 fPhotonInCalo(kFALSE), // not in use
259 fDecayPhotonInCalo(kFALSE),
260 fForceNeutralMeson2PhotonDecay(kFALSE),
261 fEleInCalo(kFALSE),
262 fEleInEMCAL(kFALSE), // not in use
263 fCheckBarrel(kFALSE),
9fd8e520 264 fCheckEMCAL(kFALSE),
265 fCheckPHOS(kFALSE),
90a236ce 266 fCheckPHOSeta(kFALSE),
40fe59d4 267 fPHOSRotateCandidate(-1),
43e3b80a 268 fTriggerParticleMinPt(0),
40fe59d4 269 fPhotonMinPt(0), // not in use
270 fElectronMinPt(0), // not in use
9fd8e520 271 fPHOSMinPhi(219.),
272 fPHOSMaxPhi(321.),
273 fPHOSEta(0.13),
274 fEMCALMinPhi(79.),
275 fEMCALMaxPhi(191.),
800be8b7 276 fEMCALEta(0.71),
277 fkTuneForDiff(0),
278 fProcDiff(0)
8d2cd130 279{
280// default charm production at 5. 5 TeV
281// semimuonic decay
282// structure function GRVHO
283//
e7c989e4 284 fEnergyCMS = 5500.;
8d2cd130 285 fName = "Pythia";
286 fTitle= "Particle Generator using PYTHIA";
8d2cd130 287 SetForceDecay();
8d2cd130 288 // Set random number generator
7cdba479 289 if (!AliPythiaRndm::GetPythiaRandom())
290 AliPythiaRndm::SetPythiaRandom(GetRandom());
76d6ba9a 291 }
8d2cd130 292
8d2cd130 293AliGenPythia::~AliGenPythia()
294{
295// Destructor
9d7108a7 296 if(fEventsTime) delete fEventsTime;
297}
298
299void AliGenPythia::SetInteractionRate(Float_t rate,Float_t timewindow)
300{
301// Generate pileup using user specified rate
302 fInteractionRate = rate;
303 fTimeWindow = timewindow;
304 GeneratePileup();
305}
306
307void AliGenPythia::GeneratePileup()
308{
309// Generate sub events time for pileup
310 fEventsTime = 0;
311 if(fInteractionRate == 0.) {
312 Warning("GeneratePileup","Zero interaction specified. Skipping pileup generation.\n");
313 return;
314 }
315
316 Int_t npart = NumberParticles();
317 if(npart < 0) {
318 Warning("GeneratePileup","Negative number of particles. Skipping pileup generation.\n");
319 return;
320 }
321
322 if(fEventsTime) delete fEventsTime;
323 fEventsTime = new TArrayF(npart);
324 TArrayF &array = *fEventsTime;
325 for(Int_t ipart = 0; ipart < npart; ipart++)
326 array[ipart] = 0.;
327
328 Float_t eventtime = 0.;
329 while(1)
330 {
331 eventtime += (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
332 if(eventtime > fTimeWindow) break;
333 array.Set(array.GetSize()+1);
334 array[array.GetSize()-1] = eventtime;
335 }
336
337 eventtime = 0.;
338 while(1)
339 {
340 eventtime -= (AliPythiaRndm::GetPythiaRandom())->Exp(1./fInteractionRate);
341 if(TMath::Abs(eventtime) > fTimeWindow) break;
342 array.Set(array.GetSize()+1);
343 array[array.GetSize()-1] = eventtime;
344 }
345
346 SetNumberParticles(fEventsTime->GetSize());
8d2cd130 347}
348
592f8307 349void AliGenPythia::SetPycellParameters(Float_t etamax, Int_t neta, Int_t nphi,
350 Float_t thresh, Float_t etseed, Float_t minet, Float_t r)
351{
352// Set pycell parameters
353 fPycellEtaMax = etamax;
354 fPycellNEta = neta;
355 fPycellNPhi = nphi;
356 fPycellThreshold = thresh;
357 fPycellEtSeed = etseed;
358 fPycellMinEtJet = minet;
359 fPycellMaxRadius = r;
360}
361
362
363
8d2cd130 364void AliGenPythia::SetEventListRange(Int_t eventFirst, Int_t eventLast)
365{
366 // Set a range of event numbers, for which a table
367 // of generated particle will be printed
368 fDebugEventFirst = eventFirst;
369 fDebugEventLast = eventLast;
370 if (fDebugEventLast==-1) fDebugEventLast=fDebugEventFirst;
371}
372
373void AliGenPythia::Init()
374{
375// Initialisation
376
377 SetMC(AliPythia::Instance());
b88f5cea 378 fPythia=(AliPythia*) fMCEvGen;
e2bddf81 379
8d2cd130 380//
381 fParentWeight=1./Float_t(fNpart);
382//
8d2cd130 383
384
385 fPythia->SetCKIN(3,fPtHardMin);
386 fPythia->SetCKIN(4,fPtHardMax);
387 fPythia->SetCKIN(7,fYHardMin);
388 fPythia->SetCKIN(8,fYHardMax);
389
e28ccdaf 390 if (fProjectile != "p" || fTarget != "p") fPythia->SetCollisionSystem(fProjectile,fTarget);
391
fb355e51 392 if(fUseNuclearPDF)
393 fPythia->SetNuclei(fAProjectile, fATarget, fNucPdf);
8d2cd130 394 // Fragmentation?
395 if (fFragmentation) {
396 fPythia->SetMSTP(111,1);
397 } else {
398 fPythia->SetMSTP(111,0);
399 }
400
401
402// initial state radiation
403 fPythia->SetMSTP(61,fGinit);
404// final state radiation
405 fPythia->SetMSTP(71,fGfinal);
406// pt - kick
407 if (fPtKick > 0.) {
408 fPythia->SetMSTP(91,1);
688950ef 409 fPythia->SetPARP(91,fPtKick);
410 fPythia->SetPARP(93, 4. * fPtKick);
8d2cd130 411 } else {
412 fPythia->SetMSTP(91,0);
413 }
414
64da86aa 415 if (fReadLHEF) fPythia->OpenFortranFile(97, const_cast<char*>(fkNameLHEF));
416
5fa4b20b 417 if (fReadFromFile) {
777e69b0 418 fRL = AliRunLoader::Open(fkFileName, "Partons");
5fa4b20b 419 fRL->LoadKinematics();
420 fRL->LoadHeader();
421 } else {
422 fRL = 0x0;
423 }
fdea4387 424 //
efe3b1cd 425 fPythia->ProcInit(fProcess,fEnergyCMS,fStrucFunc, fItune);
fdea4387 426 // Forward Paramters to the AliPythia object
427 fDecayer->SetForceDecay(fForceDecay);
beac474c 428// Switch off Heavy Flavors on request
429 if (fHFoff) {
51387949 430 // Maximum number of quark flavours used in pdf
beac474c 431 fPythia->SetMSTP(58, 3);
51387949 432 // Maximum number of flavors that can be used in showers
beac474c 433 fPythia->SetMSTJ(45, 3);
51387949 434 // Switch off g->QQbar splitting in decay table
435 ((AliDecayerPythia*) fDecayer)->HeavyFlavourOff();
beac474c 436 }
fdea4387 437
51387949 438 fDecayer->Init();
439
8d2cd130 440
441// Parent and Children Selection
442 switch (fProcess)
443 {
65f2626c 444 case kPyOldUEQ2ordered:
445 case kPyOldUEQ2ordered2:
446 case kPyOldPopcorn:
447 break;
8d2cd130 448 case kPyCharm:
449 case kPyCharmUnforced:
adf4d898 450 case kPyCharmPbPbMNR:
aabc7187 451 case kPyCharmpPbMNR:
e0e89f40 452 case kPyCharmppMNR:
453 case kPyCharmppMNRwmi:
64da86aa 454 case kPyCharmPWHG:
8d2cd130 455 fParentSelect[0] = 411;
456 fParentSelect[1] = 421;
457 fParentSelect[2] = 431;
458 fParentSelect[3] = 4122;
9ccc3d0e 459 fParentSelect[4] = 4232;
460 fParentSelect[5] = 4132;
461 fParentSelect[6] = 4332;
8d2cd130 462 fFlavorSelect = 4;
463 break;
adf4d898 464 case kPyD0PbPbMNR:
465 case kPyD0pPbMNR:
466 case kPyD0ppMNR:
8d2cd130 467 fParentSelect[0] = 421;
468 fFlavorSelect = 4;
469 break;
90d7b703 470 case kPyDPlusPbPbMNR:
471 case kPyDPluspPbMNR:
472 case kPyDPlusppMNR:
473 fParentSelect[0] = 411;
474 fFlavorSelect = 4;
475 break;
e0e89f40 476 case kPyDPlusStrangePbPbMNR:
477 case kPyDPlusStrangepPbMNR:
478 case kPyDPlusStrangeppMNR:
479 fParentSelect[0] = 431;
480 fFlavorSelect = 4;
481 break;
68504d42 482 case kPyLambdacppMNR:
483 fParentSelect[0] = 4122;
484 fFlavorSelect = 4;
485 break;
8d2cd130 486 case kPyBeauty:
9dfe63b3 487 case kPyBeautyJets:
adf4d898 488 case kPyBeautyPbPbMNR:
489 case kPyBeautypPbMNR:
490 case kPyBeautyppMNR:
e0e89f40 491 case kPyBeautyppMNRwmi:
64da86aa 492 case kPyBeautyPWHG:
8d2cd130 493 fParentSelect[0]= 511;
494 fParentSelect[1]= 521;
495 fParentSelect[2]= 531;
496 fParentSelect[3]= 5122;
497 fParentSelect[4]= 5132;
498 fParentSelect[5]= 5232;
499 fParentSelect[6]= 5332;
500 fFlavorSelect = 5;
501 break;
502 case kPyBeautyUnforced:
503 fParentSelect[0] = 511;
504 fParentSelect[1] = 521;
505 fParentSelect[2] = 531;
506 fParentSelect[3] = 5122;
507 fParentSelect[4] = 5132;
508 fParentSelect[5] = 5232;
509 fParentSelect[6] = 5332;
510 fFlavorSelect = 5;
511 break;
512 case kPyJpsiChi:
513 case kPyJpsi:
514 fParentSelect[0] = 443;
515 break;
f529e69b 516 case kPyMbDefault:
0bd3d7c5 517 case kPyMbAtlasTuneMC09:
8d2cd130 518 case kPyMb:
04081a91 519 case kPyMbWithDirectPhoton:
8d2cd130 520 case kPyMbNonDiffr:
d7de4a67 521 case kPyMbMSEL1:
8d2cd130 522 case kPyJets:
64da86aa 523 case kPyJetsPWHG:
8d2cd130 524 case kPyDirectGamma:
e33acb67 525 case kPyLhwgMb:
8d2cd130 526 break;
e136a92a 527 case kPyWPWHG: /// !!!!!!!!!! Change done for W prod with POWHEG !!!!!!!!!! :)
589380c6 528 case kPyW:
0f6ee828 529 case kPyZ:
9a8774a1 530 case kPyMBRSingleDiffraction:
531 case kPyMBRDoubleDiffraction:
532 case kPyMBRCentralDiffraction:
589380c6 533 break;
8d2cd130 534 }
535//
592f8307 536//
537// JetFinder for Trigger
538//
539// Configure detector (EMCAL like)
540//
d7de4a67 541 fPythia->SetPARU(51, fPycellEtaMax);
542 fPythia->SetMSTU(51, fPycellNEta);
543 fPythia->SetMSTU(52, fPycellNPhi);
592f8307 544//
545// Configure Jet Finder
546//
d7de4a67 547 fPythia->SetPARU(58, fPycellThreshold);
548 fPythia->SetPARU(52, fPycellEtSeed);
549 fPythia->SetPARU(53, fPycellMinEtJet);
550 fPythia->SetPARU(54, fPycellMaxRadius);
551 fPythia->SetMSTU(54, 2);
592f8307 552//
8d2cd130 553// This counts the total number of calls to Pyevnt() per run.
554 fTrialsRun = 0;
555 fQ = 0.;
556 fX1 = 0.;
557 fX2 = 0.;
558 fNev = 0 ;
559//
1d568bc2 560//
561//
8d2cd130 562 AliGenMC::Init();
fb355e51 563
564 // Reset Lorentz boost if demanded
565 if(!fUseLorentzBoost) {
566 fDyBoost = 0;
567 Warning("Init","Demand to discard Lorentz boost.\n");
568 }
1d568bc2 569//
570//
571//
572 if (fSetNuclei) {
fb355e51 573 fDyBoost = 0;
574 Warning("Init","Deprecated function SetNuclei() used (nPDFs + no boost). Use SetProjectile + SetTarget + SetUseNuclearPDF + SetUseLorentzBoost instead.\n");
1d568bc2 575 }
cd07c39b 576 fPythia->SetPARJ(200, 0.0);
577 fPythia->SetPARJ(199, 0.0);
578 fPythia->SetPARJ(198, 0.0);
579 fPythia->SetPARJ(197, 0.0);
580
581 if (fQuench == 1) {
5fa4b20b 582 fPythia->InitQuenching(0., 0.1, 0.6e6, 0);
32d6ef7d 583 }
3a709cfa 584
66b8652c 585 if(fQuench ==2){fPythia->SetPyquenParameters(fpyquenT,fpyquenTau,fpyquenNf,fpyquenEloss,fpyquenAngle);}
586
b976f7d8 587 if (fQuench == 3) {
588 // Nestor's change of the splittings
589 fPythia->SetPARJ(200, 0.8);
590 fPythia->SetMSTJ(41, 1); // QCD radiation only
591 fPythia->SetMSTJ(42, 2); // angular ordering
592 fPythia->SetMSTJ(44, 2); // option to run alpha_s
593 fPythia->SetMSTJ(47, 0); // No correction back to hard scattering element
594 fPythia->SetMSTJ(50, 0); // No coherence in first branching
595 fPythia->SetPARJ(82, 1.); // Cut off for parton showers
cd07c39b 596 } else if (fQuench == 4) {
597 // Armesto-Cunqueiro-Salgado change of the splittings.
598 AliFastGlauber* glauber = AliFastGlauber::Instance();
599 glauber->Init(2);
600 //read and store transverse almonds corresponding to differnt
601 //impact parameters.
cd07c39b 602 glauber->SetCentralityClass(0.,0.1);
603 fPythia->SetPARJ(200, 1.);
604 fPythia->SetPARJ(198, fQhat);
605 fPythia->SetPARJ(199, fLength);
cd07c39b 606 fPythia->SetMSTJ(42, 2); // angular ordering
607 fPythia->SetMSTJ(44, 2); // option to run alpha_s
cd07c39b 608 fPythia->SetPARJ(82, 1.); // Cut off for parton showers
b976f7d8 609 }
8d2cd130 610}
611
612void AliGenPythia::Generate()
613{
614// Generate one event
19ef8cf0 615 if (!fPythia) fPythia=(AliPythia*) fMCEvGen;
8d2cd130 616 fDecayer->ForceDecay();
617
13cca24a 618 Double_t polar[3] = {0,0,0};
619 Double_t origin[3] = {0,0,0};
620 Double_t p[4];
8d2cd130 621// converts from mm/c to s
622 const Float_t kconv=0.001/2.999792458e8;
623//
624 Int_t nt=0;
625 Int_t jev=0;
626 Int_t j, kf;
627 fTrials=0;
f913ec4f 628 fEventTime = 0.;
629
2590ccf9 630
8d2cd130 631
632 // Set collision vertex position
2590ccf9 633 if (fVertexSmear == kPerEvent) Vertex();
634
8d2cd130 635// event loop
636 while(1)
637 {
32d6ef7d 638//
5fa4b20b 639// Produce event
32d6ef7d 640//
32d6ef7d 641//
5fa4b20b 642// Switch hadronisation off
643//
644 fPythia->SetMSTJ(1, 0);
cd07c39b 645
646 if (fQuench ==4){
647 Double_t bimp;
648 // Quenching comes through medium-modified splitting functions.
649 AliFastGlauber::Instance()->GetRandomBHard(bimp);
e6fe9b82 650 fPythia->SetPARJ(197, bimp);
651 fImpact = bimp;
6c43eccb 652 fPythia->Qpygin0();
cd07c39b 653 }
32d6ef7d 654//
5fa4b20b 655// Either produce new event or read partons from file
656//
657 if (!fReadFromFile) {
beac474c 658 if (!fNewMIS) {
659 fPythia->Pyevnt();
660 } else {
661 fPythia->Pyevnw();
662 }
5fa4b20b 663 fNpartons = fPythia->GetN();
664 } else {
33c3c91a 665 printf("Loading Event %d\n",AliRunLoader::Instance()->GetEventNumber());
666 fRL->GetEvent(AliRunLoader::Instance()->GetEventNumber());
5fa4b20b 667 fPythia->SetN(0);
668 LoadEvent(fRL->Stack(), 0 , 1);
669 fPythia->Pyedit(21);
670 }
671
32d6ef7d 672//
673// Run quenching routine
674//
5fa4b20b 675 if (fQuench == 1) {
676 fPythia->Quench();
677 } else if (fQuench == 2){
678 fPythia->Pyquen(208., 0, 0.);
b976f7d8 679 } else if (fQuench == 3) {
680 // Quenching is via multiplicative correction of the splittings
5fa4b20b 681 }
b976f7d8 682
32d6ef7d 683//
5fa4b20b 684// Switch hadronisation on
32d6ef7d 685//
20e47f08 686 if (fHadronisation) {
687 fPythia->SetMSTJ(1, 1);
5fa4b20b 688//
689// .. and perform hadronisation
aea21c57 690// printf("Calling hadronisation %d\n", fPythia->GetN());
03358a32 691
692 if (fPatchOmegaDalitz) {
693 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 0);
694 fPythia->Pyexec();
695 fPythia->DalitzDecays();
696 fPythia->SetMDCY(fPythia->Pycomp(111) ,1, 1);
697 }
698 fPythia->Pyexec();
20e47f08 699 }
8d2cd130 700 fTrials++;
8507138f 701 fPythia->ImportParticles(&fParticles,"All");
03358a32 702
df275cfa 703 if (TMath::Abs(fDyBoost) > 1.e-4) Boost();
e1cf8975 704 if(TMath::Abs(fXingAngleY) > 1.e-10) BeamCrossAngle();
f64640b5 705
8d2cd130 706//
707//
708//
709 Int_t i;
710
dbd64db6 711 fNprimaries = 0;
8507138f 712 Int_t np = fParticles.GetEntriesFast();
5fa4b20b 713
7c21f297 714 if (np == 0) continue;
8d2cd130 715//
2590ccf9 716
8d2cd130 717//
718 Int_t* pParent = new Int_t[np];
719 Int_t* pSelected = new Int_t[np];
720 Int_t* trackIt = new Int_t[np];
5fa4b20b 721 for (i = 0; i < np; i++) {
8d2cd130 722 pParent[i] = -1;
723 pSelected[i] = 0;
724 trackIt[i] = 0;
725 }
726
727 Int_t nc = 0; // Total n. of selected particles
728 Int_t nParents = 0; // Selected parents
729 Int_t nTkbles = 0; // Trackable particles
f529e69b 730 if (fProcess != kPyMbDefault &&
731 fProcess != kPyMb &&
6d2ec66d 732 fProcess != kPyMbAtlasTuneMC09 &&
04081a91 733 fProcess != kPyMbWithDirectPhoton &&
f529e69b 734 fProcess != kPyJets &&
8d2cd130 735 fProcess != kPyDirectGamma &&
589380c6 736 fProcess != kPyMbNonDiffr &&
d7de4a67 737 fProcess != kPyMbMSEL1 &&
f529e69b 738 fProcess != kPyW &&
739 fProcess != kPyZ &&
740 fProcess != kPyCharmppMNRwmi &&
9dfe63b3 741 fProcess != kPyBeautyppMNRwmi &&
64da86aa 742 fProcess != kPyBeautyJets &&
e136a92a 743 fProcess != kPyWPWHG && /// !!!!!!!!!!!!!!!!! Change done for W with POHWEG !!!!!!!!!!!!!!!!!!! :)
64da86aa 744 fProcess != kPyJetsPWHG &&
745 fProcess != kPyCharmPWHG &&
746 fProcess != kPyBeautyPWHG) {
8d2cd130 747
5fa4b20b 748 for (i = 0; i < np; i++) {
8507138f 749 TParticle* iparticle = (TParticle *) fParticles.At(i);
8d2cd130 750 Int_t ks = iparticle->GetStatusCode();
751 kf = CheckPDGCode(iparticle->GetPdgCode());
752// No initial state partons
753 if (ks==21) continue;
754//
755// Heavy Flavor Selection
756//
757 // quark ?
758 kf = TMath::Abs(kf);
759 Int_t kfl = kf;
9ff6c04c 760 // Resonance
f913ec4f 761
9ff6c04c 762 if (kfl > 100000) kfl %= 100000;
183a5ca9 763 if (kfl > 10000) kfl %= 10000;
8d2cd130 764 // meson ?
765 if (kfl > 10) kfl/=100;
766 // baryon
767 if (kfl > 10) kfl/=10;
8d2cd130 768 Int_t ipa = iparticle->GetFirstMother()-1;
769 Int_t kfMo = 0;
f913ec4f 770//
771// Establish mother daughter relation between heavy quarks and mesons
772//
773 if (kf >= fFlavorSelect && kf <= 6) {
774 Int_t idau = iparticle->GetFirstDaughter() - 1;
775 if (idau > -1) {
8507138f 776 TParticle* daughter = (TParticle *) fParticles.At(idau);
f913ec4f 777 Int_t pdgD = daughter->GetPdgCode();
778 if (pdgD == 91 || pdgD == 92) {
779 Int_t jmin = daughter->GetFirstDaughter() - 1;
780 Int_t jmax = daughter->GetLastDaughter() - 1;
2ab330c9 781 for (Int_t jp = jmin; jp <= jmax; jp++)
782 ((TParticle *) fParticles.At(jp))->SetFirstMother(i+1);
f913ec4f 783 } // is string or cluster
784 } // has daughter
785 } // heavy quark
8d2cd130 786
f913ec4f 787
8d2cd130 788 if (ipa > -1) {
8507138f 789 TParticle * mother = (TParticle *) fParticles.At(ipa);
8d2cd130 790 kfMo = TMath::Abs(mother->GetPdgCode());
791 }
f913ec4f 792
8d2cd130 793 // What to keep in Stack?
794 Bool_t flavorOK = kFALSE;
795 Bool_t selectOK = kFALSE;
796 if (fFeedDownOpt) {
32d6ef7d 797 if (kfl >= fFlavorSelect) flavorOK = kTRUE;
8d2cd130 798 } else {
32d6ef7d 799 if (kfl > fFlavorSelect) {
800 nc = -1;
801 break;
802 }
803 if (kfl == fFlavorSelect) flavorOK = kTRUE;
8d2cd130 804 }
805 switch (fStackFillOpt) {
06956108 806 case kHeavyFlavor:
8d2cd130 807 case kFlavorSelection:
32d6ef7d 808 selectOK = kTRUE;
809 break;
8d2cd130 810 case kParentSelection:
32d6ef7d 811 if (ParentSelected(kf) || kf <= 10) selectOK = kTRUE;
812 break;
8d2cd130 813 }
814 if (flavorOK && selectOK) {
815//
816// Heavy flavor hadron or quark
817//
818// Kinematic seletion on final state heavy flavor mesons
819 if (ParentSelected(kf) && !KinematicSelection(iparticle, 0))
820 {
9ff6c04c 821 continue;
8d2cd130 822 }
823 pSelected[i] = 1;
824 if (ParentSelected(kf)) ++nParents; // Update parent count
825// printf("\n particle (HF) %d %d %d", i, pSelected[i], kf);
826 } else {
827// Kinematic seletion on decay products
828 if (fCutOnChild && ParentSelected(kfMo) && ChildSelected(kf)
9ff6c04c 829 && !KinematicSelection(iparticle, 1))
8d2cd130 830 {
9ff6c04c 831 continue;
8d2cd130 832 }
833//
834// Decay products
835// Select if mother was selected and is not tracked
836
837 if (pSelected[ipa] &&
838 !trackIt[ipa] && // mother will be tracked ?
839 kfMo != 5 && // mother is b-quark, don't store fragments
840 kfMo != 4 && // mother is c-quark, don't store fragments
841 kf != 92) // don't store string
842 {
843//
844// Semi-stable or de-selected: diselect decay products:
845//
846//
847 if (pSelected[i] == -1 || fDecayer->GetLifetime(kf) > fMaxLifeTime)
848 {
849 Int_t ipF = iparticle->GetFirstDaughter();
850 Int_t ipL = iparticle->GetLastDaughter();
851 if (ipF > 0) for (j = ipF-1; j < ipL; j++) pSelected[j] = -1;
852 }
853// printf("\n particle (decay) %d %d %d", i, pSelected[i], kf);
854 pSelected[i] = (pSelected[i] == -1) ? 0 : 1;
855 }
856 }
857 if (pSelected[i] == -1) pSelected[i] = 0;
858 if (!pSelected[i]) continue;
859 // Count quarks only if you did not include fragmentation
860 if (fFragmentation && kf <= 10) continue;
9ff6c04c 861
8d2cd130 862 nc++;
863// Decision on tracking
864 trackIt[i] = 0;
865//
866// Track final state particle
867 if (ks == 1) trackIt[i] = 1;
868// Track semi-stable particles
d25cfd65 869 if ((ks == 1) || (fDecayer->GetLifetime(kf) > fMaxLifeTime)) trackIt[i] = 1;
8d2cd130 870// Track particles selected by process if undecayed.
871 if (fForceDecay == kNoDecay) {
872 if (ParentSelected(kf)) trackIt[i] = 1;
873 } else {
874 if (ParentSelected(kf)) trackIt[i] = 0;
875 }
876 if (trackIt[i] == 1) ++nTkbles; // Update trackable counter
877//
878//
879
880 } // particle selection loop
881 if (nc > 0) {
882 for (i = 0; i<np; i++) {
883 if (!pSelected[i]) continue;
8507138f 884 TParticle * iparticle = (TParticle *) fParticles.At(i);
8d2cd130 885 kf = CheckPDGCode(iparticle->GetPdgCode());
886 Int_t ks = iparticle->GetStatusCode();
887 p[0] = iparticle->Px();
888 p[1] = iparticle->Py();
889 p[2] = iparticle->Pz();
a920faf9 890 p[3] = iparticle->Energy();
891
2590ccf9 892 origin[0] = fVertex[0]+iparticle->Vx()/10; // [cm]
893 origin[1] = fVertex[1]+iparticle->Vy()/10; // [cm]
894 origin[2] = fVertex[2]+iparticle->Vz()/10; // [cm]
895
21391258 896 Float_t tof = fTime + kconv*iparticle->T();
8d2cd130 897 Int_t ipa = iparticle->GetFirstMother()-1;
898 Int_t iparent = (ipa > -1) ? pParent[ipa] : -1;
a920faf9 899
900 PushTrack(fTrackIt*trackIt[i], iparent, kf,
901 p[0], p[1], p[2], p[3],
902 origin[0], origin[1], origin[2], tof,
903 polar[0], polar[1], polar[2],
904 kPPrimary, nt, 1., ks);
8d2cd130 905 pParent[i] = nt;
dbd64db6 906 KeepTrack(nt);
907 fNprimaries++;
642f15cf 908 } // PushTrack loop
8d2cd130 909 }
910 } else {
911 nc = GenerateMB();
912 } // mb ?
f913ec4f 913
914 GetSubEventTime();
8d2cd130 915
234f6d32 916 delete[] pParent;
917 delete[] pSelected;
918 delete[] trackIt;
8d2cd130 919
920 if (nc > 0) {
921 switch (fCountMode) {
922 case kCountAll:
923 // printf(" Count all \n");
924 jev += nc;
925 break;
926 case kCountParents:
927 // printf(" Count parents \n");
928 jev += nParents;
929 break;
930 case kCountTrackables:
931 // printf(" Count trackable \n");
932 jev += nTkbles;
933 break;
934 }
935 if (jev >= fNpart || fNpart == -1) {
936 fKineBias=Float_t(fNpart)/Float_t(fTrials);
e0e89f40 937
8d2cd130 938 fQ += fPythia->GetVINT(51);
939 fX1 += fPythia->GetVINT(41);
940 fX2 += fPythia->GetVINT(42);
941 fTrialsRun += fTrials;
942 fNev++;
943 MakeHeader();
944 break;
945 }
946 }
947 } // event loop
948 SetHighWaterMark(nt);
949// adjust weight due to kinematic selection
b88f5cea 950// AdjustWeights();
8d2cd130 951// get cross-section
952 fXsection=fPythia->GetPARI(1);
953}
954
955Int_t AliGenPythia::GenerateMB()
956{
957//
958// Min Bias selection and other global selections
959//
960 Int_t i, kf, nt, iparent;
961 Int_t nc = 0;
13cca24a 962 Double_t p[4];
963 Double_t polar[3] = {0,0,0};
964 Double_t origin[3] = {0,0,0};
8d2cd130 965// converts from mm/c to s
966 const Float_t kconv=0.001/2.999792458e8;
967
e0e89f40 968
8507138f 969 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
aea21c57 970
5fa4b20b 971
e0e89f40 972
8d2cd130 973 Int_t* pParent = new Int_t[np];
974 for (i=0; i< np; i++) pParent[i] = -1;
64da86aa 975 if ((fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG)
0e9e66f0 976 && fEtMinJet > 0.) {
bed3df2c 977 TParticle* jet1 = (TParticle *) fParticles.At(6);
8507138f 978 TParticle* jet2 = (TParticle *) fParticles.At(7);
bed3df2c 979
980 if (!jet1 || ! jet2 || !CheckTrigger(jet1, jet2)) {
234f6d32 981 delete [] pParent;
982 return 0;
983 }
8d2cd130 984 }
e0e89f40 985
40fe59d4 986
987 // Select events with fragmentation photon, decay photon, pi0, eta or other hadrons going to PHOS or EMCAL or central barrel,
ac01c7c6 988 // implemented primaryly for kPyJets, but extended to any kind of process.
40fe59d4 989 if ((fFragPhotonInCalo || fPi0InCalo || fEtaInCalo || fEleInCalo || fHadronInCalo || fDecayPhotonInCalo) &&
990 (fCheckPHOS || fCheckEMCAL || fCheckBarrel) ) {
991 Bool_t ok = TriggerOnSelectedParticles(np);
43e3b80a 992
993 if(!ok) {
994 delete[] pParent;
995 return 0;
ec2c406e 996 }
43e3b80a 997 }
9dfe63b3 998
800be8b7 999 // Check for diffraction
1000 if(fkTuneForDiff) {
c5dfa3e4 1001 if(fItune==320 && ( (TMath::Abs(fEnergyCMS - 900) < 1) || (TMath::Abs(fEnergyCMS - 2760) < 1) || (TMath::Abs(fEnergyCMS - 7000) < 1)) ) {
800be8b7 1002 if(!CheckDiffraction()) {
1003 delete [] pParent;
1004 return 0;
1005 }
1006 }
1007 }
1008
700b9416 1009 // Check for minimum multiplicity
1010 if (fTriggerMultiplicity > 0) {
1011 Int_t multiplicity = 0;
1012 for (i = 0; i < np; i++) {
8507138f 1013 TParticle * iparticle = (TParticle *) fParticles.At(i);
700b9416 1014
1015 Int_t statusCode = iparticle->GetStatusCode();
1016
1017 // Initial state particle
e296848e 1018 if (statusCode != 1)
700b9416 1019 continue;
38112f3f 1020 // eta cut
700b9416 1021 if (fTriggerMultiplicityEta > 0 && TMath::Abs(iparticle->Eta()) > fTriggerMultiplicityEta)
1022 continue;
38112f3f 1023 // pt cut
1024 if (iparticle->Pt() < fTriggerMultiplicityPtMin)
1025 continue;
1026
700b9416 1027 TParticlePDG* pdgPart = iparticle->GetPDG();
1028 if (pdgPart && pdgPart->Charge() == 0)
1029 continue;
1030
1031 ++multiplicity;
1032 }
1033
1034 if (multiplicity < fTriggerMultiplicity) {
1035 delete [] pParent;
1036 return 0;
1037 }
38112f3f 1038 Printf("Triggered on event with multiplicity of %d >= %d", multiplicity, fTriggerMultiplicity);
700b9416 1039 }
90a236ce 1040
90a236ce 1041
7ce1321b 1042 if (fTriggerParticle) {
1043 Bool_t triggered = kFALSE;
1044 for (i = 0; i < np; i++) {
8507138f 1045 TParticle * iparticle = (TParticle *) fParticles.At(i);
7ce1321b 1046 kf = CheckPDGCode(iparticle->GetPdgCode());
38db0ee6 1047 if (kf != fTriggerParticle) continue;
7ce1321b 1048 if (iparticle->Pt() == 0.) continue;
1049 if (TMath::Abs(iparticle->Eta()) > fTriggerEta) continue;
2591bd0e 1050 if ( iparticle->Pt() > fTriggerMaxPt || iparticle->Pt() < fTriggerMinPt ) continue;
7ce1321b 1051 triggered = kTRUE;
1052 break;
1053 }
234f6d32 1054 if (!triggered) {
1055 delete [] pParent;
1056 return 0;
1057 }
7ce1321b 1058 }
e0e89f40 1059
1060
1061 // Check if there is a ccbar or bbbar pair with at least one of the two
1062 // in fYMin < y < fYMax
2f405d65 1063
9dfe63b3 1064 if (fProcess == kPyCharmppMNRwmi || fProcess == kPyBeautyppMNRwmi || fProcess == kPyBeautyJets) {
9ccc3d0e 1065 TParticle *partCheck;
1066 TParticle *mother;
e0e89f40 1067 Bool_t theQ=kFALSE,theQbar=kFALSE,inYcut=kFALSE;
9ccc3d0e 1068 Bool_t theChild=kFALSE;
5d76923e 1069 Bool_t triggered=kFALSE;
9ccc3d0e 1070 Float_t y;
1071 Int_t pdg,mpdg,mpdgUpperFamily;
e0e89f40 1072 for(i=0; i<np; i++) {
9ccc3d0e 1073 partCheck = (TParticle*)fParticles.At(i);
1074 pdg = partCheck->GetPdgCode();
1075 if(TMath::Abs(pdg) == fFlavorSelect) { // quark
1076 if(pdg>0) { theQ=kTRUE; } else { theQbar=kTRUE; }
1077 y = 0.5*TMath::Log((partCheck->Energy()+partCheck->Pz()+1.e-13)/
1078 (partCheck->Energy()-partCheck->Pz()+1.e-13));
1079 if(y>fYMin && y<fYMax) inYcut=kTRUE;
1080 }
5d76923e 1081 if(fTriggerParticle) {
1082 if(TMath::Abs(pdg)==fTriggerParticle) triggered=kTRUE;
1083 }
9ccc3d0e 1084 if(fCutOnChild && TMath::Abs(pdg) == fPdgCodeParticleforAcceptanceCut) {
1085 Int_t mi = partCheck->GetFirstMother() - 1;
1086 if(mi<0) continue;
1087 mother = (TParticle*)fParticles.At(mi);
1088 mpdg=TMath::Abs(mother->GetPdgCode());
75fde694 1089 mpdgUpperFamily=(mpdg>1000 ? mpdg+1000 : mpdg+100); // keep e from c from b
9ccc3d0e 1090 if ( ParentSelected(mpdg) ||
1091 (fFlavorSelect==5 && ParentSelected(mpdgUpperFamily))) {
1092 if (KinematicSelection(partCheck,1)) {
1093 theChild=kTRUE;
1094 }
1095 }
1096 }
e0e89f40 1097 }
9ccc3d0e 1098 if (!theQ || !theQbar || !inYcut) { // one of the c/b conditions not satisfied
234f6d32 1099 delete[] pParent;
e0e89f40 1100 return 0;
1101 }
9ccc3d0e 1102 if (fCutOnChild && !theChild) { // one of the child conditions not satisfied
1103 delete[] pParent;
1104 return 0;
1105 }
5d76923e 1106 if(fTriggerParticle && !triggered) { // particle requested is not produced
1107 delete[] pParent;
1108 return 0;
1109 }
9ccc3d0e 1110
e0e89f40 1111 }
aea21c57 1112
0f6ee828 1113 //Introducing child cuts in case kPyW, kPyZ, kPyMb, and kPyMbNonDiff
e136a92a 1114 if ( (
1115 fProcess == kPyWPWHG || /// !!!!!!!!!!!!!!!! Added for W with POWHEG !!!!!!!!!! :)
1116 fProcess == kPyW ||
f529e69b 1117 fProcess == kPyZ ||
1118 fProcess == kPyMbDefault ||
1119 fProcess == kPyMb ||
6d2ec66d 1120 fProcess == kPyMbAtlasTuneMC09 ||
04081a91 1121 fProcess == kPyMbWithDirectPhoton ||
f529e69b 1122 fProcess == kPyMbNonDiffr)
0f6ee828 1123 && (fCutOnChild == 1) ) {
1124 if ( !CheckKinematicsOnChild() ) {
234f6d32 1125 delete[] pParent;
0f6ee828 1126 return 0;
1127 }
aea21c57 1128 }
1129
1130
f913ec4f 1131 for (i = 0; i < np; i++) {
8d2cd130 1132 Int_t trackIt = 0;
8507138f 1133 TParticle * iparticle = (TParticle *) fParticles.At(i);
8d2cd130 1134 kf = CheckPDGCode(iparticle->GetPdgCode());
1135 Int_t ks = iparticle->GetStatusCode();
1136 Int_t km = iparticle->GetFirstMother();
06956108 1137 if (
1138 (((ks == 1 && kf!=0 && KinematicSelection(iparticle, 0)) || (ks !=1)) && ((fStackFillOpt != kHeavyFlavor) || IsFromHeavyFlavor(i))) ||
64da86aa 1139 ((fProcess == kPyJets || fProcess == kPyBeautyJets || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG) && ks == 21 && km == 0 && i>1)
06956108 1140 )
1141 {
1142 nc++;
8d2cd130 1143 if (ks == 1) trackIt = 1;
1144 Int_t ipa = iparticle->GetFirstMother()-1;
1145
1146 iparent = (ipa > -1) ? pParent[ipa] : -1;
1147
1148//
1149// store track information
1150 p[0] = iparticle->Px();
1151 p[1] = iparticle->Py();
1152 p[2] = iparticle->Pz();
a920faf9 1153 p[3] = iparticle->Energy();
1406f599 1154
a920faf9 1155
2590ccf9 1156 origin[0] = fVertex[0]+iparticle->Vx()/10; // [cm]
1157 origin[1] = fVertex[1]+iparticle->Vy()/10; // [cm]
1158 origin[2] = fVertex[2]+iparticle->Vz()/10; // [cm]
1159
21391258 1160 Float_t tof = fTime + fEventTime + kconv * iparticle->T();
a920faf9 1161
1162 PushTrack(fTrackIt*trackIt, iparent, kf,
1163 p[0], p[1], p[2], p[3],
1164 origin[0], origin[1], origin[2], tof,
1165 polar[0], polar[1], polar[2],
1166 kPPrimary, nt, 1., ks);
dbd64db6 1167 fNprimaries++;
8d2cd130 1168 KeepTrack(nt);
1169 pParent[i] = nt;
f913ec4f 1170 SetHighWaterMark(nt);
1171
8d2cd130 1172 } // select particle
1173 } // particle loop
1174
234f6d32 1175 delete[] pParent;
e0e89f40 1176
f913ec4f 1177 return 1;
8d2cd130 1178}
1179
1180
1181void AliGenPythia::FinishRun()
1182{
1183// Print x-section summary
1184 fPythia->Pystat(1);
2779fc64 1185
1186 if (fNev > 0.) {
1187 fQ /= fNev;
1188 fX1 /= fNev;
1189 fX2 /= fNev;
1190 }
1191
8d2cd130 1192 printf("\nTotal number of Pyevnt() calls %d\n", fTrialsRun);
1193 printf("\nMean Q, x1, x2: %f %f %f\n", fQ, fX1, fX2);
8d2cd130 1194}
1195
7184e472 1196void AliGenPythia::AdjustWeights() const
8d2cd130 1197{
1198// Adjust the weights after generation of all events
1199//
e2bddf81 1200 if (gAlice) {
1201 TParticle *part;
1202 Int_t ntrack=gAlice->GetMCApp()->GetNtrack();
1203 for (Int_t i=0; i<ntrack; i++) {
1204 part= gAlice->GetMCApp()->Particle(i);
1205 part->SetWeight(part->GetWeight()*fKineBias);
1206 }
8d2cd130 1207 }
1208}
1209
20e47f08 1210void AliGenPythia::SetNuclei(Int_t a1, Int_t a2, Int_t pdfset)
8d2cd130 1211{
1212// Treat protons as inside nuclei with mass numbers a1 and a2
1d568bc2 1213
fb355e51 1214 fAProjectile = a1;
1215 fATarget = a2;
1216 fNucPdf = pdfset; // 0 EKS98 9 EPS09LO 19 EPS09NLO
1217 fUseNuclearPDF = kTRUE;
1218 fSetNuclei = kTRUE;
8d2cd130 1219}
1220
1221
1222void AliGenPythia::MakeHeader()
1223{
7184e472 1224//
1225// Make header for the simulated event
1226//
183a5ca9 1227 if (gAlice) {
1228 if (gAlice->GetEvNumber()>=fDebugEventFirst &&
f913ec4f 1229 gAlice->GetEvNumber()<=fDebugEventLast) fPythia->Pylist(2);
183a5ca9 1230 }
1231
8d2cd130 1232// Builds the event header, to be called after each event
e5c87a3d 1233 if (fHeader) delete fHeader;
1234 fHeader = new AliGenPythiaEventHeader("Pythia");
8d2cd130 1235//
1236// Event type
800be8b7 1237 if(fProcDiff>0){
1238 // if(fProcDiff == 92 || fProcDiff == 93) printf("\n\n\n\n\n");
1239 // printf("fPythia->GetMSTI(1) = %d fProcDiff = %d\n",fPythia->GetMSTI(1), fProcDiff);
1240 ((AliGenPythiaEventHeader*) fHeader)->SetProcessType(fProcDiff);
1241 }
1242 else
e5c87a3d 1243 ((AliGenPythiaEventHeader*) fHeader)->SetProcessType(fPythia->GetMSTI(1));
8d2cd130 1244//
1245// Number of trials
e5c87a3d 1246 ((AliGenPythiaEventHeader*) fHeader)->SetTrials(fTrials);
8d2cd130 1247//
1248// Event Vertex
d25cfd65 1249 fHeader->SetPrimaryVertex(fVertex);
21391258 1250 fHeader->SetInteractionTime(fTime+fEventTime);
dbd64db6 1251//
1252// Number of primaries
1253 fHeader->SetNProduced(fNprimaries);
8d2cd130 1254//
a0027228 1255// Event weight
1256 fHeader->SetEventWeight(fPythia->GetVINT(97));
1257//
8d2cd130 1258// Jets that have triggered
f913ec4f 1259
9dfe63b3 1260 //Need to store jets for b-jet studies too!
64da86aa 1261 if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG)
8d2cd130 1262 {
1263 Int_t ntrig, njet;
1264 Float_t jets[4][10];
1265 GetJets(njet, ntrig, jets);
9ff6c04c 1266
8d2cd130 1267
1268 for (Int_t i = 0; i < ntrig; i++) {
e5c87a3d 1269 ((AliGenPythiaEventHeader*) fHeader)->AddJet(jets[0][i], jets[1][i], jets[2][i],
8d2cd130 1270 jets[3][i]);
1271 }
1272 }
5fa4b20b 1273//
1274// Copy relevant information from external header, if present.
1275//
1276 Float_t uqJet[4];
1277
1278 if (fRL) {
1279 AliGenPythiaEventHeader* exHeader = (AliGenPythiaEventHeader*) (fRL->GetHeader()->GenEventHeader());
1280 for (Int_t i = 0; i < exHeader->NTriggerJets(); i++)
1281 {
1282 printf("Adding Jet %d %d \n", i, exHeader->NTriggerJets());
1283
1284
1285 exHeader->TriggerJet(i, uqJet);
1286 ((AliGenPythiaEventHeader*) fHeader)->AddUQJet(uqJet[0], uqJet[1], uqJet[2], uqJet[3]);
1287 }
1288 }
1289//
1290// Store quenching parameters
1291//
1292 if (fQuench){
b6262a45 1293 Double_t z[4] = {0.};
1294 Double_t xp = 0.;
1295 Double_t yp = 0.;
1296
7c21f297 1297 if (fQuench == 1) {
1298 // Pythia::Quench()
1299 fPythia->GetQuenchingParameters(xp, yp, z);
1bab4b79 1300 } else if (fQuench == 2){
7c21f297 1301 // Pyquen
1302 Double_t r1 = PARIMP.rb1;
1303 Double_t r2 = PARIMP.rb2;
1304 Double_t b = PARIMP.b1;
1305 Double_t r = 0.5 * TMath::Sqrt(2. * (r1 * r1 + r2 * r2) - b * b);
1306 Double_t phi = PARIMP.psib1;
1307 xp = r * TMath::Cos(phi);
1308 yp = r * TMath::Sin(phi);
1309
1bab4b79 1310 } else if (fQuench == 4) {
1311 // QPythia
5831e75f 1312 Double_t xy[2];
e9719084 1313 Double_t i0i1[2];
1314 AliFastGlauber::Instance()->GetSavedXY(xy);
1315 AliFastGlauber::Instance()->GetSavedI0I1(i0i1);
5831e75f 1316 xp = xy[0];
1317 yp = xy[1];
e6fe9b82 1318 ((AliGenPythiaEventHeader*) fHeader)->SetImpactParameter(fImpact);
7c21f297 1319 }
1bab4b79 1320
7c21f297 1321 ((AliGenPythiaEventHeader*) fHeader)->SetXYJet(xp, yp);
1322 ((AliGenPythiaEventHeader*) fHeader)->SetZQuench(z);
1bab4b79 1323 }
beac474c 1324//
1325// Store pt^hard
1326 ((AliGenPythiaEventHeader*) fHeader)->SetPtHard(fPythia->GetVINT(47));
64da86aa 1327
1328//
1329// Store Event Weight
1330 ((AliGenPythiaEventHeader*) fHeader)->SetEventWeight(fPythia->GetPARI(7));
1331
5fa4b20b 1332//
cf57b268 1333// Pass header
5fa4b20b 1334//
cf57b268 1335 AddHeader(fHeader);
4c4eac97 1336 fHeader = 0x0;
8d2cd130 1337}
cf57b268 1338
c2fc9d31 1339Bool_t AliGenPythia::CheckTrigger(const TParticle* jet1, const TParticle* jet2)
8d2cd130 1340{
1341// Check the kinematic trigger condition
1342//
1343 Double_t eta[2];
1344 eta[0] = jet1->Eta();
1345 eta[1] = jet2->Eta();
1346 Double_t phi[2];
1347 phi[0] = jet1->Phi();
1348 phi[1] = jet2->Phi();
1349 Int_t pdg[2];
1350 pdg[0] = jet1->GetPdgCode();
1351 pdg[1] = jet2->GetPdgCode();
1352 Bool_t triggered = kFALSE;
1353
64da86aa 1354 if (fProcess == kPyJets || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG) {
8d2cd130 1355 Int_t njets = 0;
1356 Int_t ntrig = 0;
1357 Float_t jets[4][10];
1358//
1359// Use Pythia clustering on parton level to determine jet axis
1360//
1361 GetJets(njets, ntrig, jets);
1362
76d6ba9a 1363 if (ntrig || fEtMinJet == 0.) triggered = kTRUE;
8d2cd130 1364//
1365 } else {
1366 Int_t ij = 0;
1367 Int_t ig = 1;
1368 if (pdg[0] == kGamma) {
1369 ij = 1;
1370 ig = 0;
1371 }
1372 //Check eta range first...
1373 if ((eta[ij] < fEtaMaxJet && eta[ij] > fEtaMinJet) &&
1374 (eta[ig] < fEtaMaxGamma && eta[ig] > fEtaMinGamma))
1375 {
1376 //Eta is okay, now check phi range
1377 if ((phi[ij] < fPhiMaxJet && phi[ij] > fPhiMinJet) &&
1378 (phi[ig] < fPhiMaxGamma && phi[ig] > fPhiMinGamma))
1379 {
1380 triggered = kTRUE;
1381 }
1382 }
1383 }
1384 return triggered;
1385}
aea21c57 1386
1387
aea21c57 1388
7184e472 1389Bool_t AliGenPythia::CheckKinematicsOnChild(){
1390//
1391//Checking Kinematics on Child (status code 1, particle code ?, kin cuts
1392//
aea21c57 1393 Bool_t checking = kFALSE;
1394 Int_t j, kcode, ks, km;
1395 Int_t nPartAcc = 0; //number of particles in the acceptance range
1396 Int_t numberOfAcceptedParticles = 1;
1397 if (fNumberOfAcceptedParticles != 0) { numberOfAcceptedParticles = fNumberOfAcceptedParticles; }
8507138f 1398 Int_t npart = fParticles.GetEntriesFast();
aea21c57 1399
0f6ee828 1400 for (j = 0; j<npart; j++) {
8507138f 1401 TParticle * jparticle = (TParticle *) fParticles.At(j);
aea21c57 1402 kcode = TMath::Abs( CheckPDGCode(jparticle->GetPdgCode()) );
1403 ks = jparticle->GetStatusCode();
1404 km = jparticle->GetFirstMother();
1405
1406 if( (ks == 1) && (kcode == fPdgCodeParticleforAcceptanceCut) && (KinematicSelection(jparticle,1)) ){
1407 nPartAcc++;
1408 }
0f6ee828 1409 if( numberOfAcceptedParticles <= nPartAcc){
1410 checking = kTRUE;
1411 break;
1412 }
aea21c57 1413 }
0f6ee828 1414
aea21c57 1415 return checking;
aea21c57 1416}
1417
5fa4b20b 1418void AliGenPythia::LoadEvent(AliStack* stack, Int_t flag, Int_t reHadr)
8d2cd130 1419{
1058d9df 1420 //
1421 // Load event into Pythia Common Block
1422 //
1423
1424 Int_t npart = stack -> GetNprimary();
1425 Int_t n0 = 0;
1426
1427 if (!flag) {
1428 (fPythia->GetPyjets())->N = npart;
1429 } else {
1430 n0 = (fPythia->GetPyjets())->N;
1431 (fPythia->GetPyjets())->N = n0 + npart;
1432 }
1433
1434
1435 for (Int_t part = 0; part < npart; part++) {
1436 TParticle *mPart = stack->Particle(part);
32d6ef7d 1437
1058d9df 1438 Int_t kf = mPart->GetPdgCode();
1439 Int_t ks = mPart->GetStatusCode();
1440 Int_t idf = mPart->GetFirstDaughter();
1441 Int_t idl = mPart->GetLastDaughter();
1442
1443 if (reHadr) {
1444 if (ks == 11 || ks == 12) {
1445 ks -= 10;
1446 idf = -1;
1447 idl = -1;
1448 }
32d6ef7d 1449 }
1450
1058d9df 1451 Float_t px = mPart->Px();
1452 Float_t py = mPart->Py();
1453 Float_t pz = mPart->Pz();
1454 Float_t e = mPart->Energy();
1455 Float_t m = mPart->GetCalcMass();
32d6ef7d 1456
1058d9df 1457
1458 (fPythia->GetPyjets())->P[0][part+n0] = px;
1459 (fPythia->GetPyjets())->P[1][part+n0] = py;
1460 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1461 (fPythia->GetPyjets())->P[3][part+n0] = e;
1462 (fPythia->GetPyjets())->P[4][part+n0] = m;
1463
1464 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1465 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1466 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1467 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1468 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1469 }
1470}
1471
c2fc9d31 1472void AliGenPythia::LoadEvent(const TObjArray* stack, Int_t flag, Int_t reHadr)
1058d9df 1473{
1474 //
1475 // Load event into Pythia Common Block
1476 //
1477
1478 Int_t npart = stack -> GetEntries();
1479 Int_t n0 = 0;
1480
1481 if (!flag) {
1482 (fPythia->GetPyjets())->N = npart;
1483 } else {
1484 n0 = (fPythia->GetPyjets())->N;
1485 (fPythia->GetPyjets())->N = n0 + npart;
1486 }
1487
1488
1489 for (Int_t part = 0; part < npart; part++) {
1490 TParticle *mPart = dynamic_cast<TParticle *>(stack->At(part));
92847124 1491 if (!mPart) continue;
1492
1058d9df 1493 Int_t kf = mPart->GetPdgCode();
1494 Int_t ks = mPart->GetStatusCode();
1495 Int_t idf = mPart->GetFirstDaughter();
1496 Int_t idl = mPart->GetLastDaughter();
1497
1498 if (reHadr) {
92847124 1499 if (ks == 11 || ks == 12) {
1500 ks -= 10;
1501 idf = -1;
1502 idl = -1;
1503 }
8d2cd130 1504 }
1058d9df 1505
1506 Float_t px = mPart->Px();
1507 Float_t py = mPart->Py();
1508 Float_t pz = mPart->Pz();
1509 Float_t e = mPart->Energy();
1510 Float_t m = mPart->GetCalcMass();
1511
1512
1513 (fPythia->GetPyjets())->P[0][part+n0] = px;
1514 (fPythia->GetPyjets())->P[1][part+n0] = py;
1515 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1516 (fPythia->GetPyjets())->P[3][part+n0] = e;
1517 (fPythia->GetPyjets())->P[4][part+n0] = m;
1518
1519 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1520 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1521 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1522 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1523 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1524 }
8d2cd130 1525}
1526
5fa4b20b 1527
014a9521 1528void AliGenPythia::RecJetsUA1(Int_t& njets, Float_t jets [4][50])
8d2cd130 1529{
1530//
1531// Calls the Pythia jet finding algorithm to find jets in the current event
1532//
1533//
8d2cd130 1534//
1535// Save jets
1536 Int_t n = fPythia->GetN();
1537
1538//
1539// Run Jet Finder
1540 fPythia->Pycell(njets);
1541 Int_t i;
1542 for (i = 0; i < njets; i++) {
1543 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1544 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1545 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1546 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1547
1548 jets[0][i] = px;
1549 jets[1][i] = py;
1550 jets[2][i] = pz;
1551 jets[3][i] = e;
1552 }
1553}
1554
1555
1556
1557void AliGenPythia::GetJets(Int_t& nJets, Int_t& nJetsTrig, Float_t jets[4][10])
1558{
1559//
1560// Calls the Pythia clustering algorithm to find jets in the current event
1561//
1562 Int_t n = fPythia->GetN();
1563 nJets = 0;
1564 nJetsTrig = 0;
1565 if (fJetReconstruction == kCluster) {
1566//
1567// Configure cluster algorithm
1568//
1569 fPythia->SetPARU(43, 2.);
1570 fPythia->SetMSTU(41, 1);
1571//
1572// Call cluster algorithm
1573//
1574 fPythia->Pyclus(nJets);
1575//
1576// Loading jets from common block
1577//
1578 } else {
592f8307 1579
8d2cd130 1580//
1581// Run Jet Finder
1582 fPythia->Pycell(nJets);
1583 }
1584
1585 Int_t i;
1586 for (i = 0; i < nJets; i++) {
1587 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1588 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1589 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1590 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1591 Float_t pt = TMath::Sqrt(px * px + py * py);
a920faf9 1592 Float_t phi = TMath::Pi() + TMath::ATan2(-py, -px);
8d2cd130 1593 Float_t theta = TMath::ATan2(pt,pz);
1594 Float_t et = e * TMath::Sin(theta);
1595 Float_t eta = -TMath::Log(TMath::Tan(theta / 2.));
8d2cd130 1596 if (
1597 eta > fEtaMinJet && eta < fEtaMaxJet &&
675eb105 1598 phi > fPhiMinJet && phi < fPhiMaxJet &&
8d2cd130 1599 et > fEtMinJet && et < fEtMaxJet
1600 )
1601 {
1602 jets[0][nJetsTrig] = px;
1603 jets[1][nJetsTrig] = py;
1604 jets[2][nJetsTrig] = pz;
1605 jets[3][nJetsTrig] = e;
1606 nJetsTrig++;
5fa4b20b 1607// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
8d2cd130 1608 } else {
1609// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
1610 }
1611 }
1612}
1613
f913ec4f 1614void AliGenPythia::GetSubEventTime()
1615{
1616 // Calculates time of the next subevent
9d7108a7 1617 fEventTime = 0.;
1618 if (fEventsTime) {
1619 TArrayF &array = *fEventsTime;
1620 fEventTime = array[fCurSubEvent++];
1621 }
1622 // printf(" Event time: %d %f %p",fCurSubEvent,fEventTime,fEventsTime);
1623 return;
f913ec4f 1624}
8d2cd130 1625
e81f2bac 1626Bool_t AliGenPythia::IsInBarrel(Float_t eta) const
40fe59d4 1627{
1628 // Is particle in Central Barrel acceptance?
1629 // etamin=-etamax
1630 if( eta < fTriggerEta )
1631 return kTRUE;
1632 else
1633 return kFALSE;
1634}
1635
e81f2bac 1636Bool_t AliGenPythia::IsInEMCAL(Float_t phi, Float_t eta) const
ec2c406e 1637{
1638 // Is particle in EMCAL acceptance?
ec2c406e 1639 // phi in degrees, etamin=-etamax
9fd8e520 1640 if(phi > fEMCALMinPhi && phi < fEMCALMaxPhi &&
1641 eta < fEMCALEta )
ec2c406e 1642 return kTRUE;
1643 else
1644 return kFALSE;
1645}
1646
e81f2bac 1647Bool_t AliGenPythia::IsInPHOS(Float_t phi, Float_t eta, Int_t iparticle)
ec2c406e 1648{
1649 // Is particle in PHOS acceptance?
1650 // Acceptance slightly larger considered.
1651 // phi in degrees, etamin=-etamax
40fe59d4 1652 // iparticle is the index of the particle to be checked, for PHOS rotation case
1653
9fd8e520 1654 if(phi > fPHOSMinPhi && phi < fPHOSMaxPhi &&
1655 eta < fPHOSEta )
ec2c406e 1656 return kTRUE;
1657 else
40fe59d4 1658 {
1659 if( fCheckPHOSeta && eta < fPHOSEta) fPHOSRotateCandidate = iparticle;
1660
ec2c406e 1661 return kFALSE;
40fe59d4 1662 }
ec2c406e 1663}
1664
40fe59d4 1665void AliGenPythia::RotatePhi(Bool_t& okdd)
90a236ce 1666{
40fe59d4 1667 //Rotate event in phi to enhance events in PHOS acceptance
1668
1669 if(fPHOSRotateCandidate < 0) return ;
1670
90a236ce 1671 //calculate the new position random between fPHOSMinPhi and fPHOSMaxPhi
1672 Double_t phiPHOSmin = TMath::Pi()*fPHOSMinPhi/180;
1673 Double_t phiPHOSmax = TMath::Pi()*fPHOSMaxPhi/180;
800be8b7 1674 Double_t phiPHOS = (AliPythiaRndm::GetPythiaRandom())->Uniform(phiPHOSmin,phiPHOSmax);
90a236ce 1675
1676 //calculate deltaphi
40fe59d4 1677 TParticle* ph = (TParticle *) fParticles.At(fPHOSRotateCandidate);
90a236ce 1678 Double_t phphi = ph->Phi();
1679 Double_t deltaphi = phiPHOS - phphi;
40fe59d4 1680
90a236ce 1681
1682
1683 //loop for all particles and produce the phi rotation
8507138f 1684 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
90a236ce 1685 Double_t oldphi, newphi;
777e69b0 1686 Double_t newVx, newVy, r, vZ, time;
1687 Double_t newPx, newPy, pt, pz, e;
90a236ce 1688 for(Int_t i=0; i< np; i++) {
40fe59d4 1689 TParticle* iparticle = (TParticle *) fParticles.At(i);
1690 oldphi = iparticle->Phi();
1691 newphi = oldphi + deltaphi;
1692 if(newphi < 0) newphi = 2*TMath::Pi() + newphi; // correct angle
1693 if(newphi > 2*TMath::Pi()) newphi = newphi - 2*TMath::Pi(); // correct angle
1694
1695 r = iparticle->R();
1696 newVx = r * TMath::Cos(newphi);
1697 newVy = r * TMath::Sin(newphi);
1698 vZ = iparticle->Vz(); // don't transform
1699 time = iparticle->T(); // don't transform
1700
1701 pt = iparticle->Pt();
1702 newPx = pt * TMath::Cos(newphi);
1703 newPy = pt * TMath::Sin(newphi);
1704 pz = iparticle->Pz(); // don't transform
1705 e = iparticle->Energy(); // don't transform
1706
1707 // apply rotation
1708 iparticle->SetProductionVertex(newVx, newVy, vZ, time);
1709 iparticle->SetMomentum(newPx, newPy, pz, e);
1710
90a236ce 1711 } //end particle loop
1712
40fe59d4 1713 // now let's check that we put correctly the candidate photon in PHOS
1714 Float_t phi = ph->Phi()*180./TMath::Pi(); //Convert to degrees
1715 Float_t eta =TMath::Abs(ph->Eta());//in calos etamin=-etamax
1716 if(IsInPHOS(phi,eta,-1))
1717 okdd = kTRUE;
1718
1719 // reset the value for next event
1720 fPHOSRotateCandidate = -1;
1721
90a236ce 1722}
ec2c406e 1723
1724
800be8b7 1725Bool_t AliGenPythia::CheckDiffraction()
1726{
1727 // use this method only with Perugia-0 tune!
1728
1729 // printf("AAA\n");
1730
1731 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
1732
1733 Int_t iPart1=-1;
1734 Int_t iPart2=-1;
1735
1736 Double_t y1 = 1e10;
1737 Double_t y2 = -1e10;
1738
1739 const Int_t kNstable=20;
1740 const Int_t pdgStable[20] = {
1741 22, // Photon
1742 11, // Electron
1743 12, // Electron Neutrino
1744 13, // Muon
1745 14, // Muon Neutrino
1746 15, // Tau
1747 16, // Tau Neutrino
1748 211, // Pion
1749 321, // Kaon
1750 311, // K0
1751 130, // K0s
1752 310, // K0l
1753 2212, // Proton
1754 2112, // Neutron
1755 3122, // Lambda_0
1756 3112, // Sigma Minus
1757 3222, // Sigma Plus
1758 3312, // Xsi Minus
1759 3322, // Xsi0
1760 3334 // Omega
1761 };
1762
1763 for (Int_t i = 0; i < np; i++) {
1764 TParticle * part = (TParticle *) fParticles.At(i);
1765
1766 Int_t statusCode = part->GetStatusCode();
1767
1768 // Initial state particle
1769 if (statusCode != 1)
1770 continue;
1771
1772 Int_t pdg = TMath::Abs(part->GetPdgCode());
1773 Bool_t isStable = kFALSE;
1774 for (Int_t i1 = 0; i1 < kNstable; i1++) {
1775 if (pdg == pdgStable[i1]) {
1776 isStable = kTRUE;
1777 break;
1778 }
1779 }
1780 if(!isStable)
1781 continue;
1782
1783 Double_t y = part->Y();
1784
1785 if (y < y1)
1786 {
1787 y1 = y;
1788 iPart1 = i;
1789 }
1790 if (y > y2)
1791 {
1792 y2 = y;
1793 iPart2 = i;
1794 }
1795 }
1796
1797 if(iPart1<0 || iPart2<0) return kFALSE;
1798
1799 y1=TMath::Abs(y1);
1800 y2=TMath::Abs(y2);
1801
1802 TParticle * part1 = (TParticle *) fParticles.At(iPart1);
1803 TParticle * part2 = (TParticle *) fParticles.At(iPart2);
1804
1805 Int_t pdg1 = part1->GetPdgCode();
1806 Int_t pdg2 = part2->GetPdgCode();
1807
1808
1809 Int_t iPart = -1;
1810 if (pdg1 == 2212 && pdg2 == 2212)
1811 {
1812 if(y1 > y2)
1813 iPart = iPart1;
1814 else if(y1 < y2)
1815 iPart = iPart2;
1816 else {
1817 iPart = iPart1;
1818 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)>0.5) iPart = iPart2;
1819 }
1820 }
1821 else if (pdg1 == 2212)
1822 iPart = iPart1;
1823 else if (pdg2 == 2212)
1824 iPart = iPart2;
1825
1826
1827
1828
1829
1830 Double_t M=-1.;
1831 if(iPart>0) {
1832 TParticle * part = (TParticle *) fParticles.At(iPart);
1833 Double_t E= part->Energy();
1834 Double_t P= part->P();
4f813e90 1835 Double_t M2 = (fEnergyCMS-E-P)*(fEnergyCMS-E+P);
1836 if(M2<0) return kFALSE;
1837 M= TMath::Sqrt(M2);
800be8b7 1838 }
1839
c5dfa3e4 1840 Double_t Mmin, Mmax, wSD, wDD, wND;
1841 if(!GetWeightsDiffraction(M, Mmin, Mmax, wSD, wDD, wND)) return kFALSE;
1842
1843 if(M>-1 && M<Mmin) return kFALSE;
1844 if(M>Mmax) M=-1;
1845
1846 Int_t procType=fPythia->GetMSTI(1);
1847 Int_t proc0=2;
1848 if(procType== 94) proc0=1;
1849 if(procType== 92 || procType== 93) proc0=0;
1850
1851 Int_t proc=2;
1852 if(M>0) proc=0;
1853 else if(proc0==1) proc=1;
1854
1855 if(proc==1 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wDD) return kFALSE;
1856 if(proc==2 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wND) return kFALSE;
800be8b7 1857
1858
1859 // if(proc==1 || proc==2) return kFALSE;
1860
c5dfa3e4 1861 if(proc!=0) {
1862 if(proc0!=0) fProcDiff = procType;
1863 else fProcDiff = 95;
1864 return kTRUE;
1865 }
1866
1867 if(wSD<0) AliError("wSD<0 ! \n");
1868
1869 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)> wSD) return kFALSE;
1870
1871 // printf("iPart = %d\n", iPart);
1872
1873 if(iPart==iPart1) fProcDiff=93;
1874 else if(iPart==iPart2) fProcDiff=92;
1875 else {
1876 printf("EROOR: iPart!=iPart1 && iPart!=iPart2\n");
1877
800be8b7 1878 }
1879
c5dfa3e4 1880 return kTRUE;
1881}
1882
1883
1884
1885Bool_t AliGenPythia::GetWeightsDiffraction(Double_t M, Double_t &Mmin, Double_t &Mmax,
1886 Double_t &wSD, Double_t &wDD, Double_t &wND)
1887{
1888
1889 // 900 GeV
1890 if(TMath::Abs(fEnergyCMS-900)<1 ){
1891
1892const Int_t nbin=400;
1893Double_t bin[]={
18941.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
18954.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
18967.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
189710.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
189813.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
189915.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
190018.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
190121.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
190224.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
190327.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
190430.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
190533.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
190636.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
190739.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
190842.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
190945.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
191048.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
191151.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
191254.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
191357.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
191460.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
191563.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
191666.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
191769.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
191872.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
191975.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
192078.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
192181.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
192284.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
192387.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
192490.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
192593.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
192696.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
192799.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
1928102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
1929105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
1930108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
1931111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
1932114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
1933117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
1934120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
1935123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
1936126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
1937129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
1938132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
1939135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
1940138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
1941141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
1942144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
1943147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
1944150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
1945153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
1946156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
1947159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
1948162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
1949165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
1950168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
1951171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
1952174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
1953177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
1954180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
1955183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
1956186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
1957189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
1958192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
1959195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
1960198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
1961Double_t w[]={
19621.000000, 0.643457, 0.645609, 0.648347, 0.604563, 0.605002,
19630.602819, 0.611473, 0.576412, 0.562354, 0.550216, 0.529285,
19640.534558, 0.534364, 0.530358, 0.518475, 0.489253, 0.469754,
19650.469825, 0.450513, 0.455849, 0.435312, 0.437210, 0.456686,
19660.413577, 0.427093, 0.426894, 0.418834, 0.409475, 0.388483,
19670.412208, 0.388912, 0.389611, 0.382572, 0.389220, 0.370964,
19680.380463, 0.370873, 0.363701, 0.369363, 0.357361, 0.365759,
19690.348566, 0.337062, 0.348190, 0.332330, 0.359001, 0.335836,
19700.339154, 0.335599, 0.336035, 0.335204, 0.353440, 0.337836,
19710.333874, 0.307120, 0.294963, 0.324978, 0.313359, 0.317688,
19720.323758, 0.319304, 0.335317, 0.301765, 0.317257, 0.356331,
19730.323119, 0.297732, 0.303188, 0.326102, 0.316467, 0.294728,
19740.308135, 0.288857, 0.325692, 0.312493, 0.291100, 0.325921,
19750.313317, 0.295980, 0.308481, 0.328380, 0.313081, 0.296763,
19760.295431, 0.317325, 0.320462, 0.286918, 0.316035, 0.335208,
19770.283193, 0.333945, 0.292534, 0.294164, 0.330680, 0.296992,
19780.285509, 0.317260, 0.298269, 0.311299, 0.312129, 0.286822,
19790.287442, 0.319139, 0.283314, 0.318454, 0.297727, 0.301597,
19800.282483, 0.294792, 0.305569, 0.290957, 0.297817, 0.282908,
19810.272401, 0.305584, 0.300220, 0.297020, 0.298781, 0.278008,
19820.277727, 0.323777, 0.287419, 0.342074, 0.287259, 0.303658,
19830.302668, 0.279622, 0.280586, 0.313630, 0.276068, 0.257051,
19840.309996, 0.265534, 0.297138, 0.281738, 0.294610, 0.292882,
19850.286860, 0.312686, 0.293244, 0.293744, 0.271375, 0.278734,
19860.280308, 0.304739, 0.287907, 0.285261, 0.311180, 0.313476,
19870.289660, 0.289282, 0.319505, 0.271285, 0.272008, 0.289245,
19880.281038, 0.285284, 0.295836, 0.281416, 0.283501, 0.295417,
19890.304372, 0.297764, 0.291378, 0.321530, 0.315604, 0.329507,
19900.282609, 0.275576, 0.283721, 0.311714, 0.283760, 0.273188,
19910.312193, 0.264347, 0.281532, 0.301226, 0.281718, 0.336408,
19920.283157, 0.332010, 0.289974, 0.290256, 0.301569, 0.332228,
19930.288282, 0.326339, 0.313653, 0.300361, 0.289470, 0.264830,
19940.298659, 0.272359, 0.278878, 0.306001, 0.328168, 0.294991,
19950.327737, 0.278056, 0.302435, 0.284183, 0.279270, 0.307279,
19960.307917, 0.315196, 0.283803, 0.313333, 0.315730, 0.304818,
19970.307171, 0.295223, 0.333741, 0.346911, 0.310143, 0.336686,
19980.275459, 0.334781, 0.295405, 0.275816, 0.301678, 0.327242,
19990.320717, 0.309230, 0.292145, 0.294489, 0.305088, 0.300969,
20000.277438, 0.326159, 0.297065, 0.301177, 0.303843, 0.275382,
20010.304019, 0.284166, 0.289610, 0.331611, 0.317131, 0.310880,
20020.360456, 0.294052, 0.342694, 0.327166, 0.336797, 0.298040,
20030.295767, 0.260053, 0.325544, 0.335310, 0.320182, 0.301072,
20040.313117, 0.283407, 0.299206, 0.293525, 0.305067, 0.255978,
20050.327055, 0.316382, 0.317700, 0.278993, 0.283120, 0.314000,
20060.274396, 0.291208, 0.348813, 0.319603, 0.313076, 0.289155,
20070.343988, 0.311426, 0.322896, 0.328726, 0.337062, 0.389093,
20080.284122, 0.312184, 0.304008, 0.319170, 0.320778, 0.288390,
20090.337272, 0.356273, 0.343310, 0.312209, 0.330709, 0.297977,
20100.346146, 0.369162, 0.324385, 0.339831, 0.337037, 0.318739,
20110.343157, 0.277720, 0.368407, 0.321330, 0.338997, 0.314220,
20120.328861, 0.321824, 0.328013, 0.356925, 0.359144, 0.296314,
20130.345415, 0.396711, 0.347032, 0.294928, 0.343799, 0.322331,
20140.328656, 0.326098, 0.337338, 0.337038, 0.300179, 0.351391,
20150.324337, 0.330896, 0.302842, 0.310522, 0.337052, 0.359989,
20160.383250, 0.359355, 0.315382, 0.333113, 0.342598, 0.355348,
20170.320751, 0.320475, 0.351762, 0.351475, 0.338358, 0.326153,
20180.302507, 0.340048, 0.318685, 0.381646, 0.339320, 0.299453,
20190.426599, 0.393515, 0.353929, 0.328435, 0.413976, 0.292558,
20200.379340, 0.358344, 0.409259, 0.313821, 0.336675, 0.324521,
20210.408382, 0.346273, 0.312939, 0.362453, 0.343152, 0.330577,
20220.332831, 0.353299, 0.347745, 0.334818, 0.332234, 0.385585,
20230.395483, 0.395316, 0.326972, 0.349434, 0.317604, 0.328980,
20240.375056, 0.317290, 0.357083, 0.346165, 0.310444, 0.356873,
20250.359523, 0.365308, 0.365122, 0.383685, 0.370975, 0.396928,
20260.407654, 0.307755, 0.323033, 0.350580, 0.345231, 0.342462,
20270.400000, 0.318309, 0.403570, 0.322856, 0.383053, 0.422252,
20280.386112, 0.364314, 0.434375, 0.334629};
2029wDD = 0.379611;
2030wND = 0.496961;
2031wSD = -1;
2032
2033 Mmin = bin[0];
2034 Mmax = bin[nbin];
2035 if(M<Mmin || M>Mmax) return kTRUE;
2036
7873275c 2037 Int_t ibin=nbin-1;
93a60586 2038 for(Int_t i=1; i<=nbin; i++)
2ff57420 2039 if(M<=bin[i]) {
2040 ibin=i-1;
2041 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
800be8b7 2042 break;
2043 }
c5dfa3e4 2044 wSD=w[ibin];
2045 return kTRUE;
2046 }
2047 else if(TMath::Abs(fEnergyCMS-2760)<1 ){
800be8b7 2048
c5dfa3e4 2049const Int_t nbin=400;
2050Double_t bin[]={
20511.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
20524.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
20537.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
205410.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
205513.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
205615.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
205718.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
205821.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
205924.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
206027.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
206130.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
206233.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
206336.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
206439.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
206542.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
206645.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
206748.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
206851.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
206954.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
207057.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
207160.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
207263.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
207366.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
207469.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
207572.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
207675.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
207778.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
207881.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
207984.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
208087.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
208190.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
208293.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
208396.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
208499.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2085102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2086105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2087108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2088111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2089114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2090117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2091120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2092123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2093126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2094129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2095132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2096135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2097138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2098141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2099144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2100147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2101150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2102153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2103156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2104159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2105162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2106165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2107168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2108171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2109174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2110177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2111180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2112183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2113186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2114189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2115192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2116195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2117198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2118Double_t w[]={
21191.000000, 0.692593, 0.673384, 0.666273, 0.657285, 0.637723,
21200.625881, 0.643590, 0.606100, 0.589007, 0.567824, 0.578705,
21210.538530, 0.517937, 0.528278, 0.515918, 0.539461, 0.466186,
21220.489869, 0.468402, 0.465017, 0.453336, 0.460769, 0.474638,
21230.456347, 0.434471, 0.427478, 0.435435, 0.410934, 0.366431,
21240.382240, 0.379513, 0.394249, 0.386837, 0.353103, 0.382138,
21250.377497, 0.389479, 0.378736, 0.347933, 0.354605, 0.352077,
21260.324443, 0.358792, 0.339968, 0.359052, 0.330734, 0.318291,
21270.333703, 0.358644, 0.335819, 0.332213, 0.309051, 0.309975,
21280.331626, 0.304407, 0.309819, 0.312097, 0.312462, 0.320411,
21290.280401, 0.302311, 0.315863, 0.281479, 0.310003, 0.296911,
21300.313676, 0.281071, 0.294163, 0.306500, 0.283462, 0.274867,
21310.307149, 0.270555, 0.282264, 0.287373, 0.307849, 0.278675,
21320.286990, 0.278269, 0.300105, 0.286799, 0.265674, 0.275140,
21330.285702, 0.257352, 0.267714, 0.248204, 0.252220, 0.255678,
21340.282946, 0.268257, 0.282375, 0.262675, 0.275564, 0.248345,
21350.236259, 0.291914, 0.259936, 0.241338, 0.267389, 0.285044,
21360.289419, 0.253594, 0.284568, 0.231840, 0.260008, 0.268527,
21370.275363, 0.224115, 0.281260, 0.257913, 0.295152, 0.264399,
21380.232287, 0.282533, 0.223431, 0.255756, 0.244471, 0.221695,
21390.272450, 0.284244, 0.253682, 0.270717, 0.275403, 0.240323,
21400.245081, 0.241859, 0.216340, 0.244789, 0.220291, 0.238478,
21410.224691, 0.244058, 0.266117, 0.271478, 0.242012, 0.267321,
21420.248494, 0.253343, 0.255606, 0.235458, 0.241079, 0.233223,
21430.226813, 0.259224, 0.234239, 0.258606, 0.210892, 0.238186,
21440.243271, 0.222678, 0.213437, 0.273939, 0.247966, 0.232548,
21450.263438, 0.222089, 0.272111, 0.248818, 0.244295, 0.238368,
21460.236908, 0.248776, 0.232604, 0.231194, 0.227117, 0.231152,
21470.282140, 0.229778, 0.232631, 0.261794, 0.216633, 0.253471,
21480.242157, 0.227406, 0.269335, 0.230547, 0.210618, 0.285872,
21490.248776, 0.229875, 0.242728, 0.227388, 0.220567, 0.222062,
21500.235950, 0.224087, 0.228895, 0.208287, 0.235999, 0.208696,
21510.230367, 0.267667, 0.220484, 0.233402, 0.233815, 0.250455,
21520.253120, 0.219556, 0.230980, 0.236661, 0.222395, 0.226111,
21530.198315, 0.210555, 0.202813, 0.208594, 0.235976, 0.221490,
21540.243059, 0.204901, 0.216987, 0.229039, 0.231466, 0.221975,
21550.231220, 0.253638, 0.250448, 0.260291, 0.328345, 0.205739,
21560.222014, 0.251513, 0.279427, 0.270506, 0.248409, 0.222472,
21570.291632, 0.227796, 0.248769, 0.276896, 0.214742, 0.200139,
21580.230693, 0.226031, 0.268900, 0.185160, 0.245353, 0.205843,
21590.231155, 0.219122, 0.214811, 0.199763, 0.274179, 0.217598,
21600.274988, 0.237244, 0.211820, 0.225459, 0.252799, 0.235948,
21610.224986, 0.245385, 0.237770, 0.213373, 0.229737, 0.215487,
21620.234453, 0.249684, 0.239435, 0.250422, 0.257194, 0.214762,
21630.212266, 0.228988, 0.253798, 0.201607, 0.239946, 0.205245,
21640.231670, 0.212774, 0.206768, 0.231563, 0.189388, 0.227926,
21650.227203, 0.237754, 0.221628, 0.211138, 0.203322, 0.200985,
21660.231780, 0.220294, 0.232686, 0.234243, 0.218264, 0.255870,
21670.223213, 0.238670, 0.213713, 0.213064, 0.246700, 0.233446,
21680.221503, 0.206767, 0.200722, 0.226179, 0.237425, 0.239229,
21690.238611, 0.240419, 0.247806, 0.215923, 0.205298, 0.232778,
21700.272312, 0.226773, 0.258103, 0.223287, 0.269404, 0.203398,
21710.223782, 0.204213, 0.229664, 0.234040, 0.228419, 0.203936,
21720.263686, 0.199141, 0.236127, 0.214058, 0.204611, 0.224324,
21730.292140, 0.190735, 0.235157, 0.213018, 0.257085, 0.190554,
21740.203197, 0.213044, 0.237023, 0.214243, 0.193562, 0.262403,
21750.206256, 0.221396, 0.233588, 0.256611, 0.249731, 0.226683,
21760.199330, 0.251026, 0.222596, 0.201941, 0.186374, 0.221038,
21770.196555, 0.222560, 0.299419, 0.231979, 0.242924, 0.198310,
21780.217628, 0.235458, 0.278595, 0.218624, 0.277305, 0.239109,
21790.205600, 0.253715, 0.221173, 0.218195, 0.277647, 0.241974,
21800.268748, 0.268128, 0.292258, 0.249420, 0.191034, 0.219506,
21810.216502, 0.250677, 0.193386, 0.201310, 0.259464, 0.255351,
21820.269628, 0.221063, 0.294079, 0.196726, 0.233634, 0.221870,
21830.216236, 0.197259, 0.247433, 0.272765, 0.294079, 0.236336,
21840.206396, 0.238524, 0.247846, 0.269519, 0.237141, 0.230611,
21850.201712, 0.242225, 0.255565, 0.258738};
2186wDD = 0.512813;
2187wND = 0.518820;
2188wSD = -1;
2189
2190 Mmin = bin[0];
2191 Mmax = bin[nbin];
2192 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2193
c5dfa3e4 2194 Int_t ibin=nbin-1;
2195 for(Int_t i=1; i<=nbin; i++)
2196 if(M<=bin[i]) {
2197 ibin=i-1;
2198 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2199 break;
2200 }
2201 wSD=w[ibin];
2202 return kTRUE;
2203 }
800be8b7 2204
800be8b7 2205
c5dfa3e4 2206 else if(TMath::Abs(fEnergyCMS-7000)<1 ){
2207const Int_t nbin=400;
2208Double_t bin[]={
22091.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
22104.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
22117.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
221210.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
221313.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
221415.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
221518.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
221621.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
221724.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
221827.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
221930.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
222033.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
222136.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
222239.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
222342.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
222445.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
222548.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
222651.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
222754.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
222857.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
222960.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
223063.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
223166.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
223269.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
223372.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
223475.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
223578.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
223681.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
223784.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
223887.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
223990.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
224093.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
224196.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
224299.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2243102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2244105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2245108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2246111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2247114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2248117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2249120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2250123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2251126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2252129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2253132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2254135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2255138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2256141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2257144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2258147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2259150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2260153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2261156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2262159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2263162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2264165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2265168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2266171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2267174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2268177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2269180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2270183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2271186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2272189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2273192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2274195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2275198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2276Double_t w[]={
22771.000000, 0.798640, 0.770197, 0.717990, 0.699434, 0.692093,
22780.620940, 0.655294, 0.636496, 0.633483, 0.600518, 0.594548,
22790.550759, 0.550413, 0.528926, 0.525877, 0.506701, 0.504117,
22800.486973, 0.492930, 0.461833, 0.488695, 0.438874, 0.460274,
22810.451551, 0.454424, 0.449270, 0.387571, 0.427556, 0.428740,
22820.401682, 0.402260, 0.408961, 0.395417, 0.387426, 0.378602,
22830.357826, 0.359125, 0.348494, 0.363710, 0.356117, 0.340363,
22840.337637, 0.396084, 0.341777, 0.340551, 0.348838, 0.344014,
22850.340468, 0.317654, 0.355584, 0.326023, 0.373416, 0.312298,
22860.326522, 0.290540, 0.335557, 0.318689, 0.327544, 0.319501,
22870.331754, 0.312728, 0.282263, 0.274937, 0.303867, 0.307820,
22880.289344, 0.268934, 0.288908, 0.290018, 0.291369, 0.295242,
22890.289067, 0.277685, 0.267957, 0.267559, 0.320229, 0.265060,
22900.305931, 0.305352, 0.262064, 0.281879, 0.287780, 0.270033,
22910.270814, 0.276667, 0.271531, 0.275283, 0.258189, 0.287969,
22920.251247, 0.301527, 0.267230, 0.245860, 0.293125, 0.253421,
22930.272396, 0.243637, 0.236206, 0.278452, 0.246544, 0.263165,
22940.230484, 0.231102, 0.258281, 0.244707, 0.270111, 0.248295,
22950.246942, 0.245592, 0.272766, 0.254243, 0.199647, 0.262590,
22960.226710, 0.243836, 0.214153, 0.233535, 0.235207, 0.234245,
22970.247698, 0.248379, 0.241463, 0.265230, 0.223242, 0.236191,
22980.252700, 0.231865, 0.228352, 0.229101, 0.237385, 0.246485,
22990.254706, 0.245565, 0.224841, 0.257301, 0.240968, 0.202379,
23000.236943, 0.241683, 0.220809, 0.219014, 0.213015, 0.244470,
23010.221042, 0.198996, 0.225295, 0.264466, 0.200600, 0.228143,
23020.250138, 0.216784, 0.268002, 0.275734, 0.218144, 0.229866,
23030.235443, 0.208909, 0.215067, 0.189743, 0.216741, 0.242686,
23040.200234, 0.218882, 0.245991, 0.222815, 0.219576, 0.209773,
23050.205247, 0.203855, 0.202534, 0.192536, 0.223447, 0.225810,
23060.220583, 0.248421, 0.223424, 0.206033, 0.203130, 0.221225,
23070.223763, 0.239216, 0.252311, 0.206893, 0.228461, 0.233591,
23080.201512, 0.242382, 0.215147, 0.232578, 0.207116, 0.239213,
23090.196215, 0.184367, 0.235135, 0.189768, 0.274084, 0.206267,
23100.203283, 0.248828, 0.250214, 0.217465, 0.232080, 0.215150,
23110.207936, 0.176789, 0.191338, 0.188655, 0.196181, 0.223691,
23120.254257, 0.216874, 0.213536, 0.221399, 0.192024, 0.212534,
23130.218169, 0.226635, 0.201191, 0.212700, 0.211634, 0.232353,
23140.223636, 0.208605, 0.249132, 0.183681, 0.221842, 0.187136,
23150.203772, 0.249575, 0.217713, 0.205193, 0.193941, 0.219707,
23160.264226, 0.182105, 0.207183, 0.220845, 0.236571, 0.182390,
23170.212914, 0.186266, 0.195361, 0.217665, 0.204527, 0.188804,
23180.222832, 0.191193, 0.201073, 0.185616, 0.195011, 0.200828,
23190.181434, 0.233707, 0.202925, 0.211992, 0.173100, 0.205258,
23200.182695, 0.216520, 0.218422, 0.209490, 0.211257, 0.215801,
23210.220652, 0.211409, 0.195731, 0.194957, 0.198888, 0.234926,
23220.221377, 0.229822, 0.176700, 0.172322, 0.212265, 0.206133,
23230.170355, 0.253305, 0.198688, 0.240043, 0.225384, 0.174729,
23240.195820, 0.200093, 0.196912, 0.212308, 0.200490, 0.240415,
23250.159744, 0.173686, 0.223853, 0.213604, 0.193779, 0.179328,
23260.180873, 0.237481, 0.179640, 0.235857, 0.202847, 0.167690,
23270.245093, 0.215504, 0.205848, 0.184408, 0.201626, 0.209651,
23280.236306, 0.217803, 0.188534, 0.187861, 0.161663, 0.221718,
23290.152044, 0.190412, 0.173505, 0.208995, 0.174575, 0.180734,
23300.247704, 0.203388, 0.194184, 0.169679, 0.182703, 0.213402,
23310.191808, 0.178604, 0.178116, 0.198452, 0.174687, 0.169809,
23320.222851, 0.156811, 0.229170, 0.210359, 0.178557, 0.248570,
23330.208536, 0.192571, 0.178912, 0.224505, 0.170822, 0.205492,
23340.330973, 0.160924, 0.203724, 0.213255, 0.205827, 0.187162,
23350.181252, 0.191723, 0.238106, 0.182398, 0.202358, 0.212066,
23360.201255, 0.168159, 0.185219, 0.229176, 0.158222, 0.164092,
23370.215405, 0.200724, 0.234811, 0.184488, 0.213112, 0.198577,
23380.219622, 0.160671, 0.179349, 0.206681, 0.206091, 0.165618,
23390.165203, 0.174442, 0.179287, 0.187318, 0.163481, 0.217440,
23400.160381, 0.177025, 0.204385, 0.163676, 0.210733, 0.186519,
23410.230701, 0.191764, 0.185119, 0.190770, 0.242987, 0.186812,
23420.202906, 0.161935, 0.182426, 0.197922, 0.181475, 0.155903,
23430.175006, 0.223482, 0.202706, 0.218108};
2344wDD = 0.207705;
2345wND = 0.289628;
2346wSD = -1;
2347
2348 Mmin = bin[0];
2349 Mmax = bin[nbin];
2350
2351 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2352
c5dfa3e4 2353 Int_t ibin=nbin-1;
2354 for(Int_t i=1; i<=nbin; i++)
2355 if(M<=bin[i]) {
2356 ibin=i-1;
2357 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2358 break;
2359 }
2360 wSD=w[ibin];
800be8b7 2361 return kTRUE;
c5dfa3e4 2362 }
2363
2364 return kFALSE;
800be8b7 2365}
06956108 2366
2367Bool_t AliGenPythia::IsFromHeavyFlavor(Int_t ipart)
2368{
2369// Check if this is a heavy flavor decay product
2370 TParticle * part = (TParticle *) fParticles.At(ipart);
2371 Int_t mpdg = TMath::Abs(part->GetPdgCode());
2372 Int_t mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2373 //
2374 // Light hadron
2375 if (mfl >= 4 && mfl < 6) return kTRUE;
2376
2377 Int_t imo = part->GetFirstMother()-1;
2378 TParticle* pm = part;
2379 //
2380 // Heavy flavor hadron produced by generator
2381 while (imo > -1) {
2382 pm = (TParticle*)fParticles.At(imo);
2383 mpdg = TMath::Abs(pm->GetPdgCode());
2384 mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2385 if ((mfl > 3) && (mfl <6) && mpdg > 400) return kTRUE;
2386 imo = pm->GetFirstMother()-1;
2387 }
2388 return kFALSE;
2389}
40fe59d4 2390
e81f2bac 2391Bool_t AliGenPythia::CheckDetectorAcceptance(Float_t phi, Float_t eta, Int_t iparticle)
40fe59d4 2392{
2393 // check the eta/phi correspond to the detectors acceptance
2394 // iparticle is the index of the particle to be checked, for PHOS rotation case
2395 if (fCheckPHOS && IsInPHOS (phi,eta,iparticle)) return kTRUE;
2396 else if(fCheckEMCAL && IsInEMCAL (phi,eta)) return kTRUE;
2397 else if(fCheckBarrel && IsInBarrel( eta)) return kTRUE;
2398 else return kFALSE;
2399}
2400
e81f2bac 2401Bool_t AliGenPythia::TriggerOnSelectedParticles(Int_t np)
40fe59d4 2402{
2403 // Select events with fragmentation photon, decay photon, pi0, eta or other hadrons going to PHOS or EMCAL or central barrel,
2404 // implemented primaryly for kPyJets, but extended to any kind of process.
2405
2406 //printf("Check: frag photon %d, pi0 %d, eta %d, electron %d, hadron %d, decay %d, PHOS %d, EMCAL %d, Barrel %d \n",
2407 // fFragPhotonInCalo,fPi0InCalo, fEtaInCalo,fEleInCalo,fHadronInCalo,fDecayPhotonInCalo,fCheckPHOS,fCheckEMCAL, fCheckBarrel);
2408
2409 Bool_t ok = kFALSE;
2410 for (Int_t i=0; i< np; i++) {
2411
2412 TParticle* iparticle = (TParticle *) fParticles.At(i);
2413
2414 Int_t pdg = iparticle->GetPdgCode();
2415 Int_t status = iparticle->GetStatusCode();
2416 Int_t imother = iparticle->GetFirstMother() - 1;
2417
2418 TParticle* pmother = 0x0;
2419 Int_t momStatus = -1;
2420 Int_t momPdg = -1;
2421 if(imother > 0 ){
2422 pmother = (TParticle *) fParticles.At(imother);
2423 momStatus = pmother->GetStatusCode();
2424 momPdg = pmother->GetPdgCode();
2425 }
2426
2427 ok = kFALSE;
2428
2429 //
2430 // Check the particle type: hadron (not pi0 or eta), electron, decay photon (from pi0 or eta or any), pi0 or eta
2431 //
2432 // Hadron
2433 if (fHadronInCalo && status == 1)
2434 {
2435 if(TMath::Abs(pdg) > 23 && pdg !=221 && pdg != 111) // avoid photons, electrons, muons, neutrinos and eta or pi0
2436 // (in case neutral mesons were declared stable)
2437 ok = kTRUE;
2438 }
2439 //Electron
2440 else if (fEleInCalo && status == 1 && TMath::Abs(pdg) == 11)
2441 {
2442 ok = kTRUE;
2443 }
2444 //Fragmentation photon
2445 else if (fFragPhotonInCalo && pdg == 22 && status == 1)
2446 {
2447 if(momStatus != 11) ok = kTRUE ; // No photon from hadron decay
2448 }
2449 // Decay photon
2450 else if (fDecayPhotonInCalo && !fForceNeutralMeson2PhotonDecay && pdg == 22) // pi0 status can be 1 or 11 depending on decay settings, work only for 11
2451 {
2452 if( momStatus == 11)
2453 {
2454 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Decay photon! pdg %d, status %d, pt %2.2f, mom: pdg %d, pt %2.2f\n",
2455 // pdg,status,iparticle->Pt(),momPdg,pmother->Pt());
2456 ok = kTRUE ; // photon from hadron decay
2457
2458 //In case only decays from pi0 or eta requested
2459 if(fPi0InCalo && momPdg!=111) ok = kFALSE;
2460 if(fEtaInCalo && momPdg!=221) ok = kFALSE;
2461 }
2462
2463 }
2464 // Pi0 or Eta particle
2465 else if ((fPi0InCalo || fEtaInCalo))
2466 {
2467 if(fDecayPhotonInCalo && !fForceNeutralMeson2PhotonDecay ) continue ;
2468
2469 if (fPi0InCalo && pdg == 111) // pi0 status can be 1 or 11 depending on decay settings
2470 {
2471 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Pi0! pdg %d, status %d, pt %2.2f\n",pdg,status,iparticle->Pt());
2472 ok = kTRUE;
2473 }
2474 else if (fEtaInCalo && pdg == 221)
2475 {
2476 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Eta! pdg %d, status %d, pt %2.2f\n",pdg,status,iparticle->Pt());
2477 ok = kTRUE;
2478 }
2479
2480 }// pi0 or eta
2481
2482 //
2483 // Check that the selected particle is in the calorimeter acceptance
2484 //
2485 if(ok && iparticle->Pt() > fTriggerParticleMinPt)
2486 {
2487 //Just check if the selected particle falls in the acceptance
2488 if(!fForceNeutralMeson2PhotonDecay )
2489 {
2490 //printf("\t Check acceptance! \n");
2491 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
2492 Float_t eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
2493
2494 if(CheckDetectorAcceptance(phi,eta,i))
2495 {
2496 ok =kTRUE;
2497 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));
2498 //printf("\t Accept \n");
2499 break;
2500 }
2501 else ok = kFALSE;
2502 }
2503 //Mesons have several decay modes, select only those decaying into 2 photons
2504 else if(fForceNeutralMeson2PhotonDecay && (fPi0InCalo || fEtaInCalo))
2505 {
2506 // In case we want the pi0/eta trigger,
2507 // check the decay mode (2 photons)
2508
2509 //printf("\t Force decay 2 gamma\n");
2510
2511 Int_t ndaughters = iparticle->GetNDaughters();
2512 if(ndaughters != 2){
2513 ok=kFALSE;
2514 continue;
2515 }
2516
2517 TParticle*d1 = (TParticle *) fParticles.At(iparticle->GetDaughter(0)-1);
2518 TParticle*d2 = (TParticle *) fParticles.At(iparticle->GetDaughter(1)-1);
2519 if(!d1 || !d2) {
2520 ok=kFALSE;
2521 continue;
2522 }
2523
2524 //iparticle->Print();
2525 //d1->Print();
2526 //d2->Print();
2527
2528 Int_t pdgD1 = d1->GetPdgCode();
2529 Int_t pdgD2 = d2->GetPdgCode();
2530 //printf("\t \t 2 daughters pdg = %d - %d\n",pdgD1,pdgD2);
2531 //printf("mother %d - %d\n",d1->GetFirstMother(),d2->GetFirstMother());
2532
2533 if(pdgD1 != 22 || pdgD2 != 22){
2534 ok = kFALSE;
2535 continue;
2536 }
2537
2538 //printf("\t accept decay\n");
2539
2540 //Trigger on the meson, not on the daughter
2541 if(!fDecayPhotonInCalo){
2542
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 //printf("\t Accept meson pdg %d\n",pdg);
2549 ok =kTRUE;
2550 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));
2551 break;
2552 } else {
2553 ok=kFALSE;
2554 continue;
2555 }
2556 }
2557
2558 //printf("Check daughters acceptance\n");
2559
2560 //Trigger on the meson daughters
2561 //Photon 1
2562 Float_t phi = d1->Phi()*180./TMath::Pi(); //Convert to degrees
2563 Float_t eta =TMath::Abs(d1->Eta()); //in calos etamin=-etamax
2564 if(d1->Pt() > fTriggerParticleMinPt)
2565 {
2566 //printf("\t Check acceptance photon 1! \n");
2567 if(CheckDetectorAcceptance(phi,eta,i))
2568 {
2569 //printf("\t Accept Photon 1\n");
2570 ok =kTRUE;
2571 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));
2572 break;
2573 }
2574 else ok = kFALSE;
2575 } // pt cut
2576 else ok = kFALSE;
2577
2578 //Photon 2
2579 phi = d2->Phi()*180./TMath::Pi(); //Convert to degrees
2580 eta =TMath::Abs(d2->Eta()); //in calos etamin=-etamax
2581
2582 if(d2->Pt() > fTriggerParticleMinPt)
2583 {
2584 //printf("\t Check acceptance photon 2! \n");
2585 if(CheckDetectorAcceptance(phi,eta,i))
2586 {
2587 //printf("\t Accept Photon 2\n");
2588 ok =kTRUE;
2589 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));
2590 break;
2591 }
2592 else ok = kFALSE;
2593 } // pt cut
2594 else ok = kFALSE;
2595 } // force 2 photon daughters in pi0/eta decays
2596 else ok = kFALSE;
2597 } else ok = kFALSE; // check acceptance
2598 } // primary loop
2599
2600 //
2601 // If requested, rotate the particles event in phi to enhance/speed PHOS selection
2602 // A particle passing all trigger conditions except phi position in PHOS, is used as reference
2603 //
2604 if(fCheckPHOSeta)
2605 {
2606 RotatePhi(ok);
2607 }
2608
2609 return ok;
2610}
2611