ATLAS Offline Software
ObjFillerTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
13 #include "ObjFillerTool.h"
15 #include "GaudiKernel/System.h"
17 #include "GaudiKernel/Incident.h"
18 #include "GaudiKernel/IIncidentSvc.h"
19 
20 
21 namespace D3PD {
22 
23 
30 ObjFillerTool::ObjFillerTool (const std::string& type,
31  const std::string& name,
32  const IInterface* parent)
33  : base_class (type, name, parent),
34  AddVariable (m_prefix, m_blockName),
35  m_getter (this),
36  m_blockFillers (this),
37  m_tree (0)
38 {
39  declareProperty ("Getter", m_getter,
40  "The IObjGetterTool instance.");
41  declareProperty ("BlockFillers", m_blockFillers,
42  "List of contained block filler tools.");
43  declareProperty ("Prefix", m_prefix = "",
44  "Variable name prefix for the contained blocks.");
45  declareProperty ("BlockName", m_blockName = this->name(),
46  "The name of this block.");
47  declareProperty ("ObjectName", m_objectName = "",
48  "Name of the D3PDObject that created this filler.");
49  declareProperty ("AllowMissing", m_allowMissing = false,
50  "If true, then it is not considered an error for the "
51  "requested input object to be missing.");
52  declareProperty ("SaveMetadata", m_saveMetadata = false,
53  "Set to true to get metadata into the output D3PD "
54  "about the variables created by this tool");
55 }
56 
57 
63 {
65  CHECK( m_getter.retrieve() );
66  CHECK( m_blockFillers.retrieve() );
67 
68  // Listen to EndEvent and EndRun incidents:
69  ServiceHandle< IIncidentSvc > p_incSvc( "IncidentSvc", name() );
70  CHECK( p_incSvc.retrieve() );
71  p_incSvc->addListener( this, "EndEvtLoop" );
72 
73  return StatusCode::SUCCESS;
74 }
75 
76 
85 {
86  // The type that the getter will provide.
87  const std::type_info& ti = m_getter->typeinfo();
88 
90  for (size_t i = 0; i < m_blockFillers.size(); i++)
91  CHECK( m_blockFillers[i]->configureD3PD (this, ti) );
92 
93  // Try to cast the received object into an ID3PD one:
94  m_tree = dynamic_cast< ID3PD* >( tree );
95 
96  return StatusCode::SUCCESS;
97 }
98 
99 
106 {
107  // Be sure aux variables are defined.
108  (void)m_getter->getUntyped (m_allowMissing);
109 
110  // Configure the metadata object correctly:
114 
115  for (size_t i = 0; i < m_blockFillers.size(); i++)
116  CHECK( m_blockFillers[i]->book() );
117 
118  return StatusCode::SUCCESS;
119 }
120 
121 
132 {
133  const void* obj = m_getter->getUntyped (m_allowMissing);
134  if (!obj) {
135  if (m_allowMissing)
136  return StatusCode::SUCCESS;
137  REPORT_MESSAGE(MSG::ERROR) << "Can't get input object.";
138  return StatusCode::FAILURE;
139  }
140 
141  for (size_t i = 0; i < m_blockFillers.size(); i++)
142  CHECK( m_blockFillers[i]->fillUntyped (obj) );
143 
144  m_getter->releaseObjectUntyped (obj);
145 
146  return StatusCode::SUCCESS;
147 }
148 
149 
157 {
158  return false;
159 }
160 
161 
170 void ObjFillerTool::handle( const Incident& inc )
171 {
172  if( inc.type() == "EndEvtLoop" ) {
173  if( m_tree && m_metadata.variables().size() && m_saveMetadata ) {
174  const std::string metadata = m_metadata.toString();
175  // safe because this incident handler is only called serially
176  const std::string metadataName ATLAS_THREAD_SAFE = m_metadata.metadataName();
177  if( m_tree->addMetadata( metadataName,
178  &metadata ).isFailure() ) {
179  REPORT_MESSAGE( MSG::ERROR )
180  << "Couldn't add object metadata information to the output!";
181  return;
182  }
183  }
184  }
185 
186  return;
187 }
188 
189 
190 } // namespace D3PD
191 
D3PD::ObjFillerTool::fill
virtual StatusCode fill()
Fill one object.
Definition: ObjFillerTool.cxx:131
D3PD::IAddVariable
Common interface for adding a variable to a tuple.
Definition: IAddVariable.h:70
D3PD::ObjectMetadata::variables
const std::set< Variable > & variables() const
Function for accessing all the variables of the D3PDObject.
Definition: ObjectMetadata.cxx:577
D3PD::ID3PD::addMetadata
virtual StatusCode addMetadata(const std::string &key, const void *obj, const std::type_info &ti)=0
Add a new piece of metadata to the tuple.
D3PD::ID3PD
Define an abstract interface for building a D3PD tree.
Definition: ID3PD.h:37
D3PD::AddVariable
Common implementation of IAddVariable.
Definition: AddVariable.h:38
D3PD::AddVariable::configureD3PD
StatusCode configureD3PD(IAddVariable *tree)
Configure the parent tree.
Definition: AddVariable.cxx:61
initialize
void initialize()
Definition: run_EoverP.cxx:894
tree
TChain * tree
Definition: tile_monitor.h:30
D3PD::ObjectMetadata::setName
void setName(const std::string &name)
Set the name of the D3PDObject that this object describes.
Definition: ObjectMetadata.cxx:175
D3PD::ObjectMetadata::setPrefix
void setPrefix(const std::string &prefix)
Set the prefix given to variables in this D3PDObject.
Definition: ObjectMetadata.cxx:224
D3PD::ObjFillerTool::m_objectName
std::string m_objectName
Property: the name of the D3PDObject that created this tool.
Definition: ObjFillerTool.h:126
python.checkMetadata.metadata
metadata
Definition: checkMetadata.py:175
ObjFillerTool.h
Object filler tool for a single object.
D3PD::AddVariable::m_metadata
ObjectMetadata m_metadata
Metadata about the variables created by this object.
Definition: AddVariable.h:129
D3PD
Block filler tool for noisy FEB information.
Definition: InnerDetector/InDetMonitoring/InDetGlobalMonitoring/macros/EnhancedPrimaryVertexMonitoring/TrigD3PD/ChainGroup.h:21
lumiFormat.i
int i
Definition: lumiFormat.py:92
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
test_pyathena.parent
parent
Definition: test_pyathena.py:15
CHECK
#define CHECK(...)
Evaluate an expression and check for errors.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:422
D3PD::ObjFillerTool::m_allowMissing
bool m_allowMissing
Property: If true, the input object is allowed to be missing.
Definition: ObjFillerTool.h:129
D3PD::ObjectMetadata::toString
std::string toString() const
Function "serializing" the stored information into a string.
Definition: ObjectMetadata.cxx:249
D3PD::ObjFillerTool::m_prefix
std::string m_prefix
Property: Variable prefix for this block.
Definition: ObjFillerTool.h:120
D3PD::ObjFillerTool::configureD3PD
virtual StatusCode configureD3PD(IAddVariable *tree)
Configure the tool.
Definition: ObjFillerTool.cxx:84
D3PD::ObjFillerTool::ObjFillerTool
ObjFillerTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Gaudi tool constructor.
Definition: ObjFillerTool.cxx:30
D3PD::ObjectMetadata::setContainer
void setContainer(bool container)
Set whether the D3PDObject describes a container or not.
Definition: ObjectMetadata.cxx:235
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
D3PD::ObjFillerTool::m_getter
ToolHandle< IObjGetterTool > m_getter
Property: The object getter tool.
Definition: ObjFillerTool.h:114
D3PD::ObjFillerTool::m_tree
ID3PD * m_tree
Pointer to the ID3PD object used.
Definition: ObjFillerTool.h:135
REPORT_MESSAGE
#define REPORT_MESSAGE(LVL)
Report a message.
Definition: Control/AthenaKernel/AthenaKernel/errorcheck.h:365
ID3PD.h
Abstract interface for a D3PD tree.
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
D3PD::ObjFillerTool::m_saveMetadata
bool m_saveMetadata
Property: If true, the metadata about the variables is saved.
Definition: ObjFillerTool.h:132
D3PD::ObjFillerTool::isContainerFiller
virtual bool isContainerFiller() const
Find out if the filler handles containers or single objects.
Definition: ObjFillerTool.cxx:156
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
D3PD::ObjFillerTool::m_blockName
std::string m_blockName
Property: the name of this block.
Definition: ObjFillerTool.h:123
D3PD::ObjFillerTool::handle
virtual void handle(const Incident &inc)
Handle end of run incidents to save the metadata at that point.
Definition: ObjFillerTool.cxx:170
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
checker_macros.h
Define macros for attributes used to control the static checker.
python.PyAthena.obj
obj
Definition: PyAthena.py:135
D3PD::ObjFillerTool::m_blockFillers
ToolHandleArray< IBlockFillerTool > m_blockFillers
Property: The list of block filler tools.
Definition: ObjFillerTool.h:117
D3PD::ObjFillerTool::book
virtual StatusCode book()
Declare tuple variables.
Definition: ObjFillerTool.cxx:105
D3PD::ObjFillerTool::initialize
virtual StatusCode initialize()
Standard Gaudi initialize method.
Definition: ObjFillerTool.cxx:62
ServiceHandle< IIncidentSvc >