]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/CaloTrackCorrBase/AliCaloTrackReader.h
add switch for timing cuts, apply BC=0 cut on tracks in reader, change TH*I to TH...
[u/mrichter/AliRoot.git] / PWG / CaloTrackCorrBase / AliCaloTrackReader.h
1 #ifndef ALICALOTRACKREADER_H
2 #define ALICALOTRACKREADER_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice     */
5
6 //_________________________________________________________________________
7 // Base class for reading data: MonteCarlo, ESD or AOD, of PHOS EMCAL and 
8 // Central Barrel Tracking detectors.
9 // Not all MC particles/tracks/clusters are kept, some kinematical restrictions are done.
10 // Mother class of : AliCaloTrackESDReader: Fills ESD data in 3 TObjArrays (PHOS, EMCAL, CTS)
11 //                 : AliCaloTrackMCReader : Fills Kinematics data in 3 TObjArrays (PHOS, EMCAL, CTS)
12 //                 : AliCaloTrackAODReader: Fills AOD data in 3 TObjArrays (PHOS, EMCAL, CTS)   
13 // -- Author: Gustavo Conesa (INFN-LNF)
14 //////////////////////////////////////////////////////////////////////////////
15
16 // --- ROOT system ---
17 #include <TObject.h> 
18 #include <TString.h>
19 class TObjArray ; 
20 class TTree ;
21 class TArrayI ;
22
23 //--- ANALYSIS system ---
24 #include "AliVEvent.h"
25 class AliVCaloCells;
26 class AliStack; 
27 class AliHeader; 
28 class AliGenEventHeader; 
29 class AliAODEvent;
30 class AliMCEvent;
31 class AliMixedEvent;
32 class AliAODMCHeader;
33 class AliESDtrackCuts;
34 class AliCentrality;
35 class AliTriggerAnalysis;
36 class AliEventplane;
37 class AliVCluster;
38
39 // --- CaloTrackCorr / EMCAL ---
40 #include "AliFiducialCut.h"
41 class AliEMCALRecoUtils;
42 class AliCalorimeterUtils;
43
44 class AliCaloTrackReader : public TObject {
45
46 public: 
47   
48   AliCaloTrackReader() ;          // ctor
49   virtual ~AliCaloTrackReader() ; // virtual dtor
50   
51   //--------------------------------
52   // General methods
53   //--------------------------------
54
55   virtual void    Init();
56     
57   virtual void    InitParameters();
58   
59   virtual void    Print(const Option_t * opt) const;
60   
61   virtual void    ResetLists();
62
63   virtual Int_t   GetDebug()                         const { return fDebug                 ; }
64   virtual void    SetDebug(Int_t d)                        { fDebug = d                    ; }
65   
66   enum inputDataType {kESD, kAOD, kMC};
67   virtual Int_t   GetDataType()                      const { return fDataType              ; }
68   virtual void    SetDataType(Int_t data )                 { fDataType = data              ; }
69
70   virtual Int_t   GetEventNumber()                   const { return fEventNumber           ; }
71         
72   TString         GetTaskName()                      const { return fTaskName              ; }
73   void            SetTaskName(TString name)                { fTaskName = name              ; }
74     
75   //---------------------------------------
76   //Input/output event setters and getters
77   //---------------------------------------
78   virtual void    SetInputEvent(AliVEvent* const input) ;
79   virtual void    SetOutputEvent(AliAODEvent* const aod)   { fOutputEvent = aod            ; }
80   virtual void    SetMC(AliMCEvent* const mc)              { fMC          = mc             ; }
81   virtual void    SetInputOutputMCEvent(AliVEvent* /*esd*/, AliAODEvent* /*aod*/, AliMCEvent* /*mc*/) { ; }
82   
83   // Delta AODs
84   virtual TList * GetAODBranchList()                 const { return fAODBranchList         ; }
85   void            SetDeltaAODFileName(TString name )       { fDeltaAODFileName = name      ; }
86   TString         GetDeltaAODFileName()              const { return fDeltaAODFileName      ; }
87   void            SwitchOnWriteDeltaAOD()                  { fWriteOutputDeltaAOD = kTRUE  ; }
88   void            SwitchOffWriteDeltaAOD()                 { fWriteOutputDeltaAOD = kFALSE ; }
89   Bool_t          WriteDeltaAODToFile()              const { return fWriteOutputDeltaAOD   ; } 
90   
91   //------------------------------------------------------------
92   //Clusters/Tracks arrays filtering/filling methods and switchs 
93   //------------------------------------------------------------
94   
95   //Minimum pt setters and getters 
96   Float_t          GetEMCALPtMin()                   const { return fEMCALPtMin            ; }
97   Float_t          GetPHOSPtMin()                    const { return fPHOSPtMin             ; }
98   Float_t          GetCTSPtMin()                     const { return fCTSPtMin              ; }
99   Float_t          GetEMCALPtMax()                   const { return fEMCALPtMax            ; }
100   Float_t          GetPHOSPtMax()                    const { return fPHOSPtMax             ; }
101   Float_t          GetCTSPtMax()                     const { return fCTSPtMax              ; }
102   
103   void             SetEMCALPtMin(Float_t  pt)              { fEMCALPtMin = pt              ; }
104   void             SetPHOSPtMin (Float_t  pt)              { fPHOSPtMin  = pt              ; }
105   void             SetCTSPtMin  (Float_t  pt)              { fCTSPtMin   = pt              ; }  
106   
107   void             SetEMCALPtMax(Float_t  pt)              { fEMCALPtMax = pt              ; }
108   void             SetPHOSPtMax (Float_t  pt)              { fPHOSPtMax  = pt              ; }
109   void             SetCTSPtMax  (Float_t  pt)              { fCTSPtMax   = pt              ; }  
110    
111   Float_t          GetEMCALEMin()                    const { return GetEMCALPtMin()        ; }
112   Float_t          GetPHOSEMin()                     const { return GetPHOSPtMin()         ; }
113   Float_t          GetEMCALEMax()                    const { return GetEMCALPtMax()        ; }
114   Float_t          GetPHOSEMax()                     const { return GetPHOSPtMax()         ; }
115   
116   void             SetEMCALEMin (Float_t  e)               { SetEMCALPtMin(e)              ; }
117   void             SetPHOSEMin  (Float_t  e)               { SetPHOSPtMin (e)              ; }
118   void             SetEMCALEMax (Float_t  e)               { SetEMCALPtMax(e)              ; }
119   void             SetPHOSEMax  (Float_t  e)               { SetPHOSPtMax (e)              ; }
120   
121   //Time cut
122   
123   Double_t         GetTrackTimeCutMin()              const { return fTrackTimeCutMin       ; }
124   Double_t         GetTrackTimeCutMax()              const { return fTrackTimeCutMax       ; }
125   
126   void             SetTrackTimeCut(Double_t a, Double_t b) { fTrackTimeCutMin = a ;
127                                                              fTrackTimeCutMax = b          ; } // ns
128   
129   void             SwitchOnUseTrackTimeCut()               { fUseTrackTimeCut = kTRUE      ; }
130   void             SwitchOffUseTrackTimeCut()              { fUseTrackTimeCut = kFALSE     ; }
131   
132   Double_t         GetEMCALTimeCutMin()              const { return fEMCALTimeCutMin       ; }
133   Double_t         GetEMCALTimeCutMax()              const { return fEMCALTimeCutMax       ; }  
134
135   Bool_t           IsInTimeWindow(const Double_t tof, const Float_t energy)  const ;
136   
137   void             SetEMCALTimeCut(Double_t a, Double_t b) { fEMCALTimeCutMin = a ; 
138                                                              fEMCALTimeCutMax = b          ; } // ns
139   
140   void             SetEMCALParametrizedMinTimeCut(Int_t i, Float_t par) { fEMCALParamTimeCutMin[i] = par ; } 
141   void             SetEMCALParametrizedMaxTimeCut(Int_t i, Float_t par) { fEMCALParamTimeCutMax[i] = par ; } 
142   
143   void             SwitchOnUseEMCALTimeCut()               { fUseEMCALTimeCut = kTRUE      ; }
144   void             SwitchOffUseEMCALTimeCut()              { fUseEMCALTimeCut = kFALSE     ; }
145   
146   void             SwitchOnUseParametrizedTimeCut()        { fUseParamTimeCut = kTRUE      ; }
147   void             SwitchOffUseParametrizedTimeCut()       { fUseParamTimeCut = kFALSE     ; }
148
149   // Fidutial cuts  
150   virtual AliFiducialCut * GetFiducialCut()                { 
151                     if(!fFiducialCut) fFiducialCut = new AliFiducialCut(); 
152                     return  fFiducialCut                                                   ; }
153   virtual void     SetFiducialCut(AliFiducialCut * const fc) { fFiducialCut = fc           ; }
154   virtual Bool_t   IsFiducialCutOn()                 const { return fCheckFidCut           ; }
155   virtual void     SwitchOnFiducialCut()                   { fCheckFidCut = kTRUE          ; 
156                                                              fFiducialCut = new AliFiducialCut() ; }
157   virtual void     SwitchOffFiducialCut()                  { fCheckFidCut = kFALSE         ; }
158   
159   // Cluster origin
160   Bool_t           IsEMCALCluster(AliVCluster *clus) const;
161   Bool_t           IsPHOSCluster (AliVCluster *clus) const;
162   //Patch for cluster origin for Old AODs implementation
163   void             SwitchOnOldAODs()                       { fOldAOD = kTRUE               ; }
164   void             SwitchOffOldAODs()                      { fOldAOD = kFALSE              ; }
165   
166   // Cluster/track/cells switchs
167   Bool_t           IsCTSSwitchedOn()                 const { return fFillCTS               ; }
168   void             SwitchOnCTS()                           { fFillCTS = kTRUE              ; }
169   void             SwitchOffCTS()                          { fFillCTS = kFALSE             ; }
170
171   Bool_t           IsEMCALSwitchedOn()               const { return fFillEMCAL             ; }
172   void             SwitchOnEMCAL()                         { fFillEMCAL = kTRUE            ; }
173   void             SwitchOffEMCAL()                        { fFillEMCAL = kFALSE           ; }
174
175   Bool_t           IsPHOSSwitchedOn()                const { return fFillPHOS              ; }
176   void             SwitchOnPHOS()                          { fFillPHOS = kTRUE             ; }
177   void             SwitchOffPHOS()                         { fFillPHOS = kFALSE            ; }
178
179   Bool_t           IsEMCALCellsSwitchedOn()          const { return fFillEMCALCells        ; }
180   void             SwitchOnEMCALCells()                    { fFillEMCALCells = kTRUE       ; }
181   void             SwitchOffEMCALCells()                   { fFillEMCALCells = kFALSE      ; }
182
183   Bool_t           IsPHOSCellsSwitchedOn()           const { return fFillPHOSCells         ; }
184   void             SwitchOnPHOSCells()                     { fFillPHOSCells = kTRUE        ; }
185   void             SwitchOffPHOSCells()                    { fFillPHOSCells = kFALSE       ; }
186
187   Bool_t           AreClustersRecalculated()         const { return fRecalculateClusters   ; }
188   void             SwitchOnClusterRecalculation()          { fRecalculateClusters = kTRUE  ; }
189   void             SwitchOffClusterRecalculation()         { fRecalculateClusters = kFALSE ; }  
190   
191   Bool_t           IsEmbeddedClusterSelectionOn()    const { return fSelectEmbeddedClusters   ; }
192   void             SwitchOnEmbeddedClustersSelection()     { fSelectEmbeddedClusters = kTRUE  ; }
193   void             SwitchOffEmbeddedClustersSelection()    { fSelectEmbeddedClusters = kFALSE ; }
194   
195   // Filling/ filtering / detector information access methods
196   virtual Bool_t   FillInputEvent(const Int_t iEntry, const char *currentFileName)  ;
197   virtual void     FillInputCTS() ;
198   virtual void     FillInputEMCAL() ;
199   virtual void     FillInputEMCALAlgorithm(AliVCluster * clus, const Int_t iclus) ;
200   virtual void     FillInputPHOS() ;
201   virtual void     FillInputEMCALCells() ;
202   virtual void     FillInputPHOSCells() ;
203   virtual void     FillInputVZERO() ;  
204   
205   Int_t            GetV0Signal(Int_t i)              const { return fV0ADC[i]               ; }
206   Int_t            GetV0Multiplicity(Int_t i)        const { return fV0Mul[i]               ; }
207   
208   void             SetEMCALClusterListName(TString &name)  { fEMCALClustersListName = name  ; }
209   TString          GetEMCALClusterListName()         const { return fEMCALClustersListName  ; }
210
211   // Arrayes with clusters/track/cells access method
212   virtual TObjArray*     GetCTSTracks()              const { return fCTSTracks              ; }
213   virtual TObjArray*     GetEMCALClusters()          const { return fEMCALClusters          ; }
214   virtual TObjArray*     GetPHOSClusters()           const { return fPHOSClusters           ; }
215   virtual AliVCaloCells* GetEMCALCells()             const { return fEMCALCells             ; }
216   virtual AliVCaloCells* GetPHOSCells()              const { return fPHOSCells              ; }
217    
218   //-------------------------------------
219   // Event/track selection methods
220   //-------------------------------------
221   
222   void             AcceptFastClusterEvents()               { fAcceptFastCluster     = kTRUE  ; } 
223   void             RejectFastClusterEvents()               { fAcceptFastCluster     = kFALSE ; }  
224   Bool_t           IsFastClusterAccepted()           const { return fAcceptFastCluster       ; }   
225   
226   void             SwitchOnLEDEventsRemoval()              { fRemoveLEDEvents       = kTRUE  ; }
227   void             SwitchOffLEDEventsRemoval()             { fRemoveLEDEvents       = kFALSE ; } 
228   Bool_t           IsLEDEventRemoved()               const { return fRemoveLEDEvents         ; }   
229
230   void             SetFiredTriggerClassName(TString name ) { fFiredTriggerClassName = name   ; }
231   TString          GetFiredTriggerClassName()        const { return fFiredTriggerClassName   ; }
232   TString          GetFiredTriggerClasses() ;               
233   
234   UInt_t           GetEventTriggerMask()             const { return fEventTriggerMask        ; }
235   void             SetEventTriggerMaks(UInt_t evtTrig = AliVEvent::kAny) 
236                                                            { fEventTriggerMask = evtTrig     ; }
237
238   UInt_t           GetMixEventTriggerMask()             const { return fMixEventTriggerMask  ; }
239   void             SetMixEventTriggerMaks(UInt_t evtTrig = AliVEvent::kAnyINT) 
240                                                            { fMixEventTriggerMask = evtTrig  ; }
241   
242   
243   Bool_t           IsEventTriggerAtSEOn()            const { return fEventTriggerAtSE        ; }
244   void             SwitchOnEventTriggerAtSE()              { fEventTriggerAtSE      = kTRUE  ; }
245   void             SwitchOffEventTriggerAtSE()             { fEventTriggerAtSE      = kFALSE ; }
246   
247   void             SwitchOnEventSelection()                { fDoEventSelection      = kTRUE  ; }
248   void             SwitchOffEventSelection()               { fDoEventSelection      = kFALSE ; }
249   Bool_t           IsEventSelectionDone()            const { return fDoEventSelection        ; } 
250   
251   void             SwitchOnV0ANDSelection()                { fDoV0ANDEventSelection = kTRUE  ; }
252   void             SwitchOffV0ANDSelection()               { fDoV0ANDEventSelection = kFALSE ; }
253   Bool_t           IsV0ANDEventSelectionDone()       const { return fDoV0ANDEventSelection   ; } 
254
255   void             SwitchOnPrimaryVertexSelection()        { fUseEventsWithPrimaryVertex = kTRUE  ; }
256   void             SwitchOffPrimaryVertexSelection()       { fUseEventsWithPrimaryVertex = kFALSE ; }
257   Bool_t           IsPrimaryVertexSelectionDone()    const { return fUseEventsWithPrimaryVertex   ; } 
258   
259   Bool_t           IsPileUpFromSPD()               const ;
260   Bool_t           IsPileUpFromEMCal()             const ;
261   Bool_t           IsPileUpFromSPDAndEMCal()       const ;
262   Bool_t           IsPileUpFromSPDOrEMCal()        const ;
263   Bool_t           IsPileUpFromSPDAndNotEMCal()    const ;
264   Bool_t           IsPileUpFromEMCalAndNotSPD()    const ;
265   Bool_t           IsPileUpFromNotSPDAndNotEMCal() const ;
266
267   void             SetPileUpParamForSPD  (Int_t i, Double_t param)
268                                                            { fPileUpParamSPD[i]  = param  ; }
269   void             SetPileUpParamForEMCal(Int_t param)     { fNPileUpClustersCut = param  ; }
270   
271   Int_t            GetNPileUpClusters()                    { return  fNPileUpClusters     ; }
272   Int_t            GetNNonPileUpClusters()                 { return  fNNonPileUpClusters  ; }
273   
274   Int_t            GetEMCalEventBC(Int_t bc)     const     { if(bc >=0 && bc < 19) return  fEMCalBCEvent   [bc] ; else return 0 ; }
275   Int_t            GetTrackEventBC(Int_t bc)     const     { if(bc >=0 && bc < 19) return  fTrackBCEvent   [bc] ; else return 0 ; }
276   Int_t            GetEMCalEventBCcut(Int_t bc)  const     { if(bc >=0 && bc < 19) return  fEMCalBCEventCut[bc] ; else return 0 ; }
277   Int_t            GetTrackEventBCcut(Int_t bc)  const     { if(bc >=0 && bc < 19) return  fTrackBCEventCut[bc] ; else return 0 ; }
278
279   void             SetEMCalEventBC(Int_t bc)               { if(bc >=0 && bc < 19) fEMCalBCEvent   [bc] = 1 ; }
280   void             SetTrackEventBC(Int_t bc)               { if(bc >=0 && bc < 19) fTrackBCEvent   [bc] = 1 ; }
281   void             SetEMCalEventBCcut(Int_t bc)            { if(bc >=0 && bc < 19) fEMCalBCEventCut[bc] = 1 ; }
282   void             SetTrackEventBCcut(Int_t bc)            { if(bc >=0 && bc < 19) fTrackBCEventCut[bc] = 1 ; }
283
284   
285   // Track selection
286   ULong_t          GetTrackStatus()                  const { return fTrackStatus          ; }
287   void             SetTrackStatus(ULong_t bit)             { fTrackStatus = bit           ; }           
288
289   ULong_t          GetTrackFilterMask()              const {return fTrackFilterMask       ; }
290   void             SetTrackFilterMask(ULong_t bit)         { fTrackFilterMask = bit       ; }           
291   
292   AliESDtrackCuts* GetTrackCuts()                    const { return fESDtrackCuts         ; }
293   void             SetTrackCuts(AliESDtrackCuts * cuts)    ;
294
295   void             SwitchOnConstrainTrackToVertex()        { fConstrainTrack     = kTRUE  ; } 
296   void             SwitchOffConstrainTrackToVertex()       { fConstrainTrack     = kFALSE ; }      
297   
298   void             SwitchOnAODHybridTrackSelection()       { fSelectHybridTracks = kTRUE  ; } 
299   void             SwitchOffAODHybridTrackSelection()      { fSelectHybridTracks = kFALSE ; }      
300   
301   void             SwitchOnTrackHitSPDSelection()          { fSelectSPDHitTracks = kTRUE  ; }
302   void             SwitchOffTrackHitSPDSelection()         { fSelectSPDHitTracks = kFALSE ; }
303   
304   Int_t            GetTrackMultiplicity()            const { return fTrackMult            ; }
305   Float_t          GetTrackMultiplicityEtaCut()      const { return fTrackMultEtaCut      ; }
306   void             SetTrackMultiplicityEtaCut(Float_t eta) { fTrackMultEtaCut = eta       ; }           
307   
308   // Calorimeter specific and patches
309   void             AnalyzeOnlyLED()                        { fAnaLED             = kTRUE  ; }
310   void             AnalyzeOnlyPhysics()                    { fAnaLED             = kFALSE ; }
311   
312   void             SwitchOnCaloFilterPatch()               { fCaloFilterPatch    = kTRUE  ; 
313                                                              fFillCTS            = kFALSE ; }
314   void             SwitchOffCaloFilterPatch()              { fCaloFilterPatch    = kFALSE ; }
315   Bool_t           IsCaloFilterPatchOn()             const { 
316                     if(fDataType == kAOD) { return fCaloFilterPatch ; } 
317                     else                  { return kFALSE           ; }                     }
318         
319   //-------------------------------
320   //Vertex methods
321   //-------------------------------
322   virtual void      GetVertex(Double_t v[3])         const ;
323   virtual Double_t* GetVertex(const Int_t evtIndex)  const { return fVertex[evtIndex]            ; }
324   virtual void      GetVertex(Double_t vertex[3],    const Int_t evtIndex) const ;
325   virtual void      FillVertexArray();
326   virtual Bool_t    CheckForPrimaryVertex();
327   virtual Float_t   GetZvertexCut()                  const { return fZvtxCut                     ; } //cut on vertex position  
328   virtual void      SetZvertexCut(Float_t zcut=10.)        { fZvtxCut=zcut                       ; } //cut on vertex position
329
330   //--------------------------
331   // Centrality / Event Plane
332   //--------------------------
333   virtual AliCentrality* GetCentrality()             const { if(fDataType!=kMC) return fInputEvent->GetCentrality() ; 
334                                                              else               return 0x0       ; } 
335   virtual void     SetCentralityClass(TString name)        { fCentralityClass   = name           ; }
336   virtual void     SetCentralityOpt(Int_t opt)             { fCentralityOpt     = opt            ; }
337   virtual TString  GetCentralityClass()              const { return fCentralityClass             ; }
338   virtual Int_t    GetCentralityOpt()                const { return fCentralityOpt               ; }
339   virtual Int_t    GetEventCentrality()              const ;
340   virtual void     SetCentralityBin(Int_t min, Int_t max) //Set the centrality bin to select the event. If used, then need to get percentile
341                                                            { fCentralityBin[0]=min; fCentralityBin[1]=max;  
342                                                              if(min>=0 && max > 0) fCentralityOpt = 100 ; }
343   virtual Float_t  GetCentralityBin(Int_t i)         const { if(i < 0 || i > 1) return 0 ; 
344                                                              else return fCentralityBin[i]              ; }
345   
346   virtual AliEventplane* GetEventPlane()             const { if(fDataType!=kMC) return fInputEvent->GetEventplane() ;
347                                                              else               return 0x0       ; }  
348   virtual Double_t       GetEventPlaneAngle()        const ;          
349   virtual void           SetEventPlaneMethod(TString m)    { fEventPlaneMethod = m               ; }
350   virtual TString        GetEventPlaneMethod()       const { return fEventPlaneMethod            ; }
351
352   //--------------------
353   // Mixing
354   //--------------------
355
356   Int_t   GetLastCaloMixedEvent()                    const { return fLastMixedCaloEvent          ; }
357   Int_t   GetLastTracksMixedEvent ()                 const { return fLastMixedTracksEvent        ; }
358   
359   TList * GetListWithMixedEventsForCalo  (Int_t bi)  const { if(fListMixedCaloEvents)   return fListMixedCaloEvents[bi]     ; else return 0 ; }
360   TList * GetListWithMixedEventsForTracks(Int_t bi)  const { if(fListMixedTracksEvents) return fListMixedTracksEvents [bi]  ; else return 0 ; }  
361    
362   Bool_t  ListWithMixedEventsForCaloExists()         const { if(fListMixedCaloEvents) return kTRUE  ;
363                                                              else                     return kFALSE ; }
364
365   Bool_t  ListWithMixedEventsForTracksExists()       const { if(fListMixedTracksEvents) return kTRUE  ;
366                                                              else                       return kFALSE ; }
367   
368   void    SetLastCaloMixedEvent  (Int_t e)                 { fLastMixedCaloEvent    = e          ; }
369   void    SetLastTracksMixedEvent(Int_t e)                 { fLastMixedTracksEvent  = e          ; }
370   
371   void    SetListWithMixedEventsForCalo (TList ** l)       { 
372             if(fListMixedCaloEvents) printf("AliCaloTrackReader::SetListWithMixedEventsForCalo() - Track Mixing event list already set, nothing done\n");
373             else                        fListMixedCaloEvents    = l ; }
374   
375   void    SetListWithMixedEventsForTracks(TList ** l)      { 
376             if(fListMixedTracksEvents)  printf("AliCaloTrackReader::SetListWithMixedEventsForTracks() - Calorimeter Mixing event list already set, nothing done\n");
377             else                        fListMixedTracksEvents  = l ; }
378   
379   //-------------------------------------
380   // Other methods
381   //-------------------------------------
382   AliCalorimeterUtils * GetCaloUtils()               const { return fCaloUtils                   ; }
383   void             SetCaloUtils(AliCalorimeterUtils * caloutils)  { fCaloUtils = caloutils       ; }  
384   
385   virtual Double_t GetBField()                       const { return fInputEvent->GetMagneticField()  ; } 
386   
387   void    SetImportGeometryFromFile(Bool_t import, 
388                                     TString path = "")     { 
389                                                              fImportGeometryFromFile = import    ; 
390                                                              fImportGeometryFilePath = path      ; }      
391   
392   //------------------------------------------------
393   // MC analysis specific methods
394   //-------------------------------------------------
395   
396   //Kinematics and galice.root available 
397   virtual AliStack*          GetStack()              const ;
398   virtual AliHeader*         GetHeader()             const ;
399   virtual AliGenEventHeader* GetGenEventHeader()     const ;
400   
401   //Filtered kinematics in AOD  
402   virtual TClonesArray*     GetAODMCParticles(Int_t input = 0) const ;
403   virtual AliAODMCHeader*   GetAODMCHeader()         const ;
404         
405   virtual AliVEvent*        GetInputEvent()          const { return fInputEvent            ; }
406   virtual AliVEvent*        GetOriginalInputEvent()  const { return 0x0                    ; }
407   virtual AliAODEvent*      GetOutputEvent()         const { return fOutputEvent           ; }
408   virtual AliMCEvent*       GetMC()                  const { return fMC                    ; }
409   virtual AliMixedEvent*    GetMixedEvent()          const { return fMixedEvent            ; }
410   virtual Int_t             GetNMixedEvent()         const { return fNMixedEvent           ; } 
411   
412   void             SwitchOnStack()                         { fReadStack          = kTRUE   ; }
413   void             SwitchOffStack()                        { fReadStack          = kFALSE  ; }
414   void             SwitchOnAODMCParticles()                { fReadAODMCParticles = kTRUE   ; }
415   void             SwitchOffAODMCParticles()               { fReadAODMCParticles = kFALSE  ; }
416   Bool_t           ReadStack()                       const { return fReadStack             ; }
417   Bool_t           ReadAODMCParticles()              const { return fReadAODMCParticles    ; }
418         
419   //Select generated events, depending on comparison of pT hard and jets.
420   virtual Bool_t   ComparePtHardAndJetPt() ;
421   virtual Bool_t   IsPtHardAndJetPtComparisonSet()       const { return  fComparePtHardAndJetPt   ; }
422   virtual void     SetPtHardAndJetPtComparison(Bool_t compare) { fComparePtHardAndJetPt = compare ; }   
423   virtual Float_t  GetPtHardAndJetFactor()               const { return  fPtHardAndJetPtFactor    ; }
424   virtual void     SetPtHardAndJetPtFactor(Float_t factor)     { fPtHardAndJetPtFactor = factor   ; }           
425   
426   virtual Bool_t   ComparePtHardAndClusterPt() ;
427   virtual Bool_t   IsPtHardAndClusterPtComparisonSet()       const { return  fComparePtHardAndClusterPt   ; }
428   virtual void     SetPtHardAndClusterPtComparison(Bool_t compare) { fComparePtHardAndClusterPt = compare ; }   
429   virtual Float_t  GetPtHardAndClusterFactor()               const { return  fPtHardAndClusterPtFactor    ; }
430   virtual void     SetPtHardAndClusterPtFactor(Float_t factor)     { fPtHardAndClusterPtFactor = factor   ; }           
431   
432   
433   //MC reader methods, declared there to allow compilation, they are only used in the MC reader:
434   
435   virtual void AddNeutralParticlesArray(TArrayI & /*array*/) { ; }  
436   virtual void AddChargedParticlesArray(TArrayI & /*array*/) { ; } 
437   virtual void AddStatusArray(TArrayI & /*array*/)           { ; }
438   
439   virtual void SwitchOnPi0Decay()                            { ; } 
440   virtual void SwitchOffPi0Decay()                           { ; } 
441   virtual void SwitchOnStatusSelection()                     { ; }
442   virtual void SwitchOffStatusSelection()                    { ; }
443   virtual void SwitchOnOverlapCheck()                        { ; }
444   virtual void SwitchOffOverlapCheck()                       { ; }
445   virtual void SwitchOnOnlyGeneratorParticles()              { ; }
446   virtual void SwitchOffOnlyGeneratorParticles()             { ; }
447
448   virtual void SetEMCALOverlapAngle(Float_t /*angle*/)       { ; }
449   virtual void SetPHOSOverlapAngle(Float_t /*angle*/)        { ; }
450
451   
452  protected:
453   Int_t            fEventNumber;            // Event number
454   Int_t            fDataType ;              // Select MC:Kinematics, Data:ESD/AOD, MCData:Both
455   Int_t            fDebug;                  // Debugging level
456   AliFiducialCut * fFiducialCut;            //! Acceptance cuts
457   Bool_t           fCheckFidCut ;           // Do analysis for clusters in defined region         
458
459   Bool_t           fComparePtHardAndJetPt;  // In MonteCarlo, jet events, reject fake events with wrong jet energy.
460   Float_t          fPtHardAndJetPtFactor;   // Factor between ptHard and jet pT to reject/accept event.
461
462   Bool_t           fComparePtHardAndClusterPt;  // In MonteCarlo, jet events, reject events with too large cluster energy
463   Float_t          fPtHardAndClusterPtFactor;   // Factor between ptHard and cluster pT to reject/accept event.
464   
465   Float_t          fCTSPtMin;               // pT Threshold on charged particles 
466   Float_t          fEMCALPtMin;             // pT Threshold on emcal clusters
467   Float_t          fPHOSPtMin;              // pT Threshold on phos clusters
468   Float_t          fCTSPtMax;               // pT Threshold on charged particles 
469   Float_t          fEMCALPtMax;             // pT Threshold on emcal clusters
470   Float_t          fPHOSPtMax;              // pT Threshold on phos clusters
471   Bool_t           fUseEMCALTimeCut;        // Do time cut selection
472   Bool_t           fUseParamTimeCut;        // Use simple or parametrized time cut
473   Bool_t           fUseTrackTimeCut;        // Do time cut selection
474   Double_t         fEMCALTimeCutMin;        // Remove clusters/cells with time smaller than this value, in ns
475   Double_t         fEMCALTimeCutMax;        // Remove clusters/cells with time larger than this value, in ns
476   Float_t          fEMCALParamTimeCutMin[4];// Remove clusters/cells with time smaller than parametrized value, in ns
477   Double_t         fEMCALParamTimeCutMax[4];// Remove clusters/cells with time larger than parametrized value, in ns
478   Double_t         fTrackTimeCutMin;        // Remove tracks with time smaller than this value, in ns
479   Double_t         fTrackTimeCutMax;        // Remove tracks with time larger than this value, in ns
480   
481   TList          * fAODBranchList ;         //-> List with AOD branches created and needed in analysis
482   TObjArray      * fCTSTracks ;             //-> temporal array with tracks
483   TObjArray      * fEMCALClusters ;         //-> temporal array with EMCAL CaloClusters
484   TObjArray      * fPHOSClusters ;          //-> temporal array with PHOS  CaloClusters
485   AliVCaloCells  * fEMCALCells ;            //! temporal array with EMCAL CaloCells
486   AliVCaloCells  * fPHOSCells ;             //! temporal array with PHOS  CaloCells
487
488   AliVEvent      * fInputEvent;             //! pointer to esd or aod input
489   AliAODEvent    * fOutputEvent;            //! pointer to aod output
490   AliMCEvent     * fMC;                     //! Monte Carlo Event Handler  
491
492   Bool_t           fFillCTS;                // use data from CTS
493   Bool_t           fFillEMCAL;              // use data from EMCAL
494   Bool_t           fFillPHOS;               // use data from PHOS
495   Bool_t           fFillEMCALCells;         // use data from EMCAL
496   Bool_t           fFillPHOSCells;          // use data from PHOS
497   Bool_t           fRecalculateClusters;    // Correct clusters, recalculate them if recalibration parameters is given
498   Bool_t           fSelectEmbeddedClusters; // Use only simulated clusters that come from embedding.
499   
500   ULong_t          fTrackStatus        ;    // Track selection bit, select tracks refitted in TPC, ITS ...
501   ULong_t          fTrackFilterMask    ;    // Track selection bit, for AODs (any difference with track status?)
502   AliESDtrackCuts *fESDtrackCuts       ;    // Track cut 
503   Bool_t           fConstrainTrack     ;    // Constrain Track to vertex
504   Bool_t           fSelectHybridTracks ;    // Select CTS tracks of type hybrid (only for AODs)
505   Bool_t           fSelectSPDHitTracks ;    // Ensure that track hits SPD layers
506   Int_t            fTrackMult          ;    // Track multiplicity
507   Float_t          fTrackMultEtaCut    ;    // Track multiplicity eta cut
508   Bool_t           fReadStack          ;    // Access kine information from stack
509   Bool_t                 fReadAODMCParticles ;    // Access kine information from filtered AOD MC particles
510         
511   TString          fDeltaAODFileName   ;    // Delta AOD file name
512   TString          fFiredTriggerClassName;  // Name of trigger event type used to do the analysis
513
514   UInt_t           fEventTriggerMask ;      // select this triggerered event
515   UInt_t           fMixEventTriggerMask ;   // select this triggerered event for mixing, tipically kMB or kAnyINT
516   Bool_t           fEventTriggerAtSE;       // select triggered event at SE base task or here
517   
518   Bool_t           fAnaLED;                 // Analyze LED data only.
519
520   TString          fTaskName;               // Name of task that executes the analysis
521         
522   AliCalorimeterUtils * fCaloUtils ;        //  Pointer to CalorimeterUtils
523
524   AliMixedEvent  * fMixedEvent  ;           //! mixed event object. This class is not the owner
525   Int_t            fNMixedEvent ;           // number of events in mixed event buffer
526   Double_t      ** fVertex      ;           //! vertex array 3 dim for each mixed event buffer
527   
528   TList **         fListMixedTracksEvents ; //! Container for tracks stored for different events, used in case of own mixing, set in analysis class
529   TList **         fListMixedCaloEvents;    //! Container for photon stored for different events, used in case of own mixing, set in analysis class
530   Int_t            fLastMixedTracksEvent  ; //  Temporary container with the last event added to the mixing list for tracks
531   Int_t            fLastMixedCaloEvent ;    //  Temporary container with the last event added to the mixing list for photons
532   
533   Bool_t           fWriteOutputDeltaAOD;    // Write the created delta AOD objects into file  
534         Bool_t           fOldAOD;                 // Old AODs, before revision 4.20
535   
536   Int_t            fV0ADC[2]    ;           // Integrated V0 signal
537   Int_t            fV0Mul[2]    ;           // Integrated V0 Multiplicity
538
539   Bool_t           fCaloFilterPatch;        // CaloFilter patch
540   TString          fEMCALClustersListName;  // Alternative list of clusters produced elsewhere and not from InputEvent
541   
542   // Event selection
543   Float_t          fZvtxCut ;                      // Cut on vertex position
544   Bool_t           fAcceptFastCluster;           // Accept events from fast cluster, exclude these events for LHC11a
545   Bool_t           fRemoveLEDEvents;             // Remove events where LED was wrongly firing - EMCAL LHC11a
546   Bool_t           fDoEventSelection;            // Select events depending on V0, pileup, vertex well reconstructed, at least 1 track ...
547   Bool_t           fDoV0ANDEventSelection;       // Select events depending on V0, fDoEventSelection should be on
548   Bool_t           fUseEventsWithPrimaryVertex ; // Select events with primary vertex
549   AliTriggerAnalysis* fTriggerAnalysis;          // Access to trigger selection algorithm for V0AND calculation
550   Double_t         fPileUpParamSPD[5];           // Parameters to pass to method IsPileupFromSPD: Int_t minContributors,
551                                                  // Double_t minZdist, 
552                                                  // Double_t nSigmaZdist, 
553                                                  // Double_t nSigmaDiamXY, 
554                                                  // Double_t nSigmaDiamZ)
555   // Pile-up in EMCal
556   Int_t            fNPileUpClusters;             // Number of clusters with time avobe 20 ns
557   Int_t            fNNonPileUpClusters;          // Number of clusters with time below 20 ns
558   Int_t            fNPileUpClustersCut;          // Cut to select event as pile-up
559   Int_t            fEMCalBCEvent[19];            // Fill one entry per event if there is a cluster in a given BC
560   Int_t            fEMCalBCEventCut[19];         // Fill one entry per event if there is a cluster in a given BC, depend on cluster E, acceptance cut
561   Int_t            fTrackBCEvent[19];            // Fill one entry per event if there is a track in a given BC
562   Int_t            fTrackBCEventCut[19];         // Fill one entry per event if there is a track in a given BC, depend on track pT, acceptance cut
563
564   //Centrality/Event plane
565   TString          fCentralityClass;        // Name of selected centrality class     
566   Int_t            fCentralityOpt;          // Option for the returned value of the centrality, possible options 5, 10, 100
567   Int_t            fCentralityBin[2];       // Minimum and maximum value of the centrality for the analysis
568   TString          fEventPlaneMethod;       // Name of event plane method, by default "Q"
569   
570   Bool_t           fImportGeometryFromFile; // Import geometry settings in geometry.root file
571   TString          fImportGeometryFilePath; // path fo geometry.root file
572
573   
574   AliCaloTrackReader(              const AliCaloTrackReader & r) ; // cpy ctor
575   AliCaloTrackReader & operator = (const AliCaloTrackReader & r) ; // cpy assignment
576   
577   ClassDef(AliCaloTrackReader,47)
578   
579 } ;
580
581
582 #endif //ALICALOTRACKREADER_H
583
584
585