Skip to main content

Base classes for DSD design

Project description

dsdobjects: an object library for DSD programming

This Python module provides a library of protype objects and base classes for domain-level strand displacement (DSD) programming. There are two types of usage:

  1. ready-to-go prototype objects,
  2. tweak-em-yourself core objects.

If you start with a new project, you want to use the prototypes. These are out-of-the box functional classes that can be initialized, for example, using various standards of the text file format *.pil.


To install this library use pip:

$ pip install dsdobjects

or the following command in the root directory:

$ python ./ install

Quick Start with object prototypes.

from dsdobjects import SequenceConstraint, StrandOrder, LogicDomain, Domain, Complex, Macrostate, Reaction
# Define a few toy domains:
a = LogicDomain('a', dtype='long')
b = LogicDomain('b', dtype='long', length=9)
c = LogicDomain('c', dtype='short', length=6)

# LogicDomains have exactly one complement, it can be initialized 
# and/or accessed using the __invert__ operator. The built-in 
# memory management ensures that there is only one object for each domain.
assert (a is ~(~a))

# Use the Domains to define a Complex ...
cplx = Complex([a, b, c, ~b, '+', ~a], list('((.)+)'), name='rudolf')

# ... and test some of the built-in complex properties:
for r in cplx.rotate():

# If you were to define two complexes as one disconnected complex ... 
cplx = Complex([a, b, c, ~b, '+', ~a], list('.(.)+.'), name='cplx')
assert cplx.is_connected is False

# ... you can quickly and return the indiviudal complexes:
cx1, cx2 = cplx.split()

Quick Start with text input.

For example initialize prototype objects by loading a system (or a single line) of *.pil file format:

import dsdobjects.objectio as oio

domains, complexes, macrostates, detailed_rxns, condensed_rxns = oio.read_pil(filename.pil)

myobject = oio.read_pil_line("length d5 = 7")
assert isinstance(myobject, LogicDomain)

myobject = oio.read_pil_line("sequence d6 = NNNNN")
assert isinstance(myobject, Domain)

Abut the core objects.

If prototypes are not sufficient, you can make your own objects by inheriting from the core objects. Core objects provide a basic set of builtin functions (e.g. equality, sorting), basic properties, memory management. One way to get started is by copying the prototypes file into your project, and adapt it to your needs. Consider a pull request back into the main dsdobjects repository!

Quick Start with core objects.

Inheritance from dsdobjects.base_classes provides only basic functions such as '~', '==', '!=', and access to the built-in memory management for each class. Some potential ambiguities, such as requesting the complement of a Domain, or the length of a complex must be defined upon inheritance.

from dsdobjects.core import DL_Domain

# A personalized domain that extends the DL_Domain base class.
class MyDomain(DL_Domain):

    def __init__(self, name, dtype=None, length=None):
        super(MyDomain, self).__init__(name, dtype, length)

    def complement(self):
        # Automatically initialize or return the complementary domain.
        if self._complement is None:
            cname = self._name[:-1] if self.is_complement else self._name + '*'
            if cname in DL_Domain.MEMORY:
                self._complement = DL_Domain.MEMORY[cname]
            else :
                self._complement = MyDomain(cname, self.dtype, self.length)
        return self._complement


0.7.1 -- pil I/O for prototypes and customn objects

  • prototype complex concentration
  • read_pil supports inherited objects
  • logging support
  • bug fix for adding core objects

0.7 -- Python 3.x support / prototypes

  • basic support of prototype objects
  • added StrandOrder base_class and prototpye
  • allow parsing of infinite error bars for reaction rates
  • DSD_Restingset renamed to DSD_Macrostate
  • broken backward compatibility: reaction rates are now namedtuples

0.6.3 -- added parser for seesaw language

0.6.2 -- bugfix for restingsets with given representative

0.6.1 -- adapted when used as pypi dependency

0.6 -- PIL parser supports concentration format

  • "non-equal" bugfixes in
  • supports rate-error bars when parsing PIL format

0.5 -- improved canonical forms


Stefan Badelt


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



Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for dsdobjects, version 0.7.1
Filename, size File type Python version Upload date Hashes
Filename, size dsdobjects-0.7.1-py3-none-any.whl (29.2 kB) File type Wheel Python version py3 Upload date Hashes View
Filename, size dsdobjects-0.7.1.tar.gz (25.3 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page