15 #include "TLorentzVector.h"
44 return StatusCode::SUCCESS;
49 return StatusCode::SUCCESS;
56 std::unordered_set<const xAOD::TrackParticle*> tp_set{};
61 ATH_MSG_DEBUG(
"Found " << tp_set.size() <<
" useful tracks in this event" );
63 std::vector<const xAOD::TrackParticle*> trkparticles(tp_set.begin(), tp_set.end());
71 for (
const auto *
v : *pv_cont ) {
89 auto bVertexContainer = std::make_unique<xAOD::VertexContainer>();
90 auto bVertexAuxContainer = std::make_unique<xAOD::VertexAuxContainer>();
91 bVertexContainer->setStore(bVertexAuxContainer.get());
93 if(
pv && trkparticles.size()>1 ){
94 std::unique_ptr<Trk::VxSecVertexInfo> foundVrts =
m_bvertextool->findAllVertices(trkparticles,*
pv);
95 if(foundVrts && !foundVrts->
vertices().empty()){
96 const std::vector<xAOD::Vertex*> vtmp=foundVrts->
vertices();
97 double mindRSVPV=1.e3;
98 for(
const auto & iv : vtmp) {
100 for (
const auto *btsv : *btsv_cont ) mindRSVPV=
std::min(
Amg::deltaR(btsv->position()-
pv->position(),iv->position()-
pv->position()),mindRSVPV);
106 bVertexContainer->push_back(iv);
107 std::vector< Trk::VxTrackAtVertex > & vtrk = iv->vxTrackAtVertex();
108 TLorentzVector VSUM(0.,0.,0.,0.);
110 for(
auto &
it : vtrk){
114 double absP = 1./std::abs(mPer->parameters()[
Trk::qOverP]);
118 bvrtM(*iv) =VSUM.M();
119 bvrtPt(*iv) =VSUM.Pt();
120 bvrtEta(*iv)=VSUM.Eta();
121 bvrtPhi(*iv)=VSUM.Phi();
122 TVector3 SVmPV(iv->x()-
pv->x(),iv->y()-
pv->y(),iv->z()-
pv->z());
123 double mindRMOM=1.e3, mindRSV=1.e3;
125 for(
const auto *
jet : (*jet_cont)) {
126 mindRMOM=
std::min(VSUM.DeltaR(
jet->p4()),mindRMOM);
127 mindRSV =
std::min(SVmPV.DeltaR(
jet->p4().Vect()),mindRSV);
130 mindRBTagSV(*iv) =mindRSVPV;
131 mindRjetP(*iv) =mindRMOM;
132 mindRjetV(*iv) =mindRSV;
136 ATH_MSG_DEBUG(
"Found Vertices in this event: " << bVertexContainer->size());
139 for(
auto iv : (*bVertexContainer)){
140 std::vector< ElementLink< xAOD::TrackParticleContainer > > newLinkVec;
141 for(
auto &
it : iv->trackParticleLinks()){
145 newLinkVec.push_back(tmpLnk);
147 iv->setTrackParticleLinks(newLinkVec);
152 std::move(bVertexAuxContainer)) );
153 return StatusCode::SUCCESS;
163 trkparticles.reserve(trkparticles.size() + tp_cont->
size());
165 for (
const auto *
tp : (*tp_cont)) { trkparticles.insert(
tp); }
175 trkparticles.reserve(trkparticles.size() + muon_cont->
size());
177 for (
const auto *
muon : (*muon_cont)) {
178 const auto *
tp =
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
179 if (!
tp) {
continue; }
180 trkparticles.insert(
tp);
191 trkparticles.reserve(trkparticles.size() + gsf_cont->
size());
193 for (
const auto *gsf : (*gsf_cont)) {
194 trkparticles.insert(gsf);
203 if ( !electron_cont.
isValid() ) {
207 trkparticles.reserve(trkparticles.size() + electron_cont->
size());
209 for(
const auto *
electron : (*electron_cont)) {
210 if( 0 ==
electron->nTrackParticles() )
continue;
212 const auto *gsf =
electron->trackParticle(0);
214 trkparticles.insert(gsf);
221 std::unordered_set<const xAOD::TrackParticle*> trkparts{};
222 trkparts.reserve(
vertex->nTrackParticles());
223 for (
const auto &trk :
vertex->trackParticleLinks()) {
224 trkparts.insert(*trk);
230 for (
const auto *
muon : (*muon_cont)) {
231 const auto *
tp =
muon->trackParticle( xAOD::Muon::InnerDetectorTrackParticle );
232 if (!
tp) {
continue; }
233 if(trkparts.count(
tp))
return false;
239 if ( electron_cont.
isValid() ) {
240 for(
const auto *
electron : (*electron_cont)) {
241 if( 0 ==
electron->nTrackParticles() )
continue;
243 const auto *gsf =
electron->trackParticle(0);
245 if(trkparts.count(gsf))
return false;