Commit 473731bc7db89910e734333853c8905ce12f2f58
1 parent
aabec45b
ctulimit now re-optimises other parameters. I also removed an unused import from…
… csspec and complemented the copy constructor of cterror (the optimiser was not copied and intialised)
Showing
5 changed files
with
47 additions
and
18 deletions
scripts/csspec.py
src/cterror/cterror.cpp
| ... | ... | @@ -412,6 +412,7 @@ void cterror::init_members(void) |
| 412 | 412 | m_dlogL = 0.0; |
| 413 | 413 | m_best_logL = 0.0; |
| 414 | 414 | m_model_par = NULL; |
| 415 | + m_opt = NULL; | |
| 415 | 416 | |
| 416 | 417 | // Return |
| 417 | 418 | return; |
| ... | ... | @@ -436,6 +437,7 @@ void cterror::copy_members(const cterror& app) |
| 436 | 437 | m_dlogL = app.m_dlogL; |
| 437 | 438 | m_best_logL = app.m_best_logL; |
| 438 | 439 | m_model_par = NULL; |
| 440 | + m_opt = NULL; | |
| 439 | 441 | |
| 440 | 442 | // Return |
| 441 | 443 | return; | ... | ... |
src/ctulimit/ctulimit.cpp
| ... | ... | @@ -232,6 +232,12 @@ void ctulimit::run(void) |
| 232 | 232 | // Save original models |
| 233 | 233 | GModels models_orig = m_obs.models(); |
| 234 | 234 | |
| 235 | + // Allocate a new optimizer | |
| 236 | + m_opt = new GOptimizerLM(); | |
| 237 | + | |
| 238 | + // Initialise best fit optimizer | |
| 239 | + GOptimizerLM best_opt; | |
| 240 | + | |
| 235 | 241 | // Save original log-likelihood. If the value is zero it has never been |
| 236 | 242 | // computed hence we compute it now. |
| 237 | 243 | m_best_logL = m_obs.logL(); |
| ... | ... | @@ -243,24 +249,32 @@ void ctulimit::run(void) |
| 243 | 249 | log.header1("Compute best-fit likelihood"); |
| 244 | 250 | } |
| 245 | 251 | |
| 246 | - // Reoptimize if likelihood was not given before | |
| 247 | - GOptimizerLM* opt = new GOptimizerLM(); | |
| 248 | - m_obs.optimize(*opt); | |
| 249 | - m_obs.errors(*opt); | |
| 250 | - m_best_logL = m_obs.logL(); | |
| 252 | + // Optimize and save best log-likelihood | |
| 253 | + m_obs.optimize(*m_opt); | |
| 254 | + m_obs.errors(*m_opt); | |
| 255 | + m_best_logL = m_obs.logL(); | |
| 251 | 256 | |
| 252 | - // Write optimised model into logger | |
| 253 | - if (logTerse()) { | |
| 254 | - log << m_obs.models() << std::endl; | |
| 255 | - } | |
| 257 | + // Store optimizer for later recovery | |
| 258 | + best_opt = *m_opt; | |
| 259 | + | |
| 260 | + // Write optimised model into logger | |
| 261 | + if (logTerse()) { | |
| 262 | + log << *m_opt << std::endl; | |
| 263 | + log << gammalib::parformat("Maximum log likelihood"); | |
| 264 | + log << gammalib::str(m_best_logL,3) << std::endl; | |
| 265 | + log << m_obs.models() << std::endl; | |
| 266 | + } | |
| 256 | 267 | |
| 257 | 268 | } // endif: likelihood was zero |
| 258 | 269 | |
| 270 | + // Extract current value | |
| 271 | + double value = m_model_par->factor_value(); | |
| 272 | + | |
| 259 | 273 | // Compute parameter bracketing |
| 260 | - double value = m_model_par->value(); | |
| 261 | - double error = m_model_par->error(); | |
| 262 | - double parmin = value + m_sigma_min * error; | |
| 263 | - double parmax = value + m_sigma_max * error; | |
| 274 | + double parmin = std::max(m_model_par->factor_min(), | |
| 275 | + value - m_sigma_min * m_model_par->factor_error()); | |
| 276 | + double parmax = std::min(m_model_par->factor_max(), | |
| 277 | + value + m_sigma_max * m_model_par->factor_error()); | |
| 264 | 278 | |
| 265 | 279 | // Write header |
| 266 | 280 | if (logTerse()) { |
| ... | ... | @@ -329,6 +343,9 @@ void ctulimit::run(void) |
| 329 | 343 | // Recover original models |
| 330 | 344 | m_obs.models(models_orig); |
| 331 | 345 | |
| 346 | + // Recover optimizer | |
| 347 | + *m_opt = best_opt; | |
| 348 | + | |
| 332 | 349 | // Return |
| 333 | 350 | return; |
| 334 | 351 | } |
| ... | ... | @@ -401,6 +418,7 @@ void ctulimit::init_members(void) |
| 401 | 418 | m_flux_ulimit = 0.0; |
| 402 | 419 | m_diff_ulimit = 0.0; |
| 403 | 420 | m_eflux_ulimit = 0.0; |
| 421 | + m_opt = NULL; | |
| 404 | 422 | |
| 405 | 423 | // Return |
| 406 | 424 | return; |
| ... | ... | @@ -433,6 +451,7 @@ void ctulimit::copy_members(const ctulimit& app) |
| 433 | 451 | m_diff_ulimit = app.m_diff_ulimit; |
| 434 | 452 | m_flux_ulimit = app.m_flux_ulimit; |
| 435 | 453 | m_eflux_ulimit = app.m_eflux_ulimit; |
| 454 | + m_opt = NULL; | |
| 436 | 455 | |
| 437 | 456 | // Extract model parameter |
| 438 | 457 | get_model_parameter(); |
| ... | ... | @@ -662,17 +681,23 @@ double ctulimit::evaluate(const double& value) |
| 662 | 681 | double logL = 0.0; |
| 663 | 682 | |
| 664 | 683 | // Check if given parameter is within boundaries |
| 665 | - if (value > m_model_par->min() && value < m_model_par->max()) { | |
| 684 | + if (value > m_model_par->factor_min() && value < m_model_par->factor_max()) { | |
| 666 | 685 | |
| 667 | 686 | // Change parameter factor |
| 668 | - m_model_par->value(value); | |
| 687 | + m_model_par->factor_value(value); | |
| 669 | 688 | |
| 670 | - // Evaluate likelihood for new model container | |
| 671 | - m_obs.eval(); | |
| 689 | + // Fix parameter | |
| 690 | + m_model_par->fix(); | |
| 691 | + | |
| 692 | + // Re-optimize | |
| 693 | + m_obs.optimize(*m_opt); | |
| 672 | 694 | |
| 673 | 695 | // Retrieve likelihood |
| 674 | 696 | logL = m_obs.logL(); |
| 675 | 697 | |
| 698 | + // Free parameter | |
| 699 | + m_model_par->free(); | |
| 700 | + | |
| 676 | 701 | } // endif: value was inside allowed range |
| 677 | 702 | |
| 678 | 703 | // ... otherwise signal that the parameter went outside the boundaries | ... | ... |
src/ctulimit/ctulimit.hpp
| ... | ... | @@ -102,6 +102,7 @@ protected: |
| 102 | 102 | double m_diff_ulimit; //!< Differential upper limit value |
| 103 | 103 | double m_flux_ulimit; //!< Flux upper limit value |
| 104 | 104 | double m_eflux_ulimit; //!< Energy flux upper limits |
| 105 | + GOptimizerLM* m_opt; //!< Optimizer | |
| 105 | 106 | }; |
| 106 | 107 | |
| 107 | 108 | ... | ... |