pax_global_header00006660000000000000000000000064134101665010014507gustar00rootroot0000000000000052 comment=8137cc22535bb0fa8d485d473dd6b12eb638a4f6
bcalm-2.2.1/000077500000000000000000000000001341016650100125675ustar00rootroot00000000000000bcalm-2.2.1/.gitignore000066400000000000000000000000071341016650100145540ustar00rootroot00000000000000/build
bcalm-2.2.1/.gitmodules000066400000000000000000000001231341016650100147400ustar00rootroot00000000000000[submodule "gatb-core"]
path = gatb-core
url = https://github.com/GATB/gatb-core
bcalm-2.2.1/.travis.yml000066400000000000000000000021131341016650100146750ustar00rootroot00000000000000language: cpp
os:
- linux
- osx
compiler:
- clang
- gcc
addons:
apt:
sources:
- ubuntu-toolchain-r-test
- llvm-toolchain-precise-3.7
- george-edison55-precise-backports #for cmake3
packages:
- g++-4.8
- clang-3.7
- cmake
- cmake-data
install:
- if [ "`echo $CXX`" == "g++" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=g++-4.8; fi
- if [ "`echo $CXX`" == "clang++" ] && [ "$TRAVIS_OS_NAME" == "linux" ]; then export CXX=clang++-3.7; fi
matrix:
exclude:
- os: osx
compiler: gcc
script:
- mkdir build
- cd build
- cmake .. && make && make package
- cd ..
before_deploy:
- export RELEASE_FILE=$(ls build/bcalm-binaries-*.tar.gz)
- ls
- ls build
- echo "Deploying $RELEASE_FILE to GitHub"
deploy:
provider: releases
api_key:
secure: hQsQR/iRTVbDDJlyJpBln98CT+Mm9GHy/H/gYvLwhoh73f+OmUEreB2HS/KsWp3TTgZeI/ANRBpY11I4Xrai1sntqjXO2LG79pEIoL62AcCBEQJ1RsnkGg9s10qFKzQqImuPDzincnVIrSr92L8kcXBuErU2YK7/Ss5ABzxRN+E=
file: "${RELEASE_FILE}"
skip_cleanup: true
on:
repo: GATB/bcalm
tags: true
bcalm-2.2.1/CMakeLists.txt000066400000000000000000000100361341016650100153270ustar00rootroot00000000000000project(bcalm)
cmake_minimum_required(VERSION 2.6)
################################################################################
# Shortcuts
################################################################################
SET (GATB_CORE_HOME ${PROJECT_SOURCE_DIR}/gatb-core)
################################################################################
# Define cmake modules directory
################################################################################
FOREACH (path "${CMAKE_CURRENT_SOURCE_DIR}/cmake" "${GATB_CORE_HOME}/gatb-core/cmake")
IF (EXISTS "${path}")
SET (CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${path}")
ENDIF()
ENDFOREACH(path)
#############################
# getting git version
#from http://stackoverflow.com/questions/1435953/how-can-i-pass-git-sha1-to-compiler-as-definition-using-cmake
exec_program(
"git"
${CMAKE_CURRENT_SOURCE_DIR}
ARGS "rev-parse --short HEAD"
OUTPUT_VARIABLE VERSION_SHA1 )
add_definitions( -DGIT_SHA1="${VERSION_SHA1}" )
################################################################################
# THIRD PARTIES
################################################################################
# We don't want to install some GATB-CORE artifacts
SET (GATB_CORE_EXCLUDE_TOOLS 1) # no need to compile dbgh5, etc..
SET (GATB_CORE_EXCLUDE_TESTS 1)
SET (GATB_CORE_EXCLUDE_EXAMPLES 1)
# GATB CORE
include (GatbCore)
################################################################################
# TOOLS
################################################################################
MACRO(SUBDIRLIST result curdir)
FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
SET (dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${curdir}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${result} ${dirlist})
ENDMACRO()
# We add the compilation options for the library
add_definitions (${gatb-core-flags})
# We add the gatb-core include directory
include_directories (${gatb-core-includes})
# We add the path for extra libraries
link_directories (${gatb-core-extra-libraries-path})
set (program "bcalm")
set (PROGRAM_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src)
include_directories (${PROGRAM_SOURCE_DIR})
file (GLOB_RECURSE ProjectFiles ${PROGRAM_SOURCE_DIR}/*.cpp)
add_executable(${program} ${ProjectFiles})
target_link_libraries(${program} ${gatb-core-libraries})
################################################################################
# DELIVERY
################################################################################
# If your current login name is different from your GForge login name, you have
# to overwrite the CPACK_USER_NAME to be the same as your GForge login
#SET (CPACK_USER_NAME "your_gforge_login")
# We set the version number
SET (CPACK_PACKAGE_VERSION "")
# We have to tell what is the server name
SET (CPACK_GFORGE_PROJECT_NAME "gatb-tools")
# We set the kind of archive
SET (CPACK_GENERATOR "TGZ")
SET (CPACK_SOURCE_GENERATOR "TGZ")
# We ignore unwanted files for the source archive
SET (CPACK_SOURCE_IGNORE_FILES
"^${PROJECT_SOURCE_DIR}/.git/" ;
"^${PROJECT_SOURCE_DIR}/.gitmodules" ;
"^${PROJECT_SOURCE_DIR}/.gitignore" ;
"^${PROJECT_SOURCE_DIR}/build/" ;
"^${GATB_CORE_HOME}/.cproject" ;
"^${GATB_CORE_HOME}/.git/" ;
"^${GATB_CORE_HOME}/.project" ;
"^${GATB_CORE_HOME}/.gitignore"
)
# We copy the project binary to the 'bin' directory
INSTALL (TARGETS ${PROJECT_NAME} DESTINATION bin)
INSTALL (DIRECTORY "${PROJECT_SOURCE_DIR}/example/" DESTINATION example)
INSTALL (FILES LICENSE README.md DESTINATION bin/..)
# cmake_system_name for mac is Darwin, i want to change that
if (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set(PRETTY_SYSTEM_NAME "Linux")
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(PRETTY_SYSTEM_NAME "Mac")
endif()
file (STRINGS "VERSION" VERSION)
set (CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME}-binaries-${VERSION}-${PRETTY_SYSTEM_NAME})
include (CPack)
bcalm-2.2.1/LICENSE000066400000000000000000000021161341016650100135740ustar00rootroot00000000000000MIT License
Copyright (c) 2018 Rayan Chikhi, Antoine Limasset, Paul Medvedev
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
bcalm-2.2.1/README.md000066400000000000000000000120171341016650100140470ustar00rootroot00000000000000# BCALM 2
BCALM 2 is a bioinformatics tool for constructing the compacted de Bruijn graph from sequencing data.
This repository is the new, parallel version of the BCALM software.
It is using a new algorithm, and is implemented using the [GATB](https://github.com/GATB/gatb-core/) library.
The original, single-threaded code of BCALM (version 1) is still available at: https://github.com/Malfoy/bcalm
[](https://travis-ci.org/GATB/bcalm)
# Usage
Read the instructions below to compile, then:
./bcalm -in [reads.fa] -kmer-size [kmer_size] -abundance-min [abundance_threshold]
e.g.
./bcalm -in reads.fastq -kmer-size 21 -abundance-min 2
Importants parameters are:
-kmer-size [int]
The k-mer size, i.e. length of the nodes of the de Bruijn graph.
-abundance-min [int]
Sets a threshold X below which k-mers that are seen (strictly) less than X times in the dataset are filtered out; i.e. sequencing errors, typically.
# Pre-requisites:
GCC >= 4.8 or a very recent C++11 capable compiler
# Installation
Download the latest [Linux/MacOS binaries](https://github.com/GATB/bcalm/releases), or compile from source as follows:
git clone --recursive https://github.com/GATB/bcalm
cd bcalm
mkdir build; cd build; cmake ..; make -j 8
# Input formats
File input format can be fasta, fastq, either gzipped or not. BCALM 2 does not care about paired-end information, all given reads contribute to k-mers in the graph (as long as such k-mers pass the abundance threshold).
To pass several files as input:
ls -1 *.fastq > list_reads
./bcalm -in list_reads [..]
# Output
BCALM 2 outputs the set of unitigs of the de Bruijn graph.
A unitig is the sequence of a non-branching path. Unitigs that are connected by an edge in the graph overlap by exactly (k-1) nucleotides. For a formal description of what BCALM2 outputs, see [here](bidirected-graphs-in-bcalm2/bidirected-graphs-in-bcalm2.md)
We have two output formats: FASTA and GFA.
**GFA** output: use `scripts/convertToGFA.py` to convert the output of BCALM 2 to GFA (contributed by Mayank Pahadia).
FASTA output header:
> LN:i: KC:i: KM:f: L:<+/->::<+/-> [..]
Where:
* `LN` field is the length of the unitig
* `KC` and `KM` fields are for total abundance and mean abundance of kmers inside the unitig, respectively.
* Edges between unitigs are reported as `L:x:y:z` entries in the FASTA header (1 entry per edge). A classic forward-forward outcoming edge is labeled `L:+:[next node]:+`. A forward-reverse, `L:+:[next node]:-`. Incoming edges are encoded as outcoming edges of the reverse-complement node. E.g. `L:-:[previous node]:+` means that if you reverse-complemented the current node, then there would be an edge from the last k-mer of current node to the first k-mer of the forward strand of [previous node].
# Reverse-complements and double-strandedness
BCALM 2 converts all k-mers into their canonical representation with respect to reverse-complements.
In other words, a k-mer and its reverse complement are considered to be the same object, appearing only once in the output, either in forward or reverse orientation.
Note: in the output of BCALM 2, each unitig may be either be returned in forward or reverse orientation, with no guarantee that the orientation will stay the same across identical runs of the software.
For a formal description of how BCALM2 handles double-strandedness of DNA, see [here](bidirected-graphs-in-bcalm2/bidirected-graphs-in-bcalm2.md)
# Larger k values
BCALM 2 supports arbitrary large k-mer lengths. You need to recompile it from sources. For k up to, say, 320, type this in the build folder:
rm -Rf CMake* && cmake -DKSIZE_LIST="32 64 96 128 160 192 224 256 320" .. && make -j 8
For compilation, list of kmers should only contain multiples of 32. Also, for technical reason, keep 32 in the list. Of course, for higher k's, BCALM will run slower. Intermediate values create optimized code for smaller $k$'s. You could specify just `KSIZE_LIST="32 320"` but then using k values above would 32 be as slow as if k was equal to 320.
After that, BCALM 2 can be run with any k value up to the largest one specified during compilation.
# Intermediate files
BCALM 2 produces some intermediate files: a .h5 file (or a _gatb/ folder), which contain the k-mer counts. The "\*glue\*" files contain compacted sequences that needs to be glued together (see BCALM 2 paper). Those files can be safely deleted after an execution, as the actual output is just the FASTA file containing the unitigs.
Acknowledgements
========
If using BCALM 2, please cite:
Rayan Chikhi, Antoine Limasset and Paul Medvedev, Compacting de Bruijn graphs from sequencing data quickly and in low memory, Proceedings of ISMB 2016, Bioinformatics, 32 (12): i201-i208. ([Bibtex](http://bioinformatics.oxfordjournals.org/citmgr?type=bibtex&gca=bioinfo%3B32%2F12%2Fi201))
This project has been supported in part by NSF awards DBI-1356529, CCF-1439057, IIS-1453527, and IIS-1421908.
bcalm-2.2.1/VERSION000066400000000000000000000000071341016650100136340ustar00rootroot00000000000000v2.2.1
bcalm-2.2.1/bidirected-graphs-in-bcalm2/000077500000000000000000000000001341016650100177115ustar00rootroot00000000000000bcalm-2.2.1/bidirected-graphs-in-bcalm2/bidirected-graphs-in-bcalm2.md000066400000000000000000000242551341016650100253650ustar00rootroot00000000000000# Bi-Directed Graphs in BCALM 2
In the publications describing BCALM 2 [[Chikhi et al. 2017](https://doi.org/10.1093/bioinformatics/btw279), [Chikhi et al. 2014](http://arxiv.org/abs/1401.5383)], we describe how BCALM 2 works in the directed graph model. However, BCALM 2 uses the [bi-directed graph](https://en.wikipedia.org/wiki/Bidirected_graph) model, which we did not describe in the paper for the sake of brevity. The bi-directed graph model is a natural extension of the directed graph and has been widely used; but, it can be tricky to understand for newcomers and remains a source of confusion even to experts. In this document, we describe the details of how BCALM 2 works with bi-directed graphs.
## Bi-directed graphs
There are several ways of representing bi-directed graphs. Here we describe the way BCALM 2 represents them. An edge in a bi-directed graph e is 5-tuple (e.from, e.to, e.fromSign, e.toSign, e.label). The e.from and e.to are vertices, and we interpret these naturally as saying that the *direction* of e is from e.from to e.to. The e.fromSign and e.toSign can take on either the value '+' or '-'. The e.label is an arbitrary identifier. Note that there can be multiple edges of the same type as long as the labels are different, i.e. there can be edges (x, y, +, -, "lbl1" ) and (x, y, +, -, "lbl2"). We can visualize these edges, e.g. (x, y, -, +, "lbl1"):

Note that we draw the fromSign next to the "from" vertex, and the toSign next to the "to" vertex. In other words, the following graph is equivalent to the one above:

The label can be omitted if not important. Given two nodes x and y, there are 8 types of edges that can connect them. There are two possible directions for the edge, two possible fromSigns, and two possible toSigns. However, each edge has a *mirror edge* going in the opposite direction. Mirrors are defined according to this table:
| Mirror Type | Edge | Edge |
| :-: | :-: | :-: |
| 1 | (x, y, +, +) | (y, x, -, -) |
| 2 | (x, y, -, -) | (y, x, +, +) |
| 3 | (x, y, +, -) | (y, x, +, -) |
| 4 | (x, y, -, +) | (y, x, -, +) |
The table contains the 8 edge types, organized such that each row lists a pair of edges that are mirrors of each other. Each pair is given a *mirror type* number for the purposes of our discussion, but the numbers are arbitrary. We can also visualize the four mirror types as follows:

Bi-directed graphs have the constraint that, given two nodes x and y, a label l, and a mirror type, either both or none of the mirror edges with label l exist between x and y. Informally, edges always come in identically-labeled pairs (with one exception listed below). Thus, even though there are 8 type of edges that can be between x and y, there are really only 4 types of *connections*. There are alternate representations of bi-directed graphs that remove this redundancy, but we do not describe them here.
The above rule has an interesting effect on self-loops (i.e. when e.from = e.to). In such cases, observe that the two mirror edges of Type 3 are identical. The same holds for Type 4. We refer to such edges as *self-mirrors*. A bi-directed graph does not allow to represent duplicate edges, and so this connection is represented by only one edge. This case forms an exception to the rule that all edges come in pairs with their mirror. I suspect that this special case has cost humanity thousand of hours in debugging time.
## Bi-directed (exact) overlap graphs
Bi-directed graphs are a natural way of representing the double-stranded nature of overlaps between DNA strings. A *node* x in a bi-directed overlap graph represents a pair of strings, where one is the reverse-complement of the other. One of the strings is arbitrarily chosen as the label of the node and denoted as x.label. Given a string s, we let rc(s) denote its reverse-complement. Visually, we draw a node using both a label and its reverse-complement, with the convention that the label is always on top. For example, we can draw a node with label GACTT as:

Each bi-directed edge has the following interpretation in terms of label overlaps:
| fromSign | toSign | overlap |
|:----------: | :-----: | -|
| + | + | suffix of e.from.label = prefix of e.to.label |
| + | - | suffix of e.from.label = prefix of rc(e.to.label) |
| - | + | suffix of rc(e.from.label) = prefix of e.to.label |
| - | - | suffix of rc(e.from.label) = prefix of rc(e.to.label) |
We label each edge with the length of the equal suffixes/prefixes. For example, let x.label = GACTT and y.label = TCTAC. (We note that in some applications, the match between the suffix and prefix does not have to be exact; for our purposes we will focus on the exact case.) According to the above table, there are two types of overlaps between x and y. The last 2 characters of rc(x.label) are equal to the first two characters of y.label, and the last two characters of rc(y.label) are equal to the first two characters of x.label. These two overlaps can be represented using two edges:

Intuitively, an edge implies that the strings of the two nodes can be combined, using an overlap, into a bigger string. The sign at a node indicates whether the label or the label's reverse-complement is used. A '+' indicates that the label is used, while a '-' indicates that the label's reverse-complement is used.
Notice that the two overlaps between the nodes in the previous example are mirror edges of type 4. This is not a coincidence. One can show from the properties of reverse-complements that if there is an overlap implied by an edge, then there must also be an overlap implied by the mirror of that edge.
In this context, a self-mirror edge corresponds to a situation where either a suffix or a prefix of a node is equal to its own reverse-complement. Here is an example of a Type 3 self-mirror. Note that a self-mirror cannot have an overlap with an odd length, because an odd-length string can never be its own reverse-complement.

## Bidirected de-Bruijn graph
Given a set of strings S, a *[node-centric](https://www.biostars.org/p/175058/#256741) bi-directed de-Bruijn graph of order k* is a type of bi-directed overlap graph. The nodes correspond to all the distinct k-mer substrings of S, with the caveat that two k-mers that are reverse-complements of each other are represented by a single node. The label of this node is chosen arbitrarily as either the k-mer or its reverse complement; however there is often a convention that the label is chosen as the lexicographically smallest option. The edges correspond to all the overlaps of length k-1. For example, with k = 3 and S={GTATAC}, the graph is:

Here, we gave each edge a name (e.g. e1) so that we can refer to the edges below. Observe that e1 and e2 are mirror edges, while e3 is a self-mirror and e4 is a self-mirror.
## Walks and unitigs and compaction
A sequence of edges e1, ... , en in a bi-directed graph is *walk* if
* It is a walk in the directed sense, i.e. ei.to = ei+1.from, for all 0 < i < n.
* The signs at an internal vertices are equal, i.e. ei.toSign = ei+1.fromSign, for all 0 < i < n.
A single vertex is also considered a walk. In the previous graph example, the sequence (e2, e3, e4, e3, e1) is a walk, while (e2, e3, e4, e1) is not.
In a bi-directed overlap graph, a walk spells a corresponding string. For example, (e2, e3, e1) spells the original string GTATAC, while (e3, e1) spells TATAC. Observe that each walk has a corresponding *mirror walk* which spells the reverse-complement. For example, the mirror walk of (e3, e1) is (e2, e3) and spells GTATA.
Given a walk (e1, ..., en), let v0 = e1.from and vi = ei.to, for all 1 <= i <= n. A walk is a *unitig* if it is either a single vertex or a path (i.e. does not repeat vertices) such that
* for every 0 < i < n, the only edges incident on vi are ei-1, ei, and their mirrors.
* e1 is the only outgoing edge from v0 that has the the sign e1.fromSign at v0,
* en is the only incoming edge to vn that has the sign en.toSign at vn.
A unitig is *maximal* if it cannot be extended in either direction. Consider the graph defined by the rectangular nodes and solid edges below (i.e. discarding the rhombus-shaped nodes and dashed edges for now), In this graph, there is a maximal unitig traversing (B, C, D, E). There is also a mirror maximal unitig traversing (E, D, C, B). There are also 4 other maximal unitigs: (A), (H), (K), and (I). The rhombus-shaped nodes and dashed edges represent nodes and edges that, if added to the graph, would destroy the unitig (B, C, D, E) and its mirror.

In the *compacted* bi-directed graph, every maximal unitig and its mirror is replaced by a single vertex. Formally, the nodes of the compacted graph are the maximal unitigs, and the edges represent all overlaps of length k-1.
The unitig definition is motivated by the desire for it to have the following properties (though I have not seen a formal proof of these in the bi-directed setting):
* Maximal unitigs should be a vertex decomposition of the graph; in particular, two maximal unitigs should not share a vertex
* A walk in a bi-directed graph cannot visit a vertex in a unitig without visiting the whole unitig, with one exception. A walk may begin (respectively, end) with a prefix (respectively, suffix) of the unitig.
## BCALM 2
BCALM 2 computes the compacted bi-directed node-centric de Bruijn graph of order k from its input. The output is in two formats. In the FASTA output file of BCALM 2, every FASTA entry corresponds to a node. An edge e is represented in the header of node e.from as `L:::`. Note that BCALM 2 records all edges, even though, in principle, one could record only one edge per mirror type.
BCALM 2 also supports [GFA1.0](https://github.com/GFA-spec/GFA-spec/blob/master/GFA1.md) output format. A unitig is represented as a "Segment," and each edge corresponds to exactly one "Link." The "Link" concept in GFA is identical to the way we have defined edges here.
bcalm-2.2.1/bidirected-graphs-in-bcalm2/fig1.png000066400000000000000000000043371341016650100212540ustar00rootroot00000000000000�PNG
IHDR�a%NȴsRGB���gAMA���a pHYs���o�dtIDATx^��/lK��@C��@�((0$�a`Q`)0�R�"�V
hQTXX��*�������o��7��;�9�ݫ;?�ԛ۽�d?�?�y/�8W�G��t�y]aAW�G��t�y]aAW�G��t�y]aAW�G��t�y]aAW�G��t�EE���ߟ>}���>;;��������������0�Km�S�>��������|�?��.�aN�������a{y]^^��0��NeWooo��B�d�]q�3�l� �K�h�w��a�ܦ>���as2�����:_c�����k���x<^,h���T�#���{�/_��8�'D�)nnn���7��G�֙^Fyv��-=���s*��N��T�|�#9��Y+v�l6;==���XNa�S��h4B�J�tt���V��߿�����R
ß��좹�y�fX��ӶAަ�TFEՌ0�@u�� �a`���
��
4�f���;�#���a`��N��@s�jFX��C����U�ٌ���s��۷oѭ?ަB5#,P5v6��~���JZE���g��F�jFX�j�l;�-������D��"���MT3��U#�Oh.P�T���:7����q�wϯ��\����T�u����C��?�Gp ��a`��N��@s�jFX����Fp�X�|����P�T
��P����5����rަB5#,P5<�C�Y�t:����Q�f����Gp(�>����~���Si�d2�E�X�Ռ0�@����l�x<f��a`����[�"H����7(X'P�T�4���]�,7p�/����Ug4#�j7(�
T��&����o4q{��3�"H�
J��m�~��ͺg��Y �;qK���
�T�i��U�m�j����� �,��A��v���������(u��
U#M ���l6C�������稊�(T��A�7(X��N�m�����o�qc���,�D_@zkF�$��*�D�^���vzBk�2^K��ZT���C4�=_��'��~7�{������Nti���)��-�W�)#H4s��z��h���K��N�Nzn��
�W��#H?������
>�]r��v�����b��*�P5G��k�E��Y��.5�~��/��+(=���LA�a�b,t�:c�1�����:���ӳp�Ci�]�F�־��8�Bg��3�#8�>~�HͰ,�ot0�Q��wB��B�HA��W��Xmp.�
UgtDp��$�C�#6����{n�{)T����߂�C��I�;t�:�-�����o��*P��o��{
zu�|*SFPO�z�ӫ���e��B��ҙ���U�����Mjo}���
U#Y��p�q��z:�]��hF0�gtW�G�쬓��{��
U#Yu/k��������(T�a#�7Mh!P�CGtX�z
T��F�\��N/]�=���y��$n�Pu�F��|4q�j4�$��]��F���"�U7�/Ak��V}xE����oo��b�j��8����&jc�M�^�R
��F�n�nU�r�퇓"ؼ�hZj4=������B���D����H��j4�#��������GP<;�U��ћk���'�hz��ј�P5<��%���v���.�#�\�ק7�j���j�����x
U�#(B\�R�ޤ�A�;�w��)g���GP#�r�[m���{}4���A��j�Vk��Q�ٳ����GP���j� �I``�������U�#(�G���աG0�A��J�j�����U#�O��@��+r��խ
D������{(3����d2A����VdA�&\�FX�U�.��2[MU=���U:�ß�p/..Щ2�N�"����NNN���7��GP?��6~������ڹc�_�v�?��.��x�~��w|4��h�oook�#{���e�*�$�WO~|��Oek���zrpp��#�.Ɛ��+�t?<<�6����Sp*C�ʮ�����_J�6:h��/�aN���t���:>>n^`�EC\\\l�eUi�SA��#�
���<��0��+�#�
���<��0��+�#�
���<���?��,j$�ulIEND�B`�bcalm-2.2.1/bidirected-graphs-in-bcalm2/fig2.png000066400000000000000000000076531341016650100212610ustar00rootroot00000000000000�PNG
IHDRb�R\�sRGB���gAMA���a pHYs���o�d@IDATx^��Ol����ԅ��vMcH,.qa������n���;��!�L���*��mD�G]�-&Rps�ļV$��AIL˪�����=�͝�s�̹3s��D���f8gf~��̽�{gg����:�?�""�`LDD�d@DDLDD$����ɀ�����H0�1�`2 ""&""b2 ""�d@DDLDD�d@DD�ɀ�������+��^noo�t���ȟ���X����ރ8p`xxX&�x� ,�L�)�(P|2X[[{�����
^�tI�#����)�Ae����[�n����&dD�4�+��"
��X@�*\�L�A9��ճ;u������ZƦ����U9�Q����뛟�Ƕ);��QH�lii ������״ɱcǰ+�6e5�;w�-�ĉ� jY1{f��@W�v������!j��&''Q��0::�����g�$u
aUMFr8.,,d�G���_+���IF�<@9J�MY
�z��]���jV�{f����o��J�����w������cSV@XF��+�7�֔�SZJ��ؒ����tފ�v,H�,8xNc�ع|(2 ņ���
6e�3��Ą�v����ɕ�(���̂?t����)����mm>��#L9���1Uu��#G<��"6eܺuS��r&[hG�Ty��=�T<ǿ���������ٳ����)�����"��_�����0Ui������O������o��������
���O�<�)�y+
�3��Yww7�2����³�;Y1��}�Y��v���Ȉ
��MYO>����6f�����'��G�+[nj�-شg�y�� ���%��3ٴ�f��L��D�/�6e�3��T�,0y�)-�gŭet%�����:���jF��Nia�����ɀ��>@��Ȩ�OWVV~��G�8677e�,{��QA�駟~���1����[�ֶ��;�Q���3�v�ލ����/>��C�$p��v�MI��Ck[g2�[�T�6��_-V �h���L% c�"$0��!]IIN�P�r*;2�x����8f���$!�JT�~Π�MI��Ü�n�Nis"��M�@�O�*?3��=� ��io�ukwJ��Go��'# ��io�����#G�`&����@�ɂ��LE�6��矋�����`SV@{����s�G�OF~Π�������N�>�y�b�nʕ+W0C��dPn�}��[o�����vY^^?�ܴ���������_����zJE�^�K/�����y�6����CQF��Ra2(
I�����N�j+19 =�zOd�ٳg���8H-/&����ث��*]3�٢_}��'��r�&<|���>����y�A&��U;�}����$Cz!2*ͤ���R��N,�
711�J^�|!�{�R�8���(�ܽ{����o�_�FHS�0����*�R����J�R�;
Q[�U
QG�^�������I� Ԏ��Eذ���C(�!�\�L#��T�_F�7%��d �����ü�֍`.���B�̋"��9B�TaQJu�!B�2����� ҸR&��=�U
ѝ����<�A Ԏ�h8�L�>��Q`��Z����h$92T�3g� �v횊¨UD�%:�---aF���L;����̌* Y�H���(����
bml'�{�a2���
g��K����hs��5HE$e��,R���Z�"�
��aaM��
��Ai
QJu�!"����V��ޙ�v4DÙ�Q����q �!���c29�(U�6I؋4�Z�9�o$s�I7!�4������R�;
�y��,��{��~#�ִp�%x�PVC4s���ܣH�qS+R�P��"�3s��0���(����
��؎����c�z��qAT�!��M@X��Q5�,+�Z�2����nD�4Lu�UD)
ԝ�h�\�v��o��� ���j�&c����bAX�����#cRU�}���2Ñ)%���
��؎���M �;.�j�;���ɘ!����V�%�ط�����4�'��h�#�_ejQJu�!.ױ]oo/��5��r�エ�C(�!��IbJ�מܰ��(�D'9c����5�nX�u̩ٴ
��2�4Pw���ۭ��b&�&
���M&�;.�j7�͛7�O�I/Rݸ�p��O?��,$K���e,9::�����BM��/�o�;|����"{����į���&��n�c$��5<<�y�b߾}�rx~#:H
��LC4�t!�F=�p�$�vD��4D�%ld g���
�P���K�6��dSڇ����ҹ���cj?��v4D��p�%x�PVC4��]3�1w��>�Pk��K`2�C�|+���ɘ���u���I�
D)
ԝ�h3�S�$���ғSk�:�~��� jGC4�v掋h�N�Z�@T�!���d:��e�
�}�2�Z�@�\��`jj
�\�LC4�j��L#��J*jEQJu�!���naa��H�� jGC4����}�%x�PVC4��^x^2�=�B �UD�ŝ��b?��MF5��aAXSC��@�i�&`gl���d��!����BY
�pf@*{���9"�����I���r6"���&f��"�qcae
QJu�!������Ɔ��2�A Ԏ�h$�w\�we5DC�?8lib\�����:.���?�r�h,o�J���~R�
���ˈ"�ag`e
QJu�!��屝��1R�c ���^-ݵk������Ӄ���ݻUX�R�|�r��`�9�so~~>�ɰCM�1���ϫi*9��� u�5�/���ٹ�9������
*###*�J��~얿��������
��K.�r���HV~��g5��� *���/b*7r�
|�\D�mMx����ؘLH?�w�QA7��R,�wjb2Ȍ�?$:չ�T/^T/�����r�?���j�)*����ؿ��d���^���A��<~���ɽ���۷�(U�{*H�±�_%�m�c2�2s�{��*������൯vv�z
3�p��u5���(���ur�-L���C_�_���xڿJ��)�=�Ɣ8p����r霱]���2�de��I��A�}N�3W:$���\s,//�ڵQ*��up�-+L��h����q��Ғꨱ]'�۲�d@TM<��~[&���s�7�>ǧNT�QrLQ�w���]]�r�Q "��m�N�ϵ�����:��a���;_���:t��%{�MI�����'��Z��x6���;���ծ�Λ�{k7�W�C�/�PPRfg�jm��;��:@�mm�������_<�?�֓V���'SP~}�:`��fl�l�߭�{/�GXq��X��������O�,�_c
�;�o�����S0��~��}������]T;k�k���c�%laͽ�\�I�P�5Ӝ��Or���zk`����Ec[�B�\;�p���HO�}�����t
�5�7w=��������N:w���j�SR��3�)���wC����]_>�g���yg�hu�p����eV{���L��3m�����٬5�KK�W�n�����zu����½������[J��`G��X��|~�tL�ŵ3[ZwI������=A�k�ov=CkJ<�����o��wj�[j��`�l��Vu�0J��O��Z�4`}��3d�o�B�~��`���]N�M[�4����;���J�%X�t���%~��g���.��J<��|�k�k&�kh0k�R�B���d����{���z[��u_`���n�
L���?�}
z�]*��������@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P��J���������@�**������f���hbx0.J�TL��ޡ�O%��(�SA�0:J�TP���?�x�+��_^^��w~~j��ٙ"���G5�J<��[�p��9�UX��b�^�����[[2���NM��rZ������Ǐׯ_?y���� �=x����Ğ�۷o777�u_�|�S`UU�r���kj����͛gϞ��Ge��&��J�ȺS��w�gk�����Mp}
�_]]=z�H=l���MD�=������I�N^�2�Gs||���Ou��}\_ve��k�;��Û��Z��W${������磼݈&U�۶}x�>}��y4�^���|���/��m���ڼk:�y�;�ɮ�%%�.�4�`�#:�1� O[a����Cx�]��V
JZ_5����+��z]��QG���J����?������q���<�z��
S��J�x{����C�v���v]���h�����"��l���f
+������M�R�1ܮ��0c݅�M�%�:�(o}����,�?VSwvv6��k����ٿG�6Sd�7O�>�9/�������Ѵ?��*�m�+o}����,���v3�J����{
bm�������=�4��v�7vv�6�[�9ϣy��:������U�b�W�ğ����L��_V�����ё6m�W��4v���������>�.*��]�jC�X_W��J���ڰ}�2�^�6�aa
;e�[.?G3��c,777��iC�X_W��J�]�p9�>�zuJ����
"�.�y4��)���ñ�����5��+�E�:�hHMAӼA�ȅ0'u�VO���^�R4���ǤNi.��)EC�4����6'u�VO���^�R4���ǤNi.��)EC�4��85�H;���p8���W�
Ŭ��1��S��z�f�?t���H;���p8���Wlf/�W���)�E�blߌԱSZ=
�S��z��4��c��!yLj��^16�oF��)����)�E�blߌԱSڐ<&�pJsQ���7#u�VO���^16�oF��)mH�Z8���W�M㛑:vJ���pJsQ���7#u�6$�I-��\ԫS���w�ͻw��N�3R�Ni�4Ni.��)EC1�+yLj��^�R4�O���������9�c��z�4�ꔢ����<&�pJsQ�N)z�������U�M�aN��)����)�E�:�h(f}%�I-��\ԫS���<99i�!�NiF��)����)�E�:�h(f}%�I-��\ԫS���)������f�����i8��\ԫS��b�W���)�E�:�hhO���U�mNiF��)����)�E�:�h(f}%�I-��\ԫS����7ڴ�S��:vJ���pJsQ�N)�Y_�cR�4�ꔢ!N��͟��O�4#u�VO���^�R4���ǤNi��������z�K�:�hSp��O[�HiZ8����z܅S�9
�S�0��2��)EC1�+yLjᔦ����=���������^a�H)l
���A�4�ׯ_a����Ƭ��^a�Hi�4Ni¸�˄�#�h(f}%�E-�Ҵ8ό��R�h{S��s���:�iqz��D\^^�}��W�9RZ=
�S�0��2a�H)V�tJ���1��S���b������|��=��A:��#�X�F�)M�'1u�>~�v����W�9RZ=
�S�6��2�I���:�i��W���)]&�FſDn/V!�M!"4��buA�4-�aL������2��)����)�5��2�U���:�i��W���)]&^e�? �R�ˍ�|Q
B�H)V�tJ{��_�~)r���{
E˄�#���p8���Z\&���buA��W���<&�pJ��Ύ2�mÁ�+E�U���:��z���Ud{v���#���p8�ˌ��Lh)��4�Ni���+yLj�`�/�f�v#�O����B�H)V�tJ{5Ϡ">M"���p8�ˌ��Lh)��4�Ni���+yLj�_�{�
���S�v}}���g=@�F�)]���<��� ^Ergos�t���Qc�4����tJ�ɹ��ǤN�0�.P0��\�Z:� ����_��c4h��e:?�W���{u
M"���p8�l���;� ��A�t���+yLj�?1����I-��.�����ۇ)�)`�t5h|�z6C�Hi�4N��/.��Ni�W�0����`��+yLj��ًR�w���dh)m�i�=�� �t[ۡI��^<�_�| ;ZEJ���pJ�eq��0R���ZJ���m}%�I-��e�)������/���b5��8�
��}��6�0;it���[������tMh)����)�5��2j�6����8�d[_�cR�t�x�Y��V�jWh)u���>�6���qJ���c5 �q%�a��z���X�˄V�R��N���g}%�I-��^�u��qR|�a������#�3��640;it��a�1��g0\T�$4��VO�ᔦ���Lh)�a}�D���g}%�I-��^�@��ۛ����� �GJ7ژ��4:N�0VA��i�*��)����)Mqq��$R��Z�F�)&��J>�Z8�i��]<*j��$���^a�(�6���S��F�),~Dh:��Rj�VO��&���L�?
!�k
�t��+yLj�&4R��Uo
iW�����qJ�_�5+}��SZ=
�S�e��e��c}�M���a}%�I-��\ԫk���z4���kɕ>h
�#���p8���W����w��+yLj��^16��`�������i8��\�+Ʀ�,��J�Z8���W�M�;���
����y��z�4���i|˰��ǤNi.�c����E�U�g��VO���^16��0y�W���)�E�����6��&�dͪ?T��!RZ=
�S��zu���h|�ɳ��ǤNi.��]]]�Aw�;it��� �ү�[��pJ���pJsQ����6��S:@���<&�pJsQ�Β�����=����qJ��>��w�"u�VO���^�%���ht��a��1��S��zuJ?�����qJ3R�Ni�4Ni.��)e}�N��f���҆�1��S��zuJg>|��tS��F�)�H;���p8���W�t�����S��:vJ�ǤNi.��)u?~�h� b
v��8��c��z�4�ꔺ���������DL�F�)�H;�
�cR�4��6�oQ�;it�ҌԱSZ=
�S��zuJ6__��*|_����KQ�7FJ3R�NiC������G�P�N鼅D��N�8���BrQ�Ni�4����/%~����J.��_[�����A���fԆ.�%���y���6da3^���ʪ��*)��__��po�j���{�N���[ mH7�(�^�|�1x���6d�p*�>�T����p�I��ª�ym�h��kI��ːG��i�˟��ooomVu�E��y46����S1�+�i�!vxin�[1���0�����oin�Uϟ?���Q�c�9��c��R��<�~��{��W����פ>���K�4���wuue�eו[�7�+�
�o���x�fn�Ӱ�";��_���ؾW3.���˗?�T����m�%�m�����V�۪�w�-��Y��a_^��~��¼���O�crf/=���R��I��s_�sm�x��O%��(�A�0������S+���N��b��K��(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�J-��?�_���k�_��^�b���__�������_�5h�#O�������#m=)0={�������Rl��j��N�ͼ��Da����c=~�B�6f��>Q�h��S�x��GL�>,���z�_���
]�5�Y�#];݇�,ae�݊���=2��u/<����{��ﳧ��c:uΰ�ɺ�,t��LܴWx"k9���K����Թ�vg����hҋk�p���s/Q�M8�=�3m����ҴN&0A^\�fz�5�b�Q����p��_��h�cMʅ;B�L�������R�:F`�&��³�S⋶l����3l6��36����O��|��Mb�Ltq�x
J|����Xl;wj�0����x�)���h�'�qboMsq�Z4��t}�-J���g��e
i-�)0!S\\���>�%�M��{��p&bOMpq���?�?Q>�=��P��4J|xJ<���W�G����r�x�/��w��M*<��W��b?Q��8����Q����M�/T���x�I.��!���ƙ����^�E�|e{g��k%PJ<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@�(�P,J<��Ţ�@��+���秧����z�u���J��������߿+P�j�>%@�(�U��u��W�ԉ_J
O`�b�SR��W�<���4Ʉ�ԂrC
�)0Jv��P��L'r8��͈*��NR���ȞYO����4ey�pϓ���C��o
Ur����b9sM���T����u�ۥ��Gt9�1+#�s�w�Wk���4��ٽ#��l�a��J���Ϧ{�����j˒RoZ�*ȹ���SM���S�18%�ۙ����^��<�8>��48� �V�de>/C�jvo����������R�;q7�-���Ȗ/r�Du����m�/Tit#|�l5!v���w�%t]H� �;�� C�v�w��%�l�EykЄ��(��c�8Ώ|�G#"�)=���b�ڑ��M�P7��S�&�Y��<�<�fd�+�c]�е�p4F�0@y��V������y���L(����N_l^�����D�U3&��E�I���T�F�?g�CZ����h� uE&y�P�nV<��%x���y�{Ks`=i��P4���F��B�����
L[<�B�`��m-3/at]g���������0W�E�-���֢��� ��
�!X�-4�B�z������л�&�(ԏ9U��%���A/N�,�fSq��=��+���e����&s"_'=�a�y���Rc�W5Z)�D�ל"��\M�By�P=���#k��]�:]���PK!���t�j!ppt/slideLayouts/slideLayout7.xml�U�n�0���w@�~B jR��I]-��`T�=�ɒM��Z���Ivlpڵ�ԋ�`s8��|�w8>=۵���\ԔLl�d`[�����ľ�ʝض�D�D
%xbﱰϦ?���h�s��iA"�hb��dc���H�P� |�(o��W~����m���A䶨&v��O��.pF�M���p� ��ǘ��ޓ�q, ����$�g���A�ζ�߂�����X5�EP�T{(�`Wc�#�Ϝ�ؒkߋ�[u�b���?�n��l��}~k�h��x�V���MlPj������X��8�M?�U�-���
Ǘi�\�6��zu�r�`D��i�z ��+���J�ґr�8��"I' �0
&���U�JN�-���C�J�N�������=�6�e$4������Ŧ�y�Kp^`B�7�Ѽ�ma�G�(sFI�p�(�9��_@��y��ae�C�
��@u���LJߟ��W�b#L�s!����5I�$��q�^�;a���Y
�|��<�g�`q�������R�!�|[�
Zɓ���}�2�sFk}ex�~�oQ��O�$��fV]�~�����]nu��a �\��i}�<�(�掜���PK!�g<"��"ppt/slideLayouts/slideLayout10.xml�Vێ�6}/� �g���eو7�ME�MvQ;}g$jE�Y�V��[���K:�$;{ `w�"^4<BnU�t���%���a/䃜Bwg��,*�%�5R9�K
���v������F�`C�������/��QņC=�G���-�Sgl�&�s�HC� �6"g�oJ*OG�DO�V��d��\xZ<�~��'a�5yp� /=9$��OfE����w�ۦ�g�x��_�I��WK7JF�;KF��,�i��Q���W'W5�HJ�n�crZTb��+�'ǘ��Ge�G%�ܜß�b3�q)�l��Kء�����~��*���� z��>>�ex ]���g���υ�v��x/��8Y�Q����(XA�&i2��y��V�k`wj���������@�ڦ���M�Q�롭���|>��E2w�~���r��w�wyfl�Ӳ87љc���$-�͏���F-h�Ь,ع�g������U�:K���E=���Z�jb�u�f9��ʊ�ߪ�9p������3�u���iZ��??��Z�1���&g�h �eT���:��VC�8��z]�
����~gʌo�2/ �x�%FAsxp��bÙ�9kcF+IR6uu���b�+���W]o�w�H����h3u[lU����cۤ�݊��
1v�&n/m���7��i��}�6^_=cm�ؽAeT�sO�q�p�S�1�j����2�TE ����M��Z�u��Di��O��y6ċBBT����Üx��^�Ċ����r5�i��e��B����%Lԇ���b)�S�m��C [����0ZG?�v�c%T?�2*W+��KXy��e��b��Y�ƟQ,I��ւqC%
�)%]�1���T��'7U*�6H����En��]Fc�.��p�(9�8��u���G�C�� ��+�Е�P��$���ʿTn#��Z-��H@JdS��܀^�^���t;���G�\��I��y/B͓���h�x��9��~H\"�8()t@�%�4;()��!V�;()H:��_�PR40�?<�(��&�������/��!����[�l�5DIҩ/��C�^x{x!��W
Q�oD
A�5�v
A�AC��2��!C�2��!C�2��!�
��9r�mN=�眢G~�Gs*�<�%��&c/ʑ����nT^W�"���=���Z�5�`W��K���x�`�K�=�@�"��"}����F�
S��F|!��\�-�UY���x�.j��ֺ�o
�džr���+���R�q3�Yfi�M��]^�1�_�~65��EO����e0�\Y8X\Z�н�iK$�x��ô�e�xw�l����_�}�g���.�<��u-t����N�����5Exa�yZ�������lJ.g��y"��$�L5����?9��Ә�u�gq����*?3^��:�@�>��RV���q�)ٲ�o�Uy+����5�hu�U�$W�:S���x�s�3���g<���PK!�}G\��"ppt/slideLayouts/slideLayout11.xml�Wێ�6}/� �g�,��e#��76�E�����5JdIڱS�o���/鐒��Im��"R��p��z�z[r��J3Q
���!Z�`���{����Cڐ� \Tt����^����+9м�#;�60*= Coe���W�$�FHZ���P%1��B���]� �t��$�����b�d9��|]��� �rb��bR�h�4��7��Kf'!Z �,��tT��������л
�9/PEJ�LYN8r�C�5�L˅����ͯJ��r��nb�EkP���И��j�:���ǶKۥ*m���w��1p��`~�W�'l���u�.|����v�y8Q�)�>��q-�D�A�J@`��:νE�m���X( �@�Z�fVm�:O��"��ԡ�I7��O���(u�-�4�8=f�����bgg���
=Jl�5,�fnv��i�)Ɯ�B���n�V� ����an'����̠7D���� �K�9� iU<E~?B�]����_u���hz�$�+�p%�����#Ea��a���i�a{������2��{_(���鬟]�y��c�%�4�Mq���x'���S���gb���lx|)<[�D�v��Ħ��'��yiePI���/ۚ�����[�8����K8�l��8�a�qw6�q��l�~:�fx�Kp�����Z@���4c�kE����m������֯_��������i�p&�i���Z1d<�'�$��g>��{�(K�~֍1����$�}�w�rE݅����*���e�d�Z,�M.���H�*)��x��檼!�p�q��b���ֶ�[+���-Wo��߸$)�I7qC��9����?����PK!����ppt/theme/theme1.xml�YO�7�������Y�
��N��&!�I�Q��g�Ռ�$� ���Ҵ�R譇�6�@/��6�M!_��ǖl�%��
���=���ӓ�s��iJ�1bӬ��.�@YH#��]����v0� ��:sĝ+�~p��H������1ݩVy(Ő_�S��{�R(d��Ո�i7%պ�6�)ę2�J�7'"p��tvK�C"2�sAH�An
����0pIב�D���
ȅ��u\�q����K%"��jz#�Y�-����c�x��y���-�+��ak�6�����i�E���N�/��hZlZ�F��k����
�Mo?+j���[|Ҫ��W���������kxJΎ6Ю�l�l�� %���Z�|��j�U�gb[���>e# P��g@̧hC� �c����xS�Q.�n��
��=�R�;jڅ(����!�S�u>�V
��ŏ�_<�_<={����/g��=�٢x
f�����/���S�׳�^=�ʎ�:���>���/�@�_~���O_~���?<��{�u�!N7� �MS97�h��L�0�X��e1��u,�H�9$Ђ�#Ӄw��6���}��A�f[�ד��SJ��Y�t=K��,�탳���
�m�`-���T�<��dмEd�a�2$@~�!dQ�����}2��D�{�!�����lZ)]é���FP�����]Ч�f~��M�\��L"b��*� �ZÔ��=(Ƀ9
�s!##B�0B��tn��A���0���yj"��G6��TG�Q��tj匳D�~ďd�Bp�
+ j���/���ᾋ�����Y\� �ߙ1ے@�\�s2�H����g���������cغ����6�z(��_�p��Brݼ���k����o[�_�W�Z��c�2�n=�O0!bN�We���E#)T��|d�&������6`T|�Er�����F���t���r�Q(�ն�hf�>�
i�V>�J(Vr�єr�-�B�l�ǖ�U/V��%�\�MHh��$�Rx 5�aѱ�h�淲P�ET��0����
F2� AQ�B���Gz�3�i�-���\/&� -�LZ&0B���ugR�^�M��뼈����=p"�\×fB8�:yD��t*��nBg]'G���2e\ O
��U�?�1@p*s]�V�j�V>�w�\�}�<�.z��d�B�E���{��ݷ�:�����Ɍ݆�Q~��;0�\,�a�%�ʋk�j���VK�i;�^��j/�h�PL�ge���y��z�=_i�hn�@�]�^?��M^c�����t�NY��o�!h�V��r�j���<h�-Ss�qѻ�z��Dy�T���t|_f�@WgD�⯀S���0�@I��r*������{^P�������ṕ��kTz�ߨ
��;��J��$����#�!x�EԴ�Y]����l�ԓ�<�#!v��0�0Ϫ���⯏�
���6i�xķ0��������P�e�H��n��(��(��(��(��(��(��(��(��(��(��(��(��(����� [�2��W^�tK�SMԭb�c��{g
�����̸=7"���^!ԼA�_���&��K-�jV�x�--�7Dgx�qU��d������Pf��7�ii�Z�ݺH%TbFd���t��C�᱇ȉ�����ʊ�'*(����P��@�Sy�X��D�M߅��{ ��^+;{��m�t���2ь#�`A�x?�6������~$��5K-6�J�I,m�!���[yg�b@Y��-�'!��פ�@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@��PK!���-ppt/viewProps.xml�R�N�0�#�Q���`�ZBpဴ�=J�.�M�8ݾ7-c�vjl??��zv��ۀGmM�G�)g`�Uڔ9_<_�q�A%*k �[@~_���\������D�W!�,IP��xi�-��E�З��⋈�*�J�IRmx��O�˥��d�:�$W���;��y@���I�3-���,���=
?',�����TI��+,���&��r&��>��5���<9�.����x2��d8��b���r^�^���k��b_ِD)*�8�yl�b&2lX�s�1g��ơ��I'�>�Y�KmXC�1��9����A��V�I�+����ڑ
�Єo��(�
����+M��+{���K��� IG�$5�N�
8�����X�K/���PK!�0ppt/presProps.xml��͊�0�{��`tW�cىM�E�(�P���-'��d$ewK�Wu�K�����FB��i�wOӘ=h��
+2m;�{l���܀,De{5:��Mp�{�n;׳�AۨbJ��TȆZ5��\#���TX�Y�t68?�����z��ӈ(�%������ߒ��tZ��<%�����" '3��j�[����KM��1��*;{Ӏ�r]�e�8,q���0
�J��$_cL0���� �{:���:jٛ(TT�8���M��.�!�:7]�D�{�~vfi���{=����-��F��K���p�rZA�
ۖo���� �Ũu�b����{�}MS�Y�
�a�¤�Lr�������C�� ��PK!������ppt/tableStyles.xml�I�0@Ὁwh�}-CQ$� +w�*�!�@h���e��/�?J��X�d4���5ݤ�{�c@�q�qi�`�
y�ߥ�����O&}1V8�h�@z_UJfܣ"l)3k��=y
e����2R{w��8��yh��H.����t�-�Z^X0D�ɦkU��4> ��x|a�
�)�C�g6].gJV!p�t�q3ԅ�\9�ԭ�.��g���"s�';ȼ����x�r���hǭ��G
�1V��͍��l����.�Cv>%6�R�"wrE� I�W�(1�\"AG��
7%�ra perfectly circular unitig, k=7; is same as test3 but without the random crap
ACTTAGCGGACTTAGC
bcalm-2.2.1/example/circular_unitigs_unittests/test2.fa000066400000000000000000000000451341016650100232620ustar00rootroot00000000000000>a polyA tail
ACCATGATTCAGAAAAAAAAA
bcalm-2.2.1/example/circular_unitigs_unittests/test3.fa000066400000000000000000000002061341016650100232620ustar00rootroot00000000000000>random crap somehow makes the kmer counting put everything into the same bucket
ACTAAA
>a perfectly circular unitig
ACTTAGCGGACTTAGC
bcalm-2.2.1/example/pufferize/000077500000000000000000000000001341016650100162215ustar00rootroot00000000000000bcalm-2.2.1/example/pufferize/refs.fa000066400000000000000000000003051341016650100174660ustar00rootroot00000000000000>1 (run it with k=9)
ACTAATCATTACATGAGATCAGGCAATG
>2 (starts with 1's last 9-mer)
CAGGCAATGAGATGATAACATGATAGATGAGACCAATT
>3 (starts with 2's last 9-mer but inverted)
AATTGGTCTGGTTGGATTGTACTCATGATG
bcalm-2.2.1/example/pufferize/run.sh000066400000000000000000000002121341016650100173540ustar00rootroot00000000000000../../build/bcalm -in refs.fa -abundance-min 1 -kmer-size 9 -minimizer-size 5
python ../../scripts/pufferize.py refs.fa refs.unitigs.fa 9
bcalm-2.2.1/example/run-tiny.sh000077500000000000000000000002001341016650100163360ustar00rootroot00000000000000bcalm=`find ../*/bcalm | head -n 1` # covers bin/ and build/ cases
$bcalm -in tiny_read.fa -kmer-size 13 -abundance-min 1 $1 $2
bcalm-2.2.1/example/tiny_read.fa000066400000000000000000000000371341016650100165100ustar00rootroot00000000000000>seq
ACTGCTGACTGAGTCATGTGTGGGT
bcalm-2.2.1/example/uf/000077500000000000000000000000001341016650100146345ustar00rootroot00000000000000bcalm-2.2.1/example/uf/Makefile000066400000000000000000000001341341016650100162720ustar00rootroot00000000000000testUF: testUF.cpp ../../bglue/unionFind.hpp
g++ -std=c++11 -o testUF testUF.cpp -fopenmp
bcalm-2.2.1/example/uf/testUF.cpp000066400000000000000000000034121341016650100165520ustar00rootroot00000000000000
#include
#include
#include "../../bglue/unionFind.hpp"
int main()
{
unionFind uf(1000);
unionFind uf2(1000);
// generate 1000 random integers
int nelem=10;
u_int64_t *data;
static std::mt19937_64 rng;
//rng.seed(std::mt19937_64::default_seed);
rng.seed(static_cast(time(NULL)));
data = (u_int64_t * ) calloc(nelem,sizeof(u_int64_t));
for (u_int64_t i = 0; i < nelem; i++)
data[i] = rng() % nelem;
#pragma omp parallel for
for (u_int64_t i = 0; i <= nelem-2; i+=2)
{
uf.union_(data[i],data[i+1]);
#pragma omp critical
if (nelem <= 10)
{
std::cout<< "uf1, union " << data[i] << " " << data[i+1] << std::endl;
}
}
std::cout<= 0; i-=2)
{
uf2.union_(data[i+1],data[i]);
if (nelem <= 10)
std::cout<< "uf2, union " << data[i+1] << " " << data[i] << std::endl;
}
uf.printStats("uf1");
uf2.printStats("uf2");
// if the UF is small, display it
if (nelem <= 10)
{
std::set already_displayed;
for (u_int64_t i = 0; i < nelem; i++)
{
if (already_displayed.find(data[i]) == already_displayed.end())
std::cout << "uf element " << data[i] << " has partition " << uf.getSet(data[i]) << std::endl;
already_displayed.insert(data[i]);
}
}
// check correctness
for (u_int64_t i = 0; i <= nelem-2; i+=2)
{
if (uf.getSet(data[i]) != uf.getSet(data[i+1]))
{
std::cout << "inconsistent partitioning, elements " << data[i] << " and " << data[i+1] << " should've been joined" << std::endl;
exit(1);
}
}
return 0;
}
bcalm-2.2.1/gatb-core/000077500000000000000000000000001341016650100144325ustar00rootroot00000000000000bcalm-2.2.1/scripts/000077500000000000000000000000001341016650100142565ustar00rootroot00000000000000bcalm-2.2.1/scripts/convertToGFA.py000077500000000000000000000126751341016650100171470ustar00rootroot00000000000000#!/usr/bin/env python
'''****************************************************************************
* Program - Convert To GFA format
* Author - Mayank Pahadia
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
****************************************************************************'''
'''****************************************************************************
* To run the program, pass three arguments with the python script on command line.
* For example - python convertToGFA.py inputFileName outputFileName kmerSize
* Logic - It reads through the fasta file with all the unitigs information
* and link information and outputs it in the GFA format.
****************************************************************************'''
import sys
import argparse
def write_segment(name,segment,optional,g,links):
add = ""
add += "S\t" #for segment
add += name #id of segment
add += "\t"
add += segment #segment itself
add += "\t"
for i in optional: #optional tags
add+=i
add+="\t"
#adding Segment to the file
g.write(add.strip()+"\n")
for j in links: #adding all the links of the current segment to the GFA file
g.write(j)
def main():
parser = argparse.ArgumentParser(description="Convert a bcalm-generated FASTA to a GFA.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('inputFilename', help='Input FASTA file')
parser.add_argument('outputFilename', help='Output GFA file')
parser.add_argument('kmerSize', type=int, help='k-mer length')
parser.add_argument('-s', '--single-directed', action='store_true',
help='Avoid outputting the whole skew-simmetric graph and output only one edge between two nodes',
dest='single_directed')
args = parser.parse_args()
with open(args.inputFilename) as f:
#name stores the id of the unitig
#optional is a list which stores all the optional tags of a segment
#links stores all the link information about a segment
name = ""
optional=[]
links=[]
g = open(args.outputFilename,'w')
#adding Header to the file
k = int(args.kmerSize)
g.write('H\tVN:Z:1.0\tks:i:%d\n' %k) # includes the k-mer size
print("GFA file open")
#firstLine is for implemetation purpose so that we don't add some garbage value to the output file.
firstLine = 0
#segment stores the segment till present, in a fasta file, segment can be on many lines, hence we need to get the whole segment from all the lines
segment = ""
for line in f:
line = line.replace("\n","")
if(line[0]!=">"):
#segment might be in more than one line, hence we get the whole segment first, and then put it in the GFA file.
segment += line
if(line[0]==">"):
if(firstLine!=0):#if it's not the firstline in the input file, we store the input in GFA format in the output file
write_segment(name,segment,optional,g,links)
segment = ""
firstLine = 1
#once the previous segment and it's information has been stored, we start the next segment and it's information
a = line.split(" ")
name=a[0][1:] #get the id
optional=[]
links = []
#we skip the first value because the first value is ">ID"
for i in range(1,len(a)):
#we need this because the line can end with a space, hence we get one extra value in our list.
if(a[i]==""):
continue
if(a[i][0:2] == "MA"): #previous bcalm2 versions had "MA=[xxx]" optional tag as well, kept it just for compatibility, and reformated
optional.append(a[i][0:2]+":f:"+a[i][2:])
elif(a[i][0:2] == "L:"): #for links
b = a[i].split(":")
k1 = int(args.kmerSize)-1
if args.single_directed:
if name < b[2]:
links.append("L\t"+name+"\t"+b[1]+"\t"+b[2]+"\t"+b[3]+"\t"+str(k1)+"M\n")
elif name == b[2] and not (b[1] == b[3] == '-'): # manage links between the same unitig
links.append("L\t"+name+"\t"+b[1]+"\t"+b[2]+"\t"+b[3]+"\t"+str(k1)+"M\n")
else:
links.append("L\t"+name+"\t"+b[1]+"\t"+b[2]+"\t"+b[3]+"\t"+str(k1)+"M\n")
else: #all the other optional tags
optional.append(a[i])
#we will miss the last one, because it won't go into the if condition - if(line[0]==">") and hence won't add the segment to the file.
write_segment(name,segment,optional,g,links)
print("done")
g.close()
if __name__ == "__main__":
main()
bcalm-2.2.1/scripts/memused000077500000000000000000000004761341016650100156520ustar00rootroot00000000000000#!/bin/bash
"$@" &
cd /proc/$!
max=0
while [ -f status ]
do
sleep 0.1
if [ -f status ]
then
mem=`cat status | grep VmHWM | tr -s [:blank:] | cut -d ' ' -f 2 | sed 's/[^0-9]*//g'`
if [ "0$mem" -gt "0$max" ]
then
max=$mem
fi
fi;
done
echo "maximal memory used ( kilobyte(s) (K / Kb))" $max
bcalm-2.2.1/scripts/pufferize.py000077500000000000000000000130331341016650100166320ustar00rootroot00000000000000#!/usr/bin/env python
import sys, os
if len(sys.argv) < 4:
print("alters BCALM's unitigs so that they fit pufferfish input. more specifically:")
print(" the script considers the set B and E of all k-mers that are extremities of the reference genomes, respectively beginning and end of genomes.")
print(" output is: modified unitigs such that each k-mer in B should be the beginning of an unitig, and each kmer in E should be end of an unitig.")
print(" in order words, unitigs are split at kmers that are extremities of the reference sequences")
exit("arguments: references.fa unitigs.fa k")
references=sys.argv[1]
unitigs=sys.argv[2]
k=int(sys.argv[3])
# https://www.biostars.org/p/710/#1412
from itertools import groupby
def fasta_iter(fasta_name):
"""
given a fasta file. yield tuples of header, sequence
"""
fh = open(fasta_name)
# ditch the boolean (x[0]) and just keep the header or sequence since
# we know they alternate.
faiter = (x[1] for x in groupby(fh, lambda line: line[0] == ">"))
for header in faiter:
# drop the ">"
header = next(header)[1:].strip()
# join all sequence lines to one.
seq = "".join(s.strip() for s in next(faiter))
yield header, seq
complement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
def revcomp(seq):
reverse_complement = "".join(complement.get(base, base) for base in reversed(seq))
return reverse_complement
def normalize(kmer):
return kmer if kmer < revcomp(kmer) else revcomp(kmer)
#ref_kmers=set()
# parse references
#for header, ref in fasta_iter(references):
# for kmer in [ref[:k], ref[-k:]]:
# ref_kmers.add(normalize(kmer))
# print(kmer)
# go through all reference strings and keep the starting and end kmers for each of them in the ref_skmers and ref_ekmers respectively.
ref_skmers=set()
ref_ekmers=set()
# parse references
for header, ref in fasta_iter(references):
ref_skmers.add(ref[:k])
ref_ekmers.add(ref[-k:])
# parse unitigs and split if necessary
# ASSUMPTION: we might need to split a unitig multiple times
# NOTE: the exact position of the split in unitig depends on whether the seen kmer is the first or last kmer in a reference string.
# NOTE: unitigs are renumbered consecutively
# NOTE: former unitigs links are discarded
#output = open(unitigs+".pufferized.fa","w")
output = open(unitigs+".pufferized.gfa", "w")
nb_unitigs=-1
def save_unitig(header,seq):
global output, p, nb_unitigs
nb_unitigs += 1
output.write("S\t%s\t%s\n" % (nb_unitigs, seq))
return(nb_unitigs)
unitig_skmer = {}
unitig_ekmer = {}
def create_unitig(header, unitig):
global unitig_skmer, unitig_ekmer
if len(unitig) == k:
unitig = normalize(unitig)
unitig_id=save_unitig(header, unitig)
if normalize(unitig[:k]) in unitig_skmer or normalize(unitig[:k]) in unitig_ekmer:
exit("Error: Initial kmer is repeated.")
if normalize(unitig[-k:]) in unitig_skmer or normalize(unitig[-k:]) in unitig_ekmer:
exit("Error: Last kmer is repeated.")
unitig_ekmer[normalize(unitig[-k:])] = [unitig_id, len(unitig)]
print("Start parsing and spliting unitigs .. ")
for header, unitig in fasta_iter(unitigs):
prev = 0
for i in range(0,len(unitig)-k+1):
kmer = unitig[i:i+k]
# cut up until first kmer but not the kmer itself
if kmer in ref_skmers or revcomp(kmer) in ref_ekmers:
if i+k-1-prev >= k:
create_unitig(header, unitig[prev:i+k-1])
prev = i
# cut the unitig until the kmer, including it
if kmer in ref_ekmers or revcomp(kmer) in ref_skmers:
create_unitig(header, unitig[prev:i+k])
prev = i+1
#add the last and right most unitig:
if len(unitig)-prev >= k:
create_unitig(header, unitig[prev:])
print("Start reconstructing the path .. ")
pathCtr = 0
for header, ref in fasta_iter(references):
output.write("\nP\t")
i = 0
seq = ''
while (i < len(ref)-k+1):
kmer = ref[i:i+k]
normalizedkmer = normalize(kmer)
unitigInfo = []
ori = "+"
if normalizedkmer in unitig_skmer and normalizedkmer in unitig_ekmer:
unitigInfo = unitig_skmer[normalizedkmer]
if kmer == normalizedkmer:
ori = "+"
else:
ori = "-"
elif normalizedkmer in unitig_skmer:
unitigInfo = unitig_skmer[normalizedkmer]
ori = "+"
elif normalizedkmer in unitig_ekmer:
unitigInfo = unitig_ekmer[normalizedkmer]
ori = "-"
else:
print(pathCtr, " paths reconstructed.")
exit("ERROR: kmer is not found in the start or end of a unitig \n{0} , {1}".format(kmer, normalizedkmer))
output.write("%s%s," % (unitigInfo[0], ori))
#increase i by the total number of kmers in the current unitig
i += (unitigInfo[1]-k+1)
pathCtr+=1
output.close()
print("done. result is in: %s.pufferized.gfa" % unitigs)
print("to update unitig links in the fasta header (necessary to get a GFA file), run:")
print("mv %s.pufferized.fa %s" % (unitigs,unitigs))
prefix = "[prefix]" if ("unitigs.fa" not in unitigs) else (unitigs.split(".unitigs.fa")[0]+".h5")
script_dir = os.path.dirname(os.path.realpath(__file__))
bcalm_path = "bcalm" if not os.path.isfile("%s/../build/bcalm" % script_dir) else os.path.abspath("%s/../build/bcalm" %script_dir)
print("%s -in %s -skip-bcalm -skip-bglue -redo-links" % (bcalm_path,prefix))
print("%s/convertToGFA.py %s %s.gfa %d" % (script_dir,unitigs,unitigs,k))
bcalm-2.2.1/scripts/release.sh000077500000000000000000000001051341016650100162310ustar00rootroot00000000000000release=$(cat ../VERSION)
git tag -a $release -f
git push --tags -f
bcalm-2.2.1/scripts/unitigEvaluator.cpp000066400000000000000000000141151341016650100201460ustar00rootroot00000000000000// from Malfoy's BRAW github
// can be used to determine whether all the kmers in reads are also in unitigs
// to do so, uncompress reads and convert them to FASTA, then run that program
// it can be compiled with just:
// g++ -lomp -o unitigEvaluator unitigEvaluator.cpp
// updated: 27th November 2018
#include
#include
#include
#include
#include
#include
#include
#include
#include "sparsepp/spp.h"
#include
using spp::sparse_hash_map;
uint64_t xs(uint64_t y){
y^=(y<<13); y^=(y>>17);y=(y^=(y<<15)); return y;
}
using namespace std;
string intToString(uint64_t n){
if(n<1000){
return to_string(n);
}
string end(to_string(n%1000));
if(end.size()==3){
return intToString(n/1000)+","+end;
}
if(end.size()==2){
return intToString(n/1000)+",0"+end;
}
return intToString(n/1000)+",00"+end;
}
char revCompChar(char c) {
switch (c) {
case 'A': return 'T';
case 'C': return 'G';
case 'G': return 'C';
}
return 'A';
}
string revComp(const string& s){
string rc(s.size(),0);
for (int i((int)s.length() - 1); i >= 0; i--){
rc[s.size()-1-i] = revCompChar(s[i]);
}
return rc;
}
string getCanonical(const string& str){
return (min(str,revComp(str)));
}
uint64_t str2num(const string& str){
uint64_t res(0);
for(uint64_t i(0);i5){
n=(stoi(argv[5]));
}
uint nbHash=1<> genomicKmers;
genomicKmers.resize(1024);
#pragma omp parallel num_threads(nb_cores)
{
string ref, useless,canon;
while(not inRef.eof()){
#pragma omp critical(dataupdate)
{
getline(inRef,useless);
getline(inRef,ref);
}
if(not ref.empty() and not useless.empty()){
for(uint i(0);i+k<=ref.size();++i){
std::string kmer = ref.substr(i,k);
if (kmer.find("N") != std::string::npos)
continue;
canon=(getCanonical(kmer));
uint64_t num((str2num(canon)));
if(num%nbHash==HASH){
uint64_t num2( (num/nbHash)%1024);
omp_set_lock(&(lock[num2]));
genomicKmers[num2][canon]=false;
omp_unset_lock(&(lock[num2]));
//#pragma omp atomic update
//genomicKmersNum++;
}
}
}
}
}
#pragma omp parallel num_threads(nb_cores)
{
string ref, useless,canon;
while(not inUnitigs.eof()){
#pragma omp critical(dataupdate)
{
getline(inUnitigs,useless);
getline(inUnitigs,ref);
}
if(not ref.empty() and not useless.empty()){
#pragma omp atomic
size+=ref.size();
#pragma omp atomic
number++;
for(uint i(0);i+k<=ref.size();++i){
std::string kmer = ref.substr(i,k);
if (kmer.find("N") != std::string::npos)
continue;
canon=(getCanonical(kmer));
uint64_t num((str2num(canon)));
if(num%nbHash==HASH){
if(genomicKmers[(num/nbHash)%1024].count(canon)==0){
#pragma omp atomic
FP++;
}else{
if(genomicKmers[(num/nbHash)%1024][canon]==false)
{
genomicKmers[(num/nbHash)%1024][canon]=true;
#pragma omp atomic
TP++;
}
}
}
}
}
}
}
for (int i = 0; i < 1024; i++)
genomicKmersNum += genomicKmers[i].size(); // taking all distinct kmers in the reference
if(HASH==0){
cout<<"Unitig number: "< elapsed_seconds = end - start;
time_t end_time = chrono::system_clock::to_time_t(end);
cout << "\nFinished computation at " << ctime(&end_time)<< "Elapsed time: " << elapsed_seconds.count() << "s\n";
}
bcalm-2.2.1/src/000077500000000000000000000000001341016650100133565ustar00rootroot00000000000000bcalm-2.2.1/src/bcalm_1.cpp000066400000000000000000000067761341016650100154000ustar00rootroot00000000000000#include
#include
using namespace std;
/*
* where did all the code go? now it's mostly in ../gatb-core/gatb-core/src/gatb/bcalm/
*/
/********************************************************************************/
bcalm_1::bcalm_1 () : Tool ("bcalm_1"){
// old options, now using GATB's built-in options for kmer counting and graph creation
// but TODO would be nice to integrate --nb-glue-partitions in gatb someday
/* getParser()->push_back (new OptionOneParam ("-in", "input file", true));
getParser()->push_back (new OptionOneParam ("-out", "output prefix", false, "unitigs"));
getParser()->push_back (new OptionOneParam ("-k", "kmer size", false,"31"));
getParser()->push_back (new OptionOneParam ("-m", "minimizer size", false,"8"));
getParser()->push_back (new OptionOneParam ("-abundance", "abundance threshold", false,"1"));
getParser()->push_back (new OptionOneParam ("-minimizer-type", "use lexicographical minimizers (0) or frequency based (1)", false,"1"));
getParser()->push_back (new OptionOneParam ("-dsk-memory", "max memory for kmer counting (MB)", false, "1500"));
getParser()->push_back (new OptionOneParam ("-dsk-disk", "max disk space for kmer counting (MB)", false, "default"));
// glue options
getParser()->push_front (new OptionNoParam ("--only-uf", "(for debugging only) stop after UF construction", false));
getParser()->push_front (new OptionNoParam ("--uf-stats", "display UF statistics", false));
getParser()->push_back (new OptionOneParam ("--nb-glue-partitions", "number of glue files on disk", false,"200"));
*/
IOptionsParser* graphParser = GraphUnitigsTemplate<32>::getOptionsParser(false);
// hiding options
if (IOptionsParser* p = graphParser->getParser(STR_KMER_ABUNDANCE_MIN_THRESHOLD)) { p->setVisible(false); }
if (IOptionsParser* p = graphParser->getParser(STR_HISTOGRAM_MAX)) { p->setVisible(false); }
if (IOptionsParser* p = graphParser->getParser(STR_SOLIDITY_KIND)) { p->setVisible(false); } // oohh. multi-sample dbg construction someday maybe?
if (IOptionsParser* p = graphParser->getParser(STR_URI_SOLID_KMERS)) { p->setVisible(false); }
// setting defaults
if (Option* p = dynamic_cast