95 const auto& orig = origin.first;
97 LogDebug(
"AreaSeededTrackingRegionsProducer") <<
"Origin x,y,z " << orig.x() <<
"," << orig.y() <<
"," << orig.z();
99 auto vecFromOrigPlusRadius = [&](
const std::array<float, 2>& vec) {
102 return std::array<float, 2>{{vec[0] *
tmp, vec[1] * tmp}};
104 auto tangentVec = [&](
const std::array<float, 2>& vec,
int sign) {
109 const auto orthvec =
sign > 0 ? std::array<float, 2>{{-vec[1] *
tmp, vec[0] * tmp}}
110 : std::array<float, 2>{{vec[1] *
tmp, -vec[0] * tmp}};
111 return std::array<float, 2>{{vec[0] - orthvec[0], vec[1] - orthvec[1]}};
114 for (
const auto&
area : areas) {
117 LogTrace(
"AreaSeededTrackingRegionsBuilder")
118 <<
" area x,y points " <<
area.x_rmin_phimin() <<
"," <<
area.y_rmin_phimin() <<
" " 119 <<
area.x_rmin_phimax() <<
"," <<
area.y_rmin_phimax() <<
" " <<
area.x_rmax_phimax() <<
"," 120 <<
area.y_rmax_phimax() <<
" " <<
area.x_rmax_phimin() <<
"," <<
area.y_rmax_phimin() <<
" " 121 <<
"z " <<
area.zmin() <<
"," <<
area.zmax();
124 const float x_rmin_phimin =
area.x_rmin_phimin() - orig.x();
125 const float x_rmin_phimax =
area.x_rmin_phimax() - orig.x();
126 const float y_rmin_phimin =
area.y_rmin_phimin() - orig.y();
127 const float y_rmin_phimax =
area.y_rmin_phimax() - orig.y();
129 const std::array<float, 2> p_rmin_phimin = {{x_rmin_phimin, y_rmin_phimin}};
130 const std::array<float, 2> p_rmin_phimax = {{x_rmin_phimax, y_rmin_phimax}};
131 const std::array<float, 2> p_rmax_phimin = {{
area.x_rmax_phimin() - orig.x(),
area.y_rmax_phimin() - orig.y()}};
132 const std::array<float, 2> p_rmax_phimax = {{
area.x_rmax_phimax() - orig.x(),
area.y_rmax_phimax() - orig.y()}};
139 const std::array<float, 2> p_rmin =
perp2(p_rmin_phimin) <
perp2(p_rmin_phimax) ? p_rmin_phimin : p_rmin_phimax;
140 const std::array<float, 2> p_rmax =
perp2(p_rmax_phimin) >
perp2(p_rmax_phimax) ? p_rmax_phimin : p_rmax_phimax;
145 const auto p_min = vecFromOrigPlusRadius(p_rmin);
146 const auto p_max = vecFromOrigPlusRadius(p_rmax);
149 const auto etamin =
std::min(etaFromXYZ(p_min[0], p_min[1],
area.zmin() - (orig.z() + origin.second)),
150 etaFromXYZ(p_max[0], p_max[1],
area.zmin() - (orig.z() + origin.second)));
151 const auto etamax =
std::max(etaFromXYZ(p_min[0], p_min[1],
area.zmax() - (orig.z() - origin.second)),
152 etaFromXYZ(p_max[0], p_max[1],
area.zmax() - (orig.z() - origin.second)));
180 const auto phi_ref = std::atan2(y_rmin_phimin + y_rmin_phimax, x_rmin_phimin + x_rmin_phimax);
183 const auto tan_rmin_phimax = tangentVec(p_rmin_phimax, +1);
184 const auto tan_rmax_phimax = tangentVec(p_rmax_phimax, +1);
185 const auto phi_rmin_phimax = std::atan2(tan_rmin_phimax[1], tan_rmin_phimax[0]);
186 const auto phi_rmax_phimax = std::atan2(tan_rmax_phimax[1], tan_rmax_phimax[0]);
193 LogTrace(
"AreaSeededTrackingRegionBuilder")
194 <<
" rmin_phimax vec " << p_rmin_phimax[0] <<
"," << p_rmin_phimax[1] <<
" tangent " << tan_rmin_phimax[0]
195 <<
"," << tan_rmin_phimax[1] <<
" phi " << phi_rmin_phimax <<
"\n" 196 <<
" rmax_phimax vec " << p_rmax_phimax[0] <<
"," << p_rmax_phimax[1] <<
" tangent " << tan_rmax_phimax[0]
197 <<
"," << tan_rmax_phimax[1] <<
" phi " << phi_rmax_phimax <<
"\n" 201 const auto tan_rmin_phimin = tangentVec(p_rmin_phimin, -1);
202 const auto tan_rmax_phimin = tangentVec(p_rmax_phimin, -1);
203 const auto phi_rmin_phimin = std::atan2(tan_rmin_phimin[1], tan_rmin_phimin[0]);
204 const auto phi_rmax_phimin = std::atan2(tan_rmax_phimin[1], tan_rmax_phimin[0]);
211 LogTrace(
"AreaSeededTrackingRegionBuilder")
212 <<
" rmin_phimin vec " << p_rmin_phimin[0] <<
"," << p_rmin_phimin[1] <<
" tangent " << tan_rmin_phimin[0]
213 <<
"," << tan_rmin_phimin[1] <<
" phi " << phi_rmin_phimin <<
"\n" 214 <<
" rmax_phimin vec " << p_rmax_phimin[0] <<
"," << p_rmax_phimin[1] <<
" tangent " << tan_rmax_phimin[0]
215 <<
"," << tan_rmax_phimin[1] <<
" phi " << phi_rmax_phimin <<
"\n" 219 if (phimax < phimin) {
226 LogTrace(
"AreaSeededTrackingRegionBuilder") <<
" phi min,max " << phimin <<
"," <<
phimax;
232 LogTrace(
"AreaSeededTrackingRegionBuilder")
233 <<
" windows after this area eta " << minEta <<
"," <<
maxEta <<
" phi " << minPhi <<
"," <<
maxPhi;
236 const auto meanEta = (minEta +
maxEta) / 2.
f;
237 const auto meanPhi = (minPhi +
maxPhi) / 2.
f;
241 auto useCandidates =
false;
243 useCandidates =
true;
247 for (
const auto&
object : *
candidates.first) {
250 float eta_Cand =
object.eta();
251 float phi_Cand =
object.phi();
252 float dEta_Cand_Point =
std::abs(eta_Cand - meanEta);
255 if (dEta_Cand_Point > (dEta_Cand +
dEta) || dPhi_Cand_Point > (dPhi_Cand +
dPhi))
258 float etaMin_RoI =
std::max(eta_Cand - dEta_Cand, meanEta -
dEta);
259 float etaMax_RoI =
std::min(eta_Cand + dEta_Cand, meanEta +
dEta);
266 float phiMin_RoI =
deltaPhi(phi_Cand_minus, phi_Point_minus) > 0. ? phi_Cand_minus : phi_Point_minus;
267 float phiMax_RoI =
deltaPhi(phi_Cand_plus, phi_Point_plus) < 0. ? phi_Cand_plus : phi_Point_plus;
269 const auto meanEtaTemp = (etaMin_RoI + etaMax_RoI) / 2.
f;
270 auto meanPhiTemp = (phiMin_RoI + phiMax_RoI) / 2.
f;
271 if (phiMax_RoI < phiMin_RoI)
275 const auto dPhiTemp =
deltaPhi(phiMax_RoI, meanPhiTemp);
276 const auto dEtaTemp = etaMax_RoI - meanEtaTemp;
282 LogTrace(
"AreaSeededTrackingRegionsBuilder")
283 <<
"Direction x,y,z " <<
x <<
"," <<
y <<
"," <<
z <<
" eta,phi " << meanEtaTemp <<
"," << meanPhiTemp
284 <<
" window eta " << (meanEtaTemp - dEtaTemp) <<
"," << (meanEtaTemp + dEtaTemp) <<
" phi " 285 << (meanPhiTemp - dPhiTemp) <<
"," << (meanPhiTemp + dPhiTemp);
287 return std::make_unique<RectangularEtaPhiTrackingRegion>(
GlobalVector(
x,
y,
z),
307 LogTrace(
"AreaSeededTrackingRegionsBuilder")
308 <<
"Direction x,y,z " <<
x <<
"," <<
y <<
"," <<
z <<
" eta,phi " << meanEta <<
"," << meanPhi <<
" window eta " 309 << (meanEta -
dEta) <<
"," << (meanEta +
dEta) <<
" phi " << (meanPhi -
dPhi) <<
"," << (meanPhi +
dPhi);
311 return std::make_unique<RectangularEtaPhiTrackingRegion>(
GlobalVector(
x,
y,
z),
constexpr double deltaPhi(double phi1, double phi2)
const AreaSeededTrackingRegionsBuilder * m_conf
constexpr T normalizedPhi(T phi)
Sin< T >::type sin(const T &t)
TrackingSeedCandidates::Objects candidates
RectangularEtaPhiTrackingRegion::UseMeasurementTracker m_whereToUseMeasurementTracker
Cos< T >::type cos(const T &t)
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
const MeasurementTrackerEvent * m_measurementTracker
T perp2() const
Squared magnitude of transverse component.
Global3DVector GlobalVector