<?xml version='1.0'?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
	<title><![CDATA[BOL: Perl script to parse blast results and plot basic stats !]]></title>
	<link>https://bioinformaticsonline.com/snippets/view/44458/perl-script-to-parse-blast-results-and-plot-basic-stats?</link>
	<atom:link href="https://bioinformaticsonline.com/snippets/view/44458/perl-script-to-parse-blast-results-and-plot-basic-stats?" rel="self" type="application/rss+xml" />
	<description><![CDATA[]]></description>
	
	<item>
	<guid isPermaLink="true">https://bioinformaticsonline.com/snippets/view/44458/perl-script-to-parse-blast-results-and-plot-basic-stats</guid>
	<pubDate>Thu, 01 Feb 2024 02:11:23 -0600</pubDate>
	<link>https://bioinformaticsonline.com/snippets/view/44458/perl-script-to-parse-blast-results-and-plot-basic-stats</link>
	<title><![CDATA[Perl script to parse blast results and plot basic stats !]]></title>
	<description><![CDATA[<code>#!/usr/bin/perl

use strict;
use warnings;
use List::Util qw(sum);

# Usage: ./parse_blast.pl blast_result.txt

die &quot;Usage: ./parse_blast.pl blast_result.txt\n&quot; unless @ARGV;

my $blast_file = shift @ARGV;
my @blast_entries = parse_blast($blast_file);

print &quot;Total entries: &quot;, scalar(@blast_entries), &quot;\n&quot;;
print &quot;---------------------------\n&quot;;

# Print detailed information for each entry
for my $entry (@blast_entries) {
    print &quot;Query:             &quot;, $entry-&gt;{QUERY},         &quot;\n&quot;;
    print &quot;Subject:           &quot;, $entry-&gt;{SUBJECT},       &quot;\n&quot;;
    print &quot;Percent Identity:  &quot;, $entry-&gt;{PERCENT_IDENTITY}, &quot;\n&quot;;
    print &quot;Alignment Length:  &quot;, $entry-&gt;{ALIGNMENT_LENGTH}, &quot;\n&quot;;
    print &quot;E-value:           &quot;, $entry-&gt;{EVALUE},        &quot;\n&quot;;
    print &quot;Bit Score:         &quot;, $entry-&gt;{BITSCORE},      &quot;\n&quot;;
    print &quot;---------------------------\n&quot;;
}

# Calculate additional statistics
my $avg_percent_identity = calculate_average(\@blast_entries, &#039;PERCENT_IDENTITY&#039;);
my $avg_alignment_length = calculate_average(\@blast_entries, &#039;ALIGNMENT_LENGTH&#039;);
my ($min_evalue, $max_evalue, $avg_evalue) = calculate_summary_stats(\@blast_entries, &#039;EVALUE&#039;);
my ($min_bitscore, $max_bitscore, $avg_bitscore) = calculate_summary_stats(\@blast_entries, &#039;BITSCORE&#039;);

# Print summary statistics
print &quot;Average Percent Identity:  $avg_percent_identity\n&quot;;
print &quot;Average Alignment Length:  $avg_alignment_length\n&quot;;
print &quot;E-value Range:             $min_evalue - $max_evalue\n&quot;;
print &quot;Average E-value:           $avg_evalue\n&quot;;
print &quot;Bit Score Range:           $min_bitscore - $max_bitscore\n&quot;;
print &quot;Average Bit Score:         $avg_bitscore\n&quot;;

sub parse_blast {
    my ($file) = @_;

    open my $fh, &#039;&lt;&#039;, $file or die &quot;Cannot open file $file: $!\n&quot;;

    my @entries;

    while (my $line = &lt;$fh&gt;) {
        next if $line =~ /^\s*$/;  # skip empty lines

        chomp $line;
        my @fields = split /\t/, $line;

        my %entry;
        @entry{qw/QUERY SUBJECT PERCENT_IDENTITY ALIGNMENT_LENGTH EVALUE BITSCORE/} = @fields;

        push @entries, \%entry;
    }

    close $fh;

    return @entries;
}

sub calculate_average {
    my ($entries, $field) = @_;
    my @values = map { $_-&gt;{$field} } @$entries;
    return @values ? sum(@values) / @values : 0;
}

sub calculate_summary_stats {
    my ($entries, $field) = @_;
    my @values = map { $_-&gt;{$field} } @$entries;

    my $min = @values ? (sort { $a &lt;=&gt; $b } @values)[0] : 0;
    my $max = @values ? (sort { $b &lt;=&gt; $a } @values)[0] : 0;
    my $avg = @values ? sum(@values) / @values : 0;

    return ($min, $max, $avg);
}</code>]]></description>
	<dc:creator>LEGE</dc:creator>
</item>

</channel>
</rss>