2010-12-01 7 views
3

Unten ist der Code, den ich für die Suche nach einer FASTA-Datei habe, die in der Befehlszeile für ein benutzerdefiniertes Motiv eingegeben wurde. Wenn ich es ausführe und ein Motiv einfüge, von dem ich weiß, dass es sich in der Datei befindet, wird "Motiv nicht gefunden" zurückgegeben. Ich bin nur ein Anfänger in Perl, und ich kann mir nicht vorstellen, wie man das gedruckte Motiv findet, geschweige denn die Titelzeile zurückgibt. Ich würde jede mögliche Hilfe bei der Lösung dieses Problems schätzen.FASTA-Datei für Motiv suchen und Titelzeile für jede Sequenz zurückgeben, die das Motiv enthält

Danke.

use warnings; 
use strict; 


my $motif; 
my $filename; 
my @seq; 
#my $motif_found; 
my $scalar; 

$filename = $ARGV[0]; 

open (DNAFILE,$filename) || die "Cannot open file\n"; 
@seq = split(/[>]/, $filename); 
print "Enter a motif to search for; "; 

$motif = <STDIN>; 

chomp $motif; 
foreach $scalar(@seq) { 
    if ($scalar =~ m/$motif/ig) { 
     print "Motif found in following sequences\n"; 
     print $scalar; 
    } else { 
     print "Motif was not found\n"; 
    } 
} 
close DNAFILE; 
+1

Bitte schreiben Sie keine Kommentare, die beschreiben, was eine einzelne Zeile Code tut. Sie fügen nichts hinzu. –

+1

Behandelt dies Fasta-Dateien, in denen die DNA-Sequenz über mehrere Zeilen aufgeteilt ist? Ich würde empfehlen, den Fasta-Parser von BioPerl zu verwenden. –

Antwort

1

Sie versuchen, aus dem Dateinamen zu lesen, nicht die Datei-Handle.

ersetzen

@seq = split(/[>]/, $filename); 

von

@seq = <DNAFILE> 

(oder es teilen, wenn Sie brauchen, um - ich weiß nicht, was Ihre Split/[>]/soll, zu tun: Es gibt keine Zeigen Sie, indem Sie ein einzelnes Zeichen in []) setzen.

2

Es macht keinen Sinn, den Fasta-Parser zu "rollen". BioPerl hat Jahre damit verbracht, eine zu entwickeln, und es wäre albern, sie nicht zu benutzen.

use strict; 
use Bio::SeqIO; 

my $usage = "perl dnamotif.pl <fasta file> <motif>"; 
my $fasta_filename = shift(@ARGV) or die("Usage: $usage $!"); 
my $motif = shift(@ARGV) or die("Usage: $usage $!"); 

my $fasta_parser = Bio::SeqIO->new(-file => $fasta_filename, -format => 'Fasta'); 
while(my $seq_obj = $fasta_parser->next_seq()) 
{ 
    printf("Searching sequence '%s'...", $seq_obj->id); 
    if((my $pos = index($seq_obj->seq(), $motif)) != -1) 
    { 
    printf("motif found at position %d!\n", $pos + 1); 
    } 
    else 
    { 
    printf("motif not found.\n"); 
    } 
} 

Dieses Programm findet nur die (Basis 1) Position des ersten in jedem Sequenzmotiv Spiels. Es kann leicht bearbeitet werden, um die Position jedes Spiels zu finden. Es kann auch Dinge nicht genau in dem Format drucken, das Sie wollen/brauchen. Ich werde diese Fragen als "eine Übung für den Leser" hinterlassen. :)

Wenn Sie BioPerl herunterladen müssen, versuchen Sie this link. Lassen Sie es mich wissen, wenn Sie Probleme haben.

Für Bioinformatik Fragen wie diese habe ich das BioStar Forum sehr hilfreich gefunden.