151 {
152
156
157 std::array<bool,Parts::kNParts> remove_parts{};
160 }
162
163 std::unique_ptr<TrackCollection> newTrackCollection(
m_saveNewTracksInSG ? std::make_unique<TrackCollection>() :
nullptr );
164
165
167 if (!tracks.isValid()) {
169 return StatusCode::FAILURE;
170 }
171
172
174 for ( ; trackIterator < tracks->end(); ++trackIterator) {
175 if (!((*trackIterator))) {
177 continue;
178 }
179
180
181 const Trk::Track&
track = *(*trackIterator);
183 ATH_MSG_DEBUG(
"Perform hole search on unmodified track (" << *trackIterator <<
")"
184 <<
" which contains " << tsos->
size() <<
" track states" ) ;
185
187
188 auto vecTsos = std::make_unique<Trk::TrackStates>();
189
190
193
194 unsigned int nRemoved = 0;
195
196 std::vector< unsigned int > pixelHitsPerLayer = std::vector< unsigned int>(3);
197 std::vector< unsigned int > sctHitsPerLayer = std::vector< unsigned int>(9);
198
199
200
201 int maxPixelLayerBarrel = -1;
202 int maxPixelLayerEndcap = -1;
203 int maxSctLayerBarrel = -1;
204 int maxSctLayerEndcap = -1;
205
207 ATH_MSG_VERBOSE(
"Parsing track first to find end layers and maximal numbers" ) ;
208 for ( ; iTsos != iTsosEnd ; ++iTsos) {
209
210 Identifier plSurfaceID;
211 const Trk::MeasurementBase* plMesb = (*iTsos)->measurementOnTrack();
214
215
217 int plLayer = abs(
m_pixelID->layer_disk( plSurfaceID ));
219
220 if ( isBarrel )
221 maxPixelLayerBarrel = plLayer > maxPixelLayerBarrel ? plLayer : maxPixelLayerBarrel;
222 else
223 maxPixelLayerEndcap = plLayer > maxPixelLayerEndcap ? plLayer : maxPixelLayerEndcap;
224 }
else if (
m_idHelper->is_sct( plSurfaceID ) ) {
225 int plLayer = abs(
m_sctID->layer_disk( plSurfaceID ));
227
228 if ( isBarrel )
229 maxSctLayerBarrel = plLayer > maxSctLayerBarrel ? plLayer : maxSctLayerBarrel;
230 else
231 maxSctLayerEndcap = plLayer > maxSctLayerEndcap ? plLayer : maxSctLayerEndcap;
232 }
233 }
234 }
235
236 maxPixelLayerBarrel = maxSctLayerBarrel > 0 ? -1 : maxPixelLayerBarrel;
237 maxPixelLayerEndcap = maxSctLayerEndcap > 0 ? -1 : maxPixelLayerEndcap;
238
239 iTsos = tsos->
begin();
240 }
241
242
243 for ( ; iTsos != iTsosEnd ; ++iTsos) {
245
246 Identifier surfaceID;
247 const Trk::MeasurementBase* mesb = (*iTsos)->measurementOnTrack();
248
249
250 unsigned int randomHoles = 0;
252
254 ATH_MSG_VERBOSE(
"Random mode chosen: will create " << randomHoles <<
" holes on the track.");
255
256
257 unsigned int maxPixel = maxPixelLayerBarrel > maxPixelLayerEndcap
258 ? maxPixelLayerBarrel : maxPixelLayerEndcap;
259
260 unsigned int maxSct = maxSctLayerBarrel > maxSctLayerEndcap
261 ? maxSctLayerBarrel : maxSctLayerEndcap;
262
263 int maxHit = maxPixel + maxSct;
264 int holesTriggered = 0;
266
267 for (
unsigned int ihole = 0; ihole < randomHoles && holesTriggered <
int(randomHoles); ++ihole){
268
269 unsigned int holeId = (
unsigned int)(maxHit*CLHEP::RandFlat::shoot(engine));
270 ATH_MSG_VERBOSE(
"Random mode : layer identifier " << holeId <<
" chosen." );
271 {
272
273 switch (holeId) {
274 case 0 : { remove_parts[
Parts::kPix0] =
true; ++holesTriggered; };
break;
275 case 1 : { remove_parts[
Parts::kPix1] =
true; ++holesTriggered; };
break;
276 case 2 : { remove_parts[
Parts::kPix2] =
true; ++holesTriggered; };
break;
277 case 3 : { remove_parts[
Parts::kSct0] =
true; ++holesTriggered; };
break;
278 case 4 : { remove_parts[
Parts::kSct1] =
true; ++holesTriggered; };
break;
279 case 5 : { remove_parts[
Parts::kSct2] =
true; ++holesTriggered; };
break;
280 case 6 : { remove_parts[
Parts::kSct3] =
true; ++holesTriggered; };
break;
281 case 7 : { remove_parts[
Parts::kSct4] =
true; ++holesTriggered; };
break;
282 case 8 : { remove_parts[
Parts::kSct5] =
true; ++holesTriggered; };
break;
283 case 9 : { remove_parts[
Parts::kSct6] =
true; ++holesTriggered; };
break;
284 case 10 : { remove_parts[
Parts::kSct7] =
true; ++holesTriggered; };
break;
285 case 11 : { remove_parts[
Parts::kSct8] =
true; ++holesTriggered; };
break;
287 }
288
289 if (holeId > 2) {
290 double sideDecision = CLHEP::RandFlat::shoot(engine);
291 if ( sideDecision < 1./3. )
293 else if ( sideDecision < 2./3. )
295 else {
298 ++holesTriggered;
299 }
300 }
301 }
302 }
303 }
304
305
308
311
313
314 pixelHitsPerLayer[
layer]++;
315 ATH_MSG_VERBOSE(
"Pixel hits on layer " << layer <<
" : " << pixelHitsPerLayer[layer] ) ;
316
317 bool isLastLayer = (
isBarrel &&
layer == maxPixelLayerBarrel) || (!isBarrel && layer == maxPixelLayerEndcap);
318
320 ATH_MSG_VERBOSE(
"This pixel hit is not removed, it is at the track end." ) ;
325 nRemoved++;
326 continue;
330 nRemoved++;
331 continue;
335 nRemoved++;
336 continue;
337 }
338 }
339 }
else if (
m_idHelper->is_sct( surfaceID ) ) {
341
343
344 sctHitsPerLayer[
layer]++;
345 ATH_MSG_VERBOSE(
"SCT hits on layer " << layer <<
" : " << sctHitsPerLayer[layer] ) ;
346
349
350 bool isLastLayer = (
isBarrel &&
layer == maxSctLayerBarrel) || (!isBarrel && layer == maxSctLayerEndcap);
351
353 ATH_MSG_VERBOSE(
"This SCT hit is not removed, it is at the track end." ) ;
354 }
else if ( layer == 0 && remove_parts[
Parts::kSct0] && canRemoveSide ) {
357 nRemoved++;
358 continue;
359 }
else if ( layer == 1 && remove_parts[
Parts::kSct1] && canRemoveSide ) {
362 nRemoved++;
363 continue;
364 }
else if ( layer == 2 && remove_parts[
Parts::kSct2] && canRemoveSide ) {
367 nRemoved++;
368 continue;
369 }
else if ( layer == 3 && remove_parts[
Parts::kSct3] && canRemoveSide ) {
372 nRemoved++;
373 continue;
374 }
else if ( layer == 4 && remove_parts[
Parts::kSct4] && canRemoveSide ) {
377 nRemoved++;
378 continue;
379 }
else if ( layer == 5 && remove_parts[
Parts::kSct5] && canRemoveSide ) {
382 nRemoved++;
383 continue;
384 }
else if ( layer == 6 && remove_parts[
Parts::kSct6] && canRemoveSide ) {
387 nRemoved++;
388 continue;
389 }
else if ( layer == 7 && remove_parts[
Parts::kSct7] && canRemoveSide ) {
392 nRemoved++;
393 continue;
394 }
else if ( layer == 8 && remove_parts[
Parts::kSct8] && canRemoveSide ) {
397 nRemoved++;
398 continue;
399 }
400
401 }
402 }
403 }
404
405 const Trk::TrackStateOnSurface* newTsos = new Trk::TrackStateOnSurface(**iTsos);
406 vecTsos->push_back(newTsos);
407 }
408
409 ATH_MSG_DEBUG(
"Removed total of " << nRemoved <<
" TSoS on track." ) ;
410
411 Trk::Track* newTrack =
new Trk::Track(
track.info(), std::move(vecTsos),
nullptr );
413
415 unsigned int foundHoles = abs(static_cast<int>(newHoles) - static_cast<int>(oldHoles));
416
417 if ( foundHoles == nRemoved )
418 ATH_MSG_DEBUG(
"== OK : "<< nRemoved <<
" generated holes out of which all were found" ) ;
419 else
420 ATH_MSG_DEBUG(
"== PROBLEM : "<< nRemoved <<
" generated holes out of which "<< newHoles - oldHoles <<
" were found" ) ;
421
422
423
424 {
426 while (m_trackStats.size() < nRemoved+1) {
427 m_trackStats.emplace_back(0 );
428 }
429 while (m_trackStats[nRemoved].
size() < foundHoles+1) {
430 m_trackStats[nRemoved].push_back( 0 );
431 }
432 ATH_MSG_DEBUG(
"m_trackStats.size()= " << m_trackStats.size() );
433
434 m_trackStats[nRemoved][foundHoles]++;
435 }
436
437
439 newTrackCollection->push_back( newTrack );
440 } else {
441 delete newTrack;
442 }
443
444 }
446
449 if (newTrackCollection_handle.record( std::move(newTrackCollection) ).isFailure()){
451 return StatusCode::FAILURE;
452 }
453 }
454 return StatusCode::SUCCESS;
455}
void setSeed(const std::string &algName, const EventContext &ctx)
Set the random seed using a string (e.g.
CLHEP::HepRandomEngine * getEngine(const EventContext &ctx) const
Retrieve the random engine corresponding to the provided EventContext.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
std::mutex m_trackStatsMutex
unsigned int doHoleSearch(const Trk::Track *track) const
virtual const Surface & associatedSurface() const =0
Interface method to get the associated Surface.
const TrkDetElementBase * associatedDetectorElement() const
return associated Detector Element
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
virtual Identifier identify() const =0
Identifier.
DataVector< const Trk::TrackStateOnSurface > TrackStates