All pastes #89372 Raw Edit

Untitled

public text v1 · immutable
#89372 ·published 2006-07-16 05:05 UTC
rendered paste body
#!/usr/bin/perl -w
#
#	egq.pl - EfficientGenomeQuery
#	copyright Erich Blume, 2006 
#	Erich Blume - eblume@ucsc.edu
#
$|=1;

use FindBin qw($Bin);
use lib "$Bin/../lib";


 
# preProcessQuery ($line) - determines $line is a valid query and 
#                           returns it with any necessary conversions.
sub preProcessQuery {
	my $line=uc(shift); #converts lowercase to uppercase
	chomp($line);
	if ($line=~/^[ATGC]{25}$/) { #Valid queries are 25 A,T,G,C only!
		return $line;
	} else {
		print STDERR "Query '${line}' at line $. of $ARGV ".
		"is invalid! Skipping...\n";
	}
}

# createSmallQueries ($line) - chop valid 25-mer into 6 20-mers.
#
sub createSmallQueries {
	my $line=shift;
	return (substr($line,0,20),
		substr($line,1,20),
		substr($line,2,20),
		substr($line,3,20),
		substr($line,4,20),
		substr($line,5,20)
		);
}

##TODO: Uncomment for production release! PROCESSES ~900MB TEXT
#@genfiles=("chr1.fa","chr2.fa","chr3.fa","chr4.fa","chr5.fa","chr6.fa",
#	   "chr7.fa","chr8.fa","chr9.fa","chr10.fa","chr11.fa","chr12.fa",
#	   "chr13.fa","chr14.fa","chr15.fa","chr16.fa","chr17.fa","chr18.fa",
#	   "chr19.fa","chr20.fa","chr21.fa","chr22.fa","chrX.fa","chrY.fa");

#TODO: Delete debug mode, below.
@genfiles=("test.fa");

#####################MAIN#############################


###Begin parse of query file(s).

while (<>) {
	$_=preProcessQuery($_);
	if (exists($bigquerylist{$_})) {
		print STDERR "Query $_ at line $. of $ARGV already ".
		"exists! Skipping...\n";
	} else {
		$bigquerylist{$_}=0;
		@queries=createSmallQueries($_);
		foreach $querysmall (@queries) {
			$smallquerylist{$querysmall} = [] 
				unless exists $smallquerylist{$querysmall};
			push @{$smallquerylist{$querysmall}}, $_;
		}
	}
}


###DebugDumps:
#foreach $value (%bigquerylist) { print "${value}\n"}
#foreach $aref (%smallquerylist) {print "@{$aref}\n"}

###Begin peicewise parse of chromosomes.
foreach $genfilename (@genfiles) { #every file in the list
	$start = 0;
	$lastlinelength = 0;
	print "Now opening ".$Bin."/HumGenome/".$genfilename."\n";
	open(GENFILE, $Bin."/HumGenome/".$genfilename)
		or die("Bad file: ".$Bin."/HumGenome/".$genfilename."\n");
	while (<GENFILE>) { #every line in the file
		chomp();
		$_=uc($_);
		if (!(/^(>|;)/)) { #omit FASTA comments and headers
			if ($start == 0) { 
				$buffer=$_;
				$start++;
				$lastlinelength=length($_);
			} else {
				$buffer.=$_;
				for my $pos (0..length($buffer)-20) {
					my $query = substr($buffer,$pos,20);
					#DebugHit
					#print "${query}\n";
					if ($query=~/^[ATGC]{20}$/) {
						if(exists($smallquerylist{$query})) {
################Re-Indent################################
foreach $big (@{$smallquerylist{$query}}) {
	if (exists($bigquerylist{$big})) {
		#DebugHit
		#print "I found a match for query $query in 25-mer $big !\n";
		$bigquerylist{$big}++;
	} else { #shouldn't ever happen, hence the die
		die("Can't find 25-mer query $big that the 20-mer $query says should exist!\n");
	}
}
################End Re-Indent############################
						}
					}
				}
				substr($buffer,0,$lastlinelength) = ''; 
				$lastlinelength = length($_);
			}
		}
	}
	close(GENFILE);
}

print "\nLookup completed.\nQuery: Hits\n";

foreach $key (keys %bigquerylist) {
	$value = $bigquerylist{$key};
	print "${key}: ${value}\n";
}