Mercurial > repos > big-tiandm > mirplant2
comparison collapseReads2Tags.pl @ 26:c90e7d84d521 draft
Uploaded
author | big-tiandm |
---|---|
date | Thu, 31 Jul 2014 03:03:37 -0400 |
parents | ea2fdf667620 |
children |
comparison
equal
deleted
inserted
replaced
25:10df3c84d54a | 26:c90e7d84d521 |
---|---|
1 #!/usr/bin/perl -w | |
2 #Filename: | |
3 #Author: Tian Dongmei | |
4 #Email: tiandm@big.ac.cn | |
5 #Date: 2014-3-20 | |
6 #Modified: | |
7 #Description: fastq file form reads cluster(the same sequence in the same cluster) | |
8 my $version=1.00; | |
9 | |
10 use strict; | |
11 use Getopt::Long; | |
12 | |
13 my %opts; | |
14 GetOptions(\%opts,"i:s@","format=s","mark:s","qual:s","qv:i","o=s","h"); | |
15 if (!(defined $opts{o} and defined $opts{'format'}) || defined $opts{h}) { #necessary arguments | |
16 &usage; | |
17 } | |
18 my @filein=@{$opts{i}} if(defined $opts{i}); | |
19 my $name=defined $opts{'mark'} ? $opts{'mark'} : "seq"; | |
20 my $fileout=$opts{'o'}; | |
21 my $pq=defined $opts{'qv'} ? $opts{'qv'} : 33; | |
22 my %hash;##分块存放原始序列 | |
23 | |
24 my $format=$opts{'format'}; | |
25 if ($format ne "fastq" && $format ne "fq" && $format ne "fasta" && $format ne "fa") { | |
26 die "Parameter -format is error!\n"; | |
27 } | |
28 | |
29 my ($qualT,$qualV); | |
30 if (defined $opts{'qual'} && ($format eq "fastq" || $format eq "fq")) { #quality filter | |
31 my @temp=split /:/,$opts{'qual'}; | |
32 $qualT=$temp[0]; | |
33 $qualV=$temp[1]; | |
34 | |
35 for (my $i=0;$i<@filein;$i++) { | |
36 open IN,"<$filein[$i]"; | |
37 while (my $aline=<IN>) { | |
38 my $seq=<IN>; | |
39 my $n=<IN>; | |
40 my $qv=<IN>; | |
41 my $tag=&qvcheck($qv,$qualT,$qualV); | |
42 next if(!$tag); | |
43 my $str=substr($seq,0,6); | |
44 $hash{$str}[$i].=$seq; | |
45 } | |
46 close IN; | |
47 } | |
48 } | |
49 elsif($format eq "fastq" || $format eq "fq"){ ### do not filter low quality reads | |
50 for (my $i=0;$i<@filein;$i++) { | |
51 open IN,"<$filein[$i]"; | |
52 while (my $aline=<IN>) { | |
53 my $seq=<IN>; | |
54 my $n=<IN>; | |
55 my $qv=<IN>; | |
56 my $str=substr($seq,0,6); | |
57 $hash{$str}[$i].=$seq; | |
58 } | |
59 close IN; | |
60 } | |
61 | |
62 } | |
63 elsif($format eq "fasta" || $format eq "fa"){ | |
64 for (my $i=0;$i<@filein;$i++) { | |
65 open IN,"<$filein[$i]"; | |
66 while (my $aline=<IN>) { | |
67 my $seq=<IN>; | |
68 my $str=substr($seq,0,6); | |
69 $hash{$str}[$i].=$seq; | |
70 } | |
71 close IN; | |
72 } | |
73 } | |
74 | |
75 open OUT,">$fileout"; #output file | |
76 my $count=0; | |
77 foreach my $key (keys %hash) { | |
78 my %cluster; | |
79 for (my $i=0;$i<@filein;$i++) { | |
80 next if(!(defined $hash{$key}[$i])); | |
81 my @tmp=split/\n/,$hash{$key}[$i]; | |
82 foreach (@tmp) { | |
83 $cluster{$_}[$i]++; | |
84 } | |
85 } | |
86 | |
87 foreach my $seq (keys %cluster) { | |
88 my $exp=""; my $ee=0; | |
89 for (my $i=0;$i<@filein;$i++) { | |
90 if (defined $cluster{$seq}[$i]) { | |
91 $exp.="_$cluster{$seq}[$i]"; | |
92 $ee+=$cluster{$seq}[$i]; | |
93 }else{ | |
94 $exp.="_0"; | |
95 } | |
96 } | |
97 $count+=$ee; | |
98 $exp=~s/^_//; | |
99 print OUT ">$name","_$count:$exp","_x$ee\n$seq\n"; | |
100 } | |
101 } | |
102 close OUT; | |
103 | |
104 | |
105 sub qvcheck{ | |
106 my ($str,$t,$v)=@_; | |
107 my $qv=0; | |
108 if($t eq "mean"){ | |
109 $qv=&getMeanQuality($str); | |
110 } | |
111 elsif($t eq "min"){ | |
112 $qv=&getMinQuality($str); | |
113 } | |
114 if ($qv<$v) { | |
115 return 0; | |
116 } | |
117 return 1; | |
118 } | |
119 | |
120 sub getMeanQuality(){ | |
121 chomp $_[0]; | |
122 my @bases = split(//,$_[0]); | |
123 my $sum = 0; | |
124 for(my $i = 0; $i <= $#bases; $i++){ | |
125 my $num = ord($bases[$i]) - $pq; | |
126 $sum += $num; | |
127 } | |
128 | |
129 return $sum/($#bases+1); | |
130 | |
131 } | |
132 | |
133 ### | |
134 ### This function gives back the Q-value of the worst base | |
135 sub getMinQuality(){ | |
136 chomp $_[0]; | |
137 my @bases = split(//,$_[0]); | |
138 my $worst = 1000; | |
139 for(my $i = 0; $i <= $#bases; $i++){ | |
140 # printf ("base: $bases[$i] --> %d\n",ord($bases[$i])); | |
141 my $num = ord($bases[$i]) - $pq; | |
142 if($num < $worst){ | |
143 $worst = $num; | |
144 } | |
145 } | |
146 return $worst; | |
147 } | |
148 | |
149 sub usage{ | |
150 print <<"USAGE"; | |
151 Version $version | |
152 Usage: | |
153 $0 -i -format -mark -qual -qv -o | |
154 options: | |
155 -i input file#fastq file ##can be multiple -i file1 -i file2 ... | |
156 -mark string#quary name,default is "seq" | |
157 -o output file | |
158 -format string # fastq|fasta|fq|fa | |
159 | |
160 -qual #reads filter | |
161 eg:(min:value/mean:value) | |
162 This parameter just for solexa reads. | |
163 If the input files are solid and needs filter,please do filter first . | |
164 | |
165 -qv integer #Phred quality64/33,default 33 | |
166 -h help | |
167 USAGE | |
168 exit(1); | |
169 } | |
170 |