@@ -44,6 +44,8 @@ impl MaximalUnitigFlags {
4444#[ derive( Copy , Clone , Eq ) ]
4545pub struct MaximalUnitigIndex {
4646 index : u64 ,
47+ // The non reverse-complemented start of the link overlap (used for gfa2)
48+ overlap_start : u64 ,
4749 pub flags : MaximalUnitigFlags ,
4850}
4951
@@ -63,12 +65,18 @@ impl HasEmptyExtraBuffer for MaximalUnitigIndex {}
6365impl SequenceExtraData for MaximalUnitigIndex {
6466 fn decode_extended ( _: & mut ( ) , reader : & mut impl Read ) -> Option < Self > {
6567 let index = decode_varint ( || reader. read_u8 ( ) . ok ( ) ) ?;
68+ let overlap_start = decode_varint ( || reader. read_u8 ( ) . ok ( ) ) ?;
6669 let flags = reader. read_u8 ( ) . ok ( ) ?;
67- Some ( MaximalUnitigIndex :: new ( index, MaximalUnitigFlags ( flags) ) )
70+ Some ( MaximalUnitigIndex :: new (
71+ index,
72+ overlap_start,
73+ MaximalUnitigFlags ( flags) ,
74+ ) )
6875 }
6976
7077 fn encode_extended ( & self , _: & ( ) , writer : & mut impl Write ) {
7178 encode_varint ( |b| writer. write_all ( b) . ok ( ) , self . index ( ) as u64 ) . unwrap ( ) ;
79+ encode_varint ( |b| writer. write_all ( b) . ok ( ) , self . overlap_start ) . unwrap ( ) ;
7280 writer. write_all ( & [ self . flags . 0 ] ) . unwrap ( ) ;
7381 }
7482
@@ -88,8 +96,12 @@ impl Debug for MaximalUnitigIndex {
8896
8997impl MaximalUnitigIndex {
9098 #[ inline]
91- pub fn new ( index : u64 , flags : MaximalUnitigFlags ) -> Self {
92- Self { index, flags }
99+ pub fn new ( index : u64 , overlap_start : u64 , flags : MaximalUnitigFlags ) -> Self {
100+ Self {
101+ index,
102+ overlap_start,
103+ flags,
104+ }
93105 }
94106
95107 #[ inline]
@@ -148,6 +160,7 @@ impl BucketItemSerializer for MaximalUnitigLinkSerializer {
148160
149161 for entry in entries {
150162 encode_varint ( |b| bucket. write_all ( b) , entry. index ( ) as u64 ) . unwrap ( ) ;
163+ encode_varint ( |b| bucket. write_all ( b) , entry. overlap_start ) . unwrap ( ) ;
151164 bucket. push ( entry. flags . 0 ) ;
152165 }
153166 }
@@ -165,8 +178,13 @@ impl BucketItemSerializer for MaximalUnitigLinkSerializer {
165178 let start = read_buffer. len ( ) ;
166179 for _i in 0 ..len {
167180 let index = decode_varint ( || stream. read_u8 ( ) . ok ( ) ) ?;
181+ let overlap_start = decode_varint ( || stream. read_u8 ( ) . ok ( ) ) ?;
168182 let flags = stream. read_u8 ( ) . ok ( ) ?;
169- read_buffer. push ( MaximalUnitigIndex :: new ( index, MaximalUnitigFlags ( flags) ) ) ;
183+ read_buffer. push ( MaximalUnitigIndex :: new (
184+ index,
185+ overlap_start,
186+ MaximalUnitigFlags ( flags) ,
187+ ) ) ;
170188 }
171189
172190 Some ( MaximalUnitigLink :: new ( entry, VecSlice :: new ( start, len) ) )
@@ -272,26 +290,61 @@ impl IdentSequenceWriter for DoubleMaximalUnitigLinks {
272290 }
273291
274292 #[ allow( unused_variables) ]
275- fn write_as_gfa (
293+ fn write_as_gfa < const VERSION : u32 > (
276294 & self ,
277295 k : u64 ,
278296 index : u64 ,
297+ length : u64 ,
279298 stream : & mut impl Write ,
280299 extra_buffer : & Self :: TempBuffer ,
281300 ) {
282301 for entries in & self . links {
283302 let entries = entries. entries . get_slice ( extra_buffer) ;
284- for entry in entries {
285- writeln ! (
286- stream,
287- "L\t {}\t {}\t {}\t {}\t {}M" ,
288- index,
289- if entry. flags. flip_current( ) { "-" } else { "+" } ,
290- entry. index,
291- if entry. flags. flip_other( ) { "-" } else { "+" } ,
292- k - 1
293- )
294- . unwrap ( ) ;
303+ if VERSION == 1 {
304+ for entry in entries {
305+ // L <index> < +/- > <other_index> < +/- > <overlap>
306+ writeln ! (
307+ stream,
308+ "L\t {}\t {}\t {}\t {}\t {}M" ,
309+ index,
310+ if entry. flags. flip_current( ) { '-' } else { '+' } ,
311+ entry. index,
312+ if entry. flags. flip_other( ) { '-' } else { '+' } ,
313+ k - 1
314+ )
315+ . unwrap ( ) ;
316+ }
317+ } else if VERSION == 2 {
318+ for entry in entries {
319+ let ( b1, e1, is_end1) = if entry. flags . flip_current ( ) {
320+ ( 0 , k - 1 , false )
321+ } else {
322+ ( length - k + 1 , length, true )
323+ } ;
324+
325+ let ( b2, e2, is_end2) = (
326+ entry. overlap_start ,
327+ entry. overlap_start + k - 1 ,
328+ entry. overlap_start > 0 ,
329+ ) ;
330+
331+ // E * <index>< +/- > <other_index>< +/- > <b1> <e1> <b2> <e2>
332+ writeln ! (
333+ stream,
334+ "E\t *\t {}{}\t {}{}\t {}\t {}{}\t {}\t {}{}" ,
335+ index,
336+ if entry. flags. flip_current( ) { '-' } else { '+' } ,
337+ entry. index,
338+ if entry. flags. flip_other( ) { '-' } else { '+' } ,
339+ b1,
340+ e1,
341+ if is_end1 { "$" } else { "" } ,
342+ b2,
343+ e2,
344+ if is_end2 { "$" } else { "" }
345+ )
346+ . unwrap ( ) ;
347+ }
295348 }
296349 }
297350 }
0 commit comments