3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliHLTTPCLogging.h"
7 #include "AliHLTTPCGlobalMerger.h"
8 #include "AliHLTTPCTrack.h"
9 #include "AliHLTTPCTransform.h"
10 #include "AliHLTTPCTrackArray.h"
12 /** \class AliHLTTPCGlobalMerger
14 //_____________________________________________________________
15 // AliHLTTPCGlobalMerger
17 // The HLTTPC Slice merger
26 ClassImp(AliHLTTPCGlobalMerger)
28 AliHLTTPCGlobalMerger::AliHLTTPCGlobalMerger()
30 //Default constructor. Use Setup to specify and setup the necessary parameters and arrays.
32 SetParameter(0,0,0,0,0);
39 AliHLTTPCGlobalMerger::~AliHLTTPCGlobalMerger()
44 void AliHLTTPCGlobalMerger::Setup(Int_t first,Int_t last)
46 //Used to setup the arrays and everything
48 fNSlices = last-first+1;
51 InitMerger(last-first+1);
54 void AliHLTTPCGlobalMerger::InitSlice(Int_t slice)
57 // Select Sector The following FillTracks call will
61 fCurrentTracks = fSlice - fFirst;
64 Double_t AliHLTTPCGlobalMerger::CheckTracks(AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack,Int_t slice)
66 //Compare the tracks by propagating the outermost track to the last and first point plane
67 //of the innermost track. This plane is defined by the padrow plane where these points
70 if(innertrack->GetCharge()!=outertrack->GetCharge()) return -1;
72 Float_t angle = 0;//perpendicular to the padrowplane (in local system)
73 AliHLTTPCTransform::Local2GlobalAngle(&angle,slice);
74 Double_t dx[2],dy[2],dz[2];
76 AliHLTTPCTrack *tracks[2];
77 tracks[0] = innertrack;
78 tracks[1] = outertrack;
79 SortGlobalTracks(tracks,2);
80 innertrack = tracks[0];
81 outertrack = tracks[1];
85 point[0]=innertrack->GetLastPointX();
86 point[1]=innertrack->GetLastPointY();
87 point[2]=innertrack->GetLastPointZ();
88 AliHLTTPCTransform::Global2LocHLT(point,slice);
90 outertrack->CalculateReferencePoint(angle,point[0]);//local x = global distance to padrowplane
91 if(!outertrack->IsPoint()) return diff;
92 dx[0] = fabs(outertrack->GetPointX()-innertrack->GetLastPointX());
93 dy[0] = fabs(outertrack->GetPointY()-innertrack->GetLastPointY());
94 dz[0] = fabs(outertrack->GetPointZ()-innertrack->GetLastPointZ());
96 point[0]=innertrack->GetFirstPointX();
97 point[1]=innertrack->GetFirstPointY();
98 point[2]=innertrack->GetFirstPointZ();
99 AliHLTTPCTransform::Global2LocHLT(point,slice);
101 outertrack->CalculateReferencePoint(angle,point[0]);//local x = global distance to padrowplane
102 if(!outertrack->IsPoint()) return diff;
103 dx[1] = fabs(outertrack->GetPointX()-innertrack->GetFirstPointX());
104 dy[1] = fabs(outertrack->GetPointY()-innertrack->GetFirstPointY());
105 dz[1] = fabs(outertrack->GetPointZ()-innertrack->GetFirstPointZ());
107 diff=0;//This was a tough bug to find....
108 for(Int_t i=0; i<2; i++)
109 diff += sqrt(dx[i]*dx[i] + dy[i]*dy[i] + dz[i]*dz[i]);
113 void AliHLTTPCGlobalMerger::SlowMerge(Char_t *path)
115 //Tuning of parameters. This matches _all_ tracks between two neighbouring
116 //slices, and merges the ones which are closest in space. The difference
117 //is written to a ntuppel, which can be used as a input for the SetParameters
118 //when using normal Merge function.
121 void* ntuple=GetNtuple();
122 AliHLTTPCTrack *track[2];
123 AliHLTTPCTrackArray *tout = GetOutTracks();
126 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCGlobalMerger::SlowMerge","Slice Number")
127 <<"Need more than one Slice!"<<ENDLOG;
131 for(Int_t i=0; i<fNSlices; i++)
133 //if(fNSlices!=18 && i+1 == fNSlices) continue;
134 Int_t slice = fFirst + i;
135 AliHLTTPCTrackArray *ttt0=GetInTracks(i);
137 //if(slice2==fNSlices) slice2 =0;
139 //Make sure slices are on the same side of the TPC
140 if(slice2 == 18) slice2=0;
141 else if(slice2 == 36) slice2=18;
142 AliHLTTPCTrackArray *ttt1=GetInTracks(slice2);
143 //10 degrees -> the border of the slices in local coordinates
144 Float_t angle = AliHLTTPCTransform::Pi()/18;
145 AliHLTTPCTransform::Local2GlobalAngle(&angle,slice);
147 //In the two following cases, the angle is 2*pi, so set it back to 0 in order for
148 //the calculation of crossing points to be correct.
149 if(slice==17 || slice==35)
154 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
156 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
157 if(!track0) continue;
158 track0->CalculateHelix();
159 track0->CalculateEdgePoint(angle);
160 // if(track0->IsPoint()) AddTrack(tout,track0);
162 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
164 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
165 if(!track1) continue;
166 track1->CalculateHelix();
167 track1->CalculateEdgePoint(angle);
168 // if(track1->IsPoint()) AddTrack(tout,track1);
170 Bool_t merge = kTRUE;
173 Int_t min0=-1,min1=-1;
175 Int_t n0=ttt0->GetNTracks(),n1=ttt1->GetNTracks();
176 for(Int_t s0=0;s0<n0;s0++)
178 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
179 if(!track0) continue;
180 if(!track0->IsPoint()) continue;
181 for(Int_t s1=0;s1<n1;s1++)
183 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
184 if(!track1) continue;
185 if(!track1->IsPoint()) continue;
187 //Double_t diff = TrackDiff(track0,track1,angle);
188 Double_t diff = CheckTracks(track0,track1,slice);
189 //PrintDiff(track0,track1);
190 if(diff>=0&&diff<min)
200 AliHLTTPCTrack *track0=ttt0->GetTrack(min0);
201 AliHLTTPCTrack *track1=ttt1->GetTrack(min1);
204 SortGlobalTracks(track,2);
205 track1->CalculateEdgePoint((angle+AliHLTTPCTransform::Pi()/9));
206 if(track1->IsPoint())//Check if the track will cross the boundary of yet another slice.
207 MultiMerge(ttt1,track,2);
209 MultiMerge(tout,track,2);
210 track0->CalculateReferencePoint(angle);
211 track1->CalculateReferencePoint(angle);
212 //PrintDiff(track0,track1);
213 FillNtuple(ntuple,track0,track1);
222 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCGlobalMerger::SlowMerge","Result")
223 <<AliHLTTPCLog::kDec<<"Merged Tracks: "<<tout->GetNTracks()<<" at:"
227 sprintf(fname,"%s/merge_parameters.root",path);
228 WriteNtuple(fname,ntuple);
231 void AliHLTTPCGlobalMerger::Merge()
233 //Normal merging procedure. Matches tracks which are within limits
234 //set by SetParameters. Parameters can be tuned by SlowMerge.
236 AliHLTTPCTrack *track[2];
237 AliHLTTPCTrackArray *tout = GetOutTracks();
240 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCGlobalMerger::Merge","Slice Number")
241 <<"Need more than one Slice!"<<ENDLOG;
244 for(Int_t i=0; i<fNSlices; i++)
246 //if(fNSlices!=18 && i+1 == fNSlices) continue;
247 Int_t slice = fFirst + i;
248 AliHLTTPCTrackArray *ttt0=GetInTracks(i);
250 //if(slice2==fNSlices) slice2 =0;
252 //Make sure slices are on the same side of the TPC
253 if(slice2 == 18) slice2=0;
254 else if(slice2 == 36) slice2=18;
255 AliHLTTPCTrackArray *ttt1=GetInTracks(slice2);
256 //10 degrees -> the border of the slices in local coordinates
257 Float_t angle = AliHLTTPCTransform::Pi()/18;
258 AliHLTTPCTransform::Local2GlobalAngle(&angle,slice);
260 //In the two following cases, the angle is 2*pi, so set it back to 0 in order for
261 //the calculation of crossing points to be correct.
262 if(slice==17 || slice==35)
267 Bool_t *ismatched0 = new Bool_t[ttt0->GetNTracks()];
268 Bool_t *ismatched1 = new Bool_t[ttt1->GetNTracks()];
270 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
272 ismatched0[s0]=kFALSE;
273 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
274 if(!track0) continue;
275 track0->CalculateHelix();
276 track0->CalculateEdgePoint(angle);
277 if(track0->IsPoint())
280 track0->CalculateReferencePoint(angle);
283 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
285 ismatched1[s1]=kFALSE;
286 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
287 if(!track1) continue;
288 track1->CalculateHelix();
289 track1->CalculateEdgePoint(angle);
290 if(track1->IsPoint())
293 track1->CalculateReferencePoint(angle);
296 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
298 if(ismatched0[s0]) continue;
299 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
300 if(!track0) continue;
301 if(!track0->IsPoint()) continue;
302 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
304 if(ismatched1[s1]) continue;
305 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
306 if(!track1) continue;
307 if(!track1->IsPoint()) continue;
308 if(IsRTrack(track0,track1))
312 SortGlobalTracks(track,2);
313 Double_t r0 = pow(track[0]->GetLastPointX(),2)+
314 pow(track[0]->GetLastPointY(),2);
315 Double_t r1 = pow(track[1]->GetFirstPointX(),2)+
316 pow(track[1]->GetFirstPointY(),2);
319 MultiMerge(tout,track,2);
320 ismatched0[s0]=kTRUE;
321 ismatched1[s1]=kTRUE;
326 The track is merged, so we will _not_ look for more matches.
327 Because there could easily be more matches, if a track is being
328 split within the sector....
334 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCGlobalMerger::Merge","Result")
335 <<AliHLTTPCLog::kDec<<"slice0: "<<n0<<" slice1: "<<n1
336 <<" Merged Tracks: "<<tout->GetNTracks()<<ENDLOG;
337 delete [] ismatched0;
338 delete [] ismatched1;