15 #include "AthLinks/ElementLink.h"
18 #include "VrtSecInclusive/Constants.h"
60 return StatusCode::SUCCESS;
65 const EventContext& ctx = Gaudi::Hive::currentContext();
74 ATH_CHECK(JPsiMuonContainer.
record(std::make_unique<xAOD::MuonContainer>(), std::make_unique<xAOD::MuonAuxContainer>()));
77 ATH_CHECK(JPsiVertexContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
80 ATH_CHECK(JPsiTrackParticleContainer.
record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
83 auto jpsiVtxs = std::make_unique<xAOD::VertexContainer>();
84 auto jpsiAux = std::make_unique<xAOD::VertexAuxContainer>();
85 jpsiVtxs->setStore(jpsiAux.get());
88 if (jpsiVtxs->empty()) {
90 return StatusCode::SUCCESS;
92 ATH_MSG_DEBUG(
"Found " << jpsiVtxs->size() <<
" J/Psi candidates");
96 const auto&
links = vtx->trackParticleLinks();
97 if (
links.size() == 2) {
104 ATH_MSG_WARNING(
"No muons found for J/Psi vertex with index " << vtx->index());
106 }
else if (!mu1 || !mu2) {
107 ATH_MSG_WARNING(
"Only one muon found for J/Psi vertex with index " << vtx->index());
109 ATH_MSG_DEBUG(
"Found J/Psi vertex with index " << vtx->index() <<
" and muons: " << mu1->
index() <<
", " << mu2->
index());
128 for (
const auto& link : vtx->trackParticleLinks()) {
129 if (!link.isValid())
continue;
133 JPsiTrackParticleContainer->
push_back(newTrack);
139 constexpr
double muonMass = 105.658;
140 TLorentzVector sumP4_muon, sumP4_electron, sumP4_selected;
141 std::vector<const xAOD::TrackParticle*> vtxTracks;
147 if (!
track)
continue;
153 TLorentzVector p4_muon, p4_electron;
154 p4_muon.SetPtEtaPhiM(
pt,
eta,
phi, muonMass);
157 sumP4_muon += p4_muon;
158 sumP4_electron += p4_electron;
159 sumP4_selected += p4_muon;
161 vtxCharge +=
track->charge();
162 vtxTracks.push_back(
track);
167 if (vtxTracks.size() == 2) {
168 float dEta = vtxTracks[0]->eta() - vtxTracks[1]->eta();
169 float dPhi = std::abs(vtxTracks[0]->
phi() - vtxTracks[1]->
phi());
174 vtx_pxAcc(*newVtx) = sumP4_muon.Px();
175 vtx_pyAcc(*newVtx) = sumP4_muon.Py();
176 vtx_pzAcc(*newVtx) = sumP4_muon.Pz();
177 vtx_massAcc(*newVtx) = sumP4_muon.M();
178 vtx_chargeAcc(*newVtx) = vtxCharge;
179 minOpAngAcc(*newVtx) = vtxDeltaR;
180 chi2_coreAcc(*newVtx) = vtx->chiSquared();
181 ndof_coreAcc(*newVtx) = vtx->numberDoF();
182 chi2_assocAcc(*newVtx) = vtx->chiSquared();
183 ndof_assocAcc(*newVtx) = vtx->numberDoF();
184 massAcc(*newVtx) = sumP4_muon.M();
185 mass_eAcc(*newVtx) = sumP4_electron.M();
186 mass_selectedTracksAcc(*newVtx) = sumP4_selected.M();
187 num_trksAcc(*newVtx) =
links.size();
188 num_selectedTracksAcc(*newVtx) =
links.size();
189 num_associatedTracksAcc(*newVtx) =
links.size();
190 dCloseVrtAcc(*newVtx) = 0;
193 return StatusCode::SUCCESS;
198 if (
mu->trackParticle(xAOD::Muon::CombinedTrackParticle) ==
tp)
return mu;
199 if (
mu->trackParticle(xAOD::Muon::InnerDetectorTrackParticle) ==
tp)
return mu;