在对之前的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;