this uses move semantics so doesn't do a deep copy, so ...
write vertex collection ... TODO: add vertices collection handling here, should not be 0 at this point unless fastZVseeding is enabled
439 {
441
442 auto mnt_roi_nTracks = Monitored::Scalar<int>("roi_nTracks", 0);
443 std::vector<int> vec_seedSize;
445 auto mnt_roi_nSPs = Monitored::Scalar<int>("roi_nSPs", 0);
446 auto mnt_roi_nSPsPIX = Monitored::Scalar<int>("roi_nSPsPIX", 0);
447 auto mnt_roi_nSPsSCT = Monitored::Scalar<int>("roi_nSPsSCT", 0);
448 auto monSP = Monitored::Group(
m_monTool, mnt_roi_nSPsPIX, mnt_roi_nSPsSCT, mnt_seedSize);
449
450 auto mnt_timer_Total = Monitored::Timer<std::chrono::milliseconds>("TIME_Total");
451 auto mnt_timer_SpacePointConversion = Monitored::Timer<std::chrono::milliseconds>("TIME_SpacePointConversion");
452 auto mnt_timer_PatternReco = Monitored::Timer<std::chrono::milliseconds>("TIME_PattReco");
453 auto mnt_timer_TripletMaking = Monitored::Timer<std::chrono::milliseconds>("TIME_Triplets");
454 auto mnt_timer_CombTracking = Monitored::Timer<std::chrono::milliseconds>("TIME_CmbTrack");
455 auto mnt_timer_TrackFitter = Monitored::Timer<std::chrono::milliseconds>("TIME_TrackFitter");
456 auto mnt_timer_dEdxTrk = Monitored::Timer<std::chrono::milliseconds>("TIME_dEdxTrk");
457 auto mnt_timer_disTrkZVertex = Monitored::Timer<std::chrono::milliseconds>("TIME_disTrkZVertex");
458 auto mnt_timer_disTrk = Monitored::Timer<std::chrono::milliseconds>("TIME_disappearingTrack");
459 auto monTime = Monitored::Group(
m_monTool, mnt_roi_nTracks, mnt_roi_nSPs, mnt_timer_Total, mnt_timer_SpacePointConversion,
460 mnt_timer_PatternReco, mnt_timer_TripletMaking, mnt_timer_CombTracking, mnt_timer_TrackFitter,
461 mnt_timer_dEdxTrk, mnt_timer_disTrkZVertex, mnt_timer_disTrk);
462
463 auto mnt_roi_lastStageExecuted = Monitored::Scalar<int>("roi_lastStageExecuted", 0);
464 auto monDataError = Monitored::Group(
m_monTool, mnt_roi_lastStageExecuted);
465
466 mnt_timer_Total.start();
467 mnt_timer_SpacePointConversion.start();
468
469
470 mnt_roi_lastStageExecuted = 1;
471
472 std::vector<TrigSiSpacePointBase> convertedSpacePoints;
473
474 convertedSpacePoints.reserve(5000);
475
476 std::map<Identifier, std::vector<long int> > siClusterMap;
477
479
481
483 ATH_MSG_DEBUG(
"LRT Mode: Got input track collection with "<<inputTracks->
size()<<
"tracks");
484 long int trackIndex=0;
485 for (auto t:*inputTracks) {
487 }
488 }
489 ATH_CHECK(
m_spacePointTool->getSpacePoints(roi, convertedSpacePoints, mnt_roi_nSPsPIX, mnt_roi_nSPsSCT, ctx, &siClusterMap));
490 }
491 else {
493 }
494
495 }
496
497 mnt_timer_SpacePointConversion.stop();
498 mnt_roi_nSPs = mnt_roi_nSPsPIX + mnt_roi_nSPsSCT;
499
501
503 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPs <<
" space points.");
504 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsPIX <<
" Pixel space points.");
505 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsSCT <<
" SCT space points.");
506 ATH_MSG_DEBUG(
"REGTEST / converted space points size = " << convertedSpacePoints.size());
508 }
509 else {
510 ATH_MSG_DEBUG(
"No tracks found - too few hits in ROI to run " << mnt_roi_nSPs);
512 return StatusCode::SUCCESS;
513 }
514 }
515
516 mnt_roi_lastStageExecuted = 2;
517
519 std::unique_ptr<TrigRoiDescriptor> tmpRoi = std::make_unique<TrigRoiDescriptor>(roi);
520
521 auto vertices = std::make_unique<TrigVertexCollection>();
522 std::vector<float> vZv;
523
525 auto mnt_timer_ZFinder = Monitored::Timer<std::chrono::milliseconds>("TIME_ZFinder");
526 auto monTimeZFinder = Monitored::Group(
m_monTool, mnt_timer_ZFinder);
527 mnt_timer_ZFinder.start();
528
530 tmpRoi = std::make_unique<TrigRoiDescriptor>(true);
531 tmpRoi->setComposite(true);
532
533 vertices = std::make_unique<TrigVertexCollection>(*
m_trigZFinder->findZ( convertedSpacePoints, roi));
534
536
537
539 vZv.reserve(vertices->size());
540 for (const auto vertex : *vertices) {
543 float zMinus =
z - 7.0;
544 float zPlus =
z + 7.0;
547 tmpRoi->push_back(newRoi);
549 }
550
552 }
553
554 mnt_timer_ZFinder.stop();
555
562 return StatusCode::SUCCESS;
563 }
564 }
565
566
567 mnt_roi_lastStageExecuted = 3;
568
569 mnt_timer_PatternReco.start();
570
571 mnt_timer_TripletMaking.start();
572
573 std::vector<TrigInDetTriplet> triplets;
574
575 std::vector<TrigInDetTracklet> new_tracklets;
576
578
580
581 TrigInDetTrackSeedingResult seed_result =
m_seedingTool->findSeeds(roi, new_tracklets, ctx);
582
585 mnt_roi_nSPs = mnt_roi_nSPsPIX + mnt_roi_nSPsSCT;
586
588 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPs <<
" space points.");
589 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsPIX <<
" Pixel space points.");
590 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsSCT <<
" SCT space points.");
592 }
593 else {
594 ATH_MSG_DEBUG(
"No tracks found - too few hits in ROI to run " << mnt_roi_nSPs);
596 return StatusCode::SUCCESS;
597 }
598
599 } else {
601
602 seedGen.loadSpacePoints(convertedSpacePoints);
603
605 seedGen.createSeeds(tmpRoi.get(), vZv);
606 }
607 else {
608 seedGen.createSeeds(tmpRoi.get());
609 }
610
611 seedGen.getSeeds(triplets);
612 }
613 }
614 else {
615
616
618
619
620 }
621
622 unsigned int nTrackSeeds =
m_useTracklets ? new_tracklets.size() : triplets.size();
623
625
626 mnt_timer_TripletMaking.stop();
627 mnt_roi_lastStageExecuted = 4;
628
629 mnt_timer_CombTracking.start();
630
631
632
633 std::vector<std::tuple<bool, double,Trk::Track*>> qualityTracks;
634 qualityTracks.reserve(nTrackSeeds);
635
636 auto mnt_roi_nSeeds = Monitored::Scalar<int>("roi_nSeeds", 0);
637 auto monTrk_seed = Monitored::Group(
m_monTool, mnt_roi_nSeeds);
638
639 long int trackIndex=0;
640
641 bool PIX = true;
643
644 m_trackMaker->newTrigEvent(ctx, trackEventData, PIX, SCT);
645 if(
m_doDisappearingTrk ) trackEventData.combinatorialData().setFlagToReturnFailedTrack(
true);
646
647 std::vector<Trk::Track*> disFailTrks;
648 std::vector<Trk::Track*> disCombTrks;
649 std::vector<std::tuple<bool, double, Trk::Track*>> qualityDisFailTrks;
650 std::vector<std::tuple<bool, double, Trk::Track*>> qualityDisCombTrks;
651 int disTrk_n_disCombTrks=0;
652 int disTrk_n_disCombTrks_cleaning=0;
653 int disTrk_n_disFailTrks=0;
654 int disTrk_n_disFailTrks_cleaning=0;
655
656
657
658 for(unsigned int seedIdx=0;seedIdx!=nTrackSeeds;seedIdx++) {
659
660 std::vector<const Trk::SpacePoint*> spVec;
661
663 spVec = new_tracklets[seedIdx].seed();
664 }
665 else {
666
667 const TrigInDetTriplet &
seed = triplets[seedIdx];
668 const Trk::SpacePoint* osp1 =
seed.s1().offlineSpacePoint();
669 const Trk::SpacePoint* osp2 =
seed.s2().offlineSpacePoint();
670 const Trk::SpacePoint* osp3 =
seed.s3().offlineSpacePoint();
671
672 spVec = {osp1, osp2, osp3};
673 }
674
675 vec_seedSize.push_back(spVec.size());
676
678
679 std::vector<Identifier> clusterIds;
684 continue;
685 }
686 }
687 ++mnt_roi_nSeeds;
688
689 std::list<Trk::Track*> tracks;
690 std::list<Trk::Track*> tracksFail;
691 std::list<Trk::Track*> tracksAll =
m_trackMaker->getTracks(ctx, trackEventData, spVec);
692 auto resultCode = trackEventData.combinatorialData().resultCode();
694 tracks = tracksAll;
695 }
696 else {
697 tracksFail = tracksAll;
698 }
699
701 ATH_MSG_VERBOSE(
"size of tracks=" << tracks.size() <<
", tracksFail=" << tracksFail.size() <<
": resultCode=" << resultCode);
702 const TrigInDetTriplet &
seed = triplets[seedIdx];
703 for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
704 if( ! (*t) ) continue;
706 disTrk_n_disCombTrks++;
709 disTrk_n_disCombTrks_cleaning++;
710 disCombTrks.push_back((*t));
711 qualityDisCombTrks.emplace_back(std::make_tuple(
true, -
disTrackQuality((*t)), (*t)));
712 }
713 }
714 for(std::list<Trk::Track*>::const_iterator t=tracksFail.begin(); t!=tracksFail.end(); ++t) {
715 if( ! (*t) ) continue;
717 disTrk_n_disFailTrks++;
720 disTrk_n_disFailTrks_cleaning++;
721 disFailTrks.push_back((*t));
722 qualityDisFailTrks.emplace_back(std::make_tuple(
true, -
disTrackQuality((*t)), (*t)));
723 }
724 else {
725 delete(*t);
726 }
727 }
728 }
729
730 for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
731 if((*t)) {
732 float d0 = (*t)->perigeeParameters()==0 ? 10000.0 : (*t)->perigeeParameters()->parameters()[
Trk::d0];
735 qualityTracks.push_back(std::make_tuple(false,0,(*t)));
736 continue;
737 }
739
741 }
743 qualityTracks.push_back(std::make_tuple(
true, -
trackQuality((*t)), (*t)));
744 }
745 else {
746 qualityTracks.push_back(std::make_tuple(true, 0, (*t)));
747 }
748 }
749 }
751 }
752
754 ATH_MSG_DEBUG(
"===> nr of disFailTrks=" << disTrk_n_disFailTrks <<
" -> cleaning pass=" << disTrk_n_disFailTrks_cleaning);
755 ATH_MSG_DEBUG(
"===> nr of disCombTrks=" << disTrk_n_disCombTrks <<
" -> cleaning pass=" << disTrk_n_disCombTrks_cleaning);
756 }
757
759
760
763 }
764
765
769 }
770
772 initialTracks.
reserve(qualityTracks.size());
773
775
776
778 std::vector<unsigned int> indexDisCombTrk;
779 for(const auto& q : qualityTracks) {
780 bool needed_for_disCombTrk = false;
782 Trk::Track* trk_q = std::get<2>(q);
783 for(const auto& qdis : qualityDisCombTrks ) {
784 if( std::get<2>(qdis) == trk_q ) {
785 needed_for_disCombTrk = std::get<0>(qdis);
786 break;
787 }
788 }
789 if( needed_for_disCombTrk)
ATH_MSG_VERBOSE(
"idx=" << idx <<
" ===> neded for disCombTrk");
790 }
791 if (std::get<0>(q)==true) {
794 }
795 else {
797 delete std::get<2>(q);
798 }
799 else {
800 if( needed_for_disCombTrk ) {
802 extraDisCombTracks.
push_back(std::get<2>(q));
803 }
804 else {
805 delete std::get<2>(q);
806 }
807 }
808 }
810 }
811 qualityTracks.clear();
812
814
815
816 mnt_timer_CombTracking.stop();
817 mnt_timer_PatternReco.stop();
818
819 mnt_roi_lastStageExecuted = 5;
820
821 mnt_timer_TrackFitter.start();
822
824
827 }
828 else {
829 outputTracks = std::move(initialTracks);
830 }
831 }
832 else {
834
836
837
838 mnt_timer_dEdxTrk.start();
841
842 }
843
845
846 if( outputTracks.
empty() ) {
848 }
849
850
851 bool do_recoverDisCombTrk = true;
853 ATH_MSG_DEBUG(
"part of initialTracks fails in fitting. do not try to recover DisCombTracks");
854 do_recoverDisCombTrk = false;
855 }
856
858 fittedExtraDisCombTracks.
reserve(extraDisCombTracks.
size());
862 if( extraDisCombTracks.
size() > 0 ) {
865 for (
auto fittedTrack = fittedExtraDisCombTracks.
begin(); fittedTrack!=fittedExtraDisCombTracks.
end(); ++fittedTrack) {
868 fittedDisCombTrks.push_back(*fittedTrack);
869 }
870 }
871 }
872
873
874
875 for (
auto fittedTrack = outputTracks.
begin(); fittedTrack!=outputTracks.
end(); ) {
876 if ((*fittedTrack)->perigeeParameters()) {
877 float d0 = (*fittedTrack)->perigeeParameters()->parameters()[
Trk::d0];
878 float z0 = (*fittedTrack)->perigeeParameters()->parameters()[
Trk::z0];
881 ATH_MSG_DEBUG(
"REGTEST / Reject track after fit with d0 = " << d0 <<
" z0= " << z0
883 }else{
884 ATH_MSG_WARNING(
"REGTEST / Reject track after fit with d0 = " << d0 <<
" z0= " << z0
886 }
888 fittedTrack = outputTracks.
erase(fittedTrack);
889 continue;
890 }
891
893
897 fittedTrack = outputTracks.
erase(fittedTrack);
898 continue;
899 }
900 }
901
902
903 float trkPt = 0.0;
905
906 if(std::abs((*fittedTrack)->perigeeParameters()->parameters()[
Trk::qOverP]) >= 1e-9){
907 trkPt = std::sin((*fittedTrack)->perigeeParameters()->parameters()[
Trk::theta])/std::abs((*fittedTrack)->perigeeParameters()->parameters()[
Trk::qOverP]);
908
911 fittedTrack = outputTracks.
erase(fittedTrack);
912 continue;
913 }
914 }
915 }
916 }
917 }
918 ++fittedTrack;
919 }
920
921 mnt_timer_TrackFitter.stop();
922
923
924
927
928 for (
auto fittedTrack = outputTracks.
begin();fittedTrack!=outputTracks.
end();++fittedTrack) {
929
936
938 if( std::find(indexDisCombTrk.begin(),indexDisCombTrk.end(),idx)!=indexDisCombTrk.end() ) {
939 ATH_MSG_VERBOSE(
"fittedTrack idx=" << idx <<
": recovers also for DisCombTrack");
940 fittedDisCombTrks.push_back(*fittedTrack);
941 }
942 }
943
946 }
947
948 if( outputTracks.
empty() ) {
950 }
951 mnt_roi_lastStageExecuted = 6;
952
953 mnt_roi_nTracks = outputTracks.
size();
954
955
956 std::vector<double> disTrk_v_xVtx;
957 std::vector<double> disTrk_v_yVtx;
958 std::vector<double> disTrk_v_zVtx;
960 mnt_timer_disTrkZVertex.start();
962 mnt_timer_disTrkZVertex.stop();
963 }
964
965
967 mnt_timer_disTrk.start();
968 ATH_CHECK(
findDisTracks(ctx,outputTracks,qualityDisFailTrks,qualityDisCombTrks,fittedDisCombTrks,disTrk_v_xVtx,disTrk_v_yVtx,disTrk_v_zVtx) );
969 mnt_timer_disTrk.stop();
970 }
971
972
973
975 if( !outputTracks.
empty() )
977
979 fillMon(outputTracks, *vertices, roi, ctx);
980
981 mnt_roi_lastStageExecuted = 7;
982
983 mnt_timer_Total.stop();
984
985 return StatusCode::SUCCESS;
986}
class TrigTrackSeedGenerator TRIG_TRACK_SEED_GENERATOR
value_type push_back(value_type pElem)
Add an element to the end of the collection.
iterator erase(iterator position)
Remove element at a given position.
bool empty() const noexcept
Returns true if the collection is empty.
void updateClusterMap(long int, const Trk::Track *, std::map< Identifier, std::vector< long int > > &) const
ToolHandle< ITrigSpacePointConversionTool > m_spacePointTool
void filterSharedDisTracks(std::vector< std::tuple< bool, double, Trk::Track * > > &) const
ToolHandle< ITrigInDetTrackSeedingTool > m_seedingTool
Gaudi::Property< bool > m_useTracklets
Gaudi::Property< bool > m_doCloneRemoval
void fillMon(const TrackCollection &tracks, const TrigVertexCollection &vertices, const TrigRoiDescriptor &roi, const EventContext &ctx) const
void extractClusterIds(const Trk::SpacePoint *, std::vector< Identifier > &) const
Gaudi::Property< bool > m_doTrackRefit
double trackQuality(const Trk::Track *Tr) const
double disTrackQuality(const Trk::Track *) const
void recoVertexForDisTrack(const EventContext &, TrackCollection &, std::vector< double > &, std::vector< double > &, std::vector< double > &) const
StatusCode finddEdxTrk(const EventContext &, const TrackCollection &) const
void filterSharedTracks(std::vector< std::tuple< bool, double, Trk::Track * > > &QT) const
StatusCode createEmptyUTTEDMs(const EventContext &) const
StatusCode findDisTracks(const EventContext &, TrackCollection &, std::vector< std::tuple< bool, double, Trk::Track * > > &, std::vector< std::tuple< bool, double, Trk::Track * > > &, TrackCollection &, const std::vector< double > &, const std::vector< double > &, const std::vector< double > &) const
bool usedByAnyTrack(const std::vector< Identifier > &, std::map< Identifier, std::vector< long int > > &) const
void makeSeedsOnGPU(const TrigCombinatorialSettings &, const IRoiDescriptor *, const std::vector< TrigSiSpacePointBase > &, std::vector< TrigInDetTriplet > &) const
bool isCleaningPassDisTrack(const TrigInDetTriplet &, Trk::Track *, bool) const
@ FastTrackFinderSeed
for tracks seeded by the FastTrackFinder
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts