TMatrixD get_corr_matr(const TMatrixD matr_cov) { TMatrixD matr = matr_cov; matr.Zero(); Int_t n_rows = matr.GetNrows(); for (Int_t ii = 0; ii < n_rows; ii++) { for (Int_t jj = 0; jj < n_rows; jj++) { matr(ii,jj) = matr_cov(ii,jj) / ( sqrt(matr_cov(ii,ii)) * sqrt(matr_cov(jj,jj)) ); } } return matr; } // =========================================== void test_2(){ double fitpar[3] = {3.036010, 2.905944, 5.582753}; double errpar[3] = {0.376452, 0.157458, 1.068356}; double cov[9] = {0.141846, -0.011840, -0.144900, -0.011840, 0.024803, 0.158485, -0.144900, 0.158485, 1.143070}; int npar=3; matr_cov = TMatrixD(npar,npar,cov); par_orig = TVectorD(npar,fitpar); par_orig_err = TVectorD(npar,errpar); TMatrixD matr_corr = get_corr_matr(matr_cov); int nPar = npar; // calculate the elements of the upper-triangular matrix L // that gives Lt*L = C // where Lt is the transpose of L (the "square-root method") L = TMatrixD(nPar,nPar); for(Int_t iPar= 0; iPar < nPar; iPar++) { // calculate the diagonal term first L(iPar,iPar)= matr_corr(iPar,iPar); //covariance(iPar,iPar); for(Int_t k= 0; k < iPar; k++) { Double_t tmp= L(k,iPar); L(iPar,iPar)-= tmp*tmp; } L(iPar,iPar)= sqrt(L(iPar,iPar)); // then the off-diagonal terms for(Int_t jPar= iPar+1; jPar < nPar; jPar++) { L(iPar,jPar)= matr_corr(iPar,jPar); //covariance(iPar,jPar); for(Int_t k= 0; k < iPar; k++) { L(iPar,jPar)-= L(k,iPar)*L(k,jPar); } L(iPar,jPar)/= L(iPar,iPar); } } // remember Lt //_Lt= TMatrixD(TMatrixD::kTransposed,L); TMatrixD _Lt(TMatrixD::kTransposed,L); //L.Print(); //_Lt.Print(); // create a vector of unit Gaussian variables TVectorD g(nPar); int nrand = 10000; double *mean = new double[npar]; double *rms = new double[npar]; double *newpar = new double[npar*nrand]; double par_val; TRandom coef; //g.Print(); //nrand=1; /* initilize mean and rms */ for(int j=0;jSetPoint(i,newpar[npar*i+0], newpar[npar*i+1]); g2->SetPoint(i,newpar[npar*i+1], newpar[npar*i+2]); g3->SetPoint(i,newpar[npar*i+0], newpar[npar*i+2]); for(int j=0;jFill(newpar[npar*j+0]); h->Draw(); /* print out debuggin lines */ for(int j=0;jGetCorrelationFactor()<< " while it should be "<GetCorrelationFactor()<< " while it should be "<GetCorrelationFactor()<< " while it should be "<