view chr_plot.pl @ 15:0e4b6b0c6e9d draft

Uploaded
author big-tiandm
date Wed, 29 Oct 2014 04:20:16 -0400
parents 07745c0958dd
children
line wrap: on
line source

#!/usr/bin/perl -w
#==========================================================================================
# Date: 
# Title: 
# Comment: Program to plot gene structure
# Input: 1. input file of Gene region annotation which format like GenePred
#        2. input file of Transcripts region annotation which format like GenePred
#        3. input file of gene snp detail info
# Output: output file of gene structure graph by html or svg formt
# Test Usage: 
#========================================================================================
#use strict;
my $version=1.00;
use SVG;
use Getopt::Long;
my %opt;
GetOptions(\%opt,"g=s","l=s","chro=s","mark=s","span=s","te=s","t=s","cen=s","c=s","o=s","out=s","h");
if (!(defined $opt{g} and defined $opt{c} and defined $opt{l} and defined $opt{chro} and defined $opt{mark} and defined $opt{o}) || defined $opt{h}) {
&usage;
}
my $span=$opt{span};
#===============================Define Attribute==========================================
my %attribute=(
	canvas=>{
		'width'=>1500,
		'height'=>1800
	},
	text=>{
		'stroke'=>"#000000",
		'fill'=>"none",
		'stroke-width'=>0.5
	},
	line=>{
		'stroke'=>"black",
		'stroke-width'=>1
	},
	csv=>{
		'stroke'=>"red",
		'stroke-width'=>0.5
	},
	exon=>{
		'stroke'=>"black",
		'stroke-width'=>1
	},
	intron=>{
		'stroke'=>"black",
		'stroke-width'=>1.5
	},
	font=>{
		'fill'=>"#000000",
		'font-size'=>12,
		'font-size2'=>10,
		#'font-weight'=>'bold',
		'font-family'=>"Arial"
		#'font-family'=>"ArialNarrow-bold"
	},
	rect=>{
		'fill'=>"lightgreen",
		'stroke'=>"black",
		'stroke-width'=>0.5
	},
	readwidth=>0.5
);
#############################s#define start coordinate and scale

my $length=$opt{"l"};#11
#my @target_e_value=qw(1.78 1.83 1.92 2.00 1.92 2.00 1.93 2.11 2.05 2.03 1.92 1.91 1.54 1.72 1.67);

my $chr=$opt{"chro"};
my $start=1;
my $XOFFSET=50;
my $YOFFSET=60;
#my $length=$end-$start+1;
my $Xscale=600/$length;#定义X轴比例尺 1:1000 x轴的坐标长度都要按照此比例尺换算
#my $high_cov=$high_cov9B1=0.5;#定义峰图最高峰
#my $Yscale=1/$high_cov;#定义Y轴比例尺 1:60 y轴的坐标长度都要按照此比例尺换算
#========================================New canvas============================
#---------------------------------------------------------------
if (defined($opt{cen})) {
	open(CEN,"$opt{cen}")||die"cannot open the file $opt{cen}";
	my %centromere;
	while (my $aline=<CEN>) {
		chomp $aline;
		next if($aline=~/^\#/);
		my @temp=split/\t/,$aline;
		$centromere{$temp[0]}[0]=$temp[1];
		$centromere{$temp[0]}[1]=$temp[2];
	}
	close CEN;
}

####    Starting    ####
#新建画布
my $svg=SVG->new();
#画图起始点
my $canvas_start_x=$XOFFSET;
my $canvas_end_x=$XOFFSET+$length*$Xscale;#按照比例尺 画线
my $canvas_start_y=$YOFFSET;
my $canvas_end_y=$YOFFSET;
#Draw a straight line between two points start(x1,y1) and end(x2,y2).
#location attribute
$svg->line(id=>'l1',x1=>$canvas_start_x,y1=>$canvas_start_y,x2=>$canvas_end_x,y2=>$canvas_end_y,'stroke',$attribute{line}{'stroke'},'stroke-width',$attribute{line}{'stroke-width'});
$long_scale=int ($length/10);#十等分 大刻度
#大坐标刻度
for ($i=0;$i<=10;$i++) {
	my $long_x_start=$XOFFSET+$long_scale*$i*$Xscale;
	my $long_x_end=$long_x_start;
	my $long_y_start=$YOFFSET;
	my $long_y_end=$YOFFSET-5;
	$svg->line('x1',$long_x_start,'y1',$long_y_start,'x2',$long_x_end,'y2',$long_y_end,'stroke',$attribute{line}{'stroke'},'stroke-width',$attribute{line}{'stroke-width'});
	my $Bscale=$start+$long_scale*$i;
	my $cdata=int ($Bscale/1000000);
	$svg->text('x',$long_x_start,'y',$long_y_start-10,'style','fill:black;text-anchor:middle','stroke',$attribute{text}{'stroke'},'stroke-width',$attribute{text}{'stroke-width'},'font-size',12,'font-family',$attribute{font}{'font-family'},'-cdata',$cdata."M");
}

if (defined($opt{cen})) {
	$svg->rect('x',$XOFFSET+$centromere{$chr2}[0]*$Xscale,'y',$YOFFSET-2,'width',($centromere{$chr2}[1]-$centromere{$chr2}[0]+1)*$Xscale,'height',5,'stroke',"black",'stroke-width',"5",'fill',"black");

	$svg->rect('x',$XOFFSET+$length*$Xscale+15,'y',$YOFFSET+20,'width',10,'height',5,'stroke',"black",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"black");
	$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$YOFFSET+20+5,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"Centromere");
}

$svg->text('x',$XOFFSET+$length*$Xscale*0.42,'y',$YOFFSET-30,'stroke',"black",'stroke-width',1,'font-size',15,'font-family',$attribute{font}{'font-family'},'-cdata',$chr);
#====================================================MAIN PROGRAM========================

#===========================================gene list data================================
#open (TXT,">$opt{out}");
#open(TE,"$opt{te}")||die"cannot open the file $opt{te}";
#my %te;
#while (my $aline=<TE>) {
#	chomp $aline;
#	my @temp=split/\t/,$aline;
#	if ($temp[2] eq "Y") {
#		$te{$temp[0]}=1;
#	}
#}
#close TE;
#===================================Exp gene list data =================================
#open(TARGET,"$opt{t}")||die"cannot open the file $opt{t}";
#my %target_e;
#my %target_rpkm;
#while (my $aline=<TARGET>) {
#	chomp $aline;##Gene	19B1	1PA1	1LC1	29B2	2PA2	2LC2	39B3	3PA3	3LC3	93-4C	PA-4C	LY-4C	9343	PA43	LY43	19B1_VS_1LC1	19B1_VS_1PA1	1PA1_VS_1LC1	29B2_VS_2LC2	29B2_VS_2PA2	2PA2_VS_2LC2	39B3_VS_3LC3	39B3_VS_3PA3	3PA3_VS_3LC3	934C_LY4C	934C_PA4C	PA4C_LY4C	9343_VS_LY43	9343_VS_PA43	PA43_VS_LY43	mpv_1	fold_1	mpv_2	fold_2	mpv_3	fold_3	mpv_4_B	fold_4_B	mpv_leaf	fold_lead
#	next if($aline=~/^\#/);
#	my @temp=split/\t/,$aline;
#	$target_rpkm{$temp[0]}="$temp[7]\t$temp[8]\t$temp[9]";
#	if ($temp[7]>$target_e_value[6]||$temp[8]>$target_e_value[7]||$temp[9]>$target_e_value[8]) {
#		$target_e{$temp[0]}="$temp[7]\t$temp[8]\t$temp[9]";
#	}
#}
#close TARGET;
#====================================================================================
my @genelist;
#my @te_genelist;
my @target_e;
open(GENE,"$opt{g}")||die"cannot open the file $opt{g}";
while (my $aline=<GENE>) {
	chomp $aline;#LOC_Os01g01280  Chr1    133291  134685  +
	my @temp=split/\t/,$aline;
	#my $te;
	if ($temp[1]=~/^Chr(\d)$/) {
		$temp[1]="Chr0$1";
	}
	next if($temp[1] ne $chr);
	#push @genelist,[$temp[0],$temp[3],$temp[4]];
	push @genelist,[$temp[0],$temp[2],$temp[3]];
#	if ($te{$temp[0]}) {
#		push @te_genelist,[$temp[0],$temp[3],$temp[4]];
#	}
#	else{
#		push @genelist,[$temp[0],$temp[3],$temp[4]];
#		}
#	if ($target_e{$temp[0]}) {
#		push @target_e,[$temp[0],$temp[3],$temp[4]];
#	}

}
close GENE;
my @gene_desity;
#my @region_target_rpkm;
@genelist=sort{$a->[1] <=> $b->[1]}@genelist;
for (my $i=0;$i<@genelist ;$i++) {
#	if ($genelist[$i][1]>($num1+1)*$span) {
#			$num1++;
#		}
#	if ($genelist[$i][1]>$num1*$span&&$genelist[$i][1]<=($num1+1)*$span) {
#		$gene_desity[$num1]++;
#		
#	}
	my $start=int($genelist[$i][1]/$span);
	my $end=int($genelist[$i][2]/$span);
	#my @t_rpkm=split/\t/,$target_rpkm{$genelist[$i][0]};
	if ($start==$end) {
		$gene_desity[$start]++;
		#for (my $rs=0;$rs<3 ;$rs++) {
			#print TXT "$rs\t$i\t$genelist[$i][0]\t$target_rpkm{$genelist[$i][0]}\n";
			#$region_target_rpkm[$start][$rs]+=$t_rpkm[$rs];
		#}
		
		#$target_rpkm_desity[$start][0]+=$temp[0];
		#$target_rpkm_desity[$start][1]+=$temp[1];
		#$target_rpkm_desity[$start][2]+=$temp[2];
	}
	else{
		for (my $k=$start;$k<=$end ;$k++) {
			$gene_desity[$k]++;
			#for (my $rs=0;$rs<3 ;$rs++) {
				#$region_target_rpkm[$k][$rs]+=$t_rpkm[$rs];
			#}
			#$target_rpkm_desity[$k][0]+=$temp[0];
			#$target_rpkm_desity[$k][1]+=$temp[1];
			#$target_rpkm_desity[$k][2]+=$temp[2];
		}
	}
}
#------------------------------------------region_gene_number-------------------------
my $max_gene_number=0;
my $total=0;
for (my $i=0;$i<@gene_desity ;$i++) {
	if (!(defined($gene_desity[$i]))) {
		$gene_desity[$i]=0;
	}
	if ($gene_desity[$i]>$max_gene_number) {
		$max_gene_number=$gene_desity[$i];
	}
	#print TXT "$i\t$gene_desity[$i]\n";
	$total+=$gene_desity[$i];
}
print "Gene max:$max_gene_number\ntotal:$total\n";
my $abc=@genelist;
#my $cba=@te_genelist;
print "aaaaaa:$abc\n";
#print "bbbbbb:$cba\n";
#---------------------------------------------region_gene_rpkm------------------------
#my $max_region_gene_rpkm=0;
#my @max_region_gene_rpkm=qw(0 0 0);
#my @total_region_gene_rpkm=qw(0 0 0);
#for (my $i=0;$i<@region_target_rpkm ;$i++) {
#	for (my $s=0; $s<3;$s++) {
#		
#		if (!(defined($region_target_rpkm[$i][$s]))) {
#			$region_target_rpkm[$i][$s]=0;
#		}
#		$total_region_gene_rpkm[$s]+=$region_target_rpkm[$i][$s];
#		if ($max_region_gene_rpkm<$region_target_rpkm[$i][$s]) {
#			$max_region_gene_rpkm=$region_target_rpkm[$i][$s];
#		}
#		if ($max_region_gene_rpkm[$s]<$region_target_rpkm[$i][$s]) {
#			$max_region_gene_rpkm[$s]=$region_target_rpkm[$i][$s];
#		}
#	}
#}
#my @ave_region_gene_rpkm=qw(0 0 0);
#my $max_ave_rpkm=0;
#for (my $i=0;$i<3;$i++) {
#	$ave_region_gene_rpkm[$i]=$total_region_gene_rpkm[$i]/($#region_target_rpkm+1);
#	if ($max_ave_rpkm<$ave_region_gene_rpkm[$i]) {
#		$max_ave_rpkm=$ave_region_gene_rpkm[$i];
#	}
#}
#
#print "***max region gene rpkm :$max_region_gene_rpkm\n\n";
#print "@max_region_gene_rpkm\n";
#if ($max_region_gene_rpkm>10*$max_ave_rpkm) {
#	$max_region_gene_rpkm=10*$max_ave_rpkm;
#}
#my @max_region_rpkm;
#----------------------------------------------------------------------------------
#my @te_gene_desity;
#@te_genelist=sort{$a->[1] <=> $b->[1]}@te_genelist;
##my $num2=0;
#for (my $i=0;$i<@te_genelist ;$i++) {
##	if ($te_genelist[$i][1]>($num2+1)*$span) {
##		$num2=int($te_genelist[$i][1]/$span);
##	}
##	if ($te_genelist[$i][1]>$num2*$span&&$te_genelist[$i][1]<=($num2+1)*$span) {
##		$te_gene_desity[$num2]++;
##	}	
#	my $start=int($te_genelist[$i][1]/$span);
#	my $end=int($te_genelist[$i][2]/$span);
#	if ($start==$end) {
#		$te_gene_desity[$start]++;
#	}
#	else{
#		for (my $k=$start;$k<=$end ;$k++) {
#			$te_gene_desity[$k]++;
#		}
#	}
#}
#$max_te_gene_number=0;
#$total=0;
#for (my $i=0;$i<@te_gene_desity ;$i++) {
#	if (!(defined($te_gene_desity[$i]))) {
#		$te_gene_desity[$i]=0;
#	}
#	if ($te_gene_desity[$i]>$max_te_gene_number) {
#		$max_te_gene_number=$te_gene_desity[$i];
#	}
#	print TXT "$i\t$te_gene_desity[$i]\n";
#	$total+=$te_gene_desity[$i];
#}
#
#print "TE gene max:$max_te_gene_number\ntotal:$total\n";
#-------------------------------------------------------
#my @target_e_desity;
#@target_e=sort{$a->[1] <=> $b->[1]}@target_e;
#for (my $i=0;$i<@target_e ;$i++) {	
#	my $start=int($target_e[$i][1]/$span);
#	my $end=int($target_e[$i][2]/$span);
#	if ($start==$end) {
#		$target_e_desity[$start]++;
#	}
#	else{
#		for (my $k=$start;$k<=$end ;$k++) {
#			$target_e_desity[$k]++;
#		}
#	}
#}
#my $max_target_e_number=0;
#$total=0;
#for (my $i=0;$i<@target_e_desity ;$i++) {
#	if (!(defined($target_e_desity[$i]))) {
#		$target_e_desity[$i]=0;
#	}
#	if ($target_e_desity[$i]>$max_target_e_number) {
#		$max_target_e_number=$target_e_desity[$i];
#	}
#	print TXT "$i\t$target_e_desity[$i]\n";
#	$total+=$target_e_desity[$i];
#}
#
#print "Target max:$max_target_e_number\ntotal:$total\n";

#====================================cluster data=======================================
open(CLUSTER,"$opt{c}")||die"cannot open the file $opt{c}";
my $mark="$opt{mark}";
my @sample=split/\#/,$mark;
my $sample_num=@sample;
my @cluster;
my @cluster_density;
my @max_cluster_read=(0)x$sample_num;
while (my $aline=<CLUSTER>) {
	next if($aline=~/^\#/);
	chomp $aline;##ID	chr	strand	start	end	19B1
	#clusterID	major_length	 percent	sample1	sample2	sample3
	#Chr01:192429-192452	24nt	1.00	0.00	97222.22	0.00
	my @temp=split/\t/,$aline;
	my @id=split/\:/,$temp[0];
	my @posit=split/\-/,$id[1];
	next if($id[0] ne $chr);#Chr.01 chr04
	push @cluster,[$id[0],$posit[0],$posit[1],@temp[3..3+$sample_num+1]];
	#push @cluster,[$temp[0],$temp[3],$temp[4],$temp[11],$temp[12],$temp[13]];#ID	start	end	rpkm(19B1,1PA1,1LC1);
	for (my $i=0;$i<@sample ;$i++) {
		if($temp[3+$i]>$max_cluster_read[$i]){
			$max_cluster_read[$i]=$temp[3+$i];
		}
	}
}
close CLUSTER;
@cluster=sort{$a->[1] <=> $b->[1]}@cluster;
for(my $i=0;$i<$#cluster;$i++) {
	my $start=int($cluster[$i][1]/$span);
	my $end=int($cluster[$i][2]/$span);
	if ($start==$end) {
		for (my $j=0;$j<$sample_num ;$j++) {
			$cluster_density[$start][$j]+=$cluster[$i][$j+$sample_num];
		}
		
	}
	else{
		for (my $m=$start;$m<=$end ;$m++) {
			for (my $j=0;$j<$sample_num ;$j++) {
				$cluster_density[$m][$j]+=$cluster[$i][$j+$sample_num];
			}
		}
	}
}
my @max_cluster_density=(0)x$sample_num;
my @total_cluster_density=(0)x$sample_num;
my $max_cluster_density=0;
for (my $i=0;$i<@sample;$i++) {
	for (my $k=0;$k<$#cluster_density ;$k++) {
		
		if (!(defined($cluster_density[$k][$i]))) {
			$cluster_density[$k][$i]=0;
		}
		$total_cluster_density[$i]+=$cluster_density[$k][$i];
		if ($cluster_density[$k][$i]>$max_cluster_density[$i]) {
			$max_cluster_density[$i]=$cluster_density[$k][$i];
		}
		if ($cluster_density[$k][$i]>$max_cluster_density) {
			$max_cluster_density=$cluster_density[$k][$i];

		}
	}	
}
my @ave_cluster_density=(0)x$sample_num;
my $max_ave=0;
for (my $i=0;$i<@sample;$i++) {
	$ave_cluster_density[$i]=$total_cluster_density[$i]/($#cluster_density+1);
	if ($max_ave<$ave_cluster_density[$i]) {
		$max_ave=$ave_cluster_density[$i];
	}
}

print "max cluster reads:@max_cluster_read\n";
print "max cluster density:@max_cluster_density\n";
if ($max_cluster_density>10*$max_ave) {
	$max_cluster_density=10*$max_ave;
}
#===================================== plot gene desity =================================
#===row
my $Y1scale=5;
my $y1_gene_density=$YOFFSET+$max_gene_number*$Y1scale+10;
for (my $i=0;$i<@gene_desity-1 ;$i++) {
	my $density_start_x=$XOFFSET+$i*$span*$Xscale;
	my $density_start_y=$y1_gene_density-$gene_desity[$i]*$Y1scale;
	my $density_end_x=$XOFFSET+($i+1)*$span*$Xscale;
	my $density_end_y=$y1_gene_density-$gene_desity[$i+1]*$Y1scale;
	my $heigth=$gene_desity[$i]/$max_gene_number;
	$svg->rect('x',$density_start_x,'y',$density_start_y,'width',$span*$Xscale,'height',$y1_gene_density-$density_start_y,'stroke',"read",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"green");
	#$svg->line('x1',$density_start_x,'y1',$density_start_y,'x2',$density_end_x,'y2',$density_end_y,'stroke',"red",'stroke-width',$attribute{csv}{'stroke-width'});
	
}
$svg->line('x1',$XOFFSET,'y1',$y1_gene_density,'x2',$XOFFSET+$length*$Xscale,'y2',$y1_gene_density,'stroke',"black",'stroke-width',"black");

#====clomun
$svg->line('x1',$XOFFSET,'y1',$y1_gene_density,'x2',$XOFFSET,'y2',$y1_gene_density-$max_gene_number*$Y1scale,'stroke',"black",'stroke-width',"black");
$svg->text('x',$XOFFSET-15,'y',$y1_gene_density,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',"0");#min gene number
$svg->text('x',$XOFFSET-20,'y',$y1_gene_density-$max_gene_number*$Y1scale,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_gene_number);#max gene number
#=========================================================================================
#=============================plot TE gene desity=========================================
#===row
=cut
my $Y2scale=$Y1scale;
my $y2_te_gene_density=$y1_gene_density;
for (my $i=0;$i<@te_gene_desity-1 ;$i++) {
	my $te_density_start_x=$XOFFSET+$i*$span*$Xscale;
	my $te_density_start_y=$y2_te_gene_density+$te_gene_desity[$i]*$Y2scale;
	my $te_density_end_x=$XOFFSET+($i+1)*$span*$Xscale;
	my $te_density_end_y=$y2_te_gene_density+$te_gene_desity[$i+1]*$Y2scale;
	#my $te_heigth=$te_gene_desity[$i]/$max_gene_number;
	$svg->rect('x',$te_density_start_x,'y',$y2_te_gene_density,'width',$span*$Xscale,'height',$te_density_start_y-$y2_te_gene_density,'stroke',"read",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"green");
	#$svg->line('x1',$density_start_x,'y1',$density_start_y,'x2',$density_end_x,'y2',$density_end_y,'stroke',"red",'stroke-width',$attribute{csv}{'stroke-width'});
	
}
#column
$svg->line('x1',$XOFFSET,'y1',$y2_te_gene_density,'x2',$XOFFSET,'y2',$y2_te_gene_density+$max_te_gene_number*$Y2scale,'stroke',"black",'stroke-width',"black");
$svg->text('x',$XOFFSET-20,'y',$y2_te_gene_density+$max_te_gene_number*$Y2scale,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_te_gene_number);#min gene number
=cut
#=======================gene density txt==================================================
my $md=$span/1000;
#$svg->text('x',$XOFFSET-30,'y',$YOFFSET+10,'width',"698",'height',"298",'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',"Number per \\30 kb","rotate","90",'writing-mode',"tb-rl");

$svg->rect('x',$XOFFSET+$length*$Xscale+15,'y',$y1_gene_density-$max_gene_number*$Y1scale*0.7,'width',10,'height',5,'stroke',"green",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"green");
$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y1_gene_density-$max_gene_number*$Y1scale*0.7+5,'stroke',"green",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"Genes");

#$svg->rect('x',$XOFFSET+$length*$Xscale+15,'y',$y1_gene_density-$max_gene_number*$Y1scale*0.7+20,'width',10,'height',5,'stroke',"green",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"green");
#$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y1_gene_density-$max_gene_number*$Y1scale*0.7+20+5,'stroke',"green",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"TE Genes");

$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y1_gene_density-$max_gene_number*$Y1scale*0.7+20,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"genes number \/ $md kb");
#=========================================================================================
#=============================plot exp gene desity=========================================
=cut
my $y3_target_e_density=$y2_te_gene_density+$max_te_gene_number*$Y2scale+$max_target_e_number*$Y2scale+20;
#my $Y3scale=$Y1scale;
for (my $i=0;$i<@target_e_desity-1 ;$i++) {
	my $target_e_density_start_x=$XOFFSET+$i*$span*$Xscale;
	my $target_e_density_start_y=$y3_target_e_density-$target_e_desity[$i]*$Y2scale;
	my $target_e_density_end_x=$XOFFSET+($i+1)*$span*$Xscale;
	my $target_e_density_end_y=$y3_target_e_density-$target_e_desity[$i+1]*$Y2scale;
	$svg->rect('x',$target_e_density_start_x,'y',$target_e_density_start_y,'width',$span*$Xscale,'height',$y3_target_e_density-$target_e_density_start_y,'stroke',"read",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"red");

}
$svg->line('x1',$XOFFSET,'y1',$y3_target_e_density,'x2',$XOFFSET+$length*$Xscale,'y2',$y3_target_e_density,'stroke',"black",'stroke-width',"black");
#column
$svg->line('x1',$XOFFSET,'y1',$y3_target_e_density,'x2',$XOFFSET,'y2',$y3_target_e_density-$max_te_gene_number*$Y2scale,'stroke',"black",'stroke-width',"black");
$svg->text('x',$XOFFSET-15,'y',$y3_target_e_density,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',0);#max gene number
$svg->text('x',$XOFFSET-20,'y',$y3_target_e_density-$max_te_gene_number*$Y2scale+10,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_target_e_number);#max gene number
#=========================================exp gene indensity txt==========================
$svg->rect('x',$XOFFSET+$length*$Xscale+15,'y',$y3_target_e_density-$max_target_e_number*$Y2scale*0.7,'width',10,'height',5,'stroke',"red",'stroke-width',$attribute{intron}{'stroke-width'},'fill',"red");
$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y3_target_e_density-$max_target_e_number*$Y2scale*0.7+5,'stroke',"red",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"Exp Genes");
$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y3_target_e_density-$max_target_e_number*$Y2scale*0.7+20,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"genes number \/ 50kb");
#calculate the different
=cut
#========================================================================================
my $Y3scale=0.04/$max_cluster_density*2500;
#my $y3_cluster_density=$y2_te_gene_density+$max_te_gene_number*5+$max_cluster_density*$Y3scale+10;
my $y3_cluster_density=$y1_gene_density+20;
my $y3_total=$y1_gene_density+10;
my @cluster_color=qw(fuchsia violet tomato);
for (my $s=0;$s<3 ;$s++) {
	$y3_total=$y3_total+$max_cluster_density*$Y3scale+5;
	$svg->line('x1',$XOFFSET,'y1',$y3_total,'x2',$XOFFSET+$length*$Xscale,'y2',$y3_total,'stroke',"black",'stroke-width',$attribute{csv}{'stroke-width'});
	$svg->line('x1',$XOFFSET,'y1',$y3_total,'x2',$XOFFSET,'y2',$y3_total-$max_cluster_density*$Y3scale,'stroke',"black",'stroke-width',$attribute{csv}{'stroke-width'});

	$svg->text('x',$XOFFSET-15,'y',$y3_total,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',"0");#min gene number

	if ($max_cluster_density[$s]>$max_cluster_density) {
		$svg->text('x',$XOFFSET-40,'y',$y3_total-$max_cluster_density*$Y3scale+10,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_cluster_density[$s]);#max gene number
	}
	else{
		$svg->text('x',$XOFFSET-40,'y',$y3_total-$max_cluster_density[$s]*$Y3scale+10,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_cluster_density[$s]);#max gene number
	}
	
	for (my $i=0;$i<$#cluster_density ;$i++) {
		my $cluster_density_start_x=$XOFFSET+$i*$span*$Xscale;
		my $cluster_density_end_x=$XOFFSET+($i+1)*$span*$Xscale;
		if ($cluster_density[$i][$s]>$max_cluster_density) {
			$cluster_density[$i][$s]=$max_cluster_density;
		}
		if ($cluster_density[$i+1][$s]>$max_cluster_density) {
			$cluster_density[$i+1][$s]=$max_cluster_density;
		}
		my $cluster_density_start_y=$y3_total-$cluster_density[$i][$s]*$Y3scale;
		my $cluster_density_end_y=$y3_total-$cluster_density[$i+1][$s]*$Y3scale;
		$svg->line('x1',$cluster_density_start_x,'y1',$cluster_density_start_y,'x2',$cluster_density_end_x,'y2',$cluster_density_end_y,'stroke',$cluster_color[$s],'stroke-width',$attribute{csv}{'stroke-width'});
	}
}
for (my $s=0;$s<@sample ;$s++) {
	$svg->line('x1',$XOFFSET+$length*$Xscale+10,'y1',$y3_cluster_density+($y3_total-$y3_cluster_density)*0.3+30*$s,'x2',$XOFFSET+$length*$Xscale+30,'y2',$y3_cluster_density+($y3_total-$y3_cluster_density)*0.3+30*$s,'stroke',$cluster_color[$s],'stroke-width',$attribute{csv}{'stroke-width'});
	$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y3_cluster_density+($y3_total-$y3_cluster_density)*0.3+30*$s+5,'stroke',$cluster_color[$s],'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"Small RNAs ".$sample[$s]);
}

$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y3_cluster_density+($y3_total-$y3_cluster_density)*0.3+30*3-5,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"indensity of sRNA \/ $md kb");
#===================================plot region target gene rpkm================
=cut
my $y4_region_gene_rpkm_1=$y3_total+10;
my $y4_region_gene_rpkm=$y4_region_gene_rpkm_1;
my $Y4scale=0.1/$max_region_gene_rpkm*1000;
my @cluster_color_t=qw(blue slateblue steelblue);
for (my $s=0;$s<3 ;$s++) {
	$y4_region_gene_rpkm+=$max_region_gene_rpkm*$Y4scale+5;

	$svg->line('x1',$XOFFSET,'y1',$y4_region_gene_rpkm,'x2',$XOFFSET+$length*$Xscale,'y2',$y4_region_gene_rpkm,'stroke',"black",'stroke-width',$attribute{csv}{'stroke-width'});
	
	$svg->line('x1',$XOFFSET,'y1',$y4_region_gene_rpkm,'x2',$XOFFSET,'y2',$y4_region_gene_rpkm-$max_region_gene_rpkm*$Y4scale,'stroke',"black",'stroke-width',$attribute{csv}{'stroke-width'});

	$svg->text('x',$XOFFSET-15,'y',$y4_region_gene_rpkm,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',"0");#min gene number

	if ($max_region_gene_rpkm[$s]>$max_region_gene_rpkm) {
		$svg->text('x',$XOFFSET-40,'y',$y4_region_gene_rpkm-$max_region_gene_rpkm*$Y4scale+10,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_region_gene_rpkm[$s]);#max gene number
	}
	else{
		$svg->text('x',$XOFFSET-40,'y',$y4_region_gene_rpkm-$max_region_gene_rpkm[$s]*$Y4scale+10,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size2'},'font-family',$attribute{font}{'font-family'},'-cdata',$max_region_gene_rpkm[$s]);#max gene number
	}
	for (my $i=0;$i<$#region_target_rpkm ;$i++) {
		my $region_target_rpkm_start_x=$XOFFSET+$i*$span*$Xscale;
		my $region_target_rpkm_end_x=$XOFFSET+($i+1)*$span*$Xscale;
		if ($region_target_rpkm[$i][$s]>$max_region_gene_rpkm) {
			$region_target_rpkm[$i][$s]=$max_region_gene_rpkm;
		}
		if ($region_target_rpkm[$i+1][$s]>$max_region_gene_rpkm) {
			$region_target_rpkm[$i+1][$s]=$max_region_gene_rpkm;
		}
		my $region_target_rpkm_start_y=$y4_region_gene_rpkm-$region_target_rpkm[$i][$s]*$Y4scale;
		my $region_target_rpkm_end_y=$y4_region_gene_rpkm-$region_target_rpkm[$i+1][$s]*$Y4scale;
		$svg->line('x1',$region_target_rpkm_start_x,'y1',$region_target_rpkm_start_y,'x2',$region_target_rpkm_end_x,'y2',$region_target_rpkm_end_y,'stroke',$cluster_color_t[$s],'stroke-width',$attribute{csv}{'stroke-width'});
	}

}
for (my $s=0;$s<3 ;$s++) {
	$svg->line('x1',$XOFFSET+$length*$Xscale+10,'y1',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y4_region_gene_rpkm_1)*0.3+30*$s,'x2',$XOFFSET+$length*$Xscale+30,'y2',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y4_region_gene_rpkm_1)*0.3+30*$s,'stroke',$cluster_color_t[$s],'stroke-width',$attribute{csv}{'stroke-width'});
	$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y4_region_gene_rpkm_1)*0.3+30*$s+5,'stroke',$cluster_color_t[$s],'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"Target Genes ".$sample[$s]);
}
$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y4_region_gene_rpkm_1)*0.3+30*3-5,'stroke',"black",'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',"indensity of genes \/ 50kb");
=cut
#for (my $s=0;$s<3 ;$s++) {
#	$svg->line('x1',$XOFFSET+$length*$Xscale+10,'y1',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y3_cluster_density)*0.3+30*$s,'x2',$XOFFSET+$length*$Xscale+30,'y2',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y3_cluster_density)*0.3+30*$s,'stroke',$cluster_color[$s],'stroke-width',$attribute{csv}{'stroke-width'});
#	$svg->text('x',$XOFFSET+$length*$Xscale+35,'y',$y4_region_gene_rpkm_1+($y4_region_gene_rpkm-$y3_cluster_density)*0.3+30*$s+5,'stroke',$cluster_color[$s],'stroke-width',$attribute{text}{'stroke-width'},'font-size',$attribute{font}{'font-size'},'font-family',$attribute{font}{'font-family'},'-cdata',$sample[$s]);
#}
#=========================================================================================

#sub ExpG_number {
#
#}
#sub ExpCluster_number{
#
#}


#========================================================================================
open (OUT,">$opt{o}");
print OUT $svg->xmlify();

sub log2 {
	my $n = shift;
	return log($n)/log(2);
}

sub usage{
print <<"USAGE";
Version $version
Usage:
$0 
options:
-l centromere length
-chro
-mark \#
-g input file of Gene region annotation which format like GenePred
-span
-c cluster file input
-o svg output
-h help
USAGE
exit(1);
}