34 int ncols = cov_matrix.GetNcols();
35 int nrows = cov_matrix.GetNrows();
43 for (
int i = 0;
i <
n; ++
i) {
46 L(
i,
i) = cov_matrix(
i,
i);
47 for (
int k = 0; k <
i; ++k) {
53 if(
fabs(
L(i,i)) < epsilon){
56 <<
"Changed element (" << i <<
", " << i <<
") to " <<
L(i,i);
60 <<
"Decomposed covariance matrix not positive-definite";
62 <<
"L(" << i <<
"," << i <<
") = " <<
L(i,i);
68 for (
int j = i+1;
j <
n; ++
j) {
69 L(i,
j) = cov_matrix(i,
j);
70 for (
int k = 0; k <
i; ++k) {
71 L(i,
j) -=
L(k,i)*
L(k,
j);
78 TMatrixD LT(TMatrixD::kTransposed,L);
88 int ncols = cholesky_triangular.GetNcols();
89 int nrows = cholesky_triangular.GetNrows();
90 int npars = mean_params.GetNrows();
94 <<
"Mismatch between number of columns (" << ncols
95 <<
") & rows (" << nrows <<
")";
100 <<
"Mismatch between number of parameters (" << npars
101 <<
") & array size (" << nrows <<
")";
110 for (
int k = 0; k <
n; ++k) {
111 g(k) = RandomGen::Instance()->RndNum().Gaus();
113 g *= cholesky_triangular;
117 for (
int i = 0;
i <
n; ++
i) {
118 double v = mean_params[
i];
120 correlated_params[
i] =
v;
123 return correlated_params;
131 int ncols = cholesky_triangular.GetNcols();
132 int nrows = cholesky_triangular.GetNrows();
133 int npars = mean_params.GetNrows();
134 int nunco = g_uncorrelated.GetNrows();
138 <<
"Mismatch between number of columns (" << ncols
139 <<
") & rows (" << nrows <<
")";
144 <<
"Mismatch between number of parameters (" << npars
145 <<
") & array size (" << nrows <<
")";
150 <<
"Mismatch between size of uncorrelated parameter vector (" << nunco
151 <<
") & array size (" << nrows <<
")";
159 g_uncorrelated *= cholesky_triangular;
163 for (
int i = 0;
i <
n; ++
i) {
164 double v = mean_params[
i];
165 v += g_uncorrelated(
i);
166 correlated_params[
i] =
v;
169 return correlated_params;
173 const TMatrixD& cholesky_triangular)
175 int ncols = cholesky_triangular.GetNcols();
176 int nrows = cholesky_triangular.GetNrows();
185 for (
int k = 0; k <
n; ++k) {
186 g(k) = RandomGen::Instance()->RndNum().Gaus();
188 g *= cholesky_triangular;
196 int ncols = cholesky_triangular.GetNcols();
197 int nrows = cholesky_triangular.GetNrows();
198 int npars = g_uncorrelated.GetNrows();
206 g *= cholesky_triangular;
218 for(
unsigned int i=1;
i<
n;
i++) {
234 for(
unsigned int i=1;
i<x.size();
i++) {
245 double err = 0.001*DBL_EPSILON;
246 double dx = TMath::Abs(x1-x2);
256 float err = FLT_EPSILON;
257 float dx = TMath::Abs(x1-x2);
267 return ( x >= range.
min && x <= range.
max );
272 return ( x >= range.
min && x <= range.
max );
277 return ( i >= range.
min && i <= range.
max );
284 return TMath::Max(0., x);
291 return TMath::Max( (
float)0., x);
A simple [min,max] interval for integers.
fvar< T > fabs(const fvar< T > &x)
bool AreEqual(double x1, double x2)
A simple [min,max] interval for doubles.
Float_t x1[n_points_granero]
TVectorD CholeskyGenerateCorrelatedParams(const TMatrixD &Lch, TVectorD &mean)
bool IsWithinLimits(double x, Range1D_t range)
A simple [min,max] interval for floats.
TVectorD CholeskyCalculateCorrelatedParamVariations(const TMatrixD &Lch, TVectorD &g_uncorrelated)
TMatrixD CholeskyDecomposition(const TMatrixD &cov)
double KahanSummation(double x[], unsigned int n)
#define LOG(stream, priority)
A macro that returns the requested log4cpp::Category appending a string (using the FILE...
static constexpr double L
Var Sqrt(const Var &v)
Use to take sqrt of a var.
assert(nhit_max >=nhit_nbins)
TVectorD CholeskyGenerateCorrelatedParamVariations(const TMatrixD &Lch)
double NonNegative(double x)