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 */
6 //#####################################################
8 //# Class AliDielectronTaku #
9 //# Main Class for e+e- analysis #
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 #
16 //#####################################################
20 #include <TObjArray.h>
22 #include <AliAnalysisFilter.h>
23 #include <AliKFParticle.h>
25 #include "AliDielectronHistosTaku.h"
30 class AliDielectronCF;
31 class AliDielectronDebugTreeTaku;
32 class AliDielectronTrackRotator;
33 class AliDielectronPair;
34 class AliDielectronSignalMC;
36 //________________________________________________________________
37 class AliDielectronTaku : public TNamed {
40 enum EPairType { kEv1PP=0, kEv1PM, kEv1MM,
41 kEv1PEv2P, kEv1MEv2P, kEv2PP,
42 kEv1PEv2M, kEv1MEv2M, kEv2PM,
44 enum ELegType { kEv1P, kEv1M, kEv2P, kEv2M };
47 AliDielectronTaku(const char* name, const char* title);
48 virtual ~AliDielectronTaku();
52 void Process(AliVEvent *ev1, AliVEvent *ev2=0);
54 const AliAnalysisFilter& GetEventFilter() const { return fEventFilter; }
55 const AliAnalysisFilter& GetTrackFilter() const { return fTrackFilter; }
56 const AliAnalysisFilter& GetPairFilter() const { return fPairFilter; }
58 AliAnalysisFilter& GetEventFilter() { return fEventFilter; }
59 AliAnalysisFilter& GetTrackFilter() { return fTrackFilter; }
60 AliAnalysisFilter& GetPairFilter() { return fPairFilter; }
61 AliAnalysisFilter& GetPairPreFilter() { return fPairPreFilter; }
62 AliAnalysisFilter& GetPairPreFilterLegs() { return fPairPreFilterLegs; }
64 void SetMotherPdg( Int_t pdgMother ) { fPdgMother=pdgMother; }
65 void SetLegPdg(Int_t pdgLeg1, Int_t pdgLeg2) { fPdgLeg1=pdgLeg1; fPdgLeg2=pdgLeg2; }
66 Int_t GetMotherPdg() const { return fPdgMother; }
67 Int_t GetLeg1Pdg() const { return fPdgLeg1; }
68 Int_t GetLeg2Pdg() const { return fPdgLeg2; }
70 void SetNoPairing(Bool_t noPairing=kTRUE) { fNoPairing=noPairing; }
71 const TObjArray* GetTrackArray(Int_t i) const {return (i>=0&&i<4)?&fTracks[i]:0;}
72 const TObjArray* GetPairArray(Int_t i) const {return (i>=0&&i<10)?
73 static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i)):0;}
75 TObjArray** GetPairArraysPointer() { return &fPairCandidates; }
77 void SetHistogramManager(AliDielectronHistosTaku * const histos) { fHistos=histos; }
78 void SetTreeManager(AliDielectronHistosTaku * const histos) { fTree=histos; }
79 AliDielectronHistosTaku* GetHistoManager() const { return fHistos; }
80 const THashList * GetHistogramList() const { return fHistos?fHistos->GetHistogramList():0x0; }
81 AliDielectronHistosTaku* GetTreeManager() const { return fTree; }
82 const THashList * GetTreeList() const { return fTree?fTree->GetTreeList():0x0; }
83 TTree *GetSingleTree(AliDielectronHistosTaku *fTreeHisto) const {return fTreeHisto->GetSingleTree();}
85 Bool_t HasCandidates() const { return GetPairArray(1)?GetPairArray(1)->GetEntriesFast()>0:0; }
86 Bool_t HasCandidatesLikeSign() const {
87 return (GetPairArray(0)&&GetPairArray(2)) ? (GetPairArray(0)->GetEntriesFast()>0 || GetPairArray(2)->GetEntriesFast()>0) : 0;
90 void SetCFManagerPair(AliDielectronCF * const cf) { fCfManagerPair=cf; }
91 AliDielectronCF* GetCFManagerPair() const { return fCfManagerPair; }
93 void SetPreFilterUnlikeOnly(Bool_t setValue=kTRUE){fPreFilterUnlikeOnly=setValue;};
94 void SetPreFilterAllSigns(Bool_t setValue=kTRUE){fPreFilterAllSigns=setValue;};
96 void SetTrackRotator(AliDielectronTrackRotator * const rot) { fTrackRotator=rot; }
97 AliDielectronTrackRotator* GetTrackRotator() const { return fTrackRotator; }
99 void SetHasMC(Bool_t hasMC) { fHasMC = hasMC; }
100 Bool_t GetHasMC() const { return fHasMC; }
102 void AddSignalMC(AliDielectronSignalMC* signal);
104 void SetDebugTree(AliDielectronDebugTreeTaku * const tree) { fDebugTree=tree; }
106 const TObjArray* GetMCSignals() const { return fSignalsMC; }
107 static const char* TrackClassName(Int_t i) { return (i>=0&&i<4)?fgkTrackClassNames[i]:""; }
108 static const char* PairClassName(Int_t i) { return (i>=0&&i<11)?fgkPairClassNames[i]:""; }
110 void SaveDebugTree();
113 Double_t GetVarManagerVariable(Int_t n) const {return fgData[n];}
117 AliAnalysisFilter fEventFilter; // Event cuts
118 AliAnalysisFilter fTrackFilter; // leg cuts
119 AliAnalysisFilter fPairPreFilter; // pair prefilter cuts
120 AliAnalysisFilter fPairPreFilterLegs; // Leg filter after the pair prefilter cuts
121 AliAnalysisFilter fPairFilter; // pair cuts
123 Int_t fPdgMother; // pdg code of mother tracks
124 Int_t fPdgLeg1; // pdg code leg1
125 Int_t fPdgLeg2; // pdg code leg2
127 TObjArray* fSignalsMC; // array of AliDielectronSignalMC
129 Bool_t fNoPairing; // if to skip pairing, can be used for track QA only
131 AliDielectronHistosTaku *fHistos; // Histogram manager
132 // Streaming and merging should be handled
133 // by the analysis framework
135 AliDielectronHistosTaku *fTree; // This is for tree
136 // Streaming and merging should be handled
137 // by the analysis framework
140 TObjArray fTracks[4]; //! Selected track candidates
141 // 0: Event1, positive particles
142 // 1: Event1, negative particles
143 // 2: Event2, positive particles
144 // 3: Event2, negative particles
146 TObjArray *fPairCandidates; //! Pair candidate arrays
147 //TODO: better way to store it? TClonesArray?
149 AliDielectronCF *fCfManagerPair;//Correction Framework Manager for the Pair
150 AliDielectronTrackRotator *fTrackRotator; //Track rotator
151 AliDielectronDebugTreeTaku *fDebugTree; // Debug tree output
153 Bool_t fPreFilterUnlikeOnly; //Apply PreFilter either in +- or to ++/--/+- individually
154 Bool_t fPreFilterAllSigns; //Apply PreFilter find in ++/--/+- and remove from all
155 Bool_t fHasMC; //If we run with MC, at the moment only needed in AOD
157 void FillTrackArrays(AliVEvent * const ev, Int_t eventNr=0);
158 void PairPreFilter(Int_t arr1, Int_t arr2, TObjArray &arrTracks1, TObjArray &arrTracks2);
159 void FillPairArrays(Int_t arr1, Int_t arr2);
160 void FillPairArrayTR();
162 Int_t GetPairIndex(Int_t arr1, Int_t arr2) const {return arr1>=arr2?arr1*(arr1+1)/2+arr2:arr2*(arr2+1)/2+arr1;}
164 void InitPairCandidateArrays();
167 TObjArray* PairArray(Int_t i);
169 static const char* fgkTrackClassNames[4]; //Names for track arrays
170 static const char* fgkPairClassNames[11]; //Names for pair arrays
174 void FillHistograms(const AliVEvent *ev);
175 void FillTree(const AliVEvent *ev);
176 void FillHistogramsMC(const AliMCEvent *ev);
177 void FillHistogramsPair(AliDielectronPair *pair,Bool_t fromPreFilter=kFALSE);
178 void FillHistogramsTracks(TObjArray **tracks);
180 void FillDebugTree();
182 AliDielectronTaku(const AliDielectronTaku &c);
183 AliDielectronTaku &operator=(const AliDielectronTaku &c);
185 Double_t fgData[AliDielectronVarManager::kNMaxValues];
188 ClassDef(AliDielectronTaku,4);
191 inline void AliDielectronTaku::InitPairCandidateArrays()
194 // initialise all pair candidate arrays
196 fPairCandidates->SetOwner();
197 for (Int_t i=0;i<10;++i){
198 TObjArray *arr=new TObjArray;
199 fPairCandidates->AddAt(arr,i);
204 inline TObjArray* AliDielectronTaku::PairArray(Int_t i)
207 // for internal use only: unchecked return of track array for fast access
209 return static_cast<TObjArray*>(fPairCandidates->UncheckedAt(i));
212 inline void AliDielectronTaku::ClearArrays()
217 for (Int_t i=0;i<4;++i){
220 for (Int_t i=0;i<10;++i){
221 PairArray(i)->Delete();