From 29ed675ee5c4a8fb484cb53df97011b6d7be6d76 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Tue, 20 Feb 2018 11:05:54 -0500 Subject: [PATCH] bugfix: in-place revcomp() not working --- python/cmappy.h | 15 +++++++-------- python/cmappy.pxd | 2 +- python/mappy.pyx | 10 +++++++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/python/cmappy.h b/python/cmappy.h index 4044aeb..313a9dd 100644 --- a/python/cmappy.h +++ b/python/cmappy.h @@ -101,16 +101,15 @@ static inline mm_reg1_t *mm_map_aux(const mm_idx_t *mi, const char *seq1, const } } -static inline uint8_t *mappy_revcomp(int len, uint8_t *seq) +static inline char *mappy_revcomp(int len, const uint8_t *seq) { int i; - for (i = 0; i < len>>1; ++i) { - uint8_t t = seq_comp_table[seq[i]]; - seq[i] = seq_comp_table[seq[len - 1 - i]]; - seq[len - 1 - i] = t; - } - if (len&1) seq[len>>1] = seq_comp_table[seq[len>>1]]; - return seq; + char *rev; + rev = (char*)malloc(len + 1); + for (i = 0; i < len; ++i) + rev[len - i - 1] = seq_comp_table[seq[i]]; + rev[len] = 0; + return rev; } #endif diff --git a/python/cmappy.pxd b/python/cmappy.pxd index 7570103..a40adf0 100644 --- a/python/cmappy.pxd +++ b/python/cmappy.pxd @@ -116,6 +116,6 @@ cdef extern from "cmappy.h": void mm_fastx_close(kseq_t *ks) int kseq_read(kseq_t *seq) - uint8_t *mappy_revcomp(int l, uint8_t *seq) + char *mappy_revcomp(int l, const uint8_t *seq) int mm_verbose_level(int v) void mm_reset_timer() diff --git a/python/mappy.pyx b/python/mappy.pyx index 1318e16..aeeab5e 100644 --- a/python/mappy.pyx +++ b/python/mappy.pyx @@ -1,6 +1,7 @@ from libc.stdint cimport uint8_t, int8_t from libc.stdlib cimport free cimport cmappy +import sys cmappy.mm_reset_timer() @@ -165,9 +166,12 @@ def fastx_read(fn): cmappy.mm_fastx_close(ks) def revcomp(seq): - cdef uint8_t *s - s = cmappy.mappy_revcomp(len(seq), str.encode(seq)) - return s if isinstance(s, str) else s.decode() + l = len(seq) + bseq = seq if isinstance(seq, bytes) else seq.encode() + cdef char *s = cmappy.mappy_revcomp(l, bseq) + r = s[:l] if isinstance(s, str) else s[:l].decode() + free(s) + return r def verbose(v=None): if v is None: v = -1