71 {
72
73 std::vector<const xAOD::Vertex*> BVertices;
74 std::vector<const xAOD::TrackParticle*> BVertexTracks;
75
76
77
80 conversionContainer->setStore(conversionAuxContainer.get());
81
82
84 ATH_MSG_DEBUG(
"Track particle container size " << inputTrackParticles->size() );
85
86 std::vector<const xAOD::TrackParticle*> trackPair(2);
87
89
91
93 if (!BVtxContainer.isValid()) {
94 ATH_MSG_ERROR(
"Failed to retrieve VertexContainer " << BVtxContainer.key());
95 return StatusCode::FAILURE;
96 }
97
98 ATH_MSG_DEBUG(
"Vertex Container (" << BVtxContainer.key() <<
") contains " << BVtxContainer->size() <<
" vertices" );
99
100
102 auto &vect = BGammaLinks(*vertex) = std::vector< VertexLink >();
103
104 bool passedHypothesis = false;
105 BVertexTracks.clear();
106
107 for (const auto &flag : flaghandles) {
108 bool pass =
flag(*vertex);
109 if (pass) passedHypothesis = true;
110 }
111
112 if (!passedHypothesis) continue;
113 xAOD::BPhysHypoHelper Bc("Bc", vertex);
114
115
116 std::vector<const xAOD::Vertex*> precedingVertices(1, vertex);
117
118
119 for (
size_t i = 0;
i <
vertex->nTrackParticles(); ++
i) BVertexTracks.push_back(
vertex->trackParticle(i));
120
121
122
124 trackPair[0] = *tpIt1;
125
126 auto itr1 = std::find(BVertexTracks.begin(), BVertexTracks.end(), trackPair[0]);
127 if (itr1 != BVertexTracks.end()) continue;
128
129 const Trk::Perigee& trackPerigee1 = trackPair[0]->perigeeParameters();
130
131
133 trackPair[1] = *tpIt2;
134 if (trackPair[0] == trackPair[1]) continue;
135
136 auto itr2 = std::find(BVertexTracks.begin(), BVertexTracks.end(), trackPair[1]);
137 if (itr2 != BVertexTracks.end()) continue;
138
139 const Trk::Perigee& trackPerigee2 = trackPair[1]->perigeeParameters();
140
141
142 TLorentzVector
e1,
e2, gamma_m, BcStar;
145
148
149 TLorentzVector mu1 = Bc.refTrk(0,
Trk::muon);
150 TLorentzVector mu2 = Bc.refTrk(1,
Trk::muon);
151 TLorentzVector mu3 = Bc.refTrk(2,
Trk::muon);
152
153 BcStar = mu1 + mu2 + mu3 +
e1 +
e2;
156
157
158 int sflag = 0;
159 int errorcode = 0;
161 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
162
163 std::vector<float> RefTrackPx, RefTrackPy, RefTrackPz, RefTrackE;
164 std::vector<float> OrigTrackPx, OrigTrackPy, OrigTrackPz, OrigTrackE;
165
166
167
168 auto convVertexCandidate =
m_vertexFitter->fit(ctx, trackPair, startingPoint);
169
170
171 if (convVertexCandidate) {
172 if (convVertexCandidate->chiSquared() / convVertexCandidate->numberDoF() >
m_Chi2Cut)
continue;
173
174 xAOD::BPhysHelper
Photon(convVertexCandidate.get());
175
176 Photon.setPrecedingVertices(precedingVertices, BVtxContainer.cptr());
177
178
179 convVertexCandidate->clearTracks();
180 ElementLink<xAOD::TrackParticleContainer> newLink1;
183 ElementLink<xAOD::TrackParticleContainer> newLink2;
186 convVertexCandidate->addTrackAtVertex(newLink1);
187 convVertexCandidate->addTrackAtVertex(newLink2);
188
189 std::vector<Amg::Vector3D> positionList;
190
191
193
194 TLorentzVector
photon, electron1, electron2, ph;
197 photon = electron1 + electron2;
199
200
204 std::vector<float> B_Px = RefTrackPxAcc(*vertex);
205 std::vector<float> B_Py = RefTrackPyAcc(*vertex);
206 std::vector<float> B_Pz = RefTrackPzAcc(*vertex);
207
208 TLorentzVector muon1, muon2, muon3;
209 muon1.SetXYZM(B_Px.at(0), B_Py.at(0), B_Pz.at(0),
Trk::muon);
210 muon2.SetXYZM(B_Px.at(1), B_Py.at(1), B_Pz.at(1),
Trk::muon);
211 muon3.SetXYZM(B_Px.at(2), B_Py.at(2), B_Pz.at(2),
Trk::muon);
212
213 TLorentzVector B_m = muon1 + muon2 + muon3;
214
217
218 RefTrackPx.push_back(
trackMomentum(*convVertexCandidate, 0).Px());
219 RefTrackPx.push_back(
trackMomentum(*convVertexCandidate, 1).Px());
220
221 RefTrackPy.push_back(
trackMomentum(*convVertexCandidate, 0).Py());
222 RefTrackPy.push_back(
trackMomentum(*convVertexCandidate, 1).Py());
223
224 RefTrackPz.push_back(
trackMomentum(*convVertexCandidate, 0).Pz());
225 RefTrackPz.push_back(
trackMomentum(*convVertexCandidate, 1).Pz());
226
227 for (
size_t i = 0;
i < B_Px.size();
i++) {
228 RefTrackPx.push_back(B_Px.at(i));
229 RefTrackPy.push_back(B_Py.at(i));
230 RefTrackPz.push_back(B_Pz.at(i));
231 }
232
233 RefTrackE.push_back(electron1.E());
234 RefTrackE.push_back(electron2.E());
235 RefTrackE.push_back(muon1.E());
236 RefTrackE.push_back(muon2.E());
237 RefTrackE.push_back(muon3.E());
238
239 OrigTrackPx.push_back(
e1.Px());
240 OrigTrackPx.push_back(
e2.Px());
241
242 OrigTrackPy.push_back(
e1.Py());
243 OrigTrackPy.push_back(
e2.Py());
244
245 OrigTrackPz.push_back(
e1.Pz());
246 OrigTrackPz.push_back(
e2.Pz());
247
248 OrigTrackE.push_back(
e1.E());
249 OrigTrackE.push_back(
e2.E());
250
251
252 ATH_MSG_DEBUG(
"pt = " <<
photon.Pt() <<
" ph " << ph.Pt() <<
" mass " <<
photon.M() <<
" px size " << RefTrackPx.size() );
253 ATH_MSG_DEBUG(
"Candidate DeltaM = " << (B_m + photon).M() <<
" MeV DiMuon " <<
" ( Mass = " << B_m.M() <<
" MeV )");
254
255
257
258 static const SG::Accessor<float> pxAcc("px");
259 static const SG::Accessor<float> pyAcc("py");
260 static const SG::Accessor<float> pzAcc("pz");
261 pxAcc(*convVertexCandidate) =
momentum.x();
262 pyAcc(*convVertexCandidate) =
momentum.y();
263 pzAcc(*convVertexCandidate) =
momentum.z();
264
265 static const SG::Accessor<float> deltaQAcc("deltaQ");
266 static const SG::Accessor<float> gamma_massAcc("gamma_mass");
268 deltaQAcc(*convVertexCandidate) = deltaQ;
269 gamma_massAcc(*convVertexCandidate) =
mass;
270 RefTrackPxAcc(*convVertexCandidate) = RefTrackPx;
271 RefTrackPyAcc(*convVertexCandidate) = RefTrackPy;
272 RefTrackPzAcc(*convVertexCandidate) = RefTrackPz;
273 RefTrackEAcc(*convVertexCandidate) = RefTrackE;
274
279 OrigTrackPxAcc(*convVertexCandidate) = OrigTrackPx;
280 OrigTrackPyAcc(*convVertexCandidate) = OrigTrackPy;
281 OrigTrackPzAcc(*convVertexCandidate) = OrigTrackPz;
282 OrigTrackEAcc(*convVertexCandidate) = OrigTrackE;
283
285 passed_GammaAcc(*convVertexCandidate) = true;
286
287
288
290 BGammaLink.
setElement(convVertexCandidate.get());
292 conversionContainer->push_back( std::move(convVertexCandidate) );
293 vect.push_back(std::move(BGammaLink));
294 }
295 else {
297 }
298
299 }
300 }
301
302 }
303
304 }
305
307 ATH_CHECK(
wh.record(std::move(conversionContainer), std::move(conversionAuxContainer)) );
308
309 return StatusCode::SUCCESS;
310}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
DataModel_detail::const_iterator< DataVector > const_iterator
TVector3 trackMomentum(const xAOD::Vertex &vxCandidate, int trkIndex) const
bool setElement(ElementType element)
Set link to point to an Element (slowest).
bool setStorableObject(BaseConstReference data, bool replace=false)
Set link storable to data object pointed by data (slower).
Eigen::Matrix< double, 3, 1 > Vector3D
ElementLink< xAOD::VertexContainer > VertexLink
SG::Accessor< T, ALLOC > Accessor
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
double e2(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 2nd sampling
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling
VertexAuxContainer_v1 VertexAuxContainer
Definition of the current jet auxiliary container.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
Photon_v1 Photon
Definition of the current "egamma version".