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);
61 m_chronoSvc(
"ChronoStatSvc",
name),
62 m_runSkimmingFirst(false)
87 if (StatusCode::SUCCESS !=
sc) {
89 return StatusCode::FAILURE;
93 if( m_skimmingTools.retrieve().isFailure() ) {
95 return StatusCode::FAILURE;
97 ATH_MSG_INFO(
"The following skimming tools will be applied....");
101 if( m_thinningTools.retrieve().isFailure() ) {
103 return StatusCode::FAILURE;
105 ATH_MSG_INFO(
"The following thinning tools will be applied");
109 if( m_augmentationTools.retrieve().isFailure() ) {
111 return StatusCode::FAILURE;
113 ATH_MSG_INFO(
"The following augmentation tools will be applied....");
117 if (m_doChronoStat) {
122 if (m_runSkimmingFirst) {
123 ATH_MSG_INFO(
"Skimming will be run before augmentation. Make sure your skimming does not depend on variables calculated in the augmentation step!");
126 std::unordered_set<std::string>
outputs;
127 std::vector<const DataObjID *> output_ids;
128 auto output_collector = [&
outputs, &output_ids](IAlgTool *a_tool_interface) {
129 const AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
131 collectOutputs(
outputs,output_ids, alg_tool);
134 auto renounce_and_collect_outputs = [&
outputs, &output_ids](IAlgTool *a_tool_interface) {
135 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
137 renounceInputs(
outputs,output_ids, alg_tool);
138 collectOutputs(
outputs,output_ids, alg_tool);
141 auto renouncer = [&
outputs, &output_ids](IAlgTool *a_tool_interface) {
142 AlgTool *alg_tool =
dynamic_cast<AlgTool *
>(a_tool_interface);
144 renounceInputs(
outputs,output_ids, alg_tool);
150 if (m_runSkimmingFirst) {
151 for (ToolHandle<ISkimmingTool> &a_tool_handle : m_skimmingTools ) {
152 visitTools(*a_tool_handle, output_collector);
154 for (ToolHandle<IAugmentationTool> &a_tool_handle : m_augmentationTools ) {
155 visitTools(*a_tool_handle, renounce_and_collect_outputs);
159 for (ToolHandle<IAugmentationTool> &a_tool_handle : m_augmentationTools ) {
160 visitTools(*a_tool_handle, output_collector);
162 for (ToolHandle<ISkimmingTool> &a_tool_handle : m_skimmingTools ) {
163 visitTools(*a_tool_handle, renounce_and_collect_outputs);
166 for (ToolHandle<IThinningTool> &a_tool_handle : m_thinningTools ) {
167 visitTools(*a_tool_handle, renouncer);
171 return StatusCode::SUCCESS;
178 IChronoSvc* cSvc=m_chronoSvc.get();
180 Chrono chrono( cSvc ,
name() );
192 if (!m_runSkimmingFirst) {
195 while (augmentationTool != endOfAugmentationTools) {
197 if ( (**augmentationTool).addBranches().isFailure() ) {
199 return StatusCode::FAILURE;
210 bool acceptEvent(
true);
217 if (!((**skimmingTool).eventPassesFilter())) {
219 ATH_MSG_DEBUG(
"This event failed the " << (**skimmingTool).name() <<
" filter. Therefore it will not be recorded.");
226 if (acceptEvent) ++m_acceptCntr;
229 setFilterPassed(acceptEvent);
232 if (!acceptEvent)
return StatusCode::SUCCESS;
235 if (m_runSkimmingFirst) {
238 while (augmentationTool != endOfAugmentationTools) {
240 if ( (**augmentationTool).addBranches().isFailure() ) {
242 return StatusCode::FAILURE;
255 while (thinningTool != endOfThinningTools) {
257 if ( (**thinningTool).doThinning().isFailure() ) {
259 return StatusCode::FAILURE;
265 return StatusCode::SUCCESS;
273 ATH_MSG_INFO(
"============================================================================");
274 ATH_MSG_INFO(
"|| SUMMARY OF THE DERIVATION FRAMEWORK KERNEL WITH NAME " <<
name() <<
" || ");
275 ATH_MSG_INFO(
"============================================================================");
276 ATH_MSG_INFO(
"============================================================================");
279 ATH_MSG_INFO(
"============================================================================");
281 return StatusCode::SUCCESS;