#include "AliAODTrack.h"
#include "AliLog.h"
+#include "AliAnalysisTaskSE.h"
+#include "AliMCEvent.h"
+#include "AliAODMCParticle.h"
+
+
#include "AliAnalysisTaskAODFilterBitQA.h"
//________________________________________________________________________
AliAnalysisTaskAODFilterBitQA::AliAnalysisTaskAODFilterBitQA(const char *name)
: AliAnalysisTaskSE(name),
+ fArrayMC(0x0),
+ fListQA(0x0),
+ fillOnlySecondaries(kFALSE),
+ fCentralityPercentileMin(0.),
+ fCentralityPercentileMax(80.),
+ fPtMin(0),
+ fPtMax(1000),
+ fEtaMin(-10),
+ fEtaMax(10),
fHistTrackStats(0)
{
- for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){
- fHistKinematics[iTrackBit] = NULL;
- fHistDCAconstrained[iTrackBit] = NULL;
- fHistDCAglobal[iTrackBit] = NULL;
- fHistChiClus[iTrackBit] = NULL;
+ for(Int_t iCharge = 0; iCharge < gNCharge; iCharge++){
+ for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){
+ fHistKinematics[iCharge][iTrackBit] = NULL;
+ fHistDCAconstrained[iCharge][iTrackBit] = NULL;
+ fHistDCAglobal[iCharge][iTrackBit] = NULL;
+ fHistChiClus[iCharge][iTrackBit] = NULL;
+ }
}
DefineInput(0, TChain::Class());
fHistTrackStats = new TH2D("fHistTrackStats","Track statistics;Centrality;TrackFilterBit;N_{events}",100,0,100,gBitMax,0,gBitMax);
fListQA->Add(fHistTrackStats);
- for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){
- fHistKinematics[iTrackBit] = new TH3D(Form("Bit%d_Kinematics",iTrackBit),Form("Bit%d_Kinematics;#eta;#varphi (rad);p_{T} (GeV/c)",iTrackBit),100,-1.0,1.0,100,0,TMath::Pi()*2,100,0,10);
- fHistDCAconstrained[iTrackBit] = new TH2D(Form("Bit%d_DCAconstrained",iTrackBit),Form("Bit%d_DCAconstrained;DCA XY [Constrained] (cm);DCA Z [Constrained] (cm)",iTrackBit),100,-5.0,5.0,100,-5.0,5.0);
- fHistDCAglobal[iTrackBit] = new TH3D(Form("Bit%d_DCAglobal",iTrackBit),Form("Bit%d_DCAglobal;DCA X [Global] (cm);DCA Y [Global] (cm);DCA Z [Global] (cm)",iTrackBit),100,-5.0,5.0,100,-5.0,5.0,100,-5.0,5.0);
- fHistChiClus[iTrackBit] = new TH2D(Form("Bit%d_ChiClus",iTrackBit),Form("Bit%d_ChiClus;#chi^{2} [Fit];N_{clus} [TPC]",iTrackBit),100,-1.0,5.0,160,0,160.0);
- fListQA->Add(fHistKinematics[iTrackBit]);
- fListQA->Add(fHistDCAconstrained[iTrackBit]);
- fListQA->Add(fHistDCAglobal[iTrackBit]);
- fListQA->Add(fHistChiClus[iTrackBit]);
+ TString sCharge[gNCharge] = {"Plus","Minus"};
+
+ for(Int_t iCharge = 0; iCharge < gNCharge; iCharge++){
+ for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){
+ fHistKinematics[iCharge][iTrackBit] = new TH3D(Form("Bit%d_%s_Kinematics",iTrackBit,sCharge[iCharge].Data()),Form("Bit%d_%s_Kinematics;#eta;#varphi (rad);p_{T} (GeV/c)",iTrackBit,sCharge[iCharge].Data()),100,-1.0,1.0,100,0,TMath::Pi()*2,100,0,10);
+ fHistDCAconstrained[iCharge][iTrackBit] = new TH2D(Form("Bit%d_%s_DCAconstrained",iTrackBit,sCharge[iCharge].Data()),Form("Bit%d_%s_DCAconstrained;DCA XY [Constrained] (cm);DCA Z [Constrained] (cm)",iTrackBit,sCharge[iCharge].Data()),100,-5.0,5.0,100,-5.0,5.0);
+ fHistDCAglobal[iCharge][iTrackBit] = new TH3D(Form("Bit%d_%s_DCAglobal",iTrackBit,sCharge[iCharge].Data()),Form("Bit%d_%s_DCAglobal;DCA X [Global] (cm);DCA Y [Global] (cm);DCA Z [Global] (cm)",iTrackBit,sCharge[iCharge].Data()),100,-5.0,5.0,100,-5.0,5.0,100,-5.0,5.0);
+fHistChiClus[iCharge][iTrackBit] = new TH2D(Form("Bit%d_%s_ChiClus",iTrackBit,sCharge[iCharge].Data()),Form("Bit%d_%s_ChiClus;#chi^{2} [Fit];N_{clus} [TPC]",iTrackBit,sCharge[iCharge].Data()),100,-1.0,5.0,160,0,160.0);
+ fListQA->Add(fHistKinematics[iCharge][iTrackBit]);
+ fListQA->Add(fHistDCAconstrained[iCharge][iTrackBit]);
+ fListQA->Add(fHistDCAglobal[iCharge][iTrackBit]);
+ fListQA->Add(fHistChiClus[iCharge][iTrackBit]);
+ }
}
// Post output data.
return;
}
-
-
+ // MC information (set if available)
+ fArrayMC = dynamic_cast<TClonesArray*>(event->FindListObject(AliAODMCParticle::StdBranchName()));
+
// check event cuts
Double_t lMultiplicityVar = -1;
if((lMultiplicityVar = IsEventAccepted(event)) < 0){
// Checks the Event cuts
// still hard coded
- Double_t fCentralityPercentileMin = 0.;
- Double_t fCentralityPercentileMax = 80.;
Double_t fVxMax = 0.5;
Double_t fVyMax = 0.5;
Double_t fVzMax = 10.0;
continue;
}
+ // get MC information (if available)
+ if(fArrayMC && fillOnlySecondaries){
+
+ Int_t label = aodTrack->GetLabel();
+ AliAODMCParticle *mcTrack = (AliAODMCParticle *)fArrayMC->At(TMath::Abs(label));
+
+ if(mcTrack->IsPhysicalPrimary())
+ continue;
+ }
+
// track parameters
vCharge = aodTrack->Charge();
vEta = aodTrack->Eta();
vChi2 = aodTrack->Chi2perNDF();
vClus = aodTrack->GetTPCNcls();
+ // kinematic cuts
+ if( vPt > fPtMax || vPt < fPtMin )
+ continue;
+ if( vEta > fEtaMax || vEta < fEtaMin )
+ continue;
+
// if not constrained track the position is stored (primary vertex to be subtracted)
aodTrack->GetXYZ(pos);
vDCAglobalx = pos[0] - v[0];
vDCAglobaly = pos[1] - v[1];
vDCAglobalz = pos[2] - v[2];
+ // fill for separately for positive and negative charges
+ Int_t iCharge = -1;
+ // positive
+ if(aodTrack->Charge() > 0)
+ iCharge = 0;
+ else if(aodTrack->Charge() < 0)
+ iCharge = 1;
+ else{
+ AliError("Charge==0?");
+ iCharge = -1;
+ }
+
// AOD track cuts
for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){
fHistTrackStats->Fill(gCentrality,iTrackBit,aodTrack->TestFilterBit(1<<iTrackBit));
if(aodTrack->TestFilterBit(1<<iTrackBit)){
- fHistKinematics[iTrackBit]->Fill(vEta,vPhi,vPt);
- fHistDCAconstrained[iTrackBit]->Fill(vDCAconstrainedxy,vDCAconstrainedz);
- fHistDCAglobal[iTrackBit]->Fill(vDCAglobalx,vDCAglobaly,vDCAglobalz);
- fHistChiClus[iTrackBit]->Fill(vChi2,vClus);
+ fHistKinematics[iCharge][iTrackBit]->Fill(vEta,vPhi,vPt);
+ fHistDCAconstrained[iCharge][iTrackBit]->Fill(vDCAconstrainedxy,vDCAconstrainedz);
+ fHistDCAglobal[iCharge][iTrackBit]->Fill(vDCAglobalx,vDCAglobaly,vDCAglobalz);
+ fHistChiClus[iCharge][iTrackBit]->Fill(vChi2,vClus);
}
}//bit loop
// Authors: m.weber@cern.ch
#define gBitMax 16// number of maximum filter bits
+#define gNCharge 2// number of charges
class TList;
class TH2D;
class TH3D;
-#include "AliAnalysisTaskSE.h"
class AliAnalysisTaskAODFilterBitQA : public AliAnalysisTaskSE {
public:
virtual void FinishTaskOutput();
virtual void Terminate(Option_t *);
+ void SetFillOnlySecondaries(){
+ fillOnlySecondaries = kTRUE;
+ }
+
+ void SetCentralityPercentileRange(Double_t min, Double_t max){
+ fCentralityPercentileMin = min;
+ fCentralityPercentileMax = max;
+ }
+
+ void SetPtRange(Double_t min, Double_t max){
+ fPtMin = min;
+ fPtMax = max;
+ }
+
+ void SetEtaRange(Double_t min, Double_t max){
+ fEtaMin = min;
+ fEtaMax = max;
+ }
+
private:
Double_t IsEventAccepted(AliVEvent *event);
void GetAcceptedTracks(AliVEvent *event, Double_t gCentrality);
AliAnalysisTaskAODFilterBitQA(const AliAnalysisTaskAODFilterBitQA&); // not implemented
AliAnalysisTaskAODFilterBitQA& operator=(const AliAnalysisTaskAODFilterBitQA&); // not implemented
+ TClonesArray *fArrayMC;//MC track array for AODs
TList *fListQA;//output list for QA histograms
+ Bool_t fillOnlySecondaries;//fill only secondary particles (only for MC running)
+
+ Double_t fCentralityPercentileMin;// minimum centrality threshold (default = 0)
+ Double_t fCentralityPercentileMax;// maximum centrality threshold (default = 80)
+ Double_t fPtMin;// minimum pT threshold (default = 0)
+ Double_t fPtMax;// maximum pT threshold (default = 1000)
+ Double_t fEtaMin;// minimum eta threshold (default = -10)
+ Double_t fEtaMax;// maximum eta threshold (default = 10)
+
TH2D* fHistTrackStats;//QA histogram for track filter bit statistics vs. centrality
- TH3D* fHistKinematics[gBitMax];//QA histograms for kinematics (eta, phi, pT) for different filter bits
- TH2D* fHistDCAconstrained[gBitMax];//QA histograms for DCA (xy,z) for different filter bits for constrained tracks (stored in DCA methods)
- TH3D* fHistDCAglobal[gBitMax];//QA histograms for DCA (xy,z) for different filter bits for global tracks (stored in Position methods)
- TH2D* fHistChiClus[gBitMax];//QA histograms for Chi2 and number of TPC clusters for different filter bits
+ TH3D* fHistKinematics[gNCharge][gBitMax];//QA histograms for kinematics (eta, phi, pT) for different filter bits
+ TH2D* fHistDCAconstrained[gNCharge][gBitMax];//QA histograms for DCA (xy,z) for different filter bits for constrained tracks (stored in DCA methods)
+ TH3D* fHistDCAglobal[gNCharge][gBitMax];//QA histograms for DCA (xy,z) for different filter bits for global tracks (stored in Position methods)
+ TH2D* fHistChiClus[gNCharge][gBitMax];//QA histograms for Chi2 and number of TPC clusters for different filter bits
//_________________________________________________________//
-AliAnalysisTaskAODFilterBitQA *AddTaskAODFilterBitQA(TString taskname = "AODFilterBitQA") {
+AliAnalysisTaskAODFilterBitQA *AddTaskAODFilterBitQA(TString taskname = "AODFilterBitQA",
+ Double_t centralityMin = 0.,
+ Double_t centralityMax = 80.
+ ) {
// Creates an AODFilterBitQA analysis task and adds it to the analysis manager.
// Get the pointer to the existing analysis manager via the static access method.
// Create the task, add it to manager and configure it.
//===========================================================================
- AliAnalysisTaskAODFilterBitQA *taskAODFilterBitQA = new AliAnalysisTaskAODFilterBitQA(Form("%s",taskname.Data()));
-
+ AliAnalysisTaskAODFilterBitQA *taskAODFilterBitQA = new AliAnalysisTaskAODFilterBitQA(Form("list_%s_%.0f-%.0f",taskname.Data(),centralityMin,centralityMax));
+
+ // ==========================================================================
+ // user customization part
+ taskAODFilterBitQA->SetCentralityPercentileRange(centralityMin,centralityMax);
+ // ==========================================================================
+
+
+
taskAODFilterBitQA->SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral);
mgr->AddTask(taskAODFilterBitQA);
//==============================================================================
TString outputFileName = AliAnalysisManager::GetCommonFileName();
outputFileName += ":PWGCFEbyE.outputFilterBitQA";
- AliAnalysisDataContainer *coutAODFilterBitQA = mgr->CreateContainer(Form("list_%s",taskname.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
+ AliAnalysisDataContainer *coutAODFilterBitQA = mgr->CreateContainer(Form("list_%s_%.0f-%.0f",taskname.Data(),centralityMin,centralityMax), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data());
mgr->ConnectInput(taskAODFilterBitQA, 0, mgr->GetCommonInputContainer());
mgr->ConnectOutput(taskAODFilterBitQA, 1, coutAODFilterBitQA);