3 // Author: Uli Frankenfeld <mailto:franken@fi.uib.no>
4 //*-- Copyright © ALICE HLT Group
6 /** \class AliL3TrackMerger
8 //_____________________________________________________________
11 // The L3 track segment merger
16 #include "AliL3StandardIncludes.h"
18 #include "AliL3Logging.h"
19 #include "AliL3TrackMerger.h"
20 #include "AliL3Track.h"
21 #include "AliL3TrackSegmentData.h"
22 #include "AliL3Transform.h"
23 #include "AliL3TrackArray.h"
25 ClassImp(AliL3TrackMerger)
27 AliL3TrackMerger::AliL3TrackMerger(){
37 AliL3TrackMerger::AliL3TrackMerger(Int_t nsubsectors) : AliL3Merger()
40 InitMerger(nsubsectors);
41 fNSubSector = nsubsectors;
45 fRowMin = new Int_t[nsubsectors];
46 fRowMax = new Int_t[nsubsectors];
50 AliL3TrackMerger::~AliL3TrackMerger(){
54 void AliL3TrackMerger::SetRows(Int_t *row){
55 //Set the indeces of the first and last
58 for(Int_t i=0;i<fNSubSector;i++){
59 fRowMin[i]=*(row+(2*i));
60 fRowMax[i]=*(row+(2*i+1));
64 void AliL3TrackMerger::InitSector(Int_t slice,Int_t subsector){
66 // Select Sector and subsector. The following FillTracks call will
67 // fill this subsector
70 fSubSector = subsector;
71 fCurrentTracks = fSubSector;
74 void AliL3TrackMerger::SlowMerge(AliL3TrackArray *mergedtrack,AliL3TrackArray *tracksin,AliL3TrackArray *tracksout,Double_t xval){
76 // Slow merging of two AliL3TrackArrays
77 // at reference plane x=xval
79 void *ntuple=GetNtuple();
80 const Int_t kNOut=tracksout->GetNTracks();
81 const Int_t kNIn =tracksin->GetNTracks();
82 const Int_t kNMerged =mergedtrack->GetNTracks();
83 AliL3Track *tracks[2];
86 Int_t inmin=-1,outmin=-1;
88 for(Int_t out=0;out<kNOut;out++){
89 AliL3Track *outertrack=tracksout->GetCheckedTrack(out);
90 if(!outertrack) continue;
91 for(Int_t in=0;in<kNIn;in++){
92 AliL3Track *innertrack=tracksin->GetCheckedTrack(in);
93 if(!innertrack) continue;
94 Double_t diff = TrackDiff(innertrack,outertrack);
95 if(diff>=0&&diff<min){
102 if(inmin>=0&&outmin>=0){
103 AliL3Track *outertrack=tracksout->GetTrack(outmin);
104 AliL3Track *innertrack=tracksin->GetTrack(inmin);
105 tracks[0]=innertrack;
106 tracks[1]=outertrack;
107 SortTracks(tracks,2);
108 MultiMerge(mergedtrack,tracks,2);
109 outertrack->CalculatePoint(xval);
110 innertrack->CalculatePoint(xval);
111 PrintDiff(innertrack,outertrack);
112 //FillNtuple(ntuple,innertrack,outertrack);
113 tracksout->Remove(outmin);
114 tracksin->Remove(inmin);
115 // tracksout->Compress();
116 // tracksin->Compress();
120 LOG(AliL3Log::kInformational,"AliL3TrackMerger::SlowMerge","Result")
121 <<AliL3Log::kDec<<"Merged Tracks: "
122 <<mergedtrack->GetNTracks()-kNMerged<<ENDLOG;
123 char name[256] = "ntuple_t.root";
124 for(Int_t i=0;i<4;i++)
125 if(tracksin==GetInTracks(i))
126 sprintf(name,"ntuple_t_%d.root",i);
127 WriteNtuple(name,ntuple);
130 void AliL3TrackMerger::SlowMerge(){
135 void AliL3TrackMerger::InterMerge(){
137 // Merging of the tracks
138 // between readout patches
140 for(Int_t patch=0;patch< GetNIn();patch++){
141 AliL3TrackArray * tracks = GetInTracks(patch);
142 Double_t xval = AliL3Transform::Row2X((fRowMax[patch]+fRowMin[patch])/2);
143 Int_t nrow= fRowMax[patch]-fRowMin[patch]+1;
144 const Int_t kNIn =tracks->GetNTracks();
146 for(Int_t in=0;in<kNIn;in++){
147 AliL3Track *t = tracks->GetCheckedTrack(in);
150 t->CalculatePoint(xval);
153 for(Int_t out=0;out<kNIn;out++){
154 AliL3Track *outertrack=tracks->GetCheckedTrack(out);
155 if(!outertrack) continue;
156 for(Int_t in=0;in<kNIn;in++){
157 if(in==out) continue;
158 AliL3Track *innertrack=tracks->GetCheckedTrack(in);
159 if(!innertrack) continue;
160 if(outertrack->GetNHits()+innertrack->GetNHits()>nrow) continue;
162 if(IsTrack(innertrack,outertrack)){
166 if(tr[0]->GetLastPointX()<tr[1]->GetFirstPointX()){
167 MultiMerge(tracks,tr,2);
175 Int_t nmerged = tracks->GetNTracks()-kNIn;
176 LOG(AliL3Log::kInformational,"AliL3TrackMerger::InterMerge","Result")
177 <<AliL3Log::kDec<<"Merged Tracks: "<<nmerged<<ENDLOG;
181 void AliL3TrackMerger::Merge(){
182 //Loop over tracks and pass them to the track merger.
183 Double_t edge0 = AliL3Transform::Pi()/18;
184 Double_t edge1 = AliL3Transform::TwoPi() - edge0;
185 AliL3TrackArray *ttt = GetOutTracks();
187 GetOutTracks()->AddTracks(GetInTracks(0));
188 LOG(AliL3Log::kInformational,"AliL3TrackMerger::Merge","Result")
189 <<AliL3Log::kDec<<"Total Copied Tracks: "<<GetOutTracks()->GetNPresent()
193 Int_t subsec = fNSubSector -2;
194 for(Int_t i=subsec;i>=0;i--){
195 AliL3TrackArray *tout = GetOutTracks();
196 if(i==subsec) tout = GetInTracks(subsec+1);
197 AliL3TrackArray *tin = GetInTracks(i);
198 Double_t xval = AliL3Transform::Row2X(fRowMax[i]);
199 Double_t xmax = AliL3Transform::Row2X(fRowMax[i+1]);
200 Double_t ymax = xval*tan(edge0);
201 for(Int_t out=0;out<tout->GetNTracks();out++){
202 AliL3Track *outtrack=tout->GetCheckedTrack(out);
203 if(!outtrack) continue;
204 outtrack->CalculateHelix();
205 outtrack->CalculatePoint(xval);
206 if(outtrack->IsPoint()&&fabs(outtrack->GetPointY())>ymax){
207 if(outtrack->GetNHits()<10)
212 for(Int_t in=0;in<tin->GetNTracks();in++){
213 AliL3Track *intrack=(AliL3Track*)tin->GetTrack(in);
214 intrack->CalculateHelix();
215 intrack->CalculatePoint(xval);
220 if(fSlow) SlowMerge(ttt,tin,tout,xval);
221 else Merge(ttt,tin,tout);
222 for(Int_t in=0;in<tin->GetNTracks();in++){
223 AliL3Track *intrack=(AliL3Track*)tin->GetCheckedTrack(in);
224 if(!intrack) continue;
225 if(intrack->CalculateEdgePoint(edge0)){
226 if(intrack->GetPointX()<xmax ){
227 AddTrack(ttt,intrack);
231 else if(intrack->CalculateEdgePoint(edge1)){
232 if(intrack->GetPointX()<xmax ){
233 AddTrack(ttt,intrack);
239 for(Int_t in=0;in<tin->GetNTracks();in++){
240 AliL3Track *intrack=(AliL3Track*)tin->GetCheckedTrack(in);
241 if(!intrack) continue;
242 if(intrack->GetNHits()<10) continue;
243 AddTrack(ttt,intrack);
247 } // end subsector loop
248 LOG(AliL3Log::kInformational,"AliL3TrackMerger::Merge","Result")
249 <<AliL3Log::kDec<<"Total Merged Tracks: "<<GetOutTracks()->GetNPresent()
253 Int_t AliL3TrackMerger::Merge(AliL3TrackArray* mergedtrack,AliL3TrackArray *tracksin,AliL3TrackArray *tracksout){
254 //Loop over tracks and pass them to the track merger.
255 AliL3Track *tracks[2];
257 const Int_t kNOut=tracksout->GetNTracks();
258 const Int_t kNIn =tracksin->GetNTracks();
259 const Int_t kNMerged =mergedtrack->GetNTracks();
261 Bool_t *ismatchedin = new Bool_t[kNIn];
262 for(Int_t in =0;in<kNIn;in++)
263 ismatchedin[in]=kFALSE;
264 Bool_t *ismatchedout = new Bool_t[kNOut];
265 for(Int_t out =0;out<kNOut;out++)
266 ismatchedout[out] = kFALSE;
267 for(Int_t out =0;out<kNOut;out++){
268 AliL3Track *outertrack=(AliL3Track*)tracksout->GetCheckedTrack(out);
269 if(!outertrack) continue;
270 for(Int_t in =0;in<kNIn;in++){
271 if(ismatchedin[in]) continue;
272 AliL3Track *innertrack=(AliL3Track*)tracksin->GetCheckedTrack(in);
273 if(!innertrack) continue;
274 if(outertrack==innertrack) continue;
275 if(outertrack->GetCharge()!=innertrack->GetCharge()) continue;
276 if(IsTrack(innertrack,outertrack)){
277 tracks[0]=innertrack; tracks[1]=outertrack;
278 SortTracks(tracks,2);
279 if(tracks[0]->GetLastPointX()<tracks[1]->GetFirstPointX()){
280 MultiMerge(mergedtrack,tracks,2);
281 tracksout->Remove(out);
282 tracksin->Remove(in);
283 ismatchedin[in]=kTRUE;
284 ismatchedout[out]=kTRUE;
291 Int_t nmerged = mergedtrack->GetNTracks()-kNMerged;
292 LOG(AliL3Log::kInformational,"AliL3TrackMerger::Merge","Result")
293 <<AliL3Log::kDec<<"Merged Tracks: "<<nmerged<<ENDLOG;
294 delete[] ismatchedin;
295 delete[] ismatchedout;