Commit 46feb7955ce9a4d68e3abdf0ca2d663d4782a9af
1 parent
2cc87dd0
Supports now also reading of observations from an observation definition XML file.
Binned and unbinned analysis mode is now automatically detected from the input file type. The method parameter has been removed, and a infile parameter has been introduced instead of the old evfile and cntfile parameters.
Showing
1 changed file
with
68 additions
and
104 deletions
src/ctlike/ctlike.cpp
| 1 | 1 | /*************************************************************************** |
| 2 | 2 | * ctlike - CTA maximum likelihood tool * |
| 3 | 3 | * ----------------------------------------------------------------------- * |
| 4 | - * copyright (C) 2010-2011 by Jurgen Knodlseder * | |
| 4 | + * copyright (C) 2010-2012 by Jurgen Knodlseder * | |
| 5 | 5 | * ----------------------------------------------------------------------- * |
| 6 | 6 | * * |
| 7 | 7 | * This program is free software: you can redistribute it and/or modify * |
| ... | ... | @@ -229,8 +229,9 @@ void ctlike::execute(void) |
| 229 | 229 | void ctlike::run(void) |
| 230 | 230 | { |
| 231 | 231 | // Switch screen logging on in debug mode |
| 232 | - if (logDebug()) | |
| 232 | + if (logDebug()) { | |
| 233 | 233 | log.cout(true); |
| 234 | + } | |
| 234 | 235 | |
| 235 | 236 | // Get parameters |
| 236 | 237 | get_parameters(); |
| ... | ... | @@ -244,10 +245,12 @@ void ctlike::run(void) |
| 244 | 245 | // Write observation(s) into logger |
| 245 | 246 | if (logTerse()) { |
| 246 | 247 | log << std::endl; |
| 247 | - if (m_obs.size() > 1) | |
| 248 | + if (m_obs.size() > 1) { | |
| 248 | 249 | log.header1("Observations"); |
| 249 | - else | |
| 250 | + } | |
| 251 | + else { | |
| 250 | 252 | log.header1("Observation"); |
| 253 | + } | |
| 251 | 254 | log << m_obs << std::endl; |
| 252 | 255 | } |
| 253 | 256 | |
| ... | ... | @@ -283,8 +286,9 @@ void ctlike::save(void) |
| 283 | 286 | m_outmdl = (*this)["outmdl"].value(); |
| 284 | 287 | |
| 285 | 288 | // Write results out as XML model |
| 286 | - if (toupper(m_outmdl) != "NONE") | |
| 289 | + if (toupper(m_outmdl) != "NONE") { | |
| 287 | 290 | m_obs.models().save(m_outmdl); |
| 291 | + } | |
| 288 | 292 | |
| 289 | 293 | // Return |
| 290 | 294 | return; |
| ... | ... | @@ -294,76 +298,88 @@ void ctlike::save(void) |
| 294 | 298 | /***********************************************************************//** |
| 295 | 299 | * @brief Get application parameters |
| 296 | 300 | * |
| 297 | - * GException::par_error | |
| 298 | - * Invalid analysis method specified (neither BINNED nor UNBINNED). | |
| 299 | - * | |
| 300 | 301 | * Get all required task parameters from the parameter file or (if specified) |
| 301 | 302 | * by querying the user. Observation dependent parameters will only be read |
| 302 | 303 | * if the observation container is actually empty. Observation dependent |
| 303 | 304 | * parameters are: |
| 304 | - * "method" (analysis method), | |
| 305 | 305 | * "stat" (statistics to be used for observation), |
| 306 | 306 | * "caldb" (calibration database), |
| 307 | - * "irf" (instrument response function), | |
| 308 | - * "evfile" (event file name), and | |
| 309 | - * "cntmap" (counts map file name). | |
| 307 | + * "irf" (instrument response function), and | |
| 308 | + * "infile" (input file name). | |
| 310 | 309 | * The model will only be loaded if no model components exist in the |
| 311 | 310 | * observation container. |
| 311 | + * | |
| 312 | + * This method handles both loading of FITS files and of handling XML | |
| 313 | + * observation definition files. | |
| 312 | 314 | ***************************************************************************/ |
| 313 | 315 | void ctlike::get_parameters(void) |
| 314 | 316 | { |
| 315 | - // If there is are no models associated with the observations then | |
| 316 | - // load now the model definition | |
| 317 | - if (m_obs.models().size() == 0) { | |
| 317 | + // If there are no observations in container then add a single CTA | |
| 318 | + // observation using the parameters from the parameter file | |
| 319 | + if (m_obs.size() == 0) { | |
| 318 | 320 | |
| 319 | - // Get models XML filename | |
| 320 | - std::string filename = (*this)["srcmdl"].filename(); | |
| 321 | + // Allocate CTA observation | |
| 322 | + GCTAObservation obs; | |
| 321 | 323 | |
| 322 | - // Setup models for optimizing. | |
| 323 | - m_obs.models(GModels(filename)); | |
| 324 | + // Get event file name | |
| 325 | + std::string filename = (*this)["infile"].filename(); | |
| 324 | 326 | |
| 325 | - } // endif: no models were associated with observations | |
| 327 | + // Try first to open as unbinned FITS file | |
| 328 | + try { | |
| 326 | 329 | |
| 327 | - // If there are no observations in container then add a single CTA | |
| 328 | - // observation using the parameters from the parameter file | |
| 329 | - if (m_obs.size() == 0) { | |
| 330 | + // Determine whether FITS file has EVENTS extension | |
| 331 | + GFits file(filename); | |
| 332 | + bool is_unbinned = file.hashdu("EVENTS"); | |
| 333 | + file.close(); | |
| 330 | 334 | |
| 331 | - // Get observation parameters | |
| 332 | - m_method = toupper((*this)["method"].string()); | |
| 333 | - m_stat = toupper((*this)["stat"].string()); | |
| 334 | - m_caldb = (*this)["caldb"].string(); | |
| 335 | - m_irf = (*this)["irf"].string(); | |
| 335 | + // If FITS file has an events header then load as unbinned | |
| 336 | + if (is_unbinned) { | |
| 337 | + obs.load_unbinned(filename); | |
| 338 | + } | |
| 336 | 339 | |
| 337 | - // Case A: set-up unbinned CTA observation | |
| 338 | - if (m_method == "UNBINNED") { | |
| 340 | + // ... otherwise load as binned | |
| 341 | + else { | |
| 342 | + obs.load_binned(filename); | |
| 343 | + } | |
| 339 | 344 | |
| 340 | - // Get event file name | |
| 341 | - std::string filename = (*this)["evfile"].filename(); | |
| 345 | + // Get task parameters for event file loading | |
| 346 | + m_stat = toupper((*this)["stat"].string()); | |
| 347 | + m_caldb = (*this)["caldb"].string(); | |
| 348 | + m_irf = (*this)["irf"].string(); | |
| 342 | 349 | |
| 343 | - // Load and append unbinned CTA observation | |
| 344 | - load_unbinned(filename); | |
| 350 | + // Set statistics | |
| 351 | + obs.statistics(m_stat); | |
| 345 | 352 | |
| 346 | - } // endif: unbinned analysis mode | |
| 353 | + // Set reponse | |
| 354 | + obs.response(m_irf, m_caldb); | |
| 347 | 355 | |
| 348 | - // Case B: set-up binned CTA observation | |
| 349 | - else if (m_method == "BINNED") { | |
| 356 | + // Append observation to container | |
| 357 | + m_obs.append(obs); | |
| 350 | 358 | |
| 351 | - // Get counts map file name | |
| 352 | - std::string filename = (*this)["cntmap"].filename(); | |
| 359 | + } | |
| 353 | 360 | |
| 354 | - // Load and append binned CTA observation | |
| 355 | - load_binned(filename); | |
| 361 | + // ... otherwise try to open as XML file | |
| 362 | + catch (GException::fits_open_error) { | |
| 356 | 363 | |
| 357 | - } // endif: binned analysis mode | |
| 364 | + // Load observations from XML file | |
| 365 | + m_obs.load(filename); | |
| 358 | 366 | |
| 359 | - // ... otherwise signal an invalid analysis method | |
| 360 | - else { | |
| 361 | - throw GException::par_error(G_GET_PARAMETERS, "method", | |
| 362 | - "only \"BINNED\" or \"UNBINNED\" supported."); | |
| 363 | 367 | } |
| 364 | 368 | |
| 365 | 369 | } // endif: there was no observation in the container |
| 366 | 370 | |
| 371 | + // If there is are no models associated with the observations then | |
| 372 | + // load now the model definition | |
| 373 | + if (m_obs.models().size() == 0) { | |
| 374 | + | |
| 375 | + // Get models XML filename | |
| 376 | + std::string filename = (*this)["srcmdl"].filename(); | |
| 377 | + | |
| 378 | + // Setup models for optimizing. | |
| 379 | + m_obs.models(GModels(filename)); | |
| 380 | + | |
| 381 | + } // endif: no models were associated with observations | |
| 382 | + | |
| 367 | 383 | // Get standard parameters |
| 368 | 384 | m_refit = (*this)["refit"].boolean(); |
| 369 | 385 | |
| ... | ... | @@ -404,8 +420,9 @@ void ctlike::optimize_lm(void) |
| 404 | 420 | m_obs.optimize(*opt); |
| 405 | 421 | |
| 406 | 422 | // Optionally refit |
| 407 | - if (m_refit) | |
| 423 | + if (m_refit) { | |
| 408 | 424 | m_obs.optimize(*opt); |
| 425 | + } | |
| 409 | 426 | |
| 410 | 427 | // Store maximum log likelihood value |
| 411 | 428 | m_logL = -(opt->value()); |
| ... | ... | @@ -423,60 +440,6 @@ void ctlike::optimize_lm(void) |
| 423 | 440 | } |
| 424 | 441 | |
| 425 | 442 | |
| 426 | -/***********************************************************************//** | |
| 427 | - * @brief Load unbinned observation and append it to observations container | |
| 428 | - * | |
| 429 | - * @param[in] evfile Events file name. | |
| 430 | - ***************************************************************************/ | |
| 431 | -void ctlike::load_unbinned(const std::string& evfile) | |
| 432 | -{ | |
| 433 | - // Declare CTA observation | |
| 434 | - GCTAObservation obs; | |
| 435 | - | |
| 436 | - // Set statistics | |
| 437 | - obs.statistics(m_stat); | |
| 438 | - | |
| 439 | - // Load data | |
| 440 | - obs.load_unbinned(evfile); | |
| 441 | - | |
| 442 | - // Set reponse | |
| 443 | - obs.response(m_irf, m_caldb); | |
| 444 | - | |
| 445 | - // Append observation to contained | |
| 446 | - m_obs.append(obs); | |
| 447 | - | |
| 448 | - // Return | |
| 449 | - return; | |
| 450 | -} | |
| 451 | - | |
| 452 | - | |
| 453 | -/***********************************************************************//** | |
| 454 | - * @brief Load binned observation and append it to observations container | |
| 455 | - * | |
| 456 | - * @param[in] cntmap Counts map file name. | |
| 457 | - ***************************************************************************/ | |
| 458 | -void ctlike::load_binned(const std::string& cntmap) | |
| 459 | -{ | |
| 460 | - // Declare CTA observation | |
| 461 | - GCTAObservation obs; | |
| 462 | - | |
| 463 | - // Set statistics | |
| 464 | - obs.statistics(m_stat); | |
| 465 | - | |
| 466 | - // Load data | |
| 467 | - obs.load_binned(cntmap); | |
| 468 | - | |
| 469 | - // Set reponse | |
| 470 | - obs.response(m_irf, m_caldb); | |
| 471 | - | |
| 472 | - // Append observation to contained | |
| 473 | - m_obs.append(obs); | |
| 474 | - | |
| 475 | - // Return | |
| 476 | - return; | |
| 477 | -} | |
| 478 | - | |
| 479 | - | |
| 480 | 443 | /*========================================================================== |
| 481 | 444 | = = |
| 482 | 445 | = Private methods = |
| ... | ... | @@ -489,7 +452,7 @@ void ctlike::load_binned(const std::string& cntmap) |
| 489 | 452 | void ctlike::init_members(void) |
| 490 | 453 | { |
| 491 | 454 | // Initialise members |
| 492 | - m_method.clear(); | |
| 455 | + //m_method.clear(); | |
| 493 | 456 | m_stat.clear(); |
| 494 | 457 | m_caldb.clear(); |
| 495 | 458 | m_irf.clear(); |
| ... | ... | @@ -517,7 +480,7 @@ void ctlike::init_members(void) |
| 517 | 480 | void ctlike::copy_members(const ctlike& app) |
| 518 | 481 | { |
| 519 | 482 | // Copy attributes |
| 520 | - m_method = app.m_method; | |
| 483 | + //m_method = app.m_method; | |
| 521 | 484 | m_stat = app.m_stat; |
| 522 | 485 | m_refit = app.m_refit; |
| 523 | 486 | m_caldb = app.m_caldb; |
| ... | ... | @@ -546,8 +509,9 @@ void ctlike::free_members(void) |
| 546 | 509 | m_opt = NULL; |
| 547 | 510 | |
| 548 | 511 | // Write separator into logger |
| 549 | - if (logTerse()) | |
| 512 | + if (logTerse()) { | |
| 550 | 513 | log << std::endl; |
| 514 | + } | |
| 551 | 515 | |
| 552 | 516 | // Return |
| 553 | 517 | return; | ... | ... |