]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/dielectron/AliDielectron.h
Implemented NxM cluster finder
[u/mrichter/AliRoot.git] / PWG3 / 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 AliVEvent;
28 class THashList;
29 class AliDielectronCF;
30 class AliDielectronDebugTree;
31 class AliDielectronTrackRotator;
32 class AliDielectronPair;
33
34 //________________________________________________________________
35 class AliDielectron : public TNamed {
36   
37 public:
38   enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
39       kEv1PEv2P, kEv1MEv2P, kEv2PP,
40       kEv1PEv2M, kEv1MEv2M, kEv2PM,
41       kEv2MM, kEv1PMRot };
42   enum ELegType  { kEv1P, kEv1M, kEv2P, kEv2M };
43   
44   AliDielectron();
45   AliDielectron(const char* name, const char* title);
46   virtual ~AliDielectron();
47
48   void Init();
49   
50   void Process(AliVEvent *ev1, AliVEvent *ev2=0);
51
52   const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
53   const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
54   const AliAnalysisFilter& GetPairFilter()  const { return fPairFilter;  }
55
56   AliAnalysisFilter& GetEventFilter()       { return fEventFilter;       }
57   AliAnalysisFilter& GetTrackFilter()       { return fTrackFilter;       }
58   AliAnalysisFilter& GetPairFilter()        { return fPairFilter;        }
59   AliAnalysisFilter& GetPairPreFilter()     { return fPairPreFilter;     }
60   AliAnalysisFilter& GetPairPreFilterLegs() { return fPairPreFilterLegs; }
61   
62   void  SetMotherPdg( Int_t pdgMother ) { fPdgMother=pdgMother; }
63   void  SetLegPdg(Int_t pdgLeg1, Int_t pdgLeg2) { fPdgLeg1=pdgLeg1; fPdgLeg2=pdgLeg2; }
64   Int_t GetMotherPdg() const { return fPdgMother; }
65   Int_t GetLeg1Pdg()   const { return fPdgLeg1;   }
66   Int_t GetLeg2Pdg()   const { return fPdgLeg2;   }
67
68   void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
69   const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
70   const TObjArray* GetPairArray(Int_t i)  const {return (i>=0&&i<10)?
71       static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}
72
73   TObjArray** GetPairArraysPointer() { return &fPairCandidates; }
74   
75   void SetHistogramManager(AliDielectronHistos * const histos) { fHistos=histos; }
76   const THashList * GetHistogramList() const { return fHistos?fHistos->GetHistogramList():0x0; }
77
78   Bool_t HasCandidates() const { return GetPairArray(1)?GetPairArray(1)->GetEntriesFast()>0:0; }
79   Bool_t HasCandidatesLikeSign() const {
80     return (GetPairArray(0)&&GetPairArray(2)) ? (GetPairArray(0)->GetEntriesFast()>0 || GetPairArray(2)->GetEntriesFast()>0) : 0;
81   }
82   
83   void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
84   AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
85
86   void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
87
88   void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
89   AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
90
91   void SetHasMC(Bool_t hasMC) { fHasMC = hasMC; }
92   Bool_t GetHasMC() const     { return fHasMC;  }
93   
94   void SetDebugTree(AliDielectronDebugTree * const tree) { fDebugTree=tree; }
95   
96   static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
97   static const char* PairClassName(Int_t i)  { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }
98
99   void SaveDebugTree();
100   
101 private:
102
103   
104   AliAnalysisFilter fEventFilter;    // Event cuts
105   AliAnalysisFilter fTrackFilter;    // leg cuts
106   AliAnalysisFilter fPairPreFilter;  // pair prefilter cuts
107   AliAnalysisFilter fPairPreFilterLegs; // Leg filter after the pair prefilter cuts
108   AliAnalysisFilter fPairFilter;     // pair cuts
109   
110   Int_t fPdgMother;     // pdg code of mother tracks
111   Int_t fPdgLeg1;       // pdg code leg1
112   Int_t fPdgLeg2;       // pdg code leg2
113
114   Bool_t fNoPairing;    // if to skip pairing, can be used for track QA only
115     
116   AliDielectronHistos *fHistos;   // Histogram manager
117                                   //  Streaming and merging should be handled
118                                   //  by the analysis framework
119  
120   TObjArray fTracks[4];           //! Selected track candidates
121                                   //  0: Event1, positive particles
122                                   //  1: Event1, negative particles
123                                   //  2: Event2, positive particles
124                                   //  3: Event2, negative particles
125
126   TObjArray *fPairCandidates;     //! Pair candidate arrays
127                                   //TODO: better way to store it? TClonesArray?
128
129   AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
130   AliDielectronTrackRotator *fTrackRotator; //Track rotator
131   AliDielectronDebugTree *fDebugTree;  // Debug tree output
132
133   Bool_t fPreFilterUnlikeOnly;  //Apply PreFilter either in +- or to ++/--/+- individually
134   Bool_t fHasMC;                //If we run with MC, at the moment only needed in AOD
135   
136   void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
137   void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
138   void FillPairArrays(Int_t arr1, Int_t arr2);
139   void FillPairArrayTR();
140   
141   Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}
142
143   void InitPairCandidateArrays();
144   void ClearArrays();
145   
146   TObjArray* PairArray(Int_t i);
147   
148   static const char* fgkTrackClassNames[4];   //Names for track arrays
149   static const char* fgkPairClassNames[11];   //Names for pair arrays
150
151   void ProcessMC();
152   
153   void  FillHistograms(const AliVEvent *ev);
154   void  FillHistogramsPair(AliDielectronPair *pair,Bool_t fromPreFilter=kFALSE);
155   void  FillHistogramsTracks(TObjArray **tracks);
156
157   void  FillDebugTree();
158   
159   AliDielectron(const AliDielectron &c);
160   AliDielectron &operator=(const AliDielectron &c);
161   
162   ClassDef(AliDielectron,4);
163 };
164
165 inline void AliDielectron::InitPairCandidateArrays()
166 {
167   //
168   // initialise all pair candidate arrays
169   //
170   fPairCandidates->SetOwner();
171   for (Int_t i=0;i<10;++i){
172     TObjArray *arr=new TObjArray;
173     fPairCandidates->AddAt(arr,i);
174     arr->SetOwner();
175   }
176 }
177
178 inline TObjArray* AliDielectron::PairArray(Int_t i)
179 {
180   //
181   // for internal use only: unchecked return of track array for fast access
182   //
183   return static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i));
184 }
185
186 inline void AliDielectron::ClearArrays()
187 {
188   //
189   // Reset the Arrays
190   //
191   for (Int_t i=0;i<4;++i){
192     fTracks[i].Clear();
193   }
194   for (Int_t i=0;i<10;++i){
195     PairArray(i)->Delete();
196   }
197 }
198
199 #endif