]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/CaloTrackCorrBase/AliAnaCaloTrackCorrBaseClass.h
Merge branch 'master_patch'
[u/mrichter/AliRoot.git] / PWG / CaloTrackCorrBase / AliAnaCaloTrackCorrBaseClass.h
1 #ifndef ALIANACALOTRACKCORRBASECLASS_H
2 #define ALIANACALOTRACKCORRBASECLASS_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 CaloTrackCorr analysis algorithms
8 //-- Author: Gustavo Conesa (INFN-LNF, LPSC-Grenoble)
9 //-- Add the possibility for event selection analysis based on 
10 //   vertex and multiplicity bins (Yaxian Mao, 10/10/2010)
11 //
12 //_________________________________________________________________________
13
14 #include <cstdlib>
15
16 //ROOT
17 #include <TList.h> 
18 #include <TObject.h>
19 class TClonesArray ;
20 class TObjArray ;
21 class TObjString;
22
23 //Analysis
24 #include "AliCaloTrackReader.h"   
25 #include "AliCaloPID.h"
26 #include "AliFiducialCut.h"
27 #include "AliIsolationCut.h"
28 #include "AliMCAnalysisUtils.h"
29 #include "AliNeutralMesonSelection.h"
30 #include "AliCalorimeterUtils.h" 
31 #include "AliHistogramRanges.h"
32 #include "AliAODPWG4ParticleCorrelation.h"
33 #include "AliMixedEvent.h" 
34 class AliVCaloCells;
35 class AliStack ; 
36 class AliHeader ; 
37 class AliGenEventHeader ; 
38 class AliEMCALGeometry;
39 class AliPHOSGeoUtils;
40 class AliCentrality;
41 class AliEventplane;
42 #include "AliAnalysisManager.h"
43 #include "AliLog.h"
44
45 //jets
46 class AliAODJetEventBackground;
47
48 class AliAnaCaloTrackCorrBaseClass : public TObject {
49         
50 public:   
51   AliAnaCaloTrackCorrBaseClass() ;          // default ctor
52   virtual ~AliAnaCaloTrackCorrBaseClass() ; // virtual dtor
53   
54   //General methods, to be declared in deriving classes if needed
55   
56   virtual TList *        GetCreateOutputObjects()               { return (new TList)          ; }
57   
58   virtual void           Init()                                 { ; }
59   virtual void           InitDebug()      ;
60   virtual void           InitParameters() ;
61   
62   virtual void           FillEventMixPool()                     { ; }
63
64   virtual void           MakeAnalysisFillAOD()                  { ; }
65   
66   virtual void           MakeAnalysisFillHistograms()           { ; }  
67     
68   virtual void           Print(const Option_t * ) const ;
69   
70   virtual void           Terminate(TList * /*outputList*/)      { ; }
71
72   //Histograms, cuts 
73         
74   virtual void           AddToHistogramsName(TString add)       { fAddToHistogramsName = add  ; }
75   virtual TString        GetAddedHistogramsStringToName() const { return fAddToHistogramsName ; }
76   
77   virtual TObjString *   GetAnalysisCuts()                      { return 0x0                  ; }
78   virtual TString              GetBaseParametersList();
79   
80   //Getters, setters
81   virtual Int_t          GetDebug()                       const { return fDebug               ; }
82   virtual void           SetDebug(Int_t d)                      { fDebug = d                  ; }
83   
84   virtual Int_t          GetEventNumber() const ;
85   
86   // Track multiplicity
87   virtual Int_t GetTrackMultiplicity()                     const { return fReader->GetTrackMultiplicity() ; }
88   
89   //Centrality
90   virtual AliCentrality* GetCentrality()                   const { return fReader->GetCentrality()       ; }
91   virtual Int_t          GetEventCentrality()              const { if(fUseTrackMultBins)
92                                                                         return GetTrackMultiplicity();
93                                                                    else return fReader->GetEventCentrality(); }
94   
95   //Event plane
96   virtual AliEventplane* GetEventPlane()                   const { return fReader->GetEventPlane()       ; }           
97   virtual Double_t       GetEventPlaneAngle()              const { return fReader->GetEventPlaneAngle()  ; }           
98   virtual TString        GetEventPlaneMethod()             const { return fReader->GetEventPlaneMethod() ; }
99   
100   //AOD branch
101   virtual void           AddAODParticle(AliAODPWG4Particle part) ;
102   
103   virtual void           ConnectInputOutputAODBranches();
104   
105   virtual TClonesArray * GetCreateOutputAODBranch() ;
106   
107   virtual TString        GetInputAODName()                 const { return fInputAODName  ; }
108   virtual void           SetInputAODName(TString name)           { fInputAODName = name  ; }
109   
110   virtual TString        GetOutputAODName()                const { return fOutputAODName ; }
111   virtual void           SetOutputAODName(TString name)          { fNewAOD = kTRUE ; fOutputAODName = name; }
112   
113   virtual Bool_t         NewOutputAOD()                    const { return fNewAOD        ; }
114   
115   virtual TString        GetOutputAODClassName()           const { return fOutputAODClassName ; }
116   virtual void           SetOutputAODClassName(TString name)     { fOutputAODClassName = name ; }
117   
118   virtual TString        GetAODObjArrayName()              const { return fAODObjArrayName ; }
119   virtual void           SetAODObjArrayName(TString name)        { fAODObjArrayName = name ; }
120   
121   virtual TClonesArray * GetInputAODBranch()               const { return fInputAODBranch  ; }
122   virtual TClonesArray * GetOutputAODBranch()              const { if(fNewAOD) return fOutputAODBranch; else return fInputAODBranch ; }
123   virtual TClonesArray * GetAODBranch(const TString & aodBranchName) const ;
124         
125   //Track cluster arrays access methods
126   virtual TClonesArray*  GetAODCaloClusters()              const ; // Output AOD clusters, not used?
127   virtual TClonesArray*  GetAODTracks()                    const ; // Output AOD tracks,   not used?
128   virtual AliVCaloCells* GetPHOSCells()                    const { return fReader->GetPHOSCells()  ; }
129   virtual AliVCaloCells* GetEMCALCells()                   const { return fReader->GetEMCALCells() ; }
130   virtual TObjArray*     GetCTSTracks()                    const ;
131   virtual TObjArray*     GetEMCALClusters()                const ;
132   virtual TObjArray*     GetPHOSClusters()                 const ;
133   
134
135   //jets
136   virtual TClonesArray*  GetNonStandardJets()              const { return fReader->GetNonStandardJets() ;}
137   virtual AliAODJetEventBackground*  GetBackgroundJets()   const { return fReader->GetBackgroundJets() ;}
138
139   // Common analysis switchs 
140   
141   enum detector { kEMCAL = AliFiducialCut::kEMCAL, kPHOS = AliFiducialCut::kPHOS,
142                   kCTS   = AliFiducialCut::kCTS  , kDCAL = AliFiducialCut::kDCAL,
143                   kDCALPHOS = AliFiducialCut::kDCALPHOS } ;
144
145   virtual Int_t          GetCalorimeter()                 const  { return fCalorimeter          ; }
146   virtual TString        GetCalorimeterString()           const  { return fCalorimeterString    ; }
147   virtual void           SetCalorimeter(TString & calo);
148   virtual void           SetCalorimeter(Int_t calo) ;
149
150   virtual Bool_t         IsDataMC()                        const { return fDataMC                ; }
151   virtual void           SwitchOnDataMC()                        { fDataMC = kTRUE ;
152                                                                    if(!fMCUtils) fMCUtils = new AliMCAnalysisUtils() ; }
153   virtual void           SwitchOffDataMC()                       { fDataMC = kFALSE              ; }
154   
155   virtual Bool_t         IsFiducialCutOn()                 const { return fCheckFidCut           ; }
156   virtual void           SwitchOnFiducialCut()                   { fCheckFidCut = kTRUE ;
157                                                                    if(!fFidCut)  fFidCut   = new AliFiducialCut()     ; }
158   virtual void           SwitchOffFiducialCut()                  { fCheckFidCut = kFALSE         ; }
159
160   virtual Bool_t         IsRealCaloAcceptanceOn()          const { return fCheckRealCaloAcc      ; }
161   virtual void           SwitchOnRealCaloAcceptance()            { fCheckRealCaloAcc = kTRUE;  }
162   virtual void           SwitchOffRealCaloAcceptance()           { fCheckRealCaloAcc = kFALSE    ; }
163   
164   virtual Bool_t         IsCaloPIDOn()                     const { return fCheckCaloPID          ; }
165   virtual void           SwitchOnCaloPID()                       { fCheckCaloPID = kTRUE ;
166                                                                    if(!fCaloPID)  fCaloPID = new AliCaloPID()         ; }
167   virtual void           SwitchOffCaloPID()                      { fCheckCaloPID = kFALSE        ; }
168   
169   virtual Bool_t         MakePlotsOn()                     const { return fMakePlots             ; }
170   virtual void           SwitchOnPlotsMaking()                   { fMakePlots = kTRUE            ; }
171   virtual void           SwitchOffPlotsMaking()                  { fMakePlots = kFALSE           ; }
172   
173   virtual Bool_t         IsPileUpAnalysisOn()              const { return fFillPileUpHistograms  ; }
174   virtual void           SwitchOnFillPileUpHistograms()          { fFillPileUpHistograms = kTRUE ; }
175   virtual void           SwitchOffFillPileUpHistograms()         { fFillPileUpHistograms = kFALSE; }
176   
177   virtual Bool_t         IsHighMultiplicityAnalysisOn()     const { return fFillHighMultHistograms   ; }
178   virtual void           SwitchOnFillHighMultiplicityHistograms() { fFillHighMultHistograms = kTRUE  ; }
179   virtual void           SwitchOffFillHighMultiplicityHistograms(){ fFillHighMultHistograms = kFALSE ; }
180
181   // Cluster energy/momentum cut
182   
183   virtual Float_t        GetMaxPt()                        const { return fMaxPt ; }
184   virtual Float_t        GetMinPt()                        const { return fMinPt ; }
185   virtual void           SetMaxPt(Float_t pt)                    { fMaxPt = pt   ; }
186   virtual void           SetMinPt(Float_t pt)                    { fMinPt = pt   ; }
187   virtual void           SetPtCutRange(Double_t mi, Double_t ma) { fMaxPt = ma;  fMinPt=mi; }
188   
189   virtual Float_t        GetMaxEnergy()                    const { return fMaxPt ; }
190   virtual Float_t        GetMinEnergy()                    const { return fMinPt ; }
191   virtual void           SetMaxEnergy(Float_t e)                 { fMaxPt = e    ; }
192   virtual void           SetMinEnergy(Float_t e)                 { fMinPt = e    ; }
193   virtual void           SetEnergyCutRange(Double_t mi, Double_t ma) { fMaxPt = ma;   fMinPt = mi; }
194   
195   //Cluster Pairs Time cut  
196   virtual void           SetPairTimeCut(Float_t t)               { fPairTimeCut  = t   ; } //ns
197   virtual Float_t        GetPairTimeCut()                  const { return fPairTimeCut ; } //ns
198   
199   // Number of TRD modules in front of EMCAL (year <=2012)
200   Int_t                  GetFirstSMCoveredByTRD()          const { return fTRDSMCovered ; }
201   void                   SetFirstSMCoveredByTRD(Int_t n)         { fTRDSMCovered    = n ; }
202   
203   //Getters / Setters for parameters of event buffers
204   
205   virtual Int_t          GetNZvertBin()                    const { return fNZvertBin ; } // number of bins in vertex
206   virtual Int_t          GetNRPBin()                       const { return fNrpBin    ; } // number of bins in reaction plain
207   virtual Int_t          GetNCentrBin()                    const { return fNCentrBin ; } // number of bins in centrality
208   virtual Int_t          GetNTrackMultBin()                const { return GetNCentrBin(); } // number of bins in track multiplicity
209   virtual Int_t          GetNMaxEvMix()                    const { return fNmaxMixEv ; } // maximal number of events for mixin
210   virtual Float_t        GetZvertexCut()                   const { return GetReader()->GetZvertexCut();} // cut on vertex position
211   virtual Int_t          GetTrackMultiplicityBin()         const ;
212   virtual Int_t          GetEventCentralityBin()           const ;
213   virtual Int_t          GetEventRPBin()                   const ;
214   virtual Int_t          GetEventVzBin()                   const ;
215   virtual Int_t          GetEventMixBin()                  const ;
216   virtual Int_t          GetEventMixBin(Int_t iCen, Int_t iVz, Int_t iRP) const;
217   
218   virtual void           SetNZvertBin(Int_t n = 1 )              { fNZvertBin = n ; if(n < 1) fNZvertBin = 1 ; } // number of bins for vertex position
219   virtual void           SetNRPBin   (Int_t n = 1 )              { fNrpBin    = n ; if(n < 1) fNrpBin    = 1 ; } // number of bins in reaction plain
220   virtual void           SetNCentrBin(Int_t n = 1 )              { fNCentrBin = n ; if(n < 1) fNCentrBin = 1 ; } // number of bins in centrality
221   virtual void           SetNTrackMultBin(Int_t n = 1 )          { SetNCentrBin(n); } // number of bins in track multiplicity
222   virtual void           SetNMaxEvMix(Int_t n = 20)              { fNmaxMixEv = n ; if(n < 1) fNmaxMixEv = 1 ; } // maximal number of events for mixing
223   virtual void           SetTrackMultiplicityBin(Int_t bin, Int_t mult) { if(bin < 20) fTrackMultBins[bin] = mult ; }
224   
225   virtual void           SwitchOnTrackMultBins()                 { fUseTrackMultBins = kTRUE  ; }
226   virtual void           SwitchOffTrackMultBins()                { fUseTrackMultBins = kFALSE ; }
227   
228   virtual void           SwitchOnOwnMix()                        { fDoOwnMix         = kTRUE  ; }
229   virtual void           SwitchOffOwnMix()                       { fDoOwnMix         = kFALSE ; }
230   
231   virtual Bool_t         DoOwnMix()                        const { return fDoOwnMix           ; }
232   virtual Bool_t         UseTrackMultBins()                const { return fUseTrackMultBins   ; }
233
234   //Mixed event  
235   virtual Int_t           CheckMixedEventVertex(Int_t caloLabel, Int_t trackLabel) ;
236   virtual AliMixedEvent * GetMixedEvent()                  const { return GetReader()->GetMixedEvent()  ; }
237   virtual Int_t           GetNMixedEvent()                 const { return GetReader()->GetNMixedEvent() ; } 
238   
239   //Vertex methods
240   virtual void           GetVertex(Double_t vertex[3])     const { GetReader()->GetVertex(vertex)       ; } 
241   virtual Double_t*      GetVertex(Int_t evtIndex)         const { return GetReader()->GetVertex(evtIndex) ; }
242   virtual void           GetVertex(Double_t vertex[3],
243                                    Int_t evtIndex)         const { GetReader()->GetVertex(vertex,evtIndex) ; }
244   //VZERO
245   
246   virtual Int_t GetV0Signal(Int_t i )                      const { return fReader->GetV0Signal(i)         ; }
247   
248   virtual Int_t GetV0Multiplicity(Int_t i )                const { return fReader->GetV0Multiplicity(i)   ; }
249   
250   
251   //MC event acces methods
252   virtual AliStack *                 GetMCStack()          const ;
253   
254   virtual AliHeader*                 GetMCHeader()         const ;
255   
256   virtual AliGenEventHeader        * GetMCGenEventHeader() const ;
257   
258   //Analysis helpers classes pointers setters and getters
259   
260   virtual AliCaloPID               * GetCaloPID()                { if(!fCaloPID) fCaloPID = new AliCaloPID();               return  fCaloPID ; }
261   
262   virtual AliCalorimeterUtils      * GetCaloUtils()        const { return fCaloUtils            ; }
263   
264   virtual AliFiducialCut           * GetFiducialCut()            { if(!fFidCut)  fFidCut  = new AliFiducialCut();           return  fFidCut  ; }
265   
266   virtual AliHistogramRanges       * GetHistogramRanges()        { if(!fHisto)   fHisto   = new AliHistogramRanges();       return  fHisto   ; }
267   
268   virtual AliIsolationCut          * GetIsolationCut()           { if(!fIC)      fIC      = new AliIsolationCut();          return  fIC      ; }
269   
270   virtual AliMCAnalysisUtils       * GetMCAnalysisUtils()        { if(!fMCUtils) fMCUtils = new AliMCAnalysisUtils();       return  fMCUtils ; }
271   
272   virtual AliNeutralMesonSelection * GetNeutralMesonSelection()  { if(!fNMS)     fNMS     = new AliNeutralMesonSelection(); return  fNMS     ; }
273   
274   virtual AliCaloTrackReader       * GetReader()           const { return fReader                        ; }
275   
276   virtual AliEMCALGeometry         * GetEMCALGeometry()    const { return fCaloUtils->GetEMCALGeometry() ; }
277   
278   virtual AliPHOSGeoUtils          * GetPHOSGeometry()     const { return fCaloUtils->GetPHOSGeometry()  ; }
279
280   virtual void                       SetCaloPID(AliCaloPID * pid)                                   { delete fCaloPID; fCaloPID = pid     ; }
281   
282   virtual void                       SetCaloUtils(AliCalorimeterUtils * caloutils)                  { fCaloUtils = caloutils              ; }   
283   
284   virtual void                       SetFiducialCut(AliFiducialCut * fc)                            { delete fFidCut;  fFidCut  = fc      ; }
285   
286   virtual void                       SetHistogramRanges(AliHistogramRanges * hr)                    { delete fHisto;   fHisto   = hr      ; }
287   
288   virtual void                       SetIsolationCut(AliIsolationCut * ic)                          { delete fIC;      fIC      = ic      ; }
289   
290   virtual void                       SetMCAnalysisUtils(AliMCAnalysisUtils * mcutils)               { delete fMCUtils; fMCUtils = mcutils ; }
291   
292   virtual void                       SetNeutralMesonSelection(AliNeutralMesonSelection * const nms) { delete fNMS;     fNMS     = nms     ; }
293   
294   virtual void                       SetReader(AliCaloTrackReader * reader)                         { fReader = reader                    ; }
295   
296   //Calorimeter specific access methods and calculations
297     
298   virtual Bool_t         IsTrackMatched(AliVCluster * cluster, AliVEvent* event) {
299    return GetCaloPID()->IsTrackMatched(cluster, fCaloUtils, event) ; } 
300   
301   virtual Int_t          GetModuleNumberCellIndexes(Int_t absId, Int_t calo, Int_t & icol, Int_t & irow, Int_t &iRCU) const {
302           return fCaloUtils->GetModuleNumberCellIndexes(absId, calo, icol, irow,iRCU) ; }
303   
304   virtual Int_t          GetModuleNumber(AliAODPWG4Particle * part) const {
305           return fCaloUtils->GetModuleNumber(part, fReader->GetInputEvent()) ; }
306   
307   virtual Int_t          GetModuleNumber(AliVCluster * cluster)     const {
308           return fCaloUtils->GetModuleNumber(cluster) ; }
309   
310   virtual AliVCluster*   FindCluster(TObjArray* clusters, const Int_t id, Int_t & iclus, const Int_t first=0) ;
311
312 private:    
313   
314   Bool_t                     fDataMC ;             // Flag to access MC data when using ESD or AOD     
315   Int_t                      fDebug ;              // Debug level
316   Int_t                      fCalorimeter ;        // Calorimeter selection
317   TString                    fCalorimeterString ;  // Calorimeter selection
318   Bool_t                     fCheckFidCut ;        // Do analysis for clusters in defined region
319   Bool_t                     fCheckRealCaloAcc ;   // When analysis of MC particle kinematics, check their hit in Calorimeter in Real Geometry or use FidCut
320   Bool_t                     fCheckCaloPID ;       // Do analysis for calorimeters
321   Bool_t                     fRecalculateCaloPID ; // Recalculate PID or use PID weights in calorimeters
322   Float_t                    fMinPt ;              // Maximum pt of (trigger) particles in the analysis
323   Float_t                    fMaxPt ;              // Minimum pt of (trigger) particles in the analysis
324   Float_t                    fPairTimeCut;         // Maximum difference between time of cluster pairs (ns)
325   Int_t                      fTRDSMCovered;        // From which SM EMCal is covered by TRD
326   
327   Int_t                      fNZvertBin ;                // Number of bins in event container for vertex position
328   Int_t                      fNrpBin ;             // Number of bins in event container for reaction plain
329   Int_t                      fNCentrBin ;                // Number of bins in event container for centrality
330   Int_t                      fNmaxMixEv ;                // Maximal number of events stored in buffer for mixing
331   Bool_t                     fDoOwnMix;            // Do combinatorial background not the one provided by the frame
332   Bool_t                     fUseTrackMultBins;    // Use track multiplicity and not centrality bins in mixing
333   Int_t                      fTrackMultBins[20];   // Multiplicity bins limits. Number of bins set with SetNTrackMult() that calls SetNCentrBin().
334   Bool_t                     fFillPileUpHistograms;   // Fill pile-up related histograms
335   Bool_t                     fFillHighMultHistograms; // Histograms with centrality and event plane for triggers pT
336   Bool_t                     fMakePlots   ;        // Print plots
337     
338   TClonesArray*              fInputAODBranch ;     //! Selected input particles branch
339   TString                    fInputAODName ;       //  Name of input AOD branch;
340   TClonesArray*              fOutputAODBranch ;    //! Selected output particles branch
341   Bool_t                     fNewAOD ;             //  Flag, new aod branch added to the analysis or not.
342   TString                    fOutputAODName ;      //  Name of output AOD branch;
343   TString                    fOutputAODClassName;  //  Type of aod objects to be stored in the TClonesArray (AliAODPWG4Particle, AliAODPWG4ParticleCorrelation ...)     
344   TString                    fAODObjArrayName ;    //  Name of ref array kept in a TList in AliAODParticleCorrelation with clusters or track references.
345   TString                    fAddToHistogramsName; //  Add this string to histograms name
346   
347   //Analysis helper classes access pointers
348   AliCaloPID               * fCaloPID;             // PID calculation
349   AliCalorimeterUtils      * fCaloUtils ;          // Pointer to CalorimeterUtils
350   AliFiducialCut           * fFidCut;              // Acceptance cuts
351   AliHistogramRanges       * fHisto ;              // Histogram ranges container
352   AliIsolationCut          * fIC;                  // Isolation cut 
353   AliMCAnalysisUtils       * fMCUtils;             // MonteCarlo Analysis utils 
354   AliNeutralMesonSelection * fNMS;                 // Neutral Meson Selection
355   AliCaloTrackReader       * fReader;              // Acces to ESD/AOD/MC data
356
357   AliAnaCaloTrackCorrBaseClass(              const AliAnaCaloTrackCorrBaseClass & bc) ; // cpy ctor
358   AliAnaCaloTrackCorrBaseClass & operator = (const AliAnaCaloTrackCorrBaseClass & bc) ; // cpy assignment
359   
360   ClassDef(AliAnaCaloTrackCorrBaseClass,26)
361 } ;
362
363
364 #endif //ALIANACALOTRACKCORRBASECLASS_H
365
366
367