Commit 734f92a6990027811d4bbc4a611420c7d7a408e0

Authored by Jürgen Knödlseder
1 parent fd6a118b

Improve log file output.

src/cterror/cterror.cpp
... ... @@ -227,6 +227,12 @@ void cterror::run(void)
227 227 log << m_obs << std::endl;
228 228 }
229 229  
  230 + // Write header
  231 + if (logTerse()) {
  232 + log << std::endl;
  233 + log.header1("Compute best-fit likelihood");
  234 + }
  235 +
230 236 // Allocate optimizer
231 237 m_opt = new GOptimizerLM();
232 238  
... ... @@ -235,14 +241,11 @@ void cterror::run(void)
235 241 m_obs.errors(*m_opt);
236 242 m_best_logL = m_obs.logL();
237 243  
238   - // Write header
239   - if (logTerse()) {
240   - log << std::endl;
241   - log.header1("Compute best-fit likelihood");
242   - }
243   -
244 244 // Write optimised model into logger
245 245 if (logTerse()) {
  246 + log << *m_opt << std::endl;
  247 + log << gammalib::parformat("Maximum log likelihood");
  248 + log << gammalib::str(m_best_logL,3) << std::endl;
246 249 log << m_obs.models() << std::endl;
247 250 }
248 251  
... ... @@ -285,23 +288,20 @@ void cterror::run(void)
285 288  
286 289 // Compute parameter bracketing
287 290 double parmin = std::max(m_model_par->factor_min(),
288   - m_value - 10*m_model_par->factor_error());
  291 + m_value - 10.0*m_model_par->factor_error());
289 292 double parmax = std::min(m_model_par->factor_max(),
290   - m_value + 10*m_model_par->factor_error());
  293 + m_value + 10.0*m_model_par->factor_error());
291 294  
292 295 // Write header
293 296 if (logTerse()) {
294 297 log << std::endl;
295   - log.header1("Compute parameter error");
296   - log << gammalib::parformat("Model name");
297   - log << model->name() << std::endl;
298   - log << gammalib::parformat("Parameter name");
299   - log << m_model_par->name() << std::endl;
  298 + log.header1("Compute error for source \""+m_srcname+"\""
  299 + " parameter \""+m_model_par->name()+"\"");
300 300 log << gammalib::parformat("Confidence level");
301 301 log << m_confidence*100.0 << "%" << std::endl;
302 302 log << gammalib::parformat("Log-likelihood difference");
303 303 log << m_dlogL << std::endl;
304   - log << gammalib::parformat("Initial parameter range");
  304 + log << gammalib::parformat("Initial factor range");
305 305 log << "[";
306 306 log << parmin;
307 307 log << ", ";
... ... @@ -312,47 +312,46 @@ void cterror::run(void)
312 312 // Compute lower boundary
313 313 double value_lo = error_bisection(parmin, m_value);
314 314  
315   - // Dump lower parameter value
  315 + // Write lower parameter value
316 316 if (logTerse()) {
317   - log << gammalib::parformat("Final lower parameter value");
  317 + log << gammalib::parformat("Lower parameter factor");
318 318 log << value_lo << std::endl;
319 319 }
320 320  
321 321 // Compute upper boundary
322 322 double value_hi = error_bisection(m_value, parmax);
323 323  
324   - // Dump upper parameter value
  324 + // Write upper parameter value
325 325 if (logTerse()) {
326   - log << gammalib::parformat("Final upper parameter");
  326 + log << gammalib::parformat("Upper parameter factor");
327 327 log << value_hi << std::endl;
328 328 }
329 329  
330 330 // Compute errors
331   - m_error = 0.5 * (value_hi - value_lo);
332   - double error_neg = value_lo - m_value;
  331 + double error = 0.5 * (value_hi - value_lo);
  332 + double error_neg = m_value - value_lo;
333 333 double error_pos = value_hi - m_value;
334 334 //double error_max = std::max(value_hi-m_value, m_value-value_lo);
335 335 //double error_min = std::min(value_hi-m_value, m_value-value_lo);
336 336  
337   - // Write results to logfile
  337 + // Write errors
338 338 if (logTerse()) {
339   - log << std::endl;
340   - log.header1("Error results");
341   - log << gammalib::parformat("Negative error");
342   - log << error_neg;
343   - log << gammalib::parformat("Positive error");
344   - log << error_pos;
345   - log << gammalib::parformat("Mean parameter error");
346   - log << m_error;
347   - log << " " << m_model_par->unit();
348   - log << std::endl;
349   - log << gammalib::parformat("Parameter scale");
350   - log << m_model_par->scale();
351   - log << std::endl;
  339 + log << gammalib::parformat("Error from curvature");
  340 + log << m_model_par->error();
  341 + log << " " << m_model_par->unit() << std::endl;
  342 + log << gammalib::parformat("Error from profile");
  343 + log << std::abs(error*m_model_par->scale());
  344 + log << " " << m_model_par->unit() << std::endl;
  345 + log << gammalib::parformat("Negative profile error");
  346 + log << std::abs(error_neg*m_model_par->scale());
  347 + log << " " << m_model_par->unit() << std::endl;
  348 + log << gammalib::parformat("Positive profile error");
  349 + log << std::abs(error_pos*m_model_par->scale());
  350 + log << " " << m_model_par->unit() << std::endl;
352 351 }
353 352  
354 353 // Save error result
355   - model->at(i).factor_error(m_error);
  354 + model->at(i).factor_error(error);
356 355  
357 356 } // endfor: looped over spectral parameters
358 357  
... ... @@ -409,7 +408,6 @@ void cterror::init_members(void)
409 408 m_tol = 1.0e-3;
410 409 m_max_iter = 50;
411 410 m_value = 0.0;
412   - m_error = 0.0;
413 411  
414 412 // Initialise protected members
415 413 m_obs.clear();
... ... @@ -530,7 +528,7 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max)
530 528 double wrk_max = max;
531 529  
532 530 // Initialise iteration counter
533   - int iter = 0;
  531 + int iter = 1;
534 532  
535 533 // Initialize mid value
536 534 double mid = (wrk_min + wrk_max) / 2.0;
... ... @@ -538,42 +536,38 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max)
538 536 // Loop until breaking condition is reached
539 537 while (true) {
540 538  
541   - // Log information
542   - if (logExplicit()) {
543   - log << gammalib::parformat("Iteration "+gammalib::str(iter));
544   - log << "[";
545   - log << wrk_min;
546   - log << ", ";
547   - log << wrk_max;
548   - log << "]" << std::endl;
549   - }
550   -
551 539 // Throw exception if maximum iterations are reached
552 540 if (iter > m_max_iter) {
553   - if(wrk_min - m_model_par->factor_min() < m_tol) {
554   - std::string msg = "The "+m_model_par->name()+" parameter minimum has been"
555   - " reached during error calculation. To obtain accurate "
556   - " errors, consider to set the minimum to a lower value,"
557   - " and re-run cterror.";
  541 + if (wrk_min - m_model_par->factor_min() < m_tol) {
  542 + std::string msg = "The \""+m_model_par->name()+"\" parameter "
  543 + "minimum has been reached during error "
  544 + "calculation. To obtain accurate errors, "
  545 + "consider setting the minimum parameter "
  546 + "value to a lower value, and re-run "
  547 + "cterror.";
558 548 if (logTerse()) {
559 549 log << msg;
560 550 }
561 551 break;
562 552 }
563   - else if(m_model_par->factor_max() - wrk_max < m_tol) {
564   - std::string msg = "The "+m_model_par->name()+" parameter maximum has been"
565   - " reached during error calculation. To obtain accurate "
566   - " errors, consider to set the maxmimum to a higher value"
567   - ", and re-run cterror.";
  553 + else if (m_model_par->factor_max() - wrk_max < m_tol) {
  554 + std::string msg = "The \""+m_model_par->name()+"\" parameter "
  555 + "maximum has been reached during error "
  556 + "calculation. To obtain accurate errors, "
  557 + "consider setting the maximum parameter "
  558 + "value to a higher value, and re-run "
  559 + "cterror.";
568 560 if (logTerse()) {
569 561 log << msg;
570 562 }
571 563 break;
572 564 }
573 565 else {
574   - std::string msg = "The maximum number of "+gammalib::str(m_max_iter)+
575   - " has been reached. You may consider to increase"
576   - " the \"max_iter\" parameter, and re-run cterror.";
  566 + std::string msg = "The maximum number of "+
  567 + gammalib::str(m_max_iter)+" iterations has "
  568 + "been reached. Please increase the "
  569 + "\"max_iter\" parameter, and re-run "
  570 + "cterror.";
577 571 throw GException::invalid_value(G_ERR_BISECTION, msg);
578 572 }
579 573 }
... ... @@ -584,6 +578,18 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max)
584 578 // Calculate function value
585 579 double eval_mid = evaluate(mid);
586 580  
  581 + // Log interval
  582 + if (logExplicit()) {
  583 + log << gammalib::parformat(" Iteration "+gammalib::str(iter));
  584 + log << "[";
  585 + log << wrk_min;
  586 + log << ", ";
  587 + log << wrk_max;
  588 + log << "] ";
  589 + log << eval_mid;
  590 + log << std::endl;
  591 + }
  592 +
587 593 // Check for convergence inside tolerance
588 594 if (std::abs(eval_mid) < m_tol) {
589 595 break;
... ...
src/cterror/cterror.hpp
... ... @@ -73,19 +73,18 @@ protected:
73 73 double error_bisection(const double& min, const double& max);
74 74  
75 75 // User parameters
76   - std::string m_srcname; //!< Name of source which is moved around
  76 + std::string m_srcname; //!< Name of source
77 77 double m_confidence; //!< Confidence level
78 78 double m_tol; //!< Tolerance for limit determination
79 79 int m_max_iter; //!< Maximum number of iterations
80 80 double m_value; //!< Parameter value
81   - double m_error; //!< Parameter error
82 81  
83 82 // Protected members
84 83 GObservations m_obs; //!< Observation container
85 84 double m_dlogL; //!< Likelihood difference for upper limit computation
86 85 GModelPar* m_model_par; //!< Pointer to model parameter
87 86 double m_best_logL; //!< Best fit log likelihood of given model
88   - GOptimizerLM* m_opt;
  87 + GOptimizerLM* m_opt; //!< Optimizer
89 88  
90 89 };
91 90  
... ...