]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TPC/AliAnaTPCTrackBase.cxx
New classes to fit signal shape (AliTPCCalibTCF)
[u/mrichter/AliRoot.git] / TPC / AliAnaTPCTrackBase.cxx
CommitLineData
e2b3cee0 1#include "AliAnaTPCTrackBase.h"\r
2//\r
3// This class is ment as a base class for doing analysis of\r
4// reconstructed TPC tracks in the AliAnalysisTask framework.\r
5//\r
6// The method FillTrackHistograms should be overloaded by the users\r
7// class and used to make cuts on tracks\r
8//\r
9// Questions, comments, or suggestions can be send to Peter Christiansen (Lund)\r
10// \r
11\r
12// ROOT includes\r
13#include <TChain.h>\r
14#include <TMath.h>\r
15\r
16// ALIROOT includes\r
17#include <AliAnalysisManager.h>\r
18#include <AliESDInputHandler.h>\r
19#include <AliESD.h>\r
20\r
21// STL includes\r
22#include <iostream>\r
23\r
24using namespace std;\r
25\r
26ClassImp(AliAnaTPCTrackBase)\r
27\r
28//________________________________________________________________________\r
29AliAnaTPCTrackBase::AliAnaTPCTrackBase() : \r
30 AliAnalysisTask(), \r
31 fESD(0), fESDfriend(0), fListOfHists(0)\r
32{\r
33 //\r
34 // Default constructor (should not be used)\r
35 //\r
36 fDebug = 0;\r
37 SetMaxTracks();\r
38}\r
39\r
40//________________________________________________________________________\r
41AliAnaTPCTrackBase::AliAnaTPCTrackBase(const char *name) : \r
42 AliAnalysisTask(name, "AliAnaTPCTrackBase"), \r
43 fESD(0), fESDfriend(0), fListOfHists(0)\r
44{\r
45 //\r
46 // Normal constructor\r
47 //\r
48\r
49 // Input slot #0 works with a TChain\r
50 DefineInput(0, TChain::Class());\r
51 // Output slot #0 writes into a TList\r
52 DefineOutput(0, TList::Class());\r
53 \r
54 fDebug = 0;\r
55 SetMaxTracks();\r
56}\r
57\r
58//________________________________________________________________________\r
59void AliAnaTPCTrackBase::ConnectInputData(Option_t *) \r
60{\r
61 //\r
62 // Connect the input data\r
63 //\r
64 if(fDebug>3)\r
65 cout << "AnalysisTaskTPCCluster::ConnectInputData()" << endl;\r
66\r
67 AliESDInputHandler* esdH = (AliESDInputHandler*) \r
68 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());\r
69 fESD = esdH->GetEvent();\r
70\r
71 if(fESD==0) {\r
72 \r
73 cout << endl << "WARNING: NO ESD event found" << endl << endl;\r
74 } else {\r
75\r
76 fESDfriend = \r
77 (AliESDfriend*)fESD->FindListObject("AliESDfriend"); \r
78 \r
79 if(fESDfriend==0) {\r
80 \r
81 cout << endl << "WARNING: NO ESD friend found" << endl << endl;\r
82 }\r
83 }\r
84}\r
85\r
86//________________________________________________________________________\r
87void AliAnaTPCTrackBase::CreateOutputObjects() \r
88{\r
89 //\r
90 // Connect the output objects\r
91 //\r
92 if(fDebug>3)\r
93 cout << "AnalysisTaskTPCCluster::CreateOutputObjects()" << endl;\r
94 \r
95 OpenFile(0);\r
96 fListOfHists = new TList();\r
97 \r
98 hESDTracks = \r
99 new TH1F("hESDTracks", \r
100 "Number of ESD tracks per event; N ESD tracks; Counts", \r
101 TMath::Min(fMaxTracks, 100), 0, fMaxTracks);\r
102 fListOfHists->Add(hESDTracks);\r
103\r
104 hGoodTracks = \r
105 new TH1F("hGoodTracks", \r
106 "Number of Good tracks per event; N good tracks; Counts", \r
107 TMath::Min(fMaxTracks, 100), 0, fMaxTracks);\r
108 fListOfHists->Add(hGoodTracks);\r
109}\r
110\r
111\r
112//________________________________________________________________________\r
113void AliAnaTPCTrackBase::Exec(Option_t *) {\r
114 //\r
115 // Execute analysis for current event \r
116 // For the moment I require that mcTruth is there! I am afraid to\r
117 // get out of sync if it is missing for some events since I use the\r
118 // number of MC events for normalisation\r
119 //\r
120\r
121 if(fDebug>3)\r
122 cout << "AliAnaTPCTrackBase::Exec()" << endl;\r
123 \r
124 if(fESD==0 || fESDfriend==0) {\r
125 \r
126 cout << "AliAnaTPCTrackBase::Exec(): WARNING: fESD=" << fESD \r
127 << ", fESDfriend=" << fESDfriend << endl;\r
128 // Post final data. It will be written to a file with option "RECREATE"\r
129 PostData(0, fListOfHists);\r
130 return;\r
131 }\r
132 \r
133 fESD->SetESDfriend(fESDfriend);\r
134 const Int_t nESDTracks = fESD->GetNumberOfTracks();\r
135 \r
136 if(fDebug>0)\r
137 cout << " Number of ESD tracks: " << nESDTracks << endl;\r
138 \r
139 if ( nESDTracks != fESDfriend->GetNumberOfTracks() ) {\r
140 AliWarning("Number of Tracks differs from Number of Friend-Tracks!");\r
141 printf("Number of tracks: %i, number of friend tracks: %i \n", nESDTracks, fESDfriend->GetNumberOfTracks());\r
142 return;\r
143 }\r
144 \r
145 hESDTracks->Fill(nESDTracks);\r
146 Int_t nGoodTracks = 0;\r
147\r
148 for(Int_t i = 0; i < nESDTracks; i++) {\r
149 \r
150 AliESDtrack* track = (AliESDtrack*)fESD->GetTrack(i);\r
151 AliESDfriendTrack* friendTrack = (AliESDfriendTrack*) track->GetFriendTrack();\r
152 AliTPCseed* seed = 0;\r
153 \r
154 if(friendTrack) {\r
155 TObject *cobject = 0;\r
156 for (Int_t i = 0; ; i++){\r
157 cobject = friendTrack->GetCalibObject(i);\r
158 if (!cobject) break;\r
159 seed = dynamic_cast<AliTPCseed*>(cobject);\r
160 if (seed) break;\r
161 }\r
162 if (!seed && fDebug>1) Error("Exec", "No seed found!!!");\r
163 }\r
164 else if (fDebug>1) Error("Exec", "No friend track found!!!");\r
165\r
166 Int_t accepted = FillTrackHistograms(nESDTracks, track, friendTrack, seed);\r
167\r
168 if(accepted) {\r
169 if(fDebug>1)\r
170 cout << "Track " << i << " was accepted" << endl;\r
171 nGoodTracks++;\r
172 } else {\r
173\r
174 if(fDebug>1)\r
175 cout << "Track " << i << " was rejected" << endl;\r
176 }\r
177 }\r
178 \r
179 hGoodTracks->Fill(nGoodTracks);\r
180 \r
181 // Post final data. It will be written to a file with option "RECREATE"\r
182 PostData(0, fListOfHists);\r
183} \r
184\r
185//________________________________________________________________________\r
186Int_t AliAnaTPCTrackBase::FillTrackHistograms(Int_t nTracks, AliESDtrack* track, AliESDfriendTrack* friendTrack, AliTPCseed* seed) {\r
187 //\r
188 // This method should be overloaded and used to make cuts on tracks\r
189 // and fill histograms. \r
190 // return 0 if track was rejected, 1 if accepted\r
191 //\r
192\r
193 if(nTracks && track && friendTrack && seed)\r
194 return 1;\r
195 else\r
196 return 0;\r
197}\r
198\r
199//________________________________________________________________________\r
200void AliAnaTPCTrackBase::Terminate(Option_t *) {\r
201 //\r
202 // Terminate loop\r
203 //\r
204 if(fDebug>3)\r
205 printf("AliAnaTPCTrackBase: Terminate() \n");\r
206}\r