From df700863848c9ce381abfd9c0293dda1bf8607f6 Mon Sep 17 00:00:00 2001 From: Celine Mercier Date: Wed, 17 Oct 2018 11:27:50 +0200 Subject: [PATCH] New command: obi export --- python/obitools3/commands/export.pyx | 170 ++++++++++----------------- 1 file changed, 64 insertions(+), 106 deletions(-) diff --git a/python/obitools3/commands/export.pyx b/python/obitools3/commands/export.pyx index 24c670a..c4da6d4 100644 --- a/python/obitools3/commands/export.pyx +++ b/python/obitools3/commands/export.pyx @@ -1,107 +1,65 @@ -# from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport -# from obitools3.dms.dms import OBIDMS # TODO cimport doesn't work -# from obitools3.utils cimport bytes2str -# -# import time -# import re -# -# -# __title__="Export a NUC_SEQS view to a fasta or fastq file" -# -# -# default_config = { 'inputview' : None, -# } -# -# def addOptions(parser): -# -# # TODO put this common group somewhere else but I don't know where -# group=parser.add_argument_group('DMS and view options') -# -# group.add_argument('--default-dms','-d', -# action="store", dest="obi:defaultdms", -# metavar='', -# default=None, -# type=str, -# help="Name of the default DMS for reading and writing data.") -# -# group.add_argument('--input-view','-i', -# action="store", dest="obi:inputview", -# metavar='', -# default=None, -# type=str, -# help="Name of the input view, either raw if the view is in the default DMS," -# " or in the form 'dms:view' if it is in another DMS.") -# -# group=parser.add_argument_group('obi export specific options') -# -# group.add_argument('--format','-f', -# action="store", dest="export:format", -# metavar='', -# default="fasta", -# type=str, -# help="Export in the format , 'fasta' or 'fastq'. Default: 'fasta'.") # TODO export in csv -# +#cython: language_level=3 + +from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport +from obitools3.uri.decode import open_uri +from obitools3.apps.config import logger +from obitools3.dms import DMS +from obitools3.dms.obiseq import Nuc_Seq + +from obitools3.apps.optiongroups import addMinimalInputOption, \ + addExportOutputOption + + +__title__="Export a view to a different file format" + + +def addOptions(parser): + + addMinimalInputOption(parser) + addExportOutputOption(parser) + + def run(config): - pass -# -# # TODO import doesn't work -# NUC_SEQUENCE_COLUMN = "NUC_SEQ" -# ID_COLUMN = "ID" -# DEFINITION_COLUMN = "DEFINITION" -# QUALITY_COLUMN = "QUALITY" -# -# special_columns = [NUC_SEQUENCE_COLUMN, ID_COLUMN, DEFINITION_COLUMN, QUALITY_COLUMN] -# -# # Open DMS -# d = OBIDMS(config['obi']['defaultdms']) -# -# # Open input view -# iview = d.open_view(config['obi']['inputview']) -# -# print(iview.type) -# -# # TODO check that the view has the type NUC_SEQS -# if ((config['export']['format'] == "fasta") or (config['export']['format'] == "fastq")) and (iview.type != "NUC_SEQS_VIEW") : # TODO find a way to import those macros -# raise Exception("Error: the view to export in fasta or fastq format is not a NUC_SEQS view") -# -# # Initialize the progress bar -# pb = ProgressBar(len(iview), config, seconde=5) -# -# i=0 -# for seq in iview : -# pb(i) -# -# toprint = ">"+seq.id+" " -# -# for col_name in seq : -# if col_name not in special_columns : -# toprint = toprint + col_name + "=" + str(seq[col_name]) + "; " -# -# if DEFINITION_COLUMN in seq : -# toprint = toprint + seq.definition -# -# nucseq = bytes2str(seq.nuc_seq) -# -# if config['export']['format'] == "fasta" : -# nucseq = re.sub("(.{60})", "\\1\n", nucseq, 0, re.DOTALL) -# -# toprint = toprint + "\n" + nucseq -# -# if config['export']['format'] == "fastq" : -# toprint = toprint + "\n" + "+" + "\n" + seq.get_str_quality() -# -# print(toprint) -# i+=1 -# -# iview.close() -# d.close() -# -# print("Done.") -# -# -# -# -# -# -# -# \ No newline at end of file + + DMS.obi_atexit() + + logger("info", "obi export : exports a view to a different file format") + + # Open the input + input = open_uri(config['obi']['inputURI']) + if input is None: + raise Exception("Could not read input") + iview = input[1] + + # Open the output + output = open_uri(config['obi']['outputURI'], + input=False) + if output is None: + raise Exception("Could not open output URI") + + output_object = output[0] + writer = output[1] + + # Check that the input view has the type NUC_SEQS if needed # TODO discuss, maybe bool property + if (output[2] == Nuc_Seq) and (iview.type != b"NUC_SEQS_VIEW") : # Nuc_Seq_Stored? TODO + raise Exception("Error: the view to export in fasta or fastq format is not a NUC_SEQS view") + + # Initialize the progress bar + pb = ProgressBar(len(iview), config, seconde=5) + + i=0 + for seq in iview : + pb(i) + try: + writer(seq) + except StopIteration: + break + i+=1 + + # TODO save command in input dms? + + output_object.close() + iview.close() + input[0].close() + + logger("info", "obi export: Done")