use Bio::EnsEMBL::Utils::Slice qw(split_Slices);
# ...
# get all chromosomes in the database
my $slices = $slice_adaptor->fetch_all('chromosome');
# split the chromosomes into equal chunks of size less than 1MB
# with an overlap of 1kb
$slices = split_Slices( $slices, 1e6, 1e3 );
sub split_Slices
{ my ($slice_big,$max_length,$overlap)=@_;
if(!defined($max_length) or $max_length < 1){
throw("maxlength needs to be set and > 0");
}
if(!defined($overlap)){
$overlap = 0;
}
elsif($overlap < 0){
throw("negative overlaps not allowed");
}
my @out=();
foreach my $slice (@$slice_big){
my $start = $slice->start;
my $end;
my $multiple;
my $number;
my $length = $slice->length;
if($max_length && ($length > $overlap)) {
$number = ($length-$overlap) / ($max_length-$overlap); $number = ceil($number);
$multiple = $length / $number; $multiple = floor($multiple); } else {
$number = 1;
$multiple = $length;
}
my $i;
for(my $i=0; $i < $number; $i++) {
$end = $start + $multiple + $overlap;
$end = $slice->end if($i == $number-1);
push @out, Bio::EnsEMBL::Slice->new
(-START => $start,
-END => $end,
-STRAND => 1,
-SEQ_REGION_NAME => $slice->seq_region_name,
-SEQ_REGION_LENGTH => $length,
-COORD_SYSTEM => $slice->coord_system,
-ADAPTOR => $slice->adaptor);
$start += $multiple + 1;
}
}
return\@ out;
}
1; } |