sub merge {
my ($pre,$cur,$nex, $mindist) = @_;
# here write your logic for merging either cur+pre or cur+nex or no merging at all given mindist
my $decicion_to_merge = ...
if( $decicion_to_merge == 1 ){ ... merge the intervals ... }
}
####
sub get_sorted_intervals_as_array {
my $atree = shift;
my @ret = ();
$atree->traverse(
# specify a func to be run on every node as returned b
+y traverse()
sub {
my $anode = $_[0];
print "traverse() : ".$anode->{interval}." =>
+".$anode->str()."\n";
push(@ret, $anode);
}
);
return @ret
}
####
my @ints = get_sorted_intervals_as_array($tree);
for($i=1;$i##
my %Interval = (
'chromosome' => 'Chr1',
'from' => 1000,
'to' => 4000,
# to represent A1 (?):
'type' => 'A',
'id' => 1
);
####
sub can_merge {
my ($i1, $i2) = @_;
return $i1->{'type'} ne $2->{'type'}
}
sub merge {
my ($i1, $i2, $distance) = @_;
my $newi = {};
if( $distance ... ){ return undef } # no merge happened because distance etc.
if( ! can_merge($i1, $i2) ){ return undef } # no merge, types incompatible.
$newi->{from} = List::Util::min($i1->{from}, $i2->{from});
$newi->{to} = List::Util::max($i1->{to}, $i2->{to});
...
return $newi # return the new interval representing the merge
}