Compare commits
98 Commits
v3.0.0-bet
...
v3.0.0b26
Author | SHA1 | Date | |
---|---|---|---|
ade1107b42 | |||
9c7d24406f | |||
03bc9915f2 | |||
24b1dab573 | |||
7593673f3f | |||
aa01236cae | |||
49b8810a76 | |||
7a39df54c0 | |||
09e483b0d6 | |||
14a2579173 | |||
36a8aaa92e | |||
a17eb445c2 | |||
e4a32788c2 | |||
2442cc80bf | |||
aa836b2ace | |||
8776ce22e6 | |||
4aa772c405 | |||
b0b96ac37a | |||
687e42ad22 | |||
5fbbb6d304 | |||
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 | |||
c67d668989 | |||
db0ac37d41 | |||
d0c21ecd39 | |||
53212168a2 | |||
b4b2e62195 | |||
ced82c4242 | |||
a524f8829e | |||
5c9091e9eb | |||
822000cb70 | |||
b9cd9bee9a | |||
b1f3e082f9 | |||
6c018b403c | |||
694d1934a8 | |||
fc3ac03630 | |||
d75e54a078 | |||
6bfd7441f3 | |||
81a179239c |
@ -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 ()
|
||||||
{
|
{
|
@ -222,7 +222,7 @@ def __addDMSOutputOption(optionManager):
|
|||||||
group.add_argument('--no-create-dms',
|
group.add_argument('--no-create-dms',
|
||||||
action="store_true", dest="obi:nocreatedms",
|
action="store_true", dest="obi:nocreatedms",
|
||||||
default=False,
|
default=False,
|
||||||
help="Don't create an output DMS it does not already exist")
|
help="Don't create an output DMS if it does not already exist")
|
||||||
|
|
||||||
|
|
||||||
def __addEltLimitOption(optionManager):
|
def __addEltLimitOption(optionManager):
|
||||||
|
@ -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.")
|
||||||
|
|
@ -14,7 +14,7 @@ from obitools3.libalign._qsrassemble import QSolexaRightReverseAssemble
|
|||||||
from obitools3.libalign._solexapairend import buildConsensus, buildJoinedSequence
|
from obitools3.libalign._solexapairend import buildConsensus, buildJoinedSequence
|
||||||
from obitools3.dms.obiseq cimport Nuc_Seq
|
from obitools3.dms.obiseq cimport Nuc_Seq
|
||||||
from obitools3.libalign.shifted_ali cimport Kmer_similarity, Ali_shifted
|
from obitools3.libalign.shifted_ali cimport Kmer_similarity, Ali_shifted
|
||||||
from obitools3.commands.ngsfilter import REVERSE_SEQ_COLUMN_NAME, REVERSE_QUALITY_COLUMN_NAME
|
from obitools3.dms.capi.obiview cimport REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
@ -102,7 +102,7 @@ def alignmentIterator(entries, aligner):
|
|||||||
seqR = reverse[i]
|
seqR = reverse[i]
|
||||||
else:
|
else:
|
||||||
seqF = Nuc_Seq.new_from_stored(entries[i])
|
seqF = Nuc_Seq.new_from_stored(entries[i])
|
||||||
seqR = Nuc_Seq(seqF.id, seqF[REVERSE_SEQ_COLUMN_NAME], quality=seqF[REVERSE_QUALITY_COLUMN_NAME])
|
seqR = Nuc_Seq(seqF.id, seqF[REVERSE_SEQUENCE_COLUMN], quality=seqF[REVERSE_QUALITY_COLUMN])
|
||||||
seqR.index = i
|
seqR.index = i
|
||||||
|
|
||||||
ali = aligner(seqF, seqR)
|
ali = aligner(seqF, seqR)
|
||||||
@ -196,8 +196,8 @@ def run(config):
|
|||||||
reversed_column=None)
|
reversed_column=None)
|
||||||
else:
|
else:
|
||||||
aligner = Kmer_similarity(entries, \
|
aligner = Kmer_similarity(entries, \
|
||||||
column2=entries[REVERSE_SEQ_COLUMN_NAME], \
|
column2=entries[REVERSE_SEQUENCE_COLUMN], \
|
||||||
qual_column2=entries[REVERSE_QUALITY_COLUMN_NAME], \
|
qual_column2=entries[REVERSE_QUALITY_COLUMN], \
|
||||||
kmer_size=config['alignpairedend']['kmersize'], \
|
kmer_size=config['alignpairedend']['kmersize'], \
|
||||||
reversed_column=entries[b'reversed']) # column created by the ngsfilter tool
|
reversed_column=entries[b'reversed']) # column created by the ngsfilter tool
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ def run(config):
|
|||||||
buildConsensus(ali, consensus, seqF)
|
buildConsensus(ali, consensus, seqF)
|
||||||
else:
|
else:
|
||||||
if not two_views:
|
if not two_views:
|
||||||
seqR = Nuc_Seq(seqF.id, seqF[REVERSE_SEQ_COLUMN_NAME], quality = seqF[REVERSE_QUALITY_COLUMN_NAME])
|
seqR = Nuc_Seq(seqF.id, seqF[REVERSE_SEQUENCE_COLUMN], quality = seqF[REVERSE_QUALITY_COLUMN])
|
||||||
else:
|
else:
|
||||||
seqR = reverse[i]
|
seqR = reverse[i]
|
||||||
buildJoinedSequence(ali, seqR, consensus, forward=seqF)
|
buildJoinedSequence(ali, seqR, consensus, forward=seqF)
|
||||||
@ -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.")
|
||||||
|
|
||||||
|
139
python/obitools3/commands/cat.pyx
Executable file
139
python/obitools3/commands/cat.pyx
Executable file
@ -0,0 +1,139 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
|
||||||
|
from obitools3.dms import DMS
|
||||||
|
from obitools3.dms.view.view cimport View
|
||||||
|
from obitools3.uri.decode import open_uri
|
||||||
|
from obitools3.apps.optiongroups import addMinimalOutputOption
|
||||||
|
from obitools3.dms.view import RollbackException
|
||||||
|
from obitools3.apps.config import logger
|
||||||
|
from obitools3.utils cimport str2bytes
|
||||||
|
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
|
||||||
|
from obitools3.dms.view.view cimport View
|
||||||
|
from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, REVERSE_SEQUENCE_COLUMN, \
|
||||||
|
QUALITY_COLUMN, REVERSE_QUALITY_COLUMN
|
||||||
|
from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL
|
||||||
|
from obitools3.dms.column.column cimport Column
|
||||||
|
|
||||||
|
import time
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from cpython.exc cimport PyErr_CheckSignals
|
||||||
|
|
||||||
|
|
||||||
|
__title__="Concatenate views."
|
||||||
|
|
||||||
|
|
||||||
|
def addOptions(parser):
|
||||||
|
|
||||||
|
addMinimalOutputOption(parser)
|
||||||
|
|
||||||
|
group=parser.add_argument_group('obi cat specific options')
|
||||||
|
|
||||||
|
group.add_argument("-c",
|
||||||
|
action="append", dest="cat:views_to_cat",
|
||||||
|
metavar="<VIEW_NAME>",
|
||||||
|
default=[],
|
||||||
|
type=str,
|
||||||
|
help="URI of a view to concatenate. (e.g. 'my_dms/my_view'). "
|
||||||
|
"Several -c options can be used on the same "
|
||||||
|
"command line.")
|
||||||
|
|
||||||
|
|
||||||
|
def run(config):
|
||||||
|
|
||||||
|
DMS.obi_atexit()
|
||||||
|
|
||||||
|
logger("info", "obi cat")
|
||||||
|
|
||||||
|
# Open the views to concatenate
|
||||||
|
iview_list = []
|
||||||
|
idms_list = []
|
||||||
|
total_len = 0
|
||||||
|
remove_qual = False
|
||||||
|
remove_rev_qual = False
|
||||||
|
v_type = View_NUC_SEQS
|
||||||
|
for v_uri in config["cat"]["views_to_cat"]:
|
||||||
|
input = open_uri(v_uri)
|
||||||
|
if input is None:
|
||||||
|
raise Exception("Could not read input view")
|
||||||
|
i_dms = input[0]
|
||||||
|
i_view = input[1]
|
||||||
|
if input[2] != View_NUC_SEQS: # Check view type (output view is nuc_seqs view if all input view are nuc_seqs view)
|
||||||
|
v_type = View
|
||||||
|
if QUALITY_COLUMN not in i_view: # Check if keep quality column in output view (if all input views have it)
|
||||||
|
remove_qual = True
|
||||||
|
if REVERSE_QUALITY_COLUMN not in i_view: # same as above for reverse quality
|
||||||
|
remove_rev_qual = True
|
||||||
|
total_len += len(i_view)
|
||||||
|
iview_list.append(i_view)
|
||||||
|
idms_list.append(i_dms)
|
||||||
|
|
||||||
|
# Open the output: only the DMS
|
||||||
|
output = open_uri(config['obi']['outputURI'],
|
||||||
|
input=False,
|
||||||
|
newviewtype=v_type)
|
||||||
|
if output is None:
|
||||||
|
raise Exception("Could not create output view")
|
||||||
|
o_dms = output[0]
|
||||||
|
o_view = output[1]
|
||||||
|
|
||||||
|
# Initialize quality columns and their associated sequence columns if needed
|
||||||
|
if not remove_qual:
|
||||||
|
if NUC_SEQUENCE_COLUMN not in o_view:
|
||||||
|
Column.new_column(o_view, NUC_SEQUENCE_COLUMN, OBI_SEQ)
|
||||||
|
Column.new_column(o_view, QUALITY_COLUMN, OBI_QUAL, associated_column_name=NUC_SEQUENCE_COLUMN, associated_column_version=o_view[NUC_SEQUENCE_COLUMN].version)
|
||||||
|
if not remove_rev_qual:
|
||||||
|
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)
|
||||||
|
|
||||||
|
# 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
|
||||||
|
pb = ProgressBar(total_len, config, seconde=5)
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for v in iview_list:
|
||||||
|
for l in v:
|
||||||
|
PyErr_CheckSignals()
|
||||||
|
pb(i)
|
||||||
|
o_view[i] = l
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
# Deletes quality columns if needed
|
||||||
|
if QUALITY_COLUMN in o_view and remove_qual :
|
||||||
|
o_view.delete_column(QUALITY_COLUMN)
|
||||||
|
if REVERSE_QUALITY_COLUMN in o_view and remove_rev_qual :
|
||||||
|
o_view.delete_column(REVERSE_QUALITY_COLUMN)
|
||||||
|
|
||||||
|
pb(i, force=True)
|
||||||
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
|
# Save command config in DMS comments
|
||||||
|
command_line = " ".join(sys.argv[1:])
|
||||||
|
o_view.write_config(config, "cat", command_line, input_dms_name=[d.name for d in idms_list], input_view_name=[v.name for v in iview_list])
|
||||||
|
o_dms.record_command_line(command_line)
|
||||||
|
|
||||||
|
#print("\n\nOutput view:\n````````````", file=sys.stderr)
|
||||||
|
#print(repr(view), file=sys.stderr)
|
||||||
|
|
||||||
|
for d in idms_list:
|
||||||
|
d.close(force=True)
|
||||||
|
o_dms.close(force=True)
|
||||||
|
|
||||||
|
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.")
|
@ -21,7 +21,10 @@ def run(config):
|
|||||||
|
|
||||||
logger("info", "obi clean_dms")
|
logger("info", "obi clean_dms")
|
||||||
|
|
||||||
if obi_clean_dms(tobytes(config['obi']['inputURI'])) < 0 :
|
dms_path = tobytes(config['obi']['inputURI'])
|
||||||
|
if b'.obidms' in dms_path:
|
||||||
|
dms_path = dms_path.split(b'.obidms')[0]
|
||||||
|
if obi_clean_dms(dms_path) < 0 :
|
||||||
raise Exception("Error cleaning DMS", config['obi']['inputURI'])
|
raise Exception("Error cleaning DMS", config['obi']['inputURI'])
|
||||||
|
|
||||||
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",
|
||||||
@ -107,14 +109,20 @@ def addOptions(parser):
|
|||||||
help="Defines the method used for estimating the Tm (melting temperature) between the primers and their corresponding "
|
help="Defines the method used for estimating the Tm (melting temperature) between the primers and their corresponding "
|
||||||
"target sequences. SANTALUCIA: 1, or OWCZARZY: 2. Default: 1.")
|
"target sequences. SANTALUCIA: 1, or OWCZARZY: 2. Default: 1.")
|
||||||
|
|
||||||
|
group.add_argument('--keep-primers', '-p',
|
||||||
|
action="store_true",
|
||||||
|
dest="ecopcr:keep-primers",
|
||||||
|
default=False,
|
||||||
|
help="Whether to keep the primers attached to the output sequences (default: the primers are cut out).")
|
||||||
|
|
||||||
group.add_argument('--keep-nucs', '-D',
|
group.add_argument('--keep-nucs', '-D',
|
||||||
action="store",
|
action="store",
|
||||||
dest="ecopcr:keep-nucs",
|
dest="ecopcr:keep-nucs",
|
||||||
metavar="<INTEGER>",
|
metavar="<N>",
|
||||||
type=int,
|
type=int,
|
||||||
default=0,
|
default=0,
|
||||||
help="Keeps the specified number of nucleotides on each side of the in silico amplified sequences, "
|
help="Keeps N nucleotides on each side of the in silico amplified sequences, "
|
||||||
"(already including the amplified DNA fragment plus the two target sequences of the primers).")
|
"not including the primers (implying that primers are automatically kept if N > 0).")
|
||||||
|
|
||||||
group.add_argument('--kingdom-mode', '-k',
|
group.add_argument('--kingdom-mode', '-k',
|
||||||
action="store_true",
|
action="store_true",
|
||||||
@ -185,7 +193,7 @@ def run(config):
|
|||||||
config['ecopcr']['min-length'], config['ecopcr']['max-length'], \
|
config['ecopcr']['min-length'], config['ecopcr']['max-length'], \
|
||||||
restrict_to_taxids_p, ignore_taxids_p, \
|
restrict_to_taxids_p, ignore_taxids_p, \
|
||||||
config['ecopcr']['circular'], config['ecopcr']['salt-concentration'], config['ecopcr']['salt-correction-method'], \
|
config['ecopcr']['circular'], config['ecopcr']['salt-concentration'], config['ecopcr']['salt-correction-method'], \
|
||||||
config['ecopcr']['keep-nucs'], config['ecopcr']['kingdom-mode']) < 0:
|
config['ecopcr']['keep-nucs'], config['ecopcr']['keep-primers'], config['ecopcr']['kingdom-mode']) < 0:
|
||||||
raise Exception("Error running ecopcr")
|
raise Exception("Error running ecopcr")
|
||||||
|
|
||||||
# Save command config in DMS comments
|
# Save command config in DMS comments
|
||||||
@ -197,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,9 +64,9 @@ 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'],
|
||||||
@ -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.")
|
||||||
|
|
||||||
|
@ -60,11 +60,21 @@ def run(config):
|
|||||||
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 :
|
||||||
@ -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.")
|
||||||
|
|
||||||
|
@ -36,14 +36,13 @@ def addOptions(parser):
|
|||||||
metavar="<PREDICATE>",
|
metavar="<PREDICATE>",
|
||||||
default=[],
|
default=[],
|
||||||
type=str,
|
type=str,
|
||||||
help="Warning: use bytes for character strings (b'text' instead of 'text'). "
|
help="Python boolean expression to be evaluated in the "
|
||||||
"Python boolean expression to be evaluated in the "
|
|
||||||
"sequence/line context. The attribute name can be "
|
"sequence/line context. The attribute name can be "
|
||||||
"used in the expression as a variable name. "
|
"used in the expression as a variable name. "
|
||||||
"An extra variable named 'sequence' or 'line' refers "
|
"An extra variable named 'sequence' or 'line' refers "
|
||||||
"to the sequence or line object itself. "
|
"to the sequence or line object itself. "
|
||||||
"Several -p options can be used on the same "
|
"Several -p options can be used on the same "
|
||||||
"commande line.")
|
"command line.")
|
||||||
|
|
||||||
group.add_argument("-S", "--sequence",
|
group.add_argument("-S", "--sequence",
|
||||||
action="store", dest="grep:seq_pattern",
|
action="store", dest="grep:seq_pattern",
|
||||||
@ -162,8 +161,7 @@ def obi_eval(compiled_expr, loc_env, line):
|
|||||||
return obi_eval_result
|
return obi_eval_result
|
||||||
|
|
||||||
|
|
||||||
def Filter_generator(options, tax_filter):
|
def Filter_generator(options, tax_filter, i_view):
|
||||||
#taxfilter = taxonomyFilterGenerator(options)
|
|
||||||
|
|
||||||
# Initialize conditions
|
# Initialize conditions
|
||||||
predicates = None
|
predicates = None
|
||||||
@ -172,6 +170,9 @@ def Filter_generator(options, tax_filter):
|
|||||||
attributes = None
|
attributes = None
|
||||||
if "attributes" in options and len(options["attributes"]) > 0:
|
if "attributes" in options and len(options["attributes"]) > 0:
|
||||||
attributes = options["attributes"]
|
attributes = options["attributes"]
|
||||||
|
for attribute in attributes:
|
||||||
|
if attribute not in i_view:
|
||||||
|
return None
|
||||||
lmax = None
|
lmax = None
|
||||||
if "lmax" in options:
|
if "lmax" in options:
|
||||||
lmax = options["lmax"]
|
lmax = options["lmax"]
|
||||||
@ -197,6 +198,8 @@ def Filter_generator(options, tax_filter):
|
|||||||
if "attribute_patterns" in options and len(options["attribute_patterns"]) > 0:
|
if "attribute_patterns" in options and len(options["attribute_patterns"]) > 0:
|
||||||
for p in options["attribute_patterns"]:
|
for p in options["attribute_patterns"]:
|
||||||
attribute, pattern = p.split(":", 1)
|
attribute, pattern = p.split(":", 1)
|
||||||
|
if attribute not in i_view:
|
||||||
|
return None
|
||||||
attribute_patterns[tobytes(attribute)] = re.compile(tobytes(pattern))
|
attribute_patterns[tobytes(attribute)] = re.compile(tobytes(pattern))
|
||||||
|
|
||||||
def filter(line, loc_env):
|
def filter(line, loc_env):
|
||||||
@ -325,8 +328,16 @@ def run(config):
|
|||||||
|
|
||||||
# Apply filter
|
# Apply filter
|
||||||
tax_filter = Taxonomy_filter_generator(taxo, config["grep"])
|
tax_filter = Taxonomy_filter_generator(taxo, config["grep"])
|
||||||
filter = Filter_generator(config["grep"], tax_filter)
|
filter = Filter_generator(config["grep"], tax_filter, i_view)
|
||||||
selection = Line_selection(i_view)
|
selection = Line_selection(i_view)
|
||||||
|
|
||||||
|
if filter is None and config["grep"]["invert_selection"]: # all sequences are selected: filter is None if no line will be selected because some columns don't exist
|
||||||
|
for i in range(len(i_view)):
|
||||||
|
PyErr_CheckSignals()
|
||||||
|
pb(i)
|
||||||
|
selection.append(i)
|
||||||
|
|
||||||
|
elif filter is not None : # filter is None if no line will be selected because some columns don't exist
|
||||||
for i in range(len(i_view)):
|
for i in range(len(i_view)):
|
||||||
PyErr_CheckSignals()
|
PyErr_CheckSignals()
|
||||||
pb(i)
|
pb(i)
|
||||||
@ -339,7 +350,7 @@ def run(config):
|
|||||||
if good :
|
if good :
|
||||||
selection.append(i)
|
selection.append(i)
|
||||||
|
|
||||||
pb(i, force=True)
|
pb(len(i_view), force=True)
|
||||||
print("", file=sys.stderr)
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
# Create output view with the line selection
|
# Create output view with the line selection
|
||||||
@ -371,7 +382,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.")
|
||||||
|
@ -55,3 +55,4 @@ def run(config):
|
|||||||
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
|
||||||
|
|
||||||
@ -170,8 +180,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) :
|
||||||
view = output[1]
|
view = output[1]
|
||||||
@ -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)
|
||||||
@ -205,6 +269,8 @@ def run(config):
|
|||||||
elif not i%50000:
|
elif not i%50000:
|
||||||
logger("info", "Imported %d entries", i)
|
logger("info", "Imported %d entries", i)
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
if NUC_SEQS_view:
|
if NUC_SEQS_view:
|
||||||
id_col[i] = entry.id
|
id_col[i] = entry.id
|
||||||
def_col[i] = entry.definition
|
def_col[i] = entry.definition
|
||||||
@ -227,6 +293,8 @@ def run(config):
|
|||||||
tag = TAXID_COLUMN
|
tag = TAXID_COLUMN
|
||||||
if tag == b"count":
|
if tag == b"count":
|
||||||
tag = COUNT_COLUMN
|
tag = COUNT_COLUMN
|
||||||
|
if tag[:7] == b"merged_":
|
||||||
|
tag = MERGED_PREFIX+tag[7:]
|
||||||
|
|
||||||
if tag not in dcols :
|
if tag not in dcols :
|
||||||
|
|
||||||
@ -247,6 +315,8 @@ def run(config):
|
|||||||
dcols[tag] = (Column.new_column(view, tag, value_obitype, nb_elements_per_line=nb_elts, elements_names=elt_names), value_obitype)
|
dcols[tag] = (Column.new_column(view, tag, value_obitype, nb_elements_per_line=nb_elts, elements_names=elt_names), value_obitype)
|
||||||
|
|
||||||
# Fill value
|
# 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
|
dcols[tag][0][i] = value
|
||||||
|
|
||||||
# TODO else log error?
|
# TODO else log error?
|
||||||
@ -263,6 +333,12 @@ def run(config):
|
|||||||
rewrite = True
|
rewrite = True
|
||||||
|
|
||||||
try:
|
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 set(dcols[tag][0].elements_names) != set(value.keys()) :
|
||||||
|
raise IndexError # trigger column rewrite
|
||||||
|
|
||||||
# Fill value
|
# Fill value
|
||||||
dcols[tag][0][i] = value
|
dcols[tag][0][i] = value
|
||||||
|
|
||||||
@ -313,6 +389,13 @@ def run(config):
|
|||||||
# Fill value
|
# Fill value
|
||||||
dcols[tag][0][i] = 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:
|
||||||
@ -333,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)
|
||||||
|
|
||||||
|
@ -34,8 +34,10 @@ def run(config):
|
|||||||
if input[2] == DMS and not config['ls']['longformat']:
|
if input[2] == DMS and not config['ls']['longformat']:
|
||||||
dms = input[0]
|
dms = input[0]
|
||||||
l = []
|
l = []
|
||||||
for view in input[0]:
|
for viewname in input[0]:
|
||||||
l.append(tostr(view) + "\t(Date created: " + str(bytes2str_object(dms[view].comments["Date created"]))+")")
|
view = dms[viewname]
|
||||||
|
l.append(tostr(viewname) + "\t(Date created: " + str(bytes2str_object(view.comments["Date created"]))+")")
|
||||||
|
view.close()
|
||||||
l.sort()
|
l.sort()
|
||||||
for v in l:
|
for v in l:
|
||||||
print(v)
|
print(v)
|
||||||
@ -52,3 +54,4 @@ def run(config):
|
|||||||
print("\n### Comments:")
|
print("\n### Comments:")
|
||||||
print(str(input[1].comments))
|
print(str(input[1].comments))
|
||||||
|
|
||||||
|
input[0].close(force=True)
|
||||||
|
@ -13,6 +13,7 @@ from obitools3.libalign.apat_pattern import Primer_search
|
|||||||
from obitools3.dms.obiseq cimport Nuc_Seq
|
from obitools3.dms.obiseq cimport Nuc_Seq
|
||||||
from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL
|
from obitools3.dms.capi.obitypes cimport OBI_SEQ, OBI_QUAL
|
||||||
from obitools3.dms.capi.apat cimport MAX_PATTERN
|
from obitools3.dms.capi.apat cimport MAX_PATTERN
|
||||||
|
from obitools3.dms.capi.obiview cimport REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN
|
||||||
from obitools3.utils cimport tobytes
|
from obitools3.utils cimport tobytes
|
||||||
|
|
||||||
from libc.stdint cimport INT32_MAX
|
from libc.stdint cimport INT32_MAX
|
||||||
@ -22,8 +23,8 @@ import sys
|
|||||||
from cpython.exc cimport PyErr_CheckSignals
|
from cpython.exc cimport PyErr_CheckSignals
|
||||||
|
|
||||||
|
|
||||||
REVERSE_SEQ_COLUMN_NAME = b"REVERSE_SEQUENCE" # used by alignpairedend tool
|
#REVERSE_SEQ_COLUMN_NAME = b"REVERSE_SEQUENCE" # used by alignpairedend tool
|
||||||
REVERSE_QUALITY_COLUMN_NAME = b"REVERSE_QUALITY" # used by alignpairedend tool
|
#REVERSE_QUALITY_COLUMN_NAME = b"REVERSE_QUALITY" # used by alignpairedend tool
|
||||||
|
|
||||||
|
|
||||||
__title__="Assigns sequence records to the corresponding experiment/sample based on DNA tags and primers"
|
__title__="Assigns sequence records to the corresponding experiment/sample based on DNA tags and primers"
|
||||||
@ -41,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",
|
||||||
@ -171,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,
|
||||||
@ -255,17 +265,12 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
return match[1][1]
|
return match[1][1]
|
||||||
|
|
||||||
not_aligned = len(sequences) > 1
|
not_aligned = len(sequences) > 1
|
||||||
sequenceF = sequences[0]
|
sequences[0] = sequences[0].clone()
|
||||||
sequenceR = None
|
|
||||||
if not not_aligned:
|
|
||||||
final_sequence = sequenceF
|
|
||||||
else:
|
|
||||||
final_sequence = sequenceF.clone() # TODO maybe not cloning and then deleting quality tags is more efficient
|
|
||||||
|
|
||||||
if not_aligned:
|
if not_aligned:
|
||||||
sequenceR = sequences[1]
|
sequences[1] = sequences[1].clone()
|
||||||
final_sequence[REVERSE_SEQ_COLUMN_NAME] = sequenceR.seq # used by alignpairedend tool
|
sequences[0][REVERSE_SEQUENCE_COLUMN] = sequences[1].seq # used by alignpairedend tool
|
||||||
final_sequence[REVERSE_QUALITY_COLUMN_NAME] = sequenceR.quality # used by alignpairedend tool
|
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].quality # used by alignpairedend tool
|
||||||
|
|
||||||
for seq in sequences:
|
for seq in sequences:
|
||||||
if hasattr(seq, "quality_array"):
|
if hasattr(seq, "quality_array"):
|
||||||
@ -281,8 +286,6 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
|
|
||||||
# Try direct matching:
|
# Try direct matching:
|
||||||
directmatch = []
|
directmatch = []
|
||||||
first_matched_seq = None
|
|
||||||
second_matched_seq = None
|
|
||||||
for seq in sequences:
|
for seq in sequences:
|
||||||
new_seq = True
|
new_seq = True
|
||||||
pattern = 0
|
pattern = 0
|
||||||
@ -301,42 +304,45 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
directmatch = directmatch[0] if directmatch[0][1] is not None else None
|
directmatch = directmatch[0] if directmatch[0][1] is not None else None
|
||||||
|
|
||||||
if directmatch is None:
|
if directmatch is None:
|
||||||
final_sequence[b'error']=b'No primer match'
|
if not_aligned:
|
||||||
return False, final_sequence
|
sequences[0][REVERSE_SEQUENCE_COLUMN] = sequences[1].seq # used by alignpairedend tool
|
||||||
|
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].quality # used by alignpairedend tool
|
||||||
|
sequences[0][b'error']=b'No primer match'
|
||||||
|
return False, sequences[0]
|
||||||
|
|
||||||
first_matched_seq = directmatch[2]
|
if id(directmatch[2]) == id(sequences[0]):
|
||||||
if id(first_matched_seq) == id(sequenceF) and not_aligned:
|
first_match_first_seq = True
|
||||||
second_matched_seq = sequenceR
|
|
||||||
else:
|
else:
|
||||||
second_matched_seq = sequenceF
|
first_match_first_seq = False
|
||||||
|
|
||||||
match = first_matched_seq[directmatch[1][1]:directmatch[1][2]]
|
match = directmatch[2][directmatch[1][1]:directmatch[1][2]]
|
||||||
|
|
||||||
if not not_aligned:
|
if not not_aligned:
|
||||||
final_sequence[b'seq_length_ori']=len(final_sequence)
|
sequences[0][b'seq_length_ori']=len(sequences[0])
|
||||||
|
|
||||||
if not not_aligned or id(first_matched_seq) == id(sequenceF):
|
if not not_aligned or first_match_first_seq:
|
||||||
final_sequence = final_sequence[directmatch[1][2]:]
|
sequences[0] = sequences[0][directmatch[1][2]:]
|
||||||
else:
|
else:
|
||||||
cut_seq = sequenceR[directmatch[1][2]:]
|
sequences[1] = sequences[1][directmatch[1][2]:]
|
||||||
final_sequence[REVERSE_SEQ_COLUMN_NAME] = cut_seq.seq # used by alignpairedend tool
|
sequences[0][REVERSE_SEQUENCE_COLUMN] = sequences[1].seq # used by alignpairedend tool
|
||||||
final_sequence[REVERSE_QUALITY_COLUMN_NAME] = cut_seq.quality # used by alignpairedend tool
|
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].quality # used by alignpairedend tool
|
||||||
|
|
||||||
if directmatch[0].forward:
|
if directmatch[0].forward:
|
||||||
final_sequence[b'direction']=b'forward'
|
sequences[0][b'direction']=b'forward'
|
||||||
final_sequence[b'forward_errors']=directmatch[1][0]
|
sequences[0][b'forward_errors']=directmatch[1][0]
|
||||||
final_sequence[b'forward_primer']=directmatch[0].raw
|
sequences[0][b'forward_primer']=directmatch[0].raw
|
||||||
final_sequence[b'forward_match']=match.seq
|
sequences[0][b'forward_match']=match.seq
|
||||||
|
|
||||||
else:
|
else:
|
||||||
final_sequence[b'direction']=b'reverse'
|
sequences[0][b'direction']=b'reverse'
|
||||||
final_sequence[b'reverse_errors']=directmatch[1][0]
|
sequences[0][b'reverse_errors']=directmatch[1][0]
|
||||||
final_sequence[b'reverse_primer']=directmatch[0].raw
|
sequences[0][b'reverse_primer']=directmatch[0].raw
|
||||||
final_sequence[b'reverse_match']=match.seq
|
sequences[0][b'reverse_match']=match.seq
|
||||||
|
|
||||||
# Keep only paired reverse primer
|
# Keep only paired reverse primer
|
||||||
infos = infos[directmatch[0]]
|
infos = infos[directmatch[0]]
|
||||||
rev_prim = list(infos.keys())[0]
|
reverse_primer = list(infos.keys())[0]
|
||||||
|
direct_primer = directmatch[0]
|
||||||
|
|
||||||
# If not aligned, look for other match in already computed matches (choose the one that makes the biggest amplicon)
|
# If not aligned, look for other match in already computed matches (choose the one that makes the biggest amplicon)
|
||||||
if not_aligned:
|
if not_aligned:
|
||||||
@ -346,20 +352,48 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
(all_direct_matches[i][1] is None or \
|
(all_direct_matches[i][1] is None or \
|
||||||
all_direct_matches[i][0].forward == directmatch[0].forward or \
|
all_direct_matches[i][0].forward == directmatch[0].forward or \
|
||||||
all_direct_matches[i][0] == directmatch[0] or \
|
all_direct_matches[i][0] == directmatch[0] or \
|
||||||
rev_prim != all_direct_matches[i][0]) :
|
reverse_primer != all_direct_matches[i][0]) :
|
||||||
i+=1
|
i+=1
|
||||||
if i < len(all_direct_matches):
|
if i < len(all_direct_matches):
|
||||||
reversematch = all_direct_matches[i]
|
reversematch = all_direct_matches[i]
|
||||||
else:
|
else:
|
||||||
reversematch = None
|
reversematch = None
|
||||||
|
|
||||||
|
# Cut reverse primer out of 1st matched seq if it contains it, because if it's also in the other sequence, the next step will "choose" only the one on the other sequence
|
||||||
|
if not_aligned:
|
||||||
|
# do it on same seq
|
||||||
|
if first_match_first_seq:
|
||||||
|
r = reverse_primer.revcomp(sequences[0])
|
||||||
|
else:
|
||||||
|
r = reverse_primer.revcomp(sequences[1])
|
||||||
|
if r is not None: # found
|
||||||
|
if first_match_first_seq :
|
||||||
|
sequences[0] = sequences[0][:r[1]]
|
||||||
|
else:
|
||||||
|
sequences[1] = sequences[1][:r[1]]
|
||||||
|
sequences[0][REVERSE_SEQUENCE_COLUMN] = sequences[1].seq # used by alignpairedend tool
|
||||||
|
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].quality # used by alignpairedend tool
|
||||||
|
# do the same on the other seq
|
||||||
|
if first_match_first_seq:
|
||||||
|
r = direct_primer.revcomp(sequences[1])
|
||||||
|
else:
|
||||||
|
r = direct_primer.revcomp(sequences[0])
|
||||||
|
if r is not None: # found
|
||||||
|
if first_match_first_seq:
|
||||||
|
sequences[1] = sequences[1][:r[1]]
|
||||||
|
else:
|
||||||
|
sequences[0] = sequences[0][:r[1]]
|
||||||
|
sequences[0][REVERSE_SEQUENCE_COLUMN] = sequences[1].seq
|
||||||
|
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].quality
|
||||||
|
|
||||||
|
|
||||||
# Look for other primer in the other direction on the sequence, or
|
# Look for other primer in the other direction on the sequence, or
|
||||||
# If sequences are not already aligned and reverse primer not found in most likely sequence (the one without the forward primer), try matching on the same sequence than the first match (primer in the other direction)
|
# If sequences are not already aligned and reverse primer not found in most likely sequence (the one without the forward primer), try matching on the same sequence than the first match (primer in the other direction)
|
||||||
if not not_aligned or (not_aligned and (reversematch is None or reversematch[1] is None)):
|
if not not_aligned or (not_aligned and (reversematch is None or reversematch[1] is None)):
|
||||||
if not not_aligned:
|
if not_aligned and first_match_first_seq:
|
||||||
sequence_to_match = second_matched_seq
|
seq_to_match = sequences[1]
|
||||||
else:
|
else:
|
||||||
sequence_to_match = first_matched_seq
|
seq_to_match = sequences[0]
|
||||||
reversematch = []
|
reversematch = []
|
||||||
# Compute begin
|
# Compute begin
|
||||||
begin=directmatch[1][2]+1 # end of match + 1 on the same sequence
|
begin=directmatch[1][2]+1 # end of match + 1 on the same sequence
|
||||||
@ -376,7 +410,7 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
primer=p
|
primer=p
|
||||||
# Saving original primer as 4th member of the tuple to serve as correct key in infos dict even if it might have been reversed complemented
|
# Saving original primer as 4th member of the tuple to serve as correct key in infos dict even if it might have been reversed complemented
|
||||||
# (3rd member already used by directmatch)
|
# (3rd member already used by directmatch)
|
||||||
reversematch.append((primer, primer(sequence_to_match, same_sequence=not new_seq, pattern=pattern, begin=begin), None, p))
|
reversematch.append((primer, primer(seq_to_match, same_sequence=not new_seq, pattern=pattern, begin=begin), None, p))
|
||||||
new_seq = False
|
new_seq = False
|
||||||
pattern+=1
|
pattern+=1
|
||||||
# Choose match closer to the end of the sequence
|
# Choose match closer to the end of the sequence
|
||||||
@ -389,11 +423,11 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
message = b'No reverse primer match'
|
message = b'No reverse primer match'
|
||||||
else:
|
else:
|
||||||
message = b'No direct primer match'
|
message = b'No direct primer match'
|
||||||
final_sequence[b'error']=message
|
sequences[0][b'error']=message
|
||||||
return False, final_sequence
|
return False, sequences[0]
|
||||||
|
|
||||||
if reversematch is None:
|
if reversematch is None:
|
||||||
final_sequence[b'status']=b'partial'
|
sequences[0][b'status']=b'partial'
|
||||||
|
|
||||||
if directmatch[0].forward:
|
if directmatch[0].forward:
|
||||||
tags=(directmatch[1][3],None)
|
tags=(directmatch[1][3],None)
|
||||||
@ -403,42 +437,50 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
samples = infos[None]
|
samples = infos[None]
|
||||||
|
|
||||||
else:
|
else:
|
||||||
final_sequence[b'status']=b'full'
|
sequences[0][b'status']=b'full'
|
||||||
|
|
||||||
|
if not not_aligned or first_match_first_seq:
|
||||||
|
match = sequences[0][reversematch[1][1]:reversematch[1][2]]
|
||||||
|
else:
|
||||||
|
match = sequences[1][reversematch[1][1]:reversematch[1][2]]
|
||||||
|
|
||||||
match = second_matched_seq[reversematch[1][1]:reversematch[1][2]]
|
|
||||||
match = match.reverse_complement
|
match = match.reverse_complement
|
||||||
|
|
||||||
if not not_aligned or id(second_matched_seq) == id(sequenceF):
|
if not not_aligned:
|
||||||
final_sequence = final_sequence[0:reversematch[1][1]]
|
sequences[0] = sequences[0][0:reversematch[1][1]]
|
||||||
else:
|
elif first_match_first_seq:
|
||||||
cut_seq = sequenceR[reversematch[1][2]:]
|
sequences[1] = sequences[1][reversematch[1][2]:]
|
||||||
if not directmatch[0].forward:
|
if not directmatch[0].forward:
|
||||||
cut_seq = cut_seq.reverse_complement
|
sequences[1] = sequences[1].reverse_complement
|
||||||
final_sequence[REVERSE_SEQ_COLUMN_NAME] = cut_seq.seq # used by alignpairedend tool
|
sequences[0][REVERSE_SEQUENCE_COLUMN] = sequences[1].seq # used by alignpairedend tool
|
||||||
final_sequence[REVERSE_QUALITY_COLUMN_NAME] = cut_seq.quality # used by alignpairedend tool
|
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].quality # used by alignpairedend tool
|
||||||
|
else:
|
||||||
|
sequences[0] = sequences[0][reversematch[1][2]:]
|
||||||
|
|
||||||
if directmatch[0].forward:
|
if directmatch[0].forward:
|
||||||
tags=(directmatch[1][3], reversematch[1][3])
|
tags=(directmatch[1][3], reversematch[1][3])
|
||||||
final_sequence[b'reverse_errors'] = reversematch[1][0]
|
sequences[0][b'reverse_errors'] = reversematch[1][0]
|
||||||
final_sequence[b'reverse_primer'] = reversematch[0].raw
|
sequences[0][b'reverse_primer'] = reversematch[0].raw
|
||||||
final_sequence[b'reverse_match'] = match.seq
|
sequences[0][b'reverse_match'] = match.seq
|
||||||
|
|
||||||
else:
|
else:
|
||||||
tags=(reversematch[1][3], directmatch[1][3])
|
tags=(reversematch[1][3], directmatch[1][3])
|
||||||
final_sequence[b'forward_errors'] = reversematch[1][0]
|
sequences[0][b'forward_errors'] = reversematch[1][0]
|
||||||
final_sequence[b'forward_primer'] = reversematch[0].raw
|
sequences[0][b'forward_primer'] = reversematch[0].raw
|
||||||
final_sequence[b'forward_match'] = match.seq
|
sequences[0][b'forward_match'] = match.seq
|
||||||
|
|
||||||
if tags[0] is not None:
|
if tags[0] is not None:
|
||||||
final_sequence[b'forward_tag'] = tags[0]
|
sequences[0][b'forward_tag'] = tags[0]
|
||||||
if tags[1] is not None:
|
if tags[1] is not None:
|
||||||
final_sequence[b'reverse_tag'] = tags[1]
|
sequences[0][b'reverse_tag'] = tags[1]
|
||||||
|
|
||||||
samples = infos[reversematch[3]]
|
samples = infos[reversematch[3]]
|
||||||
|
|
||||||
if not directmatch[0].forward:
|
if not directmatch[0].forward:
|
||||||
final_sequence = final_sequence.reverse_complement
|
sequences[0] = sequences[0].reverse_complement
|
||||||
final_sequence[b'reversed'] = True # used by the alignpairedend tool (in kmer_similarity.c)
|
sequences[0][b'reversed'] = True # used by the alignpairedend tool (in kmer_similarity.c)
|
||||||
|
else:
|
||||||
|
sequences[0][b'reversed'] = False # used by the alignpairedend tool (in kmer_similarity.c)
|
||||||
|
|
||||||
sample=None
|
sample=None
|
||||||
if not no_tags:
|
if not no_tags:
|
||||||
@ -450,8 +492,8 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
if len(s)==1:
|
if len(s)==1:
|
||||||
sample=s[0]
|
sample=s[0]
|
||||||
elif len(s)>1:
|
elif len(s)>1:
|
||||||
final_sequence[b'error']=b'Did not found reverse tag'
|
sequences[0][b'error']=b'Did not found reverse tag'
|
||||||
return False, final_sequence
|
return False, sequences[0]
|
||||||
else:
|
else:
|
||||||
sample=None
|
sample=None
|
||||||
else:
|
else:
|
||||||
@ -460,21 +502,21 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
if len(s)==1:
|
if len(s)==1:
|
||||||
sample=s[0]
|
sample=s[0]
|
||||||
elif len(s)>1:
|
elif len(s)>1:
|
||||||
final_sequence[b'error']=b'Did not found forward tag'
|
sequences[0][b'error']=b'Did not found forward tag'
|
||||||
return False, final_sequence
|
return False, sequences[0]
|
||||||
else:
|
else:
|
||||||
sample=None
|
sample=None
|
||||||
|
|
||||||
if sample is None:
|
if sample is None:
|
||||||
final_sequence[b'error']=b"No tags found"
|
sequences[0][b'error']=b"No sample with that tag combination"
|
||||||
return False, final_sequence
|
return False, sequences[0]
|
||||||
|
|
||||||
final_sequence.update(sample)
|
sequences[0].update(sample)
|
||||||
|
|
||||||
if not not_aligned:
|
if not not_aligned:
|
||||||
final_sequence[b'seq_length']=len(final_sequence)
|
sequences[0][b'seq_length']=len(sequences[0])
|
||||||
|
|
||||||
return True, final_sequence
|
return True, sequences[0]
|
||||||
|
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
@ -563,7 +605,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
|
||||||
|
try:
|
||||||
infos, primer_list = read_info_view(info_view, max_errors=config['ngsfilter']['error'], verbose=False, not_aligned=not_aligned) # TODO obi verbose option
|
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'])
|
||||||
|
|
||||||
@ -575,11 +623,12 @@ def run(config):
|
|||||||
paired_p.revcomp.aligner = aligner
|
paired_p.revcomp.aligner = aligner
|
||||||
|
|
||||||
if not_aligned: # create columns used by alignpairedend tool
|
if not_aligned: # create columns used by alignpairedend tool
|
||||||
Column.new_column(o_view, REVERSE_SEQ_COLUMN_NAME, OBI_SEQ)
|
Column.new_column(o_view, REVERSE_SEQUENCE_COLUMN, OBI_SEQ)
|
||||||
Column.new_column(o_view, REVERSE_QUALITY_COLUMN_NAME, OBI_QUAL, associated_column_name=REVERSE_SEQ_COLUMN_NAME, associated_column_version=o_view[REVERSE_SEQ_COLUMN_NAME].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)
|
||||||
|
|
||||||
Column.new_column(unidentified, REVERSE_SEQ_COLUMN_NAME, OBI_SEQ)
|
if unidentified is not None:
|
||||||
Column.new_column(unidentified, REVERSE_QUALITY_COLUMN_NAME, OBI_QUAL, associated_column_name=REVERSE_SEQ_COLUMN_NAME, associated_column_version=unidentified[REVERSE_SEQ_COLUMN_NAME].version)
|
Column.new_column(unidentified, REVERSE_SEQUENCE_COLUMN, OBI_SEQ)
|
||||||
|
Column.new_column(unidentified, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=unidentified[REVERSE_SEQUENCE_COLUMN].version)
|
||||||
|
|
||||||
g = 0
|
g = 0
|
||||||
u = 0
|
u = 0
|
||||||
@ -600,7 +649,10 @@ def run(config):
|
|||||||
unidentified[u].set(oseq.id, oseq.seq, definition=oseq.definition, quality=oseq.quality, tags=oseq)
|
unidentified[u].set(oseq.id, oseq.seq, definition=oseq.definition, quality=oseq.quality, tags=oseq)
|
||||||
u+=1
|
u+=1
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
|
if unidentified is not None:
|
||||||
raise RollbackException("obi ngsfilter error, rollbacking views: "+str(e), o_view, unidentified)
|
raise RollbackException("obi ngsfilter error, rollbacking views: "+str(e), o_view, unidentified)
|
||||||
|
else:
|
||||||
|
raise RollbackException("obi ngsfilter error, rollbacking view: "+str(e), o_view)
|
||||||
|
|
||||||
pb(i, force=True)
|
pb(i, force=True)
|
||||||
print("", file=sys.stderr)
|
print("", file=sys.stderr)
|
||||||
@ -617,11 +669,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=*)
|
||||||
|
@ -8,7 +8,8 @@ from obitools3.dms.view import RollbackException
|
|||||||
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
|
from obitools3.dms.view.typed_view.view_NUC_SEQS cimport View_NUC_SEQS
|
||||||
from obitools3.dms.column.column cimport Column, Column_line
|
from obitools3.dms.column.column cimport Column, Column_line
|
||||||
from obitools3.dms.capi.obiview cimport QUALITY_COLUMN, COUNT_COLUMN, NUC_SEQUENCE_COLUMN, ID_COLUMN, TAXID_COLUMN, \
|
from obitools3.dms.capi.obiview cimport QUALITY_COLUMN, COUNT_COLUMN, NUC_SEQUENCE_COLUMN, ID_COLUMN, TAXID_COLUMN, \
|
||||||
TAXID_DIST_COLUMN, MERGED_TAXID_COLUMN, MERGED_COLUMN, MERGED_PREFIX
|
TAXID_DIST_COLUMN, MERGED_TAXID_COLUMN, MERGED_COLUMN, MERGED_PREFIX, \
|
||||||
|
REVERSE_QUALITY_COLUMN
|
||||||
from obitools3.dms.capi.obitypes cimport OBI_INT, OBI_STR, index_t
|
from obitools3.dms.capi.obitypes cimport OBI_INT, OBI_STR, index_t
|
||||||
from obitools3.apps.optiongroups import addMinimalInputOption, \
|
from obitools3.apps.optiongroups import addMinimalInputOption, \
|
||||||
addMinimalOutputOption, \
|
addMinimalOutputOption, \
|
||||||
@ -25,7 +26,6 @@ from cpython.exc cimport PyErr_CheckSignals
|
|||||||
__title__="Group sequence records together"
|
__title__="Group sequence records together"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def addOptions(parser):
|
def addOptions(parser):
|
||||||
|
|
||||||
addMinimalInputOption(parser)
|
addMinimalInputOption(parser)
|
||||||
@ -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"]
|
||||||
|
|
||||||
|
# Initialize the progress bar
|
||||||
|
pb = ProgressBar(len(o_view), config, seconde=5)
|
||||||
|
|
||||||
|
i=0
|
||||||
for seq in o_view:
|
for seq in o_view:
|
||||||
PyErr_CheckSignals()
|
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]
|
||||||
@ -166,19 +179,22 @@ cdef merge_taxonomy_classification(View_NUC_SEQS o_view, Taxonomy taxonomy) :
|
|||||||
fa_sn = None
|
fa_sn = None
|
||||||
tfa = None
|
tfa = None
|
||||||
|
|
||||||
seq[b"species"] = tsp
|
species_column[i] = tsp
|
||||||
seq[b"genus"] = tgn
|
genus_column[i] = tgn
|
||||||
seq[b"family"] = tfa
|
family_column[i] = tfa
|
||||||
|
|
||||||
seq[b"species_name"] = sp_sn
|
species_name_column[i] = sp_sn
|
||||||
seq[b"genus_name"] = gn_sn
|
genus_name_column[i] = gn_sn
|
||||||
seq[b"family_name"] = fa_sn
|
family_name_column[i] = fa_sn
|
||||||
|
|
||||||
seq[b"rank"] = taxonomy.get_rank(taxid)
|
rank_column[i] = taxonomy.get_rank(taxid)
|
||||||
seq[b"scientific_name"] = taxonomy.get_scientific_name(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, 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, dict config, 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
|
||||||
@ -253,6 +271,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):
|
||||||
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,6 +343,10 @@ 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]
|
||||||
|
|
||||||
|
if merged_col_name in view:
|
||||||
|
i_col = view[merged_col_name]
|
||||||
|
else:
|
||||||
i_col = view[key]
|
i_col = view[key]
|
||||||
|
|
||||||
if merged_infos[merged_col_name]['nb_elts'] > max_elts:
|
if merged_infos[merged_col_name]['nb_elts'] > max_elts:
|
||||||
@ -374,23 +401,30 @@ 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("")
|
||||||
logger("info", "Second browsing through the input")
|
logger("info", "Second browsing through the input")
|
||||||
# Initialize the progress bar
|
# Initialize the progress bar
|
||||||
pb = ProgressBar(len(uniques), seconde=5)
|
pb = ProgressBar(len(view), seconde=5)
|
||||||
o_idx = 0
|
o_idx = 0
|
||||||
|
total_treated = 0
|
||||||
|
|
||||||
for unique_id in uniques :
|
for unique_id in uniques :
|
||||||
PyErr_CheckSignals()
|
PyErr_CheckSignals()
|
||||||
pb(o_idx)
|
|
||||||
|
|
||||||
merged_sequences = uniques[unique_id]
|
merged_sequences = uniques[unique_id]
|
||||||
|
|
||||||
@ -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]
|
||||||
@ -419,16 +453,17 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
merged_dict[mkey] = {}
|
merged_dict[mkey] = {}
|
||||||
|
|
||||||
for i_idx in merged_sequences:
|
for i_idx in merged_sequences:
|
||||||
|
pb(total_treated)
|
||||||
|
|
||||||
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):
|
||||||
|
|
||||||
@ -464,12 +499,14 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
else:
|
else:
|
||||||
mcol[key2] = mcol[key2] + i_mcol[key2]
|
mcol[key2] = mcol[key2] + i_mcol[key2]
|
||||||
|
|
||||||
# Write taxid_dist
|
for key in i_seq.keys():
|
||||||
if mergeIds and TAXID_COLUMN in mergedKeys:
|
# Delete informations that differ between the merged sequences
|
||||||
if TAXID_DIST_COLUMN in str_merged_cols:
|
# TODO make special columns list? // could be more efficient
|
||||||
o_taxid_dist_col[o_idx] = str(taxid_dist_dict)
|
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] \
|
||||||
else:
|
and key not in merged_dict :
|
||||||
o_taxid_dist_col[o_idx] = taxid_dist_dict
|
o_seq[key] = None
|
||||||
|
|
||||||
|
total_treated += 1
|
||||||
|
|
||||||
# Write merged dicts
|
# Write merged dicts
|
||||||
for mkey in merged_dict:
|
for mkey in merged_dict:
|
||||||
@ -482,23 +519,33 @@ cdef uniq_sequences(View_NUC_SEQS view, View_NUC_SEQS o_view, ProgressBar pb, li
|
|||||||
# if mkey_cols[mkey][o_idx][key] is None:
|
# if mkey_cols[mkey][o_idx][key] is None:
|
||||||
# mkey_cols[mkey][o_idx][key] = 0
|
# mkey_cols[mkey][o_idx][key] = 0
|
||||||
|
|
||||||
for key in i_seq.keys():
|
# Write taxid_dist
|
||||||
# Delete informations that differ between the merged sequences
|
if mergeIds and TAXID_COLUMN in mergedKeys:
|
||||||
# TODO make special columns list?
|
if TAXID_DIST_COLUMN in str_merged_cols:
|
||||||
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] \
|
o_taxid_dist_col[o_idx] = str(taxid_dist_dict)
|
||||||
and key not in merged_dict :
|
else:
|
||||||
o_seq[key] = None
|
o_taxid_dist_col[o_idx] = taxid_dist_dict
|
||||||
|
|
||||||
|
o_count_col[o_idx] = o_count
|
||||||
o_idx += 1
|
o_idx += 1
|
||||||
|
|
||||||
# Deletes quality column if there is one because the matching between sequence and quality will be broken (quality set to NA when sequence not)
|
pb(len(view), force=True)
|
||||||
|
|
||||||
|
# Deletes quality columns if there is one because the matching between sequence and quality will be broken (quality set to NA when sequence not)
|
||||||
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:
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -544,12 +591,12 @@ def run(config):
|
|||||||
# Initialize the progress bar
|
# Initialize the progress bar
|
||||||
pb = ProgressBar(len(entries), config, seconde=5)
|
pb = ProgressBar(len(entries), config, seconde=5)
|
||||||
|
|
||||||
|
if len(entries) > 0:
|
||||||
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
|
||||||
@ -565,8 +612,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)
|
||||||
|
@ -23,6 +23,7 @@ cdef extern from "obi_ecopcr.h" nogil:
|
|||||||
double salt_concentration,
|
double salt_concentration,
|
||||||
int salt_correction_method,
|
int salt_correction_method,
|
||||||
int keep_nucleotides,
|
int keep_nucleotides,
|
||||||
|
bint keep_primers,
|
||||||
bint kingdom_mode)
|
bint kingdom_mode)
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,6 +24,8 @@ cdef extern from "obiview.h" nogil:
|
|||||||
extern const_char_p ID_COLUMN
|
extern const_char_p ID_COLUMN
|
||||||
extern const_char_p DEFINITION_COLUMN
|
extern const_char_p DEFINITION_COLUMN
|
||||||
extern const_char_p QUALITY_COLUMN
|
extern const_char_p QUALITY_COLUMN
|
||||||
|
extern const_char_p REVERSE_QUALITY_COLUMN
|
||||||
|
extern const_char_p REVERSE_SEQUENCE_COLUMN
|
||||||
extern const_char_p COUNT_COLUMN
|
extern const_char_p COUNT_COLUMN
|
||||||
extern const_char_p TAXID_COLUMN
|
extern const_char_p TAXID_COLUMN
|
||||||
extern const_char_p MERGED_TAXID_COLUMN
|
extern const_char_p MERGED_TAXID_COLUMN
|
||||||
@ -100,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)
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
cdef inline OBIDMS_column_p pointer(self)
|
cdef inline OBIDMS_column_p pointer(self)
|
||||||
cdef read_elements_names(self)
|
cdef read_elements_names(self)
|
||||||
|
cpdef list keys(self)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
cdef type get_column_class(obitype_t obitype, bint multi_elts, bint tuples)
|
cdef type get_column_class(obitype_t obitype, bint multi_elts, bint tuples)
|
||||||
|
@ -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
|
||||||
@ -21,7 +22,11 @@ from ..capi.obiutils cimport obi_format_date
|
|||||||
from ..capi.obiview cimport obi_view_add_column, \
|
from ..capi.obiview cimport obi_view_add_column, \
|
||||||
obi_view_get_pointer_on_column_in_view, \
|
obi_view_get_pointer_on_column_in_view, \
|
||||||
Obiview_p, \
|
Obiview_p, \
|
||||||
NUC_SEQUENCE_COLUMN
|
NUC_SEQUENCE_COLUMN, \
|
||||||
|
QUALITY_COLUMN, \
|
||||||
|
REVERSE_SEQUENCE_COLUMN, \
|
||||||
|
REVERSE_QUALITY_COLUMN
|
||||||
|
|
||||||
|
|
||||||
from ..object cimport OBIDeactivatedInstanceError
|
from ..object cimport OBIDeactivatedInstanceError
|
||||||
|
|
||||||
@ -122,11 +127,18 @@ cdef class Column(OBIWrapper) :
|
|||||||
|
|
||||||
if data_type == OBI_QUAL:
|
if data_type == OBI_QUAL:
|
||||||
if associated_column_name_b == b"":
|
if associated_column_name_b == b"":
|
||||||
|
if column_name == QUALITY_COLUMN:
|
||||||
if NUC_SEQUENCE_COLUMN not in view:
|
if NUC_SEQUENCE_COLUMN not in view:
|
||||||
raise RuntimeError("Cannot create column %s in view %s: trying to create quality column but no NUC_SEQ column to associate it with in the view" % (bytes2str(column_name_b),
|
raise RuntimeError("Cannot create column %s in view %s: trying to create quality column but no NUC_SEQ column to associate it with in the view" % (bytes2str(column_name_b),
|
||||||
bytes2str(view.name)))
|
bytes2str(view.name)))
|
||||||
associated_column_name_b = NUC_SEQUENCE_COLUMN
|
associated_column_name_b = NUC_SEQUENCE_COLUMN
|
||||||
associated_column_version = view[NUC_SEQUENCE_COLUMN].version
|
associated_column_version = view[NUC_SEQUENCE_COLUMN].version
|
||||||
|
elif column_name == REVERSE_QUALITY_COLUMN:
|
||||||
|
if REVERSE_SEQUENCE_COLUMN not in view:
|
||||||
|
raise RuntimeError("Cannot create column %s in view %s: trying to create reverse quality column but no REVERSE_SEQUENCE column to associate it with in the view" % (bytes2str(column_name_b),
|
||||||
|
bytes2str(view.name)))
|
||||||
|
associated_column_name_b = REVERSE_SEQUENCE_COLUMN
|
||||||
|
associated_column_version = view[REVERSE_SEQUENCE_COLUMN].version
|
||||||
|
|
||||||
if (obi_view_add_column(view = view.pointer(),
|
if (obi_view_add_column(view = view.pointer(),
|
||||||
column_name = column_name_b,
|
column_name = column_name_b,
|
||||||
@ -277,7 +289,13 @@ 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)
|
||||||
|
|
||||||
|
|
||||||
@ -305,6 +323,9 @@ cdef class Column(OBIWrapper) :
|
|||||||
free(elts_names_b)
|
free(elts_names_b)
|
||||||
return elts_names_list
|
return elts_names_list
|
||||||
|
|
||||||
|
cpdef list keys(self):
|
||||||
|
return self._elements_names
|
||||||
|
|
||||||
|
|
||||||
# Column alias property getter and setter
|
# Column alias property getter and setter
|
||||||
@property
|
@property
|
||||||
|
@ -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")
|
||||||
|
|
||||||
|
|
||||||
@ -227,7 +227,9 @@ cdef class DMS(OBIWrapper):
|
|||||||
cdef str s
|
cdef str s
|
||||||
s=""
|
s=""
|
||||||
for view_name in self.keys():
|
for view_name in self.keys():
|
||||||
s = s + repr(self.get_view(view_name)) + "\n"
|
view = self.get_view(view_name)
|
||||||
|
s = s + repr(view) + "\n"
|
||||||
|
view.close()
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
@ -254,12 +256,13 @@ 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"#"
|
||||||
s+=command[b"time"]
|
s+=command[b"time"]
|
||||||
s+=b"\n"
|
s+=b"\nobi "
|
||||||
s+=command[b"command"]
|
s+=command[b"command"]
|
||||||
s+=b"\n"
|
s+=b"\n"
|
||||||
return s
|
return s
|
||||||
|
@ -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)
|
||||||
|
|
||||||
@ -297,11 +298,17 @@ cdef class View(OBIWrapper) :
|
|||||||
nb_elements_per_line=new_nb_elements_per_line, elements_names=new_elements_names,
|
nb_elements_per_line=new_nb_elements_per_line, elements_names=new_elements_names,
|
||||||
comments=old_column.comments, alias=column_name_b+tobytes('___new___'))
|
comments=old_column.comments, alias=column_name_b+tobytes('___new___'))
|
||||||
|
|
||||||
|
switch_to_dict = old_column.nb_elements_per_line == 1 and new_nb_elements_per_line > 1
|
||||||
|
ori_key = old_column._elements_names[0]
|
||||||
|
|
||||||
for i in range(length) :
|
for i in range(length) :
|
||||||
|
if switch_to_dict :
|
||||||
|
new_column[i] = {ori_key: old_column[i]}
|
||||||
|
else:
|
||||||
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
|
||||||
@ -519,11 +526,12 @@ 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"
|
s+=b"\n"
|
||||||
return s
|
return s
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
cimport cython
|
cimport cython
|
||||||
from obitools3.dms.view.view cimport Line
|
from obitools3.dms.view.view cimport Line
|
||||||
from obitools3.utils cimport bytes2str_object, str2bytes, tobytes
|
from obitools3.utils cimport bytes2str_object, str2bytes, tobytes
|
||||||
from obitools3.dms.column.column cimport Column_line
|
from obitools3.dms.column.column cimport Column_line, Column_multi_elts
|
||||||
|
|
||||||
|
|
||||||
cdef class TabFormat:
|
cdef class TabFormat:
|
||||||
@ -25,18 +25,28 @@ cdef class TabFormat:
|
|||||||
for k in self.tags:
|
for k in self.tags:
|
||||||
|
|
||||||
if self.header and self.first_line:
|
if self.header and self.first_line:
|
||||||
value = tobytes(k)
|
if isinstance(data.view[k], Column_multi_elts):
|
||||||
|
for k2 in data.view[k].keys():
|
||||||
|
line.append(tobytes(k)+b':'+tobytes(k2))
|
||||||
|
else:
|
||||||
|
line.append(tobytes(k))
|
||||||
else:
|
else:
|
||||||
value = data[k]
|
value = data[k]
|
||||||
if value is not None:
|
if isinstance(data.view[k], Column_multi_elts):
|
||||||
if type(value) == Column_line:
|
if value is None: # all keys at None
|
||||||
value = value.bytes()
|
for k2 in data.view[k].keys(): # TODO could be much more efficient
|
||||||
|
line.append(self.NAString)
|
||||||
else:
|
else:
|
||||||
value = str2bytes(str(bytes2str_object(value))) # genius programming
|
for k2 in data.view[k].keys(): # TODO could be much more efficient
|
||||||
if value is None:
|
if value[k2] is not None:
|
||||||
value = self.NAString
|
line.append(str2bytes(str(bytes2str_object(value[k2])))) # genius programming
|
||||||
|
else:
|
||||||
line.append(value)
|
line.append(self.NAString)
|
||||||
|
else:
|
||||||
|
if value is not None:
|
||||||
|
line.append(str2bytes(str(bytes2str_object(value))))
|
||||||
|
else:
|
||||||
|
line.append(self.NAString)
|
||||||
|
|
||||||
if self.first_line:
|
if self.first_line:
|
||||||
self.first_line = False
|
self.first_line = False
|
||||||
|
@ -6,6 +6,7 @@ from .solexapairend import iterOnAligment
|
|||||||
from .shifted_ali cimport Ali_shifted
|
from .shifted_ali cimport Ali_shifted
|
||||||
|
|
||||||
from obitools3.dms.capi.obiview cimport Obiview_p, QUALITY_COLUMN, NUC_SEQUENCE_COLUMN, \
|
from obitools3.dms.capi.obiview cimport Obiview_p, QUALITY_COLUMN, NUC_SEQUENCE_COLUMN, \
|
||||||
|
REVERSE_SEQUENCE_COLUMN, REVERSE_QUALITY_COLUMN, \
|
||||||
obi_set_qual_int_with_elt_idx_and_col_p_in_view, \
|
obi_set_qual_int_with_elt_idx_and_col_p_in_view, \
|
||||||
obi_set_str_with_elt_idx_and_col_p_in_view
|
obi_set_str_with_elt_idx_and_col_p_in_view
|
||||||
|
|
||||||
@ -13,7 +14,6 @@ from obitools3.dms.capi.obidmscolumn cimport OBIDMS_column_p
|
|||||||
|
|
||||||
from obitools3.dms.view.view cimport View
|
from obitools3.dms.view.view cimport View
|
||||||
from obitools3.dms.column.column cimport Column
|
from obitools3.dms.column.column cimport Column
|
||||||
from obitools3.commands.ngsfilter import REVERSE_SEQ_COLUMN_NAME, REVERSE_QUALITY_COLUMN_NAME
|
|
||||||
|
|
||||||
from math import log10
|
from math import log10
|
||||||
|
|
||||||
@ -188,7 +188,7 @@ def buildConsensus(ali, seq, ref_tags=None):
|
|||||||
seq[b'shift']=ali.shift
|
seq[b'shift']=ali.shift
|
||||||
else:
|
else:
|
||||||
if len(ali[0])>999: # TODO why?
|
if len(ali[0])>999: # TODO why?
|
||||||
raise AssertionError,"Too long alignemnt"
|
raise AssertionError,"Too long alignment"
|
||||||
|
|
||||||
ic=IterOnConsensus(ali)
|
ic=IterOnConsensus(ali)
|
||||||
|
|
||||||
@ -233,7 +233,7 @@ def buildConsensus(ali, seq, ref_tags=None):
|
|||||||
seq[b'mode']=b'alignment'
|
seq[b'mode']=b'alignment'
|
||||||
|
|
||||||
for tag in ref_tags:
|
for tag in ref_tags:
|
||||||
if tag != REVERSE_SEQ_COLUMN_NAME and tag != REVERSE_QUALITY_COLUMN_NAME and \
|
if tag != REVERSE_SEQUENCE_COLUMN and tag != REVERSE_QUALITY_COLUMN and \
|
||||||
tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN:
|
tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN:
|
||||||
seq[tag] = ref_tags[tag]
|
seq[tag] = ref_tags[tag]
|
||||||
|
|
||||||
@ -250,11 +250,21 @@ def buildJoinedSequence(ali, reverse, seq, forward=None):
|
|||||||
quality.extend(reverse.quality)
|
quality.extend(reverse.quality)
|
||||||
seq.set(forward.id +b"_PairedEnd", s, definition=forward.definition, quality=quality)
|
seq.set(forward.id +b"_PairedEnd", s, definition=forward.definition, quality=quality)
|
||||||
seq[b"score"]=ali.score
|
seq[b"score"]=ali.score
|
||||||
|
if len(ali.direction) > 0:
|
||||||
seq[b"ali_direction"]=ali.direction
|
seq[b"ali_direction"]=ali.direction
|
||||||
|
else:
|
||||||
|
seq[b"ali_direction"]=None
|
||||||
seq[b"mode"]=b"joined"
|
seq[b"mode"]=b"joined"
|
||||||
seq[b"pairedend_limit"]=len(forward)
|
seq[b"pairedend_limit"]=len(forward)
|
||||||
|
seq[b"ali_length"] = ali.consensus_len
|
||||||
|
if ali.consensus_len > 0:
|
||||||
|
seq[b"score_norm"]=float(ali.score)/ali.consensus_len
|
||||||
|
else:
|
||||||
|
seq[b"score_norm"]=0.0
|
||||||
|
|
||||||
for tag in forward:
|
for tag in forward:
|
||||||
if tag != REVERSE_SEQ_COLUMN_NAME and tag != REVERSE_QUALITY_COLUMN_NAME:
|
if tag != REVERSE_SEQUENCE_COLUMN and tag != REVERSE_QUALITY_COLUMN and \
|
||||||
|
tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN:
|
||||||
seq[tag] = forward[tag]
|
seq[tag] = forward[tag]
|
||||||
return seq
|
return seq
|
||||||
|
|
||||||
|
@ -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()
|
||||||
@ -52,12 +54,6 @@ 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'.')
|
||||||
|
|
||||||
except Exception as 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
|
|
||||||
# (Python generators can't resume after any exception is raised)
|
|
||||||
return None
|
|
||||||
|
|
||||||
tags = {}
|
tags = {}
|
||||||
extractTaxon(ft, tags)
|
extractTaxon(ft, tags)
|
||||||
|
|
||||||
@ -68,6 +64,12 @@ def genbankParser(bytes text):
|
|||||||
offset=-1,
|
offset=-1,
|
||||||
tags=tags)
|
tags=tags)
|
||||||
|
|
||||||
|
except Exception as 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
|
||||||
|
# (Python generators can't resume after any exception is raised)
|
||||||
|
return None
|
||||||
|
|
||||||
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
|
||||||
|
@ -57,7 +57,7 @@ def ngsfilterIterator(lineiterator,
|
|||||||
split_line = line.split()
|
split_line = line.split()
|
||||||
tags = split_line.pop(2)
|
tags = split_line.pop(2)
|
||||||
tags = tags.split(b":")
|
tags = tags.split(b":")
|
||||||
for t_idx in range(2):
|
for t_idx in range(len(tags)):
|
||||||
if tags[t_idx]==b"-" or tags[t_idx]==b"None" or tags[t_idx]==b"":
|
if tags[t_idx]==b"-" or tags[t_idx]==b"None" or tags[t_idx]==b"":
|
||||||
tags[t_idx] = nastring
|
tags[t_idx] = nastring
|
||||||
if len(tags) == 1: # Forward and reverse tags are the same
|
if len(tags) == 1: # Forward and reverse tags are the same
|
||||||
|
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:
|
||||||
@ -166,7 +166,9 @@ cdef object bytes2str_object(object value): # Only works if complex types are d
|
|||||||
value[k] = bytes2str(v)
|
value[k] = bytes2str(v)
|
||||||
if type(k) == bytes:
|
if type(k) == bytes:
|
||||||
value[bytes2str(k)] = value.pop(k)
|
value[bytes2str(k)] = value.pop(k)
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list) or isinstance(value, tuple):
|
||||||
|
if isinstance(value, tuple):
|
||||||
|
value = list(value)
|
||||||
for i in range(len(value)):
|
for i in range(len(value)):
|
||||||
if isinstance(value[i], list) or isinstance(value[i], dict):
|
if isinstance(value[i], list) or isinstance(value[i], dict):
|
||||||
value[i] = bytes2str_object(value[i])
|
value[i] = bytes2str_object(value[i])
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
major = 3
|
major = 3
|
||||||
minor = 0
|
minor = 0
|
||||||
serial= '0-beta2'
|
serial= '0b26'
|
||||||
|
|
||||||
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
|
28
setup.py
28
setup.py
@ -5,7 +5,8 @@ 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
|
||||||
@ -16,6 +17,8 @@ from distutils.extension import Extension
|
|||||||
|
|
||||||
from distutils.dist import Distribution as ori_Distribution
|
from distutils.dist import Distribution as ori_Distribution
|
||||||
|
|
||||||
|
from python.obitools3.version import version
|
||||||
|
|
||||||
|
|
||||||
class Distribution(ori_Distribution):
|
class Distribution(ori_Distribution):
|
||||||
|
|
||||||
@ -24,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
|
||||||
|
|
||||||
|
|
||||||
@ -68,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"))
|
||||||
|
|
||||||
|
|
||||||
@ -83,12 +93,13 @@ def findPackage(root,base=None):
|
|||||||
|
|
||||||
|
|
||||||
PACKAGE = "OBITools3"
|
PACKAGE = "OBITools3"
|
||||||
VERSION = "3.0.0-beta2"
|
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'
|
||||||
@ -145,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,7 +413,10 @@ Obi_ali_p kmer_similarity(Obiview_p view1, OBIDMS_column_p column1, index_t idx1
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (max_common_kmers > 0)
|
||||||
score = max_common_kmers + kmer_size - 1; // aka the number of nucleotides in the longest stretch of kmers perfectly matching
|
score = max_common_kmers + kmer_size - 1; // aka the number of nucleotides in the longest stretch of kmers perfectly matching
|
||||||
|
else
|
||||||
|
score = 0;
|
||||||
abs_shift = abs(best_shift);
|
abs_shift = abs(best_shift);
|
||||||
|
|
||||||
// Save result in Obi_ali structure
|
// Save result in Obi_ali structure
|
||||||
@ -423,10 +426,15 @@ Obi_ali_p kmer_similarity(Obiview_p view1, OBIDMS_column_p column1, index_t idx1
|
|||||||
ali->shift = abs_shift;
|
ali->shift = abs_shift;
|
||||||
ali->consensus_seq = NULL;
|
ali->consensus_seq = NULL;
|
||||||
ali->consensus_qual = NULL;
|
ali->consensus_qual = NULL;
|
||||||
|
if (score == 0)
|
||||||
|
ali->direction[0] = '\0';
|
||||||
|
else
|
||||||
|
{
|
||||||
if (((best_shift <= 0) && (!switched_seqs)) || ((best_shift > 0) && switched_seqs))
|
if (((best_shift <= 0) && (!switched_seqs)) || ((best_shift > 0) && switched_seqs))
|
||||||
strcpy(ali->direction, "left");
|
strcpy(ali->direction, "left");
|
||||||
else
|
else
|
||||||
strcpy(ali->direction, "right");
|
strcpy(ali->direction, "right");
|
||||||
|
}
|
||||||
|
|
||||||
// Build the consensus sequence if asked
|
// Build the consensus sequence if asked
|
||||||
if (build_consensus)
|
if (build_consensus)
|
||||||
|
@ -409,8 +409,7 @@ int obi_clean(const char* dms_name,
|
|||||||
stop = true;
|
stop = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma omp parallel default(none) \
|
#pragma omp parallel shared(thread_count, seq_count, blob_array, complete_sample_count_array, alignment_result_array, \
|
||||||
shared(thread_count, seq_count, blob_array, complete_sample_count_array, alignment_result_array, \
|
|
||||||
stop, blob1, i, obi_errno, keep_running, stderr, max_ratio, iseq_column, i_view, \
|
stop, blob1, i, obi_errno, keep_running, stderr, max_ratio, iseq_column, i_view, \
|
||||||
similarity_mode, reference, normalize, threshold, ktable, status_column, o_view, sample_count)
|
similarity_mode, reference, normalize, threshold, ktable, status_column, o_view, sample_count)
|
||||||
{
|
{
|
||||||
|
66
src/obi_ecopcr.c
Executable file → Normal file
66
src/obi_ecopcr.c
Executable file → Normal file
@ -77,7 +77,8 @@ static int create_output_columns(Obiview_p o_view, bool kingdom_mode);
|
|||||||
* @param err2 The number of errors in the second primer.
|
* @param err2 The number of errors in the second primer.
|
||||||
* @param strand The DNA strand direction of the amplicon (R(everse) or D(irect)).
|
* @param strand The DNA strand direction of the amplicon (R(everse) or D(irect)).
|
||||||
* @param kingdom_mode Whether the kingdom or the superkingdom informations should be printed to the output.
|
* @param kingdom_mode Whether the kingdom or the superkingdom informations should be printed to the output.
|
||||||
* @param keep_nucleotides Number of nucleotides kept on each side of the amplicon.
|
* @param keep_nucleotides Number of nucleotides kept on each side of the amplicon (not including the primers if they are kept).
|
||||||
|
* @param keep_primers Whether to keep the primers.
|
||||||
* @param i_id_column A pointer on the input sequence identifier column.
|
* @param i_id_column A pointer on the input sequence identifier column.
|
||||||
* @param o_id_column A pointer on the output sequence identifier column.
|
* @param o_id_column A pointer on the output sequence identifier column.
|
||||||
* @param o_ori_seq_len_column A pointer on the original sequence length column.
|
* @param o_ori_seq_len_column A pointer on the original sequence length column.
|
||||||
@ -104,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
|
||||||
@ -124,6 +126,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
int32_t err1, int32_t err2,
|
int32_t err1, int32_t err2,
|
||||||
char strand, bool kingdom_mode,
|
char strand, bool kingdom_mode,
|
||||||
int keep_nucleotides,
|
int keep_nucleotides,
|
||||||
|
bool keep_primers,
|
||||||
OBIDMS_column_p i_id_column, OBIDMS_column_p o_id_column, OBIDMS_column_p o_ori_seq_len_column,
|
OBIDMS_column_p i_id_column, OBIDMS_column_p o_id_column, OBIDMS_column_p o_ori_seq_len_column,
|
||||||
OBIDMS_column_p o_amplicon_column, OBIDMS_column_p o_amplicon_length_column,
|
OBIDMS_column_p o_amplicon_column, OBIDMS_column_p o_amplicon_length_column,
|
||||||
OBIDMS_column_p o_taxid_column, OBIDMS_column_p o_rank_column, OBIDMS_column_p o_name_column,
|
OBIDMS_column_p o_taxid_column, OBIDMS_column_p o_rank_column, OBIDMS_column_p o_name_column,
|
||||||
@ -328,6 +331,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
int32_t err1, int32_t err2,
|
int32_t err1, int32_t err2,
|
||||||
char strand, bool kingdom_mode,
|
char strand, bool kingdom_mode,
|
||||||
int keep_nucleotides,
|
int keep_nucleotides,
|
||||||
|
bool keep_primers,
|
||||||
OBIDMS_column_p i_id_column, OBIDMS_column_p o_id_column, OBIDMS_column_p o_ori_seq_len_column,
|
OBIDMS_column_p i_id_column, OBIDMS_column_p o_id_column, OBIDMS_column_p o_ori_seq_len_column,
|
||||||
OBIDMS_column_p o_amplicon_column, OBIDMS_column_p o_amplicon_length_column,
|
OBIDMS_column_p o_amplicon_column, OBIDMS_column_p o_amplicon_length_column,
|
||||||
OBIDMS_column_p o_taxid_column, OBIDMS_column_p o_rank_column, OBIDMS_column_p o_name_column,
|
OBIDMS_column_p o_taxid_column, OBIDMS_column_p o_rank_column, OBIDMS_column_p o_name_column,
|
||||||
@ -363,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;
|
||||||
|
|
||||||
@ -382,7 +397,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
oligo2[o1->patlen] = 0;
|
oligo2[o1->patlen] = 0;
|
||||||
error2 = err1;
|
error2 = err1;
|
||||||
|
|
||||||
if (keep_nucleotides == 0)
|
if (!keep_primers)
|
||||||
amplicon+=o2->patlen;
|
amplicon+=o2->patlen;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -401,7 +416,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
oligo2[o2->patlen] = 0;
|
oligo2[o2->patlen] = 0;
|
||||||
error2 = err2;
|
error2 = err2;
|
||||||
|
|
||||||
if (keep_nucleotides==0)
|
if (!keep_primers)
|
||||||
amplicon+=o1->patlen;
|
amplicon+=o1->patlen;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -411,16 +426,11 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ecoComplementSequence(oligo2);
|
ecoComplementSequence(oligo2);
|
||||||
if (keep_nucleotides == 0)
|
if (!keep_primers)
|
||||||
amplicon[amplicon_len]=0;
|
amplicon[amplicon_len]=0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
amplicon_len = ldelta+rdelta+amplicon_len;
|
amplicon_len = ldelta+rdelta+amplicon_len;
|
||||||
for (i=0; i<ldelta; i++)
|
|
||||||
amplicon[i]|=32;
|
|
||||||
for (i=1; i<=rdelta; i++)
|
|
||||||
amplicon[amplicon_len-i]|=32;
|
|
||||||
|
|
||||||
amplicon[amplicon_len] = 0;
|
amplicon[amplicon_len] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -433,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");
|
||||||
@ -631,7 +632,7 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -659,6 +660,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
double salt,
|
double salt,
|
||||||
int saltmethod,
|
int saltmethod,
|
||||||
int keep_nucleotides,
|
int keep_nucleotides,
|
||||||
|
bool keep_primers,
|
||||||
bool kingdom_mode)
|
bool kingdom_mode)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -699,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;
|
||||||
@ -717,6 +720,9 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
|
|
||||||
signal(SIGINT, sig_handler);
|
signal(SIGINT, sig_handler);
|
||||||
|
|
||||||
|
if (keep_nucleotides > 0)
|
||||||
|
keep_primers = true;
|
||||||
|
|
||||||
if (circular)
|
if (circular)
|
||||||
{
|
{
|
||||||
circular = strlen(primer1);
|
circular = strlen(primer1);
|
||||||
@ -1055,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,
|
||||||
@ -1076,6 +1082,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
erri, errj,
|
erri, errj,
|
||||||
'D', kingdom_mode,
|
'D', kingdom_mode,
|
||||||
keep_nucleotides,
|
keep_nucleotides,
|
||||||
|
keep_primers,
|
||||||
i_id_column, o_id_column, o_ori_seq_len_column,
|
i_id_column, o_id_column, o_ori_seq_len_column,
|
||||||
o_amplicon_column, o_amplicon_length_column,
|
o_amplicon_column, o_amplicon_length_column,
|
||||||
o_taxid_column, o_rank_column, o_name_column,
|
o_taxid_column, o_rank_column, o_name_column,
|
||||||
@ -1087,11 +1094,13 @@ 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;
|
||||||
}
|
}
|
||||||
|
else if (printed > 0)
|
||||||
o_idx++;
|
o_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1142,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,
|
||||||
@ -1163,6 +1172,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
erri, errj,
|
erri, errj,
|
||||||
'R', kingdom_mode,
|
'R', kingdom_mode,
|
||||||
keep_nucleotides,
|
keep_nucleotides,
|
||||||
|
keep_primers,
|
||||||
i_id_column, o_id_column, o_ori_seq_len_column,
|
i_id_column, o_id_column, o_ori_seq_len_column,
|
||||||
o_amplicon_column, o_amplicon_length_column,
|
o_amplicon_column, o_amplicon_length_column,
|
||||||
o_taxid_column, o_rank_column, o_name_column,
|
o_taxid_column, o_rank_column, o_name_column,
|
||||||
@ -1174,11 +1184,13 @@ 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;
|
||||||
}
|
}
|
||||||
|
else if (printed > 0)
|
||||||
o_idx++;
|
o_idx++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1220,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.
|
||||||
@ -93,8 +93,8 @@
|
|||||||
* @param salt_concentration The salt concentration used for estimating the Tm.
|
* @param salt_concentration The salt concentration used for estimating the Tm.
|
||||||
* @param salt_correction_method The method used for estimating the Tm (melting temperature) between the primers and their corresponding
|
* @param salt_correction_method The method used for estimating the Tm (melting temperature) between the primers and their corresponding
|
||||||
* target sequences. SANTALUCIA: 1, or OWCZARZY: 2.
|
* target sequences. SANTALUCIA: 1, or OWCZARZY: 2.
|
||||||
* @param keep_nucleotides The number of nucleotides to keep on each side of the in silico amplified sequences
|
* @param keep_nucleotides The number of nucleotides to keep on each side of the in silico amplified sequences, not including primers (primers automatically entirely kept if > 0).
|
||||||
* (already including the amplified DNA fragment plus the two target sequences of the primers).
|
* @param keep_primers Whether primers are kept attached to the output sequences.
|
||||||
* @param kingdom_mode Whether the kingdom or the superkingdom informations should be printed to the output.
|
* @param kingdom_mode Whether the kingdom or the superkingdom informations should be printed to the output.
|
||||||
*
|
*
|
||||||
* @returns A value indicating the success of the operation.
|
* @returns A value indicating the success of the operation.
|
||||||
@ -121,6 +121,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
double salt_concentration,
|
double salt_concentration,
|
||||||
int salt_correction_method,
|
int salt_correction_method,
|
||||||
int keep_nucleotides,
|
int keep_nucleotides,
|
||||||
|
bool keep_primers,
|
||||||
bool kingdom_mode);
|
bool kingdom_mode);
|
||||||
|
|
||||||
#endif /* OBI_ECOPCR_H_ */
|
#endif /* OBI_ECOPCR_H_ */
|
||||||
|
@ -71,9 +71,12 @@ static int create_output_columns(Obiview_p o_view);
|
|||||||
* @param name The assigned scientific name.
|
* @param name The assigned scientific name.
|
||||||
* @param assigned_status_column A pointer on the column where the assigned status should be written.
|
* @param assigned_status_column A pointer on the column where the assigned status should be written.
|
||||||
* @param assigned The assigned status (whether the sequence was assigned to a taxon or not).
|
* @param assigned The assigned status (whether the sequence was assigned to a taxon or not).
|
||||||
* @param best_match_column A pointer on the column where the list of ids of the best matches should be written.
|
* @param best_match_ids_column A pointer on the column where the list of ids of the best matches should be written.
|
||||||
* @param best_match_ids The list of ids of the best matches as an array of the concatenated ids separated by '\0'.
|
* @param best_match_ids The list of ids of the best matches as an array of the concatenated ids separated by '\0'.
|
||||||
* @param best_match_ids_length The total length of the array of ids of best matches.
|
* @param best_match_ids_length The total length of the array of ids of best matches.
|
||||||
|
* @param best_match_taxids_column A pointer on the column where the list of taxids of the best matches should be written.
|
||||||
|
* @param best_match_taxids The list of taxids of the best matches as an array of the taxids.
|
||||||
|
* @param best_match_taxids_length The length of the array of taxids of best matches.
|
||||||
* @param score_column A pointer on the column where the score should be written.
|
* @param score_column A pointer on the column where the score should be written.
|
||||||
* @param score The similarity score of the sequence with its best match(es).
|
* @param score The similarity score of the sequence with its best match(es).
|
||||||
*
|
*
|
||||||
@ -87,7 +90,8 @@ int print_assignment_result(Obiview_p output_view, index_t line,
|
|||||||
OBIDMS_column_p assigned_taxid_column, int32_t taxid,
|
OBIDMS_column_p assigned_taxid_column, int32_t taxid,
|
||||||
OBIDMS_column_p assigned_name_column, const char* name,
|
OBIDMS_column_p assigned_name_column, const char* name,
|
||||||
OBIDMS_column_p assigned_status_column, bool assigned,
|
OBIDMS_column_p assigned_status_column, bool assigned,
|
||||||
OBIDMS_column_p best_match_column, const char* best_match_ids, int best_match_ids_length,
|
OBIDMS_column_p best_match_ids_column, const char* best_match_ids, int best_match_ids_length,
|
||||||
|
OBIDMS_column_p best_match_taxids_column, const int32_t* best_match_taxids, int best_match_taxids_length,
|
||||||
OBIDMS_column_p score_column, double score);
|
OBIDMS_column_p score_column, double score);
|
||||||
|
|
||||||
|
|
||||||
@ -100,37 +104,44 @@ 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 best matches in ecotag");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Column for array of best match taxids
|
||||||
|
if (obi_view_add_column(o_view, ECOTAG_BEST_MATCH_TAXIDS_COLUMN_NAME, -1, NULL, OBI_INT, 0, 1, NULL, false, true, false, NULL, NULL, -1, "{}", true) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError creating the column for the array of taxids of best matches in ecotag");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +153,8 @@ int print_assignment_result(Obiview_p output_view, index_t line,
|
|||||||
OBIDMS_column_p assigned_taxid_column, int32_t taxid,
|
OBIDMS_column_p assigned_taxid_column, int32_t taxid,
|
||||||
OBIDMS_column_p assigned_name_column, const char* name,
|
OBIDMS_column_p assigned_name_column, const char* name,
|
||||||
OBIDMS_column_p assigned_status_column, bool assigned,
|
OBIDMS_column_p assigned_status_column, bool assigned,
|
||||||
OBIDMS_column_p best_match_column, const char* best_match_ids, int best_match_ids_length,
|
OBIDMS_column_p best_match_ids_column, const char* best_match_ids, int best_match_ids_length,
|
||||||
|
OBIDMS_column_p best_match_taxids_column, const int32_t* best_match_taxids, int best_match_taxids_length,
|
||||||
OBIDMS_column_p score_column, double score)
|
OBIDMS_column_p score_column, double score)
|
||||||
{
|
{
|
||||||
// Write the assigned taxid
|
// Write the assigned taxid
|
||||||
@ -167,9 +179,16 @@ int print_assignment_result(Obiview_p output_view, index_t line,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write the best match ids
|
// Write the best match ids
|
||||||
if (obi_set_array_with_col_p_in_view(output_view, best_match_column, line, best_match_ids, (uint8_t)(sizeof(char)*8), best_match_ids_length) < 0)
|
if (obi_set_array_with_col_p_in_view(output_view, best_match_ids_column, line, best_match_ids, (uint8_t)(sizeof(char)*8), best_match_ids_length) < 0)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError writing a assignment status in a column when writing ecotag results");
|
obidebug(1, "\nError writing the array of best match ids in a column when writing ecotag results");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write the best match taxids
|
||||||
|
if (obi_set_array_with_col_p_in_view(output_view, best_match_taxids_column, line, best_match_taxids, (uint8_t)(sizeof(OBI_INT)*8), best_match_taxids_length) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError writing the array of best match taxids in a column when writing ecotag results");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,6 +254,8 @@ int obi_ecotag(const char* dms_name,
|
|||||||
char* best_match_ids;
|
char* best_match_ids;
|
||||||
char* best_match_ids_to_store;
|
char* best_match_ids_to_store;
|
||||||
int32_t best_match_ids_length;
|
int32_t best_match_ids_length;
|
||||||
|
int32_t* best_match_taxids;
|
||||||
|
int32_t* best_match_taxids_to_store;
|
||||||
int best_match_count;
|
int best_match_count;
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
int best_match_ids_buffer_size;
|
int best_match_ids_buffer_size;
|
||||||
@ -263,7 +284,8 @@ int obi_ecotag(const char* dms_name,
|
|||||||
OBIDMS_column_p assigned_taxid_column = NULL;
|
OBIDMS_column_p assigned_taxid_column = NULL;
|
||||||
OBIDMS_column_p assigned_name_column = NULL;
|
OBIDMS_column_p assigned_name_column = NULL;
|
||||||
OBIDMS_column_p assigned_status_column = NULL;
|
OBIDMS_column_p assigned_status_column = NULL;
|
||||||
OBIDMS_column_p best_match_column = NULL;
|
OBIDMS_column_p best_match_ids_column = NULL;
|
||||||
|
OBIDMS_column_p best_match_taxids_column = NULL;
|
||||||
OBIDMS_column_p lca_taxid_a_column = NULL;
|
OBIDMS_column_p lca_taxid_a_column = NULL;
|
||||||
OBIDMS_column_p score_a_column = NULL;
|
OBIDMS_column_p score_a_column = NULL;
|
||||||
OBIDMS_column_p ref_taxid_column = NULL;
|
OBIDMS_column_p ref_taxid_column = NULL;
|
||||||
@ -396,7 +418,8 @@ int obi_ecotag(const char* dms_name,
|
|||||||
assigned_taxid_column = obi_view_get_column(output_view, ECOTAG_TAXID_COLUMN_NAME);
|
assigned_taxid_column = obi_view_get_column(output_view, ECOTAG_TAXID_COLUMN_NAME);
|
||||||
assigned_name_column = obi_view_get_column(output_view, ECOTAG_NAME_COLUMN_NAME);
|
assigned_name_column = obi_view_get_column(output_view, ECOTAG_NAME_COLUMN_NAME);
|
||||||
assigned_status_column = obi_view_get_column(output_view, ECOTAG_STATUS_COLUMN_NAME);
|
assigned_status_column = obi_view_get_column(output_view, ECOTAG_STATUS_COLUMN_NAME);
|
||||||
best_match_column = obi_view_get_column(output_view, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME);
|
best_match_ids_column = obi_view_get_column(output_view, ECOTAG_BEST_MATCH_IDS_COLUMN_NAME);
|
||||||
|
best_match_taxids_column = obi_view_get_column(output_view, ECOTAG_BEST_MATCH_TAXIDS_COLUMN_NAME);
|
||||||
score_column = obi_view_get_column(output_view, ECOTAG_SCORE_COLUMN_NAME);
|
score_column = obi_view_get_column(output_view, ECOTAG_SCORE_COLUMN_NAME);
|
||||||
|
|
||||||
// Open the used reference columns
|
// Open the used reference columns
|
||||||
@ -453,9 +476,17 @@ int obi_ecotag(const char* dms_name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
best_match_taxids = (int32_t*) malloc(buffer_size* sizeof(int32_t));
|
||||||
|
if (best_match_taxids == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError allocating memory for the best match taxid array in ecotag");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
@ -514,7 +545,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
|
|
||||||
// Store in best match array
|
// Store in best match array
|
||||||
|
|
||||||
// Grow match array if needed
|
// Grow match and taxid array if needed
|
||||||
if (best_match_count == buffer_size)
|
if (best_match_count == buffer_size)
|
||||||
{
|
{
|
||||||
buffer_size = buffer_size*2;
|
buffer_size = buffer_size*2;
|
||||||
@ -525,6 +556,13 @@ int obi_ecotag(const char* dms_name,
|
|||||||
obidebug(1, "\nError reallocating match array when assigning");
|
obidebug(1, "\nError reallocating match array when assigning");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
best_match_taxids = (int32_t*) realloc(best_match_taxids, buffer_size*sizeof(int32_t));
|
||||||
|
if (best_match_taxids == NULL)
|
||||||
|
{
|
||||||
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
|
obidebug(1, "\nError reallocating match taxids array when assigning");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
id = obi_get_str_with_elt_idx_and_col_p_in_view(ref_view, ref_id_column, j, 0);
|
id = obi_get_str_with_elt_idx_and_col_p_in_view(ref_view, ref_id_column, j, 0);
|
||||||
@ -545,6 +583,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
|
|
||||||
// Save match
|
// Save match
|
||||||
best_match_array[best_match_count] = j;
|
best_match_array[best_match_count] = j;
|
||||||
|
best_match_taxids[best_match_count] = obi_get_int_with_elt_idx_and_col_p_in_view(ref_view, ref_taxid_column, j, 0);
|
||||||
best_match_count++;
|
best_match_count++;
|
||||||
strcpy(best_match_ids+best_match_ids_length, id);
|
strcpy(best_match_ids+best_match_ids_length, id);
|
||||||
best_match_ids_length = best_match_ids_length + id_len + 1;
|
best_match_ids_length = best_match_ids_length + id_len + 1;
|
||||||
@ -562,7 +601,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 +609,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)
|
||||||
{
|
{
|
||||||
@ -629,6 +668,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
else
|
else
|
||||||
lca_name = lca->name;
|
lca_name = lca->name;
|
||||||
best_match_ids_to_store = best_match_ids;
|
best_match_ids_to_store = best_match_ids;
|
||||||
|
best_match_taxids_to_store = best_match_taxids;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -636,6 +676,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
lca_name = OBIStr_NA;
|
lca_name = OBIStr_NA;
|
||||||
lca_taxid = OBIInt_NA;
|
lca_taxid = OBIInt_NA;
|
||||||
best_match_ids_to_store = OBITuple_NA;
|
best_match_ids_to_store = OBITuple_NA;
|
||||||
|
best_match_taxids_to_store = OBITuple_NA;
|
||||||
score = OBIFloat_NA;
|
score = OBIFloat_NA;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -644,7 +685,8 @@ int obi_ecotag(const char* dms_name,
|
|||||||
assigned_taxid_column, lca_taxid,
|
assigned_taxid_column, lca_taxid,
|
||||||
assigned_name_column, lca_name,
|
assigned_name_column, lca_name,
|
||||||
assigned_status_column, assigned,
|
assigned_status_column, assigned,
|
||||||
best_match_column, best_match_ids_to_store, best_match_ids_length,
|
best_match_ids_column, best_match_ids_to_store, best_match_ids_length,
|
||||||
|
best_match_taxids_column, best_match_taxids_to_store, best_match_count,
|
||||||
score_column, best_score
|
score_column, best_score
|
||||||
) < 0)
|
) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -652,6 +694,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
|
|
||||||
free(best_match_array);
|
free(best_match_array);
|
||||||
free(best_match_ids);
|
free(best_match_ids);
|
||||||
|
free(best_match_taxids);
|
||||||
|
|
||||||
obi_close_taxonomy(taxonomy);
|
obi_close_taxonomy(taxonomy);
|
||||||
obi_save_and_close_view(query_view);
|
obi_save_and_close_view(query_view);
|
||||||
|
@ -23,7 +23,8 @@
|
|||||||
#define ECOTAG_TAXID_COLUMN_NAME "TAXID"
|
#define ECOTAG_TAXID_COLUMN_NAME "TAXID"
|
||||||
#define ECOTAG_NAME_COLUMN_NAME "SCIENTIFIC_NAME"
|
#define ECOTAG_NAME_COLUMN_NAME "SCIENTIFIC_NAME"
|
||||||
#define ECOTAG_STATUS_COLUMN_NAME "ID_STATUS"
|
#define ECOTAG_STATUS_COLUMN_NAME "ID_STATUS"
|
||||||
#define ECOTAG_BEST_MATCH_IDS_COLUMN_NAME "BEST_MATCH"
|
#define ECOTAG_BEST_MATCH_IDS_COLUMN_NAME "BEST_MATCH_IDS"
|
||||||
|
#define ECOTAG_BEST_MATCH_TAXIDS_COLUMN_NAME "BEST_MATCH_TAXIDS"
|
||||||
#define ECOTAG_SCORE_COLUMN_NAME "BEST_IDENTITY"
|
#define ECOTAG_SCORE_COLUMN_NAME "BEST_IDENTITY"
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -696,6 +696,12 @@ int obi_clean_dms(const char* dms_path)
|
|||||||
// return -1;
|
// return -1;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
if (obi_close_dms(dms, true) < 0)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError closing a DMS after cleaning");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1490,7 +1496,7 @@ obiversion_t obi_import_column(const char* dms_path_1, const char* dms_path_2, c
|
|||||||
memcpy(column_2->data, column_1->data, header_1->data_size);
|
memcpy(column_2->data, column_1->data, header_1->data_size);
|
||||||
|
|
||||||
// Copy the AVL files if there are some (overwriting the automatically created files)
|
// Copy the AVL files if there are some (overwriting the automatically created files)
|
||||||
if ((header_1->returned_data_type == OBI_STR) || (header_1->returned_data_type == OBI_SEQ) || (header_1->returned_data_type == OBI_QUAL))
|
if ((header_1->tuples) || ((header_1->returned_data_type == OBI_STR) || (header_1->returned_data_type == OBI_SEQ) || (header_1->returned_data_type == OBI_QUAL)))
|
||||||
{
|
{
|
||||||
avl_name_1 = (char*) malloc((strlen(header_1->indexer_name) + 1) * sizeof(char));
|
avl_name_1 = (char*) malloc((strlen(header_1->indexer_name) + 1) * sizeof(char));
|
||||||
if (avl_name_1 == NULL)
|
if (avl_name_1 == NULL)
|
||||||
|
@ -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)
|
||||||
|
@ -1350,6 +1350,8 @@ OBIDMS_column_p obi_create_column(OBIDMS_p dms,
|
|||||||
}
|
}
|
||||||
strncpy(header->indexer_name, final_indexer_name, INDEXER_MAX_NAME);
|
strncpy(header->indexer_name, final_indexer_name, INDEXER_MAX_NAME);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
new_column->indexer = NULL;
|
||||||
|
|
||||||
// Fill the data with NA values
|
// Fill the data with NA values
|
||||||
obi_ini_to_NA_values(new_column, 0, nb_lines);
|
obi_ini_to_NA_values(new_column, 0, nb_lines);
|
||||||
@ -1558,6 +1560,8 @@ OBIDMS_column_p obi_open_column(OBIDMS_p dms,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
column->indexer = NULL;
|
||||||
|
|
||||||
if (close(column_file_descriptor) < 0)
|
if (close(column_file_descriptor) < 0)
|
||||||
{
|
{
|
||||||
@ -1693,8 +1697,8 @@ int obi_close_column(OBIDMS_column_p column)
|
|||||||
if (obi_dms_unlist_column(column->dms, column) < 0)
|
if (obi_dms_unlist_column(column->dms, column) < 0)
|
||||||
ret_val = -1;
|
ret_val = -1;
|
||||||
|
|
||||||
// If the data type is OBI_STR, OBI_SEQ or OBI_QUAL, the associated indexer is closed
|
// If it's a tuple column or the data type is OBI_STR, OBI_SEQ or OBI_QUAL, the associated indexer is closed
|
||||||
if (((column->header)->returned_data_type == OBI_STR) || ((column->header)->returned_data_type == OBI_SEQ) || ((column->header)->returned_data_type == OBI_QUAL))
|
if ((column->indexer) != NULL)
|
||||||
if (obi_close_indexer(column->indexer) < 0)
|
if (obi_close_indexer(column->indexer) < 0)
|
||||||
ret_val = -1;
|
ret_val = -1;
|
||||||
|
|
||||||
@ -1973,7 +1977,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 +2389,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.
|
||||||
*
|
*
|
||||||
|
@ -34,8 +34,8 @@
|
|||||||
* @brief enum for the boolean OBIType.
|
* @brief enum for the boolean OBIType.
|
||||||
*/
|
*/
|
||||||
typedef enum OBIBool {
|
typedef enum OBIBool {
|
||||||
FALSE = 0,
|
OBIFalse = 0,
|
||||||
TRUE = 1,
|
OBITrue = 1,
|
||||||
OBIBool_NA = 2
|
OBIBool_NA = 2
|
||||||
} obibool_t, *obibool_p; /**< a boolean true/false value */ // TODO check name convention?
|
} obibool_t, *obibool_p; /**< a boolean true/false value */ // TODO check name convention?
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -52,6 +52,15 @@
|
|||||||
#define QUALITY_COLUMN "QUALITY" /**< The name of the column containing the sequence qualities
|
#define QUALITY_COLUMN "QUALITY" /**< The name of the column containing the sequence qualities
|
||||||
* in NUC_SEQS_VIEW views.
|
* in NUC_SEQS_VIEW views.
|
||||||
*/
|
*/
|
||||||
|
#define REVERSE_QUALITY_COLUMN "REVERSE_QUALITY" /**< The name of the column containing the sequence qualities
|
||||||
|
* of the reverse read (generated by ngsfilter, used by alignpairedend).
|
||||||
|
*/
|
||||||
|
#define REVERSE_SEQUENCE_COLUMN "REVERSE_SEQUENCE" /**< The name of the column containing the sequence
|
||||||
|
* of the reverse read (generated by ngsfilter, used by alignpairedend).
|
||||||
|
*/
|
||||||
|
#define QUALITY_COLUMN "QUALITY" /**< The name of the column containing the sequence qualities
|
||||||
|
* in NUC_SEQS_VIEW views.
|
||||||
|
*/
|
||||||
#define COUNT_COLUMN "COUNT" /**< The name of the column containing the sequence counts
|
#define COUNT_COLUMN "COUNT" /**< The name of the column containing the sequence counts
|
||||||
* in NUC_SEQS_VIEW views.
|
* in NUC_SEQS_VIEW views.
|
||||||
*/
|
*/
|
||||||
@ -431,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.
|
||||||
@ -439,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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -951,15 +954,15 @@ double generic_sse_banded_lcs_align(char* seq1, char* seq2, double threshold, bo
|
|||||||
// Put the DNA sequences in the int arrays. Longest sequence must be first argument of sse_align function
|
// Put the DNA sequences in the int arrays. Longest sequence must be first argument of sse_align function
|
||||||
if (l2 > l1)
|
if (l2 > l1)
|
||||||
{
|
{
|
||||||
putSeqInSeq(iseq1, seq2, l2, TRUE);
|
putSeqInSeq(iseq1, seq2, l2, true);
|
||||||
putSeqInSeq(iseq2, seq1, l1, FALSE);
|
putSeqInSeq(iseq2, seq1, l1, false);
|
||||||
// Compute alignment
|
// Compute alignment
|
||||||
id = sse_banded_lcs_align(iseq1, iseq2, l2, l1, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
id = sse_banded_lcs_align(iseq1, iseq2, l2, l1, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
putSeqInSeq(iseq1, seq1, l1, TRUE);
|
putSeqInSeq(iseq1, seq1, l1, true);
|
||||||
putSeqInSeq(iseq2, seq2, l2, FALSE);
|
putSeqInSeq(iseq2, seq2, l2, false);
|
||||||
// Compute alignment
|
// Compute alignment
|
||||||
id = sse_banded_lcs_align(iseq1, iseq2, l1, l2, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
id = sse_banded_lcs_align(iseq1, iseq2, l1, l2, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
||||||
}
|
}
|
||||||
@ -1054,15 +1057,15 @@ double obiblob_sse_banded_lcs_align(Obi_blob_p seq1, Obi_blob_p seq2, double thr
|
|||||||
// Put the DNA sequences in the int arrays. Longest sequence must be first argument of sse_align function
|
// Put the DNA sequences in the int arrays. Longest sequence must be first argument of sse_align function
|
||||||
if (l2 > l1)
|
if (l2 > l1)
|
||||||
{
|
{
|
||||||
putBlobInSeq(iseq1, seq2, l2, TRUE);
|
putBlobInSeq(iseq1, seq2, l2, true);
|
||||||
putBlobInSeq(iseq2, seq1, l1, FALSE);
|
putBlobInSeq(iseq2, seq1, l1, false);
|
||||||
// Compute alignment
|
// Compute alignment
|
||||||
id = sse_banded_lcs_align(iseq1, iseq2, l2, l1, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
id = sse_banded_lcs_align(iseq1, iseq2, l2, l1, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
putBlobInSeq(iseq1, seq1, l1, TRUE);
|
putBlobInSeq(iseq1, seq1, l1, true);
|
||||||
putBlobInSeq(iseq2, seq2, l2, FALSE);
|
putBlobInSeq(iseq2, seq2, l2, false);
|
||||||
// Compute alignment
|
// Compute alignment
|
||||||
id = sse_banded_lcs_align(iseq1, iseq2, l1, l2, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
id = sse_banded_lcs_align(iseq1, iseq2, l1, l2, normalize, reference, similarity_mode, address, LCSmin, lcs_length, ali_length);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user