Skip to content

Commit 20d9f3d

Browse files
author
Ben Vandervalk
committed
bloom-dbg: steadier and less verbose progress messages
Output separate progress messages for the number of reads processed and the number of bases assembled so far. This ensures that the user sees progress updates at regular intervals. At the same time, increase the step sizes of the progress messages so to keep log files a reasonable size.
1 parent ce3c299 commit 20d9f3d

2 files changed

Lines changed: 51 additions & 32 deletions

File tree

BloomDBG/AssemblyCounters.h

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@ namespace BloomDBG {
1616
{
1717
/** reads consisting entirely of solid k-mers */
1818
size_t solidReads;
19-
size_t allKmersVisited;
20-
size_t allBranchKmersVisited;
21-
size_t nonBranchingReads;
22-
size_t nonBranchingContigs;
19+
/**
20+
* reads consisting entirely of k-mers already
21+
* included in output contigs
22+
*/
23+
size_t visitedReads;
2324
size_t readsProcessed;
2425
size_t basesAssembled;
2526
size_t contigID;
2627

27-
AssemblyCounters() : solidReads(0), allKmersVisited(0),
28-
allBranchKmersVisited(0), nonBranchingReads(0),
29-
nonBranchingContigs(0), readsProcessed(0),
30-
basesAssembled(0), contigID(0) {}
28+
AssemblyCounters() : solidReads(0), visitedReads(0),
29+
readsProcessed(0), basesAssembled(0), contigID(0) {}
3130

3231
/** serialize counters as a TSV table */
3332
friend std::ostream& operator<<(std::ostream& out,

BloomDBG/bloom-dbg.h

Lines changed: 44 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -314,27 +314,23 @@ namespace BloomDBG {
314314
};
315315

316316
/** Print an intermediate progress message during assembly */
317-
void printProgressMessage(AssemblyCounters counters)
317+
void readsProgressMessage(AssemblyCounters counters)
318318
{
319-
#pragma omp critical(cerr)
320319
std::cerr
321320
<< "Processed " << counters.readsProcessed << " reads"
322-
<< ", [solid: " << counters.solidReads
321+
<< ", solid reads: " << counters.solidReads
323322
<< " (" << std::setprecision(3) << (float)100
324-
* counters.solidReads / counters.readsProcessed << "%)"
325-
<< ", all k-mers visited: " << counters.allKmersVisited
323+
* counters.solidReads / counters.readsProcessed << "%)"
324+
<< ", visited reads: " << counters.visitedReads
326325
<< " (" << std::setprecision(3) << (float)100
327-
* counters.allKmersVisited / counters.readsProcessed << "%)"
328-
<< ", all branch k-mers visited: " << counters.allBranchKmersVisited
329-
<< " (" << std::setprecision(3) << (float)100
330-
* counters.allBranchKmersVisited / counters.readsProcessed << "%)"
331-
<< ", non-branching: " << counters.nonBranchingReads
332-
<< " (" << std::setprecision(3) << (float)100
333-
* counters.nonBranchingReads / counters.readsProcessed << "%)"
334-
<< ", non-branching contigs: " << counters.nonBranchingContigs
335-
<< " (" << std::setprecision(3) << (float)100
336-
* counters.nonBranchingContigs / counters.readsProcessed << "%)"
337-
<< "], assembled " << counters.basesAssembled << " bp in "
326+
* counters.visitedReads / counters.readsProcessed << "%)"
327+
<< std::endl;
328+
}
329+
330+
/** Print an intermediate progress message during assembly */
331+
void basesProgressMessage(AssemblyCounters counters)
332+
{
333+
std::cerr << "Assembled " << counters.basesAssembled << " bp in "
338334
<< counters.contigID + 1 << " contigs"
339335
<< std::endl;
340336
}
@@ -793,7 +789,7 @@ namespace BloomDBG {
793789
/* skip reads in previously assembled regions */
794790
if (allKmersInBloom(seq, assembledKmerSet)) {
795791
#pragma omp atomic
796-
counters.allKmersVisited++;
792+
counters.visitedReads++;
797793
return ReadRecord(rec.id, RR_ALL_KMERS_VISITED);
798794
}
799795

@@ -955,8 +951,6 @@ namespace BloomDBG {
955951

956952
/* per-thread I/O buffer (size is in bases) */
957953
const size_t SEQ_BUFFER_SIZE = 1000000;
958-
/* controls frequency of progress messages */
959-
const unsigned PROGRESS_STEP = 1000;
960954

961955
if (params.verbose)
962956
std::cerr << "Trimming branches " << params.trim
@@ -970,6 +964,18 @@ namespace BloomDBG {
970964

971965
KmerHash visitedBranchKmers;
972966

967+
/*
968+
* Print a progress message whenever `READS_PROGRESS_STEP`
969+
* reads have been processed or `BASES_PROGRESS_STEP`
970+
* bases have been assembled. The purpose of using
971+
* two measures of progess is to show steady updates
972+
* throughout the assembly process.
973+
*/
974+
975+
const size_t READS_PROGRESS_STEP = 100000;
976+
const size_t BASES_PROGRESS_STEP = 1000000;
977+
size_t basesProgressLine = BASES_PROGRESS_STEP;
978+
973979
while (true)
974980
{
975981
size_t readsUntilCheckpoint = params.readsPerCheckpoint;
@@ -1005,10 +1011,23 @@ namespace BloomDBG {
10051011
contigEndKmers, visitedBranchKmers,
10061012
params, counters, streams);
10071013

1008-
#pragma omp atomic
1009-
counters.readsProcessed++;
1010-
if (params.verbose && counters.readsProcessed % PROGRESS_STEP == 0)
1011-
printProgressMessage(counters);
1014+
#pragma omp critical(readsProgress)
1015+
{
1016+
++counters.readsProcessed;
1017+
if (params.verbose && counters.readsProcessed
1018+
% READS_PROGRESS_STEP == 0)
1019+
readsProgressMessage(counters);
1020+
}
1021+
1022+
if (params.verbose)
1023+
#pragma omp critical(basesProgress)
1024+
{
1025+
if (counters.basesAssembled >= basesProgressLine) {
1026+
basesProgressMessage(counters);
1027+
while (counters.basesAssembled >= basesProgressLine)
1028+
basesProgressLine += BASES_PROGRESS_STEP;
1029+
}
1030+
}
10121031

10131032
if (!params.readLogPath.empty()) {
10141033
#pragma omp critical(readLog)
@@ -1034,7 +1053,8 @@ namespace BloomDBG {
10341053
assert(in.eof());
10351054

10361055
if (params.verbose) {
1037-
printProgressMessage(counters);
1056+
readsProgressMessage(counters);
1057+
basesProgressMessage(counters);
10381058
std::cerr << "Assembly complete" << std::endl;
10391059
}
10401060

0 commit comments

Comments
 (0)