16 #include "HepPDT/ParticleDataTable.hh"
35 if(m_num>0 && m_vector.size()>=m_num) {
36 if(m_orderByPt && etac.
pt<=m_vector.back().pt)
return;
37 else if(!m_orderByPt && etac.
chi2NDF>=m_vector.back().chi2NDF)
return;
39 auto pos = m_vector.cend();
40 for(
auto iter=m_vector.cbegin(); iter!=m_vector.cend(); iter++) {
42 if(etac.
pt>iter->pt) {
pos = iter;
break; }
45 if(etac.
chi2NDF<iter->chi2NDF) {
pos = iter;
break; }
48 m_vector.insert(
pos, etac);
49 if(m_num>0 && m_vector.size()>m_num) m_vector.pop_back();
59 m_cascadeOutputKeys({
"JpsiXPlusDisVtx1_sub",
"JpsiXPlusDisVtx1",
"JpsiXPlusDisVtx2",
"JpsiXPlusDisVtx3"}),
60 m_cascadeOutputKeys_mvc({
"JpsiXPlusDisVtx1_sub_mvc",
"JpsiXPlusDisVtx1_mvc",
"JpsiXPlusDisVtx2_mvc",
"JpsiXPlusDisVtx3_mvc"}),
62 m_TrkParticleCollection(
"InDetTrackParticles"),
63 m_VxPrimaryCandidateName(
"PrimaryVertices"),
64 m_refPVContainerName(
"RefittedPrimaryVertices"),
65 m_eventInfo_key(
"EventInfo"),
66 m_RelinkContainers({
"InDetTrackParticles",
"InDetLargeD0TrackParticles"}),
67 m_useImprovedMass(
false),
69 m_jxMassUpper(10000.0),
71 m_jpsiMassUpper(10000.0),
72 m_diTrackMassLower(-1.0),
73 m_diTrackMassUpper(-1.0),
74 m_V0Hypothesis(
"Lambda"),
75 m_LambdaMassLower(0.0),
76 m_LambdaMassUpper(10000.0),
78 m_KsMassUpper(10000.0),
80 m_minMass_gamma(-1.0),
81 m_chi2cut_gamma(-1.0),
82 m_DisplacedMassLower(0.0),
83 m_DisplacedMassUpper(10000.0),
84 m_lxyDisV_cut(-999.0),
90 m_PostMassUpper(31000.0),
92 m_jxDaug1MassHypo(-1),
93 m_jxDaug2MassHypo(-1),
94 m_jxDaug3MassHypo(-1),
95 m_jxDaug4MassHypo(-1),
96 m_jxPtOrdering(
false),
98 m_disVDaug3MassHypo(-1),
99 m_disVDaug3MinPt(480),
100 m_extraTrk1MassHypo(-1),
101 m_extraTrk1MinPt(480),
102 m_extraTrk2MassHypo(-1),
103 m_extraTrk2MinPt(480),
104 m_extraTrk3MassHypo(-1),
105 m_extraTrk3MinPt(480),
107 m_DpmMassUpper(10000.0),
109 m_D0MassUpper(10000.0),
110 m_maxMesonCandidates(400),
111 m_MesonPtOrdering(
true),
130 m_constrMainV(
false),
131 m_doPostMainVContrFit(
false),
136 m_chi2cut_DisV(-1.0),
143 m_maxJXCandidates(0),
144 m_maxV0Candidates(0),
145 m_maxDisVCandidates(0),
146 m_maxMainVCandidates(0),
147 m_iVertexFitter(
"Trk::TrkVKalVrtFitter"),
148 m_iV0Fitter(
"Trk::V0VertexFitter"),
149 m_iGammaFitter(
"Trk::TrkVKalVrtFitter"),
150 m_pvRefitter(
"Analysis::PrimaryVertexRefitter",
this),
151 m_V0Tools(
"Trk::V0Tools"),
152 m_trackToVertexTool(
"Reco::TrackToVertex"),
153 m_trkSelector(
"InDet::TrackSelectorTool"),
154 m_v0TrkSelector(
"InDet::TrackSelectorTool"),
155 m_CascadeTools(
"DerivationFramework::CascadeTools"),
156 m_vertexEstimator(
"InDet::VertexPointEstimator"),
157 m_extrapolator(
"Trk::Extrapolator/AtlasExtrapolator")
159 declareProperty(
"JXVertices", m_vertexJXContainerKey);
160 declareProperty(
"V0Vertices", m_vertexV0ContainerKey);
161 declareProperty(
"JXVtxHypoNames", m_vertexJXHypoNames);
162 declareProperty(
"CascadeVertexCollections", m_cascadeOutputKeys);
163 declareProperty(
"CascadeVertexCollectionsMVC",m_cascadeOutputKeys_mvc);
164 declareProperty(
"OutputV0VtxCollection", m_v0VtxOutputKey);
165 declareProperty(
"TrackParticleCollection", m_TrkParticleCollection);
166 declareProperty(
"VxPrimaryCandidateName", m_VxPrimaryCandidateName);
167 declareProperty(
"RefPVContainerName", m_refPVContainerName);
168 declareProperty(
"EventInfoKey", m_eventInfo_key);
169 declareProperty(
"RelinkTracks", m_RelinkContainers);
170 declareProperty(
"UseImprovedMass", m_useImprovedMass);
171 declareProperty(
"JXMassLowerCut", m_jxMassLower);
172 declareProperty(
"JXMassUpperCut", m_jxMassUpper);
173 declareProperty(
"JpsiMassLowerCut", m_jpsiMassLower);
174 declareProperty(
"JpsiMassUpperCut", m_jpsiMassUpper);
175 declareProperty(
"DiTrackMassLower", m_diTrackMassLower);
176 declareProperty(
"DiTrackMassUpper", m_diTrackMassUpper);
177 declareProperty(
"V0Hypothesis", m_V0Hypothesis);
178 declareProperty(
"LambdaMassLowerCut", m_LambdaMassLower);
179 declareProperty(
"LambdaMassUpperCut", m_LambdaMassUpper);
180 declareProperty(
"KsMassLowerCut", m_KsMassLower);
181 declareProperty(
"KsMassUpperCut", m_KsMassUpper);
182 declareProperty(
"LxyV0Cut", m_lxyV0_cut);
183 declareProperty(
"MassCutGamma", m_minMass_gamma);
184 declareProperty(
"Chi2CutGamma", m_chi2cut_gamma);
185 declareProperty(
"DisplacedMassLowerCut", m_DisplacedMassLower);
186 declareProperty(
"DisplacedMassUpperCut", m_DisplacedMassUpper);
187 declareProperty(
"LxyDisVtxCut", m_lxyDisV_cut);
188 declareProperty(
"LxyDpmCut", m_lxyDpm_cut);
189 declareProperty(
"LxyD0Cut", m_lxyD0_cut);
190 declareProperty(
"MassLowerCut", m_MassLower);
191 declareProperty(
"MassUpperCut", m_MassUpper);
192 declareProperty(
"PostMassLowerCut", m_PostMassLower);
193 declareProperty(
"PostMassUpperCut", m_PostMassUpper);
194 declareProperty(
"HypothesisName", m_hypoName =
"TQ");
195 declareProperty(
"NumberOfJXDaughters", m_jxDaug_num);
196 declareProperty(
"JXDaug1MassHypo", m_jxDaug1MassHypo);
197 declareProperty(
"JXDaug2MassHypo", m_jxDaug2MassHypo);
198 declareProperty(
"JXDaug3MassHypo", m_jxDaug3MassHypo);
199 declareProperty(
"JXDaug4MassHypo", m_jxDaug4MassHypo);
200 declareProperty(
"JXPtOrdering", m_jxPtOrdering);
201 declareProperty(
"NumberOfDisVDaughters", m_disVDaug_num);
202 declareProperty(
"DisVDaug3MassHypo", m_disVDaug3MassHypo);
203 declareProperty(
"DisVDaug3MinPt", m_disVDaug3MinPt);
204 declareProperty(
"ExtraTrack1MassHypo", m_extraTrk1MassHypo);
205 declareProperty(
"ExtraTrack1MinPt", m_extraTrk1MinPt);
206 declareProperty(
"ExtraTrack2MassHypo", m_extraTrk2MassHypo);
207 declareProperty(
"ExtraTrack2MinPt", m_extraTrk2MinPt);
208 declareProperty(
"ExtraTrack3MassHypo", m_extraTrk3MassHypo);
209 declareProperty(
"ExtraTrack3MinPt", m_extraTrk3MinPt);
210 declareProperty(
"DpmMassLowerCut", m_DpmMassLower);
211 declareProperty(
"DpmMassUpperCut", m_DpmMassUpper);
212 declareProperty(
"D0MassLowerCut", m_D0MassLower);
213 declareProperty(
"D0MassUpperCut", m_D0MassUpper);
214 declareProperty(
"MaxMesonCandidates", m_maxMesonCandidates);
215 declareProperty(
"MesonPtOrdering", m_MesonPtOrdering);
216 declareProperty(
"JXMass", m_massJX);
217 declareProperty(
"JpsiMass", m_massJpsi);
218 declareProperty(
"XMass", m_massX);
219 declareProperty(
"DisVtxMass", m_massDisV);
220 declareProperty(
"LambdaMass", m_massLd);
221 declareProperty(
"KsMass", m_massKs);
222 declareProperty(
"DpmMass", m_massDpm);
223 declareProperty(
"D0Mass", m_massD0);
224 declareProperty(
"JXV0Mass", m_massJXV0);
225 declareProperty(
"MainVtxMass", m_massMainV);
226 declareProperty(
"ApplyJXMassConstraint", m_constrJX);
227 declareProperty(
"ApplyJpsiMassConstraint", m_constrJpsi);
228 declareProperty(
"ApplyXMassConstraint", m_constrX);
229 declareProperty(
"ApplyDisVMassConstraint", m_constrDisV);
230 declareProperty(
"ApplyV0MassConstraint", m_constrV0);
231 declareProperty(
"ApplyDpmMassConstraint", m_constrDpm);
232 declareProperty(
"ApplyD0MassConstraint", m_constrD0);
233 declareProperty(
"ApplyJXV0MassConstraint", m_constrJXV0);
234 declareProperty(
"ApplyMainVMassConstraint", m_constrMainV);
235 declareProperty(
"DoPostMainVContrFit", m_doPostMainVContrFit);
236 declareProperty(
"HasJXSubVertex", m_JXSubVtx);
237 declareProperty(
"HasJXV0SubVertex", m_JXV0SubVtx);
238 declareProperty(
"Chi2CutJX", m_chi2cut_JX);
239 declareProperty(
"Chi2CutV0", m_chi2cut_V0);
240 declareProperty(
"Chi2CutDisV", m_chi2cut_DisV);
241 declareProperty(
"Chi2CutDpm", m_chi2cut_Dpm);
242 declareProperty(
"Chi2CutD0", m_chi2cut_D0);
243 declareProperty(
"Chi2Cut", m_chi2cut);
244 declareProperty(
"UseTRT", m_useTRT);
245 declareProperty(
"PtTRT", m_ptTRT);
246 declareProperty(
"Trackd0Cut", m_d0_cut);
247 declareProperty(
"MaxJXCandidates", m_maxJXCandidates);
248 declareProperty(
"MaxV0Candidates", m_maxV0Candidates);
249 declareProperty(
"MaxDisVCandidates", m_maxDisVCandidates);
250 declareProperty(
"MaxMainVCandidates", m_maxMainVCandidates);
251 declareProperty(
"RefitPV", m_refitPV =
true);
252 declareProperty(
"MaxnPV", m_PV_max = 1000);
253 declareProperty(
"MinNTracksInPV", m_PV_minNTracks = 0);
254 declareProperty(
"DoVertexType", m_DoVertexType = 7);
255 declareProperty(
"TrkVertexFitterTool", m_iVertexFitter);
256 declareProperty(
"V0VertexFitterTool", m_iV0Fitter);
257 declareProperty(
"GammaFitterTool", m_iGammaFitter);
258 declareProperty(
"PVRefitter", m_pvRefitter);
259 declareProperty(
"V0Tools", m_V0Tools);
260 declareProperty(
"TrackToVertexTool", m_trackToVertexTool);
261 declareProperty(
"TrackSelectorTool", m_trkSelector);
262 declareProperty(
"V0TrackSelectorTool", m_v0TrkSelector);
263 declareProperty(
"CascadeTools", m_CascadeTools);
264 declareProperty(
"VertexPointEstimator", m_vertexEstimator);
265 declareProperty(
"Extrapolator", m_extrapolator);
271 ATH_MSG_FATAL(
"Incorrect V0 container hypothesis - not recognized");
272 return StatusCode::FAILURE;
275 if(m_jxDaug_num<2 || m_jxDaug_num>4 || m_disVDaug_num<2 || m_disVDaug_num>3) {
277 return StatusCode::FAILURE;
281 ATH_MSG_FATAL(
"Input and output V0 container names can not be both empty");
282 return StatusCode::FAILURE;
374 return StatusCode::SUCCESS;
377 StatusCode JpsiXPlusDisplaced::performSearch(std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> >& cascadeinfoContainer,
const std::vector<std::pair<const xAOD::Vertex*,V0Enum> >& selectedV0Candidates,
const std::vector<const xAOD::TrackParticle*>& tracksDisplaced)
const {
379 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
386 std::vector<const xAOD::TrackParticleContainer*> trackCols;
390 trackCols.push_back(handle.
cptr());
402 std::vector<XiCandidate> disVtxContainer;
404 for(
size_t it=0;
it<selectedV0Candidates.size(); ++
it) {
405 std::pair<const xAOD::Vertex*,V0Enum> elem = selectedV0Candidates[
it];
406 std::vector<const xAOD::TrackParticle*> tracksV0;
407 tracksV0.reserve(elem.first->nTrackParticles());
408 for(
size_t i=0;
i<elem.first->nTrackParticles();
i++) tracksV0.push_back(elem.first->trackParticle(
i));
409 std::vector<double> massesV0;
418 if(
std::find(tracksV0.cbegin(), tracksV0.cend(), TP) != tracksV0.cend())
continue;
421 double disV_mass = (p4_v0+
tmp).M();
429 if(disVtx.V0vtx && disVtx.track) disVtxContainer.push_back(disVtx);
434 std::sort( disVtxContainer.begin(), disVtxContainer.end(), [](
const XiCandidate&
a,
const XiCandidate&
b) { return a.chi2NDF < b.chi2NDF; } );
438 if(disVtxContainer.size()==0)
return StatusCode::SUCCESS;
442 std::vector<const xAOD::Vertex*> selectedJXCandidates;
455 TLorentzVector p4_mu1, p4_mu2;
456 p4_mu1.SetPtEtaPhiM(vtx->trackParticle(0)->pt(),vtx->trackParticle(0)->eta(),vtx->trackParticle(0)->phi(),
m_jxDaug1MassHypo);
457 p4_mu2.SetPtEtaPhiM(vtx->trackParticle(1)->pt(),vtx->trackParticle(1)->eta(),vtx->trackParticle(1)->phi(),
m_jxDaug2MassHypo);
458 double mass_jpsi = (p4_mu1 + p4_mu2).M();
459 if (mass_jpsi < m_jpsiMassLower || mass_jpsi >
m_jpsiMassUpper)
continue;
461 TLorentzVector p4_trk1, p4_trk2;
462 if(
m_jxDaug_num>=3) p4_trk1.SetPtEtaPhiM(vtx->trackParticle(2)->pt(),vtx->trackParticle(2)->eta(),vtx->trackParticle(2)->phi(),
m_jxDaug3MassHypo);
463 if(
m_jxDaug_num==4) p4_trk2.SetPtEtaPhiM(vtx->trackParticle(3)->pt(),vtx->trackParticle(3)->eta(),vtx->trackParticle(3)->phi(),
m_jxDaug4MassHypo);
466 double mass_jx = (p4_mu1 + p4_mu2 + p4_trk1).M();
468 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
471 double mass_jx = (p4_mu1 + p4_mu2 + p4_trk1 + p4_trk2).M();
473 if(mass_jx < m_jxMassLower || mass_jx >
m_jxMassUpper)
continue;
476 double mass_diTrk = (p4_trk1 + p4_trk2).M();
481 double chi2DOF = vtx->chiSquared()/vtx->numberDoF();
484 selectedJXCandidates.push_back(vtx);
486 if(selectedJXCandidates.size()==0)
return StatusCode::SUCCESS;
489 std::sort( selectedJXCandidates.begin(), selectedJXCandidates.end(), [massesJX](
const xAOD::Vertex*
a,
const xAOD::Vertex*
b) {
490 TLorentzVector p4_a, p4_b, tmp;
491 for(size_t it=0; it<a->nTrackParticles(); it++) {
492 tmp.SetPtEtaPhiM(a->trackParticle(it)->pt(), a->trackParticle(it)->eta(), a->trackParticle(it)->phi(), massesJX[it]);
495 for(
size_t it=0; it<b->nTrackParticles();
it++) {
496 tmp.SetPtEtaPhiM(
b->trackParticle(
it)->pt(),
b->trackParticle(
it)->eta(),
b->trackParticle(
it)->phi(), massesJX[
it]);
499 return p4_a.Pt() > p4_b.Pt();
503 std::sort( selectedJXCandidates.begin(), selectedJXCandidates.end(), [](
const xAOD::Vertex*
a,
const xAOD::Vertex*
b) { return a->chiSquared()/a->numberDoF() < b->chiSquared()/b->numberDoF(); } );
505 if(m_maxJXCandidates>0 && selectedJXCandidates.size()>m_maxJXCandidates) {
506 selectedJXCandidates.erase(selectedJXCandidates.begin()+m_maxJXCandidates, selectedJXCandidates.end());
513 if(m_disVDaug_num==2) {
514 for(
auto&& V0Candidate : selectedV0Candidates) {
515 std::vector<std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> >
result = fitMainVtx(jxVtx, massesJX, V0Candidate.first, V0Candidate.second,
trackContainer.cptr(), trackCols);
516 for(
auto cascade_info_pair :
result) {
517 if(cascade_info_pair.first) cascadeinfoContainer.push_back(cascade_info_pair);
521 else if(m_disVDaug_num==3) {
522 for(
auto&& disVtx : disVtxContainer) {
523 std::vector<std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> >
result = fitMainVtx(jxVtx, massesJX, disVtx,
trackContainer.cptr(), trackCols);
524 for(
auto cascade_info_pair :
result) {
525 if(cascade_info_pair.first) cascadeinfoContainer.push_back(cascade_info_pair);
531 return StatusCode::SUCCESS;
535 size_t topoN = (m_disVDaug_num==2 ? 3 : 4);
536 if(!m_JXSubVtx) topoN--;
537 if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0) {
538 if(m_JXV0SubVtx) topoN = 4;
541 else if(m_extraTrk1MassHypo>0 && m_disVDaug_num==2) {
542 if(m_JXV0SubVtx || m_JXSubVtx) topoN = 3;
546 if(m_cascadeOutputKeys.size() != topoN) {
547 ATH_MSG_FATAL(
"Incorrect number of output cascade vertices");
548 return StatusCode::FAILURE;
550 if(!m_constrMainV && m_doPostMainVContrFit && m_cascadeOutputKeys_mvc.size() != topoN) {
551 ATH_MSG_FATAL(
"Incorrect number of output (mvc) cascade vertices");
552 return StatusCode::FAILURE;
555 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles;
int ikey(0);
558 ATH_CHECK( VtxWriteHandles[ikey].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
561 std::array<SG::WriteHandle<xAOD::VertexContainer>, 4> VtxWriteHandles_mvc;
int ikey_mvc(0);
562 if(!m_constrMainV && m_doPostMainVContrFit) {
565 ATH_CHECK( VtxWriteHandles_mvc[ikey_mvc].record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
576 if (pvContainer.
cptr()->
size()==0) {
578 return StatusCode::RECOVERABLE;
580 else primaryVertex = (*pvContainer.
cptr())[0];
588 ATH_CHECK( refPvContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
596 std::vector<const xAOD::TrackParticleContainer*> trackCols;
600 trackCols.push_back(handle.
cptr());
605 if(m_vertexV0ContainerKey.key()==
"" && m_v0VtxOutputKey.key()!=
"") {
607 ATH_CHECK( V0OutputContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()) );
614 if(jxContainer->
size()==0)
return StatusCode::SUCCESS;
617 std::vector<const xAOD::TrackParticle*> tracksDisplaced;
618 if(m_v0VtxOutputKey.key()!=
"" || m_disVDaug_num==3) {
621 if(m_v0TrkSelector->decision(*TP, primaryVertex)) {
626 if(!m_useTRT && nclus == 0)
continue;
628 bool trk_cut =
false;
629 if(nclus != 0) trk_cut =
true;
630 if(nclus == 0 && TP->pt()>=m_ptTRT) trk_cut =
true;
631 if(!trk_cut)
continue;
634 if(!d0Pass(TP,primaryVertex))
continue;
636 tracksDisplaced.push_back(TP);
647 std::vector<std::pair<const xAOD::Vertex*,V0Enum> > selectedV0Candidates;
650 if(m_vertexV0ContainerKey.key() !=
"") {
655 std::string type_V0Vtx;
656 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
659 if(type_V0Vtx ==
"Lambda") {
661 massV0 = m_V0Tools->invariantMass(vtx, m_massesV0_ppi);
662 if(massV0<m_LambdaMassLower || massV0>m_LambdaMassUpper)
continue;
664 else if(type_V0Vtx ==
"Lambdabar") {
666 massV0 = m_V0Tools->invariantMass(vtx, m_massesV0_pip);
667 if(massV0<m_LambdaMassLower || massV0>m_LambdaMassUpper)
continue;
669 else if(type_V0Vtx ==
"Ks") {
671 massV0 = m_V0Tools->invariantMass(vtx, m_massesV0_pipi);
672 if(massV0<m_KsMassLower || massV0>m_KsMassUpper)
continue;
676 if((
opt==LAMBDA ||
opt==LAMBDABAR) && m_V0Hypothesis ==
"Ks")
continue;
677 if(
opt==KS && m_V0Hypothesis ==
"Lambda")
continue;
679 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
680 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
681 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
682 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
683 if(gamma_fit==1 && gamma_mass<m_minMass_gamma && gamma_chisq/gamma_ndof<m_chi2cut_gamma)
continue;
685 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,
opt});
690 fitV0Container(V0OutputContainer.
ptr(), tracksDisplaced, trackCols);
693 std::string type_V0Vtx;
694 if(mAcc_type.
isAvailable(*vtx)) type_V0Vtx = mAcc_type(*vtx);
697 if(type_V0Vtx ==
"Lambda") {
699 massV0 = m_V0Tools->invariantMass(vtx, m_massesV0_ppi);
700 if(massV0<m_LambdaMassLower || massV0>m_LambdaMassUpper)
continue;
702 else if(type_V0Vtx ==
"Lambdabar") {
704 massV0 = m_V0Tools->invariantMass(vtx, m_massesV0_pip);
705 if(massV0<m_LambdaMassLower || massV0>m_LambdaMassUpper)
continue;
707 else if(type_V0Vtx ==
"Ks") {
709 massV0 = m_V0Tools->invariantMass(vtx, m_massesV0_pipi);
710 if(massV0<m_KsMassLower || massV0>m_KsMassUpper)
continue;
714 if((
opt==LAMBDA ||
opt==LAMBDABAR) && m_V0Hypothesis ==
"Ks")
continue;
715 if(
opt==KS && m_V0Hypothesis ==
"Lambda")
continue;
717 int gamma_fit = mAcc_gfit.
isAvailable(*vtx) ? mAcc_gfit(*vtx) : 0;
718 double gamma_mass = mAcc_gmass.
isAvailable(*vtx) ? mAcc_gmass(*vtx) : -1;
719 double gamma_chisq = mAcc_gchisq.
isAvailable(*vtx) ? mAcc_gchisq(*vtx) : 999999;
720 double gamma_ndof = mAcc_gndof.
isAvailable(*vtx) ? mAcc_gndof(*vtx) : 0;
721 if(gamma_fit==1 && gamma_mass<m_minMass_gamma && gamma_chisq/gamma_ndof<m_chi2cut_gamma)
continue;
723 selectedV0Candidates.push_back(std::pair<const xAOD::Vertex*,V0Enum>{vtx,
opt});
728 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(); } );
729 if(m_maxV0Candidates>0 && selectedV0Candidates.size()>m_maxV0Candidates) {
730 selectedV0Candidates.erase(selectedV0Candidates.begin()+m_maxV0Candidates, selectedV0Candidates.end());
732 if(selectedV0Candidates.size()==0)
return StatusCode::SUCCESS;
734 std::vector<std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*> > cascadeinfoContainer;
735 ATH_CHECK( performSearch(cascadeinfoContainer, selectedV0Candidates, tracksDisplaced) );
738 std::sort( cascadeinfoContainer.begin(), cascadeinfoContainer.end(), [](std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*>
a, std::pair<Trk::VxCascadeInfo*, Trk::VxCascadeInfo*>
b) { return a.first->fitChi2()/a.first->nDoF() < b.first->fitChi2()/b.first->nDoF(); } );
739 if(m_maxMainVCandidates>0 && cascadeinfoContainer.size()>m_maxMainVCandidates) {
740 for(
auto it=cascadeinfoContainer.begin()+m_maxMainVCandidates;
it!=cascadeinfoContainer.end();
it++) {
741 if(
it->first)
delete it->first;
742 if(
it->second)
delete it->second;
744 cascadeinfoContainer.erase(cascadeinfoContainer.begin()+m_maxMainVCandidates, cascadeinfoContainer.end());
746 if(cascadeinfoContainer.size()==0)
return StatusCode::SUCCESS;
751 helper.SetMinNTracksInPV(m_PV_minNTracks);
785 for(
auto cascade_info_pair : cascadeinfoContainer) {
786 if(cascade_info_pair.first==
nullptr) {
791 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info_pair.first->vertices();
792 if(cascadeVertices.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices");
793 for(
size_t i=0;
i<topoN;
i++) {
794 if(cascadeVertices[
i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex");
797 cascade_info_pair.first->setSVOwnership(
false);
798 const auto mainVertex = cascadeVertices[topoN-1];
799 const std::vector< std::vector<TLorentzVector> > &moms = cascade_info_pair.first->getParticleMoms();
802 int ijx = m_JXSubVtx ? topoN-2 : topoN-1;
803 if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0) {
804 if(m_JXV0SubVtx) ijx = 1;
807 else if(m_extraTrk1MassHypo>0 && m_disVDaug_num==2) {
808 if(m_JXV0SubVtx || m_JXSubVtx) ijx = 1;
812 if(m_jxDaug_num==4) jxVtx = FindVertex<4>(jxContainer.
ptr(), cascadeVertices[ijx]);
813 else if(m_jxDaug_num==3) jxVtx = FindVertex<3>(jxContainer.
ptr(), cascadeVertices[ijx]);
814 else jxVtx = FindVertex<2>(jxContainer.
ptr(), cascadeVertices[ijx]);
819 BPhysPVCascadeTools::SetVectorInfo(vtx, cascade_info_pair.first);
828 BPHYS_CHECK( vtx.
setMassErr(m_CascadeTools->invariantMassError(moms[topoN-1],cascade_info_pair.first->getCovariance()[topoN-1])) );
830 Pt_decor(*mainVertex) = m_CascadeTools->pT(moms[topoN-1]);
831 PtErr_decor(*mainVertex) = m_CascadeTools->pTError(moms[topoN-1],cascade_info_pair.first->getCovariance()[topoN-1]);
833 chi2_decor(*mainVertex) = cascade_info_pair.first->fitChi2();
834 ndof_decor(*mainVertex) = cascade_info_pair.first->nDoF();
836 if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0) {
838 lxy_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
839 lxyErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
840 a0z_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
841 a0zErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
842 a0xy_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
843 a0xyErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
844 lxy_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
845 lxyErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
846 a0z_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
847 a0zErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
848 a0xy_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
849 a0xyErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
850 lxy_SV2_decor(*cascadeVertices[2]) = m_CascadeTools->lxy(moms[2],cascadeVertices[2],mainVertex);
851 lxyErr_SV2_decor(*cascadeVertices[2]) = m_CascadeTools->lxyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
852 a0z_SV2_decor(*cascadeVertices[2]) = m_CascadeTools->a0z(moms[2],cascadeVertices[2],mainVertex);
853 a0zErr_SV2_decor(*cascadeVertices[2]) = m_CascadeTools->a0zError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
854 a0xy_SV2_decor(*cascadeVertices[2]) = m_CascadeTools->a0xy(moms[2],cascadeVertices[2],mainVertex);
855 a0xyErr_SV2_decor(*cascadeVertices[2]) = m_CascadeTools->a0xyError(moms[2],cascade_info_pair.first->getCovariance()[2],cascadeVertices[2],mainVertex);
858 lxy_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
859 lxyErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
860 a0z_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
861 a0zErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
862 a0xy_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
863 a0xyErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
864 lxy_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
865 lxyErr_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
866 a0z_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
867 a0zErr_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
868 a0xy_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
869 a0xyErr_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
872 else if(m_extraTrk1MassHypo>0 && m_disVDaug_num==2) {
874 lxy_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
875 lxyErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
876 a0z_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
877 a0zErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
878 a0xy_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
879 a0xyErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
880 lxy_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
881 lxyErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
882 a0z_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
883 a0zErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
884 a0xy_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
885 a0xyErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
888 lxy_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
889 lxyErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
890 a0z_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
891 a0zErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
892 a0xy_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
893 a0xyErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
895 lxy_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
896 lxyErr_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
897 a0z_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
898 a0zErr_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
899 a0xy_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
900 a0xyErr_SV2_decor(*cascadeVertices[1]) = m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
905 if(m_disVDaug_num==2) {
906 lxy_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],mainVertex);
907 lxyErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
908 a0z_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0z(moms[0],cascadeVertices[0],mainVertex);
909 a0zErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
910 a0xy_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0xy(moms[0],cascadeVertices[0],mainVertex);
911 a0xyErr_SV1_decor(*cascadeVertices[0]) = m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],mainVertex);
914 lxy_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
915 lxyErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->lxyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
916 a0z_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0z(moms[0],cascadeVertices[0],cascadeVertices[1]);
917 a0zErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0zError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
918 a0xy_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0xy(moms[0],cascadeVertices[0],cascadeVertices[1]);
919 a0xyErr_SV0_decor(*cascadeVertices[0]) = m_CascadeTools->a0xyError(moms[0],cascade_info_pair.first->getCovariance()[0],cascadeVertices[0],cascadeVertices[1]);
920 lxy_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->lxy(moms[1],cascadeVertices[1],mainVertex);
921 lxyErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->lxyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
922 a0xy_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0z(moms[1],cascadeVertices[1],mainVertex);
923 a0xyErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0zError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
924 a0z_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0xy(moms[1],cascadeVertices[1],mainVertex);
925 a0zErr_SV1_decor(*cascadeVertices[1]) = m_CascadeTools->a0xyError(moms[1],cascade_info_pair.first->getCovariance()[1],cascadeVertices[1],mainVertex);
929 lxy_SV2_decor(*cascadeVertices[ijx]) = m_CascadeTools->lxy(moms[ijx],cascadeVertices[ijx],mainVertex);
930 lxyErr_SV2_decor(*cascadeVertices[ijx]) = m_CascadeTools->lxyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
931 a0z_SV2_decor(*cascadeVertices[ijx]) = m_CascadeTools->a0z(moms[ijx],cascadeVertices[ijx],mainVertex);
932 a0zErr_SV2_decor(*cascadeVertices[ijx]) = m_CascadeTools->a0zError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
933 a0xy_SV2_decor(*cascadeVertices[ijx]) = m_CascadeTools->a0xy(moms[ijx],cascadeVertices[ijx],mainVertex);
934 a0xyErr_SV2_decor(*cascadeVertices[ijx]) = m_CascadeTools->a0xyError(moms[ijx],cascade_info_pair.first->getCovariance()[ijx],cascadeVertices[ijx],mainVertex);
938 chi2_V2_decor(*cascadeVertices[ijx]) = m_V0Tools->chisq(jxVtx);
939 ndof_V2_decor(*cascadeVertices[ijx]) = m_V0Tools->ndof(jxVtx);
941 double Mass_Moth = m_CascadeTools->invariantMass(moms[topoN-1]);
942 ATH_CHECK(
helper.FillCandwithRefittedVertices(m_refitPV, pvContainer.
cptr(), m_refitPV ? refPvContainer.
ptr() : 0, &(*m_pvRefitter), m_PV_max, m_DoVertexType, cascade_info_pair.first, topoN-1, Mass_Moth, vtx));
944 for(
size_t i=0;
i<topoN;
i++) {
945 VtxWriteHandles[
i].ptr()->push_back(cascadeVertices[
i]);
953 if( vertexLink1.
isValid() ) cascadeVertexLinks.push_back( vertexLink1 );
958 if( vertexLink2.
isValid() ) cascadeVertexLinks.push_back( vertexLink2 );
964 if( vertexLink3.
isValid() ) cascadeVertexLinks.push_back( vertexLink3 );
966 CascadeLinksDecor(*mainVertex) = cascadeVertexLinks;
969 if(cascade_info_pair.second) {
970 const std::vector<xAOD::Vertex*> &cascadeVertices_mvc = cascade_info_pair.second->vertices();
971 if(cascadeVertices_mvc.size() != topoN)
ATH_MSG_ERROR(
"Incorrect number of vertices (mvc)");
972 for(
size_t i=0;
i<topoN;
i++) {
973 if(cascadeVertices_mvc[
i]==
nullptr)
ATH_MSG_ERROR(
"Error null vertex (mvc)");
975 cascade_info_pair.second->setSVOwnership(
false);
976 const auto mainVertex_mvc = cascadeVertices_mvc[topoN-1];
977 const std::vector< std::vector<TLorentzVector> > &moms_mvc = cascade_info_pair.second->getParticleMoms();
979 int ijx_mvc = m_JXSubVtx ? topoN-2 : topoN-1;
980 if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0) {
981 if(m_JXV0SubVtx) ijx_mvc = 1;
982 else ijx_mvc = topoN-1;
984 else if(m_extraTrk1MassHypo>0 && m_disVDaug_num==2) {
985 if(m_JXV0SubVtx || m_JXSubVtx) ijx_mvc = 1;
986 else ijx_mvc = topoN-1;
989 if(m_jxDaug_num==4) jxVtx_mvc = FindVertex<4>(jxContainer.
ptr(), cascadeVertices_mvc[ijx_mvc]);
990 else if(m_jxDaug_num==3) jxVtx_mvc = FindVertex<3>(jxContainer.
ptr(), cascadeVertices_mvc[ijx_mvc]);
991 else jxVtx_mvc = FindVertex<2>(jxContainer.
ptr(), cascadeVertices_mvc[ijx_mvc]);
994 BPhysPVCascadeTools::SetVectorInfo(vtx_mvc, cascade_info_pair.second);
998 BPHYS_CHECK( vtx_mvc.
setMassErr(m_CascadeTools->invariantMassError(moms_mvc[topoN-1],cascade_info_pair.second->getCovariance()[topoN-1])) );
999 Pt_decor(*mainVertex_mvc) = m_CascadeTools->pT(moms_mvc[topoN-1]);
1000 PtErr_decor(*mainVertex_mvc) = m_CascadeTools->pTError(moms_mvc[topoN-1],cascade_info_pair.second->getCovariance()[topoN-1]);
1001 chi2_decor(*mainVertex_mvc) = cascade_info_pair.second->fitChi2();
1002 ndof_decor(*mainVertex_mvc) = cascade_info_pair.second->nDoF();
1004 if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0) {
1006 lxy_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1007 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1008 a0z_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1009 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1010 a0xy_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1011 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1012 lxy_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1013 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1014 a0z_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1015 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1016 a0xy_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1017 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1018 lxy_SV2_decor(*cascadeVertices_mvc[2]) = m_CascadeTools->lxy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1019 lxyErr_SV2_decor(*cascadeVertices_mvc[2]) = m_CascadeTools->lxyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1020 a0z_SV2_decor(*cascadeVertices_mvc[2]) = m_CascadeTools->a0z(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1021 a0zErr_SV2_decor(*cascadeVertices_mvc[2]) = m_CascadeTools->a0zError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1022 a0xy_SV2_decor(*cascadeVertices_mvc[2]) = m_CascadeTools->a0xy(moms_mvc[2],cascadeVertices_mvc[2],mainVertex_mvc);
1023 a0xyErr_SV2_decor(*cascadeVertices_mvc[2]) = m_CascadeTools->a0xyError(moms_mvc[2],cascade_info_pair.second->getCovariance()[2],cascadeVertices_mvc[2],mainVertex_mvc);
1026 lxy_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1027 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1028 a0z_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1029 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1030 a0xy_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1031 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1032 lxy_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1033 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1034 a0z_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1035 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1036 a0xy_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1037 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1040 else if(m_extraTrk1MassHypo>0 && m_disVDaug_num==2) {
1042 lxy_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1043 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1044 a0z_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1045 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1046 a0xy_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1047 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1048 lxy_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1049 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1050 a0z_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1051 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1052 a0xy_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1053 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1056 lxy_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1057 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1058 a0z_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1059 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1060 a0xy_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1061 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1063 lxy_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1064 lxyErr_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1065 a0z_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1066 a0zErr_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1067 a0xy_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1068 a0xyErr_SV2_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1073 if(m_disVDaug_num==2) {
1074 lxy_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1075 lxyErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1076 a0z_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1077 a0zErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1078 a0xy_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],mainVertex_mvc);
1079 a0xyErr_SV1_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],mainVertex_mvc);
1082 lxy_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1083 lxyErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->lxyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1084 a0z_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0z(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1085 a0zErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0zError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1086 a0xy_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xy(moms_mvc[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1087 a0xyErr_SV0_decor(*cascadeVertices_mvc[0]) = m_CascadeTools->a0xyError(moms_mvc[0],cascade_info_pair.second->getCovariance()[0],cascadeVertices_mvc[0],cascadeVertices_mvc[1]);
1088 lxy_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1089 lxyErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->lxyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1090 a0xy_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0z(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1091 a0xyErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0zError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1092 a0z_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xy(moms_mvc[1],cascadeVertices_mvc[1],mainVertex_mvc);
1093 a0zErr_SV1_decor(*cascadeVertices_mvc[1]) = m_CascadeTools->a0xyError(moms_mvc[1],cascade_info_pair.second->getCovariance()[1],cascadeVertices_mvc[1],mainVertex_mvc);
1096 lxy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_CascadeTools->lxy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1097 lxyErr_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_CascadeTools->lxyError(moms_mvc[ijx_mvc],cascade_info_pair.second->getCovariance()[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1098 a0z_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_CascadeTools->a0z(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1099 a0zErr_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_CascadeTools->a0zError(moms_mvc[ijx_mvc],cascade_info_pair.second->getCovariance()[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1100 a0xy_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_CascadeTools->a0xy(moms_mvc[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1101 a0xyErr_SV2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_CascadeTools->a0xyError(moms_mvc[ijx_mvc],cascade_info_pair.second->getCovariance()[ijx_mvc],cascadeVertices_mvc[ijx_mvc],mainVertex_mvc);
1104 chi2_V2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_V0Tools->chisq(jxVtx_mvc);
1105 ndof_V2_decor(*cascadeVertices_mvc[ijx_mvc]) = m_V0Tools->ndof(jxVtx_mvc);
1107 double Mass_Moth_mvc = m_CascadeTools->invariantMass(moms_mvc[topoN-1]);
1108 ATH_CHECK(
helper.FillCandwithRefittedVertices(m_refitPV, pvContainer.
cptr(), m_refitPV ? refPvContainer.
ptr() : 0, &(*m_pvRefitter), m_PV_max, m_DoVertexType, cascade_info_pair.second, topoN-1, Mass_Moth_mvc, vtx_mvc));
1110 for(
size_t i=0;
i<topoN;
i++) {
1111 VtxWriteHandles_mvc[
i].ptr()->push_back(cascadeVertices_mvc[
i]);
1116 vertexLink1_mvc.
setElement(cascadeVertices_mvc[0]);
1118 if( vertexLink1_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink1_mvc );
1121 vertexLink2_mvc.
setElement(cascadeVertices_mvc[1]);
1123 if( vertexLink2_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink2_mvc );
1127 vertexLink3_mvc.
setElement(cascadeVertices_mvc[2]);
1129 if( vertexLink3_mvc.
isValid() ) cascadeVertexLinks_mvc.push_back( vertexLink3_mvc );
1131 CascadeLinksDecor(*mainVertex_mvc) = cascadeVertexLinks_mvc;
1135 vertexLink_mvc.
setElement(cascadeVertices[topoN-1]);
1137 if( vertexLink_mvc.
isValid() ) precedingVertexLinks_mvc.push_back( vertexLink_mvc );
1138 PrecedingLinksDecor(*mainVertex_mvc) = precedingVertexLinks_mvc;
1143 for (
auto cascade_info_pair : cascadeinfoContainer) {
1144 if(cascade_info_pair.first)
delete cascade_info_pair.first;
1145 if(cascade_info_pair.second)
delete cascade_info_pair.second;
1148 return StatusCode::SUCCESS;
1153 const EventContext& ctx = Gaudi::Hive::currentContext();
1154 std::unique_ptr<Trk::Perigee> per = m_trackToVertexTool->perigeeAtVertex(ctx, *
track, PV->
position());
1155 if(!per)
return pass;
1157 double sig_d0 = sqrt((*per->covariance())(0,0));
1158 if(std::abs(
d0/sig_d0) > m_d0_cut) pass =
true;
1165 std::vector<const xAOD::TrackParticle*> tracksV0;
1168 std::vector<double> massesV0;
1169 if(V0==LAMBDA) massesV0 = m_massesV0_ppi;
1170 else if(V0==LAMBDABAR) massesV0 = m_massesV0_pip;
1171 else if(V0==KS) massesV0 = m_massesV0_pipi;
1173 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
1175 m_iVertexFitter->setRobustness(robustness, *state);
1176 std::vector<Trk::VertexID> vrtList;
1178 Trk::VertexID vID = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1179 vrtList.push_back(vID);
1181 std::vector<const xAOD::TrackParticle*> tracksDis3{track3};
1182 std::vector<double> massesDis3{m_disVDaug3MassHypo};
1183 m_iVertexFitter->nextVertex(tracksDis3,massesDis3,vrtList,*state);
1185 std::unique_ptr<Trk::VxCascadeInfo> cascade_info = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
1188 double chi2NDF = cascade_info->
fitChi2()/cascade_info->
nDoF();
1189 if(m_chi2cut_DisV<=0 || chi2NDF < m_chi2cut_DisV) {
1190 const std::vector<std::vector<TLorentzVector> > &moms = cascade_info->
getParticleMoms();
1191 const std::vector<xAOD::Vertex*> &cascadeVertices = cascade_info->
vertices();
1192 double lxy_SV1_sub = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
1193 if(lxy_SV1_sub > m_lxyV0_cut) {
1194 TLorentzVector totalMom;
1195 for(
size_t it=0;
it<moms[1].size();
it++) totalMom += moms[1][
it];
1196 double disV_mass = totalMom.M();
1197 if(m_useImprovedMass) {
1198 if((V0==LAMBDA || V0==LAMBDABAR) && m_massLd>0) disV_mass += - moms[1][1].M() + m_massLd;
1199 else if(V0==KS && m_massKs>0) disV_mass += - moms[1][1].M() + m_massKs;
1201 if(disV_mass>m_DisplacedMassLower && disV_mass<m_DisplacedMassUpper) {
1214 const Trk::Perigee& aPerigee1 = track1->perigeeParameters();
1215 const Trk::Perigee& aPerigee2 = track2->perigeeParameters();
1216 int sflag(0), errorcode(0);
1217 Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&aPerigee1,&aPerigee2,sflag,errorcode);
1218 if(errorcode) startingPoint(0) = startingPoint(1) = startingPoint(2) = 0.0;
1219 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
1222 std::unique_ptr<xAOD::Vertex> fittedVertex( m_iVertexFitter->fit(std::vector<const xAOD::TrackParticle*>{track1,track2,track3}, startingPoint, *state) );
1223 return fittedVertex;
1226 std::unique_ptr<xAOD::Vertex> fittedVertex( m_iVertexFitter->fit(std::vector<const xAOD::TrackParticle*>{track1,track2}, startingPoint, *state) );
1227 return fittedVertex;
1234 std::vector<const xAOD::TrackParticle*> tracksJX;
1238 TLorentzVector tmp1,
tmp2, tmp3;
1239 tmp1.SetPtEtaPhiM(extraTrk1->
pt(),extraTrk1->
eta(),extraTrk1->
phi(),m_extraTrk1MassHypo);
1240 tmp2.SetPtEtaPhiM(extraTrk2->
pt(),extraTrk2->
eta(),extraTrk2->
phi(),m_extraTrk2MassHypo);
1241 tmp3.SetPtEtaPhiM(extraTrk3->
pt(),extraTrk3->
eta(),extraTrk3->
phi(),m_extraTrk3MassHypo);
1242 if((tmp1+
tmp2+tmp3).M() < m_DpmMassLower || (tmp1+
tmp2+tmp3).M() > m_DpmMassUpper)
return Dpm;
1244 std::unique_ptr<xAOD::Vertex> vtx = fitTracks(extraTrk1, extraTrk2, extraTrk3);
1247 if(m_chi2cut_Dpm<=0.0 || chi2NDF < m_chi2cut_Dpm) {
1248 double lxyDpm = m_V0Tools->lxy(vtx.get(),JXvtx);
1249 if(lxyDpm>m_lxyDpm_cut) {
1252 TVector3 tot_pt; TVector3
tmp;
1260 Dpm.
pt = tot_pt.Pt();
1270 TLorentzVector tmp1,
tmp2;
1271 tmp1.SetPtEtaPhiM(extraTrk1->
pt(),extraTrk1->
eta(),extraTrk1->
phi(),m_extraTrk1MassHypo);
1272 tmp2.SetPtEtaPhiM(extraTrk2->
pt(),extraTrk2->
eta(),extraTrk2->
phi(),m_extraTrk2MassHypo);
1273 if((tmp1+
tmp2).M() < m_D0MassLower || (tmp1+
tmp2).M() > m_D0MassUpper)
return D0;
1275 std::unique_ptr<xAOD::Vertex> vtx = fitTracks(extraTrk1, extraTrk2);
1278 if(m_chi2cut_D0<=0.0 || chi2NDF < m_chi2cut_D0) {
1279 double lxyD0 = m_V0Tools->lxy(vtx.get(),JXvtx);
1280 if(lxyD0>m_lxyD0_cut) {
1281 D0.extraTrack1 = extraTrk1; D0.extraTrack2 = extraTrk2;
1282 D0.chi2NDF = chi2NDF;
1283 TVector3 tot_pt; TVector3
tmp;
1291 D0.pt = tot_pt.Pt();
1299 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> >
result;
1301 std::vector<const xAOD::TrackParticle*> tracksJX;
1304 if (tracksJX.size() != massesJX.size()) {
1305 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
1311 std::vector<const xAOD::TrackParticle*> tracksV0;
1315 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
1316 std::vector<const xAOD::TrackParticle*> tracksX;
1317 if(m_jxDaug_num>=3) tracksX.push_back(tracksJX[2]);
1318 if(m_jxDaug_num==4) tracksX.push_back(tracksJX[3]);
1320 std::vector<double> massesV0;
1322 massesV0 = m_massesV0_ppi;
1324 else if(V0==LAMBDABAR) {
1325 massesV0 = m_massesV0_pip;
1328 massesV0 = m_massesV0_pipi;
1331 TLorentzVector p4_moth, p4_v0,
tmp;
1338 p4_moth += V0_helper.
refTrk(
it,massesV0[
it]);
1363 std::vector<float> trk_px;
1364 std::vector<float> trk_py;
1365 std::vector<float> trk_pz;
1367 if(m_extraTrk1MassHypo<=0) {
1368 double main_mass = p4_moth.M();
1369 if(m_useImprovedMass) {
1370 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_v0).M() + m_massJpsi;
1371 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_v0).M() + m_massJX;
1372 if((V0==LAMBDA || V0==LAMBDABAR) && m_massLd>0) main_mass += - p4_v0.M() + m_massLd;
1373 else if(V0==KS && m_massKs>0) main_mass += - p4_v0.M() + m_massKs;
1375 if (main_mass < m_MassLower || main_mass > m_MassUpper)
return result;
1378 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
1381 m_iVertexFitter->setRobustness(robustness, *state);
1384 std::vector<Trk::VertexID> vrtList;
1389 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,V0==KS?m_massKs:m_massLd);
1391 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1393 vrtList.push_back(vID1);
1397 if (m_constrJX && m_jxDaug_num>2) {
1398 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,*state,m_massJX);
1400 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,*state);
1402 vrtList.push_back(vID2);
1404 std::vector<const xAOD::TrackParticle*>
tp;
1405 std::vector<double> tp_masses;
1407 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList,*state,m_massMainV);
1409 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList,*state);
1415 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state,m_massMainV);
1417 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state);
1419 if (m_constrJX && m_jxDaug_num>2) {
1420 std::vector<Trk::VertexID> cnstV;
1421 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
1427 std::vector<Trk::VertexID> cnstV;
1428 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
1432 if (m_constrX && m_jxDaug_num==4) {
1433 std::vector<Trk::VertexID> cnstV;
1434 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksX,cnstV,*state,m_massX).isSuccess() ) {
1439 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
1443 if(
v->nTrackParticles()==0) {
1444 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1445 v->setTrackParticleLinks(nullLinkVector);
1449 BPhysPVCascadeTools::PrepareVertexLinks(fit_result.get(), trackCols);
1455 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
1456 bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
1458 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
1459 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
1460 size_t iMoth = cascadeVertices.size()-1;
1461 double lxy_SV1 = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1462 if(chi2CutPassed && lxy_SV1>m_lxyV0_cut) {
1463 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1464 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1466 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1468 else if(V0==LAMBDABAR) {
1469 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1472 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1474 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1475 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1476 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1477 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1478 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1479 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1480 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1481 trk_px.reserve(V0_helper.
nRefTrks());
1482 trk_py.reserve(V0_helper.
nRefTrks());
1483 trk_pz.reserve(V0_helper.
nRefTrks());
1484 for(
auto&& vec3 : V0_helper.
refTrks()) {
1485 trk_px.push_back( vec3.Px() );
1486 trk_py.push_back( vec3.Py() );
1487 trk_pz.push_back( vec3.Pz() );
1489 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1490 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1491 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1493 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1497 else if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo<=0) {
1498 std::vector<double> massesExtra{m_extraTrk1MassHypo};
1499 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(m_extraTrk1MassHypo);
1502 if( tpExtra->pt()<m_extraTrk1MinPt )
continue;
1503 if( !m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
1505 if(
std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1506 if(
std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1509 tmp.SetPtEtaPhiM(tpExtra->pt(),tpExtra->eta(),tpExtra->phi(),m_extraTrk1MassHypo);
1510 double main_mass = (p4_moth+
tmp).M();
1511 if(m_useImprovedMass) {
1512 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_v0).M() + m_massJpsi;
1513 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_v0).M() + m_massJX;
1514 if((V0==LAMBDA || V0==LAMBDABAR) && m_massLd>0) main_mass += - p4_v0.M() + m_massLd;
1515 else if(V0==KS && m_massKs>0) main_mass += - p4_v0.M() + m_massKs;
1517 if(main_mass < m_MassLower || main_mass > m_MassUpper)
continue;
1519 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
1520 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
1523 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
1526 m_iVertexFitter->setRobustness(robustness, *state);
1529 std::vector<Trk::VertexID> vrtList;
1530 std::vector<Trk::VertexID> vrtList2;
1536 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,V0==KS?m_massKs:m_massLd);
1538 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1540 vrtList.push_back(vID1);
1543 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state,m_massJXV0);
1545 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state);
1547 vrtList2.push_back(vID2);
1550 m_iVertexFitter->nextVertex(tracksExtra,massesExtra,vrtList2,*state,m_massMainV);
1552 m_iVertexFitter->nextVertex(tracksExtra,massesExtra,vrtList2,*state);
1559 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,V0==KS?m_massKs:m_massLd);
1561 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1563 vrtList.push_back(vID1);
1566 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,*state);
1567 vrtList.push_back(vID2);
1570 m_iVertexFitter->nextVertex(tracksExtra,massesExtra,vrtList,*state,m_massMainV);
1572 m_iVertexFitter->nextVertex(tracksExtra,massesExtra,vrtList,*state);
1578 vID2 = m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList,*state,m_massMainV);
1580 vID2 = m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList,*state);
1584 if (m_constrJX && m_jxDaug_num>2) {
1585 std::vector<Trk::VertexID> cnstV;
1586 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
1591 std::vector<Trk::VertexID> cnstV;
1592 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
1596 if (m_constrX && m_jxDaug_num==4) {
1597 std::vector<Trk::VertexID> cnstV;
1598 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksX,cnstV,*state,m_massX).isSuccess() ) {
1603 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
1607 if(
v->nTrackParticles()==0) {
1608 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1609 v->setTrackParticleLinks(nullLinkVector);
1613 BPhysPVCascadeTools::PrepareVertexLinks(fit_result.get(), trackCols);
1619 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
1620 bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
1621 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
1622 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
1623 size_t iMoth = cascadeVertices.size()-1;
1626 lxy_SV1 = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
1629 lxy_SV1 = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1631 if(chi2CutPassed && lxy_SV1>m_lxyV0_cut) {
1632 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1633 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1635 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1637 else if(V0==LAMBDABAR) {
1638 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1641 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1643 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1644 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1645 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1646 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1647 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1648 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1649 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1650 trk_px.reserve(V0_helper.
nRefTrks());
1651 trk_py.reserve(V0_helper.
nRefTrks());
1652 trk_pz.reserve(V0_helper.
nRefTrks());
1653 for(
auto&& vec3 : V0_helper.
refTrks()) {
1654 trk_px.push_back( vec3.Px() );
1655 trk_py.push_back( vec3.Py() );
1656 trk_pz.push_back( vec3.Pz() );
1658 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1659 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1660 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1662 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1667 else if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0 && m_extraTrk3MassHypo<=0) {
1668 std::vector<const xAOD::TrackParticle*> tracksPlus;
1669 std::vector<const xAOD::TrackParticle*> tracksMinus;
1671 if( tpExtra->pt() < std::fmin(m_extraTrk1MinPt,m_extraTrk2MinPt) )
continue;
1672 if( !m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
1674 if(
std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1675 if(
std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1676 if(tpExtra->charge()>0) {
1677 tracksPlus.push_back(tpExtra);
1680 tracksMinus.push_back(tpExtra);
1685 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2;
1688 if((tp1->pt()>m_extraTrk1MinPt && tp2->pt()>m_extraTrk2MinPt) ||
1689 (tp1->pt()>m_extraTrk2MinPt && tp2->pt()>m_extraTrk1MinPt)) {
1690 p4_ExtraTrk1.SetPtEtaPhiM(tp1->pt(), tp1->eta(), tp1->phi(), m_extraTrk1MassHypo);
1691 p4_ExtraTrk2.SetPtEtaPhiM(tp2->pt(), tp2->eta(), tp2->phi(), m_extraTrk2MassHypo);
1692 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2).M();
1693 if(m_useImprovedMass) {
1694 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_v0).M() + m_massJpsi;
1695 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_v0).M() + m_massJX;
1696 if((V0==LAMBDA || V0==LAMBDABAR) && m_massLd>0) main_mass += - p4_v0.M() + m_massLd;
1697 else if(V0==KS && m_massKs>0) main_mass += - p4_v0.M() + m_massKs;
1698 if(m_massD0>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2).M() + m_massD0;
1700 if(main_mass < m_MassLower || main_mass > m_MassUpper)
continue;
1701 auto D0 = getD0Candidate(JXvtx,tp1,tp2);
1702 if(D0.extraTrack1) D0Candidates.
push_back(D0);
1707 std::vector<double> massesExtra{m_extraTrk1MassHypo,m_extraTrk2MassHypo};
1709 for(
auto&& D0 : D0Candidates.
vector()) {
1710 std::vector<const xAOD::TrackParticle*> tracksExtra{D0.extraTrack1,D0.extraTrack2};
1713 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
1716 m_iVertexFitter->setRobustness(robustness, *state);
1719 std::vector<Trk::VertexID> vrtList;
1724 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,V0==KS?m_massKs:m_massLd);
1726 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1728 vrtList.push_back(vID1);
1732 vID2 = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state,m_massD0);
1734 vID2 = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state);
1736 vrtList.push_back(vID2);
1740 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state,m_massMainV);
1742 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state);
1744 if (m_constrJX && m_jxDaug_num>2) {
1745 std::vector<Trk::VertexID> cnstV;
1746 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
1751 std::vector<Trk::VertexID> cnstV;
1752 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
1756 if (m_constrX && m_jxDaug_num==4) {
1757 std::vector<Trk::VertexID> cnstV;
1758 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksX,cnstV,*state,m_massX).isSuccess() ) {
1763 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
1767 if(
v->nTrackParticles()==0) {
1768 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
1769 v->setTrackParticleLinks(nullLinkVector);
1773 BPhysPVCascadeTools::PrepareVertexLinks(fit_result.get(), trackCols);
1779 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
1780 bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
1781 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
1782 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
1783 size_t iMoth = cascadeVertices.size()-1;
1784 double lxy_SV1 = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
1785 double lxy_SV2 = m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
1786 if(chi2CutPassed && lxy_SV1>m_lxyV0_cut && lxy_SV2>m_lxyD0_cut) {
1787 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
1788 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
1790 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
1792 else if(V0==LAMBDABAR) {
1793 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
1796 type_V1_decor(*cascadeVertices[0]) =
"Ks";
1798 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
1799 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
1800 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
1801 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
1802 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
1803 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
1804 trk_px.clear(); trk_py.clear(); trk_pz.clear();
1805 trk_px.reserve(V0_helper.
nRefTrks());
1806 trk_py.reserve(V0_helper.
nRefTrks());
1807 trk_pz.reserve(V0_helper.
nRefTrks());
1808 for(
auto&& vec3 : V0_helper.
refTrks()) {
1809 trk_px.push_back( vec3.Px() );
1810 trk_py.push_back( vec3.Py() );
1811 trk_pz.push_back( vec3.Pz() );
1813 trk_pxDeco(*cascadeVertices[0]) = trk_px;
1814 trk_pyDeco(*cascadeVertices[0]) = trk_py;
1815 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
1817 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
1822 else if(m_extraTrk1MassHypo>0 && m_extraTrk2MassHypo>0 && m_extraTrk3MassHypo>0) {
1823 std::vector<const xAOD::TrackParticle*> tracksPlus;
1824 std::vector<const xAOD::TrackParticle*> tracksMinus;
1825 double minTrkPt = std::fmin(std::fmin(m_extraTrk1MinPt,m_extraTrk2MinPt),m_extraTrk3MinPt);
1827 if( tpExtra->pt() < minTrkPt )
continue;
1828 if( !m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
1830 if(
std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
1831 if(
std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
1832 if(tpExtra->charge()>0) {
1833 tracksPlus.push_back(tpExtra);
1836 tracksMinus.push_back(tpExtra);
1841 TLorentzVector p4_ExtraTrk1, p4_ExtraTrk2, p4_ExtraTrk3;
1844 if( tp1->pt() < m_extraTrk1MinPt )
continue;
1845 for(
auto tp2Itr=tracksMinus.cbegin(); tp2Itr!=tracksMinus.cend(); ++tp2Itr) {
1847 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksMinus.cend(); ++tp3Itr) {
1849 if((tp2->
pt()>m_extraTrk2MinPt && tp3->
pt()>m_extraTrk3MinPt) ||
1850 (tp2->
pt()>m_extraTrk3MinPt && tp3->
pt()>m_extraTrk2MinPt)) {
1851 p4_ExtraTrk1.SetPtEtaPhiM(tp1->pt(), tp1->eta(), tp1->phi(), m_extraTrk1MassHypo);
1852 p4_ExtraTrk2.SetPtEtaPhiM(tp2->
pt(), tp2->
eta(), tp2->
phi(), m_extraTrk2MassHypo);
1853 p4_ExtraTrk3.SetPtEtaPhiM(tp3->
pt(), tp3->
eta(), tp3->
phi(), m_extraTrk3MassHypo);
1854 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1855 if(m_useImprovedMass) {
1856 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_v0).M() + m_massJpsi;
1857 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_v0).M() + m_massJX;
1858 if((V0==LAMBDA || V0==LAMBDABAR) && m_massLd>0) main_mass += - p4_v0.M() + m_massLd;
1859 else if(V0==KS && m_massKs>0) main_mass += - p4_v0.M() + m_massKs;
1860 if(m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() + m_massDpm;
1862 if(main_mass < m_MassLower || main_mass > m_MassUpper)
continue;
1863 auto Dpm = getDpmCandidate(JXvtx,tp1,tp2,tp3);
1864 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1871 if( tp1->pt() < m_extraTrk1MinPt )
continue;
1872 for(
auto tp2Itr=tracksPlus.cbegin(); tp2Itr!=tracksPlus.cend(); ++tp2Itr) {
1874 for(
auto tp3Itr=tp2Itr+1; tp3Itr!=tracksPlus.cend(); ++tp3Itr) {
1876 if((tp2->
pt()>m_extraTrk2MinPt && tp3->
pt()>m_extraTrk3MinPt) ||
1877 (tp2->
pt()>m_extraTrk3MinPt && tp3->
pt()>m_extraTrk2MinPt)) {
1878 p4_ExtraTrk1.SetPtEtaPhiM(tp1->pt(), tp1->eta(), tp1->phi(), m_extraTrk1MassHypo);
1879 p4_ExtraTrk2.SetPtEtaPhiM(tp2->
pt(), tp2->
eta(), tp2->
phi(), m_extraTrk2MassHypo);
1880 p4_ExtraTrk3.SetPtEtaPhiM(tp3->
pt(), tp3->
eta(), tp3->
phi(), m_extraTrk3MassHypo);
1881 double main_mass = (p4_moth+p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M();
1882 if(m_useImprovedMass) {
1883 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_v0).M() + m_massJpsi;
1884 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_v0).M() + m_massJX;
1885 if((V0==LAMBDA || V0==LAMBDABAR) && m_massLd>0) main_mass += - p4_v0.M() + m_massLd;
1886 else if(V0==KS && m_massKs>0) main_mass += - p4_v0.M() + m_massKs;
1887 if(m_massDpm>0) main_mass += - (p4_ExtraTrk1+p4_ExtraTrk2+p4_ExtraTrk3).M() + m_massDpm;
1889 if(main_mass < m_MassLower || main_mass > m_MassUpper)
continue;
1890 auto Dpm = getDpmCandidate(JXvtx,tp1,tp2,tp3);
1891 if(Dpm.extraTrack1) DpmCandidates.
push_back(Dpm);
1897 std::vector<double> massesExtra{m_extraTrk1MassHypo,m_extraTrk2MassHypo,m_extraTrk3MassHypo};
1899 for(
auto&& Dpm : DpmCandidates.
vector()) {
1900 std::vector<const xAOD::TrackParticle*> tracksExtra{Dpm.extraTrack1,Dpm.extraTrack2,Dpm.extraTrack3};
1903 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
1906 m_iVertexFitter->setRobustness(robustness, *state);
1909 std::vector<Trk::VertexID> vrtList;
1910 std::vector<Trk::VertexID> vrtList2;
1916 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,V0==KS?m_massKs:m_massLd);
1918 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1920 vrtList.push_back(vID1);
1924 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state,m_massJXV0);
1926 vID2 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state);
1928 vrtList2.push_back(vID2);
1931 vID3 = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state,m_massDpm);
1933 vID3 = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state);
1935 vrtList2.push_back(vID3);
1937 std::vector<const xAOD::TrackParticle*>
tp;
1938 std::vector<double> tp_masses;
1940 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList2,*state,m_massMainV);
1942 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList2,*state);
1944 if (m_constrJX && m_jxDaug_num>2) {
1945 std::vector<Trk::VertexID> cnstV;
1946 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
1951 std::vector<Trk::VertexID> cnstV;
1952 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
1956 if (m_constrX && m_jxDaug_num==4) {
1957 std::vector<Trk::VertexID> cnstV;
1958 if ( !m_iVertexFitter->addMassConstraint(vID2,tracksX,cnstV,*state,m_massX).isSuccess() ) {
1967 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,V0==KS?m_massKs:m_massLd);
1969 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
1971 vrtList.push_back(vID1);
1975 vID2 = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state,m_massDpm);
1977 vID2 = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state);
1979 vrtList.push_back(vID2);
1983 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state,m_massMainV);
1985 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList,*state);
1987 if (m_constrJX && m_jxDaug_num>2) {
1988 std::vector<Trk::VertexID> cnstV;
1989 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
1994 std::vector<Trk::VertexID> cnstV;
1995 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
1999 if (m_constrX && m_jxDaug_num==4) {
2000 std::vector<Trk::VertexID> cnstV;
2001 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksX,cnstV,*state,m_massX).isSuccess() ) {
2007 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
2011 if(
v->nTrackParticles()==0) {
2012 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2013 v->setTrackParticleLinks(nullLinkVector);
2017 BPhysPVCascadeTools::PrepareVertexLinks(fit_result.get(), trackCols);
2023 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
2024 bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
2025 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
2026 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
2027 size_t iMoth = cascadeVertices.size()-1;
2028 double lxy_SV1(0), lxy_SV2(0);
2030 lxy_SV1 = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2031 lxy_SV2 = m_CascadeTools->lxy(moms[2],cascadeVertices[2],cascadeVertices[iMoth]);
2034 lxy_SV1 = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[iMoth]);
2035 lxy_SV2 = m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2037 if(chi2CutPassed && lxy_SV1>m_lxyV0_cut && lxy_SV2>m_lxyDpm_cut) {
2038 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2039 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2041 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2043 else if(V0==LAMBDABAR) {
2044 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2047 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2049 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2050 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2051 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2052 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2053 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2054 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2055 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2056 trk_px.reserve(V0_helper.
nRefTrks());
2057 trk_py.reserve(V0_helper.
nRefTrks());
2058 trk_pz.reserve(V0_helper.
nRefTrks());
2059 for(
auto&& vec3 : V0_helper.
refTrks()) {
2060 trk_px.push_back( vec3.Px() );
2061 trk_py.push_back( vec3.Py() );
2062 trk_pz.push_back( vec3.Pz() );
2064 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2065 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2066 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2069 if(!m_constrMainV && m_doPostMainVContrFit) {
2070 TLorentzVector totalMom;
2071 for(
size_t it=0;
it<moms[iMoth].size();
it++) totalMom += moms[iMoth][
it];
2072 double mainV_mass = totalMom.M();
2073 if(mainV_mass>m_PostMassLower && mainV_mass<m_PostMassUpper) {
2074 std::unique_ptr<Trk::IVKalState> state_mvc = m_iVertexFitter->makeState();
2075 int robustness_mvc = 0;
2076 m_iVertexFitter->setRobustness(robustness_mvc, *state_mvc);
2077 std::vector<Trk::VertexID> vrtList_mvc;
2078 std::vector<Trk::VertexID> vrtList2_mvc;
2082 vID1_mvc = m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc,V0==KS?m_massKs:m_massLd);
2084 vID1_mvc = m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2086 vrtList_mvc.push_back(vID1_mvc);
2089 vID2_mvc = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList_mvc,*state_mvc,m_massJXV0);
2091 vID2_mvc = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList_mvc,*state_mvc);
2093 vrtList2_mvc.push_back(vID2_mvc);
2096 vID3_mvc = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc,m_massDpm);
2098 vID3_mvc = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2100 vrtList2_mvc.push_back(vID3_mvc);
2101 std::vector<const xAOD::TrackParticle*>
tp;
2102 std::vector<double> tp_masses;
2103 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList2_mvc,*state_mvc,m_massMainV);
2104 if (m_constrJX && m_jxDaug_num>2) {
2105 std::vector<Trk::VertexID> cnstV_mvc;
2106 if ( !m_iVertexFitter->addMassConstraint(vID2_mvc,tracksJX,cnstV_mvc,*state_mvc,m_massJX).isSuccess() ) {
2111 std::vector<Trk::VertexID> cnstV_mvc;
2112 if ( !m_iVertexFitter->addMassConstraint(vID2_mvc,tracksJpsi,cnstV_mvc,*state_mvc,m_massJpsi).isSuccess() ) {
2116 if (m_constrX && m_jxDaug_num==4) {
2117 std::vector<Trk::VertexID> cnstV_mvc;
2118 if ( !m_iVertexFitter->addMassConstraint(vID2_mvc,tracksX,cnstV_mvc,*state_mvc,m_massX).isSuccess() ) {
2126 vID1_mvc = m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc,V0==KS?m_massKs:m_massLd);
2128 vID1_mvc = m_iVertexFitter->startVertex(tracksV0,massesV0,*state_mvc);
2130 vrtList_mvc.push_back(vID1_mvc);
2133 vID2_mvc = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc,m_massDpm);
2135 vID2_mvc = m_iVertexFitter->nextVertex(tracksExtra,massesExtra,*state_mvc);
2137 vrtList_mvc.push_back(vID2_mvc);
2138 Trk::VertexID vID3_mvc = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList_mvc,*state_mvc,m_massMainV);
2139 if (m_constrJX && m_jxDaug_num>2) {
2140 std::vector<Trk::VertexID> cnstV_mvc;
2141 if ( !m_iVertexFitter->addMassConstraint(vID3_mvc,tracksJX,cnstV_mvc,*state_mvc,m_massJX).isSuccess() ) {
2146 std::vector<Trk::VertexID> cnstV_mvc;
2147 if ( !m_iVertexFitter->addMassConstraint(vID3_mvc,tracksJpsi,cnstV_mvc,*state_mvc,m_massJpsi).isSuccess() ) {
2151 if (m_constrX && m_jxDaug_num==4) {
2152 std::vector<Trk::VertexID> cnstV_mvc;
2153 if ( !m_iVertexFitter->addMassConstraint(vID3_mvc,tracksX,cnstV_mvc,*state_mvc,m_massX).isSuccess() ) {
2159 std::unique_ptr<Trk::VxCascadeInfo> fit_result_mvc = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state_mvc) );
2161 if (fit_result_mvc) {
2162 for(
auto&
v : fit_result_mvc->
vertices()) {
2163 if(
v->nTrackParticles()==0) {
2164 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2165 v->setTrackParticleLinks(nullLinkVector);
2168 BPhysPVCascadeTools::PrepareVertexLinks(fit_result_mvc.get(), trackCols);
2170 chi2_V1_decor(*cascadeVertices[0]) = V0vtx->
chiSquared();
2171 ndof_V1_decor(*cascadeVertices[0]) = V0vtx->
numberDoF();
2173 type_V1_decor(*cascadeVertices[0]) =
"Lambda";
2175 else if(V0==LAMBDABAR) {
2176 type_V1_decor(*cascadeVertices[0]) =
"Lambdabar";
2179 type_V1_decor(*cascadeVertices[0]) =
"Ks";
2181 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*V0vtx) ? mAcc_gfit(*V0vtx) : 0;
2182 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*V0vtx) ? mAcc_gmass(*V0vtx) : -1;
2183 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*V0vtx) ? mAcc_gmasserr(*V0vtx) : -1;
2184 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*V0vtx) ? mAcc_gchisq(*V0vtx) : 999999;
2185 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*V0vtx) ? mAcc_gndof(*V0vtx) : 0;
2186 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*V0vtx) ? mAcc_gprob(*V0vtx) : -1;
2187 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2188 trk_px.reserve(V0_helper.
nRefTrks());
2189 trk_py.reserve(V0_helper.
nRefTrks());
2190 trk_pz.reserve(V0_helper.
nRefTrks());
2191 for(
auto&& vec3 : V0_helper.
refTrks()) {
2192 trk_px.push_back( vec3.Px() );
2193 trk_py.push_back( vec3.Py() );
2194 trk_pz.push_back( vec3.Pz() );
2196 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2197 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2198 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2200 result.push_back( std::make_pair(fit_result.release(),fit_result_mvc.release()) );
2202 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2204 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2206 else result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2216 std::vector<std::pair<Trk::VxCascadeInfo*,Trk::VxCascadeInfo*> >
result;
2218 std::vector<const xAOD::TrackParticle*> tracksJX;
2221 if (tracksJX.size() != massesJX.size()) {
2222 ATH_MSG_ERROR(
"Problems with JX input: number of tracks or track mass inputs is not correct!");
2228 std::vector<const xAOD::TrackParticle*> tracksV0;
2232 if(
std::find(tracksJX.cbegin(), tracksJX.cend(), disVtx.
track) != tracksJX.cend())
return result;
2233 std::vector<const xAOD::TrackParticle*> tracks3{disVtx.
track};
2234 std::vector<double> massesDis3{m_disVDaug3MassHypo};
2236 std::vector<const xAOD::TrackParticle*> tracksJpsi{tracksJX[0], tracksJX[1]};
2237 std::vector<const xAOD::TrackParticle*> tracksX;
2238 if(m_jxDaug_num>=3) tracksX.push_back(tracksJX[2]);
2239 if(m_jxDaug_num==4) tracksX.push_back(tracksJX[3]);
2241 std::vector<double> massesV0;
2242 if(disVtx.
V0type==LAMBDA) {
2243 massesV0 = m_massesV0_ppi;
2245 else if(disVtx.
V0type==LAMBDABAR) {
2246 massesV0 = m_massesV0_pip;
2248 else if(disVtx.
V0type==KS) {
2249 massesV0 = m_massesV0_pipi;
2252 std::vector<double> massesDisV = massesV0; massesDisV.push_back(m_disVDaug3MassHypo);
2254 TLorentzVector p4_moth, p4_disV,
tmp;
2286 std::vector<float> trk_px;
2287 std::vector<float> trk_py;
2288 std::vector<float> trk_pz;
2290 if(m_extraTrk1MassHypo<=0) {
2291 double main_mass = p4_moth.M();
2292 if(m_useImprovedMass) {
2293 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_disV).M() + m_massJpsi;
2294 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_disV).M() + m_massJX;
2295 if(m_massDisV>0) main_mass += - p4_disV.M() + m_massDisV;
2297 if (main_mass < m_MassLower || main_mass > m_MassUpper)
return result;
2300 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
2303 m_iVertexFitter->setRobustness(robustness, *state);
2306 std::vector<Trk::VertexID> vrtList;
2307 std::vector<Trk::VertexID> vrtList2;
2312 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,disVtx.
V0type==KS?m_massKs:m_massLd);
2314 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
2316 vrtList.push_back(vID1);
2320 vID2 = m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state,m_massDisV);
2322 vID2 = m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2324 vrtList2.push_back(vID2);
2328 if (m_constrJX && m_jxDaug_num>2) {
2329 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,*state,m_massJX);
2331 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,*state);
2333 vrtList2.push_back(vID3);
2335 std::vector<const xAOD::TrackParticle*>
tp;
2336 std::vector<double> tp_masses;
2338 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList2,*state,m_massMainV);
2340 m_iVertexFitter->nextVertex(
tp,tp_masses,vrtList2,*state);
2346 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList2,*state,m_massMainV);
2348 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,vrtList2,*state);
2350 if (m_constrJX && m_jxDaug_num>2) {
2351 std::vector<Trk::VertexID> cnstV;
2352 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
2358 std::vector<Trk::VertexID> cnstV;
2359 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
2363 if (m_constrX && m_jxDaug_num==4) {
2364 std::vector<Trk::VertexID> cnstV;
2365 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksX,cnstV,*state,m_massX).isSuccess() ) {
2370 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
2374 if(
v->nTrackParticles()==0) {
2375 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2376 v->setTrackParticleLinks(nullLinkVector);
2380 BPhysPVCascadeTools::PrepareVertexLinks(fit_result.get(), trackCols);
2386 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
2387 bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
2389 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
2390 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
2391 size_t iMoth = cascadeVertices.size()-1;
2392 double lxy_SV1_sub = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2393 double lxy_SV1 = m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2395 if(chi2CutPassed && lxy_SV1>m_lxyDisV_cut && lxy_SV1_sub>m_lxyV0_cut) {
2398 if(disVtx.
V0type==LAMBDA) {
2399 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2401 else if(disVtx.
V0type==LAMBDABAR) {
2402 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2404 else if(disVtx.
V0type==KS) {
2405 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2407 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2408 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2409 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2410 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2411 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2412 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2413 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2417 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2418 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2419 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2420 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2421 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2422 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2424 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2429 std::vector<double> massesExtra{m_extraTrk1MassHypo};
2430 std::vector<double> massesJXExtra = massesJX; massesJXExtra.push_back(m_extraTrk1MassHypo);
2433 if ( tpExtra->pt()<m_extraTrk1MinPt )
continue;
2434 if ( !m_trkSelector->decision(*tpExtra,
nullptr) )
continue;
2436 if(
std::find(tracksJX.cbegin(),tracksJX.cend(),tpExtra) != tracksJX.cend())
continue;
2437 if(
std::find(tracksV0.cbegin(),tracksV0.cend(),tpExtra) != tracksV0.cend())
continue;
2438 if(tpExtra == disVtx.
track)
continue;
2441 tmp.SetPtEtaPhiM(tpExtra->pt(),tpExtra->eta(),tpExtra->phi(),m_extraTrk1MassHypo);
2442 double main_mass = (p4_moth+
tmp).M();
2443 if(m_useImprovedMass) {
2444 if(m_jxDaug_num==2 && m_massJpsi>0) main_mass += - (p4_moth - p4_disV).M() + m_massJpsi;
2445 else if(m_jxDaug_num>=3 && m_massJX>0) main_mass += - (p4_moth - p4_disV).M() + m_massJX;
2446 if(m_massDisV>0) main_mass += - p4_disV.M() + m_massDisV;
2448 if (main_mass < m_MassLower || main_mass > m_MassUpper)
continue;
2450 std::vector<const xAOD::TrackParticle*> tracksExtra{tpExtra};
2451 std::vector<const xAOD::TrackParticle*> tracksJXExtra = tracksJX; tracksJXExtra.push_back(tpExtra);
2454 std::unique_ptr<Trk::IVKalState> state = m_iVertexFitter->makeState();
2457 m_iVertexFitter->setRobustness(robustness, *state);
2460 std::vector<Trk::VertexID> vrtList;
2461 std::vector<Trk::VertexID> vrtList2;
2466 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state,disVtx.
V0type==KS?m_massKs:m_massLd);
2468 vID1 = m_iVertexFitter->startVertex(tracksV0,massesV0,*state);
2470 vrtList.push_back(vID1);
2474 vID2 = m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state,m_massDisV);
2476 vID2 = m_iVertexFitter->nextVertex(tracks3,massesDis3,vrtList,*state);
2478 vrtList2.push_back(vID2);
2482 vID3 = m_iVertexFitter->nextVertex(tracksJX,massesJX,*state);
2483 vrtList2.push_back(vID3);
2486 m_iVertexFitter->nextVertex(tracksExtra,massesExtra,vrtList2,*state,m_massMainV);
2488 m_iVertexFitter->nextVertex(tracksExtra,massesExtra,vrtList2,*state);
2494 vID3 = m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList2,*state,m_massMainV);
2496 vID3 = m_iVertexFitter->nextVertex(tracksJXExtra,massesJXExtra,vrtList2,*state);
2499 if (m_constrJX && m_jxDaug_num>2) {
2500 std::vector<Trk::VertexID> cnstV;
2501 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJX,cnstV,*state,m_massJX).isSuccess() ) {
2506 std::vector<Trk::VertexID> cnstV;
2507 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksJpsi,cnstV,*state,m_massJpsi).isSuccess() ) {
2511 if (m_constrX && m_jxDaug_num==4) {
2512 std::vector<Trk::VertexID> cnstV;
2513 if ( !m_iVertexFitter->addMassConstraint(vID3,tracksX,cnstV,*state,m_massX).isSuccess() ) {
2518 std::unique_ptr<Trk::VxCascadeInfo> fit_result = std::unique_ptr<Trk::VxCascadeInfo>( m_iVertexFitter->fitCascade(*state) );
2522 if(
v->nTrackParticles()==0) {
2523 std::vector<ElementLink<xAOD::TrackParticleContainer> > nullLinkVector;
2524 v->setTrackParticleLinks(nullLinkVector);
2528 BPhysPVCascadeTools::PrepareVertexLinks(fit_result.get(), trackCols);
2534 double chi2DOF = fit_result->
fitChi2()/fit_result->
nDoF();
2535 bool chi2CutPassed = (m_chi2cut <= 0.0 || chi2DOF < m_chi2cut);
2537 const std::vector<std::vector<TLorentzVector> > &moms = fit_result->
getParticleMoms();
2538 const std::vector<xAOD::Vertex*> &cascadeVertices = fit_result->
vertices();
2539 size_t iMoth = cascadeVertices.size()-1;
2540 double lxy_SV1_sub = m_CascadeTools->lxy(moms[0],cascadeVertices[0],cascadeVertices[1]);
2541 double lxy_SV1 = m_CascadeTools->lxy(moms[1],cascadeVertices[1],cascadeVertices[iMoth]);
2543 if(chi2CutPassed && lxy_SV1>m_lxyDisV_cut && lxy_SV1_sub>m_lxyV0_cut) {
2546 if(disVtx.
V0type==LAMBDA) {
2547 type_V0_decor(*cascadeVertices[0]) =
"Lambda";
2549 else if(disVtx.
V0type==LAMBDABAR) {
2550 type_V0_decor(*cascadeVertices[0]) =
"Lambdabar";
2552 else if(disVtx.
V0type==KS) {
2553 type_V0_decor(*cascadeVertices[0]) =
"Ks";
2555 mDec_gfit(*cascadeVertices[0]) = mAcc_gfit.
isAvailable(*disVtx.
V0vtx) ? mAcc_gfit(*disVtx.
V0vtx) : 0;
2556 mDec_gmass(*cascadeVertices[0]) = mAcc_gmass.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmass(*disVtx.
V0vtx) : -1;
2557 mDec_gmasserr(*cascadeVertices[0]) = mAcc_gmasserr.
isAvailable(*disVtx.
V0vtx) ? mAcc_gmasserr(*disVtx.
V0vtx) : -1;
2558 mDec_gchisq(*cascadeVertices[0]) = mAcc_gchisq.
isAvailable(*disVtx.
V0vtx) ? mAcc_gchisq(*disVtx.
V0vtx) : 999999;
2559 mDec_gndof(*cascadeVertices[0]) = mAcc_gndof.
isAvailable(*disVtx.
V0vtx) ? mAcc_gndof(*disVtx.
V0vtx) : 0;
2560 mDec_gprob(*cascadeVertices[0]) = mAcc_gprob.
isAvailable(*disVtx.
V0vtx) ? mAcc_gprob(*disVtx.
V0vtx) : -1;
2561 trk_px.clear(); trk_py.clear(); trk_pz.clear();
2565 trk_pxDeco(*cascadeVertices[0]) = trk_px;
2566 trk_pyDeco(*cascadeVertices[0]) = trk_py;
2567 trk_pzDeco(*cascadeVertices[0]) = trk_pz;
2568 trk_px_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Px();
2569 trk_py_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Py();
2570 trk_pz_deco(*cascadeVertices[1]) = disVtx.
p4_disVtrack.Pz();
2572 result.push_back( std::make_pair(fit_result.release(),
nullptr) );
2581 void JpsiXPlusDisplaced::fitV0Container(
xAOD::VertexContainer* V0ContainerNew,
const std::vector<const xAOD::TrackParticle*>& selectedTracks,
const std::vector<const xAOD::TrackParticleContainer*>& trackCols)
const {
2582 const EventContext& ctx = Gaudi::Hive::currentContext();
2592 std::vector<const xAOD::TrackParticle*> posTracks;
2593 std::vector<const xAOD::TrackParticle*> negTracks;
2595 if(TP->charge()>0) posTracks.push_back(TP);
2596 else negTracks.push_back(TP);
2600 const Trk::Perigee& aPerigee1 = TP1->perigeeParameters();
2602 const Trk::Perigee& aPerigee2 = TP2->perigeeParameters();
2603 int sflag(0), errorcode(0);
2604 Amg::Vector3D startingPoint = m_vertexEstimator->getCirclesIntersectionPoint(&aPerigee1,&aPerigee2,sflag,errorcode);
2605 if (errorcode != 0) {startingPoint(0) = 0.0; startingPoint(1) = 0.0; startingPoint(2) = 0.0;}
2607 if (errorcode == 0 || errorcode == 5 || errorcode == 6 || errorcode == 8) {
2609 const Trk::TrackParameters* extrapolatedPerigee1 = m_extrapolator->extrapolate(ctx,TP1->perigeeParameters(), perigeeSurface).release();
2610 const Trk::TrackParameters* extrapolatedPerigee2 = m_extrapolator->extrapolate(ctx,TP2->perigeeParameters(), perigeeSurface).release();
2611 std::vector<std::unique_ptr<const Trk::TrackParameters> > cleanup;
2612 if(!extrapolatedPerigee1) extrapolatedPerigee1 = &TP1->perigeeParameters();
2613 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee1));
2614 if(!extrapolatedPerigee2) extrapolatedPerigee2 = &TP2->perigeeParameters();
2615 else cleanup.push_back(std::unique_ptr<const Trk::TrackParameters>(extrapolatedPerigee2));
2616 if(extrapolatedPerigee1 && extrapolatedPerigee2) {
2618 TLorentzVector v1; TLorentzVector
v2;
2620 v1.SetXYZM(extrapolatedPerigee1->
momentum().x(),extrapolatedPerigee1->
momentum().y(),extrapolatedPerigee1->
momentum().z(),m_mass_proton);
2621 v2.SetXYZM(extrapolatedPerigee2->
momentum().x(),extrapolatedPerigee2->
momentum().y(),extrapolatedPerigee2->
momentum().z(),m_mass_pion);
2622 if((v1+
v2).M()>1030.0 && (v1+
v2).M()<1200.0) pass =
true;
2625 v1.SetXYZM(extrapolatedPerigee1->
momentum().x(),extrapolatedPerigee1->
momentum().y(),extrapolatedPerigee1->
momentum().z(),m_mass_pion);
2626 v2.SetXYZM(extrapolatedPerigee2->
momentum().x(),extrapolatedPerigee2->
momentum().y(),extrapolatedPerigee2->
momentum().z(),m_mass_proton);
2627 if((v1+
v2).M()>1030.0 && (v1+
v2).M()<1200.0) pass =
true;
2630 v1.SetXYZM(extrapolatedPerigee1->
momentum().x(),extrapolatedPerigee1->
momentum().y(),extrapolatedPerigee1->
momentum().z(),m_mass_pion);
2631 v2.SetXYZM(extrapolatedPerigee2->
momentum().x(),extrapolatedPerigee2->
momentum().y(),extrapolatedPerigee2->
momentum().z(),m_mass_pion);
2632 if((v1+
v2).M()>430.0 && (v1+
v2).M()<565.0) pass =
true;
2635 std::vector<const xAOD::TrackParticle*> tracksV0;
2636 tracksV0.push_back(TP1); tracksV0.push_back(TP2);
2637 std::unique_ptr<xAOD::Vertex> V0vtx = std::unique_ptr<xAOD::Vertex>( m_iV0Fitter->fit(tracksV0, startingPoint) );
2640 if(chi2DOF>m_chi2cut_V0)
continue;
2642 double massSig_V0_Lambda1 = std::abs(m_V0Tools->invariantMass(V0vtx.get(), m_massesV0_ppi)-m_mass_Lambda)/m_V0Tools->invariantMassError(V0vtx.get(), m_massesV0_ppi);
2643 double massSig_V0_Lambda2 = std::abs(m_V0Tools->invariantMass(V0vtx.get(), m_massesV0_pip)-m_mass_Lambda)/m_V0Tools->invariantMassError(V0vtx.get(), m_massesV0_pip);
2644 double massSig_V0_Ks = std::abs(m_V0Tools->invariantMass(V0vtx.get(), m_massesV0_pipi)-m_mass_Ks)/m_V0Tools->invariantMassError(V0vtx.get(), m_massesV0_pipi);
2645 if(massSig_V0_Lambda1<=massSig_V0_Lambda2 && massSig_V0_Lambda1<=massSig_V0_Ks) {
2646 mDec_type(*V0vtx.get()) =
"Lambda";
2648 else if(massSig_V0_Lambda2<=massSig_V0_Lambda1 && massSig_V0_Lambda2<=massSig_V0_Ks) {
2649 mDec_type(*V0vtx.get()) =
"Lambdabar";
2651 else if(massSig_V0_Ks<=massSig_V0_Lambda1 && massSig_V0_Ks<=massSig_V0_Lambda2) {
2652 mDec_type(*V0vtx.get()) =
"Ks";
2655 int gamma_fit = 0;
int gamma_ndof = 0;
double gamma_chisq = 999999.;
2656 double gamma_prob = -1., gamma_mass = -1., gamma_massErr = -1.;
2657 std::unique_ptr<xAOD::Vertex> gammaVtx = std::unique_ptr<xAOD::Vertex>( m_iGammaFitter->fit(tracksV0, m_V0Tools->vtx(V0vtx.get())) );
2660 gamma_mass = m_V0Tools->invariantMass(gammaVtx.get(),m_mass_e,m_mass_e);
2661 gamma_massErr = m_V0Tools->invariantMassError(gammaVtx.get(),m_mass_e,m_mass_e);
2662 gamma_chisq = m_V0Tools->chisq(gammaVtx.get());
2663 gamma_ndof = m_V0Tools->ndof(gammaVtx.get());
2664 gamma_prob = m_V0Tools->vertexProbability(gammaVtx.get());
2666 mDec_gfit(*V0vtx.get()) = gamma_fit;
2667 mDec_gmass(*V0vtx.get()) = gamma_mass;
2668 mDec_gmasserr(*V0vtx.get()) = gamma_massErr;
2669 mDec_gchisq(*V0vtx.get()) = gamma_chisq;
2670 mDec_gndof(*V0vtx.get()) = gamma_ndof;
2671 mDec_gprob(*V0vtx.get()) = gamma_prob;
2676 if(not trackCols.empty()){
2678 JpsiUpsilonCommon::RelinkVertexTracks(trackCols, V0vtx.get());
2679 }
catch (std::runtime_error
const&
e) {
2685 V0ContainerNew->
push_back(std::move(V0vtx));
2694 template<
size_t NTracks>
2697 assert(v1->nTrackParticles() == NTracks);
2698 std::array<const xAOD::TrackParticle*, NTracks> a1;
2699 std::array<const xAOD::TrackParticle*, NTracks> a2;
2700 for(
size_t i=0;
i<NTracks;
i++){
2701 a1[
i] = v1->trackParticle(
i);
2702 a2[
i] =
v->trackParticle(
i);
2704 std::sort(a1.begin(), a1.end());
2705 std::sort(a2.begin(), a2.end());
2706 if(a1 == a2)
return v1;