Commit e9ae0dd9457fe4d86a8665c83799b3357fa38334
1 parent
5e271e1d
update to support standardized Python interface
Showing
4 changed files
with
309 additions
and
89 deletions
pyext/ctlike.i
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * ctlike - CTA maximum likelihood tool * | 2 | * ctlike - CTA maximum likelihood tool * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010 by Jurgen Knodlseder * | 4 | + * copyright (C) 2010-2011 by Jurgen Knodlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software; you can redistribute it and/or modify * | 7 | * This program is free software; you can redistribute it and/or modify * |
| @@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
| 12 | ***************************************************************************/ | 12 | ***************************************************************************/ |
| 13 | /** | 13 | /** |
| 14 | * @file ctlike.i | 14 | * @file ctlike.i |
| 15 | - * @brief CTA maximum likelihood tool SWIG definition | 15 | + * @brief CTA maximum likelihood tool Python interface definition |
| 16 | * @author J. Knodlseder | 16 | * @author J. Knodlseder |
| 17 | */ | 17 | */ |
| 18 | %{ | 18 | %{ |
| @@ -25,21 +25,27 @@ | @@ -25,21 +25,27 @@ | ||
| 25 | /***********************************************************************//** | 25 | /***********************************************************************//** |
| 26 | * @class ctlike | 26 | * @class ctlike |
| 27 | * | 27 | * |
| 28 | - * @brief CTA maximum likelihood tool SWIG interface defintion. | 28 | + * @brief CTA maximum likelihood tool Python interface defintion |
| 29 | ***************************************************************************/ | 29 | ***************************************************************************/ |
| 30 | class ctlike : public GApplication { | 30 | class ctlike : public GApplication { |
| 31 | public: | 31 | public: |
| 32 | // Constructors and destructors | 32 | // Constructors and destructors |
| 33 | ctlike(void); | 33 | ctlike(void); |
| 34 | + explicit ctlike(GObservations obs); | ||
| 34 | ctlike(int argc, char *argv[]); | 35 | ctlike(int argc, char *argv[]); |
| 35 | - ~ctlike(void); | 36 | + ctlike(const ctlike& app); |
| 37 | + virtual ~ctlike(void); | ||
| 36 | 38 | ||
| 37 | // Methods | 39 | // Methods |
| 38 | - void run(void); | ||
| 39 | - void get_parameters(void); | ||
| 40 | - void optimize_lm(void); | ||
| 41 | - void unbinned(const std::string& evfile); | ||
| 42 | - void binned(const std::string& cntmap); | 40 | + void clear(void); |
| 41 | + void execute(void); | ||
| 42 | + void run(void); | ||
| 43 | + void save(void); | ||
| 44 | + GObservations& obs(void) { return m_obs; } | ||
| 45 | + void get_parameters(void); | ||
| 46 | + void optimize_lm(void); | ||
| 47 | + void load_unbinned(const std::string& evfile); | ||
| 48 | + void load_binned(const std::string& cntmap); | ||
| 43 | }; | 49 | }; |
| 44 | 50 | ||
| 45 | 51 |
src/ctlike/ctlike.cpp
| @@ -24,6 +24,13 @@ | @@ -24,6 +24,13 @@ | ||
| 24 | #include "ctlike.hpp" | 24 | #include "ctlike.hpp" |
| 25 | #include "GTools.hpp" | 25 | #include "GTools.hpp" |
| 26 | 26 | ||
| 27 | +/* __ Method name definitions ____________________________________________ */ | ||
| 28 | +#define G_GET_PARAMETERS "ctlike::get_parameters()" | ||
| 29 | + | ||
| 30 | +/* __ Debug definitions __________________________________________________ */ | ||
| 31 | + | ||
| 32 | +/* __ Coding definitions _________________________________________________ */ | ||
| 33 | + | ||
| 27 | 34 | ||
| 28 | /*========================================================================== | 35 | /*========================================================================== |
| 29 | = = | 36 | = = |
| @@ -48,6 +55,28 @@ ctlike::ctlike(void) : GApplication(CTLIKE_NAME, CTLIKE_VERSION) | @@ -48,6 +55,28 @@ ctlike::ctlike(void) : GApplication(CTLIKE_NAME, CTLIKE_VERSION) | ||
| 48 | 55 | ||
| 49 | 56 | ||
| 50 | /***********************************************************************//** | 57 | /***********************************************************************//** |
| 58 | + * @brief Observations constructor | ||
| 59 | + * | ||
| 60 | + * This method creates an instance of the class by copying an existing | ||
| 61 | + * observations container. | ||
| 62 | + ***************************************************************************/ | ||
| 63 | +ctlike::ctlike(GObservations obs) : GApplication(CTLIKE_NAME, CTLIKE_VERSION) | ||
| 64 | +{ | ||
| 65 | + // Initialise members | ||
| 66 | + init_members(); | ||
| 67 | + | ||
| 68 | + // Set observations | ||
| 69 | + m_obs = obs; | ||
| 70 | + | ||
| 71 | + // Write header into logger | ||
| 72 | + log_header(); | ||
| 73 | + | ||
| 74 | + // Return | ||
| 75 | + return; | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | + | ||
| 79 | +/***********************************************************************//** | ||
| 51 | * @brief Command line constructor | 80 | * @brief Command line constructor |
| 52 | * | 81 | * |
| 53 | * @param[in] argc Number of arguments in command line. | 82 | * @param[in] argc Number of arguments in command line. |
| @@ -68,6 +97,24 @@ ctlike::ctlike(int argc, char *argv[]) : | @@ -68,6 +97,24 @@ ctlike::ctlike(int argc, char *argv[]) : | ||
| 68 | 97 | ||
| 69 | 98 | ||
| 70 | /***********************************************************************//** | 99 | /***********************************************************************//** |
| 100 | + * @brief Copy constructor | ||
| 101 | + * | ||
| 102 | + * @param[in] app Application. | ||
| 103 | + ***************************************************************************/ | ||
| 104 | +ctlike::ctlike(const ctlike& app) : GApplication(app) | ||
| 105 | +{ | ||
| 106 | + // Initialise members | ||
| 107 | + init_members(); | ||
| 108 | + | ||
| 109 | + // Copy members | ||
| 110 | + copy_members(app); | ||
| 111 | + | ||
| 112 | + // Return | ||
| 113 | + return; | ||
| 114 | +} | ||
| 115 | + | ||
| 116 | + | ||
| 117 | +/***********************************************************************//** | ||
| 71 | * @brief Destructor | 118 | * @brief Destructor |
| 72 | ***************************************************************************/ | 119 | ***************************************************************************/ |
| 73 | ctlike::~ctlike(void) | 120 | ctlike::~ctlike(void) |
| @@ -86,6 +133,35 @@ ctlike::~ctlike(void) | @@ -86,6 +133,35 @@ ctlike::~ctlike(void) | ||
| 86 | = = | 133 | = = |
| 87 | ==========================================================================*/ | 134 | ==========================================================================*/ |
| 88 | 135 | ||
| 136 | +/***********************************************************************//** | ||
| 137 | + * @brief Assignment operator | ||
| 138 | + * | ||
| 139 | + * @param[in] app Application. | ||
| 140 | + ***************************************************************************/ | ||
| 141 | +ctlike& ctlike::operator= (const ctlike& app) | ||
| 142 | +{ | ||
| 143 | + // Execute only if object is not identical | ||
| 144 | + if (this != &app) { | ||
| 145 | + | ||
| 146 | + // Copy base class members | ||
| 147 | + this->GApplication::operator=(app); | ||
| 148 | + | ||
| 149 | + // Free members | ||
| 150 | + free_members(); | ||
| 151 | + | ||
| 152 | + // Initialise members | ||
| 153 | + init_members(); | ||
| 154 | + | ||
| 155 | + // Copy members | ||
| 156 | + copy_members(app); | ||
| 157 | + | ||
| 158 | + } // endif: object was not identical | ||
| 159 | + | ||
| 160 | + // Return this object | ||
| 161 | + return *this; | ||
| 162 | +} | ||
| 163 | + | ||
| 164 | + | ||
| 89 | /*========================================================================== | 165 | /*========================================================================== |
| 90 | = = | 166 | = = |
| 91 | = Public methods = | 167 | = Public methods = |
| @@ -93,6 +169,47 @@ ctlike::~ctlike(void) | @@ -93,6 +169,47 @@ ctlike::~ctlike(void) | ||
| 93 | ==========================================================================*/ | 169 | ==========================================================================*/ |
| 94 | 170 | ||
| 95 | /***********************************************************************//** | 171 | /***********************************************************************//** |
| 172 | + * @brief Clear instance | ||
| 173 | + ***************************************************************************/ | ||
| 174 | +void ctlike::clear(void) | ||
| 175 | +{ | ||
| 176 | + // Free members | ||
| 177 | + free_members(); | ||
| 178 | + this->GApplication::free_members(); | ||
| 179 | + | ||
| 180 | + // Initialise members | ||
| 181 | + this->GApplication::init_members(); | ||
| 182 | + init_members(); | ||
| 183 | + | ||
| 184 | + // Return | ||
| 185 | + return; | ||
| 186 | +} | ||
| 187 | + | ||
| 188 | + | ||
| 189 | +/***********************************************************************//** | ||
| 190 | + * @brief Execute application | ||
| 191 | + * | ||
| 192 | + * This method performs a maximum likelihood analysis of a observation given | ||
| 193 | + * in an observation container and saves the results in an XML file. | ||
| 194 | + ***************************************************************************/ | ||
| 195 | +void ctlike::execute(void) | ||
| 196 | +{ | ||
| 197 | + // Read ahead output filename so that it gets dumped correctly in the | ||
| 198 | + // parameters log | ||
| 199 | + m_outmdl = par("outmdl")->value(); | ||
| 200 | + | ||
| 201 | + // Bin the event data | ||
| 202 | + run(); | ||
| 203 | + | ||
| 204 | + // Save the results into XML file | ||
| 205 | + save(); | ||
| 206 | + | ||
| 207 | + // Return | ||
| 208 | + return; | ||
| 209 | +} | ||
| 210 | + | ||
| 211 | + | ||
| 212 | +/***********************************************************************//** | ||
| 96 | * @brief Run maximum likelihood analysis | 213 | * @brief Run maximum likelihood analysis |
| 97 | * | 214 | * |
| 98 | * The following analysis steps are performed: | 215 | * The following analysis steps are performed: |
| @@ -100,7 +217,6 @@ ctlike::~ctlike(void) | @@ -100,7 +217,6 @@ ctlike::~ctlike(void) | ||
| 100 | * 2. Load observation | 217 | * 2. Load observation |
| 101 | * 3. Setup models for optimizing | 218 | * 3. Setup models for optimizing |
| 102 | * 4. Optimize model (and write result into logger) | 219 | * 4. Optimize model (and write result into logger) |
| 103 | - * 5. Write results out as XML model | ||
| 104 | ***************************************************************************/ | 220 | ***************************************************************************/ |
| 105 | void ctlike::run(void) | 221 | void ctlike::run(void) |
| 106 | { | 222 | { |
| @@ -117,36 +233,50 @@ void ctlike::run(void) | @@ -117,36 +233,50 @@ void ctlike::run(void) | ||
| 117 | log << std::endl; | 233 | log << std::endl; |
| 118 | } | 234 | } |
| 119 | 235 | ||
| 120 | - // Load observation | ||
| 121 | - if (m_method == "UNBINNED") | ||
| 122 | - unbinned(m_evfile); | ||
| 123 | - else | ||
| 124 | - binned(m_cntmap); | ||
| 125 | - | ||
| 126 | - // Write observation into logger | 236 | + // Write observation(s) into logger |
| 127 | if (logTerse()) { | 237 | if (logTerse()) { |
| 128 | log << std::endl; | 238 | log << std::endl; |
| 129 | - log.header1("Observation"); | 239 | + if (m_obs.size() > 1) |
| 240 | + log.header1("Observations"); | ||
| 241 | + else | ||
| 242 | + log.header1("Observation"); | ||
| 130 | log << m_obs << std::endl; | 243 | log << m_obs << std::endl; |
| 131 | } | 244 | } |
| 132 | 245 | ||
| 133 | - // Setup models for optimizing. | ||
| 134 | - m_models = GModels(m_srcmdl); | ||
| 135 | - m_obs.models(m_models); | ||
| 136 | - | ||
| 137 | - // Optimize | 246 | + // Optimize model parameters using LM optimizer |
| 138 | optimize_lm(); | 247 | optimize_lm(); |
| 139 | 248 | ||
| 140 | // Write results into logger | 249 | // Write results into logger |
| 141 | if (logTerse()) { | 250 | if (logTerse()) { |
| 142 | log << " Maximum log likelihood ....: " << m_logL << std::endl; | 251 | log << " Maximum log likelihood ....: " << m_logL << std::endl; |
| 143 | log << " Npred .....................: " << m_obs.npred() << std::endl; | 252 | log << " Npred .....................: " << m_obs.npred() << std::endl; |
| 144 | - log << m_models << std::endl << std::endl; | 253 | + log << m_obs.models() << std::endl; |
| 145 | } | 254 | } |
| 146 | - | 255 | + |
| 256 | + // Return | ||
| 257 | + return; | ||
| 258 | +} | ||
| 259 | + | ||
| 260 | + | ||
| 261 | +/***********************************************************************//** | ||
| 262 | + * @brief Save results | ||
| 263 | + * | ||
| 264 | + * This method saves the fit results in a XML file. | ||
| 265 | + ***************************************************************************/ | ||
| 266 | +void ctlike::save(void) | ||
| 267 | +{ | ||
| 268 | + // Write header | ||
| 269 | + if (logTerse()) { | ||
| 270 | + log << std::endl; | ||
| 271 | + log.header1("Save results"); | ||
| 272 | + } | ||
| 273 | + | ||
| 274 | + // Get output filename | ||
| 275 | + m_outmdl = par("outmdl")->value(); | ||
| 276 | + | ||
| 147 | // Write results out as XML model | 277 | // Write results out as XML model |
| 148 | if (toupper(m_outmdl) != "NONE") | 278 | if (toupper(m_outmdl) != "NONE") |
| 149 | - m_models.save(m_outmdl); | 279 | + m_obs.models().save(m_outmdl); |
| 150 | 280 | ||
| 151 | // Return | 281 | // Return |
| 152 | return; | 282 | return; |
| @@ -156,29 +286,78 @@ void ctlike::run(void) | @@ -156,29 +286,78 @@ void ctlike::run(void) | ||
| 156 | /***********************************************************************//** | 286 | /***********************************************************************//** |
| 157 | * @brief Get application parameters | 287 | * @brief Get application parameters |
| 158 | * | 288 | * |
| 159 | - * Get all task parameters from parameter file or (if required) by querying | ||
| 160 | - * the user. | 289 | + * GException::par_error |
| 290 | + * Invalid analysis method specified (neither BINNED nor UNBINNED). | ||
| 291 | + * | ||
| 292 | + * Get all required task parameters from the parameter file or (if specified) | ||
| 293 | + * by querying the user. Observation dependent parameters will only be read | ||
| 294 | + * if the observation container is actually empty. Observation dependent | ||
| 295 | + * parameters are: | ||
| 296 | + * "method" (analysis method), | ||
| 297 | + * "stat" (statistics to be used for observation), | ||
| 298 | + * "caldb" (calibration database), | ||
| 299 | + * "irf" (instrument response function), | ||
| 300 | + * "evfile" (event file name), and | ||
| 301 | + * "cntmap" (counts map file name). | ||
| 302 | + * The model will only be loaded if no model components exist in the | ||
| 303 | + * observation container. | ||
| 161 | ***************************************************************************/ | 304 | ***************************************************************************/ |
| 162 | void ctlike::get_parameters(void) | 305 | void ctlike::get_parameters(void) |
| 163 | { | 306 | { |
| 307 | + // If there is are no models associated with the observations then | ||
| 308 | + // load now the model definition | ||
| 309 | + if (m_obs.models().size() == 0) { | ||
| 310 | + | ||
| 311 | + // Get models XML filename | ||
| 312 | + std::string filename = par("srcmdl")->value(); | ||
| 313 | + | ||
| 314 | + // Setup models for optimizing. | ||
| 315 | + m_obs.models(GModels(filename)); | ||
| 316 | + | ||
| 317 | + } // endif: no models were associated with observations | ||
| 318 | + | ||
| 319 | + // If there are no observations in container then add a single CTA | ||
| 320 | + // observation using the parameters from the parameter file | ||
| 321 | + if (m_obs.size() == 0) { | ||
| 322 | + | ||
| 323 | + // Get observation parameters | ||
| 324 | + m_method = toupper(par("method")->value()); | ||
| 325 | + m_stat = toupper(par("stat")->value()); | ||
| 326 | + m_caldb = par("caldb")->value(); | ||
| 327 | + m_irf = par("irf")->value(); | ||
| 328 | + | ||
| 329 | + // Case A: set-up unbinned CTA observation | ||
| 330 | + if (m_method == "UNBINNED") { | ||
| 331 | + | ||
| 332 | + // Get event file name | ||
| 333 | + std::string filename = par("evfile")->value(); | ||
| 334 | + | ||
| 335 | + // Load and append unbinned CTA observation | ||
| 336 | + load_unbinned(filename); | ||
| 337 | + | ||
| 338 | + } // endif: unbinned analysis mode | ||
| 339 | + | ||
| 340 | + // Case B: set-up binned CTA observation | ||
| 341 | + else if (m_method == "BINNED") { | ||
| 342 | + | ||
| 343 | + // Get counts map file name | ||
| 344 | + std::string filename = par("cntmap")->value(); | ||
| 345 | + | ||
| 346 | + // Load and append binned CTA observation | ||
| 347 | + load_binned(filename); | ||
| 348 | + | ||
| 349 | + } // endif: binned analysis mode | ||
| 350 | + | ||
| 351 | + // ... otherwise signal an invalid analysis method | ||
| 352 | + else { | ||
| 353 | + throw GException::par_error(G_GET_PARAMETERS, "method", | ||
| 354 | + "only \"BINNED\" or \"UNBINNED\" supported."); | ||
| 355 | + } | ||
| 356 | + | ||
| 357 | + } // endif: there was no observation in the container | ||
| 358 | + | ||
| 164 | // Get standard parameters | 359 | // Get standard parameters |
| 165 | - m_method = toupper(par("method")->value()); | ||
| 166 | - m_stat = toupper(par("stat")->value()); | ||
| 167 | m_refit = par("refit")->boolean(); | 360 | m_refit = par("refit")->boolean(); |
| 168 | - m_caldb = par("caldb")->value(); | ||
| 169 | - m_irf = par("irf")->value(); | ||
| 170 | - m_srcmdl = par("srcmdl")->value(); | ||
| 171 | - m_outmdl = par("outmdl")->value(); | ||
| 172 | - | ||
| 173 | - // Get unbinned parameters ... | ||
| 174 | - if (m_method == "UNBINNED") { | ||
| 175 | - m_evfile = par("evfile")->value(); | ||
| 176 | - } | ||
| 177 | - | ||
| 178 | - // ... or get binned parameters | ||
| 179 | - else if (m_method == "BINNED") { | ||
| 180 | - m_cntmap = par("cntmap")->value(); | ||
| 181 | - } | ||
| 182 | 361 | ||
| 183 | // Return | 362 | // Return |
| 184 | return; | 363 | return; |
| @@ -186,15 +365,19 @@ void ctlike::get_parameters(void) | @@ -186,15 +365,19 @@ void ctlike::get_parameters(void) | ||
| 186 | 365 | ||
| 187 | 366 | ||
| 188 | /***********************************************************************//** | 367 | /***********************************************************************//** |
| 189 | - * @brief Optimize using Levenberg-Marquardt method | 368 | + * @brief Optimize model parameters using Levenberg-Marquardt method |
| 190 | ***************************************************************************/ | 369 | ***************************************************************************/ |
| 191 | void ctlike::optimize_lm(void) | 370 | void ctlike::optimize_lm(void) |
| 192 | { | 371 | { |
| 372 | + // Free any existing optimizer | ||
| 373 | + if (m_opt != NULL) delete m_opt; | ||
| 374 | + m_opt = NULL; | ||
| 375 | + | ||
| 193 | // Allocate optimizer. The logger is only passed to the optimizer | 376 | // Allocate optimizer. The logger is only passed to the optimizer |
| 194 | // constructor if optimizer logging is requested. | 377 | // constructor if optimizer logging is requested. |
| 195 | - GOptimizerLM* opt = (logTerse()) ? new GOptimizerLM(log) | 378 | + GOptimizerLM* opt = (logTerse()) ? new GOptimizerLM(log) |
| 196 | : new GOptimizerLM(); | 379 | : new GOptimizerLM(); |
| 197 | - | 380 | + |
| 198 | // Assign optimizer | 381 | // Assign optimizer |
| 199 | m_opt = opt; | 382 | m_opt = opt; |
| 200 | 383 | ||
| @@ -207,45 +390,36 @@ void ctlike::optimize_lm(void) | @@ -207,45 +390,36 @@ void ctlike::optimize_lm(void) | ||
| 207 | log.header1("Maximum likelihood optimisation"); | 390 | log.header1("Maximum likelihood optimisation"); |
| 208 | log.indent(1); | 391 | log.indent(1); |
| 209 | } | 392 | } |
| 210 | - | 393 | + |
| 211 | // Perform LM optimization | 394 | // Perform LM optimization |
| 212 | - m_obs.optimize(*m_opt); | 395 | + m_obs.optimize(*opt); |
| 213 | 396 | ||
| 214 | // Optionally refit | 397 | // Optionally refit |
| 215 | if (m_refit) | 398 | if (m_refit) |
| 216 | - m_obs.optimize(*m_opt); | ||
| 217 | - | ||
| 218 | - // Get models back | ||
| 219 | - m_models = m_obs.models(); | 399 | + m_obs.optimize(*opt); |
| 220 | 400 | ||
| 221 | // Store maximum log likelihood value | 401 | // Store maximum log likelihood value |
| 222 | - m_logL = -opt->value(); | 402 | + m_logL = -(opt->value()); |
| 223 | 403 | ||
| 224 | // Write optimization results | 404 | // Write optimization results |
| 225 | log.indent(0); | 405 | log.indent(0); |
| 226 | if (logTerse()) { | 406 | if (logTerse()) { |
| 227 | log << std::endl; | 407 | log << std::endl; |
| 228 | - log.header1("Maximum likelihood optimisation results"); | 408 | + log.header1("Maximum likelihood optimization results"); |
| 229 | log << *opt << std::endl; | 409 | log << *opt << std::endl; |
| 230 | } | 410 | } |
| 231 | 411 | ||
| 232 | - // Free optimizer | ||
| 233 | - delete opt; | ||
| 234 | - | ||
| 235 | - // Reset optimizer pointer | ||
| 236 | - m_opt = NULL; | ||
| 237 | - | ||
| 238 | // Return | 412 | // Return |
| 239 | return; | 413 | return; |
| 240 | } | 414 | } |
| 241 | 415 | ||
| 242 | 416 | ||
| 243 | /***********************************************************************//** | 417 | /***********************************************************************//** |
| 244 | - * @brief Load unbinned observation and append to observations contained | 418 | + * @brief Load unbinned observation and append it to observations container |
| 245 | * | 419 | * |
| 246 | * @param[in] evfile Events file name. | 420 | * @param[in] evfile Events file name. |
| 247 | ***************************************************************************/ | 421 | ***************************************************************************/ |
| 248 | -void ctlike::unbinned(const std::string& evfile) | 422 | +void ctlike::load_unbinned(const std::string& evfile) |
| 249 | { | 423 | { |
| 250 | // Declare CTA observation | 424 | // Declare CTA observation |
| 251 | GCTAObservation obs; | 425 | GCTAObservation obs; |
| @@ -268,11 +442,11 @@ void ctlike::unbinned(const std::string& evfile) | @@ -268,11 +442,11 @@ void ctlike::unbinned(const std::string& evfile) | ||
| 268 | 442 | ||
| 269 | 443 | ||
| 270 | /***********************************************************************//** | 444 | /***********************************************************************//** |
| 271 | - * @brief Load binned observation and append to observations contained | 445 | + * @brief Load binned observation and append it to observations container |
| 272 | * | 446 | * |
| 273 | * @param[in] cntmap Counts map file name. | 447 | * @param[in] cntmap Counts map file name. |
| 274 | ***************************************************************************/ | 448 | ***************************************************************************/ |
| 275 | -void ctlike::binned(const std::string& cntmap) | 449 | +void ctlike::load_binned(const std::string& cntmap) |
| 276 | { | 450 | { |
| 277 | // Declare CTA observation | 451 | // Declare CTA observation |
| 278 | GCTAObservation obs; | 452 | GCTAObservation obs; |
| @@ -307,12 +481,12 @@ void ctlike::init_members(void) | @@ -307,12 +481,12 @@ void ctlike::init_members(void) | ||
| 307 | { | 481 | { |
| 308 | // Initialise members | 482 | // Initialise members |
| 309 | m_method.clear(); | 483 | m_method.clear(); |
| 484 | + m_stat.clear(); | ||
| 310 | m_caldb.clear(); | 485 | m_caldb.clear(); |
| 311 | m_irf.clear(); | 486 | m_irf.clear(); |
| 312 | - m_srcmdl.clear(); | ||
| 313 | m_outmdl.clear(); | 487 | m_outmdl.clear(); |
| 314 | - m_models.clear(); | ||
| 315 | m_obs.clear(); | 488 | m_obs.clear(); |
| 489 | + m_refit = false; | ||
| 316 | m_max_iter = 100; // Set maximum number of iterations to 100 | 490 | m_max_iter = 100; // Set maximum number of iterations to 100 |
| 317 | m_logL = 0.0; | 491 | m_logL = 0.0; |
| 318 | m_opt = NULL; | 492 | m_opt = NULL; |
| @@ -326,11 +500,43 @@ void ctlike::init_members(void) | @@ -326,11 +500,43 @@ void ctlike::init_members(void) | ||
| 326 | 500 | ||
| 327 | 501 | ||
| 328 | /***********************************************************************//** | 502 | /***********************************************************************//** |
| 503 | + * @brief Copy class members | ||
| 504 | + * | ||
| 505 | + * @param[in] app Application. | ||
| 506 | + ***************************************************************************/ | ||
| 507 | +void ctlike::copy_members(const ctlike& app) | ||
| 508 | +{ | ||
| 509 | + // Copy attributes | ||
| 510 | + m_method = app.m_method; | ||
| 511 | + m_stat = app.m_stat; | ||
| 512 | + m_refit = app.m_refit; | ||
| 513 | + m_caldb = app.m_caldb; | ||
| 514 | + m_irf = app.m_irf; | ||
| 515 | + m_outmdl = app.m_outmdl; | ||
| 516 | + m_obs = app.m_obs; | ||
| 517 | + m_max_iter = app.m_max_iter; | ||
| 518 | + m_logL = app.m_logL; | ||
| 519 | + m_opt = app.m_opt->clone(); | ||
| 520 | + | ||
| 521 | + // Return | ||
| 522 | + return; | ||
| 523 | +} | ||
| 524 | + | ||
| 525 | + | ||
| 526 | +/***********************************************************************//** | ||
| 329 | * @brief Delete class members | 527 | * @brief Delete class members |
| 330 | ***************************************************************************/ | 528 | ***************************************************************************/ |
| 331 | void ctlike::free_members(void) | 529 | void ctlike::free_members(void) |
| 332 | { | 530 | { |
| 333 | // Free members | 531 | // Free members |
| 532 | + if (m_opt != NULL) delete m_opt; | ||
| 533 | + | ||
| 534 | + // Mark pointers as free | ||
| 535 | + m_opt = NULL; | ||
| 536 | + | ||
| 537 | + // Write separator into logger | ||
| 538 | + if (logTerse()) | ||
| 539 | + log << std::endl; | ||
| 334 | 540 | ||
| 335 | // Return | 541 | // Return |
| 336 | return; | 542 | return; |
src/ctlike/ctlike.hpp
| @@ -12,7 +12,7 @@ | @@ -12,7 +12,7 @@ | ||
| 12 | ***************************************************************************/ | 12 | ***************************************************************************/ |
| 13 | /** | 13 | /** |
| 14 | * @file ctlike.hpp | 14 | * @file ctlike.hpp |
| 15 | - * @brief CTA maximum likelihood tool definition | 15 | + * @brief CTA maximum likelihood tool interface definition |
| 16 | * @author J. Knodlseder | 16 | * @author J. Knodlseder |
| 17 | */ | 17 | */ |
| 18 | 18 | ||
| @@ -26,7 +26,7 @@ | @@ -26,7 +26,7 @@ | ||
| 26 | 26 | ||
| 27 | /* __Definitions _________________________________________________________ */ | 27 | /* __Definitions _________________________________________________________ */ |
| 28 | #define CTLIKE_NAME "ctlike" | 28 | #define CTLIKE_NAME "ctlike" |
| 29 | -#define CTLIKE_VERSION "00-01-00" | 29 | +#define CTLIKE_VERSION "00-02-00" |
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | /***********************************************************************//** | 32 | /***********************************************************************//** |
| @@ -38,19 +38,29 @@ class ctlike : public GApplication { | @@ -38,19 +38,29 @@ class ctlike : public GApplication { | ||
| 38 | public: | 38 | public: |
| 39 | // Constructors and destructors | 39 | // Constructors and destructors |
| 40 | ctlike(void); | 40 | ctlike(void); |
| 41 | + explicit ctlike(GObservations obs); | ||
| 41 | ctlike(int argc, char *argv[]); | 42 | ctlike(int argc, char *argv[]); |
| 42 | - ~ctlike(void); | 43 | + ctlike(const ctlike& app); |
| 44 | + virtual ~ctlike(void); | ||
| 45 | + | ||
| 46 | + // Operators | ||
| 47 | + ctlike& operator= (const ctlike& app); | ||
| 43 | 48 | ||
| 44 | // Methods | 49 | // Methods |
| 45 | - void run(void); | ||
| 46 | - void get_parameters(void); | ||
| 47 | - void optimize_lm(void); | ||
| 48 | - void unbinned(const std::string& evfile); | ||
| 49 | - void binned(const std::string& cntmap); | 50 | + void clear(void); |
| 51 | + void execute(void); | ||
| 52 | + void run(void); | ||
| 53 | + void save(void); | ||
| 54 | + GObservations& obs(void) { return m_obs; } | ||
| 55 | + void get_parameters(void); | ||
| 56 | + void optimize_lm(void); | ||
| 57 | + void load_unbinned(const std::string& evfile); | ||
| 58 | + void load_binned(const std::string& cntmap); | ||
| 50 | 59 | ||
| 51 | protected: | 60 | protected: |
| 52 | // Protected methods | 61 | // Protected methods |
| 53 | void init_members(void); | 62 | void init_members(void); |
| 63 | + void copy_members(const ctlike& app); | ||
| 54 | void free_members(void); | 64 | void free_members(void); |
| 55 | 65 | ||
| 56 | // User parameters | 66 | // User parameters |
| @@ -59,18 +69,10 @@ protected: | @@ -59,18 +69,10 @@ protected: | ||
| 59 | bool m_refit; //!< Refitting | 69 | bool m_refit; //!< Refitting |
| 60 | std::string m_caldb; //!< Calibration database | 70 | std::string m_caldb; //!< Calibration database |
| 61 | std::string m_irf; //!< Instrument response functions | 71 | std::string m_irf; //!< Instrument response functions |
| 62 | - std::string m_srcmdl; //!< Source model XML file | ||
| 63 | std::string m_outmdl; //!< Source model output XML file | 72 | std::string m_outmdl; //!< Source model output XML file |
| 64 | - GModels m_models; //!< Source models | ||
| 65 | - GObservations m_obs; //!< Observations | ||
| 66 | - | ||
| 67 | - // Unbinned likelihood parameters | ||
| 68 | - std::string m_evfile; //!< Events file | ||
| 69 | 73 | ||
| 70 | - // Binned likelihood parameters | ||
| 71 | - std::string m_cntmap; //!< Counts map | ||
| 72 | - | ||
| 73 | - // Internal parameters | 74 | + // Members |
| 75 | + GObservations m_obs; //!< Observations | ||
| 74 | int m_max_iter; //!< Maximum number of iterations | 76 | int m_max_iter; //!< Maximum number of iterations |
| 75 | double m_logL; //!< Maximum log likelihood | 77 | double m_logL; //!< Maximum log likelihood |
| 76 | GOptimizer* m_opt; //!< Optimizer | 78 | GOptimizer* m_opt; //!< Optimizer |
src/ctlike/main.cpp
| 1 | /*************************************************************************** | 1 | /*************************************************************************** |
| 2 | * ctlike - CTA maximum likelihood tool main code * | 2 | * ctlike - CTA maximum likelihood tool main code * |
| 3 | * ----------------------------------------------------------------------- * | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010 by Jurgen Knodlseder * | 4 | + * copyright (C) 2010-2011 by Jurgen Knodlseder * |
| 5 | * ----------------------------------------------------------------------- * | 5 | * ----------------------------------------------------------------------- * |
| 6 | * * | 6 | * * |
| 7 | * This program is free software; you can redistribute it and/or modify * | 7 | * This program is free software; you can redistribute it and/or modify * |
| @@ -20,7 +20,7 @@ | @@ -20,7 +20,7 @@ | ||
| 20 | #ifdef HAVE_CONFIG_H | 20 | #ifdef HAVE_CONFIG_H |
| 21 | #include <config.h> | 21 | #include <config.h> |
| 22 | #endif | 22 | #endif |
| 23 | -#include <stdio.h> | 23 | +#include <cstdio> |
| 24 | #include "ctlike.hpp" | 24 | #include "ctlike.hpp" |
| 25 | 25 | ||
| 26 | 26 | ||
| @@ -29,6 +29,9 @@ | @@ -29,6 +29,9 @@ | ||
| 29 | * | 29 | * |
| 30 | * @param[in] argc Number of arguments | 30 | * @param[in] argc Number of arguments |
| 31 | * @param[in] argv Arguments | 31 | * @param[in] argv Arguments |
| 32 | + * | ||
| 33 | + * This is the main entry point of the ctlike application. It allocates a | ||
| 34 | + * ctlike object and executes the application. | ||
| 32 | ***************************************************************************/ | 35 | ***************************************************************************/ |
| 33 | int main (int argc, char *argv[]) | 36 | int main (int argc, char *argv[]) |
| 34 | { | 37 | { |
| @@ -40,7 +43,10 @@ int main (int argc, char *argv[]) | @@ -40,7 +43,10 @@ int main (int argc, char *argv[]) | ||
| 40 | 43 | ||
| 41 | // Run application | 44 | // Run application |
| 42 | try { | 45 | try { |
| 43 | - application.run(); | 46 | + // Execute application |
| 47 | + application.execute(); | ||
| 48 | + | ||
| 49 | + // Signal success | ||
| 44 | rc = 0; | 50 | rc = 0; |
| 45 | } | 51 | } |
| 46 | catch (std::exception &e) { | 52 | catch (std::exception &e) { |
| @@ -48,7 +54,7 @@ int main (int argc, char *argv[]) | @@ -48,7 +54,7 @@ int main (int argc, char *argv[]) | ||
| 48 | // Extract error message | 54 | // Extract error message |
| 49 | std::string message = e.what(); | 55 | std::string message = e.what(); |
| 50 | std::string signal = "*** ERROR encounterted in the execution of" | 56 | std::string signal = "*** ERROR encounterted in the execution of" |
| 51 | - " ctlike. Run aborted ..."; | 57 | + " ctlike. Run aborted ..."; |
| 52 | 58 | ||
| 53 | // Write error in logger | 59 | // Write error in logger |
| 54 | application.log << signal << std::endl; | 60 | application.log << signal << std::endl; |