]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/src/AliL3GlobalMerger.cxx
Bug correction (energy recalculation when adding new incarnation of the particle).
[u/mrichter/AliRoot.git] / HLT / src / AliL3GlobalMerger.cxx
1 // @(#) $Id$
2
3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright &copy ALICE HLT Group 
5
6 #include "AliL3StandardIncludes.h"
7
8 #include "AliL3Logging.h"
9 #include "AliL3GlobalMerger.h"
10 #include "AliL3Track.h"
11 #include "AliL3Transform.h"
12 #include "AliL3TrackArray.h"
13
14 /** \class AliL3GlobalMerger
15 <pre>
16 //_____________________________________________________________
17 // AliL3GlobalMerger
18 //
19 // The L3 Slice merger
20 //
21 </pre>
22 */
23
24 ClassImp(AliL3GlobalMerger)
25
26 AliL3GlobalMerger::AliL3GlobalMerger(){
27   //Default constructor
28   Is2Global(kTRUE);
29   SetParameter(2,2,0.001,0.05,0.1);
30 }
31
32
33 AliL3GlobalMerger::AliL3GlobalMerger(Int_t first,Int_t last):AliL3Merger(last-first+1){
34   //Constructor.
35   fNSlices = last-first+1;
36   fFirst = first;
37   fLast = last;
38   Is2Global(kTRUE);
39   SetParameter(2,2,0.001,0.05,0.1);
40 }
41
42 AliL3GlobalMerger::~AliL3GlobalMerger(){
43   //Destructor
44 }
45
46 void AliL3GlobalMerger::InitSlice(Int_t slice){
47   // 
48   // Select Sector The following FillTracks call will 
49   // fill this Sector
50   //
51   fSlice = slice;
52   fCurrentTracks = fSlice - fFirst; 
53 }
54
55 Double_t AliL3GlobalMerger::CheckTracks(AliL3Track *innertrack,AliL3Track *outertrack,Int_t slice)
56 {
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
59   //are.
60   
61   
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];
65   Double_t diff =-1;
66   AliL3Track *tracks[2];
67   tracks[0] = innertrack;
68   tracks[1] = outertrack;
69   SortGlobalTracks(tracks,2);
70   innertrack = tracks[0]; 
71   outertrack = tracks[1];
72   
73   Float_t point[3];
74   
75   point[0]=innertrack->GetLastPointX();
76   point[1]=innertrack->GetLastPointY();
77   point[2]=innertrack->GetLastPointZ();
78   AliL3Transform::Global2Local(point,slice,kTRUE);
79   
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());
85   
86   point[0]=innertrack->GetFirstPointX();
87   point[1]=innertrack->GetFirstPointY();
88   point[2]=innertrack->GetFirstPointZ();
89   AliL3Transform::Global2Local(point,slice,kTRUE);
90   
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());
96   
97   for(Int_t i=0; i<2; i++)
98     diff += sqrt(dx[i]*dx[i] + dy[i]*dy[i] + dz[i]*dz[i]);
99   return diff;
100 }
101
102 void AliL3GlobalMerger::SlowMerge(){
103   void* ntuple=GetNtuple();
104   AliL3Track *track[2];
105   AliL3TrackArray *tout = GetOutTracks();
106   if(fNSlices<2){
107     LOG(AliL3Log::kWarning,"AliL3GlobalMerger::SlowMerge","Slice Number")
108     <<"Need more than one Slice!"<<ENDLOG;
109     return;
110   }
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);
115     Int_t slice2 = i+1;
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);
120     if(i==0)
121       ttt0->QSort();
122     ttt1->QSort();
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);
129     }
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); 
136     }
137     Bool_t merge = kTRUE;
138     while(merge){
139       Int_t min0=-1,min1=-1;
140       Double_t min=10;
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;
149           
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){
154             min=diff;
155             min0=s0;
156             min1=s1;
157           }
158         }
159       }
160       if(min0>=0&&min1>=0){
161         AliL3Track *track0=ttt0->GetTrack(min0);
162         AliL3Track *track1=ttt1->GetTrack(min1);
163         track[0] = track0;
164         track[1] = track1;
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);
169         else
170           MultiMerge(tout,track,2); 
171         track0->CalculateReferencePoint(angle);
172         track1->CalculateReferencePoint(angle);
173         //PrintDiff(track0,track1);
174         FillNtuple(ntuple,track0,track1);
175         ttt0->Remove(min0);
176         ttt1->Remove(min1);
177         
178       }
179       else merge = kFALSE;
180     }
181     ttt0->Compress();
182     ttt1->Compress();
183   LOG(AliL3Log::kInformational,"AliL3GlobalMerger::SlowMerge","Result")
184   <<AliL3Log::kDec<<"Merged Tracks: "<<tout->GetNTracks()<<" at:"
185   <<angle<<ENDLOG;
186   }
187   WriteNtuple("ntuple_s.root",ntuple);
188 }
189
190 void AliL3GlobalMerger::Merge(){
191   AliL3Track *track[2];
192   AliL3TrackArray *tout = GetOutTracks();
193   if(fNSlices<2){
194   LOG(AliL3Log::kWarning,"AliL3GlobalMerger::Merge","Slice Number")
195     <<"Need more than one Slice!"<<ENDLOG;
196     return;
197   }
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);
202     Int_t slice2 = i+1;
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);
207     if(i==0)
208       ttt0->QSort();
209     ttt1->QSort();
210     Bool_t *ismatched0  = new Bool_t[ttt0->GetNTracks()];
211     Bool_t *ismatched1  = new Bool_t[ttt1->GetNTracks()];
212     Int_t n0=0,n1=0;
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);}
220     }
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);}
228     }
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)){
240           track[0] = track0;
241           track[1] = 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);
247           if(r0<r1){
248             MultiMerge(tout,track,2); 
249             ismatched0[s0]=kTRUE;
250             ismatched1[s1]=kTRUE;
251             ttt0->Remove(s0);
252             ttt1->Remove(s1);
253             break;
254             /*
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
259               later by ASV....
260             */
261           }
262         }
263       }
264     }
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;
270   }
271 }