Archive

Tag Archives: tool

Update:

Graphviz now has SBOLv 1.0 support!

I implemented the Synthetic Biology Open Language (SBOLv) symbols for Graphviz to easily generate SBOLv compliant diagrams.

see my original post on using Graphviz to draw genetic circuits

Gene Expression Symbols:

digraph G {
rankdir=LR;

promoter -> operator [arrowhead=none];
operator -> cds [arrowhead=none];
cds -> utr [arrowhead=none];
utr -> terminator [arrowhead=none];

promoter [shape=promoter labelloc="b"];
operator [shape=square width=0.2 label=""];
cds [shape=cds];
utr [shape=utr labelloc="b"];
terminator [shape=terminator labelloc="b"];

}

digraph G {
rankdir=LR;

insulator -> ribosite [arrowhead=none];
ribosite -> rnastab [arrowhead=none];
rnastab -> proteasesite [arrowhead=none];
proteasesite -> proteinstab [arrowhead=none];

insulator [shape=insulator label=""];
ribosite [shape=ribosite label="ribonuclease site" labelloc="b"];
rnastab [shape=rnastab label="rna stability" labelloc="b"];
proteasesite [shape=proteasesite label="protease site" labelloc="b"];
proteinstab [shape=proteinstab label="protein stability" labelloc="b"];

}

DNA Construction Symbols:

digraph G {
rankdir=LR;

origin -> primersite [arrowhead=none];
primersite -> restrictionsite [arrowhead=none];
restrictionsite -> noverhang [arrowhead=none];
noverhang -> assembly [arrowhead=none];

origin [shape=circle width=0.2 label=""];
primersite [shape=primersite label="primer site" labelloc="b"];
restrictionsite [shape=restrictionsite label="restriction site" labelloc="b"];
noverhang [shape=noverhang label=""];
assembly [shape=assembly label=""];

}

digraph G {
rankdir = LR;

fivepoverhang -> signature [arrowhead=none];
signature -> threepoverhang [arrowhead=none];

fivepoverhang [shape=fivepoverhang label=""];
signature [shape=signature];
threepoverhang [shape=threepoverhang label=""];

}

Download:

Download from the official Graphviz site

All the development snapshots newer than 2.29.20120924 should have SBOLv compliant symbols, as well as the non-SBOLv circuit symbols (lpromoter, rarrow, etc.).

Example Diagrams:


digraph a {
rankdir=LR;

subgraph cluster0 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
a -> b [arrowhead=none];
b -> c [arrowhead=none];
}

a [shape=promoter label=""];
b [shape=cds label="rtTA"];
c [shape=terminator label=""];

Dox -> rtTA;
b -> rtTA;

subgraph cluster1 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
d -> e [arrowhead=none];
e -> f [arrowhead=none];
}

d [shape=promoter label=""];
e [shape=cds label="Alfa"];
f [shape=terminator label=""];

rtTA -> d;
e -> Alfa;

subgraph cluster2 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
g -> h [arrowhead=none];
h -> i [arrowhead=none];
}

g [shape=promoter label=""];
h [shape=cds label="Alfa"];
i [shape=terminator label=""];

Alfa -> g;
h -> Alfa;

}

digraph G {
rankdir=LR;

subgraph cluster0 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
a -> b [arrowhead=none];
b -> c [arrowhead=none];
c -> d [arrowhead=none];
}

a [shape=promoter label=""];
b [shape=cds label="rtTA"];
c [shape=cds label="LacI"];
d [shape=terminator label=""];

Dox -> rtTA;
b -> rtTA;

subgraph cluster1 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
e -> f [arrowhead=none];
f -> g [arrowhead=none];
g -> h [arrowhead=none];
}

e [shape=promoter label=""];
f [shape=cds label="Charlie"];
g [shape=cds label="Alfa"];
h [shape=terminator label=""];

rtTA -> e;

c -> LacI;
IPTG -> LacI [arrowhead=tee];

subgraph cluster2 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
i -> j [arrowhead=none];
j -> k [arrowhead=none];
k -> l [arrowhead=none];
}

i [shape=promoter label=""];
j [shape=cds label="India"];
k [shape=cds label="Bravo"];
l [shape=terminator label=""];

LacI -> i [arrowhead=tee];

f -> Charlie;
g -> Alfa;
j -> India;
k -> Bravo;

subgraph cluster3 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
m -> n [arrowhead=none];
n -> o [arrowhead=none];
o -> p [arrowhead=none];
}

m [shape=promoter label=""];
n [shape=cds label="Charlie"];
o [shape=cds label="Alfa"];
p [shape=terminator label=""];

n -> Charlie;
o -> Alfa;
Alfa -> m;

subgraph cluster4 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
q -> r [arrowhead=none];
r -> s [arrowhead=none];
s -> t [arrowhead=none];
t -> u [arrowhead=none];
}

q [shape=promoter label=""];
r [shape=cds label="India"];
s [shape=cds label="Bravo"];
t [shape=cds label="EYFP"];
u [shape=terminator label=""];

r -> India;
s -> Bravo;
t -> EYFP;

subgraph cluster5 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
v -> w [arrowhead=none];
w -> x [arrowhead=none];
}

v [shape=promoter label=""];
w [shape=cds label="Hotel"];
x [shape=terminator label=""];

Charlie -> v [arrowhead=tee];
w -> Hotel;

subgraph cluster6 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
y -> z [arrowhead=none];
z -> aa [arrowhead=none];
}

y [shape=promoter label=""];
z [shape=cds label="Foxtrot"];
aa [shape=terminator label=""];

Hotel -> y [arrowhead=tee];
India -> y [arrowhead=tee];

z -> Foxtrot;

subgraph cluster7 {
color=gray;
style=filled;
node [style=filled fillcolor=white];
bb -> cc [arrowhead=none];
cc -> dd [arrowhead=none];
dd -> ee [arrowhead=none];
}

bb [shape=promoter label=""];
cc [shape=cds label="EBFP2"];
dd [shape=cds label="Foxtrot"];
ee [shape=terminator label=""];

Foxtrot -> bb;
dd -> Foxtrot;

cc -> EBFP2;

}

Caveats:

Color and labelling doesn’t work as nicely as the non-SBOLv symbols.

Labels that include a double-stranded DNA line, such as the promoter, has to have labelloc set to “b”. This is to avoid the intersection of the label and the double-stranded DNA line, since labels are automatically placed in the center of the nodes.


Hef1a [shape=promoter];


Hef1a [shape=promoter labelloc="b"];

Also, for the aforementioned shapes, colorfill has to be specified instead of color. color will color the outline of the node shape, potentially causing non-consistent colorations of the double-stranded DNA line between connected nodes.


Hef1a [shape=promoter labelloc="b" style=filled colorscheme=greens3 color=3];


Hef1a [shape=promoter labelloc="b" style=filled colorscheme=greens3 fillcolor=3];

Acknowledgements:

Thanks to Reshma Shetty and Jake Beal for the inspiration.

[updated: Graphviz + SBOLv1.0]

1. Introduction

Graphviz is a powerful open-source tool that visualizes graphs and networks.

By implementing a few meaningful shapes, I tapped its diagramming ability to draw genetic circuits. Genetic circuit diagrams now can be specified by a simple text file. Graphviz‘s visualization algorithms handles all placements and alignments. Only the node names and edges need to be specified. Below is an example of a genetic circuit generated by Graphviz.

I was inspired to create this tool after tediously piecing together cookie-cutter shapes for the 2011 iGEM competition. For our iGEM project, a lot of sub-circuits were recycled, without a good way of recycling their corresponding diagrams. With my new node shapes in Graphviz, specifying circuit modules is as easy as a few short lines of text. With a little scripting, Graphviz lends itself to rapid genetic circuit diagram generation, and become far more efficient and powerful than copy-and-paste methods or GUI-based tools.

an update of the project is available with SBOLv compliant symbols

2. Download

The custom genetic circuit shapes are lpromoter, larrow, rpromoter, and rarrow, each corresponding to the left and right promoter and left and right arrow shapes.

They have been incorporated into the official Graphviz node shapes.

Download Graphviz from the official site

As a backup, I also host two builds. First is a in-source build, ready-to-use for Linux. It’s the stable release of Graphviz 2.28  with the added shapes. Second is a development build of Graphviz 2.29 installable on MacOS. I’ve tested it on Mac OS 10.6.8, and it works.

Linux in-source build (modified Graphviz 2.28):
Download

MacOS/Snow Leopard build (Graphviz 2.29.20120828):
Download

3. Gallery

The following images are generated with the dot tool of Graphviz. Below the images are the contents of the text files used to generate those images.


digraph g {
rankdir=LR;

UAS -> NCAD [arrowhead=none];
UAS [shape=rpromoter];
NCAD [shape=rectangle];

}

digraph g {
rankdir=LR;

a -> b [arrowhead=none];
b -> c [arrowhead=none];
c -> d [arrowhead=none];
a [shape=rpromoter label="UAS"];
b [shape=rectangle label="LacI"];
c [shape=rpromoter label="UAS"];
d [shape=rectangle label="Reporter"];

}

digraph G {
rankdir=LR;

node [shape=rpromoter colorscheme=rdbu5 color=1 style=filled fontcolor=3]; Hef1a; TRE;
node [shape=rarrow colorscheme=rdbu5 color=5 style=filled fontcolor=3]; rtTA3; DeltamCherry;
product [shape=oval style=filled colorscheme=rdbu5 color=2 label=""];
node [shape=oval style=filled colorscheme=rdbu5 color=4 fontcolor=5];
combination [label="rtTA3 + Doxycycline"];
rtTA3protein [label="rtTA3"];

subgraph cluster_0 {
color=white;
Hef1a -> rtTA3 [arrowhead=none];
rtTA3 -> TRE [arrowhead=none];
TRE -> DeltamCherry [arrowhead=none];
}

rtTA3 -> rtTA3protein;
rtTA3protein -> combination;
Doxycycline -> combination;
combination -> TRE;
DeltamCherry -> product;

Hef1a [shape=rpromoter colorscheme=rdbu5 color=1 fontcolor=3 style=filled];
rtTA3 [shape=rarrow colorscheme=rdbu5 color=5 fontcolor=3 style=filled];
TRE [shape=rpromoter colorscheme=rdbu5 color=1 fontcolor=3 style=filled];
DeltamCherry [shape=rarrow colorscheme=rdbu5 color=5 fontcolor=3 style=filled label="Delta-mCherry"];

Doxycycline [style=filled colorscheme=rdbu5 color=4 fontcolor=5];
rtTA3protein [style=filled colorscheme=rdbu5 color=4 label="rtTA3" fontcolor=5];
combination [style=filled colorscheme=rdbu5 color=4 label="rtTA + Doxcycline" fontcolor=5];
product [style=filled colorscheme=rdbu5 color=2 label=""];
}

digraph g {
rankdir=LR;

node [shape=rpromoter colorscheme=rdbu5 color=1 style=filled fontcolor=3]; Hef1a; TRE; UAS; Hef1aLacOid;
Hef1aLacOid [label="Hef1a-LacOid"];
node [shape=rarrow colorscheme=rdbu5 color=5 style=filled fontcolor=3]; Gal4VP16; LacI; rtTA3; DeltamCherry;
Gal4VP16 [label="Gal4-VP16"];
product [shape=oval style=filled colorscheme=rdbu5 color=2 label=""];
repression [shape=oval label="LacI repression" fontcolor=black style=dotted];
node [shape=oval style=filled colorscheme=rdbu5 color=4 fontcolor=5];
combination [label="rtTA3 + Doxycycline"];
LacIprotein [label="LacI"];
rtTA3protein [label="rtTA3"];
Gal4VP16protein [label="Gal4-VP16"];

subgraph cluster_0 {
colorscheme=rdbu5;
color=3;
node [colorscheme=rdbu5 fontcolor=3];
Hef1a -> Gal4VP16 [arrowhead=none];
Gal4VP16 -> UAS [arrowhead=none];
UAS -> LacI [arrowhead=none];
LacI -> Hef1aLacOid [arrowhead=none];
Hef1aLacOid -> rtTA3 [arrowhead=none];
rtTA3 -> TRE [arrowhead=none];
TRE -> DeltamCherry [arrowhead=none]
}

Gal4VP16 -> Gal4VP16protein;
Gal4VP16protein -> UAS;
LacI -> LacIprotein;
LacIprotein -> repression;
repression -> Hef1aLacOid [arrowhead=tee];
IPTG -> repression [arrowhead=tee];
rtTA3 -> rtTA3protein;
rtTA3protein -> combination;
combination -> TRE;
Doxycycline -> combination;
DeltamCherry -> product;

}

5. Acknowledgment

Special thanks to my friends Robert McIntyre and Dylan Holmes for helping me to compile GraphViz.