1 //------------------------------------------------------------------------------
2 // Implementation of AliComparisonDEdx 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 AliComparisonDEdx.
10 // Author: J.Otwinowski 04/02/2008
11 //------------------------------------------------------------------------------
15 // after running comparison task, read the file, and get component
16 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
18 TFile f("Output.root");
19 //AliComparisonDEdx * compObj = (AliComparisonDEdx*)f.Get("AliComparisonDEdx");
20 AliComparisonDEdx * compObj = (AliComparisonDEdx*)cOutput->FindObject("AliComparisonDEdx");
22 // Analyse comparison data
25 // the output histograms/graphs will be stored in the folder "folderDEdx"
26 compObj->GetAnalysisFolder()->ls("*");
28 // user can save whole comparison object (or only folder with anlysed histograms)
29 // in the seperate output file (e.g.)
30 TFile fout("Analysed_DEdx.root"."recreate");
31 compObj->Write(); // compObj->GetAnalysisFolder()->Write();
37 #include "AliESDEvent.h"
38 #include "AliRecInfoCuts.h"
39 #include "AliMCInfoCuts.h"
41 #include "AliMathBase.h"
42 #include "AliTreeDraw.h"
44 #include "AliMCInfo.h"
45 #include "AliESDRecInfo.h"
46 #include "AliComparisonDEdx.h"
50 ClassImp(AliComparisonDEdx)
52 //_____________________________________________________________________________
53 AliComparisonDEdx::AliComparisonDEdx():
54 // TNamed("AliComparisonDEdx","AliComparisonDEdx"),
55 AliComparisonObject("AliComparisonDEdx"),
67 // default constructor
70 //_____________________________________________________________________________
71 AliComparisonDEdx::AliComparisonDEdx(Char_t* name="AliComparisonDEdx", Char_t* title="AliComparisonDEdx",Int_t analysisMode=0, Bool_t hptGenerator=kFALSE):
72 AliComparisonObject(name,title),
86 SetAnalysisMode(analysisMode);
87 SetHptGenerator(hptGenerator);
92 //_____________________________________________________________________________
93 AliComparisonDEdx::~AliComparisonDEdx()
96 if(fDeDxHisto) delete fDeDxHisto; fDeDxHisto=0;
98 if(fCutsRC) delete fCutsRC; fCutsRC=0;
99 if(fCutsMC) delete fCutsMC; fCutsMC=0;
101 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
104 //_____________________________________________________________________________
105 void AliComparisonDEdx::Init()
111 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.};
112 Double_t pMin = 0., pMax = 10.;
114 if(IsHptGenerator() == kTRUE) {
116 pMin = 0.; pMax = 100.;
119 //signal:alpha:y:z:snp:tgl:ncls:pid:p
120 Int_t binsQA[9] = {600,50, 50, 50, 50, 50, 80, 5, nPBins};
121 Double_t xminQA[9] = {0, -4,-20,-250, -1, -2, 0, 0., pMin};
122 Double_t xmaxQA[9] = {300, 4, 20, 250, 1, 2, 160, 5., pMax};
124 fDeDxHisto = new THnSparseF("fDeDxHisto","signal:alpha:y:z:snp:tgl:ncls:pid:momentum",9,binsQA,xminQA,xmaxQA);
125 if(!IsHptGenerator()) fDeDxHisto->SetBinEdges(8,binsP);
127 fDeDxHisto->GetAxis(0)->SetTitle("signal");
128 fDeDxHisto->GetAxis(1)->SetTitle("alpha (rad)");
129 fDeDxHisto->GetAxis(2)->SetTitle("y (cm)");
130 fDeDxHisto->GetAxis(3)->SetTitle("z (cm)");
131 fDeDxHisto->GetAxis(4)->SetTitle("snp");
132 fDeDxHisto->GetAxis(5)->SetTitle("tgl");
133 fDeDxHisto->GetAxis(6)->SetTitle("ncls");
134 fDeDxHisto->GetAxis(6)->SetTitle("pid");
135 fDeDxHisto->GetAxis(7)->SetTitle("p (GeV/c)");
140 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
142 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
145 fAnalysisFolder = CreateFolder("folderDEdx","Analysis de/dx Folder");
148 //_____________________________________________________________________________
149 void AliComparisonDEdx::ProcessTPC(AliMCInfo* const infoMC, AliESDRecInfo *const infoRC)
151 // Fill dE/dx comparison information
153 // Check selection cuts
154 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return;
157 if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetEM() ) pid = 0;
158 if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetMuM() ) pid = 1;
159 if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetPiP() ) pid = 2;
160 if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetKP() ) pid = 3;
161 if( TMath::Abs(infoMC->GetParticle().GetPdgCode())==fCutsMC->GetProt() ) pid = 4;
163 if (!infoRC->GetESDtrack()) return;
164 if (infoRC->GetESDtrack()->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return;
166 Float_t dedx = infoRC->GetESDtrack()->GetTPCsignal();
167 Int_t ncls = infoRC->GetESDtrack()->GetTPCNcls();
169 const AliExternalTrackParam *innerParam = 0;
170 if ((innerParam = infoRC->GetESDtrack()->GetInnerParam()) == 0) return;
172 Double_t pt = innerParam->Pt();
173 Double_t lam = TMath::ATan2(innerParam->Pz(),innerParam->Pt());
174 Double_t p = pt/TMath::Cos(lam);
175 Double_t alpha = innerParam->GetAlpha();
176 Double_t y = innerParam->GetY();
177 Double_t z = innerParam->GetZ();
178 Double_t snp = innerParam->GetSnp();
179 Double_t tgl = innerParam->GetTgl();
181 Double_t vDeDxHisto[9] = {dedx,alpha,y,z,snp,tgl,ncls,pid,p};
182 fDeDxHisto->Fill(vDeDxHisto);
185 //_____________________________________________________________________________
186 void AliComparisonDEdx::ProcessTPCITS(AliMCInfo* const infoMC, AliESDRecInfo *const infoRC)
188 // Fill dE/dx comparison information
190 AliDebug(AliLog::kWarning, "Warning: Not implemented");
193 //_____________________________________________________________________________
194 void AliComparisonDEdx::ProcessConstrained(AliMCInfo* const infoMC, AliESDRecInfo *const infoRC)
196 // Fill dE/dx comparison information
198 AliDebug(AliLog::kWarning, "Warning: Not implemented");
201 //_____________________________________________________________________________
202 Long64_t AliComparisonDEdx::Merge(TCollection* const list)
204 // Merge list of objects (needed by PROOF)
212 TIterator* iter = list->MakeIterator();
215 // collection of generated histograms
217 while((obj = iter->Next()) != 0)
219 AliComparisonDEdx* entry = dynamic_cast<AliComparisonDEdx*>(obj);
220 if (entry == 0) continue;
222 fDeDxHisto->Add(entry->fDeDxHisto);
229 //_____________________________________________________________________________
230 void AliComparisonDEdx::Exec(AliMCInfo* const infoMC, AliESDRecInfo *const infoRC)
232 // Process comparison information
234 if(GetAnalysisMode() == 0) ProcessTPC(infoMC,infoRC);
235 else if(GetAnalysisMode() == 1) ProcessTPCITS(infoMC,infoRC);
236 else if(GetAnalysisMode() == 2) ProcessConstrained(infoMC,infoRC);
238 printf("ERROR: AnalysisMode %d \n",fAnalysisMode);
243 //_____________________________________________________________________________
244 TH1F* AliComparisonDEdx::MakeResol(TH2F * his, Int_t integ, Bool_t type)
246 // Make resolution histograms
248 if (!gPad) new TCanvas;
249 hisr = AliTreeDraw::CreateResHistoI(his,&hism,integ);
250 if (type) return hism;
255 //_____________________________________________________________________________
256 void AliComparisonDEdx::Analyse()
258 // Analyze comparison information and store output histograms
259 // in the folder "folderDEdx"
261 TH1::AddDirectory(kFALSE);
262 TObjArray *aFolderObj = new TObjArray;
268 // write results in the folder
269 TCanvas * c = new TCanvas("can","TPC dedx");
272 hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,0);
273 hiss->SetXTitle("Tan(#theta)");
274 hiss->SetYTitle("#sigma_{dEdx}");
276 hiss->SetName("TPCdEdxResolTan");
278 aFolderObj->Add(hiss);
280 hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,1);
281 hiss->SetXTitle("Tan(#theta)");
282 hiss->SetYTitle("<dEdx>");
284 hiss->SetName("TPCdEdxMeanTan");
286 aFolderObj->Add(hiss);
288 gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,4);
289 gr->GetXaxis()->SetTitle("Tan(#theta)");
290 gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");
291 gr->GetZaxis()->SetTitle("<dEdx>");
292 gr->SetName("TPCdEdxMeanTanPt_1");
293 gr->GetHistogram()->Draw("colz");
295 gr->GetHistogram()->SetName("TPCdEdxMeanTanPt_1");
296 aFolderObj->Add(gr->GetHistogram());
298 gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,5);
299 gr->GetXaxis()->SetTitle("Tan(#theta)");
300 gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");
301 gr->GetZaxis()->SetTitle("#sigma_{dEdx}");
302 gr->SetName("TPCdEdxMeanTanPt_2");
303 gr->GetHistogram()->Draw("colz");
305 gr->GetHistogram()->SetName("TPCdEdxMeanTanPt_2");
306 aFolderObj->Add(gr->GetHistogram());
309 // export objects to analysis folder
310 fAnalysisFolder = ExportToFolder(aFolderObj);
312 // delete only TObjrArray
313 if(aFolderObj) delete aFolderObj;
316 //_____________________________________________________________________________
317 TFolder* AliComparisonDEdx::ExportToFolder(TObjArray * array)
319 // recreate folder avery time and export objects to new one
321 AliComparisonDEdx * comp=this;
322 TFolder *folder = comp->GetAnalysisFolder();
325 TFolder *newFolder = 0;
327 Int_t size = array->GetSize();
330 // get name and title from old folder
331 name = folder->GetName();
332 title = folder->GetTitle();
338 newFolder = CreateFolder(name.Data(),title.Data());
339 newFolder->SetOwner();
341 // add objects to folder
343 newFolder->Add(array->At(i));
352 //_____________________________________________________________________________
353 TFolder* AliComparisonDEdx::CreateFolder(TString name,TString title) {
354 // create folder for analysed histograms
356 folder = new TFolder(name.Data(),title.Data());