Conjugate gradient fit.
More...
#include <JGradient.hh>
Conjugate gradient fit.
Definition at line 73 of file JGradient.hh.
JFIT::JGradient::JGradient |
( |
const size_t |
Nmax = std::numeric_limits<size_t>::max() , |
|
|
const size_t |
Nextra = 0 , |
|
|
const double |
epsilon = 1.0e-4 , |
|
|
const int |
debug = 3 |
|
) |
| |
|
inline |
Constructor.
The number of iterations and epsilon refer to the number of steps and the distance to the minimum, respectively.
The number of extra steps can be used to overcome a possible hurdle on the way.
- Parameters
-
Nmax | maximum number of iterations |
Nextra | maximum number of extra steps |
epsilon | epsilon |
debug | debug |
Definition at line 88 of file JGradient.hh.
size_t Nextra
maximum number of extra steps
size_t Nmax
maximum number of iterations
template<class T >
double JFIT::JGradient::operator() |
( |
const T & |
getChi2 | ) |
|
|
inline |
Fit.
The template parameter should provide for the following function operator.
double operator()(int option);
The value of the option corresponds to the following cases.
- 0 => step wise improvement of the chi2;
- 1 => evaluation of the chi2 before the determination of the gradient of the chi2; and
- 2 => evaluation of the derivative of the chi2 to each fit parameter.
- Parameters
-
- Returns
- chi2
Definition at line 115 of file JGradient.hh.
123 return numeric_limits<double>::max();
128 const size_t N = this->size();
133 for (
size_t i = 0;
i !=
N; ++
i) {
152 for (
double ds = 1.0; ds > 1.0e-3; ) {
154 this->
move(+1.0 * ds);
158 DEBUG(
"chi2[3] " << setw(4) << m <<
' ' <<
FIXED(12,5) <<
chi2[3] <<
' ' <<
FIXED(12,5) << ds << endl);
184 for ( ; m != 0; --m) {
185 this->
move(-1.0 * ds);
192 this->
move(-1.0 * ds);
202 const double f21 =
chi2[2] -
chi2[1];
203 const double f23 = chi2[2] - chi2[3];
205 const double xs = 0.5 * (f21 - f23) / (f23 + f21);
207 this->
move(+1.0 * xs * ds);
211 if (chi2[3] < chi2[2]) {
217 this->
move(-1.0 * xs * ds);
232 if (fabs(chi2[2] - chi2[0]) <
epsilon * 0.5 * (fabs(chi2[0]) + fabs(chi2[2]))) {
244 for (
size_t i = 0;
i !=
N; ++
i){
255 for (
size_t i = 0;
i !=
N; ++
i){
257 H[
i] = G[
i] + dgg *
H[
i];
void move(const double factor)
Move.
static const double H
Planck constant [eV s].
Auxiliary data structure for floating point format specification.
size_t Nextra
maximum number of extra steps
std::vector< double > gradient
size_t Nmax
maximum number of iterations
double evaluate(const T &getChi2)
Evaluate gradient.
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
then if[[!-f $DETECTOR]] then JDetector sh $DETECTOR fi cat $WORKDIR trigger_parameters txt<< EOFtrigger3DMuon.enabled=1;trigger3DMuon.numberOfHits=5;trigger3DMuon.gridAngle_deg=1;ctMin=0.0;TMaxLocal_ns=15.0;EOF set_variable TRIGGEREFFICIENCY_TRIGGERED_EVENTS_ONLY INPUT_FILES=() for((i=1;$i<=$NUMBER_OF_RUNS;++i));do JSirene.sh $DETECTOR $JPP_DATA/genhen.km3net_wpd_V2_0.evt.gz $WORKDIR/sirene_ ${i}.root JTriggerEfficiency.sh $DETECTOR $DETECTOR $WORKDIR/sirene_ ${i}.root $WORKDIR/trigger_efficiency_ ${i}.root $WORKDIR/trigger_parameters.txt $JPP_DATA/PMT_parameters.txt INPUT_FILES+=($WORKDIR/trigger_efficiency_ ${i}.root) done for ANGLE_DEG in $ANGLES_DEG[*];do set_variable SIGMA_NS 3.0 set_variable OUTLIERS 3 set_variable OUTPUT_FILE $WORKDIR/matrix\[${ANGLE_DEG}\deg\].root $JPP_DIR/examples/JReconstruction-f"$INPUT_FILES[*]"-o $OUTPUT_FILE-S ${SIGMA_NS}-A ${ANGLE_DEG}-O ${OUTLIERS}-d ${DEBUG}--!fiif[[$OPTION=="plot"]];then if((0));then for H1 in h0 h1;do JPlot1D-f"$WORKDIR/matrix["${^ANGLES_DEG}" deg].root:${H1}"-y"1 2e3"-Y-L TR-T""-\^"number of events [a.u.]"-> o chi2
size_t numberOfIterations
double getChi2(const double P)
Get chi2 corresponding to given probability.
Auxiliary data structure for floating point format specification.
#define DEBUG(A)
Message macros.
template<class T >
double JFIT::JGradient::evaluate |
( |
const T & |
getChi2 | ) |
|
|
inlineprivate |
Evaluate gradient.
- Returns
- chi2
Definition at line 282 of file JGradient.hh.
287 const size_t N = this->size();
299 for (
size_t i = 0;
i !=
N; ++
i) {
300 if ((*
this)[
i].
name.size() > width) {
301 width = (*this)[
i].name.size();
307 for (
size_t i = 0;
i !=
N; ++
i) {
309 if ((*
this)[
i].value != 0.0) {
311 (*this)[
i]->apply(+0.5 * (*
this)[
i].value);
315 (*this)[
i]->apply(-0.5 * (*
this)[
i].value);
316 (*this)[
i]->apply(-0.5 * (*
this)[
i].value);
322 (*this)[
i]->apply(+0.5 * (*
this)[
i].value);
334 DEBUG(setw(width) << left <<
"|gradient|" << right <<
' ' <<
FIXED(12,5) << sqrt(
V) << endl);
Auxiliary data structure for floating point format specification.
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
std::vector< double > gradient
then fatal The output file must have the wildcard in the name
then usage $script< input file >[option[primary[working directory]]] nWhere option can be N
double getChi2(const double P)
Get chi2 corresponding to given probability.
#define DEBUG(A)
Message macros.
void JFIT::JGradient::move |
( |
const double |
factor | ) |
|
|
inlineprivate |
Move.
- Parameters
-
Definition at line 345 of file JGradient.hh.
348 for (
size_t i = 0;
i != this->size(); ++
i) {
349 (*this)[
i ]->apply((*
this)[
i ].value *
gradient[
i ] * factor);
351 }
else if (factor < 0.0) {
352 for (
size_t i = this->size();
i != 0; --
i) {
353 (*this)[
i-1]->apply((*
this)[
i-1].value *
gradient[
i-1] * factor);
std::vector< double > gradient
size_t JFIT::JGradient::Nmax |
size_t JFIT::JGradient::Nextra |
double JFIT::JGradient::epsilon |
int JFIT::JGradient::debug |
size_t JFIT::JGradient::numberOfIterations |
The documentation for this struct was generated from the following file: