89 lines
2.0 KiB
C
89 lines
2.0 KiB
C
|
#pragma once
|
|||
|
|
|||
|
#include <math.h>
|
|||
|
#include <gsl/gsl_vector.h>
|
|||
|
#include <gsl/gsl_matrix.h>
|
|||
|
|
|||
|
/* Structure that holds the θ,φ angles
|
|||
|
* of a single event of the sample.
|
|||
|
*/
|
|||
|
struct event {
|
|||
|
double th;
|
|||
|
double ph;
|
|||
|
};
|
|||
|
|
|||
|
/* Structure that contains the sample events
|
|||
|
* and its size.
|
|||
|
*/
|
|||
|
struct sample {
|
|||
|
const size_t size;
|
|||
|
struct event *events;
|
|||
|
};
|
|||
|
|
|||
|
/* This structure contains the result of a
|
|||
|
* minimisation method: estimated parameters,
|
|||
|
* standard error and their covariance.
|
|||
|
*/
|
|||
|
typedef struct {
|
|||
|
gsl_vector *par;
|
|||
|
gsl_vector *err;
|
|||
|
gsl_matrix *cov;
|
|||
|
} min_result;
|
|||
|
|
|||
|
|
|||
|
/* `vector_fprint(fp, x)` prints to file `fp`
|
|||
|
* the components of a gsl_vector.
|
|||
|
*/
|
|||
|
void vector_fprint(FILE *fp, const gsl_vector *x);
|
|||
|
|
|||
|
|
|||
|
/* `matrix_fprint(fp, x)` prints to file `fp`
|
|||
|
* the components of a gsl_vector.
|
|||
|
*/
|
|||
|
void matrix_fprint(FILE *fp, const gsl_matrix *x);
|
|||
|
|
|||
|
|
|||
|
/* `vector_map(f, v)` applies the function
|
|||
|
* `f` to each element of the vector `v`, inplace.
|
|||
|
* The function return a GSL exit code to either
|
|||
|
* report success or a failure.
|
|||
|
*/
|
|||
|
int vector_map(double (*f)(double x), gsl_vector *v);
|
|||
|
|
|||
|
|
|||
|
/* Angular distribution function F(θ,φ; α,β,γ)
|
|||
|
* Takes three parameters α,β,γ and the angles θ,φ.
|
|||
|
*/
|
|||
|
double distr(const gsl_vector *par,
|
|||
|
const struct event *event);
|
|||
|
|
|||
|
|
|||
|
/* `grad_distr(par, event, grad)`
|
|||
|
* computes the gradient of F(α,β,γ; α,β) as:
|
|||
|
*
|
|||
|
* ⎡ 1/2 - 3/2⋅cos²(θ) ⎤
|
|||
|
* ⎢ ⎥
|
|||
|
* ⎢ sin²(θ)⋅cos(2φ) ⎥ 3/(4π)
|
|||
|
* ⎢ ⎥
|
|||
|
* ⎣ √2⋅sin(2θ)⋅cos(φ) ⎦
|
|||
|
*
|
|||
|
* where `par` is [α,β,γ], `event` is the angle
|
|||
|
* structure. The results is stored in the
|
|||
|
* gsl_vector `grad`
|
|||
|
*/
|
|||
|
void grad_distr(const gsl_vector *par,
|
|||
|
const struct event *event,
|
|||
|
gsl_vector *grad);
|
|||
|
|
|||
|
|
|||
|
/* Test the compatibility between the original
|
|||
|
* parameters `def` and the estimates `est.par`
|
|||
|
* with standard errors `est.err`.
|
|||
|
*/
|
|||
|
void compatibility(gsl_vector *def, min_result est);
|
|||
|
|
|||
|
|
|||
|
/* Free a min_result structure.
|
|||
|
*/
|
|||
|
void min_result_free(min_result x);
|