From 9a281e83c3337243d3cdf214a1af26667e8875b8 Mon Sep 17 00:00:00 2001 From: abercuci Date: Wed, 18 Feb 2009 12:23:37 +0000 Subject: [PATCH] new task to check TRD tracking performances at ESD-MC (only) level. - No friend information is used - analysis based on ESD reconstruction bit map --- TRD/TRDqaRecLinkDef.h | 7 +- TRD/qaRec/AliTRDcheckESD.cxx | 238 +++++++++++++++++++++++++++++++++++ TRD/qaRec/AliTRDcheckESD.h | 54 ++++++++ TRD/qaRec/run.C | 10 +- 4 files changed, 304 insertions(+), 5 deletions(-) create mode 100644 TRD/qaRec/AliTRDcheckESD.cxx create mode 100644 TRD/qaRec/AliTRDcheckESD.h diff --git a/TRD/TRDqaRecLinkDef.h b/TRD/TRDqaRecLinkDef.h index 22b9a73b0c1..ecdb004b177 100644 --- a/TRD/TRDqaRecLinkDef.h +++ b/TRD/TRDqaRecLinkDef.h @@ -11,18 +11,19 @@ #pragma link C++ class AliTRDeventInfo+; #pragma link C++ class AliTRDtrackInfo::AliESDinfo+; #pragma link C++ class AliTRDtrackInfo::AliMCinfo+; +#pragma link C++ class AliTRDcheckESD+; #pragma link C++ class AliTRDtrackInfoGen+; #pragma link C++ class AliTRDrecoTask+; #pragma link C++ class AliTRDcheckDetector+; #pragma link C++ class AliTRDtrackingResolution+; #pragma link C++ class AliTRDtrackingEfficiency+; #pragma link C++ class AliTRDtrackingEfficiencyCombined+; -#pragma link C++ class AliTRDalignmentTask+; -#pragma link C++ class AliTRDcalibration+; #pragma link C++ class AliTRDpidChecker+; -#pragma link C++ class AliTRDpidRefMaker+; // reconstruction calibration tasks #pragma link C++ class AliTRDclusterResolution+; +#pragma link C++ class AliTRDalignmentTask+; +#pragma link C++ class AliTRDcalibration+; +#pragma link C++ class AliTRDpidRefMaker+; #endif diff --git a/TRD/qaRec/AliTRDcheckESD.cxx b/TRD/qaRec/AliTRDcheckESD.cxx new file mode 100644 index 00000000000..752061a83e6 --- /dev/null +++ b/TRD/qaRec/AliTRDcheckESD.cxx @@ -0,0 +1,238 @@ +/************************************************************************** +* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * +* * +* Author: The ALICE Off-line Project. * +* Contributors are mentioned in the code where appropriate. * +* * +* Permission to use, copy, modify and distribute this software and its * +* documentation strictly for non-commercial purposes is hereby granted * +* without fee, provided that the above copyright notice appears in all * +* copies and that both the copyright notice and this permission notice * +* appear in the supporting documentation. The authors make no claims * +* about the suitability of this software for any purpose. It is * +* provided "as is" without express or implied warranty. * +**************************************************************************/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AliLog.h" +#include "AliAnalysisManager.h" +#include "AliESDEvent.h" +#include "AliMCEvent.h" +#include "AliESDInputHandler.h" +#include "AliMCEventHandler.h" + +#include "AliESDtrack.h" +#include "AliMCParticle.h" +#include "AliPID.h" +#include "AliStack.h" +#include "AliTrackReference.h" +#include "AliTRDgeometry.h" + +#include "AliTRDcheckESD.h" + +ClassImp(AliTRDcheckESD) + +const Float_t AliTRDcheckESD::xTPC = 290.; +const Float_t AliTRDcheckESD::xTOF = 365.; + +//____________________________________________________________________ +AliTRDcheckESD::AliTRDcheckESD(): + AliAnalysisTask("ESDchecker", "TRD checker @ ESD level") + ,fStatus(0) + ,fESD(0x0) + ,fMC(0x0) + ,fHistos(0x0) +{ + // + // Default constructor + // + + DefineInput(0, TChain::Class()); + DefineOutput(0, TObjArray::Class()); +} + +//____________________________________________________________________ +AliTRDcheckESD::~AliTRDcheckESD() +{ + if(fHistos){ + //fHistos->Delete(); + delete fHistos; + } +} + +//____________________________________________________________________ +void AliTRDcheckESD::ConnectInputData(Option_t *) +{ + // + // Link the Input Data + // + TTree *tree = dynamic_cast(GetInputData(0)); + if(tree) tree->SetBranchStatus("Tracks", 1); + + AliESDInputHandler *esdH = dynamic_cast(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()); + fESD = esdH ? esdH->GetEvent() : 0x0; + + if(!HasMC()) return; + AliMCEventHandler *mcH = dynamic_cast(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler()); + fMC = mcH ? mcH->MCEvent() : 0x0; +} + +//____________________________________________________________________ +void AliTRDcheckESD::CreateOutputObjects() +{ + // + // Create Output Containers (TObjectArray containing 1D histograms) + // + OpenFile(0, "RECREATE"); + fHistos = new TObjArray(5); + //fHistos->SetOwner(kTRUE); + + TH1 *h = 0x0; + + // clusters per tracklet + if(!(h = (TH1I*)gROOT->FindObject("hNCl"))){ + h = new TH1I("hNCl", "Clusters per TRD track", 100, 0., 200.); + h->GetXaxis()->SetTitle("N_{cl}^{TRD}"); + h->GetYaxis()->SetTitle("entries"); + } else h->Reset(); + fHistos->AddAt(h, kNCl); + + // TPC out + if(!(h = (TH2I*)gROOT->FindObject("hTRDstat"))){ + h = new TH2I("hTRDstat", "TRD status bits", 100, 0., 20., 4, -.5, 3.5); + h->GetXaxis()->SetTitle("p_{T} [GeV/c]"); + h->GetYaxis()->SetTitle("status bits"); + h->GetZaxis()->SetTitle("entries"); + } else h->Reset(); + fHistos->AddAt(h, kTRDstat); +} + +//____________________________________________________________________ +void AliTRDcheckESD::Exec(Option_t *){ + // + // Run the Analysis + // + if(!fESD){ + AliError("ESD not found"); + return; + } + + // Get MC information if available + AliStack * fStack = 0x0; + if(HasMC() && !fMC){ + AliWarning("Monte Carlo Event not available"); + SetMC(kFALSE); + } else { + if(!(fStack = fMC->Stack())){ + AliWarning("Cannot get the Monte Carlo Stack"); + SetMC(kFALSE); + } + } + Bool_t TPCout(0), TRDin(0), TRDout(0), TRDpid(0); + + + Int_t nTRD = 0, nTPC = 0; + //Int_t nTracks = fESD->GetNumberOfTracks(); + AliESDtrack *esdTrack = 0x0; + for(Int_t itrk = 0; itrk < fESD->GetNumberOfTracks(); itrk++){ + TPCout=0;TRDin=0;TRDout=0;TRDpid=0; + esdTrack = fESD->GetTrack(itrk); + if(esdTrack->GetNcls(1)) nTPC++; + if(esdTrack->GetNcls(2)) nTRD++; + + // track status + ULong_t status = esdTrack->GetStatus(); + + // TRD PID + Double_t p[AliPID::kSPECIES]; esdTrack->GetTRDpid(p); + // pid quality + esdTrack->GetTRDpidQuality(); + // kink index + esdTrack->GetKinkIndex(0); + // TPC clusters + esdTrack->GetNcls(1); + + // look at external track param + const AliExternalTrackParam *op = esdTrack->GetOuterParam(); + Double_t xyz[3]; + if(op){ + op->GetXYZ(xyz); + op->Global2LocalPosition(xyz, op->GetAlpha()); + //printf("op @ X[%7.3f]\n", xyz[0]); + } + + // read MC info + if(!HasMC()) continue; + + Int_t fLabel = esdTrack->GetLabel(); + if(TMath::Abs(fLabel) > fStack->GetNtrack()) continue; + + // read MC particle + AliMCParticle *mcParticle = 0x0; + if(!(mcParticle = fMC->GetTrack(TMath::Abs(fLabel)))){ + AliWarning(Form("MC particle missing for ESD fLabel %d.", fLabel)); + continue; + } + + AliTrackReference *ref = 0x0; + Int_t nRefs = mcParticle->GetNumberOfTrackReferences(); + Int_t iref = 0; + while(irefGetTrackReference(iref); + if(ref->LocalX() > xTPC) break; + ref=0x0; iref++; + } + + // read TParticle + TParticle *tParticle = mcParticle->Particle(); + Int_t fPdg = tParticle->GetPdgCode(); + //tParticle->IsPrimary(); + + //printf("[%c] ref[%2d]=", tParticle->IsPrimary() ? 'P' : 'S', iref); + + TPCout=1; + if(ref){ + if(ref->LocalX() > xTOF){ + //printf(" TOF ["); + ref = mcParticle->GetTrackReference(iref-1); + } else { + //printf("%7.2f [", ref->LocalX()); + TRDin=1; + if(esdTrack->GetNcls(2)) TRDout=1; + if(esdTrack->GetTRDpidQuality()) TRDpid=1; + } + } else { + //printf(" TPC ["); + ref = mcParticle->GetTrackReference(iref-1); + } + Float_t pt = ref->Pt(); + //printf("%f]\n", pt); + + TH2 *h = (TH2I*)fHistos->At(kTRDstat); + if(/*status & AliESDtrack::k*/TPCout) h->Fill(pt, 0); + if(/*status & AliESDtrack::k*/TRDin) h->Fill(pt, 1); + if(/*status & AliESDtrack::k*/TRDout){ + ((TH1*)fHistos->At(kNCl))->Fill(esdTrack->GetNcls(2)); + h->Fill(pt, 2); + } + if(/*status & AliESDtrack::k*/TRDpid) h->Fill(pt, 3); + } + + PostData(0, fHistos); +} + + +//____________________________________________________________________ +void AliTRDcheckESD::Terminate(Option_t *) +{ +} diff --git a/TRD/qaRec/AliTRDcheckESD.h b/TRD/qaRec/AliTRDcheckESD.h new file mode 100644 index 00000000000..7f617f13aa1 --- /dev/null +++ b/TRD/qaRec/AliTRDcheckESD.h @@ -0,0 +1,54 @@ +#ifndef AliTRDcheckESD_H +#define AliTRDcheckESD_H +/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + +/* $Id: AliTRDcheckESD.h 27496 2008-07-22 08:35:45Z cblume $ */ + +//////////////////////////////////////////////////////////////////////////// +// // +// Reconstruction QA // +// // +//////////////////////////////////////////////////////////////////////////// + +#ifndef ALIANALYSISTASK_H +#include "AliAnalysisTask.h" +#endif + +class AliESDEvent; +class AliMCEvent; +class TObjArray; +class AliTRDcheckESD : public AliAnalysisTask { +public: + enum ETRDcheckESDstatus { + kMC = BIT(0) + }; + enum ETRDcheckESDhistos { + kNCl = 0 // number of clusters per track + ,kTRDstat = 2 // TRD tracks status + }; + AliTRDcheckESD(); + virtual ~AliTRDcheckESD(); + + void ConnectInputData(Option_t *); + void CreateOutputObjects(); + + Bool_t HasMC() const { return TESTBIT(fStatus, kMC);} + + void Exec(Option_t *); + void SetMC(Bool_t mc = kTRUE) { mc ? SETBIT(fStatus, kMC) : CLRBIT(fStatus, kMC);} + void Terminate(Option_t *); + + static const Float_t xTPC; + static const Float_t xTOF; + +private: + AliTRDcheckESD(const AliTRDcheckESD&); + AliTRDcheckESD& operator=(const AliTRDcheckESD&); + Int_t fStatus; // bit mask for controlling the task + AliESDEvent *fESD; // ESD event + AliMCEvent *fMC; // MC event + TObjArray *fHistos; // QA histos + ClassDef(AliTRDcheckESD, 1) // user oriented TRD analysis based on ESD-MC data +}; +#endif diff --git a/TRD/qaRec/run.C b/TRD/qaRec/run.C index 8841fc3bcea..5bf0dd79fbf 100644 --- a/TRD/qaRec/run.C +++ b/TRD/qaRec/run.C @@ -59,6 +59,7 @@ #include "TRD/AliTRDtrackerV1.h" #include "TRD/AliTRDcalibDB.h" #include "TRD/qaRec/AliTRDtrackInfo/AliTRDeventInfo.h" +#include "TRD/qaRec/AliTRDcheckESD.h" #include "TRD/qaRec/AliTRDtrackInfoGen.h" #include "TRD/qaRec/AliTRDtrackingEfficiency.h" #include "TRD/qaRec/AliTRDtrackingEfficiencyCombined.h" @@ -176,14 +177,19 @@ void run(Char_t *tasks="ALL", const Char_t *files=0x0) if(fHasMCdata) mgr->SetMCtruthEventHandler(mcH = new AliMCEventHandler()); //mgr->SetDebugLevel(10); + //____________________________________________ + // TRD check ESD + AliTRDcheckESD *checkESD = new AliTRDcheckESD(); + mgr->AddTask(checkESD); + checkESD->SetMC(fHasMCdata); + mgr->ConnectInput(checkESD, 0, mgr->GetCommonInputContainer()); mgr->ConnectOutput(checkESD, 0, mgr->CreateContainer(checkESD->GetName(), TObjArray::Class(), AliAnalysisManager::kOutputContainer, Form("TRD.Task%s.root", checkESD->GetName()))); + //____________________________________________ // TRD track summary generator mgr->AddTask(task = new AliTRDtrackInfoGen()); taskPtr[(Int_t)kInfoGen] = task; task->SetDebugLevel(0); task->SetMCdata(fHasMCdata); - // Create containers for input/output - //AliAnalysisDataContainer *cinput1 = mgr->CreateContainer("data", TChain::Class(), AliAnalysisManager::kInputContainer); mgr->ConnectInput( task, 0, mgr->GetCommonInputContainer()); AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("trackInfo", TObjArray::Class(), AliAnalysisManager::kExchangeContainer); AliAnalysisDataContainer *coutput1a = mgr->CreateContainer("eventInfo", AliTRDeventInfo::Class(), AliAnalysisManager::kExchangeContainer); -- 2.39.3