@@ -253,6 +253,52 @@ static void write_cs_ds_core(kstring_t *s, const uint8_t *tseq, const uint8_t *q
253253 assert (t_off == r -> re - r -> rs && q_off == r -> qe - r -> qs );
254254}
255255
256+ static inline void revcomp_splice (uint8_t s [2 ])
257+ {
258+ uint8_t c = s [1 ] < 4 ? 3 - s [1 ] : 4 ;
259+ s [1 ] = s [0 ] < 4 ? 3 - s [0 ] : 4 ;
260+ s [0 ] = c ;
261+ }
262+
263+ void mm_write_junc (kstring_t * s , const mm_idx_t * mi , const mm_bseq1_t * t , const mm_reg1_t * r )
264+ {
265+ int32_t i , t_off , swritten = 0 ;
266+ s -> l = 0 ;
267+ if (!r -> is_spliced || r -> p == 0 ) return ; // no junctions
268+ if (r -> p -> trans_strand != 1 && r -> p -> trans_strand != 2 ) return ; // no preferred strand
269+ for (i = 0 , t_off = r -> rs ; i < (int )r -> p -> n_cigar ; ++ i ) {
270+ int op = r -> p -> cigar [i ]& 0xf , len = r -> p -> cigar [i ]>>4 ;
271+ if (op == MM_CIGAR_MATCH || op == MM_CIGAR_EQ_MATCH || op == MM_CIGAR_X_MISMATCH || op == MM_CIGAR_DEL ) {
272+ t_off += len ;
273+ } else if (op == MM_CIGAR_N_SKIP ) { // intron
274+ uint8_t donor [2 ], acceptor [2 ];
275+ int32_t score1 = 0 , score2 = 0 , rev ;
276+ assert (len >= 2 );
277+ rev = (r -> p -> trans_strand == 2 ) ^ r -> rev ;
278+ if (!rev ) {
279+ mm_idx_getseq (mi , r -> rid , t_off , t_off + 2 , donor );
280+ mm_idx_getseq (mi , r -> rid , t_off + len - 2 , t_off + len , acceptor );
281+ } else {
282+ mm_idx_getseq (mi , r -> rid , t_off , t_off + 2 , acceptor );
283+ mm_idx_getseq (mi , r -> rid , t_off + len - 2 , t_off + len , donor );
284+ revcomp_splice (donor );
285+ revcomp_splice (acceptor );
286+ }
287+ //fprintf(stderr, "%c%c-%c%c\n", "ACGTN"[donor[0]], "ACGTN"[donor[1]], "ACGTN"[acceptor[0]], "ACGTN"[acceptor[1]]);
288+ if (donor [0 ] == 2 && donor [1 ] == 3 ) score1 = 3 ;
289+ else if (donor [0 ] == 2 && donor [1 ] == 1 ) score1 = 2 ;
290+ else if (donor [0 ] == 0 && donor [1 ] == 3 ) score1 = 1 ;
291+ if (acceptor [0 ] == 0 && acceptor [1 ] == 2 ) score2 = 3 ;
292+ else if (acceptor [0 ] == 0 && acceptor [1 ] == 1 ) score2 = 1 ;
293+ if (swritten ) mm_sprintf_lite (s , "\n" );
294+ else swritten = 1 ;
295+ mm_sprintf_lite (s , "%s\t%d\t%d\t%s\t%d\t%c" , mi -> seq [r -> rid ].name , t_off , t_off + len , t -> name , score1 + score2 , "+-" [rev ]);
296+ t_off += len ;
297+ }
298+ }
299+ assert (t_off == r -> re );
300+ }
301+
256302static void write_MD_core (kstring_t * s , const uint8_t * tseq , const uint8_t * qseq , const mm_reg1_t * r , char * tmp , int write_tag )
257303{
258304 int i , q_off , t_off , l_MD = 0 ;
0 commit comments