#include <TDatabasePDG.h>
#include <TParticle.h>
#include <TPDGCode.h>
+#include <TObjArray.h>
#include <TSystem.h>
#include <TTree.h>
#include "AliConst.h"
#include "AliDecayerPythia.h"
#include "AliGenPythia.h"
+#include "AliFastGlauber.h"
#include "AliHeader.h"
#include "AliGenPythiaEventHeader.h"
#include "AliPythia.h"
fNpartons(0),
fReadFromFile(0),
fQuench(0),
+ fQhat(0.),
+ fLength(0.),
fPtKick(1.),
fFullEvent(kTRUE),
fDecayer(new AliDecayerPythia()),
fFragPhotonInCalo(kFALSE),
fPi0InCalo(kFALSE) ,
fPhotonInCalo(kFALSE),
+ fEleInEMCAL(kFALSE),
fCheckEMCAL(kFALSE),
fCheckPHOS(kFALSE),
fCheckPHOSeta(kFALSE),
fFragPhotonOrPi0MinPt(0),
fPhotonMinPt(0),
+ fElectronMinPt(0),
fPHOSMinPhi(219.),
fPHOSMaxPhi(321.),
fPHOSEta(0.13),
fNpartons(0),
fReadFromFile(kFALSE),
fQuench(kFALSE),
+ fQhat(0.),
+ fLength(0.),
fPtKick(1.),
fFullEvent(kTRUE),
fDecayer(new AliDecayerPythia()),
fFragPhotonInCalo(kFALSE),
fPi0InCalo(kFALSE) ,
fPhotonInCalo(kFALSE),
+ fEleInEMCAL(kFALSE),
fCheckEMCAL(kFALSE),
fCheckPHOS(kFALSE),
fCheckPHOSeta(kFALSE),
fFragPhotonOrPi0MinPt(0),
fPhotonMinPt(0),
+ fElectronMinPt(0),
fPHOSMinPhi(219.),
fPHOSMaxPhi(321.),
fPHOSEta(0.13),
fFlavorSelect = 4;
break;
case kPyBeauty:
+ case kPyBeautyJets:
case kPyBeautyPbPbMNR:
case kPyBeautypPbMNR:
case kPyBeautyppMNR:
Warning("Init","SetNuclei used. Use SetProjectile + SetTarget instead. fDyBoost has been reset to 0\n");
}
- if (fQuench) {
+ fPythia->SetPARJ(200, 0.0);
+ fPythia->SetPARJ(199, 0.0);
+ fPythia->SetPARJ(198, 0.0);
+ fPythia->SetPARJ(197, 0.0);
+
+ if (fQuench == 1) {
fPythia->InitQuenching(0., 0.1, 0.6e6, 0);
}
- fPythia->SetPARJ(200, 0.0);
if (fQuench == 3) {
// Nestor's change of the splittings
fPythia->SetMSTJ(47, 0); // No correction back to hard scattering element
fPythia->SetMSTJ(50, 0); // No coherence in first branching
fPythia->SetPARJ(82, 1.); // Cut off for parton showers
+ } else if (fQuench == 4) {
+ // Armesto-Cunqueiro-Salgado change of the splittings.
+ AliFastGlauber* glauber = AliFastGlauber::Instance();
+ glauber->Init(2);
+ //read and store transverse almonds corresponding to differnt
+ //impact parameters.
+ glauber->SetCentralityClass(0.,0.1);
+ fPythia->SetPARJ(200, 1.);
+ fPythia->SetPARJ(198, fQhat);
+ fPythia->SetPARJ(199, fLength);
+
+ fPythia->SetMSTJ(41, 1); // QCD radiation only
+ fPythia->SetMSTJ(42, 2); // angular ordering
+ fPythia->SetMSTJ(44, 2); // option to run alpha_s
+ //fPythia->SetMSTJ(47, 0); // No correction back to hard scattering element
+ //fPythia->SetMSTJ(50, 0); // No coherence in first branching
+ fPythia->SetPARJ(82, 1.); // Cut off for parton showers
+ // MSTJ(41) must NOT be 11 or 12, as then FSR may go through PYPTFS
+ // (kt-ordered cascade) in which medium effects have not been introduced.
}
}
// Switch hadronisation off
//
fPythia->SetMSTJ(1, 0);
+
+ if (fQuench ==4){
+ Double_t bimp;
+ // Quenching comes through medium-modified splitting functions.
+ AliFastGlauber::Instance()->GetRandomBHard(bimp);
+ fPythia->SetPARJ(197,bimp);
+ }
//
// Either produce new event or read partons from file
//
fProcess != kPyW &&
fProcess != kPyZ &&
fProcess != kPyCharmppMNRwmi &&
- fProcess != kPyBeautyppMNRwmi) {
+ fProcess != kPyBeautyppMNRwmi &&
+ fProcess != kPyBeautyJets) {
for (i = 0; i < np; i++) {
TParticle* iparticle = (TParticle *) fParticles.At(i);
Int_t* pParent = new Int_t[np];
for (i=0; i< np; i++) pParent[i] = -1;
- if (fProcess == kPyJets || fProcess == kPyDirectGamma) {
+ //
+ //TO BE CHECKED: Should we require this for Beauty Jets?
+ //
+ if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets) {
TParticle* jet1 = (TParticle *) fParticles.At(6);
TParticle* jet2 = (TParticle *) fParticles.At(7);
if (!CheckTrigger(jet1, jet2)) {
if(!ok)
return 0;
}
+
+ // Select beauty jets with electron in EMCAL
+ if (fProcess == kPyBeautyJets && fEleInEMCAL) {
+
+ Bool_t ok = kFALSE;
+
+ Int_t pdg = 11; //electron
+
+ Float_t pt, eta, phi;
+ for (i=0; i< np; i++) {
+ TParticle* iparticle = (TParticle *) fParticles.At(i);
+ if(iparticle->GetStatusCode()==1 && TMath::Abs(iparticle->GetPdgCode())==pdg &&
+ iparticle->Pt() > fElectronMinPt){
+ pt = iparticle->Pt();
+ phi = iparticle->Phi()*180./TMath::Pi(); //Convert to degrees
+ eta =TMath::Abs(iparticle->Eta()); //in calos etamin=-etamax
+ if(IsInEMCAL(phi,eta))
+ ok =kTRUE;
+ }
+ }
+ if(!ok)
+ return 0;
+ AliDebug(5,Form("Found an electron jet (pt,eta,phi) = (%f,%f,%f)",pt,eta,phi));
+ }
// Check for minimum multiplicity
if (fTriggerMultiplicity > 0) {
// Check if there is a ccbar or bbbar pair with at least one of the two
// in fYMin < y < fYMax
- if (fProcess == kPyCharmppMNRwmi || fProcess == kPyBeautyppMNRwmi) {
+ //
+ // TO BE CHECKED: Should we require this for beauty jets?
+ //
+ if (fProcess == kPyCharmppMNRwmi || fProcess == kPyBeautyppMNRwmi || fProcess == kPyBeautyJets) {
TParticle *partCheck;
TParticle *mother;
Bool_t theQ=kFALSE,theQbar=kFALSE,inYcut=kFALSE;
Int_t km = iparticle->GetFirstMother();
if ((ks == 1 && kf!=0 && KinematicSelection(iparticle, 0)) ||
(ks != 1) ||
- (fProcess == kPyJets && ks == 21 && km == 0 && i>1)) {
+ //
+ //TO BE CHECKED: Should we require this for beauty jets?
+ //
+ ((fProcess == kPyJets || fProcess == kPyBeautyJets) && ks == 21 && km == 0 && i>1)) {
nc++;
if (ks == 1) trackIt = 1;
Int_t ipa = iparticle->GetFirstMother()-1;
//
// Jets that have triggered
- if (fProcess == kPyJets || fProcess == kPyDirectGamma)
+ //Need to store jets for b-jet studies too!
+ if (fProcess == kPyJets || fProcess == kPyDirectGamma || fProcess == kPyBeautyJets)
{
Int_t ntrig, njet;
Float_t jets[4][10];
if (fQuench == 1) {
// Pythia::Quench()
fPythia->GetQuenchingParameters(xp, yp, z);
- } else {
+ } else if (fQuench == 2){
// Pyquen
Double_t r1 = PARIMP.rb1;
Double_t r2 = PARIMP.rb2;
xp = r * TMath::Cos(phi);
yp = r * TMath::Sin(phi);
+ } else if (fQuench == 4) {
+ // QPythia
+ Double_t xy[2];
+ Double_t i0i1[2];
+ AliFastGlauber::Instance()->GetSavedXY(xy);
+ AliFastGlauber::Instance()->GetSavedI0I1(i0i1);
+ xp = xy[0];
+ yp = xy[1];
+ ((AliGenPythiaEventHeader*) fHeader)->SetInMediumLength(2. * i0i1[1] / i0i1[0]);
}
+
((AliGenPythiaEventHeader*) fHeader)->SetXYJet(xp, yp);
((AliGenPythiaEventHeader*) fHeader)->SetZQuench(z);
- }
+ }
//
// Store pt^hard
((AliGenPythiaEventHeader*) fHeader)->SetPtHard(fPythia->GetVINT(47));
pdg[1] = jet2->GetPdgCode();
Bool_t triggered = kFALSE;
- if (fProcess == kPyJets) {
+ //
+ //TO BE CHECKED: If we call this method for kPyBeautyJets, we need it here
+ //
+ if (fProcess == kPyJets || fProcess == kPyBeautyJets) {
Int_t njets = 0;
Int_t ntrig = 0;
Float_t jets[4][10];
void AliGenPythia::LoadEvent(AliStack* stack, Int_t flag, Int_t reHadr)
{
-//
-// Load event into Pythia Common Block
-//
-
- Int_t npart = stack -> GetNprimary();
- Int_t n0 = 0;
+ //
+ // Load event into Pythia Common Block
+ //
+
+ Int_t npart = stack -> GetNprimary();
+ Int_t n0 = 0;
+
+ if (!flag) {
+ (fPythia->GetPyjets())->N = npart;
+ } else {
+ n0 = (fPythia->GetPyjets())->N;
+ (fPythia->GetPyjets())->N = n0 + npart;
+ }
+
+
+ for (Int_t part = 0; part < npart; part++) {
+ TParticle *mPart = stack->Particle(part);
- if (!flag) {
- (fPythia->GetPyjets())->N = npart;
- } else {
- n0 = (fPythia->GetPyjets())->N;
- (fPythia->GetPyjets())->N = n0 + npart;
+ Int_t kf = mPart->GetPdgCode();
+ Int_t ks = mPart->GetStatusCode();
+ Int_t idf = mPart->GetFirstDaughter();
+ Int_t idl = mPart->GetLastDaughter();
+
+ if (reHadr) {
+ if (ks == 11 || ks == 12) {
+ ks -= 10;
+ idf = -1;
+ idl = -1;
+ }
}
+ Float_t px = mPart->Px();
+ Float_t py = mPart->Py();
+ Float_t pz = mPart->Pz();
+ Float_t e = mPart->Energy();
+ Float_t m = mPart->GetCalcMass();
- for (Int_t part = 0; part < npart; part++) {
- TParticle *mPart = stack->Particle(part);
-
- Int_t kf = mPart->GetPdgCode();
- Int_t ks = mPart->GetStatusCode();
- Int_t idf = mPart->GetFirstDaughter();
- Int_t idl = mPart->GetLastDaughter();
-
- if (reHadr) {
+
+ (fPythia->GetPyjets())->P[0][part+n0] = px;
+ (fPythia->GetPyjets())->P[1][part+n0] = py;
+ (fPythia->GetPyjets())->P[2][part+n0] = pz;
+ (fPythia->GetPyjets())->P[3][part+n0] = e;
+ (fPythia->GetPyjets())->P[4][part+n0] = m;
+
+ (fPythia->GetPyjets())->K[1][part+n0] = kf;
+ (fPythia->GetPyjets())->K[0][part+n0] = ks;
+ (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
+ (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
+ (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
+ }
+}
+
+void AliGenPythia::LoadEvent(TObjArray* stack, Int_t flag, Int_t reHadr)
+{
+ //
+ // Load event into Pythia Common Block
+ //
+
+ Int_t npart = stack -> GetEntries();
+ Int_t n0 = 0;
+
+ if (!flag) {
+ (fPythia->GetPyjets())->N = npart;
+ } else {
+ n0 = (fPythia->GetPyjets())->N;
+ (fPythia->GetPyjets())->N = n0 + npart;
+ }
+
+
+ for (Int_t part = 0; part < npart; part++) {
+ TParticle *mPart = dynamic_cast<TParticle *>(stack->At(part));
+ Int_t kf = mPart->GetPdgCode();
+ Int_t ks = mPart->GetStatusCode();
+ Int_t idf = mPart->GetFirstDaughter();
+ Int_t idl = mPart->GetLastDaughter();
+
+ if (reHadr) {
if (ks == 11 || ks == 12) {
- ks -= 10;
- idf = -1;
- idl = -1;
+ ks -= 10;
+ idf = -1;
+ idl = -1;
}
- }
-
- Float_t px = mPart->Px();
- Float_t py = mPart->Py();
- Float_t pz = mPart->Pz();
- Float_t e = mPart->Energy();
- Float_t m = mPart->GetCalcMass();
-
-
- (fPythia->GetPyjets())->P[0][part+n0] = px;
- (fPythia->GetPyjets())->P[1][part+n0] = py;
- (fPythia->GetPyjets())->P[2][part+n0] = pz;
- (fPythia->GetPyjets())->P[3][part+n0] = e;
- (fPythia->GetPyjets())->P[4][part+n0] = m;
-
- (fPythia->GetPyjets())->K[1][part+n0] = kf;
- (fPythia->GetPyjets())->K[0][part+n0] = ks;
- (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
- (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
- (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
}
+
+ Float_t px = mPart->Px();
+ Float_t py = mPart->Py();
+ Float_t pz = mPart->Pz();
+ Float_t e = mPart->Energy();
+ Float_t m = mPart->GetCalcMass();
+
+
+ (fPythia->GetPyjets())->P[0][part+n0] = px;
+ (fPythia->GetPyjets())->P[1][part+n0] = py;
+ (fPythia->GetPyjets())->P[2][part+n0] = pz;
+ (fPythia->GetPyjets())->P[3][part+n0] = e;
+ (fPythia->GetPyjets())->P[4][part+n0] = m;
+
+ (fPythia->GetPyjets())->K[1][part+n0] = kf;
+ (fPythia->GetPyjets())->K[0][part+n0] = ks;
+ (fPythia->GetPyjets())->K[3][part+n0] = idf + 1;
+ (fPythia->GetPyjets())->K[4][part+n0] = idl + 1;
+ (fPythia->GetPyjets())->K[2][part+n0] = mPart->GetFirstMother() + 1;
+ }
}