19 const std::vector<const Trk::SpacePoint*>& spacePoints)
const
28 if (spacePoints.size() < 3) {
33 std::vector<const Trk::SpacePoint*> pixelSP,SP;
35 for(
const auto&
sp : spacePoints){
37 pixelSP.push_back(
sp);
45 unsigned int middleIdx = pixelSP.size() == 3 ? 1 : pixelSP.size()/2;
46 SP = {pixelSP[0], pixelSP[middleIdx], pixelSP.back()};
51 if(!cl)
return nullptr;
55 if(!pla)
return nullptr;
58 double x0 = SP[0]->globalPosition().x();
59 double y0 = SP[0]->globalPosition().y();
60 double z0 = SP[0]->globalPosition().z();
62 double x1 = SP[1]->globalPosition().x() - x0;
63 double y1 = SP[1]->globalPosition().y() - y0;
65 double x2 = SP[2]->globalPosition().x() - x0;
66 double y2 = SP[2]->globalPosition().y() - y0;
67 double z2 = SP[2]->globalPosition().z() - z0;
71 double u1 = 1./std::sqrt(x1*x1+y1*y1);
73 double rn = x2*x2+y2*y2;
79 double u2 = (
a*x2+b*y2)*r2;
80 double v2 = (
a*y2-b*x2)*r2;
83 double A = v2/(u2-u1);
84 double T = z2*sqrt(r2);
89 double Ax[3] = {
Tp(0,0),
Tp(1,0),
Tp(2,0)};
91 double Ay[3] = {
Tp(0,1),
Tp(1,1),
Tp(2,1)};
93 double D [3] = {
Tp(0,3),
Tp(1,3),
Tp(2,3)};
95 double d[3] = {x0-D[0],y0-D[1],z0-D[2]};
97 double track_paras[5];
99 track_paras[0] = d[0]*Ax[0]+d[1]*Ax[1]+d[2]*Ax[2];
100 track_paras[1] = d[0]*Ay[0]+d[1]*Ay[1]+d[2]*Ay[2];
101 track_paras[2] = std::atan2(b+
a*
A,
a-b*
A);
102 track_paras[3] = std::atan2(1.,T) ;
103 track_paras[4] = 0.001/std::sqrt(1.+T*T);
106 "linearConformalMapping: \n" << \
107 "\nlocal x = " << track_paras[0] << \
108 "\nlocal y = " << track_paras[1] << \
109 "\nphi = " << track_paras[2] << \
110 "\ntheta = " << track_paras[3] << \
111 "\nqoverp = " << track_paras[4]);
113 bool any_nan =
false;
114 for (
int i = 0; i < 5; i++) {
115 if (std::isnan(track_paras[i])) {
121 ATH_MSG_DEBUG(
"Seed parameters contain NaN elements - skipping this track ");
125 std::unique_ptr<const Trk::TrackParameters> trkParameters(
128 if (!trkParameters) {
133 return trkParameters;
virtual Surface::ChargedTrackParametersUniquePtr createUniqueTrackParameters(double l1, double l2, double phi, double theta, double qop, std::optional< AmgSymMatrix(5)> cov=std::nullopt) const override final
Use the Surface as a ParametersBase constructor, from local parameters - charged.