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
438 {
440
441 auto mnt_roi_nTracks = Monitored::Scalar<int>("roi_nTracks", 0);
442 std::vector<int> vec_seedSize;
444 auto mnt_roi_nSPs = Monitored::Scalar<int>("roi_nSPs", 0);
445 auto mnt_roi_nSPsPIX = Monitored::Scalar<int>("roi_nSPsPIX", 0);
446 auto mnt_roi_nSPsSCT = Monitored::Scalar<int>("roi_nSPsSCT", 0);
447 auto monSP = Monitored::Group(
m_monTool, mnt_roi_nSPsPIX, mnt_roi_nSPsSCT, mnt_seedSize);
448
449 auto mnt_timer_Total = Monitored::Timer<std::chrono::milliseconds>("TIME_Total");
450 auto mnt_timer_SpacePointConversion = Monitored::Timer<std::chrono::milliseconds>("TIME_SpacePointConversion");
451 auto mnt_timer_PatternReco = Monitored::Timer<std::chrono::milliseconds>("TIME_PattReco");
452 auto mnt_timer_TripletMaking = Monitored::Timer<std::chrono::milliseconds>("TIME_Triplets");
453 auto mnt_timer_CombTracking = Monitored::Timer<std::chrono::milliseconds>("TIME_CmbTrack");
454 auto mnt_timer_TrackFitter = Monitored::Timer<std::chrono::milliseconds>("TIME_TrackFitter");
455 auto mnt_timer_dEdxTrk = Monitored::Timer<std::chrono::milliseconds>("TIME_dEdxTrk");
456 auto mnt_timer_disTrkZVertex = Monitored::Timer<std::chrono::milliseconds>("TIME_disTrkZVertex");
457 auto mnt_timer_disTrk = Monitored::Timer<std::chrono::milliseconds>("TIME_disappearingTrack");
458 auto monTime = Monitored::Group(
m_monTool, mnt_roi_nTracks, mnt_roi_nSPs, mnt_timer_Total, mnt_timer_SpacePointConversion,
459 mnt_timer_PatternReco, mnt_timer_TripletMaking, mnt_timer_CombTracking, mnt_timer_TrackFitter,
460 mnt_timer_dEdxTrk, mnt_timer_disTrkZVertex, mnt_timer_disTrk);
461
462 auto mnt_roi_lastStageExecuted = Monitored::Scalar<int>("roi_lastStageExecuted", 0);
463 auto monDataError = Monitored::Group(
m_monTool, mnt_roi_lastStageExecuted);
464
465 mnt_timer_Total.start();
466 mnt_timer_SpacePointConversion.start();
467
468
469 mnt_roi_lastStageExecuted = 1;
470
471 std::vector<TrigSiSpacePointBase> convertedSpacePoints;
472
473 convertedSpacePoints.reserve(5000);
474
475 std::map<Identifier, std::vector<long int> > siClusterMap;
476
478
480
482 ATH_MSG_DEBUG(
"LRT Mode: Got input track collection with "<<inputTracks->
size()<<
"tracks");
483 long int trackIndex=0;
484 for (auto t:*inputTracks) {
486 }
487 }
488 ATH_CHECK(
m_spacePointTool->getSpacePoints(roi, convertedSpacePoints, mnt_roi_nSPsPIX, mnt_roi_nSPsSCT, ctx, &siClusterMap));
489 }
490 else {
492 }
493
494 }
495
496 mnt_timer_SpacePointConversion.stop();
497 mnt_roi_nSPs = mnt_roi_nSPsPIX + mnt_roi_nSPsSCT;
498
500
502 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPs <<
" space points.");
503 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsPIX <<
" Pixel space points.");
504 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsSCT <<
" SCT space points.");
505 ATH_MSG_DEBUG(
"REGTEST / converted space points size = " << convertedSpacePoints.size());
507 }
508 else {
509 ATH_MSG_DEBUG(
"No tracks found - too few hits in ROI to run " << mnt_roi_nSPs);
511 return StatusCode::SUCCESS;
512 }
513 }
514
515 mnt_roi_lastStageExecuted = 2;
516
518 std::unique_ptr<TrigRoiDescriptor> tmpRoi = std::make_unique<TrigRoiDescriptor>(roi);
519
520 auto vertices = std::make_unique<TrigVertexCollection>();
521 std::vector<float> vZv;
522
524 auto mnt_timer_ZFinder = Monitored::Timer<std::chrono::milliseconds>("TIME_ZFinder");
525 auto monTimeZFinder = Monitored::Group(
m_monTool, mnt_timer_ZFinder);
526 mnt_timer_ZFinder.start();
527
529 tmpRoi = std::make_unique<TrigRoiDescriptor>(true);
530 tmpRoi->setComposite(true);
531
532 vertices = std::make_unique<TrigVertexCollection>(*
m_trigZFinder->findZ( convertedSpacePoints, roi));
533
535
536
538 vZv.reserve(vertices->size());
539 for (const auto vertex : *vertices) {
542 float zMinus =
z - 7.0;
543 float zPlus =
z + 7.0;
546 tmpRoi->push_back(newRoi);
548 }
549
551 }
552
553 mnt_timer_ZFinder.stop();
554
561 return StatusCode::SUCCESS;
562 }
563 }
564
565
566 mnt_roi_lastStageExecuted = 3;
567
568 mnt_timer_PatternReco.start();
569
570 mnt_timer_TripletMaking.start();
571
572 std::vector<TrigInDetTriplet> triplets;
573
574 std::vector<TrigInDetTracklet> new_tracklets;
575
577
579
580 TrigInDetTrackSeedingResult seed_result =
m_seedingTool->findSeeds(roi, new_tracklets, ctx);
581
584 mnt_roi_nSPs = mnt_roi_nSPsPIX + mnt_roi_nSPsSCT;
585
587 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPs <<
" space points.");
588 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsPIX <<
" Pixel space points.");
589 ATH_MSG_DEBUG(
"REGTEST / Found " << mnt_roi_nSPsSCT <<
" SCT space points.");
591 }
592 else {
593 ATH_MSG_DEBUG(
"No tracks found - too few hits in ROI to run " << mnt_roi_nSPs);
595 return StatusCode::SUCCESS;
596 }
597
598 } else {
600
601 seedGen.loadSpacePoints(convertedSpacePoints);
602
604 seedGen.createSeeds(tmpRoi.get(), vZv);
605 }
606 else {
607 seedGen.createSeeds(tmpRoi.get());
608 }
609
610 seedGen.getSeeds(triplets);
611 }
612 }
613 else {
614
617
618
619 }
620
621 unsigned int nTrackSeeds =
m_useTracklets ? new_tracklets.size() : triplets.size();
622
624
625 mnt_timer_TripletMaking.stop();
626 mnt_roi_lastStageExecuted = 4;
627
628 mnt_timer_CombTracking.start();
629
630
631
632 std::vector<std::tuple<bool, double,Trk::Track*>> qualityTracks;
633 qualityTracks.reserve(nTrackSeeds);
634
635 auto mnt_roi_nSeeds = Monitored::Scalar<int>("roi_nSeeds", 0);
636 auto monTrk_seed = Monitored::Group(
m_monTool, mnt_roi_nSeeds);
637
638 long int trackIndex=0;
639
640 bool PIX = true;
642
643 m_trackMaker->newTrigEvent(ctx, trackEventData, PIX, SCT);
644 if(
m_doDisappearingTrk ) trackEventData.combinatorialData().setFlagToReturnFailedTrack(
true);
645
646 std::vector<Trk::Track*> disFailTrks;
647 std::vector<Trk::Track*> disCombTrks;
648 std::vector<std::tuple<bool, double, Trk::Track*>> qualityDisFailTrks;
649 std::vector<std::tuple<bool, double, Trk::Track*>> qualityDisCombTrks;
650 int disTrk_n_disCombTrks=0;
651 int disTrk_n_disCombTrks_cleaning=0;
652 int disTrk_n_disFailTrks=0;
653 int disTrk_n_disFailTrks_cleaning=0;
654
655
656
657 for(unsigned int seedIdx=0;seedIdx!=nTrackSeeds;seedIdx++) {
658
659 std::vector<const Trk::SpacePoint*> spVec;
660
662 spVec = new_tracklets[seedIdx].seed();
663 }
664 else {
665
666 const TrigInDetTriplet &
seed = triplets[seedIdx];
667 const Trk::SpacePoint* osp1 =
seed.s1().offlineSpacePoint();
668 const Trk::SpacePoint* osp2 =
seed.s2().offlineSpacePoint();
669 const Trk::SpacePoint* osp3 =
seed.s3().offlineSpacePoint();
670
671 spVec = {osp1, osp2, osp3};
672 }
673
674 vec_seedSize.push_back(spVec.size());
675
677
678 std::vector<Identifier> clusterIds;
683 continue;
684 }
685 }
686 ++mnt_roi_nSeeds;
687
688 std::list<Trk::Track*> tracks;
689 std::list<Trk::Track*> tracksFail;
690 std::list<Trk::Track*> tracksAll =
m_trackMaker->getTracks(ctx, trackEventData, spVec);
691 auto resultCode = trackEventData.combinatorialData().resultCode();
693 tracks = tracksAll;
694 }
695 else {
696 tracksFail = tracksAll;
697 }
698
700 ATH_MSG_VERBOSE(
"size of tracks=" << tracks.size() <<
", tracksFail=" << tracksFail.size() <<
": resultCode=" << resultCode);
701 const TrigInDetTriplet &
seed = triplets[seedIdx];
702 for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
703 if( ! (*t) ) continue;
705 disTrk_n_disCombTrks++;
708 disTrk_n_disCombTrks_cleaning++;
709 disCombTrks.push_back((*t));
710 qualityDisCombTrks.emplace_back(std::make_tuple(
true, -
disTrackQuality((*t)), (*t)));
711 }
712 }
713 for(std::list<Trk::Track*>::const_iterator t=tracksFail.begin(); t!=tracksFail.end(); ++t) {
714 if( ! (*t) ) continue;
716 disTrk_n_disFailTrks++;
719 disTrk_n_disFailTrks_cleaning++;
720 disFailTrks.push_back((*t));
721 qualityDisFailTrks.emplace_back(std::make_tuple(
true, -
disTrackQuality((*t)), (*t)));
722 }
723 else {
724 delete(*t);
725 }
726 }
727 }
728
729 for(std::list<Trk::Track*>::const_iterator t=tracks.begin(); t!=tracks.end(); ++t) {
730 if((*t)) {
731 float d0 = (*t)->perigeeParameters()==0 ? 10000.0 : (*t)->perigeeParameters()->parameters()[
Trk::d0];
734 qualityTracks.push_back(std::make_tuple(false,0,(*t)));
735 continue;
736 }
738
740 }
742 qualityTracks.push_back(std::make_tuple(
true, -
trackQuality((*t)), (*t)));
743 }
744 else {
745 qualityTracks.push_back(std::make_tuple(true, 0, (*t)));
746 }
747 }
748 }
750 }
751
753 ATH_MSG_DEBUG(
"===> nr of disFailTrks=" << disTrk_n_disFailTrks <<
" -> cleaning pass=" << disTrk_n_disFailTrks_cleaning);
754 ATH_MSG_DEBUG(
"===> nr of disCombTrks=" << disTrk_n_disCombTrks <<
" -> cleaning pass=" << disTrk_n_disCombTrks_cleaning);
755 }
756
758
759
762 }
763
764
768 }
769
771 initialTracks.
reserve(qualityTracks.size());
772
774
775
777 std::vector<unsigned int> indexDisCombTrk;
778 for(const auto& q : qualityTracks) {
779 bool needed_for_disCombTrk = false;
781 Trk::Track* trk_q = std::get<2>(q);
782 for(const auto& qdis : qualityDisCombTrks ) {
783 if( std::get<2>(qdis) == trk_q ) {
784 needed_for_disCombTrk = std::get<0>(qdis);
785 break;
786 }
787 }
788 if( needed_for_disCombTrk)
ATH_MSG_VERBOSE(
"idx=" << idx <<
" ===> neded for disCombTrk");
789 }
790 if (std::get<0>(q)==true) {
793 }
794 else {
796 delete std::get<2>(q);
797 }
798 else {
799 if( needed_for_disCombTrk ) {
801 extraDisCombTracks.
push_back(std::get<2>(q));
802 }
803 else {
804 delete std::get<2>(q);
805 }
806 }
807 }
809 }
810 qualityTracks.clear();
811
813
814
815 mnt_timer_CombTracking.stop();
816 mnt_timer_PatternReco.stop();
817
818 mnt_roi_lastStageExecuted = 5;
819
820 mnt_timer_TrackFitter.start();
821
823
826 }
827 else {
828 outputTracks = std::move(initialTracks);
829 }
830 }
831 else {
833
835
836
837 mnt_timer_dEdxTrk.start();
840
841 }
842
844
845 if( outputTracks.
empty() ) {
847 }
848
849
850 bool do_recoverDisCombTrk = true;
852 ATH_MSG_DEBUG(
"part of initialTracks fails in fitting. do not try to recover DisCombTracks");
853 do_recoverDisCombTrk = false;
854 }
855
857 fittedExtraDisCombTracks.
reserve(extraDisCombTracks.
size());
861 if( extraDisCombTracks.
size() > 0 ) {
864 for (
auto fittedTrack = fittedExtraDisCombTracks.
begin(); fittedTrack!=fittedExtraDisCombTracks.
end(); ++fittedTrack) {
867 fittedDisCombTrks.push_back(*fittedTrack);
868 }
869 }
870 }
871
872
873
874 for (
auto fittedTrack = outputTracks.
begin(); fittedTrack!=outputTracks.
end(); ) {
875 if ((*fittedTrack)->perigeeParameters()) {
876 float d0 = (*fittedTrack)->perigeeParameters()->parameters()[
Trk::d0];
877 float z0 = (*fittedTrack)->perigeeParameters()->parameters()[
Trk::z0];
880 ATH_MSG_DEBUG(
"REGTEST / Reject track after fit with d0 = " << d0 <<
" z0= " << z0
882 }else{
883 ATH_MSG_WARNING(
"REGTEST / Reject track after fit with d0 = " << d0 <<
" z0= " << z0
885 }
887 fittedTrack = outputTracks.
erase(fittedTrack);
888 continue;
889 }
890
892
896 fittedTrack = outputTracks.
erase(fittedTrack);
897 continue;
898 }
899 }
900
901
902 float trkPt = 0.0;
904
905 if(std::abs((*fittedTrack)->perigeeParameters()->parameters()[
Trk::qOverP]) >= 1e-9){
906 trkPt = std::sin((*fittedTrack)->perigeeParameters()->parameters()[
Trk::theta])/std::abs((*fittedTrack)->perigeeParameters()->parameters()[
Trk::qOverP]);
907
910 fittedTrack = outputTracks.
erase(fittedTrack);
911 continue;
912 }
913 }
914 }
915 }
916 }
917 ++fittedTrack;
918 }
919
920 mnt_timer_TrackFitter.stop();
921
922
923
926
927 for (
auto fittedTrack = outputTracks.
begin();fittedTrack!=outputTracks.
end();++fittedTrack) {
928
935
937 if( std::find(indexDisCombTrk.begin(),indexDisCombTrk.end(),idx)!=indexDisCombTrk.end() ) {
938 ATH_MSG_VERBOSE(
"fittedTrack idx=" << idx <<
": recovers also for DisCombTrack");
939 fittedDisCombTrks.push_back(*fittedTrack);
940 }
941 }
942
945 }
946
947 if( outputTracks.
empty() ) {
949 }
950 mnt_roi_lastStageExecuted = 6;
951
952 mnt_roi_nTracks = outputTracks.
size();
953
954
955 std::vector<double> disTrk_v_xVtx;
956 std::vector<double> disTrk_v_yVtx;
957 std::vector<double> disTrk_v_zVtx;
959 mnt_timer_disTrkZVertex.start();
961 mnt_timer_disTrkZVertex.stop();
962 }
963
964
966 mnt_timer_disTrk.start();
967 ATH_CHECK(
findDisTracks(ctx,outputTracks,qualityDisFailTrks,qualityDisCombTrks,fittedDisCombTrks,disTrk_v_xVtx,disTrk_v_yVtx,disTrk_v_zVtx) );
968 mnt_timer_disTrk.stop();
969 }
970
971
972
974 if( !outputTracks.
empty() )
976
978 fillMon(outputTracks, *vertices, roi, ctx);
979
980 mnt_roi_lastStageExecuted = 7;
981
982 mnt_timer_Total.stop();
983
984 return StatusCode::SUCCESS;
985}
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
ServiceHandle< ITrigInDetAccelerationSvc > m_accelSvc
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