3 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTStandardIncludes.h"
8 #include "AliHLTLogging.h"
9 #include "AliHLTHoughIntMerger.h"
10 #include "AliHLTHoughTrack.h"
11 #include "AliHLTTrackSegmentData.h"
12 #include "AliHLTTransform.h"
13 #include "AliHLTTrackArray.h"
19 //_____________________________________________________________
21 // Merging of multiple reconstructed tracks
23 ClassImp(AliHLTHoughIntMerger)
25 AliHLTHoughIntMerger::AliHLTHoughIntMerger()
28 InitMerger(1,"AliHLTHoughTrack");
29 fRowMax = fRowMin = 0;
30 SetParameters(0.001,0.05,10);
35 AliHLTHoughIntMerger::~AliHLTHoughIntMerger()
41 void AliHLTHoughIntMerger::SetParameters(Double_t maxkappa, Double_t maxphi0, Double_t maxtgl)
49 void AliHLTHoughIntMerger::FillTracks(AliHLTTrackArray *tracks)
51 //Fills tracks into merger
52 if(tracks->GetNTracks()==0)
53 LOG(AliHLTLog::kWarning,"AliHLTHoughIntMerger::FillTracks","Track Array")
54 <<"Adding empty track array"<<ENDLOG;
56 GetInTracks(0)->AddTracks(tracks,kFALSE);//Copy tracks
57 printf("Filling %d tracks to intermerger\n",tracks->GetNTracks());
60 Bool_t AliHLTHoughIntMerger::IsTrack(AliHLTTrack *innertrack,AliHLTTrack *outertrack)
62 //Check if the tracks can be merged, called by the track merger
64 AliHLTHoughTrack *tr1 = (AliHLTHoughTrack*)innertrack;
65 AliHLTHoughTrack *tr2 = (AliHLTHoughTrack*)outertrack;
67 if(abs(tr1->GetEtaIndex() - tr2->GetEtaIndex()) > 1) return kFALSE;
68 if(tr1->GetCharge()!=tr2->GetCharge()) return kFALSE;
69 if(fabs(tr1->GetKappa()-tr2->GetKappa()) >fMaxKappa) return kFALSE;
70 if(fabs(tr1->GetPhi0()-tr2->GetPhi0()) > fMaxPhi0) return kFALSE;
72 return kTRUE;//Tracks could be merged
75 AliHLTTrack *AliHLTHoughIntMerger::MultiMerge(AliHLTTrackArray *mergedtrack,AliHLTTrack **tracks, Int_t /*ntrack*/)
77 //Called by the track merger
79 AliHLTHoughTrack *newtrack = (AliHLTHoughTrack*)mergedtrack->NextTrack();
80 AliHLTHoughTrack **trs = (AliHLTHoughTrack**)tracks;
82 AliHLTHoughTrack *tpt=trs[0];//this is the "best" track
83 //AliHLTHoughTrack *tpl=trs[ntrack-1];
85 return (AliHLTTrack*)newtrack;
90 void AliHLTHoughIntMerger::MMerge()
93 GetInTracks(0)->QSort();
95 GetOutTracks()->AddTracks(GetInTracks(0));
98 Int_t AliHLTHoughIntMerger::Merge()
101 AliHLTTrackArray * tracks = GetInTracks(0);
102 const Int_t kNIn =tracks->GetNTracks();
105 for(Int_t out=0;out<kNIn;out++)
107 AliHLTHoughTrack *outertrack=(AliHLTHoughTrack*)tracks->GetCheckedTrack(out);
108 if(!outertrack) continue;
109 for(Int_t in=0;in<kNIn;in++)
111 if(in==out) continue;
112 AliHLTHoughTrack *innertrack=(AliHLTHoughTrack*)tracks->GetCheckedTrack(in);
113 if(!innertrack) continue;
114 if(IsTrack(innertrack,outertrack))
120 MultiMerge(tracks,tr,2);
127 Int_t nmerged = tracks->GetNTracks()-kNIn;
128 LOG(AliHLTLog::kInformational,"AliHLTHoughIntMerger::Merge","Result")
129 <<AliHLTLog::kDec<<"Merged Tracks: "<<nmerged<<ENDLOG;
132 //GetOutTracks()->AddTracks(GetInTracks(0));
137 void AliHLTHoughIntMerger::Print(AliHLTTrack **tracks)
139 //Prints merger results
140 AliHLTHoughTrack *tr1 = (AliHLTHoughTrack*)tracks[0];
141 AliHLTHoughTrack *tr2 = (AliHLTHoughTrack*)tracks[1];
142 Double_t kappadiff = fabs(tr1->GetKappa()-tr2->GetKappa());
143 Double_t phi0diff = fabs(tr1->GetPhi0()-tr2->GetPhi0());
144 cout << "---------Difference in intermerged tracks---------"<<endl;
145 cout << "Kappa: "<<kappadiff<<" Phi0 : "<<phi0diff<<endl;
149 void AliHLTHoughIntMerger::SortTracks(AliHLTTrack **trs, Int_t ntrack) const
151 //Sort the tracks according to their weight
153 AliHLTHoughTrack **tracks = (AliHLTHoughTrack**)trs;
154 AliHLTHoughTrack **tmp = new AliHLTHoughTrack*[ntrack];
155 for(Int_t i=0;i<ntrack;i++) tmp[i] = (AliHLTHoughTrack*)tracks[i];
156 Int_t *t = new Int_t[ntrack];
157 for(Int_t i=0;i<ntrack;i++) t[i]=-1;
159 for(Int_t j=0;j<ntrack;j++)
163 for(Int_t i=0;i<ntrack;i++)
165 if(!tracks[i]) continue;
166 if(tracks[i]->GetWeight() > maxw)
168 maxw=tracks[i]->GetWeight();
175 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];