From db573ea0cde31f55534dfb93e7f861faccc9ca22 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Tue, 24 Nov 2015 16:58:29 +0100 Subject: [PATCH] Added csmodelmerge including unit test --- cscripts/Makefile.am | 8 ++++---- cscripts/csmodelinfo.py | 0 cscripts/csmodelmerge.py | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test/data/model_cube_background2.xml | 10 ++++++++++ test/test_cscripts.sh.in | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 331 insertions(+), 7 deletions(-) mode change 100644 => 100755 cscripts/csmodelinfo.py create mode 100755 cscripts/csmodelmerge.py create mode 100644 test/data/model_cube_background2.xml diff --git a/cscripts/Makefile.am b/cscripts/Makefile.am index 59c2670..61260a4 100644 --- a/cscripts/Makefile.am +++ b/cscripts/Makefile.am @@ -1,19 +1,19 @@ ## Process this file with automake to produce Makefile.in # Scripts to be distributed in bindir -binscripts = tsmerge.py modelmerge.py +binscripts = tsmerge.py # Scripts to be distributed in $(pyexecdir)/cscripts pythonscripts = __init__.py \ cspull.py cssens.py cstsdist.py cscaldb.py csresmap.py \ cshessobs.py csobsdef.py csspec.py cslightcrv.py csobsinfo.py \ - csinfo.py \ + csinfo.py csmodelinfo.py csmodelmerge.py \ obsutils.py # Scripts for which symbolic links will be created in bindir linkscripts = cspull cssens cstsdist cscaldb csresmap \ - cshessobs csobsdef csspec cslightcrv csobsinfo \ - csinfo + cshessobs csobsdef csspec cslightcrv csobsinfo csmodelmerge \ + csinfo csmodelinfo # Distribute scripts EXTRA_DIST = $(binscripts) $(pythonscripts) diff --git a/cscripts/csmodelinfo.py b/cscripts/csmodelinfo.py old mode 100644 new mode 100755 index ac520b5..ac520b5 --- a/cscripts/csmodelinfo.py +++ b/cscripts/csmodelinfo.py diff --git a/cscripts/csmodelmerge.py b/cscripts/csmodelmerge.py new file mode 100755 index 0000000..d6d2325 --- /dev/null +++ b/cscripts/csmodelmerge.py @@ -0,0 +1,217 @@ +#!/usr/bin/env python +# ========================================================================== +# Merges model XML files into one file +# +# Copyright (C) 2015 Michael Mayer +# +# 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 ctools +import sys +import glob + + +# =============== # +# cshessobs class # +# =============== # +class csmodelmerge(ctools.cscript): + """ + This class merges an arbitray number of model container into one output model XML file + """ + def __init__(self, *argv): + """ + Constructor. + """ + # Set name + self.name = "csmodelmerge" + self.version = "0.1.0" + + # Make sure that parfile exists + file = self.parfile() + + # Initialise application + if len(argv) == 0: + ctools.cscript.__init__(self, self.name, self.version) + elif len(argv) == 1: + ctools.cscript.__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 that parfile was not found + print("Parfile \""+parfile+"\" not found. Create default parfile.") + + # Create default parfile + pars = gammalib.GApplicationPars() + pars.append(gammalib.GApplicationPar("inmodels","s","a","model.xml","","","Input model XML files")) + pars.append(gammalib.GApplicationPar("outmodel","f","a","NONE","","","Output model file")) + pars.append_standard() + pars.append(gammalib.GApplicationPar("logfile","f","h","csmodelmerge.log","","","Log filename")) + pars.save(parfile) + + # Return + return + + def get_parameters(self): + """ + Get parameters from parfile and setup the observation. + """ + # Get input models + self.inmodels = self["inmodels"].string() + + # Interpet inmodels string + # Handle ascii files + if "@" == self.inmodels[0]: + self.files = open(self.inmodels.replace("@","")).read().splitlines() + + # Handle wild card strings + elif "*" in self.inmodels: + self.files = glob.glob(self.inmodels) + + # Handle space-separated list + elif " " in self.inmodels: + self.files = self.inmodels.split(" ") + + # Handle comma-separated list + elif "," in self.inmodels: + self.files = self.inmodels.split(",") + + # Throw exception if input models cannot be decoded + else: + msg = "Parameter \"inmodels\" must contain either an @asci file, a comma-separated or space-separated list of files or a wildcard string" + raise gammalib.GException.invalid_argument("csmodelmerge::get_parameters", msg) + + # Get output file + self.outmodel = self["outmodel"].filename() + + # 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") + + if self.logTerse(): + self.log("\n") + self.log.header1("Merging Models") + self.log("\n") + + + # Initialise output model container + self.models = gammalib.GModels() + + # Loop over model files + for modelfile in self.files: + + # Logging + self.log("Adding "+modelfile) + self.log("\n") + + # Open models + model_add = gammalib.GModels(modelfile) + + # Append models to container + for model in model_add: + self.models.append(model) + + # Return + return + + def save(self): + """ + Save pointings to ds9 region file if required + """ + + # Logging + if self.logExplicit(): + self.log("\n") + self.log.header1("Saving model file") + self.log("\n") + + # Save models + self.models.save(self.outmodel) + + # Return + return + + + def execute(self): + """ + Execute the script. + """ + # Run the script + self.run() + + # Save ds9 file if required + self.save() + + # Return + return + + +# ======================== # +# Main routine entry point # +# ======================== # +if __name__ == '__main__': + """ + Generates caldb entry. + """ + # Create instance of application + app = csmodelmerge(sys.argv) + + # Open logfile + app.logFileOpen() + + # Execute application + app.execute() diff --git a/test/data/model_cube_background2.xml b/test/data/model_cube_background2.xml new file mode 100644 index 0000000..82e839b --- /dev/null +++ b/test/data/model_cube_background2.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/test_cscripts.sh.in b/test/test_cscripts.sh.in index ab5c68c..a5586ef 100755 --- a/test/test_cscripts.sh.in +++ b/test/test_cscripts.sh.in @@ -80,22 +80,119 @@ $ECHO -n "Test csobsinfo: " chmod +x @abs_top_srcdir@/cscripts/csobsinfo.py @abs_top_srcdir@/cscripts/csobsinfo.py \ inobs="obs.xml" \ - ds9file="ds9.reg" \ + ds9file="obs.reg" \ offset=yes \ ra="83.6331" \ dec="22.01" > csobsinfo.log $ECHO -n "." -if [ -s "ds9.reg" ] +if [ -s "obs.reg" ] then $ECHO -n "." else - $ECHO " ds9.reg file is not valid" + $ECHO " obs.reg file is not valid" exit 1 fi $ECHO " ok" # +# Test csmodelinfo +# ============== +$ECHO -n "Test csmodelinfo: " +chmod +x @abs_top_srcdir@/cscripts/csmodelinfo.py +@abs_top_srcdir@/cscripts/csmodelinfo.py \ + inmodel="data/crab.xml" \ + ds9file="model.reg" > csmodelinfo.log +$ECHO -n "." +if [ -s "model.reg" ] +then + $ECHO -n "." +else + $ECHO " model.reg file is not valid" + exit 1 +fi +$ECHO " ok" + + +# +# Test csmodelmerge (space-separated) +# ============== +$ECHO -n "Test csmodelmerge: " +chmod +x @abs_top_srcdir@/cscripts/csmodelmerge.py +@abs_top_srcdir@/cscripts/csmodelmerge.py \ + inmodels="data/crab.xml data/source1.xml" \ + outmodel="merged_models.xml" > csmodelmerge.log +$ECHO -n "." +if [ -s "merged_models.xml" ] +then + $ECHO -n "." +else + $ECHO " merged_models.xml file is not valid" + exit 1 +fi +$ECHO " ok" + + +# +# Test csmodelmerge (comma-separated) +# ============== +$ECHO -n "Test csmodelmerge: " +chmod +x @abs_top_srcdir@/cscripts/csmodelmerge.py +@abs_top_srcdir@/cscripts/csmodelmerge.py \ + inmodels="data/crab.xml,data/source1.xml" \ + outmodel="merged_models2.xml" > csmodelmerge.log +$ECHO -n "." +if [ -s "merged_models2.xml" ] +then + $ECHO -n "." +else + $ECHO " merged_models2.xml file is not valid" + exit 1 +fi +$ECHO " ok" + + +# +# Test csmodelmerge (wildcard string) +# ============== +$ECHO -n "Test csmodelmerge: " +chmod +x @abs_top_srcdir@/cscripts/csmodelmerge.py +@abs_top_srcdir@/cscripts/csmodelmerge.py \ + inmodels="data/model_cube_background*.xml" \ + outmodel="merged_models3.xml" > csmodelmerge.log +$ECHO -n "." +if [ -s "merged_models3.xml" ] +then + $ECHO -n "." +else + $ECHO " merged_models3.xml file is not valid" + exit 1 +fi +$ECHO " ok" + + +# +# Test csmodelmerge (ascii-file) +# ============== +ls data/model_cube_background* > models.txt +$ECHO -n "Test csmodelmerge: " +chmod +x @abs_top_srcdir@/cscripts/csmodelmerge.py +@abs_top_srcdir@/cscripts/csmodelmerge.py \ + inmodels="@models.txt" \ + outmodel="merged_models4.xml" > csmodelmerge.log +$ECHO -n "." +if [ -s "merged_models4.xml" ] +then + $ECHO -n "." +else + $ECHO " merged_models4.xml file is not valid" + exit 1 +fi +$ECHO " ok" +rm models.txt + + +# # Test cspull # =========== $ECHO -n "Test cspull: " -- libgit2 0.21.4