ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::SiTrajectory_xk Class Referencefinal

#include <SiTrajectory_xk.h>

Collaboration diagram for InDet::SiTrajectory_xk:

Public Member Functions

 SiTrajectory_xk ()
 SiTrajectory_xk (const SiTrajectory_xk &)
 ~SiTrajectory_xk ()=default
SiTrajectory_xkoperator= (const SiTrajectory_xk &)
const int & nholes () const
const int & dholes () const
const int & nHolesBefore () const
const int & nHolesAfter () const
const int & nclusters () const
const int & ndf () const
const int & nclustersNoAdd () const
const int & nElements () const
const int & naElements () const
const int & difference () const
const int & elementsMap (int &i) const
const PatternHoleSearchOutcomegetHoleSearchResult () const
void setTools (const InDet::SiTools_xk *)
void setParameters ()
bool initialize (bool, bool, const PixelClusterContainer *, const SCT_ClusterContainer *, const Trk::TrackParameters &, std::vector< const InDet::SiCluster * > &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, bool &, const EventContext &)
double pTseed (const Trk::TrackParameters &, std::vector< const InDet::SiCluster * > &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, const EventContext &)
bool trackParametersToClusters (const PixelClusterContainer *, const SCT_ClusterContainer *, const Trk::TrackParameters &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, std::multimap< const Trk::PrepRawData *, const Trk::Track * > &, std::vector< const InDet::SiCluster * > &, const EventContext &ctx)
bool globalPositionsToClusters (const PixelClusterContainer *, const SCT_ClusterContainer *, const std::vector< Amg::Vector3D > &, std::vector< const InDet::SiDetElementBoundaryLink_xk * > &, std::multimap< const Trk::PrepRawData *, const Trk::Track * > &, std::vector< const InDet::SiCluster * > &)
bool backwardExtension (int, const EventContext &)
bool forwardExtension (bool, int, const EventContext &)
bool forwardFilter (const EventContext &)
bool filterWithPreciseClustersError (const EventContext &)
bool backwardSmoother (bool, const EventContext &)
bool isLastPixel () const
const Trk::PatternTrackParametersfirstParameters () const
 Return the pattern track parameters of the first element of this trajectory matching its status.
std::unique_ptr< Trk::TrackParametersfirstTrackParameters ()
void getClusters (std::vector< const InDet::SiCluster * > &) const
Trk::TrackStates convertToTrackStateOnSurface (const EventContext &ctx)
Trk::TrackStates convertToTrackStateOnSurface (int, const EventContext &ctx)
Trk::TrackStates convertToTrackStateOnSurfaceWithNewDirection (const EventContext &ctx)
Trk::TrackStates convertToNextTrackStateOnSurface ()
Trk::TrackStates convertToSimpleTrackStateOnSurface (const EventContext &ctx)
Trk::TrackStates convertToSimpleTrackStateOnSurface (int, const EventContext &ctx)
Trk::TrackStates convertToSimpleTrackStateOnSurfaceWithNewDirection ()
Trk::TrackStates convertToSimpleTrackStateOnSurfaceForDisTrackTrigger (const EventContext &ctx)
Trk::TrackStates convertToSimpleTrackStateOnSurfaceForDisTrackTrigger (int, const EventContext &ctx)
std::unique_ptr< Trk::FitQualityconvertToFitQuality () const
void updateHoleSearchResult ()
 Helper method to determine the hole search outcome for use in the later reco.
void sortStep ()
bool goodOrder ()
bool jumpThroughPerigee ()
double quality () const
double qualityOptimization ()
double pTfirst () const
std::ostream & dump (std::ostream &out) const

Protected Member Functions

void erase (int)
bool isNewTrack (std::multimap< const Trk::PrepRawData *, const Trk::Track * > &) const

Protected Attributes

int m_firstElement {}
int m_lastElement {}
 index of the first element where we have
int m_nclusters {}
 index of the last element where we have
int m_nclustersNoAdd {}
 Number of clusters on trajectory.
int m_difference {}
int m_nHolesBefore {}
int m_nHolesAfter {}
int m_nholes {}
int m_dholes {}
int m_nActiveElements {}
int m_nElements {}
 count active elements
std::array< int, 300 > m_elementsMap {}
int m_ndfcut {}
int m_ndf {}
int m_ntos {}
int m_atos [100] {}
int m_itos [100] {}
std::array< SiTrajectoryElement_xk, 300 > m_elements {}
const InDet::SiTools_xkm_tools {}
 Trajectory elements on this trajectory.
std::unique_ptr< const Trk::Surfacem_surfacedead
PatternHoleSearchOutcome m_patternHoleOutcome {}

Friends

class SiCombinatorialTrackFinder_xk

Detailed Description

Definition at line 44 of file SiTrajectory_xk.h.

Constructor & Destructor Documentation

◆ SiTrajectory_xk() [1/2]

InDet::SiTrajectory_xk::SiTrajectory_xk ( )

◆ SiTrajectory_xk() [2/2]

InDet::SiTrajectory_xk::SiTrajectory_xk ( const SiTrajectory_xk & )

◆ ~SiTrajectory_xk()

InDet::SiTrajectory_xk::~SiTrajectory_xk ( )
default

Member Function Documentation

◆ backwardExtension()

bool InDet::SiTrajectory_xk::backwardExtension ( int itmax,
const EventContext & ctx )

Definition at line 1188 of file SiTrajectory_xk.cxx.

1189{
1190 if (m_firstElement >= m_lastElement) return false;
1191 int L = m_firstElement;
1192 if (L==0) return true;
1193
1194 int MPbest[300] ;
1195 int TE [100] ;
1196 const InDet::SiCluster* CL [100] ;
1197 double XI2B [100] ;
1198 //Local variable PUB uses 27200 bytes of stack space
1199 //coverity[STACK_USE]
1200 Trk::PatternTrackParameters PUB[100] ;
1201 Trk::PatternTrackParameters PA ;
1202
1203 int maxholes = m_tools->maxholes ();
1204 int maxdholes = m_tools->maxdholes();
1205 const int itm = itmax-1 ;
1206 int it = 0 ;
1207 int itbest = 0 ;
1208 int qbest =-100 ;
1209 int nbest = 0 ;
1210 int ndfbest = 0 ;
1211 int lbest = L ;
1212 int hbest = 0 ;
1213 int hbestb = 0 ;
1214 int nclbest = 0 ;
1215 int ndcut = 3 ;
1216 int F = L ;
1217 double Xi2best = 0. ;
1218
1219 m_elements[m_elementsMap[F]].setNdist(0);
1220
1221 for (; it!=itmax; ++it) {
1222
1223 int l = F;
1224 int lastElementWithExpHit = F;
1225
1226 for (--F; F>=0; --F) {
1227
1228 InDet::SiTrajectoryElement_xk& El = m_elements[m_elementsMap[F+1]];
1229 InDet::SiTrajectoryElement_xk& Ef = m_elements[m_elementsMap[F ]];
1230
1231 if (!Ef.BackwardPropagationFilter(El, ctx)) break;
1232
1233 if (Ef.cluster()) {
1234 lastElementWithExpHit = F;
1235 l = F;
1236 }
1237 else if (Ef.inside() < 0) {
1238 lastElementWithExpHit = F;
1239 if (Ef.nholesB() > maxholes || Ef.dholesB() > maxdholes) break;
1240 }
1241
1242 int nm = Ef.nclustersB()+F;
1243 if (Ef.ndist() > ndcut ||
1244 nm < nclbest ||
1245 (nm == nclbest && Ef.xi2totalB() > Xi2best) ) break;
1246 }
1247
1248 int fl = F;
1249 if (fl<0) fl = 0;
1250
1251 int m = m_elementsMap[l];
1252 int nc = m_elements[m].nclustersB();
1253
1254 if (it==0 && nc==m_nclusters) return true;
1255
1256 int np = m_elements[m].npixelsB();
1257 int nh = m_elements[m].nholesB();
1258 int nd = m_elements[m_elementsMap[fl]].ndist();
1259 int q = nc-nh;
1260 double X = m_elements[m].xi2totalB();
1261
1262 if ( (q > qbest) || (q==qbest && X < Xi2best ) ) {
1263
1264 qbest = q ;
1265 nbest = 0 ;
1266 ndfbest = 0 ;
1267 hbest = nh ;
1268 hbestb = m_elements[m_elementsMap[lastElementWithExpHit]].nholesB()-nh ;
1269 itbest = it ;
1270 Xi2best = X ;
1271 PA = m_elements[m_elementsMap[l]].parametersUB();
1272
1273 if (fl==0 && nd < ndcut) ndcut = nd;
1274
1275 if (fl!=0 || nd > 0 || np < 3) {
1276
1277 lbest = l-1;
1278 for (int i=l; i!=L; ++i) {
1279
1280 InDet::SiTrajectoryElement_xk& Ei = m_elements[m_elementsMap[i]];
1281
1282 if (Ei.inside() <= 0 ) {
1283 MPbest[++lbest] = i;
1284 if (Ei.cluster()) {
1285 CL[nbest] = Ei.cluster();
1286 XI2B[nbest] = Ei.xi2B();
1287 PUB[nbest] = Ei.parametersUB();
1288 TE[nbest++] = lbest;
1289 ndfbest += Ei.ndf();
1290 }
1291 }
1292 }
1293 }
1294 else {
1295
1296 l = -1;
1297 lbest = fl-1;
1298 for (int i=fl; i!=L; ++i) {
1299
1300 InDet::SiTrajectoryElement_xk& Ei = m_elements[m_elementsMap[i]];
1301
1302 if (Ei.inside() <= 0 && ++lbest >=0 ) {
1303 MPbest[lbest] = lbest;
1304 if (Ei.cluster()) {
1305 CL[nbest] = Ei.cluster();
1306 XI2B[nbest] = Ei.xi2B();
1307 PUB[nbest] = Ei.parametersUB();
1308 TE[nbest++] = lbest;
1309 ndfbest += Ei.ndf();
1310 if (l<0) l=lbest;
1311 }
1312 m_elementsMap.at(lbest) = m_elementsMap.at(i);
1313 }
1314
1315 }
1316
1317 int dn = L-1-lbest;
1318
1319 if (dn!=0) {
1320
1321 for (int i=L; i!= m_nElements; ++i) {
1322 m_elementsMap.at(i-dn)=m_elementsMap.at(i);
1323 }
1324
1325 L -=dn;
1326 m_nElements -=dn;
1328 }
1329 }
1330 nclbest = m_nclusters+nbest;
1331 }
1332
1333 F = -1;
1334 if (l<=0) l=1;
1335 bool cl = false;
1336 double Xn = 0.;
1337
1338 for (; l < L; ++l) {
1339 InDet::SiTrajectoryElement_xk& Ei = m_elements[m_elementsMap[l]];
1340
1341 if (Ei.cluster() && Ei.isNextClusterHoleB(cl,Xn)) {
1342 int nm = l+Ei.nclustersB();
1343 if (!cl) {
1344 if (Ei.dist() < -2. && Ei.ndist() > ndcut-1 ) continue;
1345 --nm;
1346 }
1347 if (nm < nclbest || (nm == nclbest && Xn > Xi2best)) continue;
1348 F=l; break;
1349 }
1350 }
1351
1352 if (F < 0 ) break;
1353 if (it!=itm) if (!m_elements[m_elementsMap[F]].addNextClusterB()) break;
1354 }
1355 if (it == itmax) --it;
1356 if (!nbest) return true;
1357
1358 m_nholes = hbest ;
1359 m_nHolesBefore = hbestb;
1360 m_nclusters += nbest ;
1361 m_ndf += ndfbest;
1362 m_firstElement = TE[0] ;
1363 m_elements[m_elementsMap[TE[0]]].setParametersB(PA);
1364
1365 int dn = L-1-lbest;
1366
1367 if (dn != 0) {
1368
1369 m_nElements -=dn;
1371
1372 int n = m_firstElement;
1373 for (; n <= lbest ; ++n) m_elementsMap[n]=m_elementsMap[MPbest[n]];
1374 for (; n!= m_nElements; ++n) m_elementsMap[n]=m_elementsMap[n +dn ];
1375 }
1376
1377 if (itbest==it) return true;
1378
1379 for (int n = L-1-dn; n>=0; --n) {
1380
1381 InDet::SiTrajectoryElement_xk& En = m_elements[m_elementsMap[n]];
1382 int m = nbest-1;
1383 for (; m>=0; --m) if (TE[m]==n) break;
1384
1385 if (m>=0) {
1386 if (m_tools->useFastTracking()) {
1387 En.setClusterB(CL[m],XI2B[m]);
1388 En.setParametersB(PUB[m]);
1389 }
1390 else En.setCluster(CL[m]);
1391 if (--nbest==0) break;
1392 }
1393 else {
1394 if (m_tools->useFastTracking()) En.setClusterB( nullptr ,10000.);
1395 else En.setCluster( nullptr );
1396 }
1397 }
1398 return true;
1399}
#define F(x, y, z)
Definition MD5.cxx:112
bool BackwardPropagationFilter(SiTrajectoryElement_xk &, const EventContext &ctx)
const Trk::PatternTrackParameters & parametersUB() const
observed
const InDet::SiCluster * cluster() const
void setCluster(const InDet::SiCluster *)
void setParametersB(Trk::PatternTrackParameters &)
void setClusterB(const InDet::SiCluster *, double)
const int & ndist() const
number of crossed without hit - dead + holes
std::array< SiTrajectoryElement_xk, 300 > m_elements
const InDet::SiTools_xk * m_tools
Trajectory elements on this trajectory.
int m_nElements
count active elements
int m_nclusters
index of the last element where we have
std::array< int, 300 > m_elementsMap
int m_lastElement
index of the first element where we have
l
Printing final latex table to .tex output file.
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]

◆ backwardSmoother()

bool InDet::SiTrajectory_xk::backwardSmoother ( bool TWO,
const EventContext & ctx )

Definition at line 1096 of file SiTrajectory_xk.cxx.

1097{
1098 if (m_firstElement >= m_lastElement) return false;
1099
1100 // Trajectory difference test
1101 //
1102 int m = m_lastElement;
1103 for (; m>=m_firstElement; --m) {
1104 if (m_elements[m_elementsMap[m]].difference()) break;
1105 }
1106 if (m < m_firstElement) return true;
1107
1108 if (!m_elements[m_elementsMap[m_lastElement]].lastTrajectorElement()) return false;
1109
1110 int firstElement = m_lastElement ;
1111 int maxholes = m_tools->maxholes ();
1112 int maxdholes = m_tools->maxdholes();
1113 m_nclustersNoAdd = 0 ;
1114 m_difference = 0 ;
1115
1116 m = m_lastElement-1;
1117 int n = m ;
1118
1119 for (; m>=m_firstElement; --m) {
1120
1121 InDet::SiTrajectoryElement_xk& En = m_elements[m_elementsMap[m+1]];
1122 InDet::SiTrajectoryElement_xk& Em = m_elements[m_elementsMap[m ]];
1123
1124 if (!Em.BackwardPropagationSmoother(En,TWO,ctx)) {
1125
1126 if (m == m_firstElement) break;
1127
1128 for (int i=m+1; i!=m_nElements; ++i) m_elementsMap[i-1] = m_elementsMap[i];
1129 --m_lastElement;
1130 --m_nElements;
1131 --firstElement;
1132 continue;
1133 }
1134
1135 if ((Em.cluster() && Em.clusterOld()) && (Em.cluster()!=Em.clusterOld())) ++m_difference;
1136
1137 if (Em.cluster()) {
1138 firstElement = m;
1139 }
1140 else {
1141 n=m;
1142 if (Em.clusterNoAdd()) ++m_nclustersNoAdd;
1143 if (Em.nholesB() > maxholes || Em.dholesB() > maxdholes) {
1144 ++m_difference; break;
1145 }
1146 }
1147 }
1148
1149 m_firstElement = firstElement ;
1150 m = m_elementsMap[firstElement] ;
1151 n = m_elementsMap[ n ] ;
1152 m_nclusters = m_elements[m].nclustersB() ;
1153 m_nholes = m_elements[m].nholesB () ;
1154 m_nHolesBefore = m_elements[n].nholesB ()-m_nholes;
1155 m_ndf = m_elements[m].ndfB() ;
1156 if (m_ndf < m_ndfcut) return false;
1157
1158 // Erase trajectory elements with big distance from the track
1159 //
1160 m = firstElement+1;
1161 n = m;
1162 for (; m!=m_lastElement; ++m) {
1163
1164 InDet::SiTrajectoryElement_xk& Em = m_elements[m_elementsMap[m]];
1165 if (Em.inside() > 0) {
1166 if (Em.detstatus() > 0) --m_nActiveElements;
1167 }
1168 else {
1170 }
1171 }
1172 m_lastElement = n;
1173
1174 // Test number trajector elemenst with clusters
1175 //
1176 if (m_nActiveElements < m_tools->clustersmin() && m_nholes+m_nHolesAfter) return false;
1177 if (n!=m) {
1178 for (; m!=m_nElements; ++m) m_elementsMap[n++] = m_elementsMap[m];
1179 m_nElements = n;
1180 }
1181 return true;
1182}
bool BackwardPropagationSmoother(SiTrajectoryElement_xk &, bool, const EventContext &ctx)
const InDet::SiCluster * clusterOld() const
const InDet::SiCluster * clusterNoAdd() const
int m_nclustersNoAdd
Number of clusters on trajectory.
const int & difference() const

◆ convertToFitQuality()

std::unique_ptr< Trk::FitQuality > InDet::SiTrajectory_xk::convertToFitQuality ( ) const

Definition at line 290 of file SiTrajectory_xk.cxx.

290 {
291 double xi2 = m_elements[m_elementsMap[m_firstElement]].xi2totalB();
292 return std::make_unique<Trk::FitQuality>(xi2, (m_ndf - 5));
293}

◆ convertToNextTrackStateOnSurface()

Trk::TrackStates InDet::SiTrajectory_xk::convertToNextTrackStateOnSurface ( )

Definition at line 2206 of file SiTrajectory_xk.cxx.

2207{
2208 int i=0;
2209 for (; i!=m_ntos; ++i) {
2210 if (m_itos[i]+1 < m_elements[m_atos[i]].ntsos()) {++m_itos[i]; break;}
2211 m_itos[i] = 0;
2212 }
2213 if (i==m_ntos) {
2214 return Trk::TrackStates();
2215 }
2216
2217 auto dtsos = Trk::TrackStates();
2218
2219 for (i=0; i!=m_ntos; ++i) {
2220
2221 Trk::TrackStateOnSurface* tsos = m_elements[m_atos[i]].tsos(m_itos[i]);
2222 if (tsos) dtsos.push_back(tsos);
2223 }
2224 return dtsos;
2225}
DataVector< const Trk::TrackStateOnSurface > TrackStates

◆ convertToSimpleTrackStateOnSurface() [1/2]

Trk::TrackStates InDet::SiTrajectory_xk::convertToSimpleTrackStateOnSurface ( const EventContext & ctx)

Definition at line 152 of file SiTrajectory_xk.cxx.

153{
154 auto dtsos = Trk::TrackStates();
155
156 int i = m_firstElement;
157
158 const Trk::TrackStateOnSurface*
159 tsos = m_elements[m_elementsMap[i]].trackPerigeeStateOnSurface(ctx);
160
161 if (tsos) dtsos.push_back(tsos);
162
163 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,m_tools->useFastTracking(),m_tools->useFastTracking());
164
165 if (tsos) dtsos.push_back(tsos);
166
167 int lastClusterElement = 0;
168 for (int j=m_lastElement; j>=i; j--) {
169 int m = m_elementsMap[j];
170 if (m_elements[m].cluster()) {
171 lastClusterElement = j;
172 break;
173 }
174 }
175 if( lastClusterElement==0 || lastClusterElement==i ) return dtsos;
176
177 for (++i; i<std::min(lastClusterElement,m_lastElement); ++i) {
178
179 int m = m_elementsMap[i];
180 if (m_elements[m].cluster()) {
181 tsos = m_elements[m].trackSimpleStateOnSurface(false,false,0);
182 if (tsos) dtsos.push_back(tsos);
183 }
184 }
185
186 i = std::min(lastClusterElement,m_lastElement);
187 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,true,2);
188 if (tsos) dtsos.push_back(tsos);
189
190 return dtsos;
191}
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)

◆ convertToSimpleTrackStateOnSurface() [2/2]

Trk::TrackStates InDet::SiTrajectory_xk::convertToSimpleTrackStateOnSurface ( int cosmic,
const EventContext & ctx )

Definition at line 139 of file SiTrajectory_xk.cxx.

140{
141 if (!cosmic || m_elements[m_elementsMap[m_firstElement]].parametersUB().parameters()[2] < 0.) {
143 }
145}
@ cosmic
Trk::TrackStates convertToSimpleTrackStateOnSurface(const EventContext &ctx)
Trk::TrackStates convertToSimpleTrackStateOnSurfaceWithNewDirection()

◆ convertToSimpleTrackStateOnSurfaceForDisTrackTrigger() [1/2]

Trk::TrackStates InDet::SiTrajectory_xk::convertToSimpleTrackStateOnSurfaceForDisTrackTrigger ( const EventContext & ctx)

Definition at line 245 of file SiTrajectory_xk.cxx.

246{
247 auto dtsos = Trk::TrackStates();
248
249 int i = m_firstElement;
250
251 const Trk::TrackStateOnSurface*
252 tsos = m_elements[m_elementsMap[i]].trackPerigeeStateOnSurface(ctx);
253
254 if (tsos) dtsos.push_back(tsos);
255
256 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,false,0);
257
258 if (tsos) dtsos.push_back(tsos);
259
260 int lastClusterElement = 0;
261 for (int j=m_lastElement; j>=i; j--) {
262 int m = m_elementsMap[j];
263 if (m_elements[m].cluster()) {
264 lastClusterElement = j;
265 break;
266 }
267 }
268 if( lastClusterElement==0 || lastClusterElement==i ) return dtsos;
269
270 for (++i; i<std::min(lastClusterElement,m_lastElement); ++i) {
271
272 int m = m_elementsMap[i];
273 if (m_elements[m].cluster()) {
274 tsos = m_elements[m].trackSimpleStateOnSurface(false,false,0);
275 if (tsos) dtsos.push_back(tsos);
276 }
277 }
278
279 i = std::min(lastClusterElement,m_lastElement);
280 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(false,true,2);
281 if (tsos) dtsos.push_back(tsos);
282
283 return dtsos;
284}

◆ convertToSimpleTrackStateOnSurfaceForDisTrackTrigger() [2/2]

Trk::TrackStates InDet::SiTrajectory_xk::convertToSimpleTrackStateOnSurfaceForDisTrackTrigger ( int cosmic,
const EventContext & ctx )

Definition at line 231 of file SiTrajectory_xk.cxx.

232{
233 if (!cosmic || m_elements[m_elementsMap[m_firstElement]].parametersUB().parameters()[2] < 0.) {
235 }
237}
Trk::TrackStates convertToSimpleTrackStateOnSurfaceForDisTrackTrigger(const EventContext &ctx)

◆ convertToSimpleTrackStateOnSurfaceWithNewDirection()

Trk::TrackStates InDet::SiTrajectory_xk::convertToSimpleTrackStateOnSurfaceWithNewDirection ( )

Definition at line 198 of file SiTrajectory_xk.cxx.

199{
200 auto dtsos = Trk::TrackStates();
201
202 int i = m_lastElement;
203
204 const Trk::TrackStateOnSurface*
205 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(true,true,2);
206
207 if (tsos) dtsos.push_back(tsos);
208
209 for (--i; i!=m_firstElement; --i) {
210
211 int m = m_elementsMap[i];
212 if (m_elements[m].cluster() || m_elements[m].clusterNoAdd() ) {
213 tsos = m_elements[m].trackSimpleStateOnSurface(true,false,0);
214 if (tsos) dtsos.push_back(tsos);
215 }
216 }
217
219 tsos = m_elements[m_elementsMap[i]].trackSimpleStateOnSurface(true,false,1);
220 if (tsos) dtsos.push_back(tsos);
221
222 return dtsos;
223}

◆ convertToTrackStateOnSurface() [1/2]

Trk::TrackStates InDet::SiTrajectory_xk::convertToTrackStateOnSurface ( const EventContext & ctx)

Definition at line 56 of file SiTrajectory_xk.cxx.

57{
58
59 auto dtsos = Trk::TrackStates();
60
61 bool multi = m_tools->multiTrack();
62 if (m_nclusters <= m_tools->clustersmin() ||
63 pTfirst() < m_tools->pTmin()) multi = false;
64
65 int i = m_firstElement;
66
67 const Trk::TrackStateOnSurface*
68 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(false,true,multi,1,ctx);
69
70 if (tsos) dtsos.push_back(tsos);
71
72 for (++i; i!=m_lastElement; ++i) {
73
74 int m = m_elementsMap[i];
75 if (m_elements[m].cluster() || m_elements[m].clusterNoAdd() ) {
76 tsos = m_elements[m].trackStateOnSurface(false,false,multi,0,ctx);
77 if (tsos) dtsos.push_back(tsos);
78 }
79 }
80
82 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(false,false,multi,2,ctx);
83 if (tsos) dtsos.push_back(tsos);
84
85 if (multi) {
86 m_ntos = 0;
87 for (int i=m_firstElement; i<=m_lastElement; ++i) {
88
89 int m = m_elementsMap[i];
90 if (!m_elements[m].ntsos()) continue;
91 m_atos[m_ntos ] = m;
92 m_itos[m_ntos++] = 0;
93 }
94 }
95 return dtsos;
96}

◆ convertToTrackStateOnSurface() [2/2]

Trk::TrackStates InDet::SiTrajectory_xk::convertToTrackStateOnSurface ( int cosmic,
const EventContext & ctx )

Definition at line 43 of file SiTrajectory_xk.cxx.

44{
45 if (!cosmic || m_elements[m_elementsMap[m_firstElement]].parametersUB().parameters()[2] < 0.) {
47 }
49}
Trk::TrackStates convertToTrackStateOnSurface(const EventContext &ctx)
Trk::TrackStates convertToTrackStateOnSurfaceWithNewDirection(const EventContext &ctx)

◆ convertToTrackStateOnSurfaceWithNewDirection()

Trk::TrackStates InDet::SiTrajectory_xk::convertToTrackStateOnSurfaceWithNewDirection ( const EventContext & ctx)

Definition at line 103 of file SiTrajectory_xk.cxx.

104{
105
106 auto dtsos = Trk::TrackStates();
107
108 bool multi = m_tools->multiTrack();
109 if (pTfirst() < m_tools->pTmin()) multi = false;
110
111 int i = m_lastElement;
112
113 const Trk::TrackStateOnSurface*
114 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(true,true,multi,2,ctx);
115
116 if (tsos) dtsos.push_back(tsos);
117
118 for (--i; i!=m_firstElement; --i) {
119
120 int m = m_elementsMap[i];
121 if (m_elements[m].cluster() || m_elements[m].clusterNoAdd() ) {
122 tsos = m_elements[m].trackStateOnSurface(true,false,multi,0,ctx);
123 if (tsos) dtsos.push_back(tsos);
124 }
125 }
126
128 tsos = m_elements[m_elementsMap[i]].trackStateOnSurface(true,false,multi,1,ctx);
129 if (tsos) dtsos.push_back(tsos);
130
131 return dtsos;
132}

◆ dholes()

const int & InDet::SiTrajectory_xk::dholes ( ) const
inline

Definition at line 64 of file SiTrajectory_xk.h.

◆ difference()

const int & InDet::SiTrajectory_xk::difference ( ) const
inline

Definition at line 72 of file SiTrajectory_xk.h.

72{return m_difference ;}

◆ dump()

std::ostream & InDet::SiTrajectory_xk::dump ( std::ostream & out) const

Definition at line 352 of file SiTrajectory_xk.cxx.

353{
354 boost::io::ios_all_saver ias(out);
355
356 if (m_nElements <=0 ) {
357 out<<"Trajectory does not exist"<<std::endl; ias.restore();
358 return out;
359 }
361 out<<"Trajectory is wrong"<<std::endl; ias.restore();
362 return out;
363 }
364
365 out<<"|--------------------------------------------------------------------------------------------------------|"
366 <<std::endl;
367 out<<"| TRAJECTORY "
368 <<" |"
369 <<std::endl;
370
371 out<<"| Has"<<std::setw(3)<<m_nElements
372 <<" ("
373 <<std::setw(3)<<m_nActiveElements
374 <<")"
375 <<" elements and "
376 <<std::setw(2)<<m_nclusters+m_nclustersNoAdd<<" ("
377 <<std::setw(2)<<m_nclustersNoAdd<<") clusters and "
378 <<std::setw(2)<<m_ndf<<" weighted clusters and quality = "<<std::setw(12)<<std::setprecision(5)<<quality()
379 <<" |"
380 <<std::endl;
381 out<<"| Has number of holes before, inside, after and gap= "
382 <<std::setw(2)<<m_nHolesBefore
383 <<std::setw(2)<<m_nholes
384 <<std::setw(2)<<m_nHolesAfter
385 <<std::setw(3)<<m_dholes<<" |"
386 <<std::endl;
387 out<<"| F B |"
388 <<std::endl;
389
390 out<<"|---|--|---|-----|-|-|---------|---------|---------|---------|----------|---------|-|--|--|--|-|-|-|-|-|-|---------|"
391 <<std::endl;
392 out<<"| # |SS| D| Ncl |C|O| Xi2F | Xi2B | Az.Angle| Radius | pT(GeV) | dZ/dR |N|In|Lf|Lb|S|D|H|G|H|G| Step |"
393 <<std::endl;
394 out<<"|---|--|---|-----|-|-|---------|---------|---------|---------|----------|---------|-|--|--|--|-|-|-|-|-|-|---------|"
395 <<std::endl;
396
397 for (int i=0; i!=m_nElements; ++i) {
398
399 int m = m_elementsMap[i];
400
401 std::string DET = "D ";
402 const InDetDD::SiDetectorElement* D = m_elements[m].detElement();
403 std::string DE = " ";
404 if (m_elements[m].detstatus() < 0) DE = "-";
405 if (D) {
406 if (D->isPixel()) {
407 if (D->isBarrel()) DET = "Pb"; else DET = "Pe";
408 }
409 else if (D->isSCT()) {
410 if (D->isBarrel()) DET = "Sb"; else DET = "Se";
411 }
412 }
413 int c = 0;
414 if (m_elements[m].detstatus() > 0) c = m_elements[m].numberClusters();
415
416 out<<"|"<<std::setw(3)<<unsigned(i);
417
418 std::string S0=" ";
419 if (m_firstElement == i) S0="=>";
420 if (m_lastElement == i) S0="=>";
421
422 std::string S1=" ";
423 std::string S2=" ";
424 if (m_elements[m].cluster ()) S1="+";
425 if (m_elements[m].clusterNoAdd()) S2="+";
426
427 out<<"|"
428 <<S0<<"|"
429 <<std::setw(1)<<DE
430 <<std::setw(2)<<DET <<"|"
431 <<std::setw(5)<<c <<"|"
432 <<S1<<"|"
433 <<S2<<"|";
434
435 if (m_elements[m].status()) {
436
437 out<<std::setw(9)<<std::setprecision(3)<<m_elements[m].xi2F()<<"|";
438 out<<std::setw(9)<<std::setprecision(3)<<m_elements[m].xi2B()<<"|";
439
440 double ra = 0.;
441 double pt = 0.;
442 double tz = 0.;
443 double fa = 0.;
444
445 if (m_elements[m].status()==1) {
446
447 if (m_elements[m].cluster()) {
448
449 Amg::Vector3D gp = m_elements[m].parametersUF().position();
450 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
451 fa = atan2(gp.y(),gp.x());
452 pt = m_elements[m].parametersUF().momentum().perp();
453 tz = m_elements[m].parametersUF().cotTheta();
454 }
455 else {
456
457 Amg::Vector3D gp = m_elements[m].parametersPF().position();
458 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
459 fa = atan2(gp.y(),gp.x());
460 pt = m_elements[m].parametersPF().momentum().perp();
461 tz = m_elements[m].parametersPF().cotTheta();
462 }
463 }
464 else if ((m_tools->useFastTracking() and m_elements[m].status()>2) or m_elements[m].status()==2) {
465
466 if (m_elements[m].cluster()) {
467
468 Amg::Vector3D gp = m_elements[m].parametersUB().position();
469 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
470 fa = atan2(gp.y(),gp.x());
471 pt = m_elements[m].parametersUB().momentum().perp();
472 tz = m_elements[m].parametersUB().cotTheta();
473 }
474 else {
475
476 Amg::Vector3D gp = m_elements[m].parametersPB().position();
477 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
478 fa = atan2(gp.y(),gp.x());
479 pt = m_elements[m].parametersPB().momentum().perp();
480 tz = m_elements[m].parametersPB().cotTheta();
481 }
482 }
483 else {
484
485 Trk::PatternTrackParameters S1,SM,S2(m_elements[m].parametersPF());
486
487 if (m_elements[m].cluster()) S1 = m_elements[m].parametersUB();
488 else S1 = m_elements[m].parametersPB();
489
490 bool QA = m_tools->updatorTool()->combineStates(S1,S2,SM);
491
492 if (QA) {
493
494 Amg::Vector3D gp = SM.position();
495 ra = sqrt(gp.x()*gp.x()+gp.y()*gp.y());
496 fa = atan2(gp.y(),gp.x());
497 pt = SM.momentum().perp();
498 tz = SM.cotTheta();
499 }
500 }
501 out<<std::setw( 9)<<std::setprecision(4)<<fa <<"|";
502 out<<std::setw( 9)<<std::setprecision(4)<<ra <<"|";
503 out<<std::setw(10)<<std::setprecision(4)<<pt*.001<<"|";
504 out<<std::setw( 9)<<std::setprecision(4)<<tz <<"|";
505 out<<std::setw(1)<<unsigned(m_elements[m].noiseModel())<<"|";
506 out<<std::setw(2)<<m_elements[m].inside()<<"|";
507 out<<std::setw(2)<<unsigned(m_elements[m].nlinksF())<<"|";
508 out<<std::setw(2)<<unsigned(m_elements[m].nlinksB())<<"|";
509 out<<std::setw(1)<<unsigned(m_elements[m].status())<<"|";
510 out<<std::setw(1)<<unsigned(m_elements[m].difference())<<"|";
511 out<<std::setw(1)<<unsigned(m_elements[m].nholesF())<<"|";
512 out<<std::setw(1)<<unsigned(m_elements[m].dholesF())<<"|";
513 out<<std::setw(1)<<unsigned(m_elements[m].nholesB())<<"|";
514 out<<std::setw(1)<<unsigned(m_elements[m].dholesB())<<"|";
515 out<<std::setw(9)<<std::setprecision(4)<<m_elements[m].step()<<"|";
516 }
517 else {
518 out<<" |";
519 out<<" |";
520 out<<" |";
521 out<<" |";
522 out<<" |";
523 out<<" |";
524 out<<" |";
525 out<<" |";
526 out<<" |";
527 out<<" |";
528 out<<" |";
529 out<<" |";
530 out<<" |";
531 out<<" |";
532 out<<" |";
533 out<<" |";
534 out<<std::setw(9)<<std::setprecision(4)<<m_elements[m].step();
535 out<<"|";
536 }
537 out<<std::endl;
538 }
539 out<<"|---|--|---|-----|-|-|---------|---------|---------|---------|----------|---------|-|--|--|--|-|-|-|-|-|-|---------|"
540 <<std::endl;
541 ias.restore();
542 return out;
543}
struct TBPatternUnitContext S2
struct TBPatternUnitContext S1
Eigen::Matrix< double, 3, 1 > Vector3D
status
Definition merge.py:16

◆ elementsMap()

const int & InDet::SiTrajectory_xk::elementsMap ( int & i) const
inline

Definition at line 73 of file SiTrajectory_xk.h.

73{return m_elementsMap[i];}

◆ erase()

void InDet::SiTrajectory_xk::erase ( int n)
protected

Definition at line 30 of file SiTrajectory_xk.cxx.

31{
32 if (n>=0 && n<m_nElements) {
33 for (int i=n; i!=m_nElements-1; ++i) m_elementsMap[i] = m_elementsMap[i+1];
35 }
36}

◆ filterWithPreciseClustersError()

bool InDet::SiTrajectory_xk::filterWithPreciseClustersError ( const EventContext & ctx)

Definition at line 1896 of file SiTrajectory_xk.cxx.

1897{
1898 int L = m_firstElement;
1899 int I = 0 ;
1900
1901 if(!m_elements[m_elementsMap[L]].cluster()) return false;
1903
1904 for(++L; L<=m_lastElement; ++L) {
1905
1906 int K = m_elementsMap[L];
1907 if(m_elements[K].cluster() ||
1908 m_elements[K].clusterNoAdd() ||
1909 m_elements[K].inside() < 0 ) m_elementsMap[++I] = K;
1910 }
1911 m_firstElement = 0 ;
1912 m_lastElement = I ;
1913 m_nElements = I+1;
1914
1915 // Forward filter
1916 //
1917 L = 0;
1918
1919 // firstTrajectorElement with correction = true
1920 if(!m_elements[m_elementsMap[L]].firstTrajectorElement(true)) return false;
1921
1922 for(++L; L<=m_lastElement; ++L) {
1923
1924 InDet::SiTrajectoryElement_xk& El = m_elements[m_elementsMap[L-1]];
1925 InDet::SiTrajectoryElement_xk& Ef = m_elements[m_elementsMap[L ]];
1926
1927 if(!Ef.ForwardPropagationWithoutSearchPreciseWithCorrection(El, ctx)) return false;
1928 }
1929
1930 // Backward smoother
1931 //
1932 if(!m_elements[m_elementsMap[m_lastElement]].lastTrajectorElementPrecise()) return false;
1933
1934 int m = m_lastElement-1;
1935 for(; m>=0; --m) {
1936
1937 InDet::SiTrajectoryElement_xk& En = m_elements[m_elementsMap[m+1]];
1938 InDet::SiTrajectoryElement_xk& Em = m_elements[m_elementsMap[m ]];
1939
1940 if(!Em.BackwardPropagationPrecise(En, ctx)) return false;
1941 }
1942
1943 return true;
1944}
#define I(x, y, z)
Definition MD5.cxx:116
bool ForwardPropagationWithoutSearchPreciseWithCorrection(SiTrajectoryElement_xk &, const EventContext &)
bool BackwardPropagationPrecise(SiTrajectoryElement_xk &, const EventContext &ctx)

◆ firstParameters()

const Trk::PatternTrackParameters * InDet::SiTrajectory_xk::firstParameters ( ) const

Return the pattern track parameters of the first element of this trajectory matching its status.

Returns
nullptr or a pointer to the element owned pattern track parameters matching the current status of the trajectory element.

◆ firstTrackParameters()

std::unique_ptr< Trk::TrackParameters > InDet::SiTrajectory_xk::firstTrackParameters ( )

◆ forwardExtension()

bool InDet::SiTrajectory_xk::forwardExtension ( bool smoother,
int itmax,
const EventContext & ctx )

index at which we start the extension

last element on the trajectory

smoothing step, if requested. Will re-evaluate the extension start and parameters there

This checks if we already ran a forward and backward propagation within the current hits on the trajectory. Will enter this branch if we have not.

in this case, we will simply set up for forward propagation, projecting the predicted state forward without searching for new hits yet

prepare first element for forward propagation

for all following elements with until the last with a known hit:

propagate forward the state from the previous element

this branch is entered if the first element is already in agreement between forward and back so we already ran a smoothing step for the current hits on the trajectory

for all elements starting from the one after our first hit, up to the last one with a hit:

this branch is entered while the range of hits we are looking at was still covered by the previously made backward smoothing

update flag if we are still covered by the smoothing

if not (first element not covered):

re-add cluster - this will update the counters and chi2 based on the refined upstream elements

case if we have entered a piece of the tracks where there was no back smoothing yet

propagate forward

end loop from second to last element with hit

end case of existing smoothing

decrement extensionStartIndex to get back to the last element with a hit on it

end smoother

if we are already at the last element on the trajectory, we have no-where to extend further

These represent the indices used for the extension. Only contains the elements beyond the start (so not the piece already existing).

Trajectory elements of clusters on the best candidate

Clusters on the best candidate

hole and double-hole cuts

max iteration we expect to reach

current iteration

index of best iteration so far

best quality seen so far

number of hits on the best extension

holes for best extension (only up to last hit)

holes beyond last hit for best extension

number of missing expected hits on best extension (holes + deads)

max holes plus deads

best number of clusters

start index for best extension

index for looping over detector elements

current index in the MP array - runs along all elements on the candidate track

first point of current trajectory: start of extension

maximum dPhi

this is the at the location of the first hit on track

start to iterate

index of the previous detector element in the forward propagation

Last index in the M array where we found a cluster

missing clusters on the best candidate compared to the maximum possible

hole flag

loop over detector elements - the first time this is called, we start at the first one beyond the one that saw the last hit

propagate forward to the current element, and search for matching clusters

In case of a forward propagation error, try to recover cases due to barrel-endcap transitions

we are already in the endcaps, or if the incompatible elements the failure are not subsequent: abooooort!

in the barrel or if the previous element is the one just before this, loop over the remaining elements and look for the first one not in the barrel. This detects barrel-endcap transitions

we didn't find any endcap elements? Likely a bad attempt, so abort

If we found a barrel-endcap transition, we continue our loop at the first endcap element along the trajectory.

end of propagation failure handling

NOTE: The 'else' here is mainly for clarity - due to the 'continue'/'break' statements in the 'if' above, we only reach here if the condition above (propagation failure) is not met.

if the forward propagation was succesful: update the 'previous element' to the current one

Reminder: we only reach this point in case of a succesful forward propagation

add the current element to the MP list, increment M index

if we found a matching cluster at this element:

get the dPhi w.r.t the first hit

wrap into 0...pi space

and bail out if the track is curving too extremely in phi

update indices for last hit

we did not find a compatible hit, but we would expect one --> hole!

check if we exceeded the maximum number of holes or double holes. If yes, abort!

and do the dPhi check again, but using the predicted parameters (as no hit)

we did not find a hit, but also do not cross the active surface (no hit expected)

apply only the dPhi check

number of missing clusters so far (for whatever reason) note: negative number (0 == all possible collected)

Now, check a number of reasons to exit early:

if we have too many deads

or we have already missed more hits than in the best so far

or we have missed the same #hits but have a worse chi2

end of loop over elements

now we have assembled a full candidate for the extended trajectory.

get the index of the element where we last saw a hit

get the number of clusters we saw at that point

and the number of holes (this means we exclude holes after the last hit!)

set the number of holes after the last hit - total holes minus holes until last hit

if we are in the first iteration, and have not found any new clusters beyond the ones already collected in initialize(), return.

get the last element we reached before exiting the loop

if we looped over all, make it the last element there is

number of missed expected hits seen

clusters minus holes before last hit This is used as a quality estimator

total chi2

if the quality is better than the current best (chi2 as tie-breaker):

update the quality flags

reset the running index of clusters on best track (will now be populated)

and the degree-of-freedom count

update best candidate hole counts

as well as holes after last hit

store the iteration number...

extensionStartIndex-value used for the best candidate (starting point)

the chi2...

the number of missed expected hits

if our track went through the full trajectory and we collect a small number of missed expected hits: update the cut for the future (need to be better)

now, loop over the elements on this possible extension again, up to the last cluster

get the corresponding element

if we are inside or within tolerance

then store this index in MPbest (meaning we skip any element that isn't crossed)

if we have a hit here,

store the cluster and l-index

and increment NDF count

best total cluster count: clusters we had so far + newly found ones

if we have an amazing track with at least 14(!) clusters and no holes, or if we passed along the full trajectory without any missed expected hits, we stop iterating, as we can not improve

end of branch for quality better than current best

set index_currentElement negative (use as iteration exit condition below)

boolean to check if we have two clusters on a given element

helper number - used below

chi square holder

Now, we prepare for the next iteration. This is done by walking backward along the found trajectory and seeing if, by not using one cluster, we could theoretically come to a better solution if doing so would give us hits everywhere else along the remaining trajectory. The first such case is used to start the next iteration.

Start reverse loop

corresponding element

if we are not on the last element, have a hit, and removing the hit would not make us fail the cuts:

this is Ei.nclustersF() + [steps from lastElementOnTraj to i] - nclbest - 1 ==> change in number of hits that would be possible w.r.t the best track if ALL following elements had hits, if we removed this hit (to get a better extension)

if removing this hit would result in us losing a hit on track (no backup on hand):

if we would gain a missed expected hit by removing this one and fail the missing hit cut due to this, keep iterating and don't do anything here

if we would keep a hit even if we remove this cluster, increment the counter to account for this

if we can not possibly improve (nm < 0) or if we can not improve and the chi2 can not go below the best one, keep looping, look for another cluster to pull out

otherwise, start the next iteration here!

end of reverse loop

if we did not find any candidate where we could improve by removing a hit, stop iteration

if we are not in the last iteration, final preparation for iterating by making our new start point skip the cluster used there so far.

if reaching max iterations, reset iteration counter to the last iteration that was run

exit if no good track found

set members to counters of best track

if the indices do not match, there is an element along the way which we do not traverse on the sensitive area

update the element map, removing unused elements

if the last iteration was the best, all is good and we return

reset index_currentElement again

loop over all detector elements beyond the start point

get the corresponding element

find the index in the hits-on-track array corresponding to this DE

if we found this element in the array:

if we have since switched to a different cluster on this element compared to the one in the best track:

if this is the time we need to update a cluster:

update the index

set the cluster to be used at this element to the one used for the best extension and propagate info from previous element

if we already updated one element: Can't use addNextClusterF directly, need to clean up later. For now, just update the cluster info itself

end branch for different active cluster on DE

exit if we have dealt with all of the clusters now

end of case if we found this element in the cluster-on-track array

case if a detector element is not on best trajectory

if this element has an active cluster:

if this is the first we need to update a cluster, can do the full work

tell this DE to not use a cluster, and propagate info from prev. element

if we already updated one element: Can't use addNextClusterF directly, need to clean up later. For now, just update the cluster info itself

tell this DE to not use a cluster

end of loop over all DE beyond start point

if we did not have to update any cluster, or if we only had to change the last hit: all good, can exit

otherwise, if we had to update a cluster along the way, need one more forward propagation run to make sure all the counters and chi2 etc reflect the best track's cluster configuration

now we can finally exit

Definition at line 1405 of file SiTrajectory_xk.cxx.

1406{
1407 const double pi2 = 2.*M_PI;
1408 const double pi = M_PI;
1409
1410 if (m_firstElement >= m_lastElement) return false;
1411
1413 int extensionStartIndex = m_lastElement;
1415 int lastElementOnTraj = m_nElements-1;
1416
1419 if (smoother) {
1420
1421 extensionStartIndex = m_firstElement;
1422
1425 if (m_elements[m_elementsMap[extensionStartIndex]].difference()) {
1428
1430 if (!m_elements[m_elementsMap[extensionStartIndex]].firstTrajectorElement(false)) return false;
1432 for (++extensionStartIndex; extensionStartIndex<=m_lastElement; ++extensionStartIndex) {
1433 InDet::SiTrajectoryElement_xk& previousElement = m_elements[m_elementsMap[extensionStartIndex-1]];
1434 InDet::SiTrajectoryElement_xk& thisElement = m_elements[m_elementsMap[extensionStartIndex ]];
1436 if (!thisElement.ForwardPropagationWithoutSearch(previousElement,ctx)) return false;
1437 }
1438 }
1441 else{
1442 bool diff = false;
1444 for (++extensionStartIndex; extensionStartIndex<=m_lastElement; ++extensionStartIndex) {
1445
1446 InDet::SiTrajectoryElement_xk& previousElement = m_elements[m_elementsMap[extensionStartIndex-1]];
1447 InDet::SiTrajectoryElement_xk& thisElement = m_elements[m_elementsMap[extensionStartIndex ]];
1450 if (!diff) {
1452 diff = thisElement.difference();
1454 if (diff) {
1456 if (!thisElement.addNextClusterF(previousElement,thisElement.cluster())) return false;
1457 }
1458 }
1460 else {
1462 if (!thisElement.ForwardPropagationWithoutSearch(previousElement,ctx)) return false;
1463 }
1464 }
1465 }
1466 --extensionStartIndex;
1467 }
1468
1470 if ( extensionStartIndex== lastElementOnTraj) return true;
1471
1472 // Search best forward trajectory prolongation
1475 int MP [300] ;
1476 int MPbest[300] ;
1478 int TE [100] ;
1480 const InDet::SiCluster* CL [100] ;
1481
1483 int maxholes = m_tools->maxholes () ;
1484 int maxdholes = m_tools->maxdholes() ;
1486 const int itm = itmax-1 ;
1488 int iteration = 0 ;
1490 int itbest = 0 ;
1492 int qbest =-100 ;
1494 int nbest = 0 ;
1495 int ndfbest = 0 ;
1497 int hbest = 0 ;
1499 int hbeste = 0 ;
1501 int ndbest = 0 ;
1503 int ndcut = 3 ;
1505 int nclbest = 0 ;
1507 int lbest = extensionStartIndex ;
1509 int index_currentElement = extensionStartIndex ;
1511 int M = extensionStartIndex ;
1513 MP [M] = extensionStartIndex ;
1514 double Xi2best = 0. ;
1516 const double dfmax = 2.2 ;
1517
1519 double f0 = m_elements[m_elementsMap[m_firstElement]].parametersUF().parameters()[2];
1520
1521
1522 m_elements[m_elementsMap[index_currentElement]].setNdist(0);
1523
1525 for (; iteration!=itmax; ++iteration) {
1526
1527 int lastElementWithSeenHit = index_currentElement;
1528 int lastElementWithExpHit = index_currentElement;
1530 int index_previousElement = index_currentElement;
1532 int mLastCluster = M;
1534 int Cm = nclbest-lastElementOnTraj;
1536 bool haveHole = false;
1537
1540 for (++index_currentElement; index_currentElement!=m_nElements; ++index_currentElement) {
1541
1543 InDet::SiTrajectoryElement_xk& prevElement = m_elements[m_elementsMap[index_previousElement]];
1544 InDet::SiTrajectoryElement_xk& currentElement = m_elements[m_elementsMap[index_currentElement ]];
1545
1547 if (!currentElement.ForwardPropagationWithSearch(prevElement, ctx)) {
1549
1551 if (!currentElement.isBarrel() || index_previousElement!=index_currentElement-1) break;
1552
1556 int index_auxElement = index_currentElement;
1557 for (; index_auxElement!=m_nElements; ++index_auxElement) {
1558 if (!m_elements[m_elementsMap[index_auxElement]].isBarrel() ) break;
1559 }
1561 if (index_auxElement==m_nElements) break;
1562
1566 index_currentElement = index_auxElement-1;
1567 continue;
1568 }
1569
1572 else {
1575 index_previousElement = index_currentElement;
1576 }
1578
1580 MP[++M] = index_currentElement;
1581
1583 if (currentElement.cluster()) {
1584 if (not m_tools->isITkGeometry()) {
1586 double df = std::abs(currentElement.parametersUF().parameters()[2]-f0);
1588 if (df > pi) df = pi2-df;
1590 if (df > dfmax) break;
1591 }
1593 lastElementWithExpHit = index_currentElement;
1594 lastElementWithSeenHit = index_currentElement;
1595 mLastCluster = M;
1596 haveHole = false;
1597 }
1598
1600 else if (currentElement.inside() < 0 ) {
1601 lastElementWithExpHit=index_currentElement;
1603 if (currentElement.nholesF() > maxholes || currentElement.dholesF() > maxdholes) break;
1604
1605 haveHole = true;
1606 if (not m_tools->isITkGeometry()) {
1608 double df = std::abs(currentElement.parametersPF().parameters()[2]-f0);
1609 if (df > pi) df = pi2-df;
1610 if (df > dfmax ) break;
1611 }
1612 }
1613
1615 else if (not m_tools->isITkGeometry()) {
1617 double df = std::abs(currentElement.parametersPF().parameters()[2]-f0);
1618 if (df > pi) df = pi2-df;
1619 if (df > dfmax) break;
1620 }
1623 int nm = currentElement.nclustersF()-index_currentElement;
1625 if ( currentElement.ndist() > ndcut
1626 || nm < Cm
1627 || (nm == Cm && currentElement.xi2totalF() > Xi2best)
1628 ) break;
1629 }
1630
1632
1634 int m = m_elementsMap[lastElementWithSeenHit];
1636 int nc = m_elements[m].nclustersF();
1638 int nh = m_elements[m].nholesF();
1640 m_nHolesAfter = m_elements[m_elementsMap[lastElementWithExpHit]].nholesF()-nh;
1641
1644 if (iteration==0 && nc==m_nclusters) return true;
1645
1647 int lastElementProcessed = index_currentElement;
1649 if (lastElementProcessed==m_nElements) --lastElementProcessed;
1650
1652 int nd = m_elements[m_elementsMap[lastElementProcessed]].ndist();
1655 int q = nc-nh;
1657 double X = m_elements[m].xi2totalF();
1659 if ( (q > qbest) || (q==qbest && X < Xi2best ) ) {
1661 qbest = q;
1663 nbest = 0;
1665 ndfbest = 0;
1667 hbest = nh;
1669 hbeste = m_elements[m_elementsMap[lastElementWithExpHit]].nholesF()-nh;
1671 itbest = iteration;
1674 lbest = extensionStartIndex ;
1676 Xi2best = X ;
1678 ndbest = nd;
1681 if (lastElementProcessed==lastElementOnTraj && nd < ndcut) ndcut = nd;
1682
1684 for (int j=extensionStartIndex+1; j<=mLastCluster; ++j) {
1686 int i = MP[j];
1687 InDet::SiTrajectoryElement_xk& Ei = m_elements[m_elementsMap[i]];
1689 if (Ei.inside() <= 0) {
1691 MPbest[++lbest] = i;
1693 if (Ei.cluster()) {
1695 CL[nbest] = Ei.cluster();
1696 TE[nbest++] = lbest;
1698 ndfbest += Ei.ndf();
1699 }
1700 }
1701 }
1703 nclbest = m_nclusters+nbest;
1706 if ( (nclbest >= 14 && !haveHole) || (lastElementProcessed==lastElementOnTraj && ndbest == 0)) break;
1707 }
1708
1710 index_currentElement = -1;
1712 bool cl = false;
1714 int nb = lastElementOnTraj-nclbest-1;
1716 double Xn;
1717
1723
1725 for (int j=mLastCluster; j!=extensionStartIndex; --j) {
1727 int i = MP[j];
1728 InDet::SiTrajectoryElement_xk& Ei = m_elements[m_elementsMap[i]];
1729
1731 if (i!=lastElementOnTraj && Ei.cluster() && Ei.isNextClusterHoleF(cl,Xn)) {
1732
1736 int nm = nb-i+Ei.nclustersF();
1737
1739 if (!cl) {
1742 if (Ei.dist() < -2. && Ei.ndist() > ndcut-1) continue;
1743 }
1745 else ++nm;
1746
1749 if (nm < 0 || (nm == 0 && Xn > Xi2best)) continue;
1751 index_currentElement = i;
1752 M = j;
1753 break;
1754 }
1755 }
1756
1758 if (index_currentElement < 0 ) break;
1761 if (iteration!=itm && !m_elements.at(m_elementsMap.at(index_currentElement)).addNextClusterF()) break;
1762 }
1763
1765 if (iteration == itmax) --iteration;
1766
1768 if (!nbest) return true;
1769
1771 m_nholes = hbest ;
1772 m_nHolesAfter = hbeste ;
1773 m_nclusters += nbest ;
1774 m_ndf += ndfbest ;
1775 m_lastElement = TE[nbest-1];
1777
1779 if (m_lastElement != MPbest[m_lastElement]) {
1781 for (int n = extensionStartIndex+1; n<=m_lastElement; ++n){
1782 m_elementsMap[n]=m_elementsMap[MPbest[n]];
1783 }
1784 }
1786 if (itbest==iteration) return true;
1787
1789 int mb = 0;
1791 index_currentElement = -1;
1792
1794 for (int n = extensionStartIndex+1; n!=m_nElements; ++n) {
1796 InDet::SiTrajectoryElement_xk& En = m_elements[m_elementsMap[n]];
1797
1798 int m = mb;
1800 for (; m!=nbest; ++m) if (TE[m]==n) break;
1802 if (m!=nbest) {
1804 if (CL[m]!=En.cluster()) {
1806 if (index_currentElement<0) {
1808 index_currentElement=n;
1812 }
1815 else {
1816 En.setCluster(CL[m]);
1817 }
1818 }
1820 if (++mb == nbest) break;
1821 }
1823 else {
1825 if (En.cluster()) {
1827 if (index_currentElement<0) {
1828 index_currentElement = n;
1830 En.addNextClusterF(m_elements[m_elementsMap[n-1]],nullptr);
1831 }
1834 else {
1836 En.setCluster(nullptr);
1837 }
1838 }
1839 }
1840 }
1841
1844 if (index_currentElement < 0 || m_lastElement == index_currentElement) {
1845 return true;
1846 }
1847
1850 for (++index_currentElement; index_currentElement<=m_lastElement; ++index_currentElement) {
1851 InDet::SiTrajectoryElement_xk& prevElement = m_elements[m_elementsMap[index_currentElement-1]];
1852 InDet::SiTrajectoryElement_xk& currentElement = m_elements[m_elementsMap[index_currentElement ]];
1853 if (!currentElement.ForwardPropagationWithoutSearch(prevElement, ctx)) return false;
1854 }
1856 return true;
1857}
#define M_PI
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
Definition Jet.cxx:631
#define pi
bool ForwardPropagationWithSearch(SiTrajectoryElement_xk &, const EventContext &)
const Trk::PatternTrackParameters & parametersUF() const
updated
bool ForwardPropagationWithoutSearch(SiTrajectoryElement_xk &, const EventContext &)
const Trk::PatternTrackParameters & parametersPF() const
track parameters for forward filter / smoother predicted
bool isNextClusterHoleF(bool &, double &)
checks if removing this cluster from the forward propagation would result in a critical number of hol...
bool difference() const
check for a difference between forward and back propagation
df
Printing table to screen.

◆ forwardFilter()

bool InDet::SiTrajectory_xk::forwardFilter ( const EventContext & ctx)

Definition at line 1876 of file SiTrajectory_xk.cxx.

1877{
1878 int L = m_firstElement;
1879
1880 if (!m_elements[m_elementsMap[L]].firstTrajectorElement(false)) return false;
1881
1882 for (++L; L<=m_lastElement; ++L) {
1883
1884 InDet::SiTrajectoryElement_xk& El = m_elements[m_elementsMap[L-1]];
1885 InDet::SiTrajectoryElement_xk& Ef = m_elements[m_elementsMap[L ]];
1886 if (!Ef.ForwardPropagationWithoutSearch(El,ctx)) return false;
1887 }
1888 return true;
1889}

◆ getClusters()

void InDet::SiTrajectory_xk::getClusters ( std::vector< const InDet::SiCluster * > & Cl) const

Definition at line 1863 of file SiTrajectory_xk.cxx.

1865{
1866 for (int i = m_firstElement; i<=m_lastElement; ++i) {
1867 int m = m_elementsMap[i];
1868 if (m_elements[m].cluster()) Cl.push_back(m_elements[m].cluster());
1869 }
1870}

◆ getHoleSearchResult()

const PatternHoleSearchOutcome & InDet::SiTrajectory_xk::getHoleSearchResult ( ) const
inline

Definition at line 74 of file SiTrajectory_xk.h.

PatternHoleSearchOutcome m_patternHoleOutcome

◆ globalPositionsToClusters()

bool InDet::SiTrajectory_xk::globalPositionsToClusters ( const PixelClusterContainer * ,
const SCT_ClusterContainer * ,
const std::vector< Amg::Vector3D > & ,
std::vector< const InDet::SiDetElementBoundaryLink_xk * > & ,
std::multimap< const Trk::PrepRawData *, const Trk::Track * > & ,
std::vector< const InDet::SiCluster * > &  )

Definition at line 999 of file SiTrajectory_xk.cxx.

1006{
1007 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator iter_boundaryLink = DE.begin(), endBoundaryLinks = DE.end();
1008 std::vector<Amg::Vector3D>::const_iterator g,gb = Gp.begin(), ge = Gp.end();
1009 InDet::PixelClusterCollection::const_iterator pib, pie;
1010 InDet::SCT_ClusterCollection::const_iterator sib, sie;
1011 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator t, te =PT.end();
1012
1013 Trk::PatternTrackParameters Tp;
1014
1015 double pv[ 5]={0.,0.,0.,0.,0.};
1016 double cv[15]={ .1 ,
1017 0. , .1,
1018 0. , 0.,.001,
1019 0. , 0., 0.,.001,
1020 0. , 0., 0., 0.,.00001};
1021
1022 double xi2Cut = 10.;
1023 m_ndf = 0 ;
1024
1025 for (; iter_boundaryLink!=endBoundaryLinks; ++iter_boundaryLink) {
1026
1027 const InDetDD::SiDetectorElement* d = (*iter_boundaryLink)->detElement();
1028 IdentifierHash id = d->identifyHash ();
1029 const Trk::Surface* su = &d->surface();
1030 const Trk::PlaneSurface* pla = static_cast<const Trk::PlaneSurface*>(su);
1031 if (!pla) continue;
1032
1033 const Amg::Transform3D& tr = pla->transform();
1034 double Ax[3] = {tr(0,0),tr(1,0),tr(2,0)};
1035 double Ay[3] = {tr(0,1),tr(1,1),tr(2,1)};
1036 double Az[3] = {tr(0,2),tr(1,2),tr(2,2)};
1037 double x0 = tr(0,3);
1038 double y0 = tr(1,3);
1039 double z0 = tr(2,3);
1040 double zcut = .001 ;
1041
1042 bool sct = d->isSCT();
1043 if (!sct) {
1044 const InDet::PixelClusterCollection *w = (*PIXc).indexFindPtr(id);
1045 if (w!=nullptr && w->begin()!=w->end()) {
1046 pib = w->begin();
1047 pie = w->end ();
1048 } else {
1049 continue;
1050 }
1051 } else {
1052 zcut = 1.;
1053 const InDet::SCT_ClusterCollection *w = (*SCTc).indexFindPtr(id);
1054 if (w!=nullptr && w->begin()!=w->end()) {
1055 sib = w->begin();
1056 sie = w->end ();
1057 } else {
1058 continue;
1059 }
1060 }
1061
1062 for (g=gb; g!=ge; ++g) {
1063
1064 double dx = (*g).x()-x0;
1065 double dy = (*g).y()-y0;
1066 double dz = (*g).z()-z0;
1067 double z = dx*Az[0]+dy*Az[1]+dz*Az[2];
1068 if (std::abs(z) > zcut) continue;
1069
1070 pv[0] = dx*Ax[0]+dy*Ax[1]+dz*Ax[2];
1071 pv[1] = dx*Ay[0]+dy*Ay[1]+dz*Ay[2];
1072 //setParametersWithCovariance detects whether su is 'owned' elsewhere
1073 //the ownership patterns could be improved, though.
1074 //coverity[MULTIPLE_INIT_SMART_PTRS]
1075 Tp.setParametersWithCovariance(su,pv,cv);
1076
1077 if (!sct) m_elements[0].CloseClusterSeach(Tp, (*iter_boundaryLink), pib, pie);
1078 else m_elements[0].CloseClusterSeach(Tp, (*iter_boundaryLink), sib, sie);
1079 const InDet::SiCluster* c = m_elements[0].cluster();
1080 if (!c || m_elements[0].xi2F() > xi2Cut) continue;
1081 if (sct) {
1082 t = PT.find(c);
1083 if (t!=te && (*t).second->measurementsOnTrack()->size() >= 10) continue;
1084 }
1085 sct ? m_ndf+=1 : m_ndf+=2;
1086 lSiCluster.push_back(c);
1087 }
1088 }
1089 return m_ndf >= 6;
1090}
static Double_t Tp(Double_t *t, Double_t *par)
#define z
Trk::PrepRawDataCollection< PixelCluster > PixelClusterCollection
Trk::PrepRawDataCollection< SCT_Cluster > SCT_ClusterCollection
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Eigen::Affine3d Transform3D
H5::PredType PT
Definition H5Traits.cxx:15

◆ goodOrder()

bool InDet::SiTrajectory_xk::goodOrder ( )

Definition at line 1951 of file SiTrajectory_xk.cxx.

1952{
1953 int L = m_firstElement ;
1954 int n = m_elementsMap[L];
1955 double step = 0. ;
1956 bool order = true ;
1957
1958 for (++L; L<=m_lastElement; ++L) {
1959
1960 int m = m_elementsMap[L];
1961 if (!m_elements[m].cluster() &&
1962 !m_elements[m].clusterNoAdd() &&
1963 m_elements[m].inside()>=0) continue;
1964
1965 double stp = m_elements[m].step(m_elements[n]);
1966 if ( step == 0.) step = stp ;
1967 else if ((step*stp) < 0.) {order = false; break;}
1968 n = m;
1969 }
1970 if (order) return true;
1971
1972 L = m_firstElement ;
1973 n = m_elementsMap[L];
1974 Amg::Vector3D gp = m_elements[n].globalPosition();
1975 double rad = gp.x()*gp.x()+gp.y()*gp.y();
1976 for (++L; L<=m_lastElement; ++L) {
1977
1978 int m = m_elementsMap[L];
1979 if (!m_elements[m].cluster() &&
1980 !m_elements[m].clusterNoAdd() &&
1981 m_elements[m].inside()>=0) continue;
1982
1983 gp = m_elements[m].globalPosition();
1984 double R = gp.x()*gp.x()+gp.y()*gp.y();
1985 if (R < rad) return false;
1986 rad = R;
1987 n=m;
1988 }
1989 return true;
1990}
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
order
Configure Herwig7.

◆ initialize()

bool InDet::SiTrajectory_xk::initialize ( bool ,
bool ,
const PixelClusterContainer * ,
const SCT_ClusterContainer * ,
const Trk::TrackParameters & ,
std::vector< const InDet::SiCluster * > & ,
std::vector< const InDet::SiDetElementBoundaryLink_xk * > & ,
bool & ,
const EventContext &  )

reset state

loop over all detector elements and assign the starting set of silicon clusters at the right indices

get the associated detector element from the boundary link

book a placeholder for a potential cluster on this element

First case: Current element is a pixel module

check if we are configured to use pixels!

check for the pixel clusters on the given detector element, using the ID hash

if we have any hits:

set iterators to the local cluster collection

Loop over the passed list with Si clusters to initiate the track with - these are for example the clusters on our seed in inside-out- or backtracking.

if this cluster is on the current element...

if it is the first cluster we see, set the first element to the current index

otherwise, set the last element to the current index (will eventually point to the final cluster)

increment cluster counter

add 2 to the number of degrees of freedom counter (Pix is 2D)

set our cluster pointer to point to this cluster

remove the cluster from the list

and exit the loop over Si clusters. We can do this because no two clusters are allowed to be on the same detector element

done, now we know if one of the existing clusters is on this element set status = 1 (there are hits on this module), give it the boundary link and the space points on this element. Finally, also give it the cluster, if we found one.

and increment the counter of active (nonzero hits) elements

this branch is the case of a pixel module with no hits on it, if we have previously had an active element

here we set a status of 0.

this branch is taken if we have not yet found an active element and there are no hits on this module. No need to already start the trajectory!

map the index to itself. Always useful. Don't worry, it will get more interesting later...

if we exceed the bounds of our array, bail out. Also increment the detector element index

end of check on pixel flag

end of pixel case

case 2: Strip module

again, we fetch the clusters for this detector element

do we have any?

is this the first cluster we found?

then mark it as the first element

otherwise, mark it as the last element

increment cluster counter

for SCT, add one degree of freedom (1D measurement)

and update the cluster pointer, before cleaning up

remember - only one cluster per detector element is possible due to upstream filtering. So we can exit when we found one.

Now, set up the trajectory element (det status 1) as in the pixel case

and increment the active element count

branch if no clusters on module and previously seen active element

set an corresponding element to detstatus = 0

branch for no clusters and no active elements seen so far

skip this one

update elements map

and array boundary checking (yuck!!) Also increment the detector element index

end of SCT if-statement

if the element we are currently processing is the first one where we saw a cluster:

set the upper populated point to the current index

and update the current trajectory

element with the track parameters we obtained upstream for the starting surface

if the element we are currently processing saw a cluster but is not the first one

run forward propagation from the last element with a cluster to this one

update index of last element that had a cluster to point to this one

if the chi2 looks good for the forward extension step, update index of last good cluster

if it does not look good

add the ndf to "ndfwrong"

if we have collected more than 3 badly fitting DoF (2 pix or 1 Pix + 1 SCT or 3 SCT), bail out

reduce ndf for cut by the bad degrees of freedom

reduce cluster count, don't include this track

and erase the cluster again

Case if we already have clusters from the seed on track, and some clusters left to put on it, but no seed cluster on this element Corresponds to have a hole in the seed.

propagate to the current DE from the last one where we had a cluster from the seed if the propagation fails

if we have a cluster here, something went wrong in the upstream logic

otherwise, remove this guy from consideration. It will be overwritten by the next one we see

also adapt the number of active elements if needed

if the propagation succeeded

increment hole count if we expect a hit

update the index of the last element

end of case of no hit and expecting a hit

end of loop over boundary links

did we manage to assign all our seed hits to elements on the road?

no? Then our search road was badly chosen. Return this info for logging and bail out

if some seed hits are badly fitting and we have less than 6 remaining good DoF, we give up

update degrees of freedom to the current count of good ones

truncate the ndfcut variable to 6

Kill empty trajectory elements at the end of our trajectory

count downwards

and if the element is active, stop looping

the index where we aborted is the last one where we found an active element.

Find last detector element with clusters

Kill uncrossed detector elements this repopulates the elementsMap we started to fill earlier

loop from the element after the one with the first hit to the one with the last hit from the seed

if we either have a cluster on track or at least cross the element, plug it into the m_elementsMap at the next position

now m_elementsMap contains the interesting elements

if we kicked out some elements:

update the index of the last element

then add the remaining ones beyond the last cluster back to the map

If we run with brem, update noise model for last trajectory elements

Definition at line 579 of file SiTrajectory_xk.cxx.

589{
591 m_nholes = 0;
592 m_nHolesBefore = 0;
593 m_nHolesAfter = 0;
594 m_dholes = 0;
595 m_nclusters = 0;
597 m_nElements = 0;
599 m_firstElement = -100;
600 m_lastElement = 0;
601 m_ndfcut = 0;
602 rquality = true;
603 m_ntos = 0;
604 int ndfwrong = 0;
605 double Xi2cut = 2.*m_tools->xi2max();
606
607 // radius of the dead cylinder
608 double Rdead = 142.5;
609 // boolean to decide if initialisation is needed or not
610 // initDeadMaterial is False (which means dead material needs be initialised)
611 // for ITk fast tracking configuration
612 bool initDeadMaterial = not(m_tools->isITkGeometry() and m_tools->useFastTracking());
613
614 if(!initDeadMaterial and !m_surfacedead) m_surfacedead = std::make_unique<const Trk::CylinderSurface>(Rdead,5000.);
615
616 std::vector<const InDet::SiCluster*>::iterator iter_cluster;
617 if (lSiCluster.size() < 2) return false;
618
619 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator iter_boundaryLink,endBoundaryLinks=DE.end();
620
621 int up = 0;
622 int last = 0;
623
626 for (iter_boundaryLink=DE.begin(); iter_boundaryLink!=endBoundaryLinks; ++iter_boundaryLink) {
627
629 const InDetDD::SiDetectorElement* detectorElement = (*iter_boundaryLink)->detElement();
630 IdentifierHash id = detectorElement->identifyHash();
631
633 const InDet::SiCluster* theCluster = nullptr;
634
636 if (detectorElement->isPixel()) {
637 if (PIX) {
638
639 // Set dead material
640 //
641 // if already initialised, not doing it again
642 if(not initDeadMaterial) {
643 const Trk::PlaneSurface* pla = static_cast<const Trk::PlaneSurface*>(&detectorElement->surface());
644 double R = pla->center().perp();
645 if(R > Rdead) {
646 initDeadMaterial = true;
647 if(!m_elements[m_nElements].setDead(m_surfacedead.get())) return false;
649 if(m_nclusters && !lSiCluster.empty()) {
650 if(!m_elements[m_nElements].ForwardPropagationWithoutSearch(m_elements[up], ctx)) return false;
651 up = m_nElements;
652 }
653 if(++m_nElements==300) break;
654 }
655 }
656
657 InDet::PixelClusterCollection::const_iterator iter_PixelClusterColl, iter_PixelClusterCollEnd;
659 const InDet::PixelClusterCollection *clustersOnElement = (*PIXc).indexFindPtr(id);
661 if (clustersOnElement!=nullptr && clustersOnElement->begin()!=clustersOnElement->end()) {
662
664 iter_PixelClusterColl = clustersOnElement->begin();
665 iter_PixelClusterCollEnd = clustersOnElement->end();
666
669 for (iter_cluster=lSiCluster.begin(); iter_cluster!=lSiCluster.end(); ++iter_cluster) {
671 if ((*iter_cluster)->detectorElement()==detectorElement) {
673 if (m_nclusters==0){
675 }
677 else{
679 }
681 ++m_nclusters;
683 m_ndfcut+=2;
685 theCluster=(*iter_cluster);
687 iter_cluster=lSiCluster.erase(iter_cluster);
691 break;
692 }
693 }
696 bool valid_set = m_elements[m_nElements].set(1,(*iter_boundaryLink),iter_PixelClusterColl,iter_PixelClusterCollEnd,theCluster,ctx);
697 if(m_tools->isITkGeometry() && !valid_set) return false;
700 }
702 else if (m_nActiveElements) {
704 bool valid_set = m_elements[m_nElements].set(0,(*iter_boundaryLink),iter_PixelClusterColl,iter_PixelClusterCollEnd,theCluster,ctx);
705 if(m_tools->isITkGeometry() && !valid_set) return false;
706 }
708 else {
709
710 continue;
711 }
717 if (++m_nElements==300) break;
718 }
719 }
721 else if (SCT) {
722 InDet::SCT_ClusterCollection::const_iterator iter_stripClusterColl, iter_StripClusterCollEnd;
724 const InDet::SCT_ClusterCollection *clustersOnElement = (*SCTc).indexFindPtr(id);
725
727 if (clustersOnElement!=nullptr && clustersOnElement->begin()!=clustersOnElement->end()) {
728
729 iter_stripClusterColl = clustersOnElement->begin();
730 iter_StripClusterCollEnd = clustersOnElement->end();
731
733 for (iter_cluster=lSiCluster.begin(); iter_cluster!=lSiCluster.end(); ++iter_cluster) {
734 if ((*iter_cluster)->detectorElement()==detectorElement) {
736 if (m_nclusters==0){
739 }
741 else{
743 }
745 ++m_nclusters;
747 m_ndfcut+=1;
749 theCluster=(*iter_cluster);
750 iter_cluster=lSiCluster.erase(iter_cluster);
753 break;
754 }
755 }
757 bool valid_set = m_elements[m_nElements].set(1,(*iter_boundaryLink),iter_stripClusterColl,iter_StripClusterCollEnd,theCluster,ctx);
758 if(m_tools->isITkGeometry() && !valid_set) return false;
761 }
763 else if (m_nActiveElements) {
765 bool valid_set = m_elements[m_nElements].set(0,(*iter_boundaryLink),iter_stripClusterColl,iter_StripClusterCollEnd,theCluster,ctx);
766 if(m_tools->isITkGeometry() && !valid_set) return false;
767 }
769 else {
771 continue;
772 }
777 if (++m_nElements==300) break;
778 }
779
781 if (m_firstElement == m_nElements-1) {
782 up = m_nElements-1;
783 if (!m_elements[up].firstTrajectorElement(Tp, ctx)) return false;
787 }
789 else if (theCluster) {
790
792 if (!m_elements[m_nElements-1].ForwardPropagationWithoutSearch(m_elements[up],ctx)) {
793 return false;
794 }
796 up = m_nElements-1;
798 if (m_elements[m_nElements-1].xi2F() <= Xi2cut) {
799 last=up;
800 }
802 else {
803 if (m_tools->isITkGeometry()) return false;
804 else{
806 ndfwrong+=m_elements[m_nElements-1].ndf();
808 if (ndfwrong > 3) return false;
812 --m_nclusters;
814 m_elements[m_nElements-1].eraseClusterForwardPropagation();
815 }
816 }
817 }
821 else if (m_nclusters && !lSiCluster.empty()) {
824 if (!m_elements[m_nElements-1].ForwardPropagationWithoutSearch(m_elements[up], ctx)) {
826 if(not m_tools->isITkGeometry() and m_elements[m_nElements-1].cluster()) return false;
829 --m_nElements;
831 if (m_elements[m_nElements-1].detstatus()) --m_nActiveElements;
832 }
834 else {
838 up = m_nElements-1;
839 }
840 }
841 }
842
844 if (!lSiCluster.empty()) {
846 rquality = false;
847 return false;
848 }
851 if (not m_tools->isITkGeometry() && ndfwrong && m_ndfcut < 6) return false;
852
854 m_ndf = m_ndfcut;
856 if (m_tools->isITkGeometry() || m_ndfcut > 6) m_ndfcut = 6;
857
859 int n = m_nElements-1;
861 for (; n>0; --n) {
863 if (m_elements[n].detstatus()>=0) break;
864 }
867 m_nElements = n+1;
868
870 for (; n>0; --n) {
871 if (m_elements[n].detstatus() == 1) {
872 m_elements[n].lastActive();
873 break;
874 }
875 }
876
879 int m = m_firstElement+1;
880 m_lastElement = last ;
883 for (n = m; n!=m_lastElement; ++n) {
884 InDet::SiTrajectoryElement_xk& En = m_elements[m_elementsMap[n]];
887 if (En.cluster() || En.inside() <= 0) m_elementsMap[m++] = m_elementsMap[n];
888 }
890
892 if (m!=n) {
896 for (; n!=m_nElements; ++n){
898 }
899 m_nElements = m;
900 }
901 if (!m_tools->bremNoise()) return true;
902
904 for (n=m_lastElement; n!=m_nElements; ++n) {
905 m_elements[m_elementsMap[n]].bremNoiseModel();
906 }
907 return true;
908}
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
Trk::Surface & surface()
Element Surface.
std::unique_ptr< const Trk::Surface > m_surfacedead
const Amg::Vector3D & center() const
Returns the center position of the Surface.

◆ isLastPixel()

bool InDet::SiTrajectory_xk::isLastPixel ( ) const

◆ isNewTrack()

bool InDet::SiTrajectory_xk::isNewTrack ( std::multimap< const Trk::PrepRawData *, const Trk::Track * > & map) const
protected

Definition at line 299 of file SiTrajectory_xk.cxx.

301{
302 if (m_firstElement==-100) return false;//i.e. the int array never had elements inserted
303 const Trk::PrepRawData* prd [100];
304 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator
305 ti,t[100],te = map.end();
306 int n = 0 ;
307 for (int i=m_firstElement; i<=m_lastElement; ++i) {
308 if (n >= 100) break;
309 int m = m_elementsMap[i];
310
311 if (m_elements[m].cluster()) {
312 prd[n] = m_elements[m].cluster();
313 t[n] = map.find(prd[n]);
314 if (t[n]==te) return true;
315 ++n;
316 } else if (m_elements[m].clusterNoAdd()) {
317 prd[n] = m_elements[m].clusterNoAdd();
318 t[n] = map.find(prd[n]);
319 if (t[n]==te) return true;
320 ++n;
321 }
322 }
323
324 int nclt = m_nclusters + m_nclustersNoAdd;
325
326 for (int i=0; i!=n; ++i) {
327 int nclmax = 0;
328 for (ti=t[i]; ti!=te; ++ti) {
329 if ( (*ti).first != prd[i] ) break;
330 int ncl = (*ti).second->measurementsOnTrack()->size();
331 if (ncl > nclmax) nclmax = ncl;
332 }
333 if (nclt > nclmax) return true;
334 }
335 return false;
336}

◆ jumpThroughPerigee()

bool InDet::SiTrajectory_xk::jumpThroughPerigee ( )

Definition at line 2095 of file SiTrajectory_xk.cxx.

2096{
2097 int i = m_firstElement;
2098 double St = m_elements[m_elementsMap[m_lastElement]].step()-m_elements[m_elementsMap[i]].step();
2099
2100 for (; i<=m_lastElement; ++i) {
2101 int m = m_elementsMap[i];
2102 if (m_elements[m].cluster() &&
2103 (m_elements[m].ndf()!=2 || (m_elements[m].stepToPerigee()*St) <= 0.)) break;
2104
2105 if (m_elements[m].cluster()){
2106 --m_nclusters;
2107 m_ndf -= m_elements[m].ndf();
2108 }
2109 else if (m_elements[m].clusterNoAdd()) --m_nclustersNoAdd;
2110 else --m_nholes ;
2111 }
2112
2113 if (i == m_firstElement) return false;
2114 m_firstElement = i;
2115 return true;
2116}
const int & ndf() const

◆ naElements()

const int & InDet::SiTrajectory_xk::naElements ( ) const
inline

Definition at line 71 of file SiTrajectory_xk.h.

71{return m_nActiveElements;}

◆ nclusters()

const int & InDet::SiTrajectory_xk::nclusters ( ) const
inline

Definition at line 67 of file SiTrajectory_xk.h.

67{return m_nclusters ;}

◆ nclustersNoAdd()

const int & InDet::SiTrajectory_xk::nclustersNoAdd ( ) const
inline

Definition at line 69 of file SiTrajectory_xk.h.

69{return m_nclustersNoAdd;}

◆ ndf()

const int & InDet::SiTrajectory_xk::ndf ( ) const
inline

Definition at line 68 of file SiTrajectory_xk.h.

68{return m_ndf ;}

◆ nElements()

const int & InDet::SiTrajectory_xk::nElements ( ) const
inline

Definition at line 70 of file SiTrajectory_xk.h.

70{return m_nElements ;}

◆ nholes()

const int & InDet::SiTrajectory_xk::nholes ( ) const
inline

Definition at line 63 of file SiTrajectory_xk.h.

63{return m_nholes ;}

◆ nHolesAfter()

const int & InDet::SiTrajectory_xk::nHolesAfter ( ) const
inline

Definition at line 66 of file SiTrajectory_xk.h.

66{return m_nHolesAfter ;}

◆ nHolesBefore()

const int & InDet::SiTrajectory_xk::nHolesBefore ( ) const
inline

Definition at line 65 of file SiTrajectory_xk.h.

65{return m_nHolesBefore ;}

◆ operator=()

SiTrajectory_xk & InDet::SiTrajectory_xk::operator= ( const SiTrajectory_xk & )

◆ pTfirst()

double InDet::SiTrajectory_xk::pTfirst ( ) const

Definition at line 2231 of file SiTrajectory_xk.cxx.

2232{
2233 int n = m_firstElement ; if (n <0 || n>=300) return 0.;
2234 n = m_elementsMap[n]; if (n <0 || n>=300) return 0.;
2235 int s = m_elements[n].status();
2236 if (s<=1) return 0.;
2237 return m_elements[n].parametersUB().momentum().perp();
2238}

◆ pTseed()

double InDet::SiTrajectory_xk::pTseed ( const Trk::TrackParameters & Tp,
std::vector< const InDet::SiCluster * > & Cl,
std::vector< const InDet::SiDetElementBoundaryLink_xk * > & DE,
const EventContext & ctx )

Definition at line 549 of file SiTrajectory_xk.cxx.

554{
555 double Xi2cut = 30.;
556
557 InDet::SiClusterCollection::const_iterator sib,sie;
558 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator r=DE.begin(),re=DE.end();
559 std::vector<const InDet::SiCluster*> ::iterator s=Cl.begin();
560
561 int n = 0;
562 if(!m_elements[n].set(1,(*r),sib,sie,(*s),ctx) ) return 0.;
563 if(!m_elements[n].firstTrajectorElement(Tp,ctx)) return 0.;
564
565 for(++r; r!=re; ++r) {
566 ++n; ++s;
567 if(!m_elements[n].set(1,(*r),sib,sie,(*s),ctx) ) return 0.;
568 if(!m_elements[n].ForwardPropagationWithoutSearch(m_elements[n-1], ctx)) return 0.;
569 if( m_elements[n].xi2F() > Xi2cut ) return 0.;
570 }
571 return m_elements[n].parametersUF().momentum().perp();
572}
const std::regex re(r_e)
int r
Definition globals.cxx:22
void set(const ELT &e, const element_type &x) const
Set the variable for one element.

◆ quality()

double InDet::SiTrajectory_xk::quality ( ) const

Definition at line 2122 of file SiTrajectory_xk.cxx.

2123{
2124 int holes = 0 ;
2125 double quality = 0.;
2126
2127 for (int i = m_firstElement; i<=m_lastElement; ++i) {
2129 }
2130 return quality;
2131}

◆ qualityOptimization()

double InDet::SiTrajectory_xk::qualityOptimization ( )

Definition at line 2137 of file SiTrajectory_xk.cxx.

2138{
2139 int lE = m_firstElement;
2140 int h = 0 ;
2141 double q = 0 ;
2142 double qM = 0. ;
2143
2144 for (int i = m_firstElement; i<=m_lastElement; ++i) {
2145 int m = m_elementsMap[i];
2146 q+=m_elements[m].quality(h);
2147 if (m_elements[m].cluster() && q > qM) {
2148 qM = q;
2149 lE = i;
2150 }
2151 }
2152
2153 if (lE == m_firstElement) return -100;
2154
2155 int fE = lE;
2156 int nclustersNoAdd = 0 ;
2157 int nclusters = 0 ;
2158 int nholes = 0 ;
2159 int dholes = 0 ;
2160 int ndf = 0 ;
2161 h = 0 ;
2162 q = 0.;
2163 qM = 0.;
2164
2165 for (int i = lE; i>=m_firstElement; --i) {
2166
2167 int m = m_elementsMap[i];
2168 q+=m_elements[m].quality(h);
2169
2170 if (m_elements[m].cluster()) {
2171
2172 ++nclusters;
2173 ndf+=m_elements[m].ndf();
2174
2175 if (q > qM) {
2176 qM = q;
2177 fE = i;
2180 m_nholes = nholes ;
2181 m_dholes = dholes ;
2182 m_ndf = ndf ;
2183 }
2184
2185 }
2186 else if (m_elements[m].clusterNoAdd()) {
2188 }
2189 else if (m_elements[m].inside() < 0 && m_elements[m].detstatus() >=0) {
2190 ++nholes;
2191 if (h > dholes) dholes = h;
2192 }
2193 }
2194
2195 if (fE==lE || m_nclusters+m_nclustersNoAdd < m_tools->clustersmin()) return -100.;
2196 m_firstElement = fE;
2197 m_lastElement = lE;
2198 return qM;
2199}
const int & nholes() const
const int & nclustersNoAdd() const
const int & nclusters() const
const int & dholes() const

◆ setParameters()

void InDet::SiTrajectory_xk::setParameters ( )

Definition at line 21 of file SiTrajectory_xk.cxx.

22{
23 for (int i=0; i!=300; ++i) m_elements[i].setParameters();
24}

◆ setTools()

void InDet::SiTrajectory_xk::setTools ( const InDet::SiTools_xk * t)

Definition at line 15 of file SiTrajectory_xk.cxx.

16{
17 m_tools = t;
18 for (int i=0; i!=300; ++i) m_elements[i].setTools(t);
19}
void setTools(const InDet::SiTools_xk *)

◆ sortStep()

void InDet::SiTrajectory_xk::sortStep ( )

Definition at line 1996 of file SiTrajectory_xk.cxx.

1997{
1998 int L = m_firstElement;
1999 int LA = m_firstElement;
2000
2001 for (++L; L<=m_lastElement; ++L) {
2002
2003 int m = m_elementsMap[L];
2004 if (!m_elements[m].cluster() &&
2005 !m_elements[m].clusterNoAdd() &&
2006 m_elements[m].inside()>=0) continue;
2007
2008 m_elementsMap[++LA] = m;
2009 }
2010
2011 m_lastElement = LA;
2012 L = m_firstElement;
2013 m_nElements = LA+1;
2014
2015 bool nc = true;
2016 bool so = true;
2017 double ds = m_elements[m_elementsMap[LA]].step()-m_elements[m_elementsMap[L]].step();
2018
2019 if (ds > 0.) { // Sort in increase order
2020
2021 while(nc) {
2022 nc = false;
2023 int m = L, n = L+1;
2024 for (; n<=LA; ++n) {
2025
2026 int Mn = m_elementsMap[n];
2027 int Mm = m_elementsMap[m];
2028
2029 if (m_elements[Mn].step() < m_elements[Mm].step()) {
2030 if (m_elements[Mn].step(m_elements[Mm]) < 0.) {
2031 m_elementsMap[m] = Mn;
2032 m_elementsMap[n] = Mm;
2033 nc = true; so = false;
2034 }
2035 }
2036 ++m;
2037 }
2038 }
2039 }
2040 else {
2041
2042 while(nc) { // Sort in decrease order
2043 nc = false;
2044 int m = L, n = L+1;
2045 for (; n<=LA; ++n) {
2046
2047 int Mn = m_elementsMap[n];
2048 int Mm = m_elementsMap[m];
2049
2050 if (m_elements[Mn].step() > m_elements[Mm].step()) {
2051 if (m_elements[Mn].step(m_elements[Mm]) > 0.) {
2052 m_elementsMap[m] = Mn;
2053 m_elementsMap[n] = Mm;
2054 nc = true; so = false;
2055 }
2056 }
2057 ++m;
2058 }
2059 }
2060 }
2061 if (so) return;
2062
2063 // Search first detector elements with cluster
2064 //
2065 int n = L;
2066 for (; n<= LA; ++n) {
2067
2068 int e = m_elementsMap[n];
2069 if (m_elements[e].cluster()) break;
2070 if (m_elements[e].clusterNoAdd()) --m_nclustersNoAdd;
2071 else if (m_elements[e].inside() < 0 &&
2072 m_elements[e].detstatus()>=0) {--m_nholes; ++m_nHolesBefore;}
2073 }
2074
2075 // Search last detector elements with cluster
2076 //
2077 int m = LA;
2078 for (; m>=n ; --m) {
2079
2080 int e = m_elementsMap[m];
2081 if (m_elements[e].cluster()) break;
2082 if (m_elements[e].clusterNoAdd()) --m_nclustersNoAdd;
2083 else if (m_elements[e].inside() < 0 &&
2084 m_elements[e].detstatus()>=0) {--m_nholes; ++m_nHolesAfter;}
2085 }
2086 m_firstElement = n;
2087 m_lastElement = m;
2088
2089}
@ Mm
Maybe not needed in the migration.

◆ trackParametersToClusters()

bool InDet::SiTrajectory_xk::trackParametersToClusters ( const PixelClusterContainer * ,
const SCT_ClusterContainer * ,
const Trk::TrackParameters & ,
std::vector< const InDet::SiDetElementBoundaryLink_xk * > & ,
std::multimap< const Trk::PrepRawData *, const Trk::Track * > & ,
std::vector< const InDet::SiCluster * > & ,
const EventContext & ctx )

Definition at line 914 of file SiTrajectory_xk.cxx.

922{
923 m_nElements = 0;
924 m_ndf = 0;
925
926 std::multimap<double,const InDet::SiCluster*> xi2cluster;
927
928 std::vector<const InDet::SiDetElementBoundaryLink_xk*>::iterator iter_boundaryLink,endBoundaryLinks=DE.end();
929 std::multimap<const Trk::PrepRawData*,const Trk::Track*>::const_iterator t, te =PT.end();
930
931 double xi2Cut = .5;
932 int ndfCut = 6;
933
934 for (iter_boundaryLink=DE.begin(); iter_boundaryLink!=endBoundaryLinks; ++iter_boundaryLink) {
935
936 const InDetDD::SiDetectorElement* detectorElement = (*iter_boundaryLink)->detElement();
937 IdentifierHash id = detectorElement->identifyHash();
938
939 bool sct = detectorElement->isSCT();
940
941 if (!sct) {
942 InDet::PixelClusterCollection::const_iterator sib, sie;
943 const InDet::PixelClusterCollection *w = (*PIXc).indexFindPtr(id);
944
945 if (w!=nullptr && w->begin()!=w->end()) {
946 sib = w->begin();
947 sie = w->end ();
948 } else {
949 continue;
950 }
951 if (!m_elements[0].ForwardPropagationForClusterSeach(m_nElements,Tp,(*iter_boundaryLink),sib,sie,ctx)) return false;
952 } else {
953 InDet::SCT_ClusterCollection::const_iterator sib, sie;
954 const InDet::SCT_ClusterCollection *w = (*SCTc).indexFindPtr(id);
955
956 if (w!=nullptr && w->begin()!=w->end()) {
957 sib = w->begin();
958 sie = w->end ();
959 } else {
960 continue;
961 }
962 if (!m_elements[0].ForwardPropagationForClusterSeach(m_nElements,Tp,(*iter_boundaryLink),sib,sie,ctx)) return false;
963 }
964
965 for (int i=0; i!=m_elements[0].nlinksF(); ++i) {
966
967 double x = m_elements[0].linkF(i).xi2();
968
969 if (sct) {
970 t = PT.find(m_elements[0].linkF(i).cluster());
971 if (t!=te && (*t).second->measurementsOnTrack()->size() >= 10) continue;
972 } else {
973 x*=.5;
974 }
975
976 if (x <= xi2Cut) xi2cluster.insert(std::make_pair(x,m_elements[0].linkF(i).cluster()));
977 break;
978 }
979 ++m_nElements;
980 }
981
982 if (xi2cluster.size() < 3) return false;
983
984 std::multimap<double,const InDet::SiCluster*>::iterator xc = xi2cluster.begin(), xce = xi2cluster.end();
985
986 for (; xc!=xce; ++xc) {
987 lSiCluster.push_back((*xc).second);
988 (*xc).second->detectorElement()->isSCT() ? m_ndf+=1 : m_ndf+=2;
989 if ( m_ndf >= ndfCut ) break;
990 }
991
992 return m_ndf >= 6;
993}
#define x

◆ updateHoleSearchResult()

void InDet::SiTrajectory_xk::updateHoleSearchResult ( )

Helper method to determine the hole search outcome for use in the later reco.

instantiate an outcome object to populate

counter to find subsequent SCT holes

loop between the first and last hit on the trajectory

Now get the current element

check if this is a pixel element

if we have a cluster on-track, this is neither a hole nor a dead Same goes for outliers

otherwise, need to check more carefully:

if this is a candidate (we expect a hit and we are not on a dead sensor)

in this case, we have a hole.

end of SCT case

in all other cases, apart from dead, nothing to be incremented

fallthrough

fallthrough

fallthrough

fallthrough

in all of these cases, we have to reset the double holes

if we encounter a dead element, increment the appropriate counters

end switch over boundary check result

end no-cluster case

if the previous element was also an SCT hole, we now have a double hole

end loop over elements

Definition at line 2241 of file SiTrajectory_xk.cxx.

2241 {
2242
2244 m_patternHoleOutcome = InDet::PatternHoleSearchOutcome{0,0,0,0,0,true};
2245
2247 bool prevIsSctHole = false;
2248
2250
2251 for (int theEle = m_firstElement+1; theEle<m_lastElement; ++theEle) {
2253 int m = m_elementsMap[theEle];
2254 InDet::SiTrajectoryElement_xk & theElement = m_elements[m];
2256 bool isPix = theElement.ndf() == 2;
2257 bool isSCTHole=false;
2258
2261 if (theElement.cluster() || theElement.clusterNoAdd()) {
2262 prevIsSctHole = false;
2263 continue;
2264 }
2265
2267 else {
2268 std::unique_ptr<const Trk::TrackParameters> pars {theElement.trackParameters(true,0)};
2269 Trk::BoundaryCheckResult boundaryStatus = m_tools->boundaryCheckTool()->boundaryCheck(*pars);
2270 switch (boundaryStatus){
2274 if (isPix) {
2275 ++m_patternHoleOutcome.nPixelHoles;
2276 }
2277 else {
2278 ++m_patternHoleOutcome.nSCTHoles;
2279 isSCTHole=true;
2280 }
2281 break;
2288 break;
2291 if (isPix){
2292 ++m_patternHoleOutcome.nPixelDeads;
2293 }
2294 else{
2295 ++m_patternHoleOutcome.nSCTDeads;
2296 }
2297 break;
2298 }
2299 }
2300
2303 if (isSCTHole && prevIsSctHole){
2304 prevIsSctHole = false;
2305 ++m_patternHoleOutcome.nSCTDoubleHoles;
2306 }
2307 else {
2308 prevIsSctHole = isSCTHole;
2309 }
2310 }
2311 if (m_patternHoleOutcome.nPixelHoles+m_patternHoleOutcome.nSCTHoles > m_tools->maxholes()
2312 || m_patternHoleOutcome.nSCTDoubleHoles > m_tools->maxdholes()){
2313 m_patternHoleOutcome.passPatternHoleCut = false;
2314 }
2315}
std::unique_ptr< Trk::TrackParameters > trackParameters(bool, int)
@ OnEdge
within the sensitive area of an active element
@ DeadElement
outside the element
@ Insensitive
close to the edge of an active element
@ Outside
with the insensitive area of an active element
@ Error
within the nominally active area of a dead element

◆ SiCombinatorialTrackFinder_xk

friend class SiCombinatorialTrackFinder_xk
friend

Definition at line 46 of file SiTrajectory_xk.h.

Member Data Documentation

◆ m_atos

int InDet::SiTrajectory_xk::m_atos[100] {}
protected

Definition at line 188 of file SiTrajectory_xk.h.

188{} ; //

◆ m_dholes

int InDet::SiTrajectory_xk::m_dholes {}
protected

Definition at line 181 of file SiTrajectory_xk.h.

181{} ; // dholes

◆ m_difference

int InDet::SiTrajectory_xk::m_difference {}
protected

Definition at line 177 of file SiTrajectory_xk.h.

177{} ; // forward-bacward diff

◆ m_elements

std::array<SiTrajectoryElement_xk, 300> InDet::SiTrajectory_xk::m_elements {}
protected

Definition at line 190 of file SiTrajectory_xk.h.

190{} ;

◆ m_elementsMap

std::array<int, 300> InDet::SiTrajectory_xk::m_elementsMap {}
protected

Definition at line 184 of file SiTrajectory_xk.h.

184{} ; // index

◆ m_firstElement

int InDet::SiTrajectory_xk::m_firstElement {}
protected

Definition at line 171 of file SiTrajectory_xk.h.

171{} ;

◆ m_itos

int InDet::SiTrajectory_xk::m_itos[100] {}
protected

Definition at line 189 of file SiTrajectory_xk.h.

189{} ; //

◆ m_lastElement

int InDet::SiTrajectory_xk::m_lastElement {}
protected

index of the first element where we have

a cluster

Definition at line 173 of file SiTrajectory_xk.h.

173{} ;

◆ m_nActiveElements

int InDet::SiTrajectory_xk::m_nActiveElements {}
protected

Definition at line 182 of file SiTrajectory_xk.h.

182{} ;

◆ m_nclusters

int InDet::SiTrajectory_xk::m_nclusters {}
protected

index of the last element where we have

a cluster

Definition at line 175 of file SiTrajectory_xk.h.

175{} ;

◆ m_nclustersNoAdd

int InDet::SiTrajectory_xk::m_nclustersNoAdd {}
protected

Number of clusters on trajectory.

Definition at line 176 of file SiTrajectory_xk.h.

176{} ; // (NCL)

◆ m_ndf

int InDet::SiTrajectory_xk::m_ndf {}
protected

Definition at line 186 of file SiTrajectory_xk.h.

186{} ; //

◆ m_ndfcut

int InDet::SiTrajectory_xk::m_ndfcut {}
protected

Definition at line 185 of file SiTrajectory_xk.h.

185{} ; //

◆ m_nElements

int InDet::SiTrajectory_xk::m_nElements {}
protected

count active elements

Definition at line 183 of file SiTrajectory_xk.h.

183{} ; // index

◆ m_nholes

int InDet::SiTrajectory_xk::m_nholes {}
protected

Definition at line 180 of file SiTrajectory_xk.h.

180{} ; // holes

◆ m_nHolesAfter

int InDet::SiTrajectory_xk::m_nHolesAfter {}
protected

Definition at line 179 of file SiTrajectory_xk.h.

179{} ; // holes after

◆ m_nHolesBefore

int InDet::SiTrajectory_xk::m_nHolesBefore {}
protected

Definition at line 178 of file SiTrajectory_xk.h.

178{} ; // holes before

◆ m_ntos

int InDet::SiTrajectory_xk::m_ntos {}
protected

Definition at line 187 of file SiTrajectory_xk.h.

187{} ; //

◆ m_patternHoleOutcome

PatternHoleSearchOutcome InDet::SiTrajectory_xk::m_patternHoleOutcome {}
protected

Definition at line 195 of file SiTrajectory_xk.h.

195{};

◆ m_surfacedead

std::unique_ptr<const Trk::Surface> InDet::SiTrajectory_xk::m_surfacedead
protected

Definition at line 194 of file SiTrajectory_xk.h.

◆ m_tools

const InDet::SiTools_xk* InDet::SiTrajectory_xk::m_tools {}
protected

Trajectory elements on this trajectory.

Each one corresponds to one detector element on the search road

Definition at line 193 of file SiTrajectory_xk.h.

193{} ; //

The documentation for this class was generated from the following files: