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 // Changes by M.Knichel 16/08/2010
12 //------------------------------------------------------------------------------
16 // after running comparison task, read the file, and get component
17 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
20 TFile f("Output.root");
21 AliPerformanceTPC * compObj = (AliPerformanceTPC*)coutput->FindObject("AliPerformanceTPC");
23 // analyse comparison data
26 // the output histograms/graphs will be stored in the folder "folderTPC"
27 compObj->GetAnalysisFolder()->ls("*");
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();
42 #include "TPostScript.h"
45 #include "AliPerformanceTPC.h"
46 #include "AliESDEvent.h"
47 #include "AliESDVertex.h"
48 #include "AliESDtrack.h"
50 #include "AliMCEvent.h"
51 #include "AliHeader.h"
52 #include "AliGenEventHeader.h"
54 #include "AliMCInfoCuts.h"
55 #include "AliRecInfoCuts.h"
56 #include "AliTracker.h"
57 #include "AliTreeDraw.h"
58 #include "AliTPCTransform.h"
59 #include "AliTPCseed.h"
60 #include "AliTPCcalibDB.h"
61 #include "AliESDfriend.h"
62 #include "AliESDfriendTrack.h"
63 #include "AliTPCclusterMI.h"
67 ClassImp(AliPerformanceTPC)
69 Bool_t AliPerformanceTPC::fgMergeTHnSparse = kFALSE;
72 //_____________________________________________________________________________
73 AliPerformanceTPC::AliPerformanceTPC():
74 AliPerformanceObject("AliPerformanceTPC"),
94 //_____________________________________________________________________________
95 AliPerformanceTPC::AliPerformanceTPC(Char_t* name="AliPerformanceTPC", Char_t* title="AliPerformanceTPC",Int_t analysisMode=0,Bool_t hptGenerator=kFALSE):
96 AliPerformanceObject(name,title),
114 SetAnalysisMode(analysisMode);
115 SetHptGenerator(hptGenerator);
121 //_____________________________________________________________________________
122 AliPerformanceTPC::~AliPerformanceTPC()
126 if(fTPCClustHisto) delete fTPCClustHisto; fTPCClustHisto=0;
127 if(fTPCEventHisto) delete fTPCEventHisto; fTPCEventHisto=0;
128 if(fTPCTrackHisto) delete fTPCTrackHisto; fTPCTrackHisto=0;
129 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
130 if(fFolderObj) delete fFolderObj; fFolderObj=0;
134 //_____________________________________________________________________________
135 void AliPerformanceTPC::Init()
143 Double_t ptMin = 1.e-2, ptMax = 10.;
145 Double_t *binsPt = 0;
146 if (IsHptGenerator()) {
147 nPtBins = 100; ptMax = 100.;
148 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
150 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
155 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.};
156 Double_t ptMin = 0., ptMax = 10.;
158 if(IsHptGenerator() == kTRUE) {
160 ptMin = 0.; ptMax = 100.;
167 Int_t binsTPCClustHisto[3] = {160, 180, 2 };
168 Double_t minTPCClustHisto[3] = {0., 0., 0.};
169 Double_t maxTPCClustHisto[3] = {160., 2.*TMath::Pi(), 2.};
171 fTPCClustHisto = new THnSparseF("fTPCClustHisto","padRow:phi:TPCSide",3,binsTPCClustHisto,minTPCClustHisto,maxTPCClustHisto);
172 fTPCClustHisto->GetAxis(0)->SetTitle("padRow");
173 fTPCClustHisto->GetAxis(1)->SetTitle("phi (rad)");
174 fTPCClustHisto->GetAxis(2)->SetTitle("TPCSide");
175 //fTPCClustHisto->Sumw2();
177 // Xv:Yv:Zv:mult:multP:multN:vertStatus
178 Int_t binsTPCEventHisto[7]= {100, 100, 100, 151, 151, 151, 2 };
179 Double_t minTPCEventHisto[7]={-10., -10., -30., -0.5, -0.5, -0.5, -0.5 };
180 Double_t maxTPCEventHisto[7]={ 10., 10., 30., 150.5, 150.5, 150.5, 1.5 };
182 fTPCEventHisto = new THnSparseF("fTPCEventHisto","Xv:Yv:Zv:mult:multP:multN:vertStatus",7,binsTPCEventHisto,minTPCEventHisto,maxTPCEventHisto);
183 fTPCEventHisto->GetAxis(0)->SetTitle("Xv (cm)");
184 fTPCEventHisto->GetAxis(1)->SetTitle("Yv (cm)");
185 fTPCEventHisto->GetAxis(2)->SetTitle("Zv (cm)");
186 fTPCEventHisto->GetAxis(3)->SetTitle("mult");
187 fTPCEventHisto->GetAxis(4)->SetTitle("multP");
188 fTPCEventHisto->GetAxis(5)->SetTitle("multN");
189 fTPCEventHisto->GetAxis(6)->SetTitle("vertStatus");
190 //fTPCEventHisto->Sumw2();
193 // nTPCClust:chi2PerTPCClust:nTPCClustFindRatio:DCAr:DCAz:eta:phi:pt:charge:vertStatus
194 Int_t binsTPCTrackHisto[10]= { 160, 20, 60, 30, 30, 30, 144, nPtBins, 3, 2 };
195 Double_t minTPCTrackHisto[10]={ 0., 0., 0., -3, -3., -1.5, 0., ptMin, -1.5, -0.5 };
196 Double_t maxTPCTrackHisto[10]={ 160., 5., 1.2, 3, 3., 1.5, 2.*TMath::Pi(), ptMax, 1.5, 1.5 };
198 // nTPCClust:chi2PerTPCClust:nTPCClustFindRatio:DCAr:DCAz:eta:phi:pt:charge:vertStatus
199 // Int_t binsTPCTrackHisto[10]= { 160, 50, 60, 100, 100, 30, 144, nPtBins, 3, 2 };
200 // Double_t minTPCTrackHisto[10]={ 0., 0., 0., -10, -10., -1.5, 0., ptMin, -1.5, 0 };
201 // Double_t maxTPCTrackHisto[10]={ 160., 10., 1.2, 10, 10., 1.5, 2.*TMath::Pi(), ptMax, 1.5, 2 };
205 fTPCTrackHisto = new THnSparseF("fTPCTrackHisto","nClust:chi2PerClust:nClust/nFindableClust:DCAr:DCAz:eta:phi:pt:charge:vertStatus",10,binsTPCTrackHisto,minTPCTrackHisto,maxTPCTrackHisto);
206 fTPCTrackHisto->SetBinEdges(7,binsPt);
208 fTPCTrackHisto->GetAxis(0)->SetTitle("nClust");
209 fTPCTrackHisto->GetAxis(1)->SetTitle("chi2PerClust");
210 fTPCTrackHisto->GetAxis(2)->SetTitle("nClust/nFindableClust");
211 fTPCTrackHisto->GetAxis(3)->SetTitle("DCAr (cm)");
212 fTPCTrackHisto->GetAxis(4)->SetTitle("DCAz (cm)");
213 fTPCTrackHisto->GetAxis(5)->SetTitle("#eta");
214 fTPCTrackHisto->GetAxis(6)->SetTitle("#phi (rad)");
215 fTPCTrackHisto->GetAxis(7)->SetTitle("p_{T} (GeV/c)");
216 fTPCTrackHisto->GetAxis(8)->SetTitle("charge");
217 fTPCTrackHisto->GetAxis(9)->SetTitle("vertStatus");
218 //fTPCTrackHisto->Sumw2();
222 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
224 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
227 fAnalysisFolder = CreateFolder("folderTPC","Analysis Resolution Folder");
232 //_____________________________________________________________________________
233 void AliPerformanceTPC::ProcessTPC(AliStack* const stack, AliESDtrack *const esdTrack, AliESDEvent *const esdEvent, Bool_t vertStatus)
238 if(!esdEvent) return;
239 if(!esdTrack) return;
241 if( IsUseTrackVertex() )
243 // Relate TPC inner params to prim. vertex
244 const AliESDVertex *vtxESD = esdEvent->GetPrimaryVertexTracks();
245 Double_t x[3]; esdTrack->GetXYZ(x);
246 Double_t b[3]; AliTracker::GetBxByBz(x,b);
247 Bool_t isOK = esdTrack->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig);
251 // JMT -- recaluclate DCA for HLT if not present
252 if ( dca[0] == 0. && dca[1] == 0. ) {
253 track->GetDZ( vtxESD->GetX(), vtxESD->GetY(), vtxESD->GetZ(), esdEvent->GetMagneticField(), dca );
258 // Fill TPC only resolution comparison information
259 const AliExternalTrackParam *track = esdTrack->GetTPCInnerParam();
262 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
263 esdTrack->GetImpactParametersTPC(dca,cov);
265 Float_t q = esdTrack->Charge();
266 Float_t pt = track->Pt();
267 Float_t eta = track->Eta();
268 Float_t phi = track->Phi();
269 Int_t nClust = esdTrack->GetTPCclusters(0);
270 Int_t nFindableClust = esdTrack->GetTPCNclsF();
272 Float_t chi2PerCluster = 0.;
273 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
275 Float_t clustPerFindClust = 0.;
276 if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;
281 Double_t dcaToVertex = -1;
282 if( fCutsRC->GetDCAToVertex2D() )
284 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY() + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
286 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
287 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
288 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
290 Double_t vTPCTrackHisto[10] = {nClust,chi2PerCluster,clustPerFindClust,dca[0],dca[1],eta,phi,pt,q,vertStatus};
291 fTPCTrackHisto->Fill(vTPCTrackHisto);
294 // Fill rec vs MC information
301 //_____________________________________________________________________________
302 void AliPerformanceTPC::ProcessTPCITS(AliStack* const stack, AliESDtrack *const esdTrack, AliESDEvent* const esdEvent, Bool_t vertStatus)
304 // Fill comparison information (TPC+ITS)
305 if(!esdTrack) return;
306 if(!esdEvent) return;
308 if( IsUseTrackVertex() )
310 // Relate TPC inner params to prim. vertex
311 const AliESDVertex *vtxESD = esdEvent->GetPrimaryVertexTracks();
312 Double_t x[3]; esdTrack->GetXYZ(x);
313 Double_t b[3]; AliTracker::GetBxByBz(x,b);
314 Bool_t isOK = esdTrack->RelateToVertexBxByBz(vtxESD, b, kVeryBig);
318 // JMT -- recaluclate DCA for HLT if not present
319 if ( dca[0] == 0. && dca[1] == 0. ) {
320 track->GetDZ( vtxESD->GetX(), vtxESD->GetY(), vtxESD->GetZ(), esdEvent->GetMagneticField(), dca );
325 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
326 esdTrack->GetImpactParameters(dca,cov);
328 if ((esdTrack->GetStatus()&AliESDtrack::kITSrefit)==0) return; // ITS refit
329 if ((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0) return; // TPC refit
330 if (esdTrack->GetITSclusters(0)<fCutsRC->GetMinNClustersITS()) return; // min. nb. ITS clusters
332 Float_t q = esdTrack->Charge();
333 Float_t pt = esdTrack->Pt();
334 Float_t eta = esdTrack->Eta();
335 Float_t phi = esdTrack->Phi();
336 Int_t nClust = esdTrack->GetTPCclusters(0);
337 Int_t nFindableClust = esdTrack->GetTPCNclsF();
339 Float_t chi2PerCluster = 0.;
340 if(nClust>0.) chi2PerCluster = esdTrack->GetTPCchi2()/Float_t(nClust);
342 Float_t clustPerFindClust = 0.;
343 if(nFindableClust>0.) clustPerFindClust = Float_t(nClust)/nFindableClust;
348 Double_t dcaToVertex = -1;
349 if( fCutsRC->GetDCAToVertex2D() )
351 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY() + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
353 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
354 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
355 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
357 Double_t vTPCTrackHisto[10] = {nClust,chi2PerCluster,clustPerFindClust,dca[0],dca[1],eta,phi,pt,q,vertStatus};
358 fTPCTrackHisto->Fill(vTPCTrackHisto);
361 // Fill rec vs MC information
367 //_____________________________________________________________________________
368 void AliPerformanceTPC::ProcessConstrained(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/, AliESDEvent* const /*esdEvent*/)
370 // Fill comparison information (constarained parameters)
371 AliDebug(AliLog::kWarning, "Warning: Not implemented");
375 //_____________________________________________________________________________
376 void AliPerformanceTPC::Exec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent, AliESDfriend *const esdFriend, const Bool_t bUseMC, const Bool_t bUseESDfriend)
378 // Process comparison information
382 Error("Exec","esdEvent not available");
385 AliHeader* header = 0;
386 AliGenEventHeader* genHeader = 0;
393 Error("Exec","mcEvent not available");
396 // get MC event header
397 header = mcEvent->Header();
399 Error("Exec","Header not available");
403 stack = mcEvent->Stack();
405 Error("Exec","Stack not available");
409 genHeader = header->GenEventHeader();
411 Error("Exec","Could not retrieve genHeader from Header");
414 genHeader->PrimaryVertex(vtxMC);
418 if(!bUseMC &&GetTriggerClass()) {
419 Bool_t isEventTriggered = esdEvent->IsTriggerClassFired(GetTriggerClass());
420 if(!isEventTriggered) return;
423 // get TPC event vertex
424 const AliESDVertex *vtxESD = NULL;
425 if(fUseTrackVertex) {
426 vtxESD = esdEvent->GetPrimaryVertexTracks();
428 vtxESD = esdEvent->GetPrimaryVertexTPC();
432 // events with rec. vertex
433 Int_t mult=0; Int_t multP=0; Int_t multN=0;
435 // changed to take all events but store vertex status
436 // if(vtxESD->GetStatus() >0)
438 // store vertex status
439 Bool_t vertStatus = vtxESD->GetStatus();
440 // Process ESD events
441 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
443 AliESDtrack *track = esdEvent->GetTrack(iTrack);
446 if(bUseESDfriend && esdFriend && esdFriend->TestSkipBit()==kFALSE)
448 AliESDfriendTrack *friendTrack=esdFriend->GetTrack(iTrack);
452 TObject *calibObject=0;
454 for (Int_t j=0;(calibObject=friendTrack->GetCalibObject(j));++j) {
455 if ((seed=dynamic_cast<AliTPCseed*>(calibObject))) {
461 for (Int_t irow=0;irow<159;irow++) {
464 AliTPCclusterMI *cluster=seed->GetClusterPointer(irow);
465 if (!cluster) continue;
468 cluster->GetGlobalXYZ(gclf);
470 //Double_t x[3]={cluster->GetRow(),cluster->GetPad(),cluster->GetTimeBin()};
471 //Int_t i[1]={cluster->GetDetector()};
472 //transform->Transform(x,i,0,1);
473 //printf("gx %f gy %f gz %f \n", cluster->GetX(), cluster->GetY(),cluster->GetZ());
474 //printf("gclf[0] %f gclf[1] %f gclf[2] %f \n", gclf[0], gclf[1], gclf[2]);
477 if(gclf[2]>0.) TPCside=0; // A side
481 //Double_t vTPCClust1[3] = { gclf[0], gclf[1], TPCside };
482 //fTPCClustHisto1->Fill(vTPCClust1);
485 Double_t phi = TMath::ATan2(gclf[1],gclf[0]);
486 if(phi < 0) phi += 2.*TMath::Pi();
488 Double_t vTPCClust[3] = { irow, phi, TPCside };
489 fTPCClustHisto->Fill(vTPCClust);
494 if(GetAnalysisMode() == 0) ProcessTPC(stack,track,esdEvent,vertStatus);
495 else if(GetAnalysisMode() == 1) ProcessTPCITS(stack,track,esdEvent,vertStatus);
496 else if(GetAnalysisMode() == 2) ProcessConstrained(stack,track,esdEvent);
498 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
504 AliESDtrack *tpcTrack = AliESDtrackCuts::GetTPCOnlyTrack(esdEvent,iTrack);
505 if(!tpcTrack) continue;
508 if( fCutsRC->AcceptTrack(tpcTrack) ) {
510 if(tpcTrack->Charge()>0.) multP++;
511 if(tpcTrack->Charge()<0.) multN++;
514 if(tpcTrack) delete tpcTrack;
517 if( fCutsRC->AcceptTrack(track) ) {
518 //Printf("Still here for HLT");
520 if(track->Charge()>0.) multP++;
521 if(track->Charge()<0.) multN++;
528 Double_t vTPCEvent[7] = {vtxESD->GetXv(),vtxESD->GetYv(),vtxESD->GetZv(),mult,multP,multN,vtxESD->GetStatus()};
529 fTPCEventHisto->Fill(vTPCEvent);
533 //_____________________________________________________________________________
534 void AliPerformanceTPC::Analyse()
537 // Analyse comparison information and store output histograms
538 // in the folder "folderTPC"
540 TH1::AddDirectory(kFALSE);
541 TH1::SetDefaultSumw2(kFALSE);
542 TObjArray *aFolderObj = new TObjArray;
543 //aFolderObj->SetOwner(); // objects are owned by fanalysisFolder
547 // Cluster histograms
549 AddProjection(aFolderObj, fTPCClustHisto, 0, 1, 2);
552 for(Int_t i=0; i <= 2; i++) {
553 AddProjection(aFolderObj, fTPCClustHisto, i, &selString);
556 //fTPCClustHisto->GetAxis(2)->SetRange(1,1); // A-side
557 //selString = "A_side";
558 //AddProjection(aFolderObj, fTPCClustHisto, 0, 1, &selString);
560 //fTPCClustHisto->GetAxis(2)->SetRange(2,2); // C-side
561 //selString = "C_side";
562 //AddProjection(aFolderObj, fTPCClustHisto, 0, 1, &selString);
565 fTPCClustHisto->GetAxis(2)->SetRange(1,2);
570 for(Int_t i=0; i<=6; i++) {
571 AddProjection(aFolderObj, fTPCEventHisto, i);
573 AddProjection(aFolderObj, fTPCEventHisto, 4, 5);
574 AddProjection(aFolderObj, fTPCEventHisto, 0, 1);
575 AddProjection(aFolderObj, fTPCEventHisto, 0, 3);
576 AddProjection(aFolderObj, fTPCEventHisto, 1, 3);
577 AddProjection(aFolderObj, fTPCEventHisto, 2, 3);
579 // reconstructed vertex status > 0
580 fTPCEventHisto->GetAxis(6)->SetRange(2,2);
581 selString = "recVertex";
582 for(Int_t i=0; i<=5; i++) {
583 AddProjection(aFolderObj, fTPCEventHisto, i, &selString);
585 AddProjection(aFolderObj, fTPCEventHisto, 4, 5, &selString);
586 AddProjection(aFolderObj, fTPCEventHisto, 0, 1, &selString);
587 AddProjection(aFolderObj, fTPCEventHisto, 0, 3, &selString);
588 AddProjection(aFolderObj, fTPCEventHisto, 1, 3, &selString);
589 AddProjection(aFolderObj, fTPCEventHisto, 2, 3, &selString);
592 fTPCEventHisto->GetAxis(6)->SetRange(1,2);
598 fTPCTrackHisto->GetAxis(8)->SetRangeUser(-1.5,1.5);
599 fTPCTrackHisto->GetAxis(9)->SetRangeUser(0.5,1.5);
600 selString = "all_recVertex";
601 for(Int_t i=0; i <= 9; i++) {
602 AddProjection(aFolderObj, fTPCTrackHisto, i, &selString);
604 for(Int_t i=0; i <= 4; i++) {
605 AddProjection(aFolderObj, fTPCTrackHisto, i, 5, 7, &selString);
610 // Track histograms (pos with vertex)
611 fTPCTrackHisto->GetAxis(8)->SetRangeUser(0,1.5);
612 selString = "pos_recVertex";
613 for(Int_t i=0; i <= 9; i++) {
614 AddProjection(aFolderObj, fTPCTrackHisto, i, &selString);
616 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++) {
617 AddProjection(aFolderObj, fTPCTrackHisto, i, j, k, &selString);
619 AddProjection(aFolderObj, fTPCTrackHisto, 0, 1, 2, &selString);
620 AddProjection(aFolderObj, fTPCTrackHisto, 0, 1, 5, &selString);
621 AddProjection(aFolderObj, fTPCTrackHisto, 0, 2, 5, &selString);
622 AddProjection(aFolderObj, fTPCTrackHisto, 1, 2, 5, &selString);
623 AddProjection(aFolderObj, fTPCTrackHisto, 3, 4, 5, &selString);
624 AddProjection(aFolderObj, fTPCTrackHisto, 5, 6, 7, &selString);
626 // Track histograms (neg with vertex)
627 fTPCTrackHisto->GetAxis(8)->SetRangeUser(-1.5,0);
628 selString = "neg_recVertex";
629 for(Int_t i=0; i <= 9; i++) {
630 AddProjection(aFolderObj, fTPCTrackHisto, i, &selString);
632 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++) {
633 AddProjection(aFolderObj, fTPCTrackHisto, i, j, k, &selString);
635 AddProjection(aFolderObj, fTPCTrackHisto, 0, 1, 2, &selString);
636 AddProjection(aFolderObj, fTPCTrackHisto, 0, 1, 5, &selString);
637 AddProjection(aFolderObj, fTPCTrackHisto, 0, 2, 5, &selString);
638 AddProjection(aFolderObj, fTPCTrackHisto, 1, 2, 5, &selString);
639 AddProjection(aFolderObj, fTPCTrackHisto, 3, 4, 5, &selString);
642 fTPCTrackHisto->GetAxis(8)->SetRangeUser(-1.5,1.5);
643 fTPCTrackHisto->GetAxis(9)->SetRangeUser(-0.5,1.5);
646 printf("exportToFolder\n");
647 // export objects to analysis folder
648 fAnalysisFolder = ExportToFolder(aFolderObj);
649 if (fFolderObj) delete fFolderObj;
650 fFolderObj = aFolderObj;
655 //_____________________________________________________________________________
656 TFolder* AliPerformanceTPC::ExportToFolder(TObjArray * array)
658 // recreate folder avery time and export objects to new one
660 AliPerformanceTPC * comp=this;
661 TFolder *folder = comp->GetAnalysisFolder();
664 TFolder *newFolder = 0;
666 Int_t size = array->GetSize();
669 // get name and title from old folder
670 name = folder->GetName();
671 title = folder->GetTitle();
677 newFolder = CreateFolder(name.Data(),title.Data());
678 newFolder->SetOwner();
680 // add objects to folder
682 newFolder->Add(array->At(i));
690 //_____________________________________________________________________________
691 Long64_t AliPerformanceTPC::Merge(TCollection* const list)
693 // Merge list of objects (needed by PROOF)
701 TIterator* iter = list->MakeIterator();
703 TObjArray* objArrayList = 0;
704 objArrayList = new TObjArray();
706 // collection of generated histograms
708 while((obj = iter->Next()) != 0)
710 AliPerformanceTPC* entry = dynamic_cast<AliPerformanceTPC*>(obj);
711 if (entry == 0) continue;
712 if (fgMergeTHnSparse) {
713 if ((fTPCClustHisto) && (entry->fTPCClustHisto)) { fTPCClustHisto->Add(entry->fTPCClustHisto); }
714 if ((fTPCEventHisto) && (entry->fTPCEventHisto)) { fTPCEventHisto->Add(entry->fTPCEventHisto); }
715 if ((fTPCTrackHisto) && (entry->fTPCTrackHisto)) { fTPCTrackHisto->Add(entry->fTPCTrackHisto); }
717 // the analysisfolder is only merged if present
718 if (entry->fFolderObj) { objArrayList->Add(entry->fFolderObj); }
722 if (fFolderObj) { fFolderObj->Merge(objArrayList); }
723 // to signal that track histos were not merged: reset
724 if (!fgMergeTHnSparse) { fTPCTrackHisto->Reset(); fTPCClustHisto->Reset(); fTPCEventHisto->Reset(); }
726 if (objArrayList) delete objArrayList; objArrayList=0;
731 //_____________________________________________________________________________
732 TFolder* AliPerformanceTPC::CreateFolder(TString name, TString title) {
733 // create folder for analysed histograms
736 folder = new TFolder(name.Data(),title.Data());
742 //_____________________________________________________________________________
743 void AliPerformanceTPC::AddProjection(TObjArray* aFolderObj, THnSparse* hSparse, Int_t xDim, TString* selString)
746 TString name = "h_tpc_" + TString(hSparse->GetName())(4,5) + '_';
747 if (selString) { name += *selString + '_'; }
750 TString title = hSparse->GetAxis(xDim)->GetTitle();
751 if (selString) { title += " (" + *selString + ")"; }
752 h1 = hSparse->Projection(xDim);
753 h1->SetName(name.Data());
754 h1->GetXaxis()->SetTitle(hSparse->GetAxis(xDim)->GetTitle());
755 h1->SetTitle(title.Data());
760 //_____________________________________________________________________________
761 void AliPerformanceTPC::AddProjection(TObjArray* aFolderObj, THnSparse *hSparse, Int_t yDim, Int_t xDim, TString* selString)
764 TString name = "h_tpc_" + TString(hSparse->GetName())(4,5) + '_';
765 if (selString) { name += *selString + '_'; }
770 TString title = hSparse->GetAxis(yDim)->GetTitle();
772 title += hSparse->GetAxis(xDim)->GetTitle();
773 if (selString) { title += " (" + *selString + ")"; }
774 h2 = hSparse->Projection(yDim,xDim);
775 h2->SetName(name.Data());
776 h2->GetXaxis()->SetTitle(hSparse->GetAxis(xDim)->GetTitle());
777 h2->GetYaxis()->SetTitle(hSparse->GetAxis(yDim)->GetTitle());
778 h2->SetTitle(title.Data());
783 //_____________________________________________________________________________
784 void AliPerformanceTPC::AddProjection(TObjArray* aFolderObj, THnSparse *hSparse, Int_t xDim, Int_t yDim, Int_t zDim, TString* selString)
787 TString name = "h_tpc_" + TString(hSparse->GetName())(4,5) + '_';
788 if (selString) { name += *selString + '_'; }
795 TString title = hSparse->GetAxis(xDim)->GetTitle();
797 title += hSparse->GetAxis(yDim)->GetTitle();
799 title += hSparse->GetAxis(zDim)->GetTitle();
800 if (selString) { title += " (" + *selString + ")"; }
801 h3 = hSparse->Projection(xDim,yDim,zDim);
802 h3->SetName(name.Data());
803 h3->GetXaxis()->SetTitle(hSparse->GetAxis(xDim)->GetTitle());
804 h3->GetYaxis()->SetTitle(hSparse->GetAxis(yDim)->GetTitle());
805 h3->GetZaxis()->SetTitle(hSparse->GetAxis(zDim)->GetTitle());
806 h3->SetTitle(title.Data());