Repository 'massbank_ws_searchspectrum'
hg clone https://toolshed.g2.bx.psu.edu/repos/fgiacomoni/massbank_ws_searchspectrum

Changeset 0:023c380900ef (2017-04-19)
Commit message:
Init repository with last massbank_ws_searchspectrum master version
added:
README.md
README.txt
conf_massbank.cfg
lib/conf.pm
lib/csv.pm
lib/mapper.pm
lib/massbank_api.pm
lib/massbank_parser.pm
lib/threader.pm
lib/writter.pm
massbank.tmpl
massbank_ws_searchspectrum.pl
massbank_ws_searchspectrum.xml
t/lib/massbank_api_Test.pm
t/lib/massbank_main_Test.pm
t/lib/massbank_mapper_Test.pm
t/massbank_ws_searchspectrum_Test.t
test-data/input01_69-pcgroups-mz-relative_int.tabular
test-data/input02_2214-mz-int-pcgroups.tabular
test-data/input03_1mz-1pcgroup-mz-relative_int.tabular
test-data/out_test01.html
test-data/out_test01.json
test-data/out_test01.tabular
test-data/out_test01.txt
b
diff -r 000000000000 -r 023c380900ef README.md
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,53 @@
+MassBank spectrum searches - Search by pseudo-spectra on a High Quality Mass Spectral Database.
+===============================================================================================
+
+[![bioconda-badge](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg?style=flat-square)](http://bioconda.github.io) [![Build Status](https://travis-ci.org/workflow4metabolomics/wrapper-bank-massbank-spectrum_search.svg?branch=master)](https://travis-ci.org/workflow4metabolomics/wrapper-bank-massbank-spectrum_search)
+
+Our project
+-----------
+The [Workflow4Metabolomics](http://workflow4metabolomics.org), W4M in short, is a French infrastructure offering software tool processing, analyzing and annotating metabolomics data. It is based on the Galaxy platform.
+
+
+MassBank spectrum searches - Search by pseudo-spectra on a High Quality Mass Spectral Database.
+-----------------------------------------------------------------------------------------------
+
+Tool using the MassBank API Spectrum Search.
+
+
+Galaxy
+------
+Galaxy is an open, web-based platform for data intensive biomedical research. Whether on the free public server or your own instance, you can perform, reproduce, and share complete analyses. 
+
+Homepage: [https://galaxyproject.org/](https://galaxyproject.org/)
+
+
+Dependencies using Conda
+------------------------
+[![bioconda-badge](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg?style=flat-square)](http://bioconda.github.io)
+
+
+[Conda](http://conda.pydata.org/) is package manager that among many other things can be used to manage Python packages.
+
+```
+#To install miniconda2
+#http://conda.pydata.org/miniconda.html
+#To install the tool dependencies using conda:
+conda install perl-lwp-simple perl-lwp-useragent perl-uri-url perl-soap-lite perl-list-moreutils perl-text-csv perl perl-html-template
+#To set an environment:
+conda create -n wrapper-bank-massbank-spectrum_search perl-soap-lite perl-list-moreutils perl-json perl-html-template`
+#To activate the environment:
+. activate wrapper-bank-massbank-spectrum_search
+```
+
+
+Travis
+------
+[![Build Status](https://travis-ci.org/workflow4metabolomics/wrapper-bank-massbank-spectrum_search.svg?branch=master)](https://travis-ci.org/workflow4metabolomics/wrapper-bank-massbank-spectrum_search)
+
+Test and Deploy with Confidence. Easily sync your GitHub projects with Travis CI and you'll be testing your code in minutes!
+
+Historic contributors
+---------------------
+- Franck Giacomoni @fgiacomoni - [French Metabolomics and Fluxomics Infrastructure (MetaboHUB)](http://www.metabohub.fr/en) - [La plateforme "Exploration du Métabolisme" (PFEM, Clermont-Ferrand)](http://www6.clermont.inra.fr/plateforme_exploration_metabolisme)
+- Marion Landi - [LIFEGRID grant](http://www.lifegrid.fr/fr/home/le-pra-lifegrid.html) - [La plateforme "Exploration du Métabolisme" (PFEM, Clermont-Ferrand)](http://www6.clermont.inra.fr/plateforme_exploration_metabolisme)
+- Yann Guitton @yguitton - [LABERCA - Laboratory of Food Contaminants and Residue Analysis](http://www.laberca.org/) - Ecole Nationale Vétérinaire, Agroalimentaire et de l'Alimentation Nantes-Atlantique - France
b
diff -r 000000000000 -r 023c380900ef README.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README.txt Wed Apr 19 11:31:58 2017 -0400
b
@@ -0,0 +1,74 @@
+## ****** MassBank Searching Spectra environnemnt : ****** ##
+# version Janv 2017 F Giacomoni - INRA - METABOHUB - workflow4metabolomics.org core team
+
+## --- PERL compilator / libraries : --- ##
+$ perl -v
+This is perl, v5.10.1 (*) built for x86_64-linux-thread-multi
+
+# libs CORE PERL : 
+use strict ;
+use warnings ;
+use Carp qw (cluck croak carp) ;
+use Exporter ;
+use Data::Dumper ;
+use Getopt::Long ;
+use FindBin ;
+use Encode;
+use POSIX ;
+
+
+# libs CPAN PERL : 
+$ perl -e 'use Text::CSV'
+use Text::CSV ;
+use JSON ;
+use HTML::Template ;
+use SOAP::Lite ;
+use threads;
+use threads::shared;
+use Thread::Queue;
+use LWP::UserAgent;
+use LWP::Simple ;
+use File::Basename;
+
+$ sudo perl -MCPAN -e shell
+cpan> install Text::CSV
+
+# libs pfem PERL : this lib were included in lib dir.
+use conf::conf  qw( :ALL ) ;
+use formats::csv  qw( :ALL ) ;
+--
+
+## --- Conda compliant --- ##
+This tool and its PERL dependencies are "Conda compliant".
+The requirements section in the Xml file is still commented, waiting for "Conda" deployment improvement in Galaxy project.
+
+## --- R bin and Packages : --- ##
+No interaction with R
+-- 
+
+## --- Binary dependencies --- ##
+No interaction with binary - use only MassBank (JP or EU server) SOAP method (http://www.massbank.jp/api/services/MassBankAPI?wsdl)
+--
+
+## --- Config : --- ##
+JS and CSS (used in HTML output format) are now hosted on cdn.rawgit.com server - no local config needed
+
+
+PS :If Galaxy can't find the file "massbank.tmpl", perform this command line : perl -pi -e 's/\r//g' conf_massbank.cfg
+--
+
+## --- XML HELP PART --- ##
+one image : 
+massbank_spectra.png
+--
+
+## --- DATASETS OR TUTORIAL --- ##
+Please find help on W4M: http://workflow4metabolomics.org/howto 
+--
+
+## --- ??? COMMENTS ??? --- ##
+If Galaxy can't find the file "massbank.tmpl", perform this command line : " perl -pi -e 's/\r//g' " on the conf file "conf_massbank.cfg".
+
+To use fully functionalities of HTML output format file : 
+  - check that sanitize_all_html option in universe_wsgi.ini file is uncomment and set to FALSE.
+--
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef conf_massbank.cfg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/conf_massbank.cfg Wed Apr 19 11:31:58 2017 -0400
b
@@ -0,0 +1,19 @@
+## Conf file for massbank_ws_searchspectrum.pl script
+#
+## Version of
+VERSION=2017-01-06
+#
+## Threads
+THREADING_THRESHOLD=6
+
+## Galaxy url for HTML JS and CSS path 
+JS_GALAXY_PATH=https://cdn.rawgit.com/fgiacomoni/galaxy_utils/master/scripts
+CSS_GALAXY_PATH=https://cdn.rawgit.com/fgiacomoni/galaxy_utils/master/style
+#
+## HTML OUTPUT : 
+HTML_ENTRIES_PER_PAGE=4
+#
+#
+#
+## MASSBANK FEATURES
+URL_MASSBANK=http://www.massbank.jp/jsp/FwdRecord.jsp?id=
b
diff -r 000000000000 -r 023c380900ef lib/conf.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/conf.pm Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,259 @@
+package lib::conf ;
+
+use strict;
+use warnings ;
+use Exporter ;
+use Carp ;
+use Data::Dumper ;
+
+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);
+
+our $VERSION = "1.0" ;
+our @ISA = qw(Exporter) ;
+our @EXPORT = qw( as_conf get_value_from_conf check_path_and_file ) ;
+our %EXPORT_TAGS = ( ALL => [qw( as_conf get_value_from_conf )] ) ;
+
+=head1 NAME
+
+conf - A module for manage pfem conf file
+
+=head1 SYNOPSIS
+
+    use conf ;
+    my $object = conf->new() ;
+
+=head1 DESCRIPTION
+
+This module does manage conf file (extract all or selected fields)
+
+=head1 METHODS
+
+Methods are :
+
+=head2 METHOD new
+
+ ## Description : new
+ ## Input : $self
+ ## Ouput : bless $self ;
+ ## Usage : new() ;
+
+=cut
+## START of SUB
+sub new {
+    ## Variables
+    my $self={};
+    bless($self) ;
+    return $self ;
+}
+### END of SUB
+
+=head2 METHOD as_conf
+
+ ## Description : permet de creer l'object conf a partir d'un fichier de conf de type KEY=VALUE
+ ## Input : $file
+ ## Ouput : $oConf (a hash)
+ ## Usage : my ( $oConf ) = as_conf( $file ) ;
+
+=cut
+## START of SUB
+sub as_conf {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $file, $separator ) = @_ ;
+    
+#    if (!defined $separator) { $separator = ';' } ## set separator to ;
+    
+    if ( !defined $file )  {  croak "Can't create object with an none defined file\n" ; }
+    
+    my %Conf = () ; ## Hash devant contenir l'ensemble des parametres locaux
+
+ if (-e $file) {
+ open (CFG, "<$file") or die "Can't open $file\n" ;
+ while (<CFG>) {
+ chomp $_ ;
+ if ( $_ =~ /^#(.*)/)  { next ; }
+ elsif ($_ =~/^(\w+?)=(.*)/) { ## ALPHANUMERIC OR UNDERSCORE ONLY FOR THE KEY AND ANYTHING ELSE FOR VALUE
+
+ my ($key, $value) = ($1, $2) ;
+
+ if (defined $separator) {
+ if ( $value=~/$separator/ ) { ## is a list to split
+ my @tmp = split(/$separator/ , $value) ;
+ $Conf{$key} = \@tmp ;
+ }
+ }
+ else {
+ $Conf{$key} = $value ;
+ }
+ }
+ }
+ close(CFG) ;
+ }
+ else { 
+ croak "Can't create object with an none existing file\n" ;
+ }
+
+    return ( \%Conf ) ;
+}
+## END of SUB
+
+=head2 METHOD as_conf_list
+
+ ## Description : permet de charger une liste txt en array
+ ## Input : $file
+ ## Output : elements
+ ## Usage : my ( elements ) = as_conf_list( $conf_file ) ;
+
+=cut
+## START of SUB
+sub as_conf_list {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $file ) = @_ ;
+    
+    my @elements = () ;
+    if ( !defined $file )  {  croak "Can't create object with an none defined file\n" ; }
+    
+    if (-e $file) {
+ open (CFG, "<$file") or die "Can't open $file\n" ;
+ while (<CFG>) {
+ chomp $_ ;
+ if ( $_ =~ /^#(.*)/)  { next ; }
+ elsif ($_ =~/^(.*)/) { if (defined $1) { push (@elements, $1) ; }  }
+ }
+    }
+    else {
+ croak "Can't create object with an none existing file\n" ;
+ }
+    return(\@elements) ;
+}
+## END of SUB
+
+=head2 METHOD get_value_from_conf
+
+ ## Description : permet de retourner une valeur du hash de conf a partir d'une key
+ ## Input : $oConf, $Key
+ ## Ouput : $Value
+ ## Usage : my ( $Value ) = get_value_from_conf( $oConf, $Key ) ;
+
+=cut
+## START of SUB
+sub get_value_from_conf {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $oConf, $Key ) = @_ ;
+    
+    my $Value = undef ;
+    
+    if ( defined $oConf ) {
+     if ( defined $oConf->{$Key} ) {
+     $Value = $oConf->{$Key} ;
+     }
+    }
+    else {
+     croak "Can't manage value with undefined object\n" ;
+    }
+    return($Value) ;
+}
+## END of SUB
+
+=head2 METHOD get_value_from_conf
+
+ ## Description : permet de retourner une valeur du hash de conf a partir d'une key
+ ## Input : $oConf, $Key
+ ## Ouput : $Value
+ ## Usage : my ( $Value ) = get_value_from_conf( $oConf, $Key ) ;
+
+=cut
+## START of SUB
+sub split_value_from_conf {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $oConf, $Key, $sep ) = @_ ;
+    
+    my $value = undef ;
+    my @values = () ;
+    
+    if ( defined $oConf ) {
+     if ( defined $oConf->{$Key} ) {
+     $value = $oConf->{$Key} ;
+     @values = split ( /$sep/, $value) ;
+     }
+    }
+    else {
+     croak "Can't manage value with undefined object\n" ;
+    }
+    return(\@values) ;
+}
+## END of SUB
+
+
+=head2 METHOD check_path_and_file
+
+ ## Description : permet de verifier les path et la presence des exe decrits dans le file conf. Bloque le script en cas de probleme
+ ## Input : $oConfs
+ ## Ouput : NA
+ ## Usage : &get_value_from_conf( $oConf ) ;
+
+=cut
+## START of SUB
+sub check_path_and_file {
+
+ my $self = shift ;
+ my ( $oConfs ) = @_ ;
+
+ foreach my $conf ( keys %{ $oConfs } ) {
+ if ( $conf =~ /^FILE/ ) {
+ if ( -e $oConfs->{$conf} ) {
+ if ( -s $oConfs->{$conf} ) { next ; }
+ else { carp "[Warning] : The size of file $oConfs->{$conf} is null\n" ; }
+ }
+ else {
+ carp "[Warning] : The file $oConfs->{$conf} doesn't exist\n" ;
+ }
+ }
+ elsif ( $conf =~ /^PATH/ ) {
+ if ( -d $oConfs->{$conf} ) { next ; }
+ else { carp "[Warning] :  The dir $oConfs->{$conf} doesn't exist\n" ; }
+ }
+ else {  next ;  }
+ }
+ return ;
+}
+## END of SUB
+
+1 ;
+
+
+__END__
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+ perldoc conf.pm
+
+
+=head1 Exports
+
+=over 4
+
+=item :ALL is as_conf get_value_from_conf
+
+=back
+
+=head1 AUTHOR
+
+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 : 10 / 02 / 2013
+
+version 2 : ??
+
+=cut
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef lib/csv.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/csv.pm Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,285 @@
+package lib::csv ;
+
+use strict;
+use warnings ;
+use Exporter ;
+use Carp ;
+
+use Text::CSV ;
+
+use Data::Dumper ;
+
+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);
+
+our $VERSION = "1.0";
+our @ISA = qw(Exporter);
+our @EXPORT = qw( get_csv_object get_value_from_csv get_value_from_csv_multi_header );
+our %EXPORT_TAGS = ( ALL => [qw( get_csv_object get_value_from_csv get_value_from_csv_multi_header )] );
+
+=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 get_csv_object
+
+ ## Description : builds a csv object and etablishes format
+ ## Input : $separator
+ ## Output : $csv
+ ## Usage : my ( $csv ) = get_csv_object( $separator ) ;
+
+=cut
+## START of SUB
+sub get_csv_object {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $separator ) = @_ ;
+    
+#    my $csv = Text::CSV->new({'sep_char' => "$separator"});
+    my $csv = Text::CSV->new ( {'sep_char' => "$separator", binary => 1,  } )  # should set binary attribute.
+     or die "Cannot use CSV: ".Text::CSV->error_diag ();
+
+    return($csv) ;
+}
+## END of SUB
+
+=head2 METHOD get_value_from_csv
+
+ ## Description : extract a targeted column in a csv file 
+ ## Input : $csv, $file, $column, $is_header
+ ## Output : $value
+ ## Usage : my ( $value ) = get_value_from_csv( $csv, $file, $column, $is_header ) ;
+
+=cut
+## START of SUB
+sub get_value_from_csv {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $csv, $file, $column, $is_header ) = @_ ;
+    
+    my @value = () ;
+    
+    ## Adapte the number of the colunm : (nb of column to position in array)
+ $column = $column - 1 ;
+    
+    open (CSV, "<", $file) or die $! ;
+
+ my $line = 0 ;
+
+ while (<CSV>) {
+ $line++ ;
+     chomp $_ ;
+ # file has a header
+ if ( defined $is_header ) { if ($line == 1) { next ; } }
+ # parsing the targeted column
+     if ( $csv->parse($_) ) {
+         my @columns = $csv->fields();
+         push ( @value, $columns[$column] ) ;
+     }
+     else {
+         my $err = $csv->error_input;
+         die "Failed to parse line: $err";
+     }
+ }
+ close CSV;
+    return(\@value) ;
+}
+## END of SUB
+
+=head2 METHOD get_value_from_csv_multi_header
+
+ ## Description : extract a targeted column in a csv file 
+ ## Input : $csv, $file, $column, $is_header, $nb_header
+ ## Output : $value
+ ## Usage : my ( $value ) = get_value_from_csv_multi_header( $csv, $file, $column, $is_header, $nb_header ) ;
+
+=cut
+## START of SUB
+sub get_value_from_csv_multi_header {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $csv, $file, $column, $is_header, $nb_header ) = @_ ;
+    
+    my @value = () ;
+    
+    ## Adapte the number of the colunm : (nb of column to position in array)
+ $column = $column - 1 ;
+    
+    open (CSV, "<", $file) or die $! ;
+
+ my $line = 0 ;
+
+ while (<CSV>) {
+ $line++ ;
+     chomp $_ ;
+ # file has a header
+ if ( defined $is_header and $is_header eq 'yes') { if ($line <= $nb_header) { next ; } }
+ # parsing the targeted column
+     if ( $csv->parse($_) ) {
+         my @columns = $csv->fields();
+         my $value = $columns[$column] ;
+         $value =~s/\r|\n// ;
+         push ( @value,  $value ) ;
+     }
+     else {
+         my $err = $csv->error_input;
+         die "Failed to parse line: $err";
+     }
+ }
+ close CSV;
+    return(\@value) ;
+}
+## END of SUB
+
+=head2 METHOD parse_csv_object
+
+ ## Description : parse_all csv object and return a array of rows
+ ## Input : $csv, $file
+ ## Output : $csv_matrix
+ ## Usage : my ( $csv_matrix ) = parse_csv_object( $csv, $file ) ;
+
+=cut
+## START of SUB
+sub parse_csv_object {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $csv, $file ) = @_ ;
+    
+    my @csv_matrix = () ;
+    
+ open my $fh, "<:encoding(utf8)", $$file or die "Can't open csv file $$file: $!";
+
+ while ( my $row = $csv->getline( $fh ) ) {
+     push @csv_matrix, $row;
+ }
+ $csv->eof or $csv->error_diag();
+ close $fh;
+    
+    return(\@csv_matrix) ;
+}
+## END of SUB
+
+=head2 METHOD parse_allcsv_object
+
+ ## Description : parse_all csv object and return a array of rows with or without header
+ ## Input : $csv, $file, $keep_header
+ ## Output : $csv_matrix
+ ## Usage : my ( $csv_matrix ) = parse_csv_object( $csv, $file, $keep_header ) ;
+
+=cut
+## START of SUB
+sub parse_allcsv_object {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $csv, $file, $keep_header ) = @_ ;
+    
+    my @csv_matrix = () ;
+    my $line = 1 ;
+    
+ open my $fh, "<:encoding(utf8)", $$file or die "Can't open csv file $$file: $!";
+
+ while ( my $row = $csv->getline( $fh ) ) {
+ if ( ( $keep_header eq 'n' )  and ($line == 1) ) {  }
+ else { push @csv_matrix, $row; }
+     $line ++ ;
+ }
+ my $status = $csv->eof or $csv->error_diag();
+ close $fh;
+    
+    return(\@csv_matrix, $status) ;
+}
+## END of SUB
+
+
+=head2 METHOD write_csv_from_arrays
+
+ ## Description : write a csv file from list of rows
+ ## Input : $csv, $file_name, $rows
+ ## Output : $csv_file
+ ## Usage : my ( $csv_file ) = write_csv_from_arrays( $csv, $file_name, $rows ) ;
+
+=cut
+## START of SUB
+sub write_csv_from_arrays {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $csv, $file_name, $rows ) = @_ ;
+    
+    my $fh = undef ;
+    $csv->eol ("\n"); ##  end-of-line string to add to rows
+    $csv->quote_char(undef) ;
+    open $fh, ">:encoding(utf8)", "$file_name" or die "$file_name: $!";
+    
+ my $status = $csv->print ($fh, $_) for @{$rows};
+ close $fh or die "$file_name: $!";
+    
+    return(\$file_name) ;
+}
+## 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_csv_object, get_value_from_csv
+
+=back
+
+=head1 AUTHOR
+
+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 : 23 / 10 / 2013
+
+version 2 : ??
+
+=cut
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef lib/mapper.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/mapper.pm Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,899 @@\n+package lib::mapper ;\r\n+\r\n+use strict;\r\n+use warnings ;\r\n+use Exporter ;\r\n+use Carp ;\r\n+\r\n+use Data::Dumper ;\r\n+\r\n+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);\r\n+\r\n+our $VERSION = "1.0";\r\n+our @ISA = qw(Exporter);\r\n+our @EXPORT = qw( add_min_max_for_pcgroup_res get_massbank_records_by_chunk compute_ids_from_pcgroups_res filter_pcgroup_res get_pcgroup_list get_pcgroups set_massbank_matrix_object add_massbank_matrix_to_input_matrix map_pc_to_generic_json set_html_tbody_object add_mz_to_tbody_object add_entries_to_tbody_object);\r\n+our %EXPORT_TAGS = ( ALL => [qw( add_min_max_for_pcgroup_res get_massbank_records_by_chunk compute_ids_from_pcgroups_res filter_pcgroup_res get_pcgroup_list get_pcgroups set_massbank_matrix_object add_massbank_matrix_to_input_matrix map_pc_to_generic_json set_html_tbody_object add_mz_to_tbody_object add_entries_to_tbody_object)] );\r\n+\r\n+=head1 NAME\r\n+\r\n+My::Module - An example module\r\n+\r\n+=head1 SYNOPSIS\r\n+\r\n+    use My::Module;\r\n+    my $object = My::Module->new();\r\n+    print $object->as_string;\r\n+\r\n+=head1 DESCRIPTION\r\n+\r\n+This module does not really exist, it\r\n+was made for the sole purpose of\r\n+demonstrating how POD works.\r\n+\r\n+=head1 METHODS\r\n+\r\n+Methods are :\r\n+\r\n+=head2 METHOD new\r\n+\r\n+\t## Description : new\r\n+\t## Input : $self\r\n+\t## Ouput : bless $self ;\r\n+\t## Usage : new() ;\r\n+\r\n+=cut\r\n+\r\n+sub new {\r\n+    ## Variables\r\n+    my $self={};\r\n+    bless($self) ;\r\n+    return $self ;\r\n+}\r\n+### END of SUB\r\n+\r\n+=head2 METHOD get_pcgroups\r\n+\r\n+\t## Description : get and prepare pcgroup features (mzs, into, names) from input cvs parser\r\n+\t## Input : $pcs, $mzs, $ints, $names\r\n+\t## Output : $pcgroups\r\n+\t## Usage : my ( $pcgroups ) = get_pcgroups( $pcs, $mzs, $ints, $names ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub get_pcgroups {\r\n+    my $self = shift;\r\n+    my ( $pcs, $mzs, $ints ) = @_;\r\n+    \r\n+    my %pcgroups = () ;\r\n+    my $i = 0 ;\r\n+    \r\n+    ## Warn diff matrix dimension :\r\n+    my $num_pcs = scalar(@{$pcs}) ;\r\n+    my $num_mzs = scalar(@{$mzs}) ;\r\n+    my $num_ints = scalar(@{$ints}) ;\r\n+    \r\n+    if ( ($num_pcs == $num_mzs ) and ( $num_mzs == $num_ints ) ) {\r\n+\t\tmy @pcs = @{$pcs} ;\r\n+    \t\r\n+    \tforeach my $pc (@{$pcs}) {\r\n+\t    \t\r\n+\t    \tif ( ! $pcgroups{$pc} ) { $pcgroups{$pc}->{\'id\'} = $pc ;\t$pcgroups{$pc}->{\'annotation\'} = {} ; $pcgroups{$pc}->{\'massbank_ids\'} = [] ; }\r\n+\t    \t\r\n+\t    \tpush (@{$pcgroups{$pc}->{\'mzmed\'}}, $mzs->[$i]) if ($mzs->[$i]) ; ## map mzs by pcgroup\r\n+\r\n+\t    \tif ($ints->[$i] > 0 ) { \tpush (@{$pcgroups{$pc}->{\'into\'}}, $ints->[$i])  ; ## map into by pcgroup\r\n+\t    \t}\r\n+\t    \telsif ($ints->[$i] == 0) {\r\n+\t    \t\tpush (@{$pcgroups{$pc}->{\'into\'}}, $ints->[$i])  ; ## map into by pcgroup even value is 0\r\n+\t    \t}\r\n+\t    \telse {\r\n+\t    \t\twarn "Undefined value found in pcgroups array\\n" ;\r\n+\t    \t}\r\n+\t    \t$i++ ;\r\n+\t    }\r\n+    }\r\n+    else {\r\n+    \twarn "The different ARRAYS (pcs, mzs, ints) doesn\'t have the same size : mapping is not possible \\n!!"\r\n+    }\r\n+    return (\\%pcgroups) ;\r\n+}\r\n+### END of SUB\r\n+\r\n+=head2 METHOD get_pcgroup_list\r\n+\r\n+\t## Description : get and prepare unik pcgroup list from input cvs parsed list\r\n+\t## Input : $pcs\r\n+\t## Output : $list\r\n+\t## Usage : my ( $list ) = get_pcgroup_list( $pcs ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub get_pcgroup_list {\r\n+\tmy $self = shift;\r\n+    my ( $pcs ) = @_;\r\n+    \r\n+    my @pcgroup_list = () ;\r\n+    my $i = 0 ;\r\n+    \r\n+    my %hash = map { $_, 1 } @{$pcs} ;\r\n+ \t@pcgroup_list = keys %hash;\r\n+ \t@pcgroup_list = sort { $a <=> $b } @pcgroup_list ;\r\n+\t\r\n+\treturn (\\@pcgroup_list) ;\r\n+}\r\n+\r\n+### END of SUB\r\n+\r\n+\r\n+=head2 METHOD filter_pcgroup_res\r\n+\r\n+\t## Description : This method filter the results returned by massbank with a user defined score threshold\r\n+\t## Input : $pcgroups, $threshold\r\n+\t## Output : $pcgroups\r\n+\t## Usage : my ( $pcgroups ) = filter_pcgroup_res ( $pcgroups, $threshold ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub filter_pcgroup_res {\r\n+    ## Retrieve Values\r\n+    my $self = shift ;\r\n+  '..b"d the entries object (perl array) needed to html template\r\n+\t## Input : $tbody_object, $nb_items_per_page, $mz_list, $entries\r\n+\t## Output : $tbody_object\r\n+\t## Usage : my ( $tbody_object ) = add_entries_to_tbody_object( $tbody_object, $nb_items_per_page, $mz_list, $entries ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub add_entries_to_tbody_object {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ( $tbody_object, $nb_items_per_page, $mz_list, $JSON ) = @_ ;\r\n+    \r\n+    my $index_page = 0 ;\r\n+    my $index_mz_continous = 0 ;\r\n+    \r\n+    foreach my $page (@{$tbody_object}) {\r\n+    \t\r\n+    \tmy $index_mz = 0 ;\r\n+    \t\r\n+    \tforeach my $mz (@{ $tbody_object->[$index_page]{MASSES} }) {\r\n+    \t\tmy $index_entry = 0 ;\r\n+    \t\tmy $check_noentry = 0 ;\r\n+    \t\tmy @toSort = () ;\r\n+    \t\t\r\n+    \t\tforeach my $record (keys %{ $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS} }) {\r\n+    \t\t\t$check_noentry ++ ;\r\n+\r\n+    \t\t\t\tmy %entry = (\r\n+\t\t    \t\t\tENTRY_COLOR => $tbody_object->[$index_page]{MASSES}[$index_mz]{MZ_COLOR},\r\n+\t\t    \t\t\tENTRY_ENTRY_NAME => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{name}, \t\r\n+\t\t   \t\t\t\tENTRY_ENTRY_ID => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{id}, \r\n+\t\t   \t\t\t\tENTRY_ENTRY_ID2 => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{id},\r\n+\t\t\t\t\t\tENTRY_FORMULA => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{formula},\r\n+\t\t\t\t\t\tENTRY_CPD_MZ => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{exact_mz},\r\n+\t\t\t\t\t\tENTRY_MS_TYPE => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{ms_type},\r\n+\t\t\t\t\t\tENTRY_PRECURSOR_TYPE => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{precursor_type},\r\n+\t\t\t\t\t\tENTRY_INSTRUMENT_TYPE => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{instrument_type},\r\n+\t\t\t\t\t\tENTRY_SCORE => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{score},\r\n+\t\t\t\t\t\tENTRY_ENTRY_INCHI => $JSON->{QUERY}{$mz->{MASSES_MZ_QUERY}}{RECORDS}{$record}{inchi},\t\t\t\r\n+\t\t    \t\t) ;\r\n+\t    \t\t\tpush ( @{ $tbody_object->[$index_page]{MASSES}[$index_mz]{ENTRIES} }, \\%entry) ;\r\n+\r\n+    \t\t\t$index_entry++ ;\t\r\n+    \t\t} ## end foreach record\r\n+    \t\tif ($check_noentry == 0 ) {\r\n+    \t\t\tmy %entry = (\r\n+\t\t    \t\t\tENTRY_COLOR => $tbody_object->[$index_page]{MASSES}[$index_mz]{MZ_COLOR},\r\n+\t\t    \t\t\tENTRY_ENTRY_NAME  => 'UNKNOWN',\r\n+\t\t   \t\t\t\tENTRY_ENTRY_ID => 'NONE',\r\n+\t\t   \t\t\t\tENTRY_ENTRY_ID2 => '',\r\n+\t\t\t\t\t\tENTRY_FORMULA => 'n/a',\r\n+\t\t\t\t\t\tENTRY_CPD_MZ => 'n/a',\r\n+\t\t\t\t\t\tENTRY_MS_TYPE => 'n/a',\r\n+\t\t\t\t\t\tENTRY_PRECURSOR_TYPE => 'n/a',\r\n+\t\t\t\t\t\tENTRY_INSTRUMENT_TYPE => 'n/a',\r\n+\t\t\t\t\t\tENTRY_SCORE => 0,\r\n+\t\t\t\t\t\tENTRY_ENTRY_INCHI => 'n/a',\r\n+\t\t    \t\t) ;\r\n+\t\t    \t\tpush ( @{ $tbody_object->[$index_page]{MASSES}[$index_mz]{ENTRIES} }, \\%entry) ;\r\n+    \t\t}\r\n+    \t\t\r\n+    \t\t## sorted by score\r\n+    \t\tmy @sorted = () ;\r\n+    \t\tmy @temp = @{ $tbody_object->[$index_page]{MASSES}[$index_mz]{ENTRIES} } ;\r\n+    \t\tif (scalar (@temp) > 1 ) { ## for mz without record (only one entry with NA or 0 values)\r\n+    \t\t\t@sorted = sort {  $b->{ENTRY_SCORE} <=> $a->{ENTRY_SCORE} } @temp;\r\n+    \t\t}\r\n+    \t\telse {\r\n+    \t\t\t@sorted = @temp;\r\n+    \t\t}\r\n+    \t\t\r\n+    \t\t$tbody_object->[$index_page]{MASSES}[$index_mz]{ENTRIES} = \\@sorted ;\r\n+    \t\t\r\n+    \t\t$index_mz ++ ;\r\n+    \t\t$index_mz_continous ++ ;\r\n+\r\n+    \t} ## End foreach mz\r\n+    \t$index_page++ ;\r\n+    \t\r\n+    } ## End foreach page\r\n+#    print Dumper $tbody_object ;\r\n+    return($tbody_object) ;\r\n+}\r\n+## END of SUB\r\n+\r\n+\r\n+\r\n+1 ;\r\n+\r\n+\r\n+__END__\r\n+\r\n+=head1 SUPPORT\r\n+\r\n+You can find documentation for this module with the perldoc command.\r\n+\r\n+ perldoc XXX.pm\r\n+\r\n+=head1 Exports\r\n+\r\n+=over 4\r\n+\r\n+=item :ALL is ...\r\n+\r\n+=back\r\n+\r\n+=head1 AUTHOR\r\n+\r\n+Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt>\r\n+\r\n+=head1 LICENSE\r\n+\r\n+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.\r\n+\r\n+=head1 VERSION\r\n+\r\n+version 1 : xx / xx / 201x\r\n+\r\n+version 2 : ??\r\n+\r\n+=cut\n\\ No newline at end of file\n"
b
diff -r 000000000000 -r 023c380900ef lib/massbank_api.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/massbank_api.pm Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,699 @@\n+package lib::massbank_api ;\r\n+\r\n+use strict;\r\n+use warnings ;\r\n+use Exporter ;\r\n+use Carp ;\r\n+\r\n+use Data::Dumper ;\r\n+#use SOAP::Lite +trace => [qw (debug)];\r\n+use SOAP::Lite ;\r\n+\r\n+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);\r\n+\r\n+our $VERSION = "1.0";\r\n+our @ISA = qw(Exporter);\r\n+our @EXPORT = qw( connectMassBankJP connectMassBankDE selectMassBank getInstrumentTypes getRecordInfo searchSpectrum getPeak);\r\n+our %EXPORT_TAGS = ( ALL => [qw( connectMassBankJP connectMassBankDE selectMassBank getInstrumentTypes getRecordInfo searchSpectrum getPeak)] );\r\n+\r\n+\r\n+\r\n+\r\n+=head1 NAME\r\n+\r\n+My::Module - An example module\r\n+\r\n+=head1 SYNOPSIS\r\n+\r\n+    use My::Module;\r\n+    my $object = My::Module->new();\r\n+    print $object->as_string;\r\n+\r\n+=head1 DESCRIPTION\r\n+\r\n+This module does not really exist, it\r\n+was made for the sole purpose of\r\n+demonstrating how POD works.\r\n+\r\n+=head1 METHODS\r\n+\r\n+Methods are :\r\n+\r\n+=head2 METHOD new\r\n+\r\n+\t## Description : new\r\n+\t## Input : $self\r\n+\t## Ouput : bless $self ;\r\n+\t## Usage : new() ;\r\n+\r\n+=cut\r\n+\r\n+sub new {\r\n+    ## Variables\r\n+    my $self={};\r\n+    bless($self) ;\r\n+    return $self ;\r\n+}\r\n+### END of SUB\r\n+\r\n+\r\n+=head2 METHOD connectMassBankJP\r\n+\r\n+\t## Description : create a soap object throught the webservice japan massbank.\r\n+\t## Input : $self\r\n+\t## Ouput : $soap ;\r\n+\t## Usage : my $soap = connectMassBankJP() ;\r\n+\r\n+=cut\r\n+sub connectMassBankJP() {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+\tmy $osoap = SOAP::Lite \r\n+\t\t-> uri(\'http://api.massbank\')\r\n+\t\t-> proxy(\'http://www.massbank.jp/api/services/MassBankAPI?wsdl\', timeout => 100 )\r\n+\t\t-> on_fault(sub { my($soap, $res) = @_; \r\n+         eval { die ref $res ? $res->faultstring : $soap->transport->status, "\\n"};\r\n+         return ref $res ? $res : new SOAP::SOM ;\r\n+         });\r\n+\t\r\n+\treturn ($osoap);\r\n+}\r\n+### END of SUB\r\n+\r\n+=head2 METHOD connectMassBankDE\r\n+\r\n+\t## Description : create a soap object throught the webservice UFZ-DE massbank.\r\n+\t## Input : $self\r\n+\t## Ouput : $soap ;\r\n+\t## Usage : my $soap = connectMassBankDE() ;\r\n+\r\n+=cut\r\n+sub connectMassBankDE() {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+\tmy $osoap = SOAP::Lite \r\n+\t\t-> uri(\'http://api.massbank\')\r\n+#\t\t-> proxy(\'http://massbank.ufz.de/MassBank/api/services/MassBankAPI?wsdl\', timeout => 500 )\r\n+\t\t-> proxy(\'http://massbank.normandata.eu/MassBank/api/services/MassBankAPI?wsdl\', timeout => 500 )\r\n+\t\t-> on_fault(sub { my($soap, $res) = @_; \r\n+         eval { die ref $res ? $res->faultstring : $soap->transport->status, "\\n"};\r\n+         return ref $res ? $res : new SOAP::SOM ;\r\n+         });\r\n+         \r\n+\treturn ($osoap);\r\n+}\r\n+### END of SUB\r\n+\r\n+=head2 METHOD selectMassBank\r\n+\r\n+\t## Description : create a soap object throught a choice of servers like UFZ-DE mirror or JP mirror.\r\n+\t## Input : $server\r\n+\t## Ouput : $soap ;\r\n+\t## Usage : my $soap = selectMassBank($server) ;\r\n+\r\n+=cut\r\n+sub selectMassBank() {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ( $server ) = @_ ;\r\n+    \r\n+    my $osoap = undef ;\r\n+    \r\n+    my $ombk = new() ;\r\n+    \r\n+    if ( (defined $server ) and ($server eq \'JP\') ) {\r\n+    \t$osoap = $ombk->connectMassBankJP() ;\r\n+    }\r\n+    elsif ( (defined $server ) and ($server eq \'EU\') ){\r\n+    \t$osoap = $ombk->connectMassBankDE() ;\r\n+    }\r\n+    elsif ( !defined $server ) {\r\n+    \tcroak "Can\'t adress SOAP connexion : undefined MassBank server\\n" ;\r\n+    }\r\n+    else {\r\n+    \tcroak "Can\'t adress SOAP connexion : unknown MassBank server ($server)\\n" ;\r\n+    }\r\n+\treturn ($osoap);\r\n+}\r\n+### END of SUB\r\n+\r\n+\r\n+\r\n+=head2 METHOD getInstrumentTypes\r\n+\r\n+\t## Description : Get a list of the instrument types resistered in MassBank\r\n+\t## Input : $soap\r\n+\t## Ouput : $res ;\r\n+\t## Usage : $res = getInstrumentTypes($soap) ;\r\n+\r\n+=cut\r\n+sub getInstrumentTypes() {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ($osoap) = @_ ;\r\n+    my @records = () ;\r\n+\r\n+\tmy $res = $osoap -> getInstrumentTypes ;\r\n+\t\r\n+\t## DETECTING A SOAP FAUL'..b'elf\r\n+#\t## Ouput : bless $self ;\r\n+#\t## Usage : new() ;\r\n+#\r\n+#=cut\r\n+#\r\n+#sub execBatchJob() { local($soap, $spectra, $ion, $inst, $mail) = @_;\r\n+#\t$ion = \'both\' if ( $ion eq \'\' );\r\n+#\tlocal(@inst) = @$inst;\r\n+#\t@inst = (\'all\') if ( scalar(@inst) == 0 );\r\n+#\tlocal(%spectra) = %$spectra;\r\n+#\tlocal($name);\r\n+#\tlocal(@query) = ();\r\n+#\tforeach $name ( keys %spectra ) {\r\n+#\t\tlocal(@q) = ("Name:$name");\r\n+#\t\tlocal(%peak) = %{$spectra{$name}};\r\n+#\t\tlocal($mz, $inte);\r\n+#\t\tforeach $mz ( keys %peak ) {\r\n+#\t\t\t$inte = $peak{$mz};\r\n+#\t\t\tpush(@q, "$mz,$inte");\r\n+#\t\t}\r\n+#\t\tpush(@query, join(\';\', @q));\r\n+#\t}\r\n+#\tlocal(@dat) = ();\r\n+#\tlocal($q);\r\n+#\tpush(@dat, SOAP::Data -> name(\'type\' => 1));\r\n+#\tpush(@dat, SOAP::Data -> name(\'mailAddress\' => $mail));\r\n+#\tforeach $q ( @query ) {\r\n+#\t\tpush(@dat, SOAP::Data -> name(\'queryStrings\' => $q));\r\n+#\t}\r\n+#\tlocal($ins);\r\n+#\tforeach $ins ( @inst ) {\r\n+#\t\tpush(@dat, SOAP::Data -> name(\'instrumentTypes\' => $ins));\r\n+#\t}\r\n+#\tpush(@dat, SOAP::Data -> name(\'ionMode\' => $ion));\r\n+#\tlocal($data) = SOAP::Data -> value(@dat);\r\n+#\tlocal($som) = $soap -> execBatchJob($data);\r\n+#\tlocal($res) = $som -> valueof(\'/Envelope/Body/[1]\');\r\n+#\treturn ${$res}{\'return\'};\r\n+#}\r\n+#\r\n+#=head2 METHOD new\r\n+#\r\n+#\t## Description : new\r\n+#\t## Input : $self\r\n+#\t## Ouput : bless $self ;\r\n+#\t## Usage : new() ;\r\n+#\r\n+#=cut\r\n+#\r\n+#sub getJobStatus() { local($soap, $job) = @_;\r\n+#\tlocal(@dat) = ();\r\n+#\tpush(@dat, SOAP::Data -> name(\'jobId\' => $job));\r\n+#\tlocal($data) = SOAP::Data -> value(@dat);\r\n+#\tlocal($som) = $soap -> getJobStatus($data);\r\n+#\tlocal($res) = $som -> valueof(\'/Envelope/Body/[1]/[1]\');\r\n+#\tlocal(%res) = %{$res};\r\n+#\tlocal($status) = $res{\'status\'};\r\n+#\tlocal($code) = $res{\'statusCode\'};\r\n+#\tlocal($date) = $res{\'requestDate\'};\r\n+#\treturn ($status, $code, $date);\r\n+#}\r\n+#\r\n+#=head2 METHOD new\r\n+#\r\n+#\t## Description : new\r\n+#\t## Input : $self\r\n+#\t## Ouput : bless $self ;\r\n+#\t## Usage : new() ;\r\n+#\r\n+#=cut\r\n+#\r\n+#sub getJobResult() { local($soap, $job) = @_;\r\n+#\tlocal(@dat) = ();\r\n+#\tpush(@dat, SOAP::Data -> name(\'jobId\' => $job));\r\n+#\tlocal($data) = SOAP::Data -> value(@dat);\r\n+#\tlocal($som) = $soap -> getJobResult($data);\r\n+#\tlocal(@res) = $som -> valueof(\'/Envelope/Body/[1]/[>0]\');\r\n+#\tlocal($n) = scalar(@res);\r\n+#\tlocal(@ret) = ();\r\n+#\tlocal($i);\r\n+#\tfor ( $i = 0; $i < $n; $i ++ ) {\r\n+#\t\tlocal(%res) = %{$res[$i]};\r\n+#\t\tlocal(@res1) = $som -> valueof(\'/Envelope/Body/[1]/[\'.($i+1).\']/results/[>0]\');\r\n+#\t\tlocal(%ret) = ();\r\n+#\t\tlocal($qname) = $res{\'queryName\'};\r\n+#\t\t$ret{\'qname\'} = $qname;\r\n+#\t\tlocal($num) = $res{\'numResults\'};\r\n+#\t\t$ret{\'num\'} = $num;\r\n+#\t\tlocal(@ret1) = ();\r\n+#\t\tlocal($j);\r\n+#\t\tfor ( $j = 0; $j < $num; $j ++ ) {\r\n+#\t\t\tlocal($mw, $form, $id, $score, $title) = @res1[($j * 5) .. ($j * 5 + 4)];\r\n+#\t\t\tlocal(%val) = (\'id\', $id, \'title\', $title, \'formula\', $form, \'exactMass\', $mw, \'score\', $score);\r\n+#\t\t\tpush(@ret1, { %val });\r\n+#\t\t}\r\n+#\t\t$ret{\'list\'} = [ @ret1 ];\r\n+#\t\tpush(@ret, { %ret });\r\n+#\t}\r\n+#\treturn @ret;\r\n+#}\r\n+\r\n+\r\n+1 ;\r\n+\r\n+\r\n+__END__\r\n+\r\n+=head1 SUPPORT\r\n+\r\n+You can find documentation for this module with the perldoc command.\r\n+\r\n+ perldoc massbank_api.pm\r\n+\r\n+=head1 Exports\r\n+\r\n+=over 4\r\n+\r\n+=item :ALL is ...\r\n+\r\n+=back\r\n+\r\n+=head1 AUTHOR\r\n+\r\n+Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt> and marion Landi E<lt>marion.landi@clermont.inra.frE<gt>\r\n+\r\n+=head1 LICENSE\r\n+\r\n+This script is fully inspired by MassBank SOAP API Client Package Ver-2.0 with :\r\n+\tAuthor: Hisayuki Horail (MassBank Group, IAB, Keio U. and JST-BIRD)\r\n+\tHome page: http://www.massbank.jp/\r\n+\tDate: 25 May 2010\r\n+\tThis software is licensed\r\n+\tunder a Creative Commons Attribution License 2.1 Japan License (CC-BY)\r\n+\t(http://creativecommons.org/licensesby/2.1/jp/).\r\n+\t\r\n+This new version of this program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.\t\r\n+\r\n+=head1 VERSION\r\n+\r\n+version 1 : 25 / 05 / 2010\r\n+\r\n+version 2 : 04 / 06 / 2015\r\n+\r\n+=cut\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 023c380900ef lib/massbank_parser.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/massbank_parser.pm Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,992 @@\n+package lib::massbank_parser ;\n+\n+use strict;\n+use warnings ;\n+use Exporter ;\n+use Carp ;\n+\n+use File::Basename;\n+\n+use Data::Dumper ;\n+\n+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);\n+\n+our $VERSION = "1.0" ;\n+our @ISA = qw(Exporter) ;\n+our @EXPORT = qw( getChemNamesFromString getPeaksFromString ) ;\n+our %EXPORT_TAGS = ( ALL => [qw( getChemNamesFromString getPeaksFromString )] ) ;\n+\n+=head1 NAME\n+\n+parser::chem::massbank - An example module\n+\n+=head1 SYNOPSIS\n+\n+    use parser::chem::massbank ;\n+    my $object = parser::chem::massbank->new();\n+    print $object->as_string;\n+\n+=head1 DESCRIPTION\n+\n+This module does not really exist, it\n+was made for the sole purpose of\n+demonstrating how POD works.\n+\n+=head1 METHODS\n+\n+Methods are :\n+\n+=head2 METHOD new\n+\n+\t## Description : new\n+\t## Input : $self\n+\t## Ouput : bless $self ;\n+\t## Usage : new() ;\n+\n+=cut\n+\n+sub new {\n+    ## Variables\n+    my $self={};\n+    bless($self) ;\n+    return $self ;\n+}\n+### END of SUB\n+\n+=head2 METHOD get_list_of_analysis_intrument_names\n+\n+\t## Description : permt de retourner la liste des nom uniques des instruments utilises\n+\t## Input : $dir, $ms_files (a list of files)\n+\t## Output : $names\n+\t## Usage : my ( $names ) = get_list_of_analysis_intrument_names( $ms_files ) ;\n+\t\n+=cut\n+## START of SUB\n+sub get_list_of_analysis_intrument_names {\n+\t## Retrieve Values\n+    my $self = shift ;\n+    my ( $dir, $ms_files ) = @_ ;\n+    my (%tmp_names, @names) = ( (), () ) ;\n+    foreach my $ms_file (@{$ms_files}) {\n+    \tmy $file = $dir.\'\\\\\'.$ms_file ;\n+    \tif ( ( defined $file ) and ( -e $file )) {\n+\t    \topen(MS, "<$file") or die "Cant\' read the file $file\\n" ;\n+\t    \twhile ( my $field = <MS> ){\n+\t    \t\tchomp $field ;\n+\t        \tif ($field =~/AC\\$INSTRUMENT:(.*)/) {\n+\t        \t\tif ( $tmp_names{$1} ) { last ; }\n+\t        \t\telse { $tmp_names{$1} = 1 ; push (@names, $1) ; }\n+\t        \t}\n+\t    \t}\n+\t    \tclose(MS) ;\n+\t    }\n+\t    else { \n+\t    \tcroak "Can\'t work with a undef / none existing massbank file\\n" ;\n+\t    }\n+    }\n+    return(\\@names) ;\n+}\n+## END of SUB\n+\n+=head2 METHOD get_analysis_instruments_data\n+\n+\t## Description : permet de recuperer tous les champs d\'un object massbank\n+\t## Input : $ms_file\n+\t## Output : $features\n+\t## Usage : my ( $features ) = get_analysis_instruments_data( $ms_file ) ;\n+\t\n+=cut\n+## START of SUB\n+sub get_analysis_instruments_data {\n+\t## Retrieve Values\n+    my $self = shift ;\n+    my ( $ms_file ) = @_ ;\n+    \n+    my $control = 0 ;\n+    my %features = (\n+    \t\'name\' => undef,\n+    \t\'type\' => undef,\n+    ) ;\n+    if ( ( defined $ms_file ) and ( -e $ms_file )) {\n+    \topen(MS, "<$ms_file") or die "Cant\' read the file $ms_file\\n" ;\n+    \twhile ( my $field = <MS> ){\n+    \t\tchomp $field ;    \t\t\n+    \t\tif ($field =~/AC\\$INSTRUMENT: (.*)/) { $features{\'name\'} = $1 ; $control++; }\n+\t    \telsif ($field =~/AC\\$INSTRUMENT_TYPE: (.*)/) { $features{\'type\'} = $1 ; $control++; }\n+\t    \telse { next ; }\n+    \t}\n+    \tclose(MS) ;\n+    }\n+    else {\n+    \tcroak "Can\'t work with a undef / none existing massbank file\\n" ;\n+    }\n+    if ($control == 0) { %features = () ;  }\n+    return(\\%features) ;\n+}\n+## END of SUB\n+     \n+=head2 METHOD get_ms_methods_data\n+\n+\t## Description : permet de recuperer tous les champs d\'un object massbank\n+\t## Input : $ms_file\n+\t## Output : $features\n+\t## Usage : my ( $features ) = get_ms_methods_data( $ms_file ) ;\n+\t\n+=cut\n+## START of SUB\n+sub get_ms_methods_data {\n+\t## Retrieve Values\n+    my $self = shift ;\n+    my ( $ms_file ) = @_ ;\n+    \n+    my $control = 0 ;\n+    my %features = (\n+    \t\'ion_mode\' => undef,\n+    \t\'ms_type\' => undef,\n+    \t\'collision_energy\' => undef,\n+    \t\'collision_gas\' => undef,\n+    \t\'desolvation_gas_flow\' => undef,\n+    \t\'desolvation_temperature\' => undef,\n+    \t\'ionization_energy\' => undef,\n+    \t\'laser\' => undef,\n+    \t\'matrix\' => undef,\n+    \t\'mass_accuracy\' => undef,\n+    \t\'reagent_gas\' => undef,\n+    \t\'scanning\' => undef\n+    ) ;\n+    if ( ( defined $ms_file ) and ('..b'sub get_annotations_data {\n+\t## Retrieve Values\n+    my $self = shift ;\n+    my ( $ms_file ) = @_ ;\n+    \n+    my @features = () ;\n+    if ( ( defined $ms_file ) and ( -e $ms_file )) {\n+    \topen(MS, "<$ms_file") or die "Cant\' read the file $ms_file\\n" ;\n+    \twhile ( my $field = <MS> ){\n+    \t\tchomp $field ;    \t\t\n+    \t\tif ($field =~/PK\\$ANNOTATION:(.*)/) { push( @features, $1) ;  }\n+\t    \telse { next ; }\n+    \t}\n+    \tclose(MS) ;\n+    \t# for db field\n+    }\n+    else {\n+    \tcroak "Can\'t work with a undef / none existing massbank file\\n" ;\n+    }\n+    return(\\@features) ;\n+}\n+## END of SUB\n+\n+=head2 METHOD get_links_data\n+\n+\t## Description : permet de recuperer tous les champs d\'un object massbank\n+\t## Input : $ms_file\n+\t## Output : $features\n+\t## Usage : my ( $features ) = get_annotations_data( $ms_file ) ;\n+\t\n+=cut\n+## START of SUB\n+sub get_links_data {\n+\t## Retrieve Values\n+    my $self = shift ;\n+    my ( $ms_file ) = @_ ;\n+    \n+    my %features = () ;\n+    my $control = 0 ;\n+    \n+    my ( @CAS, @KEGG, @PUBCHEM ) = ((), (), ()) ;\n+    \n+    if ( ( defined $ms_file ) and ( -e $ms_file )) {\n+    \topen(MS, "<$ms_file") or die "Cant\' read the file $ms_file\\n" ;\n+    \twhile ( my $field = <MS> ){\n+    \t\tchomp $field ;    \t\t\n+    \t\tif ($field =~/CH\\$LINK: CAS (.*)/) { push (@CAS, $1) ; $control++; }\n+    \t\telsif ($field =~/CH\\$LINK: KEGG (.*)/) { push (@KEGG, $1) ; $control++; }\n+    \t\telsif ($field =~/CH\\$LINK: PUBCHEM CID (.*)/) { push (@PUBCHEM, $1) ; $control++; }\n+    \t\t## others !!?\n+    \t\t\n+\t    \telse { next ; }\n+    \t}\n+    \tclose(MS) ;\n+    \t# for db field\n+    }\n+    else {\n+    \tcroak "Can\'t work with a undef / none existing massbank file\\n" ;\n+    }\n+    \n+    $features{\'CAS\'} = \\@CAS ;\n+    $features{\'KEGG\'} = \\@KEGG ;\n+    $features{\'PUBCHEM\'} = \\@PUBCHEM ;\n+    \n+    return(\\%features) ;\n+}\n+## END of SUB\n+\n+=head2 METHOD get_ms_record_links_data\n+\n+\t## Description : permet de recuperer tous les champs d\'un object massbank\n+\t## Input : $ms_file\n+\t## Output : $features\n+\t## Usage : my ( $features ) = get_ms_record_links_data( $ms_file ) ;\n+\t\n+=cut\n+## START of SUB\n+sub get_ms_record_links_data {\n+\t## Retrieve Values\n+    my $self = shift ;\n+    my ( $ms_file ) = @_ ;\n+    \n+    ## Internal reference for MASSBANK and RESPECT\n+    \n+    my @massbank_id = ( \'TUE\', \'GLS\', \'AU\', \'MSJ\', \'ML\',\'FIO\', \'UF\', \'CO\', \'UO\', \'TT\', \'OUF\', \'MCH\', \'NU\', \'KNA\', \'MT\', \'CE\', \'KO\', \'KZ\', \'JEL\', \'JP\', \'PR\', \'BML\', \'CA\', \'TY\', \'PB\', \'FU\', \'EA\', \'UT\', \'BSU\', \'WA\' ) ;\n+    my @respect_id = ( \'PS\', \'PT\', \'PM\' ) ;\n+    \n+    my $dabase_used = undef ;\n+    my %db = ( \'accession\' => undef, \'name\' => undef ) ;\n+    my $control = 0 ;\n+    \n+    if ( $ms_file ) {\n+    \tmy $filename = basename("$ms_file",  ".txt");\n+    \t\n+    \tif ( $filename =~ /(\\w+)$/ ) { # keep only record id (0001-PS0002 => PS0002 or BJ0045 => BJ0045) \n+    \t\t$db{\'accession\'} = $1 ;\n+    \t\t$control++ ;\n+    \t\tif ( ( defined $db{\'accession\'} ) and ( $db{\'accession\'} =~ /(\\D+)(\\d+)/) ) {\n+    \t\t\tmy ($key, $eval) = ($1, 0) ;\n+    \t\t\tforeach (@respect_id) { if ($_ eq $key) { $db{\'name\'} = \'RESPECT\' ; $eval = 1 ; last ; } }\n+    \t\t\tforeach (@massbank_id) { if ($_ eq $key) { $db{\'name\'} = \'MASSBANK\' ; $eval = 1 ; last ; } }\n+    \t\t\tif ( $eval == 0 ){ \tcarp "The following key ($key) for $db{\'accession\'} has an unknown reference (not a Massbank or ReSpect source)\\n" ; }\n+    \t\t}\n+    \t}\n+    }\n+    if ($control == 0) { %db = () ;  }\n+\treturn(\\%db) ;\n+}\n+## END of SUB\n+\n+\n+1 ;\n+\n+\n+__END__\n+\n+=head1 SUPPORT\n+\n+You can find documentation for this module with the perldoc command.\n+\n+ perldoc parser::chem::massbank.pm\n+\n+=head1 Exports\n+\n+=over 4\n+\n+=item :ALL is ...\n+\n+=back\n+\n+=head1 AUTHOR\n+\n+Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt>\n+\n+=head1 LICENSE\n+\n+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.\n+\n+=head1 VERSION\n+\n+version 1 : 25 / 06 / 2013\n+\n+version 2 : ??\n+\n+=cut\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 023c380900ef lib/threader.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/threader.pm Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,264 @@
+package lib::threader ;
+
+use strict;
+use warnings ;
+use Exporter ;
+use Carp ;
+use threads;
+use threads::shared;
+use Thread::Queue;
+use diagnostics ;
+use Data::Dumper ;
+use Carp qw (cluck croak carp) ;
+use LWP::UserAgent;
+use LWP::Simple ; ## Lib de protocole HTTP de download
+use SOAP::Lite + trace => qw(fault); ## SOAP for web service version 0.67
+import SOAP::Data qw(name);
+
+use Data::Dumper ;
+
+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);
+
+our $VERSION = "1.0";
+our @ISA = qw(Exporter);
+our @EXPORT = qw(threading_getRecordInfo);
+our %EXPORT_TAGS = ( ALL => [qw(threading_getRecordInfo )] );
+
+=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 searchSpectrumWorker
+
+ ## Description : work with searchSpectrum method in threading mode
+ ## Input : $Qworks
+ ## Output : $results
+ ## Usage : my ( $results ) = searchSpectrumWorker( $Qworks ) ;
+
+=cut
+## START of SUB
+sub searchSpectrumWorker {
+ my $self = shift;
+ my ($Qworks, $server, $ion_mode, $instruments, $max, $unit, $tol, $cutoff) = @_ ;
+ my @results = () ;
+ my @fake = () ;
+
+ my $omassbank = lib::massbank_api->new() ;
+ my $soap = $omassbank->selectMassBank($server) ;
+
+ while(my $pcgroup = $Qworks->dequeue) {
+# print Dumper $pcgroup ;
+     my $oquery= lib::massbank_api->new() ;
+ my ($result, $num) = eval{$oquery->searchSpectrum($soap, $pcgroup->{'id'}, $pcgroup->{'mzmed'}, $pcgroup->{'into'}, $ion_mode, $instruments, $max, $unit, $tol, $cutoff) ; } or die;
+# print "The query send to massbank return $num entries...\n" ;
+# print Dumper $result ;
+
+ if (!defined $num) { $num = 0  ; }
+ if ($num >= 0 ) {
+ push @results, $result ;
+ }
+ else {
+ push @fake, $pcgroup ;
+ }
+    }
+ return (@results) ;
+}
+## END of SUB
+
+   
+=head2 METHOD threading_getRecordInfo
+
+ ## Description : prepare parallel threads - DEPRECATED
+ ## Input : $soap, $list
+ ## Output : $results
+ ## Usage : my ( $results ) = threading_getRecordInfo( $soap, $list ) ;
+
+=cut
+## START of SUB
+sub threading_getRecordInfo {
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $osoap, $list ) = @_ ;
+    
+    my @results = () ;
+    my $i = 0 ; # position in the ids list
+    
+    if ( ( defined $list ) ) {
+    
+     my $oquery = lib::massbank_api->new() ;
+    
+     for (my $i = 0; $i < (scalar @{$list}); $i++ ) {
+     my $thr = threads->create( sub { $oquery->getRecordInfo($osoap, $list->[$i]) } ) ;
+     push ( @results, $thr->join )  if $list->[$i] ;
+     }
+    }
+    else {
+     warn "Your input list of ids is undefined\n" ;
+    }
+    return(\@results) ;
+}
+## END of SUB
+
+
+=head2 METHOD threading_searchSpectrum
+
+ ## Description : prepare parallel threads - DEPRECATED
+ ## Input : $soap, 
+ ## Output : $results
+ ## Usage : my ( $results ) = threading_searchSpectrum( $soap,  ) ;
+
+=cut
+## START of SUB
+sub threading_searchSpectrum {
+
+ ## http://www.perlmonks.org/?node_id=735923
+ ## http://www.nntp.perl.org/group/perl.ithreads/2003/05/msg696.html
+ ## http://stackoverflow.com/questions/15222480/web-service-using-perl-wsdl-and-multi-threading-does-not-working
+ ## Retrieve Values
+    my $self = shift ;
+    my ( $osoap, $pcgroup_list, $pcgroups, $ion_mode, $instruments, $max, $unit, $tol, $cutoff ) = @_ ;
+    
+    my @results = () ;
+    my $n = 6 ; # position in the ids list
+    
+    if ( ( defined $pcgroups ) ) {
+    
+     print Dumper $pcgroups ;
+    
+     my $oquery = lib::massbank_api->new() ;
+    
+     foreach my $pc (@{$pcgroup_list}) {
+    
+     print "\t---> Create a thread for pcgroup n-$pc\n" ;
+    
+     my $thr = threads->create(
+     sub { 
+     $oquery->searchSpectrum($osoap, $pcgroups->{$pc}{'mzmed'}, $pcgroups->{$pc}{'into'}, $ion_mode, $instruments, $max, $unit, $tol, $cutoff) ;
+     } 
+     ) ;
+     push ( @results, $thr->join ) ;
+     } ## end foreach
+    }
+    else {
+     warn "Your input list of ids is undefined\n" ;
+    }
+    return(\@results) ;
+}
+## END of SUB
+
+
+=head2 METHOD thread_and_queue_searchSpectrum
+
+ ## Description : prepare parallel and queuing threads - DEPRECATED
+ ## Input : $soap, 
+ ## Output : $results
+ ## Usage : my ( $results ) = thread_and_queue_searchSpectrum( $soap,  ) ;
+
+=cut
+## START of SUB
+sub thread_and_queue_searchSpectrum {
+#    my $self = shift;
+#    my ( ) = @_;
+#    
+#    our $THREADS = 10;
+# my $Qwork = new Thread::Queue;
+# my $Qresults = new Thread::Queue;
+#
+# ## Create the pool of workers
+# my @pool = map{
+#     threads->create( \&worker, $Qwork, $Qresults )
+# } 1 .. $THREADS;
+#
+# ## Get the work items (from somewhere)
+# ## and queue them up for the workers
+# while( my $workItem = getWorkItems() ) {
+#     $Qwork->enqueue( $workItem );
+# }
+#
+# ## Tell the workers there are no more work items
+# $Qwork->enqueue( (undef) x $THREADS );
+#
+# ## Process the results as they become available
+# ## until all the workers say they are finished.
+# for ( 1 .. $THREADS ) {
+#     while( my $result = $Qresults->dequeue ) {
+#
+#         ## Do something with the result ##
+#         print $result;
+#     }
+# }
+#
+# ## Clean up the threads
+# $_->join for @pool;
+}
+## END of SUB
+
+
+
+1 ;
+
+
+__END__
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+ perldoc XXX.pm
+
+=head1 Exports
+
+=over 4
+
+=item :ALL is ...
+
+=back
+
+=head1 AUTHOR
+
+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 : xx / xx / 201x
+
+version 2 : ??
+
+=cut
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef lib/writter.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/writter.pm Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,300 @@\n+package lib::writter ;\r\n+\r\n+use strict;\r\n+use warnings ;\r\n+use Exporter ;\r\n+use Carp ;\r\n+\r\n+use Data::Dumper ;\r\n+use JSON ;\r\n+use HTML::Template ;\r\n+\r\n+use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS);\r\n+\r\n+our $VERSION = "1.0";\r\n+our @ISA = qw(Exporter);\r\n+our @EXPORT = qw( write_csv_skel write_xls_skel write_json_skel write_html_skel );\r\n+our %EXPORT_TAGS = ( ALL => [qw( write_csv_skel write_xls_skel write_json_skel write_html_skel )] );\r\n+\r\n+=head1 NAME\r\n+\r\n+My::Module - An example module\r\n+\r\n+=head1 SYNOPSIS\r\n+\r\n+    use My::Module;\r\n+    my $object = My::Module->new();\r\n+    print $object->as_string;\r\n+\r\n+=head1 DESCRIPTION\r\n+\r\n+This module does not really exist, it\r\n+was made for the sole purpose of\r\n+demonstrating how POD works.\r\n+\r\n+=head1 METHODS\r\n+\r\n+Methods are :\r\n+\r\n+=head2 METHOD new\r\n+\r\n+\t## Description : new\r\n+\t## Input : $self\r\n+\t## Ouput : bless $self ;\r\n+\t## Usage : new() ;\r\n+\r\n+=cut\r\n+\r\n+sub new {\r\n+    ## Variables\r\n+    my $self={};\r\n+    bless($self) ;\r\n+    return $self ;\r\n+}\r\n+### END of SUB\r\n+\r\n+=head2 METHOD write_csv_skel\r\n+\r\n+\t## Description : prepare and write csv output file\r\n+\t## Input : $csv_file, $rows\r\n+\t## Output : $csv_file\r\n+\t## Usage : my ( $csv_file ) = write_csv_skel( $csv_file, $rows ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub write_csv_skel {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ( $csv_file, $rows ) = @_ ;\r\n+    \r\n+    my $ocsv = lib::csv::new( {is_binary => 1 , quote_binary => 0, quote_char => undef }) ;\r\n+\tmy $csv = $ocsv->get_csv_object("\\t") ;\r\n+\t$ocsv->write_csv_from_arrays($csv, $$csv_file, $rows) ;\r\n+    \r\n+    return($csv_file) ;\r\n+}\r\n+## END of SUB\r\n+\r\n+=head2 METHOD write_xls_skel\r\n+\r\n+\t## Description : prepare and write xls output file\r\n+\t## Input : $xls_file, $rows\r\n+\t## Output : $xls_file\r\n+\t## Usage : my ( $xls_file ) = write_xls_skel( $xls_file, $rows ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub write_xls_skel {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ( $out_xls, $mzs, $pcs, $pcgroups, $records ) = @_ ;\r\n+    \r\n+    my $results = undef ;\r\n+    my $i = 0 ;\r\n+    \r\n+    open(XLS, \'>:utf8\', "$$out_xls") or die "Cant\' create the file $$out_xls\\n" ;\r\n+    print XLS "ID\\tPCGROUP\\tQuery(Da)\\tScore\\tMetabolite_name\\tCpd_Mw(Da)\\tFormula\\tAdduct\\tMASSBANK_ID\\tInstrument\\tMS_level\\n" ;\r\n+\r\n+    $results = [\'ID\',\'PCGROUP\',\'Query(Da)\',\'Score\',\'Metabolite_name\',\'Cpd_Mw(Da)\',\'Formula\',\'Adduct\',\'MASSBANK_ID\',\'Instrument\',\'MS_level\'] ;\r\n+    \r\n+    foreach my $pc (@{$pcs}) {\r\n+    \t\r\n+    \tif ($pcgroups->{$pc}) {\r\n+#    \t\tprint "------>$pc - $pcgroups->{$pc}{annotation}{num_res}\\n" ;\r\n+    \t\t\r\n+    \t\tif ( $pcgroups->{$pc}{\'annotation\'} ) {\r\n+    \t\t\tmy $result = undef ;\r\n+    \t\t\tmy $well_id = "mz_0".sprintf("%04s", $i+1 ) ;\r\n+    \t\t\t\r\n+    \t\t\tif ($pcgroups->{$pc}{\'annotation\'}{\'num_res\'} > 0) {\r\n+\r\n+    \t\t\t\tmy @entries = @{$pcgroups->{$pc}{\'annotation\'}{\'res\'} } ;\r\n+    \t\t\t\tmy $status = undef ;\r\n+    \t\t\t\tforeach my $entry (@entries) {\r\n+    \t\t\t\t\tmy $match = undef ;\r\n+    \t\t\t\t\t## manage if the queried mz is really in the mzs spectrum list...\r\n+    \t\t\t\t\t\r\n+    \t\t\t\t\tif ( $pcgroups->{$pc}{\'enrich_annotation\'}{$mzs->[$i]} ) {\r\n+    \t\t\t\t\t\t\r\n+    \t\t\t\t\t\tmy @matching_ids = @{$pcgroups->{$pc}{\'enrich_annotation\'}{$mzs->[$i]}} ;\r\n+    \t\t\t\t\t\t\r\n+    \t\t\t\t\t\t## \r\n+    \t\t\t\t\t\tif ( scalar @matching_ids == 0 ) {\r\n+    \t\t\t\t\t\t\t$result .= $well_id."\\t".$pc."\\t".$mzs->[$i]."\\t".\'0\'."\\t".\'UNKNOWN\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\n" ;\r\n+\t    \t\t\t\t\t\tprint XLS "$well_id\\t$pc\\t$mzs->[$i]\\t0\\tNA\\tNA\\tNA\\tNA\\tNA\\tNA\\tNA\\n" ;\r\n+\t    \t\t\t\t\t\tlast ;\r\n+    \t\t\t\t\t\t}\r\n+    \t\t\t\t\t\telse {\r\n+    \t\t\t\t\t\t\t# search the massbank matched id\r\n+    \t\t\t\t\t\t\tforeach (@matching_ids) {\r\n+\t    \t\t\t\t\t\t\tif ($_ eq $entry->{\'id\'} ) {\r\n+\t    \t\t\t\t\t\t\t\t$match = \'TRUE\' ;\r\n+\t    \t\t\t\t\t\t\t\tlast ;\r\n+\t    \t\t\t\t\t\t\t}\r\n+\t    \t\t\t\t\t\t}\r\n+\t    \t\t\t\t\t\t\r\n+\t    \t\t\t\t\t\tif ( ( defined $match ) and ($match eq \'TRUE\') ) {\r\n+\t    \t\t\t\t\t\t\t## sort by [\'ID\',\'PCGROUP\',\'Query(Da)\',\'Score\',\'Metabolite_name\',\'Cpd_Mw'..b'y->{\'id\'}}{precursor_type}."\\t" ; \t}\r\n+\t\t\t\t    \t\t\t\telse {\t\t\t\tprint XLS "NA\\t" ; }\r\n+\t\t\t\t    \t\t\t\t## print Massbank ID\r\n+\t\t\t\t    \t\t\t\tif ($entry->{\'id\'}) { \tprint XLS "$entry->{\'id\'}\\t" ; $result .= $entry->{\'id\'}."\\t" ; \t}\r\n+\t\t\t\t    \t\t\t\telse {\t\t\t\tprint XLS "NA\\t" ; }\r\n+\t\t\t\t    \t\t\t\t## print Instrument\r\n+\t\t\t\t    \t\t\t\tif ($entry->{\'id\'}) { \tprint XLS "$records->{$entry->{\'id\'}}{instrument_type}\\t" ; $result .= $records->{$entry->{\'id\'}}{instrument_type}."\\t" ; \t}\r\n+\t\t\t\t    \t\t\t\telse {\t\t\t\tprint XLS "NA\\t" ; }\r\n+\t\t\t\t    \t\t\t\t## print MS_Level\r\n+\t\t\t\t\t\t\t\t\tif ($entry->{\'id\'}) { \tprint XLS "$records->{$entry->{\'id\'}}{ms_type}\\n" ; $result .= $records->{$entry->{\'id\'}}{ms_type}."\\n" ; \t}\r\n+\t\t\t\t    \t\t\t\telse {\t\t\t\tprint XLS "NA\\n" ; }\r\n+\t\r\n+\t    \t\t\t\t\t\t}\r\n+\t    \t\t\t\t\t\t## else match is not TRUE\r\n+\t    \t\t\t\t\t\telse {\r\n+\t    \t\t\t\t\t\t\tnext ;\r\n+\t    \t\t\t\t\t\t}\r\n+    \t\t\t\t\t\t}\r\n+    \t\t\t\t\t}\r\n+    \t\t\t\t} ## End foreach entries\r\n+    \t\t\t}\r\n+    \t\t\telse {\r\n+    \t\t\t\t$result .= $well_id."\\t".$pc."\\t".$mzs->[$i]."\\t".\'0\'."\\t".\'UNKNOWN\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\t".\'NA\'."\\n" ;\r\n+    \t\t\t\tprint XLS "$well_id\\t$pc\\t$mzs->[$i]\\t0\\tNA\\tNA\\tNA\\tNA\\tNA\\tNA\\tNA\\n" ;\r\n+    \t\t\t}\r\n+    \t\t}\r\n+    \t\telse{\r\n+    \t\t\twarn "Not possible to get number of found ids on MassBank\\n" ;\r\n+    \t\t}\r\n+    \t}\r\n+    \telse {\r\n+    \t\tcroak "No such pc group exists in your pcgroups object - No xls written\\n" ;\r\n+    \t}\r\n+    \t$i++ ;\r\n+    \t\r\n+    } ## End foreach pcs\r\n+    \r\n+\tclose(XLS) ;\r\n+    return($results) ;\r\n+}\r\n+## END of SUB\r\n+\r\n+=head2 METHOD write_json_skel\r\n+\r\n+\t## Description : prepare and write json output file\r\n+\t## Input : $json_file, $scalar\r\n+\t## Output : $json_file\r\n+\t## Usage : my ( $json_file ) = write_json_skel( $csv_file, $scalar ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub write_json_skel {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ( $json_file, $scalar ) = @_ ;\r\n+    \r\n+    my $utf8_encoded_json_text = encode_json $scalar ;\r\n+    open(JSON, \'>:utf8\', "$$json_file") or die "Cant\' create the file $$json_file\\n" ;\r\n+    print JSON $utf8_encoded_json_text ;\r\n+    close(JSON) ;\r\n+    \r\n+    return($json_file) ;\r\n+}\r\n+## END of SUB\r\n+\r\n+=head2 METHOD write_html_skel\r\n+\r\n+\t## Description : prepare and write the html output file\r\n+\t## Input : $html_file_name, $html_object, $html_template\r\n+\t## Output : $html_file_name\r\n+\t## Usage : my ( $html_file_name ) = write_html_skel( $html_file_name, $html_object ) ;\r\n+\t\r\n+=cut\r\n+## START of SUB\r\n+sub write_html_skel {\r\n+\t## Retrieve Values\r\n+    my $self = shift ;\r\n+    my ( $html_file_name,  $html_object, $pages , $search_condition, $html_template, $js_path, $css_path ) = @_ ;\r\n+    \r\n+    my $html_file = $$html_file_name ;\r\n+    \r\n+    if ( defined $html_file ) {\r\n+\t\topen ( HTML, ">$html_file" ) or die "Can\'t create the output file $html_file " ;\r\n+\t\t\r\n+\t\tif (-e $html_template) {\r\n+\t\t\tmy $ohtml = HTML::Template->new(filename => $html_template);\r\n+\t\t\t$ohtml->param(  JS_GALAXY_PATH => $js_path, CSS_GALAXY_PATH => $css_path  ) ;\r\n+\t\t\t$ohtml->param(  CONDITIONS => $search_condition  ) ;\r\n+\t\t\t$ohtml->param(  PAGES_NB => $pages  ) ;\r\n+\t\t\t$ohtml->param(  PAGES => $html_object  ) ;\r\n+\t\t\tprint HTML $ohtml->output ;\r\n+\t\t}\r\n+\t\telse {\r\n+\t\t\tcroak "Can\'t fill any html output : No template available ($html_template)\\n" ;\r\n+\t\t}\r\n+\t\t\r\n+\t\tclose (HTML) ;\r\n+    }\r\n+    else {\r\n+    \tcroak "No output file name available to write HTML file\\n" ;\r\n+    }\r\n+    return(\\$html_file) ;\r\n+}\r\n+## END of SUB\r\n+\r\n+1 ;\r\n+\r\n+\r\n+__END__\r\n+\r\n+=head1 SUPPORT\r\n+\r\n+You can find documentation for this module with the perldoc command.\r\n+\r\n+ perldoc writter.pm\r\n+\r\n+=head1 Exports\r\n+\r\n+=over 4\r\n+\r\n+=item :ALL is ...\r\n+\r\n+=back\r\n+\r\n+=head1 AUTHOR\r\n+\r\n+Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt>\r\n+\r\n+=head1 LICENSE\r\n+\r\n+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.\r\n+\r\n+=head1 VERSION\r\n+\r\n+version 1 : 14 / 08 / 2015\r\n+\r\n+version 2 : ??\r\n+\r\n+=cut\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 023c380900ef massbank.tmpl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/massbank.tmpl Wed Apr 19 11:31:58 2017 -0400
b
@@ -0,0 +1,1 @@
+<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content=""><meta name="author" content="INRA de Clermont-Ferrand"><title>Galaxy MassBank (by spectra) queries - All results</title><link rel="stylesheet" type="text/css" href="css.php" media="all"><link rel="stylesheet" type="text/css" href="<TMPL_VAR NAME=CSS_GALAXY_PATH>/simplePagination.css"/><!-- JavaScript --><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script><script src="<TMPL_VAR NAME=JS_GALAXY_PATH>/jquery.simplePagination.js"></script><style type="text/css">body {padding-top: 70px}div.lm-table-warning {  font-size: 1.4em;  font-weight: bold;  padding-right: 25px;  color: #21536a;  margin-left: 3px;}tr.green td  {background-color: #eaf2d3; color: black;}tr.blank td {background-color: #9999CC; color: black;}table {font-family:'Trebuchet MS',Arial,Helvetica,sans-serif;width:100%;border-collapse:collapse;}table.detail, table.detail tr.parent, table.detail td, table.detail th, table.detail tr.category {border-collapse:collapse;border:1px solid #98bf21;}table.detail th {font-size: 1.2em;text-align: center;padding-top: 5px;padding-bottom: 10px;background-color: #a7c942;color: #ffffff;}td.ca {text-align:center;}footer {  margin: 50px 0;}</style><script>function test(pageNumber){  var page="#page-id-"+pageNumber;  $('.select').hide() ; $(page).show()}</script></head><body><div class="container"><div class="lm-table-warning">Results of MASSBANK queries - <TMPL_VAR NAME=CONDITIONS></div><div id="detail_table_source" style="display:none"></div><p><div id="choose"></div><p><div id="ms_search_0" class="ms-search-table"></div><!-- HeadRows--><table id="detail_table" class="detail"><col style="width:30px;"><!-- Ids (m/z)--><col style="width:30px;"><!-- Pcgroup --><col style="width:30px;"><!-- Mass (m/z)--><col style="width:120px;"><!-- Met name--><col style="width:50px;"><!-- Cpd ID--><col style="width:40px;"><!-- formula--><col style="width:60px;"><!-- cpd mw--><col style="width:50px;"><!-- MS type --><col style="width:20px;"><!-- ion/prec. type--><col style="width:80px;"><!-- Instrument type--><col style="width:60px;"><!-- score--><col style="width:60px;"><!-- INCHI--><thead><th>ID from input</th><th>PCGroup</th><th>Mass (m/z)</th><th>Metabolite name</th><th>Compound ID</th><th>Formula</th><th>Compound MW (Da)</th><th>MS type</th><th>ion/prec. type</th><th>Instr. type</th><th>Score</th><th>InChI Identifier</th></thead><TMPL_LOOP NAME=PAGES><tbody class="select" id="page-id-<TMPL_VAR NAME=PAGE_NB>"><TMPL_LOOP NAME=MASSES><tr class="<TMPL_VAR NAME=MZ_COLOR>"><td class="ca" ><TMPL_VAR NAME=MASSES_ID_QUERY></td><td id="<TMPL_VAR NAME=MASSES_NB>" class="ca" ><TMPL_VAR NAME=MASSES_PCGROUP_QUERY></td><td class="ca"><TMPL_VAR NAME=MASSES_MZ_QUERY></td><td class="ca" colspan="9"></td></tr><TMPL_LOOP NAME=ENTRIES><tr class="<TMPL_VAR NAME=ENTRY_COLOR>"><td class="ca" colspan="3"></td><td class="ca"><TMPL_VAR NAME=ENTRY_ENTRY_NAME></td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=<TMPL_VAR NAME=ENTRY_ENTRY_ID2>" target="_blank" class="btn"><TMPL_VAR NAME=ENTRY_ENTRY_ID></a></td><td class="ca"><TMPL_VAR NAME=ENTRY_FORMULA></td><td class="ca"><TMPL_VAR NAME=ENTRY_CPD_MZ></td><td class="ca"><TMPL_VAR NAME=ENTRY_MS_TYPE></td><td class="ca"><TMPL_VAR NAME=ENTRY_PRECURSOR_TYPE></td><td class="ca"><TMPL_VAR NAME=ENTRY_INSTRUMENT_TYPE></td><td class="ca"><TMPL_VAR NAME=ENTRY_SCORE></td><td class="ca"><TMPL_VAR NAME=ENTRY_ENTRY_INCHI></td></tr></TMPL_LOOP></TMPL_LOOP></tbody></TMPL_LOOP></table></div><div class="container"><hr><footer><div class="row">  <div class="col-lg-12"><p>Copyright &copy; INRA, N Paulhe, F Giacomoni 2014 </p>  </div> </div> </footer></div><script language="javascript">$(function() {$('#choose').pagination({items: <TMPL_VAR NAME=PAGES_NB>,itemsOnPage: 1,currentPage: 1,onInit: function () { test(1); },cssStyle: 'light-theme',onPageClick: function(pageNumber){test(pageNumber)}}).pagination('redraw');});</script></body></html>
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef massbank_ws_searchspectrum.pl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/massbank_ws_searchspectrum.pl Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,423 @@\n+#!perl\r\n+\r\n+## script  : XXX.pl\r\n+\r\n+## Notes :\r\n+#\t-> manage score sorting : Cleaned_pcGroups done but not in outputs !\r\n+\r\n+#=============================================================================\r\n+#                              Included modules and versions\r\n+#=============================================================================\r\n+## Perl modules\r\n+use strict ;\r\n+use warnings ;\r\n+use Carp qw (cluck croak carp) ;\r\n+\r\n+use threads;\r\n+use threads::shared;\r\n+use Thread::Queue;\r\n+\r\n+use Data::Dumper ;\r\n+use Getopt::Long ;\r\n+use POSIX ;\r\n+use FindBin ; ## Allows you to locate the directory of original perl script\r\n+\r\n+## Specific Perl Modules (PFEM)\r\n+use lib $FindBin::Bin ;\r\n+my $binPath = $FindBin::Bin ;\r\n+use lib::csv  qw( :ALL ) ;\r\n+use lib::conf  qw( :ALL ) ;\r\n+\r\n+## Dedicate Perl Modules (Home made...)\r\n+use lib::massbank_api qw( :ALL ) ;\r\n+use lib::threader qw(:ALL) ;\r\n+use lib::mapper qw(:ALL) ;\r\n+use lib::writter qw(:ALL) ;\r\n+use lib::massbank_parser qw(:ALL) ;\r\n+\r\n+\r\n+\r\n+## Initialized values\r\n+my ($help, $mzs_file, $col_mz, $col_int, $col_pcgroup, $line_header ) = ( undef, undef, undef, undef, undef,undef, undef ) ;\r\n+my ($server, $ion_mode, $score_threshold, $instruments, $max, $unit, $tol, $cutoff) = ( undef, undef, undef, undef, undef, undef, undef ) ;\r\n+my ($output_json, $output_tabular, $output_xlsx, $output_html ) = ( undef, undef, undef, undef ) ;\r\n+\r\n+## Local values ONLY FOR TEST :\r\n+#my $server = \'JP\' ;\r\n+#my $threading_threshold = 6 ;\r\n+\r\n+#=============================================================================\r\n+#                                Manage EXCEPTIONS\r\n+#=============================================================================\r\n+&GetOptions ( \t"help|h"     \t\t=> \\$help,       # HELP\r\n+\t\t\t\t"masses:s"\t\t\t=> \\$mzs_file,\r\n+\t\t\t\t"col_mz:i"\t\t\t=> \\$col_mz,\r\n+\t\t\t\t"col_int:i"\t\t\t=> \\$col_int, ## optionnal\r\n+\t\t\t\t"col_pcgroup:i"\t\t=> \\$col_pcgroup,\r\n+\t\t\t\t"lineheader:i"\t\t=> \\$line_header,\r\n+\t\t\t\t"mode:s"\t\t\t=> \\$ion_mode, \r\n+\t\t\t\t"score_threshold:f"\t=> \\$score_threshold, \r\n+\t\t\t\t"instruments:s"\t\t=> \\$instruments, # advanced -> to transform into string with comma => done !\r\n+\t\t\t\t"max:i"\t\t\t\t=> \\$max, # advanced\r\n+\t\t\t\t"unit:s"\t\t\t=> \\$unit, # advanced\r\n+\t\t\t\t"tolerance:f"\t\t=> \\$tol, \r\n+\t\t\t\t"cutoff:i"\t\t\t=> \\$cutoff, # advanced : intensity cutoff\r\n+\t\t\t\t"server:s"\t\t\t=> \\$server, ## by default JP and # advanced\r\n+\t\t\t\t"output_json:s"\t\t=> \\$output_json,\r\n+\t\t\t\t"output_xlsx:s"\t\t=> \\$output_xlsx,\r\n+\t\t\t\t"output_tabular:s"\t=> \\$output_tabular,\r\n+\t\t\t\t"output_html:s"\t\t=> \\$output_html,\r\n+            ) ;\r\n+         \r\n+## if you put the option -help or -h function help is started\r\n+if ( defined($help) ){ &help ; }\r\n+\r\n+#=============================================================================\r\n+#                                MAIN SCRIPT\r\n+#=============================================================================\r\n+\r\n+## -------------- Conf file ------------------------ :\r\n+my ( $CONF ) = ( undef ) ;\r\n+foreach my $conf ( <$binPath/*.cfg> ) {\r\n+\tmy $oConf = lib::conf::new() ;\r\n+\t$CONF = $oConf->as_conf($conf) ;\r\n+}\r\n+\r\n+## -------------- HTML template file ------------------------ :\r\n+foreach my $html_template ( <$binPath/*.tmpl> ) { $CONF->{\'HTML_TEMPLATE\'} = $html_template ; }\r\n+\r\n+## Main variables :\r\n+my ($pcs, $mzs, $into, $complete_rows, $pcgroups) = (undef, undef, undef, undef, undef) ;\r\n+\r\n+## manage csv file containing list of masses (every thing is manage in jar)\r\n+if ( ( defined $mzs_file ) and ( $mzs_file ne "" ) and ( -e $mzs_file ) ) {\r\n+\t\r\n+\t## parse csv ids and masses\r\n+\tmy $is_header = undef ;\r\n+\tmy $ocsv = lib::csv->new() ;\r\n+\tmy $csv = $ocsv->get_csv_object( "\\t" ) ;\r\n+\tif ( ( defined $line_header ) and ( $line_header > 0 ) ) { $is_header = \'yes\' ;    }\r\n+\t$pcs = $ocsv->get_value_from_csv_multi_header( $csv, $mzs_file, $col_pcgroup, $is_header, $line_header ) ; ## retrieve pc values on csv\r\n+\t$mzs = $ocsv->get_value_from_csv_multi_header( $csv, $mzs_file, $col_mz, $'..b'\r\n+\tmy $owritter = lib::writter->new() ;\r\n+\t$owritter->write_csv_skel(\\$output_tabular, $massbank_matrix) ;\r\n+}\r\n+\r\n+my $json_scalar = undef ;\r\n+## JSON OUTPUT\r\n+if (  (defined $output_json) and  (defined $well_annoted_pcGroups) and  (defined $mzs) and  (defined $pcs)  ) {\r\n+\tmy $omapper = lib::mapper->new() ;\r\n+\t$json_scalar = $omapper->map_pc_to_generic_json($pcs, $well_annoted_pcGroups, \\%records) ;\r\n+\tmy $owritter = lib::writter->new() ;\r\n+\t$owritter->write_json_skel(\\$output_json, $json_scalar) ;\r\n+}\r\n+\r\n+## HTML OUTPUT -- TODO\r\n+if (  (defined $output_html) and  (defined $json_scalar)  ) {\r\n+\t\r\n+#\tprint Dumper $json_scalar ;\r\n+\t\r\n+\t## Uses N mz and theirs entries per page (see config file).\r\n+\t# how many pages you need with your input mz list?\r\n+\tmy $nb_pages_for_html_out = ceil( scalar(@{$mzs} ) / $CONF->{HTML_ENTRIES_PER_PAGE} )  ;\r\n+\t\r\n+\t## Search condition:\r\n+\tmy $search_condition = "Search params : Molecular specie = $ion_mode / delta ($unit) = $tol / Score threshold = $score_threshold and max hit = $max per pcgroup" ;\r\n+\t\r\n+\tmy $oHtml = lib::mapper->new() ;\r\n+\tmy ($tbody_object) = $oHtml->set_html_tbody_object( $nb_pages_for_html_out, $CONF->{HTML_ENTRIES_PER_PAGE} ) ;\r\n+\t($tbody_object) = $oHtml->add_mz_to_tbody_object($tbody_object, $CONF->{HTML_ENTRIES_PER_PAGE}, $mzs, $json_scalar) ;\r\n+\t($tbody_object) = $oHtml->add_entries_to_tbody_object($tbody_object, $CONF->{HTML_ENTRIES_PER_PAGE}, $mzs, $json_scalar) ;\r\n+\t\r\n+\tmy $oWritter = lib::writter->new() ;\r\n+\t$oWritter->write_html_skel(\\$output_html, $tbody_object, $nb_pages_for_html_out, $search_condition, $CONF->{\'HTML_TEMPLATE\'}, $CONF->{\'JS_GALAXY_PATH\'}, $CONF->{\'CSS_GALAXY_PATH\'}) ;\r\n+}\r\n+else {\r\n+\twarn "[WARN] The html output file or the json iss not defined\\n" ;\r\n+}\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+\r\n+#====================================================================================\r\n+# Help subroutine called with -h option\r\n+# number of arguments : 0\r\n+# Argument(s)        :\r\n+# Return           : 1\r\n+#====================================================================================\r\n+sub help {\r\n+\tprint STDERR "\r\n+massbank_ws_searchspectrum.pl\r\n+\r\n+# massbank_ws_searchspectrum.pl is a script to use SOAP massbank webservice and send specific queries about spectra searches. \r\n+# Input : a list of mzs, intensities, pcgroup.\r\n+# Author : Franck Giacomoni\r\n+# Email : franck.giacomoni\\@clermont.inra.fr\r\n+# Version : 1.0\r\n+# Created : 20/01/2017\r\n+USAGE :\t\t \r\n+\t\tmassbank_ws_searchspectrum.pl -help OR\r\n+\t\t\r\n+\t\tmassbank_ws_searchspectrum.pl \r\n+\t\t\t-masses [name of input file] -col_id -col_mz -col_int -col_pcgroup -lineheader\r\n+\t\t\t-mode [ion mode : Positive, Negative or Both ]\r\n+\t\t\t-score_threshold [Ignore Massbank results with a score lower than the defined threshold]\r\n+\t\t\t-instruments [array of string: all or values obtained by getInstrumentTypes method]\r\n+\t\t\t-max [0 is all results or int]\r\n+\t\t\t-unit [unit or ppm]\r\n+\t\t\t-tolerance [Tolerance of values of m/z of peaks: 0.3 unit or 50 ppm]\r\n+\t\t\t-cutoff [Ignore peaks whose intensity is not larger than the value of cutoff. Default: 50)]\r\n+\t\t\t-server [name of the massbank server : EU or JP only]\r\n+\t\t\t-output_json [ouput file for JSON]\r\n+\t\t\t-output_xls [ouput file for XLS]\r\n+\t\t\t-output_tabular [ouput file for TABULAR]\r\n+\t\t\r\n+\t\t";\r\n+\texit(1);\r\n+}\r\n+\r\n+## END of script - F Giacomoni \r\n+\r\n+__END__\r\n+\r\n+=head1 NAME\r\n+\r\n+ XXX.pl -- script for\r\n+\r\n+=head1 USAGE\r\n+\r\n+ XXX.pl -precursors -arg1 [-arg2] \r\n+ or XXX.pl -help\r\n+\r\n+=head1 SYNOPSIS\r\n+\r\n+This script manage ... \r\n+\r\n+=head1 DESCRIPTION\r\n+\r\n+This main program is a ...\r\n+\r\n+=over 4\r\n+\r\n+=item B<function01>\r\n+\r\n+=item B<function02>\r\n+\r\n+=back\r\n+\r\n+=head1 AUTHOR\r\n+\r\n+Franck Giacomoni E<lt>franck.giacomoni@clermont.inra.frE<gt>\r\n+Yann Guitton \r\n+\r\n+=head1 LICENSE\r\n+\r\n+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.\r\n+\r\n+=head1 VERSION\r\n+\r\n+version 1 : 05 / 01 / 2016\r\n+\r\n+version 2 : ??\r\n+\r\n+=cut\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 023c380900ef massbank_ws_searchspectrum.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/massbank_ws_searchspectrum.xml Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,268 @@\n+<tool id="massbank_ws_searchspectrum" name="MassBank spectrum searches" version="2017-02-06">\n+  <description>\n+       : Search by pseudo-spectra on a High Quality Mass Spectral Database.\n+  </description>\n+  <requirements>\n+    <requirement type="package" version="1.19">perl-soap-lite</requirement>\n+    <requirement type="package" version="6.15">perl-lwp-simple</requirement>\n+\t<requirement type="package" version="6.15">perl-libwww-perl</requirement>\n+    <requirement type="package" version="2.95">perl-html-template</requirement>\n+    <requirement type="package" version="1.71">perl-uri</requirement>\n+    <requirement type="package" version="1.33">perl-text-csv</requirement>\n+    <requirement type="package" version="2.90">perl-json</requirement>\n+  </requirements>\n+  <stdio>\n+    <exit_code level="fatal" range="1"/>\n+  </stdio>\n+  <command><![CDATA[\n+\tperl $__tool_directory__/massbank_ws_searchspectrum.pl -masses "${variableMetadata_in}" -col_mz "$col_mz" -col_pcgroup "$col_pcgroup" -score_threshold "$score_threshold"\n+\t\t#if str($header.header_choice) == "true":\n+\t\t\t-lineheader "${header.nbheader}"\n+\t\t#end if\n+\t\t\n+\t\t#if str($intensity.colint_choice) == "true":\n+\t\t\t-col_int "${intensity.col_int}"\n+\t\t#end if\n+\t\t\n+\t\t#if str($mode) == "Positive,Negative":\n+\t\t\t-mode "both"\n+\t\t#else:\n+\t\t\t-mode "$mode"\n+\t\t#end if\n+\t\t\n+\t\t#if str($advanced.advanced_settings) == "false":\n+\t\t\t-instruments "all" -max "10" -unit "unit" -tolerance "0.3" -cutoff "50" -server "JP"\n+\t\t#else:\n+\t\t\t-instruments "${advanced.instruments}" -max "${advanced.max}"\n+\t\t\t-unit "${advanced.mz_tolerance.unit}" -tolerance "${advanced.mz_tolerance.tolerance}"\n+\t\t\t-cutoff "${advanced.cutoff}" -server "${advanced.server}"\n+\t\t#end if\n+\t\t\n+\t\t-output_tabular "$variableMetadata_out"\n+\t\t-output_xlsx "$massBankSpectraOutXlsx"\n+\t\t-output_json "$massBankSpectraOutJson"\n+\t\t-output_html "$massBankSpectraOutWeb"\n+\n+  ]]></command>\n+  <inputs>\n+    <param format="tabular" help="Generally variable metadata file" label="File of masses (format: tabular)" name="variableMetadata_in" type="data"/>\n+    <conditional name="header">\n+      <param checked="true" falsevalue="false" help="if \'YES\' is selected then enter your number of header lines" label="Do you have a header?" name="header_choice" truevalue="true" type="boolean"/>\n+      <when value="true">\n+        <param help="number of lines not containing masses" label="Number of header lines" max="10" min="1" name="nbheader" type="integer" value="1"/>\n+      </when>\n+      <when value="false"/>\n+    </conditional>\n+    <param accept_default="true" data_ref="variableMetadata_in" label="Column of masses (MZ)" name="col_mz" type="data_column"/>\n+    <param accept_default="true" data_ref="variableMetadata_in" label="Column of pcgroup" name="col_pcgroup" type="data_column"/>\n+    <conditional name="intensity">\n+      <param checked="true" falsevalue="false" help="if \'No\' is selected, the value of intensity for each mz is set to 10 (MassBank spectrum search require mz-pcgroup-intensity data - please use massbank peak search if needed)" label="Do you have a column of intensity?" name="colint_choice" truevalue="true" type="boolean"/>\n+      <when value="true">\n+        <param accept_default="true" data_ref="variableMetadata_in" label="Column of intensity" name="col_int" type="data_column"/>\n+      </when>\n+      <when value="false"/>\n+    </conditional>\n+    <param display="checkboxes" help="" label="What kind of Ionization Search will be done?" multiple="True" name="mode" type="select">\n+      <option selected="true" value="Positive">Positif Mode</option>\n+      <option selected="true" value="Negative">Negatif Mode</option>\n+    </param>\n+    <param help="Default value is 0.5." label="Score threshold to apply on returned MassBank results" max="1" min="0" name="score_threshold" type="float" value="0.5"/>\n+    <conditional name="advanced">\n+      <param checked="false" falsevalue="false" help="if \'NO\' is selected then defaults values '..b'e" value="Positive"/>\n+      <param name="score_threshold" value="0.5"/>\n+      <param name="advanced_settings" value="true"/>\n+      <param name="instruments" value="all"/>\n+      <param name="max" value="20"/>\n+      <param name="unit" value="unit"/>\n+      <param name="tolerance" value="0.3"/>\n+      <param name="cutoff" value="50"/>\n+      <param name="server" value="JP"/>\n+      <output file="out_test01.tabular" name="variableMetadata_out"/>\n+      <output file="out_test01.html" name="massBankSpectraOutWeb"/>\n+      <output file="out_test01.txt" name="massBankSpectraOutXlsx"/>\n+      <!--<output file="out_test01.json" name="massBankSpectraOutJson"/> The JSON output structure is messy, so it is delete from test-->\n+    </test>\n+    <!--t<test>\n+  \t</test>\n+    <test>\n+  \t</test>-->\n+  </tests>\n+  <help><![CDATA[\n+\n+.. class:: infomark\n+\n+**Wrapping**\n+  | Franck Giacomoni - PFEM ; INRA ; MetaboHUB (for xml interface and perl wrapper and WS client)\n+\n+---------------------------------------------------\n+\n+.. class:: infomark\n+\n+**Please cite** If you use this tool, please cite MassBank (http://www.massbank.jp)\n+\n+\n+==============\n+wsdl_MassBank\n+==============\n+\n+-----------\n+Description\n+-----------\n+\n+Finding information (search spectra method) in the MassBank project via a web service from masses and pcgroups.\n+\n+-----------------\n+Workflow position\n+-----------------\n+\n+\n+.. image:: ./static/images/metabolomics/massbank-ws.png\n+        :width: 800\n+\n+\n+-----------\n+Input files\n+-----------\n+\n++-------------------------+-----------+\n+| Parameter : num + label |  Format   |\n++=========================+===========+\n+| 1 : variableMetadata    |  tabular  |\n++-------------------------+-----------+\n+\n+File variableMetadata must have at least the 3 following column : \n+\t* Masses : column with all the masses in the tabular input file\n+\t* Intensities : column with all the intensities in the tabular input file (Optionnal but if you haven\'t intensitt values, please use the Massbank peak search tool)\n+\t* PCgroups : column with all the pcgroups in the tabular input file\n+\n+\n+----------\n+Parameters\n+----------\n+\n+Number of header lines\n+\t| Number of lines not containing values \n+\t|\n+\n+Column of masses\n+\t| Specify the column number for the mass in the tabular input file\n+\t|\n+\n+Tolerance of mass (in unit or ppm)\n+\t| Specify a delta (+/-) to the mass to search\n+\t\n+Parameters applied on query\n+\t| cutoff : intensity cutoff (don\'t add to the query, mz with intensity below defined cutoff).\n+\t| max: maximum number of records returned by the MASSBANK server foreach pcgroup of masses (by default max is set to 10).\n+\t| score_threshold: apply a filter on MASSBANK scores (by default threshold is set to 0.5).\n+\t| mode : Ionization search mode: Positive or Negative ou Both\n+\t| Instrument: filter applied on spectra depending of the instrument source. (All is the default value) - - GCMS technologies are available in W4M GCMS tools section.\n+\n+------------\n+Output files\n+------------\n+\n+Two types of files\n+\t| MASSBANK_WEB.html: for viewing result via HTML.\n+\t| MASSBANK.tabular: for linking with others modules.\n+\t| MASSBANK_XLS.txt: an excel-like output to export results under a multi lines format.\n+\t| MASSBANK_JSON.txt: an json output will be available.\n+\t\n+---------------------------------------------------\n+\n+\n+---------------\n+Working example\n+---------------\n+\n+\n+.. class:: warningmark\n+\n+Refer to the corresponding W4M HowTo section: http://workflow4metabolomics.org/howto\n+ | Format Data For Postprocessing\n+ | Perform LCMS Annotations\n+\n+.. class:: warningmark\n+\n+And their "W4M courses 2016":\n+ | Using Galaxy4Metabolomics - W4M table format for Galaxy\n+ | Annotation Banks - Annotation  \n+\t\n+\t]]></help>\n+  <!-- [RECOMMANDED] All citations associated to this tool (main citation given above and other references). Can be extracted from the history panel -->\n+  <citations>\n+    <citation type="doi">10.1002/jms.1777</citation>\n+  </citations>\n+</tool>\n'
b
diff -r 000000000000 -r 023c380900ef t/lib/massbank_api_Test.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/lib/massbank_api_Test.pm Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,119 @@
+package lib::massbank_api_Test ;
+
+use diagnostics; # this gives you more debugging information
+use warnings;    # this warns you of bad practices
+use strict;      # this prevents silly errors
+use Exporter ;
+use Carp ;
+
+use Data::Dumper ;
+
+our $VERSION = "1.0";
+our @ISA = qw(Exporter);
+our @EXPORT = qw(   initRecordObjectTest threading_methods_getRecordInfoTest connectMassBankTest connectMassBankJPTest connectMassBankDETest getInstrumentTypesTest getRecordInfoTest searchSpectrumTest searchSpectrumNBTest getPeakTest);
+our %EXPORT_TAGS = ( ALL => [qw(  initRecordObjectTest threading_methods_getRecordInfoTest connectMassBankTest connectMassBankJPTest connectMassBankDETest getInstrumentTypesTest getRecordInfoTest searchSpectrumTest searchSpectrumNBTest getPeakTest)] );
+
+use lib '/Users/fgiacomoni/Inra/labs/perl/galaxy_tools/massbank_ws_searchspectrum' ;
+use lib::massbank_api qw( :ALL ) ;
+use lib::threader qw( :ALL ) ;
+use lib::mapper qw( :ALL ) ;
+
+
+my $server = 'JP' ;
+
+sub connectMassBankTest {
+ my ($uri, $proxy) = @_ ;
+    my $oBih = lib::massbank_api->new() ;
+    my ($soap) = $oBih->connectMassBank($uri, $proxy) ;
+    return ($soap) ;
+}
+
+sub connectMassBankJPTest {
+    my $oBih = lib::massbank_api->new() ;
+    my ($soap) = $oBih->connectMassBankJP() ;
+    return ($soap) ;
+}
+
+sub connectMassBankDETest {
+    my $oBih = lib::massbank_api->new() ;
+    my ($soap) = $oBih->connectMassBankDE() ;
+    return ($soap) ;
+}
+
+sub getInstrumentTypesTest {
+ my ($server) = @_ ;
+ my $osoap = undef ;
+    my $oBih = lib::massbank_api->new() ;
+    
+    if ($server eq 'JP') {  ($osoap) = $oBih->connectMassBankJP() ; }
+    elsif ($server eq 'EU') { ($osoap) = $oBih->connectMassBankDE() ; }
+    else { croak "Can't call an unknown server through MassBank API\n" ; }
+    
+    my $res = $oBih->getInstrumentTypes($osoap) ;
+    return ($res) ;
+}
+
+sub getRecordInfoTest {
+ my ($server, $ids) = @_ ;
+
+ my $oBih = lib::massbank_api->new() ;
+    my ($osoap) = $oBih->selectMassBank($server) ;
+    my ($res) = $oBih->getRecordInfo($osoap, $ids) ;
+
+    return($res) ;
+}
+
+
+sub searchSpectrumTest {
+ my ($mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff) = @_ ;
+ my $pcgroup_id = 1 ;
+ my $oBih = lib::massbank_api->new() ;
+    my ($osoap) = $oBih->selectMassBank($server) ;
+    my ($res, $num) = $oBih->searchSpectrum($osoap, $pcgroup_id, $mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff) ;
+    print Dumper $res ;
+    return($res) ;
+}
+
+sub searchSpectrumNBTest {
+ my ($mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff) = @_ ;
+ my $pcgroup_id = 1 ;
+ my $oBih = lib::massbank_api->new() ;
+    my ($osoap) = $oBih->selectMassBank($server) ;
+    my ($res, $num) = $oBih->searchSpectrum($osoap, $pcgroup_id, $mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff) ;
+    return($num) ;
+}
+
+sub getPeakTest {
+ my ($ids) = @_ ;
+
+ my $oBih = lib::massbank_api->new() ;
+    my ($osoap) = $oBih->selectMassBank($server) ;
+    my ($res) = $oBih->getPeak($osoap, $ids) ;
+    return($res) ;
+}
+
+sub threading_methods_getRecordInfoTest {
+ my ($ids) = @_ ;
+
+ my $results = undef ;
+ my $othreads = lib::threader->new() ;
+ my $oquery = lib::massbank_api->new() ;
+ my ($osoap) = $oquery->selectMassBank($server) ;
+ $results = $othreads->threading_getRecordInfo($osoap, $ids) ; 
+ return($results) ;
+}
+
+## SUB TEST for initRecordObject
+sub initRecordObjectTest {
+    # get values
+    my ( $string ) = @_;
+    
+    my $omassbank = lib::massbank_api->new() ;
+    my $record = $omassbank->initRecordObject($string) ;
+#    print Dumper $record ;
+    return($record) ;
+}
+## End SUB
+
+
+1 ;
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef t/lib/massbank_main_Test.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/lib/massbank_main_Test.pm Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,45 @@
+package lib::massbank_main_Test ;
+
+use diagnostics; # this gives you more debugging information
+use warnings;    # this warns you of bad practices
+use strict;      # this prevents silly errors
+use Exporter ;
+use Carp ;
+
+use Data::Dumper ;
+
+our $VERSION = "1.0";
+our @ISA = qw(Exporter);
+our @EXPORT = qw( run_main_massbank_pl);
+our %EXPORT_TAGS = ( ALL => [qw(run_main_massbank_pl)] );
+
+#use lib '/Users/fgiacomoni/Inra/labs/perl/galaxy_tools/massbank_ws_searchspectrum' ;
+#use lib::mapper qw( :ALL ) ;
+
+sub run_main_massbank_pl {
+
+ my ($input_file, $col_mz, $col_pcgroup, $col_int, $lineheader, $score_threshold, $mode, $instruments, $max, $unit, $tol, $cutoff, $server, $json, $csv, $xls) = @_ ;
+
+ my $msg = `perl /Users/fgiacomoni/Inra/labs/perl/galaxy_tools/massbank_ws_searchspectrum/massbank_ws_searchspectrum.pl -masses $input_file -col_mz $col_mz -col_pcgroup $col_pcgroup -col_int $col_int -lineheader $lineheader -mode $mode -score_threshold $score_threshold -instruments $instruments -max $max -unit $unit -tolerance $tol -cutoff $cutoff -server $server -json $json -csv $csv -xls $xls`;
+ print $msg ;
+#-masses /Users/fgiacomoni/Inra/labs/tests/massbank_V02/pcgrp_annot.tsv
+#-col_mz 1
+#-col_pcgroup 14
+#-col_int 7
+#-lineheader 1
+#-score_threshold 0.5
+#-mode Positive
+#-instruments all
+#-max 2
+#-unit unit
+#-tolerance 0.3
+#-cutoff 5
+#-server JP
+#-json /Users/fgiacomoni/Inra/labs/tests/massbank_V02/out.json
+#-csv /Users/fgiacomoni/Inra/labs/tests/massbank_V02/out.csv
+#-xls /Users/fgiacomoni/Inra/labs/tests/massbank_V02/out.xls
+
+}
+
+
+1 ;
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef t/lib/massbank_mapper_Test.pm
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/lib/massbank_mapper_Test.pm Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,118 @@
+package lib::massbank_mapper_Test ;
+
+use diagnostics; # this gives you more debugging information
+use warnings;    # this warns you of bad practices
+use strict;      # this prevents silly errors
+use Exporter ;
+use Carp ;
+
+use Data::Dumper ;
+
+our $VERSION = "1.0";
+our @ISA = qw(Exporter);
+our @EXPORT = qw( max_from_double_with_deltaTest min_from_double_with_deltaTest get_massbank_records_by_chunkTest compute_ids_from_pcgroups_resTest filter_pcgroup_resTest get_pcgroup_listTest get_pcgroupsTest set_massbank_matrix_objectTest add_massbank_matrix_to_input_matrixTest);
+our %EXPORT_TAGS = ( ALL => [qw(max_from_double_with_deltaTest min_from_double_with_deltaTest get_massbank_records_by_chunkTest compute_ids_from_pcgroups_resTest filter_pcgroup_resTest get_pcgroup_listTest get_pcgroupsTest set_massbank_matrix_objectTest add_massbank_matrix_to_input_matrixTest)] );
+
+use lib '/Users/fgiacomoni/Inra/labs/perl/galaxy_tools/massbank_ws_searchspectrum' ;
+use lib::mapper qw( :ALL ) ;
+
+sub get_pcgroupsTest {
+ my ( $pcs, $mzs, $ints ) = @_;
+ my $omap = lib::mapper->new() ;
+ my $pcgroups = $omap->get_pcgroups($pcs, $mzs, $ints) ;
+# print Dumper $pcgroups ;
+ return ($pcgroups) ;
+}
+
+
+sub get_pcgroup_listTest {
+ my ($pcs) = @_ ; 
+ my $omap = lib::mapper->new() ;
+ my $pcgroup_list = $omap->get_pcgroup_list($pcs) ;
+# print Dumper $pcgroup_list ;
+ return ($pcgroup_list) ;
+}
+
+sub set_massbank_matrix_objectTest {
+ my ($header, $init_pcs, $pcgroups) = @_ ; 
+ my $omap = lib::mapper->new() ;
+ my $matrix = $omap->set_massbank_matrix_object($header, $init_pcs, $pcgroups) ;
+# print Dumper $matrix ;
+ return ($matrix) ;
+}
+
+sub add_massbank_matrix_to_input_matrixTest {
+ my ($input_matrix_object, $massbank_matrix_object ) = @_ ; 
+ my $omap = lib::mapper->new() ;
+ my $matrix = $omap->add_massbank_matrix_to_input_matrix($input_matrix_object, $massbank_matrix_object ) ;
+# print Dumper $matrix ;
+ return ($matrix) ;
+}
+
+## SUB TEST for filter_pcgroup_res
+sub filter_pcgroup_resTest {
+    # get values
+    my ( $pcgroups, $threshold ) = @_;
+    my $cleaned_pcgroups = () ;
+    
+    
+    my $omap = lib::mapper->new() ;
+    $cleaned_pcgroups = $omap->filter_pcgroup_res($pcgroups, $threshold) ;
+    
+    return($cleaned_pcgroups) ;
+}
+## End SUB
+
+## SUB TEST for 
+sub compute_ids_from_pcgroups_resTest {
+    # get values
+    my ( $pcgroups ) = @_;
+    my $ids = () ;
+    
+    my $var2 = lib::mapper->new() ;
+    $ids = $var2->compute_ids_from_pcgroups_res($pcgroups) ;
+    
+    return($ids) ;
+}
+## End SUB
+
+## ## SUB TEST for 
+sub min_from_double_with_deltaTest {
+    # get values
+    my ( $double, $type, $delta ) = @_;
+    
+    my $var2 = lib::mapper->new() ;
+    my ($min, $max) = $var2->min_and_max_from_double_with_delta($double, $type, $delta) ;
+#    print $min ;
+    return($min) ;
+}
+## End SUB
+
+## ## SUB TEST for 
+sub max_from_double_with_deltaTest {
+    # get values
+    my ( $double, $type, $delta ) = @_;
+    
+    my $var2 = lib::mapper->new() ;
+    my ($min, $max) = $var2->min_and_max_from_double_with_delta($double, $type, $delta) ;
+#    print $max ;
+    return($max) ;
+}
+## End SUB
+
+## SUB TEST for 
+sub get_massbank_records_by_chunkTest {
+    # get values
+    my ( $server, $ids, $chunk_size ) = @_;
+    
+    my $var2 = lib::mapper->new() ;
+    my $records = $var2->get_massbank_records_by_chunk ($server, $ids, $chunk_size) ;
+    
+#    print Dumper $records ;
+    
+    return($records) ;
+}
+## End SUB
+
+
+1 ;
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef t/massbank_ws_searchspectrum_Test.t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/t/massbank_ws_searchspectrum_Test.t Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,1178 @@\n+#! perl\r\n+use diagnostics;\r\n+use warnings;\r\n+no warnings qw/void/;\r\n+use strict;\r\n+no strict "refs" ;\r\n+use Test::More qw( no_plan );\r\n+#use Test::More tests => 8 ; ## with MAPPER SEQUENCE \r\n+use FindBin ;\r\n+use Carp ;\r\n+\r\n+## Specific Modules\r\n+use lib $FindBin::Bin ;\r\n+my $binPath = $FindBin::Bin ;\r\n+use lib::massbank_api_Test qw( :ALL ) ;\r\n+use lib::massbank_mapper_Test qw( :ALL ) ;\r\n+use lib::massbank_main_Test qw( :ALL ) ;\r\n+\r\n+\r\n+## To launch the right sequence : MAIN, API, MAPPER, THREADER, COMPUTE...\r\n+my $sequence = \'COMPUTE\' ;\r\n+my $current_test = 1 ;\r\n+my $server = \'EU\' ;\r\n+\r\n+\r\n+if ($sequence eq "COMPUTE") {\r\n+\tprint "\\n\\t\\t\\t\\t  * * * * * * \\n" ;\r\n+\tprint "\\t  * * * - - - Test MassBank Main script - - - * * * \\n\\n" ;\r\n+\tsleep 1 ; print "\\n** Test $current_test min_from_double_with_delta with doubles **\\n" ; $current_test++ ; \r\n+\tis_deeply( min_from_double_with_deltaTest (\r\n+\t\t303.0485467, \'Da\', 0.01),\r\n+\t\t303.0385467,\r\n+\t\'Method \\\'min_and_max_from_double_with_delta\\\' works with a double and return the attended min value\');\r\n+\t\r\n+\tsleep 1 ; print "\\n** Test $current_test max_from_double_with_delta with doubles **\\n" ; $current_test++ ; \r\n+\tis_deeply( max_from_double_with_deltaTest (\r\n+\t\t303.0485467, \'Da\', 0.01),\r\n+\t\t303.0585467001,\r\n+\t\'Method \\\'max_from_double_with_delta\\\' works with a double and return the attended max value\');\r\n+\t\r\n+}\r\n+elsif ($sequence eq "MAIN") {\r\n+\tprint "\\n\\t\\t\\t\\t  * * * * * * \\n" ;\r\n+\tprint "\\t  * * * - - - Test MassBank Main script - - - * * * \\n\\n" ;\r\n+\t\t## Test NORMAL file  => OK\r\n+\t    ok( run_main_massbank_pl(\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/pcgrp_annot.tsv\', \r\n+\t    \t1, 14, 7, 1, 0.5,\r\n+\t    \t\'Positive\', \'all\', 2, \'unit\', 0.3, 5, \'EU\',\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out1.json\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out1.csv\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out1.xls\'),\r\n+\t    \'Main script massbank_ws_searchspectrum.pl with is running and manage normal data (mz, ) \' );\r\n+\t    \r\n+\t    ## Test BUG file wih relative intensities => OK\r\n+\t    ok( run_main_massbank_pl(\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/261-pcgroups-mz-relative_int.tsv\', \r\n+\t    \t\'2\', \'1\', \'3\', \'1\', 0.5,\r\n+\t    \t\'Positive\', \'all\', 2, \'unit\', 0.3, 5, \'JP\',\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out2.json\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out2.csv\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out2.xls\'),\r\n+\t    \'Main script massbank_ws_searchspectrum.pl with is running and manage real file (mz, relative int, ...)\' );\r\n+\t    \r\n+\t     ## Test BUG file wih real intensities (>10000) => OK\r\n+\t    ok( run_main_massbank_pl(\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/2214-mz-int-pcgroups.tsv\', \r\n+\t    \t\'1\', \'3\', \'2\', \'1\', 0.5,\r\n+\t    \t\'Positive\', \'all\', 2, \'unit\', 0.3, 5, \'JP\',\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out3.json\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out3.csv\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out3.xls\'),\r\n+\t    \'Main script massbank_ws_searchspectrum.pl with is running and manage real file (mz, relative int, ...)\' );\r\n+\t    \r\n+\t    ## Test BUG file wih relative intensities and ppm / 15 / 5 => OK\r\n+\t    ok( run_main_massbank_pl(\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/261-pcgroups-mz-relative_int.tsv\', \r\n+\t    \t\'2\', \'1\', \'3\', \'1\', 0.5,\r\n+\t    \t\'Positive\', \'all\', 2, \'ppm\', 15, 5, \'JP\',\r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out4.json\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out4.csv\', \r\n+\t    \t\'/Users/fgiacomoni/Inra/labs/tests/massbank_V02/out4.xls\'),\r\n+\t    \'Main script massbank_ws_searchspectrum.pl with is running and manage real file (mz, relative int, ...)\' );\r\n+\t    \r\n+\t    ## Test BUG file wih real intensities (>10000) and ppm / 15 / 5 + long file => OK\r\n+\t    ok( run_main_massbank_pl(\r\n+\t    \t\'/Users/fgi'..b' be also 50 with unit = ppm\r\n+\t\t50\t\t\t# cutoff\r\n+\t), \r\n+\t2, \r\n+\'Method \\\'searchSpectrum\\\' works with $server server and return the right number of entries from given mzs list and parameters (max)\');\r\n+\r\n+##\t\t- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n+# ARGVTS : $mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff\r\n+print "\\n** Test $current_test searchSpectrum with a list of mzs, but no intensity (in true very low) and max = 2 **\\n" ; $current_test++;\r\n+is_deeply( searchSpectrumNBTest(\r\n+\t\t[\'273.096\', \'289.086\', \'290.118\', \'291.096\', \'292.113\', \'579.169\', \'580.179\'], \r\n+\t\t[10, 10, 10, 10, 10, 10, 10 ],\r\n+\t\t\'Positive\', # mode\r\n+\t\t[\'all\'],\t# instrument\r\n+\t\t\'2\',\t\t# max return / only 2 for test\r\n+\t\t\'unit\',\t\t# unit (unit or ppm)\r\n+\t\t0.3, \t\t# tol with unit = unit / can be also 50 with unit = ppm\r\n+\t\t50\t\t\t# cutoff\r\n+\t), \r\n+\t2, \r\n+\'Method \\\'searchSpectrum\\\' works with $server server and return the right number of entries from given mzs list and no intensity\');\r\n+\r\n+##\t\t- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n+# ARGVTS : $mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff\r\n+print "\\n** Test $current_test searchSpectrum with a list of mzs, intensities and no optionnal parameter like instrument, unit, tolerance and cutoff **\\n" ; $current_test ++;\r\n+is_deeply( searchSpectrumNBTest(\r\n+\t\t[\'273.096\', \'289.086\', \'290.118\', \'291.096\', \'292.113\', \'579.169\', \'580.179\'], \r\n+\t\t[\'300\', \'300\', \'300\', \'300\', \'300\', \'300\', \'300\'],\r\n+\t\t\'Positive\', # mode\r\n+\t\tundef,\t\t# instrument\r\n+\t\t\'2\',\t\t# max return / only 2 for test\r\n+\t\tundef,\t\t# unit (unit or ppm)\r\n+\t\tundef, \t\t# tol with unit = unit / can be also 50 with unit = ppm\r\n+\t\tundef\t\t# cutoff\r\n+\t), \r\n+\t2, \r\n+\'Method \\\'searchSpectrum\\\' works with $server server and return the right number of entries from def parameters (instrument, unit, tolerance, cutoff )\');\r\n+\r\n+##\t\t- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n+# ARGVTS : $mzs, $intensities, $ion, $instruments, $max, $unit, $tol, $cutoff, $max\r\n+print "\\n** Test $current_test searchSpectrum with a list of mzs, intensities and no conf parameters for instrument, unit, tolerance and cutoff (value by default) **\\n" ; $current_test++;\r\n+is_deeply( searchSpectrumNBTest(\r\n+\t\t[\'273.096\', \'289.086\', \'290.118\', \'291.096\', \'292.113\', \'579.169\', \'580.179\'], \r\n+\t\t[\'300\', \'300\', \'300\', \'300\', \'300\', \'300\', \'300\'],\r\n+\t\t\'Positive\', # mode\r\n+\t\tundef,\t\t# instrument - [\'all\'] by default\r\n+\t\tundef,\t\t# max return - 0 by default\r\n+\t\tundef,\t\t# unit - unit by default\r\n+\t\tundef, \t\t# tol - 0.3  (by default) with unit = unit / can be also 50  (by default) with unit = ppm\r\n+\t\tundef\t\t# cutoff - 5 by default\r\n+\t), \r\n+\t388, \r\n+\'Method \\\'searchSpectrum\\\' works with $server server and return the right number of entries (363) with undef parameters (instrument, unit, tolerance, cutoff, max )\');\r\n+\r\n+##\t\t- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n+# ARGVTS : $ids\r\n+print "\\n** Test $current_test getPeak with a list ids **\\n" ; $current_test++;\r\n+is_deeply( getPeakTest( [\'PR020003\', \'FU000001\']), \r\n+\t[\r\n+\t\t{\r\n+\t\t\t\'numPeaks\' => \'9\',\r\n+\t\t\t\'mzs\' => [\'207.0897\',\'210.0499\',\'224.5345\',\'225.2768\',\'226.0377\',\'226.9938\',\'227.9228\',\'243.1025\',\'410.0056\'],\r\n+\t\t\t\'intensities\' => [\'8.488e2\',\'9.442e2\',\'1.093e3\',\'5.294e4\',\'2.896e4\',\'7.015e3\',\'7.870e2\',\'4.024e3\',\'5.620e2\'],\r\n+\t\t\t\'id\' => \'PR020003\'\r\n+\t\t},\r\n+\t\t{\r\n+\t\t\t\'id\' => \'FU000001\',\r\n+\t\t\t\'intensities\' => [\'3.277e5\', \'3.036e4\', \'5.812e4\', \'2.982e5\', \'5.196e4\',\'4.564e5\', \'8.939e5\',\'5.537e4\'],\r\n+\t\t\t\'mzs\' => [\'370.8\', \'371.4\', \'532.0\', \'532.6\', \'533.3\', \'694.1\', \'694.8\',\'695.4\'],\r\n+\t\t\t\'numPeaks\' => \'8\'\r\n+\t\t}\r\n+\t],\r\n+\'Method \\\'getPeak\\\' works with $server server and return the peak lists from given ids list\');\r\n+\r\n+\r\n+\r\n+\r\n+print "\\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\\n" ;\r\n+\r\n+}\r\n+else {\r\n+\tcroak "Can\\\'t launch any test : no sequence clearly defined !!!!\\n" ;\r\n+}\r\n+\r\n'
b
diff -r 000000000000 -r 023c380900ef test-data/input01_69-pcgroups-mz-relative_int.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/input01_69-pcgroups-mz-relative_int.tabular Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,70 @@
+mz mzmin mzmax rt rtmin rtmax into intb maxo sn sample isotopes adduct pcgroup
+303.0485467 303.0479126 303.0501709 273.698 270.334 278.072 247182.3356 246032.8821 80132 351 1 [8][M]+ 1
+304.0519266 304.050354 304.0531006 273.362 270.671 278.072 39377.69332 39179.45225 12431 267 1 [8][M+1]+ 1
+305.0552454 305.0523376 305.0632324 274.034 271.007 278.072 6932.447143 6916.875306 2489 149 1 [8][M+2]+ 1
+325.0531081 325.0501099 325.0581665 273.698 271.007 278.744 16589.13717 16498.21541 4449 72 1 [1][M]+ 1
+325.5558227 325.5527039 325.5592346 273.698 270.334 278.744 5385.764 5364.939238 1474 158 1 1
+326.0658445 326.0617065 326.0741272 274.034 271.007 278.408 3192.858682 3180.844071 959 118 1 [1][M+1]+ 1
+334.0589389 334.0574951 334.0603943 273.698 270.334 278.744 54965.0688 54850.32436 13751 389 1 1
+334.5601886 334.5524292 334.5627747 273.362 270.334 279.753 16357.10268 16227.57541 4281 166 1 1
+335.0608018 335.0567017 335.0646362 274.034 270.671 278.072 5194.492773 5184.064091 1421 148 1 1
+465.101281 465.0989685 465.1035461 273.698 270.334 278.408 108485.9646 108377.6304 35620 1343 1 [10][M]+ [M+H-C6H10O4]+ 610.147 1
+466.1044404 466.0985107 466.1070862 273.362 270.334 278.072 26116.08643 26072.63829 8449 532 1 [10][M+1]+ 1
+467.1065989 467.1006775 467.1124573 274.034 270.671 278.072 5576.989909 5560.706107 2070 174 1 [10][M+2]+ 1
+503.0443595 503.0398865 503.0495605 274.034 270.671 278.744 2661.062625 2635.329938 919 62 1 1
+519.0203434 519.0109863 519.03125 273.698 271.007 278.408 3261.486136 3233.291851 1105 74 1 [2][M]+ 1
+520.0216826 520.0151978 520.031189 274.371 271.007 278.072 767.3935714 756.3133696 303 20 1 [2][M+1]+ 1
+611.1574452 611.1509399 611.159729 273.362 270.334 278.072 52749.60957 52698.08698 21130 1529 1 [6][M]+ [M+H]+ 610.147 1
+612.1618463 612.1569824 612.166626 273.362 270.671 277.735 16140.56724 16129.11427 6402 867 1 [6][M+1]+ 1
+613.1621027 613.1480713 613.1749268 273.698 271.007 278.072 3880.703571 3874.311429 1483 291 1 [6][M+2]+ 1
+630.6266888 630.6172485 630.6311646 273.698 271.007 278.072 17110.08429 17103.35571 6626 1590 1 [4][M]2+ 1
+631.1270815 631.1121216 631.1309814 274.034 270.671 278.072 7219.6755 7213.283727 2839 876 1 [4][M+1]2+ 1
+633.1395015 633.1376953 633.1422119 273.698 270.334 278.408 78153.96508 77951.91484 23827 744 1 [9][M]+ [M+Na]+ 610.147 1
+634.1424296 634.1401978 634.1456909 273.698 270.334 278.408 23879.52783 23851.69336 7234 695 1 [9][M+1]+ 1
+635.1427623 635.1370239 635.1464844 273.698 270.334 278.408 7234.640417 7226.23 2120 2119 1 [9][M+2]+ 1
+636.1507892 636.1391602 636.1651001 274.371 271.007 278.744 1583.057478 1561.299402 636 47 1 [9][M+3]+ 1
+649.1057016 649.1015625 649.1113892 273.362 270.671 277.735 5106.935619 5097.414576 1555 240 1 [3][M]2+ [2M+2K]2+ 610.147 1
+649.6002579 649.5925293 649.6157227 273.698 271.343 277.735 972.9296842 967.2105263 351 77 1 [3][M+1]2+ 1
+650.1081035 650.0990601 650.1168213 273.698 271.007 279.417 1549.122 1535.345619 602 64 1 [3][M+2]2+ 1
+655.1225036 655.1105957 655.1422119 273.362 270.671 277.399 1257.1268 1250.7352 412 86 1 [M+2Na-H]+ 610.147 1
+717.0893975 717.0775146 717.1069946 273.698 273.362 278.408 453.1308 447.1303628 171 26 1 [M+K+NaCOOH]+ 610.147 1
+135.0459028 135.0454712 135.0463409 280.426 276.725 285.476 97555.81142 97424.69475 30037 822 1 [14][M]+ [M+H-H2O]+ 152.048 2
+136.0490744 136.0469818 136.0510406 280.426 277.061 284.126 9243.038571 9236.31 2771 477 1 [14][M+1]+ 2
+153.0565924 153.0544586 153.0579376 280.426 276.725 282.78 4206.543056 4165.861024 1470 39 1 [M+H]+ 152.048 2
+175.0362187 175.0328674 175.0382385 280.426 278.072 283.789 7465.729412 7459.72416 2930 310 1 [13][M]+ [M+Na]+ 152.048 2
+176.0376081 176.0342712 176.0409698 280.089 275.716 281.098 410.713875 408.695625 320 108 1 [13][M+1]+ 2
+197.0192355 197.0154266 197.0233002 280.762 277.735 284.126 963.0227895 952.3813158 394 30 1 [M+2Na-H]+ 152.048 2
+403.0711753 403.0660706 403.0734253 279.753 278.408 282.78 399.5335385 396.1704615 260 26 1 2
+117.0358602 117.033165 117.0389862 278.072 275.38 281.098 994.5956471 970.9683282 507 24 1 3
+145.0301952 145.0294189 145.0324097 278.072 274.707 282.107 20533.65455 20181.26777 7200 53 1 [12][M]+ 3
+146.0338015 146.0315704 146.0370331 278.072 276.052 281.098 2337.98 2333.2704 849 848 1 [12][M+1]+ 3
+149.0608613 149.0575104 149.0633545 278.072 275.043 281.098 3561.349167 3549.48464 1285 90 1 [M+H-C2H2O2]+ 194.055 [M+H-NO2]+ 194.055 3
+163.0397626 163.0365295 163.042099 277.735 276.052 279.417 718.091 709.4482632 368 25 1 [M+H-CH4O]+ 194.055 3
+177.0539492 177.0531006 177.05513 278.072 274.034 282.444 31098.8344 30490.44511 11319 57 1 [11][M]+ [M+H-H2O]+ 194.055 3
+178.0578014 178.0528107 178.0614929 278.072 275.043 282.78 3510.916043 3464.439494 1316 54 1 [11][M+1]+ 3
+195.0644538 195.0613861 195.0670013 278.072 275.716 280.762 1925.5536 1901.981571 858 35 1 [M+H]+ 194.055 3
+196.0700972 196.0676727 196.0720062 278.072 277.061 281.435 279.2630769 271.3225846 204 13 1 [M+K]+ 157.103 3
+217.047301 217.044632 217.0532379 277.735 275.38 279.417 1703.950417 1700.249833 886 885 1 [M+Na]+ 194.055 3
+233.0121036 233.0091858 233.0163269 278.072 274.707 282.107 3540.9 3531.509848 1481 132 1 [M+K]+ 194.055 3
+251.0221026 251.0169678 251.0265961 278.072 273.698 281.435 3523.02613 3499.142348 1254 70 1 [M+Na+K]2+ 440.098 3
+269.0328959 269.0281982 269.0385742 278.072 276.052 281.771 2372.712176 2351.730706 1008 67 1 [M+H-CH4O]+ 300.045 3
+279.0200882 279.0171509 279.0247803 278.408 275.043 280.762 740.7787059 734.4572941 454 41 1 [M+K+HCOOH]+ 194.055 3
+297.0306054 297.0255432 297.038147 278.072 275.38 280.426 1108.1016 1103.392 385 384 1 3
+301.0504305 301.0436401 301.0579834 277.735 274.371 281.435 486.0704762 468.779315 240 12 1 [M+H]+ 300.045 [M+H-C7H6O2]+ 422.084 3
+308.0261572 308.0209351 308.034668 278.072 275.716 282.444 751.5176 741.6344 323 27 1 3
+315.0378642 315.0346375 315.0412598 277.735 276.389 279.753 570.8708 568.516 324 323 1 [M+H-H14O7]+ 440.098 3
+371.2623675 371.2585754 371.2679749 277.399 275.38 279.417 1014.632667 1010.932083 456 455 1 [M+H-C3H4]+ 410.275 3
+422.0847921 422.0766602 422.0930786 277.399 275.716 279.081 817.022 813.9935 617 129 1 3
+425.0339018 425.0305176 425.0410461 277.735 276.052 279.417 398.7525 388.7106316 267 13 1 3
+427.0703433 427.0647888 427.0771484 278.072 274.707 282.107 1897.090909 1889.026807 1024 98 1 [7][M]+ [2M+K]+ 194.055 3
+428.071429 428.0612793 428.0791016 278.072 273.362 280.762 553.6545455 544.381348 310 27 1 [7][M+1]+ 3
+443.0411698 443.0319519 443.0491333 278.072 273.362 280.089 842.8931 834.6301017 384 31 1 3
+445.074958 445.0639954 445.0813599 277.735 274.707 281.098 1661.996368 1649.526711 758 53 1 [5][M]+ [M+Na]+ 422.084 3
+446.0817674 446.0753784 446.0857849 277.735 276.725 280.426 352.6043636 348.2589676 238 23 1 [5][M+1]+ 3
+449.2321066 449.2252808 449.2385864 277.735 275.716 282.107 1741.715684 1720.915388 631 37 1 [M+K]+ 410.275 3
+463.0878154 463.078186 463.0952759 278.072 274.707 283.116 819.0366 814.7170295 408 71 1 [M+Na]+ 440.098 3
+472.296343 472.2885132 472.3045959 277.399 275.716 280.089 369.0139231 363.6954096 249 23 1 [3M+H]+ 157.103 3
+480.3076532 480.2977295 480.315033 277.399 276.052 280.762 412.125 404.4284586 208 19 1 3
+607.1399722 607.1333618 607.1530151 278.072 274.034 282.107 284.236875 281.321625 211 34 1 3
+621.1283748 621.1159668 621.1455688 278.072 276.389 279.753 434.6288 431.6012 258 43 1 [3M+K]+ 194.055 3
+21.1283748 21.1159668 21.1455688 78.072 76.389 79.753 34.6288 31.6012 258 43 1 [X]+ 94.055 4
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef test-data/input02_2214-mz-int-pcgroups.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/input02_2214-mz-int-pcgroups.tabular Wed Apr 19 11:31:58 2017 -0400
b
b'@@ -0,0 +1,2215 @@\n+mz\tQC6\tpcgroup\t\t\n+121.5145853\t614328.101\t1\t\t\n+121.6260795\t298110.8522\t1\t\t\n+126.186473\t1372105.065\t1\t\t\n+126.2979602\t799423.8448\t1\t\t\n+126.4094198\t99064.65118\t1\t\t\n+184.0731041\t2342541.316\t1\t\t\n+385.2300024\t153777.6254\t1\t\t\n+502.2922166\t6619648.811\t1\t\t\n+503.2956385\t1681584.125\t1\t\t\n+548.334235\t2507995.364\t1\t\t\n+550.3245293\t829008.4774\t1\t\t\n+551.3248058\t368415.0327\t1\t\t\n+566.2893078\t157486.0653\t1\t\t\n+566.7905764\t48222.51792\t1\t\t\n+568.3390012\t446382177.5\t1\t\t\n+570.3450055\t28876124.32\t1\t\t\n+571.3479121\t2988517.198\t1\t\t\n+572.3505372\t225428.16\t1\t\t\n+579.3233358\t216856.8949\t1\t\t\n+587.3122117\t917520.0619\t1\t\t\n+587.8139534\t690601.2217\t1\t\t\n+588.3154837\t58952.83371\t1\t\t\n+592.3272029\t502690.7187\t1\t\t\n+626.392138\t1395956.985\t1\t\t\n+636.313923\t174562.4613\t1\t\t\n+652.2915266\t967624.7076\t1\t\t\n+653.2949542\t291543.285\t1\t\t\n+666.307255\t243719.0918\t1\t\t\n+112.6288375\t117890.6728\t2\t\t\n+358.2770237\t0\t2\t\t\n+411.3575423\t165856.1927\t2\t\t\n+478.3218145\t545683.9077\t2\t\t\n+479.3251723\t144657.5645\t2\t\t\n+496.3388594\t326649278.1\t2\t\t\n+497.3421007\t86412954.14\t2\t\t\n+498.3448681\t12878117.73\t2\t\t\n+499.3471079\t1028079.683\t2\t\t\n+507.3234575\t167638.1508\t2\t\t\n+515.3122686\t720161.6218\t2\t\t\n+515.8139796\t397175.3526\t2\t\t\n+518.3207866\t13745773.19\t2\t\t\n+519.3241556\t3311868.986\t2\t\t\n+520.3272042\t243489.526\t2\t\t\n+534.2948444\t504710.1168\t2\t\t\n+554.3921216\t1385635.332\t2\t\t\n+555.3954949\t348251.8324\t2\t\t\n+564.313868\t168012.914\t2\t\t\n+580.2914584\t995761.851\t2\t\t\n+581.2947583\t204696.4707\t2\t\t\n+586.3083281\t138599.0003\t2\t\t\n+594.3070945\t92685.13566\t2\t\t\n+596.370224\t615370.5679\t2\t\t\n+597.3736566\t72737.09261\t2\t\t\n+115.9676656\t121776.9211\t3\t\t\n+317.2007344\t2098352.407\t3\t\t\n+318.2040976\t458557.6832\t3\t\t\n+319.2073582\t0\t3\t\t\n+353.3521065\t1658398.883\t3\t\t\n+474.3570859\t360044.8496\t3\t\t\n+482.3597638\t1296382.244\t3\t\t\n+483.3631202\t301426.7483\t3\t\t\n+504.3378034\t238621.0857\t3\t\t\n+522.3543945\t180368757.6\t3\t\t\n+523.3577138\t50377590.4\t3\t\t\n+524.3607156\t7255131.902\t3\t\t\n+525.3630416\t599539.8512\t3\t\t\n+541.3279032\t196068.4889\t3\t\t\n+541.8296488\t69409.55717\t3\t\t\n+544.3364533\t10222073.29\t3\t\t\n+545.3398262\t2790644.602\t3\t\t\n+546.3429472\t184432.5974\t3\t\t\n+560.310504\t309862.3598\t3\t\t\n+580.4077319\t1005043.61\t3\t\t\n+581.4111065\t122900.2556\t3\t\t\n+606.3070159\t494884.5942\t3\t\t\n+612.3239909\t156489.1575\t3\t\t\n+315.16276\t204707.2467\t4\t\t\n+321.1796828\t126724.0327\t4\t\t\n+326.3774822\t115518284.2\t4\t\t\n+327.3808042\t25116955.97\t4\t\t\n+328.3842252\t2615994.772\t4\t\t\n+329.3875872\t0\t4\t\t\n+389.1668823\t0\t4\t\t\n+504.3051591\t202555.2418\t4\t\t\n+676.5461678\t5758573.034\t4\t\t\n+697.5247595\t243020.3285\t4\t\t\n+697.7538842\t239983.8012\t4\t\t\n+698.7572722\t113034.2856\t4\t\t\n+699.7608545\t0\t4\t\t\n+114.6217783\t653938.15\t5\t\t\n+114.7332742\t302321.6519\t5\t\t\n+116.5136396\t1044234.858\t5\t\t\n+116.6251117\t544124.1944\t5\t\t\n+120.2973566\t19775.85284\t5\t\t\n+120.4088554\t19691.44866\t5\t\t\n+328.2377679\t259917.185\t5\t\t\n+462.243275\t533866.1601\t5\t\t\n+462.2664868\t1086115.103\t5\t\t\n+463.2698715\t250396.1727\t5\t\t\n+480.277096\t2065022.357\t5\t\t\n+481.280575\t488031.4981\t5\t\t\n+498.2875864\t5319234.948\t5\t\t\n+499.2910559\t1101477.389\t5\t\t\n+515.3141244\t1986891.781\t5\t\t\n+516.2982049\t9988985.803\t5\t\t\n+517.301694\t2839874.622\t5\t\t\n+518.2947627\t320720.4282\t5\t\t\n+518.3050052\t389610.6434\t5\t\t\n+533.3244307\t267221595.3\t5\t\t\n+534.3277395\t77776421.92\t5\t\t\n+535.3211137\t11295733.1\t5\t\t\n+536.3240385\t2929361.018\t5\t\t\n+537.3269699\t212290.5597\t5\t\t\n+538.2680198\t5824612.09\t5\t\t\n+538.2798766\t7330132.232\t5\t\t\n+539.2832914\t2623326.24\t5\t\t\n+554.2449701\t2660229.58\t5\t\t\n+555.2484984\t451046.4285\t5\t\t\n+555.3065167\t657771.0423\t5\t\t\n+560.2618251\t390998.2675\t5\t\t\n+561.3557977\t6502591.384\t5\t\t\n+562.3592327\t1856206.571\t5\t\t\n+574.3512231\t982454.9197\t5\t\t\n+575.3545263\t91242.72597\t5\t\t\n+100.0754227\t463055.5623\t6\t\t\n+104.052634\t1312590.706\t6\t\t\n+120.0805276\t8972796.407\t6\t\t\n+121.0838857\t689370.0993\t6\t\t\n+123.0549787\t72375006.65\t6\t\t\n+124.0583775\t4254013.967\t6\t\t\n+131.0489038\t334262.8124\t6\t\t\n+132.1015786\t95629449.65\t6\t\t\n+133.0315327\t4235943.439\t6\t\t\n+133.1049622\t5913875.878\t6\t\t\n+134.1058828\t332109.922\t6\t\t\n+136.0754357\t889175.4386\t6\t\t\n+137.0454536\t77094471.44\t6\t\t\n+138.0488322\t3867770.676\t6\t\t\n+149.0593986\t456297.0041\t6\t\t\n+150.0580269\t'..b'2203.39016\t218\t\t\n+330.2819728\t287128.6222\t219\t\t\n+407.4353168\t0\t219\t\t\n+663.4671239\t478077.111\t219\t\t\n+697.5282115\t122469.5267\t219\t\t\n+310.3100363\t427008.8901\t220\t\t\n+302.2143169\t17278.72907\t221\t\t\n+266.1381564\t324657.0482\t222\t\t\n+300.1799891\t82332.33106\t222\t\t\n+170.153565\t369918.6102\t223\t\t\n+307.2737764\t29918.9708\t223\t\t\n+746.3771353\t193301.4576\t223\t\t\n+332.3053903\t158975.8391\t224\t\t\n+386.1989138\t82396.3659\t224\t\t\n+703.5743348\t1184555.801\t225\t\t\n+509.3422062\t106332.1276\t226\t\t\n+741.1570223\t268693.5274\t226\t\t\n+741.4914841\t344147.2886\t226\t\t\n+741.8260314\t198510.4317\t226\t\t\n+562.4306319\t328284.7266\t227\t\t\n+563.4340431\t18872.59119\t227\t\t\n+268.1035363\t534252.4539\t228\t\t\n+385.3054402\t499413.6009\t229\t\t\n+726.4695624\t503286.5471\t229\t\t\n+727.4727658\t188332.8504\t229\t\t\n+378.3471658\t197894.6862\t230\t\t\n+423.2633337\t154138.8896\t230\t\t\n+674.503838\t919157.7664\t230\t\t\n+675.5072181\t324560.9802\t230\t\t\n+720.4309235\t143576.2898\t230\t\t\n+363.2523778\t210978.9906\t231\t\t\n+570.3262845\t375363.896\t231\t\t\n+571.3295928\t149645.2661\t231\t\t\n+740.5219175\t1544626.862\t232\t\t\n+741.5253504\t305067.1262\t232\t\t\n+377.3884264\t20171.93865\t233\t\t\n+437.3618181\t49300.31517\t233\t\t\n+678.5060848\t1321400.042\t233\t\t\n+679.5094571\t215330.6023\t233\t\t\n+736.4904105\t430636.9037\t233\t\t\n+255.2314009\t512723.8957\t234\t\t\n+256.2629749\t888099.3782\t234\t\t\n+298.2735552\t168903.2691\t234\t\t\n+298.2735117\t194692.4532\t235\t\t\n+331.2835901\t280844.0388\t235\t\t\n+552.4016221\t173428.497\t236\t\t\n+628.1940218\t235545.2755\t237\t\t\n+683.1486598\t953476.9982\t237\t\t\n+140.0015248\t1481524.191\t238\t\t\n+318.190497\t99823.94702\t239\t\t\n+125.9859013\t398103.8614\t240\t\t\n+140.001529\t515654.018\t240\t\t\n+354.3360615\t162417.8304\t241\t\t\n+436.2866909\t19798.56509\t241\t\t\n+662.511116\t525647.8204\t241\t\t\n+192.0685326\t204010.2836\t242\t\t\n+404.3153945\t172593.5184\t243\t\t\n+414.3206753\t267993.0298\t244\t\t\n+536.3702259\t337991.5355\t245\t\t\n+395.4352892\t0\t246\t\t\n+660.5454221\t982415.7565\t246\t\t\n+315.1849177\t51050.16753\t247\t\t\n+366.4088767\t305943.203\t248\t\t\n+401.3884867\t366661.2675\t248\t\t\n+567.3793829\t267430.8508\t249\t\t\n+300.2715203\t720705.831\t250\t\t\n+358.2482107\t66718.49533\t251\t\t\n+514.2846879\t429406.7596\t251\t\t\n+515.3258901\t130170.3144\t252\t\t\n+410.325746\t615720.8294\t253\t\t\n+410.2893365\t144975.4363\t254\t\t\n+495.2877678\t20129.07861\t255\t\t\n+745.5931083\t592730.4401\t256\t\t\n+446.2792894\t192580.6632\t257\t\t\n+580.3600032\t624930.1471\t258\t\t\n+391.4040611\t399686.7138\t259\t\t\n+512.284429\t143159.2769\t260\t\t\n+644.4541038\t496178.6893\t261\t\t\n+463.258152\t159530.9721\t262\t\t\n+332.1387163\t295157.0875\t263\t\t\n+366.195784\t252882.1663\t264\t\t\n+513.334647\t141263.2114\t264\t\t\n+396.3829774\t399287.5827\t265\t\t\n+375.2171567\t0\t266\t\t\n+570.3447994\t168316.8779\t266\t\t\n+299.1385621\t90889.18344\t267\t\t\n+379.3677563\t304867.3484\t268\t\t\n+535.3166131\t105152.0583\t269\t\t\n+379.2947774\t82853.65353\t270\t\t\n+609.2884105\t17567.99291\t270\t\t\n+167.1426455\t528168.2992\t271\t\t\n+229.2156985\t1470185.756\t271\t\t\n+258.2503877\t1747023.071\t271\t\t\n+304.2346716\t293927.2153\t271\t\t\n+268.299456\t97516.96626\t272\t\t\n+327.3365798\t489140.8783\t273\t\t\n+710.5113943\t260788.053\t274\t\t\n+748.5846242\t429602.6287\t274\t\t\n+286.3099308\t253226.1009\t275\t\t\n+360.3367435\t374524.0159\t276\t\t\n+533.4303433\t139679.1578\t276\t\t\n+301.1186907\t71381.29913\t277\t\t\n+336.2502204\t283760.9261\t278\t\t\n+420.309974\t107758.5217\t278\t\t\n+300.3367153\t119773.3762\t279\t\t\n+193.1069965\t36354.11507\t280\t\t\n+377.3518862\t137936.1303\t281\t\t\n+392.2787938\t191496.038\t282\t\t\n+408.2220371\t92686.4699\t283\t\t\n+466.1963276\t137678.0055\t284\t\t\n+161.132084\t380636.3981\t285\t\t\n+292.2013976\t41466.78924\t286\t\t\n+316.2112756\t110076.0906\t287\t\t\n+248.2367912\t431074.2413\t288\t\t\n+402.2819963\t109317.5765\t289\t\t\n+444.3465296\t159998.0154\t289\t\t\n+209.0917227\t114977.7277\t290\t\t\n+261.1592734\t35653.53661\t291\t\t\n+163.1477344\t604114.3131\t292\t\t\n+186.0338085\t1292272.028\t293\t\t\n+408.3619586\t324680.3344\t294\t\t\n+154.1586574\t41388.39637\t295\t\t\n+549.4151013\t205451.663\t296\t\t\n+457.1509073\t109797.7946\t297\t\t\n+175.1477518\t639584.5627\t298\t\t\n+204.1227077\t55214.80473\t299\t\t\n+650.438396\t110830.976\t300\t\t\n+179.1268461\t984329.6446\t301\t\t\n+179.2383355\t874487.3156\t301\t\t\n+386.352364\t167882.061\t302\t\t\n+341.1966277\t0\t303\t\t\n+431.3240999\t0\t304\t\t\n'
b
diff -r 000000000000 -r 023c380900ef test-data/input03_1mz-1pcgroup-mz-relative_int.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/input03_1mz-1pcgroup-mz-relative_int.tabular Wed Apr 19 11:31:58 2017 -0400
[
@@ -0,0 +1,9 @@
+mz mzmin mzmax rt rtmin rtmax into intb maxo sn sample isotopes adduct pcgroup
+303.0485467 303.0479126 303.0501709 273.698 270.334 278.072 247182.3356 246032.8821 80132 351 1 [8][M]+ 1
+304.0519266 304.050354 304.0531006 273.362 270.671 278.072 39377.69332 39179.45225 12431 267 1 [8][M+1]+ 1
+305.0552454 305.0523376 305.0632324 274.034 271.007 278.072 6932.447143 6916.875306 2489 149 1 [8][M+2]+ 1
+611.1574452 611.1509399 611.159729 273.362 270.334 278.072 52749.60957 52698.08698 21130 1529 1 [6][M]+ [M+H]+ 610.147 2
+503.0443595 503.0398865 503.0495605 274.034 270.671 278.744 2661.062625 2635.329938 919 62 1 1
+297.0306054 297.0255432 297.038147 278.072 275.38 280.426 1108.1016 1103.392 385 384 1 3
+301.0504305 301.0436401 301.0579834 277.735 274.371 281.435 486.0704762 468.779315 240 12 1 [M+H]+ 300.045 [M+H-C7H6O2]+ 422.084 3
+21.1283748 21.1159668 21.1455688 78.072 76.389 79.753 34.6288 31.6012 258 43 1 [X]+ 94.055 4
\ No newline at end of file
b
diff -r 000000000000 -r 023c380900ef test-data/out_test01.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out_test01.html Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,1 @@\n+<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content=""><meta name="author" content="INRA de Clermont-Ferrand"><title>Galaxy MassBank (by spectra) queries - All results</title><link rel="stylesheet" type="text/css" href="css.php" media="all"><link rel="stylesheet" type="text/css" href="https://cdn.rawgit.com/fgiacomoni/galaxy_utils/master/style/simplePagination.css"/><!-- JavaScript --><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script><script src="https://cdn.rawgit.com/fgiacomoni/galaxy_utils/master/scripts/jquery.simplePagination.js"></script><style type="text/css">body {padding-top: 70px}div.lm-table-warning {  font-size: 1.4em;  font-weight: bold;  padding-right: 25px;  color: #21536a;  margin-left: 3px;}tr.green td  {background-color: #eaf2d3; color: black;}tr.blank td {background-color: #9999CC; color: black;}table {font-family:\'Trebuchet MS\',Arial,Helvetica,sans-serif;width:100%;border-collapse:collapse;}table.detail, table.detail tr.parent, table.detail td, table.detail th, table.detail tr.category {border-collapse:collapse;border:1px solid #98bf21;}table.detail th {font-size: 1.2em;text-align: center;padding-top: 5px;padding-bottom: 10px;background-color: #a7c942;color: #ffffff;}td.ca {text-align:center;}footer {  margin: 50px 0;}</style><script>function test(pageNumber){  var page="#page-id-"+pageNumber;  $(\'.select\').hide() ; $(page).show()}</script></head><body><div class="container"><div class="lm-table-warning">Results of MASSBANK queries - Search params : Molecular specie = Positive / delta (unit) = 0.3 / Score threshold = 0.5 and max hit = 20 per pcgroup</div><div id="detail_table_source" style="display:none"></div><p><div id="choose"></div><p><div id="ms_search_0" class="ms-search-table"></div><!-- HeadRows--><table id="detail_table" class="detail"><col style="width:30px;"><!-- Ids (m/z)--><col style="width:30px;"><!-- Pcgroup --><col style="width:30px;"><!-- Mass (m/z)--><col style="width:120px;"><!-- Met name--><col style="width:50px;"><!-- Cpd ID--><col style="width:40px;"><!-- formula--><col style="width:60px;"><!-- cpd mw--><col style="width:50px;"><!-- MS type --><col style="width:20px;"><!-- ion/prec. type--><col style="width:80px;"><!-- Instrument type--><col style="width:60px;"><!-- score--><col style="width:60px;"><!-- INCHI--><thead><th>ID from input</th><th>PCGroup</th><th>Mass (m/z)</th><th>Metabolite name</th><th>Compound ID</th><th>Formula</th><th>Compound MW (Da)</th><th>MS type</th><th>ion/prec. type</th><th>Instr. type</th><th>Score</th><th>InChI Identifier</th></thead><tbody class="select" id="page-id-1"><tr class="white"><td class="ca" >mz_00001</td><td id="1" class="ca" >1</td><td class="ca">303.0485467</td><td class="ca" colspan="9"></td></tr><tr class="white"><td class="ca" colspan="3"></td><td class="ca">Rutin</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=TY000246" target="_blank" class="btn">TY000246</a></td><td class="ca">C27H30O16</td><td class="ca">610.15338</td><td class="ca">MS</td><td class="ca">[M+H]+</td><td class="ca">LC-ESI-ITTOF</td><td class="ca">0.722183932245</td><td class="ca">InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1</td></tr><tr class="white"><td class="ca" colspan="3"></td><td class="ca">Rutin </td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=PB006201" target="_blank" class="btn">PB006201</a></td><td class="ca">C27H30O16</td><td class="ca">610.15338</td><td class="ca">MS2</td><td class="ca"> [M+H]+</td><td class="ca">LC-ESI-QTOF</td><td class="ca">0.718240688151</td><td class="ca">InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)2'..b'="63" class="ca" >3</td><td class="ca">449.2321066</td><td class="ca" colspan="9"></td></tr><tr class="white"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr><tr class="green"><td class="ca" >mz_00064</td><td id="64" class="ca" >3</td><td class="ca">463.0878154</td><td class="ca" colspan="9"></td></tr><tr class="green"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr></tbody><tbody class="select" id="page-id-17"><tr class="white"><td class="ca" >mz_00065</td><td id="65" class="ca" >3</td><td class="ca">472.296343</td><td class="ca" colspan="9"></td></tr><tr class="white"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr><tr class="green"><td class="ca" >mz_00066</td><td id="66" class="ca" >3</td><td class="ca">480.3076532</td><td class="ca" colspan="9"></td></tr><tr class="green"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr><tr class="white"><td class="ca" >mz_00067</td><td id="67" class="ca" >3</td><td class="ca">607.1399722</td><td class="ca" colspan="9"></td></tr><tr class="white"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr><tr class="green"><td class="ca" >mz_00068</td><td id="68" class="ca" >3</td><td class="ca">621.1283748</td><td class="ca" colspan="9"></td></tr><tr class="green"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr></tbody><tbody class="select" id="page-id-18"><tr class="white"><td class="ca" >mz_00069</td><td id="69" class="ca" >4</td><td class="ca">21.1283748</td><td class="ca" colspan="9"></td></tr><tr class="white"><td class="ca" colspan="3"></td><td class="ca">UNKNOWN</td><td class="ca"><a href="http://www.massbank.jp/jsp/FwdRecord.jsp?id=" target="_blank" class="btn">NONE</a></td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">n/a</td><td class="ca">0</td><td class="ca">n/a</td></tr></tbody></table></div><div class="container"><hr><footer><div class="row">  <div class="col-lg-12"><p>Copyright &copy; INRA, N Paulhe, F Giacomoni 2014 </p>  </div> </div> </footer></div><script language="javascript">$(function() {$(\'#choose\').pagination({items: 18,itemsOnPage: 1,currentPage: 1,onInit: function () { test(1); },cssStyle: \'light-theme\',onPageClick: function(pageNumber){test(pageNumber)}}).pagination(\'redraw\');});</script></body></html>\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 023c380900ef test-data/out_test01.json
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out_test01.json Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,1 @@\n+{"TYPE":{},"QUERY":{"480.3076532":{"mzmin":480.0076532,"num_res":0,"into":"412.125","pcgroup":"3","mzmed":"480.3076532","RECORDS":null,"mzmax":480.6076532001},"177.0539492":{"RECORDS":{"PR100005":{"name":"trans-4-Hydroxy-3-methoxycinnamate","ms_type":"MS2","id":"PR100005","precursor_type":" [M+H]+","formula":"C10H10O4","peaks":null,"score":"0.526245917512","inchi":"InChI=1S/C10H10O4/c1-14-9-6-7(2-4-8(9)11)3-5-10(12)13/h2-6,11H,1H3,(H,12,13)/b5-3+","exact_mz":"194.05791","instrument_type":"LC-ESI-QTOF"}},"mzmed":"177.0539492","mzmax":177.3539492001,"pcgroup":"3","into":"31098.8344","num_res":1,"mzmin":176.7539492},"425.0339018":{"num_res":0,"mzmin":424.7339018,"RECORDS":null,"mzmed":"425.0339018","mzmax":425.3339018001,"into":"398.7525","pcgroup":"3"},"611.1574452":{"num_res":8,"mzmin":610.8574452,"mzmed":"611.1574452","RECORDS":{"TY000246":{"precursor_type":"[M+H]+","formula":"C27H30O16","name":"Rutin","id":"TY000246","ms_type":"MS","instrument_type":"LC-ESI-ITTOF","peaks":null,"inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.722183932245","exact_mz":"610.15338"},"PR020080":{"ms_type":"MS","id":"PR020080","name":"Quercetin-3-O-rutinoside","formula":"C27H30O16","precursor_type":" [M+H]+","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.593021369395","exact_mz":"610.15338","peaks":null,"instrument_type":"LC-ESI-QTOF"},"FIO00588":{"peaks":null,"score":"0.676089256465","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","exact_mz":"610.15338","instrument_type":"LC-ESI-QTOF","name":"Rutin","ms_type":"MS2","id":"FIO00588","precursor_type":" [M+H]+","formula":"C27H30O16"},"PR020046":{"precursor_type":" [M+H]+","formula":"C28H34O15","name":"Hesperetin-7-O-rutinoside","id":"PR020046","ms_type":"MS","instrument_type":"LC-ESI-QTOF","peaks":null,"exact_mz":"610.18977","score":"0.503808010925","inchi":"InChI=1S/C28H34O15/c1-10-21(32)23(34)25(36)27(40-10)39-9-19-22(33)24(35)26(37)28(43-19)41-12-6-14(30)20-15(31)8-17(42-18(20)7-12)11-3-4-16(38-2)13(29)5-11/h3-7,10,17,19,21-30,32-37H,8-9H2,1-2H3/t10-,17-,19+,21-,22+,23+,24-,25+,26+,27+,28+/m0/s1"},"PR020045":{"name":"Hesperetin-7-O-neohesperidoside","id":"PR020045","ms_type":"MS","precursor_type":" [M+H]+","formula":"C28H34O15","peaks":null,"exact_mz":"610.18977","score":"0.585927069664","inchi":"InChI=1S/C28H34O15/c1-10-21(33)23(35)25(37)27(39-10)43-26-24(36)22(34)19(9-29)42-28(26)40-12-6-14(31)20-15(32)8-17(41-18(20)7-12)11-3-4-16(38-2)13(30)5-11/h3-7,10,17,19,21-31,33-37H,8-9H2,1-2H3/t10-,17-,19+,21-,22+,23+,24-,25+,26+,27-,28+/m0/s1","instrument_type":"LC-ESI-QTOF"},"PB006201":{"ms_type":"MS2","id":"PB006201","name":"Rutin ","formula":"C27H30O16","precursor_type":" [M+H]+","score":"0.718240688151","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","exact_mz":"610.15338","peaks":null,"instrument_type":"LC-ESI-QTOF"},"FIO00589":{"instrument_type":"LC-ESI-QTOF","peaks":null,"exact_mz":"610.15338","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.628953'..b'/c1-14-9-6-7(2-4-8(9)11)3-5-10(12)13/h2-6,11H,1H3,(H,12,13)/b5-3+","exact_mz":"194.05791","peaks":null}},"into":"3561.349167","pcgroup":"3"},"445.074958":{"pcgroup":"3","into":"1661.996368","mzmax":445.3749580001,"RECORDS":null,"mzmed":"445.074958","mzmin":444.774958,"num_res":0},"472.296343":{"RECORDS":null,"mzmed":"472.296343","mzmax":472.5963430001,"pcgroup":"3","into":"369.0139231","num_res":0,"mzmin":471.996343},"371.2623675":{"mzmin":370.9623675,"num_res":0,"pcgroup":"3","into":"1014.632667","mzmax":371.5623675001,"mzmed":"371.2623675","RECORDS":null},"613.1621027":{"mzmin":612.8621027,"num_res":7,"pcgroup":"1","into":"3880.703571","mzmax":613.4621027001,"mzmed":"613.1621027","RECORDS":{"TY000246":{"id":"TY000246","ms_type":"MS","name":"Rutin","formula":"C27H30O16","precursor_type":"[M+H]+","exact_mz":"610.15338","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.722183932245","peaks":null,"instrument_type":"LC-ESI-ITTOF"},"FIO00483":{"score":"0.591111986992","inchi":"InChI=1S/C28H34O15/c1-10-21(32)23(34)25(36)27(40-10)39-9-19-22(33)24(35)26(37)28(43-19)41-12-6-14(30)20-15(31)8-17(42-18(20)7-12)11-3-4-16(38-2)13(29)5-11/h3-7,10,17,19,21-30,32-37H,8-9H2,1-2H3/t10-,17-,19+,21-,22+,23+,24-,25+,26+,27+,28+/m0/s1","exact_mz":"610.18977","peaks":null,"instrument_type":"LC-ESI-QTOF","id":"FIO00483","ms_type":"MS2","name":"Hesperidin","formula":"C28H34O15","precursor_type":" [M+H]+"},"PR020045":{"formula":"C28H34O15","precursor_type":" [M+H]+","ms_type":"MS","id":"PR020045","name":"Hesperetin-7-O-neohesperidoside","instrument_type":"LC-ESI-QTOF","exact_mz":"610.18977","inchi":"InChI=1S/C28H34O15/c1-10-21(33)23(35)25(37)27(39-10)43-26-24(36)22(34)19(9-29)42-28(26)40-12-6-14(31)20-15(32)8-17(41-18(20)7-12)11-3-4-16(38-2)13(30)5-11/h3-7,10,17,19,21-31,33-37H,8-9H2,1-2H3/t10-,17-,19+,21-,22+,23+,24-,25+,26+,27-,28+/m0/s1","score":"0.585927069664","peaks":null},"PR020046":{"name":"Hesperetin-7-O-rutinoside","ms_type":"MS","id":"PR020046","precursor_type":" [M+H]+","formula":"C28H34O15","peaks":null,"inchi":"InChI=1S/C28H34O15/c1-10-21(32)23(34)25(36)27(40-10)39-9-19-22(33)24(35)26(37)28(43-19)41-12-6-14(30)20-15(31)8-17(42-18(20)7-12)11-3-4-16(38-2)13(29)5-11/h3-7,10,17,19,21-30,32-37H,8-9H2,1-2H3/t10-,17-,19+,21-,22+,23+,24-,25+,26+,27+,28+/m0/s1","score":"0.503808010925","exact_mz":"610.18977","instrument_type":"LC-ESI-QTOF"},"PB006201":{"id":"PB006201","ms_type":"MS2","name":"Rutin ","formula":"C27H30O16","precursor_type":" [M+H]+","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.718240688151","exact_mz":"610.15338","peaks":null,"instrument_type":"LC-ESI-QTOF"},"PR020080":{"peaks":null,"exact_mz":"610.15338","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.593021369395","instrument_type":"LC-ESI-QTOF","name":"Quercetin-3-O-rutinoside","ms_type":"MS","id":"PR020080","precursor_type":" [M+H]+","formula":"C27H30O16"},"FIO00588":{"precursor_type":" [M+H]+","formula":"C27H30O16","name":"Rutin","id":"FIO00588","ms_type":"MS2","instrument_type":"LC-ESI-QTOF","peaks":null,"exact_mz":"610.15338","inchi":"InChI=1S/C27H30O16/c1-8-17(32)20(35)22(37)26(40-8)39-7-15-18(33)21(36)23(38)27(42-15)43-25-19(34)16-13(31)5-10(28)6-14(16)41-24(25)9-2-3-11(29)12(30)4-9/h2-6,8,15,17-18,20-23,26-33,35-38H,7H2,1H3/t8-,15+,17-,18+,20+,21-,22+,23+,26+,27-/m0/s1","score":"0.676089256465"}}}},"PARAM":{}}\n\\ No newline at end of file\n'
b
diff -r 000000000000 -r 023c380900ef test-data/out_test01.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out_test01.tabular Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,70 @@\n+mz\tmzmin\tmzmax\trt\trtmin\trtmax\tinto\tintb\tmaxo\tsn\tsample\tisotopes\tadduct\tpcgroup\tmassbank(score::name::mz::formula::adduct::id)\n+303.0485467\t303.0479126\t303.0501709\t273.698\t270.334\t278.072\t247182.3356\t246032.8821\t80132\t351\t1\t[8][M]+\t\t1\t0.722183932245::[Rutin]::610.15338::C27H30O16::[[M+H]+]::TY000246 | 0.718240688151::[Rutin ]::610.15338::C27H30O16::[ [M+H]+]::PB006201 | 0.676089256465::[Rutin]::610.15338::C27H30O16::[ [M+H]+]::FIO00588 | 0.631453810993::[Hyperoside]::464.09548::C21H20O12::[ [M+H]+]::FIO00150 | 0.630268036021::[Isoquercitrin]::464.09548::C21H20O12::[[M+H]+]::TY000218 | 0.629320319716::[Isoquercitrin]::464.09548::C21H20O12::[ [M+H]+]::FIO00160 | 0.628953392993::[Rutin]::610.15338::C27H30O16::[ [M+H]+]::FIO00589 | 0.618103117363::[Quercetin-3-beta-O-galactoside]::464.09548::C21H20O12::[ [M+H]+]::PR020075 | 0.609833904994::[Quercetin-3-O-beta-glucopyranoside]::464.09548::C21H20O12::[ [M+H]+]::PR020078 | 0.593021369395::[Quercetin-3-O-rutinoside]::610.15338::C27H30O16::[ [M+H]+]::PR020080 | 0.591111986992::[Hesperidin]::610.18977::C28H34O15::[ [M+H]+]::FIO00483 | 0.585927069664::[Hesperetin-7-O-neohesperidoside]::610.18977::C28H34O15::[ [M+H]+]::PR020045 | 0.571213973695::[Hirsutrin]::464.09548::C21H20O12::[[M+H]+]::TY000168 | 0.526179514801::[Hesperidin]::610.18977::C28H34O15::[ [M+H]+]::FIO00484 | 0.503808010925::[Hesperetin-7-O-rutinoside]::610.18977::C28H34O15::[ [M+H]+]::PR020046\n+304.0519266\t304.050354\t304.0531006\t273.362\t270.671\t278.072\t39377.69332\t39179.45225\t12431\t267\t1\t[8][M+1]+\t\t1\t0.722183932245::[Rutin]::610.15338::C27H30O16::[[M+H]+]::TY000246 | 0.718240688151::[Rutin ]::610.15338::C27H30O16::[ [M+H]+]::PB006201 | 0.676089256465::[Rutin]::610.15338::C27H30O16::[ [M+H]+]::FIO00588 | 0.631453810993::[Hyperoside]::464.09548::C21H20O12::[ [M+H]+]::FIO00150 | 0.630268036021::[Isoquercitrin]::464.09548::C21H20O12::[[M+H]+]::TY000218 | 0.629320319716::[Isoquercitrin]::464.09548::C21H20O12::[ [M+H]+]::FIO00160 | 0.628953392993::[Rutin]::610.15338::C27H30O16::[ [M+H]+]::FIO00589 | 0.618103117363::[Quercetin-3-beta-O-galactoside]::464.09548::C21H20O12::[ [M+H]+]::PR020075 | 0.609833904994::[Quercetin-3-O-beta-glucopyranoside]::464.09548::C21H20O12::[ [M+H]+]::PR020078 | 0.593021369395::[Quercetin-3-O-rutinoside]::610.15338::C27H30O16::[ [M+H]+]::PR020080 | 0.591111986992::[Hesperidin]::610.18977::C28H34O15::[ [M+H]+]::FIO00483 | 0.585927069664::[Hesperetin-7-O-neohesperidoside]::610.18977::C28H34O15::[ [M+H]+]::PR020045 | 0.571213973695::[Hirsutrin]::464.09548::C21H20O12::[[M+H]+]::TY000168 | 0.526179514801::[Hesperidin]::610.18977::C28H34O15::[ [M+H]+]::FIO00484 | 0.503808010925::[Hesperetin-7-O-rutinoside]::610.18977::C28H34O15::[ [M+H]+]::PR020046\n+305.0552454\t305.0523376\t305.0632324\t274.034\t271.007\t278.072\t6932.447143\t6916.875306\t2489\t149\t1\t[8][M+2]+\t\t1\t0.722183932245::[Rutin]::610.15338::C27H30O16::[[M+H]+]::TY000246 | 0.718240688151::[Rutin ]::610.15338::C27H30O16::[ [M+H]+]::PB006201 | 0.676089256465::[Rutin]::610.15338::C27H30O16::[ [M+H]+]::FIO00588 | 0.631453810993::[Hyperoside]::464.09548::C21H20O12::[ [M+H]+]::FIO00150 | 0.630268036021::[Isoquercitrin]::464.09548::C21H20O12::[[M+H]+]::TY000218 | 0.629320319716::[Isoquercitrin]::464.09548::C21H20O12::[ [M+H]+]::FIO00160 | 0.628953392993::[Rutin]::610.15338::C27H30O16::[ [M+H]+]::FIO00589 | 0.618103117363::[Quercetin-3-beta-O-galactoside]::464.09548::C21H20O12::[ [M+H]+]::PR020075 | 0.609833904994::[Quercetin-3-O-beta-glucopyranoside]::464.09548::C21H20O12::[ [M+H]+]::PR020078 | 0.593021369395::[Quercetin-3-O-rutinoside]::610.15338::C27H30O16::[ [M+H]+]::PR020080 | 0.591111986992::[Hesperidin]::610.18977::C28H34O15::[ [M+H]+]::FIO00483 | 0.585927069664::[Hesperetin-7-O-neohesperidoside]::610.18977::C28H34O15::[ [M+H]+]::PR020045 | 0.571213973695::[Hirsutrin]::464.09548::C21H20O12::[[M+H]+]::TY000168 | 0.526179514801::[Hesperidin]::610.18977::C28H34O15::[ [M+H]+]::FIO00484 | 0.503808010925::[Hesperetin-7-O-rutinoside]::610.18977::C28H3'..b'952\t145.0294189\t145.0324097\t278.072\t274.707\t282.107\t20533.65455\t20181.26777\t7200\t53\t1\t[12][M]+\t\t3\t0.526245917512::[trans-4-Hydroxy-3-methoxycinnamate]::194.05791::C10H10O4::[ [M+H]+]::PR100005\n+146.0338015\t146.0315704\t146.0370331\t278.072\t276.052\t281.098\t2337.98\t2333.2704\t849\t848\t1\t[12][M+1]+\t\t3\tNONE\n+149.0608613\t149.0575104\t149.0633545\t278.072\t275.043\t281.098\t3561.349167\t3549.48464\t1285\t90\t1\t\t[M+H-C2H2O2]+ 194.055 [M+H-NO2]+ 194.055\t3\t0.526245917512::[trans-4-Hydroxy-3-methoxycinnamate]::194.05791::C10H10O4::[ [M+H]+]::PR100005\n+163.0397626\t163.0365295\t163.042099\t277.735\t276.052\t279.417\t718.091\t709.4482632\t368\t25\t1\t\t[M+H-CH4O]+ 194.055\t3\tNONE\n+177.0539492\t177.0531006\t177.05513\t278.072\t274.034\t282.444\t31098.8344\t30490.44511\t11319\t57\t1\t[11][M]+\t[M+H-H2O]+ 194.055\t3\t0.526245917512::[trans-4-Hydroxy-3-methoxycinnamate]::194.05791::C10H10O4::[ [M+H]+]::PR100005\n+178.0578014\t178.0528107\t178.0614929\t278.072\t275.043\t282.78\t3510.916043\t3464.439494\t1316\t54\t1\t[11][M+1]+\t\t3\tNONE\n+195.0644538\t195.0613861\t195.0670013\t278.072\t275.716\t280.762\t1925.5536\t1901.981571\t858\t35\t1\t\t[M+H]+ 194.055\t3\t0.526245917512::[trans-4-Hydroxy-3-methoxycinnamate]::194.05791::C10H10O4::[ [M+H]+]::PR100005\n+196.0700972\t196.0676727\t196.0720062\t278.072\t277.061\t281.435\t279.2630769\t271.3225846\t204\t13\t1\t\t[M+K]+ 157.103\t3\tNONE\n+217.047301\t217.044632\t217.0532379\t277.735\t275.38\t279.417\t1703.950417\t1700.249833\t886\t885\t1\t\t[M+Na]+ 194.055\t3\tNONE\n+233.0121036\t233.0091858\t233.0163269\t278.072\t274.707\t282.107\t3540.9\t3531.509848\t1481\t132\t1\t\t[M+K]+ 194.055\t3\tNONE\n+251.0221026\t251.0169678\t251.0265961\t278.072\t273.698\t281.435\t3523.02613\t3499.142348\t1254\t70\t1\t\t[M+Na+K]2+ 440.098\t3\tNONE\n+269.0328959\t269.0281982\t269.0385742\t278.072\t276.052\t281.771\t2372.712176\t2351.730706\t1008\t67\t1\t\t[M+H-CH4O]+ 300.045\t3\tNONE\n+279.0200882\t279.0171509\t279.0247803\t278.408\t275.043\t280.762\t740.7787059\t734.4572941\t454\t41\t1\t\t[M+K+HCOOH]+ 194.055\t3\tNONE\n+297.0306054\t297.0255432\t297.038147\t278.072\t275.38\t280.426\t1108.1016\t1103.392\t385\t384\t1\t\t\t3\tNONE\n+301.0504305\t301.0436401\t301.0579834\t277.735\t274.371\t281.435\t486.0704762\t468.779315\t240\t12\t1\t\t[M+H]+ 300.045 [M+H-C7H6O2]+ 422.084\t3\tNONE\n+308.0261572\t308.0209351\t308.034668\t278.072\t275.716\t282.444\t751.5176\t741.6344\t323\t27\t1\t\t\t3\tNONE\n+315.0378642\t315.0346375\t315.0412598\t277.735\t276.389\t279.753\t570.8708\t568.516\t324\t323\t1\t\t[M+H-H14O7]+ 440.098\t3\tNONE\n+371.2623675\t371.2585754\t371.2679749\t277.399\t275.38\t279.417\t1014.632667\t1010.932083\t456\t455\t1\t\t[M+H-C3H4]+ 410.275\t3\tNONE\n+422.0847921\t422.0766602\t422.0930786\t277.399\t275.716\t279.081\t817.022\t813.9935\t617\t129\t1\t\t\t3\tNONE\n+425.0339018\t425.0305176\t425.0410461\t277.735\t276.052\t279.417\t398.7525\t388.7106316\t267\t13\t1\t\t\t3\tNONE\n+427.0703433\t427.0647888\t427.0771484\t278.072\t274.707\t282.107\t1897.090909\t1889.026807\t1024\t98\t1\t[7][M]+\t[2M+K]+ 194.055\t3\tNONE\n+428.071429\t428.0612793\t428.0791016\t278.072\t273.362\t280.762\t553.6545455\t544.381348\t310\t27\t1\t[7][M+1]+\t\t3\tNONE\n+443.0411698\t443.0319519\t443.0491333\t278.072\t273.362\t280.089\t842.8931\t834.6301017\t384\t31\t1\t\t\t3\tNONE\n+445.074958\t445.0639954\t445.0813599\t277.735\t274.707\t281.098\t1661.996368\t1649.526711\t758\t53\t1\t[5][M]+\t[M+Na]+ 422.084\t3\tNONE\n+446.0817674\t446.0753784\t446.0857849\t277.735\t276.725\t280.426\t352.6043636\t348.2589676\t238\t23\t1\t[5][M+1]+\t\t3\tNONE\n+449.2321066\t449.2252808\t449.2385864\t277.735\t275.716\t282.107\t1741.715684\t1720.915388\t631\t37\t1\t\t[M+K]+ 410.275\t3\tNONE\n+463.0878154\t463.078186\t463.0952759\t278.072\t274.707\t283.116\t819.0366\t814.7170295\t408\t71\t1\t\t[M+Na]+ 440.098\t3\tNONE\n+472.296343\t472.2885132\t472.3045959\t277.399\t275.716\t280.089\t369.0139231\t363.6954096\t249\t23\t1\t\t[3M+H]+ 157.103\t3\tNONE\n+480.3076532\t480.2977295\t480.315033\t277.399\t276.052\t280.762\t412.125\t404.4284586\t208\t19\t1\t\t\t3\tNONE\n+607.1399722\t607.1333618\t607.1530151\t278.072\t274.034\t282.107\t284.236875\t281.321625\t211\t34\t1\t\t\t3\tNONE\n+621.1283748\t621.1159668\t621.1455688\t278.072\t276.389\t279.753\t434.6288\t431.6012\t258\t43\t1\t\t[3M+K]+ 194.055\t3\tNONE\n+21.1283748\t21.1159668\t21.1455688\t78.072\t76.389\t79.753\t34.6288\t31.6012\t258\t43\t1\t\t[X]+ 94.055\t4\tNONE\n'
b
diff -r 000000000000 -r 023c380900ef test-data/out_test01.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out_test01.txt Wed Apr 19 11:31:58 2017 -0400
[
b'@@ -0,0 +1,202 @@\n+ID\tPCGROUP\tQuery(Da)\tScore\tMetabolite_name\tCpd_Mw(Da)\tFormula\tAdduct\tMASSBANK_ID\tInstrument\tMS_level\n+mz_00001\t1\t303.0485467\t0.722183932245\tRutin\t610.15338\tC27H30O16\t[M+H]+\tTY000246\tLC-ESI-ITTOF\tMS\n+mz_00001\t1\t303.0485467\t0.718240688151\tRutin \t610.15338\tC27H30O16\t [M+H]+\tPB006201\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.676089256465\tRutin\t610.15338\tC27H30O16\t [M+H]+\tFIO00588\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.631453810993\tHyperoside\t464.09548\tC21H20O12\t [M+H]+\tFIO00150\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.630268036021\tIsoquercitrin\t464.09548\tC21H20O12\t[M+H]+\tTY000218\tLC-ESI-ITTOF\tMS\n+mz_00001\t1\t303.0485467\t0.629320319716\tIsoquercitrin\t464.09548\tC21H20O12\t [M+H]+\tFIO00160\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.628953392993\tRutin\t610.15338\tC27H30O16\t [M+H]+\tFIO00589\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.618103117363\tQuercetin-3-beta-O-galactoside\t464.09548\tC21H20O12\t [M+H]+\tPR020075\tLC-ESI-QTOF\tMS\n+mz_00001\t1\t303.0485467\t0.609833904994\tQuercetin-3-O-beta-glucopyranoside\t464.09548\tC21H20O12\t [M+H]+\tPR020078\tLC-ESI-QTOF\tMS\n+mz_00001\t1\t303.0485467\t0.593021369395\tQuercetin-3-O-rutinoside\t610.15338\tC27H30O16\t [M+H]+\tPR020080\tLC-ESI-QTOF\tMS\n+mz_00001\t1\t303.0485467\t0.591111986992\tHesperidin\t610.18977\tC28H34O15\t [M+H]+\tFIO00483\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.585927069664\tHesperetin-7-O-neohesperidoside\t610.18977\tC28H34O15\t [M+H]+\tPR020045\tLC-ESI-QTOF\tMS\n+mz_00001\t1\t303.0485467\t0.571213973695\tHirsutrin\t464.09548\tC21H20O12\t[M+H]+\tTY000168\tLC-ESI-ITTOF\tMS\n+mz_00001\t1\t303.0485467\t0.526179514801\tHesperidin\t610.18977\tC28H34O15\t [M+H]+\tFIO00484\tLC-ESI-QTOF\tMS2\n+mz_00001\t1\t303.0485467\t0.503808010925\tHesperetin-7-O-rutinoside\t610.18977\tC28H34O15\t [M+H]+\tPR020046\tLC-ESI-QTOF\tMS\n+mz_00002\t1\t304.0519266\t0.722183932245\tRutin\t610.15338\tC27H30O16\t[M+H]+\tTY000246\tLC-ESI-ITTOF\tMS\n+mz_00002\t1\t304.0519266\t0.718240688151\tRutin \t610.15338\tC27H30O16\t [M+H]+\tPB006201\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.676089256465\tRutin\t610.15338\tC27H30O16\t [M+H]+\tFIO00588\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.631453810993\tHyperoside\t464.09548\tC21H20O12\t [M+H]+\tFIO00150\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.630268036021\tIsoquercitrin\t464.09548\tC21H20O12\t[M+H]+\tTY000218\tLC-ESI-ITTOF\tMS\n+mz_00002\t1\t304.0519266\t0.629320319716\tIsoquercitrin\t464.09548\tC21H20O12\t [M+H]+\tFIO00160\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.628953392993\tRutin\t610.15338\tC27H30O16\t [M+H]+\tFIO00589\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.618103117363\tQuercetin-3-beta-O-galactoside\t464.09548\tC21H20O12\t [M+H]+\tPR020075\tLC-ESI-QTOF\tMS\n+mz_00002\t1\t304.0519266\t0.609833904994\tQuercetin-3-O-beta-glucopyranoside\t464.09548\tC21H20O12\t [M+H]+\tPR020078\tLC-ESI-QTOF\tMS\n+mz_00002\t1\t304.0519266\t0.593021369395\tQuercetin-3-O-rutinoside\t610.15338\tC27H30O16\t [M+H]+\tPR020080\tLC-ESI-QTOF\tMS\n+mz_00002\t1\t304.0519266\t0.591111986992\tHesperidin\t610.18977\tC28H34O15\t [M+H]+\tFIO00483\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.585927069664\tHesperetin-7-O-neohesperidoside\t610.18977\tC28H34O15\t [M+H]+\tPR020045\tLC-ESI-QTOF\tMS\n+mz_00002\t1\t304.0519266\t0.571213973695\tHirsutrin\t464.09548\tC21H20O12\t[M+H]+\tTY000168\tLC-ESI-ITTOF\tMS\n+mz_00002\t1\t304.0519266\t0.526179514801\tHesperidin\t610.18977\tC28H34O15\t [M+H]+\tFIO00484\tLC-ESI-QTOF\tMS2\n+mz_00002\t1\t304.0519266\t0.503808010925\tHesperetin-7-O-rutinoside\t610.18977\tC28H34O15\t [M+H]+\tPR020046\tLC-ESI-QTOF\tMS\n+mz_00003\t1\t305.0552454\t0.722183932245\tRutin\t610.15338\tC27H30O16\t[M+H]+\tTY000246\tLC-ESI-ITTOF\tMS\n+mz_00003\t1\t305.0552454\t0.718240688151\tRutin \t610.15338\tC27H30O16\t [M+H]+\tPB006201\tLC-ESI-QTOF\tMS2\n+mz_00003\t1\t305.0552454\t0.676089256465\tRutin\t610.15338\tC27H30O16\t [M+H]+\tFIO00588\tLC-ESI-QTOF\tMS2\n+mz_00003\t1\t305.0552454\t0.631453810993\tHyperoside\t464.09548\tC21H20O12\t [M+H]+\tFIO00150\tLC-ESI-QTOF\tMS2\n+mz_00003\t1\t305.0552454\t0.630268036021\tIsoquercitrin\t464.09548\tC21H20O12\t[M+H]+\tTY000218\tLC-ESI-ITTOF\tMS\n+mz_00003\t1\t305.0552454\t0.629320319716\tIsoquercitrin\t464.09548\tC21H20O12\t [M+H]+\tFIO00160\tLC-ESI-QTOF\tMS2\n+mz_00003\t1\t305.0552454\t0.62895339299'..b'\tCI-B\tMS\n+mz_00031\t2\t136.0490744\t0.793494288532\t2-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012267\tCI-B\tMS\n+mz_00031\t2\t136.0490744\t0.771842678731\t3-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012268\tCI-B\tMS\n+mz_00031\t2\t136.0490744\t0.766089270107\t4-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012269\tCI-B\tMS\n+mz_00031\t2\t136.0490744\t0.721608041747\tBUTYLBENZENE\t134.10955\tC10H14\tMS\tJP012263\tCI-B\tMS\n+mz_00031\t2\t136.0490744\t0.502725943227\t5-METHYL-1,3-DIISOPROPYLBENZENE\t176.1565\tC13H20\tMS\tJP012297\tCI-B\tMS\n+mz_00032\t2\t153.0565924\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00033\t2\t175.0362187\t0.842444634941\t1-ETHYL-2,3-DIMETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012276\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.834834020699\t1,2-DIETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012273\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.825082890799\t1,3-DIETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012274\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.822346316415\t1-ETHYL-3,5-DIMETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012279\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.812855498092\t1,4-DIETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012275\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.809347489341\t1-ETHYL-3,4-DIMETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012277\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.793494288532\t2-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012267\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.771842678731\t3-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012268\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.766089270107\t4-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012269\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.721608041747\tBUTYLBENZENE\t134.10955\tC10H14\tMS\tJP012263\tCI-B\tMS\n+mz_00033\t2\t175.0362187\t0.502725943227\t5-METHYL-1,3-DIISOPROPYLBENZENE\t176.1565\tC13H20\tMS\tJP012297\tCI-B\tMS\n+mz_00034\t2\t176.0376081\t0.834834020699\t1,2-DIETHYLBENZENE\t134.10955\tC10H14\tMS\tJP012273\tCI-B\tMS\n+mz_00034\t2\t176.0376081\t0.771842678731\t3-METHYL-1-PROPYLBENZENE\t134.10955\tC10H14\tMS\tJP012268\tCI-B\tMS\n+mz_00034\t2\t176.0376081\t0.721608041747\tBUTYLBENZENE\t134.10955\tC10H14\tMS\tJP012263\tCI-B\tMS\n+mz_00034\t2\t176.0376081\t0.502725943227\t5-METHYL-1,3-DIISOPROPYLBENZENE\t176.1565\tC13H20\tMS\tJP012297\tCI-B\tMS\n+mz_00035\t2\t197.0192355\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00036\t2\t403.0711753\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00037\t3\t117.0358602\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00038\t3\t145.0301952\t0.526245917512\ttrans-4-Hydroxy-3-methoxycinnamate\t194.05791\tC10H10O4\t [M+H]+\tPR100005\tLC-ESI-QTOF\tMS2\n+mz_00039\t3\t146.0338015\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00040\t3\t149.0608613\t0.526245917512\ttrans-4-Hydroxy-3-methoxycinnamate\t194.05791\tC10H10O4\t [M+H]+\tPR100005\tLC-ESI-QTOF\tMS2\n+mz_00041\t3\t163.0397626\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00042\t3\t177.0539492\t0.526245917512\ttrans-4-Hydroxy-3-methoxycinnamate\t194.05791\tC10H10O4\t [M+H]+\tPR100005\tLC-ESI-QTOF\tMS2\n+mz_00043\t3\t178.0578014\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00044\t3\t195.0644538\t0.526245917512\ttrans-4-Hydroxy-3-methoxycinnamate\t194.05791\tC10H10O4\t [M+H]+\tPR100005\tLC-ESI-QTOF\tMS2\n+mz_00045\t3\t196.0700972\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00046\t3\t217.047301\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00047\t3\t233.0121036\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00048\t3\t251.0221026\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00049\t3\t269.0328959\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00050\t3\t279.0200882\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00051\t3\t297.0306054\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00052\t3\t301.0504305\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00053\t3\t308.0261572\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00054\t3\t315.0378642\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00055\t3\t371.2623675\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00056\t3\t422.0847921\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00057\t3\t425.0339018\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00058\t3\t427.0703433\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00059\t3\t428.071429\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00060\t3\t443.0411698\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00061\t3\t445.074958\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00062\t3\t446.0817674\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00063\t3\t449.2321066\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00064\t3\t463.0878154\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00065\t3\t472.296343\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00066\t3\t480.3076532\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00067\t3\t607.1399722\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00068\t3\t621.1283748\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n+mz_00069\t4\t21.1283748\t0\tNA\tNA\tNA\tNA\tNA\tNA\tNA\n'