Execute method.
63 {
64
65
68
69 SG::ReadHandle<xAOD::EventInfo> evtInfo(
m_eventInfo, ctx);
71
73 ATH_CHECK(JPsiMuonContainer.record(std::make_unique<xAOD::MuonContainer>(), std::make_unique<xAOD::MuonAuxContainer>()));
74
76 ATH_CHECK(JPsiVertexContainer.record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
77
79 ATH_CHECK(JPsiTrackParticleContainer.record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
80
81
82 auto jpsiVtxs = std::make_unique<xAOD::VertexContainer>();
83 auto jpsiAux = std::make_unique<xAOD::VertexAuxContainer>();
84 jpsiVtxs->setStore(jpsiAux.get());
86
87 if (jpsiVtxs->empty()) {
89 return StatusCode::SUCCESS;
90 } else {
91 ATH_MSG_DEBUG(
"Found " << jpsiVtxs->size() <<
" J/Psi candidates");
92 }
93
95 const auto&
links = vtx->trackParticleLinks();
96 if (
links.size() == 2) {
101
102 if (!mu1 && !mu2) {
103 ATH_MSG_WARNING(
"No muons found for J/Psi vertex with index " << vtx->index());
104 continue;
105 } else if (!mu1 || !mu2) {
106 ATH_MSG_WARNING(
"Only one muon found for J/Psi vertex with index " << vtx->index());
107 } else {
108 ATH_MSG_DEBUG(
"Found J/Psi vertex with index " << vtx->index() <<
" and muons: " << mu1->index() <<
", " << mu2->index());
109 }
110
111 if (mu1) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu1));
112 if (mu2) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu2));
113 }
114
115
116
118 JPsiVertexContainer->push_back(newVtx);
119
120
125
126
127 for (const auto& link : vtx->trackParticleLinks()) {
128 if (!
link.isValid())
continue;
131 newTrack->makePrivateStore(*oldTrack);
132 JPsiTrackParticleContainer->push_back(newTrack);
133 ElementLink<xAOD::TrackParticleContainer> newLink(*JPsiTrackParticleContainer, newTrack->index());
135 }
136
137
138 constexpr double muonMass = 105.658;
139 TLorentzVector sumP4_muon, sumP4_electron, sumP4_selected;
140 std::vector<const xAOD::TrackParticle*> vtxTracks;
141
142 int vtxCharge = 0;
143
146 if (!track) continue;
147
151
152 TLorentzVector p4_muon, p4_electron;
153 p4_muon.SetPtEtaPhiM(pt,
eta,
phi, muonMass);
155
156 sumP4_muon += p4_muon;
157 sumP4_electron += p4_electron;
158 sumP4_selected += p4_muon;
159
160 vtxCharge +=
track->charge();
161 vtxTracks.push_back(track);
162 }
163
164
165 float vtxDeltaR = 0;
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());
170 vtxDeltaR = std::sqrt(dEta * dEta + dPhi * dPhi);
171 }
172
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;
190 }
191
192 return StatusCode::SUCCESS;
193}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
xAOD::MuonContainer * muonContainer
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_JPsiTrackParticleContainer
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainer
SG::WriteHandleKey< xAOD::VertexContainer > m_JPsiVertexContainer
const xAOD::Muon * findMuonFromTrack(const xAOD::TrackParticle *tp, const xAOD::MuonContainer *muons)
ToolHandle< Analysis::JpsiFinder > m_JPsiFinderTool
SG::WriteHandleKey< xAOD::MuonContainer > m_JPsiMuonContainer
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
void setVertexType(VxType::VertexType vType)
Set the type of the vertex.
void setCovariance(const std::vector< float > &value)
Sets the covariance matrix as a simple vector of values.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
pointer & link(pointer p) const
Return a reference to the link for an element.
bool dPhi(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
bool dEta(const xAOD::TauJet &tau, const xAOD::CaloVertexedTopoCluster &cluster, float &out)
constexpr double mass_electron
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
Muon_v1 Muon
Reference the current persistent version: