annotate variant_effect_predictor/Bio/EnsEMBL/DBSQL/SliceAdaptor.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 =head1 LICENSE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 This software is distributed under a modified Apache license.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 For license details, please see
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 =head1 CONTACT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 <helpdesk@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 Bio::EnsEMBL::DBSQL::SliceAdaptor - A database aware adaptor responsible for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 the creation of Slice objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 use Bio::EnsEMBL::Utils::Slice qw(split_Slices);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 use Bio::EnsEMBL::Registry;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 Bio::EnsEMBL::Registry->load_registry_from_db(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 -host => 'ensembldb.ensembl.org',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 -user => 'anonymous'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 $slice_adaptor =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 Bio::EnsEMBL::Registry->get_adaptor( "human", "core", "slice" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 # get a slice on the entire chromosome X
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 $chr_slice = $slice_adaptor->fetch_by_region( 'chromosome', 'X' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 # get a slice for each clone in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 foreach $cln_slice ( @{ $slice_adaptor->fetch_all('clone') } ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 # do something with clone
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 # get a slice which is part of NT_004321
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 $spctg_slice =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 $slice_adaptor->fetch_by_region( 'supercontig', 'NT_004321',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 200_000, 600_000 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 # get all non-redundant slices from the highest possible coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 # systems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 $slices = $slice_adaptor->fetch_all('toplevel');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 # include non-reference regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 $slices = $slice_adaptor->fetch_all( 'toplevel', undef, 1 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 # include non-duplicate regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 $slices = $slice_adaptor->fetch_all( 'toplevel', undef, 0, 1 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 # split up a list of slices into smaller slices
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 $overlap = 1000;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 $max_length = 1e6;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 $slices = split_Slices( $slices, $max_length, $overlap );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 # store a list of slice names in a file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 open( FILE, ">$filename" ) or die("Could not open file $filename");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 foreach my $slice (@$slices) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 print FILE $slice->name(), "\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 close FILE;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 # retreive a list of slices from a file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 open( FILE, $filename ) or die("Could not open file $filename");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 while ( $name = <FILE> ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 chomp($name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 $slice = $slice_adaptor->fetch_by_name($name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 # do something with slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 This module is responsible for fetching Slices representing genomic
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 regions from a database. A Details on how slices can be used are in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 Bio::EnsEMBL::Slice module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 package Bio::EnsEMBL::DBSQL::SliceAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 use Bio::EnsEMBL::DBSQL::BaseAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 use Bio::EnsEMBL::Slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 use Bio::EnsEMBL::CircularSlice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 use Bio::EnsEMBL::Mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 use Bio::EnsEMBL::LRGSlice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning stack_trace_dump);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 use Scalar::Util qw/looks_like_number/;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 @ISA = ('Bio::EnsEMBL::DBSQL::BaseAdaptor');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 my $caller = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 my $class = ref($caller) || $caller;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 my $self = $class->SUPER::new(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 # use a cache which is shared and also used by the assembly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 # mapper adaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 my $seq_region_cache = $self->db->get_SeqRegionCache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 $self->{'sr_name_cache'} = $seq_region_cache->{'name_cache'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 $self->{'sr_id_cache'} = $seq_region_cache->{'id_cache'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 $self->{'lrg_region_test'} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 my $meta_container = $self->db->get_MetaContainer();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 my @values = $meta_container->list_value_by_key("LRG");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 if(scalar(@values) and $values[0]->[0]){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 $self->{'lrg_region_test'} = $values[0]->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 =head2 fetch_by_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 Arg [1] : string $coord_system_name (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 The name of the coordinate system of the slice to be created
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 This may be a name of an actual coordinate system or an alias
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 to a coordinate system. Valid aliases are 'seqlevel' or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 'toplevel'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 Arg [2] : string $seq_region_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 The name of the sequence region that the slice will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 created on.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 Arg [3] : int $start (optional, default = 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 The start of the slice on the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 Arg [4] : int $end (optional, default = seq_region length)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 The end of the slice on the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 Arg [5] : int $strand (optional, default = 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 The orientation of the slice on the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 Arg [6] : string $version (optional, default = default version)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 The version of the coordinate system to use (e.g. NCBI33)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 Arg [7] : boolean $no_fuzz (optional, default = undef (false))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 If true (non-zero), do not use "fuzzy matching" (see below).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 Example : $slice = $slice_adaptor->fetch_by_region('chromosome', 'X');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 $slice = $slice_adaptor->fetch_by_region('clone', 'AC008066.4');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 Description: Retrieves a slice on the requested region. At a minimum the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 name the name of the seq_region to fetch must be provided.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 If no coordinate system name is provided than a slice on the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 highest ranked coordinate system with a matching
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 seq_region_name will be returned. If a version but no
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 coordinate system name is provided, the same behaviour will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 apply, but only coordinate systems of the appropriate version
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 are considered. The same applies if the 'toplevel' coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 system is specified, however in this case the version is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 ignored. The coordinate system should always be specified if
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 it is known, since this is unambiguous and faster.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 Some fuzzy matching is performed if no exact match for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 the provided name is found. This allows clones to be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 fetched even when their version is not known. For
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 example fetch_by_region('clone', 'AC008066') will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 retrieve the sequence_region with name 'AC008066.4'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 The fuzzy matching can be turned off by setting the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 $no_fuzz argument to a true value.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 If the requested seq_region is not found in the database undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 is returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 Returntype : Bio::EnsEMBL::Slice or undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 Exceptions : throw if no seq_region_name is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 throw if invalid coord_system_name is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 throw if start > end is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 # ARNE: This subroutine needs simplification!!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 sub fetch_by_region {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 my ( $self, $coord_system_name, $seq_region_name, $start, $end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 $strand, $version, $no_fuzz )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 if ( !defined($start) ) { $start = 1 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 if ( !defined($strand) ) { $strand = 1 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 if ( !defined($seq_region_name) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 throw('seq_region_name argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 my $cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 if ( defined($coord_system_name) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 $cs = $csa->fetch_by_name( $coord_system_name, $version );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 ## REMOVE THESE THREE LINES WHEN STICKLEBACK DB IS FIXED!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 ## Anne/ap5 (2007-10-09):
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 # The problem was that the stickleback genebuild called the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 # chromosomes 'groups', which meant they weren't being picked out by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 # the karyotype drawing code. Apparently they are usually called
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 # 'groups' in the stickleback community, even though they really are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 # chromosomes!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 if ( !defined($cs) && $coord_system_name eq 'chromosome' ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 $cs = $csa->fetch_by_name( 'group', $version );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 if ( !defined($cs) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 throw( sprintf( "Unknown coordinate system:\n"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 . "name='%s' version='%s'\n",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 $coord_system_name, $version ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 # fetching by toplevel is same as fetching w/o name or version
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 if ( $cs->is_top_level() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 $cs = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 $version = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 } ## end if ( defined($coord_system_name...))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 my $constraint;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 my $sql;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 my @bind_params;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 my $key;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 if ( defined($cs) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 $sql = sprintf( "SELECT sr.name, sr.seq_region_id, sr.length, %d "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 . "FROM seq_region sr ",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 $cs->dbID() );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 $constraint = "AND sr.coord_system_id = ?";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 push( @bind_params, [ $cs->dbID(), SQL_INTEGER ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 $key = "$seq_region_name:" . $cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 $sql =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 "SELECT sr.name, sr.seq_region_id, sr.length, cs.coord_system_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 . "FROM seq_region sr, coord_system cs ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 $constraint = "AND sr.coord_system_id = cs.coord_system_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 . "AND cs.species_id = ? ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 push( @bind_params, [ $self->species_id(), SQL_INTEGER ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 if ( defined($version) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 $constraint .= "AND cs.version = ? ";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 push( @bind_params, [ $version, SQL_VARCHAR ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 $constraint .= "ORDER BY cs.rank ASC";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 # check the cache so we only go to the db if necessary
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 my $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 my $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 if ( defined($key) ) { $arr = $self->{'sr_name_cache'}->{$key} }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 if ( defined($arr) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 $length = $arr->[3];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 $self->prepare( $sql . "WHERE sr.name = ? " . $constraint );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 unshift( @bind_params, [ $seq_region_name, SQL_VARCHAR ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 my $pos = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 foreach my $param (@bind_params) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 $sth->bind_param( ++$pos, $param->[0], $param->[1] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 if ( $sth->rows() == 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 # try synonyms
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 my $syn_sql_sth = $self->prepare("select s.name from seq_region s, seq_region_synonym ss where s.seq_region_id = ss.seq_region_id and ss.synonym = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 $syn_sql_sth->bind_param(1, $seq_region_name, SQL_VARCHAR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 $syn_sql_sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 my $new_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 $syn_sql_sth->bind_columns( \$new_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 if($syn_sql_sth->fetch){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 $syn_sql_sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 return $self->fetch_by_region($coord_system_name, $new_name, $start, $end, $strand, $version, $no_fuzz);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 $syn_sql_sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 if ($no_fuzz) { return undef }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 # Do fuzzy matching, assuming that we are just missing a version
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 # on the end of the seq_region name.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 $self->prepare( $sql . " WHERE sr.name LIKE ? " . $constraint );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 $bind_params[0] =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 [ sprintf( '%s.%%', $seq_region_name ), SQL_VARCHAR ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 $pos = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 foreach my $param (@bind_params) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 $sth->bind_param( ++$pos, $param->[0], $param->[1] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 my $prefix_len = length($seq_region_name) + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 my $high_ver = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 my $high_cs = $cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 # Find the fuzzy-matched seq_region with the highest postfix
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 # (which ought to be a version).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 my ( $tmp_name, $id, $tmp_length, $cs_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 $sth->bind_columns( \( $tmp_name, $id, $tmp_length, $cs_id ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 my $i = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 while ( $sth->fetch ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 my $tmp_cs =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 ( defined($cs) ? $cs : $csa->fetch_by_dbID($cs_id) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 # cache values for future reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 my $arr = [ $id, $tmp_name, $cs_id, $tmp_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 $self->{'sr_name_cache'}->{"$tmp_name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $self->{'sr_id_cache'}->{"$id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 my $tmp_ver = substr( $tmp_name, $prefix_len );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 # skip versions which are non-numeric and apparently not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 # versions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 if ( $tmp_ver !~ /^\d+$/ ) { next }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 # take version with highest num, if two versions match take one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 # with highest ranked coord system (lowest num)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 if ( !defined($high_ver)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 || $tmp_ver > $high_ver
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 || ( $tmp_ver == $high_ver && $tmp_cs->rank < $high_cs->rank )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 $seq_region_name = $tmp_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 $length = $tmp_length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 $high_ver = $tmp_ver;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 $high_cs = $tmp_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 $i++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 } ## end while ( $sth->fetch )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 # warn if fuzzy matching found more than one result
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 if ( $i > 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 warning(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 sprintf(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 "Fuzzy matching of seq_region_name "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 . "returned more than one result.\n"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 . "You might want to check whether the returned seq_region\n"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 . "(%s:%s) is the one you intended to fetch.\n",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 $high_cs->name(), $seq_region_name ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 $cs = $high_cs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 # return if we did not find any appropriate match:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 if ( !defined($high_ver) ) { return undef }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 my ( $id, $cs_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 ( $seq_region_name, $id, $length, $cs_id ) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 # cache to speed up for future queries
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 my $arr = [ $id, $seq_region_name, $cs_id, $length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 $self->{'sr_name_cache'}->{"$seq_region_name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 $self->{'sr_id_cache'}->{"$id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 $cs = $csa->fetch_by_dbID($cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 } ## end else [ if ( defined($arr) ) ]
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 if ( !defined($end) ) { $end = $length }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 #If this was given then check if we've got a circular seq region otherwise
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 #let it fall through to the normal Slice method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 if ( $end + 1 < $start ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 my $cs_id = $cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 my $seq_region_id = $self->{'sr_name_cache'}->{"$seq_region_name:$cs_id"}->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 if($self->is_circular($seq_region_id)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 my $new_sl =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 Bio::EnsEMBL::CircularSlice->new(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 -COORD_SYSTEM => $cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 -SEQ_REGION_NAME => $seq_region_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 -SEQ_REGION_LENGTH => $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 -START => $start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 -END => $end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 -STRAND => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 -ADAPTOR => $self );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 return $new_sl;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 if ( defined( $self->{'lrg_region_test'} )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 and substr( $cs->name, 0, 3 ) eq $self->{'lrg_region_test'} )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 return
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 Bio::EnsEMBL::LRGSlice->new( -COORD_SYSTEM => $cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 -SEQ_REGION_NAME => $seq_region_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 -SEQ_REGION_LENGTH => $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 -START => $start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 -END => $end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 -STRAND => $strand,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 -ADAPTOR => $self );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 return
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 Bio::EnsEMBL::Slice->new_fast( {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 'coord_system' => $cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 'seq_region_name' => $seq_region_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 'seq_region_length' => $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 'start' => $start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 'end' => $end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 'strand' => $strand,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 'adaptor' => $self } );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 } ## end sub fetch_by_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 =head2 fetch_by_toplevel_location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 Arg [1] : string $location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 Ensembl formatted location. Can be a format like
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 C<name:start-end>, C<name:start..end>, C<name:start:end>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 C<name:start>, C<name>. We can also support strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 specification as a +/- or 1/-1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 Location names must be separated by a C<:>. All others can be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 separated by C<..>, C<:> or C<->.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 Arg[2] : boolean $no_warnings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 Suppress warnings from this method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 Example : my $slice = $sa->fetch_by_toplevel_location('X:1-10000')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 my $slice = $sa->fetch_by_toplevel_location('X:1-10000:-1')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 Description : Converts an Ensembl location/region into the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 name, start and end and passes them onto C<fetch_by_region()>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 The code assumes that the required slice is on the top level
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 coordinate system. The code assumes that location formatting
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 is not perfect and will perform basic cleanup before parsing.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 Exceptions : If $location is false otherwise see C<fetch_by_region()>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 Caller : General
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 Status : Beta
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 sub fetch_by_toplevel_location {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 my ($self, $location, $no_warnings) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 my ($seq_region_name, $start, $end, $strand) = $self->parse_location_to_values($location, $no_warnings);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 if(! $seq_region_name) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 if(defined $start && defined $end && $start > $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 throw "Cannot request a slice whose start is greater than its end. Start: $start. End: $end";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 my $coord_system_name = 'toplevel';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 my $slice = $self->fetch_by_region($coord_system_name, $seq_region_name, $start, $end, $strand, undef, 0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 return unless $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 my $srl = $slice->seq_region_length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 my $name = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 if(defined $start && $start > $srl) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 throw "Cannot request a slice whose start ($start) is greater than $srl for $name.";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 if(defined $end && $end > $srl) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 warning "Requested end ($end) is greater than $srl for $name. Resetting to $srl" if ! $no_warnings;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 $slice->{end} = $srl;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 return $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 =head2 parse_location_to_values
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 Arg [1] : string $location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 Ensembl formatted location. Can be a format like
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 C<name:start-end>, C<name:start..end>, C<name:start:end>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 C<name:start>, C<name>. We can also support strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 specification as a +/- or 1/-1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 Location names must be separated by a C<:>. All others can be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 separated by C<..>, C<:> or C<->.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 Arg[2] : boolean $no_warnings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 Suppress warnings from this method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 Example : my ($name, $start, $end, $strand) = $sa->parse_location_to_values('X:1..100:1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 Description : Takes in an Ensembl location String and returns the parsed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 values
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 Returntype : List. Contains name, start, end and strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 sub parse_location_to_values {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 my ($self, $location, $no_warnings, $no_errors) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 throw 'You must specify a location' if ! $location;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 #cleanup any nomenclature like 1_000 or 1 000 or 1,000
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 my $number_seps_regex = qr/\s+|,|_/;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 my $separator_regex = qr/(?:-|[.]{2}|\:)?/;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 my $number_regex = qr/[0-9,_ E]+/xms;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 my $strand_regex = qr/[+-1]|-1/xms;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 my $regex = qr/^(\w+) \s* :? \s* ($number_regex)? $separator_regex ($number_regex)? $separator_regex ($strand_regex)? $/xms;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 my ($seq_region_name, $start, $end, $strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 if(($seq_region_name, $start, $end, $strand) = $location =~ $regex) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 if(defined $strand) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 if(!looks_like_number($strand)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 $strand = ($strand eq '+') ? 1 : -1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 if(defined $start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 $start =~ s/$number_seps_regex//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 if($start < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 warning "Start was less than 1 (${start}) which is not allowed. Resetting to 1" if ! $no_warnings;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 $start = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 if(defined $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 $end =~ s/$number_seps_regex//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 if($end < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 throw "Cannot request negative or 0 end indexes through this interface. Given $end but expected something greater than 0" unless $no_errors;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 if(defined $start && defined $end && $start > $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 throw "Cannot request a slice whose start is greater than its end. Start: $start. End: $end" unless $no_errors;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 return ($seq_region_name, $start, $end, $strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 =head2 fetch_by_region_unique
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 Arg [1] : string $coord_system_name (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 The name of the coordinate system of the slice to be created
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 This may be a name of an actual coordinate system or an alias
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 to a coordinate system. Valid aliases are 'seqlevel' or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 'toplevel'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 Arg [2] : string $seq_region_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 The name of the sequence region that the slice will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 created on.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 Arg [3] : int $start (optional, default = 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 The start of the slice on the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 Arg [4] : int $end (optional, default = seq_region length)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 The end of the slice on the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 Arg [5] : int $strand (optional, default = 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 The orientation of the slice on the sequence region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 Arg [6] : string $version (optional, default = default version)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 The version of the coordinate system to use (e.g. NCBI33)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 Arg [7] : boolean $no_fuzz (optional, default = undef (false))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 If true (non-zero), do not use "fuzzy matching" (see below).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 Example : $slice = $slice_adaptor->fetch_by_region_unique('chromosome', 'HSCHR6_MHC_COX');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 Description: Retrieves a slice on the requested region but returns only the unique
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 parts of the slice. At a minimum the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 name the name of the seq_region to fetch must be provided.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 If no coordinate system name is provided than a slice on the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 highest ranked coordinate system with a matching
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 seq_region_name will be returned. If a version but no
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 coordinate system name is provided, the same behaviour will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 apply, but only coordinate systems of the appropriate version
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 are considered. The same applies if the 'toplevel' coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 system is specified, however in this case the version is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 ignored. The coordinate system should always be specified if
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 it is known, since this is unambiguous and faster.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 Some fuzzy matching is performed if no exact match for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 the provided name is found. This allows clones to be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 fetched even when their version is not known. For
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 example fetch_by_region('clone', 'AC008066') will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 retrieve the sequence_region with name 'AC008066.4'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 The fuzzy matching can be turned off by setting the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 $no_fuzz argument to a true value.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 If the requested seq_region is not found in the database undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 is returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 Returntype : listref Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 Exceptions : throw if no seq_region_name is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 throw if invalid coord_system_name is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 throw if start > end is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 sub fetch_by_region_unique {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 my @out = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 my $slice = $self->fetch_by_region(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 if ( !exists( $self->{'asm_exc_cache'} ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 $self->_build_exception_cache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 if ( exists(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 $self->{'asm_exc_cache'}->{ $self->get_seq_region_id($slice) }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 ) )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 # Dereference symlinked assembly regions. Take out any regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 # which are symlinked because these are duplicates.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 my @projection =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 @{ $self->fetch_normalized_slice_projection($slice) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 foreach my $segment (@projection) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 if ( $segment->[2]->seq_region_name() eq $slice->seq_region_name()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 && $segment->[2]->coord_system->equals( $slice->coord_system ) )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 push( @out, $segment->[2] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 } ## end sub fetch_by_region_unique
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 =head2 fetch_by_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 Arg [1] : string $name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 Example : $name = 'chromosome:NCBI34:X:1000000:2000000:1';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 $slice = $slice_adaptor->fetch_by_name($name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 $slice2 = $slice_adaptor->fetch_by_name($slice3->name());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 Description: Fetches a slice using a slice name (i.e. the value returned by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 the Slice::name method). This is useful if you wish to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 store a unique identifier for a slice in a file or database or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 pass a slice over a network.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 Slice::name allows you to serialise/marshall a slice and this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 method allows you to deserialise/unmarshal it.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 Returns undef if no seq_region with the provided name exists in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 Returntype : Bio::EnsEMBL::Slice or undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 Exceptions : throw if incorrent arg provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 Caller : Pipeline
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 sub fetch_by_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 my $name = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 if(!$name) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 throw("name argument is required");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 my @array = split(/:/,$name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 if(scalar(@array) < 3 || scalar(@array) > 6) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 throw("Malformed slice name [$name]. Format is " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 "coord_system:version:name:start:end:strand");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 # Rearrange arguments to suit fetch_by_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 my @targetarray;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 $targetarray[0]=$array[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 $targetarray[5]=(($array[1]&&$array[1] ne "")?$array[1]:undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 $targetarray[1]=(($array[2]&&$array[2] ne "")?$array[2]:undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 $targetarray[2]=(($array[3]&&$array[3] ne "")?$array[3]:undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 $targetarray[3]=(($array[4]&&$array[4] ne "")?$array[4]:undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 $targetarray[4]=(($array[5]&&$array[5] ne "")?$array[5]:undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 return $self->fetch_by_region(@targetarray);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 =head2 fetch_by_seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707 Arg [1] : string $seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 The internal identifier of the seq_region to create this slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709 on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 Arg [2] : optional start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 Arg [3] : optional end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 Arg [4] : optional strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 Example : $slice = $slice_adaptor->fetch_by_seq_region_id(34413);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 Description: Creates a slice object of an entire seq_region using the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 seq_region internal identifier to resolve the seq_region.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 Returns undef if no such slice exists.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717 Returntype : Bio::EnsEMBL::Slice or undef
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 sub fetch_by_seq_region_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 my ( $self, $seq_region_id, $start, $end, $strand ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 my $arr = $self->{'sr_id_cache'}->{$seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728 my ( $name, $length, $cs, $cs_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 if ( $arr && defined( $arr->[2] ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 ( $name, $cs_id, $length ) = ( $arr->[1], $arr->[2], $arr->[3] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 $cs = $self->db->get_CoordSystemAdaptor->fetch_by_dbID($cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 $self->prepare( "SELECT sr.name, sr.coord_system_id, sr.length "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 . "FROM seq_region sr "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 . "WHERE sr.seq_region_id = ? " );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740 $sth->bind_param( 1, $seq_region_id, SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 if ( $sth->rows() == 0 ) { return undef }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 ( $name, $cs_id, $length ) = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 $cs = $self->db->get_CoordSystemAdaptor->fetch_by_dbID($cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 #cache results to speed up repeated queries
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 my $arr = [ $seq_region_id, $name, $cs_id, $length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 $self->{'sr_name_cache'}->{"$name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 $self->{'sr_id_cache'}->{"$seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 return
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 Bio::EnsEMBL::Slice->new_fast({
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759 'coord_system' => $cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 'seq_region_name' => $name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761 'seq_region_length'=> $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 'start' => $start || 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 'end' => $end || $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 'strand' => $strand || 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 'adaptor' => $self} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 } ## end sub fetch_by_seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 =head2 get_seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 The slice to fetch a seq_region_id for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 Example : $srid = $slice_adaptor->get_seq_region_id($slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 Description: Retrieves the seq_region id (in this database) given a slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 Seq region ids are not stored on the slices themselves
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 because they are intended to be somewhat database independant
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 and seq_region_ids vary accross databases.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779 Returntype : int
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 Exceptions : throw if the seq_region of the slice is not in the db
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 throw if incorrect arg provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 Caller : BaseFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 sub get_seq_region_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 my $slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 if(!$slice || !ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice'))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 throw('Slice argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 my $seq_region_name = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 my $key = $seq_region_name.":".$slice->coord_system->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 my $arr = $self->{'sr_name_cache'}->{"$key"};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 if( $arr ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 return $arr->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 my $cs_id = $slice->coord_system->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 my $sth = $self->prepare("SELECT seq_region_id, length " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 "FROM seq_region " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807 "WHERE name = ? AND coord_system_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 #force seq_region_name cast to string so mysql cannot treat as int
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 $sth->bind_param(1,"$seq_region_name",SQL_VARCHAR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 $sth->bind_param(2,$cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814 if($sth->rows() != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 throw("Non existant or ambigous seq_region:\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816 " coord_system=[$cs_id],\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 " name=[$seq_region_name],\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 my($seq_region_id, $length) = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 #cache information for future requests
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825 $arr = [ $seq_region_id, $seq_region_name, $cs_id, $length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827 $self->{'sr_name_cache'}->{"$seq_region_name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 $self->{'sr_id_cache'}->{"$seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 return $seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 =head2 fetch_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 Arg [1] : string $coord_system_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 The name of the coordinate system to retrieve slices of.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 This may be a name of an acutal coordinate system or an alias
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 to a coordinate system. Valid aliases are 'seqlevel' or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 'toplevel'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842 Arg [2] : string $coord_system_version (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 The version of the coordinate system to retrieve slices of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 Arg [3] : bool $include_non_reference (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 If this argument is not provided then only reference slices
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846 will be returned. If set, both reference and non refeference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 slices will be rerurned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 Arg [4] : int $include_duplicates (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 If set duplicate regions will be returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 NOTE: if you do not use this option and you have a PAR
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 (pseudo-autosomal region) at the beginning of your seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 then your slice will not start at position 1, so coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 retrieved from this slice might not be what you expected.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 Arg[5] : bool $include_lrg (optional) (default 0)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857 If set lrg regions will be returned aswell.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860 Example : @chromos = @{$slice_adaptor->fetch_all('chromosome','NCBI33')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 @contigs = @{$slice_adaptor->fetch_all('contig')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 # get even non-reference regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 @slices = @{$slice_adaptor->fetch_all('toplevel',undef,1)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866 # include duplicate regions (such as pseudo autosomal regions)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 @slices = @{$slice_adaptor->fetch_all('toplevel', undef,0,1)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869 Description: Retrieves slices of all seq_regions for a given coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 system. This is analagous to the methods fetch_all which were
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 formerly on the ChromosomeAdaptor, RawContigAdaptor and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 CloneAdaptor classes. Slices fetched span the entire
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873 seq_regions and are on the forward strand.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 If the coordinate system with the provided name and version
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875 does not exist an empty list is returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 If the coordinate system name provided is 'toplevel', all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877 non-redundant toplevel slices are returned (note that any
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 coord_system_version argument is ignored in that case).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 Retrieved slices can be broken into smaller slices using the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881 Bio::EnsEMBL::Utils::Slice module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 Returntype : listref of Bio::EnsEMBL::Slices
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 sub fetch_all {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 my $cs_name = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 my $cs_version = shift || '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 my ($include_non_reference, $include_duplicates, $include_lrg) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 # verify existance of requested coord system and get its id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901 my $orig_cs = $csa->fetch_by_name($cs_name, $cs_version);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903 return [] if ( !$orig_cs );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905 my %bad_vals=();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 # Get a hash of non reference seq regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911 if ( !$include_non_reference ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913 $self->prepare( 'SELECT sr.seq_region_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914 . 'FROM seq_region sr, seq_region_attrib sra, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915 . 'attrib_type at, coord_system cs '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 . 'WHERE at.code = "non_ref" '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917 . 'AND sra.seq_region_id = sr.seq_region_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 . 'AND at.attrib_type_id = sra.attrib_type_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 . 'AND sr.coord_system_id = cs.coord_system_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 . 'AND cs.species_id = ?' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925 my ($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 $sth->bind_columns( \$seq_region_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928 while ( $sth->fetch() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929 $bad_vals{$seq_region_id} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934 # if we do not want lrg's then add them to the bad list;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936 if ( !$include_lrg ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938 $self->prepare( 'SELECT sr.seq_region_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939 . 'FROM seq_region sr, seq_region_attrib sra, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940 . 'attrib_type at, coord_system cs '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941 . 'WHERE at.code = "LRG" '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942 . 'AND sra.seq_region_id = sr.seq_region_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943 . 'AND at.attrib_type_id = sra.attrib_type_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944 . 'AND sr.coord_system_id = cs.coord_system_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945 . 'AND cs.species_id = ?' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950 my ($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 $sth->bind_columns( \$seq_region_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953 while ( $sth->fetch() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 $bad_vals{$seq_region_id} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959 # Retrieve the seq_regions from the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962 my $sth;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963 if ( $orig_cs->is_top_level() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964 $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965 $self->prepare( 'SELECT sr.seq_region_id, sr.name, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966 . 'sr.length, sr.coord_system_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 . 'FROM seq_region sr, seq_region_attrib sra, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968 . 'attrib_type at, coord_system cs '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969 . 'WHERE at.code = "toplevel" '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970 . 'AND at.attrib_type_id = sra.attrib_type_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 . 'AND sra.seq_region_id = sr.seq_region_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972 . 'AND sr.coord_system_id = cs.coord_system_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973 . 'AND cs.species_id = ?' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978 $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979 $self->prepare( 'SELECT sr.seq_region_id, sr.name, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980 . 'sr.length, sr.coord_system_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981 . 'FROM seq_region sr '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 . 'WHERE sr.coord_system_id = ?' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984 $sth->bind_param( 1, $orig_cs->dbID, SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988 my ( $seq_region_id, $name, $length, $cs_id );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
989 $sth->bind_columns( \( $seq_region_id, $name, $length, $cs_id ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
990
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
991 my $cache_count = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
992
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
993 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
994 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
995 if(!defined($bad_vals{$seq_region_id})){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
996 my $cs = $csa->fetch_by_dbID($cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
997
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
998 if(!$cs) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
999 throw("seq_region $name references non-existent coord_system $cs_id.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1000 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1001
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1002 #cache values for future reference, but stop adding to the cache once we
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1003 #we know we have filled it up
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1004 if($cache_count < $Bio::EnsEMBL::Utils::SeqRegionCache::SEQ_REGION_CACHE_SIZE) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1005 my $arr = [ $seq_region_id, $name, $cs_id, $length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1006
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1007 $self->{'sr_name_cache'}->{"$name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1008 $self->{'sr_id_cache'}->{"$seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1009
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1010 $cache_count++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1011 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1012
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1013 my $slice = Bio::EnsEMBL::Slice->new_fast({
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1014 'start' => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1015 'end' => $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1016 'strand' => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1017 'seq_region_name' => $name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1018 'seq_region_length'=> $length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1019 'coord_system' => $cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1020 'adaptor' => $self});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1021
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1022 if(!defined($include_duplicates) or !$include_duplicates){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1023 # test if this slice *could* have a duplicate (exception) region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1024 $self->_build_exception_cache() if(!exists $self->{'asm_exc_cache'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1025 if(exists $self->{asm_exc_cache}->{$seq_region_id}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1026
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1027 # Dereference symlinked assembly regions. Take out
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1028 # any regions which are symlinked because these are duplicates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1029 my @projection = @{$self->fetch_normalized_slice_projection($slice)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1030 foreach my $segment ( @projection) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1031 if($segment->[2]->seq_region_name() eq $slice->seq_region_name() &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1032 $segment->[2]->coord_system->equals($slice->coord_system)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1033 push @out, $segment->[2];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1034 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1035 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1036 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1037 # no duplicate regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1038 push @out, $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1039 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1040 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1041 # we want duplicates anyway so do not do any checks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1042 push @out, $slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1043 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1044 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1045 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1046
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1047 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1048 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1049
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1050 =head2 is_toplevel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1051 Arg : int seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1052 Example : my $top = $slice_adptor->is_toplevel($seq_region_id)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1053 Description: Returns 1 if slice is a toplevel slice else 0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1054 Returntype : int
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1055 Caller : Slice method is_toplevel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1056 Status : At Risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1057
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1058 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1059
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1060 sub is_toplevel {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1061 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1062 my $id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1063
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1064 my $sth = $self->prepare(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1065 "SELECT at.code from seq_region_attrib sra, attrib_type at "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1066 . "WHERE sra.seq_region_id = ? "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1067 . "AND at.attrib_type_id = sra.attrib_type_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1068 . "AND at.code = 'toplevel'" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1069
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1070 $sth->bind_param( 1, $id, SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1071 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1072
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1073 my $code;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1074 $sth->bind_columns( \$code );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1075
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1076 while ( $sth->fetch ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1077 $sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1078 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1079 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1080
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1081 $sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1082 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1083 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1084
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1085 =head2 is_reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1086 Arg : int seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1087 Example : my $reference = $slice_adptor->is_reference($seq_region_id)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1088 Description: Returns 1 if slice is a reference slice else 0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1089 Returntype : int
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1090 Caller : Slice method is_reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1091 Status : At Risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1092
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1093 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1094
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1095 sub is_reference {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1096 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1097 my $id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1098
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1099 my $sth = $self->prepare(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1100 "SELECT at.code from seq_region_attrib sra, attrib_type at "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1101 . "WHERE sra.seq_region_id = ? "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1102 . "AND at.attrib_type_id = sra.attrib_type_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1103 . "AND at.code = 'non_ref'" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1104
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1105 $sth->bind_param( 1, $id, SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1106 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1108 my $code;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1109 $sth->bind_columns( \$code );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1111 while ( $sth->fetch ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1112 $sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1113 return 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1114 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1115
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1116 $sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1117 return 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1118 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1120 =head2 is_circular
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1121
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1122 Arg[1] : int seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1123 Example : my $circular = $slice_adptor->is_circular($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1124 Description : Indicates if the sequence region was circular or not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1125 Returntype : Boolean
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1127 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1128
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1129 sub is_circular {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1130 my ($self, $id) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1132 if (! defined $self->{is_circular}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1133 $self->_build_circular_slice_cache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1134 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1135
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1136 return 0 if $self->{is_circular} == 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1137 return (exists $self->{circular_sr_id_cache}->{$id}) ? 1 : 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1138 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1140 =head2 fetch_by_band
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1141
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1142 Title : fetch_by_band
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1143 Usage :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1144 Function: Does not work please use fetch_by_chr_band
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1145 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1146 Returns : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1147 Args : the band name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1148 Status : AT RISK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1149
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1150 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1151
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1152 sub fetch_by_band {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1153 my ($self,$band) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1155 my $sth = $self->dbc->prepare
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1156 ("select s.name,max(k.seq_region_id)-min(k.seq_region_id, min(k.seq_region_start), max(k.seq_region_id) " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1157 "from karyotype as k " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1158 "where k.band like ? and k.seq_region_id = s.seq_region_id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1160 $sth->bind_param(1,"$band%",SQL_VARCHAR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1161 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1162 my ( $seq_region_name, $discrepancy, $seq_region_start, $seq_region_end) = $sth->fetchrow_array;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1163
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1164 if($seq_region_name && $discrepancy>0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1165 throw("Band maps to multiple seq_regions");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1166 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1167 return $self->fetch_by_region('toplevel',$seq_region_name,$seq_region_start,$seq_region_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1168 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1169 throw("Band not recognised in database");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1170 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1171
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1172 =head2 fetch_by_chr_band
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1174 Title : fetch_by_chr_band
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1175 Usage :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1176 Function: create a Slice representing a series of bands
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1177 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1178 Returns : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1179 Args : the band name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1180 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1181
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1182 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1184 sub fetch_by_chr_band {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1185 my ( $self, $chr, $band ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1186
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1187 my $chr_slice = $self->fetch_by_region( 'toplevel', $chr );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1188 my $seq_region_id = $self->get_seq_region_id($chr_slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1189
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1190 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1191 $self->prepare( 'SELECT MIN(k.seq_region_start), '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1192 . 'MAX(k.seq_region_end) '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1193 . 'FROM karyotype k '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1194 . 'WHERE k.seq_region_id = ? '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1195 . 'AND k.band LIKE ?' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1196
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1197 $sth->bind_param( 1, $seq_region_id, SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1198 $sth->bind_param( 2, "$band%", SQL_VARCHAR );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1199 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1201 my ( $slice_start, $slice_end ) = $sth->fetchrow_array;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1202
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1203 if ( defined $slice_start ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1204 return
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1205 $self->fetch_by_region( 'toplevel', $chr,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1206 $slice_start, $slice_end );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1207 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1208
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1209 throw("Band not recognised in database");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1210 } ## end sub fetch_by_chr_band
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1211
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1212
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1213
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1214 =head2 fetch_by_exon_stable_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1215
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1216 Arg [1] : string $exonid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1217 The stable id of the exon around which the slice is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1218 desired
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1219 Arg [2] : (optional) int $size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1220 The length of the flanking regions the slice should encompass
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1221 on either side of the exon (0 by default)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1222 Example : $slc = $sa->fetch_by_exon_stable_id('ENSE00000302930',10);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1223 Description: Creates a slice around the region of the specified exon.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1224 If a context size is given, the slice is extended by that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1225 number of basepairs on either side of the exon.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1226
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1227 The slice will be created in the exon's native coordinate system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1228 and in the forward orientation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1229 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1230 Exceptions : Thrown if the exon is not in the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1231 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1232 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1234 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1235
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1236 sub fetch_by_exon_stable_id{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1237 my ($self,$exonid,$size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1239 throw('Exon argument is required.') if(!$exonid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1240
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1241 my $ea = $self->db->get_ExonAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1242 my $exon = $ea->fetch_by_stable_id($exonid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1244 throw("Exon [$exonid] does not exist in DB.") if(!$exon);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1245
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1246 return $self->fetch_by_Feature($exon, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1247 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1248
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1249 =head2 fetch_by_transcript_stable_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1251 Arg [1] : string $transcriptid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1252 The stable id of the transcript around which the slice is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1253 desired
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1254 Arg [2] : (optional) int $size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1255 The length of the flanking regions the slice should encompass
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1256 on either side of the transcript (0 by default)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1257 Example : $slc = $sa->fetch_by_transcript_stable_id('ENST00000302930',10);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1258 Description: Creates a slice around the region of the specified transcript.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1259 If a context size is given, the slice is extended by that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1260 number of basepairs on either side of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1261 transcript.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1262
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1263 The slice will be created in the transcript's native coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1264 system and in the forward orientation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1265 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1266 Exceptions : Thrown if the transcript is not in the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1267 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1268 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1269
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1270 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1271
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1272 sub fetch_by_transcript_stable_id{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1273 my ($self,$transcriptid,$size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1274
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1275 throw('Transcript argument is required.') if(!$transcriptid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1276
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1277 my $ta = $self->db->get_TranscriptAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1278 my $transcript = $ta->fetch_by_stable_id($transcriptid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1279
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1280 throw("Transcript [$transcriptid] does not exist in DB.") if(!$transcript);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1281
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1282 return $self->fetch_by_Feature($transcript, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1283 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1284
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1286
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1287 =head2 fetch_by_transcript_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1288
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1289 Arg [1] : int $transcriptid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1290 The unique database identifier of the transcript around which
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1291 the slice is desired
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1292 Arg [2] : (optional) int $size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1293 The length of the flanking regions the slice should encompass
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1294 on either side of the transcript (0 by default)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1295 Example : $slc = $sa->fetch_by_transcript_id(24, 1000);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1296 Description: Creates a slice around the region of the specified transcript.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1297 If a context size is given, the slice is extended by that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1298 number of basepairs on either side of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1299 transcript.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1300
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1301 The slice will be created in the transcript's native coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1302 system and in the forward orientation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1303 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1304 Exceptions : throw on incorrect args
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1305 throw if transcript is not in database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1306 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1307 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1308
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1309 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1311 sub fetch_by_transcript_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1312 my ($self,$transcriptid,$size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1314 throw('Transcript id argument is required.') if(!$transcriptid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1316 my $transcript_adaptor = $self->db()->get_TranscriptAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1317 my $transcript = $transcript_adaptor->fetch_by_dbID($transcriptid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1319 throw("Transcript [$transcriptid] does not exist in DB.") if(!$transcript);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1321 return $self->fetch_by_Feature($transcript, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1322 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1324
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1325
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1326 =head2 fetch_by_gene_stable_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1327
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1328 Arg [1] : string $geneid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1329 The stable id of the gene around which the slice is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1330 desired
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1331 Arg [2] : (optional) int $size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1332 The length of the flanking regions the slice should encompass
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1333 on either side of the gene (0 by default)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1334 Example : $slc = $sa->fetch_by_gene_stable_id('ENSG00000012123',10);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1335 Description: Creates a slice around the region of the specified gene.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1336 If a context size is given, the slice is extended by that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1337 number of basepairs on either side of the gene.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1338
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1339 The slice will be created in the gene's native coordinate system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1340 and in the forward orientation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1341 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1342 Exceptions : throw on incorrect args
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1343 throw if transcript does not exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1344 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1345 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1346
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1347 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1348
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1349 sub fetch_by_gene_stable_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1350 my ($self,$geneid,$size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1351
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1352 throw('Gene argument is required.') if(!$geneid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1353
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1354 my $gene_adaptor = $self->db->get_GeneAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1355 my $gene = $gene_adaptor->fetch_by_stable_id($geneid);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1357 throw("Gene [$geneid] does not exist in DB.") if(!$gene);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1358
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1359 return $self->fetch_by_Feature($gene, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1360 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1361
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1362
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1363
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1364 =head2 fetch_by_Feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1365
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1366 Arg [1] : Bio::EnsEMBL::Feature $feat
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1367 The feature to fetch the slice around
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1368 Arg [2] : int size (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1369 The desired number of flanking basepairs around the feature.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1370 The size may also be provided as a percentage of the feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1371 size such as 200% or 80.5%.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1372 Example : $slice = $slice_adaptor->fetch_by_Feature($feat, 100);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1373 Description: Retrieves a slice around a specific feature. All this really
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1374 does is return a resized version of the slice that the feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1375 is already on. Note that slices returned from this method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1376 are always on the forward strand of the seq_region regardless of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1377 the strandedness of the feature passed in.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1378 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1379 Exceptions : throw if the feature does not have an attached slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1380 throw if feature argument is not provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1381 Caller : fetch_by_gene_stable_id, fetch_by_transcript_stable_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1382 fetch_by_gene_id, fetch_by_transcript_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1383 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1385 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1386
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1387 sub fetch_by_Feature{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1388 my ($self, $feature, $size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1389
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1390 $size ||= 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1391
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1392 if(!ref($feature) || !$feature->isa('Bio::EnsEMBL::Feature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1393 throw('Feature argument expected.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1394 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1396 my $slice = $feature->slice();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1397 if(!$slice || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice') )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1398 throw('Feature must be attached to a valid slice.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1399 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1400
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1401
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1402 my $fstart = $feature->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1403 my $fend = $feature->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1404 if(!defined($fstart) || !defined($fend)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1405 throw('Feature must have defined start and end.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1406 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1407
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1408 #convert the feature slice coordinates to seq_region coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1409 my $slice_start = $slice->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1410 my $slice_end = $slice->end();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1411 my $slice_strand = $slice->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1412 if($slice_start != 1 || $slice_strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1413 if($slice_strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1414 $fstart = $fstart + $slice_start - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1415 $fend = $fend + $slice_start - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1416 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1417 my $tmp_start = $fstart;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1418 $fstart = $slice_end - $fend + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1419 $fend = $slice_end - $tmp_start + 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1420 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1421 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1422
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1423 ## Size may be stored as a %age of the length of the feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1424 ## Size = 100% gives no context
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1425 ## Size = 200% gives context - 50% the size of the feature either side of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1426 ## feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1427
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1428 $size = int( ($1-100)/200 * ($fend-$fstart+1) ) if( $size =~/([\d+\.]+)%/ );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1429
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1430 #return a new slice covering the region of the feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1431 my $S = Bio::EnsEMBL::Slice->new_fast({
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1432 'seq_region_name' => $slice->seq_region_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1433 'seq_region_length' => $slice->seq_region_length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1434 'coord_system' => $slice->coord_system,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1435 'start' => $fstart - $size,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1436 'end' => $fend + $size,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1437 'strand' => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1438 'adaptor' => $self});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1439 $S->{'_raw_feature_strand'} = $feature->strand * $slice_strand if $feature->can('strand');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1440 return $S;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1441 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1442
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1443
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1445 =head2 fetch_by_misc_feature_attribute
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1447 Arg [1] : string $attribute_type
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1448 The code of the attribute type
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1449 Arg [2] : (optional) string $attribute_value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1450 The value of the attribute to fetch by
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1451 Arg [3] : (optional) int $size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1452 The amount of flanking region around the misc feature desired.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1453 Example : $slice = $sa->fetch_by_misc_feature_attribute('superctg',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1454 'NT_030871');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1455 $slice = $sa->fetch_by_misc_feature_attribute('synonym',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1456 'AL00012311',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1457 $flanking);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1458 Description: Fetches a slice around a MiscFeature with a particular
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1459 attribute type and value. If no value is specified then
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1460 the feature with the particular attribute is used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1461 If no size is specified then 0 is used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1462 Returntype : Bio::EnsEMBL::Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1463 Exceptions : Throw if no feature with the specified attribute type and value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1464 exists in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1465 Warning if multiple features with the specified attribute type
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1466 and value exist in the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1467 Caller : webcode
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1468 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1469
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1470 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1471
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1472 sub fetch_by_misc_feature_attribute {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1473 my ($self, $attrib_type_code, $attrib_value, $size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1474
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1475 my $mfa = $self->db()->get_MiscFeatureAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1476
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1477 my $feats = $mfa->fetch_all_by_attribute_type_value($attrib_type_code,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1478 $attrib_value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1479
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1480 if(@$feats == 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1481 throw("MiscFeature with $attrib_type_code=$attrib_value does " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1482 "not exist in DB.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1483 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1484
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1485 if(@$feats > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1486 warning("MiscFeature with $attrib_type_code=$attrib_value is " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1487 "ambiguous - using first one found.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1488 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1489
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1490 my ($feat) = @$feats;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1491
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1492 return $self->fetch_by_Feature($feat, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1493 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1494
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1495 =head2 fetch_normalized_slice_projection
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1496
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1497 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1498 Example : ( optional )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1499 Description: gives back a project style result. The returned slices
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1500 represent the areas to which there are symlinks for the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1501 given slice. start, end show which area on given slice is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1502 symlinked
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1503 Returntype : [[start,end,$slice][]]
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1504 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1505 Caller : BaseFeatureAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1506 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1507
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1508 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1509
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1510
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1511 sub fetch_normalized_slice_projection {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1512 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1513 my $slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1514
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1515 my $slice_seq_region_id = $self->get_seq_region_id( $slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1516
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1517 $self->_build_exception_cache() if(!exists($self->{'asm_exc_cache'}));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1518
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1519 my $result = $self->{'asm_exc_cache'}->{$slice_seq_region_id};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1520
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1521 $result ||= [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1522
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1523 my (@haps, @pars);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1524
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1525 foreach my $row (@$result) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1526 my ( $seq_region_id, $seq_region_start, $seq_region_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1527 $exc_type, $exc_seq_region_id, $exc_seq_region_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1528 $exc_seq_region_end ) = @$row;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1529
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1530 # need overlapping PAR and all HAPs if any
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1531 if( $exc_type eq "PAR" ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1532 if( $seq_region_start <= $slice->end() &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1533 $seq_region_end >= $slice->start() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1534 push( @pars, [ $seq_region_start, $seq_region_end, $exc_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1535 $exc_seq_region_start, $exc_seq_region_end ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1536 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1537 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1538 push( @haps, [ $seq_region_start, $seq_region_end, $exc_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1539 $exc_seq_region_start, $exc_seq_region_end ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1540 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1541 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1542
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1543 if(!@pars && !@haps) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1544 #just return this slice, there were no haps or pars
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1545 return [bless ( [1,$slice->length, $slice], "Bio::EnsEMBL::ProjectionSegment")];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1546 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1547
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1548 my @syms;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1549 if( @haps >= 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1550 my @sort_haps = sort { $a->[1] <=> $b->[1] } @haps;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1551
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1552 my $count =0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1553 my $chr_start = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1554 my $hap_start = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1555 my $last = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1556
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1557 my $seq_reg_slice = $self->fetch_by_seq_region_id($slice_seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1558 my $exc_slice = $self->fetch_by_seq_region_id( $sort_haps[0][2] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1559 my $len1 = $seq_reg_slice->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1560 my $len2 = $exc_slice->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1561 my $max_len = ($len1 > $len2) ? $len1 : $len2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1562
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1563 while($count <= scalar(@sort_haps) and !$last){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1564 my $chr_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1565 my $hap_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1566 if(defined($sort_haps[$count]) and defined($sort_haps[$count][0]) ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1567 $hap_end = $sort_haps[$count][0]-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1568 $chr_end = $sort_haps[$count][3]-1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1569 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1570 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1571 $last = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1572 $hap_end = $len1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1573 $chr_end = $len2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1574 my $diff = ($hap_end-$hap_start)-($chr_end-$chr_start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1575 if($diff > 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1576 push( @syms, [ $hap_start, $hap_end, $sort_haps[0][2], $chr_start, $chr_end+$diff] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1577 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1578 elsif($diff < 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1579 push( @syms, [ $hap_start, $hap_end - $diff, $sort_haps[0][2], $chr_start, $chr_end] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1580 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1581 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1582 push( @syms, [ $hap_start, $hap_end, $sort_haps[0][2], $chr_start, $chr_end] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1583 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1584 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1585 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1586 if($hap_end and $hap_start < $len1){ # if hap at start or end of chromosome
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1587 push( @syms, [ $hap_start, $hap_end, $sort_haps[0][2], $chr_start, $chr_end] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1588 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1589 $chr_start = $chr_end + ($sort_haps[$count][4]-$sort_haps[$count][3]) + 2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1590 $hap_start = $hap_end + ($sort_haps[$count][1]-$sort_haps[$count][0]) + 2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1591 $count++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1592 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1593
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1594
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1595 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1596
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1597
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1598 # for now haps and pars should not be both there, but in theory we
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1599 # could handle it here by cleverly merging the pars into the existing syms,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1600 # for now just:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1601 push( @syms, @pars );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1602
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1603 my $mapper = Bio::EnsEMBL::Mapper->new( "sym", "org" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1604 my $count = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1605 for my $sym ( @syms ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1606 $mapper->add_map_coordinates( $slice_seq_region_id, $sym->[0], $sym->[1],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1607 1, $sym->[2], $sym->[3], $sym->[4] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1608 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1609
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1610 my @linked = $mapper->map_coordinates( $slice_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1611 $slice->start(), $slice->end(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1612 $slice->strand(), "sym" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1613
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1614 # gaps are regions where there is no mapping to another region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1615 my $rel_start = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1617 #if there was only one coord and it is a gap, we know it is just the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1618 #same slice with no overlapping symlinks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1619 if(@linked == 1 && $linked[0]->isa('Bio::EnsEMBL::Mapper::Gap')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1620 return [bless( [1,$slice->length, $slice], "Bio::EnsEMBL::ProjectionSegment" )];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1621 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1622
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1623 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1624 for my $coord ( @linked ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1625 if( $coord->isa( "Bio::EnsEMBL::Mapper::Gap" )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1626 my $exc_slice = Bio::EnsEMBL::Slice->new_fast({
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1627 'start' => $coord->start(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1628 'end' => $coord->end(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1629 'strand' => $slice->strand(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1630 'coord_system' => $slice->coord_system(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1631 'adaptor' => $self,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1632 'seq_region_name' => $slice->seq_region_name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1633 'seq_region_length' => $slice->seq_region_length()});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1634 push( @out, bless ( [ $rel_start, $coord->length()+$rel_start-1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1635 $exc_slice ], "Bio::EnsEMBL::ProjectionSegment") );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1636 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1637 my $exc_slice = $self->fetch_by_seq_region_id( $coord->id() );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1638 my $exc2_slice = Bio::EnsEMBL::Slice->new_fast({
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1640 'start' => $coord->start(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1641 'end' => $coord->end(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1642 'strand' => $coord->strand(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1643 'seq_region_name' => $exc_slice->seq_region_name(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1644 'seq_region_length' => $exc_slice->seq_region_length(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1645 'coord_system' => $exc_slice->coord_system(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1646 'adaptor' => $self
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1647 });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1648
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1649 push( @out, bless( [ $rel_start, $coord->length() + $rel_start - 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1650 $exc2_slice ], "Bio::EnsEMBL::ProjectionSegment") );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1651 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1652 $rel_start += $coord->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1653 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1654
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1655 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1656 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1657
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1658
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1659
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1660
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1661 =head2 store
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1662
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1663 Arg [1] : Bio::EnsEMBL::Slice $slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1664 Arg [2] : (optional) $seqref reference to a string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1665 The sequence associated with the slice to be stored.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1666 Example : $slice = Bio::EnsEMBL::Slice->new(...);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1667 $seq_region_id = $slice_adaptor->store($slice, \$sequence);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1668 Description: This stores a slice as a sequence region in the database
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1669 and returns the seq region id. The passed in slice must
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1670 start at 1, and must have a valid seq_region name and coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1671 system. The attached coordinate system must already be stored in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1672 the database. The sequence region is assumed to start at 1 and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1673 to have a length equalling the length of the slice. The end of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1674 the slice must equal the seq_region_length.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1675 If the slice coordinate system is the sequence level coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1676 system then the seqref argument must also be passed. If the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1677 slice coordinate system is NOT a sequence level coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1678 system then the sequence argument cannot be passed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1679 Returntype : int
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1680 Exceptions : throw if slice has no coord system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1681 throw if slice coord system is not already stored.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1682 throw if slice coord system is seqlevel and no sequence is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1683 provided.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1684 throw if slice coord system is not seqlevel and sequence is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1685 provided.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1686 throw if slice does not start at 1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1687 throw if sequence is provided and the sequence length does not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1688 match the slice length.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1689 throw if the SQL insert fails (e.g. on duplicate seq region)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1690 throw if slice argument is not passed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1691 throw if the slice end is not equal to seq_region_length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1692 Caller : database loading scripts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1693 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1694
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1695 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1696
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1697
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1698
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1699 sub store {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1700 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1701 my $slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1702 my $seqref = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1703
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1704 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1705 # Get all of the sanity checks out of the way before storing anything
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1706 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1707
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1708 if(!ref($slice) || !($slice->isa('Bio::EnsEMBL::Slice') or $slice->isa('Bio::EnsEMBL::LRGSlice'))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1709 throw('Slice argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1710 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1711
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1712 my $cs = $slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1713 throw("Slice must have attached CoordSystem.") if(!$cs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1714
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1715 my $db = $self->db();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1716 if(!$cs->is_stored($db)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1717 throw("Slice CoordSystem must already be stored in DB.")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1718 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1719
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1720 if($slice->start != 1 || $slice->strand != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1721 throw("Slice must have start==1 and strand==1.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1722 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1723
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1724 if($slice->end() != $slice->seq_region_length()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1725 throw("Slice must have end==seq_region_length");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1726 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1727
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1728 my $sr_len = $slice->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1729 my $sr_name = $slice->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1730
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1731 if(!$sr_name) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1732 throw("Slice must have valid seq region name.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1733 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1734
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1735 if($cs->is_sequence_level()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1736 if(!$seqref) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1737 throw("Must provide sequence for sequence level coord system.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1738 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1739 if(ref($seqref) ne 'SCALAR') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1740 throw("Sequence must be a scalar reference.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1741 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1742 my $seq_len = length($$seqref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1743
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1744 if($seq_len != $sr_len) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1745 throw("Sequence length ($seq_len) must match slice length ($sr_len).");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1746 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1747 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1748 if($seqref) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1749 throw("Cannot provide sequence for non-sequence level seq regions.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1750 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1751 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1752
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1753 #store the seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1754
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1755 my $sth = $db->dbc->prepare("INSERT INTO seq_region " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1756 "SET name = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1757 " length = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1758 " coord_system_id = ?" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1759
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1760 $sth->bind_param(1,$sr_name,SQL_VARCHAR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1761 $sth->bind_param(2,$sr_len,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1762 $sth->bind_param(3,$cs->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1763
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1764 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1765
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1766 my $seq_region_id = $sth->{'mysql_insertid'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1767
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1768 if(!$seq_region_id) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1769 throw("Database seq_region insertion failed.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1770 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1771
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1772 if($cs->is_sequence_level()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1773 #store sequence if it was provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1774 my $seq_adaptor = $db->get_SequenceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1775 $seq_adaptor->store($seq_region_id, $$seqref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1776 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1777
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1778 #synonyms
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1779 if(defined($slice->{'synonym'})){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1780 foreach my $syn (@{$slice->{'synonym'}} ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1781 $syn->seq_region_id($seq_region_id); # set the seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1782 $syn->adaptor->store($syn);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1783 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1784 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1785
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1786
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1787 $slice->adaptor($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1788
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1789 return $seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1790 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1791
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1792
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1793 =head2 store_assembly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1794
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1795 Arg [1] : Bio::EnsEMBL::Slice $asm_slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1796 Arg [2] : Bio::EnsEMBL::Slice $cmp_slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1797 Example : $asm = $slice_adaptor->store_assembly( $slice1, $slice2 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1798 Description: Creates an entry in the analysis table based on the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1799 coordinates of the two slices supplied. Returns a string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1800 representation of the assembly that gets created.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1801 Returntype : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1802 Exceptions : throw if either slice has no coord system (cs).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1803 throw unless the cs rank of the asm_slice is lower than the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1804 cmp_slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1805 throw if there is no mapping path between coord systems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1806 throw if the lengths of each slice are not equal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1807 throw if there are existing mappings between either slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1808 and the oposite cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1809 Caller : database loading scripts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1810 Status : Experimental
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1811
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1812 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1813
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1814 sub store_assembly{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1815 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1816 my $asm_slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1817 my $cmp_slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1818
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1819 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1820 # Get all of the sanity checks out of the way before storing anything
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1821 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1822
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1823 if(!ref($asm_slice) || !($asm_slice->isa('Bio::EnsEMBL::Slice') or $asm_slice->isa('Bio::EnsEMBL::LRGSlice'))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1824 throw('Assembled Slice argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1825 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1826 if(!ref($cmp_slice) || !($cmp_slice->isa('Bio::EnsEMBL::Slice') or $cmp_slice->isa('Bio::EnsEMBL::LRGSlice')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1827 throw('Assembled Slice argument is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1828 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1829
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1830 my $asm_cs = $asm_slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1831 throw("Slice must have attached CoordSystem.") if(!$asm_cs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1832 my $cmp_cs = $cmp_slice->coord_system();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1833 throw("Slice must have attached CoordSystem.") if(!$cmp_cs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1834
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1835 unless( $asm_cs->rank < $cmp_cs->rank ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1836 throw("Assembled Slice CoordSystem->rank must be lower than ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1837 "the component Slice Coord_system" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1838 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1839
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1840 my @path =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1841 @{ $asm_cs->adaptor()->get_mapping_path( $asm_cs, $cmp_cs ) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1842
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1843 if ( !@path ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1844 throw("No mapping path defined between "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1845 . $asm_cs->name() . " and "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1846 . $cmp_cs->name() );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1847 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1848
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1849 if( $asm_slice->length != $cmp_slice->length ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1850 throw("The lengths of the assembled and component slices are not equal" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1851 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1852
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1853 # For now we disallow any existing mappings between the asm slice and cmp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1854 # CoordSystem and vice-versa.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1855 # Some cases of multiple mappings may be allowable by the API, but their
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1856 # logic needs to be coded below.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1857
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1858 my $asm_proj = $asm_slice->project( $cmp_cs->name, $cmp_cs->version );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1859 if( @$asm_proj ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1860 throw("Regions of the assembled slice are already assembled ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1861 "into the component CoordSystem" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1862 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1863 my $cmp_proj = $cmp_slice->project( $asm_cs->name, $asm_cs->version );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1864 if( @$cmp_proj ){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1865 throw("Regions of the component slice are already assembled ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1866 "into the assembled CoordSystem" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1867 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1868
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1869 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1870 # Checks complete. Store the data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1871 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1872 my $sth = $self->db->dbc->prepare
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1873 ("INSERT INTO assembly " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1874 "SET asm_seq_region_id = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1875 " cmp_seq_region_id = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1876 " asm_start = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1877 " asm_end = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1878 " cmp_start = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1879 " cmp_end = ?, " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1880 " ori = ?" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1881
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1882 my $asm_seq_region_id = $self->get_seq_region_id( $asm_slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1883 my $cmp_seq_region_id = $self->get_seq_region_id( $cmp_slice );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1884 my $ori = $asm_slice->strand * $cmp_slice->strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1885
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1886 $sth->bind_param(1,$asm_seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1887 $sth->bind_param(2,$cmp_seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1888 $sth->bind_param(3,$asm_slice->start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1889 $sth->bind_param(4,$asm_slice->end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1890 $sth->bind_param(5,$cmp_slice->start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1891 $sth->bind_param(6,$cmp_slice->end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1892 $sth->bind_param(7,$ori,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1893
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1894 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1895
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1896 #use Data::Dumper qw( Dumper );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1897 #warn Dumper( $self->db->{seq_region_cache} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1898 #$self->db->{seq_region_cache} = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1899 #$self->_cache_seq_regions();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1900
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1901 my $ama = $self->db->get_AssemblyMapperAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1902 $ama->delete_cache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1903
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1904
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1905 return $asm_slice->name . "<>" . $cmp_slice->name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1906
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1907 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1908
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1909
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1910 =head2 prepare
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1911
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1912 Arg [1] : String $sql
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1913 Example : ( optional )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1914 Description: overrides the default adaptor prepare method.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1915 All slice sql will usually use the dna_db.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1916 Returntype : DBD::sth
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1917 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1918 Caller : internal, convenience method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1919 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1920
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1921 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1922
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1923 sub prepare {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1924 my ( $self, $sql ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1925 return $self->db()->dnadb()->dbc->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1926 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1927
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1928 sub _build_exception_cache {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1929 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1930
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1931 # build up a cache of the entire assembly exception table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1932 # it should be small anyway
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1933 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1934 $self->prepare( 'SELECT ae.seq_region_id, ae.seq_region_start, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1935 . 'ae.seq_region_end, ae.exc_type, ae.exc_seq_region_id, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1936 . 'ae.exc_seq_region_start, ae.exc_seq_region_end '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1937 . 'FROM assembly_exception ae, '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1938 . 'seq_region sr, coord_system cs '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1939 . 'WHERE sr.seq_region_id = ae.seq_region_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1940 . 'AND sr.coord_system_id = cs.coord_system_id '
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1941 . 'AND cs.species_id = ?' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1942
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1943 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1944 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1945
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1946 my %hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1947 $self->{'asm_exc_cache'} = \%hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1948
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1949 my $row;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1950 while ( $row = $sth->fetchrow_arrayref() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1951 my @result = @$row;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1952 $hash{ $result[0] } ||= [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1953 push( @{ $hash{ $result[0] } }, \@result );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1954 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1955 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1956 } ## end sub _build_exception_cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1957
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1958 =head2 cache_toplevel_seq_mappings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1959
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1960 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1961 Example : $slice_adaptor->cache_toplevel_seq_mappings();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1962 Description: caches all the assembly mappings needed for genes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1963 Returntype : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1964 Exceptions : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1965 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1966 Status : At Risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1967 : New experimental code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1968
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1969 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1970
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1971 sub cache_toplevel_seq_mappings {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1972 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1973
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1974 # Get the sequence level to map too
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1975
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1976 my $sql = (<<SSQL);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1977 SELECT name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1978 FROM coord_system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1979 WHERE attrib like "%sequence_level%"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1980 AND species_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1981 SSQL
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1982
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1983 my $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1984 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1985 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1986
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1987 my $sequence_level = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1988
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1989 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1990
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1991 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1992 my $ama = $self->db->get_AssemblyMapperAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1993
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1994 my $cs1 = $csa->fetch_by_name($sequence_level);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1995
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1996 #get level to map too.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1997
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1998 $sql = (<<LSQL);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1999 SELECT DISTINCT(cs.name)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2000 FROM seq_region sr,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2001 seq_region_attrib sra,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2002 attrib_type at,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2003 coord_system cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2004 WHERE sra.seq_region_id = sr.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2005 AND sra.attrib_type_id = at.attrib_type_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2006 AND at.code = "toplevel"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2007 AND cs.coord_system_id = sr.coord_system_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2008 AND cs.species_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2009 LSQL
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2010
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2011 $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2012 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2013 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2014
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2015 while ( my $csn = $sth->fetchrow_array() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2016 if ( $csn eq $sequence_level ) { next }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2017 my $cs2 = $csa->fetch_by_name($csn);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2018 my $am = $ama->fetch_by_CoordSystems( $cs1, $cs2 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2019 $am->register_all();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2020 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2021
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2022 } ## end sub cache_toplevel_seq_mappings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2023
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2024
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2025 sub _build_circular_slice_cache {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2026 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2027
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2028 # build up a cache of circular sequence region ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2029 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2030 $self->prepare( "SELECT sra.seq_region_id FROM seq_region_attrib sra "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2031 . "INNER JOIN attrib_type at ON sra.attrib_type_id = at.attrib_type_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2032 . "INNER JOIN seq_region sr ON sra.seq_region_id = sr.seq_region_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2033 . "INNER JOIN coord_system cs ON sr.coord_system_id = cs.coord_system_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2034 . "WHERE code = 'circular_seq' and cs.species_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2035
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2036 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2037 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2038
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2039 my $id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2040 my %hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2041 if ( ($id) = $sth->fetchrow_array() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2042 $self->{'circular_sr_id_cache'} = \%hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2043 $self->{'is_circular'} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2044 $hash{ $id } = $id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2045 while ( ($id) = $sth->fetchrow_array() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2046 $hash{ $id } = $id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2047 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2048 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2049 $self->{'is_circular'} = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2050 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2051 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2052 } ## end _build_circular_slice_cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2053
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2054
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2055 #####################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2056 # sub DEPRECATED METHODs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2057 #####################################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2058
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2059 =head2 fetch_by_mapfrag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2060
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2061 Function: DEPRECATED use fetch_by_misc_feature_attribute('synonym',$mapfrag)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2062
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2063 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2064
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2065 sub fetch_by_mapfrag{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2066 my ($self,$mymapfrag,$flag,$size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2067 deprecate('Use fetch_by_misc_feature_attribute instead');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2068 $flag ||= 'fixed-width'; # alt.. 'context'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2069 $size ||= $flag eq 'fixed-width' ? 100000 : 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2070 return $self->fetch_by_misc_feature_attribute('synonym',$mymapfrag,$size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2071 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2072
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2073
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2074
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2075 =head2 fetch_by_chr_start_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2076
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2077 Description: DEPRECATED use fetch_by_region instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2078
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2079 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2080
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2081 sub fetch_by_chr_start_end {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2082 my ($self,$chr,$start,$end) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2083 deprecate('Use fetch_by_region() instead');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2084
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2085 #assume that by chromosome the user actually meant top-level coord
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2086 #system since this is the old behaviour of this deprecated method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2087 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2088 my ($cs) = @{$csa->fetch_all()}; # get the highest coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2089
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2090 return $self->fetch_by_region($cs->name,$chr,$start,$end,1,$cs->version);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2091 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2092
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2093
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2094
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2095 =head2 fetch_by_contig_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2096
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2097 Description: Deprecated. Use fetch_by_region(), Slice::project(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2098 Slice::expand() instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2099
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2100 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2101
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2102 sub fetch_by_contig_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2103 my ($self, $name, $size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2104
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2105 deprecate('Use fetch_by_region(), Slice::project() and Slice::expand().');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2106
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2107 #previously wanted chromosomal slice on a given contig. Assume this means
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2108 #a top-level slice on a given seq_region in the seq_level coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2109 my $csa = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2110 my $seq_level = $csa->fetch_sequence_level();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2111
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2112 my $seq_lvl_slice = $self->fetch_by_region($seq_level->name(), $name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2113
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2114 if(!$seq_lvl_slice) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2115 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2116 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2117
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2118 my @projection = @{$seq_lvl_slice->project('toplevel')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2120 if(@projection != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2121 warning("$name is mapped to multiple toplevel locations.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2122 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2123
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2124 return $projection[0]->[2]->expand($size, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2125 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2128 =head2 fetch_by_clone_accession
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2130 Description: DEPRECATED. Use fetch_by_region, Slice::project, Slice::expand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2131 instead.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2132
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2133 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2134
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2135 sub fetch_by_clone_accession{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2136 my ($self,$name,$size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2138 deprecate('Use fetch_by_region(), Slice::project() and Slice::expand().');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2140 my $csa = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2141 my $clone_cs = $csa->fetch_by_name('clone');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2142
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2143 if(!$clone_cs) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2144 warning('Clone coordinate system does not exist for this species');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2145 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2146 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2148 #this unfortunately needs a version on the end to work
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2149 if(! ($name =~ /\./)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2150 my $sth =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2151 $self->prepare( "SELECT sr.name "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2152 . "FROM seq_region sr, coord_system cs "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2153 . "WHERE cs.name = 'clone' "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2154 . "AND cs.coord_system_id = sr.coord_system_id "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2155 . "AND sr.name LIKE '$name.%'"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2156 . "AND cs.species_id = ?" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2158 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2159 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2160
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2161 if(!$sth->rows()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2162 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2163 throw("Clone $name not found in database");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2164 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2165
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2166 ($name) = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2167
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2168 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2169 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2170
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2171 my $clone = $self->fetch_by_region($clone_cs->name(), $name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2172 return undef if(!$clone);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2174 my @projection = @{$clone->project('toplevel')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2175
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2176 if(@projection != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2177 warning("$name is mapped to multiple locations.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2178 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2179
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2180 return $projection[0]->[2]->expand($size, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2181 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2184 =head2 fetch_by_supercontig_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2185
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2186 Description: DEPRECATED. Use fetch_by_region(), Slice::project() and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2187 Slice::expand() instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2189 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2190
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2191 sub fetch_by_supercontig_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2192 my ($self,$name, $size) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2194 deprecate('Use fetch_by_region(), Slice::project() and Slice::expand().');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2195
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2196 my $csa = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2197 my $sc_level = $csa->fetch_by_name('supercontig');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2198
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2199 if(!$sc_level) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2200 warning('No supercontig coordinate system exists for this species.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2201 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2202 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2203
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2204 my $sc_slice = $self->fetch_by_region($sc_level->name(),$name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2205
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2206 return undef if(!$sc_slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2207
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2208 my @projection = @{$sc_slice->project('toplevel')};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2209
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2210 if(@projection > 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2211 warning("$name is mapped to multiple locations in toplevel");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2212 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2213
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2214 return $projection[0]->[2]->expand($size, $size);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2215 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2217
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2219
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2220 =head2 list_overlapping_supercontigs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2221
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2222 Description: DEPRECATED use Slice::project instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2223
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2224 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2225
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2226 sub list_overlapping_supercontigs {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2227 my ($self,$slice) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2229 deprecate('Use Slice::project() instead.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2231 my $csa = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2232 my $sc_level = $csa->fetch_by_name('supercontig');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2234 if(!$sc_level) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2235 warning('No supercontig coordinate system exists for this species.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2236 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2237 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2239 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2240 foreach my $seg (@{$slice->project($sc_level->name(), $sc_level->version)}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2241 push @out, $seg->[2]->seq_region_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2242 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2244 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2245 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2246
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2247
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2248
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2249 =head2 fetch_by_chr_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2251 Description: DEPRECATED. Use fetch by region instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2253 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2255 sub fetch_by_chr_name{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2256 my ($self,$chr_name) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2257 deprecate('Use fetch_by_region() instead.');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2258
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2259 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2260
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2261 my $top_cs = @{$csa->fetch_all()};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2262
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2263 return $self->fetch_by_region($top_cs->name(),$chr_name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2264 undef,undef,undef,$top_cs->version);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2265 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2266
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2267
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2268
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2269
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2270
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2271
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2272 1;