-
Notifications
You must be signed in to change notification settings - Fork 294
/
hashing.pyx
65 lines (50 loc) · 1.62 KB
/
hashing.pyx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# -*- coding: UTF-8 -*-
from libcpp.string cimport string
from libcpp.memory cimport make_shared
from libc.stdint cimport uint64_t
from cython.operator cimport dereference as deref
from khmer._oxli.oxli_types cimport *
cdef class Kmer:
def __cinit__(self, str kmer=None):
self.kmer = kmer
if self.kmer is not None:
self._this.reset(new CpKmer(kmer.encode('utf-8'), len(kmer)))
else:
self._this.reset(new CpKmer())
def __len__(self):
return len(self.kmer)
def __str__(self):
return self.kmer
def __hash__(self):
return self.kmer_u
def __repr__(self):
return self.kmer
@property
def kmer_f(self):
return deref(self._this).kmer_f
@property
def kmer_r(self):
return deref(self._this).kmer_r
@property
def kmer_u(self):
return deref(self._this).kmer_u
def reverse_complement(self):
cdef HashIntoType tmp = deref(self._this).kmer_f
deref(self._this).kmer_f = deref(self._this).kmer_r
deref(self._this).kmer_r = tmp
self.kmer = _revcomp(self.kmer.encode('utf-8'))
@property
def is_forward(self):
return deref(self._this).is_forward()
@staticmethod
cdef Kmer wrap(CpKmer * cpkmer, WordLength K):
cdef Kmer kmer = Kmer()
kmer._this.reset(cpkmer)
kmer.kmer = _revhash(kmer.kmer_u, K)
return kmer
@staticmethod
def create(HashIntoType tag, WordLength K):
cdef Kmer kmer = Kmer()
deref(kmer._this).set_from_unique_hash(tag, K)
kmer.kmer = _revhash(kmer.kmer_u, K)
return kmer