20251125
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
#!/usr/bin/env perl
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use FindBin;
|
||||
use lib ("$FindBin::Bin/../../PerlLib");
|
||||
use SAM_reader;
|
||||
use SAM_entry;
|
||||
use Process_cmd;
|
||||
|
||||
my $usage = "\n\n\tusage: $0 transcript_aligned.bam [out_prefix='ss_analysis']\n\n";
|
||||
|
||||
my $bam_file = $ARGV[0] or die $usage;
|
||||
my $out_prefix = $ARGV[1] || "ss_analysis";
|
||||
|
||||
main: {
|
||||
|
||||
my %transcript_to_orients;
|
||||
|
||||
my $sam_reader = new SAM_reader($bam_file);
|
||||
print STDERR "-parsing file: $bam_file\n";
|
||||
while (my $sam_entry = $sam_reader->get_next()) {
|
||||
|
||||
my $trans_name = $sam_entry->get_scaffold_name();
|
||||
my $orient = $sam_entry->get_query_strand();
|
||||
|
||||
|
||||
if ($sam_entry->is_paired()) {
|
||||
|
||||
unless ($sam_entry->is_proper_pair() && $sam_entry->is_first_in_pair()) {
|
||||
next;
|
||||
}
|
||||
}
|
||||
|
||||
$transcript_to_orients{$trans_name}->{$orient}++;
|
||||
|
||||
}
|
||||
print STDERR "-done parsing file, examining orientations of reads.\n";
|
||||
|
||||
## sum them up.
|
||||
my @transcripts = keys %transcript_to_orients;
|
||||
foreach my $transcript (@transcripts) {
|
||||
|
||||
my $orient_plus = $transcript_to_orients{$transcript}->{'+'} || 0;
|
||||
my $orient_minus = $transcript_to_orients{$transcript}->{'-'} || 0;
|
||||
|
||||
|
||||
my $total_reads = $orient_plus + $orient_minus;
|
||||
|
||||
$transcript_to_orients{$transcript}->{'transcript'} = $transcript;
|
||||
$transcript_to_orients{$transcript}->{'total_reads'} = $total_reads;
|
||||
}
|
||||
|
||||
####
|
||||
my @structs = values %transcript_to_orients;
|
||||
@structs = reverse sort {$a->{total_reads}<=>$b->{total_reads}} @structs;
|
||||
|
||||
# header
|
||||
open (my $ofh, ">$out_prefix.dat") or die "Error, cannot write to $out_prefix.dat";
|
||||
|
||||
print $ofh join("\t", "#transcript", "plus_strand_1stReads", "minus_strand_1stReads", "total_reads", "diff_ratio") . "\n";
|
||||
|
||||
foreach my $struct (@structs) {
|
||||
|
||||
my $struct = shift @structs;
|
||||
|
||||
|
||||
my ($plus, $minus, $total_reads, $transcript) = ($struct->{'+'},
|
||||
$struct->{'-'},
|
||||
$struct->{'total_reads'},
|
||||
$struct->{'transcript'});
|
||||
unless ($plus) { $plus = 0; }
|
||||
unless ($minus) { $minus = 0; }
|
||||
|
||||
my $diff_proportion = sprintf("%.3f", ($plus - $minus) / $total_reads);
|
||||
|
||||
print $ofh join("\t", $transcript, $plus, $minus, $total_reads, $diff_proportion) . "\n";
|
||||
|
||||
}
|
||||
close $ofh;
|
||||
|
||||
|
||||
## plot it.
|
||||
my $cmd = "$FindBin::Bin/plot_strand_specificity_dist_by_quantile.Rscript $out_prefix.dat";
|
||||
&process_cmd($cmd);
|
||||
|
||||
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user