29 #include <TDirectory.h> 35 "dca positive to pvtx",
36 "dca negative to pvtx",
41 "cosine pointing angle",
53 fCutMinDcaPosToVertex(0),
54 fCutMinDcaNegToVertex(0),
56 fCutMaxDcaV0Daughters(0),
59 fCutMinCosinePointingAngle(0),
60 fCutRequireOnFlyStatus(0),
61 fCutMaxDcaV0ToVertex(0),
134 for (Int_t i=0; i<2; i++) {
189 for (Int_t i=0; i<2; ++i)
247 for (Int_t i=0; i<2; ++i)
280 TIterator* iter = list->MakeIterator();
286 while ((obj = iter->Next())) {
295 for (Int_t i=0; i<2; i++) {
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);
336 if(listObj->GetSize()!=4)
return kFALSE;
341 return AcceptV0(esdV0,trackPos,trackNeg,esdVertex);
363 Float_t dcaPosToVertex = 0, dcaNegToVertex = 0;
364 Float_t tdcaPosToVertex[2]={999,999};
365 Float_t tdcaNegToVertex[2]={999,999};
370 dcaPosToVertex = TMath::Sqrt(tdcaPosToVertex[0]*tdcaPosToVertex[0]+tdcaPosToVertex[1]*tdcaPosToVertex[1]);
371 dcaNegToVertex = TMath::Sqrt(tdcaNegToVertex[0]*tdcaNegToVertex[0]+tdcaNegToVertex[1]*tdcaNegToVertex[1]);
378 Double_t vtxPosition[3]; esdVertex->
GetXYZ(vtxPosition);
379 Double_t dcaV0ToVertex = esdV0->
GetD(vtxPosition[0],vtxPosition[1],vtxPosition[2]);
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));
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));
396 for (Int_t i=0; i<
kNCuts; i++) cuts[i]=kFALSE;
431 for (Int_t i=0; i<
kNCuts; i++)
432 if (cuts[i]) cut = kTRUE;
442 for (Int_t i=0; i<
kNCuts; i++) {
446 for (Int_t j=i; j<
kNCuts; j++) {
447 if (cuts[i] && cuts[j]) {
469 if (cut)
return kFALSE;
497 Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
503 lIndexTrackPos = TMath::Abs(v0->
GetPindex());
504 lIndexTrackNeg = TMath::Abs(v0->
GetNindex());
508 if (
AcceptV0(v0,trackPos,trackNeg,primaryVertex))
509 acceptedV0s->Add(v0);
523 Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
529 lIndexTrackPos = TMath::Abs(v0->
GetPindex());
530 lIndexTrackNeg = TMath::Abs(v0->
GetNindex());
534 if (
AcceptV0(v0,trackPos,trackNeg,primaryVertex))
551 Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
557 lIndexTrackPos = TMath::Abs(v0->
GetPindex());
558 lIndexTrackNeg = TMath::Abs(v0->
GetNindex());
562 if (
AcceptV0(v0,trackPos,trackNeg,primaryVertex))
563 acceptedV0s->Add(v0);
577 Int_t lIndexTrackPos = 0, lIndexTrackNeg = 0;
583 lIndexTrackPos = TMath::Abs(v0->
GetPindex());
584 lIndexTrackNeg = TMath::Abs(v0->
GetNindex());
588 if (
AcceptV0(v0,trackPos,trackNeg,primaryVertex))
601 Bool_t oldStatus = TH1::AddDirectoryStatus();
602 TH1::AddDirectory(kFALSE);
614 for (Int_t i=0; i<
kNCuts; i++) {
626 for (Int_t i=0; i<2; i++) {
627 if (i==0) snprintf(str,256,
" ");
628 else snprintf(str,256,
"_cut");
632 fhChi2[i] =
new TH1F(Form(
"chi2%s",str),
"",50,0,50);
634 fhRadius[i] =
new TH1F(Form(
"decayRadius%s",str),
"",300,0,150);
636 fhOnFlyStatus[i] =
new TH1F(Form(
"onflystatus%s",str),
"",5,0,5);
639 fhPt[i] =
new TH1F(Form(
"pt%s",str) ,
"p_{T} distribution;p_{T} (GeV/c)",500,0.0,100.0);
643 fhChi2[i]->SetTitle(
"#Chi^{2} for v0");
645 fhRadius[i]->SetTitle(
"Decay radius of the v0");
652 fhChi2[i]->SetLineColor(color);
fhChi2[i]->SetLineWidth(2);
660 TH1::AddDirectory(oldStatus);
672 if (!gDirectory->cd(dir))
675 fhCutStatistics =
dynamic_cast<TH1F*
> (gDirectory->Get(
"cut_statistics"));
676 fhCutCorrelation =
dynamic_cast<TH2F*
> (gDirectory->Get(
"cut_correlation"));
679 for (Int_t i=0; i<2; i++) {
682 gDirectory->cd(
"before_cuts");
687 gDirectory->cd(
"after_cuts");
688 snprintf(str,5,
"_cut");
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)));
697 fhOnFlyStatus[i] =
dynamic_cast<TH1F*
> (gDirectory->Get(Form(
"onflystatus%s",str)));
698 fhDcaV0ToVertex[i] =
dynamic_cast<TH1F*
> (gDirectory->Get(Form(
"dcaV0ToVertex%s",str)));
700 fhPt[i] =
dynamic_cast<TH1F*
> (gDirectory->Get(Form(
"pt%s",str)));
702 gDirectory->cd(
"../");
705 gDirectory->cd(
"..");
715 AliDebug(0,
"Histograms not on - cannot save histograms!!!");
722 gDirectory->mkdir(dir);
725 gDirectory->mkdir(
"before_cuts");
726 gDirectory->mkdir(
"after_cuts");
731 for (Int_t i=0; i<2; i++) {
733 gDirectory->cd(
"before_cuts");
735 gDirectory->cd(
"after_cuts");
748 gDirectory->cd(
"../");
751 gDirectory->cd(
"../");
759 TCanvas* canvas1 =
new TCanvas(Form(
"%s_1", GetName()),
"V0 Quality Results1", 800, 800);
760 canvas1->Divide(2, 2);
767 fhChi2[0]->SetStats(kFALSE);
774 canvas1->SaveAs(Form(
"%s_%s.gif", GetName(), canvas1->GetName()));
776 TCanvas* canvas2 =
new TCanvas(Form(
"%s_2", GetName()),
"V0 Quality Results2", 1200, 800);
777 canvas2->Divide(3, 2);
800 canvas2->SaveAs(Form(
"%s_%s.gif", GetName(), canvas2->GetName()));
802 TCanvas* canvas3 =
new TCanvas(Form(
"%s_4", GetName()),
"V0 Quality Results3", 800, 500);
803 canvas3->Divide(2, 1);
808 gPad->SetBottomMargin(0.3);
814 gPad->SetBottomMargin(0.3);
815 gPad->SetLeftMargin(0.3);
818 canvas3->SaveAs(Form(
"%s_%s.gif", GetName(), canvas3->GetName()));
AliESDtrack * GetTrack(Int_t i) const
static void EnableNeededBranches(TTree *tree)
Int_t GetNumberOfV0s() const
void DefineHistograms(Int_t color=1)
void SetPRange(Float_t r1=0, Float_t r2=1e10)
TH1F * fhDcaNegToVertex[2]
void SetPtRange(Float_t r1=0, Float_t r2=1e10)
Bool_t fCutRequireOnFlyStatus
require on fly status
virtual void GetXYZ(Double_t position[3]) const
const AliESDVertex * GetPrimaryVertex() const
void SetPxRange(Float_t r1=-1e10, Float_t r2=1e10)
Bool_t GetOnFlyStatus() const
TObjArray * GetAcceptedV0s(const AliESD *esd)
void SetRequireOnFlyStatus(Bool_t b=kFALSE)
virtual Long64_t Merge(TCollection *list)
void SetMaxDcaV0Daughters(Float_t max=1e10)
Float_t fCutMinRadius
min reconstruction radius (fiducial volume)
void SaveHistograms(const Char_t *dir=0)
void GetXYZ(Double_t &x, Double_t &y, Double_t &z) const
Float_t fCutMinCosinePointingAngle
min cosine of pointing angle
TH1F * fhDcaV0Daughters[2]
Float_t fPxMax
definition of the range of the Px
Bool_t fHistogramsOn
histograms on/off
Float_t fCutMaxDcaV0Daughters
max dca between the two v0 daughters
TH1F * fhPt[2]
pt of esd v0s
Float_t fPMax
definition of the range of the P
Bool_t AcceptV0(AliESDv0 *const esdV0, AliESDtrack *const trackPos, AliESDtrack *const trackNeg, const AliESDVertex *esdVertex)
void SetMaxRadius(Float_t max=1e10)
Float_t GetV0CosineOfPointingAngle(Double_t refPointX, Double_t refPointY, Double_t refPointZ) const
AliESDv0 * GetV0(Int_t i) const
TH2F * fhCutCorrelation
2d statistics plot
void SetMinRadius(Float_t min=-1)
Float_t fCutMaxRadius
max reconstruction radius (fiducial volume)
AliESDv0Cuts(const Char_t *name="AliESDv0Cuts", const Char_t *title="")
TH1F * fhCosinePointingAngle[2]
Base class for analysis cuts.
void SetPzRange(Float_t r1=-1e10, Float_t r2=1e10)
Float_t fPzMax
definition of the range of the Pz
void SetMinDcaNegToVertex(Float_t min=-1)
void SetMinCosinePointingAngle(Float_t min=-1)
void SetMinDcaPosToVertex(Float_t min=-1)
virtual Bool_t LoadHistograms(const Char_t *dir=0)
void GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const
virtual void Copy(TObject &c) const
void SetMaxDcaV0ToVertex(Float_t max=1e10)
void SetPyRange(Float_t r1=-1e10, Float_t r2=1e10)
Int_t GetNumberOfV0s() const
#define AliDebug(logLevel, message)
void SetHistogramsOn(Bool_t b=kFALSE)
AliESDv0 * GetV0(Int_t i) const
Float_t fCutMinDcaPosToVertex
min dca of the positive daughter to the primary vertex
virtual void GetImpactParameters(Float_t &xy, Float_t &z) const
const AliESDVertex * GetPrimaryVertex() const
Float_t fCutMinDcaNegToVertex
min dca of the negative daughter to the primary vertex
Class for handling of ESD v0 cuts.
AliESDtrack * GetTrack(Int_t i) const
Float_t fCutMaxChi2
max chi2
TH1F * fhDcaPosToVertex[2]
Float_t fPyMax
definition of the range of the Py
Float_t GetD(Double_t x0, Double_t y0) const
Float_t fPtMax
definition of the range of the Pt
Double_t GetChi2V0() const
static const Char_t * fgkCutNames[kNCuts]
! names of cuts (for internal use)
Bool_t IsSelected(TObject *)
AliESDv0Cuts & operator=(const AliESDv0Cuts &c)
TH1F * fhDcaV0ToVertex[2]
TH1F * fhCutStatistics
statistics of what cuts the v0s did not survive
void SetMaxChi2(Float_t max=1e10)
Int_t CountAcceptedV0s(const AliESD *esd)
Double_t GetDcaV0Daughters() const
Float_t fCutMaxDcaV0ToVertex
max dca of the v0 to the primary vertex