2 // This class is ment as a base class for doing analysis of
\r
3 // reconstructed TPC tracks in the AliAnalysisTask framework.
\r
5 // The method FillTrackHistograms should be overloaded by the users
\r
6 // class and used to make cuts on tracks
\r
8 // Questions, comments, or suggestions can be send to Peter Christiansen (Lund)
\r
16 #include <AliAnalysisManager.h>
\r
17 #include <AliESDInputHandler.h>
\r
23 #include "AliAnaTPCTrackBase.h"
\r
27 using namespace std;
\r
29 ClassImp(AliAnaTPCTrackBase)
\r
31 //________________________________________________________________________
\r
32 AliAnaTPCTrackBase::AliAnaTPCTrackBase() :
\r
34 fDebug(0), // Debug flag
\r
38 fMaxTracks(0), // Max tracks in histogram
\r
39 fESDTracks(0), //! N ESD tracks
\r
40 fGoodTracks(0) //! GOOD tracks
\r
43 // Default constructor (should not be used)
\r
48 AliAnaTPCTrackBase::AliAnaTPCTrackBase(const AliAnaTPCTrackBase & ana):
\r
49 AliAnalysisTask(ana),
\r
50 fDebug(ana.fDebug), // Debug flag
\r
52 fESDfriend(ana.fESDfriend),
\r
53 fListOfHists(ana.fListOfHists),
\r
54 fMaxTracks(ana.fMaxTracks), // Max tracks in histogram
\r
55 fESDTracks(0), //! N ESD tracks
\r
56 fGoodTracks(0) //! GOOD tracks
\r
61 fESDTracks = (TH1F*)ana.fESDTracks->Clone(); //! N ESD tracks
\r
62 fGoodTracks = (TH1F*)ana.fGoodTracks->Clone(); //! GOOD tracks
\r
66 AliAnaTPCTrackBase& AliAnaTPCTrackBase::operator=(const AliAnaTPCTrackBase&ana){
\r
68 // assignemnt operator
\r
71 new (this) AliAnaTPCTrackBase(ana);
\r
80 //________________________________________________________________________
\r
81 AliAnaTPCTrackBase::AliAnaTPCTrackBase(const char *name) :
\r
82 AliAnalysisTask(name, "AliAnaTPCTrackBase"),
\r
83 fDebug(0), // Debug flag
\r
87 fMaxTracks(0), // Max tracks in histogram
\r
88 fESDTracks(0), //! N ESD tracks
\r
89 fGoodTracks(0) //! GOOD tracks
\r
92 // Normal constructor
\r
95 // Input slot #0 works with a TChain
\r
96 DefineInput(0, TChain::Class());
\r
97 // Output slot #0 writes into a TList
\r
98 DefineOutput(0, TList::Class());
\r
104 //________________________________________________________________________
\r
105 void AliAnaTPCTrackBase::ConnectInputData(Option_t *)
\r
108 // Connect the input data
\r
111 cout << "AnalysisTaskTPCCluster::ConnectInputData()" << endl;
\r
113 AliESDInputHandler* esdH = (AliESDInputHandler*)
\r
114 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
\r
115 fESD = esdH->GetEvent();
\r
119 cout << endl << "WARNING: NO ESD event found" << endl << endl;
\r
123 (AliESDfriend*)fESD->FindListObject("AliESDfriend");
\r
125 if(fESDfriend==0) {
\r
127 cout << endl << "WARNING: NO ESD friend found" << endl << endl;
\r
132 //________________________________________________________________________
\r
133 void AliAnaTPCTrackBase::CreateOutputObjects()
\r
136 // Connect the output objects
\r
139 cout << "AnalysisTaskTPCCluster::CreateOutputObjects()" << endl;
\r
142 fListOfHists = new TList();
\r
145 new TH1F("hESDTracks",
\r
146 "Number of ESD tracks per event; N ESD tracks; Counts",
\r
147 TMath::Min(fMaxTracks, 100), 0, fMaxTracks);
\r
148 fListOfHists->Add(fESDTracks);
\r
151 new TH1F("hGoodTracks",
\r
152 "Number of Good tracks per event; N good tracks; Counts",
\r
153 TMath::Min(fMaxTracks, 100), 0, fMaxTracks);
\r
154 fListOfHists->Add(fGoodTracks);
\r
158 //________________________________________________________________________
\r
159 void AliAnaTPCTrackBase::Exec(Option_t *) {
\r
161 // Execute analysis for current event
\r
162 // For the moment I require that mcTruth is there! I am afraid to
\r
163 // get out of sync if it is missing for some events since I use the
\r
164 // number of MC events for normalisation
\r
168 cout << "AliAnaTPCTrackBase::Exec()" << endl;
\r
170 if(fESD==0 || fESDfriend==0) {
\r
172 cout << "AliAnaTPCTrackBase::Exec(): WARNING: fESD=" << fESD
\r
173 << ", fESDfriend=" << fESDfriend << endl;
\r
174 // Post final data. It will be written to a file with option "RECREATE"
\r
175 PostData(0, fListOfHists);
\r
179 fESD->SetESDfriend(fESDfriend);
\r
180 const Int_t nESDTracks = fESD->GetNumberOfTracks();
\r
183 cout << " Number of ESD tracks: " << nESDTracks << endl;
\r
185 if ( nESDTracks != fESDfriend->GetNumberOfTracks() ) {
\r
186 AliWarning("Number of Tracks differs from Number of Friend-Tracks!");
\r
187 printf("Number of tracks: %i, number of friend tracks: %i \n", nESDTracks, fESDfriend->GetNumberOfTracks());
\r
191 fESDTracks->Fill(nESDTracks);
\r
192 Int_t nGoodTracks = 0;
\r
194 for(Int_t i = 0; i < nESDTracks; i++) {
\r
196 AliESDtrack* track = (AliESDtrack*)fESD->GetTrack(i);
\r
197 AliESDfriendTrack* friendTrack = (AliESDfriendTrack*) track->GetFriendTrack();
\r
198 AliTPCseed* seed = 0;
\r
201 TObject *cobject = 0;
\r
202 for (Int_t i = 0; ; i++){
\r
203 cobject = friendTrack->GetCalibObject(i);
\r
204 if (!cobject) break;
\r
205 seed = dynamic_cast<AliTPCseed*>(cobject);
\r
208 if (!seed && fDebug>1) Error("Exec", "No seed found!!!");
\r
210 else if (fDebug>1) Error("Exec", "No friend track found!!!");
\r
212 Int_t accepted = FillTrackHistograms(nESDTracks, track, friendTrack, seed);
\r
216 cout << "Track " << i << " was accepted" << endl;
\r
221 cout << "Track " << i << " was rejected" << endl;
\r
225 fGoodTracks->Fill(nGoodTracks);
\r
227 // Post final data. It will be written to a file with option "RECREATE"
\r
228 PostData(0, fListOfHists);
\r
231 //________________________________________________________________________
\r
232 Int_t AliAnaTPCTrackBase::FillTrackHistograms(Int_t nTracks, AliESDtrack* track, AliESDfriendTrack* friendTrack, AliTPCseed* seed) {
\r
234 // This method should be overloaded and used to make cuts on tracks
\r
235 // and fill histograms.
\r
236 // return 0 if track was rejected, 1 if accepted
\r
239 if(nTracks && track && friendTrack && seed)
\r
245 //________________________________________________________________________
\r
246 void AliAnaTPCTrackBase::Terminate(Option_t *) {
\r
251 printf("AliAnaTPCTrackBase: Terminate() \n");
\r