#!/usr/bin/perl
############################################################
# file: index.cgi, in tools/MeltMap
# desc: cgi-script for PubGene MeltMap viewer
# auth: Tor-Kristian Jenssen, PubGene AS
# comm:
#===========================================================
#
# Copyright 2003 PubGene AS, all rights reserved
#
#===========================================================
# who | dd/mm/yyyy | what
#-----------------------------------------------------------
# tkj | 03/03/2003 | created
############################################################
use lib '../../lib';
use strict;
use Carp;
use Benchmark;
require PubGene;
require MeltMap::Configuration;
require MeltMap::Database;
require MeltMap::Plot;
require NucleosomePostion::Database;
require GeneralMap::Database;
# file globals
my $DEBUG=0;
# start program
my $pg = PubGene::Web::Page->new("Chromosome Viewer", 'melting_map');
unless (defined $pg){
exit(PubGene::Web::Page::FATAL_ERROR("cannot create Page Object"));
}
#$DEBUG && $pg->list_params();
my $q = $pg->{'cgi'};
if ($q->param('gethelp') eq 'yes') {
exit(PubGene::Web::Page::Help::layout($pg));
}
$pg->add(chrmenu($pg));
if ($q->param('GetMeltMap')) {
$pg->add(results($pg));
}
$pg->layout($DEBUG);
exit;
######
# results
######
sub results {
my $pg = shift;
my $q = $pg->{'cgi'};
my $error = 0; # error code
my $msg;
my $t0 = Benchmark->new();
my $results = ""; # result buffer (string)
my $organism = 'hs';
#my $freeze = $q->param('freeze');
#$results .= $freeze;
my $freeze = 'hg17';
#$results .= $freeze;
my $chr = $q->param('chr');
my $start = $q->param('startpos');
my $end = $q->param('endpos');
my $avg_check = $q->param('avg_check') || 'off';
my $avg_method = $q->param('avg_method');
my $avg_wsize = $q->param('avg_wsize');
my @gen_files = $q->param('gen_files');
my $sel_all = $q->param('select_all');
my $singel_plot = $q->param('singel_plot');
my $multi_plot = $q->param('multi_plot');
my $chk_human = $q->param('chk_human');
my $chk_nuc = $q->param('chk_nuc');
my $chk_bendy = $q->param('chk_bendy');
my $chk_curve = $q->param('chk_curve');
my $fname = MeltMap::Configuration::get_full_chr_fname($chr, 'bin', 'maps', 'hs', 'golden', $freeze);
open(DEBUG, ">/usit/titan/u1/geirij/public_html/svg_browser/browser/tools/MeltMap/debug.txt") or die ;
print DEBUG join ("\n" , @gen_files);
closedir(DEBUG);
my $num_bps = $end - $start + 1;
$results .= "Melting map for bases $start to $end ($num_bps)";
$results .= " from chromosome $chr
";
$results .= $sel_all;
if ($sel_all eq 'on') {
# include all files for calulation
my $gen_dir = qq (../../data/meltmap/maps/alt/);
opendir(DIR, $gen_dir);
@gen_files = grep(/[^\.*]/,readdir(DIR));
closedir(DIR);
}
my @plot_points;
my %multi_shot = ();
my %single = ();
if ($singel_plot eq 'on' || $multi_plot eq 'on') {
#Human
if ($chk_human eq 'on') {
my @tmp = ();
MeltMap::Database::get_melt_map_chr_segment($fname, 'bin', $start, $end, \@tmp);
$multi_shot{'Human_melt'} = \@tmp;
}
# Nucleosome pos
if ($chk_nuc eq 'on') {
my @tmp;
NucleosomePostion::Database::get_nuc_pos_chr_segment($start, $end, \@tmp );
$multi_shot{'Nuc_pos'} = \@tmp;
}
if ($chk_bendy eq 'on') {
my @tmp;
GeneralMap::Database::get_plot_data($chr, $start, $end, \@tmp, "bendability");
$multi_shot{'Bendability'} = \@tmp;
}
if ($chk_curve eq 'on') {
my @tmp;
GeneralMap::Database::get_plot_data($chr, $start, $end, \@tmp, "curvature");
$multi_shot{'Curvature'} = \@tmp;
}
foreach my $genome (@gen_files) {
my @values = ();
# Retrieve data
get_chr_segment($genome, $start, $end, \@values);
$multi_shot{$genome} = \@values;
}
}
if ($singel_plot eq 'on') {
foreach my $plot (keys %multi_shot) {
my $ref_values = $multi_shot{$plot};
my @values = @$ref_values;
# Retrieve data
$single{"single"} = \@values;
# Create SVG
$results .= qq(
$plot
);
$results .= create_svg(\%single, $start, $end);
}
}
# Creating a multiplot if two or more files has been selected
if ($multi_plot eq 'on') {
$results .= qq(
Multiplot
);
foreach my $key (keys %multi_shot) {
# Normalizing the plots
$results .= qq(
$key
);
my $tmp_ref = $multi_shot{$key};
my @tmp_arr = @$tmp_ref;
my @tmp_norm = normalize(@tmp_arr);
$multi_shot{$key} = \@tmp_norm;
}
$results .= create_svg(\%multi_shot, $start, $end);
}
return $results;
}
sub get_chr_segment {
my $genome = shift;
my $start_bp = shift;
my $end_bp = shift;
my $ra_temperatures = shift;
my @chr_array = ();
tie @chr_array, 'Tie::File', "/usit/titan/u1/geirij/public_html/svg_browser/browser/data/meltmap/maps/alt/$genome" or die "$!";
# Slice'n dice..:
my @temp = @chr_array[$start_bp-1..$end_bp-1];
untie @chr_array;
open(DEBUG, ">/usit/titan/u1/geirij/public_html/svg_browser/browser/tools/MeltMap/debug.txt") or die ;
print DEBUG "($start_bp - $end_bp)\n";
print DEBUG join ("\n" , @temp);
closedir(DEBUG);
@$ra_temperatures = @temp;
}
sub create_svg{
my ($genome,$start,$end) = @_;
my $results = "";
my $tmp_fname = $pg->create_image_fname('svg');
my $tmp_fname .= rand();
my $image_fname = $PubGene::TMP_DIR . $tmp_fname;
my $image_url = $PubGene::Web::TMP_DIR . $tmp_fname;
my ($error, $msg) = MeltMap::Plot::svg($genome, $start, $end, 1 , 800,400,$image_fname, );
if ($error) {
$results .= $pg->error("failed to create svg file", $msg);
return $results;
}
return $pg->svgimage($image_url,800,400);
}
sub normalize{
my @lines = @_;
my @norm_array = ();
my ($max, $min) = (-10000, 10000);
foreach my $line (@lines) {
# finding max min
if ($line > $max) {
$max = $line;
}
if ($line < $min) {
$min = $line
}
}
# Normalizing
foreach my $line (@lines) {
my $val_norm = 0;
# $val_norm = ( ($max-$line) / ($max-$min));
$val_norm = 100-( (($max-$line)*100) / ($max-$min) );
push(@norm_array, $val_norm);
}
return @norm_array;
}
######
# chrmenu
######
sub chrmenu {
my $pg = shift;
my $q = $pg->{'cgi'};
my $organism = 'hs';
my $nmenu = $q->startform('POST');
my %freezes = %MeltMap::Configuration::FREEZES;
my @freezes = keys %freezes;
#$nmenu .= "Select golden path freeze: ";
#$nmenu .= $q->popup_menu('-name' => 'freeze',
# '-values' => \@freezes,
# '-labels' => \%freezes,
# '-default' => '1');
#$nmenu .= "
";
my @chrs = MeltMap::Configuration::get_chromosomes($organism);
my %chrs;
@chrs{@chrs} = @chrs;
$nmenu .= qq( Navigator:
);
$nmenu .= "Select subsequence: ";
$nmenu .= "start base ";
$nmenu .= $q->textfield('-name' => 'startpos', '-default' => 1,
#'-align' => 'right',
'-size' => 12);
$nmenu .= "end base ";
$nmenu .= $q->textfield('-name' => 'endpos',
'-default' => 1000,
#'-align' => 'right',
'-size' => 12);
$nmenu .= "