#include <TCanvas.h>
#include <TDirectory.h>
-#include <TBits.h>
#include <TH2.h>
+#include <TBits.h>
#include <AliVParticle.h>
#include <AliLog.h>
fhBinLimRapidity(0x0),
fhBinLimPhi(0x0),
fhBinLimCharge(0x0)
-
{
//
// Default constructor
//
- fBitmap=new TBits(0);
Initialise();
}
//__________________________________________________________________________________
fhBinLimRapidity(0x0),
fhBinLimPhi(0x0),
fhBinLimCharge(0x0)
-
{
//
// Constructor
//
- fBitmap=new TBits(0);
Initialise();
}
//__________________________________________________________________________________
fhBinLimRapidity(c.fhBinLimRapidity),
fhBinLimPhi(c.fhBinLimPhi),
fhBinLimCharge(c.fhBinLimCharge)
-
{
//
// copy constructor
fhBinLimRapidity = c.fhBinLimRapidity;
fhBinLimPhi = c.fhBinLimPhi;
fhBinLimCharge = c.fhBinLimCharge;
-
+
for (Int_t i=0; i<c.kNHist; i++){
for (Int_t j=0; j<c.kNStepQA; j++){
if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
}
}
-
((AliCFTrackKineCuts &) c).Copy(*this);
}
return *this ;
if(fhQA[i][j]) delete fhQA[i][j];
}
}
-
- if(fBitmap) delete fBitmap;
-
+ if(fBitmap) delete fBitmap;
if(fhBinLimMomentum) delete fhBinLimMomentum;
if(fhBinLimPt) delete fhBinLimPt;
if(fhBinLimPx) delete fhBinLimPx;
fhCutStatistics = 0;
fhCutCorrelation = 0;
-
- //set default bining for QA histograms
+ fBitmap=new TBits(0);
+
+ //set default bining for QA histograms
SetHistogramBins(kCutP,200,0.,20.);
SetHistogramBins(kCutPt,200,0.,20.);
SetHistogramBins(kCutPx,400,-20.,20.);
SetHistogramBins(kCutEta,200,-10.,10.);
SetHistogramBins(kCutPhi,38,-0.6,7.);
SetHistogramBins(kCutCharge,21,-10.5,10.5);
-
}
//__________________________________________________________________________________
void AliCFTrackKineCuts::Copy(TObject &c) const
if(fhQA[i][j]) target.fhQA[i][j] = (TH1F*)fhQA[i][j]->Clone();
}
}
-
TNamed::Copy(c);
}
//__________________________________________________________________________________
-void AliCFTrackKineCuts::GetBitMap(TObject* obj, TBits *bitmap) {
- //
- // retrieve the pointer to the bitmap
- //
- bitmap = SelectionBitMap(obj);
-}
-//__________________________________________________________________________________
-TBits* AliCFTrackKineCuts::SelectionBitMap(TObject* obj) {
+void AliCFTrackKineCuts::SelectionBitMap(TObject* obj) {
//
// test if the track passes the single cuts
// and store the information in a bitmap
// bitmap stores the decision of each single cut
for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kFALSE);
- // cast TObject into VParticle
- AliVParticle* particle = dynamic_cast<AliVParticle *>(obj);
- if ( !particle ) return fBitmap ;
-
- for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kTRUE);
+ // check TObject and cast into VParticle
+ if (!obj) return ;
+ if (!obj->InheritsFrom("AliVParticle")) AliError("object must derived from AliVParticle !");
+ AliVParticle* particle = dynamic_cast<AliVParticle *>(obj);
+ if ( !particle ) return;
Int_t iCutBit = 0;
- if((particle->P() < fMomentumMin) || (particle->P() > fMomentumMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if((particle->P() >= fMomentumMin) && (particle->P() <= fMomentumMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Pt() < fPtMin) || (particle->Pt() > fPtMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Pt() >= fPtMin) && (particle->Pt() <= fPtMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Px() < fPxMin) || (particle->Px() > fPxMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Px() >= fPxMin) && (particle->Px() <= fPxMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Py() < fPyMin) || (particle->Py() > fPyMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Py() >= fPyMin) && (particle->Py() <= fPyMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Pz() < fPzMin) || (particle->Pz() > fPzMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Pz() >= fPzMin) && (particle->Pz() <= fPzMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Eta() < fEtaMin) || (particle->Eta() > fEtaMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Eta() >= fEtaMin) && (particle->Eta() <= fEtaMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Y() < fRapidityMin) || (particle->Y() > fRapidityMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Y() >= fRapidityMin) && (particle->Y() <= fRapidityMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if ((particle->Phi() < fPhiMin) || (particle->Phi() > fPhiMax))
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if ((particle->Phi() >= fPhiMin) && (particle->Phi() <= fPhiMax))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if (fCharge < 10 && particle->Charge() != fCharge)
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if (fCharge >= 10 || (particle->Charge() == fCharge))
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
iCutBit++;
- if (fRequireIsCharged && particle->Charge()==0)
- fBitmap->SetBitNumber(iCutBit,kFALSE);
+ if (fRequireIsCharged && particle->Charge()!=0)
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
+ if (!fRequireIsCharged)
+ fBitmap->SetBitNumber(iCutBit,kTRUE);
- return fBitmap;
+ return;
}
//__________________________________________________________________________________
Bool_t AliCFTrackKineCuts::IsSelected(TObject* obj) {
//
// loops over decisions of single cuts and returns if the track is accepted
//
- TBits* bitmap = SelectionBitMap(obj);
+ SelectionBitMap(obj);
+ if (fIsQAOn) FillHistograms(obj,0);
Bool_t isSelected = kTRUE;
- for (UInt_t icut=0; icut<bitmap->GetNbits();icut++)
- if(!bitmap->TestBitNumber(icut)) isSelected = kFALSE;
-
- return isSelected;
-}
-//__________________________________________________________________________________
-void AliCFTrackKineCuts::Init() {
- //
- // initialises all histograms and the TList which holds the histograms
- //
- if(fIsQAOn)
- DefineHistograms();
+ for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++) {
+ if(!fBitmap->TestBitNumber(icut)) {
+ isSelected = kFALSE;
+ break;
+ }
+ }
+ if (!isSelected) return kFALSE ;
+ if (fIsQAOn) FillHistograms(obj,1);
+ return kTRUE;
}
//__________________________________________________________________________________
void AliCFTrackKineCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
switch(index){
case kCutP:
- fhNBinsMomentum=nbins;
+ fhNBinsMomentum=nbins+1;
fhBinLimMomentum=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimMomentum[i]=bins[i];
break;
-
+
case kCutPt:
- fhNBinsPt=nbins;
+ fhNBinsPt=nbins+1;
fhBinLimPt=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPt[i]=bins[i];
break;
-
+
case kCutPx:
- fhNBinsPx=nbins;
+ fhNBinsPx=nbins+1;
fhBinLimPx=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPx[i]=bins[i];
break;
case kCutPy:
- fhNBinsPy=nbins;
+ fhNBinsPy=nbins+1;
fhBinLimPy=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPy[i]=bins[i];
break;
-
+
case kCutPz:
- fhNBinsPz=nbins;
+ fhNBinsPz=nbins+1;
fhBinLimPz=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPz[i]=bins[i];
break;
-
+
case kCutRapidity:
- fhNBinsRapidity=nbins;
+ fhNBinsRapidity=nbins+1;
fhBinLimRapidity=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimRapidity[i]=bins[i];
break;
-
+
case kCutEta:
- fhNBinsEta=nbins;
+ fhNBinsEta=nbins+1;
fhBinLimEta=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimEta[i]=bins[i];
break;
-
+
case kCutPhi:
- fhNBinsPhi=nbins;
+ fhNBinsPhi=nbins+1;
fhBinLimPhi=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPhi[i]=bins[i];
break;
-
+
case kCutCharge:
- fhNBinsCharge=nbins;
+ fhNBinsCharge=nbins+1;
fhBinLimCharge=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimCharge[i]=bins[i];
break;
//
// fixed bin size
//
- if(!fIsQAOn) return;
-
switch(index){
case kCutP:
- fhNBinsMomentum=nbins;
+ fhNBinsMomentum=nbins+1;
fhBinLimMomentum=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimMomentum[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutPt:
- fhNBinsPt=nbins;
+ fhNBinsPt=nbins+1;
fhBinLimPt=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPt[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutPx:
- fhNBinsPx=nbins;
+ fhNBinsPx=nbins+1;
fhBinLimPx=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPx[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
case kCutPy:
- fhNBinsPy=nbins;
+ fhNBinsPy=nbins+1;
fhBinLimPy=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPy[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutPz:
- fhNBinsPz=nbins;
+ fhNBinsPz=nbins+1;
fhBinLimPz=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPz[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutRapidity:
- fhNBinsRapidity=nbins;
+ fhNBinsRapidity=nbins+1;
fhBinLimRapidity=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimRapidity[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutEta:
- fhNBinsEta=nbins;
+ fhNBinsEta=nbins+1;
fhBinLimEta=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimEta[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutPhi:
- fhNBinsPhi=nbins;
+ fhNBinsPhi=nbins+1;
fhBinLimPhi=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimPhi[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
-
+
case kCutCharge:
- fhNBinsCharge=nbins;
+ fhNBinsCharge=nbins+1;
fhBinLimCharge=new Double_t[nbins+1];
for(Int_t i=0;i<nbins+1;i++)fhBinLimCharge[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
break;
//
// histograms for cut variables, cut statistics and cut correlations
//
-
Int_t color = 2;
// book cut statistics and cut correlation histograms
if (i==0) sprintf(str," ");
else sprintf(str,"_cut");
- fhQA[kCutP][i] = new TH1F(Form("%s_momentum%s",GetName(),str), "",fhNBinsMomentum,fhBinLimMomentum);
- fhQA[kCutPt][i] = new TH1F(Form("%s_transverse_momentum%s",GetName(),str),"",fhNBinsPt,fhBinLimPt);
- fhQA[kCutPx][i] = new TH1F(Form("%s_px%s",GetName(),str), "",fhNBinsPx,fhBinLimPx);
- fhQA[kCutPy][i] = new TH1F(Form("%s_py%s",GetName(),str), "",fhNBinsPy,fhBinLimPy);
- fhQA[kCutPz][i] = new TH1F(Form("%s_pz%s",GetName(),str), "",fhNBinsPz,fhBinLimPz);
- fhQA[kCutRapidity][i]=new TH1F(Form("%s_rapidity%s",GetName(),str), "",fhNBinsRapidity,fhBinLimRapidity);
- fhQA[kCutEta][i] = new TH1F(Form("%s_eta%s",GetName(),str), "",fhNBinsEta,fhBinLimEta);
- fhQA[kCutPhi][i] = new TH1F(Form("%s_phi%s",GetName(),str), "",fhNBinsPhi,fhBinLimPhi);
- fhQA[kCutCharge][i] = new TH1F(Form("%s_charge%s",GetName(),str), "",fhNBinsCharge,fhBinLimCharge);
+ fhQA[kCutP][i] = new TH1F(Form("%s_momentum%s",GetName(),str), "",fhNBinsMomentum-1,fhBinLimMomentum);
+ fhQA[kCutPt][i] = new TH1F(Form("%s_transverse_momentum%s",GetName(),str),"",fhNBinsPt-1,fhBinLimPt);
+ fhQA[kCutPx][i] = new TH1F(Form("%s_px%s",GetName(),str), "",fhNBinsPx-1,fhBinLimPx);
+ fhQA[kCutPy][i] = new TH1F(Form("%s_py%s",GetName(),str), "",fhNBinsPy-1,fhBinLimPy);
+ fhQA[kCutPz][i] = new TH1F(Form("%s_pz%s",GetName(),str), "",fhNBinsPz-1,fhBinLimPz);
+ fhQA[kCutRapidity][i]=new TH1F(Form("%s_rapidity%s",GetName(),str), "",fhNBinsRapidity-1,fhBinLimRapidity);
+ fhQA[kCutEta][i] = new TH1F(Form("%s_eta%s",GetName(),str), "",fhNBinsEta-1,fhBinLimEta);
+ fhQA[kCutPhi][i] = new TH1F(Form("%s_phi%s",GetName(),str), "",fhNBinsPhi-1,fhBinLimPhi);
+ fhQA[kCutCharge][i] = new TH1F(Form("%s_charge%s",GetName(),str), "",fhNBinsCharge-1,fhBinLimCharge);
fhQA[kCutP][i] ->SetXTitle("momentum p (GeV/c)");
fhQA[kCutPt][i] ->SetXTitle("p_{T} (GeV/c)");
fhQA[kCutPhi][i] ->SetXTitle("azimuth #phi (rad)");
fhQA[kCutCharge][i] ->SetXTitle("charge");
}
-
for(Int_t i=0; i<kNHist; i++) fhQA[i][1]->SetLineColor(color);
-
}
//__________________________________________________________________________________
void AliCFTrackKineCuts::FillHistograms(TObject* obj, Bool_t b)
//
// fill the QA histograms
//
- if(!fIsQAOn) return;
// cast TObject into VParticle
+ if (!obj) return;
AliVParticle* particle = dynamic_cast<AliVParticle *>(obj);
if ( !particle ) return;
- // index = 0: fill histograms before cuts
- // index = 1: fill histograms after cuts
- Int_t index = -1;
- index = ((b) ? 1 : 0);
-
- fhQA[kCutP][index]->Fill(particle->P());
- fhQA[kCutPt][index]->Fill(particle->Pt());
- fhQA[kCutPx][index]->Fill(particle->Px());
- fhQA[kCutPy][index]->Fill(particle->Py());
- fhQA[kCutPz][index]->Fill(particle->Pz());
- fhQA[kCutRapidity][index]->Fill(particle->Y());
- fhQA[kCutEta][index]->Fill(particle->Eta());
- fhQA[kCutPhi][index]->Fill(particle->Phi());
- fhQA[kCutCharge][index]->Fill((float)particle->Charge());
+ // b = 0: fill histograms before cuts
+ // b = 1: fill histograms after cuts
+ fhQA[kCutP][b]->Fill(particle->P());
+ fhQA[kCutPt][b]->Fill(particle->Pt());
+ fhQA[kCutPx][b]->Fill(particle->Px());
+ fhQA[kCutPy][b]->Fill(particle->Py());
+ fhQA[kCutPz][b]->Fill(particle->Pz());
+ fhQA[kCutRapidity][b]->Fill(particle->Y());
+ fhQA[kCutEta][b]->Fill(particle->Eta());
+ fhQA[kCutPhi][b]->Fill(particle->Phi());
+ fhQA[kCutCharge][b]->Fill((float)particle->Charge());
// fill cut statistics and cut correlation histograms with information from the bitmap
if (b) return;
- if (!obj) return;
- TBits* bitmap = SelectionBitMap(obj);
-
// Number of single cuts in this class
- UInt_t ncuts = bitmap->GetNbits();
+ UInt_t ncuts = fBitmap->GetNbits();
for(UInt_t bit=0; bit<ncuts;bit++) {
- if (!bitmap->TestBitNumber(bit)) {
- fhCutStatistics->Fill(bit+1);
- for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
- if (!bitmap->TestBitNumber(bit2))
- fhCutCorrelation->Fill(bit+1,bit2+1);
- }
+ if (!fBitmap->TestBitNumber(bit)) {
+ fhCutStatistics->Fill(bit+1);
+ for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
+ if (!fBitmap->TestBitNumber(bit2))
+ fhCutCorrelation->Fill(bit+1,bit2+1);
+ }
}
}
}
gDirectory->cd("../");
}
-
gDirectory->cd("../");
}
//__________________________________________________________________________________
canvas3->SaveAs(Form("%s.ps", canvas3->GetName()));
}
//__________________________________________________________________________________
-void AliCFTrackKineCuts::AddQAHistograms(TList *qaList) const {
+void AliCFTrackKineCuts::AddQAHistograms(TList *qaList) {
//
// saves the histograms in a TList
//
- if(!fIsQAOn) return;
+ DefineHistograms();
qaList->Add(fhCutStatistics);
qaList->Add(fhCutCorrelation);