Skip to content

Commit 6f2c7cf

Browse files
committed
BayesTyper (v1.5)
1 parent 62888d6 commit 6f2c7cf

20 files changed

+402
-243
lines changed

CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ SET(BUILD_STATIC 0 CACHE BOOL "Build static")
2626

2727
if(${BUILD_STATIC} EQUAL 0)
2828

29-
SET(CMAKE_CXX_FLAGS "--std=c++11 -lpthread -g -O3 -DBT_KMER_SIZE='${KMER_SIZE}' -DBT_VERSION='\"v1.5 beta ${GIT_LAST_COMMIT_HASH}\"'")
29+
SET(CMAKE_CXX_FLAGS "--std=c++11 -lpthread -g -O3 -DBT_KMER_SIZE='${KMER_SIZE}' -DBT_VERSION='\"v1.5 ${GIT_LAST_COMMIT_HASH}\"'")
3030

3131
else(${BUILD_STATIC} EQUAL 0)
3232

3333
message(STATUS "Building BayesTyper static")
3434

35-
SET(CMAKE_CXX_FLAGS "--std=c++11 -pthread -O3 -static -static-libgcc -static-libstdc++ -DBT_KMER_SIZE='${KMER_SIZE}' -DBT_VERSION='\"v1.5 beta\"'")
35+
SET(CMAKE_CXX_FLAGS "--std=c++11 -pthread -O3 -static -static-libgcc -static-libstdc++ -DBT_KMER_SIZE='${KMER_SIZE}' -DBT_VERSION='\"v1.5\"'")
3636
SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--whole-archive -lpthread -Wl,--no-whole-archive")
3737

3838
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

include/bayesTyper/GenotypeWriter.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class GenotypeWriter {
6262
GenotypeWriter(const string &, const ushort, const vector<Sample> &, const Chromosomes &, const Filters &);
6363

6464
void addGenotypes(vector<Genotypes *> *);
65-
void finalise(const string &, const Chromosomes &, const string &, const OptionsContainer &, const Filters &);
65+
uint finalise(const string &, const Chromosomes &, const string &, const OptionsContainer &, const Filters &);
6666

6767
private:
6868

include/bayesTyper/InferenceEngine.hpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,10 @@ class InferenceEngine {
5858

5959
InferenceEngine(const vector<Sample> &, const ChromosomePloidy &, const OptionsContainer &);
6060

61-
void estimateNoiseParameters(CountDistribution *, InferenceUnit *, KmerCountsHash *, const string &);
62-
void genotypeVariantClusterGroups(InferenceUnit *, KmerCountsHash *, const CountDistribution &, const Filters & filters, GenotypeWriter *);
61+
void estimateNoise(CountDistribution *, InferenceUnit *, KmerCountsHash *, const string &);
62+
void estimateGenotypes(InferenceUnit *, KmerCountsHash *, const CountDistribution &, const Filters & filters, GenotypeWriter *);
63+
void estimateNoiseAndGenotypes(InferenceUnit *, CountDistribution *, KmerCountsHash *, const Filters &, GenotypeWriter *, const string &);
64+
6365

6466
private:
6567

@@ -74,7 +76,6 @@ class InferenceEngine {
7476
const ushort num_gibbs_chains;
7577
const float kmer_subsampling_rate;
7678
const uint max_haplotype_variant_kmers;
77-
const bool min_cover_haplotype_init;
7879

7980
struct VariantClusterGroupBatch {
8081

@@ -88,11 +89,12 @@ class InferenceEngine {
8889
VariantClusterGroupBatch(const uint first_variant_cluster_group_idx_in, const uint num_variants_in, const vector<VariantClusterGroup*>::iterator start_it_in, const vector<VariantClusterGroup*>::iterator end_it_in) : first_variant_cluster_group_idx(first_variant_cluster_group_idx_in), num_variants(num_variants_in), start_it(start_it_in), end_it(end_it_in) {}
8990
};
9091

91-
void initNoiseEstimationGroupsCallback(vector<VariantClusterGroup *> *, const vector<uint> &, KmerCountsHash *, const ushort, const ushort, const uint);
92-
void sampleNoiseCountsCallback(vector<VariantClusterGroup *> *, const vector<uint> &, CountAllocation *, mutex *, const CountDistribution &, const ushort, const uint);
93-
void resetNoiseEstimationGroupsCallback(vector<VariantClusterGroup *> *, const vector<uint> &, const ushort, const uint);
92+
void initGenotypersCallback(vector<VariantClusterGroup *> *, const vector<uint> &, const uint, KmerCountsHash *, const ushort, const ushort);
93+
void sampleGenotypesCallback(vector<VariantClusterGroup *> *, const vector<uint> &, const uint, const CountDistribution &, const bool, CountAllocation *, mutex *, const ushort);
94+
void resetGroupsCallback(vector<VariantClusterGroup *> *, const vector<uint> &, const uint, const ushort);
95+
void collectGenotypesCallback(vector<VariantClusterGroup *> *, const vector<uint> &, const uint, const Filters & filters, GenotypeWriter *, const ushort);
9496

95-
void genotypeVariantClusterGroupsCallback(ProducerConsumerQueue<VariantClusterGroupBatch> *, KmerCountsHash *, const CountDistribution &, const Filters & filters, GenotypeWriter *, uint *, mutex *);
97+
void estimateGenotypesCallback(ProducerConsumerQueue<VariantClusterGroupBatch> *, KmerCountsHash *, const CountDistribution &, const Filters & filters, GenotypeWriter *, uint *, mutex *);
9698
};
9799

98100
#endif

include/bayesTyper/KmerCounter.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ class KmerCounter {
5757
KmerCounter(const vector<Sample> &, const OptionsContainer &);
5858

5959
void findVariantClusterPaths(InferenceUnit *, const ushort);
60-
void countPathMultigroupKmers(BooleanKmerHash *, ThreadedKmerBloom<Utils::kmer_size> *, InferenceUnit *);
61-
void countInterclusterParameterKmers(BooleanKmerHash *, const vector<VariantFileParser::InterClusterRegion> &, const Chromosomes &, const ThreadedKmerBloom<Utils::kmer_size> &, const float);
60+
void countPathMultigroupKmers(KmerHash<bool> *, ThreadedKmerBloom<Utils::kmer_size> *, InferenceUnit *);
61+
void countInterclusterParameterKmers(KmerHash<bool> *, const vector<VariantFileParser::InterClusterRegion> &, const Chromosomes &, const ThreadedKmerBloom<Utils::kmer_size> &, const float);
6262

6363
void countPathKmers(ThreadedKmerBloom<Utils::kmer_size> *, InferenceUnit *);
6464
void countInterclusterKmers(KmerCountsHash *, ThreadedKmerBloom<Utils::kmer_size> *, const string &, const Chromosomes &, const ChromosomePloidy &);
@@ -85,8 +85,8 @@ class KmerCounter {
8585
};
8686

8787
void findVariantClusterPathsCallback(vector<VariantClusterGroup *> *, KmerBloom<Utils::kmer_size> *, const ushort, const ushort, const ushort);
88-
void countPathMultigroupKmersCallback(BooleanKmerHash *, ThreadedKmerBloom<Utils::kmer_size> *, vector<VariantClusterGroup *> *, mutex *, ulong *, const ushort);
89-
void countInterclusterParameterKmersCallback(BooleanKmerHash *, const vector<VariantFileParser::InterClusterRegion> &, const Chromosomes &, const ThreadedKmerBloom<Utils::kmer_size> &, const float, const ushort);
88+
void countPathMultigroupKmersCallback(KmerHash<bool> *, ThreadedKmerBloom<Utils::kmer_size> *, vector<VariantClusterGroup *> *, mutex *, ulong *, const ushort);
89+
void countInterclusterParameterKmersCallback(KmerHash<bool> *, const vector<VariantFileParser::InterClusterRegion> &, const Chromosomes &, const ThreadedKmerBloom<Utils::kmer_size> &, const float, const ushort);
9090

9191
void countPathKmersCallback(ThreadedKmerBloom<Utils::kmer_size> *, vector<VariantClusterGroup *> *, const ushort);
9292
void countInterclusterKmersCallback(KmerCountsHash *, ThreadedKmerBloom<Utils::kmer_size> *, const vector<VariantFileParser::InterClusterRegion> &, const Chromosomes &, const ChromosomePloidy &, const ushort);

include/bayesTyper/KmerHash.hpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -46,27 +46,28 @@ THE SOFTWARE.
4646

4747
using namespace std;
4848

49-
class BooleanKmerHash {
49+
template<class T>
50+
class KmerHash {
5051

5152
private:
5253

53-
ThreadedHybridHash<bool, Utils::kmer_size * 2> * _hash;
54+
ThreadedHybridHash<T, Utils::kmer_size * 2> * _hash;
5455

5556
public:
5657

57-
BooleanKmerHash(const ulong, const ushort);
58-
~BooleanKmerHash();
58+
KmerHash(const ulong, const ushort);
59+
~KmerHash();
5960

6061
unique_lock<mutex> getKmerLock(const bitset<Utils::kmer_size * 2> &);
61-
pair<bool *, bool> addKmer(const bitset<Utils::kmer_size * 2> &);
62-
bool * findKmer(const bitset<Utils::kmer_size * 2> &);
62+
pair<T *, bool> addKmer(const bitset<Utils::kmer_size * 2> &);
63+
T * findKmer(const bitset<Utils::kmer_size * 2> &);
6364

6465
void shuffle(const uint);
6566
ulong size();
6667

6768
void writeRootSizeDistribution(const string &);
68-
ulong writeKmersToFasta(const string &, const bool, const uint);
69-
ulong addKmersToBloomFilter(KmerBloom<Utils::kmer_size> *, const bool);
69+
ulong writeKmersToFasta(const string &, bool (*)(T), const uint);
70+
ulong addKmersToBloomFilter(KmerBloom<Utils::kmer_size> *, bool (*)(T));
7071
};
7172

7273
class KmerCountsHash {

include/bayesTyper/VariantClusterGenotyper.hpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ class VariantClusterGenotyper {
6969
VariantClusterGenotyper(VariantClusterGraph *, KmerCountsHash *, const vector<Sample> &, const uint, const uchar);
7070
~VariantClusterGenotyper();
7171

72-
void reset(const float, const uint, const bool);
72+
void reset(const float, const uint);
73+
void clearCache();
7374

7475
void sampleDiplotypes(const CountDistribution &, const vector<VariantClusterHaplotypes::NestedVariantClusterInfo> &, const bool);
7576
void getNoiseCounts(CountAllocation *, const CountDistribution &);
@@ -101,9 +102,6 @@ class VariantClusterGenotyper {
101102

102103
VariantClusterHaplotypes variant_cluster_haplotypes;
103104

104-
SparsityEstimator sparsity_estimator;
105-
Utils::RowVectorXbool non_zero_kmer_counts;
106-
107105
vector<VariantInfo> variant_cluster_info;
108106
vector<vector<AlleleKmerStats> > allele_kmer_stats;
109107

include/bayesTyper/VariantClusterGroup.hpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,8 @@ class VariantClusterGroup {
122122

123123
bool hasExcludedKmers() const;
124124

125-
void initGenotyper(KmerCountsHash *, const vector<Sample> &, const uint, const uchar, const float, const uint, const bool);
126-
127-
void resetGenotyper(const float, const uint, const bool);
125+
void initGenotyper(KmerCountsHash *, const vector<Sample> &, const uint, const uchar, const float, const uint);
126+
void clearGenotyperCache();
128127
void resetGroup();
129128

130129
void shuffleBranchOrdering(const uint);

include/bayesTyperTools/ConvertAllele.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ THE SOFTWARE.
3838

3939
namespace ConvertAllele {
4040

41-
void convertAllele(const string &, const string &, const string &, const string &, const bool);
41+
void convertAllele(const string &, const string &, const string &, const string &, const string &, const bool, const bool);
4242
}
4343

4444
#endif

src/bayesTyper/CountDistribution.cpp

+31-33
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,11 @@ THE SOFTWARE.
4040
#include "Combinator.hpp"
4141

4242

43-
static const uint min_nb_kmer_count = 1000;
43+
static const uint max_nb_kmer_multiplicity = 32;
44+
static const uint min_nb_kmer_count = 10000;
4445

4546
static const uchar num_genomic_rate_gc_bias_bins = 1;
46-
static const uchar max_multiplicity = Utils::uchar_overflow;
47+
static const uchar max_kmer_multiplicity = Utils::uchar_overflow;
4748
static const uchar max_kmer_count = Utils::uchar_overflow;
4849

4950

@@ -54,15 +55,15 @@ CountDistribution::CountDistribution(const vector<Sample> & samples_in, const Op
5455
genomic_count_distributions = vector<vector<NegativeBinomialDistribution> >(samples.size(), vector<NegativeBinomialDistribution>(num_genomic_rate_gc_bias_bins));
5556

5657
noise_rates = vector<double>(samples.size(), 0);
57-
genomic_count_log_pmf_cache = vector<vector<vector<vector<double> > > >(samples.size(), vector<vector<vector<double> > >(num_genomic_rate_gc_bias_bins, vector<vector<double> >(max_multiplicity + 1, vector<double>(max_kmer_count + 1))));
58+
genomic_count_log_pmf_cache = vector<vector<vector<vector<double> > > >(samples.size(), vector<vector<vector<double> > >(num_genomic_rate_gc_bias_bins, vector<vector<double> >(max_kmer_multiplicity + 1, vector<double>(max_kmer_count + 1))));
5859
noise_count_log_pmf_cache = vector<vector<double> >(samples.size(), vector<double>(max_kmer_count + 1));
5960

6061
resetNoiseRates();
6162
updateGenomicCache();
6263
}
6364

6465

65-
void CountDistribution::setGenomicCountDistributions(const vector<vector<vector<KmerStats> > > & intercluster_diploid_kmer_stats, const string & output_prefix) {
66+
void CountDistribution::setGenomicCountDistributions(const vector<vector<vector<KmerStats> > > & intercluster_kmer_stats, const string & output_prefix) {
6667

6768
cout << "[" << Utils::getLocalTime() << "] Estimating genomic haploid kmer count distribution(s) from parameter kmers ...\n" << endl;
6869

@@ -76,61 +77,58 @@ void CountDistribution::setGenomicCountDistributions(const vector<vector<vector<
7677

7778
genomic_outfile << "Sample\tMean\tVariance" << endl;
7879

79-
assert(intercluster_diploid_kmer_stats.size() == samples.size());
80-
assert(intercluster_diploid_kmer_stats.size() == genomic_count_distributions.size());
80+
assert(intercluster_kmer_stats.size() == samples.size());
81+
assert(intercluster_kmer_stats.size() == genomic_count_distributions.size());
8182

82-
for (ushort sample_idx = 0; sample_idx < samples.size(); sample_idx++) {
83+
assert(num_genomic_rate_gc_bias_bins == 1);
84+
assert(max_nb_kmer_multiplicity <= Utils::uchar_overflow);
8385

84-
assert(num_genomic_rate_gc_bias_bins == 1);
86+
for (ushort sample_idx = 0; sample_idx < samples.size(); sample_idx++) {
8587

86-
assert(intercluster_diploid_kmer_stats.at(sample_idx).size() == num_genomic_rate_gc_bias_bins);
87-
assert(intercluster_diploid_kmer_stats.at(sample_idx).size() == genomic_count_distributions.at(sample_idx).size());
88+
assert(intercluster_kmer_stats.at(sample_idx).size() == num_genomic_rate_gc_bias_bins);
89+
assert(intercluster_kmer_stats.at(sample_idx).size() == genomic_count_distributions.at(sample_idx).size());
8890

8991
for (ushort bias_idx = 0; bias_idx < num_genomic_rate_gc_bias_bins; bias_idx++) {
9092

91-
assert(intercluster_diploid_kmer_stats.at(sample_idx).at(bias_idx).size() == static_cast<uint>(Utils::Ploidy::PLOIDY_SIZE));
93+
assert(intercluster_kmer_stats.at(sample_idx).at(bias_idx).size() == (Utils::uchar_overflow + 1));
9294

93-
uint max_kmer_count = 0;
94-
ushort max_kmer_multiplicity = 0;
95+
uint max_genomic_kmer_count = 0;
96+
ushort max_genomic_kmer_multiplicity = 0;
9597

96-
for (ushort kmer_multiplicity = 1; kmer_multiplicity < static_cast<uint>(Utils::Ploidy::PLOIDY_SIZE); kmer_multiplicity++) {
98+
for (ushort kmer_genomic_multiplicity = 1; kmer_genomic_multiplicity <= max_nb_kmer_multiplicity; kmer_genomic_multiplicity++) {
9799

98-
auto kmer_count = intercluster_diploid_kmer_stats.at(sample_idx).at(bias_idx).at(kmer_multiplicity).getCount();
100+
auto kmer_genomic_count = intercluster_kmer_stats.at(sample_idx).at(bias_idx).at(kmer_genomic_multiplicity).getCount();
99101

100-
if (kmer_count > max_kmer_count) {
102+
if (kmer_genomic_count > max_genomic_kmer_count) {
101103

102-
max_kmer_count = kmer_count;
103-
max_kmer_multiplicity = kmer_multiplicity;
104+
max_genomic_kmer_count = kmer_genomic_count;
105+
max_genomic_kmer_multiplicity = kmer_genomic_multiplicity;
104106
}
105107
}
106108

107-
if (max_kmer_count < min_nb_kmer_count) {
108-
109-
cerr << "\nERROR: Insufficient number of kmers used for negative binomial parameters estimation for sample " << samples.at(sample_idx).name << " (" << max_kmer_count << " < " << min_nb_kmer_count << "); the genome used is likely too small and/or too repetitive\n" << endl;
110-
exit(1);
111-
112-
} else if (max_kmer_count < (min_nb_kmer_count * 10)) {
109+
if (max_genomic_kmer_count < min_nb_kmer_count) {
113110

114-
cout << "\nWARNING: Low number of kmers used for negative binomial parameters estimation for sample " << samples.at(sample_idx).name << " (" << max_kmer_count << " < " << min_nb_kmer_count * 10 << "); mean and variance estimate might be biased\n" << endl;
111+
cout << "\nWARNING: Low number of kmers used for negative binomial parameters estimation for sample " << samples.at(sample_idx).name << " (" << max_genomic_kmer_count << " < " << min_nb_kmer_count << ")" << endl;
112+
cout << "WARNING: The mean and variance estimates might be biased due to the genome used being too small, too variant dense and/or too repetitive\n" << endl;
115113
}
116114

117-
assert(max_kmer_multiplicity > 0);
115+
assert(max_genomic_kmer_multiplicity > 0);
118116

119-
auto kmer_mean = intercluster_diploid_kmer_stats.at(sample_idx).at(bias_idx).at(max_kmer_multiplicity).getMean();
117+
auto kmer_mean = intercluster_kmer_stats.at(sample_idx).at(bias_idx).at(max_genomic_kmer_multiplicity).getMean();
120118
assert(kmer_mean.second);
121119

122-
auto kmer_var = intercluster_diploid_kmer_stats.at(sample_idx).at(bias_idx).at(max_kmer_multiplicity).getVariance();
120+
auto kmer_var = intercluster_kmer_stats.at(sample_idx).at(bias_idx).at(max_genomic_kmer_multiplicity).getVariance();
123121
assert(kmer_var.second);
124122

125123
auto nb_para = NegativeBinomialDistribution::momentsToParameters(kmer_mean.first, kmer_var.first);
126-
nb_para.second /= max_kmer_multiplicity;
124+
nb_para.second /= max_genomic_kmer_multiplicity;
127125

128126
genomic_count_distributions.at(sample_idx).at(bias_idx).setParameters(nb_para);
129127

130128
auto nb_mean = genomic_count_distributions.at(sample_idx).at(bias_idx).mean();
131129
auto nb_var = genomic_count_distributions.at(sample_idx).at(bias_idx).var();
132130

133-
cout << "[" << Utils::getLocalTime() << "] Estimated negative binomial (mean = " << nb_mean << ", var = " << nb_var << ") for sample " << samples.at(sample_idx).name << " using " << max_kmer_count << " parameter kmers (ploidy = " << max_kmer_multiplicity << ")" << endl;
131+
cout << "[" << Utils::getLocalTime() << "] Estimated negative binomial (mean = " << nb_mean << ", var = " << nb_var << ") for sample " << samples.at(sample_idx).name << " using " << max_genomic_kmer_count << " parameter kmers (multiplicity = " << max_genomic_kmer_multiplicity << ")" << endl;
134132

135133
genomic_outfile << samples.at(sample_idx).name << "\t" << nb_mean << "\t" << nb_var << endl;
136134
}
@@ -139,7 +137,7 @@ void CountDistribution::setGenomicCountDistributions(const vector<vector<vector<
139137
genomic_outfile.close();
140138
updateGenomicCache();
141139

142-
cout << "\n[" << Utils::getLocalTime() << "] Wrote parameters to " << output_prefix << ".txt" << endl;
140+
cout << "\n[" << Utils::getLocalTime() << "] Wrote genomic parameters to " << output_prefix << ".txt" << endl;
143141
}
144142

145143
const vector<vector<NegativeBinomialDistribution> > & CountDistribution::getGenomicCountDistributions() const {
@@ -224,9 +222,9 @@ void CountDistribution::updateGenomicCache() {
224222

225223
for (ushort bias_idx = 0; bias_idx < num_genomic_rate_gc_bias_bins; bias_idx++) {
226224

227-
assert(genomic_count_log_pmf_cache.at(sample_idx).at(bias_idx).size() == static_cast<uint>(max_multiplicity + 1));
225+
assert(genomic_count_log_pmf_cache.at(sample_idx).at(bias_idx).size() == static_cast<uint>(max_kmer_multiplicity + 1));
228226

229-
for (ushort kmer_multiplicity = 0; kmer_multiplicity <= max_multiplicity; kmer_multiplicity++) {
227+
for (ushort kmer_multiplicity = 0; kmer_multiplicity <= max_kmer_multiplicity; kmer_multiplicity++) {
230228

231229
assert(genomic_count_log_pmf_cache.at(sample_idx).at(bias_idx).at(kmer_multiplicity).size() == static_cast<uint>(max_kmer_count + 1));
232230

src/bayesTyper/GenotypeWriter.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ void GenotypeWriter::addGenotypes(vector<Genotypes *> * variant_genotypes) {
349349
genotypes_queue->push(variant_genotypes);
350350
}
351351

352-
void GenotypeWriter::finalise(const string & output_prefix, const Chromosomes & chromosomes, const string & graph_options_header, const OptionsContainer & options_container, const Filters & filters) {
352+
uint GenotypeWriter::finalise(const string & output_prefix, const Chromosomes & chromosomes, const string & graph_options_header, const OptionsContainer & options_container, const Filters & filters) {
353353

354354
genotypes_queue->pushedLast();
355355

@@ -364,7 +364,7 @@ void GenotypeWriter::finalise(const string & output_prefix, const Chromosomes &
364364
assert(!tmp_outfile.is_open());
365365

366366

367-
cout << "[" << Utils::getLocalTime() << "] Sorting genotyped variants ..." << endl;
367+
cout << "\n[" << Utils::getLocalTime() << "] Sorting genotyped variants ..." << endl;
368368

369369
assert(tmp_filename.substr(tmp_filename.size() - 3, 3) == ".gz");
370370

@@ -453,7 +453,7 @@ void GenotypeWriter::finalise(const string & output_prefix, const Chromosomes &
453453

454454
variants_outfile_fstream << generateHeader(options_container.getValue<string>("genome-file"), chromosomes, graph_options_header, options_container.getHeader(), filters);
455455

456-
ulong num_genotyped_variants = 0;
456+
uint num_genotyped_variants = 0;
457457

458458
auto chromosomes_it = chromosomes.cbegin();
459459

@@ -486,7 +486,9 @@ void GenotypeWriter::finalise(const string & output_prefix, const Chromosomes &
486486
variants_outfile_fstream.reset();
487487
assert(!variants_outfile.is_open());
488488

489-
cout << "[" << Utils::getLocalTime() << "] Wrote " << num_genotyped_variants << " genotyped variants to " << genotype_filename << endl;
489+
cout << "[" << Utils::getLocalTime() << "] Wrote genotyped variants to " << genotype_filename << endl;
490+
491+
return num_genotyped_variants;
490492
}
491493

492494
string GenotypeWriter::generateHeader(const string & genome_filename, const Chromosomes & chromosomes, const string & graph_options_header, const string & genotype_options_header, const Filters & filters) {

0 commit comments

Comments
 (0)