sub gf2 { my ($spectrum, $subsp) = @_; my %unique; @unique{@spectrum} = (); my @uspectrum = sort {$a <=> $b} keys %unique; return gf1(\@uspectrum, $subsp); } sub gf1 { my ($spectrum, $subsp) = @_; my $sum = 0; for my $value (@$subsp) { my $mid = int (@$spectrum / 2); my $span = int (@$spectrum / 2); while (int $span) { if ($value < $spectrum->[$mid]) { $mid -= int (($span /= 2) + 0.5); } elsif ($value > $spectrum->[$mid]) { $mid += int (0.5 + ($span /= 2)); } else { last; } } my $delta; my $left = $mid ? abs ($value - $spectrum->[$mid - 1]) : 1e6; my $right = $mid < $#$spectrum ? abs ($value - $spectrum->[$mid + 1]) : 1e6; my $cent = abs ($value - $spectrum->[$mid]); $sum += (sort {$a <=> $b} ($left, $right, $cent))[0]; } my $result = 1000; $result = @$subsp / $sum if $sum != 0; return $result; }