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