Commit 60fca9e5d0e10cc6c4c3c7deb40c5926b32c85e2

Authored by Jürgen Knödlseder
1 parent 581a934b

Add ctool::setup_models() method and use ctool::setup_observations() method (#1828)

pyext/ctool.i
... ... @@ -113,8 +113,12 @@ public:
113 113 // Protected methods
114 114 const bool& read_ahead(void) const;
115 115 const GTimeReference& time_reference(void) const;
116   - GObservations get_observations(const bool& get_response = true);
117   - void setup_observations(GObservations& obs);
  116 +
  117 + // Protected high-level setup methods
  118 + void setup_observations(GObservations& obs, const bool& response = true,
  119 + const bool& list = true,
  120 + const bool& cube = true);
  121 + void setup_models(GObservations& obs, const std::string& name = "");
118 122  
119 123 // Protected methods that create objects from user parameters
120 124 GEbounds create_ebounds(void);
... ... @@ -142,6 +146,7 @@ public:
142 146 const std::vector<bool>& edisp) const;
143 147 void set_obs_response(GCTAObservation* obs);
144 148 void set_obs_bounds(GObservations& obs);
  149 + GObservations get_observations(const bool& get_response = true);
145 150 GSkyDir get_mean_pointing(const GObservations& obs);
146 151 size_t get_current_rss(void);
147 152 std::string get_obs_header(const GObservation* obs);
... ...
src/ctbin/ctbin.cpp
... ... @@ -437,20 +437,9 @@ void ctbin::free_members(void)
437 437 ***************************************************************************/
438 438 void ctbin::get_parameters(void)
439 439 {
440   - // If there are no observations in container then load them via user
441   - // parameters
442   - if (m_obs.size() == 0) {
443   -
444   - // Throw exception if no input observation file is given
445   - require_inobs(G_GET_PARAMETERS);
446   -
447   - // Throw exception if counts cube is given
448   - require_inobs_nocube(G_GET_PARAMETERS);
449   -
450   - // Get observation container without response (not needed)
451   - m_obs = get_observations(false);
452   -
453   - } // endif: there was no observation in the container
  440 + // Setup observations from "inobs" parameter. Do not request response
  441 + // information and do not accept counts cubes.
  442 + setup_observations(m_obs, false, true, false);
454 443  
455 444 // Create an event cube based on task parameters
456 445 GCTAEventCube cube = create_cube(m_obs);
... ...
src/ctbkgcube/ctbkgcube.cpp
... ... @@ -473,26 +473,8 @@ void ctbkgcube::free_members(void)
473 473 ***************************************************************************/
474 474 void ctbkgcube::get_parameters(void)
475 475 {
476   - // If there are no observations in container then load them via user
477   - // parameters
478   - if (m_obs.size() == 0) {
479   -
480   - // Throw exception if no input observation file is given
481   - require_inobs(G_GET_PARAMETERS);
482   -
483   - // Throw exception if counts cube is given
484   - require_inobs_nocube(G_GET_PARAMETERS);
485   -
486   - // Build observation container
487   - m_obs = get_observations();
488   -
489   - } // endif: there was no observation in the container
490   -
491   - // ... otherwise add response information and energy boundaries in case
492   - // that they are missing
493   - else {
494   - setup_observations(m_obs);
495   - }
  476 + // Setup observations from "inobs" parameter. Do not accept counts cubes.
  477 + setup_observations(m_obs, true, true, false);
496 478  
497 479 // Get the incube filename
498 480 std::string incube = (*this)["incube"].filename();
... ...
src/ctbutterfly/ctbutterfly.cpp
... ... @@ -584,37 +584,13 @@ void ctbutterfly::free_members(void)
584 584 ***************************************************************************/
585 585 void ctbutterfly::get_parameters(void)
586 586 {
587   - // If there are no observations in container then load them via user
588   - // parameters
589   - if (m_obs.size() == 0) {
590   -
591   - // Throw exception if no input observation file is given
592   - require_inobs(G_GET_PARAMETERS);
593   -
594   - // Build observation container
595   - m_obs = get_observations();
596   -
597   - } // endif: there was no observation in the container
598   -
599   - // ... otherwise add response information and energy boundaries in case
600   - // that they are missing
601   - else {
602   - setup_observations(m_obs);
603   - }
604   -
605   - // If there is are no models associated with the observations then
606   - // load now the model definition
607   - if (m_obs.models().size() == 0) {
608   -
609   - // Get models XML filename
610   - std::string filename = (*this)["inmodel"].filename();
611   -
612   - // Setup models for optimizing.
613   - m_obs.models(GModels(filename));
614   -
615   - } // endif: no models were associated with observations
  587 + // Setup observations from "inobs" parameter
  588 + setup_observations(m_obs);
  589 +
  590 + // Setup models from "inmodel" parameter
  591 + setup_models(m_obs, (*this)["srcname"].string());
616 592  
617   - // Get name of test source and check container for this name
  593 + // Get name of test source
618 594 m_srcname = (*this)["srcname"].string();
619 595  
620 596 // Check model name and type
... ...
src/ctcubemask/ctcubemask.cpp
... ... @@ -36,7 +36,6 @@
36 36 /* __ Method name definitions ____________________________________________ */
37 37 #define G_RUN "ctcubemask::run()"
38 38 #define G_APPLY_MASK "ctcubemask::apply_mask(GCTAObservation*)"
39   -#define G_GET_PARAMETERS "ctcubemask::get_parameters()"
40 39  
41 40 /* __ Debug definitions __________________________________________________ */
42 41  
... ... @@ -439,9 +438,6 @@ void ctcubemask::free_members(void)
439 438 /***********************************************************************//**
440 439 * @brief Get application parameters
441 440 *
442   - * @exception GException::invalid_value
443   - * Parameter "inobs" is required for ctcubemask.
444   - *
445 441 * Get all task parameters from parameter file or (if required) by querying
446 442 * the user.
447 443 *
... ... @@ -455,20 +451,9 @@ void ctcubemask::get_parameters(void)
455 451 m_select_energy = true;
456 452 m_select_roi = true;
457 453  
458   - // If there are no observations in container then load them via user
459   - // parameters
460   - if (m_obs.size() == 0) {
461   -
462   - // Throw exception if no input observation file is given
463   - require_inobs(G_GET_PARAMETERS);
464   -
465   - // Throw exception if event list is given
466   - require_inobs_nolist(G_GET_PARAMETERS);
467   -
468   - // Build observation container without response (not needed)
469   - m_obs = get_observations(false);
470   -
471   - } // endif: there was no observation in the container
  454 + // Setup observations from "inobs" parameter. Do not request response
  455 + // information and do not accept event lists.
  456 + setup_observations(m_obs, false, false, true);
472 457  
473 458 // Get parameters
474 459 m_regfile = (*this)["regfile"].filename();
... ...
src/ctedispcube/ctedispcube.cpp
... ... @@ -346,26 +346,8 @@ void ctedispcube::free_members(void)
346 346 ***************************************************************************/
347 347 void ctedispcube::get_parameters(void)
348 348 {
349   - // If there are no observations in container then load them via user
350   - // parameters
351   - if (m_obs.size() == 0) {
352   -
353   - // Throw exception if no input observation file is given
354   - require_inobs(G_GET_PARAMETERS);
355   -
356   - // Throw exception if counts cube is given
357   - require_inobs_nocube(G_GET_PARAMETERS);
358   -
359   - // Build observation container
360   - m_obs = get_observations();
361   -
362   - } // endif: there was no observation in the container
363   -
364   - // ... otherwise add response information and energy boundaries in case
365   - // that they are missing
366   - else {
367   - setup_observations(m_obs);
368   - }
  349 + // Setup observations from "inobs" parameter. Do not accept counts cubes.
  350 + setup_observations(m_obs, true, true, false);
369 351  
370 352 // Get the incube filename
371 353 std::string incube = (*this)["incube"].filename();
... ...
src/cterror/cterror.cpp
... ... @@ -34,7 +34,6 @@
34 34 #include "GOptimizer.hpp"
35 35  
36 36 /* __ Method name definitions ____________________________________________ */
37   -#define G_GET_PARAMETERS "cterror::get_parameters()"
38 37 #define G_ERR_BISECTION "cterror::error_bisection(double&, double&)"
39 38 #define G_EVALUATE "cterror::evaluate(double&)"
40 39  
... ... @@ -455,52 +454,19 @@ void cterror::free_members(void)
455 454 /***********************************************************************//**
456 455 * @brief Get application parameters
457 456 *
458   - * @exception GException::invalid_value
459   - * Test source not found.
460   - *
461 457 * Get all task parameters from parameter file or (if required) by querying
462 458 * the user.
463 459 ***************************************************************************/
464 460 void cterror::get_parameters(void)
465 461 {
466   - // If there are no observations in container then load them via user
467   - // parameters
468   - if (m_obs.size() == 0) {
469   -
470   - // Throw exception if no input observation file is given
471   - require_inobs(G_GET_PARAMETERS);
472   -
473   - // Build observation container
474   - m_obs = get_observations();
475   -
476   - } // endif: there was no observation in the container
477   -
478   - // ... otherwise add response information and energy boundaries in case
479   - // that they are missing
480   - else {
481   - setup_observations(m_obs);
482   - }
483   -
484   - // If there are no models associated with the observations then
485   - // load now the model definition
486   - if (m_obs.models().size() == 0) {
487   -
488   - // Get models XML filename
489   - std::string filename = (*this)["inmodel"].filename();
  462 + // Setup observations from "inobs" parameter
  463 + setup_observations(m_obs);
  464 +
  465 + // Setup models from "inmodel" parameter
  466 + setup_models(m_obs, (*this)["srcname"].string());
490 467  
491   - // Setup models for optimizing.
492   - m_obs.models(GModels(filename));
493   -
494   - } // endif: no models were associated with observations
495   -
496   - // Get name of test source and check container for this name
  468 + // Get name of test source
497 469 m_srcname = (*this)["srcname"].string();
498   - if (!m_obs.models().contains(m_srcname)) {
499   - std::string msg = "Source \""+m_srcname+"\" not found in model "
500   - "container. Please add a source with that name "
501   - "or check for possible typos.";
502   - throw GException::invalid_value(G_GET_PARAMETERS, msg);
503   - }
504 470  
505 471 // Read energy dispersion flag
506 472 m_apply_edisp = (*this)["edisp"].boolean();
... ...
src/ctexpcube/ctexpcube.cpp
... ... @@ -34,7 +34,6 @@
34 34 #include "GWcs.hpp"
35 35  
36 36 /* __ Method name definitions ____________________________________________ */
37   -#define G_GET_PARAMETERS "ctexpcube::get_parameters()"
38 37 #define G_SET_FROM_CNTMAP "ctexpcube::set_from_cntmap(std::string&)"
39 38  
40 39 /* __ Debug definitions __________________________________________________ */
... ... @@ -371,26 +370,8 @@ void ctexpcube::free_members(void)
371 370 ***************************************************************************/
372 371 void ctexpcube::get_parameters(void)
373 372 {
374   - // If there are no observations in container then load them via user
375   - // parameters
376   - if (m_obs.size() == 0) {
377   -
378   - // Throw exception if no input observation file is given
379   - require_inobs(G_GET_PARAMETERS);
380   -
381   - // Throw exception if counts cube is given
382   - require_inobs_nocube(G_GET_PARAMETERS);
383   -
384   - // Build observation container
385   - m_obs = get_observations();
386   -
387   - } // endif: there was no observation in the container
388   -
389   - // ... otherwise add response information and energy boundaries in case
390   - // that they are missing
391   - else {
392   - setup_observations(m_obs);
393   - }
  373 + // Setup observations from "inobs" parameter. Do not accept counts cubes.
  374 + setup_observations(m_obs, true, true, false);
394 375  
395 376 // Get the incube filename
396 377 std::string incube = (*this)["incube"].filename();
... ...
src/ctlike/ctlike.cpp
... ... @@ -33,7 +33,6 @@
33 33 #include "GTools.hpp"
34 34  
35 35 /* __ Method name definitions ____________________________________________ */
36   -#define G_GET_PARAMETERS "ctlike::get_parameters()"
37 36  
38 37 /* __ Debug definitions __________________________________________________ */
39 38  
... ... @@ -361,23 +360,8 @@ void ctlike::save(void)
361 360 ***************************************************************************/
362 361 void ctlike::get_parameters(void)
363 362 {
364   - // If there are no observations in container then load them via user
365   - // parameters
366   - if (m_obs.size() == 0) {
367   -
368   - // Throw exception if no input observation file is given
369   - require_inobs(G_GET_PARAMETERS);
370   -
371   - // Get observation container
372   - m_obs = get_observations();
373   -
374   - } // endif: there was no observation in the container
375   -
376   - // ... otherwise add response information and energy boundaries in case
377   - // that they are missing
378   - else {
379   - setup_observations(m_obs);
380   - }
  363 + // Setup observations from "inobs" parameter
  364 + setup_observations(m_obs);
381 365  
382 366 // If only single observation is used, read statistics parameter
383 367 if (!m_use_xml) {
... ...
src/ctpsfcube/ctpsfcube.cpp
... ... @@ -34,7 +34,6 @@
34 34 #include "GWcs.hpp"
35 35  
36 36 /* __ Method name definitions ____________________________________________ */
37   -#define G_GET_PARAMETERS "ctpsfcube::get_parameters()"
38 37  
39 38 /* __ Debug definitions __________________________________________________ */
40 39  
... ... @@ -331,26 +330,8 @@ void ctpsfcube::free_members(void)
331 330 ***************************************************************************/
332 331 void ctpsfcube::get_parameters(void)
333 332 {
334   - // If there are no observations in container then load them via user
335   - // parameters
336   - if (m_obs.size() == 0) {
337   -
338   - // Throw exception if no input observation file is given
339   - require_inobs(G_GET_PARAMETERS);
340   -
341   - // Throw exception if counts cube is given
342   - require_inobs_nocube(G_GET_PARAMETERS);
343   -
344   - // Build observation container
345   - m_obs = get_observations();
346   -
347   - } // endif: there was no observation in the container
348   -
349   - // ... otherwise add response information and energy boundaries in case
350   - // that they are missing
351   - else {
352   - setup_observations(m_obs);
353   - }
  333 + // Setup observations from "inobs" parameter. Do not accept counts cubes.
  334 + setup_observations(m_obs, true, true, false);
354 335  
355 336 // Get the incube filename
356 337 std::string incube = (*this)["incube"].filename();
... ...
src/ctselect/ctselect.cpp
... ... @@ -37,7 +37,6 @@
37 37 #define G_SELECT_EVENTS "ctselect::select_events(GCTAObservation*, "\
38 38 "std::string&, std::string&, std::string&)"
39 39 #define G_SET_EBOUNDS "ctselect::set_ebounds(GCTAObservation*, GEbounds&)"
40   -#define G_GET_PARAMETERS "ctselect::get_parameters()"
41 40  
42 41 /* __ Debug definitions __________________________________________________ */
43 42  
... ... @@ -502,20 +501,9 @@ void ctselect::get_parameters(void)
502 501 m_select_roi = true;
503 502 m_select_time = true;
504 503  
505   - // If there are no observations in container then load them via user
506   - // parameters
507   - if (m_obs.size() == 0) {
508   -
509   - // Throw exception if no input observation file is given
510   - require_inobs(G_GET_PARAMETERS);
511   -
512   - // Throw exception if counts cube is given
513   - require_inobs_nocube(G_GET_PARAMETERS);
514   -
515   - // Get observation container without response (not needed)
516   - m_obs = get_observations(false);
517   -
518   - } // endif: there was no observation in the container
  504 + // Setup observations from "inobs" parameter. Do not request response
  505 + // information and do not accept counts cubes.
  506 + setup_observations(m_obs, false, true, false);
519 507  
520 508 // Get parameters
521 509 m_usepnt = (*this)["usepnt"].boolean();
... ...
src/ctskymap/ctskymap.cpp
... ... @@ -35,7 +35,6 @@
35 35 /* __ Method name definitions ____________________________________________ */
36 36 #define G_INIT_MAP "ctskymap::init_map(GCTAObservation* obs)"
37 37 #define G_BIN_EVENTS "ctskymap::bin_events(GCTAObservation*)"
38   -#define G_GET_PARAMETERS "ctskymap::get_parameters()"
39 38  
40 39 /* __ Debug definitions __________________________________________________ */
41 40  
... ... @@ -402,20 +401,9 @@ void ctskymap::free_members(void)
402 401 ***************************************************************************/
403 402 void ctskymap::get_parameters(void)
404 403 {
405   - // If there are no observations in container then load them via user
406   - // parameters
407   - if (m_obs.size() == 0) {
408   -
409   - // Throw exception if no input observation file is given
410   - require_inobs(G_GET_PARAMETERS);
411   -
412   - // Throw exception if counts cube is given
413   - require_inobs_nocube(G_GET_PARAMETERS);
414   -
415   - // Get observation container without response (not needed)
416   - m_obs = get_observations(false);
417   -
418   - } // endif: there was no observation in the container
  404 + // Setup observations from "inobs" parameter. Do not request response
  405 + // information and do not accept counts cubes.
  406 + setup_observations(m_obs, false, true, false);
419 407  
420 408 // Create sky map based on task parameters
421 409 m_skymap = create_map(m_obs);
... ...
src/cttsmap/cttsmap.cpp
... ... @@ -500,8 +500,7 @@ void cttsmap::free_members(void)
500 500 * @brief Get application parameters
501 501 *
502 502 * @exception GException::invalid_value
503   - * Test source not found or no RA/DEC parameters found for test
504   - * source.
  503 + * Test source has no RA/DEC parameters.
505 504 *
506 505 * Get all task parameters from parameter file or (if required) by querying
507 506 * the user. Most parameters are only required if no observation exists so
... ... @@ -511,44 +510,14 @@ void cttsmap::free_members(void)
511 510 ***************************************************************************/
512 511 void cttsmap::get_parameters(void)
513 512 {
514   - // If there are no observations in container then load them via user
515   - // parameters
516   - if (m_obs.size() == 0) {
  513 + // Setup observations from "inobs" parameter
  514 + setup_observations(m_obs);
  515 +
  516 + // Setup models from "inmodel" parameter
  517 + setup_models(m_obs, (*this)["srcname"].string());
517 518  
518   - // Throw exception if no input observation file is given
519   - require_inobs(G_GET_PARAMETERS);
520   -
521   - // Get observation container
522   - m_obs = get_observations();
523   -
524   - } // endif: there was no observation in the container
525   -
526   - // ... otherwise add response information and energy boundaries in case
527   - // that they are missing
528   - else {
529   - setup_observations(m_obs);
530   - }
531   -
532   - // If there is are no models associated with the observations then
533   - // load now the model definition
534   - if (m_obs.models().size() == 0) {
535   -
536   - // Get models XML filename
537   - std::string filename = (*this)["inmodel"].filename();
538   -
539   - // Setup models for optimizing.
540   - m_obs.models(GModels(filename));
541   -
542   - } // endif: no models were associated with observations
543   -
544   - // Get name of test source and check container for this name
  519 + // Get name of test source
545 520 m_srcname = (*this)["srcname"].string();
546   - if (!m_obs.models().contains(m_srcname)) {
547   - std::string msg = "Source \""+m_srcname+"\" not found in model "
548   - "container. Please add a source with that name "
549   - "or check for a possible typos.";
550   - throw GException::invalid_value(G_GET_PARAMETERS, msg);
551   - }
552 521  
553 522 // Get Model and store it as protected member
554 523 m_testsource = m_obs.models()[m_srcname]->clone();
... ...
src/ctulimit/ctulimit.cpp
... ... @@ -34,7 +34,6 @@
34 34 #include "GOptimizer.hpp"
35 35  
36 36 /* __ Method name definitions ____________________________________________ */
37   -#define G_GET_PARAMETERS "ctulimit::get_parameters()"
38 37 #define G_GET_MODEL_PARAMETER "ctulimit::get_model_parameter()"
39 38 #define G_UL_BISECTION "ctulimit::ul_bisection(double&, double&)"
40 39 #define G_EVALUATE "ctulimit::evaluate(double&)"
... ... @@ -461,46 +460,18 @@ void ctulimit::free_members(void)
461 460 /***********************************************************************//**
462 461 * @brief Get application parameters
463 462 *
464   - * @exception GException::invalid_value
465   - * Test source not found.
466   - *
467 463 * Get all task parameters from parameter file or (if required) by querying
468 464 * the user.
469 465 ***************************************************************************/
470 466 void ctulimit::get_parameters(void)
471 467 {
472   - // If there are no observations in container then load them via user
473   - // parameters
474   - if (m_obs.size() == 0) {
475   -
476   - // Throw exception if no input observation file is given
477   - require_inobs(G_GET_PARAMETERS);
478   -
479   - // Build observation container
480   - m_obs = get_observations();
481   -
482   - } // endif: there was no observation in the container
483   -
484   - // ... otherwise add response information and energy boundaries in case
485   - // that they are missing
486   - else {
487   - setup_observations(m_obs);
488   - }
489   -
490   - // If there is are no models associated with the observations then
491   - // load now the model definition
492   - if (m_obs.models().size() == 0) {
493   -
494   - // Get models XML filename
495   - std::string filename = (*this)["inmodel"].filename();
496   -
497   - // Setup models for optimizing.
498   - m_obs.models(GModels(filename));
499   -
500   - } // endif: no models were associated with observations
  468 + // Setup observations from "inobs" parameter
  469 + setup_observations(m_obs);
  470 +
  471 + // Setup models from "inmodel" parameter
  472 + setup_models(m_obs, (*this)["srcname"].string());
501 473  
502   - // Get name of test source. The get_model_parameter() method will check
503   - // where a source with the given name exists in the model container.
  474 + // Get name of test source
504 475 m_srcname = (*this)["srcname"].string();
505 476  
506 477 // Get relevant model and parameter for upper limit computation
... ...
src/support/ctool.cpp
... ... @@ -50,6 +50,7 @@
50 50  
51 51 /* __ Method name definitions ____________________________________________ */
52 52 #define G_SETUP_OBSERVATION "ctool::setup_observations(GObservations&)"
  53 +#define SETUP_MODELS "ctool::setup_models(GObservations&, std::string&)"
53 54 #define G_GET_MEAN_POINTING "ctool::get_mean_pointing(GObservations&)"
54 55 #define G_CREATE_EBOUNDS "ctool::create_ebounds()"
55 56 #define G_RESTORE_EDISP "ctool::restore_edisp(GObservations&, "\
... ... @@ -304,189 +305,194 @@ void ctool::free_members(void)
304 305  
305 306  
306 307 /***********************************************************************//**
307   - * @brief Get observation container
  308 + * @brief Setup observation container
308 309 *
309   - * @param[in] get_response Indicates whether response information should
310   - * be loaded (default: true)
  310 + * @param[in] obs Observation container
  311 + * @param[in] response Require response
  312 + * @param[in] list Accept event list as "inobs" parameter
  313 + * @param[in] cube Accept counts cube as "inobs" parameter
311 314 *
312   - * Get an observation container according to the user parameters. The method
313   - * supports loading of a individual FITS file or an observation definition
314   - * file in XML format. If the input filename is empty, parameters are read
315   - * to build a CTA observation from scratch.
  315 + * @exception GException::invalid_value
  316 + * Invalid "inobs" parameter encountered.
  317 + *
  318 + * Setup an observation container by extracting all required missing
  319 + * information from user parameters.
  320 + *
  321 + * If the observation container @p obs is empty, the method will extract the
  322 + * filename from the "inobs" parameter, and if the filename is neither empty
  323 + * nor "NONE", it will load the observation container from the specified file.
  324 + * Otherwise, the method will throw an exception.
  325 + *
  326 + * If the "inobs" file is a FITS file, and depending on the information that
  327 + * is found in the FITS file, the method will append a single CTA observation
  328 + * to the observation container, containing either an event list or a counts
  329 + * cube. It will set the m_use_xml member to false to signal that no
  330 + * observation XML file should be used for saving. The @p list and @p cube
  331 + * parameters can be used to specify whether the method actually should accept
  332 + * event lists or counts cube. If it shouldn't the method will throw an
  333 + * exception.
  334 + *
  335 + * If the "inobs" file is not a FITS file, the method assumes that an
  336 + * observation definition XML file has been specified, and will load that
  337 + * file into the observation container. It will set the m_use_xml member to
  338 + * true to signal that an observation XML file should be used for saving. No
  339 + * checking on event list or counts cubes will be done on the observation
  340 + * container.
  341 + *
  342 + * By default, the method will also setup the response for all CTA
  343 + * observations in the container. In case that no response information is
  344 + * required, the @p response argument should be set to @p false. See the
  345 + * set_response() method for details.
  346 + *
  347 + *
  348 + * The method will also setup the observation boundaries for all CTA
  349 + * observations in the container that contain event lists. For details, see
  350 + * the set_obs_bounds() method.
316 351 ***************************************************************************/
317   -GObservations ctool::get_observations(const bool& get_response)
  352 +void ctool::setup_observations(GObservations& obs,
  353 + const bool& response,
  354 + const bool& list,
  355 + const bool& cube)
318 356 {
319   - // Initialise empty observation container
320   - GObservations obs;
321   -
322   - // Get the filename from the input parameters
323   - std::string filename = (*this)["inobs"].filename();
324   -
325   - // If no observation definition file has been specified then read all
326   - // parameters that are necessary to create an observation from scratch
327   - if ((filename == "NONE") || (gammalib::strip_whitespace(filename) == "")) {
328   -
329   - // Setup a new CTA observation
330   - GCTAObservation cta_obs = create_cta_obs();
331   -
332   - // Get response if required
333   - if (get_response) {
334   -
335   - // Set response
336   - set_obs_response(&cta_obs);
337   -
338   - } // endif: response was required
339   -
340   - // Append observation to container
341   - obs.append(cta_obs);
342   -
343   - } // endif: filename was "NONE" or ""
  357 + // Load observations if there are none in the container
  358 + if (obs.size() == 0) {
344 359  
345   - // ... otherwise we have a file name
346   - else {
  360 + // Get the filename from the "inobs" parameter
  361 + GFilename filename = (*this)["inobs"].filename();
347 362  
348   - // If file is a FITS file then create an empty CTA observation
349   - // and load file into observation
350   - if (GFilename(filename).is_fits()) {
  363 + // Throw an exception if the "inobs" parameter is not a valid
  364 + // filename
  365 + if ((gammalib::toupper(filename.url()) == "NONE") ||
  366 + filename.is_empty()) {
  367 + std::string msg = "The \"inobs\" parameter \""+filename.url()+
  368 + "\" is not a valid filename. Please specify "
  369 + "a valid event list, counts cube or "
  370 + "observation definition XML file.";
  371 + throw GException::invalid_value(G_SETUP_OBSERVATION, msg);
  372 + }
351 373  
352   - // Allocate empty CTA observation
353   - GCTAObservation cta_obs;
  374 + // If file does not exist then throw an exceptions
  375 + if (!filename.exists()) {
  376 + std::string msg = "The \"inobs\" parameter \""+filename.url()+
  377 + "\" specifies a file that does not "
  378 + "exist. Please specify a valid event "
  379 + "list, counts cube or observation "
  380 + "definition XML file.";
  381 + throw GException::invalid_value(G_SETUP_OBSERVATION, msg);
  382 + }
354 383  
355   - // Load data
356   - cta_obs.load(filename);
  384 + // If the file is a FITS file then load it into a CTA
  385 + // observation and append that observation to the container ...
  386 + else if (filename.is_fits()) {
357 387  
358   - // Get response if required
359   - if (get_response) {
  388 + // Load CTA observation
  389 + GCTAObservation cta(filename);
360 390  
361   - // Set response
362   - set_obs_response(&cta_obs);
  391 + // If no event list is accepted but an event list has been
  392 + // loaded then throw an exception
  393 + if (!list && cta.eventtype() == "EventList") {
  394 + std::string msg = "The \"inobs\" parameter \""+filename.url()+
  395 + "\" specifies an event list, but this "
  396 + "tool does not accept event lists.";
  397 + throw GException::invalid_value(G_SETUP_OBSERVATION, msg);
  398 + }
363 399  
364   - } // endif: response was required
  400 + // If no counts cube is accepted but a conts cube has been
  401 + // loaded then throw an exception
  402 + if (!cube && cta.eventtype() == "CountsCube") {
  403 + std::string msg = "The \"inobs\" parameter \""+filename.url()+
  404 + "\" specifies a counts cube, but this "
  405 + "tool does not accept counts cubes.";
  406 + throw GException::invalid_value(G_SETUP_OBSERVATION, msg);
  407 + }
365 408  
366   - // Append observation to container
367   - obs.append(cta_obs);
  409 + // Append CTA observation to observation container
  410 + obs.append(cta);
368 411  
369 412 // Signal that no XML file should be used for storage
370 413 m_use_xml = false;
371 414  
372   - }
  415 + } // endelse: file was a FITS file
373 416  
374   - // ... otherwise load file into observation container
  417 + // ... otherwise it is assumed that the file is an observation
  418 + // definition XML file and the file is loaded into the
  419 + // observation container
375 420 else {
376 421  
377   - // Load observations from XML file
  422 + // Load observation definition file
378 423 obs.load(filename);
379 424  
380   - // Get response if required
381   - if (get_response) {
382   -
383   - // For all observations that have no response, set the response
384   - // from the task parameters
385   - set_response(obs);
386   -
387   - } // endif: response was required
388   -
389   - // Set observation boundary parameters (emin, emax, rad)
390   - set_obs_bounds(obs);
391   -
392 425 // Signal that XML file should be used for storage
393 426 m_use_xml = true;
394 427  
395 428 } // endelse: file was an XML file
396 429  
  430 + } // endif: there were no observations in the container
  431 +
  432 + // Setup the response for all CTA observations in the observation
  433 + // container if response information is required
  434 + if (response) {
  435 + set_response(obs);
397 436 }
398 437  
399   - // Return observation container
400   - return obs;
  438 + // Setup boundaries for all CTA observations containing event lists
  439 + set_obs_bounds(obs);
  440 +
  441 + // Return
  442 + return;
401 443 }
402 444  
403 445  
404 446 /***********************************************************************//**
405   - * @brief Setup observation container
  447 + * @brief Setup model container
406 448 *
407 449 * @param[in] obs Observation container
  450 + * @param[in] name Mandatory model name
408 451 *
409 452 * @exception GException::invalid_value
410   - * Invalid "inobs" parameter encountered.
  453 + * Mandatory model name not found in observation container.
411 454 *
412   - * Setup an observation container by appending all required information that
413   - * is missing using user parameters.
  455 + * Setup a model container by loading the models from the "inmodel"
  456 + * parameter.
414 457 *
415   - * If the observation container @p obs is empty, the method will extract the
416   - * filename from the "inobs" parameter, and if the filename is neither empty
417   - * nor "NONE", will load the observation container from the specified file.
418   - * If the file is a FITS file, and dependent on the information that is found
419   - * in the FITS file, the method will append a single CTA observation to the
420   - * observation container, containing either an event list or a counts cube.
421   - * Otherwise, the method assumes that the file is an observation definition
422   - * XML file and will load that file into the observation container.
423   - *
424   - * If the filename is empty or "NONE", the method will throw an exception.
425   - *
426   - * The method will then setup the response for all CTA observations in the
427   - * container (see the set_response() method for more information).
428   - *
429   - * The method will furthermore setup the observation boundaries for all CTA
430   - * observations in the container that contain event lists (see the
431   - * set_obs_bounds() method for more information).
  458 + * If the model container in the observation container @p obs is empty, the
  459 + * method will extract the model container filename from the "inmodel"
  460 + * parameter, load the model container and assign it to the observations
  461 + * container.
  462 + *
  463 + * If a mandatory model name is specified, the method will further check
  464 + * whether a model with the name exists in the model container.
432 465 ***************************************************************************/
433   -void ctool::setup_observations(GObservations& obs)
  466 +void ctool::setup_models(GObservations& obs,
  467 + const std::string& name)
434 468 {
435   - // Load observations if there are none in the container
436   - if (obs.size() == 0) {
  469 + // If there are no models in the observation container then load model
  470 + // container from the "inmodel" parameter and attach it to the
  471 + // observation container
  472 + if (obs.models().size() == 0) {
437 473  
438   - // Get the filename from the "inobs" parameter
439   - GFilename filename((*this)["inobs"].filename());
440   -
441   - // Load observation container from file if the filename is neither
442   - // "NONE" nor empty ...
443   - if ((gammalib::toupper(filename.url()) != "NONE") &&
444   - !filename.is_empty()) {
445   -
446   - // If file does not exist then throw an exceptions
447   - if (!filename.exists()) {
448   - std::string msg = "The \"inobs\" parameter \""+filename+
449   - "\" specifies a file that does not "
450   - "exist. Please specify a valid event "
451   - "list, counts cube or observation "
452   - "definition XML file.";
453   - throw GException::invalid_value(G_SETUP_OBSERVATION, msg);
454   - }
  474 + // Get models XML filename
  475 + GFilename filename = (*this)["inmodel"].filename();
455 476  
456   - // If the file is a FITS file then load it into a CTA
457   - // observation and append that observation to the container ...
458   - else if (filename.is_fits()) {
459   - GCTAObservation cta(filename);
460   - obs.append(cta);
461   - }
  477 + // Load model container and assign it to observations container
  478 + obs.models(GModels(filename.url()));
462 479  
463   - // ... otherwise it is assumed that the file is an observation
464   - // definition XML file and the file is loaded into the
465   - // observation container
466   - else {
467   - obs.load(filename);
468   - }
  480 + } // endif: no models were in observations container
469 481  
470   - }
  482 + // If a mandatory model name exists then check whether this model is
  483 + // part of the observation container. Throw an exception if the model
  484 + // does not exist
  485 + if (!name.empty()) {
471 486  
472   - // ... otherwise, if the filename is "NONE" or empty then throw
473   - // an exception.
474   - else {
475   - std::string msg = "The \"inobs\" parameter \""+filename+
476   - "\" is not a valid filename. Please specify "
477   - "a valid event list, counts cube or "
478   - "observation definition XML file.";
479   - throw GException::invalid_value(G_SETUP_OBSERVATION, msg);
  487 + // Throw an exception if the model name does not exist
  488 + if (!obs.models().contains(name)) {
  489 + std::string msg = "Model \""+name+"\" not found in model "
  490 + "container. Please add a model with that name "
  491 + "or check for possible typos.";
  492 + throw GException::invalid_value(SETUP_MODELS, msg);
480 493 }
481 494  
482   - } // endif: there were no observations in the container
483   -
484   - // Setup the response for all CTA observations in the observation
485   - // container
486   - set_response(obs);
487   -
488   - // Setup boundaries for all CTA observations containing event lists
489   - set_obs_bounds(obs);
  495 + } // endif: mandatory model name existed
490 496  
491 497 // Return
492 498 return;
... ... @@ -1329,6 +1335,104 @@ void ctool::set_obs_bounds(GObservations&amp; obs)
1329 1335  
1330 1336  
1331 1337 /***********************************************************************//**
  1338 + * @brief Get observation container
  1339 + *
  1340 + * @param[in] get_response Indicates whether response information should
  1341 + * be loaded (default: true)
  1342 + *
  1343 + * Get an observation container according to the user parameters. The method
  1344 + * supports loading of a individual FITS file or an observation definition
  1345 + * file in XML format. If the input filename is empty, parameters are read
  1346 + * to build a CTA observation from scratch.
  1347 + ***************************************************************************/
  1348 +GObservations ctool::get_observations(const bool& get_response)
  1349 +{
  1350 + // Initialise empty observation container
  1351 + GObservations obs;
  1352 +
  1353 + // Get the filename from the input parameters
  1354 + std::string filename = (*this)["inobs"].filename();
  1355 +
  1356 + // If no observation definition file has been specified then read all
  1357 + // parameters that are necessary to create an observation from scratch
  1358 + if ((filename == "NONE") || (gammalib::strip_whitespace(filename) == "")) {
  1359 +
  1360 + // Setup a new CTA observation
  1361 + GCTAObservation cta_obs = create_cta_obs();
  1362 +
  1363 + // Get response if required
  1364 + if (get_response) {
  1365 +
  1366 + // Set response
  1367 + set_obs_response(&cta_obs);
  1368 +
  1369 + } // endif: response was required
  1370 +
  1371 + // Append observation to container
  1372 + obs.append(cta_obs);
  1373 +
  1374 + } // endif: filename was "NONE" or ""
  1375 +
  1376 + // ... otherwise we have a file name
  1377 + else {
  1378 +
  1379 + // If file is a FITS file then create an empty CTA observation
  1380 + // and load file into observation
  1381 + if (GFilename(filename).is_fits()) {
  1382 +
  1383 + // Allocate empty CTA observation
  1384 + GCTAObservation cta_obs;
  1385 +
  1386 + // Load data
  1387 + cta_obs.load(filename);
  1388 +
  1389 + // Get response if required
  1390 + if (get_response) {
  1391 +
  1392 + // Set response
  1393 + set_obs_response(&cta_obs);
  1394 +
  1395 + } // endif: response was required
  1396 +
  1397 + // Append observation to container
  1398 + obs.append(cta_obs);
  1399 +
  1400 + // Signal that no XML file should be used for storage
  1401 + m_use_xml = false;
  1402 +
  1403 + }
  1404 +
  1405 + // ... otherwise load file into observation container
  1406 + else {
  1407 +
  1408 + // Load observations from XML file
  1409 + obs.load(filename);
  1410 +
  1411 + // Get response if required
  1412 + if (get_response) {
  1413 +
  1414 + // For all observations that have no response, set the response
  1415 + // from the task parameters
  1416 + set_response(obs);
  1417 +
  1418 + } // endif: response was required
  1419 +
  1420 + // Set observation boundary parameters (emin, emax, rad)
  1421 + set_obs_bounds(obs);
  1422 +
  1423 + // Signal that XML file should be used for storage
  1424 + m_use_xml = true;
  1425 +
  1426 + } // endelse: file was an XML file
  1427 +
  1428 + }
  1429 +
  1430 + // Return observation container
  1431 + return obs;
  1432 +}
  1433 +
  1434 +
  1435 +/***********************************************************************//**
1332 1436 * @brief Derives mean pointing from CTA observations
1333 1437 *
1334 1438 * @param[in] obs Observation container.
... ...
src/support/ctool.hpp
... ... @@ -71,8 +71,12 @@ protected:
71 71 void free_members(void);
72 72 const bool& read_ahead(void) const;
73 73 const GTimeReference& time_reference(void) const;
74   - GObservations get_observations(const bool& get_response = true);
75   - void setup_observations(GObservations& obs);
  74 +
  75 + // Protected high-level setup methods
  76 + void setup_observations(GObservations& obs, const bool& response = true,
  77 + const bool& list = true,
  78 + const bool& cube = true);
  79 + void setup_models(GObservations& obs, const std::string& name = "");
76 80  
77 81 // Protected methods that create objects from user parameters
78 82 GEbounds create_ebounds(void);
... ... @@ -100,6 +104,7 @@ protected:
100 104 const std::vector<bool>& edisp) const;
101 105 void set_obs_response(GCTAObservation* obs);
102 106 void set_obs_bounds(GObservations& obs);
  107 + GObservations get_observations(const bool& get_response = true);
103 108 GSkyDir get_mean_pointing(const GObservations& obs);
104 109 size_t get_current_rss(void);
105 110 std::string get_obs_header(const GObservation* obs);
... ...
test/test_ctobssim.py
... ... @@ -74,7 +74,8 @@ class Test(test):
74 74 ' outevents="events.fits"'+ \
75 75 ' caldb="'+self._caldb+'" irf="'+self._irf+'" '+ \
76 76 ' ra=83.63 dec=22.01 rad=10.0'+ \
77   - ' tmin=0.0 tmax=1800.0 emin=0.1 emax=100.0'
  77 + ' tmin=0.0 tmax=1800.0 emin=0.1 emax=100.0'+ \
  78 + ' logfile="ctobssim_cmd1.log" chatter=1'
78 79  
79 80 # Check if execution of wrong command fails
80 81 self.test_assert(self._execute('command_that_does_not_exist') != 0,
... ... @@ -93,7 +94,8 @@ class Test(test):
93 94 ' outevents="events.fits"'+ \
94 95 ' caldb="'+self._caldb+'" irf="'+self._irf+'" '+ \
95 96 ' ra=83.63 dec=22.01 rad=10.0'+ \
96   - ' tmin=0.0 tmax=1800.0 emin=0.1 emax=100.0'
  97 + ' tmin=0.0 tmax=1800.0 emin=0.1 emax=100.0'+ \
  98 + ' logfile="ctobssim_cmd2.log" chatter=1'
97 99  
98 100 # Check if execution failed
99 101 self.test_assert(self._execute(cmd) != 0,
... ... @@ -120,8 +122,11 @@ class Test(test):
120 122 sim['tmax'] = 1800.0
121 123 sim['emin'] = 0.1
122 124 sim['emax'] = 100.0
  125 + sim['logfile'] = 'ctobssim_py1.log'
  126 + sim['chatter'] = 2
123 127  
124 128 # Run tool
  129 + sim.logFileOpen()
125 130 sim.run()
126 131  
127 132 # Check content of observation
... ... @@ -146,8 +151,11 @@ class Test(test):
146 151 sim = ctools.ctobssim(obs)
147 152 sim['outevents'] = 'sim_events.xml'
148 153 sim['inmodel'] = self._model
  154 + sim['logfile'] = 'ctobssim_py2.log'
  155 + sim['chatter'] = 3
149 156  
150 157 # Run tool
  158 + sim.logFileOpen()
151 159 sim.run()
152 160  
153 161 # Retrieve observation and check content
... ... @@ -182,10 +190,13 @@ class Test(test):
182 190 sim['tmax'] = 1800.0
183 191 sim['emin'] = 0.1
184 192 sim['emax'] = 100.0
  193 + sim['logfile'] = 'ctobssim_py3.log'
  194 + sim['chatter'] = 4
185 195  
186 196 # Run ctbin tool
187 197 self.test_try('Run ctobssim with invalid model file')
188 198 try:
  199 + sim.logFileOpen()
189 200 sim.run()
190 201 self.test_try_failure()
191 202 except:
... ...