#include <cmath>
bool debug = false;
struct GausND {
GausND( int dim ) :
{}
int k = 0;
for (
int i = 0; i<dim; ++i) {
X[i] =
x[i] -
p[k]; k++; }
for (int i = 0; i<dim; ++i) {
k++;
}
for (int i = 0; i<dim; ++i) {
for (int j = i+1; j<dim; ++j) {
CovMat(i,j) =
p[k]*
sqrt(CovMat(i,i)*CovMat(j,j));
CovMat(j,i) = CovMat(i,j);
k++;
}
}
if (debug) {
}
if (det <= 0) {
Fatal(
"GausND",
"Determinant is <= 0 det = %f",det);
return 0;
}
double fval = std::exp( - 0.5 * CovMat.
Similarity(
X) )/ norm;
if (debug) {
std::cout << "det " << det << std::endl;
std::cout << "norm " << norm << std::endl;
std::cout << "fval " << fval << std::endl;
}
return fval;
}
};
void multidimSampling() {
const int DIM = 4;
double xmin[] = {-10,-10,-10, -10};
double xmax[] = { 10, 10, 10, 10};
double par0[] = { 1., -1., 2, 0,
1, 2, 1, 3,
0.5,0.,0.,0.,0.,0.8 };
const int NPAR = DIM + DIM*(DIM+1)/2;
GausND gaus4d(4);
TF1 *
f =
new TF1(
"functionND",gaus4d,0,1,14);
double x0[] = {0,0,0,0};
if (debug)
f->EvalPar(x0,
nullptr);
debug = false;
for (int i = 0; i < NPAR; ++i ) {
if (i < DIM)
f->SetParName(i,
name.Format(
"mu_%d",i+1) );
else if (i < 2*DIM)
f->SetParName(i,
name.Format(
"sig_%d",i-DIM+1) );
else if (i < 2*DIM)
f->SetParName(i,
name.Format(
"sig_%d",i-2*DIM+1) );
}
if (sampler == nullptr) {
Info(
"multidimSampling",
"Default sampler %s is not available try with Foam ",
}
sampler = Factory::CreateDistSampler();
if (sampler == nullptr) {
Error(
"multidimSampling",
"Foam sampler is not available - exit ");
return;
}
bool ret = sampler->
Init();
std::vector<double> data1(DIM*
N);
if (!ret) {
Error(
"Sampler::Init",
"Error initializing unuran sampler");
return;
}
for (
int i = 0; i <
N; ++i) {
for (int j = 0; j < DIM; ++j)
}
TFile * file =
new TFile(
"multiDimSampling.root",
"RECREATE");
t1->Branch(
"x",
x,
"x[4]/D");
for (
int i = 0; i <
N; ++i) {
for (int j = 0; j < DIM; ++j) {
}
}
t1->Draw(
"x[0]:x[1]:x[2]:x[3]",
"",
"candle");
int ic=1;
}
void Info(const char *location, const char *msgfmt,...)
Use this function for informational messages.
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
void Fatal(const char *location, const char *msgfmt,...)
Use this function in case of a fatal error. It will abort the program.
winID h TVirtualViewer3D TVirtualGLPainter p
TRObject operator()(const T1 &t1) const
static void SetDefaultSampler(const char *type)
static const std::string & DefaultSampler()
Interface class for generic sampling of a distribution, i.e.
const double * Sample()
Sample one event and return an array x with sample coordinates values.
void SetRange(double xmin, double xmax, int icoord=0)
Set the range in a given dimension.
void SetFunction(Function &func, unsigned int dim)
set the parent function distribution to use for sampling (generic case)
virtual bool Init(const char *="")
Initialize the sampling generator with the given algorithm.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
void Close(Option_t *option="") override
Close a file.
void Print(Option_t *name="") const override
Print the matrix as a table of elements.
TMatrixTSym< Element > & Similarity(const TMatrixT< Element > &n)
Calculate B * (*this) * B^T , final matrix will be (nrowsb x nrowsb) This is a similarity transform w...
Double_t Determinant() const override
TMatrixTSym< Element > & Invert(Double_t *det=nullptr)
Invert the matrix and calculate its determinant Notice that the LU decomposition is used instead of B...
A TTree represents a columnar dataset.
VecExpr< UnaryOp< Sqrt< T >, VecExpr< A, T, D >, T >, T, D > sqrt(const VecExpr< A, T, D > &rhs)