2 // Original: AliHLTMerger.cxx,v 1.16 2005/06/14 10:55:21 cvetan
4 /**************************************************************************
5 * This file is property of and copyright by the ALICE HLT Project *
6 * ALICE Experiment at CERN, All rights reserved. *
8 * Primary Authors: Uli Frankenfeld, maintained by *
9 * Matthias Richter <Matthias.Richter@ift.uib.no> *
10 * for The ALICE HLT Project. *
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 **************************************************************************/
21 /** @file AliHLTTPCMerger.cxx
22 @author Uli Frankenfeld, maintained by Matthias Richter
24 @brief The HLT TPC merger base class
27 #include "AliHLTTPCLogging.h"
28 #include "AliHLTTPCMerger.h"
29 #include "AliHLTTPCTrack.h"
30 #include "AliHLTTPCTrackSegmentData.h"
31 #include "AliHLTTPCTransform.h"
32 #include "AliHLTTPCTrackArray.h"
34 #ifdef use_root //use root ntuple for slow merge
44 ClassImp(AliHLTTPCMerger)
46 AliHLTTPCMerger::AliHLTTPCMerger()
55 AliHLTTPCMerger::AliHLTTPCMerger(const AliHLTTPCMerger&)
57 // dummy copy constructor
58 //HLTFatal("copy constructor untested");
61 AliHLTTPCMerger& AliHLTTPCMerger::operator=(const AliHLTTPCMerger&)
63 // dummy assignment operator
64 //HLTFatal("assignment operator untested");
68 AliHLTTPCMerger::~AliHLTTPCMerger()
74 void AliHLTTPCMerger::InitMerger(Int_t ntrackarrays,Char_t *tracktype)
76 //Used to setup all arrays
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';
84 LOG(AliHLTTPCLog::kError,"AliHLTTPCMerger::AliHLTTPCMerger","Track types")
85 <<"Unknown tracktype"<<ENDLOG;
86 SetArray(ntrackarrays);
91 void AliHLTTPCMerger::DeleteArray()
94 for(Int_t i=0; i<fNIn;i++)
96 if(!fInTrack[i]) continue;
108 void AliHLTTPCMerger::SetArray(Int_t nin)
111 DeleteArray();//Make sure arrays are cleaned
114 fInTrack = new AliHLTTPCTrackArray*[fNIn];
115 for(Int_t i=0; i<fNIn;i++)
117 #ifdef INCLUDE_TPC_HOUGH
119 fInTrack[i] = new AliHLTTPCTrackArray("AliHLTTPCHoughTrack");
122 fInTrack[i] = new AliHLTTPCTrackArray("AliHLTTPCTrack");
125 #ifdef INCLUDE_TPC_HOUGH
127 fOutTrack= new AliHLTTPCTrackArray("AliHLTTPCHoughTrack");
130 fOutTrack= new AliHLTTPCTrackArray("AliHLTTPCTrack");
133 void AliHLTTPCMerger::Reset()
136 for(Int_t i=0; i<fNIn;i++)
138 fInTrack[i]->Reset();
143 void AliHLTTPCMerger::FillTracks(Int_t ntracks, AliHLTTPCTrackSegmentData* tr)
145 //Read tracks from shared memory (or memory)
146 AliHLTTPCTrackArray *destination = GetInTracks(fCurrentTracks);
148 destination->FillTracks(ntracks, tr, fSlice);
150 destination->FillTracks(ntracks, tr);
153 void AliHLTTPCMerger::AddAllTracks()
156 for(Int_t i=0; i<GetNIn();i++)
158 AliHLTTPCTrackArray *in = GetInTracks(i);
159 AliHLTTPCTrackArray *out = GetOutTracks();
164 void AliHLTTPCMerger::SortGlobalTracks(AliHLTTPCTrack **tracks, Int_t ntrack)
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;
172 for(Int_t j=0;j<ntrack;j++)
176 for(Int_t i=0;i<ntrack;i++)
178 if(!tracks[i]) continue;
179 Double_t rr=pow(tracks[i]->GetFirstPointX(),2)+pow(tracks[i]->GetFirstPointY(),2);
189 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];
194 void AliHLTTPCMerger::SortTracks(AliHLTTPCTrack **tracks, Int_t ntrack) const
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;
202 for(Int_t j=0;j<ntrack;j++)
206 for(Int_t i=0;i<ntrack;i++)
208 if(!tracks[i]) continue;
209 if(tracks[i]->GetFirstPointX()<minx)
211 minx=tracks[i]->GetFirstPointX();
218 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];
223 void AliHLTTPCMerger::AddTrack(AliHLTTPCTrackArray *mergedtrack,AliHLTTPCTrack *track)
226 AliHLTTPCTrack *t[1];
228 MultiMerge(mergedtrack,t,1);
231 AliHLTTPCTrack * AliHLTTPCMerger::MergeTracks(AliHLTTPCTrackArray *mergedtrack,AliHLTTPCTrack *t0,AliHLTTPCTrack *t1)
234 AliHLTTPCTrack *t[2];
238 return MultiMerge(mergedtrack,t,2);
241 AliHLTTPCTrack * AliHLTTPCMerger::MultiMerge(AliHLTTPCTrackArray *mergedtracks,AliHLTTPCTrack **tracks, Int_t ntrack)
243 //multi merge the tracks
246 for(Int_t i=0;i<ntrack;i++)
248 nps+=tracks[i]->GetNHits();
250 if(nps>AliHLTTPCTransform::GetNRows())
252 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCMerger::MultiMerge","Adding Points")
253 <<AliHLTTPCLog::kDec<<"Too many Points: "<<nps<<ENDLOG;
258 AliHLTTPCTrack *newtrack = mergedtracks->NextTrack();
260 UInt_t * nn = new UInt_t[AliHLTTPCTransform::GetNRows()];
263 // for(Int_t i=0;i<ntrack;i++){
264 for(Int_t i=ntrack-1;i>=0;i--)
266 memcpy(&nn[nps],tracks[i]->GetHitNumbers(),tracks[i]->GetNHits()*sizeof(UInt_t));
267 nps+=tracks[i]->GetNHits();
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)
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());
287 void* AliHLTTPCMerger::GetNtuple(char *varlist) const
291 TNtuple* nt = new TNtuple("ntuple","ntuple",varlist);
298 void* AliHLTTPCMerger::GetNtuple() const
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");
310 Bool_t AliHLTTPCMerger::WriteNtuple(char *filename, void* nt) const
314 TNtuple *ntuple=(TNtuple *) nt;
315 TFile *f = new TFile(filename,"RECREATE");
325 void AliHLTTPCMerger::FillNtuple(void *nt,AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack)
329 if(outertrack->IsPoint()&&innertrack->IsPoint())
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));
352 TNtuple *ntuple = (TNtuple *) nt;
358 void AliHLTTPCMerger::FillNtuple(void *nt,Float_t *data) const
362 TNtuple *ntuple = (TNtuple *) nt;
367 Double_t AliHLTTPCMerger::GetAngle(Double_t a1,Double_t a2)
370 Double_t da = a1 - a2 + 4*AliHLTTPCTransform::Pi();
371 da = fmod(da,AliHLTTPCTransform::TwoPi());
372 if(da>AliHLTTPCTransform::Pi()) da = AliHLTTPCTransform::TwoPi()-da;
376 void AliHLTTPCMerger::SetParameter(Double_t maxy, Double_t maxz, Double_t maxkappa, Double_t maxpsi, Double_t maxtgl)
378 //set parameters for merger
381 fMaxKappa = maxkappa;
386 Bool_t AliHLTTPCMerger::IsTrack(AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack)
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;
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!!
402 Bool_t AliHLTTPCMerger::IsRTrack(AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack)
405 return IsTrack(innertrack,outertrack);
408 Double_t AliHLTTPCMerger::TrackDiff(AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack)
410 //return track difference
412 Double_t x[4],y[4],z[4],dy[4],dz[4];
413 AliHLTTPCTrack *tracks[2];
415 tracks[0] = innertrack;
416 tracks[1] = outertrack;
417 SortGlobalTracks(tracks,2);
418 innertrack = tracks[0];
419 outertrack = tracks[1];
421 x[0] = innertrack->GetFirstPointX();
422 x[1] = innertrack->GetLastPointX();
423 x[2] = outertrack->GetFirstPointX();
424 x[3] = outertrack->GetLastPointX();
426 y[0] = innertrack->GetFirstPointY();
427 y[1] = innertrack->GetLastPointY();
428 y[2] = outertrack->GetFirstPointY();
429 y[3] = outertrack->GetLastPointY();
431 z[0] = innertrack->GetFirstPointZ();
432 z[1] = innertrack->GetLastPointZ();
433 z[2] = outertrack->GetFirstPointZ();
434 z[3] = outertrack->GetLastPointZ();
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());
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());
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());
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());
458 for(Int_t i=0;i<4;i++)
459 diff+=sqrt(dy[i]*dy[i]+dz[i]*dz[i]);
463 void AliHLTTPCMerger::PrintDiff(AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack)
466 if(!innertrack->IsPoint()||!outertrack->IsPoint())
468 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCMerger::PrintDiff","No Points")<<ENDLOG;
469 //cerr<<"AliHLTTPCMerger::PrintDiff: No Points"<<endl;
470 //cerr<<"---------------------------"<<endl;
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();
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;
491 void AliHLTTPCMerger::Print()
494 for(Int_t i=0; i<fNIn; i++)
496 AliHLTTPCTrackArray *ttt= GetInTracks(i);
497 for(Int_t j =0;j<ttt->GetNTracks();j++)
499 AliHLTTPCTrack *track=ttt->GetCheckedTrack(j);
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))
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;
517 //fprintf(stderr,"npt: %3d dx: %8.5f dy: %8.5f dz: %8.5f\n",track->GetNHits(),dx,dy,dz);
518 //cerr<<"---------------------------"<<endl;
524 void AliHLTTPCMerger::PrintTrack(AliHLTTPCTrack *track)
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());
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());
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());