From bf6a8159a3465a316b31d8368aa7c1074c13ce00 Mon Sep 17 00:00:00 2001 From: miweber Date: Wed, 12 Feb 2014 22:43:46 +0100 Subject: [PATCH] new task for AOD filter bit QA --- PWGCF/CMakelibPWGCFebye.pkg | 1 + .../AliAnalysisTaskAODFilterBitQA.cxx | 236 ++++++++++++++++++ .../AliAnalysisTaskAODFilterBitQA.h | 48 ++++ PWGCF/EBYE/macros/AddTaskAODFilterBitQA.C | 46 ++++ PWGCF/PWGCFebyeLinkDef.h | 1 + 5 files changed, 332 insertions(+) create mode 100755 PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.cxx create mode 100755 PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.h create mode 100644 PWGCF/EBYE/macros/AddTaskAODFilterBitQA.C diff --git a/PWGCF/CMakelibPWGCFebye.pkg b/PWGCF/CMakelibPWGCFebye.pkg index e4a57181169..2a5f5c8e8f4 100644 --- a/PWGCF/CMakelibPWGCFebye.pkg +++ b/PWGCF/CMakelibPWGCFebye.pkg @@ -39,6 +39,7 @@ set ( SRCS EBYE/BalanceFunctions/AliBalancePsi.cxx EBYE/BalanceFunctions/AliBalanceEventMixing.cxx EBYE/BalanceFunctions/AliBalanceTriggered.cxx + EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.cxx EBYE/LRC/AliLRCBase.cxx EBYE/LRC/AliAnalysisTaskLRC.cxx EBYE/LRC/AliLRCAnalysis.cxx diff --git a/PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.cxx b/PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.cxx new file mode 100755 index 00000000000..90597f8b7e2 --- /dev/null +++ b/PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.cxx @@ -0,0 +1,236 @@ +#include "TChain.h" +#include "TH2D.h" +#include "TH3D.h" + + +#include "AliAODEvent.h" +#include "AliAODTrack.h" +#include "AliLog.h" + + +#include "AliAnalysisTaskAODFilterBitQA.h" + +// Analysis task for the QA of AOD track filter bits +// Authors: m.weber@cern.ch + +ClassImp(AliAnalysisTaskAODFilterBitQA) + +//________________________________________________________________________ +AliAnalysisTaskAODFilterBitQA::AliAnalysisTaskAODFilterBitQA(const char *name) + : AliAnalysisTaskSE(name), + fHistTrackStats(0) +{ + + for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){ + fHistKinematics[iTrackBit] = NULL; + fHistDCA[iTrackBit] = NULL; + fHistDCAprop[iTrackBit] = NULL; + fHistChiClus[iTrackBit] = NULL; + } + + DefineInput(0, TChain::Class()); + // Output slot #0 writes into a TH1 container + DefineOutput(1, TList::Class()); + +} + +//________________________________________________________________________ +AliAnalysisTaskAODFilterBitQA::~AliAnalysisTaskAODFilterBitQA() { + // Destructor + // ... not implemented +} + +//________________________________________________________________________ +void AliAnalysisTaskAODFilterBitQA::UserCreateOutputObjects() { + // Create histograms + // Called once + + // global switch disabling the reference + // (to avoid "Replacing existing TH1" if several wagons are created in train) + Bool_t oldStatus = TH1::AddDirectoryStatus(); + TH1::AddDirectory(kFALSE); + + // QA list + fListQA = new TList(); + fListQA->SetName("listQA"); + fListQA->SetOwner(); + + // QA histograms + 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); + fHistDCA[iTrackBit] = new TH2D(Form("Bit%d_DCA",iTrackBit),Form("Bit%d_DCA;DCA XY [AODtrack] (cm);DCA Z [AODtrack] (cm)",iTrackBit),100,-5.0,5.0,220,-11.0,11.0); + fHistDCAprop[iTrackBit] = new TH2D(Form("Bit%d_DCAprop",iTrackBit),Form("Bit%d_DCAprop;DCA XY [Propagated] (cm);DCA Z [Propagated] (cm)",iTrackBit),100,-5.0,5.0,220,-11.0,11.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(fHistDCA[iTrackBit]); + fListQA->Add(fHistDCAprop[iTrackBit]); + fListQA->Add(fHistChiClus[iTrackBit]); + } + + // Post output data. + PostData(1, fListQA); + + AliInfo("Finished setting up the Output"); + TH1::AddDirectory(oldStatus); +} + +//________________________________________________________________________ +void AliAnalysisTaskAODFilterBitQA::UserExec(Option_t *) { + // Main loop + // Called for each event + + AliVEvent* event = dynamic_cast(InputEvent()); + if(!event) { + AliError("event not available"); + return; + } + + + + // check event cuts + Double_t lMultiplicityVar = -1; + if((lMultiplicityVar = IsEventAccepted(event)) < 0){ + return; + } + + + // get the accepted tracks in main event + GetAcceptedTracks(event,lMultiplicityVar); + +} + +//________________________________________________________________________ +void AliAnalysisTaskAODFilterBitQA::FinishTaskOutput(){ + // Finish task output + // not implemented ... + +} + +//________________________________________________________________________ +void AliAnalysisTaskAODFilterBitQA::Terminate(Option_t *) { + // Draw result to the screen + // Called once at the end of the query + // not implemented ... + +} + + +//________________________________________________________________________ +Double_t AliAnalysisTaskAODFilterBitQA::IsEventAccepted(AliVEvent *event){ + // 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; + TString fCentralityEstimator = "V0M"; + + Float_t gCentrality = -1.; + const AliVVertex *vertex = event->GetPrimaryVertex(); + + if(vertex) { + Double32_t fCov[6]; + vertex->GetCovarianceMatrix(fCov); + if(vertex->GetNContributors() > 0) { + if(fCov[5] != 0) { + if(TMath::Abs(vertex->GetX()) < fVxMax) { + if(TMath::Abs(vertex->GetY()) < fVyMax) { + if(TMath::Abs(vertex->GetZ()) < fVzMax) { + + // get the reference multiplicty or centrality + AliAODHeader *header = (AliAODHeader*) event->GetHeader(); + gCentrality = header->GetCentralityP()->GetCentralityPercentile(fCentralityEstimator.Data()); + + if((gCentrality > fCentralityPercentileMin) && (gCentrality < fCentralityPercentileMax)){ + + return gCentrality; + + }//centrality range + }//Vz cut + }//Vy cut + }//Vx cut + }//proper vertex resolution + }//proper number of contributors + }//vertex object valid + + // in all other cases return -1 (event not accepted) + return -1; +} + +//________________________________________________________________________ +void AliAnalysisTaskAODFilterBitQA::GetAcceptedTracks(AliVEvent *event, Double_t gCentrality){ + // Checks track cuts (filter bits) + // Fills QA histograms + + + Short_t vCharge; + Double_t vEta; + Double_t vY; + Double_t vPhi; + Double_t vPt; + Double_t vDCAxy; + Double_t vDCAz; + Double_t vDCApropxy; + Double_t vDCApropz; + Double_t vChi2; + Double_t vClus; + + //for propagation to DCA + const AliVVertex *vertex = event->GetPrimaryVertex(); + Double_t field = event->GetMagneticField(); + Double_t b[2]; + Double_t bCov[3]; + + // Loop over tracks in event + for (Int_t iTracks = 0; iTracks < event->GetNumberOfTracks(); iTracks++) { + AliAODTrack* aodTrack = dynamic_cast(event->GetTrack(iTracks)); + if (!aodTrack) { + AliError(Form("Could not receive track %d", iTracks)); + continue; + } + + // track parameters + vCharge = aodTrack->Charge(); + vEta = aodTrack->Eta(); + vY = aodTrack->Y(); + vPhi = aodTrack->Phi();// * TMath::RadToDeg(); + vPt = aodTrack->Pt(); + vDCAxy = aodTrack->DCA(); + vDCAz = aodTrack->ZAtDCA(); + vChi2 = aodTrack->Chi2perNDF(); + vClus = aodTrack->GetTPCNcls(); + + // propagate again to DCA, use copy to propagate (in order not to overwrite track parameters) + AliAODTrack copy(*aodTrack); + if (copy.PropagateToDCA(vertex, field, 100., b, bCov) ) + { + vDCApropxy = b[0]; + vDCApropz = b[1]; + } + else + { + vDCApropxy = -999999; + vDCApropz = -999999; + } + + // AOD track cuts + for(Int_t iTrackBit = 0; iTrackBit < gBitMax; iTrackBit++){ + fHistTrackStats->Fill(gCentrality,iTrackBit,aodTrack->TestFilterBit(1<TestFilterBit(1<Fill(vEta,vPhi,vPt); + fHistDCA[iTrackBit]->Fill(vDCAxy,vDCAz); + fHistDCAprop[iTrackBit]->Fill(vDCApropxy,vDCApropz); + fHistChiClus[iTrackBit]->Fill(vChi2,vClus); + } + + }//bit loop + }//track loop + + return; +} diff --git a/PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.h b/PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.h new file mode 100755 index 00000000000..ada6f4b81ef --- /dev/null +++ b/PWGCF/EBYE/BalanceFunctions/AliAnalysisTaskAODFilterBitQA.h @@ -0,0 +1,48 @@ +#ifndef ALIANALYSISTASKAODFILTERBITQA_H +#define ALIANALYSISTASKAODFILTERBITQA_H + +// Analysis task for the QA of AOD track filter bits +// Authors: m.weber@cern.ch + +#define gBitMax 16// number of maximum filter bits + +class TList; +class TH2D; +class TH3D; + +#include "AliAnalysisTaskSE.h" + +class AliAnalysisTaskAODFilterBitQA : public AliAnalysisTaskSE { + public: + AliAnalysisTaskAODFilterBitQA(const char *name = "AliAnalysisTaskAODFilterBitQA"); + virtual ~AliAnalysisTaskAODFilterBitQA(); + + virtual void UserCreateOutputObjects(); + virtual void UserExec(Option_t *option); + virtual void FinishTaskOutput(); + virtual void Terminate(Option_t *); + + private: + Double_t IsEventAccepted(AliVEvent *event); + void GetAcceptedTracks(AliVEvent *event, Double_t gCentrality); + + AliAnalysisTaskAODFilterBitQA(const AliAnalysisTaskAODFilterBitQA&); // not implemented + AliAnalysisTaskAODFilterBitQA& operator=(const AliAnalysisTaskAODFilterBitQA&); // not implemented + + + TList *fListQA;//output list for QA histograms + + 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* fHistDCA[gBitMax];//QA histograms for DCA (xy,z) for different filter bits + TH2D* fHistDCAprop[gBitMax];//QA histograms for DCA (xy,z) for different filter bits after PropagateToDCA + TH2D* fHistChiClus[gBitMax];//QA histograms for Chi2 and number of TPC clusters for different filter bits + + + + ClassDef(AliAnalysisTaskAODFilterBitQA, 0); // +}; + + + +#endif diff --git a/PWGCF/EBYE/macros/AddTaskAODFilterBitQA.C b/PWGCF/EBYE/macros/AddTaskAODFilterBitQA.C new file mode 100644 index 00000000000..281709c2ba6 --- /dev/null +++ b/PWGCF/EBYE/macros/AddTaskAODFilterBitQA.C @@ -0,0 +1,46 @@ +//_________________________________________________________// +AliAnalysisTaskAODFilterBitQA *AddTaskAODFilterBitQA(TString taskname = "AODFilterBitQA") { + // 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. + + //=========================================================================== + AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); + if (!mgr) { + ::Error("AddTaskBalancePsiCentralityTrain", "No analysis manager to connect to."); + return NULL; + } + + // Check the analysis type using the event handlers connected to the analysis manager. + //=========================================================================== + if (!mgr->GetInputEventHandler()) { + ::Error("AddTaskAODFilterBitQA", "This task requires an input event handler"); + return NULL; + } + TString analysisType = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD" + + if (analysisType!="AOD"){ + ::Error("AddTaskAODFilterBitQA", "analysis type NOT AOD --> makes no sense!"); + return NULL; + } + + // Create the task, add it to manager and configure it. + //=========================================================================== + AliAnalysisTaskAODFilterBitQA *taskAODFilterBitQA = new AliAnalysisTaskAODFilterBitQA(Form("%s",taskname.Data())); + + taskAODFilterBitQA->SelectCollisionCandidates(AliVEvent::kMB | AliVEvent::kCentral | AliVEvent::kSemiCentral); + + mgr->AddTask(taskAODFilterBitQA); + + + // Create ONLY the output containers for the data produced by the task. + // Get and connect other common input/output containers via the manager as below + //============================================================================== + TString outputFileName = AliAnalysisManager::GetCommonFileName(); + outputFileName += ":PWGCFEbyE.outputFilterBitQA"; + AliAnalysisDataContainer *coutAODFilterBitQA = mgr->CreateContainer(Form("list_%s",taskname.Data()), TList::Class(),AliAnalysisManager::kOutputContainer,outputFileName.Data()); + + mgr->ConnectInput(taskAODFilterBitQA, 0, mgr->GetCommonInputContainer()); + mgr->ConnectOutput(taskAODFilterBitQA, 1, coutAODFilterBitQA); + + return taskAODFilterBitQA; +} diff --git a/PWGCF/PWGCFebyeLinkDef.h b/PWGCF/PWGCFebyeLinkDef.h index 9538d23c144..f617d147df9 100644 --- a/PWGCF/PWGCFebyeLinkDef.h +++ b/PWGCF/PWGCFebyeLinkDef.h @@ -17,6 +17,7 @@ #pragma link C++ class AliAnalysisTaskEfficiencyBFPsi+; #pragma link C++ class AliAnalysisTaskEffContBF+; #pragma link C++ class AliAnalysisTaskToyModel+; +#pragma link C++ class AliAnalysisTaskAODFilterBitQA+; #pragma link C++ class AliAnalysisTaskLRC+; #pragma link C++ class AliLRCAnalysis+; -- 2.43.5