]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVGEN/AliGenParam.cxx
Merging the VirtualMC branch to the main development branch (HEAD)
[u/mrichter/AliRoot.git] / EVGEN / AliGenParam.cxx
index 258ccfca52a0d0538a26058f0eb080508825bc5b..45d628b0363b5b670d67cbcfd7315043f4e9d0dd 100644 (file)
 
 /*
 $Log$
+Revision 1.36.6.3  2002/10/10 16:40:08  hristov
+Updating VirtualMC to v3-09-02
+
+Revision 1.39  2002/09/16 08:21:16  morsch
+Use TDatabasePDG::Instance();
+
+Revision 1.38  2002/05/30 14:59:12  morsch
+Check geometrical acceptance. (G. Martinez)
+
+Revision 1.37  2002/04/17 10:20:44  morsch
+Coding Rule violations corrected.
+
+Revision 1.36  2002/02/08 16:50:50  morsch
+Add name and title in constructor.
+
+Revision 1.35  2002/01/21 10:02:40  morsch
+ty is Double_t
+Abort if too high rapidity causes numerical paroblem. User has to specify
+meaningful y-range.
+
+Revision 1.34  2001/11/27 13:13:07  morsch
+Maximum lifetime for long-lived particles to be put on the stack is parameter.
+It can be set via SetMaximumLifetime(..).
+
 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
 
@@ -96,6 +120,14 @@ 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 "AliGenMUONlib.h"
@@ -131,11 +163,15 @@ AliGenParam::AliGenParam()
 // 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);
@@ -157,7 +193,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 +226,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 +249,10 @@ AliGenParam::AliGenParam(Int_t npart, Int_t param,
 }
 
 
-AliGenParam::AliGenParam(const AliGenParam & Paramd)
+AliGenParam::AliGenParam(const AliGenParam & Param)
 {
 // copy constructor
+    Param.Copy(*this);
 }
 
 //____________________________________________________________
@@ -295,16 +338,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 +368,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 +389,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 +431,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 +467,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 +535,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)
          {