Remove low-coverage contigs. */
| 391 | |
| 392 | /** Remove low-coverage contigs. */ |
| 393 | void NetworkSequenceCollection::controlCoverage() |
| 394 | { |
| 395 | assert(opt::coverage > 0); |
| 396 | |
| 397 | // Split ambiguous branches. |
| 398 | SetState(NAS_MARK_AMBIGUOUS); |
| 399 | controlMarkAmbiguous(); |
| 400 | |
| 401 | // Remove low-coverage contigs. |
| 402 | cout << "Removing low-coverage contigs " |
| 403 | "(mean k-mer coverage < " << opt::coverage << ")...\n"; |
| 404 | SetState(NAS_COVERAGE); |
| 405 | m_comm.sendControlMessage(APC_SET_STATE, NAS_COVERAGE); |
| 406 | m_comm.reduce(m_data.cleanup()); |
| 407 | m_lowCoverageContigs = 0; |
| 408 | m_lowCoverageKmer = 0; |
| 409 | pair<size_t, size_t> numAssembled |
| 410 | = performNetworkAssembly(); |
| 411 | EndState(); |
| 412 | |
| 413 | m_numReachedCheckpoint++; |
| 414 | while (!checkpointReached()) |
| 415 | pumpNetwork(); |
| 416 | |
| 417 | // Count the number of low-coverage contigs. |
| 418 | SetState(NAS_COVERAGE_COMPLETE); |
| 419 | m_comm.sendControlMessage(APC_SET_STATE, NAS_COVERAGE_COMPLETE); |
| 420 | m_comm.barrier(); |
| 421 | pumpNetwork(); |
| 422 | |
| 423 | numAssembled.first = m_comm.reduce(numAssembled.first); |
| 424 | numAssembled.second = m_comm.reduce(numAssembled.second); |
| 425 | cout << "Found " << numAssembled.second << " k-mer in " |
| 426 | << numAssembled.first << " contigs " |
| 427 | "before removing low-coverage contigs.\n"; |
| 428 | |
| 429 | size_t lowCoverageContigs = m_comm.reduce(m_lowCoverageContigs); |
| 430 | size_t lowCoverageKmer = m_comm.reduce(m_lowCoverageKmer); |
| 431 | cout << "Removed " << lowCoverageKmer << " k-mer in " |
| 432 | << lowCoverageContigs << " low-coverage contigs.\n"; |
| 433 | |
| 434 | if (!opt::db.empty()) { |
| 435 | AssemblyAlgorithms::addToDb ("totalLowCovCntg", lowCoverageContigs); |
| 436 | AssemblyAlgorithms::addToDb ("totalLowCovKmer", lowCoverageKmer); |
| 437 | } |
| 438 | |
| 439 | EndState(); |
| 440 | |
| 441 | SetState(NAS_SPLIT_AMBIGUOUS); |
| 442 | controlSplitAmbiguous(); |
| 443 | |
| 444 | SetState(NAS_CLEAR_FLAGS); |
| 445 | m_comm.sendControlMessage(APC_SET_STATE, NAS_CLEAR_FLAGS); |
| 446 | m_comm.barrier(); |
| 447 | pumpNetwork(); |
| 448 | m_data.wipeFlag(SeqFlag(SF_MARK_SENSE | SF_MARK_ANTISENSE)); |
| 449 | size_t removed = m_comm.reduce(m_data.cleanup()); |
| 450 | cout << "Removed " << removed << " marked k-mer.\n"; |