72 std::vector<const xAOD::Vertex*> BVertices;
73 std::vector<const xAOD::TrackParticle*> BVertexTracks;
79 conversionContainer->setStore(conversionAuxContainer.get());
83 ATH_MSG_DEBUG(
"Track particle container size " << inputTrackParticles->size() );
85 std::vector<const xAOD::TrackParticle*> trackPair(2);
92 if (!BVtxContainer.isValid()) {
93 ATH_MSG_ERROR(
"Failed to retrieve VertexContainer " << BVtxContainer.key());
94 return StatusCode::FAILURE;
97 ATH_MSG_DEBUG(
"Vertex Container (" << BVtxContainer.key() <<
") contains " << BVtxContainer->size() <<
" vertices" );
101 auto &vect = BGammaLinks(*vertex) = std::vector< VertexLink >();
103 bool passedHypothesis =
false;
104 BVertexTracks.clear();
106 for (
const auto &flag : flaghandles) {
107 bool pass = flag(*vertex);
108 if (pass) passedHypothesis =
true;
111 if (!passedHypothesis)
continue;
115 std::vector<const xAOD::Vertex*> precedingVertices(1, vertex);
118 for (
size_t i = 0; i < vertex->nTrackParticles(); ++i) BVertexTracks.push_back(vertex->trackParticle(i));
123 trackPair[0] = *tpIt1;
125 auto itr1 = std::find(BVertexTracks.begin(), BVertexTracks.end(), trackPair[0]);
126 if (itr1 != BVertexTracks.end())
continue;
128 const Trk::Perigee& trackPerigee1 = trackPair[0]->perigeeParameters();
132 trackPair[1] = *tpIt2;
133 if (trackPair[0] == trackPair[1])
continue;
135 auto itr2 = std::find(BVertexTracks.begin(), BVertexTracks.end(), trackPair[1]);
136 if (itr2 != BVertexTracks.end())
continue;
138 const Trk::Perigee& trackPerigee2 = trackPair[1]->perigeeParameters();
141 TLorentzVector e1, e2, gamma_m, BcStar;
142 e1.SetPtEtaPhiM(trackPair[0]->pt(), trackPair[0]->
eta(), trackPair[0]->
phi(),
Trk::electron);
143 e2.SetPtEtaPhiM(trackPair[1]->pt(), trackPair[1]->
eta(), trackPair[1]->
phi(),
Trk::electron);
152 BcStar = mu1 + mu2 + mu3 + e1 + e2;
160 if (errorcode != 0) startingPoint = Amg::Vector3D::Zero(3);
162 std::vector<float> RefTrackPx, RefTrackPy, RefTrackPz, RefTrackE;
163 std::vector<float> OrigTrackPx, OrigTrackPy, OrigTrackPz, OrigTrackE;
167 auto convVertexCandidate =
m_vertexFitter->fit(ctx, trackPair, startingPoint);
170 if (convVertexCandidate) {
171 if (convVertexCandidate->chiSquared() / convVertexCandidate->numberDoF() >
m_Chi2Cut)
continue;
175 Photon.setPrecedingVertices(precedingVertices, BVtxContainer.cptr());
178 convVertexCandidate->clearTracks();
185 convVertexCandidate->addTrackAtVertex(newLink1);
186 convVertexCandidate->addTrackAtVertex(newLink2);
188 std::vector<Amg::Vector3D> positionList;
193 TLorentzVector photon, electron1, electron2, ph;
196 photon = electron1 + electron2;
197 ph.SetXYZM(momentum.x(), momentum.y(), momentum.z(), 0.);
203 std::vector<float> B_Px = RefTrackPxAcc(*vertex);
204 std::vector<float> B_Py = RefTrackPyAcc(*vertex);
205 std::vector<float> B_Pz = RefTrackPzAcc(*vertex);
207 TLorentzVector muon1, muon2, muon3;
208 muon1.SetXYZM(B_Px.at(0), B_Py.at(0), B_Pz.at(0),
Trk::muon);
209 muon2.SetXYZM(B_Px.at(1), B_Py.at(1), B_Pz.at(1),
Trk::muon);
210 muon3.SetXYZM(B_Px.at(2), B_Py.at(2), B_Pz.at(2),
Trk::muon);
212 TLorentzVector B_m = muon1 + muon2 + muon3;
215 const double mass = photon.M();
217 RefTrackPx.push_back(
trackMomentum(*convVertexCandidate, 0).Px());
218 RefTrackPx.push_back(
trackMomentum(*convVertexCandidate, 1).Px());
220 RefTrackPy.push_back(
trackMomentum(*convVertexCandidate, 0).Py());
221 RefTrackPy.push_back(
trackMomentum(*convVertexCandidate, 1).Py());
223 RefTrackPz.push_back(
trackMomentum(*convVertexCandidate, 0).Pz());
224 RefTrackPz.push_back(
trackMomentum(*convVertexCandidate, 1).Pz());
226 for (
size_t i = 0; i < B_Px.size(); i++) {
227 RefTrackPx.push_back(B_Px.at(i));
228 RefTrackPy.push_back(B_Py.at(i));
229 RefTrackPz.push_back(B_Pz.at(i));
232 RefTrackE.push_back(electron1.E());
233 RefTrackE.push_back(electron2.E());
234 RefTrackE.push_back(muon1.E());
235 RefTrackE.push_back(muon2.E());
236 RefTrackE.push_back(muon3.E());
238 OrigTrackPx.push_back(e1.Px());
239 OrigTrackPx.push_back(e2.Px());
241 OrigTrackPy.push_back(e1.Py());
242 OrigTrackPy.push_back(e2.Py());
244 OrigTrackPz.push_back(e1.Pz());
245 OrigTrackPz.push_back(e2.Pz());
247 OrigTrackE.push_back(e1.E());
248 OrigTrackE.push_back(e2.E());
251 ATH_MSG_DEBUG(
"pt = " << photon.Pt() <<
" ph " << ph.Pt() <<
" mass " << photon.M() <<
" px size " << RefTrackPx.size() );
252 ATH_MSG_DEBUG(
"Candidate DeltaM = " << (B_m + photon).M() <<
" MeV DiMuon " <<
" ( Mass = " << B_m.M() <<
" MeV )");
260 pxAcc(*convVertexCandidate) = momentum.x();
261 pyAcc(*convVertexCandidate) = momentum.y();
262 pzAcc(*convVertexCandidate) = momentum.z();
267 deltaQAcc(*convVertexCandidate) = deltaQ;
268 gamma_massAcc(*convVertexCandidate) = mass;
269 RefTrackPxAcc(*convVertexCandidate) = RefTrackPx;
270 RefTrackPyAcc(*convVertexCandidate) = RefTrackPy;
271 RefTrackPzAcc(*convVertexCandidate) = RefTrackPz;
272 RefTrackEAcc(*convVertexCandidate) = RefTrackE;
278 OrigTrackPxAcc(*convVertexCandidate) = OrigTrackPx;
279 OrigTrackPyAcc(*convVertexCandidate) = OrigTrackPy;
280 OrigTrackPzAcc(*convVertexCandidate) = OrigTrackPz;
281 OrigTrackEAcc(*convVertexCandidate) = OrigTrackE;
284 passed_GammaAcc(*convVertexCandidate) =
true;
289 BGammaLink.
setElement(convVertexCandidate.get());
291 conversionContainer->push_back( std::move(convVertexCandidate) );
292 vect.push_back(std::move(BGammaLink));
306 ATH_CHECK( wh.record(std::move(conversionContainer), std::move(conversionAuxContainer)) );
308 return StatusCode::SUCCESS;