73 ATH_MSG_DEBUG(
"Executing MuSAVtxJPsiValidationAlg for event");
81 ATH_CHECK(JPsiMuonContainer.
record(std::make_unique<xAOD::MuonContainer>(), std::make_unique<xAOD::MuonAuxContainer>()));
84 ATH_CHECK(JPsiVertexContainer.
record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
87 ATH_CHECK(JPsiTrackParticleContainer.
record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
90 auto jpsiVtxs = std::make_unique<xAOD::VertexContainer>();
91 auto jpsiAux = std::make_unique<xAOD::VertexAuxContainer>();
92 jpsiVtxs->setStore(jpsiAux.get());
95 if (jpsiVtxs->empty()) {
97 return StatusCode::SUCCESS;
99 ATH_MSG_DEBUG(
"Found " << jpsiVtxs->size() <<
" J/Psi candidates");
103 std::vector<SG::WriteDecorHandle<xAOD::VertexContainer, char>> decors;
106 ATH_MSG_DEBUG(
"Creating WriteDecorHandle for key: " << key.key());
107 decors.emplace_back(key, ctx);
111 const auto& links = vtx->trackParticleLinks();
113 if (links.size() == 2) {
120 ATH_MSG_WARNING(
"No muons found for J/Psi vertex with index " << vtx->index());
122 }
else if (!mu1 || !mu2) {
123 ATH_MSG_WARNING(
"Only one muon found for J/Psi vertex with index " << vtx->index());
125 ATH_MSG_DEBUG(
"Found J/Psi vertex with index " << vtx->index() <<
" and muons: " << mu1->index() <<
", " << mu2->index());
128 if (mu1) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu1));
129 if (mu2) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu2));
134 if (
m_tdt->isPassed(chain)) {
136 bool matched =
m_matchTool->match(std::vector<const xAOD::IParticle*>{mu1, mu2}, chain,
m_dR);
137 ATH_MSG_DEBUG(
"Trigger chain " << chain <<
" matched: " << (matched ?
"Yes" :
"No"));
138 isTriggerMatched[iChain] = matched;
147 JPsiVertexContainer->push_back(newVtx);
157 decors[iChain](*newVtx) = isTriggerMatched[iChain];
161 for (
const auto& link : vtx->trackParticleLinks()) {
162 if (!link.isValid())
continue;
165 newTrack->makePrivateStore(*oldTrack);
166 JPsiTrackParticleContainer->push_back(newTrack);
172 constexpr double muonMass = 105.658;
173 TLorentzVector sumP4_muon, sumP4_electron, sumP4_selected;
174 std::vector<const xAOD::TrackParticle*> vtxTracks;
180 if (!track)
continue;
182 double pt = track->pt();
183 double eta = track->eta();
184 double phi = track->phi();
186 TLorentzVector p4_muon, p4_electron;
187 p4_muon.SetPtEtaPhiM(pt,
eta,
phi, muonMass);
190 sumP4_muon += p4_muon;
191 sumP4_electron += p4_electron;
192 sumP4_selected += p4_muon;
194 vtxCharge += track->charge();
195 vtxTracks.push_back(track);
200 if (vtxTracks.size() == 2) {
201 float dEta = vtxTracks[0]->eta() - vtxTracks[1]->eta();
202 float dPhi = std::abs(vtxTracks[0]->
phi() - vtxTracks[1]->
phi());
203 if (dPhi >
M_PI) dPhi = 2 *
M_PI - dPhi;
204 vtxDeltaR = std::sqrt(dEta * dEta + dPhi * dPhi);
207 vtx_pxAcc(*newVtx) = sumP4_muon.Px();
208 vtx_pyAcc(*newVtx) = sumP4_muon.Py();
209 vtx_pzAcc(*newVtx) = sumP4_muon.Pz();
210 vtx_massAcc(*newVtx) = sumP4_muon.M();
211 vtx_chargeAcc(*newVtx) = vtxCharge;
212 minOpAngAcc(*newVtx) = vtxDeltaR;
213 chi2_coreAcc(*newVtx) = vtx->chiSquared();
214 ndof_coreAcc(*newVtx) = vtx->numberDoF();
215 chi2_assocAcc(*newVtx) = vtx->chiSquared();
216 ndof_assocAcc(*newVtx) = vtx->numberDoF();
217 massAcc(*newVtx) = sumP4_muon.M();
218 mass_eAcc(*newVtx) = sumP4_electron.M();
219 mass_selectedTracksAcc(*newVtx) = sumP4_selected.M();
220 num_trksAcc(*newVtx) = links.size();
221 num_selectedTracksAcc(*newVtx) = links.size();
222 num_associatedTracksAcc(*newVtx) = links.size();
223 dCloseVrtAcc(*newVtx) = 0;
226 return StatusCode::SUCCESS;