21#include "GaudiKernel/ISvcLocator.h"
23#include "AthLinks/ElementLink.h"
24#include "GaudiKernel/AlgTool.h"
25#include "GaudiKernel/Chrono.h"
26#include "GaudiKernel/ToolVisitor.h"
27#include "GaudiKernel/ConcurrencyFlags.h"
35 inline void renounceInputs([[maybe_unused]]
const std::unordered_set<std::string> &outputs, std::vector< const DataObjID *> &output_ids, AlgTool *a_tool) {
36 for (
const DataObjID *a_data_id : output_ids ) {
37 a_tool->renounceInput( *a_data_id );
40 inline void collectOutputs(std::unordered_set<std::string> &outputs, std::vector< const DataObjID *> &output_ids,
const AlgTool *a_tool) {
41 for (
const DataObjID &a_data_id : a_tool->outputDataObjs() ) {
42 if (
outputs.insert( a_data_id.key() ).second) {
43 output_ids.push_back( &a_data_id );
47 template <
typename Callable,
typename = std::enable_if_t<std::is_invocable_r_v<
void, Callable, IAlgTool*>>>
48 inline void visitTools(IAlgTool &a_tool_interface, Callable &func) {
49 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(&a_tool_interface);
51 func(&a_tool_interface);
52 std::vector<IAlgTool *> &non_const_tools
ATLAS_THREAD_SAFE =
const_cast< std::vector<IAlgTool *> &
>( alg_tool->tools() );
53 ToolVisitor::visit( non_const_tools, func);
67 ATH_MSG_INFO(
"Initializing the derivation framework kernel " << name());
71 ATH_MSG_INFO(
"The following skimming tools will be applied....");
76 ATH_MSG_INFO(
"The following thinning tools will be applied");
81 ATH_MSG_INFO(
"The following augmentation tools will be applied....");
90 ATH_MSG_INFO(
"Skimming will be run before augmentation. Make sure your skimming does not depend on variables calculated in the augmentation step!");
93 std::unordered_set<std::string> outputs;
94 std::vector<const DataObjID *> output_ids;
95 auto output_collector = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
96 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
98 collectOutputs(outputs,output_ids, alg_tool);
101 auto renounce_and_collect_outputs = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
102 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
104 renounceInputs(outputs,output_ids, alg_tool);
105 collectOutputs(outputs,output_ids, alg_tool);
108 auto renouncer = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
109 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
111 renounceInputs(outputs,output_ids, alg_tool);
119 visitTools(*a_tool_handle, output_collector);
122 visitTools(*a_tool_handle, renounce_and_collect_outputs);
127 visitTools(*a_tool_handle, output_collector);
130 visitTools(*a_tool_handle, renounce_and_collect_outputs);
134 visitTools(*a_tool_handle, renouncer);
137 return StatusCode::SUCCESS;
147 Chrono chrono( cSvc , name() );
158 const EventContext &ctx = Gaudi::Hive::currentContext();
162 if ( augmentationTool->addBranches(ctx).isFailure() ) {
164 return StatusCode::FAILURE;
174 bool acceptEvent(
true);
179 if (!(skimmingTool->eventPassesFilter(ctx))) {
181 ATH_MSG_DEBUG(
"This event failed the " << skimmingTool->name() <<
" filter. Therefore it will not be recorded.");
193 if (!acceptEvent)
return StatusCode::SUCCESS;
199 if ( augmentationTool->addBranches(ctx).isFailure() ) {
201 return StatusCode::FAILURE;
212 if ( thinningTool->doThinning(ctx).isFailure() ) {
214 return StatusCode::FAILURE;
218 return StatusCode::SUCCESS;
226 ATH_MSG_INFO(
"============================================================================");
227 ATH_MSG_INFO(
"|| SUMMARY OF THE DERIVATION FRAMEWORK KERNEL WITH NAME " << name() <<
" || ");
228 ATH_MSG_INFO(
"============================================================================");
229 ATH_MSG_INFO(
"============================================================================");
232 ATH_MSG_INFO(
"============================================================================");
234 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
An STL vector of pointers that by default owns its pointed-to elements.
#define ATLAS_THREAD_SAFE
virtual void setFilterPassed(bool state) const
Set the filter passed flag to the specified state.
AthFilterAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor with parameters:
Gaudi::Property< bool > m_runSkimmingFirst
Gaudi::Property< bool > m_doChronoStat
virtual StatusCode finalize() override
virtual StatusCode initialize() override
PublicToolHandleArray< IThinningTool > m_thinningTools
DerivationKernel(const std::string &name, ISvcLocator *pSvcLocator)
virtual StatusCode execute() override
PublicToolHandleArray< ISkimmingTool > m_skimmingTools
ServiceHandle< IChronoStatSvc > m_chronoSvc
PublicToolHandleArray< IAugmentationTool > m_augmentationTools