Skip to content
Snippets Groups Projects
Commit ed92ac28 authored by Stewart Martin-Haugh's avatar Stewart Martin-Haugh
Browse files

Make T2VertexBeamSpot reentrant

parent 1c91f626
No related branches found
No related tags found
No related merge requests found
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
/// trigger EDM /// trigger EDM
#include "TrigInterfaces/AllTEAlgo.h" #include "TrigInterfaces/AllTEAlgo.h"
//Interface for the beam spot tool //Interface for the beam spot tool
#include "IT2VertexBeamSpotTool.h" #include "T2VertexBeamSpotTool.h"
namespace HLT { namespace HLT {
class TriggerElement; class TriggerElement;
...@@ -86,6 +86,11 @@ namespace PESA { ...@@ -86,6 +86,11 @@ namespace PESA {
/** Function which attaches splitted vertex collections to the trigger element output */ /** Function which attaches splitted vertex collections to the trigger element output */
HLT::ErrorCode attachFeatureSplitVertex(DataVector< TrigVertexCollection > &mySplitVertexCollections, HLT::TEVec &allTEs, unsigned int type_out ); 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 //Only for Run2 settings
bool m_activateTE; /*If true to be added */ bool m_activateTE; /*If true to be added */
bool m_activateAllTE;/*If true to be added */ bool m_activateAllTE;/*If true to be added */
...@@ -116,7 +121,7 @@ namespace PESA { ...@@ -116,7 +121,7 @@ namespace PESA {
SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey { this, "EventInfo", "EventInfo", "" }; SG::ReadHandleKey<xAOD::EventInfo> m_eventInfoKey { this, "EventInfo", "EventInfo", "" };
//Tools //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"}; ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <memory> #include <memory>
// Local tools // Local tools
#include "../src/T2TrackManager.h" #include "../src/T2TrackManager.h"
#include "../src/T2Track.h"
#include "../src/T2BeamSpot.h" #include "../src/T2BeamSpot.h"
#include "../src/T2SplitVertex.h" #include "../src/T2SplitVertex.h"
//Athena tools //Athena tools
...@@ -37,8 +38,6 @@ ...@@ -37,8 +38,6 @@
//Tracking //Tracking
#include "TrkTrack/TrackCollection.h" #include "TrkTrack/TrackCollection.h"
#include "TrigInDetToolInterfaces/ITrigPrimaryVertexFitter.h" #include "TrigInDetToolInterfaces/ITrigPrimaryVertexFitter.h"
//BeamSpotTool interface
#include "IT2VertexBeamSpotTool.h"
//Data handles //Data handles
#include "StoreGate/ReadCondHandleKey.h" #include "StoreGate/ReadCondHandleKey.h"
//Beam data //Beam data
...@@ -68,7 +67,7 @@ namespace PESA { ...@@ -68,7 +67,7 @@ namespace PESA {
* @author David W. Miller <David.W.Miller@cern.ch> * @author David W. Miller <David.W.Miller@cern.ch>
* *
*/ */
class T2VertexBeamSpotTool : public AthAlgTool, virtual public IT2VertexBeamSpotTool{ class T2VertexBeamSpotTool : public AthAlgTool {
public: public:
T2VertexBeamSpotTool( const std::string& type, const std::string& name, const IInterface* parent ); T2VertexBeamSpotTool( const std::string& type, const std::string& name, const IInterface* parent );
...@@ -100,20 +99,14 @@ namespace PESA { ...@@ -100,20 +99,14 @@ namespace PESA {
void selectTracks( const TrackCollection* trackCollection, void selectTracks( const TrackCollection* trackCollection,
ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ); ConstDataVector<TrackCollection>& mySelectedTrackCollection, std::vector<unsigned> &trackCounter ) const;
void reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
TrigVertexCollection& myVertexCollection,
DataVector< TrigVertexCollection >& mySplitVertexCollections );
unsigned int reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
TrigVertexCollection& myVertexCollection,
DataVector< TrigVertexCollection >& mySplitVertexCollections, const EventContext& ) const;
void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, void reconstructSplitVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer ); DataVector< TrigVertexCollection >& mySplitVertexCollections, T2TrackClusterer& trackClusterer, const EventContext& ) const;
bool eventStage( Statistics stage );
void resetMonitoredVariables();
bool m_passNpvTrigCuts; bool m_passNpvTrigCuts;
...@@ -170,20 +163,24 @@ namespace PESA { ...@@ -170,20 +163,24 @@ namespace PESA {
unsigned int m_maxNpvTrigger; unsigned int m_maxNpvTrigger;
/* Monitor track parameters */ /* 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 */ /* Monitor cluster parameters */
void monitor_cluster( const T2TrackClusterer& clusterer ); void monitor_cluster( const T2TrackClusterer& clusterer ) const;
/* Monitor parameters of tracks inside the cluster */ /* 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 */ /* 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: private:
ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"}; ToolHandle<GenericMonitoringTool> m_monTool{this,"MonTool","","Monitoring tool"};
}; };
......
...@@ -104,19 +104,14 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, ...@@ -104,19 +104,14 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
// Start the overall timer // Start the overall timer
auto tTotal = Monitored::Timer("TIME_TotalTime"); 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 // Initialize vertex collections
TrigVertexCollection myVertexCollection; TrigVertexCollection myVertexCollection;
DataVector< TrigVertexCollection > mySplitVertexCollections; DataVector< TrigVertexCollection > mySplitVertexCollections;
// Be optimistic // Be optimistic
HLT::ErrorCode errorCode = HLT::OK; HLT::ErrorCode errorCode = HLT::OK;
unsigned int nPassVtx = 0;
const EventContext& ctx = Algorithm::getContext();
// Process event - break to do cleanup before returning // Process event - break to do cleanup before returning
do do
{ {
...@@ -128,8 +123,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, ...@@ -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() ); else ATH_MSG_DEBUG( "Number of input TEs = " << tes_in.size() );
m_beamSpotTool->eventStage( hasTE );
//----------------- //-----------------
// Track selection // Track selection
...@@ -225,20 +218,16 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, ...@@ -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 // Check for the total number of available tracks
if( m_beamSpotTool->notEnoughTracks( nSelectedTracks ) ){ if( m_beamSpotTool->notEnoughTracks( nSelectedTracks ) ){
ATH_MSG_DEBUG( " Not enough total passed tracks to vertex"); ATH_MSG_DEBUG( " Not enough total passed tracks to vertex");
break; break;
} }
m_beamSpotTool->eventStage( enoughTracks );
//----------------------- //-----------------------
// Vertex reconstruction // Vertex reconstruction
// Cluster tracks in z around seed track and reconstruct vertices // 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); } while (false);
...@@ -258,9 +247,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, ...@@ -258,9 +247,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
HLT::TEVec allTEs = getAllTEs(tes_in); HLT::TEVec allTEs = getAllTEs(tes_in);
ATH_MSG_DEBUG( "n of all TEs: " << allTEs.size() ); 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)! //Save all events, or only those events which pass the Npv cuts (if activated)!
if ( m_activateAllTE ) { if ( m_activateAllTE ) {
ATH_MSG_DEBUG( "Activate all TEs" ); ATH_MSG_DEBUG( "Activate all TEs" );
...@@ -270,10 +256,10 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, ...@@ -270,10 +256,10 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in,
} }
if ( ! m_activateAllTE && m_activateTE && nPassedVtx > 0 ) { if ( ! m_activateAllTE && m_activateTE && nPassVtx > 0 ) {
ATH_MSG_DEBUG( "Activate TE with "<< nPassedVtx << " vertices" ); ATH_MSG_DEBUG( "Activate TE with "<< nPassVtx << " vertices" );
// FIXME: Why do we need one TE per vertex? // 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 // Create an output TE seeded by the inputs
HLT::TriggerElement* outputTE = config()->getNavigation()->addNode(allTEs, type_out); HLT::TriggerElement* outputTE = config()->getNavigation()->addNode(allTEs, type_out);
outputTE->setActiveState(true); outputTE->setActiveState(true);
...@@ -299,10 +285,6 @@ HLT::ErrorCode T2VertexBeamSpot::hltExecute( std::vector< HLT::TEVec >& tes_in, ...@@ -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 cause you're done!
return errorCode; return errorCode;
} }
...@@ -418,25 +400,10 @@ StatusCode T2VertexBeamSpot::execute(){ ...@@ -418,25 +400,10 @@ StatusCode T2VertexBeamSpot::execute(){
ATH_MSG_DEBUG( "Beam spot algorithm execute method" ); 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(); 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 //// Initialize vertex collections
SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey); SG::WriteHandle<TrigVertexCollection> myVertexCollection(m_outputVertexCollectionKey, ctx);
myVertexCollection = std::make_unique<TrigVertexCollection>(); myVertexCollection = std::make_unique<TrigVertexCollection>();
//Need to convert to the write handles //Need to convert to the write handles
...@@ -452,7 +419,6 @@ StatusCode T2VertexBeamSpot::execute(){ ...@@ -452,7 +419,6 @@ StatusCode T2VertexBeamSpot::execute(){
unsigned nHighPtTracks = 0; unsigned nHighPtTracks = 0;
ATH_MSG_DEBUG( "Selecting tracks" ); ATH_MSG_DEBUG( "Selecting tracks" );
//Loop over trackCollections
{ {
//Monitor how long does it take to loop over all collections //Monitor how long does it take to loop over all collections
auto tSelectingTracks = Monitored::Timer("TIME_SelectingTracks"); auto tSelectingTracks = Monitored::Timer("TIME_SelectingTracks");
...@@ -462,7 +428,7 @@ StatusCode T2VertexBeamSpot::execute(){ ...@@ -462,7 +428,7 @@ StatusCode T2VertexBeamSpot::execute(){
auto nTotalPassedTracks = Monitored::Scalar<unsigned>("nTotalPassedTracks"); auto nTotalPassedTracks = Monitored::Scalar<unsigned>("nTotalPassedTracks");
auto nTotalHighPTTracks = Monitored::Scalar<unsigned>("nTotalHighPTTracks"); auto nTotalHighPTTracks = Monitored::Scalar<unsigned>("nTotalHighPTTracks");
//Loop over track collections and select tracks //Loop over track collections and select tracks
SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey); SG::ReadHandle<TrackCollection> trackCollection (m_trackCollectionKey, ctx);
ATH_CHECK(trackCollection.isValid()); ATH_CHECK(trackCollection.isValid());
//Dereference tracks //Dereference tracks
...@@ -494,37 +460,28 @@ StatusCode T2VertexBeamSpot::execute(){ ...@@ -494,37 +460,28 @@ StatusCode T2VertexBeamSpot::execute(){
return StatusCode::SUCCESS; return StatusCode::SUCCESS;
} }
m_beamSpotTool->eventStage( hasSeedTrack );
// Check for the total number of available tracks // Check for the total number of available tracks
if ( ( m_beamSpotTool->notEnoughTracks(nSelectedTracks)) ) { if ( ( m_beamSpotTool->notEnoughTracks(nSelectedTracks)) ) {
ATH_MSG_DEBUG( "Not enough total passed tracks to vertex"); ATH_MSG_DEBUG( "Not enough total passed tracks to vertex");
return StatusCode::SUCCESS; return StatusCode::SUCCESS;
} }
m_beamSpotTool->eventStage( enoughTracks );
ATH_MSG_DEBUG( "Reconstruct vertices" ); ATH_MSG_DEBUG( "Reconstruct vertices" );
//Reconstruct vertices if passed track selection //Reconstruct vertices if passed track selection
{ {
//Monitor how long does it take to loop over all collections //Monitor how long does it take to loop over all collections
auto tReconstructVertices = Monitored::Timer("TIME_ReconstructVertices"); auto tReconstructVertices = Monitored::Timer("TIME_ReconstructVertices");
m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections ); m_beamSpotTool->reconstructVertices( mySelectedTrackCollection, *myVertexCollection, mySplitVertexCollections, ctx );
//Monitor total number of tracks //Monitor total number of tracks
auto monitor = Monitored::Group(m_monTool, tReconstructVertices); 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() ); ATH_MSG_DEBUG( "Number of track collection containers: " << mySelectedTrackCollection.size() );
//What should go as an output? SelectedTrackCollection and Vertices? //What should go as an output? SelectedTrackCollection and Vertices?
//Atm just try add vertex //Atm just try add vertex
//TODO: adding split vertices as well, will need an array //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; return StatusCode::SUCCESS;
} }
...@@ -42,16 +42,6 @@ using std::abs; ...@@ -42,16 +42,6 @@ using std::abs;
using namespace PESA; 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 namespace Beamspot
{ {
class TrackPTSort{ class TrackPTSort{
...@@ -81,7 +71,6 @@ PESA::T2VertexBeamSpotTool::T2VertexBeamSpotTool( const std::string& type, const ...@@ -81,7 +71,6 @@ PESA::T2VertexBeamSpotTool::T2VertexBeamSpotTool( const std::string& type, const
: AthAlgTool( type, name, parent), : AthAlgTool( type, name, parent),
m_primaryVertexFitterTool("TrigInDetToolInterfaces/ITrigPrimaryVertexFitter", this){ m_primaryVertexFitterTool("TrigInDetToolInterfaces/ITrigPrimaryVertexFitter", this){
declareInterface<IT2VertexBeamSpotTool>(this);
//Declare properties in here //Declare properties in here
declareProperty( "BeamSpotData", m_beamSpotKey ); declareProperty( "BeamSpotData", m_beamSpotKey );
declareProperty( "PrimaryVertexFitter", m_primaryVertexFitterTool); declareProperty( "PrimaryVertexFitter", m_primaryVertexFitterTool);
...@@ -165,7 +154,7 @@ StatusCode T2VertexBeamSpotTool::initialize(){ ...@@ -165,7 +154,7 @@ StatusCode T2VertexBeamSpotTool::initialize(){
* Detailed description of the select track function * Detailed description of the select track function
***********************************************/ ***********************************************/
void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, 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" ); ATH_MSG_DEBUG( "Selecting tracks for the beamSpot algorithm" );
...@@ -177,7 +166,7 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, ...@@ -177,7 +166,7 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
auto nHiPTTracksPassedPerROI = Monitored::Scalar<unsigned>("SelectedHiPTTracksPerROI", 0); auto nHiPTTracksPassedPerROI = Monitored::Scalar<unsigned>("SelectedHiPTTracksPerROI", 0);
//T2Track with easily accesable parameters //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 // Loop over all tracks in the given track collections
for ( TrackCollection::const_iterator trackIter = trackCollection->begin(); for ( TrackCollection::const_iterator trackIter = trackCollection->begin();
...@@ -186,13 +175,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, ...@@ -186,13 +175,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
const Trk::Track& track = **trackIter; const Trk::Track& track = **trackIter;
// Make sure that the event has tracks // Make sure that the event has tracks
eventStage( hasTracks );
//Counter for all input tracks //Counter for all input tracks
nTracksPerROI++; nTracksPerROI++;
const T2Track *myTrack = new T2Track( track ); T2Track myTrack( track );
// Check for passed track // Check for passed track
if ( isGoodTrack( *myTrack ) ) { if ( isGoodTrack( myTrack ) ) {
// Add this track to the set used to find a vertex // Add this track to the set used to find a vertex
mySelectedTrackCollection.push_back( *trackIter ); mySelectedTrackCollection.push_back( *trackIter );
...@@ -203,22 +191,22 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, ...@@ -203,22 +191,22 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
nTracksPassedPerROI++; nTracksPassedPerROI++;
// Check for high-pT track // Check for high-pT track
if ( myTrack->Pt() > m_trackSeedPt ){ if ( myTrack.Pt() > m_trackSeedPt ){
//Counter for high pT tracks //Counter for high pT tracks
nHiPTTracksPassedPerROI++; nHiPTTracksPassedPerROI++;
} }
else ATH_MSG_DEBUG( "Track->pt: " << myTrack->Pt()*GeV ); else ATH_MSG_DEBUG( "Track.pt: " << myTrack.Pt()*GeV );
} }
else { else {
ATH_MSG_DEBUG( "Track->failed selection: d0: " << myTrack->D0() << ATH_MSG_DEBUG( "Track.failed selection: d0: " << myTrack.D0() <<
" z0: " << myTrack->Z0() << " z0: " << myTrack.Z0() <<
" phi0: " << myTrack->Phi() << " phi0: " << myTrack.Phi() <<
" eta: " << myTrack->Eta() << " eta: " << myTrack.Eta() <<
" pT: " << myTrack->Pt()*GeV << " pT: " << myTrack.Pt()*GeV <<
" chi2: " << myTrack->Qual() << " chi2: " << myTrack.Qual() <<
" NpixSPs: " << myTrack->PIXHits() << " NpixSPs: " << myTrack.PIXHits() <<
" NsctSPs: " << myTrack->SCTHits() << " NsctSPs: " << myTrack.SCTHits() <<
" NstrawHits: " << myTrack->TRTHits() ); " NstrawHits: " << myTrack.TRTHits() );
} }
} //end for loop over tracks in a collection } //end for loop over tracks in a collection
...@@ -236,14 +224,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection, ...@@ -236,14 +224,12 @@ void T2VertexBeamSpotTool::selectTracks( const TrackCollection* trackCollection,
//Monitor counters per track collection and time to select tracks //Monitor counters per track collection and time to select tracks
auto mon = Monitored::Group(m_monTool, nTracksPerROI, nTracksPassedPerROI, nHiPTTracksPassedPerROI, auto mon = Monitored::Group(m_monTool, nTracksPerROI, nTracksPassedPerROI, nHiPTTracksPassedPerROI,
timerTrackSelection ); //timers timerTrackSelection ); //timers
//clear tracks
deleteVector( myTracks );
} }
void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection, unsigned int T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>& mySelectedTrackCollection,
TrigVertexCollection& myVertexCollection, TrigVertexCollection& myVertexCollection,
DataVector< TrigVertexCollection >& mySplitVertexCollections) { DataVector< TrigVertexCollection >& mySplitVertexCollections, const EventContext& ctx) const {
ATH_MSG_DEBUG( "Reconstructing vertices" ); ATH_MSG_DEBUG( "Reconstructing vertices" );
//Monitoring counters and timers //Monitoring counters and timers
...@@ -309,7 +295,6 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> ...@@ -309,7 +295,6 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
} }
// Event has a good cluster // Event has a good cluster
eventStage( hasCluster );
nClusters++; nClusters++;
// Monitor properties of of the cluster // Monitor properties of of the cluster
...@@ -339,14 +324,11 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> ...@@ -339,14 +324,11 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
continue; continue;
} }
// Event has a vertex!
eventStage( hasVertex );
// Update vertex counter // Update vertex counter
nVtx++; nVtx++;
// Extract beam spot parameters // Extract beam spot parameters
SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey }; SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey, ctx };
T2BeamSpot beamSpot(*beamSpotHandle); T2BeamSpot beamSpot(*beamSpotHandle);
...@@ -369,10 +351,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> ...@@ -369,10 +351,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
// Add primary vertex to collection // Add primary vertex to collection
myVertexCollection.push_back( primaryVertex ); // passes ownership to vertex collection myVertexCollection.push_back( primaryVertex ); // passes ownership to vertex collection
// Event has good vertex //Monitor parameters of the passed vertex
eventStage( hasGoodVertex );
//Monito parameters of the passed vertex
monitor_vertex( "Vertex", "Pass", myVertex ); monitor_vertex( "Vertex", "Pass", myVertex );
//Update good vertex counter //Update good vertex counter
...@@ -405,7 +384,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> ...@@ -405,7 +384,7 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
{ {
// Split, optinally re-cluster, and fit separate vertices // Split, optinally re-cluster, and fit separate vertices
ATH_MSG_DEBUG( "Reconstruct split 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 // Alternative 3: Split all the tracks and iterate with the remaining tracks
// mySplitTrackCollection = mySelectedTrackCollection; // mySplitTrackCollection = mySelectedTrackCollection;
...@@ -426,19 +405,15 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection> ...@@ -426,19 +405,15 @@ void T2VertexBeamSpotTool::reconstructVertices( ConstDataVector<TrackCollection>
}//End looping over tracks }//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 //monitor number of (passed) vertices, clusters, etc
auto mon = Monitored::Group(m_monTool, nVtx, nPassVtx, nPassBCIDVtx, nClusters, timerVertexRec ); auto mon = Monitored::Group(m_monTool, nVtx, nPassVtx, nPassBCIDVtx, nClusters, timerVertexRec );
return static_cast<unsigned int>(nPassVtx);
} }
void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollection>& myFullTrackCollection, void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollection>& myFullTrackCollection,
DataVector< TrigVertexCollection >& mySplitVertexCollections, DataVector< TrigVertexCollection >& mySplitVertexCollections,
T2TrackClusterer& trackClusterer ) { T2TrackClusterer& trackClusterer, const EventContext& ctx ) const {
auto timerVertexRec = Monitored::Timer("TIME_SplitVertexReconstruction"); auto timerVertexRec = Monitored::Timer("TIME_SplitVertexReconstruction");
...@@ -449,10 +424,8 @@ void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollec ...@@ -449,10 +424,8 @@ void T2VertexBeamSpotTool::reconstructSplitVertices( ConstDataVector<TrackCollec
auto mon = Monitored::Group(m_monTool, timeToSortTracks ); 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 // 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(), ctx );
vector< ConstDataVector<TrackCollection> > splitTrackCollections = m_trackManager.split( *myFullTrackCollection.asDataVector() );
// Add a new track collection for the split vertices corresponding to this primary vertex // 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 // There can be anywhere between zero and m_nSplitVertices entries in the collection
...@@ -582,38 +555,29 @@ bool T2VertexBeamSpotTool::isGoodVertexBCID( const T2Vertex& vertex ) const { ...@@ -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 //Monitoring track variables
void T2VertexBeamSpotTool::monitor_tracks(std::string prefix, std::string suffix, std::vector<const T2Track*> tracks ){ 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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, auto mon = Monitored::Group(m_monTool, trackPt, trackEta, trackPhi, trackZ0, trackD0, trackZ0err, trackD0err,
trackNDF, trackQual, trackChi2Prob, trackSiHits, trackPiHits, trackSCTHits, trackTRTHits ); 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 clusterZ = Monitored::Scalar<double>("ClusterZ", clusterer.seedZ0() );
auto clusterNtracks = Monitored::Scalar<int>("ClusterZ", clusterer.cluster().size() ); auto clusterNtracks = Monitored::Scalar<int>("ClusterZ", clusterer.cluster().size() );
auto clusterNUnusedTracks = Monitored::Scalar<int>("ClusterZ", clusterer.unusedTracks().size() ); auto clusterNUnusedTracks = Monitored::Scalar<int>("ClusterZ", clusterer.unusedTracks().size() );
...@@ -622,7 +586,7 @@ void T2VertexBeamSpotTool::monitor_cluster( const T2TrackClusterer& clusterer ) ...@@ -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 double deltaZ0 = track.perigeeParameters()->parameters()[Trk::z0] - clusterer.seedZ0();
const AmgSymMatrix(5)& perigeeCov = *track.perigeeParameters()->covariance(); const AmgSymMatrix(5)& perigeeCov = *track.perigeeParameters()->covariance();
const double z0Error = std::sqrt(perigeeCov(Trk::z0,Trk::z0)); const double z0Error = std::sqrt(perigeeCov(Trk::z0,Trk::z0));
...@@ -635,7 +599,7 @@ void T2VertexBeamSpotTool::monitor_cluster_tracks(T2TrackClusterer &clusterer, c ...@@ -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 ntrk = Monitored::Scalar<int> ( prefix + "NTrks" + suffix, vertex.NTrks() );
auto sumpt = Monitored::Scalar<double>( prefix + "SumPt" + suffix, vertex.SumPt() ); auto sumpt = Monitored::Scalar<double>( prefix + "SumPt" + suffix, vertex.SumPt() );
...@@ -662,13 +626,4 @@ void T2VertexBeamSpotTool::monitor_vertex(std::string prefix, std::string suffix ...@@ -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;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment