ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id$ */

// 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 <TCanvas.h>
#include <TClonesArray.h>
#include <TDatabasePDG.h>
#include <TF1.h>
#include <TH1F.h>
#include <TLorentzVector.h>
#include <TMath.h>
#include <TParticle.h>
#include <TParticlePDG.h>
#include <TROOT.h>
#include <TVirtualMC.h>

#include "AliDecayer.h"
#include "AliGenMUONlib.h"
#include "AliGenParam.h"
#include "AliMC.h"
#include "AliRun.h"
#include "AliGenEventHeader.h"

ClassImp(AliGenParam)

//------------------------------------------------------------

//Begin_Html
/*
    <img src="picts/AliGenParam.gif">
*/
//End_Html

//____________________________________________________________
AliGenParam::AliGenParam()
: fPtParaFunc(0),
	fYParaFunc(0),
	fIpParaFunc(0),
  fV2ParaFunc(0),
	fPtPara(0),
	fYPara(0),
  fV2Para(0),
  fdNdPhi(0),
	fParam(0),
	fdNdy0(0.),
	fYWgt(0.),
	fPtWgt(0.),
	fBias(0.),
	fTrials(0),
	fDeltaPt(0.01),
	fSelectAll(kFALSE),
  fDecayer(0),
  fForceConv(kFALSE),
  fKeepParent(kFALSE),
  fKeepIfOneChildSelected(kFALSE)
{
  // Default constructor
}
//____________________________________________________________
AliGenParam::AliGenParam(Int_t npart, const AliGenLib * Library,  Int_t param, const char* tname)
    :AliGenMC(npart),
     fPtParaFunc(Library->GetPt(param, tname)),
     fYParaFunc (Library->GetY (param, tname)),
     fIpParaFunc(Library->GetIp(param, tname)),
   fV2ParaFunc(Library->GetV2(param, tname)),
     fPtPara(0),
     fYPara(0),
   fV2Para(0),
   fdNdPhi(0),
     fParam(param),
     fdNdy0(0.),
     fYWgt(0.),
     fPtWgt(0.),
     fBias(0.),
     fTrials(0),
     fDeltaPt(0.01),
     fSelectAll(kFALSE),
   fDecayer(0),
   fForceConv(kFALSE),
   fKeepParent(kFALSE),
   fKeepIfOneChildSelected(kFALSE)
{
  // Constructor using number of particles parameterisation id and library
    fName = "Param";
    fTitle= "Particle Generator using pT and y parameterisation";
    fAnalog = kAnalog;
    SetForceDecay();
}
//____________________________________________________________
AliGenParam::AliGenParam(Int_t npart, Int_t param, const char* tname, const char* name):
    AliGenMC(npart),
    fPtParaFunc(0),
    fYParaFunc (0),
    fIpParaFunc(0),
  fV2ParaFunc(0),
    fPtPara(0),
    fYPara(0),
  fV2Para(0),
  fdNdPhi(0),
    fParam(param),
    fdNdy0(0.),
    fYWgt(0.),
    fPtWgt(0.),
    fBias(0.),
    fTrials(0),
    fDeltaPt(0.01),
    fSelectAll(kFALSE),
  fDecayer(0),
  fForceConv(kFALSE),
  fKeepParent(kFALSE),
  fKeepIfOneChildSelected(kFALSE)
{
  // Constructor using parameterisation id and number of particles
  //
    fName = name;
    fTitle= "Particle Generator using pT and y parameterisation";
      
    AliGenLib* pLibrary = new AliGenMUONlib();
    fPtParaFunc = pLibrary->GetPt(param, tname);
    fYParaFunc  = pLibrary->GetY (param, tname);
    fIpParaFunc = pLibrary->GetIp(param, tname);
  fV2ParaFunc = pLibrary->GetV2(param, tname);
    
    fAnalog = kAnalog;
    fChildSelect.Set(5);
    for (Int_t i=0; i<5; i++) fChildSelect[i]=0;
    SetForceDecay();
    SetCutOnChild();
    SetChildMomentumRange();
    SetChildPtRange();
    SetChildPhiRange();
    SetChildThetaRange(); 
}
//____________________________________________________________

AliGenParam::AliGenParam(Int_t npart, Int_t param,
                         Double_t (*PtPara) (const Double_t*, const Double_t*),
                         Double_t (*YPara ) (const Double_t* ,const Double_t*),
                         Double_t (*V2Para) (const Double_t* ,const Double_t*),
		         Int_t    (*IpPara) (TRandom *))		 
    :AliGenMC(npart),
     
     fPtParaFunc(PtPara),
     fYParaFunc(YPara),
     fIpParaFunc(IpPara),
   fV2ParaFunc(V2Para),
     fPtPara(0),
     fYPara(0),
   fV2Para(0),
   fdNdPhi(0),
     fParam(param),
     fdNdy0(0.),
     fYWgt(0.),
     fPtWgt(0.),
     fBias(0.),
     fTrials(0),
     fDeltaPt(0.01),
     fSelectAll(kFALSE),
  fDecayer(0),
  fForceConv(kFALSE),
  fKeepParent(kFALSE),
  fKeepIfOneChildSelected(kFALSE)
{
  // Constructor
  // Gines Martinez 1/10/99 
    fName = "Param";
    fTitle= "Particle Generator using pT and y parameterisation";

    fAnalog = kAnalog;
    fChildSelect.Set(5);
    for (Int_t i=0; i<5; i++) fChildSelect[i]=0;
    SetForceDecay();
    SetCutOnChild();
    SetChildMomentumRange();
    SetChildPtRange();
    SetChildPhiRange();
    SetChildThetaRange();  
}

//____________________________________________________________
AliGenParam::~AliGenParam()
{
  // Destructor
    delete  fPtPara;
    delete  fYPara;
  delete  fV2Para;
  delete  fdNdPhi;
}

//-------------------------------------------------------------------
TVector3 AliGenParam::OrthogonalVector(TVector3 &inVec){
  double abc[]={inVec.x(), inVec.y(), inVec.z()}; 
  double xyz[]={1,1,1};
  int solvDim=0;
  double tmp=abc[0];
  for(int i=0; i<3; i++)
    if(fabs(abc[i])>tmp){
      solvDim=i;
      tmp=fabs(abc[i]);
    }
  xyz[solvDim]=(-abc[(1+solvDim)%3]-abc[(2+solvDim)%3])/abc[(0+solvDim)%3];
  
  TVector3 res(xyz[0],xyz[1],xyz[2]);
  return res;
}

void AliGenParam::RotateVector(Double_t *pin, Double_t *pout, Double_t costheta, Double_t sintheta,
    Double_t cosphi, Double_t sinphi)
{
  // Perform rotation
  pout[0] = pin[0]*costheta*cosphi-pin[1]*sinphi+pin[2]*sintheta*cosphi;
  pout[1] = pin[0]*costheta*sinphi+pin[1]*cosphi+pin[2]*sintheta*sinphi;
  pout[2] = -1.0  * pin[0] * sintheta + pin[2] * costheta;
  return;
}

double AliGenParam::ScreenFunction1(double screenVariable){
  if(screenVariable>1)
    return 42.24 - 8.368 * log(screenVariable + 0.952);
  else
    return 42.392 - screenVariable * (7.796 - 1.961 * screenVariable);
}

double AliGenParam::ScreenFunction2(double screenVariable){
  if(screenVariable>1)
    return 42.24 - 8.368 * log(screenVariable + 0.952);
  else
    return 41.405 - screenVariable * (5.828 - 0.8945 * screenVariable);
}

double AliGenParam::RandomEnergyFraction(double Z, double photonEnergy){
  double aZ=Z/137.036;
  double epsilon ;
  double epsilon0Local = 0.000511 / photonEnergy ;

  // Do it fast if photon energy < 2. MeV
  if (photonEnergy < 0.002 )
    {
      epsilon = epsilon0Local + (0.5 - epsilon0Local) * fRandom->Rndm();
    }
  else
    {
      double fZ = 8*log(Z)/3;
  double fcZ=(aZ*aZ)*(1/(1+aZ*aZ)+0.20206-0.0368*aZ*aZ+0.0083*aZ*aZ*aZ);
      if (photonEnergy > 0.050) fZ += 8*fcZ;
      
      // Limits of the screening variable
      double screenFactor = 136. * epsilon0Local / pow (Z,1/3);
      double screenMax = exp ((42.24 - fZ)/8.368) - 0.952 ;
      double screenMin = std::min(4.*screenFactor,screenMax) ;

      // Limits of the energy sampling
      double epsilon1 = 0.5 - 0.5 * sqrt(1. - screenMin / screenMax) ;
      double epsilonMin = std::max(epsilon0Local,epsilon1);
      double epsilonRange = 0.5 - epsilonMin ;

      // Sample the energy rate of the created electron (or positron)
      double screen;
      double gReject ;

      double f10 = ScreenFunction1(screenMin) - fZ;
      double f20 = ScreenFunction2(screenMin) - fZ;
      double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.);
      double normF2 = std::max(1.5 * f20,0.);

      do 
	{
	  if (normF1 / (normF1 + normF2) > fRandom->Rndm() )
	    {
	      epsilon = 0.5 - epsilonRange * pow(fRandom->Rndm(), 0.333333) ;
	      screen = screenFactor / (epsilon * (1. - epsilon));
	      gReject = (ScreenFunction1(screen) - fZ) / f10 ;
	    }
	  else
	    {
	      epsilon = epsilonMin + epsilonRange * fRandom->Rndm();
	      screen = screenFactor / (epsilon * (1 - epsilon));
	      gReject = (ScreenFunction2(screen) - fZ) / f20 ;
	    }
	} while ( gReject < fRandom->Rndm() );
    
    }   //  End of epsilon sampling
  return epsilon;
}

double AliGenParam::RandomPolarAngle(){
  double u;
  const double a1 = 0.625;
  double a2 = 3. * a1;
  //  double d = 27. ;

  //  if (9. / (9. + d) > fRandom->Rndm())
  if (0.25 > fRandom->Rndm())
    {
      u = - log(fRandom->Rndm() * fRandom->Rndm()) / a1 ;
    }
  else
    {
      u = - log(fRandom->Rndm() * fRandom->Rndm()) / a2 ;
    }
  return u*0.000511;
}
  
Double_t AliGenParam::RandomMass(Double_t mh){
  while(true){
    double y=fRandom->Rndm();
    double mee=2*0.000511*TMath::Power(2*0.000511/mh,-y); //inverse of the enveloping cumulative distribution
    double apxkw=2.0/3.0/137.036/TMath::Pi()/mee; //enveloping probability density
    double val=fRandom->Uniform(0,apxkw);
    double kw=apxkw*sqrt(1-4*0.000511*0.000511/mee/mee)*(1+2*0.000511*0.000511/mee/mee)*1*1*TMath::Power(1-mee*mee/mh/mh,3);
    if(val<kw)
      return mee;
  }
}

Int_t AliGenParam::VirtualGammaPairProduction(TClonesArray *particles, Int_t nPart)
{
  Int_t nPartNew=nPart;
  for(int iPart=0; iPart<nPart; iPart++){      
    TParticle *gamma = (TParticle *) particles->At(iPart);
    if(gamma->GetPdgCode()!=220000) continue;
    if(gamma->Pt()<0.002941) continue;  //approximation of kw in AliGenEMlib is 0 below 0.002941
    double mass=RandomMass(gamma->Pt());

    // lepton pair kinematics in virtual photon rest frame 
    double Ee=mass/2;
    double Pe=TMath::Sqrt((Ee+0.000511)*(Ee-0.000511));

    double costheta = (2.0 * gRandom->Rndm()) - 1.;
    double sintheta = TMath::Sqrt((1. + costheta) * (1. - costheta));
    double phi      = 2.0 * TMath::ACos(-1.) * gRandom->Rndm();
    double sinphi   = TMath::Sin(phi);
    double cosphi   = TMath::Cos(phi);
    
    // momentum vectors of leptons in virtual photon rest frame
    Double_t pProd1[3] = {Pe * sintheta * cosphi,
			  Pe * sintheta * sinphi,
			  Pe * costheta};

    Double_t pProd2[3] = {-1.0 * Pe * sintheta * cosphi,
			  -1.0 * Pe * sintheta * sinphi,
			  -1.0 * Pe * costheta}; 

    // lepton 4-vectors in properly rotated virtual photon rest frame
    Double_t pRot1[3] = {0.};
    RotateVector(pProd1, pRot1, costheta, -sintheta, -cosphi, -sinphi);
    Double_t pRot2[3] = {0.};
    RotateVector(pProd2, pRot2, costheta, -sintheta, -cosphi, -sinphi); 

    TLorentzVector e1V4(pRot1[0],pRot1[1],pRot1[2],Ee);
    TLorentzVector e2V4(pRot2[0],pRot2[1],pRot2[2],Ee);
  
    TVector3 boost(gamma->Px(),gamma->Py(),gamma->Pz());
    boost*=1/sqrt(gamma->P()*gamma->P()+mass*mass);
    e1V4.Boost(boost);
    e2V4.Boost(boost);

    TLorentzVector vtx;
    gamma->ProductionVertex(vtx);
    new((*particles)[nPartNew]) TParticle(11, gamma->GetStatusCode(), iPart+1, -1, 0, 0, e1V4, vtx);
    nPartNew++;
    new((*particles)[nPartNew]) TParticle(-11, gamma->GetStatusCode(), iPart+1, -1, 0, 0, e2V4, vtx);
    nPartNew++;
  }
  return nPartNew;
}

Int_t AliGenParam::ForceGammaConversion(TClonesArray *particles, Int_t nPart)
{
  //based on: http://geant4.cern.ch/G4UsersDocuments/UsersGuides/PhysicsReferenceManual/html/node27.html
  //     and: http://geant4.cern.ch/G4UsersDocuments/UsersGuides/PhysicsReferenceManual/html/node58.html
  //     and: G4LivermoreGammaConversionModel.cc
  Int_t nPartNew=nPart;
  for(int iPart=0; iPart<nPart; iPart++){      
    TParticle *gamma = (TParticle *) particles->At(iPart);
    if(gamma->GetPdgCode()!=22) continue;
    if(gamma->Energy()<0.001022) continue;
    TVector3 gammaV3(gamma->Px(),gamma->Py(),gamma->Pz());
    double frac=RandomEnergyFraction(1,gamma->Energy());
    double Ee1=frac*gamma->Energy();
    double Ee2=(1-frac)*gamma->Energy();
    double Pe1=sqrt((Ee1+0.000511)*(Ee1-0.000511));
    double Pe2=sqrt((Ee2+0.000511)*(Ee2-0.000511));
    
    TVector3 rotAxis(OrthogonalVector(gammaV3));
    Float_t az=fRandom->Uniform(TMath::Pi()*2);
    rotAxis.Rotate(az,gammaV3);
    TVector3 e1V3(gammaV3);
    double u=RandomPolarAngle();
    e1V3.Rotate(u/Ee1,rotAxis);
    e1V3=e1V3.Unit();
    e1V3*=Pe1;
    TVector3 e2V3(gammaV3);
    e2V3.Rotate(-u/Ee2,rotAxis);
    e2V3=e2V3.Unit();
    e2V3*=Pe2;
    // gamma = new TParticle(*gamma);
    // particles->RemoveAt(iPart);
    gamma->SetFirstDaughter(nPartNew+1);
    gamma->SetLastDaughter(nPartNew+2);
    // new((*particles)[iPart]) TParticle(*gamma);
    // delete gamma;

    TLorentzVector vtx;
    gamma->ProductionVertex(vtx);
    new((*particles)[nPartNew]) TParticle(11, gamma->GetStatusCode(), iPart+1, -1, 0, 0, TLorentzVector(e1V3,Ee1), vtx);
    nPartNew++;
    new((*particles)[nPartNew]) TParticle(-11, gamma->GetStatusCode(), iPart+1, -1, 0, 0, TLorentzVector(e2V3,Ee2), vtx);
    nPartNew++;
  }
  return nPartNew;
}

//____________________________________________________________
void AliGenParam::Init()
{
  // Initialisation

    if (TVirtualMC::GetMC()) fDecayer = TVirtualMC::GetMC()->GetDecayer();
  //Begin_Html
  /*
    <img src="picts/AliGenParam.gif">
  */
  //End_Html
    char name[256];
    snprintf(name, 256, "pt-parameterisation for %s", GetName());
    
    if (fPtPara) fPtPara->Delete();
    fPtPara = new TF1(name, fPtParaFunc, fPtMin, fPtMax,0);
    gROOT->GetListOfFunctions()->Remove(fPtPara);
  //  Set representation precision to 10 MeV
    Int_t npx= Int_t((fPtMax - fPtMin) / fDeltaPt);
    
    fPtPara->SetNpx(npx);

    snprintf(name, 256, "y-parameterisation  for %s", GetName());
    if (fYPara) fYPara->Delete();
    fYPara  = new TF1(name, fYParaFunc, fYMin, fYMax, 0);
    gROOT->GetListOfFunctions()->Remove(fYPara);

  snprintf(name, 256, "v2-parameterisation for %s", GetName());
  if (fV2Para) fV2Para->Delete();
  fV2Para  = new TF1(name, fV2ParaFunc, fPtMin, fPtMax, 0);
  // fV2Para  = new TF1(name, "2*[0]/(1+TMath::Exp([1]*([2]-x)))-[0]", fPtMin, fPtMax);
  // fV2Para->SetParameter(0, 0.236910);
  // fV2Para->SetParameter(1, 1.71122);
  // fV2Para->SetParameter(2, 0.0827617);
  //gROOT->GetListOfFunctions()->Remove(fV2Para);  //TR: necessary?
    
  snprintf(name, 256, "dNdPhi for %s", GetName());
  if (fdNdPhi) fdNdPhi->Delete();
  fdNdPhi  = new TF1(name, "1+2*[0]*TMath::Cos(2*(x-[1]))", fPhiMin, fPhiMax);
  //gROOT->GetListOfFunctions()->Remove(fdNdPhi);  //TR: necessary?
    
    snprintf(name, 256, "pt-for-%s", GetName());
    TF1 ptPara(name ,fPtParaFunc, 0, 15, 0);
    snprintf(name, 256, "y-for-%s", GetName());
    TF1 yPara(name, fYParaFunc, -6, 6, 0);

  //
  // dN/dy| y=0
    Double_t y1=0;
    Double_t y2=0;
    
    fdNdy0=fYParaFunc(&y1,&y2);
  //
  // Integral over generation region
#if ROOT_VERSION_CODE < ROOT_VERSION(5,99,0)
    Float_t intYS  = yPara.Integral(fYMin, fYMax,(Double_t*) 0x0,1.e-6);
    Float_t intPt0 = ptPara.Integral(0,15,(Double_t *) 0x0,1.e-6);
    Float_t intPtS = ptPara.Integral(fPtMin,fPtMax,(Double_t*) 0x0,1.e-6);
#else
    Float_t intYS  = yPara.Integral(fYMin, fYMax,1.e-6);
    Float_t intPt0 = ptPara.Integral(0,15,1.e-6);
    Float_t intPtS = ptPara.Integral(fPtMin,fPtMax,1.e-6);
#endif
  Float_t phiWgt=(fPhiMax-fPhiMin)/2./TMath::Pi();    //TR: should probably be done differently in case of anisotropic phi...
    if (fAnalog == kAnalog) {
	fYWgt  = intYS/fdNdy0;
	fPtWgt = intPtS/intPt0;
	fParentWeight = fYWgt*fPtWgt*phiWgt/fNpart;
    } else {
	fYWgt = intYS/fdNdy0;
	fPtWgt = (fPtMax-fPtMin)/intPt0;
	fParentWeight = fYWgt*fPtWgt*phiWgt/fNpart;
    }
  //
  // particle decay related initialization
    fDecayer->SetForceDecay(fForceDecay);
    fDecayer->Init();

  //
    AliGenMC::Init();
}

//____________________________________________________________
void AliGenParam::Generate()
{
  // 
  // Generate 1 event (see Generate(Int_t ntimes) for details
  //
  GenerateN(1);
}
//____________________________________________________________
void AliGenParam::GenerateN(Int_t ntimes)
{
  //
  // Generate ntimes*'npart' light and heavy mesons (J/Psi, upsilon or phi, Pion,
  // Kaons, Etas, Omegas) and Baryons (proton, antiprotons, neutrons and 
  // antineutrons in the the desired theta, phi and momentum windows; 
  // Gaussian smearing on the vertex is done if selected. 
  // The decay of heavy mesons is done using lujet, 
  //    and the childern particle are tracked by GEANT
  // However, light mesons are directly tracked by GEANT 
  // setting fForceDecay = nodecay (SetForceDecay(nodecay)) 
  //
  //
  //  Reinitialize decayer
  fDecayer->SetForceDecay(fForceDecay);
  fDecayer->Init();

  //
  Float_t polar[3]= {0,0,0};  // Polarisation of the parent particle (for GEANT tracking)
  Float_t origin0[3];         // Origin of the generated parent particle (for GEANT tracking)
  Float_t time0;              // Time0 of the generated parent particle
  Float_t pt, pl, ptot;       // Transverse, logitudinal and total momenta of the parent particle
  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
  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);
  
  TDatabasePDG *pDataBase = TDatabasePDG::Instance();
  //
  Float_t random[6];
 
  // Calculating vertex position per event
  for (j=0;j<3;j++) origin0[j]=fOrigin[j];
  time0 = fTimeOrigin;
  if(fVertexSmear==kPerEvent) {
      Vertex();
      for (j=0;j<3;j++) origin0[j]=fVertex[j];
      time0 = fTime;
  }
  
  Int_t ipa=0;
  
  // Generating fNpart particles
  fNprimaries = 0;
  
  Int_t nGen = fNpart*ntimes;
  while (ipa<nGen) {
      while(1) {
      //
      // particle type 
	  Int_t iPart = fIpParaFunc(fRandom);
      Int_t iTemp = iPart;

      // custom pdg codes for to destinguish direct photons
      if(iPart==220000) iPart=22;

	  fChildWeight=(fDecayer->GetPartialBranchingRatio(iPart))*fParentWeight;	   
	  TParticlePDG *particle = pDataBase->GetParticle(iPart);
	  Float_t am = particle->Mass();
	  
	  Rndm(random,2);
      //
      // y
	  ty = TMath::TanH(fYPara->GetRandom());

      //
      // pT
	  if (fAnalog == kAnalog) {
	      pt=fPtPara->GetRandom();
	      wgtp=fParentWeight;
	      wgtch=fChildWeight;
	  } else {
	      pt=fPtMin+random[1]*(fPtMax-fPtMin);
	      Double_t ptd=pt;
	      wgtp=fParentWeight*fPtParaFunc(& ptd, &dummy);
	      wgtch=fChildWeight*fPtParaFunc(& ptd, &dummy);
	  }
	  xmt=sqrt(pt*pt+am*am);
	  if (TMath::Abs(ty)==1.) {
	      ty=0.;
	      Fatal("AliGenParam", 
		    "Division by 0: Please check you rapidity range !");
	  }
      //
      // phi
	  //      if(!ipa)
	  //phi=fEvPlane; //align first particle of each event with event plane
	  //else{
	double v2 = fV2Para->Eval(pt);
	fdNdPhi->SetParameter(0,v2);
	fdNdPhi->SetParameter(1,fEvPlane);
	phi=fdNdPhi->GetRandom();
	//     }
	  
	  pl=xmt*ty/sqrt((1.-ty)*(1.+ty));
	  theta=TMath::ATan2(pt,pl);
      // Cut on theta
	  if(theta<fThetaMin || theta>fThetaMax) continue;
	  ptot=TMath::Sqrt(pt*pt+pl*pl);
      // Cut on momentum
	  if(ptot<fPMin || ptot>fPMax) continue;
      //
	  p[0]=pt*TMath::Cos(phi);
	  p[1]=pt*TMath::Sin(phi);
	  p[2]=pl;

	  if(fVertexSmear==kPerTrack) {
	      Rndm(random,6);
	      for (j=0;j<3;j++) {
		  origin0[j]=
		      fOrigin[j]+fOsigma[j]*TMath::Cos(2*random[2*j]*TMath::Pi())*
		      TMath::Sqrt(-2*TMath::Log(random[2*j+1]));
	      }
	      Rndm(random,2);
	      time0 = fTimeOrigin + fOsigma[2]/TMath::Ccgs()*
		TMath::Cos(2*random[0]*TMath::Pi())*
		TMath::Sqrt(-2*TMath::Log(random[1]));
	  }
	  
      // Looking at fForceDecay : 
      // if fForceDecay != none Primary particle decays using 
      // AliPythia and children are tracked by GEANT
      //
      // if fForceDecay == none Primary particle is tracked by GEANT 
      // (In the latest, make sure that GEANT actually does all the decays you want)	  
      //
	  Bool_t decayed = kFALSE;
	  

	  if (fForceDecay != kNoDecay) {
	// Using lujet to decay particle
	      Float_t energy=TMath::Sqrt(ptot*ptot+am*am);
	      TLorentzVector pmom(p[0], p[1], p[2], energy);
	      fDecayer->Decay(iPart,&pmom);
	//
	// select decay particles
	      Int_t np=fDecayer->ImportParticles(particles);

	iPart=iTemp;
	if(iPart==220000){
	  TParticle *gamma = (TParticle *)particles->At(0);
	  gamma->SetPdgCode(iPart);
	  np=VirtualGammaPairProduction(particles,np);
	}
	if(fForceConv) np=ForceGammaConversion(particles,np);

	      //  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];
	      Int_t* pSelected  = new Int_t[np];
	      Int_t* trackIt    = new Int_t[np];

	      for (i=0; i<np; i++) {
		  pFlag[i]     =  0;
		  pSelected[i] =  0;
		  pParent[i]   = -1;
	      }
	      
	      if (np >1) {
		  decayed = kTRUE;
		  TParticle* iparticle =  0;
		  Int_t ipF, ipL;
		  for (i = 1; i<np ; i++) {
		      trackIt[i] = 1;
		      iparticle = (TParticle *) particles->At(i);
		      Int_t kf = iparticle->GetPdgCode();
		      Int_t ks = iparticle->GetStatusCode();
	    // flagged particle

		      if (pFlag[i] == 1) {
			  ipF = iparticle->GetFirstDaughter();
			  ipL = iparticle->GetLastDaughter();	
			  if (ipF > 0) for (j=ipF-1; j<ipL; j++) pFlag[j]=1;
			  continue;
		      }

	    // flag decay products of particles with long life-time (c tau > .3 mum)		      
		      
		      if (ks != 1) { 
	      //			  TParticlePDG *particle = pDataBase->GetParticle(kf);
			  
			  Double_t lifeTime = fDecayer->GetLifetime(kf);
	      //			  Double_t mass     = particle->Mass();
	      //			  Double_t width    = particle->Width();
			  if (lifeTime > (Double_t) fMaxLifeTime) {
			      ipF = iparticle->GetFirstDaughter();
			      ipL = iparticle->GetLastDaughter();	
			      if (ipF > 0) for (j=ipF-1; j<ipL; j++) pFlag[j]=1;
			  } else{
			      trackIt[i]     = 0;
			      pSelected[i]   = 1;
			  }
		      } // ks==1 ?
	    //
	    // children
		      
		      if ((ChildSelected(TMath::Abs(kf)) || fForceDecay == kAll || fSelectAll) && trackIt[i])
		      {
			  if (fCutOnChild) {
			      pc[0]=iparticle->Px();
			      pc[1]=iparticle->Py();
			      pc[2]=iparticle->Pz();
			      Bool_t  childok = KinematicSelection(iparticle, 1);
			      if(childok) {
				  pSelected[i]  = 1;
				  ncsel++;
			      } else {
				  if(!fKeepIfOneChildSelected){
				    ncsel=-1;
				    break;
				  }
			      } // child kine cuts
			  } else {
			      pSelected[i]  = 1;
			      ncsel++;
			  } // if child selection
		      } // select muon
		  } // decay particle loop
	      } // if decay products
	      
	      Int_t iparent;
	      
	      if (fKeepParent || (fCutOnChild && ncsel >0) || !fCutOnChild){
	  //
	  // Parent
		  
		  
		  PushTrack(0, -1, iPart, p, origin0, polar, time0, kPPrimary, nt, wgtp, ((decayed)? 11 : 1));
		  pParent[0] = nt;
		  KeepTrack(nt); 
		  fNprimaries++;
		  
		  //but count is as "generated" particle" only if it produced child(s) within cut
	          if ((fCutOnChild && ncsel >0) || !fCutOnChild){
		    ipa++;
		  }
		  
	  //
	  // Decay Products
	  //		  
		  for (i = 1; i < np; i++) {
		      if (pSelected[i]) {
			  TParticle* iparticle = (TParticle *) particles->At(i);
			  Int_t kf   = iparticle->GetPdgCode();
			  Int_t ksc  = iparticle->GetStatusCode();
			  Int_t jpa  = iparticle->GetFirstMother()-1;
			  
			  och[0] = origin0[0]+iparticle->Vx();
			  och[1] = origin0[1]+iparticle->Vy();
			  och[2] = origin0[2]+iparticle->Vz();
			  pc[0]  = iparticle->Px();
			  pc[1]  = iparticle->Py();
			  pc[2]  = iparticle->Pz();
			  
			  if (jpa > -1) {
			      iparent = pParent[jpa];
			  } else {
			      iparent = -1;
			  }
			 
			  PushTrack(fTrackIt * trackIt[i], iparent, kf,
					   pc, och, polar,
				           time0 + iparticle->T(), kPDecay, nt, wgtch, ksc);
			  pParent[i] = nt;
			  KeepTrack(nt); 
			  fNprimaries++;
		      } // Selected
		  } // Particle loop 
	      }  // Decays by Lujet
	      particles->Clear();
	      if (pFlag)      delete[] pFlag;
	      if (pParent)    delete[] pParent;
	      if (pSelected)  delete[] pSelected;	   
	      if (trackIt)    delete[] trackIt;
	  } // kinematic selection
	  else  // nodecay option, so parent will be tracked by GEANT (pions, kaons, eta, omegas, baryons)
	  {
	    gAlice->GetMCApp()->
		PushTrack(fTrackIt,-1,iPart,p,origin0,polar,time0,kPPrimary,nt,wgtp, 1);
            ipa++; 
	    fNprimaries++;
	  }
	  break;
    } // while
  } // event loop
  
  SetHighWaterMark(nt);

  AliGenEventHeader* header = new AliGenEventHeader("PARAM");
  header->SetPrimaryVertex(fVertex);
  header->SetInteractionTime(fTime);
  header->SetNProduced(fNprimaries);
  AddHeader(header);
}
//____________________________________________________________________________________
Float_t AliGenParam::GetRelativeArea(Float_t ptMin, Float_t ptMax, Float_t yMin, Float_t yMax, Float_t phiMin, Float_t phiMax)
{
  //
  // Normalisation for selected kinematic region
  //
#if ROOT_VERSION_CODE < ROOT_VERSION(5,99,0)
  Float_t ratio =  
    fPtPara->Integral(ptMin,ptMax,(Double_t *)0,1.e-6) / fPtPara->Integral( fPtPara->GetXmin(), fPtPara->GetXmax(),(Double_t *)0,1.e-6) *
    fYPara->Integral(yMin,yMax,(Double_t *)0,1.e-6)/fYPara->Integral(fYPara->GetXmin(),fYPara->GetXmax(),(Double_t *)0,1.e-6)   *
    (phiMax-phiMin)/360.;
#else
  Float_t ratio =  
    fPtPara->Integral(ptMin,ptMax,1.e-6) / fPtPara->Integral( fPtPara->GetXmin(), fPtPara->GetXmax(),1.e-6) *
    fYPara->Integral(yMin,yMax,1.e-6)/fYPara->Integral(fYPara->GetXmin(),fYPara->GetXmax(),1.e-6)   *
    (phiMax-phiMin)/360.;
#endif
  return TMath::Abs(ratio);
}

//____________________________________________________________________________________

void AliGenParam::Draw( const char * /*opt*/)
{
    //
    // 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.cxx:1
 AliGenParam.cxx:2
 AliGenParam.cxx:3
 AliGenParam.cxx:4
 AliGenParam.cxx:5
 AliGenParam.cxx:6
 AliGenParam.cxx:7
 AliGenParam.cxx:8
 AliGenParam.cxx:9
 AliGenParam.cxx:10
 AliGenParam.cxx:11
 AliGenParam.cxx:12
 AliGenParam.cxx:13
 AliGenParam.cxx:14
 AliGenParam.cxx:15
 AliGenParam.cxx:16
 AliGenParam.cxx:17
 AliGenParam.cxx:18
 AliGenParam.cxx:19
 AliGenParam.cxx:20
 AliGenParam.cxx:21
 AliGenParam.cxx:22
 AliGenParam.cxx:23
 AliGenParam.cxx:24
 AliGenParam.cxx:25
 AliGenParam.cxx:26
 AliGenParam.cxx:27
 AliGenParam.cxx:28
 AliGenParam.cxx:29
 AliGenParam.cxx:30
 AliGenParam.cxx:31
 AliGenParam.cxx:32
 AliGenParam.cxx:33
 AliGenParam.cxx:34
 AliGenParam.cxx:35
 AliGenParam.cxx:36
 AliGenParam.cxx:37
 AliGenParam.cxx:38
 AliGenParam.cxx:39
 AliGenParam.cxx:40
 AliGenParam.cxx:41
 AliGenParam.cxx:42
 AliGenParam.cxx:43
 AliGenParam.cxx:44
 AliGenParam.cxx:45
 AliGenParam.cxx:46
 AliGenParam.cxx:47
 AliGenParam.cxx:48
 AliGenParam.cxx:49
 AliGenParam.cxx:50
 AliGenParam.cxx:51
 AliGenParam.cxx:52
 AliGenParam.cxx:53
 AliGenParam.cxx:54
 AliGenParam.cxx:55
 AliGenParam.cxx:56
 AliGenParam.cxx:57
 AliGenParam.cxx:58
 AliGenParam.cxx:59
 AliGenParam.cxx:60
 AliGenParam.cxx:61
 AliGenParam.cxx:62
 AliGenParam.cxx:63
 AliGenParam.cxx:64
 AliGenParam.cxx:65
 AliGenParam.cxx:66
 AliGenParam.cxx:67
 AliGenParam.cxx:68
 AliGenParam.cxx:69
 AliGenParam.cxx:70
 AliGenParam.cxx:71
 AliGenParam.cxx:72
 AliGenParam.cxx:73
 AliGenParam.cxx:74
 AliGenParam.cxx:75
 AliGenParam.cxx:76
 AliGenParam.cxx:77
 AliGenParam.cxx:78
 AliGenParam.cxx:79
 AliGenParam.cxx:80
 AliGenParam.cxx:81
 AliGenParam.cxx:82
 AliGenParam.cxx:83
 AliGenParam.cxx:84
 AliGenParam.cxx:85
 AliGenParam.cxx:86
 AliGenParam.cxx:87
 AliGenParam.cxx:88
 AliGenParam.cxx:89
 AliGenParam.cxx:90
 AliGenParam.cxx:91
 AliGenParam.cxx:92
 AliGenParam.cxx:93
 AliGenParam.cxx:94
 AliGenParam.cxx:95
 AliGenParam.cxx:96
 AliGenParam.cxx:97
 AliGenParam.cxx:98
 AliGenParam.cxx:99
 AliGenParam.cxx:100
 AliGenParam.cxx:101
 AliGenParam.cxx:102
 AliGenParam.cxx:103
 AliGenParam.cxx:104
 AliGenParam.cxx:105
 AliGenParam.cxx:106
 AliGenParam.cxx:107
 AliGenParam.cxx:108
 AliGenParam.cxx:109
 AliGenParam.cxx:110
 AliGenParam.cxx:111
 AliGenParam.cxx:112
 AliGenParam.cxx:113
 AliGenParam.cxx:114
 AliGenParam.cxx:115
 AliGenParam.cxx:116
 AliGenParam.cxx:117
 AliGenParam.cxx:118
 AliGenParam.cxx:119
 AliGenParam.cxx:120
 AliGenParam.cxx:121
 AliGenParam.cxx:122
 AliGenParam.cxx:123
 AliGenParam.cxx:124
 AliGenParam.cxx:125
 AliGenParam.cxx:126
 AliGenParam.cxx:127
 AliGenParam.cxx:128
 AliGenParam.cxx:129
 AliGenParam.cxx:130
 AliGenParam.cxx:131
 AliGenParam.cxx:132
 AliGenParam.cxx:133
 AliGenParam.cxx:134
 AliGenParam.cxx:135
 AliGenParam.cxx:136
 AliGenParam.cxx:137
 AliGenParam.cxx:138
 AliGenParam.cxx:139
 AliGenParam.cxx:140
 AliGenParam.cxx:141
 AliGenParam.cxx:142
 AliGenParam.cxx:143
 AliGenParam.cxx:144
 AliGenParam.cxx:145
 AliGenParam.cxx:146
 AliGenParam.cxx:147
 AliGenParam.cxx:148
 AliGenParam.cxx:149
 AliGenParam.cxx:150
 AliGenParam.cxx:151
 AliGenParam.cxx:152
 AliGenParam.cxx:153
 AliGenParam.cxx:154
 AliGenParam.cxx:155
 AliGenParam.cxx:156
 AliGenParam.cxx:157
 AliGenParam.cxx:158
 AliGenParam.cxx:159
 AliGenParam.cxx:160
 AliGenParam.cxx:161
 AliGenParam.cxx:162
 AliGenParam.cxx:163
 AliGenParam.cxx:164
 AliGenParam.cxx:165
 AliGenParam.cxx:166
 AliGenParam.cxx:167
 AliGenParam.cxx:168
 AliGenParam.cxx:169
 AliGenParam.cxx:170
 AliGenParam.cxx:171
 AliGenParam.cxx:172
 AliGenParam.cxx:173
 AliGenParam.cxx:174
 AliGenParam.cxx:175
 AliGenParam.cxx:176
 AliGenParam.cxx:177
 AliGenParam.cxx:178
 AliGenParam.cxx:179
 AliGenParam.cxx:180
 AliGenParam.cxx:181
 AliGenParam.cxx:182
 AliGenParam.cxx:183
 AliGenParam.cxx:184
 AliGenParam.cxx:185
 AliGenParam.cxx:186
 AliGenParam.cxx:187
 AliGenParam.cxx:188
 AliGenParam.cxx:189
 AliGenParam.cxx:190
 AliGenParam.cxx:191
 AliGenParam.cxx:192
 AliGenParam.cxx:193
 AliGenParam.cxx:194
 AliGenParam.cxx:195
 AliGenParam.cxx:196
 AliGenParam.cxx:197
 AliGenParam.cxx:198
 AliGenParam.cxx:199
 AliGenParam.cxx:200
 AliGenParam.cxx:201
 AliGenParam.cxx:202
 AliGenParam.cxx:203
 AliGenParam.cxx:204
 AliGenParam.cxx:205
 AliGenParam.cxx:206
 AliGenParam.cxx:207
 AliGenParam.cxx:208
 AliGenParam.cxx:209
 AliGenParam.cxx:210
 AliGenParam.cxx:211
 AliGenParam.cxx:212
 AliGenParam.cxx:213
 AliGenParam.cxx:214
 AliGenParam.cxx:215
 AliGenParam.cxx:216
 AliGenParam.cxx:217
 AliGenParam.cxx:218
 AliGenParam.cxx:219
 AliGenParam.cxx:220
 AliGenParam.cxx:221
 AliGenParam.cxx:222
 AliGenParam.cxx:223
 AliGenParam.cxx:224
 AliGenParam.cxx:225
 AliGenParam.cxx:226
 AliGenParam.cxx:227
 AliGenParam.cxx:228
 AliGenParam.cxx:229
 AliGenParam.cxx:230
 AliGenParam.cxx:231
 AliGenParam.cxx:232
 AliGenParam.cxx:233
 AliGenParam.cxx:234
 AliGenParam.cxx:235
 AliGenParam.cxx:236
 AliGenParam.cxx:237
 AliGenParam.cxx:238
 AliGenParam.cxx:239
 AliGenParam.cxx:240
 AliGenParam.cxx:241
 AliGenParam.cxx:242
 AliGenParam.cxx:243
 AliGenParam.cxx:244
 AliGenParam.cxx:245
 AliGenParam.cxx:246
 AliGenParam.cxx:247
 AliGenParam.cxx:248
 AliGenParam.cxx:249
 AliGenParam.cxx:250
 AliGenParam.cxx:251
 AliGenParam.cxx:252
 AliGenParam.cxx:253
 AliGenParam.cxx:254
 AliGenParam.cxx:255
 AliGenParam.cxx:256
 AliGenParam.cxx:257
 AliGenParam.cxx:258
 AliGenParam.cxx:259
 AliGenParam.cxx:260
 AliGenParam.cxx:261
 AliGenParam.cxx:262
 AliGenParam.cxx:263
 AliGenParam.cxx:264
 AliGenParam.cxx:265
 AliGenParam.cxx:266
 AliGenParam.cxx:267
 AliGenParam.cxx:268
 AliGenParam.cxx:269
 AliGenParam.cxx:270
 AliGenParam.cxx:271
 AliGenParam.cxx:272
 AliGenParam.cxx:273
 AliGenParam.cxx:274
 AliGenParam.cxx:275
 AliGenParam.cxx:276
 AliGenParam.cxx:277
 AliGenParam.cxx:278
 AliGenParam.cxx:279
 AliGenParam.cxx:280
 AliGenParam.cxx:281
 AliGenParam.cxx:282
 AliGenParam.cxx:283
 AliGenParam.cxx:284
 AliGenParam.cxx:285
 AliGenParam.cxx:286
 AliGenParam.cxx:287
 AliGenParam.cxx:288
 AliGenParam.cxx:289
 AliGenParam.cxx:290
 AliGenParam.cxx:291
 AliGenParam.cxx:292
 AliGenParam.cxx:293
 AliGenParam.cxx:294
 AliGenParam.cxx:295
 AliGenParam.cxx:296
 AliGenParam.cxx:297
 AliGenParam.cxx:298
 AliGenParam.cxx:299
 AliGenParam.cxx:300
 AliGenParam.cxx:301
 AliGenParam.cxx:302
 AliGenParam.cxx:303
 AliGenParam.cxx:304
 AliGenParam.cxx:305
 AliGenParam.cxx:306
 AliGenParam.cxx:307
 AliGenParam.cxx:308
 AliGenParam.cxx:309
 AliGenParam.cxx:310
 AliGenParam.cxx:311
 AliGenParam.cxx:312
 AliGenParam.cxx:313
 AliGenParam.cxx:314
 AliGenParam.cxx:315
 AliGenParam.cxx:316
 AliGenParam.cxx:317
 AliGenParam.cxx:318
 AliGenParam.cxx:319
 AliGenParam.cxx:320
 AliGenParam.cxx:321
 AliGenParam.cxx:322
 AliGenParam.cxx:323
 AliGenParam.cxx:324
 AliGenParam.cxx:325
 AliGenParam.cxx:326
 AliGenParam.cxx:327
 AliGenParam.cxx:328
 AliGenParam.cxx:329
 AliGenParam.cxx:330
 AliGenParam.cxx:331
 AliGenParam.cxx:332
 AliGenParam.cxx:333
 AliGenParam.cxx:334
 AliGenParam.cxx:335
 AliGenParam.cxx:336
 AliGenParam.cxx:337
 AliGenParam.cxx:338
 AliGenParam.cxx:339
 AliGenParam.cxx:340
 AliGenParam.cxx:341
 AliGenParam.cxx:342
 AliGenParam.cxx:343
 AliGenParam.cxx:344
 AliGenParam.cxx:345
 AliGenParam.cxx:346
 AliGenParam.cxx:347
 AliGenParam.cxx:348
 AliGenParam.cxx:349
 AliGenParam.cxx:350
 AliGenParam.cxx:351
 AliGenParam.cxx:352
 AliGenParam.cxx:353
 AliGenParam.cxx:354
 AliGenParam.cxx:355
 AliGenParam.cxx:356
 AliGenParam.cxx:357
 AliGenParam.cxx:358
 AliGenParam.cxx:359
 AliGenParam.cxx:360
 AliGenParam.cxx:361
 AliGenParam.cxx:362
 AliGenParam.cxx:363
 AliGenParam.cxx:364
 AliGenParam.cxx:365
 AliGenParam.cxx:366
 AliGenParam.cxx:367
 AliGenParam.cxx:368
 AliGenParam.cxx:369
 AliGenParam.cxx:370
 AliGenParam.cxx:371
 AliGenParam.cxx:372
 AliGenParam.cxx:373
 AliGenParam.cxx:374
 AliGenParam.cxx:375
 AliGenParam.cxx:376
 AliGenParam.cxx:377
 AliGenParam.cxx:378
 AliGenParam.cxx:379
 AliGenParam.cxx:380
 AliGenParam.cxx:381
 AliGenParam.cxx:382
 AliGenParam.cxx:383
 AliGenParam.cxx:384
 AliGenParam.cxx:385
 AliGenParam.cxx:386
 AliGenParam.cxx:387
 AliGenParam.cxx:388
 AliGenParam.cxx:389
 AliGenParam.cxx:390
 AliGenParam.cxx:391
 AliGenParam.cxx:392
 AliGenParam.cxx:393
 AliGenParam.cxx:394
 AliGenParam.cxx:395
 AliGenParam.cxx:396
 AliGenParam.cxx:397
 AliGenParam.cxx:398
 AliGenParam.cxx:399
 AliGenParam.cxx:400
 AliGenParam.cxx:401
 AliGenParam.cxx:402
 AliGenParam.cxx:403
 AliGenParam.cxx:404
 AliGenParam.cxx:405
 AliGenParam.cxx:406
 AliGenParam.cxx:407
 AliGenParam.cxx:408
 AliGenParam.cxx:409
 AliGenParam.cxx:410
 AliGenParam.cxx:411
 AliGenParam.cxx:412
 AliGenParam.cxx:413
 AliGenParam.cxx:414
 AliGenParam.cxx:415
 AliGenParam.cxx:416
 AliGenParam.cxx:417
 AliGenParam.cxx:418
 AliGenParam.cxx:419
 AliGenParam.cxx:420
 AliGenParam.cxx:421
 AliGenParam.cxx:422
 AliGenParam.cxx:423
 AliGenParam.cxx:424
 AliGenParam.cxx:425
 AliGenParam.cxx:426
 AliGenParam.cxx:427
 AliGenParam.cxx:428
 AliGenParam.cxx:429
 AliGenParam.cxx:430
 AliGenParam.cxx:431
 AliGenParam.cxx:432
 AliGenParam.cxx:433
 AliGenParam.cxx:434
 AliGenParam.cxx:435
 AliGenParam.cxx:436
 AliGenParam.cxx:437
 AliGenParam.cxx:438
 AliGenParam.cxx:439
 AliGenParam.cxx:440
 AliGenParam.cxx:441
 AliGenParam.cxx:442
 AliGenParam.cxx:443
 AliGenParam.cxx:444
 AliGenParam.cxx:445
 AliGenParam.cxx:446
 AliGenParam.cxx:447
 AliGenParam.cxx:448
 AliGenParam.cxx:449
 AliGenParam.cxx:450
 AliGenParam.cxx:451
 AliGenParam.cxx:452
 AliGenParam.cxx:453
 AliGenParam.cxx:454
 AliGenParam.cxx:455
 AliGenParam.cxx:456
 AliGenParam.cxx:457
 AliGenParam.cxx:458
 AliGenParam.cxx:459
 AliGenParam.cxx:460
 AliGenParam.cxx:461
 AliGenParam.cxx:462
 AliGenParam.cxx:463
 AliGenParam.cxx:464
 AliGenParam.cxx:465
 AliGenParam.cxx:466
 AliGenParam.cxx:467
 AliGenParam.cxx:468
 AliGenParam.cxx:469
 AliGenParam.cxx:470
 AliGenParam.cxx:471
 AliGenParam.cxx:472
 AliGenParam.cxx:473
 AliGenParam.cxx:474
 AliGenParam.cxx:475
 AliGenParam.cxx:476
 AliGenParam.cxx:477
 AliGenParam.cxx:478
 AliGenParam.cxx:479
 AliGenParam.cxx:480
 AliGenParam.cxx:481
 AliGenParam.cxx:482
 AliGenParam.cxx:483
 AliGenParam.cxx:484
 AliGenParam.cxx:485
 AliGenParam.cxx:486
 AliGenParam.cxx:487
 AliGenParam.cxx:488
 AliGenParam.cxx:489
 AliGenParam.cxx:490
 AliGenParam.cxx:491
 AliGenParam.cxx:492
 AliGenParam.cxx:493
 AliGenParam.cxx:494
 AliGenParam.cxx:495
 AliGenParam.cxx:496
 AliGenParam.cxx:497
 AliGenParam.cxx:498
 AliGenParam.cxx:499
 AliGenParam.cxx:500
 AliGenParam.cxx:501
 AliGenParam.cxx:502
 AliGenParam.cxx:503
 AliGenParam.cxx:504
 AliGenParam.cxx:505
 AliGenParam.cxx:506
 AliGenParam.cxx:507
 AliGenParam.cxx:508
 AliGenParam.cxx:509
 AliGenParam.cxx:510
 AliGenParam.cxx:511
 AliGenParam.cxx:512
 AliGenParam.cxx:513
 AliGenParam.cxx:514
 AliGenParam.cxx:515
 AliGenParam.cxx:516
 AliGenParam.cxx:517
 AliGenParam.cxx:518
 AliGenParam.cxx:519
 AliGenParam.cxx:520
 AliGenParam.cxx:521
 AliGenParam.cxx:522
 AliGenParam.cxx:523
 AliGenParam.cxx:524
 AliGenParam.cxx:525
 AliGenParam.cxx:526
 AliGenParam.cxx:527
 AliGenParam.cxx:528
 AliGenParam.cxx:529
 AliGenParam.cxx:530
 AliGenParam.cxx:531
 AliGenParam.cxx:532
 AliGenParam.cxx:533
 AliGenParam.cxx:534
 AliGenParam.cxx:535
 AliGenParam.cxx:536
 AliGenParam.cxx:537
 AliGenParam.cxx:538
 AliGenParam.cxx:539
 AliGenParam.cxx:540
 AliGenParam.cxx:541
 AliGenParam.cxx:542
 AliGenParam.cxx:543
 AliGenParam.cxx:544
 AliGenParam.cxx:545
 AliGenParam.cxx:546
 AliGenParam.cxx:547
 AliGenParam.cxx:548
 AliGenParam.cxx:549
 AliGenParam.cxx:550
 AliGenParam.cxx:551
 AliGenParam.cxx:552
 AliGenParam.cxx:553
 AliGenParam.cxx:554
 AliGenParam.cxx:555
 AliGenParam.cxx:556
 AliGenParam.cxx:557
 AliGenParam.cxx:558
 AliGenParam.cxx:559
 AliGenParam.cxx:560
 AliGenParam.cxx:561
 AliGenParam.cxx:562
 AliGenParam.cxx:563
 AliGenParam.cxx:564
 AliGenParam.cxx:565
 AliGenParam.cxx:566
 AliGenParam.cxx:567
 AliGenParam.cxx:568
 AliGenParam.cxx:569
 AliGenParam.cxx:570
 AliGenParam.cxx:571
 AliGenParam.cxx:572
 AliGenParam.cxx:573
 AliGenParam.cxx:574
 AliGenParam.cxx:575
 AliGenParam.cxx:576
 AliGenParam.cxx:577
 AliGenParam.cxx:578
 AliGenParam.cxx:579
 AliGenParam.cxx:580
 AliGenParam.cxx:581
 AliGenParam.cxx:582
 AliGenParam.cxx:583
 AliGenParam.cxx:584
 AliGenParam.cxx:585
 AliGenParam.cxx:586
 AliGenParam.cxx:587
 AliGenParam.cxx:588
 AliGenParam.cxx:589
 AliGenParam.cxx:590
 AliGenParam.cxx:591
 AliGenParam.cxx:592
 AliGenParam.cxx:593
 AliGenParam.cxx:594
 AliGenParam.cxx:595
 AliGenParam.cxx:596
 AliGenParam.cxx:597
 AliGenParam.cxx:598
 AliGenParam.cxx:599
 AliGenParam.cxx:600
 AliGenParam.cxx:601
 AliGenParam.cxx:602
 AliGenParam.cxx:603
 AliGenParam.cxx:604
 AliGenParam.cxx:605
 AliGenParam.cxx:606
 AliGenParam.cxx:607
 AliGenParam.cxx:608
 AliGenParam.cxx:609
 AliGenParam.cxx:610
 AliGenParam.cxx:611
 AliGenParam.cxx:612
 AliGenParam.cxx:613
 AliGenParam.cxx:614
 AliGenParam.cxx:615
 AliGenParam.cxx:616
 AliGenParam.cxx:617
 AliGenParam.cxx:618
 AliGenParam.cxx:619
 AliGenParam.cxx:620
 AliGenParam.cxx:621
 AliGenParam.cxx:622
 AliGenParam.cxx:623
 AliGenParam.cxx:624
 AliGenParam.cxx:625
 AliGenParam.cxx:626
 AliGenParam.cxx:627
 AliGenParam.cxx:628
 AliGenParam.cxx:629
 AliGenParam.cxx:630
 AliGenParam.cxx:631
 AliGenParam.cxx:632
 AliGenParam.cxx:633
 AliGenParam.cxx:634
 AliGenParam.cxx:635
 AliGenParam.cxx:636
 AliGenParam.cxx:637
 AliGenParam.cxx:638
 AliGenParam.cxx:639
 AliGenParam.cxx:640
 AliGenParam.cxx:641
 AliGenParam.cxx:642
 AliGenParam.cxx:643
 AliGenParam.cxx:644
 AliGenParam.cxx:645
 AliGenParam.cxx:646
 AliGenParam.cxx:647
 AliGenParam.cxx:648
 AliGenParam.cxx:649
 AliGenParam.cxx:650
 AliGenParam.cxx:651
 AliGenParam.cxx:652
 AliGenParam.cxx:653
 AliGenParam.cxx:654
 AliGenParam.cxx:655
 AliGenParam.cxx:656
 AliGenParam.cxx:657
 AliGenParam.cxx:658
 AliGenParam.cxx:659
 AliGenParam.cxx:660
 AliGenParam.cxx:661
 AliGenParam.cxx:662
 AliGenParam.cxx:663
 AliGenParam.cxx:664
 AliGenParam.cxx:665
 AliGenParam.cxx:666
 AliGenParam.cxx:667
 AliGenParam.cxx:668
 AliGenParam.cxx:669
 AliGenParam.cxx:670
 AliGenParam.cxx:671
 AliGenParam.cxx:672
 AliGenParam.cxx:673
 AliGenParam.cxx:674
 AliGenParam.cxx:675
 AliGenParam.cxx:676
 AliGenParam.cxx:677
 AliGenParam.cxx:678
 AliGenParam.cxx:679
 AliGenParam.cxx:680
 AliGenParam.cxx:681
 AliGenParam.cxx:682
 AliGenParam.cxx:683
 AliGenParam.cxx:684
 AliGenParam.cxx:685
 AliGenParam.cxx:686
 AliGenParam.cxx:687
 AliGenParam.cxx:688
 AliGenParam.cxx:689
 AliGenParam.cxx:690
 AliGenParam.cxx:691
 AliGenParam.cxx:692
 AliGenParam.cxx:693
 AliGenParam.cxx:694
 AliGenParam.cxx:695
 AliGenParam.cxx:696
 AliGenParam.cxx:697
 AliGenParam.cxx:698
 AliGenParam.cxx:699
 AliGenParam.cxx:700
 AliGenParam.cxx:701
 AliGenParam.cxx:702
 AliGenParam.cxx:703
 AliGenParam.cxx:704
 AliGenParam.cxx:705
 AliGenParam.cxx:706
 AliGenParam.cxx:707
 AliGenParam.cxx:708
 AliGenParam.cxx:709
 AliGenParam.cxx:710
 AliGenParam.cxx:711
 AliGenParam.cxx:712
 AliGenParam.cxx:713
 AliGenParam.cxx:714
 AliGenParam.cxx:715
 AliGenParam.cxx:716
 AliGenParam.cxx:717
 AliGenParam.cxx:718
 AliGenParam.cxx:719
 AliGenParam.cxx:720
 AliGenParam.cxx:721
 AliGenParam.cxx:722
 AliGenParam.cxx:723
 AliGenParam.cxx:724
 AliGenParam.cxx:725
 AliGenParam.cxx:726
 AliGenParam.cxx:727
 AliGenParam.cxx:728
 AliGenParam.cxx:729
 AliGenParam.cxx:730
 AliGenParam.cxx:731
 AliGenParam.cxx:732
 AliGenParam.cxx:733
 AliGenParam.cxx:734
 AliGenParam.cxx:735
 AliGenParam.cxx:736
 AliGenParam.cxx:737
 AliGenParam.cxx:738
 AliGenParam.cxx:739
 AliGenParam.cxx:740
 AliGenParam.cxx:741
 AliGenParam.cxx:742
 AliGenParam.cxx:743
 AliGenParam.cxx:744
 AliGenParam.cxx:745
 AliGenParam.cxx:746
 AliGenParam.cxx:747
 AliGenParam.cxx:748
 AliGenParam.cxx:749
 AliGenParam.cxx:750
 AliGenParam.cxx:751
 AliGenParam.cxx:752
 AliGenParam.cxx:753
 AliGenParam.cxx:754
 AliGenParam.cxx:755
 AliGenParam.cxx:756
 AliGenParam.cxx:757
 AliGenParam.cxx:758
 AliGenParam.cxx:759
 AliGenParam.cxx:760
 AliGenParam.cxx:761
 AliGenParam.cxx:762
 AliGenParam.cxx:763
 AliGenParam.cxx:764
 AliGenParam.cxx:765
 AliGenParam.cxx:766
 AliGenParam.cxx:767
 AliGenParam.cxx:768
 AliGenParam.cxx:769
 AliGenParam.cxx:770
 AliGenParam.cxx:771
 AliGenParam.cxx:772
 AliGenParam.cxx:773
 AliGenParam.cxx:774
 AliGenParam.cxx:775
 AliGenParam.cxx:776
 AliGenParam.cxx:777
 AliGenParam.cxx:778
 AliGenParam.cxx:779
 AliGenParam.cxx:780
 AliGenParam.cxx:781
 AliGenParam.cxx:782
 AliGenParam.cxx:783
 AliGenParam.cxx:784
 AliGenParam.cxx:785
 AliGenParam.cxx:786
 AliGenParam.cxx:787
 AliGenParam.cxx:788
 AliGenParam.cxx:789
 AliGenParam.cxx:790
 AliGenParam.cxx:791
 AliGenParam.cxx:792
 AliGenParam.cxx:793
 AliGenParam.cxx:794
 AliGenParam.cxx:795
 AliGenParam.cxx:796
 AliGenParam.cxx:797
 AliGenParam.cxx:798
 AliGenParam.cxx:799
 AliGenParam.cxx:800
 AliGenParam.cxx:801
 AliGenParam.cxx:802
 AliGenParam.cxx:803
 AliGenParam.cxx:804
 AliGenParam.cxx:805
 AliGenParam.cxx:806
 AliGenParam.cxx:807
 AliGenParam.cxx:808
 AliGenParam.cxx:809
 AliGenParam.cxx:810
 AliGenParam.cxx:811
 AliGenParam.cxx:812
 AliGenParam.cxx:813
 AliGenParam.cxx:814
 AliGenParam.cxx:815
 AliGenParam.cxx:816
 AliGenParam.cxx:817
 AliGenParam.cxx:818
 AliGenParam.cxx:819
 AliGenParam.cxx:820
 AliGenParam.cxx:821
 AliGenParam.cxx:822
 AliGenParam.cxx:823
 AliGenParam.cxx:824
 AliGenParam.cxx:825
 AliGenParam.cxx:826
 AliGenParam.cxx:827
 AliGenParam.cxx:828
 AliGenParam.cxx:829
 AliGenParam.cxx:830
 AliGenParam.cxx:831
 AliGenParam.cxx:832
 AliGenParam.cxx:833
 AliGenParam.cxx:834
 AliGenParam.cxx:835
 AliGenParam.cxx:836
 AliGenParam.cxx:837
 AliGenParam.cxx:838
 AliGenParam.cxx:839
 AliGenParam.cxx:840
 AliGenParam.cxx:841
 AliGenParam.cxx:842
 AliGenParam.cxx:843
 AliGenParam.cxx:844
 AliGenParam.cxx:845
 AliGenParam.cxx:846
 AliGenParam.cxx:847
 AliGenParam.cxx:848
 AliGenParam.cxx:849
 AliGenParam.cxx:850
 AliGenParam.cxx:851
 AliGenParam.cxx:852
 AliGenParam.cxx:853
 AliGenParam.cxx:854
 AliGenParam.cxx:855
 AliGenParam.cxx:856
 AliGenParam.cxx:857
 AliGenParam.cxx:858
 AliGenParam.cxx:859
 AliGenParam.cxx:860
 AliGenParam.cxx:861
 AliGenParam.cxx:862
 AliGenParam.cxx:863
 AliGenParam.cxx:864
 AliGenParam.cxx:865
 AliGenParam.cxx:866