]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/src/AliL3Merger.cxx
Additional protection
[u/mrichter/AliRoot.git] / HLT / src / AliL3Merger.cxx
CommitLineData
4603aa2f 1//$Id$
2
b661165c 3// Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4//*-- Copyright &copy Uli
108615fc 5
118c26c3 6#include "AliL3StandardIncludes.h"
7
108615fc 8#include "AliL3Logging.h"
108615fc 9#include "AliL3Merger.h"
10#include "AliL3Track.h"
11#include "AliL3TrackSegmentData.h"
12#include "AliL3Transform.h"
13#include "AliL3TrackArray.h"
14
15#ifdef use_root //use root ntuple for slow merge
16#include <TNtuple.h>
17#include <TTree.h>
18#include <TFile.h>
19#endif
b661165c 20
3e87ef69 21/** \class AliL3Merger
22<pre>
108615fc 23//_____________________________________________________________
b661165c 24// AliL3Merger
108615fc 25//
26// The L3 merger base class
27//
3e87ef69 28</pre>
29*/
108615fc 30
5929c18d 31#if __GNUC__ >= 3
32using namespace std;
33#endif
34
108615fc 35ClassImp(AliL3Merger)
36
0a86fbb7 37AliL3Merger::AliL3Merger()
38{
108615fc 39 //Default constructor
0a86fbb7 40 fInTrack=0;
41 fOutTrack=0;
42 fCurrentTracks=0;
43 fNIn=0;
108615fc 44}
45
0a86fbb7 46AliL3Merger::~AliL3Merger()
47{
48 //Destructor
49 DeleteArray();
50}
108615fc 51
0a86fbb7 52void AliL3Merger::InitMerger(Int_t ntrackarrays,Char_t *tracktype)
53{
54 //Used to setup all arrays
5dcd65ea 55
56 if(strcmp(tracktype,"AliL3Track")==0) fTrackType='t';
57 else if(strcmp(tracktype,"AliL3ConfMapTrack")==0) fTrackType='c';
58 else if(strcmp(tracktype,"AliL3HoughTrack")==0) fTrackType='h';
59 else
60 LOG(AliL3Log::kError,"AliL3Merger::AliL3Merger","Track types")
61 <<"Unknown tracktype"<<ENDLOG;
108615fc 62 SetArray(ntrackarrays);
63 fCurrentTracks=0;
5dcd65ea 64
108615fc 65}
66
0a86fbb7 67void AliL3Merger::DeleteArray()
68{
b1ed0288 69 //delete arrays
108615fc 70 for(Int_t i=0; i<fNIn;i++)
0a86fbb7 71 {
72 if(!fInTrack[i]) continue;
73 delete fInTrack[i];
74 fInTrack[i]=0;
75 }
76 if(fInTrack)
77 delete[] fInTrack;
78 if(fOutTrack)
79 delete fOutTrack;
80 fInTrack=0;
81 fOutTrack=0;
108615fc 82}
83
0a86fbb7 84void AliL3Merger::SetArray(Int_t nin)
b1ed0288 85{
86 //set arrays
0a86fbb7 87 DeleteArray();//Make sure arrays are cleaned
88
108615fc 89 fNIn = nin;
0a86fbb7 90 fInTrack = new AliL3TrackArray*[fNIn];
91 for(Int_t i=0; i<fNIn;i++)
92 {
93 if(fTrackType=='h')
94 fInTrack[i] = new AliL3TrackArray("AliL3HoughTrack");
95 else
96 fInTrack[i] = new AliL3TrackArray("AliL3Track");
97
98 }
5dcd65ea 99 if(fTrackType=='h')
100 fOutTrack= new AliL3TrackArray("AliL3HoughTrack");
101 else
102 fOutTrack= new AliL3TrackArray("AliL3Track");
108615fc 103}
104
0a86fbb7 105void AliL3Merger::Reset()
b1ed0288 106{
107 //reset
0a86fbb7 108 for(Int_t i=0; i<fNIn;i++)
109 {
110 fInTrack[i]->Reset();
111 }
108615fc 112 fOutTrack->Reset();
113}
114
0a86fbb7 115void AliL3Merger::FillTracks(Int_t ntracks, AliL3TrackSegmentData* tr)
116{
108615fc 117 //Read tracks from shared memory (or memory)
118 AliL3TrackArray *destination = GetInTracks(fCurrentTracks);
119 if(Is2Global())
494fad94 120 destination->FillTracks(ntracks, tr, fSlice);
108615fc 121 else
122 destination->FillTracks(ntracks, tr);
123}
124
0a86fbb7 125void AliL3Merger::AddAllTracks()
b1ed0288 126{
127 //add all tracks
0a86fbb7 128 for(Int_t i=0; i<GetNIn();i++)
129 {
130 AliL3TrackArray *in = GetInTracks(i);
131 AliL3TrackArray *out = GetOutTracks();
132 out->AddTracks(in);
133 }
108615fc 134}
135
0a86fbb7 136void AliL3Merger::SortGlobalTracks(AliL3Track **tracks, Int_t ntrack)
b1ed0288 137{
138 //sort global tracks
108615fc 139 AliL3Track **tmp = new AliL3Track*[ntrack];
140 for(Int_t i=0;i<ntrack;i++) tmp[i] = tracks[i];
141 Int_t *t = new Int_t[ntrack];
142 for(Int_t i=0;i<ntrack;i++) t[i]=-1;
0a86fbb7 143
144 for(Int_t j=0;j<ntrack;j++)
145 {
146 Double_t minr=300;
147 Int_t mini=0;
148 for(Int_t i=0;i<ntrack;i++)
149 {
150 if(!tracks[i]) continue;
151 Double_t rr=pow(tracks[i]->GetFirstPointX(),2)+pow(tracks[i]->GetFirstPointY(),2);
152 Double_t r=sqrt(rr);
153 if(r<minr){
154 minr=r;
155 mini=i;
156 }
157 }
158 t[j]=mini;
159 tracks[mini]=0;
108615fc 160 }
108615fc 161 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];
162 delete[] t;
163 delete[] tmp;
164}
165
b1ed0288 166void AliL3Merger::SortTracks(AliL3Track **tracks, Int_t ntrack) const
167{
168 //sort tracks
108615fc 169 AliL3Track **tmp = new AliL3Track*[ntrack];
170 for(Int_t i=0;i<ntrack;i++) tmp[i] = tracks[i];
171 Int_t *t = new Int_t[ntrack];
172 for(Int_t i=0;i<ntrack;i++) t[i]=-1;
0a86fbb7 173
174 for(Int_t j=0;j<ntrack;j++)
175 {
176 Double_t minx=300;
177 Int_t mini=0;
178 for(Int_t i=0;i<ntrack;i++)
179 {
180 if(!tracks[i]) continue;
181 if(tracks[i]->GetFirstPointX()<minx)
182 {
183 minx=tracks[i]->GetFirstPointX();
184 mini=i;
185 }
186 }
187 t[j]=mini;
188 tracks[mini]=0;
108615fc 189 }
108615fc 190 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];
191 delete[] t;
192 delete[] tmp;
193}
194
0a86fbb7 195void AliL3Merger::AddTrack(AliL3TrackArray *mergedtrack,AliL3Track *track)
b1ed0288 196{
197 // add tracks
108615fc 198 AliL3Track *t[1];
199 t[0] = track;
200 MultiMerge(mergedtrack,t,1);
201}
202
0a86fbb7 203AliL3Track * AliL3Merger::MergeTracks(AliL3TrackArray *mergedtrack,AliL3Track *t0,AliL3Track *t1)
b1ed0288 204{
205 //merge tracks
108615fc 206 AliL3Track *t[2];
207 t[0] = t0;
208 t[1] = t1;
209 SortTracks(t,2);
210 return MultiMerge(mergedtrack,t,2);
211}
212
0a86fbb7 213AliL3Track * AliL3Merger::MultiMerge(AliL3TrackArray *mergedtracks,AliL3Track **tracks, Int_t ntrack)
214{
b1ed0288 215 //multi merge the tracks
0a86fbb7 216 //check npoints
108615fc 217 Int_t nps = 0;
0a86fbb7 218 for(Int_t i=0;i<ntrack;i++)
219 {
220 nps+=tracks[i]->GetNHits();
221 }
222 if(nps>AliL3Transform::GetNRows())
223 {
224 LOG(AliL3Log::kWarning,"AliL3Merger::MultiMerge","Adding Points")
225 <<AliL3Log::kDec<<"Too many Points: "<<nps<<ENDLOG;
226 return 0;
227 }
228
108615fc 229 //create new track
230 AliL3Track *newtrack = mergedtracks->NextTrack();
231 //copy points
62bb4b3d 232 UInt_t * nn = new UInt_t[AliL3Transform::GetNRows()];
108615fc 233 nps = 0;
0a86fbb7 234
235 // for(Int_t i=0;i<ntrack;i++){
236 for(Int_t i=ntrack-1;i>=0;i--)
237 {
238 memcpy(&nn[nps],tracks[i]->GetHitNumbers(),tracks[i]->GetNHits()*sizeof(UInt_t));
239 nps+=tracks[i]->GetNHits();
240 }
108615fc 241 AliL3Track *tpf=tracks[0];
242 AliL3Track *tpl=tracks[ntrack-1];
4603aa2f 243 AliL3Track *best = tpf;
244 if(tpf->GetNHits()<tpl->GetNHits() && Is2Global())
245 best = tpl;//Best means = most points and therefore best fit (in global case)
246
108615fc 247 newtrack->SetNHits(nps);
248 newtrack->SetHits(nps,nn);
249 newtrack->SetFirstPoint(tpf->GetFirstPointX(),tpf->GetFirstPointY(),tpf->GetFirstPointZ());
250 newtrack->SetLastPoint(tpl->GetLastPointX(),tpl->GetLastPointY(),tpl->GetLastPointZ());
4603aa2f 251 newtrack->SetPt(best->GetPt());
252 newtrack->SetPsi(best->GetPsi());
253 newtrack->SetTgl(best->GetTgl());
108615fc 254 newtrack->SetCharge(tpf->GetCharge());
62bb4b3d 255 delete [] nn;
108615fc 256 return newtrack;
257}
258
b1ed0288 259void* AliL3Merger::GetNtuple(char *varlist) const
260{
261 //get ntuple
108615fc 262#ifdef use_root
263 TNtuple* nt = new TNtuple("ntuple","ntuple",varlist);
264 return (void*) nt;
265#else
266 return 0;
267#endif
268}
269
b1ed0288 270void* AliL3Merger::GetNtuple() const
271{
272 //get ntuple
108615fc 273#ifdef use_root
274 TNtuple* nt = new TNtuple("ntuple","ntuple",
68a27388 275 "dx:dy:dz:dk:dpsi:dtgl:dq:disx:disy:disz:dis:n0:n1:diff:drx:dry:drz");
108615fc 276 return (void*) nt;
277#else
278 return 0;
279#endif
280}
281
b1ed0288 282Bool_t AliL3Merger::WriteNtuple(char *filename, void* nt) const
283{
284 //write ntuple
108615fc 285#ifdef use_root
286 TNtuple *ntuple=(TNtuple *) nt;
287 TFile *f = new TFile(filename,"RECREATE");
288 ntuple->Write();
289 f->Close();
290 delete ntuple;
291 return kTRUE;
292#else
293 return kFALSE;
294#endif
295}
296
0a86fbb7 297void AliL3Merger::FillNtuple(void *nt,AliL3Track *innertrack,AliL3Track *outertrack)
b1ed0288 298{
299 //fill ntuple
108615fc 300 Float_t data[17];
0a86fbb7 301 if(outertrack->IsPoint()&&innertrack->IsPoint())
302 {
303 data[0] =Float_t(innertrack->GetPointX()-outertrack->GetPointX());
304 data[1] =Float_t(innertrack->GetPointY()-outertrack->GetPointY());
305 data[2] =Float_t(innertrack->GetPointZ()-outertrack->GetPointZ());
306 data[3] =Float_t(innertrack->GetKappa()-outertrack->GetKappa());
307 Double_t psi= innertrack->GetPointPsi() - outertrack->GetPointPsi();
5a31e9df 308 if(psi>AliL3Transform::Pi()) psi-=AliL3Transform::TwoPi();
309 else if(psi<-AliL3Transform::Pi()) psi+=AliL3Transform::TwoPi();
0a86fbb7 310 data[4] =Float_t(psi);
311 data[5] =Float_t(innertrack->GetTgl()-outertrack->GetTgl());
312 data[6] =Float_t(innertrack->GetCharge()-outertrack->GetCharge());
313 data[7] =Float_t(innertrack->GetLastPointX()-outertrack->GetFirstPointX());
314 data[8] =Float_t(innertrack->GetLastPointY()-outertrack->GetFirstPointY());
315 data[9] =Float_t(innertrack->GetLastPointZ()-outertrack->GetFirstPointZ());
316 data[10] =sqrt(pow(data[7],2)+pow(data[8],2)+pow(data[9],2));
317 data[11]= outertrack->GetNHits();
318 data[12]= innertrack->GetNHits();
319 data[13] = Float_t(TrackDiff(innertrack,outertrack));
320 data[14]=0;
321 data[15]=0;
322 data[16]=0;
108615fc 323#ifdef use_root
0a86fbb7 324 TNtuple *ntuple = (TNtuple *) nt;
325 ntuple->Fill(data);
108615fc 326#endif
0a86fbb7 327 }
108615fc 328}
329
b1ed0288 330void AliL3Merger::FillNtuple(void *nt,Float_t *data) const
331{
332 //fill ntuple
108615fc 333#ifdef use_root
0a86fbb7 334 TNtuple *ntuple = (TNtuple *) nt;
335 ntuple->Fill(data);
108615fc 336#endif
337}
338
0a86fbb7 339Double_t AliL3Merger::GetAngle(Double_t a1,Double_t a2)
b1ed0288 340{
341 //get angle
5a31e9df 342 Double_t da = a1 - a2 + 4*AliL3Transform::Pi();
343 da = fmod(da,AliL3Transform::TwoPi());
344 if(da>AliL3Transform::Pi()) da = AliL3Transform::TwoPi()-da;
108615fc 345 return da;
346}
347
0a86fbb7 348void AliL3Merger::SetParameter(Double_t maxy, Double_t maxz, Double_t maxkappa, Double_t maxpsi, Double_t maxtgl)
b1ed0288 349{
350 //set parameters for merger
108615fc 351 fMaxY = maxy;
352 fMaxZ = maxz;
353 fMaxKappa = maxkappa;
354 fMaxPsi = maxpsi;
355 fMaxTgl = maxtgl;
356}
357
0a86fbb7 358Bool_t AliL3Merger::IsTrack(AliL3Track *innertrack,AliL3Track *outertrack)
359{
b1ed0288 360 //is track to be merged
108615fc 361 if(innertrack->GetCharge()!=outertrack->GetCharge()) return kFALSE;
362 if( (!innertrack->IsPoint()) || (!outertrack->IsPoint()) ) return kFALSE;
68a27388 363 if(innertrack->GetNHits()+outertrack->GetNHits()>AliL3Transform::GetNRows()) return kFALSE;
0a86fbb7 364
108615fc 365 if(fabs(innertrack->GetPointY()-outertrack->GetPointY()) >fMaxY) return kFALSE;
366 if(fabs(innertrack->GetPointZ()-outertrack->GetPointZ()) >fMaxZ) return kFALSE;
367 if(fabs(innertrack->GetKappa()-outertrack->GetKappa()) >fMaxKappa) return kFALSE;
368 if(GetAngle(innertrack->GetPointPsi(),outertrack->GetPointPsi()) >fMaxPsi) return kFALSE;
369 if(fabs(innertrack->GetTgl()-outertrack->GetTgl()) >fMaxTgl) return kFALSE;
370 //if no rejection up to this point: merge!!
371 return kTRUE;
372}
373
0a86fbb7 374Bool_t AliL3Merger::IsRTrack(AliL3Track *innertrack,AliL3Track *outertrack)
b1ed0288 375{
376 //same as IsTrack
108615fc 377 return IsTrack(innertrack,outertrack);
378}
379
0a86fbb7 380Double_t AliL3Merger::TrackDiff(AliL3Track *innertrack,AliL3Track *outertrack)
b1ed0288 381{
382 //return track difference
108615fc 383 Double_t diff =-1;
384 Double_t x[4],y[4],z[4],dy[4],dz[4];
385 AliL3Track *tracks[2];
0a86fbb7 386
108615fc 387 tracks[0] = innertrack;
388 tracks[1] = outertrack;
389 SortGlobalTracks(tracks,2);
390 innertrack = tracks[0];
391 outertrack = tracks[1];
4603aa2f 392
108615fc 393 x[0] = innertrack->GetFirstPointX();
394 x[1] = innertrack->GetLastPointX();
395 x[2] = outertrack->GetFirstPointX();
396 x[3] = outertrack->GetLastPointX();
0a86fbb7 397
108615fc 398 y[0] = innertrack->GetFirstPointY();
399 y[1] = innertrack->GetLastPointY();
400 y[2] = outertrack->GetFirstPointY();
401 y[3] = outertrack->GetLastPointY();
402
403 z[0] = innertrack->GetFirstPointZ();
404 z[1] = innertrack->GetLastPointZ();
405 z[2] = outertrack->GetFirstPointZ();
406 z[3] = outertrack->GetLastPointZ();
407
4603aa2f 408
108615fc 409 outertrack->CalculatePoint(x[0]);
410 if(!outertrack->IsPoint()) return diff;
411 dy[0] = fabs(y[0] - outertrack->GetPointY());
412 dz[0] = fabs(z[0] - outertrack->GetPointZ());
4603aa2f 413
108615fc 414 outertrack->CalculatePoint(x[1]);
415 if(!outertrack->IsPoint()) return diff;
416 dy[1] = fabs(y[1] - outertrack->GetPointY());
417 dz[1] = fabs(z[1] - outertrack->GetPointZ());
4603aa2f 418
108615fc 419 innertrack->CalculatePoint(x[2]);
420 if(!innertrack->IsPoint()) return diff;
421 dy[2] = fabs(y[2] - innertrack->GetPointY());
422 dz[2] = fabs(z[2] - innertrack->GetPointZ());
4603aa2f 423
108615fc 424 innertrack->CalculatePoint(x[3]);
425 if(!innertrack->IsPoint()) return diff;
426 dy[3] = fabs(y[3] - innertrack->GetPointY());
427 dz[3] = fabs(z[3] - innertrack->GetPointZ());
428
429 diff=0;
430 for(Int_t i=0;i<4;i++)
431 diff+=sqrt(dy[i]*dy[i]+dz[i]*dz[i]);
432 return diff;
433}
434
c3dd27a3 435void AliL3Merger::PrintDiff(AliL3Track *innertrack,AliL3Track *outertrack)
b1ed0288 436{
437 // print difference
0a86fbb7 438 if(!innertrack->IsPoint()||!outertrack->IsPoint())
439 {
440 LOG(AliL3Log::kInformational,"AliL3Merger::PrintDiff","No Points")<<ENDLOG;
441 //cerr<<"AliL3Merger::PrintDiff: No Points"<<endl;
442 //cerr<<"---------------------------"<<endl;
443 return;
444 }
445
108615fc 446 Double_t dx = innertrack->GetPointX()-outertrack->GetPointX();
447 Double_t dy = innertrack->GetPointY()-outertrack->GetPointY();
448 Double_t dz = innertrack->GetPointZ()-outertrack->GetPointZ();
449 Double_t dk = innertrack->GetKappa()-outertrack->GetKappa();
c3dd27a3 450 Double_t dpsi= innertrack->GetPointPsi() - outertrack->GetPointPsi();
5a31e9df 451 if(dpsi>AliL3Transform::Pi()) dpsi-=AliL3Transform::TwoPi();
452 else if(dpsi<-AliL3Transform::Pi())dpsi+=AliL3Transform::TwoPi();
c3dd27a3 453 //Double_t dpsi = GetAngle(innertrack->GetPointPsi(),outertrack->GetPointPsi());
108615fc 454 Double_t dtgl= innertrack->GetTgl()-outertrack->GetTgl();
455 Double_t dq =innertrack->GetCharge()-outertrack->GetCharge();
0a86fbb7 456
c3dd27a3 457 LOG(AliL3Log::kInformational,"AliL3Merger::PrintDiff","Points") <<"dx: "<<dx<<" dy: "<<dy<<" dz: "<<dz<<" dk: "<<dk<<" dpsi: "<<dpsi<<" dtgl: "<<dtgl<<" dq: "<<dq<<ENDLOG;
458 //fprintf(stderr,"dx: %4f dy: %4f dz: %4f dk: %4f dpsi: %4f dtgl: %4f dq: %4f\n",dx,dy,dz,dk,dpsi,dtgl,dq);
459 //cerr<<"---------------------------"<<endl;
460
108615fc 461}
462
0a86fbb7 463void AliL3Merger::Print()
464{
108615fc 465 // print some infos
0a86fbb7 466 for(Int_t i=0; i<fNIn; i++)
467 {
468 AliL3TrackArray *ttt= GetInTracks(i);
469 for(Int_t j =0;j<ttt->GetNTracks();j++)
470 {
471 AliL3Track *track=ttt->GetCheckedTrack(j);
472 if(!track) continue;
473 track->CalculateHelix();
474 // Double_t angle = atan2(track->GetLastPointY(),track->GetLastPointX());
5a31e9df 475 // if(angle<0) angle+=AliL3Transform::Pi();
0a86fbb7 476 if(track->CalculatePoint(135))
477 // if(!track->CalculateEdgePoint(angle)) cerr<<"**************"<<endl;
478 // if(track->CalculatePoint(track->GetLastPointX()))
479 // if(track->CalculatePoint(0))
480 {
481 // PrintTrack(track);
5a31e9df 482 // track->CalculateReferencePoint(AliL3Transform::Pi()/180.);
0a86fbb7 483 track->CalculateReferencePoint(0.001);
484 Float_t dx=(float)track->GetPointX()-track->GetPointX();
485 Float_t dy=(float)track->GetPointY()-track->GetPointY();
486 Float_t dz=(float)track->GetPointZ()-track->GetPointZ();
487 LOG(AliL3Log::kInformational,"AliL3Merger::Print","RefPoint") <<"npt: "<<track->GetNHits()<<" dx: "<<dx<<" dy: "<<dy<<" dz: "<<dz<<ENDLOG;
488
489 //fprintf(stderr,"npt: %3d dx: %8.5f dy: %8.5f dz: %8.5f\n",track->GetNHits(),dx,dy,dz);
490 //cerr<<"---------------------------"<<endl;
491 }
492 }
493 }
108615fc 494}
495
0a86fbb7 496void AliL3Merger::PrintTrack(AliL3Track *track)
b1ed0288 497{
498 //print track info
108615fc 499 fprintf(stderr,"npt: %3d pt: %.2f psi: %.2f tgl: %5.2f q: %2d\n",
0a86fbb7 500 track->GetNHits(),track->GetPt(),track->GetPsi(),
501 track->GetTgl(),track->GetCharge());
108615fc 502 fprintf(stderr,
0a86fbb7 503 "x1: %6.2f y1: %6.2f z1: %6.2f xl: %6.2f yl: %6.2f zl: %6.2f\n",
504 track->GetFirstPointX(),track->GetFirstPointY(),track->GetFirstPointZ(),
505 track->GetLastPointX(),track->GetLastPointY(),track->GetLastPointZ());
506 if(track->IsPoint())
507 {
508 fprintf(stderr,
509 "R: %.2f Xc: %.2f Yc: %.2f Xp: %.2f Yp: %.2f Zp: %.2f Psip: %.2f\n",
510 track->GetRadius(),track->GetCenterX(),track->GetCenterY(),
511 track->GetPointX(),track->GetPointY(),track->GetPointZ(),
512 track->GetPointPsi());
513 }
108615fc 514}