[Biopython] convert to interleaved nexus
阮铮
rz1991 at foxmail.com
Tue Mar 26 05:06:50 UTC 2013
Hi Natassa,
I'm just reading the biopython source code. It seems NexusIO does not support interleaved nexus output. Internally, NexusIO.NexusWriter.write_alignment uses Bio.Nexus module to write out nexus format. And it doesn't allow you to specify interleave option.
You can try the following code (This is how write_alignment works):
from Bio.Nexus import Nexus
from Bio import AlignIO
alignment = AlignIO.read('...', format='...', format = ...)
minimal_record = "#NEXUS\nbegin data; dimensions ntax=0 nchar=0; format datatype=%s; end;" % "dna"
n = Nexus.Nexus(minimal_record)
n.alphabet = alignment._alphabet
for record in alignment:
n.add_sequence(record.id, record.seq.tostring())
n.write_nexus_data('filename', interleave=True)
Alternatively, you may write MultipleSeqAlignment instance to a StringIO instance and then give it to Nexus.Nexus
Here is the code you may try:
from StringIO import StringIO
from Bio.Nexus import Nexus
from Bio import AlignIO
alignment = AlignIO.read('...', format='...', format = ...)
output = StringIO()
AlignIO.write(alignment, output, 'nexus')
p = Nexus.Nexus()
p.read(output.getvalue())
p.write_nexus_data('filename', interleave=True)
Hope this helps,
Zheng
------------------ Original ------------------
From: "natassa"<natassa_g_2000 at yahoo.com>;
Date: Mar 26, 2013
To: "biopython at biopython.org"<biopython at biopython.org>;
Subject: [Biopython] convert to interleaved nexus
Hi,
I am trying to convert a phylip alignment to interleaved nexus and I cannot. Something like:
def Convert_alnformat(alnfile, out, informat, outformat):
alignment=AlignIO.read(alnfile, informat, alphabet=Gapped(IUPAC.unambiguous_dna))
SeqIO.write(alignment,out, outformat)
will give me a sequential nexus, while I can;'t seem to get hold of the write_nexus_data method of the Bio:Nexus:Nexus:Nexus class.
As this is called internally by AlignIO or SeqIO , I am unsure of how to even call it within my function. I tried:
from Bio.Nexus import Nexus
then in the function
Nexus.Nexus.write_nexus_data( alignment,interleave=True)
and I get
TypeError: unbound method write_nexus_data() must be called with Nexus instance as first argument (got MultipleSeqAlignment instance instead)
I understand that the alignment object is not a nexus instance, but I don't see what i should do.
Can you please help?
thanks,
Natassa
_______________________________________________
Biopython mailing list - Biopython at lists.open-bio.org
http://lists.open-bio.org/mailman/listinfo/biopython
More information about the Biopython
mailing list