ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
InnerDetector
InDetRecTools
TRT_TrackSegmentsTool_xk
TRT_TrackSegmentsTool_xk
TRT_TrackSegmentsUtils_xk.h
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3
*/
4
6
// Header file for class TRT_TrackSegmentsUtils_xk
8
// (c) ATLAS Detector software
10
// Class for straight line finder
12
// Version 1.0 3/10/2004 I.Gavrilenko
14
15
#ifndef TRT_TrackSegmentsUtils_xk_H
16
#define TRT_TrackSegmentsUtils_xk_H
17
18
#include <new>
19
#include <cmath>
20
#include <algorithm>
21
22
namespace
InDet
{
23
24
class
TRT_TrackSegmentsUtils_xk
25
{
27
// Public methods:
29
30
public
:
31
32
TRT_TrackSegmentsUtils_xk
();
33
~TRT_TrackSegmentsUtils_xk
();
34
36
// Main methods
38
39
const
int
&
size
()
const
{
return
m_size
;}
40
void
initiate
(
int
);
41
template
<
class
T>
void
findStraightLine
(
int
,T*,
const
T*,
const
T*);
42
template
<
class
T>
void
sort
(T*,
int
*,
int
n);
43
44
protected
:
45
47
// Protected Data
49
50
int
m_size
;
51
int
*
m_NA
;
52
int
*
m_MA
;
53
double
*
m_F
;
54
56
// Methods
58
59
};
60
62
// Inline methods
64
65
inline
TRT_TrackSegmentsUtils_xk::TRT_TrackSegmentsUtils_xk
()
66
{
67
m_size
= 0;
68
m_NA
= 0;
69
m_MA
= 0;
70
m_F
= 0;
71
}
72
73
inline
void
TRT_TrackSegmentsUtils_xk::initiate
(
int
n)
74
{
75
if
(n<=0)
return
;
76
77
if
(
m_size
) {
78
79
delete
[]
m_NA
;
80
delete
[]
m_MA
;
81
delete
[]
m_F
;
82
}
83
m_size
= n;
84
m_NA
=
new
int
[n];
85
m_MA
=
new
int
[n];
86
m_F
=
new
double
[n];
87
}
88
89
inline
TRT_TrackSegmentsUtils_xk::~TRT_TrackSegmentsUtils_xk
()
90
{
91
if
(!
m_size
)
return
;
92
delete
[]
m_NA
;
93
delete
[]
m_MA
;
94
delete
[]
m_F
;
95
}
96
98
// Search a stright line Y = A*X+B crossed max number segments
99
// Input parameters: X - X-coordinates of the segment boundaries
100
// Y - Y-coordinates ------
101
// par[0] - initial A
102
// par[1] - initial B
103
// par[2] - boundary of A abs(A)<DA
104
//
105
// Output parameters : A,B - stright line parameters Y = A*X+B
106
// Program try to find a stright line which cross a segments a such a way that
107
// total number of all crossed segments to get max value
109
110
template
<
class
Tem>
void
TRT_TrackSegmentsUtils_xk::findStraightLine
111
(
int
Np, Tem* par,
const
Tem* X,
const
Tem* Y)
112
{
113
if
(
m_size
<2 || Np<2 )
return
;
114
if
(Np>
m_size
) Np =
m_size
;
115
116
Tem
A
= par[0];
117
Tem B = par[1];
118
Tem Amax = fabs(par[2]);
119
120
int
i=0;
121
while
(i!=Np) {
122
m_NA
[i]=i;
m_F
[i]=Y[i]; ++i;
123
m_NA
[i]=i;
m_F
[i]=Y[i]; ++i;
124
}
125
126
sort
(
m_F
,
m_NA
,Np);
127
128
// Search B with A = par[0];
129
//
130
i=0;
int
sm=0, s=0, l=0;
131
while
(i!=Np) {
132
if
((
m_NA
[i ]&1)==(
m_MA
[i ]=0)) {
if
(++s>sm) {sm=s; l= i;}}
else
--s;
133
if
((
m_NA
[i+1]&1)==(
m_MA
[i+1]=0)) {
if
(++s>sm) {sm=s; l=1+i;}}
else
--s; i+=2;
134
}
135
B = .5*(Y[
m_NA
[l]]+Y[
m_NA
[l+1]]);
136
137
// Search A and B
138
//
139
while
(1) {
140
141
i=(l=
m_NA
[l]); Tem u0=X[l], v0=Y[l];
142
143
// Vector slopes preparation
144
//
145
146
while
(++i!=Np) {
if
(X[i]!=u0)
break
;} Tem U1=-1000., d=0.;
int
m=0;
147
while
(i<Np-1) {
148
149
if
(X[i]==U1) {
150
if
(fabs(
m_F
[m]=(Y[i ]-v0)*d)<Amax)
m_NA
[m++]=i;
151
if
(fabs(
m_F
[m]=(Y[i+1]-v0)*d)<Amax)
m_NA
[m++]=i+1;
152
}
153
else
{
154
d=1./((U1=X[i])-u0);
155
if
(fabs(
m_F
[m]=(Y[i ]-v0)*d)<Amax)
m_NA
[m++]=i;
156
if
(fabs(
m_F
[m]=(Y[i+1]-v0)*d)<Amax)
m_NA
[m++]=i+1;
157
}
158
i+=2;
159
}
160
(i=l);
while
(--i>0) {
if
(X[i]!=u0)
break
;} U1=-1000.;
161
while
(i>0) {
162
if
(X[i]==U1) {
163
if
(fabs(
m_F
[m]=(Y[i ]-v0)*d)<Amax)
m_NA
[m++]=i;
164
if
(fabs(
m_F
[m]=(Y[i-1]-v0)*d)<Amax)
m_NA
[m++]=i-1;
165
166
}
167
else
{
168
d=1./((U1=X[i])-u0);
169
if
(fabs(
m_F
[m]=(Y[i ]-v0)*d)<Amax)
m_NA
[m++]=i;
170
if
(fabs(
m_F
[m]=(Y[i-1]-v0)*d)<Amax)
m_NA
[m++]=i-1;
171
}
172
i-=2;
173
}
174
175
if
(m<=4)
break
;
176
sort
(
m_F
,
m_NA
,m);
177
178
int
nm = 0; s = 0; sm=-1000;
179
for
(
int
i=0; i!=m-1; ++i) {
180
int
na =
m_NA
[i];
181
if
((na&1)==0) {
if
(na>l) {
if
(++s>sm) {sm=s; nm=i;}}
else
--s;}
182
else
{
if
(na<l) {
if
(++s>sm) {sm=s; nm=i;}}
else
--s;}
183
}
184
if
(nm==0)
break
;
185
B = v0-(
A
=.5*(
m_F
[nm]+
m_F
[nm+1]))*u0;
m_MA
[l]=1;
186
if
(
m_MA
[
m_NA
[nm ]]==0) l = nm;
187
else
if
(
m_MA
[
m_NA
[nm+1]]==0) l = nm+1;
188
else
break
;
189
}
190
par[0] =
A
;
191
par[1] = B;
192
}
193
195
// The procedure sorts the elements of the array A(1:N)
196
// into ascending order. Algorithm 271, Comm., ACM(1965) p.669
197
//
198
// Input parameters : a - one-dimension array of elements
199
// to be sorted
200
// b - one-dimension array of elements
201
// to be sorted together with a
202
// n - number of words to be sorted
204
205
template
<
class
Tem>
void
TRT_TrackSegmentsUtils_xk::sort
(Tem*
a
,
int
* b,
int
n) {
206
207
if
(n<=1)
return
;
208
int
mt[50],lt[50], j=n-1, i=0, m=0;
209
while
(1) {
210
if
(j-i>1) {
211
int
ip=(j+i)>>1, q=j; Tem ta=
a
[ip];
a
[ip]=
a
[i];
int
tb=b[ip]; b[ip]=b[i];
212
for
(
int
k =i+1; k<=q; ++k) {
213
if
(
a
[k]<=ta)
continue
;
214
int
l=q;
215
while
(1) {
216
if
(
a
[l]<ta) {
217
Tem
x
=
a
[k];
a
[k]=
a
[l];
a
[l]=
x
;
218
int
y
=b[k]; b[k]=b[l]; b[l]=
y
; q=l-1;
break
;
219
}
220
if
(--l< k) {q=k-1;
break
;}
221
}
222
}
223
a
[i]=
a
[q];
a
[q]=ta; b[i]=b[q]; b[q]=tb;
224
if
((q<<1)>i+j) {lt[m]=i; mt[m++]=q-1; i=q+1;}
225
else
{lt[m]=q+1; mt[m++]=j; j=q-1;}
226
}
227
else
{
228
if
(i<j &&
a
[i]>
a
[j]) {
229
Tem
x
=
a
[i];
a
[i]=
a
[j];
a
[j]=
x
;
230
int
y
=b[i]; b[i]=b[j]; b[j]=
y
;
231
}
232
if
(--m<0)
return
;
233
i=lt[m]; j=mt[m];
234
}
235
}
236
}
237
}
// end of name space
238
239
#endif
// TRT_TrackSegmentsUtils_xk
a
static Double_t a
Definition
LArPhysWaveHECTool.cxx:38
y
#define y
x
#define x
InDet::TRT_TrackSegmentsUtils_xk::TRT_TrackSegmentsUtils_xk
TRT_TrackSegmentsUtils_xk()
Definition
TRT_TrackSegmentsUtils_xk.h:65
InDet::TRT_TrackSegmentsUtils_xk::~TRT_TrackSegmentsUtils_xk
~TRT_TrackSegmentsUtils_xk()
Definition
TRT_TrackSegmentsUtils_xk.h:89
InDet::TRT_TrackSegmentsUtils_xk::m_F
double * m_F
Definition
TRT_TrackSegmentsUtils_xk.h:53
InDet::TRT_TrackSegmentsUtils_xk::m_NA
int * m_NA
Definition
TRT_TrackSegmentsUtils_xk.h:51
InDet::TRT_TrackSegmentsUtils_xk::initiate
void initiate(int)
Definition
TRT_TrackSegmentsUtils_xk.h:73
InDet::TRT_TrackSegmentsUtils_xk::m_MA
int * m_MA
Definition
TRT_TrackSegmentsUtils_xk.h:52
InDet::TRT_TrackSegmentsUtils_xk::m_size
int m_size
Definition
TRT_TrackSegmentsUtils_xk.h:50
InDet::TRT_TrackSegmentsUtils_xk::size
const int & size() const
Definition
TRT_TrackSegmentsUtils_xk.h:39
InDet::TRT_TrackSegmentsUtils_xk::findStraightLine
void findStraightLine(int, T *, const T *, const T *)
InDet::TRT_TrackSegmentsUtils_xk::sort
void sort(T *, int *, int n)
InDet
Primary Vertex Finder.
Definition
VP1ErrorUtils.h:36
A
hold the test vectors and ease the comparison
Generated on
for ATLAS Offline Software by
1.17.0