diff --git a/ga2sam_dev.py b/ga2sam_dev.py new file mode 100644 index 000000000..7971fd035 --- /dev/null +++ b/ga2sam_dev.py @@ -0,0 +1,11 @@ +""" +Shim for running the ga2sam tool during development +""" +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import ga4gh.cli + +if __name__ == "__main__": + ga4gh.cli.ga2sam_main() diff --git a/ga2vcf_dev.py b/ga2vcf_dev.py new file mode 100644 index 000000000..7c215a9c5 --- /dev/null +++ b/ga2vcf_dev.py @@ -0,0 +1,11 @@ +""" +Shim for running the ga2vcf tool during development +""" +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +import ga4gh.cli + +if __name__ == "__main__": + ga4gh.cli.ga2vcf_main() diff --git a/ga4gh/cli.py b/ga4gh/cli.py index 5a7ad8063..4b8e4d9c8 100644 --- a/ga4gh/cli.py +++ b/ga4gh/cli.py @@ -9,12 +9,68 @@ import time import argparse +import sys import ga4gh.frontend as frontend import ga4gh.client as client import ga4gh.backend as backend import ga4gh.protocol as protocol import ga4gh.datamodel.variants as variants +import ga4gh.converters as converters + + +############################################################################## +# ga2vcf +############################################################################## + + +def ga2vcf_main(parser=None): + if parser is None: + parser = argparse.ArgumentParser( + description="GA4GH VCF conversion tool") + addClientGlobalOptions(parser) + subparsers = parser.add_subparsers(title='subcommands',) + addVariantsSearchParser(subparsers) + args = parser.parse_args() + request = protocol.GASearchVariantsRequest() + setCommaSeparatedAttribute(request, args, 'datasetIds') + # TODO add outputFile cli argument + outputFile = sys.stdout + vcfConverter = converters.VcfConverter(request, outputFile) + vcfConverter.convert() + + +############################################################################## +# ga2sam +############################################################################## + + +def ga2sam_main(parser=None): + + def usingWorkaroundsFor(workaround): + return workaround in workarounds + + if parser is None: + parser = argparse.ArgumentParser( + description="GA4GH SAM conversion tool") + addClientGlobalOptions(parser) + subparsers = parser.add_subparsers(title='subcommands',) + addReadsSearchParser(subparsers) + args = parser.parse_args() + workarounds = set(args.workarounds.split(',')) + request = protocol.GASearchReadsRequest() + if usingWorkaroundsFor(client.HttpClient.workaroundGoogle): + # google says referenceId not a valid field + request = SearchReadsRunner.GASearchReadsRequestGoogle() + setCommaSeparatedAttribute(request, args, 'readGroupIds') + request.start = args.start + request.end = args.end + request.referenceId = args.referenceId + request.referenceName = args.referenceName + # TODO add outputFile cli argument + outputFile = sys.stdout + samConverter = converters.SamConverter(request, outputFile) + samConverter.convert() def setCommaSeparatedAttribute(request, args, attr): diff --git a/ga4gh/converters.py b/ga4gh/converters.py new file mode 100644 index 000000000..18330efd0 --- /dev/null +++ b/ga4gh/converters.py @@ -0,0 +1,40 @@ +""" +Provides classes that take protocol requests, send that request to +the server, and write a particular genomics file type with the results. +""" +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + + +class AbstractConverter(object): + """ + Abstract base class for converter classes + """ + def __init__(self, request, outputStream): + self._request = request + self._outputStream = outputStream + + +class SamConverter(AbstractConverter): + """ + Converts a request to a SAM file + """ + def __init__(self, searchReadsRequest, outputStream): + super(SamConverter, self).__init__( + searchReadsRequest, outputStream) + + def convert(self): + raise NotImplementedError() + + +class VcfConverter(AbstractConverter): + """ + Converts a request to a VCF file + """ + def __init__(self, searchVariantsRequest, outputStream): + super(VcfConverter, self).__init__( + searchVariantsRequest, outputStream) + + def convert(self): + raise NotImplementedError() diff --git a/setup.py b/setup.py index f77e8fabc..f893a7900 100644 --- a/setup.py +++ b/setup.py @@ -46,6 +46,8 @@ def parseVersion(moduleFile): 'console_scripts': [ 'ga4gh_client=ga4gh.cli:client_main', 'ga4gh_server=ga4gh.cli:server_main', + 'ga2vcf=ga4gh.cli:ga2vcf_main', + 'ga2sam=ga4gh.cli:ga2sam_main', ] }, classifiers=[