Commit 1e00ea3def3c7c067f5237bfc76b903b838d5dbc

Authored by Jürgen Knödlseder
1 parent 60fca9e5

Add ctool::is_valid_filename() method (#1828)

pyext/ctool.i
@@ -107,6 +107,7 @@ public: @@ -107,6 +107,7 @@ public:
107 %rename(_get_obs_header) get_obs_header; 107 %rename(_get_obs_header) get_obs_header;
108 %rename(_insert_energy_boundaries) insert_energy_boundaries; 108 %rename(_insert_energy_boundaries) insert_energy_boundaries;
109 %rename(_cube_layer_usage) cube_layer_usage; 109 %rename(_cube_layer_usage) cube_layer_usage;
  110 + %rename(_is_valid_filename) is_valid_filename;
110 %rename(_warn_too_few_energies) warn_too_few_energies; 111 %rename(_warn_too_few_energies) warn_too_few_energies;
111 %rename(_warn_xml_suffix) warn_xml_suffix; 112 %rename(_warn_xml_suffix) warn_xml_suffix;
112 113
@@ -154,6 +155,7 @@ public: @@ -154,6 +155,7 @@ public:
154 const GCTAObservation& obs); 155 const GCTAObservation& obs);
155 std::vector<bool> cube_layer_usage(const GEbounds& cube_ebounds, 156 std::vector<bool> cube_layer_usage(const GEbounds& cube_ebounds,
156 const GEbounds& list_ebounds) const; 157 const GEbounds& list_ebounds) const;
  158 + bool is_valid_filename(const GFilename& filename) const;
157 159
158 // Protected warning strings 160 // Protected warning strings
159 std::string warn_too_few_energies(const GEnergies& energies) const; 161 std::string warn_too_few_energies(const GEnergies& energies) const;
src/ctbkgcube/ctbkgcube.cpp
@@ -33,7 +33,6 @@ @@ -33,7 +33,6 @@
33 #include "GTools.hpp" 33 #include "GTools.hpp"
34 34
35 /* __ Method name definitions ____________________________________________ */ 35 /* __ Method name definitions ____________________________________________ */
36 -#define G_GET_PARAMETERS "ctbkgcube::get_parameters()"  
37 36
38 /* __ Debug definitions __________________________________________________ */ 37 /* __ Debug definitions __________________________________________________ */
39 38
@@ -344,8 +343,7 @@ void ctbkgcube::save(void) @@ -344,8 +343,7 @@ void ctbkgcube::save(void)
344 m_outmodel = (*this)["outmodel"].filename(); 343 m_outmodel = (*this)["outmodel"].filename();
345 344
346 // Determine whether a model definition file should be written 345 // Determine whether a model definition file should be written
347 - bool write_moddef = ((!m_outmodel.is_empty()) &&  
348 - (gammalib::tolower(m_outmodel.url()) != "none")); 346 + bool write_moddef = is_valid_filename(m_outmodel);
349 347
350 // Save background cube if filename and the background cube are not empty 348 // Save background cube if filename and the background cube are not empty
351 if (!m_outcube.is_empty() && !m_background.cube().is_empty()) { 349 if (!m_outcube.is_empty() && !m_background.cube().is_empty()) {
@@ -465,58 +463,29 @@ void ctbkgcube::free_members(void) @@ -465,58 +463,29 @@ void ctbkgcube::free_members(void)
465 /***********************************************************************//** 463 /***********************************************************************//**
466 * @brief Get application parameters 464 * @brief Get application parameters
467 * 465 *
468 - * @exception GException::invalid_value  
469 - * No background model definition XML file specified.  
470 - *  
471 * Get all task parameters from parameter file or (if required) by querying 466 * Get all task parameters from parameter file or (if required) by querying
472 * the user. The parameters are read in the correct order. 467 * the user. The parameters are read in the correct order.
473 ***************************************************************************/ 468 ***************************************************************************/
474 void ctbkgcube::get_parameters(void) 469 void ctbkgcube::get_parameters(void)
475 { 470 {
476 - // Setup observations from "inobs" parameter. Do not accept counts cubes. 471 + // Setup observations from "inobs" parameter. Require response and accept
  472 + // event lists, but do not accept counts cubes.
477 setup_observations(m_obs, true, true, false); 473 setup_observations(m_obs, true, true, false);
478 474
479 // Get the incube filename 475 // Get the incube filename
480 std::string incube = (*this)["incube"].filename(); 476 std::string incube = (*this)["incube"].filename();
481 477
482 - // Check for filename validity  
483 - if ((gammalib::toupper(incube) == "NONE") ||  
484 - (gammalib::strip_whitespace(incube) == "")) {  
485 -  
486 - // Create an event cube based on task parameters  
487 - GCTAEventCube cube = create_cube(m_obs);  
488 -  
489 - // Define background cube  
490 - m_background = GCTACubeBackground(cube);  
491 -  
492 - } // endif: filename was not valid  
493 -  
494 - // ... otherwise setup the background cube from the counts map  
495 - else {  
496 -  
497 - // Load event cube from filename  
498 - GCTAEventCube cube(incube);  
499 -  
500 - // Define background cube from file  
501 - m_background = GCTACubeBackground(cube); 478 + // If the "incube" file name is valid then setup the background cube from
  479 + // the counts cube. Otherwise create a counts cube from the user
  480 + // parameters
  481 + GCTAEventCube cube = is_valid_filename(incube) ? GCTAEventCube(incube)
  482 + : create_cube(m_obs);
502 483
503 - } // endelse: cube was loaded from file  
504 -  
505 - // If there are no models associated with the observations then load now  
506 - // the model definition from the XML file. Throw an exception if the  
507 - // input model is not set.  
508 - if (m_obs.models().size() == 0) {  
509 - std::string inmodel = (*this)["inmodel"].filename();  
510 - if ((gammalib::toupper(inmodel) == "NONE") ||  
511 - (gammalib::strip_whitespace(inmodel) == "")) {  
512 - std::string msg = "No model definition XML file specified. "  
513 - "Please set the \"inmodel\" parameter to the "  
514 - "XML file that contains the background model "  
515 - "definition.";  
516 - throw GException::invalid_value(G_GET_PARAMETERS, msg);  
517 - }  
518 - m_obs.models(GModels(inmodel));  
519 - } 484 + // Define background cube
  485 + m_background = GCTACubeBackground(cube);
  486 +
  487 + // Setup models from "inmodel" parameter
  488 + setup_models(m_obs);
520 489
521 // Get remaining parameters 490 // Get remaining parameters
522 m_addbounds = (*this)["addbounds"].boolean(); 491 m_addbounds = (*this)["addbounds"].boolean();
src/ctedispcube/ctedispcube.cpp
@@ -356,27 +356,14 @@ void ctedispcube::get_parameters(void) @@ -356,27 +356,14 @@ void ctedispcube::get_parameters(void)
356 double migramax = (*this)["migramax"].real(); 356 double migramax = (*this)["migramax"].real();
357 int migrabins = (*this)["migrabins"].integer(); 357 int migrabins = (*this)["migrabins"].integer();
358 358
359 - // Check for filename validity  
360 - if ((incube == "NONE") || (gammalib::strip_whitespace(incube) == "")) {  
361 -  
362 - // Create an event cube based on task parameters  
363 - GCTAEventCube cube = create_cube(m_obs);  
364 -  
365 - // Define edisp cube  
366 - m_edispcube = GCTACubeEdisp(cube, migramax, migrabins);  
367 -  
368 - }  
369 -  
370 - // ... otherwise setup the energy disperison cube from the counts map  
371 - else {  
372 -  
373 - // Load event cube from filename  
374 - GCTAEventCube cube(incube);  
375 -  
376 - // Define Edisp cube  
377 - m_edispcube = GCTACubeEdisp(cube, migramax, migrabins);  
378 -  
379 - } // endelse: cube loaded from file 359 + // If the "incube" file name is valid then setup the energy dispersion
  360 + // cube from the counts cube. Otherwise create a counts cube from the
  361 + // user parameters
  362 + GCTAEventCube cube = is_valid_filename(incube) ? GCTAEventCube(incube)
  363 + : create_cube(m_obs);
  364 +
  365 + // Define edisp cube
  366 + m_edispcube = GCTACubeEdisp(cube, migramax, migrabins);
380 367
381 // Get remaining parameters 368 // Get remaining parameters
382 m_addbounds = (*this)["addbounds"].boolean(); 369 m_addbounds = (*this)["addbounds"].boolean();
src/cterror/cterror.cpp
@@ -354,9 +354,8 @@ void cterror::save(void) @@ -354,9 +354,8 @@ void cterror::save(void)
354 // Get output filename 354 // Get output filename
355 m_outmodel = (*this)["outmodel"].filename(); 355 m_outmodel = (*this)["outmodel"].filename();
356 356
357 - // Save only if filename is not empty and not "NONE"  
358 - if (!m_outmodel.is_empty() &&  
359 - gammalib::toupper(m_outmodel.url()) != "NONE") { 357 + // Save only if filename is valid
  358 + if (is_valid_filename(m_outmodel)) {
360 359
361 // Log filename 360 // Log filename
362 log_value(NORMAL, "Model definition file", m_outmodel.url()); 361 log_value(NORMAL, "Model definition file", m_outmodel.url());
@@ -366,7 +365,7 @@ void cterror::save(void) @@ -366,7 +365,7 @@ void cterror::save(void)
366 365
367 } 366 }
368 367
369 - // ... otherwise signal that file was not save 368 + // ... otherwise signal that file was not saved
370 else { 369 else {
371 log_value(NORMAL, "Model definition file", "NONE"); 370 log_value(NORMAL, "Model definition file", "NONE");
372 } 371 }
src/ctexpcube/ctexpcube.cpp
@@ -376,27 +376,14 @@ void ctexpcube::get_parameters(void) @@ -376,27 +376,14 @@ void ctexpcube::get_parameters(void)
376 // Get the incube filename 376 // Get the incube filename
377 std::string incube = (*this)["incube"].filename(); 377 std::string incube = (*this)["incube"].filename();
378 378
379 - // Check for filename validity  
380 - if ((incube == "NONE") || (gammalib::strip_whitespace(incube) == "")) {  
381 -  
382 - // Create an event cube based on task parameters  
383 - GCTAEventCube cube = create_cube(m_obs);  
384 -  
385 - // Define exposure cube  
386 - m_expcube = GCTACubeExposure(cube);  
387 -  
388 - } // endif: filename was not valid  
389 -  
390 - // ... otherwise setup the exposure cube from the counts map  
391 - else {  
392 -  
393 - // Load event cube from filename  
394 - GCTAEventCube cube(incube);  
395 -  
396 - // Define exposure cube  
397 - m_expcube = GCTACubeExposure(cube);  
398 -  
399 - } // endelse: cube loaded from file 379 + // If the "incube" file name is valid then setup the exposure cube from
  380 + // the counts cube. Otherwise create a counts cube from the user
  381 + // parameters
  382 + GCTAEventCube cube = is_valid_filename(incube) ? GCTAEventCube(incube)
  383 + : create_cube(m_obs);
  384 +
  385 + // Define exposure cube
  386 + m_expcube = GCTACubeExposure(cube);
400 387
401 // Get remaining parameters 388 // Get remaining parameters
402 m_addbounds = (*this)["addbounds"].boolean(); 389 m_addbounds = (*this)["addbounds"].boolean();
src/ctlike/ctlike.cpp
@@ -319,9 +319,8 @@ void ctlike::save(void) @@ -319,9 +319,8 @@ void ctlike::save(void)
319 // Get output filename 319 // Get output filename
320 m_outmodel = (*this)["outmodel"].filename(); 320 m_outmodel = (*this)["outmodel"].filename();
321 321
322 - // Save only if filename is non-empty  
323 - if (!m_outmodel.is_empty() &&  
324 - gammalib::toupper(m_outmodel.url()) != "NONE") { 322 + // Save only if filename is valid
  323 + if (is_valid_filename(m_outmodel)) {
325 324
326 // Log filename 325 // Log filename
327 log_value(NORMAL, "Model definition file", m_outmodel.url()); 326 log_value(NORMAL, "Model definition file", m_outmodel.url());
@@ -331,7 +330,7 @@ void ctlike::save(void) @@ -331,7 +330,7 @@ void ctlike::save(void)
331 330
332 } 331 }
333 332
334 - // ... otherwise signal that file was not save 333 + // ... otherwise signal that file was not saved
335 else { 334 else {
336 log_value(NORMAL, "Model definition file", "NONE"); 335 log_value(NORMAL, "Model definition file", "NONE");
337 } 336 }
src/ctmodel/ctmodel.cpp
@@ -517,19 +517,9 @@ void ctmodel::get_parameters(void) @@ -517,19 +517,9 @@ void ctmodel::get_parameters(void)
517 // Read cube definition file 517 // Read cube definition file
518 std::string incube = (*this)["incube"].filename(); 518 std::string incube = (*this)["incube"].filename();
519 519
520 - // If no cube file has been specified then create a cube from  
521 - // the task parameters ...  
522 - if ((incube == "NONE") ||  
523 - (gammalib::strip_whitespace(incube) == "")) {  
524 -  
525 - // Create cube from scratch  
526 - m_cube = create_cube(m_obs);  
527 -  
528 - }  
529 -  
530 - // ... otherwise load the cube from file and reset all bins  
531 - // to zero  
532 - else { 520 + // If the cube filename is valid the load the cube and set all cube
  521 + // bins to zero
  522 + if (is_valid_filename(incube)) {
533 523
534 // Load cube from given file 524 // Load cube from given file
535 m_cube.load(incube); 525 m_cube.load(incube);
@@ -538,6 +528,12 @@ void ctmodel::get_parameters(void) @@ -538,6 +528,12 @@ void ctmodel::get_parameters(void)
538 for (int i = 0; i < m_cube.size(); ++i) { 528 for (int i = 0; i < m_cube.size(); ++i) {
539 m_cube[i]->counts(0.0); 529 m_cube[i]->counts(0.0);
540 } 530 }
  531 +
  532 + } // endif: cube filename was valid
  533 +
  534 + // ... otherwise create a cube from the user parameters
  535 + else {
  536 + m_cube = create_cube(m_obs);
541 } 537 }
542 538
543 // Signal that cube has been set 539 // Signal that cube has been set
@@ -601,6 +597,8 @@ void ctmodel::get_parameters(void) @@ -601,6 +597,8 @@ void ctmodel::get_parameters(void)
601 * a stacked observation is requested (as detected by the presence of the 597 * a stacked observation is requested (as detected by the presence of the
602 * "expcube", "psfcube", and "bkgcube" parameters). In that case, it appended 598 * "expcube", "psfcube", and "bkgcube" parameters). In that case, it appended
603 * a dummy event cube to the observation. 599 * a dummy event cube to the observation.
  600 + *
  601 + * @TODO Support stacked energy dispersion
604 ***************************************************************************/ 602 ***************************************************************************/
605 void ctmodel::get_obs(void) 603 void ctmodel::get_obs(void)
606 { 604 {
@@ -609,7 +607,7 @@ void ctmodel::get_obs(void) @@ -609,7 +607,7 @@ void ctmodel::get_obs(void)
609 607
610 // If no observation definition file has been specified then read all 608 // If no observation definition file has been specified then read all
611 // parameters that are necessary to create an observation from scratch 609 // parameters that are necessary to create an observation from scratch
612 - if ((filename == "NONE") || (gammalib::strip_whitespace(filename) == "")) { 610 + if (!is_valid_filename(filename)) {
613 611
614 // Get response cube filenames 612 // Get response cube filenames
615 std::string expcube = (*this)["expcube"].filename(); 613 std::string expcube = (*this)["expcube"].filename();
@@ -618,10 +616,8 @@ void ctmodel::get_obs(void) @@ -618,10 +616,8 @@ void ctmodel::get_obs(void)
618 616
619 // If the filenames are valid then build an observation from cube 617 // If the filenames are valid then build an observation from cube
620 // response information 618 // response information
621 - if ((expcube != "NONE") && (psfcube != "NONE") && (bkgcube != "NONE") &&  
622 - (gammalib::strip_whitespace(expcube) != "") &&  
623 - (gammalib::strip_whitespace(psfcube) != "") &&  
624 - (gammalib::strip_whitespace(bkgcube) != "")) { 619 + if (is_valid_filename(expcube) && is_valid_filename(psfcube) &&
  620 + is_valid_filename(bkgcube)) {
625 621
626 // Get exposure, PSF and background cubes 622 // Get exposure, PSF and background cubes
627 GCTACubeExposure exposure(expcube); 623 GCTACubeExposure exposure(expcube);
@@ -667,7 +663,7 @@ void ctmodel::get_obs(void) @@ -667,7 +663,7 @@ void ctmodel::get_obs(void)
667 663
668 } 664 }
669 665
670 - } // endif: filename was "NONE" or "" 666 + } // endif: filename was not valid
671 667
672 // ... otherwise we have a file name 668 // ... otherwise we have a file name
673 else { 669 else {
src/ctpsfcube/ctpsfcube.cpp
@@ -340,27 +340,13 @@ void ctpsfcube::get_parameters(void) @@ -340,27 +340,13 @@ void ctpsfcube::get_parameters(void)
340 double amax = (*this)["amax"].real(); 340 double amax = (*this)["amax"].real();
341 int anumbins = (*this)["anumbins"].integer(); 341 int anumbins = (*this)["anumbins"].integer();
342 342
343 - // Check for filename validity  
344 - if ((incube == "NONE") || (gammalib::strip_whitespace(incube) == "")) { 343 + // If the "incube" file name is valid then setup the PSF cube from the
  344 + // counts cube. Otherwise create a counts cube from the user parameters
  345 + GCTAEventCube cube = is_valid_filename(incube) ? GCTAEventCube(incube)
  346 + : create_cube(m_obs);
345 347
346 - // Create an event cube based on task parameters  
347 - GCTAEventCube cube = create_cube(m_obs);  
348 -  
349 - // Define psf cube  
350 - m_psfcube = GCTACubePsf(cube, amax, anumbins);  
351 -  
352 - }  
353 -  
354 - // ... otherwise setup the PSF cube from the counts map  
355 - else {  
356 -  
357 - // Load event cube from filename  
358 - GCTAEventCube cube(incube);  
359 -  
360 - // Define psf cube  
361 - m_psfcube = GCTACubePsf(cube, amax, anumbins);  
362 -  
363 - } // endelse: cube loaded from file 348 + // Define PSF cube
  349 + m_psfcube = GCTACubePsf(cube, amax, anumbins);
364 350
365 // Get remaining parameters 351 // Get remaining parameters
366 m_addbounds = (*this)["addbounds"].boolean(); 352 m_addbounds = (*this)["addbounds"].boolean();
src/support/ctool.cpp
@@ -50,7 +50,7 @@ @@ -50,7 +50,7 @@
50 50
51 /* __ Method name definitions ____________________________________________ */ 51 /* __ Method name definitions ____________________________________________ */
52 #define G_SETUP_OBSERVATION "ctool::setup_observations(GObservations&)" 52 #define G_SETUP_OBSERVATION "ctool::setup_observations(GObservations&)"
53 -#define SETUP_MODELS "ctool::setup_models(GObservations&, std::string&)" 53 +#define G_SETUP_MODELS "ctool::setup_models(GObservations&, std::string&)"
54 #define G_GET_MEAN_POINTING "ctool::get_mean_pointing(GObservations&)" 54 #define G_GET_MEAN_POINTING "ctool::get_mean_pointing(GObservations&)"
55 #define G_CREATE_EBOUNDS "ctool::create_ebounds()" 55 #define G_CREATE_EBOUNDS "ctool::create_ebounds()"
56 #define G_RESTORE_EDISP "ctool::restore_edisp(GObservations&, "\ 56 #define G_RESTORE_EDISP "ctool::restore_edisp(GObservations&, "\
@@ -319,9 +319,9 @@ void ctool::free_members(void) @@ -319,9 +319,9 @@ void ctool::free_members(void)
319 * information from user parameters. 319 * information from user parameters.
320 * 320 *
321 * If the observation container @p obs is empty, the method will extract the 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. 322 + * filename from the "inobs" parameter and load the observation container
  323 + * from the specified file. If the filename is either empty or "NONE" the
  324 + * method will throw an exception.
325 * 325 *
326 * If the "inobs" file is a FITS file, and depending on the information that 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 327 * is found in the FITS file, the method will append a single CTA observation
@@ -362,8 +362,7 @@ void ctool::setup_observations(GObservations&amp; obs, @@ -362,8 +362,7 @@ void ctool::setup_observations(GObservations&amp; obs,
362 362
363 // Throw an exception if the "inobs" parameter is not a valid 363 // Throw an exception if the "inobs" parameter is not a valid
364 // filename 364 // filename
365 - if ((gammalib::toupper(filename.url()) == "NONE") ||  
366 - filename.is_empty()) { 365 + if (!is_valid_filename(filename)) {
367 std::string msg = "The \"inobs\" parameter \""+filename.url()+ 366 std::string msg = "The \"inobs\" parameter \""+filename.url()+
368 "\" is not a valid filename. Please specify " 367 "\" is not a valid filename. Please specify "
369 "a valid event list, counts cube or " 368 "a valid event list, counts cube or "
@@ -450,7 +449,8 @@ void ctool::setup_observations(GObservations&amp; obs, @@ -450,7 +449,8 @@ void ctool::setup_observations(GObservations&amp; obs,
450 * @param[in] name Mandatory model name 449 * @param[in] name Mandatory model name
451 * 450 *
452 * @exception GException::invalid_value 451 * @exception GException::invalid_value
453 - * Mandatory model name not found in observation container. 452 + * Model definiton XML filename not valid or mandatory model name
  453 + * not found in model container.
454 * 454 *
455 * Setup a model container by loading the models from the "inmodel" 455 * Setup a model container by loading the models from the "inmodel"
456 * parameter. 456 * parameter.
@@ -458,10 +458,12 @@ void ctool::setup_observations(GObservations&amp; obs, @@ -458,10 +458,12 @@ void ctool::setup_observations(GObservations&amp; obs,
458 * If the model container in the observation container @p obs is empty, the 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" 459 * method will extract the model container filename from the "inmodel"
460 * parameter, load the model container and assign it to the observations 460 * parameter, load the model container and assign it to the observations
461 - * container. 461 + * container. If the filename is either empty or "NONE" the method will
  462 + * throw an exception.
462 * 463 *
463 * If a mandatory model name is specified, the method will further check 464 * If a mandatory model name is specified, the method will further check
464 - * whether a model with the name exists in the model container. 465 + * whether a model with the name exists in the model container. If it does
  466 + * not exist, an exception is thrown.
465 ***************************************************************************/ 467 ***************************************************************************/
466 void ctool::setup_models(GObservations& obs, 468 void ctool::setup_models(GObservations& obs,
467 const std::string& name) 469 const std::string& name)
@@ -474,6 +476,15 @@ void ctool::setup_models(GObservations&amp; obs, @@ -474,6 +476,15 @@ void ctool::setup_models(GObservations&amp; obs,
474 // Get models XML filename 476 // Get models XML filename
475 GFilename filename = (*this)["inmodel"].filename(); 477 GFilename filename = (*this)["inmodel"].filename();
476 478
  479 + // Throw an exception if the "inmodel" parameter is not a valid
  480 + // filename
  481 + if (!is_valid_filename(filename)) {
  482 + std::string msg = "The \"inmodel\" parameter \""+filename.url()+
  483 + "\" is not a valid filename. Please specify "
  484 + "a valid model definition XML file.";
  485 + throw GException::invalid_value(G_SETUP_MODELS, msg);
  486 + }
  487 +
477 // Load model container and assign it to observations container 488 // Load model container and assign it to observations container
478 obs.models(GModels(filename.url())); 489 obs.models(GModels(filename.url()));
479 490
@@ -489,7 +500,7 @@ void ctool::setup_models(GObservations&amp; obs, @@ -489,7 +500,7 @@ void ctool::setup_models(GObservations&amp; obs,
489 std::string msg = "Model \""+name+"\" not found in model " 500 std::string msg = "Model \""+name+"\" not found in model "
490 "container. Please add a model with that name " 501 "container. Please add a model with that name "
491 "or check for possible typos."; 502 "or check for possible typos.";
492 - throw GException::invalid_value(SETUP_MODELS, msg); 503 + throw GException::invalid_value(G_SETUP_MODELS, msg);
493 } 504 }
494 505
495 } // endif: mandatory model name existed 506 } // endif: mandatory model name existed
@@ -790,18 +801,18 @@ GCTAObservation ctool::create_cta_obs(void) @@ -790,18 +801,18 @@ GCTAObservation ctool::create_cta_obs(void)
790 * 801 *
791 * @param[in] method Method name. 802 * @param[in] method Method name.
792 * 803 *
793 - * Throw an exception if the inobs parameter is either NONE or an empty 804 + * Throw an exception if the "inobs" parameter is either "NONE" or an empty
794 * string. 805 * string.
795 ***************************************************************************/ 806 ***************************************************************************/
796 void ctool::require_inobs(const std::string& method) 807 void ctool::require_inobs(const std::string& method)
797 { 808 {
798 // Get inobs filename 809 // Get inobs filename
799 - std::string filename = (*this)["inobs"].filename(); 810 + GFilename filename = (*this)["inobs"].filename();
800 811
801 // Throw exception if no infile is given 812 // Throw exception if no infile is given
802 - if (filename == "NONE" || gammalib::strip_whitespace(filename) == "") { 813 + if (!is_valid_filename(filename)) {
803 std::string msg = "A valid file needs to be specified for the " 814 std::string msg = "A valid file needs to be specified for the "
804 - "\"inobs\" parameter, yet \""+filename+ 815 + "\"inobs\" parameter, yet \""+filename.url()+
805 "\" was given." 816 "\" was given."
806 " Specify a valid observation definition or " 817 " Specify a valid observation definition or "
807 "FITS file to proceed."; 818 "FITS file to proceed.";
@@ -1165,12 +1176,8 @@ void ctool::set_obs_response(GCTAObservation* obs) @@ -1165,12 +1176,8 @@ void ctool::set_obs_response(GCTAObservation* obs)
1165 GFilename bkgcube((*this)["bkgcube"].filename()); 1176 GFilename bkgcube((*this)["bkgcube"].filename());
1166 1177
1167 // Extract stacked response information if available 1178 // Extract stacked response information if available
1168 - if ((gammalib::toupper(expcube.url()) != "NONE") &&  
1169 - (gammalib::toupper(psfcube.url()) != "NONE") &&  
1170 - (gammalib::toupper(bkgcube.url()) != "NONE") &&  
1171 - !expcube.is_empty() &&  
1172 - !psfcube.is_empty() &&  
1173 - !bkgcube.is_empty()) { 1179 + if (is_valid_filename(expcube) && is_valid_filename(psfcube) &&
  1180 + is_valid_filename(bkgcube)) {
1174 1181
1175 // Load exposure, PSF and background cubes 1182 // Load exposure, PSF and background cubes
1176 GCTACubeExposure exposure(expcube); 1183 GCTACubeExposure exposure(expcube);
@@ -1182,8 +1189,7 @@ void ctool::set_obs_response(GCTAObservation* obs) @@ -1182,8 +1189,7 @@ void ctool::set_obs_response(GCTAObservation* obs)
1182 if (query_edisp) { 1189 if (query_edisp) {
1183 1190
1184 // If filename is valid then use energy dispersion ... 1191 // If filename is valid then use energy dispersion ...
1185 - if ((gammalib::toupper(edispcube.url()) != "NONE") &&  
1186 - !edispcube.is_empty()) { 1192 + if (is_valid_filename(edispcube)) {
1187 1193
1188 // Load energy dispersion cube 1194 // Load energy dispersion cube
1189 GCTACubeEdisp edisp(edispcube); 1195 GCTACubeEdisp edisp(edispcube);
@@ -1355,7 +1361,7 @@ GObservations ctool::get_observations(const bool&amp; get_response) @@ -1355,7 +1361,7 @@ GObservations ctool::get_observations(const bool&amp; get_response)
1355 1361
1356 // If no observation definition file has been specified then read all 1362 // If no observation definition file has been specified then read all
1357 // parameters that are necessary to create an observation from scratch 1363 // parameters that are necessary to create an observation from scratch
1358 - if ((filename == "NONE") || (gammalib::strip_whitespace(filename) == "")) { 1364 + if (!is_valid_filename(filename)) {
1359 1365
1360 // Setup a new CTA observation 1366 // Setup a new CTA observation
1361 GCTAObservation cta_obs = create_cta_obs(); 1367 GCTAObservation cta_obs = create_cta_obs();
@@ -1371,7 +1377,7 @@ GObservations ctool::get_observations(const bool&amp; get_response) @@ -1371,7 +1377,7 @@ GObservations ctool::get_observations(const bool&amp; get_response)
1371 // Append observation to container 1377 // Append observation to container
1372 obs.append(cta_obs); 1378 obs.append(cta_obs);
1373 1379
1374 - } // endif: filename was "NONE" or "" 1380 + } // endif: filename was valid
1375 1381
1376 // ... otherwise we have a file name 1382 // ... otherwise we have a file name
1377 else { 1383 else {
src/support/ctool.hpp
@@ -112,6 +112,7 @@ protected: @@ -112,6 +112,7 @@ protected:
112 const GCTAObservation& obs); 112 const GCTAObservation& obs);
113 std::vector<bool> cube_layer_usage(const GEbounds& cube_ebounds, 113 std::vector<bool> cube_layer_usage(const GEbounds& cube_ebounds,
114 const GEbounds& list_ebounds) const; 114 const GEbounds& list_ebounds) const;
  115 + bool is_valid_filename(const GFilename& filename) const;
115 116
116 // Protected warning strings 117 // Protected warning strings
117 std::string warn_too_few_energies(const GEnergies& energies) const; 118 std::string warn_too_few_energies(const GEnergies& energies) const;
@@ -131,9 +132,14 @@ protected: @@ -131,9 +132,14 @@ protected:
131 132
132 133
133 /***********************************************************************//** 134 /***********************************************************************//**
134 - * @brief Return observation container 135 + * @brief Signal whether parameters should be read ahead
135 * 136 *
136 - * @return Reference to observation container 137 + * @return True if parameters should be read ahead
  138 + *
  139 + * Ahead reading of parameter is useful in case that some parameters are only
  140 + * required in a late stage of the processing. By reading them ahead it is
  141 + * assured that these parameters will be queried at the beginning of the
  142 + * tool execution.
137 ***************************************************************************/ 143 ***************************************************************************/
138 inline 144 inline
139 const bool& ctool::read_ahead(void) const 145 const bool& ctool::read_ahead(void) const
@@ -153,4 +159,19 @@ const GTimeReference&amp; ctool::time_reference(void) const @@ -153,4 +159,19 @@ const GTimeReference&amp; ctool::time_reference(void) const
153 return (m_cta_ref); 159 return (m_cta_ref);
154 } 160 }
155 161
  162 +
  163 +/***********************************************************************//**
  164 + * @brief Check of a filename is valid
  165 + *
  166 + * @return True if filename is valid
  167 + *
  168 + * Checks whether a filename is not empty and not "NONE".
  169 + ***************************************************************************/
  170 +inline
  171 +bool ctool::is_valid_filename(const GFilename& filename) const
  172 +{
  173 + return (!filename.is_empty() &&
  174 + (gammalib::tolower(filename.url()) != "none"));
  175 +}
  176 +
156 #endif /* CTOOL_HPP */ 177 #endif /* CTOOL_HPP */