]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG4/UserTasks/EmcalTasks/AliEmcalEsdTpcTrackTask.cxx
rule checker
[u/mrichter/AliRoot.git] / PWG4 / UserTasks / EmcalTasks / AliEmcalEsdTpcTrackTask.cxx
1 // $Id$
2 //
3 // Task to constrain TPC tracks to vertex
4 //
5 //
6
7 #include <TClonesArray.h>
8 #include <TGeoGlobalMagField.h>
9 #include "AliAnalysisManager.h"
10 #include "AliESDEvent.h"
11 #include "AliESDtrackCuts.h"
12 #include "AliEmcalEsdTpcTrackTask.h"
13 #include "AliMagF.h"
14
15 ClassImp(AliEmcalEsdTpcTrackTask)
16
17 //________________________________________________________________________
18 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask() : 
19   AliAnalysisTaskSE(),
20   fEsdTrackCuts(0),
21   fTracksName(),
22   fEsdEv(0),
23   fTracks(0)
24 {
25   // Constructor
26 }
27
28 //________________________________________________________________________
29 AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask(const char *name) : 
30   AliAnalysisTaskSE(name),
31   fEsdTrackCuts(0),
32   fTracksName("TpcSpdVertexConstrainedTracks"),
33   fEsdEv(0),
34   fTracks(0)
35 {
36   // Constructor
37   fBranchNames = "ESD:SPDVertex.,Tracks";
38 }
39
40 //________________________________________________________________________
41 AliEmcalEsdTpcTrackTask::~AliEmcalEsdTpcTrackTask()
42 {
43   //Destructor
44
45   delete fEsdTrackCuts;
46 }
47
48 //________________________________________________________________________
49 void AliEmcalEsdTpcTrackTask::UserCreateOutputObjects()
50 {
51   // Create histograms
52
53   fTracks = new TClonesArray("AliESDtrack");
54   fTracks->SetName(fTracksName);
55
56   if (!fEsdTrackCuts) {
57     AliInfo("No track cuts given, creating default cuts");
58     fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts();
59     fEsdTrackCuts->SetPtRange(0.15,1e3);
60   }
61 }
62
63 //________________________________________________________________________
64 void AliEmcalEsdTpcTrackTask::UserExec(Option_t *) 
65 {
66   // Main loop, called for each event.
67
68   fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent());
69   if (!fEsdEv) {
70     AliError("Task works only on ESD events, returning");
71     return;
72   }
73
74   AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
75   if (!am) {
76     AliError("Manager zero, returning");
77     return;
78   }
79
80   // add tracks to event if not yet there
81   if (!(InputEvent()->FindListObject(fTracksName)))
82     InputEvent()->AddObject(fTracks);
83
84   am->LoadBranch("AliESDRun.");
85   am->LoadBranch("AliESDHeader.");
86   if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map
87     const AliESDRun *erun = fEsdEv->GetESDRun();
88     AliMagF *field = AliMagF::CreateFieldMap(erun->GetCurrentL3(),
89                                              erun->GetCurrentDip(),
90                                              AliMagF::kConvLHC,
91                                              kFALSE,
92                                              erun->GetBeamEnergy(),
93                                              erun->GetBeamType());
94     TGeoGlobalMagField::Instance()->SetField(field);
95   }
96
97   am->LoadBranch("SPDVertex.");
98   const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD();
99   if (!vtxSPD) {
100     AliError("No SPD vertex, returning");
101     return;
102   }
103
104   am->LoadBranch("Tracks");
105   Int_t ntr = fEsdEv->GetNumberOfTracks();
106   for (Int_t i=0, ntrnew=0; i<ntr; ++i) {
107     AliESDtrack *etrack = fEsdEv->GetTrack(i);
108     if (!etrack)
109       continue;
110     if (!fEsdTrackCuts->AcceptTrack(etrack))
111       continue;
112
113     AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID());
114     if (!ntrack)
115       continue;
116     if (ntrack->Pt()<=0) {
117       delete ntrack;
118       continue;
119     }
120
121     Double_t bfield[3] = {0,0,0};
122     ntrack->GetBxByBz(bfield);
123     AliExternalTrackParam exParam;
124     Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam);
125     if (!relate) {
126       delete ntrack;
127       continue;
128     }
129
130     // set the constraint parameters to the track
131     ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
132
133     if (ntrack->Pt()<=0) {
134       delete ntrack;
135       continue;
136     }
137
138     new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack);
139     delete ntrack;
140   }
141 }