2 // Original: AliHLTGlobalMerger.cxx,v 1.13 2005/06/14 10:55:21 cvetan
4 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
5 //*-- Copyright © ALICE HLT Group
7 #include "AliHLTTPCLogging.h"
8 #include "AliHLTTPCGlobalMerger.h"
9 #include "AliHLTTPCTrack.h"
10 #include "AliHLTTPCTransform.h"
11 #include "AliHLTTPCTrackArray.h"
13 /** \class AliHLTTPCGlobalMerger
15 //_____________________________________________________________
16 // AliHLTTPCGlobalMerger
18 // The HLTTPC Slice merger
27 ClassImp(AliHLTTPCGlobalMerger)
29 AliHLTTPCGlobalMerger::AliHLTTPCGlobalMerger()
31 //Default constructor. Use Setup to specify and setup the necessary parameters and arrays.
33 SetParameter(0,0,0,0,0);
40 AliHLTTPCGlobalMerger::~AliHLTTPCGlobalMerger()
45 void AliHLTTPCGlobalMerger::Setup(Int_t first,Int_t last)
47 //Used to setup the arrays and everything
49 fNSlices = last-first+1;
52 InitMerger(last-first+1);
55 void AliHLTTPCGlobalMerger::InitSlice(Int_t slice)
58 // Select Sector The following FillTracks call will
62 fCurrentTracks = fSlice - fFirst;
65 Double_t AliHLTTPCGlobalMerger::CheckTracks(AliHLTTPCTrack *innertrack,AliHLTTPCTrack *outertrack,Int_t slice)
67 //Compare the tracks by propagating the outermost track to the last and first point plane
68 //of the innermost track. This plane is defined by the padrow plane where these points
71 if(innertrack->GetCharge()!=outertrack->GetCharge()) return -1;
73 Float_t angle = 0;//perpendicular to the padrowplane (in local system)
74 AliHLTTPCTransform::Local2GlobalAngle(&angle,slice);
75 Double_t dx[2],dy[2],dz[2];
77 AliHLTTPCTrack *tracks[2];
78 tracks[0] = innertrack;
79 tracks[1] = outertrack;
80 SortGlobalTracks(tracks,2);
81 innertrack = tracks[0];
82 outertrack = tracks[1];
86 point[0]=innertrack->GetLastPointX();
87 point[1]=innertrack->GetLastPointY();
88 point[2]=innertrack->GetLastPointZ();
89 AliHLTTPCTransform::Global2LocHLT(point,slice);
91 outertrack->CalculateReferencePoint(angle,point[0]);//local x = global distance to padrowplane
92 if(!outertrack->IsPoint()) return diff;
93 dx[0] = fabs(outertrack->GetPointX()-innertrack->GetLastPointX());
94 dy[0] = fabs(outertrack->GetPointY()-innertrack->GetLastPointY());
95 dz[0] = fabs(outertrack->GetPointZ()-innertrack->GetLastPointZ());
97 point[0]=innertrack->GetFirstPointX();
98 point[1]=innertrack->GetFirstPointY();
99 point[2]=innertrack->GetFirstPointZ();
100 AliHLTTPCTransform::Global2LocHLT(point,slice);
102 outertrack->CalculateReferencePoint(angle,point[0]);//local x = global distance to padrowplane
103 if(!outertrack->IsPoint()) return diff;
104 dx[1] = fabs(outertrack->GetPointX()-innertrack->GetFirstPointX());
105 dy[1] = fabs(outertrack->GetPointY()-innertrack->GetFirstPointY());
106 dz[1] = fabs(outertrack->GetPointZ()-innertrack->GetFirstPointZ());
108 diff=0;//This was a tough bug to find....
109 for(Int_t i=0; i<2; i++)
110 diff += sqrt(dx[i]*dx[i] + dy[i]*dy[i] + dz[i]*dz[i]);
114 void AliHLTTPCGlobalMerger::SlowMerge(Char_t *path)
116 //Tuning of parameters. This matches _all_ tracks between two neighbouring
117 //slices, and merges the ones which are closest in space. The difference
118 //is written to a ntuppel, which can be used as a input for the SetParameters
119 //when using normal Merge function.
122 void* ntuple=GetNtuple();
123 AliHLTTPCTrack *track[2];
124 AliHLTTPCTrackArray *tout = GetOutTracks();
127 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCGlobalMerger::SlowMerge","Slice Number")
128 <<"Need more than one Slice!"<<ENDLOG;
132 for(Int_t i=0; i<fNSlices; i++)
134 //if(fNSlices!=18 && i+1 == fNSlices) continue;
135 Int_t slice = fFirst + i;
136 AliHLTTPCTrackArray *ttt0=GetInTracks(i);
138 //if(slice2==fNSlices) slice2 =0;
140 //Make sure slices are on the same side of the TPC
141 if(slice2 == 18) slice2=0;
142 else if(slice2 == 36) slice2=18;
143 AliHLTTPCTrackArray *ttt1=GetInTracks(slice2);
144 //10 degrees -> the border of the slices in local coordinates
145 Float_t angle = AliHLTTPCTransform::Pi()/18;
146 AliHLTTPCTransform::Local2GlobalAngle(&angle,slice);
148 //In the two following cases, the angle is 2*pi, so set it back to 0 in order for
149 //the calculation of crossing points to be correct.
150 if(slice==17 || slice==35)
155 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
157 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
158 if(!track0) continue;
159 track0->CalculateHelix();
160 track0->CalculateEdgePoint(angle);
161 // if(track0->IsPoint()) AddTrack(tout,track0);
163 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
165 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
166 if(!track1) continue;
167 track1->CalculateHelix();
168 track1->CalculateEdgePoint(angle);
169 // if(track1->IsPoint()) AddTrack(tout,track1);
171 Bool_t merge = kTRUE;
174 Int_t min0=-1,min1=-1;
176 Int_t n0=ttt0->GetNTracks(),n1=ttt1->GetNTracks();
177 for(Int_t s0=0;s0<n0;s0++)
179 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
180 if(!track0) continue;
181 if(!track0->IsPoint()) continue;
182 for(Int_t s1=0;s1<n1;s1++)
184 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
185 if(!track1) continue;
186 if(!track1->IsPoint()) continue;
188 //Double_t diff = TrackDiff(track0,track1,angle);
189 Double_t diff = CheckTracks(track0,track1,slice);
190 //PrintDiff(track0,track1);
191 if(diff>=0&&diff<min)
201 AliHLTTPCTrack *track0=ttt0->GetTrack(min0);
202 AliHLTTPCTrack *track1=ttt1->GetTrack(min1);
205 SortGlobalTracks(track,2);
206 track1->CalculateEdgePoint((angle+AliHLTTPCTransform::Pi()/9));
207 if(track1->IsPoint())//Check if the track will cross the boundary of yet another slice.
208 MultiMerge(ttt1,track,2);
210 MultiMerge(tout,track,2);
211 track0->CalculateReferencePoint(angle);
212 track1->CalculateReferencePoint(angle);
213 //PrintDiff(track0,track1);
214 FillNtuple(ntuple,track0,track1);
223 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCGlobalMerger::SlowMerge","Result")
224 <<AliHLTTPCLog::kDec<<"Merged Tracks: "<<tout->GetNTracks()<<" at:"
228 sprintf(fname,"%s/merge_parameters.root",path);
229 WriteNtuple(fname,ntuple);
232 void AliHLTTPCGlobalMerger::Merge()
234 //Normal merging procedure. Matches tracks which are within limits
235 //set by SetParameters. Parameters can be tuned by SlowMerge.
237 AliHLTTPCTrack *track[2];
238 AliHLTTPCTrackArray *tout = GetOutTracks();
241 LOG(AliHLTTPCLog::kWarning,"AliHLTTPCGlobalMerger::Merge","Slice Number")
242 <<"Need more than one Slice!"<<ENDLOG;
245 for(Int_t i=0; i<fNSlices; i++)
247 //if(fNSlices!=18 && i+1 == fNSlices) continue;
248 Int_t slice = fFirst + i;
249 AliHLTTPCTrackArray *ttt0=GetInTracks(i);
251 //if(slice2==fNSlices) slice2 =0;
253 //Make sure slices are on the same side of the TPC
254 if(slice2 == 18) slice2=0;
255 else if(slice2 == 36) slice2=18;
256 AliHLTTPCTrackArray *ttt1=GetInTracks(slice2);
257 //10 degrees -> the border of the slices in local coordinates
258 Float_t angle = AliHLTTPCTransform::Pi()/18;
259 AliHLTTPCTransform::Local2GlobalAngle(&angle,slice);
261 //In the two following cases, the angle is 2*pi, so set it back to 0 in order for
262 //the calculation of crossing points to be correct.
263 if(slice==17 || slice==35)
268 Bool_t *ismatched0 = new Bool_t[ttt0->GetNTracks()];
269 Bool_t *ismatched1 = new Bool_t[ttt1->GetNTracks()];
271 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
273 ismatched0[s0]=kFALSE;
274 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
275 if(!track0) continue;
276 track0->CalculateHelix();
277 track0->CalculateEdgePoint(angle);
278 if(track0->IsPoint())
281 track0->CalculateReferencePoint(angle);
284 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
286 ismatched1[s1]=kFALSE;
287 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
288 if(!track1) continue;
289 track1->CalculateHelix();
290 track1->CalculateEdgePoint(angle);
291 if(track1->IsPoint())
294 track1->CalculateReferencePoint(angle);
297 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++)
299 if(ismatched0[s0]) continue;
300 AliHLTTPCTrack *track0=ttt0->GetCheckedTrack(s0);
301 if(!track0) continue;
302 if(!track0->IsPoint()) continue;
303 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++)
305 if(ismatched1[s1]) continue;
306 AliHLTTPCTrack *track1=ttt1->GetCheckedTrack(s1);
307 if(!track1) continue;
308 if(!track1->IsPoint()) continue;
309 if(IsRTrack(track0,track1))
313 SortGlobalTracks(track,2);
314 Double_t r0 = pow(track[0]->GetLastPointX(),2)+
315 pow(track[0]->GetLastPointY(),2);
316 Double_t r1 = pow(track[1]->GetFirstPointX(),2)+
317 pow(track[1]->GetFirstPointY(),2);
320 MultiMerge(tout,track,2);
321 ismatched0[s0]=kTRUE;
322 ismatched1[s1]=kTRUE;
327 The track is merged, so we will _not_ look for more matches.
328 Because there could easily be more matches, if a track is being
329 split within the sector....
335 LOG(AliHLTTPCLog::kInformational,"AliHLTTPCGlobalMerger::Merge","Result")
336 <<AliHLTTPCLog::kDec<<"slice0: "<<n0<<" slice1: "<<n1
337 <<" Merged Tracks: "<<tout->GetNTracks()<<ENDLOG;
338 delete [] ismatched0;
339 delete [] ismatched1;