36 using extends::extends;
44 : ToolBinder{
std::move( type ),
std::move( name ), parent, KeyValue{
"MyInt",
"/Event/MyInt" },
54 parent->always() <<
"BoundInstance - got: " <<
i <<
" from " <<
parent->inputLocation<
int>() <<
endmsg;
64 : Consumer( name, svcLoc, KeyValue{
"MyTool",
"MyExampleTool" } ) {}
77 always() <<
"CountingConsumer: incrementing \"This is not an error\" twice" <<
endmsg;
81 always() <<
"CountingConsumer: incrementing \"This is not a warning\" twice" <<
endmsg;
85 always() <<
"CountingConsumer: incrementing \"This is not info\" twice" <<
endmsg;
96 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/MyInt" ) ) {}
99 info() <<
"executing IntDataProducer, storing " <<
m_value.value() <<
" into " << outputLocation() <<
endmsg;
113 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/MyVector" ) ) {}
116 info() <<
"executing VectorDataProducer, storing " <<
m_data.value() <<
" into " << outputLocation() <<
endmsg;
127 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/MyKeyed" ) ) {}
135 info() <<
"executing KeyedDataProducer, storing [4,5] into " << outputLocation() <<
endmsg;
145 : Consumer( name, svcLoc, KeyValue(
"InputLocation",
"/Event/MyInt" ) ) {}
148 info() <<
"executing IntDataConsumer, consuming " << input <<
" from " << inputLocation() <<
endmsg;
157 : Transformer( name, svcLoc, KeyValue(
"InputLocation",
"/Event/MyInt" ),
158 KeyValue(
"OutputLocation",
"/Event/MyFloat" ) ) {}
161 info() <<
"Converting: " << input <<
" from " << inputLocation() <<
" and storing it into " << outputLocation()
172 : Transformer( name, svcLoc,
173 { KeyValue(
"InputLocation",
"/Event/MyInt" ), KeyValue{
"OtherInput",
"/Event/MyOtherFloat" } },
174 KeyValue(
"OutputLocation",
"/Event/OtherFloat" ) ) {}
176 float operator()(
const int& in1,
const float& in2 )
const override {
177 info() <<
"Converting: " << in1 <<
" from " << inputLocation<int>() <<
" and " << in2 <<
" from "
178 << inputLocation<float>() <<
" and storing it into " << outputLocation() <<
endmsg;
188 : MultiTransformer( name, svcLoc,
189 { KeyValue(
"InputLocation1", {
"/Event/MyInt" } ),
190 KeyValue(
"InputLocation2", {
"/Event/MyOtherInt" } ) },
191 { KeyValue(
"OutputLocation1", {
"/Event/MyMultiFloat1" } ),
192 KeyValue(
"OutputLocation2", {
"/Event/MyMultiFloat2" } ) } ) {}
194 std::tuple<float, float>
operator()(
const int& input1,
const int& input2 )
const override {
195 info() <<
"Number of inputs : " << inputLocationSize() <<
", number of outputs : " << outputLocationSize()
197 info() <<
"Converting " << input1 <<
" from " << inputLocation<0>() <<
" and " << input2 <<
" from "
198 << inputLocation<1>() <<
endmsg;
199 info() <<
"Storing results into " << outputLocation<0>() <<
" and " << outputLocation<1>() <<
endmsg;
200 return std::tuple<float, float>{ input1, input2 };
213 : MergingTransformer( name, svcLoc, {
"InputLocations", {} },
214 {
"OutputLocation",
"/Event/MyConcatenatedIntVector" } ) {}
219 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
220 [](
const auto a,
const auto b ) { return a + b.size(); } );
221 std::vector<int> out;
222 out.reserve( nelements );
224 for (
auto& intVector : intVectors ) {
225 info() <<
"Concatening vector " << intVector <<
endmsg;
226 out.insert( out.end(), intVector.begin(), intVector.end() );
229 info() <<
"Storing output vector " << out <<
" to " << outputLocation() <<
endmsg;
241 : MergingTransformer( name, svcLoc, {
"InputLocations", {} },
242 {
"OutputLocation",
"/Event/MyConcatenatedIntVector" } ) {}
247 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
248 [](
const auto a,
const auto b ) { return a + ( b ? b->size() : 0 ); } );
249 std::vector<int> out;
250 out.reserve( nelements );
252 for (
auto& intVector : intVectors ) {
253 info() <<
"Concatening vector " << intVector <<
endmsg;
255 out.insert( out.end(), intVector->begin(), intVector->end() );
259 info() <<
"Storing output vector " << out <<
" to " << outputLocation() <<
endmsg;
269 : Consumer( name, svcLoc, KeyValue(
"InputLocation",
"/Event/MyFloat" ) ) {}
272 info() <<
"executing FloatDataConsumer: " << input <<
endmsg;
283 info() <<
"executing ContextConsumer, got " << ctx <<
endmsg;
292 : Transformer( name, svcLoc, KeyValue{
"OutputLoc",
"/Event/SomeOtherInt" } ) {}
295 info() <<
"executing ContextConsumer, got " << ctx <<
endmsg;
305 : Consumer( name, svcLoc, KeyValue(
"InputLocation",
"/Event/MyInt" ) ) {}
308 info() <<
"executing ContextIntConsumer, got context = " << ctx <<
", int = " << i <<
endmsg;
317 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/MyVectorOfDoubles" ) ) {}
320 info() <<
"storing vector<double> into " << outputLocation() <<
endmsg;
321 return { 12.34, 56.78, 90.12, 34.56, 78.90 };
332 : MultiScalarTransformer( name, svcLoc, KeyValue{
"InputDoubles", {
"/Event/MyVectorOfDoubles" } },
333 { KeyValue{
"OutputFractions", {
"/Event/MyVectorOfFractions" } },
334 KeyValue{
"OutputIntegers", {
"/Event/MyVectorOfIntegers" } } } ) {}
336 using MultiScalarTransformer::operator();
338 std::tuple<double, int>
operator()(
const double& d )
const {
340 double frac = std::frexp( d, &i );
341 info() <<
"Converting " << d <<
" -> " << frac <<
", " << i <<
endmsg;
352 : MultiScalarTransformer( name, svcLoc, KeyValue{
"InputDoubles", {
"/Event/MyVectorOfDoubles" } },
353 { KeyValue{
"OutputFractions", {
"/Event/OptMyVectorOfFractions" } },
354 KeyValue{
"OutputIntegers", {
"/Event/OptMyVectorOfIntegers" } } } ) {}
356 using MultiScalarTransformer::operator();
358 std::optional<std::tuple<double, int>>
operator()(
const double& d )
const {
360 info() <<
"Skipping " << d <<
endmsg;
364 double frac = std::frexp( d, &i );
365 info() <<
"Converting " << d <<
" -> " << frac <<
", " << i <<
endmsg;
366 return std::make_tuple( frac, i );
375 : ScalarTransformer( name, svcLoc,
376 { KeyValue{
"InputFractions", {
"/Event/MyVectorOfFractions" } },
377 KeyValue{
"InputIntegers", {
"/Event/MyVectorOfIntegers" } } },
378 { KeyValue{
"OutputDoubles", {
"/Event/MyNewVectorOfDoubles" } } } ) {}
380 using ScalarTransformer::operator();
383 double d = std::ldexp( frac, i );
384 info() <<
"Converting " << i <<
", " << frac <<
" -> " << d <<
endmsg;
395 : ScalarTransformer( name, svcLoc,
396 { KeyValue{
"InputFractions", {
"/Event/MyVectorOfFractions" } },
397 KeyValue{
"InputIntegers", {
"/Event/MyVectorOfIntegers" } } },
398 { KeyValue{
"OutputDoubles", {
"/Event/MyOptVectorOfDoubles" } } } ) {}
400 using ScalarTransformer::operator();
402 std::optional<double>
operator()(
const double& frac,
const int& i )
const {
403 double d = std::ldexp( frac, i );
405 info() <<
"Skipping " << d <<
endmsg;
408 info() <<
"Converting " << i <<
", " << frac <<
" -> " << d <<
endmsg;
416 using Consumer::Consumer;
434 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/MyS" ) ) {}
438 for (
int i = 0; i <
j; ++i ) out.insert(
new S{} );
439 info() <<
"storing KeyedContainer of size " << out.size() <<
" into " << outputLocation() <<
endmsg;
453 : MergingTransformer( name, svcLoc, {
"InputRanges", {} },
454 {
"OutputLocation",
"/Event/MyConcatenatedIntFromSVector" } ) {}
458 std::vector<int> out;
460 for (
const auto& SVector : SVectors ) {
461 info() <<
"Concatening range of size " << SVector.size() <<
endmsg;
462 for (
auto* s : SVector ) { out.push_back( s->a ); }
464 info() <<
"Storing output vector " << out <<
" to " << outputLocation() <<
endmsg;
476 : MergingTransformer( name, svcLoc, {
"InputRanges", {} } ) {}
480 OptSVectors )
const override {
482 for (
const auto& OptSVector : OptSVectors ) {
483 if ( OptSVector.has_value() ) {
484 auto SVector = OptSVector.value();
485 info() <<
"Consuming vector of size: " << SVector.size() <<
endmsg;
487 info() <<
"Skipping empty optional range" <<
endmsg;
499 : MergingTransformer( name, svcLoc, {
"InputLocations", {} } ) {}
503 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
504 [](
const auto a,
const auto b ) { return a + b.size(); } );
505 info() <<
"sum of input sizes: " << nelements <<
endmsg;
507 for (
const auto& intVector : intVectors ) { info() <<
"Consuming vector " << intVector <<
endmsg; }
521 :
Base( name, svcLoc, {
"InputLocations", {} } ) {}
525 auto nelements = std::accumulate( intVectors.begin(), intVectors.end(), 0,
526 [](
const auto a,
const auto b ) { return a + b.size(); } );
527 info() <<
"sum of input sizes: " << nelements <<
endmsg;
529 for (
const auto& intVector : intVectors ) { info() <<
"Consuming vector " << intVector <<
endmsg; }
543 : Producer( name, pSvcLocator, KeyValue{
"TrackLocation",
"" } ){};
558 : MergingMultiTransformer{ name,
560 { KeyValues{
"InputInts", {} }, KeyValues{
"InputDoubles", {} } },
561 { KeyValue{
"OutputInts",
"/Event/MySummedInts" },
562 KeyValue{
"OutputDoubles",
"/Event/MySummedDoubles" } } } {}
564 std::tuple<std::vector<int>, std::vector<double>>
567 auto r = std::tuple{ std::vector<int>{}, std::vector<double>{} };
569 std::transform( begin( intVectors ), end( intVectors ), std::back_inserter( is ),
570 [](
const std::vector<int>& vi ) {
return std::accumulate( begin( vi ), end( vi ), 0 ); } );
571 always() <<
" accumulated: " << is <<
endmsg;
572 std::transform( begin( doubleVectors ), end( doubleVectors ), std::back_inserter( ds ),
573 [](
const std::vector<double>& vd ) {
return std::accumulate( begin( vd ), end( vd ), 0. ); } );
574 always() <<
" accumulated: " << ds <<
endmsg;
595 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/MySharedFoo" ) ) {}
598 auto foo = std::make_shared<Foo>(
m_value.value() );
599 info() <<
"executing ShrdPtrProducer, storing shared_ptr<Foo> with payload at " << foo.get() <<
" and value "
600 << foo->i <<
" into " << outputLocation() <<
endmsg;
612 : Consumer( name, svcLoc, KeyValue(
"InputLocation",
"/Event/MySharedFoo" ) ) {}
614 void operator()(
const std::shared_ptr<Foo>& foo )
const override {
615 info() <<
"executing ShrdPtrConsumer, got shared_ptr<Foo> with payload at " << foo.get() <<
" with value "
616 << foo->i <<
" from " << inputLocation() <<
endmsg;
632 : SplittingMergingTransformer( name, svcLoc, {
"InputLocations", {} }, {
"OutputLocations", {} } ) {}
637 for (
const auto& iv : intVectors ) { info() <<
"loaded " << iv <<
" from " << inputLocation( l++ ) <<
endmsg; }
638 std::vector<int> out( outputLocationSize(), 0 );
639 for (
const auto& [l, r] :
m_mapping.value() ) {
640 out[l] = std::accumulate( intVectors.at( r ).begin(), intVectors.at( r ).end(), out[l] );
643 for (
const auto& o : out ) { info() <<
"storing " << o <<
" in " << outputLocation( l++ ) <<
endmsg; }
658 parent = std::exchange( other.parent,
nullptr );
659 action = std::exchange( other.action,
nullptr );
670 Gaudi::Functional::Traits::use_<BaseClass_t, Gaudi::Functional::Traits::WriteOpaqueFor<Eventually>>> {
673 : Producer( name, svcLoc, KeyValue(
"OutputLocation",
"/Event/Eventually" ) ) {}
676 always() <<
"creating Eventually" <<
endmsg;
678 me->always() <<
"My Eventually is about to be destroyed" <<
endmsg;
685 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<void*>> );
686 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<int>> );
687 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<std::vector<int>*>> );
688 static_assert( std::ranges::forward_range<Gaudi::Functional::vector_of_const_<std::vector<int>>> );
689 static_assert( std::same_as<typename Gaudi::Functional::vector_of_const_<std::vector<int>*>::value_type,
690 std::vector<int>
const*> );
691 static_assert( std::same_as<typename Gaudi::Functional::vector_of_const_<std::vector<int>>::value_type,
692 std::vector<int>
const> );
694 std::same_as<typename Gaudi::Functional::vector_of_const_<Gaudi::Range_<std::vector<void*>>>::value_type,
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
#define DECLARE_COMPONENT(type)
MsgStream & always() const
shortcut for the method msgStream(MSG::ALWAYS)
This class represents an entry point to all the event specific data.
Base class from which all concrete algorithm classes should be derived.
Implementation of property with value of concrete type.
Useful class for representation of "sequence" of the objects through the range of valid iterators.
Definition of the basic interface.
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
template class KeyedContainer, KeyedContainer.h
long add(ContainedObject *pObject) override
ObjectContainerBase overload: Add an object to the container.
Definition of the templated KeyedObject class.
KeyedObject()=default
Standard Constructor. The object key is preset to the invalid value.
Very simple class to represent the container of objects which are not owned by this container.
Base class used to extend a class implementing other interfaces.
details::Consumer< Signature, Traits_, details::isLegacy< Traits_ > > Consumer
details::MergingTransformer< Signature, Traits_, details::isLegacy< Traits_ > > MergingConsumer
details::Producer< Signature, Traits_, details::isLegacy< Traits_ > > Producer
Gaudi::Range_< MyData::ConstVector > MyDataRange
KeyedContainer< KeyedObject< int >, Containers::HashMap > int_container
Gaudi::Functional::Traits::BaseClass_t< Gaudi::Algorithm > BaseClass_t
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
void operator()(const EventContext &ctx) const override
void operator()(const EventContext &ctx, const int &i) const override
ContextIntConsumer(const std::string &name, ISvcLocator *svcLoc)
int operator()(const EventContext &ctx) const override
ContextTransformer(const std::string &name, ISvcLocator *svcLoc)
Gaudi::Accumulators::MsgCounter< MSG::INFO > m_info
Gaudi::Accumulators::MsgCounter< MSG::ERROR > m_err
Gaudi::Accumulators::MsgCounter< MSG::WARNING > m_warn
void operator()() const override
Eventually & operator=(Eventually const &)=delete
void(* action)(Gaudi::Algorithm const *)
Eventually(Gaudi::Algorithm const *p, void(*a)(Gaudi::Algorithm const *))
Eventually(Eventually const &)=delete
Eventually & operator=(Eventually &&other)
Eventually(Eventually &&other)
Gaudi::Algorithm const * parent
void operator()(const float &input) const override
FloatDataConsumer(const std::string &name, ISvcLocator *svcLoc)
Foo & operator=(Foo &&)=delete
Foo & operator=(const Foo &)=delete
IntDataConsumer(const std::string &name, ISvcLocator *svcLoc)
void operator()(const int &input) const override
int operator()() const override
Gaudi::Property< int > m_value
IntDataProducer(const std::string &name, ISvcLocator *svcLoc)
float operator()(const int &in1, const float &in2) const override
IntFloatToFloatData(const std::string &name, ISvcLocator *svcLoc)
IntIntToFloatFloatData(const std::string &name, ISvcLocator *svcLoc)
std::tuple< float, float > operator()(const int &input1, const int &input2) const override
IntToFloatData(const std::string &name, ISvcLocator *svcLoc)
float operator()(const int &input) const override
IntVectorsMerger(const std::string &name, ISvcLocator *svcLoc)
void operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors) const override
Gaudi::Functional::MergingConsumer< void(Gaudi::Functional::vector_of_const_< std::vector< int > > const &), BaseClass_t > Base
void operator()(Gaudi::Functional::vector_of_const_< std::vector< int > > const &intVectors) const override
IntVectorsMergingConsumer(const std::string &name, ISvcLocator *svcLoc)
IntVectorsToIntVector(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors) const override
IntVectorsToInts(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors) const override
Gaudi::Property< std::vector< std::pair< int, int > > > m_mapping
KeyedDataProducer(const std::string &name, ISvcLocator *svcLoc)
int_container operator()() const override
std::vector< const MyData * > ConstVector
OpaqueProducer(const std::string &name, ISvcLocator *svcLoc)
Eventually operator()() const override
void operator()(const Gaudi::Functional::vector_of_const_< std::optional< Gaudi::NamedRange_< std::vector< S const * > > > > &OptSVectors) const override
OptionalSRangesMerger(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > * > &intVectors) const override
PIntVectorsToIntVector(const std::string &name, ISvcLocator *svcLoc)
MyDataRange operator()() const override
RangeProducer(const std::string &name, ISvcLocator *pSvcLocator)
SDataProducer(const std::string &name, ISvcLocator *svcLoc)
S::Container operator()() const override
KeyedObject()=default
Standard Constructor. The object key is preset to the invalid value.
KeyedContainer< S, Containers::HashMap > Container
SharedObjectsContainer< S > Selection
std::vector< S const * > ConstVector
std::vector< int > operator()(const Gaudi::Functional::vector_of_const_< Gaudi::Range_< std::vector< S const * > > > &SVectors) const override
SRangesToIntVector(const std::string &name, ISvcLocator *svcLoc)
ShrdPtrConsumer(const std::string &name, ISvcLocator *svcLoc)
void operator()(const std::shared_ptr< Foo > &foo) const override
Gaudi::Property< int > m_value
ShrdPtrProducer(const std::string &name, ISvcLocator *svcLoc)
std::shared_ptr< Foo > operator()() const override
TwoDMerger(const std::string &name, ISvcLocator *svcLoc)
std::tuple< std::vector< int >, std::vector< double > > operator()(const Gaudi::Functional::vector_of_const_< std::vector< int > > &intVectors, const Gaudi::Functional::vector_of_const_< std::vector< double > > &doubleVectors) const override
VectorDataProducer(const std::string &name, ISvcLocator *svcLoc)
std::vector< int > operator()() const override
Gaudi::Property< std::vector< int > > m_data
std::vector< double > operator()() const override
VectorDoubleProducer(const std::string &name, ISvcLocator *svcLoc)
void operator()() const override
Base class to be used to extend an interface.