231   for(
Int_t i=0;i<2;i++) {
 
  335   if(rank != 
GetNx()) {
 
  336      Warning(
"DoUnfold",
"rank of matrix E %d expect %d",rank,
GetNx());
 
  360         epsilonNosparse(A_cols[i],0) += A_data[i];
 
  372         Fatal(
"Unfold",
"epsilon#Eepsilon has dimension %d != 1",
 
  379         y_minus_epsx += (*fY)(iy,0);
 
  383         y_minus_epsx -=  epsilonNosparse(ix,0) * (*fX)(ix,0);
 
  386      lambda_half=y_minus_epsx*one_over_epsEeps;
 
  391         if(EEpsilon_rows[ix]<EEpsilon_rows[ix+1]) {
 
  392            (*fX)(ix,0) += lambda_half * EEpsilon_data[EEpsilon_rows[ix]];
 
  411         data[i]=one_over_epsEeps;
 
  421      AddMSparse(temp, -one_over_epsEeps, epsilonB);
 
  458      if(VyyinvDy_rows[iy]<VyyinvDy_rows[iy+1]) {
 
  459         fChi2A += VyyinvDy_data[VyyinvDy_rows[iy]]*dy(iy,0);
 
  468      if(LsquaredDx_rows[ix]<LsquaredDx_rows[ix+1]) {
 
  469         fLXsquared += LsquaredDx_data[LsquaredDx_rows[ix]]*dx(ix,0);
 
  484               "epsilon#fDXDtauSquared has dimension %d != 1",
 
  507         (Eepsilon,Eepsilon,0);
 
  532   if(rank != 
GetNx()) {
 
  533      Warning(
"DoUnfold",
"rank of output covariance is %d expect %d",
 
  542      for(
int ik=VxxInv_rows[ix];ik<VxxInv_rows[ix+1];ik++) {
 
  543         if(ix==VxxInv_cols[ik]) {
 
  544            VxxInvDiag(ix)=VxxInv_data[ik];
 
  558      for(
int ik=Vxx_rows[ix];ik<Vxx_rows[ix+1];ik++) {
 
  559         if(ix==Vxx_cols[ik]) {
 
  561               1. - 1. / (VxxInvDiag(ix) * Vxx_data[ik]);
 
  562            if (rho_squared > rho_squared_max)
 
  563               rho_squared_max = rho_squared;
 
  564            if(rho_squared>0.0) {
 
  573   fRhoAvg = (n_rho>0) ? (rho_sum/n_rho) : -1.0;
 
  621   if(
a->GetNcols()!=
b->GetNrows()) {
 
  622      Fatal(
"MultiplyMSparseMSparse",
 
  623            "inconsistent matrix col/ matrix row %d !=%d",
 
  624            a->GetNcols(),
b->GetNrows());
 
  628   const Int_t *a_rows=
a->GetRowIndexArray();
 
  629   const Int_t *a_cols=
a->GetColIndexArray();
 
  630   const Double_t *a_data=
a->GetMatrixArray();
 
  631   const Int_t *b_rows=
b->GetRowIndexArray();
 
  632   const Int_t *b_cols=
b->GetColIndexArray();
 
  633   const Double_t *b_data=
b->GetMatrixArray();
 
  636   for (
Int_t irow = 0; irow < 
a->GetNrows(); irow++) {
 
  637      if(a_rows[irow+1]>a_rows[irow]) nMax += 
b->GetNcols();
 
  639   if((nMax>0)&&(a_cols)&&(b_cols)) {
 
  645      for (
Int_t irow = 0; irow < 
a->GetNrows(); irow++) {
 
  646         if(a_rows[irow+1]<=a_rows[irow]) 
continue;
 
  648         for(
Int_t icol=0;icol<
b->GetNcols();icol++) {
 
  652         for(
Int_t ia=a_rows[irow];ia<a_rows[irow+1];ia++) {
 
  655            for(
Int_t ib=b_rows[k];ib<b_rows[k+1];ib++) {
 
  656               row_data[b_cols[ib]] += a_data[ia]*b_data[ib];
 
  660         for(
Int_t icol=0;icol<
b->GetNcols();icol++) {
 
  661            if(row_data[icol] != 0.0) {
 
  664               r_data[
n]=row_data[icol];
 
  670         r->SetMatrixArray(
n,r_rows,r_cols,r_data);
 
  696  if(
a->GetNrows() != 
b->GetNrows()) {
 
  697      Fatal(
"MultiplyMSparseTranspMSparse",
 
  698            "inconsistent matrix row numbers %d!=%d",
 
  699            a->GetNrows(),
b->GetNrows());
 
  703   const Int_t *a_rows=
a->GetRowIndexArray();
 
  704   const Int_t *a_cols=
a->GetColIndexArray();
 
  705   const Double_t *a_data=
a->GetMatrixArray();
 
  706   const Int_t *b_rows=
b->GetRowIndexArray();
 
  707   const Int_t *b_cols=
b->GetColIndexArray();
 
  708   const Double_t *b_data=
b->GetMatrixArray();
 
  712   typedef std::map<Int_t,Double_t> MMatrixRow_t;
 
  713   typedef std::map<Int_t, MMatrixRow_t > MMatrix_t;
 
  716   for(
Int_t iRowAB=0;iRowAB<
a->GetNrows();iRowAB++) {
 
  717      for(
Int_t ia=a_rows[iRowAB];ia<a_rows[iRowAB+1];ia++) {
 
  718         for(
Int_t ib=b_rows[iRowAB];ib<b_rows[iRowAB+1];ib++) {
 
  720            MMatrixRow_t &row=matrix[a_cols[ia]];
 
  721            MMatrixRow_t::iterator icol=row.find(b_cols[ib]);
 
  722            if(icol!=row.end()) {
 
  724               (*icol).second += a_data[ia]*b_data[ib];
 
  727               row[b_cols[ib]] = a_data[ia]*b_data[ib];
 
  734   for (MMatrix_t::const_iterator irow = matrix.begin(); irow != matrix.end(); ++irow) {
 
  735      n += (*irow).second.size();
 
  743      for (MMatrix_t::const_iterator irow = matrix.begin(); irow != matrix.end(); ++irow) {
 
  744         for (MMatrixRow_t::const_iterator icol = (*irow).second.begin(); icol != (*irow).second.end(); ++icol) {
 
  745            r_rows[
n]=(*irow).first;
 
  746            r_cols[
n]=(*icol).first;
 
  747            r_data[
n]=(*icol).second;
 
  753         r->SetMatrixArray(
n,r_rows,r_cols,r_data);
 
  777   if(
a->GetNcols()!=
b->GetNrows()) {
 
  778      Fatal(
"MultiplyMSparseM",
"inconsistent matrix col /matrix row %d!=%d",
 
  779            a->GetNcols(),
b->GetNrows());
 
  783   const Int_t *a_rows=
a->GetRowIndexArray();
 
  784   const Int_t *a_cols=
a->GetColIndexArray();
 
  785   const Double_t *a_data=
a->GetMatrixArray();
 
  788   for (
Int_t irow = 0; irow < 
a->GetNrows(); irow++) {
 
  789      if(a_rows[irow+1]-a_rows[irow]>0) nMax += 
b->GetNcols();
 
  798      for (
Int_t irow = 0; irow < 
a->GetNrows(); irow++) {
 
  799         if(a_rows[irow+1]-a_rows[irow]<=0) 
continue;
 
  800         for(
Int_t icol=0;icol<
b->GetNcols();icol++) {
 
  804            for(
Int_t i=a_rows[irow];i<a_rows[irow+1];i++) {
 
  806               r_data[
n] += a_data[i]*(*b)(j,icol);
 
  808            if(r_data[
n]!=0.0) 
n++;
 
  812         r->SetMatrixArray(
n,r_rows,r_cols,r_data);
 
  838      (
v && ((m1->
GetNcols()!=
v->GetNrows())||(
v->GetNcols()!=1)))) {
 
  840         Fatal(
"MultiplyMSparseMSparseTranspVector",
 
  841               "matrix cols/vector rows %d!=%d!=%d or vector rows %d!=1\n",
 
  844         Fatal(
"MultiplyMSparseMSparseTranspVector",
 
  853      if(rows_m1[i]<rows_m1[i+1]) num_m1++;
 
  860      if(rows_m2[j]<rows_m2[j+1]) num_m2++;
 
  863   const Int_t *v_rows=0;
 
  869   Int_t num_r=num_m1*num_m2+1;
 
  877         Int_t index_m1=rows_m1[i];
 
  878         Int_t index_m2=rows_m2[j];
 
  879         while((index_m1<rows_m1[i+1])&&(index_m2<rows_m2[j+1])) {
 
  880            Int_t k1=cols_m1[index_m1];
 
  881            Int_t k2=cols_m2[index_m2];
 
  888                  Int_t v_index=v_rows[k1];
 
  889                  if(v_index<v_rows[k1+1]) {
 
  890                     data_r[num_r] += data_m1[index_m1] * data_m2[index_m2]
 
  894                  data_r[num_r] += data_m1[index_m1] * data_m2[index_m2]
 
  897                  data_r[num_r] += data_m1[index_m1] * data_m2[index_m2];
 
  903         if(data_r[num_r] !=0.0) {
 
  911                                        num_r,row_r,col_r,data_r);
 
  934   const Int_t *dest_rows=
dest->GetRowIndexArray();
 
  935   const Int_t *dest_cols=
dest->GetColIndexArray();
 
  937   const Int_t *src_rows=
src->GetRowIndexArray();
 
  938   const Int_t *src_cols=
src->GetColIndexArray();
 
  941   if((
dest->GetNrows()!=
src->GetNrows())||
 
  942      (
dest->GetNcols()!=
src->GetNcols())) {
 
  943      Fatal(
"AddMSparse",
"inconsistent matrix rows %d!=%d OR cols %d!=%d",
 
  944            src->GetNrows(),
dest->GetNrows(),
src->GetNcols(),
dest->GetNcols());
 
  951   for(
Int_t row=0;row<
dest->GetNrows();row++) {
 
  952      Int_t i_dest=dest_rows[row];
 
  953      Int_t i_src=src_rows[row];
 
  954      while((i_dest<dest_rows[row+1])||(i_src<src_rows[row+1])) {
 
  955         Int_t col_dest=(i_dest<dest_rows[row+1]) ?
 
  956            dest_cols[i_dest] : 
dest->GetNcols();
 
  957         Int_t col_src =(i_src <src_rows[row+1] ) ?
 
  958            src_cols [i_src] :  
src->GetNcols();
 
  960         if(col_dest<col_src) {
 
  961            result_cols[
n]=col_dest;
 
  962            result_data[
n]=dest_data[i_dest++];
 
  963         } 
else if(col_dest>col_src) {
 
  964            result_cols[
n]=col_src;
 
  965            result_data[
n]=
f*src_data[i_src++];
 
  967            result_cols[
n]=col_dest;
 
  968            result_data[
n]=dest_data[i_dest++]+
f*src_data[i_src++];
 
  970         if(result_data[
n] !=0.0) {
 
  972               Fatal(
"AddMSparse",
"Nan detected %d %d %d",
 
  985   dest->SetMatrixArray(
n,result_rows,result_cols,result_data);
 
  986   delete[] result_data;
 
  987   delete[] result_rows;
 
  988   delete[] result_cols;
 
 1013      Fatal(
"InvertMSparseSymmPos",
"inconsistent matrix row/col %d!=%d",
 
 1030      for(
Int_t indexA=a_rows[iA];indexA<a_rows[iA+1];indexA++) {
 
 1031         Int_t jA=a_cols[indexA];
 
 1033            if(!(a_data[indexA]>=0.0)) nError++;
 
 1034            aII(iA)=a_data[indexA];
 
 1039      Fatal(
"InvertMSparseSymmPos",
 
 1040            "Matrix has %d negative elements on the diagonal", nError);
 
 1056   for(
Int_t iStart=0;iStart<iBlock;iStart++) {
 
 1058      for(
Int_t i=iStart;i<iBlock;i++) {
 
 1062            Int_t tmp=swap[iStart];
 
 1063            swap[iStart]=swap[i];
 
 1069      Int_t iA=swap[iStart];
 
 1070      for(
Int_t indexA=a_rows[iA];indexA<a_rows[iA+1];indexA++) {
 
 1071         Int_t jA=a_cols[indexA];
 
 1080         for(
Int_t i=iStart+1;i<iBlock;) {
 
 1081            if(isZero[swap[i]]) {
 
 1085               Int_t tmp=swap[iBlock];
 
 1086               swap[iBlock]=swap[i];
 
 1098#ifdef CONDITION_BLOCK_PART 
 1100   for(
int inc=(nn+1)/2;inc;inc /= 2) {
 
 1101      for(
int i=inc;i<nn;i++) {
 
 1102         int itmp=swap[i+iBlock];
 
 1104         for(j=i;(j>=inc)&&(aII(swap[j-inc+iBlock])<aII(itmp));j -=inc) {
 
 1105            swap[j+iBlock]=swap[j-inc+iBlock];
 
 1107         swap[j+iBlock]=itmp;
 
 1114      swapBack[swap[i]]=i;
 
 1118      std::cout<<
"    "<<i<<
" "<<swap[i]<<
" "<<swapBack[i]<<
"\n";
 
 1120   std::cout<<
"after sorting\n";
 
 1122      if(i==iDiagonal) std::cout<<
"iDiagonal="<<i<<
"\n";
 
 1123      if(i==iBlock) std::cout<<
"iBlock="<<i<<
"\n";
 
 1124      std::cout<<
" "<<swap[i]<<
" "<<aII(swap[i])<<
"\n";
 
 1138         for(
Int_t indexA=a_rows[row];indexA<a_rows[row+1];indexA++) {
 
 1139            Int_t j=swapBack[a_cols[indexA]];
 
 1141            else if((i<iDiagonal)||(j<iDiagonal)) nError1++;
 
 1142            else if((i<iBlock)&&(j<iBlock)) nError2++;
 
 1143            else if((i<iBlock)||(j<iBlock)) nBlock++;
 
 1147      if(nError1+nError2>0) {
 
 1148         Fatal(
"InvertMSparseSymmPos",
"sparse matrix analysis failed %d %d %d %d %d",
 
 1149               iDiagonal,iBlock,A->
GetNrows(),nError1,nError2);
 
 1154   Info(
"InvertMSparseSymmPos",
"iDiagonal=%d iBlock=%d nRow=%d",
 
 1214   for(
Int_t i=0;i<iDiagonal;++i) {
 
 1219         rEl_data[rNumEl]=1./aII(iA);
 
 1224   if((!rankPtr)&&(rankD1!=iDiagonal)) {
 
 1225      Fatal(
"InvertMSparseSymmPos",
 
 1226            "diagonal part 1 has rank %d != %d, matrix can not be inverted",
 
 1234   Int_t nD2=iBlock-iDiagonal;
 
 1236   if((rNumEl>=0)&&(nD2>0)) {
 
 1241      for(
Int_t i=0;i<nD2;++i) {
 
 1242         Int_t iA=swap[i+iDiagonal];
 
 1244            D2inv_col[D2invNumEl]=i;
 
 1245            D2inv_row[D2invNumEl]=i;
 
 1246            D2inv_data[D2invNumEl]=1./aII(iA);
 
 1250      if(D2invNumEl==nD2) {
 
 1253      } 
else if(!rankPtr) {
 
 1254         Fatal(
"InvertMSparseSymmPos",
 
 1255               "diagonal part 2 has rank %d != %d, matrix can not be inverted",
 
 1259      delete [] D2inv_data;
 
 1260      delete [] D2inv_col;
 
 1261      delete [] D2inv_row;
 
 1271   if((rNumEl>=0)&&(nF>0)&&((nD2==0)||D2inv)) {
 
 1280      Int_t nBmax=nF*(nD2+1);
 
 1286      for(
Int_t i=0;i<nF;i++) {
 
 1287         Int_t iA=swap[i+iBlock];
 
 1288         for(
Int_t indexA=a_rows[iA];indexA<a_rows[iA+1];indexA++) {
 
 1289            Int_t jA=a_cols[indexA];
 
 1290            Int_t j0=swapBack[jA];
 
 1295               F_data[FnumEl]=a_data[indexA];
 
 1297            } 
else if(j0>=iDiagonal) {
 
 1298               Int_t j=j0-iDiagonal;
 
 1301               B_data[BnumEl]=a_data[indexA];
 
 1308#ifndef FORCE_EIGENVALUE_DECOMPOSITION 
 1328            for(
Int_t i=0;i<mbd2_nMax;i++) {
 
 1329               mbd2_data[i] = -  mbd2_data[i];
 
 1333      if(minusBD2inv && 
F) {
 
 1342         const Int_t *f_rows=
F->GetRowIndexArray();
 
 1343         const Int_t *f_cols=
F->GetColIndexArray();
 
 1344         const Double_t *f_data=
F->GetMatrixArray();
 
 1348         for(
Int_t i=0;i<nF;i++) {
 
 1349            for(
Int_t indexF=f_rows[i];indexF<f_rows[i+1];indexF++) {
 
 1350               if(f_cols[indexF]>=i) 
c(f_cols[indexF],i)=f_data[indexF];
 
 1354            for(
Int_t j=0;j<i;j++) {
 
 1365            for(
Int_t j=i+1;j<nF;j++) {
 
 1367               for(
Int_t k=0;k<i;k++) {
 
 1368                  c_ji -= 
c(i,k)*
c(j,k);
 
 1377            for(
Int_t i=1;i<nF;i++) {
 
 1382            std::cout<<
"dmin,dmax: "<<dmin<<
" "<<dmax<<
"\n";
 
 1384            if(dmin/dmax<epsilonF2*nF) nErrorF=2;
 
 1390            for(
Int_t i=0;i<nF;i++) {
 
 1391               cinv(i,i)=1./
c(i,i);
 
 1393            for(
Int_t i=0;i<nF;i++) {
 
 1394               for(
Int_t j=i+1;j<nF;j++) {
 
 1396                  for(
Int_t k=i+1;k<j;k++) {
 
 1397                     tmp -= cinv(k,i)*
c(j,k);
 
 1399                  cinv(j,i)=tmp*cinv(j,j);
 
 1404               (&cInvSparse,&cInvSparse);
 
 1415   Int_t rankD2Block=0;
 
 1417      if( ((nD2==0)||D2inv) && ((nF==0)||Finv) ) {
 
 1427         if(Finv && minusBD2inv) {
 
 1432         if(
G && minusBD2inv) {
 
 1439               E=minusBD2invTransG;
 
 1444            const Int_t *e_rows=E->GetRowIndexArray();
 
 1445            const Int_t *e_cols=E->GetColIndexArray();
 
 1446            const Double_t *e_data=E->GetMatrixArray();
 
 1447            for(
Int_t iE=0;iE<E->GetNrows();iE++) {
 
 1448               Int_t iA=swap[iE+iDiagonal];
 
 1449               for(
Int_t indexE=e_rows[iE];indexE<e_rows[iE+1];++indexE) {
 
 1450                  Int_t jE=e_cols[indexE];
 
 1451                  Int_t jA=swap[jE+iDiagonal];
 
 1454                  rEl_data[rNumEl]=e_data[indexE];
 
 1462            const Int_t *g_rows=
G->GetRowIndexArray();
 
 1463            const Int_t *g_cols=
G->GetColIndexArray();
 
 1464            const Double_t *g_data=
G->GetMatrixArray();
 
 1465            for(
Int_t iG=0;iG<
G->GetNrows();iG++) {
 
 1466               Int_t iA=swap[iG+iBlock];
 
 1467               for(
Int_t indexG=g_rows[iG];indexG<g_rows[iG+1];++indexG) {
 
 1468                  Int_t jG=g_cols[indexG];
 
 1469                  Int_t jA=swap[jG+iDiagonal];
 
 1473                  rEl_data[rNumEl]=g_data[indexG];
 
 1478                  rEl_data[rNumEl]=g_data[indexG];
 
 1490               Int_t iA=swap[iF+iBlock];
 
 1491               for(
Int_t indexF=finv_rows[iF];indexF<finv_rows[iF+1];++indexF) {
 
 1492                  Int_t jF=finv_cols[indexF];
 
 1493                  Int_t jA=swap[jF+iBlock];
 
 1496                  rEl_data[rNumEl]=finv_data[indexF];
 
 1502      } 
else if(!rankPtr) {
 
 1504         Fatal(
"InvertMSparseSymmPos",
 
 1505               "non-trivial part has rank < %d, matrix can not be inverted",
 
 1512         Info(
"InvertMSparseSymmPos",
 
 1513              "cholesky-decomposition failed, try eigenvalue analysis");
 
 1515         std::cout<<
"nEV="<<nEV<<
" iDiagonal="<<iDiagonal<<
"\n";
 
 1518         for(
Int_t i=0;i<nEV;i++) {
 
 1519            Int_t iA=swap[i+iDiagonal];
 
 1520            for(
Int_t indexA=a_rows[iA];indexA<a_rows[iA+1];indexA++) {
 
 1521               Int_t jA=a_cols[indexA];
 
 1522               Int_t j0=swapBack[jA];
 
 1524                  Int_t j=j0-iDiagonal;
 
 1526                  if((i<0)||(j<0)||(i>=nEV)||(j>=nEV)) {
 
 1527                     std::cout<<
" error "<<nEV<<
" "<<i<<
" "<<j<<
"\n";
 
 1531                     Fatal(
"InvertMSparseSymmPos",
 
 1532                           "non-finite number detected element %d %d\n",
 
 1535                  EV(i,j)=a_data[indexA];
 
 1542         std::cout<<
"Eigenvalues\n";
 
 1552         if(condition<-epsilonEV2) {
 
 1557               Error(
"InvertMSparseSymmPos",
 
 1558                     "Largest Eigenvalue is negative %f",
 
 1561               Error(
"InvertMSparseSymmPos",
 
 1562                     "Some Eigenvalues are negative (EV%d/EV0=%g epsilon=%g)",
 
 1572         for(
Int_t i=0;i<nEV;i++) {
 
 1575               inverseEV(i,0)=1./
x;
 
 1588            Int_t iA=swap[iVDVt+iDiagonal];
 
 1589            for(
Int_t indexVDVt=vdvt_rows[iVDVt];
 
 1590                indexVDVt<vdvt_rows[iVDVt+1];++indexVDVt) {
 
 1591               Int_t jVDVt=vdvt_cols[indexVDVt];
 
 1592               Int_t jA=swap[jVDVt+iDiagonal];
 
 1595               rEl_data[rNumEl]=vdvt_data[indexVDVt];
 
 1603      *rankPtr=rankD1+rankD2Block;
 
 1618                         rEl_row,rEl_col,rEl_data) : 0;
 
 1641      for(
Int_t i=0;i<
a.GetNrows();i++) {
 
 1642         for(
Int_t j=0;j<
a.GetNcols();j++) {
 
 1646               std::cout<<
"Ar is not symmetric Ar("<<i<<
","<<j<<
")="<<ar(i,j)
 
 1647                        <<
" Ar("<<j<<
","<<i<<
")="<<ar(j,i)<<
"\n";
 
 1652               std::cout<<
"ArA is not equal A ArA("<<i<<
","<<j<<
")="<<ara(i,j)
 
 1653                        <<
" A("<<i<<
","<<j<<
")="<<
a(i,j)<<
"\n";
 
 1658               std::cout<<
"rAr is not equal r rAr("<<i<<
","<<j<<
")="<<rar(i,j)
 
 1659                        <<
" r("<<i<<
","<<j<<
")="<<
R(i,j)<<
"\n";
 
 1663      if(rankPtr) std::cout<<
"rank="<<*rankPtr<<
"\n";
 
 1665      std::cout<<
"Matrix is not positive\n";
 
 1755   for (
Int_t ix = 0; ix < nx0; ix++) {
 
 1760      for (
Int_t iy = 0; iy < ny; iy++) {
 
 1798   Int_t underflowBin=0,overflowBin=0;
 
 1799   for (
Int_t ix = 0; ix < nx; ix++) {
 
 1801      if(ibinx<1) underflowBin=1;
 
 1803         if(ibinx>hist_A->
GetNbinsX()) overflowBin=1;
 
 1805         if(ibinx>hist_A->
GetNbinsY()) overflowBin=1;
 
 1810      Int_t ixfirst=-1,ixlast=-1;
 
 1812      int nDisconnected=0;
 
 1813      for (
Int_t ix = 0; ix < nx0; ix++) {
 
 1824         if(((
fHistToX[ix]>=0)&&(ixlast>=0))||
 
 1825            (nprint==nskipped)) {
 
 1826            if(ixlast>ixfirst) {
 
 1833         if(nprint==nskipped) {
 
 1837      if(nskipped==(2-underflowBin-overflowBin)) {
 
 1838         Info(
"TUnfold",
"underflow and overflow bin " 
 1839         "do not depend on the input data");
 
 1841         Warning(
"TUnfold",
"%d output bins " 
 1842                 "do not depend on the input data %s",nDisconnected,
 
 1843                 static_cast<const char *
>(binlist));
 
 1854   for (
Int_t iy = 0; iy < ny; iy++) {
 
 1855      for (
Int_t ix = 0; ix < nx; ix++) {
 
 1871   if(underflowBin && overflowBin) {
 
 1872      Info(
"TUnfold",
"%d input bins and %d output bins (includes 2 underflow/overflow bins)",ny,nx);
 
 1873   } 
else if(underflowBin) {
 
 1874      Info(
"TUnfold",
"%d input bins and %d output bins (includes 1 underflow bin)",ny,nx);
 
 1875   } 
else if(overflowBin) {
 
 1876      Info(
"TUnfold",
"%d input bins and %d output bins (includes 1 overflow bin)",ny,nx);
 
 1878      Info(
"TUnfold",
"%d input bins and %d output bins",ny,nx);
 
 1882      Error(
"TUnfold",
"too few (ny=%d) input bins for nx=%d output bins",ny,nx);
 
 1884      Warning(
"TUnfold",
"too few (ny=%d) input bins for nx=%d output bins",ny,nx);
 
 1896                 "%d regularisation conditions have been skipped",nError);
 
 1899                 "One regularisation condition has been skipped");
 
 1989      for(
Int_t k=l0_rows[row];k<l0_rows[row+1];k++) {
 
 1991         l_col[nF]=l0_cols[k];
 
 1992         l_data[nF]=l0_data[k];
 
 2004   for(
Int_t i=0;i<nEle;i++) {
 
 2012      l_data[nF]=rowData[i];
 
 2136      (left_bin,-scale_left,
 
 2137       center_bin,scale_left+scale_right,
 
 2138       right_bin,-scale_right)
 
 2185      Error(
"RegularizeBins",
"regmode = %d is not valid",regmode);
 
 2187   for (
Int_t i = nSkip; i < nbin; i++) {
 
 2224                               int step2, 
int nbin2, 
ERegMode regmode)
 
 2237   for (
Int_t i1 = 0; i1 < nbin1; i1++) {
 
 2238      nError += 
RegularizeBins(start_bin + step1 * i1, step2, nbin2, regmode);
 
 2240   for (
Int_t i2 = 0; i2 < nbin2; i2++) {
 
 2241      nError += 
RegularizeBins(start_bin + step2 * i2, step1, nbin1, regmode);
 
 2303                        const TH2 *hist_vyy_inv)
 
 2325  Int_t nVarianceZero=0;
 
 2326  Int_t nVarianceForced=0;
 
 2336           if(oneOverZeroError>0.0) {
 
 2337              dy2 = 1./ ( oneOverZeroError*oneOverZeroError);
 
 2349     rowVyyN[nVyyN] = iy;
 
 2350     colVyyN[nVyyN] = iy;
 
 2351     rowVyy1[nVyy1] = iy;
 
 2353     dataVyyDiag[iy] = dy2;
 
 2355        dataVyyN[nVyyN++] = dy2;
 
 2356        dataVyy1[nVyy1++] = dy2;
 
 2361     Int_t nOffDiagNonzero=0;
 
 2364        if(dataVyyDiag[iy]<=0.0) {
 
 2374           if(iy==jy) 
continue;
 
 2376           if(dataVyyDiag[jy]<=0.0) 
continue;
 
 2378           rowVyyN[nVyyN] = iy;
 
 2379           colVyyN[nVyyN] = jy;
 
 2381           if(dataVyyN[nVyyN] == 0.0) 
continue;
 
 2387                "inverse of input covariance is taken from user input");
 
 2394              rowVyyInv[nVyyInv] = iy;
 
 2395              colVyyInv[nVyyInv] = jy;
 
 2396              dataVyyInv[nVyyInv]= hist_vyy_inv->
GetBinContent(iy+1,jy+1);
 
 2397              if(dataVyyInv[nVyyInv] == 0.0) 
continue;
 
 2402           (
GetNy(),
GetNy(),nVyyInv,rowVyyInv,colVyyInv,dataVyyInv);
 
 2403        delete [] rowVyyInv;
 
 2404        delete [] colVyyInv;
 
 2405        delete [] dataVyyInv;
 
 2407        if(nOffDiagNonzero) {
 
 2409                 "input covariance has elements C(X,Y)!=0 where V(X)==0");
 
 2415     (
GetNy(),
GetNy(),nVyyN,rowVyyN,colVyyN,dataVyyN);
 
 2422     (
GetNy(),1,nVyy1,rowVyy1,colVyy1, dataVyy1);
 
 2433     (*fY) (i, 0) = 
input->GetBinContent(i + 1);
 
 2445  if(nVarianceForced) {
 
 2446     if(nVarianceForced>1) {
 
 2447        Warning(
"SetInput",
"%d/%d input bins have zero error," 
 2448                " 1/error set to %lf.",
 
 2449                nVarianceForced,
GetNy(),oneOverZeroError);
 
 2451        Warning(
"SetInput",
"One input bin has zero error," 
 2452                " 1/error set to %lf.",oneOverZeroError);
 
 2456     if(nVarianceZero>1) {
 
 2457        Warning(
"SetInput",
"%d/%d input bins have zero error," 
 2458                " and are ignored.",nVarianceZero,
GetNy());
 
 2460        Warning(
"SetInput",
"One input bin has zero error," 
 2461                " and is ignored.");
 
 2467     if(oneOverZeroError<=0.0) {
 
 2473              TString binlist(
"no data to constrain output bin ");
 
 2484              Warning(
"SetInput",
"%s",(
char const *)binlist);
 
 2489        Error(
"SetInput",
"%d/%d output bins are not constrained by any data.",
 
 2492        Error(
"SetInput",
"One output bins is not constrained by any data.");
 
 2497  delete[] dataVyyDiag;
 
 2499  return nVarianceForced+nVarianceZero+10000*nError2;
 
 2554  typedef std::map<Double_t,std::pair<Double_t,Double_t> > XYtau_t;
 
 2579  if((tauMin<=0)||(tauMax<=0.0)||(tauMin>=tauMax)) {
 
 2589        Error(
"ScanLcurve",
"too few input bins, NDF<=0 %d",
GetNdf());
 
 2594     Info(
"ScanLcurve",
"logtau=-Infinity X=%lf Y=%lf",x0,y0);
 
 2596        Fatal(
"ScanLcurve",
"problem (too few input bins?) X=%f",x0);
 
 2599        Fatal(
"ScanLcurve",
"problem (missing regularisation?) Y=%f",y0);
 
 2608           Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2612        Info(
"ScanLcurve",
"logtau=%lf X=%lf Y=%lf",
 
 2615     if((*curve.begin()).second.first<x0) {
 
 2627              Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2631           Info(
"ScanLcurve",
"logtau=%lf X=%lf Y=%lf",
 
 2634        while(((
int)curve.size()<(nPoint-1)/2)&&
 
 2635              ((*curve.begin()).second.first<x0));
 
 2642        while(((
int)curve.size()<nPoint-1)&&
 
 2643              (((*curve.begin()).second.first-x0>0.00432)||
 
 2644               ((*curve.begin()).second.second-y0>0.00432)||
 
 2645               (curve.size()<2))) {
 
 2649              Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2653           Info(
"ScanLcurve",
"logtau=%lf X=%lf Y=%lf",
 
 2664           Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2667        Info(
"ScanLcurve",
"logtau=%lf X=%lf Y=%lf",
 
 2674        Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2677     Info(
"ScanLcurve",
"logtau=%lf X=%lf Y=%lf",
 
 2687  while(
int(curve.size())<nPoint-1) {
 
 2690    XYtau_t::const_iterator i0,i1;
 
 2695    for (++i1; i1 != curve.end(); ++i1) {
 
 2696       const std::pair<Double_t, Double_t> &xy0 = (*i0).second;
 
 2697       const std::pair<Double_t, Double_t> &xy1 = (*i1).second;
 
 2698       Double_t dx = xy1.first - xy0.first;
 
 2699       Double_t dy = xy1.second - xy0.second;
 
 2703          logTau = 0.5 * ((*i0).first + (*i1).first);
 
 2709       Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2721  XYtau_t::const_iterator i0,i1;
 
 2726  if( ((
int)curve.size())<nPoint) {
 
 2735      for (XYtau_t::const_iterator i = curve.begin(); i != curve.end(); ++i) {
 
 2736         lXi[
n] = (*i).second.first;
 
 2737         lYi[
n] = (*i).second.second;
 
 2738         lTi[
n] = (*i).first;
 
 2745      for(
Int_t i=0;i<
n-1;i++) {
 
 2748        Double_t tauBar=0.5*(lTi[i]+lTi[i+1]);
 
 2749        Double_t dTau=0.5*(lTi[i+1]-lTi[i]);
 
 2750        Double_t dx1=bi+dTau*(2.*ci+3.*di*dTau);
 
 2753        Double_t dy1=bi+dTau*(2.*ci+3.*di*dTau);
 
 2756        cCi[i]=(dy2*dx1-dy1*dx2)/
TMath::Power(dx1*dx1+dy1*dy1,1.5);
 
 2776    for(
Int_t i=iskip;i<
n-2-iskip;i++) {
 
 2799          xx = m_p_half + discr;
 
 2801          xx = m_p_half - discr;
 
 2805        if((xx>0.0)&&(xx<dx)) {
 
 2819        if((xx>0.0)&&(xx<dx)) {
 
 2833    if(logTauCurvature) {
 
 2834       *logTauCurvature=splineC;
 
 2843       Fatal(
"ScanLcurve",
"problem (missing regularisation?) X=%f Y=%f",
 
 2846    Info(
"ScanLcurve",
"Result logtau=%lf X=%lf Y=%lf",
 
 2856  Int_t bestChoice=-1;
 
 2857  if(curve.size()>0) {
 
 2862    for (XYtau_t::const_iterator i = curve.begin(); i != curve.end(); ++i) {
 
 2863       if (logTauFin == (*i).first) {
 
 2866       x[
n] = (*i).second.first;
 
 2867       y[
n] = (*i).second.second;
 
 2868       logT[
n] = (*i).first;
 
 2873       (*lCurve)->SetTitle(
"L curve");
 
 2875    if(logTauX) (*logTauX)=
new TSpline3(
"log(chi**2)%log(tau)",logT,
x,
n);
 
 2876    if(logTauY) (*logTauY)=
new TSpline3(
"log(reg.cond)%log(tau)",logT,
y,
n);
 
 2963      Int_t destI = binMap ? binMap[i+1] : i+1;
 
 2964      if(destI<0) 
continue;
 
 2968      Int_t index_a=rows_A[i];
 
 2969      Int_t index_av=rows_AVxx[i];
 
 2970      while((index_a<rows_A[i+1])&&(index_av<rows_AVxx[i+1])) {
 
 2971         Int_t j_a=cols_A[index_a];
 
 2972         Int_t j_av=cols_AVxx[index_av];
 
 2975         } 
else if(j_a>j_av) {
 
 2978            e2 += data_AVxx[index_av] * data_A[index_a];
 
 3006      for(
Int_t indexA=rows_A[iy];indexA<rows_A[iy+1];indexA++) {
 
 3007         Int_t ix = cols_A[indexA];
 
 3041      Int_t destI=binMap ? binMap[i+1] : i+1;
 
 3042      if(destI<0) 
continue;
 
 3048         if(cols_Vyy[
index]==i) {
 
 3072         Warning(
"GetInputInverseEmatrix",
"input covariance matrix has rank %d expect %d",
 
 3076         Error(
"GetInputInverseEmatrix",
"number of parameters %d > %d (rank of input covariance). Problem can not be solved",
GetNpar(),rank);
 
 3077      } 
else if(
fNdf==0) {
 
 3078         Warning(
"GetInputInverseEmatrix",
"number of parameters %d = input rank %d. Problem is ill posed",
GetNpar(),rank);
 
 3087      for(
int i=0;i<=out->
GetNbinsX()+1;i++) {
 
 3088         for(
int j=0;j<=out->
GetNbinsY()+1;j++) {
 
 3275   std::map<Int_t,Double_t> e2;
 
 3282   for(
Int_t i=0;i<binMapSize;i++) {
 
 3283      Int_t destBinI=binMap ? binMap[i] : i; 
 
 3285      if((destBinI>=0)&&(srcBinI>=0)) {
 
 3287            (destBinI, (*
fX)(srcBinI,0)+ 
output->GetBinContent(destBinI));
 
 3293         Int_t index_vxx=rows_Vxx[srcBinI];
 
 3295         while((j<binMapSize)&&(index_vxx<rows_Vxx[srcBinI+1])) {
 
 3296            Int_t destBinJ=binMap ? binMap[j] : j; 
 
 3297            if(destBinI!=destBinJ) {
 
 3306                  if(cols_Vxx[index_vxx]<srcBinJ) {
 
 3309                  } 
else if(cols_Vxx[index_vxx]>srcBinJ) {
 
 3314                     e2[destBinI] += data_Vxx[index_vxx];
 
 3324   for (std::map<Int_t, Double_t>::const_iterator i = e2.begin(); i != e2.end(); ++i) {
 
 3349      for(
Int_t i=0;i<nbin+2;i++) {
 
 3350         for(
Int_t j=0;j<nbin+2;j++) {
 
 3363      for(
Int_t i=0;i<binMapSize;i++) {
 
 3364         Int_t destBinI=binMap ? binMap[i] : i;
 
 3366         if((destBinI>=0)&&(destBinI<nbin+2)&&(srcBinI>=0)) {
 
 3372            Int_t index_vxx=rows_emat[srcBinI];
 
 3373            while((j<binMapSize)&&(index_vxx<rows_emat[srcBinI+1])) {
 
 3374               Int_t destBinJ=binMap ? binMap[j] : j;
 
 3376               if((destBinJ<0)||(destBinJ>=nbin+2)||(srcBinJ<0)) {
 
 3380                  if(cols_emat[index_vxx]<srcBinJ) {
 
 3383                  } 
else if(cols_emat[index_vxx]>srcBinJ) {
 
 3389                        + data_emat[index_vxx];
 
 3431   for(
Int_t i=0;i<nbin+2;i++) {
 
 3434   for(
Int_t i=0;i<nbin+2;i++) {
 
 3435      for(
Int_t j=0;j<nbin+2;j++) {
 
 3436         if((
e[i]>0.0)&&(
e[j]>0.0)) {
 
 3490         for(
int index_vxx=rows_Vxx[i];index_vxx<rows_Vxx[i+1];index_vxx++) {
 
 3491            if(cols_Vxx[index_vxx]==i) {
 
 3492               e_ii=data_Vxx[index_vxx];
 
 3496         for(
int index_vxxinv=rows_VxxInv[i];index_vxxinv<rows_VxxInv[i+1];
 
 3498            if(cols_VxxInv[index_vxxinv]==i) {
 
 3499               einv_ii=data_VxxInv[index_vxxinv];
 
 3504         if((einv_ii>0.0)&&(e_ii>0.0)) rho=1.-1./(einv_ii*e_ii);
 
 3530                                    const Int_t *binMap,
TH2 *invEmat)
 const 
 3542   std::map<int,int> histToLocalBin;
 
 3544   for(
Int_t i=0;i<binMapSize;i++) {
 
 3545      Int_t mapped_i=binMap ? binMap[i] : i;
 
 3547         if(histToLocalBin.find(mapped_i)==histToLocalBin.end()) {
 
 3548            histToLocalBin[mapped_i]=nBin;
 
 3558      for (std::map<int, int>::const_iterator i = histToLocalBin.begin(); i != histToLocalBin.end(); ++i) {
 
 3559         localBinToHist[(*i).second]=(*i).first;
 
 3576         Int_t destI=binMap ? binMap[origI] : origI;
 
 3577         if(destI<0) 
continue;
 
 3578         Int_t ematBinI=histToLocalBin[destI];
 
 3579         for(
int index_eOrig=rows_eOrig[i];index_eOrig<rows_eOrig[i+1];
 
 3582            Int_t j=cols_eOrig[index_eOrig];
 
 3586            Int_t destJ=binMap ? binMap[origJ] : origJ;
 
 3587            if(destJ<0) 
continue;
 
 3588            Int_t ematBinJ=histToLocalBin[destJ];
 
 3589            eRemap(ematBinI,ematBinJ) += data_eOrig[index_eOrig];
 
 3597         Warning(
"GetRhoIFormMatrix",
"Covariance matrix has rank %d expect %d",
 
 3608         for(
Int_t index_einv=rows_eInv[i];index_einv<rows_eInv[i+1];
 
 3610            Int_t j=cols_eInv[index_einv];
 
 3612               einv_ii=data_eInv[index_einv];
 
 3616                                      data_eInv[index_einv]);
 
 3620         if((einv_ii>0.0)&&(e_ii>0.0)) rho=1.-1./(einv_ii*e_ii);
 
 3631      delete [] localBinToHist;
 
 3647   nxyz[0]=
h->GetNbinsX()+1;
 
 3648   nxyz[1]=
h->GetNbinsY()+1;
 
 3649   nxyz[2]=
h->GetNbinsZ()+1;
 
 3650   for(
int i=
h->GetDimension();i<3;i++) nxyz[i]=0;
 
 3652   for(
int i=0;i<3;i++) ixyz[i]=0;
 
 3653   while((ixyz[0]<=nxyz[0])&&
 
 3654         (ixyz[1]<=nxyz[1])&&
 
 3655         (ixyz[2]<=nxyz[2])){
 
 3656      Int_t ibin=
h->GetBin(ixyz[0],ixyz[1],ixyz[2]);
 
 3657      h->SetBinContent(ibin,
x);
 
 3658      h->SetBinError(ibin,0.0);
 
 3659      for(
Int_t i=0;i<3;i++) {
 
 3661         if(ixyz[i]<=nxyz[i]) 
break;
 
#define R(a, b, c, d, e, f, g, h, i)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint xy
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
TMatrixTSparse< Double_t > TMatrixDSparse
TMatrixT< Double_t > TMatrixD
void Set(Int_t n) override
Set size of this array to n doubles.
const Double_t * GetArray() const
void Set(Int_t n) override
Set size of this array to n ints.
A TGraph is an object made of two arrays X and Y with npoints each.
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetNbinsY() const
virtual Int_t GetNbinsX() const
virtual void SetBinError(Int_t bin, Double_t error)
Set the bin Error Note that this resets the bin eror option to be of Normal Type and for the non-empt...
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Service class for 2-D histogram classes.
void SetBinContent(Int_t bin, Double_t content) override
Set bin content.
Double_t GetBinContent(Int_t binx, Int_t biny) const override
const TVectorD & GetEigenValues() const
const TMatrixD & GetEigenVectors() const
TMatrixTBase< Element > & SetMatrixArray(const Element *data, Option_t *="") override
Copy array data to matrix .
const Int_t * GetRowIndexArray() const override
const Int_t * GetColIndexArray() const override
const Element * GetMatrixArray() const override
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Fatal(const char *method, const char *msgfmt,...) const
Issue fatal error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
Class to create third splines to interpolate knots Arbitrary conditions can be introduced for first a...
void GetCoeff(Int_t i, Double_t &x, Double_t &y, Double_t &b, Double_t &c, Double_t &d) const
Double_t Eval(Double_t x) const override
Eval this spline at x.
Base class for spline implementation containing the Draw/Paint methods.
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
An algorithm to unfold distributions from detector to truth level.
TArrayI fHistToX
mapping of histogram bins to matrix indices
TMatrixDSparse * fE
matrix E
TMatrixDSparse * fEinv
matrix E^(-1)
virtual Double_t GetLcurveY(void) const
Get value on y-axis of L-curve determined in recent unfolding.
TMatrixDSparse * fAx
result x folded back A*x
TMatrixDSparse * MultiplyMSparseM(const TMatrixDSparse *a, const TMatrixD *b) const
Multiply sparse matrix and a non-sparse matrix.
virtual Double_t DoUnfold(void)
Core unfolding algorithm.
Double_t fChi2A
chi**2 contribution from (y-Ax)Vyy-1(y-Ax)
TMatrixD * fX0
bias vector x0
void GetBias(TH1 *bias, const Int_t *binMap=nullptr) const
Get bias vector including bias scale.
TMatrixDSparse * MultiplyMSparseTranspMSparse(const TMatrixDSparse *a, const TMatrixDSparse *b) const
Multiply a transposed Sparse matrix with another sparse matrix,.
TMatrixDSparse * MultiplyMSparseMSparseTranspVector(const TMatrixDSparse *m1, const TMatrixDSparse *m2, const TMatrixTBase< Double_t > *v) const
Calculate a sparse matrix product  where the diagonal matrix V is given by a vector.
TMatrixDSparse * CreateSparseMatrix(Int_t nrow, Int_t ncol, Int_t nele, Int_t *row, Int_t *col, Double_t *data) const
Create a sparse matrix, given the nonzero elements.
Int_t RegularizeSize(int bin, Double_t scale=1.0)
Add a regularisation condition on the magnitude of a truth bin.
Double_t fEpsMatrix
machine accuracy used to determine matrix rank after eigenvalue analysis
void GetProbabilityMatrix(TH2 *A, EHistMap histmap) const
Get matrix of probabilities.
Double_t GetChi2L(void) const
Get  contribution determined in recent unfolding.
TMatrixDSparse * fVxx
covariance matrix Vxx
Int_t GetNy(void) const
returns the number of measurement bins
virtual TString GetOutputBinName(Int_t iBinX) const
Get bin name of an output bin.
Double_t fBiasScale
scale factor for the bias
virtual Int_t ScanLcurve(Int_t nPoint, Double_t tauMin, Double_t tauMax, TGraph **lCurve, TSpline **logTauX=nullptr, TSpline **logTauY=nullptr, TSpline **logTauCurvature=nullptr)
Scan the L curve, determine tau and unfold at the final value of tau.
Double_t fRhoAvg
average global correlation coefficient
TMatrixDSparse * fDXDtauSquared
derivative of the result wrt tau squared
static void DeleteMatrix(TMatrixD **m)
delete matrix and invalidate pointer
void ClearHistogram(TH1 *h, Double_t x=0.) const
Initialize bin contents and bin errors for a given histogram.
Int_t RegularizeDerivative(int left_bin, int right_bin, Double_t scale=1.0)
Add a regularisation condition on the difference of two truth bin.
Int_t GetNx(void) const
returns internal number of output (truth) matrix rows
static const char * GetTUnfoldVersion(void)
Return a string describing the TUnfold version.
void SetConstraint(EConstraint constraint)
Set type of area constraint.
void GetFoldedOutput(TH1 *folded, const Int_t *binMap=nullptr) const
Get unfolding result on detector level.
Int_t RegularizeBins(int start, int step, int nbin, ERegMode regmode)
Add regularisation conditions for a group of bins.
Bool_t AddRegularisationCondition(Int_t i0, Double_t f0, Int_t i1=-1, Double_t f1=0., Int_t i2=-1, Double_t f2=0.)
Add a row of regularisation conditions to the matrix L.
Int_t RegularizeCurvature(int left_bin, int center_bin, int right_bin, Double_t scale_left=1.0, Double_t scale_right=1.0)
Add a regularisation condition on the curvature of three truth bin.
void SetBias(const TH1 *bias)
Set bias vector.
void GetL(TH2 *l) const
Get matrix of regularisation conditions.
ERegMode fRegMode
type of regularisation
Int_t GetNr(void) const
Get number of regularisation conditions.
TMatrixDSparse * fVxxInv
inverse of covariance matrix Vxx-1
TMatrixD * fX
unfolding result x
EConstraint
type of extra constraint
@ kEConstraintNone
use no extra constraint
virtual Double_t GetLcurveX(void) const
Get value on x-axis of L-curve determined in recent unfolding.
Double_t GetRhoI(TH1 *rhoi, const Int_t *binMap=nullptr, TH2 *invEmat=nullptr) const
Get global correlation coefficients, possibly cumulated over several bins.
TMatrixDSparse * fVyy
covariance matrix Vyy corresponding to y
Int_t fNdf
number of degrees of freedom
TArrayD fSumOverY
truth vector calculated from the non-normalized response matrix
ERegMode
choice of regularisation scheme
@ kRegModeNone
no regularisation, or defined later by RegularizeXXX() methods
@ kRegModeDerivative
regularize the 1st derivative of the output distribution
@ kRegModeSize
regularise the amplitude of the output distribution
@ kRegModeCurvature
regularize the 2nd derivative of the output distribution
@ kRegModeMixed
mixed regularisation pattern
void GetInput(TH1 *inputData, const Int_t *binMap=nullptr) const
Input vector of measurements.
void SetEpsMatrix(Double_t eps)
set numerical accuracy for Eigenvalue analysis when inverting matrices with rank problems
void GetOutput(TH1 *output, const Int_t *binMap=nullptr) const
Get output distribution, possibly cumulated over several bins.
void GetRhoIJ(TH2 *rhoij, const Int_t *binMap=nullptr) const
Get correlation coefficients, possibly cumulated over several bins.
void ErrorMatrixToHist(TH2 *ematrix, const TMatrixDSparse *emat, const Int_t *binMap, Bool_t doClear) const
Add up an error matrix, also respecting the bin mapping.
TArrayI fXToHist
mapping of matrix indices to histogram bins
TMatrixDSparse * fDXDY
derivative of the result wrt dx/dy
TMatrixD * fY
input (measured) data y
TMatrixDSparse * InvertMSparseSymmPos(const TMatrixDSparse *A, Int_t *rank) const
Get the inverse or pseudo-inverse of a positive, sparse matrix.
TMatrixDSparse * fVyyInv
inverse of the input covariance matrix Vyy-1
Double_t fLXsquared
chi**2 contribution from (x-s*x0)TLTL(x-s*x0)
TMatrixDSparse * fDXDAM[2]
matrix contribution to the of derivative dx_k/dA_ij
Double_t fTauSquared
regularisation parameter tau squared
Int_t GetNpar(void) const
Get number of truth parameters determined in recent unfolding.
virtual void ClearResults(void)
Reset all results.
Double_t fRhoMax
maximum global correlation coefficient
void GetEmatrix(TH2 *ematrix, const Int_t *binMap=nullptr) const
Get output covariance matrix, possibly cumulated over several bins.
TMatrixDSparse * MultiplyMSparseMSparse(const TMatrixDSparse *a, const TMatrixDSparse *b) const
Multiply two sparse matrices.
EConstraint fConstraint
type of constraint to use for the unfolding
TUnfold(void)
Only for use by root streamer or derived classes.
EHistMap
arrangement of axes for the response matrix (TH2 histogram)
@ kHistMapOutputHoriz
truth level on x-axis of the response matrix
void AddMSparse(TMatrixDSparse *dest, Double_t f, const TMatrixDSparse *src) const
Add a sparse matrix, scaled by a factor, to another scaled matrix.
void GetNormalisationVector(TH1 *s, const Int_t *binMap=nullptr) const
Histogram of truth bins, determined from summing over the response matrix.
TMatrixDSparse * fDXDAZ[2]
vector contribution to the of derivative dx_k/dA_ij
Double_t GetRhoIFromMatrix(TH1 *rhoi, const TMatrixDSparse *eOrig, const Int_t *binMap, TH2 *invEmat) const
Get global correlation coefficients with arbitrary min map.
void InitTUnfold(void)
Initialize data members, for use in constructors.
Double_t GetTau(void) const
Return regularisation parameter.
Int_t RegularizeBins2D(int start_bin, int step1, int nbin1, int step2, int nbin2, ERegMode regmode)
Add regularisation conditions for 2d unfolding.
void GetLsquared(TH2 *lsquared) const
Get matrix of regularisation conditions squared.
void GetInputInverseEmatrix(TH2 *ematrix)
Get inverse of the measurement's covariance matrix.
TMatrixDSparse * fA
response matrix A
TMatrixDSparse * fL
regularisation conditions L
virtual Int_t SetInput(const TH1 *hist_y, Double_t scaleBias=0.0, Double_t oneOverZeroError=0.0, const TH2 *hist_vyy=nullptr, const TH2 *hist_vyy_inv=nullptr)
Define input data for subsequent calls to DoUnfold(tau).
Int_t fIgnoredBins
number of input bins which are dropped because they have error=0
Int_t GetNdf(void) const
get number of degrees of freedom determined in recent unfolding
Short_t Max(Short_t a, Short_t b)
Returns the largest of a and b.
Int_t Finite(Double_t x)
Check if it is finite with a mask in order to be consistent in presence of fast math.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Double_t Log10(Double_t x)
Returns the common (base-10) logarithm of x.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
static uint64_t sum(uint64_t i)
#define dest(otri, vertexptr)