首页 > 代码库 > primer漏配问题解决

primer漏配问题解决

在对之前的ITS数据(454数据)做split时,发现有一些reads没有被匹配上,但是barcode能够完全匹配,虽然之后的primer在中间漏了一个碱基,导致后面的碱基全部误匹配,从而导致这条reads没有被匹配上的问题。

终于解决Qiime的问题后,使用 split_libraries.py 做切分,发现同样有这样的问题,Qiime并没有解决漏匹配的问题。

考虑如果用正常方法去做的话,对较小的异常数据需要花费N倍于正常数据的计算资源(包括硬件资源和运行时间),对于这个问题来说是非常不明智的。

由于primer长度在20左右,我的解决办法是,取末端6个碱基,在reads的这6个碱基相应位置左移1-2位,作为漏匹配1-2位的替代处理,这样既解决了漏匹配的问题,而且还能够使原正常的数据匹配速度进一步加快。

 1 #!/usr/bin/perl 2 use strict; 3  4 my $usage = "usage:\nsplit.pl\tmapfile\t.fa_file\toutprefix\n"; 5 die $usage unless @ARGV==3; 6  7 my $mapfile = shift @ARGV; 8 my $fafile = shift @ARGV; 9 my $outprefix = shift @ARGV;10 11 my %barcode;my $barcode_length = 0;12 my %primer;my $primer_length = 0;13 open MAP,$mapfile or die $!;14 while(<MAP>){15     chomp;16     next if /^#/;17     my @a = split /\s+/;18     $barcode{$a[0]} = $a[1];19     $barcode_length = length($a[1]) unless $barcode_length;20     die "barcode length do not match!" unless ($barcode_length == length($a[1]));21     $primer{$a[0]} = $a[2];22     $primer_length = length($a[2]) unless $primer_length;23     die "primer length do not match!" unless ($primer_length == length($a[2]));24 25     print "$barcode_length\t$primer_length\n";26 }27 close MAP;28 29 my %fa;30 open FA,$fafile or die $!;31 $/ = ">";32 <FA>;33 while(<FA>){34     chomp;35     my @a = split /\n/;36     my $id = shift @a;37     my $seq = join ("",@a);38     @a = split (/\s+/,$id);39     $id = shift @a;40     $fa{$id} = $seq;41 }42 $/ = "\n";43 close FA;44 45 open OUT,">$outprefix.fna" or die $!;46 foreach my $id (sort keys %fa){47     foreach my $sample (sort keys %barcode){48         my $seq = substr($fa{$id},0,$barcode_length);# print "$seq\n";49         if ($barcode{$sample} eq $seq){50     #        print "barcode matched\n";51             my $pri0 = substr($fa{$id},$barcode_length+$primer_length-6,6);52             my $pri1 = substr($fa{$id},$barcode_length+$primer_length-7,6);53             my $pri2 = substr($fa{$id},$barcode_length+$primer_length-8,6);54             my $pri = substr($primer{$sample},$primer_length-6,6);55             if ($pri0 eq $pri){56                 my $s = substr($fa{$id},$barcode_length+$primer_length,length($fa{$id})-$barcode_length-$primer_length);57                 print OUT ">$sample\t$id\n$s\n";58                 last;59             }60             if($pri1 eq $pri){61                 62                 my $s = substr($fa{$id},$barcode_length+$primer_length-1,length($fa{$id})-$barcode_length-$primer_length+1);63                 print OUT ">$sample\t$id\n$s\n";64                 last;65             }66             if($pri2 eq $pri){67                 my $s = substr($fa{$id},$barcode_length+$primer_length-2,length($fa{$id})-$barcode_length-$primer_length+2);68                 print OUT ">$sample\t$id\n$s\n";69                 last; 70             }71         } 72     }73 }74 close OUT;

 

primer漏配问题解决