Compute RoI.
53{
54
55 static const float nonZeroInvP = 1
e-9;
56
57
58 std::vector<InDet::IZWindowRoISeedTool::ZWindow> listRoIs;
59 InDet::IZWindowRoISeedTool::ZWindow RoI;
60 listRoIs.clear();
61
62
64 if ( not tracks.isValid() ) {
66 return listRoIs;
67 }
68 ATH_MSG_DEBUG(
"Input track collection size "<<tracks->size());
69 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle{
m_beamSpotKey, ctx};
70
71 std::vector<Trk::Track*> selectedTracks;
72 for ( Trk::Track* trk : tracks->stdcont() ) {
74 float ptinv = std::abs(trk->perigeeParameters()->parameters()[
Trk::qOverP]) / std::sin(
theta);
75 if (ptinv < 0.001)
77 if ( std::abs(ptinv) > nonZeroInvP ) {
78 float pt = 1. / ptinv;
79 if (pt > 1000.)
82 }
83 float eta = -std::log( std::tan( 0.5*
theta ) );
86 float d0 = trk->perigeeParameters()->parameters()[
Trk::d0];
90 selectedTracks.push_back(trk);
91 }
92
94 ATH_MSG_DEBUG(
"Selected track collection size "<<selectedTracks.size());
95
96
97 for ( Trk::Track *trkLeading : selectedTracks ) {
98
99 float thetaLeading = trkLeading->perigeeParameters()->parameters()[
Trk::theta];
100 float ptInvLeading = std::abs(trkLeading->perigeeParameters()->parameters()[
Trk::qOverP]) / std::sin(thetaLeading);
102 if (std::abs(ptInvLeading) > nonZeroInvP) {
103 float pt = 1. / ptInvLeading;
106 }
107
108 for ( Trk::Track* trk : selectedTracks ) {
109
110 float z0Leading = trkLeading->perigeeParameters()->parameters()[
Trk::z0];
111 float z0 = trk->perigeeParameters()->parameters()[
Trk::z0];
114
115 auto leadAtBeam =
m_trackToVertex->perigeeAtBeamline(ctx, *trkLeading, *beamSpotHandle);
116 auto subleadAtBeam =
m_trackToVertex->perigeeAtBeamline(ctx, *trk, *beamSpotHandle);
117 float z0LeadingBeam = leadAtBeam->parameters()[
Trk::z0];
118 float z0Beam = subleadAtBeam->parameters()[
Trk::z0];
119
120 if ( std::abs(z0LeadingBeam - z0Beam) >
m_maxDeltaZ )
continue;
121
122 float z0TrkReference = subleadAtBeam->associatedSurface().center().z();
123 float z0TrkLeadingReference = leadAtBeam->associatedSurface().center().z();
124 RoI.
zReference = (z0Beam + z0TrkReference + z0LeadingBeam + z0TrkLeadingReference) / 2;
130 listRoIs.push_back(RoI);
131 }
132 }
133
134
135 if( listRoIs.empty() ){
136 for( Trk::Track* trkLeading : selectedTracks ){
137
138 float thetaLeading = trkLeading->perigeeParameters()->parameters()[
Trk::theta];
139 float ptInvLeading = std::abs(trkLeading->perigeeParameters()->parameters()[
Trk::qOverP]) / std::sin(thetaLeading);
141 if (std::abs(ptInvLeading) > nonZeroInvP) {
142 float pt = 1. / ptInvLeading;
145
146 auto leadAtBeam =
m_trackToVertex->perigeeAtBeamline(ctx, *trkLeading, *beamSpotHandle);
147 float z0LeadingBeam = leadAtBeam->parameters()[
Trk::z0];
148
149
150 float z0TrkLeadingReference = leadAtBeam->associatedSurface().center().z();
151 RoI.
zReference = z0LeadingBeam + z0TrkLeadingReference;
156 listRoIs.push_back(RoI);
157 }
158
159
160 }
161 }
162
163 return listRoIs;
164
165}
Scalar eta() const
pseudorapidity method
Scalar theta() const
theta method
#define ATH_MSG_VERBOSE(x)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.