222 const EventContext& ctx = Gaudi::Hive::currentContext();
223 ATH_MSG_DEBUG(
"Adding TSOS decorations the track particles");
229 if( ! tracks.isValid() ) {
231 return StatusCode::FAILURE;
233 size_t nTracks = tracks->size();
260 return StatusCode::FAILURE;
265 float trtPhase_time=0.;
266 if (!trtPhase.isValid()) {
269 trtPhase_time = trtPhase->getTime();
272 decorTRTPhase(*eventInfo) = trtPhase_time;
285 if (msosPixel.
record(std::make_unique<xAOD::TrackStateValidationContainer>(),
286 std::make_unique<xAOD::TrackStateValidationAuxContainer>()).isFailure()) {
288 return StatusCode::FAILURE;
297 if (msosSCT.
record(std::make_unique<xAOD::TrackStateValidationContainer>(),
298 std::make_unique<xAOD::TrackStateValidationAuxContainer>()).isFailure()) {
300 return StatusCode::FAILURE;
309 if (msosTRT.
record(std::make_unique<xAOD::TrackStateValidationContainer>(),
310 std::make_unique<xAOD::TrackStateValidationAuxContainer>()).isFailure()) {
312 return StatusCode::FAILURE;
321 if (!prd_to_track_map.
isValid()) {
324 prd_to_track_map_cptr = prd_to_track_map.
cptr();
328 std::vector<bool>
mask;
329 mask.assign(nTracks,
true);
331 std::vector<int>
entries = m_parser->evaluateAsVector();
335 ATH_MSG_ERROR(
"Sizes incompatible! Are you sure your selection string used ID TrackParticles?");
336 return StatusCode::FAILURE;
343 std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer,float> > trackTRTFloatDecorators;
347 std::vector<SG::WriteDecorHandle<xAOD::TrackParticleContainer,float> >
350 unsigned i_track = 0;
351 for (
const auto *
const track : *tracks) {
361 if( !
track->trackLink().isValid() ||
track->track() ==
nullptr ) {
371 std::vector< ElementLink< xAOD::TrackStateValidationContainer > > msosLink;
391 bool allExtrapolationsSucceded =
true;
396 ATH_MSG_VERBOSE(
"Start radius for extrapolating to layers: "<<startRadius);
399 std::unique_ptr<const Trk::TrackParameters> outputParamsIBL
411 std::unique_ptr<const Trk::TrackParameters> outputParamsBL
423 std::unique_ptr<const Trk::TrackParameters> outputParamsL1
435 std::unique_ptr<const Trk::TrackParameters> outputParamsL2
444 if (outputParamsIBL.get()) {
445 trackPixFloatDecorators[
kTrkIBLXDecor](*track) = outputParamsIBL->position().x();
446 trackPixFloatDecorators[
kTrkIBLYDecor](*track) = outputParamsIBL->position().y();
447 trackPixFloatDecorators[
kTrkIBLZDecor](*track) = outputParamsIBL->position().z();
450 allExtrapolationsSucceded =
false;
457 if (outputParamsBL.get()) {
458 trackPixFloatDecorators[
kTrkBLXDecor](*track) = outputParamsBL->position().x();
459 trackPixFloatDecorators[
kTrkBLYDecor](*track) = outputParamsBL->position().y();
460 trackPixFloatDecorators[
kTrkBLZDecor](*track) = outputParamsBL->position().z();
463 allExtrapolationsSucceded =
false;
470 if (outputParamsL1.get()) {
471 trackPixFloatDecorators[
kTrkL1XDecor](*track) = outputParamsL1->position().x();
472 trackPixFloatDecorators[
kTrkL1YDecor](*track) = outputParamsL1->position().y();
473 trackPixFloatDecorators[
kTrkL1ZDecor](*track) = outputParamsL1->position().z();
476 allExtrapolationsSucceded =
false;
483 if (outputParamsL2.get()) {
484 trackPixFloatDecorators[
kTrkL2XDecor](*track) = outputParamsL2->position().x();
485 trackPixFloatDecorators[
kTrkL2YDecor](*track) = outputParamsL2->position().y();
486 trackPixFloatDecorators[
kTrkL2ZDecor](*track) = outputParamsL2->position().z();
489 allExtrapolationsSucceded =
false;
495 if(!allExtrapolationsSucceded)
ATH_MSG_WARNING(
"At least one extrapolation to a Pixel layer failed!");
498 ATH_MSG_WARNING(
"No perigee TrackParameters found - filling positions on layers to (0,0,0)!");
516 std::vector<const Trk::TrackStateOnSurface*> tsoss;
521 tsoss.push_back(trackState);
524 std::unique_ptr<const Trk::TrackStates>
holes;
528 tsoss.push_back(
hole);
532 stable_sort( tsoss.begin(), tsoss.end(), CompFunc );
539 for (
const auto& trackState: tsoss){
557 if(!trackState->surface().associatedDetectorElement()){
562 Identifier surfaceID = trackState->surface().associatedDetectorElement()->identify();
587 if( !isPixel && !isSCT && !isTRT ){
602 elink.toPersistent();
603 msosLink.push_back(elink);
612 elink.toPersistent();
613 msosLink.push_back(elink);
622 elink.toPersistent();
623 msosLink.push_back(elink);
648 double lTheta=-1000., lPhi=-1000.;
652 errDCAcc(*msos) = -1 ;
662 HitZAcc(*msos)=-3000;
664 rTrkWireAcc(*msos)=-1;
668 HitZAcc(*msos)=-3000;
670 rTrkWireAcc(*msos)=-1;
675 HitZAcc(*msos)=gp.z();
676 HitRAcc(*msos)=gp.perp();
677 rTrkWireAcc(*msos)= fabs(trackState->trackParameters()->parameters()[
Trk::driftRadius]);
678 lTheta = trackState->trackParameters()->parameters()[
Trk::theta];
679 lPhi = trackState->trackParameters()->parameters()[
Trk::phi];
684 rTrkWireAcc(*msos)=0;
691 if (prd_to_track_map_cptr) {
696 isSharedAcc(*msos) = isShared;
702 std::unique_ptr<const Trk::TrackParameters> extrap(
m_extrapolator->extrapolateTrack(ctx,*trkTrack,trackState->surface()) );
709 ATH_MSG_DEBUG(
" Original position " <<
tp->parameters()[0] <<
" " <<
tp->parameters()[1]);
710 ATH_MSG_DEBUG(
"Extrapolated position " << extrap->parameters()[0] <<
" " << extrap->parameters()[1]);
726 if (
side && (isSCT || isPixel)) {
732 float trketacomp = mytrack.dot(myetaax);
733 float trkphicomp = mytrack.dot(myphiax);
734 float trknormcomp = mytrack.dot(mynormal);
736 ATH_MSG_DEBUG(
" Original incident angle " << trketacomp <<
" " << trkphicomp <<
" " << trknormcomp);
739 float trketacompX = metrack.dot(myetaax);
740 float trkphicompX = metrack.dot(myphiax);
741 float trknormcompX = metrack.dot(mynormal);
742 ATH_MSG_DEBUG(
"Extrapolated incident angle " << trketacompX <<
" " << trkphicompX <<
" " << trknormcompX);
744 msos->
setLocalAngles( atan2(trketacomp,trknormcomp), atan2(trkphicomp,trknormcomp) );
749 float trketacompX = metrack.dot(myetaax);
750 float trkphicompX = metrack.dot(myphiax);
751 float trknormcompX = metrack.dot(mynormal);
752 msos->
setLocalAngles( atan2(trketacompX,trknormcompX), atan2(trkphicompX,trknormcompX) );
757 if(!measurement) {
continue; }
759 if (isTRT && !trtDCOffsets.
isValid() && !trtDCs.
isValid()) {
continue; }
760 if (isSCT && !sctClusterOffsets.
isValid() && !sctClusters.
isValid()) {
continue; }
761 if (isPixel && !pixelClusterOffsets.
isValid() && !pixelClusters.
isValid()) {
continue; }
795 SiWidthAcc(*msos) = SiWidthAcc(*sctCluster);
796 firstStripAcc(*msos) = (rdoStripAcc(*sctCluster)).at(0);
798 SiWidthAcc(*msos) = -1;
799 firstStripAcc(*msos) = -1;
809 driftTimeAcc(*msos) = rtr->
drifttime(fabs(
tp->parameters()[0]));
813 driftTimeAcc(*msos) = rtr->
drifttime(fabs(extrap->parameters()[0]));
823 std::optional<Trk::ResidualPull> biased;
824 std::optional<Trk::ResidualPull> unbiased;
831 if(unbiasedTp.get()) {
870 dectsos_msosLink( *
track ) = msosLink;
877 return StatusCode::SUCCESS;