]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/hough/AliL3HoughMerger.cxx
Added support for static libraries,
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughMerger.cxx
CommitLineData
3e87ef69 1// @(#) $Id$
2
b1886074 3// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
3e87ef69 4//*-- Copyright &copy ALICE HLT Group
a1855560 5
e06900d5 6#include "AliL3StandardIncludes.h"
7
a1855560 8#include "AliL3Logging.h"
b1886074 9#include "AliL3Transform.h"
a1855560 10#include "AliL3TrackArray.h"
11#include "AliL3HoughTrack.h"
12#include "AliL3HoughMerger.h"
13#include "AliL3HoughTransformer.h"
14
e06900d5 15#if GCCVERSION == 3
16using namespace std;
17#endif
18
b1886074 19//_____________________________________________________________
20// AliL3HoughMerger
21//
22// Patch merging class for Hough tracklets
23
a1855560 24ClassImp(AliL3HoughMerger)
25
26
27AliL3HoughMerger::AliL3HoughMerger()
28{
29 //Default constructor
a1855560 30}
31
32
0a86fbb7 33AliL3HoughMerger::AliL3HoughMerger(Int_t nsubsectors)
a1855560 34{
35 //Constructor
0a86fbb7 36 InitMerger(nsubsectors,"AliL3HoughTrack");
b1886074 37 Is2Global(kFALSE);
38 SetParameters(0.001,0.1,0.05);
a1855560 39}
40
41
42AliL3HoughMerger::~AliL3HoughMerger()
43{
b1886074 44
a1855560 45}
46
b1886074 47void AliL3HoughMerger::FillTracks(AliL3TrackArray *tracks,Int_t patch)
a1855560 48{
b1886074 49 if(tracks->GetNTracks()==0)
50 LOG(AliL3Log::kWarning,"AliL3HoughMerger::FillTracks","Track Array")
51 <<"Adding empty track array"<<ENDLOG;
52
53 GetInTracks(patch)->AddTracks(tracks,kFALSE);//Copy tracks
54 printf("Filling %d tracks to merger\n",tracks->GetNTracks());
a1855560 55}
56
b1886074 57void AliL3HoughMerger::SetParameters(Double_t maxkappa,Double_t maxpsi,Double_t maxphi0)
a1855560 58{
b1886074 59 fMaxKappa = maxkappa;
60 fMaxPsi = maxpsi;
61 fMaxPhi0 = maxphi0;
a1855560 62}
63
b1886074 64Bool_t AliL3HoughMerger::IsTrack(AliL3Track *innertrack,AliL3Track *outertrack)
a1855560 65{
b1886074 66 //Check if the tracks can be merged, called by the track merger
67
68 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)innertrack;
69 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)outertrack;
70
71 if( (!tr1->IsPoint()) || (!tr2->IsPoint()) ) return kFALSE;
72 if(abs(tr1->GetEtaIndex() - tr2->GetEtaIndex()) > 1) return kFALSE;
73 if(tr1->GetCharge() != tr2->GetCharge()) return kFALSE;
74 if(fabs(tr1->GetPhi0() - tr2->GetPhi0()) > fMaxPhi0) return kFALSE;
75 if(fabs(tr1->GetKappa() - tr2->GetKappa()) > fMaxKappa) return kFALSE;
76
77 /*
78 if( (!tr1->IsPoint()) || (!tr2->IsPoint()) ) return kFALSE;
79 if(fabs(innertrack->GetPointY()-outertrack->GetPointY()) >fMaxY) return kFALSE;
80 if(fabs(innertrack->GetPointZ()-outertrack->GetPointZ()) >fMaxZ) return kFALSE;
81 if(fabs(innertrack->GetKappa()-outertrack->GetKappa()) >fMaxKappa) return kFALSE;
82 if(GetAngle(innertrack->GetPointPsi(),outertrack->GetPointPsi()) >fMaxPsi) return kFALSE;
83 if(fabs(innertrack->GetTgl()-outertrack->GetTgl()) >fMaxTgl) return kFALSE;
84 */
85
86 return kTRUE;//Tracks could be merged
a1855560 87}
88
b1886074 89void AliL3HoughMerger::AddTrack(AliL3TrackArray *mergedtrack,AliL3Track *track)
a1855560 90{
b1886074 91 AliL3Track *t[1];
92 t[0] = track;
93 MultiMerge(mergedtrack,t,1);
94}
95
96AliL3Track *AliL3HoughMerger::MultiMerge(AliL3TrackArray *mergedtrack,AliL3Track **tracks, Int_t ntrack)
97{
98 //Called by the track merger
99
100 AliL3HoughTrack *newtrack = (AliL3HoughTrack*)mergedtrack->NextTrack();
101 AliL3HoughTrack **trs = (AliL3HoughTrack**)tracks;
102 Int_t weight=0;
103
104 //Sum up the total weight:
105 for(Int_t i=ntrack-1; i>=0; i--)
106 weight += trs[i]->GetWeight();
a1855560 107
b1886074 108 AliL3HoughTrack *tpt=trs[0];//This is the innermost track
109 AliL3HoughTrack *tpl=trs[ntrack-1];
110 newtrack->SetTrackParameters(tpt->GetKappa(),tpt->GetPhi0(),weight);
111 newtrack->SetEtaIndex(tpt->GetEtaIndex());
112 newtrack->SetEta(tpt->GetEta());
113 newtrack->SetPsi(tpt->GetPsi());
114 newtrack->SetCenterX(tpt->GetCenterX());
115 newtrack->SetCenterY(tpt->GetCenterY());
116 newtrack->SetFirstPoint(tpt->GetFirstPointX(),tpt->GetFirstPointY(),tpt->GetFirstPointZ());
117 newtrack->SetLastPoint(tpl->GetLastPointX(),tpl->GetLastPointY(),tpl->GetLastPointZ());
118 newtrack->SetCharge(tpt->GetCharge());
119 newtrack->SetRowRange(tpt->GetFirstRow(),tpl->GetLastRow());
a1855560 120
b1886074 121 return (AliL3Track*)newtrack;
122
a1855560 123}
124
b1886074 125void AliL3HoughMerger::MergePatches(Bool_t slow)
a1855560 126{
b1886074 127 //Merge tracks from across the patches.
128
129 fSlow = slow;
130 AliL3TrackArray *tracks;
131 AliL3HoughTrack *track;
132 for(Int_t i=0; i<GetNIn(); i++)
a1855560 133 {
b1886074 134 tracks = GetInTracks(i);
135 for(Int_t j=0; j<tracks->GetNTracks(); j++)
a1855560 136 {
b1886074 137 track = (AliL3HoughTrack*)tracks->GetCheckedTrack(j);
138 if(!track) continue;
139 track->UpdateToFirstRow();
a1855560 140 }
141 }
b1886074 142 Merge();
a1855560 143
b1886074 144}
145
146void AliL3HoughMerger::Merge()
147{
5a31e9df 148 Double_t edge0 = AliL3Transform::Pi()/18;
3e87ef69 149 //Double_t edge1 = 2*PI - edge0;
b1886074 150 AliL3TrackArray *ttt = GetOutTracks();
151
152 Int_t subsec = GetNIn() - 2;
153 for(Int_t i=subsec;i>=0;i--){
154 AliL3TrackArray *tout = GetOutTracks();
155 if(i==subsec) tout = GetInTracks(subsec+1);
156 AliL3TrackArray *tin = GetInTracks(i);
26abc209 157 Double_t xval = AliL3Transform::Row2X(AliL3Transform::GetLastRow(i));
3e87ef69 158 //Double_t xmax = AliL3Transform::Row2X(AliL3Transform::GetLastRow(i+1));
b1886074 159 Double_t ymax = xval*tan(edge0);
160 for(Int_t out=0;out<tout->GetNTracks();out++){
161 AliL3Track *outtrack=tout->GetCheckedTrack(out);
162 if(!outtrack) continue;
163 //outtrack->CalculateHelix();
164 outtrack->CalculatePoint(xval);
165 if(outtrack->IsPoint()&&fabs(outtrack->GetPointY())>ymax){
166 tout->Remove(out);
167 }
a1855560 168 }
b1886074 169 // tout->Compress();
170 for(Int_t in=0;in<tin->GetNTracks();in++){
171 AliL3Track *intrack=(AliL3Track*)tin->GetTrack(in);
172 //intrack->CalculateHelix();
173 intrack->CalculatePoint(xval);
174 }
175 tin->QSort();
176 tout->QSort();
177
178 if(fSlow) SlowMerge(ttt,tin,tout,xval);
179 else Merge(ttt,tin,tout);
180
181 /*
182 //Add the tracks that cross the sector boundary:
183 for(Int_t in=0;in<tin->GetNTracks();in++){
184 AliL3Track *intrack=(AliL3Track*)tin->GetCheckedTrack(in);
185 if(!intrack) continue;
186 if(intrack->CalculateEdgePoint(edge0)){
187 if(intrack->GetPointX()<xmax ){
188 AddTrack(ttt,intrack);
189 tin->Remove(in);
190 }
191 }
192 else if(intrack->CalculateEdgePoint(edge1)){
193 if(intrack->GetPointX()<xmax ){
194 AddTrack(ttt,intrack);
195 tin->Remove(in);
196 }
197 }
198 }
199 */
200 } // end subsector loop
201 LOG(AliL3Log::kInformational,"AliL3HoughMerger::Merge","Result")
202 <<AliL3Log::kDec<<"Total Merged Tracks: "<<GetOutTracks()->GetNPresent()
203 <<ENDLOG;
a1855560 204}
205
b1886074 206Int_t AliL3HoughMerger::Merge(AliL3TrackArray* mergedtrack,AliL3TrackArray *tracksin,AliL3TrackArray *tracksout)
a1855560 207{
b1886074 208
209 AliL3Track *tracks[2];
210 const Int_t kNOut=tracksout->GetNTracks();
211 const Int_t kNIn =tracksin->GetNTracks();
212 const Int_t kNMerged =mergedtrack->GetNTracks();
213
214 Bool_t *ismatchedin = new Bool_t[kNIn];
215 for(Int_t in =0;in<kNIn;in++)
216 ismatchedin[in]=kFALSE;
217 Bool_t *ismatchedout = new Bool_t[kNOut];
218 for(Int_t out =0;out<kNOut;out++)
219 ismatchedout[out] = kFALSE;
220 for(Int_t out =0;out<kNOut;out++){
221 AliL3Track *outertrack=(AliL3Track*)tracksout->GetCheckedTrack(out);
222 if(!outertrack) continue;
223 for(Int_t in =0;in<kNIn;in++){
224 if(ismatchedin[in]) continue;
225 AliL3Track *innertrack=(AliL3Track*)tracksin->GetCheckedTrack(in);
226 if(!innertrack) continue;
227 if(outertrack==innertrack) continue;
228
229 if(IsTrack(innertrack,outertrack)) //They can be merged
230 {
231 tracks[0]=innertrack; tracks[1]=outertrack;
232 SortTracks(tracks,2); //Sort the tracks according to minimum x-point
233 //if(tracks[0]->GetLastPointX()<tracks[1]->GetFirstPointX()){
234 MultiMerge(mergedtrack,tracks,2);
235 tracksout->Remove(out);
236 tracksin->Remove(in);
237 ismatchedin[in]=kTRUE;
238 ismatchedout[out]=kTRUE;
239 break;
240 // }
241 }
a1855560 242 }
b1886074 243 }
a1855560 244
b1886074 245 Int_t nmerged = mergedtrack->GetNTracks()-kNMerged;
246 LOG(AliL3Log::kInformational,"AliL3HoughMerger::Merge","Result")
247 <<AliL3Log::kDec<<"Merged Tracks: "<<nmerged<<ENDLOG;
248 delete[] ismatchedin;
249 delete[] ismatchedout;
250 return nmerged;
251}
252
253void AliL3HoughMerger::SlowMerge(AliL3TrackArray *mergedtrack,AliL3TrackArray *tracksin,AliL3TrackArray *tracksout,Double_t xval)
254{
255 void *ntuple=GetNtuple();
256 const Int_t kNOut=tracksout->GetNTracks();
257 const Int_t kNIn =tracksin->GetNTracks();
258 const Int_t kNMerged =mergedtrack->GetNTracks();
259 AliL3Track *tracks[2];
260 Bool_t merge = kTRUE;
261 while(merge){
262 Int_t inmin=-1,outmin=-1;
263 Double_t min=10;
264 for(Int_t out=0;out<kNOut;out++){
265 AliL3Track *outertrack=tracksout->GetCheckedTrack(out);
266 if(!outertrack) continue;
267 for(Int_t in=0;in<kNIn;in++){
268 AliL3Track *innertrack=tracksin->GetCheckedTrack(in);
269 if(!innertrack) continue;
270 Double_t diff = TrackDiff(innertrack,outertrack);
271 if(diff>=0&&diff<min){
272 min=diff;
273 inmin=in;
274 outmin=out;
275 }
276 }
277 }
278 if(inmin>=0&&outmin>=0){
279 AliL3Track *outertrack=tracksout->GetTrack(outmin);
280 AliL3Track *innertrack=tracksin->GetTrack(inmin);
281 tracks[0]=innertrack;
282 tracks[1]=outertrack;
283 SortTracks(tracks,2);
284 Print(tracks);
285 MultiMerge(mergedtrack,tracks,2);
286 outertrack->CalculatePoint(xval);
287 innertrack->CalculatePoint(xval);
288 FillNtuple(ntuple,innertrack,outertrack);
289 tracksout->Remove(outmin);
290 tracksin->Remove(inmin);
291 // tracksout->Compress();
292 // tracksin->Compress();
293 }
294 else merge = kFALSE;
295 }
296 LOG(AliL3Log::kInformational,"AliL3HoughMerger::SlowMerge","Result")
297 <<AliL3Log::kDec<<"Merged Tracks: "
298 <<mergedtrack->GetNTracks()-kNMerged<<ENDLOG;
299 char name[256] = "ntuple_t.root";
300 for(Int_t i=0;i<GetNIn();i++)
301 if(tracksin==GetInTracks(i))
302 sprintf(name,"ntuple_t_%d.root",i);
303 WriteNtuple(name,ntuple);
304}
305
306void AliL3HoughMerger::Print(AliL3Track **tracks)
307{
308 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)tracks[0];
309 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)tracks[1];
310 Double_t kappadiff = fabs(tr1->GetKappa()-tr2->GetKappa());
311 Double_t phi0diff = fabs(tr1->GetPhi0()-tr2->GetPhi0());
312 cout << "---------Difference in merged tracks---------"<<endl;
313 cout << "Kappa: "<<kappadiff<<" Phi0 : "<<phi0diff<<endl;
a1855560 314
315}