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"
36 inline void renounceInputs([[maybe_unused]]
const std::unordered_set<std::string> &outputs, std::vector< const DataObjID *> &output_ids, AlgTool *a_tool) {
37 for (
const DataObjID *a_data_id : output_ids ) {
38 a_tool->renounceInput( *a_data_id );
41 inline void collectOutputs(std::unordered_set<std::string> &outputs, std::vector< const DataObjID *> &output_ids,
const AlgTool *a_tool) {
42 for (
const DataObjID &a_data_id : a_tool->outputDataObjs() ) {
43 if (
outputs.insert( a_data_id.key() ).second) {
44 output_ids.push_back( &a_data_id );
48 template <
typename Callable,
typename = std::enable_if_t<std::is_invocable_r_v<
void, Callable, IAlgTool*>>>
49 inline void visitTools(IAlgTool &a_tool_interface, Callable &func) {
50 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(&a_tool_interface);
52 func(&a_tool_interface);
53 std::vector<IAlgTool *> &non_const_tools
ATLAS_THREAD_SAFE =
const_cast< std::vector<IAlgTool *> &
>( alg_tool->tools() );
54 ToolVisitor::visit( non_const_tools, func);
68 ATH_MSG_INFO(
"Initializing the derivation framework kernel " << name());
72 ATH_MSG_INFO(
"The following skimming tools will be applied....");
77 ATH_MSG_INFO(
"The following thinning tools will be applied");
82 ATH_MSG_INFO(
"The following augmentation tools will be applied....");
91 ATH_MSG_INFO(
"Skimming will be run before augmentation. Make sure your skimming does not depend on variables calculated in the augmentation step!");
94 std::unordered_set<std::string> outputs;
95 std::vector<const DataObjID *> output_ids;
96 auto output_collector = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
97 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
99 collectOutputs(outputs,output_ids, alg_tool);
102 auto renounce_and_collect_outputs = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
103 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
105 renounceInputs(outputs,output_ids, alg_tool);
106 collectOutputs(outputs,output_ids, alg_tool);
109 auto renouncer = [&outputs, &output_ids](IAlgTool *a_tool_interface) {
110 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
112 renounceInputs(outputs,output_ids, alg_tool);
120 visitTools(*a_tool_handle, output_collector);
123 visitTools(*a_tool_handle, renounce_and_collect_outputs);
128 visitTools(*a_tool_handle, output_collector);
131 visitTools(*a_tool_handle, renounce_and_collect_outputs);
135 visitTools(*a_tool_handle, renouncer);
138 return StatusCode::SUCCESS;
148 Chrono chrono( cSvc , name() );
159 const EventContext &ctx = Gaudi::Hive::currentContext();
163 if ( augmentationTool->addBranches(ctx).isFailure() ) {
165 return StatusCode::FAILURE;
175 bool acceptEvent(
true);
180 if (!(skimmingTool->eventPassesFilter())) {
182 ATH_MSG_DEBUG(
"This event failed the " << skimmingTool->name() <<
" filter. Therefore it will not be recorded.");
194 if (!acceptEvent)
return StatusCode::SUCCESS;
200 if ( augmentationTool->addBranches(ctx).isFailure() ) {
202 return StatusCode::FAILURE;
213 if ( thinningTool->doThinning().isFailure() ) {
215 return StatusCode::FAILURE;
219 return StatusCode::SUCCESS;
227 ATH_MSG_INFO(
"============================================================================");
228 ATH_MSG_INFO(
"|| SUMMARY OF THE DERIVATION FRAMEWORK KERNEL WITH NAME " << name() <<
" || ");
229 ATH_MSG_INFO(
"============================================================================");
230 ATH_MSG_INFO(
"============================================================================");
233 ATH_MSG_INFO(
"============================================================================");
235 return StatusCode::SUCCESS;
#define ATH_CHECK
Evaluate an expression and check for errors.
defines an "iterator" over instances of a given type in StoreGateSvc
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