@@ -744,6 +744,54 @@ Bool_t TH1::AddDirectoryStatus()
744744   return  fgAddDirectory;
745745}
746746
747+ // //////////////////////////////////////////////////////////////////////////////
748+ // / Autozoom histogram in all their axes
749+ // / \see TAxis::AutoZoom
750+ 
751+ void  TH1::AutoZoom ()
752+ {
753+    const  auto  ndims = GetDimension ();
754+    if  (ndims < 1  || ndims > 3 )
755+       return ;
756+    //  First apply autozoom in pure coordinate axis
757+    if  (ndims >= 1 )
758+       GetXaxis ()->AutoZoom ();
759+    if  (ndims >= 2 )
760+       GetYaxis ()->AutoZoom ();
761+    if  (ndims >= 3 )
762+       GetZaxis ()->AutoZoom ();
763+    //  Now apply autozoom in the bin content axis if it's a TH1 or TH2
764+    if  (ndims == 1 )
765+       GetYaxis ()->AutoZoom ();
766+    else  if  (ndims == 2 )
767+       GetZaxis ()->AutoZoom ();
768+    //  For 3D, there is no UnZoom or AutoZoom implemented for TPaletteAxis
769+ }
770+ 
771+ // //////////////////////////////////////////////////////////////////////////////
772+ // / Unzoom histogram in all their axes
773+ // / \see TAxis::UnZoom
774+ 
775+ void  TH1::UnZoom ()
776+ {
777+    const  auto  ndims = GetDimension ();
778+    if  (ndims < 1  || ndims > 3 )
779+       return ;
780+    //  First apply Unzoom in pure coordinate axis
781+    if  (ndims >= 1 )
782+       GetXaxis ()->UnZoom ();
783+    if  (ndims >= 2 )
784+       GetYaxis ()->UnZoom ();
785+    if  (ndims >= 3 )
786+       GetZaxis ()->UnZoom ();
787+    //  Now apply unzoom in the bin content axis if it's a TH1 or TH2
788+    if  (ndims == 1 )
789+       GetYaxis ()->UnZoom ();
790+    else  if  (ndims == 2 )
791+       GetZaxis ()->UnZoom ();
792+    //  For 3D, there is no UnZoom or AutoZoom implemented for TPaletteAxis
793+ }
794+ 
747795// //////////////////////////////////////////////////////////////////////////////
748796// / Browse the Histogram object.
749797
@@ -7904,19 +7952,143 @@ void TH1::ResetStats()
79047952   if  (fSumw2 .fN  > 0  && fTsumw  > 0  && stats[1 ] > 0  ) fEntries  = stats[0 ]*stats[0 ]/ stats[1 ];
79057953}
79067954
7955+ void  TH1::GetRangeOfFilledWeights (const  Int_t dim, Int_t& first, Int_t& last, const  bool  includeUnderOverflow) const 
7956+ {
7957+    if  (fBuffer ) const_cast <TH1*>(this )->BufferEmpty ();
7958+ 
7959+    const  Int_t start = (includeUnderOverflow ? 0  : 1 );
7960+    const  Int_t lastX = fXaxis .GetNbins () + (includeUnderOverflow ? 1  : 0 );
7961+    const  Int_t lastY = fYaxis .GetNbins () + (includeUnderOverflow ? 1  : 0 );
7962+    const  Int_t lastZ = fZaxis .GetNbins () + (includeUnderOverflow ? 1  : 0 );
7963+ 
7964+    const  auto  ndims = GetDimension ();
7965+    R__ASSERT (dim == 0  || dim == 1  || dim == 2 );
7966+    if  (ndims == 1 ) {
7967+       R__ASSERT (dim == 0 );
7968+    } else  if  (ndims == 2 ) {
7969+       R__ASSERT (dim == 0  || dim == 1 );
7970+    } else  if  (ndims == 3 ) {
7971+       R__ASSERT (dim == 0  || dim == 1  || dim == 2 );
7972+    }
7973+ 
7974+    if  (dim == 0 ) {
7975+       first = start;
7976+       for (Int_t binx = start; binx <= lastX; binx++) {
7977+          for (auto  biny = start; biny <= lastY; biny++) {
7978+             for (auto  binz = start; binz <= lastZ; binz++) {
7979+                auto  bin = GetBin (binx, biny, binz);
7980+                if  (RetrieveBinContent (bin) != 0  || GetBinError (bin) != 0 )
7981+                {
7982+                   first = binx;
7983+                   //  Break:
7984+                   binx = lastX;
7985+                   biny = lastY;
7986+                   binz = lastZ;
7987+                }
7988+             }
7989+          }
7990+       }
7991+       last = lastX;
7992+       for (Int_t binx = lastX; binx >= start; binx--) {
7993+           for (auto  biny = start; biny <= lastY; biny++) {
7994+              for (auto  binz = start; binz <= lastZ; binz++) {
7995+                 auto  bin = GetBin (binx, biny, binz);
7996+                 if  (RetrieveBinContent (bin) != 0  || GetBinError (bin) != 0 )
7997+                 {
7998+                    last = binx;
7999+                    //  Break:
8000+                    binx = start;
8001+                    biny = lastY;
8002+                    binz = lastZ;
8003+                 }
8004+              }
8005+           }
8006+       }
8007+       return ;
8008+    } else  if  (dim == 1 ) {
8009+       first = start;
8010+       for (auto  biny = start; biny <= lastY; biny++) {
8011+          for (Int_t binx = start; binx <= lastX; binx++) {
8012+             for (auto  binz = start; binz <= lastZ; binz++) {
8013+                auto  bin = GetBin (binx, biny, binz);
8014+                if  (RetrieveBinContent (bin) != 0  || GetBinError (bin) != 0 )
8015+                {
8016+                   first = biny;
8017+                   //  Break:
8018+                   binx = lastX;
8019+                   biny = lastY;
8020+                   binz = lastZ;
8021+                }
8022+             }
8023+          }
8024+       }
8025+       last = lastY;
8026+       for (Int_t biny = lastY; biny >= start; biny--) {
8027+           for (auto  binx = start; binx <= lastX; binx++) {
8028+              for (auto  binz = start; binz <= lastZ; binz++) {
8029+                 auto  bin = GetBin (binx, biny, binz);
8030+                 if  (RetrieveBinContent (bin) != 0  || GetBinError (bin) != 0 )
8031+                 {
8032+                    last = biny;
8033+                    //  Break:
8034+                    binx = lastX;
8035+                    biny = start;
8036+                    binz = lastZ;
8037+                 }
8038+              }
8039+           }
8040+       }
8041+       return ;
8042+    } else  if  (dim == 2 ) {
8043+       first = start;
8044+       for (auto  binz = start; binz <= lastZ; binz++) {
8045+          for (Int_t binx = start; binx <= lastX; binx++) {
8046+             for (auto  biny = start; biny <= lastY; biny++) {
8047+                auto  bin = GetBin (binx, biny, binz);
8048+                if  (RetrieveBinContent (bin) != 0  || GetBinError (bin) != 0 )
8049+                {
8050+                   first = biny;
8051+                   //  Break:
8052+                   binx = lastX;
8053+                   biny = lastY;
8054+                   binz = lastZ;
8055+                }
8056+             }
8057+          }
8058+       }
8059+       last = lastZ;
8060+       for (Int_t binz = lastZ; binz >= start; binz--) {
8061+           for (auto  binx = start; binx <= lastX; binx++) {
8062+              for (auto  biny = start; biny <= lastY; biny++) {
8063+                 auto  bin = GetBin (binx, biny, binz);
8064+                 if  (RetrieveBinContent (bin) != 0  || GetBinError (bin) != 0 )
8065+                 {
8066+                    last = binz;
8067+                    //  Break:
8068+                    binx = lastX;
8069+                    biny = lastY;
8070+                    binz = start;
8071+                 }
8072+              }
8073+           }
8074+       }
8075+       return ;
8076+    }
8077+ }
8078+ 
79078079// //////////////////////////////////////////////////////////////////////////////
79088080// / Return the sum of all weights
79098081// / \param includeOverflow true to include under/overflows bins, false to exclude those.
79108082// / \note Different from TH1::GetSumOfWeights, that always excludes those
79118083
7912- Double_t TH1::GetSumOfAllWeights (const  bool  includeOverflow ) const 
8084+ Double_t TH1::GetSumOfAllWeights (const  bool  includeUnderOverflow ) const 
79138085{
79148086   if  (fBuffer ) const_cast <TH1*>(this )->BufferEmpty ();
79158087
7916-    const  Int_t start = (includeOverflow  ? 0  : 1 );
7917-    const  Int_t lastX = fXaxis .GetNbins () + (includeOverflow  ? 1  : 0 );
7918-    const  Int_t lastY = fYaxis .GetNbins () + (includeOverflow  ? 1  : 0 );
7919-    const  Int_t lastZ = fZaxis .GetNbins () + (includeOverflow  ? 1  : 0 );
8088+    const  Int_t start = (includeUnderOverflow  ? 0  : 1 );
8089+    const  Int_t lastX = fXaxis .GetNbins () + (includeUnderOverflow  ? 1  : 0 );
8090+    const  Int_t lastY = fYaxis .GetNbins () + (includeUnderOverflow  ? 1  : 0 );
8091+    const  Int_t lastZ = fZaxis .GetNbins () + (includeUnderOverflow  ? 1  : 0 );
79208092   Double_t sum =0 ;
79218093   for (auto  binz = start; binz <= lastZ; binz++) {
79228094      for (auto  biny = start; biny <= lastY; biny++) {
0 commit comments