const Int_t NEntry = 10000;
const double meanvalue = 1;
const double meanvalue2 = 1;
const double rmsvalue = 0.1;
const double rmsvalue2 = 0.1;
TMatrixD* produceSqrtMat( const TMatrixD& covMat )
{
Double_t sum = 0;
Int_t size = covMat.GetNrows();;
TMatrixD* sqrtMat = new TMatrixD( size, size );
for (Int_t i=0; i< size; i++) {
sum = 0;
for (Int_t j=0;j< i; j++) sum += (*sqrtMat)(i,j) * (*sqrtMat)(i,j);
(*sqrtMat)(i,i) = TMath::Sqrt(TMath::Abs(covMat(i,i) - sum));
for (Int_t k=i+1 ;k<size; k++) {
sum = 0;
for (Int_t l=0; l<i; l++) sum += (*sqrtMat)(k,l) * (*sqrtMat)(i,l);
(*sqrtMat)(k,i) = (covMat(k,i) - sum) / (*sqrtMat)(i,i);
}
}
return sqrtMat;
}
void getGaussRnd( TArrayD& v, const TMatrixD& sqrtMat, TRandom& R )
{
// generate “size” correlated Gaussian random numbers
// sanity check
const Int_t size = sqrtMat.GetNrows();
if (size != v.GetSize())
cout << "<getGaussRnd> too short input vector: " << size << " " << v.GetSize() << endl;
Double_t* tmpVec = new Double_t[size];
for (Int_t i=0; i<size; i++) {
Double_t x, y, z;
y = R.Rndm();
z = R.Rndm();
x = 2*TMath::Pi()*z;
tmpVec[i] = TMath::Sin(x) * TMath::Sqrt(-2.0*TMath::Log(y));
}
for (Int_t i=0; i<size; i++) {
v[i] = 0;
for (Int_t j=0; j<=i; j++) v[i] += sqrtMat(i,j) * tmpVec[j];
}
delete[] tmpVec;
}
void generate_2parameter(){
gROOT->ProcessLine(".x …/rootlogon.C");
ofstream opfile(“data4histogram_2d.txt”);
opfile<<"#entry #value1 #value2"<<endl;
//covariance matrix
TMatrixD* covmatrix = new TMatrixD(2,2);
/*Float_t offaxisVal = 0.45*rmsvalue*rmsvalue2;*/
Float_t offaxisVal = 0.0*rmsvalue*rmsvalue2;
(*covmatrix)(0,0) = rmsvalue*rmsvalue;
(*covmatrix)(1,1) = rmsvalue2*rmsvalue2;
(*covmatrix)(0,1) = offaxisVal*offaxisVal;
(*covmatrix)(1,0) = (*covmatrix)(0,1);
cout << "covariance matrix: " << endl;
covmatrix->Print();
//square-root matrix
TMatrixD* sqrtMatrix = produceSqrtMat( *covmatrix );
cout << "Square root of covariance matrix: " << endl;
sqrtMatrix->Print();
TArrayD* v = new TArrayD( 2 );
Float_t xvar[2];
double_t xS[2] = { meanvalue, meanvalue2 };
//covariance matrix
TRandom R( 100 );
for (Int_t ientry=0; ientry<NEntry; ++ientry) {
getGaussRnd( *v, *sqrtMatrix, R );
for (Int_t ivar=0; ivar<2; ivar++) xvar[ivar] = (*v)[ivar] + xS[ivar];
opfile<<ientry<<" "<<xvar[0]<<" "<<xvar[1]<<endl;
}
opfile.close();
plot_histogram_2d();
}