diff --git a/scripts/Makefile.am b/scripts/Makefile.am index 810837b..c23790b 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -4,12 +4,12 @@ binscripts = cta_kb_bkgrates.py cta_root2irf.py cta_make_nodes.py # Scripts to be distributed in pythondir -pythonscripts = cspull.py cssens.py cstsdist.py \ +pythonscripts = cspull.py cssens.py cstsdist.py cscaldb.py \ obsutils.py \ lsmodel.py # Scripts for which symbolic links will be created in bindir -linkscripts = cspull cssens cstsdist \ +linkscripts = cspull cssens cstsdist cscaldb \ lsmodel # Distribute scripts diff --git a/scripts/cscaldb.py b/scripts/cscaldb.py new file mode 100755 index 0000000..dadc680 --- /dev/null +++ b/scripts/cscaldb.py @@ -0,0 +1,209 @@ +#! /usr/bin/env python +# ========================================================================== +# This script dumps all available calibrations into the console. +# +# Copyright (C) 2014 Juergen Knoedlseder +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# ========================================================================== +import gammalib +import sys +import glob +import os + + +# ============ # +# cspull class # +# ============ # +class cscaldb(gammalib.GApplication): + """ + This class implements the pull distribution generation script. It derives + from the GammaLib::GApplication class which provides support for parameter + files, command line arguments, and logging. In that way the Python + script behaves just as a regular ctool. + """ + def __init__(self, *argv): + """ + Constructor. + """ + # Set name + self.name = "cscaldb" + self.version = "0.1.0" + + # Make sure that parfile exists + file = self.parfile() + + # Initialise application + if len(argv) == 0: + gammalib.GApplication.__init__(self, self.name, self.version) + elif len(argv) ==1: + gammalib.GApplication.__init__(self, self.name, self.version, *argv) + else: + raise TypeError("Invalid number of arguments given.") + + # Set logger properties + self.log_header() + self.log.date(True) + + # Return + return + + def __del__(self): + """ + Destructor. + """ + # Return + return + + def parfile(self): + """ + Check if parfile exists. If parfile does not exist then create a + default parfile. This kluge avoids shipping the cscript with a parfile. + """ + # Set parfile name + parfile = self.name+".par" + + try: + pars = gammalib.GApplicationPars(parfile) + except: + # Signal if parfile was not found + sys.stdout.write("Parfile "+parfile+" not found. Create default parfile.\n") + + # Create default parfile + pars = gammalib.GApplicationPars() + pars.append_standard() + pars.save(parfile) + + # Return + return + + def get_parameters(self): + """ + Get parameters from parfile. + """ + # Return + return + + def execute(self): + """ + Execute the script. + """ + # Run the script + self.run() + + # Return + return + + def run(self): + """ + Run the script. + """ + # Switch screen logging on in debug mode + if self.logDebug(): + self.log.cout(True) + + # Get parameters + self.get_parameters() + + # Write input parameters into logger + if self.logTerse(): + self.log_parameters() + self.log("\n") + + # Get the calibration database path + caldb = gammalib.GCaldb() + + # Gather missions + missions = [] + paths = glob.glob(caldb.rootdir()+"/data/*") + paths.sort() + for path in paths: + head, tail = os.path.split(path) + missions.append(tail) + + # Loop over missions + for mission in missions: + + # Skip all non-CTA instruments + if mission != "cta": + continue + + # Write mission into logger + if self.logTerse(): + self.log("\n") + self.log.header1("Mission: "+mission) + + # Gather instruments + instruments = [] + paths = glob.glob(caldb.rootdir()+"/data/"+mission+"/*") + paths.sort() + for path in paths: + head, tail = os.path.split(path) + instruments.append(tail) + + # Loop over instruments + for instrument in instruments: + + # Write mission into logger + if self.logTerse(): + self.log.header3("Calibration: "+instrument) + + # Open calibration index file + cifname = caldb.rootdir()+"/data/"+mission+"/"+instrument+"/caldb.indx" + fits = gammalib.GFits(cifname) + cif = fits["CIF"] + cals = cif["CAL_CBD"] + + # Extract response names + names = [] + nrows = cals.length() + ncols = cals.number() + for row in range(nrows): + for col in range(ncols): + cal = cals.string(row, col) + istart = cal.find("NAME(") + if istart != -1: + istop = cal.find(")") + name = cal[5:istop] + if names.count(name) == 0: + names.append(name) + names.sort() + + # Print response name + if self.logTerse(): + for name in names: + self.log(name+"\n") + self.log("\n") + + # Return + return + + +# ======================== # +# Main routine entry point # +# ======================== # +if __name__ == '__main__': + """ + Dumps calibration database into log file. + """ + # Create instance of application + app = cscaldb(sys.argv) + + # Open logfile + app.logFileOpen() + + # Execute application + app.execute() + \ No newline at end of file