154 wrapper->
setSeed (this->name(), ctx);
155 CLHEP::HepRandomEngine* engine = wrapper->
getEngine (ctx);
157 std::array<bool,Parts::kNParts> remove_parts{};
163 std::unique_ptr<TrackCollection> newTrackCollection(
m_saveNewTracksInSG ? std::make_unique<TrackCollection>() :
nullptr );
169 return StatusCode::FAILURE;
174 for ( ; trackIterator < tracks->end(); ++trackIterator) {
175 if (!((*trackIterator))) {
183 ATH_MSG_DEBUG(
"Perform hole search on unmodified track (" << *trackIterator <<
")"
184 <<
" which contains " << tsos->
size() <<
" track states" ) ;
188 auto vecTsos = std::make_unique<Trk::TrackStates>();
194 unsigned int nRemoved = 0;
196 std::vector< unsigned int > pixelHitsPerLayer = std::vector< unsigned int>(3);
197 std::vector< unsigned int > sctHitsPerLayer = std::vector< unsigned int>(9);
201 int maxPixelLayerBarrel = -1;
202 int maxPixelLayerEndcap = -1;
203 int maxSctLayerBarrel = -1;
204 int maxSctLayerEndcap = -1;
207 ATH_MSG_VERBOSE(
"Parsing track first to find end layers and maximal numbers" ) ;
208 for ( ; iTsos != iTsosEnd ; ++iTsos) {
217 int plLayer = abs(
m_pixelID->layer_disk( plSurfaceID ));
218 bool isBarrel =
m_pixelID->is_barrel( plSurfaceID );
221 maxPixelLayerBarrel = plLayer > maxPixelLayerBarrel ? plLayer : maxPixelLayerBarrel;
223 maxPixelLayerEndcap = plLayer > maxPixelLayerEndcap ? plLayer : maxPixelLayerEndcap;
224 }
else if (
m_idHelper->is_sct( plSurfaceID ) ) {
225 int plLayer = abs(
m_sctID->layer_disk( plSurfaceID ));
226 bool isBarrel =
m_sctID->is_barrel( plSurfaceID );
229 maxSctLayerBarrel = plLayer > maxSctLayerBarrel ? plLayer : maxSctLayerBarrel;
231 maxSctLayerEndcap = plLayer > maxSctLayerEndcap ? plLayer : maxSctLayerEndcap;
236 maxPixelLayerBarrel = maxSctLayerBarrel > 0 ? -1 : maxPixelLayerBarrel;
237 maxPixelLayerEndcap = maxSctLayerEndcap > 0 ? -1 : maxPixelLayerEndcap;
239 iTsos = tsos->
begin();
243 for ( ; iTsos != iTsosEnd ; ++iTsos) {
250 unsigned int randomHoles = 0;
254 ATH_MSG_VERBOSE(
"Random mode chosen: will create " << randomHoles <<
" holes on the track.");
257 unsigned int maxPixel = maxPixelLayerBarrel > maxPixelLayerEndcap
258 ? maxPixelLayerBarrel : maxPixelLayerEndcap;
260 unsigned int maxSct = maxSctLayerBarrel > maxSctLayerEndcap
261 ? maxSctLayerBarrel : maxSctLayerEndcap;
263 int maxHit = maxPixel + maxSct;
264 int holesTriggered = 0;
267 for (
unsigned int ihole = 0; ihole < randomHoles && holesTriggered < int(randomHoles); ++ihole){
269 unsigned int holeId = (
unsigned int)(maxHit*CLHEP::RandFlat::shoot(engine));
270 ATH_MSG_VERBOSE(
"Random mode : layer identifier " << holeId <<
" chosen." );
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;
290 double sideDecision = CLHEP::RandFlat::shoot(engine);
291 if ( sideDecision < 1./3. )
293 else if ( sideDecision < 2./3. )
310 int layer = abs(
m_pixelID->layer_disk( surfaceID ));
312 bool isBarrel =
m_pixelID->is_barrel( surfaceID );
314 pixelHitsPerLayer[layer]++;
315 ATH_MSG_VERBOSE(
"Pixel hits on layer " << layer <<
" : " << pixelHitsPerLayer[layer] ) ;
317 bool isLastLayer = (isBarrel && layer == maxPixelLayerBarrel) || (!isBarrel && layer == maxPixelLayerEndcap);
320 ATH_MSG_VERBOSE(
"This pixel hit is not removed, it is at the track end." ) ;
339 }
else if (
m_idHelper->is_sct( surfaceID ) ) {
340 int layer = abs(
m_sctID->layer_disk( surfaceID ));
342 bool isBarrel =
m_sctID->is_barrel( surfaceID );
344 sctHitsPerLayer[layer]++;
345 ATH_MSG_VERBOSE(
"SCT hits on layer " << layer <<
" : " << sctHitsPerLayer[layer] ) ;
347 int side =
m_sctID->side( surfaceID );
350 bool isLastLayer = (isBarrel && layer == maxSctLayerBarrel) || (!isBarrel && layer == maxSctLayerEndcap);
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 ) {
359 }
else if ( layer == 1 && remove_parts[
Parts::kSct1] && canRemoveSide ) {
364 }
else if ( layer == 2 && remove_parts[
Parts::kSct2] && canRemoveSide ) {
369 }
else if ( layer == 3 && remove_parts[
Parts::kSct3] && canRemoveSide ) {
374 }
else if ( layer == 4 && remove_parts[
Parts::kSct4] && canRemoveSide ) {
379 }
else if ( layer == 5 && remove_parts[
Parts::kSct5] && canRemoveSide ) {
384 }
else if ( layer == 6 && remove_parts[
Parts::kSct6] && canRemoveSide ) {
389 }
else if ( layer == 7 && remove_parts[
Parts::kSct7] && canRemoveSide ) {
394 }
else if ( layer == 8 && remove_parts[
Parts::kSct8] && canRemoveSide ) {
406 vecTsos->push_back(newTsos);
409 ATH_MSG_DEBUG(
"Removed total of " << nRemoved <<
" TSoS on track." ) ;
415 unsigned int foundHoles = abs(
static_cast<int>(newHoles) -
static_cast<int>(oldHoles));
417 if ( foundHoles == nRemoved )
418 ATH_MSG_DEBUG(
"== OK : "<< nRemoved <<
" generated holes out of which all were found" ) ;
420 ATH_MSG_DEBUG(
"== PROBLEM : "<< nRemoved <<
" generated holes out of which "<< newHoles - oldHoles <<
" were found" ) ;
426 while (m_trackStats.size() < nRemoved+1) {
427 m_trackStats.emplace_back(0 );
429 while (m_trackStats[nRemoved].size() < foundHoles+1) {
430 m_trackStats[nRemoved].push_back( 0 );
432 ATH_MSG_DEBUG(
"m_trackStats.size()= " << m_trackStats.size() );
434 m_trackStats[nRemoved][foundHoles]++;
439 newTrackCollection->push_back( newTrack );
449 if (newTrackCollection_handle.
record( std::move(newTrackCollection) ).isFailure()){
451 return StatusCode::FAILURE;
454 return StatusCode::SUCCESS;