ROOT logo
// @(#)root/hist:$Id: TProfile2D.cxx 31737 2009-12-09 16:36:38Z moneta $
// Author: Rene Brun   16/04/2000

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TProfile2D.h"
#include "TMath.h"
#include "THLimitsFinder.h"
#include "Riostream.h"
#include "TVirtualPad.h"
#include "TError.h"
#include "TClass.h"

#include "TProfileHelper.h"

const Int_t kNstat = 11;
Bool_t TProfile2D::fgApproximate = kFALSE;

ClassImp(TProfile2D)

//______________________________________________________________________________
//
//  Profile2D histograms are used to display the mean
//  value of Z and its RMS for each cell in X,Y.
//  Profile2D histograms are in many cases an
//  elegant replacement of three-dimensional histograms : the inter-relation of three
//  measured quantities X, Y and Z can always be visualized by a three-dimensional
//  histogram or scatter-plot; its representation on the line-printer is not particularly
//  satisfactory, except for sparse data. If Z is an unknown (but single-valued)
//  approximate function of X,Y this function is displayed by a profile2D histogram with
//  much better precision than by a scatter-plot.
//
//  The following formulae show the cumulated contents (capital letters) and the values
//  displayed by the printing or plotting routines (small letters) of the elements for cell I, J.
//
//                                                        2
//      H(I,J)  =  sum Z                  E(I,J)  =  sum Z
//      l(I,J)  =  sum l                  L(I,J)  =  sum l
//      h(I,J)  =  H(I,J)/L(I,J)          s(I,J)  =  sqrt(E(I,J)/L(I,J)- h(I,J)**2)
//      e(I,J)  =  s(I,J)/sqrt(L(I,J))
//
//  In the special case where s(I,J) is zero (eg, case of 1 entry only in one cell)
//  e(I,J) is computed from the average of the s(I,J) for all cells.
//  This simple/crude approximation was suggested in order to keep the cell
//  during a fit operation.
//
//           Example of a profile2D histogram
//{
//  TCanvas *c1 = new TCanvas("c1","Profile histogram example",200,10,700,500);
//  hprof2d  = new TProfile2D("hprof2d","Profile of pz versus px and py",40,-4,4,40,-4,4,0,20);
//  Float_t px, py, pz;
//  for ( Int_t i=0; i<25000; i++) {
//     gRandom->Rannor(px,py);
//     pz = px*px + py*py;
//     hprof2d->Fill(px,py,pz,1);
//  }
//  hprof2d->Draw();
//}
//

//______________________________________________________________________________
TProfile2D::TProfile2D() : TH2D()
{
//*-*-*-*-*-*Default constructor for Profile2D histograms*-*-*-*-*-*-*-*-*
//*-*        ============================================
   fTsumwz = fTsumwz2 = 0;
   fScaling = kFALSE;
   BuildOptions(0,0,"");
}

//______________________________________________________________________________
TProfile2D::~TProfile2D()
{
//*-*-*-*-*-*Default destructor for Profile2D histograms*-*-*-*-*-*-*-*-*
//*-*        ===========================================

}

//______________________________________________________________________________
TProfile2D::TProfile2D(const char *name,const char *title,Int_t nx,Double_t xlow,Double_t xup,Int_t ny,Double_t ylow,Double_t yup,Option_t *option)
    : TH2D(name,title,nx,xlow,xup,ny,ylow,yup)
{
//*-*-*-*-*-*Normal Constructor for Profile histograms*-*-*-*-*-*-*-*-*-*
//*-*        ==========================================
//
//  The first eight parameters are similar to TH2D::TH2D.
//  All values of z are accepted at filling time.
//  To fill a profile2D histogram, one must use TProfile2D::Fill function.
//
//  Note that when filling the profile histogram the function Fill
//  checks if the variable z is betyween fZmin and fZmax.
//  If a minimum or maximum value is set for the Z scale before filling,
//  then all values below zmin or above zmax will be discarded.
//  Setting the minimum or maximum value for the Z scale before filling
//  has the same effect as calling the special TProfile2D constructor below
//  where zmin and zmax are specified.
//
//  H(I,J) is printed as the cell contents. The errors computed are s(I,J) if CHOPT='S'
//  (spread option), or e(I,J) if CHOPT=' ' (error on mean).
//
//        See TProfile2D::BuildOptions for explanation of parameters
//
//   see other constructors below with all possible combinations of
//   fix and variable bin size like in TH2D.

   BuildOptions(0,0,option);
   if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
}

//______________________________________________________________________________
TProfile2D::TProfile2D(const char *name,const char *title,Int_t nx,const Double_t *xbins,Int_t ny,Double_t ylow,Double_t yup,Option_t *option)
    : TH2D(name,title,nx,xbins,ny,ylow,yup)
{
//  Create a 2-D Profile with variable bins in X and fix bins in Y

   BuildOptions(0,0,option);
}

//______________________________________________________________________________
TProfile2D::TProfile2D(const char *name,const char *title,Int_t nx,Double_t xlow,Double_t xup,Int_t ny,const Double_t *ybins,Option_t *option)
    : TH2D(name,title,nx,xlow,xup,ny,ybins)
{
//  Create a 2-D Profile with fix bins in X and variable bins in Y

   BuildOptions(0,0,option);
}

//______________________________________________________________________________
TProfile2D::TProfile2D(const char *name,const char *title,Int_t nx,const Double_t *xbins,Int_t ny,const Double_t *ybins,Option_t *option)
    : TH2D(name,title,nx,xbins,ny,ybins)
{
//  Create a 2-D Profile with variable bins in X and variable bins in Y

   BuildOptions(0,0,option);
}


//______________________________________________________________________________
TProfile2D::TProfile2D(const char *name,const char *title,Int_t nx,Double_t xlow,Double_t xup,Int_t ny, Double_t ylow,Double_t yup,Double_t zlow,Double_t zup,Option_t *option)
    : TH2D(name,title,nx,xlow,xup,ny,ylow,yup)
{
//*-*-*-*-*-*Constructor for Profile2D histograms with range in z*-*-*-*-*-*
//*-*        ====================================================
//  The first eight parameters are similar to TH2D::TH2D.
//  Only the values of Z between ZMIN and ZMAX will be considered at filling time.
//  zmin and zmax will also be the maximum and minimum values
//  on the z scale when drawing the profile2D.
//
//        See TProfile2D::BuildOptions for more explanations on errors
//

   BuildOptions(zlow,zup,option);
   if (xlow >= xup || ylow >= yup) SetBuffer(fgBufferSize);
}


//______________________________________________________________________________
void TProfile2D::BuildOptions(Double_t zmin, Double_t zmax, Option_t *option)
{
//*-*-*-*-*-*-*Set Profile2D histogram structure and options*-*-*-*-*-*-*-*-*
//*-*          =============================================
//
//    If a cell has N data points all with the same value Z (especially
//    possible when dealing with integers), the spread in Z for that cell
//    is zero, and the uncertainty assigned is also zero, and the cell is
//    ignored in making subsequent fits. If SQRT(Z) was the correct error
//    in the case above, then SQRT(Z)/SQRT(N) would be the correct error here.
//    In fact, any cell with non-zero number of entries N but with zero spread
//    should have an uncertainty SQRT(Z)/SQRT(N).
//
//    Now, is SQRT(Z)/SQRT(N) really the correct uncertainty?
//    that it is only in the case where the Z variable is some sort
//    of counting statistics, following a Poisson distribution. This should
//    probably be set as the default case. However, Z can be any variable
//    from an original NTUPLE, not necessarily distributed "Poissonly".
//    The computation of errors is based on the parameter option:
//    option:
//     ' '  (Default) Errors are Spread/SQRT(N) for Spread.ne.0. ,
//                      "     "  SQRT(Z)/SQRT(N) for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//     's'            Errors are Spread  for Spread.ne.0. ,
//                      "     "  SQRT(Z)  for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//     'i'            Errors are Spread/SQRT(N) for Spread.ne.0. ,
//                      "     "  1./SQRT(12.*N) for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//
//    The third case above corresponds to Integer Z values for which the
//    uncertainty is +-0.5, with the assumption that the probability that Z
//    takes any value between Z-0.5 and Z+0.5 is uniform (the same argument
//    goes for Z uniformly distributed between Z and Z+1); this would be
//    useful if Z is an ADC measurement, for example. Other, fancier options
//    would be possible, at the cost of adding one more parameter to the PROFILE2D
//    For example, if all Z variables are distributed according to some
//    known Gaussian of standard deviation Sigma, then:
//     'G'            Errors are Spread/SQRT(N) for Spread.ne.0. ,
//                      "     "  Sigma/SQRT(N) for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//    For example, this would be useful when all Z's are experimental quantities
//    measured with the same instrument with precision Sigma.
//
//

   SetErrorOption(option);

   fBinEntries.Set(fNcells);  //*-* create number of entries per cell array

   TH1::Sumw2();                   //*-* create sum of squares of weights array times y
   if (fgDefaultSumw2) Sumw2();    // optionally create sum of squares of weights

   fZmin = zmin;
   fZmax = zmax;
   fScaling = kFALSE;
   fTsumwz  = fTsumwz2 = 0;
}

//______________________________________________________________________________
TProfile2D::TProfile2D(const TProfile2D &profile) : TH2D()
{
   // Copy constructor.

   ((TProfile2D&)profile).Copy(*this);
}


//______________________________________________________________________________
void TProfile2D::Add(TF1 *, Double_t , Option_t*)
{
   // Performs the operation: this = this + c1*f1

   Error("Add","Function not implemented for TProfile2D");
   return;
}


//______________________________________________________________________________
void TProfile2D::Add(const TH1 *h1, Double_t c1)
{
   // Performs the operation: this = this + c1*h1

   if (!h1) {
      Error("Add","Attempt to add a non-existing profile");
      return;
   }
   if (!h1->InheritsFrom("TProfile2D")) {
      Error("Add","Attempt to add a non-profile2D object");
      return;
   }

   TProfileHelper::Add(this, this, h1, 1, c1);
}

//______________________________________________________________________________
void TProfile2D::Add(const TH1 *h1, const TH1 *h2, Double_t c1, Double_t c2)
{
//*-*-*-*-*Replace contents of this profile2D by the addition of h1 and h2*-*-*
//*-*      ===============================================================
//
//   this = c1*h1 + c2*h2
//

   if (!h1 || !h2) {
      Error("Add","Attempt to add a non-existing profile");
      return;
   }
   if (!h1->InheritsFrom("TProfile2D")) {
      Error("Add","Attempt to add a non-profile2D object");
      return;
   }
   if (!h2->InheritsFrom("TProfile2D")) {
      Error("Add","Attempt to add a non-profile2D object");
      return;
   }
   TProfileHelper::Add(this, h1, h2, c1, c2);
}


//______________________________________________________________________________
void TProfile2D::Approximate(Bool_t approx)
{
//     static function
// set the fgApproximate flag. When the flag is true, the function GetBinError
// will approximate the bin error with the average profile error on all bins
// in the following situation only
//  - the number of bins in the profile2D is less than 10404 (eg 100x100)
//  - the bin number of entries is small ( <5)
//  - the estimated bin error is extremely small compared to the bin content
//  (see TProfile2D::GetBinError)

   fgApproximate = approx;
}


//______________________________________________________________________________
Int_t TProfile2D::BufferEmpty(Int_t action)
{
// Fill histogram with all entries in the buffer.
// action = -1 histogram is reset and refilled from the buffer (called by THistPainter::Paint)
// action =  0 histogram is filled from the buffer
// action =  1 histogram is filled and buffer is deleted
//             The buffer is automatically deleted when the number of entries
//             in the buffer is greater than the number of entries in the histogram

   // do we need to compute the bin size?
   if (!fBuffer) return 0;
   Int_t nbentries = (Int_t)fBuffer[0];
   if (!nbentries) return 0;
   Double_t *buffer = fBuffer;
   if (nbentries < 0) {
      if (action == 0) return 0;
      nbentries  = -nbentries;
      fBuffer=0;
      Reset();
      fBuffer = buffer;
   }
   if (TestBit(kCanRebin) || fXaxis.GetXmax() <= fXaxis.GetXmin() || fYaxis.GetXmax() <= fYaxis.GetXmin()) {
      //find min, max of entries in buffer
      Double_t xmin = fBuffer[2];
      Double_t xmax = xmin;
      Double_t ymin = fBuffer[3];
      Double_t ymax = ymin;
      for (Int_t i=1;i<nbentries;i++) {
         Double_t x = fBuffer[4*i+2];
         if (x < xmin) xmin = x;
         if (x > xmax) xmax = x;
         Double_t y = fBuffer[4*i+3];
         if (y < ymin) ymin = y;
         if (y > ymax) ymax = y;
      }
      if (fXaxis.GetXmax() <= fXaxis.GetXmin() || fYaxis.GetXmax() <= fYaxis.GetXmin()) {
         THLimitsFinder::GetLimitsFinder()->FindGoodLimits(this,xmin,xmax,ymin,ymax);
      } else {
         fBuffer = 0;
         Int_t keep = fBufferSize; fBufferSize = 0;
         if (xmin <  fXaxis.GetXmin()) RebinAxis(xmin,&fXaxis);
         if (xmax >= fXaxis.GetXmax()) RebinAxis(xmax,&fXaxis);
         if (ymin <  fYaxis.GetXmin()) RebinAxis(ymin,&fYaxis);
         if (ymax >= fYaxis.GetXmax()) RebinAxis(ymax,&fYaxis);
         fBuffer = buffer;
         fBufferSize = keep;
      }
   }

   fBuffer = 0;
   for (Int_t i=0;i<nbentries;i++) {
      Fill(buffer[4*i+2],buffer[4*i+3],buffer[4*i+4],buffer[4*i+1]);
   }
   fBuffer = buffer;

   if (action > 0) { delete [] fBuffer; fBuffer = 0; fBufferSize = 0;}
   else {
      if (nbentries == (Int_t)fEntries) fBuffer[0] = -nbentries;
      else                              fBuffer[0] = 0;
   }
   return nbentries;
}

//______________________________________________________________________________
Int_t TProfile2D::BufferFill(Double_t x, Double_t y, Double_t z, Double_t w)
{
// accumulate arguments in buffer. When buffer is full, empty the buffer
// fBuffer[0] = number of entries in buffer
// fBuffer[1] = w of first entry
// fBuffer[2] = x of first entry
// fBuffer[3] = y of first entry
// fBuffer[4] = z of first entry

   if (!fBuffer) return -3;
   Int_t nbentries = (Int_t)fBuffer[0];
   if (nbentries < 0) {
      nbentries  = -nbentries;
      fBuffer[0] =  nbentries;
      if (fEntries > 0) {
         Double_t *buffer = fBuffer; fBuffer=0;
         Reset();
         fBuffer = buffer;
      }
   }
   if (4*nbentries+4 >= fBufferSize) {
      BufferEmpty(1);
      return Fill(x,y,z,w);
   }
   fBuffer[4*nbentries+1] = w;
   fBuffer[4*nbentries+2] = x;
   fBuffer[4*nbentries+3] = y;
   fBuffer[4*nbentries+4] = z;
   fBuffer[0] += 1;
   return -2;
}

//______________________________________________________________________________
void TProfile2D::Copy(TObject &obj) const
{
//*-*-*-*-*-*-*-*Copy a Profile2D histogram to a new profile2D histogram*-*-*-*
//*-*            =======================================================

   TH2D::Copy(((TProfile2D&)obj));
   fBinEntries.Copy(((TProfile2D&)obj).fBinEntries);
   fBinSumw2.Copy(((TProfile2D&)obj).fBinSumw2);
   for (int bin=0;bin<fNcells;bin++) {
      ((TProfile2D&)obj).fArray[bin]        = fArray[bin];
      ((TProfile2D&)obj).fSumw2.fArray[bin] = fSumw2.fArray[bin];
   }
   ((TProfile2D&)obj).fZmin = fZmin;
   ((TProfile2D&)obj).fZmax = fZmax;
   ((TProfile2D&)obj).fScaling   = fScaling;
   ((TProfile2D&)obj).fErrorMode = fErrorMode;
   ((TProfile2D&)obj).fTsumwz    = fTsumwz;
   ((TProfile2D&)obj).fTsumwz2   = fTsumwz2;
}


//______________________________________________________________________________
void TProfile2D::Divide(TF1 *, Double_t )
{
   // Performs the operation: this = this/(c1*f1)

   Error("Divide","Function not implemented for TProfile2D");
   return;
}

//______________________________________________________________________________
void TProfile2D::Divide(const TH1 *h1)
{
//*-*-*-*-*-*-*-*-*-*-*Divide this profile2D by h1*-*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  ===========================
//
//   this = this/h1
//

   if (!h1) {
      Error("Divide","Attempt to divide a non-existing profile2D");
      return;
   }
   if (!h1->InheritsFrom("TProfile2D")) {
      Error("Divide","Attempt to divide a non-profile2D object");
      return;
   }
   TProfile2D *p1 = (TProfile2D*)h1;

//*-*- Check profile compatibility
   Int_t nx = GetNbinsX();
   if (nx != p1->GetNbinsX()) {
      Error("Divide","Attempt to divide profiles with different number of bins");
      return;
   }
   Int_t ny = GetNbinsY();
   if (ny != p1->GetNbinsY()) {
      Error("Divide","Attempt to divide profiles with different number of bins");
      return;
   }

//*-*- Reset statistics
   fEntries = fTsumw   = fTsumw2 = fTsumwx = fTsumwx2 = 0;

//*-*- Loop on bins (including underflows/overflows)
   Int_t bin,binx,biny;
   Double_t *cu1 = p1->GetW();
   Double_t *er1 = p1->GetW2();
   Double_t *en1 = p1->GetB();
   Double_t c0,c1,w,z,x,y;
   for (binx =0;binx<=nx+1;binx++) {
      for (biny =0;biny<=ny+1;biny++) {
         bin   = biny*(fXaxis.GetNbins()+2) + binx;
         c0  = fArray[bin];
         c1  = cu1[bin];
         if (c1) w = c0/c1;
         else    w = 0;
         fArray[bin] = w;
         z = TMath::Abs(w);
         x = fXaxis.GetBinCenter(binx);
         y = fYaxis.GetBinCenter(biny);
         fEntries++;
         fTsumw   += z;
         fTsumw2  += z*z;
         fTsumwx  += z*x;
         fTsumwx2 += z*x*x;
         fTsumwy  += z*y;
         fTsumwy2 += z*y*y;
         fTsumwxy += z*x*y;
         fTsumwz  += z;
         fTsumwz2 += z*z;
         Double_t e0 = fSumw2.fArray[bin];
         Double_t e1 = er1[bin];
         Double_t c12= c1*c1;
         if (!c1) fSumw2.fArray[bin] = 0;
         else     fSumw2.fArray[bin] = (e0*c1*c1 + e1*c0*c0)/(c12*c12);
         if (!en1[bin]) fBinEntries.fArray[bin] = 0;
         else           fBinEntries.fArray[bin] /= en1[bin];
      }
   }
   // mantaining the correct sum of weights square is not supported when dividing
   // bin error resulting from division of profile needs to be checked 
   if (fBinSumw2.fN) { 
      Warning("Divide","Cannot preserve during the division of profiles the sum of bin weight square");
      fBinSumw2 = TArrayD();
   }
}


//______________________________________________________________________________
void TProfile2D::Divide(const TH1 *h1, const TH1 *h2, Double_t c1, Double_t c2, Option_t *option)
{
//*-*-*-*-*Replace contents of this profile2D by the division of h1 by h2*-*-*
//*-*      ==============================================================
//
//   this = c1*h1/(c2*h2)
//

   TString opt = option;
   opt.ToLower();
   Bool_t binomial = kFALSE;
   if (opt.Contains("b")) binomial = kTRUE;
   if (!h1 || !h2) {
      Error("Divide","Attempt to divide a non-existing profile2D");
      return;
   }
   if (!h1->InheritsFrom("TProfile2D")) {
      Error("Divide","Attempt to divide a non-profile2D object");
      return;
   }
   TProfile2D *p1 = (TProfile2D*)h1;
   if (!h2->InheritsFrom("TProfile2D")) {
      Error("Divide","Attempt to divide a non-profile2D object");
      return;
   }
   TProfile2D *p2 = (TProfile2D*)h2;

//*-*- Check histogram compatibility
   Int_t nx = GetNbinsX();
   if (nx != p1->GetNbinsX() || nx != p2->GetNbinsX()) {
      Error("Divide","Attempt to divide profiles with different number of bins");
      return;
   }
   Int_t ny = GetNbinsY();
   if (ny != p1->GetNbinsY() || ny != p2->GetNbinsY()) {
      Error("Divide","Attempt to divide profiles with different number of bins");
      return;
   }
   if (!c2) {
      Error("Divide","Coefficient of dividing profile cannot be zero");
      return;
   }

//*-*- Reset statistics
   fEntries = fTsumw   = fTsumw2 = fTsumwx = fTsumwx2 = 0;

//*-*- Loop on bins (including underflows/overflows)
   Int_t bin,binx,biny;
   Double_t *cu1 = p1->GetW();
   Double_t *cu2 = p2->GetW();
   Double_t *er1 = p1->GetW2();
   Double_t *er2 = p2->GetW2();
   Double_t *en1 = p1->GetB();
   Double_t *en2 = p2->GetB();
   Double_t b1,b2,w,z,x,y,ac1,ac2;
   ac1 = TMath::Abs(c1);
   ac2 = TMath::Abs(c2);
   for (binx =0;binx<=nx+1;binx++) {
      for (biny =0;biny<=ny+1;biny++) {
         bin   = biny*(fXaxis.GetNbins()+2) + binx;
         b1  = cu1[bin];
         b2  = cu2[bin];
         if (b2) w = c1*b1/(c2*b2);
         else    w = 0;
         fArray[bin] = w;
         z = TMath::Abs(w);
         x = fXaxis.GetBinCenter(binx);
         y = fYaxis.GetBinCenter(biny);
         fEntries++;
         fTsumw   += z;
         fTsumw2  += z*z;
         fTsumwx  += z*x;
         fTsumwx2 += z*x*x;
         fTsumwy  += z*y;
         fTsumwy2 += z*y*y;
         fTsumwxy += z*x*y;
         fTsumwz  += z;
         fTsumwz2 += z*z;
         Double_t e1 = er1[bin];
         Double_t e2 = er2[bin];
       //Double_t b22= b2*b2*d2;
         Double_t b22= b2*b2*TMath::Abs(c2);
         if (!b2) fSumw2.fArray[bin] = 0;
         else {
            if (binomial) {
               fSumw2.fArray[bin] = TMath::Abs(w*(1-w)/(c2*b2));
            } else {
               fSumw2.fArray[bin] = ac1*ac2*(e1*b2*b2 + e2*b1*b1)/(b22*b22);
            }
         }
         if (!en2[bin]) fBinEntries.fArray[bin] = 0;
         else           fBinEntries.fArray[bin] = en1[bin]/en2[bin];
      }
   }
}

//______________________________________________________________________________
TH1 *TProfile2D::DrawCopy(Option_t *option) const
{
//*-*-*-*-*-*-*-*Draw a copy of this profile2D histogram*-*-*-*-*-*-*-*-*-*-*
//*-*            =======================================
   TString opt = option;
   opt.ToLower();
   if (gPad && !opt.Contains("same")) gPad->Clear();
   TProfile2D *newpf = (TProfile2D*)Clone();
   newpf->SetDirectory(0);
   newpf->SetBit(kCanDelete);
   newpf->AppendPad(option);
   return newpf;
}

//______________________________________________________________________________
Int_t TProfile2D::Fill(Double_t x, Double_t y, Double_t z)
{
//*-*-*-*-*-*-*-*-*-*-*Fill a Profile2D histogram (no weights)*-*-*-*-*-*-*-*
//*-*                  =======================================

   if (fBuffer) return BufferFill(x,y,z,1);

   Int_t bin,binx,biny;

   if (fZmin != fZmax) {
      if (z <fZmin || z> fZmax) return -1;
   }

   fEntries++;
   binx =fXaxis.FindBin(x);
   biny =fYaxis.FindBin(y);
   bin = GetBin(binx, biny); 
   fArray[bin] += z; 
   fSumw2.fArray[bin] += z*z;
   fBinEntries.fArray[bin] += 1;
   if (fBinSumw2.fN)  fBinSumw2.fArray[bin] += 1;
   if (binx == 0 || binx > fXaxis.GetNbins()) {
      if (!fgStatOverflows) return -1;
   }
   if (biny == 0 || biny > fYaxis.GetNbins()) {
      if (!fgStatOverflows) return -1;
   }
   ++fTsumw;
   ++fTsumw2;
   fTsumwx  += x;
   fTsumwx2 += x*x;
   fTsumwy  += y;
   fTsumwy2 += y*y;
   fTsumwxy += x*y;
   fTsumwz  += z;
   fTsumwz2 += z*z;
   return bin;
}

//______________________________________________________________________________
Int_t TProfile2D::Fill(Double_t x, const char *namey, Double_t z)
{
// Fill a Profile2D histogram (no weights)
//
   Int_t bin,binx,biny;

   if (fZmin != fZmax) {
      if (z <fZmin || z> fZmax) return -1;
   }

   fEntries++;
   binx =fXaxis.FindBin(x);
   biny =fYaxis.FindBin(namey);
   bin  = biny*(fXaxis.GetNbins()+2) + binx;
   AddBinContent(bin, z);
   fSumw2.fArray[bin] += (Double_t)z*z;
   fBinEntries.fArray[bin] += 1;
   if (fBinSumw2.fN)  fBinSumw2.fArray[bin] += 1;
   if (binx == 0 || binx > fXaxis.GetNbins()) {
      if (!fgStatOverflows) return -1;
   }
   if (biny == 0 || biny > fYaxis.GetNbins()) return -1;
   Double_t y = fYaxis.GetBinCenter(biny);
   ++fTsumw;
   ++fTsumw2;
   fTsumwx  += x;
   fTsumwx2 += x*x;
   fTsumwy  += y;
   fTsumwy2 += y*y;
   fTsumwxy += x*y;
   fTsumwz  += z;
   fTsumwz2 += z*z;
   return bin;
}

//______________________________________________________________________________
Int_t TProfile2D::Fill(const char *namex, const char *namey, Double_t z)
{
// Fill a Profile2D histogram (no weights)
//
   Int_t bin,binx,biny;

   if (fZmin != fZmax) {
      if (z <fZmin || z> fZmax) return -1;
   }

   fEntries++;
   binx =fXaxis.FindBin(namex);
   biny =fYaxis.FindBin(namey);
   bin  = biny*(fXaxis.GetNbins()+2) + binx;
   AddBinContent(bin, z);
   fSumw2.fArray[bin] += (Double_t)z*z;
   fBinEntries.fArray[bin] += 1;
   if (fBinSumw2.fN)  fBinSumw2.fArray[bin] += 1;
   if (binx == 0 || binx > fXaxis.GetNbins()) return -1;
   if (biny == 0 || biny > fYaxis.GetNbins()) return -1;
   Double_t x = fYaxis.GetBinCenter(binx);
   Double_t y = fYaxis.GetBinCenter(biny);
   ++fTsumw;
   ++fTsumw2;
   fTsumwx  += x;
   fTsumwx2 += x*x;
   fTsumwy  += y;
   fTsumwy2 += y*y;
   fTsumwxy += x*y;
   fTsumwz  += z;
   fTsumwz2 += z*z;
   return bin;
}

//______________________________________________________________________________
Int_t TProfile2D::Fill(const char *namex, Double_t y, Double_t z)
{
// Fill a Profile2D histogram (no weights)
//
   Int_t bin,binx,biny;

   if (fZmin != fZmax) {
      if (z <fZmin || z> fZmax) return -1;
   }

   fEntries++;
   binx =fXaxis.FindBin(namex);
   biny =fYaxis.FindBin(y);
   bin  = biny*(fXaxis.GetNbins()+2) + binx;
   AddBinContent(bin, z);
   fSumw2.fArray[bin] += (Double_t)z*z;
   fBinEntries.fArray[bin] += 1;
   if (fBinSumw2.fN)  fBinSumw2.fArray[bin] += 1;
   if (binx == 0 || binx > fXaxis.GetNbins()) return -1;
   if (biny == 0 || biny > fYaxis.GetNbins()) {
      if (!fgStatOverflows) return -1;
   }
   Double_t x = fYaxis.GetBinCenter(binx);
   ++fTsumw;
   ++fTsumw2;
   fTsumwx  += x;
   fTsumwx2 += x*x;
   fTsumwy  += y;
   fTsumwy2 += y*y;
   fTsumwxy += x*y;
   fTsumwz  += z;
   fTsumwz2 += z*z;
   return bin;
}

//______________________________________________________________________________
Int_t TProfile2D::Fill(Double_t x, Double_t y, Double_t z, Double_t w)
{
//*-*-*-*-*-*-*-*-*-*-*Fill a Profile2D histogram with weights*-*-*-*-*-*-*-*
//*-*                  =======================================

   if (fBuffer) return BufferFill(x,y,z,w);

   Int_t bin,binx,biny;

   if (fZmin != fZmax) {
      if (z <fZmin || z> fZmax) return -1;
   }

   Double_t u= (w > 0 ? w : -w);
   fEntries++;
   binx =fXaxis.FindBin(x);
   biny =fYaxis.FindBin(y);
   bin  = biny*(fXaxis.GetNbins()+2) + binx;
   AddBinContent(bin, u*z);
   fSumw2.fArray[bin] += u*z*z;
   fBinEntries.fArray[bin] += u;
   if (fBinSumw2.fN)  fBinSumw2.fArray[bin] += u*u;
   if (binx == 0 || binx > fXaxis.GetNbins()) {
      if (!fgStatOverflows) return -1;
   }
   if (biny == 0 || biny > fYaxis.GetNbins()) {
      if (!fgStatOverflows) return -1;
   }
   fTsumw   += u;
   fTsumw2  += u*u;
   fTsumwx  += u*x;
   fTsumwx2 += u*x*x;
   fTsumwy  += u*y;
   fTsumwy2 += u*y*y;
   fTsumwxy += u*x*y;
   fTsumwz  += u*z;
   fTsumwz2 += u*z*z;
   return bin;
}

//______________________________________________________________________________
Double_t TProfile2D::GetBinContent(Int_t bin) const
{
//*-*-*-*-*-*-*Return bin content of a Profile2D histogram*-*-*-*-*-*-*-*-*
//*-*          ===========================================

   if (fBuffer) ((TProfile2D*)this)->BufferEmpty();

   if (bin < 0 || bin >= fNcells) return 0;
   if (fBinEntries.fArray[bin] == 0) return 0;
   if (!fArray) return 0;
   return fArray[bin]/fBinEntries.fArray[bin];
}

//______________________________________________________________________________
Double_t TProfile2D::GetBinEntries(Int_t bin) const
{
//*-*-*-*-*-*-*Return bin entries of a Profile2D histogram*-*-*-*-*-*-*-*-*
//*-*          ===========================================

   if (fBuffer) ((TProfile2D*)this)->BufferEmpty();

   if (bin < 0 || bin >= fNcells) return 0;
   return fBinEntries.fArray[bin];
}

//______________________________________________________________________________
Double_t TProfile2D::GetBinEffectiveEntries(Int_t bin)
{
//            Return bin effective entries for a weighted filled Profile histogram. 
//            In case of an unweighted profile, it is equivalent to the number of entries per bin   
//            The effective entries is defined as the square of the sum of the weights divided by the 
//            sum of the weights square. 
//            TProfile::Sumw2() must be called before filling the profile with weights. 
//            Only by calling this method the  sum of the square of the weights per bin is stored. 
//  
//*-*          =========================================

   return TProfileHelper::GetBinEffectiveEntries(this, bin);
}

//______________________________________________________________________________
Double_t TProfile2D::GetBinError(Int_t bin) const
{
// *-*-*-*-*-*-*Return bin error of a Profile2D histogram*-*-*-*-*-*-*-*-*
//
// Computing errors: A moving field
// =================================
// The computation of errors for a TProfile2D has evolved with the versions
// of ROOT. The difficulty is in computing errors for bins with low statistics.
// - prior to version 3.10, we had no special treatment of low statistic bins.
//   As a result, these bins had huge errors. The reason is that the
//   expression eprim2 is very close to 0 (rounding problems) or 0.
// - The algorithm is modified/protected for the case
//   when a TProfile2D is projected (ProjectionX). The previous algorithm
//   generated a N^2 problem when projecting a TProfile2D with a large number of
//   bins (eg 100000).
// - in version 3.10/02, a new static function TProfile::Approximate
//   is introduced to enable or disable (default) the approximation.
//   (see also comments in TProfile::GetBinError)

   return TProfileHelper::GetBinError((TProfile2D*)this, bin);
}

//______________________________________________________________________________
Option_t *TProfile2D::GetErrorOption() const
{
//*-*-*-*-*-*-*-*-*-*Return option to compute profile2D errors*-*-*-*-*-*-*-*
//*-*                =========================================

   if (fErrorMode == kERRORSPREAD)  return "s";
   if (fErrorMode == kERRORSPREADI) return "i";
   if (fErrorMode == kERRORSPREADG) return "g";
   return "";
}

//______________________________________________________________________________
void TProfile2D::GetStats(Double_t *stats) const
{
   // fill the array stats from the contents of this profile
   // The array stats must be correctly dimensionned in the calling program.
   // stats[0] = sumw
   // stats[1] = sumw2
   // stats[2] = sumwx
   // stats[3] = sumwx2
   // stats[4] = sumwy
   // stats[5] = sumwy2
   // stats[6] = sumwxy
   // stats[7] = sumwz
   // stats[8] = sumwz2
   //
   // If no axis-subrange is specified (via TAxis::SetRange), the array stats
   // is simply a copy of the statistics quantities computed at filling time.
   // If a sub-range is specified, the function recomputes these quantities
   // from the bin contents in the current axis range.

   if (fBuffer) ((TProfile2D*)this)->BufferEmpty();

   // Loop on bins
   if (fTsumw == 0 || fXaxis.TestBit(TAxis::kAxisRange) || fYaxis.TestBit(TAxis::kAxisRange)) {
      Int_t bin, binx, biny;
      Double_t w, w2;
      Double_t x,y;
      for (bin=0;bin<9;bin++) stats[bin] = 0;
      if (!fBinEntries.fArray) return;
      Int_t firstBinX = fXaxis.GetFirst();
      Int_t lastBinX  = fXaxis.GetLast();
      Int_t firstBinY = fYaxis.GetFirst();
      Int_t lastBinY  = fYaxis.GetLast();
      // include underflow/overflow if TH1::StatOverflows(kTRUE) in case no range is set on the axis
      if (fgStatOverflows) {
        if ( !fXaxis.TestBit(TAxis::kAxisRange) ) {
            if (firstBinX == 1) firstBinX = 0;
            if (lastBinX ==  fXaxis.GetNbins() ) lastBinX += 1;
         }
         if ( !fYaxis.TestBit(TAxis::kAxisRange) ) {
            if (firstBinY == 1) firstBinY = 0;
            if (lastBinY ==  fYaxis.GetNbins() ) lastBinY += 1;
         }
      }
      for (biny = firstBinY; biny <= lastBinY; biny++) {
         y = fYaxis.GetBinCenter(biny);
         for (binx = firstBinX; binx <= lastBinX; binx++) {
            bin = GetBin(binx,biny);
            w         = fBinEntries.fArray[bin];
            w2        = (fBinSumw2.fN ? fBinSumw2.fArray[bin] : w*w );  
            x         = fXaxis.GetBinCenter(binx);
            stats[0] += w;
            stats[1] += w2;
            stats[2] += w*x;
            stats[3] += w*x*x;
            stats[4] += w*y;
            stats[5] += w*y*y;
            stats[6] += w*x*y;
            stats[7] += fArray[bin];
            stats[8] += fSumw2.fArray[bin];
         }
      }
   } else {
      stats[0] = fTsumw;
      stats[1] = fTsumw2;
      stats[2] = fTsumwx;
      stats[3] = fTsumwx2;
      stats[4] = fTsumwy;
      stats[5] = fTsumwy2;
      stats[6] = fTsumwxy;
      stats[7] = fTsumwz;
      stats[8] = fTsumwz2;
   }
}

//___________________________________________________________________________
void TProfile2D::LabelsDeflate(Option_t *ax)
{
// Reduce the number of bins for this axis to the number of bins having a label.

   TProfileHelper::LabelsDeflate(this, ax);
}

//___________________________________________________________________________
void TProfile2D::LabelsInflate(Option_t *ax)
{
// Double the number of bins for axis.
// Refill histogram
// This function is called by TAxis::FindBin(const char *label)

   TProfileHelper::LabelsInflate(this, ax);
}

//___________________________________________________________________________
void TProfile2D::LabelsOption(Option_t *option, Option_t *ax)
{
//  Set option(s) to draw axis with labels
//  option = "a" sort by alphabetic order
//         = ">" sort by decreasing values
//         = "<" sort by increasing values
//         = "h" draw labels horizonthal
//         = "v" draw labels vertical
//         = "u" draw labels up (end of label right adjusted)
//         = "d" draw labels down (start of label left adjusted)


   TAxis *axis = GetXaxis();
   if (ax[0] == 'y' || ax[0] == 'Y') axis = GetYaxis();
   THashList *labels = axis->GetLabels();
   if (!labels) {
      Warning("LabelsOption","Cannot sort. No labels");
      return;
   }
   TString opt = option;
   opt.ToLower();
   if (opt.Contains("h")) {
      axis->SetBit(TAxis::kLabelsHori);
      axis->ResetBit(TAxis::kLabelsVert);
      axis->ResetBit(TAxis::kLabelsDown);
      axis->ResetBit(TAxis::kLabelsUp);
   }
   if (opt.Contains("v")) {
      axis->SetBit(TAxis::kLabelsVert);
      axis->ResetBit(TAxis::kLabelsHori);
      axis->ResetBit(TAxis::kLabelsDown);
      axis->ResetBit(TAxis::kLabelsUp);
   }
   if (opt.Contains("u")) {
      axis->SetBit(TAxis::kLabelsUp);
      axis->ResetBit(TAxis::kLabelsVert);
      axis->ResetBit(TAxis::kLabelsDown);
      axis->ResetBit(TAxis::kLabelsHori);
   }
   if (opt.Contains("d")) {
      axis->SetBit(TAxis::kLabelsDown);
      axis->ResetBit(TAxis::kLabelsVert);
      axis->ResetBit(TAxis::kLabelsHori);
      axis->ResetBit(TAxis::kLabelsUp);
   }
   Int_t sort = -1;
   if (opt.Contains("a")) sort = 0;
   if (opt.Contains(">")) sort = 1;
   if (opt.Contains("<")) sort = 2;
   if (sort < 0) return;

   Int_t nx = fXaxis.GetNbins()+2;
   Int_t ny = fYaxis.GetNbins()+2;
   Int_t n = TMath::Min(axis->GetNbins(), labels->GetSize());
   Int_t *a = new Int_t[n+2];
   Int_t i,j,k,bin;
   Double_t *sumw   = new Double_t[nx*ny];
   Double_t *errors = new Double_t[nx*ny];
   Double_t *ent    = new Double_t[nx*ny];
   THashList *labold = new THashList(labels->GetSize(),1);
   TIter nextold(labels);
   TObject *obj;
   while ((obj=nextold())) {
      labold->Add(obj);
   }
   labels->Clear();
   if (sort > 0) {
      //---sort by values of bins
      Double_t *pcont = new Double_t[n+2];
      for (i=0;i<=n;i++) pcont[i] = 0;
      for (i=1;i<nx;i++) {
         for (j=1;j<ny;j++) {
            bin = i+nx*j;
            sumw[bin]   = fArray[bin];
            errors[bin] = fSumw2.fArray[bin];
            ent[bin]    = fBinEntries.fArray[bin];
            if (axis == GetXaxis()) k = i;
            else                    k = j;
            if (fBinEntries.fArray[bin] != 0) pcont[k-1] += fArray[bin]/fBinEntries.fArray[bin];
         }
      }
      if (sort ==1) TMath::Sort(n,pcont,a,kTRUE);  //sort by decreasing values
      else          TMath::Sort(n,pcont,a,kFALSE); //sort by increasing values
      delete [] pcont;
      for (i=0;i<n;i++) {
         obj = labold->At(a[i]);
         labels->Add(obj);
         obj->SetUniqueID(i+1);
      }
      for (i=1;i<nx;i++) {
         for (j=1;j<ny;j++) {
            bin = i+nx*j;
            if (axis == GetXaxis()) {
               fArray[bin] = sumw[a[i-1]+1+nx*j];
               fSumw2.fArray[bin] = errors[a[i-1]+1+nx*j];
               fBinEntries.fArray[bin] = ent[a[i-1]+1+nx*j];
            } else {
               fArray[bin] = sumw[i+nx*(a[j-1]+1)];
               fSumw2.fArray[bin] = errors[i+nx*(a[j-1]+1)];
               fBinEntries.fArray[bin] = ent[i+nx*(a[j-1]+1)];
            }
         }
      }
   } else {
      //---alphabetic sort
      const UInt_t kUsed = 1<<18;
      TObject *objk=0;
      a[0] = 0;
      a[n+1] = n+1;
      for (i=1;i<=n;i++) {
         const char *label = "zzzzzzzzzzzz";
         for (j=1;j<=n;j++) {
            obj = labold->At(j-1);
            if (!obj) continue;
            if (obj->TestBit(kUsed)) continue;
            //use strcasecmp for case non-sensitive sort (may be an option)
            if (strcmp(label,obj->GetName()) < 0) continue;
            objk = obj;
            a[i] = j;
            label = obj->GetName();
         }
         if (objk) {
            objk->SetUniqueID(i);
            labels->Add(objk);
            objk->SetBit(kUsed);
         }
      }
      for (i=1;i<=n;i++) {
         obj = labels->At(i-1);
         if (!obj) continue;
         obj->ResetBit(kUsed);
      }
      for (i=0;i<nx;i++) {
         for (j=0;j<ny;j++) {
            bin = i+nx*j;
            sumw[bin]   = fArray[bin];
            errors[bin] = fSumw2.fArray[bin];
            ent[bin]    = fBinEntries.fArray[bin];
         }
      }
      for (i=0;i<nx;i++) {
         for (j=0;j<ny;j++) {
            bin = i+nx*j;
            if (axis == GetXaxis()) {
               fArray[bin] = sumw[a[i]+nx*j];
               fSumw2.fArray[bin] = errors[a[i]+nx*j];
               fBinEntries.fArray[bin] = ent[a[i]+nx*j];
            } else {
               fArray[bin] = sumw[i+nx*a[j]];
               fSumw2.fArray[bin] = errors[i+nx*a[j]];
               fBinEntries.fArray[bin] = ent[i+nx*a[j]];
            }
         }
      }
   }
   delete labold;
   if (a)      delete [] a;
   if (sumw)   delete [] sumw;
   if (errors) delete [] errors;
   if (ent)    delete [] ent;
}

//______________________________________________________________________________
Long64_t TProfile2D::Merge(TCollection *li)
{
   //Merge all histograms in the collection in this histogram.
   //This function computes the min/max for the axes,
   //compute a new number of bins, if necessary,
   //add bin contents, errors and statistics.
   //If overflows are present and limits are different the function will fail.
   //The function returns the total number of entries in the result histogram
   //if the merge is successfull, -1 otherwise.
   //
   //IMPORTANT remark. The 2 axis x and y may have different number
   //of bins and different limits, BUT the largest bin width must be
   //a multiple of the smallest bin width and the upper limit must also
   //be a multiple of the bin width.

   return TProfileHelper::Merge(this, li);
}

//______________________________________________________________________________
void TProfile2D::Multiply(TF1 *, Double_t )
{
   // Performs the operation: this = this*c1*f1

   Error("Multiply","Function not implemented for TProfile2D");
   return;
}

//______________________________________________________________________________
void TProfile2D::Multiply(const TH1 *)
{
//*-*-*-*-*-*-*-*-*-*-*Multiply this profile2D by h1*-*-*-*-*-*-*-*-*-*-*-*
//*-*                  =============================
//
//   this = this*h1
//
   Error("Multiply","Multiplication of profile2D histograms not implemented");
}


//______________________________________________________________________________
void TProfile2D::Multiply(const TH1 *, const TH1 *, Double_t, Double_t, Option_t *)
{
//*-*-*-*-*Replace contents of this profile2D by multiplication of h1 by h2*-*
//*-*      ================================================================
//
//   this = (c1*h1)*(c2*h2)
//

   Error("Multiply","Multiplication of profile2D histograms not implemented");
}

//______________________________________________________________________________
TH2D *TProfile2D::ProjectionXY(const char *name, Option_t *option) const
{
//*-*-*-*-*Project this profile2D into a 2-D histogram along X,Y*-*-*-*-*-*-*
//*-*      =====================================================
//
//   The projection is always of the type TH2D.
//
//   if option "E" is specified  the errors of the projected histogram are computed and set 
//      to be equal to the errors of the profile.
//      Option "E" is defined as the default one in the header file. 
//   if option "" is specified the histogram errors are simply the sqrt of its content
//   if option "B" is specified, the content of bin of the returned histogram
//      will be equal to the GetBinEntries(bin) of the profile,
//   if option "C=E" the bin contents of the projection are set to the
//       bin errors of the profile
//   if option "W" is specified the bin content of the projected histogram  is set to the 
//       product of the bin content of the profile and the entries. 
//       With this option the returned histogram will be equivalent to the one obtained by 
//       filling directly a TH2D using the 3-rd value as a weight. 
//       This option makes sense only for profile filled with all weights =1. 
//       When the profile is weighted (filled with weights different than 1) the  
//       bin error of the projected histogram (obtained using this option "W") cannot be 
//       correctly computed from the information stored in the profile. 


   TString opt = option;
   opt.ToLower();
   

   Int_t nx = fXaxis.GetNbins();
   Int_t ny = fYaxis.GetNbins();

   // Create the projection histogram
   char *pname = (char*)name;
   if (strcmp(name,"_px") == 0) {
      Int_t nch = strlen(GetName()) + 4;
      pname = new char[nch];
      sprintf(pname,"%s%s",GetName(),name);
   }
   TH2D *h1 = new TH2D(pname,GetTitle(),nx,fXaxis.GetXmin(),fXaxis.GetXmax(),ny,fYaxis.GetXmin(),fYaxis.GetXmax());
   Bool_t computeErrors = kFALSE;
   Bool_t cequalErrors  = kFALSE;
   Bool_t binEntries    = kFALSE;
   Bool_t binWeight     = kFALSE;
   if (opt.Contains("b")) binEntries = kTRUE;
   if (opt.Contains("e")) computeErrors = kTRUE;
   if (opt.Contains("w")) binWeight = kTRUE;
   if (opt.Contains("c=e")) {cequalErrors = kTRUE; computeErrors=kFALSE;}
   if (computeErrors || binWeight ) h1->Sumw2();
   if (pname != name)  delete [] pname;

   // Fill the projected histogram
   Int_t bin,binx, biny;
   Double_t cont;
   for (binx =0;binx<=nx+1;binx++) {
      for (biny =0;biny<=ny+1;biny++) {
         bin = GetBin(binx,biny);
         
         if (binEntries)         cont = GetBinEntries(bin);
         else if (cequalErrors)  cont = GetBinError(bin);
         else if (binWeight)     cont = GetBinContent(bin) * GetBinEntries(bin);
         else                    cont = GetBinContent(bin);    // default case

         h1->SetBinContent(bin ,cont);

         // if option E projected histogram errors are same as profile
         if (computeErrors ) h1->SetBinError(bin , GetBinError(bin) );
         // in case of option W bin error is deduced from bin sum of z**2 values of profile
         // this is correct only if the profile is unweighted 
         if (binWeight)      h1->SetBinError(bin , TMath::Sqrt(fSumw2.fArray[bin] ) );
         // in case of bin entries and h1 has sumw2 set set, we need to set the also bin error
         if (binEntries && h1->GetSumw2() ) {
            Double_t err2;
            if (fBinSumw2.fN) 
               err2 = fBinSumw2.fArray[bin]; 
            else 
               err2 = cont;  // this is fBinEntries.fArray[bin]
            h1->SetBinError(bin, TMath::Sqrt(err2 ) ); 
         }
      }
   }
   h1->SetEntries(fEntries);
   return h1;
}

//______________________________________________________________________________
void TProfile2D::PutStats(Double_t *stats)
{
   // Replace current statistics with the values in array stats

   fTsumw   = stats[0];
   fTsumw2  = stats[1];
   fTsumwx  = stats[2];
   fTsumwx2 = stats[3];
   fTsumwy  = stats[4];
   fTsumwy2 = stats[5];
   fTsumwxy = stats[6];
   fTsumwz  = stats[7];
   fTsumwz2 = stats[8];
}

//______________________________________________________________________________
void TProfile2D::Reset(Option_t *option)
{
//*-*-*-*-*-*-*-*-*-*Reset contents of a Profile2D histogram*-*-*-*-*-*-*-*
//*-*                =======================================
   TH2D::Reset(option);
   fBinEntries.Reset();
   fBinSumw2.Reset();
   TString opt = option;
   opt.ToUpper();
   if (opt.Contains("ICE")) return;
   fTsumwz = fTsumwz2 = 0;
}


//______________________________________________________________________________
void TProfile2D::RebinAxis(Double_t x, TAxis *axis)
{
// Profile histogram is resized along axis such that x is in the axis range.
// The new axis limits are recomputed by doubling iteratively
// the current axis range until the specified value x is within the limits.
// The algorithm makes a copy of the histogram, then loops on all bins
// of the old histogram to fill the rebinned histogram.
// Takes into account errors (Sumw2) if any.
// The bit kCanRebin must be set before invoking this function.
//  Ex:  h->SetBit(TH1::kCanRebin);

   TProfile2D* hold = TProfileHelper::RebinAxis(this, x, axis);
   if ( hold ) {
      fTsumwz  = hold->fTsumwz;
      fTsumwz2 = hold->fTsumwz2;
      delete hold;
   }
}

//______________________________________________________________________________
TProfile2D * TProfile2D::Rebin2D(Int_t , Int_t, const char * ) {
   // Rebin2D is not implemented for TProfile2D
   // dummy function to flag an error and to avoid to call TH2D::Rebin2D
   Error("TProfile2D","Rebin2D is not implemented for TProfile2D");
   return this;
}

//______________________________________________________________________________
void TProfile2D::SavePrimitive(ostream &out, Option_t *option /*= ""*/)
{
   // Save primitive as a C++ statement(s) on output stream out

   //Note the following restrictions in the code generated:
   // - variable bin size not implemented
   // - SetErrorOption not implemented


   char quote = '"';
   out <<"   "<<endl;
   out <<"   "<<ClassName()<<" *";

   out << GetName() << " = new " << ClassName() << "(" << quote
       << GetName() << quote << "," << quote<< GetTitle() << quote
       << "," << GetXaxis()->GetNbins();
   out << "," << GetXaxis()->GetXmin()
       << "," << GetXaxis()->GetXmax();
   out << "," << GetYaxis()->GetNbins();
   out << "," << GetYaxis()->GetXmin()
       << "," << GetYaxis()->GetXmax();
   out << "," << fZmin
       << "," << fZmax;
   out << ");" << endl;


   // save bin entries
   Int_t bin;
   for (bin=0;bin<fNcells;bin++) {
      Double_t bi = GetBinEntries(bin);
      if (bi) {
         out<<"   "<<GetName()<<"->SetBinEntries("<<bin<<","<<bi<<");"<<endl;
      }
   }
   //save bin contents
   for (bin=0;bin<fNcells;bin++) {
      Double_t bc = fArray[bin];
      if (bc) {
         out<<"   "<<GetName()<<"->SetBinContent("<<bin<<","<<bc<<");"<<endl;
      }
   }
   // save bin errors
   if (fSumw2.fN) {
      for (bin=0;bin<fNcells;bin++) {
         Double_t be = TMath::Sqrt(fSumw2.fArray[bin]);
         if (be) {
            out<<"   "<<GetName()<<"->SetBinError("<<bin<<","<<be<<");"<<endl;
         }
      }
   }

   TH1::SavePrimitiveHelp(out, GetName(), option);
}

//______________________________________________________________________________
void TProfile2D::Scale(Double_t c1, Option_t * option)
{
// *-*-*-*-*Multiply this profile2D by a constant c1*-*-*-*-*-*-*-*-*
// *-*      ========================================
//
//   this = c1*this
//
// This function uses the services of TProfile2D::Add
//

   TProfileHelper::Scale(this, c1, option);
}

//______________________________________________________________________________
void TProfile2D::SetBinEntries(Int_t bin, Double_t w)
{
//*-*-*-*-*-*-*-*-*Set the number of entries in bin*-*-*-*-*-*-*-*-*-*-*-*
//*-*              ================================

   if (bin < 0 || bin >= fNcells) return;
   fBinEntries.fArray[bin] = w;
}

//______________________________________________________________________________
void TProfile2D::SetBins(Int_t nx, Double_t xmin, Double_t xmax, Int_t ny, Double_t ymin, Double_t ymax)
{
//*-*-*-*-*-*-*-*-*Redefine  x axis parameters*-*-*-*-*-*-*-*-*-*-*-*
//*-*              ===========================

   fXaxis.Set(nx,xmin,xmax);
   fYaxis.Set(ny,ymin,ymax);
   fNcells = (nx+2)*(ny+2);
   SetBinsLength(fNcells);
   fBinEntries.Set(fNcells);
   fSumw2.Set(fNcells);
   if (fBinSumw2.fN) fBinSumw2.Set(fNcells);
}


//______________________________________________________________________________
void TProfile2D::SetBuffer(Int_t buffersize, Option_t *)
{
// set the buffer size in units of 8 bytes (double)

   if (fBuffer) {
      BufferEmpty();
      delete [] fBuffer;
      fBuffer = 0;
   }
   if (buffersize <= 0) {
      fBufferSize = 0;
      return;
   }
   if (buffersize < 100) buffersize = 100;
   fBufferSize = 1 + 4*buffersize;
   fBuffer = new Double_t[fBufferSize];
   memset(fBuffer,0,8*fBufferSize);
}

//______________________________________________________________________________
void TProfile2D::SetErrorOption(Option_t *option)
{
//*-*-*-*-*-*-*-*-*-*Set option to compute profile2D errors*-*-*-*-*-*-*-*
//*-*                =======================================
//
//    The computation of errors is based on the parameter option:
//    option:
//     ' '  (Default) Errors are Spread/SQRT(N) for Spread.ne.0. ,
//                      "     "  SQRT(Z)/SQRT(N) for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//     's'            Errors are Spread  for Spread.ne.0. ,
//                      "     "  SQRT(Z)  for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//     'i'            Errors are Spread/SQRT(N) for Spread.ne.0. ,
//                      "     "  1./SQRT(12.*N) for Spread.eq.0,N.gt.0 ,
//                      "     "  0.  for N.eq.0
//   See TProfile2D::BuildOptions for explanation of all options

   TString opt = option;
   opt.ToLower();
   fErrorMode = kERRORMEAN;
   if (opt.Contains("s")) fErrorMode = kERRORSPREAD;
   if (opt.Contains("i")) fErrorMode = kERRORSPREADI;
   if (opt.Contains("g")) fErrorMode = kERRORSPREADG;
}

//______________________________________________________________________________
void TProfile2D::Streamer(TBuffer &R__b)
{
   // Stream an object of class TProfile2D.

   if (R__b.IsReading()) {
      UInt_t R__s, R__c;
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      if (R__v > 2) {
         R__b.ReadClassBuffer(TProfile2D::Class(), this, R__v, R__s, R__c);
         return;
      }
      //====process old versions before automatic schema evolution
      TH2D::Streamer(R__b);
      fBinEntries.Streamer(R__b);
      Int_t errorMode;
      R__b >> errorMode;
      fErrorMode = (EErrorType)errorMode;
      if (R__v < 2) {
         Float_t zmin,zmax;
         R__b >> zmin; fZmin = zmin;
         R__b >> zmax; fZmax = zmax;
      } else {
         R__b >> fZmin;
         R__b >> fZmax;
      }
      R__b.CheckByteCount(R__s, R__c, TProfile2D::IsA());
      //====end of old versions

   } else {
      R__b.WriteClassBuffer(TProfile2D::Class(),this);
   }
}

//______________________________________________________________________________
void TProfile2D::Sumw2()
{
   // Create structure to store sum of squares of weights per bin  *-*-*-*-*-*-*-*
   //   This is needed to compute  the correct statistical quantities  
   //    of a profile filled with weights 
   //  
   //
   //  This function is automatically called when the histogram is created
   //  if the static function TH1::SetDefaultSumw2 has been called before.

   TProfileHelper::Sumw2(this);
}
 TProfile2D.cxx:1
 TProfile2D.cxx:2
 TProfile2D.cxx:3
 TProfile2D.cxx:4
 TProfile2D.cxx:5
 TProfile2D.cxx:6
 TProfile2D.cxx:7
 TProfile2D.cxx:8
 TProfile2D.cxx:9
 TProfile2D.cxx:10
 TProfile2D.cxx:11
 TProfile2D.cxx:12
 TProfile2D.cxx:13
 TProfile2D.cxx:14
 TProfile2D.cxx:15
 TProfile2D.cxx:16
 TProfile2D.cxx:17
 TProfile2D.cxx:18
 TProfile2D.cxx:19
 TProfile2D.cxx:20
 TProfile2D.cxx:21
 TProfile2D.cxx:22
 TProfile2D.cxx:23
 TProfile2D.cxx:24
 TProfile2D.cxx:25
 TProfile2D.cxx:26
 TProfile2D.cxx:27
 TProfile2D.cxx:28
 TProfile2D.cxx:29
 TProfile2D.cxx:30
 TProfile2D.cxx:31
 TProfile2D.cxx:32
 TProfile2D.cxx:33
 TProfile2D.cxx:34
 TProfile2D.cxx:35
 TProfile2D.cxx:36
 TProfile2D.cxx:37
 TProfile2D.cxx:38
 TProfile2D.cxx:39
 TProfile2D.cxx:40
 TProfile2D.cxx:41
 TProfile2D.cxx:42
 TProfile2D.cxx:43
 TProfile2D.cxx:44
 TProfile2D.cxx:45
 TProfile2D.cxx:46
 TProfile2D.cxx:47
 TProfile2D.cxx:48
 TProfile2D.cxx:49
 TProfile2D.cxx:50
 TProfile2D.cxx:51
 TProfile2D.cxx:52
 TProfile2D.cxx:53
 TProfile2D.cxx:54
 TProfile2D.cxx:55
 TProfile2D.cxx:56
 TProfile2D.cxx:57
 TProfile2D.cxx:58
 TProfile2D.cxx:59
 TProfile2D.cxx:60
 TProfile2D.cxx:61
 TProfile2D.cxx:62
 TProfile2D.cxx:63
 TProfile2D.cxx:64
 TProfile2D.cxx:65
 TProfile2D.cxx:66
 TProfile2D.cxx:67
 TProfile2D.cxx:68
 TProfile2D.cxx:69
 TProfile2D.cxx:70
 TProfile2D.cxx:71
 TProfile2D.cxx:72
 TProfile2D.cxx:73
 TProfile2D.cxx:74
 TProfile2D.cxx:75
 TProfile2D.cxx:76
 TProfile2D.cxx:77
 TProfile2D.cxx:78
 TProfile2D.cxx:79
 TProfile2D.cxx:80
 TProfile2D.cxx:81
 TProfile2D.cxx:82
 TProfile2D.cxx:83
 TProfile2D.cxx:84
 TProfile2D.cxx:85
 TProfile2D.cxx:86
 TProfile2D.cxx:87
 TProfile2D.cxx:88
 TProfile2D.cxx:89
 TProfile2D.cxx:90
 TProfile2D.cxx:91
 TProfile2D.cxx:92
 TProfile2D.cxx:93
 TProfile2D.cxx:94
 TProfile2D.cxx:95
 TProfile2D.cxx:96
 TProfile2D.cxx:97
 TProfile2D.cxx:98
 TProfile2D.cxx:99
 TProfile2D.cxx:100
 TProfile2D.cxx:101
 TProfile2D.cxx:102
 TProfile2D.cxx:103
 TProfile2D.cxx:104
 TProfile2D.cxx:105
 TProfile2D.cxx:106
 TProfile2D.cxx:107
 TProfile2D.cxx:108
 TProfile2D.cxx:109
 TProfile2D.cxx:110
 TProfile2D.cxx:111
 TProfile2D.cxx:112
 TProfile2D.cxx:113
 TProfile2D.cxx:114
 TProfile2D.cxx:115
 TProfile2D.cxx:116
 TProfile2D.cxx:117
 TProfile2D.cxx:118
 TProfile2D.cxx:119
 TProfile2D.cxx:120
 TProfile2D.cxx:121
 TProfile2D.cxx:122
 TProfile2D.cxx:123
 TProfile2D.cxx:124
 TProfile2D.cxx:125
 TProfile2D.cxx:126
 TProfile2D.cxx:127
 TProfile2D.cxx:128
 TProfile2D.cxx:129
 TProfile2D.cxx:130
 TProfile2D.cxx:131
 TProfile2D.cxx:132
 TProfile2D.cxx:133
 TProfile2D.cxx:134
 TProfile2D.cxx:135
 TProfile2D.cxx:136
 TProfile2D.cxx:137
 TProfile2D.cxx:138
 TProfile2D.cxx:139
 TProfile2D.cxx:140
 TProfile2D.cxx:141
 TProfile2D.cxx:142
 TProfile2D.cxx:143
 TProfile2D.cxx:144
 TProfile2D.cxx:145
 TProfile2D.cxx:146
 TProfile2D.cxx:147
 TProfile2D.cxx:148
 TProfile2D.cxx:149
 TProfile2D.cxx:150
 TProfile2D.cxx:151
 TProfile2D.cxx:152
 TProfile2D.cxx:153
 TProfile2D.cxx:154
 TProfile2D.cxx:155
 TProfile2D.cxx:156
 TProfile2D.cxx:157
 TProfile2D.cxx:158
 TProfile2D.cxx:159
 TProfile2D.cxx:160
 TProfile2D.cxx:161
 TProfile2D.cxx:162
 TProfile2D.cxx:163
 TProfile2D.cxx:164
 TProfile2D.cxx:165
 TProfile2D.cxx:166
 TProfile2D.cxx:167
 TProfile2D.cxx:168
 TProfile2D.cxx:169
 TProfile2D.cxx:170
 TProfile2D.cxx:171
 TProfile2D.cxx:172
 TProfile2D.cxx:173
 TProfile2D.cxx:174
 TProfile2D.cxx:175
 TProfile2D.cxx:176
 TProfile2D.cxx:177
 TProfile2D.cxx:178
 TProfile2D.cxx:179
 TProfile2D.cxx:180
 TProfile2D.cxx:181
 TProfile2D.cxx:182
 TProfile2D.cxx:183
 TProfile2D.cxx:184
 TProfile2D.cxx:185
 TProfile2D.cxx:186
 TProfile2D.cxx:187
 TProfile2D.cxx:188
 TProfile2D.cxx:189
 TProfile2D.cxx:190
 TProfile2D.cxx:191
 TProfile2D.cxx:192
 TProfile2D.cxx:193
 TProfile2D.cxx:194
 TProfile2D.cxx:195
 TProfile2D.cxx:196
 TProfile2D.cxx:197
 TProfile2D.cxx:198
 TProfile2D.cxx:199
 TProfile2D.cxx:200
 TProfile2D.cxx:201
 TProfile2D.cxx:202
 TProfile2D.cxx:203
 TProfile2D.cxx:204
 TProfile2D.cxx:205
 TProfile2D.cxx:206
 TProfile2D.cxx:207
 TProfile2D.cxx:208
 TProfile2D.cxx:209
 TProfile2D.cxx:210
 TProfile2D.cxx:211
 TProfile2D.cxx:212
 TProfile2D.cxx:213
 TProfile2D.cxx:214
 TProfile2D.cxx:215
 TProfile2D.cxx:216
 TProfile2D.cxx:217
 TProfile2D.cxx:218
 TProfile2D.cxx:219
 TProfile2D.cxx:220
 TProfile2D.cxx:221
 TProfile2D.cxx:222
 TProfile2D.cxx:223
 TProfile2D.cxx:224
 TProfile2D.cxx:225
 TProfile2D.cxx:226
 TProfile2D.cxx:227
 TProfile2D.cxx:228
 TProfile2D.cxx:229
 TProfile2D.cxx:230
 TProfile2D.cxx:231
 TProfile2D.cxx:232
 TProfile2D.cxx:233
 TProfile2D.cxx:234
 TProfile2D.cxx:235
 TProfile2D.cxx:236
 TProfile2D.cxx:237
 TProfile2D.cxx:238
 TProfile2D.cxx:239
 TProfile2D.cxx:240
 TProfile2D.cxx:241
 TProfile2D.cxx:242
 TProfile2D.cxx:243
 TProfile2D.cxx:244
 TProfile2D.cxx:245
 TProfile2D.cxx:246
 TProfile2D.cxx:247
 TProfile2D.cxx:248
 TProfile2D.cxx:249
 TProfile2D.cxx:250
 TProfile2D.cxx:251
 TProfile2D.cxx:252
 TProfile2D.cxx:253
 TProfile2D.cxx:254
 TProfile2D.cxx:255
 TProfile2D.cxx:256
 TProfile2D.cxx:257
 TProfile2D.cxx:258
 TProfile2D.cxx:259
 TProfile2D.cxx:260
 TProfile2D.cxx:261
 TProfile2D.cxx:262
 TProfile2D.cxx:263
 TProfile2D.cxx:264
 TProfile2D.cxx:265
 TProfile2D.cxx:266
 TProfile2D.cxx:267
 TProfile2D.cxx:268
 TProfile2D.cxx:269
 TProfile2D.cxx:270
 TProfile2D.cxx:271
 TProfile2D.cxx:272
 TProfile2D.cxx:273
 TProfile2D.cxx:274
 TProfile2D.cxx:275
 TProfile2D.cxx:276
 TProfile2D.cxx:277
 TProfile2D.cxx:278
 TProfile2D.cxx:279
 TProfile2D.cxx:280
 TProfile2D.cxx:281
 TProfile2D.cxx:282
 TProfile2D.cxx:283
 TProfile2D.cxx:284
 TProfile2D.cxx:285
 TProfile2D.cxx:286
 TProfile2D.cxx:287
 TProfile2D.cxx:288
 TProfile2D.cxx:289
 TProfile2D.cxx:290
 TProfile2D.cxx:291
 TProfile2D.cxx:292
 TProfile2D.cxx:293
 TProfile2D.cxx:294
 TProfile2D.cxx:295
 TProfile2D.cxx:296
 TProfile2D.cxx:297
 TProfile2D.cxx:298
 TProfile2D.cxx:299
 TProfile2D.cxx:300
 TProfile2D.cxx:301
 TProfile2D.cxx:302
 TProfile2D.cxx:303
 TProfile2D.cxx:304
 TProfile2D.cxx:305
 TProfile2D.cxx:306
 TProfile2D.cxx:307
 TProfile2D.cxx:308
 TProfile2D.cxx:309
 TProfile2D.cxx:310
 TProfile2D.cxx:311
 TProfile2D.cxx:312
 TProfile2D.cxx:313
 TProfile2D.cxx:314
 TProfile2D.cxx:315
 TProfile2D.cxx:316
 TProfile2D.cxx:317
 TProfile2D.cxx:318
 TProfile2D.cxx:319
 TProfile2D.cxx:320
 TProfile2D.cxx:321
 TProfile2D.cxx:322
 TProfile2D.cxx:323
 TProfile2D.cxx:324
 TProfile2D.cxx:325
 TProfile2D.cxx:326
 TProfile2D.cxx:327
 TProfile2D.cxx:328
 TProfile2D.cxx:329
 TProfile2D.cxx:330
 TProfile2D.cxx:331
 TProfile2D.cxx:332
 TProfile2D.cxx:333
 TProfile2D.cxx:334
 TProfile2D.cxx:335
 TProfile2D.cxx:336
 TProfile2D.cxx:337
 TProfile2D.cxx:338
 TProfile2D.cxx:339
 TProfile2D.cxx:340
 TProfile2D.cxx:341
 TProfile2D.cxx:342
 TProfile2D.cxx:343
 TProfile2D.cxx:344
 TProfile2D.cxx:345
 TProfile2D.cxx:346
 TProfile2D.cxx:347
 TProfile2D.cxx:348
 TProfile2D.cxx:349
 TProfile2D.cxx:350
 TProfile2D.cxx:351
 TProfile2D.cxx:352
 TProfile2D.cxx:353
 TProfile2D.cxx:354
 TProfile2D.cxx:355
 TProfile2D.cxx:356
 TProfile2D.cxx:357
 TProfile2D.cxx:358
 TProfile2D.cxx:359
 TProfile2D.cxx:360
 TProfile2D.cxx:361
 TProfile2D.cxx:362
 TProfile2D.cxx:363
 TProfile2D.cxx:364
 TProfile2D.cxx:365
 TProfile2D.cxx:366
 TProfile2D.cxx:367
 TProfile2D.cxx:368
 TProfile2D.cxx:369
 TProfile2D.cxx:370
 TProfile2D.cxx:371
 TProfile2D.cxx:372
 TProfile2D.cxx:373
 TProfile2D.cxx:374
 TProfile2D.cxx:375
 TProfile2D.cxx:376
 TProfile2D.cxx:377
 TProfile2D.cxx:378
 TProfile2D.cxx:379
 TProfile2D.cxx:380
 TProfile2D.cxx:381
 TProfile2D.cxx:382
 TProfile2D.cxx:383
 TProfile2D.cxx:384
 TProfile2D.cxx:385
 TProfile2D.cxx:386
 TProfile2D.cxx:387
 TProfile2D.cxx:388
 TProfile2D.cxx:389
 TProfile2D.cxx:390
 TProfile2D.cxx:391
 TProfile2D.cxx:392
 TProfile2D.cxx:393
 TProfile2D.cxx:394
 TProfile2D.cxx:395
 TProfile2D.cxx:396
 TProfile2D.cxx:397
 TProfile2D.cxx:398
 TProfile2D.cxx:399
 TProfile2D.cxx:400
 TProfile2D.cxx:401
 TProfile2D.cxx:402
 TProfile2D.cxx:403
 TProfile2D.cxx:404
 TProfile2D.cxx:405
 TProfile2D.cxx:406
 TProfile2D.cxx:407
 TProfile2D.cxx:408
 TProfile2D.cxx:409
 TProfile2D.cxx:410
 TProfile2D.cxx:411
 TProfile2D.cxx:412
 TProfile2D.cxx:413
 TProfile2D.cxx:414
 TProfile2D.cxx:415
 TProfile2D.cxx:416
 TProfile2D.cxx:417
 TProfile2D.cxx:418
 TProfile2D.cxx:419
 TProfile2D.cxx:420
 TProfile2D.cxx:421
 TProfile2D.cxx:422
 TProfile2D.cxx:423
 TProfile2D.cxx:424
 TProfile2D.cxx:425
 TProfile2D.cxx:426
 TProfile2D.cxx:427
 TProfile2D.cxx:428
 TProfile2D.cxx:429
 TProfile2D.cxx:430
 TProfile2D.cxx:431
 TProfile2D.cxx:432
 TProfile2D.cxx:433
 TProfile2D.cxx:434
 TProfile2D.cxx:435
 TProfile2D.cxx:436
 TProfile2D.cxx:437
 TProfile2D.cxx:438
 TProfile2D.cxx:439
 TProfile2D.cxx:440
 TProfile2D.cxx:441
 TProfile2D.cxx:442
 TProfile2D.cxx:443
 TProfile2D.cxx:444
 TProfile2D.cxx:445
 TProfile2D.cxx:446
 TProfile2D.cxx:447
 TProfile2D.cxx:448
 TProfile2D.cxx:449
 TProfile2D.cxx:450
 TProfile2D.cxx:451
 TProfile2D.cxx:452
 TProfile2D.cxx:453
 TProfile2D.cxx:454
 TProfile2D.cxx:455
 TProfile2D.cxx:456
 TProfile2D.cxx:457
 TProfile2D.cxx:458
 TProfile2D.cxx:459
 TProfile2D.cxx:460
 TProfile2D.cxx:461
 TProfile2D.cxx:462
 TProfile2D.cxx:463
 TProfile2D.cxx:464
 TProfile2D.cxx:465
 TProfile2D.cxx:466
 TProfile2D.cxx:467
 TProfile2D.cxx:468
 TProfile2D.cxx:469
 TProfile2D.cxx:470
 TProfile2D.cxx:471
 TProfile2D.cxx:472
 TProfile2D.cxx:473
 TProfile2D.cxx:474
 TProfile2D.cxx:475
 TProfile2D.cxx:476
 TProfile2D.cxx:477
 TProfile2D.cxx:478
 TProfile2D.cxx:479
 TProfile2D.cxx:480
 TProfile2D.cxx:481
 TProfile2D.cxx:482
 TProfile2D.cxx:483
 TProfile2D.cxx:484
 TProfile2D.cxx:485
 TProfile2D.cxx:486
 TProfile2D.cxx:487
 TProfile2D.cxx:488
 TProfile2D.cxx:489
 TProfile2D.cxx:490
 TProfile2D.cxx:491
 TProfile2D.cxx:492
 TProfile2D.cxx:493
 TProfile2D.cxx:494
 TProfile2D.cxx:495
 TProfile2D.cxx:496
 TProfile2D.cxx:497
 TProfile2D.cxx:498
 TProfile2D.cxx:499
 TProfile2D.cxx:500
 TProfile2D.cxx:501
 TProfile2D.cxx:502
 TProfile2D.cxx:503
 TProfile2D.cxx:504
 TProfile2D.cxx:505
 TProfile2D.cxx:506
 TProfile2D.cxx:507
 TProfile2D.cxx:508
 TProfile2D.cxx:509
 TProfile2D.cxx:510
 TProfile2D.cxx:511
 TProfile2D.cxx:512
 TProfile2D.cxx:513
 TProfile2D.cxx:514
 TProfile2D.cxx:515
 TProfile2D.cxx:516
 TProfile2D.cxx:517
 TProfile2D.cxx:518
 TProfile2D.cxx:519
 TProfile2D.cxx:520
 TProfile2D.cxx:521
 TProfile2D.cxx:522
 TProfile2D.cxx:523
 TProfile2D.cxx:524
 TProfile2D.cxx:525
 TProfile2D.cxx:526
 TProfile2D.cxx:527
 TProfile2D.cxx:528
 TProfile2D.cxx:529
 TProfile2D.cxx:530
 TProfile2D.cxx:531
 TProfile2D.cxx:532
 TProfile2D.cxx:533
 TProfile2D.cxx:534
 TProfile2D.cxx:535
 TProfile2D.cxx:536
 TProfile2D.cxx:537
 TProfile2D.cxx:538
 TProfile2D.cxx:539
 TProfile2D.cxx:540
 TProfile2D.cxx:541
 TProfile2D.cxx:542
 TProfile2D.cxx:543
 TProfile2D.cxx:544
 TProfile2D.cxx:545
 TProfile2D.cxx:546
 TProfile2D.cxx:547
 TProfile2D.cxx:548
 TProfile2D.cxx:549
 TProfile2D.cxx:550
 TProfile2D.cxx:551
 TProfile2D.cxx:552
 TProfile2D.cxx:553
 TProfile2D.cxx:554
 TProfile2D.cxx:555
 TProfile2D.cxx:556
 TProfile2D.cxx:557
 TProfile2D.cxx:558
 TProfile2D.cxx:559
 TProfile2D.cxx:560
 TProfile2D.cxx:561
 TProfile2D.cxx:562
 TProfile2D.cxx:563
 TProfile2D.cxx:564
 TProfile2D.cxx:565
 TProfile2D.cxx:566
 TProfile2D.cxx:567
 TProfile2D.cxx:568
 TProfile2D.cxx:569
 TProfile2D.cxx:570
 TProfile2D.cxx:571
 TProfile2D.cxx:572
 TProfile2D.cxx:573
 TProfile2D.cxx:574
 TProfile2D.cxx:575
 TProfile2D.cxx:576
 TProfile2D.cxx:577
 TProfile2D.cxx:578
 TProfile2D.cxx:579
 TProfile2D.cxx:580
 TProfile2D.cxx:581
 TProfile2D.cxx:582
 TProfile2D.cxx:583
 TProfile2D.cxx:584
 TProfile2D.cxx:585
 TProfile2D.cxx:586
 TProfile2D.cxx:587
 TProfile2D.cxx:588
 TProfile2D.cxx:589
 TProfile2D.cxx:590
 TProfile2D.cxx:591
 TProfile2D.cxx:592
 TProfile2D.cxx:593
 TProfile2D.cxx:594
 TProfile2D.cxx:595
 TProfile2D.cxx:596
 TProfile2D.cxx:597
 TProfile2D.cxx:598
 TProfile2D.cxx:599
 TProfile2D.cxx:600
 TProfile2D.cxx:601
 TProfile2D.cxx:602
 TProfile2D.cxx:603
 TProfile2D.cxx:604
 TProfile2D.cxx:605
 TProfile2D.cxx:606
 TProfile2D.cxx:607
 TProfile2D.cxx:608
 TProfile2D.cxx:609
 TProfile2D.cxx:610
 TProfile2D.cxx:611
 TProfile2D.cxx:612
 TProfile2D.cxx:613
 TProfile2D.cxx:614
 TProfile2D.cxx:615
 TProfile2D.cxx:616
 TProfile2D.cxx:617
 TProfile2D.cxx:618
 TProfile2D.cxx:619
 TProfile2D.cxx:620
 TProfile2D.cxx:621
 TProfile2D.cxx:622
 TProfile2D.cxx:623
 TProfile2D.cxx:624
 TProfile2D.cxx:625
 TProfile2D.cxx:626
 TProfile2D.cxx:627
 TProfile2D.cxx:628
 TProfile2D.cxx:629
 TProfile2D.cxx:630
 TProfile2D.cxx:631
 TProfile2D.cxx:632
 TProfile2D.cxx:633
 TProfile2D.cxx:634
 TProfile2D.cxx:635
 TProfile2D.cxx:636
 TProfile2D.cxx:637
 TProfile2D.cxx:638
 TProfile2D.cxx:639
 TProfile2D.cxx:640
 TProfile2D.cxx:641
 TProfile2D.cxx:642
 TProfile2D.cxx:643
 TProfile2D.cxx:644
 TProfile2D.cxx:645
 TProfile2D.cxx:646
 TProfile2D.cxx:647
 TProfile2D.cxx:648
 TProfile2D.cxx:649
 TProfile2D.cxx:650
 TProfile2D.cxx:651
 TProfile2D.cxx:652
 TProfile2D.cxx:653
 TProfile2D.cxx:654
 TProfile2D.cxx:655
 TProfile2D.cxx:656
 TProfile2D.cxx:657
 TProfile2D.cxx:658
 TProfile2D.cxx:659
 TProfile2D.cxx:660
 TProfile2D.cxx:661
 TProfile2D.cxx:662
 TProfile2D.cxx:663
 TProfile2D.cxx:664
 TProfile2D.cxx:665
 TProfile2D.cxx:666
 TProfile2D.cxx:667
 TProfile2D.cxx:668
 TProfile2D.cxx:669
 TProfile2D.cxx:670
 TProfile2D.cxx:671
 TProfile2D.cxx:672
 TProfile2D.cxx:673
 TProfile2D.cxx:674
 TProfile2D.cxx:675
 TProfile2D.cxx:676
 TProfile2D.cxx:677
 TProfile2D.cxx:678
 TProfile2D.cxx:679
 TProfile2D.cxx:680
 TProfile2D.cxx:681
 TProfile2D.cxx:682
 TProfile2D.cxx:683
 TProfile2D.cxx:684
 TProfile2D.cxx:685
 TProfile2D.cxx:686
 TProfile2D.cxx:687
 TProfile2D.cxx:688
 TProfile2D.cxx:689
 TProfile2D.cxx:690
 TProfile2D.cxx:691
 TProfile2D.cxx:692
 TProfile2D.cxx:693
 TProfile2D.cxx:694
 TProfile2D.cxx:695
 TProfile2D.cxx:696
 TProfile2D.cxx:697
 TProfile2D.cxx:698
 TProfile2D.cxx:699
 TProfile2D.cxx:700
 TProfile2D.cxx:701
 TProfile2D.cxx:702
 TProfile2D.cxx:703
 TProfile2D.cxx:704
 TProfile2D.cxx:705
 TProfile2D.cxx:706
 TProfile2D.cxx:707
 TProfile2D.cxx:708
 TProfile2D.cxx:709
 TProfile2D.cxx:710
 TProfile2D.cxx:711
 TProfile2D.cxx:712
 TProfile2D.cxx:713
 TProfile2D.cxx:714
 TProfile2D.cxx:715
 TProfile2D.cxx:716
 TProfile2D.cxx:717
 TProfile2D.cxx:718
 TProfile2D.cxx:719
 TProfile2D.cxx:720
 TProfile2D.cxx:721
 TProfile2D.cxx:722
 TProfile2D.cxx:723
 TProfile2D.cxx:724
 TProfile2D.cxx:725
 TProfile2D.cxx:726
 TProfile2D.cxx:727
 TProfile2D.cxx:728
 TProfile2D.cxx:729
 TProfile2D.cxx:730
 TProfile2D.cxx:731
 TProfile2D.cxx:732
 TProfile2D.cxx:733
 TProfile2D.cxx:734
 TProfile2D.cxx:735
 TProfile2D.cxx:736
 TProfile2D.cxx:737
 TProfile2D.cxx:738
 TProfile2D.cxx:739
 TProfile2D.cxx:740
 TProfile2D.cxx:741
 TProfile2D.cxx:742
 TProfile2D.cxx:743
 TProfile2D.cxx:744
 TProfile2D.cxx:745
 TProfile2D.cxx:746
 TProfile2D.cxx:747
 TProfile2D.cxx:748
 TProfile2D.cxx:749
 TProfile2D.cxx:750
 TProfile2D.cxx:751
 TProfile2D.cxx:752
 TProfile2D.cxx:753
 TProfile2D.cxx:754
 TProfile2D.cxx:755
 TProfile2D.cxx:756
 TProfile2D.cxx:757
 TProfile2D.cxx:758
 TProfile2D.cxx:759
 TProfile2D.cxx:760
 TProfile2D.cxx:761
 TProfile2D.cxx:762
 TProfile2D.cxx:763
 TProfile2D.cxx:764
 TProfile2D.cxx:765
 TProfile2D.cxx:766
 TProfile2D.cxx:767
 TProfile2D.cxx:768
 TProfile2D.cxx:769
 TProfile2D.cxx:770
 TProfile2D.cxx:771
 TProfile2D.cxx:772
 TProfile2D.cxx:773
 TProfile2D.cxx:774
 TProfile2D.cxx:775
 TProfile2D.cxx:776
 TProfile2D.cxx:777
 TProfile2D.cxx:778
 TProfile2D.cxx:779
 TProfile2D.cxx:780
 TProfile2D.cxx:781
 TProfile2D.cxx:782
 TProfile2D.cxx:783
 TProfile2D.cxx:784
 TProfile2D.cxx:785
 TProfile2D.cxx:786
 TProfile2D.cxx:787
 TProfile2D.cxx:788
 TProfile2D.cxx:789
 TProfile2D.cxx:790
 TProfile2D.cxx:791
 TProfile2D.cxx:792
 TProfile2D.cxx:793
 TProfile2D.cxx:794
 TProfile2D.cxx:795
 TProfile2D.cxx:796
 TProfile2D.cxx:797
 TProfile2D.cxx:798
 TProfile2D.cxx:799
 TProfile2D.cxx:800
 TProfile2D.cxx:801
 TProfile2D.cxx:802
 TProfile2D.cxx:803
 TProfile2D.cxx:804
 TProfile2D.cxx:805
 TProfile2D.cxx:806
 TProfile2D.cxx:807
 TProfile2D.cxx:808
 TProfile2D.cxx:809
 TProfile2D.cxx:810
 TProfile2D.cxx:811
 TProfile2D.cxx:812
 TProfile2D.cxx:813
 TProfile2D.cxx:814
 TProfile2D.cxx:815
 TProfile2D.cxx:816
 TProfile2D.cxx:817
 TProfile2D.cxx:818
 TProfile2D.cxx:819
 TProfile2D.cxx:820
 TProfile2D.cxx:821
 TProfile2D.cxx:822
 TProfile2D.cxx:823
 TProfile2D.cxx:824
 TProfile2D.cxx:825
 TProfile2D.cxx:826
 TProfile2D.cxx:827
 TProfile2D.cxx:828
 TProfile2D.cxx:829
 TProfile2D.cxx:830
 TProfile2D.cxx:831
 TProfile2D.cxx:832
 TProfile2D.cxx:833
 TProfile2D.cxx:834
 TProfile2D.cxx:835
 TProfile2D.cxx:836
 TProfile2D.cxx:837
 TProfile2D.cxx:838
 TProfile2D.cxx:839
 TProfile2D.cxx:840
 TProfile2D.cxx:841
 TProfile2D.cxx:842
 TProfile2D.cxx:843
 TProfile2D.cxx:844
 TProfile2D.cxx:845
 TProfile2D.cxx:846
 TProfile2D.cxx:847
 TProfile2D.cxx:848
 TProfile2D.cxx:849
 TProfile2D.cxx:850
 TProfile2D.cxx:851
 TProfile2D.cxx:852
 TProfile2D.cxx:853
 TProfile2D.cxx:854
 TProfile2D.cxx:855
 TProfile2D.cxx:856
 TProfile2D.cxx:857
 TProfile2D.cxx:858
 TProfile2D.cxx:859
 TProfile2D.cxx:860
 TProfile2D.cxx:861
 TProfile2D.cxx:862
 TProfile2D.cxx:863
 TProfile2D.cxx:864
 TProfile2D.cxx:865
 TProfile2D.cxx:866
 TProfile2D.cxx:867
 TProfile2D.cxx:868
 TProfile2D.cxx:869
 TProfile2D.cxx:870
 TProfile2D.cxx:871
 TProfile2D.cxx:872
 TProfile2D.cxx:873
 TProfile2D.cxx:874
 TProfile2D.cxx:875
 TProfile2D.cxx:876
 TProfile2D.cxx:877
 TProfile2D.cxx:878
 TProfile2D.cxx:879
 TProfile2D.cxx:880
 TProfile2D.cxx:881
 TProfile2D.cxx:882
 TProfile2D.cxx:883
 TProfile2D.cxx:884
 TProfile2D.cxx:885
 TProfile2D.cxx:886
 TProfile2D.cxx:887
 TProfile2D.cxx:888
 TProfile2D.cxx:889
 TProfile2D.cxx:890
 TProfile2D.cxx:891
 TProfile2D.cxx:892
 TProfile2D.cxx:893
 TProfile2D.cxx:894
 TProfile2D.cxx:895
 TProfile2D.cxx:896
 TProfile2D.cxx:897
 TProfile2D.cxx:898
 TProfile2D.cxx:899
 TProfile2D.cxx:900
 TProfile2D.cxx:901
 TProfile2D.cxx:902
 TProfile2D.cxx:903
 TProfile2D.cxx:904
 TProfile2D.cxx:905
 TProfile2D.cxx:906
 TProfile2D.cxx:907
 TProfile2D.cxx:908
 TProfile2D.cxx:909
 TProfile2D.cxx:910
 TProfile2D.cxx:911
 TProfile2D.cxx:912
 TProfile2D.cxx:913
 TProfile2D.cxx:914
 TProfile2D.cxx:915
 TProfile2D.cxx:916
 TProfile2D.cxx:917
 TProfile2D.cxx:918
 TProfile2D.cxx:919
 TProfile2D.cxx:920
 TProfile2D.cxx:921
 TProfile2D.cxx:922
 TProfile2D.cxx:923
 TProfile2D.cxx:924
 TProfile2D.cxx:925
 TProfile2D.cxx:926
 TProfile2D.cxx:927
 TProfile2D.cxx:928
 TProfile2D.cxx:929
 TProfile2D.cxx:930
 TProfile2D.cxx:931
 TProfile2D.cxx:932
 TProfile2D.cxx:933
 TProfile2D.cxx:934
 TProfile2D.cxx:935
 TProfile2D.cxx:936
 TProfile2D.cxx:937
 TProfile2D.cxx:938
 TProfile2D.cxx:939
 TProfile2D.cxx:940
 TProfile2D.cxx:941
 TProfile2D.cxx:942
 TProfile2D.cxx:943
 TProfile2D.cxx:944
 TProfile2D.cxx:945
 TProfile2D.cxx:946
 TProfile2D.cxx:947
 TProfile2D.cxx:948
 TProfile2D.cxx:949
 TProfile2D.cxx:950
 TProfile2D.cxx:951
 TProfile2D.cxx:952
 TProfile2D.cxx:953
 TProfile2D.cxx:954
 TProfile2D.cxx:955
 TProfile2D.cxx:956
 TProfile2D.cxx:957
 TProfile2D.cxx:958
 TProfile2D.cxx:959
 TProfile2D.cxx:960
 TProfile2D.cxx:961
 TProfile2D.cxx:962
 TProfile2D.cxx:963
 TProfile2D.cxx:964
 TProfile2D.cxx:965
 TProfile2D.cxx:966
 TProfile2D.cxx:967
 TProfile2D.cxx:968
 TProfile2D.cxx:969
 TProfile2D.cxx:970
 TProfile2D.cxx:971
 TProfile2D.cxx:972
 TProfile2D.cxx:973
 TProfile2D.cxx:974
 TProfile2D.cxx:975
 TProfile2D.cxx:976
 TProfile2D.cxx:977
 TProfile2D.cxx:978
 TProfile2D.cxx:979
 TProfile2D.cxx:980
 TProfile2D.cxx:981
 TProfile2D.cxx:982
 TProfile2D.cxx:983
 TProfile2D.cxx:984
 TProfile2D.cxx:985
 TProfile2D.cxx:986
 TProfile2D.cxx:987
 TProfile2D.cxx:988
 TProfile2D.cxx:989
 TProfile2D.cxx:990
 TProfile2D.cxx:991
 TProfile2D.cxx:992
 TProfile2D.cxx:993
 TProfile2D.cxx:994
 TProfile2D.cxx:995
 TProfile2D.cxx:996
 TProfile2D.cxx:997
 TProfile2D.cxx:998
 TProfile2D.cxx:999
 TProfile2D.cxx:1000
 TProfile2D.cxx:1001
 TProfile2D.cxx:1002
 TProfile2D.cxx:1003
 TProfile2D.cxx:1004
 TProfile2D.cxx:1005
 TProfile2D.cxx:1006
 TProfile2D.cxx:1007
 TProfile2D.cxx:1008
 TProfile2D.cxx:1009
 TProfile2D.cxx:1010
 TProfile2D.cxx:1011
 TProfile2D.cxx:1012
 TProfile2D.cxx:1013
 TProfile2D.cxx:1014
 TProfile2D.cxx:1015
 TProfile2D.cxx:1016
 TProfile2D.cxx:1017
 TProfile2D.cxx:1018
 TProfile2D.cxx:1019
 TProfile2D.cxx:1020
 TProfile2D.cxx:1021
 TProfile2D.cxx:1022
 TProfile2D.cxx:1023
 TProfile2D.cxx:1024
 TProfile2D.cxx:1025
 TProfile2D.cxx:1026
 TProfile2D.cxx:1027
 TProfile2D.cxx:1028
 TProfile2D.cxx:1029
 TProfile2D.cxx:1030
 TProfile2D.cxx:1031
 TProfile2D.cxx:1032
 TProfile2D.cxx:1033
 TProfile2D.cxx:1034
 TProfile2D.cxx:1035
 TProfile2D.cxx:1036
 TProfile2D.cxx:1037
 TProfile2D.cxx:1038
 TProfile2D.cxx:1039
 TProfile2D.cxx:1040
 TProfile2D.cxx:1041
 TProfile2D.cxx:1042
 TProfile2D.cxx:1043
 TProfile2D.cxx:1044
 TProfile2D.cxx:1045
 TProfile2D.cxx:1046
 TProfile2D.cxx:1047
 TProfile2D.cxx:1048
 TProfile2D.cxx:1049
 TProfile2D.cxx:1050
 TProfile2D.cxx:1051
 TProfile2D.cxx:1052
 TProfile2D.cxx:1053
 TProfile2D.cxx:1054
 TProfile2D.cxx:1055
 TProfile2D.cxx:1056
 TProfile2D.cxx:1057
 TProfile2D.cxx:1058
 TProfile2D.cxx:1059
 TProfile2D.cxx:1060
 TProfile2D.cxx:1061
 TProfile2D.cxx:1062
 TProfile2D.cxx:1063
 TProfile2D.cxx:1064
 TProfile2D.cxx:1065
 TProfile2D.cxx:1066
 TProfile2D.cxx:1067
 TProfile2D.cxx:1068
 TProfile2D.cxx:1069
 TProfile2D.cxx:1070
 TProfile2D.cxx:1071
 TProfile2D.cxx:1072
 TProfile2D.cxx:1073
 TProfile2D.cxx:1074
 TProfile2D.cxx:1075
 TProfile2D.cxx:1076
 TProfile2D.cxx:1077
 TProfile2D.cxx:1078
 TProfile2D.cxx:1079
 TProfile2D.cxx:1080
 TProfile2D.cxx:1081
 TProfile2D.cxx:1082
 TProfile2D.cxx:1083
 TProfile2D.cxx:1084
 TProfile2D.cxx:1085
 TProfile2D.cxx:1086
 TProfile2D.cxx:1087
 TProfile2D.cxx:1088
 TProfile2D.cxx:1089
 TProfile2D.cxx:1090
 TProfile2D.cxx:1091
 TProfile2D.cxx:1092
 TProfile2D.cxx:1093
 TProfile2D.cxx:1094
 TProfile2D.cxx:1095
 TProfile2D.cxx:1096
 TProfile2D.cxx:1097
 TProfile2D.cxx:1098
 TProfile2D.cxx:1099
 TProfile2D.cxx:1100
 TProfile2D.cxx:1101
 TProfile2D.cxx:1102
 TProfile2D.cxx:1103
 TProfile2D.cxx:1104
 TProfile2D.cxx:1105
 TProfile2D.cxx:1106
 TProfile2D.cxx:1107
 TProfile2D.cxx:1108
 TProfile2D.cxx:1109
 TProfile2D.cxx:1110
 TProfile2D.cxx:1111
 TProfile2D.cxx:1112
 TProfile2D.cxx:1113
 TProfile2D.cxx:1114
 TProfile2D.cxx:1115
 TProfile2D.cxx:1116
 TProfile2D.cxx:1117
 TProfile2D.cxx:1118
 TProfile2D.cxx:1119
 TProfile2D.cxx:1120
 TProfile2D.cxx:1121
 TProfile2D.cxx:1122
 TProfile2D.cxx:1123
 TProfile2D.cxx:1124
 TProfile2D.cxx:1125
 TProfile2D.cxx:1126
 TProfile2D.cxx:1127
 TProfile2D.cxx:1128
 TProfile2D.cxx:1129
 TProfile2D.cxx:1130
 TProfile2D.cxx:1131
 TProfile2D.cxx:1132
 TProfile2D.cxx:1133
 TProfile2D.cxx:1134
 TProfile2D.cxx:1135
 TProfile2D.cxx:1136
 TProfile2D.cxx:1137
 TProfile2D.cxx:1138
 TProfile2D.cxx:1139
 TProfile2D.cxx:1140
 TProfile2D.cxx:1141
 TProfile2D.cxx:1142
 TProfile2D.cxx:1143
 TProfile2D.cxx:1144
 TProfile2D.cxx:1145
 TProfile2D.cxx:1146
 TProfile2D.cxx:1147
 TProfile2D.cxx:1148
 TProfile2D.cxx:1149
 TProfile2D.cxx:1150
 TProfile2D.cxx:1151
 TProfile2D.cxx:1152
 TProfile2D.cxx:1153
 TProfile2D.cxx:1154
 TProfile2D.cxx:1155
 TProfile2D.cxx:1156
 TProfile2D.cxx:1157
 TProfile2D.cxx:1158
 TProfile2D.cxx:1159
 TProfile2D.cxx:1160
 TProfile2D.cxx:1161
 TProfile2D.cxx:1162
 TProfile2D.cxx:1163
 TProfile2D.cxx:1164
 TProfile2D.cxx:1165
 TProfile2D.cxx:1166
 TProfile2D.cxx:1167
 TProfile2D.cxx:1168
 TProfile2D.cxx:1169
 TProfile2D.cxx:1170
 TProfile2D.cxx:1171
 TProfile2D.cxx:1172
 TProfile2D.cxx:1173
 TProfile2D.cxx:1174
 TProfile2D.cxx:1175
 TProfile2D.cxx:1176
 TProfile2D.cxx:1177
 TProfile2D.cxx:1178
 TProfile2D.cxx:1179
 TProfile2D.cxx:1180
 TProfile2D.cxx:1181
 TProfile2D.cxx:1182
 TProfile2D.cxx:1183
 TProfile2D.cxx:1184
 TProfile2D.cxx:1185
 TProfile2D.cxx:1186
 TProfile2D.cxx:1187
 TProfile2D.cxx:1188
 TProfile2D.cxx:1189
 TProfile2D.cxx:1190
 TProfile2D.cxx:1191
 TProfile2D.cxx:1192
 TProfile2D.cxx:1193
 TProfile2D.cxx:1194
 TProfile2D.cxx:1195
 TProfile2D.cxx:1196
 TProfile2D.cxx:1197
 TProfile2D.cxx:1198
 TProfile2D.cxx:1199
 TProfile2D.cxx:1200
 TProfile2D.cxx:1201
 TProfile2D.cxx:1202
 TProfile2D.cxx:1203
 TProfile2D.cxx:1204
 TProfile2D.cxx:1205
 TProfile2D.cxx:1206
 TProfile2D.cxx:1207
 TProfile2D.cxx:1208
 TProfile2D.cxx:1209
 TProfile2D.cxx:1210
 TProfile2D.cxx:1211
 TProfile2D.cxx:1212
 TProfile2D.cxx:1213
 TProfile2D.cxx:1214
 TProfile2D.cxx:1215
 TProfile2D.cxx:1216
 TProfile2D.cxx:1217
 TProfile2D.cxx:1218
 TProfile2D.cxx:1219
 TProfile2D.cxx:1220
 TProfile2D.cxx:1221
 TProfile2D.cxx:1222
 TProfile2D.cxx:1223
 TProfile2D.cxx:1224
 TProfile2D.cxx:1225
 TProfile2D.cxx:1226
 TProfile2D.cxx:1227
 TProfile2D.cxx:1228
 TProfile2D.cxx:1229
 TProfile2D.cxx:1230
 TProfile2D.cxx:1231
 TProfile2D.cxx:1232
 TProfile2D.cxx:1233
 TProfile2D.cxx:1234
 TProfile2D.cxx:1235
 TProfile2D.cxx:1236
 TProfile2D.cxx:1237
 TProfile2D.cxx:1238
 TProfile2D.cxx:1239
 TProfile2D.cxx:1240
 TProfile2D.cxx:1241
 TProfile2D.cxx:1242
 TProfile2D.cxx:1243
 TProfile2D.cxx:1244
 TProfile2D.cxx:1245
 TProfile2D.cxx:1246
 TProfile2D.cxx:1247
 TProfile2D.cxx:1248
 TProfile2D.cxx:1249
 TProfile2D.cxx:1250
 TProfile2D.cxx:1251
 TProfile2D.cxx:1252
 TProfile2D.cxx:1253
 TProfile2D.cxx:1254
 TProfile2D.cxx:1255
 TProfile2D.cxx:1256
 TProfile2D.cxx:1257
 TProfile2D.cxx:1258
 TProfile2D.cxx:1259
 TProfile2D.cxx:1260
 TProfile2D.cxx:1261
 TProfile2D.cxx:1262
 TProfile2D.cxx:1263
 TProfile2D.cxx:1264
 TProfile2D.cxx:1265
 TProfile2D.cxx:1266
 TProfile2D.cxx:1267
 TProfile2D.cxx:1268
 TProfile2D.cxx:1269
 TProfile2D.cxx:1270
 TProfile2D.cxx:1271
 TProfile2D.cxx:1272
 TProfile2D.cxx:1273
 TProfile2D.cxx:1274
 TProfile2D.cxx:1275
 TProfile2D.cxx:1276
 TProfile2D.cxx:1277
 TProfile2D.cxx:1278
 TProfile2D.cxx:1279
 TProfile2D.cxx:1280
 TProfile2D.cxx:1281
 TProfile2D.cxx:1282
 TProfile2D.cxx:1283
 TProfile2D.cxx:1284
 TProfile2D.cxx:1285
 TProfile2D.cxx:1286
 TProfile2D.cxx:1287
 TProfile2D.cxx:1288
 TProfile2D.cxx:1289
 TProfile2D.cxx:1290
 TProfile2D.cxx:1291
 TProfile2D.cxx:1292
 TProfile2D.cxx:1293
 TProfile2D.cxx:1294
 TProfile2D.cxx:1295
 TProfile2D.cxx:1296
 TProfile2D.cxx:1297
 TProfile2D.cxx:1298
 TProfile2D.cxx:1299
 TProfile2D.cxx:1300
 TProfile2D.cxx:1301
 TProfile2D.cxx:1302
 TProfile2D.cxx:1303
 TProfile2D.cxx:1304
 TProfile2D.cxx:1305
 TProfile2D.cxx:1306
 TProfile2D.cxx:1307
 TProfile2D.cxx:1308
 TProfile2D.cxx:1309
 TProfile2D.cxx:1310
 TProfile2D.cxx:1311
 TProfile2D.cxx:1312
 TProfile2D.cxx:1313
 TProfile2D.cxx:1314
 TProfile2D.cxx:1315
 TProfile2D.cxx:1316
 TProfile2D.cxx:1317
 TProfile2D.cxx:1318
 TProfile2D.cxx:1319
 TProfile2D.cxx:1320
 TProfile2D.cxx:1321
 TProfile2D.cxx:1322
 TProfile2D.cxx:1323
 TProfile2D.cxx:1324
 TProfile2D.cxx:1325
 TProfile2D.cxx:1326
 TProfile2D.cxx:1327
 TProfile2D.cxx:1328
 TProfile2D.cxx:1329
 TProfile2D.cxx:1330
 TProfile2D.cxx:1331
 TProfile2D.cxx:1332
 TProfile2D.cxx:1333
 TProfile2D.cxx:1334
 TProfile2D.cxx:1335
 TProfile2D.cxx:1336
 TProfile2D.cxx:1337
 TProfile2D.cxx:1338
 TProfile2D.cxx:1339
 TProfile2D.cxx:1340
 TProfile2D.cxx:1341
 TProfile2D.cxx:1342
 TProfile2D.cxx:1343
 TProfile2D.cxx:1344
 TProfile2D.cxx:1345
 TProfile2D.cxx:1346
 TProfile2D.cxx:1347
 TProfile2D.cxx:1348
 TProfile2D.cxx:1349
 TProfile2D.cxx:1350
 TProfile2D.cxx:1351
 TProfile2D.cxx:1352
 TProfile2D.cxx:1353
 TProfile2D.cxx:1354
 TProfile2D.cxx:1355
 TProfile2D.cxx:1356
 TProfile2D.cxx:1357
 TProfile2D.cxx:1358
 TProfile2D.cxx:1359
 TProfile2D.cxx:1360
 TProfile2D.cxx:1361
 TProfile2D.cxx:1362
 TProfile2D.cxx:1363
 TProfile2D.cxx:1364
 TProfile2D.cxx:1365
 TProfile2D.cxx:1366
 TProfile2D.cxx:1367
 TProfile2D.cxx:1368
 TProfile2D.cxx:1369
 TProfile2D.cxx:1370
 TProfile2D.cxx:1371
 TProfile2D.cxx:1372
 TProfile2D.cxx:1373
 TProfile2D.cxx:1374
 TProfile2D.cxx:1375
 TProfile2D.cxx:1376
 TProfile2D.cxx:1377
 TProfile2D.cxx:1378
 TProfile2D.cxx:1379
 TProfile2D.cxx:1380
 TProfile2D.cxx:1381
 TProfile2D.cxx:1382
 TProfile2D.cxx:1383
 TProfile2D.cxx:1384
 TProfile2D.cxx:1385
 TProfile2D.cxx:1386
 TProfile2D.cxx:1387
 TProfile2D.cxx:1388
 TProfile2D.cxx:1389
 TProfile2D.cxx:1390
 TProfile2D.cxx:1391
 TProfile2D.cxx:1392
 TProfile2D.cxx:1393
 TProfile2D.cxx:1394
 TProfile2D.cxx:1395
 TProfile2D.cxx:1396
 TProfile2D.cxx:1397
 TProfile2D.cxx:1398
 TProfile2D.cxx:1399
 TProfile2D.cxx:1400
 TProfile2D.cxx:1401
 TProfile2D.cxx:1402
 TProfile2D.cxx:1403
 TProfile2D.cxx:1404
 TProfile2D.cxx:1405
 TProfile2D.cxx:1406
 TProfile2D.cxx:1407
 TProfile2D.cxx:1408
 TProfile2D.cxx:1409
 TProfile2D.cxx:1410
 TProfile2D.cxx:1411
 TProfile2D.cxx:1412
 TProfile2D.cxx:1413
 TProfile2D.cxx:1414
 TProfile2D.cxx:1415
 TProfile2D.cxx:1416
 TProfile2D.cxx:1417
 TProfile2D.cxx:1418
 TProfile2D.cxx:1419
 TProfile2D.cxx:1420
 TProfile2D.cxx:1421
 TProfile2D.cxx:1422
 TProfile2D.cxx:1423
 TProfile2D.cxx:1424
 TProfile2D.cxx:1425
 TProfile2D.cxx:1426
 TProfile2D.cxx:1427
 TProfile2D.cxx:1428
 TProfile2D.cxx:1429
 TProfile2D.cxx:1430
 TProfile2D.cxx:1431
 TProfile2D.cxx:1432
 TProfile2D.cxx:1433
 TProfile2D.cxx:1434
 TProfile2D.cxx:1435
 TProfile2D.cxx:1436
 TProfile2D.cxx:1437
 TProfile2D.cxx:1438
 TProfile2D.cxx:1439
 TProfile2D.cxx:1440
 TProfile2D.cxx:1441
 TProfile2D.cxx:1442
 TProfile2D.cxx:1443
 TProfile2D.cxx:1444
 TProfile2D.cxx:1445
 TProfile2D.cxx:1446
 TProfile2D.cxx:1447
 TProfile2D.cxx:1448
 TProfile2D.cxx:1449
 TProfile2D.cxx:1450
 TProfile2D.cxx:1451
 TProfile2D.cxx:1452
 TProfile2D.cxx:1453
 TProfile2D.cxx:1454
 TProfile2D.cxx:1455
 TProfile2D.cxx:1456
 TProfile2D.cxx:1457
 TProfile2D.cxx:1458
 TProfile2D.cxx:1459
 TProfile2D.cxx:1460
 TProfile2D.cxx:1461
 TProfile2D.cxx:1462
 TProfile2D.cxx:1463
 TProfile2D.cxx:1464
 TProfile2D.cxx:1465
 TProfile2D.cxx:1466
 TProfile2D.cxx:1467
 TProfile2D.cxx:1468
 TProfile2D.cxx:1469
 TProfile2D.cxx:1470
 TProfile2D.cxx:1471
 TProfile2D.cxx:1472
 TProfile2D.cxx:1473
 TProfile2D.cxx:1474
 TProfile2D.cxx:1475
 TProfile2D.cxx:1476
 TProfile2D.cxx:1477
 TProfile2D.cxx:1478
 TProfile2D.cxx:1479
 TProfile2D.cxx:1480
 TProfile2D.cxx:1481
 TProfile2D.cxx:1482
 TProfile2D.cxx:1483
 TProfile2D.cxx:1484
 TProfile2D.cxx:1485
 TProfile2D.cxx:1486
 TProfile2D.cxx:1487
 TProfile2D.cxx:1488
 TProfile2D.cxx:1489
 TProfile2D.cxx:1490
 TProfile2D.cxx:1491
 TProfile2D.cxx:1492
 TProfile2D.cxx:1493
 TProfile2D.cxx:1494
 TProfile2D.cxx:1495
 TProfile2D.cxx:1496
 TProfile2D.cxx:1497
 TProfile2D.cxx:1498
 TProfile2D.cxx:1499
 TProfile2D.cxx:1500
 TProfile2D.cxx:1501
 TProfile2D.cxx:1502
 TProfile2D.cxx:1503
 TProfile2D.cxx:1504
 TProfile2D.cxx:1505
 TProfile2D.cxx:1506
 TProfile2D.cxx:1507
 TProfile2D.cxx:1508
 TProfile2D.cxx:1509
 TProfile2D.cxx:1510
 TProfile2D.cxx:1511
 TProfile2D.cxx:1512
 TProfile2D.cxx:1513
 TProfile2D.cxx:1514
 TProfile2D.cxx:1515
 TProfile2D.cxx:1516
 TProfile2D.cxx:1517
 TProfile2D.cxx:1518
 TProfile2D.cxx:1519
 TProfile2D.cxx:1520
 TProfile2D.cxx:1521
 TProfile2D.cxx:1522
 TProfile2D.cxx:1523
 TProfile2D.cxx:1524