Start of the implementation of the export methods

This commit is contained in:
2016-06-02 19:10:33 +02:00
parent f186395661
commit bac7ce7184
5 changed files with 93 additions and 0 deletions

View File

View File

@ -0,0 +1,9 @@
from .header cimport HeaderFormat
from cython.view cimport array as cvarray
cdef class FastaFormat:
cdef HeaderFormat headerFormater
cdef size_t sequenceBufferLength
cdef cvarray sequenceBuffer

View File

@ -0,0 +1,52 @@
cimport cython
cdef class FastaFormat:
def __init__(self, list tags=[], bint printNAKeys=False):
self.headerFormater = HeaderFormat(True,
tags,
printNAKeys)
self.sequenceBufferLength=1000
self.sequenceBuffer = cvarray(shape=(1000,),
itemsize=sizeof(char),
format="c",
mode="c",
allocate_buffer=True)
@cython.boundscheck(False)
def __call__(self, dict data):
cdef bytes brawseq = <bytes> data['sequence']
cdef size_t lseq = len(brawseq)
cdef size_t needed_size = lseq + 1
cdef char[:] seq
cdef char[:] fasta
cdef size_t k=0
needed_size += needed_size/ 50
if needed_size > self.sequenceBufferLength:
self.sequenceBufferLength=needed_size
self.sequenceBuffer = cvarray(shape=(needed_size,),
itemsize=sizeof(char),
format="c",
mode="c",
allocate_buffer=True)
seq = brawseq
fasta = self.sequenceBuffer
for i in range(0,lseq,60):
if i+60 <= lseq:
fasta[k:(k+60)]=seq[i:(i+60)]
fasta[k+60]='\n'
k+=61
else:
fasta[k:(k+lseq-i)]=seq[i:lseq]
k+=lseq-i

View File

@ -0,0 +1,5 @@
cdef class HeaderFormat:
cdef str start
cdef size_t headerBufferLength

View File

@ -0,0 +1,27 @@
cdef class HeaderFormat:
def __init__(self, bint fastaHeader=True, list tags=[], bint printNAKeys=False):
self.tags = tags
self.printNaKeys = printNAKeys
if fastaHeader:
self.start=">"
else:
self.start="@"
self.headerBufferLength = 1000
self.headerBuffer = []
def __call__(self, dict data):
cdef str header
if data['definition'] is not None:
header = "%s%s %s" % (self.start,data['id'],
data['definition'])
else:
header = "%s%s" % (self.start,data['id'])
return header