11个版本
0.4.0 | 2020年5月11日 |
---|---|
0.3.9 | 2019年11月22日 |
0.3.4 | 2019年10月10日 |
0.3.3 | 2019年9月21日 |
0.3.0 | 2019年8月29日 |
#2 in #molecular
每月下载量 32次
455KB
5.5K SLoC
Codenano
安装
别忘了也要克隆子模块的内容 git clone https://github.com/thenlevy/codenano.git --recursive
.
需求
在存储库根目录下运行nix-shell
。一旦运行了nix-shell,运行make
。如果一切顺利,这将显示一个生成的.json
文件在stdout
上。
构建Docker镜像并将其标记为codenano
,以准备用户空间 docker build . -t codenano
。
现在您可以启动服务器了 cd
到 server
并运行 cargo r -- --static ../static &
。Codenano现在在localhost:4000
上运行。
设计纳米结构
入门
您可以将此代码复制粘贴以生成一个双交叉
use codenano::*;
pub fn main() {
let mut ori = Nanostructure::new();
let id_0 = ori.add_grid_helix(0, 0);
let id_1 = ori.add_grid_helix(1, 0);
ori.draw_strand(id_0, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_0, true, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, true, 0, 20, AUTO_COLOR);
ori.make_jump(ori.get_nucl(id_1, 11, false), ori.get_nucl(id_0, 11, true));
ori.make_jump(ori.get_nucl(id_0, 12, true), ori.get_nucl(id_1, 12, false));
ori.finish();
}
螺旋、链和核苷酸
在Codenano
中,设计是通过在螺旋上绘制链
并在那些链之间进行跳跃来制作的。螺旋可以看作是双无限双轴,具有整数坐标。螺旋作为核苷酸的支持。在每个螺旋上有一个“感觉”轴,链从5'到3'通过增加其坐标进行,还有一个“反义”轴,链从5'到3'通过减少其坐标进行。每个核苷酸由3个值标识
- 它所在的螺旋的标识符(一个整数)
- 它在轴上的坐标(一个整数)
- 一个布尔值,表示核苷酸是在反义轴(true)还是在义轴(false)上
通过指定空间中的一个点作为起点,以及3个角度来指定它们的翻滚、偏航和俯仰
还有一个简单的版本来创建螺旋。函数add_grid_helix(i, j)
在网格中创建一个以方格(i,j)
为起点的螺旋。这个函数创建的所有螺旋都是平行的,且俯仰、偏航和翻滚均为0。
当它们被创建时,螺旋上没有核苷酸。要添加核苷酸,请使用函数draw_strand(id, antisense, begin, end, color)
,其中
id
是螺旋标识符antisense
是一个布尔值,表示我们在螺旋的哪个轴上绘制(false表示义轴,true表示反义轴)begin
和end
是添加核苷酸的轴上的第一个和最后一个(包含)坐标color
是要绘制的链的颜色。可以使用十六进制RGB指定颜色,或者当感到缺乏灵感时使用AUTO_COLOR
。
use codenano::*;
pub fn main() {
let mut ori = Nanostructure::new();
let id_0 = ori.add_grid_helix(0, 0);
let id_1 = ori.add_helix(0., 0.2, 0., 0., 0., 0.);
// ^ This helix is parallel to id_0
let id_2 = ori.add_helix(0., 0.5, -1., 0., 3.14/4., 3.14/6.);
// ^ This helix has different orientation
ori.draw_strand(id_0, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_0, true, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, true, 0, 20, AUTO_COLOR);
// green strand
ori.draw_strand(id_2, false, 0, 40, 0x00FF00);
// blue strand
ori.draw_strand(id_2, true, 0, 40, 0x0000FF);
ori.finish();
}
跳跃
链确定核苷酸之间的共价键的位置。如果两个相邻的核苷酸在同一个链上,它们之间就有共价键。也可以通过在两个核苷酸之间创建一个jump
来创建一个共价键。从链s1
上的一个核苷酸跳跃到链s2
上的另一个核苷酸有以下效果
- s1的5'端和s2的3'端合并为一个链
- s1的3'端成为一个新的独立链
- s2的5'端成为一个新的独立链
use codenano::*;
pub fn main() {
let mut ori = Nanostructure::new();
let id_0 = ori.add_grid_helix(0, 0);
let id_1 = ori.add_helix(0., 0.2, 0., 0., 0., 0.);
// ^ This helix is parallel to id_0
ori.draw_strand(id_0, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_0, true, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, true, 0, 20, AUTO_COLOR);
ori.make_jump(ori.get_nucl(id_0, 11, false), ori.get_nucl(id_1, 11, false));
ori.finish();
}
示例
双重交叉
use codenano::*;
pub fn main() {
let colors: Vec<u32> =vec![0x1f1f1f, 0xf81118,0xecba0f,0x2a84d2,
0x4e5ab7, 0xd6dbe5, 0x1dd361, 0x0f7ddb];
let mut ori = Nanostructure::new();
let id_0 = ori.add_grid_helix(0, 0);
let id_1 = ori.add_grid_helix(1, 0);
ori.draw_strand(id_0, false, 0, 20, colors[6]);
ori.draw_strand(id_0, true, 0, 20, colors[1]);
ori.draw_strand(id_1, false, 0, 20, colors[2]);
ori.draw_strand(id_1, true, 0, 20, colors[3]);
ori.make_jump(ori.get_nucl(id_1, 11, false), ori.get_nucl(id_0, 11, true));
ori.make_jump(ori.get_nucl(id_0, 12, true), ori.get_nucl(id_1, 12, false));
ori.finish();
}
单链瓷砖
use codenano::*;
const tile_length:isize = 11;
static mut colornum:usize = 0;
pub fn add_sst(ori: &mut Nanostructure, helix_id: usize, helix_pos: isize) {
let colors: Vec<u32> =vec![0x1f1f1f, 0xf81118,0xecba0f,0x2a84d2,
0x4e5ab7, 0xd6dbe5, 0x1dd361, 0x0f7ddb];
let mut color = 0;
unsafe {
color = colors[ (1 * colornum) % colors.len()];
colornum += 1; }
ori.draw_strand(helix_id, false, helix_pos, helix_pos + tile_length, color);
ori.draw_strand(helix_id + 1, true, helix_pos + tile_length, helix_pos, color);
ori.make_jump(ori.get_nucl(helix_id, helix_pos +tile_length, false),
ori.get_nucl(helix_id + 1, helix_pos + tile_length, true));
}
pub fn main() {
let mut ori = Nanostructure::new();
let id_0 = ori.add_grid_helix(0, 0);
let id_1 = ori.add_grid_helix(1, 0);
let id_2 = ori.add_grid_helix(2, 0);
let id_3 = ori.add_grid_helix(3, 0);
let id_4 = ori.add_grid_helix(4, 0);
let id_5 = ori.add_grid_helix(5, 0);
let id_6 = ori.add_grid_helix(6, 0);
for i in 0isize..5 {
for j in 0usize..3 {
add_sst(&mut ori, j * 2, i * tile_length + i);
add_sst(&mut ori, j * 2 + 1, i * tile_length + i + tile_length/2);
}
}
ori.finish();
}
高级用户功能
更改常量
有两个常量可以更改。第一个是每转的碱基对数,第二个是两个反向对之间的角度。
默认情况下,每转的碱基对数是10.4,两个反向对之间的角度是220度(而不是180度,这就是为什么有主/次沟槽)。要更改这些,必须创建一个DNAConst
对象,修改其值,并将其作为Nanostructure
对象构造函数的参数传递。
use codenano::*;
pub fn main() {
let mut cst = DNAConst::default();
cst.set_bpp(10.7); // number of base pair per turn
cst.set_groove(3.14); // pi angle => no minor/major groove
let mut ori = Nanostructure::with_constant(cst);
let id_0 = ori.add_grid_helix(0, 0);
let id_1 = ori.add_grid_helix(1, 0);
ori.draw_strand(id_0, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_0, true, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, false, 0, 20, AUTO_COLOR);
ori.draw_strand(id_1, true, 0, 20, AUTO_COLOR);
ori.make_jump(ori.get_nucl(id_1, 11, false), ori.get_nucl(id_0, 11, true));
ori.make_jump(ori.get_nucl(id_0, 12, true), ori.get_nucl(id_1, 12, false));
ori.finish();
}
许可
Codenano在MIT许可和Apache许可(版本2.0)的条款下分发
依赖项
~21–31MB
~519K SLoC