Genetics
view release on metacpan or search on metacpan
Genetics/API/Analysis.pm view on Meta::CPAN
and/or FrequencySource objects.
The source(s) for allele frequencies.
Required, for obvious reasons.
ALLELETYPE => The type of alleles whose frequencies are to be graphed.
Optional, the default value is "Code".
Returns : N/A
Scope : Public
Comments : Calls xv to display the graphic.
=cut
sub graphAlleleFreqs {
my($self, %param) = @_ ;
my($marker, $sourceListPtr, $alleleType, $markerName, @alleleNames, @data,
@sourceNames, $source, $alleleName, $freqsPtr, @freqs, $graph, $fileName) ;
# Get the input parameters and check a few things
defined($marker = $param{MARKER}) or
croak "ERROR [graphAlleleFreqs]: No Marker!" ;
$markerName = $marker->field("name") ;
defined($sourceListPtr = $param{FREQSOURCES}) or
croak "ERROR [graphAlleleFreqs]: No source(s) for allele frequencies!" ;
defined($alleleType = $param{ALLELETYPE}) or $alleleType = "Code" ;
# Get the frequencies
@alleleNames = $self->getAllelesByType($marker, $alleleType) ;
push @data, [ @alleleNames ] ;
foreach $source (@$sourceListPtr) {
if ( ref($source) eq "Genetics::FrequencySource" ) {
$freqsPtr = $source->getAlleleFreqsByMarkerName($markerName, $alleleType) ;
} elsif ( ref($source) eq "Genetics::Cluster" ) {
$freqsPtr = $self->getAlleleFreqs($marker, $alleleType, $source) ;
} else {
carp "WARNING [graphAlleleFreqs]: $source is an invalid source for allele frequencies!" ;
next ;
}
@freqs = () ;
push @sourceNames, $source->field("name") ;
foreach $alleleName (@alleleNames) {
push @freqs, $$freqsPtr{$alleleName} ;
}
push @data, [ @freqs ] ;
}
defined($data[1]) or croak "ERROR [graphAlleleFreqs]: No valid allele frequency data!" ;
# Create and display the graph
$graph = GD::Graph::bars->new() ;
$graph->set(
x_label => 'Allele',
y_label => 'Frequency',
title => "$markerName Allele Frequencies",
long_ticks => 1,
y_max_value => 1.0,
y_tick_number => 20,
y_label_skip => 2,
bar_spacing => 3,
# shadow_depth => 2,
# shadowclr => 'black',
transparent => 0,
) or carp "WARNING [graphAlleleFreqs]: " . $graph->error ;
$graph->set_legend( @sourceNames );
$graph->plot( \@data ) or croak "ERROR [graphAlleleFreqs]: " . $graph->error ;
$fileName = "/tmp/$$.png" ;
&_saveGraphToFile($graph, $fileName) ;
system("xv $fileName &") == 0 or
croak "ERROR [graphAlleleFreqs]: system xv $fileName & failed: $?" ;
return(1) ;
}
=head2 calculateHet
Function : Calculate the heterozygosity for a Marker or SNP.
Arguments : A Marker object, a string containing an allele type, and one of
the following defining the Subject group:
- a Subject Cluster object
- an array reference to a list of Subject objects
- a Kindred Cluster object
- an array reference to a list of Kindred objects
Returns : A scalar float
Scope : Public
Comments : Arguments are passed directly to API::DB::Query::getAlleleFreqs()
=cut
sub calculateHet {
my($self, $marker, $alleleType, $subjGroup) = @_ ;
my($freqsPtr, $allele, $sumFreqsSquared, $het) ;
# Parameter checking, to the extent that it happens at all, is taken
# care of by API::DB::Query::getAlleleFreqs()
# Get the allele frequencies
$freqsPtr = $self->getAlleleFreqs($marker, $alleleType, $subjGroup) ;
# Calculate heterozygosity
foreach $allele (sort keys %$freqsPtr) {
next if ($alleleType eq "Nucleotide" and $allele eq "N") ;
$sumFreqsSquared += ($$freqsPtr{$allele})**2 ;
}
$het = 1 - $sumFreqsSquared ;
return( _formatFloat($het) ) ;
}
=head2 calculateSnpHW
Function :
Arguments :
Returns :
Example : calculateHW()
Scope :
Comments :
=cut
sub calculateSnpHW {
my($self, $po, $sc) = @_ ;
my($gtCountsPtr, $alleleCountsPtr, @alleles, $i, @allelePairs,
$n11, $n12, $n22, $n, $obs, $exp, $chiSquare) ;
if ( ref($po) !~ /^Genetics::(Marker|SNP)$/ ) {
croak "ERROR [calculateHW]: Invalid input Marker/SNP $po." ;
( run in 1.845 second using v1.01-cache-2.11-cpan-39bf76dae61 )