]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Propagation on AOD (Marta)
authorConstantin Loizides <cloizides@lbl.gov>
Sun, 8 Dec 2013 05:53:11 +0000 (06:53 +0100)
committerConstantin Loizides <cloizides@lbl.gov>
Sun, 8 Dec 2013 05:53:11 +0000 (06:53 +0100)
PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx [new file with mode: 0644]
PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.h [new file with mode: 0644]
PWG/EMCAL/macros/AddTaskEmcalTrackPropagatorAOD.C [new file with mode: 0644]

diff --git a/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx b/PWG/EMCAL/AliEmcalTrackPropagatorTaskAOD.cxx
new file mode 100644 (file)
index 0000000..e74fe5c
--- /dev/null
@@ -0,0 +1,137 @@
+// $Id$
+//
+// Task to propagate AOD tracks to EMCAL surface.
+//
+// Author: C.Loizides
+
+#include <TClonesArray.h>
+#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<AliAODEvent*>(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<TClonesArray*>((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<ntr; ++i) {
+    AliAODTrack *aodTrack = static_cast<AliAODTrack*>(fTracks->At(i));
+    if (!aodTrack)
+      continue;
+    aodTrack->ResetStatus(AliVTrack::kEMCALmatch); //MV: necessary?
+    if(aodTrack->Pt()<fMinPtCut) 
+      continue;
+    Double_t phi = aodTrack->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<AliExternalTrackParam*>(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 (file)
index 0000000..b79ef64
--- /dev/null
@@ -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 (file)
index 0000000..fb1970d
--- /dev/null
@@ -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;
+}