]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/TPC/AliPerformanceTPC.cxx
revert changes
[u/mrichter/AliRoot.git] / PWG1 / TPC / AliPerformanceTPC.cxx
CommitLineData
7cc34f08 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.
9//
10// Author: J.Otwinowski 04/02/2008
814d192f 11// Changes by M.Knichel 15/10/2010
7cc34f08 12//------------------------------------------------------------------------------
13
14/*
15
16 // after running comparison task, read the file, and get component
17 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
18 LoadMyLibs();
19
20 TFile f("Output.root");
21 AliPerformanceTPC * compObj = (AliPerformanceTPC*)coutput->FindObject("AliPerformanceTPC");
22
23 // analyse comparison data
24 compObj->Analyse();
25
26 // the output histograms/graphs will be stored in the folder "folderTPC"
27 compObj->GetAnalysisFolder()->ls("*");
28
29 // user can save whole comparison object (or only folder with anlysed histograms)
30 // in the seperate output file (e.g.)
31 TFile fout("Analysed_TPC.root","recreate");
32 compObj->Write(); // compObj->GetAnalysisFolder()->Write();
33 fout.Close();
34
35*/
36
37#include "TCanvas.h"
38#include "TH1.h"
39#include "TH2.h"
27c7c4b3 40#include "TH3.h"
7cc34f08 41#include "TAxis.h"
42#include "TPostScript.h"
27c7c4b3 43#include "TString.h"
814d192f 44#include "TUUID.h"
45#include "TTree.h"
46#include "TChain.h"
47#include "AliTPCPerformanceSummary.h"
48#include "TSystem.h"
7cc34f08 49
50#include "AliPerformanceTPC.h"
51#include "AliESDEvent.h"
52#include "AliESDVertex.h"
53#include "AliESDtrack.h"
54#include "AliLog.h"
55#include "AliMCEvent.h"
56#include "AliHeader.h"
57#include "AliGenEventHeader.h"
58#include "AliStack.h"
59#include "AliMCInfoCuts.h"
60#include "AliRecInfoCuts.h"
61#include "AliTracker.h"
62#include "AliTreeDraw.h"
e6a60a90 63#include "AliTPCTransform.h"
64#include "AliTPCseed.h"
65#include "AliTPCcalibDB.h"
66#include "AliESDfriend.h"
67#include "AliESDfriendTrack.h"
68#include "AliTPCclusterMI.h"
7cc34f08 69
70using namespace std;
71
72ClassImp(AliPerformanceTPC)
73
27c7c4b3 74Bool_t AliPerformanceTPC::fgMergeTHnSparse = kFALSE;
75
636e5a51 76
7cc34f08 77//_____________________________________________________________________________
814d192f 78/*
7cc34f08 79AliPerformanceTPC::AliPerformanceTPC():
80 AliPerformanceObject("AliPerformanceTPC"),
e6a60a90 81 fTPCClustHisto(0),
a13f4653 82 fTPCEventHisto(0),
83 fTPCTrackHisto(0),
636e5a51 84 fFolderObj(0),
7cc34f08 85
86 // Cuts
87 fCutsRC(0),
88 fCutsMC(0),
89
90 // histogram folder
0ea40bb6 91 fAnalysisFolder(0),
92
93 fUseHLT(kFALSE)
177e2662 94
7cc34f08 95{
96 Init();
97}
814d192f 98*/
27c7c4b3 99
7cc34f08 100//_____________________________________________________________________________
c11cd0fa 101AliPerformanceTPC::AliPerformanceTPC(Char_t* name, Char_t* title,Int_t analysisMode,Bool_t hptGenerator, Int_t run, Bool_t highMult):
102 AliPerformanceObject(name,title,run,highMult),
e6a60a90 103 fTPCClustHisto(0),
a13f4653 104 fTPCEventHisto(0),
105 fTPCTrackHisto(0),
636e5a51 106 fFolderObj(0),
7cc34f08 107
108 // Cuts
109 fCutsRC(0),
110 fCutsMC(0),
111
112 // histogram folder
0ea40bb6 113 fAnalysisFolder(0),
114
115 fUseHLT(kFALSE)
177e2662 116
7cc34f08 117{
118 // named constructor
119 //
120 SetAnalysisMode(analysisMode);
121 SetHptGenerator(hptGenerator);
122
123 Init();
124}
125
27c7c4b3 126
7cc34f08 127//_____________________________________________________________________________
128AliPerformanceTPC::~AliPerformanceTPC()
129{
130 // destructor
131
e6a60a90 132 if(fTPCClustHisto) delete fTPCClustHisto; fTPCClustHisto=0;
a13f4653 133 if(fTPCEventHisto) delete fTPCEventHisto; fTPCEventHisto=0;
636e5a51 134 if(fTPCTrackHisto) delete fTPCTrackHisto; fTPCTrackHisto=0;
7cc34f08 135 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
636e5a51 136 if(fFolderObj) delete fFolderObj; fFolderObj=0;
7cc34f08 137}
138
27c7c4b3 139
7cc34f08 140//_____________________________________________________________________________
27c7c4b3 141void AliPerformanceTPC::Init()
142{
7cc34f08 143 //
144 // histogram bining
145 //
146
147 // set pt bins
148 Int_t nPtBins = 50;
36ace53b 149 Double_t ptMin = 1.e-2, ptMax = 20.;
7cc34f08 150
151 Double_t *binsPt = 0;
152 if (IsHptGenerator()) {
153 nPtBins = 100; ptMax = 100.;
154 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
155 } else {
156 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
157 }
158
bab2beef 159 /*
10d5d625 160 const Int_t nCOverPtBins = 80;
161 Double_t coverptMin = -10, coverptMax = 10;
162 Double_t *binsCOverPtP = 0;
163 Double_t *binsCOverPt = new Double_t[nCOverPtBins+1];
164 binsCOverPtP = CreateLogAxis(nCOverPtBins/2,0.04,coverptMax-0.04);
165 for(Int_t i=0; i < nCOverPtBins/2; i++){
166 binsCOverPt[nCOverPtBins - i] = binsCOverPtP[nCOverPtBins/2 - i];
167 binsCOverPt[i] = 0 - binsCOverPtP[nCOverPtBins/2 - i];
168 }
bab2beef 169 */
10d5d625 170
7cc34f08 171 /*
172 Int_t nPtBins = 31;
173 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.};
174 Double_t ptMin = 0., ptMax = 10.;
175
176 if(IsHptGenerator() == kTRUE) {
177 nPtBins = 100;
178 ptMin = 0.; ptMax = 100.;
179 }
180 */
814d192f 181 //
182
183 //
c11cd0fa 184 //padRow:phi:TPCSide
185 Int_t binsTPCClustHisto[3] = {160, 144, 2};
186 Double_t minTPCClustHisto[3] = {0., 0., 0.};
187 Double_t maxTPCClustHisto[3] = {160., 2.*TMath::Pi(), 2.};
188
189 fTPCClustHisto = new THnSparseF("fTPCClustHisto","padRow:phi:TPCSide",3,binsTPCClustHisto,minTPCClustHisto,maxTPCClustHisto);
190 fTPCClustHisto->GetAxis(0)->SetTitle("padRow");
191 fTPCClustHisto->GetAxis(1)->SetTitle("phi (rad)");
192 fTPCClustHisto->GetAxis(2)->SetTitle("TPCSide");
193 //fTPCClustHisto->Sumw2();
194
36ace53b 195 //padRow:phi:TPCSide:pad:detector:glZ
c11cd0fa 196 /*
197 Int_t binsTPCClustHisto[6] = {160, 144, 2, 128, 72, 50};
198 Double_t minTPCClustHisto[6] = {0., 0., 0., 0, 0, -250};
199 Double_t maxTPCClustHisto[6] = {160., 2.*TMath::Pi(), 2., 128, 72,250};
faa3b211 200
36ace53b 201 fTPCClustHisto = new THnSparseF("fTPCClustHisto","padRow:phi:TPCSide:pad:detector:gZ",6,binsTPCClustHisto,minTPCClustHisto,maxTPCClustHisto);
faa3b211 202 fTPCClustHisto->GetAxis(0)->SetTitle("padRow");
203 fTPCClustHisto->GetAxis(1)->SetTitle("phi (rad)");
e6a60a90 204 fTPCClustHisto->GetAxis(2)->SetTitle("TPCSide");
814d192f 205 fTPCClustHisto->GetAxis(3)->SetTitle("pad");
206 fTPCClustHisto->GetAxis(4)->SetTitle("detector");
36ace53b 207 fTPCClustHisto->GetAxis(5)->SetTitle("glZ (cm)");
0ea40bb6 208 //fTPCClustHisto->Sumw2();
c11cd0fa 209 */
814d192f 210
af960f39 211 Float_t scaleVxy = 1.0;
212 if(fAnalysisMode !=0) scaleVxy = 0.1;
213
28bb9d1f 214 Int_t maxMult;
af960f39 215 if (fHighMultiplicity) { maxMult = 4001; scaleVxy = 0.1;} else { maxMult = 151; }
886bf4d3 216 // Xv:Yv:Zv:mult:multP:multN:vertStatus
28bb9d1f 217 Int_t binsTPCEventHisto[7]= {100, 100, 100, maxMult, maxMult, maxMult, 2 };
af960f39 218 Double_t minTPCEventHisto[7]={-10.*scaleVxy, -10.*scaleVxy, -30., -0.5, -0.5, -0.5, -0.5 };
219 Double_t maxTPCEventHisto[7]={ 10.*scaleVxy, 10.*scaleVxy, 30., maxMult-0.5, maxMult-0.5, maxMult-0.5, 1.5 };
a13f4653 220
886bf4d3 221 fTPCEventHisto = new THnSparseF("fTPCEventHisto","Xv:Yv:Zv:mult:multP:multN:vertStatus",7,binsTPCEventHisto,minTPCEventHisto,maxTPCEventHisto);
a13f4653 222 fTPCEventHisto->GetAxis(0)->SetTitle("Xv (cm)");
223 fTPCEventHisto->GetAxis(1)->SetTitle("Yv (cm)");
224 fTPCEventHisto->GetAxis(2)->SetTitle("Zv (cm)");
225 fTPCEventHisto->GetAxis(3)->SetTitle("mult");
226 fTPCEventHisto->GetAxis(4)->SetTitle("multP");
227 fTPCEventHisto->GetAxis(5)->SetTitle("multN");
886bf4d3 228 fTPCEventHisto->GetAxis(6)->SetTitle("vertStatus");
0ea40bb6 229 //fTPCEventHisto->Sumw2();
a13f4653 230
af960f39 231 Float_t scaleDCA = 1.0;
232 if(fAnalysisMode !=0) scaleDCA = 0.1;
636e5a51 233 // nTPCClust:chi2PerTPCClust:nTPCClustFindRatio:DCAr:DCAz:eta:phi:pt:charge:vertStatus
5ca104e5 234 //Int_t binsTPCTrackHisto[10]= { 160, 20, 60, 30, 30, 30, 144, nPtBins, nCOverPtBins, 2 };
235 //Double_t minTPCTrackHisto[10]={ 0., 0., 0., -3*scaleDCA, -3.*scaleDCA, -1.5, 0., ptMin, coverptMin, -0.5 };
236 //Double_t maxTPCTrackHisto[10]={ 160., 5., 1.2, 3*scaleDCA, 3.*scaleDCA, 1.5, 2.*TMath::Pi(), ptMax, coverptMax, 1.5 };
237 Int_t binsTPCTrackHisto[10]= { 160, 20, 60, 30, 30, 30, 144, nPtBins, 3, 2 };
238 Double_t minTPCTrackHisto[10]={ 0., 0., 0., -3*scaleDCA, -3.*scaleDCA, -1.5, 0., ptMin, -1.5, -0.5 };
239 Double_t maxTPCTrackHisto[10]={ 160., 5., 1.2, 3*scaleDCA, 3.*scaleDCA, 1.5, 2.*TMath::Pi(), ptMax, 1.5, 1.5 };
636e5a51 240
316c9ceb 241 //fTPCTrackHisto = new THnSparseF("fTPCTrackHisto","nClust:chi2PerClust:nClust/nFindableClust:DCAr:DCAz:eta:phi:pt:charge/pt:vertStatus",10,binsTPCTrackHisto,minTPCTrackHisto,maxTPCTrackHisto);
242 fTPCTrackHisto = new THnSparseF("fTPCTrackHisto","nClust:chi2PerClust:nClust/nFindableClust:DCAr:DCAz:eta:phi:pt:charge:vertStatus",10,binsTPCTrackHisto,minTPCTrackHisto,maxTPCTrackHisto);
a13f4653 243 fTPCTrackHisto->SetBinEdges(7,binsPt);
e49fe881 244 //fTPCTrackHisto->SetBinEdges(8,binsCOverPt);
a13f4653 245 fTPCTrackHisto->GetAxis(0)->SetTitle("nClust");
246 fTPCTrackHisto->GetAxis(1)->SetTitle("chi2PerClust");
247 fTPCTrackHisto->GetAxis(2)->SetTitle("nClust/nFindableClust");
248 fTPCTrackHisto->GetAxis(3)->SetTitle("DCAr (cm)");
249 fTPCTrackHisto->GetAxis(4)->SetTitle("DCAz (cm)");
250 fTPCTrackHisto->GetAxis(5)->SetTitle("#eta");
251 fTPCTrackHisto->GetAxis(6)->SetTitle("#phi (rad)");
252 fTPCTrackHisto->GetAxis(7)->SetTitle("p_{T} (GeV/c)");
5ca104e5 253 //fTPCTrackHisto->GetAxis(8)->SetTitle("charge/pt");
254 fTPCTrackHisto->GetAxis(8)->SetTitle("charge");
636e5a51 255 fTPCTrackHisto->GetAxis(9)->SetTitle("vertStatus");
0ea40bb6 256 //fTPCTrackHisto->Sumw2();
7cc34f08 257
258 // Init cuts
814d192f 259 if(!fCutsMC) {
7cc34f08 260 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
814d192f 261 }
262 if(!fCutsRC) {
263 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
264 }
7cc34f08 265
266 // init folder
267 fAnalysisFolder = CreateFolder("folderTPC","Analysis Resolution Folder");
10d5d625 268
bab2beef 269 //delete []binsCOverPt;
7cc34f08 270}
271
27c7c4b3 272
7cc34f08 273//_____________________________________________________________________________
636e5a51 274void AliPerformanceTPC::ProcessTPC(AliStack* const stack, AliESDtrack *const esdTrack, AliESDEvent *const esdEvent, Bool_t vertStatus)
7cc34f08 275{
758320f7 276//
277// fill TPC QA info
278//
279 if(!esdEvent) return;
7cc34f08 280 if(!esdTrack) return;
281
758320f7 282 if( IsUseTrackVertex() )
283 {
284 // Relate TPC inner params to prim. vertex
285 const AliESDVertex *vtxESD = esdEvent->GetPrimaryVertexTracks();
286 Double_t x[3]; esdTrack->GetXYZ(x);
287 Double_t b[3]; AliTracker::GetBxByBz(x,b);
288 Bool_t isOK = esdTrack->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig);
289 if(!isOK) return;
290
291 /*
292 // JMT -- recaluclate DCA for HLT if not present
293 if ( dca[0] == 0. && dca[1] == 0. ) {
294 track->GetDZ( vtxESD->GetX(), vtxESD->GetY(), vtxESD->GetZ(), esdEvent->GetMagneticField(), dca );
295 }
296 */
297 }
298
7cc34f08 299 // Fill TPC only resolution comparison information
300 const AliExternalTrackParam *track = esdTrack->GetTPCInnerParam();
301 if(!track) return;
302
303 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
304 esdTrack->GetImpactParametersTPC(dca,cov);
305
a13f4653 306 Float_t q = esdTrack->Charge();
7cc34f08 307 Float_t pt = track->Pt();
308 Float_t eta = track->Eta();
309 Float_t phi = track->Phi();
310 Int_t nClust = esdTrack->GetTPCclusters(0);
311 Int_t nFindableClust = esdTrack->GetTPCNclsF();
312
313 Float_t chi2PerCluster = 0.;
314 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
315
316 Float_t clustPerFindClust = 0.;
317 if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;
318
10d5d625 319 Float_t qpt = 0;
320 if( fabs(pt)>0 ) qpt = q/fabs(pt);
321
af960f39 322 // filter out noise tracks
323 if(esdTrack->GetTPCsignal() < 5) return;
324
a13f4653 325 //
326 // select primaries
327 //
328 Double_t dcaToVertex = -1;
329 if( fCutsRC->GetDCAToVertex2D() )
330 {
177e2662 331 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY() + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
7cc34f08 332 }
a13f4653 333 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
334 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
335 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
336
4c3dbf43 337 //Double_t vTPCTrackHisto[10] = {nClust,chi2PerCluster,clustPerFindClust,dca[0],dca[1],eta,phi,pt,qpt,vertStatus};
338 Double_t vTPCTrackHisto[10] = {nClust,chi2PerCluster,clustPerFindClust,dca[0],dca[1],eta,phi,pt,q,vertStatus};
a13f4653 339 fTPCTrackHisto->Fill(vTPCTrackHisto);
7cc34f08 340
341 //
342 // Fill rec vs MC information
343 //
344 if(!stack) return;
345
346}
347
27c7c4b3 348
7cc34f08 349//_____________________________________________________________________________
636e5a51 350void AliPerformanceTPC::ProcessTPCITS(AliStack* const stack, AliESDtrack *const esdTrack, AliESDEvent* const esdEvent, Bool_t vertStatus)
7cc34f08 351{
352 // Fill comparison information (TPC+ITS)
758320f7 353 if(!esdTrack) return;
354 if(!esdEvent) return;
355
356 if( IsUseTrackVertex() )
357 {
358 // Relate TPC inner params to prim. vertex
359 const AliESDVertex *vtxESD = esdEvent->GetPrimaryVertexTracks();
360 Double_t x[3]; esdTrack->GetXYZ(x);
361 Double_t b[3]; AliTracker::GetBxByBz(x,b);
362 Bool_t isOK = esdTrack->RelateToVertexBxByBz(vtxESD, b, kVeryBig);
363 if(!isOK) return;
364
365 /*
366 // JMT -- recaluclate DCA for HLT if not present
367 if ( dca[0] == 0. && dca[1] == 0. ) {
368 track->GetDZ( vtxESD->GetX(), vtxESD->GetY(), vtxESD->GetZ(), esdEvent->GetMagneticField(), dca );
369 }
370 */
371 }
372
373 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
374 esdTrack->GetImpactParameters(dca,cov);
375
376 if ((esdTrack->GetStatus()&AliESDtrack::kITSrefit)==0) return; // ITS refit
377 if ((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0) return; // TPC refit
af960f39 378 if ((esdTrack->HasPointOnITSLayer(0)==kFALSE)&&(esdTrack->HasPointOnITSLayer(1)==kFALSE)) return; // at least one SPD
379 //if (esdTrack->GetITSclusters(0)<fCutsRC->GetMinNClustersITS()) return; // min. nb. ITS clusters
758320f7 380
381 Float_t q = esdTrack->Charge();
382 Float_t pt = esdTrack->Pt();
383 Float_t eta = esdTrack->Eta();
384 Float_t phi = esdTrack->Phi();
385 Int_t nClust = esdTrack->GetTPCclusters(0);
386 Int_t nFindableClust = esdTrack->GetTPCNclsF();
387
388 Float_t chi2PerCluster = 0.;
389 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
390
391 Float_t clustPerFindClust = 0.;
392 if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;
393
10d5d625 394 Float_t qpt = 0;
395 if( fabs(pt)>0 ) qpt = q/fabs(pt);
396
758320f7 397 //
398 // select primaries
399 //
400 Double_t dcaToVertex = -1;
401 if( fCutsRC->GetDCAToVertex2D() )
402 {
403 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY() + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
404 }
405 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
406 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
407 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
408
bab2beef 409 Double_t vTPCTrackHisto[10] = {nClust,chi2PerCluster,clustPerFindClust,dca[0],dca[1],eta,phi,pt,q,vertStatus};
758320f7 410 fTPCTrackHisto->Fill(vTPCTrackHisto);
411
412 //
413 // Fill rec vs MC information
414 //
415 if(!stack) return;
7cc34f08 416}
27c7c4b3 417
418
7cc34f08 419//_____________________________________________________________________________
758320f7 420void AliPerformanceTPC::ProcessConstrained(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/, AliESDEvent* const /*esdEvent*/)
7cc34f08 421{
422 // Fill comparison information (constarained parameters)
423 AliDebug(AliLog::kWarning, "Warning: Not implemented");
424}
27c7c4b3 425
426
7cc34f08 427//_____________________________________________________________________________
428void AliPerformanceTPC::Exec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent, AliESDfriend *const esdFriend, const Bool_t bUseMC, const Bool_t bUseESDfriend)
429{
430 // Process comparison information
431 //
af960f39 432
7cc34f08 433 if(!esdEvent)
434 {
435 Error("Exec","esdEvent not available");
436 return;
437 }
438 AliHeader* header = 0;
439 AliGenEventHeader* genHeader = 0;
440 AliStack* stack = 0;
441 TArrayF vtxMC(3);
442
443 if(bUseMC)
444 {
445 if(!mcEvent) {
446 Error("Exec","mcEvent not available");
447 return;
448 }
449 // get MC event header
450 header = mcEvent->Header();
451 if (!header) {
452 Error("Exec","Header not available");
453 return;
454 }
455 // MC particle stack
456 stack = mcEvent->Stack();
457 if (!stack) {
458 Error("Exec","Stack not available");
459 return;
460 }
461 // get MC vertex
462 genHeader = header->GenEventHeader();
463 if (!genHeader) {
464 Error("Exec","Could not retrieve genHeader from Header");
465 return;
466 }
467 genHeader->PrimaryVertex(vtxMC);
468 }
469
e6a60a90 470 // trigger
046b4280 471 if(!bUseMC &&GetTriggerClass()) {
4bb5f8a9 472 Bool_t isEventTriggered = esdEvent->IsTriggerClassFired(GetTriggerClass());
473 if(!isEventTriggered) return;
474 }
e6a60a90 475
476 // get TPC event vertex
177e2662 477 const AliESDVertex *vtxESD = NULL;
478 if(fUseTrackVertex) {
479 vtxESD = esdEvent->GetPrimaryVertexTracks();
480 } else {
481 vtxESD = esdEvent->GetPrimaryVertexTPC();
482 }
9ca899e5 483 if(!vtxESD) return;
e6a60a90 484
485 // events with rec. vertex
a13f4653 486 Int_t mult=0; Int_t multP=0; Int_t multN=0;
636e5a51 487
488 // changed to take all events but store vertex status
489// if(vtxESD->GetStatus() >0)
490// {
491 // store vertex status
492 Bool_t vertStatus = vtxESD->GetStatus();
e6a60a90 493 // Process ESD events
7cc34f08 494 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
495 {
a13f4653 496 AliESDtrack *track = esdEvent->GetTrack(iTrack);
7cc34f08 497 if(!track) continue;
498
c1b69b58 499 // if not fUseKinkDaughters don't use tracks with kink index > 0
500 if(!fUseKinkDaughters && track->GetKinkIndex(0) > 0) continue;
501
faa3b211 502 if(bUseESDfriend && esdFriend && esdFriend->TestSkipBit()==kFALSE)
4e59b45c 503 {
504 AliESDfriendTrack *friendTrack=esdFriend->GetTrack(iTrack);
177e2662 505 if(friendTrack)
506 {
faa3b211 507 //
177e2662 508 TObject *calibObject=0;
509 AliTPCseed *seed=0;
faa3b211 510 for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j) {
177e2662 511 if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) {
512 break;
513 }
e6a60a90 514 }
515
faa3b211 516 //
e6a60a90 517 for (Int_t irow=0;irow<159;irow++) {
518 if(!seed) continue;
519
520 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow);
521 if (!cluster) continue;
522
faa3b211 523 Float_t gclf[3];
524 cluster->GetGlobalXYZ(gclf);
e6a60a90 525
faa3b211 526 //Double_t x[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
527 //Int_t i[1]={cluster->GetDetector()};
528 //transform->Transform(x,i,0,1);
529 //printf("gx %f gy %f gz %f \n", cluster->GetX(), cluster->GetY(),cluster->GetZ());
530 //printf("gclf[0] %f gclf[1] %f gclf[2] %f \n", gclf[0], gclf[1], gclf[2]);
e6a60a90 531
532 Int_t TPCside;
533 if(gclf[2]>0.) TPCside=0; // A side
534 else TPCside=1;
535
faa3b211 536 //
537 //Double_t vTPCClust1[3] = { gclf[0], gclf[1], TPCside };
538 //fTPCClustHisto1->Fill(vTPCClust1);
539
540 //
541 Double_t phi = TMath::ATan2(gclf[1],gclf[0]);
542 if(phi < 0) phi += 2.*TMath::Pi();
543
c11cd0fa 544 //Float_t pad = cluster->GetPad();
545 //Int_t detector = cluster->GetDetector();
546 //Double_t vTPCClust[6] = { irow, phi, TPCside, pad, detector, gclf[2] };
547 Double_t vTPCClust[3] = { irow, phi, TPCside };
e6a60a90 548 fTPCClustHisto->Fill(vTPCClust);
faa3b211 549 }
550 }
e6a60a90 551 }
177e2662 552
636e5a51 553 if(GetAnalysisMode() == 0) ProcessTPC(stack,track,esdEvent,vertStatus);
554 else if(GetAnalysisMode() == 1) ProcessTPCITS(stack,track,esdEvent,vertStatus);
758320f7 555 else if(GetAnalysisMode() == 2) ProcessConstrained(stack,track,esdEvent);
7cc34f08 556 else {
557 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
558 return;
559 }
a13f4653 560
0ea40bb6 561 // TPC only
562 if(!fUseHLT){
af960f39 563 if(GetAnalysisMode() == 0) {
564 AliESDtrack *tpcTrack = AliESDtrackCuts::GetTPCOnlyTrack(esdEvent,iTrack);
565 if(!tpcTrack) continue;
0ea40bb6 566
af960f39 567 // track selection
568 if( fCutsRC->AcceptTrack(tpcTrack) ) {
569 mult++;
570 if(tpcTrack->Charge()>0.) multP++;
571 if(tpcTrack->Charge()<0.) multN++;
572 }
573 if(tpcTrack) delete tpcTrack;
0ea40bb6 574 }
af960f39 575 else {
576 // track selection
577 if( fCutsRC->AcceptTrack(track) ) {
578 mult++;
579 if(track->Charge()>0.) multP++;
580 if(track->Charge()<0.) multN++;
581 }
582 }
0ea40bb6 583 }
af960f39 584 else {
0ea40bb6 585 if( fCutsRC->AcceptTrack(track) ) {
586 //Printf("Still here for HLT");
587 mult++;
588 if(track->Charge()>0.) multP++;
589 if(track->Charge()<0.) multN++;
590 }
af960f39 591 }
7cc34f08 592 }
e6a60a90 593
886bf4d3 594 Double_t vTPCEvent[7] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv(),mult,multP,multN,vtxESD->GetStatus()};
a13f4653 595 fTPCEventHisto->Fill(vTPCEvent);
7cc34f08 596}
597
636e5a51 598
27c7c4b3 599//_____________________________________________________________________________
600void AliPerformanceTPC::Analyse()
601{
602 //
603 // Analyse comparison information and store output histograms
604 // in the folder "folderTPC"
605 //
606 TH1::AddDirectory(kFALSE);
0ea40bb6 607 TH1::SetDefaultSumw2(kFALSE);
27c7c4b3 608 TObjArray *aFolderObj = new TObjArray;
609 //aFolderObj->SetOwner(); // objects are owned by fanalysisFolder
610 TString selString;
611
612 //
613 // Cluster histograms
614 //
28bb9d1f 615 AddProjection(aFolderObj, "clust", fTPCClustHisto, 0, 1, 2);
27c7c4b3 616
617 selString = "all";
618 for(Int_t i=0; i <= 2; i++) {
28bb9d1f 619 AddProjection(aFolderObj, "clust", fTPCClustHisto, i, &selString);
27c7c4b3 620 }
621
0ea40bb6 622 //fTPCClustHisto->GetAxis(2)->SetRange(1,1); // A-side
623 //selString = "A_side";
624 //AddProjection(aFolderObj, fTPCClustHisto, 0, 1, &selString);
27c7c4b3 625
0ea40bb6 626 //fTPCClustHisto->GetAxis(2)->SetRange(2,2); // C-side
627 //selString = "C_side";
628 //AddProjection(aFolderObj, fTPCClustHisto, 0, 1, &selString);
27c7c4b3 629
630 //reset range
631 fTPCClustHisto->GetAxis(2)->SetRange(1,2);
632
633 //
634 // event histograms
635 //
636 for(Int_t i=0; i<=6; i++) {
28bb9d1f 637 AddProjection(aFolderObj, "event", fTPCEventHisto, i);
0ea40bb6 638 }
28bb9d1f 639 AddProjection(aFolderObj, "event", fTPCEventHisto, 4, 5);
640 AddProjection(aFolderObj, "event", fTPCEventHisto, 0, 1);
641 AddProjection(aFolderObj, "event", fTPCEventHisto, 0, 3);
642 AddProjection(aFolderObj, "event", fTPCEventHisto, 1, 3);
643 AddProjection(aFolderObj, "event", fTPCEventHisto, 2, 3);
27c7c4b3 644
645 // reconstructed vertex status > 0
646 fTPCEventHisto->GetAxis(6)->SetRange(2,2);
647 selString = "recVertex";
648 for(Int_t i=0; i<=5; i++) {
28bb9d1f 649 AddProjection(aFolderObj, "event", fTPCEventHisto, i, &selString);
27c7c4b3 650 }
28bb9d1f 651 AddProjection(aFolderObj, "event", fTPCEventHisto, 4, 5, &selString);
652 AddProjection(aFolderObj, "event", fTPCEventHisto, 0, 1, &selString);
653 AddProjection(aFolderObj, "event", fTPCEventHisto, 0, 3, &selString);
654 AddProjection(aFolderObj, "event", fTPCEventHisto, 1, 3, &selString);
655 AddProjection(aFolderObj, "event", fTPCEventHisto, 2, 3, &selString);
27c7c4b3 656
657 // reset cuts
658 fTPCEventHisto->GetAxis(6)->SetRange(1,2);
659
660 //
661 // Track histograms
662 //
663 // all with vertex
5ca104e5 664 fTPCTrackHisto->GetAxis(8)->SetRangeUser(-1.5,1.5);
27c7c4b3 665 fTPCTrackHisto->GetAxis(9)->SetRangeUser(0.5,1.5);
666 selString = "all_recVertex";
667 for(Int_t i=0; i <= 9; i++) {
28bb9d1f 668 AddProjection(aFolderObj, "track", fTPCTrackHisto, i, &selString);
27c7c4b3 669 }
10d5d625 670
671 AddProjection(aFolderObj, "track", fTPCTrackHisto, 5, 8, &selString);
672
0ea40bb6 673 for(Int_t i=0; i <= 4; i++) {
28bb9d1f 674 AddProjection(aFolderObj, "track", fTPCTrackHisto, i, 5, 7, &selString);
0ea40bb6 675 }
676
677
27c7c4b3 678
679 // Track histograms (pos with vertex)
5ca104e5 680 fTPCTrackHisto->GetAxis(8)->SetRangeUser(0,1.5);
27c7c4b3 681 selString = "pos_recVertex";
682 for(Int_t i=0; i <= 9; i++) {
28bb9d1f 683 AddProjection(aFolderObj, "track", fTPCTrackHisto, i, &selString);
27c7c4b3 684 }
0ea40bb6 685 for(Int_t i=0; i <= 4; i++) { for(Int_t j=5; j <= 5; j++) { for(Int_t k=j+1; k <= 7; k++) {
28bb9d1f 686 AddProjection(aFolderObj, "track", fTPCTrackHisto, i, j, k, &selString);
27c7c4b3 687 } } }
28bb9d1f 688 AddProjection(aFolderObj, "track", fTPCTrackHisto, 0, 1, 2, &selString);
689 AddProjection(aFolderObj, "track", fTPCTrackHisto, 0, 1, 5, &selString);
690 AddProjection(aFolderObj, "track", fTPCTrackHisto, 0, 2, 5, &selString);
691 AddProjection(aFolderObj, "track", fTPCTrackHisto, 1, 2, 5, &selString);
692 AddProjection(aFolderObj, "track", fTPCTrackHisto, 3, 4, 5, &selString);
693 AddProjection(aFolderObj, "track", fTPCTrackHisto, 5, 6, 7, &selString);
636e5a51 694
27c7c4b3 695 // Track histograms (neg with vertex)
5ca104e5 696 fTPCTrackHisto->GetAxis(8)->SetRangeUser(-1.5,0);
27c7c4b3 697 selString = "neg_recVertex";
698 for(Int_t i=0; i <= 9; i++) {
28bb9d1f 699 AddProjection(aFolderObj, "track", fTPCTrackHisto, i, &selString);
27c7c4b3 700 }
0ea40bb6 701 for(Int_t i=0; i <= 4; i++) { for(Int_t j=5; j <= 5; j++) { for(Int_t k=j+1; k <= 7; k++) {
28bb9d1f 702 AddProjection(aFolderObj, "track", fTPCTrackHisto, i, j, k, &selString);
27c7c4b3 703 } } }
28bb9d1f 704 AddProjection(aFolderObj, "track", fTPCTrackHisto, 0, 1, 2, &selString);
705 AddProjection(aFolderObj, "track", fTPCTrackHisto, 0, 1, 5, &selString);
706 AddProjection(aFolderObj, "track", fTPCTrackHisto, 0, 2, 5, &selString);
707 AddProjection(aFolderObj, "track", fTPCTrackHisto, 1, 2, 5, &selString);
708 AddProjection(aFolderObj, "track", fTPCTrackHisto, 3, 4, 5, &selString);
af960f39 709 AddProjection(aFolderObj, "track", fTPCTrackHisto, 5, 6, 7, &selString);
10d5d625 710
27c7c4b3 711 //restore cuts
5ca104e5 712 fTPCTrackHisto->GetAxis(8)->SetRangeUser(-1.5,1.5);
27c7c4b3 713 fTPCTrackHisto->GetAxis(9)->SetRangeUser(-0.5,1.5);
636e5a51 714
715
716 printf("exportToFolder\n");
27c7c4b3 717 // export objects to analysis folder
718 fAnalysisFolder = ExportToFolder(aFolderObj);
719 if (fFolderObj) delete fFolderObj;
720 fFolderObj = aFolderObj;
721 aFolderObj=0;
7cc34f08 722}
723
27c7c4b3 724
7cc34f08 725//_____________________________________________________________________________
726TFolder* AliPerformanceTPC::ExportToFolder(TObjArray * array)
727{
728 // recreate folder avery time and export objects to new one
729 //
730 AliPerformanceTPC * comp=this;
731 TFolder *folder = comp->GetAnalysisFolder();
732
733 TString name, title;
734 TFolder *newFolder = 0;
735 Int_t i = 0;
736 Int_t size = array->GetSize();
737
738 if(folder) {
739 // get name and title from old folder
740 name = folder->GetName();
741 title = folder->GetTitle();
742
743 // delete old one
744 delete folder;
745
746 // create new one
747 newFolder = CreateFolder(name.Data(),title.Data());
748 newFolder->SetOwner();
749
750 // add objects to folder
751 while(i < size) {
752 newFolder->Add(array->At(i));
753 i++;
754 }
755 }
756
757return newFolder;
758}
759
760//_____________________________________________________________________________
761Long64_t AliPerformanceTPC::Merge(TCollection* const list)
762{
763 // Merge list of objects (needed by PROOF)
764
765 if (!list)
766 return 0;
767
768 if (list->IsEmpty())
769 return 1;
770
771 TIterator* iter = list->MakeIterator();
772 TObject* obj = 0;
636e5a51 773 TObjArray* objArrayList = 0;
774 objArrayList = new TObjArray();
7cc34f08 775
776 // collection of generated histograms
777 Int_t count=0;
778 while((obj = iter->Next()) != 0)
779 {
a13f4653 780 AliPerformanceTPC* entry = dynamic_cast<AliPerformanceTPC*>(obj);
781 if (entry == 0) continue;
27c7c4b3 782 if (fgMergeTHnSparse) {
783 if ((fTPCClustHisto) && (entry->fTPCClustHisto)) { fTPCClustHisto->Add(entry->fTPCClustHisto); }
784 if ((fTPCEventHisto) && (entry->fTPCEventHisto)) { fTPCEventHisto->Add(entry->fTPCEventHisto); }
785 if ((fTPCTrackHisto) && (entry->fTPCTrackHisto)) { fTPCTrackHisto->Add(entry->fTPCTrackHisto); }
786 }
636e5a51 787 // the analysisfolder is only merged if present
788 if (entry->fFolderObj) { objArrayList->Add(entry->fFolderObj); }
7cc34f08 789
a13f4653 790 count++;
7cc34f08 791 }
636e5a51 792 if (fFolderObj) { fFolderObj->Merge(objArrayList); }
793 // to signal that track histos were not merged: reset
27c7c4b3 794 if (!fgMergeTHnSparse) { fTPCTrackHisto->Reset(); fTPCClustHisto->Reset(); fTPCEventHisto->Reset(); }
636e5a51 795 // delete
27c7c4b3 796 if (objArrayList) delete objArrayList; objArrayList=0;
7cc34f08 797return count;
798}
799
27c7c4b3 800
7cc34f08 801//_____________________________________________________________________________
814d192f 802TFolder* AliPerformanceTPC::CreateFolder(TString name, TString title)
803{
7cc34f08 804// create folder for analysed histograms
805//
806TFolder *folder = 0;
807 folder = new TFolder(name.Data(),title.Data());
808
809 return folder;
810}
636e5a51 811
814d192f 812//_____________________________________________________________________________
813TTree* AliPerformanceTPC::CreateSummary()
814{
815 // implementaion removed, switched back to use AliPerformanceSummary (now called in AliPerformanceTask)
816 return 0;
817}
818