]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG1/AliComparisonDEdx.cxx
Update in the Comparison tasks
[u/mrichter/AliRoot.git] / PWG1 / AliComparisonDEdx.cxx
CommitLineData
3baa4bfd 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.
9//
10// Author: J.Otwinowski 04/02/2008
11//------------------------------------------------------------------------------
12
13/*
14
15 // after running comparison task, read the file, and get component
b4126c69 16 gROOT->LoadMacro("$ALICE_ROOT/PWG1/Macros/LoadMyLibs.C");
17 LoadMyLibs();
3baa4bfd 18 TFile f("Output.root");
35771050 19 //AliComparisonDEdx * compObj = (AliComparisonDEdx*)f.Get("AliComparisonDEdx");
20 AliComparisonDEdx * compObj = (AliComparisonDEdx*)cOutput->FindObject("AliComparisonDEdx");
3baa4bfd 21
b4126c69 22 // Analyse comparison data
3baa4bfd 23 compObj->Analyse();
24
25 // the output histograms/graphs will be stored in the folder "folderDEdx"
26 compObj->GetAnalysisFolder()->ls("*");
27
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();
32 fout.Close();
33
34*/
35
36#include <iostream>
37
38#include "TFile.h"
39#include "TCint.h"
40#include "TH3F.h"
41#include "TH2F.h"
42#include "TF1.h"
43#include "TProfile.h"
44#include "TProfile2D.h"
45#include "TGraph2D.h"
46#include "TCanvas.h"
47#include "TGraph.h"
48//
49#include "AliESDEvent.h"
50#include "AliESD.h"
51#include "AliESDfriend.h"
52#include "AliESDfriendTrack.h"
53#include "AliRecInfoCuts.h"
54#include "AliMCInfoCuts.h"
55#include "AliLog.h"
56//
57#include "AliMathBase.h"
58#include "AliTreeDraw.h"
59//#include "TStatToolkit.h"
60
61#include "AliMCInfo.h"
62#include "AliESDRecInfo.h"
63#include "AliComparisonDEdx.h"
64
65using namespace std;
66
67ClassImp(AliComparisonDEdx)
68
69//_____________________________________________________________________________
70AliComparisonDEdx::AliComparisonDEdx():
71// TNamed("AliComparisonDEdx","AliComparisonDEdx"),
72 AliComparisonObject("AliComparisonDEdx"),
73
74 // dEdx
75 fTPCSignalNormTan(0),
76 fTPCSignalNormSPhi(0),
77 fTPCSignalNormTPhi(0),
78 //
79 fTPCSignalNormTanSPhi(0),
80 fTPCSignalNormTanTPhi(0),
81 fTPCSignalNormTanSPt(0),
82
83 // Cuts
84 fCutsRC(0),
85 fCutsMC(0),
86 fMCPtMin(0),
87 fMCAbsTanThetaMax(0),
88 fMCPdgCode(0),
89
90 // histogram folder
91 fAnalysisFolder(0)
92{
93 Init();
94}
95
96//_____________________________________________________________________________
97AliComparisonDEdx::~AliComparisonDEdx(){
98
99 if(fTPCSignalNormTan) delete fTPCSignalNormTan; fTPCSignalNormTan=0;
100 if(fTPCSignalNormSPhi) delete fTPCSignalNormSPhi; fTPCSignalNormSPhi=0;
101 if(fTPCSignalNormTPhi) delete fTPCSignalNormTPhi; fTPCSignalNormTPhi=0;
102 //
103 if(fTPCSignalNormTanSPhi) delete fTPCSignalNormTanSPhi; fTPCSignalNormTanSPhi=0;
104 if(fTPCSignalNormTanTPhi) delete fTPCSignalNormTanTPhi; fTPCSignalNormTanTPhi=0;
105 if(fTPCSignalNormTanSPt) delete fTPCSignalNormTanSPt; fTPCSignalNormTanSPt=0;
106
107 if(fAnalysisFolder) delete fAnalysisFolder; fAnalysisFolder=0;
108}
109
110//_____________________________________________________________________________
111void AliComparisonDEdx::Init()
112{
113 // Init histograms
114
115 // TPC dEdx
116 fTPCSignalNormTan = new TH2F("CdEdxTan","CdEdxTan",50, -2,2, 40,30,70);
117 fTPCSignalNormTan->SetXTitle("tan(#theta)");
118 fTPCSignalNormTan->SetYTitle("rec. dE/dx / calc. dE/dx");
119
120 fTPCSignalNormSPhi = new TH2F("CdEdxSPhi","CdEdxSPhi",10,0.0,1,40,30,70);
121 fTPCSignalNormSPhi->SetXTitle("sin(#phi)");
122 fTPCSignalNormSPhi->SetYTitle("rec. dE/dx / calc. dE/dx");
123
124 fTPCSignalNormTPhi = new TH2F("CdEdxTPhi","CdEdxTPhi",10,0.0,2,40,30,70);
125 fTPCSignalNormTPhi->SetXTitle("tan(#phi)");
126 fTPCSignalNormTPhi->SetYTitle("rec. dE/dx / calc. dE/dx");
127
128 fTPCSignalNormTanSPhi= new TH3F("CdEdxTanSPhi","CdEdxTanSPhi",20, -2,2, 10,0.0 ,1, 40,30,70);
129 fTPCSignalNormTanSPhi->SetXTitle("tan(#theta)");
130 fTPCSignalNormTanSPhi->SetYTitle("sin(#phi)");
131 fTPCSignalNormTanSPhi->SetZTitle("rec. dE/dx / calc. dE/dx");
132
133 fTPCSignalNormTanTPhi= new TH3F("CdEdxTanTPhi","CdEdxTanTPhi",20, -2,2, 10,0.0 ,1, 40,30,70);
134 fTPCSignalNormTanTPhi->SetXTitle("tan(#theta)");
135 fTPCSignalNormTanTPhi->SetYTitle("tan(#phi)");
136 fTPCSignalNormTanTPhi->SetZTitle("rec. dE/dx / calc. dE/dx");
137
138 fTPCSignalNormTanSPt= new TH3F("CdEdxTanSPt","CdEdxTanSPt",20, -2,2, 10,0.3 ,3, 40,30,70);
139 fTPCSignalNormTanSPt->SetXTitle("tan(#theta)");
140 fTPCSignalNormTanSPt->SetYTitle("#sqrt{p_{t}}");
141 fTPCSignalNormTanSPt->SetZTitle("rec. dE/dx / calc. dE/dx");
142
143 // Init cuts
144 if(!fCutsMC)
145 AliDebug(AliLog::kError, "ERROR: Cannot find AliMCInfoCuts object");
146 if(!fCutsRC)
147 AliDebug(AliLog::kError, "ERROR: Cannot find AliRecInfoCuts object");
148
149 // init folder
150 fAnalysisFolder = CreateFolder("folderDEdx","Analysis de/dx Folder");
151}
152
153//_____________________________________________________________________________
154void AliComparisonDEdx::Process(AliMCInfo* infoMC, AliESDRecInfo *infoRC){
155
156 // Fill dE/dx comparison information
157
158 Float_t mcpt = infoMC->GetParticle().Pt();
159 Float_t tantheta = TMath::Tan(infoMC->GetParticle().Theta()-TMath::Pi()*0.5);
160 Float_t mprim = infoMC->GetPrim();
161
162 // distance to Prim. vertex
163 const Double_t* dv = infoMC->GetVDist();
164
165 Bool_t isPrim = TMath::Sqrt(dv[0]*dv[0] + dv[1]*dv[1])<fCutsMC->GetMaxR() && TMath::Abs(dv[2])<fCutsMC->GetMaxVz();
166
167 // Check selection cuts
168 if (fCutsMC->IsPdgParticle(TMath::Abs(infoMC->GetParticle().GetPdgCode())) == kFALSE) return;
169 if (!isPrim) return;
170 if (infoRC->GetStatus(1)!=3) return;
171 if (!infoRC->GetESDtrack()) return;
172 if (infoRC->GetESDtrack()->GetTPCNcls()<fCutsRC->GetMinNClustersTPC()) return;
173 if (!infoRC->GetESDtrack()->GetConstrainedParam()) return;
174 //if (mprim>1.4) return;
175 //if (mprim<0.5) return;
176 if (mprim > fCutsMC->GetMaxTPCSignal()) return;
177 if (mprim < fCutsMC->GetMinTPCSignal()) return;
178 if (infoRC->GetESDtrack()->GetTPCsignalN()<fCutsRC->GetMinTPCsignalN()) return;
179 //
180 Float_t ratio = infoRC->GetESDtrack()->GetTPCsignal()/infoMC->GetPrim();
181 Float_t sphi = infoRC->GetESDtrack()->GetInnerParam()->GetSnp();
60e55aee 182 Float_t tphi = sphi/TMath::Sqrt((1.-sphi)*(1.+sphi));
3baa4bfd 183
184 if (TMath::Abs(infoMC->GetParticle().GetPdgCode()) != GetMCPdgCode()) return;
185 //if (mcpt>0.5) {
186 if (mcpt > GetMCPtMin()) {
187 fTPCSignalNormTan->Fill(tantheta,ratio); // only subset
188 }
189
190 //if (TMath::Abs(tantheta)<0.5){
191 if (TMath::Abs(tantheta) < GetMCAbsTanThetaMax()){
192 fTPCSignalNormSPhi->Fill(sphi,ratio); // only subset
193 fTPCSignalNormTPhi->Fill(tphi,ratio); // only subset
194 }
195 fTPCSignalNormTanSPhi->Fill(tantheta,sphi,ratio);
196 fTPCSignalNormTanTPhi->Fill(tantheta,tphi,ratio);
197 fTPCSignalNormTanSPt->Fill(tantheta,TMath::Sqrt(mcpt),ratio);
198}
199
200//_____________________________________________________________________________
201Long64_t AliComparisonDEdx::Merge(TCollection* list)
202{
203 // Merge list of objects (needed by PROOF)
204
205 if (!list)
206 return 0;
207
208 if (list->IsEmpty())
209 return 1;
210
211 TIterator* iter = list->MakeIterator();
212 TObject* obj = 0;
213
214 // collection of generated histograms
215 Int_t count=0;
216 while((obj = iter->Next()) != 0)
217 {
218 AliComparisonDEdx* entry = dynamic_cast<AliComparisonDEdx*>(obj);
219 if (entry == 0) continue;
220
221 fTPCSignalNormTan->Add(entry->fTPCSignalNormTan);
222 fTPCSignalNormSPhi->Add(entry->fTPCSignalNormSPhi);
223 fTPCSignalNormTPhi->Add(entry->fTPCSignalNormTPhi);
224 //
225 fTPCSignalNormTanSPhi->Add(entry->fTPCSignalNormTanSPhi);
226 fTPCSignalNormTanTPhi->Add(entry->fTPCSignalNormTanTPhi);
227 fTPCSignalNormTanSPt->Add(entry->fTPCSignalNormTanSPt);
228
229 count++;
230 }
231
232return count;
233}
234
235//_____________________________________________________________________________
236void AliComparisonDEdx::Exec(AliMCInfo* infoMC, AliESDRecInfo *infoRC)
237{
238 // Process comparison information
239 Process(infoMC,infoRC);
240}
241
242//_____________________________________________________________________________
243TH1F* AliComparisonDEdx::MakeResol(TH2F * his, Int_t integ, Bool_t type)
244{
245 // Make resolution histograms
246 TH1F *hisr, *hism;
247 if (!gPad) new TCanvas;
248 hisr = AliTreeDraw::CreateResHistoI(his,&hism,integ);
249 if (type) return hism;
250 else
251 return hisr;
252}
253
254//_____________________________________________________________________________
255void AliComparisonDEdx::Analyse()
256{
b4126c69 257 // Analyze comparison information and store output histograms
3baa4bfd 258 // in the folder "folderDEdx"
259 //
260
261 TH1::AddDirectory(kFALSE);
262
263 AliComparisonDEdx * comp=this;
b4126c69 264 TObjArray *aFolderObj = new TObjArray;
3baa4bfd 265
266 TH1F *hiss=0;
267 TGraph2D * gr=0;
268
3baa4bfd 269 // write results in the folder
270 TCanvas * c = new TCanvas("can","TPC dedx");
271 c->cd();
272
273 hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,0);
274 hiss->SetXTitle("Tan(#theta)");
275 hiss->SetYTitle("#sigma_{dEdx}");
276 hiss->Draw();
277 hiss->SetName("TPCdEdxResolTan");
278
b4126c69 279 aFolderObj->Add(hiss);
3baa4bfd 280 //
281 hiss = comp->MakeResol(comp->fTPCSignalNormTan,4,1);
282 hiss->SetXTitle("Tan(#theta)");
283 hiss->SetYTitle("<dEdx>");
284 hiss->Draw();
285 hiss->SetName("TPCdEdxMeanTan");
286
b4126c69 287 aFolderObj->Add(hiss);
3baa4bfd 288 //
289 gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,4);
290 gr->GetXaxis()->SetTitle("Tan(#theta)");
291 gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");
292 gr->GetZaxis()->SetTitle("<dEdx>");
293 gr->SetName("TPCdEdxMeanTanPt_1");
294 gr->GetHistogram()->Draw("colz");
295
decf0997 296 gr->GetHistogram()->SetName("TPCdEdxMeanTanPt_1");
b4126c69 297 aFolderObj->Add(gr->GetHistogram());
3baa4bfd 298 //
299 gr = AliMathBase::MakeStat2D(comp->fTPCSignalNormTanSPt,3,1,5);
300 gr->GetXaxis()->SetTitle("Tan(#theta)");
301 gr->GetYaxis()->SetTitle("#sqrt{p_{t}(GeV)}");
302 gr->GetZaxis()->SetTitle("#sigma_{dEdx}");
303 gr->SetName("TPCdEdxMeanTanPt_2");
304 gr->GetHistogram()->Draw("colz");
305
decf0997 306 gr->GetHistogram()->SetName("TPCdEdxMeanTanPt_2");
b4126c69 307 aFolderObj->Add(gr->GetHistogram());
308
309 // export objects to analysis folder
310 fAnalysisFolder = ExportToFolder(aFolderObj);
311
312 // delete only TObjrArray
313 if(aFolderObj) delete aFolderObj;
314}
315
316//_____________________________________________________________________________
317TFolder* AliComparisonDEdx::ExportToFolder(TObjArray * array)
318{
319 // recreate folder avery time and export objects to new one
320 //
321 AliComparisonDEdx * comp=this;
322 TFolder *folder = comp->GetAnalysisFolder();
323
324 TString name, title;
325 TFolder *newFolder = 0;
326 Int_t i = 0;
327 Int_t size = array->GetSize();
328
329 if(folder) {
330 // get name and title from old folder
331 name = folder->GetName();
332 title = folder->GetTitle();
333
334 // delete old one
335 delete folder;
3baa4bfd 336
b4126c69 337 // create new one
338 newFolder = CreateFolder(name.Data(),title.Data());
339 newFolder->SetOwner();
340
341 // add objects to folder
342 while(i < size) {
343 newFolder->Add(array->At(i));
344 i++;
345 }
346 }
347
348return newFolder;
3baa4bfd 349}
350
b4126c69 351
3baa4bfd 352//_____________________________________________________________________________
353TFolder* AliComparisonDEdx::CreateFolder(TString name,TString title) {
354// create folder for analysed histograms
355TFolder *folder = 0;
356 folder = new TFolder(name.Data(),title.Data());
357
358 return folder;
359}
360