]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/hfe/AliHFEefficiency.cxx
Fixes to cure warnings
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEefficiency.cxx
CommitLineData
70da6c5a 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15//
16// Task for Efficiency studies
17// Used for testing classes AliHFEcontainer and AliHFEfilter
18// Creates Efficiency Histograms
19//
20// Author:
21// Markus Fasel <M.Fasel@gsi.de>
22//
23#include <TAxis.h>
24#include <TCanvas.h>
25#include <TFile.h>
26#include <TGraphErrors.h>
27#include <TH1F.h>
28#include <TH2.h>
29#include <TIterator.h>
30#include <TLegend.h>
31#include <TObjArray.h>
32#include <TPad.h>
33
91c7e1ec 34#include "AliAnalysisManager.h"
70da6c5a 35#include "AliCFAcceptanceCuts.h"
91c7e1ec 36#include "AliCFTrackIsPrimaryCuts.h"
70da6c5a 37#include "AliCFContainer.h"
38#include "AliCFEffGrid.h"
39#include "AliESDEvent.h"
40#include "AliHFEcollection.h"
41#include "AliHFEcontainer.h"
42#include "AliHFEcutStep.h"
43#include "AliHFEefficiency.h"
44#include "AliHFEextraCuts.h"
45#include "AliHFEtrackFilter.h"
46#include "AliHFEtools.h"
47#include "AliMCEvent.h"
91c7e1ec 48#include "AliMCEventHandler.h"
70da6c5a 49
50ClassImp(AliHFEefficiency)
51
52AliHFEefficiency::AliHFEefficiency():
53 AliAnalysisTaskSE(),
54 fFilter(NULL),
55 fMCcut(NULL),
56 fAcceptanceCuts(NULL),
57 fEfficiency(NULL),
58 fOutput(NULL),
59 fCutTRD(kFALSE)
60{
61 //
62 // Default constructor
63 //
64}
65
66AliHFEefficiency::AliHFEefficiency(const Char_t *name):
67 AliAnalysisTaskSE(name),
68 fFilter(NULL),
69 fMCcut(NULL),
70 fAcceptanceCuts(NULL),
71 fEfficiency(NULL),
72 fOutput(NULL),
73 fCutTRD(kFALSE)
74{
75 //
76 // Main Constructor
77 //
78 DefineOutput(1, AliHFEcontainer::Class());
79 DefineOutput(2, TList::Class());
80}
81
82AliHFEefficiency::~AliHFEefficiency(){
83 //
84 // Destructor
85 //
86 if(fFilter) delete fFilter;
87 if(fEfficiency) delete fEfficiency;
88 if(fAcceptanceCuts) delete fAcceptanceCuts;
89 if(fOutput) delete fOutput;
90}
91
92void AliHFEefficiency::UserCreateOutputObjects(){
93 //
94 // Create the output objects
95 //
96 fEfficiency = new AliHFEcontainer("Efficiency");
97 fEfficiency->SetNumberOfVariables(4);
98 // InitializeVariables
99 fEfficiency->SetVariableName(0, "pt");
100 fEfficiency->MakeLogarithmicBinning(0, 40, 0.1, 10);
101 fEfficiency->SetVariableName(1, "Eta");
102 fEfficiency->MakeLinearBinning(1, 20, -0.9, 0.9);
103 fEfficiency->SetVariableName(2, "phi");
104 fEfficiency->MakeLinearBinning(2 , 18, 0, 2 * TMath::Pi());
105 fEfficiency->SetVariableName(3, "Charge");
106 fEfficiency->MakeLinearBinning(3, 2, -1.1, 1.1);
107 // New container
108 fEfficiency->CreateContainer("MCFilter", "Efficiency for MC Studies", 2);
109 AliCFContainer *cont = fEfficiency->GetCFContainer("MCFilter");
110 cont->SetStepTitle(0, "MC Signal");
111 cont->SetStepTitle(1, "MC Signal in acceptance");
112
113 fFilter = new AliHFEtrackFilter("testfilter");
114 fFilter->GenerateCutSteps();
115 fFilter->InitCF(fEfficiency);
116 fMCcut = fFilter->GetMCSignalCuts();
117 if(fCutTRD){
118 AliHFEcutStep *hfeTRD = fFilter->GetCutStep("HFETRD");
119 AliHFEextraCuts *hfecuts = dynamic_cast<AliHFEextraCuts *>(hfeTRD->GetCut("HFETRDCuts"));
120 hfecuts->SetMinTrackletsTRD(4);
121 }
122 AliHFEcutStep *hfeITS = fFilter->GetCutStep("HFEITS");
123 AliHFEextraCuts *hfeitscuts = dynamic_cast<AliHFEextraCuts *>(hfeITS->GetCut("HFEPixelsCuts"));
124 hfeitscuts->SetRequireITSpixel(AliHFEextraCuts::kFirst);
125
91c7e1ec 126 AliHFEcutStep *primary = fFilter->GetCutStep("Primary");
127 AliCFTrackIsPrimaryCuts *primcuts = dynamic_cast<AliCFTrackIsPrimaryCuts *>(primary->GetCut("PrimaryCuts"));
128 primcuts->SetMaxDCAToVertexXY(3);
129 primcuts->SetMaxDCAToVertexZ(5);
130
70da6c5a 131 fAcceptanceCuts = new AliCFAcceptanceCuts("Acceptance", "MC Acceptance Cuts");
132 fAcceptanceCuts->SetMinNHitITS(3);
133 fAcceptanceCuts->SetMinNHitTPC(2);
134 fAcceptanceCuts->SetMinNHitTRD(0);
135
136 // create additional histos for testing purpose
137 fOutput = new AliHFEcollection("histos", "QA histograms");
138 fOutput->CreateTH1F("hNtracks","Number of Tracks per Event", 100, 0, 100);
139 fOutput->CreateTH1F("hPt","Pt of the tracks", 40, 0.1, 10);
140 fOutput->BinLogAxis("hPt", 0);
141 fOutput->CreateTH1F("kinkIndex", "Kink Index", 400, -200, 200);
142 fOutput->CreateTH1F("itspixel", "ITS PIXEL", 2, 0, 2);
143 fOutput->CreateTH1F("mcmother", "Mother PDG", 1000, -500, 500);
144 fOutput->CreateTH2F("ptres", "Pt Resolution", 40, 0.1, 10, 200, -1.5, 1.5);
145 fOutput->BinLogAxis("ptres", 0);
146}
147
148void AliHFEefficiency::UserExec(Option_t *){
149 //
150 // Event Loop
151 // Filter track, fill Efficiency container
152 //
153 fEfficiency->NewEvent();
154 fFilter->SetRecEvent(fInputEvent);
155 if(fMCEvent){
91c7e1ec 156 AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
157 if(!mcH->InitOk()) return;
158 if(!mcH->TreeK()) return;
159 if(!mcH->TreeTR()) return;
70da6c5a 160 fFilter->SetMC(fMCEvent);
161 FilterMC();
162 }
163 fFilter->FilterTracks(dynamic_cast<AliESDEvent *>(fInputEvent));
164 TObjArray *tracks = fFilter->GetFilteredTracks();
165 TIterator *iter = tracks->MakeIterator();
166 fOutput->Fill("hNtracks", tracks->GetEntriesFast());
167 AliESDtrack *track = NULL;
168 while((track = dynamic_cast<AliESDtrack *>(iter->Next()))){
169 fOutput->Fill("hPt", track->Pt());
170 fOutput->Fill("kinkIndex", track->GetKinkIndex(0));
171 if(TESTBIT(track->GetITSClusterMap(), 0))
172 fOutput->Fill("itspixel",1);
173 else
174 fOutput->Fill("itspixel",0);
175 AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel())));
91c7e1ec 176 if(mctrack){
177 Int_t motherLabel = mctrack->Particle()->GetFirstMother();
178 if(motherLabel){
179 AliMCParticle *mother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(motherLabel));
180 fOutput->Fill("mcmother", mother->Particle()->GetPdgCode());
181 }
182 fOutput->Fill("ptres", mctrack->Pt(), (track->Pt() - mctrack->Pt())/mctrack->Pt());
183 }
70da6c5a 184 }
185 delete iter;
186 fFilter->Flush();
187 PostData(1, fEfficiency);
188 PostData(2, fOutput->GetList());
189}
190
191void AliHFEefficiency::Terminate(Option_t *){
192 //
193 // Evaluate Results
194 //
195 fEfficiency = dynamic_cast<AliHFEcontainer *>(GetOutputData(1));
196 if(!fEfficiency) return;
197 PostProcess();
198
199 TList *l = dynamic_cast<TList *>(GetOutputData(2));
200 DrawPtResolution(l);
201}
202
203void AliHFEefficiency::FilterMC(){
204 //
205 // Cut MC tracks
206 //
207 Double_t cont[4] = {0., 0., 0., 0.};
208 AliMCParticle *track = NULL;
209 for(Int_t itrack = 0; itrack < fMCEvent->GetNumberOfTracks(); itrack++){
210 track = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(itrack));
211 if(!fMCcut->IsSelected(track)) continue;
212 cont[0] = track->Pt();
213 cont[1] = track->Eta();
214 cont[2] = track->Phi();
215 cont[3] = track->Charge()/3;
216 //AliMCParticle *mother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(track->Particle()->GetFirstMother()));
217 //if(TMath::Abs(mother->Particle()->GetPdgCode()) != 443) continue;
218 fEfficiency->FillCFContainer("MCFilter", 0, cont);
219 if(!fAcceptanceCuts->IsSelected(track)) continue;
220 fEfficiency->FillCFContainer("MCFilter", 1, cont);
221 }
222}
223
224void AliHFEefficiency::Load(const char* filename){
225 TFile *input = TFile::Open(filename);
226 AliHFEcontainer *cin = dynamic_cast<AliHFEcontainer *>(input->Get("Efficiency"));
227 fEfficiency = dynamic_cast<AliHFEcontainer *>(cin->Clone());
228 input->Close();
229 delete input;
230}
231
232void AliHFEefficiency::PostProcess(){
233 //
234 // Calculate Efficiencies
235 //
236 fEfficiency->Print();
237
238 // Prepare containers
239 AliCFContainer *crec = fEfficiency->MakeMergedCFContainer("merged", "Merged Container", "MCFilter:testfilter_container_signal");
240 AliCFContainer *cmc = fEfficiency->MakeMergedCFContainer("merged", "Merged Container", "MCFilter:testfilter_container_signalMC");
241 AliCFEffGrid *gridRec = new AliCFEffGrid("effrec", "Efficiency Calculation using rec vars", *crec);
242 AliCFEffGrid *gridMC = new AliCFEffGrid("effmc", "Efficiency Calculation using mc vars", *cmc);
243
244 TCanvas *ctmp = NULL;
245 for(Int_t ivar = 0; ivar < crec->GetNVar(); ivar++){
246 ctmp = new TCanvas(Form("cEffSignal%s", crec->GetVarTitle(ivar)), Form("Signal Efficiency (%s)", crec->GetVarTitle(ivar)));
247 ctmp->cd();
248 DrawSignalEfficiency(gridRec, crec, ivar);
249
250 ctmp = new TCanvas(Form("cCutEff%s", crec->GetVarTitle(ivar)), Form("Cut Step Efficiency (%s)", crec->GetVarTitle(ivar)));
251 ctmp->cd();
252 DrawCutEfficiency(gridRec, crec, ivar);
253
254 ctmp = new TCanvas(Form("cEffSignalMC%s", crec->GetVarTitle(ivar)), Form("Signal Efficiency (%s, MC)", crec->GetVarTitle(ivar)));
255 ctmp->cd();
256 DrawSignalEfficiency(gridMC, cmc, ivar);
257
258 ctmp = new TCanvas(Form("cCutEffMC%s", crec->GetVarTitle(ivar)), Form("Cut Step Efficiency (%s, MC)", crec->GetVarTitle(ivar)));
259 ctmp->cd();
260 DrawCutEfficiency(gridMC, cmc, ivar);
261 }
262
263 CalculatePTsmearing();
264
265 delete gridRec;
266 delete gridMC;
267 delete crec;
268 delete cmc;
269}
270
271void AliHFEefficiency::DrawSignalEfficiency(AliCFEffGrid *eff, AliCFContainer *cont, Int_t var){
272 //
273 // Efficiency of a cut step with respect to the signal
274 //
275 TH1 *hEff = NULL;
276 Bool_t kFirst = kTRUE;
277 TLegend *leg = new TLegend(0.5, 0.7, 0.89, 0.89);
278 for(Int_t istep = 1; istep < cont->GetNStep(); istep++){
279 eff->CalculateEfficiency(istep, 0);
280 hEff = eff->Project(var);
281 hEff->SetTitle(Form("Signal Efficiency (%s)", cont->GetVarTitle(var)));
282 hEff->GetYaxis()->SetRangeUser(0., 1.6);
283 hEff->GetYaxis()->SetTitle("Efficiency");
284 hEff->SetStats(kFALSE);
285 hEff->SetMarkerStyle(20+istep);
286 hEff->SetMarkerColor(kBlue - 5 + istep);
287 hEff->Draw(kFirst ? "ep" : "epsame");
288 kFirst = kFALSE;
289 leg->AddEntry(hEff, cont->GetStepTitle(istep), "p");
290 }
291 leg->SetBorderSize(0);
292 leg->SetFillStyle(0);
293 leg->Draw();
294 gPad->Update();
295}
296
297void AliHFEefficiency::DrawCutEfficiency(AliCFEffGrid *eff, AliCFContainer *cont, Int_t var){
298 //
299 // Efficiency of a cut step with respect to the previous one
300 //
301 Bool_t kFirst = kTRUE;
302 TH1 *hEff = NULL;
303 TLegend *leg = new TLegend(0.5, 0.7, 0.89, 0.89);
304 TString effTitle;
305 Int_t start = 0, length = 0;
306 for(Int_t istep = 1; istep < cont->GetNStep(); istep++){
307 eff->CalculateEfficiency(istep, istep -1);
308 hEff = eff->Project(var);
309 effTitle = hEff->GetTitle();
310 start = effTitle.Index("projected"); length = effTitle.Length() - start;
311 effTitle.Remove(start - 1, length + 1);
312 effTitle.ReplaceAll("Efficiency: ", "");
313 hEff->SetTitle(Form("Cut Efficiency (%s)", cont->GetVarTitle(var)));
314 hEff->GetYaxis()->SetRangeUser(0., 1.6);
315 hEff->GetYaxis()->SetTitle("Efficiency");
316 hEff->SetStats(kFALSE);
317 hEff->SetMarkerStyle(20+istep);
318 hEff->SetMarkerColor(kBlue - 5 + istep);
319 hEff->Draw(kFirst ? "ep" : "epsame");
320 kFirst = kFALSE;
321 leg->AddEntry(hEff, effTitle.Data(), "p");
322 }
323 leg->SetBorderSize(0);
324 leg->SetFillStyle(0);
325 leg->Draw();
326 gPad->Update();
327}
328
329void AliHFEefficiency::CalculatePTsmearing(){
330 //
331 // Efficiency of a cut step with respect to the same cut step filled with MC
332 // Information
333 //
334 AliCFContainer *cont = fEfficiency->MakeMergedCFContainer("merged", "Merged Container", "testfilter_container_signal:testfilter_container_signalMC");
335 AliCFEffGrid *grid = new AliCFEffGrid("effc", "Efficiency Calculation", *cont);
336 Bool_t kFirst = kTRUE;
337 TH1 *hEff = NULL;
338 TCanvas *c2 = new TCanvas("cSmear", "pT modification");
339 c2->cd();
340 TLegend *leg1 = new TLegend(0.5, 0.7, 0.89, 0.89);
341 Int_t nStep = cont->GetNStep()/2;
342 for(Int_t istep = 0; istep < nStep; istep++){
343 grid->CalculateEfficiency(istep, istep + nStep);
344 hEff = grid->Project(0);
345 hEff->SetStats(kFALSE);
346 hEff->SetMarkerStyle(20+istep);
347 hEff->SetMarkerColor(kBlue - 5 + istep);
348 hEff->Draw(kFirst ? "ep" : "epsame");
349 kFirst = kFALSE;
350 leg1->AddEntry(hEff, cont->GetStepTitle(istep), "p");
351 }
352 leg1->Draw();
353 gPad->Update();
354
355 delete cont;
356 delete grid;
357}
358
359void AliHFEefficiency::DrawPtResolution(TList *l){
360 //
361 // Draw pt resolution
362 //
363 TH2 *h2 = dynamic_cast<TH2 *>(l->FindObject("ptres"));
364 TGraphErrors *mean = new TGraphErrors(h2->GetNbinsX());
365 TGraphErrors *rms = new TGraphErrors(h2->GetNbinsX());
366
367 Double_t pt = 0., pterr = 0., mymean = 0., myrms = 0., mymeanerr = 0., myrmserr = 0.;
368 TH1 *htmp = NULL;
369 for(Int_t imom = 1; imom <= h2->GetXaxis()->GetLast(); imom++){
370 pt = h2->GetXaxis()->GetBinCenter(imom);
371 pterr = h2->GetXaxis()->GetBinWidth(imom)/2.;
372 htmp = h2->ProjectionY("py", imom, imom);
373 mymean = htmp->GetMean();
374 myrms = htmp->GetRMS();
375 mymeanerr = htmp->GetMeanError();
376 myrmserr = htmp->GetRMSError();
377 delete htmp;
378 mean->SetPoint(imom -1, pt, mymean);
379 rms->SetPoint(imom -1, pt, myrms);
380 mean->SetPointError(imom-1,pterr,mymeanerr);
381 rms->SetPointError(imom-1,pterr,myrmserr);
382 }
383
384 TCanvas *c1 = new TCanvas("cPtShift", "pT Shift");
385 c1->cd();
386 mean->SetMarkerStyle(22);
387 mean->SetMarkerColor(kBlue);
388 mean->Draw("ape");
389 rms->SetMarkerStyle(22);
390 rms->SetMarkerColor(kBlack);
391 rms->Draw("pesame");
392 TLegend *leg = new TLegend(0.5, 0.7, 0.89, 0.89);
393 leg->AddEntry(mean, "Mean", "lp");
394 leg->AddEntry(rms, "RMS", "lp");
395 leg->Draw();
396 gPad->Update();
397}
398