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();
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);
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;
Scalar phi() const
phi method
Scalar theta() const
theta method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
An algorithm that can be simultaneously executed in multiple threads.
bool setStorableObject(BaseConstReference data, bool replace=false, IProxyDict *sg=0)
Set link to point to a new container (storable).
Gaudi::Property< bool > m_addElectronTracks
Gaudi::Property< bool > m_addGSFTracks
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_tpContainerKey
ToolHandle< Rec::IVrtInclusive > m_bvertextool
SG::ReadHandleKey< xAOD::ElectronContainer > m_electronContainerKey
bool vertexHasNoLep(const EventContext &, const xAOD::Vertex *) const
StatusCode initialize() override
SG::ReadHandleKey< xAOD::JetContainer > m_jetContainerKey
void addGSFTracks(const EventContext &, std::unordered_set< const xAOD::TrackParticle * > &) const
Gaudi::Property< bool > m_removeNonLepVerts
Gaudi::Property< bool > m_addIDTracks
NewVrtSecInclusiveAlg(const std::string &name, ISvcLocator *pSvcLocator)
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_gsfContainerKey
SG::ReadHandleKey< xAOD::VertexContainer > m_pvContainerKey
void addElectronTracks(const EventContext &, std::unordered_set< const xAOD::TrackParticle * > &) const
void addMuonTracks(const EventContext &, std::unordered_set< const xAOD::TrackParticle * > &) const
void addInDetTracks(const EventContext &, std::unordered_set< const xAOD::TrackParticle * > &) const
SG::WriteHandleKey< xAOD::VertexContainer > m_foundVerticesKey
StatusCode execute(const EventContext &ctx) const override
Gaudi::Property< bool > m_addMuonTracks
StatusCode finalize() override
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainerKey
SG::ReadHandleKey< xAOD::VertexContainer > m_btsvContainerKey
SG::Decorator< T, ALLOC > Decorator
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
double deltaR(const Amg::Vector3D &v1, const Amg::Vector3D &v2)
static const SG::AuxElement::Decorator< float > bvrtPt("bvrtPt")
static const SG::AuxElement::Decorator< float > mindRBTagSV("mindRBTagSV")
static const SG::AuxElement::Decorator< float > mindRjetV("mindRjetV")
static const SG::AuxElement::Decorator< float > bvrtEta("bvrtEta")
static const SG::AuxElement::Decorator< float > bvrtPhi("bvrtPhi")
static const SG::AuxElement::Decorator< float > bvrtM("bvrtM")
static const SG::AuxElement::Decorator< float > mindRjetP("mindRjetP")
constexpr double mass[PARTICLEHYPOTHESES]
the array of masses
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
const xAOD::TrackParticle * getOriginalTrackParticleFromGSF(const xAOD::TrackParticle *trkPar)
Helper function for getting the "Original" Track Particle (i.e before GSF) via the GSF Track Particle...
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Helper to simultaneously calculate sin and cos of the same angle.
Helper to simultaneously calculate sin and cos of the same angle.