Как найти подходящие последовательности fastta в мультифакторных файлах и добавить вывод в другой файл? - PullRequest
0 голосов
/ 13 марта 2019

У меня есть три файла фаста.Файл1 org_seqs.fasta

>OAJ152.7_org_name
GDPQGLTGSHNFIEADSSNTRDDLYVTGNNYALNMEKFMSWYNMSVDGTFDMNLMAKRAKLRFEETIQTNPNFYYGPVTGLIARNAGYIFPGRLFRNHSLENPEGILTKSHIRHFYGIYGEEHDKRFLFDSMASPIDVTGEHEFQPPNLAGGDQRGPCPGLNALANHGYIPRNGVVSFRKVIAAINEVYGMGIDLATVLAIMGTVWTGDPLSLDPGFSIGDRDTGVNNILGNLGGLLLCFVFEVLKFASPNALASLYSTLAEPLDFVGNALSVPLLNVTCPALQDLQMGGKPFWEAIQNDFPGA
>FGT15428_org_name
SSLTRNDLYVTGNAWTMNTTLFWDFHDRADENGVLSMDLLADQAARRWNDSVSTNPAFWYGPVTGMVARNAAMFFLGRLLSNHTAEHPEGILTQDIFRKFFAVYTIPANWYRKPVEYGLVPLNLDIVSWIMKHPVLGSIGGNTGTVNSFSGLDMHNITGGVTKPIEITGRHAFKAPGRFDQRGPCPGLNALANHGYISRDGITSFAEVVTAVNQVLGMGIETALILGAMGTVWTGNPLSLNPGFSIGGAANGPDNILGNVLGLLGDLRGLQGSHNWIEAD
>EGS1524_Org_name
NAGYIFPGRFFRNYSAENPEGVLTKEIVKNFFAVYGEDGNLTYKEGWERIPENWYRMPVDYTLVQLNLDLLDFGLKYPELLSIGGNTGTVNSFTGVDIANLTEKRSLLEPTSSPIDISGEHSFQPPDFSNGDQRGPCPGLNALANHGYIPRNGVVTMADVIPAINQVYGDLMAKRAKIRFEESIATNPNFYYSTILAVMGTVFVGDVLSLAPGFSIGGFSPAVQNILGNLEGLLGEPRGLNGSHNIIEADSSNTRDDLYVTGDNTRLNLTQFIEWYQMADQDgnnGTFSMGPFTGAIAR

Файл2 single_seqs.fasta

>OAJ152.7_org_name
GDPQGLTGSHNFIEADSSNTRDDLYVTGNNYALNMEKFMSWYNMSVDGTFDMNLMAKRAKLRFEETIQTNPNFYYGPVTGLIARNAGYIFPGRLFRNHSLENPEGILTKSHIRHFYGIYGEEHDKRFLFDSMASPIDVTGEHEFQPPNLAGGDQRGPCPGLNALANHGYIPRNGVVSFRKVIAAINEVYGMGIDLATVLAIMGTVWTGDPLSLDPGFSIGDRDTGVNNILGNLGGLLLCFVFEVLKFASPNALASLYSTLAEPLDFVGNALSVPLLNVTCPALQDLQMGGKPFWEAIQNDFPGA
>FGT15428_org_name
LNALANHTQDIFRKFFAVYTIPANWYRKPVEYGLVPLNLDIVSWIMKHPVLGSIGGNTGTVNSFSGLDMHNITGGVTKPIEITGRHAFKAPGRFDQRGPCPGLNALANHGYISLTRNDLYVTGNAWTMNTTLFWDFHDRADENGVLSMDLLADQAARRWNDSVSTNPAFWYGPVTGMVARNAAMFFLGRLLSNHTAEHPEGILTQDIFRKFFAVYTI
>TGH4853.21_org_nam
PNFYYGPFTGMIARNAGYFFACRLLSNHTVGSTEDIMDRETLKSFFAVHEKDGKLVYKRGWERIPENWYRRSIDYGLISLNLDLLNLITKYPELGSIGGNMGRSHDKRLSLGLASKPIKVTGEHEFIPPNFEKGDQRGPCPGLNALANHGYISRKGVTSLVEV

Файл3 var_seqs.fasta

>OAJ152.7_org_name
GDPQGLTGSHNFIEADSSNTRDDLYVTGNNYALNMEKFMSWYNMSVDGTFDMNLMAKRAKLRFEETIQTNPNFYYGPVTGLIARNAGYIFPGRLFRNHSLENPEGILTKSHIRHFYGIYGEEHDKRFLFDSMASPIDVTGEHEFQPPNLAGGDQRGPCPGLNALANHGYIPRNGVVSFRKVIAA
>OAJ152.7_org_name
INEVYGMGIDLATVLAIMGTVWTGDPLSLDPGFSIGDRDTGVNNILGNLGGLLLCFVFEVLKFASPNALASLYSTLAEPLDFVGNALSVPLLNVTCPALQDLQMGGKPFWEAIQNDFPGA
>FGT15428_org_name
LNALANHGYISLTRNDLYVTGNAWTMNTTLFWDFHDRADENGVLSMDLLADQAARRWNDSVSTNPAFWYGPVTGMVARNAAMFFLGRLLSNHTAEHPEGILTLNALANHTQDIFRKFFAVYTIPANWYRKPVEYGLVPLNLDIVSWIMKHPVLGSIGGNTGTVNSFSGLDMHNITGGVTKPIEITGRHAFKAPGRFDQRGPCPG

Я хочу написать программу, которая сопоставляет каждую последовательность из файла file1 в файл file2 и file3 на основе следующих условий: Если заголовок fasta из файла file1 совпадает с файлом file2, то совпадает первые четыре и последние четыре их последовательностибуквы и длина, если они все совпадают, то откройте четвертый файл «copy.fasta» и добавьте в него этот заголовок и seq.Если единственный заголовок не совпадает с последовательностью, то перейдите в файл3, найдите то же самое, если условие истинно, добавьте снова в файл4, иначе откройте другой файл "var.fasta" и добавьте в него.Если заголовок fasta из file1 вообще не совпадает в file2, тогда добавьте в "single.fasta".

Я пробовал следующий скрипт, но он не работает, я не могу понять, как сохранить совпадениепоследовательности из разных файлов в хеш и используйте эти последовательности.

#! /usr/bin/perl
use warnings;
use strict 'vars';

my $file1 = "org_seqs.fasta";
my $file2 = "single_seqs.fasta";
my $file3 = "var_seqs.fasta";
my $file4 = open( COPYF, ">>", "copy.fasta" ) or die $!;
my $file5 = open( VARF, ">>", "vars.fasta") or die $!;
my $file6 = open( SINGLEF, ">>", "single.fasta") or die $!;


my %seq1 = %{ read_fasta_as_hash( $file1 ) };
my $id1 = shift;

my %seq2 = %{ read_fasta_as_hash( $file2 ) };
my $id2 = shift;

my %seq3 = %{ read_fasta_as_hash( $file3 ) };
my $id3 = shift;

my ($match, $seen);

foreach my $seq1(%seq1){

    foreach my $seq2(%seq2){

        foreach my $seq3(%seq3){

            if( $id1 eq $id2 ){

                $match = $1;
                my $len1 = length($seq1{$id1});
                my $len2 = length($seq2{$id2});
                my $first = substr $seq1, 4;    #extract first 4 characters
                my $last = substr $seq1, -4;    #extract last 4 characters

                if(( $seq2{$id2} =~ m/^($first)(.*)($last)$/ ) && ( $len2 == $len1 )){

                    $seen = $1;
                    print COPYF $id1, "\n", $seq1{$id1}, "\n";
                }
                else{

                    open( F3, "<", $file3 ) or die $!;
                    if ($match){

                        my $len3 = length($seq3{$id3});
                        print COPYF $id1, "\n", $seq1{$id1}, "\n" if(( $seq3{$id3} =~ m/^($first)(.*)($last)$/ ) && ( $len3 == $len1 ));
                    }
                    else{

                        print VARF $id1, "\n", $seq1{$id1}, "\n";
                    }
                }   
            }
            else{

                print SINGLEF $id1, "\n", $seq1{$id1}, "\n";
            }
        }
    }
}


close(COPYF);
close(VARF);
close(SINGLEF);


sub read_fasta_as_hash {

    my $file = shift;
    my $id = '';
    my $seq = ();
    my %seq;
    open FH, "$file" or die $!;
    while(my $line = <FH>){

        chomp $line;
        if ($line =~ /^>(.*)/){

            $id = $1;
        }
        else{

            $seq{$id} .= $line;
        }
    }
    close(FH);
    return \%seq;
}

exit;

Ошибка, которую я получаю:

Use of uninitialized value $id1 in print at fasta_match.pl line 53.
Use of uninitialized value in print at fasta_match.pl line 53.
Use of uninitialized value $id2 in regexp compilation at fasta_match.pl line 30.
Use of uninitialized value $id1 in pattern match (m//) at fasta_match.pl line 30.
Use of uninitialized value $id1 in hash element at fasta_match.pl line 33.
Use of uninitialized value $id2 in hash element at fasta_match.pl line 34.
Use of uninitialized value $id2 in hash element at fasta_match.pl line 34.

Пожалуйста, помогите мне исправить этот скрипт.Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...