63 {
64
65 const EventContext& ctx = Gaudi::Hive::currentContext();
66
69
70 SG::ReadHandle<xAOD::EventInfo> evtInfo(
m_eventInfo, ctx);
72
74 ATH_CHECK(JPsiMuonContainer.record(std::make_unique<xAOD::MuonContainer>(), std::make_unique<xAOD::MuonAuxContainer>()));
75
77 ATH_CHECK(JPsiVertexContainer.record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
78
80 ATH_CHECK(JPsiTrackParticleContainer.record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
81
82
83 auto jpsiVtxs = std::make_unique<xAOD::VertexContainer>();
84 auto jpsiAux = std::make_unique<xAOD::VertexAuxContainer>();
85 jpsiVtxs->setStore(jpsiAux.get());
87
88 if (jpsiVtxs->empty()) {
90 return StatusCode::SUCCESS;
91 } else {
92 ATH_MSG_DEBUG(
"Found " << jpsiVtxs->size() <<
" J/Psi candidates");
93 }
94
96 const auto&
links = vtx->trackParticleLinks();
97 if (
links.size() == 2) {
102
103 if (!mu1 && !mu2) {
104 ATH_MSG_WARNING(
"No muons found for J/Psi vertex with index " << vtx->index());
105 continue;
106 } else if (!mu1 || !mu2) {
107 ATH_MSG_WARNING(
"Only one muon found for J/Psi vertex with index " << vtx->index());
108 } else {
109 ATH_MSG_DEBUG(
"Found J/Psi vertex with index " << vtx->index() <<
" and muons: " << mu1->
index() <<
", " << mu2->
index());
110 }
111
112 if (mu1) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu1));
113 if (mu2) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu2));
114 }
115
116
117
119 JPsiVertexContainer->push_back(newVtx);
120
121
126
127
128 for (const auto& link : vtx->trackParticleLinks()) {
129 if (!link.isValid()) continue;
133 JPsiTrackParticleContainer->push_back(newTrack);
134 ElementLink<xAOD::TrackParticleContainer> newLink(*JPsiTrackParticleContainer, newTrack->
index());
136 }
137
138
139 constexpr double muonMass = 105.658;
140 TLorentzVector sumP4_muon, sumP4_electron, sumP4_selected;
141 std::vector<const xAOD::TrackParticle*> vtxTracks;
142
143 int vtxCharge = 0;
144
147 if (!track) continue;
148
152
153 TLorentzVector p4_muon, p4_electron;
154 p4_muon.SetPtEtaPhiM(pt,
eta,
phi, muonMass);
156
157 sumP4_muon += p4_muon;
158 sumP4_electron += p4_electron;
159 sumP4_selected += p4_muon;
160
161 vtxCharge +=
track->charge();
162 vtxTracks.push_back(track);
163 }
164
165
166 float vtxDeltaR = 0;
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());
171 vtxDeltaR = std::sqrt(dEta * dEta + dPhi * dPhi);
172 }
173
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;
191 }
192
193 return StatusCode::SUCCESS;
194}
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 makePrivateStore()
Create a new (empty) private store for this object.
size_t index() const
Return the index of this element within its container.
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.
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: