The Gaudi Framework  v36r16 (ea80daf8)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
SplittingTransformer.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 
12 #pragma once
13 
14 #include <functional>
15 #include <optional>
16 #include <string>
17 #include <vector>
18 
22 
23 namespace Gaudi::Functional {
24 
25  template <typename Container>
27  template <typename Container>
29 
30  namespace details {
31 
32  template <typename Signature, typename Traits_, bool isLegacy>
34 
36  template <typename Out, typename... In, typename Traits_>
37  class SplittingTransformer<vector_of_<Out>( const In&... ), Traits_, true>
40 
41  public:
42  constexpr static std::size_t N = base_class::N_in;
43  using KeyValue = typename base_class::KeyValue;
44  using KeyValues = typename base_class::KeyValues;
45 
47  const KeyValues& outputs )
48  : base_class( std::move( name ), locator, inputs )
49  , m_outputLocations(
50  this, outputs.first, details::to_DataObjID( outputs.second ),
51  [=]( Gaudi::Details::PropertyBase& ) {
52  this->m_outputs =
53  details::make_vector_of_handles<decltype( this->m_outputs )>( this, m_outputLocations );
54  if constexpr ( details::is_optional_v<Out> ) { // handle constructor does not (yet) allow to
55  // set optional flag... so
56  // do it explicitly here...
57  std::for_each( this->m_outputs.begin(), this->m_outputs.end(),
58  []( auto& h ) { h.setOptional( true ); } );
59  }
60  },
62 
64  : SplittingTransformer( std::move( name ), locator, std::forward_as_tuple( input ), output ) {
65  static_assert( N == 1, "single input argument requires single input signature" );
66  }
67 
68  // accessor to output Locations
69  const std::string& outputLocation( unsigned int n ) const { return m_outputLocations.value()[n].key(); }
70  unsigned int outputLocationSize() const { return m_outputLocations.value().size(); }
71 
72  // derived classes can NOT implement execute
73  StatusCode execute() override final {
74  try {
75  // TODO:FIXME: how does operator() know the number and order of expected outputs?
76  auto out = details::filter_evtcontext_t<In...>::apply( *this, this->m_inputs );
77  if ( out.size() != m_outputs.size() ) {
78  throw GaudiException( "Error during transform: expected " + std::to_string( m_outputs.size() ) +
79  " containers, got " + std::to_string( out.size() ) + " instead",
80  this->name(), StatusCode::FAILURE );
81  }
82  for ( unsigned i = 0; i != out.size(); ++i ) details::put( m_outputs[i], std::move( out[i] ) );
84  } catch ( GaudiException& e ) {
85  ( e.code() ? this->warning() : this->error() ) << e.tag() << " : " << e.message() << endmsg;
86  return e.code();
87  }
88  }
89 
90  // TODO/FIXME: how does the callee know in which order to produce the outputs?
91  // (note: 'missing' items can be specified by making Out an std::optional<Out>,
92  // and only those entries which contain an Out are stored)
93  virtual vector_of_<Out> operator()( const In&... ) const = 0;
94 
95  private:
96  template <typename T>
99  Gaudi::Property<std::vector<DataObjID>> m_outputLocations; // TODO/FIXME for now: use a call-back to update the
100  // actual handles!
101  };
102 
103  template <typename Out, typename... In, typename Traits_>
104  class SplittingTransformer<vector_of_<Out>( const In&... ), Traits_, false>
107 
108  public:
109  constexpr static std::size_t N = base_class::N_in;
110  using KeyValue = typename base_class::KeyValue;
111  using KeyValues = typename base_class::KeyValues;
112 
114  const KeyValues& outputs )
115  : base_class( std::move( name ), locator, inputs )
116  , m_outputLocations(
117  this, outputs.first, details::to_DataObjID( outputs.second ),
118  [=]( Gaudi::Details::PropertyBase& ) {
119  this->m_outputs =
120  details::make_vector_of_handles<decltype( this->m_outputs )>( this, m_outputLocations );
121  if constexpr ( details::is_optional_v<Out> ) { // handle constructor does not (yet) allow to
122  // set optional flag... so
123  // do it explicitly here...
124  std::for_each( this->m_outputs.begin(), this->m_outputs.end(),
125  []( auto& h ) { h.setOptional( true ); } );
126  }
127  },
129 
131  : SplittingTransformer( std::move( name ), locator, std::forward_as_tuple( input ), output ) {
132  static_assert( N == 1, "single input argument requires single input signature" );
133  }
134 
135  // accessor to output Locations
136  const std::string& outputLocation( unsigned int n ) const { return m_outputLocations.value()[n].key(); }
137  unsigned int outputLocationSize() const { return m_outputLocations.value().size(); }
138 
139  // derived classes can NOT implement execute
140  StatusCode execute( const EventContext& ctx ) const override final {
141  try {
142  // TODO:FIXME: how does operator() know the number and order of expected outputs?
143  auto out = details::filter_evtcontext_t<In...>::apply( *this, ctx, this->m_inputs );
144  if ( out.size() != m_outputs.size() ) {
145  throw GaudiException( "Error during transform: expected " + std::to_string( m_outputs.size() ) +
146  " containers, got " + std::to_string( out.size() ) + " instead",
147  this->name(), StatusCode::FAILURE );
148  }
149  for ( unsigned i = 0; i != out.size(); ++i ) details::put( m_outputs[i], std::move( out[i] ) );
150  return FilterDecision::PASSED;
151  } catch ( GaudiException& e ) {
152  ( e.code() ? this->warning() : this->error() ) << e.tag() << " : " << e.message() << endmsg;
153  return e.code();
154  }
155  }
156 
157  // TODO/FIXME: how does the callee know in which order to produce the outputs?
158  // (note: 'missing' items can be specified by making Out an std::optional<Out>,
159  // and only those entries which contain an Out are stored)
160  virtual vector_of_<Out> operator()( const In&... ) const = 0;
161 
162  private:
163  template <typename T>
166  Gaudi::Property<std::vector<DataObjID>> m_outputLocations; // TODO/FIXME for now: use a call-back to update the
167  // actual handles!
168  };
169 
170  } // namespace details
171 
172  template <typename Signature, typename Traits_ = Traits::useDefaults>
174 
175 } // namespace Gaudi::Functional
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::KeyValues
typename base_class::KeyValues KeyValues
Definition: SplittingTransformer.h:111
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::m_outputs
std::vector< OutputHandle< Out > > m_outputs
Definition: SplittingTransformer.h:98
std::for_each
T for_each(T... args)
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::KeyValue
typename base_class::KeyValue KeyValue
Definition: SplittingTransformer.h:110
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::OutputHandle
details::OutputHandle_t< Traits_, details::remove_optional_t< T > > OutputHandle
Definition: SplittingTransformer.h:97
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::SplittingTransformer
SplittingTransformer(std::string name, ISvcLocator *locator, const RepeatValues_< KeyValue, N > &inputs, const KeyValues &outputs)
Definition: SplittingTransformer.h:113
std::string
STL class.
IOTest.N
N
Definition: IOTest.py:110
std::move
T move(T... args)
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::KeyValues
typename base_class::KeyValues KeyValues
Definition: SplittingTransformer.h:44
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::outputLocation
const std::string & outputLocation(unsigned int n) const
Definition: SplittingTransformer.h:69
std::vector
STL class.
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::SplittingTransformer
SplittingTransformer(std::string name, ISvcLocator *locator, const RepeatValues_< KeyValue, N > &inputs, const KeyValues &outputs)
Definition: SplittingTransformer.h:46
Gaudi::Functional::details::SplittingTransformer
Definition: SplittingTransformer.h:33
std::tuple
Gaudi::Units::second
constexpr double second
Definition: SystemOfUnits.h:139
gaudirun.output
output
Definition: gaudirun.py:523
Gaudi::Functional::details::to_DataObjID
std::vector< DataObjID > to_DataObjID(const std::vector< std::string > &in)
Definition: FunctionalDetails.h:119
Gaudi::Functional::vector_of_
details::template vector_of_const_< Container > vector_of_
Definition: ListTransformer.h:19
GaudiException::message
virtual const std::string & message() const
error message to be printed
Definition: GaudiException.h:68
Gaudi::Functional::details::make_vector_of_handles
Handles make_vector_of_handles(IDataHandleHolder *owner, const std::vector< DataObjID > &init)
Definition: FunctionalDetails.h:433
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::m_outputs
std::vector< OutputHandle< Out > > m_outputs
Definition: SplittingTransformer.h:165
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::operator()
virtual vector_of_< Out > operator()(const In &...) const =0
TimingHistograms.name
name
Definition: TimingHistograms.py:25
GaudiPython.Pythonizations.ctx
ctx
Definition: Pythonizations.py:588
StatusCode
Definition: StatusCode.h:65
Gaudi::tagged_bool_ns::tagged_bool
Definition: TaggedBool.h:16
details
Definition: AnyDataWrapper.h:18
AlgSequencer.h
h
Definition: AlgSequencer.py:32
std::to_string
T to_string(T... args)
Gaudi::Functional::details::filter_evtcontext_t::apply
static auto apply(const Algorithm &algo, Handles &handles)
Definition: FunctionalDetails.h:470
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::SplittingTransformer
SplittingTransformer(std::string name, ISvcLocator *locator, const KeyValue &input, const KeyValues &output)
Definition: SplittingTransformer.h:130
Gaudi::Functional::FilterDecision::PASSED
@ PASSED
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::outputLocationSize
unsigned int outputLocationSize() const
Definition: SplittingTransformer.h:137
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::m_outputLocations
Gaudi::Property< std::vector< DataObjID > > m_outputLocations
Definition: SplittingTransformer.h:99
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::operator()
virtual vector_of_< Out > operator()(const In &...) const =0
Gaudi::Functional
Definition: Consumer.h:19
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:203
GaudiException::tag
virtual const std::string & tag() const
name tag for the exception, or exception type
Definition: GaudiException.h:77
Gaudi
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::execute
StatusCode execute() override final
Definition: SplittingTransformer.h:73
GaudiPluginService.cpluginsvc.n
n
Definition: cpluginsvc.py:235
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::outputLocation
const std::string & outputLocation(unsigned int n) const
Definition: SplittingTransformer.h:136
FunctionalUtilities.h
GaudiException::code
virtual const StatusCode & code() const
StatusCode for Exception.
Definition: GaudiException.h:86
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::execute
StatusCode execute(const EventContext &ctx) const override final
Definition: SplittingTransformer.h:140
std
STL namespace.
EventContext
Definition: EventContext.h:34
Gaudi::Functional::details::RepeatValues_
decltype(get_values_helper< Value >(std::make_index_sequence< N >())) RepeatValues_
Definition: FunctionalDetails.h:167
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::OutputHandle
details::OutputHandle_t< Traits_, details::remove_optional_t< T > > OutputHandle
Definition: SplittingTransformer.h:164
Gaudi::Functional::details::DataHandleMixin
Definition: FunctionalDetails.h:504
std::size_t
FunctionalDetails.h
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::outputLocationSize
unsigned int outputLocationSize() const
Definition: SplittingTransformer.h:70
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
Gaudi::Functional::vector_of_optional_
std::vector< std::optional< Container > > vector_of_optional_
Definition: SplittingMergingTransformer.h:26
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, false >::m_outputLocations
Gaudi::Property< std::vector< DataObjID > > m_outputLocations
Definition: SplittingTransformer.h:166
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::KeyValue
typename base_class::KeyValue KeyValue
Definition: SplittingTransformer.h:43
FunctionalFilterDecision.h
Gaudi::Functional::details::OutputHandle_t
Gaudi::cpp17::detected_or_t< DataObjectWriteHandle< T >, detail2::OutputHandle_t, Tr, T > OutputHandle_t
Definition: FunctionalDetails.h:421
Gaudi::Functional::details::filter_evtcontext
typename filter_evtcontext_t< In... >::type filter_evtcontext
Definition: FunctionalDetails.h:501
Gaudi::Property
Implementation of property with value of concrete type.
Definition: Property.h:39
Gaudi::Functional::details::put
auto put(const DataObjectHandle< Out1 > &out_handle, Out2 &&out)
Definition: FunctionalDetails.h:173
Gaudi::Functional::details::SplittingTransformer< vector_of_< Out >(const In &...), Traits_, true >::SplittingTransformer
SplittingTransformer(std::string name, ISvcLocator *locator, const KeyValue &input, const KeyValues &output)
Definition: SplittingTransformer.h:63
PrepareBase.out
out
Definition: PrepareBase.py:20