3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3Logging.h"
9 #include "AliL3GlobalMerger.h"
10 #include "AliL3Track.h"
11 #include "AliL3Transform.h"
12 #include "AliL3TrackArray.h"
14 /** \class AliL3GlobalMerger
16 //_____________________________________________________________
19 // The L3 Slice merger
24 ClassImp(AliL3GlobalMerger)
26 AliL3GlobalMerger::AliL3GlobalMerger(){
29 SetParameter(2,2,0.001,0.05,0.1);
33 AliL3GlobalMerger::AliL3GlobalMerger(Int_t first,Int_t last):AliL3Merger(last-first+1){
35 fNSlices = last-first+1;
39 SetParameter(2,2,0.001,0.05,0.1);
42 AliL3GlobalMerger::~AliL3GlobalMerger(){
46 void AliL3GlobalMerger::InitSlice(Int_t slice){
48 // Select Sector The following FillTracks call will
52 fCurrentTracks = fSlice - fFirst;
55 Double_t AliL3GlobalMerger::CheckTracks(AliL3Track *innertrack,AliL3Track *outertrack,Int_t slice)
57 //Compare the tracks by propagating the outermost track to the last and first point plane
58 //of the innermost track. This plane is defined by the padrow plane where these points
62 Float_t angle = PI/36;//5 degrees = perpendicular to padrowplane (in local system)
63 AliL3Transform::Local2GlobalAngle(&angle,slice);
64 Double_t dx[2],dy[2],dz[2];
66 AliL3Track *tracks[2];
67 tracks[0] = innertrack;
68 tracks[1] = outertrack;
69 SortGlobalTracks(tracks,2);
70 innertrack = tracks[0];
71 outertrack = tracks[1];
75 point[0]=innertrack->GetLastPointX();
76 point[1]=innertrack->GetLastPointY();
77 point[2]=innertrack->GetLastPointZ();
78 AliL3Transform::Global2Local(point,slice,kTRUE);
80 outertrack->CalculateReferencePoint(angle,point[0]);//local x = global distance to padrowplane
81 if(!outertrack->IsPoint()) return diff;
82 dx[0] = fabs(outertrack->GetPointX()-innertrack->GetLastPointX());
83 dy[0] = fabs(outertrack->GetPointY()-innertrack->GetLastPointY());
84 dz[0] = fabs(outertrack->GetPointZ()-innertrack->GetLastPointZ());
86 point[0]=innertrack->GetFirstPointX();
87 point[1]=innertrack->GetFirstPointY();
88 point[2]=innertrack->GetFirstPointZ();
89 AliL3Transform::Global2Local(point,slice,kTRUE);
91 outertrack->CalculateReferencePoint(angle,point[0]);//local x = global distance to padrowplane
92 if(!outertrack->IsPoint()) return diff;
93 dx[1] = fabs(outertrack->GetPointX()-innertrack->GetFirstPointX());
94 dy[1] = fabs(outertrack->GetPointY()-innertrack->GetFirstPointY());
95 dz[1] = fabs(outertrack->GetPointZ()-innertrack->GetFirstPointZ());
97 for(Int_t i=0; i<2; i++)
98 diff += sqrt(dx[i]*dx[i] + dy[i]*dy[i] + dz[i]*dz[i]);
102 void AliL3GlobalMerger::SlowMerge(){
103 void* ntuple=GetNtuple();
104 AliL3Track *track[2];
105 AliL3TrackArray *tout = GetOutTracks();
107 LOG(AliL3Log::kWarning,"AliL3GlobalMerger::SlowMerge","Slice Number")
108 <<"Need more than one Slice!"<<ENDLOG;
111 for(Int_t i=0; i<fNSlices; i++){
112 if(fNSlices!=18 && i+1 == fNSlices) continue; //full cicle == 18 slices
113 Int_t slice = fFirst + i;
114 AliL3TrackArray *ttt0=GetInTracks(i);
116 if(slice2==fNSlices) slice2 =0;
117 AliL3TrackArray *ttt1=GetInTracks(slice2);
118 Float_t angle = PI/18.; //10 degrees -> the border of the slices
119 AliL3Transform::Local2GlobalAngle(&angle,slice);
123 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++){
124 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
125 if(!track0) continue;
126 track0->CalculateHelix();
127 track0->CalculateEdgePoint(angle);
128 // if(track0->IsPoint()) AddTrack(tout,track0);
130 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++){
131 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
132 if(!track1) continue;
133 track1->CalculateHelix();
134 track1->CalculateEdgePoint(angle);
135 // if(track1->IsPoint()) AddTrack(tout,track1);
137 Bool_t merge = kTRUE;
139 Int_t min0=-1,min1=-1;
141 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++){
142 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
143 if(!track0) continue;
144 if(!track0->IsPoint()) continue;
145 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++){
146 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
147 if(!track1) continue;
148 if(!track1->IsPoint()) continue;
150 //Double_t diff = TrackDiff(track0,track1,angle);
151 Double_t diff = CheckTracks(track0,track1,slice);
152 //PrintDiff(track0,track1);
153 if(diff>=0&&diff<min){
160 if(min0>=0&&min1>=0){
161 AliL3Track *track0=ttt0->GetTrack(min0);
162 AliL3Track *track1=ttt1->GetTrack(min1);
165 SortGlobalTracks(track,2);
166 track1->CalculateEdgePoint((angle+PI/9));
167 if(track1->IsPoint())//Check if the track will cross the boundary of yet another slice.
168 MultiMerge(ttt1,track,2);
170 MultiMerge(tout,track,2);
171 track0->CalculateReferencePoint(angle);
172 track1->CalculateReferencePoint(angle);
173 //PrintDiff(track0,track1);
174 FillNtuple(ntuple,track0,track1);
183 LOG(AliL3Log::kInformational,"AliL3GlobalMerger::SlowMerge","Result")
184 <<AliL3Log::kDec<<"Merged Tracks: "<<tout->GetNTracks()<<" at:"
187 WriteNtuple("ntuple_s.root",ntuple);
190 void AliL3GlobalMerger::Merge(){
191 AliL3Track *track[2];
192 AliL3TrackArray *tout = GetOutTracks();
194 LOG(AliL3Log::kWarning,"AliL3GlobalMerger::Merge","Slice Number")
195 <<"Need more than one Slice!"<<ENDLOG;
198 for(Int_t i=0; i<fNSlices; i++){
199 if(fNSlices!=18 && i+1 == fNSlices) continue; //full cicle == 18 slices
200 Int_t slice = fFirst + i;
201 AliL3TrackArray *ttt0=GetInTracks(i);
203 if(slice2==fNSlices) slice2 =0;
204 AliL3TrackArray *ttt1=GetInTracks(slice2);
205 Float_t angle = PI/18.; //10 degrees -> the border of the slices
206 AliL3Transform::Local2GlobalAngle(&angle,slice);
210 Bool_t *ismatched0 = new Bool_t[ttt0->GetNTracks()];
211 Bool_t *ismatched1 = new Bool_t[ttt1->GetNTracks()];
213 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++){
214 ismatched0[s0]=kFALSE;
215 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
216 if(!track0) continue;
217 track0->CalculateHelix();
218 track0->CalculateEdgePoint(angle);
219 if(track0->IsPoint()) {n0++;track0->CalculateReferencePoint(angle);}
221 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++){
222 ismatched1[s1]=kFALSE;
223 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
224 if(!track1) continue;
225 track1->CalculateHelix();
226 track1->CalculateEdgePoint(angle);
227 if(track1->IsPoint()) {n1++;track1->CalculateReferencePoint(angle);}
229 for(Int_t s0=0;s0<ttt0->GetNTracks();s0++){
230 if(ismatched0[s0]) continue;
231 AliL3Track *track0=ttt0->GetCheckedTrack(s0);
232 if(!track0) continue;
233 if(!track0->IsPoint()) continue;
234 for(Int_t s1=0;s1<ttt1->GetNTracks();s1++){
235 if(ismatched1[s1]) continue;
236 AliL3Track *track1=ttt1->GetCheckedTrack(s1);
237 if(!track1) continue;
238 if(!track1->IsPoint()) continue;
239 if(IsRTrack(track0,track1)){
242 SortGlobalTracks(track,2);
243 Double_t r0 = pow(track[0]->GetLastPointX(),2)+
244 pow(track[0]->GetLastPointY(),2);
245 Double_t r1 = pow(track[1]->GetFirstPointX(),2)+
246 pow(track[1]->GetFirstPointY(),2);
248 MultiMerge(tout,track,2);
249 ismatched0[s0]=kTRUE;
250 ismatched1[s1]=kTRUE;
255 The track is merged, so we will _not_ look for more matches.
256 Because there could easily be more matches, if a track is being
257 split within the sector.
258 This bug was brought to you by Dr.Frankenfeld, and fixed 2 years
265 LOG(AliL3Log::kInformational,"AliL3GlobalMerger::Merge","Result")
266 <<AliL3Log::kDec<<"slice0: "<<n0<<" slice1: "<<n1
267 <<" Merged Tracks: "<<tout->GetNTracks()<<ENDLOG;
268 delete [] ismatched0;
269 delete [] ismatched1;