Commit 5d64b0db41b98f76058c8a2972a8eab0cfbd3ad0

Authored by Jürgen Knödlseder
1 parent 37c64e1e

Adapt to removal of ctools::is_valid_filename() method

cscripts/csebins.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Generates energy boundaries for stacked analysis 3 # Generates energy boundaries for stacked analysis
4 # 4 #
5 -# Copyright (C) 2017 Juergen Knoedlseder 5 +# Copyright (C) 2017-2018 Juergen Knoedlseder
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -55,13 +55,10 @@ class csebins(ctools.csobservation): @@ -55,13 +55,10 @@ class csebins(ctools.csobservation):
55 # Initialise observation container if it is currently empty 55 # Initialise observation container if it is currently empty
56 if self.obs().size() == 0: 56 if self.obs().size() == 0:
57 57
58 - # Query "inobs" parameter  
59 - filename = self['inobs'].filename()  
60 -  
61 # If an observation definition file was provided then load it, 58 # If an observation definition file was provided then load it,
62 # otherwise build a single observation with response information 59 # otherwise build a single observation with response information
63 - if self._is_valid_filename(filename):  
64 - self.obs(gammalib.GObservations(filename)) 60 + if self['inobs'].is_valid():
  61 + self.obs(gammalib.GObservations(self['inobs'].filename()))
65 else: 62 else:
66 cta = gammalib.GCTAObservation() 63 cta = gammalib.GCTAObservation()
67 caldb = gammalib.GCaldb('cta', self['caldb'].string()) 64 caldb = gammalib.GCaldb('cta', self['caldb'].string())
cscripts/csiactcopy.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Copies IACT data from remote machine 3 # Copies IACT data from remote machine
4 # 4 #
5 -# Copyright (C) 2016-2017 Michael Mayer 5 +# Copyright (C) 2016-2018 Michael Mayer
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -74,7 +74,8 @@ class csiactcopy(ctools.cscript): @@ -74,7 +74,8 @@ class csiactcopy(ctools.cscript):
74 # Get parameters 74 # Get parameters
75 self._prodname = self['prodname'].string() 75 self._prodname = self['prodname'].string()
76 self._outpath = gammalib.expand_env(self['outpath'].string()) 76 self._outpath = gammalib.expand_env(self['outpath'].string())
77 - self._runlist = self['runlist'].filename() 77 + if self['runlist'].is_valid():
  78 + self._runlist = self['runlist'].filename()
78 79
79 # Write input parameters into logger 80 # Write input parameters into logger
80 self._log_parameters(gammalib.TERSE) 81 self._log_parameters(gammalib.TERSE)
@@ -322,7 +323,7 @@ class csiactcopy(ctools.cscript): @@ -322,7 +323,7 @@ class csiactcopy(ctools.cscript):
322 for i in range(local_hdu.ncols()): 323 for i in range(local_hdu.ncols()):
323 324
324 # Get local and remote columns 325 # Get local and remote columns
325 - local_col = local_hdu[i] 326 + local_col = local_hdu[i]
326 remote_col = remote_hdu[i] 327 remote_col = remote_hdu[i]
327 328
328 # Loop over entries and merge 329 # Loop over entries and merge
@@ -381,14 +382,14 @@ class csiactcopy(ctools.cscript): @@ -381,14 +382,14 @@ class csiactcopy(ctools.cscript):
381 self._log_value(gammalib.NORMAL, 'Number of observations', 382 self._log_value(gammalib.NORMAL, 'Number of observations',
382 len(runs)) 383 len(runs))
383 384
384 - # ... otherwise, if the runlist file is 'NONE' then leave the 385 + # ... otherwise, if the runlist filename is empty then leave the
385 # run list empty. This implies copying all available data. 386 # run list empty. This implies copying all available data.
386 - elif filename == 'NONE': 387 + elif filename.is_empty():
387 self._log_string(gammalib.NORMAL, 'Copy all available data') 388 self._log_string(gammalib.NORMAL, 'Copy all available data')
388 389
389 # ... otherwise raise an exception 390 # ... otherwise raise an exception
390 else: 391 else:
391 - msg = '*** ERROR: Runlist file "%s" not available' % filename 392 + msg = '*** ERROR: Runlist file "%s" not available' % filename.url()
392 raise RuntimeError(msg) 393 raise RuntimeError(msg)
393 394
394 # Return run list 395 # Return run list
cscripts/csiactobs.py
@@ -106,7 +106,7 @@ class csiactobs(ctools.cscript): @@ -106,7 +106,7 @@ class csiactobs(ctools.cscript):
106 self._datapath = gammalib.expand_env(self._datapath) 106 self._datapath = gammalib.expand_env(self._datapath)
107 107
108 # Query input parameters 108 # Query input parameters
109 - self['inmodel'].filename() 109 + self['inmodel'].query()
110 110
111 # Read FITS production 111 # Read FITS production
112 self._prodname = self['prodname'].string() 112 self._prodname = self['prodname'].string()
@@ -161,13 +161,17 @@ class csiactobs(ctools.cscript): @@ -161,13 +161,17 @@ class csiactobs(ctools.cscript):
161 # Open master index file and look for prodname 161 # Open master index file and look for prodname
162 master_file = os.path.join(self._datapath, self._master_indx) 162 master_file = os.path.join(self._datapath, self._master_indx)
163 if not os.path.isfile(master_file): 163 if not os.path.isfile(master_file):
164 - raise RuntimeError('FITS data store not available. No master index file found. Make sure the file is copied from the server and your datapath is set correctly.') 164 + raise RuntimeError('FITS data store not available. No master '
  165 + 'index file found. Make sure the file is '
  166 + 'copied from the server and your datapath '
  167 + 'is set correctly.')
165 168
166 # Open and load JSON file 169 # Open and load JSON file
167 json_data = open(master_file).read() 170 json_data = open(master_file).read()
168 data = json.loads(json_data) 171 data = json.loads(json_data)
169 if not 'datasets' in data: 172 if not 'datasets' in data:
170 - raise RuntimeError('Key "datasets" not available in master index file.') 173 + raise RuntimeError('Key "datasets" not available in master '
  174 + 'index file.')
171 175
172 # Get configurations 176 # Get configurations
173 configs = data['datasets'] 177 configs = data['datasets']
@@ -190,14 +194,21 @@ class csiactobs(ctools.cscript): @@ -190,14 +194,21 @@ class csiactobs(ctools.cscript):
190 194
191 # Check index files 195 # Check index files
192 if self._hdu_index == '' or self._obs_index == '': 196 if self._hdu_index == '' or self._obs_index == '':
193 - raise RuntimeError('*** ERROR: FITS data store "'+self._prodname+'" not available. Run csiactdata to get a list of available storage names') 197 + raise RuntimeError('*** ERROR: FITS data store "'+self._prodname+
  198 + '" not available. Run csiactdata to get a list '
  199 + 'of available storage names')
194 200
195 # Check HDU names 201 # Check HDU names
196 filename = gammalib.GFilename(self._hdu_index+'[HDU_INDEX]') 202 filename = gammalib.GFilename(self._hdu_index+'[HDU_INDEX]')
197 if not filename.is_fits(): 203 if not filename.is_fits():
198 - raise RuntimeError('*** ERROR: HDU index file "'+self._hdu_index+'[HDU_INDEX]" for FITS data store "'+self._prodname+'" not available. Check your master index file or run csiactdata to get a list of available storage names.')  
199 -  
200 - # Check for existence of 'BKG_SCALE' in the observation index file if required 204 + raise RuntimeError('*** ERROR: HDU index file "'+self._hdu_index+
  205 + '[HDU_INDEX]" for FITS data store "'+
  206 + self._prodname+'" not available. Check your '
  207 + 'master index file or run csiactdata to get '
  208 + 'a list of available storage names.')
  209 +
  210 + # Check for existence of 'BKG_SCALE' in the observation index file if
  211 + # required
201 if self._use_bkg_scale: 212 if self._use_bkg_scale:
202 213
203 # Create filename 214 # Create filename
@@ -209,7 +220,8 @@ class csiactobs(ctools.cscript): @@ -209,7 +220,8 @@ class csiactobs(ctools.cscript):
209 # Open FITS file 220 # Open FITS file
210 fits = gammalib.GFits(self._obs_index) 221 fits = gammalib.GFits(self._obs_index)
211 222
212 - # Check if column "BKG_SCALE" is found and signal its possible usage 223 + # Check if column "BKG_SCALE" is found and signal its possible
  224 + # usage
213 if not fits['OBS_INDEX'].contains('BKG_SCALE'): 225 if not fits['OBS_INDEX'].contains('BKG_SCALE'):
214 self._use_bkg_scale = False 226 self._use_bkg_scale = False
215 227
@@ -221,8 +233,8 @@ class csiactobs(ctools.cscript): @@ -221,8 +233,8 @@ class csiactobs(ctools.cscript):
221 self._use_bkg_scale = False 233 self._use_bkg_scale = False
222 234
223 # Create base data directory from hdu index file location 235 # Create base data directory from hdu index file location
224 - self._subdir = os.path.dirname(self._hdu_index)  
225 - self._debug = False # Debugging in client tools 236 + self._subdir = os.path.dirname(self._hdu_index)
  237 + self._debug = False # Debugging in client tools
226 238
227 # Write input parameters into logger 239 # Write input parameters into logger
228 self._log_parameters(gammalib.TERSE) 240 self._log_parameters(gammalib.TERSE)
@@ -230,7 +242,7 @@ class csiactobs(ctools.cscript): @@ -230,7 +242,7 @@ class csiactobs(ctools.cscript):
230 # Return 242 # Return
231 return 243 return
232 244
233 - def _background_spectrum(self, prefactor, index, emin = 0.01, emax = 100.0): 245 + def _background_spectrum(self, prefactor, index, emin=0.01, emax=100.0):
234 """ 246 """
235 Create a background spectrum model dependent on user parameters 247 Create a background spectrum model dependent on user parameters
236 248
@@ -419,8 +431,10 @@ class csiactobs(ctools.cscript): @@ -419,8 +431,10 @@ class csiactobs(ctools.cscript):
419 """ 431 """
420 # If there are models provided by "inmodels" then append them now to 432 # If there are models provided by "inmodels" then append them now to
421 # the model container 433 # the model container
422 - filename = self['inmodel'].filename().url()  
423 - if filename != '' and filename != 'NONE': 434 + if self['inmodel'].is_valid():
  435 +
  436 + # Get filename
  437 + filename = self['inmodel'].filename().url()
424 438
425 # Log header and input model file 439 # Log header and input model file
426 self._log_header1(gammalib.TERSE, 'Append input models') 440 self._log_header1(gammalib.TERSE, 'Append input models')
@@ -505,8 +519,7 @@ class csiactobs(ctools.cscript): @@ -505,8 +519,7 @@ class csiactobs(ctools.cscript):
505 519
506 # Return filename 520 # Return filename
507 return filename 521 return filename
508 -  
509 - 522 +
510 def _is_present(self, filename, obs_id, filetype): 523 def _is_present(self, filename, obs_id, filetype):
511 """ 524 """
512 Checks if a filename is present 525 Checks if a filename is present
cscripts/cslightcrv.py
@@ -120,7 +120,7 @@ class cslightcrv(ctools.csobservation): @@ -120,7 +120,7 @@ class cslightcrv(ctools.csobservation):
120 120
121 # Read ahead output parameters 121 # Read ahead output parameters
122 if self._read_ahead(): 122 if self._read_ahead():
123 - self['outfile'].filename() 123 + self['outfile'].query()
124 124
125 # Write input parameters into logger 125 # Write input parameters into logger
126 self._log_parameters(gammalib.TERSE) 126 self._log_parameters(gammalib.TERSE)
@@ -592,11 +592,11 @@ class cslightcrv(ctools.csobservation): @@ -592,11 +592,11 @@ class cslightcrv(ctools.csobservation):
592 # Write header 592 # Write header
593 self._log_header1(gammalib.TERSE, 'Save light curve') 593 self._log_header1(gammalib.TERSE, 'Save light curve')
594 594
595 - # Get light curve filename  
596 - outfile = self['outfile'].filename() 595 + # Continue only if filename is valid
  596 + if self['outfile'].is_valid():
597 597
598 - # Continue only filename and residual map are valid  
599 - if self._fits != None: 598 + # Get light curve filename
  599 + outfile = self['outfile'].filename()
600 600
601 # Log file name 601 # Log file name
602 self._log_value(gammalib.NORMAL, 'Light curve file', outfile.url()) 602 self._log_value(gammalib.NORMAL, 'Light curve file', outfile.url())
cscripts/csmodelinfo.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Shows the content of a model container 3 # Shows the content of a model container
4 # 4 #
5 -# Copyright (C) 2015-2017 Michael Mayer 5 +# Copyright (C) 2015-2018 Michael Mayer
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -75,7 +75,7 @@ class csmodelinfo(ctools.cscript): @@ -75,7 +75,7 @@ class csmodelinfo(ctools.cscript):
75 75
76 # Query ahead DS9 filename 76 # Query ahead DS9 filename
77 if self._read_ahead(): 77 if self._read_ahead():
78 - self['outds9file'].filename() 78 + self['outds9file'].query()
79 79
80 # Write input parameters into logger 80 # Write input parameters into logger
81 self._log_parameters(gammalib.TERSE) 81 self._log_parameters(gammalib.TERSE)
@@ -122,9 +122,9 @@ class csmodelinfo(ctools.cscript): @@ -122,9 +122,9 @@ class csmodelinfo(ctools.cscript):
122 122
123 # Loop over models and initialise dictionaries with model names 123 # Loop over models and initialise dictionaries with model names
124 for model in self._models: 124 for model in self._models:
125 - types[model.type()] = 0 125 + types[model.type()] = 0
126 instruments[model.instruments()] = 0 126 instruments[model.instruments()] = 0
127 - pars_at_limit[model.name()] = [] 127 + pars_at_limit[model.name()] = []
128 128
129 # Loop over models again and fill values to be dumped 129 # Loop over models again and fill values to be dumped
130 for model in self._models: 130 for model in self._models:
@@ -244,12 +244,12 @@ class csmodelinfo(ctools.cscript): @@ -244,12 +244,12 @@ class csmodelinfo(ctools.cscript):
244 """ 244 """
245 Save models to ds9 region file 245 Save models to ds9 region file
246 """ 246 """
247 - # Get output filename  
248 - ds9file = self['outds9file'].filename()  
249 -  
250 # Check if DS9 file is valid 247 # Check if DS9 file is valid
251 - if ds9file != '' and ds9file != 'NONE':  
252 - 248 + if self['outds9file'].is_valid():
  249 +
  250 + # Get output filename
  251 + ds9file = self['outds9file'].filename()
  252 +
253 # Write header 253 # Write header
254 self._log_header1(gammalib.TERSE, 'Save models in DS9 file') 254 self._log_header1(gammalib.TERSE, 'Save models in DS9 file')
255 255
cscripts/csmodelmerge.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Merge model definition XML files 3 # Merge model definition XML files
4 # 4 #
5 -# Copyright (C) 2015-2017 Michael Mayer 5 +# Copyright (C) 2015-2018 Michael Mayer
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
cscripts/csmodelselect.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Selects model from a model definition XML file 3 # Selects model from a model definition XML file
4 # 4 #
5 -# Copyright (C) 2016-2017 Juergen Knoedlseder 5 +# Copyright (C) 2016-2018 Juergen Knoedlseder
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
cscripts/csmodelsois.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Puts subset of sources in diffuse model cube 3 # Puts subset of sources in diffuse model cube
4 # 4 #
5 -# Copyright (C) 2017 Josh Cardenzana 5 +# Copyright (C) 2017-2018 Josh Cardenzana
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -73,7 +73,7 @@ class csmodelsois(ctools.cscript): @@ -73,7 +73,7 @@ class csmodelsois(ctools.cscript):
73 73
74 # Read input parameters 74 # Read input parameters
75 ptsrcsig = self['ptsrcsig'].real() 75 ptsrcsig = self['ptsrcsig'].real()
76 - 76 +
77 # Get the cube centre coordinates 77 # Get the cube centre coordinates
78 self._cubegen['coordsys'].string(self['coordsys'].string()) 78 self._cubegen['coordsys'].string(self['coordsys'].string())
79 if self['coordsys'].string() == 'CEL': 79 if self['coordsys'].string() == 'CEL':
@@ -88,7 +88,7 @@ class csmodelsois(ctools.cscript): @@ -88,7 +88,7 @@ class csmodelsois(ctools.cscript):
88 self._cubegen['nxpix'].integer(self['nxpix'].integer()) 88 self._cubegen['nxpix'].integer(self['nxpix'].integer())
89 self._cubegen['nypix'].integer(self['nypix'].integer()) 89 self._cubegen['nypix'].integer(self['nypix'].integer())
90 self._cubegen['proj'].string(self['proj'].string()) 90 self._cubegen['proj'].string(self['proj'].string())
91 - 91 +
92 # Get the energy binning parameters 92 # Get the energy binning parameters
93 self._cubegen['ebinalg'].string(self['ebinalg'].string()) 93 self._cubegen['ebinalg'].string(self['ebinalg'].string())
94 if self['ebinalg'].string() == 'FILE': 94 if self['ebinalg'].string() == 'FILE':
@@ -98,13 +98,13 @@ class csmodelsois(ctools.cscript): @@ -98,13 +98,13 @@ class csmodelsois(ctools.cscript):
98 self._cubegen['emax'].real(self['emax'].real()) 98 self._cubegen['emax'].real(self['emax'].real())
99 self._cubegen['enumbins'].integer(self['enumbins'].integer()) 99 self._cubegen['enumbins'].integer(self['enumbins'].integer())
100 100
101 - # Get remaining hidden parameters 101 + # Set point source significance
102 self._cubegen['ptsrcsig'].real(ptsrcsig) 102 self._cubegen['ptsrcsig'].real(ptsrcsig)
103 - 103 +
104 # Read optionally output cube filenames 104 # Read optionally output cube filenames
105 if self._read_ahead(): 105 if self._read_ahead():
106 self._cubegen['outcube'].filename(self['outcube'].filename()) 106 self._cubegen['outcube'].filename(self['outcube'].filename())
107 - self['outmodel'].filename() 107 + self['outmodel'].query()
108 108
109 # Write parameters into logger 109 # Write parameters into logger
110 self._log_parameters(gammalib.TERSE) 110 self._log_parameters(gammalib.TERSE)
@@ -185,12 +185,12 @@ class csmodelsois(ctools.cscript): @@ -185,12 +185,12 @@ class csmodelsois(ctools.cscript):
185 """ 185 """
186 # Save the generated cube if the cube and filename are not empty 186 # Save the generated cube if the cube and filename are not empty
187 if ((not self._cubegen.mapcube().cube().is_empty()) and 187 if ((not self._cubegen.mapcube().cube().is_empty()) and
188 - self._is_valid_filename(self['outcube'].filename())): 188 + self['outcube'].is_valid()):
189 self._cubegen.mapcube().save(self['outcube'].filename(), 189 self._cubegen.mapcube().save(self['outcube'].filename(),
190 - self['clobber'].boolean()) 190 + self['clobber'].boolean())
191 191
192 # If requested, save the updated list of models 192 # If requested, save the updated list of models
193 - if self._is_valid_filename(self['outmodel'].filename()): 193 + if self['outmodel'].is_valid():
194 194
195 # Generate a list of models that will be output to file 195 # Generate a list of models that will be output to file
196 outmodels = gammalib.GModels(self._models) 196 outmodels = gammalib.GModels(self._models)
cscripts/csobsdef.py
@@ -107,7 +107,7 @@ class csobsdef(ctools.cscript): @@ -107,7 +107,7 @@ class csobsdef(ctools.cscript):
107 107
108 # Read ahead parameters 108 # Read ahead parameters
109 if self._read_ahead(): 109 if self._read_ahead():
110 - self['outobs'].filename() 110 + self['outobs'].query()
111 111
112 # Write input parameters into logger 112 # Write input parameters into logger
113 self._log_parameters(gammalib.TERSE) 113 self._log_parameters(gammalib.TERSE)
@@ -351,11 +351,11 @@ class csobsdef(ctools.cscript): @@ -351,11 +351,11 @@ class csobsdef(ctools.cscript):
351 # Write header and filename into logger 351 # Write header and filename into logger
352 self._log_header1(gammalib.TERSE, 'Save observation definition XML file') 352 self._log_header1(gammalib.TERSE, 'Save observation definition XML file')
353 353
354 - # Get output filename in case it was not read ahead  
355 - outobs = self['outobs'].filename()  
356 -  
357 # Check if observation definition XML file is valid 354 # Check if observation definition XML file is valid
358 - if outobs.url() != 'NONE': 355 + if self['outobs'].is_valid():
  356 +
  357 + # Get output filename in case it was not read ahead
  358 + outobs = self['outobs'].filename()
359 359
360 # Log filename 360 # Log filename
361 self._log_value(gammalib.NORMAL, 'Observation XML file', outobs.url()) 361 self._log_value(gammalib.NORMAL, 'Observation XML file', outobs.url())
cscripts/csobsinfo.py
@@ -76,7 +76,7 @@ class csobsinfo(ctools.csobservation): @@ -76,7 +76,7 @@ class csobsinfo(ctools.csobservation):
76 76
77 # Read ahead DS9 filename 77 # Read ahead DS9 filename
78 if self._read_ahead(): 78 if self._read_ahead():
79 - self['outds9file'].filename() 79 + self['outds9file'].query()
80 80
81 # Write input parameters into logger 81 # Write input parameters into logger
82 self._log_parameters(gammalib.TERSE) 82 self._log_parameters(gammalib.TERSE)
@@ -317,12 +317,11 @@ class csobsinfo(ctools.csobservation): @@ -317,12 +317,11 @@ class csobsinfo(ctools.csobservation):
317 observation container into a DS9 region file. If "NONE" is 317 observation container into a DS9 region file. If "NONE" is
318 specified for the "outds9file" parameter the method does nothing. 318 specified for the "outds9file" parameter the method does nothing.
319 """ 319 """
320 -  
321 - # Get output filename in case it was not read ahead  
322 - ds9file = self['outds9file'].filename()  
323 -  
324 # Check if DS9 file is valid 320 # Check if DS9 file is valid
325 - if ds9file.url() != 'NONE': 321 + if self['outds9file'].is_valid():
  322 +
  323 + # Get output filename in case it was not read ahead
  324 + ds9file = self['outds9file'].filename()
326 325
327 # Write header 326 # Write header
328 self._log_header1(gammalib.TERSE, 'Save pointings in DS9 file') 327 self._log_header1(gammalib.TERSE, 'Save pointings in DS9 file')
cscripts/csphagen.py
@@ -161,11 +161,15 @@ class csphagen(ctools.csobservation): @@ -161,11 +161,15 @@ class csphagen(ctools.csobservation):
161 self._setup_observations(self.obs(), True, True, False) 161 self._setup_observations(self.obs(), True, True, False)
162 162
163 # Get spatial component of source model if an input model is defined 163 # Get spatial component of source model if an input model is defined
164 - inmodel = self['inmodel'].filename()  
165 - if not self['inmodel'].is_undefined(): 164 + if self['inmodel'].is_valid():
  165 + inmodel = self['inmodel'].filename()
166 models = gammalib.GModels(inmodel) 166 models = gammalib.GModels(inmodel)
167 name = self['srcname'].string() 167 name = self['srcname'].string()
168 self._src_model = models[name].spatial().clone() 168 self._src_model = models[name].spatial().clone()
  169 + elif self.obs().models().size() > 0:
  170 + name = self['srcname'].string()
  171 + if self.obs().models().contains(name):
  172 + self._src_model = self.obs().models()[name].spatial()
169 173
170 # Set energy bounds 174 # Set energy bounds
171 self._ebounds = self._create_ebounds() 175 self._ebounds = self._create_ebounds()
@@ -174,7 +178,7 @@ class csphagen(ctools.csobservation): @@ -174,7 +178,7 @@ class csphagen(ctools.csobservation):
174 self._src_reg = gammalib.GSkyRegions() 178 self._src_reg = gammalib.GSkyRegions()
175 179
176 # Exclusion map 180 # Exclusion map
177 - if not self['inexclusion'].is_undefined(): 181 + if self['inexclusion'].is_valid():
178 inexclusion = self['inexclusion'].filename() 182 inexclusion = self['inexclusion'].filename()
179 self._excl_reg = gammalib.GSkyRegionMap(inexclusion) 183 self._excl_reg = gammalib.GSkyRegionMap(inexclusion)
180 self._has_exclusion = True 184 self._has_exclusion = True
@@ -416,7 +420,6 @@ class csphagen(ctools.csobservation): @@ -416,7 +420,6 @@ class csphagen(ctools.csobservation):
416 for obs in self.obs(): 420 for obs in self.obs():
417 421
418 # Skip non CTA observations 422 # Skip non CTA observations
419 - #if obs.instrument() != 'CTA':  
420 if obs.classname() != 'GCTAObservation': 423 if obs.classname() != 'GCTAObservation':
421 self._log_string(gammalib.NORMAL, 'Skip %s observation "%s"' % \ 424 self._log_string(gammalib.NORMAL, 'Skip %s observation "%s"' % \
422 (obs.instrument(), obs.id())) 425 (obs.instrument(), obs.id()))
cscripts/csphasecrv.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Generates spectra as a function of phase 3 # Generates spectra as a function of phase
4 # 4 #
5 -# Copyright (C) 2017 Rolf Buehler 5 +# Copyright (C) 2017-2018 Rolf Buehler
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
cscripts/csresmap.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Generates a residual map. 3 # Generates a residual map.
4 # 4 #
5 -# Copyright (C) 2014-2017 Michael Mayer 5 +# Copyright (C) 2014-2018 Michael Mayer
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -73,9 +73,7 @@ class csresmap(ctools.csobservation): @@ -73,9 +73,7 @@ class csresmap(ctools.csobservation):
73 # If we have a counts cube, then ask whether we also have a model cube. 73 # If we have a counts cube, then ask whether we also have a model cube.
74 # If a model cube name is given then set self._use_maps=True 74 # If a model cube name is given then set self._use_maps=True
75 if self._skip_binning: 75 if self._skip_binning:
76 - modcube = self['modcube'].filename()  
77 - if modcube != 'NONE':  
78 - self._use_maps = True 76 + self._use_maps = self['modcube'].is_valid()
79 77
80 # If not two maps are given, proceed to set up observation 78 # If not two maps are given, proceed to set up observation
81 if not self._use_maps: 79 if not self._use_maps:
cscripts/csresspec.py
@@ -85,9 +85,7 @@ class csresspec(ctools.csobservation): @@ -85,9 +85,7 @@ class csresspec(ctools.csobservation):
85 # components is required, query for precomputed model file and set 85 # components is required, query for precomputed model file and set
86 # use_maps to True 86 # use_maps to True
87 if self.obs().size() == 1 and n_binned == 1 and not components: 87 if self.obs().size() == 1 and n_binned == 1 and not components:
88 - modcube = self['modcube'].filename()  
89 - if modcube != 'NONE':  
90 - self._use_maps = True 88 + self._use_maps = self['modcube'].is_valid()
91 89
92 # If there are unbinned observations query the energy binning parameters 90 # If there are unbinned observations query the energy binning parameters
93 if n_unbinned != 0: 91 if n_unbinned != 0:
@@ -130,7 +128,7 @@ class csresspec(ctools.csobservation): @@ -130,7 +128,7 @@ class csresspec(ctools.csobservation):
130 self['ra'].real() 128 self['ra'].real()
131 self['dec'].real() 129 self['dec'].real()
132 self['rad'].real() 130 self['rad'].real()
133 - self['regfile'].filename() 131 + self['regfile'].query()
134 132
135 # Unless all observations are On/Off, or we are using precomputed model 133 # Unless all observations are On/Off, or we are using precomputed model
136 # maps query whether to use energy dispersion 134 # maps query whether to use energy dispersion
@@ -358,11 +356,15 @@ class csresspec(ctools.csobservation): @@ -358,11 +356,15 @@ class csresspec(ctools.csobservation):
358 356
359 # Apply user mask 357 # Apply user mask
360 if self._mask: 358 if self._mask:
  359 + if self['regfile'].is_valid():
  360 + regfile = self['regfile']
  361 + else:
  362 + regfile = 'NONE'
361 msg = 'Masking ROI requested by user' 363 msg = 'Masking ROI requested by user'
362 self._log_string(gammalib.EXPLICIT, msg) 364 self._log_string(gammalib.EXPLICIT, msg)
363 cube = self._masked_cube(cube, self['ra'], self['dec'], 365 cube = self._masked_cube(cube, self['ra'], self['dec'],
364 self['rad'], 366 self['rad'],
365 - regfile=self['regfile']) 367 + regfile=regfile)
366 368
367 # Extract skymap and clip at 0 to null masked areas 369 # Extract skymap and clip at 0 to null masked areas
368 counts = cube.counts().copy() 370 counts = cube.counts().copy()
@@ -688,17 +690,14 @@ class csresspec(ctools.csobservation): @@ -688,17 +690,14 @@ class csresspec(ctools.csobservation):
688 # Write header 690 # Write header
689 self._log_header1(gammalib.TERSE, 'Save residuals') 691 self._log_header1(gammalib.TERSE, 'Save residuals')
690 692
691 - # Continue only if FITS file is valid  
692 - if self._fits != None:  
693 -  
694 - # Get outfile parameter  
695 - outfile = self['outfile'].filename() 693 + # Get outfile parameter
  694 + outfile = self['outfile'].filename()
696 695
697 - # Log file name  
698 - self._log_value(gammalib.NORMAL, 'Residuals file', outfile.url()) 696 + # Log file name
  697 + self._log_value(gammalib.NORMAL, 'Residuals file', outfile.url())
699 698
700 - # Save residuals  
701 - self._fits.saveto(outfile, self['clobber'].boolean()) 699 + # Save residuals
  700 + self._fits.saveto(outfile, self['clobber'].boolean())
702 701
703 # Return 702 # Return
704 return 703 return
cscripts/cssens.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Computes the array sensitivity using the Test Statistic for a test source 3 # Computes the array sensitivity using the Test Statistic for a test source
4 # 4 #
5 -# Copyright (C) 2011-2017 Juergen Knoedlseder 5 +# Copyright (C) 2011-2018 Juergen Knoedlseder
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -132,8 +132,7 @@ class cssens(ctools.csobservation): @@ -132,8 +132,7 @@ class cssens(ctools.csobservation):
132 Observation container 132 Observation container
133 """ 133 """
134 # If an observation was provided on input then load it from XML file 134 # If an observation was provided on input then load it from XML file
135 - filename = self['inobs'].filename()  
136 - if filename != 'NONE' and filename != '': 135 + if self['inobs'].is_valid():
137 obs = self._get_observations() 136 obs = self._get_observations()
138 137
139 # ... otherwise allocate a single observation 138 # ... otherwise allocate a single observation
cscripts/cssrcdetect.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Detects sources in a sky map 3 # Detects sources in a sky map
4 # 4 #
5 -# Copyright (C) 2016-2017 Juergen Knoedlseder 5 +# Copyright (C) 2016-2018 Juergen Knoedlseder
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -72,7 +72,7 @@ class cssrcdetect(ctools.cscript): @@ -72,7 +72,7 @@ class cssrcdetect(ctools.cscript):
72 self['exclrad'].real() 72 self['exclrad'].real()
73 self['fit_pos'].boolean() 73 self['fit_pos'].boolean()
74 self['fit_shape'].boolean() 74 self['fit_shape'].boolean()
75 - 75 +
76 # Query ahead output model filename 76 # Query ahead output model filename
77 if self._read_ahead(): 77 if self._read_ahead():
78 self['outmodel'].filename() 78 self['outmodel'].filename()
cscripts/cstsdist.py
@@ -73,12 +73,7 @@ class cstsdist(ctools.csobservation): @@ -73,12 +73,7 @@ class cstsdist(ctools.csobservation):
73 # Query parameters 73 # Query parameters
74 self['edisp'].boolean() 74 self['edisp'].boolean()
75 self['ntrials'].integer() 75 self['ntrials'].integer()
76 -  
77 self['debug'].boolean() 76 self['debug'].boolean()
78 -  
79 - # Read ahead output parameters  
80 - #if self._read_ahead():  
81 - # self['outfile'].filename()  
82 self['outfile'].filename() 77 self['outfile'].filename()
83 78
84 # Write input parameters into logger 79 # Write input parameters into logger
cscripts/cstsmapmerge.py
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 # ========================================================================== 2 # ==========================================================================
3 # Merge Test Statistic maps 3 # Merge Test Statistic maps
4 # 4 #
5 -# Copyright (C) 2015-2017 Michael Mayer 5 +# Copyright (C) 2015-2018 Michael Mayer
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
8 # it under the terms of the GNU General Public License as published by 8 # it under the terms of the GNU General Public License as published by
@@ -274,7 +274,8 @@ class cstsmapmerge(ctools.cscript): @@ -274,7 +274,8 @@ class cstsmapmerge(ctools.cscript):
274 if not gammalib.GFilename(fitsfile).is_fits(): 274 if not gammalib.GFilename(fitsfile).is_fits():
275 275
276 # Log message 276 # Log message
277 - self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +' (not a FITS file)') 277 + self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +
  278 + ' (not a FITS file)')
278 279
279 # Continue 280 # Continue
280 continue 281 continue
@@ -292,8 +293,10 @@ class cstsmapmerge(ctools.cscript): @@ -292,8 +293,10 @@ class cstsmapmerge(ctools.cscript):
292 file0 = fitsfile 293 file0 = fitsfile
293 294
294 # Log message 295 # Log message
295 - pix_info = ' (%d TS pixels computed)' % self._get_number_of_ts_pixels(fitsfile)  
296 - self._log_value(gammalib.TERSE, 'Initial TS map file', fitsfile + pix_info) 296 + pix_info = ' (%d TS pixels computed)' % \
  297 + self._get_number_of_ts_pixels(fitsfile)
  298 + self._log_value(gammalib.TERSE, 'Initial TS map file',
  299 + fitsfile + pix_info)
297 300
298 # Leave loop 301 # Leave loop
299 break 302 break
@@ -305,7 +308,8 @@ class cstsmapmerge(ctools.cscript): @@ -305,7 +308,8 @@ class cstsmapmerge(ctools.cscript):
305 fits.close() 308 fits.close()
306 309
307 # Info message 310 # Info message
308 - self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +' (no "STATUS MAP" extension)') 311 + self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +
  312 + ' (no "STATUS MAP" extension)')
309 313
310 # Continue 314 # Continue
311 continue 315 continue
@@ -313,10 +317,9 @@ class cstsmapmerge(ctools.cscript): @@ -313,10 +317,9 @@ class cstsmapmerge(ctools.cscript):
313 # Signal if no suitable file was found 317 # Signal if no suitable file was found
314 if file0 == '': 318 if file0 == '':
315 msg = 'None of the provided files seems to be a sliced ' + \ 319 msg = 'None of the provided files seems to be a sliced ' + \
316 - 'TS map file (none has a "STATUS MAP" ' + \  
317 - 'extension)' 320 + 'TS map file (none has a "STATUS MAP" ' + \
  321 + 'extension)'
318 raise RuntimeError(msg) 322 raise RuntimeError(msg)
319 -  
320 323
321 # ... otherwise merge files 324 # ... otherwise merge files
322 else: 325 else:
@@ -338,7 +341,8 @@ class cstsmapmerge(ctools.cscript): @@ -338,7 +341,8 @@ class cstsmapmerge(ctools.cscript):
338 341
339 # Skip if file is not FITS 342 # Skip if file is not FITS
340 if not gammalib.GFilename(fitsfile).is_fits(): 343 if not gammalib.GFilename(fitsfile).is_fits():
341 - self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +' (not a FITS file)') 344 + self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +
  345 + ' (not a FITS file)')
342 continue 346 continue
343 347
344 # Open FITS file 348 # Open FITS file
@@ -347,15 +351,18 @@ class cstsmapmerge(ctools.cscript): @@ -347,15 +351,18 @@ class cstsmapmerge(ctools.cscript):
347 # Skip if file does not contain status map 351 # Skip if file does not contain status map
348 if not fits.contains('STATUS MAP'): 352 if not fits.contains('STATUS MAP'):
349 fits.close() 353 fits.close()
350 - self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +' (no "STATUS MAP" extension)') 354 + self._log_value(gammalib.EXPLICIT, 'Skip file', fitsfile +
  355 + ' (no "STATUS MAP" extension)')
351 continue 356 continue
352 357
353 # Close FITS file 358 # Close FITS file
354 fits.close() 359 fits.close()
355 360
356 # Logging 361 # Logging
357 - pix_info = ' (%d TS pixels computed)' % self._get_number_of_ts_pixels(fitsfile)  
358 - self._log_value(gammalib.TERSE, 'Merge TS map file', fitsfile + pix_info) 362 + pix_info = ' (%d TS pixels computed)' % \
  363 + self._get_number_of_ts_pixels(fitsfile)
  364 + self._log_value(gammalib.TERSE, 'Merge TS map file',
  365 + fitsfile + pix_info)
359 366
360 # Merge TS map 367 # Merge TS map
361 self._merge_ts_map(fitsfile) 368 self._merge_ts_map(fitsfile)
cscripts/obsutils.py
@@ -120,6 +120,8 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, @@ -120,6 +120,8 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0,
120 120
121 # Allocate csphagen application and set parameters 121 # Allocate csphagen application and set parameters
122 phagen = cscripts.csphagen(obssim.obs()) 122 phagen = cscripts.csphagen(obssim.obs())
  123 + phagen['inmodel'] = 'NONE'
  124 + phagen['srcname'] = onsrc
123 phagen['ebinalg'] = 'LOG' 125 phagen['ebinalg'] = 'LOG'
124 phagen['emin'] = emin 126 phagen['emin'] = emin
125 phagen['emax'] = emax 127 phagen['emax'] = emax
@@ -187,9 +189,9 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0, @@ -187,9 +189,9 @@ def sim(obs, log=False, debug=False, chatter=2, edisp=False, seed=0,
187 # Set stacked response 189 # Set stacked response
188 if edisp: 190 if edisp:
189 binning.obs()[0].response(response['expcube'], 191 binning.obs()[0].response(response['expcube'],
190 - response['psfcube'],  
191 - response['edispcube'],  
192 - response['bkgcube']) 192 + response['psfcube'],
  193 + response['edispcube'],
  194 + response['bkgcube'])
193 else: 195 else:
194 binning.obs()[0].response(response['expcube'], 196 binning.obs()[0].response(response['expcube'],
195 response['psfcube'], 197 response['psfcube'],
@@ -787,9 +789,26 @@ def get_onoff_obs(cls, obs): @@ -787,9 +789,26 @@ def get_onoff_obs(cls, obs):
787 if cls._logExplicit(): 789 if cls._logExplicit():
788 cls._log.header3('Creating On/Off observations') 790 cls._log.header3('Creating On/Off observations')
789 791
  792 + # Initialise inmodel, srcname and inexclusion
  793 + inmodel = 'NONE'
  794 + srcname = ''
  795 + inexclusion = 'NONE'
  796 +
  797 + # Set inmodel, srcname and inexclusion if possible
  798 + if 'inmodel' in cls:
  799 + if cls['inmodel'].is_valid():
  800 + inmodel = cls['inmodel'].value()
  801 + if 'srcname' in cls:
  802 + srcname = cls['srcname'].value()
  803 + if 'inexclusion' in cls:
  804 + if cls['inexclusion'].is_valid():
  805 + inexclusion = cls['inexclusion'].value()
  806 +
790 # Create On/Off observations 807 # Create On/Off observations
791 phagen = cscripts.csphagen(obs) 808 phagen = cscripts.csphagen(obs)
792 - phagen['inexclusion'] = cls['inexclusion'].value() 809 + phagen['inmodel'] = inmodel
  810 + phagen['srcname'] = srcname
  811 + phagen['inexclusion'] = inexclusion
793 phagen['emin'] = cls['emin'].real() 812 phagen['emin'] = cls['emin'].real()
794 phagen['emax'] = cls['emax'].real() 813 phagen['emax'] = cls['emax'].real()
795 phagen['enumbins'] = cls['enumbins'].integer() 814 phagen['enumbins'] = cls['enumbins'].integer()
src/support/ctool.cpp
@@ -1182,8 +1182,8 @@ std::string ctool::set_outfile_name(const std::string& filename) @@ -1182,8 +1182,8 @@ std::string ctool::set_outfile_name(const std::string& filename)
1182 bool ctool::is_stacked(void) 1182 bool ctool::is_stacked(void)
1183 { 1183 {
1184 // First query the minimum and maximum energies 1184 // First query the minimum and maximum energies
1185 - (*this)["emin"].query();  
1186 - (*this)["emax"].query(); 1185 + (*this)["emin"].real();
  1186 + (*this)["emax"].real();
1187 1187
1188 // Now query the number of energy bins and set the stacked flag 1188 // Now query the number of energy bins and set the stacked flag
1189 bool stacked = ((*this)["enumbins"].integer() > 0) ? true : false; 1189 bool stacked = ((*this)["enumbins"].integer() > 0) ? true : false;
@@ -1191,13 +1191,13 @@ bool ctool::is_stacked(void) @@ -1191,13 +1191,13 @@ bool ctool::is_stacked(void)
1191 // If a stacked analysis is requested then query the spatial definition 1191 // If a stacked analysis is requested then query the spatial definition
1192 // of the cube 1192 // of the cube
1193 if (stacked) { 1193 if (stacked) {
1194 - (*this)["coordsys"].query();  
1195 - (*this)["proj"].query();  
1196 - (*this)["xref"].query();  
1197 - (*this)["yref"].query();  
1198 - (*this)["nxpix"].query();  
1199 - (*this)["nypix"].query();  
1200 - (*this)["binsz"].query(); 1194 + (*this)["coordsys"].string();
  1195 + (*this)["proj"].string();
  1196 + (*this)["xref"].real();
  1197 + (*this)["yref"].real();
  1198 + (*this)["nxpix"].integer();
  1199 + (*this)["nypix"].integer();
  1200 + (*this)["binsz"].real();
1201 } 1201 }
1202 1202
1203 // Return stacked flag 1203 // Return stacked flag
@@ -1229,22 +1229,22 @@ bool ctool::is_onoff(void) @@ -1229,22 +1229,22 @@ bool ctool::is_onoff(void)
1229 1229
1230 // Query csphagen parameters 1230 // Query csphagen parameters
1231 (*this)["inexclusion"].query(); 1231 (*this)["inexclusion"].query();
1232 - (*this)["emin"].query();  
1233 - (*this)["emax"].query();  
1234 - (*this)["enumbins"].query();  
1235 - (*this)["coordsys"].query();  
1236 - (*this)["xref"].query();  
1237 - (*this)["yref"].query(); 1232 + (*this)["emin"].real();
  1233 + (*this)["emax"].real();
  1234 + (*this)["enumbins"].integer();
  1235 + (*this)["coordsys"].string();
  1236 + (*this)["xref"].real();
  1237 + (*this)["yref"].real();
1238 if ((*this)["srcshape"].string() == "CIRCLE"){ 1238 if ((*this)["srcshape"].string() == "CIRCLE"){
1239 - (*this)["rad"].query(); 1239 + (*this)["rad"].real();
1240 } 1240 }
1241 if ((*this)["bkgmethod"].string() == "REFLECTED"){ 1241 if ((*this)["bkgmethod"].string() == "REFLECTED"){
1242 - (*this)["bkgregmin"].query(); 1242 + (*this)["bkgregmin"].integer();
1243 } 1243 }
1244 - (*this)["maxoffset"].query();  
1245 - (*this)["etruemin"].query();  
1246 - (*this)["etruemax"].query();  
1247 - (*this)["etruebins"].query(); 1244 + (*this)["maxoffset"].real();
  1245 + (*this)["etruemin"].real();
  1246 + (*this)["etruemax"].real();
  1247 + (*this)["etruebins"].integer();
1248 1248
1249 } // endif: method was ONOFF 1249 } // endif: method was ONOFF
1250 1250