371 {
373 assert(cascadeinfoContainer!=nullptr && cascadeinfoContainer_noConstr!=nullptr);
374
375
378
379 std::vector<const xAOD::TrackParticle*> tracksJpsi1;
380 std::vector<const xAOD::TrackParticle*> tracksJpsi2;
381 std::vector<const xAOD::TrackParticle*> tracksDiTrk1;
382 std::vector<const xAOD::TrackParticle*> tracksDiTrk2;
383 std::vector<const xAOD::TrackParticle*> tracksPsi1;
384 std::vector<const xAOD::TrackParticle*> tracksPsi2;
385 std::vector<double> massesPsi1;
390 std::vector<double> massesPsi2;
395
396
399
400
403
404
405 std::vector<const xAOD::Vertex*> selectedPsi2Candidates;
406 for(auto vxcItr=psi2Container.cptr()->cbegin(); vxcItr!=psi2Container.cptr()->cend(); ++vxcItr) {
407
412 if(flagAcc.isAvailable(*vtx) && flagAcc(*vtx)) {
414 }
415 }
417
418
419 double mass_psi2 =
m_V0Tools->invariantMass(*vxcItr, massesPsi2);
420 if (mass_psi2 < m_psi2MassLower || mass_psi2 >
m_psi2MassUpper)
continue;
421
422
423 TLorentzVector p4_mu1, p4_mu2;
424 p4_mu1.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
425 (*vxcItr)->trackParticle(0)->eta(),
427 p4_mu2.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
428 (*vxcItr)->trackParticle(1)->eta(),
430 double mass_jpsi2 = (p4_mu1 + p4_mu2).M();
431 if (mass_jpsi2 < m_jpsi2MassLower || mass_jpsi2 >
m_jpsi2MassUpper)
continue;
432
434 TLorentzVector p4_trk1, p4_trk2;
435 p4_trk1.SetPtEtaPhiM( (*vxcItr)->trackParticle(2)->pt(),
436 (*vxcItr)->trackParticle(2)->eta(),
438 p4_trk2.SetPtEtaPhiM( (*vxcItr)->trackParticle(3)->pt(),
439 (*vxcItr)->trackParticle(3)->eta(),
441 double mass_diTrk2 = (p4_trk1 + p4_trk2).M();
443 }
444
445 double chi2DOF = (*vxcItr)->chiSquared()/(*vxcItr)->numberDoF();
447
448 selectedPsi2Candidates.push_back(*vxcItr);
449 }
450 if(selectedPsi2Candidates.size()==0) return StatusCode::SUCCESS;
451
452
453 std::vector<const xAOD::Vertex*> selectedPsi1Candidates;
454 for(auto vxcItr=psi1Container.cptr()->cbegin(); vxcItr!=psi1Container.cptr()->cend(); ++vxcItr) {
455
460 if(flagAcc.isAvailable(*vtx) && flagAcc(*vtx)) {
462 }
463 }
465
466
467 double mass_psi1 =
m_V0Tools->invariantMass(*vxcItr,massesPsi1);
468 if(mass_psi1 < m_psi1MassLower || mass_psi1 >
m_psi1MassUpper)
continue;
469
470
471 TLorentzVector p4_mu1, p4_mu2;
472 p4_mu1.SetPtEtaPhiM( (*vxcItr)->trackParticle(0)->pt(),
473 (*vxcItr)->trackParticle(0)->eta(),
475 p4_mu2.SetPtEtaPhiM( (*vxcItr)->trackParticle(1)->pt(),
476 (*vxcItr)->trackParticle(1)->eta(),
478 double mass_jpsi1 = (p4_mu1 + p4_mu2).M();
479 if (mass_jpsi1 < m_jpsi1MassLower || mass_jpsi1 >
m_jpsi1MassUpper)
continue;
480
482 TLorentzVector p4_trk1, p4_trk2;
483 p4_trk1.SetPtEtaPhiM( (*vxcItr)->trackParticle(2)->pt(),
484 (*vxcItr)->trackParticle(2)->eta(),
486 p4_trk2.SetPtEtaPhiM( (*vxcItr)->trackParticle(3)->pt(),
487 (*vxcItr)->trackParticle(3)->eta(),
489 double mass_diTrk1 = (p4_trk1 + p4_trk2).M();
491 }
492
493 double chi2DOF = (*vxcItr)->chiSquared()/(*vxcItr)->numberDoF();
495
496 selectedPsi1Candidates.push_back(*vxcItr);
497 }
498 if(selectedPsi1Candidates.size()==0) return StatusCode::SUCCESS;
499
500 std::vector<std::pair<const xAOD::Vertex*, const xAOD::Vertex*> > candidatePairs;
501 for(auto psi1Itr=selectedPsi1Candidates.cbegin(); psi1Itr!=selectedPsi1Candidates.cend(); ++psi1Itr) {
502 tracksPsi1.clear();
503 for(
size_t i=0;
i<(*psi1Itr)->nTrackParticles();
i++) tracksPsi1.push_back((*psi1Itr)->trackParticle(i));
504 for(auto psi2Itr=selectedPsi2Candidates.cbegin(); psi2Itr!=selectedPsi2Candidates.cend(); ++psi2Itr) {
506 for(size_t j=0; j<(*psi2Itr)->nTrackParticles(); j++) {
507 if(std::find(tracksPsi1.cbegin(), tracksPsi1.cend(), (*psi2Itr)->trackParticle(j)) != tracksPsi1.cend()) {
skip =
true;
break; }
508 }
511 for(
size_t ic=0;
ic<candidatePairs.size();
ic++) {
514 if((psi1Vertex == *psi1Itr && psi2Vertex == *psi2Itr) || (psi1Vertex == *psi2Itr && psi2Vertex == *psi1Itr)) {
skip =
true;
break; }
515 }
516 }
518 candidatePairs.push_back(std::pair<const xAOD::Vertex*, const xAOD::Vertex*>(*psi1Itr,*psi2Itr));
519 }
520 }
521
522 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(); } );
524 candidatePairs.erase(candidatePairs.begin()+
m_maxCandidates, candidatePairs.end());
525 }
526
527 for(
size_t ic=0;
ic<candidatePairs.size();
ic++) {
530
531 tracksPsi1.clear();
533 if (tracksPsi1.size() != massesPsi1.size()) {
534 ATH_MSG_ERROR(
"Problems with Psi1 input: number of tracks or track mass inputs is not correct!");
535 }
536 tracksPsi2.clear();
538 if (tracksPsi2.size() != massesPsi2.size()) {
539 ATH_MSG_ERROR(
"Problems with Psi2 input: number of tracks or track mass inputs is not correct!");
540 }
541
542 tracksJpsi1.clear();
545 tracksDiTrk1.clear();
549 }
550 tracksJpsi2.clear();
553 tracksDiTrk2.clear();
557 }
558
559 TLorentzVector p4_moth;
564 }
568 }
570
571
573
574 int robustness = 0;
576
577
578 std::vector<Trk::VertexID> vrtList;
579
581
584 } else {
586 }
587 vrtList.push_back(vID1);
588
592 } else {
594 }
595 vrtList.push_back(vID2);
596
597 std::vector<const xAOD::TrackParticle*>
tp;
tp.clear();
598 std::vector<double> tp_masses; tp_masses.clear();
601 std::vector<Trk::VertexID> cnstV; cnstV.clear();
604 }
605 }
607 std::vector<Trk::VertexID> cnstV; cnstV.clear();
610 }
611 }
613 std::vector<Trk::VertexID> cnstV; cnstV.clear();
616 }
617 }
619 std::vector<Trk::VertexID> cnstV; cnstV.clear();
622 }
623 }
624
626
627 bool pass = false;
628 if (result != nullptr) {
629 for(
auto v :
result->vertices()) {
630 if(
v->nTrackParticles()==0) {
631 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
632 v->setTrackParticleLinks(nullLinkVector);
633 }
634 }
635
637
638
639 result->setSVOwnership(
true);
640
641
644
645 if(chi2CutPassed) {
646 cascadeinfoContainer->push_back(
result.release());
647 pass = true;
648 }
649 }
650
651
652 if(pass) {
656 std::vector<Trk::VertexID> vrtList_nc;
657
659 vrtList_nc.push_back(vID1_nc);
660
662 vrtList_nc.push_back(vID2_nc);
663
664 std::vector<const xAOD::TrackParticle*>
tp;
tp.clear();
665 std::vector<double> tp_masses; tp_masses.clear();
667
668 std::unique_ptr<Trk::VxCascadeInfo> result_nc(
m_iVertexFitter->fitCascade(*state));
669
670 if (result_nc != nullptr) {
671 for(auto v : result_nc->vertices()) {
672 if(
v->nTrackParticles()==0) {
673 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
674 v->setTrackParticleLinks(nullLinkVector);
675 }
676 }
677
679
680
681 result_nc->setSVOwnership(true);
682 cascadeinfoContainer_noConstr->push_back(result_nc.release());
683 }
684 else cascadeinfoContainer_noConstr->push_back(0);
685 }
686 else cascadeinfoContainer_noConstr->push_back(0);
687 }
688 }
689
690 return StatusCode::SUCCESS;
691 }
SG::Accessor< T, ALLOC > Accessor
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.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.