ATLAS Offline Software
Reco_Vertex.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // Reco_Vertex.cxx
8 // Author: Daniel Scheirich <daniel.scheirich@cern.ch>
9 // Based on the Integrated Simulation Framework
10 //
11 // Basic Jpsi->mu mu derivation example
12 
18 
19 namespace DerivationFramework {
20 
21  Reco_Vertex::Reco_Vertex(const std::string& t,
22  const std::string& n,
23  const IInterface* p) :
24  AthAlgTool(t,n,p),
25  m_v0Tools("Trk::V0Tools", this),
26  m_SearchTool("",this),
27  m_pvRefitter("Analysis::PrimaryVertexRefitter", this)
28  {
29  declareInterface<DerivationFramework::IAugmentationTool>(this);
30 
31  // Declare tools
32  declareProperty("V0Tools" , m_v0Tools);
33  declareProperty("VertexSearchTool", m_SearchTool);
34  declareProperty("PVRefitter", m_pvRefitter);
35 
36  // Declare user-defined properties
37  declareProperty("OutputVtxContainerName", m_outputVtxContainerName = "OniaCandidates");
38  declareProperty("PVContainerName" , m_pvContainerName = "PrimaryVertices");
39  declareProperty("RefPVContainerName" , m_refPVContainerName = "RefittedPrimaryVertices");
40  declareProperty("RefitPV" , m_refitPV = false);
41  declareProperty("MaxPVrefit" , m_PV_max = 1000);
42  declareProperty("DoVertexType" , m_DoVertexType = 7);
43  // minimum number of tracks for PV to be considered for PV association
44  declareProperty("MinNTracksInPV" , m_PV_minNTracks = 0);
45  declareProperty("Do3d" , m_do3d = false);
46  declareProperty("CheckCollections" , m_checkCollections = false);
47  declareProperty("CheckVertexContainers" , m_CollectionsToCheck);
48  }
49 
50  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
51 
53  {
54 
55  ATH_MSG_DEBUG("in initialize()");
56 
57  // retrieve V0 tools
58  CHECK( m_v0Tools.retrieve() );
59 
60  // get the Search tool
61  CHECK( m_SearchTool.retrieve() );
62 
63  // get the PrimaryVertexRefitter tool
64  CHECK( m_pvRefitter.retrieve() );
65 
66  // Get the beam spot service
68 
69 
70  ATH_CHECK(m_outputVtxContainerName.initialize());
71  ATH_CHECK(m_pvContainerName.initialize());
72  ATH_CHECK(m_refPVContainerName.initialize());
73  ATH_CHECK(m_RelinkContainers.initialize());
74  ATH_CHECK(m_RelinkMuons.initialize());
76  return StatusCode::SUCCESS;
77 
78  }
79 
80  // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
81 
83  {
84  bool callTool = true;
85  const EventContext& ctx = Gaudi::Hive::currentContext();
86  if(m_checkCollections) {
87  for(const auto &str : m_CollectionsToCheck){
89  ATH_CHECK(handle.isValid());
90  if(handle->size() == 0) {
91  callTool = false;
92  ATH_MSG_DEBUG("Container VertexContainer (" << str << ") is empty");
93  break;//No point checking other containers
94  }
95  }
96  }
97 
98  // Vertex container and its auxilliary store
99  std::unique_ptr<xAOD::VertexContainer> vtxContainer = std::make_unique<xAOD::VertexContainer>();
100  std::unique_ptr<xAOD::VertexAuxContainer> vtxAuxContainer = std::make_unique<xAOD::VertexAuxContainer>();
101  vtxContainer->setStore(vtxAuxContainer.get());
102 
103  if(callTool) {
104  //----------------------------------------------------
105  // call Tool
106  //----------------------------------------------------
107  if( !m_SearchTool->performSearch(ctx,*vtxContainer).isSuccess() ) {
108  ATH_MSG_FATAL("Tool (" << m_SearchTool << ") failed.");
109  return StatusCode::FAILURE;
110  }
111 
112  //----------------------------------------------------
113  // retrieve primary vertices
114  //----------------------------------------------------
116 
117  //----------------------------------------------------
118  // Try to retrieve refitted primary vertices
119  //----------------------------------------------------
120  std::unique_ptr<xAOD::VertexContainer> refPvContainer;
121  std::unique_ptr<xAOD::VertexAuxContainer> refPvAuxContainer;
122  if(m_refitPV) {
123  // refitted PV container does not exist. Create a new one.
124  refPvContainer = std::make_unique<xAOD::VertexContainer>();
125  refPvAuxContainer = std::make_unique<xAOD::VertexAuxContainer>();
126  refPvContainer->setStore(refPvAuxContainer.get());
127  }
128 
129  // Give the helper class the ptr to v0tools and beamSpotsSvc to use
131  if(not evt.isValid()) ATH_MSG_ERROR("Cannot Retrieve " << evt.key() );
132  BPhysPVTools helper(&(*m_v0Tools), evt.cptr());
133  helper.SetMinNTracksInPV(m_PV_minNTracks);
134  helper.SetSave3d(m_do3d);
135 
136  if(m_refitPV){
137  if(vtxContainer->size() >0){
138  if(vtxContainer->size() > 10000){
139  ATH_MSG_WARNING("Number of candidates is very high N=" << vtxContainer->size() << " this may crash the sharedwriter");
140  }
141  StatusCode SC = helper.FillCandwithRefittedVertices(vtxContainer.get(), pvContainer.cptr(), refPvContainer.get(), &(*m_pvRefitter) , m_PV_max, m_DoVertexType);
142  if(SC.isFailure()){
143  ATH_MSG_FATAL("refitting failed - check the vertices you passed");
144  return SC;
145  }
146  if(refPvContainer->size() > 10000){
147  ATH_MSG_WARNING("Number of refitted vertices is very high N=" << refPvContainer->size() << " this may crash the sharedwriter");
148  }
149  }
150  }else{
151  if(vtxContainer->size() >0)CHECK(helper.FillCandExistingVertices(vtxContainer.get(), pvContainer.cptr(), m_DoVertexType));
152  }
153 
155 
156  std::vector<const xAOD::TrackParticleContainer*> trackCols;
157  for(const auto &str : m_RelinkContainers){
159  trackCols.push_back(handle.cptr());
160  }
161  if(not trackCols.empty()){
162  for(xAOD::Vertex* vtx : *vtxContainer.get()){
163  try{
165  }catch(std::runtime_error const& e){
166  ATH_MSG_ERROR(e.what());
167  return StatusCode::FAILURE;
168  }
169  }
170  }
171  std::vector<const xAOD::MuonContainer*> muCols;
172  for(const auto &str : m_RelinkMuons){
174  muCols.push_back(handle.cptr());
175  }
176  if(not muCols.empty()){
177  for(xAOD::Vertex* vtx : *vtxContainer.get()){
178  try{
180  }catch(std::runtime_error const& e){
181  ATH_MSG_ERROR(e.what());
182  return StatusCode::FAILURE;
183  }
184  }
185  }
186  //----------------------------------------------------
187  // save in the StoreGate
188  //----------------------------------------------------
190  ATH_CHECK(handle.record(std::move(vtxContainer), std::move(vtxAuxContainer)));
191 
192  if(m_refitPV) {
194  ATH_CHECK(handle.record(std::move(refPvContainer), std::move(refPvAuxContainer)));
195  }
196  }
197 
198  if (!callTool) { //Fill with empty containers
200  ATH_CHECK(handle.record(std::unique_ptr<xAOD::VertexContainer>(new xAOD::VertexContainer ),
201  std::unique_ptr<xAOD::VertexAuxContainer>(new xAOD::VertexAuxContainer )));
202  }
203 
204  return StatusCode::SUCCESS;
205  }
206 
207 
208 
209 }
BPhysPVTools.h
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
xAOD::VertexAuxContainer_v1
Temporary container used until we have I/O for AuxStoreInternal.
Definition: VertexAuxContainer_v1.h:32
DerivationFramework::Reco_Vertex::m_eventInfo_key
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo_key
Definition: Reco_Vertex.h:39
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
Analysis::JpsiUpsilonCommon::RelinkVertexMuons
static void RelinkVertexMuons(const std::vector< const xAOD::MuonContainer * > &muoncols, xAOD::Vertex *vtx)
Definition: JpsiUpsilonCommon.cxx:148
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
DerivationFramework::Reco_Vertex::m_checkCollections
bool m_checkCollections
Definition: Reco_Vertex.h:50
DerivationFramework::BPhysPVTools
Definition: BPhysPVTools.h:25
DerivationFramework::Reco_Vertex::m_RelinkContainers
SG::ReadHandleKeyArray< xAOD::TrackParticleContainer > m_RelinkContainers
Definition: Reco_Vertex.h:52
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
DerivationFramework::Reco_Vertex::m_SearchTool
ToolHandle< Analysis::ICandidateSearch > m_SearchTool
Definition: Reco_Vertex.h:37
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
DerivationFramework::Reco_Vertex::m_outputVtxContainerName
SG::WriteHandleKey< xAOD::VertexContainer > m_outputVtxContainerName
job options
Definition: Reco_Vertex.h:42
DerivationFramework::Reco_Vertex::m_v0Tools
ToolHandle< Trk::V0Tools > m_v0Tools
tools
Definition: Reco_Vertex.h:36
DerivationFramework::Reco_Vertex::m_PV_minNTracks
size_t m_PV_minNTracks
Definition: Reco_Vertex.h:48
runBeamSpotCalibration.helper
helper
Definition: runBeamSpotCalibration.py:112
DerivationFramework::Reco_Vertex::m_pvContainerName
SG::ReadHandleKey< xAOD::VertexContainer > m_pvContainerName
Definition: Reco_Vertex.h:43
DerivationFramework::Reco_Vertex::m_CollectionsToCheck
SG::ReadHandleKeyArray< xAOD::VertexContainer > m_CollectionsToCheck
Definition: Reco_Vertex.h:51
DerivationFramework::Reco_Vertex::initialize
virtual StatusCode initialize()
Definition: Reco_Vertex.cxx:52
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
DerivationFramework::Reco_Vertex::m_refitPV
bool m_refitPV
Definition: Reco_Vertex.h:45
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
DerivationFramework::Reco_Vertex::m_DoVertexType
int m_DoVertexType
Definition: Reco_Vertex.h:47
TRT_PAI_gasdata::SC
const float SC[NC]
Cross sections for Carbon.
Definition: TRT_PAI_gasdata.h:255
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
JpsiUpsilonCommon.h
DerivationFramework
THE reconstruction tool.
Definition: ParticleSortingAlg.h:24
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Analysis::JpsiUpsilonCommon::RelinkVertexTracks
static void RelinkVertexTracks(const std::vector< const xAOD::TrackParticleContainer * > &trkcols, xAOD::Vertex *vtx)
Definition: JpsiUpsilonCommon.cxx:126
DerivationFramework::Reco_Vertex::m_do3d
bool m_do3d
Definition: Reco_Vertex.h:49
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
DerivationFramework::Reco_Vertex::addBranches
virtual StatusCode addBranches() const
Pass the thinning service
Definition: Reco_Vertex.cxx:82
VertexContainer.h
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DerivationFramework::Reco_Vertex::m_RelinkMuons
SG::ReadHandleKeyArray< xAOD::MuonContainer > m_RelinkMuons
Definition: Reco_Vertex.h:53
Analysis::JpsiUpsilonCommon
Definition: JpsiUpsilonCommon.h:39
DerivationFramework::Reco_Vertex::m_PV_max
int m_PV_max
Definition: Reco_Vertex.h:46
DerivationFramework::Reco_Vertex::m_pvRefitter
ToolHandle< Analysis::PrimaryVertexRefitter > m_pvRefitter
Definition: Reco_Vertex.h:38
DerivationFramework::Reco_Vertex::m_refPVContainerName
SG::WriteHandleKey< xAOD::VertexContainer > m_refPVContainerName
Definition: Reco_Vertex.h:44
str
Definition: BTagTrackIpAccessor.cxx:11
AthAlgTool
Definition: AthAlgTool.h:26
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
DerivationFramework::Reco_Vertex::Reco_Vertex
Reco_Vertex(const std::string &t, const std::string &n, const IInterface *p)
Definition: Reco_Vertex.cxx:21
Reco_Vertex.h
VertexAuxContainer.h