#!/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 .= "

"; $nmenu .= qq( Select data source..:

); $nmenu .= qq(
); $nmenu .= qq(
); $nmenu .= "Select chromosome: "; $nmenu .= $q->popup_menu('-name' => 'chr', '-values' => \@chrs, '-labels' => \%chrs, '-default' => '1'); $nmenu .= "Check this to compute average"; $nmenu .= $q->checkbox('-name' => 'avg_check', '-checked' => 'on', '-value' => 'on', '-label' => ''); my @avg = ('mean','median','max','min'); my %avg; @avg{@avg} = @avg; $nmenu .= "Select averaging method"; $nmenu .= $q->popup_menu('-name' => 'avg_method', '-values' => \@avg, '-labels' => \%avg, '-default' => '1'); my @wsizes = ('auto', 10, 50, 100, 500, 1000, 5000, 10000, 50000, 100000); my %wsizes; @wsizes{@wsizes} = @wsizes; $nmenu .= "Window size:"; $nmenu .= $q->popup_menu('-name' => 'avg_wsize', '-values' => \@wsizes, '-labels' => \%wsizes, '-default' => 'auto'); $nmenu .= "


"; #G Legger til listen over tilgjengelige genomer..: my $gen_dir = qq (../../data/meltmap/maps/alt/); opendir(DIR, $gen_dir); my @gen_files = grep(/[^\.*]/,readdir(DIR)); closedir(DIR); my @sel_gen_files = (); for (my $i=0; $i < @gen_files; $i++) { my $tmp_gen = qq (