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


/* $Id$ */

//-------------------------------------------------------------------------
//                          Class AliMCEvent
//      
// Origin: Andreas.Morsch, CERN, andreas.morsch@cern.ch 
//-------------------------------------------------------------------------


#include <TTree.h>
#include <TRefArray.h>
#include <TClonesArray.h>

#include "AliVEvent.h"
#include "AliVHeader.h"
#include "AliVParticle.h"
#include "AliVVertex.h"
#include "AliMCParticle.h"

class AliCentrality;
class AliEventplane;
class AliStack;
class AliHeader;
class AliGenEventHeader;

class TClonesArray;
class TList;

class AliMCEvent : public AliVEvent {

public:

    AliMCEvent();
    virtual ~AliMCEvent() {;} 
    AliMCEvent(const AliMCEvent& mcEvnt); 
    AliMCEvent& operator=(const AliMCEvent& mcEvnt);
    //
    // Methods implementing the interface
    //
    // Services
    virtual void AddObject(TObject* /*obj*/)               {;}
    virtual TObject* FindListObject(const char */*name*/)  const {return 0;}
    virtual TList* GetList() const                         {return 0;}
    virtual void CreateStdContent()                        {;} 
    virtual void GetStdContent()                           {;}
    virtual void ReadFromTree(TTree * /*tree*/, Option_t* /*opt*/) {;}
    virtual void WriteToTree(TTree* /*tree*/)  const       {;}

    virtual void SetStdNames()                             {;}
    virtual void Print(Option_t */*option=""*/)  const     {;}
    virtual void PreReadAll();
    virtual void Reset()                                   {;}

    // Header
    virtual AliVHeader* GetHeader()          const         {return 0;}

    // Delegated methods for fESDRun or AODHeader
  
    virtual void     SetRunNumber(Int_t /*n*/)             {;}
    virtual void     SetPeriodNumber(UInt_t /*n*/)         {;}
    virtual void     SetMagneticField(Double_t /*mf*/)     {;}
    
  
    virtual Int_t    GetRunNumber()          const         {return 0;}
    virtual UInt_t   GetPeriodNumber()       const         {return 0;}
    virtual Double_t GetMagneticField()      const         {return 0.;}

    // Setters not needed
    virtual void      SetOrbitNumber(UInt_t /*n*/)         {;}
    virtual void      SetBunchCrossNumber(UShort_t /*n*/)  {;}
    virtual void      SetEventType(UInt_t /*eventType*/)   {;}
    virtual void      SetTriggerMask(ULong64_t /*n*/)      {;}
    virtual void      SetTriggerCluster(UChar_t /*n*/)     {;} 

    virtual UInt_t    GetOrbitNumber()        const {return 0;}
    virtual UShort_t  GetBunchCrossNumber()   const {return 0;}
    
    virtual UInt_t    GetEventType()          const {return 0;}

    virtual ULong64_t GetTriggerMask()        const {return 0;}
    virtual UChar_t   GetTriggerCluster()     const {return 0;}
    virtual TString   GetFiredTriggerClasses()const {return ("");}
    virtual Double_t  GetZDCN1Energy()        const {return 0.;}
    virtual Double_t  GetZDCP1Energy()        const {return 0.;}
    virtual Double_t  GetZDCN2Energy()        const {return 0.;}
    virtual Double_t  GetZDCP2Energy()        const {return 0.;}
    virtual Double_t  GetZDCEMEnergy(Int_t /*i*/) 
                                              const {return 0.;}
    // Tracks
    virtual AliVParticle *GetTrack(Int_t i) const;
    virtual Int_t     GetNumberOfTracks()    const {return fNparticles;}
    virtual Int_t     GetNumberOfV0s()       const {return -1;}
    virtual Int_t     GetNumberOfCascades()  const {return -1;}
    // Vertex
    using AliVEvent::GetPrimaryVertex;
    virtual const AliVVertex *GetPrimaryVertex() const;
    
    //
    // MC Specific methods
    //
    // Getters
    AliStack*    Stack()   {return fStack;}
    AliHeader*   Header()  {return fHeader;}
    AliGenEventHeader* GenEventHeader() const;
    // Services
    virtual void      ConnectTreeE (TTree* tree);
    virtual void      ConnectTreeK (TTree* tree);
    virtual void      ConnectHeaderAndStack(AliHeader* header);
    virtual void      ConnectTreeTR(TTree* tree);
    virtual void      Clean();
    virtual void      InitEvent();
    virtual void      FinishEvent();
    virtual Int_t     GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs);
    virtual void      DrawCheck(Int_t i, Int_t search);
    virtual void      AddSubsidiaryEvent(AliMCEvent* event);
    virtual Int_t     GetNumberOfPrimaries() {return fNprimaries;}
    virtual Int_t     GetPrimaryOffset()    const {return fPrimaryOffset;}
    virtual Int_t     GetSecondaryOffset()  const {return fSecondaryOffset;}    
    virtual void      SetPrimaryOffset(Int_t ioff)    {fPrimaryOffset = ioff;}
    virtual void      SetSecondaryOffset(Int_t ioff)  {fSecondaryOffset = ioff;}    
    virtual Bool_t    IsPhysicalPrimary(Int_t i) const;

    virtual Int_t     BgLabelToIndex(Int_t label);
    static  Int_t     BgLabelOffset() {return fgkBgLabelOffset;}
    virtual Bool_t    IsFromBGEvent(Int_t index);
    TList*  GetCocktailList();
    TString  GetGenerator(Int_t index); 
    Bool_t GetCocktailGenerator(Int_t index,TString &nameGen);
    virtual Bool_t    IsSecondaryFromWeakDecay(Int_t index);
    virtual Bool_t    IsSecondaryFromMaterial(Int_t index);
    // External particle array
  virtual void      SetParticleArray(TClonesArray* mcParticles); 
    //External Header 
     virtual void SetExternalHeader(AliVHeader* aodmcHeader)
       {fAODMCHeader=aodmcHeader;}  
  virtual AliGenEventHeader *FindHeader(Int_t ipart);
    //Following needed only for mixed event
  virtual Int_t        EventIndex(Int_t)       const {return 0;}
  virtual Int_t        EventIndexForCaloCluster(Int_t) const {return 0;}
  virtual Int_t        EventIndexForPHOSCell(Int_t)    const {return 0;}
  virtual Int_t        EventIndexForEMCALCell(Int_t)   const {return 0;} 
  AliCentrality*       GetCentrality()  {return 0;} 
  AliEventplane*       GetEventplane()  {return 0;} 

  virtual AliVVZERO    *GetVZEROData() const {return 0;}
  virtual AliVZDC      *GetZDCData()   const {return 0;}

  virtual AliVEvent::EDataLayoutType GetDataLayoutType() const;

private:
    virtual void      ReorderAndExpandTreeTR();
    virtual Int_t     FindIndexAndEvent(Int_t oldidx, AliMCEvent*& event) const;
    void 	      UpdateEventInformation();
    virtual void      AssignGeneratorIndex();    
    virtual void      AssignGeneratorIndex(Int_t index, Int_t dmin, Int_t dmax);    
    
private: 
    // Stanndard implementation for ESD production
    AliStack         *fStack;            // Current pointer to stack
    TClonesArray     *fMCParticles;      // Pointer to list of particles
    TObjArray        *fMCParticleMap;    // Map of MC Particles
    AliHeader        *fHeader;           // Current pointer to header
    AliVHeader       *fAODMCHeader;      //Current pointer to AODMC header
    TClonesArray     *fTRBuffer;         // Track reference buffer    
    TClonesArray     *fTrackReferences;  // Array of track references
    TTree            *fTreeTR;           // Pointer to Track Reference Tree
    TTree            *fTmpTreeTR;        // Temporary tree TR to read old format
    TFile            *fTmpFileTR;        // Temporary file with TreeTR to read old format
    Int_t             fNprimaries;       // Number of primaries
    Int_t             fNparticles;       // Number of particles
    TList            *fSubsidiaryEvents; // List of possible subsidiary events (for example merged underlying event) 
    Int_t             fPrimaryOffset;    // Offset for primaries
    Int_t             fSecondaryOffset;  // Offset for secondaries
    Bool_t            fExternal;         // True if external particle array
    static   Int_t        fgkBgLabelOffset;  // Standard branch name    
    mutable  AliVVertex*  fVertex;           // MC Vertex
    Int_t             fNBG;              //! Background particles in current event
    
    ClassDef(AliMCEvent, 2)              // AliVEvent realisation for MC data
};


#endif 

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