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