905633472cce500f5fd59f66f02d54473457b29f
[u/mrichter/AliRoot.git] / STEER / AliAODHandler.h
1 #ifndef ALIAODHANDLER_H
2 #define ALIAODHANDLER_H
3 /* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id$ */
7
8 //-------------------------------------------------------------------------
9 //     Implementation of the Event Handler Interface for AOD
10 //     Author: Andreas Morsch, CERN
11 //-------------------------------------------------------------------------
12
13 #include "AliVEventHandler.h"
14
15 class AliAODEvent;
16 class TFile;
17 class TTree;
18 class TObjArray;
19 class AliMCEventHandler;
20 class AliAODMCHeader;
21 class AliAODExtension;
22 class AliGenEventHeader;
23 class TMap;
24 class AliAnalysisFilter;
25
26 class AliAODHandler : public AliVEventHandler {
27     
28  public:
29     AliAODHandler();
30     AliAODHandler(const char* name, const char* title);
31     virtual ~AliAODHandler();
32     virtual void         SetOutputFileName(const char* fname);
33     virtual const char*  GetOutputFileName();
34     // Extra outputs as a string separated by commas
35     virtual const char*  GetExtraOutputs() const;
36     virtual Bool_t       Init(Option_t* option);
37     virtual Bool_t       Init(TTree* /*tree*/, Option_t* /*option*/)  {return kTRUE;}
38     virtual Bool_t       GetEntry() {return kTRUE;}
39             
40     virtual Bool_t       BeginEvent(Long64_t /*entry*/) {fFillAOD=kFALSE; return kTRUE;}
41     virtual Bool_t       Notify() { return AliVEventHandler::Notify(); };
42     virtual Bool_t       Notify(const char * /* path */) {return kTRUE;}
43     virtual Bool_t       FinishEvent();
44     virtual Bool_t       Terminate();
45     virtual Bool_t       TerminateIO();
46     //
47     virtual void         SetCreateNonStandardAOD()               {fIsStandard = kFALSE;}
48     virtual void         SetFillAOD(Bool_t b)                    {fFillAOD = b;}
49     virtual void         SetFillAODforRun(Bool_t b)              {fFillAODRun = b;}
50     virtual void         SetNeedsHeaderReplication()             {fNeedsHeaderReplication             = kTRUE;}
51     virtual void         SetNeedsTracksBranchReplication()       {fNeedsTracksBranchReplication       = kTRUE;}
52     virtual void         SetNeedsVerticesBranchReplication()     {fNeedsVerticesBranchReplication     = kTRUE;}
53     virtual void         SetNeedsV0sBranchReplication()          {fNeedsV0sBranchReplication          = kTRUE;}
54     virtual void         SetNeedsCascadesBranchReplication()     {fNeedsCascadesBranchReplication     = kTRUE;}
55     virtual void         SetNeedsTrackletsBranchReplication()    {fNeedsTrackletsBranchReplication    = kTRUE;}
56     virtual void         SetNeedsPMDClustersBranchReplication()  {fNeedsPMDClustersBranchReplication  = kTRUE;}
57     virtual void         SetNeedsJetsBranchReplication()         {fNeedsJetsBranchReplication         = kTRUE;}
58     virtual void         SetNeedsFMDClustersBranchReplication()  {fNeedsFMDClustersBranchReplication  = kTRUE;}
59     virtual void         SetNeedsCaloClustersBranchReplication() {fNeedsCaloClustersBranchReplication = kTRUE;}
60     virtual void         SetNeedsMCParticlesBranchReplication()  {fNeedsMCParticlesBranchReplication  = kTRUE;}
61     virtual void         SetNeedsDimuonsBranchReplication()      {fNeedsDimuonsBranchReplication      = kTRUE;}
62     virtual void         SetAODIsReplicated() {fAODIsReplicated = kTRUE;}
63     //
64     AliAODEvent*         GetAOD()  {return fAODEvent;}
65     virtual TTree*       GetTree() const {return fTreeA;}
66     TObjArray*           GetExtensions() const {return fExtensions;}
67     AliAODExtension*     GetExtension(const char *filename) const;
68     TObjArray*           GetFilters() const {return fFilters;}
69     AliAODExtension*     GetFilteredAOD(const char *filename) const;
70     void                 CreateTree(Int_t flag);
71     void                 FillTree();
72     void                 AddAODtoTreeUserInfo();
73     void                 AddBranch(const char* cname, void* addobj, const char *fname="");
74     AliAODExtension*     AddExtension(const char *filename, const char *title="");                 
75     AliAODExtension*     AddFilteredAOD(const char *filename, const char *filtername);
76     Bool_t               IsStandard()                         const {return fIsStandard;}
77     Bool_t               GetFillAOD()                         const {return fFillAOD;} 
78     Bool_t               NeedsHeaderReplication()             const {return  fNeedsHeaderReplication;}
79     Bool_t               NeedsTracksBranchReplication()       const {return  fNeedsTracksBranchReplication;}
80     Bool_t               NeedsVerticesBranchReplication()     const {return  fNeedsVerticesBranchReplication;}
81     Bool_t               NeedsV0sBranchReplication()          const {return  fNeedsV0sBranchReplication;}
82     Bool_t               NeedsCascadesBranchReplication()     const {return  fNeedsCascadesBranchReplication;}
83     Bool_t               NeedsTrackletsBranchReplication()    const {return  fNeedsTrackletsBranchReplication;}
84     Bool_t               NeedsPMDClustersBranchReplication()  const {return  fNeedsPMDClustersBranchReplication;}
85     Bool_t               NeedsJetsBranchReplication()         const {return  fNeedsJetsBranchReplication;}
86     Bool_t               NeedsFMDClustersBranchReplication()  const {return  fNeedsFMDClustersBranchReplication;}
87     Bool_t               NeedsCaloClustersBranchReplication() const {return  fNeedsCaloClustersBranchReplication;}
88     Bool_t               NeedsMCParticlesBranchReplication()  const {return  fNeedsMCParticlesBranchReplication;}
89     Bool_t               NeedsDimuonsBranchReplication()      const {return  fNeedsDimuonsBranchReplication;}
90     Bool_t               AODIsReplicated()                    const {return  fAODIsReplicated;}
91     //
92     void                 SetInputTree(TTree* /*tree*/) {;}
93     void                 SetMCEventHandler(AliMCEventHandler* mcH) {fMCEventH = mcH;} // For internal use
94     void StoreMCParticles(); // Store MC particles, only to be called from AliAnalyisTaskMCParticleFilter
95
96   void Print(Option_t* opt="") const;
97   
98  private:
99     void SetMCHeaderInfo(AliAODMCHeader *mcHeader,AliGenEventHeader *genHeader); // Utility function t catch different types of eventheaders
100     AliAODHandler(const AliAODHandler&);             // Not implemented
101     AliAODHandler& operator=(const AliAODHandler&);  // Not implemented
102   void PrintExtensions(const TObjArray& array) const;
103   
104  private:
105     Bool_t                   fIsStandard;                         // Flag for standard aod creation
106     Bool_t                   fFillAOD;                            // Flag for filling of the AOD tree at the end (all or nothing evt by evt)
107     Bool_t                   fFillAODRun;                         // Flag for filling of the AOD tree at the end (run)
108     Bool_t                   fNeedsHeaderReplication;             // Flag for header replication
109     Bool_t                   fNeedsTracksBranchReplication;       // Flag for tracks replication
110     Bool_t                   fNeedsVerticesBranchReplication;     // Flag for vertices replication
111     Bool_t                   fNeedsV0sBranchReplication;          // Flag for V0s replication
112     Bool_t                   fNeedsCascadesBranchReplication;     // Flag for Cascade replication
113     Bool_t                   fNeedsTrackletsBranchReplication;    // Flag for Tracklets replication
114     Bool_t                   fNeedsPMDClustersBranchReplication;  // Flag for PMDClusters replication
115     Bool_t                   fNeedsJetsBranchReplication;         // Flag for Jets replication
116     Bool_t                   fNeedsFMDClustersBranchReplication;  // Flag for FMDClusters replication
117     Bool_t                   fNeedsCaloClustersBranchReplication; // Flag for CaloClusters replication
118     Bool_t                   fNeedsMCParticlesBranchReplication;  // Flag for MCParticles replication
119     Bool_t                   fNeedsDimuonsBranchReplication;      // Flag for Dimuons replication
120     Bool_t                   fAODIsReplicated;                    // Flag true if replication as been executed
121     AliAODEvent             *fAODEvent;               //! Pointer to the AOD event
122     AliMCEventHandler       *fMCEventH;               //! Pointer to mc event handler needed not to depend on the manager
123     TTree                   *fTreeA;                  //! tree for AOD persistency
124     TFile                   *fFileA;                  //! Output file
125     TString                  fFileName;               //  Output file name
126     TObjArray               *fExtensions;             //  List of extensions
127     TObjArray               *fFilters;                //  List of filtered AOD's
128     ClassDef(AliAODHandler, 6)
129 };
130
131 //-------------------------------------------------------------------------
132 //     Support class for AOD extensions. This is created by the user analysis
133 //     that requires a separate file for some AOD branches. The name of the 
134 //     AliAODExtension object is the file name where the AOD branches will be
135 //     stored.
136 //     Author: Andrei Gheata, CERN
137 //-------------------------------------------------------------------------
138
139 class AliAODBranchReplicator;
140
141 class AliAODExtension : public TNamed {
142
143 public:
144
145 enum EAliAODExtensionFlags {
146    kFilteredAOD      = BIT(14),
147    kDropUnspecifiedBranches = BIT(15)
148 };
149     
150   AliAODExtension();
151     AliAODExtension(const char* name, const char* title, Bool_t isfilter=kFALSE);
152     virtual ~AliAODExtension();
153     void                 AddBranch(const char* cname, void* addobj);
154     Bool_t               FinishEvent();
155     Int_t                GetNtotal() const         {return fNtotal;}
156     Int_t                GetNpassed() const        {return fNpassed;}
157     const char*          GetOutputFileName() const {return TNamed::GetName();}
158     AliAODEvent*         GetAOD() const            {return fAODEvent;}
159     TTree*               GetTree() const           {return fTreeE;}
160     Bool_t               Init(Option_t *option);
161     Bool_t               IsFilteredAOD() const     {return TObject::TestBit(kFilteredAOD);}
162     Bool_t               IsEventSelected() const   {return fSelected;}
163     void                 SelectEvent(Bool_t flag=kTRUE)  {fSelected = flag;}
164     void                 SetEvent(AliAODEvent *event);
165     void                 SetOutputFileName(const char* fname) {TNamed::SetName(fname);}
166     Bool_t               TerminateIO();
167
168   void Print(Option_t* opt="") const;
169   
170   // Branches not specified in any FilterBranch call will be dropped by default
171   void DropUnspecifiedBranches() { TObject::SetBit(kDropUnspecifiedBranches); }
172     
173   // Branches not specified in any FilterBranch call will be kept by default
174   void KeepUnspecifiedBranches() { TObject::ResetBit(kDropUnspecifiedBranches); }
175     
176   void FilterBranch(const char* branchName, AliAODBranchReplicator* replicator=0x0);
177
178   /* Use DisableReferences if and only if the output AOD contains no TRef or TRefArray,
179    otherwise the produced AOD won't be valid.
180    */
181   void DisableReferences() { fEnableReferences=kFALSE; }
182   
183   void EnableReferences() { fEnableReferences=kTRUE; }
184   
185  private:
186     AliAODExtension(const AliAODExtension&);             // Not implemented
187     AliAODExtension& operator=(const AliAODExtension&);  // Not implemented
188
189  private:
190     AliAODEvent             *fAODEvent;               //! Pointer to the AOD event
191     TTree                   *fTreeE;                  //! tree for AOD persistency
192     TFile                   *fFileE;                  //! Output file
193     Int_t                    fNtotal;                 //! Number of processed events
194     Int_t                    fNpassed;                //! Number of events that passed the filter
195     Bool_t                   fSelected;               //! Select current event for filtered AOD's. Made false at event start.
196
197     TMap*                    fRepFiMap; // which branch(es) to filter out / and or replicate
198     TList*                   fRepFiList; // list of unique filter/replicator
199   
200     Bool_t                   fEnableReferences; // whether or not to enable the TRefTable branch
201     TList*                   fObjectList; //! internal list of which objects to keep 
202   
203   ClassDef(AliAODExtension, 2) // Support for extra AOD branches in a separate AOD file
204 };
205 #endif