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