15#define PRINTRANGE(a, b, bn)                                                                                          \ 
   16   Printf(" base: %f %f %d, %s: %f %f %d", a->GetXmin(), a->GetXmax(), a->GetNbins(), bn, b->GetXmin(), b->GetXmax(), \ 
 
   21   if (
h->GetDimension() > 1) 
hasLimits &=  
h->GetYaxis()->GetXmin() < 
h->GetYaxis()->GetXmax();
 
   22   if (
h->GetDimension() > 2) 
hasLimits &=  
h->GetZaxis()->GetXmin() < 
h->GetZaxis()->GetXmax();
 
 
   62   Error(
"TH1Merger",
"Unknown type of Merge for histogram %s",
fH0->
GetName());
 
 
   84      Error(
"AutoP2BuildAxes", 
"undefined histogram: %p", 
h);
 
   90      Error(
"AutoP2BuildAxes", 
"not in autobin-power-of-2 mode!");
 
  101   if (
a0->GetFirst() == 
a0->GetLast()) {
 
  102      a0->Set(
a1->GetNbins(), 
a1->GetXmin(), 
a1->GetXmax());
 
  118      Error(
"AutoP2BuildAxes", 
"minimal bin width negative or null: %f", 
bwmin);
 
  124   if (re > std::numeric_limits<Double_t>::epsilon()) {
 
  126      Error(
"AutoP2BuildAxes", 
"bin widths not in integer ratio: %f", re);
 
  133   if (
a0->GetXmin() < 
a1->GetXmin()) {
 
  134      if (
a0->GetXmax() < 
a1->GetXmin()) {
 
  137            Error(
"AutoP2BuildAxes", 
"ranges are disconnected and under/overflows: cannot merge");
 
  144         if (
a0->GetXmax() >= 
a1->GetXmax()) {
 
  155      if (
a1->GetXmax() < 
a0->GetXmin()) {
 
  158            Error(
"AutoP2BuildAxes", 
"ranges are disconnected and under/overflows: cannot merge");
 
  165         if (
a1->GetXmax() >= 
a0->GetXmax()) {
 
  181      Error(
"MergeCompatibleHistograms", 
"range smaller than bin width: %f %f %f", 
range, 
bwmax, 
rt);
 
  184   if (re > std::numeric_limits<Double_t>::epsilon()) {
 
  198   if (!
a0->CanExtend())
 
 
  258            Error(
"Merge", 
"Cannot merge histogram - dimensions are different\n " 
  274         Error(
"Merge", 
"Cannot merge histogram - some are in autobin-power-of-2 mode, but not %s!", 
h->GetName());
 
  278         Error(
"Merge", 
"Cannot merge histogram - %s is in autobin-power-of-2 mode, but not the previous ones",
 
  303            if (
h->GetXaxis()->GetXbins()->GetSize() != 0)
 
  304               fNewXAxis.
Set(
h->GetXaxis()->GetNbins(), 
h->GetXaxis()->GetXbins()->GetArray());
 
  306               fNewXAxis.
Set(
h->GetXaxis()->GetNbins(), 
h->GetXaxis()->GetXmin(), 
h->GetXaxis()->GetXmax());
 
  308               if (
h->GetYaxis()->GetXbins()->GetSize() != 0)
 
  309                  fNewYAxis.
Set(
h->GetYaxis()->GetNbins(), 
h->GetYaxis()->GetXbins()->GetArray());
 
  311                  fNewYAxis.
Set(
h->GetYaxis()->GetNbins(), 
h->GetYaxis()->GetXmin(), 
h->GetYaxis()->GetXmax());
 
  314               if (
h->GetZaxis()->GetXbins()->GetSize() != 0)
 
  315                  fNewZAxis.
Set(
h->GetZaxis()->GetNbins(), 
h->GetZaxis()->GetXbins()->GetArray());
 
  317                  fNewZAxis.
Set(
h->GetZaxis()->GetNbins(), 
h->GetZaxis()->GetXmin(), 
h->GetZaxis()->GetXmax());
 
  329                  Error(
"Merge", 
"Cannot merge histograms - limits are inconsistent:\n " 
  330                        "first: %s (%d, %f, %f), second: %s (%d, %f, %f)", 
fH0->
GetName(),
 
  332                        h->GetName(),
h->GetXaxis()->GetNbins(), 
h->GetXaxis()->GetXmin(),
 
  333                        h->GetXaxis()->GetXmax());
 
  344               Error(
"Merge", 
"Cannot merge histograms - limits are inconsistent:\n " 
  345                     "first: %s (%d, %f, %f), second: %s (%d, %f, %f)", 
fH0->
GetName(),
 
  347                     h->GetName(), 
h->GetYaxis()->GetNbins(), 
h->GetYaxis()->GetXmin(),
 
  348                     h->GetYaxis()->GetXmax());
 
  355               Error(
"Merge", 
"Cannot merge histograms - limits are inconsistent:\n " 
  356                     "first: %s (%d, %f, %f), second: %s (%d, %f, %f)", 
fH0->
GetName(),
 
  358                     h->GetName(),
h->GetZaxis()->GetNbins(), 
h->GetZaxis()->GetXmin(),
 
  359                     h->GetZaxis()->GetXmax());
 
  383            Warning(
"Merge",
"Not all histograms have labels. I will ignore labels," 
  384            " falling back to bin numbering mode.");
 
  401               Warning(
"TH1Merger::ExamineHistogram",
"Histogram %s has inconsistent labels: %d is not consistent with  %d",
 
  404               Info(
"TH1Merger::ExamineHistogram",
"Histogram %s has consistent labels",
h->GetName() );
 
  420                   Info(
"TH1Merger::ExamineHistogram",
"Histogram %s to be merged is empty and we are merging with %s that has labels. Force the axis to be extended",
fH0->
GetName(),
h->GetName());
 
  425                  Info(
"TH1Merger::ExamineHistogram",
"Histogram %s to be merged has labels but corresponding axis cannot be extended - using bin numeric mode to merge. Call TH1::SetCanExtend(TH1::kAllAxes) if want to merge using label mode",
fH0->
GetName());
 
  437   }    
while ( ( 
h = 
dynamic_cast<TH1*
> ( next() ) ) != 
nullptr );
 
  439   if (!
h && (*next) ) {
 
  440      Error(
"Merge",
"Attempt to merge object of class: %s to a %s",
 
 
  562      Warning(
"TH1Merger::CopyMerge", 
"invalid inputs: %p, %p, %p, -> do nothing", 
hsrc, 
hdes, 
p1);
 
  569   if (
hdes->fDimension == 1) {
 
  571         hdes->Fill(
hsrc->fBuffer[2 * i + 2], 
hsrc->fBuffer[2 * i + 1]);
 
  573   if (
hdes->fDimension == 2) {
 
  574      auto h2 = 
dynamic_cast<TH2 *
>(
hdes);
 
  577         h2->Fill(
hsrc->fBuffer[3 * i + 2], 
hsrc->fBuffer[3 * i + 3], 
hsrc->fBuffer[3 * i + 1]);
 
  579   if (
hdes->fDimension == 3) {
 
  580      auto h3 = 
dynamic_cast<TH3 *
>(
hdes);
 
  583         h3->Fill(
hsrc->fBuffer[4 * i + 2], 
hsrc->fBuffer[4 * i + 3], 
hsrc->fBuffer[4 * i + 4],
 
  584                  hsrc->fBuffer[4 * i + 1]);
 
 
  591   TH1 *
href = 
nullptr, *hist = 
nullptr;
 
  613   while ((hist = (
TH1 *)next())) {
 
  616            Info(
"AutoP2BufferMerge", 
"merging buffer of %s into %s", hist->GetName(), 
href->GetName());
 
  623      href->BufferEmpty(1);
 
 
  646      while ((hist = (
TH1 *)next())) {
 
  654         Info(
"TH1Merger::AutoP2Merge", 
"all histograms look empty!");
 
  660      Error(
"TH1Merger::AutoP2Merge", 
"cannot create axes from %s", hist->
GetName());
 
  664   while ((
h = (
TH1 *)next())) {
 
  666         Error(
"TH1Merger::AutoP2Merge", 
"cannot merge histogram %s: not merge compatible", 
h->GetName());
 
  687   while ((hist = (
TH1 *)next())) {
 
  692         Info(
"TH1Merger::AutoP2Merge", 
"merging histogram %s into %s (entries: %f)", hist->
GetName(), 
fH0->
GetName(),
 
 
  733   while (
TH1* hist = (
TH1*)next()) {
 
  738            Info(
"TH1Merger::BufferMerge",
"Merging histogram %s into %s",hist->GetName(), 
fH0->
GetName() );
 
 
  766   while (
TH1* hist=(
TH1*)next()) {
 
  771         Info(
"TH1Merger::SameAxesMerge",
"Merging histogram %s into %s",hist->GetName(), 
fH0->
GetName() );
 
  774      if (hist->IsEmpty()) 
continue;
 
  777      hist->GetStats(
stats);
 
 
  809   while (
TH1* hist=(
TH1*)next()) {
 
  812         Info(
"TH1Merger::DifferentAxesMerge",
"Merging histogram %s into %s",hist->GetName(), 
fH0->
GetName() );
 
  815      if (hist->IsEmpty()) 
continue;
 
  818      hist->GetStats(
stats);
 
  835               Error(
"TH1Merger::DifferentAxesMerge", 
"Cannot merge histograms - the histograms %s can extend the X axis or have" 
  836                     " different limits and underflows/overflows are present in the histogram %s.",
fH0->
GetName(),hist->GetName());
 
  842               Error(
"TH1Merger::DifferentAxesMerge", 
"Cannot merge histograms - the histograms %s can extend the Y axis or have" 
  843                     " different limits and underflows/overflows are present in the histogram %s.",
fH0->
GetName(),hist->GetName());
 
  849               Error(
"TH1Merger::DifferentAxesMerge", 
"Cannot merge histograms - the histograms %s can extend the Z axis or have" 
  850                     " different limits and underflows/overflows are present in the histogram %s.",
fH0->
GetName(),hist->GetName());
 
  869            Fatal(
"TH1Merger::LabelMerge",
"Fatal error merging histogram %s - bin number is %d and array size is %d",
 
 
  889   if (!labels) 
return kFALSE;
 
  891   for (
const auto * obj: *labels) {
 
  896         std::unordered_set<std::string> s;
 
  897         for ( 
const auto * o: *
objList) {
 
  898            auto ret = s.insert(std::string(o->GetName() ));
 
 
  924      Warning(
"TH1Merger::CheckForDuplicateLabels",
"Histogram %s has duplicate labels in the x axis. " 
  925              "Bin contents will be merged in a single bin",hist->
GetName());
 
  929      Warning(
"TH1Merger::CheckForDuplicateLabels",
"Histogram %s has duplicate labels in the y axis. " 
  930              "Bin contents will be merged in a single bin",hist->
GetName());
 
  934      Warning(
"TH1Merger::CheckForDuplicateLabels",
"Histogram %s has duplicate labels in the z axis. " 
  935              "Bin contents will be merged in a single bin",hist->
GetName());
 
 
  958   while (
TH1* hist=(
TH1*)next()) {
 
  961         Info(
"TH1Merger::LabelMerge",
"Merging histogram %s into %s",hist->GetName(), 
fH0->
GetName() );
 
  964      if (hist->IsEmpty()) 
continue;
 
  967      hist->GetStats(
stats);
 
  972      auto labelsX = hist->GetXaxis()->GetLabels();
 
  973      auto labelsY = hist->GetYaxis()->GetLabels();
 
  974      auto labelsZ = hist->GetZaxis()->GetLabels();
 
  983            Info(
"TH1Merger::LabelMerge",
"Merging X axis in label mode");
 
  985            Info(
"TH1Merger::LabelMerge",
"Merging X axis in numeric mode");
 
  987            Info(
"TH1Merger::LabelMerge",
"Merging Y axis in label mode");
 
  988         else if (hist->GetDimension() > 1)
 
  989            Info(
"TH1Merger::LabelMerge",
"Merging Y axis in numeric mode");
 
  991            Info(
"TH1Merger::LabelMerge",
"Merging Z axis in label mode" );
 
  992         else if (hist->GetDimension() > 2)
 
  993            Info(
"TH1Merger::LabelMerge",
"Merging Z axis in numeric mode");
 
 1002         std::cout << 
"Bins of original histograms\n";
 
 1007                  std::cout << 
"bin" << 
ix << 
"," << 
iy << 
"," << 
iz 
 1022         const char * 
labelX = hist->GetXaxis()->GetBinLabel(
binx);
 
 1045                  Error(
"TH1Merger::LabelMerge", 
"Cannot merge histograms - the histograms %s can extend the X axis or have" 
 1046                     " different limits and underflows/overflows are present in the histogram %s.",
fH0->
GetName(),hist->GetName());
 
 1057                     Error(
"TH1Merger::LabelMerge", 
"Cannot merge histograms - the histograms %s can extend the Y axis or have" 
 1058                        " different limits and underflows/overflows are present in the histogram %s.",
fH0->
GetName(),hist->GetName());
 
 1070                     Error(
"TH1Merger::LabelMerge", 
"Cannot merge histograms - the histograms %s can extend the Z axis or have" 
 1071                            " different limits and underflows/overflows are present in the histogram %s.",
fH0->
GetName(),hist->GetName());
 
 1103            Info(
"TH1Merge::LabelMerge",
"Merge bin [%d,%d,%d] with label [%s,%s,%s] into bin [%d,%d,%d]",
 
 1109            Fatal(
"TH1Merger::LabelMerge",
"Fatal error merging histogram %s - bin number is %d and array size is %d",
 
 
 1128   return cu == 0 && 
e1sq == 0;
 
 
 1153template<
class TProfileType>
 
 1158   p->fSumw2.fArray[
pbin] += 
h->fSumw2.fArray[
hbin];
 
 1159   p->fBinEntries.fArray[
pbin] += 
h->fBinEntries.fArray[
hbin];
 
 1160   if (
p->fBinSumw2.fN) {
 
 1161      if (
h->fBinSumw2.fN)
 
 1162         p->fBinSumw2.fArray[
pbin] += 
h->fBinSumw2.fArray[
hbin];
 
 1164         p->fBinSumw2.fArray[
pbin] += 
h->fArray[
hbin];
 
 1167      Info(
"TH1Merge::MergeProfileBin", 
"Merge bin %d of profile %s with content %f in bin %d - result is %f", 
hbin,
 
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
 
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
 
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
 
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
 
winID h TVirtualViewer3D TVirtualGLPainter p
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
 
#define PRINTRANGE(a, b, bn)
 
void Set(Int_t n) override
Set size of this array to n doubles.
 
Class to manage histogram axis.
 
const TArrayD * GetXbins() const
 
virtual Int_t FindBin(Double_t x)
Find bin number corresponding to abscissa x.
 
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
 
virtual void SetRange(Int_t first=0, Int_t last=0)
Set the viewing range for the axis using bin numbers.
 
THashList * GetLabels() const
 
void * New(ENewType defConstructor=kClassNew, Bool_t quiet=kFALSE) const
Return a pointer to a newly allocated object of this class.
 
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
 
Bool_t AutoP2BufferMerge()
 
static Bool_t AxesHaveLimits(const TH1 *h)
 
static Int_t CheckForDuplicateLabels(const TH1 *hist)
Check if histogram has duplicate labels Return an integer with bit set correponding on the axis that ...
 
Bool_t AutoP2BuildAxes(TH1 *)
Determine final boundaries and number of bins for histograms created in power-of-2 autobin mode.
 
Bool_t DifferentAxesMerge()
Merged histogram when axis can be different.
 
TList fInputList
copy of fH0 - managed by this class
 
static Int_t FindFixBinNumber(Int_t ibin, const TAxis &inAxis, const TAxis &outAxis)
 
void CopyBuffer(TH1 *hsrc, TH1 *hdes)
 
Bool_t LabelMerge(bool newLimits=false)
Merge histograms with labels and if newLimits is set support the case that one of the axis can set ne...
 
static Bool_t IsBinEmpty(const TH1 *hist, Int_t bin)
helper function for merging
 
EMergerType ExamineHistograms()
Examine the list of histograms to find out which type of Merge we need to do Pass the input list cont...
 
static Bool_t HasDuplicateLabels(const THashList *labels)
Find a duplicate labels in an axis label list.
 
void MergeBin(const TH1 *hist, Int_t inbin, Int_t outbin)
 
Bool_t operator()()
Function performing the actual merge.
 
void DefineNewAxes()
Function to define new histogram axis when merging It is call only in case of merging with different ...
 
TH1 * fHClone
histogram on which the list is merged
 
void MergeProfileBin(const TProfileType *p, Int_t ibin, Int_t outbin)
 
TH1 is the base class of all histogram classes in ROOT.
 
virtual void SetDirectory(TDirectory *dir)
By default, when a histogram is created, it is added to the list of histogram objects in the current ...
 
Double_t * fBuffer
[fBufferSize] entry buffer
 
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
 
@ kNoAxis
NOTE: Must always be 0 !!!
 
Int_t fNcells
Number of bins(1D), cells (2D) +U/Overflows.
 
virtual void GetStats(Double_t *stats) const
fill the array stats from the contents of this histogram The array stats must be correctly dimensione...
 
void Copy(TObject &hnew) const override
Copy this histogram structure to newth1.
 
virtual void AddBinContent(Int_t bin)
Increment bin content by 1.
 
virtual Int_t GetDimension() const
 
@ kAutoBinPTwo
different than 1.
 
virtual void Reset(Option_t *option="")
Reset this histogram: contents, errors, etc.
 
static Bool_t RecomputeAxisLimits(TAxis &destAxis, const TAxis &anAxis)
Finds new limits for the axis for the Merge function.
 
virtual void PutStats(Double_t *stats)
Replace current statistics with the values in array stats.
 
virtual Int_t GetBin(Int_t binx, Int_t biny=0, Int_t binz=0) const
Return Global bin number corresponding to binx,y,z.
 
static Bool_t SameLimitsAndNBins(const TAxis &axis1, const TAxis &axis2)
Same limits and bins.
 
virtual Double_t RetrieveBinContent(Int_t bin) const
Raw retrieval of bin content on internal data structure see convention for numbering bins in TH1::Get...
 
Int_t fDimension
! Histogram dimension (1, 2 or 3 dim)
 
virtual void SetBinsLength(Int_t=-1)
 
virtual Double_t GetBinErrorSqUnchecked(Int_t bin) const
 
virtual Double_t GetEntries() const
Return the current number of entries.
 
virtual UInt_t SetCanExtend(UInt_t extendBitMask)
Make the histogram axes extendable / not extendable according to the bit mask returns the previous bi...
 
Bool_t IsEmpty() const
Check if a histogram is empty (this is a protected method used mainly by TH1Merger )
 
@ kNstat
Size of statistics data (up to TProfile3D)
 
TAxis fZaxis
Z axis descriptor.
 
TClass * IsA() const override
 
TAxis fXaxis
X axis descriptor.
 
TArrayD fSumw2
Array of sum of squares of weights.
 
virtual Int_t GetSumw2N() const
 
virtual Int_t FindBin(Double_t x, Double_t y=0, Double_t z=0)
Return Global bin number corresponding to x,y,z.
 
TObject * Clone(const char *newname="") const override
Make a complete copy of the underlying object.
 
TAxis fYaxis
Y axis descriptor.
 
virtual void SetBins(Int_t nx, Double_t xmin, Double_t xmax)
Redefine x axis parameters.
 
virtual void Sumw2(Bool_t flag=kTRUE)
Create structure to store sum of squares of weights.
 
virtual void SetEntries(Double_t n)
 
virtual Int_t BufferEmpty(Int_t action=0)
Fill histogram with all entries in the buffer.
 
Service class for 2-D histogram classes.
 
The 3-D histogram classes derived from the 1-D histogram classes.
 
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
 
const TList * GetListForObject(const char *name) const
Return the THashTable's list (bucket) in which obj can be found based on its hash; see THashTable::Ge...
 
void Add(TObject *obj) override
 
TObject * Remove(TObject *obj) override
Remove object from the list.
 
void AddFirst(TObject *obj) override
Add object at the beginning of the list.
 
const char * GetName() const override
Returns name of object.
 
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
 
virtual const char * ClassName() const
Returns name of class to which the object belongs.
 
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
 
Profile2D histograms are used to display the mean value of Z and its error for each cell in X,...
 
Profile3D histograms are used to display the mean value of T and its RMS for each cell in X,...
 
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.