Compare commits
48 Commits
Author | SHA1 | Date | |
---|---|---|---|
4f39bb2418 | |||
0a2b8adb50 | |||
f9b99a9397 | |||
ce2833c04b | |||
f64b3da30b | |||
388b3e0410 | |||
c9db990b83 | |||
3f253feb5e | |||
85d2bab607 | |||
53b3d81137 | |||
f6353fbf28 | |||
5a8b9dca5d | |||
8bd6d6c8e9 | |||
405e6ef420 | |||
fedacfafe7 | |||
2d66e0e965 | |||
f43856b712 | |||
9e0c319806 | |||
58b42cd977 | |||
34de90bce6 | |||
4be9f36f99 | |||
f10e78ba3c | |||
88c8463ed7 | |||
89168271ef | |||
82d2642000 | |||
99c1cd60d6 | |||
ce7ae4ac55 | |||
0b4283bb58 | |||
747f3efbb2 | |||
6c1a3aff47 | |||
e2932b05f2 | |||
32345b9ec4 | |||
9334cf6cc6 | |||
8ec13a294c | |||
3e45c34491 | |||
c2f3d90dc1 | |||
6b732d11d3 | |||
9eb833a0af | |||
6b7b0e3bd1 | |||
47691a8f58 | |||
b908b581c8 | |||
03c174fd7a | |||
2156588ff6 | |||
6ff29c6a6a | |||
51a3c68fb5 | |||
da91ffc2c7 | |||
c884615522 | |||
cb53381863 |
@ -49,7 +49,19 @@ def __addImportInputOption(optionManager):
|
|||||||
action="store_const", dest="obi:inputformat",
|
action="store_const", dest="obi:inputformat",
|
||||||
default=None,
|
default=None,
|
||||||
const=b'silva',
|
const=b'silva',
|
||||||
help="Input file is in SILVA fasta format")
|
help="Input file is in SILVA fasta format. If NCBI taxonomy provided with --taxonomy, taxid and scientific name will be added for each sequence.")
|
||||||
|
|
||||||
|
group.add_argument('--rdp-input',
|
||||||
|
action="store_const", dest="obi:inputformat",
|
||||||
|
default=None,
|
||||||
|
const=b'rdp',
|
||||||
|
help="Input file is in RDP training set fasta format. If NCBI taxonomy provided with --taxonomy, taxid and scientific name will be added for each sequence.")
|
||||||
|
|
||||||
|
group.add_argument('--unite-input',
|
||||||
|
action="store_const", dest="obi:inputformat",
|
||||||
|
default=None,
|
||||||
|
const=b'unite',
|
||||||
|
help="Input file is in UNITE fasta format. If NCBI taxonomy provided with --taxonomy, taxid and scientific name will be added for each sequence.")
|
||||||
|
|
||||||
group.add_argument('--embl-input',
|
group.add_argument('--embl-input',
|
||||||
action="store_const", dest="obi:inputformat",
|
action="store_const", dest="obi:inputformat",
|
||||||
@ -131,10 +143,10 @@ def __addImportInputOption(optionManager):
|
|||||||
def __addTabularOption(optionManager):
|
def __addTabularOption(optionManager):
|
||||||
group = optionManager.add_argument_group("Input and output format options for tabular files")
|
group = optionManager.add_argument_group("Input and output format options for tabular files")
|
||||||
|
|
||||||
group.add_argument('--header',
|
group.add_argument('--no-header',
|
||||||
action="store_true", dest="obi:header",
|
action="store_false", dest="obi:header",
|
||||||
default=False,
|
default=True,
|
||||||
help="First line of tabular file contains column names")
|
help="Don't print the header (first line with column names")
|
||||||
|
|
||||||
group.add_argument('--sep',
|
group.add_argument('--sep',
|
||||||
action="store", dest="obi:sep",
|
action="store", dest="obi:sep",
|
||||||
@ -171,6 +183,16 @@ def __addTabularInputOption(optionManager):
|
|||||||
help="Lines starting by this char are considered as comment")
|
help="Lines starting by this char are considered as comment")
|
||||||
|
|
||||||
|
|
||||||
|
def __addTabularOutputOption(optionManager):
|
||||||
|
group = optionManager.add_argument_group("Output format options for tabular files")
|
||||||
|
|
||||||
|
__addTabularOption(optionManager)
|
||||||
|
|
||||||
|
group.add_argument('--na-int-stay-na',
|
||||||
|
action="store_false", dest="obi:na_int_to_0",
|
||||||
|
help="NA (Non available) integer values should be exported as NA in tabular output (default: they are converted to 0 for tabular output).") # TODO
|
||||||
|
|
||||||
|
|
||||||
def __addTaxdumpInputOption(optionManager): # TODO maybe not the best way to do it
|
def __addTaxdumpInputOption(optionManager): # TODO maybe not the best way to do it
|
||||||
group = optionManager.add_argument_group("Input format options for taxdump")
|
group = optionManager.add_argument_group("Input format options for taxdump")
|
||||||
|
|
||||||
@ -204,6 +226,10 @@ def addTabularInputOption(optionManager):
|
|||||||
__addTabularInputOption(optionManager)
|
__addTabularInputOption(optionManager)
|
||||||
|
|
||||||
|
|
||||||
|
def addTabularOutputOption(optionManager):
|
||||||
|
__addTabularOutputOption(optionManager)
|
||||||
|
|
||||||
|
|
||||||
def addTaxonomyOption(optionManager):
|
def addTaxonomyOption(optionManager):
|
||||||
__addTaxonomyOption(optionManager)
|
__addTaxonomyOption(optionManager)
|
||||||
|
|
||||||
@ -216,6 +242,7 @@ def addAllInputOption(optionManager):
|
|||||||
__addInputOption(optionManager)
|
__addInputOption(optionManager)
|
||||||
__addImportInputOption(optionManager)
|
__addImportInputOption(optionManager)
|
||||||
__addTabularInputOption(optionManager)
|
__addTabularInputOption(optionManager)
|
||||||
|
__addTabularOutputOption(optionManager)
|
||||||
__addTaxonomyOption(optionManager)
|
__addTaxonomyOption(optionManager)
|
||||||
__addTaxdumpInputOption(optionManager)
|
__addTaxdumpInputOption(optionManager)
|
||||||
|
|
||||||
@ -276,6 +303,35 @@ def __addExportOutputOption(optionManager):
|
|||||||
const=b'tabular',
|
const=b'tabular',
|
||||||
help="Output file is in tabular format")
|
help="Output file is in tabular format")
|
||||||
|
|
||||||
|
group.add_argument('--metabaR-output',
|
||||||
|
action="store_const", dest="obi:outputformat",
|
||||||
|
default=None,
|
||||||
|
const=b'metabaR',
|
||||||
|
help="Export the files needed by the obifiles_to_metabarlist function of the metabaR package")
|
||||||
|
|
||||||
|
group.add_argument('--metabaR-prefix',
|
||||||
|
action="store", dest="obi:metabarprefix",
|
||||||
|
type=str,
|
||||||
|
help="Prefix for the files when using --metabaR-output option")
|
||||||
|
|
||||||
|
group.add_argument('--metabaR-ngsfilter',
|
||||||
|
action="store", dest="obi:metabarngsfilter",
|
||||||
|
type=str,
|
||||||
|
default=None,
|
||||||
|
help="URI to the ngsfilter view when using --metabaR-output option (if not provided, it is not exported)")
|
||||||
|
|
||||||
|
group.add_argument('--metabaR-samples',
|
||||||
|
action="store", dest="obi:metabarsamples",
|
||||||
|
type=str,
|
||||||
|
default=None,
|
||||||
|
help="URI to the sample metadata view when using --metabaR-output option (if not provided, it is built as just a list of the sample names)")
|
||||||
|
|
||||||
|
group.add_argument('--only-keys',
|
||||||
|
action="append", dest="obi:only_keys",
|
||||||
|
type=str,
|
||||||
|
default=[],
|
||||||
|
help="Only export the given keys (columns).")
|
||||||
|
|
||||||
group.add_argument('--print-na',
|
group.add_argument('--print-na',
|
||||||
action="store_true", dest="obi:printna",
|
action="store_true", dest="obi:printna",
|
||||||
default=False,
|
default=False,
|
||||||
@ -308,14 +364,14 @@ def addTabularOutputOption(optionManager):
|
|||||||
|
|
||||||
def addExportOutputOption(optionManager):
|
def addExportOutputOption(optionManager):
|
||||||
__addExportOutputOption(optionManager)
|
__addExportOutputOption(optionManager)
|
||||||
__addTabularOption(optionManager)
|
__addTabularOutputOption(optionManager)
|
||||||
|
|
||||||
|
|
||||||
def addAllOutputOption(optionManager):
|
def addAllOutputOption(optionManager):
|
||||||
__addOutputOption(optionManager)
|
__addOutputOption(optionManager)
|
||||||
__addDMSOutputOption(optionManager)
|
__addDMSOutputOption(optionManager)
|
||||||
__addExportOutputOption(optionManager)
|
__addExportOutputOption(optionManager)
|
||||||
__addTabularOption(optionManager)
|
__addTabularOutputOption(optionManager)
|
||||||
|
|
||||||
|
|
||||||
def addNoProgressBarOption(optionManager):
|
def addNoProgressBarOption(optionManager):
|
||||||
|
@ -45,7 +45,7 @@ def addOptions(parser):
|
|||||||
metavar="<TAXID_TAG>",
|
metavar="<TAXID_TAG>",
|
||||||
default=b"TAXID",
|
default=b"TAXID",
|
||||||
help="Name of the tag to store the found taxid "
|
help="Name of the tag to store the found taxid "
|
||||||
"(default: 'TAXID'.")
|
"(default: 'TAXID').")
|
||||||
|
|
||||||
group.add_argument('-n', '--taxon-name-tag',
|
group.add_argument('-n', '--taxon-name-tag',
|
||||||
action="store",
|
action="store",
|
||||||
@ -53,7 +53,7 @@ def addOptions(parser):
|
|||||||
metavar="<SCIENTIFIC_NAME_TAG>",
|
metavar="<SCIENTIFIC_NAME_TAG>",
|
||||||
default=b"SCIENTIFIC_NAME",
|
default=b"SCIENTIFIC_NAME",
|
||||||
help="Name of the tag giving the scientific name of the taxon "
|
help="Name of the tag giving the scientific name of the taxon "
|
||||||
"(default: 'SCIENTIFIC_NAME'.")
|
"(default: 'SCIENTIFIC_NAME').")
|
||||||
|
|
||||||
group.add_argument('-g', '--try-genus-match',
|
group.add_argument('-g', '--try-genus-match',
|
||||||
action="store_true", dest="addtaxids:try_genus_match",
|
action="store_true", dest="addtaxids:try_genus_match",
|
||||||
@ -174,6 +174,7 @@ def run(config):
|
|||||||
taxid_column[i] = taxon.taxid
|
taxid_column[i] = taxon.taxid
|
||||||
found_count+=1
|
found_count+=1
|
||||||
elif try_genus: # try finding genus or other parent taxon from the first word
|
elif try_genus: # try finding genus or other parent taxon from the first word
|
||||||
|
#print(i, o_view[i].id)
|
||||||
taxon_name_sp = taxon_name.split(b" ")
|
taxon_name_sp = taxon_name.split(b" ")
|
||||||
taxon = taxo.get_taxon_by_name(taxon_name_sp[0], res_anc)
|
taxon = taxo.get_taxon_by_name(taxon_name_sp[0], res_anc)
|
||||||
if taxon is not None:
|
if taxon is not None:
|
||||||
|
@ -158,7 +158,7 @@ def run(config):
|
|||||||
i_view_name = i_uri.split(b"/")[0]
|
i_view_name = i_uri.split(b"/")[0]
|
||||||
i_column_name = b""
|
i_column_name = b""
|
||||||
i_element_name = b""
|
i_element_name = b""
|
||||||
if len(i_uri.split(b"/")) == 2:
|
if len(i_uri.split(b"/")) >= 2:
|
||||||
i_column_name = i_uri.split(b"/")[1]
|
i_column_name = i_uri.split(b"/")[1]
|
||||||
if len(i_uri.split(b"/")) == 3:
|
if len(i_uri.split(b"/")) == 3:
|
||||||
i_element_name = i_uri.split(b"/")[2]
|
i_element_name = i_uri.split(b"/")[2]
|
||||||
@ -181,7 +181,7 @@ def run(config):
|
|||||||
i_dms_name_2 = i_dms_2.name
|
i_dms_name_2 = i_dms_2.name
|
||||||
i_uri_2 = input_2[1]
|
i_uri_2 = input_2[1]
|
||||||
original_i_view_name_2 = i_uri_2.split(b"/")[0]
|
original_i_view_name_2 = i_uri_2.split(b"/")[0]
|
||||||
if len(i_uri_2.split(b"/")) == 2:
|
if len(i_uri_2.split(b"/")) >= 2:
|
||||||
i_column_name_2 = i_uri_2.split(b"/")[1]
|
i_column_name_2 = i_uri_2.split(b"/")[1]
|
||||||
if len(i_uri_2.split(b"/")) == 3:
|
if len(i_uri_2.split(b"/")) == 3:
|
||||||
i_element_name_2 = i_uri_2.split(b"/")[2]
|
i_element_name_2 = i_uri_2.split(b"/")[2]
|
||||||
|
@ -16,6 +16,8 @@ from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, \
|
|||||||
QUALITY_COLUMN, \
|
QUALITY_COLUMN, \
|
||||||
COUNT_COLUMN, \
|
COUNT_COLUMN, \
|
||||||
TAXID_COLUMN
|
TAXID_COLUMN
|
||||||
|
from obitools3.dms.capi.obitypes cimport OBI_STR
|
||||||
|
from obitools3.dms.column.column cimport Column
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import math
|
import math
|
||||||
@ -187,6 +189,8 @@ def sequenceTaggerGenerator(config, taxo=None):
|
|||||||
else:
|
else:
|
||||||
scn=None
|
scn=None
|
||||||
seq[rank]=rtaxid
|
seq[rank]=rtaxid
|
||||||
|
if "%s_name"%rank not in seq.view:
|
||||||
|
Column.new_column(seq.view, "%s_name"%rank, OBI_STR)
|
||||||
seq["%s_name"%rank]=scn
|
seq["%s_name"%rank]=scn
|
||||||
|
|
||||||
if add_rank:
|
if add_rank:
|
||||||
|
@ -31,10 +31,9 @@ def addOptions(parser):
|
|||||||
group.add_argument('--threshold','-t',
|
group.add_argument('--threshold','-t',
|
||||||
action="store", dest="build_ref_db:threshold",
|
action="store", dest="build_ref_db:threshold",
|
||||||
metavar='<THRESHOLD>',
|
metavar='<THRESHOLD>',
|
||||||
default=0.0,
|
default=0.99,
|
||||||
type=float,
|
type=float,
|
||||||
help="Score threshold as a normalized identity, e.g. 0.95 for an identity of 95%%. Default: 0.00"
|
help="Score threshold as a normalized identity, e.g. 0.95 for an identity of 95%%. Default: 0.99.")
|
||||||
" (no threshold).")
|
|
||||||
|
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
|
@ -97,7 +97,7 @@ def run(config):
|
|||||||
Column.new_column(o_view, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=o_view[REVERSE_SEQUENCE_COLUMN].version)
|
Column.new_column(o_view, REVERSE_QUALITY_COLUMN, OBI_QUAL, associated_column_name=REVERSE_SEQUENCE_COLUMN, associated_column_version=o_view[REVERSE_SEQUENCE_COLUMN].version)
|
||||||
|
|
||||||
# Initialize multiple elements columns
|
# Initialize multiple elements columns
|
||||||
if type(output_0)==BufferedWriter:
|
if type(output_0)!=BufferedWriter:
|
||||||
dict_cols = {}
|
dict_cols = {}
|
||||||
for v_uri in config["cat"]["views_to_cat"]:
|
for v_uri in config["cat"]["views_to_cat"]:
|
||||||
v = open_uri(v_uri)[1]
|
v = open_uri(v_uri)[1]
|
||||||
@ -134,7 +134,11 @@ def run(config):
|
|||||||
rep = repr(entry)
|
rep = repr(entry)
|
||||||
output_0.write(str2bytes(rep)+b"\n")
|
output_0.write(str2bytes(rep)+b"\n")
|
||||||
else:
|
else:
|
||||||
o_view[i] = entry
|
try:
|
||||||
|
o_view[i] = entry
|
||||||
|
except:
|
||||||
|
print("\nError with entry:", repr(entry))
|
||||||
|
print(repr(o_view))
|
||||||
i+=1
|
i+=1
|
||||||
v.close()
|
v.close()
|
||||||
|
|
||||||
|
@ -54,11 +54,11 @@ def addOptions(parser):
|
|||||||
default=False,
|
default=False,
|
||||||
help="Only sequences labeled as heads are kept in the output. Default: False")
|
help="Only sequences labeled as heads are kept in the output. Default: False")
|
||||||
|
|
||||||
group.add_argument('--cluster-tags', '-C',
|
# group.add_argument('--cluster-tags', '-C',
|
||||||
action="store_true",
|
# action="store_true",
|
||||||
dest="clean:cluster-tags",
|
# dest="clean:cluster-tags",
|
||||||
default=False,
|
# default=False,
|
||||||
help="Adds tags for each sequence giving its cluster's head and weight for each sample.")
|
# help="Adds tags for each sequence giving its cluster's head and weight for each sample.")
|
||||||
|
|
||||||
group.add_argument('--thread-count','-p', # TODO should probably be in a specific option group
|
group.add_argument('--thread-count','-p', # TODO should probably be in a specific option group
|
||||||
action="store", dest="clean:thread-count",
|
action="store", dest="clean:thread-count",
|
||||||
@ -142,4 +142,5 @@ def run(config):
|
|||||||
|
|
||||||
i_dms.close(force=True)
|
i_dms.close(force=True)
|
||||||
|
|
||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
|
|
@ -29,6 +29,12 @@ def addOptions(parser):
|
|||||||
default=False,
|
default=False,
|
||||||
help="Prints only the total count of sequence records (if a sequence has no `count` attribute, its default count is 1) (default: False).")
|
help="Prints only the total count of sequence records (if a sequence has no `count` attribute, its default count is 1) (default: False).")
|
||||||
|
|
||||||
|
group.add_argument('-c','--count-tag',
|
||||||
|
action="store", dest="count:countcol",
|
||||||
|
default='COUNT',
|
||||||
|
type=str,
|
||||||
|
help="Name of the tag/column associated with the count information (default: COUNT).")
|
||||||
|
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
|
|
||||||
@ -41,18 +47,20 @@ def run(config):
|
|||||||
if input is None:
|
if input is None:
|
||||||
raise Exception("Could not read input")
|
raise Exception("Could not read input")
|
||||||
entries = input[1]
|
entries = input[1]
|
||||||
|
|
||||||
|
countcol = config['count']['countcol']
|
||||||
|
|
||||||
count1 = len(entries)
|
count1 = len(entries)
|
||||||
count2 = 0
|
count2 = 0
|
||||||
|
|
||||||
if COUNT_COLUMN in entries and ((config['count']['sequence'] == config['count']['all']) or (config['count']['all'])) :
|
if countcol in entries and ((config['count']['sequence'] == config['count']['all']) or (config['count']['all'])) :
|
||||||
for e in entries:
|
for e in entries:
|
||||||
PyErr_CheckSignals()
|
PyErr_CheckSignals()
|
||||||
count2+=e[COUNT_COLUMN]
|
count2+=e[countcol]
|
||||||
|
|
||||||
if COUNT_COLUMN in entries and (config['count']['sequence'] == config['count']['all']):
|
if countcol in entries and (config['count']['sequence'] == config['count']['all']):
|
||||||
print(count1,count2)
|
print(count1,count2)
|
||||||
elif COUNT_COLUMN in entries and config['count']['all']:
|
elif countcol in entries and config['count']['all']:
|
||||||
print(count2)
|
print(count2)
|
||||||
else:
|
else:
|
||||||
print(count1)
|
print(count1)
|
||||||
|
@ -175,6 +175,14 @@ def run(config):
|
|||||||
o_dms_name = output[0].name
|
o_dms_name = output[0].name
|
||||||
o_view_name = output[1]
|
o_view_name = output[1]
|
||||||
|
|
||||||
|
# Open the taxonomy DMS
|
||||||
|
taxdms = open_uri(config['obi']['taxoURI'],
|
||||||
|
dms_only=True)
|
||||||
|
if taxdms is None:
|
||||||
|
raise Exception("Could not open taxonomy DMS")
|
||||||
|
tax_dms = taxdms[0]
|
||||||
|
tax_dms_name = taxdms[0].name
|
||||||
|
|
||||||
# Read taxonomy name
|
# Read taxonomy name
|
||||||
taxonomy_name = config['obi']['taxoURI'].split("/")[-1] # Robust in theory
|
taxonomy_name = config['obi']['taxoURI'].split("/")[-1] # Robust in theory
|
||||||
|
|
||||||
@ -197,7 +205,8 @@ def run(config):
|
|||||||
|
|
||||||
# TODO: primers in comments?
|
# TODO: primers in comments?
|
||||||
|
|
||||||
if obi_ecopcr(i_dms.name_with_full_path, tobytes(i_view_name), tobytes(taxonomy_name), \
|
if obi_ecopcr(i_dms.name_with_full_path, tobytes(i_view_name),
|
||||||
|
tax_dms.name_with_full_path, tobytes(taxonomy_name), \
|
||||||
o_dms.name_with_full_path, tobytes(o_view_name), comments, \
|
o_dms.name_with_full_path, tobytes(o_view_name), comments, \
|
||||||
tobytes(config['ecopcr']['primer1']), tobytes(config['ecopcr']['primer2']), \
|
tobytes(config['ecopcr']['primer1']), tobytes(config['ecopcr']['primer2']), \
|
||||||
config['ecopcr']['error'], \
|
config['ecopcr']['error'], \
|
||||||
|
@ -6,6 +6,9 @@ from obitools3.apps.config import logger
|
|||||||
from obitools3.dms import DMS
|
from obitools3.dms import DMS
|
||||||
from obitools3.dms.obiseq import Nuc_Seq
|
from obitools3.dms.obiseq import Nuc_Seq
|
||||||
from obitools3.dms.capi.obiview cimport QUALITY_COLUMN
|
from obitools3.dms.capi.obiview cimport QUALITY_COLUMN
|
||||||
|
from obitools3.writers.tab import TabWriter
|
||||||
|
from obitools3.format.tab import TabFormat
|
||||||
|
from obitools3.utils cimport tobytes, tostr
|
||||||
|
|
||||||
from obitools3.apps.optiongroups import addMinimalInputOption, \
|
from obitools3.apps.optiongroups import addMinimalInputOption, \
|
||||||
addExportOutputOption, \
|
addExportOutputOption, \
|
||||||
@ -76,6 +79,13 @@ def run(config):
|
|||||||
else:
|
else:
|
||||||
pb = ProgressBar(withoutskip - skip, config)
|
pb = ProgressBar(withoutskip - skip, config)
|
||||||
|
|
||||||
|
if config['obi']['outputformat'] == b'metabaR':
|
||||||
|
# Check prefix
|
||||||
|
if "metabarprefix" not in config["obi"]:
|
||||||
|
raise Exception("Prefix needed when exporting for metabaR (--metabaR-prefix option)")
|
||||||
|
else:
|
||||||
|
metabaRprefix = config["obi"]["metabarprefix"]
|
||||||
|
|
||||||
i=0
|
i=0
|
||||||
for seq in iview :
|
for seq in iview :
|
||||||
PyErr_CheckSignals()
|
PyErr_CheckSignals()
|
||||||
@ -91,6 +101,81 @@ def run(config):
|
|||||||
pb(i, force=True)
|
pb(i, force=True)
|
||||||
print("", file=sys.stderr)
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
|
if config['obi']['outputformat'] == b'metabaR':
|
||||||
|
|
||||||
|
# Export ngsfilter file if view provided
|
||||||
|
if 'metabarngsfilter' in config['obi']:
|
||||||
|
ngsfilter_input = open_uri(config['obi']['metabarngsfilter'])
|
||||||
|
if ngsfilter_input is None:
|
||||||
|
raise Exception("Could not read ngsfilter view for metabaR output")
|
||||||
|
ngsfilter_view = ngsfilter_input[1]
|
||||||
|
|
||||||
|
ngsfilter_output = open(config['obi']['metabarprefix']+'.ngsfilter', 'w')
|
||||||
|
|
||||||
|
for line in ngsfilter_view:
|
||||||
|
|
||||||
|
line_to_print = b""
|
||||||
|
line_to_print += line[b'experiment']
|
||||||
|
line_to_print += b"\t"
|
||||||
|
line_to_print += line[b'sample']
|
||||||
|
line_to_print += b"\t"
|
||||||
|
line_to_print += line[b'forward_tag']
|
||||||
|
line_to_print += b":"
|
||||||
|
line_to_print += line[b'reverse_tag']
|
||||||
|
line_to_print += b"\t"
|
||||||
|
line_to_print += line[b'forward_primer']
|
||||||
|
line_to_print += b"\t"
|
||||||
|
line_to_print += line[b'reverse_primer']
|
||||||
|
line_to_print += b"\t"
|
||||||
|
line_to_print += line[b'additional_info']
|
||||||
|
|
||||||
|
print(tostr(line_to_print), file=ngsfilter_output)
|
||||||
|
|
||||||
|
if ngsfilter_input[0] != input[0]:
|
||||||
|
ngsfilter_input[0].close()
|
||||||
|
ngsfilter_output.close()
|
||||||
|
|
||||||
|
# Export sample metadata
|
||||||
|
samples_output = open(config['obi']['metabarprefix']+'_samples.csv', 'w')
|
||||||
|
|
||||||
|
# Export sample metadata file if view provided
|
||||||
|
if 'metabarsamples' in config['obi']:
|
||||||
|
samples_input = open_uri(config['obi']['metabarsamples'])
|
||||||
|
if samples_input is None:
|
||||||
|
raise Exception("Could not read sample view for metabaR output")
|
||||||
|
samples_view = samples_input[1]
|
||||||
|
|
||||||
|
# Export with tab formatter
|
||||||
|
TabWriter(TabFormat(header=True, sep='\t',),
|
||||||
|
samples_output,
|
||||||
|
header=True)
|
||||||
|
|
||||||
|
if samples_input[0] != input[0]:
|
||||||
|
samples_input[0].close()
|
||||||
|
|
||||||
|
# Else export just sample names from main view
|
||||||
|
else:
|
||||||
|
|
||||||
|
sample_list = []
|
||||||
|
if 'MERGED_sample' in iview:
|
||||||
|
sample_list = iview['MERGED_sample'].keys()
|
||||||
|
elif 'sample' not in iview:
|
||||||
|
for seq in iview:
|
||||||
|
sample = seq['sample']
|
||||||
|
if sample not in sample_list:
|
||||||
|
sample_list.append(sample)
|
||||||
|
else:
|
||||||
|
logger("warning", "Can not read sample list from main view for metabaR sample list export")
|
||||||
|
|
||||||
|
print("sample_id", file=samples_output)
|
||||||
|
for sample in sample_list:
|
||||||
|
line_to_print = b""
|
||||||
|
line_to_print += sample
|
||||||
|
line_to_print += b"\t"
|
||||||
|
print(tostr(line_to_print), file=samples_output)
|
||||||
|
|
||||||
|
samples_output.close()
|
||||||
|
|
||||||
# TODO save command in input dms?
|
# TODO save command in input dms?
|
||||||
|
|
||||||
if not BrokenPipeError and not IOError:
|
if not BrokenPipeError and not IOError:
|
||||||
|
@ -91,7 +91,7 @@ def addOptions(parser):
|
|||||||
metavar="<ATTRIBUTE_NAME>",
|
metavar="<ATTRIBUTE_NAME>",
|
||||||
help="Select records with the attribute <ATTRIBUTE_NAME> "
|
help="Select records with the attribute <ATTRIBUTE_NAME> "
|
||||||
"defined (not set to NA value). "
|
"defined (not set to NA value). "
|
||||||
"Several -a options can be used on the same "
|
"Several -A options can be used on the same "
|
||||||
"command line.")
|
"command line.")
|
||||||
|
|
||||||
group.add_argument("-L", "--lmax",
|
group.add_argument("-L", "--lmax",
|
||||||
@ -258,6 +258,13 @@ def Filter_generator(options, tax_filter, i_view):
|
|||||||
|
|
||||||
|
|
||||||
def Taxonomy_filter_generator(taxo, options):
|
def Taxonomy_filter_generator(taxo, options):
|
||||||
|
|
||||||
|
if (("required_ranks" in options and options["required_ranks"]) or \
|
||||||
|
("required_taxids" in options and options["required_taxids"]) or \
|
||||||
|
("ignored_taxids" in options and options["ignored_taxids"])) and \
|
||||||
|
(taxo is None):
|
||||||
|
raise RollbackException("obi grep error: can't use taxonomy options without providing a taxonomy. Rollbacking view")
|
||||||
|
|
||||||
if taxo is not None:
|
if taxo is not None:
|
||||||
def tax_filter(seq):
|
def tax_filter(seq):
|
||||||
good = True
|
good = True
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
|
|
||||||
from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
|
from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
|
||||||
from obitools3.dms.view.view cimport View
|
from obitools3.dms.view.view cimport View
|
||||||
@ -34,14 +35,17 @@ from obitools3.dms.capi.obidms cimport obi_import_view
|
|||||||
from obitools3.dms.capi.obitypes cimport obitype_t, \
|
from obitools3.dms.capi.obitypes cimport obitype_t, \
|
||||||
OBI_VOID, \
|
OBI_VOID, \
|
||||||
OBI_QUAL, \
|
OBI_QUAL, \
|
||||||
OBI_STR
|
OBI_STR, \
|
||||||
|
OBI_INT
|
||||||
|
|
||||||
from obitools3.dms.capi.obierrno cimport obi_errno
|
from obitools3.dms.capi.obierrno cimport obi_errno
|
||||||
|
|
||||||
from obitools3.apps.optiongroups import addImportInputOption, \
|
from obitools3.apps.optiongroups import addImportInputOption, \
|
||||||
addTabularInputOption, \
|
addTabularInputOption, \
|
||||||
addTaxdumpInputOption, \
|
addTaxdumpInputOption, \
|
||||||
addMinimalOutputOption
|
addMinimalOutputOption, \
|
||||||
|
addNoProgressBarOption, \
|
||||||
|
addTaxonomyOption
|
||||||
|
|
||||||
from obitools3.uri.decode import open_uri
|
from obitools3.uri.decode import open_uri
|
||||||
|
|
||||||
@ -50,6 +54,7 @@ from obitools3.apps.config import logger
|
|||||||
from cpython.exc cimport PyErr_CheckSignals
|
from cpython.exc cimport PyErr_CheckSignals
|
||||||
|
|
||||||
from io import BufferedWriter
|
from io import BufferedWriter
|
||||||
|
import ast
|
||||||
|
|
||||||
|
|
||||||
__title__="Import sequences from different formats into a DMS"
|
__title__="Import sequences from different formats into a DMS"
|
||||||
@ -69,7 +74,9 @@ def addOptions(parser):
|
|||||||
addImportInputOption(parser)
|
addImportInputOption(parser)
|
||||||
addTabularInputOption(parser)
|
addTabularInputOption(parser)
|
||||||
addTaxdumpInputOption(parser)
|
addTaxdumpInputOption(parser)
|
||||||
|
addTaxonomyOption(parser)
|
||||||
addMinimalOutputOption(parser)
|
addMinimalOutputOption(parser)
|
||||||
|
addNoProgressBarOption(parser)
|
||||||
|
|
||||||
group = parser.add_argument_group('obi import specific options')
|
group = parser.add_argument_group('obi import specific options')
|
||||||
|
|
||||||
@ -85,6 +92,10 @@ def addOptions(parser):
|
|||||||
help="If importing a view into another DMS, do it by importing each line, saving disk space if the original view "
|
help="If importing a view into another DMS, do it by importing each line, saving disk space if the original view "
|
||||||
"has a line selection associated.")
|
"has a line selection associated.")
|
||||||
|
|
||||||
|
# group.add_argument('--only-id',
|
||||||
|
# action="store", dest="import:onlyid",
|
||||||
|
# help="only id")
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
|
|
||||||
cdef tuple input
|
cdef tuple input
|
||||||
@ -97,6 +108,7 @@ def run(config):
|
|||||||
cdef bint get_quality
|
cdef bint get_quality
|
||||||
cdef bint NUC_SEQS_view
|
cdef bint NUC_SEQS_view
|
||||||
cdef bint silva
|
cdef bint silva
|
||||||
|
cdef bint rdp
|
||||||
cdef int nb_elts
|
cdef int nb_elts
|
||||||
cdef object d
|
cdef object d
|
||||||
cdef View view
|
cdef View view
|
||||||
@ -180,6 +192,16 @@ def run(config):
|
|||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Open taxonomy if there is one
|
||||||
|
if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None:
|
||||||
|
taxo_uri = open_uri(config['obi']['taxoURI'])
|
||||||
|
if taxo_uri is None or taxo_uri[2] == bytes:
|
||||||
|
raise Exception("Couldn't open taxonomy")
|
||||||
|
taxo = taxo_uri[1]
|
||||||
|
|
||||||
|
else :
|
||||||
|
taxo = None
|
||||||
|
|
||||||
# If importing a view between two DMS and not wanting to save space if line selection in original view, use C API
|
# If importing a view between two DMS and not wanting to save space if line selection in original view, use C API
|
||||||
if isinstance(input[1], View) and not config['import']['space_priority']:
|
if isinstance(input[1], View) and not config['import']['space_priority']:
|
||||||
if obi_import_view(input[0].name_with_full_path, o_dms.name_with_full_path, input[1].name, tobytes((config['obi']['outputURI'].split('/'))[-1])) < 0 :
|
if obi_import_view(input[0].name_with_full_path, o_dms.name_with_full_path, input[1].name, tobytes((config['obi']['outputURI'].split('/'))[-1])) < 0 :
|
||||||
@ -192,8 +214,11 @@ def run(config):
|
|||||||
logger("info", "Done.")
|
logger("info", "Done.")
|
||||||
return
|
return
|
||||||
|
|
||||||
if entry_count >= 0:
|
# Reinitialize the progress bar
|
||||||
|
if entry_count >= 0 and config['obi']['noprogressbar'] == False:
|
||||||
pb = ProgressBar(entry_count, config)
|
pb = ProgressBar(entry_count, config)
|
||||||
|
else:
|
||||||
|
pb = None
|
||||||
|
|
||||||
NUC_SEQS_view = False
|
NUC_SEQS_view = False
|
||||||
if isinstance(output[1], View) :
|
if isinstance(output[1], View) :
|
||||||
@ -202,20 +227,30 @@ def run(config):
|
|||||||
NUC_SEQS_view = True
|
NUC_SEQS_view = True
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
# Save basic columns in variables for optimization
|
# Save basic columns in variables for optimization
|
||||||
if NUC_SEQS_view :
|
if NUC_SEQS_view :
|
||||||
id_col = view[ID_COLUMN]
|
id_col = view[ID_COLUMN]
|
||||||
def_col = view[DEFINITION_COLUMN]
|
def_col = view[DEFINITION_COLUMN]
|
||||||
seq_col = view[NUC_SEQUENCE_COLUMN]
|
seq_col = view[NUC_SEQUENCE_COLUMN]
|
||||||
|
|
||||||
# Prepare taxon scientific name if SILVA file
|
# Prepare taxon scientific name and taxid refs if RDP or SILVA file
|
||||||
if 'inputformat' in config['obi'] and config['obi']['inputformat'] == b"silva":
|
silva = False
|
||||||
silva = True
|
rdp = False
|
||||||
|
unite = False
|
||||||
|
if 'inputformat' in config['obi'] and (config['obi']['inputformat'] == b"silva" or config['obi']['inputformat'] == b"rdp" or config['obi']['inputformat'] == b"unite"):
|
||||||
|
#if taxo is None:
|
||||||
|
# raise Exception("A taxonomy (as built by 'obi import --taxdump') must be provided for SILVA and RDP files")
|
||||||
|
if config['obi']['inputformat'] == b"silva":
|
||||||
|
silva = True
|
||||||
|
elif config['obi']['inputformat'] == b"rdp":
|
||||||
|
rdp = True
|
||||||
|
elif config['obi']['inputformat'] == b"unite":
|
||||||
|
unite = True
|
||||||
sci_name_col = Column.new_column(view, SCIENTIFIC_NAME_COLUMN, OBI_STR)
|
sci_name_col = Column.new_column(view, SCIENTIFIC_NAME_COLUMN, OBI_STR)
|
||||||
else:
|
if taxo is not None:
|
||||||
silva = False
|
taxid_col = Column.new_column(view, TAXID_COLUMN, OBI_INT)
|
||||||
|
|
||||||
dcols = {}
|
dcols = {}
|
||||||
|
|
||||||
# First read through the entries to prepare columns with dictionaries as they are very time-expensive to rewrite
|
# First read through the entries to prepare columns with dictionaries as they are very time-expensive to rewrite
|
||||||
@ -265,8 +300,13 @@ def run(config):
|
|||||||
# Reinitialize the input
|
# Reinitialize the input
|
||||||
if isinstance(input[0], CompressedFile):
|
if isinstance(input[0], CompressedFile):
|
||||||
input_is_file = True
|
input_is_file = True
|
||||||
if entry_count >= 0:
|
|
||||||
|
# Reinitialize the progress bar
|
||||||
|
if entry_count >= 0 and config['obi']['noprogressbar'] == False:
|
||||||
pb = ProgressBar(entry_count, config)
|
pb = ProgressBar(entry_count, config)
|
||||||
|
else:
|
||||||
|
pb = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
input[0].close()
|
input[0].close()
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
@ -275,6 +315,11 @@ def run(config):
|
|||||||
if input is None:
|
if input is None:
|
||||||
raise Exception("Could not open input URI")
|
raise Exception("Could not open input URI")
|
||||||
|
|
||||||
|
# if 'onlyid' in config['import']:
|
||||||
|
# onlyid = tobytes(config['import']['onlyid'])
|
||||||
|
# else:
|
||||||
|
# onlyid = None
|
||||||
|
|
||||||
entries = input[1]
|
entries = input[1]
|
||||||
i = 0
|
i = 0
|
||||||
for entry in entries :
|
for entry in entries :
|
||||||
@ -292,6 +337,9 @@ def run(config):
|
|||||||
elif not i%50000:
|
elif not i%50000:
|
||||||
logger("info", "Imported %d entries", i)
|
logger("info", "Imported %d entries", i)
|
||||||
|
|
||||||
|
# if onlyid is not None and entry.id != onlyid:
|
||||||
|
# continue
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
if NUC_SEQS_view:
|
if NUC_SEQS_view:
|
||||||
@ -307,11 +355,27 @@ def run(config):
|
|||||||
if get_quality:
|
if get_quality:
|
||||||
qual_col[i] = entry.quality
|
qual_col[i] = entry.quality
|
||||||
|
|
||||||
# Parse taxon scientific name if SILVA file
|
# Parse taxon scientific name if RDP or Silva or Unite file
|
||||||
if silva:
|
if (rdp or silva or unite):
|
||||||
sci_name = entry.definition.split(b";")[-1]
|
if rdp or silva:
|
||||||
sci_name_col[i] = sci_name
|
sci_names = entry.definition.split(b";")
|
||||||
|
sci_name_col[i] = sci_names[-1]
|
||||||
|
elif unite:
|
||||||
|
sci_names = entry.id.split(b'|')[-1].split(b';')
|
||||||
|
sci_name_col[i] = re.sub(b'[a-zA-Z]__', b'', sci_names[-1])
|
||||||
|
# Fond taxid if taxonomy provided
|
||||||
|
if taxo is not None :
|
||||||
|
for sci_name in reversed(sci_names):
|
||||||
|
if unite:
|
||||||
|
sci_name = re.sub(b'[a-zA-Z]__', b'', sci_name)
|
||||||
|
if sci_name.split()[0] != b'unidentified' and sci_name.split()[0] != b'uncultured' and sci_name.split()[0] != b'metagenome':
|
||||||
|
taxon = taxo.get_taxon_by_name(sci_name)
|
||||||
|
if taxon is not None:
|
||||||
|
sci_name_col[i] = taxon.name
|
||||||
|
taxid_col[i] = taxon.taxid
|
||||||
|
#print(taxid_col[i], sci_name_col[i])
|
||||||
|
break
|
||||||
|
|
||||||
for tag in entry :
|
for tag in entry :
|
||||||
|
|
||||||
if tag != ID_COLUMN and tag != DEFINITION_COLUMN and tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN : # TODO dirty
|
if tag != ID_COLUMN and tag != DEFINITION_COLUMN and tag != NUC_SEQUENCE_COLUMN and tag != QUALITY_COLUMN : # TODO dirty
|
||||||
@ -323,27 +387,39 @@ def run(config):
|
|||||||
tag = COUNT_COLUMN
|
tag = COUNT_COLUMN
|
||||||
if tag[:7] == b"merged_":
|
if tag[:7] == b"merged_":
|
||||||
tag = MERGED_PREFIX+tag[7:]
|
tag = MERGED_PREFIX+tag[7:]
|
||||||
|
|
||||||
|
if type(value) == bytes and value[:1]==b"[" :
|
||||||
|
try:
|
||||||
|
if type(eval(value)) == list:
|
||||||
|
value = eval(value)
|
||||||
|
#print(value)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
if tag not in dcols :
|
if tag not in dcols :
|
||||||
|
|
||||||
value_type = type(value)
|
value_type = type(value)
|
||||||
nb_elts = 1
|
nb_elts = 1
|
||||||
value_obitype = OBI_VOID
|
value_obitype = OBI_VOID
|
||||||
dict_col = False
|
dict_col = False
|
||||||
|
|
||||||
if value_type == dict or value_type == list :
|
if value_type == dict :
|
||||||
nb_elts = len(value)
|
nb_elts = len(value)
|
||||||
elt_names = list(value)
|
elt_names = list(value)
|
||||||
if value_type == dict :
|
dict_col = True
|
||||||
dict_col = True
|
|
||||||
else :
|
else :
|
||||||
nb_elts = 1
|
nb_elts = 1
|
||||||
elt_names = None
|
elt_names = None
|
||||||
|
|
||||||
|
if value_type == list :
|
||||||
|
tuples = True
|
||||||
|
else:
|
||||||
|
tuples = False
|
||||||
|
|
||||||
value_obitype = get_obitype(value)
|
value_obitype = get_obitype(value)
|
||||||
|
|
||||||
if value_obitype != OBI_VOID :
|
if value_obitype != OBI_VOID :
|
||||||
dcols[tag] = (Column.new_column(view, tag, value_obitype, nb_elements_per_line=nb_elts, elements_names=elt_names, dict_column=dict_col), value_obitype)
|
dcols[tag] = (Column.new_column(view, tag, value_obitype, nb_elements_per_line=nb_elts, elements_names=elt_names, dict_column=dict_col, tuples=tuples), value_obitype)
|
||||||
|
|
||||||
# Fill value
|
# Fill value
|
||||||
dcols[tag][0][i] = value
|
dcols[tag][0][i] = value
|
||||||
@ -419,11 +495,12 @@ def run(config):
|
|||||||
dcols[tag][0][i] = value
|
dcols[tag][0][i] = value
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print("\nCould not import sequence:", entry, "(error raised:", e, ")")
|
print("\nCould not import sequence:", repr(entry), "(error raised:", e, ")")
|
||||||
if 'skiperror' in config['obi'] and not config['obi']['skiperror']:
|
if 'skiperror' in config['obi'] and not config['obi']['skiperror']:
|
||||||
raise e
|
raise e
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
|
i-=1 # overwrite problematic entry
|
||||||
|
|
||||||
i+=1
|
i+=1
|
||||||
|
|
||||||
|
2
python/obitools3/commands/ngsfilter.pyx
Normal file → Executable file
2
python/obitools3/commands/ngsfilter.pyx
Normal file → Executable file
@ -271,7 +271,7 @@ cdef tuple annotate(sequences, infos, no_tags, verbose=False):
|
|||||||
sequences[0][REVERSE_QUALITY_COLUMN] = sequences[1].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") and seq.quality_array is not None:
|
||||||
q = -reduce(lambda x,y:x+y,(math.log10(z) for z in seq.quality_array),0)/len(seq.quality_array)*10
|
q = -reduce(lambda x,y:x+y,(math.log10(z) for z in seq.quality_array),0)/len(seq.quality_array)*10
|
||||||
seq[b'avg_quality']=q
|
seq[b'avg_quality']=q
|
||||||
q = -reduce(lambda x,y:x+y,(math.log10(z) for z in seq.quality_array[0:10]),0)
|
q = -reduce(lambda x,y:x+y,(math.log10(z) for z in seq.quality_array[0:10]),0)
|
||||||
|
105
python/obitools3/commands/split.pyx
Normal file
105
python/obitools3/commands/split.pyx
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
#cython: language_level=3
|
||||||
|
|
||||||
|
from obitools3.apps.progress cimport ProgressBar # @UnresolvedImport
|
||||||
|
from obitools3.dms import DMS
|
||||||
|
from obitools3.dms.view.view cimport View, Line_selection
|
||||||
|
from obitools3.uri.decode import open_uri
|
||||||
|
from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption, addNoProgressBarOption
|
||||||
|
from obitools3.dms.view import RollbackException
|
||||||
|
from obitools3.apps.config import logger
|
||||||
|
from obitools3.utils cimport tobytes
|
||||||
|
|
||||||
|
import sys
|
||||||
|
from cpython.exc cimport PyErr_CheckSignals
|
||||||
|
|
||||||
|
|
||||||
|
__title__="Split"
|
||||||
|
|
||||||
|
|
||||||
|
def addOptions(parser):
|
||||||
|
|
||||||
|
addMinimalInputOption(parser)
|
||||||
|
addNoProgressBarOption(parser)
|
||||||
|
|
||||||
|
group=parser.add_argument_group("obi split specific options")
|
||||||
|
|
||||||
|
group.add_argument('-p','--prefix',
|
||||||
|
action="store", dest="split:prefix",
|
||||||
|
metavar="<PREFIX>",
|
||||||
|
help="Prefix added to each subview name (included undefined)")
|
||||||
|
|
||||||
|
group.add_argument('-t','--tag-name',
|
||||||
|
action="store", dest="split:tagname",
|
||||||
|
metavar="<TAG_NAME>",
|
||||||
|
help="Attribute/tag used to split the input")
|
||||||
|
|
||||||
|
group.add_argument('-u','--undefined',
|
||||||
|
action="store", dest="split:undefined",
|
||||||
|
default=b'UNDEFINED',
|
||||||
|
metavar="<VIEW_NAME>",
|
||||||
|
help="Name of the view where undefined sequenced are stored (will be PREFIX_VIEW_NAME)")
|
||||||
|
|
||||||
|
|
||||||
|
def run(config):
|
||||||
|
|
||||||
|
DMS.obi_atexit()
|
||||||
|
|
||||||
|
logger("info", "obi split")
|
||||||
|
|
||||||
|
# Open the input
|
||||||
|
input = open_uri(config["obi"]["inputURI"])
|
||||||
|
if input is None:
|
||||||
|
raise Exception("Could not read input view")
|
||||||
|
i_dms = input[0]
|
||||||
|
i_view = input[1]
|
||||||
|
|
||||||
|
# Initialize the progress bar
|
||||||
|
if config['obi']['noprogressbar'] == False:
|
||||||
|
pb = ProgressBar(len(i_view), config)
|
||||||
|
else:
|
||||||
|
pb = None
|
||||||
|
|
||||||
|
tag_to_split = config["split"]["tagname"]
|
||||||
|
undefined = tobytes(config["split"]["undefined"])
|
||||||
|
selections = {}
|
||||||
|
|
||||||
|
# Go through input view and split
|
||||||
|
for i in range(len(i_view)):
|
||||||
|
PyErr_CheckSignals()
|
||||||
|
if pb is not None:
|
||||||
|
pb(i)
|
||||||
|
line = i_view[i]
|
||||||
|
if tag_to_split not in line or line[tag_to_split] is None or len(line[tag_to_split])==0:
|
||||||
|
value = undefined
|
||||||
|
else:
|
||||||
|
value = line[tag_to_split]
|
||||||
|
if value not in selections:
|
||||||
|
selections[value] = Line_selection(i_view)
|
||||||
|
selections[value].append(i)
|
||||||
|
|
||||||
|
if pb is not None:
|
||||||
|
pb(len(i_view), force=True)
|
||||||
|
print("", file=sys.stderr)
|
||||||
|
|
||||||
|
# Create output views with the line selection
|
||||||
|
try:
|
||||||
|
for cat in selections:
|
||||||
|
o_view_name = config["split"]["prefix"].encode()+cat
|
||||||
|
o_view = selections[cat].materialize(o_view_name)
|
||||||
|
# Save command config in View and DMS comments
|
||||||
|
command_line = " ".join(sys.argv[1:])
|
||||||
|
input_dms_name=[input[0].name]
|
||||||
|
input_view_name=[input[1].name]
|
||||||
|
if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None:
|
||||||
|
input_dms_name.append(config['obi']['taxoURI'].split("/")[-3])
|
||||||
|
input_view_name.append("taxonomy/"+config['obi']['taxoURI'].split("/")[-1])
|
||||||
|
o_view.write_config(config, "split", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
|
||||||
|
o_view.close()
|
||||||
|
except Exception, e:
|
||||||
|
raise RollbackException("obi split error, rollbacking view: "+str(e), o_view)
|
||||||
|
|
||||||
|
i_dms.record_command_line(command_line)
|
||||||
|
i_dms.close(force=True)
|
||||||
|
|
||||||
|
logger("info", "Done.")
|
||||||
|
|
@ -119,9 +119,12 @@ def mean(values, options):
|
|||||||
|
|
||||||
def variance(v):
|
def variance(v):
|
||||||
if len(v)==1:
|
if len(v)==1:
|
||||||
return 0
|
return 0
|
||||||
s = reduce(lambda x,y:(x[0]+y,x[1]+y**2),v,(0.,0.))
|
s = reduce(lambda x,y:(x[0]+y,x[1]+y**2),v,(0.,0.))
|
||||||
return s[1]/(len(v)-1) - s[0]**2/len(v)/(len(v)-1)
|
var = round(s[1]/(len(v)-1) - s[0]**2/len(v)/(len(v)-1), 5) # round to go around shady python rounding stuff when var is actually 0
|
||||||
|
if var == -0.0: # then fix -0 to +0 if was rounded to -0
|
||||||
|
var = 0.0
|
||||||
|
return var
|
||||||
|
|
||||||
|
|
||||||
def varpop(values, options):
|
def varpop(values, options):
|
||||||
@ -154,7 +157,7 @@ def run(config):
|
|||||||
else :
|
else :
|
||||||
taxo = None
|
taxo = None
|
||||||
|
|
||||||
statistics = set(config['stats']['minimum']) | set(config['stats']['maximum']) | set(config['stats']['mean'])
|
statistics = set(config['stats']['minimum']) | set(config['stats']['maximum']) | set(config['stats']['mean']) | set(config['stats']['var']) | set(config['stats']['sd'])
|
||||||
total = 0
|
total = 0
|
||||||
catcount={}
|
catcount={}
|
||||||
totcount={}
|
totcount={}
|
||||||
@ -195,7 +198,7 @@ def run(config):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
totcount[category]=totcount.get(category,0)+1
|
totcount[category]=totcount.get(category,0)+1
|
||||||
for var in statistics:
|
for var in statistics:
|
||||||
if var in line:
|
if var in line and line[var] is not None:
|
||||||
v = line[var]
|
v = line[var]
|
||||||
if var not in values:
|
if var not in values:
|
||||||
values[var]={}
|
values[var]={}
|
||||||
@ -238,14 +241,34 @@ def run(config):
|
|||||||
else:
|
else:
|
||||||
sdvar= "%s"
|
sdvar= "%s"
|
||||||
|
|
||||||
hcat = "\t".join([pcat % x for x in config['stats']['categories']]) + \
|
hcat = ""
|
||||||
"\t".join([minvar % x for x in config['stats']['minimum']]) + \
|
|
||||||
"\t".join([maxvar % x for x in config['stats']['maximum']]) + \
|
for x in config['stats']['categories']:
|
||||||
"\t".join([meanvar % x for x in config['stats']['mean']]) + \
|
hcat += pcat % x
|
||||||
"\t".join([varvar % x for x in config['stats']['var']]) + \
|
hcat += "\t"
|
||||||
"\t".join([sdvar % x for x in config['stats']['sd']]) + \
|
|
||||||
"count\t" + \
|
for x in config['stats']['minimum']:
|
||||||
"total"
|
hcat += minvar % x
|
||||||
|
hcat += "\t"
|
||||||
|
|
||||||
|
for x in config['stats']['maximum']:
|
||||||
|
hcat += maxvar % x
|
||||||
|
hcat += "\t"
|
||||||
|
|
||||||
|
for x in config['stats']['mean']:
|
||||||
|
hcat += meanvar % x
|
||||||
|
hcat += "\t"
|
||||||
|
|
||||||
|
for x in config['stats']['var']:
|
||||||
|
hcat += varvar % x
|
||||||
|
hcat += "\t"
|
||||||
|
|
||||||
|
for x in config['stats']['sd']:
|
||||||
|
hcat += sdvar % x
|
||||||
|
hcat += "\t"
|
||||||
|
|
||||||
|
hcat += "count\ttotal"
|
||||||
|
|
||||||
print(hcat)
|
print(hcat)
|
||||||
sorted_stats = sorted(catcount.items(), key = lambda kv:(totcount[kv[0]]), reverse=True)
|
sorted_stats = sorted(catcount.items(), key = lambda kv:(totcount[kv[0]]), reverse=True)
|
||||||
for i in range(len(sorted_stats)):
|
for i in range(len(sorted_stats)):
|
||||||
@ -265,8 +288,8 @@ def run(config):
|
|||||||
print((("%%%df" % lvarp[m]) % varp[m][c])+"\t", end="")
|
print((("%%%df" % lvarp[m]) % varp[m][c])+"\t", end="")
|
||||||
for m in config['stats']['sd']:
|
for m in config['stats']['sd']:
|
||||||
print((("%%%df" % lsigma[m]) % sigma[m][c])+"\t", end="")
|
print((("%%%df" % lsigma[m]) % sigma[m][c])+"\t", end="")
|
||||||
print("%7d" %catcount[c], end="")
|
print("%d" %catcount[c]+"\t", end="")
|
||||||
print("%9d" %totcount[c])
|
print("%d" %totcount[c]+"\t")
|
||||||
|
|
||||||
input[0].close(force=True)
|
input[0].close(force=True)
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ cdef extern from "obi_ecopcr.h" nogil:
|
|||||||
|
|
||||||
int obi_ecopcr(const char* input_dms_name,
|
int obi_ecopcr(const char* input_dms_name,
|
||||||
const char* i_view_name,
|
const char* i_view_name,
|
||||||
|
const char* tax_dms_name,
|
||||||
const char* taxonomy_name,
|
const char* taxonomy_name,
|
||||||
const char* output_dms_name,
|
const char* output_dms_name,
|
||||||
const char* o_view_name,
|
const char* o_view_name,
|
||||||
|
@ -7,7 +7,8 @@ __OBIDMS_COLUMN_CLASS__ = {}
|
|||||||
from ..capi.obitypes cimport name_data_type, \
|
from ..capi.obitypes cimport name_data_type, \
|
||||||
obitype_t, \
|
obitype_t, \
|
||||||
obiversion_t, \
|
obiversion_t, \
|
||||||
OBI_QUAL
|
OBI_QUAL, \
|
||||||
|
OBI_STR
|
||||||
|
|
||||||
from ..capi.obidms cimport obi_import_column
|
from ..capi.obidms cimport obi_import_column
|
||||||
|
|
||||||
@ -128,6 +129,10 @@ cdef class Column(OBIWrapper) :
|
|||||||
else:
|
else:
|
||||||
elements_names_p = NULL
|
elements_names_p = NULL
|
||||||
|
|
||||||
|
if column_name_b == b"SAMPLE" or column_name_b == b"sample":
|
||||||
|
# force str type
|
||||||
|
data_type = OBI_STR
|
||||||
|
|
||||||
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 column_name == QUALITY_COLUMN:
|
||||||
|
@ -74,6 +74,9 @@ cdef class Column_str(Column_idx):
|
|||||||
if value is None :
|
if value is None :
|
||||||
value_b = <char*>OBIStr_NA
|
value_b = <char*>OBIStr_NA
|
||||||
else :
|
else :
|
||||||
|
if self.name == b'sample' or self.name == b'SAMPLE':
|
||||||
|
if type(value) == int:
|
||||||
|
value = str(value) # force sample ids to be str
|
||||||
value_bytes = tobytes(value)
|
value_bytes = tobytes(value)
|
||||||
value_b = <char*>value_bytes
|
value_b = <char*>value_bytes
|
||||||
|
|
||||||
@ -137,6 +140,9 @@ cdef class Column_multi_elts_str(Column_multi_elts_idx):
|
|||||||
if value is None :
|
if value is None :
|
||||||
value_b = <char*>OBIStr_NA
|
value_b = <char*>OBIStr_NA
|
||||||
else :
|
else :
|
||||||
|
if self.name == b'sample' or self.name == b'SAMPLE':
|
||||||
|
if type(value) == int:
|
||||||
|
value = str(value) # force sample ids to be str
|
||||||
value_bytes = tobytes(value)
|
value_bytes = tobytes(value)
|
||||||
value_b = <char*>value_bytes
|
value_b = <char*>value_bytes
|
||||||
|
|
||||||
@ -206,6 +212,9 @@ cdef class Column_tuples_str(Column_idx):
|
|||||||
i = 0
|
i = 0
|
||||||
for elt in value :
|
for elt in value :
|
||||||
if elt is not None and elt != '':
|
if elt is not None and elt != '':
|
||||||
|
if self.name == b'sample' or self.name == b'SAMPLE':
|
||||||
|
if type(elt) == int:
|
||||||
|
elt = str(elt) # force sample ids to be str
|
||||||
elt_b = tobytes(elt)
|
elt_b = tobytes(elt)
|
||||||
strcpy(array+i, <char*>elt_b)
|
strcpy(array+i, <char*>elt_b)
|
||||||
i = i + len(elt_b) + 1
|
i = i + len(elt_b) + 1
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#cython: language_level=3
|
#cython: language_level=3
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
from obitools3.utils cimport str2bytes, bytes2str, tobytes, tostr
|
from obitools3.utils cimport str2bytes, bytes2str, tobytes, tostr
|
||||||
from ..capi.obidms cimport OBIDMS_p, obi_dms_get_full_path
|
from ..capi.obidms cimport OBIDMS_p, obi_dms_get_full_path
|
||||||
|
|
||||||
@ -34,7 +36,7 @@ cdef class Taxonomy(OBIWrapper) :
|
|||||||
return <OBIDMS_taxonomy_p>(self._pointer)
|
return <OBIDMS_taxonomy_p>(self._pointer)
|
||||||
|
|
||||||
cdef fill_name_dict(self):
|
cdef fill_name_dict(self):
|
||||||
print("Indexing taxon names...")
|
print("Indexing taxon names...", file=sys.stderr)
|
||||||
|
|
||||||
cdef OBIDMS_taxonomy_p pointer = self.pointer()
|
cdef OBIDMS_taxonomy_p pointer = self.pointer()
|
||||||
cdef ecotx_t* taxon_p
|
cdef ecotx_t* taxon_p
|
||||||
@ -91,6 +93,8 @@ cdef class Taxonomy(OBIWrapper) :
|
|||||||
raise RuntimeError("Error : Cannot read taxonomy %s"
|
raise RuntimeError("Error : Cannot read taxonomy %s"
|
||||||
% tostr(name))
|
% tostr(name))
|
||||||
|
|
||||||
|
print("Taxonomy read", file=sys.stderr)
|
||||||
|
|
||||||
taxo = OBIWrapper.new_wrapper(Taxonomy, pointer)
|
taxo = OBIWrapper.new_wrapper(Taxonomy, pointer)
|
||||||
|
|
||||||
dms.register(taxo)
|
dms.register(taxo)
|
||||||
@ -146,7 +150,9 @@ cdef class Taxonomy(OBIWrapper) :
|
|||||||
taxo._ranks = []
|
taxo._ranks = []
|
||||||
for r in range((<OBIDMS_taxonomy_p>pointer).ranks.count) :
|
for r in range((<OBIDMS_taxonomy_p>pointer).ranks.count) :
|
||||||
taxo._ranks.append(obi_taxo_rank_index_to_label(r, (<OBIDMS_taxonomy_p>pointer).ranks))
|
taxo._ranks.append(obi_taxo_rank_index_to_label(r, (<OBIDMS_taxonomy_p>pointer).ranks))
|
||||||
|
|
||||||
|
print('Read %d taxa' % len(taxo), file=sys.stderr)
|
||||||
|
|
||||||
return taxo
|
return taxo
|
||||||
|
|
||||||
|
|
||||||
@ -304,6 +310,11 @@ cdef class Taxonomy(OBIWrapper) :
|
|||||||
def name(self):
|
def name(self):
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
|
# ranks property getter
|
||||||
|
@property
|
||||||
|
def ranks(self):
|
||||||
|
return self._ranks
|
||||||
|
|
||||||
|
|
||||||
def parental_tree_iterator(self, int taxid):
|
def parental_tree_iterator(self, int taxid):
|
||||||
"""
|
"""
|
||||||
|
@ -77,7 +77,7 @@ cdef class View(OBIWrapper) :
|
|||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def import_view(object dms_1, object dms_2, object view_name_1, object view_name_2):
|
def import_view(object dms_1, object dms_2, object view_name_1, object view_name_2): # TODO argument to import line by line to avoid huge AVL copy
|
||||||
if obi_import_view(tobytes(dms_1), tobytes(dms_2), tobytes(view_name_1), tobytes(view_name_2)) < 0 :
|
if obi_import_view(tobytes(dms_1), tobytes(dms_2), tobytes(view_name_1), tobytes(view_name_2)) < 0 :
|
||||||
raise Exception("Error importing a view")
|
raise Exception("Error importing a view")
|
||||||
|
|
||||||
@ -345,7 +345,7 @@ 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,
|
||||||
dict_column=(new_nb_elements_per_line>1), comments=old_column.comments, alias=column_name_b+tobytes('___new___'))
|
dict_column=(new_nb_elements_per_line>1), 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
|
switch_to_dict = not old_column.dict_column and new_nb_elements_per_line > 1
|
||||||
ori_key = old_column._elements_names[0]
|
ori_key = old_column._elements_names[0]
|
||||||
|
|
||||||
for i in range(length) :
|
for i in range(length) :
|
||||||
@ -799,7 +799,8 @@ cdef class Line :
|
|||||||
|
|
||||||
|
|
||||||
def keys(self):
|
def keys(self):
|
||||||
return self._view.keys()
|
cdef bytes key
|
||||||
|
return [key for key in self._view.keys()]
|
||||||
|
|
||||||
|
|
||||||
def __contains__(self, object column_name):
|
def __contains__(self, object column_name):
|
||||||
|
@ -7,11 +7,12 @@ from obitools3.utils cimport bytes2str
|
|||||||
|
|
||||||
cdef class FastaFormat:
|
cdef class FastaFormat:
|
||||||
|
|
||||||
def __init__(self, list tags=[], bint printNAKeys=False, bytes NAString=b"NA"):
|
def __init__(self, list tags=[], bint printNAKeys=False, bytes NAString=b"NA", bint NAIntTo0=False):
|
||||||
self.headerFormatter = HeaderFormat("fasta",
|
self.headerFormatter = HeaderFormat("fasta",
|
||||||
tags=tags,
|
tags=tags,
|
||||||
printNAKeys=printNAKeys,
|
printNAKeys=printNAKeys,
|
||||||
NAString=NAString)
|
NAString=NAString,
|
||||||
|
NAIntTo0=NAIntTo0)
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
def __call__(self, object data):
|
def __call__(self, object data):
|
||||||
|
@ -8,11 +8,12 @@ from obitools3.utils cimport bytes2str, str2bytes, tobytes
|
|||||||
# TODO quality offset option?
|
# TODO quality offset option?
|
||||||
cdef class FastqFormat:
|
cdef class FastqFormat:
|
||||||
|
|
||||||
def __init__(self, list tags=[], bint printNAKeys=False, bytes NAString=b"NA"):
|
def __init__(self, list tags=[], bint printNAKeys=False, bytes NAString=b"NA", bint NAIntTo0=False):
|
||||||
self.headerFormatter = HeaderFormat("fastq",
|
self.headerFormatter = HeaderFormat("fastq",
|
||||||
tags=tags,
|
tags=tags,
|
||||||
printNAKeys=printNAKeys,
|
printNAKeys=printNAKeys,
|
||||||
NAString=NAString)
|
NAString=NAString,
|
||||||
|
NAIntTo0=NAIntTo0)
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
def __call__(self, object data):
|
def __call__(self, object data):
|
||||||
|
@ -4,5 +4,6 @@ cdef class HeaderFormat:
|
|||||||
cdef set tags
|
cdef set tags
|
||||||
cdef bint printNAKeys
|
cdef bint printNAKeys
|
||||||
cdef bytes NAString
|
cdef bytes NAString
|
||||||
|
cdef bint NAIntTo0
|
||||||
cdef size_t headerBufferLength
|
cdef size_t headerBufferLength
|
||||||
|
|
@ -8,13 +8,14 @@ from obitools3.dms.capi.obiview cimport NUC_SEQUENCE_COLUMN, \
|
|||||||
|
|
||||||
from obitools3.utils cimport str2bytes, bytes2str_object
|
from obitools3.utils cimport str2bytes, bytes2str_object
|
||||||
from obitools3.dms.column.column cimport Column_line
|
from obitools3.dms.column.column cimport Column_line
|
||||||
|
from obitools3.dms.column.typed_column.int cimport Column_int, Column_multi_elts_int
|
||||||
|
|
||||||
|
|
||||||
cdef class HeaderFormat:
|
cdef class HeaderFormat:
|
||||||
|
|
||||||
SPECIAL_KEYS = [NUC_SEQUENCE_COLUMN, ID_COLUMN, DEFINITION_COLUMN, QUALITY_COLUMN]
|
SPECIAL_KEYS = [NUC_SEQUENCE_COLUMN, ID_COLUMN, DEFINITION_COLUMN, QUALITY_COLUMN]
|
||||||
|
|
||||||
def __init__(self, str format="fasta", list tags=[], bint printNAKeys=False, bytes NAString=b"NA"):
|
def __init__(self, str format="fasta", list tags=[], bint printNAKeys=False, bytes NAString=b"NA", bint NAIntTo0=False):
|
||||||
'''
|
'''
|
||||||
@param format:
|
@param format:
|
||||||
@type format: `str`
|
@type format: `str`
|
||||||
@ -32,6 +33,7 @@ cdef class HeaderFormat:
|
|||||||
self.tags = set(tags)
|
self.tags = set(tags)
|
||||||
self.printNAKeys = printNAKeys
|
self.printNAKeys = printNAKeys
|
||||||
self.NAString = NAString
|
self.NAString = NAString
|
||||||
|
self.NAIntTo0 = NAIntTo0
|
||||||
|
|
||||||
if format=="fasta":
|
if format=="fasta":
|
||||||
self.start=b">"
|
self.start=b">"
|
||||||
@ -57,17 +59,25 @@ cdef class HeaderFormat:
|
|||||||
if k in tags:
|
if k in tags:
|
||||||
value = data[k]
|
value = data[k]
|
||||||
if value is None or (isinstance(value, Column_line) and value.is_NA()):
|
if value is None or (isinstance(value, Column_line) and value.is_NA()):
|
||||||
if self.printNAKeys:
|
if isinstance(data.view[k], Column_int) and self.NAIntTo0: # people want missing int values to be 0
|
||||||
|
value = b'0'
|
||||||
|
elif self.printNAKeys:
|
||||||
value = self.NAString
|
value = self.NAString
|
||||||
else:
|
else:
|
||||||
value = None
|
value = None
|
||||||
else:
|
else:
|
||||||
if type(value) == Column_line:
|
if type(value) == Column_line:
|
||||||
value = value.bytes()
|
if isinstance(data.view[k], Column_multi_elts_int) and self.NAIntTo0:
|
||||||
|
value = dict(value)
|
||||||
|
for key in data.view[k].keys():
|
||||||
|
if key not in value or value[key]:
|
||||||
|
value[key] = 0
|
||||||
|
else:
|
||||||
|
value = value.bytes()
|
||||||
else:
|
else:
|
||||||
if type(value) == tuple:
|
if type(value) == tuple:
|
||||||
value=list(value)
|
value=list(value)
|
||||||
value = str2bytes(str(bytes2str_object(value))) # genius programming
|
value = str2bytes(str(bytes2str_object(value))) # genius programming
|
||||||
if value is not None:
|
if value is not None:
|
||||||
lines.append(k + b"=" + value + b";")
|
lines.append(k + b"=" + value + b";")
|
||||||
|
|
||||||
|
@ -4,5 +4,8 @@ cdef class TabFormat:
|
|||||||
cdef bint header
|
cdef bint header
|
||||||
cdef bint first_line
|
cdef bint first_line
|
||||||
cdef bytes NAString
|
cdef bytes NAString
|
||||||
cdef list tags
|
cdef set tags
|
||||||
cdef bytes sep
|
cdef bytes sep
|
||||||
|
cdef bint NAIntTo0
|
||||||
|
cdef bint metabaR
|
||||||
|
cdef bint ngsfilter
|
||||||
|
@ -4,57 +4,80 @@ 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, Column_multi_elts
|
from obitools3.dms.column.column cimport Column_line, Column_multi_elts
|
||||||
|
from obitools3.dms.column.typed_column.int cimport Column_int, Column_multi_elts_int
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
cdef class TabFormat:
|
cdef class TabFormat:
|
||||||
|
|
||||||
def __init__(self, header=True, bytes NAString=b"NA", bytes sep=b"\t"):
|
def __init__(self, list tags=[], header=True, bytes NAString=b"NA", bytes sep=b"\t", bint NAIntTo0=True, metabaR=False, ngsfilter=False):
|
||||||
|
self.tags = set(tags)
|
||||||
self.header = header
|
self.header = header
|
||||||
self.first_line = True
|
self.first_line = True
|
||||||
self.NAString = NAString
|
self.NAString = NAString
|
||||||
self.sep = sep
|
self.sep = sep
|
||||||
|
self.NAIntTo0 = NAIntTo0
|
||||||
|
self.metabaR = metabaR
|
||||||
|
self.ngsfilter = ngsfilter
|
||||||
|
|
||||||
@cython.boundscheck(False)
|
@cython.boundscheck(False)
|
||||||
def __call__(self, object data):
|
def __call__(self, object data):
|
||||||
|
|
||||||
|
cdef set ktags
|
||||||
|
cdef list tags = [key for key in data]
|
||||||
|
|
||||||
line = []
|
line = []
|
||||||
|
|
||||||
if self.first_line:
|
if self.tags is not None and self.tags:
|
||||||
self.tags = [k for k in data.keys()]
|
ktags = self.tags
|
||||||
|
else:
|
||||||
|
ktags = set(tags)
|
||||||
|
|
||||||
if self.header and self.first_line:
|
if self.header and self.first_line:
|
||||||
for k in self.tags:
|
for k in ktags:
|
||||||
if isinstance(data.view[k], Column_multi_elts):
|
if k in tags:
|
||||||
keys = data.view[k].keys()
|
if self.metabaR:
|
||||||
keys.sort()
|
if k == b'NUC_SEQ':
|
||||||
for k2 in keys:
|
ktoprint = b'sequence'
|
||||||
line.append(tobytes(k)+b':'+tobytes(k2))
|
else:
|
||||||
else:
|
ktoprint = k.lower()
|
||||||
line.append(tobytes(k))
|
ktoprint = ktoprint.replace(b'merged_', b'')
|
||||||
|
else:
|
||||||
|
ktoprint = k
|
||||||
|
if isinstance(data.view[k], Column_multi_elts):
|
||||||
|
keys = data.view[k].keys()
|
||||||
|
keys.sort()
|
||||||
|
for k2 in keys:
|
||||||
|
line.append(tobytes(ktoprint)+b':'+tobytes(k2))
|
||||||
|
else:
|
||||||
|
line.append(tobytes(ktoprint))
|
||||||
r = self.sep.join(value for value in line)
|
r = self.sep.join(value for value in line)
|
||||||
r += b'\n'
|
r += b'\n'
|
||||||
line = []
|
line = []
|
||||||
|
|
||||||
for k in self.tags:
|
for k in ktags:
|
||||||
value = data[k]
|
if k in tags:
|
||||||
if isinstance(data.view[k], Column_multi_elts):
|
value = data[k]
|
||||||
keys = data.view[k].keys()
|
if isinstance(data.view[k], Column_multi_elts):
|
||||||
keys.sort()
|
keys = data.view[k].keys()
|
||||||
if value is None: # all keys at None
|
keys.sort()
|
||||||
for k2 in keys: # TODO could be much more efficient
|
if value is None: # all keys at None
|
||||||
line.append(self.NAString)
|
for k2 in keys: # TODO could be much more efficient
|
||||||
else:
|
|
||||||
for k2 in keys: # TODO could be much more efficient
|
|
||||||
if value[k2] is not None:
|
|
||||||
line.append(str2bytes(str(bytes2str_object(value[k2])))) # genius programming
|
|
||||||
else:
|
|
||||||
line.append(self.NAString)
|
line.append(self.NAString)
|
||||||
else:
|
else:
|
||||||
if value is not None:
|
for k2 in keys: # TODO could be much more efficient
|
||||||
line.append(str2bytes(str(bytes2str_object(value))))
|
if value[k2] is not None:
|
||||||
|
line.append(str2bytes(str(bytes2str_object(value[k2])))) # genius programming
|
||||||
|
else:
|
||||||
|
if self.NAIntTo0 and isinstance(data.view[k], Column_multi_elts_int):
|
||||||
|
line.append(b"0")
|
||||||
|
else:
|
||||||
|
line.append(self.NAString)
|
||||||
else:
|
else:
|
||||||
line.append(self.NAString)
|
if value is not None or (self.NAIntTo0 and isinstance(data.view[k], Column_int)):
|
||||||
|
line.append(str2bytes(str(bytes2str_object(value))))
|
||||||
|
else:
|
||||||
|
line.append(self.NAString)
|
||||||
|
|
||||||
if self.header and self.first_line:
|
if self.header and self.first_line:
|
||||||
r += self.sep.join(value for value in line)
|
r += self.sep.join(value for value in line)
|
||||||
|
@ -22,11 +22,11 @@ from libc.stdlib cimport free, malloc, realloc
|
|||||||
from libc.string cimport strcpy, strlen
|
from libc.string cimport strcpy, strlen
|
||||||
|
|
||||||
|
|
||||||
_featureMatcher = re.compile(b'^FEATURES.+\n(?=ORIGIN )',re.DOTALL + re.M)
|
_featureMatcher = re.compile(b'^FEATURES.+\n(?=ORIGIN(\s*))',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)
|
||||||
_cleanSeq1 = re.compile(b'ORIGIN.+\n')
|
_cleanSeq1 = re.compile(b'ORIGIN(\s*)\n')
|
||||||
_cleanSeq2 = re.compile(b'[ \n0-9]+')
|
_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)
|
||||||
@ -155,10 +155,10 @@ def genbankIterator_file(lineiterator,
|
|||||||
yield seq
|
yield seq
|
||||||
read+=1
|
read+=1
|
||||||
|
|
||||||
# Last sequence
|
# Last sequence if not empty lines
|
||||||
seq = genbankParser(entry)
|
if entry.strip():
|
||||||
|
seq = genbankParser(entry)
|
||||||
yield seq
|
yield seq
|
||||||
|
|
||||||
free(entry)
|
free(entry)
|
||||||
|
|
||||||
|
@ -48,13 +48,13 @@ def ngsfilterIterator(lineiterator,
|
|||||||
all_lines.insert(0, firstline)
|
all_lines.insert(0, firstline)
|
||||||
|
|
||||||
# Insert header for column names
|
# Insert header for column names
|
||||||
column_names = [b"experiment", b"sample", b"forward_tag", b"reverse_tag", b"forward_primer", b"reverse_primer"]
|
column_names = [b"experiment", b"sample", b"forward_tag", b"reverse_tag", b"forward_primer", b"reverse_primer",b"additional_info"]
|
||||||
header = out_sep.join(column_names)
|
header = out_sep.join(column_names)
|
||||||
|
|
||||||
new_lines.append(header)
|
new_lines.append(header)
|
||||||
|
|
||||||
for line in all_lines:
|
for line in all_lines:
|
||||||
split_line = line.split()
|
split_line = line.split(maxsplit=5)
|
||||||
tags = split_line.pop(2)
|
tags = split_line.pop(2)
|
||||||
tags = tags.split(b":")
|
tags = tags.split(b":")
|
||||||
for t_idx in range(len(tags)):
|
for t_idx in range(len(tags)):
|
||||||
@ -64,7 +64,7 @@ def ngsfilterIterator(lineiterator,
|
|||||||
tags.append(tags[0])
|
tags.append(tags[0])
|
||||||
split_line.insert(2, tags[0])
|
split_line.insert(2, tags[0])
|
||||||
split_line.insert(3, tags[1])
|
split_line.insert(3, tags[1])
|
||||||
new_lines.append(out_sep.join(split_line[0:6]))
|
new_lines.append(out_sep.join(split_line[0:7]))
|
||||||
|
|
||||||
return tabIterator(iter(new_lines),
|
return tabIterator(iter(new_lines),
|
||||||
header = True,
|
header = True,
|
||||||
|
@ -173,7 +173,10 @@ def open_uri(uri,
|
|||||||
type newviewtype=View,
|
type newviewtype=View,
|
||||||
dms_only=False,
|
dms_only=False,
|
||||||
force_file=False):
|
force_file=False):
|
||||||
|
|
||||||
|
if type(uri) == str and not uri.isascii():
|
||||||
|
raise Exception("Paths must be ASCII characters only")
|
||||||
|
|
||||||
cdef bytes urib = tobytes(uri)
|
cdef bytes urib = tobytes(uri)
|
||||||
cdef bytes scheme
|
cdef bytes scheme
|
||||||
cdef tuple dms
|
cdef tuple dms
|
||||||
@ -192,7 +195,7 @@ def open_uri(uri,
|
|||||||
|
|
||||||
config = getConfiguration()
|
config = getConfiguration()
|
||||||
urip = urlparse(urib)
|
urip = urlparse(urib)
|
||||||
|
|
||||||
if 'obi' not in config:
|
if 'obi' not in config:
|
||||||
config['obi']={}
|
config['obi']={}
|
||||||
|
|
||||||
@ -209,13 +212,14 @@ def open_uri(uri,
|
|||||||
scheme = urip.scheme
|
scheme = urip.scheme
|
||||||
|
|
||||||
error = None
|
error = None
|
||||||
|
|
||||||
if urib != b"-" and \
|
if b'/taxonomy/' in urib or \
|
||||||
|
(urib != b"-" and \
|
||||||
(scheme==b"dms" or \
|
(scheme==b"dms" or \
|
||||||
(scheme==b"" and \
|
(scheme==b"" and \
|
||||||
(((not input) and "outputformat" not in config["obi"]) or \
|
(((not input) and "outputformat" not in config["obi"]) or \
|
||||||
(input and "inputformat" not in config["obi"])))): # TODO maybe not best way
|
(input and "inputformat" not in config["obi"]))))): # TODO maybe not best way
|
||||||
|
|
||||||
if default_dms is not None and b"/" not in urip.path: # assuming view to open in default DMS (TODO discuss)
|
if default_dms is not None and b"/" not in urip.path: # assuming view to open in default DMS (TODO discuss)
|
||||||
dms=(default_dms, urip.path)
|
dms=(default_dms, urip.path)
|
||||||
else:
|
else:
|
||||||
@ -223,7 +227,7 @@ def open_uri(uri,
|
|||||||
|
|
||||||
if dms is None and default_dms is not None:
|
if dms is None and default_dms is not None:
|
||||||
dms=(default_dms, urip.path)
|
dms=(default_dms, urip.path)
|
||||||
|
|
||||||
if dms is not None:
|
if dms is not None:
|
||||||
if dms_only:
|
if dms_only:
|
||||||
return (dms[0],
|
return (dms[0],
|
||||||
@ -248,7 +252,7 @@ def open_uri(uri,
|
|||||||
|
|
||||||
if default_dms is None:
|
if default_dms is None:
|
||||||
config["obi"]["defaultdms"]=resource[0]
|
config["obi"]["defaultdms"]=resource[0]
|
||||||
|
|
||||||
return (resource[0],
|
return (resource[0],
|
||||||
resource[1],
|
resource[1],
|
||||||
type(resource[1]),
|
type(resource[1]),
|
||||||
@ -276,7 +280,12 @@ def open_uri(uri,
|
|||||||
iseq = urib
|
iseq = urib
|
||||||
objclass = bytes
|
objclass = bytes
|
||||||
else: # TODO update uopen to be able to write?
|
else: # TODO update uopen to be able to write?
|
||||||
if not urip.path or urip.path == b'-':
|
if config['obi']['outputformat'] == b'metabaR':
|
||||||
|
if 'metabarprefix' not in config['obi']:
|
||||||
|
raise Exception("Prefix needed when exporting for metabaR (--metabaR-prefix option)")
|
||||||
|
else:
|
||||||
|
file = open(config['obi']['metabarprefix']+'.tab', 'wb')
|
||||||
|
elif not urip.path or urip.path == b'-':
|
||||||
file = sys.stdout.buffer
|
file = sys.stdout.buffer
|
||||||
else:
|
else:
|
||||||
file = open(urip.path, 'wb')
|
file = open(urip.path, 'wb')
|
||||||
@ -298,11 +307,11 @@ def open_uri(uri,
|
|||||||
format=config["obi"][formatkey]
|
format=config["obi"][formatkey]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
format=None
|
format=None
|
||||||
|
|
||||||
if b'seqtype' in qualifiers:
|
if b'seqtype' in qualifiers:
|
||||||
seqtype=qualifiers[b'seqtype'][0]
|
seqtype=qualifiers[b'seqtype'][0]
|
||||||
else:
|
else:
|
||||||
if format == b"ngsfilter" or format == b"tabular": # TODO discuss
|
if format == b"ngsfilter" or format == b"tabular" or format == b"metabaR": # TODO discuss
|
||||||
seqtype=None
|
seqtype=None
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
@ -426,7 +435,21 @@ def open_uri(uri,
|
|||||||
nastring=tobytes(config["obi"][nakey])
|
nastring=tobytes(config["obi"][nakey])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
nastring=b'NA'
|
nastring=b'NA'
|
||||||
|
|
||||||
|
if b"na_int_to_0" in qualifiers:
|
||||||
|
try:
|
||||||
|
na_int_to_0=eval(qualifiers[b"na_int_to_0"][0])
|
||||||
|
except Exception as e:
|
||||||
|
raise MalformedURIException("Malformed 'NA_int_to_0' argument in URI")
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
na_int_to_0=config["obi"]["na_int_to_0"]
|
||||||
|
except KeyError:
|
||||||
|
if format==b"tabular" or format==b"metabaR":
|
||||||
|
na_int_to_0=True
|
||||||
|
else:
|
||||||
|
na_int_to_0=False
|
||||||
|
|
||||||
if b"stripwhite" in qualifiers:
|
if b"stripwhite" in qualifiers:
|
||||||
try:
|
try:
|
||||||
stripwhite=eval(qualifiers[b"stripwhite"][0])
|
stripwhite=eval(qualifiers[b"stripwhite"][0])
|
||||||
@ -461,17 +484,36 @@ def open_uri(uri,
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
commentchar=b'#'
|
commentchar=b'#'
|
||||||
|
|
||||||
|
if b"only_keys" in qualifiers:
|
||||||
|
only_keys=qualifiers[b"only_keys"][0] # not sure that works but no one ever uses qualifiers
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
only_keys_str=config["obi"]["only_keys"]
|
||||||
|
only_keys=[]
|
||||||
|
for key in only_keys_str:
|
||||||
|
only_keys.append(tobytes(key))
|
||||||
|
except KeyError:
|
||||||
|
only_keys=[]
|
||||||
|
|
||||||
|
if b"metabaR_prefix" in qualifiers:
|
||||||
|
metabaR_prefix = tobytes(qualifiers[b"metabaR_prefix"][0][0])
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
metabaR_prefix = tobytes(config["obi"]["metabarprefix"])
|
||||||
|
except KeyError:
|
||||||
|
metabaR_prefix=None
|
||||||
|
|
||||||
if format is not None:
|
if format is not None:
|
||||||
if seqtype==b"nuc":
|
if seqtype==b"nuc":
|
||||||
objclass = Nuc_Seq # Nuc_Seq_Stored? TODO
|
objclass = Nuc_Seq # Nuc_Seq_Stored? TODO
|
||||||
if format==b"fasta" or format==b"silva":
|
if format==b"fasta" or format==b"silva" or format==b"rdp" or format == b"unite":
|
||||||
if input:
|
if input:
|
||||||
iseq = fastaNucIterator(file,
|
iseq = fastaNucIterator(file,
|
||||||
skip=skip,
|
skip=skip,
|
||||||
only=only,
|
only=only,
|
||||||
nastring=nastring)
|
nastring=nastring)
|
||||||
else:
|
else:
|
||||||
iseq = FastaNucWriter(FastaFormat(printNAKeys=printna, NAString=nastring),
|
iseq = FastaNucWriter(FastaFormat(tags=only_keys, printNAKeys=printna, NAString=nastring),
|
||||||
file,
|
file,
|
||||||
skip=skip,
|
skip=skip,
|
||||||
only=only)
|
only=only)
|
||||||
@ -484,7 +526,7 @@ def open_uri(uri,
|
|||||||
noquality=noquality,
|
noquality=noquality,
|
||||||
nastring=nastring)
|
nastring=nastring)
|
||||||
else:
|
else:
|
||||||
iseq = FastqWriter(FastqFormat(printNAKeys=printna, NAString=nastring),
|
iseq = FastqWriter(FastqFormat(tags=only_keys, printNAKeys=printna, NAString=nastring),
|
||||||
file,
|
file,
|
||||||
skip=skip,
|
skip=skip,
|
||||||
only=only)
|
only=only)
|
||||||
@ -520,7 +562,17 @@ def open_uri(uri,
|
|||||||
skip = skip,
|
skip = skip,
|
||||||
only = only)
|
only = only)
|
||||||
else:
|
else:
|
||||||
iseq = TabWriter(TabFormat(header=header, NAString=nastring, sep=sep),
|
iseq = TabWriter(TabFormat(tags=only_keys, header=header, NAString=nastring, sep=sep, NAIntTo0=na_int_to_0),
|
||||||
|
file,
|
||||||
|
skip=skip,
|
||||||
|
only=only,
|
||||||
|
header=header)
|
||||||
|
elif format==b"metabaR":
|
||||||
|
objclass = dict
|
||||||
|
if input:
|
||||||
|
raise NotImplementedError('Input data file format not implemented')
|
||||||
|
else:
|
||||||
|
iseq = TabWriter(TabFormat(tags=only_keys, header=header, NAString=nastring, sep=sep, NAIntTo0=na_int_to_0, metabaR=True),
|
||||||
file,
|
file,
|
||||||
skip=skip,
|
skip=skip,
|
||||||
only=only,
|
only=only,
|
||||||
@ -538,7 +590,7 @@ def open_uri(uri,
|
|||||||
skip = skip,
|
skip = skip,
|
||||||
only = only)
|
only = only)
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError('Output sequence file format not implemented')
|
raise NotImplementedError('Output data file format not implemented')
|
||||||
else:
|
else:
|
||||||
if input:
|
if input:
|
||||||
iseq, objclass, format = entryIteratorFactory(file,
|
iseq, objclass, format = entryIteratorFactory(file,
|
||||||
@ -556,7 +608,7 @@ def open_uri(uri,
|
|||||||
commentchar)
|
commentchar)
|
||||||
else: # default export is in fasta? or tab? TODO
|
else: # default export is in fasta? or tab? TODO
|
||||||
objclass = Nuc_Seq # Nuc_Seq_Stored? TODO
|
objclass = Nuc_Seq # Nuc_Seq_Stored? TODO
|
||||||
iseq = FastaNucWriter(FastaFormat(printNAKeys=printna, NAString=nastring),
|
iseq = FastaNucWriter(FastaFormat(tags=only_keys, printNAKeys=printna, NAString=nastring),
|
||||||
file,
|
file,
|
||||||
skip=skip,
|
skip=skip,
|
||||||
only=only)
|
only=only)
|
||||||
|
@ -18,7 +18,7 @@ cdef object clean_empty_values_from_object(object value, exclude=*)
|
|||||||
|
|
||||||
cdef obitype_t get_obitype_single_value(object value)
|
cdef obitype_t get_obitype_single_value(object value)
|
||||||
cdef obitype_t update_obitype(obitype_t obitype, object new_value)
|
cdef obitype_t update_obitype(obitype_t obitype, object new_value)
|
||||||
cdef obitype_t get_obitype_iterable_value(object value)
|
cdef obitype_t get_obitype_iterable_value(object value, type t)
|
||||||
cdef obitype_t get_obitype(object value)
|
cdef obitype_t get_obitype(object value)
|
||||||
|
|
||||||
cdef object __etag__(bytes x, bytes nastring=*)
|
cdef object __etag__(bytes x, bytes nastring=*)
|
||||||
|
@ -260,38 +260,51 @@ cdef obitype_t update_obitype(obitype_t obitype, object new_value) :
|
|||||||
|
|
||||||
new_type = type(new_value)
|
new_type = type(new_value)
|
||||||
|
|
||||||
if obitype == OBI_INT :
|
#if new_type == NoneType: # doesn't work because Cython sucks
|
||||||
if new_type == float or new_value > OBI_INT_MAX :
|
if new_value == None or new_type==list or new_type==dict or new_type==tuple:
|
||||||
return OBI_FLOAT
|
return obitype
|
||||||
# TODO BOOL vers INT/FLOAT
|
|
||||||
elif new_type == str or new_type == bytes :
|
# TODO BOOL to INT/FLOAT
|
||||||
|
if new_type == str or new_type == bytes :
|
||||||
if obitype == OBI_SEQ and is_a_DNA_seq(tobytes(new_value)) :
|
if obitype == OBI_SEQ and is_a_DNA_seq(tobytes(new_value)) :
|
||||||
pass
|
pass
|
||||||
else :
|
else :
|
||||||
return OBI_STR
|
return OBI_STR
|
||||||
|
elif obitype == OBI_INT :
|
||||||
|
if new_type == float or new_value > OBI_INT_MAX :
|
||||||
|
return OBI_FLOAT
|
||||||
|
|
||||||
return obitype
|
return obitype
|
||||||
|
|
||||||
|
|
||||||
cdef obitype_t get_obitype_iterable_value(object value) :
|
cdef obitype_t get_obitype_iterable_value(object value, type t) :
|
||||||
|
|
||||||
cdef obitype_t value_obitype
|
cdef obitype_t value_obitype
|
||||||
|
|
||||||
value_obitype = OBI_VOID
|
value_obitype = OBI_VOID
|
||||||
|
|
||||||
for k in value :
|
if t == dict:
|
||||||
if value_obitype == OBI_VOID :
|
for k in value :
|
||||||
value_obitype = get_obitype_single_value(value[k])
|
if value_obitype == OBI_VOID :
|
||||||
else :
|
value_obitype = get_obitype_single_value(value[k])
|
||||||
value_obitype = update_obitype(value_obitype, value[k])
|
else :
|
||||||
|
value_obitype = update_obitype(value_obitype, value[k])
|
||||||
|
|
||||||
|
elif t == list or t == tuple:
|
||||||
|
for v in value :
|
||||||
|
if value_obitype == OBI_VOID :
|
||||||
|
value_obitype = get_obitype_single_value(v)
|
||||||
|
else :
|
||||||
|
value_obitype = update_obitype(value_obitype, v)
|
||||||
|
|
||||||
return value_obitype
|
return value_obitype
|
||||||
|
|
||||||
|
|
||||||
cdef obitype_t get_obitype(object value) :
|
cdef obitype_t get_obitype(object value) :
|
||||||
|
|
||||||
if type(value) == dict or type(value) == list or type(value) == tuple :
|
t = type(value)
|
||||||
return get_obitype_iterable_value(value)
|
if t == dict or t == list or t == tuple :
|
||||||
|
return get_obitype_iterable_value(value, t)
|
||||||
|
|
||||||
else :
|
else :
|
||||||
return get_obitype_single_value(value)
|
return get_obitype_single_value(value)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
major = 3
|
major = 3
|
||||||
minor = 0
|
minor = 0
|
||||||
serial= '1b7'
|
serial= '1b17'
|
||||||
|
|
||||||
version ="%d.%d.%s" % (major,minor,serial)
|
version ="%d.%d.%s" % (major,minor,serial)
|
||||||
|
@ -20,8 +20,6 @@ cdef class TabWriter:
|
|||||||
self.only = -1
|
self.only = -1
|
||||||
else:
|
else:
|
||||||
self.only = int(only)
|
self.only = int(only)
|
||||||
if header:
|
|
||||||
self.only += 1
|
|
||||||
|
|
||||||
self.formatter = formatter
|
self.formatter = formatter
|
||||||
self.output = output_object
|
self.output = output_object
|
||||||
|
@ -77,6 +77,7 @@ static inline ecotx_t* get_lca_from_merged_taxids(Obiview_p view, OBIDMS_column_
|
|||||||
{
|
{
|
||||||
ecotx_t* taxon = NULL;
|
ecotx_t* taxon = NULL;
|
||||||
ecotx_t* lca = NULL;
|
ecotx_t* lca = NULL;
|
||||||
|
ecotx_t* lca1 = NULL;
|
||||||
int32_t taxid;
|
int32_t taxid;
|
||||||
index_t taxid_idx;
|
index_t taxid_idx;
|
||||||
int64_t taxid_str_idx;
|
int64_t taxid_str_idx;
|
||||||
@ -108,10 +109,11 @@ static inline ecotx_t* get_lca_from_merged_taxids(Obiview_p view, OBIDMS_column_
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Compute LCA
|
// Compute LCA
|
||||||
|
lca1 = lca;
|
||||||
lca = obi_taxo_get_lca(taxon, lca);
|
lca = obi_taxo_get_lca(taxon, lca);
|
||||||
if (lca == NULL)
|
if (lca == NULL)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError getting the last common ancestor of two taxa when building a reference database");
|
obidebug(1, "\nError getting the last common ancestor of two taxa when building a reference database, %d %d", taxid, lca1->taxid);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,7 +187,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");
|
fprintf(stderr, "Aligning sequences...\n");
|
||||||
if (obi_lcs_align_one_column(dms_name,
|
if (obi_lcs_align_one_column(dms_name,
|
||||||
refs_view_name,
|
refs_view_name,
|
||||||
"",
|
"",
|
||||||
@ -863,7 +865,8 @@ int build_reference_db(const char* dms_name,
|
|||||||
fprintf(stderr,"\rDone : 100 %% \n");
|
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);
|
#define snprintf_nowarn(...) (snprintf(__VA_ARGS__) < 0 ? abort() : (void)0)
|
||||||
|
snprintf_nowarn(threshold_str, 5, "%f", threshold);
|
||||||
|
|
||||||
new_comments = obi_add_comment((o_view->infos)->comments, DB_THRESHOLD_KEY_IN_COMMENTS, threshold_str);
|
new_comments = obi_add_comment((o_view->infos)->comments, DB_THRESHOLD_KEY_IN_COMMENTS, threshold_str);
|
||||||
if (new_comments == NULL)
|
if (new_comments == NULL)
|
||||||
|
@ -645,7 +645,8 @@ static int print_seq(Obiview_p i_view, Obiview_p o_view,
|
|||||||
|
|
||||||
int obi_ecopcr(const char* i_dms_name,
|
int obi_ecopcr(const char* i_dms_name,
|
||||||
const char* i_view_name,
|
const char* i_view_name,
|
||||||
const char* taxonomy_name, // TODO discuss that input dms assumed
|
const char* tax_dms_name,
|
||||||
|
const char* taxonomy_name,
|
||||||
const char* o_dms_name,
|
const char* o_dms_name,
|
||||||
const char* o_view_name,
|
const char* o_view_name,
|
||||||
const char* o_view_comments,
|
const char* o_view_comments,
|
||||||
@ -678,6 +679,7 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
|
|
||||||
OBIDMS_p i_dms = NULL;
|
OBIDMS_p i_dms = NULL;
|
||||||
OBIDMS_p o_dms = NULL;
|
OBIDMS_p o_dms = NULL;
|
||||||
|
OBIDMS_p tax_dms = NULL;
|
||||||
OBIDMS_taxonomy_p taxonomy = NULL;
|
OBIDMS_taxonomy_p taxonomy = NULL;
|
||||||
Obiview_p i_view = NULL;
|
Obiview_p i_view = NULL;
|
||||||
Obiview_p o_view = NULL;
|
Obiview_p o_view = NULL;
|
||||||
@ -965,8 +967,16 @@ int obi_ecopcr(const char* i_dms_name,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open taxonomy DMS
|
||||||
|
tax_dms = obi_open_dms(tax_dms_name, false);
|
||||||
|
if (tax_dms == NULL)
|
||||||
|
{
|
||||||
|
obidebug(1, "\nError opening the taxonomy DMS");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// Open the taxonomy
|
// Open the taxonomy
|
||||||
taxonomy = obi_read_taxonomy(i_dms, taxonomy_name, false);
|
taxonomy = obi_read_taxonomy(tax_dms, taxonomy_name, false);
|
||||||
if (taxonomy == NULL)
|
if (taxonomy == NULL)
|
||||||
{
|
{
|
||||||
obidebug(1, "\nError opening the taxonomy");
|
obidebug(1, "\nError opening the taxonomy");
|
||||||
|
@ -77,7 +77,8 @@
|
|||||||
*
|
*
|
||||||
* @param i_dms_name The path to the input DMS.
|
* @param i_dms_name The path to the input DMS.
|
||||||
* @param i_view_name The name of the input view.
|
* @param i_view_name The name of the input view.
|
||||||
* @param taxonomy_name The name of the taxonomy in the input DMS.
|
* @param tax_dms_name The path to the DMS containing the taxonomy.
|
||||||
|
* @param taxonomy_name The name of the taxonomy.
|
||||||
* @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.
|
||||||
@ -106,6 +107,7 @@
|
|||||||
*/
|
*/
|
||||||
int obi_ecopcr(const char* i_dms_name,
|
int obi_ecopcr(const char* i_dms_name,
|
||||||
const char* i_view_name,
|
const char* i_view_name,
|
||||||
|
const char* tax_dms_name,
|
||||||
const char* taxonomy_name,
|
const char* taxonomy_name,
|
||||||
const char* o_dms_name,
|
const char* o_dms_name,
|
||||||
const char* o_view_name,
|
const char* o_view_name,
|
||||||
|
@ -233,7 +233,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
// Write result (max score, threshold, LCA assigned, list of the ids of the best matches)
|
// Write result (max score, threshold, LCA assigned, list of the ids of the best matches)
|
||||||
|
|
||||||
|
|
||||||
index_t i, j, k;
|
index_t i, j, k, t;
|
||||||
ecotx_t* lca;
|
ecotx_t* lca;
|
||||||
ecotx_t* lca_in_array;
|
ecotx_t* lca_in_array;
|
||||||
ecotx_t* best_match;
|
ecotx_t* best_match;
|
||||||
@ -259,16 +259,20 @@ int obi_ecotag(const char* dms_name,
|
|||||||
int32_t* best_match_taxids;
|
int32_t* best_match_taxids;
|
||||||
int32_t* best_match_taxids_to_store;
|
int32_t* best_match_taxids_to_store;
|
||||||
int best_match_count;
|
int best_match_count;
|
||||||
|
int best_match_taxid_count;
|
||||||
int buffer_size;
|
int buffer_size;
|
||||||
int best_match_ids_buffer_size;
|
int best_match_ids_buffer_size;
|
||||||
index_t best_match_idx;
|
index_t best_match_idx;
|
||||||
int32_t lca_array_length;
|
int32_t lca_array_length;
|
||||||
int32_t lca_taxid;
|
int32_t lca_taxid;
|
||||||
int32_t taxid_best_match;
|
int32_t taxid_best_match;
|
||||||
|
int32_t taxid;
|
||||||
|
int32_t taxid_to_store;
|
||||||
bool assigned;
|
bool assigned;
|
||||||
const char* lca_name;
|
const char* lca_name;
|
||||||
const char* id;
|
const char* id;
|
||||||
int id_len;
|
int id_len;
|
||||||
|
bool already_in;
|
||||||
|
|
||||||
OBIDMS_p dms = NULL;
|
OBIDMS_p dms = NULL;
|
||||||
OBIDMS_p ref_dms = NULL;
|
OBIDMS_p ref_dms = NULL;
|
||||||
@ -488,10 +492,11 @@ int obi_ecotag(const char* dms_name,
|
|||||||
|
|
||||||
for (i=0; i < query_count; i++)
|
for (i=0; i < query_count; i++)
|
||||||
{
|
{
|
||||||
if (i%1000 == 0)
|
if (i%10 == 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;
|
||||||
|
best_match_taxid_count = 0;
|
||||||
best_match_ids_length = 0;
|
best_match_ids_length = 0;
|
||||||
threshold = ecotag_threshold;
|
threshold = ecotag_threshold;
|
||||||
best_score = 0.0;
|
best_score = 0.0;
|
||||||
@ -543,6 +548,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
// Reset the array with that match
|
// Reset the array with that match
|
||||||
best_match_ids_length = 0;
|
best_match_ids_length = 0;
|
||||||
best_match_count = 0;
|
best_match_count = 0;
|
||||||
|
best_match_taxid_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store in best match array
|
// Store in best match array
|
||||||
@ -585,8 +591,27 @@ 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++;
|
||||||
|
|
||||||
|
// Save best match taxid only if not already in array
|
||||||
|
taxid_to_store = obi_get_int_with_elt_idx_and_col_p_in_view(ref_view, ref_taxid_column, j, 0);
|
||||||
|
already_in = false;
|
||||||
|
for (t=0; t<best_match_taxid_count; t++)
|
||||||
|
{
|
||||||
|
taxid = best_match_taxids[t];
|
||||||
|
//fprintf(stderr, "\ntaxid %d, taxid_to_store %d\n", taxid, taxid_to_store);
|
||||||
|
if (taxid == taxid_to_store)
|
||||||
|
{
|
||||||
|
already_in = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (! already_in)
|
||||||
|
{
|
||||||
|
best_match_taxids[best_match_taxid_count] = taxid_to_store;
|
||||||
|
best_match_taxid_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;
|
||||||
}
|
}
|
||||||
@ -693,7 +718,7 @@ int obi_ecotag(const char* dms_name,
|
|||||||
assigned_name_column, lca_name,
|
assigned_name_column, lca_name,
|
||||||
assigned_status_column, assigned,
|
assigned_status_column, assigned,
|
||||||
best_match_ids_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,
|
best_match_taxids_column, best_match_taxids_to_store, best_match_taxid_count,
|
||||||
score_column, best_score
|
score_column, best_score
|
||||||
) < 0)
|
) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
14
src/obidms.c
14
src/obidms.c
@ -1417,7 +1417,7 @@ char* obi_dms_formatted_infos(OBIDMS_p dms, bool detailed)
|
|||||||
char* view_name = NULL;
|
char* view_name = NULL;
|
||||||
char* tax_name = NULL;
|
char* tax_name = NULL;
|
||||||
char* all_tax_dir_path = NULL;
|
char* all_tax_dir_path = NULL;
|
||||||
int i;
|
int i, last_dot_pos;
|
||||||
struct dirent* dp;
|
struct dirent* dp;
|
||||||
Obiview_p view;
|
Obiview_p view;
|
||||||
|
|
||||||
@ -1439,17 +1439,21 @@ char* obi_dms_formatted_infos(OBIDMS_p dms, bool detailed)
|
|||||||
if ((dp->d_name)[0] == '.')
|
if ((dp->d_name)[0] == '.')
|
||||||
continue;
|
continue;
|
||||||
i=0;
|
i=0;
|
||||||
while ((dp->d_name)[i] != '.')
|
while (i < strlen(dp->d_name))
|
||||||
|
{
|
||||||
|
if ((dp->d_name)[i] == '.')
|
||||||
|
last_dot_pos = i;
|
||||||
i++;
|
i++;
|
||||||
view_name = (char*) malloc((i+1) * sizeof(char));
|
}
|
||||||
|
view_name = (char*) malloc((last_dot_pos+1) * sizeof(char));
|
||||||
if (view_name == NULL)
|
if (view_name == NULL)
|
||||||
{
|
{
|
||||||
obi_set_errno(OBI_MALLOC_ERROR);
|
obi_set_errno(OBI_MALLOC_ERROR);
|
||||||
obidebug(1, "\nError allocating memory for a view name when getting formatted DMS infos: file %s", dp->d_name);
|
obidebug(1, "\nError allocating memory for a view name when getting formatted DMS infos: file %s", dp->d_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
strncpy(view_name, dp->d_name, i);
|
strncpy(view_name, dp->d_name, last_dot_pos);
|
||||||
view_name[i] = '\0';
|
view_name[last_dot_pos] = '\0';
|
||||||
view = obi_open_view(dms, view_name);
|
view = obi_open_view(dms, view_name);
|
||||||
if (view == NULL)
|
if (view == NULL)
|
||||||
{
|
{
|
||||||
|
@ -873,7 +873,7 @@ static ecotxidx_t* read_taxonomy_idx(const char* taxa_file_name, const char* loc
|
|||||||
taxa_index->buffer_size = taxa_index->count;
|
taxa_index->buffer_size = taxa_index->count;
|
||||||
|
|
||||||
taxa_index->max_taxid = 0;
|
taxa_index->max_taxid = 0;
|
||||||
printf("Reading %d taxa...\n", count_taxa);
|
fprintf(stderr, "Reading %d taxa...\n", count_taxa);
|
||||||
for (i=0; i<count_taxa; i++)
|
for (i=0; i<count_taxa; i++)
|
||||||
{
|
{
|
||||||
readnext_ecotaxon(f_taxa, &(taxa_index->taxon[i]));
|
readnext_ecotaxon(f_taxa, &(taxa_index->taxon[i]));
|
||||||
@ -886,9 +886,9 @@ static ecotxidx_t* read_taxonomy_idx(const char* taxa_file_name, const char* loc
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (count_local_taxa > 0)
|
if (count_local_taxa > 0)
|
||||||
printf("Reading %d local taxa...\n", count_local_taxa);
|
fprintf(stderr, "Reading %d local taxa...\n", count_local_taxa);
|
||||||
else
|
else
|
||||||
printf("No local taxa\n");
|
fprintf(stderr, "No local taxa\n");
|
||||||
|
|
||||||
count_taxa = taxa_index->count;
|
count_taxa = taxa_index->count;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
*/
|
*/
|
||||||
#define COLUMN_GROWTH_FACTOR (2) /**< The growth factor when a column is enlarged.
|
#define COLUMN_GROWTH_FACTOR (2) /**< The growth factor when a column is enlarged.
|
||||||
*/
|
*/
|
||||||
#define MAXIMUM_LINE_COUNT (1000000000) /**< The maximum line count for the data of a column (1E9). //TODO
|
#define MAXIMUM_LINE_COUNT (1000000000000) /**< The maximum line count for the data of a column (1E12). //TODO
|
||||||
*/
|
*/
|
||||||
#define COMMENTS_MAX_LENGTH (4096) /**< The maximum length for comments.
|
#define COMMENTS_MAX_LENGTH (4096) /**< The maximum length for comments.
|
||||||
*/
|
*/
|
||||||
|
@ -2910,7 +2910,7 @@ int obi_clean_unfinished_views(OBIDMS_p dms)
|
|||||||
if ((dp->d_name)[0] == '.')
|
if ((dp->d_name)[0] == '.')
|
||||||
continue;
|
continue;
|
||||||
i=0;
|
i=0;
|
||||||
while ((dp->d_name)[i] != '.')
|
while (strncmp((dp->d_name)+i, ".obiview", 8))
|
||||||
i++;
|
i++;
|
||||||
relative_path = (char*) malloc(strlen(VIEW_DIR_NAME) + strlen(dp->d_name) + 2);
|
relative_path = (char*) malloc(strlen(VIEW_DIR_NAME) + strlen(dp->d_name) + 2);
|
||||||
strcpy(relative_path, VIEW_DIR_NAME);
|
strcpy(relative_path, VIEW_DIR_NAME);
|
||||||
|
Reference in New Issue
Block a user