30 #include "GaudiKernel/IPartPropSvc.h"
33 #include "HepPDT/ParticleDataTable.hh"
47 m_iVertexFitter(
"Trk::V0VertexFitter"),
48 m_iVKVertexFitter(
"Trk::TrkVKalVrtFitter"),
49 m_iKshortFitter(
"Trk::TrkVKalVrtFitter"),
50 m_iLambdaFitter(
"Trk::TrkVKalVrtFitter"),
51 m_iLambdabarFitter(
"Trk::TrkVKalVrtFitter"),
52 m_iGammaFitter(
"Trk::TrkVKalVrtFitter"),
53 m_V0Tools(
"Trk::V0Tools"),
54 m_trackToVertexTool(
"Reco::TrackToVertex"),
55 m_trkSelector(
"InDet::TrackSelectorTool"),
56 m_vertexEstimator(
"InDet::VertexPointEstimator"),
57 m_extrapolator(
"Trk::Extrapolator"),
58 m_particleDataTable(nullptr),
63 m_use_vertColl(false),
64 m_useTRTplusTRT(false),
65 m_useTRTplusSi(false),
72 m_massLambda(1115.68),
84 m_minVertProb(0.0001),
85 m_minConstrVertProb(0.0001),
92 declareInterface<InDetV0FinderTool>(
this);
181 IPartPropSvc* partPropSvc =
nullptr;
182 ATH_CHECK( service(
"PartPropSvc", partPropSvc,
true) );
228 for (
const std::string
beam : {
"beamPosX",
"beamPosY",
"beamPosZ"}) {
267 ATH_MSG_FATAL(
"The vertex fitter passed is not a V0 Vertex Fitter");
268 return StatusCode::FAILURE;
276 return StatusCode::SUCCESS;
285 const EventContext& ctx
290 std::vector<const xAOD::TrackParticleContainer*> trackCols;
293 trackCols.push_back(handle.
cptr());
300 if ( !TPC.isValid() )
303 return StatusCode::SUCCESS;
305 ATH_MSG_DEBUG(
"Track particle container size " << TPC->size());
313 beamspot = beamSpotHandle->beamPos();
318 beamspot =
Amg::Vector3D(beamPosX(0), beamPosY(0), beamPosZ(0));
321 std::vector<const xAOD::TrackParticle*> posTracks; posTracks.clear();
322 std::vector<const xAOD::TrackParticle*> negTracks; negTracks.clear();
324 if (
m_pv && primaryVertex) vx = primaryVertex;
326 if (TPC->size() > 1) {
328 for ( tpIt=TPC->begin(); tpIt!=TPC->end(); ++tpIt )
336 posTracks.push_back(TP);
337 negTracks.push_back(TP);
340 posTracks.push_back(*tpIt);
342 negTracks.push_back(*tpIt);
348 ATH_MSG_DEBUG(
"number of tracks passing preselection, positive " << posTracks.size() <<
" negative " << negTracks.size());
350 if (!posTracks.empty() && !negTracks.empty())
353 if (!vertices.isValid())
356 return StatusCode::SUCCESS;
370 std::vector<const xAOD::TrackParticle*>::const_iterator tpIt1;
371 std::vector<const xAOD::TrackParticle*>::const_iterator tpIt2;
373 for (tpIt1 = posTracks.begin(); tpIt1 != posTracks.end(); ++tpIt1)
380 double pt1 = TP1->
pt();
385 for (
const auto *
const vx : *vertices)
395 if (foundVertex1)
break;
399 for (tpIt2 = negTracks.begin(); tpIt2 != negTracks.end(); ++tpIt2)
401 if (*tpIt1 == *tpIt2)
continue;
409 ATH_MSG_DEBUG(
"nclus1 " << (
int)nclus1 <<
" nclus2 " << (
int)nclus2);
414 double pt2 = TP2->
pt();
419 for (
const auto *
const vx : *vertices)
429 if (foundVertex2)
break;
432 bool usepair =
false;
434 if (
m_useorigin && foundVertex1 ==
nullptr && foundVertex2 ==
nullptr) usepair =
true;
435 if (!usepair)
continue;
437 bool trk_cut1 =
false;
438 bool trk_cut2 =
false;
439 if (nclus1 != 0) trk_cut1 =
true;
440 if (nclus1 == 0 && pt1 >=
m_ptTRT) trk_cut1 =
true;
441 if (!trk_cut1)
continue;
442 if (nclus2 != 0) trk_cut2 =
true;
443 if (nclus2 == 0 && pt2 >=
m_ptTRT) trk_cut2 =
true;
444 if (!trk_cut2)
continue;
452 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
453 bool errorCode =
false;
454 if (errorcode == 0 || errorcode == 5 || errorcode == 6 || errorcode == 8) errorCode =
true;
455 if (!errorCode)
continue;
457 bool d0wrtVertex =
true;
459 if ( !
d0Pass(TP1,TP2,vertColl, ctx) ) d0wrtVertex =
false;
463 if ( !
d0Pass(TP1,TP2,primaryVertex, ctx) ) d0wrtVertex =
false;
465 if ( !
d0Pass(TP1,TP2,beamspot, ctx) ) d0wrtVertex =
false;
468 if (!d0wrtVertex)
continue;
472 if (
doFit(TP1,TP2,startingPoint, ctx) )
474 std::vector<const xAOD::TrackParticle*> pairV0;
476 pairV0.push_back(TP1);
477 pairV0.push_back(TP2);
482 std::unique_ptr<xAOD::Vertex> myVxCandidate;
486 myVxCandidate = std::unique_ptr<xAOD::Vertex>(
m_iVKVertexFitter->fit(pairV0, startingPoint) );
494 bool doKshortFit =
false;
495 doKshortFit =
doMassFit(myVxCandidate.get(),310);
496 bool doLambdaFit =
false;
497 doLambdaFit =
doMassFit(myVxCandidate.get(),3122);
498 bool doLambdabarFit =
false;
499 doLambdabarFit =
doMassFit(myVxCandidate.get(),-3122);
500 if (doKshortFit || doLambdaFit || doLambdabarFit)
502 bool pointAtVert =
true;
507 if ( !
pointAtVertex(myVxCandidate.get(),primaryVertex) ) pointAtVert =
false;
514 std::unique_ptr<xAOD::Vertex> myKshort;
515 std::unique_ptr<xAOD::Vertex> myLambda;
516 std::unique_ptr<xAOD::Vertex> myLambdabar;
517 std::unique_ptr<xAOD::Vertex> myGamma;
518 bool foundKshort =
false;
519 bool foundLambda =
false;
520 bool foundLambdabar =
false;
523 myKshort = std::unique_ptr<xAOD::Vertex>(
massFit(310, pairV0,
vertex) );
533 myLambda = std::unique_ptr<xAOD::Vertex>(
massFit(3122, pairV0,
vertex) );
543 myLambdabar = std::unique_ptr<xAOD::Vertex>(
massFit(-3122, pairV0,
vertex));
547 foundLambdabar =
true;
552 bool doGamma =
false;
554 double gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
555 if (foundKshort || foundLambda || foundLambdabar) doGamma =
true;
569 v0Container->
push_back(myVxCandidate.release());
578 ksContainer->
push_back(myKshort.release());
582 v0LinksDecorks(*(ksContainer->
back())) = v0Link;
586 v0_ksLinksDecor(*(v0Container->
back())) = ksLink;
588 v0_ksLinksDecor(*(v0Container->
back())) = ksLink;
597 laContainer->
push_back(myLambda.release());
601 v0LinksDecorlb(*(laContainer->
back())) = v0Link;
605 v0_laLinksDecor(*(v0Container->
back())) = laLink;
607 v0_laLinksDecor(*(v0Container->
back())) = laLink;
616 lbContainer->
push_back(myLambdabar.release());
620 v0LinksDecorlbb(*(lbContainer->
back())) = v0Link;
624 v0_lbLinksDecor(*(v0Container->
back())) = lbLink;
626 v0_lbLinksDecor(*(v0Container->
back())) = lbLink;
629 myGamma = std::unique_ptr<xAOD::Vertex>(
massFit(22, pairV0,
vertex) );
632 gamma_prob =
m_V0Tools->vertexProbability(myGamma.get());
637 mDecor_gfit( *(v0Container->
back()) ) = gamma_fit;
638 mDecor_gmass( *(v0Container->
back()) ) = gamma_mass;
639 mDecor_gmasserr( *(v0Container->
back()) ) = gamma_massErr;
640 mDecor_gprob( *(v0Container->
back()) ) = gamma_prob;
662 if (v0Container->
empty())
ATH_MSG_DEBUG(
"No Candidates found. Empty container returned");
663 if (ksContainer->
empty())
ATH_MSG_DEBUG(
"No Kshort Candidates found. Empty container returned");
664 if (laContainer->
empty())
ATH_MSG_DEBUG(
"No Lambda Candidates found. Empty container returned");
665 if (lbContainer->
empty())
ATH_MSG_DEBUG(
"No Lambdabar Candidates found. Empty container returned");
667 return StatusCode::SUCCESS;
673 <<
"----------------------------------------------------------------------------------------------------------------------------------------------" <<
endmsg
680 msg(
MSG::DEBUG) <<
"----------------------------------------------------------------------------------------------------------------------------------------------" <<
endmsg;
682 return StatusCode::SUCCESS;
695 double srxy = startingPoint.perp();
698 double massKshort_i=2000001., massLambda_i=2000001., massLambdabar_i=2000001.;
701 std::vector<std::unique_ptr<const Trk::TrackParameters> > cleanup;
705 if (extrapolatedPerigee1 ==
nullptr) extrapolatedPerigee1 = &track1->
perigeeParameters();
706 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee1));
709 if (extrapolatedPerigee2 ==
nullptr) extrapolatedPerigee2 = &track2->
perigeeParameters();
710 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee2));
712 if (extrapolatedPerigee1 !=
nullptr && extrapolatedPerigee2 !=
nullptr) {
718 (massLambdabar_i >=
m_ulamin && massLambdabar_i <=
m_ulamax)) ) pass =
true;
729 for (
auto vItr=vertColl->
begin(); vItr!=vertColl->
end(); ++vItr )
733 if (per1 ==
nullptr)
continue;
735 if (per2 ==
nullptr)
continue;
737 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
738 double d0_2 = per2->parameters()[
Trk::d0];
739 double sig_d0_2 = sqrt((*per2->covariance())(0,0));
740 if (std::abs(d0_1/sig_d0_1) >
m_d0_cut &&
741 std::abs(d0_2/sig_d0_2) >
m_d0_cut)
return true;
751 if (per1 ==
nullptr)
return pass;
753 if (per2 ==
nullptr) {
756 double d0_1 = per1->parameters()[
Trk::d0];
757 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
759 double sig_d0_2 = sqrt((*per2->covariance())(0,0));
760 if (std::abs(d0_1/sig_d0_1) >
m_d0_cut &&
761 std::abs(d0_2/sig_d0_2) >
m_d0_cut) pass =
true;
769 if (per1 ==
nullptr)
return pass;
771 if (per2 ==
nullptr) {
774 double d0_1 = per1->parameters()[
Trk::d0];
775 double sig_d0_1 = sqrt((*per1->covariance())(0,0));
777 double sig_d0_2 = sqrt((*per2->covariance())(0,0));
778 if (std::abs(d0_1/sig_d0_1) >
m_d0_cut && std::abs(d0_2/sig_d0_2) >
m_d0_cut) pass =
true;
807 double e1 = (e1sq>0.) ? sqrt(e1sq) : 0.;
809 double e2 = (e2sq>0.) ? sqrt(e2sq) : 0.;
812 double mass = (msq>0.) ? sqrt(msq) : 0.;
819 double mass = 1000000000.;
820 double error = 1000000001.;
821 bool in_mass_window =
false;
822 double winmass_min = 0., winmass_max = 0.;
830 }
else if (pdgID == 3122 || pdgID == -3122) {
836 }
else if (pdgID == -3122) {
842 if (in_mass_window) pass =
true;
850 std::vector<double>
masses;
854 }
else if (pdgID == 3122) {
857 }
else if (pdgID == -3122) {
860 }
else if (pdgID == 22) {
882 if (pdgID == -3122) {
894 const std::vector<const xAOD::TrackParticleContainer*>& trackcols)
const
898 bool elementSet =
false;
899 if(trackcols.empty()){
905 if(itr != trkcol->end()){
912 if(!elementSet)
ATH_MSG_ERROR(
"Track was not found when linking");