12 #include "GaudiKernel/GaudiException.h"
16 #include "GaudiAlg/Tuples.h"
17 #include "GaudiAlg/TupleObj.h"
21 #include "boost/integer_traits.hpp"
34 template <
typename T>
struct tuple_type_ ;
36 template <>
struct tuple_type_<typename
Tuples::TupleObj::Float>
37 {
static constexpr
const char* fmt =
"F";
38 static constexpr
const char* typ =
"floats"; };
39 template <>
struct tuple_type_<typename
Tuples::TupleObj::Double>
40 {
static constexpr
const char* fmt =
"D";
41 static constexpr
const char* typ =
"doubles"; };
42 template <>
struct tuple_type_<typename
Tuples::TupleObj::Bool>
43 {
static constexpr
const char* fmt =
"I";
44 static constexpr
const char* typ =
"bools";};
45 template <>
struct tuple_type_<typename
Tuples::TupleObj::Char>
46 {
static constexpr
const char* fmt =
"I";
47 static constexpr
const char* typ =
"chars";};
48 template <>
struct tuple_type_<typename
Tuples::TupleObj::UChar>
49 {
static constexpr
const char* fmt =
"I";
50 static constexpr
const char* typ =
"uchars";};
51 template <>
struct tuple_type_<typename
Tuples::TupleObj::Short>
52 {
static constexpr
const char* fmt =
"I";
53 static constexpr
const char* typ =
"shorts";};
54 template <>
struct tuple_type_<typename
Tuples::TupleObj::UShort>
55 {
static constexpr
const char* fmt =
"I";
56 static constexpr
const char* typ =
"ushorts";};
57 template <>
struct tuple_type_<typename
Tuples::TupleObj::Int>
58 {
static constexpr
const char* fmt =
"I";
59 static constexpr
const char* typ =
"ints";};
60 template <>
struct tuple_type_<typename
Tuples::TupleObj::UInt>
61 {
static constexpr
const char* fmt =
"I";
62 static constexpr
const char* typ =
"uints";};
63 template <>
struct tuple_type_<typename
Tuples::TupleObj::LongLong>
64 {
static constexpr
const char* fmt =
"ULL";
65 static constexpr
const char* typ =
"longlongs";};
66 template <>
struct tuple_type_<typename
Tuples::TupleObj::ULongLong>
67 {
static constexpr
const char* fmt =
"ULL";
68 static constexpr
const char* typ =
"ulonglongs";};
69 template <>
struct tuple_type_<typename
Tuples::TupleObj::Address>
70 {
static constexpr
const char* fmt =
"IOpaqueAddress*" ;
71 static constexpr
const char* typ =
"addresses";};
72 template <>
struct tuple_type_<typename
Tuples::TupleObj::FArray>
73 {
static constexpr
const char* fmt =
"FArray";
74 static constexpr
const char* typ =
"farray";};
75 template <>
struct tuple_type_<typename
Tuples::TupleObj::FMatrix>
76 {
static constexpr
const char* fmt =
"FMatrix";
77 static constexpr
const char* typ =
"fmatrix"; };
80 template <
typename C,
typename AddItem>
81 typename C::mapped_type::pointer create_(
Tuples::TupleObj* parent, C& container,
const std::string&
name, AddItem addItem ) {
82 using element_t =
typename C::mapped_type::element_type;
83 using map_t =
struct tuple_type_<element_t> ;
84 auto item = container.emplace( name , std::unique_ptr<element_t>{
new element_t()} ) ;
86 { parent->
Error ( std::string{map_t::typ} +
" ('" + name +
"'): item is not inserted" ) ; }
89 { parent->
Error ( std::string{map_t::typ} +
" ('" + name +
"'): item is not added",
sc ) ; }
90 if ( !parent->
addItem(name,map_t::fmt) )
91 { parent->
Error ( std::string{map_t::typ} +
" ('" + name +
"'): item is not unique" ) ; }
92 return item.first->second.get() ;
113 long counts (
const std::string&
object )
const {
return m_map.at(
object); }
117 for (
auto& entry :
m_map )
119 if( entry.second != 0 ) std::cout
120 <<
"Tuples::TupleObj WARNING " <<
m_message
121 <<
"'" << entry.first <<
"' Counts = " << entry.second
127 std::map<std::string,long>
m_map;
136 static Counter s_InstanceCounter{
" Create/Destroy (mis)balance " };
149 : m_name ( std::move(name) )
155 Tuples::Local::s_InstanceCounter.increment ( m_name ) ;
163 Tuples::Local::s_InstanceCounter.decrement (
m_name ) ;
173 if( refCount() > 0 ) { --m_refCount; }
175 if( 0 == refCount() )
delete this;
183 return tuple()->
write() ;
192 std::vector<std::string> tokenize(
const std::string&
value ,
193 const std::string& separators =
" " )
195 std::vector<std::string> tokens;
196 auto it1 = value.begin() ;
197 auto it2 = value.begin() ;
198 while( value.end() != it1 && value.end() != it2 )
200 it2 = std::find_first_of( it1 ,
202 separators.begin () ,
203 separators.end () ) ;
205 tokens.emplace_back( value , it1 - value.begin() , it2 - it1 ) ;
219 auto tokens = tokenize( format ,
" ,;" );
222 va_start( valist , format ) ;
225 for(
auto token = tokens.cbegin() ;
226 tokens.cend() != token && status.
isSuccess() ; ++token )
228 double val = va_arg( valist ,
double );
229 status = column( *token , val );
231 { Error (
"fill(): Can not add column '" + *token +
"' " ) ; }
243 (
const std::string& name ,
248 {
return Error (
"column('" + name +
250 return column_<IOpaqueAddress*,&Tuples::TupleObj::addresses>(
name, address);
259 return column (
"Address" , address ) ;
266 return column_<float,&Tuples::TupleObj::floats>(
name,
value);
272 return column_<double,&Tuples::TupleObj::doubles>(
name,
value);
278 return column_<char,&Tuples::TupleObj::chars>(
name,
value);
286 return column_<char,&Tuples::TupleObj::chars>(
name,
value,minv,maxv);
290 unsigned char value )
292 return column_<unsigned char,&Tuples::TupleObj::uchars>(
name,
value);
296 unsigned char value ,
300 return column_<unsigned char,&Tuples::TupleObj::uchars>(
name,
value,minv,maxv);
306 return column_<short,&Tuples::TupleObj::shorts>(
name,
value);
314 return column_<short,&Tuples::TupleObj::shorts>(
name,
value,minv,maxv);
318 const unsigned short value )
320 return column_<unsigned short,&Tuples::TupleObj::ushorts>(
name,
value );
324 unsigned short value ,
325 unsigned short minv ,
326 unsigned short maxv )
328 return column_<unsigned short,&Tuples::TupleObj::ushorts>(
name,
value, minv, maxv );
334 return column_<int,&Tuples::TupleObj::ints>(
name,
value );
342 return column_<int,&Tuples::TupleObj::ints>(
name,
value,minv,maxv);
348 return column_<unsigned int,&Tuples::TupleObj::uints>(
name,
value);
356 return column_<unsigned int, &Tuples::TupleObj::uints>(
name,
value,minv,maxv);
362 Warning(
"'long' has different sizes on 32/64 bit systems. Casting '" +
364 return column( name, (
long long)value );
372 Warning(
"'long' has different sizes on 32/64 bit systems. Casting '" +
381 const unsigned long value )
383 Warning(
"'unsigned long' has different sizes on 32/64 bit systems. Casting '" +
385 return column( name, (
unsigned long long)value );
389 const unsigned long value ,
390 const unsigned long minv ,
391 const unsigned long maxv )
393 Warning(
"'unsigned long' has different sizes on 32/64 bit systems. Casting '" +
396 (
unsigned long long)value,
397 (
unsigned long long)minv,
398 (
unsigned long long)maxv );
402 const long long value )
404 return column_<long long,&Tuples::TupleObj::longlongs>(
name,
value);
412 return column_<long long,&Tuples::TupleObj::longlongs>(
name,
value,minv,maxv);
416 unsigned long long value )
418 return column_<unsigned long long,&Tuples::TupleObj::ulonglongs>(
name,
value);
422 unsigned long long value ,
423 unsigned long long minv ,
424 unsigned long long maxv )
426 return column_<unsigned long long,&Tuples::TupleObj::ulonglongs>(
name,
value,minv,maxv);
432 return column_<bool,&Tuples::TupleObj::bools>(
name,
value);
436 (
const std::string& name )
438 auto found = m_floats.find( name ) ;
439 if ( m_floats.end() != found ) {
return found->second.get() ; }
440 return create_(
this, m_floats,name,
441 [&](
const std::string&
n,
Float&
i)
442 {
return this->tuple()->
addItem(n,i); });
446 (
const std::string& name )
448 auto found = m_doubles.find( name ) ;
449 if ( m_doubles.end() != found ) {
return found->second.get() ; }
450 return create_(
this, m_doubles,name,
451 [&](
const std::string&
n,
Double&
i)
452 {
return this->tuple()->
addItem(n,i); });
456 (
const std::string& name )
458 auto found = m_bools.find( name ) ;
459 if( m_bools.end() != found ) {
return found->second.get() ; }
460 return create_(
this, m_bools, name,
461 [&](
const std::string&
n,
Bool&
i)
462 {
return this->tuple()->
addItem(n,i); });
466 (
const std::string& name )
468 auto found = m_chars.find( name ) ;
469 if( m_chars.end() != found ) {
return found->second.get() ; }
470 return create_(
this, m_chars, name,
471 [&](
const std::string&
n,
Char&
i)
472 {
return this->tuple()->
addItem(n,i); });
476 (
const std::string& name ,
char minv ,
char maxv )
478 auto found = m_chars.find( name ) ;
479 return ( found != m_chars.end() ) ? found->second.get()
480 : create_(
this, m_chars, name,
481 [&](
const std::string&
n,
Char&
i)
482 {
return this->tuple()->
addItem(n,i,minv,maxv); });
486 (
const std::string& name )
488 auto found = m_uchars.find( name ) ;
489 return ( found != m_uchars.end() ) ? found->second.get()
490 : create_(
this, m_uchars, name,
491 [&](
const std::string&
n,
UChar&
i)
492 {
return this->tuple()->
addItem(n,i); });
496 (
const std::string& name ,
unsigned char minv ,
unsigned char maxv )
498 auto found = m_uchars.find( name ) ;
499 return ( found != m_uchars.end() ) ? found->second.get()
500 : create_(
this, m_uchars, name,
501 [&](
const std::string&
n,
UChar&
i)
502 {
return this->tuple()->
addItem(n,i,minv,maxv); });
506 (
const std::string& name )
508 auto found = m_shorts.find( name ) ;
509 if( m_shorts.end() != found ) {
return found->second.get() ; }
510 return create_(
this, m_shorts, name,
511 [&](
const std::string&
n,
Short&
i)
512 {
return this->tuple()->
addItem(n,i); });
516 (
const std::string& name ,
520 auto found = m_shorts.find( name ) ;
521 if( m_shorts.end() != found ) {
return found->second.get(); }
522 return create_(
this, m_shorts, name,
523 [&](
const std::string&
n,
Short&
i)
524 {
return this->tuple()->
addItem(n,i,minv,maxv); });
528 (
const std::string& name )
530 auto found = m_ushorts.find( name ) ;
531 if( m_ushorts.end() != found ) {
return found->second.get() ; }
532 return create_(
this, m_ushorts, name,
533 [&](
const std::string&
n,
UShort&
i)
534 {
return this->tuple()->
addItem(n,i); });
538 (
const std::string& name ,
539 const unsigned short minv ,
540 const unsigned short maxv )
542 auto found = m_ushorts.find( name ) ;
543 if( m_ushorts.end() != found ) {
return found->second.get() ; }
544 return create_(
this, m_ushorts, name,
545 [&](
const std::string&
n,
UShort&
i)
546 {
return this->tuple()->
addItem(n,i,minv,maxv); });
550 (
const std::string& name )
552 auto found = m_ints.find( name ) ;
553 if( m_ints.end() != found ) {
return found->second.get() ; }
554 return create_(
this, m_ints, name,
555 [&](
const std::string&
n,
Int&
i)
556 {
return this->tuple()->
addItem(n,i); });
560 (
const std::string& name ,
564 auto found = m_ints.find( name ) ;
565 if( m_ints.end() != found ) {
return found->second.get() ; }
566 return create_(
this, m_ints, name,
567 [&](
const std::string&
n,
Int&
i)
568 {
return this->tuple()->
addItem(n,i,minv,maxv); });
572 (
const std::string& name )
574 auto found = m_uints.find( name ) ;
575 if( m_uints.end() != found ) {
return found->second.get() ; }
576 return create_(
this, m_uints, name,
577 [&](
const std::string&
n,
UInt&
i)
578 {
return this->tuple()->
addItem(n,i); });
582 (
const std::string& name ,
583 const unsigned int minv ,
584 const unsigned int maxv )
586 auto found = m_uints.find( name ) ;
587 if( m_uints.end() != found ) {
return found->second.get() ; }
588 return create_(
this, m_uints, name,
589 [&](
const std::string&
n,
UInt&
i)
590 {
return this->tuple()->
addItem(n,i,minv,maxv); });
594 (
const std::string& name )
596 auto found = m_longlongs.find( name ) ;
597 if( m_longlongs.end() != found ) {
return found->second.get() ; }
598 return create_(
this, m_longlongs, name,
600 {
return this->tuple()->
addItem(n,i); });
604 (
const std::string& name ,
605 const long long minv ,
606 const long long maxv )
608 auto found = m_longlongs.find( name ) ;
609 if( m_longlongs.end() != found ) {
return found->second.get() ; }
610 return create_(
this, m_longlongs, name,
612 {
return this->tuple()->
addItem(n,i,minv,maxv); });
616 (
const std::string& name )
618 auto found = m_ulonglongs.find( name ) ;
619 if( m_ulonglongs.end() != found ) {
return found->second.get() ; }
620 return create_(
this, m_ulonglongs, name,
622 {
return this->tuple()->
addItem(n,i); });
626 (
const std::string& name ,
627 const unsigned long long minv ,
628 const unsigned long long maxv )
630 auto found = m_ulonglongs.find( name ) ;
631 if( m_ulonglongs.end() != found ) {
return found->second.get() ; }
632 return create_(
this, m_ulonglongs, name,
634 {
return this->tuple()->
addItem(n,i,minv,maxv); });
638 (
const std::string& name )
640 auto found = m_addresses.find( name ) ;
641 if( m_addresses.end() != found ) {
return found->second.get() ; }
642 return create_(
this, m_addresses, name,
644 {
return this->tuple()->
addItem(n,i); });
650 (
const std::string& name ,
654 auto found = m_farrays.find( name ) ;
655 if( m_farrays.end() != found ) {
return found->second.get() ; }
656 return create_(
this, m_farrays, name,
657 [&](
const std::string&
n,
FArray&
i)
664 (
const std::string& name ,
668 auto found = m_arraysf.find( name ) ;
669 if( m_arraysf.end() != found ) {
return found->second.get() ; }
670 return create_(
this, m_arraysf, name,
671 [&](
const std::string&
n,
FArray&
i)
672 {
return this->tuple()->
addItem(n,rows,i); });
679 (
const std::string& name ,
684 auto found = m_fmatrices.find( name ) ;
685 if( m_fmatrices.end() != found ) {
return found->second.get() ; }
686 return create_(
this, m_fmatrices, name,
695 (
const std::string& name ,
700 auto found = m_matricesf.find( name ) ;
701 if( m_matricesf.end() != found ) {
return found->second.get() ; }
702 return create_(
this, m_matricesf, name,
704 {
return this->tuple()->
addItem(n,rows,cols,i); });
virtual StatusCode write()=0
Write record of the NTuple (Shortcut of writeRecord)
Address * addresses(const std::string &name)
get the column
void release()
release the reference to TupleObj if reference counter becomes zero, object will be automatically del...
long decrement(const std::string &object)
Float * floats(const std::string &name)
get the column
long counts(const std::string &object) const
Class acting as a smart pointer holding a N tuple _Item.
StatusCode fill(const char *format...)
Set the values for several columns simultaneously.
bool isSuccess() const
Test for a status code of SUCCESS.
StatusCode column(const std::string &name, float value)
Set the value for selected tuple column.
Bool * bools(const std::string &name)
get the column
TupleObj()=delete
delete the default/copy constructor and assignment
UShort * ushorts(const std::string &name)
get the column
std::map< std::string, long > m_map
UChar * uchars(const std::string &name)
get the column
bool isFailure() const
Test for a status code of FAILURE.
UInt * uints(const std::string &name)
get the column
StatusCode addIndexedItem(const std::string &name, Item< INDEX > &index, Array< TYPE > &array, const RANGE low, const RANGE high)
Add an indexed Array of data to a column wise N tuple with a range.
Counter(std::string msg=" Misbalance ")
ULongLong * ulonglongs(const std::string &name)
get the column
bool addItem(std::string name, std::string type)
add the item name into the list of known items
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
A simple wrapper class over standard Gaudi NTuple::Tuple facility.
This class is used for returning status codes from appropriate routines.
StatusCode write()
write a record to NTuple
Specialization acting as a smart pointer holding a N tuple _Item.
virtual StatusCode Error(const std::string &msg, const StatusCode sc=StatusCode::FAILURE) const =0
Abstract base class which allows the user to interact with the actual N tuple implementation.
virtual ~TupleObj()
destructor is protected
FArray * fArray(const std::string &name, Int *item)
get the column
Short * shorts(const std::string &name)
get the column
Char * chars(const std::string &name)
get the column
StatusCode addItem(const std::string &name, Item< TYPE > &itm)
Add a scalar data item a N tuple.
FMatrix * fMatrix(const std::string &name, Int *item, const MIndex &cols)
get the column
Double * doubles(const std::string &name)
get the column
Int * ints(const std::string &name)
get the column
Opaque address interface definition.
unsigned int CLID
Class ID definition.
Class acting as a smart pointer holding a N tuple _Item.
Class acting as a smart pointer holding a N tuple _Item.
Type
the list of available types for ntuples
long increment(const std::string &object)
LongLong * longlongs(const std::string &name)
get the column
General namespace for Tuple properties.