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,6 +227,12 @@ void cterror::run(void)
227 log << m_obs << std::endl; 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 // Allocate optimizer 236 // Allocate optimizer
231 m_opt = new GOptimizerLM(); 237 m_opt = new GOptimizerLM();
232 238
@@ -235,14 +241,11 @@ void cterror::run(void) @@ -235,14 +241,11 @@ void cterror::run(void)
235 m_obs.errors(*m_opt); 241 m_obs.errors(*m_opt);
236 m_best_logL = m_obs.logL(); 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 // Write optimised model into logger 244 // Write optimised model into logger
245 if (logTerse()) { 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 log << m_obs.models() << std::endl; 249 log << m_obs.models() << std::endl;
247 } 250 }
248 251
@@ -285,23 +288,20 @@ void cterror::run(void) @@ -285,23 +288,20 @@ void cterror::run(void)
285 288
286 // Compute parameter bracketing 289 // Compute parameter bracketing
287 double parmin = std::max(m_model_par->factor_min(), 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 double parmax = std::min(m_model_par->factor_max(), 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 // Write header 295 // Write header
293 if (logTerse()) { 296 if (logTerse()) {
294 log << std::endl; 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 log << gammalib::parformat("Confidence level"); 300 log << gammalib::parformat("Confidence level");
301 log << m_confidence*100.0 << "%" << std::endl; 301 log << m_confidence*100.0 << "%" << std::endl;
302 log << gammalib::parformat("Log-likelihood difference"); 302 log << gammalib::parformat("Log-likelihood difference");
303 log << m_dlogL << std::endl; 303 log << m_dlogL << std::endl;
304 - log << gammalib::parformat("Initial parameter range"); 304 + log << gammalib::parformat("Initial factor range");
305 log << "["; 305 log << "[";
306 log << parmin; 306 log << parmin;
307 log << ", "; 307 log << ", ";
@@ -312,47 +312,46 @@ void cterror::run(void) @@ -312,47 +312,46 @@ void cterror::run(void)
312 // Compute lower boundary 312 // Compute lower boundary
313 double value_lo = error_bisection(parmin, m_value); 313 double value_lo = error_bisection(parmin, m_value);
314 314
315 - // Dump lower parameter value 315 + // Write lower parameter value
316 if (logTerse()) { 316 if (logTerse()) {
317 - log << gammalib::parformat("Final lower parameter value"); 317 + log << gammalib::parformat("Lower parameter factor");
318 log << value_lo << std::endl; 318 log << value_lo << std::endl;
319 } 319 }
320 320
321 // Compute upper boundary 321 // Compute upper boundary
322 double value_hi = error_bisection(m_value, parmax); 322 double value_hi = error_bisection(m_value, parmax);
323 323
324 - // Dump upper parameter value 324 + // Write upper parameter value
325 if (logTerse()) { 325 if (logTerse()) {
326 - log << gammalib::parformat("Final upper parameter"); 326 + log << gammalib::parformat("Upper parameter factor");
327 log << value_hi << std::endl; 327 log << value_hi << std::endl;
328 } 328 }
329 329
330 // Compute errors 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 double error_pos = value_hi - m_value; 333 double error_pos = value_hi - m_value;
334 //double error_max = std::max(value_hi-m_value, m_value-value_lo); 334 //double error_max = std::max(value_hi-m_value, m_value-value_lo);
335 //double error_min = std::min(value_hi-m_value, m_value-value_lo); 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 if (logTerse()) { 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 // Save error result 353 // Save error result
355 - model->at(i).factor_error(m_error); 354 + model->at(i).factor_error(error);
356 355
357 } // endfor: looped over spectral parameters 356 } // endfor: looped over spectral parameters
358 357
@@ -409,7 +408,6 @@ void cterror::init_members(void) @@ -409,7 +408,6 @@ void cterror::init_members(void)
409 m_tol = 1.0e-3; 408 m_tol = 1.0e-3;
410 m_max_iter = 50; 409 m_max_iter = 50;
411 m_value = 0.0; 410 m_value = 0.0;
412 - m_error = 0.0;  
413 411
414 // Initialise protected members 412 // Initialise protected members
415 m_obs.clear(); 413 m_obs.clear();
@@ -530,7 +528,7 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max) @@ -530,7 +528,7 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max)
530 double wrk_max = max; 528 double wrk_max = max;
531 529
532 // Initialise iteration counter 530 // Initialise iteration counter
533 - int iter = 0; 531 + int iter = 1;
534 532
535 // Initialize mid value 533 // Initialize mid value
536 double mid = (wrk_min + wrk_max) / 2.0; 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,42 +536,38 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max)
538 // Loop until breaking condition is reached 536 // Loop until breaking condition is reached
539 while (true) { 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 // Throw exception if maximum iterations are reached 539 // Throw exception if maximum iterations are reached
552 if (iter > m_max_iter) { 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 if (logTerse()) { 548 if (logTerse()) {
559 log << msg; 549 log << msg;
560 } 550 }
561 break; 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 if (logTerse()) { 560 if (logTerse()) {
569 log << msg; 561 log << msg;
570 } 562 }
571 break; 563 break;
572 } 564 }
573 else { 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 throw GException::invalid_value(G_ERR_BISECTION, msg); 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,6 +578,18 @@ double cterror::error_bisection(const double&amp; min, const double&amp; max)
584 // Calculate function value 578 // Calculate function value
585 double eval_mid = evaluate(mid); 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 // Check for convergence inside tolerance 593 // Check for convergence inside tolerance
588 if (std::abs(eval_mid) < m_tol) { 594 if (std::abs(eval_mid) < m_tol) {
589 break; 595 break;
src/cterror/cterror.hpp
@@ -73,19 +73,18 @@ protected: @@ -73,19 +73,18 @@ protected:
73 double error_bisection(const double& min, const double& max); 73 double error_bisection(const double& min, const double& max);
74 74
75 // User parameters 75 // User parameters
76 - std::string m_srcname; //!< Name of source which is moved around 76 + std::string m_srcname; //!< Name of source
77 double m_confidence; //!< Confidence level 77 double m_confidence; //!< Confidence level
78 double m_tol; //!< Tolerance for limit determination 78 double m_tol; //!< Tolerance for limit determination
79 int m_max_iter; //!< Maximum number of iterations 79 int m_max_iter; //!< Maximum number of iterations
80 double m_value; //!< Parameter value 80 double m_value; //!< Parameter value
81 - double m_error; //!< Parameter error  
82 81
83 // Protected members 82 // Protected members
84 GObservations m_obs; //!< Observation container 83 GObservations m_obs; //!< Observation container
85 double m_dlogL; //!< Likelihood difference for upper limit computation 84 double m_dlogL; //!< Likelihood difference for upper limit computation
86 GModelPar* m_model_par; //!< Pointer to model parameter 85 GModelPar* m_model_par; //!< Pointer to model parameter
87 double m_best_logL; //!< Best fit log likelihood of given model 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