ATLAS Offline Software
Loading...
Searching...
No Matches
SeedFitterTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "SeedFitterTool.h"
7
8#include <cmath>
9
10
12 const std::string& type, const std::string& name, const IInterface* parent):
13 base_class(type, name, parent)
14{
15 declareInterface<ISeedFitter>(this);
16}
17
18std::unique_ptr<const Trk::TrackParameters> InDet::SeedFitterTool::fit(
19 const std::vector<const Trk::SpacePoint*>& spacePoints) const
20{
24
27
28 if (spacePoints.size() < 3) {
29 return nullptr;
30 }
31
33 const Trk::PrepRawData* cl = spacePoints[0]->clusterList().first;
34 if(!cl) return nullptr;
36 const Trk::PlaneSurface* pla =
37 static_cast<const Trk::PlaneSurface*>(&cl->detectorElement()->surface());
38 if(!pla) return nullptr;
39
40 // translate second and third SP w.r.t first one
41 double x0 = spacePoints[0]->globalPosition().x();
42 double y0 = spacePoints[0]->globalPosition().y();
43 double z0 = spacePoints[0]->globalPosition().z();
44
45 double x1 = spacePoints[1]->globalPosition().x() - x0;
46 double y1 = spacePoints[1]->globalPosition().y() - y0;
47
48 double x2 = spacePoints[2]->globalPosition().x() - x0;
49 double y2 = spacePoints[2]->globalPosition().y() - y0;
50 double z2 = spacePoints[2]->globalPosition().z() - z0;
51
52 // distance of second SP to first in transverse plane
53 // Also happens to be u-coordinate of second SP in conformal mapping
54 double u1 = 1./std::sqrt(x1*x1+y1*y1);
55 // denominator for conformal mapping
56 double rn = x2*x2+y2*y2;
57 double r2 = 1./rn;
58 // coordinate system for conformal mapping - this is local x
59 double a = x1*u1;
60 double b = y1*u1;
61 // u/v-coordinate of third SP in conformal mapping
62 double u2 = (a*x2+b*y2)*r2;
63 double v2 = (a*y2-b*x2)*r2;
64 // A,B are slope and intercept of the straight line in the u,v plane
65 // connecting the three points.
66 double A = v2/(u2-u1);
67 double T = z2*sqrt(r2);
68
69 const Amg::Transform3D& Tp = pla->transform();
70
72 double Ax[3] = {Tp(0,0),Tp(1,0),Tp(2,0)};
74 double Ay[3] = {Tp(0,1),Tp(1,1),Tp(2,1)};
76 double D [3] = {Tp(0,3),Tp(1,3),Tp(2,3)};
78 double d[3] = {x0-D[0],y0-D[1],z0-D[2]};
79
80 double track_paras[5];
82 track_paras[0] = d[0]*Ax[0]+d[1]*Ax[1]+d[2]*Ax[2];
83 track_paras[1] = d[0]*Ay[0]+d[1]*Ay[1]+d[2]*Ay[2];
84 track_paras[2] = std::atan2(b+a*A, a-b*A);
85 track_paras[3] = std::atan2(1.,T) ;
86 track_paras[4] = 0.001/std::sqrt(1.+T*T); // qoverp from qoverpt and theta
87
89 "linearConformalMapping: \n" << \
90 "\nlocal x = " << track_paras[0] << \
91 "\nlocal y = " << track_paras[1] << \
92 "\nphi = " << track_paras[2] << \
93 "\ntheta = " << track_paras[3] << \
94 "\nqoverp = " << track_paras[4]);
95
96 bool any_nan = false;
97 for (int i = 0; i < 5; i++) {
98 if (std::isnan(track_paras[i])) {
99 any_nan = true;
100 break;
101 }
102 }
103 if (any_nan){
104 ATH_MSG_DEBUG("Seed parameters contain NaN elements - skipping this track ");
105 return nullptr;
106 }
107
108 std::unique_ptr<const Trk::TrackParameters> trkParameters(
109 pla->createUniqueTrackParameters(track_paras[0],track_paras[1],track_paras[2],track_paras[3],track_paras[4],std::nullopt));
110
111 if (!trkParameters) {
112 ATH_MSG_DEBUG("Failed to create track parameters");
113 return nullptr;
114 }
115
116 return trkParameters;
117}
118
119
120MsgStream& InDet::SeedFitterTool::dump( MsgStream& out ) const
121{
122 out<<std::endl;
123 return dumpevent(out);
124}
125
126std::ostream& InDet::SeedFitterTool::dump( std::ostream& out ) const
127{
128 return out;
129}
130
131MsgStream& InDet::SeedFitterTool::dumpevent( MsgStream& out ) const
132{
133 out<<"|Nothing to dump-|"
134 <<std::endl;
135 return out;
136}
#define ATH_MSG_DEBUG(x)
static Double_t a
static Double_t Tp(Double_t *t, Double_t *par)
virtual MsgStream & dump(MsgStream &out) const override
virtual std::unique_ptr< const Trk::TrackParameters > fit(const std::vector< const Trk::SpacePoint * > &spacepoints) const override
MsgStream & dumpevent(MsgStream &out) const
Class for a planaer rectangular or trapezoidal surface in the ATLAS detector.
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.
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Eigen::Affine3d Transform3D
hold the test vectors and ease the comparison