]> git.donarmstrong.com Git - biopieces.git/blobdiff - bp_bin/analyze_seq
speedup of analyze_seq 3 fold
[biopieces.git] / bp_bin / analyze_seq
index b6f7d8c50ca78c4c054a7f68936fcc2c75a8e8ff..14188894cdbd07a88da5282a3b12b108518b923a 100755 (executable)
@@ -22,7 +22,8 @@
 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DESCRIPTION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
 
-# Analyze BED entries in the stream.
+# Analyze sequences in the stream.
+
 
 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
@@ -30,6 +31,7 @@
 use warnings;
 use strict;
 use Maasha::Biopieces;
+use Maasha::Common;
 use Maasha::Seq;
 
 
@@ -45,12 +47,7 @@ $out = Maasha::Biopieces::write_stream( $options->{ "stream_out" } );
 
 while ( $record = Maasha::Biopieces::get_record( $in ) ) 
 {
-    if ( $record->{ "SEQ" } )
-    {
-        $analysis = Maasha::Seq::seq_analyze( $record->{ "SEQ" } );
-
-        map { $record->{ $_ } = $analysis->{ $_ } } keys %{ $analysis };
-    }
+    seq_analyze( $record ) if $record->{ "SEQ" };
 
     Maasha::Biopieces::put_record( $record, $out );
 }
@@ -62,6 +59,66 @@ Maasha::Biopieces::close_stream( $out );
 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
 
+sub seq_analyze
+{
+    # Martin A. Hansen, July 2009.
+
+    # Analyzes the composition of the string in the record and appends
+    # the analysis to the record.
+
+    my ( $record,   # Biopiece record with a SEQ entry.
+       ) = @_;
+
+    # Returns nothing.
+
+    my ( %char_hash, @indels, @alph, $char, $gc, $at, $lc, $max, $indels );
+
+    %char_hash = Maasha::Common::str_analyze( $record->{ 'SEQ' } );
+
+    $record->{ 'SEQ_TYPE' } = Maasha::Seq::seq_guess_type( $record->{ 'SEQ' } );
+    $record->{ 'SEQ_LEN' }  = length $record->{ 'SEQ' };
+
+    @alph   = Maasha::Seq::seq_alph( $record->{ 'SEQ_TYPE' } . "_AMBI" );
+    @indels = qw( - ~ . _ );
+
+    $max = 0;
+
+    foreach $char ( @alph )
+    {
+        $char_hash{ $char } += $char_hash{ lc $char } || 0;
+
+        $record->{ "RES[$char]" } = $char_hash{ $char };
+
+        $max = $char_hash{ $char } if $char_hash{ $char } > $max;
+
+        $record->{ "RES_SUM" } += $char_hash{ $char };
+    }
+
+    $indels = 0;
+
+    map { $record->{ "RES[$_]" } = $char_hash{ $_ }; $indels += $char_hash{ $_ } } @indels;
+
+    if ( $record->{ "SEQ_TYPE" } =~ /DNA|RNA/i )
+    {
+        $gc = $char_hash{ "G" } + $char_hash{ "C" };
+        $at = $char_hash{ "A" } + $char_hash{ "T" } + $char_hash{ "U" };
+
+        $lc = 0;
+
+        map { $lc += $char_hash{ lc $_ } || 0 } @alph;
+
+        $record->{ "MIX_INDEX" }  = sprintf( "%.2f", $max / ( $record->{ "SEQ_LEN" } - $indels ) );
+        $record->{ "GC%" }        = sprintf( "%.2f", 100 * $gc / ( $record->{ "SEQ_LEN" } - $indels ) );
+        $record->{ "SOFT_MASK%" } = sprintf( "%.2f", 100 * $lc / ( $record->{ "SEQ_LEN" } - $indels ) );
+        $record->{ "HARD_MASK%" } = sprintf( "%.2f", 100 * ( $char_hash{ "n" } + $char_hash{ "N" } ) / ( $record->{ "SEQ_LEN" } - $indels ) );
+        $record->{ "MELT_TEMP" }  = sprintf( "%.2f", 4 * $gc + 2 * $at );
+    }
+}
+
+
+# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+
+
 BEGIN
 {
     Maasha::Biopieces::status_set();