377 {
378
379 if(vectorTrk.empty())
380 {
382 return nullptr;
383 }
384
385 if(vectorNeut.empty())
386 {
388 }
389
390
391
392
393
394 std::vector<const Trk::TrackParameters*> measuredPerigees;
395 std::vector<const xAOD::TrackParticle*> trkToFit;
396
397 for(std::vector<const xAOD::TrackParticle*>::const_iterator i = vectorTrk.begin(); i!= vectorTrk.end();++i)
398 {
399
400 bool foundDuplicate(false);
401 for (std::vector<const xAOD::TrackParticle*>::const_iterator j = vectorTrk.begin(); j!= i; ++j) {
402 if (*i == *j) {
403 ATH_MSG_WARNING(
"Duplicate track given as input to the fitter. Ignored." );
404 foundDuplicate = true;
405 break;
406 }
407 }
408 if (foundDuplicate) continue;
409
411
412 if(tmpMeasPer!=nullptr) {
413 trkToFit.push_back(*i);
414 measuredPerigees.push_back(tmpMeasPer);
415 } else {
416 ATH_MSG_INFO(
"Failed to dynamic_cast this track parameters to perigee" );
417 }
418 }
419
420
421 std::vector<const Trk::NeutralParameters*> measuredNeutralPerigees;
422 std::vector<const xAOD::NeutralParticle*> neutToFit;
423 for(std::vector<const xAOD::NeutralParticle*>::const_iterator i = vectorNeut.begin(); i!= vectorNeut.end();++i)
424 {
425
426 bool foundDuplicate(false);
427 for (std::vector<const xAOD::NeutralParticle*>::const_iterator j = vectorNeut.begin(); j!= i; ++j) {
428 if (*i == *j) {
429 ATH_MSG_WARNING(
"Duplicate neutral given as input to the fitter. Ignored." );
430 foundDuplicate = true;
431 break;
432 }
433 }
434 if (foundDuplicate) continue;
435
437
438 if(tmpMeasPer!=nullptr) {
439 neutToFit.push_back(*i);
440 measuredNeutralPerigees.push_back(tmpMeasPer);
441 } else {
442 ATH_MSG_INFO(
"Failed to dynamic_cast this neutral parameters to perigee" );
443 }
444 }
445
446
447 std::unique_ptr<xAOD::Vertex> fittedVertex =
fit( ctx, measuredPerigees, measuredNeutralPerigees, constraint );
448
449
450
451 if(fittedVertex ==nullptr)
452 {
453 return fittedVertex;
454 }
455
456 if( fittedVertex->vxTrackAtVertexAvailable() )
457 {
458 if(!fittedVertex->vxTrackAtVertex().empty())
459 {
460 for(
unsigned int i = 0;
i <trkToFit.size(); ++
i)
461 {
462
463 LinkToXAODTrackParticle* linkTT= new LinkToXAODTrackParticle();
465 if( cont )
466 {
467 if( ! linkTT->toIndexedElement( *cont, trkToFit[ i ]->index(), ctx ) )
468 {
470 }
471 } else{
473 }
474
475
476
477 ( fittedVertex->vxTrackAtVertex() )[
i].setOrigTrack(linkTT);
478 }
479
480 for(
unsigned int i = 0;
i <neutToFit.size(); ++
i)
481 {
482 LinkToXAODNeutralParticle* linkTT = new LinkToXAODNeutralParticle();
484 if( cont )
485 {
486 if( ! linkTT->toIndexedElement( *cont, neutToFit[ i ]->index(), ctx ) )
487 {
489 }
490 } else{
492 }
493
494
495 ( fittedVertex->vxTrackAtVertex() )[trkToFit.size()+
i].setOrigTrack(linkTT);
496 }
497
498 }
499 }
500
501
502
503 unsigned int VTAVsize = (fittedVertex && fittedVertex->vxTrackAtVertexAvailable()) ? fittedVertex->vxTrackAtVertex().size() : 0 ;
504 for (
unsigned int i = 0 ;
i < VTAVsize ; ++
i)
505 {
506 Trk::VxTrackAtVertex* VTAV = &( fittedVertex->vxTrackAtVertex().
at(i) );
507
508 if (not VTAV){
509 ATH_MSG_WARNING(
"Trying to set link to xAOD::TrackParticle. The VxTrackAtVertex is not found" );
510 continue;
511 }
512
513 Trk::ITrackLink* trklink = VTAV->trackOrParticleLink();
514
515
516 Trk::LinkToXAODTrackParticle* linkToXAODTP = dynamic_cast<Trk::LinkToXAODTrackParticle*>(trklink);
517 if (linkToXAODTP)
518 {
519
520
521 fittedVertex->addTrackAtVertex(*linkToXAODTP, VTAV->weight());
522
523 } else {
524
525
526 Trk::LinkToXAODNeutralParticle* linkToXAODTPneutral = dynamic_cast<Trk::LinkToXAODNeutralParticle*>(trklink);
527 if (!linkToXAODTPneutral) {
528 ATH_MSG_WARNING(
"Skipping track. Trying to set link to something else than xAOD::TrackParticle or xAOD::NeutralParticle." );
529 } else {
530
531 fittedVertex->addNeutralAtVertex(*linkToXAODTPneutral, VTAV->weight());
532 }
533
534 }
535 }
536
537 return fittedVertex;
538
539 }
#define ATH_MSG_WARNING(x,...)
mapped_type at(key_type key) const
Look up an element in the map.
NeutralParticleContainer_v1 NeutralParticleContainer
Definition of the current "NeutralParticle container version".
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".