177{
178
179
180
181
182 std::vector<Trk::ITrackLink*> origTracks=trackVector;
183 std::vector<Trk::ITrackLink*> seedTracks=trackVector;
184
185
186
187
188
191 theVertexContainer->setStore( theVertexAuxContainer );
192 const auto invalidResponse = std::make_pair(theVertexContainer, theVertexAuxContainer);
193
194
196 ATH_MSG_WARNING( trackVector.size() <<
" tracks - exceeds maximum (" <<
m_maxTracks <<
"), skipping vertexing and returning only dummy..." );
197 return std::make_pair(theVertexContainer, theVertexAuxContainer);
198 }
199
201 unsigned int seedtracknumber=seedTracks.size();
202
203
205
206
207 std::vector<Trk::ITrackLink*>::iterator seedBegin;
208 std::vector<Trk::ITrackLink*>::iterator seedEnd;
209
210
211
212#ifdef MONITORTUNES
213
219
227
230 SG::AuxElement::Decorator<float> mDecor_direction( "MomentaDirection" ) ;
231 SG::AuxElement::Decorator< float > mDecor_HitsFilter( "radiiPattern" );
232 SG::AuxElement::Decorator< int > mDecor_NumTrk( "NumTrkAtVtx" );
233#endif
234
235 SG::AuxElement::Decorator<float> mDecor_sumPt2( "sumPt2" );
236 SG::AuxElement::Decorator<float> mDecor_mass( "mass" );
237 SG::AuxElement::Decorator<float> mDecor_energy( "ee" );
238 SG::AuxElement::Decorator<int> mDecor_nrobbed( "nrobbed" );
239 SG::AuxElement::Decorator<int> mDecor_intrk( "NumInputTrk" );
240
241 do
242 {
243 seedBegin=seedTracks.begin();
244 seedEnd=seedTracks.end();
245
246 if (seedtracknumber ==0)
247 {
248 ATH_MSG_DEBUG(
" New iteration. No tracks available after track selection for seeding. No finding done." );
249 break;
250 }
251
254
255
256
257 std::vector<const Trk::TrackParameters*> perigeeList;
258 for (std::vector<Trk::ITrackLink*>::iterator seedtrkAtVtxIter=seedBegin;
259 seedtrkAtVtxIter!=seedEnd;++seedtrkAtVtxIter) {
260 perigeeList.push_back( (*seedtrkAtVtxIter)->parameters() );
261 }
262
263 int ncandi = 0 ;
265
266
268
269 std::unique_ptr<Trk::IMode3dInfo>
info;
271 info, perigeeList);
272
274
275#ifdef MONITORTUNES
276 std::vector<float> FsmwX, FsmwY, FsmwZ, wght ;
277
278
279 double cXY = -9.9, cZ = -9.9 ;
280 info->getCorrelationDistance( cXY, cZ ) ;
281
286
287 m_seedX->push_back( seedVertex.x() ) ;
288 m_seedY->push_back( seedVertex.y() ) ;
289 m_seedZ->push_back( seedVertex.z() ) ;
292#endif
293
294
295
297 looseConstraintCovariance.setIdentity();
298 looseConstraintCovariance = looseConstraintCovariance * 1
e+8;
303
304
305
307 " at y: " << seedVertex.y() <<
308 " at z: " << seedVertex.z() );
309
310
311 if ( seedVertex.z()==0. ) {
312
313 ATH_MSG_DEBUG(
"No seed found: no further vertices in event" );
314 ATH_MSG_DEBUG(
"Number of input tracks: " << perigeeList.size() <<
" but no seed returned." );
315
316
317#ifdef MONITORTUNES
319#endif
320
321 break;
322 }
323
324#ifdef MONITORTUNES
327#endif
328
329
330 std::vector<const Trk::TrackParameters*> perigeesToFit;
331 std::vector<const Trk::TrackParameters*> perigeesToFitSplitVertex;
332
333 int numberOfTracks( perigeeList.size() );
334
335 std::vector<const Trk::TrackParameters*>::const_iterator perigeeListBegin=perigeeList.begin();
336 std::vector<const Trk::TrackParameters*>::const_iterator perigeeListEnd=perigeeList.end();
337
339 for (std::vector<const Trk::TrackParameters*>::const_iterator perigeeListIter=perigeeListBegin;
340 perigeeListIter!=perigeeListEnd;++perigeeListIter)
341 {
342
343 if (numberOfTracks<=2)
344 {
345 perigeesToFit.push_back(*perigeeListIter);
347 }
349 {
350 perigeesToFit.push_back(*perigeeListIter);
352 }
354 {
355
357 {
358 perigeesToFit.push_back(*perigeeListIter);
360 }
361 else
362 {
363 perigeesToFitSplitVertex.push_back(*perigeeListIter);
365 }
366 }
367 else
368 {
369
371 try
372 {
373 std::unique_ptr<Trk::PlaneSurface> mySurface=
m_ImpactPoint3dEstimator->Estimate3dIP(*perigeeListIter,&seedVertex,distance);
375 }
376 catch (error::ImpactPoint3dEstimatorProblem err)
377 {
378 ATH_MSG_WARNING(
" ImpactPoint3dEstimator failed to find minimum distance between track and vertex seed: " <<
err.p );
379 }
380
381 if (distance<0)
382 {
383 ATH_MSG_WARNING(
" Distance between track and seed vtx is negative: " << distance );
384 }
385
387
388
389 double doe = 99999999.9 ;
391
392 if( myPerigee && myPerigee->covariance() )
393 {
396 }
397
398 if (error==0.)
399 {
402 }
404
405
406 ATH_MSG_VERBOSE(
" Distance between track and seed vtx: " << distance <<
" d/s(d) = " <<
407 distance/error << " err " << error );
408
409
411 {
413 {
414 perigeesToFit.push_back(*perigeeListIter);
416 }
417 else
418 {
419 perigeesToFitSplitVertex.push_back(*perigeeListIter);
421 }
422 }
423
424 }
425 }
426
427
428
429
430 ATH_MSG_VERBOSE(
" Considering n. " << perigeesToFit.size() <<
" tracks for the fit. " );
432 {
433 ATH_MSG_VERBOSE(
" and n. " << perigeesToFitSplitVertex.size() <<
" tracks for split vertex fit. " );
434 }
435
436
443
444 if (perigeesToFit.empty())
445 {
446
447 ATH_MSG_DEBUG(
" No good seed found. Exiting search for vertices..." );
448
449#ifdef MONITORTUNES
451 theVertexContainer->
push_back( seededxAODVertex );
452
455 dummyCovariance.setIdentity();
457 seededxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
460
461 mDecor_mass( *seededxAODVertex ) =
m_v0mass ;
462 mDecor_energy( *seededxAODVertex ) =
m_v0ee ;
463 mDecor_NumTrk( *seededxAODVertex ) =
m_ntracks ;
464 mDecor_HitsFilter( *seededxAODVertex ) =
m_hif ;
465 mDecor_direction( *seededxAODVertex ) =
m_dir ;
466 mDecor_intrk( *seededxAODVertex ) = numberOfTracks ;
467#endif
468
469 break;
470 }
471
472
473
474
475
476
477
479
480
481 if ( perigeesToFit.size()>1)
482 {
484 }
485
486
487
488
489
491
493
494 bool goodVertex = myxAODVertex !=
nullptr &&
m_ndf >0 &&
m_ntracks >=2 ;
495
496
497 ATH_MSG_DEBUG(
" xAOD::Vertex : " << ( myxAODVertex !=
nullptr ? 1 : 0 )
498 <<
", #dof = " <<
m_ndf <<
", #tracks (weight>0.01) = " <<
m_ntracks );
499
500
501
502 if (!goodVertex)
503 {
504
505 ATH_MSG_DEBUG(
" Going to new iteration with: " << seedTracks.size() <<
" seed tracks after BAD VERTEX. " );
506
507
508 if (myxAODVertex)
509 {
510
512#ifdef MONITORTUNES
514 theVertexContainer->
push_back( myxAODVertex );
515 mDecor_mass( *myxAODVertex ) =
m_v0mass ;
516 mDecor_energy( *myxAODVertex ) =
m_v0ee ;
517 mDecor_NumTrk( *myxAODVertex ) =
m_ntracks ;
518 mDecor_HitsFilter( *myxAODVertex ) =
m_hif ;
519 mDecor_direction( *myxAODVertex ) =
m_dir ;
520 mDecor_intrk( *myxAODVertex ) = numberOfTracks ;
521#else
522 delete myxAODVertex;
523 myxAODVertex=0;
524#endif
525 }
526 else
527 {
529#ifdef MONITORTUNES
531 theVertexContainer->
push_back( seededxAODVertex );
532
535 dummyCovariance.setIdentity();
537 seededxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
540
541 mDecor_mass( *seededxAODVertex ) =
m_v0mass ;
542 mDecor_energy( *seededxAODVertex ) =
m_v0ee ;
543 mDecor_NumTrk( *seededxAODVertex ) =
m_ntracks ;
544 mDecor_HitsFilter( *seededxAODVertex ) =
m_hif ;
545 mDecor_direction( *seededxAODVertex ) =
m_dir ;
546 mDecor_intrk( *seededxAODVertex ) = numberOfTracks ;
547#endif
548 }
549
550 continue ;
551
552 }
553
554
555
556 mDecor_nrobbed( *myxAODVertex ) = 0 ;
558 {
559
560
561 ATH_MSG_VERBOSE(
" N tracks used for fit before reallocating: " << perigeesToFit.size() );
562
563
564
565
566 int numberOfAddedTracks=0;
567 const AmgSymMatrix(3) covariance = (&(*myxAODVertex))->covariancePosition() ;
568 const Amg::
Vector3D position = (&(*myxAODVertex))->position() ;
569
570
571
574
575 for (xAOD::
VertexContainer::iterator vxIter=vxBegin;vxIter!=vxEnd;++vxIter)
576 {
577
578#ifdef MONITORTUNES
580#endif
581 std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx=(&(*vxIter)->vxTrackAtVertex());
582
583 if ( ! myVxTracksAtVtx )
continue;
584
585 int nrobbed = 0 ;
586
587 const AmgSymMatrix(3) oldcovariance = (*vxIter)->covariancePosition() ;
588 const Amg::
Vector3D oldposition = (*vxIter)->position() ;
589
590
591 std::vector<Trk::VxTrackAtVertex>::const_iterator tracksBegin=myVxTracksAtVtx->begin();
592 std::vector<Trk::VxTrackAtVertex>::const_iterator tracksEnd=myVxTracksAtVtx->end();
593
594
595 ATH_MSG_VERBOSE(
" Iterating over new vertex to look for tracks to reallocate... " );
596
597
598 for (std::vector<Trk::VxTrackAtVertex>::const_iterator tracksIter=tracksBegin;
599 tracksIter!=tracksEnd;)
600 {
601
602
604 {
605 ++tracksIter;
606 continue;
607 }
608
610
611 if (trackPerigee==
nullptr)
612 {
613 ATH_MSG_ERROR(
" Cast to perigee gives 0 pointer, cannot continue " );
614 return invalidResponse;
615;
616 }
617
618 double chi2_newvtx=
compatibility(*trackPerigee, covariance, position );
619 double chi2_oldvtx=
compatibility(*trackPerigee, oldcovariance, oldposition );
620
621 double minDist =
VrtVrtDist( myxAODVertex, *vxIter ) ;
622
623
625 " to new vtx is: " << chi2_newvtx );
626
627
629
630 if ( chi2_newvtx < chi2_oldvtx
632 )
633 {
634
635
636 ATH_MSG_DEBUG(
" Found track of old vertex (chi2= " << chi2_oldvtx <<
637 ") more compatible to new one (chi2= " << chi2_newvtx << ")" );
638
639
640 perigeesToFit.push_back(trackPerigee);
641
642
643 bool isFound=false;
644
645 std::vector<Trk::ITrackLink*>::iterator origBegin=origTracks.begin();
646 std::vector<Trk::ITrackLink*>::iterator origEnd=origTracks.end();
647
648 for (std::vector<Trk::ITrackLink*>::iterator origIter=origBegin;
649 origIter!=origEnd;++origIter)
650 {
651 if ( (*origIter)->parameters()==trackPerigee )
652 {
653
654 ATH_MSG_VERBOSE(
" found the old perigee to be re-added to seedTracks in order to be deleted again!" );
655
656 isFound=true;
657 seedTracks.push_back(*origIter);
658 break;
659 }
660 }
661
662 if (!isFound)
663 {
664 ATH_MSG_WARNING(
" Cannot find old perigee to re-add back to seed tracks... " );
665 }
666
667 numberOfAddedTracks+=1;
668
670 }
671
672 if (remove)
673 {
674
675
676 nrobbed ++ ;
677 tracksIter=myVxTracksAtVtx->erase(tracksIter);
678 tracksBegin=myVxTracksAtVtx->begin();
679 tracksEnd=myVxTracksAtVtx->end();
680 }
681 else
682 {
683 ++tracksIter;
684 }
685 }
686
687 if ( nrobbed > 0 ) mDecor_nrobbed( *(*vxIter) ) ++;
688
689 }
690
691
692 ATH_MSG_VERBOSE(
" N tracks used for fit after reallocating: " << perigeesToFit.size() );
693
694
695
696
697
698 if ( numberOfAddedTracks > 0 )
699 {
700
701 ATH_MSG_DEBUG(
" refit with additional " << numberOfAddedTracks
702 << " from other vertices " );
703
705 delete myxAODVertex;
706
707 myxAODVertex=nullptr;
708
709 if ( perigeesToFit.size()>1)
710 {
712 mDecor_nrobbed( *myxAODVertex ) = 0 ;
713 }
714
716
717 goodVertex = myxAODVertex !=
nullptr &&
m_ndf >0 &&
m_ntracks >=2 ;
718
719
720 ATH_MSG_DEBUG(
" Refitted xAODVertex is pointer: " << myxAODVertex <<
721 " #dof = " <<
m_ndf <<
" #tracks (with weight>0.01) " <<
m_ntracks );
722
723
724 if ( ! goodVertex )
725 {
726
727 if (myxAODVertex)
728 {
730#ifdef MONITORTUNES
731 theVertexContainer->
push_back(myxAODVertex);
733
734 mDecor_mass( *myxAODVertex ) =
m_v0mass ;
735 mDecor_energy( *myxAODVertex ) =
m_v0ee ;
736 mDecor_HitsFilter( *myxAODVertex ) =
m_hif ;
737 mDecor_direction( *myxAODVertex ) =
m_dir ;
738 mDecor_NumTrk( *myxAODVertex ) =
m_ntracks ;
739 mDecor_intrk( *myxAODVertex ) = numberOfTracks ;
740#else
741 delete myxAODVertex;
742 myxAODVertex=0;
743#endif
744 }
745 else
746 {
748
749 ATH_MSG_DEBUG(
" Adding tracks resulted in an invalid vertex. Should be rare... " );
750 ATH_MSG_DEBUG(
" Going to new iteration with " << seedTracks.size()
751 << " seed tracks after BAD VERTEX. " );
752
753#ifdef MONITORTUNES
754
756 theVertexContainer->
push_back( seededxAODVertex );
759 seededxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
760
763 mDecor_NumTrk( *seededxAODVertex ) =
m_ntracks ;
764 mDecor_mass( *seededxAODVertex ) =
m_v0mass ;
765 mDecor_energy( *seededxAODVertex ) =
m_v0ee ;
766 mDecor_HitsFilter( *seededxAODVertex ) =
m_hif ;
767 mDecor_direction( *seededxAODVertex ) =
m_dir ;
768 mDecor_intrk( *seededxAODVertex ) = numberOfTracks ;
769#endif
770 }
771 continue ;
772
773 }
774 }
775
776 }
777
778
779
781
783
788
789#ifdef MONITORTUNES
790 mDecor_HitsFilter( *myxAODVertex ) =
m_hif ;
791 mDecor_direction( *myxAODVertex ) =
m_dir ;
792 mDecor_NumTrk( *myxAODVertex ) =
m_ntracks ;
793#else
796 )
797 {
799 delete myxAODVertex;
800 myxAODVertex=0;
801 continue ;
802 }
803#endif
804
805
806 mDecor_mass( *myxAODVertex ) =
m_v0mass ;
807 mDecor_energy( *myxAODVertex ) =
m_v0ee ;
808 mDecor_intrk( *myxAODVertex ) = numberOfTracks ;
810
811
813#ifdef MONITORTUNES
815#else
817#endif
818 {
819
821 * groomed = * myxAODVertex ;
823
825
826#ifndef MONITORTUNES
828 {
830 delete groomed ;
831 groomed = 0 ;
832 delete myxAODVertex ;
833 myxAODVertex=0;
834 continue ;
835 }
836#endif
837
839 {
840 bool goodgroom = false ;
841 int ngroom = 0 ;
842 if ( perigeesToFit.size() >= 2 )
843 {
844 groomed = nullptr;
846
848
849 goodgroom = ( groomed !=
nullptr &&
m_ndf > 0 && ngroom >= 2 ) ;
850 }
851
852 if ( perigeesToFit.size() < 2 || ! goodgroom )
853 {
854#ifdef MONITORTUNES
855 theVertexContainer->
push_back(myxAODVertex);
856
857 if ( perigeesToFit.size() < 2 || ngroom < 1 )
859 else
861
862 mDecor_HitsFilter( *myxAODVertex ) =
m_hif ;
863 mDecor_NumTrk( *myxAODVertex ) =
m_ntracks ;
864#endif
865 if ( groomed )
866 {
867
868 delete groomed ;
869 groomed=nullptr;
870 }
871
873 continue ;
874 }
875
876
877 * myxAODVertex = * groomed ;
878
879
880 delete groomed ;
881 groomed=nullptr;
882
883 ATH_MSG_DEBUG(
" new vertex after grooming with reminded tracks : " << ngroom
885
886 isv0 = false ;
887 if ( ngroom == 2 )
889
890#ifndef MONITORTUNES
892 {
894 delete myxAODVertex;
895 myxAODVertex=0;
896 continue ;
897 }
898#endif
899 if ( isv0 )
901 else
903
904 mDecor_mass( *myxAODVertex ) =
m_v0mass ;
905 mDecor_energy( *myxAODVertex ) =
m_v0ee ;
906 mDecor_intrk( *myxAODVertex ) = numberOfTracks ;
907#ifdef MONITORTUNES
908 mDecor_HitsFilter( *myxAODVertex ) =
m_hif ;
909 mDecor_direction( *myxAODVertex ) =
m_dir ;
910 mDecor_NumTrk( *myxAODVertex ) = ngroom ;
911#endif
912
914
915 } else
916 {
918 <<
" with VxType : " << myxAODVertex->
vertexType() );
919 delete groomed ;
920 groomed = nullptr ;
921#ifdef MONITORTUNES
922 mDecor_HitsFilter( *myxAODVertex ) =
m_hif ;
923#endif
924
925 }
926
927 }
928
930
931
932
933 ATH_MSG_VERBOSE(
"Number of seeds after removal of outliers: " << seedTracks.size() );
934
935
937 {
938 theVertexContainer->
push_back(myxAODVertex);
940 }
941
942
944
946
947
948
951
952
953 std::vector<Trk::ITrackLink*>::iterator origtrkbegin=origTracks.begin();
954 std::vector<Trk::ITrackLink*>::iterator origtrkend=origTracks.end();
955
956
957
959 {
960#ifdef MONITORTUNES
962 {
963 ++vxIter ;
964 continue ;
965 }
966#endif
967 std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx = &((*vxIter)->vxTrackAtVertex());
968 if ( !myVxTracksAtVtx )
969 {
970 ++vxIter ;
971 continue ;
972 }
973
974 int nrobbed = mDecor_nrobbed (**vxIter);
975 if ( nrobbed < 1 )
976 {
977 ++vxIter ;
978 continue ;
979 }
980
981 std::vector<Trk::VxTrackAtVertex>::const_iterator tracksBegin=myVxTracksAtVtx->begin();
982 std::vector<Trk::VxTrackAtVertex>::const_iterator tracksEnd=myVxTracksAtVtx->end();
983
984 std::vector<const Trk::TrackParameters*> perigeesToFit ;
985 std::vector<Trk::ITrackLink*> nullseedTracks ;
986 int ntrk = 0 ;
987 for (std::vector<Trk::VxTrackAtVertex>::const_iterator tracksIter=tracksBegin;
988 tracksIter!=tracksEnd;++tracksIter)
989 {
990 for (std::vector<Trk::ITrackLink*>::const_iterator origtrkiter=origtrkbegin;
991 origtrkiter!=origtrkend;++origtrkiter)
992 {
993 if ((*origtrkiter)->parameters()==(*tracksIter).initialPerigee())
994 {
996 nullseedTracks.push_back( *origtrkiter ) ;
997 perigeesToFit.push_back( (*origtrkiter)->parameters() ) ;
998 }
999 }
1000 }
1001
1003 QxAODVertex =
m_iVertexFitter->fit( perigeesToFit, (*vxIter)->position() );
1004 if ( QxAODVertex == nullptr )
1005 {
1006 ++vxIter ;
1007 continue ;
1008 }
1009
1011
1012 float chi2dof1 = (*vxIter)->chiSquared()/(*vxIter)->numberDoF() ;
1014
1015 float oldhf = 0. ;
1016 if ( mDecor_HitsFilter.isAvailable (**vxIter) )
1017 oldhf = mDecor_HitsFilter (**vxIter);
1018 if ( chi2dof2 >= chi2dof1 )
1019 {
1020 ++vxIter ;
1021 continue ;
1022 }
1023
1024 int nit = mDecor_intrk (**vxIter);
1025 *(*vxIter) = *QxAODVertex ;
1026
1028 mDecor_mass( *(*vxIter) ) =
m_v0mass ;
1029 mDecor_energy( *(*vxIter) ) =
m_v0ee ;
1030 mDecor_intrk( *(*vxIter) ) = nit ;
1031
1033
1034#ifdef MONITORTUNES
1035 mDecor_HitsFilter( *(*vxIter) ) = oldhf ;
1036 mDecor_direction( *(*vxIter) ) =
m_dir ;
1037 mDecor_NumTrk( *(*vxIter) ) = ntrk ;
1038#else
1041 )
1042 {
1043 vxIter = theVertexContainer->
erase( vxIter ) ;
1044 vxBegin=theVertexContainer->
begin();
1045 vxEnd=theVertexContainer->
end();
1046 }
1047#endif
1048
1049 ++ vxIter ;
1050
1051
1052 delete QxAODVertex ;
1053 }
1054
1055
1056 int nv = 0 ;
1057
1059 {
1060
1061 ATH_MSG_DEBUG(
" filled " << nv <<
" 'th vertex : x= " << (*vxIter)->position().x() <<
" , y= "
1062 << (*vxIter)->position().y() <<" , z= " << (*vxIter)->position().z()
1063 << " vxType = " << (*vxIter)->vertexType() ) ;
1064
1065 std::vector<float> trkWght ;
1066
1067 std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx = &((*vxIter)->vxTrackAtVertex());
1068
1069 if ( ! myVxTracksAtVtx )
1070 {
1071#ifdef MONITORTUNES
1072 mDecor_trkDOE( *(*vxIter) ) = trkWght ;
1073 mDecor_trkWght( *(*vxIter) ) = trkWght ;
1074 mDecor_sumPt2( *(*vxIter) ) = -99.9 ;
1075 mDecor_nrobbed( *(*vxIter) ) = 0 ;
1076#endif
1077 continue ;
1078 }
1079
1080 float pt2 = 0.0 ;
1081 std::vector<float> xdoe ;
1082
1083 std::vector<Trk::VxTrackAtVertex>::iterator tracksBegin=myVxTracksAtVtx->begin();
1084 std::vector<Trk::VxTrackAtVertex>::iterator tracksEnd=myVxTracksAtVtx->end();
1085
1086 for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter=tracksBegin;
1087 tracksIter!=tracksEnd;++tracksIter)
1088 {
1089 bool found = false ;
1090
1091 trkWght.push_back( (*tracksIter).weight() ) ;
1092
1093
1094 for (std::vector<Trk::ITrackLink*>::iterator origtrkiter=origtrkbegin;
1095 origtrkiter!=origtrkend;++origtrkiter)
1096 {
1097
1098 if ((*origtrkiter)->parameters()==(*tracksIter).initialPerigee())
1099 {
1100
1102
1104
1105 if ( svperigee )
1106 {
1108
1111 pt2 +=
pt*
pt*0.000001 ;
1112
1113#ifdef MONITORTUNES
1115 try
1116 {
1117 std::unique_ptr<Trk::PlaneSurface> mySurface=
1119 }
1120 catch (error::ImpactPoint3dEstimatorProblem err)
1121 {
1123 }
1124
1126
1127 if( svperigee->covariance() )
1130 );
1131 xdoe.push_back( std::abs( distance/error ) ) ;
1132#endif
1133 }
1134
1135
1136 (*tracksIter).setOrigTrack (*origtrkiter );
1137
1138
1139 Trk::LinkToXAODTrackParticle* linkToXAODTP = dynamic_cast<Trk::LinkToXAODTrackParticle*>( *origtrkiter );
1140
1141
1142 if (linkToXAODTP)
1143 {
1144 (*vxIter)->addTrackAtVertex(*linkToXAODTP, (*tracksIter).weight());
1145
1146 }
1147
1148 origTracks.erase(origtrkiter);
1149 origtrkbegin=origTracks.begin();
1150 origtrkend=origTracks.end();
1151 break;
1152 }
1153 }
1154
1155 if (!found)
1156 {
1157 ATH_MSG_ERROR(
" Cannot find vector element to fix links (step 4)! " );
1158 }
1159
1160 }
1161
1162
1163
1165
1166#ifdef MONITORTUNES
1167 mDecor_trkWght( *vtx ) = trkWght ;
1168 mDecor_trkDOE( *vtx ) = xdoe ;
1169#endif
1170
1171 mDecor_sumPt2( *vtx ) = pt2 ;
1172
1173 }
1174
1175 ATH_MSG_DEBUG(
" #Vtx "<< theVertexContainer->
size() <<
" with track-vertex association fixed " );
1176
1177
1178 for (
unsigned int i = 0 ;
i < theVertexContainer->
size() ;
i++)
1179 {
1180
1182 " x= " << (*theVertexContainer)[i]->position().
x() <<
1183 " y= " << (*theVertexContainer)[i]->position().
y() <<
1184 " z= " << (*theVertexContainer)[i]->position().
z() <<
1185 " ntracks= " << (*theVertexContainer)[i]->vxTrackAtVertex().
size() <<
1186 " chi2= " << (*theVertexContainer)[i]->
chiSquared() <<
1187 " #dof = " << (*theVertexContainer)[i]->numberDoF() );
1188 }
1189
1190 for (std::vector<Trk::ITrackLink*>::iterator origtrkiter=origtrkbegin;
1191 origtrkiter!=origtrkend;++origtrkiter)
1192 {
1193 if ((*origtrkiter)!=0) {
1194 delete *origtrkiter;
1195 *origtrkiter=0;
1196 }
1197 }
1198
1199#ifdef MONITORTUNES
1201#endif
1202
1203 return std::make_pair(theVertexContainer, theVertexAuxContainer);
1204}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
value_type push_back(value_type pElem)
Add an element to the end of the collection.
DataModel_detail::iterator< DataVector > iterator
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
iterator erase(iterator position)
Remove element at a given position.
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.
SG::Decorator< T, ALLOC > Decorator
void setCovariancePosition(const AmgSymMatrix(3)&covariancePosition)
Sets the vertex covariance matrix.
void setVertexType(VxType::VertexType vType)
Set the type of the vertex.
VxType::VertexType vertexType() const
The type of the vertex.
float chiSquared() const
Returns the of the vertex fit as float.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
float chiSquared(const U &p)
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ V0Vtx
Vertex from V0 decay.
@ NotSpecified
Default value, no explicit type set.
@ SecVtx
Secondary vertex.
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
VertexAuxContainer_v1 VertexAuxContainer
Definition of the current jet auxiliary container.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".