Compare commits
61 Commits
v3.0.0-bet
...
v3.0.0b23
Author | SHA1 | Date | |
---|---|---|---|
359a9fe237 | |||
f9b6851f75 | |||
29a2652bbf | |||
2a2c233936 | |||
faf8ea9d86 | |||
ffe2485e94 | |||
6094ce2bbc | |||
a7dcf16c06 | |||
f13f8f6165 | |||
b5a29ac413 | |||
efd2b9d338 | |||
ca6e3e7aad | |||
76ed8e18e5 | |||
1d17f28aec | |||
fa834e4b8b | |||
a72fea3cc9 | |||
e9a37d8a6e | |||
ef074f8455 | |||
aec5e69f2c | |||
170ef3f1ba | |||
f999946582 | |||
773b36ec37 | |||
69cb434a6c | |||
55d4f98d60 | |||
0bec2631e8 | |||
e6b6c6fa84 | |||
974528b2e6 | |||
1b346b54f9 | |||
058f2ad8b3 | |||
60bfd3ae8d | |||
67bdee105a | |||
0f745e0113 | |||
da8de52ba4 | |||
4d36538c6e | |||
8d0b17d87d | |||
343999a627 | |||
e9a40630e9 | |||
8dbcd3025a | |||
4cf635d001 | |||
b7e7cc232a | |||
b6ab792ceb | |||
ddea5a2964 | |||
30852ab7d5 | |||
4d0299904e | |||
eef5156d95 | |||
e62c991bbc | |||
1218eed7fd | |||
cd9cea8c97 | |||
98cfb70d73 | |||
b9f68c76c8 | |||
0b98371688 | |||
f0d152fcbd | |||
8019dee68e | |||
0b4a234671 | |||
d32cfdcce5 | |||
219c0d6fdc | |||
dc9f897917 | |||
bb72682f7d | |||
52920c3c71 | |||
18c22cecf9 | |||
1bfb96023c |
@ -6,7 +6,7 @@ recursive-include doc/sphinx/source *.txt *.rst *.py
|
|||||||
recursive-include doc/sphinx/sphinxext *.py
|
recursive-include doc/sphinx/sphinxext *.py
|
||||||
include doc/sphinx/Makefile
|
include doc/sphinx/Makefile
|
||||||
include doc/sphinx/Doxyfile
|
include doc/sphinx/Doxyfile
|
||||||
include README.txt
|
include README.md
|
||||||
include requirements.txt
|
include requirements.txt
|
||||||
include scripts/obi
|
include scripts/obi
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
#/usr/bin/env bash
|
|
||||||
|
|
||||||
_obi_comp ()
|
_obi_comp ()
|
||||||
{
|
{
|
@ -266,9 +266,9 @@ def run(config):
|
|||||||
# 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:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
@ -247,10 +247,10 @@ def run(config):
|
|||||||
#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)
|
||||||
|
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
if two_views:
|
if two_views:
|
||||||
rinput[0].close()
|
rinput[0].close(force=True)
|
||||||
output[0].close()
|
output[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
@ -13,7 +13,8 @@ from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, \
|
|||||||
ID_COLUMN, \
|
ID_COLUMN, \
|
||||||
DEFINITION_COLUMN, \
|
DEFINITION_COLUMN, \
|
||||||
QUALITY_COLUMN, \
|
QUALITY_COLUMN, \
|
||||||
COUNT_COLUMN
|
COUNT_COLUMN, \
|
||||||
|
TAXID_COLUMN
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import math
|
import math
|
||||||
@ -175,8 +176,8 @@ def sequenceTaggerGenerator(config, taxo=None):
|
|||||||
counter[0]+=1
|
counter[0]+=1
|
||||||
|
|
||||||
for rank in annoteRank:
|
for rank in annoteRank:
|
||||||
if 'taxid' in seq:
|
if TAXID_COLUMN in seq:
|
||||||
taxid = seq['taxid']
|
taxid = seq[TAXID_COLUMN]
|
||||||
if taxid is not None:
|
if taxid is not None:
|
||||||
rtaxid = taxo.get_taxon_at_rank(taxid, rank)
|
rtaxid = taxo.get_taxon_at_rank(taxid, rank)
|
||||||
if rtaxid is not None:
|
if rtaxid is not None:
|
||||||
@ -190,58 +191,50 @@ def sequenceTaggerGenerator(config, taxo=None):
|
|||||||
seq['seq_rank']=counter[0]
|
seq['seq_rank']=counter[0]
|
||||||
|
|
||||||
for i,v in toSet:
|
for i,v in toSet:
|
||||||
#try:
|
try:
|
||||||
if taxo is not None:
|
if taxo is not None:
|
||||||
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
else:
|
else:
|
||||||
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
val = eval(v, environ, seq)
|
val = eval(v, environ, seq)
|
||||||
#except Exception,e: # TODO discuss usefulness of this
|
except Exception: # set string if not a valid expression
|
||||||
# if options.onlyValid:
|
val = v
|
||||||
# raise e
|
|
||||||
# val = v
|
|
||||||
seq[i]=val
|
seq[i]=val
|
||||||
|
|
||||||
if length:
|
if length:
|
||||||
seq['seq_length']=len(seq)
|
seq['seq_length']=len(seq)
|
||||||
|
|
||||||
if newId is not None:
|
if newId is not None:
|
||||||
# try:
|
try:
|
||||||
if taxo is not None:
|
if taxo is not None:
|
||||||
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
else:
|
else:
|
||||||
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
val = eval(newId, environ, seq)
|
val = eval(newId, environ, seq)
|
||||||
# except Exception,e:
|
except Exception: # set string if not a valid expression
|
||||||
# if options.onlyValid:
|
val = newId
|
||||||
# raise e
|
|
||||||
# val = newId
|
|
||||||
seq.id=val
|
seq.id=val
|
||||||
|
|
||||||
if newDef is not None:
|
if newDef is not None:
|
||||||
# try:
|
try:
|
||||||
if taxo is not None:
|
if taxo is not None:
|
||||||
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
else:
|
else:
|
||||||
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
val = eval(newDef, environ, seq)
|
val = eval(newDef, environ, seq)
|
||||||
# except Exception,e:
|
except Exception: # set string if not a valid expression
|
||||||
# if options.onlyValid:
|
val = newDef
|
||||||
# raise e
|
|
||||||
# val = newDef
|
|
||||||
seq.definition=val
|
seq.definition=val
|
||||||
#
|
|
||||||
if newSeq is not None:
|
if newSeq is not None:
|
||||||
# try:
|
try:
|
||||||
if taxo is not None:
|
if taxo is not None:
|
||||||
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
else:
|
else:
|
||||||
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
val = eval(newSeq, environ, seq)
|
val = eval(newSeq, environ, seq)
|
||||||
# except Exception,e:
|
except Exception: # set string if not a valid expression
|
||||||
# if options.onlyValid:
|
val = newSeq
|
||||||
# raise e
|
|
||||||
# val = newSeq
|
|
||||||
seq.seq=val
|
seq.seq=val
|
||||||
if 'seq_length' in seq:
|
if 'seq_length' in seq:
|
||||||
seq['seq_length']=len(seq)
|
seq['seq_length']=len(seq)
|
||||||
@ -251,15 +244,14 @@ def sequenceTaggerGenerator(config, taxo=None):
|
|||||||
seq.view.delete_column(QUALITY_COLUMN)
|
seq.view.delete_column(QUALITY_COLUMN)
|
||||||
|
|
||||||
if run is not None:
|
if run is not None:
|
||||||
# try:
|
try:
|
||||||
if taxo is not None:
|
if taxo is not None:
|
||||||
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'taxonomy' : taxo, 'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
else:
|
else:
|
||||||
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
environ = {'sequence':seq, 'counter':counter[0], 'math':math}
|
||||||
eval(run, environ, seq)
|
eval(run, environ, seq)
|
||||||
# except Exception,e:
|
except Exception,e:
|
||||||
# if options.onlyValid:
|
raise e
|
||||||
# raise e
|
|
||||||
|
|
||||||
return sequenceTagger
|
return sequenceTagger
|
||||||
|
|
||||||
@ -379,7 +371,7 @@ def run(config):
|
|||||||
# 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, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(o_dms, imported_view_name)
|
View.delete_view(o_dms, imported_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -97,9 +97,9 @@ def run(config):
|
|||||||
# 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:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -86,7 +86,24 @@ def run(config):
|
|||||||
if not remove_rev_qual:
|
if not remove_rev_qual:
|
||||||
Column.new_column(o_view, REVERSE_SEQUENCE_COLUMN, OBI_SEQ)
|
Column.new_column(o_view, REVERSE_SEQUENCE_COLUMN, OBI_SEQ)
|
||||||
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
|
||||||
|
dict_cols = {}
|
||||||
|
for v in iview_list:
|
||||||
|
for coln in v.keys():
|
||||||
|
if v[coln].nb_elements_per_line > 1:
|
||||||
|
if coln not in dict_cols:
|
||||||
|
dict_cols[coln] = {}
|
||||||
|
dict_cols[coln]['eltnames'] = set(v[coln].elements_names)
|
||||||
|
dict_cols[coln]['nbelts'] = v[coln].nb_elements_per_line
|
||||||
|
dict_cols[coln]['obitype'] = v[coln].data_type_int
|
||||||
|
else:
|
||||||
|
dict_cols[coln]['eltnames'] = set(v[coln].elements_names + list(dict_cols[coln]['eltnames']))
|
||||||
|
dict_cols[coln]['nbelts'] = len(dict_cols[coln]['eltnames'])
|
||||||
|
for coln in dict_cols:
|
||||||
|
Column.new_column(o_view, coln, dict_cols[coln]['obitype'],
|
||||||
|
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)
|
pb = ProgressBar(total_len, config, seconde=5)
|
||||||
|
|
||||||
@ -116,7 +133,7 @@ def run(config):
|
|||||||
#print(repr(view), file=sys.stderr)
|
#print(repr(view), file=sys.stderr)
|
||||||
|
|
||||||
for d in idms_list:
|
for d in idms_list:
|
||||||
d.close()
|
d.close(force=True)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -124,8 +124,8 @@ def run(config):
|
|||||||
# 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:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
@ -56,3 +56,5 @@ def run(config):
|
|||||||
print(count2)
|
print(count2)
|
||||||
else:
|
else:
|
||||||
print(count1)
|
print(count1)
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -35,13 +35,15 @@ def addOptions(parser):
|
|||||||
action="store", dest="ecopcr:primer1",
|
action="store", dest="ecopcr:primer1",
|
||||||
metavar='<PRIMER>',
|
metavar='<PRIMER>',
|
||||||
type=str,
|
type=str,
|
||||||
help="Forward primer.")
|
required=True,
|
||||||
|
help="Forward primer, length must be less than or equal to 32")
|
||||||
|
|
||||||
group.add_argument('--primer2', '-R',
|
group.add_argument('--primer2', '-R',
|
||||||
action="store", dest="ecopcr:primer2",
|
action="store", dest="ecopcr:primer2",
|
||||||
metavar='<PRIMER>',
|
metavar='<PRIMER>',
|
||||||
type=str,
|
type=str,
|
||||||
help="Reverse primer.")
|
required=True,
|
||||||
|
help="Reverse primer, length must be less than or equal to 32")
|
||||||
|
|
||||||
group.add_argument('--error', '-e',
|
group.add_argument('--error', '-e',
|
||||||
action="store", dest="ecopcr:error",
|
action="store", dest="ecopcr:error",
|
||||||
@ -203,6 +205,7 @@ def run(config):
|
|||||||
#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)
|
||||||
|
|
||||||
o_dms.close()
|
i_dms.close(force=True)
|
||||||
|
o_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -64,10 +64,10 @@ def run(config):
|
|||||||
ref_view_name = ref[1]
|
ref_view_name = ref[1]
|
||||||
|
|
||||||
# Check that the threshold demanded is greater than or equal to the threshold used to build the reference database
|
# Check that the threshold demanded is greater than or equal to the threshold used to build the reference database
|
||||||
if config['ecotag']['threshold'] < eval(i_dms[ref_view_name].comments["ref_db_threshold"]) :
|
if config['ecotag']['threshold'] < eval(ref_dms[ref_view_name].comments["ref_db_threshold"]) :
|
||||||
print("Error: The threshold demanded (%f) is lower than the threshold used to build the reference database (%f).",
|
print("Error: The threshold demanded (%f) is lower than the threshold used to build the reference database (%f).",
|
||||||
config['ecotag']['threshold'], i_dms[ref_view_name].comments["ref_db_threshold"])
|
config['ecotag']['threshold'], ref_dms[ref_view_name].comments["ref_db_threshold"])
|
||||||
|
|
||||||
# Open the output: only the DMS
|
# Open the output: only the DMS
|
||||||
output = open_uri(config['obi']['outputURI'],
|
output = open_uri(config['obi']['outputURI'],
|
||||||
input=False,
|
input=False,
|
||||||
@ -107,8 +107,8 @@ def run(config):
|
|||||||
comments = View.print_config(config, "ecotag", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
|
comments = View.print_config(config, "ecotag", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
|
||||||
|
|
||||||
if obi_ecotag(i_dms.name_with_full_path, tobytes(i_view_name), \
|
if obi_ecotag(i_dms.name_with_full_path, tobytes(i_view_name), \
|
||||||
tobytes(ref_dms_name), tobytes(ref_view_name), \
|
ref_dms.name_with_full_path, tobytes(ref_view_name), \
|
||||||
tobytes(taxo_dms_name), tobytes(taxonomy_name), \
|
taxo_dms.name_with_full_path, tobytes(taxonomy_name), \
|
||||||
tobytes(o_view_name), comments,
|
tobytes(o_view_name), comments,
|
||||||
config['ecotag']['threshold']) < 0:
|
config['ecotag']['threshold']) < 0:
|
||||||
raise Exception("Error running ecotag")
|
raise Exception("Error running ecotag")
|
||||||
@ -126,9 +126,11 @@ def run(config):
|
|||||||
# 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:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
|
|
||||||
i_dms.close()
|
taxo_dms.close(force=True)
|
||||||
|
ref_dms.close(force=True)
|
||||||
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -59,13 +59,23 @@ def run(config):
|
|||||||
# Check that the input view has the type NUC_SEQS if needed # TODO discuss, maybe bool property
|
# 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
|
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")
|
raise Exception("Error: the view to export in fasta or fastq format is not a NUC_SEQS view")
|
||||||
|
|
||||||
|
if config['obi']['only'] is not None:
|
||||||
|
withoutskip = min(input[4], config['obi']['only'])
|
||||||
|
else:
|
||||||
|
withoutskip = input[4]
|
||||||
|
|
||||||
|
if config['obi']['skip'] is not None:
|
||||||
|
skip = min(input[4], config['obi']['skip'])
|
||||||
|
else:
|
||||||
|
skip = 0
|
||||||
|
|
||||||
# Initialize the progress bar
|
# Initialize the progress bar
|
||||||
if config['obi']['noprogressbar']:
|
if config['obi']['noprogressbar']:
|
||||||
pb = None
|
pb = None
|
||||||
else:
|
else:
|
||||||
pb = ProgressBar(len(iview), config, seconde=5)
|
pb = ProgressBar(withoutskip - skip, config, seconde=5)
|
||||||
|
|
||||||
i=0
|
i=0
|
||||||
for seq in iview :
|
for seq in iview :
|
||||||
PyErr_CheckSignals()
|
PyErr_CheckSignals()
|
||||||
@ -86,7 +96,7 @@ def run(config):
|
|||||||
if not BrokenPipeError and not IOError:
|
if not BrokenPipeError and not IOError:
|
||||||
output_object.close()
|
output_object.close()
|
||||||
iview.close()
|
iview.close()
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -370,7 +370,7 @@ def run(config):
|
|||||||
# 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, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -103,7 +103,7 @@ def run(config):
|
|||||||
# 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, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -54,4 +54,5 @@ def run(config):
|
|||||||
print(bytes2str(entries.ascii_history))
|
print(bytes2str(entries.ascii_history))
|
||||||
else:
|
else:
|
||||||
raise Exception("ASCII history only available for views")
|
raise Exception("ASCII history only available for views")
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -11,6 +11,7 @@ from obitools3.dms.column.column cimport Column
|
|||||||
from obitools3.dms.obiseq cimport Nuc_Seq
|
from obitools3.dms.obiseq cimport Nuc_Seq
|
||||||
from obitools3.dms import DMS
|
from obitools3.dms import DMS
|
||||||
from obitools3.dms.taxo.taxo cimport Taxonomy
|
from obitools3.dms.taxo.taxo cimport Taxonomy
|
||||||
|
from obitools3.files.uncompress cimport CompressedFile
|
||||||
|
|
||||||
|
|
||||||
from obitools3.utils cimport tobytes, \
|
from obitools3.utils cimport tobytes, \
|
||||||
@ -24,7 +25,8 @@ from obitools3.dms.capi.obiview cimport VIEW_TYPE_NUC_SEQS, \
|
|||||||
DEFINITION_COLUMN, \
|
DEFINITION_COLUMN, \
|
||||||
QUALITY_COLUMN, \
|
QUALITY_COLUMN, \
|
||||||
COUNT_COLUMN, \
|
COUNT_COLUMN, \
|
||||||
TAXID_COLUMN
|
TAXID_COLUMN, \
|
||||||
|
MERGED_PREFIX
|
||||||
|
|
||||||
from obitools3.dms.capi.obidms cimport obi_import_view
|
from obitools3.dms.capi.obidms cimport obi_import_view
|
||||||
|
|
||||||
@ -65,6 +67,14 @@ def addOptions(parser):
|
|||||||
addTaxdumpInputOption(parser)
|
addTaxdumpInputOption(parser)
|
||||||
addMinimalOutputOption(parser)
|
addMinimalOutputOption(parser)
|
||||||
|
|
||||||
|
group = parser.add_argument_group('obi import specific options')
|
||||||
|
|
||||||
|
group.add_argument('--preread',
|
||||||
|
action="store_true", dest="import:preread",
|
||||||
|
default=False,
|
||||||
|
help="Do a first readthrough of the dataset if it contains huge dictionaries (more than 100 keys) for "
|
||||||
|
"a much faster import. This option is not recommended and will slow down the import in any other case.")
|
||||||
|
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
|
|
||||||
@ -154,7 +164,7 @@ def run(config):
|
|||||||
taxo.write(taxo_name)
|
taxo.write(taxo_name)
|
||||||
taxo.close()
|
taxo.close()
|
||||||
o_dms.record_command_line(" ".join(sys.argv[1:]))
|
o_dms.record_command_line(" ".join(sys.argv[1:]))
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -169,8 +179,6 @@ def run(config):
|
|||||||
|
|
||||||
if entry_count >= 0:
|
if entry_count >= 0:
|
||||||
pb = ProgressBar(entry_count, config, seconde=5)
|
pb = ProgressBar(entry_count, config, seconde=5)
|
||||||
|
|
||||||
entries = input[1]
|
|
||||||
|
|
||||||
NUC_SEQS_view = False
|
NUC_SEQS_view = False
|
||||||
if isinstance(output[1], View) :
|
if isinstance(output[1], View) :
|
||||||
@ -188,6 +196,63 @@ def run(config):
|
|||||||
|
|
||||||
dcols = {}
|
dcols = {}
|
||||||
|
|
||||||
|
# First read through the entries to prepare columns with dictionaries as they are very time-expensive to rewrite
|
||||||
|
if config['import']['preread']:
|
||||||
|
logger("info", "First readthrough...")
|
||||||
|
entries = input[1]
|
||||||
|
i = 0
|
||||||
|
dict_dict = {}
|
||||||
|
for entry in entries:
|
||||||
|
PyErr_CheckSignals()
|
||||||
|
|
||||||
|
if entry is None: # error or exception handled at lower level, not raised because Python generators can't resume after any exception is raised
|
||||||
|
if config['obi']['skiperror']:
|
||||||
|
i-=1
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
raise Exception("obi import error in first readthrough")
|
||||||
|
|
||||||
|
if pb is not None:
|
||||||
|
pb(i)
|
||||||
|
elif not i%50000:
|
||||||
|
logger("info", "Read %d entries", i)
|
||||||
|
|
||||||
|
for tag in entry :
|
||||||
|
newtag = tag
|
||||||
|
if tag[:7] == b"merged_":
|
||||||
|
newtag = MERGED_PREFIX+tag[7:]
|
||||||
|
if type(entry[tag]) == dict :
|
||||||
|
if tag in dict_dict:
|
||||||
|
dict_dict[newtag][0].update(entry[tag].keys())
|
||||||
|
else:
|
||||||
|
dict_dict[newtag] = [set(entry[tag].keys()), get_obitype(entry[tag])]
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
if pb is not None:
|
||||||
|
pb(i, force=True)
|
||||||
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
|
for tag in dict_dict:
|
||||||
|
dcols[tag] = (Column.new_column(view, tag, dict_dict[tag][1], \
|
||||||
|
nb_elements_per_line=len(dict_dict[tag][0]), \
|
||||||
|
elements_names=list(dict_dict[tag][0])), \
|
||||||
|
dict_dict[tag][1])
|
||||||
|
|
||||||
|
|
||||||
|
# Reinitialize the input
|
||||||
|
if isinstance(input[0], CompressedFile):
|
||||||
|
input_is_file = True
|
||||||
|
if entry_count >= 0:
|
||||||
|
pb = ProgressBar(entry_count, config, seconde=5)
|
||||||
|
try:
|
||||||
|
input[0].close()
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
input = open_uri(config['obi']['inputURI'], force_file=input_is_file)
|
||||||
|
if input is None:
|
||||||
|
raise Exception("Could not open input URI")
|
||||||
|
|
||||||
|
entries = input[1]
|
||||||
i = 0
|
i = 0
|
||||||
for entry in entries :
|
for entry in entries :
|
||||||
|
|
||||||
@ -195,7 +260,6 @@ def run(config):
|
|||||||
|
|
||||||
if entry is None: # error or exception handled at lower level, not raised because Python generators can't resume after any exception is raised
|
if entry is None: # error or exception handled at lower level, not raised because Python generators can't resume after any exception is raised
|
||||||
if config['obi']['skiperror']:
|
if config['obi']['skiperror']:
|
||||||
i-=1
|
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
raise RollbackException("obi import error, rollbacking view", view)
|
raise RollbackException("obi import error, rollbacking view", view)
|
||||||
@ -204,123 +268,134 @@ def run(config):
|
|||||||
pb(i)
|
pb(i)
|
||||||
elif not i%50000:
|
elif not i%50000:
|
||||||
logger("info", "Imported %d entries", i)
|
logger("info", "Imported %d entries", i)
|
||||||
|
|
||||||
if NUC_SEQS_view:
|
try:
|
||||||
id_col[i] = entry.id
|
|
||||||
def_col[i] = entry.definition
|
if NUC_SEQS_view:
|
||||||
seq_col[i] = entry.seq
|
id_col[i] = entry.id
|
||||||
# Check if there is a sequencing quality associated by checking the first entry # TODO haven't found a more robust solution yet
|
def_col[i] = entry.definition
|
||||||
if i == 0:
|
seq_col[i] = entry.seq
|
||||||
get_quality = QUALITY_COLUMN in entry
|
# Check if there is a sequencing quality associated by checking the first entry # TODO haven't found a more robust solution yet
|
||||||
|
if i == 0:
|
||||||
|
get_quality = QUALITY_COLUMN in entry
|
||||||
|
if get_quality:
|
||||||
|
Column.new_column(view, QUALITY_COLUMN, OBI_QUAL)
|
||||||
|
qual_col = view[QUALITY_COLUMN]
|
||||||
if get_quality:
|
if get_quality:
|
||||||
Column.new_column(view, QUALITY_COLUMN, OBI_QUAL)
|
qual_col[i] = entry.quality
|
||||||
qual_col = view[QUALITY_COLUMN]
|
|
||||||
if get_quality:
|
for tag in entry :
|
||||||
qual_col[i] = entry.quality
|
|
||||||
|
if tag != ID_COLUMN and tag != DEFINITION_COLUMN and tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN : # TODO dirty
|
||||||
for tag in entry :
|
|
||||||
|
value = entry[tag]
|
||||||
if tag != ID_COLUMN and tag != DEFINITION_COLUMN and tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN : # TODO dirty
|
if tag == b"taxid":
|
||||||
|
tag = TAXID_COLUMN
|
||||||
value = entry[tag]
|
if tag == b"count":
|
||||||
if tag == b"taxid":
|
tag = COUNT_COLUMN
|
||||||
tag = TAXID_COLUMN
|
if tag[:7] == b"merged_":
|
||||||
if tag == b"count":
|
tag = MERGED_PREFIX+tag[7:]
|
||||||
tag = COUNT_COLUMN
|
|
||||||
|
|
||||||
if tag not in dcols :
|
|
||||||
|
|
||||||
value_type = type(value)
|
|
||||||
nb_elts = 1
|
|
||||||
value_obitype = OBI_VOID
|
|
||||||
|
|
||||||
if value_type == dict or value_type == list :
|
|
||||||
nb_elts = len(value)
|
|
||||||
elt_names = list(value)
|
|
||||||
else :
|
|
||||||
nb_elts = 1
|
|
||||||
elt_names = None
|
|
||||||
|
|
||||||
value_obitype = get_obitype(value)
|
|
||||||
|
|
||||||
if value_obitype != OBI_VOID :
|
|
||||||
dcols[tag] = (Column.new_column(view, tag, value_obitype, nb_elements_per_line=nb_elts, elements_names=elt_names), value_obitype)
|
|
||||||
|
|
||||||
# Fill value
|
|
||||||
if value_type == dict and nb_elts == 1: # special case that makes the OBI3 create a 1 elt/line column which won't read a dict value
|
|
||||||
value = value[list(value.keys())[0]] # The solution is to transform the value in a simple atomic one acceptable by the column
|
|
||||||
dcols[tag][0][i] = value
|
|
||||||
|
|
||||||
# TODO else log error?
|
|
||||||
|
|
||||||
else :
|
|
||||||
|
|
||||||
rewrite = False
|
|
||||||
|
|
||||||
# Check type adequation
|
|
||||||
old_type = dcols[tag][1]
|
|
||||||
new_type = OBI_VOID
|
|
||||||
new_type = update_obitype(old_type, value)
|
|
||||||
if old_type != new_type :
|
|
||||||
rewrite = True
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Check that it's not the case where the first entry contained a dict of length 1 and now there is a new key
|
|
||||||
if type(value) == dict and \
|
|
||||||
dcols[tag][0].nb_elements_per_line == 1 and len(value.keys()) == 1 \
|
|
||||||
and dcols[tag][0].elements_names[0] != list(value.keys())[0] :
|
|
||||||
raise IndexError # trigger column rewrite
|
|
||||||
|
|
||||||
# Fill value
|
if tag not in dcols :
|
||||||
dcols[tag][0][i] = value
|
|
||||||
|
|
||||||
except IndexError :
|
|
||||||
|
|
||||||
value_type = type(value)
|
value_type = type(value)
|
||||||
old_column = dcols[tag][0]
|
nb_elts = 1
|
||||||
old_nb_elements_per_line = old_column.nb_elements_per_line
|
value_obitype = OBI_VOID
|
||||||
new_nb_elements_per_line = 0
|
|
||||||
old_elements_names = old_column.elements_names
|
if value_type == dict or value_type == list :
|
||||||
new_elements_names = None
|
nb_elts = len(value)
|
||||||
|
elt_names = list(value)
|
||||||
|
else :
|
||||||
|
nb_elts = 1
|
||||||
|
elt_names = None
|
||||||
|
|
||||||
|
value_obitype = get_obitype(value)
|
||||||
|
|
||||||
|
if value_obitype != OBI_VOID :
|
||||||
|
dcols[tag] = (Column.new_column(view, tag, value_obitype, nb_elements_per_line=nb_elts, elements_names=elt_names), value_obitype)
|
||||||
|
|
||||||
|
# Fill value
|
||||||
|
if value_type == dict and nb_elts == 1: # special case that makes the OBI3 create a 1 elt/line column which won't read a dict value
|
||||||
|
value = value[list(value.keys())[0]] # The solution is to transform the value in a simple atomic one acceptable by the column
|
||||||
|
dcols[tag][0][i] = value
|
||||||
|
|
||||||
|
# TODO else log error?
|
||||||
|
|
||||||
#####################################################################
|
else :
|
||||||
|
|
||||||
# Check the length and keys of column lines if needed
|
rewrite = False
|
||||||
if value_type == dict : # Check dictionary keys
|
|
||||||
for k in value :
|
# Check type adequation
|
||||||
if k not in old_elements_names :
|
old_type = dcols[tag][1]
|
||||||
new_elements_names = list(set(old_elements_names+[tobytes(k) for k in value]))
|
new_type = OBI_VOID
|
||||||
rewrite = True
|
new_type = update_obitype(old_type, value)
|
||||||
break
|
if old_type != new_type :
|
||||||
|
rewrite = True
|
||||||
elif value_type == list or value_type == tuple : # Check vector length
|
|
||||||
if old_nb_elements_per_line < len(value) :
|
try:
|
||||||
new_nb_elements_per_line = len(value)
|
# Check that it's not the case where the first entry contained a dict of length 1 and now there is a new key
|
||||||
rewrite = True
|
if type(value) == dict and \
|
||||||
|
dcols[tag][0].nb_elements_per_line == 1 \
|
||||||
#####################################################################
|
and set(dcols[tag][0].elements_names) != set(value.keys()) :
|
||||||
|
raise IndexError # trigger column rewrite
|
||||||
if rewrite :
|
|
||||||
if new_nb_elements_per_line == 0 and new_elements_names is not None :
|
|
||||||
new_nb_elements_per_line = len(new_elements_names)
|
|
||||||
|
|
||||||
# Reset obierrno
|
|
||||||
obi_errno = 0
|
|
||||||
|
|
||||||
dcols[tag] = (view.rewrite_column_with_diff_attributes(old_column.name,
|
|
||||||
new_data_type=new_type,
|
|
||||||
new_nb_elements_per_line=new_nb_elements_per_line,
|
|
||||||
new_elements_names=new_elements_names,
|
|
||||||
rewrite_last_line=False),
|
|
||||||
new_type)
|
|
||||||
|
|
||||||
# Update the dictionary:
|
|
||||||
for t in dcols :
|
|
||||||
dcols[t] = (view[t], dcols[t][1])
|
|
||||||
|
|
||||||
# Fill value
|
# Fill value
|
||||||
dcols[tag][0][i] = value
|
dcols[tag][0][i] = value
|
||||||
|
|
||||||
|
except IndexError :
|
||||||
|
|
||||||
|
value_type = type(value)
|
||||||
|
old_column = dcols[tag][0]
|
||||||
|
old_nb_elements_per_line = old_column.nb_elements_per_line
|
||||||
|
new_nb_elements_per_line = 0
|
||||||
|
old_elements_names = old_column.elements_names
|
||||||
|
new_elements_names = None
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
# Check the length and keys of column lines if needed
|
||||||
|
if value_type == dict : # Check dictionary keys
|
||||||
|
for k in value :
|
||||||
|
if k not in old_elements_names :
|
||||||
|
new_elements_names = list(set(old_elements_names+[tobytes(k) for k in value]))
|
||||||
|
rewrite = True
|
||||||
|
break
|
||||||
|
|
||||||
|
elif value_type == list or value_type == tuple : # Check vector length
|
||||||
|
if old_nb_elements_per_line < len(value) :
|
||||||
|
new_nb_elements_per_line = len(value)
|
||||||
|
rewrite = True
|
||||||
|
|
||||||
|
#####################################################################
|
||||||
|
|
||||||
|
if rewrite :
|
||||||
|
if new_nb_elements_per_line == 0 and new_elements_names is not None :
|
||||||
|
new_nb_elements_per_line = len(new_elements_names)
|
||||||
|
|
||||||
|
# Reset obierrno
|
||||||
|
obi_errno = 0
|
||||||
|
|
||||||
|
dcols[tag] = (view.rewrite_column_with_diff_attributes(old_column.name,
|
||||||
|
new_data_type=new_type,
|
||||||
|
new_nb_elements_per_line=new_nb_elements_per_line,
|
||||||
|
new_elements_names=new_elements_names,
|
||||||
|
rewrite_last_line=False),
|
||||||
|
new_type)
|
||||||
|
|
||||||
|
# Update the dictionary:
|
||||||
|
for t in dcols :
|
||||||
|
dcols[t] = (view[t], dcols[t][1])
|
||||||
|
|
||||||
|
# Fill value
|
||||||
|
dcols[tag][0][i] = value
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print("\nCould not import sequence id:", entry.id, "(error raised:", e, ")")
|
||||||
|
if 'skiperror' in config['obi'] and not config['obi']['skiperror']:
|
||||||
|
raise e
|
||||||
|
else:
|
||||||
|
pass
|
||||||
|
|
||||||
i+=1
|
i+=1
|
||||||
|
|
||||||
if pb is not None:
|
if pb is not None:
|
||||||
@ -341,7 +416,7 @@ def run(config):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
output[0].close()
|
output[0].close(force=True)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -46,5 +46,5 @@ def run(config):
|
|||||||
process.wait()
|
process.wait()
|
||||||
|
|
||||||
iview.close()
|
iview.close()
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ def run(config):
|
|||||||
l = []
|
l = []
|
||||||
for view in input[0]:
|
for view in input[0]:
|
||||||
l.append(tostr(view) + "\t(Date created: " + str(bytes2str_object(dms[view].comments["Date created"]))+")")
|
l.append(tostr(view) + "\t(Date created: " + str(bytes2str_object(dms[view].comments["Date created"]))+")")
|
||||||
|
dms[view].close()
|
||||||
l.sort()
|
l.sort()
|
||||||
for v in l:
|
for v in l:
|
||||||
print(v)
|
print(v)
|
||||||
@ -51,4 +52,5 @@ def run(config):
|
|||||||
if config['ls']['longformat'] and len(input[1].comments) > 0:
|
if config['ls']['longformat'] and len(input[1].comments) > 0:
|
||||||
print("\n### Comments:")
|
print("\n### Comments:")
|
||||||
print(str(input[1].comments))
|
print(str(input[1].comments))
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -42,7 +42,9 @@ def addOptions(parser):
|
|||||||
metavar="<URI>",
|
metavar="<URI>",
|
||||||
type=str,
|
type=str,
|
||||||
default=None,
|
default=None,
|
||||||
help="URI to the view containing the samples definition (with tags, primers, sample names,...)")
|
required=True,
|
||||||
|
help="URI to the view containing the samples definition (with tags, primers, sample names,...).\n"
|
||||||
|
"\nWarning: primer lengths must be less than or equal to 32")
|
||||||
|
|
||||||
group.add_argument('-R', '--reverse-reads',
|
group.add_argument('-R', '--reverse-reads',
|
||||||
action="store", dest="ngsfilter:reverse",
|
action="store", dest="ngsfilter:reverse",
|
||||||
@ -172,6 +174,13 @@ cdef read_info_view(info_view, max_errors=2, verbose=False, not_aligned=False):
|
|||||||
primer_list = []
|
primer_list = []
|
||||||
i=0
|
i=0
|
||||||
for p in info_view:
|
for p in info_view:
|
||||||
|
|
||||||
|
# Check primer length: should not be longer than 32, the max allowed by the apat lib
|
||||||
|
if len(p[b'forward_primer']) > 32:
|
||||||
|
raise RollbackException("Error: primers can not be longer than 32bp, rollbacking views")
|
||||||
|
if len(p[b'reverse_primer']) > 32:
|
||||||
|
raise RollbackException("Error: primers can not be longer than 32bp, rollbacking views")
|
||||||
|
|
||||||
forward=Primer(p[b'forward_primer'],
|
forward=Primer(p[b'forward_primer'],
|
||||||
len(p[b'forward_tag']) if (b'forward_tag' in p and p[b'forward_tag']!=None) else None,
|
len(p[b'forward_tag']) if (b'forward_tag' in p and p[b'forward_tag']!=None) else None,
|
||||||
True,
|
True,
|
||||||
@ -594,7 +603,13 @@ def run(config):
|
|||||||
pb = ProgressBar(entries_len, config, seconde=5)
|
pb = ProgressBar(entries_len, config, seconde=5)
|
||||||
|
|
||||||
# Check and store primers and tags
|
# Check and store primers and tags
|
||||||
infos, primer_list = read_info_view(info_view, max_errors=config['ngsfilter']['error'], verbose=False, not_aligned=not_aligned) # TODO obi verbose option
|
try:
|
||||||
|
infos, primer_list = read_info_view(info_view, max_errors=config['ngsfilter']['error'], verbose=False, not_aligned=not_aligned) # TODO obi verbose option
|
||||||
|
except RollbackException, e:
|
||||||
|
if unidentified is not None:
|
||||||
|
raise RollbackException("obi ngsfilter error, rollbacking views: "+str(e), o_view, unidentified)
|
||||||
|
else:
|
||||||
|
raise RollbackException("obi ngsfilter error, rollbacking view: "+str(e), o_view)
|
||||||
|
|
||||||
aligner = Primer_search(primer_list, config['ngsfilter']['error'])
|
aligner = Primer_search(primer_list, config['ngsfilter']['error'])
|
||||||
|
|
||||||
@ -652,11 +667,11 @@ def run(config):
|
|||||||
#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()
|
input[0].close(force=True)
|
||||||
output[0].close()
|
output[0].close(force=True)
|
||||||
info_input[0].close()
|
info_input[0].close(force=True)
|
||||||
if unidentified is not None:
|
if unidentified is not None:
|
||||||
unidentified_input[0].close()
|
unidentified_input[0].close(force=True)
|
||||||
aligner.free()
|
aligner.free()
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -141,7 +141,7 @@ def run(config):
|
|||||||
# 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, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -251,7 +251,7 @@ def run(config):
|
|||||||
for i in range(len(sorted_stats)):
|
for i in range(len(sorted_stats)):
|
||||||
c = sorted_stats[i][0]
|
c = sorted_stats[i][0]
|
||||||
for v in c:
|
for v in c:
|
||||||
if v is not None:
|
if type(v) == bytes:
|
||||||
print(pcat % tostr(v)+"\t", end="")
|
print(pcat % tostr(v)+"\t", end="")
|
||||||
else:
|
else:
|
||||||
print(pcat % str(v)+"\t", end="")
|
print(pcat % str(v)+"\t", end="")
|
||||||
@ -268,6 +268,6 @@ def run(config):
|
|||||||
print("%7d" %catcount[c], end="")
|
print("%7d" %catcount[c], end="")
|
||||||
print("%9d" %totcount[c])
|
print("%9d" %totcount[c])
|
||||||
|
|
||||||
input[0].close()
|
input[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -106,7 +106,7 @@ def run(config):
|
|||||||
# 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, delete the temporary imported view used to create the final view
|
||||||
if i_dms != o_dms:
|
if i_dms != o_dms:
|
||||||
View.delete_view(i_dms, o_view_name)
|
View.delete_view(i_dms, o_view_name)
|
||||||
o_dms.close()
|
o_dms.close(force=True)
|
||||||
i_dms.close()
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
@ -529,7 +529,7 @@ def run(config):
|
|||||||
test_taxo(config, infos)
|
test_taxo(config, infos)
|
||||||
|
|
||||||
infos['view'].close()
|
infos['view'].close()
|
||||||
infos['dms'].close()
|
infos['dms'].close(force=True)
|
||||||
shutil.rmtree(config['obi']['defaultdms']+'.obidms', ignore_errors=True)
|
shutil.rmtree(config['obi']['defaultdms']+'.obidms', ignore_errors=True)
|
||||||
|
|
||||||
print("Done.")
|
print("Done.")
|
||||||
|
@ -5,5 +5,5 @@ from obitools3.dms.taxo.taxo cimport Taxonomy
|
|||||||
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
|
||||||
|
|
||||||
|
|
||||||
cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy)
|
cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy, dict config)
|
||||||
cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, list mergedKeys_list=*, Taxonomy taxonomy=*, bint mergeIds=*, list categories=*, int max_elts=*)
|
cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, dict config, list mergedKeys_list=*, Taxonomy taxonomy=*, bint mergeIds=*, list categories=*, int max_elts=*)
|
||||||
|
@ -56,7 +56,7 @@ def addOptions(parser):
|
|||||||
"(option can be used several times).")
|
"(option can be used several times).")
|
||||||
|
|
||||||
|
|
||||||
cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy, dict config) :
|
||||||
|
|
||||||
cdef int taxid
|
cdef int taxid
|
||||||
cdef Nuc_Seq_Stored seq
|
cdef Nuc_Seq_Stored seq
|
||||||
@ -69,7 +69,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
cdef object gn_sn
|
cdef object gn_sn
|
||||||
cdef object fa_sn
|
cdef object fa_sn
|
||||||
|
|
||||||
# Create columns
|
# Create columns and save them for efficiency
|
||||||
if b"species" in o_view and o_view[b"species"].data_type_int != OBI_INT :
|
if b"species" in o_view and o_view[b"species"].data_type_int != OBI_INT :
|
||||||
o_view.delete_column(b"species")
|
o_view.delete_column(b"species")
|
||||||
if b"species" not in o_view:
|
if b"species" not in o_view:
|
||||||
@ -77,6 +77,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"species",
|
b"species",
|
||||||
OBI_INT
|
OBI_INT
|
||||||
)
|
)
|
||||||
|
species_column = o_view[b"species"]
|
||||||
|
|
||||||
if b"genus" in o_view and o_view[b"genus"].data_type_int != OBI_INT :
|
if b"genus" in o_view and o_view[b"genus"].data_type_int != OBI_INT :
|
||||||
o_view.delete_column(b"genus")
|
o_view.delete_column(b"genus")
|
||||||
@ -85,6 +86,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"genus",
|
b"genus",
|
||||||
OBI_INT
|
OBI_INT
|
||||||
)
|
)
|
||||||
|
genus_column = o_view[b"genus"]
|
||||||
|
|
||||||
if b"family" in o_view and o_view[b"family"].data_type_int != OBI_INT :
|
if b"family" in o_view and o_view[b"family"].data_type_int != OBI_INT :
|
||||||
o_view.delete_column(b"family")
|
o_view.delete_column(b"family")
|
||||||
@ -93,6 +95,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"family",
|
b"family",
|
||||||
OBI_INT
|
OBI_INT
|
||||||
)
|
)
|
||||||
|
family_column = o_view[b"family"]
|
||||||
|
|
||||||
if b"species_name" in o_view and o_view[b"species_name"].data_type_int != OBI_STR :
|
if b"species_name" in o_view and o_view[b"species_name"].data_type_int != OBI_STR :
|
||||||
o_view.delete_column(b"species_name")
|
o_view.delete_column(b"species_name")
|
||||||
@ -101,6 +104,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"species_name",
|
b"species_name",
|
||||||
OBI_STR
|
OBI_STR
|
||||||
)
|
)
|
||||||
|
species_name_column = o_view[b"species_name"]
|
||||||
|
|
||||||
if b"genus_name" in o_view and o_view[b"genus_name"].data_type_int != OBI_STR :
|
if b"genus_name" in o_view and o_view[b"genus_name"].data_type_int != OBI_STR :
|
||||||
o_view.delete_column(b"genus_name")
|
o_view.delete_column(b"genus_name")
|
||||||
@ -109,6 +113,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"genus_name",
|
b"genus_name",
|
||||||
OBI_STR
|
OBI_STR
|
||||||
)
|
)
|
||||||
|
genus_name_column = o_view[b"genus_name"]
|
||||||
|
|
||||||
if b"family_name" in o_view and o_view[b"family_name"].data_type_int != OBI_STR :
|
if b"family_name" in o_view and o_view[b"family_name"].data_type_int != OBI_STR :
|
||||||
o_view.delete_column(b"family_name")
|
o_view.delete_column(b"family_name")
|
||||||
@ -117,6 +122,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"family_name",
|
b"family_name",
|
||||||
OBI_STR
|
OBI_STR
|
||||||
)
|
)
|
||||||
|
family_name_column = o_view[b"family_name"]
|
||||||
|
|
||||||
if b"rank" in o_view and o_view[b"rank"].data_type_int != OBI_STR :
|
if b"rank" in o_view and o_view[b"rank"].data_type_int != OBI_STR :
|
||||||
o_view.delete_column(b"rank")
|
o_view.delete_column(b"rank")
|
||||||
@ -125,6 +131,7 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"rank",
|
b"rank",
|
||||||
OBI_STR
|
OBI_STR
|
||||||
)
|
)
|
||||||
|
rank_column = o_view[b"rank"]
|
||||||
|
|
||||||
if b"scientific_name" in o_view and o_view[b"scientific_name"].data_type_int != OBI_STR :
|
if b"scientific_name" in o_view and o_view[b"scientific_name"].data_type_int != OBI_STR :
|
||||||
o_view.delete_column(b"scientific_name")
|
o_view.delete_column(b"scientific_name")
|
||||||
@ -133,9 +140,15 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
b"scientific_name",
|
b"scientific_name",
|
||||||
OBI_STR
|
OBI_STR
|
||||||
)
|
)
|
||||||
|
scientific_name_column = o_view[b"scientific_name"]
|
||||||
for seq in o_view:
|
|
||||||
PyErr_CheckSignals()
|
# Initialize the progress bar
|
||||||
|
pb = ProgressBar(len(o_view), config, seconde=5)
|
||||||
|
|
||||||
|
i=0
|
||||||
|
for seq in o_view:
|
||||||
|
PyErr_CheckSignals()
|
||||||
|
pb(i)
|
||||||
if MERGED_TAXID_COLUMN in seq :
|
if MERGED_TAXID_COLUMN in seq :
|
||||||
m_taxids = []
|
m_taxids = []
|
||||||
m_taxids_dict = seq[MERGED_TAXID_COLUMN]
|
m_taxids_dict = seq[MERGED_TAXID_COLUMN]
|
||||||
@ -165,20 +178,23 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
else:
|
else:
|
||||||
fa_sn = None
|
fa_sn = None
|
||||||
tfa = None
|
tfa = None
|
||||||
|
|
||||||
seq[b"species"] = tsp
|
|
||||||
seq[b"genus"] = tgn
|
|
||||||
seq[b"family"] = tfa
|
|
||||||
|
|
||||||
seq[b"species_name"] = sp_sn
|
|
||||||
seq[b"genus_name"] = gn_sn
|
|
||||||
seq[b"family_name"] = fa_sn
|
|
||||||
|
|
||||||
seq[b"rank"] = taxonomy.get_rank(taxid)
|
species_column[i] = tsp
|
||||||
seq[b"scientific_name"] = taxonomy.get_scientific_name(taxid)
|
genus_column[i] = tgn
|
||||||
|
family_column[i] = tfa
|
||||||
|
|
||||||
|
species_name_column[i] = sp_sn
|
||||||
|
genus_name_column[i] = gn_sn
|
||||||
|
family_name_column[i] = fa_sn
|
||||||
|
|
||||||
|
rank_column[i] = taxonomy.get_rank(taxid)
|
||||||
|
scientific_name_column[i] = taxonomy.get_scientific_name(taxid)
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
pb(len(o_view), force=True)
|
||||||
|
|
||||||
|
|
||||||
|
cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, dict config, list mergedKeys_list=None, Taxonomy taxonomy=None, bint mergeIds=False, list categories=None, int max_elts=1000000) :
|
||||||
cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, list mergedKeys_list=None, Taxonomy taxonomy=None, bint mergeIds=False, list categories=None, int max_elts=1000000) :
|
|
||||||
|
|
||||||
cdef int i
|
cdef int i
|
||||||
cdef int k
|
cdef int k
|
||||||
@ -187,6 +203,7 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
cdef int u_idx
|
cdef int u_idx
|
||||||
cdef int i_idx
|
cdef int i_idx
|
||||||
cdef int i_count
|
cdef int i_count
|
||||||
|
cdef int o_count
|
||||||
cdef str key_str
|
cdef str key_str
|
||||||
cdef bytes key
|
cdef bytes key
|
||||||
cdef bytes mkey
|
cdef bytes mkey
|
||||||
@ -209,7 +226,6 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
cdef Nuc_Seq_Stored i_seq
|
cdef Nuc_Seq_Stored i_seq
|
||||||
cdef Nuc_Seq_Stored o_seq
|
cdef Nuc_Seq_Stored o_seq
|
||||||
cdef Nuc_Seq_Stored u_seq
|
cdef Nuc_Seq_Stored u_seq
|
||||||
cdef Column i_col
|
|
||||||
cdef Column i_seq_col
|
cdef Column i_seq_col
|
||||||
cdef Column i_id_col
|
cdef Column i_id_col
|
||||||
cdef Column i_taxid_col
|
cdef Column i_taxid_col
|
||||||
@ -217,6 +233,8 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
cdef Column o_id_col
|
cdef Column o_id_col
|
||||||
cdef Column o_taxid_dist_col
|
cdef Column o_taxid_dist_col
|
||||||
cdef Column o_merged_col
|
cdef Column o_merged_col
|
||||||
|
cdef Column o_count_col
|
||||||
|
cdef Column i_count_col
|
||||||
cdef Column_line i_mcol
|
cdef Column_line i_mcol
|
||||||
cdef object taxid_dist_dict
|
cdef object taxid_dist_dict
|
||||||
cdef object iter_view
|
cdef object iter_view
|
||||||
@ -252,7 +270,12 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
mergedKeys_m = []
|
mergedKeys_m = []
|
||||||
for k in range(k_count):
|
for k in range(k_count):
|
||||||
mergedKeys_m.append(MERGED_PREFIX + mergedKeys[k])
|
mergedKeys_m.append(MERGED_PREFIX + mergedKeys[k])
|
||||||
|
|
||||||
|
# Check that not trying to remerge without total count information
|
||||||
|
for key in mergedKeys_m:
|
||||||
|
if key in view and COUNT_COLUMN not in view:
|
||||||
|
raise Exception("\n>>>>\nError: trying to re-merge tags without total count tag. Run obi annotate to add the count tag from the relevant merged tag, i.e.: \nobi annotate --set-tag COUNT:'sum([value for key,value in sequence['MERGED_sample'].items()])' dms/input dms/output\n")
|
||||||
|
|
||||||
if categories is None:
|
if categories is None:
|
||||||
categories = []
|
categories = []
|
||||||
|
|
||||||
@ -320,7 +343,11 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
for k in range(k_count):
|
for k in range(k_count):
|
||||||
key = mergedKeys[k]
|
key = mergedKeys[k]
|
||||||
merged_col_name = mergedKeys_m[k]
|
merged_col_name = mergedKeys_m[k]
|
||||||
i_col = view[key]
|
|
||||||
|
if merged_col_name in view:
|
||||||
|
i_col = view[merged_col_name]
|
||||||
|
else:
|
||||||
|
i_col = view[key]
|
||||||
|
|
||||||
if merged_infos[merged_col_name]['nb_elts'] > max_elts:
|
if merged_infos[merged_col_name]['nb_elts'] > max_elts:
|
||||||
str_merged_cols.append(merged_col_name)
|
str_merged_cols.append(merged_col_name)
|
||||||
@ -374,12 +401,19 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
alias=MERGED_COLUMN
|
alias=MERGED_COLUMN
|
||||||
)
|
)
|
||||||
|
|
||||||
# Keep columns that are going to be used a lot in variables
|
# Keep columns in variables for efficiency
|
||||||
o_id_col = o_view[ID_COLUMN]
|
o_id_col = o_view[ID_COLUMN]
|
||||||
if TAXID_DIST_COLUMN in o_view:
|
if TAXID_DIST_COLUMN in o_view:
|
||||||
o_taxid_dist_col = o_view[TAXID_DIST_COLUMN]
|
o_taxid_dist_col = o_view[TAXID_DIST_COLUMN]
|
||||||
if MERGED_COLUMN in o_view:
|
if MERGED_COLUMN in o_view:
|
||||||
o_merged_col = o_view[MERGED_COLUMN]
|
o_merged_col = o_view[MERGED_COLUMN]
|
||||||
|
if COUNT_COLUMN not in o_view:
|
||||||
|
Column.new_column(o_view,
|
||||||
|
COUNT_COLUMN,
|
||||||
|
OBI_INT)
|
||||||
|
o_count_col = o_view[COUNT_COLUMN]
|
||||||
|
if COUNT_COLUMN in view:
|
||||||
|
i_count_col = view[COUNT_COLUMN]
|
||||||
|
|
||||||
pb(len(view), force=True)
|
pb(len(view), force=True)
|
||||||
print("")
|
print("")
|
||||||
@ -407,7 +441,7 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
merged_list = list(set(merged_list)) # deduplicate the list
|
merged_list = list(set(merged_list)) # deduplicate the list
|
||||||
o_merged_col[o_idx] = merged_list
|
o_merged_col[o_idx] = merged_list
|
||||||
|
|
||||||
o_seq[COUNT_COLUMN] = 0
|
o_count = 0
|
||||||
|
|
||||||
if TAXID_DIST_COLUMN in u_seq and i_taxid_dist_col[u_idx] is not None:
|
if TAXID_DIST_COLUMN in u_seq and i_taxid_dist_col[u_idx] is not None:
|
||||||
taxid_dist_dict = i_taxid_dist_col[u_idx]
|
taxid_dist_dict = i_taxid_dist_col[u_idx]
|
||||||
@ -423,12 +457,12 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
i_id = i_id_col[i_idx]
|
i_id = i_id_col[i_idx]
|
||||||
i_seq = view[i_idx]
|
i_seq = view[i_idx]
|
||||||
|
|
||||||
if COUNT_COLUMN not in i_seq or i_seq[COUNT_COLUMN] is None:
|
if COUNT_COLUMN not in i_seq or i_count_col[i_idx] is None:
|
||||||
i_count = 1
|
i_count = 1
|
||||||
else:
|
else:
|
||||||
i_count = i_seq[COUNT_COLUMN]
|
i_count = i_count_col[i_idx]
|
||||||
|
|
||||||
o_seq[COUNT_COLUMN] += i_count
|
o_count += i_count
|
||||||
|
|
||||||
for k in range(k_count):
|
for k in range(k_count):
|
||||||
|
|
||||||
@ -463,44 +497,52 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
mcol[key2] = i_mcol[key2]
|
mcol[key2] = i_mcol[key2]
|
||||||
else:
|
else:
|
||||||
mcol[key2] = mcol[key2] + i_mcol[key2]
|
mcol[key2] = mcol[key2] + i_mcol[key2]
|
||||||
|
|
||||||
# Write taxid_dist
|
|
||||||
if mergeIds and TAXID_COLUMN in mergedKeys:
|
|
||||||
if TAXID_DIST_COLUMN in str_merged_cols:
|
|
||||||
o_taxid_dist_col[o_idx] = str(taxid_dist_dict)
|
|
||||||
else:
|
|
||||||
o_taxid_dist_col[o_idx] = taxid_dist_dict
|
|
||||||
|
|
||||||
# Write merged dicts
|
|
||||||
for mkey in merged_dict:
|
|
||||||
if mkey in str_merged_cols:
|
|
||||||
mkey_cols[mkey][o_idx] = str(merged_dict[mkey])
|
|
||||||
else:
|
|
||||||
mkey_cols[mkey][o_idx] = merged_dict[mkey]
|
|
||||||
# Sets NA values to 0 # TODO discuss, for now keep as None and test for None instead of testing for 0 in tools
|
|
||||||
#for key in mkey_cols[mkey][o_idx]:
|
|
||||||
# if mkey_cols[mkey][o_idx][key] is None:
|
|
||||||
# mkey_cols[mkey][o_idx][key] = 0
|
|
||||||
|
|
||||||
for key in i_seq.keys():
|
for key in i_seq.keys():
|
||||||
# Delete informations that differ between the merged sequences
|
# Delete informations that differ between the merged sequences
|
||||||
# TODO make special columns list?
|
# TODO make special columns list? // could be more efficient
|
||||||
if key != COUNT_COLUMN and key != ID_COLUMN and key != NUC_SEQUENCE_COLUMN and key in o_seq and o_seq[key] != i_seq[key] \
|
if key != COUNT_COLUMN and key != ID_COLUMN and key != NUC_SEQUENCE_COLUMN and key in o_seq and o_seq[key] != i_seq[key] \
|
||||||
and key not in merged_dict :
|
and key not in merged_dict :
|
||||||
o_seq[key] = None
|
o_seq[key] = None
|
||||||
|
|
||||||
|
# Write merged dicts
|
||||||
|
for mkey in merged_dict:
|
||||||
|
if mkey in str_merged_cols:
|
||||||
|
mkey_cols[mkey][o_idx] = str(merged_dict[mkey])
|
||||||
|
else:
|
||||||
|
mkey_cols[mkey][o_idx] = merged_dict[mkey]
|
||||||
|
# Sets NA values to 0 # TODO discuss, for now keep as None and test for None instead of testing for 0 in tools
|
||||||
|
#for key in mkey_cols[mkey][o_idx]:
|
||||||
|
# if mkey_cols[mkey][o_idx][key] is None:
|
||||||
|
# mkey_cols[mkey][o_idx][key] = 0
|
||||||
|
|
||||||
|
# Write taxid_dist
|
||||||
|
if mergeIds and TAXID_COLUMN in mergedKeys:
|
||||||
|
if TAXID_DIST_COLUMN in str_merged_cols:
|
||||||
|
o_taxid_dist_col[o_idx] = str(taxid_dist_dict)
|
||||||
|
else:
|
||||||
|
o_taxid_dist_col[o_idx] = taxid_dist_dict
|
||||||
|
|
||||||
|
o_count_col[o_idx] = o_count
|
||||||
o_idx += 1
|
o_idx += 1
|
||||||
|
|
||||||
|
pb(len(uniques), 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)
|
||||||
if QUALITY_COLUMN in view:
|
if QUALITY_COLUMN in view:
|
||||||
o_view.delete_column(QUALITY_COLUMN)
|
o_view.delete_column(QUALITY_COLUMN)
|
||||||
if REVERSE_QUALITY_COLUMN in view:
|
if REVERSE_QUALITY_COLUMN in view:
|
||||||
o_view.delete_column(REVERSE_QUALITY_COLUMN)
|
o_view.delete_column(REVERSE_QUALITY_COLUMN)
|
||||||
|
|
||||||
|
# Delete old columns that are now merged
|
||||||
|
for k in range(k_count):
|
||||||
|
if mergedKeys[k] in o_view:
|
||||||
|
o_view.delete_column(mergedKeys[k])
|
||||||
|
|
||||||
if taxonomy is not None:
|
if taxonomy is not None:
|
||||||
print("") # TODO because in the middle of progress bar. Better solution?
|
print("") # TODO because in the middle of progress bar. Better solution?
|
||||||
logger("info", "Merging taxonomy classification")
|
logger("info", "Merging taxonomy classification")
|
||||||
merge_taxonomy_classification(o_view, taxonomy)
|
merge_taxonomy_classification(o_view, taxonomy, config)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -547,11 +589,10 @@ def run(config):
|
|||||||
pb = ProgressBar(len(entries), config, seconde=5)
|
pb = ProgressBar(len(entries), config, seconde=5)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
uniq_sequences(entries, o_view, pb, mergedKeys_list=config['uniq']['merge'], taxonomy=taxo, mergeIds=config['uniq']['mergeids'], categories=config['uniq']['categories'], max_elts=config['obi']['maxelts'])
|
uniq_sequences(entries, o_view, pb, config, mergedKeys_list=config['uniq']['merge'], taxonomy=taxo, mergeIds=config['uniq']['mergeids'], categories=config['uniq']['categories'], max_elts=config['obi']['maxelts'])
|
||||||
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)
|
||||||
|
|
||||||
pb(len(entries), force=True)
|
|
||||||
print("", file=sys.stderr)
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
# Save command config in View and DMS comments
|
# Save command config in View and DMS comments
|
||||||
@ -567,8 +608,8 @@ def run(config):
|
|||||||
#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()
|
input[0].close(force=True)
|
||||||
output[0].close()
|
output[0].close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
||||||
|
@ -63,6 +63,8 @@ cdef extern from "obidmscolumn.h" nogil:
|
|||||||
|
|
||||||
char* obi_get_elements_names(OBIDMS_column_p column)
|
char* obi_get_elements_names(OBIDMS_column_p column)
|
||||||
|
|
||||||
|
char* obi_column_formatted_infos(OBIDMS_column_p column)
|
||||||
|
|
||||||
index_t obi_column_get_element_index_from_name(OBIDMS_column_p column, const char* element_name)
|
index_t obi_column_get_element_index_from_name(OBIDMS_column_p column, const char* element_name)
|
||||||
|
|
||||||
int obi_column_write_comments(OBIDMS_column_p column, const char* comments)
|
int obi_column_write_comments(OBIDMS_column_p column, const char* comments)
|
||||||
|
@ -102,7 +102,7 @@ cdef extern from "obiview.h" nogil:
|
|||||||
const_char_p comments,
|
const_char_p comments,
|
||||||
bint create)
|
bint create)
|
||||||
|
|
||||||
int obi_view_delete_column(Obiview_p view, const_char_p column_name)
|
int obi_view_delete_column(Obiview_p view, const_char_p column_name, bint delete_file)
|
||||||
|
|
||||||
OBIDMS_column_p obi_view_get_column(Obiview_p view, const_char_p column_name)
|
OBIDMS_column_p obi_view_get_column(Obiview_p view, const_char_p column_name)
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ from ..capi.obidms cimport obi_import_column
|
|||||||
from ..capi.obidmscolumn cimport OBIDMS_column_header_p, \
|
from ..capi.obidmscolumn cimport OBIDMS_column_header_p, \
|
||||||
obi_close_column, \
|
obi_close_column, \
|
||||||
obi_get_elements_names, \
|
obi_get_elements_names, \
|
||||||
|
obi_column_formatted_infos, \
|
||||||
obi_column_write_comments
|
obi_column_write_comments
|
||||||
|
|
||||||
from ..capi.obiutils cimport obi_format_date
|
from ..capi.obiutils cimport obi_format_date
|
||||||
@ -38,7 +39,7 @@ from obitools3.utils cimport tobytes, \
|
|||||||
|
|
||||||
from obitools3.dms.column import typed_column
|
from obitools3.dms.column import typed_column
|
||||||
|
|
||||||
from libc.stdlib cimport free
|
from libc.stdlib cimport free
|
||||||
|
|
||||||
import importlib
|
import importlib
|
||||||
import inspect
|
import inspect
|
||||||
@ -288,9 +289,15 @@ cdef class Column(OBIWrapper) :
|
|||||||
@OBIWrapper.checkIsActive
|
@OBIWrapper.checkIsActive
|
||||||
def __repr__(self) :
|
def __repr__(self) :
|
||||||
cdef bytes s
|
cdef bytes s
|
||||||
|
#cdef char* s_b
|
||||||
|
#cdef str s_str
|
||||||
|
#s_b = obi_column_formatted_infos(self.pointer())
|
||||||
|
#s_str = bytes2str(s_b)
|
||||||
|
#free(s_b)
|
||||||
s = self._alias + b", data type: " + self.data_type
|
s = self._alias + b", data type: " + self.data_type
|
||||||
|
#return s_str
|
||||||
return bytes2str(s)
|
return bytes2str(s)
|
||||||
|
|
||||||
|
|
||||||
def close(self): # TODO discuss, can't be called bc then bug when closing view that tries to close it in C
|
def close(self): # TODO discuss, can't be called bc then bug when closing view that tries to close it in C
|
||||||
|
|
||||||
|
@ -94,16 +94,16 @@ cdef class DMS(OBIWrapper):
|
|||||||
return dms
|
return dms
|
||||||
|
|
||||||
|
|
||||||
def close(self) :
|
def close(self, force=False) :
|
||||||
'''
|
'''
|
||||||
Closes the DMS instance and free the associated memory
|
Closes the DMS instance and free the associated memory (no counter, closing is final)
|
||||||
|
|
||||||
The `close` method is automatically called by the object destructor.
|
The `close` method is automatically called by the object destructor.
|
||||||
'''
|
'''
|
||||||
cdef OBIDMS_p pointer = self.pointer()
|
cdef OBIDMS_p pointer = self.pointer()
|
||||||
if self.active() :
|
if self.active() :
|
||||||
OBIWrapper.close(self)
|
OBIWrapper.close(self)
|
||||||
if (obi_close_dms(pointer, False)) < 0 :
|
if (obi_close_dms(pointer, force=force)) < 0 :
|
||||||
raise Exception("Problem closing an OBIDMS")
|
raise Exception("Problem closing an OBIDMS")
|
||||||
|
|
||||||
|
|
||||||
@ -254,7 +254,8 @@ cdef class DMS(OBIWrapper):
|
|||||||
# bash command history property getter
|
# bash command history property getter
|
||||||
@property
|
@property
|
||||||
def bash_history(self):
|
def bash_history(self):
|
||||||
s = b"#!/bin/bash\n\n"
|
#s = b"#!${bash}/bin/bash\n\n"
|
||||||
|
s = b""
|
||||||
first = True
|
first = True
|
||||||
for command in self.command_line_history:
|
for command in self.command_line_history:
|
||||||
s+=b"#"
|
s+=b"#"
|
||||||
|
@ -22,7 +22,8 @@ cdef class View(OBIWrapper):
|
|||||||
cdef inline Obiview_p pointer(self)
|
cdef inline Obiview_p pointer(self)
|
||||||
|
|
||||||
cpdef delete_column(self,
|
cpdef delete_column(self,
|
||||||
object column_name)
|
object column_name,
|
||||||
|
bint delete_file=*)
|
||||||
|
|
||||||
cpdef rename_column(self,
|
cpdef rename_column(self,
|
||||||
object current_name,
|
object current_name,
|
||||||
|
@ -227,7 +227,8 @@ cdef class View(OBIWrapper) :
|
|||||||
|
|
||||||
|
|
||||||
cpdef delete_column(self,
|
cpdef delete_column(self,
|
||||||
object column_name) :
|
object column_name,
|
||||||
|
bint delete_file=False) :
|
||||||
|
|
||||||
cdef bytes column_name_b = tobytes(column_name)
|
cdef bytes column_name_b = tobytes(column_name)
|
||||||
|
|
||||||
@ -239,7 +240,7 @@ cdef class View(OBIWrapper) :
|
|||||||
col.close()
|
col.close()
|
||||||
|
|
||||||
# Remove the column from the view which closes the C structure
|
# Remove the column from the view which closes the C structure
|
||||||
if obi_view_delete_column(self.pointer(), column_name_b) < 0 :
|
if obi_view_delete_column(self.pointer(), column_name_b, delete_file) < 0 :
|
||||||
raise RollbackException("Problem deleting column %s from a view",
|
raise RollbackException("Problem deleting column %s from a view",
|
||||||
bytes2str(column_name_b), self)
|
bytes2str(column_name_b), self)
|
||||||
|
|
||||||
@ -307,7 +308,7 @@ cdef class View(OBIWrapper) :
|
|||||||
new_column[i] = old_column[i]
|
new_column[i] = old_column[i]
|
||||||
|
|
||||||
# Remove old column from view
|
# Remove old column from view
|
||||||
self.delete_column(column_name_b)
|
self.delete_column(column_name_b, delete_file=True)
|
||||||
|
|
||||||
# Rename new
|
# Rename new
|
||||||
new_column.name = column_name_b
|
new_column.name = column_name_b
|
||||||
@ -525,13 +526,13 @@ cdef class View(OBIWrapper) :
|
|||||||
# bash command history property getter
|
# bash command history property getter
|
||||||
@property
|
@property
|
||||||
def bash_history(self):
|
def bash_history(self):
|
||||||
s = b"#!/bin/bash\n\n"
|
s = b""
|
||||||
first = True
|
first = True
|
||||||
for level in self.view_history:
|
for level in self.view_history:
|
||||||
command_list = [level[input][b"command_line"] for input in level.keys()]
|
command_list = [level[input][b"command_line"] for input in level.keys()]
|
||||||
for command in command_list:
|
for command in command_list:
|
||||||
|
s+=b"obi "
|
||||||
s+=command
|
s+=command
|
||||||
s+=b"\n"
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
@ -156,6 +156,9 @@ def emblIterator_file(lineiterator,
|
|||||||
yield seq
|
yield seq
|
||||||
read+=1
|
read+=1
|
||||||
|
|
||||||
|
# Last sequence
|
||||||
|
seq = emblParser(entry)
|
||||||
|
|
||||||
yield seq
|
yield seq
|
||||||
|
|
||||||
free(entry)
|
free(entry)
|
||||||
@ -174,7 +177,7 @@ def emblIterator_dir(dir_path,
|
|||||||
for filename in files:
|
for filename in files:
|
||||||
if read==only:
|
if read==only:
|
||||||
return
|
return
|
||||||
print("Parsing file %s (%d/%d)" % (tostr(filename), read_files, len(files)))
|
print("Parsing file %s (%d/%d)" % (tostr(filename), read_files+1, len(files)))
|
||||||
f = uopen(filename)
|
f = uopen(filename)
|
||||||
if only is not None:
|
if only is not None:
|
||||||
only_f = only-read
|
only_f = only-read
|
||||||
|
@ -104,6 +104,7 @@ def fastaNucIterator(lineiterator,
|
|||||||
cdef bytes sequence
|
cdef bytes sequence
|
||||||
cdef int skipped, ionly, read
|
cdef int skipped, ionly, read
|
||||||
cdef Nuc_Seq seq
|
cdef Nuc_Seq seq
|
||||||
|
cdef bint stop
|
||||||
|
|
||||||
if only is None:
|
if only is None:
|
||||||
ionly = -1
|
ionly = -1
|
||||||
@ -130,7 +131,8 @@ def fastaNucIterator(lineiterator,
|
|||||||
else:
|
else:
|
||||||
line = firstline
|
line = firstline
|
||||||
|
|
||||||
while True:
|
stop=False
|
||||||
|
while not stop:
|
||||||
|
|
||||||
if ionly >= 0 and read >= ionly:
|
if ionly >= 0 and read >= ionly:
|
||||||
break
|
break
|
||||||
@ -153,7 +155,7 @@ def fastaNucIterator(lineiterator,
|
|||||||
s.append(line[0:-1])
|
s.append(line[0:-1])
|
||||||
line = next(iterator)
|
line = next(iterator)
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
pass
|
stop=True
|
||||||
|
|
||||||
sequence = b"".join(s)
|
sequence = b"".join(s)
|
||||||
|
|
||||||
|
@ -25,8 +25,9 @@ from libc.string cimport strcpy, strlen
|
|||||||
_featureMatcher = re.compile(b'^FEATURES.+\n(?=ORIGIN)',re.DOTALL + re.M)
|
_featureMatcher = re.compile(b'^FEATURES.+\n(?=ORIGIN)',re.DOTALL + re.M)
|
||||||
|
|
||||||
_headerMatcher = re.compile(b'^LOCUS.+(?=\nFEATURES)', re.DOTALL + re.M)
|
_headerMatcher = re.compile(b'^LOCUS.+(?=\nFEATURES)', re.DOTALL + re.M)
|
||||||
_seqMatcher = re.compile(b'(?<=ORIGIN).+(?=//\n)', re.DOTALL + re.M)
|
_seqMatcher = re.compile(b'ORIGIN.+(?=//\n)', re.DOTALL + re.M)
|
||||||
_cleanSeq = re.compile(b'[ \n0-9]+')
|
_cleanSeq1 = re.compile(b'ORIGIN.+\n')
|
||||||
|
_cleanSeq2 = re.compile(b'[ \n0-9]+')
|
||||||
_acMatcher = re.compile(b'(?<=^ACCESSION ).+',re.M)
|
_acMatcher = re.compile(b'(?<=^ACCESSION ).+',re.M)
|
||||||
_deMatcher = re.compile(b'(?<=^DEFINITION ).+\n( .+\n)*',re.M)
|
_deMatcher = re.compile(b'(?<=^DEFINITION ).+\n( .+\n)*',re.M)
|
||||||
_cleanDe = re.compile(b'\n *')
|
_cleanDe = re.compile(b'\n *')
|
||||||
@ -42,7 +43,8 @@ def genbankParser(bytes text):
|
|||||||
ft = _featureMatcher.search(text).group()
|
ft = _featureMatcher.search(text).group()
|
||||||
|
|
||||||
s = _seqMatcher.search(text).group()
|
s = _seqMatcher.search(text).group()
|
||||||
s = _cleanSeq.sub(b'', s).upper()
|
s = _cleanSeq1.sub(b'', s)
|
||||||
|
s = _cleanSeq2.sub(b'', s)
|
||||||
|
|
||||||
acs = _acMatcher.search(text).group()
|
acs = _acMatcher.search(text).group()
|
||||||
acs = acs.split()
|
acs = acs.split()
|
||||||
@ -51,23 +53,23 @@ def genbankParser(bytes text):
|
|||||||
|
|
||||||
de = _deMatcher.search(header).group()
|
de = _deMatcher.search(header).group()
|
||||||
de = _cleanDe.sub(b' ',de).strip().strip(b'.')
|
de = _cleanDe.sub(b' ',de).strip().strip(b'.')
|
||||||
|
|
||||||
|
tags = {}
|
||||||
|
extractTaxon(ft, tags)
|
||||||
|
|
||||||
|
seq = Nuc_Seq(ac,
|
||||||
|
s,
|
||||||
|
definition=de,
|
||||||
|
quality=None,
|
||||||
|
offset=-1,
|
||||||
|
tags=tags)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("\nCould not import sequence id:", text.split()[1], "(error raised:", e, ")")
|
print("\nCould not import sequence id:", text.split()[1], "(error raised:", e, ")")
|
||||||
# Do not raise any Exception if you need the possibility to resume the generator
|
# Do not raise any Exception if you need the possibility to resume the generator
|
||||||
# (Python generators can't resume after any exception is raised)
|
# (Python generators can't resume after any exception is raised)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
tags = {}
|
|
||||||
extractTaxon(ft, tags)
|
|
||||||
|
|
||||||
seq = Nuc_Seq(ac,
|
|
||||||
s,
|
|
||||||
definition=de,
|
|
||||||
quality=None,
|
|
||||||
offset=-1,
|
|
||||||
tags=tags)
|
|
||||||
|
|
||||||
return seq
|
return seq
|
||||||
|
|
||||||
|
|
||||||
@ -153,6 +155,9 @@ def genbankIterator_file(lineiterator,
|
|||||||
yield seq
|
yield seq
|
||||||
read+=1
|
read+=1
|
||||||
|
|
||||||
|
# Last sequence
|
||||||
|
seq = genbankParser(entry)
|
||||||
|
|
||||||
yield seq
|
yield seq
|
||||||
|
|
||||||
free(entry)
|
free(entry)
|
||||||
@ -168,10 +173,12 @@ def genbankIterator_dir(dir_path,
|
|||||||
read = 0
|
read = 0
|
||||||
read_files = 0
|
read_files = 0
|
||||||
files = [filename for filename in glob.glob(os.path.join(path, b'*.gbff*'))]
|
files = [filename for filename in glob.glob(os.path.join(path, b'*.gbff*'))]
|
||||||
|
files.extend([filename for filename in glob.glob(os.path.join(path, b'*.seq*'))]) # new genbank extension
|
||||||
|
files = list(set(files))
|
||||||
for filename in files:
|
for filename in files:
|
||||||
if read==only:
|
if read==only:
|
||||||
return
|
return
|
||||||
print("Parsing file %s (%d/%d)" % (tostr(filename), read_files, len(files)))
|
print("Parsing file %s (%d/%d)" % (tostr(filename), read_files+1, len(files)))
|
||||||
f = uopen(filename)
|
f = uopen(filename)
|
||||||
if only is not None:
|
if only is not None:
|
||||||
only_f = only-read
|
only_f = only-read
|
||||||
|
7
python/obitools3/uri/decode.pyx
Executable file → Normal file
7
python/obitools3/uri/decode.pyx
Executable file → Normal file
@ -171,7 +171,8 @@ Reads an URI and returns a tuple containing:
|
|||||||
def open_uri(uri,
|
def open_uri(uri,
|
||||||
bint input=True,
|
bint input=True,
|
||||||
type newviewtype=View,
|
type newviewtype=View,
|
||||||
dms_only=False):
|
dms_only=False,
|
||||||
|
force_file=False):
|
||||||
|
|
||||||
cdef bytes urib = tobytes(uri)
|
cdef bytes urib = tobytes(uri)
|
||||||
cdef bytes scheme
|
cdef bytes scheme
|
||||||
@ -195,9 +196,9 @@ def open_uri(uri,
|
|||||||
if 'obi' not in config:
|
if 'obi' not in config:
|
||||||
config['obi']={}
|
config['obi']={}
|
||||||
|
|
||||||
try:
|
if not force_file and "defaultdms" in config["obi"]:
|
||||||
default_dms=config["obi"]["defaultdms"]
|
default_dms=config["obi"]["defaultdms"]
|
||||||
except KeyError:
|
else:
|
||||||
default_dms=None
|
default_dms=None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -72,7 +72,7 @@ cpdef int count_entries(file, bytes format):
|
|||||||
return -1
|
return -1
|
||||||
mmapped_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
|
mmapped_file = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
|
||||||
total_count += len(re.findall(sep, mmapped_file))
|
total_count += len(re.findall(sep, mmapped_file))
|
||||||
if format != b"ngsfilter" and format != b"tabular":
|
if format != b"ngsfilter" and format != b"tabular" and format != b"embl" and format != b"genbank":
|
||||||
total_count += 1 # adding +1 for 1st entry because separators include \n (ngsfilter and tabular already count one more because of last \n)
|
total_count += 1 # adding +1 for 1st entry because separators include \n (ngsfilter and tabular already count one more because of last \n)
|
||||||
|
|
||||||
except:
|
except:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
major = 3
|
major = 3
|
||||||
minor = 0
|
minor = 0
|
||||||
serial= '0-beta8'
|
serial= '0b23'
|
||||||
|
|
||||||
version ="%d.%02d.%s" % (major,minor,serial)
|
version ="%d.%d.%s" % (major,minor,serial)
|
||||||
|
5
requirements.txt
Executable file
5
requirements.txt
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
--extra-index-url https://pypi.python.org/simple/
|
||||||
|
Cython>=0.24
|
||||||
|
Sphinx>=1.2.0
|
||||||
|
ipython>=3.0.0
|
||||||
|
breathe>=4.0.0
|
26
setup.py
26
setup.py
@ -5,8 +5,9 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
from distutils import log
|
from distutils import log
|
||||||
from distutils.core import setup
|
#from distutils.core import setup
|
||||||
|
from setuptools import setup # to work with pip
|
||||||
|
|
||||||
from distutils.core import Extension
|
from distutils.core import Extension
|
||||||
from distutils.sysconfig import get_python_lib
|
from distutils.sysconfig import get_python_lib
|
||||||
|
|
||||||
@ -26,10 +27,11 @@ class Distribution(ori_Distribution):
|
|||||||
|
|
||||||
ori_Distribution.__init__(self, attrs)
|
ori_Distribution.__init__(self, attrs)
|
||||||
|
|
||||||
self.global_options.insert(0,('cobitools3', None, "intall location of the C library"
|
self.global_options.insert(0,('cobitools3', None, "install location of the C library"
|
||||||
))
|
))
|
||||||
|
|
||||||
from distutils.command.build import build as build_ori
|
from distutils.command.build import build as build_ori
|
||||||
|
from setuptools.command.bdist_egg import bdist_egg as bdist_egg_ori
|
||||||
from distutils.core import Command
|
from distutils.core import Command
|
||||||
|
|
||||||
|
|
||||||
@ -70,6 +72,12 @@ class build(build_ori):
|
|||||||
build_ori.run(self)
|
build_ori.run(self)
|
||||||
|
|
||||||
|
|
||||||
|
class bdist_egg(bdist_egg_ori):
|
||||||
|
def run(self):
|
||||||
|
self.run_command('build_clib')
|
||||||
|
bdist_egg_ori.run(self)
|
||||||
|
|
||||||
|
|
||||||
sys.path.append(os.path.abspath("python"))
|
sys.path.append(os.path.abspath("python"))
|
||||||
|
|
||||||
|
|
||||||
@ -88,9 +96,10 @@ PACKAGE = "OBITools3"
|
|||||||
VERSION = version
|
VERSION = version
|
||||||
AUTHOR = 'Celine Mercier'
|
AUTHOR = 'Celine Mercier'
|
||||||
EMAIL = 'celine.mercier@metabarcoding.org'
|
EMAIL = 'celine.mercier@metabarcoding.org'
|
||||||
URL = "http://metabarcoding.org/obitools3"
|
URL = "https://metabarcoding.org/obitools3"
|
||||||
|
PLATFORMS = "posix"
|
||||||
LICENSE = "CeCILL-V2"
|
LICENSE = "CeCILL-V2"
|
||||||
DESCRIPTION = "Tools and library for DNA metabarcoding",
|
DESCRIPTION = "A package for the management of analyses and data in DNA metabarcoding."
|
||||||
PYTHONMIN = '3.5'
|
PYTHONMIN = '3.5'
|
||||||
|
|
||||||
SRC = 'python'
|
SRC = 'python'
|
||||||
@ -147,17 +156,24 @@ classifiers=['Development Status :: 4 - Beta',
|
|||||||
'Topic :: Utilities',
|
'Topic :: Utilities',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
with open("README.md", "r") as fh:
|
||||||
|
long_description = fh.read()
|
||||||
|
|
||||||
setup(name=PACKAGE,
|
setup(name=PACKAGE,
|
||||||
description=DESCRIPTION,
|
description=DESCRIPTION,
|
||||||
|
long_description=long_description,
|
||||||
|
long_description_content_type="text/markdown",
|
||||||
classifiers=classifiers,
|
classifiers=classifiers,
|
||||||
version=VERSION,
|
version=VERSION,
|
||||||
author=AUTHOR,
|
author=AUTHOR,
|
||||||
author_email=EMAIL,
|
author_email=EMAIL,
|
||||||
|
platforms=PLATFORMS,
|
||||||
license=LICENSE,
|
license=LICENSE,
|
||||||
url=URL,
|
url=URL,
|
||||||
ext_modules=xx,
|
ext_modules=xx,
|
||||||
distclass=Distribution,
|
distclass=Distribution,
|
||||||
cmdclass={'build': build,
|
cmdclass={'build': build,
|
||||||
|
'bdist_egg': bdist_egg,
|
||||||
'build_clib': build_clib},
|
'build_clib': build_clib},
|
||||||
cobitools3=get_python_lib(),
|
cobitools3=get_python_lib(),
|
||||||
packages = findPackage('python'),
|
packages = findPackage('python'),
|
||||||
|
@ -157,7 +157,7 @@ int build_reference_db(const char* dms_name,
|
|||||||
ecotx_t* lca_2 = NULL;
|
ecotx_t* lca_2 = NULL;
|
||||||
ecotx_t* lca = NULL;
|
ecotx_t* lca = NULL;
|
||||||
index_t idx1, idx2;
|
index_t idx1, idx2;
|
||||||
index_t i, j, k;
|
index_t i, j, k, count;
|
||||||
int32_t taxid_array_length;
|
int32_t taxid_array_length;
|
||||||
int32_t score_array_length;
|
int32_t score_array_length;
|
||||||
int32_t taxid_array_writable_length;
|
int32_t taxid_array_writable_length;
|
||||||
@ -185,6 +185,7 @@ int build_reference_db(const char* dms_name,
|
|||||||
matrix_view_name = strcpy(matrix_view_name, o_view_name);
|
matrix_view_name = strcpy(matrix_view_name, o_view_name);
|
||||||
strcat(matrix_view_name, "_matrix");
|
strcat(matrix_view_name, "_matrix");
|
||||||
|
|
||||||
|
fprintf(stderr, "Aligning queries with reference database...\n");
|
||||||
if (obi_lcs_align_one_column(dms_name,
|
if (obi_lcs_align_one_column(dms_name,
|
||||||
refs_view_name,
|
refs_view_name,
|
||||||
"",
|
"",
|
||||||
@ -320,13 +321,19 @@ int build_reference_db(const char* dms_name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
count = (matrix_with_lca_view->infos)->line_count;
|
||||||
|
fprintf(stderr, "Computing LCAs...\n");
|
||||||
|
|
||||||
// Compute all the LCAs
|
// Compute all the LCAs
|
||||||
// For each pair
|
// For each pair
|
||||||
for (i=0; i<(matrix_with_lca_view->infos)->line_count; i++)
|
for (i=0; i<count; i++)
|
||||||
{
|
{
|
||||||
if (! keep_running)
|
if (! keep_running)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (i%1000 == 0)
|
||||||
|
fprintf(stderr,"\rDone : %f %% ", (i / (float) count)*100);
|
||||||
|
|
||||||
// Read all taxids associated with the first sequence and compute their LCA
|
// Read all taxids associated with the first sequence and compute their LCA
|
||||||
// Read line index
|
// Read line index
|
||||||
idx1 = obi_get_int_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_idx1_column, i, 0);
|
idx1 = obi_get_int_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_idx1_column, i, 0);
|
||||||
@ -363,6 +370,7 @@ int build_reference_db(const char* dms_name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fprintf(stderr,"\rDone : 100 %% \n");
|
||||||
|
|
||||||
// Clone refs view, add 2 arrays columns for lca and score, compute and write them
|
// Clone refs view, add 2 arrays columns for lca and score, compute and write them
|
||||||
|
|
||||||
@ -442,13 +450,18 @@ int build_reference_db(const char* dms_name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Building LCA arrays...\n");
|
||||||
|
|
||||||
// For each sequence, look for all its alignments in the matrix, and for each different LCA taxid/score, order them and write them
|
// For each sequence, look for all its alignments in the matrix, and for each different LCA taxid/score, order them and write them
|
||||||
// Going through matrix once, filling refs arrays on the go for efficiency
|
// Going through matrix once, filling refs arrays on the go for efficiency
|
||||||
for (i=0; i<(matrix_with_lca_view->infos)->line_count; i++)
|
for (i=0; i<count; i++)
|
||||||
{
|
{
|
||||||
if (! keep_running)
|
if (! keep_running)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (i%1000 == 0)
|
||||||
|
fprintf(stderr,"\rDone : %f %% ", (i / (float) count)*100);
|
||||||
|
|
||||||
// Read ref line indexes
|
// Read ref line indexes
|
||||||
idx1 = obi_get_int_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_idx1_column, i, 0);
|
idx1 = obi_get_int_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_idx1_column, i, 0);
|
||||||
idx2 = obi_get_int_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_idx2_column, i, 0);
|
idx2 = obi_get_int_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_idx2_column, i, 0);
|
||||||
@ -464,6 +477,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
// Read alignment score
|
// Read alignment score
|
||||||
score = obi_get_float_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_score_column, i, 0);
|
score = obi_get_float_with_elt_idx_and_col_p_in_view(matrix_with_lca_view, matrix_score_column, i, 0);
|
||||||
|
|
||||||
|
//fprintf(stderr, "\n\ntaxid_lca=%d, score=%f, idx1=%d, idx2=%d", taxid_lca, score, idx1, idx2);
|
||||||
|
|
||||||
///////////////// Compute for first sequence \\\\\\\\\\\\\\\\\\\\\\\ (TODO function)
|
///////////////// Compute for first sequence \\\\\\\\\\\\\\\\\\\\\\\ (TODO function)
|
||||||
|
|
||||||
// Read arrays
|
// Read arrays
|
||||||
@ -480,9 +495,11 @@ int build_reference_db(const char* dms_name,
|
|||||||
// return -1;
|
// return -1;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
//fprintf(stderr, "\n1st sequence");
|
||||||
// If empty, add values
|
// If empty, add values
|
||||||
if (taxid_array_length == 0)
|
if (taxid_array_length == 0)
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nEmpty, add value");
|
||||||
if (obi_set_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, idx1, &taxid_lca, (uint8_t) (obi_sizeof(OBI_INT) * 8), 1) < 0)
|
if (obi_set_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, idx1, &taxid_lca, (uint8_t) (obi_sizeof(OBI_INT) * 8), 1) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError setting a LCA taxid array in a column when building a reference database");
|
obidebug(1, "\nError setting a LCA taxid array in a column when building a reference database");
|
||||||
@ -496,6 +513,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nNot empty");
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
modified = false;
|
modified = false;
|
||||||
while (j < taxid_array_length)
|
while (j < taxid_array_length)
|
||||||
@ -509,6 +528,9 @@ int build_reference_db(const char* dms_name,
|
|||||||
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
||||||
modified = true;
|
modified = true;
|
||||||
|
|
||||||
|
//fprintf(stderr, "\nSame LCA, replace %d and %f with %d and %f", lca_taxid_array_writable[j],
|
||||||
|
// score_array_writable[j], taxid_lca, score);
|
||||||
|
|
||||||
// Better score for the same LCA, replace this LCA/score pair
|
// Better score for the same LCA, replace this LCA/score pair
|
||||||
lca_taxid_array_writable[j] = taxid_lca;
|
lca_taxid_array_writable[j] = taxid_lca;
|
||||||
score_array_writable[j] = score;
|
score_array_writable[j] = score;
|
||||||
@ -535,6 +557,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
{
|
{
|
||||||
if (score > score_array[j])
|
if (score > score_array[j])
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nInsert new");
|
||||||
|
|
||||||
memcpy(lca_taxid_array_writable, lca_taxid_array, taxid_array_length*sizeof(obiint_t));
|
memcpy(lca_taxid_array_writable, lca_taxid_array, taxid_array_length*sizeof(obiint_t));
|
||||||
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
||||||
modified = true;
|
modified = true;
|
||||||
@ -579,10 +603,15 @@ int build_reference_db(const char* dms_name,
|
|||||||
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
||||||
modified = true;
|
modified = true;
|
||||||
|
|
||||||
|
//fprintf(stderr, "\nAppend at the end");
|
||||||
|
|
||||||
// Append LCA
|
// Append LCA
|
||||||
lca_taxid_array_writable[taxid_array_writable_length] = taxid_lca;
|
lca_taxid_array_writable[taxid_array_writable_length] = taxid_lca;
|
||||||
score_array_writable[score_array_writable_length] = score;
|
score_array_writable[score_array_writable_length] = score;
|
||||||
|
|
||||||
|
taxid_array_writable_length++;
|
||||||
|
score_array_writable_length++;
|
||||||
|
|
||||||
// Remove the previous (children) LCAs from the array if their score is equal or lower
|
// Remove the previous (children) LCAs from the array if their score is equal or lower
|
||||||
while ((j>0) && (score_array_writable[j-1] <= score))
|
while ((j>0) && (score_array_writable[j-1] <= score))
|
||||||
{
|
{
|
||||||
@ -603,6 +632,13 @@ int build_reference_db(const char* dms_name,
|
|||||||
// Write new arrays
|
// Write new arrays
|
||||||
if (modified)
|
if (modified)
|
||||||
{
|
{
|
||||||
|
// fprintf(stderr, "\n\nnew array:");
|
||||||
|
// for (k=0;k<taxid_array_writable_length;k++)
|
||||||
|
// {
|
||||||
|
// lca = obi_taxo_get_taxon_with_taxid(tax, lca_taxid_array_writable[k]);
|
||||||
|
// fprintf(stderr, "\nLCA=%d, %s, score=%f", lca_taxid_array_writable[k], lca->name, score_array_writable[k]);
|
||||||
|
// }
|
||||||
|
|
||||||
if (obi_set_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, idx1, lca_taxid_array_writable, (uint8_t) (obi_sizeof(OBI_INT) * 8), taxid_array_writable_length) < 0)
|
if (obi_set_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, idx1, lca_taxid_array_writable, (uint8_t) (obi_sizeof(OBI_INT) * 8), taxid_array_writable_length) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError setting a LCA taxid array in a column when building a reference database");
|
obidebug(1, "\nError setting a LCA taxid array in a column when building a reference database");
|
||||||
@ -632,9 +668,13 @@ int build_reference_db(const char* dms_name,
|
|||||||
// return -1;
|
// return -1;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
//fprintf(stderr, "\n2nd sequence");
|
||||||
|
|
||||||
// If empty, add values
|
// If empty, add values
|
||||||
if (taxid_array_length == 0)
|
if (taxid_array_length == 0)
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nEmpty, add value");
|
||||||
|
|
||||||
if (obi_set_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, idx2, &taxid_lca, (uint8_t) (obi_sizeof(OBI_INT) * 8), 1) < 0)
|
if (obi_set_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, idx2, &taxid_lca, (uint8_t) (obi_sizeof(OBI_INT) * 8), 1) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError setting a LCA taxid array in a column when building a reference database");
|
obidebug(1, "\nError setting a LCA taxid array in a column when building a reference database");
|
||||||
@ -648,6 +688,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nNot empty");
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
modified = false;
|
modified = false;
|
||||||
while (j < taxid_array_length)
|
while (j < taxid_array_length)
|
||||||
@ -661,6 +703,9 @@ int build_reference_db(const char* dms_name,
|
|||||||
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
||||||
modified = true;
|
modified = true;
|
||||||
|
|
||||||
|
//fprintf(stderr, "\nSame LCA, replace %d and %f with %d and %f", lca_taxid_array_writable[j],
|
||||||
|
// score_array_writable[j], taxid_lca, score);
|
||||||
|
|
||||||
// Better score for the same LCA, replace this LCA/score pair
|
// Better score for the same LCA, replace this LCA/score pair
|
||||||
lca_taxid_array_writable[j] = taxid_lca;
|
lca_taxid_array_writable[j] = taxid_lca;
|
||||||
score_array_writable[j] = score;
|
score_array_writable[j] = score;
|
||||||
@ -687,6 +732,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
{
|
{
|
||||||
if (score > score_array[j])
|
if (score > score_array[j])
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nInsert new");
|
||||||
|
|
||||||
memcpy(lca_taxid_array_writable, lca_taxid_array, taxid_array_length*sizeof(obiint_t));
|
memcpy(lca_taxid_array_writable, lca_taxid_array, taxid_array_length*sizeof(obiint_t));
|
||||||
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
||||||
modified = true;
|
modified = true;
|
||||||
@ -727,6 +774,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
|
|
||||||
if (j == taxid_array_length) // same or parent LCA not found, need to be appended at the end
|
if (j == taxid_array_length) // same or parent LCA not found, need to be appended at the end
|
||||||
{
|
{
|
||||||
|
//fprintf(stderr, "\nAppend at the end");
|
||||||
|
|
||||||
memcpy(lca_taxid_array_writable, lca_taxid_array, taxid_array_length*sizeof(obiint_t));
|
memcpy(lca_taxid_array_writable, lca_taxid_array, taxid_array_length*sizeof(obiint_t));
|
||||||
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
memcpy(score_array_writable, score_array, score_array_length*sizeof(obifloat_t));
|
||||||
modified = true;
|
modified = true;
|
||||||
@ -735,6 +784,9 @@ int build_reference_db(const char* dms_name,
|
|||||||
lca_taxid_array_writable[taxid_array_writable_length] = taxid_lca;
|
lca_taxid_array_writable[taxid_array_writable_length] = taxid_lca;
|
||||||
score_array_writable[score_array_writable_length] = score;
|
score_array_writable[score_array_writable_length] = score;
|
||||||
|
|
||||||
|
taxid_array_writable_length++;
|
||||||
|
score_array_writable_length++;
|
||||||
|
|
||||||
// Remove the previous (children) LCAs from the array if their score is equal or lower
|
// Remove the previous (children) LCAs from the array if their score is equal or lower
|
||||||
while ((j>0) && (score_array_writable[j-1] <= score))
|
while ((j>0) && (score_array_writable[j-1] <= score))
|
||||||
{
|
{
|
||||||
@ -769,11 +821,17 @@ int build_reference_db(const char* dms_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fprintf(stderr,"\rDone : 100 %% \n");
|
||||||
|
|
||||||
|
fprintf(stderr, "Writing results...\n");
|
||||||
|
count = (o_view->infos)->line_count;
|
||||||
// Fill empty LCA informations (because filling from potentially sparse alignment matrix) with the sequence taxid
|
// Fill empty LCA informations (because filling from potentially sparse alignment matrix) with the sequence taxid
|
||||||
score=1.0; // technically getting LCA of identical sequences
|
score=1.0; // technically getting LCA of identical sequences
|
||||||
for (i=0; i<(o_view->infos)->line_count; i++)
|
for (i=0; i<count; i++)
|
||||||
{
|
{
|
||||||
|
if (i%1000 == 0)
|
||||||
|
fprintf(stderr,"\rDone : %f %% ", (i / (float) count)*100);
|
||||||
|
|
||||||
obi_get_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, i, &taxid_array_length);
|
obi_get_array_with_col_p_in_view(o_view, final_lca_taxid_a_column, i, &taxid_array_length);
|
||||||
if (taxid_array_length == 0) // no LCA set
|
if (taxid_array_length == 0) // no LCA set
|
||||||
{
|
{
|
||||||
@ -799,6 +857,7 @@ int build_reference_db(const char* dms_name,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fprintf(stderr,"\rDone : 100 %% \n");
|
||||||
|
|
||||||
// Add information about the threshold used to build the DB
|
// Add information about the threshold used to build the DB
|
||||||
snprintf(threshold_str, 5, "%f", threshold);
|
snprintf(threshold_str, 5, "%f", threshold);
|
||||||
@ -858,7 +917,6 @@ int build_reference_db(const char* dms_name,
|
|||||||
free(matrix_view_name);
|
free(matrix_view_name);
|
||||||
free(matrix_with_lca_view_name);
|
free(matrix_with_lca_view_name);
|
||||||
|
|
||||||
fprintf(stderr,"\rDone : 100 %% \n");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
48
src/obi_ecopcr.c
Executable file → Normal file
48
src/obi_ecopcr.c
Executable file → Normal file
@ -105,7 +105,8 @@ static int create_output_columns(Obiview_p o_view, bool kingdom_mode);
|
|||||||
* @param o_temp1_column A pointer on the output column for the temperature for the first primer.
|
* @param o_temp1_column A pointer on the output column for the temperature for the first primer.
|
||||||
* @param o_temp2_column A pointer on the output column for the temperature for the second primer.
|
* @param o_temp2_column A pointer on the output column for the temperature for the second primer.
|
||||||
*
|
*
|
||||||
* @retval 0 if the operation was successfully completed.
|
* @retval 0 if the sequence was skipped (taxid not found, warning printed).
|
||||||
|
* @retval 1 if the sequence was successfully printed to the output.
|
||||||
* @retval -1 if an error occurred.
|
* @retval -1 if an error occurred.
|
||||||
*
|
*
|
||||||
* @since July 2018
|
* @since July 2018
|
||||||
@ -366,6 +367,17 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
|
|
||||||
// TODO add check for primer longer than MAX_PAT_LEN (32)
|
// TODO add check for primer longer than MAX_PAT_LEN (32)
|
||||||
|
|
||||||
|
// Get sequence id
|
||||||
|
seq_id = obi_get_str_with_elt_idx_and_col_p_in_view(i_view, i_id_column, i_idx, 0);
|
||||||
|
|
||||||
|
// Get the taxon structure
|
||||||
|
main_taxon = obi_taxo_get_taxon_with_taxid(taxonomy, taxid);
|
||||||
|
if (main_taxon == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nWarning: error reading the taxonomic information of a sequence. Seq id: %s, taxid: %d. Probably deprecated taxid. Skipping this sequence.", seq_id, taxid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ldelta = (pos1 <= keep_nucleotides)?pos1:keep_nucleotides;
|
ldelta = (pos1 <= keep_nucleotides)?pos1:keep_nucleotides;
|
||||||
rdelta = ((pos2+keep_nucleotides)>=seq_len)?seq_len-pos2:keep_nucleotides;
|
rdelta = ((pos2+keep_nucleotides)>=seq_len)?seq_len-pos2:keep_nucleotides;
|
||||||
|
|
||||||
@ -431,16 +443,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
if (isnan(tm2))
|
if (isnan(tm2))
|
||||||
tm2 = OBIFloat_NA;
|
tm2 = OBIFloat_NA;
|
||||||
|
|
||||||
// Get the taxon structure
|
|
||||||
main_taxon = obi_taxo_get_taxon_with_taxid(taxonomy, taxid);
|
|
||||||
if (main_taxon == NULL)
|
|
||||||
{
|
|
||||||
obidebug(1, "\nError reading the taxonomic information of a sequence");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write sequence id
|
// Write sequence id
|
||||||
seq_id = obi_get_str_with_elt_idx_and_col_p_in_view(i_view, i_id_column, i_idx, 0);
|
|
||||||
if (obi_set_str_with_elt_idx_and_col_p_in_view(o_view, o_id_column, o_idx, 0, seq_id) < 0)
|
if (obi_set_str_with_elt_idx_and_col_p_in_view(o_view, o_id_column, o_idx, 0, seq_id) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing the sequence id");
|
obidebug(1, "\nError writing the sequence id");
|
||||||
@ -629,7 +632,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -698,6 +701,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
|
|
||||||
obiint_t taxid;
|
obiint_t taxid;
|
||||||
char* sequence;
|
char* sequence;
|
||||||
|
int printed;
|
||||||
|
|
||||||
SeqPtr apatseq=NULL;
|
SeqPtr apatseq=NULL;
|
||||||
int32_t o1Hits;
|
int32_t o1Hits;
|
||||||
@ -1057,14 +1061,14 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
length = 0;
|
length = 0;
|
||||||
if (posj > posi)
|
if (posj > posi)
|
||||||
length = posj - posi - o1->patlen - o2->patlen;
|
length = posj - posi - o1->patlen - o2->patlen;
|
||||||
if (posj < posi)
|
else if (circular > 0)
|
||||||
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen;
|
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen;
|
||||||
if ((length>0) && // For when primers touch or overlap
|
if ((length>0) && // For when primers touch or overlap
|
||||||
(!min_len || (length >= min_len)) &&
|
(!min_len || (length >= min_len)) &&
|
||||||
(!max_len || (length <= max_len)))
|
(!max_len || (length <= max_len)))
|
||||||
{
|
{
|
||||||
// Print the found amplicon
|
// Print the found amplicon
|
||||||
if (print_seq(i_view, o_view,
|
printed = print_seq(i_view, o_view,
|
||||||
i_idx, o_idx,
|
i_idx, o_idx,
|
||||||
taxonomy,
|
taxonomy,
|
||||||
sequence,
|
sequence,
|
||||||
@ -1090,12 +1094,14 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
o_strand_column,
|
o_strand_column,
|
||||||
o_primer1_column, o_primer2_column,
|
o_primer1_column, o_primer2_column,
|
||||||
o_error1_column, o_error2_column,
|
o_error1_column, o_error2_column,
|
||||||
o_temp1_column, o_temp2_column) < 0)
|
o_temp1_column, o_temp2_column);
|
||||||
|
if (printed < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing the ecopcr result");
|
obidebug(1, "\nError writing the ecopcr result");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
o_idx++;
|
else if (printed > 0)
|
||||||
|
o_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1145,14 +1151,14 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
length = 0;
|
length = 0;
|
||||||
if (posj > posi)
|
if (posj > posi)
|
||||||
length = posj - posi + 1 - o2->patlen - o1->patlen; /* - o1->patlen : deleted by <EC> (prior to the OBITools3) */
|
length = posj - posi + 1 - o2->patlen - o1->patlen; /* - o1->patlen : deleted by <EC> (prior to the OBITools3) */
|
||||||
if (posj < posi)
|
else if (circular > 0)
|
||||||
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen;
|
length = posj + apatseq->seqlen - posi - o1->patlen - o2->patlen;
|
||||||
if ((length>0) && // For when primers touch or overlap
|
if ((length>0) && // For when primers touch or overlap
|
||||||
(!min_len || (length >= min_len)) &&
|
(!min_len || (length >= min_len)) &&
|
||||||
(!max_len || (length <= max_len)))
|
(!max_len || (length <= max_len)))
|
||||||
{
|
{
|
||||||
// Print the found amplicon
|
// Print the found amplicon
|
||||||
if (print_seq(i_view, o_view,
|
printed = print_seq(i_view, o_view,
|
||||||
i_idx, o_idx,
|
i_idx, o_idx,
|
||||||
taxonomy,
|
taxonomy,
|
||||||
sequence,
|
sequence,
|
||||||
@ -1178,12 +1184,14 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
o_strand_column,
|
o_strand_column,
|
||||||
o_primer1_column, o_primer2_column,
|
o_primer1_column, o_primer2_column,
|
||||||
o_error1_column, o_error2_column,
|
o_error1_column, o_error2_column,
|
||||||
o_temp1_column, o_temp2_column) < 0)
|
o_temp1_column, o_temp2_column);
|
||||||
|
if (printed < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing the ecopcr result");
|
obidebug(1, "\nError writing the ecopcr result");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
o_idx++;
|
else if (printed > 0)
|
||||||
|
o_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1224,7 +1232,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(stderr,"\rDone : 100 %% ");
|
fprintf(stderr,"\rDone : 100 %% \n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -81,8 +81,8 @@
|
|||||||
* @param o_dms_name The path to the output DMS.
|
* @param o_dms_name The path to the output DMS.
|
||||||
* @param o_view_name The name of the output view.
|
* @param o_view_name The name of the output view.
|
||||||
* @param o_view_comments The comments to associate with the output view.
|
* @param o_view_comments The comments to associate with the output view.
|
||||||
* @param primer1 The first primer.
|
* @param primer1 The first primer, length must be less than or equal to 32 (because of apat lib limitation).
|
||||||
* @param primer2 The second primer.
|
* @param primer2 The second primer, length must be less than or equal to 32 (because of apat lib limitation).
|
||||||
* @param error_max The maximum number of errors allowed per primer for amplification.
|
* @param error_max The maximum number of errors allowed per primer for amplification.
|
||||||
* @param min_len The minimum length of an amplicon.
|
* @param min_len The minimum length of an amplicon.
|
||||||
* @param max_len The maximum length of an amplicon.
|
* @param max_len The maximum length of an amplicon.
|
||||||
|
@ -100,35 +100,35 @@ int print_assignment_result(Obiview_p output_view, index_t line,
|
|||||||
static int create_output_columns(Obiview_p o_view)
|
static int create_output_columns(Obiview_p o_view)
|
||||||
{
|
{
|
||||||
// Score column
|
// Score column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_SCORE_COLUMN_NAME, -1, NULL, OBI_FLOAT, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_SCORE_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_SCORE_COLUMN_NAME, -1, NULL, OBI_FLOAT, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the score in ecotag");
|
obidebug(1, "\nError creating the column for the score in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigned taxid column
|
// Assigned taxid column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_TAXID_COLUMN_NAME, -1, NULL, OBI_INT, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_TAXID_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_TAXID_COLUMN_NAME, -1, NULL, OBI_INT, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the assigned taxid in ecotag");
|
obidebug(1, "\nError creating the column for the assigned taxid in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assigned scientific name column
|
// Assigned scientific name column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_NAME_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_NAME_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_NAME_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the assigned scientific name in ecotag");
|
obidebug(1, "\nError creating the column for the assigned scientific name in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assignement status column
|
// Assignement status column
|
||||||
if (obi_view_add_column(o_view, ECOTAG_STATUS_COLUMN_NAME, -1, NULL, OBI_BOOL, 0, 1, NULL, false, false, false, NULL, NULL, -1, ECOTAG_STATUS_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_STATUS_COLUMN_NAME, -1, NULL, OBI_BOOL, 0, 1, NULL, false, false, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the assignment status in ecotag");
|
obidebug(1, "\nError creating the column for the assignment status in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Column for array of best match ids
|
// Column for array of best match ids
|
||||||
if (obi_view_add_column(o_view, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, true, false, NULL, NULL, -1, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME, true) < 0)
|
if (obi_view_add_column(o_view, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME, -1, NULL, OBI_STR, 0, 1, NULL, false, true, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError creating the column for the array of ids of the best match in ecotag");
|
obidebug(1, "\nError creating the column for the array of ids of the best match in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
@ -455,7 +455,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
|
|
||||||
for (i=0; i < query_count; i++)
|
for (i=0; i < query_count; i++)
|
||||||
{
|
{
|
||||||
if (i%100 == 0)
|
if (i%1000 == 0)
|
||||||
fprintf(stderr,"\rDone : %f %% ", (i / (float) query_count)*100);
|
fprintf(stderr,"\rDone : %f %% ", (i / (float) query_count)*100);
|
||||||
|
|
||||||
best_match_count = 0;
|
best_match_count = 0;
|
||||||
@ -562,7 +562,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
score_array = obi_get_array_with_col_p_in_view(ref_view, score_a_column, best_match_idx, &lca_array_length);
|
score_array = obi_get_array_with_col_p_in_view(ref_view, score_a_column, best_match_idx, &lca_array_length);
|
||||||
|
|
||||||
k = 0;
|
k = 0;
|
||||||
while ((k < lca_array_length) && (score_array[k] >= ecotag_threshold))
|
while ((k < lca_array_length) && (score_array[k] >= best_score))
|
||||||
k++;
|
k++;
|
||||||
|
|
||||||
if (k>0)
|
if (k>0)
|
||||||
@ -570,12 +570,12 @@ int obi_ecotag(const char* dms_name,
|
|||||||
lca_array = obi_get_array_with_col_p_in_view(ref_view, lca_taxid_a_column, best_match_idx, &lca_array_length);
|
lca_array = obi_get_array_with_col_p_in_view(ref_view, lca_taxid_a_column, best_match_idx, &lca_array_length);
|
||||||
if (j>0)
|
if (j>0)
|
||||||
{
|
{
|
||||||
lca = obi_taxo_get_taxon_with_taxid(taxonomy, lca_taxid);
|
// lca = obi_taxo_get_taxon_with_taxid(taxonomy, lca_taxid);
|
||||||
if (lca == NULL)
|
// if (lca == NULL)
|
||||||
{
|
// {
|
||||||
obidebug(1, "\nError getting a taxon from a taxid when doing taxonomic assignment");
|
// obidebug(1, "\nError getting a taxon from a taxid when doing taxonomic assignment");
|
||||||
return -1;
|
// return -1;
|
||||||
}
|
// }
|
||||||
lca_in_array = obi_taxo_get_taxon_with_taxid(taxonomy, lca_array[k-1]);
|
lca_in_array = obi_taxo_get_taxon_with_taxid(taxonomy, lca_array[k-1]);
|
||||||
if (lca_in_array == NULL)
|
if (lca_in_array == NULL)
|
||||||
{
|
{
|
||||||
|
@ -648,7 +648,7 @@ int truncate_avl_data_to_size_used(OBIDMS_avl_data_p avl_data) // TODO is it nec
|
|||||||
new_data_size = ((index_t) multiple) * getpagesize();
|
new_data_size = ((index_t) multiple) * getpagesize();
|
||||||
|
|
||||||
// Check that it is actually greater than the current size of the file, otherwise no need to truncate
|
// Check that it is actually greater than the current size of the file, otherwise no need to truncate
|
||||||
if ((avl_data->header)->data_size_max == new_data_size)
|
if ((avl_data->header)->data_size_max >= new_data_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Get the file descriptor
|
// Get the file descriptor
|
||||||
@ -667,7 +667,7 @@ int truncate_avl_data_to_size_used(OBIDMS_avl_data_p avl_data) // TODO is it nec
|
|||||||
if (ftruncate(file_descriptor, file_size) < 0)
|
if (ftruncate(file_descriptor, file_size) < 0)
|
||||||
{
|
{
|
||||||
obi_set_errno(OBI_AVL_ERROR);
|
obi_set_errno(OBI_AVL_ERROR);
|
||||||
obidebug(1, "\nError truncating an AVL data file");
|
obidebug(1, "\nError truncating an AVL data file, old data size = %lld, new data size = %lld", (avl_data->header)->data_size_max, new_data_size);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2376,9 +2376,10 @@ int read_merged_dmp(const char* taxdump, OBIDMS_taxonomy_p tax, int32_t* delnode
|
|||||||
// and the deleted taxids with no current reference. An element of the list is composed of the taxid, and the index
|
// and the deleted taxids with no current reference. An element of the list is composed of the taxid, and the index
|
||||||
// of the taxon in the taxa structure, or -1 for deleted taxids.
|
// of the taxon in the taxa structure, or -1 for deleted taxids.
|
||||||
// Creating the merged list requires to merge the 3 ordered lists into one.
|
// Creating the merged list requires to merge the 3 ordered lists into one.
|
||||||
while (((nT < (tax->taxa)->count) && ((tax->taxa)->taxon[nT].taxid < old_taxid)) || ((nD >= 0) && (delnodes[nD] < old_taxid)))
|
while (((nT < (tax->taxa)->count) && ((tax->taxa)->taxon[nT].taxid < old_taxid)) ||
|
||||||
|
((nD >= 0) && (delnodes[nD] < old_taxid)))
|
||||||
{
|
{
|
||||||
if ((tax->taxa)->taxon[nT].taxid < delnodes[nD])
|
if ((nT < (tax->taxa)->count) && (tax->taxa)->taxon[nT].taxid < delnodes[nD])
|
||||||
{ // Add element from taxa list
|
{ // Add element from taxa list
|
||||||
// Enlarge structure if needed
|
// Enlarge structure if needed
|
||||||
if (n == buffer_size)
|
if (n == buffer_size)
|
||||||
@ -2401,7 +2402,7 @@ int read_merged_dmp(const char* taxdump, OBIDMS_taxonomy_p tax, int32_t* delnode
|
|||||||
nT++;
|
nT++;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
else if (delnodes[nD] < (tax->taxa)->taxon[nT].taxid)
|
else
|
||||||
{ // Add element from deleted taxids list
|
{ // Add element from deleted taxids list
|
||||||
// Enlarge structure if needed
|
// Enlarge structure if needed
|
||||||
if (n == buffer_size)
|
if (n == buffer_size)
|
||||||
@ -3036,12 +3037,12 @@ OBIDMS_taxonomy_p obi_read_taxonomy(OBIDMS_p dms, const char* taxonomy_name, boo
|
|||||||
|
|
||||||
strcpy(tax->tax_name, taxonomy_name);
|
strcpy(tax->tax_name, taxonomy_name);
|
||||||
|
|
||||||
buffer_size = 2048;
|
|
||||||
|
|
||||||
taxonomy_path = get_taxonomy_path(dms, taxonomy_name);
|
taxonomy_path = get_taxonomy_path(dms, taxonomy_name);
|
||||||
if (taxonomy_path == NULL)
|
if (taxonomy_path == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
buffer_size = strlen(taxonomy_path) + strlen(taxonomy_name) + 6;
|
||||||
|
|
||||||
// Read ranks
|
// Read ranks
|
||||||
ranks_file_name = (char*) malloc(buffer_size*sizeof(char));
|
ranks_file_name = (char*) malloc(buffer_size*sizeof(char));
|
||||||
if (ranks_file_name == NULL)
|
if (ranks_file_name == NULL)
|
||||||
|
@ -1973,7 +1973,11 @@ int obi_enlarge_column(OBIDMS_column_p column)
|
|||||||
|
|
||||||
// Calculate the new file size
|
// Calculate the new file size
|
||||||
old_line_count = (column->header)->line_count;
|
old_line_count = (column->header)->line_count;
|
||||||
new_line_count = old_line_count * COLUMN_GROWTH_FACTOR;
|
new_line_count = ceil((double) old_line_count * (double) COLUMN_GROWTH_FACTOR);
|
||||||
|
if (new_line_count > old_line_count+100000)
|
||||||
|
new_line_count = old_line_count+100000;
|
||||||
|
else if (new_line_count < old_line_count+1000)
|
||||||
|
new_line_count = old_line_count+1000;
|
||||||
|
|
||||||
if (new_line_count > MAXIMUM_LINE_COUNT)
|
if (new_line_count > MAXIMUM_LINE_COUNT)
|
||||||
{
|
{
|
||||||
@ -2381,6 +2385,54 @@ char* obi_get_elements_names(OBIDMS_column_p column)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* obi_get_formatted_elements_names(OBIDMS_column_p column)
|
||||||
|
{
|
||||||
|
char* elements_names;
|
||||||
|
int i, j;
|
||||||
|
int elt_idx;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
elements_names = (char*) malloc(((column->header)->elements_names_length + (column->header)->nb_elements_per_line) * sizeof(char));
|
||||||
|
if (elements_names == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError allocating memory for elements names");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
j = 0;
|
||||||
|
for (i=0; i < (column->header)->nb_elements_per_line; i++)
|
||||||
|
{
|
||||||
|
elt_idx = ((column->header)->elements_names_idx)[i];
|
||||||
|
len = strlen(((column->header)->elements_names)+elt_idx);
|
||||||
|
memcpy(elements_names+j, ((column->header)->elements_names)+elt_idx, len*sizeof(char));
|
||||||
|
j = j + len;
|
||||||
|
elements_names[j] = ';';
|
||||||
|
j++;
|
||||||
|
elements_names[j] = ' ';
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
elements_names[j - 1] = '\0';
|
||||||
|
|
||||||
|
return elements_names;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char* obi_column_formatted_infos(OBIDMS_column_p column)
|
||||||
|
{
|
||||||
|
char* column_infos;
|
||||||
|
char* elt_names;
|
||||||
|
|
||||||
|
column_infos = malloc(1024 * sizeof(char));
|
||||||
|
|
||||||
|
elt_names = obi_get_formatted_elements_names(column);
|
||||||
|
|
||||||
|
|
||||||
|
free(elt_names);
|
||||||
|
return column_infos;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int obi_column_prepare_to_set_value(OBIDMS_column_p column, index_t line_nb, index_t elt_idx)
|
int obi_column_prepare_to_set_value(OBIDMS_column_p column, index_t line_nb, index_t elt_idx)
|
||||||
{
|
{
|
||||||
|
@ -505,6 +505,14 @@ index_t obi_column_get_element_index_from_name(OBIDMS_column_p column, const cha
|
|||||||
char* obi_get_elements_names(OBIDMS_column_p column);
|
char* obi_get_elements_names(OBIDMS_column_p column);
|
||||||
|
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
//char* obi_get_formatted_elements_names(OBIDMS_column_p column);
|
||||||
|
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
//char* obi_column_formatted_infos(OBIDMS_column_p column);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Prepares a column to set a value.
|
* @brief Prepares a column to set a value.
|
||||||
*
|
*
|
||||||
|
@ -1037,8 +1037,9 @@ static int finish_view(Obiview_p view)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add count column if it's a NUC_SEQ_VIEW with no count column // TODO discuss
|
// Add count column if it's a NUC_SEQ_VIEW with no count column (and there's no MERGED_sample column) // TODO discuss
|
||||||
if ((!strcmp((view->infos)->view_type, VIEW_TYPE_NUC_SEQS)) && (!obi_view_column_exists(view, COUNT_COLUMN)))
|
if ((!strcmp((view->infos)->view_type, VIEW_TYPE_NUC_SEQS)) && (!obi_view_column_exists(view, COUNT_COLUMN))
|
||||||
|
&& (!obi_view_column_exists(view, "MERGED_sample"))) // TODO should eventually compute from merged samples?
|
||||||
{
|
{
|
||||||
if (obi_create_auto_count_column(view) < 0)
|
if (obi_create_auto_count_column(view) < 0)
|
||||||
{
|
{
|
||||||
@ -1407,7 +1408,7 @@ static char* view_check_qual_match_seqs(Obiview_p view)
|
|||||||
// Test that the lengths of the quality and the sequence are equal
|
// Test that the lengths of the quality and the sequence are equal
|
||||||
if ((size_t)qual_len != strlen(seq))
|
if ((size_t)qual_len != strlen(seq))
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError checking the predicate for view %s: The sequences and sequence quality arrays match.", (view->infos)->name);
|
obidebug(1, "\nError checking the predicate for view %s: The sequences and sequence quality arrays match (index %lld, seq=%s, quality length = %d).", (view->infos)->name, j, seq, qual_len);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2380,11 +2381,12 @@ int obi_view_add_column(Obiview_p view,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int obi_view_delete_column(Obiview_p view, const char* column_name)
|
int obi_view_delete_column(Obiview_p view, const char* column_name, bool delete_file)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
bool found;
|
bool found;
|
||||||
OBIDMS_column_p column;
|
OBIDMS_column_p column;
|
||||||
|
char* col_to_delete_path;
|
||||||
|
|
||||||
// Check that the view is not read-only
|
// Check that the view is not read-only
|
||||||
if (view->read_only)
|
if (view->read_only)
|
||||||
@ -2406,8 +2408,31 @@ int obi_view_delete_column(Obiview_p view, const char* column_name)
|
|||||||
obidebug(1, "\nError getting a column from the linked list of column pointers of a view when deleting a column from a view");
|
obidebug(1, "\nError getting a column from the linked list of column pointers of a view when deleting a column from a view");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
// Keep column path if need to delete the file
|
||||||
|
if (delete_file)
|
||||||
|
{
|
||||||
|
col_to_delete_path = obi_column_full_path(view->dms, column->header->name, column->header->version);
|
||||||
|
if (col_to_delete_path == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError getting a column file path when deleting a column");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
obi_close_column(column);
|
obi_close_column(column);
|
||||||
|
|
||||||
|
// Delete file if needed
|
||||||
|
if (delete_file)
|
||||||
|
{
|
||||||
|
if (remove(col_to_delete_path) < 0)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBICOL_UNKNOWN_ERROR);
|
||||||
|
obidebug(1, "\nError deleting a column file when deleting unfinished columns: file %s", col_to_delete_path);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
free(col_to_delete_path);
|
||||||
|
}
|
||||||
|
|
||||||
view->columns = ll_delete(view->columns, i);
|
view->columns = ll_delete(view->columns, i);
|
||||||
// TODO how do we check for error? NULL can be empty list
|
// TODO how do we check for error? NULL can be empty list
|
||||||
found = true;
|
found = true;
|
||||||
@ -3047,7 +3072,7 @@ int obi_create_auto_id_column(Obiview_p view, const char* prefix)
|
|||||||
// Delete old ID column if it exists
|
// Delete old ID column if it exists
|
||||||
if (obi_view_get_column(view, ID_COLUMN) != NULL)
|
if (obi_view_get_column(view, ID_COLUMN) != NULL)
|
||||||
{
|
{
|
||||||
if (obi_view_delete_column(view, ID_COLUMN) < 0)
|
if (obi_view_delete_column(view, ID_COLUMN, false) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "Error deleting an ID column to replace it in a view");
|
obidebug(1, "Error deleting an ID column to replace it in a view");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -440,6 +440,7 @@ int obi_view_add_column(Obiview_p view,
|
|||||||
*
|
*
|
||||||
* @param view A pointer on the view.
|
* @param view A pointer on the view.
|
||||||
* @param column_name The name of the column that should be deleted from the view.
|
* @param column_name The name of the column that should be deleted from the view.
|
||||||
|
* @param delete_file Whether the column file should be deleted. Use carefully re: dependencies.
|
||||||
*
|
*
|
||||||
* @returns A value indicating the success of the operation.
|
* @returns A value indicating the success of the operation.
|
||||||
* @retval 0 if the operation was successfully completed.
|
* @retval 0 if the operation was successfully completed.
|
||||||
@ -448,7 +449,7 @@ int obi_view_add_column(Obiview_p view,
|
|||||||
* @since February 2016
|
* @since February 2016
|
||||||
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
* @author Celine Mercier (celine.mercier@metabarcoding.org)
|
||||||
*/
|
*/
|
||||||
int obi_view_delete_column(Obiview_p view, const char* column_name);
|
int obi_view_delete_column(Obiview_p view, const char* column_name, bool delete_file);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -686,6 +686,9 @@ int calculateSizeToAllocate(int maxLen, int LCSmin)
|
|||||||
size *= 3;
|
size *= 3;
|
||||||
size += 16;
|
size += 16;
|
||||||
|
|
||||||
|
size += 10; // band-aid for memory bug I don't understand (triggered on specific db on ubuntu)
|
||||||
|
// bug might have to do with the way different systems behave when aligning the address in obi_get_memory_aligned_on_16
|
||||||
|
|
||||||
return(size*sizeof(int16_t));
|
return(size*sizeof(int16_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user