Skip to content
Snippets Groups Projects

Enscoresw 1481

Merged Marek Szuba requested to merge ENSCORESW-1481 into master
3 files
+ 125
23
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -44,10 +44,15 @@ sub cdna_GET { }
sub cdna: Chained('/') Args(2) PathPart('map/cdna') ActionClass('REST') {
my ($self, $c, $id, $region) = @_;
$c->stash()->{id} = $id;
my $transcript = $c->model('Lookup')->find_object_by_stable_id($id);
my $ref = ref($transcript);
$c->go('ReturnError', 'custom', ["Expected a Bio::EnsEMBL::Transcript object but got a $ref object back. Check your ID"]) if $ref ne 'Bio::EnsEMBL::Transcript';
my $mappings = $self->_map_transcript_coords($c, $transcript, $region, 'cdna2genomic');
#optional parameter to include original region coordinate mappings, cdna coordinates in this case
my $include_original_region = $c->request()->param('include_original_region') || 0;
my $mappings = $self->_map_transcript_coords($c, $transcript, $region, 'cdna2genomic', 'cdna', $include_original_region);
$self->status_ok( $c, entity => { mappings => $mappings } );
}
@@ -59,19 +64,24 @@ sub cds: Chained('/') Args(2) PathPart('map/cds') ActionClass('REST') {
my $transcript = $c->model('Lookup')->find_object_by_stable_id($id);
my $ref = ref($transcript);
$c->go('ReturnError', 'custom', ["Expected a Bio::EnsEMBL::Transcript object but got a $ref object back. Check your ID"]) if $ref ne 'Bio::EnsEMBL::Transcript';
my $mappings = $self->_map_transcript_coords($c, $transcript, $region, 'cds2genomic');
#optional parameter to include original region coordinate mappings, cds coordinates in this case
my $include_original_region = $c->request()->param('include_original_region') || 0;
my $mappings = $self->_map_transcript_coords($c, $transcript, $region, 'cds2genomic','cds', $include_original_region);
$self->status_ok( $c, entity => { mappings => $mappings } );
}
sub _map_transcript_coords {
my ($self, $c, $transcript, $region, $method) = @_;
my ($self, $c, $transcript, $region, $method,$type, $include_original_region) = @_;
my ($start, $end) = $region =~ /^(\d+) (?:\.{2} | -) (\d+)$/xms;
if(!$start) {
$c->go('ReturnError', 'custom', ["Region did not correctly parse. Please check documentation"]);
}
$start ||= $end;
my $mapped = [$transcript->get_TranscriptMapper()->$method($start, $end)];
return $self->map_mappings($c, $mapped, $transcript);
my $mapped = [$transcript->get_TranscriptMapper()->$method($start, $end, $include_original_region)];
return $self->map_mappings($c, $mapped, $transcript, $type, $include_original_region);
}
## Create a slice object based on the location string provided
@@ -154,34 +164,78 @@ sub map_data : Private {
}
sub map_mappings {
my ($self, $c, $mapped, $transcript) = @_;
my ($self, $c, $mapped, $transcript,$type,$include_original_region) = @_;
my @r;
my $seq_region_name = $transcript->seq_region_name();
my $coord_system = $transcript->coord_system_name();
my $assembly_name = $transcript->slice->coord_system->version();
foreach my $m (@{$mapped}) {
my $strand = 0;
my $gap = 0;
if($m->isa('Bio::EnsEMBL::Mapper::Gap')) {
$gap = 1;
if($include_original_region){
my $paired_mapping = map_mappings_include_original_region($m, $seq_region_name, $coord_system, $assembly_name, $type);
push(@r, $paired_mapping);
}else{
my $m_mapped_mappings = _get_mapped_coords($m, $seq_region_name, $coord_system, $assembly_name);
push(@r,$m_mapped_mappings);
}
else {
$strand = $m->strand();
}
push(@r, {
start => $m->start() * 1,
end => $m->end() * 1,
strand => $strand,
rank => $m->rank(),
gap => $gap,
seq_region_name => $seq_region_name,
coord_system => $coord_system,
assembly_name => $assembly_name,
});
}
return \@r;
}
sub map_mappings_include_original_region{
my ($m, $seq_region_name, $coord_system, $assembly_name, $type) = @_;
my $m_mapped = $m->{'mapped'};
my $m_ori = $m->{'original'};
my $m_mapped_mappings = {};
my $m_ori_mappings = {};
if($m->{'mapped'}){
$m_mapped_mappings = _get_mapped_coords($m->{'mapped'}, $seq_region_name, $coord_system, $assembly_name);
}
#seq_region_name and assembly_name is not applicable for the original region and type (eg: cds or cdna) is assigned to the coordinate_system
if($m->{'original'}){
$coord_system = $type;
$m_ori_mappings = _get_mapped_coords($m->{'original'}, undef, $coord_system, undef);
}
my $paired_mappings = { 'original' => $m_ori_mappings, 'mapped' => $m_mapped_mappings };
return $paired_mappings;
}
sub _get_mapped_coords {
my ($m, $seq_region_name, $coord_system, $assembly_name) = @_;
my $strand = 0;
my $gap = 0;
if($m->isa('Bio::EnsEMBL::Mapper::Gap')) {
$gap = 1;
}
else {
$strand = $m->strand();
}
my $mapped_coords = {
start => $m->start() * 1,
end => $m->end() * 1,
strand => $strand,
rank => $m->rank(),
gap => $gap,
};
$mapped_coords->{'seq_region_name'} = $seq_region_name if defined($seq_region_name);
$mapped_coords->{'coord_system'} = $coord_system if defined($coord_system);
$mapped_coords->{'assembly_name'} = $assembly_name if defined($assembly_name);
return $mapped_coords;
}
__PACKAGE__->meta->make_immutable;
1;