11//! Seed clustering and stitching via dynamic programming
22use crate :: align:: score:: AlignmentScorer ;
33use crate :: align:: seed:: Seed ;
4- use crate :: align:: transcript:: Transcript ;
4+ use crate :: align:: transcript:: { CigarOpExt , Transcript } ;
55use crate :: error:: Error ;
66use crate :: index:: GenomeIndex ;
77use noodles:: sam:: alignment:: record:: cigar;
@@ -1754,6 +1754,16 @@ pub(crate) fn finalize_transcript(
17541754
17551755 use cigar:: op:: { Kind , Op } ;
17561756
1757+ fn append_match ( ops : & mut Vec < Op > , len : usize ) {
1758+ if let Some ( op) = ops. last_mut ( )
1759+ && op. kind ( ) == Kind :: Match
1760+ {
1761+ * op = op. with_added_len ( len) ;
1762+ } else {
1763+ ops. push ( Op :: new ( Kind :: Match , len) ) ;
1764+ }
1765+ }
1766+
17571767 // Build final CIGAR from exon blocks
17581768 let mut final_cigar: Vec < Op > = Vec :: new ( ) ;
17591769
@@ -1779,14 +1789,7 @@ pub(crate) fn finalize_transcript(
17791789 // Shared match bases before the gap
17801790 let shared = read_gap. max ( 0 ) as usize ;
17811791 if shared > 0 {
1782- // TODO: replace with “extend_or_push_match” function call
1783- if let Some ( op) = final_cigar. last_mut ( )
1784- && op. kind ( ) == Kind :: Match
1785- {
1786- * op = Op :: new ( Kind :: Match , op. len ( ) + shared) ;
1787- } else {
1788- final_cigar. push ( Op :: new ( Kind :: Match , shared) ) ;
1789- }
1792+ append_match ( & mut final_cigar, shared) ;
17901793 }
17911794 let del = ( genome_gap - read_gap. max ( 0 ) ) as usize ;
17921795 if del >= scorer. align_intron_min as usize
@@ -1800,14 +1803,7 @@ pub(crate) fn finalize_transcript(
18001803 // Insertion
18011804 let shared = genome_gap. max ( 0 ) as usize ;
18021805 if shared > 0 {
1803- // TODO: replace with “extend_or_push_match” function call
1804- if let Some ( op) = final_cigar. last_mut ( )
1805- && op. kind ( ) == Kind :: Match
1806- {
1807- * op = Op :: new ( Kind :: Match , op. len ( ) + shared) ;
1808- } else {
1809- final_cigar. push ( Op :: new ( Kind :: Match , shared) ) ;
1810- }
1806+ append_match ( & mut final_cigar, shared) ;
18111807 }
18121808 let ins = ( read_gap - genome_gap. max ( 0 ) ) as usize ;
18131809 final_cigar. push ( Op :: new ( Kind :: Insertion , ins) ) ;
@@ -1818,27 +1814,13 @@ pub(crate) fn finalize_transcript(
18181814 // This exon's match region
18191815 let match_len = exon. read_end - exon. read_start ;
18201816 if match_len > 0 {
1821- // TODO: replace with “extend_or_push_match” function call
1822- if let Some ( op) = final_cigar. last_mut ( )
1823- && op. kind ( ) == Kind :: Match
1824- {
1825- * op = Op :: new ( Kind :: Match , op. len ( ) + match_len) ;
1826- } else {
1827- final_cigar. push ( Op :: new ( Kind :: Match , match_len) ) ;
1828- }
1817+ append_match ( & mut final_cigar, match_len) ;
18291818 }
18301819 }
18311820
18321821 // Right extension match
18331822 if right_extend. extend_len > 0 {
1834- // TODO: replace with “extend_or_push_match” function call
1835- if let Some ( op) = final_cigar. last_mut ( )
1836- && op. kind ( ) == Kind :: Match
1837- {
1838- * op = Op :: new ( Kind :: Match , op. len ( ) + right_extend. extend_len ) ;
1839- } else {
1840- final_cigar. push ( Op :: new ( Kind :: Match , right_extend. extend_len ) ) ;
1841- }
1823+ append_match ( & mut final_cigar, right_extend. extend_len ) ;
18421824 }
18431825
18441826 // Right soft clip
0 commit comments