73 ATH_CHECK(JPsiMuonContainer.
record(std::make_unique<xAOD::MuonContainer>(), std::make_unique<xAOD::MuonAuxContainer>()));
76 ATH_CHECK(JPsiVertexContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
79 ATH_CHECK(JPsiTrackParticleContainer.
record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
82 auto jpsiVtxs = std::make_unique<xAOD::VertexContainer>();
83 auto jpsiAux = std::make_unique<xAOD::VertexAuxContainer>();
84 jpsiVtxs->setStore(jpsiAux.get());
87 if (jpsiVtxs->empty()) {
89 return StatusCode::SUCCESS;
91 ATH_MSG_DEBUG(
"Found " << jpsiVtxs->size() <<
" J/Psi candidates");
95 const auto& links = vtx->trackParticleLinks();
96 if (links.size() == 2) {
103 ATH_MSG_WARNING(
"No muons found for J/Psi vertex with index " << vtx->index());
105 }
else if (!mu1 || !mu2) {
106 ATH_MSG_WARNING(
"Only one muon found for J/Psi vertex with index " << vtx->index());
108 ATH_MSG_DEBUG(
"Found J/Psi vertex with index " << vtx->index() <<
" and muons: " << mu1->index() <<
", " << mu2->index());
111 if (mu1) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu1));
112 if (mu2) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu2));
118 JPsiVertexContainer->push_back(newVtx);
127 for (
const auto& link : vtx->trackParticleLinks()) {
128 if (!link.isValid())
continue;
131 newTrack->makePrivateStore(*oldTrack);
132 JPsiTrackParticleContainer->push_back(newTrack);
138 constexpr double muonMass = 105.658;
139 TLorentzVector sumP4_muon, sumP4_electron, sumP4_selected;
140 std::vector<const xAOD::TrackParticle*> vtxTracks;
146 if (!track)
continue;
148 double pt = track->pt();
149 double eta = track->eta();
150 double phi = track->phi();
152 TLorentzVector p4_muon, p4_electron;
153 p4_muon.SetPtEtaPhiM(pt,
eta,
phi, muonMass);
156 sumP4_muon += p4_muon;
157 sumP4_electron += p4_electron;
158 sumP4_selected += p4_muon;
160 vtxCharge += track->charge();
161 vtxTracks.push_back(track);
166 if (vtxTracks.size() == 2) {
167 float dEta = vtxTracks[0]->eta() - vtxTracks[1]->eta();
168 float dPhi = std::abs(vtxTracks[0]->
phi() - vtxTracks[1]->
phi());
169 if (dPhi >
M_PI) dPhi = 2 *
M_PI - dPhi;
170 vtxDeltaR = std::sqrt(dEta * dEta + dPhi * dPhi);
173 vtx_pxAcc(*newVtx) = sumP4_muon.Px();
174 vtx_pyAcc(*newVtx) = sumP4_muon.Py();
175 vtx_pzAcc(*newVtx) = sumP4_muon.Pz();
176 vtx_massAcc(*newVtx) = sumP4_muon.M();
177 vtx_chargeAcc(*newVtx) = vtxCharge;
178 minOpAngAcc(*newVtx) = vtxDeltaR;
179 chi2_coreAcc(*newVtx) = vtx->chiSquared();
180 ndof_coreAcc(*newVtx) = vtx->numberDoF();
181 chi2_assocAcc(*newVtx) = vtx->chiSquared();
182 ndof_assocAcc(*newVtx) = vtx->numberDoF();
183 massAcc(*newVtx) = sumP4_muon.M();
184 mass_eAcc(*newVtx) = sumP4_electron.M();
185 mass_selectedTracksAcc(*newVtx) = sumP4_selected.M();
186 num_trksAcc(*newVtx) = links.size();
187 num_selectedTracksAcc(*newVtx) = links.size();
188 num_associatedTracksAcc(*newVtx) = links.size();
189 dCloseVrtAcc(*newVtx) = 0;
192 return StatusCode::SUCCESS;