Mercurial > repos > fgiacomoni > golm_ws_lib_search
comparison lib/msp.pm @ 0:e3d43b8c987b draft
Init repository with last tool-bank-golm-lib_search master version
author | fgiacomoni |
---|---|
date | Mon, 05 Dec 2016 08:32:04 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e3d43b8c987b |
---|---|
1 package lib::msp ; | |
2 | |
3 use strict; | |
4 use warnings ; | |
5 use Exporter ; | |
6 use Carp ; | |
7 | |
8 use Data::Dumper ; | |
9 use List::MoreUtils qw(uniq); | |
10 | |
11 use vars qw($VERSION @ISA @EXPORT %EXPORT_TAGS); | |
12 | |
13 our $VERSION = "1.0"; | |
14 our @ISA = qw(Exporter); | |
15 our @EXPORT = qw( get_mzs get_intensities get_masses_from_string get_intensities_from_string keep_only_max_masses keep_only_max_intensities encode_spectrum_for_query sorting_descending_intensities round_num apply_relative_intensity remove_redundants); | |
16 our %EXPORT_TAGS = ( ALL => [qw( get_mzs get_intensities get_masses_from_string get_intensities_from_string keep_only_max_masses keep_only_max_intensities encode_spectrum_for_query sorting_descending_intensities round_num apply_relative_intensity remove_redundants)] ); | |
17 | |
18 =head1 NAME | |
19 | |
20 My::Module - An example module | |
21 | |
22 =head1 SYNOPSIS | |
23 | |
24 use My::Module; | |
25 my $object = My::Module->new(); | |
26 print $object->as_string; | |
27 | |
28 =head1 DESCRIPTION | |
29 | |
30 This module does not really exist, it | |
31 was made for the sole purpose of | |
32 demonstrating how POD works. | |
33 | |
34 =head1 METHODS | |
35 | |
36 Methods are : | |
37 | |
38 =head2 METHOD new | |
39 | |
40 ## Description : new | |
41 ## Input : $self | |
42 ## Ouput : bless $self ; | |
43 ## Usage : new() ; | |
44 | |
45 =cut | |
46 | |
47 sub new { | |
48 ## Variables | |
49 my $self={}; | |
50 bless($self) ; | |
51 return $self ; | |
52 } | |
53 ### END of SUB | |
54 | |
55 | |
56 | |
57 =head2 METHOD get_mzs | |
58 | |
59 ## Description : parse msp file and get mzs | |
60 ## Input : $msp_file, $mzRes, $maxIon | |
61 ## Output : \@total_spectra_mzs | |
62 ## Usage : my ( $mzs ) = get_mzs( $msp_file , $mzRes, $maxIon) ; | |
63 ## Structure of res: [ $arr_ref1 , $arr_ref2 ... $arr_refN ] | |
64 =cut | |
65 ## START of SUB | |
66 sub get_mzs { | |
67 ## Retrieve Values | |
68 my $self = shift ; | |
69 my ( $msp_file, $mzRes ) = @_ ; | |
70 | |
71 my @ions = () ; | |
72 my @temp_mzs = () ; | |
73 my @uniq_masses ; | |
74 my @mzs = (); | |
75 my @total_spectra_mzs = (); | |
76 my $mz ; | |
77 my $i = 0 ; | |
78 | |
79 open (MSP , "<" , $msp_file) or die $! ; | |
80 | |
81 { | |
82 local $/ = 'Name' ; | |
83 my @infos = () ; | |
84 # One line is : "Name -> Name" englobing a whole spectrum with all infos | |
85 while(my $line = <MSP>) { | |
86 | |
87 chomp $line; | |
88 @infos = split (/\n/ , $line) ; | |
89 # Loop over all lines of a spectrum | |
90 for (my $i=0 ; $i<@infos ; $i++) { | |
91 # Detect spectrum lines only | |
92 if ($infos[$i] =~ /(\d+\.?\d*)\s+(\d+\.?\d*)\s*;\s*/) { | |
93 | |
94 @ions = split ( /;/ , $infos[$i] ) ; | |
95 # Retrieve mzs according to maxIons value | |
96 foreach my $ion (@ions) { | |
97 | |
98 if ($ion =~ /^\s*(\d+\.?\d*)\s+(\d+\.?\d*)$/) { | |
99 | |
100 $mz = $1 ; | |
101 # Truncate/round mzs depending on $mzRes wanted | |
102 if ($mzRes == 0) { | |
103 my $mz_rounded = sprintf("%.".$mzRes."f", $mz) ; | |
104 push (@temp_mzs , $mz_rounded) ; | |
105 } | |
106 # Check that $mzRes is not greater than the number of digits after comma | |
107 elsif ($mzRes > 0) { | |
108 if ($mz !~ /^\d+\.\d+$/) { croak "*********\n\nYou are trying to specify $mzRes significant decimals, but one or more masses in the input file are unitary masses.\nYou should try again with mzRes = 0\n\n\n"; } | |
109 elsif($mzRes > length(( $mz =~ /.+\.(.*)/)[0] )) { | |
110 $mz = sprintf("%.".$mzRes."f" , $mz) ; | |
111 } | |
112 my $mz_rounded = _round_num($mz,$mzRes) ; | |
113 push (@temp_mzs , $$mz_rounded) ; | |
114 } | |
115 } | |
116 } | |
117 } | |
118 } | |
119 if($line ne '') { | |
120 @{ $total_spectra_mzs[$i] } = @temp_mzs ; | |
121 $i++ ; | |
122 @temp_mzs = () ; | |
123 } | |
124 } | |
125 } | |
126 #print Dumper \@total_spectra_mzs ; | |
127 close (MSP) ; | |
128 return(\@total_spectra_mzs) ; | |
129 } | |
130 ## END of SUB | |
131 | |
132 | |
133 | |
134 | |
135 =head2 METHOD get_intensities | |
136 | |
137 ## Description : parse msp file and get intensities | |
138 ## Input : $msp_file, $maxIons | |
139 ## Output : \@total_spectra_intensities | |
140 ## Usage : my ( $intensities ) = get_mzs( $msp_file, $maxIons ) ; | |
141 ## Structure of res: [ $arr_ref1 , $arr_ref2 ... $arr_refN ] | |
142 =cut | |
143 ## START of SUB | |
144 sub get_intensities { | |
145 ## Retrieve Values | |
146 my $self = shift ; | |
147 my ( $msp_file ) = @_ ; | |
148 | |
149 my @ions = () ; | |
150 my @temp_intensities = () ; | |
151 my @intensities = () ; | |
152 my @total_spectra_intensities = (); | |
153 my $i = 0 ; | |
154 | |
155 open (MSP , "<" , $msp_file) or die $! ; | |
156 | |
157 { | |
158 local $/ = 'Name' ; | |
159 my @infos = () ; | |
160 # Extract spectrum | |
161 while(my $line = <MSP>) { | |
162 chomp $line; | |
163 @infos = split (/\n/ , $line) ; | |
164 #Detect spectrum | |
165 for (my $i=0 ; $i<@infos ; $i++) { | |
166 if ($infos[$i] =~ /(\d+\.?\d*)\s+(\d+\.?\d*)\s*;\s*?/) { | |
167 @ions = split ( /;/ , $infos[$i] ) ; | |
168 # Retrieve intensities | |
169 foreach my $ion (@ions) { | |
170 if ($ion =~ /^\s*(\d+\.?\d*)\s+(\d+\.?\d*)$/) { | |
171 my $intensity = $2 ; | |
172 push ( @temp_intensities , $intensity ) ; | |
173 } | |
174 } | |
175 } | |
176 } | |
177 if($line ne '') { | |
178 @{ $total_spectra_intensities[$i] } = @temp_intensities ; | |
179 $i++ ; | |
180 @temp_intensities = () ; | |
181 } | |
182 } | |
183 } | |
184 close (MSP) ; | |
185 return(\@total_spectra_intensities) ; | |
186 } | |
187 ## END of SUB | |
188 | |
189 | |
190 =head2 METHOD get_masses_from_string | |
191 | |
192 ## Description : parse a spectrum string and get mzs and intensities | |
193 ## Input : $spectrum_string, $mzRes | |
194 ## Output : \@spectrum_intensities_mzs | |
195 ## Usage : my ( $spectrum_mzs ) = get_masses_from_string( $spectrum_string , $mzRes ) ; | |
196 =cut | |
197 ## START of SUB | |
198 sub get_masses_from_string { | |
199 ## Retrieve Values | |
200 my $self = shift ; | |
201 my ( $spectrum_string, $mzRes ) = @_ ; | |
202 | |
203 my @intensities = () ; | |
204 my @mzs = () ; | |
205 | |
206 if (defined $spectrum_string) { | |
207 | |
208 if ($spectrum_string ne '') { | |
209 | |
210 if ($spectrum_string =~ /\s*(\d+\.?\d*)\s+(\d+\.?\d*)\s*/ ) { | |
211 | |
212 my @val = split (/\s+/ , $spectrum_string) ; | |
213 for (my $i=0 ; $i<@val ; $i++) { | |
214 if ($i%2 == 0) { | |
215 my $mz = $val[$i] ; | |
216 # Truncate/round mzs depending on $mzRes wanted | |
217 if ($mzRes == 0) { | |
218 $mz = int($mz) ; | |
219 push ( @mzs , $val[$i] ) ; | |
220 } | |
221 # Check that $mzRes is not greater than the number of digits after comma | |
222 elsif ($mzRes > 0) { | |
223 if($mzRes > length(( $mz =~ /.+\.(.*)/)[0] )) { | |
224 $mz = sprintf("%.".$mzRes."f" , $mz) ; | |
225 } | |
226 my $mz_rounded = _round_num($mz,$mzRes) ; | |
227 push ( @mzs , $$mz_rounded ) ; | |
228 } | |
229 } | |
230 } | |
231 return (\@mzs) ; | |
232 } | |
233 else { croak "Wrong format of the spectrum. See help\n" } | |
234 } | |
235 else { croak "Spectrum is empty, the service will stop\n" } ; | |
236 } | |
237 else { croak "Spectrum is not defined, service will stop\n" } ; | |
238 } | |
239 ## END of SUB | |
240 | |
241 | |
242 | |
243 =head2 METHOD get_intensities_from_string | |
244 | |
245 ## Description : parse a spectrum string and get intensities | |
246 ## Input : $spectrum_string | |
247 ## Output : \@spectrum_intensities | |
248 ## Usage : my ( $spectrum_intensities ) = get_intensities_from_string( $spectrum_string ) ; | |
249 =cut | |
250 ## START of SUB | |
251 sub get_intensities_from_string { | |
252 ## Retrieve Values | |
253 my $self = shift ; | |
254 my ( $spectrum_string ) = @_ ; | |
255 | |
256 my @intensities = () ; | |
257 my @mzs = () ; | |
258 | |
259 if (defined $spectrum_string) { | |
260 | |
261 if ($spectrum_string ne '') { | |
262 | |
263 if ($spectrum_string =~ /\s*(\d+\.?\d*)\s+(\d+\.?\d*)\s*/ ) { | |
264 | |
265 my @val = split (/\s+/ , $spectrum_string) ; | |
266 for (my $i=0 ; $i<@val ; $i++) { | |
267 if ($i%2 != 0) { | |
268 my $int = $val[$i] ; | |
269 push ( @intensities , $int ) ; | |
270 } | |
271 } | |
272 return (\@intensities) ; | |
273 } | |
274 else { croak "Wrong format of the spectrum. See help\n" } | |
275 } | |
276 else { croak "Spectrum is empty, the service will stop\n" } ; | |
277 } | |
278 else { croak "Spectrum is not defined, service will stop\n" } ; | |
279 } | |
280 ## END of SUB | |
281 | |
282 | |
283 | |
284 | |
285 | |
286 =head2 METHOD sorting_descending_intensities | |
287 | |
288 ## Description : sort mzs and intensities arrays by descending intensity values | |
289 ## Input : $ref_mzs_res, $ref_ints_res | |
290 ## Output : \@mzs_res, \@ints_res | |
291 ## Usage : my ( \@mzs_res, \@ints_res ) = sorting_descending_intensities( $ref_mzs_res, $ref_ints_res ) ; | |
292 =cut | |
293 ## START of SUB | |
294 sub sorting_descending_intensities { | |
295 ## Retrieve Values | |
296 my $self = shift ; | |
297 my ( $ref_mzs_res, $ref_ints_res ) = @_ ; | |
298 | |
299 my @mzs_res = () ; | |
300 my @ints_res = () ; | |
301 | |
302 if ( defined $ref_mzs_res && defined $ref_ints_res ) { | |
303 if ( (scalar @$ref_mzs_res) != 0 && (scalar @$ref_ints_res) != 0 ) { | |
304 | |
305 @mzs_res = @$ref_mzs_res ; | |
306 @ints_res = @$ref_ints_res ; | |
307 | |
308 # Case when we have only one array of masses (input is a string of masses and not a file) | |
309 if ( ref(@$ref_ints_res[0]) ne "ARRAY") { | |
310 | |
311 my @sorted_indices = sort { $ints_res[$b] <=> $ints_res[$a] } 0..$#ints_res; | |
312 @$_ = @{$_}[@sorted_indices] for \(@mzs_res, @ints_res); | |
313 | |
314 } | |
315 else { | |
316 ## Sorting ions by decreasing intensity values | |
317 for (my $i=0 ; $i<@ints_res ; $i++) { | |
318 my @sorted_indices = sort { @{$ints_res[$i]}[$b] <=> @{$ints_res[$i]}[$a] } 0..$#{$ints_res[$i]}; | |
319 @$_ = @{$_}[@sorted_indices] for \(@{$ints_res[$i]},@{$mzs_res[$i]}); | |
320 } | |
321 } | |
322 } | |
323 else { carp "Cannot sort intensities, mzs or intensities are empty" ; return (\@mzs_res, \@ints_res) ; } | |
324 } | |
325 else { carp "Cannot sort intensities, mzs or intensities are undef" ; return (\@mzs_res, \@ints_res) ; } | |
326 | |
327 return (\@mzs_res, \@ints_res) ; | |
328 } | |
329 ## END of SUB | |
330 | |
331 | |
332 | |
333 | |
334 =head2 METHOD keep_only_max_masses | |
335 | |
336 ## Description : keep only $maxIons masses | |
337 ## Input : $mzs_res_sorted, $maxIons | |
338 ## Output : \@mzs | |
339 ## Usage : my ( $mzs ) = keep_only_max_masses( $mzs_res_sorted, $ints_res_sorted, $maxIons ) ; | |
340 =cut | |
341 ## START of SUB | |
342 sub keep_only_max_masses { | |
343 ## Retrieve Values | |
344 my $self = shift ; | |
345 my ( $ref_mzs_res, $maxIons ) = @_ ; | |
346 | |
347 my @mzs = () ; | |
348 my @tot_mzs = () ; | |
349 | |
350 if ( ref(@$ref_mzs_res[0]) ne "ARRAY") { | |
351 my $i = 0 ; | |
352 while (scalar @tot_mzs < $maxIons && $i < @$ref_mzs_res){ | |
353 push (@tot_mzs , $$ref_mzs_res[$i++]) ; | |
354 } | |
355 } | |
356 else { | |
357 for (my $i=0 ; $i<@$ref_mzs_res ; $i++) { | |
358 my $j = 0 ; | |
359 while (scalar @mzs < $maxIons && $j < @$ref_mzs_res[$i]){ | |
360 push (@mzs , $ref_mzs_res->[$i][$j++]) ; | |
361 } | |
362 push (@tot_mzs , \@mzs) ; | |
363 } | |
364 } | |
365 return (\@tot_mzs) ; | |
366 } | |
367 ## END of SUB | |
368 | |
369 | |
370 | |
371 | |
372 =head2 METHOD keep_only_max_intensities | |
373 | |
374 ## Description : keep only $maxIons intensities | |
375 ## Input : $ints_res_sorted, $maxIons | |
376 ## Output : \@ints | |
377 ## Usage : my ( $ints ) = keep_only_max_intensities( $ints_res_sorted, $maxIons ) ; | |
378 =cut | |
379 ## START of SUB | |
380 sub keep_only_max_intensities { | |
381 ## Retrieve Values | |
382 my $self = shift ; | |
383 my ( $ref_ints_res, $maxIons ) = @_ ; | |
384 | |
385 my @ints = () ; | |
386 my @tot_ints = () ; | |
387 if ( ref(@$ref_ints_res[0]) ne "ARRAY") { | |
388 my $i = 0 ; | |
389 while (scalar @tot_ints < $maxIons && $i < @$ref_ints_res){ | |
390 push (@tot_ints , $$ref_ints_res[$i++]) ; | |
391 } | |
392 } | |
393 else { | |
394 for (my $i=0 ; $i<@$ref_ints_res ; $i++) { | |
395 my $j = 0 ; | |
396 while (scalar @ints < $maxIons && $j < @$ref_ints_res[$i]){ | |
397 push (@ints , $ref_ints_res->[$i][$j++]) ; | |
398 } | |
399 push (@tot_ints , \@ints) ; | |
400 } | |
401 } | |
402 return (\@tot_ints) ; | |
403 } | |
404 ## END of SUB | |
405 | |
406 | |
407 | |
408 | |
409 | |
410 =head2 METHOD encode_spectrum_for_query | |
411 | |
412 ## Description : get mzs and intensities values and generate the spectra strings formatted for the WS query (html) | |
413 ## Input : $mzs, $intensities | |
414 ## Output : \@encoded_spectra | |
415 ## Usage : my ( $encoded_spectra ) = get_spectra( $mzs, $intensities ) ; | |
416 | |
417 =cut | |
418 ## START of SUB | |
419 sub encode_spectrum_for_query { | |
420 ## Retrieve Values | |
421 my $self = shift ; | |
422 my ( $mzs, $intensities ) = @_ ; | |
423 | |
424 my @encoded_spectra = () ; | |
425 my $spectrum = "" ; | |
426 my $k = 0 ; | |
427 | |
428 #print Dumper $mzs ; | |
429 | |
430 if ( defined $mzs && defined $intensities ) { | |
431 if ( @$mzs && @$intensities ) { | |
432 | |
433 # Case when we have only one array of masses (input is a string of masses and not a file) | |
434 if ( ref(@$mzs[0]) ne "ARRAY") { | |
435 for (my $i=0 ; $i< @$mzs ; $i++) { | |
436 $spectrum = $spectrum . @$mzs[$i] . " " . @$intensities[$i] . " "; | |
437 } | |
438 push ( @encoded_spectra , $spectrum ) ; | |
439 } | |
440 else { | |
441 for (my $i=0 ; $i< @$mzs ; $i++) { | |
442 | |
443 for ( my $j=0 ; $j< @{ @$mzs[$i] } ; $j++ ) { | |
444 | |
445 $spectrum = $spectrum . $$mzs[$i][$j] . " " . $$intensities[$i][$j] . " "; | |
446 } | |
447 $encoded_spectra[$k] = $spectrum ; | |
448 $k++ ; | |
449 $spectrum = '' ; | |
450 } | |
451 } | |
452 } | |
453 else { carp "Cannot encode spectrum, mzs and intensities arrays are empty" ; return \@encoded_spectra ; } | |
454 } | |
455 else { carp "Cannot encode spectrum, mzs and intensities are undef" ; return \@encoded_spectra ; } | |
456 return \@encoded_spectra ; | |
457 } | |
458 ## END of SUB | |
459 | |
460 | |
461 =head2 METHOD round_num | |
462 | |
463 ## Description : round a number by the sended decimal | |
464 ## Input : $number, $decimal | |
465 ## Output : $round_num | |
466 ## Usage : my ( $round_num ) = round_num( $number, $decimal ) ; | |
467 | |
468 =cut | |
469 ## START of SUB | |
470 sub _round_num { | |
471 ## Retrieve Values | |
472 my ( $number, $decimal ) = @_ ; | |
473 my $round_num = 0 ; | |
474 | |
475 if ( ( defined $decimal ) and ( $decimal > 0 ) and ( defined $number ) and ( $number > 0 ) ) { | |
476 $round_num = sprintf("%.".$decimal."f", $number); ## a rounding is used : 5.3 -> 5 and 5.5 -> 6 | |
477 } | |
478 else { | |
479 croak "Can't round any number : missing value or decimal\n" ; | |
480 } | |
481 | |
482 return(\$round_num) ; | |
483 } | |
484 ## END of SUB | |
485 | |
486 | |
487 | |
488 =head2 METHOD apply_relative_intensity | |
489 | |
490 ## Description : transform absolute intensities into relative intensities | |
491 ## Input : $intensities | |
492 ## Output : \@intensities | |
493 ## Usage : my ( $intensities ) = apply_relative_intensity( $intensities ) ; | |
494 | |
495 =cut | |
496 ## START of SUB | |
497 sub apply_relative_intensity { | |
498 ## Retrieve Values | |
499 my $self = shift ; | |
500 my ($intensities) = @_ ; | |
501 | |
502 my @intensities = @$intensities ; | |
503 my @relative_intensities ; | |
504 | |
505 foreach my $ints (@intensities) { | |
506 my @relative_ints = map { ($_ * 100)/@$ints[0] } @$ints ; | |
507 push (@relative_intensities , \@relative_ints) ; | |
508 } | |
509 return \@relative_intensities ; | |
510 } | |
511 ## END of SUB | |
512 | |
513 | |
514 | |
515 =head2 METHOD remove_redundants | |
516 | |
517 ## Description : removes ions with redundant masses | |
518 ## Input : $masses $intensities | |
519 ## Output : \@intensities | |
520 ## Usage : my ( $uniq_masses, $uniq_intensities ) = remove_redundants( $masses, $intensities ) ; | |
521 | |
522 =cut | |
523 ## START of SUB | |
524 sub remove_redundants { | |
525 ## Retrieve Values | |
526 my $self = shift ; | |
527 my ($masses, $intensities) = @_ ; | |
528 | |
529 my %uniq = () ; | |
530 my @uniq_intensities = () ; | |
531 | |
532 ## Create hash with key = mass and value = intensity | |
533 for (my $i=0 ; $i<@$masses ; $i++) { | |
534 $uniq{ @$masses[$i] } = @$intensities[$i] ; | |
535 } | |
536 | |
537 ## Remove redundant masses | |
538 my @uniq_masses = uniq(@$masses) ; | |
539 | |
540 ## Keep intensities corresponding to uniq masses | |
541 foreach my $mass (@uniq_masses) { | |
542 push (@uniq_intensities , $uniq{ $mass }) ; | |
543 } | |
544 | |
545 return (\@uniq_masses , \@uniq_intensities) ; | |
546 | |
547 } | |
548 ## END of SUB | |
549 | |
550 | |
551 #******************************************************************************************************** | |
552 # FONCTION DU SEUIL POUR LE BRUIT, A DECOMMENTER SI FINALEMENT CE N'EST PAS GERE DANS LA BRIQUE MetaMS | |
553 #******************************************************************************************************** | |
554 | |
555 | |
556 =head2 METHOD keep_ions_above_threshold | |
557 | |
558 ## Description : keep only ions which intensities are above the threshold | |
559 ## Input : $mzs_res_sorted, $ints_res_sorted, $noiseThreshold | |
560 ## Output : $mzs_res_noise_threshold, $ints_res_noise_threshold | |
561 ## Usage : my ( $mzs_res_noise_threshold, $ints_res_noise_threshold ) = keep_ions_above_threshold( $mzs_res_sorted, $ints_res_sorted, $noiseThreshold ) ; | |
562 | |
563 =cut | |
564 ## START of SUB | |
565 #sub keep_ions_above_threshold { | |
566 # ## Retrieve Values | |
567 # my $self = shift ; | |
568 # my ($mzs_res_sorted, $ints_res_sorted, $noiseThreshold) = @_ ; | |
569 # | |
570 # my (@mzs_res_noise_threshold, @ints_res_noise_threshold) = ( (),() ) ; | |
571 # my (@mzs_res_noise_threshold_temp, @ints_res_noise_threshold_temp) = ( (),() ) ; | |
572 # my $i = 0 ; | |
573 # my $j = 0 ; | |
574 # # Case when we have only one array of masses (input is a string of masses and not a file) | |
575 # if ( ref(@$mzs_res_sorted[0]) ne "ARRAY") { | |
576 # | |
577 # while( @$ints_res_sorted[$i] > $noiseThreshold && $i < scalar @$mzs_res_sorted) { | |
578 # | |
579 # push ( @mzs_res_noise_threshold , @$mzs_res_sorted[$i] ) ; | |
580 # push ( @ints_res_noise_threshold , @$ints_res_sorted[$i] ) ; | |
581 # $i++ ; | |
582 # } | |
583 # } | |
584 # else { | |
585 # while( $i < @$ints_res_sorted ) { | |
586 # | |
587 # while( $$ints_res_sorted[$i][$j] > $noiseThreshold && $j < scalar @$ints_res_sorted[$i]) { | |
588 # | |
589 # push ( @mzs_res_noise_threshold_temp , $$mzs_res_sorted[$i][$j] ) ; | |
590 # push ( @ints_res_noise_threshold_temp , $$ints_res_sorted[$i][$j] ) ; | |
591 # $j++ ; | |
592 # } | |
593 # push ( @mzs_res_noise_threshold , \@mzs_res_noise_threshold_temp ) ; | |
594 # push ( @ints_res_noise_threshold , \@ints_res_noise_threshold_temp ) ; | |
595 # $i++ ; | |
596 # } | |
597 # } | |
598 # | |
599 # return (\@mzs_res_noise_threshold, \@ints_res_noise_threshold) ; | |
600 #} | |
601 ## END of SUB | |
602 | |
603 | |
604 #******************************************************************************************************** | |
605 #******************************************************************************************************** | |
606 #******************************************************************************************************** | |
607 | |
608 | |
609 1 ; | |
610 | |
611 | |
612 __END__ | |
613 | |
614 =head1 SUPPORT | |
615 | |
616 You can find documentation for this module with the perldoc command. | |
617 | |
618 perldoc csv.pm | |
619 | |
620 =head1 Exports | |
621 | |
622 =over 4 | |
623 | |
624 =item :ALL is get_spectra | |
625 | |
626 =back | |
627 | |
628 =head1 AUTHOR | |
629 | |
630 Gabriel Cretin E<lt>gabriel.cretin@clermont.inra.frE<gt> | |
631 | |
632 =head1 LICENSE | |
633 | |
634 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. | |
635 | |
636 =head1 VERSION | |
637 | |
638 version 1 : 03 / 06 / 2016 | |
639 | |
640 version 2 : 24 / 06 / 2016 | |
641 | |
642 =cut |