dsdobjects: an object library for DSD programming

A library of base classes for domain-level strand displacement (DSD)
programming. If you are starting a new project that requires domains,
complexes, secondary structures, nucleotide sequences, reactions, etc. then
you might find this module useful. Note that this is the in-house library of
the nuskell compiler framework; it handels the parsing of supported input file
formats (mainly *.PIL) and their translation into the respective DSD objects.
All objects provided here are singletons. In other words, once you
intialize a Domain d1 = DomainS(name = 'a', length = 15), you will not be
allowed to initialize a new domain with the same name but different length,
unless you delete (all references to) the variable d1 first. If you try to
initialize the same domain a second time, then the new object is d1.
Generally, each (DomainS, ComplexS, MacrostateS, ReactionS) must be initialized
with parameters that define their canonical form and (optionally) a name. If
both are given, the library checks that there are no conflicts with existing
objects, if the name is not provided, the library tries to initialize a new
object with an automatic name, but raises a SingletonError which holds a
reference to the existing object. If only the name is given, the existing
object is returned.
This library is expected to evolve further, potentially breaking backward
compatibility as new challenges are waiting in the nuskell compiler
framework. Don't hesitate to contact the authors with questions about future
plans. Inheritance from the provided objects is fully supported and encouraged.
Installation
To install this library use pip:
$ pip install dsdobjects
or the following command in the root directory:
$ python ./setup.py install
Quick Start
from dsdobjects import DomainS, ComplexS
a = DomainS('a', length = 15)
b = DomainS('b', length = 9)
c = DomainS('c', length = 6)
assert (a is ~(~a))
foo = ComplexS([a, b, c, ~b, '+', ~a], list('((.)+)'), name = 'foo')
foo.kernel_string
foo.canonical_form
foo.size
foo.pair_table
for (se, ss) in foo.rotate():
print(se, ss)
bar = ComplexS([a, b, c, ~b, '+', ~a], list('.(.)+.'), name = 'bar')
assert bar.is_connected is False
cx1, cx2 = bar.split()
Quick Start from PIL files
Initialize prototype objects by loading a system (or a single line) of *.PIL
file format:
from dsdobjects import DomainS
from dsdobjects.objectio import set_io_objects, clear_io_objects, read_pil, read_pil_line
set_io_objects()
outdict = read_pil('filename', is_file = True)
d5 = read_pil_line("length d5 = 7")
assert isinstance(d5, DomainS)
d6 = read_pil_line("sequence d6 = NNNNN")
assert isinstance(d6, DomainS)
assert d6.sequence == 'NNNNN'
Version
0.8 -- requires Python<=3.7
- complete rewrite of the library to use singleton objects with weakref
Author
Stefan Badelt
Contributors
This library contains adapted code from various related Python packages coded
in the DNA and Natural Algorithms Group, Caltech:
- "DNAObjects" coded by Joseph Berleant and Joseph Schaeffer
- peppercornenumerator coded by Kathrik Sarma, Casey Grun and Erik Winfree
- nuskell coded by Seung Woo Shin
Projects depending on dsdobjects
License
MIT