]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGDQ/dielectron/AliDielectron.h
o update package
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectron.h
1 #ifndef ALIDIELECTRON_H
2 #define ALIDIELECTRON_H
3 /* Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 //#####################################################
7 //#                                                   # 
8 //#             Class AliDielectron                   #
9 //#         Main Class for e+e- analysis              #
10 //#                                                   #
11 //#  by WooJin J. Park, GSI / W.J.Park@gsi.de         #
12 //#     Ionut C. Arsene, GSI / I.C.Arsene@gsi.de      #
13 //#     Magnus Mager, CERN / Magnus.Mager@cern.ch     #
14 //#     Jens Wiechula, Uni HD / Jens.Wiechula@cern.ch #
15 //#                                                   #
16 //#####################################################
17
18
19 #include <TNamed.h>
20 #include <TObjArray.h>
21
22 #include <AliAnalysisFilter.h>
23 #include <AliKFParticle.h>
24
25 #include "AliDielectronHistos.h"
26
27 class AliEventplane;
28 class AliVEvent;
29 class AliMCEvent;
30 class THashList;
31 class AliDielectronCF;
32 class AliDielectronDebugTree;
33 class AliDielectronTrackRotator;
34 class AliDielectronPair;
35 class AliDielectronSignalMC;
36 class AliDielectronMixingHandler;
37
38 //________________________________________________________________
39 class AliDielectron : public TNamed {
40
41   friend class AliDielectronMixingHandler; //mixing as friend class
42
43 public:
44   enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
45       kEv1PEv2P, kEv1MEv2P, kEv2PP,
46       kEv1PEv2M, kEv1MEv2M, kEv2PM,
47       kEv2MM, kEv1PMRot };
48   enum ELegType  { kEv1P, kEv1M, kEv2P, kEv2M };
49   
50   AliDielectron();
51   AliDielectron(const char* name, const char* title);
52   virtual ~AliDielectron();
53
54   void Init();
55   
56   void Process(AliVEvent *ev1, AliVEvent *ev2=0);
57
58   const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
59   const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
60   const AliAnalysisFilter& GetPairFilter()  const { return fPairFilter;  }
61
62   AliAnalysisFilter& GetEventFilter()       { return fEventFilter;       }
63   AliAnalysisFilter& GetTrackFilter()       { return fTrackFilter;       }
64   AliAnalysisFilter& GetPairFilter()        { return fPairFilter;        }
65   AliAnalysisFilter& GetPairPreFilter()     { return fPairPreFilter;     }
66   AliAnalysisFilter& GetPairPreFilterLegs() { return fPairPreFilterLegs; }
67   AliAnalysisFilter& GetEventPlanePreFilter(){ return fEventPlanePreFilter; }
68   AliAnalysisFilter& GetEventPlanePOIPreFilter(){ return fEventPlanePOIPreFilter; }
69
70   void  SetMotherPdg( Int_t pdgMother ) { fPdgMother=pdgMother; }
71   void  SetLegPdg(Int_t pdgLeg1, Int_t pdgLeg2) { fPdgLeg1=pdgLeg1; fPdgLeg2=pdgLeg2; }
72   Int_t GetMotherPdg() const { return fPdgMother; }
73   Int_t GetLeg1Pdg()   const { return fPdgLeg1;   }
74   Int_t GetLeg2Pdg()   const { return fPdgLeg2;   }
75
76   void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
77   const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
78   const TObjArray* GetPairArray(Int_t i)  const {return (i>=0&&i<11)?
79       static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}
80
81   TObjArray** GetPairArraysPointer() { return &fPairCandidates; }
82   
83   void SetHistogramManager(AliDielectronHistos * const histos) { fHistos=histos; }
84   AliDielectronHistos* GetHistoManager() const { return fHistos; }
85   const THashList * GetHistogramList() const { return fHistos?fHistos->GetHistogramList():0x0; }
86
87   Bool_t HasCandidates() const { return GetPairArray(1)?GetPairArray(1)->GetEntriesFast()>0:0; }
88   Bool_t HasCandidatesLikeSign() const {
89     return (GetPairArray(0)&&GetPairArray(2)) ? (GetPairArray(0)->GetEntriesFast()>0 || GetPairArray(2)->GetEntriesFast()>0) : 0;
90   }
91   
92   Bool_t HasCandidatesTR() const {return GetPairArray(10)?GetPairArray(10)->GetEntriesFast()>0:0;} 
93   void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
94   AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
95
96   void SetPreFilterEventPlane(Bool_t setValue=kTRUE){fPreFilterEventPlane=setValue;};
97   void SetLikeSignSubEvents(Bool_t setValue=kTRUE){fLikeSignSubEvents=setValue;};
98   void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
99   void SetPreFilterAllSigns(Bool_t setValue=kTRUE){fPreFilterAllSigns=setValue;};
100
101   void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
102   AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
103
104   void SetMixingHandler(AliDielectronMixingHandler *mix) { fMixing=mix; }
105   AliDielectronMixingHandler* GetMixingHandler() const { return fMixing; }
106
107   void SetHasMC(Bool_t hasMC) { fHasMC = hasMC; }
108   Bool_t GetHasMC() const     { return fHasMC;  }
109
110   void SetStoreRotatedPairs(Bool_t storeTR) {fStoreRotatedPairs = storeTR;}
111
112   void AddSignalMC(AliDielectronSignalMC* signal);  
113
114   void SetDebugTree(AliDielectronDebugTree * const tree) { fDebugTree=tree; }
115
116   const TObjArray* GetMCSignals() const { return fSignalsMC; }
117   static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
118   static const char* PairClassName(Int_t i)  { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }
119
120   void SetEstimatorFilename(const Char_t* filename) {fEstimatorFilename = filename;}
121   void SetTRDcorrectionFilename(const Char_t* filename) {fTRDpidCorrectionFilename = filename;}
122   void SetVZEROCalibrationFilename(const Char_t* filename) {fVZEROCalibrationFilename = filename;}
123   void SetVZERORecenteringFilename(const Char_t* filename) {fVZERORecenteringFilename = filename;}
124
125   void SaveDebugTree();
126
127 private:
128   
129   AliAnalysisFilter fEventFilter;    // Event cuts
130   AliAnalysisFilter fTrackFilter;    // leg cuts
131   AliAnalysisFilter fPairPreFilter;  // pair prefilter cuts
132   AliAnalysisFilter fPairPreFilterLegs; // Leg filter after the pair prefilter cuts
133   AliAnalysisFilter fPairFilter;     // pair cuts
134   AliAnalysisFilter fEventPlanePreFilter;  // event plane prefilter cuts  
135   AliAnalysisFilter fEventPlanePOIPreFilter;  // PoI cuts in the event plane prefilter  
136
137   Int_t fPdgMother;     // pdg code of mother tracks
138   Int_t fPdgLeg1;       // pdg code leg1
139   Int_t fPdgLeg2;       // pdg code leg2
140
141   TObjArray* fSignalsMC;      // array of AliDielectronSignalMC
142
143   Bool_t fNoPairing;    // if to skip pairing, can be used for track QA only
144     
145   AliDielectronHistos *fHistos;   // Histogram manager
146                                   //  Streaming and merging should be handled
147                                   //  by the analysis framework
148  
149   TObjArray fTracks[4];           //! Selected track candidates
150                                   //  0: Event1, positive particles
151                                   //  1: Event1, negative particles
152                                   //  2: Event2, positive particles
153                                   //  3: Event2, negative particles
154
155   TObjArray *fPairCandidates;     //! Pair candidate arrays
156                                   //TODO: better way to store it? TClonesArray?
157
158   AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
159   AliDielectronTrackRotator *fTrackRotator; //Track rotator
160   AliDielectronDebugTree *fDebugTree;  // Debug tree output
161   AliDielectronMixingHandler *fMixing; // handler for event mixing
162
163   Bool_t fPreFilterEventPlane;  //Filter for the Eventplane determination in TPC
164   Bool_t fLikeSignSubEvents;    //Option for dividing into subevents, sub1 ++ sub2 --
165   Bool_t fPreFilterUnlikeOnly;  //Apply PreFilter either in +- or to ++/--/+- individually
166   Bool_t fPreFilterAllSigns;    //Apply PreFilter find in  ++/--/+- and remove from all
167   Bool_t fHasMC;                //If we run with MC, at the moment only needed in AOD
168   Bool_t fStoreRotatedPairs;    //It the rotated pairs should be stored in the pair array 
169  
170   void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
171   void EventPlanePreFilter(Int_t arr1, Int_t arr2, TObjArray arrTracks1, TObjArray arrTracks2, const AliVEvent *ev, AliEventplane *cevplane);
172   void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
173   void FillPairArrays(Int_t arr1, Int_t arr2);
174   void FillPairArrayTR();
175   
176   Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}
177
178   void InitPairCandidateArrays();
179   void ClearArrays();
180   
181   TObjArray* PairArray(Int_t i);
182   
183   static const char* fgkTrackClassNames[4];   //Names for track arrays
184   static const char* fgkPairClassNames[11];   //Names for pair arrays
185
186   TString fEstimatorFilename;                // name for the pp multiplicity estimators filename
187   TString fTRDpidCorrectionFilename;         // name for the file containing the single particle TRD pid corrections
188   TString fVZEROCalibrationFilename;         // file containing VZERO channel-by-channel calibration
189   TString fVZERORecenteringFilename;         // file containing VZERO Q-vector recentering averages
190
191   void ProcessMC(AliVEvent *ev1);
192   
193   void  FillHistograms(const AliVEvent *ev, Bool_t pairInfoOnly=kFALSE);
194   void  FillHistogramsMC(const AliMCEvent *ev,  AliVEvent *ev1);
195   void  FillHistogramsPair(AliDielectronPair *pair,Bool_t fromPreFilter=kFALSE);
196   void  FillHistogramsTracks(TObjArray **tracks);
197
198   void  FillDebugTree();
199
200   AliDielectron(const AliDielectron &c);
201   AliDielectron &operator=(const AliDielectron &c);
202   
203   ClassDef(AliDielectron,4);
204 };
205
206 inline void AliDielectron::InitPairCandidateArrays()
207 {
208   //
209   // initialise all pair candidate arrays
210   //
211   fPairCandidates->SetOwner();
212   for (Int_t i=0;i<11;++i){
213     TObjArray *arr=new TObjArray;
214     fPairCandidates->AddAt(arr,i);
215     arr->SetOwner();
216   }
217 }
218
219 inline TObjArray* AliDielectron::PairArray(Int_t i)
220 {
221   //
222   // for internal use only: unchecked return of track array for fast access
223   //
224   return static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i));
225 }
226
227 inline void AliDielectron::ClearArrays()
228 {
229   //
230   // Reset the Arrays
231   //
232   for (Int_t i=0;i<4;++i){
233     fTracks[i].Clear();
234   }
235   for (Int_t i=0;i<11;++i){
236     if (PairArray(i)) PairArray(i)->Delete();
237   }
238 }
239
240 #endif