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,
nullptr);
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=
nullptr;
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) :
nullptr;
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.empty()) {
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);
2931 out->GetBinContent(
dest));
2963 Int_t destI = binMap ? binMap[i+1] : i+1;
2964 if(destI<0)
continue;
2966 out->SetBinContent(destI, (*
fAx) (i, 0)+ out->GetBinContent(destI));
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;
3044 out->SetBinContent(destI, (*
fY) (i, 0)+out->GetBinContent(destI));
3048 if(cols_Vyy[
index]==i) {
3052 out->SetBinError(destI,
e);
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++) {
3089 out->SetBinContent(i,j,0.);
3096 out->SetBinContent(i+1,j+1,data_VyyInv[
index]);
3164 out->SetBinContent(indexH,row+1,
data[
cindex]);
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)