]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/EMCAL/AliEmcalPicoTrackMaker.cxx
fixes from Salvatore
[u/mrichter/AliRoot.git] / PWG / EMCAL / AliEmcalPicoTrackMaker.cxx
1 // $Id$
2 //
3 // Class to make PicoTracks in AOD/ESD events.
4 //
5 // Author: S.Aiola, C.Loizides
6
7 #include <TClonesArray.h>
8 #include <TRandom3.h>
9
10 #include "AliAODEvent.h"
11 #include "AliAODTrack.h"
12 #include "AliAnalysisManager.h"
13 #include "AliESDtrack.h"
14 #include "AliESDtrackCuts.h"
15 #include "AliLog.h"
16 #include "AliPicoTrack.h"
17 #include "AliVTrack.h"
18 #include "AliEmcalPicoTrackMaker.h"
19
20 ClassImp(AliEmcalPicoTrackMaker)
21
22 //________________________________________________________________________
23 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker() : 
24   AliAnalysisTaskSE("AliEmcalPicoTrackMaker"),
25   fESDtrackCuts(0),
26   fTracksOutName("PicoTracks"),
27   fTracksInName("tracks"),
28   fMinTrackPt(0),
29   fMaxTrackPt(1000),
30   fMinTrackEta(-0.9),
31   fMaxTrackEta(0.9),
32   fMinTrackPhi(-10),
33   fMaxTrackPhi(10),
34   fTrackEfficiency(1),
35   fIncludeNoITS(kTRUE),
36   fUseNegativeLabels(kTRUE),
37   fIsMC(kFALSE),
38   fTracksIn(0),
39   fTracksOut(0)
40 {
41   // Constructor.
42
43   fAODfilterBits[0] = -1;
44   fAODfilterBits[1] = -1;
45 }
46
47 //________________________________________________________________________
48 AliEmcalPicoTrackMaker::AliEmcalPicoTrackMaker(const char *name) : 
49   AliAnalysisTaskSE(name),
50   fESDtrackCuts(0),
51   fTracksOutName("PicoTracks"),
52   fTracksInName("tracks"),
53   fMinTrackPt(0),
54   fMaxTrackPt(1000),
55   fMinTrackEta(-0.9),
56   fMaxTrackEta(0.9),
57   fMinTrackPhi(-10),
58   fMaxTrackPhi(10),
59   fTrackEfficiency(1),
60   fIncludeNoITS(kTRUE),
61   fUseNegativeLabels(kTRUE),
62   fIsMC(kFALSE),
63   fTracksIn(0),
64   fTracksOut(0)
65 {
66   // Constructor.
67
68   fAODfilterBits[0] = -1;
69   fAODfilterBits[1] = -1;
70   fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks";
71 }
72
73 //________________________________________________________________________
74 AliEmcalPicoTrackMaker::~AliEmcalPicoTrackMaker()
75 {
76   // Destructor.
77 }
78
79 //________________________________________________________________________
80 void AliEmcalPicoTrackMaker::UserCreateOutputObjects()
81 {
82   // Create my user objects.
83
84   fTracksOut = new TClonesArray("AliPicoTrack");
85   fTracksOut->SetName(fTracksOutName);
86 }
87
88 //________________________________________________________________________
89 void AliEmcalPicoTrackMaker::UserExec(Option_t *) 
90 {
91   // Main loop, called for each event.
92
93   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
94   if (!am) {
95     AliError("Manager zero, returning");
96     return;
97   }
98
99   // retrieve tracks from input.
100   if (!fTracksIn) { 
101     fTracksIn = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTracksInName));
102     if (!fTracksIn) {
103       AliError(Form("Could not retrieve tracks %s!", fTracksInName.Data())); 
104       return;
105     }
106     if (!fTracksIn->GetClass()->GetBaseClass("AliVParticle")) {
107       AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTracksInName.Data())); 
108       return;
109     }
110   }
111
112   // add tracks to event if not yet there
113   fTracksOut->Delete();
114   if (!(InputEvent()->FindListObject(fTracksOutName))) {
115     InputEvent()->AddObject(fTracksOut);
116   }
117
118   // clear container (normally a null operation as the event should clean it already)
119   fTracksOut->Clear();
120
121   // test if we are in ESD or AOD mode
122   Bool_t esdMode = kTRUE;
123   if (dynamic_cast<AliAODEvent*>(InputEvent())!=0)
124     esdMode = kFALSE;
125  
126   // loop over tracks
127   const Int_t Ntracks = fTracksIn->GetEntriesFast();
128   for (Int_t iTracks = 0, nacc = 0; iTracks < Ntracks; ++iTracks) {
129
130     AliVTrack *track = static_cast<AliVTrack*>(fTracksIn->At(iTracks));
131
132     if (!track)
133       continue;
134
135     if (track->Pt() > fMaxTrackPt || track->Pt() < fMinTrackPt)
136       continue;
137
138     if (track->Eta() < fMinTrackEta || track->Eta() > fMaxTrackEta || 
139         track->Phi() < fMinTrackPhi || track->Phi() > fMaxTrackPhi)
140       continue;
141
142     Bool_t isEmc = kFALSE;
143     Int_t type = -1;
144     if (esdMode) {
145       AliESDtrack *esdtrack = static_cast<AliESDtrack*>(track);
146       if (fESDtrackCuts && !fESDtrackCuts->AcceptTrack(esdtrack))
147         continue;
148       type = esdtrack->GetTRDNchamberdEdx();
149       if (!fIncludeNoITS && (type==2))
150         continue;
151       isEmc = track->IsEMCAL();
152     } else {
153       AliAODTrack *aodtrack = static_cast<AliAODTrack*>(track);
154       if (fAODfilterBits[0] < 0) {
155         if (aodtrack->IsHybridGlobalConstrainedGlobal())
156           type = 3;
157         else /*not a good track*/
158           continue;
159       }
160       else {
161         if (aodtrack->TestFilterBit(fAODfilterBits[0])) {
162           type = 0;
163         }
164         else if (aodtrack->TestFilterBit(fAODfilterBits[1])) {
165           if ((aodtrack->GetStatus()&AliESDtrack::kITSrefit)==0) {
166             if (fIncludeNoITS)
167               type = 2;
168             else
169               continue;
170           }
171           else {
172             type = 1;
173           }
174         }
175         else {/*not a good track*/
176           continue;
177         }
178       }
179
180       if (TMath::Abs(track->GetTrackEtaOnEMCal()) < 0.75 && 
181           track->GetTrackPhiOnEMCal() > 70 * TMath::DegToRad() &&
182           track->GetTrackPhiOnEMCal() < 190 * TMath::DegToRad())
183         isEmc = kTRUE;
184     }
185
186     if (fTrackEfficiency < 1) {
187       Double_t r = gRandom->Rndm();
188       if (fTrackEfficiency < r) 
189         continue;
190     }
191
192     Int_t label = 0;
193     if (fIsMC) {
194       if (fUseNegativeLabels)
195         label = track->GetLabel();
196       else 
197         label = TMath::Abs(track->GetLabel());
198
199       if (label == 0) 
200         AliDebug(2,Form("Track %d with label==0", iTracks));
201     }
202
203     /*AliPicoTrack *picotrack =*/ new ((*fTracksOut)[nacc]) AliPicoTrack(track->Pt(), 
204                                                                          track->Eta(), 
205                                                                          track->Phi(), 
206                                                                          track->Charge(), 
207                                                                          label,
208                                                                          type,
209                                                                          track->GetTrackEtaOnEMCal(), 
210                                                                          track->GetTrackPhiOnEMCal(), 
211                                                                          isEmc);
212     ++nacc;
213   }
214 }