The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Microarray::File::Clone_Locns;

use 5.006;
use strict;
use warnings;
our $VERSION = '1.8';

require Microarray::File;

{ package clone_locn_file;

	our @ISA = qw( microarray_text_file );

	sub import_data {
		my $self = shift;
		$self->make_clone_hash;
	}
	sub make_clone_hash {
		my $self = shift;
		my $source = $self->get_source;
		$source =~ s/"//g;
		my @aRows = split(/\n/,$source);
		$self->line_num(scalar @aRows);
		
		my %hClones = ();
		for my $row (@aRows){
			my ($name,$locn,$chr) = split(/;/,$row);
			$hClones{ $name } = { 
				_chr => $chr,
				_locn => $locn
			};
		}
		$self->{ _clones } = \%hClones;
	}
	sub clone_number {
		my $self = shift;
		$self->line_num;
	}
	sub clone_hash {
		my $self = shift;
		if (@_){
			my $clone = shift;
			my $hClones = $self->{ _clones };
			return $hClones->{ $clone };
		} else {
			$self->{ _clones };
		}
	}
	sub chromosome {
		my $self = shift;
		my $hClone = $self->clone_hash(shift);
		return $hClone->{ _chr };
	}
	sub location {
		my $self = shift;
		my $hClone = $self->clone_hash(shift);
		return $hClone->{ _locn };
	}
	sub chr_location {
		my $self = shift;
		my $clone = shift;
		return ($self->chromosome($clone), $self->location($clone));
	}
	sub genomic_locn {	# ensembl build 36 figures
		my $self = shift;
		my $clone = shift;
		if ((my $chr = $self->chromosome($clone)) && (my $locn = $self->location($clone))){
			my %hChromosome = (		
				# start bp			# length
				1 => 0,				# 247249719
				2 => 247249720,		# 242951149
				3 => 490200869,		# 199501827
				4 => 689702696,		# 191273063
				5 => 880975759,		# 180857866
				6 => 1061833625,	# 170899992
				7 => 1232733617,	# 158821424
				8 => 1391555041,	# 146274826
				9 => 1537829867,	# 140273252
				10 => 1678103119,	# 135374737
				11 => 1813477856,	# 134452384
				12 => 1947930240,	# 132349534
				13 => 2080279774,	# 114142980
				14 => 2194422754,	# 106368585
				15 => 2300791339,	# 100338915
				16 => 2401130254,	# 88827254
				17 => 2489957508,	# 78774742
				18 => 2568732250,	# 76117153
				19 => 2644849403,	# 63811651
				20 => 2708661054,	# 62435964
				21 => 2771097018,	# 46944323
				22 => 2818041341,	# 49691432
				23 => 2867732773,	# 154913754	X-alternative
				24 => 3022646527,	# 57772954	Y-alternative
				X => 2867732773,	# 154913754
				Y => 3022646527		# 57772954	TOTAL=3080419480
			);
			return unless (defined $hChromosome{$chr});
			return $hChromosome{$chr} + $locn;
		}
	} 
}


1;


__END__

=head1 NAME

Microarray::File::Clone_Locns - An object oriented Perl module describing a genomic clone location file

=head1 SYNOPSIS

	use Microarray::File::Clone_Locns;

	my $oFile = clone_locn_file->new('/clone_locns.txt');
	my ($chr,$location) = $oFile->chr_location($clone);

=head1 DESCRIPTION

Microarray::File::Clone_Locns provides methods for retrieving data from a genomic clone location file. Each row of the file contains a clone name and its genomic location in the format C<'Name;bp;chr'> (e.g. C<'RP11-23C5;7853570;4'>. The sex chromosomes can be denoted X and Y or 23 and 24.  

=head1 METHODS

Pass each of the methods a reporter name to return the relevant value.

=over

=item B<chromosome()>

The chromosome name/number. 

=item B<location()>

The bp location of the centre of the clone, where 0 is the chromosome p-ter. 

=item B<genomic_locn()>

The bp location of the centre of the clone with respect to the entire genome, where 0 is chromosome 1pter.

=item B<chr_location()>

Returns (chromosome,location)

=item B<clone_number>

The number of clones listed in the file

=back

=head1 SEE ALSO

L<Microarray::File|Microarray::File>

=head1 AUTHOR

Christopher Jones, Gynaecological Cancer Research Laboratories, Institute for Women's Health, University College London.

L<http://www.instituteforwomenshealth.ucl.ac.uk/AcademicResearch/Cancer/trl>

c.jones@ucl.ac.uk

=head1 COPYRIGHT AND LICENSE

Copyright 2008 by Christopher Jones, University College London

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself. 

=cut