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());