Mercurial > repos > antmarge > singlefitness
view singleFitness.pl @ 12:e733cb0283ac draft
Deleted selected files
author | antmarge |
---|---|
date | Sat, 18 Mar 2017 22:50:13 -0400 |
parents | d3227d69c228 |
children |
line wrap: on
line source
#!/usr/bin/perl -w #Margaret Antonio updated 16.10.03 use strict; use Getopt::Long; use warnings; use Bio::SeqIO; #AVAILABLE OPTIONS. WILL PRINT UPON ERROR sub print_usage() { print "\n####################################################################\n"; print "singleVal: creates a wig file with position and insertion count OR fitness\n"; print "\nDESCRIPTION: "; print "Integrates multiple files of transposon insertion data and outputs\n"; print "aggregate fitness within a sliding window (specified by size and step).\n"; print "\nUSAGE:\n"; print "perl singleVal.pl <OPTIONS> <REQ OUTPUT TYPE(S)> <INPUT FILE(S)>\n\n"; print "\nREQUIRED:\n"; print " -d\tDirectory containing all input files (files from\n"; print " \taggregate script)\n"; print " \tOR\n"; print " \tIn the command line (without a flag), input the name(s) of\n"; print " \tfiles containing gene fitness values (output of calcFit). \n\n"; print " -x\tCutoff: Don't include fitness scores with average counts (c1+c2)/2 < x (default: 10)\n"; print " -b\tBlanks: Exclude -b % of blank fitness scores (scores where c2 = 0) (default: 0 = 0%)\n"; print " -w\tUse weighted algorithm to calculate averages, variance, sd, se\n"; print " -l\tWeight ceiling: maximum value to use as a weight (default: 50)\n"; print "OPTIONAL:\n"; print " -h\tPrints usage and exits program\n"; print " -o\tOutput file for comparison data. Default: singleVal.wig\n"; print " -v\tString value for output: 'fit' for fitness OR 'count' for count\n"; print " \tDefault: fit for fitness\n"; print " -n\tName of the reference genome, to be included in the wig header\n"; print " \tDefault: genome\n"; print " \n~~~~Always check that file paths are correctly specified~~~~\n"; print "\n##################################################################\n"; } #ASSIGN INPUTS TO VARIABLES our ($help,$ref_genome,$indir,$out,$cutoff,$blank_pc,$weight_ceiling); GetOptions( 'h'=>\$help, 'o:s' =>\$out, 'c:i' =>\$cutoff, 'b:i' =>\$blank_pc, 'l:i' =>\$weight_ceiling, ); sub get_time() { my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); return "$hour:$min:$sec"; } if ($help){ print_usage(); exit; } if (!$indir and (scalar @ARGV==0)){ print "\nERROR: Please correctly specify input files or directory\n"; print_usage(); print "\n"; exit; } #ADDED BY MLA allows input to be directory---good for inputting L1-L6 my @files=@ARGV; #SET DEFAULTS if (!$cutoff){$cutoff=10} if (!$blank_pc){$blank_pc=0} if (!$weight_ceiling){$weight_ceiling=50} if (!$out){$out="singleVal.csv"} # Returns mean, variance, sd, se sub average { my $scoreref = shift @_; my @scores = @{$scoreref}; my $sum=0; my $num=0; # Get the average. foreach my $w (@scores) { $sum += $w; $num++; } my $average= $sum/$num; my $xminusxbars = 0; # Get the variance. foreach my $w (@scores) { $xminusxbars += ($w-$average)**2; } my $variance = (1/($num-1)) * $xminusxbars; my $sd = sqrt($variance); my $se = $sd / sqrt($num); return ($average, $variance, $sd, $se); } # Takes two parameters, both hashrefs to lists. # 1) hashref to list of scores # 2) hashref to list of weights, equal in length to the scores. sub weighted_average { my $scoreref = shift @_; my $weightref = shift @_; my @scores = @{$scoreref}; my @weights = @{$weightref}; my $sum=0; my ($weighted_average, $weighted_variance)=(0,0); my $v2; # Go through once to get total, calculate V2. for (my $i=0; $i<@weights; $i++) { $sum += $weights[$i]; $v2 += $weights[$i]**2; } if ($sum == 0) { return 0; } # No scores given? my $scor = join (' ', @scores); my $wght = join (' ', @weights); # Now calculated weighted average. my ($top, $bottom) = (0,0); for (my $i=0; $i<@weights; $i++) { $top += $weights[$i] * $scores[$i]; $bottom += $weights[$i]; } $weighted_average = $top/$bottom; #print "WA: $weighted_average\n"; ($top, $bottom) = (0,0); # Now calculate weighted sample variance. for (my $i=0; $i<@weights; $i++) { $top += ( $weights[$i] * ($scores[$i] - $weighted_average)**2); $bottom += $weights[$i]; } $weighted_variance = $top/$bottom; my $weighted_stdev = sqrt($weighted_variance); my $weighted_stder = $weighted_stdev / sqrt(@scores); # / length scores. return ($weighted_average, $weighted_variance, $weighted_stdev, $weighted_stder); } my %pos_summary; foreach my $filename (@files) { print "\n",$filename,"\n"; open IN, $filename; my %hash; while (my $line = <IN>) { chomp $line; my @lines = split(/,/,$line); my $pos = $lines[0]; my $w = $lines[12]; if ($w and $w eq 'nW') {next;} if (!$w) { $w = 0 } # For blanks my $c1 = $lines[2]; my $c2 = $lines[3]; my $avg = ($c1+$c2)/2; # Later: change which function to use? C1? AVG(C1+C2)? if ($avg < $cutoff) { next; } # Skip cutoff genes. if ($avg >= $weight_ceiling) { $avg = $weight_ceiling; } # Maximum weight. my @empty; if (!$pos_summary{$pos}) { $pos_summary{$pos}{w} = [@empty]; $pos_summary{$pos}{s} = [@empty]; } $pos_summary{$pos}{w} = [@{$pos_summary{$pos}{w}}, $w]; # List of Fitness scores. $pos_summary{$pos}{s} = [@{$pos_summary{$pos}{s}}, $avg]; # List of counts used to generate those fitness scores. } close IN; } open SUMMARY, ">",$out; print SUMMARY "pos,fitness,ins_count,fitness_sd,fitness_se\n"; # Now print out summary stats. foreach my $key (sort {$a<=>$b} keys %pos_summary) { if (!$key) {next} my $sum=0; my $num=0; my $avgsum = 0; # Get the average. foreach my $w (@{$pos_summary{$key}{w}}) { $sum += $w; $num++; } my $average= $sum/$num; my $xminusxbars = 0; # Get the standard deviation. foreach my $w (@{$pos_summary{$key}{w}}) { $xminusxbars += ($w-$average)**2; } my ($sd, $se) = ('',''); if ($num > 1) { $sd = sqrt($xminusxbars/($num-1)); $se = $sd / sqrt($num); } print SUMMARY "$key,$average,$num,$sd,$se\n"; } close SUMMARY;