TNamed::Copy(c);
}
//__________________________________________________________________________________
-void AliCFTrackKineCuts::GetBitMap(TObject* obj, TBits *bitmap) {
- //
- // retrieve the pointer to the bitmap
- //
- TBits *bm = SelectionBitMap(obj);
- *bitmap = *bm;
-}
-//__________________________________________________________________________________
-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
+ // 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 fBitmap ;
-
- for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kTRUE);
+ 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;
//
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;
// book QA histograms
- Char_t str[256];
+ Char_t str[5];
for (Int_t i=0; i<kNStepQA; i++) {
- if (i==0) sprintf(str," ");
- else sprintf(str,"_cut");
+ if (i==0) snprintf(str,5," ");
+ else snprintf(str,5,"_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)");
//
// 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);
+ }
}
}
}
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);