AliRoot Core  3dc7879 (3dc7879)
AliESDv0Cuts.cxx
Go to the documentation of this file.
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 /* $Id: AliESDv0Cuts.cxx 24534 2008-03-16 22:22:11Z fca $ */
17 
18 #include "AliESDv0Cuts.h"
19 
20 #include <AliESDVertex.h>
21 #include <AliESDtrack.h>
22 #include <AliESDv0.h>
23 #include <AliESD.h>
24 #include <AliESDEvent.h>
25 #include <AliLog.h>
26 
27 #include <TTree.h>
28 #include <TCanvas.h>
29 #include <TDirectory.h>
30 
31 ClassImp(AliESDv0Cuts)
32 
33 // Cut names
34 const Char_t* AliESDv0Cuts::fgkCutNames[kNCuts] = {
35  "dca positive to pvtx",
36  "dca negative to pvtx",
37  "#Chi^{2}",
38  "dca v0 daughters",
39  "min decay radius",
40  "max decay radius",
41  "cosine pointing angle",
42  "on-the-fly status",
43  "dca v0 to pvtx",
44  "p",
45  "p_{T}",
46  "p_{x}",
47  "p_{y}",
48  "p_{z}"
49 };
50 
51 //____________________________________________________________________
52 AliESDv0Cuts::AliESDv0Cuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
53  fCutMinDcaPosToVertex(0),
54  fCutMinDcaNegToVertex(0),
55  fCutMaxChi2(40),
56  fCutMaxDcaV0Daughters(0),
57  fCutMinRadius(0),
58  fCutMaxRadius(0),
59  fCutMinCosinePointingAngle(0),
60  fCutRequireOnFlyStatus(0),
61  fCutMaxDcaV0ToVertex(0),
62  fPMin(0),
63  fPMax(0),
64  fPtMin(0),
65  fPtMax(0),
66  fPxMin(0),
67  fPxMax(0),
68  fPyMin(0),
69  fPyMax(0),
70  fPzMin(0),
71  fPzMax(0),
72  fHistogramsOn(0),
73  fhCutStatistics(0),
74  fhCutCorrelation(0)
75 {
77 
78  Init();
79 
80  //##############################################################################
81  // setting default cuts
84  SetMaxChi2();
86  SetMinRadius();
87  SetMaxRadius();
91  SetPRange();
92  SetPtRange();
93  SetPxRange();
94  SetPyRange();
95  SetPzRange();
96 
98 }
99 
100 //_____________________________________________________________________________
104  fCutMaxChi2(0),
106  fCutMinRadius(0),
107  fCutMaxRadius(0),
111  fPMin(0),
112  fPMax(0),
113  fPtMin(0),
114  fPtMax(0),
115  fPxMin(0),
116  fPxMax(0),
117  fPyMin(0),
118  fPyMax(0),
119  fPzMin(0),
120  fPzMax(0),
121  fHistogramsOn(0),
122  fhCutStatistics(0),
124 {
126 
127  ((AliESDv0Cuts &) c).Copy(*this);
128 }
129 
131 {
133 
134  for (Int_t i=0; i<2; i++) {
135 
136  if (fhDcaPosToVertex[i])
137  delete fhDcaPosToVertex[i];
138  if (fhDcaNegToVertex[i])
139  delete fhDcaNegToVertex[i];
140  if (fhChi2[i])
141  delete fhChi2[i];
142  if (fhDcaV0Daughters[i])
143  delete fhDcaV0Daughters[i];
144  if (fhRadius[i])
145  delete fhRadius[i];
146  if (fhCosinePointingAngle[i])
147  delete fhCosinePointingAngle[i];
148  if (fhOnFlyStatus[i])
149  delete fhOnFlyStatus[i];
150  if (fhDcaV0ToVertex[i])
151  delete fhDcaV0ToVertex[i];
152  if (fhPt[i])
153  delete fhPt[i];
154  }
155 
156  if (fhCutStatistics)
157  delete fhCutStatistics;
158  if (fhCutCorrelation)
159  delete fhCutCorrelation;
160 }
161 
163 {
165 
168  fCutMaxChi2 = 0;
170  fCutMinRadius = 0;
171  fCutMaxRadius = 0;
175 
176  fPMin = 0;
177  fPMax = 0;
178  fPtMin = 0;
179  fPtMax = 0;
180  fPxMin = 0;
181  fPxMax = 0;
182  fPyMin = 0;
183  fPyMax = 0;
184  fPzMin = 0;
185  fPzMax = 0;
186 
187  fHistogramsOn = kFALSE;
188 
189  for (Int_t i=0; i<2; ++i)
190  {
191  fhDcaPosToVertex[i] = 0;
192  fhDcaNegToVertex[i] = 0;
193  fhChi2[i] = 0;
194  fhDcaV0Daughters[i] = 0;
195  fhRadius[i] = 0;
196  fhCosinePointingAngle[i] = 0;
197  fhOnFlyStatus[i] = 0;
198  fhDcaV0ToVertex[i] = 0;
199 
200  fhPt[i] = 0;
201  }
202  fhCutStatistics = 0;
203  fhCutCorrelation = 0;
204 }
205 
206 //_____________________________________________________________________________
208 {
210 
211  if (this != &c) ((AliESDv0Cuts &) c).Copy(*this);
212  return *this;
213 }
214 
215 //_____________________________________________________________________________
216 void AliESDv0Cuts::Copy(TObject &c) const
217 {
219 
220  AliESDv0Cuts& target = (AliESDv0Cuts &) c;
221 
222  target.Init();
223 
226  target.fCutMaxChi2 = fCutMaxChi2;
228  target.fCutMinRadius = fCutMinRadius;
229  target.fCutMaxRadius = fCutMaxRadius;
233 
234  target.fPMin = fPMin;
235  target.fPMax = fPMax;
236  target.fPtMin = fPtMin;
237  target.fPtMax = fPtMax;
238  target.fPxMin = fPxMin;
239  target.fPxMax = fPxMax;
240  target.fPyMin = fPyMin;
241  target.fPyMax = fPyMax;
242  target.fPzMin = fPzMin;
243  target.fPzMax = fPzMax;
244 
245  target.fHistogramsOn = fHistogramsOn;
246 
247  for (Int_t i=0; i<2; ++i)
248  {
249  if (fhDcaPosToVertex[i]) target.fhDcaPosToVertex[i] = (TH1F*) fhDcaPosToVertex[i]->Clone();
250  if (fhDcaNegToVertex[i]) target.fhDcaNegToVertex[i] = (TH1F*) fhDcaNegToVertex[i]->Clone();
251  if (fhChi2[i]) target.fhChi2[i] = (TH1F*) fhChi2[i]->Clone();
252  if (fhDcaV0Daughters[i]) target.fhDcaV0Daughters[i] = (TH1F*) fhDcaV0Daughters[i]->Clone();
253  if (fhRadius[i]) target.fhRadius[i] = (TH1F*) fhRadius[i]->Clone();
254  if (fhCosinePointingAngle[i]) target.fhCosinePointingAngle[i] = (TH1F*) fhCosinePointingAngle[i]->Clone();
255  if (fhOnFlyStatus[i]) target.fhOnFlyStatus[i] = (TH1F*) fhOnFlyStatus[i]->Clone();
256  if (fhDcaV0ToVertex[i]) target.fhDcaV0ToVertex[i] = (TH1F*) fhDcaV0ToVertex[i]->Clone();
257 
258  if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
259  }
260  if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
261  if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
262 
263  TNamed::Copy(c);
264 }
265 
266 //_____________________________________________________________________________
267 Long64_t AliESDv0Cuts::Merge(TCollection* list) {
270 
271  if (!list)
272  return 0;
273 
274  if (list->IsEmpty())
275  return 1;
276 
277  if (!fHistogramsOn)
278  return 0;
279 
280  TIterator* iter = list->MakeIterator();
281  TObject* obj;
282 
283 
284  // collection of measured and generated histograms
285  Int_t count = 0;
286  while ((obj = iter->Next())) {
287 
288  AliESDv0Cuts* entry = dynamic_cast<AliESDv0Cuts*>(obj);
289  if (entry == 0)
290  continue;
291 
292  if (!entry->fHistogramsOn)
293  continue;
294 
295  for (Int_t i=0; i<2; i++) {
296 
297  fhDcaPosToVertex[i] ->Add(entry->fhDcaPosToVertex[i] );
298  fhDcaNegToVertex[i] ->Add(entry->fhDcaNegToVertex[i] );
299  fhChi2[i] ->Add(entry->fhChi2[i] );
300  fhDcaV0Daughters[i] ->Add(entry->fhDcaV0Daughters[i] );
301  fhRadius[i] ->Add(entry->fhRadius[i] );
302  fhCosinePointingAngle[i]->Add(entry->fhCosinePointingAngle[i]);
303  fhOnFlyStatus[i] ->Add(entry->fhOnFlyStatus[i] );
304  fhDcaV0ToVertex[i] ->Add(entry->fhDcaV0ToVertex[i] );
305 
306  fhPt[i] ->Add(entry->fhPt[i]);
307  }
308  fhCutStatistics ->Add(entry->fhCutStatistics);
309  fhCutCorrelation ->Add(entry->fhCutCorrelation);
310 
311  count++;
312  }
313 
314  return count+1;
315 }
316 
318 {
320 
321  tree->SetBranchStatus("fV0s.fDcaV0Daughters", 1);
322  tree->SetBranchStatus("fV0s.fChi2V0", 1);
323  tree->SetBranchStatus("fV0s.fPos*", 1);
324  tree->SetBranchStatus("fV0s.fNmom*", 1);
325  tree->SetBranchStatus("fV0s.fPmom*", 1);
326  tree->SetBranchStatus("fV0s.fRr", 1);
327  tree->SetBranchStatus("fV0s.fPointAngle*", 1);
328  tree->SetBranchStatus("fV0s.fOnFlyStatus", 1);
329 }
330 
331 //____________________________________________________________________
332 Bool_t
333 AliESDv0Cuts::IsSelected(TList* listObj) {
335 
336  if(listObj->GetSize()!=4) return kFALSE;
337  AliESDv0 *esdV0 = (AliESDv0*)listObj->At(0);
338  AliESDtrack *trackPos = (AliESDtrack*)listObj->At(1);
339  AliESDtrack *trackNeg = (AliESDtrack*)listObj->At(2);
340  const AliESDVertex *esdVertex = (AliESDVertex*)listObj->At(3);
341  return AcceptV0(esdV0,trackPos,trackNeg,esdVertex);
342 }
343 
344 //____________________________________________________________________
345 Bool_t
346 AliESDv0Cuts::AcceptV0(AliESDv0* const esdV0, AliESDtrack* const trackPos, AliESDtrack* const trackNeg, const AliESDVertex* esdVertex) {
352 
353  // this function needs the following branches... but this is not enough
354  // fV0s.fDcaV0Daughters
355  // fV0s.fChi2V0
356  // fV0s.fPos*
357  // fV0s.fNmom*
358  // fV0s.fPmom*
359  // fV0s.fRr
360  // fV0s.fPointAngle
361  // fV0s.fOnFlyStatus
362 
363  Float_t dcaPosToVertex = 0, dcaNegToVertex = 0;
364  Float_t tdcaPosToVertex[2]={999,999};
365  Float_t tdcaNegToVertex[2]={999,999};
366 
367  if (trackPos) trackPos->GetImpactParameters(tdcaPosToVertex[0],tdcaPosToVertex[1]);
368  if (trackNeg) trackNeg->GetImpactParameters(tdcaNegToVertex[0],tdcaNegToVertex[1]);
369 
370  dcaPosToVertex = TMath::Sqrt(tdcaPosToVertex[0]*tdcaPosToVertex[0]+tdcaPosToVertex[1]*tdcaPosToVertex[1]);
371  dcaNegToVertex = TMath::Sqrt(tdcaNegToVertex[0]*tdcaNegToVertex[0]+tdcaNegToVertex[1]*tdcaNegToVertex[1]);
372 
373  UInt_t status = esdV0->GetOnFlyStatus();
374  Float_t chi2 = esdV0->GetChi2V0();
375 
376  Double_t dcaV0Daughters = esdV0->GetDcaV0Daughters();
377 
378  Double_t vtxPosition[3]; esdVertex->GetXYZ(vtxPosition);
379  Double_t dcaV0ToVertex = esdV0->GetD(vtxPosition[0],vtxPosition[1],vtxPosition[2]);
380 
381  Double_t v0Position[3];
382  esdV0->GetXYZ(v0Position[0],v0Position[1],v0Position[2]);
383  Double_t radius = TMath::Sqrt(TMath::Power(v0Position[0],2) + TMath::Power(v0Position[1],2));
384  Double_t v0CosinePointingAngle = esdV0->GetV0CosineOfPointingAngle();
385 
386  // getting the kinematic variables of the v0
387  Double_t p[3];
388  esdV0->GetPxPyPz(p[0],p[1],p[2]);
389  Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
390  Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
391 
392  //########################################################################
393  // cut the v0?
394 
395  Bool_t cuts[kNCuts];
396  for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
397 
398  // v0 quality cuts
399  if (dcaPosToVertex < fCutMinDcaPosToVertex)
400  cuts[0]=kTRUE;
401  if (dcaNegToVertex < fCutMinDcaNegToVertex)
402  cuts[1]=kTRUE;
403  if (chi2 > fCutMaxChi2)
404  cuts[2]=kTRUE;
405  if (dcaV0Daughters > fCutMaxDcaV0Daughters)
406  cuts[3]=kTRUE;
407  if (radius < fCutMinRadius)
408  cuts[4]=kTRUE;
409  if (radius > fCutMaxRadius)
410  cuts[5]=kTRUE;
411  if (v0CosinePointingAngle < fCutMinCosinePointingAngle)
412  cuts[6]=kTRUE;
413  if (fCutRequireOnFlyStatus && !status)
414  cuts[7]=kTRUE;
415  if (dcaV0ToVertex > fCutMaxDcaV0ToVertex)
416  cuts[8] = kTRUE;
417 
418  // v0 kinematics cut
419  if((momentum < fPMin) || (momentum > fPMax))
420  cuts[9]=kTRUE;
421  if((pt < fPtMin) || (pt > fPtMax))
422  cuts[10] = kTRUE;
423  if((p[0] < fPxMin) || (p[0] > fPxMax))
424  cuts[11] = kTRUE;
425  if((p[1] < fPyMin) || (p[1] > fPyMax))
426  cuts[12] = kTRUE;
427  if((p[2] < fPzMin) || (p[2] > fPzMax))
428  cuts[13] = kTRUE;
429 
430  Bool_t cut=kFALSE;
431  for (Int_t i=0; i<kNCuts; i++)
432  if (cuts[i]) cut = kTRUE;
433 
434  //########################################################################
435  // filling histograms
436  if (fHistogramsOn) {
437  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n v0s")));
438 
439  if (cut)
440  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut v0s")));
441 
442  for (Int_t i=0; i<kNCuts; i++) {
443  if (cuts[i])
444  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
445 
446  for (Int_t j=i; j<kNCuts; j++) {
447  if (cuts[i] && cuts[j]) {
448  Float_t x = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
449  Float_t y = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
450  fhCutCorrelation->Fill(x,y);
451  }
452  }
453  }
454 
455  fhDcaPosToVertex[0]->Fill(dcaPosToVertex);
456  fhDcaNegToVertex[0]->Fill(dcaNegToVertex);
457  fhChi2[0]->Fill(chi2);
458  fhDcaV0Daughters[0]->Fill(dcaV0Daughters);
459  fhRadius[0]->Fill(radius);
460  fhCosinePointingAngle[0]->Fill(v0CosinePointingAngle);
461  fhOnFlyStatus[0]->Fill(status);
462  fhDcaV0ToVertex[0]->Fill(dcaV0ToVertex);
463 
464  fhPt[0]->Fill(pt);
465  }
466 
467  //########################################################################
468  // cut the v0!
469  if (cut) return kFALSE;
470 
471  //########################################################################
472  // filling histograms after cut
473  if (fHistogramsOn) {
474  fhDcaPosToVertex[1]->Fill(dcaPosToVertex);
475  fhDcaNegToVertex[1]->Fill(dcaNegToVertex);
476  fhChi2[1]->Fill(chi2);
477  fhDcaV0Daughters[1]->Fill(dcaV0Daughters);
478  fhRadius[1]->Fill(radius);
479  fhCosinePointingAngle[1]->Fill(v0CosinePointingAngle);
480  fhOnFlyStatus[1]->Fill(status);
481  fhDcaV0ToVertex[1]->Fill(dcaV0ToVertex);
482 
483  fhPt[1]->Fill(pt);
484  }
485 
486  return kTRUE;
487 }
488 
489 //____________________________________________________________________
491 {
493 
494  TObjArray* acceptedV0s = new TObjArray();
495  // const AliESDVertex *spdVertex = esd->GetVertex();
496  const AliESDVertex *primaryVertex = esd->GetPrimaryVertex();
497  Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
498 
499  // loop over esd v0s
500  for (Int_t iV0 = 0; iV0 < esd->GetNumberOfV0s(); iV0++) {
501  AliESDv0* v0 = esd->GetV0(iV0);
502 
503  lIndexTrackPos = TMath::Abs(v0->GetPindex());
504  lIndexTrackNeg = TMath::Abs(v0->GetNindex());
505  AliESDtrack *trackPos = esd->GetTrack(lIndexTrackPos);
506  AliESDtrack *trackNeg = esd->GetTrack(lIndexTrackNeg);
507 
508  if (AcceptV0(v0,trackPos,trackNeg,primaryVertex))
509  acceptedV0s->Add(v0);
510  }
511 
512  return acceptedV0s;
513 }
514 
515 //____________________________________________________________________
517 {
519 
520  Int_t count = 0;
521  // const AliESDVertex *spdVertex = esd->GetVertex();
522  const AliESDVertex *primaryVertex = esd->GetPrimaryVertex();
523  Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
524 
525  // loop over esd v0s
526  for (Int_t iV0 = 0; iV0 < esd->GetNumberOfV0s(); iV0++) {
527  AliESDv0* v0 = esd->GetV0(iV0);
528 
529  lIndexTrackPos = TMath::Abs(v0->GetPindex());
530  lIndexTrackNeg = TMath::Abs(v0->GetNindex());
531  AliESDtrack *trackPos = esd->GetTrack(lIndexTrackPos);
532  AliESDtrack *trackNeg = esd->GetTrack(lIndexTrackNeg);
533 
534  if (AcceptV0(v0,trackPos,trackNeg,primaryVertex))
535  count++;
536  }
537 
538  return count;
539 }
540 
541 //____________________________________________________________________
543 {
544  //
545  // returns an array of all v0s that pass the cuts
546  //
547 
548  TObjArray* acceptedV0s = new TObjArray();
549  // const AliESDVertex *spdVertex = esd->GetVertex();
550  const AliESDVertex *primaryVertex = esd->GetPrimaryVertex();
551  Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
552 
553  // loop over esd v0s
554  for (Int_t iV0 = 0; iV0 < esd->GetNumberOfV0s(); iV0++) {
555  AliESDv0* v0 = esd->GetV0(iV0);
556 
557  lIndexTrackPos = TMath::Abs(v0->GetPindex());
558  lIndexTrackNeg = TMath::Abs(v0->GetNindex());
559  AliESDtrack *trackPos = esd->GetTrack(lIndexTrackPos);
560  AliESDtrack *trackNeg = esd->GetTrack(lIndexTrackNeg);
561 
562  if (AcceptV0(v0,trackPos,trackNeg,primaryVertex))
563  acceptedV0s->Add(v0);
564  }
565 
566  return acceptedV0s;
567 }
568 
569 //____________________________________________________________________
571 {
573 
574  Int_t count = 0;
575  // const AliESDVertex *spdVertex = esd->GetVertex();
576  const AliESDVertex *primaryVertex = esd->GetPrimaryVertex();
577  Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
578 
579  // loop over esd v0s
580  for (Int_t iV0 = 0; iV0 < esd->GetNumberOfV0s(); iV0++) {
581  AliESDv0* v0 = esd->GetV0(iV0);
582 
583  lIndexTrackPos = TMath::Abs(v0->GetPindex());
584  lIndexTrackNeg = TMath::Abs(v0->GetNindex());
585  AliESDtrack *trackPos = esd->GetTrack(lIndexTrackPos);
586  AliESDtrack *trackNeg = esd->GetTrack(lIndexTrackNeg);
587 
588  if (AcceptV0(v0,trackPos,trackNeg,primaryVertex))
589  count++;
590  }
591 
592  return count;
593 }
594 
595 //____________________________________________________________________
596  void AliESDv0Cuts::DefineHistograms(Int_t color) {
598 
599  fHistogramsOn=kTRUE;
600 
601  Bool_t oldStatus = TH1::AddDirectoryStatus();
602  TH1::AddDirectory(kFALSE);
603 
604  //###################################################################################
605  // defining histograms
606 
607  fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
608 
609  fhCutStatistics->GetXaxis()->SetBinLabel(1,"n v0s");
610  fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut v0s");
611 
612  fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
613 
614  for (Int_t i=0; i<kNCuts; i++) {
615  fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
616  fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
617  fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
618  }
619 
620  fhCutStatistics ->SetLineColor(color);
621  fhCutCorrelation ->SetLineColor(color);
622  fhCutStatistics ->SetLineWidth(2);
623  fhCutCorrelation ->SetLineWidth(2);
624 
625  Char_t str[256];
626  for (Int_t i=0; i<2; i++) {
627  if (i==0) snprintf(str,256, " ");
628  else snprintf(str,256, "_cut");
629 
630  fhDcaPosToVertex[i] = new TH1F(Form("dcaPosToVertex%s",str),"",120,0,3);
631  fhDcaNegToVertex[i] = new TH1F(Form("dcaNegToVertex%s",str),"",120,0,3);
632  fhChi2[i] = new TH1F(Form("chi2%s",str),"",50,0,50);
633  fhDcaV0Daughters[i] = new TH1F(Form("dcaV0Daughters%s",str),"",200,0,5);
634  fhRadius[i] = new TH1F(Form("decayRadius%s",str),"",300,0,150);
635  fhCosinePointingAngle[i] = new TH1F(Form("cosinePointingAngle%s",str),"",100,-1,1);
636  fhOnFlyStatus[i] = new TH1F(Form("onflystatus%s",str),"",5,0,5);
637  fhDcaV0ToVertex[i] = new TH1F(Form("dcaV0ToVertex%s",str),"",100,0,5);
638 
639  fhPt[i] = new TH1F(Form("pt%s",str) ,"p_{T} distribution;p_{T} (GeV/c)",500,0.0,100.0);
640 
641  fhDcaPosToVertex[i]->SetTitle("Dca of positive daughter to parent vertex");
642  fhDcaNegToVertex[i]->SetTitle("Dca of negative daughter to parent vertex");
643  fhChi2[i]->SetTitle("#Chi^{2} for v0");
644  fhDcaV0Daughters[i]->SetTitle("Dca between daughter tracks");
645  fhRadius[i]->SetTitle("Decay radius of the v0");
646  fhCosinePointingAngle[i]->SetTitle("Cosine of the Pointing Angle");
647  fhOnFlyStatus[i]->SetTitle("On-the-Fly Status");
648  fhDcaV0ToVertex[i]->SetTitle("Dca of v0 to parent vertex");
649 
650  fhDcaPosToVertex[i]->SetLineColor(color); fhDcaPosToVertex[i]->SetLineWidth(2);
651  fhDcaNegToVertex[i]->SetLineColor(color); fhDcaNegToVertex[i]->SetLineWidth(2);
652  fhChi2[i]->SetLineColor(color); fhChi2[i]->SetLineWidth(2);
653  fhDcaV0Daughters[i]->SetLineColor(color); fhDcaV0Daughters[i]->SetLineWidth(2);
654  fhRadius[i]->SetLineColor(color); fhRadius[i]->SetLineWidth(2);
655  fhCosinePointingAngle[i]->SetLineColor(color); fhCosinePointingAngle[i]->SetLineWidth(2);
656  fhOnFlyStatus[i]->SetLineColor(color); fhOnFlyStatus[i]->SetLineWidth(2);
657  fhDcaV0ToVertex[i]->SetLineColor(color); fhDcaV0ToVertex[i]->SetLineWidth(2);
658  }
659 
660  TH1::AddDirectory(oldStatus);
661 }
662 
663 //____________________________________________________________________
664 Bool_t AliESDv0Cuts::LoadHistograms(const Char_t* dir)
665 {
668 
669  if (!dir)
670  dir = GetName();
671 
672  if (!gDirectory->cd(dir))
673  return kFALSE;
674 
675  fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
676  fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
677 
678  Char_t str[5];
679  for (Int_t i=0; i<2; i++) {
680  if (i==0)
681  {
682  gDirectory->cd("before_cuts");
683  str[0] = 0;
684  }
685  else
686  {
687  gDirectory->cd("after_cuts");
688  snprintf(str,5, "_cut");
689  }
690 
691  fhDcaPosToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("dcaPosToVertex%s",str) ));
692  fhDcaNegToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("dcaNegToVertex%s",str) ));
693  fhChi2[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("chi2%s",str)));
694  fhDcaV0Daughters[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("dcaV0Daughters%s",str)));
695  fhRadius[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("decayRadius%s",str)));
696  fhCosinePointingAngle[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("cosinepointingangle%s",str)));
697  fhOnFlyStatus[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("onflystatus%s",str)));
698  fhDcaV0ToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("dcaV0ToVertex%s",str)));
699 
700  fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get(Form("pt%s",str)));
701 
702  gDirectory->cd("../");
703  }
704 
705  gDirectory->cd("..");
706 
707  return kTRUE;
708 }
709 
710 //____________________________________________________________________
711 void AliESDv0Cuts::SaveHistograms(const Char_t* dir) {
713 
714  if (!fHistogramsOn) {
715  AliDebug(0, "Histograms not on - cannot save histograms!!!");
716  return;
717  }
718 
719  if (!dir)
720  dir = GetName();
721 
722  gDirectory->mkdir(dir);
723  gDirectory->cd(dir);
724 
725  gDirectory->mkdir("before_cuts");
726  gDirectory->mkdir("after_cuts");
727 
728  fhCutStatistics->Write();
729  fhCutCorrelation->Write();
730 
731  for (Int_t i=0; i<2; i++) {
732  if (i==0)
733  gDirectory->cd("before_cuts");
734  else
735  gDirectory->cd("after_cuts");
736 
737  fhDcaPosToVertex[i] ->Write();
738  fhDcaNegToVertex[i] ->Write();
739  fhChi2[i] ->Write();
740  fhDcaV0Daughters[i] ->Write();
741  fhRadius[i] ->Write();
742  fhCosinePointingAngle[i] ->Write();
743  fhOnFlyStatus[i] ->Write();
744  fhDcaV0ToVertex[i] ->Write();
745 
746  fhPt[i] ->Write();
747 
748  gDirectory->cd("../");
749  }
750 
751  gDirectory->cd("../");
752 }
753 
754 //____________________________________________________________________
756 {
758 
759  TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "V0 Quality Results1", 800, 800);
760  canvas1->Divide(2, 2);
761 
762  canvas1->cd(1);
763  fhDcaPosToVertex[0]->SetStats(kFALSE);
764  fhDcaPosToVertex[0]->Draw();
765 
766  canvas1->cd(2);
767  fhChi2[0]->SetStats(kFALSE);
768  fhChi2[0]->Draw();
769 
770  canvas1->cd(3);
771  fhDcaV0ToVertex[0]->SetStats(kFALSE);
772  fhDcaV0ToVertex[0]->Draw();
773 
774  canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
775 
776  TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "V0 Quality Results2", 1200, 800);
777  canvas2->Divide(3, 2);
778 
779  canvas2->cd(1);
780  fhDcaV0Daughters[0]->SetStats(kFALSE);
781  gPad->SetLogy();
782  fhDcaV0Daughters[0]->Draw();
783 
784  canvas2->cd(2);
785  fhRadius[0]->SetStats(kFALSE);
786  gPad->SetLogy();
787  fhRadius[0]->Draw();
788 
789 
790  canvas2->cd(4);
791  fhCosinePointingAngle[0]->SetStats(kFALSE);
792  gPad->SetLogy();
793  fhCosinePointingAngle[0]->Draw();
794 
795  canvas2->cd(5);
796  fhOnFlyStatus[0]->SetStats(kFALSE);
797  gPad->SetLogy();
798  fhOnFlyStatus[0]->Draw();
799 
800  canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
801 
802  TCanvas* canvas3 = new TCanvas(Form("%s_4", GetName()), "V0 Quality Results3", 800, 500);
803  canvas3->Divide(2, 1);
804 
805  canvas3->cd(1);
806  fhCutStatistics->SetStats(kFALSE);
807  fhCutStatistics->LabelsOption("v");
808  gPad->SetBottomMargin(0.3);
809  fhCutStatistics->Draw();
810 
811  canvas3->cd(2);
812  fhCutCorrelation->SetStats(kFALSE);
813  fhCutCorrelation->LabelsOption("v");
814  gPad->SetBottomMargin(0.3);
815  gPad->SetLeftMargin(0.3);
816  fhCutCorrelation->Draw("COLZ");
817 
818  canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
819 }
820 
AliESDtrack * GetTrack(Int_t i) const
Definition: AliESD.h:62
static void EnableNeededBranches(TTree *tree)
Int_t GetNumberOfV0s() const
Definition: AliESDEvent.h:552
void DefineHistograms(Int_t color=1)
Int_t GetPindex() const
Definition: AliESDv0.h:86
TH1F * fhOnFlyStatus[2]
Definition: AliESDv0Cuts.h:114
void SetPRange(Float_t r1=0, Float_t r2=1e10)
Definition: AliESDv0Cuts.h:53
TH1F * fhDcaNegToVertex[2]
Definition: AliESDv0Cuts.h:104
void SetPtRange(Float_t r1=0, Float_t r2=1e10)
Definition: AliESDv0Cuts.h:54
Bool_t fCutRequireOnFlyStatus
require on fly status
Definition: AliESDv0Cuts.h:87
#define TObjArray
virtual void GetXYZ(Double_t position[3]) const
Definition: AliVertex.cxx:119
const AliESDVertex * GetPrimaryVertex() const
Definition: AliESD.h:153
void SetPxRange(Float_t r1=-1e10, Float_t r2=1e10)
Definition: AliESDv0Cuts.h:55
Bool_t GetOnFlyStatus() const
Definition: AliESDv0.h:93
TObjArray * GetAcceptedV0s(const AliESD *esd)
void SetRequireOnFlyStatus(Bool_t b=kFALSE)
Definition: AliESDv0Cuts.h:49
virtual Long64_t Merge(TCollection *list)
void SetMaxDcaV0Daughters(Float_t max=1e10)
Definition: AliESDv0Cuts.h:45
TH1F * fhChi2[2]
Definition: AliESDv0Cuts.h:106
Float_t p[]
Definition: kNNTest.C:133
Float_t fCutMinRadius
min reconstruction radius (fiducial volume)
Definition: AliESDv0Cuts.h:84
void SaveHistograms(const Char_t *dir=0)
Float_t fPyMin
Definition: AliESDv0Cuts.h:94
void GetXYZ(Double_t &x, Double_t &y, Double_t &z) const
Definition: AliESDv0.cxx:541
Float_t fCutMinCosinePointingAngle
min cosine of pointing angle
Definition: AliESDv0Cuts.h:86
TH1F * fhDcaV0Daughters[2]
Definition: AliESDv0Cuts.h:108
Float_t fPxMax
definition of the range of the Px
Definition: AliESDv0Cuts.h:93
Bool_t fHistogramsOn
histograms on/off
Definition: AliESDv0Cuts.h:99
Float_t fCutMaxDcaV0Daughters
max dca between the two v0 daughters
Definition: AliESDv0Cuts.h:83
TH1F * fhPt[2]
pt of esd v0s
Definition: AliESDv0Cuts.h:119
Float_t fPMax
definition of the range of the P
Definition: AliESDv0Cuts.h:91
Bool_t AcceptV0(AliESDv0 *const esdV0, AliESDtrack *const trackPos, AliESDtrack *const trackNeg, const AliESDVertex *esdVertex)
void SetMaxRadius(Float_t max=1e10)
Definition: AliESDv0Cuts.h:47
Float_t GetV0CosineOfPointingAngle(Double_t refPointX, Double_t refPointY, Double_t refPointZ) const
Definition: AliESDv0.cxx:579
AliESDv0 * GetV0(Int_t i) const
Definition: AliESDEvent.h:478
virtual ~AliESDv0Cuts()
TTree * tree
Double_t chi2
Definition: AnalyzeLaser.C:7
TH2F * fhCutCorrelation
2d statistics plot
Definition: AliESDv0Cuts.h:124
void SetMinRadius(Float_t min=-1)
Definition: AliESDv0Cuts.h:46
Float_t fPxMin
Definition: AliESDv0Cuts.h:93
Float_t fCutMaxRadius
max reconstruction radius (fiducial volume)
Definition: AliESDv0Cuts.h:85
AliESDv0Cuts(const Char_t *name="AliESDv0Cuts", const Char_t *title="")
TH1F * fhRadius[2]
Definition: AliESDv0Cuts.h:110
TH1F * fhCosinePointingAngle[2]
Definition: AliESDv0Cuts.h:112
Base class for analysis cuts.
Float_t fPzMin
Definition: AliESDv0Cuts.h:95
void SetPzRange(Float_t r1=-1e10, Float_t r2=1e10)
Definition: AliESDv0Cuts.h:57
Float_t fPzMax
definition of the range of the Pz
Definition: AliESDv0Cuts.h:95
void SetMinDcaNegToVertex(Float_t min=-1)
Definition: AliESDv0Cuts.h:43
void SetMinCosinePointingAngle(Float_t min=-1)
Definition: AliESDv0Cuts.h:48
Int_t GetNindex() const
Definition: AliESDv0.h:85
void SetMinDcaPosToVertex(Float_t min=-1)
Definition: AliESDv0Cuts.h:42
virtual Bool_t LoadHistograms(const Char_t *dir=0)
AliTPCcalibV0 v0
void GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const
Definition: AliESDv0.cxx:532
virtual void Copy(TObject &c) const
void DrawHistograms()
void SetMaxDcaV0ToVertex(Float_t max=1e10)
Definition: AliESDv0Cuts.h:50
void SetPyRange(Float_t r1=-1e10, Float_t r2=1e10)
Definition: AliESDv0Cuts.h:56
Int_t GetNumberOfV0s() const
Definition: AliESD.h:181
#define AliDebug(logLevel, message)
Definition: AliLog.h:300
void SetHistogramsOn(Bool_t b=kFALSE)
Definition: AliESDv0Cuts.h:60
AliESDv0 * GetV0(Int_t i) const
Definition: AliESD.h:105
Float_t fCutMinDcaPosToVertex
min dca of the positive daughter to the primary vertex
Definition: AliESDv0Cuts.h:80
virtual void GetImpactParameters(Float_t &xy, Float_t &z) const
Definition: AliESDtrack.h:448
const AliESDVertex * GetPrimaryVertex() const
Float_t fCutMinDcaNegToVertex
min dca of the negative daughter to the primary vertex
Definition: AliESDv0Cuts.h:81
Class for handling of ESD v0 cuts.
Definition: AliESDv0Cuts.h:19
AliESDtrack * GetTrack(Int_t i) const
Definition: AliESDEvent.h:405
Float_t fCutMaxChi2
max chi2
Definition: AliESDv0Cuts.h:82
TCut cut
Definition: MakeGlobalFit.C:75
TH1F * fhDcaPosToVertex[2]
Definition: AliESDv0Cuts.h:102
Float_t fPyMax
definition of the range of the Py
Definition: AliESDv0Cuts.h:94
Float_t GetD(Double_t x0, Double_t y0) const
Definition: AliESDv0.cxx:550
Float_t fPtMin
Definition: AliESDv0Cuts.h:92
Float_t fPtMax
definition of the range of the Pt
Definition: AliESDv0Cuts.h:92
Double_t GetChi2V0() const
Definition: AliESDv0.h:78
Definition: AliESD.h:40
static const Char_t * fgkCutNames[kNCuts]
! names of cuts (for internal use)
Definition: AliESDv0Cuts.h:78
Bool_t IsSelected(TObject *)
Definition: AliESDv0Cuts.h:25
AliESDv0Cuts & operator=(const AliESDv0Cuts &c)
TH1F * fhDcaV0ToVertex[2]
Definition: AliESDv0Cuts.h:116
TH1F * fhCutStatistics
statistics of what cuts the v0s did not survive
Definition: AliESDv0Cuts.h:122
void SetMaxChi2(Float_t max=1e10)
Definition: AliESDv0Cuts.h:44
Int_t CountAcceptedV0s(const AliESD *esd)
Float_t fPMin
Definition: AliESDv0Cuts.h:91
Double_t GetDcaV0Daughters() const
Definition: AliESDv0.h:88
Float_t fCutMaxDcaV0ToVertex
max dca of the v0 to the primary vertex
Definition: AliESDv0Cuts.h:88