biyelunwen/99.scripts/trinity_utils/PerlLib/CDNA/Gene_obj_alignment_assemble...

141 lines
3.4 KiB
Perl

package main;
our $SEE;
=head1 NAME
CDNA::Gene_obj_alignment_assembler;
=cut
=head1 DESCRIPTION
This package assembles multiple gene objs by assembling compatible sets of coordinates. This module inherits from the CDNA::Genome_based_cDNA_assembler module. Please see this inherited module for additional methods available.
=cut
package CDNA::Gene_obj_alignment_assembler;
use strict;
use base qw (CDNA::PASA_alignment_assembler);
use CDNA::CDNA_alignment;
=item new()
=over 4
B<Description:> Instantiate a new CDNA::Gene_obj_alignment_assembler object.
B<Parameters:> $seq_ref
$seq_ref is a scalar reference to the genomic sequence string.
B<Returns:> obj_ref
=back
=cut
sub new {
my $packagename = shift;
my $seqref = shift;
my $self = $packagename->SUPER::new();
$self->{sequence_ref} = $seqref;
bless ($self, $packagename);
return ($self);
}
=item assemble_genes()
=over 4
B<Description:> assembles a list of Gene_obj(s). Each of the Gene_objs
B<Parameters:> @Gene_obj
@Gene_obj is an array of gene objects created via the Gene_obj.pm module.
B<Returns:> @CDNA_alignments
The @CDNA_alignments array contains the list of CDNA::CDNA_alignment objects created based on the gene objects.
The CDNA_alignment accession is set to the Model_feat_name of the gene_obj. Retrieving the cDNA acc using the get_acc() method will allow a mapping back to the gene object. Also, the newly created CDNA_alignment objects that are returned should be in the same order as the inputed gene objects, so indexing should provide mapping info as well.
use the get_assemblies() function to fetch the merged genes.
=back
=cut
sub assemble_genes {
my $self = shift;
my @gene_objs = @_;
my @cDNA_alignments;
foreach my $gene_obj (@gene_objs) {
my $alignment_obj = $self->gene_obj_to_cdna_alignment($gene_obj);
push (@cDNA_alignments, $alignment_obj);
}
$self->assemble_alignments(@cDNA_alignments);
return (@cDNA_alignments);
}
=item gene_obj_to_cdna_alignment()
=over 4
B<Description:> method converts a Gene_obj to a CDNA::CDNA_alignment obj.
B<Parameters:> Gene_obj
B<Returns:> CDNA::CDNA_alignment
=back
=cut
sub gene_obj_to_cdna_alignment {
my $self = shift;
my $gene_obj = shift;
my @exons = $gene_obj->get_exons();
my %coords;
my @alignment_segments;
my $cdna_length = 0;
foreach my $exon (@exons) {
my ($end5, $end3) = $exon->get_coords();
my $alignment_seg = new CDNA::Alignment_segment($end5, $end3);
push (@alignment_segments, $alignment_seg);
$cdna_length += abs ($end3 - $end5) + 1;
}
my $alignment_obj = new CDNA::CDNA_alignment($cdna_length, \@alignment_segments, $self->{sequence_ref});
my $feat_name = $gene_obj->{Model_feat_name};
print "Gene has the following model feat_name: $feat_name\n" if $SEE;
$alignment_obj->set_acc($feat_name);
$alignment_obj->set_title($gene_obj->{com_name});
$alignment_obj->set_fli_status(1); #treat like a fli cdna
my $align_orient = $alignment_obj->get_spliced_orientation();
## Make sure strand is set correctly (should only matter for single exon genes).
if ($align_orient ne $gene_obj->{strand}) {
$alignment_obj->set_orientation($gene_obj->{strand});
$alignment_obj->set_spliced_orientation($gene_obj->{strand});
}
$alignment_obj->remap_cdna_segment_coords();
print $alignment_obj->toToken() ." " . $alignment_obj->get_acc() . "\n" if $SEE;
return ($alignment_obj);
}
1; #EOM