New upstream version 2.3.2

parent b224a1e7
......@@ -14,6 +14,7 @@ branches:
- batch_parsing
- no-io
- rel2.3
- v2.3.2
script: make allall && make simple-test
notifications:
slack:
......
This diff is collapsed.
This diff is collapsed.
......@@ -25,7 +25,7 @@ prefix = /usr/local
bindir = $(prefix)/bin
INC =
LIBS = -lreadline -ltermcap -lz
LIBS = -lz
GCC_PREFIX = $(shell dirname `which gcc`)
GCC_SUFFIX =
CC ?= $(GCC_PREFIX)/gcc$(GCC_SUFFIX)
......@@ -499,7 +499,7 @@ perl-deps:
mkdir .perllib.tmp ; \
$$DL http://cpanmin.us | perl - -l $(CURDIR)/.perllib.tmp App::cpanminus local::lib ; \
eval `perl -I $(CURDIR)/.perllib.tmp/lib/perl5 -Mlocal::lib=$(CURDIR)/.perllib.tmp` ; \
cpanm Math::Random Clone Test::Deep Sys::Info ; \
cpanm --force Math::Random Clone Test::Deep Sys::Info ; \
fi
.PHONY: test
......
......@@ -3,7 +3,7 @@ Bowtie 2 NEWS
Bowtie 2 is now available for download from the project website,
http://bowtie-bio.sf.net/bowtie2. 2.0.0-beta1 is the first version released to
the public and 2.3.1 is the latest version. Bowtie 2 is licensed under
the public and 2.3.2 is the latest version. Bowtie 2 is licensed under
the GPLv3 license. See `LICENSE' file for details.
Reporting Issues
......@@ -16,6 +16,27 @@ Please report any issues using the Sourceforge bug tracker:
Version Release History
=======================
Version 2.3.2 - May 05, 2017
* Added support for interleaved paired-end FASTQ inputs
(--interleaved)
* Now reports MREVERSE SAM flag for unaligned end when only one
end of a pair aligns
* Fixed issue where first character of some read names was
omitted from SAM output when using tabbed input formats
* Added --sam-no-qname-trunc option, which causes entire read
name, including spaces, to be written to SAM output. This
violates SAM specification, but can be useful in applications
that immediately postprocess the SAM.
* Fixed compilation error caused by pointer comparison issue
in aligner_result.cpp
* Removed termcap and readline dependencies introduced in v2.3.1
* Fixed compilation issues caused by gzbuffer function when
compiling with zlib v1.2.3.5 and earlier. Users compiling against
these libraries will use the zlib default buffer size of 8Kb
when decompressing read files.
* Fixed issue that would cause Bowtie 2 hang when aligning FASTA
inputs with more than one thread
Version 2.3.1 - Mar 04, 2017
Please note that as of this release Bowtie 2 now has dependencies on zlib and readline libraries.
Make sure that all dependencies are met before attempting to build from source.
......
......@@ -1595,13 +1595,15 @@ int BtBranchTracer::trySolution(
return BT_REJECTED_CORE_DIAG;
}
off = br->leftmostCol();
size_t trimBeg = br->uppermostRow();
size_t trimEnd = prob_.qrylen_ - prob_.row_ - 1;
score.score_ = prob_.targ_;
score.basesAligned_ = (int)(prob_.qrylen_ - trimBeg - trimEnd - ned.size());
score.edits_ = (int)ned.size();
score.ns_ = ns;
score.gaps_ = ngap;
res.alres.setScore(score);
res.alres.setRefNs(nrefns);
size_t trimBeg = br->uppermostRow();
size_t trimEnd = prob_.qrylen_ - prob_.row_ - 1;
assert_leq(trimBeg, prob_.qrylen_);
assert_leq(trimEnd, prob_.qrylen_);
TRefOff refoff = off + prob_.refoff_ + prob_.rect_->refl;
......
......@@ -930,7 +930,7 @@ void RedundantAlns::add(const AlnRes& res) {
assert(!cells_.empty());
TRefOff left = res.refoff(), right;
const size_t len = res.readExtentRows();
const size_t alignmentStart = res.trimmedLeft(true);
const size_t alignmentStart = res.trimmedLeft(true);
if(!res.fw()) {
const_cast<AlnRes&>(res).invertEdits();
}
......@@ -981,7 +981,7 @@ bool RedundantAlns::overlap(const AlnRes& res) {
assert(!cells_.empty());
TRefOff left = res.refoff(), right;
const size_t len = res.readExtentRows();
const size_t alignmentStart = res.trimmedLeft(true);
const size_t alignmentStart = res.trimmedLeft(true);
if(!res.fw()) {
const_cast<AlnRes&>(res).invertEdits();
}
......@@ -1050,11 +1050,11 @@ void AlnSetSumm::init(
{
assert(rd1 != NULL || rd2 != NULL);
assert((rs1 == NULL) == (rs2 == NULL));
AlnScore best[2], secbest[2], bestPaired, secbestPaired;
AlnScore best[2], bestPaired;
size_t szs[2];
best[0].invalidate(); secbest[0].invalidate();
best[1].invalidate(); secbest[1].invalidate();
bestPaired.invalidate(); secbestPaired.invalidate();
best[0].invalidate();
best[1].invalidate();
bestPaired.invalidate();
bool paired = (rs1 != NULL && rs2 != NULL);
szs[0] = szs[1] = 0;
// Set bestPaired and secbestPaired
......@@ -1063,20 +1063,6 @@ void AlnSetSumm::init(
assert_eq(rs1->size(), rs2->size());
szs[0] = szs[1] = rs1->size();
assert_gt(szs[0], 0);
for(size_t i = 0; i < rs1->size(); i++) {
// Combine mate scores into a concordant alignment score by
// summing them
AlnScore sc = (*rs1)[i].score() + (*rs2)[i].score();
if(sc > bestPaired) {
secbestPaired = bestPaired;
bestPaired = sc;
assert(VALID_AL_SCORE(bestPaired));
} else if(sc > secbestPaired) {
secbestPaired = sc;
assert(VALID_AL_SCORE(bestPaired));
assert(VALID_AL_SCORE(secbestPaired));
}
}
}
// Set best[] and secbest[]
for(int j = 0; j < 2; j++) {
......@@ -1085,27 +1071,9 @@ void AlnSetSumm::init(
continue;
}
szs[j] = rs->size();
for(size_t i = 0; i < rs->size(); i++) {
AlnScore sc = (*rs)[i].score();
if(sc > best[j]) {
secbest[j] = best[j];
best[j] = sc;
assert(VALID_AL_SCORE(best[j]));
} else if(sc > secbest[j]) {
secbest[j] = sc;
assert(VALID_AL_SCORE(best[j]));
assert(VALID_AL_SCORE(secbest[j]));
}
}
}
if(szs[0] > 0 || szs[1] > 0) {
init(
best[0],
secbest[0],
best[1],
secbest[1],
bestPaired,
secbestPaired,
(szs[0] == 0) ? 0 : (szs[0] - 1),
(szs[1] == 0) ? 0 : (szs[1] - 1),
paired,
......@@ -1130,7 +1098,7 @@ bool AlnFlags::printYF(BTString& o, bool first) const {
else if(!nfilt_ ) flag = "NS";
else if(!scfilt_ ) flag = "SC";
else if(!qcfilt_ ) flag = "QC";
if(flag > 0) {
if(flag[0] != '\0') {
if(!first) o.append('\t');
o.append("YF:Z:");
o.append(flag);
......
This diff is collapsed.
......@@ -379,7 +379,9 @@ pair<int, int> SeedAligner::instantiateSeeds(
bool norc, // don't align revcomp read
AlignmentCacheIface& cache,// holds some seed hits from previous reads
SeedResults& sr, // holds all the seed hits
SeedSearchMetrics& met) // metrics
SeedSearchMetrics& met, // metrics
pair<int, int>& instFw,
pair<int, int>& instRc)
{
assert(!seeds.empty());
assert_gt(read.length(), 0);
......@@ -445,6 +447,7 @@ pair<int, int> SeedAligner::instantiateSeeds(
{
// Can we fill this seed hit in from the cache?
ret.first++;
if(fwi == 0) { instFw.first++; } else { instRc.first++; }
} else {
// Seed may fail to instantiate if there are Ns
// that prevent it from matching
......
......@@ -670,10 +670,12 @@ public:
numRanges_ += qv.numRanges();
if(qv.numRanges() > 0) {
nonzTot_++;
if(qv.numRanges() == 1 and qv.numElts() == 1) {
if(qv.numRanges() == 1 && qv.numElts() == 1) {
uniTot_++;
uniTotS_[seedFw ? 0 : 1]++;
} else {
repTot_++;
repTotS_[seedFw ? 0 : 1]++;
}
}
assert(repOk(&ac));
......@@ -729,8 +731,8 @@ public:
seqFw_.clear();
seqRc_.clear();
nonzTot_ = 0;
uniTot_ = 0;
repTot_ = 0;
uniTot_ = uniTotS_[0] = uniTotS_[1] = 0;
repTot_ = repTotS_[0] = repTotS_[1] = 0;
nonzFw_ = 0;
nonzRc_ = 0;
numOffs_ = 0;
......@@ -827,11 +829,25 @@ public:
}
/**
* Return fraction of seeds that align repetitively.
* Return fraction of seeds that aligned uniquely on the given strand.
*/
size_t numUniqueSeedsStrand(bool fw) const {
return uniTotS_[fw ? 0 : 1];
}
/**
* Return fraction of seeds that align repetitively on the given strand.
*/
size_t numRepeatSeeds() const {
return repTot_;
}
/**
* Return fraction of seeds that align repetitively.
*/
size_t numRepeatSeedsStrand(bool fw) const {
return repTotS_[fw ? 0 : 1];
}
/**
* Return median of all the non-zero per-seed # hits
......@@ -1329,7 +1345,9 @@ protected:
EList<bool> sortedRc_; // true iff rc QVal was sorted/ranked
size_t nonzTot_; // # offsets with non-zero size
size_t uniTot_; // # offsets unique hit
size_t uniTotS_[2]; // # offsets unique hit on each strand
size_t repTot_; // # offsets repetitive hit
size_t repTotS_[2]; // # offsets repetitive hit on each strand
size_t nonzFw_; // # offsets into fw read with non-0 size
size_t nonzRc_; // # offsets into rc read with non-0 size
size_t numRanges_; // # ranges added
......@@ -1473,7 +1491,9 @@ public:
bool norc, // don't align revcomp read
AlignmentCacheIface& cache, // holds some seed hits from previous reads
SeedResults& sr, // holds all the seed hits
SeedSearchMetrics& met); // metrics
SeedSearchMetrics& met, // metrics
std::pair<int, int>& instFw,
std::pair<int, int>& instRc);
/**
* Iterate through the seeds that cover the read and initiate a
......
......@@ -2235,6 +2235,8 @@ public:
}
AlnScore asc(
-dr.sink().bestPenalty(), // numeric score
dr.query().length() - edits.size(),
(int)edits.size(), // # edits
ns, // # Ns
ngap); // # gaps
rs.init(
......
......@@ -431,7 +431,6 @@ int SwAligner::ungappedAlign(
// Got a result! Fill in the rest of the result object.
}
// Now fill in the edits
res.alres.setScore(AlnScore(score, ns, 0));
assert_geq(rowf, rowi);
EList<Edit>& ned = res.alres.ned();
size_t refns = 0;
......@@ -450,6 +449,9 @@ int SwAligner::ungappedAlign(
}
}
}
res.alres.setScore(AlnScore(score,
(int)(rd.length() - ned.size()),
(int)ned.size(), ns, 0));
assert(Edit::repOk(ned, rd));
bool fw = coord.fw();
assert_leq(rowf, len-1);
......@@ -1020,7 +1022,10 @@ bool SwAligner::nextAlignment(
// differences in how they handle marking cells as
// reported-through.
assert(cural_ > 0 || !ret || ret == ret2);
assert(cural_ > 0 || !ret || res.alres == res2.alres);
// TODO: I find that sometimes there is disagreement here
// where the alignments are in the same place with
// identical scores, but one is more soft-trimmed than the other
//assert(cural_ > 0 || !ret || res.alres == res2.alres);
}
if(!checkpointed && sse16succ_) {
SwResult res2;
......
......@@ -1003,7 +1003,9 @@ int SwDriver::extendSeeds(
resEe_.alres.reset();
const EEHit& h = eehits_[i];
assert_leq(h.score, perfectScore);
resEe_.alres.setScore(AlnScore(h.score, h.ns(), 0));
resEe_.alres.setScore(AlnScore(h.score,
(int)(rdlen - h.mms()),
h.mms(), h.ns(), 0));
resEe_.alres.setShape(
refcoord.ref(), // ref id
refcoord.off(), // 0-based ref offset
......@@ -1706,7 +1708,10 @@ int SwDriver::extendSeedsPaired(
resEe_.alres.reset();
const EEHit& h = eehits_[i];
assert_leq(h.score, perfectScore);
resEe_.alres.setScore(AlnScore(h.score, h.ns(), 0));
resEe_.alres.setScore(AlnScore(
h.score,
(int)(rdlen - h.mms()),
h.mms(), h.ns(), 0));
resEe_.alres.setShape(
refcoord.ref(), // ref id
refcoord.off(), // 0-based ref offset
......
......@@ -1853,6 +1853,8 @@ bool SwAligner::backtraceNucleotidesEnd2EndSseI16(
off = col;
assert_lt(col + (size_t)rfi_, (size_t)rff_);
score.gaps_ = gaps;
score.edits_ = (int)ned.size();
score.basesAligned_ = (int)(rdf_ - rdi_ - trimBeg - trimEnd - score.edits_);
res.alres.setScore(score);
res.alres.setShape(
refidx_, // ref id
......
......@@ -1845,6 +1845,8 @@ bool SwAligner::backtraceNucleotidesEnd2EndSseU8(
off = col;
assert_lt(col + (size_t)rfi_, (size_t)rff_);
score.gaps_ = gaps;
score.edits_ = (int)ned.size();
score.basesAligned_ = (int)(rdf_ - rdi_ - trimBeg - trimEnd - score.edits_);
res.alres.setScore(score);
res.alres.setShape(
refidx_, // ref id
......
......@@ -2219,6 +2219,8 @@ bool SwAligner::backtraceNucleotidesLocalSseI16(
off = col;
assert_lt(col + (size_t)rfi_, (size_t)rff_);
score.gaps_ = gaps;
score.edits_ = (int)ned.size();
score.basesAligned_ = (int)(rdf_ - rdi_ - trimBeg - trimEnd - score.edits_);
res.alres.setScore(score);
res.alres.setShape(
refidx_, // ref id
......
......@@ -2212,6 +2212,8 @@ bool SwAligner::backtraceNucleotidesLocalSseU8(
off = col;
assert_lt(col + (size_t)rfi_, (size_t)rff_);
score.gaps_ = gaps;
score.edits_ = (int)ned.size();
score.basesAligned_ = (int)(rdf_ - rdi_ - trimBeg - trimEnd - score.edits_);
res.alres.setScore(score);
res.alres.setShape(
refidx_, // ref id
......
This diff is collapsed.
......@@ -1232,9 +1232,22 @@ protected:
EList<size_t>& select, // prioritized list to put results in
const EList<AlnRes>* rs1u, // alignments to select from (mate 1)
const EList<AlnRes>* rs2u, // alignments to select from (mate 2, or NULL)
AlnScore& bestUnchosen1,
AlnScore& bestUnchosen2,
AlnScore& bestUnchosenC,
AlnScore& bestUScore,
AlnScore& bestUDist,
AlnScore& bestP1Score,
AlnScore& bestP1Dist,
AlnScore& bestP2Score,
AlnScore& bestP2Dist,
AlnScore& bestCScore,
AlnScore& bestCDist,
AlnScore& bestUnchosenUScore,
AlnScore& bestUnchosenUDist,
AlnScore& bestUnchosenP1Score,
AlnScore& bestUnchosenP1Dist,
AlnScore& bestUnchosenP2Score,
AlnScore& bestUnchosenP2Dist,
AlnScore& bestUnchosenCScore,
AlnScore& bestUnchosenCDist,
RandomSource& rnd)
const;
......
......@@ -550,8 +550,8 @@ if(defined($cap_out)) {
my $fl = substr($_, $tab1_i, $tab2_i - $tab1_i);
my $unal = ($fl & 4) != 0;
$filt = 1 if $no_unal && $unal;
if($passthru && ($fl & 256) == 0) {
if(scalar(keys %read_fhs) == 0) {
if($passthru) {
if(scalar(keys %read_fhs) == 0 || ($fl & 256) != 0) {
# Next line is read with some whitespace escaped
my $l = <BT>;
} else {
......
......@@ -19,23 +19,10 @@
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include "tokenize.h"
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include <poll.h>
#include <vector>
#include <iterator>
#include <algorithm>
#include <readline/readline.h>
#include <readline/history.h>
#include "ds.h"
using namespace std;
......@@ -52,237 +39,23 @@ extern "C" {
* per line, and will dispatch each batch of arguments one at a time to
* bowtie.
*/
static volatile sig_atomic_t done = false;
static const char *options[] = {
"--al", "--al-conc", "--dpad", "--end-to-end",
"--fast", "--fast-local", "--fr", "--gbar",
"--ignore-quals", "--int-quals", "--local", "--ma",
"--met", "--met-file", "--met-stderr", "--mm",
"--mp", "--n-ceil", "--no-1mm-upfront", "--no-contain",
"--no-discordant", "--no-dovetail", "--no-head", "--no-mixed",
"--no-overlap", "--no-sq", "--no-unal", "--nofw",
"--non-deterministic", "--norc", "--np", "--omit-sec-seq",
"--phred33", "--phred64", "--qc-filter", "--qseq",
"--quiet", "--rdg", "--reorder", "--rfg",
"--rg", "--rg-id", "--score-min", "--seed",
"--sensitive", "--sensitive-local", "--un", "--un-conc",
"--un-gz", "--version", "--very-fast", "--very-fast-local",
"--very-sensitive", "--very-sensitive-local", "-3", "-5",
"-D", "-I", "-L", "-N",
"-R", "-X", "-a", "-c",
"-f", "-h", "-i", "-k",
"-p", "-q", "-r", "-s",
"-t", "-u", "-1", "-2",
"-S", "-U", "--all", "--ff",
"--help", "--maxins", "--minins", "--rf",
"--skip", "--threads", "--time", "--trim3",
"--trim5", "--upto", NULL
};
static bool isdirectory(const char *path) {
struct stat statbuf;
if(stat(path, &statbuf) != 0) {
perror("stat");
return true;
}
return S_ISDIR(statbuf.st_mode);
}
static char *optgen(const char *text, int state) {
static int list_index, len;
const char *name = NULL;
if (!state) {
list_index = 0;
len = strlen(text);
}
name = rl_filename_completion_function(text, state);
if (name != NULL) {
rl_completion_append_character = isdirectory(name) ? '/': ' ';
return strdup(name);
}
if (text[0] == '-') {
while ((name = options[list_index++])) {
if (strncmp(name, text, len) == 0) {
return strdup(name);
}
}
}
return NULL;
}
static char **optcomplete(const char *text, int start, int end) {
rl_attempted_completion_over = 1;
return rl_completion_matches(text, optgen);
}
static void rlinit() {
rl_attempted_completion_function = optcomplete;
}
static void handler(int sig) {
done = true;
}
static int _getline(istream *in, char *buf, size_t len) {
if (in == &cin) {
char *input = readline("bowtie2> ");
if (!input) {
buf[0] = '\0';
}
else {
strncpy(buf, input, len-1);
add_history(buf);
free(input);
}
}
else {
in->getline(buf, len-1);
if (!in->good())
buf[0] = '\0';
}
buf[len-1] = '\0';
return strlen(buf);
}
static int createfifo(vector<char *>& v) {
const char *pattern = "/tmp/btfifo.XX";
char *fn = (char *)malloc(strlen(pattern)+1);
memset(fn, 0, strlen(pattern)+1);
strcpy(fn, pattern);
mktemp(fn);
if (mkfifo(fn, S_IRUSR | S_IWUSR) == -1) {
perror("mkfifo");
return 1;
}
v.push_back(fn);
return 0;
}
void printargs(const char **args, size_t size) {
copy(args, args+size, ostream_iterator<string>(cout, " "));
cout << endl;
}
bool called_from_wrapper(int argc, const char **argv) {
if (argc > 2 && strcmp(argv[1], "--wrapper") == 0
&& strcmp(argv[2], "basic-0") == 0)
return true;
return false;
}
int main(int argc, const char **argv) {
int offset = called_from_wrapper(argc, argv) ? 3 : 1;
if(argc > offset + 1 && strcmp(argv[offset], "-A") == 0) {
const char *file = argv[offset+1];
if(argc > 2 && strcmp(argv[1], "-A") == 0) {
const char *file = argv[2];
ifstream in;
istream *inptr = &in;
if (strcmp(file, "-") == 0) {
inptr = &cin;
}
else {
in.open(file);
}
in.open(file);
char buf[4096];
int lastret = -1;
rlinit();
while(_getline(inptr, buf, 4096)) {
done = false;
vector<string> args;
while(in.getline(buf, 4095)) {
EList<string> args;
args.push_back(string(argv[0]));
if (offset > 1) {
args.push_back(string(argv[1]));
args.push_back(string(argv[2]));
}
tokenize(buf, " \t", args);
const char **myargs = (const char**)malloc(sizeof(char*)*args.size());
vector<char *> fifonames;
int sam_outfile_pos = -1;
for(size_t i = 0; i < args.size(); i++) {
if (args[i] == "_") {
if (i > 0 && args[i-1] == "-S") {
sam_outfile_pos = i;
}
else {
createfifo(fifonames);
args[i] = fifonames.back();
}
}
myargs[i] = args[i].c_str();
}
if(args.size() == 1) continue;
if (fifonames.size() > 0) {
struct sigaction sa;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sa.sa_handler = handler;
if (sigaction(SIGINT, &sa, NULL) == -1
|| signal(SIGPIPE, SIG_IGN) == SIG_ERR) {
perror("sigaction");
exit(EXIT_FAILURE);
}
struct pollfd *pollfds = (struct pollfd *)calloc(fifonames.size(), sizeof(struct pollfd));
if (pollfds == NULL) {
perror("calloc");
exit(EXIT_FAILURE);
}
for (size_t i = 0; i < fifonames.size(); i++) {
pollfds[i].fd = open(fifonames[i], O_NONBLOCK | O_EXCL);
pollfds[i].events = POLLIN;
}
printargs(myargs, args.size());
for (int count = 0;; count++) {
size_t r = poll(pollfds, fifonames.size(), -1);
// wait until all fifos are ready
if (r != fifonames.size()) {
if (done)
break;
continue;
}
if (sam_outfile_pos >= 0) {
ostringstream os;
os << "out" << getpid() << "_" << setfill('0') << setw(3) << count << ".sam";
myargs[sam_outfile_pos] = os.str().c_str();
printargs(myargs, args.size());
}
lastret = bowtie((int)args.size(), myargs);
// replace the args shuffled by getopt
for (size_t i = 0; i < args.size(); i++) {
myargs[i] = args[i].c_str();
}
}
for (size_t i = 0; i < fifonames.size(); i++) {
if (close(pollfds[i].fd))
perror("close");
if (remove(fifonames[i]))
perror("remove");
free(fifonames[i]);
}
free(pollfds);
}
else {
lastret = bowtie((int)args.size(), myargs);
}
lastret = bowtie((int)args.size(), myargs);
free(myargs);
}
if(lastret == -1) {
......
......@@ -660,7 +660,7 @@ static void printUsage(ostream& out) {
tool_name = "bowtie2";
}
out << "Usage: " << endl
<< " " << tool_name.c_str() << " [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>]" << endl
<< " " << tool_name.c_str() << " [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r> | --interleaved <i>} [-S <sam>]" << endl
<< endl
<< " <bt2-idx> Index filename prefix (minus trailing .X." + gEbwt_ext + ")." << endl
<< " NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible." << endl
......@@ -676,6 +676,10 @@ static void printUsage(ostream& out) {
if(wrapper == "basic-0") {
out << " Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2)." << endl;
}
out << " <i> Files with interleaved paired-end FASTQ reads" << endl;
if(wrapper == "basic-0") {
out << " Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2)." << endl;
}
out << " <sam> File for SAM output (default: stdout)" << endl
<< endl
<< " <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be" << endl
......@@ -686,7 +690,6 @@ static void printUsage(ostream& out) {
<< endl
<< " Input:" << endl
<< " -q query input files are FASTQ .fq/.fastq (default)" << endl
<< " --interleaved query input files are interleaved paired-end FASTQ reads" << endl
<< " --tab5 query input files are TAB5 .tab5" << endl
<< " --tab6 query input files are TAB6 .tab6" << endl
<< " --qseq query input files are in Illumina's qseq format" << endl
......@@ -767,10 +770,10 @@ static void printUsage(ostream& out) {
//}
out << " -t/--time print wall-clock time taken by search phases" << endl;
if(wrapper == "basic-0") {
out << " --un <path> write unpaired reads that didn't align to <path>" << endl
<< " --al <path> write unpaired reads that aligned at least once to <path>" << endl
<< " --un-conc <path> write pairs that didn't align concordantly to <path>" << endl
<< " --al-conc <path> write pairs that aligned concordantly at least once to <path>" << endl
out << " --un <path> write unpaired reads that didn't align to <path>" << endl
<< " --al <path> write unpaired reads that aligned at least once to <path>" << endl
<< " --un-conc <path> write pairs that didn't align concordantly to <path>" << endl
<< " --al-conc <path> write pairs that aligned concordantly at least once to <path>" << endl
<< " (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g." << endl