allpy
annotate allpy/dna.py @ 1091:afed1fd8920c
Added backreferences to `Seqeunce`s from `Monomer`s (closes #49)
WARNING! Please note that `Sequence` API almost changed entirely!
WARNING! This commit immediately obsoletes classmethods `Monomer.from_code*`,
`Monomer.from_name` and `Sequence.from_monomers`.
Turns out, python can not pickle sets/dicts which have keys, which inderecly
reference the set/dict itself: http://bugs.python.org/issue9269 -- which is
excatly what we have in abundance after this change.
To allow pickling added `__getstate__` to `Monomer` to return all attributes,
except `sequence` and `__setstate__` to `Sequence`, which runs through all
monomers and returns the `sequence` attribute back to where it belongs.
WARNING! This MAY result in unexpected behaviour in some cases. (Which should
be rare enough).
author | Daniil Alexeyevsky <dendik@kodomo.fbb.msu.ru> |
---|---|
date | Sat, 02 Jun 2012 19:33:42 +0400 |
parents | 4a9b4503a027 |
children | c4c772e3ce86 |
rev | line source |
---|---|
bnagaev@240 | 1 import base |
me@353 | 2 import data.codes |
me@280 | 3 |
dendik@382 | 4 import dna |
dendik@382 | 5 |
me@328 | 6 class Monomer(base.Monomer): |
me@328 | 7 """DNA monomers: nucleotides.""" |
me@328 | 8 type = 'dna' |
dendik@382 | 9 types = dna |
me@280 | 10 by_code1 = {} |
me@280 | 11 by_code3 = {} |
me@280 | 12 by_name = {} |
me@353 | 13 Monomer._initialize(data.codes.dna) |
bnagaev@240 | 14 |
bnagaev@240 | 15 class Sequence(base.Sequence): |
dendik@382 | 16 types = dna |
dendik@382 | 17 |
dendik@930 | 18 def reverse_complemented(self): |
dendik@930 | 19 """Return a new sequence, reverse-complement to self. |
dendik@930 | 20 |
dendik@930 | 21 Name of the sequence is name of self with apostrophe added. |
dendik@930 | 22 """ |
dendik@930 | 23 complement = {'A': 'T', 'T': 'A', 'C': 'G', 'G': 'C'} |
dendik@1091 | 24 result = self.types.Sequence( |
dendik@1091 | 25 name=self.name +"'", |
dendik@1091 | 26 description=self.description, |
dendik@1091 | 27 source=self.source |
dendik@930 | 28 ) |
dendik@1091 | 29 for monomer in reversed(self): |
dendik@1091 | 30 result.append_monomer(complement.get(monomer.code1, 'N')) |
dendik@1091 | 31 return result |
dendik@930 | 32 |
dendik@931 | 33 class Column(base.Column): |
dendik@931 | 34 types = dna |
dendik@931 | 35 |
dendik@382 | 36 class Alignment(base.Alignment): |
dendik@382 | 37 types = dna |
bnagaev@240 | 38 |
me@341 | 39 class Block(Alignment, base.Block): |
me@341 | 40 pass |
me@341 | 41 |
me@280 | 42 # vim: set ts=4 sts=4 sw=4 et: |