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());
112 if (mu1) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu1));
113 if (mu2) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu2));
119 JPsiVertexContainer->push_back(newVtx);
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;
149 double pt = track->pt();
150 double eta = track->eta();
151 double phi = track->phi();
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());
170 if (dPhi >
M_PI) dPhi = 2 *
M_PI - dPhi;
171 vtxDeltaR = std::sqrt(dEta * dEta + dPhi * dPhi);
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;