]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/hough/AliL3HoughGlobalMerger.cxx
Checking in for the weekend
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughGlobalMerger.cxx
CommitLineData
f0f02577 1// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
2//*-- Copyright &copy ASV
3
95a00d93 4#include <stdlib.h>
f0f02577 5#include <math.h>
6#include <iostream.h>
7#include "AliL3Logging.h"
8#include "AliL3HoughTrack.h"
9#include "AliL3HoughGlobalMerger.h"
10#include "AliL3Track.h"
11#include "AliL3Transform.h"
12#include "AliL3TrackArray.h"
13
14//_____________________________________________________________
15// Merging Hough tracks across slices
16
17ClassImp(AliL3HoughGlobalMerger)
18
19AliL3HoughGlobalMerger::AliL3HoughGlobalMerger(){
20 //Default constructor
21 Is2Global(kTRUE);
22 SetParameter(2,2,0.001,0.05,0.1);
23}
24
25
26AliL3HoughGlobalMerger::AliL3HoughGlobalMerger(Int_t first,Int_t last) : AliL3Merger(last-first+1,"AliL3HoughTrack")
27{
28 //Constructor.
29 fNSlices = last-first+1;
30 fFirst = first;
31 fLast = last;
32 Is2Global(kTRUE);
33 SetParameter(2,2,0.001,0.05,0.1);
34}
35
36AliL3HoughGlobalMerger::~AliL3HoughGlobalMerger(){
37 //Destructor
38}
39
40
41void AliL3HoughGlobalMerger::FillTracks(AliL3TrackArray *tracks,Int_t slice)
42{
43 fSlice = slice;
44 fCurrentTracks = fSlice - fFirst;
45 if(tracks->GetNTracks()==0)
46 LOG(AliL3Log::kWarning,"AliL3HoughGlobalMerger::FillTracks","Track Array")
47 <<AliL3Log::kDec<<"Adding empty track array in slice "<<fSlice<<ENDLOG;
48
49 GetInTracks(fCurrentTracks)->AddTracks(tracks,kFALSE,fSlice);//Copy tracks, and rotate them to global coordinates
50}
51
52Bool_t AliL3HoughGlobalMerger::IsTrack(AliL3Track *innertrack,AliL3Track *outertrack)
53{
54 //Check if the tracks can be merged, called by the track merger
55
56 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)innertrack;
57 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)outertrack;
58
59 if( (!tr1->IsPoint()) || (!tr2->IsPoint()) ) return kFALSE;
60 if(abs(tr1->GetEtaIndex() - tr2->GetEtaIndex()) > 1) return kFALSE;
61 if(tr1->GetCharge() != tr2->GetCharge()) return kFALSE;
62 if(fabs(tr1->GetPhi0() - tr2->GetPhi0()) > fMaxPhi0) return kFALSE;
63 if(fabs(tr1->GetKappa() - tr2->GetKappa()) > fMaxKappa) return kFALSE;
64
65 return kTRUE;
66}
67
68AliL3Track *AliL3HoughGlobalMerger::MultiMerge(AliL3TrackArray *mergedtrack,AliL3Track **tracks, Int_t ntrack)
69{
70 //Called by the track merger
71
72 AliL3HoughTrack *newtrack = (AliL3HoughTrack*)mergedtrack->NextTrack();
73 AliL3HoughTrack **trs = (AliL3HoughTrack**)tracks;
74 Int_t weight=0;
75
76 //Sum up the total weight:
77 for(Int_t i=ntrack-1; i>=0; i--)
78 weight += trs[i]->GetWeight();
79
80 AliL3HoughTrack *tpt=trs[0];//This is the innermost track
81 AliL3HoughTrack *tpl=trs[ntrack-1];
82 newtrack->SetTrackParameters(tpt->GetKappa(),tpt->GetPhi0(),weight);
83 newtrack->SetEtaIndex(tpt->GetEtaIndex());
84 newtrack->SetEta(tpt->GetEta());
85 newtrack->SetPsi(tpt->GetPsi());
86 newtrack->SetCenterX(tpt->GetCenterX());
87 newtrack->SetCenterY(tpt->GetCenterY());
88 newtrack->SetFirstPoint(tpt->GetFirstPointX(),tpt->GetFirstPointY(),tpt->GetFirstPointZ());
89 newtrack->SetLastPoint(tpl->GetLastPointX(),tpl->GetLastPointY(),tpl->GetLastPointZ());
90 newtrack->SetCharge(tpt->GetCharge());
91 newtrack->SetRowRange(tpt->GetFirstRow(),tpl->GetLastRow());
92
93 return (AliL3Track*)newtrack;
94
95}
96
97void AliL3HoughGlobalMerger::SlowMerge(){
98 void* ntuple=GetNtuple();
99 AliL3Track *track[2];
100 AliL3TrackArray *tout = GetOutTracks();
101 if(fNSlices<2){
102 LOG(AliL3Log::kWarning,"AliL3HoughGlobalMerger::SlowMerge","Slice Number")
103 <<"Need more than one Slice!"<<ENDLOG;
104 return;
105 }
106 for(Int_t i=0; i<fNSlices; i++){
107 if(fNSlices!=18 && i+1 == fNSlices) continue; //full cicle == 18 slices
108 Int_t slice = fFirst + i;
109 AliL3TrackArray *ttt0=GetInTracks(i);
110 Int_t slice2 = i+1;
111 if(slice2==fNSlices) slice2 =0;
112 AliL3TrackArray *ttt1=GetInTracks(slice2);
113 Float_t angle = PI/18.; //10 degrees -> the border of the slices
114 fTransformer->Local2GlobalAngle(&angle,slice);
115 if(i==0)
116 ttt0->QSort();
117 ttt1->QSort();
118 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++){
119 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
120 if(!track0) continue;
121 track0->CalculateHelix();
122 track0->CalculateEdgePoint(angle);
123// if(track0->IsPoint()) AddTrack(tout,track0);
124 }
125 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++){
126 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
127 if(!track1) continue;
128 track1->CalculateHelix();
129 track1->CalculateEdgePoint(angle);
130// if(track1->IsPoint()) AddTrack(tout,track1);
131 }
132 Bool_t merge = kTRUE;
133 while(merge){
134 Int_t min0=-1,min1=-1;
135 Double_t min=10;
136 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++){
137 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
138 if(!track0) continue;
139 if(!track0->IsPoint()) continue;
140 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++){
141 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
142 if(!track1) continue;
143 if(!track1->IsPoint()) continue;
144 Double_t diff = TrackDiff(track0,track1);
145 if(diff>=0&&diff<min){
146 min=diff;
147 min0=s0;
148 min1=s1;
149 }
150 }
151 }
152 if(min0>=0&&min1>=0){
153 AliL3Track *track0=ttt0->GetTrack(min0);
154 AliL3Track *track1=ttt1->GetTrack(min1);
155 track[0] = track0;
156 track[1] = track1;
157 SortGlobalTracks(track,2);
158 MultiMerge(tout,track,2);
159 track0->CalculateReferencePoint(angle);
160 track1->CalculateReferencePoint(angle);
161 PrintDiff(track0,track1);
162 FillNtuple(ntuple,track0,track1);
163 ttt0->Remove(min0);
164 ttt1->Remove(min1);
165 }
166 else merge = kFALSE;
167 }
168 ttt0->Compress();
169 ttt1->Compress();
170 LOG(AliL3Log::kInformational,"AliL3HoughGlobalMerger::SlowMerge","Result")
171 <<AliL3Log::kDec<<"Merged Tracks: "<<tout->GetNTracks()<<" at:"
172 <<angle<<ENDLOG;
173 }
174 WriteNtuple("ntuple_s.root",ntuple);
175}
176
177void AliL3HoughGlobalMerger::Merge()
178{
179 AliL3Track *track[2];
180 AliL3TrackArray *tout = GetOutTracks();
181 if(fNSlices<2){
182 LOG(AliL3Log::kWarning,"AliL3HoughGlobalMerger::Merge","Slice Number")
183 <<"Need more than one Slice!"<<ENDLOG;
184 return;
185 }
186 Bool_t *ismatched0=0;
187 Bool_t *ismatched1=0;
188 for(Int_t i=0; i<fNSlices; i++)
189 {
190 if(fNSlices!=18 && i+1 == fNSlices) continue; //full cicle == 18 slices
191 Int_t slice = fFirst + i;
192 AliL3TrackArray *ttt0=GetInTracks(i);
193 Int_t slice2 = i+1;
194 if(slice2==fNSlices) slice2 =0;
195 AliL3TrackArray *ttt1=GetInTracks(slice2);
196 Float_t angle = PI/18.; //10 degrees -> the border of the slices
197 fTransformer->Local2GlobalAngle(&angle,slice);
198 if(i==0)
199 ttt0->QSort();
200 ttt1->QSort();
201 if(ismatched0) delete [] ismatched0;
202 if(ismatched1) delete [] ismatched1;
203 ismatched0 = new Bool_t[ttt0->GetNTracks()];
204 ismatched1 = new Bool_t[ttt1->GetNTracks()];
205 Int_t n0=0,n1=0;
206 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
207 {
208 ismatched0[s0]=kFALSE;
209 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
210 if(!track0) continue;
211 track0->CalculateHelix();
212 track0->CalculateEdgePoint(angle);
213 if(track0->IsPoint()) {n0++;track0->CalculateReferencePoint(angle);
214 }
215 }
216 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
217 {
218 ismatched1[s1]=kFALSE;
219 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
220 if(!track1) continue;
221 track1->CalculateHelix();
222 track1->CalculateEdgePoint(angle);
223 if(track1->IsPoint()) {n1++;track1->CalculateReferencePoint(angle);
224 }
225 }
226 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
227 {
228 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
229 if(!track0) continue;
230 if(!track0->IsPoint()) continue;
231 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
232 {
233 if(ismatched1[s1]) continue;
234 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
235 if(!track1) continue;
236 if(!track1->IsPoint()) continue;
237 if(IsTrack(track0,track1))
238 {
239 track[0] = track0;
240 track[1] = track1;
241 SortGlobalTracks(track,2);
242 Double_t r0 = pow(track[0]->GetLastPointX(),2) + pow(track[0]->GetLastPointY(),2);
243 Double_t r1 = pow(track[1]->GetFirstPointX(),2) + pow(track[1]->GetFirstPointY(),2);
244 if(r0<r1)
245 {
246 MultiMerge(tout,track,2);
247 ismatched0[s0]=kTRUE;
248 ismatched1[s1]=kTRUE;
249 ttt0->Remove(s0);
250 ttt1->Remove(s1);
251 }
252 }
253 }
254 }
255 LOG(AliL3Log::kInformational,"AliL3HoughGlobalMerger::Merge","Result")
256 <<AliL3Log::kDec<<"slice0: "<<n0<<" slice1: "<<n1
257 <<" Merged Tracks: "<<tout->GetNTracks()<<ENDLOG;
258 }
259 if(ismatched0) delete [] ismatched0;
260 if(ismatched1) delete [] ismatched1;
261}