diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/IT2VertexBeamSpotTool.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/IT2VertexBeamSpotTool.h deleted file mode 100644 index 19887b59eb5da0e516b7691bfd2c10cb5c0acc40..0000000000000000000000000000000000000000 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/IT2VertexBeamSpotTool.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration -*/ -#ifndef TRIGT2BEAMSPOT_IT2VERTEXBEAMSPOTTOOL_H -#define TRIGT2BEAMSPOT_IT2VERTEXBEAMSPOTTOOL_H -/// Local tools -#include "../src/T2Track.h" -#include "../src/T2Vertex.h" -//Athena tools -#include "AthContainers/DataVector.h" -#include "AthContainers/ConstDataVector.h" -#include "TrkTrack/TrackCollection.h" -#include <string> -#include <vector> -#include "GaudiKernel/IAlgTool.h" - -class TrigVertexCollection; - -/// Event statistics -// When this changes, adjust T2VertexBeamSpotMonitoring.py: EventStatistics histogram -enum Statistics -{ - allInput = 0, - hasTE = 1, - hasROI = 2, - hasTracks = 3, - hasSeedTrack = 4, - enoughTracks = 5, - hasCluster = 6, - hasVertex = 7, - hasGoodVertex = 8, - numStatistics /// Leave this entry at the end -}; - - - -namespace PESA { - class T2TrackClusterer; - - class IT2VertexBeamSpotTool : virtual public IAlgTool { - public: - DeclareInterfaceID (IT2VertexBeamSpotTool, 1, 0); - - virtual bool isGoodTrack ( const T2Track & track ) const = 0; - - - virtual bool isGoodVertex ( const T2Vertex& vertex ) const = 0; - - - virtual bool isGoodVertexBCID( const T2Vertex& vertex ) const =0; - - - virtual bool isHighPTTrack( unsigned &nTracks ) const =0; - - - virtual bool notEnoughTracks(unsigned &nTracks) const =0; - - - virtual void selectTracks( const TrackCollection* trackCollection, - ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) = 0; - - virtual void reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, - TrigVertexCollection& myVertexCollection, - DataVector< TrigVertexCollection >& mySplitVertexCollections) = 0; - - virtual void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, - DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer ) = 0; - - - virtual void resetMonitoredVariables() = 0; - - //Monitoring variables, need to be reset every event in resetMonitored variables - std::vector<bool> m_eventStageFlag; - std::vector<unsigned> m_eventStage; - - //Event info variables - unsigned int m_EventID = 0; - - //This might not have to be a member of the tool at all - //But need this in the tool as it is used in both tool and the alg - virtual bool eventStage( Statistics stage ) = 0; - - //Keep the track of how many vertices passed the selection - unsigned int m_NvtxPass; - - std::string m_vertexCollName; - - - bool m_passNpvTrigCuts; - - std::vector<T2Vertex> m_vertex; - - - }; - -} // end namespace - -#endif diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h index 66b394a62deeba81b0bb3d02faea843e8a6e215b..dbcc132a6552c64ea12f016b9c41ebd12d89003a 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpot.h @@ -29,7 +29,7 @@ /// trigger EDM #include "TrigInterfaces/AllTEAlgo.h" //Interface for the beam spot tool -#include "IT2VertexBeamSpotTool.h" +#include "T2VertexBeamSpotTool.h" namespace HLT { class TriggerElement; @@ -86,6 +86,11 @@ namespace PESA { /** Function which attaches splitted vertex collections to the trigger element output */ HLT::ErrorCode attachFeatureSplitVertex(DataVector< TrigVertexCollection > &mySplitVertexCollections, HLT::TEVec &allTEs, unsigned int type_out ); + //Until HLT::Algo inherits from AthReentrantAlgorithm or we can drop Run-2 setup + virtual bool isClonable() const override { return true; } + virtual unsigned int cardinality() const override { return 0; }//Mark as re-entrant + + //Only for Run2 settings bool m_activateTE; /*If true to be added */ bool m_activateAllTE;/*If true to be added */ @@ -116,7 +121,7 @@ namespace PESA { SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey { this, "EventInfo", "EventInfo", "" }; //Tools - ToolHandle<IT2VertexBeamSpotTool> m_beamSpotTool {this, "BeamSpotTool", "PESA::T2VertexBeamSpotTool/T2VertexBeamSpotTool" }; + ToolHandle<T2VertexBeamSpotTool> m_beamSpotTool {this, "BeamSpotTool", "PESA::T2VertexBeamSpotTool/T2VertexBeamSpotTool" }; ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"}; diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h index af8af7b0e92847c79c1d5b2108bccd8f93e19a08..795429cd4fc27921dedd86e053b3c34e002778ff 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/TrigT2BeamSpot/T2VertexBeamSpotTool.h @@ -27,6 +27,7 @@ #include <memory> // Local tools #include "../src/T2TrackManager.h" +#include "../src/T2Track.h" #include "../src/T2BeamSpot.h" #include "../src/T2SplitVertex.h" //Athena tools @@ -37,8 +38,6 @@ //Tracking #include "TrkTrack/TrackCollection.h" #include "TrigInDetToolInterfaces/ITrigPrimaryVertexFitter.h" -//BeamSpotTool interface -#include "IT2VertexBeamSpotTool.h" //Data handles #include "StoreGate/ReadCondHandleKey.h" //Beam data @@ -68,7 +67,7 @@ namespace PESA { * @author David W. Miller <David.W.Miller@cern.ch> * */ - class T2VertexBeamSpotTool : public AthAlgTool, virtual public IT2VertexBeamSpotTool{ + class T2VertexBeamSpotTool : public AthAlgTool { public: T2VertexBeamSpotTool( const std::string& type, const std::string& name, const IInterface* parent ); @@ -100,20 +99,14 @@ namespace PESA { void selectTracks( const TrackCollection* trackCollection, - ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ); - - void reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, - TrigVertexCollection& myVertexCollection, - DataVector< TrigVertexCollection >& mySplitVertexCollections ); + ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const; + unsigned int reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, + TrigVertexCollection& myVertexCollection, + DataVector< TrigVertexCollection >& mySplitVertexCollections, const EventContext& ) const; void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, - DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer ); - - - bool eventStage( Statistics stage ); - - void resetMonitoredVariables(); + DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer, const EventContext& ) const; bool m_passNpvTrigCuts; @@ -170,20 +163,24 @@ namespace PESA { unsigned int m_maxNpvTrigger; /* Monitor track parameters */ - void monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks ); + void monitor_tracks(const std::string& prefix, const std::string& suffix, const std::vector<T2Track>& tracks ) const; /* Monitor cluster parameters */ - void monitor_cluster( const T2TrackClusterer& clusterer ); + void monitor_cluster( const T2TrackClusterer& clusterer ) const; /* Monitor parameters of tracks inside the cluster */ - void monitor_cluster_tracks(T2TrackClusterer& clusterer, const Trk::Track & track ); + void monitor_cluster_tracks(T2TrackClusterer& clusterer, const Trk::Track & track ) const; /* Monitor vertex parameters */ - void monitor_vertex(std::string prefix, std::string suffix, const T2Vertex &vertex ); + void monitor_vertex(const std::string& prefix, const std::string& suffix, const T2Vertex &vertex ) const; + + std::string m_vertexCollName; private: ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"}; + + }; diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx index 61fff1f119d36e2a0e744dc78e3ccaf4f8924340..7dd0bfef22f3514c6eb390438247220bfe06f838 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.cxx @@ -12,19 +12,6 @@ namespace PESA { - double trackChi2Prob( const T2Track& track ) - { - // FIXME: unify with vertexChi2Prob() - double chi2Prob = 0.; - const int ndf = track.NDF(); - const double chi2 = track.Qual() * track.NDF(); - if ( ndf > 0 && chi2 > 0. && ! std::isinf( chi2 ) ) - { - chi2Prob = TMath::Prob(chi2,ndf); - } - return chi2Prob; - } - std::ostream& operator<<( std::ostream& os, const T2Track& track ) { diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h index 082d937fd6abb97c33785160956f005362ba51f1..08a9f9f9e50189e5a69f3ff7caff93b6acc2e2fe 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2Track.h @@ -16,7 +16,7 @@ #ifndef TRIGT2BEAMSPOT_T2TRACK_H #define TRIGT2BEAMSPOT_T2TRACK_H /// Externals -#include "TrkTrack/Track.h" +#include "TrkTrack/Track.h" #include "TrkTrackSummary/TrackSummary.h" #include "TrigInterfaces/IMonitoredAlgo.h" #include "GaudiKernel/SystemOfUnits.h" @@ -26,86 +26,87 @@ #include <vector> #include <cmath> #include <iostream> - +#include "TMath.h" namespace PESA { class T2Track; - double trackChi2Prob( const T2Track& track ); - class T2Track { public: // Constructor T2Track( const Trk::Track& track ) - : m_Chi2Prob( -1. ) // lazy evaluation - { - - const Trk::TrackParameters* trackPars = track.perigeeParameters(); - if (trackPars) { - m_D0 = trackPars->parameters()[Trk::d0]; - m_Z0 = trackPars->parameters()[Trk::z0]; - if (trackPars->covariance()) { - m_D0err = Amg::error(*(trackPars->covariance()),Trk::d0); - m_Z0err = Amg::error(*(trackPars->covariance()),Trk::z0); + { + + const Trk::TrackParameters* trackPars = track.perigeeParameters(); + if (trackPars) { + m_D0 = trackPars->parameters()[Trk::d0]; + m_Z0 = trackPars->parameters()[Trk::z0]; + if (trackPars->covariance()) { + m_D0err = Amg::error(*(trackPars->covariance()),Trk::d0); + m_Z0err = Amg::error(*(trackPars->covariance()),Trk::z0); + } + m_Phi = trackPars->parameters()[Trk::phi0]; + float theta = trackPars->parameters()[Trk::theta]; + m_Eta = -log(tan(0.5*theta)); + float qOverP = trackPars->parameters()[Trk::qOverP]; + m_Pt = std::abs(std::sin(theta)/qOverP)/Gaudi::Units::GeV; + + const Trk::FitQuality* fq = track.fitQuality(); + m_Qual = 1e8; + if (fq) { + if(fq->numberDoF()!=0) { + m_Qual = fq->chiSquared()/fq->numberDoF(); } - m_Phi = trackPars->parameters()[Trk::phi0]; - float theta = trackPars->parameters()[Trk::theta]; - m_Eta = -log(tan(0.5*theta)); - float qOverP = trackPars->parameters()[Trk::qOverP]; - m_Pt = std::abs(std::sin(theta)/qOverP)/Gaudi::Units::GeV; - - const Trk::FitQuality* fq = track.fitQuality(); - m_Qual = 1e8; - //m_NDF = 0; - if (fq) { - if(fq->numberDoF()!=0) { - m_Qual = fq->chiSquared()/fq->numberDoF(); - //m_NDF = fq->numberDoF() - 5;//Remove 5 helix parameters + } + int nPix=0; + int nSct=0; + if( track.trackSummary() != nullptr){ + nPix = track.trackSummary()->get(Trk::numberOfPixelHits); + nSct = track.trackSummary()->get(Trk::numberOfSCTHits); + } else { + for(auto tSOS = track.trackStateOnSurfaces()->begin(); + tSOS!=track.trackStateOnSurfaces()->end(); ++tSOS) { + if ((*tSOS)->type(Trk::TrackStateOnSurface::Perigee) == false) { + const Trk::FitQualityOnSurface* fq = (*tSOS)->fitQualityOnSurface(); + if(!fq) continue; + int nd = fq->numberDoF(); + if(nd==2) nPix++; + if(nd==1) nSct++; } } - int nPix=0; - int nSct=0; - if( track.trackSummary() != nullptr){ - nPix = track.trackSummary()->get(Trk::numberOfPixelHits); - nSct = track.trackSummary()->get(Trk::numberOfSCTHits); - } else { - for(auto tSOS = track.trackStateOnSurfaces()->begin(); - tSOS!=track.trackStateOnSurfaces()->end(); ++tSOS) { - if ((*tSOS)->type(Trk::TrackStateOnSurface::Perigee) == false) { - const Trk::FitQualityOnSurface* fq = (*tSOS)->fitQualityOnSurface(); - if(!fq) continue; - int nd = fq->numberDoF(); - if(nd==2) nPix++; - if(nd==1) nSct++; - } - } - } - m_PIXHits = nPix; - m_SCTHits = nSct/2; - m_SiHits = m_PIXHits + m_SCTHits; - m_NDF = (m_PIXHits + m_SCTHits)*2 - 5; - m_TRTHits = 0; //for now: FTF tracks have no TRT extension in any case } + m_PIXHits = nPix; + m_SCTHits = nSct/2; + m_SiHits = m_PIXHits + m_SCTHits; + m_NDF = (m_PIXHits + m_SCTHits)*2 - 5; + m_TRTHits = 0; //for now: FTF tracks have no TRT extension in any case } + m_Chi2Prob = -1; + const double chi2 = m_Qual * m_NDF; + if ( m_NDF > 0 && chi2 > 0. && ! std::isinf( chi2 ) ) + { + m_Chi2Prob = TMath::Prob(chi2,m_NDF); + } + } // Accessors - double Pt () const { return m_Pt ; } - double Eta () const { return m_Eta ; } - double Phi () const { return m_Phi ; } - double Z0 () const { return m_Z0 ; } - double D0 () const { return m_D0 ; } - double Z0err () const { return m_Z0err ; } - double D0err () const { return m_D0err ; } - double NDF () const { return m_NDF ; } - double Qual () const { return m_Qual ; } - double Chi2Prob() const { if ( m_Chi2Prob < 0. ) m_Chi2Prob = trackChi2Prob( *this ); return m_Chi2Prob ; } - int SiHits () const { return m_SiHits ; } - int PIXHits () const { return m_PIXHits; } - int SCTHits () const { return m_SCTHits; } - int TRTHits () const { return m_TRTHits; } + double Pt () const { return m_Pt ; } + double Eta () const { return m_Eta ; } + double Phi () const { return m_Phi ; } + double Z0 () const { return m_Z0 ; } + double D0 () const { return m_D0 ; } + double Z0err () const { return m_Z0err ; } + double D0err () const { return m_D0err ; } + double NDF () const { return m_NDF ; } + double Qual () const { return m_Qual ; } + double Chi2Prob() const { return m_Chi2Prob; } + int SiHits () const { return m_SiHits ; } + int PIXHits () const { return m_PIXHits ; } + int SCTHits () const { return m_SCTHits ; } + int TRTHits () const { return m_TRTHits ; } private: // Data members @@ -118,7 +119,7 @@ namespace PESA { double m_D0err; double m_NDF; double m_Qual; - mutable std::atomic<double> m_Chi2Prob; + double m_Chi2Prob; int m_SiHits; int m_PIXHits; int m_SCTHits; @@ -147,8 +148,8 @@ namespace PESA { m_D0 .push_back( track.D0 () ); m_Z0err .push_back( track.Z0err () ); m_D0err .push_back( track.D0err () ); - m_NDF .push_back( track.NDF () ); - m_Qual .push_back( track.Qual () ); + m_NDF .push_back( track.NDF () ); + m_Qual .push_back( track.Qual () ); m_Chi2Prob.push_back( track.Chi2Prob() ); m_SiHits .push_back( track.SiHits () ); m_PIXHits .push_back( track.PIXHits () ); diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx index eb52dabe40b5318365c5743b929fa09e02244f43..f4d3d44de7d12a53da2810551dcfa9985dee898a 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.cxx @@ -29,26 +29,11 @@ using std::abs; using namespace PESA; -// Not much to do here now, will eventually init the config parameters -T2TrackManager::T2TrackManager( int nSplit, Algorithm alg ) - // Fill the defaults - : m_nSplit ( nSplit ) - , m_alg ( alg ) - , m_altKey ( -1 ) - //, m_ordKey ( 0 ) -{ -} - - -// Will have to clean up after myself here -T2TrackManager::~T2TrackManager() -{ -} - // The meat of the class, return a vector of split clusters std::vector< ConstDataVector<TrackCollection> > -T2TrackManager::split( const TrackCollection& cluster ) +T2TrackManager::split( const TrackCollection& cluster, const EventContext& ctx ) const { + int key = ctx.eventID().event_number() %2 -1; const int nEntries = cluster.size(); //std::cout << "Reserve space" << std::endl; @@ -69,9 +54,9 @@ T2TrackManager::split( const TrackCollection& cluster ) // tracks in the 1st collection int nPos = 0; if (m_alg == Alternating) - nPos = alternatingSplit(); + nPos = alternatingSplit(key); else if (m_alg == Pt) - nPos = orderedSplit(nEntries); + nPos = orderedSplit(key, nEntries); // Add the track to the appropriate collection trackCollections[nPos].push_back(*c_itr); @@ -82,18 +67,16 @@ T2TrackManager::split( const TrackCollection& cluster ) } -int -T2TrackManager::alternatingSplit() +constexpr int T2TrackManager::alternatingSplit(int key) const { - ++m_altKey; - m_altKey %= m_nSplit; - return m_altKey; + ++key; + key %= m_nSplit; + return key; } -int -T2TrackManager::orderedSplit(const int nEntries) +constexpr int T2TrackManager::orderedSplit(int key, const int nEntries) const { - ++m_altKey; - return m_altKey * m_nSplit / nEntries; + ++key; + return key * m_nSplit / nEntries; } diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h index 1a2c44aa5a8d5813ebb5c0736216a50cf5c45857..d7a238629b9087652050809e440ebaeb479e2a11 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2TrackManager.h @@ -37,34 +37,18 @@ namespace PESA // List of the splitter algorithms enum Algorithm { Alternating, Pt, Phi, NorthSouth, Charge }; - // Constructor/Destructor - T2TrackManager( int nSplit = 2, Algorithm alg = Alternating ); - - ~T2TrackManager(); - // Return a vector of sub-clusters - std::vector< ConstDataVector<TrackCollection> > split( const TrackCollection& cluster); + std::vector< ConstDataVector<TrackCollection> > split(const TrackCollection& cluster, const EventContext& ctx) const; - // Get and Set parameters - // int GetNSplit() {return m_nSplit;} - // int GetAlg() {return m_alg;} - // void SetNSplit(int nSplit) {m_nSplit = nSplit;} - // void SetAlg(int alg) {m_alg = alg;} - void ResetKey(int key = -1) { m_altKey = key;} - private: // The splitter algorithms - int alternatingSplit(); // 1 for me, 1 for you, 2 for me, ... - int orderedSplit(int nEntries); // 1, 2, 3 for me, 1, 2, 3 for you ... + constexpr int alternatingSplit(int key) const; // 1 for me, 1 for you, 2 for me, ... + constexpr int orderedSplit(int key, int nEntries) const; // 1, 2, 3 for me, 1, 2, 3 for you ... /// Data members - int m_nSplit; // How many output clusters - int m_alg; // Which algorithm to use - - /// Algorithm helper objects - int m_altKey; // Alternating split key - //int m_ordKey; // Ordered split key + int m_nSplit = 2; // How many output clusters + int m_alg = Alternating; // Which algorithm to use }; } //PESA diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx index b64d686df2874d185416c142e3618648d6e94e9c..0ed455d0a96ba7c7a161ba52530945b532a66198 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpot.cxx @@ -104,19 +104,14 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, // Start the overall timer auto tTotal = Monitored::Timer("TIME_TotalTime"); - //Reset monitored variables from previous event - m_beamSpotTool->resetMonitoredVariables(); - // Initialize booleans for event stats - m_beamSpotTool->m_eventStageFlag = std::vector<bool>( numStatistics, false ); - m_beamSpotTool->eventStage( allInput ); - // Initialize vertex collections TrigVertexCollection myVertexCollection; DataVector< TrigVertexCollection > mySplitVertexCollections; // Be optimistic HLT::ErrorCode errorCode = HLT::OK; - + unsigned int nPassVtx = 0; + const EventContext& ctx = Algorithm::getContext(); // Process event - break to do cleanup before returning do { @@ -128,8 +123,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, } else ATH_MSG_DEBUG( "Number of input TEs = " << tes_in.size() ); - m_beamSpotTool->eventStage( hasTE ); - //----------------- // Track selection @@ -225,20 +218,16 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, - m_beamSpotTool->eventStage( hasSeedTrack ); - // Check for the total number of available tracks if( m_beamSpotTool->notEnoughTracks( nSelectedTracks ) ){ ATH_MSG_DEBUG( " Not enough total passed tracks to vertex"); break; } - m_beamSpotTool->eventStage( enoughTracks ); - //----------------------- // Vertex reconstruction // Cluster tracks in z around seed track and reconstruct vertices - m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, myVertexCollection, mySplitVertexCollections ); + nPassVtx = m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, myVertexCollection, mySplitVertexCollections, ctx ); } while (false); @@ -258,9 +247,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, HLT::TEVec allTEs = getAllTEs(tes_in); ATH_MSG_DEBUG( "n of all TEs: " << allTEs.size() ); - //Check how many vertices passed the selection - unsigned int nPassedVtx = m_beamSpotTool->m_NvtxPass; - //Save all events, or only those events which pass the Npv cuts (if activated)! if ( m_activateAllTE ) { ATH_MSG_DEBUG( "Activate all TEs" ); @@ -270,10 +256,10 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, } - if ( ! m_activateAllTE && m_activateTE && nPassedVtx > 0 ) { - ATH_MSG_DEBUG( "Activate TE with "<< nPassedVtx << " vertices" ); + if ( ! m_activateAllTE && m_activateTE && nPassVtx > 0 ) { + ATH_MSG_DEBUG( "Activate TE with "<< nPassVtx << " vertices" ); // FIXME: Why do we need one TE per vertex? - for ( unsigned i=0; i < nPassedVtx; ++i ) { + for ( unsigned i=0; i < nPassVtx; ++i ) { // Create an output TE seeded by the inputs HLT::TriggerElement* outputTE = config()->getNavigation()->addNode(allTEs, type_out); outputTE->setActiveState(true); @@ -299,10 +285,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, - //Monitoring eventStatistics - auto eventStatistics = Monitored::Collection("EventStatistics", m_beamSpotTool->m_eventStage ); - auto mon = Monitored::Group(m_monTool, eventStatistics, timeToCreateOutput ); - // Return cause you're done! return errorCode; } @@ -418,25 +400,10 @@ StatusCode T2VertexBeamSpot::execute(){ ATH_MSG_DEBUG( "Beam spot algorithm execute method" ); - - - //Reset monitored variables from previous event - m_beamSpotTool->resetMonitoredVariables(); - // Initialize booleans for event stats - m_beamSpotTool->m_eventStageFlag = std::vector<bool>( numStatistics, false ); - m_beamSpotTool->eventStage( allInput ); - const EventContext& ctx = Algorithm::getContext(); - ATH_MSG_DEBUG( "Run: " << ctx.eventID().run_number() << - " Event Number: " << ctx.eventID().event_number() << - " Lumi Block: " << ctx.eventID().lumi_block() << - " Bunch Crossing ID " << ctx.eventID().bunch_crossing_id() ); - - //Pass event ID for vertex splitting alg, TODO: need to revisit - m_beamSpotTool->m_EventID = ctx.eventID().event_number() ; //// Initialize vertex collections - SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey); + SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey, ctx); myVertexCollection = std::make_unique<TrigVertexCollection>(); //Need to convert to the write handles @@ -452,7 +419,6 @@ StatusCode T2VertexBeamSpot::execute(){ unsigned nHighPtTracks = 0; ATH_MSG_DEBUG( "Selecting tracks" ); - //Loop over trackCollections { //Monitor how long does it take to loop over all collections auto tSelectingTracks = Monitored::Timer("TIME_SelectingTracks"); @@ -462,7 +428,7 @@ StatusCode T2VertexBeamSpot::execute(){ auto nTotalPassedTracks = Monitored::Scalar<unsigned>("nTotalPassedTracks"); auto nTotalHighPTTracks = Monitored::Scalar<unsigned>("nTotalHighPTTracks"); //Loop over track collections and select tracks - SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey); + SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey, ctx); ATH_CHECK(trackCollection.isValid()); //Dereference tracks @@ -494,37 +460,28 @@ StatusCode T2VertexBeamSpot::execute(){ return StatusCode::SUCCESS; } - m_beamSpotTool->eventStage( hasSeedTrack ); - // Check for the total number of available tracks if ( ( m_beamSpotTool->notEnoughTracks(nSelectedTracks)) ) { ATH_MSG_DEBUG( "Not enough total passed tracks to vertex"); return StatusCode::SUCCESS; } - m_beamSpotTool->eventStage( enoughTracks ); - ATH_MSG_DEBUG( "Reconstruct vertices" ); //Reconstruct vertices if passed track selection { //Monitor how long does it take to loop over all collections auto tReconstructVertices = Monitored::Timer("TIME_ReconstructVertices"); - m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections ); + m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections, ctx ); //Monitor total number of tracks auto monitor = Monitored::Group(m_monTool, tReconstructVertices); } - //Do i want to call createOutputTEs even if the conditions are not fulfilled? ATH_MSG_DEBUG( "Number of track collection containers: " << mySelectedTrackCollection.size() ); //What should go as an output? SelectedTrackCollection and Vertices? //Atm just try add vertex //TODO: adding split vertices as well, will need an array - - //Monitoring eventStatistics - auto eventStatistics = Monitored::Collection("EventStatistics", m_beamSpotTool->m_eventStage ); - auto monitor = Monitored::Group(m_monTool, eventStatistics, tTotal); return StatusCode::SUCCESS; } diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx index e0e9a225143bfc6df2a9cb1e4f4dbde114558186..81e8fda7e0e0204d5b6cb99acfb800d5167c2ee1 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/T2VertexBeamSpotTool.cxx @@ -42,16 +42,6 @@ using std::abs; using namespace PESA; -//Delete a vector of dynamically created objects -template<typename T> -void deleteVector(std::vector<T*> &v){ - while(!v.empty()){ - delete v.back(); - v.pop_back(); - } - v.clear(); -} - namespace Beamspot { class TrackPTSort{ @@ -81,7 +71,6 @@ PESA::T2VertexBeamSpotTool::T2VertexBeamSpotTool( const std::string& type, const : AthAlgTool( type, name, parent), m_primaryVertexFitterTool("TrigInDetToolInterfaces/ITrigPrimaryVertexFitter", this){ - declareInterface<IT2VertexBeamSpotTool>(this); //Declare properties in here declareProperty( "BeamSpotData", m_beamSpotKey ); declareProperty( "PrimaryVertexFitter", m_primaryVertexFitterTool); @@ -165,7 +154,7 @@ StatusCode T2VertexBeamSpotTool::initialize(){ * Detailed description of the select track function ***********************************************/ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, - ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) { + ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const { ATH_MSG_DEBUG( "Selecting tracks for the beamSpot algorithm" ); @@ -177,7 +166,7 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, auto nHiPTTracksPassedPerROI = Monitored::Scalar<unsigned>("SelectedHiPTTracksPerROI", 0); //T2Track with easily accesable parameters - std::vector<const T2Track*> myTracks; myTracks.reserve(trackCollection->size() ); + std::vector<T2Track> myTracks; myTracks.reserve(trackCollection->size() ); // Loop over all tracks in the given track collections for ( TrackCollection::const_iterator trackIter = trackCollection->begin(); @@ -186,13 +175,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, const Trk::Track& track = **trackIter; // Make sure that the event has tracks - eventStage( hasTracks ); //Counter for all input tracks nTracksPerROI++; - const T2Track *myTrack = new T2Track( track ); + T2Track myTrack( track ); // Check for passed track - if ( isGoodTrack( *myTrack ) ) { + if ( isGoodTrack( myTrack ) ) { // Add this track to the set used to find a vertex mySelectedTrackCollection.push_back( *trackIter ); @@ -203,22 +191,22 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, nTracksPassedPerROI++; // Check for high-pT track - if ( myTrack->Pt() > m_trackSeedPt ){ + if ( myTrack.Pt() > m_trackSeedPt ){ //Counter for high pT tracks nHiPTTracksPassedPerROI++; } - else ATH_MSG_DEBUG( "Track->pt: " << myTrack->Pt()*GeV ); + else ATH_MSG_DEBUG( "Track.pt: " << myTrack.Pt()*GeV ); } else { - ATH_MSG_DEBUG( "Track->failed selection: d0: " << myTrack->D0() << - " z0: " << myTrack->Z0() << - " phi0: " << myTrack->Phi() << - " eta: " << myTrack->Eta() << - " pT: " << myTrack->Pt()*GeV << - " chi2: " << myTrack->Qual() << - " NpixSPs: " << myTrack->PIXHits() << - " NsctSPs: " << myTrack->SCTHits() << - " NstrawHits: " << myTrack->TRTHits() ); + ATH_MSG_DEBUG( "Track.failed selection: d0: " << myTrack.D0() << + " z0: " << myTrack.Z0() << + " phi0: " << myTrack.Phi() << + " eta: " << myTrack.Eta() << + " pT: " << myTrack.Pt()*GeV << + " chi2: " << myTrack.Qual() << + " NpixSPs: " << myTrack.PIXHits() << + " NsctSPs: " << myTrack.SCTHits() << + " NstrawHits: " << myTrack.TRTHits() ); } } //end for loop over tracks in a collection @@ -236,14 +224,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, //Monitor counters per track collection and time to select tracks auto mon = Monitored::Group(m_monTool, nTracksPerROI, nTracksPassedPerROI, nHiPTTracksPassedPerROI, timerTrackSelection ); //timers - //clear tracks - deleteVector( myTracks ); } -void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, +unsigned int T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, TrigVertexCollection& myVertexCollection, - DataVector< TrigVertexCollection >& mySplitVertexCollections) { + DataVector< TrigVertexCollection >& mySplitVertexCollections, const EventContext& ctx) const { ATH_MSG_DEBUG( "Reconstructing vertices" ); //Monitoring counters and timers @@ -309,7 +295,6 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> } // Event has a good cluster - eventStage( hasCluster ); nClusters++; // Monitor properties of of the cluster @@ -339,14 +324,11 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> continue; } - // Event has a vertex! - eventStage( hasVertex ); - // Update vertex counter nVtx++; // Extract beam spot parameters - SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey }; + SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx }; T2BeamSpot beamSpot(*beamSpotHandle); @@ -369,10 +351,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> // Add primary vertex to collection myVertexCollection.push_back( primaryVertex ); // passes ownership to vertex collection - // Event has good vertex - eventStage( hasGoodVertex ); - - //Monito parameters of the passed vertex + //Monitor parameters of the passed vertex monitor_vertex( "Vertex", "Pass", myVertex ); //Update good vertex counter @@ -405,7 +384,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> { // Split, optinally re-cluster, and fit separate vertices ATH_MSG_DEBUG( "Reconstruct split vertices"); - reconstructSplitVertices( mySplitTrackCollection, mySplitVertexCollections, trackClusterer ); + reconstructSplitVertices( mySplitTrackCollection, mySplitVertexCollections, trackClusterer, ctx ); } // Alternative 3: Split all the tracks and iterate with the remaining tracks // mySplitTrackCollection = mySelectedTrackCollection; @@ -426,19 +405,15 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> }//End looping over tracks - //Store flag whether the nvtx passed trig cuts - m_passNpvTrigCuts = (m_minNpvTrigger <= nPassVtx) && (nPassVtx <= m_maxNpvTrigger); - //Keep the track of how many vertices passed the selection - m_NvtxPass = nPassVtx; - //monitor number of (passed) vertices, clusters, etc auto mon = Monitored::Group(m_monTool, nVtx, nPassVtx, nPassBCIDVtx, nClusters, timerVertexRec ); + return static_cast<unsigned int>(nPassVtx); } void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollection>& myFullTrackCollection, DataVector< TrigVertexCollection >& mySplitVertexCollections, - T2TrackClusterer& trackClusterer ) { + T2TrackClusterer& trackClusterer, const EventContext& ctx ) const { auto timerVertexRec = Monitored::Timer("TIME_SplitVertexReconstruction"); @@ -449,10 +424,8 @@ void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollec auto mon = Monitored::Group(m_monTool, timeToSortTracks ); } - // Split the track collection (typically into halves) // This returns m_nSplitVertices (ideally) or fewer (if clustering fails) track collections - m_trackManager.ResetKey( m_EventID % 2 - 1 ); - vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector() ); + vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector(), ctx ); // Add a new track collection for the split vertices corresponding to this primary vertex // There can be anywhere between zero and m_nSplitVertices entries in the collection @@ -582,38 +555,29 @@ bool T2VertexBeamSpotTool::isGoodVertexBCID( const T2Vertex& vertex ) const { ); } -void T2VertexBeamSpotTool::resetMonitoredVariables() { - if(m_eventStageFlag.size() != 0 ) m_eventStageFlag.clear(); - if(m_eventStage.size() != 0 ) m_eventStage.clear(); - //Reset all variables just in case - m_NvtxPass = 0; - m_passNpvTrigCuts = false; - -} - //Monitoring track variables -void T2VertexBeamSpotTool::monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks ){ - auto trackPt = Monitored::Collection( prefix + "Pt" + suffix, tracks, [](const T2Track *t){ return t->Pt() ;}); - auto trackEta = Monitored::Collection( prefix + "Eta" + suffix, tracks, [](const T2Track *t){ return t->Eta() ;}); - auto trackPhi = Monitored::Collection( prefix + "Phi" + suffix, tracks, [](const T2Track *t){ return t->Phi() ;}); - auto trackZ0 = Monitored::Collection( prefix + "Z0" + suffix, tracks, [](const T2Track *t){ return t->Z0() ;}); - auto trackD0 = Monitored::Collection( prefix + "D0" + suffix, tracks, [](const T2Track *t){ return t->D0() ;}); - auto trackZ0err = Monitored::Collection( prefix + "Z0err" + suffix, tracks, [](const T2Track *t){ return t->Z0err() ;}); - auto trackD0err = Monitored::Collection( prefix + "D0err" + suffix, tracks, [](const T2Track *t){ return t->D0err() ;}); - auto trackNDF = Monitored::Collection( prefix + "NDF" + suffix, tracks, [](const T2Track *t){ return t->NDF() ;}); - auto trackQual = Monitored::Collection( prefix + "Qual" + suffix, tracks, [](const T2Track *t){ return t->Qual() ;}); - auto trackChi2Prob= Monitored::Collection( prefix + "Chi2Prob" + suffix, tracks, [](const T2Track *t){ return t->Chi2Prob();}); - auto trackSiHits = Monitored::Collection( prefix + "SiHits" + suffix, tracks, [](const T2Track *t){ return t->SiHits() ;}); - auto trackPiHits = Monitored::Collection( prefix + "PIXHits" + suffix, tracks, [](const T2Track *t){ return t->PIXHits() ;}); - auto trackSCTHits = Monitored::Collection( prefix + "SCTHits" + suffix, tracks, [](const T2Track *t){ return t->SCTHits() ;}); - auto trackTRTHits = Monitored::Collection( prefix + "TRTHits" + suffix, tracks, [](const T2Track *t){ return t->TRTHits() ;}); +void T2VertexBeamSpotTool::monitor_tracks(const std::string& prefix, const std::string& suffix, const std::vector<T2Track>& tracks ) const { + auto trackPt = Monitored::Collection( prefix + "Pt" + suffix, tracks, [](const T2Track t){ return t.Pt() ;}); + auto trackEta = Monitored::Collection( prefix + "Eta" + suffix, tracks, [](const T2Track t){ return t.Eta() ;}); + auto trackPhi = Monitored::Collection( prefix + "Phi" + suffix, tracks, [](const T2Track t){ return t.Phi() ;}); + auto trackZ0 = Monitored::Collection( prefix + "Z0" + suffix, tracks, [](const T2Track t){ return t.Z0() ;}); + auto trackD0 = Monitored::Collection( prefix + "D0" + suffix, tracks, [](const T2Track t){ return t.D0() ;}); + auto trackZ0err = Monitored::Collection( prefix + "Z0err" + suffix, tracks, [](const T2Track t){ return t.Z0err() ;}); + auto trackD0err = Monitored::Collection( prefix + "D0err" + suffix, tracks, [](const T2Track t){ return t.D0err() ;}); + auto trackNDF = Monitored::Collection( prefix + "NDF" + suffix, tracks, [](const T2Track t){ return t.NDF() ;}); + auto trackQual = Monitored::Collection( prefix + "Qual" + suffix, tracks, [](const T2Track t){ return t.Qual() ;}); + auto trackChi2Prob= Monitored::Collection( prefix + "Chi2Prob" + suffix, tracks, [](const T2Track t){ return t.Chi2Prob();}); + auto trackSiHits = Monitored::Collection( prefix + "SiHits" + suffix, tracks, [](const T2Track t){ return t.SiHits() ;}); + auto trackPiHits = Monitored::Collection( prefix + "PIXHits" + suffix, tracks, [](const T2Track t){ return t.PIXHits() ;}); + auto trackSCTHits = Monitored::Collection( prefix + "SCTHits" + suffix, tracks, [](const T2Track t){ return t.SCTHits() ;}); + auto trackTRTHits = Monitored::Collection( prefix + "TRTHits" + suffix, tracks, [](const T2Track t){ return t.TRTHits() ;}); auto mon = Monitored::Group(m_monTool, trackPt, trackEta, trackPhi, trackZ0, trackD0, trackZ0err, trackD0err, trackNDF, trackQual, trackChi2Prob, trackSiHits, trackPiHits, trackSCTHits, trackTRTHits ); } -void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer ){ +void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer ) const { auto clusterZ = Monitored::Scalar<double>("ClusterZ", clusterer.seedZ0() ); auto clusterNtracks = Monitored::Scalar<int>("ClusterZ", clusterer.cluster().size() ); auto clusterNUnusedTracks = Monitored::Scalar<int>("ClusterZ", clusterer.unusedTracks().size() ); @@ -622,7 +586,7 @@ void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer ) } -void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, const Trk::Track &track ){ +void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, const Trk::Track &track ) const { const double deltaZ0 = track.perigeeParameters()->parameters()[Trk::z0] - clusterer.seedZ0(); const AmgSymMatrix(5)& perigeeCov = *track.perigeeParameters()->covariance(); const double z0Error = std::sqrt(perigeeCov(Trk::z0,Trk::z0)); @@ -635,7 +599,7 @@ void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, c -void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix, const T2Vertex &vertex ){ +void T2VertexBeamSpotTool::monitor_vertex(const std::string& prefix, const std::string& suffix, const T2Vertex &vertex ) const { auto ntrk = Monitored::Scalar<int> ( prefix + "NTrks" + suffix, vertex.NTrks() ); auto sumpt = Monitored::Scalar<double>( prefix + "SumPt" + suffix, vertex.SumPt() ); @@ -662,13 +626,4 @@ void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix -bool T2VertexBeamSpotTool::eventStage( Statistics stage ) { - if ( ! m_eventStageFlag[ stage ] ) - { - m_eventStageFlag[ stage ] = true; - m_eventStage.push_back( stage ); - return true; - } - return false; -} diff --git a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx index 37ef18d64c355899d1e85bd409ef5ee4980ceb3f..e096e800861ba4ff758ff19abf5026221f0d2ddf 100644 --- a/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx +++ b/Trigger/TrigAlgorithms/TrigT2BeamSpot/src/components/TrigT2BeamSpot_entries.cxx @@ -1,4 +1,3 @@ -#include "TrigT2BeamSpot/IT2VertexBeamSpotTool.h" #include "TrigT2BeamSpot/T2VertexBeamSpotTool.h" #include "TrigT2BeamSpot/T2VertexBeamSpot.h"