Skip to content

Commit cd09092

Browse files
committed
Update chimeric annotations and dependency racon
1 parent 1adb6b2 commit cd09092

File tree

2 files changed

+54
-56
lines changed

2 files changed

+54
-56
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cmake_minimum_required(VERSION 3.11)
22

3-
project(raven VERSION 1.6.1
3+
project(raven VERSION 1.7.0
44
LANGUAGES CXX
55
DESCRIPTION "Raven is a de novo genome assembler for long uncorrected reads.")
66

@@ -56,7 +56,7 @@ if (NOT cereal_FOUND)
5656
endif ()
5757
endif ()
5858

59-
find_package(racon 3.0.2 QUIET)
59+
find_package(racon 3.0.4 QUIET)
6060
if (NOT racon_FOUND)
6161
FetchContent_Declare(
6262
racon

src/graph.cpp

Lines changed: 52 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ void Graph::Construct(
278278
ram::MinimizerEngine minimizer_engine{thread_pool_, kmer_len, window_len};
279279

280280
if (stage_ == -5) { // find overlaps and create piles
281+
constexpr std::size_t kMaxNumOverlaps = 32;
282+
281283
for (const auto& it : sequences) {
282284
piles_.emplace_back(new Pile(it->id, it->inflated_len));
283285
}
@@ -347,9 +349,9 @@ void Graph::Construct(
347349

348350
num_overlaps[i] = std::min(
349351
overlaps[i].size(),
350-
static_cast<std::size_t>(16));
352+
kMaxNumOverlaps);
351353

352-
if (overlaps[i].size() < 16) {
354+
if (overlaps[i].size() < kMaxNumOverlaps) {
353355
return;
354356
}
355357

@@ -360,7 +362,10 @@ void Graph::Construct(
360362
});
361363

362364
std::vector<biosoup::Overlap> tmp;
363-
tmp.insert(tmp.end(), overlaps[i].begin(), overlaps[i].begin() + 16); // NOLINT
365+
tmp.insert(
366+
tmp.end(),
367+
overlaps[i].begin(),
368+
overlaps[i].begin() + kMaxNumOverlaps);
364369
tmp.swap(overlaps[i]);
365370
},
366371
it->id()));
@@ -442,66 +447,59 @@ void Graph::Construct(
442447
if (stage_ == -5) { // resolve chimeric sequences
443448
timer.Start();
444449

445-
while (true) {
446-
auto components = connected_components();
447-
for (const auto& it : components) {
448-
std::vector<std::uint16_t> medians;
449-
for (const auto& jt : it) {
450-
medians.emplace_back(piles_[jt]->median());
451-
}
452-
std::nth_element(
453-
medians.begin(),
454-
medians.begin() + medians.size() / 2,
455-
medians.end());
456-
std::uint16_t median = medians[medians.size() / 2];
450+
std::vector<std::uint16_t> medians;
451+
for (const auto& it : piles_) {
452+
if (it->median() != 0) {
453+
medians.emplace_back(it->median());
454+
}
455+
}
456+
std::nth_element(
457+
medians.begin(),
458+
medians.begin() + medians.size() / 2,
459+
medians.end());
460+
std::uint16_t median = medians[medians.size() / 2];
457461

458-
std::vector<std::future<void>> thread_futures;
459-
for (const auto& jt : it) {
460-
thread_futures.emplace_back(thread_pool_->Submit(
461-
[&] (std::uint32_t i) -> void {
462-
piles_[i]->ClearChimericRegions(median);
463-
if (piles_[i]->is_invalid()) {
464-
std::vector<biosoup::Overlap>().swap(overlaps[i]);
465-
}
466-
},
467-
jt));
468-
}
469-
for (const auto& it : thread_futures) {
470-
it.wait();
471-
}
472-
thread_futures.clear();
462+
std::vector<std::future<void>> thread_futures;
463+
for (const auto& it : piles_) {
464+
if (it->is_invalid()) {
465+
continue;
473466
}
467+
thread_futures.emplace_back(thread_pool_->Submit(
468+
[&] (std::uint32_t i) -> void {
469+
piles_[i]->ClearChimericRegions(median);
470+
if (piles_[i]->is_invalid()) {
471+
std::vector<biosoup::Overlap>().swap(overlaps[i]);
472+
}
473+
},
474+
it->id()));
475+
}
476+
for (const auto& it : thread_futures) {
477+
it.wait();
478+
}
474479

475-
bool is_changed = false;
476-
for (std::uint32_t i = 0; i < overlaps.size(); ++i) {
477-
std::uint32_t k = 0;
478-
for (std::uint32_t j = 0; j < overlaps[i].size(); ++j) {
479-
if (overlap_update(overlaps[i][j])) {
480-
overlaps[i][k++] = overlaps[i][j];
481-
} else {
482-
is_changed = true;
483-
}
480+
for (std::uint32_t i = 0; i < overlaps.size(); ++i) {
481+
std::uint32_t k = 0;
482+
for (std::uint32_t j = 0; j < overlaps[i].size(); ++j) {
483+
if (overlap_update(overlaps[i][j])) {
484+
overlaps[i][k++] = overlaps[i][j];
484485
}
485-
overlaps[i].resize(k);
486486
}
487+
overlaps[i].resize(k);
488+
}
487489

488-
if (!is_changed) {
489-
for (const auto& it : overlaps) {
490-
for (const auto& jt : it) {
491-
std::uint32_t type = overlap_type(jt);
492-
if (type == 1) {
493-
piles_[jt.lhs_id]->set_is_contained();
494-
piles_[jt.lhs_id]->set_is_invalid();
495-
} else if (type == 2) {
496-
piles_[jt.rhs_id]->set_is_contained();
497-
piles_[jt.rhs_id]->set_is_invalid();
498-
}
499-
}
490+
for (const auto& it : overlaps) {
491+
for (const auto& jt : it) {
492+
std::uint32_t type = overlap_type(jt);
493+
if (type == 1) {
494+
piles_[jt.lhs_id]->set_is_contained();
495+
piles_[jt.lhs_id]->set_is_invalid();
496+
} else if (type == 2) {
497+
piles_[jt.rhs_id]->set_is_contained();
498+
piles_[jt.rhs_id]->set_is_invalid();
500499
}
501-
overlaps.clear();
502-
break;
503500
}
504501
}
502+
overlaps.clear();
505503

506504
std::cerr << "[raven::Graph::Construct] removed chimeric sequences "
507505
<< std::fixed << timer.Stop() << "s"

0 commit comments

Comments
 (0)