From 1076dc912e4de8553258635525b246778ae8cfb1 Mon Sep 17 00:00:00 2001 From: Constantin Loizides Date: Sun, 8 Dec 2013 06:53:11 +0100 Subject: [PATCH] Propagation on AOD (Marta) --- PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx | 137 ++++++++++++++++++ PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.h | 42 ++++++ .../macros/AddTaskEmcalTrackPropagatorAOD.C | 48 ++++++ 3 files changed, 227 insertions(+) create mode 100644 PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx create mode 100644 PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.h create mode 100644 PWG/EMCAL/macros/AddTaskEmcalTrackPropagatorAOD.C diff --git a/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx b/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx new file mode 100644 index 00000000000..e74fe5c5fe9 --- /dev/null +++ b/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx @@ -0,0 +1,137 @@ +// $Id$ +// +// Task to propagate AOD tracks to EMCAL surface. +// +// Author: C.Loizides + +#include +#include "AliAnalysisManager.h" +#include "AliEMCALRecoUtils.h" +#include "AliAODEvent.h" +#include "AliAODTrack.h" +#include "AliExternalTrackParam.h" +#include "AliEmcalTrackPropagatorTaskAOD.h" + +ClassImp(AliEmcalTrackPropagatorTaskAOD) + +//________________________________________________________________________ +AliEmcalTrackPropagatorTaskAOD::AliEmcalTrackPropagatorTaskAOD() : + AliAnalysisTaskSE("AliEmcalTrackPropagatorTaskAOD"), + fRecoUtils(0), + fTracksName(), + fDist(430), + fMinPtCut(0.35), + fAodEv(0), + fTracks(0) +{ + // Constructor. +} + +//________________________________________________________________________ +AliEmcalTrackPropagatorTaskAOD::AliEmcalTrackPropagatorTaskAOD(const char *name) : + AliAnalysisTaskSE("AliEmcalTrackPropagatorTaskAOD"), + fRecoUtils(0), + fTracksName("TpcSpdVertexConstrainedTracks"), + fDist(430), + fMinPtCut(0.35), + fAodEv(0), + fTracks(0) +{ + // Constructor. + + if (!name) + return; + + SetName(name); + + // fBranchNames = "ESD:AliESDHeader.,Tracks"; +} + +//________________________________________________________________________ +AliEmcalTrackPropagatorTaskAOD::~AliEmcalTrackPropagatorTaskAOD() +{ + // Destructor. + + delete fRecoUtils; +} + +//________________________________________________________________________ +void AliEmcalTrackPropagatorTaskAOD::UserCreateOutputObjects() +{ + // Create histograms. + + if (!fRecoUtils) { + fRecoUtils = new AliEMCALRecoUtils; + fRecoUtils->SetStep(20); + AliInfo("No reco utils given, creating default utils"); + } +} + +//________________________________________________________________________ +void AliEmcalTrackPropagatorTaskAOD::UserExec(Option_t *) +{ + // Main loop, called for each event. + + fAodEv = dynamic_cast(InputEvent()); + if (!fAodEv) { + AliError("Task works only on AOD events, returning"); + return; + } + + AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager(); + if (!am) { + AliError("Manager zero, returning"); + return; + } + + // get tracks from event if not yet there + if (fTracksName == "tracks") + am->LoadBranch("tracks"); + fTracks = dynamic_cast((InputEvent()->FindListObject(fTracksName))); + if (!fTracks) { + AliError(Form("Could not get tracks %s, returning", fTracksName.Data())); + return; + } + + // Loop over all tracks + const Int_t ntr = fTracks->GetEntries(); + for (Int_t i=0; i(fTracks->At(i)); + if (!aodTrack) + continue; + aodTrack->ResetStatus(AliVTrack::kEMCALmatch); //MV: necessary? + if(aodTrack->Pt()Phi()*TMath::RadToDeg(); + if (TMath::Abs(aodTrack->Eta())>0.9 || phi <= 10 || phi >= 250) + continue; + + Double_t xyz[3], pxpypz[3], cv[21]; + aodTrack->PxPyPz(pxpypz); + aodTrack->XvYvZv(xyz); + aodTrack->GetCovarianceXYZPxPyPz(cv); + AliExternalTrackParam *trackParam = new AliExternalTrackParam(xyz,pxpypz,cv,aodTrack->Charge()); + // AliExternalTrackParam *trackParam = const_cast(eTrack->GetInnerParam()); MV: note, not taking InnerParam in AOD, not available + if(!trackParam) + continue; + + // Extrapolate the track to EMCal surface + AliExternalTrackParam emcalParam(*trackParam); + Float_t etaout=-999, phiout=-999, ptout=-999; + Bool_t ret = fRecoUtils->ExtrapolateTrackToEMCalSurface(&emcalParam, + fDist, + aodTrack->M(), + fRecoUtils->GetStepSurface(), + etaout, + phiout, + ptout); + if (!ret) + continue; + if (TMath::Abs(etaout)>0.75 || (phiout<70*TMath::DegToRad()) || (phiout>190*TMath::DegToRad())) + continue; + aodTrack->SetTrackPhiEtaPtOnEMCal(phiout, etaout, ptout); + aodTrack->SetStatus(AliVTrack::kEMCALmatch); + + delete trackParam; + } +} diff --git a/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.h b/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.h new file mode 100644 index 00000000000..b79ef64029e --- /dev/null +++ b/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.h @@ -0,0 +1,42 @@ +#ifndef ALIEMCALTRACKPROPAGATORTASKAOD_H +#define ALIEMCALTRACKPROPAGATORTASKAOD_H + +// $Id$ + +class TClonesArray; +class AliEMCALRecoUtils; +class AliAODEvent; +class AliAODtrack; + +#include "AliAnalysisTaskSE.h" + +class AliEmcalTrackPropagatorTaskAOD : public AliAnalysisTaskSE { + public: + AliEmcalTrackPropagatorTaskAOD(); + AliEmcalTrackPropagatorTaskAOD(const char *name); + virtual ~AliEmcalTrackPropagatorTaskAOD(); + + void UserCreateOutputObjects(); + void UserExec(Option_t *option); + + void SetDist(Double_t d) { fDist = d; } + void SetMinPt(Double_t pt) { fMinPtCut = pt; } + void SetRecoUtils(AliEMCALRecoUtils *ru) { fRecoUtils = ru; } + void SetTracksName(const char *name) { fTracksName = name; } + + protected: + AliEMCALRecoUtils *fRecoUtils; // esd reco utils + TString fTracksName; // name of tracks + Double_t fDist; // distance to surface (430cm default) + Double_t fMinPtCut; // minimum track pt cut (500 MeV/c default) + AliAODEvent *fAodEv; //!aod event + TClonesArray *fTracks; //!track array + + private: + AliEmcalTrackPropagatorTaskAOD(const AliEmcalTrackPropagatorTaskAOD&); // not implemented + AliEmcalTrackPropagatorTaskAOD &operator=(const AliEmcalTrackPropagatorTaskAOD&); // not implemented + + ClassDef(AliEmcalTrackPropagatorTaskAOD, 1); // Class to propagate and store track parameters at EMCAL surface +}; + +#endif diff --git a/PWG/EMCAL/macros/AddTaskEmcalTrackPropagatorAOD.C b/PWG/EMCAL/macros/AddTaskEmcalTrackPropagatorAOD.C new file mode 100644 index 00000000000..fb1970d2f06 --- /dev/null +++ b/PWG/EMCAL/macros/AddTaskEmcalTrackPropagatorAOD.C @@ -0,0 +1,48 @@ +// $Id$ + +AliEmcalTrackPropagatorTaskAOD* AddTaskEmcalTrackPropagatorAOD( + const char *name = "Tracks", + const Double_t d = -1, + const Double_t pt = -1 +) +{ + // Get the pointer to the existing analysis manager via the static access method. + //============================================================================== + AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager(); + if (!mgr) { + ::Error("AddTaskEmcalTrackPropagatorAOD", "No analysis manager to connect to."); + return NULL; + } + + // Check the analysis type using the event handlers connected to the analysis manager. + //============================================================================== + AliVEventHandler *evhand = mgr->GetInputEventHandler(); + if (!evhand) { + ::Error("AddTaskEmcalTrackPropagatorAOD", "This task requires an input event handler"); + return NULL; + } + + if (!evhand->InheritsFrom("AliAODInputHandler")) { + ::Info("AddTaskEmcalTrackPropagatorAOD", "This task is only needed for AOD analysis. No task added."); + return NULL; + } + + //------------------------------------------------------- + // Init the task and do settings + //------------------------------------------------------- + AliEmcalTrackPropagatorTaskAOD* propagator = new AliEmcalTrackPropagatorTaskAOD(); + propagator->SetTracksName(name); + if (d > -1) propagator->SetDist(d); + if (pt > -1) propagator->SetMinPt(pt); + + //------------------------------------------------------- + // Final settings, pass to manager and set the containers + //------------------------------------------------------- + mgr->AddTask(propagator); + + // Create containers for input/output + AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer() ; + mgr->ConnectInput (propagator, 0, cinput1 ); + + return propagator; +} -- 2.43.5