propagator and setup task
[u/mrichter/AliRoot.git] / PWG4 / UserTasks / EmcalTasks / AliEmcalTrackPropagatorTask.cxx
1 // $Id$
2 //
3 // Task to propagate tracks to EMCAL surface.
4 //
5 //
6
7 #include <TClonesArray.h>
8 #include "AliAnalysisManager.h"
9 #include "AliEMCALRecoUtils.h"
10 #include "AliESDEvent.h"
11 #include "AliEmcalTrackPropagatorTask.h"
12
13 ClassImp(AliEmcalTrackPropagatorTask)
14
15 //________________________________________________________________________
16 AliEmcalTrackPropagatorTask::AliEmcalTrackPropagatorTask() : 
17   AliAnalysisTaskSE(),
18   fRecoUtils(0),
19   fTracksName(),
20   fDist(430),
21   fMinPtCut(0.5),
22   fEsdEv(0),
23   fTracks(0)
24 {
25   // Constructor.
26 }
27
28 //________________________________________________________________________
29 AliEmcalTrackPropagatorTask::AliEmcalTrackPropagatorTask(const char *name) : 
30   AliAnalysisTaskSE(name),
31   fRecoUtils(0),
32   fTracksName("TpcSpdVertexConstrainedTracks"),
33   fDist(430),
34   fMinPtCut(0.5),
35   fEsdEv(0),
36   fTracks(0)
37 {
38   // Constructor.
39   fBranchNames = "ESD:AliESDHeader.,Tracks";
40 }
41
42 //________________________________________________________________________
43 AliEmcalTrackPropagatorTask::~AliEmcalTrackPropagatorTask()
44 {
45   //Destructor.
46
47   delete fRecoUtils;
48 }
49
50 //________________________________________________________________________
51 void AliEmcalTrackPropagatorTask::UserCreateOutputObjects()
52 {
53   // Create histograms.
54
55   if (!fRecoUtils) {
56     fRecoUtils = new AliEMCALRecoUtils;
57     fRecoUtils->SetStep(25);
58     AliInfo("No reoc utils given, creating default utils");
59   }
60 }
61
62 //________________________________________________________________________
63 void AliEmcalTrackPropagatorTask::UserExec(Option_t *) 
64 {
65   // Main loop, called for each event.
66
67   fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
68   if (!fEsdEv) {
69     AliError("Task works only on ESD events, returning");
70     return;
71   }
72
73   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
74   if (!am) {
75     AliError("Manager zero, returning");
76     return;
77   }
78
79   // get tracks from event if not yet there
80   if (fTracksName == "Tracks")
81     am->LoadBranch("Tracks");
82   fTracks = dynamic_cast<TClonesArray*>((InputEvent()->FindListObject(fTracksName)));
83   if (!fTracks) {
84     AliError(Form("Could not get tracks %s, returning", fTracksName.Data()));
85     return;
86   }
87
88   // Loop over all tracks
89   const Int_t ntr = fTracks->GetEntries();
90   for (Int_t i=0; i<ntr; ++i) {
91     AliESDtrack *eTrack = static_cast<AliESDtrack*>(fTracks->At(i));
92     if (!eTrack)
93       continue;
94     if(eTrack->Pt()<fMinPtCut) 
95       continue;
96     Double_t phi = eTrack->Phi()*TMath::RadToDeg();
97     if (TMath::Abs(eTrack->Eta())>0.8 || phi <= 20 || phi >= 240) 
98       continue;
99     AliExternalTrackParam *trackParam =  const_cast<AliExternalTrackParam*>(eTrack->GetInnerParam());
100     if(!trackParam) 
101       continue;
102
103     // Extrapolate the track to EMCal surface
104     AliExternalTrackParam emcalParam(*trackParam);
105     Float_t etaout=0, phiout=0;
106     Bool_t ret = fRecoUtils->ExtrapolateTrackToEMCalSurface(&emcalParam, 
107                                                             fDist, 
108                                                             fRecoUtils->GetMass(), 
109                                                             fRecoUtils->GetStepSurface(), 
110                                                             etaout, 
111                                                             phiout);
112     if (!ret)
113       continue;
114     eTrack->SetOuterParam(&emcalParam,AliExternalTrackParam::kMultSec);
115   }
116 }