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>
  1021       if ( 
std::distance( first, last ) > static_cast<std::ptrdiff_t>( maxv ) ) {
  1022         Warning( 
"farray('" + name + 
"'): array is overflow, skip extra entries" );
  1027       Int* len = ints( length, 0, maxv );
  1036       FArray* var = fArray( name, len );
  1074     template <
typename FunIterator, 
typename DataIterator>
  1082       if ( 
std::distance( first, last ) > static_cast<std::ptrdiff_t>( maxv ) ) {
  1087         Warning( 
"farray('" + os.str() + 
"'): array overflow, skipping extra entries" ).ignore();
  1092       Int* len = ints( length, 0, maxv );
  1104                       [&]( 
const auto& item ) { 
return this->fArray( item.first, len ); } );
  1110       for ( 
size_t index = 0; first != last; ++first, ++index ) {
  1111         auto item = first_item;
  1112         for ( 
auto& var : vars ) {
  1113           ( *var )[index] = ( item++ )->
second( *first );
  1124     StatusCode farray( 
const Container<NamedFunction>& funs, DataIterator first, DataIterator last,
  1127       return farray_impl( funs.begin(), funs.end(), std::forward<DataIterator>( first ),
  1128                           std::forward<DataIterator>( last ), length, maxv );
  1131     template <
typename NamedFunctions, 
typename DataIterator,
  1132               typename = std::enable_if_t<!std::is_convertible<NamedFunctions, std::string>::value>>
  1136       return farray_impl( funs.begin(), funs.end(), std::forward<DataIterator>( first ),
  1137                           std::forward<DataIterator>( last ), length, maxv );
  1171     template <
class FUNC1, 
class FUNC2, 
class Iterator>
  1176                      std::forward<Iterator>( last ), length, maxv );
  1215     template <
class FUNC1, 
class FUNC2, 
class FUNC3, 
class Iterator>
  1221                      std::forward<Iterator>( first ), std::forward<Iterator>( last ), length, maxv );
  1263     template <
class FUNC1, 
class FUNC2, 
class FUNC3, 
class FUNC4, 
class Iterator>
  1272                      std::forward<Iterator>( first ), std::forward<Iterator>( last ), length, maxv );
  1327     template <
class MATRIX>
  1339       if ( rows >= maxv ) {
  1340         Warning( 
"fmatrix('" + name + 
"'): matrix is overflow, skip extra items" ).ignore();
  1341         rows = ( 0 < maxv ) ? ( maxv - 1 ) : 0;
  1345       Int* len = ints( length, 0, maxv );
  1354       FMatrix* var = fMatrix( name, len, cols );
  1360       for ( 
size_t iCol = 0; iCol < cols; ++iCol ) {
  1361         for ( MIndex iRow = 0; iRow < rows; ++iRow ) {
  1362           ( *var )[iRow][iCol] = data[iRow][iCol];
  1405     template <
class DATA>
  1417       if ( first + maxv < last ) {
  1418         Warning( 
"fmatrix('" + name + 
"'): matrix is overflow, skip extra items" ).ignore();
  1419         last = first + maxv;
  1423       Int* len = ints( length, 0, maxv );
  1429       *len = last - first;
  1432       FMatrix* var = fMatrix( name, len, cols );
  1439       for ( ; first != last; ++first ) {
  1441         for ( MIndex iCol = 0; iCol < cols; ++iCol ) {
  1442           ( *var )[iRow][iCol] = (float)( ( *first )[iCol] );
  1529     template <
class FUN, 
class DATA>
  1541       if ( 
std::distance( first, last ) > static_cast<std::ptrdiff_t>( maxv ) ) {
  1542         Warning( 
"fmatrix('" + name + 
"'): matrix is overflow, skip extra items" ).ignore();
  1547       Int* len = ints( length, 0, maxv );
  1557       FMatrix* var = fMatrix( name, len, cols );
  1564       for ( ; first != last; ++first ) {
  1566         for ( FUN 
fun = funF; 
fun < funL; ++
fun ) {
  1567           ( *var )[iRow][
fun - funF] = ( *fun )( *first );
  1600     template <
class DATA>
  1615       FArray* var = fArray( name, length );
  1664     template <
class ARRAY>
  1671       auto first = 
begin( data );
  1705     template <
class ARRAY>
  1763     template <
class MATRIX>
  1774       FMatrix* var = fMatrix( name, rows, cols );
  1780       for ( 
size_t iCol = 0; iCol < cols; ++iCol ) {
  1781         for ( 
size_t iRow = 0; iRow < rows; ++iRow ) {
  1782           ( *var )[iRow][iCol] = data[iRow][iCol];
  1806     template <
class TYPE>
  1809       return columns( v, 
std::make_pair( name + 
"E", &ROOT::Math::LorentzVector<TYPE>::E ),
  1810                       std::make_pair( name + 
"X", &ROOT::Math::LorentzVector<TYPE>::Px ),
  1811                       std::make_pair( name + 
"Y", &ROOT::Math::LorentzVector<TYPE>::Py ),
  1812                       std::make_pair( name + 
"Z", &ROOT::Math::LorentzVector<TYPE>::Pz ) );
  1831     template <
class TYPE, 
class TAG>
  1855     template <
class TYPE, 
class TAG>
  1871     template <
class TYPE, 
unsigned int D1, 
unsigned int D2, 
class REP>
  1882       FMatrix* var = fMatrix( name, (MIndex)D1, (MIndex)D2 );
  1888       for ( 
size_t iCol = 0; iCol < D2; ++iCol ) {
  1889         for ( 
size_t iRow = 0; iRow < D1; ++iRow ) {
  1890           ( *var )[iRow][iCol] = mtrx( iRow, iCol );
  1914     template <
class KEY, 
class VALUE>
  1916                         const std::string& length, 
const size_t maxv = 100 )
  1920           {[]( 
const Info& i ) { 
return i.first; }, []( 
const Info& i ) { 
return i.second; }}};
  1933     template <
class TYPE>
  1964     unsigned long addRef() { 
return ++m_refCount; }
  1979     bool columnWise()
 const { 
return CLID_ColumnWiseTuple == clid(); }
  1982     bool rowWise()
 const { 
return CLID_RowWiseTuple == clid(); }
  1988     bool valid()
 const { 
return 0 != tuple(); }
  2012     const ItemMap& 
items()
 const { 
return m_items; }
  2023     Int* ints( 
const std::string& name, 
int minv, 
int maxv );
  2026     FArray* fArray( 
const std::string& name, Int* item );
  2029     FArray* fArray( 
const std::string& name, 
const MIndex& rows );
  2035     FMatrix* fMatrix( 
const std::string& name, Int* item, 
const MIndex& cols );
  2038     FMatrix* fMatrix( 
const std::string& name, 
const MIndex& rows, 
const MIndex& cols );
  2106     size_t m_refCount = 0;
  2169 #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: