Newer
Older
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
/** @file InDetGlobalPrimaryVertexMonAlg.h
* Implementation of inner detector global Primary Vertex monitoring tool
*
*@author
* Leonid Serkin <lserkin@cern.ch> @n
* Per Johansson <Per.Johansson@cern.ch> @n
*
* based on InDetGlobalPrimaryVertexMonTool.cxx
*
****************************************************************************/
//main header
#include "InDetGlobalPrimaryVertexMonAlg.h"
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "TrkEventPrimitives/ParamDefs.h"
#include "xAODTracking/TrackParticleContainer.h"
#include "EventPrimitives/EventPrimitivesHelpers.h"
//Standard c++
#include <vector>
InDetGlobalPrimaryVertexMonAlg::InDetGlobalPrimaryVertexMonAlg( const std::string& name, ISvcLocator* pSvcLocator ) :
AthMonitorAlgorithm(name, pSvcLocator),
m_splitVertexTrkInvFraction(2),
m_distanceSplitVxMatch(5.0),
m_splitMatchingMetric(3),
m_doEnhancedMonitoring(false)
{
declareProperty("splitVertexTrkInvFraction", m_splitVertexTrkInvFraction, "inverse fraction to split tracks (1:N)");
declareProperty("distanceSplitVertexMatch", m_distanceSplitVxMatch, "Distance for matching split-original Vertex in selection efficiency");
declareProperty("splitMatchingMetric", m_splitMatchingMetric, "Determines which function to use to calculate matching between split vertices and original input vertex -- used in selection efficiency");
declareProperty("doEnhancedMonitoring" , m_doEnhancedMonitoring, "turn on the enhanced vertex monitoring, it is triggered by the same InDetFlag that also triggers the creation of no beam constraint and split vertices");
}
InDetGlobalPrimaryVertexMonAlg::~InDetGlobalPrimaryVertexMonAlg() {}
StatusCode InDetGlobalPrimaryVertexMonAlg::initialize() {
ATH_CHECK( m_vxContainerName.initialize() );
ATH_CHECK( m_vxContainerNameSplit.initialize() );
return AthMonitorAlgorithm::initialize();
}
StatusCode InDetGlobalPrimaryVertexMonAlg::fillHistograms( const EventContext& ctx ) const {
using namespace Monitored;
//*******************************************************************************
//************************** Begin of filling Track Histograms ******************
//*******************************************************************************
ATH_MSG_DEBUG("Filling InDetGlobalPrimaryVertexMonAlg");
// For histogram naming
auto pvGroup = getGroup("PrimaryVertex");
// retrieving vertices
auto handle_vxContainer = SG::makeHandle(m_vxContainerName, ctx); // another way to access ??
if (!handle_vxContainer.isPresent()) {
ATH_MSG_DEBUG ("InDetGlobalPrimaryVertexMonAlg: StoreGate doesn't contain primary vertex container with key "+m_vxContainerName.key());
return StatusCode::SUCCESS;
}
if (!handle_vxContainer.isValid()) {
ATH_MSG_ERROR ("InDetGlobalPrimaryVertexMonAlg: Could not retrieve primary vertex container with key "+m_vxContainerName.key());
return StatusCode::RECOVERABLE;
}
auto vertexContainer = handle_vxContainer.cptr();
// Total number of vertices (primary and pile up)
int pvN = vertexContainer->size()-1; // exclude dummy vertex
auto pvN_m = Monitored::Scalar<int>( "m_PvN", pvN);
fill(pvGroup, pvN_m);
int nPriVtx = 0;
int nPileupVtx = 0;
for(const auto & vtx : *vertexContainer) {
if ( !vtx ) continue;
if (vtx->vertexType() == xAOD::VxType::PriVtx) nPriVtx++;
if (vtx->vertexType() == xAOD::VxType::PileUp) nPileupVtx++;
if (vtx->vertexType() != xAOD::VxType::PriVtx) continue;
if (vtx->numberDoF() <= 0) continue;
float pvX = vtx->position().x();
auto pvX_m = Monitored::Scalar<float>( "m_PvX", pvX);
fill(pvGroup, pvX_m);
float pvY = vtx->position().y();
auto pvY_m = Monitored::Scalar<float>( "m_PvY", pvY);
fill(pvGroup, pvY_m);
float pvZ = vtx->position().z();
auto pvZ_m = Monitored::Scalar<float>( "m_PvZ", pvZ);
fill(pvGroup, pvZ_m);
float pvErrX = Amg::error( vtx->covariancePosition(), Trk::x);
auto pvErrX_m = Monitored::Scalar<float>( "m_PvErrX", pvErrX);
fill(pvGroup, pvErrX_m);
float pvErrY = Amg::error( vtx->covariancePosition(), Trk::y);
auto pvErrY_m = Monitored::Scalar<float>( "m_PvErrY", pvErrY);
fill(pvGroup, pvErrY_m);
float pvErrZ = Amg::error( vtx->covariancePosition(), Trk::z);
auto pvErrZ_m = Monitored::Scalar<float>( "m_PvErrZ", pvErrZ);
fill(pvGroup, pvErrZ_m);
float pvChiSqDoF = vtx->chiSquared() / vtx->numberDoF() ;
auto pvChiSqDoF_m = Monitored::Scalar<float>( "m_PvChiSqDoF", pvChiSqDoF);
fill(pvGroup, pvChiSqDoF_m);
auto & trackparticles = vtx->trackParticleLinks();
int pvNTracks = trackparticles.size() ;
auto pvNTracks_m = Monitored::Scalar<int>( "m_PvNTracks", pvNTracks);
fill(pvGroup, pvNTracks_m);
// original tracks used for primary vertex
for (const auto & trackparticle : trackparticles)
{
const Trk::Perigee & measuredPerigee = (*trackparticle)->perigeeParameters();
float pvTrackEta = measuredPerigee.eta() ;
auto pvTrackEta_m = Monitored::Scalar<float>( "m_PvTrackEta", pvTrackEta);
fill(pvGroup, pvTrackEta_m);
float pvTrackPt = measuredPerigee.pT()/1000. ; // Histo is in GeV
auto pvTrackPt_m = Monitored::Scalar<float>( "m_PvTrackPt", pvTrackPt);
fill(pvGroup, pvTrackPt_m);
}
} // vxContainer
auto nPriVtx_m = Monitored::Scalar<int>( "m_nPriVtx", nPriVtx);
fill(pvGroup, nPriVtx_m);
auto nPileupVtx_m = Monitored::Scalar<int>( "m_nPileupVtx", nPileupVtx);
fill(pvGroup, nPileupVtx_m);
// EnhancedMonitoring is OFF
//*******************************************************************************
//**************************** End of filling Track Histograms ******************
//*******************************************************************************
return StatusCode::SUCCESS;
}