1 //------------------------------------------------------------------------------
2 // Implementation of AliPerformanceTPC class. It keeps information from
3 // comparison of reconstructed and MC particle tracks. In addtion,
4 // it keeps selection cuts used during comparison. The comparison
5 // information is stored in the ROOT histograms. Analysis of these
6 // histograms can be done by using Analyse() class function. The result of
7 // the analysis (histograms/graphs) are stored in the folder which is
8 // a data member of AliPerformanceTPC.
10 // Author: J.Otwinowski 04/02/2008
11 //------------------------------------------------------------------------------
15 // after running comparison task, read the file, and get component
16 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
19 TFile f("Output.root");
20 AliPerformanceTPC * compObj = (AliPerformanceTPC*)coutput->FindObject("AliPerformanceTPC");
22 // analyse comparison data
25 // the output histograms/graphs will be stored in the folder "folderTPC"
26 compObj->GetAnalysisFolder()->ls("*");
28 // user can save whole comparison object (or only folder with anlysed histograms)
29 // in the seperate output file (e.g.)
30 TFile fout("Analysed_TPC.root","recreate");
31 compObj->Write(); // compObj->GetAnalysisFolder()->Write();
40 #include "TPostScript.h"
42 #include "AliPerformanceTPC.h"
43 #include "AliESDEvent.h"
44 #include "AliESDVertex.h"
45 #include "AliESDtrack.h"
47 #include "AliMCEvent.h"
48 #include "AliHeader.h"
49 #include "AliGenEventHeader.h"
51 #include "AliMCInfoCuts.h"
52 #include "AliRecInfoCuts.h"
53 #include "AliTracker.h"
54 #include "AliTreeDraw.h"
58 ClassImp(AliPerformanceTPC)
60 //_____________________________________________________________________________
61 AliPerformanceTPC::AliPerformanceTPC():
62 AliPerformanceObject("AliPerformanceTPC"),
75 //_____________________________________________________________________________
76 AliPerformanceTPC::AliPerformanceTPC(Char_t* name="AliPerformanceTPC", Char_t* title="AliPerformanceTPC",Int_t analysisMode=0,Bool_t hptGenerator=kFALSE):
77 AliPerformanceObject(name,title),
89 SetAnalysisMode(analysisMode);
90 SetHptGenerator(hptGenerator);
95 //_____________________________________________________________________________
96 AliPerformanceTPC::~AliPerformanceTPC()
100 if(fTPCHisto) delete fTPCHisto; fTPCHisto=0;
101 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
104 //_____________________________________________________________________________
105 void AliPerformanceTPC::Init(){
112 Double_t ptMin = 1.e-2, ptMax = 10.;
114 Double_t *binsPt = 0;
115 if (IsHptGenerator()) {
116 nPtBins = 100; ptMax = 100.;
117 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
119 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
124 Double_t binsPt[32] = {0.,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.25,2.5,2.75,3.,3.5,4.,5.,6.,8.,10.};
125 Double_t ptMin = 0., ptMax = 10.;
127 if(IsHptGenerator() == kTRUE) {
129 ptMin = 0.; ptMax = 100.;
133 // nTPCClust:chi2PerTPCClust:nTPCClustFindRatio:eta:phi:pt
134 Int_t binsTPCHisto[6]={160,100,100,30,144,nPtBins};
135 Double_t minTPCHisto[6]={0., 0., 0., -1.5, 0., ptMin};
136 Double_t maxTPCHisto[6]={160.,10.,1.2, 1.5, 2.*TMath::Pi(), ptMax};
138 fTPCHisto = new THnSparseF("fTPCHisto","nClust:chi2PerClust:nClust/nFindableClust:eta:phi:pt",6,binsTPCHisto,minTPCHisto,maxTPCHisto);
139 fTPCHisto->SetBinEdges(5,binsPt);
141 fTPCHisto->GetAxis(0)->SetTitle("nClust");
142 fTPCHisto->GetAxis(1)->SetTitle("chi2PerClust");
143 fTPCHisto->GetAxis(2)->SetTitle("nClust/nFindableClust");
144 fTPCHisto->GetAxis(3)->SetTitle("#eta");
145 fTPCHisto->GetAxis(4)->SetTitle("#phi (rad)");
146 fTPCHisto->GetAxis(5)->SetTitle("p_{T} (GeV/c)");
151 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
153 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
156 fAnalysisFolder = CreateFolder("folderTPC","Analysis Resolution Folder");
159 //_____________________________________________________________________________
160 void AliPerformanceTPC::ProcessTPC(AliStack* const stack, AliESDtrack *const esdTrack)
162 if(!esdTrack) return;
164 // Fill TPC only resolution comparison information
165 const AliExternalTrackParam *track = esdTrack->GetTPCInnerParam();
168 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
169 esdTrack->GetImpactParametersTPC(dca,cov);
171 //Float_t q = esdTrack->Charge();
172 Float_t pt = track->Pt();
173 Float_t eta = track->Eta();
174 Float_t phi = track->Phi();
175 Int_t nClust = esdTrack->GetTPCclusters(0);
176 Int_t nFindableClust = esdTrack->GetTPCNclsF();
178 Float_t chi2PerCluster = 0.;
179 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
181 Float_t clustPerFindClust = 0.;
182 if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;
184 if(TMath::Abs(dca[0])<fCutsRC->GetMaxDCAToVertexXY() && TMath::Abs(dca[1])<fCutsRC->GetMaxDCAToVertexZ()) {
185 Double_t vTPCHisto[6] = {nClust,chi2PerCluster,clustPerFindClust,eta,phi,pt};
186 fTPCHisto->Fill(vTPCHisto);
190 // Fill rec vs MC information
196 //_____________________________________________________________________________
197 void AliPerformanceTPC::ProcessTPCITS(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/)
199 // Fill comparison information (TPC+ITS)
200 AliDebug(AliLog::kWarning, "Warning: Not implemented");
203 //_____________________________________________________________________________
204 void AliPerformanceTPC::ProcessConstrained(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/)
206 // Fill comparison information (constarained parameters)
207 AliDebug(AliLog::kWarning, "Warning: Not implemented");
210 //_____________________________________________________________________________
211 void AliPerformanceTPC::Exec(AliMCEvent* const mcEvent, AliESDEvent* const esdEvent, const Bool_t bUseMC)
213 // Process comparison information
217 AliDebug(AliLog::kError, "esdEvent not available");
220 AliHeader* header = 0;
221 AliGenEventHeader* genHeader = 0;
228 AliDebug(AliLog::kError, "mcEvent not available");
232 // get MC event header
233 header = mcEvent->Header();
235 AliDebug(AliLog::kError, "Header not available");
239 stack = mcEvent->Stack();
241 AliDebug(AliLog::kError, "Stack not available");
246 genHeader = header->GenEventHeader();
248 AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
251 genHeader->PrimaryVertex(vtxMC);
256 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
258 AliESDtrack*track = esdEvent->GetTrack(iTrack);
261 if(GetAnalysisMode() == 0) ProcessTPC(stack,track);
262 else if(GetAnalysisMode() == 1) ProcessTPCITS(stack,track);
263 else if(GetAnalysisMode() == 2) ProcessConstrained(stack,track);
265 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
271 //_____________________________________________________________________________
272 void AliPerformanceTPC::Analyse() {
274 // Analyse comparison information and store output histograms
275 // in the folder "folderTPC"
277 TH1::AddDirectory(kFALSE);
280 TObjArray *aFolderObj = new TObjArray;
284 for(Int_t i=0; i<5; i++)
286 for(Int_t j=i+1; j<6; j++)
288 if(j==5) fTPCHisto->GetAxis(5)->SetRangeUser(0.1,10.);
289 h2D = (TH2F*)fTPCHisto->Projection(i,j);
290 sprintf(name,"h_tpc_%d_vs_%d",i,j);
292 h2D->GetXaxis()->SetTitle(fTPCHisto->GetAxis(j)->GetTitle());
293 h2D->GetYaxis()->SetTitle(fTPCHisto->GetAxis(i)->GetTitle());
294 sprintf(title,"%s vs %s",fTPCHisto->GetAxis(j)->GetTitle(),fTPCHisto->GetAxis(i)->GetTitle());
295 h2D->SetTitle(title);
297 if(j==5) h2D->SetBit(TH1::kLogX);
298 aFolderObj->Add(h2D);
302 // export objects to analysis folder
303 fAnalysisFolder = ExportToFolder(aFolderObj);
305 // delete only TObjArray
306 if(aFolderObj) delete aFolderObj;
309 //_____________________________________________________________________________
310 TFolder* AliPerformanceTPC::ExportToFolder(TObjArray * array)
312 // recreate folder avery time and export objects to new one
314 AliPerformanceTPC * comp=this;
315 TFolder *folder = comp->GetAnalysisFolder();
318 TFolder *newFolder = 0;
320 Int_t size = array->GetSize();
323 // get name and title from old folder
324 name = folder->GetName();
325 title = folder->GetTitle();
331 newFolder = CreateFolder(name.Data(),title.Data());
332 newFolder->SetOwner();
334 // add objects to folder
336 newFolder->Add(array->At(i));
344 //_____________________________________________________________________________
345 Long64_t AliPerformanceTPC::Merge(TCollection* const list)
347 // Merge list of objects (needed by PROOF)
355 TIterator* iter = list->MakeIterator();
358 // collection of generated histograms
360 while((obj = iter->Next()) != 0)
362 AliPerformanceTPC* entry = dynamic_cast<AliPerformanceTPC*>(obj);
363 if (entry == 0) continue;
365 fTPCHisto->Add(entry->fTPCHisto);
373 //_____________________________________________________________________________
374 TFolder* AliPerformanceTPC::CreateFolder(TString name,TString title) {
375 // create folder for analysed histograms
378 folder = new TFolder(name.Data(),title.Data());