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> </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>