Mercurial > repos > fgiacomoni > golm_ws_lib_search
diff lib/output.pm @ 0:e3d43b8c987b draft
Init repository with last tool-bank-golm-lib_search master version
author | fgiacomoni |
---|---|
date | Mon, 05 Dec 2016 08:32:04 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/output.pm Mon Dec 05 08:32:04 2016 -0500 @@ -0,0 +1,536 @@ +package lib::output ; + +use strict; +use warnings ; +use Exporter ; +use Carp ; +use HTML::Template ; +use JSON ; + +use FindBin ; +use lib $FindBin::Bin ; +my $binPath = $FindBin::Bin ; + +use Data::Dumper ; + +use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS); + +our $VERSION = "1.0"; +our @ISA = qw(Exporter); +our @EXPORT = qw(build_json_res_object excel_output write_html_body add_entries_to_tbody_object write_json_skel write_ajax_data_source excel_like_output); +our %EXPORT_TAGS = ( ALL => [qw(build_json_res_object excel_output write_html_body add_entries_to_tbody_object write_json_skel write_ajax_data_source excel_like_output)] ); + +=head1 NAME +My::Module - An example module + +=head1 SYNOPSIS + + use My::Module; + my $object = My::Module->new(); + print $object->as_string; + +=head1 DESCRIPTION + +This module does not really exist, it +was made for the sole purpose of +demonstrating how POD works. + +=head1 METHODS + +Methods are : + +=head2 METHOD new + + ## Description : new + ## Input : $self + ## Ouput : bless $self ; + ## Usage : new() ; + +=cut + +sub new { + ## Variables + my $self={}; + bless($self) ; + return $self ; +} +### END of SUB + + + +=head2 METHOD build_json_res_object + + ## Description : build json from array of hits + ## Input : $results + ## Output : \@json_results + ## Usage : my ( \@json_results ) = build_json_res_object( $results ) ; + ## JSON structure: [ +# { +# 'id' : 'int', +# 'nb_hits' : int, +# 'searchResults' : [ +# { +# 'metaboliteID' : GUID +# 'distance_scores' : { +# 'EuclideanDistance' : float +# 'DotproductDistance' : int +# 'HammingDistance' : int +# 'JaccardDistance' : int +# 's12GowerLegendreDistance' : int +# } +# 'ri_infos' : { +# 'ri' : float +# 'riDiscrepancy' : float +# } +# 'analyte' : { +# 'id' : GUID +# 'name' : string +# } +# 'spectrum' : { +# 'id' : GUID +# 'name' : string +# } +# }, +# . +# . +# . +# ] +# } +# . +# . +# . +# ] +=cut +## START of SUB +sub build_json_res_object { + ## Retrieve Values + my $self = shift ; + my ( $results ) = @_ ; + + my @json_results ; + my @array_results = @$results ; + + my $nb_hits = 0 ; + my $i = 0 ; + my $spectrumID = 1 ; + + + + ## Loop on each spectra + foreach my $res (@array_results) { + + if (@$res[0] eq 'no results'){ + + my %hit_infos = () ; + + $json_results[$i]{'id'} = $spectrumID++ ; + $json_results[$i]{'nb_hits'} = $nb_hits ; + $hit_infos{'metaboliteID'} = "" ; + $hit_infos{'distance_scores'}{'EuclideanDistance'} = "" ; + $hit_infos{'distance_scores'}{'DotproductDistance'} = "" ; + $hit_infos{'distance_scores'}{'HammingDistance'} = "" ; + $hit_infos{'distance_scores'}{'JaccardDistance'} = "" ; + $hit_infos{'distance_scores'}{'s12GowerLegendreDistance'} = "" ; + $hit_infos{'ri_infos'}{'ri'} = "" ; + $hit_infos{'ri_infos'}{'riDiscrepancy'} = "" ; + $hit_infos{'analyte'}{'id'} = "" ; + $hit_infos{'analyte'}{'name'} = "" ; + $hit_infos{'spectrum'}{'id'} = "" ; + $hit_infos{'spectrum'}{'name'} = "no results" ; + + push ( @{ $json_results[$i]{'searchResults'} } , \%hit_infos ); + } + else { + + $nb_hits = scalar @$res; + + $json_results[$i]{'id'} = $spectrumID++ ; + $json_results[$i]{'nb_hits'} = $nb_hits ; + + ## Loop on each hit of a spectrum + build json + foreach my $href (@$res) { + + if (!defined $href){ + + last ; + } + else { + my %hash_res = %$href ; + my %hit_infos = () ; + # Get rid of false results + if ($hash_res{'metaboliteID'} eq '00000000-0000-0000-0000-000000000000') { + --$json_results[$i]{'nb_hits'} ; + } + else { + $hit_infos{'metaboliteID'} = $hash_res{'metaboliteID'} ; + $hit_infos{'distance_scores'}{'EuclideanDistance'} = $hash_res{'EuclideanDistance'} ; + $hit_infos{'distance_scores'}{'DotproductDistance'} = $hash_res{'DotproductDistance'} ; + $hit_infos{'distance_scores'}{'HammingDistance'} = $hash_res{'HammingDistance'} ; + $hit_infos{'distance_scores'}{'JaccardDistance'} = $hash_res{'JaccardDistance'} ; + $hit_infos{'distance_scores'}{'s12GowerLegendreDistance'} = $hash_res{'s12GowerLegendreDistance'} ; + $hit_infos{'ri_infos'}{'ri'} = $hash_res{'ri'} ; + $hit_infos{'ri_infos'}{'riDiscrepancy'} = $hash_res{'riDiscrepancy'} ; + $hit_infos{'analyte'}{'id'} = $hash_res{'analyteID'} ; + $hit_infos{'analyte'}{'name'} = $hash_res{'analyteName'} ; + $hit_infos{'spectrum'}{'id'} = $hash_res{'spectrumID'} ; + $hit_infos{'spectrum'}{'name'} = $hash_res{'spectrumName'} ; + + push ( @{ $json_results[$i]{'searchResults'} } , \%hit_infos ); + } + } + } + } + $i++ ; + } + return \@json_results ; +} +## END of SUB + + + +=head2 METHOD add_entries_to_tbody_object + + ## Description : initialize and build the entries object needed by HTML::Template + ## Input : $results + ## Output : \@tbody_entries + ## Usage : my ( $tbody_entries ) = add_entries_to_tbody_object( $results ) ; +=cut +## START of SUB +sub add_entries_to_tbody_object { + ## Retrieve Values + my $self = shift ; + my ( $results ) = @_ ; + + my @tbody_entries = () ; + + foreach my $href_grp (@$results) { + + foreach my $hit ( @{$href_grp->{'searchResults'}} ){ + my %grp_res = () ; + + ## Add hyperlinks + if ( $hit->{'spectrum'}{'name'} ne 'no results') { + %grp_res = ( + ID => $href_grp->{id} , + ANALYTE_NAME => $hit->{analyte}{name} , + SPECTRUM_NAME => $hit->{spectrum}{name} , + RI => $hit->{ri_infos}{ri} , + RI_DISCREPANCY => $hit->{ri_infos}{riDiscrepancy} , + DOT_PRODUCT_DISTANCE => $hit->{distance_scores}{DotproductDistance} , + EUCLIDEAN_DISTANCE => $hit->{distance_scores}{EuclideanDistance} , + JACCARD_DISTANCE => $hit->{distance_scores}{JaccardDistance} , + HAMMING_DISTANCE => $hit->{distance_scores}{HammingDistance} , + S12_GOWER_LEGENDRE_DISTANCE => $hit->{distance_scores}{s12GowerLegendreDistance} , + SPECTRUM_ID => $hit->{spectrum}{id} , + METABOLITE_ID => $hit->{metaboliteID} , + ANALYTE_ID => $hit->{analyte}{id}, + ANALYTE_REF => 'http://gmd.mpimp-golm.mpg.de/Analytes/'.$hit->{analyte}{id}.'.aspx', + SPECTRUM_REF => 'http://gmd.mpimp-golm.mpg.de/Spectrums/'.$hit->{spectrum}{id}.'.aspx', + METABOLITE_REF => 'http://gmd.mpimp-golm.mpg.de/Metabolites/'.$hit->{metaboliteID}.'.aspx', + ) ; + } + else { + %grp_res = ( + ID => $href_grp->{id} , + ANALYTE_NAME => $hit->{analyte}{name} , + SPECTRUM_NAME => $hit->{spectrum}{name} , + RI => $hit->{ri_infos}{ri} , + RI_DISCREPANCY => $hit->{ri_infos}{riDiscrepancy} , + DOT_PRODUCT_DISTANCE => $hit->{distance_scores}{DotproductDistance} , + EUCLIDEAN_DISTANCE => $hit->{distance_scores}{EuclideanDistance} , + JACCARD_DISTANCE => $hit->{distance_scores}{JaccardDistance} , + HAMMING_DISTANCE => $hit->{distance_scores}{HammingDistance} , + S12_GOWER_LEGENDRE_DISTANCE => $hit->{distance_scores}{s12GowerLegendreDistance} , + SPECTRUM_ID => $hit->{spectrum}{id} , + METABOLITE_ID => $hit->{metaboliteID} , + ANALYTE_ID => $hit->{analyte}{id}, + ANALYTE_REF => 'http://gmd.mpimp-golm.mpg.de/', + SPECTRUM_REF => 'http://gmd.mpimp-golm.mpg.de/', + METABOLITE_REF => 'http://gmd.mpimp-golm.mpg.de/', + ) ; + } + push (@tbody_entries , \%grp_res) ; + } + } + return \@tbody_entries ; +} +## END of SUB + + + + + + +=head2 METHOD write_html_body + + ## Description : Write the html output file + ## Input : $results, $tbody_entries, $html_file, $html_template + ## Output : $html_file + ## Usage : $o_output->write_html_body( $results, $tbody_entries, $html_file, $html_template ) ; +=cut +## START of SUB +sub write_html_body { + ## Retrieve Values + my $self = shift ; + my ( $results, $tbody_entries, $html_file_name, $html_template, $default_entries, $jsons_obj ) = @_ ; + + if (defined $html_file_name){ + + open (HTML, '>', $html_file_name) or die "Failed to open filehandle: $!" ; + + if (-e $html_template) { + + my $ohtml = HTML::Template->new(filename => $html_template) ; +# $ohtml->param( DATA => $jsons_obj ) ; + $ohtml->param( GROUPS => $tbody_entries ) ; + $ohtml->param( DEFAULT_ENTRIES => $default_entries ) ; + print HTML $ohtml->output ; + } + else { + croak "Problem about your html template: no html template available\n" ; + } + close (HTML) ; + } + else { + croak "Problem with the html output file: $html_file_name is not defined\n" ; + } +} +## END of SUB + + + +=head2 METHOD excel_output + + ## Description : create an excel XLS output of the results + ## Input : $jsons, $excel_file + ## Output : excel file + ## Usage : $o_output->excel_output( $jsons, $excel_file ) ; +=cut +## START of SUB +#sub excel_output { +# ## Retrieve Values +# my $self = shift ; +# my ( $excel_file, $jsons ) = @_ ; +# +# # Create a new workbook and add a worksheet +# my $workbook = Excel::Writer::XLSX->new( $excel_file ) ; +# my $worksheet = $workbook->add_worksheet() ; +# +# my $i = 0 ; +# +# # Create a format for the headings +# my $format = $workbook->add_format() ; +# $format->set_bold() ; +# +# $worksheet->write( $i, 0, "Num Spectre" , $format); +# $worksheet->write( $i, 1, "Analyte Name" , $format); +# $worksheet->write( $i, 2, "Spectrum Name" , $format); +# $worksheet->write( $i, 3, "Retention Index" , $format); +# $worksheet->write( $i, 4, "RI Discrepancy" , $format); +# $worksheet->write( $i, 5, "DotproductDistance" , $format); +# $worksheet->write( $i, 6, "EuclideanDistance" , $format); +# $worksheet->write( $i, 7, "JaccardDistance" , $format); +# $worksheet->write( $i, 8, "HammingDistance" , $format); +# $worksheet->write( $i, 9, "s12GowerLegendreDistance" , $format); +# $worksheet->write( $i, 10, "Spectrum ID" , $format); +# $worksheet->write( $i, 11, "Metabolite ID" , $format); +# $worksheet->write( $i, 12, "Analyte ID" , $format); +# $i++; +# +# foreach my $href_grp (@$jsons) { +# +# foreach my $hit ( @{$href_grp->{'searchResults'}} ){ +# +# $worksheet->write( $i, 0, $href_grp->{id} ); +# $worksheet->write( $i, 1, $hit->{analyte}{name} ); +# $worksheet->write( $i, 2, $hit->{spectrum}{name} ); +# $worksheet->write( $i, 3, $hit->{ri_infos}{ri} ); +# $worksheet->write( $i, 4, $hit->{ri_infos}{riDiscrepancy} ); +# $worksheet->write( $i, 5, $hit->{distance_scores}{DotproductDistance} ); +# $worksheet->write( $i, 6, $hit->{distance_scores}{EuclideanDistance} ); +# $worksheet->write( $i, 7, $hit->{distance_scores}{JaccardDistance} ); +# $worksheet->write( $i, 8, $hit->{distance_scores}{HammingDistance} ); +# $worksheet->write( $i, 9, $hit->{distance_scores}{s12GowerLegendreDistance} ); +# $worksheet->write( $i, 10, $hit->{spectrum}{id} ); +# $worksheet->write( $i, 11, $hit->{metaboliteID} ); +# $worksheet->write( $i, 12, $hit->{analyte}{id}); +# $i++; +# } +# } +# +# $workbook->close(); +#} +## END of SUB + + + + +=head2 METHOD excel_like_output + + ## Description : create an excel like output of the results + ## Input : $jsons, $excel_file + ## Output : excel file + ## Usage : $o_output->excel_like_output( $jsons, $excel_file ) ; +=cut +## START of SUB +sub excel_like_output { + ## Retrieve Values + my $self = shift ; + my ( $excel_file, $jsons ) = @_ ; + + open (OUT , ">" , $excel_file) or die "Error at opening file $excel_file" ; + + print OUT "Num Spectre\tAnalyte Name\tSpectrum Name\tRetention Index\tRI Discrepancy\tDotproductDistance\tEuclideanDistance\tJaccardDistance\tHammingDistance\ts12GowerLegendreDistance\tSpectrum ID\tMetabolite ID\tAnalyte ID\n" ; + + foreach my $href_grp (@$jsons) { + + foreach my $hit ( @{$href_grp->{'searchResults'}} ){ + + print OUT "$href_grp->{id}\t$hit->{analyte}{name}\t$hit->{spectrum}{name}\t$hit->{ri_infos}{ri}\t$hit->{ri_infos}{riDiscrepancy}\t$hit->{distance_scores}{DotproductDistance}\t$hit->{distance_scores}{EuclideanDistance}\t$hit->{distance_scores}{JaccardDistance}\t$hit->{distance_scores}{HammingDistance}\t$hit->{distance_scores}{s12GowerLegendreDistance}\t$hit->{spectrum}{id}\t$hit->{metaboliteID}\t$hit->{analyte}{id}\n"; + } + } + close (OUT) ; + +} +## END of SUB + + +=head2 METHOD write_json_skel + + ## Description : prepare and write json output file + ## Input : $json_file, $scalar + ## Output : json file + ## Usage : $o_output->write_json_skel( $csv_file, $scalar ) ; + +=cut +## START of SUB +sub write_json_skel { + ## Retrieve Values + my $self = shift ; + my ( $json_file, $json_obj ) = @_ ; + + my $utf8_encoded_json_text = encode_json $json_obj ; + open(JSON, '>:utf8', $$json_file) or die "Can't create the file $$json_file\n" ; + print JSON $utf8_encoded_json_text ; + close(JSON) ; + +} +## END of SUB + + + +=head2 METHOD write_csv + + ## Description : write csv output file + ## Input : $xlsx_file, $csv_file + ## Output : csv file + ## Usage : $o_output->write_csv( $xlsx_file, $csv_file ) ; + +=cut +## START of SUB +sub write_csv { + ## Retrieve Values + my $self = shift ; + my ( $csv_file, $jsons ) = @_ ; + + open (CSV , ">" , $csv_file) or die "Can't create the file $csv_file\n" ; + + print CSV "\"Num Spectre\"\t\"Analyte Name\"\t\"Spectrum Name\"\t\"Retention Index\"\t\"RI Discrepancy\"\t\"DotproductDistance\"\t\"EuclideanDistance\"\t\"JaccardDistance\"\t\"HammingDistance\"\t\"s12GowerLegendreDistance\"\t\"Spectrum ID\"\t\"Metabolite ID\"\t\"Analyte ID\"\n" ; + + foreach my $href_grp (@$jsons) { + + foreach my $hit ( @{$href_grp->{'searchResults'}} ){ + + print CSV "\"$href_grp->{id}\"\t\"$hit->{analyte}{name}\"\t\"$hit->{spectrum}{name}\"\t\"$hit->{ri_infos}{ri}\"\t\"$hit->{ri_infos}{riDiscrepancy}\"\t\"$hit->{distance_scores}{DotproductDistance}\"\t\"$hit->{distance_scores}{EuclideanDistance}\"\t\"$hit->{distance_scores}{JaccardDistance}\"\t\"$hit->{distance_scores}{HammingDistance}\"\t\"$hit->{distance_scores}{s12GowerLegendreDistance}\"\t\"$hit->{spectrum}{id}\"\t\"$hit->{metaboliteID}\"\t\"$hit->{analyte}{id}\"\n" ; + } + } + close(CSV) ; + +} +## END of SUB + + + + +=head2 METHOD write_ajax_data_source + + ## Description : write csv output file + ## Input : $jsons_obj + ## Output : + ## Usage : $o_output->write_ajax_data_source( $jsons_obj ) ; + +=cut +## START of SUB +sub write_ajax_data_source { + ## Retrieve Values + my $self = shift ; + my ( $jsons_obj ) = @_ ; + + my %ajax = () ; + my $i = 0 ; + + #open (AJAX,">ajax.txt") or die "ERROR at opening file" ; + + foreach my $href_grp (@$jsons_obj) { + + foreach my $hit ( @{$href_grp->{'searchResults'}} ){ + + push (@{$ajax{ 'data' }[$i]} , $href_grp->{id}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{spectrum}{name}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{analyte}{name}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{ri_infos}{ri}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{ri_infos}{riDiscrepancy}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{distance_scores}{DotproductDistance}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{distance_scores}{EuclideanDistance}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{distance_scores}{JaccardDistance}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{distance_scores}{HammingDistance}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{distance_scores}{s12GowerLegendreDistance}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{spectrum}{id}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{metaboliteID}) ; + push (@{$ajax{ 'data' }[$i]} , $hit->{analyte}{ID}) ; + $i++ ; + } + } + + my $ajax = encode_json \%ajax ; + return $ajax ; + #print AJAX $ajax ; + +} +#END of SUB + + + +1 ; + + +__END__ + +=head1 SUPPORT + +You can find documentation for this module with the perldoc command. + + perldoc csv.pm + +=head1 Exports + +=over 4 + +=item :ALL is get_spectra + +=back + +=head1 AUTHOR + +Gabriel Cretin E<lt>gabriel.cretin@clermont.inra.frE<gt> +Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt> + +=head1 LICENSE + +This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. + +=head1 VERSION + +version 1 : ?? + +=cut