1 #include "AliHighPtDeDxBase.h"
13 ClassImp(AliHighPtDeDxBase);
16 // AliHighPtDeDxBase class
18 // This class contains the AliHighPtDeDxBase information
21 //_________________________________________________________
22 AliHighPtDeDxBase::AliHighPtDeDxBase():
28 fUseEtaCutAbs(kFALSE),
31 fUseFilterCut(kFALSE),
36 fEventVtxStatus(-999),
37 fEventVtxStatusMc(-999),
47 fTrackPhiCutVariable(-999),
58 hNclVsPhiVsPtBefore(0x0),
59 hNclVsPhiVsPtAfter(0x0)
61 // default constructor - do not use
64 //_________________________________________________________
65 AliHighPtDeDxBase::AliHighPtDeDxBase(const char* name, const char* title):
71 fUseEtaCutAbs(kFALSE),
74 fUseFilterCut(kFALSE),
79 fEventVtxStatus(-999),
80 fEventVtxStatusMc(-999),
90 fTrackPhiCutVariable(-999),
101 hNclVsPhiVsPtBefore(0x0),
102 hNclVsPhiVsPtAfter(0x0)
107 //_________________________________________________________
108 AliHighPtDeDxBase::~AliHighPtDeDxBase()
116 delete hNclVsPhiVsPtBefore;
117 delete hNclVsPhiVsPtAfter;
120 //_________________________________________________________
121 void AliHighPtDeDxBase::Init(Int_t nPtBins, Double_t* ptBins)
126 hVtxStatus = new TH1D("hVtxStatus", "Vtx status - No Vtx = -1, Vtx outside cut = 0, Vtx inside = 1",
129 hVtxStatus->SetDirectory(0);
131 hNevents = new TH1D("hNevents", "N events - No Vtx = 0, Vtx OK = 1",
134 hNevents->SetDirectory(0);
136 hEta = new TH1D("hEta", "#eta distribution; #eta; Counts",
139 hEta->SetDirectory(0);
141 hPhi = new TH1D("hPhi", "#varphi distribution; #varphi; Counts",
142 360, 0, TMath::TwoPi());
144 hPhi->SetDirectory(0);
146 hPt = new TH1D("hPt", "p_{T} spectrum; p_{T} [GeV/c]; Counts",
149 hPt->SetDirectory(0);
151 hMeanPt = new TProfile("hMeanPt", "mean p_{T}; p_{T} [GeV/c]; mean p_{T}",
153 hMeanPt->SetDirectory(0);
155 const Int_t nPhiBins = 50;
156 const Double_t phiBinSize = TMath::Pi()/9.0/nPhiBins;
157 Double_t phiBins[nPhiBins+1];
159 for(Int_t i = 0; i <= nPhiBins; i++) {
161 phiBins[i] = phiBinSize*i;
164 const Int_t nNclBins = 45;
165 const Double_t nclBinSize = 90.0/nNclBins;
166 Double_t nclBins[nNclBins+1];
168 for(Int_t i = 0; i <= nNclBins; i++) {
170 nclBins[i] = 69.5 + nclBinSize*i;
173 hNclVsPhiVsPtBefore = new TH3F("hNclVsPhiVsPtBefore", "<Ncl> vs Pt and #phi (before #phi cut); p_{T} [GeV/c]; fmod(#phi, #pi/9.0)",
174 nPtBins, ptBins, nPhiBins, phiBins, nNclBins, nclBins);
175 hNclVsPhiVsPtBefore->SetDirectory(0);
176 hNclVsPhiVsPtAfter = new TH3F("hNclVsPhiVsPtAfter", "<Ncl> vs Pt and #phi (after #phi cut); p_{T} [GeV/c]; fmod(#phi, #pi/9.0)",
177 nPtBins, ptBins, nPhiBins, phiBins, nNclBins, nclBins);
178 hNclVsPhiVsPtAfter->SetDirectory(0);
181 //_________________________________________________________
182 Bool_t AliHighPtDeDxBase::EventAccepted()
184 if(fUseRunCut && fRun!=fEventRun)
190 //_________________________________________________________
191 Bool_t AliHighPtDeDxBase::TrackAccepted()
193 if(fUseFilterCut && !(fTrackFilter&fFilter))
196 if(fUseEtaCut && (fTrackEta<fEtaLow || fTrackEta>fEtaHigh))
199 if(fUseEtaCutAbs && (TMath::Abs(fTrackEta)<fEtaLow || TMath::Abs(fTrackEta)>fEtaHigh))
204 fTrackPhiCutVariable = fTrackPhi;
205 if(fEventMag<0) // for negatve polarity field
206 fTrackPhiCutVariable = TMath::TwoPi() - fTrackPhiCutVariable;
207 if(fTrackCharge<0) // for negatve charge
208 fTrackPhiCutVariable = TMath::TwoPi()-fTrackPhiCutVariable;
209 if(fTrackPhiCutVariable < 0)
210 cout << "Warning!!!!! phi < 0: " << fTrackPhiCutVariable << endl;
212 fTrackPhiCutVariable += TMath::Pi()/18.0; // to center gap in the middle
213 fTrackPhiCutVariable = fmod(fTrackPhiCutVariable, TMath::Pi()/9.0);
215 hNclVsPhiVsPtBefore->Fill(fTrackPt, fTrackPhiCutVariable, fTrackNcl);
217 if(fTrackPt>2.0 && fTrackPhiCutVariable<fPhiCutHigh->Eval(fTrackPt)
218 && fTrackPhiCutVariable>fPhiCutLow->Eval(fTrackPt))
219 return kFALSE; // reject track
221 hNclVsPhiVsPtAfter->Fill(fTrackPt, fTrackPhiCutVariable, fTrackNcl);
227 //_________________________________________________________
228 void AliHighPtDeDxBase::FillEventInfo()
230 if(fEventTrigger==1) {
231 hVtxStatus->Fill(fEventVtxStatus);
232 if(fEventVtxStatus != 0) {
233 hNevents->Fill(1.0+0.5*fEventVtxStatus);
238 //_________________________________________________________
239 void AliHighPtDeDxBase::FillTrackInfo(Float_t weight)
241 hEta->Fill(fTrackEta, weight);
242 hPhi->Fill(fTrackPhi, weight);
243 hPt->Fill(fTrackPt, weight);
244 hMeanPt->Fill(fTrackPt, fTrackPt);
247 //_________________________________________________________
248 void AliHighPtDeDxBase::Print(Option_t* option) const
250 cout << ClassName() << " : " << GetName() << endl
251 << "Event cuts: " << endl;
253 cout << " Run cut: " << fRun << endl;
255 cout << " Run cut is diabled " << endl;
257 cout << "Track cuts: " << endl;
259 cout << " Filter cut: " << fFilter << endl;
261 cout << " Filter cut is diabled " << endl;
263 cout << " Eta range: " << fEtaLow << " - " << fEtaHigh << endl;
265 cout << " |Eta| range: " << fEtaLow << " - " << fEtaHigh << endl;
267 cout << " Eta cut is diabled " << endl;
269 cout << " Phi cut is ENABLED" << endl;
271 cout << " Phi cut is diabled " << endl;
274 //_________________________________________________________
275 void AliHighPtDeDxBase::SetUseEtaCut(Bool_t value)
280 fUseEtaCutAbs = kFALSE;
283 //_________________________________________________________
284 void AliHighPtDeDxBase::SetUseEtaCutAbs(Bool_t value)
286 fUseEtaCutAbs = value;
292 //_________________________________________________________
293 TF1* AliHighPtDeDxBase::GetStandardPhiCutLow()
295 // TF1* cutLow = new TF1("StandardPhiCutLow", "-0.01/x+pi/18.0-0.015", 0, 50);
296 TF1* cutLow = new TF1("StandardPhiCutLow", "0.1/x/x+pi/18.0-0.025", 0, 50);
300 //_________________________________________________________
301 TF1* AliHighPtDeDxBase::GetStandardPhiCutHigh()
303 // TF1* cutHigh = new TF1("StandardPhiCutHigh", "0.55/x/x+pi/18.0+0.03", 0, 50);
304 TF1* cutHigh = new TF1("StandardPhiCutHigh", "0.12/x+pi/18.0+0.035", 0, 50);
309 //___________________________________________________________________________
310 TCanvas* AliHighPtDeDxBase::DrawPhiCutHistograms()
312 gStyle->SetOptStat(0);
314 TCanvas* cPhiCut = FindCanvas("cPhiCut", 1200, 800);
315 cPhiCut->SetTitle("phi cut histograms");
317 cPhiCut->Divide(3,2);
320 // TH2D* hPhiVsPtBefore = (TH2D*)hNclVsPhiVsPtBefore->Project3D("yx");
321 // hPhiVsPtBefore->SetName("hPhiVsPtBefore");
322 // hPhiVsPtBefore->SetTitle("Phi vs p_{T} (before cuts)");
323 // MakeNice2dHisto(hPhiVsPtBefore, gPad, kTRUE);
324 // hPhiVsPtBefore->Draw("COL");
325 // fPhiCutHigh->SetRange(2.0, 50.0);
326 // fPhiCutHigh->Draw("SAME");
327 // fPhiCutLow->SetRange(2.0, 50.0);
328 // fPhiCutLow->Draw("SAME");
331 TProfile2D* hNclBefore = hNclVsPhiVsPtBefore->Project3DProfile("yx");
332 hNclBefore->SetName("hNclBefore");
333 hNclBefore->SetTitle("<Ncl> (before cuts); p_{T} [GeV/c]; #varphi'");
334 MakeNice2dHisto(hNclBefore, gPad, kTRUE);
335 DrawNice(hNclBefore, 0, 0, 0, "COLZ");
336 fPhiCutHigh->Draw("SAME");
337 fPhiCutLow->Draw("SAME");
341 TH2D* hNclVsPtBefore = (TH2D*)hNclVsPhiVsPtBefore->Project3D("zx");
342 hNclVsPtBefore->SetName("hNclVsPtBefore");
343 hNclVsPtBefore->SetTitle("; p_{T} [GeV/c]; Ncl;");
344 MakeNice2dHisto(hNclVsPtBefore, gPad, kTRUE);
345 hNclVsPtBefore->Draw("COL");
346 TProfile* hNclVsPtBeforeProf = hNclVsPtBefore->ProfileX();
347 hNclVsPtBeforeProf->SetMarkerStyle(29);
348 hNclVsPtBeforeProf->SetMarkerColor(2);
349 hNclVsPtBeforeProf->Draw("SAME");
352 // TH2D* hPhiVsPtAfter = (TH2D*)hNclVsPhiVsPtAfter->Project3D("yx");
353 // MakeNice2dHisto(hNclVsPtAfter, gPad, kTRUE);
354 // hPhiVsPtAfter->SetName("hPhiVsPtAfter");
355 // hPhiVsPtAfter->SetTitle("Phi vs p_{T} (after cuts)");
356 // DrawNice(hPhiVsPtAfter, 0, 0, 0, "COL");
359 TProfile2D* hNclAfter = (TProfile2D*)hNclVsPhiVsPtAfter->Project3DProfile("yx");
360 hNclAfter->SetName("hNclAfter");
361 hNclAfter->SetTitle("<Ncl> (after cuts); p_{T} [GeV/c]; #varphi'");
362 MakeNice2dHisto(hNclAfter, gPad, kTRUE);
363 DrawNice(hNclAfter, 0, 0, 0, "COLZ");
367 TH2D* hNclVsPtAfter = (TH2D*)hNclVsPhiVsPtAfter->Project3D("zx");
368 hNclVsPtAfter->SetName("hNclVsPtAfter");
369 hNclVsPtAfter->SetTitle("; p_{T} [GeV/c]; Ncl;");
370 MakeNice2dHisto(hNclVsPtAfter, gPad, kTRUE);
371 hNclVsPtAfter->Draw("COL");
372 TProfile* hNclVsPtAfterProf = hNclVsPtAfter->ProfileX();
373 hNclVsPtAfterProf->SetMarkerStyle(29);
374 hNclVsPtAfterProf->SetMarkerColor(2);
375 hNclVsPtAfterProf->Draw("SAME");
379 TH1D* hEfficiency = (TH1D*)hNclVsPhiVsPtAfter->Project3D("x");
380 hEfficiency->SetName("hEfficiency");
381 hEfficiency->SetTitle("; p_{T} [GeV/c]; Cut efficiency;");
382 TH1D* hHelp = (TH1D*)hNclVsPhiVsPtBefore->Project3D("x");
383 hEfficiency->Divide(hEfficiency, hHelp, 1, 1, "B");
385 MakeNice1dHisto(hEfficiency, gPad);
386 hEfficiency->SetMarkerStyle(20);
387 hEfficiency->Draw("P");
393 These methods does not fit in very well here, but for now I put them
394 here. Maybe they should go in some tool class.
397 //_______________________________________________________________________
398 void AliHighPtDeDxBase::MakeNice1dHisto(TH1* hist, TVirtualPad* c1)
402 c1->SetLeftMargin(0.12);
403 c1->SetRightMargin(0.02);
404 c1->SetBottomMargin(0.12);
405 c1->SetTopMargin(0.06);
408 gStyle->SetTitleH(0.08);
409 gStyle->SetTitleW(0.46);
410 gStyle->SetTitleX(0.29);
411 gStyle->SetTitleY(0.99);
412 hist->GetXaxis()->SetTitleSize(0.07);
413 hist->GetYaxis()->SetTitleSize(0.07);
414 hist->GetXaxis()->SetTitleOffset(0.7);
415 hist->GetYaxis()->SetTitleOffset(0.8);
418 //_______________________________________________________________________
419 void AliHighPtDeDxBase::MakeNice2dHisto(TH2* hist, TVirtualPad* c1, Bool_t colz)
421 gStyle->SetTitleH(0.08);
422 gStyle->SetTitleW(0.76);
423 gStyle->SetTitleX(0.14);
424 gStyle->SetTitleY(0.98);
426 gStyle->SetTitleW(0.68);
428 hist->GetXaxis()->SetTitleSize(0.07);
429 hist->GetYaxis()->SetTitleSize(0.07);
430 hist->GetXaxis()->SetTitleOffset(0.7);
431 hist->GetYaxis()->SetTitleOffset(0.8);
434 c1->SetLeftMargin(0.12);
436 c1->SetRightMargin(0.02);
438 c1->SetRightMargin(0.12);
439 c1->SetBottomMargin(0.12);
440 c1->SetTopMargin(0.06);
444 //______________________________________________________________________
445 TCanvas* AliHighPtDeDxBase::FindCanvas(const Char_t* canvasName,
446 Int_t xwidth, Int_t ywidth)
449 TCanvas *c1 = (TCanvas*)gROOT->GetListOfCanvases()->FindObject(canvasName);
451 c1 = new TCanvas(canvasName, canvasName, xwidth, ywidth);
453 c1->SetWindowSize(xwidth, ywidth);
458 //_______________________________________________________________________
459 TCanvas* AliHighPtDeDxBase::DrawNice(TH1* hist, const Char_t* canvasName,
460 Int_t xwidth, Int_t ywidth, const Char_t* option)
465 canv = FindCanvas(canvasName, xwidth, ywidth);
469 Bool_t is2dHist = hist->InheritsFrom("TH2");
476 if (opt.Contains("COL"))
477 MakeNice2dHisto((TH2*)hist, canv, kTRUE);
479 MakeNice2dHisto((TH2*)hist, canv);
482 MakeNice1dHisto(hist, canv);