]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/hough/AliL3HoughIntMerger.cxx
CheckTrack implemented
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughIntMerger.cxx
CommitLineData
3e87ef69 1// @(#) $Id$
2
f0f02577 3// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
3e87ef69 4//*-- Copyright &copy ALICE HLT Group
f0f02577 5
e06900d5 6#include "AliL3StandardIncludes.h"
7
f0f02577 8#include "AliL3Logging.h"
9#include "AliL3HoughIntMerger.h"
10#include "AliL3HoughTrack.h"
11#include "AliL3TrackSegmentData.h"
12#include "AliL3Transform.h"
13#include "AliL3TrackArray.h"
14
e06900d5 15#if GCCVERSION == 3
16using namespace std;
17#endif
18
f0f02577 19//_____________________________________________________________
20// Hough Inter merger
21// Merging of multiple reconstructed tracks
22
23ClassImp(AliL3HoughIntMerger)
24
0a86fbb7 25AliL3HoughIntMerger::AliL3HoughIntMerger()
f0f02577 26{
27 //Default constructor
0a86fbb7 28 InitMerger(1,"AliL3HoughTrack");
f0f02577 29 fRowMax = fRowMin = 0;
30 SetParameters(0.001,0.05,10);
31 Is2Global(kFALSE);
32}
33
34
35AliL3HoughIntMerger::~AliL3HoughIntMerger()
36{
37 //Destructor
38
39}
40
41void AliL3HoughIntMerger::SetParameters(Double_t maxkappa, Double_t maxphi0, Double_t maxtgl)
42{
43 fMaxKappa = maxkappa;
44 fMaxPhi0 = maxphi0;
45 fMaxTgl = maxtgl;
46}
47
48void AliL3HoughIntMerger::FillTracks(AliL3TrackArray *tracks)
49{
50 if(tracks->GetNTracks()==0)
51 LOG(AliL3Log::kWarning,"AliL3HoughIntMerger::FillTracks","Track Array")
52 <<"Adding empty track array"<<ENDLOG;
53
54 GetInTracks(0)->AddTracks(tracks,kFALSE);//Copy tracks
55 printf("Filling %d tracks to intermerger\n",tracks->GetNTracks());
56}
57
58Bool_t AliL3HoughIntMerger::IsTrack(AliL3Track *innertrack,AliL3Track *outertrack)
59{
60 //Check if the tracks can be merged, called by the track merger
61
62 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)innertrack;
63 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)outertrack;
64
65 if(abs(tr1->GetEtaIndex() - tr2->GetEtaIndex()) > 1) return kFALSE;
66 if(tr1->GetCharge()!=tr2->GetCharge()) return kFALSE;
67 if(fabs(tr1->GetKappa()-tr2->GetKappa()) >fMaxKappa) return kFALSE;
68 if(fabs(tr1->GetPhi0()-tr2->GetPhi0()) > fMaxPhi0) return kFALSE;
69
70 return kTRUE;//Tracks could be merged
71}
72
73AliL3Track *AliL3HoughIntMerger::MultiMerge(AliL3TrackArray *mergedtrack,AliL3Track **tracks, Int_t ntrack)
74{
75 //Called by the track merger
76
77 AliL3HoughTrack *newtrack = (AliL3HoughTrack*)mergedtrack->NextTrack();
78 AliL3HoughTrack **trs = (AliL3HoughTrack**)tracks;
79
80 AliL3HoughTrack *tpt=trs[0];//this is the "best" track
81 //AliL3HoughTrack *tpl=trs[ntrack-1];
82 newtrack->Set(tpt);
83 return (AliL3Track*)newtrack;
84}
85
86
87
88void AliL3HoughIntMerger::MMerge()
89{
90 GetInTracks(0)->QSort();
91 while(Merge());
92 GetOutTracks()->AddTracks(GetInTracks(0));
93}
94
95Int_t AliL3HoughIntMerger::Merge()
96{
97
98 AliL3TrackArray * tracks = GetInTracks(0);
99 const Int_t kNIn =tracks->GetNTracks();
100 AliL3Track *tr[2];
101
102 for(Int_t out=0;out<kNIn;out++)
103 {
104 AliL3HoughTrack *outertrack=(AliL3HoughTrack*)tracks->GetCheckedTrack(out);
105 if(!outertrack) continue;
106 for(Int_t in=0;in<kNIn;in++)
107 {
108 if(in==out) continue;
109 AliL3HoughTrack *innertrack=(AliL3HoughTrack*)tracks->GetCheckedTrack(in);
110 if(!innertrack) continue;
111 if(IsTrack(innertrack,outertrack))
112 {
113 tr[0]=innertrack;
114 tr[1]=outertrack;
115 SortTracks(tr,2);
116 Print(tr);
117 MultiMerge(tracks,tr,2);
118 tracks->Remove(out);
119 tracks->Remove(in);
120 break;
121 }
122 }
123 }
124 Int_t nmerged = tracks->GetNTracks()-kNIn;
125 LOG(AliL3Log::kInformational,"AliL3HoughIntMerger::Merge","Result")
126 <<AliL3Log::kDec<<"Merged Tracks: "<<nmerged<<ENDLOG;
127
128 //add in tracks
129 //GetOutTracks()->AddTracks(GetInTracks(0));
130
131 return nmerged;
132}
133
134void AliL3HoughIntMerger::Print(AliL3Track **tracks)
135{
136 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)tracks[0];
137 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)tracks[1];
138 Double_t kappadiff = fabs(tr1->GetKappa()-tr2->GetKappa());
139 Double_t phi0diff = fabs(tr1->GetPhi0()-tr2->GetPhi0());
140 cout << "---------Difference in intermerged tracks---------"<<endl;
141 cout << "Kappa: "<<kappadiff<<" Phi0 : "<<phi0diff<<endl;
142
143}
144
145void AliL3HoughIntMerger::SortTracks(AliL3Track **trs, Int_t ntrack)
146{
147 //Sort the tracks according to their weight
148
149 AliL3HoughTrack **tracks = (AliL3HoughTrack**)trs;
150 AliL3HoughTrack **tmp = new AliL3HoughTrack*[ntrack];
151 for(Int_t i=0;i<ntrack;i++) tmp[i] = (AliL3HoughTrack*)tracks[i];
152 Int_t *t = new Int_t[ntrack];
153 for(Int_t i=0;i<ntrack;i++) t[i]=-1;
154
155 for(Int_t j=0;j<ntrack;j++)
156 {
157 Double_t maxw=0;
158 Int_t maxi=0;
159 for(Int_t i=0;i<ntrack;i++)
160 {
161 if(!tracks[i]) continue;
162 if(tracks[i]->GetWeight() > maxw)
163 {
164 maxw=tracks[i]->GetWeight();
165 maxi=i;
166 }
167 }
168 t[j]=maxi;
169 tracks[maxi]=0;
170 }
171 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];
172 delete[] t;
173 delete[] tmp;
174}