Re^5: Find overlap

by Cristoforo (Deacon)
 on Oct 17, 2012 at 15:42 UTC ( #999564=note: print w/replies, xml ) Need Help??

in reply to Re^4: Find overlap

Here is a solution that won't include non-overlapping regions. It uses the Sort::Naturally and List::Util modules.

It also prints out the number of overlapping records, (merged 3 says 3 records overlapped this range). You can change the print statement to not print this if you (probably) want.

For each chromosome, the records are sorted in order from the smallest beginning position to the largest beginning position. This simplifies the logic and makes a solution possible. The code that does this is:

my (\$first, @in_order) =  sort {\$a->[0] <=> \$b->[0]} @{ \$data{\$chr} };

And, this is the program.

```#!/usr/bin/perl
use strict;
use warnings;
use Sort::Naturally qw/ nsort /;
use List::Util qw / max /;

@ARGV = qw/ 148N.txt 162N.txt 174N.txt 175N.txt /;
my %data;

while (<>) {
my (\$chr, @start_stop) = split;
push @{ \$data{\$chr} }, \@start_stop;
}

for my \$chr (nsort keys %data) {
my (\$first, @in_order) =  sort {\$a->[0] <=> \$b->[0]} @{ \$data{\$chr
+} };

my (\$lo, \$hi) = @\$first;

my \$merged;

for my \$aref (@in_order) { # array reference
my (\$start, \$stop) = @\$aref;
if (\$start <= \$hi) {
\$hi = max \$hi, \$stop;
\$merged++;
}
else {
printf "%s %s %s merged: %s\n", \$chr, \$lo, \$hi, \$merged +
+1 if \$merged;
#print "\$chr \$lo \$hi\n" if \$merged;
(\$lo, \$hi) = (\$start, \$stop);
\$merged = 0;
}
}
printf "%s %s %s merged: %s\n", \$chr, \$lo, \$hi, \$merged + 1 if \$me
+rged;
#print "\$chr \$lo \$hi\n" if \$merged;
}
Update: Just a note - you don't need the 'nsort' function from the Sort::Naturally module for the program to process correctly. This would merely order your chromosomes in your output.
```chr1 xx xx
chr2 xx xx
chr4 xx xx
...
And, if you can't use List::Util for the max function, you could easily define it yourself. I used the module just to save some additional code.

Create A New User
Node Status?
node history
Node Type: note [id://999564]
help
Chatterbox?

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (6)
As of 2017-06-23 09:22 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
How many monitors do you use while coding?

Results (539 votes). Check out past polls.