104 lines
1.9 KiB
Perl
104 lines
1.9 KiB
Perl
#!/usr/bin/env perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use FindBin;
|
|
use lib ("$FindBin::RealBin/../../PerlLib");
|
|
use SAM_reader;
|
|
use SAM_entry;
|
|
|
|
my $usage = "\n\nusage: name_sorted_paired_reads.sam\n\n";
|
|
|
|
my $sam_file = $ARGV[0] or die $usage;
|
|
|
|
main: {
|
|
|
|
|
|
my $prev_read_name = "";
|
|
my $prev_scaff_name = "";
|
|
|
|
my @reads;
|
|
|
|
my $sam_reader = new SAM_reader($sam_file);
|
|
while ($sam_reader->has_next()) {
|
|
|
|
|
|
my $read = $sam_reader->get_next();
|
|
|
|
my $scaff_name = $read->get_scaffold_name();
|
|
my $core_read_name = $read->get_core_read_name();
|
|
|
|
if ($scaff_name ne $prev_scaff_name || $core_read_name ne $prev_read_name) {
|
|
|
|
if (@reads) {
|
|
&process_pairs(@reads);
|
|
@reads = ();
|
|
}
|
|
}
|
|
|
|
push (@reads, $read);
|
|
|
|
|
|
$prev_read_name = $core_read_name;
|
|
$prev_scaff_name = $scaff_name;
|
|
|
|
|
|
}
|
|
|
|
&process_pairs(@reads);
|
|
|
|
|
|
exit(0);
|
|
}
|
|
|
|
####
|
|
sub process_pairs {
|
|
my (@reads) = @_;
|
|
|
|
|
|
my @left_reads;
|
|
my @right_reads;
|
|
|
|
foreach my $read (@reads) {
|
|
if ($read->is_first_in_pair()) {
|
|
push (@left_reads, $read);
|
|
}
|
|
elsif ($read->is_second_in_pair()) {
|
|
push (@right_reads, $read);
|
|
}
|
|
}
|
|
|
|
unless (@left_reads && @right_reads) {
|
|
die "Error, dont have pairs!";
|
|
}
|
|
|
|
my $left_read = shift @left_reads;
|
|
my $aligned_pos = $left_read->get_aligned_position();
|
|
|
|
my $right_read = undef;
|
|
while ((! defined($right_read)) && @right_reads) {
|
|
my $read = shift @right_reads;
|
|
if ($read->get_mate_scaffold_position() == $aligned_pos) {
|
|
$right_read = $read;
|
|
last;
|
|
}
|
|
}
|
|
|
|
unless ($left_read && $right_read) {
|
|
die "Error, couldn't match pairs.";
|
|
}
|
|
|
|
print $left_read->toString() . "\n";
|
|
print $right_read->toString() . "\n";
|
|
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|