374 {
376 assert(cascadeinfoContainer!=nullptr && cascadeinfoContainer_noConstr!=nullptr);
377
378
381
382 std::vector<const xAOD::TrackParticle*> tracksJpsi1;
383 std::vector<const xAOD::TrackParticle*> tracksJpsi2;
384 std::vector<const xAOD::TrackParticle*> tracksDiTrk1;
385 std::vector<const xAOD::TrackParticle*> tracksDiTrk2;
386 std::vector<const xAOD::TrackParticle*> tracksPsi1;
387 std::vector<const xAOD::TrackParticle*> tracksPsi2;
388 std::vector<double> massesPsi1;
393 std::vector<double> massesPsi2;
398
399
402
403
406
407
408 std::vector<const xAOD::Vertex*> selectedPsi2Candidates;
409 for(auto vxcItr=psi2Container.cptr()->cbegin(); vxcItr!=psi2Container.cptr()->cend(); ++vxcItr) {
410
415 if(flagAcc.isAvailable(*vtx) && flagAcc(*vtx)) {
417 }
418 }
420
421
422 double mass_psi2 =
m_V0Tools->invariantMass(*vxcItr, massesPsi2);
423 if (mass_psi2 < m_psi2MassLower || mass_psi2 >
m_psi2MassUpper)
continue;
424
425
426 TLorentzVector p4_mu1, p4_mu2;
427 p4_mu1.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
428 (*vxcItr)->trackParticle(0)->eta(),
430 p4_mu2.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
431 (*vxcItr)->trackParticle(1)->eta(),
433 double mass_jpsi2 = (p4_mu1 + p4_mu2).M();
434 if (mass_jpsi2 < m_jpsi2MassLower || mass_jpsi2 >
m_jpsi2MassUpper)
continue;
435
437 TLorentzVector p4_trk1, p4_trk2;
438 p4_trk1.SetPtEtaPhiM( (*vxcItr)->trackParticle(2)->pt(),
439 (*vxcItr)->trackParticle(2)->eta(),
441 p4_trk2.SetPtEtaPhiM( (*vxcItr)->trackParticle(3)->pt(),
442 (*vxcItr)->trackParticle(3)->eta(),
444 double mass_diTrk2 = (p4_trk1 + p4_trk2).M();
446 }
447
448 double chi2DOF = (*vxcItr)->chiSquared()/(*vxcItr)->numberDoF();
450
451 selectedPsi2Candidates.push_back(*vxcItr);
452 }
453 if(selectedPsi2Candidates.size()==0) return StatusCode::SUCCESS;
454
455
456 std::vector<const xAOD::Vertex*> selectedPsi1Candidates;
457 for(auto vxcItr=psi1Container.cptr()->cbegin(); vxcItr!=psi1Container.cptr()->cend(); ++vxcItr) {
458
463 if(flagAcc.isAvailable(*vtx) && flagAcc(*vtx)) {
465 }
466 }
468
469
470 double mass_psi1 =
m_V0Tools->invariantMass(*vxcItr,massesPsi1);
471 if(mass_psi1 < m_psi1MassLower || mass_psi1 >
m_psi1MassUpper)
continue;
472
473
474 TLorentzVector p4_mu1, p4_mu2;
475 p4_mu1.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
476 (*vxcItr)->trackParticle(0)->eta(),
478 p4_mu2.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
479 (*vxcItr)->trackParticle(1)->eta(),
481 double mass_jpsi1 = (p4_mu1 + p4_mu2).M();
482 if (mass_jpsi1 < m_jpsi1MassLower || mass_jpsi1 >
m_jpsi1MassUpper)
continue;
483
485 TLorentzVector p4_trk1, p4_trk2;
486 p4_trk1.SetPtEtaPhiM( (*vxcItr)->trackParticle(2)->pt(),
487 (*vxcItr)->trackParticle(2)->eta(),
489 p4_trk2.SetPtEtaPhiM( (*vxcItr)->trackParticle(3)->pt(),
490 (*vxcItr)->trackParticle(3)->eta(),
492 double mass_diTrk1 = (p4_trk1 + p4_trk2).M();
494 }
495
496 double chi2DOF = (*vxcItr)->chiSquared()/(*vxcItr)->numberDoF();
498
499 selectedPsi1Candidates.push_back(*vxcItr);
500 }
501 if(selectedPsi1Candidates.size()==0) return StatusCode::SUCCESS;
502
503 std::vector<std::pair<const xAOD::Vertex*, const xAOD::Vertex*> > candidatePairs;
504 for(auto psi1Itr=selectedPsi1Candidates.cbegin(); psi1Itr!=selectedPsi1Candidates.cend(); ++psi1Itr) {
505 tracksPsi1.clear();
506 for(
size_t i=0;
i<(*psi1Itr)->nTrackParticles();
i++) tracksPsi1.push_back((*psi1Itr)->trackParticle(i));
507 for(auto psi2Itr=selectedPsi2Candidates.cbegin(); psi2Itr!=selectedPsi2Candidates.cend(); ++psi2Itr) {
509 for(
size_t j=0;
j<(*psi2Itr)->nTrackParticles();
j++) {
510 if(std::find(tracksPsi1.cbegin(), tracksPsi1.cend(), (*psi2Itr)->trackParticle(j)) != tracksPsi1.cend()) {
skip =
true;
break; }
511 }
514 for(
size_t ic=0;
ic<candidatePairs.size();
ic++) {
517 if((psi1Vertex == *psi1Itr && psi2Vertex == *psi2Itr) || (psi1Vertex == *psi2Itr && psi2Vertex == *psi1Itr)) {
skip =
true;
break; }
518 }
519 }
521 candidatePairs.push_back(std::pair<const xAOD::Vertex*, const xAOD::Vertex*>(*psi1Itr,*psi2Itr));
522 }
523 }
524
525 std::sort( candidatePairs.begin(), candidatePairs.end(), [](std::pair<const xAOD::Vertex*, const xAOD::Vertex*>
a, std::pair<const xAOD::Vertex*, const xAOD::Vertex*> b) { return a.first->chiSquared()/a.first->numberDoF()+a.second->chiSquared()/a.second->numberDoF() < b.first->chiSquared()/b.first->numberDoF()+b.second->chiSquared()/b.second->numberDoF(); } );
527 candidatePairs.erase(candidatePairs.begin()+
m_maxCandidates, candidatePairs.end());
528 }
529
530 for(
size_t ic=0;
ic<candidatePairs.size();
ic++) {
533
534 tracksPsi1.clear();
536 if (tracksPsi1.size() != massesPsi1.size()) {
537 ATH_MSG_ERROR(
"Problems with Psi1 input: number of tracks or track mass inputs is not correct!");
538 }
539 tracksPsi2.clear();
541 if (tracksPsi2.size() != massesPsi2.size()) {
542 ATH_MSG_ERROR(
"Problems with Psi2 input: number of tracks or track mass inputs is not correct!");
543 }
544
545 tracksJpsi1.clear();
548 tracksDiTrk1.clear();
552 }
553 tracksJpsi2.clear();
556 tracksDiTrk2.clear();
560 }
561
562 TLorentzVector p4_moth;
567 }
571 }
573
574
575 std::unique_ptr<Trk::IVKalState> state =
m_iVertexFitter->makeState(ctx);
576
577 int robustness = 0;
579
580
581 std::vector<Trk::VertexID> vrtList;
582
584
587 } else {
589 }
590 vrtList.push_back(vID1);
591
595 } else {
597 }
598 vrtList.push_back(vID2);
599
600 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
601 std::vector<double> tp_masses; tp_masses.clear();
604 std::vector<Trk::VertexID> cnstV; cnstV.clear();
607 }
608 }
610 std::vector<Trk::VertexID> cnstV; cnstV.clear();
613 }
614 }
616 std::vector<Trk::VertexID> cnstV; cnstV.clear();
619 }
620 }
622 std::vector<Trk::VertexID> cnstV; cnstV.clear();
625 }
626 }
627
629
630 bool pass = false;
631 if (result != nullptr) {
632 for(
auto v :
result->vertices()) {
633 if(
v->nTrackParticles()==0) {
634 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
635 v->setTrackParticleLinks(nullLinkVector);
636 }
637 }
638
640
641
642 result->setSVOwnership(
true);
643
644
647
648 if(chi2CutPassed) {
649 cascadeinfoContainer->push_back(
result.release());
650 pass = true;
651 }
652 }
653
654
655 if(pass) {
657 std::unique_ptr<Trk::IVKalState> state (
m_iVertexFitter->makeState(ctx));
659 std::vector<Trk::VertexID> vrtList_nc;
660
662 vrtList_nc.push_back(vID1_nc);
663
665 vrtList_nc.push_back(vID2_nc);
666
667 std::vector<const xAOD::TrackParticle*> tp; tp.clear();
668 std::vector<double> tp_masses; tp_masses.clear();
670
671 std::unique_ptr<Trk::VxCascadeInfo> result_nc(
m_iVertexFitter->fitCascade(*state));
672
673 if (result_nc != nullptr) {
674 for(auto v : result_nc->vertices()) {
675 if(
v->nTrackParticles()==0) {
676 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
677 v->setTrackParticleLinks(nullLinkVector);
678 }
679 }
680
682
683
684 result_nc->setSVOwnership(true);
685 cascadeinfoContainer_noConstr->push_back(result_nc.release());
686 }
687 else cascadeinfoContainer_noConstr->push_back(0);
688 }
689 else cascadeinfoContainer_noConstr->push_back(0);
690 }
691 }
692
693 return StatusCode::SUCCESS;
694 }
#define ATH_MSG_DEBUG(x,...)
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const TrackParticle * trackParticle(size_t i) const
Get the pointer to a given track that was used in vertex reco.
SG::Accessor< T, ALLOC > Accessor
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.