16#include "AthLinks/ElementLink.h"
18#include "GaudiKernel/AlgTool.h"
19#include "GaudiKernel/Chrono.h"
20#include "GaudiKernel/ToolVisitor.h"
26 inline void renounceInputs([[maybe_unused]]
const std::unordered_set<std::string> &outputs, std::vector< const DataObjID *> &output_ids, AlgTool *a_tool) {
27 for (
const DataObjID *a_data_id : output_ids ) {
28 a_tool->renounceInput( *a_data_id );
31 inline void collectOutputs(std::unordered_set<std::string> &outputs, std::vector< const DataObjID *> &output_ids,
const AlgTool *a_tool) {
32 for (
const DataObjID &a_data_id : a_tool->outputDataObjs() ) {
33 if (
outputs.insert( a_data_id.key() ).second) {
34 output_ids.push_back( &a_data_id );
38 template <
typename Callable,
typename = std::enable_if_t<std::is_invocable_r_v<
void, Callable, IAlgTool*>>>
39 inline void visitTools(IAlgTool &a_tool_interface, Callable &func) {
40 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(&a_tool_interface);
42 func(&a_tool_interface);
43 std::vector<IAlgTool *> &non_const_tools
ATLAS_THREAD_SAFE =
const_cast< std::vector<IAlgTool *> &
>( alg_tool->tools() );
44 ToolVisitor::visit( non_const_tools, func);
53 ATH_MSG_INFO(
"Initializing the derivation framework kernel " << name());
57 ATH_MSG_INFO(
"The following skimming tools will be applied....");
62 ATH_MSG_INFO(
"The following thinning tools will be applied");
67 ATH_MSG_INFO(
"The following augmentation tools will be applied....");
80 ATH_MSG_INFO(
"Skimming will be run before augmentation. Make sure your skimming does not depend on variables calculated in the augmentation step!");
83 std::unordered_set<std::string> outputs;
84 std::vector<const DataObjID *> output_ids;
85 auto output_collector = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
86 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
88 collectOutputs(outputs,output_ids, alg_tool);
91 auto renounce_and_collect_outputs = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
92 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
94 renounceInputs(outputs,output_ids, alg_tool);
95 collectOutputs(outputs,output_ids, alg_tool);
98 auto renouncer = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
99 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
101 renounceInputs(outputs,output_ids, alg_tool);
109 visitTools(*a_tool_handle, output_collector);
112 visitTools(*a_tool_handle, renounce_and_collect_outputs);
117 visitTools(*a_tool_handle, output_collector);
120 visitTools(*a_tool_handle, renounce_and_collect_outputs);
124 visitTools(*a_tool_handle, renouncer);
127 return StatusCode::SUCCESS;
137 Chrono chrono( cSvc , name() );
151 if ( augmentationTool->addBranches(ctx).isFailure() ) {
153 return StatusCode::FAILURE;
163 bool acceptEvent(
true);
170 if (!(skimmingTool->eventPassesFilter(ctx))) {
172 ATH_MSG_DEBUG(
"This event failed the " << skimmingTool->name() <<
" filter. Therefore it will not be recorded.");
181 filter.setPassed (acceptEvent);
184 if (!acceptEvent)
return StatusCode::SUCCESS;
190 if ( augmentationTool->addBranches(ctx).isFailure() ) {
192 return StatusCode::FAILURE;
203 if ( thinningTool->doThinning(ctx).isFailure() ) {
205 return StatusCode::FAILURE;
209 return StatusCode::SUCCESS;
217 ATH_MSG_INFO(
"============================================================================");
218 ATH_MSG_INFO(
"|| SUMMARY OF THE DERIVATION FRAMEWORK KERNEL WITH NAME " << name() <<
" || ");
219 ATH_MSG_INFO(
"============================================================================");
220 ATH_MSG_INFO(
"============================================================================");
223 ATH_MSG_INFO(
"============================================================================");
225 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_INFO(x,...)
#define ATLAS_THREAD_SAFE
virtual StatusCode execute(const EventContext &ctx) override
Execute method.
Gaudi::Property< bool > m_runSkimmingFirst
Gaudi::Property< bool > m_doChronoStat
virtual StatusCode finalize() override
FilterReporterParams m_filterParams
virtual StatusCode initialize() override
PublicToolHandleArray< IThinningTool > m_thinningTools
PublicToolHandleArray< ISkimmingTool > m_skimmingTools
ServiceHandle< IChronoStatSvc > m_chronoSvc
PublicToolHandleArray< IAugmentationTool > m_augmentationTools
a guard class for use with ref FilterReporterParams