11 #ifndef GAUDIALG_GAUDIHISTOS_ICPP 12 #define GAUDIALG_GAUDIHISTOS_ICPP 1 59 constexpr
struct ordered_t {
66 template <
typename Map>
67 typename Map::mapped_type lookup_(
const Map&
map,
const typename Map::key_type& ID ) {
68 auto found =
map.find( ID );
69 return found !=
std::end(
map ) ? found->second :
nullptr;
84 template <
class PBASE>
97 if ( !produceHistos() ) {
98 this->debug() <<
"Histogram production is switched OFF" <<
endmsg;
103 if ( !this->histoSvc() ) {
return this->Error(
"initialize():: IHistogramSvc* is invalid" ); }
106 if ( useNumericAutoIDs() ) {
108 "Using numerical automatic IDs. These are not guaranteed to be totally deterministic. Use with care...",
123 template <
class PBASE>
132 if ( produceHistos() ) {
135 if ( ( !noHistos() ) && histoCountersPrint() ) {
136 const unsigned int n1D = histo1DMapID().size();
137 const unsigned int n2D = histo2DMapID().size();
138 const unsigned int n3D = histo3DMapID().size();
139 const unsigned int n1DP = profile1DMapID().size();
140 const unsigned int n2DP = profile2DMapID().size();
141 const unsigned int total = n1D + n2D + n3D + n1DP + n2DP;
143 this->always() <<
"Booked " << total <<
" Histogram(s) : ";
144 if ( n1D > 0 ) this->always() <<
"1D=" << n1D <<
" ";
145 if ( n2D > 0 ) this->always() <<
"2D=" << n2D <<
" ";
146 if ( n3D > 0 ) this->always() <<
"3D=" << n3D <<
" ";
147 if ( n1DP > 0 ) this->always() <<
"1DProf=" << n1DP <<
" ";
148 if ( n2DP > 0 ) this->always() <<
"2DProf=" << n2DP <<
" ";
154 if ( histosPrint() ) { printHistos(); }
158 m_histo1DMapTitle.clear();
159 m_histo2DMapTitle.clear();
160 m_histo3DMapTitle.clear();
161 m_histo1DMapID.clear();
162 m_histo2DMapID.clear();
163 m_histo3DMapID.clear();
164 m_profile1DMapTitle.clear();
165 m_profile2DMapTitle.clear();
166 m_profile1DMapID.clear();
167 m_profile2DMapID.clear();
170 return PBASE::finalize();
175 template <
class PBASE>
180 if ( this->msgLevel(
MSG::DEBUG ) ) { this->msgStream(
level ) <<
"No histograms are booked" <<
endmsg; }
188 if ( !histo1DMapID().empty() ) {
189 msg <<
"1D histograms in directory " 190 <<
"\"" << histoPath() <<
"\" : " << histo1DMapID().size();
195 for (
const auto& entry : ordered( histo1DMapID() ) ) {
196 const auto* aida = entry.second;
198 this->error() <<
"IHistogram1D points to NULL" <<
endmsg;
207 if ( !histo2DMapID().empty() ) {
208 msg <<
"2D histograms in directory " 209 <<
"\"" << histoPath() <<
"\" : " << histo2DMapID().size();
211 for (
const auto& entry : ordered( histo2DMapID() ) ) {
212 const auto* aida = entry.second;
214 this->error() <<
"IHistogram2D points to NULL" <<
endmsg;
222 if ( !histo3DMapID().empty() ) {
223 msg <<
"3D histograms in directory " 224 <<
"\"" << histoPath() <<
"\" : " << histo3DMapID().size();
225 for (
const auto& entry : ordered( histo3DMapID() ) ) {
226 const auto* aida = entry.second;
228 this->error() <<
"IHistogram3D points to NULL" <<
endmsg;
236 if ( !profile1DMapID().empty() ) {
237 msg <<
"1D profile histograms in directory " 238 <<
"\"" << histoPath() <<
"\" : " << profile1DMapID().size();
243 for (
const auto& entry : ordered( profile1DMapID() ) ) {
244 const auto* aida = entry.second;
246 this->error() <<
"IProfile1D points to NULL" <<
endmsg;
254 if ( !profile2DMapID().empty() ) {
255 msg <<
"2D profile histograms in directory " 256 <<
"\"" << histoPath() <<
"\" : " << profile2DMapID().size();
257 for (
const auto& entry : ordered( profile2DMapID() ) ) {
258 const auto* aida = entry.second;
260 this->error() <<
"IProfile2D points to NULL" <<
endmsg;
268 return this->totalNumberOfHistos();
273 template <
class PBASE>
275 return ( histo1DMapTitle().empty() && histo2DMapTitle().empty() && histo3DMapTitle().empty() &&
276 profile1DMapTitle().empty() && profile2DMapTitle().empty() && histo1DMapID().empty() &&
277 histo2DMapID().empty() && histo3DMapID().empty() && profile1DMapID().empty() && profile2DMapID().empty() );
282 template <
class PBASE>
284 if ( hist && m_declareMoniHists ) {
286 this->debug() <<
"Monitoring histogram '" << ID.
idAsString() <<
"' desc = '" 295 template <
class PBASE>
297 return lookup_( histo1DMapID(), ID );
302 template <
class PBASE>
304 return lookup_( histo2DMapID(), ID );
309 template <
class PBASE>
311 return lookup_( histo3DMapID(), ID );
316 template <
class PBASE>
318 return lookup_( profile1DMapID(), ID );
323 template <
class PBASE>
325 return lookup_( profile2DMapID(), ID );
330 template <
class PBASE>
332 return histo1DMapID().size() + histo2DMapID().size() + histo3DMapID().size() + profile1DMapID().size() +
333 profile2DMapID().size();
338 template <
class PBASE>
340 if ( useNumericAutoIDs() || title.
empty() ) {
341 if ( !useNumericAutoIDs() ) {
343 "Cannot generate automatic literal ID from an empty title ! Using numeric ID instead for histogram ID",
348 ID =
HistoID( totalNumberOfHistos() + 1 + histoOffSet() );
353 ID =
HistoID( this->convertTitleToID( title ) );
361 template <
class PBASE>
364 for (
const auto& i : m_idReplaceInfo ) { stringSearchReplace( title, i.first, i.second ); }
369 template <
class PBASE>
372 return splitHistoDir() ? dirHbookName(
path ) :
path;
393 #endif // GAUDIALG_GAUDIHISTOS_ICPP
Definition of the MsgStream class used to transmit messages.
GAUDI_API std::string htitle(const AIDA::IBaseHistogram *histo, const std::string &title="")
get the title
std::string convertTitleToID(std::string title) const
Create an ID string from a title string.
GaudiAlg::ID HistoID
The actual type for histogram identifier.
GAUDI_API std::string format(const AIDA::IHistogram1D *histo, const std::string &fmt)
Make the string representation of the histogram according to the specified format.
constexpr static const auto SUCCESS
Collection of useful utilities for manipulations with AIDA hisgograms.
few useful function to construct names of Hbook histograms and directories functions are imported fro...
void newHistoID(const std::string &title, HistoID &ID) const
Create a new histogram ID using the given title.
std::string histoPath() const
get the constructed histogram path
GAUDI_API LiteralID idAsString() const
Return ID as string, for both numeric and literal IDs.
struct GAUDI_API map
Parametrisation class for map-like implementation.
AIDA::IHistogram1D * histo1D(const std::string &title) const
access the EXISTING 1D histogram by title return the pointer to existing 1D histogram or NULL
bool noHistos() const
Check if all histogram maps are empty.
void monitorHisto(const AIDA::IBaseHistogram *hist, const HistoID &ID) const
Declare a histogram to the monitor service.
This class is used for returning status codes from appropriate routines.
AIDA::IProfile2D * profile2D(const double valueX, const double valueY, const double valueZ, const std::string &title, const double lowX, const double highX, const double lowY, const double highY, const unsigned long binsX=50, const unsigned long binsY=50, const double weight=1.0) const
fill the 2D profile histogram (book on demand)
T find_first_of(T... args)
const std::string & header() const
the table header
Simple class for the customizeble printout of the histogram tables.
collection of useful utilities to print certain objects (currently used for implementation in class G...
static std::string toString(const AIDA::IHistogram3D *aida, const GaudiAlg::HistoID &ID)
AIDA::IProfile1D * profile1D(const double valueX, const double valueY, const std::string &title, const double lowX, const double highX, const unsigned long binsX=100, const std::string &opt="", const double lowY=-std::numeric_limits< double >::max(), const double highY=std::numeric_limits< double >::max(), const double weight=1.0) const
fill the 1D profile histogram (book on demand)
AIDA::IHistogram2D * histo2D(const std::string &title) const
access the EXISTING 2D histogram by title return the pointer to existing 2D histogram or NULL
std::string toString(const AIDA::IHistogram1D *histo) const
make the string representation according to the default format
AIDA::IHistogram3D * histo3D(const std::string &title) const
access the EXISTING 3D histogram by title return the pointer to existing 3D histogram or NULL
int printHistos(const MSG::Level level=MSG::ALWAYS) const
perform the actual printout of histograms
static std::string toString(const AIDA::IHistogram2D *aida, const GaudiAlg::HistoID &ID)
bool numeric() const noexcept
Is this ID numeric.
Templated base class providing common histogramming methods for GaudiAlgorithm and GaudiTool like cla...
unsigned int totalNumberOfHistos() const
Returns the total number of histograms (of all types) currently booked.
KeyedObjectManager< map > Map
Forward declaration of specialized std::map-like object manager.
static std::string toString(const AIDA::IProfile2D *aida, const GaudiAlg::HistoID &ID)
ID class for Histogram and Ntuples.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.