]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PYTHIA6/AliGenPythia.cxx
Fixes for bug #50317: Correct AliGenPythia for B-jet studies (Jennifer)
[u/mrichter/AliRoot.git] / PYTHIA6 / AliGenPythia.cxx
index b68ab23cb15bbc19f610ec57567d6549eb5022d2..d7c462dc67a80d100c05803e408b6ebdbeb62c62 100644 (file)
 #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"
@@ -76,6 +78,8 @@ AliGenPythia::AliGenPythia():
     fNpartons(0),
     fReadFromFile(0),
     fQuench(0),
+    fQhat(0.),
+    fLength(0.),
     fPtKick(1.),
     fFullEvent(kTRUE),
     fDecayer(new AliDecayerPythia()),
@@ -117,11 +121,13 @@ AliGenPythia::AliGenPythia():
     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),
@@ -166,6 +172,8 @@ AliGenPythia::AliGenPythia(Int_t npart)
      fNpartons(0),
      fReadFromFile(kFALSE),
      fQuench(kFALSE),
+     fQhat(0.),
+     fLength(0.),
      fPtKick(1.),
      fFullEvent(kTRUE),
      fDecayer(new AliDecayerPythia()),
@@ -207,11 +215,13 @@ AliGenPythia::AliGenPythia(Int_t npart)
      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),
@@ -418,6 +428,7 @@ void AliGenPythia::Init()
        fFlavorSelect    =   4; 
        break;
     case kPyBeauty:
+    case kPyBeautyJets:
     case kPyBeautyPbPbMNR:
     case kPyBeautypPbMNR:
     case kPyBeautyppMNR:
@@ -494,10 +505,14 @@ void AliGenPythia::Init()
        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
@@ -508,6 +523,25 @@ void AliGenPythia::Init()
        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.
     }
 }
 
@@ -544,6 +578,13 @@ void AliGenPythia::Generate()
 // 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
 //     
@@ -620,7 +661,8 @@ void AliGenPythia::Generate()
            fProcess != kPyW && 
            fProcess != kPyZ &&
            fProcess != kPyCharmppMNRwmi && 
-           fProcess != kPyBeautyppMNRwmi) {
+           fProcess != kPyBeautyppMNRwmi &&
+           fProcess != kPyBeautyJets) {
            
            for (i = 0; i < np; i++) {
                TParticle* iparticle = (TParticle *) fParticles.At(i);
@@ -849,7 +891,10 @@ Int_t  AliGenPythia::GenerateMB()
 
     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)) {
@@ -887,6 +932,30 @@ Int_t  AliGenPythia::GenerateMB()
       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) {
@@ -977,7 +1046,10 @@ Int_t  AliGenPythia::GenerateMB()
 
     // 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;
@@ -1041,7 +1113,10 @@ Int_t  AliGenPythia::GenerateMB()
        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;
@@ -1150,7 +1225,8 @@ void AliGenPythia::MakeHeader()
 //
 // 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];
@@ -1187,7 +1263,7 @@ void AliGenPythia::MakeHeader()
        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;
@@ -1197,10 +1273,20 @@ void AliGenPythia::MakeHeader()
            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));
@@ -1226,7 +1312,10 @@ Bool_t AliGenPythia::CheckTrigger(TParticle* jet1, TParticle* jet2)
     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];
@@ -1292,56 +1381,109 @@ Bool_t AliGenPythia::CheckKinematicsOnChild(){
 
 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;
+  }
 }