]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG1/TPC/AliPerformanceDEdx.cxx
reduce memory consumption and add high multiplicity flag
[u/mrichter/AliRoot.git] / PWG1 / TPC / AliPerformanceDEdx.cxx
1 //------------------------------------------------------------------------------
2 // Implementation of AliPerformanceDEdx 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 of AliPerformanceDEdx.
9 //  
10 // Author: J.Otwinowski 04/02/2008 
11 // Changes by M.Knichel 15/10/2010
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   TFile f("Output.root");
20   //AliPerformanceDEdx * compObj = (AliPerformanceDEdx*)f.Get("AliPerformanceDEdx");
21   AliPerformanceDEdx * compObj = (AliPerformanceDEdx*)coutput->FindObject("AliPerformanceDEdx");
22
23   // Analyse comparison data
24   compObj->Analyse();
25
26   // the output histograms/graphs will be stored in the folder "folderDEdx" 
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_DEdx.root","recreate");
32   //compObj->Write(); // compObj->GetAnalysisFolder()->Write();
33   compObj->GetAnalysisFolder()->Write();
34   fout.Close();
35
36 */
37
38 #include "TDirectory.h"
39 #include "TAxis.h"
40 #include "TCanvas.h"
41 #include "TH1.h"
42 #include "TH2.h"
43 #include "TF1.h"
44 #include "TSystem.h"
45 #include "TChain.h"
46
47 #include "AliPerformanceDEdx.h"
48 #include "AliPerformanceTPC.h"
49 #include "AliTPCPerformanceSummary.h"
50 #include "AliESDEvent.h"
51 #include "AliTracker.h"
52 #include "AliMCEvent.h"
53 #include "AliESDtrack.h"
54 #include "AliStack.h"
55 #include "AliLog.h" 
56 #include "AliMCInfoCuts.h" 
57 #include "AliMathBase.h"
58 #include "AliRecInfoCuts.h" 
59 #include "AliTreeDraw.h"
60 #include "AliHeader.h"
61 #include "AliGenEventHeader.h"
62
63 using namespace std;
64
65 ClassImp(AliPerformanceDEdx)
66
67 Bool_t AliPerformanceDEdx::fgMergeTHnSparse = kFALSE;
68
69 //_____________________________________________________________________________
70 AliPerformanceDEdx::AliPerformanceDEdx():
71   AliPerformanceObject("AliPerformanceDEdx"),
72
73   // dEdx 
74   fDeDxHisto(0),
75   fFolderObj(0),
76   
77   // Cuts 
78   fCutsRC(0), 
79   fCutsMC(0),
80
81   // histogram folder 
82   fAnalysisFolder(0)
83 {
84   // default constructor        
85   Init();
86 }
87
88 //_____________________________________________________________________________
89 AliPerformanceDEdx::AliPerformanceDEdx(Char_t* name="AliPerformanceDEdx", Char_t* title="AliPerformanceDEdx",Int_t analysisMode=0, Bool_t hptGenerator=kFALSE):
90   AliPerformanceObject(name,title),
91
92   // dEdx 
93   fDeDxHisto(0),
94   fFolderObj(0),
95   
96   // Cuts 
97   fCutsRC(0), 
98   fCutsMC(0),
99
100   // histogram folder 
101   fAnalysisFolder(0)
102 {
103   // named constructor
104
105   SetAnalysisMode(analysisMode);
106   SetHptGenerator(hptGenerator);
107   Init();
108 }
109
110
111 //_____________________________________________________________________________
112 AliPerformanceDEdx::~AliPerformanceDEdx()
113 {
114   // destructor
115   if(fDeDxHisto)  delete fDeDxHisto; fDeDxHisto=0; 
116   if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
117 }
118
119 //_____________________________________________________________________________
120 void AliPerformanceDEdx::Init()
121 {
122   // Init histograms
123   
124   // TPC dEdx
125   // set pt bins
126   Int_t nPBins = 50;
127   Double_t pMin = 1.e-2, pMax = 10.;
128
129   Double_t *binsP = 0;
130   if (IsHptGenerator())  { 
131     nPBins = 100; pMax = 100.;
132     binsP = CreateLogAxis(nPBins,pMin,pMax);
133   } else {
134     binsP = CreateLogAxis(nPBins,pMin,pMax);
135   }
136
137
138   /*
139   Int_t nPBins = 31;
140     Double_t binsP[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.};
141     Double_t pMin = 0., pMax = 10.;
142
143     if(IsHptGenerator() == kTRUE) {
144       nPBins = 100;
145       pMin = 0.; pMax = 100.;
146     }
147    */
148
149    //dedx:alpha:y:z:snp:tgl:ncls:p
150    //dedx:phi:y:z:snp:tgl:ncls:p
151    //Int_t binsQA[8]    = {300, 50, 50,  50, 50, 50, 80, nPBins};
152    //Double_t xminQA[8] = {0, -4,-20,-250, -1, -2, 0, pMin};
153    //Double_t xmaxQA[8] = {300, 4, 20, 250,  1,  2, 160, pMax};
154    Int_t binsQA[8]    = {300, 144, 50,  50, 50, 50, 80, nPBins};
155    Double_t xminQA[8] = {0, -TMath::Pi(),-20,-250, -1, -2, 0, pMin};
156    Double_t xmaxQA[8] = {300, TMath::Pi(), 20, 250,  1,  2, 160, pMax};
157
158    //fDeDxHisto = new THnSparseF("fDeDxHisto","dedx:alpha:y:z:snp:tgl:ncls:momentum",8,binsQA,xminQA,xmaxQA);
159    fDeDxHisto = new THnSparseF("fDeDxHisto","dedx:phi:y:z:snp:tgl:ncls:momentum",8,binsQA,xminQA,xmaxQA);
160    fDeDxHisto->SetBinEdges(7,binsP);
161
162    fDeDxHisto->GetAxis(0)->SetTitle("dedx (a.u.)");
163    fDeDxHisto->GetAxis(1)->SetTitle("#phi (rad)");
164    fDeDxHisto->GetAxis(2)->SetTitle("y (cm)");
165    fDeDxHisto->GetAxis(3)->SetTitle("z (cm)");
166    fDeDxHisto->GetAxis(4)->SetTitle("sin#phi");
167    fDeDxHisto->GetAxis(5)->SetTitle("tan#lambda");
168    fDeDxHisto->GetAxis(6)->SetTitle("ncls");
169    fDeDxHisto->GetAxis(7)->SetTitle("p (GeV/c)");
170    //fDeDxHisto->Sumw2();
171
172    // Init cuts
173    if(!fCutsMC) {
174      AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
175    }
176    if(!fCutsRC) {
177      AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
178    }
179
180    // init folder
181    fAnalysisFolder = CreateFolder("folderDEdx","Analysis de/dx Folder");
182 }
183
184 //_____________________________________________________________________________
185 void AliPerformanceDEdx::ProcessTPC(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/)
186 {
187   // Fill dE/dx  comparison information
188   AliDebug(AliLog::kWarning, "Warning: Not implemented");
189 }
190
191 //_____________________________________________________________________________
192 void AliPerformanceDEdx::ProcessInnerTPC(AliStack* const stack, AliESDtrack *const esdTrack, AliESDEvent* const esdEvent)
193 {
194  //
195  // Fill TPC track information at inner TPC wall
196  // 
197   if(!esdEvent) return;
198   if(!esdTrack) return;
199
200   if( IsUseTrackVertex() ) 
201   { 
202     // Relate TPC inner params to prim. vertex
203     const AliESDVertex *vtxESD = esdEvent->GetPrimaryVertexTracks();
204     Double_t x[3]; esdTrack->GetXYZ(x);
205     Double_t b[3]; AliTracker::GetBxByBz(x,b);
206     Bool_t isOK = esdTrack->RelateToVertexTPCBxByBz(vtxESD, b, kVeryBig);
207     if(!isOK) return;
208
209     /*
210       // JMT -- recaluclate DCA for HLT if not present
211       if ( dca[0] == 0. && dca[1] == 0. ) {
212         track->GetDZ( vtxESD->GetX(), vtxESD->GetY(), vtxESD->GetZ(), esdEvent->GetMagneticField(), dca );
213       }
214     */
215   }
216
217   // get external param. at inner TPC wall
218   const AliExternalTrackParam *innerParam =  esdTrack->GetInnerParam();
219   if(!innerParam) return;
220
221   Float_t dca[2], cov[3]; // dca_xy, dca_z, sigma_xy, sigma_xy_z, sigma_z
222   esdTrack->GetImpactParametersTPC(dca,cov);
223
224   if((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0) return; // TPC refit
225
226   //
227   // select primaries
228   //
229   Double_t dcaToVertex = -1;
230   if( fCutsRC->GetDCAToVertex2D() ) 
231   {
232       dcaToVertex = TMath::Sqrt(dca[0]*dca[0]/fCutsRC->GetMaxDCAToVertexXY()/fCutsRC->GetMaxDCAToVertexXY()                    + dca[1]*dca[1]/fCutsRC->GetMaxDCAToVertexZ()/fCutsRC->GetMaxDCAToVertexZ()); 
233   }
234   if(fCutsRC->GetDCAToVertex2D() && dcaToVertex > 1) return;
235   if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[0]) > fCutsRC->GetMaxDCAToVertexXY()) return;
236   if(!fCutsRC->GetDCAToVertex2D() && TMath::Abs(dca[1]) > fCutsRC->GetMaxDCAToVertexZ()) return;
237
238   Float_t dedx = esdTrack->GetTPCsignal();
239   Int_t ncls = esdTrack->GetTPCNcls();
240
241   Double_t pt = innerParam->Pt();
242   Double_t lam = TMath::ATan2(innerParam->Pz(),innerParam->Pt());
243   Double_t p = pt/TMath::Cos(lam);
244   //Double_t alpha = innerParam->GetAlpha();
245   Double_t phi = TMath::ATan2(innerParam->Py(),innerParam->Px());
246   //if(phi<0.) phi += 2.*TMath::Phi();
247   Double_t y = innerParam->GetY();
248   Double_t z = innerParam->GetZ();
249   Double_t snp = innerParam->GetSnp();
250   Double_t tgl = innerParam->GetTgl();
251
252   //Double_t vDeDxHisto[8] = {dedx,alpha,y,z,snp,tgl,ncls,p};
253   Double_t vDeDxHisto[8] = {dedx,phi,y,z,snp,tgl,ncls,p};
254   fDeDxHisto->Fill(vDeDxHisto); 
255
256   if(!stack) return;
257 }
258
259 //_____________________________________________________________________________
260 void AliPerformanceDEdx::ProcessTPCITS(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/)
261 {
262   // Fill dE/dx  comparison information
263   
264    AliDebug(AliLog::kWarning, "Warning: Not implemented");
265 }
266
267 //_____________________________________________________________________________
268 void AliPerformanceDEdx::ProcessConstrained(AliStack* const /*stack*/, AliESDtrack *const /*esdTrack*/)
269 {
270   // Fill dE/dx  comparison information
271   
272    AliDebug(AliLog::kWarning, "Warning: Not implemented");
273 }
274
275 //_____________________________________________________________________________
276 Long64_t AliPerformanceDEdx::Merge(TCollection* const list) 
277 {
278   // Merge list of objects (needed by PROOF)
279
280   if (!list)
281   return 0;
282
283   if (list->IsEmpty())
284   return 1;
285
286   TIterator* iter = list->MakeIterator();
287   TObject* obj = 0;
288   TObjArray* objArrayList = 0;
289   objArrayList = new TObjArray();
290
291   // collection of generated histograms
292   Int_t count=0;
293   while((obj = iter->Next()) != 0) 
294   {
295     AliPerformanceDEdx* entry = dynamic_cast<AliPerformanceDEdx*>(obj);
296     if (entry == 0) continue; 
297     if (fgMergeTHnSparse) {
298         if ((fDeDxHisto) && (entry->fDeDxHisto)) { fDeDxHisto->Add(entry->fDeDxHisto); }        
299     }
300     // the analysisfolder is only merged if present
301     if (entry->fFolderObj) { objArrayList->Add(entry->fFolderObj); }
302
303     count++;
304   }
305   if (fFolderObj) { fFolderObj->Merge(objArrayList); } 
306   // to signal that track histos were not merged: reset
307   if (!fgMergeTHnSparse) { fDeDxHisto->Reset(); }
308   // delete
309   if (objArrayList)  delete objArrayList;  objArrayList=0;  
310
311 return count;
312 }
313
314 //_____________________________________________________________________________
315 void AliPerformanceDEdx::Exec(AliMCEvent* const mcEvent, AliESDEvent *const esdEvent, AliESDfriend *const esdFriend, const Bool_t bUseMC, const Bool_t bUseESDfriend)
316 {
317   // Process comparison information 
318   //
319   if(!esdEvent) 
320   {
321       AliDebug(AliLog::kError, "esdEvent not available");
322       return;
323   }
324   AliHeader* header = 0;
325   AliGenEventHeader* genHeader = 0;
326   AliStack* stack = 0;
327   TArrayF vtxMC(3);
328   
329   if(bUseMC)
330   {
331     if(!mcEvent) {
332       AliDebug(AliLog::kError, "mcEvent not available");
333       return;
334     }
335
336     // get MC event header
337     header = mcEvent->Header();
338     if (!header) {
339       AliDebug(AliLog::kError, "Header not available");
340       return;
341     }
342     // MC particle stack
343     stack = mcEvent->Stack();
344     if (!stack) {
345       AliDebug(AliLog::kError, "Stack not available");
346       return;
347     }
348
349     // get MC vertex
350     genHeader = header->GenEventHeader();
351     if (!genHeader) {
352       AliDebug(AliLog::kError, "Could not retrieve genHeader from Header");
353       return;
354     }
355     genHeader->PrimaryVertex(vtxMC);
356
357   } // end bUseMC
358
359   // use ESD friends
360   if(bUseESDfriend) {
361     if(!esdFriend) {
362       AliDebug(AliLog::kError, "esdFriend not available");
363       return;
364     }
365   }
366
367   // trigger
368   if(!bUseMC && GetTriggerClass()) {
369     Bool_t isEventTriggered = esdEvent->IsTriggerClassFired(GetTriggerClass());
370     if(!isEventTriggered) return; 
371   }
372
373   // get event vertex
374   const AliESDVertex *vtxESD = NULL;
375   if( IsUseTrackVertex() ) 
376   { 
377     // track vertex
378     vtxESD = esdEvent->GetPrimaryVertexTracks();
379   }
380   else {
381     // TPC track vertex
382     vtxESD = esdEvent->GetPrimaryVertexTPC();
383   }
384   if(vtxESD && (vtxESD->GetStatus()<=0)) return;
385
386   //  Process events
387   for (Int_t iTrack = 0; iTrack < esdEvent->GetNumberOfTracks(); iTrack++) 
388   { 
389     AliESDtrack *track = esdEvent->GetTrack(iTrack);
390     if(!track) continue;
391
392     if(GetAnalysisMode() == 0) ProcessTPC(stack,track);
393     else if(GetAnalysisMode() == 1) ProcessTPCITS(stack,track);
394     else if(GetAnalysisMode() == 2) ProcessConstrained(stack,track);
395     else if(GetAnalysisMode() == 3) ProcessInnerTPC(stack,track,esdEvent);
396     else {
397       printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
398       return;
399     }
400   }
401 }
402
403 //_____________________________________________________________________________
404 void AliPerformanceDEdx::Analyse()
405 {
406   // Analyze comparison information and store output histograms
407   // in the folder "folderDEdx"
408   //
409   TH1::AddDirectory(kFALSE);
410   TH1::SetDefaultSumw2(kFALSE);
411   TH1F *h1D=0;
412   TH2F *h2D=0;
413   TObjArray *aFolderObj = new TObjArray;
414   TString selString;
415
416   char name[256];
417   char title[256];
418
419   for(Int_t i=1; i<8; i++) { 
420     AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, i);
421   }
422
423   // resolution histograms for mips
424   //dedx:phi:y:z:snp:tgl:ncls:p
425   fDeDxHisto->GetAxis(2)->SetRangeUser(-15.,14.999);
426   fDeDxHisto->GetAxis(3)->SetRangeUser(-120.,119.999);
427   fDeDxHisto->GetAxis(4)->SetRangeUser(-0.4, 0.399);
428   fDeDxHisto->GetAxis(5)->SetRangeUser(-0.9,0.89);
429   fDeDxHisto->GetAxis(6)->SetRangeUser(60.,160.);
430   fDeDxHisto->GetAxis(7)->SetRangeUser(0.4,0.499);
431   
432   
433   selString = "mipsres";
434   AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, &selString);
435
436   //
437   TObjArray *arr[7] = {0};
438   TF1 *f1[7] = {0};
439   
440   for(Int_t i=0; i<7; i++) 
441   { 
442     arr[i] = new TObjArray;
443     f1[i] = new TF1("gaus","gaus");
444     //printf("i %d \n",i);
445
446     h2D = (TH2F*)fDeDxHisto->Projection(0,i+1);
447
448     f1[i]->SetRange(40,60); // should be pion peak
449     h2D->FitSlicesY(f1[i],0,-1,10,"QNR",arr[i]); // gaus fit of pion peak
450
451     h1D = (TH1F*)arr[i]->At(1);
452     sprintf(name,"mean_dedx_mips_vs_%d",i);
453     h1D->SetName(name);
454     sprintf(title,"%s vs %s","mean_dedx_mips (a.u.)",fDeDxHisto->GetAxis(i)->GetTitle());
455     h1D->SetTitle(title);
456     h1D->GetXaxis()->SetTitle(fDeDxHisto->GetAxis(i)->GetTitle());
457     h1D->GetYaxis()->SetTitle("mean_dedx_mips (a.u.)");
458     //h1D->SetMinimum(40);
459     //h1D->SetMaximum(60);
460
461     aFolderObj->Add(h1D);
462
463     h1D = (TH1F*)arr[i]->At(2);
464     sprintf(name,"res_dedx_mips_vs_%d",i);
465     h1D->SetName(name);
466     sprintf(title,"%s vs %s","res_dedx_mips (a.u)",fDeDxHisto->GetAxis(i)->GetTitle());
467     h1D->SetTitle(title);
468     h1D->GetXaxis()->SetTitle(fDeDxHisto->GetAxis(i)->GetTitle());
469     h1D->GetYaxis()->SetTitle("res_dedx_mips (a.u.)");
470     //h1D->SetMinimum(0);
471     //h1D->SetMaximum(6);
472
473     aFolderObj->Add(h1D);
474   }
475
476     // select MIPs (version from AliTPCPerfomanceSummary)
477     fDeDxHisto->GetAxis(0)->SetRangeUser(35,60);
478     fDeDxHisto->GetAxis(2)->SetRangeUser(-20,20);
479     fDeDxHisto->GetAxis(3)->SetRangeUser(-250,250);
480     fDeDxHisto->GetAxis(4)->SetRangeUser(-1, 1);
481     fDeDxHisto->GetAxis(5)->SetRangeUser(-1,1);
482     fDeDxHisto->GetAxis(6)->SetRangeUser(80,160);
483     fDeDxHisto->GetAxis(7)->SetRangeUser(0.4,0.55);
484     
485     selString = "mips";
486     AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, &selString);
487     
488     selString = "mips_C";
489     fDeDxHisto->GetAxis(5)->SetRangeUser(-3,0);
490     AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, 5, &selString);
491     AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, 1, &selString);
492     
493     selString = "mips_A";
494     fDeDxHisto->GetAxis(5)->SetRangeUser(0,3);
495     AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, 5, &selString);    
496     AddProjection(aFolderObj, "dedx", fDeDxHisto, 0, 1, &selString);
497     
498     //restore cuts
499     fDeDxHisto->GetAxis(0)->SetRangeUser(0,300);
500     fDeDxHisto->GetAxis(2)->SetRangeUser(-20,20);
501     fDeDxHisto->GetAxis(3)->SetRangeUser(-250,250);
502     fDeDxHisto->GetAxis(4)->SetRangeUser(-1, 1);
503     fDeDxHisto->GetAxis(5)->SetRangeUser(-3,3);
504     fDeDxHisto->GetAxis(6)->SetRangeUser(0,160);
505     fDeDxHisto->GetAxis(7)->SetRangeUser(1e-2,10);    
506   
507     printf("exportToFolder\n");
508     // export objects to analysis folder
509     fAnalysisFolder = ExportToFolder(aFolderObj);
510     if (fFolderObj) delete fFolderObj;
511     fFolderObj = aFolderObj;
512     aFolderObj=0;
513
514
515   for(Int_t i=0;i<7;i++) { 
516     if(f1[i]) delete f1[i]; f1[i]=0;
517   }
518
519 }
520
521 //_____________________________________________________________________________
522 TFolder* AliPerformanceDEdx::ExportToFolder(TObjArray * array) 
523 {
524   // recreate folder avery time and export objects to new one
525   //
526   AliPerformanceDEdx * comp=this;
527   TFolder *folder = comp->GetAnalysisFolder();
528
529   TString name, title;
530   TFolder *newFolder = 0;
531   Int_t i = 0;
532   Int_t size = array->GetSize();
533
534   if(folder) { 
535      // get name and title from old folder
536      name = folder->GetName();  
537      title = folder->GetTitle();  
538
539          // delete old one
540      delete folder;
541
542          // create new one
543      newFolder = CreateFolder(name.Data(),title.Data());
544      newFolder->SetOwner();
545
546          // add objects to folder
547      while(i < size) {
548            newFolder->Add(array->At(i));
549            i++;
550          }
551   }
552
553 return newFolder;
554 }
555
556
557 //_____________________________________________________________________________
558 TFolder* AliPerformanceDEdx::CreateFolder(TString name,TString title) { 
559 // create folder for analysed histograms
560 TFolder *folder = 0;
561   folder = new TFolder(name.Data(),title.Data());
562
563   return folder;
564 }
565
566 //_____________________________________________________________________________
567 TTree* AliPerformanceDEdx::CreateSummary()
568 {
569     // implementaion removed, switched back to use AliPerformanceSummary (now called in AliPerformanceTask)
570     return 0;
571 }
572