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