Mercurial > repos > fgiacomoni > hr2
annotate hr2_manager.pl @ 1:e2cbcf6fa22e draft
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
author | fgiacomoni |
---|---|
date | Sun, 11 Dec 2022 17:16:43 +0000 |
parents | 86296c048e46 |
children | 23970530a518 |
rev | line source |
---|---|
0 | 1 #!perl |
2 | |
3 ## script : hr2_manager.pl | |
4 ## VERSIONS : | |
5 # - 01/03/2019 : Fix P issue, permit more flexible atom settings and add requirements for conda auto managing. | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
6 # - 09/12/2022 : Fix "Additional atomes not taken into account" - Ticket issue #7 |
0 | 7 |
8 #============================================================================= | |
9 # Included modules and versions | |
10 #============================================================================= | |
11 ## Perl modules | |
12 use strict ; | |
13 use warnings ; | |
14 use Carp qw (cluck croak carp) ; | |
15 | |
16 use Data::Dumper ; | |
17 use Getopt::Long ; | |
18 use POSIX ; | |
19 use FindBin ; ## Allows you to locate the directory of original perl script | |
20 | |
21 ## Dedicate Perl Modules (Home made...) | |
22 use lib $FindBin::Bin ; | |
23 my $binPath = $FindBin::Bin ; | |
24 use lib::hr qw( :ALL ) ; | |
25 ## PFEM Perl Modules | |
26 use lib::conf qw( :ALL ) ; | |
27 use lib::csv qw( :ALL ) ; | |
28 | |
29 ## Initialized values | |
30 use vars qw(%parametre); | |
31 my $help = undef ; | |
32 my ( $input_file, $line_header, $col_id, $col_mass ) = ( undef, undef, undef, undef ) ; # manage input option file of masses | |
33 my ( $mass ) = ( undef ) ; # manage input option masses list | |
34 my ( $tolerance, $mode, $charge, $has_golden_rules, $atomes, $atomes_basic ) = ( undef, undef, undef, undef, undef, undef ) ; # manage params | |
35 my ( $output_csv, $output_html ) = ( undef, undef) ; # manage ouputs | |
36 my $verbose = 2 ; | |
37 | |
38 #============================================================================= | |
39 # Manage EXCEPTIONS | |
40 #============================================================================= | |
41 &GetOptions ( "h" => \$help, # HELP | |
42 "input:s" => \$input_file, | |
43 "colId:i" => \$col_id, | |
44 "nbHeader:i" => \$line_header, | |
45 "colmass:i" => \$col_mass, | |
46 "masse:s" => \$mass, | |
47 "tolerance:f" => \$tolerance, | |
48 "mode:s" => \$mode, | |
49 "charge:i" => \$charge, | |
50 "regleOr:s" => \$has_golden_rules, | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
51 "atomes_basic:s"=> \$atomes_basic, # [basic atoms like CNOHP] |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
52 "atomes_sup:s" => \$atomes, |
0 | 53 "output1:s" => \$output_csv, |
54 "outputView:s" => \$output_html, | |
55 "verbose:i" => \$verbose, | |
56 ) ; | |
57 | |
58 #============================================================================= | |
59 # EXCEPTIONS | |
60 #============================================================================= | |
61 $help and &help ; | |
62 | |
63 #============================================================================= | |
64 # MAIN SCRIPT | |
65 #============================================================================= | |
66 my %atomsConf = () ; | |
67 $atomsConf{'C'} = {'min' => 0, 'max' => 0} ; | |
68 $atomsConf{ 'H'} = {'min' => 0, 'max' => 0} ; | |
69 $atomsConf{ 'N'} = {'min' => 0, 'max' => 0} ; | |
70 $atomsConf{ 'O'} = {'min' => 0, 'max' => 0} ; | |
71 $atomsConf{ 'P'} = {'min' => 0, 'max' => 0} ; | |
72 $atomsConf{ 'S'} = {'min' => 0, 'max' => 0} ; | |
73 $atomsConf{ 'F'} = {'min' => 0, 'max' => 0} ; | |
74 $atomsConf{ 'L'} = {'min' => 0, 'max' => 0} ; | |
75 $atomsConf{ 'K'} = {'min' => 0, 'max' => 0} ; | |
76 $atomsConf{ 'B'} = {'min' => 0, 'max' => 0} ; | |
77 $atomsConf{ 'A'} = {'min' => 0, 'max' => 0} ; | |
78 $atomsConf{ '1'} = {'min' => 0, 'max' => 0} ; | |
79 | |
80 ## -------------- Conf file and verbose ------------------------ : | |
81 my ( $CONF ) = ( undef ) ; ## verbose level is 3 for debugg | |
82 my $time_start = time ; | |
83 | |
84 foreach my $conf ( <$binPath/*.cfg> ) { | |
85 my $oConf = lib::conf::new() ; | |
86 $CONF = $oConf->as_conf($conf) ; | |
87 } | |
88 ## --------------- Global parameters ---------------- : | |
89 my ( $ids, $masses, $hr_cmds, $results, $parsed_results ) = ( undef, undef, undef, undef, undef ) ; | |
90 my $complete_rows = undef ; | |
91 my ($hr_atoms_list, $hr_atoms_and_ranges, $set_tol, ) = (undef, undef, undef, ) ; | |
92 | |
93 ## Check and manage params | |
94 my $ohr = lib::hr->new() ; | |
95 | |
96 ## set tolerance | |
97 $set_tol = $ohr->manage_tolerance( \$tolerance, \$CONF->{'tolerance'} ) ; | |
98 | |
99 ## check HR exe envt : | |
100 my $hr_check = $ohr->check_hr_exe(\$CONF->{'HR2_EXE'}, \$CONF->{'HR2_VERSION'}) ; | |
101 if (!defined $hr_check ) { croak "No hr exe available (wrong path) or wrong version will be used -- end of script\n" ; } | |
102 | |
103 ## manage atoms and their ranges | |
104 #$hr_atoms_list = $ohr->manage_atoms(\$atomes, \$CONF->{'DEFAULT_ATOMS'}) ; ## DEPRECATED | |
105 | |
106 # manage atoms and their ranges with a hash structure | |
107 my $atomsCurrentConf = $ohr->manage_atoms_and_ranges(\%atomsConf, $CONF, $atomes_basic, $atomes) ; | |
108 | |
109 #if ( defined $hr_atoms_list ) { | |
110 # ## implements range foreach atom | |
111 # foreach my $atom ( (split(",", $$hr_atoms_list )) ) { | |
112 # my $range_max = $CONF->{'DEFAULT_MAX'} ; # manage max value in case of | |
113 # if ( exists $CONF->{$atom} ) { $range_max = $CONF->{$atom} ; } | |
114 # my $ref_range = $ohr->manage_atom_and_range(\$atom, \$CONF->{'DEFAULT_MIN'}, \$range_max ) ; | |
115 # $hr_atoms_and_ranges .= $$ref_range ; ## concat ranges | |
116 # } | |
117 #} | |
118 #else { croak "No atom detected with input params\n" ; } | |
119 | |
120 ## Parsing input file with masses/ids or unik mass : | |
121 ## manage only one mass | |
122 if ( ( defined $mass ) and ( $mass ne "" ) and ( $mass > 0 ) ) { | |
123 $ids = ['mass_01'] ; | |
124 $masses = [$mass] ; | |
125 | |
126 } ## END IF | |
127 ## manage csv file containing list of masses | |
128 elsif ( ( defined $input_file ) and ( $input_file ne "" ) and ( -e $input_file ) ) { | |
129 | |
130 ## parse all csv for later : output csv build | |
131 my $ocsv_input = lib::csv->new() ; | |
132 my $complete_csv = $ocsv_input->get_csv_object( "\t" ) ; | |
133 $complete_rows = $ocsv_input->parse_csv_object($complete_csv, \$input_file) ; | |
134 | |
135 ## parse csv ids and masses | |
136 my $is_header = undef ; | |
137 my $ocsv = lib::csv->new() ; | |
138 my $csv = $ocsv->get_csv_object( "\t" ) ; | |
139 if ( ( defined $line_header ) and ( $line_header > 0 ) ) { $is_header = 'yes' ; } else{ $is_header = 'no' ; } | |
140 $masses = $ocsv->get_value_from_csv_multi_header( $csv, $input_file, $col_mass, $is_header, $line_header ) ; ## retrieve mz values on csv | |
141 $ids = $ocsv->get_value_from_csv_multi_header( $csv, $input_file, $col_id, $is_header, $line_header ) ; ## retrieve ids values on csv | |
142 | |
143 } | |
144 else { | |
145 croak "Can't work with HR2 : missing input file or mass (list of masses, ids)\n" ; | |
146 } ## end ELSE | |
147 | |
148 ## check using golden rules | |
149 if ( $has_golden_rules eq 'NO') { $has_golden_rules = undef ; } | |
150 | |
151 ## ---------------- launch queries -------------------- : | |
152 | |
153 ## prepare cmd | |
154 foreach my $mz (@{ $masses }) { | |
155 ## computes mass | |
156 my $ohr_mode = lib::hr->new() ; | |
157 my ( $exact_mass ) = $ohr_mode->manage_mode( \$mode, \$charge, \$CONF->{'electron'}, \$CONF->{'proton'}, \$mz ) ; | |
158 print "Current MZ send to HR\n" if $verbose == 3 ; | |
159 print Dumper $exact_mass if $verbose == 3 ; | |
160 ## build exe line | |
161 my $ohr_exe = lib::hr->new() ; | |
162 my $hr_cmd = $ohr_exe->config_hr_exe( \$CONF->{'HR2_EXE'}, \$tolerance, $exact_mass, \$has_golden_rules, \$atomsCurrentConf ) ; | |
163 print "$hr_cmd\n" if $verbose == 3 ; | |
164 push(@{$hr_cmds}, $$hr_cmd) ; | |
165 } | |
166 | |
167 ## MultiThreading execution of Hr : | |
168 my $threads = lib::hr->new() ; | |
169 my $hr_object = lib::hr->new() ; | |
170 if ( $hr_object->can('hr_exe') ) { | |
171 my $method = $hr_object->can('hr_exe') ; | |
172 $results = $threads->threading_hr_exe( $method, $hr_cmds) ; | |
173 | |
174 } | |
175 | |
176 ## MultiThreading parsing of Hr outputs : | |
177 my $hrres_object = lib::hr->new() ; | |
178 if ( $hrres_object->can('hr_out_parser') ) { | |
179 my $method = $hr_object->can('hr_out_parser') ; | |
180 if ( defined $results ) { $parsed_results = $threads->threading_hr_exe( $method, $results ) ; } | |
181 } | |
182 | |
183 ## -------------- Produce HTML/CSV output ------------------ : | |
184 my $search_condition = 'Mode used: '.$mode.' / Charge: +'.$charge.' / Mass tolerance: '.$$set_tol.' / Composition: '.$atomsCurrentConf ; | |
185 ## Uses N mz and theirs entries per page (see config file). | |
186 # how many pages you need with your input mz list? | |
187 my $nb_pages_for_html_out = ceil( scalar(@{$masses} ) / $CONF->{HTML_ENTRIES_PER_PAGE} ) ; | |
188 | |
189 if ( ( defined $output_html ) and ( defined $parsed_results ) ) { | |
190 my $oHtml = lib::hr::new() ; | |
191 my ($tbody_object) = $oHtml->set_html_tbody_object( $nb_pages_for_html_out, $CONF->{HTML_ENTRIES_PER_PAGE} ) ; | |
192 ($tbody_object) = $oHtml->add_mz_to_tbody_object($tbody_object, $CONF->{HTML_ENTRIES_PER_PAGE}, $masses, $ids, $parsed_results ) ; | |
193 ($tbody_object) = $oHtml->add_entries_to_tbody_object($tbody_object, $parsed_results) ; | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
194 |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
195 print Dumper $tbody_object ; |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
196 |
0 | 197 my $html_file = $binPath.'/'.$CONF->{'HTML_TEMPLATE'} ; |
198 my $output = $oHtml->write_html_skel(\$output_html, $tbody_object, $nb_pages_for_html_out, $search_condition, $html_file, $CONF->{'JS_GALAXY_PATH'}, $CONF->{'CSS_GALAXY_PATH'}) ; | |
199 | |
200 } ## END IF | |
201 else { | |
202 croak "Can't create a HTML output for HMDB : no result found or your output file is not defined\n" ; | |
203 } | |
204 | |
205 if ( ( defined $output_csv ) and ( defined $parsed_results ) ) { | |
206 # produce a csv based on METLIN format | |
207 my $ocsv = lib::hr::new() ; | |
208 if (defined $input_file) { | |
209 my $lm_matrix = undef ; | |
210 if ( ( defined $line_header ) and ( $line_header == 1 ) ) { $lm_matrix = $ocsv->set_hr_matrix_object('hr2', $masses, $parsed_results ) ; } | |
211 elsif ( ( defined $line_header ) and ( $line_header == 0 ) ) { $lm_matrix = $ocsv->set_hr_matrix_object(undef, $masses, $parsed_results ) ; } | |
212 $lm_matrix = $ocsv->add_hr_matrix_to_input_matrix($complete_rows, $lm_matrix) ; | |
213 $ocsv->write_csv_skel(\$output_csv, $lm_matrix) ; | |
214 } | |
215 elsif (defined $mass) { | |
216 $ocsv->write_csv_one_mass($masses, $ids, $parsed_results, $output_csv) ; | |
217 } | |
218 } ## END IF | |
219 else { | |
220 # croak "Can't create a tabular output for HR2 : no result found or your output file is not defined\n" ; | |
221 } | |
222 | |
223 | |
224 | |
225 ### VERBOSE OUTPUTs | |
226 if ( $verbose == 3 ) { | |
227 print "-- Conf file contains :\n" ; | |
228 print Dumper $CONF ; | |
229 print "-- Atoms input list :\n" ; | |
230 print Dumper $atomes_basic ; | |
231 print "-- Suppl. atoms input list :\n" ; | |
232 print Dumper $atomes ; | |
233 print "-- HR envt ready :\n" ; | |
234 print Dumper $hr_check ; | |
235 print "-- Atoms and ranges :\n" ; | |
236 print Dumper $atomsCurrentConf ; | |
237 print "-- Tolerance :\n" ; | |
238 print Dumper $set_tol ; | |
239 print "-- Complete input file :\n" ; | |
240 print Dumper $complete_rows ; | |
241 print "-- Inputs initiales masses :\n" ; | |
242 print Dumper $masses ; | |
243 print "-- Inputs initiales ids :\n" ; | |
244 print Dumper $ids ; | |
245 print "-- Hr_Cmds :\n" ; | |
246 print Dumper $hr_cmds ; | |
247 print "-- Hr_Results :\n" ; | |
248 # print Dumper $results ; | |
249 print "-- Hr_parsed Results :\n" ; | |
250 print Dumper $parsed_results ; | |
251 | |
252 my $nb_results = scalar (@{$results}) ; | |
253 print "-- Hr_Results return : $nb_results\n" ; | |
254 } | |
255 | |
256 my $time_end = time ; | |
257 my $seconds = $time_end-$time_start ; | |
258 print "\n------ Time used in threaded mode by 6 : $seconds seconds --------\n\n" ; | |
259 | |
260 | |
261 | |
262 | |
263 | |
264 | |
265 #==================================================================================== | |
266 # Help subroutine called with -h option | |
267 # number of arguments : 0 | |
268 # Argument(s) : | |
269 # Return : 1 | |
270 #==================================================================================== | |
271 sub help { | |
272 print STDERR " | |
273 hr2_manager.pl | |
274 | |
275 # hr2_manager is a script to elucide chemical formula by their accurate masses. The HiRes program is integrate in this package | |
276 # Input : a accurate mass or a file of masses | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
277 # Authors : Lain Pavot, Marion Landi and Franck Giacomoni |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
278 # Email : franck.giacomoni\@inrae.fr |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
279 # Version : 1.1.2 |
0 | 280 # Created : 01/12/2011 |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
281 # Last Update : 06/12/2022 |
0 | 282 USAGE : |
283 hr2_manager.pl -h or | |
284 hr2_manager.pl -input [cvs file of masses] -colId [int] -colmass [int] -nbHeader [int] -tolerance [float] -mode [positive, neutral or negative] -charge [int] -regleOr [yes or no] -atome [P, S, F, Cl, K, B, A, 1 ] -output1 [csv file] -outputView [html file] | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
285 hr2_manager.pl -masse [double] -tolerance [float] -mode [positive, neutral or negative] -charge [int] -regleOr [yes or no] -atomes_basic [C, N, O, P, H ] -atomes_sup [S, F, Cl, K, B, A, 1 ] -output1 [csv file] -outputView [html file] |
0 | 286 " ; |
287 exit(1); | |
288 } | |
289 | |
290 ## END of script - F Giacomoni | |
291 | |
292 __END__ | |
293 | |
294 =head1 NAME | |
295 | |
296 hr2_manager.pl -- script for launch / manage hr2 binary | |
297 | |
298 =head1 USAGE | |
299 | |
300 hr2_manager.pl -h or | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
301 hr2_manager.pl -input [cvs file of masses] -colId [int] -colmass [int] -nbHeader [int] -tolerance [float] -mode [positive, neutral or negative] -charge [int] -regleOr [yes or no] -atomes_basic [C, N, O, P, H ] -atomes_sup [S, F, Cl, K, B, A, 1 ] -output1 [csv file] -outputView [html file] |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
302 hr2_manager.pl -masse [double] -tolerance [float] -mode [positive, neutral or negative] -charge [int] -regleOr [yes or no] -atomes_basic [C, N, O, P, H ] -atomes_sup [S, F, Cl, K, B, A, 1 ] -output1 [csv file] -outputView [html file] |
0 | 303 |
304 =head1 SYNOPSIS | |
305 | |
306 This script manages hr2 binary which elucids raw formula with exact masses. | |
307 | |
308 =head1 DESCRIPTION | |
309 | |
310 This main program is a module to elucidate chemical formula with HiRes program. Source is available on Fiehn lab web. | |
311 | |
312 =over 4 | |
313 | |
314 =item B<function01> | |
315 | |
316 =item B<function02> | |
317 | |
318 =back | |
319 | |
320 =head1 AUTHOR | |
321 | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
322 Franck Giacomoni E<lt>franck.giacomoni@inrae.frE<gt> |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
323 Marion Landi E<lt>marion.landi@inrae.frE<gt> |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
324 Lain Pavot E<lt>lain.pavot@inrae.frE<gt> |
0 | 325 |
326 =head1 LICENSE | |
327 | |
328 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. | |
329 | |
330 =head1 VERSION | |
331 | |
332 version 1 : 18/07/2012 | |
333 | |
334 version 2 : 02/10/2013 | |
335 | |
336 version 3 : 20/02/2014 | |
337 | |
338 version 4 : 01/03/2019 | |
339 | |
1
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
340 version 5 : 09/12/2022 |
e2cbcf6fa22e
master branch Updating with tag :CI_COMMIT_TAG - - Fxx
fgiacomoni
parents:
0
diff
changeset
|
341 |
0 | 342 =cut |