50 {
52 double x1 = hpos1.x();
53 double y1 = hpos1.y();
54 double r1 = std::abs(firstHit.driftRadius());
56 double x2 = hpos2.x();
57 double y2 = hpos2.y();
58 double r2 = std::abs(lastHit.driftRadius());
59
60 double DeltaX =
x2 -
x1;
61 double DeltaY =
y2 -
y1;
62 double DistanceOfCenters = std::hypot(DeltaX, DeltaY);
63 double Alpha0 = std::atan2(DeltaY, DeltaX);
64
66
69 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: calculating Lines (" <<
x1 <<
"," <<
y1 <<
") " <<
r1 <<
" ("
71 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: general dir " << (hpos2 - hpos1).
unit()
73 }
74
75
76 if (r1 == 0. && r2 == 0.) {
81 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " <<
pos <<
" dir " <<
dir <<
endmsg;
82 }
83 list_of_lines.push_back(std::make_pair(pos, dir));
84 return list_of_lines;
85 }
86
87
88 double RSum =
r1 +
r2;
89 double Alpha1 = std::asin(RSum / DistanceOfCenters);
90
91 double line_phi = Alpha0 + Alpha1;
92
93 Amg::Vector3D pos1(x1 + r1 * std::sin(line_phi), y1 - r1 * std::cos(line_phi), 0.);
94 Amg::Vector3D dir1(std::cos(line_phi), std::sin(line_phi), 0.);
95
98 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " << pos1 <<
" dir " << dir1 <<
endmsg;
99 }
100
101 list_of_lines.push_back(std::make_pair(pos1, dir1));
102
103 line_phi = Alpha0 - Alpha1;
104
105 Amg::Vector3D pos2(x1 - r1 * std::sin(line_phi), y1 + r1 * std::cos(line_phi), 0.);
106 Amg::Vector3D dir2(std::cos(line_phi), std::sin(line_phi), 0.);
107
110 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " << pos2 <<
" dir " << dir2 <<
endmsg;
111 }
112
113 list_of_lines.push_back(std::make_pair(pos2, dir2));
114
115
116 if (r1 == 0. || r2 == 0.) return list_of_lines;
117
118
119 double DeltaR = std::abs(r2 - r1);
120 double Alpha2 = std::asin(DeltaR / DistanceOfCenters);
121
122 if (r1 < r2) {
125 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: r1 < r2" <<
endmsg;
126 }
127
128 line_phi = Alpha0 + Alpha2;
129
130 Amg::Vector3D pos3(x1 - r1 * std::sin(line_phi), y1 + r1 * std::cos(line_phi), 0.);
131 Amg::Vector3D dir3(std::cos(line_phi), std::sin(line_phi), 0.);
132
135 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " << pos3 <<
" dir " << dir3 <<
endmsg;
136 }
137
138 list_of_lines.push_back(std::make_pair(pos3, dir3));
139
140 line_phi = Alpha0 - Alpha2;
141
142 Amg::Vector3D pos4(x1 + r1 * std::sin(line_phi), y1 - r1 * std::cos(line_phi), 0.);
143 Amg::Vector3D dir4(std::cos(line_phi), std::sin(line_phi), 0.);
144
147 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " << pos4 <<
" dir " << dir4 <<
endmsg;
148 }
149
150 list_of_lines.push_back(std::make_pair(pos4, dir4));
151
152 } else {
155 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: r1 > r2" <<
endmsg;
156 }
157
158 line_phi = Alpha0 + Alpha2;
159
160 Amg::Vector3D pos3(x1 + r1 * std::sin(line_phi), y1 - r1 * std::cos(line_phi), 0.);
161 Amg::Vector3D dir3(std::cos(line_phi), std::sin(line_phi), 0.);
162
165 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " << pos3 <<
" dir " << dir3 <<
endmsg;
166 }
167
168 list_of_lines.push_back(std::make_pair(pos3, dir3));
169
170 line_phi = Alpha0 - Alpha2;
171
172 Amg::Vector3D pos4(x1 - r1 * std::sin(line_phi), y1 + r1 * std::cos(line_phi), 0.);
173 Amg::Vector3D dir4(std::cos(line_phi), std::sin(line_phi), 0.);
174
177 log << MSG::VERBOSE <<
"LocalSegmentResolver::getLines: line pos " << pos4 <<
" dir " << dir4 <<
endmsg;
178 }
179
180 list_of_lines.push_back(std::make_pair(pos4, dir4));
181 }
182
183 return list_of_lines;
184 }
const PlainObject unit() const
This is a plugin that makes Eigen look like CLHEP & defines some convenience methods.
std::vector< Line > LineVec