22 个版本

0.5.1 2020 年 6 月 15 日
0.4.12 2020 年 5 月 29 日
0.4.7 2020 年 3 月 4 日
0.4.5 2019 年 11 月 28 日
0.1.4 2019 年 7 月 18 日

#207 in 科学

Download history 49/week @ 2024-03-31

70 每月下载量
用于 2 crates

MIT/Apache

195KB
4.5K SLoC

Codenano

安装

不要忘记克隆子模块的内容,请使用以下命令 git clone https://github.com/thenlevy/codenano.git --recursive

需求

  • 您需要 Docker 来构建用户空间。本教程假定您知道如何从现有的 Dockerfile 构建 Docker 镜像。
  • 安装 Codenano 最简单的方法是使用 Nix 软件包管理器

在仓库根目录下运行 nix-shell。一旦启动了 nix-shell,请运行 make。如果一切顺利,这将显示在 stdout 上的生成的 .json 文件。

构建 Docker 镜像并将其标记为 codenano 以准备用户空间 docker build . -t codenano

现在您可以启动服务器了,请切换到 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表示反义)
  • beginend 是要添加核苷酸的轴的第一个和最后一个(包括)坐标
  • 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)的条款下分发的

依赖关系

~6MB
~121K SLoC