#include "AliLog.h"
#include "AliMCParticle.h"
#include "AliCFAcceptanceCuts.h"
+#include "TH1F.h"
+#include "TH2F.h"
+#include "TList.h"
+#include "TBits.h"
ClassImp(AliCFAcceptanceCuts)
fMinNHitTPC(0),
fMinNHitTRD(0),
fMinNHitTOF(0),
- fMinNHitMUON(0)
-
+ fMinNHitMUON(0),
+ fhCutStatistics(0x0),
+ fhCutCorrelation(0x0),
+ fBitmap(new TBits(0))
{
//
//ctor
//
+ for (int i=0; i<kNCuts; i++) for (int j=0; j<kNStepQA; j++) fhQA[i][j]=0x0;
}
//______________________________
fMinNHitTPC(0),
fMinNHitTRD(0),
fMinNHitTOF(0),
- fMinNHitMUON(0)
+ fMinNHitMUON(0),
+ fhCutStatistics(0x0),
+ fhCutCorrelation(0x0),
+ fBitmap(new TBits(0))
{
//
//ctor
//
+ for (int i=0; i<kNCuts; i++) for (int j=0; j<kNStepQA; j++) fhQA[i][j]=0x0;
}
//______________________________
fMinNHitTPC(c.fMinNHitTPC),
fMinNHitTRD(c.fMinNHitTRD),
fMinNHitTOF(c.fMinNHitTOF),
- fMinNHitMUON(c.fMinNHitMUON)
+ fMinNHitMUON(c.fMinNHitMUON),
+ fhCutStatistics(c.fhCutStatistics),
+ fhCutCorrelation(c.fhCutCorrelation),
+ fBitmap(c.fBitmap)
{
//
//copy ctor
//
+ for (int i=0; i<kNCuts; i++) for (int j=0; j<kNStepQA; j++) fhQA[i][j]=c.fhQA[i][j];
}
//______________________________
fMinNHitTRD=c.fMinNHitTRD;
fMinNHitTOF=c.fMinNHitTOF;
fMinNHitMUON=c.fMinNHitMUON;
+ fhCutStatistics = c.fhCutStatistics ;
+ fhCutCorrelation = c.fhCutCorrelation ;
+ fBitmap = c.fBitmap ;
+ for (int i=0; i<kNCuts; i++) for (int j=0; j<kNStepQA; j++) fhQA[i][j]=c.fhQA[i][j];
}
return *this ;
}
+//______________________________________________________________
+Bool_t AliCFAcceptanceCuts::IsSelected(TObject *obj) {
+ //
+ // check if selections on 'obj' are passed
+ // 'obj' must be an AliMCParticle
+ //
+
+ SelectionBitMap(obj);
+
+ if (fIsQAOn) FillHistograms(obj,kFALSE);
+
+ for (UInt_t icut=0; icut<fBitmap->GetNbits(); icut++)
+ if (!fBitmap->TestBitNumber(icut)) return kFALSE ;
+
+ if (fIsQAOn) FillHistograms(obj,kTRUE);
+ return kTRUE;
+}
+
//______________________________
-Bool_t AliCFAcceptanceCuts::IsSelected(TObject* obj) {
+void AliCFAcceptanceCuts::SelectionBitMap(TObject* obj) {
//
// checks the number of track references associated to 'obj'
// 'obj' must be an AliMCParticle
//
- if (!obj) return kFALSE ;
+ for (UInt_t i=0; i<kNCuts; i++) fBitmap->SetBitNumber(i,kFALSE);
+ if (!obj) return;
TString className(obj->ClassName());
if (className.CompareTo("AliMCParticle") != 0) {
- AliError("obj must point to a AliMCParticle !");
- return kFALSE ;
+ AliError("obj must point to an AliMCParticle !");
+ return ;
}
- AliMCParticle* part = (AliMCParticle*) obj ;
- if(!part) return kFALSE;
+ AliMCParticle * part = dynamic_cast<AliMCParticle*>(obj);
+ if(!part) return ;
Int_t nHitsITS=0, nHitsTPC=0, nHitsTRD=0, nHitsTOF=0, nHitsMUON=0 ;
for (Int_t iTrackRef=0; iTrackRef<part->GetNumberOfTrackReferences(); iTrackRef++) {
}
}
- if (nHitsITS < fMinNHitITS ) return kFALSE;
- if (nHitsTPC < fMinNHitTPC ) return kFALSE;
- if (nHitsTRD < fMinNHitTRD ) return kFALSE;
- if (nHitsTOF < fMinNHitTOF ) return kFALSE;
- if (nHitsMUON < fMinNHitMUON ) return kFALSE;
-
+ Int_t iCutBit = 0;
- return kTRUE ;
+ if (nHitsITS >= fMinNHitITS ) fBitmap->SetBitNumber(iCutBit,kTRUE);
+ iCutBit++;
+ if (nHitsTPC >= fMinNHitTPC ) fBitmap->SetBitNumber(iCutBit,kTRUE);
+ iCutBit++;
+ if (nHitsTRD >= fMinNHitTRD ) fBitmap->SetBitNumber(iCutBit,kTRUE);
+ iCutBit++;
+ if (nHitsTOF >= fMinNHitTOF ) fBitmap->SetBitNumber(iCutBit,kTRUE);
+ iCutBit++;
+ if (nHitsMUON >= fMinNHitMUON) fBitmap->SetBitNumber(iCutBit,kTRUE);
}
void AliCFAcceptanceCuts::SetEvtInfo(TObject* mcInfo) {
//
- // Sets pointer to MC event information (AliMCEventHandler)
+ // Sets pointer to MC event information (AliMCEvent)
//
if (!mcInfo) {
- AliError("Pointer to MC Event Handler is null !");
+ AliError("Pointer to AliMCEvent !");
return;
}
TString className(mcInfo->ClassName());
- if (className.CompareTo("AliMCEventHandler") != 0) {
- AliError("argument must point to an AliMCEventHandler !");
+ if (className.CompareTo("AliMCEvent") != 0) {
+ AliError("argument must point to an AliMCEvent !");
return ;
}
- fMCInfo = (AliMCEventHandler*) mcInfo ;
+ fMCInfo = (AliMCEvent*) mcInfo ;
+}
+
+
+//__________________________________________________________________________________
+void AliCFAcceptanceCuts::AddQAHistograms(TList *qaList) {
+ //
+ // saves the histograms in a TList
+ //
+
+ DefineHistograms();
+
+ qaList->Add(fhCutStatistics);
+ qaList->Add(fhCutCorrelation);
+
+ for (Int_t j=0; j<kNStepQA; j++) {
+ for(Int_t i=0; i<kNCuts; i++)
+ qaList->Add(fhQA[i][j]);
+ }
+}
+
+//__________________________________________________________________________________
+void AliCFAcceptanceCuts::DefineHistograms() {
+ //
+ // histograms for cut variables, cut statistics and cut correlations
+ //
+ Int_t color = 2;
+
+ // book cut statistics and cut correlation histograms
+ fhCutStatistics = new TH1F(Form("%s_cut_statistics",GetName()),"",kNCuts,0.5,kNCuts+0.5);
+ fhCutStatistics->SetLineWidth(2);
+ int k = 1;
+ fhCutStatistics->GetXaxis()->SetBinLabel(k,"hits ITS") ; k++;
+ fhCutStatistics->GetXaxis()->SetBinLabel(k,"hits TPC") ; k++;
+ fhCutStatistics->GetXaxis()->SetBinLabel(k,"hits TRD") ; k++;
+ fhCutStatistics->GetXaxis()->SetBinLabel(k,"hits TOF") ; k++;
+ fhCutStatistics->GetXaxis()->SetBinLabel(k,"hits MUON"); k++;
+
+
+ fhCutCorrelation = new TH2F(Form("%s_cut_correlation",GetName()),"",kNCuts,0.5,kNCuts+0.5,kNCuts,0.5,kNCuts+0.5);
+ fhCutCorrelation->SetLineWidth(2);
+ for (k=1; k<=kNCuts; k++) {
+ fhCutCorrelation->GetXaxis()->SetBinLabel(k,fhCutStatistics->GetXaxis()->GetBinLabel(k));
+ fhCutCorrelation->GetYaxis()->SetBinLabel(k,fhCutStatistics->GetXaxis()->GetBinLabel(k));
+ }
+
+ Char_t str[256];
+ for (int i=0; i<kNStepQA; i++) {
+ if (i==0) sprintf(str," ");
+ else sprintf(str,"_cut");
+ fhQA[kCutHitsITS] [i] = new TH1F(Form("%s_HitsITS%s" ,GetName(),str),"",10,0,10);
+ fhQA[kCutHitsTPC] [i] = new TH1F(Form("%s_HitsTPC%s" ,GetName(),str),"",5,0,5);
+ fhQA[kCutHitsTRD] [i] = new TH1F(Form("%s_HitsTRD%s" ,GetName(),str),"",10,0,10);
+ fhQA[kCutHitsTOF] [i] = new TH1F(Form("%s_HitsTOF%s" ,GetName(),str),"",5,0,5);
+ fhQA[kCutHitsMUON][i] = new TH1F(Form("%s_HitsMUON%s" ,GetName(),str),"",5,0,5);
+ }
+ for(Int_t i=0; i<kNCuts; i++) fhQA[i][1]->SetLineColor(color);
+}
+
+//__________________________________________________________________________________
+void AliCFAcceptanceCuts::FillHistograms(TObject* obj, Bool_t afterCuts)
+{
+ //
+ // fill the QA histograms
+ //
+ AliMCParticle* part = dynamic_cast<AliMCParticle *>(obj);
+
+ Int_t nHitsITS=0, nHitsTPC=0, nHitsTRD=0, nHitsTOF=0, nHitsMUON=0 ;
+ for (Int_t iTrackRef=0; iTrackRef<part->GetNumberOfTrackReferences(); iTrackRef++) {
+ AliTrackReference * trackRef = part->GetTrackReference(iTrackRef);
+ if(trackRef){
+ Int_t detectorId = trackRef->DetectorId();
+ switch(detectorId) {
+ case AliTrackReference::kITS : nHitsITS++ ; break ;
+ case AliTrackReference::kTPC : nHitsTPC++ ; break ;
+ case AliTrackReference::kTRD : nHitsTRD++ ; break ;
+ case AliTrackReference::kTOF : nHitsTOF++ ; break ;
+ case AliTrackReference::kMUON : nHitsMUON++ ; break ;
+ default : break ;
+ }
+ }
+ }
+
+ fhQA[kCutHitsITS ][afterCuts]->Fill(nHitsITS );
+ fhQA[kCutHitsTPC ][afterCuts]->Fill(nHitsTPC );
+ fhQA[kCutHitsTRD ][afterCuts]->Fill(nHitsTRD );
+ fhQA[kCutHitsTOF ][afterCuts]->Fill(nHitsTOF );
+ fhQA[kCutHitsMUON][afterCuts]->Fill(nHitsMUON);
+
+ // fill cut statistics and cut correlation histograms with information from the bitmap
+ if (afterCuts) return;
+
+ // Number of single cuts in this class
+ UInt_t ncuts = fBitmap->GetNbits();
+ for(UInt_t bit=0; bit<ncuts;bit++) {
+ 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);
+ }
+ }
+ }
}