72 {
73
74 std::vector<const xAOD::Vertex*> BVertices;
75 BVertices.clear();
76 std::vector<const xAOD::TrackParticle*> BVertexTracks;
77
78
79
82 conversionContainer->setStore(conversionAuxContainer.get());
83
84
88
94 return StatusCode::SUCCESS;;
95 }
96 else {
97 ATH_MSG_DEBUG(
"Low pT track particle container size " << lowPtTrackParticles->
size());
98 }
99 }
100
101
104 return StatusCode::FAILURE;
105 }
106 else {
108 ATH_MSG_DEBUG(
"Using " << *itr <<
" as the source B vertex collection" );
109 }
110 }
111
112
114
117 ATH_MSG_DEBUG(
"Vertex Container (" << *itr <<
") contains " << BVtxContainer->
size() <<
" vertices" );
118
119 static const SG::Decorator< std::vector< VertexLink > > BGammaLinks( "BGammaLinks" );
120 static const std::vector< VertexLink > vertexLinks;
121
123 BGammaLinks(*vertex) = vertexLinks;
124
125 bool passedHypothesis = false;
126 BVertexTracks.clear();
127
129 SG::ConstAccessor<Char_t>
acc(flag);
130 bool pass =
acc(*vertex);
131 if (pass) passedHypothesis = true;
132 }
133
134 if (!passedHypothesis) continue;
135 xAOD::BPhysHypoHelper Bc("Bc", vertex);
136
137
138 std::vector<const xAOD::Vertex*> precedingVertices(1, vertex);
139
140
141 for (
size_t i = 0;
i <
vertex->nTrackParticles(); ++
i) BVertexTracks.push_back(
vertex->trackParticle(i));
142
143
144
147
148 auto itr1 = std::find(BVertexTracks.begin(), BVertexTracks.end(), trackParticle1);
149 if (itr1 != BVertexTracks.end()) continue;
150
152
153
156 if (trackParticle1 == trackParticle2) continue;
157
158 auto itr2 = std::find(BVertexTracks.begin(), BVertexTracks.end(), trackParticle2);
159 if (itr2 != BVertexTracks.end()) continue;
160
162
163
164 TLorentzVector
e1,
e2, gamma_m, BcStar;
167
170
171 TLorentzVector mu1 = Bc.refTrk(0,
Trk::muon);
172 TLorentzVector mu2 = Bc.refTrk(1,
Trk::muon);
173 TLorentzVector mu3 = Bc.refTrk(2,
Trk::muon);
174
175 BcStar = mu1 + mu2 + mu3 +
e1 +
e2;
178
179
180 int sflag = 0;
181 int errorcode = 0;
183 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
184
185 std::vector<float> RefTrackPx, RefTrackPy, RefTrackPz, RefTrackE;
186 std::vector<float> OrigTrackPx, OrigTrackPy, OrigTrackPz, OrigTrackE;
187
188 std::vector<const xAOD::TrackParticle*> trackPair;
189 trackPair.clear();
190 trackPair.push_back(trackParticle1);
191 trackPair.push_back(trackParticle2);
192
193
195
196
197 if (convVertexCandidate) {
199
200 xAOD::BPhysHelper
Photon(convVertexCandidate);
201
202 Photon.setPrecedingVertices(precedingVertices, BVtxContainer);
203
204
206 ElementLink<xAOD::TrackParticleContainer> newLink1;
209 ElementLink<xAOD::TrackParticleContainer> newLink2;
214
215 std::vector<Amg::Vector3D> positionList;
216
217
219
220 TLorentzVector
photon, electron1, electron2, ph;
223 photon = electron1 + electron2;
225
226
227 static const SG::Accessor<std::vector<float> > RefTrackPxAcc("RefTrackPx");
228 static const SG::Accessor<std::vector<float> > RefTrackPyAcc("RefTrackPy");
229 static const SG::Accessor<std::vector<float> > RefTrackPzAcc("RefTrackPz");
230 std::vector<float> B_Px = RefTrackPxAcc(*vertex);
231 std::vector<float> B_Py = RefTrackPyAcc(*vertex);
232 std::vector<float> B_Pz = RefTrackPzAcc(*vertex);
233
234 TLorentzVector muon1, muon2, muon3;
235 muon1.SetXYZM(B_Px.at(0), B_Py.at(0), B_Pz.at(0),
Trk::muon);
236 muon2.SetXYZM(B_Px.at(1), B_Py.at(1), B_Pz.at(1),
Trk::muon);
237 muon3.SetXYZM(B_Px.at(2), B_Py.at(2), B_Pz.at(2),
Trk::muon);
238
239 TLorentzVector B_m = muon1 + muon2 + muon3;
240
243
244 RefTrackPx.push_back(
trackMomentum(convVertexCandidate, 0).Px());
245 RefTrackPx.push_back(
trackMomentum(convVertexCandidate, 1).Px());
246
247 RefTrackPy.push_back(
trackMomentum(convVertexCandidate, 0).Py());
248 RefTrackPy.push_back(
trackMomentum(convVertexCandidate, 1).Py());
249
250 RefTrackPz.push_back(
trackMomentum(convVertexCandidate, 0).Pz());
251 RefTrackPz.push_back(
trackMomentum(convVertexCandidate, 1).Pz());
252
253 for (
size_t i = 0;
i < B_Px.size();
i++) {
254 RefTrackPx.push_back(B_Px.at(i));
255 RefTrackPy.push_back(B_Py.at(i));
256 RefTrackPz.push_back(B_Pz.at(i));
257 }
258
259 RefTrackE.push_back(electron1.E());
260 RefTrackE.push_back(electron2.E());
261 RefTrackE.push_back(muon1.E());
262 RefTrackE.push_back(muon2.E());
263 RefTrackE.push_back(muon3.E());
264
265 OrigTrackPx.push_back(
e1.Px());
266 OrigTrackPx.push_back(
e2.Px());
267
268 OrigTrackPy.push_back(
e1.Py());
269 OrigTrackPy.push_back(
e2.Py());
270
271 OrigTrackPz.push_back(
e1.Pz());
272 OrigTrackPz.push_back(
e2.Pz());
273
274 OrigTrackE.push_back(
e1.E());
275 OrigTrackE.push_back(
e2.E());
276
277
278 ATH_MSG_DEBUG(
"pt = " <<
photon.Pt() <<
" ph " << ph.Pt() <<
" mass " <<
photon.M() <<
" px size " << RefTrackPx.size() );
279 ATH_MSG_DEBUG(
"Candidate DeltaM = " << (B_m + photon).M() <<
" MeV DiMuon " <<
" ( Mass = " << B_m.M() <<
" MeV )");
280
281
283
284 static const SG::Accessor<float> pxAcc("px");
285 static const SG::Accessor<float> pyAcc("py");
286 static const SG::Accessor<float> pzAcc("pz");
287 pxAcc(*convVertexCandidate) =
momentum.x();
288 pyAcc(*convVertexCandidate) =
momentum.y();
289 pzAcc(*convVertexCandidate) =
momentum.z();
290
291 static const SG::Accessor<float> deltaQAcc("deltaQ");
292 static const SG::Accessor<float> gamma_massAcc("gamma_mass");
293 static const SG::Accessor< std::vector<float> > RefTrackEAcc("RefTrackE");
294 deltaQAcc(*convVertexCandidate) = deltaQ;
295 gamma_massAcc(*convVertexCandidate) =
mass;
296 RefTrackPxAcc(*convVertexCandidate) = RefTrackPx;
297 RefTrackPyAcc(*convVertexCandidate) = RefTrackPy;
298 RefTrackPzAcc(*convVertexCandidate) = RefTrackPz;
299 RefTrackEAcc(*convVertexCandidate) = RefTrackE;
300
301 static const SG::Accessor< std::vector<float> > OrigTrackPxAcc("OrigTrackPx");
302 static const SG::Accessor< std::vector<float> > OrigTrackPyAcc("OrigTrackPy");
303 static const SG::Accessor< std::vector<float> > OrigTrackPzAcc("OrigTrackPz");
304 static const SG::Accessor< std::vector<float> > OrigTrackEAcc("OrigTrackE");
305 OrigTrackPxAcc(*convVertexCandidate) = OrigTrackPx;
306 OrigTrackPyAcc(*convVertexCandidate) = OrigTrackPy;
307 OrigTrackPzAcc(*convVertexCandidate) = OrigTrackPz;
308 OrigTrackEAcc(*convVertexCandidate) = OrigTrackE;
309
310 static const SG::Accessor<Char_t> passed_GammaAcc("passed_Gamma");
311 passed_GammaAcc(*convVertexCandidate) = true;
312
313 conversionContainer->push_back( convVertexCandidate );
314
315
319 BGammaLinks(*vertex).push_back(std::move(BGammaLink));
320 }
321 else {
323 }
324
325 }
326 }
327
328 }
329
330 }
331
332
335
336 return StatusCode::SUCCESS;
337}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define CHECK(...)
Evaluate an expression and check for errors.
DataModel_detail::const_iterator< DataVector > const_iterator
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
TVector3 trackMomentum(const xAOD::Vertex *vxCandidate, int trkIndex) const
bool setElement(ElementType element)
Set to point to an element.
bool setStorableObject(BaseConstReference data, bool replace=false, IProxyDict *sg=0)
Set link to point to a new container (storable).
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
void clearTracks()
Remove all tracks from the vertex.
void addTrackAtVertex(const ElementLink< TrackParticleContainer > &tr, float weight=1.0)
Add a new track to the vertex.
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
float chiSquared() const
Returns the of the vertex fit as float.
Eigen::Matrix< double, 3, 1 > Vector3D
ElementLink< xAOD::VertexContainer > VertexLink
::StatusCode StatusCode
StatusCode definition for legacy code.
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
retrieve(aClass, aKey=None)
VertexAuxContainer_v1 VertexAuxContainer
Definition of the current jet auxiliary container.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Photon_v1 Photon
Definition of the current "egamma version".