[med-svn] [seqan2] 03/07: New upstream version 2.3.2.000platform-issues9-028fd79+dfsg
Michael Crusoe
misterc-guest at moszumanska.debian.org
Wed Jan 3 13:01:43 UTC 2018
This is an automated email from the git hooks/post-receive script.
misterc-guest pushed a commit to branch experimental
in repository seqan2.
commit 817a28f1cc66ba7431ff15e71053c73cce9ddcc3
Author: Michael R. Crusoe <michael.crusoe at gmail.com>
Date: Wed Dec 20 07:25:55 2017 -0800
New upstream version 2.3.2.000platform-issues9-028fd79+dfsg
---
apps/alf/CMakeLists.txt | 2 +-
apps/alf/alf.cpp | 2 +-
apps/bs_tools/CMakeLists.txt | 2 +-
apps/dfi/CMakeLists.txt | 2 +-
apps/fiona/CMakeLists.txt | 2 +-
apps/fiona/compute_gain.cpp | 6 +-
apps/fx_tools/CMakeLists.txt | 2 +-
apps/gustaf/CMakeLists.txt | 2 +-
apps/insegt/CMakeLists.txt | 2 +-
apps/mason2/CMakeLists.txt | 2 +-
apps/mason2/mason_genome.cpp | 2 +-
apps/mason2/mason_variator.cpp | 10 +-
apps/micro_razers/CMakeLists.txt | 2 +-
apps/ngs_roi/CMakeLists.txt | 4 +-
apps/pair_align/CMakeLists.txt | 2 +-
apps/param_chooser/CMakeLists.txt | 2 +-
apps/rabema/CMakeLists.txt | 4 +-
apps/rabema/rabema_build_gold_standard.cpp | 2 +-
apps/rabema/rabema_evaluate.cpp | 4 +-
apps/razers/CMakeLists.txt | 2 +-
apps/razers3/CMakeLists.txt | 2 +-
apps/rep_sep/CMakeLists.txt | 2 +-
apps/sak/CMakeLists.txt | 4 +-
apps/sam2matrix/CMakeLists.txt | 2 +-
apps/samcat/CMakeLists.txt | 2 +-
apps/searchjoin/CMakeLists.txt | 2 +-
apps/searchjoin/db.h | 8 +-
apps/seqan_tcoffee/CMakeLists.txt | 2 +-
apps/seqcons2/CMakeLists.txt | 2 +-
apps/sgip/CMakeLists.txt | 2 +-
apps/snp_store/CMakeLists.txt | 2 +-
apps/splazers/CMakeLists.txt | 2 +-
apps/stellar/CMakeLists.txt | 2 +-
apps/stellar/stellar.cpp | 2 +-
apps/tree_recon/CMakeLists.txt | 2 +-
apps/yara/CMakeLists.txt | 2 +-
dox/CMakeLists.txt | 2 +-
.../align/local_alignment_waterman_eggert_impl.h | 39 +++--
include/seqan/arg_parse/arg_parse_argument.h | 36 ++++-
include/seqan/arg_parse/tool_doc.h | 7 +
include/seqan/bam_io/bam_alignment_record_util.h | 2 +-
include/seqan/index/index_base.h | 2 +-
include/seqan/index/index_fm_compressed_sa.h | 6 +-
include/seqan/index/index_fm_lf_table.h | 2 +-
.../seqan/index/index_fm_rank_dictionary_base.h | 2 +-
.../seqan/index/index_fm_rank_dictionary_levels.h | 6 +-
.../seqan/index/index_fm_rank_dictionary_naive.h | 2 +-
include/seqan/index/index_qgram.h | 2 +-
include/seqan/modifier/modifier_padding.h | 51 +++++-
include/seqan/platform.h | 4 +-
include/seqan/seeds/seeds_global_chaining.h | 162 +++++++++++--------
include/seqan/stream/iter_stream.h | 178 ++++++++++++---------
manual/source/Infrastructure/Use/Install.rst | 42 ++---
tests/align/test_alignment_algorithms_local.h | 47 ++++++
.../align/test_alignment_algorithms_local_banded.h | 32 ++++
tests/arg_parse/test_arg_parse.cpp | 1 +
tests/arg_parse/test_arg_parse_argument.h | 28 ++++
tests/modifier/test_modifier.cpp | 3 +-
tests/modifier/test_modifier_string_padding.h | 24 +++
tests/seeds/test_seeds_global_chaining.cpp | 26 +++
util/cmake/SeqAnBuildSystem.cmake | 25 ++-
util/pkgconfig/seqan.pc.in | 4 +-
util/skel/app_template/CMakeLists.txt | 2 +-
63 files changed, 578 insertions(+), 257 deletions(-)
diff --git a/apps/alf/CMakeLists.txt b/apps/alf/CMakeLists.txt
index e198d89..20b98cd 100644
--- a/apps/alf/CMakeLists.txt
+++ b/apps/alf/CMakeLists.txt
@@ -56,7 +56,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install alf in ${PREFIX}/bin directory
install (TARGETS alf
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/alf for SeqAn release builds.
diff --git a/apps/alf/alf.cpp b/apps/alf/alf.cpp
index 813a377..b4b45d8 100644
--- a/apps/alf/alf.cpp
+++ b/apps/alf/alf.cpp
@@ -74,7 +74,7 @@ int main(int argc, const char * argv[])
// Options Section: Input / Output parameters.
addSection(parser, "Input / Output");
addOption(parser, seqan::ArgParseOption("i", "input-file", "Name of the multi-FASTA input file.", seqan::ArgParseArgument::INPUT_FILE));
- setValidValues(parser, "input-file", "fa fasta");
+ setValidValues(parser, "input-file", seqan::SeqFileIn::getFileExtensions());
setRequired(parser, "input-file");
addOption(parser, seqan::ArgParseOption("o", "output-file", "Name of the file to which the tab-delimtied matrix with pairwise scores will be written to. Default is to write to stdout.", seqan::ArgParseArgument::OUTPUT_FILE));
setValidValues(parser, "output-file", "alf.tsv");
diff --git a/apps/bs_tools/CMakeLists.txt b/apps/bs_tools/CMakeLists.txt
index 8732293..ebe3ab8 100644
--- a/apps/bs_tools/CMakeLists.txt
+++ b/apps/bs_tools/CMakeLists.txt
@@ -99,7 +99,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install bs_tools in ${PREFIX}/bin directory
install (TARGETS bisar casbar four2three
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/bs_tools for SeqAn release builds.
diff --git a/apps/dfi/CMakeLists.txt b/apps/dfi/CMakeLists.txt
index ee9e7c6..1b9274a 100644
--- a/apps/dfi/CMakeLists.txt
+++ b/apps/dfi/CMakeLists.txt
@@ -56,7 +56,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install dfi in ${PREFIX}/bin directory
install (TARGETS dfi
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/dfi for SeqAn release builds.
diff --git a/apps/fiona/CMakeLists.txt b/apps/fiona/CMakeLists.txt
index babd267..9e68130 100644
--- a/apps/fiona/CMakeLists.txt
+++ b/apps/fiona/CMakeLists.txt
@@ -83,7 +83,7 @@ if (NOT SEQAN_PREFIX_SHARE_DOC)
endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install fiona in ${PREFIX}/bin directory
-install (TARGETS fiona compute_gain DESTINATION bin)
+install (TARGETS fiona compute_gain DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/fiona for SeqAn release builds.
diff --git a/apps/fiona/compute_gain.cpp b/apps/fiona/compute_gain.cpp
index 523daa5..26876a8 100644
--- a/apps/fiona/compute_gain.cpp
+++ b/apps/fiona/compute_gain.cpp
@@ -798,7 +798,7 @@ parseCommandLine(Options & options, int argc, char const ** argv)
addOption(parser, seqan::ArgParseOption("g", "genome", "Genome file.", seqan::ArgParseOption::INPUT_FILE,
"GENOME.fa"));
setRequired(parser, "genome");
- setValidValues(parser, "genome", "fa fasta");
+ setValidValues(parser, "genome", seqan::SeqFileIn::getFileExtensions());
addOption(parser, seqan::ArgParseOption("", "pre", "Pre-correction SAM file.", seqan::ArgParseOption::INPUT_FILE,
"PRE.{sam,bam}"));
@@ -1028,10 +1028,10 @@ int main(int argc, char const ** argv)
stop = atEnd(inPostBam);
else
stop = atEnd(inPostFastq);
-
+
if (stop)
break;
-
+
// Read next record into chunk.
try
{
diff --git a/apps/fx_tools/CMakeLists.txt b/apps/fx_tools/CMakeLists.txt
index b0e9d7e..09a265d 100644
--- a/apps/fx_tools/CMakeLists.txt
+++ b/apps/fx_tools/CMakeLists.txt
@@ -55,7 +55,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install fx_tools in ${PREFIX}/bin directory
install (TARGETS fx_bam_coverage
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/fx_tools for SeqAn release builds.
diff --git a/apps/gustaf/CMakeLists.txt b/apps/gustaf/CMakeLists.txt
index d8ae684..a1b28ca 100644
--- a/apps/gustaf/CMakeLists.txt
+++ b/apps/gustaf/CMakeLists.txt
@@ -77,7 +77,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install gustaf in ${PREFIX}/bin directory
install (TARGETS gustaf gustaf_mate_joining
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/gustaf for SeqAn release builds.
diff --git a/apps/insegt/CMakeLists.txt b/apps/insegt/CMakeLists.txt
index 6adda64..d78484a 100644
--- a/apps/insegt/CMakeLists.txt
+++ b/apps/insegt/CMakeLists.txt
@@ -61,7 +61,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install insegt in ${PREFIX}/bin directory
install (TARGETS insegt
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/insegt for SeqAn release builds.
diff --git a/apps/mason2/CMakeLists.txt b/apps/mason2/CMakeLists.txt
index eaf4345..57dc904 100644
--- a/apps/mason2/CMakeLists.txt
+++ b/apps/mason2/CMakeLists.txt
@@ -143,7 +143,7 @@ install (TARGETS mason_frag_sequencing
mason_simulator
mason_splicing
mason_variator
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/mason2 for SeqAn release builds.
diff --git a/apps/mason2/mason_genome.cpp b/apps/mason2/mason_genome.cpp
index 76383cc..a41cf4d 100644
--- a/apps/mason2/mason_genome.cpp
+++ b/apps/mason2/mason_genome.cpp
@@ -115,7 +115,7 @@ parseCommandLine(MasonGenomeOptions & options, int argc, char const ** argv)
addSection(parser, "Output Options");
addOption(parser, seqan::ArgParseOption("o", "out-file", "Output file.",
seqan::ArgParseOption::OUTPUT_FILE, "FILE"));
- setValidValues(parser, "out-file", "fa fasta");
+ setValidValues(parser, "out-file", seqan::SeqFileOut::getFileExtensions());
setRequired(parser, "out-file");
// Add Examples Section.
diff --git a/apps/mason2/mason_variator.cpp b/apps/mason2/mason_variator.cpp
index cc27c96..e75ffc2 100644
--- a/apps/mason2/mason_variator.cpp
+++ b/apps/mason2/mason_variator.cpp
@@ -710,7 +710,7 @@ public:
{
if (isNearN(seq, pos))
return false; // No SNP next to an N.
-
+
// We simulate an alternative base for each haplotype.
seqan::Dna5 from = seq[pos];
@@ -1575,7 +1575,7 @@ public:
vcfRecord.rID = svRecord.rId;
vcfRecord.beginPos = svRecord.pos - 1;
- vcfRecord.id = variants.getVariantName(variants.posToIdx(Variants::SV, svIdx));
+ vcfRecord.id = variants.getVariantName(variants.posToIdx(Variants::SV, svIdx));
appendValue(vcfRecord.ref, contig[vcfRecord.beginPos]);
vcfRecord.alt = "<INV>";
vcfRecord.filter = "PASS";
@@ -1613,7 +1613,7 @@ public:
seqan::VcfRecord vcfRecord;
vcfRecord.rID = svRecord.rId;
vcfRecord.beginPos = svRecord.pos - 1;
- vcfRecord.id = variants.getVariantName(variants.posToIdx(Variants::SV, svIdx));
+ vcfRecord.id = variants.getVariantName(variants.posToIdx(Variants::SV, svIdx));
vcfRecord.filter = "PASS";
std::stringstream ss;
ss << "SVTYPE=DUP;SVLEN=" << svRecord.size << ";END=" << svRecord.pos + svRecord.size
@@ -1814,12 +1814,12 @@ parseCommandLine(MasonVariatorOptions & options, int argc, char const ** argv)
addOption(parser, seqan::ArgParseOption("", "meth-fasta-in", "Path to load original methylation levels from. "
"Methylation levels are simulated if omitted.",
seqan::ArgParseOption::INPUT_FILE, "FILE"));
- setValidValues(parser, "meth-fasta-in", "fa fasta");
+ setValidValues(parser, "meth-fasta-in", seqan::SeqFileIn::getFileExtensions());
addOption(parser, seqan::ArgParseOption("", "meth-fasta-out", "Path to write methylation levels to as FASTA. "
"Only written if \\fB-of\\fP/\\fB--out-fasta\\fP is given.",
seqan::ArgParseOption::OUTPUT_FILE, "FILE"));
- setValidValues(parser, "meth-fasta-out", "fa fasta");
+ setValidValues(parser, "meth-fasta-out", seqan::SeqFileOut::getFileExtensions());
// ----------------------------------------------------------------------
diff --git a/apps/micro_razers/CMakeLists.txt b/apps/micro_razers/CMakeLists.txt
index 5e2dd4f..4449ac4 100644
--- a/apps/micro_razers/CMakeLists.txt
+++ b/apps/micro_razers/CMakeLists.txt
@@ -62,7 +62,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install micro_razers in ${PREFIX}/bin directory
install (TARGETS micro_razers
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/micro_razers for SeqAn release builds.
diff --git a/apps/ngs_roi/CMakeLists.txt b/apps/ngs_roi/CMakeLists.txt
index 2ee38bd..3633699 100644
--- a/apps/ngs_roi/CMakeLists.txt
+++ b/apps/ngs_roi/CMakeLists.txt
@@ -77,7 +77,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
install (TARGETS bam2roi
roi_feature_projection
roi_plot_thumbnails
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install helper scripts into ${PREFIX}/bin directory.
install (FILES # Scripts for sorting.
@@ -88,7 +88,7 @@ install (FILES # Scripts for sorting.
tool_shed/roi_plot_9.sh
tool_shed/plot.awk
tool_shed/ps2pswLinks.gawk
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/ngs_roi for SeqAn release builds.
diff --git a/apps/pair_align/CMakeLists.txt b/apps/pair_align/CMakeLists.txt
index 70f9e5c..7f1009a 100644
--- a/apps/pair_align/CMakeLists.txt
+++ b/apps/pair_align/CMakeLists.txt
@@ -60,7 +60,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install pair_align in ${PREFIX}/bin directory
install (TARGETS pair_align
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/pair_align for SeqAn release builds.
diff --git a/apps/param_chooser/CMakeLists.txt b/apps/param_chooser/CMakeLists.txt
index ef4cfeb..005ec4c 100644
--- a/apps/param_chooser/CMakeLists.txt
+++ b/apps/param_chooser/CMakeLists.txt
@@ -62,7 +62,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install param_chooser in ${PREFIX}/bin directory
install (TARGETS param_chooser
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/param_chooser for SeqAn release builds.
diff --git a/apps/rabema/CMakeLists.txt b/apps/rabema/CMakeLists.txt
index 723e225..96d322a 100644
--- a/apps/rabema/CMakeLists.txt
+++ b/apps/rabema/CMakeLists.txt
@@ -91,11 +91,11 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
install (TARGETS rabema_prepare_sam
rabema_build_gold_standard
rabema_evaluate
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install rabema in /bin directory
install (TARGETS rabema_prepare_sam rabema_build_gold_standard rabema_evaluate
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/pair_align for SeqAn release builds.
diff --git a/apps/rabema/rabema_build_gold_standard.cpp b/apps/rabema/rabema_build_gold_standard.cpp
index 08ac1fa..1edbe30 100644
--- a/apps/rabema/rabema_build_gold_standard.cpp
+++ b/apps/rabema/rabema_build_gold_standard.cpp
@@ -1003,7 +1003,7 @@ parseCommandLine(BuildGoldStandardOptions & options, int argc, char const ** arg
addOption(parser, seqan::ArgParseOption("r", "reference", "Path to load reference FASTA from.",
seqan::ArgParseArgument::INPUT_FILE, "FASTA"));
setRequired(parser, "reference", true);
- setValidValues(parser, "reference", "fa fasta");
+ setValidValues(parser, "reference", seqan::SeqFileIn::getFileExtensions());
addOption(parser, seqan::ArgParseOption("b", "in-bam", "Path to load the \"perfect\" SAM/BAM file from.",
seqan::ArgParseArgument::INPUT_FILE, "BAM"));
setValidValues(parser, "in-bam", BamFileIn::getFileExtensions());
diff --git a/apps/rabema/rabema_evaluate.cpp b/apps/rabema/rabema_evaluate.cpp
index 89c2707..67b3bf9 100644
--- a/apps/rabema/rabema_evaluate.cpp
+++ b/apps/rabema/rabema_evaluate.cpp
@@ -1064,7 +1064,7 @@ parseCommandLine(RabemaEvaluationOptions & options, int argc, char const ** argv
// setRequired(parser, "out-gsi", true);
addOption(parser, seqan::ArgParseOption("r", "reference", "Path to load reference FASTA from.",
seqan::ArgParseArgument::INPUT_FILE, "FASTA"));
- setValidValues(parser, "reference", "fa fasta");
+ setValidValues(parser, "reference", seqan::SeqFileIn::getFileExtensions());
setRequired(parser, "reference", true);
addOption(parser, seqan::ArgParseOption("g", "in-gsi",
"Path to load gold standard intervals from. If compressed using gzip, "
@@ -1229,7 +1229,7 @@ parseCommandLine(RabemaEvaluationOptions & options, int argc, char const ** argv
getOptionValue(options.checkSorting, parser, "dont-check-sorting");
options.checkSorting = !options.checkSorting;
-
+
options.showMissedIntervals = isSet(parser, "show-missed-intervals");
options.showSuperflousIntervals = isSet(parser, "show-invalid-hits");
options.showAdditionalIntervals = isSet(parser, "show-additional-hits");
diff --git a/apps/razers/CMakeLists.txt b/apps/razers/CMakeLists.txt
index be52d54..8b49881 100644
--- a/apps/razers/CMakeLists.txt
+++ b/apps/razers/CMakeLists.txt
@@ -66,7 +66,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install razers in ${PREFIX}/bin directory
install (TARGETS razers
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/razers for SeqAn release builds.
diff --git a/apps/razers3/CMakeLists.txt b/apps/razers3/CMakeLists.txt
index 0eb5157..9ec8468 100644
--- a/apps/razers3/CMakeLists.txt
+++ b/apps/razers3/CMakeLists.txt
@@ -92,7 +92,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install razers3 in ${PREFIX}/bin directory
install (TARGETS razers3
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/razers3 for SeqAn release builds.
diff --git a/apps/rep_sep/CMakeLists.txt b/apps/rep_sep/CMakeLists.txt
index c8b6312..2e11fe6 100644
--- a/apps/rep_sep/CMakeLists.txt
+++ b/apps/rep_sep/CMakeLists.txt
@@ -64,7 +64,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install rep_sep in ${PREFIX}/bin directory
install (TARGETS rep_sep
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/rep_sep for SeqAn release builds.
diff --git a/apps/sak/CMakeLists.txt b/apps/sak/CMakeLists.txt
index 3687181..c5e9f5b 100644
--- a/apps/sak/CMakeLists.txt
+++ b/apps/sak/CMakeLists.txt
@@ -68,7 +68,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install sak in ${PREFIX}/bin directory
install (TARGETS sak
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/sak for SeqAn release builds.
@@ -77,7 +77,7 @@ install (FILES LICENSE
${CMAKE_CURRENT_BINARY_DIR}/README.sak.txt
DESTINATION ${SEQAN_PREFIX_SHARE_DOC})
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/sak.1
- DESTINATION ${SEQAN_PREFIX_SHARE_DOC}/man)
+ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
# ----------------------------------------------------------------------------
# App Test
diff --git a/apps/sam2matrix/CMakeLists.txt b/apps/sam2matrix/CMakeLists.txt
index e0d60ad..3ea10b4 100644
--- a/apps/sam2matrix/CMakeLists.txt
+++ b/apps/sam2matrix/CMakeLists.txt
@@ -56,7 +56,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install sam2matrix in ${PREFIX}/bin directory
install (TARGETS sam2matrix
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/sam2matrix for SeqAn release builds.
diff --git a/apps/samcat/CMakeLists.txt b/apps/samcat/CMakeLists.txt
index 1fada83..7c1664a 100644
--- a/apps/samcat/CMakeLists.txt
+++ b/apps/samcat/CMakeLists.txt
@@ -63,7 +63,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install samcat in ${PREFIX}/bin directory
install (TARGETS samcat
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/samcat for SeqAn release builds.
diff --git a/apps/searchjoin/CMakeLists.txt b/apps/searchjoin/CMakeLists.txt
index 576df51..ceeaab4 100644
--- a/apps/searchjoin/CMakeLists.txt
+++ b/apps/searchjoin/CMakeLists.txt
@@ -66,7 +66,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install searchjoin in ${PREFIX}/bin directory
install (TARGETS s4_search s4_join
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/searchjoin for SeqAn release builds.
diff --git a/apps/searchjoin/db.h b/apps/searchjoin/db.h
index bec0120..8d5e503 100644
--- a/apps/searchjoin/db.h
+++ b/apps/searchjoin/db.h
@@ -130,25 +130,25 @@ namespace seqan
template <>
struct Fibre<TDbDnaSaSmall, FibreSA>
{
- typedef String<Pair<unsigned int, unsigned char, BitPacked<24, 8> >, StringSpec<TDbDnaSaSmall>::Type> Type;
+ typedef String<Pair<unsigned int, unsigned char, BitPacked<24, 8> >, DefaultIndexStringSpec<TDbDnaSaSmall>::Type> Type;
};
template <>
struct Fibre<TDbGeoSaSmall, FibreSA>
{
- typedef String<Pair<unsigned int, unsigned char, BitPacked<24, 8> >, StringSpec<TDbGeoSaSmall>::Type> Type;
+ typedef String<Pair<unsigned int, unsigned char, BitPacked<24, 8> >, DefaultIndexStringSpec<TDbGeoSaSmall>::Type> Type;
};
template <>
struct Fibre<TDbDnaSaHuge, FibreSA>
{
- typedef String<Pair<unsigned int, unsigned char, Pack>, StringSpec<TDbDnaSaHuge>::Type> Type;
+ typedef String<Pair<unsigned int, unsigned char, Pack>, DefaultIndexStringSpec<TDbDnaSaHuge>::Type> Type;
};
template <>
struct Fibre<TDbGeoSaHuge, FibreSA>
{
- typedef String<Pair<unsigned int, unsigned char, Pack>, StringSpec<TDbDnaSaHuge>::Type> Type;
+ typedef String<Pair<unsigned int, unsigned char, Pack>, DefaultIndexStringSpec<TDbDnaSaHuge>::Type> Type;
};
}
diff --git a/apps/seqan_tcoffee/CMakeLists.txt b/apps/seqan_tcoffee/CMakeLists.txt
index 66e85e2..c8df67c 100644
--- a/apps/seqan_tcoffee/CMakeLists.txt
+++ b/apps/seqan_tcoffee/CMakeLists.txt
@@ -56,7 +56,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install seqan_tcoffee in ${PREFIX}/bin directory
install (TARGETS seqan_tcoffee
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/seqan_tcoffee for SeqAn release builds.
diff --git a/apps/seqcons2/CMakeLists.txt b/apps/seqcons2/CMakeLists.txt
index 8b5fcc2..8edf724 100644
--- a/apps/seqcons2/CMakeLists.txt
+++ b/apps/seqcons2/CMakeLists.txt
@@ -62,7 +62,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install seqcons2 in ${PREFIX}/bin directory
install (TARGETS seqcons2
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/seqcons2 for SeqAn release builds.
diff --git a/apps/sgip/CMakeLists.txt b/apps/sgip/CMakeLists.txt
index 71a28ac..6f692c4 100755
--- a/apps/sgip/CMakeLists.txt
+++ b/apps/sgip/CMakeLists.txt
@@ -56,7 +56,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install sgip in ${PREFIX}/bin directory
install (TARGETS sgip
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/sgip for SeqAn release builds.
diff --git a/apps/snp_store/CMakeLists.txt b/apps/snp_store/CMakeLists.txt
index e846ec3..797b248 100644
--- a/apps/snp_store/CMakeLists.txt
+++ b/apps/snp_store/CMakeLists.txt
@@ -71,7 +71,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install snp_store in ${PREFIX}/bin directory
install (TARGETS snp_store
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/snp_store for SeqAn release builds.
diff --git a/apps/splazers/CMakeLists.txt b/apps/splazers/CMakeLists.txt
index bb85d5d..35c8386 100644
--- a/apps/splazers/CMakeLists.txt
+++ b/apps/splazers/CMakeLists.txt
@@ -68,7 +68,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install splazers in ${PREFIX}/bin directory
install (TARGETS splazers
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/splazers for SeqAn release builds.
diff --git a/apps/stellar/CMakeLists.txt b/apps/stellar/CMakeLists.txt
index a94d1bf..f6e0499 100644
--- a/apps/stellar/CMakeLists.txt
+++ b/apps/stellar/CMakeLists.txt
@@ -60,7 +60,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install stellar in ${PREFIX}/bin directory
install (TARGETS stellar
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/stellar for SeqAn release builds.
diff --git a/apps/stellar/stellar.cpp b/apps/stellar/stellar.cpp
index 604cd43..f253d47 100644
--- a/apps/stellar/stellar.cpp
+++ b/apps/stellar/stellar.cpp
@@ -569,7 +569,7 @@ void _setParser(ArgumentParser & parser)
setDefaultValue(parser, "o", "stellar.gff");
addOption(parser, ArgParseOption("od", "outDisabled",
"Name of output file for disabled query sequences.", ArgParseArgument::OUTPUT_FILE));
- setValidValues(parser, "outDisabled", "fa fasta");
+ setValidValues(parser, "outDisabled", seqan::SeqFileOut::getFileExtensions());
setDefaultValue(parser, "od", "stellar.disabled.fasta");
addOption(parser, ArgParseOption("t", "no-rt", "Suppress printing running time."));
hideOption(parser, "t");
diff --git a/apps/tree_recon/CMakeLists.txt b/apps/tree_recon/CMakeLists.txt
index d39248f..2b9a4fc 100644
--- a/apps/tree_recon/CMakeLists.txt
+++ b/apps/tree_recon/CMakeLists.txt
@@ -56,7 +56,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install tree_recon in ${PREFIX}/bin directory
install (TARGETS tree_recon
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/tree_recon for SeqAn release builds.
diff --git a/apps/yara/CMakeLists.txt b/apps/yara/CMakeLists.txt
index 73ec26a..fd14881 100644
--- a/apps/yara/CMakeLists.txt
+++ b/apps/yara/CMakeLists.txt
@@ -136,7 +136,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install yara in ${PREFIX}/bin directory
install (TARGETS yara_indexer yara_mapper
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/yara for SeqAn release builds.
diff --git a/dox/CMakeLists.txt b/dox/CMakeLists.txt
index 74b4749..e5e1189 100644
--- a/dox/CMakeLists.txt
+++ b/dox/CMakeLists.txt
@@ -39,5 +39,5 @@ if (${SEQAN_BUILD_SYSTEM} MATCHES "SEQAN_RELEASE_LIBRARY") # includes SEQAN_RELE
--out-dir ${CMAKE_BINARY_DIR}/dox/html)
install (DIRECTORY ${CMAKE_BINARY_DIR}/dox/html
- DESTINATION share/doc/seqan)
+ DESTINATION ${CMAKE_INSTALL_DOCDIR})
endif ()
diff --git a/include/seqan/align/local_alignment_waterman_eggert_impl.h b/include/seqan/align/local_alignment_waterman_eggert_impl.h
index d80cfc3..741ca30 100644
--- a/include/seqan/align/local_alignment_waterman_eggert_impl.h
+++ b/include/seqan/align/local_alignment_waterman_eggert_impl.h
@@ -188,12 +188,12 @@ TScoreValue getScore(LocalAlignmentFinder<TScoreValue> const & sw)
// Function _smithWatermanGetMatrix()
// ----------------------------------------------------------------------------
-template <typename TScoreValue, typename TStringH, typename TStringV>
+template <typename TScoreValue, typename TScoreSpec, typename TStringH, typename TStringV>
TScoreValue
_smithWatermanGetMatrix(LocalAlignmentFinder<TScoreValue> & sw,
TStringH const & strH,
TStringV const & strV,
- Score<TScoreValue, Simple> const & score_,
+ Score<TScoreValue, TScoreSpec> const & score_,
TScoreValue cutoff)
{
// typedefs
@@ -220,8 +220,6 @@ _smithWatermanGetMatrix(LocalAlignmentFinder<TScoreValue> & sw,
TStringIteratorH x = x_end;
TStringIteratorV y;
- TScoreValue score_match = scoreMatch(score_);
- TScoreValue score_mismatch = scoreMismatch(score_);
TScoreValue score_gap = scoreGapExtend(score_);
TScoreValue h = 0;
@@ -263,14 +261,15 @@ _smithWatermanGetMatrix(LocalAlignmentFinder<TScoreValue> & sw,
goPrevious(finger1, 0);
goPrevious(finger2, 0);
+ TScoreValue currScore = score(score_, *x, cy);
if (*x == cy)
{
- v = h + score_match;
+ v = h + currScore;
h = *finger2;
}
else
{
- TScoreValue s1 = h + score_mismatch;
+ TScoreValue s1 = h + currScore;
h = *finger2;
TScoreValue s2 = score_gap + ((h > v) ? h : v);
v = (s1 > s2) ? s1 : s2;
@@ -303,12 +302,15 @@ _smithWatermanGetMatrix(LocalAlignmentFinder<TScoreValue> & sw,
// ----------------------------------------------------------------------------
// declumping
-template <typename TScoreValue, typename TSequenceH, typename TGapsSpecH, typename TSequenceV, typename TGapsSpecV>
+template <typename TScoreValue,
+ typename TSequenceH, typename TGapsSpecH,
+ typename TSequenceV, typename TGapsSpecV,
+ typename TScoreSpec>
void
_smithWatermanDeclump(LocalAlignmentFinder<TScoreValue> & sw ,
Gaps<TSequenceH, TGapsSpecH> & gapsH,
Gaps<TSequenceV, TGapsSpecV> & gapsV,
- Score<TScoreValue, Simple> const & score_)
+ Score<TScoreValue, TScoreSpec> const & score_)
{
//-------------------------------------------------------------------------
//typedefs
@@ -364,8 +366,6 @@ _smithWatermanDeclump(LocalAlignmentFinder<TScoreValue> & sw ,
TSequenceHIter x_stop = x_end;
- TScoreValue score_match = scoreMatch(score_);
- TScoreValue score_mismatch = scoreMismatch(score_);
TScoreValue score_gap = scoreGapExtend(score_);
TScoreValue h,v;
@@ -456,9 +456,10 @@ _smithWatermanDeclump(LocalAlignmentFinder<TScoreValue> & sw ,
{
goPrevious(finger0, 0);
goPrevious(finger1, 0);
+ TScoreValue currScore = score(score_, *x, cy);
if (*x == cy && !(sw.forbidden[position(finger0)]))
{
- v = h + score_match;
+ v = h + currScore;
h = *finger1;
}
else
@@ -474,7 +475,7 @@ _smithWatermanDeclump(LocalAlignmentFinder<TScoreValue> & sw ,
else
{
if(sw.forbidden[position(finger0)]) s1 = 0;
- else s1 = h + score_mismatch;
+ else s1 = h + currScore;
}
h = *finger1;
@@ -522,13 +523,16 @@ _smithWatermanDeclump(LocalAlignmentFinder<TScoreValue> & sw ,
// ----------------------------------------------------------------------------
// Traceback.
-template <typename TSourceH, typename TGapsSpecH, typename TSourceV, typename TGapsSpecV, typename TScoreValue, unsigned DIMENSION>
+template <typename TSourceH, typename TGapsSpecH,
+ typename TSourceV, typename TGapsSpecV,
+ typename TScoreValue, typename TScoreSpec,
+ unsigned DIMENSION>
typename Iterator<Matrix<TScoreValue, DIMENSION>, Standard >::Type
_smithWatermanTrace(Gaps<TSourceH, TGapsSpecH> & gapsH,
Gaps<TSourceV, TGapsSpecV> & gapsV,
typename LocalAlignmentFinder<TScoreValue>::TBoolMatrix & fb_matrix,
Iter< Matrix<TScoreValue, DIMENSION>, PositionIterator > source_,
- Score<TScoreValue, Simple> const & scoring_) {
+ Score<TScoreValue, TScoreSpec> const & scoring_) {
//typedefs
typedef Iter<Matrix<TScoreValue, DIMENSION>, PositionIterator > TMatrixIterator;
typedef typename Position<Matrix<TScoreValue, DIMENSION> >::Type TPosition;
@@ -559,7 +563,6 @@ _smithWatermanTrace(Gaps<TSourceH, TGapsSpecH> & gapsH,
TSourceIteratorV it_1 = iter(strV, pos_1, Standard());
TSourceIteratorV it_1_end = end(strV);
- TScoreValue score_mismatch = scoreMismatch(scoring_);
TScoreValue score_gap = scoreGapExtend(scoring_);
//-------------------------------------------------------------------------
@@ -586,7 +589,7 @@ _smithWatermanTrace(Gaps<TSourceH, TGapsSpecH> & gapsH,
d = 0;
else{
goNext(it_, 1);
- d = *it_ + score_mismatch;
+ d = *it_ + score(scoring_, *it_0, *it_1);
}
it_ = source_;
@@ -678,7 +681,9 @@ _getNextBestEndPosition(LocalAlignmentFinder<TScoreValue> & sw ,
// ----------------------------------------------------------------------------
// Wrapper that computes the matrix and does the backtracking for the best alignment
-template <typename TSourceH, typename TGapsSpecH, typename TSourceV, typename TGapsSpecV, typename TScoreValue, typename TScoreSpec>
+template <typename TSourceH, typename TGapsSpecH,
+ typename TSourceV, typename TGapsSpecV,
+ typename TScoreValue, typename TScoreSpec>
TScoreValue
_smithWaterman(Gaps<TSourceH, TGapsSpecH> & gapsH,
Gaps<TSourceV, TGapsSpecV> & gapsV,
diff --git a/include/seqan/arg_parse/arg_parse_argument.h b/include/seqan/arg_parse/arg_parse_argument.h
index 95ebf88..03f473f 100644
--- a/include/seqan/arg_parse/arg_parse_argument.h
+++ b/include/seqan/arg_parse/arg_parse_argument.h
@@ -438,6 +438,28 @@ inline bool isOutputFileArgument(ArgParseArgument const & me)
}
// ----------------------------------------------------------------------------
+// Function isDirectoryArgument()
+// ----------------------------------------------------------------------------
+
+/*!
+ * @fn ArgParseArgument#isDirectoryArgument
+ * @headerfile <seqan/arg_parse.h>
+ * @brief Returns whether the argument is a directorz argument.
+ *
+ * @signature bool isDirectoryArgument(arg);
+ *
+ * @param[in] arg The ArgParseArgument to query.
+ *
+ * @return bool <tt>true</tt> if it is a directory argument, <tt>false</tt> otherwise.
+ */
+
+inline bool isDirectoryArgument(ArgParseArgument const & me)
+{
+ return me._argumentType == ArgParseArgument::INPUT_DIRECTORY ||
+ me._argumentType == ArgParseArgument::OUTPUT_DIRECTORY;
+}
+
+// ----------------------------------------------------------------------------
// Function isOutputPrefixArgument()
// ----------------------------------------------------------------------------
@@ -923,7 +945,15 @@ inline void _checkValue(ArgParseArgument const & me)
{
unsigned i = 0;
for (std::vector<std::string>::const_iterator it = me.value.begin(); it != me.value.end(); ++it, ++i)
- _checkValue(me, *it, i);
+ {
+ auto val = *it;
+
+ if (isDirectoryArgument(me)) // strip trailing slash for directories
+ if (val[length(val) - 1] == '/')
+ val.resize(length(val) - 1);
+
+ _checkValue(me, val, i);
+ }
}
// ----------------------------------------------------------------------------
@@ -1138,6 +1168,10 @@ inline std::string getFileExtension(ArgParseArgument const & me, unsigned pos =
if (value.empty())
return "";
+ if (isDirectoryArgument(me)) // strip trailing slash for directories
+ if (value[length(value) - 1] == '/')
+ value.resize(length(value) - 1);
+
// If there is a list of valid values then we look for each of these in the path.
if (!me.validValues.empty())
{
diff --git a/include/seqan/arg_parse/tool_doc.h b/include/seqan/arg_parse/tool_doc.h
index a19a983..970c0e3 100644
--- a/include/seqan/arg_parse/tool_doc.h
+++ b/include/seqan/arg_parse/tool_doc.h
@@ -444,6 +444,13 @@ public:
std::fill_n(out, _layout.leftPadding, ' ');
stream << _toText(listItem._term);
unsigned pos = _layout.leftPadding + length(listItem._term);
+
+ if (empty(listItem._description))
+ {
+ stream << '\n';
+ return;
+ }
+
if (pos + _layout.centerPadding > _layout.rightColumnTab)
{
stream << '\n';
diff --git a/include/seqan/bam_io/bam_alignment_record_util.h b/include/seqan/bam_io/bam_alignment_record_util.h
index 1a7a02f..15d1ac1 100644
--- a/include/seqan/bam_io/bam_alignment_record_util.h
+++ b/include/seqan/bam_io/bam_alignment_record_util.h
@@ -237,7 +237,7 @@ bamRecordToAlignment(Align<TSource, TSpec> & result, TReference & reference, Bam
// TODO(holtgrew): Clipping better than copying infix? But is it generic?
resize(rows(result), 2);
- unsigned len = record.beginPos + getAlignmentLengthInRef(record) - countPaddings(record.cigar);
+ unsigned len = getAlignmentLengthInRef(record) - countPaddings(record.cigar);
setSource(row(result, 0), reference);
setClippedEndPosition(row(result, 0), record.beginPos + len);
diff --git a/include/seqan/index/index_base.h b/include/seqan/index/index_base.h
index 1cb2eb8..6aa2f5b 100644
--- a/include/seqan/index/index_base.h
+++ b/include/seqan/index/index_base.h
@@ -218,7 +218,7 @@ SEQAN_CONCEPT_REFINE(StringTrieConcept, (TIndex), (StringIndexConcept)) {};
*/
template <typename TObject>
- struct [[deprecated("Deprecated in favor of StringSpec.")]] DefaultIndexStringSpec : StringSpec<TObject> {};
+ struct DefaultIndexStringSpec : StringSpec<TObject> {};
//////////////////////////////////////////////////////////////////////////////
diff --git a/include/seqan/index/index_fm_compressed_sa.h b/include/seqan/index/index_fm_compressed_sa.h
index 16fbc0c..453fdd3 100644
--- a/include/seqan/index/index_fm_compressed_sa.h
+++ b/include/seqan/index/index_fm_compressed_sa.h
@@ -84,8 +84,8 @@ typedef Tag<FibreSparseString_> const FibreSparseString;
// ----------------------------------------------------------------------------
template <typename TText, typename TSpec, typename TConfig>
-struct StringSpec<CompressedSA<TText, TSpec, TConfig> > :
- StringSpec<TText> {};
+struct DefaultIndexStringSpec<CompressedSA<TText, TSpec, TConfig> > :
+ DefaultIndexStringSpec<TText> {};
// ----------------------------------------------------------------------------
// Metafunction Fibre
@@ -97,7 +97,7 @@ struct Fibre<CompressedSA<TText, TSpec, TConfig>, FibreSparseString>
// TODO(esiragusa): Change SparseString spec to be SparseString<TValue, TSpec, TConfig>.
typedef CompressedSA<TText, TSpec, TConfig> TCSA;
typedef typename SAValue<TText>::Type TSAValue_;
- typedef typename StringSpec<TCSA>::Type TSASpec_;
+ typedef typename DefaultIndexStringSpec<TCSA>::Type TSASpec_;
typedef String<TSAValue_, TSASpec_> TSA_;
typedef SparseString<TSA_, TConfig> Type;
};
diff --git a/include/seqan/index/index_fm_lf_table.h b/include/seqan/index/index_fm_lf_table.h
index 8da0a12..64d8320 100644
--- a/include/seqan/index/index_fm_lf_table.h
+++ b/include/seqan/index/index_fm_lf_table.h
@@ -125,7 +125,7 @@ struct Fibre<LF<TText, TSpec, TConfig>, FibrePrefixSums>
// typedef Tuple<TSize_, ValueSize<TValue_>::VALUE> Type;
typedef typename Size<LF<TText, TSpec, TConfig> >::Type TSize_;
- typedef typename StringSpec<TText>::Type TSpec_;
+ typedef typename DefaultIndexStringSpec<TText>::Type TSpec_;
typedef String<TSize_, TSpec_> Type;
};
diff --git a/include/seqan/index/index_fm_rank_dictionary_base.h b/include/seqan/index/index_fm_rank_dictionary_base.h
index 6d8a5ba..f45549c 100644
--- a/include/seqan/index/index_fm_rank_dictionary_base.h
+++ b/include/seqan/index/index_fm_rank_dictionary_base.h
@@ -121,7 +121,7 @@ struct RankDictionary;
// ----------------------------------------------------------------------------
template <typename TValue, template <typename, typename> class TRankDictionary, typename TSpec, typename TConfig>
-struct StringSpec<RankDictionary<TValue, TRankDictionary<TSpec, TConfig> > >
+struct DefaultIndexStringSpec<RankDictionary<TValue, TRankDictionary<TSpec, TConfig> > >
{
typedef typename TConfig::Fibre Type;
};
diff --git a/include/seqan/index/index_fm_rank_dictionary_levels.h b/include/seqan/index/index_fm_rank_dictionary_levels.h
index 8b0a446..2eeeadd 100644
--- a/include/seqan/index/index_fm_rank_dictionary_levels.h
+++ b/include/seqan/index/index_fm_rank_dictionary_levels.h
@@ -354,7 +354,7 @@ struct Fibre<RankDictionary<TValue, Levels<TSpec, TConfig> >, FibreRanks>
{
typedef RankDictionary<TValue, Levels<TSpec, TConfig> > TRankDictionary_;
typedef RankDictionaryEntry_<TValue, Levels<TSpec, TConfig> > TEntry_;
- typedef typename StringSpec<TRankDictionary_>::Type TFibreSpec_;
+ typedef typename DefaultIndexStringSpec<TRankDictionary_>::Type TFibreSpec_;
typedef String<TEntry_, TFibreSpec_> Type;
};
@@ -364,7 +364,7 @@ struct Fibre<RankDictionary<TValue, Levels<TSpec, TConfig> >, FibreSuperBlocks>
{
typedef RankDictionary<TValue, Levels<TSpec, TConfig> > TRankDictionary_;
typedef typename RankDictionarySuperBlock_<TValue, Levels<TSpec, TConfig> >::Type TSuperBlocks_;
- typedef typename StringSpec<TRankDictionary_>::Type TFibreSpec_;
+ typedef typename DefaultIndexStringSpec<TRankDictionary_>::Type TFibreSpec_;
typedef String<TSuperBlocks_, TFibreSpec_> Type;
};
@@ -374,7 +374,7 @@ struct Fibre<RankDictionary<TValue, Levels<TSpec, TConfig> >, FibreUltraBlocks>
{
typedef RankDictionary<TValue, Levels<TSpec, TConfig> > TRankDictionary_;
typedef typename RankDictionaryUltraBlock_<TValue, Levels<TSpec, TConfig> >::Type TUltraBlocks_;
- typedef typename StringSpec<TRankDictionary_>::Type TFibreSpec_;
+ typedef typename DefaultIndexStringSpec<TRankDictionary_>::Type TFibreSpec_;
typedef String<TUltraBlocks_, TFibreSpec_> Type;
};
diff --git a/include/seqan/index/index_fm_rank_dictionary_naive.h b/include/seqan/index/index_fm_rank_dictionary_naive.h
index 1884c2e..dcd9ab0 100644
--- a/include/seqan/index/index_fm_rank_dictionary_naive.h
+++ b/include/seqan/index/index_fm_rank_dictionary_naive.h
@@ -61,7 +61,7 @@ struct Fibre<RankDictionary<TValue, Naive<TSpec, TConfig> >, FibreRanks>
{
typedef RankDictionary<TValue, Naive<TSpec, TConfig> > TRankDictionary_;
typedef typename Size<TRankDictionary_>::Type TSize_;
- typedef typename StringSpec<TRankDictionary_>::Type TFibreSpec_;
+ typedef typename DefaultIndexStringSpec<TRankDictionary_>::Type TFibreSpec_;
typedef String<TSize_, TFibreSpec_> Type;
};
diff --git a/include/seqan/index/index_qgram.h b/include/seqan/index/index_qgram.h
index 90ba86f..7611d23 100644
--- a/include/seqan/index/index_qgram.h
+++ b/include/seqan/index/index_qgram.h
@@ -343,7 +343,7 @@ struct Fibre< Index<TText, TSpec>, FibreCounts> {
typename Size< TText >::Type,
typename Size< Index<TText, TSpec> >::Type
>,
- typename StringSpec< Index<TText, TSpec> >::Type
+ typename DefaultIndexStringSpec< Index<TText, TSpec> >::Type
> Type;
};
diff --git a/include/seqan/modifier/modifier_padding.h b/include/seqan/modifier/modifier_padding.h
index 83bb805..88aad70 100644
--- a/include/seqan/modifier/modifier_padding.h
+++ b/include/seqan/modifier/modifier_padding.h
@@ -165,7 +165,7 @@ struct DefaultIteratorSpec< ModifiedString<THost, ModPadding> >
* @param [in,out] str The modified string to be padded.
* @param [in] size The number of padded characters.
* @param [in] pad The character to pad the sequence with.
- *
+ *
* @datarace Not thread-safe.
*/
@@ -211,6 +211,51 @@ length(ModifiedString<THost, ModPadding> const & me)
}
// ----------------------------------------------------------------------------
+// Function cargoValue()
+// ----------------------------------------------------------------------------
+
+template <typename THost>
+inline typename Reference<ModifiedString<THost, ModPadding> >::Type
+cargoValue(ModifiedString<THost, ModPadding> & me)
+{
+ return cargo(me)._paddedValue;
+}
+
+// NOTE(rrahn): The problem with the padding symbol is, that it is always stored as a member
+// of the modifier class. Hence, if the modifier is const all it's members are const.
+// Now, the cargo could be either defined mutable or, and this what we did right now, the
+// the const is cast-away. However, we use SFINAE to only apply this hack to the Host types,
+// for which this becomes relevant. That are Host types like the Segment class who copy pointer semantics, i.e.
+// the constness of the object is not propagated to the underlying source.
+
+// The default version, where Reference<THost const>::Type gives back a const reference.
+template <typename THost,
+ std::enable_if_t<std::is_same<std::remove_reference_t<
+ typename Reference<ModifiedString<THost, ModPadding>>::Type>,
+ std::add_const_t<std::remove_reference_t<
+ typename Reference<ModifiedString<THost, ModPadding>>::Type>>>::value,
+ int> = 0>
+inline typename Reference<ModifiedString<THost, ModPadding> >::Type
+cargoValue(ModifiedString<THost, ModPadding> const & me)
+{
+ return cargo(me)._paddedValue;
+}
+
+// The version, where Reference<THost const>::Type gives back a non-const reference.
+template <typename THost,
+ std::enable_if_t<!std::is_same<std::remove_reference_t<
+ typename Reference<ModifiedString<THost, ModPadding>>::Type>,
+ std::add_const_t<std::remove_reference_t<
+ typename Reference<ModifiedString<THost, ModPadding>>::Type>>>::value,
+ int> = 0>
+inline typename Reference<ModifiedString<THost, ModPadding> >::Type
+cargoValue(ModifiedString<THost, ModPadding> const & me)
+{
+ using TTargetType = typename Reference<ModifiedString<THost, ModPadding> >::Type;
+ return const_cast<TTargetType>(cargo(me)._paddedValue);
+}
+
+// ----------------------------------------------------------------------------
// Function value()
// ----------------------------------------------------------------------------
@@ -219,7 +264,7 @@ inline typename Reference<ModifiedString<THost, ModPadding> >::Type
value(ModifiedString<THost, ModPadding> & me, TPosition const pos)
{
SEQAN_ASSERT_LT(pos, static_cast<TPosition>(length(me)));
- return (SEQAN_LIKELY(pos < static_cast<TPosition>(length(host(me))))) ? host(me)[pos] : cargo(me)._paddedValue;
+ return (SEQAN_LIKELY(pos < static_cast<TPosition>(length(host(me))))) ? host(me)[pos] : cargoValue(me);
}
template <typename THost, typename TPosition>
@@ -227,7 +272,7 @@ inline typename Reference<ModifiedString<THost, ModPadding> const>::Type
value(ModifiedString<THost, ModPadding> const & me, TPosition const pos)
{
SEQAN_ASSERT_LT(pos, static_cast<TPosition>(length(me)));
- return (SEQAN_LIKELY(pos < static_cast<TPosition>(length(host(me))))) ? value(host(me), pos) : cargo(me)._paddedValue;
+ return (SEQAN_LIKELY(pos < static_cast<TPosition>(length(host(me))))) ? value(host(me), pos) : cargoValue(me);
}
// ----------------------------------------------------------------------------
diff --git a/include/seqan/platform.h b/include/seqan/platform.h
index ab0c7ba..e743c71 100644
--- a/include/seqan/platform.h
+++ b/include/seqan/platform.h
@@ -477,9 +477,9 @@ typedef int8_t __int8; // nolint
#include <endian.h>
#endif // __GLIBC__
-#if defined(__FreeBSD__) || (defined(__has_include) && __has_include(<sys/endian.h>))
+#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
#include <sys/endian.h>
-#endif // defined(__FreeBSD__)
+#endif // defined *BSD
#ifndef SEQAN_BIG_ENDIAN
#if (defined( _BYTE_ORDER ) && ( _BYTE_ORDER == _BIG_ENDIAN )) || \
diff --git a/include/seqan/seeds/seeds_global_chaining.h b/include/seqan/seeds/seeds_global_chaining.h
index 5a6e867..ee84323 100644
--- a/include/seqan/seeds/seeds_global_chaining.h
+++ b/include/seqan/seeds/seeds_global_chaining.h
@@ -62,6 +62,23 @@ typedef Tag<SparseChaining_> SparseChaining;
// Functions
// ===========================================================================
+template <typename TIntermediate>
+inline bool _checkScoreInvariant(TIntermediate const & list)
+{
+ if (list.empty())
+ return true;
+ auto it = list.begin();
+ auto score = it->i2;
+ ++it;
+ for (; it != list.end(); ++it)
+ {
+ if (score > it->i2)
+ return false;
+ score = it->i2;
+ }
+ return true;
+}
+
/*!
* @fn chainSeedsGlobally
* @headerfile <seqan/seeds.h>
@@ -97,6 +114,13 @@ typedef Tag<SparseChaining_> SparseChaining;
*/
// TODO(holtgrew): Implement scored!
+// NOTE(rrahn): Some general notes regarding the sparse chaining algorithm by Gusfield.
+// From the text it is hard to follow the correct algorithm, as one usually expects the y-coordinates to
+// be increasing integers (sequence positions). However, the algorithm assumes the coordinates of the
+// rectangles to be placed in the fourth quadrant of the cartesian coordinate system (negative y-coordinates).
+// To adapt the algorithm for the positive sequence space we sort the y-coordinates in *L* in ascending order.
+// We then can use lower_bound and upper_bound on the sorted set to find the corresponding seed j as described in
+// the algorithm.
template <typename TTargetContainer, typename TSeed, typename TSeedSetSpec>
void
chainSeedsGlobally(
@@ -153,8 +177,8 @@ chainSeedsGlobally(
// -----------------------------------------------------------------------
// Step 2: Build the chain.
// -----------------------------------------------------------------------
- // We build a list of "intermediate solutions". Each such
- // solution is represented by the triple (end position in dim1,
+ // We build a list of "intermediate solutions" (referred to as *L* in the Gusfield book).
+ // Each such solution is represented by the triple (end position in dim1,
// value of best chain so far, last seed of the chain).
typedef Triple<TPosition, TSize, unsigned> TIntermediateSolution;
typedef std::multiset<TIntermediateSolution> TIntermediateSolutions;
@@ -162,89 +186,99 @@ chainSeedsGlobally(
// For all interval points...
TIntermediateSolutions intermediateSolutions;
- for (TIntervalPointsIterator it = begin(intervalPoints), itEnd = end(intervalPoints); it != itEnd; ++it) {
+ for (TIntervalPointsIterator it_k = begin(intervalPoints), itEnd = end(intervalPoints); it_k != itEnd; ++it_k) {
// The seed belonging ot the interval point is seed k.
- TSeed const & seedK = seeds[it->i3];
+ TSeed const & seed_k = seeds[it_k->i3];
// std::cout << "Processing interval point (" << it->i1 << ", " << it->i2 << ", " << it->i3 << ")" << std::endl;
- if (it->i2) { // Is is begin point.
- // Find the closest seed (in dimension 1) to seed k with an
- // entry in intermediateSolutions whose end coordinate in
- // dimension 1 is <= the begin coordinate in dimension 1
- // of seedK.
+ if (it_k->i2) { // Is is begin point.
+ // Find the closest seed j (in y-dimension) with an
+ // entry in L whose end coordinate is less or equal the begin position of k.
//
// STL gives us upper_bound which returns a pointer to the
// *first* one that compares greater than the reference
// one. Searching for the this one and decrementing the
// result iterator gives the desired result.
- TIntermediateSolution referenceSolution(beginPositionV(seedK), std::numeric_limits<TSize>::max(), std::numeric_limits<unsigned>::max());
- // std::cout << " intermediateSolutions.upper_bound(" << beginPositionV(seedK) << ")" << std::endl;
- TIntermediateSolutionsIterator itJ = intermediateSolutions.upper_bound(referenceSolution);
- if (itJ == intermediateSolutions.begin()) {
- if (intermediateSolutions.size() > 0 &&
- intermediateSolutions.rbegin()->i1 <= beginPositionV(seedK)) {
- itJ = intermediateSolutions.end();
- --itJ;
- } else {
- continue;
- }
- } else {
- SEQAN_ASSERT_GT(intermediateSolutions.size(), 0u); // TODO(holtgrew): Remove this assertion?
- --itJ;
+ TIntermediateSolution referenceSolution(beginPositionV(seed_k), std::numeric_limits<TSize>::max(), std::numeric_limits<unsigned>::max());
+ // std::cout << " intermediateSolutions.upper_bound(" << beginPositionV(seed_k) << ")" << std::endl;
+ TIntermediateSolutionsIterator it_j = intermediateSolutions.upper_bound(referenceSolution);
+
+ // Special case not dealt with in the book: If L is empty or there is no chain
+ // that ends before k begins, simply continue with the next point in I.
+ if (intermediateSolutions.empty() || it_j == intermediateSolutions.begin())
+ {
+ continue;
}
- // std::cout << " --> " << seeds[itJ->i3] << std::endl;
+ // Go to the last value in L, i.e. l_j <= h_k.
+ --it_j;
+ // std::cout << " --> " << seeds[it_j->i3] << std::endl;
// Now, we have found such a seed j.
- SEQAN_ASSERT_LEQ(endPositionV(seeds[itJ->i3]), endPositionV(seedK));
+ SEQAN_ASSERT_LEQ(endPositionV(seeds[it_j->i3]), beginPositionV(seed_k));
// Update the intermediate solution value for k and set predecessor.
- qualityOfChainEndingIn[it->i3] += itJ->i2;
+ qualityOfChainEndingIn[it_k->i3] += it_j->i2;
// std::cout << " UPDATE qualityOfChainEndingIn[" << it->i3 << "] == " << qualityOfChainEndingIn[it->i3] << std::endl;
- predecessor[it->i3] = itJ->i3;
+ predecessor[it_k->i3] = it_j->i3;
// std::cout << " predecessor[" << it->i3 << "] == " << itJ->i3 << std::endl;
} else { // Is end point.
- // Search for the first triple in intermediateSolutions
- // where the end coordinate in dimension 1 is >= end
- // coordinate in dimension 1 for seed k. The corresponding
- // seed is seed j.
+ // Search for the first triple j in L with l_j >= l_k.
+ // Or to put it in differently, find the first chain that ends
+ // left and below the chain that ends in k. These are other possible solutions,
+ // that either result in a better score or must be deleted as the score of the chain ending in k
+ // is bigger. Hence, every other seed that could connect to both j and k, prefers the one with the higher
+ // score.
//
- // We work with upper_bound here which gives us the first
- // value that is > so we have to work around this to get
- // >= again...
- SEQAN_ASSERT_GT(endPositionV(seedK), 0u);
- TIntermediateSolution referenceSolution(endPositionV(seedK), 0, std::numeric_limits<unsigned>::max());
- TIntermediateSolutionsIterator itSol = intermediateSolutions.upper_bound(referenceSolution);
- if (itSol == intermediateSolutions.end()) {
- // None found. Insert a new triple for seed k.
- TIntermediateSolution sol(endPositionV(seedK), qualityOfChainEndingIn[it->i3], it->i3);
- // std::cout << " INSERT (" << sol.i1 << ", " << sol.i2 << ", " << sol.i3 << ") " << __LINE__ << std::endl;
- intermediateSolutions.insert(sol);
- } else {
+ // We can use the lower_bound, which gives the first triple j such that l_j >= l_k
+ SEQAN_ASSERT_GT(endPositionV(seed_k), 0u);
+ TIntermediateSolution referenceSolution(endPositionV(seed_k), 0, std::numeric_limits<unsigned>::max());
+ TIntermediateSolutionsIterator it_j = intermediateSolutions.lower_bound(referenceSolution);
+
+ // If there was a valid solution in L...
+ if (it_j != intermediateSolutions.end())
+ {
// Found this intermediate solution.
- SEQAN_ASSERT_GEQ(itSol->i1, endPositionV(seedK));
- TSeed const & seedJ = seeds[itSol->i3];
- // Possibly start a new chain at k if the end1 is
- // before the end1 of the chain ending in j or they
- // end at the same coordinate in dim1 but k already
- // has a higher quality than the whole chaing ending
- // at j.
- if (endPositionV(seedJ) > endPositionV(seedK) ||
- (endPositionV(seedJ) == endPositionV(seedK) && qualityOfChainEndingIn[it->i3] > itSol->i2)) {
- TIntermediateSolution sol(endPositionV(seedK), qualityOfChainEndingIn[it->i3], it->i3);
+ SEQAN_ASSERT_GEQ(it_j->i1, endPositionV(seed_k));
+ TSeed const & seed_j = seeds[it_j->i3];
+ // ... start a new chain at k if the vertical end of k is
+ // above the vertical end of the chain ending in j or if
+ // both k and j end at the same vertical position, while
+ // the score of the chain ending in k is bigger than the
+ // score of the chain ending in j.
+ if (endPositionV(seed_j) > endPositionV(seed_k) ||
+ (endPositionV(seed_j) == endPositionV(seed_k) && qualityOfChainEndingIn[it_k->i3] > it_j->i2))
+ {
+ TIntermediateSolution sol(endPositionV(seed_k), qualityOfChainEndingIn[it_k->i3], it_k->i3);
// std::cout << " INSERT (" << sol.i1 << ", " << sol.i2 << ", " << sol.i3 << ")" << __LINE__ << std::endl;
intermediateSolutions.insert(sol);
- }
- }
- // Delete all intermediate solutions where end1 >= end1 of k and have a lower quality than k.
- TIntermediateSolutionsIterator itDel = intermediateSolutions.upper_bound(referenceSolution);
- TIntermediateSolutionsIterator itDelEnd = intermediateSolutions.end();
- while (itDel != itDelEnd) {
- TIntermediateSolutionsIterator ptr = itDel;
- ++itDel;
- if (qualityOfChainEndingIn[it->i3] > ptr->i2) {
- // std::cout << " ERASE (" << ptr->i1 << ", " << ptr->i2 << ", " << ptr->i3 << ")" << std::endl;
- intermediateSolutions.erase(ptr);
+ // Delete all intermediate solutions where end1 >= end1 of k and have a lower score than k
+ // to ensure that the invariant of V(j) >= V(j'), with j' <= j holds.
+ // Roughly then, there is no chain ending in a seed below the seed_k, that has a lower score
+ // than the chain ending in seed_k. Thus the last value in `intermediateSolutions` will
+ // always point to the optimal chain.
+ TIntermediateSolutionsIterator itDel = intermediateSolutions.upper_bound(referenceSolution);
+ TIntermediateSolutionsIterator itDelEnd = intermediateSolutions.end();
+ while (itDel != itDelEnd)
+ {
+ TIntermediateSolutionsIterator ptr = itDel;
+ ++itDel;
+ if (qualityOfChainEndingIn[it_k->i3] > ptr->i2)
+ {
+ // std::cout << " ERASE (" << ptr->i1 << ", " << ptr->i2 << ", " << ptr->i3 << ")" << std::endl;
+ intermediateSolutions.erase(ptr);
+ }
+ }
}
+ } // ... otherwise, add a triple for k in L if either L is empty or the last triple in
+ // L has a lower score than the chain ending in k.
+ else if (intermediateSolutions.empty() || (--it_j)->i2 < qualityOfChainEndingIn[it_k->i3])
+ {
+ // None found. Insert a new triple for seed k.
+ TIntermediateSolution sol(endPositionV(seed_k), qualityOfChainEndingIn[it_k->i3], it_k->i3);
+ // std::cout << " INSERT (" << sol.i1 << ", " << sol.i2 << ", " << sol.i3 << ") " << __LINE__ << std::endl;
+ intermediateSolutions.insert(sol);
}
+ // Check if the invariant holds, that the scores in L are in a non-decreasing order.
+ SEQAN_ASSERT(_checkScoreInvariant(intermediateSolutions));
}
}
diff --git a/include/seqan/stream/iter_stream.h b/include/seqan/stream/iter_stream.h
index 6e1e9d7..661905b 100644
--- a/include/seqan/stream/iter_stream.h
+++ b/include/seqan/stream/iter_stream.h
@@ -61,7 +61,7 @@ struct StreamIterator {};
/*!
* @class StreamBuffer
* @headerfile <seqan/stream.h>
- * @brief Buffer to use in stream.
+ * @brief Reinterprets the std::basic_streambuf to grant access to protected member functions.
*
* @signature template <typename TValue[, typenam TTraits]>
* class StreamBuffer : public std::basic_streambuf<TValue, TTraits>;
@@ -69,65 +69,92 @@ struct StreamIterator {};
* @tparam TValue The value type of the stream buffer.
* @tparam TTraits The traits to use, defaults to <tt>std::char_traits<TValue></tt>.
*/
-
// TODO(holtgrew): Add documentation for member functions.
-// Unfortunately some of the most useful members of basic_streambuf are
-// protected, so we define a subclass to cast and access them
-template <typename TValue, typename TTraits_ = std::char_traits<TValue> >
-class StreamBuffer : public std::basic_streambuf<TValue, TTraits_>
+ // Unfortunately some of the most useful members of basic_streambuf are
+ // protected, so we define a subclass to cast and access them
+template <typename TValue, typename TTraits_ = std::char_traits<TValue>>
+struct StreamBuffer : public std::basic_streambuf<TValue, TTraits_>
+{
+ using TTraits = TTraits_;
+ using TBasicStream = std::basic_streambuf<TValue, TTraits_>;
+
+ using TBasicStream::eback;
+ using TBasicStream::gptr;
+ using TBasicStream::egptr;
+ using TBasicStream::gbump;
+ using TBasicStream::underflow;
+
+ using TBasicStream::pbase;
+ using TBasicStream::pptr;
+ using TBasicStream::epptr;
+ using TBasicStream::pbump;
+ using TBasicStream::overflow;
+};
+
+// NOTE(rrahn): This is a wrapper for the StreamBuffer class.
+// Since we usually work with std::basic_iostreams and their derivatives, we cannot simply cast a pointer to
+// std::basic_filebuf to StreamBuffer to expose it's protected member functions.
+// To do so, we only use the StreamBuffer to inherit from basic_streambuf (the base class of all buffer implementations.)
+// and only expose the protected member functions as public functions. We then store the original basic_streambuf
+// in this wrapper class and whenever access to the protected members is required we use a reinterpret_cast to convert
+// basic_streambuf* into the public StreamBuffer*. The reinterpret_cast has zero overhead.
+// This fixes an undetected error reported w/ the sanitizer option of gcc (https://github.com/seqan/seqan/issues/2104).
+template <typename TValue, typename TTraits_ = std::char_traits<TValue>>
+class StreamBufferWrapper
{
public:
- typedef TTraits_ TTraits;
- typedef std::basic_streambuf<TValue, TTraits_> TBase;
- using TBase::eback;
- using TBase::gptr;
- using TBase::egptr;
+ typedef std::basic_streambuf<TValue, TTraits_> TBasicStreamBuffer;
+ typedef StreamBuffer<TValue, TTraits_> TPubStreamBuffer_;
+ typedef typename TPubStreamBuffer_::TTraits TTraits;
- using TBase::pbase;
- using TBase::pptr;
- using TBase::epptr;
+ TBasicStreamBuffer * streamBuf{nullptr};
+
+ StreamBufferWrapper() = default;
+
+ explicit StreamBufferWrapper(TBasicStreamBuffer * _basicStreamBuf) : streamBuf(_basicStreamBuf)
+ {}
size_t chunkSize(Input)
{
- return egptr() - gptr();
+ return baseBuf()->egptr() - baseBuf()->gptr();
}
size_t chunkSize(Output)
{
- return epptr() - pptr();
+ return baseBuf()->epptr() - baseBuf()->pptr();
}
template <typename TOffset>
void advanceChunk(TOffset ofs, Input)
{
- this->gbump(ofs);
+ baseBuf()->gbump(ofs);
}
template <typename TOffset>
void advanceChunk(TOffset ofs, Output)
{
- this->pbump(ofs);
+ baseBuf()->pbump(ofs);
}
void reserveChunk(Input)
{
- if (gptr() == egptr())
- this->underflow();
+ if (baseBuf()->gptr() == baseBuf()->egptr())
+ baseBuf()->underflow();
}
void reserveChunk(Output)
{
- if (pptr() == epptr())
- this->overflow(EOF);
+ if (baseBuf()->pptr() == baseBuf()->epptr())
+ baseBuf()->overflow(EOF);
}
template <typename TOffset>
typename std::streampos
seekoff(TOffset ofs, std::ios_base::seekdir way, std::ios_base::openmode which)
{
- return TBase::seekoff(ofs, way, which);
+ return streamBuf->pubseekoff(ofs, way, which);
}
template <typename TOffset, typename TDirection>
@@ -149,9 +176,9 @@ public:
return;
if (IsSameType<TDirection, Input>::VALUE)
- this->underflow();
+ baseBuf()->underflow();
else
- this->overflow();
+ baseBuf()->overflow();
left = chunkSize(dir);
if (SEQAN_UNLIKELY(left == 0))
@@ -167,18 +194,23 @@ public:
if (IsSameType<TDirection, Input>::VALUE)
{
for (; ofs != 0; --ofs)
- this->sbumpc();
+ baseBuf()->sbumpc();
}
if (IsSameType<TDirection, Output>::VALUE)
{
for (; ofs != 0; --ofs)
- this->sputc('\0');
+ baseBuf()->sputc('\0');
}
}
return;
}
}
}
+
+ TPubStreamBuffer_* baseBuf() const
+ {
+ return reinterpret_cast<TPubStreamBuffer_ *>(streamBuf);
+ }
};
// ----------------------------------------------------------------------------
@@ -216,12 +248,13 @@ template <typename TStream>
class Iter<TStream, StreamIterator<Input> >
{
public:
- typedef typename Value<TStream>::Type TValue;
- typedef std::basic_istream<TValue> TIStream;
- typedef std::basic_streambuf<TValue> TBasicBuffer;
- typedef StreamBuffer<TValue> TStreamBuffer;
+ typedef typename Value<TStream>::Type TValue;
+ typedef std::basic_istream<TValue> TIStream;
+ typedef std::basic_streambuf<TValue> TBasicBuffer;
+ typedef StreamBufferWrapper<TValue> TStreamBufferWrapper;
+ typedef typename TStreamBufferWrapper::TPubStreamBuffer_ TStreamBuffer;
- TStreamBuffer *streamBuf;
+ TStreamBufferWrapper streamBufWrapper{nullptr};
/*!
* @fn InputStreamIterator::Iter
@@ -236,17 +269,15 @@ public:
*
* Allows default construction, construction from stream, as well as from a @link StreamBuffer @endlink.
*/
- Iter() : streamBuf()
- {}
+ Iter() = default;
- Iter(TIStream & stream) :
- streamBuf(static_cast<StreamBuffer<TValue> *>(stream.rdbuf()))
+ Iter(TIStream & stream) : streamBufWrapper(stream.rdbuf())
{
+ // printf("streamBuf: %p\n", streamBuf);
stream.exceptions(std::ios_base::badbit);
}
- Iter(TStreamBuffer * buf) :
- streamBuf(static_cast<StreamBuffer<TValue> *>(buf))
+ Iter(TBasicBuffer * buf) : streamBufWrapper(buf)
{}
};
@@ -268,12 +299,13 @@ template <typename TStream>
class Iter<TStream, StreamIterator<Output> >
{
public:
- typedef typename Value<TStream>::Type TValue;
- typedef std::basic_ostream<TValue> TOStream;
- typedef std::basic_streambuf<TValue> TBasicBuffer;
- typedef StreamBuffer<TValue> TStreamBuffer;
+ typedef typename Value<TStream>::Type TValue;
+ typedef std::basic_ostream<TValue> TOStream;
+ typedef std::basic_streambuf<TValue> TBasicBuffer;
+ typedef StreamBufferWrapper<TValue> TStreamBufferWrapper;
+ typedef typename TStreamBufferWrapper::TPubStreamBuffer_ TStreamBuffer;
- TStreamBuffer *streamBuf;
+ TStreamBufferWrapper streamBufWrapper{nullptr};
/*!
* @fn Iter::Iter
@@ -288,17 +320,14 @@ public:
*
* Allows default construction, construction from stream, as well as from a @link StreamBuffer @endlink.
*/
- Iter() : streamBuf()
- {}
+ Iter() = default;
- Iter(TOStream & stream):
- streamBuf(static_cast<StreamBuffer<TValue> *>(stream.rdbuf()))
+ Iter(TOStream & stream) : streamBufWrapper(stream.rdbuf())
{
stream.exceptions(std::ios_base::badbit);
}
- Iter(TBasicBuffer *buf):
- streamBuf(static_cast<StreamBuffer<TValue> *>(buf))
+ Iter(TBasicBuffer * buf) : streamBufWrapper(buf)
{}
template <typename TValue2>
@@ -505,13 +534,13 @@ directionIterator(TContainer &cont, TDirection const &)
template <typename TStream, typename TDirection, typename TSize>
inline void reserveChunk(Iter<TStream, StreamIterator<TDirection> > &iter, TSize, Input dir)
{
- iter.streamBuf->reserveChunk(dir);
+ iter.streamBufWrapper.reserveChunk(dir);
}
template <typename TStream, typename TDirection, typename TSize>
inline void reserveChunk(Iter<TStream, StreamIterator<TDirection> > &iter, TSize, Output dir)
{
- iter.streamBuf->reserveChunk(dir);
+ iter.streamBufWrapper.reserveChunk(dir);
}
// ----------------------------------------------------------------------------
@@ -523,7 +552,7 @@ inline void reserveChunk(Iter<TStream, StreamIterator<TDirection> > &iter, TSize
template <typename TStream, typename TDirection, typename TSize>
inline void advanceChunk(Iter<TStream, StreamIterator<TDirection> > &iter, TSize size)
{
- iter.streamBuf->advanceChunk(size, TDirection());
+ iter.streamBufWrapper.advanceChunk(size, TDirection());
}
// ----------------------------------------------------------------------------
@@ -550,8 +579,8 @@ template <typename TChunk, typename TStream, typename TDirection>
inline void
getChunk(TChunk &result, Iter<TStream, StreamIterator<Tag<TDirection> > > &iter, Tag<TDirection>)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- getChunk(result, *iter.streamBuf, Tag<TDirection>());
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ getChunk(result, *iter.streamBufWrapper.baseBuf(), Tag<TDirection>());
}
// ----------------------------------------------------------------------------
@@ -562,15 +591,15 @@ template <typename TStream>
inline typename Reference<Iter<TStream, StreamIterator<Input> > >::Type
value(Iter<TStream, StreamIterator<Input> > &iter)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- return iter.streamBuf->sgetc();
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ return iter.streamBufWrapper.baseBuf()->sgetc();
}
template <typename TStream>
inline typename Reference<Iter<TStream, StreamIterator<Input> > const>::Type
value(Iter<TStream, StreamIterator<Input> > const &iter)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- return iter.streamBuf->sgetc();
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ return iter.streamBufWrapper.baseBuf()->sgetc();
}
// ----------------------------------------------------------------------------
@@ -600,12 +629,13 @@ setValue(Iter<TStream, StreamIterator<Output> > & iter, TValue const &val)
{
return setValue(const_cast<Iter<TStream, StreamIterator<Output> > const &>(iter), val);
}
+
template <typename TStream, typename TValue>
inline void
setValue(Iter<TStream, StreamIterator<Output> > const & iter, TValue const &val)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- iter.streamBuf->sputc((typename Value<Iter<TStream, StreamIterator<Output> > >::Type)val);
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ iter.streamBufWrapper.baseBuf()->sputc((typename Value<Iter<TStream, StreamIterator<Output> > >::Type)val);
}
// ----------------------------------------------------------------------------
@@ -628,8 +658,8 @@ template <typename TStream>
inline void
goNext(Iter<TStream, StreamIterator<Input> > & iter)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- iter.streamBuf->sbumpc();
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ iter.streamBufWrapper.baseBuf()->sbumpc();
}
template <typename TStream>
@@ -646,8 +676,8 @@ template <typename TContainer, typename TSpec>
inline void
operator++(Iter<TContainer, StreamIterator<Input> > & iter, int)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- iter.streamBuf->sbumpc();
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ iter.streamBufWrapper.baseBuf()->sbumpc();
}
// ----------------------------------------------------------------------------
@@ -658,8 +688,8 @@ template <typename TStream, typename TOffset, typename TDirection>
inline void
goFurther(Iter<TStream, StreamIterator<TDirection> > &iter, TOffset ofs)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- iter.streamBuf->goFurther(ofs, TDirection());
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ iter.streamBufWrapper.goFurther(ofs, TDirection());
}
// ----------------------------------------------------------------------------
@@ -670,8 +700,8 @@ template <typename TStream, typename TDirection>
inline typename Position<Iter<TStream, StreamIterator<TDirection> > const>::Type
position(Iter<TStream, StreamIterator<TDirection> > const & iter)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- return iter.streamBuf->pubseekoff(0, std::ios_base::cur,
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ return iter.streamBufWrapper.baseBuf()->pubseekoff(0, std::ios_base::cur,
(IsSameType<TDirection, Input>::VALUE)? std::ios_base::in: std::ios_base::out);
}
@@ -683,8 +713,8 @@ template <typename TStream, typename TDirection, typename TPosition>
inline void
setPosition(Iter<TStream, StreamIterator<TDirection> > const & iter, TPosition pos)
{
- SEQAN_ASSERT(iter.streamBuf != NULL);
- iter.streamBuf->pubseekpos(pos, (IsSameType<TDirection, Input>::VALUE)? std::ios_base::in: std::ios_base::out);
+ SEQAN_ASSERT(iter.streamBufWrapper.baseBuf() != nullptr);
+ iter.streamBufWrapper.baseBuf()->pubseekpos(pos, (IsSameType<TDirection, Input>::VALUE)? std::ios_base::in: std::ios_base::out);
}
// ----------------------------------------------------------------------------
@@ -698,13 +728,13 @@ atEnd(Iter<TStream, StreamIterator<Input> > const & iter)
typedef typename Value<Iter<TStream, StreamIterator<Input> > >::Type TValue;
typedef StreamBuffer<TValue> TStreamBuffer;
- if (SEQAN_UNLIKELY(iter.streamBuf == NULL))
+ if (SEQAN_UNLIKELY(iter.streamBufWrapper.baseBuf() == nullptr))
{
return true;
}
else
{
- TStreamBuffer *buf = static_cast<TStreamBuffer*>(iter.streamBuf);
+ TStreamBuffer * const buf = iter.streamBufWrapper.baseBuf();
if (SEQAN_LIKELY(buf->gptr() < buf->egptr()))
return false;
else
@@ -719,13 +749,13 @@ atEnd(Iter<TStream, StreamIterator<Output> > const & iter)
typedef typename Value<Iter<TStream, StreamIterator<Input> > >::Type TValue;
typedef StreamBuffer<TValue> TStreamBuffer;
- if (SEQAN_UNLIKELY(iter.streamBuf == NULL))
+ if (SEQAN_UNLIKELY(iter.streamBufWrapper.baseBuf() == nullptr))
{
return true;
}
else
{
- TStreamBuffer *buf = static_cast<TStreamBuffer*>(iter.streamBuf);
+ TStreamBuffer * const buf = iter.streamBufWrapper.baseBuf();
if (SEQAN_LIKELY(buf->pptr() < buf->epptr()))
return false;
else
diff --git a/manual/source/Infrastructure/Use/Install.rst b/manual/source/Infrastructure/Use/Install.rst
index 85dadac..e3ce7d4 100644
--- a/manual/source/Infrastructure/Use/Install.rst
+++ b/manual/source/Infrastructure/Use/Install.rst
@@ -32,27 +32,27 @@ SeqAn is available natively on the following platforms.
<br/>
-+---------------------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Operating System | Package Name | Command | links |
-+============+==============+====================+==============================================+==============================================================================================================================================================+
-| **G** |br| | Arch | | | `AUR <https://aur.archlinux.org/packages/?O=0&K=seqan>`__ |
-| **N** |br| +--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **U** |br| | Debian | libseqan2-dev | ``apt install libseqan2-dev`` | `info <https://packages.debian.org/search?keywords=libseqan2-dev>`__ | `contact <mailto:debian-med-packaging()lists.alioth.debian.org>`__ |
-| / |br| +--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **L** |br| | Fedora | seqan-devel | ``yum install seqan-devel`` | `info <https://apps.fedoraproject.org/packages/seqan-devel>`__ | `contact <mailto:sagitter()fedoraproject.org>`__ |
-| **I** |br| +--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **N** |br| | Gentoo | seqan | ``emerge sci-biology/seqan`` | `info <https://packages.gentoo.org/packages/sci-biology/seqan>`__ | `contact <mailto:sci-biology at gentoo.org>`__ |
-| **U** |br| +--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **X** |br| | Ubuntu | seqan-dev | ``apt install seqan-dev`` | `info <http://packages.ubuntu.com/xenial/seqan-dev>`__ | `contact <mailto:ubuntu-motu()lists.ubuntu.com>`__ |
-+------------+--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **M** |br| | Homebrew | seqan | ``brew install homebrew/science/seqan`` | `info <http://braumeister.org/repos/Homebrew/homebrew-science/formula/seqan>`__ | `contact <mailto:tim()tim-smith.us>`__ |
-| **A** |br| +--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **C** |br| | MacPorts | seqan | ``port install seqan`` | `info <https://trac.macports.org/browser/trunk/dports/science/seqan/Portfile>`__ | `contact <mailto:rene.rahn()fu-berlin.de>`__ |
-+------------+--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **B** |br| | FreeBSD | seqan | ``pkg install seqan`` | `info <http://freshports.org/biology/seqan>`__ | `contact <mailto:h2+fbsdports()fsfe.org>`__ |
-| **S** |br| +--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| **D** |br| | OpenBSD | seqan | ``pkg_add seqan`` | `info <http://openports.se/biology/seqan>`__ | `contact <mailto:h2+fbsdports()fsfe.org>`__ |
-+------------+--------------+--------------------+----------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------+
++-------------------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| Operating System | Package Name | Command | links |
++============+============+================+=========================================+========================================================================================================================================================================+
+| **G** |br| | Arch | seqan (AUR) | *depends* | `info <https://aur.archlinux.org/packages/seqan/>`__ |
+| **N** |br| +------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **U** |br| | Debian | libseqan2-dev | ``apt install libseqan2-dev`` | `info <https://packages.debian.org/search?keywords=libseqan2-dev>`__ | `contact <mailto:debian-med-packaging()lists.alioth.debian.org>`__ |
+| / |br| +------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **L** |br| | Fedora | seqan-devel | ``yum install seqan-devel`` | `info <https://apps.fedoraproject.org/packages/seqan-devel>`__ | `contact <mailto:sagitter()fedoraproject.org>`__ |
+| **I** |br| +------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **N** |br| | Gentoo | seqan | ``emerge sci-biology/seqan`` | `info <https://packages.gentoo.org/packages/sci-biology/seqan>`__ | `contact <mailto:sci-biology at gentoo.org>`__ |
+| **U** |br| +------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **X** |br| | Ubuntu | libseqan2-dev | ``apt install libseqan2-dev`` | `info <https://packages.ubuntu.com/search?keywords=libseqan2-dev&searchon=names&suite=all§ion=all>`__ | `contact <mailto:ubuntu-devel-discuss at lists.ubuntu.com>`__ |
++------------+------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **M** |br| | Homebrew | seqan | ``brew install homebrew/science/seqan`` | `info <http://braumeister.org/repos/Homebrew/homebrew-science/formula/seqan>`__ | `contact <mailto:tim()tim-smith.us>`__ |
+| **A** |br| +------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **C** |br| | MacPorts | seqan | ``port install seqan`` | `info <https://trac.macports.org/browser/trunk/dports/science/seqan/Portfile>`__ | `contact <mailto:rene.rahn()fu-berlin.de>`__ |
++------------+------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **B** |br| | FreeBSD | seqan | ``pkg install seqan`` | `info <http://freshports.org/biology/seqan>`__ | `contact <mailto:h2+fbsdports()fsfe.org>`__ |
+| **S** |br| +------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| **D** |br| | OpenBSD | seqan | ``pkg_add seqan`` | `info <http://openports.se/biology/seqan>`__ | `contact <mailto:h2+fbsdports()fsfe.org>`__ |
++------------+------------+----------------+-----------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
You should execute the above commands in a terminal as the ``root`` user or prefix them with ``sudo``. If you have problems installing the package on your operating system, or it is outdated, please write to the contact shown above (and replace ``()`` in the e-mail-address with ``@``).
diff --git a/tests/align/test_alignment_algorithms_local.h b/tests/align/test_alignment_algorithms_local.h
index f6c1d73..99ce1c7 100644
--- a/tests/align/test_alignment_algorithms_local.h
+++ b/tests/align/test_alignment_algorithms_local.h
@@ -607,6 +607,53 @@ SEQAN_DEFINE_TEST(test_align_local_alignment_enumeration_gaps)
SEQAN_ASSERT_NOT(nextLocalAlignment(gapsH, gapsV, enumerator));
}
+
+ // Test scoring matrix
+ {
+
+ std::stringstream ssH, ssV;
+
+ String<AminoAcid> strH("IGYELAPIPHTRTMDDFGNWWWKKWIHDDELNYFGTQLLIWHLQEKEGEQ");
+ String<AminoAcid> strV("KHSDQGQIALLIHNTLQDWRPKVECDSPRTMIRRDFDDPQLAPPPHTNHRGNM");
+
+ Gaps<String<AminoAcid>, ArrayGaps> gapsH(strH);
+ Gaps<String<AminoAcid>, ArrayGaps> gapsV(strV);
+
+ Blosum62 scoringScheme;
+ int cutoff = 40;
+
+ LocalAlignmentEnumerator<Blosum62, Unbanded> enumerator(scoringScheme, cutoff);
+
+ SEQAN_ASSERT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ SEQAN_ASSERT_EQ(getScore(enumerator), 69);
+ ssH.clear(); ssH.str(""); ssH << gapsH;
+ SEQAN_ASSERT_EQ(ssH.str(), "GYELAP--IPHTRTMDDFGNWWWK-KWIH-DD-E-L---NYFGT-QLLIW---HLQEKEG");
+ ssV.clear(); ssV.str(""); ssV << gapsV;
+ SEQAN_ASSERT_EQ(ssV.str(), "G-QIA-LLI-HN-TLQD---W--RPK-VECDSPRTMIRRD-FDDPQLA--PPPHTNHR-G");
+
+ SEQAN_ASSERT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ SEQAN_ASSERT_EQ(getScore(enumerator), 57);
+ ssH.clear(); ssH.str(""); ssH << gapsH;
+ SEQAN_ASSERT_EQ(ssH.str(), "KWIHDDELNYFGTQ--LLIWH--LQE---K-E");
+ ssV.clear(); ssV.str(""); ssV << gapsV;
+ SEQAN_ASSERT(ssV.str() == "K--HSDQ----G-QIALLI-HNTLQDWRPKVE");
+
+ SEQAN_ASSERT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ SEQAN_ASSERT_EQ(getScore(enumerator), 51);
+ ssH.clear(); ssH.str(""); ssH << gapsH;
+ SEQAN_ASSERT_EQ(ssH.str(), "IGYE-LA---P-I----PHTRTMD---DFGNWWWKKWIHDD-EL------NYF-GTQL");
+ ssV.clear(); ssV.str(""); ssV << gapsV;
+ SEQAN_ASSERT_EQ(ssV.str(), "I-HNTLQDWRPKVECDSP--RTM-IRRDF----------DDPQLAPPPHTNH-RGN-M");
+
+ SEQAN_ASSERT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ SEQAN_ASSERT_EQ(getScore(enumerator), 46);
+ ssH.clear(); ssH.str(""); ssH << gapsH;
+ SEQAN_ASSERT_EQ(ssH.str(), "I--GYE---LAPIP-HT--RTMDDFGN");
+ ssV.clear(); ssV.str(""); ssV << gapsV;
+ SEQAN_ASSERT_EQ(ssV.str(), "IRRDFDDPQLAP-PPHTNHR-----GN");
+
+ SEQAN_ASSERT_NOT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ }
}
SEQAN_DEFINE_TEST(test_align_local_alignment_enumeration_fragment)
diff --git a/tests/align/test_alignment_algorithms_local_banded.h b/tests/align/test_alignment_algorithms_local_banded.h
index 846cf94..afe4148 100644
--- a/tests/align/test_alignment_algorithms_local_banded.h
+++ b/tests/align/test_alignment_algorithms_local_banded.h
@@ -502,6 +502,38 @@ SEQAN_DEFINE_TEST(test_align_local_alignment_enumeration_banded_gaps)
SEQAN_ASSERT_NOT(nextLocalAlignment(gapsH, gapsV, enumerator));
}
+
+ // Test scoring matrix
+ {
+ std::stringstream ssH, ssV;
+
+ String<AminoAcid> strH("IGYELAPIPHTRTMDDFGNWWWKKWIHDDELNYFGTQLLIWHLQEKEGEQ");
+ String<AminoAcid> strV("KHSDQGQIALLIHNTLQDWRPKVECDSPRTMIRRDFDDPQLAPPPHTNHRGNM");
+
+ Gaps<String<AminoAcid>, ArrayGaps> gapsH(strH);
+ Gaps<String<AminoAcid>, ArrayGaps> gapsV(strV);
+
+ Blosum62 scoringScheme;
+ int cutoff = 40;
+
+ LocalAlignmentEnumerator<Blosum62, Banded> enumerator(scoringScheme, -20, 20, cutoff);
+
+ SEQAN_ASSERT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ SEQAN_ASSERT_EQ(getScore(enumerator), 69);
+ ssH.clear(); ssH.str(""); ssH << gapsH;
+ SEQAN_ASSERT_EQ(ssH.str(), "GYELAP--IPHTRTMDDFGNWWWK-KWIH-DD-E--L--NYF-GTQLLIW---HLQEKEG");
+ ssV.clear(); ssV.str(""); ssV << gapsV;
+ SEQAN_ASSERT_EQ(ssV.str(), "G-QIA-LLI-H-NTLQD-----WRPK-VECDSPRTMIRRD-FDDPQ-LA-PPPHTNHR-G");
+
+ SEQAN_ASSERT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ SEQAN_ASSERT_EQ(getScore(enumerator), 51);
+ ssH.clear(); ssH.str(""); ssH << gapsH;
+ SEQAN_ASSERT_EQ(ssH.str(), "IGYE-L---AP-I----PHTRTM--DDFGNWWWKKWIHDD-EL------NYF-GTQL");
+ ssV.clear(); ssV.str(""); ssV << gapsV;
+ SEQAN_ASSERT(ssV.str() == "I-HNTLQDWRPKVECDSP--RTMIRRDF----------DDPQLAPPPHTNH-RG-NM");
+
+ SEQAN_ASSERT_NOT(nextLocalAlignment(gapsH, gapsV, enumerator));
+ }
}
SEQAN_DEFINE_TEST(test_align_local_alignment_enumeration_banded_fragment)
diff --git a/tests/arg_parse/test_arg_parse.cpp b/tests/arg_parse/test_arg_parse.cpp
index aec4bcb..100ec59 100644
--- a/tests/arg_parse/test_arg_parse.cpp
+++ b/tests/arg_parse/test_arg_parse.cpp
@@ -144,6 +144,7 @@ SEQAN_BEGIN_TESTSUITE(test_arg_parse)
SEQAN_CALL_TEST(test_argument_invalid_cast);
SEQAN_CALL_TEST(test_argument_min_max_boundaries);
SEQAN_CALL_TEST(test_argument_valid_values);
+ SEQAN_CALL_TEST(test_argument_valid_values_directories);
SEQAN_CALL_TEST(test_argument_parser);
SEQAN_CALL_TEST(test_parse_non_const_cstring);
diff --git a/tests/arg_parse/test_arg_parse_argument.h b/tests/arg_parse/test_arg_parse_argument.h
index 675e403..b46fb84 100644
--- a/tests/arg_parse/test_arg_parse_argument.h
+++ b/tests/arg_parse/test_arg_parse_argument.h
@@ -223,4 +223,32 @@ SEQAN_DEFINE_TEST(test_argument_valid_values)
"the given path 'not-a-validfile.qxt' does not have one of the valid file extensions [*.txt, *.fasta]; the file extension was overridden to be '.fa'");
}
+SEQAN_DEFINE_TEST(test_argument_valid_values_directories)
+{
+ ArgParseArgument dirarg(ArgParseArgument::INPUT_DIRECTORY);
+ setValidValues(dirarg, ".dir1 .dir2");
+
+ _assignArgumentValue(dirarg, "directory.dir1");
+ SEQAN_ASSERT_EQ(value(dirarg.value, 0), "directory.dir1");
+
+ // Test getFileExtension() function.
+ SEQAN_ASSERT_EQ(getFileExtension(dirarg), ".dir1");
+
+ // different case should also work
+ _assignArgumentValue(dirarg, "directory.DIR1");
+ SEQAN_ASSERT_EQ(value(dirarg.value, 0), "directory.DIR1");
+
+ // also accept a trailing '/'
+ _assignArgumentValue(dirarg, "directory.dir2/");
+ SEQAN_ASSERT_EQ(value(dirarg.value, 0), "directory.dir2/");
+
+ // Test getFileExtension() function.
+ SEQAN_ASSERT_EQ(getFileExtension(dirarg), ".dir2");
+
+ // different case should also work
+ _assignArgumentValue(dirarg, "directory.DIR2/");
+ SEQAN_ASSERT_EQ(value(dirarg.value, 0), "directory.DIR2/");
+
+}
+
#endif // SEQAN_TESTS_ARG_PARSE_TEST_ARG_PARSE_ARGUMENT_H_
diff --git a/tests/modifier/test_modifier.cpp b/tests/modifier/test_modifier.cpp
index 9b139a9..ec6fc83 100644
--- a/tests/modifier/test_modifier.cpp
+++ b/tests/modifier/test_modifier.cpp
@@ -42,7 +42,7 @@
#include "test_modifier_string_padding.h"
-SEQAN_BEGIN_TESTSUITE(test_modifier)
+SEQAN_BEGIN_TESTSUITE(test_modifier)
{
// Test the modifier shortcuts.
SEQAN_CALL_TEST(test_modifer_shortcuts_dna_string_reverse);
@@ -130,5 +130,6 @@ SEQAN_BEGIN_TESTSUITE(test_modifier)
SEQAN_CALL_TEST(test_modified_string_padding_end);
SEQAN_CALL_TEST(test_modified_string_padding_difference);
SEQAN_CALL_TEST(test_modified_string_padding_iterator);
+ SEQAN_CALL_TEST(test_modified_string_padding_defect_2190);
}
SEQAN_END_TESTSUITE
diff --git a/tests/modifier/test_modifier_string_padding.h b/tests/modifier/test_modifier_string_padding.h
index 063b620..b474429 100644
--- a/tests/modifier/test_modifier_string_padding.h
+++ b/tests/modifier/test_modifier_string_padding.h
@@ -181,4 +181,28 @@ SEQAN_DEFINE_TEST(test_modified_string_padding_iterator)
SEQAN_ASSERT_EQ(*(it - 3), seq[12]);
}
+SEQAN_DEFINE_TEST(test_modified_string_padding_defect_2190)
+{
+ using namespace seqan;
+
+ DnaString seq = "ACGTGGATAGCATCG";
+ auto seqInf = infix(seq, 0, length(seq));
+
+ auto test_const = [](auto const & modifier)
+ {
+ // using TRef = typename Reference<decltype(modifier)>::Type;
+ auto x = value(modifier, 1);
+ SEQAN_ASSERT_EQ(x, 'C');
+ };
+ { // Test working case, when reference of const modifier gives back a const reference to the value
+ ModifiedString<decltype(seq), ModPadding> modString(seq);
+ test_const(modString);
+ }
+
+ { // Test defect, when reference of const modifier gives back a non-const reference to the value
+ ModifiedString<decltype(seqInf), ModPadding> modString(seqInf);
+ test_const(modString);
+ }
+}
+
#endif // #ifndef TESTS_MODIFIER_MODIFIER_STRING_PADDING_H_
diff --git a/tests/seeds/test_seeds_global_chaining.cpp b/tests/seeds/test_seeds_global_chaining.cpp
index 3cb5b82..f9e729f 100644
--- a/tests/seeds/test_seeds_global_chaining.cpp
+++ b/tests/seeds/test_seeds_global_chaining.cpp
@@ -116,6 +116,32 @@ SEQAN_DEFINE_TEST(test_seeds_global_chaining_sparse_length)
SEQAN_ASSERT_EQ(1u, length(result));
SEQAN_ASSERT_EQ(TSeed(0, 93, 281, 342), result[0]);
}
+
+ { // Issue #2082
+ TSeedSet seedSet;
+
+ addSeed(seedSet, TSeed(0, 0, 3), Single());
+ addSeed(seedSet, TSeed(2, 3, 2), Single());
+
+ TSeedChain result;
+ chainSeedsGlobally(result, seedSet, SparseChaining());
+
+ SEQAN_ASSERT_EQ(1u, length(result));
+ SEQAN_ASSERT_EQ(TSeed(0, 0, 3), result[0]);
+ }
+
+ { // Issue #2082
+ TSeedSet seedSet;
+
+ addSeed(seedSet, TSeed(0, 0, 100), Single());
+ addSeed(seedSet, TSeed(95, 95, 10), Single());
+
+ TSeedChain result;
+ chainSeedsGlobally(result, seedSet, SparseChaining());
+
+ SEQAN_ASSERT_EQ(1u, length(result));
+ SEQAN_ASSERT_EQ(TSeed(0, 0, 100), result[0]);
+ }
}
SEQAN_BEGIN_TESTSUITE(test_seeds_global_chaining)
diff --git a/util/cmake/SeqAnBuildSystem.cmake b/util/cmake/SeqAnBuildSystem.cmake
index e642f81..d4e2ba8 100644
--- a/util/cmake/SeqAnBuildSystem.cmake
+++ b/util/cmake/SeqAnBuildSystem.cmake
@@ -53,6 +53,12 @@ set(PythonInterp_FIND_VERSION_COUNT 2)
include (SeqAnUsabilityAnalyzer)
include (CheckCXXCompilerFlag)
+if (DEFINED CMAKE_INSTALL_DOCDIR)
+ set(CMAKE_INSTALL_DOCDIR_IS_SET ON)
+endif ()
+
+include (GNUInstallDirs)
+
set (COMPILER_CLANG FALSE)
set (COMPILER_GCC FALSE)
set (COMPILER_LINTEL FALSE)
@@ -206,7 +212,7 @@ macro (seqan_build_system_init)
# TODO(h-2): raise this to W4
set (SEQAN_CXX_FLAGS "${SEQAN_CXX_FLAGS} /W3")
else()
- set (SEQAN_CXX_FLAGS "${SEQAN_CXX_FLAGS} -W -Wall -pedantic -fstrict-aliasing -Wstrict-aliasing")
+ set (SEQAN_CXX_FLAGS "${SEQAN_CXX_FLAGS} -W -Wall -pedantic")
set (SEQAN_DEFINITIONS ${SEQAN_DEFINITIONS} -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64)
# disable some warnings on ICC
@@ -389,24 +395,24 @@ macro (seqan_setup_library)
install (FILES LICENSE
README.rst
CHANGELOG.rst
- DESTINATION share/doc/seqan)
+ DESTINATION ${CMAKE_INSTALL_DOCDIR})
# Install pkg-config file, except on Windows.
if (NOT CMAKE_SYSTEM_NAME MATCHES Windows)
configure_file("util/pkgconfig/seqan.pc.in" "${CMAKE_BINARY_DIR}/util/pkgconfig/seqan-${SEQAN_VERSION_MAJOR}.pc" @ONLY)
- install(FILES "${CMAKE_BINARY_DIR}/util/pkgconfig/seqan-${SEQAN_VERSION_MAJOR}.pc" DESTINATION lib/pkgconfig)
+ install(FILES "${CMAKE_BINARY_DIR}/util/pkgconfig/seqan-${SEQAN_VERSION_MAJOR}.pc" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig)
endif (NOT CMAKE_SYSTEM_NAME MATCHES Windows)
# Install FindSeqAn TODO(h-2) rename seqan-config.cmake to seqan-config${SEQAN_VERSION_MAJOR}.cmake after 2.x cycle
- install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/util/cmake/seqan-config.cmake" DESTINATION lib/cmake/seqan/)
+ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/util/cmake/seqan-config.cmake" DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cmake/seqan/)
# Install headers
file (GLOB HEADERS
- RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/include/
include/seqan/[A-z]*/[A-z]/[A-z]*.h
include/seqan/[A-z]*/[A-z]*.h
include/seqan/[A-z]*.h)
foreach (HEADER ${HEADERS})
get_filename_component (_DESTINATION ${HEADER} PATH)
- install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${HEADER} DESTINATION ${_DESTINATION})
+ install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/${HEADER} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${_DESTINATION})
endforeach ()
endif ()
@@ -463,8 +469,11 @@ macro (seqan_setup_install_vars APP_NAME)
set (SEQAN_PREFIX_SHARE ".")
set (SEQAN_PREFIX_SHARE_DOC ".")
else ()
- set (SEQAN_PREFIX_SHARE "share/${APP_NAME}")
- set (SEQAN_PREFIX_SHARE_DOC "share/doc/${APP_NAME}")
+ if (NOT DEFINED CMAKE_INSTALL_DOCDIR_IS_SET)
+ set (CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DATAROOTDIR}/doc" CACHE STRING "Documentation root (DATAROOTDIR/doc)" FORCE)
+ endif ()
+ set (SEQAN_PREFIX_SHARE "${CMAKE_INSTALL_DATADIR}/${APP_NAME}")
+ set (SEQAN_PREFIX_SHARE_DOC "${CMAKE_INSTALL_DOCDIR}/${APP_NAME}")
endif ()
endmacro (seqan_setup_install_vars)
diff --git a/util/pkgconfig/seqan.pc.in b/util/pkgconfig/seqan.pc.in
index 8cc5f3f..7dc4a00 100644
--- a/util/pkgconfig/seqan.pc.in
+++ b/util/pkgconfig/seqan.pc.in
@@ -1,6 +1,4 @@
-prefix=@CMAKE_INSTALL_PREFIX@
-exec_prefix=${prefix}
-includedir=${prefix}/include
+includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@
Name: @CMAKE_PROJECT_NAME@
Description: C++ library for biological sequence analysis
diff --git a/util/skel/app_template/CMakeLists.txt b/util/skel/app_template/CMakeLists.txt
index 6d1aeca..1c72c2b 100644
--- a/util/skel/app_template/CMakeLists.txt
+++ b/util/skel/app_template/CMakeLists.txt
@@ -48,7 +48,7 @@ endif (NOT SEQAN_PREFIX_SHARE_DOC)
# Install %(NAME)s in ${PREFIX}/bin directory
install (TARGETS %(NAME)s
- DESTINATION bin)
+ DESTINATION ${CMAKE_INSTALL_BINDIR})
# Install non-binary files for the package to "." for app builds and
# ${PREFIX}/share/doc/%(NAME)s for SeqAn release builds.
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/seqan2.git
More information about the debian-med-commit
mailing list