"""Provides a command line interface to the ``otoole`` package
The key functions are **convert**, **cplex** and **viz**.
The **convert** command allows convertion of multiple different OSeMOSYS input formats including
from/to csv, an AMPL format datafile, a Tabular Data Package, a folder of CSVs, an Excel workbook with
one tab per parameter, an SQLite database
The **cplex** command provides access to scripts which transform and process a CPLEX solution file
into a format which is more readily processed - either to CBC or CSV format.
The **viz** command allows you to produce a Reference Energy System diagram from a Tabular Data Package.
Example
-------
Ask for help on the command line::
>>> $ otoole --help
usage: otoole [-h] [--verbose] [--version] {convert,cplex,viz} ...
otoole: Python toolkit of OSeMOSYS users
positional arguments:
{convert,cplex,viz}
convert Convert from one input format to another
cplex Process a CPLEX solution file
viz Visualise the model
optional arguments:
-h, --help show this help message and exit
--verbose, -v Enable debug mode
--version, -V The version of otoole
"""
import argparse
import logging
import sys
from otoole import __version__
from otoole.preprocess import convert_file_to_package, create_datafile, create_datapackage, generate_csv_from_excel
from otoole.preprocess.create_datapackage import convert_datapackage_to_sqlite
from otoole.results.convert import convert_cplex_file
from otoole.visualise import create_res
[docs]def cplex2cbc(args):
convert_cplex_file(args.cplex_file, args.output_file, args.start_year,
args.end_year, args.output_format)
[docs]def conversion_matrix(args):
"""
from\to ex cs dp sq df
excel -- yy
csv nn -- yy nn nn
datapackage nn ?? -- yy yy
sql nn -- yy
datafile nn ?? yy --
"""
msg = "Conversion from {} to {} is not yet implemented".format(args.from_format, args.to_format)
if args.from_format == 'datafile':
if args.to_format == 'datapackage':
convert_file_to_package(args.from_path, args.to_path)
else:
raise NotImplementedError(msg)
elif (args.from_format == 'datapackage'):
if args.to_format == 'sql':
convert_datapackage_to_sqlite(args.from_path, args.to_path)
elif args.to_format == 'datafile':
create_datafile(args.from_path, args.to_path)
else:
raise NotImplementedError(msg)
elif args.from_format == 'sql':
if args.to_format == 'datafile':
create_datafile(args.from_path, args.to_path, sql=True)
else:
raise NotImplementedError(msg)
elif args.from_format == 'csv':
if args.to_format == 'datapackage':
create_datapackage(args.from_path, args.to_path)
else:
raise NotImplementedError(msg)
elif args.from_format == 'excel':
if args.to_format == 'csv':
generate_csv_from_excel(args.from_path, args.to_path)
else:
raise NotImplementedError(msg)
else:
raise NotImplementedError(msg)
[docs]def datapackage2res(args):
create_res(args.datapackage, args.resfile)
[docs]def get_parser():
parser = argparse.ArgumentParser(description="otoole: Python toolkit of OSeMOSYS users")
parser.add_argument('--verbose', '-v', help='Enable debug mode', action='count', default=0)
parser.add_argument('--version', '-V', action='version', version=__version__,
help='The version of otoole')
subparsers = parser.add_subparsers()
# Parser for conversion
convert_parser = subparsers.add_parser('convert', help='Convert from one input format to another')
convert_parser.add_argument('from_format', help='Input data format to convert from',
choices=sorted(['datafile', 'datapackage', 'sql', 'excel', 'csv']))
convert_parser.add_argument('to_format', help='Input data format to convert to',
choices=sorted(['datafile', 'datapackage', 'sql', 'csv']))
convert_parser.add_argument('from_path', help="Path to file or folder to convert from")
convert_parser.add_argument('to_path', help='Path to file or folder to convert to')
convert_parser.set_defaults(func=conversion_matrix)
# Parser for the CPLEX related commands
cplex_parser = subparsers.add_parser('cplex',
help='Process a CPLEX solution file')
cplex_parser.add_argument("cplex_file",
help="The filepath of the OSeMOSYS cplex output file")
cplex_parser.add_argument("output_file",
help="The filepath of the converted file that will be written")
cplex_parser.add_argument("-s", "--start_year", type=int, default=2015,
help="Output only the results from this year onwards")
cplex_parser.add_argument("-e", "--end_year", type=int, default=2070,
help="Output only the results upto and including this year")
cplex_parser.add_argument('output_format', choices=['csv', 'cbc'], default='cbc')
cplex_parser.set_defaults(func=cplex2cbc)
# Parser for visualisation
viz_parser = subparsers.add_parser('viz', help='Visualise the model')
viz_subparsers = viz_parser.add_subparsers()
res_parser = viz_subparsers.add_parser('res', help='Generate a reference energy system')
res_parser.add_argument('datapackage', help='Path to model datapackage')
res_parser.add_argument('resfile', help='Path to reference energy system')
res_parser.set_defaults(func=datapackage2res)
return parser
[docs]def main():
parser = get_parser()
args = parser.parse_args(sys.argv[1:])
if args.verbose >= 1 and args.verbose < 2:
logging.basicConfig(level=logging.INFO)
if args.verbose > 2:
logging.basicConfig(level=logging.DEBUG)
if 'func' in args:
args.func(args)
else:
parser.print_help()