#!/usr/bin/perl -w
use strict;
use warnings;
use Getopt::Long;

my %opts;
my ($N,$Q,$SD,$Help);
GetOptions(\%opts,"n:s"=>\$N,"q:i"=>\$Q,"sd:s"=>\$SD,"help"=>\$Help);
die "perl $0 <IN:input fastq> [-n 0.5] [-q 20] [-sd 10] [> OUT: output fastq]Author: BENM <binxiaofeng\@gmail.com>\n" if ((@ARGV==0)||($Help));

$N ||= 0.5;
$Q ||= 20;
$SD ||= 10;

while(<>) #@
{
	my $name=$_;
	$_=<>; #seq
	chomp;
	my $seq=$_;
	my $tmp=$seq;
	$tmp=~tr/N/\-/c;
	$tmp=~s/\-//g;
	if ((($N<=1)&&(length($tmp)>=length($seq)*$N))||(($N>1)&&(length($tmp)>=$N))) #N's control
	{
		$_=<>; #+
		$_=<>; #qual
	}
	else
	{
		$_=<>; #+
		$_=<>; #qual
		chomp;
		my $qual=$_;
		my @q=split "",$qual;
		my $q_tot=0;
		my $add_square=0;
		map{my $n=(ord($_)-64);
		$q_tot+=$n;$add_square+=$n*$n;}@q;
		my $q_avg=int($q_tot/scalar(@q));
		my $sd=sqrt($add_square-scalar(@q)*$q_avg*$q_avg)/scalar(@q);
		if (($q_avg>=$Q)&&($sd<=$SD))   #quality control
		{
			print "$name$seq\n+\n$qual\n";
		}
	}
}


