ROOT logo
// Author: Stefan Schmitt
// DESY, 13/10/08

//  Version 13, new methods for derived classes and small bug fix
//
//  History:
//    Version 12, report singular matrices
//    Version 11, reduce the amount of printout
//    Version 10, more correct definition of the L curve, update references
//    Version 9, faster matrix inversion and skip edge points for L-curve scan
//    Version 8, replace all TMatrixSparse matrix operations by private code
//    Version 7, fix problem with TMatrixDSparse,TMatrixD multiplication
//    Version 6, replace class XY by std::pair
//    Version 5, replace run-time dynamic arrays by new and delete[]
//    Version 4, fix new bug from V3 with initial regularisation condition
//    Version 3, fix bug with initial regularisation condition
//    Version 2, with improved ScanLcurve() algorithm
//    Version 1, added ScanLcurve() method
//    Version 0, stable version of basic unfolding algorithm

////////////////////////////////////////////////////////////////////////
//
// TUnfold solves the inverse problem
//
//   chi**2 = 1/2 * (y-Ax)# V (y-Ax) + tau (L(x-x0))# L(x-x0)
//
// where # means that the matrix is transposed
//
// Monte Carlo input
// -----------------
//   y: vector of measured quantities  (dimension ny)
//   V: inverse of covariance matrix for y (dimension ny x ny)
//      in many cases V is diagonal and calculated from the errors of y
//   A: migration matrix               (dimension ny x nx)
//   x: unknown underlying distribution (dimension nx)
//
// Regularisation
// --------------
//   tau: parameter, defining the regularisation strength
//   L: matrix of regularisation conditions (dimension nl x nx)
//   x0: bias distribution
//                                                                     
// and chi**2 is minimized as a function of x                        
//                                                                      
// This applies to a very large number of problems, where the measured
// distribution y is a linear superposition of several Monte Carlo shapes
// and the sum of these shapes gives the output distribution x
//
//
//
// Some random examples:
// ======================
//   (1) measure a cross-section as a function of, say, E_T(detector)
//        and unfold it to obtain the underlying distribution E_T(generator)
//   (2) measure a lifetime distribution and unfold the contributions from
//        different flavours
//   (3) measure the transverse mass and decay angle
//        and unfold for the true mass distribution plus background
//
//
//
// References:
// ===========
// A nice overview of the method is given in:
//  The L-curve and Its Use in the Numerical Treatment of Inverse Problems
//  (2000) by P. C. Hansen, in Computational Inverse Problems in
//  Electrocardiology, ed. P. Johnston,
//  Advances in Computational Bioengineering
//  http://www.imm.dtu.dk/~pch/TR/Lcurve.ps 
// The relevant equations are (1), (2) for the unfolding
// and (14) for the L-curve curvature definition
//
// Related literature on unfolding:
//  Talk by V. Blobel, Terascale Statistics school
//   https://indico.desy.de/contributionDisplay.py?contribId=23&confId=1149
//  References quoted in Blobel's talk:
//   Per Chistian Hansen, Rank-Deficient and Discrete Ill-posed Problems,
//        Siam (1998)
//   Jari Kaipio and Erkki Somersalo, Statistical and Computational 
//        Inverse problems, Springer (2005)
//
//
//
// Implementation
// ==============
// The result of the unfolding is calculated as follows:
//
//    Lsquared = L#L                 regularisation conditions squared
//
//    Einv  = ((A# V A)+tau Lsquared)    is the inverse covariance matrix of x
//
//    E = inverse(Einv)                  is the covariance matrix of x
//
//    x = E (A# V y + tau Lsquared x0)   is the result
//
//
//
// Warning:
// ========
//  The algorithm is based on "standard" matrix inversion, with the
//  known limitations in numerical accuracy and computing cost for
//  matrices with large dimensions.
//
//  Thus the algorithm should not used for large dimensions of x and y
//    nx should not be much larger than 200
//    ny should not be much larger than 1000
//
//
//
// Example of using TUnfold:
// =========================
// imagine a 2-dimensional histogram is filled, named A
//    y-axis: generated quantity (e.g. 10 bins)
//    x-axis: reconstructed quantity (e.g. 20 bin)
// The data are filled in a 1-dimensional histogram, named y
// Note1: ALWAYS choose a higher number of bins on the reconstructed side
//         as compared to the generated size!
// Note2: the events which are generated but not reconstructed
//         have to be added to the appropriate overflow bins of A
// Note3: make sure all bins have sufficient statistics and their error is
//         non-zero. By default, bins with zero error are simply skipped;
//         however, this may cause problems if You try to unfold something
//         which depends on these input bins.
//
// code fragment (with histograms A and y filled):
//
//      TUnfold unfold(A,TUnfold::kHistMapOutputHoriz);
//      Double_t tau=1.E-4;
//      Double_t biasScale=0.0;
//      unfold.DoUnfold(tau,y,biasScale);
//      TH1D *x=unfold.GetOutput("x","myVariable");
//      TH2D *rhoij=unfold.GetRhoIJ("correlation","myVariable");
//
// will create histograms "x" and "correlation" from A and y.
// if tau is very large, the output is biased to the generated distribution
// if tau is very small, the output will show oscillations
// and large entries in the correlation matrix
//
//
//
// Proper choice of tau
// ====================
// One of the most difficult questions is about the choice of tau. The most
// common method is the L-curve method: a two-dimensional curve is plotted
//   x-axis: log10(chisquare)
//   y-axis: log10(regularisation condition)
// In many cases this curve has an L-shape. The best choice of tau is in the
// kink of the L
//
// Within TUnfold a simple version of the L-curve analysis is included.
// It tests a given number of points in a predefined tau-range and searches
// for the maximum of the curvature in the L-curve (kink position). 
//
// Example: scan tau and produce the L-curve plot
//
// Code fragment: assume A and y are filled
//
//      TUnfold unfold(A,TUnfold::kHistMapOutputHoriz);
//
//      unfold.SetInput(y);
//
//      Int_t nScan=30;
//      Double_t tauMin=1.E-10;
//      Double_t tauMax=1.0;
//      Int_t iBest;
//      TSpline *logTauX,*logTauY;
//      TGraph *lCurve;
//
//      iBest=unfold.ScanLcurve(nScan,tauMin,tauMax,&lCurve);
//
//      std::cout<<"tau="<<unfold.GetTau()<<"\n";
//
//      TH1D *x=unfold.GetOutput("x","myVariable");
//      TH2D *rhoij=unfold.GetRhoIJ("correlation","myVariable");
//
// This creates
//    logTauX: the L-curve's x-coordinate as a function of log(tau) 
//    logTauY: the L-curve's y-coordinate as a function of log(tau) 
//    lCurve: a graph of the L-curve
//    x,rhoij: unfolding result for best choice of tau
//    iBest: the coordinate/spline knot number with the best choice of tau 
//
// Note: always check the L curve after unfolding. The algorithm is not
//    perfect
//
//
// Bin averaging of the output
// ===========================
// Sometimes it is useful to unfold for a fine binning in x and
// calculate the final result with a smaller number of bins. The advantage
// is a reduction in the correlation coefficients if bins are averaged.
// For this type of averaging the full error matrix has to be used.
// There are methods in TUnfold to support this type of calculation
// Example:
//    The vector x has dimension 49, it consists of 7x7 bins
//      in two variables (Pt,Eta)
//    The unfolding result is to be presented as one-dimensional projections
//    in (Pt) and (Eta)
//    The bins of x are mapped as: bins 1..7 the first Eta bin
//                                 bins 2..14 the second Eta bin
//                                 ...
//                                 bins 1,8,15,... the first Pt bin
//                                 ...
// code fragment:
//
//      TUnfold unfold(A,TUnfold::kHistMapOutputHoriz);
//      Double_t tau=1.E-4;
//      Double_t biasScale=0.0;
//      unfold.DoUnfold(tau,y,biasScale);
//      Int_t binMapEta[49+2];
//      Int_t binMapPt[49+2];
//      // overflow and underflow bins are not used
//      binMapEta[0]=-1;
//      binMapEta[49+1]=-1;
//      binMapPt[0]=-1;
//      binMapPt[49+1]=-1;
//      for(Int_t i=1;i<=49;i++) {
//         // all bins (i) with the same (i-1)/7 are added
//         binMapEta[i] = (i-1)/7 +1;
//         // all bins (i) with the same (i-1)%7 are added
//         binMapPt[i]  = (i-1)%7 +1;
//      }
//      TH1D *etaHist=new TH1D("eta(unfolded)",";eta",7,etamin,etamax);
//      TH1D *etaCorr=new TH2D("eta(unfolded)",";eta;eta",7,etamin,etamax,7,etamin,etamax);
//      TH1D *ptHist=new TH1D("pt(unfolded)",";pt",7,ptmin,ptmax);
//      TH1D *ptCorr=new TH2D("pt(unfolded)",";pt;pt",7,ptmin,ptmax,7,ptmin,ptmax);
//      unfold.GetOutput(etaHist,binMapEta);
//      unfold.GetRhoIJ(etaCorrt,binMapEta);
//      unfold.GetOutput(ptHist,binMapPt);
//      unfold.GetRhoIJ(ptCorrt,binMapPt);
//
//
//
// Alternative Regularisation conditions
// =====================================
// Regularisation is needed for most unfolding problems, in order to avoid
// large oscillations and large correlations on the output bins.
// It means that some extra conditions are applied on the output bins
//
// Within TUnfold these conditions are posed on the difference (x-x0), where
//    x:  unfolding output
//    x0: the bias distribution, by default calculated from
//        the input matrix A. There is a method SetBias() to change the
//        bias distribution. 
//        The 3rd argument to DoUnfold() is a scale factor applied to the bias
//          bias_default[j] = sum_i A[i][j]
//          x0[j] = scaleBias*bias[j]
//        The scale factor can be used to
//         (a) completely suppress the bias by setting it to zero
//         (b) compensate differences in the normalisation between data
//             and Monte Carlo
//
// If the regularisation is strong, i.e. large parameter tau,
// then the distribution x or its derivatives will look like the bias 
// distribution. If the parameter tau is small, the distribution x is 
// independent of the bias.
//
// Three basic types of regularisation are implemented in TUnfold
//
//    condition            regularisation
//  ------------------------------------------------------
//    kRegModeNone         none
//    kRegModeSize         minimize the size of (x-x0)
//    kRegModeDerivative   minimize the 1st derivative of (x-x0)
//    kRegModeCurvature    minimize the 2nd derivative of (x-x0)
//
// kRegModeSize is the regularisation scheme which usually is found in
// literature. In addition, the bias usually is not present
// (bias scale factor is zero).
//
// The non-standard regularisation schemes kRegModeDerivative and 
// kRegModeCurvature have the nice feature that they create correlations
// between x-bins, whereas the non-regularized unfolding tends to create 
// negative correlations between bins. For these regularisation schemes the
// parameter tau could be tuned such that the correlations are smallest, 
// as an alternative to the L-curve method.
//
// If kRegModeSize is chosen or if x is a smooth function through all bins,
// the regularisation condition can be set on all bins together by giving
// the appropriate argument in the constructor (see examples above).
//
// If x is composed of independent groups of bins (for example,
// signal and background binning in two variables), it may be necessary to
// set regularisation conditions for the individual groups of bins.
// In this case,  give  kRegModeNone  in the constructor and specify
// the bin grouping with calls to
//          RegularizeBins()   specify a 1-dimensional group of bins
//          RegularizeBins2D() specify a 2-dimensional group of bins
//
// For ultimate flexibility, the regularisation condition can be set on each
// bin individually
//  -> give  kRegModeNone  in the constructor and use
//      RegularizeSize()        regularize one bin   
//      RegularizeDerivative()  regularize the slope given by two bins
//      RegularizeCurvature()   regularize the curvature given by three bins


#include <iostream>
#include <TMatrixD.h>
#include <TMatrixDSparse.h>
#include <TMatrixDSym.h>
#include <TMath.h>
#include <TDecompBK.h>

#include <TUnfold.h>

#include <map>
#include <vector>


// this option enables the use of Schur complement for matrix inversion
// with large diagonal sub-matrices
#define SCHUR_COMPLEMENT_MATRIX_INVERSION

// this option enables pre-conditioning of matrices prior to inversion
// This type of preconditioning is expected to improve the numerical
// accuracy for the symmetric and positive definite matrices connected
// to unfolding problems. Also, the determinant is more likely to be non-zero
// in case of non-singular matrices
#define INVERT_WITH_CONDITIONING

// this option saves the spline of the L curve curvature to a file 
// named splinec.ps for debugging

// #define DEBUG_LCURVE


#ifdef DEBUG_LCURVE
#include <TCanvas.h>
#endif

ClassImp(TUnfold)
//______________________________________________________________________________
void TUnfold::InitTUnfold(void)
{
   // reset all data members
   fXToHist.Set(0);
   fHistToX.Set(0);
   fSumOverY.Set(0);
   fA = 0;
   fLsquared = 0;
   fV = 0;
   fY = 0;
   fX0 = 0;
   fTau = 0.0;
   fBiasScale = 0.0;
   // output
   fAtV = 0;
   fEinv = 0;
   fE = 0;
   fX = 0;
   fAx = 0;
   fChi2A = 0.0;
   fChi2L = 0.0;
   fRhoMax = 999.0;
   fRhoAvg = -1.0;
}

void TUnfold::DeleteMatrix(TMatrixD **m) {
   if(*m) delete *m;
   *m=0;
}

void TUnfold::DeleteMatrix(TMatrixDSparse **m) {
   if(*m) delete *m;
   *m=0;
}

void TUnfold::ClearResults(void) {
   // delete old results (if any)
   // this function is virtual, so derived classes may flag their results
   // ad non-valid as well
   DeleteMatrix(&fAtV);
   DeleteMatrix(&fEinv);
   DeleteMatrix(&fE);
   DeleteMatrix(&fX);
   DeleteMatrix(&fAx);
   fChi2A = 0.0;
   fChi2L = 0.0;
   fRhoMax = 999.0;
   fRhoAvg = -1.0;
}

TUnfold::TUnfold(void)
{
   // set all matrix pointers to zero
   InitTUnfold();
}

Double_t TUnfold::DoUnfold(void)
{
   // main unfolding algorithm. Declared virtual, because other algorithms
   // could be implemented
   //
   // Purpose: unfold y -> x
   // Data members required:
   //     fA:  matrix to relate x and y
   //     fDA: uncorelated (e.g. statistical) errors on fA
   //     fY:  measured data points
   //     fX0: bias on x
   //     fBiasScale: scale factor for fX0
   //     fV:  inverse of covariance matrix for y
   //     fLsquared: regularisation conditions
   //     fTau: regularisation strength
   // Data members modified:
   //     fEinv: inverse of the covariance matrix of x
   //     fE:    covariance matrix of x
   //     fX:    unfolded data points
   //     fAx:   estimate of y from x
   //     fChi2A:  contribution to chi**2 from y-fAx
   //     fChi2L:  contribution to chi**2 from L*(x-x0)
   //     fRhoMax: maximum global correlation coefficient
   //     fRhoAvg: average global correlation coefficient
   // return code:
   //     fRhoMax   if(fRhoMax>=1.0) then the unfolding has failed!

   ClearResults();
   //
   // get matrix
   //              T
   //            fA fV  = mAt_V
   //
   fAtV=MultiplyMSparseTranspMSparse(*fA,*fV);
   //
   // get
   //       T
   //     fA fV fY + fTau fBiasScale Lsquared fX0 = rhs
   //
   TMatrixDSparse *rhs=MultiplyMSparseM(*fAtV,*fY);
   if (fBiasScale != 0.0) {
     TMatrixDSparse *rhs2=MultiplyMSparseM(*fLsquared,*fX0);
      AddMSparse(*rhs,(fTau * fBiasScale),(*rhs2));
      delete rhs2;
   }
   //
   // get matrix
   //              T
   //           (fA fV)fA + fTau*fLsquared  = fEinv
   fEinv=MultiplyMSparseMSparse(*fAtV,*fA);
   AddMSparse(*fEinv,fTau,*fLsquared);

   //
   // get matrix
   //             -1
   //        fEinv    = fE
   //
   fE = InvertMSparse(*fEinv);
   //
   // get result
   //        fE rhs  = x
   //
   fX = new TMatrixD(*fE, TMatrixD::kMult, *rhs);
   //
   // get result
   //        fA x  =  fAx
   //
   fAx = MultiplyMSparseM(*fA,*fX);

   //
   // clean up
   //
   delete rhs;

   //
   // calculate chi**2 etc
   //
   CalculateChi2Rho();

   return fRhoMax;
}

void TUnfold::CalculateChi2Rho(void)
{
   // Calculate chi**2 and maximum global correlation
   // Data members required:
   //   fY,fAx,fV,fX,fX0,fBiasScale,fTau,fLsquared
   // Data members modified:
   //   fChi2A,fChi2L,fRhoMax,fRhoAvg

   // chi**2 contribution from (y-Ax)V(y-Ax)
   TMatrixD dy(*fY, TMatrixD::kMinus, *fAx);
   fChi2A = MultiplyVecMSparseVec(*fV,dy);
   TMatrixD dx(*fX, TMatrixD::kMinus, fBiasScale * (*fX0));
   fChi2L = fTau*MultiplyVecMSparseVec(*fLsquared,dx);
   // maximum global correlation coefficient
   Double_t rho_squared_max = 0.0;
   Double_t rho_sum = 0.0;
   Int_t n_rho=0;
   for (int ix = 0; ix < GetNx(); ix++) {
      Double_t rho_squared =
          1. - 1. / ((*fE) (ix, ix) * (*fEinv) (ix, ix));
      if (rho_squared > rho_squared_max)
         rho_squared_max = rho_squared;
      if(rho_squared>0.0) {
        rho_sum += TMath::Sqrt(rho_squared);
        n_rho++;
      }
   }
   fRhoMax = TMath::Sqrt(rho_squared_max);
   fRhoAvg = (n_rho>0) ? (rho_sum/n_rho) : -1.0;

}

Double_t TUnfold::MultiplyVecMSparseVec(TMatrixDSparse const &a,TMatrixD const &v)
{
   // calculate the product v# a v
   // where v# is the transposed vector v
   //    a: a matrix
   //    v: a vector
   Double_t r=0.0;
   if((a.GetNrows()!=a.GetNcols())||
      (v.GetNrows()!=a.GetNrows())||
      (v.GetNcols()!=1)) {
      std::cout<<"TUnfold::MultiplyVecMSparseVec inconsistent row/col numbers "
               <<" a("<<a.GetNrows()<<","<<a.GetNcols()
               <<") v("<<v.GetNrows()<<","<<v.GetNcols()<<")\n";
   }
   const Int_t *a_rows=a.GetRowIndexArray();
   const Int_t *a_cols=a.GetColIndexArray();
   const Double_t *a_data=a.GetMatrixArray();
   for (Int_t irow = 0; irow < a.GetNrows(); irow++) {
      for(Int_t i=a_rows[irow];i<a_rows[irow+1];i++) {
         r += v(irow,0) * a_data[i] *  v(a_cols[i],0);
      }
   }
   return r;
}

TMatrixDSparse *TUnfold::MultiplyMSparseMSparse(TMatrixDSparse const &a,TMatrixDSparse const &b)
{
   // calculate the product of two sparse matrices
   //    a,b: two sparse matrices, where a.GetNcols()==b.GetNrows()
   // this is a replacement for the call
   //    new TMatrixDSparse(a,TMatrixDSparse::kMult,b);
   if(a.GetNcols()!=b.GetNrows()) {
      std::cout<<"TUnfold::MultiplyMSparseMSparse inconsistent row/col number "
               <<a.GetNcols()<<" "<<b.GetNrows()<<"\n";
   }

   TMatrixDSparse *r=new TMatrixDSparse(a.GetNrows(),b.GetNcols());
   const Int_t *a_rows=a.GetRowIndexArray();
   const Int_t *a_cols=a.GetColIndexArray();
   const Double_t *a_data=a.GetMatrixArray();
   const Int_t *b_rows=b.GetRowIndexArray();
   const Int_t *b_cols=b.GetColIndexArray();
   const Double_t *b_data=b.GetMatrixArray();
   // maximum size of the output matrix
   int nMax=0;
   for (Int_t irow = 0; irow < a.GetNrows(); irow++) {
      if(a_rows[irow+1]>a_rows[irow]) nMax += b.GetNcols();
   }
   if(nMax>0) {
      Int_t *r_rows=new Int_t[nMax];
      Int_t *r_cols=new Int_t[nMax];
      Double_t *r_data=new Double_t[nMax];
      Double_t *row_data=new Double_t[b.GetNcols()];
      Int_t n=0;
      for (Int_t irow = 0; irow < a.GetNrows(); irow++) {
         if(a_rows[irow+1]<=a_rows[irow]) continue;
         // clear row data
         for(Int_t icol=0;icol<b.GetNcols();icol++) {
            row_data[icol]=0.0;
         }
         // loop over a-columns in this a-row
         for(Int_t ia=a_rows[irow];ia<a_rows[irow+1];ia++) {
            Int_t k=a_cols[ia];
            // loop over b-columns in b-row k
            for(Int_t ib=b_rows[k];ib<b_rows[k+1];ib++) {
               row_data[b_cols[ib]] += a_data[ia]*b_data[ib];
            }
         }
         // store nonzero elements
         for(Int_t icol=0;icol<b.GetNcols();icol++) {
            if(row_data[icol] != 0.0) {
               r_rows[n]=irow;
               r_cols[n]=icol;
               r_data[n]=row_data[icol];
               n++;
            }
         }
      }
      r->SetMatrixArray(n,r_rows,r_cols,r_data);
      delete [] r_rows;
      delete [] r_cols;
      delete [] r_data;
      delete [] row_data;
   }

   return r;
}


TMatrixDSparse *TUnfold::MultiplyMSparseTranspMSparse(TMatrixDSparse const &a,TMatrixDSparse const &b)
{
   // multiply a transposed Sparse matrix with another Sparse matrix
   //    a:  sparse matrix (to be transposed
   //    b:  sparse matrix
   // this is a replacement for the call
   //    new TMatrixDSparse(TMatrixDSparse(TMatrixDSparse::kTransposed,a),
   //                       TMatrixDSparse::kMult,b)
   if(a.GetNrows() != b.GetNrows()) {
      std::cout<<"TUnfold::MultiplyMSparseTranspMSparse "
               <<"inconsistent row numbers "
               <<a.GetNrows()<<" "<<b.GetNrows()<<"\n";
   }

   TMatrixDSparse *r=new TMatrixDSparse(a.GetNcols(),b.GetNcols());
   const Int_t *a_rows=a.GetRowIndexArray();
   const Int_t *a_cols=a.GetColIndexArray();
   const Double_t *a_data=a.GetMatrixArray();
   const Int_t *b_rows=b.GetRowIndexArray();
   const Int_t *b_cols=b.GetColIndexArray();
   const Double_t *b_data=b.GetMatrixArray();
   // maximum size of the output matrix

   // matrix multiplication
   typedef std::map<Int_t,Double_t> MMatrixRow_t;
   typedef std::map<Int_t, MMatrixRow_t > MMatrix_t;
   MMatrix_t matrix;

   for(Int_t iRowAB=0;iRowAB<a.GetNrows();iRowAB++) {
      for(Int_t ia=a_rows[iRowAB];ia<a_rows[iRowAB+1];ia++) {
         for(Int_t ib=b_rows[iRowAB];ib<b_rows[iRowAB+1];ib++) {
            // this creates a new row if necessary
            MMatrixRow_t &row=matrix[a_cols[ia]];
            MMatrixRow_t::iterator icol=row.find(b_cols[ib]);
            if(icol!=row.end()) {
               // update existing row
               (*icol).second += a_data[ia]*b_data[ib];
            } else {
               // create new row
               row[b_cols[ib]] = a_data[ia]*b_data[ib];
            }
         }
      }
   }

   Int_t n=0;
   for(MMatrix_t::const_iterator irow=matrix.begin();
       irow!=matrix.end();irow++) {
      n += (*irow).second.size();
   }
   if(n>0) {
      // pack matrix into arrays
      Int_t *r_rows=new Int_t[n];
      Int_t *r_cols=new Int_t[n];
      Double_t *r_data=new Double_t[n];
      n=0;
      for(MMatrix_t::const_iterator irow=matrix.begin();
          irow!=matrix.end();irow++) {
         for(MMatrixRow_t::const_iterator icol=(*irow).second.begin();
             icol!=(*irow).second.end();icol++) {
            r_rows[n]=(*irow).first;
            r_cols[n]=(*icol).first;
            r_data[n]=(*icol).second;
            n++;
         }
      }
      // pack arrays into TMatrixDSparse
      r->SetMatrixArray(n,r_rows,r_cols,r_data);
      delete [] r_rows;
      delete [] r_cols;
      delete [] r_data;
   }

   return r;
}

TMatrixDSparse *TUnfold::MultiplyMSparseM(TMatrixDSparse const &a,TMatrixD const &b)
{
   // multiply a Sparse matrix with a non-sparse matrix
   //    a:  sparse matrix
   //    b:  non-sparse matrix
   // this is a replacement for the call
   //    new TMatrixDSparse(a,TMatrixDSparse::kMult,b);
   if(a.GetNcols()!=b.GetNrows()) {
      std::cout<<"TUnfold::MultiplyMSparseM inconsistent row/col number "
               <<a.GetNcols()<<" "<<b.GetNrows()<<"\n";
   }

   TMatrixDSparse *r=new TMatrixDSparse(a.GetNrows(),b.GetNcols());
   const Int_t *a_rows=a.GetRowIndexArray();
   const Int_t *a_cols=a.GetColIndexArray();
   const Double_t *a_data=a.GetMatrixArray();
   // maximum size of the output matrix
   int nMax=0;
   for (Int_t irow = 0; irow < a.GetNrows(); irow++) {
      if(a_rows[irow+1]-a_rows[irow]>0) nMax += b.GetNcols();
   }
   if(nMax>0) {
      Int_t *r_rows=new Int_t[nMax];
      Int_t *r_cols=new Int_t[nMax];
      Double_t *r_data=new Double_t[nMax];

      Int_t n=0;
      // fill matrix r
      for (Int_t irow = 0; irow < a.GetNrows(); irow++) {
         if(a_rows[irow+1]-a_rows[irow]<=0) continue;
         for(Int_t icol=0;icol<b.GetNcols();icol++) {
            r_rows[n]=irow;
            r_cols[n]=icol;
            r_data[n]=0.0;
            for(Int_t i=a_rows[irow];i<a_rows[irow+1];i++) {
               Int_t j=a_cols[i];
               r_data[n] += a_data[i]*b(j,icol);
            }
            if(r_data[n]!=0.0) n++;
         }
      }

      r->SetMatrixArray(n,r_rows,r_cols,r_data);
      delete [] r_rows;
      delete [] r_cols;
      delete [] r_data;
   }
   return r;
}

void TUnfold::AddMSparse(TMatrixDSparse &dest,Double_t const &f,TMatrixDSparse const &src) {
   // a replacement for
   //     dest += f*src
   const Int_t *dest_rows=dest.GetRowIndexArray();
   const Int_t *dest_cols=dest.GetColIndexArray();
   const Double_t *dest_data=dest.GetMatrixArray();
   const Int_t *src_rows=src.GetRowIndexArray();
   const Int_t *src_cols=src.GetColIndexArray();
   const Double_t *src_data=src.GetMatrixArray();

   if((dest.GetNrows()!=src.GetNrows())||
      (dest.GetNcols()!=src.GetNcols())) {
      std::cout<<"TUnfold::AddMSparse inconsistent row/col number"
               <<" "<<src.GetNrows()<<" "<<dest.GetNrows()
               <<" "<<src.GetNcols()<<" "<<dest.GetNcols()
               <<"\n";
   }
   Int_t nmax=dest.GetNrows()*dest.GetNcols();
   Double_t *result_data=new Double_t[nmax];
   Int_t *result_rows=new Int_t[nmax];
   Int_t *result_cols=new Int_t[nmax];
   Int_t n=0;
   for(Int_t row=0;row<dest.GetNrows();row++) {
      Int_t i_dest=dest_rows[row];
      Int_t i_src=src_rows[row];
      while((i_dest<dest_rows[row+1])||(i_src<src_rows[row+1])) {
         Int_t col_dest=(i_dest<dest_rows[row+1]) ? 
            dest_cols[i_dest] : dest.GetNcols();
         Int_t col_src =(i_src <src_rows[row+1] ) ?
            src_cols [i_src] :  src.GetNcols();
         result_rows[n]=row;
         if(col_dest<col_src) {
            result_cols[n]=col_dest;
            result_data[n]=dest_data[i_dest++];
         } else if(col_dest>col_src) {
            result_cols[n]=col_src;
            result_data[n]=f*src_data[i_src++];
         } else {
            result_cols[n]=col_dest;
            result_data[n]=dest_data[i_dest++]+f*src_data[i_src++];
         }
         if(result_data[n] !=0.0) n++;
      }
   }
   dest.SetMatrixArray(n,result_rows,result_cols,result_data);
   delete [] result_data;
   delete [] result_rows;
   delete [] result_cols;
}

TMatrixD *TUnfold::InvertMSparse(TMatrixDSparse const &A) {
   // get the inverse of a sparse matrix
   //    A: the original matrix
   // this is a replacement of the call
   //    new TMatrixD(TMatrixD::kInverted, a);
   // the matrix inversion is optimized for the case
   // where a large submatrix of A is diagonal

   if(A.GetNcols()!=A.GetNrows()) {
      std::cout<<"TUnfold::InvertMSparse inconsistent row/col number "
               <<A.GetNcols()<<" "<<A.GetNrows()<<"\n";
   }

#ifdef SCHUR_COMPLEMENT_MATRIX_INVERSION

   const Int_t *a_rows=A.GetRowIndexArray();
   const Int_t *a_cols=A.GetColIndexArray();
   const Double_t *a_data=A.GetMatrixArray();

   Int_t nmin=0,nmax=0;
   // find largest diagonal submatrix
   for(Int_t imin=0;imin<A.GetNrows();imin++) {
      Int_t imax=A.GetNrows();
      for(Int_t i2=imin;i2<imax;i2++) {
         for(Int_t i=a_rows[i2];i<a_rows[i2+1];i++) {
            if(a_data[i]==0.0) continue;
            Int_t icol=a_cols[i];
            if(icol<imin) continue; // ignore first part of the matrix
            if(icol==i2) continue; // ignore diagonals
            if(icol<i2) {
               // this row spoils the diagonal matrix, so do not use
               imax=i2;
               break;
            } else {
               // this entry limits imax
               imax=icol;
               break;
            }
         }
      }
      if(imax-imin>nmax-nmin) {
         nmin=imin;
         nmax=imax;
      }
   }
   // if the diagonal part has size zero or one, use standard matrix inversion
   if(nmin>=nmax-1) {
      TMatrixD *r=new TMatrixD(A);
      if(!InvertMConditioned(*r)) {
         std::cout<<"TUnfold::InvertMSparse inversion failed at (1)\n";
      }
      return r;
   } else if((nmin==0)&&(nmax==A.GetNrows())) {
      // if the diagonal part spans the whole matrix,
      //   just set the diagomal elements
      TMatrixD *r=new TMatrixD(A.GetNrows(),A.GetNcols());
      Int_t error=0;
      for(Int_t irow=nmin;irow<nmax;irow++) {
         for(Int_t i=a_rows[irow];i<a_rows[irow+1];i++) {
            if(a_cols[i]==irow) {
               if(a_data[i] !=0.0) (*r)(irow,irow)=1./a_data[i];
               else error++;
            }
         }
      }
      if(error) {
         std::cout<<"TUnfold::InvertMSparse inversion failed at (2)\n";
      }
      return r;
   }

   //  A  B
   // (    )
   //  C  D
   //
   // get inverse of diagonal part
   std::vector<Double_t> Dinv;
   Dinv.resize(nmax-nmin);
   for(Int_t irow=nmin;irow<nmax;irow++) {
      for(Int_t i=a_rows[irow];i<a_rows[irow+1];i++) {
         if(a_cols[i]==irow) {
            if(a_data[i]!=0.0) {
               Dinv[irow-nmin]=1./a_data[i];
            } else {
               Dinv[irow-nmin]=0.0;
            }
            break;
         }
      }
   }
   // B*Dinv and C
   Int_t nBDinv=0,nC=0;
   for(Int_t irow_a=0;irow_a<A.GetNrows();irow_a++) {
      if((irow_a<nmin)||(irow_a>=nmax)) {
         for(Int_t i=a_rows[irow_a];i<a_rows[irow_a+1];i++) {
            Int_t icol=a_cols[i];
            if((icol>=nmin)&&(icol<nmax)) nBDinv++;
         }
      } else {
         for(Int_t i=a_rows[irow_a];i<a_rows[irow_a+1];i++) {
            Int_t icol = a_cols[i];
            if((icol<nmin)||(icol>=nmax)) nC++;
         }
      }
   }
   Int_t *row_BDinv=new Int_t[nBDinv+1];
   Int_t *col_BDinv=new Int_t[nBDinv+1];
   Double_t *data_BDinv=new Double_t[nBDinv+1];

   Int_t *row_C=new Int_t[nC+1];
   Int_t *col_C=new Int_t[nC+1];
   Double_t *data_C=new Double_t[nC+1];

   TMatrixD Aschur(A.GetNrows()-(nmax-nmin),A.GetNcols()-(nmax-nmin));

   nBDinv=0;
   nC=0;
   for(Int_t irow_a=0;irow_a<A.GetNrows();irow_a++) {
      if((irow_a<nmin)||(irow_a>=nmax)) {
         Int_t row=(irow_a<nmin) ? irow_a : (irow_a-(nmax-nmin));
         for(Int_t i=a_rows[irow_a];i<a_rows[irow_a+1];i++) {
            Int_t icol_a=a_cols[i];
            if(icol_a<nmin) {
               Aschur(row,icol_a)=a_data[i];
            } else if(icol_a>=nmax) {
               Aschur(row,icol_a-(nmax-nmin))=a_data[i];
            } else {
               row_BDinv[nBDinv]=row;
               col_BDinv[nBDinv]=icol_a-nmin;
               data_BDinv[nBDinv]=a_data[i]*Dinv[icol_a-nmin];
               nBDinv++;
            }
         }
      } else {
         for(Int_t i=a_rows[irow_a];i<a_rows[irow_a+1];i++) {
            Int_t icol_a=a_cols[i];
            if(icol_a<nmin) {
               row_C[nC]=irow_a-nmin;
               col_C[nC]=icol_a;
               data_C[nC]=a_data[i];
               nC++;
            } else if(icol_a>=nmax) {
               row_C[nC]=irow_a-nmin;
               col_C[nC]=icol_a-(nmax-nmin);
               data_C[nC]=a_data[i];
               nC++;
            }
         }
      }
   }
   TMatrixDSparse BDinv(A.GetNrows()-(nmax-nmin),nmax-nmin);
   BDinv.SetMatrixArray(nBDinv,row_BDinv,col_BDinv,data_BDinv);
   delete[] row_BDinv;
   delete[] col_BDinv;
   delete[] data_BDinv;

   TMatrixDSparse C(nmax-nmin,A.GetNcols()-(nmax-nmin));
   C.SetMatrixArray(nC,row_C,col_C,data_C);
   delete[] row_C;
   delete[] col_C;
   delete[] data_C;

   TMatrixDSparse *BDinvC=MultiplyMSparseMSparse(BDinv,C);
   Aschur -= *BDinvC;
   if(!InvertMConditioned(Aschur)) {
      std::cout<<"TUnfold::InvertMSparse inversion failed at 3\n";
   }

   delete BDinvC;

   TMatrixD *r=new TMatrixD(A.GetNrows(),A.GetNcols());

   for(Int_t row_a=0;row_a<Aschur.GetNrows();row_a++) {
      for(Int_t col_a=0;col_a<Aschur.GetNcols();col_a++) {
         (*r)((row_a<nmin) ? row_a : (row_a+nmax-nmin),
              (col_a<nmin) ? col_a : (col_a+nmax-nmin))=Aschur(row_a,col_a);
      }
   }

   TMatrixDSparse *CAschur=MultiplyMSparseM(C,Aschur);
   TMatrixDSparse *CAschurBDinv=MultiplyMSparseMSparse(*CAschur,BDinv);

   const Int_t *CAschurBDinv_row=CAschurBDinv->GetRowIndexArray();
   const Int_t *CAschurBDinv_col=CAschurBDinv->GetColIndexArray();
   const Double_t *CAschurBDinv_data=CAschurBDinv->GetMatrixArray();
   for(Int_t row=0;row<CAschurBDinv->GetNrows();row++) {
//      bool has_diagonal=false;
      for(Int_t i=CAschurBDinv_row[row];i<CAschurBDinv_row[row+1];i++) {
         Int_t col=CAschurBDinv_col[i];
         (*r)(row+nmin,col+nmin)=CAschurBDinv_data[i]*Dinv[row];
      }
      (*r)(row+nmin,row+nmin) += Dinv[row];
   }

   delete CAschurBDinv;

   const Int_t *CAschur_row=CAschur->GetRowIndexArray();
   const Int_t *CAschur_col=CAschur->GetColIndexArray();
   const Double_t *CAschur_data=CAschur->GetMatrixArray();
   for(Int_t row=0;row<CAschur->GetNrows();row++) {
      for(Int_t i=CAschur_row[row];i<CAschur_row[row+1];i++) {
         Int_t col=CAschur_col[i];
         (*r)(row+nmin,
              (col<nmin) ? col : (col+nmax-nmin))= -CAschur_data[i]*Dinv[row];
      }
   }
   delete CAschur;

   const Int_t *BDinv_row=BDinv.GetRowIndexArray();
   const Int_t *BDinv_col=BDinv.GetColIndexArray();
   const Double_t *BDinv_data=BDinv.GetMatrixArray();  
   for(Int_t row_aschur=0;row_aschur<Aschur.GetNrows();row_aschur++) {
      Int_t row=(row_aschur<nmin) ? row_aschur : (row_aschur+nmax-nmin);
      for(Int_t row_bdinv=0;row_bdinv<BDinv.GetNrows();row_bdinv++) {
         for(Int_t i=BDinv_row[row_bdinv];i<BDinv_row[row_bdinv+1];i++) {
            (*r)(row,BDinv_col[i]+nmin) -= Aschur(row_aschur,row_bdinv)*
               BDinv_data[i];
         }
      }
   }

   return r;
#else
   TMatrixD *r=new TMatrixD(A);
   if(!InvertMConditioned(*r)) {
      std::cout<<"TUnfold::InvertMSparse inversion failed\n";
   }
   return r;
#endif
}

Bool_t TUnfold::InvertMConditioned(TMatrixD &A) {
   // invert the matrix A
   // the inversion is done with pre-conditioning
   // all rows and columns are normalized to sqrt(abs(a_ii*a_jj))
   // such that the diagonals are equal to 1.0
   // This type of preconditioning improves the numerival results
   // for the symmetric, positive definite matrices which are
   // treated here in the context of unfolding
#ifdef INVERT_WITH_CONDITIONING
   // divide matrix by the square-root of its diagonals
   Double_t *A_diagonals=new Double_t[A.GetNrows()];
   for(Int_t i=0;i<A.GetNrows();i++) {
      A_diagonals[i]=TMath::Sqrt(TMath::Abs(A(i,i)));
      if(A_diagonals[i]>0.0) A_diagonals[i]=1./A_diagonals[i];
      else A_diagonals[i]=1.0;
   }
   // condition the matrix prior to inversion
   for(Int_t i=0;i<A.GetNrows();i++) {
      for(Int_t j=0;j<A.GetNcols();j++) {
         A(i,j) *= A_diagonals[i]*A_diagonals[j];
      }
   }
#endif
   Double_t det=0.0;
   A.Invert(&det);
#ifdef INVERT_WITH_CONDITIONING
   // revert conditioning on the inverted matrix
   for(Int_t i=0;i<A.GetNrows();i++) {
      for(Int_t j=0;j<A.GetNcols();j++) {
         A(i,j) *= A_diagonals[i]*A_diagonals[j];
      }
   }
   delete [] A_diagonals;
#endif
   return (det !=0.0);
}

TUnfold::TUnfold(TH2 const *hist_A, EHistMap histmap, ERegMode regmode)
{
   // set up unfolding matrix and initial regularisation scheme
   //    hist_A:  matrix that describes the migrations
   //    histmap: mapping of the histogram axes to the unfolding output 
   //    regmode: global regularisation mode
   // data members initialized to something different from zero:
   //    fA: filled from hist_A
   //    fDA: filled from hist_A
   //    fX0: filled from hist_A
   //    fLsquared: filled depending on the regularisation scheme
   // Treatment of overflow bins
   //    Bins where the unfolding input (Detector level) is in overflow
   //    are used for the efficiency correction. They have to be filled
   //    properly!
   //    Bins where the unfolding output (Generator level) is in overflow
   //    are treated as a part of the generator level distribution.
   //    I.e. the unfolding output could have non-zero overflow bins if the
   //    input matrix does have such bins.

   InitTUnfold();
   Int_t nx0, nx, ny;
   if (histmap == kHistMapOutputHoriz) {
     // include overflow bins on the X axis
      nx0 = hist_A->GetNbinsX()+2;
      ny = hist_A->GetNbinsY();
   } else {
     // include overflow bins on the X axis
      nx0 = hist_A->GetNbinsY()+2;
      ny = hist_A->GetNbinsX();
   }
   nx = 0;
   // fNx is expected to be nx0, but the input matrix may be ill-formed
   // -> all columns with zero events have to be removed
   //    (because y does not contain any information on that bin in x)
   fSumOverY.Set(nx0);
   fXToHist.Set(nx0);
   fHistToX.Set(nx0);
   Int_t nonzeroA=0;
   // loop
   //  - calculate bias distribution
   //      sum_over_y
   //  - count those generator bins which can be unfolded
   //      fNx
   //  - histogram bins are added to the lookup-tables
   //      fHistToX[] and fXToHist[]
   //    these convert histogram bins to matrix indices and vice versa
   //  - the number of non-zero elements is counted
   //      nonzeroA
   Int_t nskipped=0;
   for (Int_t ix = 0; ix < nx0; ix++) {
      // calculate sum over all detector bins
      // excluding the overflow bins
      Double_t sum = 0.0;
      for (Int_t iy = 0; iy < ny; iy++) {
         Double_t z;
         if (histmap == kHistMapOutputHoriz) {
            z = hist_A->GetBinContent(ix, iy + 1);
         } else {
            z = hist_A->GetBinContent(iy + 1, ix);
         }
         if (z > 0.0) {
            nonzeroA++;
            sum += z;
         }
      }
      // check whether there is any sensitivity to this generator bin
      if (sum > 0.0) {
         // update mapping tables to convert bin number to matrix index
         fXToHist[nx] = ix;
         fHistToX[ix] = nx;
         // add overflow bins -> important to keep track of the
         // non-reconstructed events
         fSumOverY[nx] = sum;
         if (histmap == kHistMapOutputHoriz) {
            fSumOverY[nx] +=
               hist_A->GetBinContent(ix, 0) +
               hist_A->GetBinContent(ix, ny + 1);
         } else {
            fSumOverY[nx] +=
              hist_A->GetBinContent(0, ix) +
              hist_A->GetBinContent(ny + 1, ix);
         }
         nx++;
      } else {
         nskipped++;
         // histogram bin pointing to -1 (non-existing matrix entry)
         fHistToX[ix] = -1;
      }
   }
   if(nskipped) {
     std::cout << "TUnfold: the following output bins "
               <<"are not connected to the input side\n";
     Int_t nprint=0;
     Int_t ixfirst=-1,ixlast=-1;
     for (Int_t ix = 0; ix < nx0; ix++) {
       if(fHistToX[ix]<0) {
         nprint++;
         if(ixlast<0) {
           std::cout<<" "<<ix;
           ixfirst=ix;
         }
         ixlast=ix;
       }
       if(((fHistToX[ix]>=0)&&(ixlast>=0))||
          (nprint==nskipped)) {
         if(ixlast>ixfirst) std::cout<<"-"<<ixlast;
         ixfirst=-1;
         ixlast=-1;
       }
       if(nprint==nskipped) {
         std::cout<<"\n";
         break;
       }
     }
   }
   // store bias as matrix
   fX0 = new TMatrixD(nx, 1, fSumOverY.GetArray());
   // store non-zero elements in sparse matrix fA
   // construct sparse matrix fA
   Int_t *rowA = new Int_t[nonzeroA];
   Int_t *colA = new Int_t[nonzeroA];
   Double_t *dataA = new Double_t[nonzeroA];
   Int_t index=0;
   for (Int_t iy = 0; iy < ny; iy++) {
      for (Int_t ix = 0; ix < nx; ix++) {
         Int_t ibinx = fXToHist[ix];
         Double_t z;
         if (histmap == kHistMapOutputHoriz) {
            z = hist_A->GetBinContent(ibinx, iy + 1);
         } else {
            z = hist_A->GetBinContent(iy + 1, ibinx);
         }
         if (z > 0.0) {
            rowA[index]=iy;
            colA[index] = ix;
            dataA[index] = z / fSumOverY[ix];
            index++;
         }
      }
   }
   fA = new TMatrixDSparse(ny,nx);
   fA->SetMatrixArray(index,rowA,colA,dataA);
   delete[] rowA;
   delete[] colA;
   delete[] dataA;
   // regularisation conditions squared
   fLsquared = new TMatrixDSparse(GetNx(), GetNx());
   if (regmode != kRegModeNone) {
      Int_t nError=RegularizeBins(0, 1, nx0, regmode);
      if(nError>0) {
        if(nError>1) {
          std::cout<<"TUnfold: "<<nError<<" regularisation conditions have been skipped\n";
        } else {
          std::cout<<"TUnfold: "<<nError<<" regularisation condition has been skipped\n";
        }
      }
   }
}

TUnfold::~TUnfold(void)
{
   // delete all data members

   DeleteMatrix(&fA);
   DeleteMatrix(&fLsquared);
   DeleteMatrix(&fV);
   DeleteMatrix(&fY);
   DeleteMatrix(&fX0);

   ClearResults();
}

void TUnfold::SetBias(TH1 const *bias)
{
   // initialize alternative bias from histogram
   // modifies data member fX0
   DeleteMatrix(&fX0);
   fX0 = new TMatrixD(GetNx(), 1);
   for (Int_t i = 0; i < GetNx(); i++) {
      (*fX0) (i, 0) = bias->GetBinContent(fXToHist[i]);
   }
}

Int_t TUnfold::RegularizeSize(int bin, Double_t const &scale)
{
   // add regularisation on the size of bin i
   //    bin: bin number
   //    scale: size of the regularisation
   // return value: number of conditions which have been skipped
   // modifies data member fLsquared

   Int_t i = fHistToX[bin];
   if (i < 0) {
      return 1;
   }
   (*fLsquared) (i, i) = scale * scale;
   return 0;
}

Int_t TUnfold::RegularizeDerivative(int left_bin, int right_bin,
                                   Double_t const &scale)
{
   // add regularisation on the difference of two bins
   //   left_bin: 1st bin
   //   right_bin: 2nd bin
   //   scale: size of the regularisation
   // return value: number of conditions which have been skipped
   // modifies data member fLsquared
   Int_t il = fHistToX[left_bin];
   Int_t ir = fHistToX[right_bin];
   if ((il < 0) || (ir < 0)) {
      return 1;
   }
   Double_t scale_squared = scale * scale;
   (*fLsquared) (il, il) += scale_squared;
   (*fLsquared) (il, ir) -= scale_squared;
   (*fLsquared) (ir, il) -= scale_squared;
   (*fLsquared) (ir, ir) += scale_squared;
   return 0;
}

Int_t TUnfold::RegularizeCurvature(int left_bin, int center_bin,
                                  int right_bin,
                                  Double_t const &scale_left,
                                  Double_t const &scale_right)
{
   // add regularisation on the curvature through 3 bins (2nd derivative)
   //   left_bin: 1st bin
   //   center_bin: 2nd bin
   //   right_bin: 3rd bin
   //   scale_left: scale factor on center-left difference
   //   scale_right: scale factor on right-center difference
   // return value: number of conditions which have been skipped
   // modifies data member fLsquared

   Int_t il, ic, ir;
   il = fHistToX[left_bin];
   ic = fHistToX[center_bin];
   ir = fHistToX[right_bin];
   if ((il < 0) || (ic < 0) || (ir < 0)) {
      return 1;
   }
   Double_t r[3];
   r[0] = -scale_left;
   r[2] = -scale_right;
   r[1] = -r[0] - r[2];
   // diagonal elements
   (*fLsquared) (il, il) += r[0] * r[0];
   (*fLsquared) (il, ic) += r[0] * r[1];
   (*fLsquared) (il, ir) += r[0] * r[2];
   (*fLsquared) (ic, il) += r[1] * r[0];
   (*fLsquared) (ic, ic) += r[1] * r[1];
   (*fLsquared) (ic, ir) += r[1] * r[2];
   (*fLsquared) (ir, il) += r[2] * r[0];
   (*fLsquared) (ir, ic) += r[2] * r[1];
   (*fLsquared) (ir, ir) += r[2] * r[2];
   return 0;
}

Int_t TUnfold::RegularizeBins(int start, int step, int nbin,
                             ERegMode regmode)
{
   // set regulatisation on a 1-dimensional curve
   //   start: first bin
   //   step:  distance between neighbouring bins
   //   nbin:  total number of bins
   //   regmode:  regularisation mode
   // return value:
   //   number of errors (i.e. conditions which have been skipped)
   // modifies data member fLsquared

   Int_t i0, i1, i2;
   i0 = start;
   i1 = i0 + step;
   i2 = i1 + step;
   Int_t nSkip = 0;
   Int_t nError= 0;
   if (regmode == kRegModeDerivative)
      nSkip = 1;
   else if (regmode == kRegModeCurvature)
      nSkip = 2;
   for (Int_t i = nSkip; i < nbin; i++) {
      if (regmode == kRegModeSize) {
         nError += RegularizeSize(i0);
      } else if (regmode == kRegModeDerivative) {
         nError += RegularizeDerivative(i0, i1);
      } else if (regmode == kRegModeCurvature) {
         nError += RegularizeCurvature(i0, i1, i2);
      }
      i0 = i1;
      i1 = i2;
      i2 += step;
   }
   return nError;
}

Int_t TUnfold::RegularizeBins2D(int start_bin, int step1, int nbin1,
                               int step2, int nbin2, ERegMode regmode)
{
   // set regularisation on a 2-dimensional grid of bins
   //     start: first bin
   //     step1: distance between bins in 1st direction
   //     nbin1: number of bins in 1st direction
   //     step2: distance between bins in 2nd direction
   //     nbin2: number of bins in 2nd direction
    // return value:
   //   number of errors (i.e. conditions which have been skipped)
  // modifies data member fLsquared

   Int_t nError = 0;
   for (Int_t i1 = 0; i1 < nbin1; i1++) {
      nError += RegularizeBins(start_bin + step1 * i1, step2, nbin2, regmode);
   }
   for (Int_t i2 = 0; i2 < nbin2; i2++) {
      nError += RegularizeBins(start_bin + step2 * i2, step1, nbin1, regmode);
   }
   return nError;
}

Double_t TUnfold::DoUnfold(Double_t const &tau_reg, TH1 const *input,
                           Double_t const &scaleBias)
{
   // Do unfolding of an input histogram
   //   tau_reg: regularisation parameter
   //   input:   input distribution with errors
   //   scaleBias:  scale factor applied to the bias
   // Data members required:
   //   fA, fX0, fLsquared
   // Data members modified:
   //   those documented in SetInput()
   //   and those documented in DoUnfold(Double_t)
   // Return value:
   //   maximum global correlation coefficient
   //   NOTE!!! return value >=1.0 means error, and the result is junk
   //
   // Overflow bins of the input distribution are ignored!

   SetInput(input,scaleBias);
   return DoUnfold(tau_reg);
}

Int_t TUnfold::SetInput(TH1 const *input, Double_t const &scaleBias,
                        Double_t oneOverZeroError) {
  // Define the input data for subsequent calls to DoUnfold(Double_t)
  //   input:   input distribution with errors
  //   scaleBias:  scale factor applied to the bias
  //   oneOverZeroError: for bins with zero error, this number defines 1/error.
  // Return value: number of bins with bad error
  //                 +10000*number of unconstrained output bins
  //         Note: return values>=10000 are fatal errors, 
  //               for the given input, the unfolding can not be done!
  // Data members modified:
  //   fY, fV, fBiasScale, fNdf
  // Data members cleared
  //   fEinv, fE, fX, fAx
  fBiasScale = scaleBias;

   // delete old results (if any)
  ClearResults();

  // construct inverted error matrix of measured quantities
  // from errors of input histogram
  // and count number of degrees of freedom
  fNdf = -GetNpar();
  Int_t *rowColV=new Int_t[GetNy()];
  Int_t *col1V=new Int_t[GetNy()];
  Double_t *dataV=new Double_t[GetNy()];
  Int_t nError=0;
  for (Int_t iy = 0; iy < GetNy(); iy++) {
    Double_t dy = input->GetBinError(iy + 1);
    rowColV[iy] = iy;
    col1V[iy] = 0;
    if (dy <= 0.0) {
      nError++;
      dataV[iy] = oneOverZeroError*oneOverZeroError;
    } else {
      dataV[iy] = 1. / dy / dy;
    }
    if( dataV[iy]>0.0) fNdf ++;
  }
  DeleteMatrix(&fV);
  fV = new TMatrixDSparse(GetNy(),GetNy());
  fV->SetMatrixArray(GetNy(),rowColV,rowColV, dataV);
  TMatrixDSparse vecV(GetNy(),1);
  vecV.SetMatrixArray(GetNy(),rowColV,col1V, dataV);
  delete[] rowColV;
  delete[] col1V;
  delete[] dataV;
  //
  // get input vector
  DeleteMatrix(&fY);
  fY = new TMatrixD(GetNy(), 1);
  for (Int_t i = 0; i < GetNy(); i++) {
    (*fY) (i, 0) = input->GetBinContent(i + 1);
  }
  // check whether unfolding is possible, given the matrices fA and  fV
  TMatrixDSparse *mAtV=MultiplyMSparseTranspMSparse(*fA,vecV);
  Int_t nError2=0;
  for (Int_t i = 0; i <mAtV->GetNrows();i++) {
    if(mAtV->GetRowIndexArray()[i]==
       mAtV->GetRowIndexArray()[i+1]) {
      nError2 ++;
    }
  }
  if(nError>0) {
    if(nError>1) {
       std::cout
         <<"TUnfold::SetInput "<<nError<<" input bins have zero error. ";
    } else {
      std::cout
        <<"TUnfold::SetInput "<<nError<<" input bin has zero error. ";
    }
    if(oneOverZeroError !=0.0) {
      std::cout<<"1/error is set to "<<oneOverZeroError<<"\n";
    } else {
      if(nError>1) {
        std::cout
          <<"These bins are ignored.\n";
      } else {
        std::cout
          <<"This bin is ignored.\n";
      }
    }
  }
  if(nError2>0) {
    if(nError2>1) {
      std::cout
        <<"TUnfold::SetInput "<<nError2<<" output bins are not constrained by any data.\n";
    } else {
      std::cout
        <<"TUnfold::SetInput "<<nError2<<" output bin is not constrained by any data.\n";
    }
    // check whether data points with zero error are responsible
    if(oneOverZeroError<=0.0) {
      const Int_t *a_rows=fA->GetRowIndexArray();
      const Int_t *a_cols=fA->GetColIndexArray();
      // const Double_t *a_data=fA->GetMatrixArray();
      for (Int_t col = 0; col <mAtV->GetNrows();col++) {
        if(mAtV->GetRowIndexArray()[col]==
           mAtV->GetRowIndexArray()[col+1]) {
          std::cout<<"  output bin "<<fXToHist[col]
                   <<" depends on ignored input bins ";
          for(Int_t row=0;row<fA->GetNrows();row++) {
            if(input->GetBinError(row + 1)>0.0) continue;
            for(Int_t i=a_rows[row];i<a_rows[row+1];i++) {
              if(a_cols[i]!=col) continue;
              std::cout<<" "<<row;
            }
          }
          std::cout<<"\n";
        }
      }
    }    
  }
  delete mAtV;

  return nError+10000*nError2;
}

Double_t TUnfold::DoUnfold(Double_t const &tau) {
  // Unfold with given value of regularisation parameter tau
  //     tau: new tau parameter
  // required data members:
  //     fA:  matrix to relate x and y
  //     fY:  measured data points
  //     fX0: bias on x
  //     fBiasScale: scale factor for fX0
  //     fV:  inverse of covariance matrix for y
  //     fLsquared: regularisation conditions
  // modified data members:
  //     fTau and those documented in DoUnfold(void)
  fTau=tau;
  return DoUnfold();
}

Int_t TUnfold::ScanLcurve(Int_t nPoint,
                          Double_t const &tauMin,Double_t const &tauMax,
			  TGraph **lCurve,TSpline **logTauX,
			  TSpline **logTauY) {
  // scan the L curve
  //   nPoint: number of points to scan
  //   tauMin: smallest tau value to study
  //   tauMax: largest tau value to study
  //   lCurve: the L curve as graph
  //   logTauX: output spline of x-coordinates vs tau for the L curve
  //   logTauY: output spline of y-coordinates vs tau for the L curve
  // return value: the coordinate number (0..nPoint-1) with the "best" choice
  //     of tau
  typedef std::map<Double_t,std::pair<Double_t,Double_t> > XYtau_t;

  Int_t bestChoice=-1;
  XYtau_t curve;
  Double_t logTauMin=-10.;
  Double_t logTauMax=0.0;
  Double_t logTau=logTauMin;
  if(tauMin>0.0) logTauMin=TMath::Log10(tauMin);
  if(tauMax>0.0) logTauMax=TMath::Log10(tauMax);
  if(logTauMax<=logTauMin) logTauMax=logTauMin+10.;
  if(nPoint>0) {
    if(nPoint>1) {
      // initialisation for two or more points
      DoUnfold(TMath::Power(10.,logTauMax));
      curve[logTauMax]=std::make_pair(GetLcurveX(),GetLcurveY());
    }
    // initialisation for one or more points (if nPoint<3 tau is set to tauMin)
    DoUnfold(TMath::Power(10.,logTauMin));
    curve[logTauMin]=std::make_pair(GetLcurveX(),GetLcurveY());
  }

  while(int(curve.size())<nPoint-1) {
    // insert additional points, such that the sizes of the delta(XY) vectors
    // are getting smaller and smaller
    XYtau_t::const_iterator i0,i1;
    i0=curve.begin();
    i1=i0;
    Double_t distMax=0.0;
    for(i1++;i1!=curve.end();i1++) {
      std::pair<Double_t,Double_t> const &xy0=(*i0).second;
      std::pair<Double_t,Double_t> const &xy1=(*i1).second;
      Double_t dx=xy1.first-xy0.first;
      Double_t dy=xy1.second-xy0.second;
      Double_t d=TMath::Sqrt(dx*dx+dy*dy);
      if(d>=distMax) {
        distMax=d;
        logTau=0.5*((*i0).first+(*i1).first);
      }
      i0=i1;
    }
    DoUnfold(TMath::Power(10.,logTau));
    curve[logTau]=std::make_pair(GetLcurveX(),GetLcurveY());
  }
  XYtau_t::const_iterator i0,i1;
  i0=curve.begin();
  i1=i0;
  i1++;
  if(curve.size()>2) {
    // set up splines and determine (x,y) curvature in each point
    Double_t *cTi=new Double_t[curve.size()-1];
    Double_t *cCi=new Double_t[curve.size()-1];
    Int_t n=0;
    {
      Double_t *lXi=new Double_t[curve.size()];
      Double_t *lYi=new Double_t[curve.size()];
      Double_t *lTi=new Double_t[curve.size()];
      for( XYtau_t::const_iterator i=curve.begin();i!=curve.end();i++) {
        lXi[n]=(*i).second.first;
        lYi[n]=(*i).second.second;
        lTi[n]=(*i).first;
        n++;
      }
      TSpline3 *splineX=new TSpline3("x vs tau",lTi,lXi,n);
      TSpline3 *splineY=new TSpline3("y vs tau",lTi,lYi,n);
      // calculate (x,y) curvature for all points
      // the curvature is stored in the array cCi[] as a function of cTi[] 
      for(Int_t i=0;i<n-1;i++) {
        Double_t ltau,xy,bi,ci,di;
        splineX->GetCoeff(i,ltau,xy,bi,ci,di);
        Double_t tauBar=0.5*(lTi[i]+lTi[i+1]);
        Double_t dTau=0.5*(lTi[i+1]-lTi[i]);
        Double_t dx1=bi+dTau*(2.*ci+3.*di*dTau);
        Double_t dx2=2.*ci+6.*di*dTau;
        splineY->GetCoeff(i,ltau,xy,bi,ci,di);
        Double_t dy1=bi+dTau*(2.*ci+3.*di*dTau);
        Double_t dy2=2.*ci+6.*di*dTau;
        cTi[i]=tauBar;
        cCi[i]=(dy2*dx1-dy1*dx2)/TMath::Power(dx1*dx1+dy1*dy1,1.5);
      }
      delete splineX;
      delete splineY;
      delete[] lXi;
      delete[] lYi;
      delete[] lTi;
    }
    // create curvature Spline
    TSpline3 *splineC=new TSpline3("L curve curvature",cTi,cCi,n-1);
    // find the maximum of the curvature
    // if the parameter iskip is non-zero, then iskip points are
    // ignored when looking for the largest curvature
    // (there are problems with the curvature determined from the first
    //  few points of splineX,splineY in the algorithm above)
    Int_t iskip=0;
    if(n>4) iskip=1;
    if(n>7) iskip=2;
    Double_t cCmax=cCi[iskip];
    Double_t cTmax=cTi[iskip];
    for(Int_t i=iskip;i<n-2-iskip;i++) {
      // find maximum on this spline section
      // check boundary conditions for x[i+1]
      Double_t xMax=cTi[i+1];
      Double_t yMax=cCi[i+1];
      if(cCi[i]>yMax) {
        yMax=cCi[i];
        xMax=cTi[i];
      }
      // find maximum for x[i]<x<x[i+1]
      // get spline coefficiencts and solve equation
      //   derivative(x)==0
      Double_t x,y,b,c,d;
      splineC->GetCoeff(i,x,y,b,c,d);
      // coefficiencts of quadratic equation
      Double_t m_p_half=-c/(3.*d);
      Double_t q=b/(3.*d);
      Double_t discr=m_p_half*m_p_half-q;
      if(discr>=0.0) {
        // solution found
        discr=TMath::Sqrt(discr);
        Double_t xx;
        if(m_p_half>0.0) {
          xx = m_p_half + discr;
        } else {
          xx = m_p_half - discr;
        }
        Double_t dx=cTi[i+1]-x;
        // check first solution
        if((xx>0.0)&&(xx<dx)) {
          y=splineC->Eval(x+xx);
          if(y>yMax) {
            yMax=y;
            xMax=x+xx;
          }
        }
        // second solution
        if(xx !=0.0) {
          xx= q/xx;
        } else {
          xx=0.0;
        }
        // check second solution
        if((xx>0.0)&&(xx<dx)) {
          y=splineC->Eval(x+xx);
          if(y>yMax) {
            yMax=y;
            xMax=x+xx;
          }
        }
      }
      // check whether this local minimum is a global minimum
      if(yMax>cCmax) {
        cCmax=yMax;
        cTmax=xMax;
      }
    }
#ifdef DEBUG_LCURVE
    {
      TCanvas lcc;
      lcc.Divide(1,1);
      lcc.cd(1);
      splineC->Draw();
      lcc.SaveAs("splinec.ps");
    }
#endif
    delete splineC;
    delete[] cTi;
    delete[] cCi;
    logTau=cTmax;
    DoUnfold(TMath::Power(10.,logTau));
    curve[logTau]=std::make_pair(GetLcurveX(),GetLcurveY());
  }
  //
  // identify position of the result and save it as splines
  if(curve.size()>0) {
    Double_t *x=new Double_t[curve.size()];
    Double_t *y=new Double_t[curve.size()];
    Double_t *logT=new Double_t[curve.size()];
    int n=0;
    for( XYtau_t::const_iterator i=curve.begin();i!=curve.end();i++) {
      if(logTau==(*i).first) {
        bestChoice=n;
      }
      x[n]=(*i).second.first;
      y[n]=(*i).second.second;
      logT[n]=(*i).first;
      n++;
    }
    if(lCurve) (*lCurve)=new TGraph(n,x,y);
    if(logTauX) (*logTauX)=new TSpline3("log(chi**2)%log(tau)",logT,x,n);
    if(logTauY) (*logTauY)=new TSpline3("L curve",logT,y,n);
    delete[] x;
    delete[] y;
    delete[] logT;
  }

  return bestChoice;
}


TH1D *TUnfold::GetOutput(char const *name, char const *title,
                         Double_t xmin, Double_t xmax) const
{
   // retreive unfolding result as histogram
   //   name:  name of the histogram
   //   title: title of the histogram
   //   x0,x1: lower/upper edge of histogram.
   //          if (x0>=x1) then x0=0 and x1=nbin are used

   int nbins = fHistToX.GetSize() - 2;
   if (xmin >= xmax) {
      xmin = 0.0;
      xmax = nbins;
   }
   TH1D *out = new TH1D(name, title, nbins, xmin, xmax);
   GetOutput(out);

   return out;
}

TH1D *TUnfold::GetBias(char const *name, char const *title,
                       Double_t xmin, Double_t xmax) const
{
   // retreive bias as histogram
   //   name:  name of the histogram
   //   title: title of the histogram
   //   x0,x1: lower/upper edge of histogram.
   //          if (x0>=x1) then x0=0 and x1=nbin are used

   int nbins = fHistToX.GetSize() - 2;
   if (xmin >= xmax) {
      xmin = 0.0;
      xmax = nbins;
   }
   TH1D *out = new TH1D(name, title, nbins, xmin, xmax);
   for (Int_t i = 0; i < GetNx(); i++) {
      out->SetBinContent(fXToHist[i], (*fX0) (i, 0));
   }
   return out;
}

TH1D *TUnfold::GetFoldedOutput(char const *name, char const *title,
                               Double_t y0, Double_t y1) const
{
   // retreive unfolding result folded back by the matrix
   //   name:  name of the histogram
   //   title: title of the histogram
   //   y0,y1: lower/upper edge of histogram.
   //          if (y0>=y1) then y0=0 and y1=nbin are used

   if (y0 >= y1) {
      y0 = 0.0;
      y1 = GetNy();
   }
   TH1D *out = new TH1D(name, title, GetNy(), y0, y1);
   Int_t const *rows=fA->GetRowIndexArray();
   Int_t const *cols=fA->GetColIndexArray();
   Double_t const *data=fA->GetMatrixArray();
   for (Int_t i = 0; i < GetNy(); i++) {
      out->SetBinContent(i + 1, (*fAx) (i, 0));
      Double_t e2=0.0;
      for( Int_t cindex1=rows[i];cindex1<rows[i+1];cindex1++) {
        for( Int_t cindex2=rows[i];cindex2<rows[i+1];cindex2++) {
          e2 += data[cindex1]*(*fE)(cols[cindex1],cols[cindex2])*data[cindex2];
        }
      }
      out->SetBinError(i + 1,TMath::Sqrt(e2));
   }

   return out;
}

TH1D *TUnfold::GetInput(char const *name, char const *title,
                        Double_t y0, Double_t y1) const
{
   // retreive input distribution
   //   name:  name of the histogram
   //   title: title of the histogram
   //   y0,y1: lower/upper edge of histogram.
   //          if (y0>=y1) then y0=0 and y1=nbin are used

   if (y0 >= y1) {
      y0 = 0.0;
      y1 = GetNy();
   }
   TH1D *out = new TH1D(name, title, GetNy(), y0, y1);

   TMatrixD *Vinv=InvertMSparse(*fV);
   for (Int_t i = 0; i < GetNy(); i++) {
      out->SetBinContent(i + 1, (*fY) (i, 0));
      out->SetBinError(i + 1, TMath::Sqrt((*Vinv)(i, i)));
   }

   delete Vinv;

   return out;
}

TH2D *TUnfold::GetRhoIJ(char const *name, char const *title,
                        Double_t xmin, Double_t xmax) const
{
   // retreive full matrix of correlation coefficients
   //   name:  name of the histogram
   //   title: title of the histogram
   //   x0,x1: lower/upper edge of histogram.
   //          if (x0>=x1) then x0=0 and x1=nbin are used

   int nbins = fHistToX.GetSize() - 2;
   if (xmin >= xmax) {
      xmin = 0.0;
      xmax = nbins;
   }
   TH2D *out = new TH2D(name, title, nbins, xmin, xmax, nbins, xmin, xmax);
   GetRhoIJ(out);
   return out;
}

TH2D *TUnfold::GetEmatrix(char const *name, char const *title,
                          Double_t xmin, Double_t xmax) const
{
   // retreive full error matrix
   //   name:  name of the histogram
   //   title: title of the histogram
   //   x0,x1: lower/upper edge of histogram.
   //          if (x0>=x1) then x0=0 and x1=nbin are used

   int nbins = fHistToX.GetSize() - 2;
   if (xmin >= xmax) {
      xmin = 0.0;
      xmax = nbins;
   }
   TH2D *out = new TH2D(name, title, nbins, xmin, xmax, nbins, xmin, xmax);
   GetEmatrix(out);

   return out;
}

TH1D *TUnfold::GetRhoI(char const *name, char const *title,
                       Double_t xmin, Double_t xmax) const
{
   // retreive matrix of global correlation coefficients
   //   name:  name of the histogram
   //   title: title of the histogram
   //   x0,x1: lower/upper edge of histogram.
   //          if (x0>=x1) then x0=0 and x1=nbin are used

   int nbins = fHistToX.GetSize() - 2;
   if (xmin >= xmax) {
      xmin = 0.0;
      xmax = nbins;
   }
   TH1D *out = new TH1D(name, title, nbins, xmin, xmax);
   GetRhoI(out);

   return out;
}

TH2D *TUnfold::GetLsquared(char const *name, char const *title,
                           Double_t xmin, Double_t xmax) const
{
   // retreive ix of regularisation conditions squared
   //   name:  name of the histogram
   //   title: title of the histogram
   //   x0,x1: lower/upper edge of histogram.
   //            if (x0>=x1) then x0=0 and x1=nbin are used

   int nbins = fHistToX.GetSize() - 2;
   if (xmin >= xmax) {
      xmin = 0.0;
      xmax = nbins;
   }
   TH2D *out = new TH2D(name, title, nbins, xmin, xmax, nbins, xmin, xmax);
   out->SetOption("BOX");
   // loop over sparse matrix
   Int_t const *rows=fLsquared->GetRowIndexArray();
   Int_t const *cols=fLsquared->GetColIndexArray();
   Double_t const *data=fLsquared->GetMatrixArray();
   for (Int_t i = 0; i < GetNx(); i++) {
      for (Int_t cindex = rows[i]; cindex < rows[i+1]; cindex++) {
        Int_t j=cols[cindex];
        out->SetBinContent(fXToHist[i], fXToHist[j], fTau * data[cindex]);
      }
   }

  return out;
}

Double_t const &TUnfold::GetTau(void) const
{
   // return regularisation parameter
   return fTau;
}

Double_t const &TUnfold::GetRhoMax(void) const
{
   // return maximum global correlation
   // Note: return value>1.0 means the unfolding has failed
   return fRhoMax;
}

Double_t const &TUnfold::GetRhoAvg(void) const
{
   // return average global correlation
   return fRhoAvg;
}

Double_t const &TUnfold::GetChi2A(void) const
{
   // return chi**2 contribution from matrix A
   return fChi2A;
}

Double_t const &TUnfold::GetChi2L(void) const
{
   // return chi**2 contribution from regularisation conditions
   return fChi2L;
}

Int_t TUnfold::GetNdf(void) const
{
   // return number of degrees of freedom
   return fNdf;
}

Int_t TUnfold::GetNpar(void) const
{
   // return number of parameters
   return GetNx();
}

Double_t TUnfold::GetLcurveX(void) const {
  // return value on x axis of L curve
  return TMath::Log10(fChi2A);
}

Double_t TUnfold::GetLcurveY(void) const {
  // return value on y axis of L curve
  return TMath::Log10(fChi2L/fTau);
}

void TUnfold::GetOutput(TH1 *output,Int_t const *binMap) const {
   // get output distribution, cumulated over several bins
   //   output: output histogram
   //   binMap: for each bin of the original output distribution
   //           specify the destination bin. A value of -1 means that the bin
   //           is discarded. 0 means underflow bin, 1 first bin, ...
   //        binMap[0] : destination of underflow bin
   //        binMap[1] : destination of first bin
   //          ...

  Int_t nbin=output->GetNbinsX();
  Double_t *c=new Double_t[nbin+2];
  Double_t *e2=new Double_t[nbin+2];
  for(Int_t i=0;i<nbin+2;i++) {
    c[i]=0.0;
    e2[i]=0.0;
  }

  Int_t binMapSize = fHistToX.GetSize();
  for(Int_t i=0;i<binMapSize;i++) {
    Int_t destBinI=binMap ? binMap[i] : i;
    Int_t srcBinI=fHistToX[i];
    if((destBinI>=0)&&(destBinI<nbin+2)&&(srcBinI>=0)) {
      c[destBinI]+=(*fX)(srcBinI,0);
      for(Int_t j=0;j<binMapSize;j++) {
        Int_t destBinJ=binMap ? binMap[j] : j;
        if(destBinI!=destBinJ) continue;
        Int_t srcBinJ=fHistToX[j];
        if(srcBinJ>=0) e2[destBinI]+= (*fE)(srcBinI,srcBinJ);
      }
    }
  }
  for(Int_t i=0;i<nbin+2;i++) {
    output->SetBinContent(i,c[i]);
    output->SetBinError(i,TMath::Sqrt(e2[i]));
  }
  delete[] c;
  delete[] e2;
}

void TUnfold::ErrorMatrixToHist(TH2 *ematrix,TMatrixD const *emat,Int_t const *binMap,Bool_t doClear) const {

   // get an error matrix, cumulated over several bins
   //   ematrix: output error matrix histogram
   //   emat: error matrix
   //   binMap: for each bin of the original output distribution
   //           specify the destination bin. A value of -1 means that the bin
   //           is discarded. 0 means underflow bin, 1 first bin, ...
   //        binMap[0] : destination of underflow bin
   //        binMap[1] : destination of first bin
   //          ...
   Int_t nbin=ematrix->GetNbinsX();
   if(doClear) {
      for(Int_t i=0;i<nbin+2;i++) {
         for(Int_t j=0;j<nbin+2;j++) {
            ematrix->SetBinContent(i,j,0.0);
            ematrix->SetBinError(i,j,0.0);
         }
      }
   }

   if(emat) {
     Int_t binMapSize = fHistToX.GetSize();
     for(Int_t i=0;i<binMapSize;i++) {
       Int_t destBinI=binMap ? binMap[i] : i;
       Int_t srcBinI=fHistToX[i];
       if((destBinI>=0)&&(destBinI<nbin+2)&&(srcBinI>=0)) {
         for(Int_t j=0;j<binMapSize;j++) {
           Int_t destBinJ=binMap ? binMap[j] : j;
           Int_t srcBinJ=fHistToX[j];
           if((destBinJ>=0)&&(destBinJ<nbin+2)&&(srcBinJ>=0)) {
             Double_t e2=ematrix->GetBinContent(destBinI,destBinJ);
             e2 += (*emat)(srcBinI,srcBinJ);
             ematrix->SetBinContent(destBinI,destBinJ,e2);
           }
         }
       }
     }
   }
}

void TUnfold::GetEmatrix(TH2 *ematrix,Int_t const *binMap) const {
   // get output error matrix, cumulated over several bins
   //   ematrix: output error matrix histogram
   //   binMap: for each bin of the original output distribution
   //           specify the destination bin. A value of -1 means that the bin
   //           is discarded. 0 means underflow bin, 1 first bin, ...
   //        binMap[0] : destination of underflow bin
   //        binMap[1] : destination of first bin
   //          ...
   ErrorMatrixToHist(ematrix,fE,binMap,kTRUE);
}

Double_t TUnfold::GetRhoI(TH1 *rhoi,TH2 *ematrixinv,Int_t const *binMap) const {
  // get global correlation coefficients and inverted error matrix,
  // cumulated over several bins
  //   rhoi: global correlation histogram
  //   ematrixinv: inverse of error matrix (if pointer==0 it is not returned)
  //   binMap: for each bin of the original output distribution
  //           specify the destination bin. A value of -1 means that the bin
  //           is discarded. 0 means underflow bin, 1 first bin, ...
  //        binMap[0] : destination of underflow bin
  //        binMap[1] : destination of first bin
  //          ...
  // return value: average global correlation

  Int_t nbin=rhoi->GetNbinsX();  
  // count number of bins mapped into one bin of the output histogram
  Int_t *nz=new Int_t[nbin+2];
  for(Int_t i=0;i<nbin+2;i++) nz[i]=0;
  Int_t binMapSize = fHistToX.GetSize();
  for(Int_t i=0;i<binMapSize;i++) {
    Int_t destBinI=binMap ? binMap[i] : i;
    Int_t srcBinI=fHistToX[i];
    if((destBinI>=0)&&(destBinI<nbin+2)&&(srcBinI>=0)) {
      nz[destBinI]++;
    }
  }
  // count bins which do receive some input
  // and provide lookup-table
  Int_t n=0;
  Int_t *destBin=new Int_t[nbin+2];
  Int_t *matrixBin=new Int_t[nbin+2];
  for(Int_t i=0;i<nbin+2;i++) {
    if(nz[i]>0) {
      matrixBin[i]=n;
      destBin[n]=i;
      n++;
    } else {
      matrixBin[i]=-1;
    }
  }
  // set up reduced error matrix
  TMatrixD e(n,n);
  for(Int_t i=0;i<binMapSize;i++) {
    Int_t destBinI=binMap ? binMap[i] : i;
    Int_t srcBinI=fHistToX[i];
    if((destBinI>=0)&&(destBinI<nbin+2)&&(srcBinI>=0)) {
      Int_t matrixBinI=matrixBin[destBinI];
      for(Int_t j=0;j<binMapSize;j++) {
        Int_t destBinJ=binMap ? binMap[j] : j;
        Int_t srcBinJ=fHistToX[j];
        if((destBinJ>=0)&&(destBinJ<nbin+2)&&(srcBinJ>=0)) {
          Int_t matrixBinJ=matrixBin[destBinJ];
          e(matrixBinI,matrixBinJ) += (*fE)(srcBinI,srcBinJ);
        }
      }
    }
  }
  TMatrixD einv(e);
  InvertMConditioned(einv);
  Double_t rhoMax=0.0;
  for(Int_t i=0;i<n;i++) {
    Int_t destBinI=destBin[i];
    Double_t rho=1.-1./(einv(i,i)*e(i,i));
    if(rho>=0.0) rho=TMath::Sqrt(rho);
    else rho=-TMath::Sqrt(-rho);
    if(rho>rhoMax) {
      rhoMax = rho;
    }
    rhoi->SetBinContent(destBinI,rho);
    if(ematrixinv) {
      for(Int_t j=0;j<n;j++) {
        ematrixinv->SetBinContent(destBinI,destBin[j],einv(i,j));
      }
    }
  }
  delete[] nz;
  delete[] destBin;
  delete[] matrixBin;
  return rhoMax;
}

void TUnfold::GetRhoIJ(TH2 *rhoij,Int_t const *binMap) const {
  // get correlation coefficient matrix, cumulated over several bins
  //   rhoij:  correlation coefficient matrix histogram
  //   binMap: for each bin of the original output distribution
  //           specify the destination bin. A value of -1 means that the bin
  //           is discarded. 0 means underflow bin, 1 first bin, ...
  //        binMap[0] : destination of underflow bin
  //        binMap[1] : destination of first bin
  //          ...
  GetEmatrix(rhoij,binMap);
  Int_t nbin=rhoij->GetNbinsX();  
  Double_t *e=new Double_t[nbin+2];
  for(Int_t i=0;i<nbin+2;i++) {
    e[i]=TMath::Sqrt(rhoij->GetBinContent(i,i));
  }
  for(Int_t i=0;i<nbin+2;i++) {
    for(Int_t j=0;j<nbin+2;j++) {
      if((e[i]>0.0)&&(e[j]>0.0)) {
        rhoij->SetBinContent(i,j,rhoij->GetBinContent(i,j)/e[i]/e[j]);
      } else {
        rhoij->SetBinContent(i,j,0.0);
      }
    }
  }
  delete[] e;
}
 TUnfold.cxx:1
 TUnfold.cxx:2
 TUnfold.cxx:3
 TUnfold.cxx:4
 TUnfold.cxx:5
 TUnfold.cxx:6
 TUnfold.cxx:7
 TUnfold.cxx:8
 TUnfold.cxx:9
 TUnfold.cxx:10
 TUnfold.cxx:11
 TUnfold.cxx:12
 TUnfold.cxx:13
 TUnfold.cxx:14
 TUnfold.cxx:15
 TUnfold.cxx:16
 TUnfold.cxx:17
 TUnfold.cxx:18
 TUnfold.cxx:19
 TUnfold.cxx:20
 TUnfold.cxx:21
 TUnfold.cxx:22
 TUnfold.cxx:23
 TUnfold.cxx:24
 TUnfold.cxx:25
 TUnfold.cxx:26
 TUnfold.cxx:27
 TUnfold.cxx:28
 TUnfold.cxx:29
 TUnfold.cxx:30
 TUnfold.cxx:31
 TUnfold.cxx:32
 TUnfold.cxx:33
 TUnfold.cxx:34
 TUnfold.cxx:35
 TUnfold.cxx:36
 TUnfold.cxx:37
 TUnfold.cxx:38
 TUnfold.cxx:39
 TUnfold.cxx:40
 TUnfold.cxx:41
 TUnfold.cxx:42
 TUnfold.cxx:43
 TUnfold.cxx:44
 TUnfold.cxx:45
 TUnfold.cxx:46
 TUnfold.cxx:47
 TUnfold.cxx:48
 TUnfold.cxx:49
 TUnfold.cxx:50
 TUnfold.cxx:51
 TUnfold.cxx:52
 TUnfold.cxx:53
 TUnfold.cxx:54
 TUnfold.cxx:55
 TUnfold.cxx:56
 TUnfold.cxx:57
 TUnfold.cxx:58
 TUnfold.cxx:59
 TUnfold.cxx:60
 TUnfold.cxx:61
 TUnfold.cxx:62
 TUnfold.cxx:63
 TUnfold.cxx:64
 TUnfold.cxx:65
 TUnfold.cxx:66
 TUnfold.cxx:67
 TUnfold.cxx:68
 TUnfold.cxx:69
 TUnfold.cxx:70
 TUnfold.cxx:71
 TUnfold.cxx:72
 TUnfold.cxx:73
 TUnfold.cxx:74
 TUnfold.cxx:75
 TUnfold.cxx:76
 TUnfold.cxx:77
 TUnfold.cxx:78
 TUnfold.cxx:79
 TUnfold.cxx:80
 TUnfold.cxx:81
 TUnfold.cxx:82
 TUnfold.cxx:83
 TUnfold.cxx:84
 TUnfold.cxx:85
 TUnfold.cxx:86
 TUnfold.cxx:87
 TUnfold.cxx:88
 TUnfold.cxx:89
 TUnfold.cxx:90
 TUnfold.cxx:91
 TUnfold.cxx:92
 TUnfold.cxx:93
 TUnfold.cxx:94
 TUnfold.cxx:95
 TUnfold.cxx:96
 TUnfold.cxx:97
 TUnfold.cxx:98
 TUnfold.cxx:99
 TUnfold.cxx:100
 TUnfold.cxx:101
 TUnfold.cxx:102
 TUnfold.cxx:103
 TUnfold.cxx:104
 TUnfold.cxx:105
 TUnfold.cxx:106
 TUnfold.cxx:107
 TUnfold.cxx:108
 TUnfold.cxx:109
 TUnfold.cxx:110
 TUnfold.cxx:111
 TUnfold.cxx:112
 TUnfold.cxx:113
 TUnfold.cxx:114
 TUnfold.cxx:115
 TUnfold.cxx:116
 TUnfold.cxx:117
 TUnfold.cxx:118
 TUnfold.cxx:119
 TUnfold.cxx:120
 TUnfold.cxx:121
 TUnfold.cxx:122
 TUnfold.cxx:123
 TUnfold.cxx:124
 TUnfold.cxx:125
 TUnfold.cxx:126
 TUnfold.cxx:127
 TUnfold.cxx:128
 TUnfold.cxx:129
 TUnfold.cxx:130
 TUnfold.cxx:131
 TUnfold.cxx:132
 TUnfold.cxx:133
 TUnfold.cxx:134
 TUnfold.cxx:135
 TUnfold.cxx:136
 TUnfold.cxx:137
 TUnfold.cxx:138
 TUnfold.cxx:139
 TUnfold.cxx:140
 TUnfold.cxx:141
 TUnfold.cxx:142
 TUnfold.cxx:143
 TUnfold.cxx:144
 TUnfold.cxx:145
 TUnfold.cxx:146
 TUnfold.cxx:147
 TUnfold.cxx:148
 TUnfold.cxx:149
 TUnfold.cxx:150
 TUnfold.cxx:151
 TUnfold.cxx:152
 TUnfold.cxx:153
 TUnfold.cxx:154
 TUnfold.cxx:155
 TUnfold.cxx:156
 TUnfold.cxx:157
 TUnfold.cxx:158
 TUnfold.cxx:159
 TUnfold.cxx:160
 TUnfold.cxx:161
 TUnfold.cxx:162
 TUnfold.cxx:163
 TUnfold.cxx:164
 TUnfold.cxx:165
 TUnfold.cxx:166
 TUnfold.cxx:167
 TUnfold.cxx:168
 TUnfold.cxx:169
 TUnfold.cxx:170
 TUnfold.cxx:171
 TUnfold.cxx:172
 TUnfold.cxx:173
 TUnfold.cxx:174
 TUnfold.cxx:175
 TUnfold.cxx:176
 TUnfold.cxx:177
 TUnfold.cxx:178
 TUnfold.cxx:179
 TUnfold.cxx:180
 TUnfold.cxx:181
 TUnfold.cxx:182
 TUnfold.cxx:183
 TUnfold.cxx:184
 TUnfold.cxx:185
 TUnfold.cxx:186
 TUnfold.cxx:187
 TUnfold.cxx:188
 TUnfold.cxx:189
 TUnfold.cxx:190
 TUnfold.cxx:191
 TUnfold.cxx:192
 TUnfold.cxx:193
 TUnfold.cxx:194
 TUnfold.cxx:195
 TUnfold.cxx:196
 TUnfold.cxx:197
 TUnfold.cxx:198
 TUnfold.cxx:199
 TUnfold.cxx:200
 TUnfold.cxx:201
 TUnfold.cxx:202
 TUnfold.cxx:203
 TUnfold.cxx:204
 TUnfold.cxx:205
 TUnfold.cxx:206
 TUnfold.cxx:207
 TUnfold.cxx:208
 TUnfold.cxx:209
 TUnfold.cxx:210
 TUnfold.cxx:211
 TUnfold.cxx:212
 TUnfold.cxx:213
 TUnfold.cxx:214
 TUnfold.cxx:215
 TUnfold.cxx:216
 TUnfold.cxx:217
 TUnfold.cxx:218
 TUnfold.cxx:219
 TUnfold.cxx:220
 TUnfold.cxx:221
 TUnfold.cxx:222
 TUnfold.cxx:223
 TUnfold.cxx:224
 TUnfold.cxx:225
 TUnfold.cxx:226
 TUnfold.cxx:227
 TUnfold.cxx:228
 TUnfold.cxx:229
 TUnfold.cxx:230
 TUnfold.cxx:231
 TUnfold.cxx:232
 TUnfold.cxx:233
 TUnfold.cxx:234
 TUnfold.cxx:235
 TUnfold.cxx:236
 TUnfold.cxx:237
 TUnfold.cxx:238
 TUnfold.cxx:239
 TUnfold.cxx:240
 TUnfold.cxx:241
 TUnfold.cxx:242
 TUnfold.cxx:243
 TUnfold.cxx:244
 TUnfold.cxx:245
 TUnfold.cxx:246
 TUnfold.cxx:247
 TUnfold.cxx:248
 TUnfold.cxx:249
 TUnfold.cxx:250
 TUnfold.cxx:251
 TUnfold.cxx:252
 TUnfold.cxx:253
 TUnfold.cxx:254
 TUnfold.cxx:255
 TUnfold.cxx:256
 TUnfold.cxx:257
 TUnfold.cxx:258
 TUnfold.cxx:259
 TUnfold.cxx:260
 TUnfold.cxx:261
 TUnfold.cxx:262
 TUnfold.cxx:263
 TUnfold.cxx:264
 TUnfold.cxx:265
 TUnfold.cxx:266
 TUnfold.cxx:267
 TUnfold.cxx:268
 TUnfold.cxx:269
 TUnfold.cxx:270
 TUnfold.cxx:271
 TUnfold.cxx:272
 TUnfold.cxx:273
 TUnfold.cxx:274
 TUnfold.cxx:275
 TUnfold.cxx:276
 TUnfold.cxx:277
 TUnfold.cxx:278
 TUnfold.cxx:279
 TUnfold.cxx:280
 TUnfold.cxx:281
 TUnfold.cxx:282
 TUnfold.cxx:283
 TUnfold.cxx:284
 TUnfold.cxx:285
 TUnfold.cxx:286
 TUnfold.cxx:287
 TUnfold.cxx:288
 TUnfold.cxx:289
 TUnfold.cxx:290
 TUnfold.cxx:291
 TUnfold.cxx:292
 TUnfold.cxx:293
 TUnfold.cxx:294
 TUnfold.cxx:295
 TUnfold.cxx:296
 TUnfold.cxx:297
 TUnfold.cxx:298
 TUnfold.cxx:299
 TUnfold.cxx:300
 TUnfold.cxx:301
 TUnfold.cxx:302
 TUnfold.cxx:303
 TUnfold.cxx:304
 TUnfold.cxx:305
 TUnfold.cxx:306
 TUnfold.cxx:307
 TUnfold.cxx:308
 TUnfold.cxx:309
 TUnfold.cxx:310
 TUnfold.cxx:311
 TUnfold.cxx:312
 TUnfold.cxx:313
 TUnfold.cxx:314
 TUnfold.cxx:315
 TUnfold.cxx:316
 TUnfold.cxx:317
 TUnfold.cxx:318
 TUnfold.cxx:319
 TUnfold.cxx:320
 TUnfold.cxx:321
 TUnfold.cxx:322
 TUnfold.cxx:323
 TUnfold.cxx:324
 TUnfold.cxx:325
 TUnfold.cxx:326
 TUnfold.cxx:327
 TUnfold.cxx:328
 TUnfold.cxx:329
 TUnfold.cxx:330
 TUnfold.cxx:331
 TUnfold.cxx:332
 TUnfold.cxx:333
 TUnfold.cxx:334
 TUnfold.cxx:335
 TUnfold.cxx:336
 TUnfold.cxx:337
 TUnfold.cxx:338
 TUnfold.cxx:339
 TUnfold.cxx:340
 TUnfold.cxx:341
 TUnfold.cxx:342
 TUnfold.cxx:343
 TUnfold.cxx:344
 TUnfold.cxx:345
 TUnfold.cxx:346
 TUnfold.cxx:347
 TUnfold.cxx:348
 TUnfold.cxx:349
 TUnfold.cxx:350
 TUnfold.cxx:351
 TUnfold.cxx:352
 TUnfold.cxx:353
 TUnfold.cxx:354
 TUnfold.cxx:355
 TUnfold.cxx:356
 TUnfold.cxx:357
 TUnfold.cxx:358
 TUnfold.cxx:359
 TUnfold.cxx:360
 TUnfold.cxx:361
 TUnfold.cxx:362
 TUnfold.cxx:363
 TUnfold.cxx:364
 TUnfold.cxx:365
 TUnfold.cxx:366
 TUnfold.cxx:367
 TUnfold.cxx:368
 TUnfold.cxx:369
 TUnfold.cxx:370
 TUnfold.cxx:371
 TUnfold.cxx:372
 TUnfold.cxx:373
 TUnfold.cxx:374
 TUnfold.cxx:375
 TUnfold.cxx:376
 TUnfold.cxx:377
 TUnfold.cxx:378
 TUnfold.cxx:379
 TUnfold.cxx:380
 TUnfold.cxx:381
 TUnfold.cxx:382
 TUnfold.cxx:383
 TUnfold.cxx:384
 TUnfold.cxx:385
 TUnfold.cxx:386
 TUnfold.cxx:387
 TUnfold.cxx:388
 TUnfold.cxx:389
 TUnfold.cxx:390
 TUnfold.cxx:391
 TUnfold.cxx:392
 TUnfold.cxx:393
 TUnfold.cxx:394
 TUnfold.cxx:395
 TUnfold.cxx:396
 TUnfold.cxx:397
 TUnfold.cxx:398
 TUnfold.cxx:399
 TUnfold.cxx:400
 TUnfold.cxx:401
 TUnfold.cxx:402
 TUnfold.cxx:403
 TUnfold.cxx:404
 TUnfold.cxx:405
 TUnfold.cxx:406
 TUnfold.cxx:407
 TUnfold.cxx:408
 TUnfold.cxx:409
 TUnfold.cxx:410
 TUnfold.cxx:411
 TUnfold.cxx:412
 TUnfold.cxx:413
 TUnfold.cxx:414
 TUnfold.cxx:415
 TUnfold.cxx:416
 TUnfold.cxx:417
 TUnfold.cxx:418
 TUnfold.cxx:419
 TUnfold.cxx:420
 TUnfold.cxx:421
 TUnfold.cxx:422
 TUnfold.cxx:423
 TUnfold.cxx:424
 TUnfold.cxx:425
 TUnfold.cxx:426
 TUnfold.cxx:427
 TUnfold.cxx:428
 TUnfold.cxx:429
 TUnfold.cxx:430
 TUnfold.cxx:431
 TUnfold.cxx:432
 TUnfold.cxx:433
 TUnfold.cxx:434
 TUnfold.cxx:435
 TUnfold.cxx:436
 TUnfold.cxx:437
 TUnfold.cxx:438
 TUnfold.cxx:439
 TUnfold.cxx:440
 TUnfold.cxx:441
 TUnfold.cxx:442
 TUnfold.cxx:443
 TUnfold.cxx:444
 TUnfold.cxx:445
 TUnfold.cxx:446
 TUnfold.cxx:447
 TUnfold.cxx:448
 TUnfold.cxx:449
 TUnfold.cxx:450
 TUnfold.cxx:451
 TUnfold.cxx:452
 TUnfold.cxx:453
 TUnfold.cxx:454
 TUnfold.cxx:455
 TUnfold.cxx:456
 TUnfold.cxx:457
 TUnfold.cxx:458
 TUnfold.cxx:459
 TUnfold.cxx:460
 TUnfold.cxx:461
 TUnfold.cxx:462
 TUnfold.cxx:463
 TUnfold.cxx:464
 TUnfold.cxx:465
 TUnfold.cxx:466
 TUnfold.cxx:467
 TUnfold.cxx:468
 TUnfold.cxx:469
 TUnfold.cxx:470
 TUnfold.cxx:471
 TUnfold.cxx:472
 TUnfold.cxx:473
 TUnfold.cxx:474
 TUnfold.cxx:475
 TUnfold.cxx:476
 TUnfold.cxx:477
 TUnfold.cxx:478
 TUnfold.cxx:479
 TUnfold.cxx:480
 TUnfold.cxx:481
 TUnfold.cxx:482
 TUnfold.cxx:483
 TUnfold.cxx:484
 TUnfold.cxx:485
 TUnfold.cxx:486
 TUnfold.cxx:487
 TUnfold.cxx:488
 TUnfold.cxx:489
 TUnfold.cxx:490
 TUnfold.cxx:491
 TUnfold.cxx:492
 TUnfold.cxx:493
 TUnfold.cxx:494
 TUnfold.cxx:495
 TUnfold.cxx:496
 TUnfold.cxx:497
 TUnfold.cxx:498
 TUnfold.cxx:499
 TUnfold.cxx:500
 TUnfold.cxx:501
 TUnfold.cxx:502
 TUnfold.cxx:503
 TUnfold.cxx:504
 TUnfold.cxx:505
 TUnfold.cxx:506
 TUnfold.cxx:507
 TUnfold.cxx:508
 TUnfold.cxx:509
 TUnfold.cxx:510
 TUnfold.cxx:511
 TUnfold.cxx:512
 TUnfold.cxx:513
 TUnfold.cxx:514
 TUnfold.cxx:515
 TUnfold.cxx:516
 TUnfold.cxx:517
 TUnfold.cxx:518
 TUnfold.cxx:519
 TUnfold.cxx:520
 TUnfold.cxx:521
 TUnfold.cxx:522
 TUnfold.cxx:523
 TUnfold.cxx:524
 TUnfold.cxx:525
 TUnfold.cxx:526
 TUnfold.cxx:527
 TUnfold.cxx:528
 TUnfold.cxx:529
 TUnfold.cxx:530
 TUnfold.cxx:531
 TUnfold.cxx:532
 TUnfold.cxx:533
 TUnfold.cxx:534
 TUnfold.cxx:535
 TUnfold.cxx:536
 TUnfold.cxx:537
 TUnfold.cxx:538
 TUnfold.cxx:539
 TUnfold.cxx:540
 TUnfold.cxx:541
 TUnfold.cxx:542
 TUnfold.cxx:543
 TUnfold.cxx:544
 TUnfold.cxx:545
 TUnfold.cxx:546
 TUnfold.cxx:547
 TUnfold.cxx:548
 TUnfold.cxx:549
 TUnfold.cxx:550
 TUnfold.cxx:551
 TUnfold.cxx:552
 TUnfold.cxx:553
 TUnfold.cxx:554
 TUnfold.cxx:555
 TUnfold.cxx:556
 TUnfold.cxx:557
 TUnfold.cxx:558
 TUnfold.cxx:559
 TUnfold.cxx:560
 TUnfold.cxx:561
 TUnfold.cxx:562
 TUnfold.cxx:563
 TUnfold.cxx:564
 TUnfold.cxx:565
 TUnfold.cxx:566
 TUnfold.cxx:567
 TUnfold.cxx:568
 TUnfold.cxx:569
 TUnfold.cxx:570
 TUnfold.cxx:571
 TUnfold.cxx:572
 TUnfold.cxx:573
 TUnfold.cxx:574
 TUnfold.cxx:575
 TUnfold.cxx:576
 TUnfold.cxx:577
 TUnfold.cxx:578
 TUnfold.cxx:579
 TUnfold.cxx:580
 TUnfold.cxx:581
 TUnfold.cxx:582
 TUnfold.cxx:583
 TUnfold.cxx:584
 TUnfold.cxx:585
 TUnfold.cxx:586
 TUnfold.cxx:587
 TUnfold.cxx:588
 TUnfold.cxx:589
 TUnfold.cxx:590
 TUnfold.cxx:591
 TUnfold.cxx:592
 TUnfold.cxx:593
 TUnfold.cxx:594
 TUnfold.cxx:595
 TUnfold.cxx:596
 TUnfold.cxx:597
 TUnfold.cxx:598
 TUnfold.cxx:599
 TUnfold.cxx:600
 TUnfold.cxx:601
 TUnfold.cxx:602
 TUnfold.cxx:603
 TUnfold.cxx:604
 TUnfold.cxx:605
 TUnfold.cxx:606
 TUnfold.cxx:607
 TUnfold.cxx:608
 TUnfold.cxx:609
 TUnfold.cxx:610
 TUnfold.cxx:611
 TUnfold.cxx:612
 TUnfold.cxx:613
 TUnfold.cxx:614
 TUnfold.cxx:615
 TUnfold.cxx:616
 TUnfold.cxx:617
 TUnfold.cxx:618
 TUnfold.cxx:619
 TUnfold.cxx:620
 TUnfold.cxx:621
 TUnfold.cxx:622
 TUnfold.cxx:623
 TUnfold.cxx:624
 TUnfold.cxx:625
 TUnfold.cxx:626
 TUnfold.cxx:627
 TUnfold.cxx:628
 TUnfold.cxx:629
 TUnfold.cxx:630
 TUnfold.cxx:631
 TUnfold.cxx:632
 TUnfold.cxx:633
 TUnfold.cxx:634
 TUnfold.cxx:635
 TUnfold.cxx:636
 TUnfold.cxx:637
 TUnfold.cxx:638
 TUnfold.cxx:639
 TUnfold.cxx:640
 TUnfold.cxx:641
 TUnfold.cxx:642
 TUnfold.cxx:643
 TUnfold.cxx:644
 TUnfold.cxx:645
 TUnfold.cxx:646
 TUnfold.cxx:647
 TUnfold.cxx:648
 TUnfold.cxx:649
 TUnfold.cxx:650
 TUnfold.cxx:651
 TUnfold.cxx:652
 TUnfold.cxx:653
 TUnfold.cxx:654
 TUnfold.cxx:655
 TUnfold.cxx:656
 TUnfold.cxx:657
 TUnfold.cxx:658
 TUnfold.cxx:659
 TUnfold.cxx:660
 TUnfold.cxx:661
 TUnfold.cxx:662
 TUnfold.cxx:663
 TUnfold.cxx:664
 TUnfold.cxx:665
 TUnfold.cxx:666
 TUnfold.cxx:667
 TUnfold.cxx:668
 TUnfold.cxx:669
 TUnfold.cxx:670
 TUnfold.cxx:671
 TUnfold.cxx:672
 TUnfold.cxx:673
 TUnfold.cxx:674
 TUnfold.cxx:675
 TUnfold.cxx:676
 TUnfold.cxx:677
 TUnfold.cxx:678
 TUnfold.cxx:679
 TUnfold.cxx:680
 TUnfold.cxx:681
 TUnfold.cxx:682
 TUnfold.cxx:683
 TUnfold.cxx:684
 TUnfold.cxx:685
 TUnfold.cxx:686
 TUnfold.cxx:687
 TUnfold.cxx:688
 TUnfold.cxx:689
 TUnfold.cxx:690
 TUnfold.cxx:691
 TUnfold.cxx:692
 TUnfold.cxx:693
 TUnfold.cxx:694
 TUnfold.cxx:695
 TUnfold.cxx:696
 TUnfold.cxx:697
 TUnfold.cxx:698
 TUnfold.cxx:699
 TUnfold.cxx:700
 TUnfold.cxx:701
 TUnfold.cxx:702
 TUnfold.cxx:703
 TUnfold.cxx:704
 TUnfold.cxx:705
 TUnfold.cxx:706
 TUnfold.cxx:707
 TUnfold.cxx:708
 TUnfold.cxx:709
 TUnfold.cxx:710
 TUnfold.cxx:711
 TUnfold.cxx:712
 TUnfold.cxx:713
 TUnfold.cxx:714
 TUnfold.cxx:715
 TUnfold.cxx:716
 TUnfold.cxx:717
 TUnfold.cxx:718
 TUnfold.cxx:719
 TUnfold.cxx:720
 TUnfold.cxx:721
 TUnfold.cxx:722
 TUnfold.cxx:723
 TUnfold.cxx:724
 TUnfold.cxx:725
 TUnfold.cxx:726
 TUnfold.cxx:727
 TUnfold.cxx:728
 TUnfold.cxx:729
 TUnfold.cxx:730
 TUnfold.cxx:731
 TUnfold.cxx:732
 TUnfold.cxx:733
 TUnfold.cxx:734
 TUnfold.cxx:735
 TUnfold.cxx:736
 TUnfold.cxx:737
 TUnfold.cxx:738
 TUnfold.cxx:739
 TUnfold.cxx:740
 TUnfold.cxx:741
 TUnfold.cxx:742
 TUnfold.cxx:743
 TUnfold.cxx:744
 TUnfold.cxx:745
 TUnfold.cxx:746
 TUnfold.cxx:747
 TUnfold.cxx:748
 TUnfold.cxx:749
 TUnfold.cxx:750
 TUnfold.cxx:751
 TUnfold.cxx:752
 TUnfold.cxx:753
 TUnfold.cxx:754
 TUnfold.cxx:755
 TUnfold.cxx:756
 TUnfold.cxx:757
 TUnfold.cxx:758
 TUnfold.cxx:759
 TUnfold.cxx:760
 TUnfold.cxx:761
 TUnfold.cxx:762
 TUnfold.cxx:763
 TUnfold.cxx:764
 TUnfold.cxx:765
 TUnfold.cxx:766
 TUnfold.cxx:767
 TUnfold.cxx:768
 TUnfold.cxx:769
 TUnfold.cxx:770
 TUnfold.cxx:771
 TUnfold.cxx:772
 TUnfold.cxx:773
 TUnfold.cxx:774
 TUnfold.cxx:775
 TUnfold.cxx:776
 TUnfold.cxx:777
 TUnfold.cxx:778
 TUnfold.cxx:779
 TUnfold.cxx:780
 TUnfold.cxx:781
 TUnfold.cxx:782
 TUnfold.cxx:783
 TUnfold.cxx:784
 TUnfold.cxx:785
 TUnfold.cxx:786
 TUnfold.cxx:787
 TUnfold.cxx:788
 TUnfold.cxx:789
 TUnfold.cxx:790
 TUnfold.cxx:791
 TUnfold.cxx:792
 TUnfold.cxx:793
 TUnfold.cxx:794
 TUnfold.cxx:795
 TUnfold.cxx:796
 TUnfold.cxx:797
 TUnfold.cxx:798
 TUnfold.cxx:799
 TUnfold.cxx:800
 TUnfold.cxx:801
 TUnfold.cxx:802
 TUnfold.cxx:803
 TUnfold.cxx:804
 TUnfold.cxx:805
 TUnfold.cxx:806
 TUnfold.cxx:807
 TUnfold.cxx:808
 TUnfold.cxx:809
 TUnfold.cxx:810
 TUnfold.cxx:811
 TUnfold.cxx:812
 TUnfold.cxx:813
 TUnfold.cxx:814
 TUnfold.cxx:815
 TUnfold.cxx:816
 TUnfold.cxx:817
 TUnfold.cxx:818
 TUnfold.cxx:819
 TUnfold.cxx:820
 TUnfold.cxx:821
 TUnfold.cxx:822
 TUnfold.cxx:823
 TUnfold.cxx:824
 TUnfold.cxx:825
 TUnfold.cxx:826
 TUnfold.cxx:827
 TUnfold.cxx:828
 TUnfold.cxx:829
 TUnfold.cxx:830
 TUnfold.cxx:831
 TUnfold.cxx:832
 TUnfold.cxx:833
 TUnfold.cxx:834
 TUnfold.cxx:835
 TUnfold.cxx:836
 TUnfold.cxx:837
 TUnfold.cxx:838
 TUnfold.cxx:839
 TUnfold.cxx:840
 TUnfold.cxx:841
 TUnfold.cxx:842
 TUnfold.cxx:843
 TUnfold.cxx:844
 TUnfold.cxx:845
 TUnfold.cxx:846
 TUnfold.cxx:847
 TUnfold.cxx:848
 TUnfold.cxx:849
 TUnfold.cxx:850
 TUnfold.cxx:851
 TUnfold.cxx:852
 TUnfold.cxx:853
 TUnfold.cxx:854
 TUnfold.cxx:855
 TUnfold.cxx:856
 TUnfold.cxx:857
 TUnfold.cxx:858
 TUnfold.cxx:859
 TUnfold.cxx:860
 TUnfold.cxx:861
 TUnfold.cxx:862
 TUnfold.cxx:863
 TUnfold.cxx:864
 TUnfold.cxx:865
 TUnfold.cxx:866
 TUnfold.cxx:867
 TUnfold.cxx:868
 TUnfold.cxx:869
 TUnfold.cxx:870
 TUnfold.cxx:871
 TUnfold.cxx:872
 TUnfold.cxx:873
 TUnfold.cxx:874
 TUnfold.cxx:875
 TUnfold.cxx:876
 TUnfold.cxx:877
 TUnfold.cxx:878
 TUnfold.cxx:879
 TUnfold.cxx:880
 TUnfold.cxx:881
 TUnfold.cxx:882
 TUnfold.cxx:883
 TUnfold.cxx:884
 TUnfold.cxx:885
 TUnfold.cxx:886
 TUnfold.cxx:887
 TUnfold.cxx:888
 TUnfold.cxx:889
 TUnfold.cxx:890
 TUnfold.cxx:891
 TUnfold.cxx:892
 TUnfold.cxx:893
 TUnfold.cxx:894
 TUnfold.cxx:895
 TUnfold.cxx:896
 TUnfold.cxx:897
 TUnfold.cxx:898
 TUnfold.cxx:899
 TUnfold.cxx:900
 TUnfold.cxx:901
 TUnfold.cxx:902
 TUnfold.cxx:903
 TUnfold.cxx:904
 TUnfold.cxx:905
 TUnfold.cxx:906
 TUnfold.cxx:907
 TUnfold.cxx:908
 TUnfold.cxx:909
 TUnfold.cxx:910
 TUnfold.cxx:911
 TUnfold.cxx:912
 TUnfold.cxx:913
 TUnfold.cxx:914
 TUnfold.cxx:915
 TUnfold.cxx:916
 TUnfold.cxx:917
 TUnfold.cxx:918
 TUnfold.cxx:919
 TUnfold.cxx:920
 TUnfold.cxx:921
 TUnfold.cxx:922
 TUnfold.cxx:923
 TUnfold.cxx:924
 TUnfold.cxx:925
 TUnfold.cxx:926
 TUnfold.cxx:927
 TUnfold.cxx:928
 TUnfold.cxx:929
 TUnfold.cxx:930
 TUnfold.cxx:931
 TUnfold.cxx:932
 TUnfold.cxx:933
 TUnfold.cxx:934
 TUnfold.cxx:935
 TUnfold.cxx:936
 TUnfold.cxx:937
 TUnfold.cxx:938
 TUnfold.cxx:939
 TUnfold.cxx:940
 TUnfold.cxx:941
 TUnfold.cxx:942
 TUnfold.cxx:943
 TUnfold.cxx:944
 TUnfold.cxx:945
 TUnfold.cxx:946
 TUnfold.cxx:947
 TUnfold.cxx:948
 TUnfold.cxx:949
 TUnfold.cxx:950
 TUnfold.cxx:951
 TUnfold.cxx:952
 TUnfold.cxx:953
 TUnfold.cxx:954
 TUnfold.cxx:955
 TUnfold.cxx:956
 TUnfold.cxx:957
 TUnfold.cxx:958
 TUnfold.cxx:959
 TUnfold.cxx:960
 TUnfold.cxx:961
 TUnfold.cxx:962
 TUnfold.cxx:963
 TUnfold.cxx:964
 TUnfold.cxx:965
 TUnfold.cxx:966
 TUnfold.cxx:967
 TUnfold.cxx:968
 TUnfold.cxx:969
 TUnfold.cxx:970
 TUnfold.cxx:971
 TUnfold.cxx:972
 TUnfold.cxx:973
 TUnfold.cxx:974
 TUnfold.cxx:975
 TUnfold.cxx:976
 TUnfold.cxx:977
 TUnfold.cxx:978
 TUnfold.cxx:979
 TUnfold.cxx:980
 TUnfold.cxx:981
 TUnfold.cxx:982
 TUnfold.cxx:983
 TUnfold.cxx:984
 TUnfold.cxx:985
 TUnfold.cxx:986
 TUnfold.cxx:987
 TUnfold.cxx:988
 TUnfold.cxx:989
 TUnfold.cxx:990
 TUnfold.cxx:991
 TUnfold.cxx:992
 TUnfold.cxx:993
 TUnfold.cxx:994
 TUnfold.cxx:995
 TUnfold.cxx:996
 TUnfold.cxx:997
 TUnfold.cxx:998
 TUnfold.cxx:999
 TUnfold.cxx:1000
 TUnfold.cxx:1001
 TUnfold.cxx:1002
 TUnfold.cxx:1003
 TUnfold.cxx:1004
 TUnfold.cxx:1005
 TUnfold.cxx:1006
 TUnfold.cxx:1007
 TUnfold.cxx:1008
 TUnfold.cxx:1009
 TUnfold.cxx:1010
 TUnfold.cxx:1011
 TUnfold.cxx:1012
 TUnfold.cxx:1013
 TUnfold.cxx:1014
 TUnfold.cxx:1015
 TUnfold.cxx:1016
 TUnfold.cxx:1017
 TUnfold.cxx:1018
 TUnfold.cxx:1019
 TUnfold.cxx:1020
 TUnfold.cxx:1021
 TUnfold.cxx:1022
 TUnfold.cxx:1023
 TUnfold.cxx:1024
 TUnfold.cxx:1025
 TUnfold.cxx:1026
 TUnfold.cxx:1027
 TUnfold.cxx:1028
 TUnfold.cxx:1029
 TUnfold.cxx:1030
 TUnfold.cxx:1031
 TUnfold.cxx:1032
 TUnfold.cxx:1033
 TUnfold.cxx:1034
 TUnfold.cxx:1035
 TUnfold.cxx:1036
 TUnfold.cxx:1037
 TUnfold.cxx:1038
 TUnfold.cxx:1039
 TUnfold.cxx:1040
 TUnfold.cxx:1041
 TUnfold.cxx:1042
 TUnfold.cxx:1043
 TUnfold.cxx:1044
 TUnfold.cxx:1045
 TUnfold.cxx:1046
 TUnfold.cxx:1047
 TUnfold.cxx:1048
 TUnfold.cxx:1049
 TUnfold.cxx:1050
 TUnfold.cxx:1051
 TUnfold.cxx:1052
 TUnfold.cxx:1053
 TUnfold.cxx:1054
 TUnfold.cxx:1055
 TUnfold.cxx:1056
 TUnfold.cxx:1057
 TUnfold.cxx:1058
 TUnfold.cxx:1059
 TUnfold.cxx:1060
 TUnfold.cxx:1061
 TUnfold.cxx:1062
 TUnfold.cxx:1063
 TUnfold.cxx:1064
 TUnfold.cxx:1065
 TUnfold.cxx:1066
 TUnfold.cxx:1067
 TUnfold.cxx:1068
 TUnfold.cxx:1069
 TUnfold.cxx:1070
 TUnfold.cxx:1071
 TUnfold.cxx:1072
 TUnfold.cxx:1073
 TUnfold.cxx:1074
 TUnfold.cxx:1075
 TUnfold.cxx:1076
 TUnfold.cxx:1077
 TUnfold.cxx:1078
 TUnfold.cxx:1079
 TUnfold.cxx:1080
 TUnfold.cxx:1081
 TUnfold.cxx:1082
 TUnfold.cxx:1083
 TUnfold.cxx:1084
 TUnfold.cxx:1085
 TUnfold.cxx:1086
 TUnfold.cxx:1087
 TUnfold.cxx:1088
 TUnfold.cxx:1089
 TUnfold.cxx:1090
 TUnfold.cxx:1091
 TUnfold.cxx:1092
 TUnfold.cxx:1093
 TUnfold.cxx:1094
 TUnfold.cxx:1095
 TUnfold.cxx:1096
 TUnfold.cxx:1097
 TUnfold.cxx:1098
 TUnfold.cxx:1099
 TUnfold.cxx:1100
 TUnfold.cxx:1101
 TUnfold.cxx:1102
 TUnfold.cxx:1103
 TUnfold.cxx:1104
 TUnfold.cxx:1105
 TUnfold.cxx:1106
 TUnfold.cxx:1107
 TUnfold.cxx:1108
 TUnfold.cxx:1109
 TUnfold.cxx:1110
 TUnfold.cxx:1111
 TUnfold.cxx:1112
 TUnfold.cxx:1113
 TUnfold.cxx:1114
 TUnfold.cxx:1115
 TUnfold.cxx:1116
 TUnfold.cxx:1117
 TUnfold.cxx:1118
 TUnfold.cxx:1119
 TUnfold.cxx:1120
 TUnfold.cxx:1121
 TUnfold.cxx:1122
 TUnfold.cxx:1123
 TUnfold.cxx:1124
 TUnfold.cxx:1125
 TUnfold.cxx:1126
 TUnfold.cxx:1127
 TUnfold.cxx:1128
 TUnfold.cxx:1129
 TUnfold.cxx:1130
 TUnfold.cxx:1131
 TUnfold.cxx:1132
 TUnfold.cxx:1133
 TUnfold.cxx:1134
 TUnfold.cxx:1135
 TUnfold.cxx:1136
 TUnfold.cxx:1137
 TUnfold.cxx:1138
 TUnfold.cxx:1139
 TUnfold.cxx:1140
 TUnfold.cxx:1141
 TUnfold.cxx:1142
 TUnfold.cxx:1143
 TUnfold.cxx:1144
 TUnfold.cxx:1145
 TUnfold.cxx:1146
 TUnfold.cxx:1147
 TUnfold.cxx:1148
 TUnfold.cxx:1149
 TUnfold.cxx:1150
 TUnfold.cxx:1151
 TUnfold.cxx:1152
 TUnfold.cxx:1153
 TUnfold.cxx:1154
 TUnfold.cxx:1155
 TUnfold.cxx:1156
 TUnfold.cxx:1157
 TUnfold.cxx:1158
 TUnfold.cxx:1159
 TUnfold.cxx:1160
 TUnfold.cxx:1161
 TUnfold.cxx:1162
 TUnfold.cxx:1163
 TUnfold.cxx:1164
 TUnfold.cxx:1165
 TUnfold.cxx:1166
 TUnfold.cxx:1167
 TUnfold.cxx:1168
 TUnfold.cxx:1169
 TUnfold.cxx:1170
 TUnfold.cxx:1171
 TUnfold.cxx:1172
 TUnfold.cxx:1173
 TUnfold.cxx:1174
 TUnfold.cxx:1175
 TUnfold.cxx:1176
 TUnfold.cxx:1177
 TUnfold.cxx:1178
 TUnfold.cxx:1179
 TUnfold.cxx:1180
 TUnfold.cxx:1181
 TUnfold.cxx:1182
 TUnfold.cxx:1183
 TUnfold.cxx:1184
 TUnfold.cxx:1185
 TUnfold.cxx:1186
 TUnfold.cxx:1187
 TUnfold.cxx:1188
 TUnfold.cxx:1189
 TUnfold.cxx:1190
 TUnfold.cxx:1191
 TUnfold.cxx:1192
 TUnfold.cxx:1193
 TUnfold.cxx:1194
 TUnfold.cxx:1195
 TUnfold.cxx:1196
 TUnfold.cxx:1197
 TUnfold.cxx:1198
 TUnfold.cxx:1199
 TUnfold.cxx:1200
 TUnfold.cxx:1201
 TUnfold.cxx:1202
 TUnfold.cxx:1203
 TUnfold.cxx:1204
 TUnfold.cxx:1205
 TUnfold.cxx:1206
 TUnfold.cxx:1207
 TUnfold.cxx:1208
 TUnfold.cxx:1209
 TUnfold.cxx:1210
 TUnfold.cxx:1211
 TUnfold.cxx:1212
 TUnfold.cxx:1213
 TUnfold.cxx:1214
 TUnfold.cxx:1215
 TUnfold.cxx:1216
 TUnfold.cxx:1217
 TUnfold.cxx:1218
 TUnfold.cxx:1219
 TUnfold.cxx:1220
 TUnfold.cxx:1221
 TUnfold.cxx:1222
 TUnfold.cxx:1223
 TUnfold.cxx:1224
 TUnfold.cxx:1225
 TUnfold.cxx:1226
 TUnfold.cxx:1227
 TUnfold.cxx:1228
 TUnfold.cxx:1229
 TUnfold.cxx:1230
 TUnfold.cxx:1231
 TUnfold.cxx:1232
 TUnfold.cxx:1233
 TUnfold.cxx:1234
 TUnfold.cxx:1235
 TUnfold.cxx:1236
 TUnfold.cxx:1237
 TUnfold.cxx:1238
 TUnfold.cxx:1239
 TUnfold.cxx:1240
 TUnfold.cxx:1241
 TUnfold.cxx:1242
 TUnfold.cxx:1243
 TUnfold.cxx:1244
 TUnfold.cxx:1245
 TUnfold.cxx:1246
 TUnfold.cxx:1247
 TUnfold.cxx:1248
 TUnfold.cxx:1249
 TUnfold.cxx:1250
 TUnfold.cxx:1251
 TUnfold.cxx:1252
 TUnfold.cxx:1253
 TUnfold.cxx:1254
 TUnfold.cxx:1255
 TUnfold.cxx:1256
 TUnfold.cxx:1257
 TUnfold.cxx:1258
 TUnfold.cxx:1259
 TUnfold.cxx:1260
 TUnfold.cxx:1261
 TUnfold.cxx:1262
 TUnfold.cxx:1263
 TUnfold.cxx:1264
 TUnfold.cxx:1265
 TUnfold.cxx:1266
 TUnfold.cxx:1267
 TUnfold.cxx:1268
 TUnfold.cxx:1269
 TUnfold.cxx:1270
 TUnfold.cxx:1271
 TUnfold.cxx:1272
 TUnfold.cxx:1273
 TUnfold.cxx:1274
 TUnfold.cxx:1275
 TUnfold.cxx:1276
 TUnfold.cxx:1277
 TUnfold.cxx:1278
 TUnfold.cxx:1279
 TUnfold.cxx:1280
 TUnfold.cxx:1281
 TUnfold.cxx:1282
 TUnfold.cxx:1283
 TUnfold.cxx:1284
 TUnfold.cxx:1285
 TUnfold.cxx:1286
 TUnfold.cxx:1287
 TUnfold.cxx:1288
 TUnfold.cxx:1289
 TUnfold.cxx:1290
 TUnfold.cxx:1291
 TUnfold.cxx:1292
 TUnfold.cxx:1293
 TUnfold.cxx:1294
 TUnfold.cxx:1295
 TUnfold.cxx:1296
 TUnfold.cxx:1297
 TUnfold.cxx:1298
 TUnfold.cxx:1299
 TUnfold.cxx:1300
 TUnfold.cxx:1301
 TUnfold.cxx:1302
 TUnfold.cxx:1303
 TUnfold.cxx:1304
 TUnfold.cxx:1305
 TUnfold.cxx:1306
 TUnfold.cxx:1307
 TUnfold.cxx:1308
 TUnfold.cxx:1309
 TUnfold.cxx:1310
 TUnfold.cxx:1311
 TUnfold.cxx:1312
 TUnfold.cxx:1313
 TUnfold.cxx:1314
 TUnfold.cxx:1315
 TUnfold.cxx:1316
 TUnfold.cxx:1317
 TUnfold.cxx:1318
 TUnfold.cxx:1319
 TUnfold.cxx:1320
 TUnfold.cxx:1321
 TUnfold.cxx:1322
 TUnfold.cxx:1323
 TUnfold.cxx:1324
 TUnfold.cxx:1325
 TUnfold.cxx:1326
 TUnfold.cxx:1327
 TUnfold.cxx:1328
 TUnfold.cxx:1329
 TUnfold.cxx:1330
 TUnfold.cxx:1331
 TUnfold.cxx:1332
 TUnfold.cxx:1333
 TUnfold.cxx:1334
 TUnfold.cxx:1335
 TUnfold.cxx:1336
 TUnfold.cxx:1337
 TUnfold.cxx:1338
 TUnfold.cxx:1339
 TUnfold.cxx:1340
 TUnfold.cxx:1341
 TUnfold.cxx:1342
 TUnfold.cxx:1343
 TUnfold.cxx:1344
 TUnfold.cxx:1345
 TUnfold.cxx:1346
 TUnfold.cxx:1347
 TUnfold.cxx:1348
 TUnfold.cxx:1349
 TUnfold.cxx:1350
 TUnfold.cxx:1351
 TUnfold.cxx:1352
 TUnfold.cxx:1353
 TUnfold.cxx:1354
 TUnfold.cxx:1355
 TUnfold.cxx:1356
 TUnfold.cxx:1357
 TUnfold.cxx:1358
 TUnfold.cxx:1359
 TUnfold.cxx:1360
 TUnfold.cxx:1361
 TUnfold.cxx:1362
 TUnfold.cxx:1363
 TUnfold.cxx:1364
 TUnfold.cxx:1365
 TUnfold.cxx:1366
 TUnfold.cxx:1367
 TUnfold.cxx:1368
 TUnfold.cxx:1369
 TUnfold.cxx:1370
 TUnfold.cxx:1371
 TUnfold.cxx:1372
 TUnfold.cxx:1373
 TUnfold.cxx:1374
 TUnfold.cxx:1375
 TUnfold.cxx:1376
 TUnfold.cxx:1377
 TUnfold.cxx:1378
 TUnfold.cxx:1379
 TUnfold.cxx:1380
 TUnfold.cxx:1381
 TUnfold.cxx:1382
 TUnfold.cxx:1383
 TUnfold.cxx:1384
 TUnfold.cxx:1385
 TUnfold.cxx:1386
 TUnfold.cxx:1387
 TUnfold.cxx:1388
 TUnfold.cxx:1389
 TUnfold.cxx:1390
 TUnfold.cxx:1391
 TUnfold.cxx:1392
 TUnfold.cxx:1393
 TUnfold.cxx:1394
 TUnfold.cxx:1395
 TUnfold.cxx:1396
 TUnfold.cxx:1397
 TUnfold.cxx:1398
 TUnfold.cxx:1399
 TUnfold.cxx:1400
 TUnfold.cxx:1401
 TUnfold.cxx:1402
 TUnfold.cxx:1403
 TUnfold.cxx:1404
 TUnfold.cxx:1405
 TUnfold.cxx:1406
 TUnfold.cxx:1407
 TUnfold.cxx:1408
 TUnfold.cxx:1409
 TUnfold.cxx:1410
 TUnfold.cxx:1411
 TUnfold.cxx:1412
 TUnfold.cxx:1413
 TUnfold.cxx:1414
 TUnfold.cxx:1415
 TUnfold.cxx:1416
 TUnfold.cxx:1417
 TUnfold.cxx:1418
 TUnfold.cxx:1419
 TUnfold.cxx:1420
 TUnfold.cxx:1421
 TUnfold.cxx:1422
 TUnfold.cxx:1423
 TUnfold.cxx:1424
 TUnfold.cxx:1425
 TUnfold.cxx:1426
 TUnfold.cxx:1427
 TUnfold.cxx:1428
 TUnfold.cxx:1429
 TUnfold.cxx:1430
 TUnfold.cxx:1431
 TUnfold.cxx:1432
 TUnfold.cxx:1433
 TUnfold.cxx:1434
 TUnfold.cxx:1435
 TUnfold.cxx:1436
 TUnfold.cxx:1437
 TUnfold.cxx:1438
 TUnfold.cxx:1439
 TUnfold.cxx:1440
 TUnfold.cxx:1441
 TUnfold.cxx:1442
 TUnfold.cxx:1443
 TUnfold.cxx:1444
 TUnfold.cxx:1445
 TUnfold.cxx:1446
 TUnfold.cxx:1447
 TUnfold.cxx:1448
 TUnfold.cxx:1449
 TUnfold.cxx:1450
 TUnfold.cxx:1451
 TUnfold.cxx:1452
 TUnfold.cxx:1453
 TUnfold.cxx:1454
 TUnfold.cxx:1455
 TUnfold.cxx:1456
 TUnfold.cxx:1457
 TUnfold.cxx:1458
 TUnfold.cxx:1459
 TUnfold.cxx:1460
 TUnfold.cxx:1461
 TUnfold.cxx:1462
 TUnfold.cxx:1463
 TUnfold.cxx:1464
 TUnfold.cxx:1465
 TUnfold.cxx:1466
 TUnfold.cxx:1467
 TUnfold.cxx:1468
 TUnfold.cxx:1469
 TUnfold.cxx:1470
 TUnfold.cxx:1471
 TUnfold.cxx:1472
 TUnfold.cxx:1473
 TUnfold.cxx:1474
 TUnfold.cxx:1475
 TUnfold.cxx:1476
 TUnfold.cxx:1477
 TUnfold.cxx:1478
 TUnfold.cxx:1479
 TUnfold.cxx:1480
 TUnfold.cxx:1481
 TUnfold.cxx:1482
 TUnfold.cxx:1483
 TUnfold.cxx:1484
 TUnfold.cxx:1485
 TUnfold.cxx:1486
 TUnfold.cxx:1487
 TUnfold.cxx:1488
 TUnfold.cxx:1489
 TUnfold.cxx:1490
 TUnfold.cxx:1491
 TUnfold.cxx:1492
 TUnfold.cxx:1493
 TUnfold.cxx:1494
 TUnfold.cxx:1495
 TUnfold.cxx:1496
 TUnfold.cxx:1497
 TUnfold.cxx:1498
 TUnfold.cxx:1499
 TUnfold.cxx:1500
 TUnfold.cxx:1501
 TUnfold.cxx:1502
 TUnfold.cxx:1503
 TUnfold.cxx:1504
 TUnfold.cxx:1505
 TUnfold.cxx:1506
 TUnfold.cxx:1507
 TUnfold.cxx:1508
 TUnfold.cxx:1509
 TUnfold.cxx:1510
 TUnfold.cxx:1511
 TUnfold.cxx:1512
 TUnfold.cxx:1513
 TUnfold.cxx:1514
 TUnfold.cxx:1515
 TUnfold.cxx:1516
 TUnfold.cxx:1517
 TUnfold.cxx:1518
 TUnfold.cxx:1519
 TUnfold.cxx:1520
 TUnfold.cxx:1521
 TUnfold.cxx:1522
 TUnfold.cxx:1523
 TUnfold.cxx:1524
 TUnfold.cxx:1525
 TUnfold.cxx:1526
 TUnfold.cxx:1527
 TUnfold.cxx:1528
 TUnfold.cxx:1529
 TUnfold.cxx:1530
 TUnfold.cxx:1531
 TUnfold.cxx:1532
 TUnfold.cxx:1533
 TUnfold.cxx:1534
 TUnfold.cxx:1535
 TUnfold.cxx:1536
 TUnfold.cxx:1537
 TUnfold.cxx:1538
 TUnfold.cxx:1539
 TUnfold.cxx:1540
 TUnfold.cxx:1541
 TUnfold.cxx:1542
 TUnfold.cxx:1543
 TUnfold.cxx:1544
 TUnfold.cxx:1545
 TUnfold.cxx:1546
 TUnfold.cxx:1547
 TUnfold.cxx:1548
 TUnfold.cxx:1549
 TUnfold.cxx:1550
 TUnfold.cxx:1551
 TUnfold.cxx:1552
 TUnfold.cxx:1553
 TUnfold.cxx:1554
 TUnfold.cxx:1555
 TUnfold.cxx:1556
 TUnfold.cxx:1557
 TUnfold.cxx:1558
 TUnfold.cxx:1559
 TUnfold.cxx:1560
 TUnfold.cxx:1561
 TUnfold.cxx:1562
 TUnfold.cxx:1563
 TUnfold.cxx:1564
 TUnfold.cxx:1565
 TUnfold.cxx:1566
 TUnfold.cxx:1567
 TUnfold.cxx:1568
 TUnfold.cxx:1569
 TUnfold.cxx:1570
 TUnfold.cxx:1571
 TUnfold.cxx:1572
 TUnfold.cxx:1573
 TUnfold.cxx:1574
 TUnfold.cxx:1575
 TUnfold.cxx:1576
 TUnfold.cxx:1577
 TUnfold.cxx:1578
 TUnfold.cxx:1579
 TUnfold.cxx:1580
 TUnfold.cxx:1581
 TUnfold.cxx:1582
 TUnfold.cxx:1583
 TUnfold.cxx:1584
 TUnfold.cxx:1585
 TUnfold.cxx:1586
 TUnfold.cxx:1587
 TUnfold.cxx:1588
 TUnfold.cxx:1589
 TUnfold.cxx:1590
 TUnfold.cxx:1591
 TUnfold.cxx:1592
 TUnfold.cxx:1593
 TUnfold.cxx:1594
 TUnfold.cxx:1595
 TUnfold.cxx:1596
 TUnfold.cxx:1597
 TUnfold.cxx:1598
 TUnfold.cxx:1599
 TUnfold.cxx:1600
 TUnfold.cxx:1601
 TUnfold.cxx:1602
 TUnfold.cxx:1603
 TUnfold.cxx:1604
 TUnfold.cxx:1605
 TUnfold.cxx:1606
 TUnfold.cxx:1607
 TUnfold.cxx:1608
 TUnfold.cxx:1609
 TUnfold.cxx:1610
 TUnfold.cxx:1611
 TUnfold.cxx:1612
 TUnfold.cxx:1613
 TUnfold.cxx:1614
 TUnfold.cxx:1615
 TUnfold.cxx:1616
 TUnfold.cxx:1617
 TUnfold.cxx:1618
 TUnfold.cxx:1619
 TUnfold.cxx:1620
 TUnfold.cxx:1621
 TUnfold.cxx:1622
 TUnfold.cxx:1623
 TUnfold.cxx:1624
 TUnfold.cxx:1625
 TUnfold.cxx:1626
 TUnfold.cxx:1627
 TUnfold.cxx:1628
 TUnfold.cxx:1629
 TUnfold.cxx:1630
 TUnfold.cxx:1631
 TUnfold.cxx:1632
 TUnfold.cxx:1633
 TUnfold.cxx:1634
 TUnfold.cxx:1635
 TUnfold.cxx:1636
 TUnfold.cxx:1637
 TUnfold.cxx:1638
 TUnfold.cxx:1639
 TUnfold.cxx:1640
 TUnfold.cxx:1641
 TUnfold.cxx:1642
 TUnfold.cxx:1643
 TUnfold.cxx:1644
 TUnfold.cxx:1645
 TUnfold.cxx:1646
 TUnfold.cxx:1647
 TUnfold.cxx:1648
 TUnfold.cxx:1649
 TUnfold.cxx:1650
 TUnfold.cxx:1651
 TUnfold.cxx:1652
 TUnfold.cxx:1653
 TUnfold.cxx:1654
 TUnfold.cxx:1655
 TUnfold.cxx:1656
 TUnfold.cxx:1657
 TUnfold.cxx:1658
 TUnfold.cxx:1659
 TUnfold.cxx:1660
 TUnfold.cxx:1661
 TUnfold.cxx:1662
 TUnfold.cxx:1663
 TUnfold.cxx:1664
 TUnfold.cxx:1665
 TUnfold.cxx:1666
 TUnfold.cxx:1667
 TUnfold.cxx:1668
 TUnfold.cxx:1669
 TUnfold.cxx:1670
 TUnfold.cxx:1671
 TUnfold.cxx:1672
 TUnfold.cxx:1673
 TUnfold.cxx:1674
 TUnfold.cxx:1675
 TUnfold.cxx:1676
 TUnfold.cxx:1677
 TUnfold.cxx:1678
 TUnfold.cxx:1679
 TUnfold.cxx:1680
 TUnfold.cxx:1681
 TUnfold.cxx:1682
 TUnfold.cxx:1683
 TUnfold.cxx:1684
 TUnfold.cxx:1685
 TUnfold.cxx:1686
 TUnfold.cxx:1687
 TUnfold.cxx:1688
 TUnfold.cxx:1689
 TUnfold.cxx:1690
 TUnfold.cxx:1691
 TUnfold.cxx:1692
 TUnfold.cxx:1693
 TUnfold.cxx:1694
 TUnfold.cxx:1695
 TUnfold.cxx:1696
 TUnfold.cxx:1697
 TUnfold.cxx:1698
 TUnfold.cxx:1699
 TUnfold.cxx:1700
 TUnfold.cxx:1701
 TUnfold.cxx:1702
 TUnfold.cxx:1703
 TUnfold.cxx:1704
 TUnfold.cxx:1705
 TUnfold.cxx:1706
 TUnfold.cxx:1707
 TUnfold.cxx:1708
 TUnfold.cxx:1709
 TUnfold.cxx:1710
 TUnfold.cxx:1711
 TUnfold.cxx:1712
 TUnfold.cxx:1713
 TUnfold.cxx:1714
 TUnfold.cxx:1715
 TUnfold.cxx:1716
 TUnfold.cxx:1717
 TUnfold.cxx:1718
 TUnfold.cxx:1719
 TUnfold.cxx:1720
 TUnfold.cxx:1721
 TUnfold.cxx:1722
 TUnfold.cxx:1723
 TUnfold.cxx:1724
 TUnfold.cxx:1725
 TUnfold.cxx:1726
 TUnfold.cxx:1727
 TUnfold.cxx:1728
 TUnfold.cxx:1729
 TUnfold.cxx:1730
 TUnfold.cxx:1731
 TUnfold.cxx:1732
 TUnfold.cxx:1733
 TUnfold.cxx:1734
 TUnfold.cxx:1735
 TUnfold.cxx:1736
 TUnfold.cxx:1737
 TUnfold.cxx:1738
 TUnfold.cxx:1739
 TUnfold.cxx:1740
 TUnfold.cxx:1741
 TUnfold.cxx:1742
 TUnfold.cxx:1743
 TUnfold.cxx:1744
 TUnfold.cxx:1745
 TUnfold.cxx:1746
 TUnfold.cxx:1747
 TUnfold.cxx:1748
 TUnfold.cxx:1749
 TUnfold.cxx:1750
 TUnfold.cxx:1751
 TUnfold.cxx:1752
 TUnfold.cxx:1753
 TUnfold.cxx:1754
 TUnfold.cxx:1755
 TUnfold.cxx:1756
 TUnfold.cxx:1757
 TUnfold.cxx:1758
 TUnfold.cxx:1759
 TUnfold.cxx:1760
 TUnfold.cxx:1761
 TUnfold.cxx:1762
 TUnfold.cxx:1763
 TUnfold.cxx:1764
 TUnfold.cxx:1765
 TUnfold.cxx:1766
 TUnfold.cxx:1767
 TUnfold.cxx:1768
 TUnfold.cxx:1769
 TUnfold.cxx:1770
 TUnfold.cxx:1771
 TUnfold.cxx:1772
 TUnfold.cxx:1773
 TUnfold.cxx:1774
 TUnfold.cxx:1775
 TUnfold.cxx:1776
 TUnfold.cxx:1777
 TUnfold.cxx:1778
 TUnfold.cxx:1779
 TUnfold.cxx:1780
 TUnfold.cxx:1781
 TUnfold.cxx:1782
 TUnfold.cxx:1783
 TUnfold.cxx:1784
 TUnfold.cxx:1785
 TUnfold.cxx:1786
 TUnfold.cxx:1787
 TUnfold.cxx:1788
 TUnfold.cxx:1789
 TUnfold.cxx:1790
 TUnfold.cxx:1791
 TUnfold.cxx:1792
 TUnfold.cxx:1793
 TUnfold.cxx:1794
 TUnfold.cxx:1795
 TUnfold.cxx:1796
 TUnfold.cxx:1797
 TUnfold.cxx:1798
 TUnfold.cxx:1799
 TUnfold.cxx:1800
 TUnfold.cxx:1801
 TUnfold.cxx:1802
 TUnfold.cxx:1803
 TUnfold.cxx:1804
 TUnfold.cxx:1805
 TUnfold.cxx:1806
 TUnfold.cxx:1807
 TUnfold.cxx:1808
 TUnfold.cxx:1809
 TUnfold.cxx:1810
 TUnfold.cxx:1811
 TUnfold.cxx:1812
 TUnfold.cxx:1813
 TUnfold.cxx:1814
 TUnfold.cxx:1815
 TUnfold.cxx:1816
 TUnfold.cxx:1817
 TUnfold.cxx:1818
 TUnfold.cxx:1819
 TUnfold.cxx:1820
 TUnfold.cxx:1821
 TUnfold.cxx:1822
 TUnfold.cxx:1823
 TUnfold.cxx:1824
 TUnfold.cxx:1825
 TUnfold.cxx:1826
 TUnfold.cxx:1827
 TUnfold.cxx:1828
 TUnfold.cxx:1829
 TUnfold.cxx:1830
 TUnfold.cxx:1831
 TUnfold.cxx:1832
 TUnfold.cxx:1833
 TUnfold.cxx:1834
 TUnfold.cxx:1835
 TUnfold.cxx:1836
 TUnfold.cxx:1837
 TUnfold.cxx:1838
 TUnfold.cxx:1839
 TUnfold.cxx:1840
 TUnfold.cxx:1841
 TUnfold.cxx:1842
 TUnfold.cxx:1843
 TUnfold.cxx:1844
 TUnfold.cxx:1845
 TUnfold.cxx:1846
 TUnfold.cxx:1847
 TUnfold.cxx:1848
 TUnfold.cxx:1849
 TUnfold.cxx:1850
 TUnfold.cxx:1851
 TUnfold.cxx:1852
 TUnfold.cxx:1853
 TUnfold.cxx:1854
 TUnfold.cxx:1855
 TUnfold.cxx:1856
 TUnfold.cxx:1857
 TUnfold.cxx:1858
 TUnfold.cxx:1859
 TUnfold.cxx:1860
 TUnfold.cxx:1861
 TUnfold.cxx:1862
 TUnfold.cxx:1863
 TUnfold.cxx:1864
 TUnfold.cxx:1865
 TUnfold.cxx:1866
 TUnfold.cxx:1867
 TUnfold.cxx:1868
 TUnfold.cxx:1869
 TUnfold.cxx:1870
 TUnfold.cxx:1871
 TUnfold.cxx:1872
 TUnfold.cxx:1873
 TUnfold.cxx:1874
 TUnfold.cxx:1875
 TUnfold.cxx:1876
 TUnfold.cxx:1877
 TUnfold.cxx:1878
 TUnfold.cxx:1879
 TUnfold.cxx:1880
 TUnfold.cxx:1881
 TUnfold.cxx:1882
 TUnfold.cxx:1883
 TUnfold.cxx:1884
 TUnfold.cxx:1885
 TUnfold.cxx:1886
 TUnfold.cxx:1887
 TUnfold.cxx:1888
 TUnfold.cxx:1889
 TUnfold.cxx:1890
 TUnfold.cxx:1891
 TUnfold.cxx:1892
 TUnfold.cxx:1893
 TUnfold.cxx:1894
 TUnfold.cxx:1895
 TUnfold.cxx:1896
 TUnfold.cxx:1897
 TUnfold.cxx:1898
 TUnfold.cxx:1899
 TUnfold.cxx:1900
 TUnfold.cxx:1901
 TUnfold.cxx:1902
 TUnfold.cxx:1903
 TUnfold.cxx:1904
 TUnfold.cxx:1905
 TUnfold.cxx:1906
 TUnfold.cxx:1907
 TUnfold.cxx:1908
 TUnfold.cxx:1909
 TUnfold.cxx:1910
 TUnfold.cxx:1911
 TUnfold.cxx:1912
 TUnfold.cxx:1913
 TUnfold.cxx:1914
 TUnfold.cxx:1915
 TUnfold.cxx:1916
 TUnfold.cxx:1917
 TUnfold.cxx:1918
 TUnfold.cxx:1919
 TUnfold.cxx:1920
 TUnfold.cxx:1921
 TUnfold.cxx:1922
 TUnfold.cxx:1923
 TUnfold.cxx:1924
 TUnfold.cxx:1925
 TUnfold.cxx:1926
 TUnfold.cxx:1927
 TUnfold.cxx:1928
 TUnfold.cxx:1929
 TUnfold.cxx:1930
 TUnfold.cxx:1931
 TUnfold.cxx:1932
 TUnfold.cxx:1933
 TUnfold.cxx:1934
 TUnfold.cxx:1935
 TUnfold.cxx:1936
 TUnfold.cxx:1937
 TUnfold.cxx:1938
 TUnfold.cxx:1939
 TUnfold.cxx:1940
 TUnfold.cxx:1941
 TUnfold.cxx:1942
 TUnfold.cxx:1943
 TUnfold.cxx:1944
 TUnfold.cxx:1945
 TUnfold.cxx:1946
 TUnfold.cxx:1947
 TUnfold.cxx:1948
 TUnfold.cxx:1949
 TUnfold.cxx:1950
 TUnfold.cxx:1951
 TUnfold.cxx:1952
 TUnfold.cxx:1953
 TUnfold.cxx:1954
 TUnfold.cxx:1955
 TUnfold.cxx:1956
 TUnfold.cxx:1957
 TUnfold.cxx:1958
 TUnfold.cxx:1959
 TUnfold.cxx:1960
 TUnfold.cxx:1961
 TUnfold.cxx:1962
 TUnfold.cxx:1963
 TUnfold.cxx:1964
 TUnfold.cxx:1965
 TUnfold.cxx:1966
 TUnfold.cxx:1967
 TUnfold.cxx:1968
 TUnfold.cxx:1969
 TUnfold.cxx:1970
 TUnfold.cxx:1971
 TUnfold.cxx:1972
 TUnfold.cxx:1973
 TUnfold.cxx:1974
 TUnfold.cxx:1975
 TUnfold.cxx:1976
 TUnfold.cxx:1977
 TUnfold.cxx:1978
 TUnfold.cxx:1979
 TUnfold.cxx:1980
 TUnfold.cxx:1981
 TUnfold.cxx:1982
 TUnfold.cxx:1983
 TUnfold.cxx:1984
 TUnfold.cxx:1985
 TUnfold.cxx:1986
 TUnfold.cxx:1987
 TUnfold.cxx:1988
 TUnfold.cxx:1989
 TUnfold.cxx:1990
 TUnfold.cxx:1991
 TUnfold.cxx:1992
 TUnfold.cxx:1993
 TUnfold.cxx:1994
 TUnfold.cxx:1995
 TUnfold.cxx:1996
 TUnfold.cxx:1997
 TUnfold.cxx:1998
 TUnfold.cxx:1999
 TUnfold.cxx:2000
 TUnfold.cxx:2001
 TUnfold.cxx:2002
 TUnfold.cxx:2003
 TUnfold.cxx:2004
 TUnfold.cxx:2005
 TUnfold.cxx:2006
 TUnfold.cxx:2007
 TUnfold.cxx:2008
 TUnfold.cxx:2009
 TUnfold.cxx:2010
 TUnfold.cxx:2011
 TUnfold.cxx:2012
 TUnfold.cxx:2013
 TUnfold.cxx:2014
 TUnfold.cxx:2015
 TUnfold.cxx:2016
 TUnfold.cxx:2017
 TUnfold.cxx:2018
 TUnfold.cxx:2019
 TUnfold.cxx:2020
 TUnfold.cxx:2021
 TUnfold.cxx:2022
 TUnfold.cxx:2023
 TUnfold.cxx:2024
 TUnfold.cxx:2025
 TUnfold.cxx:2026
 TUnfold.cxx:2027
 TUnfold.cxx:2028
 TUnfold.cxx:2029
 TUnfold.cxx:2030
 TUnfold.cxx:2031
 TUnfold.cxx:2032
 TUnfold.cxx:2033
 TUnfold.cxx:2034
 TUnfold.cxx:2035
 TUnfold.cxx:2036
 TUnfold.cxx:2037
 TUnfold.cxx:2038
 TUnfold.cxx:2039
 TUnfold.cxx:2040
 TUnfold.cxx:2041
 TUnfold.cxx:2042
 TUnfold.cxx:2043
 TUnfold.cxx:2044
 TUnfold.cxx:2045
 TUnfold.cxx:2046
 TUnfold.cxx:2047
 TUnfold.cxx:2048
 TUnfold.cxx:2049
 TUnfold.cxx:2050
 TUnfold.cxx:2051
 TUnfold.cxx:2052
 TUnfold.cxx:2053
 TUnfold.cxx:2054
 TUnfold.cxx:2055
 TUnfold.cxx:2056
 TUnfold.cxx:2057
 TUnfold.cxx:2058
 TUnfold.cxx:2059
 TUnfold.cxx:2060
 TUnfold.cxx:2061
 TUnfold.cxx:2062
 TUnfold.cxx:2063
 TUnfold.cxx:2064
 TUnfold.cxx:2065
 TUnfold.cxx:2066
 TUnfold.cxx:2067
 TUnfold.cxx:2068
 TUnfold.cxx:2069
 TUnfold.cxx:2070
 TUnfold.cxx:2071
 TUnfold.cxx:2072
 TUnfold.cxx:2073
 TUnfold.cxx:2074
 TUnfold.cxx:2075
 TUnfold.cxx:2076
 TUnfold.cxx:2077
 TUnfold.cxx:2078
 TUnfold.cxx:2079
 TUnfold.cxx:2080
 TUnfold.cxx:2081
 TUnfold.cxx:2082
 TUnfold.cxx:2083
 TUnfold.cxx:2084
 TUnfold.cxx:2085
 TUnfold.cxx:2086
 TUnfold.cxx:2087
 TUnfold.cxx:2088
 TUnfold.cxx:2089
 TUnfold.cxx:2090
 TUnfold.cxx:2091
 TUnfold.cxx:2092
 TUnfold.cxx:2093
 TUnfold.cxx:2094
 TUnfold.cxx:2095
 TUnfold.cxx:2096
 TUnfold.cxx:2097
 TUnfold.cxx:2098
 TUnfold.cxx:2099
 TUnfold.cxx:2100
 TUnfold.cxx:2101
 TUnfold.cxx:2102
 TUnfold.cxx:2103
 TUnfold.cxx:2104
 TUnfold.cxx:2105
 TUnfold.cxx:2106
 TUnfold.cxx:2107
 TUnfold.cxx:2108
 TUnfold.cxx:2109
 TUnfold.cxx:2110
 TUnfold.cxx:2111
 TUnfold.cxx:2112
 TUnfold.cxx:2113
 TUnfold.cxx:2114
 TUnfold.cxx:2115
 TUnfold.cxx:2116
 TUnfold.cxx:2117
 TUnfold.cxx:2118
 TUnfold.cxx:2119
 TUnfold.cxx:2120
 TUnfold.cxx:2121
 TUnfold.cxx:2122
 TUnfold.cxx:2123
 TUnfold.cxx:2124
 TUnfold.cxx:2125
 TUnfold.cxx:2126
 TUnfold.cxx:2127
 TUnfold.cxx:2128
 TUnfold.cxx:2129
 TUnfold.cxx:2130
 TUnfold.cxx:2131
 TUnfold.cxx:2132
 TUnfold.cxx:2133
 TUnfold.cxx:2134
 TUnfold.cxx:2135
 TUnfold.cxx:2136
 TUnfold.cxx:2137
 TUnfold.cxx:2138
 TUnfold.cxx:2139
 TUnfold.cxx:2140
 TUnfold.cxx:2141
 TUnfold.cxx:2142
 TUnfold.cxx:2143
 TUnfold.cxx:2144
 TUnfold.cxx:2145
 TUnfold.cxx:2146
 TUnfold.cxx:2147
 TUnfold.cxx:2148
 TUnfold.cxx:2149
 TUnfold.cxx:2150
 TUnfold.cxx:2151
 TUnfold.cxx:2152
 TUnfold.cxx:2153
 TUnfold.cxx:2154
 TUnfold.cxx:2155
 TUnfold.cxx:2156
 TUnfold.cxx:2157
 TUnfold.cxx:2158
 TUnfold.cxx:2159
 TUnfold.cxx:2160
 TUnfold.cxx:2161
 TUnfold.cxx:2162