ROOT logo
#ifndef ALIGENERATOR_H
#define ALIGENERATOR_H
/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 * See cxx source for full Copyright notice                               */

/* $Id$ */

///////////////////////////////////////////////////////////
//                                                       //
//  Class to generate the particles for the MC           //
//  The base class is empty                              //
//                                                       //
///////////////////////////////////////////////////////////

#include <TArrayF.h>
#include <TLorentzVector.h>
#include <TMCProcess.h>

#include "AliRndm.h"

class AliVertexGenerator;
class AliCollisionGeometry;
class AliGenEventHeader;
class AliStack;
class TGenerator;



typedef enum { kNoSmear, kPerEvent, kPerTrack }  VertexSmear_t;
typedef enum { kExternal, kInternal, kContainer} VertexSource_t;


class AliGenerator : public TNamed, public AliRndm
{

 public:

    AliGenerator();
    AliGenerator(Int_t npart);
    virtual ~AliGenerator();
    virtual void Init();
    virtual void SetOrigin(Float_t ox, Float_t oy, Float_t oz);
    virtual void SetOrigin(const TLorentzVector &o);
    virtual void SetSigma(Float_t sx, Float_t sy, Float_t sz);
    virtual void SetSigmaZ(Float_t sz) {fOsigma[2] = sz;}
    virtual void SetMomentumRange(Float_t pmin=0, Float_t pmax=1.e10);
    virtual void SetPtRange(Float_t ptmin=0, Float_t ptmax=1.e10);
    virtual void SetPhiRange(Float_t phimin = 0., Float_t phimax = 360.);
    virtual void SetYRange(Float_t ymin=-100, Float_t ymax=100);
    virtual void SetVRange(Float_t vxmin, Float_t vxmax,
			   Float_t vymin, Float_t vymax,
			   Float_t vzmin, Float_t vzmax);
    virtual void SetNumberParticles(Int_t npart=100) {fNpart=npart;}
    virtual Int_t NumberParticles() const {return fNpart;}
    virtual void SetThetaRange(Float_t thetamin=0, Float_t thetamax=180);
    virtual void GenerateN(Int_t ntimes);
    virtual void Generate()=0;
    virtual void SetParentWeight(Float_t wgt) {fParentWeight=wgt;}
    virtual void SetChildWeight(Float_t wgt)  {fChildWeight=wgt;}    
    virtual void SetAnalog(Int_t flag=1) {fAnalog=flag;}	
    virtual void SetVertexSmear(VertexSmear_t smear) {fVertexSmear = smear;}
    virtual void SetCutVertexZ(Float_t cut=999999.) {fCutVertexZ = cut;}
    virtual void SetVertexSource(VertexSource_t source = kInternal) {fVertexSource = source;}
    virtual void SetVertex(Float_t vx, Float_t vy, Float_t vz, Float_t t = 0)
    {fVertex[0] = vx; fVertex[1] = vy; fVertex[2] = vz; fTime = t;}
    void SetVertexGenerator(AliVertexGenerator* vertexGenerator)
      {fVertexGenerator = vertexGenerator; fVertexSource = kExternal; fVertexSmear = kPerEvent;}
    void SetPileUpTimeWindow(Float_t pileUpTimeW) {fPileUpTimeWindow = pileUpTimeW;}
    virtual void SetTime(Float_t time)
	{fTime = time;}
    virtual void SetTimeOrigin(Float_t timeorig)
        {fTimeOrigin = timeorig;}
    
    virtual void SetTrackingFlag(Int_t flag=1) {fTrackIt=flag;}
    void Vertex();
    void VertexExternal();
    virtual void VertexInternal();
    virtual void FinishRun();
    virtual void SetMC(TGenerator *theMC) {fMCEvGen =theMC;}
    virtual TGenerator* GetMC() const {return fMCEvGen;}
    virtual void AddHeader(AliGenEventHeader* /*header*/) {;}
    virtual void SetContainer(AliGenerator* container) {fContainer = container;}
    virtual void SetEventPlane(Float_t evPlane) {fEvPlane = evPlane; }

  // Getters

    virtual void GetOrigin(Float_t &ox, Float_t &oy, Float_t &oz) const
	{ox=fOrigin.At(0);oy=fOrigin.At(1);oz=fOrigin.At(2);}
    virtual void GetOrigin(TLorentzVector &o) const
	{o[0]=fOrigin.At(0);o[1]=fOrigin.At(1);o[2]=fOrigin.At(2);o[3]=0;}
  // Stack 
    void SetStack (AliStack *stack) {fStack = stack;}
    AliStack* GetStack(){return fStack;}
  // Collision Geometry
    virtual Bool_t ProvidesCollisionGeometry() const {return kFALSE;}
    virtual Bool_t NeedsCollisionGeometry()    const {return kFALSE;}    
    virtual AliCollisionGeometry* CollisionGeometry() const {return fCollisionGeometry;}
    virtual void SetCollisionGeometry(AliCollisionGeometry* geom) {fCollisionGeometry = geom;}

    virtual Float_t GetEnergyCMS() const { return fEnergyCMS; }
    virtual void    SetEnergyCMS(Float_t energy = 0) { fEnergyCMS = energy; }
    virtual void    GetProjectile(TString& tar, Int_t& a, Int_t& z) const
    {tar = fProjectile; a = fAProjectile; z = fZProjectile;}    
    virtual void    GetTarget(TString& tar, Int_t& a, Int_t& z) const
    {tar = fTarget; a = fATarget; z = fZTarget;}    
    virtual void    SetProjectile(TString proj="", Int_t a = 0, Int_t z = 0)
	{fProjectile = proj; fAProjectile = a; fZProjectile = z;}
    virtual void    SetTarget(TString tar="", Int_t a = 0, Int_t z = 0)
	{fTarget = tar; fATarget = a; fZTarget = z;}
    
    virtual void    SetSeed(UInt_t seed);
    
 protected:
    virtual  void  PushTrack(Int_t done, Int_t parent, Int_t pdg,
                               Float_t *pmom, Float_t *vpos, Float_t *polar,
                               Float_t tof, TMCProcess mech, Int_t &ntr,
                               Float_t weight = 1, Int_t is = 0);
    virtual  void  PushTrack(Int_t done, Int_t parent, Int_t pdg,
                      Double_t px, Double_t py, Double_t pz, Double_t e,
                      Double_t vx, Double_t vy, Double_t vz, Double_t tof,
                      Double_t polx, Double_t poly, Double_t polz,
                      TMCProcess mech, Int_t &ntr, Float_t weight = 1, Int_t is = 0);
    virtual void   KeepTrack(Int_t itrack); 
    virtual void   SetHighWaterMark(Int_t nt);

 protected:
    TGenerator* fMCEvGen;      //!Pointer to the generator
    Float_t     fThetaMin;     //Minimum theta of generation in radians
    Float_t     fThetaMax;     //Maximum theta of generation in radians
    Float_t     fPhiMin;       //Minimum phi of generation in radians
    Float_t     fPhiMax;       //Maximum phi of generation in radians
    Float_t     fPMin;         //Minimum momentum of generation in GeV/c
    Float_t     fPMax;         //Minimum momentum of generation in GeV/c
    Float_t     fPtMin;        //Minimum transverse momentum
    Float_t     fPtMax;        //Maximum transverse momentum
    Float_t     fYMin;         //Minimum rapidity
    Float_t     fYMax;         //Maximum rapidity
    TArrayF     fVMin;         //Minimum Decaylength
    TArrayF     fVMax;         //Minimum Decaylength    
    Int_t       fNpart;        //Maximum number of particles per event
    Float_t     fParentWeight; //Parent Weight
    Float_t     fChildWeight;  //ChildWeight
    Int_t       fAnalog;       //Flag for anolog or pt-weighted generation
   //
    VertexSmear_t     fVertexSmear;  //Vertex Smearing mode
    VertexSource_t    fVertexSource; //Vertex source (internal/external)
    Float_t     fCutVertexZ;         //Vertex cut in units of sigma_z
    Float_t     fPileUpTimeWindow;   //Time window for pile-up events
    Int_t       fTrackIt;    // if 1, Track final state particles 
    AliVertexGenerator* fVertexGenerator;  //! Generator for the vertex
    TArrayF     fOrigin;     // Origin of event
    TArrayF     fOsigma;     // Sigma of the Origin of event
    TArrayF     fVertex;        //! Vertex of current event
    
    Float_t     fTimeOrigin; // Time0 origin in a run or event sample
    Float_t     fTime;       // Event time smeared around time0 origin using sigma vertex
    Float_t     fEvPlane;    // the event plane 

    AliStack*   fStack;         //! Local pointer to stack
    AliGenerator* fContainer;   //! Local pointer to container
    
    AliCollisionGeometry* fCollisionGeometry; //!Collision geometry
    /*************************************************************************/
    enum {kThetaRange    = BIT(14),
	  kVertexRange   = BIT(15),
	  kPhiRange      = BIT(16),
	  kPtRange       = BIT(17),
	  kYRange        = BIT(18),
	  kMomentumRange = BIT(19),
	  kEtaRange      = BIT(20)	  
    };

    Float_t     fEnergyCMS;    // Centre of mass energy
    Int_t        fAProjectile;   // Projectile A
    Int_t        fZProjectile;   // Projectile Z
    Int_t        fATarget;       // Target A
    Int_t        fZTarget;       // Target Z
    TString      fProjectile;    // Projectile
    TString      fTarget;        // Target

 private:
    AliGenerator(const AliGenerator &gen);
    AliGenerator & operator=(const AliGenerator &gen);

    ClassDef(AliGenerator,5) // Base class for event generators
};

#endif














 AliGenerator.h:1
 AliGenerator.h:2
 AliGenerator.h:3
 AliGenerator.h:4
 AliGenerator.h:5
 AliGenerator.h:6
 AliGenerator.h:7
 AliGenerator.h:8
 AliGenerator.h:9
 AliGenerator.h:10
 AliGenerator.h:11
 AliGenerator.h:12
 AliGenerator.h:13
 AliGenerator.h:14
 AliGenerator.h:15
 AliGenerator.h:16
 AliGenerator.h:17
 AliGenerator.h:18
 AliGenerator.h:19
 AliGenerator.h:20
 AliGenerator.h:21
 AliGenerator.h:22
 AliGenerator.h:23
 AliGenerator.h:24
 AliGenerator.h:25
 AliGenerator.h:26
 AliGenerator.h:27
 AliGenerator.h:28
 AliGenerator.h:29
 AliGenerator.h:30
 AliGenerator.h:31
 AliGenerator.h:32
 AliGenerator.h:33
 AliGenerator.h:34
 AliGenerator.h:35
 AliGenerator.h:36
 AliGenerator.h:37
 AliGenerator.h:38
 AliGenerator.h:39
 AliGenerator.h:40
 AliGenerator.h:41
 AliGenerator.h:42
 AliGenerator.h:43
 AliGenerator.h:44
 AliGenerator.h:45
 AliGenerator.h:46
 AliGenerator.h:47
 AliGenerator.h:48
 AliGenerator.h:49
 AliGenerator.h:50
 AliGenerator.h:51
 AliGenerator.h:52
 AliGenerator.h:53
 AliGenerator.h:54
 AliGenerator.h:55
 AliGenerator.h:56
 AliGenerator.h:57
 AliGenerator.h:58
 AliGenerator.h:59
 AliGenerator.h:60
 AliGenerator.h:61
 AliGenerator.h:62
 AliGenerator.h:63
 AliGenerator.h:64
 AliGenerator.h:65
 AliGenerator.h:66
 AliGenerator.h:67
 AliGenerator.h:68
 AliGenerator.h:69
 AliGenerator.h:70
 AliGenerator.h:71
 AliGenerator.h:72
 AliGenerator.h:73
 AliGenerator.h:74
 AliGenerator.h:75
 AliGenerator.h:76
 AliGenerator.h:77
 AliGenerator.h:78
 AliGenerator.h:79
 AliGenerator.h:80
 AliGenerator.h:81
 AliGenerator.h:82
 AliGenerator.h:83
 AliGenerator.h:84
 AliGenerator.h:85
 AliGenerator.h:86
 AliGenerator.h:87
 AliGenerator.h:88
 AliGenerator.h:89
 AliGenerator.h:90
 AliGenerator.h:91
 AliGenerator.h:92
 AliGenerator.h:93
 AliGenerator.h:94
 AliGenerator.h:95
 AliGenerator.h:96
 AliGenerator.h:97
 AliGenerator.h:98
 AliGenerator.h:99
 AliGenerator.h:100
 AliGenerator.h:101
 AliGenerator.h:102
 AliGenerator.h:103
 AliGenerator.h:104
 AliGenerator.h:105
 AliGenerator.h:106
 AliGenerator.h:107
 AliGenerator.h:108
 AliGenerator.h:109
 AliGenerator.h:110
 AliGenerator.h:111
 AliGenerator.h:112
 AliGenerator.h:113
 AliGenerator.h:114
 AliGenerator.h:115
 AliGenerator.h:116
 AliGenerator.h:117
 AliGenerator.h:118
 AliGenerator.h:119
 AliGenerator.h:120
 AliGenerator.h:121
 AliGenerator.h:122
 AliGenerator.h:123
 AliGenerator.h:124
 AliGenerator.h:125
 AliGenerator.h:126
 AliGenerator.h:127
 AliGenerator.h:128
 AliGenerator.h:129
 AliGenerator.h:130
 AliGenerator.h:131
 AliGenerator.h:132
 AliGenerator.h:133
 AliGenerator.h:134
 AliGenerator.h:135
 AliGenerator.h:136
 AliGenerator.h:137
 AliGenerator.h:138
 AliGenerator.h:139
 AliGenerator.h:140
 AliGenerator.h:141
 AliGenerator.h:142
 AliGenerator.h:143
 AliGenerator.h:144
 AliGenerator.h:145
 AliGenerator.h:146
 AliGenerator.h:147
 AliGenerator.h:148
 AliGenerator.h:149
 AliGenerator.h:150
 AliGenerator.h:151
 AliGenerator.h:152
 AliGenerator.h:153
 AliGenerator.h:154
 AliGenerator.h:155
 AliGenerator.h:156
 AliGenerator.h:157
 AliGenerator.h:158
 AliGenerator.h:159
 AliGenerator.h:160
 AliGenerator.h:161
 AliGenerator.h:162
 AliGenerator.h:163
 AliGenerator.h:164
 AliGenerator.h:165
 AliGenerator.h:166
 AliGenerator.h:167
 AliGenerator.h:168
 AliGenerator.h:169
 AliGenerator.h:170
 AliGenerator.h:171
 AliGenerator.h:172
 AliGenerator.h:173
 AliGenerator.h:174
 AliGenerator.h:175
 AliGenerator.h:176
 AliGenerator.h:177
 AliGenerator.h:178
 AliGenerator.h:179
 AliGenerator.h:180
 AliGenerator.h:181
 AliGenerator.h:182
 AliGenerator.h:183
 AliGenerator.h:184
 AliGenerator.h:185
 AliGenerator.h:186
 AliGenerator.h:187
 AliGenerator.h:188
 AliGenerator.h:189
 AliGenerator.h:190
 AliGenerator.h:191
 AliGenerator.h:192
 AliGenerator.h:193
 AliGenerator.h:194
 AliGenerator.h:195
 AliGenerator.h:196
 AliGenerator.h:197
 AliGenerator.h:198
 AliGenerator.h:199
 AliGenerator.h:200
 AliGenerator.h:201
 AliGenerator.h:202