Execute method.
71 {
72
73 ATH_MSG_DEBUG(
"Executing MuSAVtxJPsiValidationAlg for event");
76
77 SG::ReadHandle<xAOD::EventInfo> evtInfo(
m_eventInfo, ctx);
79
81 ATH_CHECK(JPsiMuonContainer.record(std::make_unique<xAOD::MuonContainer>(), std::make_unique<xAOD::MuonAuxContainer>()));
82
84 ATH_CHECK(JPsiVertexContainer.record(std::make_unique<xAOD::VertexContainer>(), std::make_unique<xAOD::VertexAuxContainer>()));
85
87 ATH_CHECK(JPsiTrackParticleContainer.record(std::make_unique<xAOD::TrackParticleContainer>(), std::make_unique<xAOD::TrackParticleAuxContainer>()));
88
89
90 auto jpsiVtxs = std::make_unique<xAOD::VertexContainer>();
91 auto jpsiAux = std::make_unique<xAOD::VertexAuxContainer>();
92 jpsiVtxs->setStore(jpsiAux.get());
94
95 if (jpsiVtxs->empty()) {
97 return StatusCode::SUCCESS;
98 } else {
99 ATH_MSG_DEBUG(
"Found " << jpsiVtxs->size() <<
" J/Psi candidates");
100 }
101
102
103 std::vector<SG::WriteDecorHandle<xAOD::VertexContainer, char>> decors;
107 decors.emplace_back(key, ctx);
108 }
109
111 const auto&
links = vtx->trackParticleLinks();
113 if (
links.size() == 2) {
118
119 if (!mu1 && !mu2) {
120 ATH_MSG_WARNING(
"No muons found for J/Psi vertex with index " << vtx->index());
121 continue;
122 } else if (!mu1 || !mu2) {
123 ATH_MSG_WARNING(
"Only one muon found for J/Psi vertex with index " << vtx->index());
124 } else {
125 ATH_MSG_DEBUG(
"Found J/Psi vertex with index " << vtx->index() <<
" and muons: " << mu1->index() <<
", " << mu2->index());
126 }
127
128 if (mu1) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu1));
129 if (mu2) JPsiMuonContainer->push_back(
new xAOD::Muon(*mu2));
130
131 if(mu1 && mu2) {
134 if (
m_tdt->isPassed(chain)) {
135
137 ATH_MSG_DEBUG(
"Trigger chain " << chain <<
" matched: " << (matched ?
"Yes" :
"No"));
138 isTriggerMatched[iChain] = matched;
139 }
140 }
141 }
142 }
143
144
145
147 JPsiVertexContainer->push_back(newVtx);
148
149
154
155
157 decors[iChain](*newVtx) = isTriggerMatched[iChain];
158 }
159
160
161 for (const auto& link : vtx->trackParticleLinks()) {
162 if (!
link.isValid())
continue;
165 newTrack->makePrivateStore(*oldTrack);
166 JPsiTrackParticleContainer->push_back(newTrack);
167 ElementLink<xAOD::TrackParticleContainer> newLink(*JPsiTrackParticleContainer, newTrack->index(), ctx);
169 }
170
171
172 constexpr double muonMass = 105.658;
173 TLorentzVector sumP4_muon, sumP4_electron, sumP4_selected;
174 std::vector<const xAOD::TrackParticle*> vtxTracks;
175
176 int vtxCharge = 0;
177
180 if (!track) continue;
181
185
186 TLorentzVector p4_muon, p4_electron;
187 p4_muon.SetPtEtaPhiM(pt,
eta,
phi, muonMass);
189
190 sumP4_muon += p4_muon;
191 sumP4_electron += p4_electron;
192 sumP4_selected += p4_muon;
193
194 vtxCharge +=
track->charge();
195 vtxTracks.push_back(track);
196 }
197
198
199 float vtxDeltaR = 0;
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());
204 vtxDeltaR = std::sqrt(dEta * dEta + dPhi * dPhi);
205 }
206
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;
224 }
225
226 return StatusCode::SUCCESS;
227}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_WARNING(x,...)
xAOD::MuonContainer * muonContainer
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_JPsiTrackParticleContainer
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainer
ToolHandle< Trig::IMatchingTool > m_matchTool
SG::WriteHandleKey< xAOD::VertexContainer > m_JPsiVertexContainer
SG::WriteDecorHandleKeyArray< xAOD::VertexContainer > m_trigDecorKeys
const xAOD::Muon * findMuonFromTrack(const xAOD::TrackParticle *tp, const xAOD::MuonContainer *muons)
PublicToolHandle< Trig::TrigDecisionTool > m_tdt
ToolHandle< Analysis::JpsiFinder > m_JPsiFinderTool
SG::WriteHandleKey< xAOD::MuonContainer > m_JPsiMuonContainer
Gaudi::Property< double > m_dR
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo
Gaudi::Property< std::vector< std::string > > m_triggerChains
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: