Commit 473731bc7db89910e734333853c8905ce12f2f58

Authored by Michael Mayer
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)
scripts/csspec.py
... ... @@ -21,7 +21,7 @@
21 21 import gammalib
22 22 import ctools
23 23 import sys
24   -import tempfile
  24 +
25 25  
26 26 # ============ #
27 27 # csspec class #
... ...
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&amp; 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&amp; 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  
... ...
test/test_cscripts.sh.in
... ... @@ -44,6 +44,7 @@ rm -rf *.fits *.xml *.dat
44 44 # ========================
45 45 rm -rf pfiles
46 46 mkdir -p pfiles
  47 +cp -r ../src/*/*.par pfiles/
47 48 export PFILES=pfiles
48 49  
49 50  
... ...