ROOT logo
// Author: Stefan Schmitt
// DESY, 23/01/09

// Version 13, support for systematic errors

////////////////////////////////////////////////////////////////////////
//
// TUnfoldSys adds error propagation of systematic errors to TUnfold
//
// Example:
//    TH2D *histA,*histAsys1,*histAsys2;
//    TH1D *data;
//  assume the above histograms are filled:
//      histA: migration matrix from generator (x-axis) to detector (y-axis)
//           the errors of histA are the uncorrelated systematic errors
//      histAsys1: alternative migration matrix, when systematic #1 is applied
//      histAsys1: alternative migration matrix, when systematic #2 is applied
//
//  set up the unfolding:
//
//    TUnfoldSys unfold(histA,TUnfold::kHistMapOutputVert);
//    unfold.SetInput(input);
//    unfold.AddSysError(histAsys1,"syserror1",TUnfold::kHistMapOutputVert,
//                       TUnfoldSys::kSysErrModeMatrix);
//    unfold.AddSysError(histAsys2,"syserror2",TUnfold::kHistMapOutputVert,
//                       TUnfoldSys::kSysErrModeMatrix);
//
//  it is possible to specify the systematic errors as
//      TUnfoldSys::kSysErrModeMatrix:
//          alternative migration matrix
//      TUnfoldSys::kSysErrModeAbsolute:
//          matrix of absolute shifts wrt the original matrix
//      TUnfoldSys::kSysErrModeMatrix:
//          matrix of relative errors wrt the original matrix
//  
//  run the unfolding: see description of class TUnfold
//    unfold.ScanLcurve( ...)
//
// retrieve the output
//    unfold.GetOutput(output);     unfolding output with statistical errors
//    unfold.GetEmatrix(stat_error);             error matrix for stat.errors
//    unfold.GetEmatrixSysUncorr(uncorr_sys);    error matrix for uncorr.syst
//    unfold.GetEmatrixSysSource(sys1,"syserror1"); error matrix from source 1
//    unfold.GetEmatrixSysSource(sys2,"syserror2"); error matrix from source 2
//    unfold.GetEmatrixSysTotal(sys_total); error matrix for total sys.errors
//                                          (= uncorr_sys+sys1+sys2)
//    unfold.GetEmatrixTotal(err_total); error matrix with all errros added
//                                       (= sys_total+stat_error)
//    Double_t chi_2=GetChi2Sys();  chi**2 including systematic errors
//                                  compare to GetChi2A(), stat errors only
//
////////////////////////////////////////////////////////////////////////


#include <iostream>
#include <TUnfoldSys.h>
#include <TMap.h>
#include <TMath.h>
#include <TObjString.h>
#include <RVersion.h>

ClassImp(TUnfoldSys)

TUnfoldSys::TUnfoldSys(void) {
   // set all pointers to zero
   InitTUnfoldSys();
}

TUnfoldSys::TUnfoldSys(TH2 const *hist_A, EHistMap histmap, ERegMode regmode)
   : TUnfold(hist_A,histmap,regmode) {
   // arguments:
   //    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:
   //    fDA2, fDAcol

   // save the errors on hist_A to the matrices fDA2 and fDAcol
   // and the content of the underflow/overflow rows
   InitTUnfoldSys();
   fAoutside = new TMatrixD(GetNx(),2);
   fDAcol = new TMatrixD(GetNx(),1);

   Int_t nmax=GetNx()*GetNy();
   Int_t *rowDA2 = new Int_t[nmax];
   Int_t *colDA2 = new Int_t[nmax];
   Double_t *dataDA2 = new Double_t[nmax];

   Int_t da2col_nonzero=0;
   Int_t da2_nonzero=0;
   for (Int_t ix = 0; ix < GetNx(); ix++) {
      Int_t ibinx = fXToHist[ix];
      for (Int_t ibiny = 0; ibiny <= GetNy()+1; ibiny++) {
         Double_t z,dz;
         if (histmap == kHistMapOutputHoriz) {
            z = hist_A->GetBinContent(ibinx, ibiny);
            dz = hist_A->GetBinError(ibinx, ibiny);
         } else {
            z = hist_A->GetBinContent(ibiny, ibinx);
            dz = hist_A->GetBinError(ibiny, ibinx);
         }
         if(ibiny==0) {
            // underflow bins
            (*fAoutside)(ix,0)=z;
            if(dz>0.0) {
               (*fDAcol)(ix,0) += dz*dz;
               da2col_nonzero++;
            }
         } else if(ibiny==GetNy()+1) {
            // overflow bins
            (*fAoutside)(ix,1)=z;
            if(dz>0.0) {
               (*fDAcol)(ix,0) += dz*dz;
               da2col_nonzero++;
            }
         } else {
            // normal bins
            Double_t sum= fSumOverY[ix];
            Double_t error =
               (sum-z)/sum/sum * dz;
            rowDA2[da2_nonzero]=ibiny-1;
            colDA2[da2_nonzero] = ix;
            dataDA2[da2_nonzero] = error*error;
            if(dataDA2[da2_nonzero]>0.0) da2_nonzero++;
         }
      }
   }
   if(da2_nonzero) {
      fDA2 = new TMatrixDSparse(GetNy(),GetNx());
      fDA2->SetMatrixArray(da2_nonzero,rowDA2,colDA2,dataDA2);
   }
   if(!da2col_nonzero) {
      delete fDAcol;
      fDAcol=0;
   } else {
      // normalize to the number of entries and take square root
      for (Int_t ix = 0; ix < GetNx(); ix++) {
         (*fDAcol)(ix,0) = TMath::Sqrt((*fDAcol)(ix,0))/fSumOverY[ix];
      }
   }
   delete [] rowDA2;
   delete [] colDA2;
   delete [] dataDA2;      
}

void TUnfoldSys::AddSysError(TH2 const *sysError,char const *name,
                             EHistMap histmap,ESysErrMode mode) {
   // add a correlated error source
   //    sysError: alternative matrix or matrix of absolute/relative shifts
   //    name: name of the error source
   //    histmap: mapping of the histogram axes to the unfolding output
   //    mode: format of the error source

   if(fSysIn->FindObject(name)) {
      std::cout<<"UnfoldSys::AddSysError \""<<name
               <<"\" has already been added, ignoring\n";
   } else {
      // a copy of fA is made. It can be accessed inside the loop
      // without having to take care that the sparse structure of *fA
      // may be accidentally destroyed by asking for an element which is zero.
      TMatrixD aCopy(*fA);

      Int_t nmax= GetNx()*GetNy();
      Double_t *data=new Double_t[nmax];
      Int_t *cols=new Int_t[nmax];
      Int_t *rows=new Int_t[nmax];
      nmax=0;
      for (Int_t ix = 0; ix < GetNx(); ix++) {
         Int_t ibinx = fXToHist[ix];
         Double_t sum=0.0;
         for(Int_t loop=0;loop<2;loop++) {
            for (Int_t ibiny = 0; ibiny <= GetNy()+1; ibiny++) {
               Double_t z;
               // get bin content, depending on histmap
               if (histmap == kHistMapOutputHoriz) {
                  z = sysError->GetBinContent(ibinx, ibiny);
               } else {
                  z = sysError->GetBinContent(ibiny, ibinx);
               }
               // correct to absolute numbers
               if(mode!=kSysErrModeMatrix) {
                  Double_t z0;
                  if((ibiny>0)&&(ibiny<=GetNy())) {
                     z0=aCopy(ibiny-1,ix)*fSumOverY[ix];
                  } else if(ibiny==0) {
                     z0=(*fAoutside)(ix,0);
                  } else {
                     z0=(*fAoutside)(ix,1);
                  }
                  if(mode==kSysErrModeShift) {
                     z += z0;
                  } else if(mode==kSysErrModeRelative) {
                     z = z0*(1.+z);
                  }
               }
               if(loop==0) {
                  // sum up all entries, including overflow bins
                  sum += z;
               } else {
                  if((ibiny>0)&&(ibiny<=GetNy())) {
                     // save normalized matrix of shifts,
                     // excluding overflow bins
                     rows[nmax]=ibiny-1;
                     cols[nmax]=ix;
                     if(sum>0.0) {
                        data[nmax]=z/sum-aCopy(ibiny-1,ix);
                     } else {
                        data[nmax]=0.0;
                     }
                     if(data[nmax] != 0.0) nmax++;
                  }
               }
            }
         }
      }
      std::cout<<nmax<<" "<<GetNy()*GetNx()<<"\n";

      TMatrixDSparse *dsys=new TMatrixDSparse(GetNy(),GetNx());
      if(nmax==0) {
         std::cout<<"UnfoldSys::AddSysError source \""<<name
                  <<"\" has no influence on the result.\n";
      }
      dsys->SetMatrixArray(nmax,rows,cols,data);
      delete[] data;
      delete[] rows;
      delete[] cols;
      fSysIn->Add(new TObjString(name),dsys);
   }
}

void TUnfoldSys::InitTUnfoldSys(void) {
   // initialize pointers and TMaps

   // input
   fDA2 = 0;
   fDAcol = 0;
   fAoutside = 0;
   fSysIn = new TMap();
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,20,00)
   fSysIn->SetOwnerKeyValue();
#else
   fSysIn->SetOwner();
#endif
   // results
   fVYAx = 0;
   fESparse = 0;
   fEAtV = 0;
   fErrorUncorrX = 0;
   fErrorUncorrAx = 0;
   fAE = 0;
   fAEAtV_one = 0;
   fErrorCorrX = new TMap();
   fErrorCorrAx = new TMap();
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,20,00)
   fErrorCorrX->SetOwnerKeyValue();
   fErrorCorrAx->SetOwnerKeyValue();
#else
   fErrorCorrX->SetOwner();
   fErrorCorrAx->SetOwner();
#endif
}

TUnfoldSys::~TUnfoldSys(void) {
   // delete all data members
   DeleteMatrix(&fDA2);
   delete fSysIn;
   ClearResults();
   delete fErrorCorrX;
   delete fErrorCorrAx;
}

void TUnfoldSys::ClearResults(void) {
   // clear all data members which depend on the unfolding results
   TUnfold::ClearResults();
   DeleteMatrix(&fVYAx);
   DeleteMatrix(&fESparse);
   DeleteMatrix(&fEAtV);
   DeleteMatrix(&fErrorUncorrX);
   DeleteMatrix(&fErrorUncorrAx);
   DeleteMatrix(&fAE);
   DeleteMatrix(&fAEAtV_one);
   fErrorCorrX->Clear();
   fErrorCorrAx->Clear();
}

void TUnfoldSys::PrepareSysError(void) {
   // calculations required for syst.error
   // data members modified
   //    fVYAx, fESparse, fEAtV, fAE, fAEAtV_one,
   //    fErrorUncorrX, fErrorUncorrAx, fErrorCorrX, fErrorCorrAx
   if(!fVYAx) {
      TMatrixD yAx(*fY,TMatrixD::kMinus,*fAx);
      fVYAx=MultiplyMSparseM(*fV,yAx);
   }
   if(!fESparse) {
      fESparse=new TMatrixDSparse(*fE);
   }
   if(!fEAtV) {
      fEAtV=MultiplyMSparseMSparse(*fESparse,*fAtV);
   }
   if(!fAE) {
      fAE = MultiplyMSparseMSparse(*fA,*fESparse);
   }
   if(!fAEAtV_one) {
      fAEAtV_one=MultiplyMSparseMSparse(*fA,*fEAtV);
      Int_t *rows_cols=new Int_t[GetNy()];
      Double_t *data=new Double_t[GetNy()];
      for(Int_t i=0;i<GetNy();i++) {
         rows_cols[i]=i;
         data[i]=1.0;
      }
      TMatrixDSparse one(GetNy(),GetNy());
      one.SetMatrixArray(GetNy(),rows_cols, rows_cols,data);
      AddMSparse(*fAEAtV_one,-1.,one);
      delete [] data;
      delete [] rows_cols;
   }
   if(!fErrorUncorrX) {
      fErrorUncorrX=PrepareUncorrEmat(fESparse,fEAtV);
   }
   if(!fErrorUncorrAx) {
      fErrorUncorrAx=PrepareUncorrEmat(fAE,fAEAtV_one);
   }
   TMapIter sysErrIn(fSysIn);
   TObjString const *key;
   for(key=(TObjString const *)sysErrIn.Next();key;
       key=(TObjString const *)sysErrIn.Next()) {
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,20,00)
      TMatrixDSparse const *dsys=
         (TMatrixDSparse const *)((TPair const *)*sysErrIn)->Value();
#else
      TMatrixDSparse const *dsys=
         (TMatrixDSparse const *)(fSysIn->GetValue(key->GetString()));
#endif
      TPair const *named_emat=(TPair const *)
         fErrorCorrX->FindObject(key->GetString());
      if(!named_emat) {
         TMatrixD *emat=PrepareCorrEmat(fESparse,fEAtV,dsys);
         fErrorCorrX->Add(new TObjString(*key),emat);
      }
      named_emat=(TPair const *)fErrorCorrAx->FindObject(key->GetString());
      if(!named_emat) {
         TMatrixD *emat=PrepareCorrEmat(fAE,fAEAtV_one,dsys);
         fErrorCorrAx->Add(new TObjString(*key),emat);
      }
   }
   
}
  
void TUnfoldSys::GetEmatrixSysUncorr(TH2 *ematrix,Int_t const *binMap,Bool_t clearEmat) {
   // get output error contribution from statistical fluctuations in A
   //   ematrix: output error matrix histogram
   //   binMap: see method GetEmatrix()
   //   clearEmat: set kTRUE to clear the histogram prior to adding the errors
   // data members modified:
   //   fVYAx, fESparse, fEAtV, fErrorAStat
   PrepareSysError();
   ErrorMatrixToHist(ematrix,fErrorUncorrX,binMap,clearEmat);
}

TMatrixD *TUnfoldSys::PrepareUncorrEmat(TMatrixDSparse const *m1,TMatrixDSparse const *m2) {
   // prepare matrix of uncorrelated systematic errors
   //   m1,m2 : coefficients for propagating the errors
   // the result depends on the errors
   //   fDA2, fDA2col

   TMatrixD *r=new TMatrixD(m1->GetNrows(),m1->GetNrows());

   // z is the output quantity, its derivative wrt a_ij is
   //    dz_m / da_ij =
   //
   //       (*m1)(m,j) * (*fVYAx)(i) - (*m2)(m,i) * (*fX)(j)
   //
   // The corresponding error matrix (*e)(m,n) is obtained by summing over i,j:
   //
   // sum{i,j}   {
   //   ((*m1)(m,j) * (*fVYAx)(i) - (*m2)(m,i) * (*fX)(j))*
   //   ((*m1)(n,j) * (*fVYAx)(i) - (*m2)(n,i) * (*fX)(j))*(*fDA2)(i,j)  }
   //
   // The sum is resolved into simpler matrix operations, such that loops over
   // 4 dimensions {i,j,m,n} are avoided:
   //
   // sum_j (*m1)(m,j)*(*m1)(n,j) * sum_i (*fDA2)(i,j)*(*fVYAx)(i)*(*fVYAx)(i)
   //+sum_i (*m2)(m,i)*(*m2)(n,i) * sum_j (*fDA2)(i,j)*(*fX)(j)*(*fX)(j)
   //-sum_j (*m1)(m,j)*(*fX)(j) * sum_i (*m2)(n,i)*(*fDA2)(i,j)*(*fVYAx)(i)
   //-sum_j (*m1)(n,j)*(*fX)(j) * sum_i (*m2)(m,i)*(*fDA2)(i,j)*(*fVYAx)(i)
   //
   // in addition, the error depends on entries of the original matrix
   // which only contribute to the column sum s_j = fSumOverY[j]
   // and a_ij = A_ij / s_j, so da_ij / ds_j = - a_ij / s_j
   //
   //   dz_m / de_j = sum_i { dz_m / da_ij * da_ij / de_j)
   //               = - sum_i { dz_m /da_ij * a_ij / s_j }
   //      =
   // - sum_i {((*m1)(m,j) * (*fVYAx)(i) - (*m2)(m,i) * (*fX)(j))*a_ij} /s_j

   if(fDA2) {
      const Int_t *DA2_rows=fDA2->GetRowIndexArray();
      const Int_t *DA2_cols=fDA2->GetColIndexArray();
      const Double_t *DA2_data=fDA2->GetMatrixArray();

      const Int_t *fVYAx_rows=fVYAx->GetRowIndexArray();
      const Double_t *fVYAx_data=fVYAx->GetMatrixArray();

      // sum_i { (*fDA2)(i,j)*(*fVYAx)(i)*(*fVYAx)(i) }
      TMatrixD DA2t_VYAx2(fDA2->GetNcols(),1);
      for(Int_t i=0;i<fVYAx->GetNrows();i++) {
         if(fVYAx_rows[i]==fVYAx_rows[i+1]) continue;
         for(Int_t index=DA2_rows[i];index<DA2_rows[i+1];index++) {
            Int_t j=DA2_cols[index];
            Double_t fVYAx_j=fVYAx_data[fVYAx_rows[i]];
            DA2t_VYAx2(j,0) += DA2_data[index]*fVYAx_j*fVYAx_j;
         }
      }
      // sum_j { (*fDA2)(i,j)*(*fX)(j)*(*fX)(j) }
      TMatrixD DA2_x2(fDA2->GetNrows(),1);
      for(Int_t i=0;i<fDA2->GetNrows();i++) {
         for(Int_t index=DA2_rows[i];index<DA2_rows[i+1];index++) {
            Int_t j=DA2_cols[index];
            DA2_x2(i,0) += DA2_data[index]*(*fX)(j,0)*(*fX)(j,0);
         }
      }
      // (*fDA2)(i,j)*(*fVYAx)(i)
      // same row/col structure as fDA2
      TMatrixDSparse mDA2_VYAx(*fDA2);
      Double_t *mDA2_VYAx_data=mDA2_VYAx.GetMatrixArray();
      for(Int_t i=0;i<fDA2->GetNrows();i++) {
         for(Int_t index=DA2_rows[i];index<DA2_rows[i+1];index++) {
            if(fVYAx_rows[i]==fVYAx_rows[i+1]) {
               mDA2_VYAx_data[index]=0.0;
            } else {
               mDA2_VYAx_data[index] *= fVYAx_data[fVYAx_rows[i]];
            }
         }
      }
      // (*m2)(n,i) * (*fDA2)(i,j)*(*fVYAx)(i)
      TMatrixDSparse *m2_mDA2_VYAx = MultiplyMSparseMSparse(*m2,mDA2_VYAx);

      const Int_t *m2_mDA2_VYAx_rows=m2_mDA2_VYAx->GetRowIndexArray();
      const Int_t *m2_mDA2_VYAx_cols=m2_mDA2_VYAx->GetColIndexArray();
      const Double_t *m2_mDA2_VYAx_data=m2_mDA2_VYAx->GetMatrixArray();   

      const Int_t *m1_rows=m1->GetRowIndexArray();
      const Int_t *m1_cols=m1->GetColIndexArray();
      const Double_t *m1_data=m1->GetMatrixArray();   
      
      const Int_t *m2_rows=m2->GetRowIndexArray();
      const Int_t *m2_cols=m2->GetColIndexArray();
      const Double_t *m2_data=m2->GetMatrixArray();   

      // add everything together
      for(Int_t m=0;m<r->GetNrows();m++) {
         for(Int_t n=0;n<r->GetNrows();n++) {
   // sum_j (*m1)(m,j)*(*m1)(n,j) * sum_i (*fDA2)(i,j)*(*fVYAx)(i)*(*fVYAx)(i)
            Int_t index_m=m1_rows[m];
            Int_t index_n=m1_rows[n];
            while((index_m<m1_rows[m+1])&&(index_n<m1_rows[n+1])) {
               Int_t j=m1_cols[index_m];
               Int_t delta=j-m1_cols[index_n];
               if(delta<0) {
                  index_m++;
               } else if(delta>0) {
                  index_n++;
               } else {
                  (*r)(m,n) +=
                     m1_data[index_m]*m1_data[index_n]*DA2t_VYAx2(j,0);
                  index_m++;
                  index_n++;
               }
            }
   //+sum_i (*m2)(m,i)*(*m2)(n,i) * sum_j (*fDA2)(i,j)*(*fX)(j)*(*fX)(j)
            index_m=m2_rows[m];
            index_n=m2_rows[n];
            while((index_m<m2_rows[m+1])&&(index_n<m2_rows[n+1])) {
               Int_t i=m2_cols[index_m];
               Int_t delta=i-m2_cols[index_n];
               if(delta<0) {
                  index_m++;
               } else if(delta>0) {
                  index_n++;
               } else {
                  (*r)(m,n) +=
                     m2_data[index_m]*m2_data[index_n]*DA2_x2(i,0);
                  index_m++;
                  index_n++;
               }
            }
         }
   //-sum_j (*m1)(m,j)*(*fX)(j) * sum_i (*m2)(n,i)*(*fDA2)(i,j)*(*fVYAx)(i)
   //-sum_j (*m1)(n,j)*(*fX)(j) * sum_i (*m2)(m,i)*(*fDA2)(i,j)*(*fVYAx)(i)
         for(Int_t n=0;n<m1->GetNrows();n++) {
            Int_t index_m=m2_mDA2_VYAx_rows[m];
            Int_t index_n=m1_rows[n];
            while((index_m<m2_mDA2_VYAx_rows[m+1])
                  &&(index_n<m1_rows[n+1])) {
               Int_t j=m2_mDA2_VYAx_cols[index_m];
               Int_t delta=j-m1_cols[index_n];
               if(delta<0) {
                  index_m++;
               } else if(delta>0) {
                  index_n++;
               } else {
                  Double_t d_mn = m1_data[index_n]*m2_mDA2_VYAx_data[index_n]*
                     (*fX)(j,0);
                  (*r)(m,n) -= d_mn; 
                  (*r)(n,m) -= d_mn; 
                  index_m++;
                  index_n++;
               }
            }
         }
      }
      delete m2_mDA2_VYAx;
   }
   if(fDAcol) {
      // error matrix  (dz_m/de_j)*(dz_n/de_j)  * (*fDAcol)(j,0)*(*fDAcol)(j,0)

      // -sum_i {((*m1)(m,j) * (*fVYAx)(i) - (*m2)(m,i) * (*fX)(j))*a_ij}
      
      // sum_i (*m2)(m,i)*a_ij
      TMatrixDSparse *delta=MultiplyMSparseMSparse(*m2,*fA);
      Double_t *delta_data=delta->GetMatrixArray();
      const Int_t *delta_rows=delta->GetRowIndexArray();
      const Int_t *delta_cols=delta->GetColIndexArray();
      // sum_i (*m2)(m,i)*a_ij * (*fX)(j)
      for(Int_t row=0;row<delta->GetNrows();row++) {
         for(Int_t index=delta_rows[row];index<delta_rows[row+1];index++) {
            Int_t col=delta_cols[index];
            delta_data[index] *= (*fX)(col,0);
         }
      }
      // sum_i { a_ij * (*fVYAx)(i) }
      TMatrixDSparse *AtVYAx=MultiplyMSparseTranspMSparse(*fA,*fVYAx);
      const Double_t *AtVYAx_data=AtVYAx->GetMatrixArray();
      const Int_t *AtVYAx_rows=AtVYAx->GetRowIndexArray();
 
      const Int_t *m1_rows=m1->GetRowIndexArray();
      const Int_t *m1_cols=m1->GetColIndexArray();
      const Double_t *m1_data=m1->GetMatrixArray();   
      Int_t nmax= m1_rows[m1->GetNrows()];
      if(nmax>0) {
         Double_t *delta2_data=new Double_t[nmax];
         Int_t *delta2_rows=new Int_t[nmax];
         Int_t *delta2_cols=new Int_t[nmax];
         nmax=0;
         // (*m1)(m,j) * sum_i { a_ij * (*fVYAx)(i) }
         for(Int_t row=0;row<m1->GetNrows();row++) {
            for(Int_t index=m1_rows[row];index<m1_rows[row+1];index++) {
               Int_t col=m1_cols[index];
               if(AtVYAx_rows[col]<AtVYAx_rows[col+1]) {
                  delta2_rows[nmax]=row;
                  delta2_cols[nmax]=col;
                  delta2_data[nmax]=m1_data[index]*
                     AtVYAx_data[AtVYAx_rows[col]];
                  if(delta2_data[nmax] !=0.0) nmax++;
               }
            }
         }
         if(nmax>0) {
            TMatrixDSparse delta2(m1->GetNrows(),m1->GetNcols());
            delta2.SetMatrixArray(nmax,delta2_rows,delta2_cols,delta2_data);
            // subtract from derivative matrix
            AddMSparse(*delta,-1.,delta2);
         }
         delete [] delta2_cols;
         delete [] delta2_rows;
         delete [] delta2_data;
      }
      delete AtVYAx;
      delta_data=delta->GetMatrixArray();
      delta_rows=delta->GetRowIndexArray();
      delta_cols=delta->GetColIndexArray();
      // multiply by systematic error
      for(Int_t row=0;row<delta->GetNrows();row++) {
         for(Int_t index=delta_rows[row];index<delta_rows[row+1];index++) {
            Int_t col=delta_cols[index];
            delta_data[index] *= (*fDAcol)(col,0);
         }
      }
      // delta * delta# is the error matrix
      for(Int_t row=0;row<delta->GetNrows();row++) {
         for(Int_t col=0;col<delta->GetNrows();col++) {
            Int_t index1=delta_rows[row];
            Int_t index2=delta_rows[col];
            while((index1<delta_rows[row+1])&&(index2<delta_rows[col+1])) {
               Int_t j=delta_cols[index1];
               Int_t dj=j-delta_cols[index2];
               if(dj<0) {
                  index1++;
               } else if(dj>0) {
                  index2++;
               } else {
                  (*r)(row,col) += delta_data[index1]*delta_data[index2];
                  index1++;
                  index2++;
               }
            }
         }
      }
      delete delta;
   }
   return r;
}

TMatrixD *TUnfoldSys::PrepareCorrEmat(TMatrixDSparse const *m1,TMatrixDSparse const *m2,TMatrixDSparse const *dsys) {
   // prepare error matrix of correlated systematic shifts
   //   m1,m2 : coefficients for propagating the errors
   //   dsys : matrix of correlated shifts from this source

   TMatrixD *r=new TMatrixD(m1->GetNrows(),m1->GetNrows());

   // delta_m = 
   //   sum{i,j}   {
   //      ((*m1)(m,j) * (*fVYAx)(i) - (*m2)(m,i) * (*fX)(j))*dsys(i,j) }
   //   =    sum_j (*m1)(m,j)  sum_i dsys(i,j) * (*fVYAx)(i)
   //     -  sum_i (*m2)(m,i)  sum_j dsys(i,j) * (*fX)(j)
   // emat_mn = delta_m*delta_n

   TMatrixDSparse *dsysT_VYAx = MultiplyMSparseTranspMSparse(*dsys,*fVYAx);
   TMatrixDSparse *delta =  MultiplyMSparseMSparse(*m1,*dsysT_VYAx);
   delete dsysT_VYAx;
   TMatrixDSparse *dsys_X = MultiplyMSparseM(*dsys,*fX);
   TMatrixDSparse *delta2 = MultiplyMSparseMSparse(*m2,*dsys_X);
   delete dsys_X;
   AddMSparse(*delta,-1.0,*delta2);
   delete delta2;
   const Double_t *delta_data=delta->GetMatrixArray();
   const Int_t *delta_rows=delta->GetRowIndexArray();
   for(Int_t row=0;row<delta->GetNrows();row++) {
      if(delta_rows[row]>=delta_rows[row+1]) continue;
      for(Int_t col=0;col<delta->GetNrows();col++) {
         if(delta_rows[col]>=delta_rows[col+1]) continue;
         (*r)(row,col)=
            delta_data[delta_rows[row]]*delta_data[delta_rows[col]];
      }
   }
   delete delta;
   return r;
}

void TUnfoldSys::GetEmatrixSysSource(TH2 *ematrix,char const *name,
                                     Int_t const *binMap,Bool_t clearEmat) {
   // calculate systematic error matrix from a given source
   //    ematrix: output
   //    source: name of the error source
   //    binMap: see method GetEmatrix()
   //    clearEmat: set kTRUE to clear the histogram prior to adding the errors
   PrepareSysError();
   TPair const *named_emat=(TPair const *)fErrorUncorrX->FindObject(name);
   TMatrixD *emat=0;
   if(named_emat) {
      emat=(TMatrixD *)named_emat->Value();
   }
   ErrorMatrixToHist(ematrix,emat,binMap,clearEmat);
}

void TUnfoldSys::GetEmatrixSysTotal(TH2 *ematrix,Int_t const *binMap,
                                    Bool_t clearEmat) {
   // calculate total systematic error matrix
   //    ematrix: output
   //    binMap: see method GetEmatrix()
   //    clearEmat: set kTRUE to clear the histogram prior to adding the errors
   GetEmatrixSysUncorr(ematrix,binMap,clearEmat);
   TMapIter sysErrPtr(fErrorCorrX);
   TObject const *key;
   for(key=sysErrPtr.Next();key;key=sysErrPtr.Next()) {
      ErrorMatrixToHist
         (ematrix,
          (TMatrixD const *)
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,20,00)
          ((TPair const *)*sysErrPtr)->Value()
#else
          (fErrorCorrX->GetValue(((TObjString const *)key)->GetString()))
#endif
          ,binMap,kFALSE);
   }
}


void TUnfoldSys::GetEmatrixTotal(TH2 *ematrix,Int_t const *binMap) {
   // get total error including statistical error
   //    ematrix: output
   //    binMap: see method GetEmatrix()
   GetEmatrix(ematrix,binMap);
   GetEmatrixSysTotal(ematrix,binMap,kFALSE);
}  

Double_t TUnfoldSys::GetChi2Sys(void) {
   // calculate total chi**2 including systematic errors
   PrepareSysError();
   TMatrixD *emat_sum_1=InvertMSparse(*fV);
   TMatrixDSparse emat_sum(*emat_sum_1);
   delete emat_sum_1;
   AddMSparse(emat_sum,1.0,*fErrorUncorrAx);
   TMapIter sysErrPtr(fErrorCorrAx);
   TObject const *key;
   for(key=sysErrPtr.Next();key;key=sysErrPtr.Next()) {
      AddMSparse(emat_sum,1.0,
                 *(TMatrixD const *)
#if ROOT_VERSION_CODE >= ROOT_VERSION(5,20,00)
                 ((TPair const *)*sysErrPtr)->Value()
#else
                 fErrorCorrAx->GetValue(((TObjString const *)key)
                                          ->GetString())
#endif
                 );
   }
   TMatrixD *v=InvertMSparse(emat_sum);
   TMatrixD dy(*fY, TMatrixD::kMinus, *fAx);
   Double_t r=MultiplyVecMSparseVec(*v,dy);
   delete v;
   return r;
}

 TUnfoldSys.cxx:1
 TUnfoldSys.cxx:2
 TUnfoldSys.cxx:3
 TUnfoldSys.cxx:4
 TUnfoldSys.cxx:5
 TUnfoldSys.cxx:6
 TUnfoldSys.cxx:7
 TUnfoldSys.cxx:8
 TUnfoldSys.cxx:9
 TUnfoldSys.cxx:10
 TUnfoldSys.cxx:11
 TUnfoldSys.cxx:12
 TUnfoldSys.cxx:13
 TUnfoldSys.cxx:14
 TUnfoldSys.cxx:15
 TUnfoldSys.cxx:16
 TUnfoldSys.cxx:17
 TUnfoldSys.cxx:18
 TUnfoldSys.cxx:19
 TUnfoldSys.cxx:20
 TUnfoldSys.cxx:21
 TUnfoldSys.cxx:22
 TUnfoldSys.cxx:23
 TUnfoldSys.cxx:24
 TUnfoldSys.cxx:25
 TUnfoldSys.cxx:26
 TUnfoldSys.cxx:27
 TUnfoldSys.cxx:28
 TUnfoldSys.cxx:29
 TUnfoldSys.cxx:30
 TUnfoldSys.cxx:31
 TUnfoldSys.cxx:32
 TUnfoldSys.cxx:33
 TUnfoldSys.cxx:34
 TUnfoldSys.cxx:35
 TUnfoldSys.cxx:36
 TUnfoldSys.cxx:37
 TUnfoldSys.cxx:38
 TUnfoldSys.cxx:39
 TUnfoldSys.cxx:40
 TUnfoldSys.cxx:41
 TUnfoldSys.cxx:42
 TUnfoldSys.cxx:43
 TUnfoldSys.cxx:44
 TUnfoldSys.cxx:45
 TUnfoldSys.cxx:46
 TUnfoldSys.cxx:47
 TUnfoldSys.cxx:48
 TUnfoldSys.cxx:49
 TUnfoldSys.cxx:50
 TUnfoldSys.cxx:51
 TUnfoldSys.cxx:52
 TUnfoldSys.cxx:53
 TUnfoldSys.cxx:54
 TUnfoldSys.cxx:55
 TUnfoldSys.cxx:56
 TUnfoldSys.cxx:57
 TUnfoldSys.cxx:58
 TUnfoldSys.cxx:59
 TUnfoldSys.cxx:60
 TUnfoldSys.cxx:61
 TUnfoldSys.cxx:62
 TUnfoldSys.cxx:63
 TUnfoldSys.cxx:64
 TUnfoldSys.cxx:65
 TUnfoldSys.cxx:66
 TUnfoldSys.cxx:67
 TUnfoldSys.cxx:68
 TUnfoldSys.cxx:69
 TUnfoldSys.cxx:70
 TUnfoldSys.cxx:71
 TUnfoldSys.cxx:72
 TUnfoldSys.cxx:73
 TUnfoldSys.cxx:74
 TUnfoldSys.cxx:75
 TUnfoldSys.cxx:76
 TUnfoldSys.cxx:77
 TUnfoldSys.cxx:78
 TUnfoldSys.cxx:79
 TUnfoldSys.cxx:80
 TUnfoldSys.cxx:81
 TUnfoldSys.cxx:82
 TUnfoldSys.cxx:83
 TUnfoldSys.cxx:84
 TUnfoldSys.cxx:85
 TUnfoldSys.cxx:86
 TUnfoldSys.cxx:87
 TUnfoldSys.cxx:88
 TUnfoldSys.cxx:89
 TUnfoldSys.cxx:90
 TUnfoldSys.cxx:91
 TUnfoldSys.cxx:92
 TUnfoldSys.cxx:93
 TUnfoldSys.cxx:94
 TUnfoldSys.cxx:95
 TUnfoldSys.cxx:96
 TUnfoldSys.cxx:97
 TUnfoldSys.cxx:98
 TUnfoldSys.cxx:99
 TUnfoldSys.cxx:100
 TUnfoldSys.cxx:101
 TUnfoldSys.cxx:102
 TUnfoldSys.cxx:103
 TUnfoldSys.cxx:104
 TUnfoldSys.cxx:105
 TUnfoldSys.cxx:106
 TUnfoldSys.cxx:107
 TUnfoldSys.cxx:108
 TUnfoldSys.cxx:109
 TUnfoldSys.cxx:110
 TUnfoldSys.cxx:111
 TUnfoldSys.cxx:112
 TUnfoldSys.cxx:113
 TUnfoldSys.cxx:114
 TUnfoldSys.cxx:115
 TUnfoldSys.cxx:116
 TUnfoldSys.cxx:117
 TUnfoldSys.cxx:118
 TUnfoldSys.cxx:119
 TUnfoldSys.cxx:120
 TUnfoldSys.cxx:121
 TUnfoldSys.cxx:122
 TUnfoldSys.cxx:123
 TUnfoldSys.cxx:124
 TUnfoldSys.cxx:125
 TUnfoldSys.cxx:126
 TUnfoldSys.cxx:127
 TUnfoldSys.cxx:128
 TUnfoldSys.cxx:129
 TUnfoldSys.cxx:130
 TUnfoldSys.cxx:131
 TUnfoldSys.cxx:132
 TUnfoldSys.cxx:133
 TUnfoldSys.cxx:134
 TUnfoldSys.cxx:135
 TUnfoldSys.cxx:136
 TUnfoldSys.cxx:137
 TUnfoldSys.cxx:138
 TUnfoldSys.cxx:139
 TUnfoldSys.cxx:140
 TUnfoldSys.cxx:141
 TUnfoldSys.cxx:142
 TUnfoldSys.cxx:143
 TUnfoldSys.cxx:144
 TUnfoldSys.cxx:145
 TUnfoldSys.cxx:146
 TUnfoldSys.cxx:147
 TUnfoldSys.cxx:148
 TUnfoldSys.cxx:149
 TUnfoldSys.cxx:150
 TUnfoldSys.cxx:151
 TUnfoldSys.cxx:152
 TUnfoldSys.cxx:153
 TUnfoldSys.cxx:154
 TUnfoldSys.cxx:155
 TUnfoldSys.cxx:156
 TUnfoldSys.cxx:157
 TUnfoldSys.cxx:158
 TUnfoldSys.cxx:159
 TUnfoldSys.cxx:160
 TUnfoldSys.cxx:161
 TUnfoldSys.cxx:162
 TUnfoldSys.cxx:163
 TUnfoldSys.cxx:164
 TUnfoldSys.cxx:165
 TUnfoldSys.cxx:166
 TUnfoldSys.cxx:167
 TUnfoldSys.cxx:168
 TUnfoldSys.cxx:169
 TUnfoldSys.cxx:170
 TUnfoldSys.cxx:171
 TUnfoldSys.cxx:172
 TUnfoldSys.cxx:173
 TUnfoldSys.cxx:174
 TUnfoldSys.cxx:175
 TUnfoldSys.cxx:176
 TUnfoldSys.cxx:177
 TUnfoldSys.cxx:178
 TUnfoldSys.cxx:179
 TUnfoldSys.cxx:180
 TUnfoldSys.cxx:181
 TUnfoldSys.cxx:182
 TUnfoldSys.cxx:183
 TUnfoldSys.cxx:184
 TUnfoldSys.cxx:185
 TUnfoldSys.cxx:186
 TUnfoldSys.cxx:187
 TUnfoldSys.cxx:188
 TUnfoldSys.cxx:189
 TUnfoldSys.cxx:190
 TUnfoldSys.cxx:191
 TUnfoldSys.cxx:192
 TUnfoldSys.cxx:193
 TUnfoldSys.cxx:194
 TUnfoldSys.cxx:195
 TUnfoldSys.cxx:196
 TUnfoldSys.cxx:197
 TUnfoldSys.cxx:198
 TUnfoldSys.cxx:199
 TUnfoldSys.cxx:200
 TUnfoldSys.cxx:201
 TUnfoldSys.cxx:202
 TUnfoldSys.cxx:203
 TUnfoldSys.cxx:204
 TUnfoldSys.cxx:205
 TUnfoldSys.cxx:206
 TUnfoldSys.cxx:207
 TUnfoldSys.cxx:208
 TUnfoldSys.cxx:209
 TUnfoldSys.cxx:210
 TUnfoldSys.cxx:211
 TUnfoldSys.cxx:212
 TUnfoldSys.cxx:213
 TUnfoldSys.cxx:214
 TUnfoldSys.cxx:215
 TUnfoldSys.cxx:216
 TUnfoldSys.cxx:217
 TUnfoldSys.cxx:218
 TUnfoldSys.cxx:219
 TUnfoldSys.cxx:220
 TUnfoldSys.cxx:221
 TUnfoldSys.cxx:222
 TUnfoldSys.cxx:223
 TUnfoldSys.cxx:224
 TUnfoldSys.cxx:225
 TUnfoldSys.cxx:226
 TUnfoldSys.cxx:227
 TUnfoldSys.cxx:228
 TUnfoldSys.cxx:229
 TUnfoldSys.cxx:230
 TUnfoldSys.cxx:231
 TUnfoldSys.cxx:232
 TUnfoldSys.cxx:233
 TUnfoldSys.cxx:234
 TUnfoldSys.cxx:235
 TUnfoldSys.cxx:236
 TUnfoldSys.cxx:237
 TUnfoldSys.cxx:238
 TUnfoldSys.cxx:239
 TUnfoldSys.cxx:240
 TUnfoldSys.cxx:241
 TUnfoldSys.cxx:242
 TUnfoldSys.cxx:243
 TUnfoldSys.cxx:244
 TUnfoldSys.cxx:245
 TUnfoldSys.cxx:246
 TUnfoldSys.cxx:247
 TUnfoldSys.cxx:248
 TUnfoldSys.cxx:249
 TUnfoldSys.cxx:250
 TUnfoldSys.cxx:251
 TUnfoldSys.cxx:252
 TUnfoldSys.cxx:253
 TUnfoldSys.cxx:254
 TUnfoldSys.cxx:255
 TUnfoldSys.cxx:256
 TUnfoldSys.cxx:257
 TUnfoldSys.cxx:258
 TUnfoldSys.cxx:259
 TUnfoldSys.cxx:260
 TUnfoldSys.cxx:261
 TUnfoldSys.cxx:262
 TUnfoldSys.cxx:263
 TUnfoldSys.cxx:264
 TUnfoldSys.cxx:265
 TUnfoldSys.cxx:266
 TUnfoldSys.cxx:267
 TUnfoldSys.cxx:268
 TUnfoldSys.cxx:269
 TUnfoldSys.cxx:270
 TUnfoldSys.cxx:271
 TUnfoldSys.cxx:272
 TUnfoldSys.cxx:273
 TUnfoldSys.cxx:274
 TUnfoldSys.cxx:275
 TUnfoldSys.cxx:276
 TUnfoldSys.cxx:277
 TUnfoldSys.cxx:278
 TUnfoldSys.cxx:279
 TUnfoldSys.cxx:280
 TUnfoldSys.cxx:281
 TUnfoldSys.cxx:282
 TUnfoldSys.cxx:283
 TUnfoldSys.cxx:284
 TUnfoldSys.cxx:285
 TUnfoldSys.cxx:286
 TUnfoldSys.cxx:287
 TUnfoldSys.cxx:288
 TUnfoldSys.cxx:289
 TUnfoldSys.cxx:290
 TUnfoldSys.cxx:291
 TUnfoldSys.cxx:292
 TUnfoldSys.cxx:293
 TUnfoldSys.cxx:294
 TUnfoldSys.cxx:295
 TUnfoldSys.cxx:296
 TUnfoldSys.cxx:297
 TUnfoldSys.cxx:298
 TUnfoldSys.cxx:299
 TUnfoldSys.cxx:300
 TUnfoldSys.cxx:301
 TUnfoldSys.cxx:302
 TUnfoldSys.cxx:303
 TUnfoldSys.cxx:304
 TUnfoldSys.cxx:305
 TUnfoldSys.cxx:306
 TUnfoldSys.cxx:307
 TUnfoldSys.cxx:308
 TUnfoldSys.cxx:309
 TUnfoldSys.cxx:310
 TUnfoldSys.cxx:311
 TUnfoldSys.cxx:312
 TUnfoldSys.cxx:313
 TUnfoldSys.cxx:314
 TUnfoldSys.cxx:315
 TUnfoldSys.cxx:316
 TUnfoldSys.cxx:317
 TUnfoldSys.cxx:318
 TUnfoldSys.cxx:319
 TUnfoldSys.cxx:320
 TUnfoldSys.cxx:321
 TUnfoldSys.cxx:322
 TUnfoldSys.cxx:323
 TUnfoldSys.cxx:324
 TUnfoldSys.cxx:325
 TUnfoldSys.cxx:326
 TUnfoldSys.cxx:327
 TUnfoldSys.cxx:328
 TUnfoldSys.cxx:329
 TUnfoldSys.cxx:330
 TUnfoldSys.cxx:331
 TUnfoldSys.cxx:332
 TUnfoldSys.cxx:333
 TUnfoldSys.cxx:334
 TUnfoldSys.cxx:335
 TUnfoldSys.cxx:336
 TUnfoldSys.cxx:337
 TUnfoldSys.cxx:338
 TUnfoldSys.cxx:339
 TUnfoldSys.cxx:340
 TUnfoldSys.cxx:341
 TUnfoldSys.cxx:342
 TUnfoldSys.cxx:343
 TUnfoldSys.cxx:344
 TUnfoldSys.cxx:345
 TUnfoldSys.cxx:346
 TUnfoldSys.cxx:347
 TUnfoldSys.cxx:348
 TUnfoldSys.cxx:349
 TUnfoldSys.cxx:350
 TUnfoldSys.cxx:351
 TUnfoldSys.cxx:352
 TUnfoldSys.cxx:353
 TUnfoldSys.cxx:354
 TUnfoldSys.cxx:355
 TUnfoldSys.cxx:356
 TUnfoldSys.cxx:357
 TUnfoldSys.cxx:358
 TUnfoldSys.cxx:359
 TUnfoldSys.cxx:360
 TUnfoldSys.cxx:361
 TUnfoldSys.cxx:362
 TUnfoldSys.cxx:363
 TUnfoldSys.cxx:364
 TUnfoldSys.cxx:365
 TUnfoldSys.cxx:366
 TUnfoldSys.cxx:367
 TUnfoldSys.cxx:368
 TUnfoldSys.cxx:369
 TUnfoldSys.cxx:370
 TUnfoldSys.cxx:371
 TUnfoldSys.cxx:372
 TUnfoldSys.cxx:373
 TUnfoldSys.cxx:374
 TUnfoldSys.cxx:375
 TUnfoldSys.cxx:376
 TUnfoldSys.cxx:377
 TUnfoldSys.cxx:378
 TUnfoldSys.cxx:379
 TUnfoldSys.cxx:380
 TUnfoldSys.cxx:381
 TUnfoldSys.cxx:382
 TUnfoldSys.cxx:383
 TUnfoldSys.cxx:384
 TUnfoldSys.cxx:385
 TUnfoldSys.cxx:386
 TUnfoldSys.cxx:387
 TUnfoldSys.cxx:388
 TUnfoldSys.cxx:389
 TUnfoldSys.cxx:390
 TUnfoldSys.cxx:391
 TUnfoldSys.cxx:392
 TUnfoldSys.cxx:393
 TUnfoldSys.cxx:394
 TUnfoldSys.cxx:395
 TUnfoldSys.cxx:396
 TUnfoldSys.cxx:397
 TUnfoldSys.cxx:398
 TUnfoldSys.cxx:399
 TUnfoldSys.cxx:400
 TUnfoldSys.cxx:401
 TUnfoldSys.cxx:402
 TUnfoldSys.cxx:403
 TUnfoldSys.cxx:404
 TUnfoldSys.cxx:405
 TUnfoldSys.cxx:406
 TUnfoldSys.cxx:407
 TUnfoldSys.cxx:408
 TUnfoldSys.cxx:409
 TUnfoldSys.cxx:410
 TUnfoldSys.cxx:411
 TUnfoldSys.cxx:412
 TUnfoldSys.cxx:413
 TUnfoldSys.cxx:414
 TUnfoldSys.cxx:415
 TUnfoldSys.cxx:416
 TUnfoldSys.cxx:417
 TUnfoldSys.cxx:418
 TUnfoldSys.cxx:419
 TUnfoldSys.cxx:420
 TUnfoldSys.cxx:421
 TUnfoldSys.cxx:422
 TUnfoldSys.cxx:423
 TUnfoldSys.cxx:424
 TUnfoldSys.cxx:425
 TUnfoldSys.cxx:426
 TUnfoldSys.cxx:427
 TUnfoldSys.cxx:428
 TUnfoldSys.cxx:429
 TUnfoldSys.cxx:430
 TUnfoldSys.cxx:431
 TUnfoldSys.cxx:432
 TUnfoldSys.cxx:433
 TUnfoldSys.cxx:434
 TUnfoldSys.cxx:435
 TUnfoldSys.cxx:436
 TUnfoldSys.cxx:437
 TUnfoldSys.cxx:438
 TUnfoldSys.cxx:439
 TUnfoldSys.cxx:440
 TUnfoldSys.cxx:441
 TUnfoldSys.cxx:442
 TUnfoldSys.cxx:443
 TUnfoldSys.cxx:444
 TUnfoldSys.cxx:445
 TUnfoldSys.cxx:446
 TUnfoldSys.cxx:447
 TUnfoldSys.cxx:448
 TUnfoldSys.cxx:449
 TUnfoldSys.cxx:450
 TUnfoldSys.cxx:451
 TUnfoldSys.cxx:452
 TUnfoldSys.cxx:453
 TUnfoldSys.cxx:454
 TUnfoldSys.cxx:455
 TUnfoldSys.cxx:456
 TUnfoldSys.cxx:457
 TUnfoldSys.cxx:458
 TUnfoldSys.cxx:459
 TUnfoldSys.cxx:460
 TUnfoldSys.cxx:461
 TUnfoldSys.cxx:462
 TUnfoldSys.cxx:463
 TUnfoldSys.cxx:464
 TUnfoldSys.cxx:465
 TUnfoldSys.cxx:466
 TUnfoldSys.cxx:467
 TUnfoldSys.cxx:468
 TUnfoldSys.cxx:469
 TUnfoldSys.cxx:470
 TUnfoldSys.cxx:471
 TUnfoldSys.cxx:472
 TUnfoldSys.cxx:473
 TUnfoldSys.cxx:474
 TUnfoldSys.cxx:475
 TUnfoldSys.cxx:476
 TUnfoldSys.cxx:477
 TUnfoldSys.cxx:478
 TUnfoldSys.cxx:479
 TUnfoldSys.cxx:480
 TUnfoldSys.cxx:481
 TUnfoldSys.cxx:482
 TUnfoldSys.cxx:483
 TUnfoldSys.cxx:484
 TUnfoldSys.cxx:485
 TUnfoldSys.cxx:486
 TUnfoldSys.cxx:487
 TUnfoldSys.cxx:488
 TUnfoldSys.cxx:489
 TUnfoldSys.cxx:490
 TUnfoldSys.cxx:491
 TUnfoldSys.cxx:492
 TUnfoldSys.cxx:493
 TUnfoldSys.cxx:494
 TUnfoldSys.cxx:495
 TUnfoldSys.cxx:496
 TUnfoldSys.cxx:497
 TUnfoldSys.cxx:498
 TUnfoldSys.cxx:499
 TUnfoldSys.cxx:500
 TUnfoldSys.cxx:501
 TUnfoldSys.cxx:502
 TUnfoldSys.cxx:503
 TUnfoldSys.cxx:504
 TUnfoldSys.cxx:505
 TUnfoldSys.cxx:506
 TUnfoldSys.cxx:507
 TUnfoldSys.cxx:508
 TUnfoldSys.cxx:509
 TUnfoldSys.cxx:510
 TUnfoldSys.cxx:511
 TUnfoldSys.cxx:512
 TUnfoldSys.cxx:513
 TUnfoldSys.cxx:514
 TUnfoldSys.cxx:515
 TUnfoldSys.cxx:516
 TUnfoldSys.cxx:517
 TUnfoldSys.cxx:518
 TUnfoldSys.cxx:519
 TUnfoldSys.cxx:520
 TUnfoldSys.cxx:521
 TUnfoldSys.cxx:522
 TUnfoldSys.cxx:523
 TUnfoldSys.cxx:524
 TUnfoldSys.cxx:525
 TUnfoldSys.cxx:526
 TUnfoldSys.cxx:527
 TUnfoldSys.cxx:528
 TUnfoldSys.cxx:529
 TUnfoldSys.cxx:530
 TUnfoldSys.cxx:531
 TUnfoldSys.cxx:532
 TUnfoldSys.cxx:533
 TUnfoldSys.cxx:534
 TUnfoldSys.cxx:535
 TUnfoldSys.cxx:536
 TUnfoldSys.cxx:537
 TUnfoldSys.cxx:538
 TUnfoldSys.cxx:539
 TUnfoldSys.cxx:540
 TUnfoldSys.cxx:541
 TUnfoldSys.cxx:542
 TUnfoldSys.cxx:543
 TUnfoldSys.cxx:544
 TUnfoldSys.cxx:545
 TUnfoldSys.cxx:546
 TUnfoldSys.cxx:547
 TUnfoldSys.cxx:548
 TUnfoldSys.cxx:549
 TUnfoldSys.cxx:550
 TUnfoldSys.cxx:551
 TUnfoldSys.cxx:552
 TUnfoldSys.cxx:553
 TUnfoldSys.cxx:554
 TUnfoldSys.cxx:555
 TUnfoldSys.cxx:556
 TUnfoldSys.cxx:557
 TUnfoldSys.cxx:558
 TUnfoldSys.cxx:559
 TUnfoldSys.cxx:560
 TUnfoldSys.cxx:561
 TUnfoldSys.cxx:562
 TUnfoldSys.cxx:563
 TUnfoldSys.cxx:564
 TUnfoldSys.cxx:565
 TUnfoldSys.cxx:566
 TUnfoldSys.cxx:567
 TUnfoldSys.cxx:568
 TUnfoldSys.cxx:569
 TUnfoldSys.cxx:570
 TUnfoldSys.cxx:571
 TUnfoldSys.cxx:572
 TUnfoldSys.cxx:573
 TUnfoldSys.cxx:574
 TUnfoldSys.cxx:575
 TUnfoldSys.cxx:576
 TUnfoldSys.cxx:577
 TUnfoldSys.cxx:578
 TUnfoldSys.cxx:579
 TUnfoldSys.cxx:580
 TUnfoldSys.cxx:581
 TUnfoldSys.cxx:582
 TUnfoldSys.cxx:583
 TUnfoldSys.cxx:584
 TUnfoldSys.cxx:585
 TUnfoldSys.cxx:586
 TUnfoldSys.cxx:587
 TUnfoldSys.cxx:588
 TUnfoldSys.cxx:589
 TUnfoldSys.cxx:590
 TUnfoldSys.cxx:591
 TUnfoldSys.cxx:592
 TUnfoldSys.cxx:593
 TUnfoldSys.cxx:594
 TUnfoldSys.cxx:595
 TUnfoldSys.cxx:596
 TUnfoldSys.cxx:597
 TUnfoldSys.cxx:598
 TUnfoldSys.cxx:599
 TUnfoldSys.cxx:600
 TUnfoldSys.cxx:601
 TUnfoldSys.cxx:602
 TUnfoldSys.cxx:603
 TUnfoldSys.cxx:604
 TUnfoldSys.cxx:605
 TUnfoldSys.cxx:606
 TUnfoldSys.cxx:607
 TUnfoldSys.cxx:608
 TUnfoldSys.cxx:609
 TUnfoldSys.cxx:610
 TUnfoldSys.cxx:611
 TUnfoldSys.cxx:612
 TUnfoldSys.cxx:613
 TUnfoldSys.cxx:614
 TUnfoldSys.cxx:615
 TUnfoldSys.cxx:616
 TUnfoldSys.cxx:617
 TUnfoldSys.cxx:618
 TUnfoldSys.cxx:619
 TUnfoldSys.cxx:620
 TUnfoldSys.cxx:621
 TUnfoldSys.cxx:622
 TUnfoldSys.cxx:623
 TUnfoldSys.cxx:624
 TUnfoldSys.cxx:625
 TUnfoldSys.cxx:626
 TUnfoldSys.cxx:627
 TUnfoldSys.cxx:628
 TUnfoldSys.cxx:629
 TUnfoldSys.cxx:630
 TUnfoldSys.cxx:631
 TUnfoldSys.cxx:632
 TUnfoldSys.cxx:633
 TUnfoldSys.cxx:634
 TUnfoldSys.cxx:635
 TUnfoldSys.cxx:636
 TUnfoldSys.cxx:637
 TUnfoldSys.cxx:638
 TUnfoldSys.cxx:639
 TUnfoldSys.cxx:640
 TUnfoldSys.cxx:641
 TUnfoldSys.cxx:642
 TUnfoldSys.cxx:643
 TUnfoldSys.cxx:644
 TUnfoldSys.cxx:645
 TUnfoldSys.cxx:646
 TUnfoldSys.cxx:647
 TUnfoldSys.cxx:648
 TUnfoldSys.cxx:649
 TUnfoldSys.cxx:650
 TUnfoldSys.cxx:651
 TUnfoldSys.cxx:652
 TUnfoldSys.cxx:653
 TUnfoldSys.cxx:654
 TUnfoldSys.cxx:655
 TUnfoldSys.cxx:656
 TUnfoldSys.cxx:657
 TUnfoldSys.cxx:658
 TUnfoldSys.cxx:659
 TUnfoldSys.cxx:660
 TUnfoldSys.cxx:661
 TUnfoldSys.cxx:662
 TUnfoldSys.cxx:663
 TUnfoldSys.cxx:664
 TUnfoldSys.cxx:665
 TUnfoldSys.cxx:666
 TUnfoldSys.cxx:667
 TUnfoldSys.cxx:668
 TUnfoldSys.cxx:669
 TUnfoldSys.cxx:670
 TUnfoldSys.cxx:671
 TUnfoldSys.cxx:672
 TUnfoldSys.cxx:673
 TUnfoldSys.cxx:674
 TUnfoldSys.cxx:675
 TUnfoldSys.cxx:676
 TUnfoldSys.cxx:677
 TUnfoldSys.cxx:678
 TUnfoldSys.cxx:679
 TUnfoldSys.cxx:680
 TUnfoldSys.cxx:681
 TUnfoldSys.cxx:682
 TUnfoldSys.cxx:683
 TUnfoldSys.cxx:684
 TUnfoldSys.cxx:685
 TUnfoldSys.cxx:686
 TUnfoldSys.cxx:687
 TUnfoldSys.cxx:688
 TUnfoldSys.cxx:689
 TUnfoldSys.cxx:690
 TUnfoldSys.cxx:691
 TUnfoldSys.cxx:692
 TUnfoldSys.cxx:693
 TUnfoldSys.cxx:694
 TUnfoldSys.cxx:695
 TUnfoldSys.cxx:696
 TUnfoldSys.cxx:697
 TUnfoldSys.cxx:698
 TUnfoldSys.cxx:699
 TUnfoldSys.cxx:700
 TUnfoldSys.cxx:701
 TUnfoldSys.cxx:702
 TUnfoldSys.cxx:703
 TUnfoldSys.cxx:704
 TUnfoldSys.cxx:705
 TUnfoldSys.cxx:706
 TUnfoldSys.cxx:707
 TUnfoldSys.cxx:708
 TUnfoldSys.cxx:709
 TUnfoldSys.cxx:710
 TUnfoldSys.cxx:711
 TUnfoldSys.cxx:712
 TUnfoldSys.cxx:713
 TUnfoldSys.cxx:714