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


/* $Id$ */

//-------------------------------------------------------------------------
//                          Class AliMCEvent
// This class gives access to MC truth during the analysis.
// Monte Carlo truth is contained in the kinematics tree (produced particles) and 
// the tree of reference hits.
//      
// Origin: Andreas Morsch, CERN, andreas.morsch@cern.ch 
//-------------------------------------------------------------------------
#include "AliInputEventHandler.h"
#include "AliHeader.h"
#include <TExMap.h>

class TFile;
class TTree;
class TList;
class TTreeCache;

class TParticle;
class TString;
class TClonesArray;
class TDirectoryFile;

class AliMCEvent;



class AliMCEventHandler : public AliInputEventHandler
{
public:

    enum PreReadMode_t {kNoPreRead = 0, kLmPreRead = 1, kHmPreRead = 2};

    AliMCEventHandler();
    AliMCEventHandler(const char* name, const char* title);
    virtual ~AliMCEventHandler();
    virtual void         SetOutputFileName(const char* /* fname */) {;}
    virtual const char*  GetOutputFileName() const {return 0;}
    virtual void         SetInputPath(const char* fname); 
    virtual void         SetInputTree(TTree* /*tree*/) {;}
    virtual TString*     GetInputPath() const {return fPathName;}
    virtual Bool_t       Init(Option_t* opt);
    virtual Bool_t       GetEntry() {return kTRUE;}
    virtual Bool_t       InitIO(Option_t* opt) {return Init(opt);};
    virtual Bool_t       Init(TTree* /*tree*/, Option_t* /*opt*/) {return kTRUE;}
    virtual Bool_t       BeginEvent(Long64_t entry);
    virtual Bool_t       Notify() { return AliVEventHandler::Notify(); };
    virtual Bool_t       Notify(const char* path);
    virtual Bool_t       FinishEvent();
    virtual Bool_t       Terminate();
    virtual Bool_t       TerminateIO();
    virtual void         ResetIO();
    virtual Bool_t       LoadEvent(Int_t iev);
    virtual void         SetReadTR(Bool_t flag) { Changed(); fReadTR = flag; }
    virtual void         AddSubsidiaryHandler(AliMCEventHandler* handler);
    virtual void         SetNumberOfEventsInContainer(Int_t nev) {fEventsInContainer = nev;}
    virtual void         SetPreReadMode(PreReadMode_t mode) {Changed(); fPreReadMode = mode;}
    virtual void         SetCacheSize(Long64_t size) {if (fCacheSize==0) fCacheSize = size;}
    //
    AliMCEvent* MCEvent() const {return fMCEvent;}
    TTree*      TreeTR()  const {return fTreeTR;}
    TTree*      TreeK()   const {return fTreeK;}
    virtual TTree*      GetTree() const {return fTreeE;}
    Int_t       GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*& trefs);
    void        DrawCheck(Int_t i, Int_t search=0);
    Bool_t      InitOk() const {return fInitOk;}
    // Label manipulation
    void   SelectParticle(Int_t i);
    Bool_t IsParticleSelected(Int_t i);
    void   CreateLabelMap();
    Int_t  GetNewLabel(Int_t i);

private:
    Bool_t      OpenFile(Int_t i);
    void  VerifySelectedParticles();
    AliMCEventHandler(const AliMCEventHandler& handler);             
    AliMCEventHandler& operator=(const AliMCEventHandler& handler);  
private:
    AliMCEvent            *fMCEvent;            //! MC Event
    TFile                 *fFileE;              //! File with TreeE
    TFile                 *fFileK;              //! File with TreeK
    TFile                 *fFileTR;             //! File with TreeTR
    TTree                 *fTreeE;              //! TreeE  (Event Headers)
    TTree                 *fTreeK;              //! TreeK  (kinematics tree)
    TTree                 *fTreeTR;             //! TreeTR (track references tree)
    TDirectoryFile        *fDirK;               //! Directory for Kine Tree
    TDirectoryFile        *fDirTR;              //! Directory for TR Tree
    TExMap                 fParticleSelected;   //! List of selected MC particles for t
    TExMap                 fLabelMap;           //! Stores the Map of MC (ESDLabel,AODlabel)  
    Int_t                  fNEvent;             //! Number of events
    Int_t                  fEvent;              //! Current event
    TString               *fPathName;           //! Input file path 
    const Char_t          *fkExtension;         //! File name extension 
    Int_t                  fFileNumber;         //! Input file number
    Int_t                  fEventsPerFile;      //! Number of events per file
    Bool_t                 fReadTR;             // determines if TR shall be read
    Bool_t                 fInitOk;             // Initialization ok
    TList                 *fSubsidiaryHandlers; //! List of subsidiary MC handlers (for example for Background)
    Int_t                  fEventsInContainer;  //! Number of events in container class
    PreReadMode_t          fPreReadMode;        // Pre reading mode
    Long64_t               fCacheSize;          // Cache size for kinematics tree
    TTreeCache            *fCacheTK;            //! Cache for kinematics tree
    TTreeCache            *fCacheTR;            //! Cache for track references tree
    
    ClassDef(AliMCEventHandler,3)  //MC Truth EventHandler class
};
#endif 

 AliMCEventHandler.h:1
 AliMCEventHandler.h:2
 AliMCEventHandler.h:3
 AliMCEventHandler.h:4
 AliMCEventHandler.h:5
 AliMCEventHandler.h:6
 AliMCEventHandler.h:7
 AliMCEventHandler.h:8
 AliMCEventHandler.h:9
 AliMCEventHandler.h:10
 AliMCEventHandler.h:11
 AliMCEventHandler.h:12
 AliMCEventHandler.h:13
 AliMCEventHandler.h:14
 AliMCEventHandler.h:15
 AliMCEventHandler.h:16
 AliMCEventHandler.h:17
 AliMCEventHandler.h:18
 AliMCEventHandler.h:19
 AliMCEventHandler.h:20
 AliMCEventHandler.h:21
 AliMCEventHandler.h:22
 AliMCEventHandler.h:23
 AliMCEventHandler.h:24
 AliMCEventHandler.h:25
 AliMCEventHandler.h:26
 AliMCEventHandler.h:27
 AliMCEventHandler.h:28
 AliMCEventHandler.h:29
 AliMCEventHandler.h:30
 AliMCEventHandler.h:31
 AliMCEventHandler.h:32
 AliMCEventHandler.h:33
 AliMCEventHandler.h:34
 AliMCEventHandler.h:35
 AliMCEventHandler.h:36
 AliMCEventHandler.h:37
 AliMCEventHandler.h:38
 AliMCEventHandler.h:39
 AliMCEventHandler.h:40
 AliMCEventHandler.h:41
 AliMCEventHandler.h:42
 AliMCEventHandler.h:43
 AliMCEventHandler.h:44
 AliMCEventHandler.h:45
 AliMCEventHandler.h:46
 AliMCEventHandler.h:47
 AliMCEventHandler.h:48
 AliMCEventHandler.h:49
 AliMCEventHandler.h:50
 AliMCEventHandler.h:51
 AliMCEventHandler.h:52
 AliMCEventHandler.h:53
 AliMCEventHandler.h:54
 AliMCEventHandler.h:55
 AliMCEventHandler.h:56
 AliMCEventHandler.h:57
 AliMCEventHandler.h:58
 AliMCEventHandler.h:59
 AliMCEventHandler.h:60
 AliMCEventHandler.h:61
 AliMCEventHandler.h:62
 AliMCEventHandler.h:63
 AliMCEventHandler.h:64
 AliMCEventHandler.h:65
 AliMCEventHandler.h:66
 AliMCEventHandler.h:67
 AliMCEventHandler.h:68
 AliMCEventHandler.h:69
 AliMCEventHandler.h:70
 AliMCEventHandler.h:71
 AliMCEventHandler.h:72
 AliMCEventHandler.h:73
 AliMCEventHandler.h:74
 AliMCEventHandler.h:75
 AliMCEventHandler.h:76
 AliMCEventHandler.h:77
 AliMCEventHandler.h:78
 AliMCEventHandler.h:79
 AliMCEventHandler.h:80
 AliMCEventHandler.h:81
 AliMCEventHandler.h:82
 AliMCEventHandler.h:83
 AliMCEventHandler.h:84
 AliMCEventHandler.h:85
 AliMCEventHandler.h:86
 AliMCEventHandler.h:87
 AliMCEventHandler.h:88
 AliMCEventHandler.h:89
 AliMCEventHandler.h:90
 AliMCEventHandler.h:91
 AliMCEventHandler.h:92
 AliMCEventHandler.h:93
 AliMCEventHandler.h:94
 AliMCEventHandler.h:95
 AliMCEventHandler.h:96
 AliMCEventHandler.h:97
 AliMCEventHandler.h:98
 AliMCEventHandler.h:99
 AliMCEventHandler.h:100
 AliMCEventHandler.h:101
 AliMCEventHandler.h:102
 AliMCEventHandler.h:103
 AliMCEventHandler.h:104
 AliMCEventHandler.h:105
 AliMCEventHandler.h:106
 AliMCEventHandler.h:107
 AliMCEventHandler.h:108
 AliMCEventHandler.h:109
 AliMCEventHandler.h:110
 AliMCEventHandler.h:111
 AliMCEventHandler.h:112
 AliMCEventHandler.h:113
 AliMCEventHandler.h:114
 AliMCEventHandler.h:115
 AliMCEventHandler.h:116