github上一个共线性作图的perl代码和在线网站

https://github.com/LyonsLab/coge
 

CoGe (Comparative Genomics) Platform

 

CoGe is a web-based platform that provides tools and databases to assist biologists with comparative genomics research. http://genomevolution.org

 

For detailed installation instructions please visit: http://genomevolution.org/wiki/index.php/Install_coge

 

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use DBI;     # 数据库接口
use JSON;    # 处理JSON数据

# 创建CGI对象
my $cgi = CGI->new();

# 网站根目录和配置
my $base_url = "http://cucurbitgenomics.org";
my $v2_path = "/v2";
my $js_path = "$v2_path/javascript";

# 获取查询参数
my $block_id = $cgi->param('block');
my $query_genome_id = $cgi->param('query') || '29';  # 默认是瓶葫芦(Bottle gourd)
my $target_genome_id = $cgi->param('target') || '6'; # 默认是佛手瓜(Chayote)
my $chromosome = $cgi->param('chr') || 'Chr05';      # 默认染色体

# 连接Tripal/Chado数据库
my $dbh = DBI->connect(
    "DBI:Pg:database=cucurbit_genomics;host=localhost", 
    "db_user", "db_password"
) or die "无法连接数据库: $DBI::errstr";

# 设置HTTP响应头
print $cgi->header(-type => 'text/html', -charset => 'utf-8');

# 获取基因组信息
sub get_genome_info {
    my ($genome_id) = @_;
    my $query = "SELECT * FROM organism WHERE organism_id = ?";
    my $sth = $dbh->prepare($query);
    $sth->execute($genome_id);
    return $sth->fetchrow_hashref();
}

# 获取染色体信息
sub get_chromosome_info {
    my ($genome_id, $chr_name) = @_;
    my $query = "SELECT * FROM feature WHERE organism_id = ? AND uniquename = ? AND type_id = 
                 (SELECT cvterm_id FROM cvterm WHERE name = 'chromosome')";
    my $sth = $dbh->prepare($query);
    $sth->execute($genome_id, $chr_name);
    return $sth->fetchrow_hashref();
}

# 获取共线性区块列表
sub get_synteny_blocks {
    my ($query_genome_id, $target_genome_id, $chromosome) = @_;
    
    # 假设有一个存储共线性数据的表
    my $query = "SELECT block_id, query_location, target_location, score, evalue, query_strand, target_strand 
                 FROM synteny_blocks 
                 WHERE query_organism_id = ? AND target_organism_id = ? AND query_location LIKE ?
                 ORDER BY query_location";
    
    my $sth = $dbh->prepare($query);
    $sth->execute($query_genome_id, $target_genome_id, "$chromosome:%");
    
    return $sth->fetchall_arrayref({});
}

# 生成页面HTML头部
sub print_html_header {
    my ($query_genome, $target_genome, $chromosome) = @_;
    
    print <<HTML;
<!DOCTYPE html>
<html>
<head>
  <title>CuGenDBv2</title>
  <!-- 此处省略众多CSS和JS引用 -->
  <script src="$js_path/jquery.min.js"></script>
  <script src="$js_path/bootstrap.min.js"></script>
  <script src="$js_path/d3.v3.min.js" charset="utf-8"></script>
  <script src="$base_url$js_path/bam2x.circos.js"></script>
  <!-- 其他JavaScript引用省略 -->
</head>
<body class="navbar-is-fixed-top html front not-logged-in two-sidebars page-node">
  <!-- 导航菜单代码省略 -->
  <div class="main-container container">
    <!-- 页面头部省略 -->
    <div class="row">
      <section class="col-sm-12">
        <a id="main-content"></a>
        <h1 class="page-header">Search Result for Synteny Blocks</h1>
        <div class="region region-content">
          <section id="block-system-main" class="block block-system clearfix">
            <div class="row">
              <div class="col-md-10 col-md-offset-1">
                <div class="table-responsive">
                  <table class="table table-striped">
                    <tr><td><b>Query genome:</b> <a href=$v2_path/organism/$query_genome->{organism_id}>$query_genome->{common_name}</a> (<b>chromosome</b>: $chromosome)</td></tr>
                    <tr><td><b>Genome for comparison:</b> <a href=$v2_path/organism/$target_genome->{organism_id}>$target_genome->{common_name}</a></td></tr>
                    <tr><td>&nbsp;</td></tr>
                  </table>
                </div>
              </div>
            </div>
HTML
}

# 生成环形图所需的数据
sub generate_circos_data {
    my ($blocks, $query_chr_info, $target_chromosomes) = @_;
    
    # 构建染色体信息字符串
    my $ideogram_string = '"id":"'.$query_chr_info->{uniquename}.'","length":'.$query_chr_info->{seqlen}.',"color":"#7777f6","chr":"'.$query_chr_info->{uniquename}.'"';
    
    # 添加目标基因组的染色体信息
    foreach my $chr_id (sort keys %$target_chromosomes) {
        my $chr_info = $target_chromosomes->{$chr_id};
        $ideogram_string .= '|"id":"'.$chr_info->{uniquename}.'","length":'.$chr_info->{seqlen}.',"color":"#f67777","chr":"'.$chr_info->{uniquename}.'"';
    }
    
    # 构建连接数据字符串
    my $link_string = '';
    my $first = 1;
    
    foreach my $block (@$blocks) {
        # 解析位置信息
        my ($q_chr, $q_start, $q_end) = split(/[:\.]+/, $block->{query_location});
        my ($t_chr, $t_start, $t_end) = split(/[:\.]+/, $block->{target_location});
        
        # 添加分隔符
        if (!$first) {
            $link_string .= '#';
        } else {
            $first = 0;
        }
        
        # 构建连接数据
        $link_string .= $block->{block_id}.'|"name":"'.$q_chr.'","chr":"'.$q_chr.'","start":'.$q_start.',"end":'.$q_end.',"id":"'.$q_chr.'","color":"blue"|'.
                        '"name":"'.$t_chr.'","chr":"'.$t_chr.'","start":'.$t_start.',"end":'.$t_end.',"id":"'.$t_chr.'","color":"blue"';
    }
    
    return ($ideogram_string, $link_string);
}

# 生成共线性区块表格
sub print_blocks_table {
    my ($blocks, $query_genome_name, $target_genome_name) = @_;
    
    print <<HTML;
<div id="canvas"></div>
<div class="row">
  <div class="col-md-10 col-md-offset-1">
    <div class="table-responsive">
      <table width=1140 class="table table-striped">
        <tr>
          <td width=15% align=center><b>Block</b></td>
          <td align=center width=33%><b>$query_genome_name (location)</b></td>
          <td align=center width=32%><b>$target_genome_name (location)</b></td>
          <td width=10% align=center><b>Score</b></td>
          <td align=center><b>E value</b></td>
        </tr>
HTML
    
    foreach my $block (@$blocks) {
        my $query_strand = $block->{query_strand} eq '+' ? "(+)" : "(-)";
        my $target_strand = $block->{target_strand} eq '+' ? "(+)" : "(-)";
        
        print <<HTML;
        <tr>
          <td align=center><a href=/cgi-bin/synview?block=$block->{block_id}>$block->{block_id}</a></td>
          <td align=center>$block->{query_location} $query_strand</td>
          <td align=center>$block->{target_location} $target_strand</td>
          <td align=center>$block->{score}</td>
          <td align=center>$block->{evalue}</td>
        </tr>
HTML
    }
    
    print "</table></div></div></div>";
}

# 生成环形图JavaScript
sub print_circos_script {
    my ($ideogram_string, $link_string) = @_;
    
    print <<JAVASCRIPT;
<script>
\$(document).ready(function(C) {
    var svg = d3.select("#canvas").append("svg").attr("width",1000).attr("height",800);
    var ideogramString = '$ideogram_string';
    var strArray = ideogramString.split("|");
    var collection = [];

    for(var i = 0; i < strArray.length; i++){
        var ideModel = new bam2x.circos.IdeogramModel(JSON.parse("{" + strArray[i] + "}"));
        collection.push(ideModel);
    }
    var ideogramTrack = new bam2x.circos.IdeogramTrack({"collection":collection,"el":svg.append("g"),"cx":550,"cy":450,"outerRadius":400,"innerRadius":380,"gapAngle":0.02});
    ideogramTrack.render(true);
    var linkString = '$link_string';
    var strLinkArray = linkString.split("#");
    var linksCollection = [];

    for(var j = 0; j < strLinkArray.length; j++) {
        var strBedArray = strLinkArray[j].split("|");
        var linkBed1 = strBedArray[0];
        var linkBed2 = new bam2x.circos.BedModel(JSON.parse("{" + strBedArray[1] + "}")); 
        var linkBed3 = new bam2x.circos.BedModel(JSON.parse("{" + strBedArray[2] + "}"));
        console.log(linkBed1);
        var linkModel = {};
        linkModel.bid = linkBed1;
        linkModel.source = linkBed2;
        linkModel.target = linkBed3;
        var links = new bam2x.circos.LinkModel(linkModel);
        linksCollection.push(links);
    }

    var linkTrack = new bam2x.circos.LinkTrack({"collection":linksCollection,"el":svg.append("g"),"cx":550,"cy":450,'radius':380});
    linkTrack.render(ideogramTrack);
}(bam2x.circos))
</script>
JAVASCRIPT
}

# 生成HTML页脚
sub print_html_footer {
    print <<HTML;
          </section>
        </div>
      </section>
    </div>
  </div>
  <footer class="footer"> 
    <div class="container">
      <div class="region region-footer">
        <section id="block-block-1" class="block block-block clearfix">
          <table style="width:100%"><tbody><tr><td>
          <p><strong>CuGenDB</strong> is developed by <a href="http://bioinfo.bti.cornell.edu" target="_blank">Feilab</a> and host at <a href="http://bti.cornell.edu" target="_blank">BTI</a><br />
            This website is compatible with <a href="https://www.google.com/chrome/" target="_blank">Chrome</a> and <a href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a></p>
          </td>
          <td class="rteright"><a href="https://btiscience.org/" target="_blank"><img alt="" src="/sites/default/files/img/bti_logo_2016.png" style="height:50px; width:115px" /></a>    <a href="https://nifa.usda.gov/" target="_blank"><img alt="" src="/sites/default/files/img/usda_logo2.png" /></a>    <a href="http://tripal.info/" target="_blank"><img alt="" src="/sites/default/files/img/powered_by_tripal_small.png" /></a></td>
          </tr></tbody></table>
        </section>
      </div>
    </div>
  </footer>
  <script src="$base_url$v2_path/sites/all/themes/bootstrap/js/bootstrap.js?r6r7lq"></script>
</body>
</html>