]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVGEN/AliGenPythia.cxx
Check whether USEFFLOAT variable is set, because if not
[u/mrichter/AliRoot.git] / EVGEN / AliGenPythia.cxx
index afe57d7fa0a4dd5039d713328bb0c5921bfa77cc..0dc99ac09a6e265855a8715ffd892daef29340f8 100644 (file)
 
 /*
 $Log$
+Revision 1.68  2002/12/11 09:16:16  morsch
+Use GetJets to fill header.
+
+Revision 1.67  2002/12/09 15:24:09  morsch
+Same trigger routine can use Pycell or Pyclus.
+
+Revision 1.66  2002/12/09 08:22:56  morsch
+UA1 jet finder (Pycell) for software triggering added.
+
+Revision 1.65  2002/11/19 08:57:10  morsch
+Configuration of pt-kick added.
+
+Revision 1.64  2002/11/15 00:43:06  morsch
+Changes for kPyJets
+- initial and final state g-radiation + pt-kick default
+- trigger based on parton clusters (using pyclus)
+- trigger jets are stored in header.
+
+Revision 1.63  2002/10/14 14:55:35  hristov
+Merging the VirtualMC branch to the main development branch (HEAD)
+
+Revision 1.52.4.4  2002/10/10 16:40:08  hristov
+Updating VirtualMC to v3-09-02
+
+Revision 1.62  2002/09/24 10:00:01  morsch
+CheckTrigger() corrected.
+
+Revision 1.61  2002/07/30 09:52:38  morsch
+Call SetGammaPhiRange() and SetGammaEtaRange() in the constructor.
+
+Revision 1.60  2002/07/19 14:49:03  morsch
+Typo corrected.
+
+Revision 1.59  2002/07/19 14:35:36  morsch
+Count total number of trials. Print mean Q, x1, x2.
+
+Revision 1.58  2002/07/17 10:04:09  morsch
+SetYHard method added.
+
 Revision 1.57  2002/05/22 13:22:53  morsch
 Process kPyMbNonDiffr added.
 
@@ -178,15 +217,18 @@ Introduction of the Copyright and cvs Log
 // andreas.morsch@cern.ch
 //
 
+#include <TDatabasePDG.h>
+#include <TParticle.h>
+#include <TPDGCode.h>
+#include <TSystem.h>
+#include <TTree.h>
 
+#include "AliConst.h"
+#include "AliDecayerPythia.h"
 #include "AliGenPythia.h"
 #include "AliGenPythiaEventHeader.h"
-#include "AliDecayerPythia.h"
-#include "AliRun.h"
 #include "AliPythia.h"
-#include "AliPDG.h"
-#include <TParticle.h>
-#include <TSystem.h>
+#include "AliRun.h"
 
  ClassImp(AliGenPythia)
 
@@ -200,6 +242,10 @@ AliGenPythia::AliGenPythia()
   SetEventListRange();
   SetJetPhiRange();
   SetJetEtaRange();
+  SetJetEtRange();
+  SetGammaPhiRange();
+  SetGammaEtaRange();
+  SetPtKick();
 }
 
 AliGenPythia::AliGenPythia(Int_t npart)
@@ -218,6 +264,7 @@ AliGenPythia::AliGenPythia(Int_t npart)
     SetStrucFunc();
     SetForceDecay();
     SetPtHard();
+    SetYHard();
     SetEnergyCMS();
     fDecayer = new AliDecayerPythia();
     // Set random number generator 
@@ -229,6 +276,11 @@ AliGenPythia::AliGenPythia(Int_t npart)
     SetEventListRange();
     SetJetPhiRange();
     SetJetEtaRange();
+    SetJetEtRange();
+    SetGammaPhiRange();
+    SetGammaEtaRange();
+    SetJetReconstructionMode();
+    SetPtKick();
     // Options determining what to keep in the stack (Heavy flavour generation)
     fStackFillOpt = kFlavorSelection; // Keep particle with selected flavor
     fFeedDownOpt = kTRUE;             // allow feed down from higher family
@@ -261,7 +313,8 @@ void AliGenPythia::SetEventListRange(Int_t eventFirst, Int_t eventLast)
 void AliGenPythia::Init()
 {
 // Initialisation
-  SetMC(AliPythia::Instance());
+    
+    SetMC(AliPythia::Instance());
     fPythia=(AliPythia*) fgMCEvGen;
 //
     fParentWeight=1./Float_t(fNpart);
@@ -284,10 +337,23 @@ void AliGenPythia::Init()
       fPythia->SetMSTP(111,0);
     }
 
+
+//  initial state radiation   
+    fPythia->SetMSTP(61,fGinit);
+//  final state radiation
+    fPythia->SetMSTP(71,fGfinal);
+//  pt - kick
+    if (fPtKick > 0.) {
+       fPythia->SetMSTP(91,1);
+       fPythia->SetPARP(91,fPtKick);
+    } else {
+       fPythia->SetMSTP(91,0);
+    }
+
+ //   fPythia->SetMSTJ(1,2);
+ //
     fPythia->ProcInit(fProcess,fEnergyCMS,fStrucFunc);
 
-    //    fPythia->Pylist(0);
-    //    fPythia->Pystat(2);
 //  Parent and Children Selection
     switch (fProcess) 
     {
@@ -335,6 +401,14 @@ void AliGenPythia::Init()
     case kPyDirectGamma:
        break;
     }
+//
+//  This counts the total number of calls to Pyevnt() per run.
+    fTrialsRun = 0;
+    fQ         = 0.;
+    fX1        = 0.;
+    fX2        = 0.;    
+    fNev       = 0 ;
+//    
     AliGenMC::Init();
 }
 
@@ -397,11 +471,12 @@ void AliGenPythia::Generate()
            pSelected[i] =  0;
            trackIt[i]   =  0;
        }
-       // printf("\n **************************************************%d\n",np);
+
        Int_t nc = 0;        // Total n. of selected particles
        Int_t nParents = 0;  // Selected parents
        Int_t nTkbles = 0;   // Trackable particles
-       if (fProcess != kPyMb && fProcess != kPyJets && fProcess != kPyDirectGamma &&
+       if (fProcess != kPyMb && fProcess != kPyJets && 
+           fProcess != kPyDirectGamma &&
            fProcess != kPyMbNonDiffr) {
            
            for (i = 0; i<np; i++) {
@@ -429,7 +504,6 @@ void AliGenPythia::Generate()
                    TParticle *  mother = (TParticle *) fParticles->At(ipa);
                    kfMo = TMath::Abs(mother->GetPdgCode());
                }
-//             printf("\n particle (all)  %d %d %d", i, pSelected[i], kf);
                // What to keep in Stack?
                Bool_t flavorOK = kFALSE;
                Bool_t selectOK = kFALSE;
@@ -563,6 +637,12 @@ void AliGenPythia::Generate()
            if (jev >= fNpart || fNpart == -1) {
                fKineBias=Float_t(fNpart)/Float_t(fTrials);
                printf("\n Trials: %i %i %i\n",fTrials, fNpart, jev);
+
+               fQ  += fPythia->GetVINT(51);
+               fX1 += fPythia->GetVINT(41);
+               fX2 += fPythia->GetVINT(42);
+               fTrialsRun += fTrials;
+               fNev++;
                MakeHeader();
                break;
            }
@@ -603,8 +683,6 @@ Int_t  AliGenPythia::GenerateMB()
        kf = CheckPDGCode(iparticle->GetPdgCode());
        Int_t ks = iparticle->GetStatusCode();
        Int_t km = iparticle->GetFirstMother();
-//     printf("\n Particle: %d %d %d", i, kf, ks);
-       
        if ((ks == 1  && kf!=0 && KinematicSelection(iparticle, 0)) ||
            (ks != 1) ||
            (fProcess == kPyJets && ks == 21 && km == 0 && i>1)) {
@@ -641,6 +719,13 @@ void AliGenPythia::FinishRun()
 {
 // Print x-section summary
     fPythia->Pystat(1);
+    fQ  /= fNev;
+    fX1 /= fNev;
+    fX2 /= fNev;    
+    printf("\nTotal number of Pyevnt() calls %d\n", fTrialsRun);
+    printf("\nMean Q, x1, x2: %f %f %f\n", fQ, fX1, fX2);
+    
+
 }
 
 void AliGenPythia::AdjustWeights()
@@ -663,18 +748,37 @@ void AliGenPythia::SetNuclei(Int_t a1, Int_t a2)
 }
 
 
-void AliGenPythia::MakeHeader() const
+void AliGenPythia::MakeHeader()
 {
 // Builds the event header, to be called after each event
     AliGenEventHeader* header = new AliGenPythiaEventHeader("Pythia");
+//
+// Event type  
     ((AliGenPythiaEventHeader*) header)->SetProcessType(fPythia->GetMSTI(1));
+//
+// Number of trials
     ((AliGenPythiaEventHeader*) header)->SetTrials(fTrials);
+//
+// Event Vertex 
     header->SetPrimaryVertex(fEventVertex);
+//
+// Jets that have triggered
+    if (fProcess == kPyJets)
+    {
+       Int_t ntrig, njet;
+       Float_t jets[4][10];
+       GetJets(njet, ntrig, jets);
+       
+       for (Int_t i = 0; i < ntrig; i++) {
+           ((AliGenPythiaEventHeader*) header)->AddJet(jets[0][i], jets[1][i], jets[2][i], 
+                                                       jets[3][i]);
+       }
+    }
     gAlice->SetGenEventHeader(header);
 }
        
 
-Bool_t AliGenPythia::CheckTrigger(TParticle* jet1, TParticle* jet2) const
+Bool_t AliGenPythia::CheckTrigger(TParticle* jet1, TParticle* jet2)
 {
 // Check the kinematic trigger condition
 //
@@ -690,17 +794,16 @@ Bool_t AliGenPythia::CheckTrigger(TParticle* jet1, TParticle* jet2) const
     Bool_t   triggered = kFALSE;
 
     if (fProcess == kPyJets) {
-       //Check eta range first...
-       if ((eta[0] < fEtaMaxJet && eta[0] > fEtaMinJet) ||
-           (eta[1] < fEtaMaxJet && eta[1] > fEtaMinJet))
-       {
-           //Eta is okay, now check phi range
-           if ((phi[0] < fPhiMaxJet && phi[0] > fPhiMinJet) ||
-               (phi[1] < fPhiMaxJet && phi[1] > fPhiMinJet))
-           {
-               triggered = kTRUE;
-           }
-       }
+       Int_t njets = 0;
+       Int_t ntrig = 0;
+       Float_t jets[4][10];
+//
+// Use Pythia clustering on parton level to determine jet axis
+//
+       GetJets(njets, ntrig, jets);
+       
+       if (ntrig) triggered = kTRUE;
+//
     } else {
        Int_t ij = 0;
        Int_t ig = 1;
@@ -720,8 +823,6 @@ Bool_t AliGenPythia::CheckTrigger(TParticle* jet1, TParticle* jet2) const
            }
        }
     }
-    
-    
     return triggered;
 }
          
@@ -731,6 +832,152 @@ AliGenPythia& AliGenPythia::operator=(const  AliGenPythia& rhs)
     return *this;
 }
 
+void  AliGenPythia::LoadEvent()
+{
+//
+// Load event into Pythia Common Block
+//
+
+    Int_t npart = (Int_t) (gAlice->TreeK())->GetEntries(); 
+   (fPythia->GetPyjets())->N = npart;
+
+    for (Int_t part = 0; part < npart; part++) {
+       TParticle *MPart = gAlice->Particle(part);
+       Int_t kf     = MPart->GetPdgCode();
+       Int_t ks     = MPart->GetStatusCode();
+       Float_t px = MPart->Px();
+       Float_t py = MPart->Py();
+       Float_t pz = MPart->Pz();
+       Float_t e  = MPart->Energy();
+       Float_t p  = TMath::Sqrt(px * px + py * py + pz * pz);
+       Float_t m  = TMath::Sqrt(e * e - p * p);
+       
+       
+       (fPythia->GetPyjets())->P[0][part] = px;
+       (fPythia->GetPyjets())->P[1][part] = py;
+       (fPythia->GetPyjets())->P[2][part] = pz;
+       (fPythia->GetPyjets())->P[3][part] = e;
+       (fPythia->GetPyjets())->P[4][part] = m;
+       
+       (fPythia->GetPyjets())->K[1][part] = kf;
+       (fPythia->GetPyjets())->K[0][part] = ks;
+    }
+}
+
+void AliGenPythia::RecJetsUA1(Float_t eCellMin, Float_t eCellSeed, Float_t eMin, Float_t rMax, 
+                             Int_t& njets, Float_t jets [4][50])
+{
+//
+//  Calls the Pythia jet finding algorithm to find jets in the current event
+//
+//
+//  Configure detector (EMCAL like)
+//
+    fPythia->SetPARU(51,2.);
+    fPythia->SetMSTU(51,Int_t(96 * 2./0.7));
+    fPythia->SetMSTU(52,3 * 144);
+//
+//  Configure Jet Finder
+//  
+    fPythia->SetPARU(58, eCellMin);
+    fPythia->SetPARU(52, eCellSeed);
+    fPythia->SetPARU(53, eMin);
+    fPythia->SetPARU(54, rMax);
+    fPythia->SetMSTU(54, 2);
+//
+//  Save jets
+    Int_t n     = fPythia->GetN();
+
+//
+//  Run Jet Finder
+    fPythia->Pycell(njets);
+    Int_t i;
+    for (i = 0; i < njets; i++) {
+       Float_t px    = (fPythia->GetPyjets())->P[0][n+i];
+       Float_t py    = (fPythia->GetPyjets())->P[1][n+i];
+       Float_t pz    = (fPythia->GetPyjets())->P[2][n+i];
+       Float_t e     = (fPythia->GetPyjets())->P[3][n+i];
+
+       jets[0][i] = px;
+       jets[1][i] = py;
+       jets[2][i] = pz;
+       jets[3][i] = e;
+    }
+}
+
+
+
+void  AliGenPythia::GetJets(Int_t& nJets, Int_t& nJetsTrig, Float_t jets[4][10])
+{
+//
+//  Calls the Pythia clustering algorithm to find jets in the current event
+//
+    Int_t n     = fPythia->GetN();
+    nJets       = 0;
+    nJetsTrig   = 0;
+    if (fJetReconstruction == kCluster) {
+//
+//  Configure cluster algorithm
+//    
+       fPythia->SetPARU(43, 2.);
+       fPythia->SetMSTU(41, 1);
+//
+//  Call cluster algorithm
+//    
+       fPythia->Pyclus(nJets);
+//
+//  Loading jets from common block
+//
+    } else {
+//
+//  Configure detector (EMCAL like)
+//
+       fPythia->SetPARU(51,2.);
+       fPythia->SetMSTU(51,Int_t(96 * 2./0.7));
+       fPythia->SetMSTU(52,3 * 144);
+//
+//  Configure Jet Finder
+//  
+       fPythia->SetPARU(58,  0.0);
+       fPythia->SetPARU(52,  4.0);
+       fPythia->SetPARU(53, 10.0);
+       fPythia->SetPARU(54,  1.0);
+       fPythia->SetMSTU(54,  2);
+//
+//  Run Jet Finder
+       fPythia->Pycell(nJets);
+    }
+
+    Int_t i;
+    for (i = 0; i < nJets; i++) {
+       Float_t px    = (fPythia->GetPyjets())->P[0][n+i];
+       Float_t py    = (fPythia->GetPyjets())->P[1][n+i];
+       Float_t pz    = (fPythia->GetPyjets())->P[2][n+i];
+       Float_t e     = (fPythia->GetPyjets())->P[3][n+i];
+       Float_t pt    = TMath::Sqrt(px * px + py * py);
+       Float_t phi   = TMath::ATan2(py,px);
+       Float_t theta = TMath::ATan2(pt,pz);
+       Float_t et    = e * TMath::Sin(theta);
+       Float_t eta   = -TMath::Log(TMath::Tan(theta / 2.));
+
+       if (
+           eta > fEtaMinJet && eta < fEtaMaxJet && 
+           phi > fPhiMinJet && eta < fPhiMaxJet &&
+           et  > fEtMinJet  && et  < fEtMaxJet     
+           ) 
+       {
+           jets[0][nJetsTrig] = px;
+           jets[1][nJetsTrig] = py;
+           jets[2][nJetsTrig] = pz;
+           jets[3][nJetsTrig] = e;
+           nJetsTrig++;
+           
+       } else {
+//         printf("\n........-Jet #%d: %10.3f %10.3f %10.3f %10.3f \n", i, pt, et, eta, phi * kRaddeg);
+       }
+    }
+}
 
 
 #ifdef never