2016-07-29 3 views
1

Ich möchte mich zuerst für die biologische Natur dieses Beitrags entschuldigen. Ich dachte, ich sollte zuerst einen Hintergrund veröffentlichen. Ich habe eine Reihe von Gen-Dateien, die irgendwo zwischen ein und fünf DNA-Sequenzen von verschiedenen Arten enthalten. Ich benutzte ein Bash-Shell-Skript, um blastn mit jeder Gen-Datei als Abfrage und eine Datei aller Transkriptom-Sequenzen (all_transcriptome_seq.fasta) von den fünf Arten als Subjekt durchzuführen. Ich möchte nun diese Ausgabedateien verarbeiten (und es gibt viele), so dass ich alle Subjektsequenzen, die in einer Datei pro Gen vorkommen, mit doppelten Sequenzen entfernen kann (außer um eine zu behalten), und stelle sicher, dass ich die Länge bekomme die Sequenzen, die die Abfrage tatsächlich treffen. HierÄndern von Perl-Skript, um keine Duplikate zu drucken und Sequenzen einer bestimmten Länge zu extrahieren

ist, was die blastn- Ausgabe wie für eine Gen-Datei sieht (Spalten: qseqid qlen sseqid slen qframe qstart qend sframe sstart send evalue bitscore pident nident length)

Acur_01000750.1_OFAS014956-RA-EXON04 248 Apil_comp17195_c0_seq1 1184 1 1 248 1 824 1072 2e-73 259 85.60 214 250 
Acur_01000750.1_OFAS014956-RA-EXON04 248 Atri_comp5613_c0_seq1 1067 1 2 248 1 344 96 8e-97 337 91.16 227 249 
Acur_01000750.1_OFAS014956-RA-EXON04 248 Acur_01000750.1 992 1 1 248 1 655 902 1e-133 459 100.00 248 248 
Acur_01000750.1_OFAS014956-RA-EXON04 248 Btri_comp17734_c0_seq1 1001 1 1 248 1 656 905 5e-69 244 84.40 211 250 
Btri_comp17734_c0_seq1_OFAS014956-RA-EXON04 250 Atri_comp5613_c0_seq1 1067 1 2 250 1 344 96 1e-60 217 82.33 205 249 
Btri_comp17734_c0_seq1_OFAS014956-RA-EXON04 250 Acur_01000750.1 992 1 1 250 1 655 902 5e-69 244 84.40 211 250 
Btri_comp17734_c0_seq1_OFAS014956-RA-EXON04 250 Btri_comp17734_c0_seq1 1001 1 1 250 1 656 905 1e-134 462 100.00 250 250 

ich gearbeitet habe ein Perl-Skript, das würde, kurz gesagt, nehmen Sie die sseqid Säule herausziehen die entsprechenden Sequenzen aus der all_transcriptome_seq.fasta Datei, legen Sie diese in eine neue Datei und trimmen Sie die Transkripte auf die sstart und send Positionen. Hier ist das Skript, so weit:

#!/usr/bin/env perl 

use warnings; 
use strict; 
use Data::Dumper; 

############################################################################ 
# blastn_post-processing.pl v. 1.0 by Michael F., XXXXXX 
############################################################################ 

my($progname) = $0; 

############################################################################ 
# Initialize variables 
############################################################################ 

my($jter); 

my($com); 
my($t1); 

if (@ARGV != 2) { 
    print "Usage:\n \$ $progname <infile> <transcriptomes>\n"; 
    print " infile   = tab-delimited blastn text file\n"; 
    print " transcriptomes = fasta file of all transcriptomes\n"; 
    print "exiting...\n"; 
    exit; 
} 

my($infile)=$ARGV[0]; 
my($transcriptomes)=$ARGV[1]; 

############################################################################ 
# Read the input file 
############################################################################ 
print "Reading the input file... "; 
open (my $INF, $infile) or die "Unable to open file"; 
my @data = <$INF>; 
print @data; 
close($INF) or die "Could not close file $infile.\n"; 
my($nlines) = $#data + 1; 
my($inlines) = $nlines - 1; 
print "$nlines blastn hits read\n\n"; 

############################################################################ 
# Extract hits and place sequences into new file 
############################################################################ 
my @temparray; 
my @templine; 
my($seqfname); 

open ($INF, $infile) or die "Could not open file $infile for input.\n"; 
@temparray = <$INF>; 
close($INF) or die "Could not close file $infile.\n"; 
$t1 = $#temparray + 1; 
print "$infile\t$t1\n"; 
$seqfname = "$infile" . ".fasta"; 
if (-e $seqfname) { 
     print " --> $seqfname exists. overwriting\n"; 
     unlink($seqfname); 
    } 

# iterate through the individual hits 
for ($jter=0; $jter<$t1; $jter++) { 
    (@templine) = split(/\s+/, $temparray[$jter]); 
    $com = "./extract_from_genome2 $transcriptomes $templine[2] $templine[8] $templine[9] $templine[2]"; 
    # print "$com\n"; 
    system("$com"); 
    system("cat temp.3 >> $seqfname"); 
    } # end for ($jter=0; $jter<$t1... 

# Arguments for "extract_from_genome2" 
# // argv[1] = name of genome file 
# // argv[2] = gi number for contig 
# // argv[3] = start of subsequence 
# // argv[4] = end of subsequence 
# // argv[5] = name of output sequence 

dieses Skript verwenden, hier ist die Ausgabe erhalte ich:

>Apil_comp17195_c0_seq1 
GATTCTTGCATCTGCAGTAAGACCAGAAATGCTCATTCCTATATGGCTATCTAATGGTATTATTTTTTTCTGATGTGCTGATAATTCAGACGAAGCTCTTTTAAGAGCCACAAGAACTGCATACTGCTTGTTTTTTACTCCAACAGTAGCAGCTCCCAGTTTTACAGCTTCCATTGCATATTCGACTTGGTGCAGGCGTCCCTGGGGACTCCAGACGGTAACGTCAGAATCATACTGGTTACGGAACA 
>Atri_comp5613_c0_seq1 
GAGAATTCTAGCATCAGCAGTGAGGCCTGAAATACTCATGCCTATGTGACTATCTAGAGGTATTATTTTTTTTTGATGAGCTGACAGTTCAGAAGAAGCTCTTTTGAGAGCTACAAGAACTGCATACTGTTTATTTTTTACTCCAACTGTTGCTGCTCCAAGCTTTACAGCCTCCATTGCATATTCCACTTGGTGTAAACGCCCCTGAGGACTCCATACCGTAACATCAGAATCATACTGATTACGGA 
>Acur_01000750.1 
GAATTCTAGCGTCAGCAGTGAGTCCTGAAATACTCATCCCTATGTGGCTATCTAGAGGTATTATTTTTTCTGATGGGCCGACAGTTCAGAGGATGCTCTTTTAAGAGCCACAAGAACTGCATACTCTTTATTTTTACTCCAACAGTAGCAGCTCCAAGCTTCACAGCCTCCATTGCATATTCCACCTGGTGTAAACGTCCCTGAGGGCTCCATACCGTAACATCAGAATCATACTGGTTACGGAACA 
>Btri_comp17734_c0_seq1 
GAATCCTTGCATCTGCAGTAAGTCCAGAAATGCTCATTCCAATATGGCTATCTAATGGTATTATTTTTTTCTGGTGAGCAGACAATTCAGATGATGCTCTTTTAAGAGCTACCAGTACTGCAAAATCATTGTTCTTCACTCCAACAGTTGCAGCACCTAATTTGACTGCCTCCATTGCATACTCCACTTGGTGCAATCTTCCCTGAGGGCTCCATACCGTAACATCAGAATCATACTGGTTACGGAACA 
>Atri_comp5613_c0_seq1 
GAGAATTCTAGCATCAGCAGTGAGGCCTGAAATACTCATGCCTATGTGACTATCTAGAGGTATTATTTTTTTTTGATGAGCTGACAGTTCAGAAGAAGCTCTTTTGAGAGCTACAAGAACTGCATACTGTTTATTTTTTACTCCAACTGTTGCTGCTCCAAGCTTTACAGCCTCCATTGCATATTCCACTTGGTGTAAACGCCCCTGAGGACTCCATACCGTAACATCAGAATCATACTGATTACGGA 
>Acur_01000750.1 
GAATTCTAGCGTCAGCAGTGAGTCCTGAAATACTCATCCCTATGTGGCTATCTAGAGGTATTATTTTTTCTGATGGGCCGACAGTTCAGAGGATGCTCTTTTAAGAGCCACAAGAACTGCATACTCTTTATTTTTACTCCAACAGTAGCAGCTCCAAGCTTCACAGCCTCCATTGCATATTCCACCTGGTGTAAACGTCCCTGAGGGCTCCATACCGTAACATCAGAATCATACTGGTTACGGAACA 
>Btri_comp17734_c0_seq1 
GAATCCTTGCATCTGCAGTAAGTCCAGAAATGCTCATTCCAATATGGCTATCTAATGGTATTATTTTTTTCTGGTGAGCAGACAATTCAGATGATGCTCTTTTAAGAGCTACCAGTACTGCAAAATCATTGTTCTTCACTCCAACAGTTGCAGCACCTAATTTGACTGCCTCCATTGCATACTCCACTTGGTGCAATCTTCCCTGAGGGCTCCATACCGTAACATCAGAATCATACTGGTTACGGAACA 

Wie Sie sehen können, ist es ziemlich nah an, was ich will. Hier sind die zwei Probleme, die ich habe, und ich kann nicht herausfinden, wie ich mit meinem Skript vorgehen soll. Die erste ist, dass eine Sequenz mehr als einmal in der sseqid Spalte auftreten kann, und mit dem Skript in seiner aktuellen Form wird es Duplikate dieser Sequenzen ausdrucken. Ich brauche nur einen. Wie kann ich mein Skript so ändern, dass Sequenzen nicht dupliziert werden (d. H. Wie behalte ich nur eins, aber entferne die anderen Duplikate)? Erwartete Ausgabe:

>Apil_comp17195_c0_seq1 
GATTCTTGCATCTGCAGTAAGACCAGAAATGCTCATTCCTATATGGCTATCTAATGGTATTATTTTTTTCTGATGTGCTGATAATTCAGACGAAGCTCTTTTAAGAGCCACAAGAACTGCATACTGCTTGTTTTTTACTCCAACAGTAGCAGCTCCCAGTTTTACAGCTTCCATTGCATATTCGACTTGGTGCAGGCGTCCCTGGGGACTCCAGACGGTAACGTCAGAATCATACTGGTTACGGAACA 
>Atri_comp5613_c0_seq1 
GAGAATTCTAGCATCAGCAGTGAGGCCTGAAATACTCATGCCTATGTGACTATCTAGAGGTATTATTTTTTTTTGATGAGCTGACAGTTCAGAAGAAGCTCTTTTGAGAGCTACAAGAACTGCATACTGTTTATTTTTTACTCCAACTGTTGCTGCTCCAAGCTTTACAGCCTCCATTGCATATTCCACTTGGTGTAAACGCCCCTGAGGACTCCATACCGTAACATCAGAATCATACTGATTACGGA 
>Acur_01000750.1 
GAATTCTAGCGTCAGCAGTGAGTCCTGAAATACTCATCCCTATGTGGCTATCTAGAGGTATTATTTTTTCTGATGGGCCGACAGTTCAGAGGATGCTCTTTTAAGAGCCACAAGAACTGCATACTCTTTATTTTTACTCCAACAGTAGCAGCTCCAAGCTTCACAGCCTCCATTGCATATTCCACCTGGTGTAAACGTCCCTGAGGGCTCCATACCGTAACATCAGAATCATACTGGTTACGGAACA 
>Btri_comp17734_c0_seq1 
GAATCCTTGCATCTGCAGTAAGTCCAGAAATGCTCATTCCAATATGGCTATCTAATGGTATTATTTTTTTCTGGTGAGCAGACAATTCAGATGATGCTCTTTTAAGAGCTACCAGTACTGCAAAATCATTGTTCTTCACTCCAACAGTTGCAGCACCTAATTTGACTGCCTCCATTGCATACTCCACTTGGTGCAATCTTCCCTGAGGGCTCCATACCGTAACATCAGAATCATACTGGTTACGGAACA 

Die zweiten ist das Skript nicht ganz die richtigen Basenpaare zu extrahieren. Es ist sehr nah, ein oder zwei, aber es ist nicht genau.

Nehmen Sie zum Beispiel den ersten Betrefftreffer Apil_comp17195_c0_seq1. Die Werte sstart und send sind 824 bzw. 1072. Als ich in die all_transcriptome_seq.fasta gehen, bekomme ich

AAGATTCTTGCATCTGCAGTAAGACCAGAAATGCTCATTCCTATATGGCTATCTAATGGTATTATTTTTTTCTGATGTGCTGATAATTCAGACGAAGCTCTTTTAAGAGCCACAAGAACTGCATACTGCTTGTTTTTTACTCCAACAGTAGCAGCTCCCAGTTTTACAGCTTCCATTGCATATTCGACTTGGTGCAGGCGTCCCTGGGGACTCCAGACGGTAACGTCAGAATCATACTGGTTACGGAAC 

in diesem Bereich Basenpaar, nicht

GATTCTTGCATCTGCAGTAAGACCAGAAATGCTCATTCCTATATGGCTATCTAATGGTATTATTTTTTTCTGATGTGCTGATAATTCAGACGAAGCTCTTTTAAGAGCCACAAGAACTGCATACTGCTTGTTTTTTACTCCAACAGTAGCAGCTCCCAGTTTTACAGCTTCCATTGCATATTCGACTTGGTGCAGGCGTCCCTGGGGACTCCAGACGGTAACGTCAGAATCATACTGGTTACGGAACA 

wie durch meinen Skript ausgegeben, das ist das, was ich erwarte. Sie werden auch bemerken, dass die von meinem Skript ausgegebene Sequenz etwas kürzer ist, als es sein sollte. Weiß jemand, wie ich diese Probleme in meinem Skript beheben kann?

Danke, und Entschuldigung für die lange Post!

Edit 1: eine Lösung wurde angeboten, die für einige der infiles funktioniert. Einige führten jedoch dazu, dass das Skript weniger Sequenzen als erwartet ausgab. Hier ist eine solche Infile mit 9 Hits, von denen ich nur 4 Sequenzen erwartet habe.

Hinweis: dieses Problem weitgehend gelöst wurde basierend auf der Lösung unter dem Antwortabschnitt

Apil_comp16418_c0_seq1_OFAS000119-RA-EXON01 1587 Apil_comp16418_c0_seq1 2079 1 1 1587 1 416 2002 0.0 2931 100.00 1587 1587 
Apil_comp16418_c0_seq1_OFAS000119-RA-EXON01 1587 Atri_comp13712_c0_seq1 1938 1 1 1587 1 1651 75 0.0 1221 80.73 1286 1593 
Apil_comp16418_c0_seq1_OFAS000119-RA-EXON01 1587 Ctom_01003023.1 2162 1 1 1406 1 1403 1 0.0 1430 85.07 1197 1407 
Atri_comp13712_c0_seq1_OFAS000119-RA-EXON01 1441 Apil_comp16418_c0_seq1 2079 1 1 1437 1 1866 430 0.0 1170 81.43 1175 1443 
Atri_comp13712_c0_seq1_OFAS000119-RA-EXON01 1441 Atri_comp13712_c0_seq1 1938 1 1 1441 1 201 1641 0.0 2662 100.00 1441 1441 
Atri_comp13712_c0_seq1_OFAS000119-RA-EXON01 1441 Acur_01000228.1 2415 1 1 1440 1 2231 797 0.0 1906 90.62 1305 1440 
Ctom_01003023.1_OFAS000119-RA-EXON01 1289 Apil_comp16418_c0_seq1 2079 1 3 1284 1 1714 430 0.0 1351 85.69 1102 1286 
Ctom_01003023.1_OFAS000119-RA-EXON01 1289 Acur_01000228.1 2415 1 1 1287 1 2084 797 0.0 1219 83.81 1082 1291 
Ctom_01003023.1_OFAS000119-RA-EXON01 1289 Ctom_01003023.1 2162 1 1 1289 1 106 1394 0.0 2381 100.00 1289 1289 

Edit 2: Es gibt immer noch eine gelegentliche Ausgabe weniger Sequenzen als erwartet fehlt, die aber nicht als viele nach dem Einbau von Änderungen an meinem Skript von Edit 1 Vorschlag (dh Abrechnung für die umgekehrte Richtung). Ich kann nicht herausfinden, warum das Skript in diesen anderen Fällen weniger Sequenzen ausgeben würde. Unterhalb der fraglichen Infile. Der Ausgang fehltBtri_comp15171_c0_seq1:

Apil_comp19456_c0_seq1_OFAS000248-RA-EXON07 2464 Apil_comp19456_c0_seq1 3549 1 1 2464 1 761 3224 0.0 4551 100.00 2464 2464 
Apil_comp19456_c0_seq1_OFAS000248-RA-EXON07 2464 Btri_comp15171_c0_seq1 3766 1 1 2456 1 3046 591 0.0 1877 80.53 1985 2465 
Btri_comp15171_c0_seq1_OFAS000248-RA-EXON07 2457 Apil_comp19456_c0_seq1 3549 1 1 2457 1 3214 758 0.0 1879 80.54 1986 2466 
Btri_comp15171_c0_seq1_OFAS000248-RA-EXON07 2457 Atri_comp28646_c0_seq1 1403 1 1256 2454 1 1401 203 0.0 990 81.60 980 1201 
Btri_comp15171_c0_seq1_OFAS000248-RA-EXON07 2457 Btri_comp15171_c0_seq1 3766 1 1 2457 1 593 3049 0.0 4538 100.00 2457 2457 
+0

Bitte bearbeiten Sie Ihre Frage und fügen Sie die erwartete Ausgabe für das erste Problem hinzu. Der zweite scheint es zu haben. Vielleicht möchten Sie auch diese beiden mit mehr Absätzen und vielleicht Überschriften trennen. – simbabque

+0

das ist Ihr inifile – ssr1012

+0

@simbabque, machte es klarer –

Antwort

1

Sie Hash verwenden können, um Duplikate zu entfernen

Der Balg Code Duplikate entfernen auf ihrem Fach je nach Länge (halte größere Thema Länge Zeilen).

aktualisieren Sie Ihre # durchlaufen die einzelnen Teil mit

# iterate through the individual hits 
my %filterhash; 
my $subject_length; 
for ($jter=0; $jter<$t1; $jter++) { 
    (@templine) = split(/\s+/, $temparray[$jter]); 
     $subject_length = $templine[9] -$templine[8]; 
     if(exists $filterhash{$templine[2]}){ 
       if($filterhash{$templine[2]} < $subject_length){ 

         $filterhash{$templine[2]}= $subject_length; 
       } 
     } 
     else{ 
       $filterhash{$templine[2]}= $subject_length; 
     } 
    } 
my %printhash; 
for ($jter=0; $jter<$t1; $jter++) { 
    (@templine) = split(/\s+/, $temparray[$jter]); 
     $subject_length = $templine[9] -$templine[8]; 
     if(not exists $printhash{$templine[2]}) 
     { 
      $printhash{$templine[2]}=1; 
      if(exists $filterhash{$templine[2]} and $filterhash{$templine[2]} == $subject_length){ 

        $com = "./extract_from_genome2 $transcriptomes $templine[2] $templine[8] $templine[9] $templine[2]"; 
        # print "$com\n"; 
        system("$com"); 
        system("cat temp.3 >> $seqfname"); 
      } 
     } 
     else{ 
      if(exists $filterhash{$templine[2]} and $filterhash{$templine[2]} == $subject_length){ 

        $com = "./extract_from_genome2 $transcriptomes $templine[2] $templine[8] $templine[9] $templine[2]"; 
        #print "$com\n"; 
        system("$com"); 
        system("cat temp.3 >> $seqfname"); 
      } 
     } 

    } # end for ($jter=0; $jter<$t1... 

Hoffnung trifft diese Ihnen helfen.

Editierteil Update

für negative Haltung müssen Sie

$subject_length = $templine[9] -$templine[8]; 

mit

if($templine[8] > $templine[9]){ 
       $subject_length = $templine[8] -$templine[9]; 
     }else{ 
       $subject_length = $templine[9] -$templine[8]; 
     } 

Sie benötigen extract_from_genome2 Code für Negativstrang-Sequenzen zu aktualisieren, auch ersetzen.

+0

danke für die Bereitstellung dieses. Ich habe versucht, das Skript mit der Änderung ausgeführt und erhielt die folgenden Fehler: 'Bareword" subject_length "nicht zulässig, während" strikte Subs "bei test.pl Zeile 73. Bareword" subject_length "nicht erlaubt, während" strikte Subs "bei verwendet wird test.pl Zeile 81. Die relevanten Zeilen sind 'if (exists $ filterhash {$ templine [2]} und $ filterhash {$ templine [2]}

+0

Ich vermisste $ symbol in subject_length und ich korrigierte es können Sie jetzt überprüfen – Arijit

+0

Ok, ich habe es erneut versucht, aber jetzt produziert es keine Ausgabe Datei. Ich habe nur die ** # iterate durch die einzelnen Treffer ** Teil meines Skripts aktualisiert –

Verwandte Themen