Adding analysis task involving for TPC calibration
[u/mrichter/AliRoot.git] / TPC / AliAnaTPCTrackBase.cxx
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
24 using namespace std;\r
25 \r
26 ClassImp(AliAnaTPCTrackBase)\r
27 \r
28 //________________________________________________________________________\r
29 AliAnaTPCTrackBase::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
41 AliAnaTPCTrackBase::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
59 void 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
87 void 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
113 void 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
186 Int_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
200 void 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