diff --git a/InnerDetector/InDetRecAlgs/InDetV0Finder/InDetV0Finder/InDetV0FinderTool.h b/InnerDetector/InDetRecAlgs/InDetV0Finder/InDetV0Finder/InDetV0FinderTool.h index 02a342a7844cc3373135326f9ddf704b77092c0e..8b044728fe12266e32339d5dc4a9eef016684046 100755 --- a/InnerDetector/InDetRecAlgs/InDetV0Finder/InDetV0Finder/InDetV0FinderTool.h +++ b/InnerDetector/InDetRecAlgs/InDetV0Finder/InDetV0Finder/InDetV0FinderTool.h @@ -23,6 +23,7 @@ #include "xAODTracking/TrackParticleContainer.h" #include "StoreGate/WriteDecorHandleKey.h" #include "BeamSpotConditionsData/BeamSpotData.h" +#include <atomic> /** The InDetV0FinderTool reads in the TrackParticle container from StoreGate, if useorigin = True only tracks not associated to a primary vertex are used. @@ -93,7 +94,7 @@ namespace InDet static const InterfaceID IID_InDetV0FinderTool("InDetV0FinderTool", 1, 0); - class InDetV0FinderTool: virtual public AthAlgTool + class InDetV0FinderTool: public AthAlgTool { public: InDetV0FinderTool(const std::string& t, const std::string& n, const IInterface* p); @@ -108,9 +109,8 @@ namespace InDet xAOD::VertexContainer*& laContainer, xAOD::VertexAuxContainer*& laAuxContainer, xAOD::VertexContainer*& lbContainer, xAOD::VertexAuxContainer*& lbAuxContainer, const xAOD::Vertex* vertex, - // AthenaMT migration: passing the vertex collection name at run-time is not supported - SG::ReadHandle<xAOD::VertexContainer> vertColl - ); + const xAOD::VertexContainer* vertColl + ) const; //protected: private: @@ -165,30 +165,32 @@ namespace InDet double m_vert_a0xy_cut; //!< V0 |a0xy| wrt a vertex (<3.) double m_vert_a0z_cut; //!< V0 |a0z| wrt a vertex (<15.) - unsigned int m_events_processed; - unsigned int m_V0s_stored; - unsigned int m_Kshort_stored; - unsigned int m_Lambda_stored; - unsigned int m_Lambdabar_stored; - unsigned int m_Gamma_stored; + mutable std::atomic<unsigned int> m_events_processed; + mutable std::atomic<unsigned int> m_V0s_stored; + mutable std::atomic<unsigned int> m_Kshort_stored; + mutable std::atomic<unsigned int> m_Lambda_stored; + mutable std::atomic<unsigned int> m_Lambdabar_stored; + mutable std::atomic<unsigned int> m_Gamma_stored; - void SGError(std::string errService); + void SGError(std::string errService) const; - double invariantMass(const Trk::TrackParameters* per1, const Trk::TrackParameters* per2, double &m1, double &m2); + double invariantMass(const Trk::TrackParameters* per1, const Trk::TrackParameters* per2, double m1, double m2) const; - bool doFit(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D &startingPoint); + bool doFit(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D &startingPoint) const; - bool d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::VertexContainer * vertColl); - bool d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::Vertex * vertex); - bool d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D vertex); + bool d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::VertexContainer * vertColl) const; + bool d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::Vertex * vertex) const; + bool d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D vertex) const; - bool pointAtVertex(const xAOD::Vertex* v0, const xAOD::Vertex* PV); - bool pointAtVertexColl(xAOD::Vertex* v0, const xAOD::VertexContainer * vertColl); + bool pointAtVertex(const xAOD::Vertex* v0, const xAOD::Vertex* PV) const; + bool pointAtVertexColl(xAOD::Vertex* v0, const xAOD::VertexContainer * vertColl) const; - bool doMassFit(xAOD::Vertex* vxCandidate, int pdgID); + bool doMassFit(xAOD::Vertex* vxCandidate, int pdgID) const; - xAOD::Vertex* massFit(int pdgID, std::vector<const xAOD::TrackParticle*> pairV0, Amg::Vector3D vertex, Trk::TrkV0VertexFitter* concreteVertexFitter); + xAOD::Vertex* massFit(int pdgID, const std::vector<const xAOD::TrackParticle*> &pairV0, const Amg::Vector3D &vertex) const; + + const Trk::TrkV0VertexFitter* m_concreteVertexFitter; SG::ReadHandleKey<xAOD::VertexContainer> m_vertexKey { this, "VertexContainer", "PrimaryVertices", "primary vertex container" }; diff --git a/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0Finder.cxx b/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0Finder.cxx index 0b827666a336032652b25d023fa7efda484eac49..a2b63df68ee59c057d20f7fc30d4daaa884b20e8 100755 --- a/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0Finder.cxx +++ b/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0Finder.cxx @@ -234,7 +234,7 @@ StatusCode InDetV0Finder::execute() ksContainer, ksAuxContainer, laContainer, laAuxContainer, lbContainer, lbAuxContainer, - primaryVertex, importedVxContainer); + primaryVertex, importedVxContainer.cptr()); // typedef std::unique_ptr<xAOD::VertexContainer> Container_p; typedef std::unique_ptr<xAOD::VertexAuxContainer> Aux_p; diff --git a/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0FinderTool.cxx b/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0FinderTool.cxx index 6fe484737129685e917a1abe755203abbb56f2e9..d3ff201db061eb86ca521fbbe46215bcc60173e6 100755 --- a/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0FinderTool.cxx +++ b/InnerDetector/InDetRecAlgs/InDetV0Finder/src/InDetV0FinderTool.cxx @@ -261,6 +261,18 @@ StatusCode InDetV0FinderTool::initialize() m_Lambda_stored = 0; m_Gamma_stored = 0; +// making a concrete fitter for the V0Fitter + m_concreteVertexFitter = 0; + if (m_useV0Fitter) { + m_concreteVertexFitter = dynamic_cast<Trk::TrkV0VertexFitter * >(&(*m_iVertexFitter)); + if (m_concreteVertexFitter == 0) { + ATH_MSG_FATAL("The vertex fitter passed is not a V0 Vertex Fitter"); + return StatusCode::FAILURE; + } + } + + + msg(MSG::DEBUG) << "Initialization successful" << endmsg; return StatusCode::SUCCESS; @@ -271,8 +283,8 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, xAOD::VertexContainer*& laContainer, xAOD::VertexAuxContainer*& laAuxContainer, xAOD::VertexContainer*& lbContainer, xAOD::VertexAuxContainer*& lbAuxContainer, const xAOD::Vertex* primaryVertex, - SG::ReadHandle<xAOD::VertexContainer> vertColl - ) + const xAOD::VertexContainer* vertColl + ) const { ATH_MSG_DEBUG( "InDetV0FinderTool::performSearch" ); @@ -291,17 +303,6 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, m_events_processed ++; -// making a concrete fitter for the V0Fitter - Trk::TrkV0VertexFitter* concreteVertexFitter=0; - if (m_useV0Fitter) { - concreteVertexFitter = dynamic_cast<Trk::TrkV0VertexFitter * >(&(*m_iVertexFitter)); - if (concreteVertexFitter == 0) { - ATH_MSG_FATAL("The vertex fitter passed is not a V0 Vertex Fitter"); - return StatusCode::FAILURE; - } - } - - // Retrieve track particles from StoreGate SG::ReadHandle<xAOD::TrackParticleContainer> TPC( m_trackParticleKey ); if ( !TPC.isValid() ) @@ -312,12 +313,6 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, ATH_MSG_DEBUG("Track particle container size " << TPC->size()); if (m_use_vertColl) { -// Retrieve vertex collection for V0 selection - if ( !vertColl.isValid() ) - { - ATH_MSG_WARNING("Input vertex collection is invalid!"); - return StatusCode::RECOVERABLE; - } ATH_MSG_DEBUG("Vertex container size " << vertColl->size()); } @@ -446,7 +441,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, bool d0wrtVertex = true; if (m_use_vertColl) { - if ( !d0Pass(TP1,TP2,vertColl.cptr()) ) d0wrtVertex = false; + if ( !d0Pass(TP1,TP2,vertColl) ) d0wrtVertex = false; } if (!m_use_vertColl && m_pv) { if (primaryVertex) { @@ -487,7 +482,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, std::unique_ptr<xAOD::Vertex> myVxCandidate; if (m_useV0Fitter) { - myVxCandidate = std::unique_ptr<xAOD::Vertex>( concreteVertexFitter->fit(pairV0, startingPoint) ); + myVxCandidate = std::unique_ptr<xAOD::Vertex>( m_concreteVertexFitter->fit(pairV0, startingPoint) ); } else { myVxCandidate = std::unique_ptr<xAOD::Vertex>( m_iVKVertexFitter->fit(pairV0, startingPoint) ); } @@ -507,7 +502,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, { bool pointAtVert = true; if (m_use_vertColl) { - if ( !pointAtVertexColl(myVxCandidate.get(),vertColl.cptr()) ) pointAtVert = false; + if ( !pointAtVertexColl(myVxCandidate.get(),vertColl) ) pointAtVert = false; } if (!m_use_vertColl && m_pv && primaryVertex) { if ( !pointAtVertex(myVxCandidate.get(),primaryVertex) ) pointAtVert = false; @@ -526,7 +521,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, bool foundLambdabar = false; if (doKshortFit && !m_doSimpleV0) { - myKshort = std::unique_ptr<xAOD::Vertex>( massFit(310, pairV0, vertex, concreteVertexFitter) ); + myKshort = std::unique_ptr<xAOD::Vertex>( massFit(310, pairV0, vertex) ); if (myKshort) { if (m_V0Tools->vertexProbability(myKshort.get()) >= m_minConstrVertProb) { myKshort->setVertexType(xAOD::VxType::V0Vtx); @@ -537,7 +532,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, } if (doLambdaFit && !m_doSimpleV0) { - myLambda = std::unique_ptr<xAOD::Vertex>( massFit(3122, pairV0, vertex, concreteVertexFitter) ); + myLambda = std::unique_ptr<xAOD::Vertex>( massFit(3122, pairV0, vertex) ); if (myLambda) { if (m_V0Tools->vertexProbability(myLambda.get()) >= m_minConstrVertProb) { myLambda->setVertexType(xAOD::VxType::V0Vtx); @@ -547,7 +542,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, } if (doLambdabarFit && !m_doSimpleV0) { - myLambdabar = std::unique_ptr<xAOD::Vertex>( massFit(-3122, pairV0, vertex, concreteVertexFitter)); + myLambdabar = std::unique_ptr<xAOD::Vertex>( massFit(-3122, pairV0, vertex)); if (myLambdabar) { if (m_V0Tools->vertexProbability(myLambdabar.get()) >= m_minConstrVertProb) { myLambdabar->setVertexType(xAOD::VxType::V0Vtx); @@ -649,7 +644,7 @@ StatusCode InDetV0FinderTool::performSearch(xAOD::VertexContainer*& v0Container, v0_lbLinksDecor(*(v0Container->back())) = lbLink; } if (doGamma && !m_doSimpleV0) { - myGamma = std::unique_ptr<xAOD::Vertex>( massFit(22, pairV0, vertex, concreteVertexFitter) ); + myGamma = std::unique_ptr<xAOD::Vertex>( massFit(22, pairV0, vertex) ); if (myGamma && m_V0Tools->vertexProbability(myGamma.get()) >= m_minConstrVertProb) { gamma_fit = 1; gamma_prob = m_V0Tools->vertexProbability(myGamma.get()); @@ -702,19 +697,19 @@ StatusCode InDetV0FinderTool::finalize() << "\tof which : " << m_Kshort_stored << " Kshorts" << endmsg << "\t : " << m_Lambda_stored << " Lambdas" << endmsg << "\t : " << m_Lambdabar_stored << " Lambdabars" << endmsg; - msg(MSG::INFO) << "----------------------------------------------------------------------------------------------------------------------------------------------" << endmsg; + msg(MSG::DEBUG) << "----------------------------------------------------------------------------------------------------------------------------------------------" << endmsg; return StatusCode::SUCCESS; } -void InDetV0FinderTool::SGError(std::string errService) +void InDetV0FinderTool::SGError(std::string errService) const { msg(MSG::FATAL) << errService << " not found. Exiting !" << endmsg; return; } -bool InDetV0FinderTool::doFit(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D &startingPoint) +bool InDetV0FinderTool::doFit(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D &startingPoint) const { bool pass = false; double srxy = startingPoint.perp(); @@ -747,7 +742,7 @@ bool InDetV0FinderTool::doFit(const xAOD::TrackParticle* track1, const xAOD::Tra return pass; } -bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::VertexContainer * vertColl) +bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::VertexContainer * vertColl) const { bool pass = false; xAOD::VertexContainer::const_iterator vItr = vertColl->begin(); @@ -772,7 +767,7 @@ bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::Tr return pass; } -bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::Vertex* PV) +bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, const xAOD::Vertex* PV) const { bool pass = false; const Trk::Perigee* per1 = m_trackToVertexTool->perigeeAtVertex( *track1, PV->position() ); @@ -792,7 +787,7 @@ bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::Tr return pass; } -bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D PV) +bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::TrackParticle* track2, Amg::Vector3D PV) const { bool pass = false; const Trk::Perigee* per1 = m_trackToVertexTool->perigeeAtVertex( *track1, PV ); @@ -812,7 +807,7 @@ bool InDetV0FinderTool::d0Pass(const xAOD::TrackParticle* track1, const xAOD::Tr return pass; } -bool InDetV0FinderTool::pointAtVertex(const xAOD::Vertex* v0, const xAOD::Vertex* PV) +bool InDetV0FinderTool::pointAtVertex(const xAOD::Vertex* v0, const xAOD::Vertex* PV) const { bool pass = false; double v0lxy = m_V0Tools->lxy(v0,PV); @@ -832,7 +827,7 @@ bool InDetV0FinderTool::pointAtVertex(const xAOD::Vertex* v0, const xAOD::Vertex return pass; } -bool InDetV0FinderTool::pointAtVertexColl(xAOD::Vertex* v0, const xAOD::VertexContainer * vertColl) +bool InDetV0FinderTool::pointAtVertexColl(xAOD::Vertex* v0, const xAOD::VertexContainer * vertColl) const { bool pass = false; xAOD::VertexContainer::const_iterator vItr = vertColl->begin(); @@ -840,7 +835,7 @@ bool InDetV0FinderTool::pointAtVertexColl(xAOD::Vertex* v0, const xAOD::VertexCo return pass; } -double InDetV0FinderTool::invariantMass(const Trk::TrackParameters* per1, const Trk::TrackParameters* per2, double &m1, double &m2) +double InDetV0FinderTool::invariantMass(const Trk::TrackParameters* per1, const Trk::TrackParameters* per2, double m1, double m2) const { double e1sq = per1->momentum().mag2() + m1*m1; double e1 = (e1sq>0.) ? sqrt(e1sq) : 0.; @@ -852,7 +847,7 @@ double InDetV0FinderTool::invariantMass(const Trk::TrackParameters* per1, const return mass; } -bool InDetV0FinderTool::doMassFit(xAOD::Vertex* vxCandidate, int pdgID) +bool InDetV0FinderTool::doMassFit(xAOD::Vertex* vxCandidate, int pdgID) const { bool pass = false; double mass = 1000000000.; @@ -883,7 +878,7 @@ bool InDetV0FinderTool::doMassFit(xAOD::Vertex* vxCandidate, int pdgID) return pass; } -xAOD::Vertex* InDetV0FinderTool::massFit(int pdgID, std::vector<const xAOD::TrackParticle*> pairV0, Amg::Vector3D vertex, Trk::TrkV0VertexFitter* concreteVertexFitter) +xAOD::Vertex* InDetV0FinderTool::massFit(int pdgID, const std::vector<const xAOD::TrackParticle*> &pairV0, const Amg::Vector3D &vertex) const { xAOD::Vertex* vxCandidate(0); std::vector<double> masses; @@ -906,21 +901,21 @@ xAOD::Vertex* InDetV0FinderTool::massFit(int pdgID, std::vector<const xAOD::Trac } if (pdgID == 310) { if (m_useV0Fitter) { - vxCandidate = concreteVertexFitter->fit(pairV0, masses, m_massK0S, 0, vertex); + vxCandidate = m_concreteVertexFitter->fit(pairV0, masses, m_massK0S, 0, vertex); } else { vxCandidate = m_iKshortFitter->fit(pairV0, vertex); } } if (pdgID == 3122) { if (m_useV0Fitter) { - vxCandidate = concreteVertexFitter->fit(pairV0, masses, m_massLambda, 0, vertex); + vxCandidate = m_concreteVertexFitter->fit(pairV0, masses, m_massLambda, 0, vertex); } else { vxCandidate = m_iLambdaFitter->fit(pairV0, vertex); } } if (pdgID == -3122) { if (m_useV0Fitter) { - vxCandidate = concreteVertexFitter->fit(pairV0, masses, m_massLambda, 0, vertex); + vxCandidate = m_concreteVertexFitter->fit(pairV0, masses, m_massLambda, 0, vertex); } else { vxCandidate = m_iLambdabarFitter->fit(pairV0, vertex); }