2 #ifndef GAUDIALG_TUPLEOBJ_H 3 #define GAUDIALG_TUPLEOBJ_H 1 32 #include "Math/Point3D.h" 33 #include "Math/SMatrix.h" 34 #include "Math/SVector.h" 35 #include "Math/Vector3D.h" 36 #include "Math/Vector4D.h" 66 template <
typename Arg>
69 return T( std::forward<Arg>( i ) );
75 template <
typename Iterator>
688 unsigned long long maxv );
796 auto is_ok = [](
const StatusCode& sc ) ->
bool {
return sc.isSuccess(); };
798 if ( i !=
end( scs ) ) {
807 template <
typename Value,
typename... Args>
811 std::index_sequence_for<Args...>{} );
891 template <
typename ITERATOR1,
typename ITERATOR2>
895 return farray( name,
detail::to_float, std::forward<ITERATOR1>( first ), std::forward<ITERATOR2>( last ), length,
941 template <
class DATA>
1009 template <
class FUNCTION,
class ITERATOR>
1017 if (
std::distance( first, last ) > static_cast<std::ptrdiff_t>( maxv ) ) {
1018 Warning(
"farray('" + name +
"'): array is overflow, skip extra entries" );
1023 Int* len = ints( length, 0, maxv );
1030 FArray* var = fArray( name, len );
1066 template <
typename FunIterator,
typename DataIterator>
1074 if (
std::distance( first, last ) > static_cast<std::ptrdiff_t>( maxv ) ) {
1078 [](
std::ostream& os,
const auto& i ) -> decltype(
auto ) {
return os << i.first; } );
1079 Warning(
"farray('" + os.str() +
"'): array overflow, skipping extra entries" ).ignore();
1084 Int* len = ints( length, 0, maxv );
1094 [&](
const auto& item ) {
return this->fArray( item.first, len ); } );
1100 for (
size_t index = 0; first != last; ++first, ++index ) {
1101 auto item = first_item;
1102 for (
auto& var : vars ) {
1103 ( *var )[index] = ( item++ )->
second( *first );
1114 StatusCode farray(
const Container<NamedFunction>& funs, DataIterator first, DataIterator last,
1117 return farray_impl( funs.begin(), funs.end(), std::forward<DataIterator>( first ),
1118 std::forward<DataIterator>( last ), length, maxv );
1121 template <
typename NamedFunctions,
typename DataIterator,
1122 typename = std::enable_if_t<!std::is_convertible<NamedFunctions, std::string>::value>>
1126 return farray_impl( funs.begin(), funs.end(), std::forward<DataIterator>( first ),
1127 std::forward<DataIterator>( last ), length, maxv );
1161 template <
class FUNC1,
class FUNC2,
class Iterator>
1166 std::forward<Iterator>( last ), length, maxv );
1205 template <
class FUNC1,
class FUNC2,
class FUNC3,
class Iterator>
1211 std::forward<Iterator>( first ), std::forward<Iterator>( last ), length, maxv );
1253 template <
class FUNC1,
class FUNC2,
class FUNC3,
class FUNC4,
class Iterator>
1262 std::forward<Iterator>( first ), std::forward<Iterator>( last ), length, maxv );
1317 template <
class MATRIX>
1325 if ( rows >= maxv ) {
1326 Warning(
"fmatrix('" + name +
"'): matrix is overflow, skip extra items" ).ignore();
1327 rows = ( 0 < maxv ) ? ( maxv - 1 ) : 0;
1331 Int* len = ints( length, 0, maxv );
1338 FMatrix* var = fMatrix( name, len, cols );
1342 for (
size_t iCol = 0; iCol < cols; ++iCol ) {
1343 for ( MIndex iRow = 0; iRow < rows; ++iRow ) {
1344 ( *var )[iRow][iCol] = data[iRow][iCol];
1387 template <
class DATA>
1395 if ( first + maxv < last ) {
1396 Warning(
"fmatrix('" + name +
"'): matrix is overflow, skip extra items" ).ignore();
1397 last = first + maxv;
1401 Int* len = ints( length, 0, maxv );
1405 *len = last - first;
1408 FMatrix* var = fMatrix( name, len, cols );
1413 for ( ; first != last; ++first ) {
1415 for ( MIndex iCol = 0; iCol < cols; ++iCol ) {
1416 ( *var )[iRow][iCol] = (float)( ( *first )[iCol] );
1503 template <
class FUN,
class DATA>
1511 if (
std::distance( first, last ) > static_cast<std::ptrdiff_t>( maxv ) ) {
1512 Warning(
"fmatrix('" + name +
"'): matrix is overflow, skip extra items" ).ignore();
1517 Int* len = ints( length, 0, maxv );
1525 FMatrix* var = fMatrix( name, len, cols );
1530 for ( ; first != last; ++first ) {
1532 for ( FUN
fun = funF;
fun < funL; ++
fun ) {
1533 ( *var )[iRow][
fun - funF] = ( *fun )( *first );
1566 template <
class DATA>
1577 FArray* var = fArray( name, length );
1624 template <
class ARRAY>
1631 auto first =
begin( data );
1665 template <
class ARRAY>
1723 template <
class MATRIX>
1730 FMatrix* var = fMatrix( name, rows, cols );
1734 for (
size_t iCol = 0; iCol < cols; ++iCol ) {
1735 for (
size_t iRow = 0; iRow < rows; ++iRow ) {
1736 ( *var )[iRow][iCol] = data[iRow][iCol];
1760 template <
class TYPE>
1763 return columns( v,
std::make_pair( name +
"E", &ROOT::Math::LorentzVector<TYPE>::E ),
1764 std::make_pair( name +
"X", &ROOT::Math::LorentzVector<TYPE>::Px ),
1765 std::make_pair( name +
"Y", &ROOT::Math::LorentzVector<TYPE>::Py ),
1766 std::make_pair( name +
"Z", &ROOT::Math::LorentzVector<TYPE>::Pz ) );
1785 template <
class TYPE,
class TAG>
1809 template <
class TYPE,
class TAG>
1825 template <
class TYPE,
unsigned int D1,
unsigned int D2,
class REP>
1832 FMatrix* var = fMatrix( name, (MIndex)D1, (MIndex)D2 );
1836 for (
size_t iCol = 0; iCol < D2; ++iCol ) {
1837 for (
size_t iRow = 0; iRow < D1; ++iRow ) {
1838 ( *var )[iRow][iCol] = mtrx( iRow, iCol );
1862 template <
class KEY,
class VALUE>
1864 const std::string& length,
const size_t maxv = 100 )
1868 {[](
const Info& i ) {
return i.first; }, [](
const Info& i ) {
return i.second; }}};
1881 template <
class TYPE>
1912 unsigned long addRef() {
return ++m_refCount; }
1927 bool columnWise()
const {
return CLID_ColumnWiseTuple == clid(); }
1930 bool rowWise()
const {
return CLID_RowWiseTuple == clid(); }
1936 bool valid()
const {
return 0 != tuple(); }
1960 const ItemMap&
items()
const {
return m_items; }
1971 Int* ints(
const std::string& name,
int minv,
int maxv );
1974 FArray* fArray(
const std::string& name, Int* item );
1977 FArray* fArray(
const std::string& name,
const MIndex& rows );
1983 FMatrix* fMatrix(
const std::string& name, Int* item,
const MIndex& cols );
1986 FMatrix* fMatrix(
const std::string& name,
const MIndex& rows,
const MIndex& cols );
2054 size_t m_refCount = 0;
2117 #endif // GAUDIALG_TUPLEOBJ_H StatusCode column(const std::string &name, const ROOT::Math::DisplacementVector3D< TYPE, TAG > &v)
Useful shortcut to put 3D-Vector directly into N-Tuple:
UShorts m_ushorts
the actual storage of all 'unsigned int' columns
FMatrices m_fmatrices
the actual storage of all 'FArray' columns
A bit modified version of 'Loki::AssocVector' associative vector from Loki library by Andrei Alexandr...
std::map< std::string, std::string > ItemMap
const NTuple::Tuple * tuple() const
provide the access to underlying Gaudi N-tuple
StatusCode matrix(const std::string &name, const MATRIX &data, const MIndex &rows, const MIndex &cols)
fill N-Tuple with fixed-size matrix
T forward_as_tuple(T...args)
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
NTuple::Item< float > Float
basic type for float items
bool goodItem(const std::string &name) const
check the uniqueness of the name
bool evtColType() const
Event collection ?
Doubles m_doubles
the actual storage of all 'Double' columns
Tuples::Type m_type
tuple 'type'
StatusCode columns_helper(const Value &value, const Tuple &tup, std::index_sequence< I... >)
Set the values for several columns simultaneously, for the same object Non-existing columns will be a...
Class acting as a smart pointer holding a N tuple _Item.
NTuple::Item< IOpaqueAddress * > Address
basic type for address items
FMatrices m_matricesf
the actual storage of all 'FMatrix' columns (fixed)
Floats m_floats
the actual storage of all 'Float' columns
GAUDI_API void fill(AIDA::IHistogram1D *histo, const double value, const double weight=1.0)
simple function to fill AIDA::IHistogram1D objects
NTuple::Item< unsigned long long > ULongLong
basic type for unsigned long long items
FArrays m_farrays
the actual storage of all 'FArray' columns
NTuple::Item< unsigned short > UShort
basic type for unsigned int items
StatusCode fmatrix(const std::string &name, const MATRIX &data, size_t rows, const MIndex &cols, const std::string &length, size_t maxv)
Fill N-Tuple with data from variable-size matrix.
GaudiUtils::HashMap< std::string, std::unique_ptr< Char > > Chars
the actual storage type for short columns
NTuple::Tuple * tuple()
provide the access to underlying Gaudi N-tuple
GaudiUtils::HashMap< std::string, std::unique_ptr< Short > > Shorts
the actual storage type for short columns
FArrays m_arraysf
the actual storage of all 'FArray' columns (fixed)
StatusCode farray(const std::string &name, ITERATOR1 &&first, ITERATOR2 &&last, const std::string &length, size_t maxv)
Add an indexed array (of type float) to N-tuple.
NTuple::Item< unsigned char > UChar
basic type for unsigned int items
Bools m_bools
the actual storage of all 'bool' columns
Provide serialization function (output only) for some common STL classes (vectors, lists, pairs, maps) plus GaudiUtils::Map and GaudiUtils::HashMap.
auto begin(reverse_wrapper< T > &w)
bool columnWise() const
column wise NTuple ?
PropertyMgr & operator=(const PropertyMgr &)=delete
NTuple::Item< short > Short
basic type for int items
Chars m_chars
the actual storage of all 'Int' columns
A simple wrapper class over standard Gaudi NTuple::Tuple facility.
bool addItem(std::string name, std::string type)
add the item name into the list of known items
StatusCode fmatrix(const std::string &name, FUN funF, FUN funL, DATA first, DATA last, const std::string &length, size_t maxv)
fill N-Tuple with matrix of "direct-product" of "data-vector" [first,last) and "function-vector" [fun...
GaudiUtils::HashMap< std::string, std::unique_ptr< Int > > Ints
the actual storage type for integer columns
ULongLongs m_ulonglongs
the actual storage of all 'ulonglong' columns
TupleObj.h GaudiAlg/TupleObj.h namespace with few technical implementations.
A simple wrapper class over standard Gaudi NTuple::Tuple facility.
StatusCode array(const std::string &name, const ARRAY &data)
fill N-Tuple with fixed-size array
This class is used for returning status codes from appropriate routines.
StatusCode farray(const std::string &name1, const FUNC1 &func1, const std::string &name2, const FUNC2 &func2, const std::string &name3, const FUNC3 &func3, Iterator &&first, Iterator &&last, const std::string &length, size_t maxv)
Put three functions from one data array into LoKi-style N-Tuple simultaneously (effective!) ...
StatusCode farray(const std::string &name, const DATA &data, const std::string &length, const size_t maxv)
Add an indexed array (of type float) to N-tuple.
NTuple::Matrix< float > FMatrix
basic type for matrix of floats
UInts m_uints
the actual storage of all 'unsigned int' columns
StatusCode matrix(const std::string &name, const ROOT::Math::SMatrix< TYPE, D1, D2, REP > &mtrx)
shortcut to put Smatrix into N-tuple:
GaudiUtils::HashMap< std::string, std::unique_ptr< Double > > Doubles
the actual storage type for float columns
GaudiUtils::HashMap< std::string, std::unique_ptr< FArray > > FArrays
the actual storage type for array columns
T operator()(Arg &&i) const
GaudiUtils::HashMap< std::string, std::unique_ptr< UInt > > UInts
the actual storage type for unsigned integer columns
ItemMap m_items
all booked types:
NTuple::Item< bool > Bool
basic type for int items
auto end(reverse_wrapper< T > &w)
NTuple::Item< double > Double
basic type for double items
GaudiUtils::HashMap< std::string, std::unique_ptr< FMatrix > > FMatrices
the actual storage type for matrix columns
StatusCode farray(const std::string &name1, const FUNC1 &func1, const std::string &name2, const FUNC2 &func2, Iterator &&first, Iterator &&last, const std::string &length, size_t maxv)
Put two functions from one data array into LoKi-style N-Tuple simultaneously (effective!) ...
Specialization acting as a smart pointer holding a N tuple _Item.
Ints m_ints
the actual storage of all 'Int' columns
unsigned int CLID
Class ID definition.
GaudiUtils::HashMap< std::string, std::unique_ptr< Bool > > Bools
the actual storage type for short columns
LongLongs m_longlongs
the actual storage of all 'longlong' columns
GaudiUtils::HashMap< std::string, std::unique_ptr< LongLong > > LongLongs
the actual storage type for longlong columns
StatusCode farray_impl(FunIterator first_item, FunIterator last_item, DataIterator first, DataIterator last, const std::string &length, size_t maxv)
Put arbitrary number of functions from one data array into LoKi-style N-Tuple simultaneously (effecti...
bool valid() const
valid pointer to tuple ?
StatusCode fmatrix(const std::string &name, DATA first, DATA last, const MIndex &cols, const std::string &length, size_t maxv)
Fill N-Tuple with data from variable-size matrix.
unsigned long addRef()
add the reference to TupleObj
unsigned long refCount() const
return the reference counter
bool rowWise() const
row wise NTuple ?
Stream & ostream_joiner(Stream &os, Iterator first, Iterator last, Separator sep, OutputElement output=OutputElement{})
Abstract base class which allows the user to interact with the actual N tuple implementation.
StatusCode column(const std::string &name, signed char value)
Set the value for the selected tuple column.
ErrorCodes
Tuple error codes.
NTuple::Item< long long > LongLong
basic type for unsigned long long items
Addresses m_addresses
the actual storage of all 'Address' columns
StatusCode farray(const NamedFunctions &funs, DataIterator first, DataIterator last, const std::string &length, size_t maxv)
GaudiUtils::HashMap< std::string, std::unique_ptr< ULongLong > > ULongLongs
the actual storage type for ulonglong columns
StatusCode farray(const std::string &name1, const FUNC1 &func1, const std::string &name2, const FUNC2 &func2, const std::string &name3, const FUNC3 &func3, const std::string &name4, const FUNC4 &func4, Iterator &&first, Iterator &&last, const std::string &length, size_t maxv)
Put four functions from one data array into LoKi-style N-Tuple simultaneously (effective!) ...
StatusCode array(const std::string &name, DATA first, DATA last)
fill N-Tuple with fixed-size array
struct GAUDI_API array
Parametrisation class for redirection array - like implementation.
NTuple::Tuple * m_tuple
tuple itself
StatusCode fmatrix(const std::string &name, const GaudiUtils::VectorMap< KEY, VALUE > &info, const std::string &length, const size_t maxv=100)
shortcut to put "ExtraInfo" fields of major into N-Tuple
Tuples::Type type() const
accessor to the N-Tuple type
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
StatusCode farray(const std::string &name, const FUNCTION &function, ITERATOR first, ITERATOR last, const std::string &length, size_t maxv)
Put an indexed array into LoKi-style N-Tuple.
T back_inserter(T...args)
StatusCode farray(const Container< NamedFunction > &funs, DataIterator first, DataIterator last, const std::string &length, size_t maxv)
double fun(const std::vector< double > &x)
NTuple::Item< char > Char
basic type for int items
std::add_const_t< typename std::iterator_traits< Iterator >::reference > const_ref_t
Common class providing an architecture-independent hash map.
NTuple::Item< int > Int
basic type for int items
GaudiUtils::HashMap< std::string, std::unique_ptr< UShort > > UShorts
the actual storage type for unsigned short columns
StatusCode column(const std::string &name, const ROOT::Math::LorentzVector< TYPE > &v)
Useful shortcut to put LorentzVector directly into N-Tuple:
Shorts m_shorts
the actual storage of all 'Int' columns
bool invalid() const
invalid pointer to tuple ?
const ItemMap & items() const
get the full list of booked items
NTuple::Array< float > FArray
basic type for array of floats
auto invoke(F &&f, ArgTypes &&...args) noexcept(noexcept(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))) -> decltype(detail2::INVOKE(std::forward< F >(f), std::forward< ArgTypes >(args)...))
Implementation file for Tuple::TupleObj::put method.
Opaque address interface definition.
Class acting as a smart pointer holding a N tuple _Item.
const CLID & clid() const
accessor to the N-Tuple CLID
StatusCode array(const std::string &name, const ARRAY &data, const MIndex &length)
fill N-Tuple with fixed-size array
GaudiUtils::HashMap< std::string, std::unique_ptr< UChar > > UChars
the actual storage type for unsigned short columns
Class acting as a smart pointer holding a N tuple _Item.
GaudiUtils::HashMap< std::string, std::unique_ptr< Address > > Addresses
the actual storage type for address columns
Type
the list of available types for ntuples
const std::string & name() const
get the name
NTuple::Item< unsigned int > UInt
basic type for unsigned int items
StatusCode columns(Value &&value, Args &&...args)
TO * reference(FROM *from)
UChars m_uchars
the actual storage of all 'unsigned int' columns
Out1 * put(DataObjectHandle< Out1 > &out_handle, Out2 &&out)
GaudiUtils::HashMap< std::string, std::unique_ptr< Float > > Floats
the actual storage type for float columns
General namespace for Tuple properties.
StatusCode column(const std::string &name, const ROOT::Math::PositionVector3D< TYPE, TAG > &v)
Useful shortcut to put 3D-Vector directly into N-Tuple: