1 #include "AliAnaTPCTrackBase.h"
\r
3 // This class is ment as a base class for doing analysis of
\r
4 // reconstructed TPC tracks in the AliAnalysisTask framework.
\r
6 // The method FillTrackHistograms should be overloaded by the users
\r
7 // class and used to make cuts on tracks
\r
9 // Questions, comments, or suggestions can be send to Peter Christiansen (Lund)
\r
17 #include <AliAnalysisManager.h>
\r
18 #include <AliESDInputHandler.h>
\r
24 using namespace std;
\r
26 ClassImp(AliAnaTPCTrackBase)
\r
28 //________________________________________________________________________
\r
29 AliAnaTPCTrackBase::AliAnaTPCTrackBase() :
\r
31 fESD(0), fESDfriend(0), fListOfHists(0)
\r
34 // Default constructor (should not be used)
\r
40 //________________________________________________________________________
\r
41 AliAnaTPCTrackBase::AliAnaTPCTrackBase(const char *name) :
\r
42 AliAnalysisTask(name, "AliAnaTPCTrackBase"),
\r
43 fESD(0), fESDfriend(0), fListOfHists(0)
\r
46 // Normal constructor
\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
58 //________________________________________________________________________
\r
59 void AliAnaTPCTrackBase::ConnectInputData(Option_t *)
\r
62 // Connect the input data
\r
65 cout << "AnalysisTaskTPCCluster::ConnectInputData()" << endl;
\r
67 AliESDInputHandler* esdH = (AliESDInputHandler*)
\r
68 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
\r
69 fESD = esdH->GetEvent();
\r
73 cout << endl << "WARNING: NO ESD event found" << endl << endl;
\r
77 (AliESDfriend*)fESD->FindListObject("AliESDfriend");
\r
81 cout << endl << "WARNING: NO ESD friend found" << endl << endl;
\r
86 //________________________________________________________________________
\r
87 void AliAnaTPCTrackBase::CreateOutputObjects()
\r
90 // Connect the output objects
\r
93 cout << "AnalysisTaskTPCCluster::CreateOutputObjects()" << endl;
\r
96 fListOfHists = new TList();
\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
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
112 //________________________________________________________________________
\r
113 void AliAnaTPCTrackBase::Exec(Option_t *) {
\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
122 cout << "AliAnaTPCTrackBase::Exec()" << endl;
\r
124 if(fESD==0 || fESDfriend==0) {
\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
133 fESD->SetESDfriend(fESDfriend);
\r
134 const Int_t nESDTracks = fESD->GetNumberOfTracks();
\r
137 cout << " Number of ESD tracks: " << nESDTracks << endl;
\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
145 hESDTracks->Fill(nESDTracks);
\r
146 Int_t nGoodTracks = 0;
\r
148 for(Int_t i = 0; i < nESDTracks; i++) {
\r
150 AliESDtrack* track = (AliESDtrack*)fESD->GetTrack(i);
\r
151 AliESDfriendTrack* friendTrack = (AliESDfriendTrack*) track->GetFriendTrack();
\r
152 AliTPCseed* seed = 0;
\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
162 if (!seed && fDebug>1) Error("Exec", "No seed found!!!");
\r
164 else if (fDebug>1) Error("Exec", "No friend track found!!!");
\r
166 Int_t accepted = FillTrackHistograms(nESDTracks, track, friendTrack, seed);
\r
170 cout << "Track " << i << " was accepted" << endl;
\r
175 cout << "Track " << i << " was rejected" << endl;
\r
179 hGoodTracks->Fill(nGoodTracks);
\r
181 // Post final data. It will be written to a file with option "RECREATE"
\r
182 PostData(0, fListOfHists);
\r
185 //________________________________________________________________________
\r
186 Int_t AliAnaTPCTrackBase::FillTrackHistograms(Int_t nTracks, AliESDtrack* track, AliESDfriendTrack* friendTrack, AliTPCseed* seed) {
\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
193 if(nTracks && track && friendTrack && seed)
\r
199 //________________________________________________________________________
\r
200 void AliAnaTPCTrackBase::Terminate(Option_t *) {
\r
205 printf("AliAnaTPCTrackBase: Terminate() \n");
\r