14 Commits
Author SHA1 Message Date
coissac bc4d7dc190 Actualiser README.md 2025-09-14 07:46:53 +00:00
Eric Coissac 8c995a47a0 add flex 2025-06-22 15:53:18 +02:00
coissac 02232d6453 Actualiser Dockerfile 2025-06-16 06:16:12 +00:00
coissac 9a9a968116 Actualiser Dockerfile 2025-06-14 05:14:06 +00:00
coissac feca46cbfd Actualiser Dockerfile 2025-06-14 05:12:06 +00:00
coissac 5ea47205c5 Actualiser Dockerfile 2025-06-14 05:11:12 +00:00
coissac bca9928ade Actualiser Dockerfile 2025-06-14 05:10:22 +00:00
coissac 8cafb794b0 Actualiser Dockerfile 2025-06-14 04:50:38 +00:00
coissac cb13a8d228 Actualiser Dockerfile 2025-06-14 04:27:54 +00:00
coissac 83beecb6ec Actualiser Dockerfile 2025-06-13 21:41:15 +00:00
coissac 73030ff54f Actualiser Dockerfile 2025-06-13 18:08:19 +00:00
coissac 51ff099cca Actualiser Dockerfile 2025-06-13 14:13:43 +00:00
Eric Coissac 171920398c Update pour la dockerization 2025-06-12 17:29:50 +02:00
Celine Mercier edb0106cc0 obiaddtaxids: UNITE databases not restrained to Fungi anymore, and
better check of format
2020-04-05 17:14:04 +02:00
13 changed files with 181717 additions and 115 deletions
+102
View File
@@ -0,0 +1,102 @@
FROM python:2.7.17-alpine AS builder
RUN apk add --no-cache \
bash flex build-base curl openssl-dev bzip2-dev readline-dev sqlite-dev zlib-dev xz-dev tk-dev libffi-dev make ncurses-dev git
RUN pip install Cython==0.29
RUN mkdir -p /app
WORKDIR /app
COPY src .
RUN gcc -o littlebigman littlebigman.c
RUN python setup.py build_ext --inplace
RUN python setup.py install
RUN ./install.sh
WORKDIR /app
RUN git clone https://forge.metabarcoding.org/obitools/ecopcr.git
WORKDIR /app/ecopcr/src
RUN make clean && make \
&& cp ecoPCR ecofind ecogrep /usr/local/bin
WORKDIR /app
RUN git clone https://forge.metabarcoding.org/obitools/ecoprimers.git
WORKDIR /app/ecoprimers/src
RUN make clean && make \
&& cp ecoPrimers /usr/local/bin \
&& cp ../tools/ecoPCRFormat.py /usr/local/bin/ecoPCRFormat \
&& chmod +x /usr/local/bin/ecoPCRFormat
WORKDIR /app
RUN git clone --recurse-submodules https://forge.metabarcoding.org/obitools/sumatra.git
WORKDIR /app/sumatra
RUN make clean && make \
&& cp sumatra /usr/local/bin
WORKDIR /app
RUN git clone --recurse-submodules https://forge.metabarcoding.org/obitools/sumaclust.git
WORKDIR /app/sumaclust
RUN make clean && make \
&& cp sumaclust /usr/local/bin
RUN find /usr/local/bin /usr/local/python2/bin /usr/local/python2/lib -type f -exec file {} \; | \
grep -E 'ELF (32-bit|64-bit) (executable|shared object)' | \
cut -d: -f1 | \
xargs -r strip --strip-unneeded || true
RUN pip install "virtualenv<20" && \
virtualenv --system-site-packages /obitools-doc
ENV PATH="/obitools-doc/bin:${PATH}"
RUN pip install "sphinx==1.8.5"
COPY doc /obitools-doc/doc
RUN echo "/doc" > /obitools-doc/doc/sphinx/build_dir.txt
ENV PYTHONPATH="/app"
WORKDIR /obitools-doc/doc/sphinx
RUN make html
RUN cp /app/docserver.sh /usr/local/bin/docserver
RUN chmod +x /usr/local/bin/docserver
#--- Image finale minimaliste ---
FROM python:2.7.17-alpine
LABEL org.opencontainers.image.title="OBITools2 (legacy)"
LABEL org.opencontainers.image.description="Legacy OBITools2 environment for compatibility with older pipelines and benchmarks. Includes OBITools2, ecoPCR, ecoPrimers, sumatra, and sumaclust. Python 2-based software stack. Full documentation embedded in the image."
LABEL org.opencontainers.image.version="latest"
LABEL org.opencontainers.image.authors="Eric Coissac <eric.coissac@metabarcoding.org>"
LABEL org.opencontainers.image.url="https://registry.metabarcoding.org/image/obitools%2Fobitools2"
LABEL org.opencontainers.image.documentation="https://metabarcoding.org/en/obitools/obitools2"
LABEL org.opencontainers.image.source="https://forge.metabarcoding.org/obitools/obitools"
# Dépendances runtime seulement (exemple)
RUN apk add --no-cache \
openssl \
zlib \
libgomp
# Copier Python compilé et libs depuis le builder
COPY --from=builder /usr/local/lib/python2.7/site-packages /usr/local/lib/python2.7/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY --from=builder /obitools-doc/doc/sphinx/build/html /doc
RUN rm -rf /usr/local/share /usr/local/include /usr/local/lib/pkgconfig /usr/local/lib/python2.7/test && \
find /usr/local/bin /usr/local/python2/bin /usr/local/python2/lib -type f -exec file {} \; | \
grep -E 'ELF (32-bit|64-bit) (executable|shared object)' | \
cut -d: -f1 | \
xargs -r strip --strip-unneeded || true
RUN mkdir -p /data
ENV LD_LIBRARY_PATH=/usr/local/lib
ENV PATH="/usr/local/bin:${PATH}"
VOLUME ["/data"]
WORKDIR /data
CMD ["ash"]
+11
View File
@@ -0,0 +1,11 @@
# Legacy OBITools status
Legacy OBITools is 20 years old. It was developed using Python 2, a language that is no longer supported. Therefore, maintaining this code is impossible. It has now been superseded by OBITools4, the latest version in the OBITools lineage.
In order to enable users to continue using Legacy OBITools, a Docker image has been created and made available on the [metabarcoding.org registry](https://registry.metabarcoding.org). While we discourage using this old version for new projects, being able to run it can still be useful for reproducibility purposes.
You can find more information about using this Docker image on the [relevant page](https://metabarcoding.org/en/obitools/obitools2) of the [new metabarcoding website](https://metabarcoding.org).
All the best,
Eric Coissac
View File
-109
View File
@@ -35,115 +35,6 @@ and all the sources can be downloaded from our subversion server
Prerequisites
.............
To install the ``OBITools``, you need that these softwares are installed on your
system:
* Python 2.7 (installed by default on most ``Unix`` systems, available from
`the Python website <http://www.python.org/>`_)
* ``gcc`` (installed by default on most ``Unix`` systems, available from the
GNU sites dedicated to `GCC <https://www.gnu.org/software/gcc/>`_ and
`GMake <https://www.gnu.org/software/make/>`_)
On a linux system
^^^^^^^^^^^^^^^^^
You have to take care that the Python-dev packages are installed.
On MacOSX
^^^^^^^^^
The C compiler and all the other compilation tools are included in the `XCode <https://itunes.apple.com/fr/app/xcode/id497799835?mt=12>`_
application not installed by default. The Python included in the system is not
suitable for running the ``OBITools``. You have to install a complete distribution
of Python that you can download as a `MacOSX package from the Python website <https://www.python.org/downloads/>`_.
Downloading and installing the ``OBITools``
...........................................
The ``OBITools`` are downloaded and installed using the :download:`get-obitools.py <../../../get_obitools/get-obitools.py>` script.
This is a user level installation that does not need administrator privilege.
Once downloaded, move the file :download:`get-obitools.py <../../../get_obitools/get-obitools.py>` in the directory where you want to install
the ``OBITools``. From a Unix terminal you must now run the command :
.. code-block:: bash
> python get-obitools.py
The script will create a new directory at the place you are running it in which all the
``OBITools`` will be installed. No system privilege are required, and you system will not
be altered in any way by the obitools installation.
The newly created directory is named OBITools-VERSION where version is substituted by the
latest version number available.
Inside the newly created directory all the ``OBITools`` are installed. Close to this directory
there is a shell script named ``obitools``. Running this script activate the ``OBITools``
by reconfiguring your Unix environment.
.. code-block:: bash
> ./obitools
Once activated you can desactivate the ``OBITools`` byt typing the command ``exit``.
.. code-block:: bash
> exit
OBITools are no more activated, Bye...
======================================
System level installation
.........................
To install the ``OBITools`` at the system level you can follow two options :
- copy the ``obitools`` script in a usual directory for installing program like ``/usr/local/bin``
but never move the ``OBITools`` directory itself after the installation by the
:download:`get-obitools.py <../../../get_obitools/get-obitools.py>`.
- The other solution is to add the ``export/bin`` directory located in the ``OBITools`` directory
to the ``PATH``environment variable.
Retrieving the sources of the OBITools
......................................
If you want to compile by yourself the ``OBITools``, you will need to install the same
prerequisite:
.. code-block:: bash
> pip install -U virtualenv
> pip install -U sphinx
> pip install -U cython
moreover you need to install any subversion client (a list of clients is available from `Wikipedia <http://en.wikipedia.org/wiki/Comparison_of_Subversion_clients>`_)
Then you can download the
.. code-block:: bash
> svn co http://www.grenoble.prabi.fr/public-svn/OBISofts/OBITools/branches/OBITools-1.00/ OBITools
This command will create a new directory called ``OBITools``.
Compiling and installing the ``OBITools``
.........................................
From the directory where you retrieved the sources, execute the following commands:
.. code-block:: bash
> cd OBITools
> python setup.py --serenity install
Once installed, you can test your installation by running the commands of the
:doc:`tutorials <./tutorials>`.
Introduction
+10
View File
@@ -0,0 +1,10 @@
#!/bin/ash
# Par défaut : /doc
DOC_DIR="${1:-/doc}"
PORT="${2:-8080}"
echo "Serving documentation from $DOC_DIR on port $PORT..."
cd "$DOC_DIR" || { echo "Directory not found: $DOC_DIR"; exit 1; }
python -m SimpleHTTPServer "$PORT"
Executable
+30
View File
@@ -0,0 +1,30 @@
#!/bin/ash
set -e
SRC_DIR="/app"
DEST_DIR="/usr/local/bin"
PYTHON_INTERPRETER="$DEST_DIR/python2"
mkdir -p "$DEST_DIR"
for f in "$SRC_DIR"/*.py; do
[ -e "$f" ] || continue # skip if no .py files
# skip setup.py explicitly
case "$(basename "$f")" in
setup.py) continue ;;
esac
base=$(basename "$f" .py)
dest="$DEST_DIR/$base"
# rewrite shebang line
{
echo "#!$PYTHON_INTERPRETER"
tail -n +2 "$f"
} > "$dest"
chmod +x "$dest"
echo "Installed script: $dest"
done
+24
View File
@@ -0,0 +1,24 @@
/*
* littlebigman.c
*
* Created on: 11 juil. 2012
* Author: coissac
*/
#include<stdio.h>
int main(int argc, char *argv[])
{
union { int entier;
char caractere[4] ;
} test;
test.entier=0x01020304;
if (test.caractere[3] == 1)
printf("-DLITTLE_END");
else
printf("-DBIG_END");
return 0;
}
+3 -1
View File
@@ -348,6 +348,8 @@ if __name__=='__main__':
entryIterator = SILVAIterator
entries = entryIterator(entries, tax)
options.tagname = 'species_name'
else:
raise Exception("Invalid database format (see --format option)")
openFiles(options)
@@ -395,7 +397,7 @@ if __name__=='__main__':
elif ((options.db_type =='UNITE_FULL') or (options.db_type =='UNITE_GENERAL')) :
restricting_ancestor = tax.findTaxonByName('Fungi')[0][0]
restricting_ancestor = None
for s in entries :
+3 -5
View File
@@ -156,11 +156,9 @@
* a data set that will trigger the worst case is nonexistent. Heapsort's
* only advantage over quicksort is that it requires little additional memory.
*/
int
heapsort(vbase, nmemb, size, compar)
void *vbase;
size_t nmemb, size;
int (*compar) __P((const void *, const void *));
int heapsort(void *vbase, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
register int cnt, i, j, l;
register char tmp, *tmp1, *tmp2;
+35
View File
@@ -0,0 +1,35 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <limits.h>
int main(int argc, char* argv[])
{
if (argc < 2) {
fprintf(stderr, "Usage: %s <pid>\n", argv[0]);
return 1;
}
pid_t pid = (pid_t)atoi(argv[1]);
char pathbuf[PATH_MAX];
char proc_path[64];
// Construire le chemin vers le lien symbolique de l'exécutable
snprintf(proc_path, sizeof(proc_path), "/proc/%d/exe", pid);
// Lire le chemin via le lien symbolique
ssize_t len = readlink(proc_path, pathbuf, sizeof(pathbuf) - 1);
if (len == -1) {
fprintf(stderr, "PID %d: readlink() failed\n", pid);
fprintf(stderr, " %s\n", strerror(errno));
return 1;
}
// Terminer la chaîne correctement
pathbuf[len] = '\0';
printf("proc %d: %s\n", pid, pathbuf);
return 0;
}
+117
View File
@@ -0,0 +1,117 @@
# -*- coding: utf-8 -*-
import os
import glob
import subprocess
from setuptools import setup, Extension, find_packages
from Cython.Build import cythonize
def find_cython_modules(base_dir):
"""
Find Cython modules recursively in `base_dir`, following these rules:
- For each _toto.pyx file:
* Include _toto*.c files except _toto.c
* Parse _toto.lnk to compile listed .c files into .o if not yet compiled
* Include .o files from the .lnk file
* Include include_dirs listed in _toto.cfiles
Returns a list of setuptools.Extension instances.
"""
extensions = []
for dirpath, _, filenames in os.walk(base_dir):
for filename in filenames:
if not filename.endswith(".pyx"):
continue
pyx_path = os.path.join(dirpath, filename)
prefix = pyx_path[:-4] # remove ".pyx"
# Find all _toto*.c except _toto.c itself
c_files = sorted([
f for f in glob.glob(prefix + "*.c")
if f != prefix + ".c"
])
# Read include directories from _toto.cfiles if exists
cfiles_path = prefix + ".cfiles"
include_dirs = []
if os.path.isfile(cfiles_path):
with open(cfiles_path) as f:
include_dirs = [line.strip() for line in f if line.strip()]
# Read .lnk file listing additional source .c files to compile into .o
lnk_path = prefix + ".lnk"
o_files = []
if os.path.isfile(lnk_path):
with open(lnk_path) as f:
for line in f:
line = line.strip()
if not line:
continue
# If line ends with .c, compile it to .o if needed
if line.endswith(".c"):
c_file = line
# If relative path, resolve relative to pyx_path dir
if not os.path.isabs(c_file):
c_file = os.path.join(dirpath, c_file)
o_file = os.path.splitext(c_file)[0] + ".o"
if not os.path.isfile(o_file):
print("Compiling to object:", c_file)
cmd = ["gcc", "-c", "-fPIC", "-O2", c_file, "-o", o_file]
for inc in include_dirs:
cmd.extend(["-I", inc])
subprocess.check_call(cmd)
o_files.append(o_file)
else:
# For non-.c lines in .lnk, ignore or raise?
# Here just ignore
pass
# Module name relative to base_dir, convert path to dotted module name
relpath = os.path.relpath(pyx_path, ".") # <-- par rapport à la racine du projet
modname = os.path.splitext(relpath)[0].replace(os.sep, ".")
assert modname.startswith("obitools."), "Module name should start with 'obitools.'"
print("Extension module name:", modname)
print("Expected output path:", modname.replace('.', os.sep) + ".so")
print("Building extension:", modname)
print(" Sources:")
for s in [pyx_path] + c_files + o_files:
print(" -", s)
print(" Include dirs:")
for inc in include_dirs:
print(" -", inc)
ext = Extension(
modname,
sources=[pyx_path] + c_files + o_files,
include_dirs=include_dirs,
)
extensions.append(ext)
print("Cython modules:", extensions)
return extensions
print("Packages found:", find_packages())
setup(
name="obitools",
version="2.0.0",
description="OBITools metabarcoding toolkit",
author="Eric Coissac <eric.coissac@metabarcoding.org>",
packages=find_packages(),
# package_dir option can be removed if obitools/ is in current dir
ext_modules=cythonize(
find_cython_modules("obitools"),
compiler_directives={'embedsignature': True},
language_level=2,
include_path=["obitools"]
),
# Remove ext_package here!
zip_safe=False,
include_package_data=True,
options={'build_ext': {'force': True}},
)
+278
View File
@@ -0,0 +1,278 @@
```markdown
/ 📂 app
├── 📄 ali2consensus.py
├── 📄 ecodbtaxstat.py
├── 📄 ecotag.py
├── 📄 ecotaxspecificity.py
├── 📄 ecotaxstat.py
├── 📄 extractreads.py
├── 📄 extractreads2.py
├── 📄 illuminapairedend.py
├── 📄 ngsfilter.py
├── 📄 obiaddtaxids.py
├── 📄 obiannotate.py
├── 📄 obiclean.py
├── 📄 obicomplement.py
├── 📄 obiconvert.py
├── 📄 obicount.py
├── 📄 obicut.py
├── 📄 obidistribute.py
├── 📄 obiextract.py
├── 📄 obigrep.py
├── 📄 obihead.py
├── 📄 obijoinpairedend.py
├── 📄 obipr2.py
├── 📄 obisample.py
├── 📄 obiselect.py
├── 📄 obisilva.py
├── 📄 obisort.py
├── 📄 obisplit.py
├── 📄 obistat.py
├── 📄 obisubset.py
├── 📄 obitab.py
├── 📄 obitail.py
├── 📄 obitaxonomy.py
└── 📂 obitools/
│ ├── 📄 SVGdraw.py
│ ├── 📄 __init__.py
│ ├── 📄 _obitools.h
│ ├── 📄 _obitools.pxd
│ ├── 📄 _obitools.pyx
│ └── 📂 align/
│ ├── 📄 __init__.py
│ ├── 📄 _assemble.pxd
│ ├── 📄 _assemble.pyx
│ ├── 📄 _codonnws.pxd
│ ├── 📄 _codonnws.pyx
│ ├── 📄 _dynamic.pxd
│ ├── 📄 _dynamic.pyx
│ ├── 📄 _freeendgap.pxd
│ ├── 📄 _freeendgap.pyx
│ ├── 📄 _freeendgapfm.pxd
│ ├── 📄 _freeendgapfm.pyx
│ ├── 📄 _gprofilenws.pxd
│ ├── 📄 _gprofilenws.pyx
│ ├── 📄 _lcs.cfiles
│ ├── 📄 _lcs.ext.1.c
│ ├── 📄 _lcs.ext.2.c
│ ├── 📄 _lcs.ext.3.c
│ ├── 📄 _lcs.ext.4.c
│ ├── 📄 _lcs.h
│ ├── 📄 _lcs.lnk
│ ├── 📄 _lcs.pxd
│ ├── 📄 _lcs.pyx
│ ├── 📄 _lcs_fast.h
│ ├── 📄 _nws.pxd
│ ├── 📄 _nws.pyx
│ ├── 📄 _nwsdnabyprot.pxd
│ ├── 📄 _nwsdnabyprot.pyx
│ ├── 📄 _profilenws.pxd
│ ├── 📄 _profilenws.pyx
│ ├── 📄 _qsassemble.pyx
│ ├── 📄 _qsrassemble.pyx
│ ├── 📄 _rassemble.pxd
│ ├── 📄 _rassemble.pyx
│ ├── 📄 _sse.h
│ ├── 📄 _upperbond.cfiles
│ ├── 📄 _upperbond.ext.1.c
│ ├── 📄 _upperbond.h
│ ├── 📄 _upperbond.pxd
│ ├── 📄 _upperbond.pyx
│ ├── 📄 homopolymere.py
│ ├── 📄 ssearch.py
│ └── 📂 alignment/
│ ├── 📄 __init__.py
│ ├── 📄 ace.py
│ └── 📂 barcodecoverage/
│ ├── 📄 __init__.py
│ ├── 📄 calcBc.py
│ ├── 📄 drawBcTree.py
│ ├── 📄 findErrors.py
│ ├── 📄 readFiles.py
│ ├── 📄 writeBcTree.py
│ └── 📂 blast/
│ ├── 📄 __init__.py
│ └── 📂 carto/
│ ├── 📄 __init__.py
│ ├── 📄 truc.svg
│ ├── 📄 truc2.svg
│ ├── 📄 collections.py
│ ├── 📄 decorator.py
│ └── 📂 distances/
│ ├── 📄 __init__.py
│ ├── 📄 observed.py
│ ├── 📄 phylip.py
│ ├── 📄 r.py
│ └── 📂 dnahash/
│ ├── 📄 __init__.py
│ └── 📂 ecobarcode/
│ ├── 📄 __init__.py
│ ├── 📄 databases.py
│ ├── 📄 ecotag.py
│ ├── 📄 options.py
│ ├── 📄 rawdata.py
│ ├── 📄 taxonomy.py
│ └── 📂 ecopcr/
│ ├── 📄 __init__.py
│ ├── 📄 annotation.py
│ ├── 📄 options.py
│ ├── 📄 sequence.py
│ ├── 📄 taxonomy.py
│ └── 📂 ecotag/
│ ├── 📄 __init__.py
│ ├── 📄 parser.py
│ └── 📂 eutils/
│ ├── 📄 __init__.py
│ ├── 📄 fast.py
│ └── 📂 fasta/
│ ├── 📄 __init__.py
│ ├── 📄 _fasta.pxd
│ ├── 📄 _fasta.pyx
│ └── 📂 fastq/
│ ├── 📄 __init__.py
│ ├── 📄 _fastq.pyx
│ └── 📂 fnaqual/
│ ├── 📄 __init__.py
│ ├── 📄 fasta.py
│ ├── 📄 quality.py
│ └── 📂 format/
│ ├── 📄 __init__.py
│ ├── 📄 _format.pyx
│ └── 📂 genericparser/
│ ├── 📄 __init__.py
│ ├── 📄 _genericparser.pyx
│ └── 📂 ontology/
│ ├── 📄 __init__.py
│ ├── 📄 go_obo.py
│ ├── 📄 options.py
│ └── 📂 sequence/
│ ├── 📄 __init__.py
│ ├── 📄 embl.py
│ ├── 📄 fasta.py
│ ├── 📄 fastq.py
│ ├── 📄 fnaqual.py
│ ├── 📄 genbank.py
│ ├── 📄 tagmatcher.py
│ └── 📂 goa/
│ ├── 📄 __init__.py
│ ├── 📄 parser.py
│ └── 📂 graph/
│ ├── 📄 __init__.py
│ └── 📂 algorithms/
│ ├── 📄 __init__.py
│ ├── 📄 clique.py
│ ├── 📄 compact.py
│ ├── 📄 component.py
│ ├── 📄 dag.py
│ └── 📂 layout/
│ ├── 📄 __init__.py
│ ├── 📄 radialtree.py
│ ├── 📄 rootedtree.py
│ ├── 📄 tree.py
│ ├── 📄 gzip.py
│ └── 📂 interactive/
│ ├── 📄 __init__.py
│ └── 📂 location/
│ ├── 📄 __init__.py
│ ├── 📄 feature.py
│ └── 📂 metabarcoding/
│ ├── 📄 __init__.py
│ ├── 📄 options.py
│ └── 📂 obischemas/
│ ├── 📄 __init__.py
│ └── 📂 kb/
│ ├── 📄 __init__.py
│ ├── 📄 extern.py
│ ├── 📄 options.py
│ └── 📂 obo/
│ ├── 📄 __init__.py
│ └── 📂 go/
│ ├── 📄 __init__.py
│ ├── 📄 parser.py
│ ├── 📄 parser.py
│ └── 📂 options/
│ ├── 📄 __init__.py
│ ├── 📄 _bioseqfilter.pyx
│ ├── 📄 _options.pyx
│ ├── 📄 bioseqcutter.py
│ ├── 📄 bioseqedittag.py
│ ├── 📄 bioseqfilter.py
│ ├── 📄 taxonomyfilter.py
│ └── 📂 parallel/
│ ├── 📄 __init__.py
│ ├── 📄 jobqueue.py
│ └── 📂 phylogeny/
│ ├── 📄 __init__.py
│ ├── 📄 newick.py
│ └── 📂 profile/
│ ├── 📄 __init__.py
│ ├── 📄 _profile.pxd
│ ├── 📄 _profile.pyx
│ ├── 📄 sample.py
│ └── 📂 seqdb/
│ ├── 📄 __init__.py
│ └── 📂 blastdb/
│ ├── 📄 __init__.py
│ ├── 📄 dnaparser.py
│ └── 📂 embl/
│ ├── 📄 __init__.py
│ ├── 📄 parser.py
│ └── 📂 genbank/
│ ├── 📄 __init__.py
│ ├── 📄 ncbi.py
│ ├── 📄 parser.py
│ └── 📂 sequenceencoder/
│ ├── 📄 __init__.py
│ └── 📂 solexa/
│ ├── 📄 __init__.py
│ ├── 📄 solexaPairEnd.py
│ └── 📂 statistics/
│ ├── 📄 __init__.py
│ ├── 📄 hypergeometric.py
│ ├── 📄 noncentralhypergeo.py
│ ├── 📄 svg.py
│ └── 📂 table/
│ ├── 📄 __init__.py
│ ├── 📄 csv.py
│ └── 📂 tagmatcher/
│ ├── 📄 __init__.py
│ ├── 📄 options.py
│ ├── 📄 parser.py
│ └── 📂 thermo/
│ ├── 📄 __init__.py
│ └── 📂 tools/
│ ├── 📄 __init__.py
│ ├── 📄 _solexapairend.pyx
│ ├── 📄 solexapairend.py
│ └── 📂 tree/
│ ├── 📄 __init__.py
│ ├── 📄 dot.py
│ ├── 📄 layout.py
│ ├── 📄 newick.py
│ ├── 📄 svg.py
│ ├── 📄 unrooted.py
│ └── 📂 unit/
│ ├── 📄 __init__.py
│ └── 📂 obitools/
│ ├── 📄 __init__.py
│ └── 📂 utils/
│ ├── 📄 __init__.py
│ ├── 📄 _utils.pxd
│ ├── 📄 _utils.pyx
│ ├── 📄 bioseq.py
│ ├── 📄 crc64.py
│ ├── 📄 iterator.py
│ ├── 📄 version.py
│ └── 📂 word/
│ ├── 📄 __init__.py
│ ├── 📄 _binary.pyx
│ ├── 📄 _readindex.cfiles
│ ├── 📄 _readindex.ext.1.c
│ ├── 📄 _readindex.h
│ ├── 📄 _readindex.pyx
│ ├── 📄 options.py
│ ├── 📄 predicate.py
│ ├── 📄 zipfile.py
├── 📄 obiuniq.py
└── 📄 oligotag.py
```
File diff suppressed because it is too large Load Diff