Commit 734f92a6990027811d4bbc4a611420c7d7a408e0
1 parent
fd6a118b
Improve log file output.
Showing
2 changed files
with
68 additions
and
63 deletions
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& min, const double& 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& min, const double& 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& min, const double& 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 | ... | ... |