429 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
430 return StatusCode::FAILURE;
433 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
436 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
446 if (pvContainer.cptr()->size()==0) {
447 ATH_MSG_WARNING(
"You have no primary vertices: " << pvContainer.cptr()->size());
448 return StatusCode::RECOVERABLE;
450 else primaryVertex = (*pvContainer.cptr())[0];
458 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
466 std::vector<const xAOD::TrackParticleContainer*> trackCols;
470 trackCols.push_back(handle.cptr());
477 ATH_CHECK( V0OutputContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
484 if(jxContainer->size()==0)
return StatusCode::SUCCESS;
487 std::vector<const xAOD::TrackParticle*> tracksDisplaced;
496 if(!
m_useTRT && nclus == 0)
continue;
498 bool trk_cut =
false;
499 if(nclus != 0) trk_cut =
true;
500 if(nclus == 0 && TP->pt()>=
m_ptTRT) trk_cut =
true;
501 if(!trk_cut)
continue;
504 if(!
d0Pass(TP,primaryVertex))
continue;
506 tracksDisplaced.push_back(TP);
517 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates;
525 std::string type_V0Vtx;
526 if(mAcc_type.isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
529 if(type_V0Vtx ==
"Lambda") {
534 else if(type_V0Vtx ==
"Lambdabar") {
539 else if(type_V0Vtx ==
"Ks") {
551 int gamma_fit = mAcc_gfit.isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
552 double gamma_mass = mAcc_gmass.isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
553 double gamma_chisq = mAcc_gchisq.isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
554 double gamma_ndof = mAcc_gndof.isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
557 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,
opt});
565 std::string type_V0Vtx;
566 if(mAcc_type.isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
569 if(type_V0Vtx ==
"Lambda") {
574 else if(type_V0Vtx ==
"Lambdabar") {
579 else if(type_V0Vtx ==
"Ks") {
591 int gamma_fit = mAcc_gfit.isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
592 double gamma_mass = mAcc_gmass.isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
593 double gamma_chisq = mAcc_gchisq.isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
594 double gamma_ndof = mAcc_gndof.isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
597 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,
opt});
602 std::sort( selectedV0Candidates.begin(), selectedV0Candidates.end(), [](std::pair<const xAOD::Vertex*,V0Enum>&
a, std::pair<const xAOD::Vertex*,V0Enum>&
b) { return a.first->chiSquared()/a.first->numberDoF() < b.first->chiSquared()/b.first->numberDoF(); } );
604 selectedV0Candidates.erase(selectedV0Candidates.begin()+
m_maxV0Candidates, selectedV0Candidates.end());
606 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
608 std::vector<Trk::VxCascadeInfo*> cascadeinfoContainer;
615 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+
m_maxMainVCandidates, cascadeinfoContainer.end());
654 for(
auto cascade_info : cascadeinfoContainer) {
655 if(cascade_info==
nullptr) {
660 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info->vertices();
661 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
662 for(
size_t i=0;
i<topoN;
i++) {
663 if(cascadeVertices[
i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
666 cascade_info->setSVOwnership(
false);
667 const auto mainVertex = cascadeVertices[topoN-1];
668 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info->getParticleMoms();
673 if(
m_jxDaug_num==4) jxVtx = FindVertex<4>(jxContainer.ptr(), cascadeVertices[ijx]);
674 else if(
m_jxDaug_num==3) jxVtx = FindVertex<3>(jxContainer.ptr(), cascadeVertices[ijx]);
675 else jxVtx = FindVertex<2>(jxContainer.ptr(), cascadeVertices[ijx]);
692 PtErr_decor(*mainVertex) =
m_CascadeTools->pTError(moms[topoN-1],cascade_info->getCovariance()[topoN-1]);
694 chi2_decor(*mainVertex) = cascade_info->fitChi2();
695 ndof_decor(*mainVertex) = cascade_info->nDoF();
698 lxy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
699 lxyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->lxyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
700 a0z_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
701 a0zErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0zError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
702 a0xy_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
703 a0xyErr_SV1_decor(*cascadeVertices[0]) =
m_CascadeTools->a0xyError(moms[0],cascade_info->getCovariance()[0],cascadeVertices[0],mainVertex);
706 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[2]);
707 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
708 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],cascadeVertices[2]);
709 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
710 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],cascadeVertices[2]);
711 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],cascadeVertices[2]);
714 lxy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
715 lxyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->lxyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
716 a0z_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
717 a0zErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0zError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
718 a0xy_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
719 a0xyErr_SV2_decor(*cascadeVertices[1]) =
m_CascadeTools->a0xyError(moms[1],cascade_info->getCovariance()[1],cascadeVertices[1],mainVertex);
723 lxy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
724 lxyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->lxyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
725 a0z_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
726 a0zErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0zError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
727 a0xy_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
728 a0xyErr_SV3_decor(*cascadeVertices[2]) =
m_CascadeTools->a0xyError(moms[2],cascade_info->getCovariance()[2],cascadeVertices[2],mainVertex);
731 chi2_V3_decor(*cascadeVertices[2]) =
m_V0Tools->chisq(jxVtx);
732 ndof_V3_decor(*cascadeVertices[2]) =
m_V0Tools->ndof(jxVtx);
737 for(
size_t i=0;
i<topoN;
i++) {
738 VtxWriteHandles[
i].ptr()->push_back(cascadeVertices[
i]);
746 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
750 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
755 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
757 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
761 for (
auto cascade_info : cascadeinfoContainer) {
762 if(cascade_info)
delete cascade_info;
765 return StatusCode::SUCCESS;