Python: made all commands handle output to buffer object (e.g. stdout)

This commit is contained in:
Celine Mercier
2020-07-24 16:09:48 +02:00
parent 46ca693ca9
commit 8aa455ad8a
18 changed files with 511 additions and 213 deletions

View File

@ -4,7 +4,7 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view.view cimport View from obitools3.dms.view.view cimport View
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, str2bytes from obitools3.utils cimport tobytes, str2bytes
@ -12,6 +12,9 @@ from obitools3.utils cimport tobytes, str2bytes
from obitools3.dms.capi.obilcsalign cimport obi_lcs_align_one_column, \ from obitools3.dms.capi.obilcsalign cimport obi_lcs_align_one_column, \
obi_lcs_align_two_columns obi_lcs_align_two_columns
from io import BufferedWriter
from cpython.exc cimport PyErr_CheckSignals
import time import time
import sys import sys
@ -23,6 +26,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group=parser.add_argument_group('obi align specific options') group=parser.add_argument_group('obi align specific options')
@ -201,21 +205,21 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output") raise Exception("Could not create output")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
o_dms_name = o_dms.name o_dms_name = o_dms.name
final_o_view_name = output[1] final_o_view_name = output[1]
# If the input and output DMS are not the same, align creating a temporary view in the input dms that will be exported to
# the right DMS and deleted in the other afterwards.
if i_dms != o_dms:
temporary_view_name = final_o_view_name
i=0
while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
temporary_view_name = final_o_view_name+b"_"+str2bytes(str(i))
i+=1
o_view_name = temporary_view_name
else:
o_view_name = final_o_view_name o_view_name = final_o_view_name
# If stdout output or the input and output DMS are not the same, align creating a temporary view in the input dms that will be exported to
# the right DMS and deleted in the other afterwards.
if i_dms != o_dms or type(output_0)==BufferedWriter:
if type(output_0)==BufferedWriter:
o_dms = i_dms
o_view_name = b"temp"
while o_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name+b"_"+str2bytes(str(i))
i+=1
# Save command config in View comments # Save command config in View comments
command_line = " ".join(sys.argv[1:]) command_line = " ".join(sys.argv[1:])
@ -263,8 +267,15 @@ def run(config):
View.delete_view(i_dms, i_view_name_2) View.delete_view(i_dms, i_view_name_2)
i_dms_2.close() i_dms_2.close()
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view = o_dms[o_view_name]
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
# If the input and the output DMS are different, delete the temporary result view in the input DMS # If the input and the output DMS are different, delete the temporary result view in the input DMS
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)

View File

@ -6,7 +6,7 @@ from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
from obitools3.dms.column.column cimport Column from obitools3.dms.column.column cimport Column
from obitools3.dms.capi.obiview cimport QUALITY_COLUMN from obitools3.dms.capi.obiview cimport QUALITY_COLUMN
from obitools3.dms.capi.obitypes cimport OBI_QUAL from obitools3.dms.capi.obitypes cimport OBI_QUAL
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.libalign._qsassemble import QSolexaReverseAssemble from obitools3.libalign._qsassemble import QSolexaReverseAssemble
@ -15,7 +15,9 @@ from obitools3.libalign._solexapairend import buildConsensus, buildJoinedSequenc
from obitools3.dms.obiseq cimport Nuc_Seq from obitools3.dms.obiseq cimport Nuc_Seq
from obitools3.libalign.shifted_ali cimport Kmer_similarity, Ali_shifted from obitools3.libalign.shifted_ali cimport Kmer_similarity, Ali_shifted
from obitools3.dms.capi.obiview cimport REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN from obitools3.dms.capi.obiview cimport REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN
from obitools3.utils cimport str2bytes
from io import BufferedWriter
import sys import sys
import os import os
@ -29,6 +31,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi alignpairedend specific options') group = parser.add_argument_group('obi alignpairedend specific options')
@ -171,12 +174,28 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
view = output[1] output_0 = output[0]
o_dms = output[0]
Column.new_column(view, QUALITY_COLUMN, OBI_QUAL) #TODO output URI quality option? # stdout output: create temporary view
if type(output_0)==BufferedWriter:
i_dms = forward.dms # using any dms
o_dms = i_dms
i=0
o_view_name = b"temp"
while o_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name+b"_"+str2bytes(str(i))
i+=1
o_view = View_NUC_SEQS.new(o_dms, o_view_name, quality=True)
else:
o_view = output[1]
Column.new_column(o_view, QUALITY_COLUMN, OBI_QUAL)
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(entries_len, config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(entries_len, config)
else:
pb = None
#if config['alignpairedend']['trueali']: #if config['alignpairedend']['trueali']:
# kmer_ali = False # kmer_ali = False
@ -202,11 +221,12 @@ def run(config):
i = 0 i = 0
for ali in ba: for ali in ba:
if pb is not None:
pb(i) pb(i)
PyErr_CheckSignals() PyErr_CheckSignals()
consensus = view[i] consensus = o_view[i]
if not two_views: if not two_views:
seqF = entries[i] seqF = entries[i]
@ -227,6 +247,7 @@ def run(config):
i+=1 i+=1
if pb is not None:
pb(i, force=True) pb(i, force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -235,16 +256,28 @@ def run(config):
# Save command config in View and DMS comments # Save command config in View and DMS comments
command_line = " ".join(sys.argv[1:]) command_line = " ".join(sys.argv[1:])
view.write_config(config, "alignpairedend", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name) o_view.write_config(config, "alignpairedend", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
output[0].record_command_line(command_line) o_dms.record_command_line(command_line)
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(view), file=sys.stderr) #print(repr(view), file=sys.stderr)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
# If stdout output, delete the temporary imported view used to create the final file
if type(output_0)==BufferedWriter:
View_NUC_SEQS.delete_view(o_dms, o_view_name)
output_0.close()
# Close all DMS
input[0].close(force=True) input[0].close(force=True)
if two_views: if two_views:
rinput[0].close(force=True) rinput[0].close(force=True)
output[0].close(force=True) o_dms.close(force=True)
logger("info", "Done.") logger("info", "Done.")

View File

@ -4,11 +4,12 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view.view cimport View, Line_selection from obitools3.dms.view.view cimport View, Line_selection
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from functools import reduce from functools import reduce
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, str2bytes from obitools3.utils cimport tobytes, str2bytes
from io import BufferedWriter
from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, \ from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, \
ID_COLUMN, \ ID_COLUMN, \
DEFINITION_COLUMN, \ DEFINITION_COLUMN, \
@ -34,6 +35,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addTaxonomyOption(parser) addTaxonomyOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group=parser.add_argument_group('obi annotate specific options') group=parser.add_argument_group('obi annotate specific options')
@ -278,8 +280,19 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
o_view_name = output[1] o_view_name = output[1]
# stdout output: create temporary view
if type(output_0)==BufferedWriter:
o_dms = i_dms
i=0
o_view_name = b"temp"
while o_view_name in i_dms: # Making sure view name is unique in output DMS
o_view_name = o_view_name+b"_"+str2bytes(str(i))
i+=1
imported_view_name = o_view_name
# If the input and output DMS are not the same, import the input view in the output DMS before cloning it to modify it # If the input and output DMS are not the same, import the input view in the output DMS before cloning it to modify it
# (could be the other way around: clone and modify in the input DMS then import the new view in the output DMS) # (could be the other way around: clone and modify in the input DMS then import the new view in the output DMS)
if i_dms != o_dms: if i_dms != o_dms:
@ -307,7 +320,10 @@ def run(config):
taxo = None taxo = None
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(o_view), config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(len(o_view), config)
else:
pb = None
try: try:
@ -346,12 +362,14 @@ def run(config):
sequenceTagger = sequenceTaggerGenerator(config, taxo=taxo) sequenceTagger = sequenceTaggerGenerator(config, taxo=taxo)
for i in range(len(o_view)): for i in range(len(o_view)):
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
sequenceTagger(o_view[i]) sequenceTagger(o_view[i])
except Exception, e: except Exception, e:
raise RollbackException("obi annotate error, rollbacking view: "+str(e), o_view) raise RollbackException("obi annotate error, rollbacking view: "+str(e), o_view)
if pb is not None:
pb(i, force=True) pb(i, force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -363,13 +381,19 @@ def run(config):
input_dms_name.append(config['obi']['taxoURI'].split("/")[-3]) input_dms_name.append(config['obi']['taxoURI'].split("/")[-3])
input_view_name.append("taxonomy/"+config['obi']['taxoURI'].split("/")[-1]) input_view_name.append("taxonomy/"+config['obi']['taxoURI'].split("/")[-1])
o_view.write_config(config, "annotate", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name) o_view.write_config(config, "annotate", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
output[0].record_command_line(command_line) o_dms.record_command_line(command_line)
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_view), file=sys.stderr) #print(repr(o_view), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary imported view used to create the final view # stdout output: write to buffer
if i_dms != o_dms: if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
# If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(o_dms, imported_view_name) View.delete_view(o_dms, imported_view_name)
o_dms.close(force=True) o_dms.close(force=True)
i_dms.close(force=True) i_dms.close(force=True)

View File

@ -4,14 +4,16 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms.dms cimport DMS from obitools3.dms.dms cimport DMS
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.dms.capi.build_reference_db cimport build_reference_db from obitools3.dms.capi.build_reference_db cimport build_reference_db
from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, str2bytes from obitools3.utils cimport tobytes, str2bytes
from obitools3.dms.view.view cimport View from obitools3.dms.view.view cimport View
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
from io import BufferedWriter
import sys import sys
from cpython.exc cimport PyErr_CheckSignals
__title__="Tag a set of sequences for PCR and sequencing errors identification" __title__="Tag a set of sequences for PCR and sequencing errors identification"
@ -22,6 +24,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addTaxonomyOption(parser) addTaxonomyOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi build_ref_db specific options') group = parser.add_argument_group('obi build_ref_db specific options')
@ -56,17 +59,20 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output") raise Exception("Could not create output")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
final_o_view_name = output[1] final_o_view_name = output[1]
# If the input and output DMS are not the same, build the database creating a temporary view that will be exported to # If stdout output or the input and output DMS are not the same, build the database creating a temporary view that will be exported to
# the right DMS and deleted in the other afterwards. # the right DMS and deleted in the other afterwards.
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
temporary_view_name = final_o_view_name temporary_view_name = b"temp"
i=0 i=0
while temporary_view_name in i_dms: # Making sure view name is unique in input DMS while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
temporary_view_name = final_o_view_name+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else: else:
o_view_name = final_o_view_name o_view_name = final_o_view_name
@ -88,14 +94,21 @@ def run(config):
if i_dms != o_dms: if i_dms != o_dms:
View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name) View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view = o_dms[o_view_name]
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
# Save command config in DMS comments # Save command config in DMS comments
o_dms.record_command_line(command_line) o_dms.record_command_line(command_line)
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_dms[final_o_view_name]), file=sys.stderr) #print(repr(o_dms[final_o_view_name]), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary result view in the input DMS # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)

View File

@ -15,6 +15,7 @@ from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, REVERSE_SEQUENCE_CO
from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL
from obitools3.dms.column.column cimport Column from obitools3.dms.column.column cimport Column
from io import BufferedWriter
import time import time
import sys import sys
@ -76,9 +77,15 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
o_view = output[1] o_view = output[1]
# stdout output
if type(output_0)==BufferedWriter:
o_dms = i_dms
# Initialize quality columns and their associated sequence columns if needed # Initialize quality columns and their associated sequence columns if needed
if type(output_0) != BufferedWriter:
if not remove_qual: if not remove_qual:
if NUC_SEQUENCE_COLUMN not in o_view: if NUC_SEQUENCE_COLUMN not in o_view:
Column.new_column(o_view, NUC_SEQUENCE_COLUMN, OBI_SEQ) Column.new_column(o_view, NUC_SEQUENCE_COLUMN, OBI_SEQ)
@ -88,6 +95,7 @@ def run(config):
Column.new_column(o_view, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=o_view[REVERSE_SEQUENCE_COLUMN].version) Column.new_column(o_view, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=o_view[REVERSE_SEQUENCE_COLUMN].version)
# Initialize multiple elements columns # Initialize multiple elements columns
if type(output_0)==BufferedWriter:
dict_cols = {} dict_cols = {}
for v in iview_list: for v in iview_list:
for coln in v.keys(): for coln in v.keys():
@ -105,22 +113,32 @@ def run(config):
nb_elements_per_line=dict_cols[coln]['nbelts'], elements_names=list(dict_cols[coln]['eltnames'])) nb_elements_per_line=dict_cols[coln]['nbelts'], elements_names=list(dict_cols[coln]['eltnames']))
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(total_len, config, seconde=5) if not config['obi']['noprogressbar']:
pb = ProgressBar(total_len, config)
else:
pb = None
i = 0 i = 0
for v in iview_list: for v in iview_list:
for l in v: for entry in v:
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
o_view[i] = l if type(output_0)==BufferedWriter:
rep = repr(entry)
output_0.write(str2bytes(rep)+b"\n")
else:
o_view[i] = entry
i+=1 i+=1
# Deletes quality columns if needed # Deletes quality columns if needed
if type(output_0)!=BufferedWriter:
if QUALITY_COLUMN in o_view and remove_qual : if QUALITY_COLUMN in o_view and remove_qual :
o_view.delete_column(QUALITY_COLUMN) o_view.delete_column(QUALITY_COLUMN)
if REVERSE_QUALITY_COLUMN in o_view and remove_rev_qual : if REVERSE_QUALITY_COLUMN in o_view and remove_rev_qual :
o_view.delete_column(REVERSE_QUALITY_COLUMN) o_view.delete_column(REVERSE_QUALITY_COLUMN)
if pb is not None:
pb(i, force=True) pb(i, force=True)
print("", file=sys.stderr) print("", file=sys.stderr)

View File

@ -4,13 +4,14 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms.dms cimport DMS from obitools3.dms.dms cimport DMS
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.dms.capi.obiclean cimport obi_clean from obitools3.dms.capi.obiclean cimport obi_clean
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, str2bytes from obitools3.utils cimport tobytes, str2bytes
from obitools3.dms.view.view cimport View from obitools3.dms.view.view cimport View
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
from io import BufferedWriter
import sys import sys
@ -21,6 +22,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi clean specific options') group = parser.add_argument_group('obi clean specific options')
@ -88,17 +90,20 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output") raise Exception("Could not create output")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
final_o_view_name = output[1] final_o_view_name = output[1]
# If the input and output DMS are not the same, run obiclean creating a temporary view that will be exported to # If stdout output or the input and output DMS are not the same, create a temporary view that will be exported to
# the right DMS and deleted in the other afterwards. # the right DMS and deleted in the other afterwards.
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
temporary_view_name = final_o_view_name temporary_view_name = b"temp"
i=0 i=0
while temporary_view_name in i_dms: # Making sure view name is unique in input DMS while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
temporary_view_name = final_o_view_name+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else: else:
o_view_name = final_o_view_name o_view_name = final_o_view_name
@ -117,14 +122,21 @@ def run(config):
if i_dms != o_dms: if i_dms != o_dms:
View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name) View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view = o_dms[o_view_name]
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
# Save command config in DMS comments # Save command config in DMS comments
o_dms.record_command_line(command_line) o_dms.record_command_line(command_line)
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_dms[final_o_view_name]), file=sys.stderr) #print(repr(o_dms[final_o_view_name]), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary result view in the input DMS # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)

View File

@ -5,10 +5,10 @@ from obitools3.dms.dms cimport DMS
from obitools3.dms.capi.obidms cimport OBIDMS_p from obitools3.dms.capi.obidms cimport OBIDMS_p
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.dms.capi.obiecopcr cimport obi_ecopcr from obitools3.dms.capi.obiecopcr cimport obi_ecopcr
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addTaxonomyOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addTaxonomyOption, addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes from obitools3.utils cimport tobytes, str2bytes
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
from obitools3.dms.view import View from obitools3.dms.view import View
@ -16,6 +16,7 @@ from libc.stdlib cimport malloc, free
from libc.stdint cimport int32_t from libc.stdint cimport int32_t
import sys import sys
from io import BufferedWriter
__title__="in silico PCR" __title__="in silico PCR"
@ -27,6 +28,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addTaxonomyOption(parser) addTaxonomyOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi ecopcr specific options') group = parser.add_argument_group('obi ecopcr specific options')
@ -169,12 +171,21 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output") raise Exception("Could not create output")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
o_dms_name = output[0].name o_dms_name = output[0].name
o_view_name = output[1] o_view_name = output[1]
# Read taxonomy name # Read taxonomy name
taxonomy_name = config['obi']['taxoURI'].split("/")[-1] # Robust in theory taxonomy_name = config['obi']['taxoURI'].split("/")[-1] # Robust in theory
# If stdout output create a temporary view in the input dms that will be deleted afterwards.
if type(output_0)==BufferedWriter:
o_dms = i_dms
o_view_name = b"temp"
while o_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name+b"_"+str2bytes(str(i))
i+=1
# Save command config in View comments # Save command config in View comments
command_line = " ".join(sys.argv[1:]) command_line = " ".join(sys.argv[1:])
input_dms_name=[i_dms_name] input_dms_name=[i_dms_name]
@ -202,9 +213,20 @@ def run(config):
free(restrict_to_taxids_p) free(restrict_to_taxids_p)
free(ignore_taxids_p) free(ignore_taxids_p)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view = o_dms[o_view_name]
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_dms[o_view_name]), file=sys.stderr) #print(repr(o_dms[o_view_name]), file=sys.stderr)
# If stdout output, delete the temporary result view in the input DMS
if type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name)
i_dms.close(force=True) i_dms.close(force=True)
o_dms.close(force=True) o_dms.close(force=True)

View File

@ -4,7 +4,7 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms.dms cimport DMS from obitools3.dms.dms cimport DMS
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.dms.capi.obiecotag cimport obi_ecotag from obitools3.dms.capi.obiecotag cimport obi_ecotag
from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, str2bytes from obitools3.utils cimport tobytes, str2bytes
@ -12,6 +12,7 @@ from obitools3.dms.view.view cimport View
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
import sys import sys
from io import BufferedWriter
__title__="Taxonomic assignment of sequences" __title__="Taxonomic assignment of sequences"
@ -22,6 +23,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addTaxonomyOption(parser) addTaxonomyOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi ecotag specific options') group = parser.add_argument_group('obi ecotag specific options')
@ -75,17 +77,19 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output") raise Exception("Could not create output")
o_dms = output[0] o_dms = output[0]
output_0 = output[0]
final_o_view_name = output[1] final_o_view_name = output[1]
# If the input and output DMS are not the same, run ecotag creating a temporary view that will be exported to # If stdout output or the input and output DMS are not the same, create a temporary view that will be exported and deleted.
# the right DMS and deleted in the other afterwards. if i_dms != o_dms or type(output_0)==BufferedWriter:
if i_dms != o_dms: temporary_view_name = b"temp"
temporary_view_name = final_o_view_name
i=0 i=0
while temporary_view_name in i_dms: # Making sure view name is unique in input DMS while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
temporary_view_name = final_o_view_name+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else: else:
o_view_name = final_o_view_name o_view_name = final_o_view_name
@ -120,11 +124,18 @@ def run(config):
# Save command config in DMS comments # Save command config in DMS comments
o_dms.record_command_line(command_line) o_dms.record_command_line(command_line)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view = o_dms[o_view_name]
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_dms[final_o_view_name]), file=sys.stderr) #print(repr(o_dms[final_o_view_name]), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary result view in the input DMS # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)

View File

@ -74,7 +74,7 @@ def run(config):
if config['obi']['noprogressbar']: if config['obi']['noprogressbar']:
pb = None pb = None
else: else:
pb = ProgressBar(withoutskip - skip, config, seconde=5) pb = ProgressBar(withoutskip - skip, config)
i=0 i=0
for seq in iview : for seq in iview :

View File

@ -4,7 +4,7 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view.view cimport View, Line_selection from obitools3.dms.view.view cimport View, Line_selection
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, str2bytes from obitools3.utils cimport tobytes, str2bytes
@ -14,6 +14,7 @@ import time
import re import re
import sys import sys
import ast import ast
from io import BufferedWriter
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
@ -28,6 +29,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addTaxonomyOption(parser) addTaxonomyOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group=parser.add_argument_group("obi grep specific options") group=parser.add_argument_group("obi grep specific options")
@ -304,16 +306,21 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0] o_dms = output[0]
o_view_name_final = output[1] output_0 = output[0]
o_view_name = o_view_name_final final_o_view_name = output[1]
# If the input and output DMS are not the same, create output view in input DMS first, then export it # If stdout output or the input and output DMS are not the same, create a temporary view that will be exported and deleted afterwards.
# to output DMS, making sure the temporary view name is unique in the input DMS if i_dms != o_dms or type(output_0)==BufferedWriter:
if i_dms != o_dms: temporary_view_name = b"temp"
i=0 i=0
while o_view_name in i_dms: while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name_final+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else:
o_view_name = final_o_view_name
if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None: if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None:
taxo_uri = open_uri(config["obi"]["taxoURI"]) taxo_uri = open_uri(config["obi"]["taxoURI"])
@ -324,7 +331,10 @@ def run(config):
taxo = None taxo = None
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(i_view), config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(len(i_view), config)
else:
pb = None
# Apply filter # Apply filter
tax_filter = Taxonomy_filter_generator(taxo, config["grep"]) tax_filter = Taxonomy_filter_generator(taxo, config["grep"])
@ -334,12 +344,14 @@ def run(config):
if filter is None and config["grep"]["invert_selection"]: # all sequences are selected: filter is None if no line will be selected because some columns don't exist if filter is None and config["grep"]["invert_selection"]: # all sequences are selected: filter is None if no line will be selected because some columns don't exist
for i in range(len(i_view)): for i in range(len(i_view)):
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
selection.append(i) selection.append(i)
elif filter is not None : # filter is None if no line will be selected because some columns don't exist elif filter is not None : # filter is None if no line will be selected because some columns don't exist
for i in range(len(i_view)): for i in range(len(i_view)):
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
line = i_view[i] line = i_view[i]
@ -350,6 +362,7 @@ def run(config):
if good : if good :
selection.append(i) selection.append(i)
if pb is not None:
pb(len(i_view), force=True) pb(len(i_view), force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -375,14 +388,20 @@ def run(config):
# and delete the temporary view in the input DMS # and delete the temporary view in the input DMS
if i_dms != o_dms: if i_dms != o_dms:
o_view.close() o_view.close()
View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, o_view_name_final) View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name)
o_view = o_dms[o_view_name_final] o_view = o_dms[final_o_view_name]
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_view), file=sys.stderr) #print(repr(o_view), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary imported view used to create the final view # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)
i_dms.close(force=True) i_dms.close(force=True)

View File

@ -4,13 +4,14 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view.view cimport View, Line_selection from obitools3.dms.view.view cimport View, Line_selection
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport str2bytes from obitools3.utils cimport str2bytes
import time import time
import sys import sys
from io import BufferedWriter
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
@ -22,6 +23,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group=parser.add_argument_group('obi head specific options') group=parser.add_argument_group('obi head specific options')
@ -53,29 +55,39 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0] o_dms = output[0]
o_view_name_final = output[1] output_0 = output[0]
o_view_name = o_view_name_final final_o_view_name = output[1]
# If the input and output DMS are not the same, create output view in input DMS first, then export it # If stdout output or the input and output DMS are not the same, create a temporary view that will be exported and deleted.
# to output DMS, making sure the temporary view name is unique in the input DMS if i_dms != o_dms or type(output_0)==BufferedWriter:
if i_dms != o_dms: temporary_view_name = b"temp"
i=0 i=0
while o_view_name in i_dms: while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name_final+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else:
o_view_name = final_o_view_name
n = min(config['head']['count'], len(i_view)) n = min(config['head']['count'], len(i_view))
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(n, config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(n, config)
else:
pb = None
selection = Line_selection(i_view) selection = Line_selection(i_view)
for i in range(n): for i in range(n):
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
selection.append(i) selection.append(i)
if pb is not None:
pb(i, force=True) pb(i, force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -94,14 +106,20 @@ def run(config):
# and delete the temporary view in the input DMS # and delete the temporary view in the input DMS
if i_dms != o_dms: if i_dms != o_dms:
o_view.close() o_view.close()
View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, o_view_name_final) View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name)
o_view = o_dms[o_view_name_final] o_view = o_dms[final_o_view_name]
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(view), file=sys.stderr) #print(repr(view), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary imported view used to create the final view # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)
i_dms.close(force=True) i_dms.close(force=True)

View File

@ -47,6 +47,8 @@ from obitools3.apps.config import logger
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
from io import BufferedWriter
__title__="Imports sequences from different formats into a DMS" __title__="Imports sequences from different formats into a DMS"
@ -130,7 +132,7 @@ def run(config):
if entry_count > 0: if entry_count > 0:
logger("info", "Importing %d entries", entry_count) logger("info", "Importing %d entries", entry_count)
else: else:
logger("info", "Importing an unknow number of entries") logger("info", "Importing an unknown number of entries")
# TODO a bit dirty? # TODO a bit dirty?
if input[2]==Nuc_Seq or input[2]==View_NUC_SEQS: if input[2]==Nuc_Seq or input[2]==View_NUC_SEQS:
@ -178,7 +180,7 @@ def run(config):
return return
if entry_count >= 0: if entry_count >= 0:
pb = ProgressBar(entry_count, config, seconde=5) pb = ProgressBar(entry_count, config)
NUC_SEQS_view = False NUC_SEQS_view = False
if isinstance(output[1], View) : if isinstance(output[1], View) :
@ -243,7 +245,7 @@ def run(config):
if isinstance(input[0], CompressedFile): if isinstance(input[0], CompressedFile):
input_is_file = True input_is_file = True
if entry_count >= 0: if entry_count >= 0:
pb = ProgressBar(entry_count, config, seconde=5) pb = ProgressBar(entry_count, config)
try: try:
input[0].close() input[0].close()
except AttributeError: except AttributeError:

View File

@ -2,10 +2,10 @@
from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException, View
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
from obitools3.dms.column.column cimport Column, Column_line from obitools3.dms.column.column cimport Column, Column_line
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.libalign._freeendgapfm import FreeEndGapFullMatch from obitools3.libalign._freeendgapfm import FreeEndGapFullMatch
@ -14,13 +14,14 @@ from obitools3.dms.obiseq cimport Nuc_Seq
from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL
from obitools3.dms.capi.apat cimport MAX_PATTERN from obitools3.dms.capi.apat cimport MAX_PATTERN
from obitools3.dms.capi.obiview cimport REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN from obitools3.dms.capi.obiview cimport REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN
from obitools3.utils cimport tobytes from obitools3.utils cimport tobytes, str2bytes
from libc.stdint cimport INT32_MAX from libc.stdint cimport INT32_MAX
from functools import reduce from functools import reduce
import math import math
import sys import sys
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
from io import BufferedWriter
#REVERSE_SEQ_COLUMN_NAME = b"REVERSE_SEQUENCE" # used by alignpairedend tool #REVERSE_SEQ_COLUMN_NAME = b"REVERSE_SEQUENCE" # used by alignpairedend tool
@ -34,6 +35,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi ngsfilter specific options') group = parser.add_argument_group('obi ngsfilter specific options')
@ -539,6 +541,7 @@ def run(config):
raise Exception("Could not open input reads") raise Exception("Could not open input reads")
if input[2] != View_NUC_SEQS: if input[2] != View_NUC_SEQS:
raise NotImplementedError('obi ngsfilter only works on NUC_SEQS views') raise NotImplementedError('obi ngsfilter only works on NUC_SEQS views')
i_dms = input[0]
if "reverse" in config["ngsfilter"]: if "reverse" in config["ngsfilter"]:
@ -580,8 +583,19 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0]
output_0 = output[0]
o_view = output[1] o_view = output[1]
# If stdout output, create a temporary view in the input dms that will be deleted afterwards.
if type(output_0)==BufferedWriter:
o_dms = i_dms
o_view_name = b"temp"
while o_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name+b"_"+str2bytes(str(i))
i+=1
o_view = View_NUC_SEQS.new(i_dms, o_view_name)
# Open the view containing the informations about the tags and the primers # Open the view containing the informations about the tags and the primers
info_input = open_uri(config['ngsfilter']['info_view']) info_input = open_uri(config['ngsfilter']['info_view'])
if info_input is None: if info_input is None:
@ -602,7 +616,10 @@ def run(config):
unidentified = None unidentified = None
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(entries_len, config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(entries_len, config)
else:
pb = None
# Check and store primers and tags # Check and store primers and tags
try: try:
@ -636,6 +653,7 @@ def run(config):
try: try:
for i in range(entries_len): for i in range(entries_len):
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
if not_aligned: if not_aligned:
modseq = [Nuc_Seq.new_from_stored(forward[i]), Nuc_Seq.new_from_stored(reverse[i])] modseq = [Nuc_Seq.new_from_stored(forward[i]), Nuc_Seq.new_from_stored(reverse[i])]
@ -660,6 +678,7 @@ def run(config):
else: else:
raise RollbackException("obi ngsfilter error, rollbacking view: "+str(e), o_view) raise RollbackException("obi ngsfilter error, rollbacking view: "+str(e), o_view)
if pb is not None:
pb(i, force=True) pb(i, force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -670,13 +689,23 @@ def run(config):
unidentified.write_config(config, "ngsfilter", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name) unidentified.write_config(config, "ngsfilter", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
# Add comment about unidentified seqs # Add comment about unidentified seqs
unidentified.comments["info"] = "View containing sequences categorized as unidentified by the ngsfilter command" unidentified.comments["info"] = "View containing sequences categorized as unidentified by the ngsfilter command"
output[0].record_command_line(command_line) o_dms.record_command_line(command_line)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_view), file=sys.stderr) #print(repr(o_view), file=sys.stderr)
input[0].close(force=True) # If stdout output, delete the temporary result view in the input DMS
output[0].close(force=True) if type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name)
i_dms.close(force=True)
o_dms.close(force=True)
info_input[0].close(force=True) info_input[0].close(force=True)
if unidentified is not None: if unidentified is not None:
unidentified_input[0].close(force=True) unidentified_input[0].close(force=True)

View File

@ -4,7 +4,7 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view.view cimport View, Line_selection from obitools3.dms.view.view cimport View, Line_selection
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport str2bytes from obitools3.utils cimport str2bytes
@ -24,6 +24,7 @@ from obitools3.dms.capi.obitypes cimport OBI_BOOL, \
import time import time
import sys import sys
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
from io import BufferedWriter
NULL_VALUE = {OBI_BOOL: OBIBool_NA, NULL_VALUE = {OBI_BOOL: OBIBool_NA,
@ -42,6 +43,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group=parser.add_argument_group('obi sort specific options') group=parser.add_argument_group('obi sort specific options')
@ -86,19 +88,27 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0] o_dms = output[0]
o_view_name_final = output[1] output_0 = output[0]
o_view_name = o_view_name_final final_o_view_name = output[1]
# If the input and output DMS are not the same, create output view in input DMS first, then export it # If stdout output or the input and output DMS are not the same, create a temporary view that will be exported and deleted.
# to output DMS, making sure the temporary view name is unique in the input DMS if i_dms != o_dms or type(output_0)==BufferedWriter:
if i_dms != o_dms: temporary_view_name = b"temp"
i=0 i=0
while o_view_name in i_dms: while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name_final+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else:
o_view_name = final_o_view_name
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(i_view), config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(len(i_view), config)
else:
pb = None
keys = config['sort']['keys'] keys = config['sort']['keys']
@ -110,8 +120,12 @@ def run(config):
for k in keys: # TODO order? for k in keys: # TODO order?
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
selection.sort(key=lambda line_idx: line_cmp(i_view[line_idx], k, pb(line_idx)), reverse=config['sort']['reverse']) selection.sort(key=lambda line_idx: line_cmp(i_view[line_idx], k, pb(line_idx)), reverse=config['sort']['reverse'])
else:
selection.sort(key=lambda line_idx: line_cmp(i_view[line_idx], k, None), reverse=config['sort']['reverse'])
if pb is not None:
pb(len(i_view), force=True) pb(len(i_view), force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -132,16 +146,23 @@ def run(config):
# and delete the temporary view in the input DMS # and delete the temporary view in the input DMS
if i_dms != o_dms: if i_dms != o_dms:
o_view.close() o_view.close()
View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, o_view_name_final) View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name)
o_view = o_dms[o_view_name_final] o_view = o_dms[final_o_view_name]
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_view), file=sys.stderr) #print(repr(o_view), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary imported view used to create the final view # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)
i_dms.close(force=True) i_dms.close(force=True)
logger("info", "Done.") logger("info", "Done.")

View File

@ -162,7 +162,7 @@ def run(config):
lcat=0 lcat=0
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(i_view), config, seconde=5) pb = ProgressBar(len(i_view), config)
for i in range(len(i_view)): for i in range(len(i_view)):
PyErr_CheckSignals() PyErr_CheckSignals()

View File

@ -4,7 +4,7 @@ from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
from obitools3.dms import DMS from obitools3.dms import DMS
from obitools3.dms.view.view cimport View, Line_selection from obitools3.dms.view.view cimport View, Line_selection
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption from obitools3.apps.optiongroups import addMinimalInputOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException from obitools3.dms.view import RollbackException
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport str2bytes from obitools3.utils cimport str2bytes
@ -12,6 +12,7 @@ from obitools3.utils cimport str2bytes
import time import time
import sys import sys
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
from io import BufferedWriter
__title__="Keep the N last lines of a view." __title__="Keep the N last lines of a view."
@ -21,6 +22,7 @@ def addOptions(parser):
addMinimalInputOption(parser) addMinimalInputOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addNoProgressBarOption(parser)
group=parser.add_argument_group('obi tail specific options') group=parser.add_argument_group('obi tail specific options')
@ -52,29 +54,39 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
o_dms = output[0] o_dms = output[0]
o_view_name_final = output[1] output_0 = output[0]
o_view_name = o_view_name_final final_o_view_name = output[1]
# If the input and output DMS are not the same, create output view in input DMS first, then export it # If stdout output or the input and output DMS are not the same, create a temporary view that will be exported and deleted.
# to output DMS, making sure the temporary view name is unique in the input DMS if i_dms != o_dms or type(output_0)==BufferedWriter:
if i_dms != o_dms: temporary_view_name = b"temp"
i=0 i=0
while o_view_name in i_dms: while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
o_view_name = o_view_name_final+b"_"+str2bytes(str(i)) temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1 i+=1
o_view_name = temporary_view_name
if type(output_0)==BufferedWriter:
o_dms = i_dms
else:
o_view_name = final_o_view_name
start = max(len(i_view) - config['tail']['count'], 0) start = max(len(i_view) - config['tail']['count'], 0)
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(i_view) - start, config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(len(i_view) - start, config)
else:
pb = None
selection = Line_selection(i_view) selection = Line_selection(i_view)
for i in range(start, len(i_view)): for i in range(start, len(i_view)):
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
selection.append(i) selection.append(i)
if pb is not None:
pb(i, force=True) pb(i, force=True)
print("", file=sys.stderr) print("", file=sys.stderr)
@ -97,14 +109,20 @@ def run(config):
# and delete the temporary view in the input DMS # and delete the temporary view in the input DMS
if i_dms != o_dms: if i_dms != o_dms:
o_view.close() o_view.close()
View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, o_view_name_final) View.import_view(i_dms.full_path[:-7], o_dms.full_path[:-7], o_view_name, final_o_view_name)
o_view = o_dms[o_view_name_final] o_view = o_dms[final_o_view_name]
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_view), file=sys.stderr) #print(repr(o_view), file=sys.stderr)
# If the input and the output DMS are different, delete the temporary imported view used to create the final view # If the input and the output DMS are different or if stdout output, delete the temporary imported view used to create the final view
if i_dms != o_dms: if i_dms != o_dms or type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name) View.delete_view(i_dms, o_view_name)
o_dms.close(force=True) o_dms.close(force=True)
i_dms.close(force=True) i_dms.close(force=True)

View File

@ -14,13 +14,15 @@ from obitools3.dms.capi.obitypes cimport OBI_INT, OBI_STR, index_t
from obitools3.apps.optiongroups import addMinimalInputOption, \ from obitools3.apps.optiongroups import addMinimalInputOption, \
addMinimalOutputOption, \ addMinimalOutputOption, \
addTaxonomyOption, \ addTaxonomyOption, \
addEltLimitOption addEltLimitOption, \
addNoProgressBarOption
from obitools3.uri.decode import open_uri from obitools3.uri.decode import open_uri
from obitools3.apps.config import logger from obitools3.apps.config import logger
from obitools3.utils cimport tobytes, tostr from obitools3.utils cimport tobytes, tostr, str2bytes
import sys import sys
from cpython.exc cimport PyErr_CheckSignals from cpython.exc cimport PyErr_CheckSignals
from io import BufferedWriter
__title__="Group sequence records together" __title__="Group sequence records together"
@ -32,6 +34,7 @@ def addOptions(parser):
addTaxonomyOption(parser) addTaxonomyOption(parser)
addMinimalOutputOption(parser) addMinimalOutputOption(parser)
addEltLimitOption(parser) addEltLimitOption(parser)
addNoProgressBarOption(parser)
group = parser.add_argument_group('obi uniq specific options') group = parser.add_argument_group('obi uniq specific options')
@ -143,11 +146,15 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy, dict
scientific_name_column = o_view[b"scientific_name"] scientific_name_column = o_view[b"scientific_name"]
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(o_view), config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(len(o_view), config)
else:
pb = None
i=0 i=0
for seq in o_view: for seq in o_view:
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
if MERGED_TAXID_COLUMN in seq : if MERGED_TAXID_COLUMN in seq :
m_taxids = [] m_taxids = []
@ -191,6 +198,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy, dict
scientific_name_column[i] = taxonomy.get_scientific_name(taxid) scientific_name_column[i] = taxonomy.get_scientific_name(taxid)
i+=1 i+=1
if pb is not None:
pb(len(o_view), force=True) pb(len(o_view), force=True)
@ -297,6 +305,7 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, di
iter_view = iter(view) iter_view = iter(view)
for i_seq in iter_view : for i_seq in iter_view :
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(i) pb(i)
# This can't be done in the same line as the unique_id tuple creation because it generates a bug # This can't be done in the same line as the unique_id tuple creation because it generates a bug
@ -416,11 +425,16 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, di
if COUNT_COLUMN in view: if COUNT_COLUMN in view:
i_count_col = view[COUNT_COLUMN] i_count_col = view[COUNT_COLUMN]
if pb is not None:
pb(len(view), force=True) pb(len(view), force=True)
print("") print("")
logger("info", "Second browsing through the input") logger("info", "Second browsing through the input")
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(view), seconde=5) if pb is not None:
pb = ProgressBar(len(view))
o_idx = 0 o_idx = 0
total_treated = 0 total_treated = 0
@ -455,6 +469,8 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, di
for i_idx in merged_sequences: for i_idx in merged_sequences:
PyErr_CheckSignals() PyErr_CheckSignals()
if pb is not None:
pb(total_treated) pb(total_treated)
i_id = i_id_col[i_idx] i_id = i_id_col[i_idx]
@ -531,6 +547,7 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, di
o_count_col[o_idx] = o_count o_count_col[o_idx] = o_count
o_idx += 1 o_idx += 1
if pb is not None:
pb(len(view), force=True) pb(len(view), force=True)
# Deletes quality columns if there is one because the matching between sequence and quality will be broken (quality set to NA when sequence not) # Deletes quality columns if there is one because the matching between sequence and quality will be broken (quality set to NA when sequence not)
@ -579,7 +596,22 @@ def run(config):
if output is None: if output is None:
raise Exception("Could not create output view") raise Exception("Could not create output view")
i_dms = input[0]
entries = input[1] entries = input[1]
o_dms = output[0]
output_0 = output[0]
# If stdout output create a temporary view that will be exported and deleted.
if type(output_0)==BufferedWriter:
temporary_view_name = b"temp"
i=0
while temporary_view_name in i_dms: # Making sure view name is unique in input DMS
temporary_view_name = temporary_view_name+b"_"+str2bytes(str(i))
i+=1
o_view_name = temporary_view_name
o_dms = i_dms
o_view = View_NUC_SEQS.new(i_dms, o_view_name)
else:
o_view = output[1] o_view = output[1]
if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None: if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None:
@ -591,7 +623,10 @@ def run(config):
taxo = None taxo = None
# Initialize the progress bar # Initialize the progress bar
pb = ProgressBar(len(entries), config, seconde=5) if config['obi']['noprogressbar'] == False:
pb = ProgressBar(len(entries), config)
else:
pb = None
if len(entries) > 0: if len(entries) > 0:
try: try:
@ -599,6 +634,7 @@ def run(config):
except Exception, e: except Exception, e:
raise RollbackException("obi uniq error, rollbacking view: "+str(e), o_view) raise RollbackException("obi uniq error, rollbacking view: "+str(e), o_view)
if pb is not None:
print("", file=sys.stderr) print("", file=sys.stderr)
# Save command config in View and DMS comments # Save command config in View and DMS comments
@ -609,13 +645,23 @@ def run(config):
input_dms_name.append(config['obi']['taxoURI'].split("/")[-3]) input_dms_name.append(config['obi']['taxoURI'].split("/")[-3])
input_view_name.append("taxonomy/"+config['obi']['taxoURI'].split("/")[-1]) input_view_name.append("taxonomy/"+config['obi']['taxoURI'].split("/")[-1])
o_view.write_config(config, "uniq", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name) o_view.write_config(config, "uniq", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
output[0].record_command_line(command_line) o_dms.record_command_line(command_line)
# stdout output: write to buffer
if type(output_0)==BufferedWriter:
logger("info", "Printing to output...")
o_view.print_to_output(output_0, noprogressbar=config['obi']['noprogressbar'])
o_view.close()
#print("\n\nOutput view:\n````````````", file=sys.stderr) #print("\n\nOutput view:\n````````````", file=sys.stderr)
#print(repr(o_view), file=sys.stderr) #print(repr(o_view), file=sys.stderr)
input[0].close(force=True) # If stdout output, delete the temporary result view in the input DMS
output[0].close(force=True) if type(output_0)==BufferedWriter:
View.delete_view(i_dms, o_view_name)
i_dms.close(force=True)
o_dms.close(force=True)
logger("info", "Done.") logger("info", "Done.")

View File

@ -210,10 +210,11 @@ def open_uri(uri,
error = None error = None
if scheme==b"dms" or \ if urib != b"-" and \
(scheme==b"dms" or \
(scheme==b"" and \ (scheme==b"" and \
(((not input) and "outputformat" not in config["obi"]) or \ (((not input) and "outputformat" not in config["obi"]) or \
(input and "inputformat" not in config["obi"]))): # TODO maybe not best way (input and "inputformat" not in config["obi"])))): # TODO maybe not best way
if default_dms is not None and b"/" not in urip.path: # assuming view to open in default DMS (TODO discuss) if default_dms is not None and b"/" not in urip.path: # assuming view to open in default DMS (TODO discuss)
dms=(default_dms, urip.path) dms=(default_dms, urip.path)
@ -275,10 +276,10 @@ def open_uri(uri,
iseq = urib iseq = urib
objclass = bytes objclass = bytes
else: # TODO update uopen to be able to write? else: # TODO update uopen to be able to write?
if urip.path: if urip.path == b'-':
file = open(urip.path, 'wb')
else:
file = sys.stdout.buffer file = sys.stdout.buffer
elif urip.path :
file = open(urip.path, 'wb')
if file is not None: if file is not None:
qualifiers=parse_qs(urip.query) qualifiers=parse_qs(urip.query)