unsigned UngappedAligner::alignUngapped( FragmentMetadata &fragmentMetadata, Cigar &cigarBuffer, const flowcell::ReadMetadata &readMetadata, const matchSelector::FragmentSequencingAdapterClipper &adapterClipper, const reference::ContigList &contigList, const isaac::reference::ContigAnnotations &contigAnnotations) const { const unsigned cigarOffset = cigarBuffer.size(); // Don't reset alignment to preserve the seed-based anchors. // fragmentMetadata.resetAlignment(); ISAAC_ASSERT_MSG(!fragmentMetadata.isAligned(), "alignUngapped is expected to be performend on a clean fragment"); fragmentMetadata.resetClipping(); const reference::Contig &contig = contigList[fragmentMetadata.contigId]; const Read &read = fragmentMetadata.getRead(); const bool reverse = fragmentMetadata.reverse; const std::vector<char> &sequence = read.getStrandSequence(reverse); const reference::Contig &reference = contig; std::vector<char>::const_iterator sequenceBegin = sequence.begin(); std::vector<char>::const_iterator sequenceEnd = sequence.end(); adapterClipper.clip(contig, fragmentMetadata, sequenceBegin, sequenceEnd); clipReadMasking(read, fragmentMetadata, sequenceBegin, sequenceEnd); clipReference(reference.size(), fragmentMetadata, sequenceBegin, sequenceEnd); const unsigned firstMappedBaseOffset = std::distance(sequence.begin(), sequenceBegin); if (firstMappedBaseOffset) { cigarBuffer.addOperation(firstMappedBaseOffset, Cigar::SOFT_CLIP); } const unsigned mappedBases = std::distance(sequenceBegin, sequenceEnd); if (mappedBases) { const Cigar::OpCode opCode = Cigar::ALIGN; cigarBuffer.addOperation(mappedBases, opCode); } const unsigned clipEndBases = std::distance(sequenceEnd, sequence.end()); if (clipEndBases) { cigarBuffer.addOperation(clipEndBases, Cigar::SOFT_CLIP); } const unsigned ret = updateFragmentCigar( readMetadata, contigList, contigAnnotations, fragmentMetadata, fragmentMetadata.reverse, fragmentMetadata.contigId, fragmentMetadata.position, cigarBuffer, cigarOffset); if (!ret) { fragmentMetadata.setUnaligned(); } return ret; }
/** * \return true, if the clipping changed the alignment position */ bool SemialignedEndsClipper::clip( const std::vector<reference::Contig> &contigList, FragmentMetadata &fragmentMetadata) { if (!fragmentMetadata.isAligned() || fragmentMetadata.gapCount) { return false; } bool ret = clipLeftSide(contigList, fragmentMetadata); if (clipRightSide(contigList, fragmentMetadata)) { ret = true; } if (ret) { ISAAC_THREAD_CERR_DEV_TRACE(" SemialignedEndsClipper::clip: " << fragmentMetadata); } return ret; }