]>
Commit | Line | Data |
---|---|---|
cc2b5fb5 | 1 | // $Id$ |
b0a53615 | 2 | // |
a93ef37c | 3 | // Task to constrain TPC tracks to SPD vertex. |
b0a53615 | 4 | // |
5 | // | |
cc2b5fb5 | 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), | |
57184cc6 | 21 | fHybridTrackCuts(0), |
cc2b5fb5 | 22 | fTracksName(), |
23 | fEsdEv(0), | |
24 | fTracks(0) | |
25 | { | |
a93ef37c | 26 | // Constructor. |
cc2b5fb5 | 27 | } |
28 | ||
29 | //________________________________________________________________________ | |
30 | AliEmcalEsdTpcTrackTask::AliEmcalEsdTpcTrackTask(const char *name) : | |
31 | AliAnalysisTaskSE(name), | |
32 | fEsdTrackCuts(0), | |
57184cc6 | 33 | fHybridTrackCuts(0), |
cc2b5fb5 | 34 | fTracksName("TpcSpdVertexConstrainedTracks"), |
35 | fEsdEv(0), | |
36 | fTracks(0) | |
37 | { | |
a93ef37c | 38 | // Constructor. |
39 | fBranchNames = "ESD:AliESDHeader.,AliESDRun.,SPDVertex.,Tracks"; | |
cc2b5fb5 | 40 | } |
41 | ||
42 | //________________________________________________________________________ | |
43 | AliEmcalEsdTpcTrackTask::~AliEmcalEsdTpcTrackTask() | |
44 | { | |
45 | //Destructor | |
46 | ||
47 | delete fEsdTrackCuts; | |
48 | } | |
49 | ||
50 | //________________________________________________________________________ | |
51 | void AliEmcalEsdTpcTrackTask::UserCreateOutputObjects() | |
52 | { | |
a93ef37c | 53 | // Create histograms. |
cc2b5fb5 | 54 | |
55 | fTracks = new TClonesArray("AliESDtrack"); | |
56 | fTracks->SetName(fTracksName); | |
57 | ||
58 | if (!fEsdTrackCuts) { | |
59 | AliInfo("No track cuts given, creating default cuts"); | |
60 | fEsdTrackCuts = AliESDtrackCuts::GetStandardTPCOnlyTrackCuts(); | |
61 | fEsdTrackCuts->SetPtRange(0.15,1e3); | |
62 | } | |
63 | } | |
64 | ||
65 | //________________________________________________________________________ | |
66 | void AliEmcalEsdTpcTrackTask::UserExec(Option_t *) | |
67 | { | |
68 | // Main loop, called for each event. | |
69 | ||
70 | fEsdEv = dynamic_cast<AliESDEvent*>(InputEvent()); | |
71 | if (!fEsdEv) { | |
72 | AliError("Task works only on ESD events, returning"); | |
73 | return; | |
74 | } | |
75 | ||
76 | AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager(); | |
77 | if (!am) { | |
78 | AliError("Manager zero, returning"); | |
79 | return; | |
80 | } | |
81 | ||
82 | // add tracks to event if not yet there | |
83 | if (!(InputEvent()->FindListObject(fTracksName))) | |
84 | InputEvent()->AddObject(fTracks); | |
85 | ||
10d1f756 | 86 | if (!fHybridTrackCuts) { // contrain TPC tracks to SPD vertex |
57184cc6 | 87 | am->LoadBranch("AliESDRun."); |
88 | am->LoadBranch("AliESDHeader."); | |
89 | if (!TGeoGlobalMagField::Instance()->GetField()) { // construct field map | |
90 | fEsdEv->InitMagneticField(); | |
cc2b5fb5 | 91 | } |
92 | ||
57184cc6 | 93 | am->LoadBranch("SPDVertex."); |
94 | const AliESDVertex *vtxSPD = fEsdEv->GetPrimaryVertexSPD(); | |
95 | if (!vtxSPD) { | |
96 | AliError("No SPD vertex, returning"); | |
97 | return; | |
cc2b5fb5 | 98 | } |
99 | ||
57184cc6 | 100 | am->LoadBranch("Tracks"); |
101 | Int_t ntr = fEsdEv->GetNumberOfTracks(); | |
102 | for (Int_t i=0, ntrnew=0; i<ntr; ++i) { | |
103 | AliESDtrack *etrack = fEsdEv->GetTrack(i); | |
104 | if (!etrack) | |
105 | continue; | |
106 | if (!fEsdTrackCuts->AcceptTrack(etrack)) | |
107 | continue; | |
57184cc6 | 108 | AliESDtrack *ntrack = AliESDtrackCuts::GetTPCOnlyTrack(fEsdEv,etrack->GetID()); |
109 | if (!ntrack) | |
110 | continue; | |
111 | if (ntrack->Pt()<=0) { | |
112 | delete ntrack; | |
113 | continue; | |
114 | } | |
57184cc6 | 115 | Double_t bfield[3] = {0,0,0}; |
116 | ntrack->GetBxByBz(bfield); | |
117 | AliExternalTrackParam exParam; | |
118 | Bool_t relate = ntrack->RelateToVertexBxByBz(vtxSPD,bfield,kVeryBig,&exParam); | |
119 | if (!relate) { | |
120 | delete ntrack; | |
121 | continue; | |
122 | } | |
57184cc6 | 123 | // set the constraint parameters to the track |
124 | ntrack->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance()); | |
57184cc6 | 125 | if (ntrack->Pt()<=0) { |
126 | delete ntrack; | |
127 | continue; | |
128 | } | |
57184cc6 | 129 | new ((*fTracks)[ntrnew++]) AliESDtrack(*ntrack); |
cc2b5fb5 | 130 | delete ntrack; |
cc2b5fb5 | 131 | } |
132 | ||
10d1f756 | 133 | } else { // use hybrid track cuts |
57184cc6 | 134 | |
135 | am->LoadBranch("Tracks"); | |
136 | Int_t ntr = fEsdEv->GetNumberOfTracks(); | |
137 | for (Int_t i=0, ntrnew=0; i<ntr; ++i) { | |
138 | AliESDtrack *etrack = fEsdEv->GetTrack(i); | |
139 | if (!etrack) | |
140 | continue; | |
141 | if (fEsdTrackCuts->AcceptTrack(etrack)) { | |
142 | new ((*fTracks)[ntrnew]) AliESDtrack(*etrack); | |
143 | AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew)); | |
144 | newTrack->SetLabel(0); | |
145 | ++ntrnew; | |
146 | } else if (fHybridTrackCuts->AcceptTrack(etrack)) { | |
147 | if (etrack->GetConstrainedParam()) { | |
148 | new ((*fTracks)[ntrnew]) AliESDtrack(*etrack); | |
149 | AliESDtrack *newTrack = static_cast<AliESDtrack*>(fTracks->At(ntrnew)); | |
150 | ++ntrnew; | |
151 | const AliExternalTrackParam* constrainParam = etrack->GetConstrainedParam(); | |
152 | newTrack->Set(constrainParam->GetX(), | |
153 | constrainParam->GetAlpha(), | |
154 | constrainParam->GetParameter(), | |
155 | constrainParam->GetCovariance()); | |
156 | UInt_t status = etrack->GetStatus(); | |
157 | if ((status&AliESDtrack::kITSrefit)==0) | |
158 | newTrack->SetLabel(2); | |
159 | else | |
160 | newTrack->SetLabel(1); | |
161 | } | |
162 | } | |
163 | } | |
cc2b5fb5 | 164 | } |
165 | } |