]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PYTHIA6/AliGenPythia.cxx
Merge branch 'master' of https://git.cern.ch/reps/AliRoot
[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//
1255// Jets that have triggered
f913ec4f 1256
9dfe63b3 1257 //Need to store jets for b-jet studies too!
64da86aa 1258 if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG)
8d2cd130 1259 {
1260 Int_t ntrig, njet;
1261 Float_t jets[4][10];
1262 GetJets(njet, ntrig, jets);
9ff6c04c 1263
8d2cd130 1264
1265 for (Int_t i = 0; i < ntrig; i++) {
e5c87a3d 1266 ((AliGenPythiaEventHeader*) fHeader)->AddJet(jets[0][i], jets[1][i], jets[2][i],
8d2cd130 1267 jets[3][i]);
1268 }
1269 }
5fa4b20b 1270//
1271// Copy relevant information from external header, if present.
1272//
1273 Float_t uqJet[4];
1274
1275 if (fRL) {
1276 AliGenPythiaEventHeader* exHeader = (AliGenPythiaEventHeader*) (fRL->GetHeader()->GenEventHeader());
1277 for (Int_t i = 0; i < exHeader->NTriggerJets(); i++)
1278 {
1279 printf("Adding Jet %d %d \n", i, exHeader->NTriggerJets());
1280
1281
1282 exHeader->TriggerJet(i, uqJet);
1283 ((AliGenPythiaEventHeader*) fHeader)->AddUQJet(uqJet[0], uqJet[1], uqJet[2], uqJet[3]);
1284 }
1285 }
1286//
1287// Store quenching parameters
1288//
1289 if (fQuench){
b6262a45 1290 Double_t z[4] = {0.};
1291 Double_t xp = 0.;
1292 Double_t yp = 0.;
1293
7c21f297 1294 if (fQuench == 1) {
1295 // Pythia::Quench()
1296 fPythia->GetQuenchingParameters(xp, yp, z);
1bab4b79 1297 } else if (fQuench == 2){
7c21f297 1298 // Pyquen
1299 Double_t r1 = PARIMP.rb1;
1300 Double_t r2 = PARIMP.rb2;
1301 Double_t b = PARIMP.b1;
1302 Double_t r = 0.5 * TMath::Sqrt(2. * (r1 * r1 + r2 * r2) - b * b);
1303 Double_t phi = PARIMP.psib1;
1304 xp = r * TMath::Cos(phi);
1305 yp = r * TMath::Sin(phi);
1306
1bab4b79 1307 } else if (fQuench == 4) {
1308 // QPythia
5831e75f 1309 Double_t xy[2];
e9719084 1310 Double_t i0i1[2];
1311 AliFastGlauber::Instance()->GetSavedXY(xy);
1312 AliFastGlauber::Instance()->GetSavedI0I1(i0i1);
5831e75f 1313 xp = xy[0];
1314 yp = xy[1];
e6fe9b82 1315 ((AliGenPythiaEventHeader*) fHeader)->SetImpactParameter(fImpact);
7c21f297 1316 }
1bab4b79 1317
7c21f297 1318 ((AliGenPythiaEventHeader*) fHeader)->SetXYJet(xp, yp);
1319 ((AliGenPythiaEventHeader*) fHeader)->SetZQuench(z);
1bab4b79 1320 }
beac474c 1321//
1322// Store pt^hard
1323 ((AliGenPythiaEventHeader*) fHeader)->SetPtHard(fPythia->GetVINT(47));
64da86aa 1324
1325//
1326// Store Event Weight
1327 ((AliGenPythiaEventHeader*) fHeader)->SetEventWeight(fPythia->GetPARI(7));
1328
5fa4b20b 1329//
cf57b268 1330// Pass header
5fa4b20b 1331//
cf57b268 1332 AddHeader(fHeader);
4c4eac97 1333 fHeader = 0x0;
8d2cd130 1334}
cf57b268 1335
c2fc9d31 1336Bool_t AliGenPythia::CheckTrigger(const TParticle* jet1, const TParticle* jet2)
8d2cd130 1337{
1338// Check the kinematic trigger condition
1339//
1340 Double_t eta[2];
1341 eta[0] = jet1->Eta();
1342 eta[1] = jet2->Eta();
1343 Double_t phi[2];
1344 phi[0] = jet1->Phi();
1345 phi[1] = jet2->Phi();
1346 Int_t pdg[2];
1347 pdg[0] = jet1->GetPdgCode();
1348 pdg[1] = jet2->GetPdgCode();
1349 Bool_t triggered = kFALSE;
1350
64da86aa 1351 if (fProcess == kPyJets || fProcess == kPyBeautyJets || fProcess == kPyBeautyppMNRwmi || fProcess == kPyJetsPWHG || fProcess == kPyCharmPWHG || fProcess == kPyBeautyPWHG) {
8d2cd130 1352 Int_t njets = 0;
1353 Int_t ntrig = 0;
1354 Float_t jets[4][10];
1355//
1356// Use Pythia clustering on parton level to determine jet axis
1357//
1358 GetJets(njets, ntrig, jets);
1359
76d6ba9a 1360 if (ntrig || fEtMinJet == 0.) triggered = kTRUE;
8d2cd130 1361//
1362 } else {
1363 Int_t ij = 0;
1364 Int_t ig = 1;
1365 if (pdg[0] == kGamma) {
1366 ij = 1;
1367 ig = 0;
1368 }
1369 //Check eta range first...
1370 if ((eta[ij] < fEtaMaxJet && eta[ij] > fEtaMinJet) &&
1371 (eta[ig] < fEtaMaxGamma && eta[ig] > fEtaMinGamma))
1372 {
1373 //Eta is okay, now check phi range
1374 if ((phi[ij] < fPhiMaxJet && phi[ij] > fPhiMinJet) &&
1375 (phi[ig] < fPhiMaxGamma && phi[ig] > fPhiMinGamma))
1376 {
1377 triggered = kTRUE;
1378 }
1379 }
1380 }
1381 return triggered;
1382}
aea21c57 1383
1384
aea21c57 1385
7184e472 1386Bool_t AliGenPythia::CheckKinematicsOnChild(){
1387//
1388//Checking Kinematics on Child (status code 1, particle code ?, kin cuts
1389//
aea21c57 1390 Bool_t checking = kFALSE;
1391 Int_t j, kcode, ks, km;
1392 Int_t nPartAcc = 0; //number of particles in the acceptance range
1393 Int_t numberOfAcceptedParticles = 1;
1394 if (fNumberOfAcceptedParticles != 0) { numberOfAcceptedParticles = fNumberOfAcceptedParticles; }
8507138f 1395 Int_t npart = fParticles.GetEntriesFast();
aea21c57 1396
0f6ee828 1397 for (j = 0; j<npart; j++) {
8507138f 1398 TParticle * jparticle = (TParticle *) fParticles.At(j);
aea21c57 1399 kcode = TMath::Abs( CheckPDGCode(jparticle->GetPdgCode()) );
1400 ks = jparticle->GetStatusCode();
1401 km = jparticle->GetFirstMother();
1402
1403 if( (ks == 1) && (kcode == fPdgCodeParticleforAcceptanceCut) && (KinematicSelection(jparticle,1)) ){
1404 nPartAcc++;
1405 }
0f6ee828 1406 if( numberOfAcceptedParticles <= nPartAcc){
1407 checking = kTRUE;
1408 break;
1409 }
aea21c57 1410 }
0f6ee828 1411
aea21c57 1412 return checking;
aea21c57 1413}
1414
5fa4b20b 1415void AliGenPythia::LoadEvent(AliStack* stack, Int_t flag, Int_t reHadr)
8d2cd130 1416{
1058d9df 1417 //
1418 // Load event into Pythia Common Block
1419 //
1420
1421 Int_t npart = stack -> GetNprimary();
1422 Int_t n0 = 0;
1423
1424 if (!flag) {
1425 (fPythia->GetPyjets())->N = npart;
1426 } else {
1427 n0 = (fPythia->GetPyjets())->N;
1428 (fPythia->GetPyjets())->N = n0 + npart;
1429 }
1430
1431
1432 for (Int_t part = 0; part < npart; part++) {
1433 TParticle *mPart = stack->Particle(part);
32d6ef7d 1434
1058d9df 1435 Int_t kf = mPart->GetPdgCode();
1436 Int_t ks = mPart->GetStatusCode();
1437 Int_t idf = mPart->GetFirstDaughter();
1438 Int_t idl = mPart->GetLastDaughter();
1439
1440 if (reHadr) {
1441 if (ks == 11 || ks == 12) {
1442 ks -= 10;
1443 idf = -1;
1444 idl = -1;
1445 }
32d6ef7d 1446 }
1447
1058d9df 1448 Float_t px = mPart->Px();
1449 Float_t py = mPart->Py();
1450 Float_t pz = mPart->Pz();
1451 Float_t e = mPart->Energy();
1452 Float_t m = mPart->GetCalcMass();
32d6ef7d 1453
1058d9df 1454
1455 (fPythia->GetPyjets())->P[0][part+n0] = px;
1456 (fPythia->GetPyjets())->P[1][part+n0] = py;
1457 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1458 (fPythia->GetPyjets())->P[3][part+n0] = e;
1459 (fPythia->GetPyjets())->P[4][part+n0] = m;
1460
1461 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1462 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1463 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1464 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1465 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1466 }
1467}
1468
c2fc9d31 1469void AliGenPythia::LoadEvent(const TObjArray* stack, Int_t flag, Int_t reHadr)
1058d9df 1470{
1471 //
1472 // Load event into Pythia Common Block
1473 //
1474
1475 Int_t npart = stack -> GetEntries();
1476 Int_t n0 = 0;
1477
1478 if (!flag) {
1479 (fPythia->GetPyjets())->N = npart;
1480 } else {
1481 n0 = (fPythia->GetPyjets())->N;
1482 (fPythia->GetPyjets())->N = n0 + npart;
1483 }
1484
1485
1486 for (Int_t part = 0; part < npart; part++) {
1487 TParticle *mPart = dynamic_cast<TParticle *>(stack->At(part));
92847124 1488 if (!mPart) continue;
1489
1058d9df 1490 Int_t kf = mPart->GetPdgCode();
1491 Int_t ks = mPart->GetStatusCode();
1492 Int_t idf = mPart->GetFirstDaughter();
1493 Int_t idl = mPart->GetLastDaughter();
1494
1495 if (reHadr) {
92847124 1496 if (ks == 11 || ks == 12) {
1497 ks -= 10;
1498 idf = -1;
1499 idl = -1;
1500 }
8d2cd130 1501 }
1058d9df 1502
1503 Float_t px = mPart->Px();
1504 Float_t py = mPart->Py();
1505 Float_t pz = mPart->Pz();
1506 Float_t e = mPart->Energy();
1507 Float_t m = mPart->GetCalcMass();
1508
1509
1510 (fPythia->GetPyjets())->P[0][part+n0] = px;
1511 (fPythia->GetPyjets())->P[1][part+n0] = py;
1512 (fPythia->GetPyjets())->P[2][part+n0] = pz;
1513 (fPythia->GetPyjets())->P[3][part+n0] = e;
1514 (fPythia->GetPyjets())->P[4][part+n0] = m;
1515
1516 (fPythia->GetPyjets())->K[1][part+n0] = kf;
1517 (fPythia->GetPyjets())->K[0][part+n0] = ks;
1518 (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
1519 (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
1520 (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
1521 }
8d2cd130 1522}
1523
5fa4b20b 1524
014a9521 1525void AliGenPythia::RecJetsUA1(Int_t& njets, Float_t jets [4][50])
8d2cd130 1526{
1527//
1528// Calls the Pythia jet finding algorithm to find jets in the current event
1529//
1530//
8d2cd130 1531//
1532// Save jets
1533 Int_t n = fPythia->GetN();
1534
1535//
1536// Run Jet Finder
1537 fPythia->Pycell(njets);
1538 Int_t i;
1539 for (i = 0; i < njets; i++) {
1540 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1541 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1542 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1543 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1544
1545 jets[0][i] = px;
1546 jets[1][i] = py;
1547 jets[2][i] = pz;
1548 jets[3][i] = e;
1549 }
1550}
1551
1552
1553
1554void AliGenPythia::GetJets(Int_t& nJets, Int_t& nJetsTrig, Float_t jets[4][10])
1555{
1556//
1557// Calls the Pythia clustering algorithm to find jets in the current event
1558//
1559 Int_t n = fPythia->GetN();
1560 nJets = 0;
1561 nJetsTrig = 0;
1562 if (fJetReconstruction == kCluster) {
1563//
1564// Configure cluster algorithm
1565//
1566 fPythia->SetPARU(43, 2.);
1567 fPythia->SetMSTU(41, 1);
1568//
1569// Call cluster algorithm
1570//
1571 fPythia->Pyclus(nJets);
1572//
1573// Loading jets from common block
1574//
1575 } else {
592f8307 1576
8d2cd130 1577//
1578// Run Jet Finder
1579 fPythia->Pycell(nJets);
1580 }
1581
1582 Int_t i;
1583 for (i = 0; i < nJets; i++) {
1584 Float_t px = (fPythia->GetPyjets())->P[0][n+i];
1585 Float_t py = (fPythia->GetPyjets())->P[1][n+i];
1586 Float_t pz = (fPythia->GetPyjets())->P[2][n+i];
1587 Float_t e = (fPythia->GetPyjets())->P[3][n+i];
1588 Float_t pt = TMath::Sqrt(px * px + py * py);
a920faf9 1589 Float_t phi = TMath::Pi() + TMath::ATan2(-py, -px);
8d2cd130 1590 Float_t theta = TMath::ATan2(pt,pz);
1591 Float_t et = e * TMath::Sin(theta);
1592 Float_t eta = -TMath::Log(TMath::Tan(theta / 2.));
8d2cd130 1593 if (
1594 eta > fEtaMinJet && eta < fEtaMaxJet &&
675eb105 1595 phi > fPhiMinJet && phi < fPhiMaxJet &&
8d2cd130 1596 et > fEtMinJet && et < fEtMaxJet
1597 )
1598 {
1599 jets[0][nJetsTrig] = px;
1600 jets[1][nJetsTrig] = py;
1601 jets[2][nJetsTrig] = pz;
1602 jets[3][nJetsTrig] = e;
1603 nJetsTrig++;
5fa4b20b 1604// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
8d2cd130 1605 } else {
1606// printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
1607 }
1608 }
1609}
1610
f913ec4f 1611void AliGenPythia::GetSubEventTime()
1612{
1613 // Calculates time of the next subevent
9d7108a7 1614 fEventTime = 0.;
1615 if (fEventsTime) {
1616 TArrayF &array = *fEventsTime;
1617 fEventTime = array[fCurSubEvent++];
1618 }
1619 // printf(" Event time: %d %f %p",fCurSubEvent,fEventTime,fEventsTime);
1620 return;
f913ec4f 1621}
8d2cd130 1622
e81f2bac 1623Bool_t AliGenPythia::IsInBarrel(Float_t eta) const
40fe59d4 1624{
1625 // Is particle in Central Barrel acceptance?
1626 // etamin=-etamax
1627 if( eta < fTriggerEta )
1628 return kTRUE;
1629 else
1630 return kFALSE;
1631}
1632
e81f2bac 1633Bool_t AliGenPythia::IsInEMCAL(Float_t phi, Float_t eta) const
ec2c406e 1634{
1635 // Is particle in EMCAL acceptance?
ec2c406e 1636 // phi in degrees, etamin=-etamax
9fd8e520 1637 if(phi > fEMCALMinPhi && phi < fEMCALMaxPhi &&
1638 eta < fEMCALEta )
ec2c406e 1639 return kTRUE;
1640 else
1641 return kFALSE;
1642}
1643
e81f2bac 1644Bool_t AliGenPythia::IsInPHOS(Float_t phi, Float_t eta, Int_t iparticle)
ec2c406e 1645{
1646 // Is particle in PHOS acceptance?
1647 // Acceptance slightly larger considered.
1648 // phi in degrees, etamin=-etamax
40fe59d4 1649 // iparticle is the index of the particle to be checked, for PHOS rotation case
1650
9fd8e520 1651 if(phi > fPHOSMinPhi && phi < fPHOSMaxPhi &&
1652 eta < fPHOSEta )
ec2c406e 1653 return kTRUE;
1654 else
40fe59d4 1655 {
1656 if( fCheckPHOSeta && eta < fPHOSEta) fPHOSRotateCandidate = iparticle;
1657
ec2c406e 1658 return kFALSE;
40fe59d4 1659 }
ec2c406e 1660}
1661
40fe59d4 1662void AliGenPythia::RotatePhi(Bool_t& okdd)
90a236ce 1663{
40fe59d4 1664 //Rotate event in phi to enhance events in PHOS acceptance
1665
1666 if(fPHOSRotateCandidate < 0) return ;
1667
90a236ce 1668 //calculate the new position random between fPHOSMinPhi and fPHOSMaxPhi
1669 Double_t phiPHOSmin = TMath::Pi()*fPHOSMinPhi/180;
1670 Double_t phiPHOSmax = TMath::Pi()*fPHOSMaxPhi/180;
800be8b7 1671 Double_t phiPHOS = (AliPythiaRndm::GetPythiaRandom())->Uniform(phiPHOSmin,phiPHOSmax);
90a236ce 1672
1673 //calculate deltaphi
40fe59d4 1674 TParticle* ph = (TParticle *) fParticles.At(fPHOSRotateCandidate);
90a236ce 1675 Double_t phphi = ph->Phi();
1676 Double_t deltaphi = phiPHOS - phphi;
40fe59d4 1677
90a236ce 1678
1679
1680 //loop for all particles and produce the phi rotation
8507138f 1681 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
90a236ce 1682 Double_t oldphi, newphi;
777e69b0 1683 Double_t newVx, newVy, r, vZ, time;
1684 Double_t newPx, newPy, pt, pz, e;
90a236ce 1685 for(Int_t i=0; i< np; i++) {
40fe59d4 1686 TParticle* iparticle = (TParticle *) fParticles.At(i);
1687 oldphi = iparticle->Phi();
1688 newphi = oldphi + deltaphi;
1689 if(newphi < 0) newphi = 2*TMath::Pi() + newphi; // correct angle
1690 if(newphi > 2*TMath::Pi()) newphi = newphi - 2*TMath::Pi(); // correct angle
1691
1692 r = iparticle->R();
1693 newVx = r * TMath::Cos(newphi);
1694 newVy = r * TMath::Sin(newphi);
1695 vZ = iparticle->Vz(); // don't transform
1696 time = iparticle->T(); // don't transform
1697
1698 pt = iparticle->Pt();
1699 newPx = pt * TMath::Cos(newphi);
1700 newPy = pt * TMath::Sin(newphi);
1701 pz = iparticle->Pz(); // don't transform
1702 e = iparticle->Energy(); // don't transform
1703
1704 // apply rotation
1705 iparticle->SetProductionVertex(newVx, newVy, vZ, time);
1706 iparticle->SetMomentum(newPx, newPy, pz, e);
1707
90a236ce 1708 } //end particle loop
1709
40fe59d4 1710 // now let's check that we put correctly the candidate photon in PHOS
1711 Float_t phi = ph->Phi()*180./TMath::Pi(); //Convert to degrees
1712 Float_t eta =TMath::Abs(ph->Eta());//in calos etamin=-etamax
1713 if(IsInPHOS(phi,eta,-1))
1714 okdd = kTRUE;
1715
1716 // reset the value for next event
1717 fPHOSRotateCandidate = -1;
1718
90a236ce 1719}
ec2c406e 1720
1721
800be8b7 1722Bool_t AliGenPythia::CheckDiffraction()
1723{
1724 // use this method only with Perugia-0 tune!
1725
1726 // printf("AAA\n");
1727
1728 Int_t np = (fHadronisation) ? fParticles.GetEntriesFast() : fNpartons;
1729
1730 Int_t iPart1=-1;
1731 Int_t iPart2=-1;
1732
1733 Double_t y1 = 1e10;
1734 Double_t y2 = -1e10;
1735
1736 const Int_t kNstable=20;
1737 const Int_t pdgStable[20] = {
1738 22, // Photon
1739 11, // Electron
1740 12, // Electron Neutrino
1741 13, // Muon
1742 14, // Muon Neutrino
1743 15, // Tau
1744 16, // Tau Neutrino
1745 211, // Pion
1746 321, // Kaon
1747 311, // K0
1748 130, // K0s
1749 310, // K0l
1750 2212, // Proton
1751 2112, // Neutron
1752 3122, // Lambda_0
1753 3112, // Sigma Minus
1754 3222, // Sigma Plus
1755 3312, // Xsi Minus
1756 3322, // Xsi0
1757 3334 // Omega
1758 };
1759
1760 for (Int_t i = 0; i < np; i++) {
1761 TParticle * part = (TParticle *) fParticles.At(i);
1762
1763 Int_t statusCode = part->GetStatusCode();
1764
1765 // Initial state particle
1766 if (statusCode != 1)
1767 continue;
1768
1769 Int_t pdg = TMath::Abs(part->GetPdgCode());
1770 Bool_t isStable = kFALSE;
1771 for (Int_t i1 = 0; i1 < kNstable; i1++) {
1772 if (pdg == pdgStable[i1]) {
1773 isStable = kTRUE;
1774 break;
1775 }
1776 }
1777 if(!isStable)
1778 continue;
1779
1780 Double_t y = part->Y();
1781
1782 if (y < y1)
1783 {
1784 y1 = y;
1785 iPart1 = i;
1786 }
1787 if (y > y2)
1788 {
1789 y2 = y;
1790 iPart2 = i;
1791 }
1792 }
1793
1794 if(iPart1<0 || iPart2<0) return kFALSE;
1795
1796 y1=TMath::Abs(y1);
1797 y2=TMath::Abs(y2);
1798
1799 TParticle * part1 = (TParticle *) fParticles.At(iPart1);
1800 TParticle * part2 = (TParticle *) fParticles.At(iPart2);
1801
1802 Int_t pdg1 = part1->GetPdgCode();
1803 Int_t pdg2 = part2->GetPdgCode();
1804
1805
1806 Int_t iPart = -1;
1807 if (pdg1 == 2212 && pdg2 == 2212)
1808 {
1809 if(y1 > y2)
1810 iPart = iPart1;
1811 else if(y1 < y2)
1812 iPart = iPart2;
1813 else {
1814 iPart = iPart1;
1815 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)>0.5) iPart = iPart2;
1816 }
1817 }
1818 else if (pdg1 == 2212)
1819 iPart = iPart1;
1820 else if (pdg2 == 2212)
1821 iPart = iPart2;
1822
1823
1824
1825
1826
1827 Double_t M=-1.;
1828 if(iPart>0) {
1829 TParticle * part = (TParticle *) fParticles.At(iPart);
1830 Double_t E= part->Energy();
1831 Double_t P= part->P();
4f813e90 1832 Double_t M2 = (fEnergyCMS-E-P)*(fEnergyCMS-E+P);
1833 if(M2<0) return kFALSE;
1834 M= TMath::Sqrt(M2);
800be8b7 1835 }
1836
c5dfa3e4 1837 Double_t Mmin, Mmax, wSD, wDD, wND;
1838 if(!GetWeightsDiffraction(M, Mmin, Mmax, wSD, wDD, wND)) return kFALSE;
1839
1840 if(M>-1 && M<Mmin) return kFALSE;
1841 if(M>Mmax) M=-1;
1842
1843 Int_t procType=fPythia->GetMSTI(1);
1844 Int_t proc0=2;
1845 if(procType== 94) proc0=1;
1846 if(procType== 92 || procType== 93) proc0=0;
1847
1848 Int_t proc=2;
1849 if(M>0) proc=0;
1850 else if(proc0==1) proc=1;
1851
1852 if(proc==1 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wDD) return kFALSE;
1853 if(proc==2 && (AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.) > wND) return kFALSE;
800be8b7 1854
1855
1856 // if(proc==1 || proc==2) return kFALSE;
1857
c5dfa3e4 1858 if(proc!=0) {
1859 if(proc0!=0) fProcDiff = procType;
1860 else fProcDiff = 95;
1861 return kTRUE;
1862 }
1863
1864 if(wSD<0) AliError("wSD<0 ! \n");
1865
1866 if((AliPythiaRndm::GetPythiaRandom())->Uniform(0.,1.)> wSD) return kFALSE;
1867
1868 // printf("iPart = %d\n", iPart);
1869
1870 if(iPart==iPart1) fProcDiff=93;
1871 else if(iPart==iPart2) fProcDiff=92;
1872 else {
1873 printf("EROOR: iPart!=iPart1 && iPart!=iPart2\n");
1874
800be8b7 1875 }
1876
c5dfa3e4 1877 return kTRUE;
1878}
1879
1880
1881
1882Bool_t AliGenPythia::GetWeightsDiffraction(Double_t M, Double_t &Mmin, Double_t &Mmax,
1883 Double_t &wSD, Double_t &wDD, Double_t &wND)
1884{
1885
1886 // 900 GeV
1887 if(TMath::Abs(fEnergyCMS-900)<1 ){
1888
1889const Int_t nbin=400;
1890Double_t bin[]={
18911.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
18924.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
18937.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
189410.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
189513.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
189615.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
189718.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
189821.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
189924.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
190027.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
190130.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
190233.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
190336.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
190439.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
190542.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
190645.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
190748.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
190851.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
190954.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
191057.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
191160.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
191263.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
191366.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
191469.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
191572.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
191675.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
191778.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
191881.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
191984.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
192087.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
192190.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
192293.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
192396.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
192499.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
1925102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
1926105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
1927108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
1928111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
1929114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
1930117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
1931120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
1932123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
1933126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
1934129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
1935132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
1936135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
1937138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
1938141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
1939144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
1940147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
1941150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
1942153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
1943156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
1944159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
1945162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
1946165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
1947168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
1948171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
1949174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
1950177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
1951180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
1952183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
1953186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
1954189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
1955192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
1956195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
1957198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
1958Double_t w[]={
19591.000000, 0.643457, 0.645609, 0.648347, 0.604563, 0.605002,
19600.602819, 0.611473, 0.576412, 0.562354, 0.550216, 0.529285,
19610.534558, 0.534364, 0.530358, 0.518475, 0.489253, 0.469754,
19620.469825, 0.450513, 0.455849, 0.435312, 0.437210, 0.456686,
19630.413577, 0.427093, 0.426894, 0.418834, 0.409475, 0.388483,
19640.412208, 0.388912, 0.389611, 0.382572, 0.389220, 0.370964,
19650.380463, 0.370873, 0.363701, 0.369363, 0.357361, 0.365759,
19660.348566, 0.337062, 0.348190, 0.332330, 0.359001, 0.335836,
19670.339154, 0.335599, 0.336035, 0.335204, 0.353440, 0.337836,
19680.333874, 0.307120, 0.294963, 0.324978, 0.313359, 0.317688,
19690.323758, 0.319304, 0.335317, 0.301765, 0.317257, 0.356331,
19700.323119, 0.297732, 0.303188, 0.326102, 0.316467, 0.294728,
19710.308135, 0.288857, 0.325692, 0.312493, 0.291100, 0.325921,
19720.313317, 0.295980, 0.308481, 0.328380, 0.313081, 0.296763,
19730.295431, 0.317325, 0.320462, 0.286918, 0.316035, 0.335208,
19740.283193, 0.333945, 0.292534, 0.294164, 0.330680, 0.296992,
19750.285509, 0.317260, 0.298269, 0.311299, 0.312129, 0.286822,
19760.287442, 0.319139, 0.283314, 0.318454, 0.297727, 0.301597,
19770.282483, 0.294792, 0.305569, 0.290957, 0.297817, 0.282908,
19780.272401, 0.305584, 0.300220, 0.297020, 0.298781, 0.278008,
19790.277727, 0.323777, 0.287419, 0.342074, 0.287259, 0.303658,
19800.302668, 0.279622, 0.280586, 0.313630, 0.276068, 0.257051,
19810.309996, 0.265534, 0.297138, 0.281738, 0.294610, 0.292882,
19820.286860, 0.312686, 0.293244, 0.293744, 0.271375, 0.278734,
19830.280308, 0.304739, 0.287907, 0.285261, 0.311180, 0.313476,
19840.289660, 0.289282, 0.319505, 0.271285, 0.272008, 0.289245,
19850.281038, 0.285284, 0.295836, 0.281416, 0.283501, 0.295417,
19860.304372, 0.297764, 0.291378, 0.321530, 0.315604, 0.329507,
19870.282609, 0.275576, 0.283721, 0.311714, 0.283760, 0.273188,
19880.312193, 0.264347, 0.281532, 0.301226, 0.281718, 0.336408,
19890.283157, 0.332010, 0.289974, 0.290256, 0.301569, 0.332228,
19900.288282, 0.326339, 0.313653, 0.300361, 0.289470, 0.264830,
19910.298659, 0.272359, 0.278878, 0.306001, 0.328168, 0.294991,
19920.327737, 0.278056, 0.302435, 0.284183, 0.279270, 0.307279,
19930.307917, 0.315196, 0.283803, 0.313333, 0.315730, 0.304818,
19940.307171, 0.295223, 0.333741, 0.346911, 0.310143, 0.336686,
19950.275459, 0.334781, 0.295405, 0.275816, 0.301678, 0.327242,
19960.320717, 0.309230, 0.292145, 0.294489, 0.305088, 0.300969,
19970.277438, 0.326159, 0.297065, 0.301177, 0.303843, 0.275382,
19980.304019, 0.284166, 0.289610, 0.331611, 0.317131, 0.310880,
19990.360456, 0.294052, 0.342694, 0.327166, 0.336797, 0.298040,
20000.295767, 0.260053, 0.325544, 0.335310, 0.320182, 0.301072,
20010.313117, 0.283407, 0.299206, 0.293525, 0.305067, 0.255978,
20020.327055, 0.316382, 0.317700, 0.278993, 0.283120, 0.314000,
20030.274396, 0.291208, 0.348813, 0.319603, 0.313076, 0.289155,
20040.343988, 0.311426, 0.322896, 0.328726, 0.337062, 0.389093,
20050.284122, 0.312184, 0.304008, 0.319170, 0.320778, 0.288390,
20060.337272, 0.356273, 0.343310, 0.312209, 0.330709, 0.297977,
20070.346146, 0.369162, 0.324385, 0.339831, 0.337037, 0.318739,
20080.343157, 0.277720, 0.368407, 0.321330, 0.338997, 0.314220,
20090.328861, 0.321824, 0.328013, 0.356925, 0.359144, 0.296314,
20100.345415, 0.396711, 0.347032, 0.294928, 0.343799, 0.322331,
20110.328656, 0.326098, 0.337338, 0.337038, 0.300179, 0.351391,
20120.324337, 0.330896, 0.302842, 0.310522, 0.337052, 0.359989,
20130.383250, 0.359355, 0.315382, 0.333113, 0.342598, 0.355348,
20140.320751, 0.320475, 0.351762, 0.351475, 0.338358, 0.326153,
20150.302507, 0.340048, 0.318685, 0.381646, 0.339320, 0.299453,
20160.426599, 0.393515, 0.353929, 0.328435, 0.413976, 0.292558,
20170.379340, 0.358344, 0.409259, 0.313821, 0.336675, 0.324521,
20180.408382, 0.346273, 0.312939, 0.362453, 0.343152, 0.330577,
20190.332831, 0.353299, 0.347745, 0.334818, 0.332234, 0.385585,
20200.395483, 0.395316, 0.326972, 0.349434, 0.317604, 0.328980,
20210.375056, 0.317290, 0.357083, 0.346165, 0.310444, 0.356873,
20220.359523, 0.365308, 0.365122, 0.383685, 0.370975, 0.396928,
20230.407654, 0.307755, 0.323033, 0.350580, 0.345231, 0.342462,
20240.400000, 0.318309, 0.403570, 0.322856, 0.383053, 0.422252,
20250.386112, 0.364314, 0.434375, 0.334629};
2026wDD = 0.379611;
2027wND = 0.496961;
2028wSD = -1;
2029
2030 Mmin = bin[0];
2031 Mmax = bin[nbin];
2032 if(M<Mmin || M>Mmax) return kTRUE;
2033
7873275c 2034 Int_t ibin=nbin-1;
93a60586 2035 for(Int_t i=1; i<=nbin; i++)
2ff57420 2036 if(M<=bin[i]) {
2037 ibin=i-1;
2038 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
800be8b7 2039 break;
2040 }
c5dfa3e4 2041 wSD=w[ibin];
2042 return kTRUE;
2043 }
2044 else if(TMath::Abs(fEnergyCMS-2760)<1 ){
800be8b7 2045
c5dfa3e4 2046const Int_t nbin=400;
2047Double_t bin[]={
20481.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
20494.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
20507.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
205110.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
205213.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
205315.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
205418.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
205521.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
205624.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
205727.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
205830.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
205933.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
206036.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
206139.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
206242.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
206345.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
206448.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
206551.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
206654.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
206757.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
206860.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
206963.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
207066.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
207169.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
207272.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
207375.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
207478.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
207581.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
207684.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
207787.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
207890.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
207993.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
208096.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
208199.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2082102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2083105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2084108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2085111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2086114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2087117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2088120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2089123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2090126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2091129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2092132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2093135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2094138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2095141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2096144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2097147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2098150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2099153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2100156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2101159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2102162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2103165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2104168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2105171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2106174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2107177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2108180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2109183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2110186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2111189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2112192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2113195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2114198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2115Double_t w[]={
21161.000000, 0.692593, 0.673384, 0.666273, 0.657285, 0.637723,
21170.625881, 0.643590, 0.606100, 0.589007, 0.567824, 0.578705,
21180.538530, 0.517937, 0.528278, 0.515918, 0.539461, 0.466186,
21190.489869, 0.468402, 0.465017, 0.453336, 0.460769, 0.474638,
21200.456347, 0.434471, 0.427478, 0.435435, 0.410934, 0.366431,
21210.382240, 0.379513, 0.394249, 0.386837, 0.353103, 0.382138,
21220.377497, 0.389479, 0.378736, 0.347933, 0.354605, 0.352077,
21230.324443, 0.358792, 0.339968, 0.359052, 0.330734, 0.318291,
21240.333703, 0.358644, 0.335819, 0.332213, 0.309051, 0.309975,
21250.331626, 0.304407, 0.309819, 0.312097, 0.312462, 0.320411,
21260.280401, 0.302311, 0.315863, 0.281479, 0.310003, 0.296911,
21270.313676, 0.281071, 0.294163, 0.306500, 0.283462, 0.274867,
21280.307149, 0.270555, 0.282264, 0.287373, 0.307849, 0.278675,
21290.286990, 0.278269, 0.300105, 0.286799, 0.265674, 0.275140,
21300.285702, 0.257352, 0.267714, 0.248204, 0.252220, 0.255678,
21310.282946, 0.268257, 0.282375, 0.262675, 0.275564, 0.248345,
21320.236259, 0.291914, 0.259936, 0.241338, 0.267389, 0.285044,
21330.289419, 0.253594, 0.284568, 0.231840, 0.260008, 0.268527,
21340.275363, 0.224115, 0.281260, 0.257913, 0.295152, 0.264399,
21350.232287, 0.282533, 0.223431, 0.255756, 0.244471, 0.221695,
21360.272450, 0.284244, 0.253682, 0.270717, 0.275403, 0.240323,
21370.245081, 0.241859, 0.216340, 0.244789, 0.220291, 0.238478,
21380.224691, 0.244058, 0.266117, 0.271478, 0.242012, 0.267321,
21390.248494, 0.253343, 0.255606, 0.235458, 0.241079, 0.233223,
21400.226813, 0.259224, 0.234239, 0.258606, 0.210892, 0.238186,
21410.243271, 0.222678, 0.213437, 0.273939, 0.247966, 0.232548,
21420.263438, 0.222089, 0.272111, 0.248818, 0.244295, 0.238368,
21430.236908, 0.248776, 0.232604, 0.231194, 0.227117, 0.231152,
21440.282140, 0.229778, 0.232631, 0.261794, 0.216633, 0.253471,
21450.242157, 0.227406, 0.269335, 0.230547, 0.210618, 0.285872,
21460.248776, 0.229875, 0.242728, 0.227388, 0.220567, 0.222062,
21470.235950, 0.224087, 0.228895, 0.208287, 0.235999, 0.208696,
21480.230367, 0.267667, 0.220484, 0.233402, 0.233815, 0.250455,
21490.253120, 0.219556, 0.230980, 0.236661, 0.222395, 0.226111,
21500.198315, 0.210555, 0.202813, 0.208594, 0.235976, 0.221490,
21510.243059, 0.204901, 0.216987, 0.229039, 0.231466, 0.221975,
21520.231220, 0.253638, 0.250448, 0.260291, 0.328345, 0.205739,
21530.222014, 0.251513, 0.279427, 0.270506, 0.248409, 0.222472,
21540.291632, 0.227796, 0.248769, 0.276896, 0.214742, 0.200139,
21550.230693, 0.226031, 0.268900, 0.185160, 0.245353, 0.205843,
21560.231155, 0.219122, 0.214811, 0.199763, 0.274179, 0.217598,
21570.274988, 0.237244, 0.211820, 0.225459, 0.252799, 0.235948,
21580.224986, 0.245385, 0.237770, 0.213373, 0.229737, 0.215487,
21590.234453, 0.249684, 0.239435, 0.250422, 0.257194, 0.214762,
21600.212266, 0.228988, 0.253798, 0.201607, 0.239946, 0.205245,
21610.231670, 0.212774, 0.206768, 0.231563, 0.189388, 0.227926,
21620.227203, 0.237754, 0.221628, 0.211138, 0.203322, 0.200985,
21630.231780, 0.220294, 0.232686, 0.234243, 0.218264, 0.255870,
21640.223213, 0.238670, 0.213713, 0.213064, 0.246700, 0.233446,
21650.221503, 0.206767, 0.200722, 0.226179, 0.237425, 0.239229,
21660.238611, 0.240419, 0.247806, 0.215923, 0.205298, 0.232778,
21670.272312, 0.226773, 0.258103, 0.223287, 0.269404, 0.203398,
21680.223782, 0.204213, 0.229664, 0.234040, 0.228419, 0.203936,
21690.263686, 0.199141, 0.236127, 0.214058, 0.204611, 0.224324,
21700.292140, 0.190735, 0.235157, 0.213018, 0.257085, 0.190554,
21710.203197, 0.213044, 0.237023, 0.214243, 0.193562, 0.262403,
21720.206256, 0.221396, 0.233588, 0.256611, 0.249731, 0.226683,
21730.199330, 0.251026, 0.222596, 0.201941, 0.186374, 0.221038,
21740.196555, 0.222560, 0.299419, 0.231979, 0.242924, 0.198310,
21750.217628, 0.235458, 0.278595, 0.218624, 0.277305, 0.239109,
21760.205600, 0.253715, 0.221173, 0.218195, 0.277647, 0.241974,
21770.268748, 0.268128, 0.292258, 0.249420, 0.191034, 0.219506,
21780.216502, 0.250677, 0.193386, 0.201310, 0.259464, 0.255351,
21790.269628, 0.221063, 0.294079, 0.196726, 0.233634, 0.221870,
21800.216236, 0.197259, 0.247433, 0.272765, 0.294079, 0.236336,
21810.206396, 0.238524, 0.247846, 0.269519, 0.237141, 0.230611,
21820.201712, 0.242225, 0.255565, 0.258738};
2183wDD = 0.512813;
2184wND = 0.518820;
2185wSD = -1;
2186
2187 Mmin = bin[0];
2188 Mmax = bin[nbin];
2189 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2190
c5dfa3e4 2191 Int_t ibin=nbin-1;
2192 for(Int_t i=1; i<=nbin; i++)
2193 if(M<=bin[i]) {
2194 ibin=i-1;
2195 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2196 break;
2197 }
2198 wSD=w[ibin];
2199 return kTRUE;
2200 }
800be8b7 2201
800be8b7 2202
c5dfa3e4 2203 else if(TMath::Abs(fEnergyCMS-7000)<1 ){
2204const Int_t nbin=400;
2205Double_t bin[]={
22061.080000, 1.577300, 2.074600, 2.571900, 3.069200, 3.566500,
22074.063800, 4.561100, 5.058400, 5.555700, 6.053000, 6.550300,
22087.047600, 7.544900, 8.042200, 8.539500, 9.036800, 9.534100,
220910.031400, 10.528700, 11.026000, 11.523300, 12.020600, 12.517900,
221013.015200, 13.512500, 14.009800, 14.507100, 15.004400, 15.501700,
221115.999000, 16.496300, 16.993600, 17.490900, 17.988200, 18.485500,
221218.982800, 19.480100, 19.977400, 20.474700, 20.972000, 21.469300,
221321.966600, 22.463900, 22.961200, 23.458500, 23.955800, 24.453100,
221424.950400, 25.447700, 25.945000, 26.442300, 26.939600, 27.436900,
221527.934200, 28.431500, 28.928800, 29.426100, 29.923400, 30.420700,
221630.918000, 31.415300, 31.912600, 32.409900, 32.907200, 33.404500,
221733.901800, 34.399100, 34.896400, 35.393700, 35.891000, 36.388300,
221836.885600, 37.382900, 37.880200, 38.377500, 38.874800, 39.372100,
221939.869400, 40.366700, 40.864000, 41.361300, 41.858600, 42.355900,
222042.853200, 43.350500, 43.847800, 44.345100, 44.842400, 45.339700,
222145.837000, 46.334300, 46.831600, 47.328900, 47.826200, 48.323500,
222248.820800, 49.318100, 49.815400, 50.312700, 50.810000, 51.307300,
222351.804600, 52.301900, 52.799200, 53.296500, 53.793800, 54.291100,
222454.788400, 55.285700, 55.783000, 56.280300, 56.777600, 57.274900,
222557.772200, 58.269500, 58.766800, 59.264100, 59.761400, 60.258700,
222660.756000, 61.253300, 61.750600, 62.247900, 62.745200, 63.242500,
222763.739800, 64.237100, 64.734400, 65.231700, 65.729000, 66.226300,
222866.723600, 67.220900, 67.718200, 68.215500, 68.712800, 69.210100,
222969.707400, 70.204700, 70.702000, 71.199300, 71.696600, 72.193900,
223072.691200, 73.188500, 73.685800, 74.183100, 74.680400, 75.177700,
223175.675000, 76.172300, 76.669600, 77.166900, 77.664200, 78.161500,
223278.658800, 79.156100, 79.653400, 80.150700, 80.648000, 81.145300,
223381.642600, 82.139900, 82.637200, 83.134500, 83.631800, 84.129100,
223484.626400, 85.123700, 85.621000, 86.118300, 86.615600, 87.112900,
223587.610200, 88.107500, 88.604800, 89.102100, 89.599400, 90.096700,
223690.594000, 91.091300, 91.588600, 92.085900, 92.583200, 93.080500,
223793.577800, 94.075100, 94.572400, 95.069700, 95.567000, 96.064300,
223896.561600, 97.058900, 97.556200, 98.053500, 98.550800, 99.048100,
223999.545400, 100.042700, 100.540000, 101.037300, 101.534600, 102.031900,
2240102.529200, 103.026500, 103.523800, 104.021100, 104.518400, 105.015700,
2241105.513000, 106.010300, 106.507600, 107.004900, 107.502200, 107.999500,
2242108.496800, 108.994100, 109.491400, 109.988700, 110.486000, 110.983300,
2243111.480600, 111.977900, 112.475200, 112.972500, 113.469800, 113.967100,
2244114.464400, 114.961700, 115.459000, 115.956300, 116.453600, 116.950900,
2245117.448200, 117.945500, 118.442800, 118.940100, 119.437400, 119.934700,
2246120.432000, 120.929300, 121.426600, 121.923900, 122.421200, 122.918500,
2247123.415800, 123.913100, 124.410400, 124.907700, 125.405000, 125.902300,
2248126.399600, 126.896900, 127.394200, 127.891500, 128.388800, 128.886100,
2249129.383400, 129.880700, 130.378000, 130.875300, 131.372600, 131.869900,
2250132.367200, 132.864500, 133.361800, 133.859100, 134.356400, 134.853700,
2251135.351000, 135.848300, 136.345600, 136.842900, 137.340200, 137.837500,
2252138.334800, 138.832100, 139.329400, 139.826700, 140.324000, 140.821300,
2253141.318600, 141.815900, 142.313200, 142.810500, 143.307800, 143.805100,
2254144.302400, 144.799700, 145.297000, 145.794300, 146.291600, 146.788900,
2255147.286200, 147.783500, 148.280800, 148.778100, 149.275400, 149.772700,
2256150.270000, 150.767300, 151.264600, 151.761900, 152.259200, 152.756500,
2257153.253800, 153.751100, 154.248400, 154.745700, 155.243000, 155.740300,
2258156.237600, 156.734900, 157.232200, 157.729500, 158.226800, 158.724100,
2259159.221400, 159.718700, 160.216000, 160.713300, 161.210600, 161.707900,
2260162.205200, 162.702500, 163.199800, 163.697100, 164.194400, 164.691700,
2261165.189000, 165.686300, 166.183600, 166.680900, 167.178200, 167.675500,
2262168.172800, 168.670100, 169.167400, 169.664700, 170.162000, 170.659300,
2263171.156600, 171.653900, 172.151200, 172.648500, 173.145800, 173.643100,
2264174.140400, 174.637700, 175.135000, 175.632300, 176.129600, 176.626900,
2265177.124200, 177.621500, 178.118800, 178.616100, 179.113400, 179.610700,
2266180.108000, 180.605300, 181.102600, 181.599900, 182.097200, 182.594500,
2267183.091800, 183.589100, 184.086400, 184.583700, 185.081000, 185.578300,
2268186.075600, 186.572900, 187.070200, 187.567500, 188.064800, 188.562100,
2269189.059400, 189.556700, 190.054000, 190.551300, 191.048600, 191.545900,
2270192.043200, 192.540500, 193.037800, 193.535100, 194.032400, 194.529700,
2271195.027000, 195.524300, 196.021600, 196.518900, 197.016200, 197.513500,
2272198.010800, 198.508100, 199.005400, 199.502700, 200.000000};
2273Double_t w[]={
22741.000000, 0.798640, 0.770197, 0.717990, 0.699434, 0.692093,
22750.620940, 0.655294, 0.636496, 0.633483, 0.600518, 0.594548,
22760.550759, 0.550413, 0.528926, 0.525877, 0.506701, 0.504117,
22770.486973, 0.492930, 0.461833, 0.488695, 0.438874, 0.460274,
22780.451551, 0.454424, 0.449270, 0.387571, 0.427556, 0.428740,
22790.401682, 0.402260, 0.408961, 0.395417, 0.387426, 0.378602,
22800.357826, 0.359125, 0.348494, 0.363710, 0.356117, 0.340363,
22810.337637, 0.396084, 0.341777, 0.340551, 0.348838, 0.344014,
22820.340468, 0.317654, 0.355584, 0.326023, 0.373416, 0.312298,
22830.326522, 0.290540, 0.335557, 0.318689, 0.327544, 0.319501,
22840.331754, 0.312728, 0.282263, 0.274937, 0.303867, 0.307820,
22850.289344, 0.268934, 0.288908, 0.290018, 0.291369, 0.295242,
22860.289067, 0.277685, 0.267957, 0.267559, 0.320229, 0.265060,
22870.305931, 0.305352, 0.262064, 0.281879, 0.287780, 0.270033,
22880.270814, 0.276667, 0.271531, 0.275283, 0.258189, 0.287969,
22890.251247, 0.301527, 0.267230, 0.245860, 0.293125, 0.253421,
22900.272396, 0.243637, 0.236206, 0.278452, 0.246544, 0.263165,
22910.230484, 0.231102, 0.258281, 0.244707, 0.270111, 0.248295,
22920.246942, 0.245592, 0.272766, 0.254243, 0.199647, 0.262590,
22930.226710, 0.243836, 0.214153, 0.233535, 0.235207, 0.234245,
22940.247698, 0.248379, 0.241463, 0.265230, 0.223242, 0.236191,
22950.252700, 0.231865, 0.228352, 0.229101, 0.237385, 0.246485,
22960.254706, 0.245565, 0.224841, 0.257301, 0.240968, 0.202379,
22970.236943, 0.241683, 0.220809, 0.219014, 0.213015, 0.244470,
22980.221042, 0.198996, 0.225295, 0.264466, 0.200600, 0.228143,
22990.250138, 0.216784, 0.268002, 0.275734, 0.218144, 0.229866,
23000.235443, 0.208909, 0.215067, 0.189743, 0.216741, 0.242686,
23010.200234, 0.218882, 0.245991, 0.222815, 0.219576, 0.209773,
23020.205247, 0.203855, 0.202534, 0.192536, 0.223447, 0.225810,
23030.220583, 0.248421, 0.223424, 0.206033, 0.203130, 0.221225,
23040.223763, 0.239216, 0.252311, 0.206893, 0.228461, 0.233591,
23050.201512, 0.242382, 0.215147, 0.232578, 0.207116, 0.239213,
23060.196215, 0.184367, 0.235135, 0.189768, 0.274084, 0.206267,
23070.203283, 0.248828, 0.250214, 0.217465, 0.232080, 0.215150,
23080.207936, 0.176789, 0.191338, 0.188655, 0.196181, 0.223691,
23090.254257, 0.216874, 0.213536, 0.221399, 0.192024, 0.212534,
23100.218169, 0.226635, 0.201191, 0.212700, 0.211634, 0.232353,
23110.223636, 0.208605, 0.249132, 0.183681, 0.221842, 0.187136,
23120.203772, 0.249575, 0.217713, 0.205193, 0.193941, 0.219707,
23130.264226, 0.182105, 0.207183, 0.220845, 0.236571, 0.182390,
23140.212914, 0.186266, 0.195361, 0.217665, 0.204527, 0.188804,
23150.222832, 0.191193, 0.201073, 0.185616, 0.195011, 0.200828,
23160.181434, 0.233707, 0.202925, 0.211992, 0.173100, 0.205258,
23170.182695, 0.216520, 0.218422, 0.209490, 0.211257, 0.215801,
23180.220652, 0.211409, 0.195731, 0.194957, 0.198888, 0.234926,
23190.221377, 0.229822, 0.176700, 0.172322, 0.212265, 0.206133,
23200.170355, 0.253305, 0.198688, 0.240043, 0.225384, 0.174729,
23210.195820, 0.200093, 0.196912, 0.212308, 0.200490, 0.240415,
23220.159744, 0.173686, 0.223853, 0.213604, 0.193779, 0.179328,
23230.180873, 0.237481, 0.179640, 0.235857, 0.202847, 0.167690,
23240.245093, 0.215504, 0.205848, 0.184408, 0.201626, 0.209651,
23250.236306, 0.217803, 0.188534, 0.187861, 0.161663, 0.221718,
23260.152044, 0.190412, 0.173505, 0.208995, 0.174575, 0.180734,
23270.247704, 0.203388, 0.194184, 0.169679, 0.182703, 0.213402,
23280.191808, 0.178604, 0.178116, 0.198452, 0.174687, 0.169809,
23290.222851, 0.156811, 0.229170, 0.210359, 0.178557, 0.248570,
23300.208536, 0.192571, 0.178912, 0.224505, 0.170822, 0.205492,
23310.330973, 0.160924, 0.203724, 0.213255, 0.205827, 0.187162,
23320.181252, 0.191723, 0.238106, 0.182398, 0.202358, 0.212066,
23330.201255, 0.168159, 0.185219, 0.229176, 0.158222, 0.164092,
23340.215405, 0.200724, 0.234811, 0.184488, 0.213112, 0.198577,
23350.219622, 0.160671, 0.179349, 0.206681, 0.206091, 0.165618,
23360.165203, 0.174442, 0.179287, 0.187318, 0.163481, 0.217440,
23370.160381, 0.177025, 0.204385, 0.163676, 0.210733, 0.186519,
23380.230701, 0.191764, 0.185119, 0.190770, 0.242987, 0.186812,
23390.202906, 0.161935, 0.182426, 0.197922, 0.181475, 0.155903,
23400.175006, 0.223482, 0.202706, 0.218108};
2341wDD = 0.207705;
2342wND = 0.289628;
2343wSD = -1;
2344
2345 Mmin = bin[0];
2346 Mmax = bin[nbin];
2347
2348 if(M<Mmin || M>Mmax) return kTRUE;
800be8b7 2349
c5dfa3e4 2350 Int_t ibin=nbin-1;
2351 for(Int_t i=1; i<=nbin; i++)
2352 if(M<=bin[i]) {
2353 ibin=i-1;
2354 // printf("Mi> %f && Mi< %f\n", bin[i-1], bin[i]);
2355 break;
2356 }
2357 wSD=w[ibin];
800be8b7 2358 return kTRUE;
c5dfa3e4 2359 }
2360
2361 return kFALSE;
800be8b7 2362}
06956108 2363
2364Bool_t AliGenPythia::IsFromHeavyFlavor(Int_t ipart)
2365{
2366// Check if this is a heavy flavor decay product
2367 TParticle * part = (TParticle *) fParticles.At(ipart);
2368 Int_t mpdg = TMath::Abs(part->GetPdgCode());
2369 Int_t mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2370 //
2371 // Light hadron
2372 if (mfl >= 4 && mfl < 6) return kTRUE;
2373
2374 Int_t imo = part->GetFirstMother()-1;
2375 TParticle* pm = part;
2376 //
2377 // Heavy flavor hadron produced by generator
2378 while (imo > -1) {
2379 pm = (TParticle*)fParticles.At(imo);
2380 mpdg = TMath::Abs(pm->GetPdgCode());
2381 mfl = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
2382 if ((mfl > 3) && (mfl <6) && mpdg > 400) return kTRUE;
2383 imo = pm->GetFirstMother()-1;
2384 }
2385 return kFALSE;
2386}
40fe59d4 2387
e81f2bac 2388Bool_t AliGenPythia::CheckDetectorAcceptance(Float_t phi, Float_t eta, Int_t iparticle)
40fe59d4 2389{
2390 // check the eta/phi correspond to the detectors acceptance
2391 // iparticle is the index of the particle to be checked, for PHOS rotation case
2392 if (fCheckPHOS && IsInPHOS (phi,eta,iparticle)) return kTRUE;
2393 else if(fCheckEMCAL && IsInEMCAL (phi,eta)) return kTRUE;
2394 else if(fCheckBarrel && IsInBarrel( eta)) return kTRUE;
2395 else return kFALSE;
2396}
2397
e81f2bac 2398Bool_t AliGenPythia::TriggerOnSelectedParticles(Int_t np)
40fe59d4 2399{
2400 // Select events with fragmentation photon, decay photon, pi0, eta or other hadrons going to PHOS or EMCAL or central barrel,
2401 // implemented primaryly for kPyJets, but extended to any kind of process.
2402
2403 //printf("Check: frag photon %d, pi0 %d, eta %d, electron %d, hadron %d, decay %d, PHOS %d, EMCAL %d, Barrel %d \n",
2404 // fFragPhotonInCalo,fPi0InCalo, fEtaInCalo,fEleInCalo,fHadronInCalo,fDecayPhotonInCalo,fCheckPHOS,fCheckEMCAL, fCheckBarrel);
2405
2406 Bool_t ok = kFALSE;
2407 for (Int_t i=0; i< np; i++) {
2408
2409 TParticle* iparticle = (TParticle *) fParticles.At(i);
2410
2411 Int_t pdg = iparticle->GetPdgCode();
2412 Int_t status = iparticle->GetStatusCode();
2413 Int_t imother = iparticle->GetFirstMother() - 1;
2414
2415 TParticle* pmother = 0x0;
2416 Int_t momStatus = -1;
2417 Int_t momPdg = -1;
2418 if(imother > 0 ){
2419 pmother = (TParticle *) fParticles.At(imother);
2420 momStatus = pmother->GetStatusCode();
2421 momPdg = pmother->GetPdgCode();
2422 }
2423
2424 ok = kFALSE;
2425
2426 //
2427 // Check the particle type: hadron (not pi0 or eta), electron, decay photon (from pi0 or eta or any), pi0 or eta
2428 //
2429 // Hadron
2430 if (fHadronInCalo && status == 1)
2431 {
2432 if(TMath::Abs(pdg) > 23 && pdg !=221 && pdg != 111) // avoid photons, electrons, muons, neutrinos and eta or pi0
2433 // (in case neutral mesons were declared stable)
2434 ok = kTRUE;
2435 }
2436 //Electron
2437 else if (fEleInCalo && status == 1 && TMath::Abs(pdg) == 11)
2438 {
2439 ok = kTRUE;
2440 }
2441 //Fragmentation photon
2442 else if (fFragPhotonInCalo && pdg == 22 && status == 1)
2443 {
2444 if(momStatus != 11) ok = kTRUE ; // No photon from hadron decay
2445 }
2446 // Decay photon
2447 else if (fDecayPhotonInCalo && !fForceNeutralMeson2PhotonDecay && pdg == 22) // pi0 status can be 1 or 11 depending on decay settings, work only for 11
2448 {
2449 if( momStatus == 11)
2450 {
2451 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Decay photon! pdg %d, status %d, pt %2.2f, mom: pdg %d, pt %2.2f\n",
2452 // pdg,status,iparticle->Pt(),momPdg,pmother->Pt());
2453 ok = kTRUE ; // photon from hadron decay
2454
2455 //In case only decays from pi0 or eta requested
2456 if(fPi0InCalo && momPdg!=111) ok = kFALSE;
2457 if(fEtaInCalo && momPdg!=221) ok = kFALSE;
2458 }
2459
2460 }
2461 // Pi0 or Eta particle
2462 else if ((fPi0InCalo || fEtaInCalo))
2463 {
2464 if(fDecayPhotonInCalo && !fForceNeutralMeson2PhotonDecay ) continue ;
2465
2466 if (fPi0InCalo && pdg == 111) // pi0 status can be 1 or 11 depending on decay settings
2467 {
2468 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Pi0! pdg %d, status %d, pt %2.2f\n",pdg,status,iparticle->Pt());
2469 ok = kTRUE;
2470 }
2471 else if (fEtaInCalo && pdg == 221)
2472 {
2473 //if(iparticle->Pt() > fTriggerParticleMinPt) printf("Eta! pdg %d, status %d, pt %2.2f\n",pdg,status,iparticle->Pt());
2474 ok = kTRUE;
2475 }
2476
2477 }// pi0 or eta
2478
2479 //
2480 // Check that the selected particle is in the calorimeter acceptance
2481 //
2482 if(ok && iparticle->Pt() > fTriggerParticleMinPt)
2483 {
2484 //Just check if the selected particle falls in the acceptance
2485 if(!fForceNeutralMeson2PhotonDecay )
2486 {
2487 //printf("\t Check acceptance! \n");
2488 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
2489 Float_t eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
2490
2491 if(CheckDetectorAcceptance(phi,eta,i))
2492 {
2493 ok =kTRUE;
2494 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));
2495 //printf("\t Accept \n");
2496 break;
2497 }
2498 else ok = kFALSE;
2499 }
2500 //Mesons have several decay modes, select only those decaying into 2 photons
2501 else if(fForceNeutralMeson2PhotonDecay && (fPi0InCalo || fEtaInCalo))
2502 {
2503 // In case we want the pi0/eta trigger,
2504 // check the decay mode (2 photons)
2505
2506 //printf("\t Force decay 2 gamma\n");
2507
2508 Int_t ndaughters = iparticle->GetNDaughters();
2509 if(ndaughters != 2){
2510 ok=kFALSE;
2511 continue;
2512 }
2513
2514 TParticle*d1 = (TParticle *) fParticles.At(iparticle->GetDaughter(0)-1);
2515 TParticle*d2 = (TParticle *) fParticles.At(iparticle->GetDaughter(1)-1);
2516 if(!d1 || !d2) {
2517 ok=kFALSE;
2518 continue;
2519 }
2520
2521 //iparticle->Print();
2522 //d1->Print();
2523 //d2->Print();
2524
2525 Int_t pdgD1 = d1->GetPdgCode();
2526 Int_t pdgD2 = d2->GetPdgCode();
2527 //printf("\t \t 2 daughters pdg = %d - %d\n",pdgD1,pdgD2);
2528 //printf("mother %d - %d\n",d1->GetFirstMother(),d2->GetFirstMother());
2529
2530 if(pdgD1 != 22 || pdgD2 != 22){
2531 ok = kFALSE;
2532 continue;
2533 }
2534
2535 //printf("\t accept decay\n");
2536
2537 //Trigger on the meson, not on the daughter
2538 if(!fDecayPhotonInCalo){
2539
2540 Float_t phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
2541 Float_t eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
2542
2543 if(CheckDetectorAcceptance(phi,eta,i))
2544 {
2545 //printf("\t Accept meson pdg %d\n",pdg);
2546 ok =kTRUE;
2547 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));
2548 break;
2549 } else {
2550 ok=kFALSE;
2551 continue;
2552 }
2553 }
2554
2555 //printf("Check daughters acceptance\n");
2556
2557 //Trigger on the meson daughters
2558 //Photon 1
2559 Float_t phi = d1->Phi()*180./TMath::Pi(); //Convert to degrees
2560 Float_t eta =TMath::Abs(d1->Eta()); //in calos etamin=-etamax
2561 if(d1->Pt() > fTriggerParticleMinPt)
2562 {
2563 //printf("\t Check acceptance photon 1! \n");
2564 if(CheckDetectorAcceptance(phi,eta,i))
2565 {
2566 //printf("\t Accept Photon 1\n");
2567 ok =kTRUE;
2568 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));
2569 break;
2570 }
2571 else ok = kFALSE;
2572 } // pt cut
2573 else ok = kFALSE;
2574
2575 //Photon 2
2576 phi = d2->Phi()*180./TMath::Pi(); //Convert to degrees
2577 eta =TMath::Abs(d2->Eta()); //in calos etamin=-etamax
2578
2579 if(d2->Pt() > fTriggerParticleMinPt)
2580 {
2581 //printf("\t Check acceptance photon 2! \n");
2582 if(CheckDetectorAcceptance(phi,eta,i))
2583 {
2584 //printf("\t Accept Photon 2\n");
2585 ok =kTRUE;
2586 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));
2587 break;
2588 }
2589 else ok = kFALSE;
2590 } // pt cut
2591 else ok = kFALSE;
2592 } // force 2 photon daughters in pi0/eta decays
2593 else ok = kFALSE;
2594 } else ok = kFALSE; // check acceptance
2595 } // primary loop
2596
2597 //
2598 // If requested, rotate the particles event in phi to enhance/speed PHOS selection
2599 // A particle passing all trigger conditions except phi position in PHOS, is used as reference
2600 //
2601 if(fCheckPHOSeta)
2602 {
2603 RotatePhi(ok);
2604 }
2605
2606 return ok;
2607}
2608