1 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
2 //*-- Copyright © ASV
7 #include "AliL3Logging.h"
8 #include "AliL3HoughTrack.h"
9 #include "AliL3HoughGlobalMerger.h"
10 #include "AliL3Track.h"
11 #include "AliL3TrackArray.h"
12 #include "AliL3Transform.h"
14 //_____________________________________________________________
15 // Merging Hough tracks across slices
17 ClassImp(AliL3HoughGlobalMerger)
19 AliL3HoughGlobalMerger::AliL3HoughGlobalMerger(){
22 SetParameter(2,2,0.001,0.05,0.1);
26 AliL3HoughGlobalMerger::AliL3HoughGlobalMerger(Int_t first,Int_t last) : AliL3Merger(last-first+1,"AliL3HoughTrack")
29 fNSlices = last-first+1;
33 SetParameter(2,2,0.001,0.05,0.1);
36 AliL3HoughGlobalMerger::~AliL3HoughGlobalMerger(){
41 void AliL3HoughGlobalMerger::FillTracks(AliL3TrackArray *tracks,Int_t 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;
49 GetInTracks(fCurrentTracks)->AddTracks(tracks,kFALSE,fSlice);//Copy tracks, and rotate them to global coordinates
52 Bool_t AliL3HoughGlobalMerger::IsTrack(AliL3Track *innertrack,AliL3Track *outertrack)
54 //Check if the tracks can be merged, called by the track merger
56 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)innertrack;
57 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)outertrack;
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;
68 AliL3Track *AliL3HoughGlobalMerger::MultiMerge(AliL3TrackArray *mergedtrack,AliL3Track **tracks, Int_t ntrack)
70 //Called by the track merger
72 AliL3HoughTrack *newtrack = (AliL3HoughTrack*)mergedtrack->NextTrack();
73 AliL3HoughTrack **trs = (AliL3HoughTrack**)tracks;
76 //Sum up the total weight:
77 for(Int_t i=ntrack-1; i>=0; i--)
78 weight += trs[i]->GetWeight();
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());
93 return (AliL3Track*)newtrack;
97 void AliL3HoughGlobalMerger::SlowMerge(){
98 void* ntuple=GetNtuple();
100 AliL3TrackArray *tout = GetOutTracks();
102 LOG(AliL3Log::kWarning,"AliL3HoughGlobalMerger::SlowMerge","Slice Number")
103 <<"Need more than one Slice!"<<ENDLOG;
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);
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 AliL3Transform::Local2GlobalAngle(&angle,slice);
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);
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);
132 Bool_t merge = kTRUE;
134 Int_t min0=-1,min1=-1;
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){
152 if(min0>=0&&min1>=0){
153 AliL3Track *track0=ttt0->GetTrack(min0);
154 AliL3Track *track1=ttt1->GetTrack(min1);
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);
170 LOG(AliL3Log::kInformational,"AliL3HoughGlobalMerger::SlowMerge","Result")
171 <<AliL3Log::kDec<<"Merged Tracks: "<<tout->GetNTracks()<<" at:"
174 WriteNtuple("ntuple_s.root",ntuple);
177 void AliL3HoughGlobalMerger::Merge()
179 AliL3Track *track[2];
180 AliL3TrackArray *tout = GetOutTracks();
182 LOG(AliL3Log::kWarning,"AliL3HoughGlobalMerger::Merge","Slice Number")
183 <<"Need more than one Slice!"<<ENDLOG;
186 Bool_t *ismatched0=0;
187 Bool_t *ismatched1=0;
188 for(Int_t i=0; i<fNSlices; i++)
190 if(fNSlices!=18 && i+1 == fNSlices) continue; //full cicle == 18 slices
191 Int_t slice = fFirst + i;
192 AliL3TrackArray *ttt0=GetInTracks(i);
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 AliL3Transform::Local2GlobalAngle(&angle,slice);
201 if(ismatched0) delete [] ismatched0;
202 if(ismatched1) delete [] ismatched1;
203 ismatched0 = new Bool_t[ttt0->GetNTracks()];
204 ismatched1 = new Bool_t[ttt1->GetNTracks()];
206 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
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);
216 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
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);
226 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
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++)
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))
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);
246 MultiMerge(tout,track,2);
247 ismatched0[s0]=kTRUE;
248 ismatched1[s1]=kTRUE;
255 LOG(AliL3Log::kInformational,"AliL3HoughGlobalMerger::Merge","Result")
256 <<AliL3Log::kDec<<"slice0: "<<n0<<" slice1: "<<n1
257 <<" Merged Tracks: "<<tout->GetNTracks()<<ENDLOG;
259 if(ismatched0) delete [] ismatched0;
260 if(ismatched1) delete [] ismatched1;