]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVGEN/AliGenParam.cxx
Transition to NewIO
[u/mrichter/AliRoot.git] / EVGEN / AliGenParam.cxx
index 258ccfca52a0d0538a26058f0eb080508825bc5b..6cfdb4e41757737ab127bc8defb36f00cc553cd4 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.33  2001/10/21 18:35:56  hristov
-Several pointers were set to zero in the default constructors to avoid memory management problems
+/* $Id$ */
 
-Revision 1.32  2001/07/27 17:09:36  morsch
-Use local SetTrack, KeepTrack and SetHighWaterMark methods
-to delegate either to local stack or to stack owned by AliRun.
-(Piotr Skowronski, A.M.)
-
-Revision 1.31  2001/07/13 10:58:54  morsch
-- Some coded moved to AliGenMC
-- Improved handling of secondary vertices.
-
-Revision 1.30  2001/06/15 07:55:04  morsch
-Put only first generation decay products on the stack.
-
-Revision 1.29  2001/03/27 10:58:41  morsch
-Initialize decayer before generation. Important if run inside cocktail.
-
-Revision 1.28  2001/03/09 13:01:41  morsch
-- enum constants for paramterisation type (particle family) moved to AliGen*lib.h
-- use AliGenGSIlib::kUpsilon, AliGenPHOSlib::kEtaPrime to access the constants
-
-Revision 1.27  2001/02/02 15:21:10  morsch
-Set high water mark after last particle.
-Use Vertex() method for Vertex.
-
-Revision 1.26  2000/12/21 16:24:06  morsch
-Coding convention clean-up
-
-Revision 1.25  2000/11/30 07:12:50  alibrary
-Introducing new Rndm and QA classes
-
-Revision 1.24  2000/10/18 19:11:27  hristov
-Division by zero fixed
-
-Revision 1.23  2000/10/02 21:28:06  fca
-Removal of useless dependecies via forward declarations
-
-Revision 1.22  2000/09/12 14:14:55  morsch
-Call fDecayer->ForceDecay() at the beginning of Generate().
-
-Revision 1.21  2000/09/08 15:39:01  morsch
-Handle the case fForceDecay=all during the generation, i.e. select all secondaries.
-
-Revision 1.20  2000/09/06 14:35:44  morsch
-Use AliDecayerPythia for particle decays.
-
-Revision 1.19  2000/07/11 18:24:56  fca
-Coding convention corrections + few minor bug fixes
-
-Revision 1.18  2000/06/29 21:08:27  morsch
-All paramatrisation libraries derive from the pure virtual base class AliGenLib.
-This allows to pass a pointer to a library directly to AliGenParam and avoids the
-use of function pointers in Config.C.
-
-Revision 1.17  2000/06/09 20:33:30  morsch
-All coding rule violations except RS3 corrected
-
-Revision 1.16  2000/05/02 07:51:31  morsch
-- Control precision of pT sampling TF1::SetNpx(..)
-- Correct initialisation of child-cuts in all constructors.
-- Most coding rule violations corrected.
-
-Revision 1.15  2000/04/03 15:42:12  morsch
-Cuts on primary particles are separated from those on the decay products. Methods
-SetChildMomentumRange, SetChildPtRange, SetChildPhiRange, SetChildThetaRange added.
-
-Revision 1.14  1999/11/09 07:38:48  fca
-Changes for compatibility with version 2.23 of ROOT
-
-Revision 1.13  1999/11/04 11:30:31  fca
-Correct the logics for SetForceDecay
-
-Revision 1.12  1999/11/03 17:43:20  fca
-New version from G.Martinez & A.Morsch
-
-Revision 1.11  1999/09/29 09:24:14  fca
-Introduction of the Copyright and cvs Log
-
-*/
+// Class to generate particles from using paramtrized pT and y distributions.
+// Distributions are obtained from pointer to object of type AliGenLib.
+// (For example AliGenMUONlib)
+// Decays are performed using Pythia.
+// andreas.morsch@cern.ch
 
 #include "AliGenParam.h"
-#include "AliDecayerPythia.h"
+#include "AliDecayer.h"
 #include "AliGenMUONlib.h"
 #include "AliRun.h"
 #include <TParticle.h>
@@ -106,6 +31,8 @@ Introduction of the Copyright and cvs Log
 #include <TLorentzVector.h>
 
 #include <TF1.h>
+#include <TCanvas.h>
+#include <TH1.h>
 
 ClassImp(AliGenParam)
 
@@ -127,15 +54,16 @@ AliGenParam::AliGenParam()
     fParam  = 0;
     fAnalog = kAnalog;
     SetDeltaPt();
-//
-// Set random number generator   
-    sRandom = fRandom;
     fDecayer = 0;
+
+
 }
 
 AliGenParam::AliGenParam(Int_t npart, AliGenLib * Library,  Int_t param, char* tname):AliGenMC(npart)
 {
 // Constructor using number of particles parameterisation id and library
+    fName = "Param";
+    fTitle= "Particle Generator using pT and y parameterisation";
     
     fPtParaFunc = Library->GetPt(param, tname);
     fYParaFunc  = Library->GetY (param, tname);
@@ -147,9 +75,6 @@ AliGenParam::AliGenParam(Int_t npart, AliGenLib * Library,  Int_t param, char* t
     fAnalog = kAnalog;
     SetForceDecay();
     SetDeltaPt(); 
-//
-// Set random number generator   
-    sRandom = fRandom;
 }
 
 //____________________________________________________________
@@ -157,7 +82,10 @@ AliGenParam::AliGenParam(Int_t npart, AliGenLib * Library,  Int_t param, char* t
 AliGenParam::AliGenParam(Int_t npart, Int_t param, char* tname):AliGenMC(npart)
 {
 // Constructor using parameterisation id and number of particles
-//      
+//
+    fName = "Param";
+    fTitle= "Particle Generator using pT and y parameterisation";
+      
     AliGenLib* pLibrary = new AliGenMUONlib();
  
     fPtParaFunc = pLibrary->GetPt(param, tname);
@@ -187,6 +115,9 @@ AliGenParam::AliGenParam(Int_t npart, Int_t param,
 {
 // Constructor
 // Gines Martinez 1/10/99 
+    fName = "Param";
+    fTitle= "Particle Generator using pT and y parameterisation";
+
     fPtParaFunc = PtPara; 
     fYParaFunc  = YPara;  
     fIpParaFunc = IpPara;
@@ -207,9 +138,10 @@ AliGenParam::AliGenParam(Int_t npart, Int_t param,
 }
 
 
-AliGenParam::AliGenParam(const AliGenParam & Paramd)
+AliGenParam::AliGenParam(const AliGenParam & Param)
 {
 // copy constructor
+    Param.Copy(*this);
 }
 
 //____________________________________________________________
@@ -225,7 +157,7 @@ void AliGenParam::Init()
 {
 // Initialisation
 
-    fDecayer = new AliDecayerPythia();
+    if (gMC) fDecayer = gMC->GetDecayer();
   //Begin_Html
   /*
     <img src="picts/AliGenParam.gif">
@@ -295,16 +227,15 @@ void AliGenParam::Generate()
   Float_t phi, theta;         // Phi and theta spherical angles of the parent particle momentum
   Float_t p[3], pc[3], 
           och[3];             // Momentum, polarisation and origin of the children particles from lujet
-  Float_t ty, xmt;
+  Double_t ty, xmt;
   Int_t nt, i, j;
   Float_t  wgtp, wgtch;
   Double_t dummy;
   static TClonesArray *particles;
   //
   if(!particles) particles = new TClonesArray("TParticle",1000);
-
-  static TDatabasePDG *pDataBase = new TDatabasePDG();
-  if(!pDataBase) pDataBase = new TDatabasePDG();
+  
+  TDatabasePDG *pDataBase = TDatabasePDG::Instance();
   //
   Float_t random[6];
  
@@ -326,14 +257,14 @@ void AliGenParam::Generate()
          fChildWeight=(fDecayer->GetPartialBranchingRatio(iPart))*fParentWeight;          
          TParticlePDG *particle = pDataBase->GetParticle(iPart);
          Float_t am = particle->Mass();
-
+         
          Rndm(random,2);
 //
 // phi
          phi=fPhiMin+random[0]*(fPhiMax-fPhiMin);
 //
 // y
-         ty=Float_t(TMath::TanH(fYPara->GetRandom()));
+         ty = TMath::TanH(fYPara->GetRandom());
 //
 // pT
          if (fAnalog == kAnalog) {
@@ -347,7 +278,12 @@ void AliGenParam::Generate()
              wgtch=fChildWeight*fPtParaFunc(& ptd, &dummy);
          }
          xmt=sqrt(pt*pt+am*am);
-         if (TMath::Abs(ty)==1.) ty=0.;
+         if (TMath::Abs(ty)==1.) {
+             ty=0.;
+             Fatal("AliGenParam", 
+                   "Division by 0: Please check you rapidity range !");
+         }
+         
          pl=xmt*ty/sqrt(1.-ty*ty);
          theta=TMath::ATan2(pt,pl);
 // Cut on theta
@@ -384,6 +320,10 @@ void AliGenParam::Generate()
 //
 // select decay particles
              Int_t np=fDecayer->ImportParticles(particles);
+
+             //  Selecting  GeometryAcceptance for particles fPdgCodeParticleforAcceptanceCut;
+             if (fGeometryAcceptance) 
+               if (!CheckAcceptanceGeometry(np,particles)) continue;
              Int_t ncsel=0;
              Int_t* pFlag      = new Int_t[np];
              Int_t* pParent    = new Int_t[np];
@@ -416,11 +356,11 @@ void AliGenParam::Generate()
 // flag decay products of particles with long life-time (c tau > .3 mum)                     
                      
                      if (ks != 1) { 
-                         TParticlePDG *particle = pDataBase->GetParticle(kf);
+//                       TParticlePDG *particle = pDataBase->GetParticle(kf);
                          
                          Double_t lifeTime = fDecayer->GetLifetime(kf);
-                         Double_t mass     = particle->Mass();
-                         Double_t width    = particle->Width();
+//                       Double_t mass     = particle->Mass();
+//                       Double_t width    = particle->Width();
                          if (lifeTime > (Double_t) fMaxLifeTime) {
                              ipF = iparticle->GetFirstDaughter();
                              ipL = iparticle->GetLastDaughter();       
@@ -484,19 +424,20 @@ void AliGenParam::Generate()
                          } else {
                              iparent = -1;
                          }
+                        
                          SetTrack(fTrackIt*trackIt[i], iparent, kf,
                                           pc, och, polar,
                                           0, kPDecay, nt, wgtch);
                          pParent[i] = nt;
                          KeepTrack(nt); 
-                     }
-                 }
+                     } // Selected
+                 } // Particle loop 
              }  // Decays by Lujet
-
+             particles->Clear();
              if (pFlag)      delete[] pFlag;
              if (pParent)    delete[] pParent;
              if (pSelected)  delete[] pSelected;          
-             if (trackIt)    delete[] trackIt;     
+             if (trackIt)    delete[] trackIt;
          } // kinematic selection
          else  // nodecay option, so parent will be tracked by GEANT (pions, kaons, eta, omegas, baryons)
          {
@@ -510,6 +451,21 @@ void AliGenParam::Generate()
   SetHighWaterMark(nt);
 }
 
+void AliGenParam::Draw()
+{
+    //
+    // Draw the pT and y Distributions
+    //
+     TCanvas *c0 = new TCanvas("c0","Canvas 0",400,10,600,700);
+     c0->Divide(2,1);
+     c0->cd(1);
+     fPtPara->Draw();
+     fPtPara->GetHistogram()->SetXTitle("p_{T} (GeV)");     
+     c0->cd(2);
+     fYPara->Draw();
+     fYPara->GetHistogram()->SetXTitle("y");     
+}
+
 AliGenParam& AliGenParam::operator=(const  AliGenParam& rhs)
 {
 // Assignment operator