1 //------------------------------------------------------------------------------
2 // Implementation of AliPerformanceMatch class. It checks the track matching
3 // quality (residuals, pulls) bewteen tracking detectors TPC-ITS and TPC-TRD
4 // with TPC as the reference detector. In addition, the ITS and TRD track
5 // reconstruction efficiency with respect to TPC is calculated.
7 // The matchinig quality parameters are stored in the THnSparse histograms.
8 // The analysis of these histograms to extract reference information is done in
9 // the Analyse() function (post-processing).
11 // The histograms with reference information can be exported to the ROOT folder.
13 // Author: J.Otwinowski 17/10/2009
14 //------------------------------------------------------------------------------
18 // after running comparison task, read the file, and get component
19 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
22 TFile f("Output.root");
23 AliPerformanceMatch * compObj = (AliPerformanceMatch*)coutput->FindObject("AliPerformanceMatchTPCTRD");
25 // analyse comparison data
28 // the output histograms/graphs will be stored in the folder "folderMatch"
29 compObj->GetAnalysisFolder()->ls("*");
31 // user can save whole comparison object (or only folder with anlysed histograms)
32 // in the seperate output file (e.g.)
33 TFile fout("Analysed_Match.root","recreate");
34 compObj->Write(); // compObj->GetAnalysisFolder()->Write();
45 #include "AliPerformanceMatch.h"
46 #include "AliESDEvent.h"
47 #include "AliESDVertex.h"
48 #include "AliESDtrack.h"
49 #include "AliESDfriendTrack.h"
50 #include "AliESDfriend.h"
52 #include "AliMCEvent.h"
53 #include "AliMCParticle.h"
54 #include "AliHeader.h"
55 #include "AliGenEventHeader.h"
57 #include "AliMCInfoCuts.h"
58 #include "AliRecInfoCuts.h"
59 #include "AliTracker.h"
60 #include "AliTRDtrackV1.h"
61 #include "AliTreeDraw.h"
65 ClassImp(AliPerformanceMatch)
67 //_____________________________________________________________________________
68 AliPerformanceMatch::AliPerformanceMatch():
69 AliPerformanceObject("AliPerformanceMatch"),
84 //_____________________________________________________________________________
85 AliPerformanceMatch::AliPerformanceMatch(Char_t* name="AliPerformanceMatch", Char_t* title="AliPerformanceMatch",Int_t analysisMode=0,Bool_t hptGenerator=kFALSE):
86 AliPerformanceObject(name,title),
100 SetAnalysisMode(analysisMode);
101 SetHptGenerator(hptGenerator);
106 //_____________________________________________________________________________
107 AliPerformanceMatch::~AliPerformanceMatch()
111 if(fResolHisto) delete fResolHisto; fResolHisto=0;
112 if(fPullHisto) delete fPullHisto; fPullHisto=0;
113 if(fTrackingEffHisto) delete fTrackingEffHisto; fTrackingEffHisto = 0x0;
115 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
118 //_____________________________________________________________________________
119 void AliPerformanceMatch::Init(){
122 // Make performance histogrms
127 Double_t ptMin = 1.e-2, ptMax = 10.;
129 Double_t *binsPt = 0;
130 if (IsHptGenerator()) {
131 nPtBins = 100; ptMax = 100.;
132 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
134 binsPt = CreateLogAxis(nPtBins,ptMin,ptMax);
137 Double_t yMin = -0.02, yMax = 0.02;
138 Double_t zMin = -12.0, zMax = 12.0;
139 if(GetAnalysisMode() == 0 || GetAnalysisMode() == 1) {
140 yMin = -100.; yMax = 100.;
141 zMin = -100.; zMax = 100.;
144 // res_y:res_z:res_phi,res_lambda:res_pt:y:z:eta:phi:pt:isRec
145 Int_t binsResolHisto[11]={100,100,100,100,100,25,50,90,30,nPtBins,2};
146 Double_t minResolHisto[11]={-1.,-1.,-0.03,-0.03,-0.2, yMin, zMin, 0., -1.5, ptMin,0};
147 Double_t maxResolHisto[11]={ 1., 1., 0.03, 0.03, 0.2, yMax, zMax, 2.*TMath::Pi(), 1.5, ptMax,2};
149 fResolHisto = new THnSparseF("fResolHisto","res_y:res_z:res_phi:res_lambda:res_pt:y:z:phi:eta:pt:isRec",11,binsResolHisto,minResolHisto,maxResolHisto);
150 fResolHisto->SetBinEdges(9,binsPt);
152 fResolHisto->GetAxis(0)->SetTitle("y-y_{ref} (cm)");
153 fResolHisto->GetAxis(1)->SetTitle("z-z_{ref} (cm)");
154 fResolHisto->GetAxis(2)->SetTitle("#phi-#phi_{ref} (rad)");
155 fResolHisto->GetAxis(3)->SetTitle("#lambda-#lambda_{ref} (rad)");
156 fResolHisto->GetAxis(4)->SetTitle("(p_{T}/p_{Tref}-1)");
157 fResolHisto->GetAxis(5)->SetTitle("y_{ref} (cm)");
158 fResolHisto->GetAxis(6)->SetTitle("z_{ref} (cm)");
159 fResolHisto->GetAxis(7)->SetTitle("#phi_{ref} (rad)");
160 fResolHisto->GetAxis(8)->SetTitle("#eta_{ref}");
161 fResolHisto->GetAxis(9)->SetTitle("p_{Tref} (GeV/c)");
162 fResolHisto->GetAxis(10)->SetTitle("isReconstructed");
163 fResolHisto->Sumw2();
165 //pull_y:pull_z:pull_snp:pull_tgl:pull_1pt:y:z:snp:tgl:1pt:isRec
166 Int_t binsPullHisto[11]={100,100,100,100,100,50,50,50,50,nPtBins,2};
167 Double_t minPullHisto[11]={-5.,-5.,-5.,-5.,-5., yMin, zMin,-1.,-2.0, ptMin,0};
168 Double_t maxPullHisto[11]={ 5., 5., 5., 5., 5., yMax, zMax, 1., 2.0, ptMax,2};
169 fPullHisto = new THnSparseF("fPullHisto","pull_y:pull_z:pull_y:pull_z:pull_snp:pull_tgl:pull_1pt:y:z:snp:tgl:1pt:isRec",11,binsPullHisto,minPullHisto,maxPullHisto);
171 fPullHisto->GetAxis(0)->SetTitle("(y-y_{ref})/#sigma");
172 fPullHisto->GetAxis(1)->SetTitle("(z-z_{ref})/#sigma");
173 fPullHisto->GetAxis(2)->SetTitle("(sin#phi-sin#phi_{ref})/#sigma");
174 fPullHisto->GetAxis(3)->SetTitle("(tan#lambda-tan#lambda_{ref})/#sigma");
175 fPullHisto->GetAxis(4)->SetTitle("(p_{Tref}/p_{T}-1)/#sigma");
176 fPullHisto->GetAxis(5)->SetTitle("y_{ref} (cm)");
177 fPullHisto->GetAxis(6)->SetTitle("z_{ref} (cm)");
178 fPullHisto->GetAxis(7)->SetTitle("sin#phi_{ref}");
179 fPullHisto->GetAxis(8)->SetTitle("tan#lambda_{ref}");
180 fPullHisto->GetAxis(9)->SetTitle("1/p_{Tref} (GeV/c)^{-1}");
181 fPullHisto->GetAxis(10)->SetTitle("isReconstructed");
184 // -> has match:y:z:snp:tgl:phi:pt:ITSclusters
185 Int_t binsTrackingEffHisto[8] = { 2, 50, 100, 50, 50, 90, 100, 7 };
186 Double_t minTrackingEffHisto[8] = {-0.5, -25, -50, -1, -2, 0., 0, -0.5 };
187 Double_t maxTrackingEffHisto[8] = { 1.5, 25, 50, 1, 2, 2*TMath::Pi(), 20, 6.5 };
189 fTrackingEffHisto = new THnSparseF("fTrackingEffHisto","has match:y:z:snp:tgl:phi:pt:ITSclusters",8,binsTrackingEffHisto,minTrackingEffHisto,maxTrackingEffHisto);
190 fTrackingEffHisto->GetAxis(0)->SetTitle("IsMatching");
191 fTrackingEffHisto->GetAxis(1)->SetTitle("local y (cm)");
192 fTrackingEffHisto->GetAxis(2)->SetTitle("z (cm)");
193 fTrackingEffHisto->GetAxis(3)->SetTitle("sin(#phi)");
194 fTrackingEffHisto->GetAxis(4)->SetTitle("tan(#lambda)");
195 fTrackingEffHisto->GetAxis(5)->SetTitle("phi (rad)");
196 fTrackingEffHisto->GetAxis(6)->SetTitle("p_{T}");
197 fTrackingEffHisto->GetAxis(7)->SetTitle("number of ITS clusters");
198 fTrackingEffHisto->Sumw2();
202 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
204 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
207 fAnalysisFolder = CreateFolder("folderMatch","Analysis Matching Folder");
210 //_____________________________________________________________________________
211 void AliPerformanceMatch::ProcessITSTPC(Int_t iTrack, AliESDEvent *const esdEvent, AliStack* /*const stack*/, AliESDtrack *const esdTrack, AliESDfriendTrack *const esdFriendTrack)
214 // addition to standard analysis - check if ITS stand-alone tracks have a match in the TPC
215 // Origin: A. Kalwait
216 // Modified: J. Otwinowski
217 if(!esdEvent) return;
218 if(!esdTrack) return;
219 if(!esdFriendTrack) return;
221 // ITS stand alone tracks with SPD layers
222 if(!(esdTrack->GetStatus() & AliESDtrack::kITSpureSA)) return;
223 if(!(esdTrack->GetStatus() & AliESDtrack::kITSrefit)) return;
224 if(esdTrack->GetNcls(0)<fCutsRC->GetMinNClustersITS()) return;
225 if(!esdTrack->HasPointOnITSLayer(0) && !esdTrack->HasPointOnITSLayer(1)) return;
227 Bool_t hasMatch = kFALSE;
228 for (Int_t jTrack = 0; jTrack < esdEvent->GetNumberOfTracks(); jTrack++) {
229 // loop for all those tracks and check if the corresponding TPC track is found
230 if (jTrack==iTrack) continue;
231 AliESDtrack *trackTPC = esdEvent->GetTrack(jTrack);
232 if (!trackTPC) continue;
233 if (!trackTPC->GetTPCInnerParam()) continue;
235 // TPC nClust/track after first tracking pass
236 if(trackTPC->GetTPCNclsIter1()<fCutsRC->GetMinNClustersTPC()) continue;
238 AliExternalTrackParam *innerTPC = new AliExternalTrackParam(*(trackTPC->GetTPCInnerParam()));
239 if(!innerTPC) continue;
241 Double_t x[3]; trackTPC->GetXYZ(x);
242 Double_t b[3]; AliTracker::GetBxByBz(x,b);
243 Double_t dca[2],cov[3];
244 Bool_t isTPCOK = innerTPC->PropagateToDCABxByBz(esdEvent->GetPrimaryVertexSPD(),b,kVeryBig,dca,cov);
246 if(innerTPC) delete innerTPC;
253 Double_t dcaToVertex = -1;
254 if( fCutsRC->GetDCAToVertex2D() )
256 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY()+dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
258 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) {
259 delete innerTPC; continue; }
260 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) {
261 delete innerTPC; continue; }
262 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) {
263 delete innerTPC; continue; }
265 // rough checking if they match
267 printf("+++++++++++++++++++++++++++++++++++++++++++++++ ");
268 printf("esdTrack->GetY() %e, esdTrack->GetSnp() %e, esdTrack->GetTgl() %e \n",
269 esdTrack->GetY(), esdTrack->GetSnp(), esdTrack->GetTgl());
270 printf("innerTPC->GetY() %e, innerTPC->GetSnp() %e, innerTPC->GetTgl() %e \n",
271 innerTPC->GetY() , innerTPC->GetSnp() , innerTPC->GetTgl());
273 if (TMath::Abs(esdTrack->GetY() - innerTPC->GetY()) > 3) {
274 delete innerTPC; continue;
276 if (TMath::Abs(esdTrack->GetSnp() - innerTPC->GetSnp()) > 0.2) {
277 delete innerTPC; continue;
279 if (TMath::Abs(esdTrack->GetTgl() - innerTPC->GetTgl()) > 0.2) {
280 delete innerTPC; continue;
284 if(innerTPC) delete innerTPC;
286 //has match:y:z:snp:tgl:phi:pt:ITSclusters
287 Double_t vecTrackingEff[8] = { hasMatch,esdTrack->GetY(),esdTrack->GetZ(),esdTrack->GetSnp(),esdTrack->GetTgl(),esdTrack->Phi(), esdTrack->Pt(),esdTrack->GetITSclusters(0) };
288 fTrackingEffHisto->Fill(vecTrackingEff);
292 //_____________________________________________________________________________
293 void AliPerformanceMatch::ProcessTPCITS(AliStack* /*const stack*/, AliESDtrack *const esdTrack, AliESDfriendTrack *const esdFriendTrack)
296 // Match TPC and ITS min-bias tracks
297 // at radius between detectors
299 if(!esdTrack) return;
300 if(!esdFriendTrack) return;
303 // Propagate tracks to the radius between TPC-ITS
304 // using B-field and material budget
306 Double_t radius = fCutsRC->GetTPCITSMatchingRadius();
307 Double_t mass = esdTrack->GetMass();
308 Double_t step=1.0; // cm
311 // Propagate TPCinner (reference detector)
313 Bool_t isTPCOK=kFALSE;
314 AliExternalTrackParam *innerTPC=NULL;
316 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
317 esdTrack->GetImpactParametersTPC(dca,cov);
322 Double_t dcaToVertex = -1;
323 if( fCutsRC->GetDCAToVertex2D() )
325 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY() + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
327 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
328 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
329 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
331 if( (esdTrack->GetTPCNclsIter1()>fCutsRC->GetMinNClustersTPC()) &&
332 (esdTrack->GetTPCInnerParam()) &&
333 (innerTPC=new AliExternalTrackParam(*(esdTrack->GetTPCInnerParam()))))
335 isTPCOK = AliTracker::PropagateTrackToBxByBz(innerTPC,radius,mass,step,kTRUE);
338 if(innerTPC) delete innerTPC;
343 // Propagate ITSouter
345 Bool_t isITSOK=kFALSE;
346 AliExternalTrackParam *outerITS=NULL;
348 if( (esdTrack->GetNcls(0)>fCutsRC->GetMinNClustersITS()) &&
349 (esdFriendTrack->GetITSOut()) &&
350 (outerITS=new AliExternalTrackParam(*(esdFriendTrack->GetITSOut()))))
352 isITSOK = AliTracker::PropagateTrackToBxByBz(outerITS,radius,mass,step,kTRUE);
356 // Fill histograms (TPC reference detector)
359 FillHistograms(innerTPC,outerITS,isITSOK);
361 if(outerITS) delete outerITS;
362 if(innerTPC) delete innerTPC;
365 //_____________________________________________________________________________
366 void AliPerformanceMatch::ProcessTPCTRD(AliStack* /*const stack*/, AliESDtrack *const esdTrack, AliESDfriendTrack *const esdFriendTrack)
369 // Match TPC and TRD min-bias tracks
370 // at radius between detectors. TPC is the reference detector.
372 if(!esdTrack) return;
373 if(!esdFriendTrack) return;
376 // Propagate tracks to the radius between TPC-TRD
377 // using B-field and material budget
379 Double_t radius = fCutsRC->GetTPCTRDMatchingRadius();
380 Double_t mass = esdTrack->GetMass();
381 Double_t step=1.0; // cm
384 // Propagate TPCouter (reference detector)
386 Bool_t isTPCOK=kFALSE;
387 AliExternalTrackParam *outerTPC=NULL;
389 Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
390 esdTrack->GetImpactParametersTPC(dca,cov);
395 Double_t dcaToVertex = -1;
396 if( fCutsRC->GetDCAToVertex2D() )
398 dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY() + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ());
400 if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
401 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
402 if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
404 if( (esdTrack->GetTPCNclsIter1()>fCutsRC->GetMinNClustersTPC()) &&
405 (esdFriendTrack->GetTPCOut()) &&
406 (outerTPC=new AliExternalTrackParam(*(esdFriendTrack->GetTPCOut()))))
408 isTPCOK = AliTracker::PropagateTrackToBxByBz(outerTPC,radius,mass,step,kTRUE);
411 if(outerTPC) delete outerTPC;
416 // Propagate TRDinner
418 Bool_t isTRDOK = kFALSE;
419 AliExternalTrackParam *innerTRD=NULL;
422 AliTRDtrackV1 *trdTrack=NULL; //esdFriendTrack = fESDfriend->GetTrack(itrk);
423 TObject *calObject=NULL;
425 while((calObject = esdFriendTrack->GetCalibObject(icalib++))) {
426 if(strcmp(calObject->IsA()->GetName(),"AliTRDtrackV1") != 0) continue; // Look for the TRDtrack
427 if(!(trdTrack = dynamic_cast<AliTRDtrackV1*>(calObject))) break;
431 (trdTrack->GetNumberOfTracklets()>fCutsRC->GetMinNTrackletsTRD()) &&
432 (trdTrack->GetTracklet(0)) &&
433 (esdFriendTrack->GetTRDIn()) &&
434 (innerTRD = new AliExternalTrackParam(*(esdFriendTrack->GetTRDIn()))))
436 isTRDOK = AliTracker::PropagateTrackToBxByBz(innerTRD,radius,mass,step,kTRUE);
440 // Fill histograms (TPC reference detector)
443 FillHistograms(outerTPC,innerTRD,isTRDOK);
445 if(outerTPC) delete outerTPC;
446 if(innerTRD) delete innerTRD;
449 //_____________________________________________________________________________
450 void AliPerformanceMatch::FillHistograms(AliExternalTrackParam *const refParam, AliExternalTrackParam *const param, Bool_t isRec)
453 // fill performance histograms
454 // (TPC always as reference)
456 if(!refParam) return;
459 // Deltas (dy,dz,dphi,dtheta,dpt)
461 Float_t delta[5] = {0};
463 delta[0] = param->GetY()-refParam->GetY();
464 delta[1] = param->GetZ()-refParam->GetZ();
465 delta[2] = TMath::ATan2(param->Py(),param->Px())-TMath::ATan2(refParam->Py(),refParam->Px());
466 delta[3] = TMath::ATan2(param->Pz(),param->Pt())-TMath::ATan2(refParam->Pz(),refParam->Pt());
467 if(refParam->Pt()) delta[4] = (param->Pt()-refParam->Pt())/refParam->Pt();
470 // Pulls (y,z,snp,tanl,1/pt)
472 Float_t sigma[5] = {0};
473 Float_t pull[5] = {0};
475 sigma[0] = TMath::Sqrt(param->GetSigmaY2()+refParam->GetSigmaY2());
476 sigma[1] = TMath::Sqrt(param->GetSigmaZ2()+refParam->GetSigmaZ2());
477 sigma[2] = TMath::Sqrt(param->GetSigmaSnp2()+refParam->GetSigmaSnp2());
478 sigma[3] = TMath::Sqrt(param->GetSigmaTgl2()+refParam->GetSigmaTgl2());
479 sigma[4] = TMath::Sqrt(param->GetSigma1Pt2()+refParam->GetSigma1Pt2());
480 if(sigma[0]) pull[0] = delta[0] / sigma[0];
481 if(sigma[1]) pull[1] = delta[1] / sigma[1];
482 if(sigma[2]) pull[2] = (param->GetSnp()-refParam->GetSnp()) / sigma[2];
483 if(sigma[3]) pull[3] = (param->GetTgl()-refParam->GetTgl()) / sigma[3];
484 if(sigma[4]) pull[4] = (param->OneOverPt()-refParam->OneOverPt()) / sigma[4];
488 Double_t vResolHisto[11] = {delta[0],delta[1],delta[2],delta[3],delta[4],refParam->GetY(),refParam->GetZ(),refParam->Phi(),refParam->Eta(),refParam->Pt(),isRec};
489 fResolHisto->Fill(vResolHisto);
491 Double_t vPullHisto[11] = {pull[0],pull[1],pull[2],pull[3],pull[4],refParam->GetY(),refParam->GetZ(),refParam->GetSnp(),refParam->GetTgl(),refParam->OneOverPt(),isRec};
492 fPullHisto->Fill(vPullHisto);
495 //_____________________________________________________________________________
496 void AliPerformanceMatch::Exec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent, AliESDfriend *const esdFriend, const Bool_t bUseMC, const Bool_t bUseESDfriend)
498 // Process comparison information
502 Error("Exec","esdEvent not available");
505 AliHeader* header = 0;
506 AliGenEventHeader* genHeader = 0;
513 Error("Exec","mcEvent not available");
516 // get MC event header
517 header = mcEvent->Header();
519 Error("Exec","Header not available");
523 stack = mcEvent->Stack();
525 Error("Exec","Stack not available");
529 genHeader = header->GenEventHeader();
531 Error("Exec","Could not retrieve genHeader from Header");
534 genHeader->PrimaryVertex(vtxMC);
540 Error("Exec","esdFriend not available");
546 if(!bUseMC && GetTriggerClass()) {
547 Bool_t isEventTriggered = esdEvent->IsTriggerClassFired(GetTriggerClass());
548 if(!isEventTriggered) return;
551 // get TPC event vertex
552 const AliESDVertex *vtxESD = esdEvent->GetPrimaryVertexTPC();
553 if(vtxESD && (vtxESD->GetStatus()<=0)) return;
556 for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++)
558 AliESDtrack *track = esdEvent->GetTrack(iTrack);
561 AliESDfriendTrack *friendTrack=0;
563 friendTrack=esdFriend->GetTrack(iTrack);
564 if(!friendTrack) continue;
567 if(GetAnalysisMode() == 0) ProcessTPCITS(stack,track,friendTrack);
568 else if(GetAnalysisMode() == 1) ProcessTPCTRD(stack,track,friendTrack);
569 else if(GetAnalysisMode() == 2) ProcessITSTPC(iTrack,esdEvent,stack,track,friendTrack);
571 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
577 //_____________________________________________________________________________
578 TH1F* AliPerformanceMatch::MakeResol(TH2F * his, Int_t integ, Bool_t type, Int_t cut){
579 // Create resolution histograms
582 if (!gPad) new TCanvas;
583 hisr = AliTreeDraw::CreateResHistoII(his,&hism,integ,kTRUE,cut);
584 if (type) return hism;
589 //_____________________________________________________________________________
590 void AliPerformanceMatch::Analyse() {
591 // Analyse comparison information and store output histograms
592 // in the folder "folderMatch"
594 TH1::AddDirectory(kFALSE);
598 TObjArray *aFolderObj = new TObjArray;
600 // write results in the folder
601 TCanvas * c = new TCanvas("Phi resol Tan","Phi resol Tan");
607 if(GetAnalysisMode()==0 || GetAnalysisMode()==1) {
609 fResolHisto->GetAxis(10)->SetRangeUser(1.0,2.0); // only reconstructed
610 fPullHisto->GetAxis(10)->SetRangeUser(1.0,2.0); // only reconstructed
611 for(Int_t i=0; i<5; i++)
613 for(Int_t j=5; j<10; j++)
615 //if(j!=8) fResolHisto->GetAxis(8)->SetRangeUser(-0.9,0.89); // eta window
616 if(j!=8) fResolHisto->GetAxis(8)->SetRangeUser(0.0,0.89); // eta window
617 else fResolHisto->GetAxis(8)->SetRangeUser(-1.5,1.49);
618 fResolHisto->GetAxis(9)->SetRangeUser(0.1,100.); // pt threshold
620 h2D = (TH2F*)fResolHisto->Projection(i,j);
622 h = AliPerformanceMatch::MakeResol(h2D,1,0,100);
623 sprintf(name,"h_res_%d_vs_%d",i,j);
626 h->GetXaxis()->SetTitle(fResolHisto->GetAxis(j)->GetTitle());
627 sprintf(title,"%s %s",fResolHisto->GetAxis(i)->GetTitle(),"(resolution)");
628 h->GetYaxis()->SetTitle(title);
629 sprintf(title,"%s vs %s",title,fResolHisto->GetAxis(j)->GetTitle());
632 //if(j==9) h->SetBit(TH1::kLogX);
635 h = AliPerformanceMatch::MakeResol(h2D,1,1,100);
636 //h = (TH1F*)arr->At(1);
637 sprintf(name,"h_mean_res_%d_vs_%d",i,j);
640 h->GetXaxis()->SetTitle(fResolHisto->GetAxis(j)->GetTitle());
641 sprintf(title,"%s %s",fResolHisto->GetAxis(i)->GetTitle(),"(mean)");
642 h->GetYaxis()->SetTitle(title);
644 sprintf(title,"%s vs %s",title,fResolHisto->GetAxis(j)->GetTitle());
647 if(j==9) h->SetBit(TH1::kLogX);
651 if(j!=8) fPullHisto->GetAxis(8)->SetRangeUser(0.0,0.89); // eta window
652 else fPullHisto->GetAxis(8)->SetRangeUser(-1.5,1.49); // eta window
653 fPullHisto->GetAxis(9)->SetRangeUser(0.1,100.); // pt threshold
655 h2D = (TH2F*)fPullHisto->Projection(i,j);
657 h = AliPerformanceMatch::MakeResol(h2D,1,0,100);
658 sprintf(name,"h_pull_%d_vs_%d",i,j);
661 h->GetXaxis()->SetTitle(fPullHisto->GetAxis(j)->GetTitle());
662 sprintf(title,"%s %s",fPullHisto->GetAxis(i)->GetTitle(),"(resolution)");
663 h->GetYaxis()->SetTitle(title);
664 sprintf(title,"%s vs %s",title,fPullHisto->GetAxis(j)->GetTitle());
667 if(j==9) h->SetBit(TH1::kLogX);
670 h = AliPerformanceMatch::MakeResol(h2D,1,1,100);
671 sprintf(name,"h_mean_pull_%d_vs_%d",i,j);
674 h->GetXaxis()->SetTitle(fPullHisto->GetAxis(j)->GetTitle());
675 sprintf(title,"%s %s",fPullHisto->GetAxis(i)->GetTitle(),"(mean)");
676 h->GetYaxis()->SetTitle(title);
677 sprintf(title,"%s vs %s",title,fPullHisto->GetAxis(j)->GetTitle());
680 //if(j==9) h->SetBit(TH1::kLogX);
688 for(Int_t i=5; i<10; i++)
690 if(i!=8) fResolHisto->GetAxis(8)->SetRangeUser(-0.9,0.89); // eta window
691 else fResolHisto->GetAxis(8)->SetRangeUser(-1.5,1.49);
692 fResolHisto->GetAxis(9)->SetRangeUser(0.1,100.); // pt threshold
694 fResolHisto->GetAxis(10)->SetRange(1,fResolHisto->GetAxis(10)->GetNbins()); // all
695 h = (TH1F*)fResolHisto->Projection(i);
697 fResolHisto->GetAxis(10)->SetRange(2,2); // only reconstructed
698 h2 = (TH1F*)fResolHisto->Projection(i);
700 TH1F* h2c = (TH1F*)h2->Clone();
701 h2c->Divide(h2,h,1,1,"B");
703 sprintf(name,"h_eff_%d",i);
706 h2c->GetXaxis()->SetTitle(h2c->GetXaxis()->GetTitle());
707 h2c->GetYaxis()->SetTitle("efficiency");
708 h2c->SetTitle("matching effciency");
710 aFolderObj->Add(h2c);
716 // TPC efficiency wrt ITS
718 if(GetAnalysisMode()==2) {
720 h = (TH1F*)fTrackingEffHisto->Projection(0);
723 for(Int_t i=1; i<7; i++)
727 // calculate efficiency
730 // all ITS standalone tracks
731 fTrackingEffHisto->GetAxis(0)->SetRange(1,fTrackingEffHisto->GetAxis(0)->GetNbins());
732 h = (TH1F*)fTrackingEffHisto->Projection(i);
734 // TPC tracks which has matching with TPC
735 fTrackingEffHisto->GetAxis(0)->SetRange(2,2);
736 h2 = (TH1F*)fTrackingEffHisto->Projection(i);
738 TH1F* h2c = (TH1F*)h2->Clone();
739 h2c->Divide(h2,h,1,1,"B");
741 sprintf(name,"h_TPC_eff_%d",i);
744 h2c->GetXaxis()->SetTitle(h2c->GetXaxis()->GetTitle());
745 h2c->GetYaxis()->SetTitle("efficiency");
746 h2c->SetTitle("TPC effciency wrt ITS");
748 aFolderObj->Add(h2c);
753 // export objects to analysis folder
754 fAnalysisFolder = ExportToFolder(aFolderObj);
756 // delete only TObjArray
757 if(aFolderObj) delete aFolderObj;
760 //_____________________________________________________________________________
761 TFolder* AliPerformanceMatch::ExportToFolder(TObjArray * array)
763 // recreate folder avery time and export objects to new one
765 AliPerformanceMatch * comp=this;
766 TFolder *folder = comp->GetAnalysisFolder();
769 TFolder *newFolder = 0;
771 Int_t size = array->GetSize();
774 // get name and title from old folder
775 name = folder->GetName();
776 title = folder->GetTitle();
782 newFolder = CreateFolder(name.Data(),title.Data());
783 newFolder->SetOwner();
785 // add objects to folder
787 newFolder->Add(array->At(i));
795 //_____________________________________________________________________________
796 Long64_t AliPerformanceMatch::Merge(TCollection* const list)
798 // Merge list of objects (needed by PROOF)
806 TIterator* iter = list->MakeIterator();
809 // collection of generated histograms
811 while((obj = iter->Next()) != 0)
813 AliPerformanceMatch* entry = dynamic_cast<AliPerformanceMatch*>(obj);
814 if (entry == 0) continue;
816 fResolHisto->Add(entry->fResolHisto);
817 fPullHisto->Add(entry->fPullHisto);
818 fTrackingEffHisto->Add(entry->fTrackingEffHisto);
826 //_____________________________________________________________________________
827 TFolder* AliPerformanceMatch::CreateFolder(TString name,TString title) {
828 // create folder for analysed histograms
831 folder = new TFolder(name.Data(),title.Data());