Start of the implementation of the export methods
This commit is contained in:
0
python/obitools3/format/__init__.py
Normal file
0
python/obitools3/format/__init__.py
Normal file
9
python/obitools3/format/fasta.pxd
Normal file
9
python/obitools3/format/fasta.pxd
Normal 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
|
52
python/obitools3/format/fasta.pyx
Normal file
52
python/obitools3/format/fasta.pyx
Normal 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
5
python/obitools3/format/header.pxd
Normal file
5
python/obitools3/format/header.pxd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
cdef class HeaderFormat:
|
||||||
|
|
||||||
|
cdef str start
|
||||||
|
cdef size_t headerBufferLength
|
||||||
|
|
27
python/obitools3/format/header.pyx
Normal file
27
python/obitools3/format/header.pyx
Normal 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
|
||||||
|
|
Reference in New Issue
Block a user