117 ClassImp(TUnfoldSys);
 
  119 TUnfoldSys::~TUnfoldSys(
void)
 
  122    DeleteMatrix(&fDAinRelSq);
 
  123    DeleteMatrix(&fDAinColRelSq);
 
  125    delete fBgrErrUncorrInSq;
 
  126    delete fBgrErrScaleIn;
 
  131    DeleteMatrix(&fYData);
 
  132    DeleteMatrix(&fVyyData);
 
  138 TUnfoldSys::TUnfoldSys(
void)
 
  157 TUnfoldSys::TUnfoldSys
 
  158 (
const TH2 *hist_A, EHistMap histmap, ERegMode regmode,EConstraint constraint)
 
  159    : TUnfold(hist_A,histmap,regmode,constraint)
 
  168    fAoutside = 
new TMatrixD(GetNx(),2);
 
  171    fDAinColRelSq = 
new TMatrixD(GetNx(),1);
 
  173    Int_t nmax=GetNx()*GetNy();
 
  174    Int_t *rowDAinRelSq = 
new Int_t[nmax];
 
  175    Int_t *colDAinRelSq = 
new Int_t[nmax];
 
  176    Double_t *dataDAinRelSq = 
new Double_t[nmax];
 
  179    for (Int_t ix = 0; ix < GetNx(); ix++) {
 
  180       Int_t ibinx = fXToHist[ix];
 
  181       Double_t sum_sq= fSumOverY[ix]*fSumOverY[ix];
 
  182       for (Int_t ibiny = 0; ibiny <= GetNy()+1; ibiny++) {
 
  184          if (histmap == kHistMapOutputHoriz) {
 
  185             dz = hist_A->GetBinError(ibinx, ibiny);
 
  187             dz = hist_A->GetBinError(ibiny, ibinx);
 
  189          Double_t normerr_sq=dz*dz/sum_sq;
 
  192          (*fDAinColRelSq)(ix,0) += normerr_sq;
 
  196             if (histmap == kHistMapOutputHoriz) {
 
  197                (*fAoutside)(ix,0)=hist_A->GetBinContent(ibinx, ibiny);
 
  199                (*fAoutside)(ix,0)=hist_A->GetBinContent(ibiny, ibinx);
 
  201          } 
else if(ibiny==GetNy()+1) {
 
  203             if (histmap == kHistMapOutputHoriz) {
 
  204                (*fAoutside)(ix,1)=hist_A->GetBinContent(ibinx, ibiny);
 
  206                (*fAoutside)(ix,1)=hist_A->GetBinContent(ibiny, ibinx);
 
  210             rowDAinRelSq[da_nonzero]=ibiny-1;
 
  211             colDAinRelSq[da_nonzero] = ix;
 
  212             dataDAinRelSq[da_nonzero] = normerr_sq;
 
  213             if(dataDAinRelSq[da_nonzero]>0.0) da_nonzero++;
 
  218       fDAinRelSq = CreateSparseMatrix(GetNy(),GetNx(),da_nonzero,
 
  219                                       rowDAinRelSq,colDAinRelSq,dataDAinRelSq);
 
  221       DeleteMatrix(&fDAinColRelSq);
 
  223    delete[] rowDAinRelSq;
 
  224    delete[] colDAinRelSq;
 
  225    delete[] dataDAinRelSq;
 
  247 void TUnfoldSys::AddSysError
 
  248 (
const TH2 *sysError,
const char *name,EHistMap histmap,ESysErrMode mode)
 
  251    if(fSysIn->FindObject(name)) {
 
  252       Error(
"AddSysError",
"Source %s given twice, ignoring 2nd call.\n",name);
 
  260       Int_t nmax= GetNx()*GetNy();
 
  261       Double_t *data=
new Double_t[nmax];
 
  262       Int_t *cols=
new Int_t[nmax];
 
  263       Int_t *rows=
new Int_t[nmax];
 
  265       for (Int_t ix = 0; ix < GetNx(); ix++) {
 
  266          Int_t ibinx = fXToHist[ix];
 
  268          for(Int_t loop=0;loop<2;loop++) {
 
  269             for (Int_t ibiny = 0; ibiny <= GetNy()+1; ibiny++) {
 
  272                if (histmap == kHistMapOutputHoriz) {
 
  273                   z = sysError->GetBinContent(ibinx, ibiny);
 
  275                   z = sysError->GetBinContent(ibiny, ibinx);
 
  278                if(mode!=kSysErrModeMatrix) {
 
  280                   if((ibiny>0)&&(ibiny<=GetNy())) {
 
  281                      z0=aCopy(ibiny-1,ix)*fSumOverY[ix];
 
  282                   } 
else if(ibiny==0) {
 
  283                      z0=(*fAoutside)(ix,0);
 
  285                      z0=(*fAoutside)(ix,1);
 
  287                   if(mode==kSysErrModeShift) {
 
  289                   } 
else if(mode==kSysErrModeRelative) {
 
  297                   if((ibiny>0)&&(ibiny<=GetNy())) {
 
  303                         data[nmax]=z/sum-aCopy(ibiny-1,ix);
 
  307                      if(data[nmax] != 0.0) nmax++;
 
  315                "source %s has no influence and has not been added.\n",name);
 
  317          TMatrixDSparse *dsys=CreateSparseMatrix(GetNy(),GetNx(),
 
  318                                                  nmax,rows,cols,data);
 
  319          fSysIn->Add(
new TObjString(name),dsys);
 
  333 void TUnfoldSys::DoBackgroundSubtraction(
void)
 
  342       if(fBgrIn->GetEntries()<=0) {
 
  344          fY=
new TMatrixD(*fYData);
 
  345          fVyy=
new TMatrixDSparse(*fVyyData);
 
  348             Warning(
"DoBackgroundSubtraction",
 
  349                     "inverse error matrix from user input," 
  350                     " not corrected for background");
 
  353          fY=
new TMatrixD(*fYData);
 
  357             TMapIter bgrPtr(fBgrIn);
 
  358             for(key=bgrPtr.Next();key;key=bgrPtr.Next()) {
 
  359                const TMatrixD *bgr=(
const TMatrixD *)((
const TPair *)*bgrPtr)->Value();
 
  360                for(Int_t i=0;i<GetNy();i++) {
 
  361                   (*fY)(i,0) -= (*bgr)(i,0);
 
  366          TMatrixD vyy(*fVyyData);
 
  368          Int_t ny=fVyyData->GetNrows();
 
  369          const Int_t *vyydata_rows=fVyyData->GetRowIndexArray();
 
  370          const Int_t *vyydata_cols=fVyyData->GetColIndexArray();
 
  371          const Double_t *vyydata_data=fVyyData->GetMatrixArray();
 
  372          Int_t *usedBin=
new Int_t[ny];
 
  373          for(Int_t i=0;i<ny;i++) {
 
  376          for(Int_t i=0;i<ny;i++) {
 
  377             for(Int_t k=vyydata_rows[i];k<vyydata_rows[i+1];k++) {
 
  378                if(vyydata_data[k]>0.0) {
 
  380                   usedBin[vyydata_cols[k]]++;
 
  386             TMapIter bgrErrUncorrSqPtr(fBgrErrUncorrInSq);
 
  387             for(key=bgrErrUncorrSqPtr.Next();key;
 
  388                 key=bgrErrUncorrSqPtr.Next()) {
 
  389                const TMatrixD *bgrerruncorrSquared=(TMatrixD 
const *)((
const TPair *)*bgrErrUncorrSqPtr)->Value();
 
  390                for(Int_t yi=0;yi<ny;yi++) {
 
  391                   if(!usedBin[yi]) 
continue;
 
  392                   vyy(yi,yi) +=(*bgrerruncorrSquared)(yi,0);
 
  398             TMapIter bgrErrScalePtr(fBgrErrScaleIn);
 
  399             for(key=bgrErrScalePtr.Next();key;key=bgrErrScalePtr.Next()) {
 
  400                const TMatrixD *bgrerrscale=(
const TMatrixD *)((
const TPair *)*bgrErrScalePtr)->Value();
 
  401                for(Int_t yi=0;yi<ny;yi++) {
 
  402                   if(!usedBin[yi]) 
continue;
 
  403                   for(Int_t yj=0;yj<ny;yj++) {
 
  404                      if(!usedBin[yj]) 
continue;
 
  405                      vyy(yi,yj) +=(*bgrerrscale)(yi,0)* (*bgrerrscale)(yj,0);
 
  414          fVyy=
new TMatrixDSparse(vyy);
 
  418       Fatal(
"DoBackgroundSubtraction",
"No input vector defined");
 
  444 Int_t TUnfoldSys::SetInput(
const TH1 *hist_y,Double_t scaleBias,
 
  445                               Double_t oneOverZeroError,
const TH2 *hist_vyy,
 
  446                               const TH2 *hist_vyy_inv)
 
  449    Int_t r=TUnfold::SetInput(hist_y,scaleBias,oneOverZeroError,hist_vyy,
 
  455    DoBackgroundSubtraction();
 
  482 void TUnfoldSys::SubtractBackground
 
  483 (
const TH1 *bgr,
const char *name,Double_t scale,Double_t scale_error)
 
  487    if(fBgrIn->FindObject(name)) {
 
  488       Error(
"SubtractBackground",
"Source %s given twice, ignoring 2nd call.\n",
 
  491       TMatrixD *bgrScaled=
new TMatrixD(GetNy(),1);
 
  492       TMatrixD *bgrErrUncSq=
new TMatrixD(GetNy(),1);
 
  493       TMatrixD *bgrErrCorr=
new TMatrixD(GetNy(),1);
 
  494       for(Int_t row=0;row<GetNy();row++) {
 
  495          (*bgrScaled)(row,0) = scale*bgr->GetBinContent(row+1);
 
  496          (*bgrErrUncSq)(row,0) =
 
  497             TMath::Power(scale*bgr->GetBinError(row+1),2.);
 
  498          (*bgrErrCorr)(row,0) = scale_error*bgr->GetBinContent(row+1);
 
  500       fBgrIn->Add(
new TObjString(name),bgrScaled);
 
  501       fBgrErrUncorrInSq->Add(
new TObjString(name),bgrErrUncSq);
 
  502       fBgrErrScaleIn->Add(
new TObjString(name),bgrErrCorr);
 
  504          DoBackgroundSubtraction();
 
  506          Info(
"SubtractBackground",
 
  507               "Background subtraction prior to setting input data");
 
  529 void TUnfoldSys::GetBackground
 
  530 (TH1 *bgrHist,
const char *bgrSource,
const Int_t *binMap,
 
  531  Int_t includeError,Bool_t clearHist)
 const 
  534        ClearHistogram(bgrHist);
 
  539       TMapIter bgrPtr(fBgrIn);
 
  540       for(key=bgrPtr.Next();key;key=bgrPtr.Next()) {
 
  541          TString bgrName=((
const TObjString *)key)->GetString();
 
  542          if(bgrSource && bgrName.CompareTo(bgrSource)) 
continue;
 
  543          const TMatrixD *bgr=(
const TMatrixD *)((
const TPair *)*bgrPtr)->Value();
 
  544          for(Int_t i=0;i<GetNy();i++) {
 
  545             Int_t destBin=binMap[i];
 
  546             bgrHist->SetBinContent(destBin,bgrHist->GetBinContent(destBin)+
 
  552    if(includeError &1) {
 
  553       TMapIter bgrErrUncorrSqPtr(fBgrErrUncorrInSq);
 
  554       for(key=bgrErrUncorrSqPtr.Next();key;key=bgrErrUncorrSqPtr.Next()) {
 
  555          TString bgrName=((
const TObjString *)key)->GetString();
 
  556          if(bgrSource && bgrName.CompareTo(bgrSource)) 
continue;
 
  557          const TMatrixD *bgrerruncorrSquared=(TMatrixD 
const *)
 
  558             ((
const TPair *)*bgrErrUncorrSqPtr)->Value();
 
  559          for(Int_t i=0;i<GetNy();i++) {
 
  560             Int_t destBin=binMap[i];
 
  563                 ((*bgrerruncorrSquared)(i,0)+
 
  564                  TMath::Power(bgrHist->GetBinError(destBin),2.)));
 
  568    if(includeError & 2) {
 
  569       TMapIter bgrErrScalePtr(fBgrErrScaleIn);
 
  570       for(key=bgrErrScalePtr.Next();key;key=bgrErrScalePtr.Next()) {
 
  571          TString bgrName=((
const TObjString *)key)->GetString();
 
  572          if(bgrSource && bgrName.CompareTo(bgrSource)) 
continue;
 
  573          const TMatrixD *bgrerrscale=(TMatrixD 
const *)((
const TPair *)*bgrErrScalePtr)->Value();
 
  574          for(Int_t i=0;i<GetNy();i++) {
 
  575             Int_t destBin=binMap[i];
 
  576             bgrHist->SetBinError(destBin,hypot((*bgrerrscale)(i,0),
 
  577                                                bgrHist->GetBinError(destBin)));
 
  586 void TUnfoldSys::InitTUnfoldSys(
void)
 
  593    fBgrErrUncorrInSq = 
new TMap();
 
  594    fBgrErrScaleIn = 
new TMap();
 
  596    fBgrIn->SetOwnerKeyValue();
 
  597    fBgrErrUncorrInSq->SetOwnerKeyValue();
 
  598    fBgrErrScaleIn->SetOwnerKeyValue();
 
  599    fSysIn->SetOwnerKeyValue();
 
  603    fDeltaCorrX = 
new TMap();
 
  604    fDeltaCorrAx = 
new TMap();
 
  605    fDeltaCorrX->SetOwnerKeyValue();
 
  606    fDeltaCorrAx->SetOwnerKeyValue();
 
  616 void TUnfoldSys::ClearResults(
void)
 
  618    TUnfold::ClearResults();
 
  619    DeleteMatrix(&fEmatUncorrX);
 
  620    DeleteMatrix(&fEmatUncorrAx);
 
  621    fDeltaCorrX->Clear();
 
  622    fDeltaCorrAx->Clear();
 
  623    DeleteMatrix(&fDeltaSysTau);
 
  632 void TUnfoldSys::PrepareSysError(
void)
 
  635       fEmatUncorrX=PrepareUncorrEmat(GetDXDAM(0),GetDXDAM(1));
 
  637    TMatrixDSparse *AM0=0,*AM1=0;
 
  639       if(!AM0) AM0=MultiplyMSparseMSparse(fA,GetDXDAM(0));
 
  641          AM1=MultiplyMSparseMSparse(fA,GetDXDAM(1));
 
  642          Int_t *rows_cols=
new Int_t[GetNy()];
 
  643          Double_t *data=
new Double_t[GetNy()];
 
  644          for(Int_t i=0;i<GetNy();i++) {
 
  648          TMatrixDSparse *one=CreateSparseMatrix
 
  649             (GetNy(),GetNy(),GetNy(),rows_cols, rows_cols,data);
 
  652          AddMSparse(AM1,-1.,one);
 
  654          fEmatUncorrAx=PrepareUncorrEmat(AM0,AM1);
 
  657    if((!fDeltaSysTau )&&(fDtau>0.0)) {
 
  658       fDeltaSysTau=
new TMatrixDSparse(*GetDXDtauSquared());
 
  659       Double_t scale=2.*TMath::Sqrt(fTauSquared)*fDtau;
 
  660       Int_t n=fDeltaSysTau->GetRowIndexArray() [fDeltaSysTau->GetNrows()];
 
  661       Double_t *data=fDeltaSysTau->GetMatrixArray();
 
  662       for(Int_t i=0;i<n;i++) {
 
  667    TMapIter sysErrIn(fSysIn);
 
  668    const TObjString *key;
 
  671    for(key=(
const TObjString *)sysErrIn.Next();key;
 
  672        key=(
const TObjString *)sysErrIn.Next()) {
 
  673       const TMatrixDSparse *dsys=
 
  674          (
const TMatrixDSparse *)((
const TPair *)*sysErrIn)->Value();
 
  675       const TPair *named_emat=(
const TPair *)
 
  676          fDeltaCorrX->FindObject(key->GetString());
 
  678          TMatrixDSparse *emat=PrepareCorrEmat(GetDXDAM(0),GetDXDAM(1),dsys);
 
  679          fDeltaCorrX->Add(
new TObjString(*key),emat);
 
  681       named_emat=(
const TPair *)fDeltaCorrAx->FindObject(key->GetString());
 
  683          if(!AM0) AM0=MultiplyMSparseMSparse(fA,GetDXDAM(0));
 
  685             AM1=MultiplyMSparseMSparse(fA,GetDXDAM(1));
 
  686             Int_t *rows_cols=
new Int_t[GetNy()];
 
  687             Double_t *data=
new Double_t[GetNy()];
 
  688             for(Int_t i=0;i<GetNy();i++) {
 
  692             TMatrixDSparse *one=CreateSparseMatrix
 
  693                (GetNy(),GetNy(),GetNy(),rows_cols, rows_cols,data);
 
  696             AddMSparse(AM1,-1.,one);
 
  698             fEmatUncorrAx=PrepareUncorrEmat(AM0,AM1);
 
  700          TMatrixDSparse *emat=PrepareCorrEmat(AM0,AM1,dsys);
 
  701          fDeltaCorrAx->Add(
new TObjString(*key),emat);
 
  730 void TUnfoldSys::GetEmatrixSysUncorr
 
  731 (TH2 *ematrix,
const Int_t *binMap,Bool_t clearEmat)
 
  734    ErrorMatrixToHist(ematrix,fEmatUncorrX,binMap,clearEmat);
 
  837 TMatrixDSparse *TUnfoldSys::PrepareUncorrEmat
 
  838 (
const TMatrixDSparse *m_0,
const TMatrixDSparse *m_1)
 
  845    if(fDAinColRelSq && fDAinRelSq) {
 
  847       TMatrixDSparse *M1A_Z1=MultiplyMSparseMSparse(m_1,fA);
 
  848       ScaleColumnsByVector(M1A_Z1,GetDXDAZ(1));
 
  849       TMatrixDSparse *M1Rsq_Z1=MultiplyMSparseMSparse(m_1,fDAinRelSq);
 
  850       ScaleColumnsByVector(M1Rsq_Z1,GetDXDAZ(1));
 
  852       TMatrixDSparse *AtZ0 = MultiplyMSparseTranspMSparse(fA,GetDXDAZ(0));
 
  853       TMatrixDSparse *RsqZ0=
 
  854          MultiplyMSparseTranspMSparse(fDAinRelSq,GetDXDAZ(0));
 
  857       TMatrixDSparse *F=
new TMatrixDSparse(*m_0);
 
  858       ScaleColumnsByVector(F,AtZ0);
 
  859       AddMSparse(F,-1.0,M1A_Z1);
 
  862       TMatrixDSparse *G=
new TMatrixDSparse(*m_0);
 
  863       ScaleColumnsByVector(G,RsqZ0);
 
  864       AddMSparse(G,-1.0,M1Rsq_Z1);
 
  865       DeleteMatrix(&M1A_Z1);
 
  866       DeleteMatrix(&M1Rsq_Z1);
 
  868       DeleteMatrix(&RsqZ0);
 
  870       r=MultiplyMSparseMSparseTranspVector(F,F,fDAinColRelSq);
 
  872       TMatrixDSparse *r1=MultiplyMSparseMSparseTranspVector(F,G,0);
 
  874       TMatrixDSparse *r2=MultiplyMSparseMSparseTranspVector(G,F,0);
 
  876       AddMSparse(r,-1.0,r1);
 
  877       AddMSparse(r,-1.0,r2);
 
  889       TMatrixDSparse Z0sq(*GetDXDAZ(0));
 
  890       const Int_t *Z0sq_rows=Z0sq.GetRowIndexArray();
 
  891       Double_t *Z0sq_data=Z0sq.GetMatrixArray();
 
  892       for(
int index=0;index<Z0sq_rows[Z0sq.GetNrows()];index++) {
 
  893          Z0sq_data[index] *= Z0sq_data[index];
 
  896       TMatrixDSparse *Z0sqRsq=MultiplyMSparseTranspMSparse(fDAinRelSq,&Z0sq);
 
  898       TMatrixDSparse *r3=MultiplyMSparseMSparseTranspVector(m_0,m_0,Z0sqRsq);
 
  899       DeleteMatrix(&Z0sqRsq);
 
  902       TMatrixDSparse Z1sq(*GetDXDAZ(1));
 
  903       const Int_t *Z1sq_rows=Z1sq.GetRowIndexArray();
 
  904       Double_t *Z1sq_data=Z1sq.GetMatrixArray();
 
  905       for(
int index=0;index<Z1sq_rows[Z1sq.GetNrows()];index++) {
 
  906          Z1sq_data[index] *= Z1sq_data[index];
 
  909       TMatrixDSparse *Z1sqRsq=MultiplyMSparseMSparse(fDAinRelSq,&Z1sq);
 
  911       TMatrixDSparse *r4=MultiplyMSparseMSparseTranspVector(m_1,m_1,Z1sqRsq);
 
  912       DeleteMatrix(&Z1sqRsq);
 
  915       TMatrixDSparse *H=MultiplyMSparseMSparseTranspVector
 
  916          (m_0,fDAinRelSq,GetDXDAZ(1));
 
  918       ScaleColumnsByVector(H,GetDXDAZ(0));
 
  920       TMatrixDSparse *r5=MultiplyMSparseMSparseTranspVector(m_1,H,0);
 
  922       TMatrixDSparse *r6=MultiplyMSparseMSparseTranspVector(H,m_1,0);
 
  926          AddMSparse(r,1.0,r3);
 
  932       AddMSparse(r,1.0,r4);
 
  933       AddMSparse(r,-1.0,r5);
 
  934       AddMSparse(r,-1.0,r6);
 
  958 TMatrixDSparse *TUnfoldSys::PrepareCorrEmat
 
  959 (
const TMatrixDSparse *m1,
const TMatrixDSparse *m2,
const TMatrixDSparse *dsys)
 
  961    TMatrixDSparse *dsysT_VYAx = MultiplyMSparseTranspMSparse(dsys,GetDXDAZ(0));
 
  962    TMatrixDSparse *delta =  MultiplyMSparseMSparse(m1,dsysT_VYAx);
 
  963    DeleteMatrix(&dsysT_VYAx);
 
  964    TMatrixDSparse *dsys_X = MultiplyMSparseMSparse(dsys,GetDXDAZ(1));
 
  965    TMatrixDSparse *delta2 = MultiplyMSparseMSparse(m2,dsys_X);
 
  966    DeleteMatrix(&dsys_X);
 
  967    AddMSparse(delta,-1.0,delta2);
 
  968    DeleteMatrix(&delta2);
 
  979 void TUnfoldSys::SetTauError(Double_t delta_tau)
 
  982    DeleteMatrix(&fDeltaSysTau);
 
  999 Bool_t TUnfoldSys::GetDeltaSysSource(TH1 *hist_delta,
const char *name,
 
 1000                                    const Int_t *binMap)
 
 1003    const TPair *named_emat=(
const TPair *)fDeltaCorrX->FindObject(name);
 
 1004    const TMatrixDSparse *delta=0;
 
 1006       delta=(TMatrixDSparse *)named_emat->Value();
 
 1008    VectorMapToHist(hist_delta,delta,binMap);
 
 1026 Bool_t TUnfoldSys::GetDeltaSysBackgroundScale
 
 1027 (TH1 *hist_delta,
const char *source,
const Int_t *binMap)
 
 1030    const TPair *named_err=(
const TPair *)fBgrErrScaleIn->FindObject(source);
 
 1031    TMatrixDSparse *dx=0;
 
 1033       const TMatrixD *dy=(TMatrixD *)named_err->Value();
 
 1034       dx=MultiplyMSparseM(GetDXDY(),dy);
 
 1036    VectorMapToHist(hist_delta,dx,binMap);
 
 1062 Bool_t TUnfoldSys::GetDeltaSysTau(TH1 *hist_delta,
const Int_t *binMap)
 
 1065    VectorMapToHist(hist_delta,fDeltaSysTau,binMap);
 
 1066    return fDeltaSysTau !=0;
 
 1086 void TUnfoldSys::GetEmatrixSysSource
 
 1087 (TH2 *ematrix,
const char *name,
const Int_t *binMap,Bool_t clearEmat)
 
 1090    const TPair *named_emat=(
const TPair *)fDeltaCorrX->FindObject(name);
 
 1091    TMatrixDSparse *emat=0;
 
 1093       const TMatrixDSparse *delta=(TMatrixDSparse *)named_emat->Value();
 
 1094       emat=MultiplyMSparseMSparseTranspVector(delta,delta,0);
 
 1096    ErrorMatrixToHist(ematrix,emat,binMap,clearEmat);
 
 1097    DeleteMatrix(&emat);
 
 1117 void TUnfoldSys::GetEmatrixSysBackgroundScale
 
 1118 (TH2 *ematrix,
const char *name,
const Int_t *binMap,Bool_t clearEmat)
 
 1121    const TPair *named_err=(
const TPair *)fBgrErrScaleIn->FindObject(name);
 
 1122    TMatrixDSparse *emat=0;
 
 1124       const TMatrixD *dy=(TMatrixD *)named_err->Value();
 
 1125       TMatrixDSparse *dx=MultiplyMSparseM(GetDXDY(),dy);
 
 1126       emat=MultiplyMSparseMSparseTranspVector(dx,dx,0);
 
 1129    ErrorMatrixToHist(ematrix,emat,binMap,clearEmat);
 
 1130    DeleteMatrix(&emat);
 
 1154 void TUnfoldSys::GetEmatrixSysTau
 
 1155 (TH2 *ematrix,
const Int_t *binMap,Bool_t clearEmat)
 
 1158    TMatrixDSparse *emat=0;
 
 1160       emat=MultiplyMSparseMSparseTranspVector(fDeltaSysTau,fDeltaSysTau,0);
 
 1162    ErrorMatrixToHist(ematrix,emat,binMap,clearEmat);
 
 1163    DeleteMatrix(&emat);
 
 1181 void TUnfoldSys::GetEmatrixInput
 
 1182 (TH2 *ematrix,
const Int_t *binMap,Bool_t clearEmat)
 
 1184    GetEmatrixFromVyy(fVyyData,ematrix,binMap,clearEmat);
 
 1203 void TUnfoldSys::GetEmatrixSysBackgroundUncorr
 
 1204 (TH2 *ematrix,
const char *source,
const Int_t *binMap,Bool_t clearEmat)
 
 1206    const TPair *named_err=(
const TPair *)fBgrErrUncorrInSq->FindObject(source);
 
 1207    TMatrixDSparse *emat=0;
 
 1209       TMatrixD 
const *dySquared=(TMatrixD 
const *)named_err->Value();
 
 1210       emat=MultiplyMSparseMSparseTranspVector(GetDXDY(),GetDXDY(),dySquared);
 
 1212    ErrorMatrixToHist(ematrix,emat,binMap,clearEmat);
 
 1213    DeleteMatrix(&emat);
 
 1231 void TUnfoldSys::GetEmatrixFromVyy
 
 1232 (
const TMatrixDSparse *vyy,TH2 *ematrix,
const Int_t *binMap,Bool_t clearEmat)
 
 1235    TMatrixDSparse *em=0;
 
 1237       TMatrixDSparse *dxdyVyy=MultiplyMSparseMSparse(GetDXDY(),vyy);
 
 1238       em=MultiplyMSparseMSparseTranspVector(dxdyVyy,GetDXDY(),0);
 
 1239       DeleteMatrix(&dxdyVyy);
 
 1241    ErrorMatrixToHist(ematrix,em,binMap,clearEmat);
 
 1257 void TUnfoldSys::GetEmatrixTotal(TH2 *ematrix,
const Int_t *binMap)
 
 1259    GetEmatrix(ematrix,binMap);  
 
 1260    GetEmatrixSysUncorr(ematrix,binMap,kFALSE); 
 
 1261    TMapIter sysErrPtr(fDeltaCorrX);
 
 1264    for(key=sysErrPtr.Next();key;key=sysErrPtr.Next()) {
 
 1265       GetEmatrixSysSource(ematrix,
 
 1266                           ((
const TObjString *)key)->GetString(),
 
 1269    GetEmatrixSysTau(ematrix,binMap,kFALSE); 
 
 1275 TMatrixDSparse *TUnfoldSys::GetSummedErrorMatrixYY(
void)
 
 1280    TMatrixDSparse *emat_sum=
new TMatrixDSparse(*fVyy);
 
 1284       AddMSparse(emat_sum,1.0,fEmatUncorrAx);
 
 1286    TMapIter sysErrPtr(fDeltaCorrAx);
 
 1290    for(key=sysErrPtr.Next();key;key=sysErrPtr.Next()) {
 
 1291       const TMatrixDSparse *delta=(TMatrixDSparse *)((
const TPair *)*sysErrPtr)->Value();
 
 1292       TMatrixDSparse *emat=MultiplyMSparseMSparseTranspVector(delta,delta,0);
 
 1293       AddMSparse(emat_sum,1.0,emat);
 
 1294       DeleteMatrix(&emat);
 
 1298       TMatrixDSparse *Adx_tau=MultiplyMSparseMSparse(fA,fDeltaSysTau);
 
 1299       TMatrixDSparse *emat_tau=
 
 1300          MultiplyMSparseMSparseTranspVector(Adx_tau,Adx_tau,0);
 
 1301       DeleteMatrix(&Adx_tau);
 
 1302       AddMSparse(emat_sum,1.0,emat_tau);
 
 1303       DeleteMatrix(&emat_tau);
 
 1311 TMatrixDSparse *TUnfoldSys::GetSummedErrorMatrixXX(
void)
 
 1316    TMatrixDSparse *emat_sum=
new TMatrixDSparse(*GetVxx());
 
 1320       AddMSparse(emat_sum,1.0,fEmatUncorrX);
 
 1322    TMapIter sysErrPtr(fDeltaCorrX);
 
 1326    for(key=sysErrPtr.Next();key;key=sysErrPtr.Next()) {
 
 1327       const TMatrixDSparse *delta=(TMatrixDSparse *)((
const TPair *)*sysErrPtr)->Value();
 
 1328       TMatrixDSparse *emat=MultiplyMSparseMSparseTranspVector(delta,delta,0);
 
 1329       AddMSparse(emat_sum,1.0,emat);
 
 1330       DeleteMatrix(&emat);
 
 1334       TMatrixDSparse *emat_tau=
 
 1335          MultiplyMSparseMSparseTranspVector(fDeltaSysTau,fDeltaSysTau,0);
 
 1336       AddMSparse(emat_sum,1.0,emat_tau);
 
 1337       DeleteMatrix(&emat_tau);
 
 1346 Double_t TUnfoldSys::GetChi2Sys(
void)
 
 1349    TMatrixDSparse *emat_sum=GetSummedErrorMatrixYY();
 
 1352    TMatrixDSparse *v=InvertMSparseSymmPos(emat_sum,&rank);
 
 1353    TMatrixD dy(*fY, TMatrixD::kMinus, *GetAx());
 
 1354    TMatrixDSparse *vdy=MultiplyMSparseM(v,&dy);
 
 1357    const Int_t *vdy_rows=vdy->GetRowIndexArray();
 
 1358    const Double_t *vdy_data=vdy->GetMatrixArray();
 
 1359    for(Int_t i=0;i<vdy->GetNrows();i++) {
 
 1360       if(vdy_rows[i+1]>vdy_rows[i]) {
 
 1361          r += vdy_data[vdy_rows[i]] * dy(i,0);
 
 1365    DeleteMatrix(&emat_sum);
 
 1389 void TUnfoldSys::GetRhoItotal(TH1 *rhoi,
const Int_t *binMap,TH2 *invEmat)
 
 1391    ClearHistogram(rhoi,-1.);
 
 1392    TMatrixDSparse *emat_sum=GetSummedErrorMatrixXX();
 
 1393    GetRhoIFromMatrix(rhoi,emat_sum,binMap,invEmat);
 
 1395    DeleteMatrix(&emat_sum);
 
 1411 void TUnfoldSys::ScaleColumnsByVector
 
 1412 (TMatrixDSparse *m,
const TMatrixTBase<Double_t> *v)
 const 
 1414    if((m->GetNcols() != v->GetNrows())||(v->GetNcols()!=1)) {
 
 1415       Fatal(
"ScaleColumnsByVector error",
 
 1416             "matrix cols/vector rows %d!=%d OR vector cols %d !=1\n",
 
 1417             m->GetNcols(),v->GetNrows(),v->GetNcols());
 
 1419    const Int_t *rows_m=m->GetRowIndexArray();
 
 1420    const Int_t *cols_m=m->GetColIndexArray();
 
 1421    Double_t *data_m=m->GetMatrixArray();
 
 1422    const TMatrixDSparse *v_sparse=
dynamic_cast<const TMatrixDSparse *
>(v);
 
 1424       const Int_t *rows_v=v_sparse->GetRowIndexArray();
 
 1425       const Double_t *data_v=v_sparse->GetMatrixArray();
 
 1426       for(Int_t i=0;i<m->GetNrows();i++) {
 
 1427          for(Int_t index_m=rows_m[i];index_m<rows_m[i+1];index_m++) {
 
 1428             Int_t j=cols_m[index_m];
 
 1429             Int_t index_v=rows_v[j];
 
 1430             if(index_v<rows_v[j+1]) {
 
 1431                data_m[index_m] *= data_v[index_v];
 
 1433                data_m[index_m] =0.0;
 
 1438       for(Int_t i=0;i<m->GetNrows();i++) {
 
 1439          for(Int_t index_m=rows_m[i];index_m<rows_m[i+1];index_m++) {
 
 1440             Int_t j=cols_m[index_m];
 
 1441             data_m[index_m] *= (*v)(j,0);
 
 1464 void TUnfoldSys::VectorMapToHist
 
 1465 (TH1 *hist_delta,
const TMatrixDSparse *delta,
const Int_t *binMap)
 
 1467    Int_t nbin=hist_delta->GetNbinsX();
 
 1468    Double_t *c=
new Double_t[nbin+2];
 
 1469    for(Int_t i=0;i<nbin+2;i++) {
 
 1473       Int_t binMapSize = fHistToX.GetSize();
 
 1474       const Double_t *delta_data=delta->GetMatrixArray();
 
 1475       const Int_t *delta_rows=delta->GetRowIndexArray();
 
 1476       for(Int_t i=0;i<binMapSize;i++) {
 
 1477          Int_t destBinI=binMap ? binMap[i] : i;
 
 1478          Int_t srcBinI=fHistToX[i];
 
 1479          if((destBinI>=0)&&(destBinI<nbin+2)&&(srcBinI>=0)) {
 
 1480             Int_t index=delta_rows[srcBinI];
 
 1481             if(index<delta_rows[srcBinI+1]) {
 
 1482                c[destBinI]+=delta_data[index];
 
 1487    for(Int_t i=0;i<nbin+2;i++) {
 
 1488       hist_delta->SetBinContent(i,c[i]);
 
 1489       hist_delta->SetBinError(i,0.0);
 
 1500 TSortedList *TUnfoldSys::GetSysSources(
void)
 const {
 
 1501    TSortedList *r=
new TSortedList();
 
 1503    for(
const TObject *key=i.Next();key;key=i.Next()) {
 
 1504       r->Add(((TObjString *)key)->Clone());
 
 1515 TSortedList *TUnfoldSys::GetBgrSources(
void)
 const {
 
 1516    TSortedList *r=
new TSortedList();
 
 1518    for(
const TObject *key=i.Next();key;key=i.Next()) {
 
 1519       r->Add(((TObjString *)key)->Clone());