Commit 5cf58fba17bde67b4bfb64077d78d1fc67ed2a64

Authored by Jürgen Knödlseder
1 parent 2b504733

Add "calutils" module to cscripts (#1830)

There was a code duplication in csroot2caldb and csobs2caldb, which is now avoided by exporting the code in the "calutils" module.
cscripts/Makefile.am
@@ -44,6 +44,7 @@ pythonscripts = $(builddir)/__init__.py \ @@ -44,6 +44,7 @@ pythonscripts = $(builddir)/__init__.py \
44 $(srcdir)/csiactobs.py \ 44 $(srcdir)/csiactobs.py \
45 $(srcdir)/obsutils.py \ 45 $(srcdir)/obsutils.py \
46 $(srcdir)/modutils.py \ 46 $(srcdir)/modutils.py \
  47 + $(srcdir)/calutils.py \
47 $(srcdir)/ioutils.py 48 $(srcdir)/ioutils.py
48 49
49 # Parfiles to be distributed in $(prefix)/syspfiles 50 # Parfiles to be distributed in $(prefix)/syspfiles
@@ -206,6 +207,7 @@ clean-local: @@ -206,6 +207,7 @@ clean-local:
206 rm -rf $(builddir)/cs*.py; \ 207 rm -rf $(builddir)/cs*.py; \
207 rm -rf $(builddir)/obsutils.py; \ 208 rm -rf $(builddir)/obsutils.py; \
208 rm -rf $(builddir)/modutils.py; \ 209 rm -rf $(builddir)/modutils.py; \
  210 + rm -rf $(builddir)/calutils.py; \
209 rm -rf $(builddir)/ioutils.py; \ 211 rm -rf $(builddir)/ioutils.py; \
210 rm -rf $(builddir)/*.par; \ 212 rm -rf $(builddir)/*.par; \
211 fi 213 fi
cscripts/__init__.py.in
@@ -43,6 +43,7 @@ __all__ = [ @@ -43,6 +43,7 @@ __all__ = [
43 "csworkflow", 43 "csworkflow",
44 "obsutils", 44 "obsutils",
45 "modutils", 45 "modutils",
  46 + "calutils",
46 "ioutils" 47 "ioutils"
47 ] 48 ]
48 if cur_version > req_version: 49 if cur_version > req_version:
@@ -71,6 +72,7 @@ from cscripts.cstsmapsplit import cstsmapsplit @@ -71,6 +72,7 @@ from cscripts.cstsmapsplit import cstsmapsplit
71 from cscripts.csworkflow import csworkflow 72 from cscripts.csworkflow import csworkflow
72 from cscripts import obsutils 73 from cscripts import obsutils
73 from cscripts import modutils 74 from cscripts import modutils
  75 +from cscripts import calutils
74 from cscripts import ioutils 76 from cscripts import ioutils
75 if cur_version > req_version: 77 if cur_version > req_version:
76 from cscripts.csfindobs import csfindobs 78 from cscripts.csfindobs import csfindobs
cscripts/calutils.py 0 → 100755
  1 +# ==========================================================================
  2 +# Utility functions for calibration handling
  3 +#
  4 +# Copyright (C) 2016 Juergen Knoedlseder
  5 +#
  6 +# This program is free software: you can redistribute it and/or modify
  7 +# it under the terms of the GNU General Public License as published by
  8 +# the Free Software Foundation, either version 3 of the License, or
  9 +# (at your option) any later version.
  10 +#
  11 +# This program is distributed in the hope that it will be useful,
  12 +# but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14 +# GNU General Public License for more details.
  15 +#
  16 +# You should have received a copy of the GNU General Public License
  17 +# along with this program. If not, see <http://www.gnu.org/licenses/>.
  18 +#
  19 +# ==========================================================================
  20 +import gammalib
  21 +
  22 +
  23 +# ======================= #
  24 +# Create CIF binary table #
  25 +# ======================= #
  26 +def create_cif_table():
  27 + """
  28 + Create Calibration Database Index File binary table
  29 + """
  30 + # Create binary table
  31 + table = gammalib.GFitsBinTable()
  32 +
  33 + # Append columns. Reference: CAL/GEN/92-008
  34 + table.append(gammalib.GFitsTableStringCol("TELESCOP", 0, 10))
  35 + table.append(gammalib.GFitsTableStringCol("INSTRUME", 0, 10))
  36 + table.append(gammalib.GFitsTableStringCol("DETNAM", 0, 20))
  37 + table.append(gammalib.GFitsTableStringCol("FILTER", 0, 10))
  38 + table.append(gammalib.GFitsTableStringCol("CAL_DEV", 0, 20))
  39 + table.append(gammalib.GFitsTableStringCol("CAL_DIR", 0, 70))
  40 + table.append(gammalib.GFitsTableStringCol("CAL_FILE", 0, 40))
  41 + table.append(gammalib.GFitsTableStringCol("CAL_CLAS", 0, 3))
  42 + table.append(gammalib.GFitsTableStringCol("CAL_DTYP", 0, 4))
  43 + table.append(gammalib.GFitsTableStringCol("CAL_CNAM", 0, 20))
  44 + table.append(gammalib.GFitsTableStringCol("CAL_CBD", 0, 70, 9))
  45 + table.append(gammalib.GFitsTableShortCol("CAL_XNO", 0))
  46 + table.append(gammalib.GFitsTableStringCol("CAL_VSD", 0, 10))
  47 + table.append(gammalib.GFitsTableStringCol("CAL_VST", 0, 8))
  48 + table.append(gammalib.GFitsTableDoubleCol("REF_TIME", 0))
  49 + table.append(gammalib.GFitsTableShortCol("CAL_QUAL", 0))
  50 + table.append(gammalib.GFitsTableStringCol("CAL_DATE", 0, 8))
  51 + table.append(gammalib.GFitsTableStringCol("CAL_DESC", 0, 70))
  52 +
  53 + # Set keywords. Reference: CAL/GEN/92-008
  54 + table.extname("CIF")
  55 + table.card("CIFVERSN", "1992a", "Version of CIF format")
  56 +
  57 + # Return table
  58 + return table
cscripts/csobs2caldb.py
@@ -23,6 +23,7 @@ import os @@ -23,6 +23,7 @@ import os
23 import datetime 23 import datetime
24 import gammalib 24 import gammalib
25 import ctools 25 import ctools
  26 +from cscripts import calutils
26 27
27 28
28 # ================= # 29 # ================= #
@@ -43,11 +44,11 @@ class csobs2caldb(ctools.cscript): @@ -43,11 +44,11 @@ class csobs2caldb(ctools.cscript):
43 # Constructor 44 # Constructor
44 def __init__(self, *argv): 45 def __init__(self, *argv):
45 """ 46 """
46 - Constructor. 47 + Constructor
47 """ 48 """
48 # Set name and version 49 # Set name and version
49 self._name = 'csobs2caldb' 50 self._name = 'csobs2caldb'
50 - self._version = '1.1.0' 51 + self._version = '1.2.0'
51 52
52 # Initialise members 53 # Initialise members
53 self._observation = gammalib.GCTAObservation() 54 self._observation = gammalib.GCTAObservation()
@@ -137,7 +138,7 @@ class csobs2caldb(ctools.cscript): @@ -137,7 +138,7 @@ class csobs2caldb(ctools.cscript):
137 138
138 def _make_irf_file(self): 139 def _make_irf_file(self):
139 """ 140 """
140 - Creates an IRF FITS file. 141 + Creates an IRF FITS file
141 """ 142 """
142 # Write header into logger 143 # Write header into logger
143 if self._logTerse(): 144 if self._logTerse():
@@ -209,59 +210,33 @@ class csobs2caldb(ctools.cscript): @@ -209,59 +210,33 @@ class csobs2caldb(ctools.cscript):
209 210
210 def _make_caldb_index(self): 211 def _make_caldb_index(self):
211 """ 212 """
212 - Creates an IRF index FITS file. 213 + Creates an IRF index FITS file
213 """ 214 """
214 # Write header into logger 215 # Write header into logger
215 if self._logTerse(): 216 if self._logTerse():
216 - self._log("\n")  
217 - self._log.header2("Creating database index file") 217 + self._log('\n')
  218 + self._log.header2('Creating database index file')
218 219
219 # Open calibration database index 220 # Open calibration database index
220 - indx_file = self._base_dir+"/caldb.indx" 221 + indx_file = self._base_dir + '/caldb.indx'
221 222
222 # Open index file (or create one if it does not exist) 223 # Open index file (or create one if it does not exist)
223 cif = gammalib.GFits(indx_file, True) 224 cif = gammalib.GFits(indx_file, True)
224 225
225 # Retrieve "CIF" table 226 # Retrieve "CIF" table
226 - if cif.contains("CIF"):  
227 - table = cif.table("CIF") 227 + if cif.contains('CIF'):
  228 + table = cif.table('CIF')
228 229
229 - # ... or create binary table if no "CIF" table exists yet 230 + # ... or create binary table if no "CIF" table exists yet, append
  231 + # binary table to CIF file and return a reference to the appended
  232 + # table to work with
230 else: 233 else:
231 -  
232 - # Create empty binary table  
233 - bintable = gammalib.GFitsBinTable()  
234 - bintable.extname("CIF")  
235 - bintable.card("CIFVERSN", "1992a", "Version of CIF format")  
236 -  
237 - # Append table to FITS file and recover a reference to the  
238 - # appended table  
239 - table = cif.append(bintable)  
240 -  
241 - # Attach columns. Reference: CAL/GEN/92-008  
242 - table.append(gammalib.GFitsTableStringCol("TELESCOP", 0, 10))  
243 - table.append(gammalib.GFitsTableStringCol("INSTRUME", 0, 10))  
244 - table.append(gammalib.GFitsTableStringCol("DETNAM", 0, 20))  
245 - table.append(gammalib.GFitsTableStringCol("FILTER", 0, 10))  
246 - table.append(gammalib.GFitsTableStringCol("CAL_DEV", 0, 20))  
247 - table.append(gammalib.GFitsTableStringCol("CAL_DIR", 0, 70))  
248 - table.append(gammalib.GFitsTableStringCol("CAL_FILE", 0, 40))  
249 - table.append(gammalib.GFitsTableStringCol("CAL_CLAS", 0, 3))  
250 - table.append(gammalib.GFitsTableStringCol("CAL_DTYP", 0, 4))  
251 - table.append(gammalib.GFitsTableStringCol("CAL_CNAM", 0, 20))  
252 - table.append(gammalib.GFitsTableStringCol("CAL_CBD", 0, 70, 9))  
253 - table.append(gammalib.GFitsTableShortCol("CAL_XNO", 0))  
254 - table.append(gammalib.GFitsTableStringCol("CAL_VSD", 0, 10))  
255 - table.append(gammalib.GFitsTableStringCol("CAL_VST", 0, 8))  
256 - table.append(gammalib.GFitsTableDoubleCol("REF_TIME", 0))  
257 - table.append(gammalib.GFitsTableShortCol("CAL_QUAL", 0))  
258 - table.append(gammalib.GFitsTableStringCol("CAL_DATE", 0, 8))  
259 - table.append(gammalib.GFitsTableStringCol("CAL_DESC", 0, 70)) 234 + table = cif.append(calutils.create_cif_table())
260 235
261 # Check if output config already exist 236 # Check if output config already exist
262 has_config = False 237 has_config = False
263 row_index = -1 238 row_index = -1
264 - for caldir in table["CAL_DIR"]: 239 + for caldir in table['CAL_DIR']:
265 row_index += 1 240 row_index += 1
266 if caldir == self._cal_dir: 241 if caldir == self._cal_dir:
267 has_config = True 242 has_config = True
@@ -286,56 +261,56 @@ class csobs2caldb(ctools.cscript): @@ -286,56 +261,56 @@ class csobs2caldb(ctools.cscript):
286 today, time = now.split() 261 today, time = now.split()
287 262
288 # Set element 263 # Set element
289 - table["TELESCOP"][row] = self._mission  
290 - table["INSTRUME"][row] = self._caldb  
291 - table["DETNAM"][row] = "NONE"  
292 - table["FILTER"][row] = "NONE"  
293 - table["CAL_DEV"][row] = "ONLINE"  
294 - table["CAL_CLAS"][row] = "BCF"  
295 - table["CAL_DTYP"][row] = "DATA"  
296 - table["CAL_VSD"][row] = today  
297 - table["CAL_VST"][row] = time.split(".")[0]  
298 - table["REF_TIME"][row] = 51544.0  
299 - table["CAL_QUAL"][row] = 0  
300 - table["CAL_CBD"][row] = "NAME("+self["irf"].string()+")"  
301 - table["CAL_DATE"][row] = today.replace("-","/")[2:]  
302 - table["CAL_DIR"][row] = self._cal_dir  
303 - table["CAL_FILE"][row] = self._outfile 264 + table['TELESCOP'][row] = self._mission
  265 + table['INSTRUME'][row] = self._caldb
  266 + table['DETNAM'][row] = 'NONE'
  267 + table['FILTER'][row] = 'NONE'
  268 + table['CAL_DEV'][row] = 'ONLINE'
  269 + table['CAL_CLAS'][row] = 'BCF'
  270 + table['CAL_DTYP'][row] = 'DATA'
  271 + table['CAL_VSD'][row] = today
  272 + table['CAL_VST'][row] = time.split('.')[0]
  273 + table['REF_TIME'][row] = 51544.0
  274 + table['CAL_QUAL'][row] = 0
  275 + table['CAL_CBD'][row] = 'NAME('+self['irf'].string()+')'
  276 + table['CAL_DATE'][row] = today.replace('-','/')[2:]
  277 + table['CAL_DIR'][row] = self._cal_dir
  278 + table['CAL_FILE'][row] = self._outfile
304 279
305 # Add effective area information 280 # Add effective area information
306 row = row_index-4 281 row = row_index-4
307 - table["CAL_CNAM"][row] = "EFF_AREA"  
308 - table["CAL_DESC"][row] = self._caldb+" effective area" 282 + table['CAL_CNAM'][row] = 'EFF_AREA'
  283 + table['CAL_DESC'][row] = self._caldb+' effective area'
309 284
310 # Add point spread function information 285 # Add point spread function information
311 row = row_index-3 286 row = row_index-3
312 - table["CAL_CNAM"][row] = "RPSF"  
313 - table["CAL_DESC"][row] = self._caldb+" point spread function" 287 + table['CAL_CNAM'][row] = 'RPSF'
  288 + table['CAL_DESC'][row] = self._caldb+' point spread function'
314 289
315 # Add energy dispersion information 290 # Add energy dispersion information
316 row = row_index-2 291 row = row_index-2
317 - table["CAL_CNAM"][row] = "EDISP"  
318 - table["CAL_DESC"][row] = self._caldb+" energy dispersion" 292 + table['CAL_CNAM'][row] = 'EDISP'
  293 + table['CAL_DESC'][row] = self._caldb+' energy dispersion'
319 294
320 # Add background information 295 # Add background information
321 row = row_index-1 296 row = row_index-1
322 - table["CAL_CNAM"][row] = "BGD"  
323 - table["CAL_DESC"][row] = self._caldb+" background" 297 + table['CAL_CNAM'][row] = 'BGD'
  298 + table['CAL_DESC'][row] = self._caldb+' background'
324 299
325 # Log resulting FITS table and header 300 # Log resulting FITS table and header
326 if self._logNormal(): 301 if self._logNormal():
327 self._log(str(table)) 302 self._log(str(table))
328 - self._log("\n") 303 + self._log('\n')
329 if self._logExplicit(): 304 if self._logExplicit():
330 self._log(str(table.header())) 305 self._log(str(table.header()))
331 - self._log("\n") 306 + self._log('\n')
332 307
333 # Return CIF FITS file 308 # Return CIF FITS file
334 return cif 309 return cif
335 310
336 def _make_dirs(self): 311 def _make_dirs(self):
337 """ 312 """
338 - Make CALDB directories. 313 + Make CALDB directories
339 """ 314 """
340 # Write header into logger 315 # Write header into logger
341 if self._logTerse(): 316 if self._logTerse():
@@ -385,7 +360,7 @@ class csobs2caldb(ctools.cscript): @@ -385,7 +360,7 @@ class csobs2caldb(ctools.cscript):
385 # Public methods 360 # Public methods
386 def run(self): 361 def run(self):
387 """ 362 """
388 - Run the script. 363 + Run the script
389 """ 364 """
390 # Switch screen logging on in debug mode 365 # Switch screen logging on in debug mode
391 if self._logDebug(): 366 if self._logDebug():
@@ -396,8 +371,8 @@ class csobs2caldb(ctools.cscript): @@ -396,8 +371,8 @@ class csobs2caldb(ctools.cscript):
396 371
397 # Write input parameters and header into logger 372 # Write input parameters and header into logger
398 if self._logTerse(): 373 if self._logTerse():
399 - self._log("\n")  
400 - self._log.header1("Creating CALDB entry") 374 + self._log('\n')
  375 + self._log.header1('Creating CALDB entry')
401 376
402 # Create directory structure 377 # Create directory structure
403 self._make_dirs() 378 self._make_dirs()
@@ -413,24 +388,24 @@ class csobs2caldb(ctools.cscript): @@ -413,24 +388,24 @@ class csobs2caldb(ctools.cscript):
413 388
414 def save(self): 389 def save(self):
415 """ 390 """
416 - Save calibration database FITS file. 391 + Save calibration database FITS file
417 """ 392 """
418 # Write header into logger 393 # Write header into logger
419 if self._logTerse(): 394 if self._logTerse():
420 - self._log("\n")  
421 - self._log.header1("Save calibration database") 395 + self._log('\n')
  396 + self._log.header1('Save calibration database')
422 397
423 # Set response filename 398 # Set response filename
424 - filename = self._rsp_dir + "/" + self._outfile 399 + filename = self._rsp_dir + '/' + self._outfile
425 400
426 # Write filenames into logger 401 # Write filenames into logger
427 if self._logNormal(): 402 if self._logNormal():
428 - self._log(gammalib.parformat("CALDB index file")) 403 + self._log(gammalib.parformat('CALDB index file'))
429 self._log(self._caldb_inx.filename().url()) 404 self._log(self._caldb_inx.filename().url())
430 - self._log("\n")  
431 - self._log(gammalib.parformat("Response file")) 405 + self._log('\n')
  406 + self._log(gammalib.parformat('Response file'))
432 self._log(filename) 407 self._log(filename)
433 - self._log("\n") 408 + self._log('\n')
434 409
435 # Save caldb index file 410 # Save caldb index file
436 self._caldb_inx.save(self._clobber()) 411 self._caldb_inx.save(self._clobber())
@@ -443,7 +418,7 @@ class csobs2caldb(ctools.cscript): @@ -443,7 +418,7 @@ class csobs2caldb(ctools.cscript):
443 418
444 def execute(self): 419 def execute(self):
445 """ 420 """
446 - Execute the script. 421 + Execute the script
447 """ 422 """
448 # Open logfile 423 # Open logfile
449 self.logFileOpen() 424 self.logFileOpen()
cscripts/csroot2caldb.py
@@ -24,6 +24,7 @@ import math @@ -24,6 +24,7 @@ import math
24 from datetime import datetime 24 from datetime import datetime
25 import gammalib 25 import gammalib
26 import ctools 26 import ctools
  27 +from cscripts import calutils
27 28
28 # Optional ROOT import 29 # Optional ROOT import
29 try: 30 try:
@@ -44,12 +45,11 @@ class csroot2caldb(ctools.cscript): @@ -44,12 +45,11 @@ class csroot2caldb(ctools.cscript):
44 # Constructor 45 # Constructor
45 def __init__(self, *argv): 46 def __init__(self, *argv):
46 """ 47 """
47 - CALDB constructor.  
48 - 48 + Constructor
49 """ 49 """
50 # Set name 50 # Set name
51 - self._name = "csroot2caldb"  
52 - self._version = "1.0.0" 51 + self._name = 'csroot2caldb'
  52 + self._version = '1.2.0'
53 53
54 # Initialise some members 54 # Initialise some members
55 self._cif = None 55 self._cif = None
@@ -70,7 +70,7 @@ class csroot2caldb(ctools.cscript): @@ -70,7 +70,7 @@ class csroot2caldb(ctools.cscript):
70 # Private methods 70 # Private methods
71 def _get_parameters(self): 71 def _get_parameters(self):
72 """ 72 """
73 - Get parameters from parfile. 73 + Get parameters from parfile
74 """ 74 """
75 # Query parameters 75 # Query parameters
76 self['infile'].filename() 76 self['infile'].filename()
@@ -377,40 +377,10 @@ class csroot2caldb(ctools.cscript): @@ -377,40 +377,10 @@ class csroot2caldb(ctools.cscript):
377 Keywords: 377 Keywords:
378 None 378 None
379 """ 379 """
380 - # Create binary table  
381 - table = gammalib.GFitsBinTable()  
382 -  
383 - # Set boundary  
384 -  
385 - # Attach columns. Reference: CAL/GEN/92-008  
386 - table.append(gammalib.GFitsTableStringCol("TELESCOP", 0, 10))  
387 - table.append(gammalib.GFitsTableStringCol("INSTRUME", 0, 10))  
388 - table.append(gammalib.GFitsTableStringCol("DETNAM", 0, 20))  
389 - table.append(gammalib.GFitsTableStringCol("FILTER", 0, 10))  
390 - table.append(gammalib.GFitsTableStringCol("CAL_DEV", 0, 20))  
391 - table.append(gammalib.GFitsTableStringCol("CAL_DIR", 0, 70))  
392 - table.append(gammalib.GFitsTableStringCol("CAL_FILE", 0, 40))  
393 - table.append(gammalib.GFitsTableStringCol("CAL_CLAS", 0, 3))  
394 - table.append(gammalib.GFitsTableStringCol("CAL_DTYP", 0, 4))  
395 - table.append(gammalib.GFitsTableStringCol("CAL_CNAM", 0, 20))  
396 - table.append(gammalib.GFitsTableStringCol("CAL_CBD", 0, 70, 9))  
397 - table.append(gammalib.GFitsTableShortCol("CAL_XNO", 0))  
398 - table.append(gammalib.GFitsTableStringCol("CAL_VSD", 0, 10))  
399 - table.append(gammalib.GFitsTableStringCol("CAL_VST", 0, 8))  
400 - table.append(gammalib.GFitsTableDoubleCol("REF_TIME", 0))  
401 - table.append(gammalib.GFitsTableShortCol("CAL_QUAL", 0))  
402 - table.append(gammalib.GFitsTableStringCol("CAL_DATE", 0, 8))  
403 - table.append(gammalib.GFitsTableStringCol("CAL_DESC", 0, 70))  
404 -  
405 - # Set keywords. Reference: CAL/GEN/92-008  
406 - table.extname("CIF")  
407 - table.card("CIFVERSN", "1992a", "Version of CIF format")  
408 -  
409 - # Attach table to FITS file. Note that at this moment the  
410 - # FITS table gets connected to the FITS file. Yet since  
411 - # nothing was yet written to the FITS file, we cannot read  
412 - # anything from it.  
413 - self._cif.append(table) 380 + # Attach table to FITS file. Note that at this moment the FITS table
  381 + # gets connected to the FITS file. Yet since nothing was yet written
  382 + # to the FITS file, we cannot read anything from it.
  383 + self._cif.append(calutils.create_cif_table())
414 384
415 # Return 385 # Return
416 return 386 return