]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/hough/AliL3HoughIntMerger.cxx
Merging classes
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughIntMerger.cxx
CommitLineData
f0f02577 1// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
2//*-- Copyright &copy ASV
3
4#include <math.h>
5#include <iostream.h>
6#include "AliL3Logging.h"
7#include "AliL3HoughIntMerger.h"
8#include "AliL3HoughTrack.h"
9#include "AliL3TrackSegmentData.h"
10#include "AliL3Transform.h"
11#include "AliL3TrackArray.h"
12
13//_____________________________________________________________
14// Hough Inter merger
15// Merging of multiple reconstructed tracks
16
17ClassImp(AliL3HoughIntMerger)
18
19AliL3HoughIntMerger::AliL3HoughIntMerger() : AliL3Merger(1,"AliL3HoughTrack")
20{
21 //Default constructor
22 fRowMax = fRowMin = 0;
23 SetParameters(0.001,0.05,10);
24 Is2Global(kFALSE);
25}
26
27
28AliL3HoughIntMerger::~AliL3HoughIntMerger()
29{
30 //Destructor
31
32}
33
34void AliL3HoughIntMerger::SetParameters(Double_t maxkappa, Double_t maxphi0, Double_t maxtgl)
35{
36 fMaxKappa = maxkappa;
37 fMaxPhi0 = maxphi0;
38 fMaxTgl = maxtgl;
39}
40
41void AliL3HoughIntMerger::FillTracks(AliL3TrackArray *tracks)
42{
43 if(tracks->GetNTracks()==0)
44 LOG(AliL3Log::kWarning,"AliL3HoughIntMerger::FillTracks","Track Array")
45 <<"Adding empty track array"<<ENDLOG;
46
47 GetInTracks(0)->AddTracks(tracks,kFALSE);//Copy tracks
48 printf("Filling %d tracks to intermerger\n",tracks->GetNTracks());
49}
50
51Bool_t AliL3HoughIntMerger::IsTrack(AliL3Track *innertrack,AliL3Track *outertrack)
52{
53 //Check if the tracks can be merged, called by the track merger
54
55 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)innertrack;
56 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)outertrack;
57
58 if(abs(tr1->GetEtaIndex() - tr2->GetEtaIndex()) > 1) return kFALSE;
59 if(tr1->GetCharge()!=tr2->GetCharge()) return kFALSE;
60 if(fabs(tr1->GetKappa()-tr2->GetKappa()) >fMaxKappa) return kFALSE;
61 if(fabs(tr1->GetPhi0()-tr2->GetPhi0()) > fMaxPhi0) return kFALSE;
62
63 return kTRUE;//Tracks could be merged
64}
65
66AliL3Track *AliL3HoughIntMerger::MultiMerge(AliL3TrackArray *mergedtrack,AliL3Track **tracks, Int_t ntrack)
67{
68 //Called by the track merger
69
70 AliL3HoughTrack *newtrack = (AliL3HoughTrack*)mergedtrack->NextTrack();
71 AliL3HoughTrack **trs = (AliL3HoughTrack**)tracks;
72
73 AliL3HoughTrack *tpt=trs[0];//this is the "best" track
74 //AliL3HoughTrack *tpl=trs[ntrack-1];
75 newtrack->Set(tpt);
76 return (AliL3Track*)newtrack;
77}
78
79
80
81void AliL3HoughIntMerger::MMerge()
82{
83 GetInTracks(0)->QSort();
84 while(Merge());
85 GetOutTracks()->AddTracks(GetInTracks(0));
86}
87
88Int_t AliL3HoughIntMerger::Merge()
89{
90
91 AliL3TrackArray * tracks = GetInTracks(0);
92 const Int_t kNIn =tracks->GetNTracks();
93 AliL3Track *tr[2];
94
95 for(Int_t out=0;out<kNIn;out++)
96 {
97 AliL3HoughTrack *outertrack=(AliL3HoughTrack*)tracks->GetCheckedTrack(out);
98 if(!outertrack) continue;
99 for(Int_t in=0;in<kNIn;in++)
100 {
101 if(in==out) continue;
102 AliL3HoughTrack *innertrack=(AliL3HoughTrack*)tracks->GetCheckedTrack(in);
103 if(!innertrack) continue;
104 if(IsTrack(innertrack,outertrack))
105 {
106 tr[0]=innertrack;
107 tr[1]=outertrack;
108 SortTracks(tr,2);
109 Print(tr);
110 MultiMerge(tracks,tr,2);
111 tracks->Remove(out);
112 tracks->Remove(in);
113 break;
114 }
115 }
116 }
117 Int_t nmerged = tracks->GetNTracks()-kNIn;
118 LOG(AliL3Log::kInformational,"AliL3HoughIntMerger::Merge","Result")
119 <<AliL3Log::kDec<<"Merged Tracks: "<<nmerged<<ENDLOG;
120
121 //add in tracks
122 //GetOutTracks()->AddTracks(GetInTracks(0));
123
124 return nmerged;
125}
126
127void AliL3HoughIntMerger::Print(AliL3Track **tracks)
128{
129 AliL3HoughTrack *tr1 = (AliL3HoughTrack*)tracks[0];
130 AliL3HoughTrack *tr2 = (AliL3HoughTrack*)tracks[1];
131 Double_t kappadiff = fabs(tr1->GetKappa()-tr2->GetKappa());
132 Double_t phi0diff = fabs(tr1->GetPhi0()-tr2->GetPhi0());
133 cout << "---------Difference in intermerged tracks---------"<<endl;
134 cout << "Kappa: "<<kappadiff<<" Phi0 : "<<phi0diff<<endl;
135
136}
137
138void AliL3HoughIntMerger::SortTracks(AliL3Track **trs, Int_t ntrack)
139{
140 //Sort the tracks according to their weight
141
142 AliL3HoughTrack **tracks = (AliL3HoughTrack**)trs;
143 AliL3HoughTrack **tmp = new AliL3HoughTrack*[ntrack];
144 for(Int_t i=0;i<ntrack;i++) tmp[i] = (AliL3HoughTrack*)tracks[i];
145 Int_t *t = new Int_t[ntrack];
146 for(Int_t i=0;i<ntrack;i++) t[i]=-1;
147
148 for(Int_t j=0;j<ntrack;j++)
149 {
150 Double_t maxw=0;
151 Int_t maxi=0;
152 for(Int_t i=0;i<ntrack;i++)
153 {
154 if(!tracks[i]) continue;
155 if(tracks[i]->GetWeight() > maxw)
156 {
157 maxw=tracks[i]->GetWeight();
158 maxi=i;
159 }
160 }
161 t[j]=maxi;
162 tracks[maxi]=0;
163 }
164 for(Int_t i=0;i<ntrack;i++) tracks[i] = tmp[t[i]];
165 delete[] t;
166 delete[] tmp;
167}