annotate variant_effect_predictor/Bio/EnsEMBL/DBSQL/AssemblyMapperAdaptor.pm @ 3:d30fa12e4cc5 default tip

Merge heads 2:a5976b2dce6f and 1:09613ce8151e which were created as a result of a recently fixed bug.
author devteam <devteam@galaxyproject.org>
date Mon, 13 Jan 2014 10:38:30 -0500
parents 1f6dce3d34e0
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::AssemblyMapperAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 use Bio::EnsEMBL::Registry;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 Bio::EnsEMBL::Registry->load_registry_from_db(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 -host => 'ensembldb.ensembl.org',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 -user => 'anonymous'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 $asma = Bio::EnsEMBL::Registry->get_adaptor( "human", "core",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 "assemblymapper" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 $csa = Bio::EnsEMBL::Registry->get_adaptor( "human", "core",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 "coordsystem" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 my $chr33_cs = $csa->fetch_by_name( 'chromosome', 'NCBI33' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 my $chr34_cs = $csa->fetch_by_name( 'chromosome', 'NCBI34' );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 my $ctg_cs = $csa->fetch_by_name('contig');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 my $clone_cs = $csa->fetch_by_name('clone');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 my $chr_ctg_mapper =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 $asma->fetch_by_CoordSystems( $chr33_cs, $ctg_cs );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 my $ncbi33_ncbi34_mapper =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 $asm_adptr->fetch_by_CoordSystems( $chr33, $chr34 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 my $ctg_clone_mapper =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 $asm_adptr->fetch_by_CoordSystems( $ctg_cs, $clone_cs );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 Adaptor for handling Assembly mappers. This is a I<Singleton> class.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 ie: There is only one per database (C<DBAdaptor>).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 This is used to retrieve mappers between any two coordinate systems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 whose makeup is described by the assembly table. Currently one step
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 (explicit) and two step (implicit) pairwise mapping is supported. In
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 one-step mapping an explicit relationship between the coordinate systems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 is defined in the assembly table. In two-step 'chained' mapping no
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 explicit mapping is present but the coordinate systems must share a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 common mapping to an intermediate coordinate system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 package Bio::EnsEMBL::DBSQL::AssemblyMapperAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 use Bio::EnsEMBL::DBSQL::BaseAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 use Bio::EnsEMBL::AssemblyMapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 use Bio::EnsEMBL::ChainedAssemblyMapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 use Bio::EnsEMBL::TopLevelAssemblyMapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 use Bio::EnsEMBL::Utils::Cache; #CPAN LRU cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning stack_trace_dump);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 #use Bio::EnsEMBL::Utils::Exception qw(deprecate throw);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 use Bio::EnsEMBL::Utils::SeqRegionCache;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 use integer; #do proper arithmetic bitshifts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 my $CHUNKFACTOR = 20; # 2^20 = approx. 10^6
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 Arg [1] : Bio::EnsEMBL::DBAdaptor $dbadaptor the adaptor for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 the database this assembly mapper is using.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 Example : my $asma = new Bio::EnsEMBL::AssemblyMapperAdaptor($dbadaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 Description: Creates a new AssemblyMapperAdaptor object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 Returntype : Bio::EnsEMBL::DBSQL::AssemblyMapperAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 Caller : Bio::EnsEMBL::DBSQL::DBAdaptor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 my($class, $dbadaptor) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 my $self = $class->SUPER::new($dbadaptor);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 $self->{'_asm_mapper_cache'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 # use a shared cache (for this database) that contains info about
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 # seq regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 my $seq_region_cache = $self->db->get_SeqRegionCache();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 $self->{'sr_name_cache'} = $seq_region_cache->{'name_cache'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 $self->{'sr_id_cache'} = $seq_region_cache->{'id_cache'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 =head2 cache_seq_ids_with_mult_assemblys
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 Example : $self->adaptor->cache_seq_ids_with_mult_assemblys();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 Description: Creates a hash of the component seq region ids that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 map to more than one assembly from the assembly table.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 Retruntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 Caller : AssemblyMapper, ChainedAssemblyMapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 Status : At Risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 sub cache_seq_ids_with_mult_assemblys{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 my %multis;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 return if (defined($self->{'multi_seq_ids'}));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 $self->{'multi_seq_ids'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 my $sql = qq(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 SELECT sra.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 FROM seq_region_attrib sra,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 attrib_type at,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 seq_region sr,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 coord_system cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 WHERE sra.attrib_type_id = at.attrib_type_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 AND code = "MultAssem"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 AND sra.seq_region_id = sr.seq_region_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 AND sr.coord_system_id = cs.coord_system_id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 AND cs.species_id = ?);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 my $sth = $self->prepare($sql);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 $sth->bind_param( 1, $self->species_id(), SQL_INTEGER );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 my ($seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 $sth->bind_columns(\$seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 $self->{'multi_seq_ids'}->{$seq_region_id} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 $sth->finish;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 =head2 fetch_by_CoordSystems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 Arg [1] : Bio::EnsEMBL::CoordSystem $cs1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 One of the coordinate systems to retrieve the mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 between
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 Arg [2] : Bio::EnsEMBL::CoordSystem $cs2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 The other coordinate system to map between
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 Description: Retrieves an Assembly mapper for two coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 systems whose relationship is described in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 assembly table.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 The ordering of the coodinate systems is arbitrary.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 The following two statements are equivalent:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 $mapper = $asma->fetch_by_CoordSystems($cs1,$cs2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 $mapper = $asma->fetch_by_CoordSystems($cs2,$cs1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 Returntype : Bio::EnsEMBL::AssemblyMapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 Exceptions : wrong argument types
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 sub fetch_by_CoordSystems {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 my $cs1 = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 my $cs2 = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 if(!ref($cs1) || !$cs1->isa('Bio::EnsEMBL::CoordSystem')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 throw("cs1 argument must be a Bio::EnsEMBL::CoordSystem.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 if(!ref($cs2) || !$cs2->isa('Bio::EnsEMBL::CoordSystem')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 throw("cs2 argument must be a Bio::EnsEMBL::CoordSystem.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 # if($cs1->equals($cs2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 # throw("Cannot create mapper between same coord systems: " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 # $cs1->name . " " . $cs1->version);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 if($cs1->is_top_level()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 return Bio::EnsEMBL::TopLevelAssemblyMapper->new($self, $cs1, $cs2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 if($cs2->is_top_level()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 return Bio::EnsEMBL::TopLevelAssemblyMapper->new($self, $cs2, $cs1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 #retrieve the shortest possible mapping path between these systems
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 my @mapping_path = @{$csa->get_mapping_path($cs1,$cs2)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 if(!@mapping_path) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 # It is perfectly fine not to have a mapping. No warning needed really
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 # Just check the return code!!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 # warning(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 # "There is no mapping defined between these coord systems:\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 # $cs1->name() . " " . $cs1->version() . " and " . $cs2->name() . " " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 # $cs2->version()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 # );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 my $key = join(':', map({defined($_)?$_->dbID():"-"} @mapping_path));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 my $asm_mapper = $self->{'_asm_mapper_cache'}->{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 return $asm_mapper if($asm_mapper);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 if(@mapping_path == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 throw("Incorrect mapping path defined in meta table. " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 "0 step mapping encountered between:\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 $cs1->name() . " " . $cs1->version() . " and " . $cs2->name . " " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 $cs2->version());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 if(@mapping_path == 2) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 #1 step regular mapping
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 $asm_mapper = Bio::EnsEMBL::AssemblyMapper->new($self, @mapping_path);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 # If you want multiple pieces on two seqRegions to map to each other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 # you need to make an assembly.mapping entry that is seperated with a #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 # instead of an |.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 $self->{'_asm_mapper_cache'}->{$key} = $asm_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 return $asm_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 if(@mapping_path == 3) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 #two step chained mapping
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 $asm_mapper = Bio::EnsEMBL::ChainedAssemblyMapper->new($self,@mapping_path);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 #in multi-step mapping it is possible get requests with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 #coordinate system ordering reversed since both mappings directions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 #cache on both orderings just in case
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 #e.g. chr <-> contig <-> clone and clone <-> contig <-> chr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 $self->{'_asm_mapper_cache'}->{$key} = $asm_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 $key = join(':', map({defined($_)?$_->dbID():"-"} reverse(@mapping_path)));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 $self->{'_asm_mapper_cache'}->{$key} = $asm_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 return $asm_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 throw("Only 1 and 2 step coordinate system mapping is currently\n" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 "supported. Mapping between " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 $cs1->name() . " " . $cs1->version() . " and " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 $cs2->name() . " " . $cs2->version() .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 " requires ". (scalar(@mapping_path)-1) . " steps.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 =head2 register_assembled
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 Arg [1] : Bio::EnsEMBL::AssemblyMapper $asm_mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 A valid AssemblyMapper object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 Arg [2] : integer $asm_seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 The dbID of the seq_region to be registered
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 Arg [3] : int $asm_start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 The start of the region to be registered
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 Arg [4] : int $asm_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 The end of the region to be registered
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 Description: Declares an assembled region to the AssemblyMapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 This extracts the relevant data from the assembly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 table and stores it in Mapper internal to the $asm_mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 It therefore must be called before any mapping is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 attempted on that region. Otherwise only gaps will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 be returned. Note that the AssemblyMapper automatically
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 calls this method when the need arises.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 Exceptions : throw if the seq_region to be registered does not exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 or if it associated with multiple assembled pieces (bad data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 in assembly table)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 Caller : Bio::EnsEMBL::AssemblyMapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 sub register_assembled {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 my $asm_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 my $asm_seq_region = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 my $asm_start = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 my $asm_end = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 if(!ref($asm_mapper) || !$asm_mapper->isa('Bio::EnsEMBL::AssemblyMapper')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 throw("Bio::EnsEMBL::AssemblyMapper argument expected");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 throw("asm_seq_region argument expected") if(!defined($asm_seq_region));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 throw("asm_start argument expected") if(!defined($asm_start));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 throw("asm_end argument expected") if(!defined($asm_end));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 my $asm_cs_id = $asm_mapper->assembled_CoordSystem->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 my $cmp_cs_id = $asm_mapper->component_CoordSystem->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 #split up the region to be registered into fixed chunks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 #this allows us to keep track of regions that have already been
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 #registered and also works under the assumption that if a small region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 #is requested it is likely that other requests will be made in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 #vicinity (the minimum size registered the chunksize (2^chunkfactor)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 my @chunk_regions;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 #determine span of chunks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 #bitwise shift right is fast and easy integer division
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 my($start_chunk, $end_chunk);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 $start_chunk = $asm_start >> $CHUNKFACTOR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $end_chunk = $asm_end >> $CHUNKFACTOR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 # inserts have start = end + 1, on boundary condition start_chunk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 # could be less than end chunk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 if($asm_start == $asm_end + 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 ($start_chunk, $end_chunk) = ($end_chunk, $start_chunk);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 #find regions of continuous unregistered chunks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 my $i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 my ($begin_chunk_region,$end_chunk_region);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 for ($i = $start_chunk; $i <= $end_chunk; $i++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 if($asm_mapper->have_registered_assembled($asm_seq_region, $i)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 if(defined($begin_chunk_region)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 #this is the end of an unregistered region.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 my $region = [($begin_chunk_region << $CHUNKFACTOR),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 (($end_chunk_region+1) << $CHUNKFACTOR)-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 push @chunk_regions, $region;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 $begin_chunk_region = $end_chunk_region = undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 $begin_chunk_region = $i if(!defined($begin_chunk_region));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 $end_chunk_region = $i+1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 $asm_mapper->register_assembled($asm_seq_region,$i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 #the last part may have been an unregistered region too
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 if(defined($begin_chunk_region)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 my $region = [($begin_chunk_region << $CHUNKFACTOR),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 (($end_chunk_region+1) << $CHUNKFACTOR) -1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 push @chunk_regions, $region;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 return if(!@chunk_regions);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 # keep the Mapper to a reasonable size
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 if( $asm_mapper->size() > $asm_mapper->max_pair_count() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 $asm_mapper->flush();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 #we now have to go and register the entire requested region since we
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 #just flushed everything
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 @chunk_regions = ( [ ( $start_chunk << $CHUNKFACTOR)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 , (($end_chunk+1) << $CHUNKFACTOR)-1 ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 for( my $i = $start_chunk; $i <= $end_chunk; $i++ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 $asm_mapper->register_assembled( $asm_seq_region, $i );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 # my $asm_seq_region_id =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 # $self->_seq_region_name_to_id($asm_seq_region,$asm_cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 # Retrieve the description of how the assembled region is made from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 # component regions for each of the continuous blocks of unregistered,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 # chunked regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 my $q = qq{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 asm.cmp_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 asm.cmp_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 asm.cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 sr.length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 asm.ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 asm.asm_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 assembly asm, seq_region sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 asm.asm_seq_region_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 ? <= asm.asm_end AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 ? >= asm.asm_start AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 asm.cmp_seq_region_id = sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 sr.coord_system_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 my $sth = $self->prepare($q);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 foreach my $region (@chunk_regions) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 my($region_start, $region_end) = @$region;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 $sth->bind_param(1,$asm_seq_region,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 $sth->bind_param(2,$region_start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 $sth->bind_param(3,$region_end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 $sth->bind_param(4,$cmp_cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 my($cmp_start, $cmp_end, $cmp_seq_region_id, $cmp_seq_region, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 $asm_start, $asm_end, $cmp_seq_region_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 $sth->bind_columns(\$cmp_start, \$cmp_end, \$cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 \$cmp_seq_region, \$cmp_seq_region_length, \$ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 \$asm_start, \$asm_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 # Load the unregistered regions of the mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 next if($asm_mapper->have_registered_component($cmp_seq_region_id)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 and !defined($self->{'multi_seq_ids'}->{$cmp_seq_region_id}));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 $asm_mapper->register_component($cmp_seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 $asm_mapper->mapper->add_map_coordinates(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 $asm_seq_region, $asm_start, $asm_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 $cmp_seq_region_id, $cmp_start, $cmp_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 my $arr = [ $cmp_seq_region_id, $cmp_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 $cmp_cs_id, $cmp_seq_region_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 $self->{'sr_name_cache'}->{"$cmp_seq_region:$cmp_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 $self->{'sr_id_cache'}->{"$cmp_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 sub _seq_region_name_to_id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 my $sr_name = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 my $cs_id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 ($sr_name && $cs_id) || throw('seq_region_name and coord_system_id args ' .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 'are required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 my $arr = $self->{'sr_name_cache'}->{"$sr_name:$cs_id"};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 if( $arr ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 return $arr->[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 # Get the seq_region_id via the name. This would be quicker if we just
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 # used internal ids instead but stored but then we lose the ability
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 # the transform accross databases with different internal ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 my $sth = $self->prepare("SELECT seq_region_id, length " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 "FROM seq_region " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 "WHERE name = ? AND coord_system_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 $sth->bind_param(1,$sr_name,SQL_VARCHAR);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 $sth->bind_param(2,$cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 if(!$sth->rows() == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 throw("Ambiguous or non-existant seq_region [$sr_name] " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 "in coord system $cs_id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 my ($sr_id, $sr_length) = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 $arr = [ $sr_id, $sr_name, $cs_id, $sr_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 $self->{'sr_name_cache'}->{"$sr_name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 $self->{'sr_id_cache'}->{"$sr_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 return $sr_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 sub _seq_region_id_to_name {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 my $sr_id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 ($sr_id) || throw('seq_region_is required');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 my $arr = $self->{'sr_id_cache'}->{"$sr_id"};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 if( $arr ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 return $arr->[1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 # Get the seq_region name via the id. This would be quicker if we just
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 # used internal ids instead but stored but then we lose the ability
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 # the transform accross databases with different internal ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 my $sth = $self->prepare("SELECT name, length ,coord_system_id " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 "FROM seq_region " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 "WHERE seq_region_id = ? ");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 $sth->bind_param(1,$sr_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 if(!$sth->rows() == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 throw("non-existant seq_region [$sr_id]");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 my ($sr_name, $sr_length, $cs_id) = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 $arr = [ $sr_id, $sr_name, $cs_id, $sr_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 $self->{'sr_name_cache'}->{"$sr_name:$cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 $self->{'sr_id_cache'}->{"$sr_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 return $sr_name;
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 =head2 register_component
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 Arg [1] : Bio::EnsEMBL::AssemblyMapper $asm_mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 A valid AssemblyMapper object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 Arg [2] : integer $cmp_seq_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 The dbID of the seq_region to be registered
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 Description: Declares a component region to the AssemblyMapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 This extracts the relevant data from the assembly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 table and stores it in Mapper internal to the $asm_mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 It therefore must be called before any mapping is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 attempted on that region. Otherwise only gaps will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 be returned. Note that the AssemblyMapper automatically
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 calls this method when the need arises.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 Exceptions : throw if the seq_region to be registered does not exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 or if it associated with multiple assembled pieces (bad data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 in assembly table)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 Caller : Bio::EnsEMBL::AssemblyMapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 sub register_component {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 my $asm_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 my $cmp_seq_region = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 if(!ref($asm_mapper) || !$asm_mapper->isa('Bio::EnsEMBL::AssemblyMapper')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 throw("Bio::EnsEMBL::AssemblyMapper argument expected");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 if(!defined($cmp_seq_region)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 throw("cmp_seq_region argument expected");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 my $cmp_cs_id = $asm_mapper->component_CoordSystem()->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 my $asm_cs_id = $asm_mapper->assembled_CoordSystem()->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 #do nothing if this region is already registered or special case
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 return if($asm_mapper->have_registered_component($cmp_seq_region)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 and !defined($self->{'multi_seq_ids'}->{$cmp_seq_region}));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 # my $cmp_seq_region_id =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 # $self->_seq_region_name_to_id($cmp_seq_region, $cmp_cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 # Determine what part of the assembled region this component region makes up
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 my $q = qq{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 asm.asm_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 asm.asm_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 sr.length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 assembly asm, seq_region sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 asm.cmp_seq_region_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 asm.asm_seq_region_id = sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 sr.coord_system_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 my $sth = $self->prepare($q);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 $sth->bind_param(1,$cmp_seq_region,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 $sth->bind_param(2,$asm_cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 if($sth->rows() == 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 #this component is not used in the assembled part i.e. gap
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 $asm_mapper->register_component($cmp_seq_region);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 #we do not currently support components mapping to multiple assembled
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 # make sure that you've got the correct mapping in the meta-table :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 # chromosome:EquCab2#contig ( use'#' for multiple mappings )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 # chromosome:EquCab2|contig ( use '|' delimiter for 1-1 mappings )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 if($sth->rows() != 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 throw("Multiple assembled regions for single " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 "component region cmp_seq_region_id=[$cmp_seq_region]\n".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 "Remember that multiple mappings use the \#-operaator".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 " in the meta-table (i.e. chromosome:EquCab2\#contig\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 my ($asm_start, $asm_end, $asm_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 $asm_seq_region, $asm_seq_region_length) = $sth->fetchrow_array();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 my $arr = [ $asm_seq_region_id, $asm_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 $asm_cs_id, $asm_seq_region_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 $self->{'sr_name_cache'}->{"$asm_seq_region:$asm_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 $self->{'sr_id_cache'}->{"$asm_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 # Register the corresponding assembled region. This allows a us to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 # register things in assembled chunks which allows us to:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 # (1) Keep track of what assembled regions are registered
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 # (2) Use locality of reference (if they want something in same general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 # region it will already be registered).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 $self->register_assembled($asm_mapper,$asm_seq_region_id,$asm_start,$asm_end);
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 =head2 register_chained
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 Arg [1] : Bio::EnsEMBL::ChainedAssemblyMapper $casm_mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 The chained assembly mapper to register regions on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 Arg [2] : string $from ('first' or 'last')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 The direction we are registering from, and the name of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 internal mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 Arg [3] : string $seq_region_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 The name of the seqregion we are registering on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 Arg [4] : listref $ranges
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 A list of ranges to register (in [$start,$end] tuples).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 Arg [5] : (optional) $to_slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 Only register those on this Slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 Description: Registers a set of ranges on a chained assembly mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 This function is at the heart of the chained mapping process.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664 It retrieves information from the assembly table and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 dynamically constructs the mappings between two coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 systems which are 2 mapping steps apart. It does this by using
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 two internal mappers to load up a third mapper which is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 actually used by the ChainedAssemblyMapper to perform the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 mapping.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 This method must be called before any mapping is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672 attempted on regions of interest, otherwise only gaps will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 be returned. Note that the ChainedAssemblyMapper automatically
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674 calls this method when the need arises.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 Exceptions : throw if the seq_region to be registered does not exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 or if it associated with multiple assembled pieces (bad data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 in assembly table)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 throw if the mapping between the coordinate systems cannot
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 be performed in two steps, which means there is an internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682 error in the data in the meta table or in the code that creates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 the mapping paths.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 Caller : Bio::EnsEMBL::AssemblyMapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 sub register_chained {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 my $casm_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 my $from = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 my $seq_region_id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 my $ranges = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 my $to_slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 my $to_seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 if(defined($to_slice)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 if($casm_mapper->first_CoordSystem()->equals($casm_mapper->last_CoordSystem())){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 return $self->_register_chained_special($casm_mapper, $from, $seq_region_id, $ranges, $to_slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 $to_seq_region_id = $to_slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703 if(!defined($to_seq_region_id)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 die "Could not get seq_region_id for to_slice".$to_slice->seq_region_name."\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 my ($start_name, $start_mid_mapper, $start_cs, $start_registry,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709 $end_name, $end_mid_mapper, $end_cs, $end_registry);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 if($from eq 'first') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 $start_name = 'first';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 $start_mid_mapper = $casm_mapper->first_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 $start_cs = $casm_mapper->first_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 $start_registry = $casm_mapper->first_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 $end_mid_mapper = $casm_mapper->last_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717 $end_cs = $casm_mapper->last_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 $end_registry = $casm_mapper->last_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719 $end_name = 'last';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 } elsif($from eq 'last') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 $start_name = 'last';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 $start_mid_mapper = $casm_mapper->last_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 $start_cs = $casm_mapper->last_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 $start_registry = $casm_mapper->last_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 $end_mid_mapper = $casm_mapper->first_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 $end_cs = $casm_mapper->first_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 $end_registry = $casm_mapper->first_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728 $end_name = 'first';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730 throw("Invalid from argument: [$from], must be 'first' or 'last'");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 my $combined_mapper = $casm_mapper->first_last_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 my $mid_cs = $casm_mapper->middle_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 my $mid_name = 'middle';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 # Check for the simple case where the ChainedMapper is short
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740 $start_mid_mapper = $combined_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 ##############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 # obtain the first half of the mappings and load them into the start mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 #ascertain which is component and which is actually assembled coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749 my @path;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 # check for the simple case, where the ChainedMapper is short
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752 if( defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 @path = @{$csa->get_mapping_path($start_cs, $mid_cs)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755 @path = @{$csa->get_mapping_path( $start_cs, $end_cs )};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 if(@path != 2 && defined( $path[1] )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759 my $path = join(',', map({$_->name .' '. $_->version} @path));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 my $len = scalar(@path) - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761 throw("Unexpected mapping path between start and intermediate " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 "coord systems (". $start_cs->name . " " . $start_cs->version .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 " and " . $mid_cs->name . " " . $mid_cs->version . ")." .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 "\nExpected path length 1, got $len. " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 "(path=$path)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 my $sth;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 my ($asm_cs,$cmp_cs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 $asm_cs = $path[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 $cmp_cs = $path[-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 #the SQL varies depending on whether we are coming from assembled or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 #component coordinate system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 my $asm2cmp = (<<ASMCMP);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 asm.cmp_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779 asm.cmp_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 asm.cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 sr.length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783 asm.ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 asm.asm_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 assembly asm, seq_region sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 asm.asm_seq_region_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790 ? <= asm.asm_end AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 ? >= asm.asm_start AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 asm.cmp_seq_region_id = sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 sr.coord_system_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 ASMCMP
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 my $cmp2asm = (<<CMPASM);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 asm.asm_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 asm.asm_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802 sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 sr.length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804 asm.ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 asm.cmp_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 asm.cmp_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 assembly asm, seq_region sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 asm.cmp_seq_region_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 ? <= asm.cmp_end AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 ? >= asm.cmp_start AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 asm.asm_seq_region_id = sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814 sr.coord_system_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 CMPASM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 my $asm2cmp_sth;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818 my $cmp2asm_sth;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 if(defined($to_slice)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 my $to_cs = $to_slice->coord_system;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 if($asm_cs->equals($to_cs)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 $asm2cmp_sth = $self->prepare($asm2cmp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823 $cmp2asm_sth = $self->prepare($cmp2asm." AND asm.asm_seq_region_id = $to_seq_region_id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825 elsif($cmp_cs->equals($to_cs)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 $asm2cmp_sth = $self->prepare($asm2cmp." AND asm.cmp_seq_region_id = $to_seq_region_id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827 $cmp2asm_sth = $self->prepare($cmp2asm);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 $asm2cmp_sth = $self->prepare($asm2cmp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 $cmp2asm_sth = $self->prepare($cmp2asm);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 $asm2cmp_sth = $self->prepare($asm2cmp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836 $cmp2asm_sth = $self->prepare($cmp2asm);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 $sth = ($asm_cs->equals($start_cs)) ? $asm2cmp_sth : $cmp2asm_sth;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 my $mid_cs_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 # check for the simple case where the ChainedMapper is short
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846 if( defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 $mid_cs_id = $mid_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 $mid_cs_id = $end_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 my @mid_ranges;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 my @start_ranges;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 #need to perform the query for each unregistered range
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 foreach my $range (@$ranges) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857 my ($start, $end) = @$range;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858 $sth->bind_param(1,$seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859 $sth->bind_param(2,$start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860 $sth->bind_param(3,$end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 $sth->bind_param(4,$mid_cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 #load the start <-> mid mapper with the results and record the mid cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865 #ranges we just added to the mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 my ($mid_start, $mid_end, $mid_seq_region_id, $mid_seq_region, $mid_length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868 $ori, $start_start, $start_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 $sth->bind_columns(\$mid_start, \$mid_end, \$mid_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 \$mid_seq_region, \$mid_length, \$ori, \$start_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 \$start_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 if( defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877 $start_mid_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 $seq_region_id,$start_start, $start_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 if( $from eq "first" ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 $combined_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 $seq_region_id,$start_start, $start_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 $combined_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 $mid_seq_region_id, $mid_start, $mid_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 $seq_region_id,$start_start, $start_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 #update sr_name cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 my $arr = [ $mid_seq_region_id, $mid_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 $mid_cs_id, $mid_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902 $self->{'sr_name_cache'}->{"$mid_seq_region:$mid_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903 $self->{'sr_id_cache'}->{"$mid_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905 push @mid_ranges,[$mid_seq_region_id,$mid_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 $mid_start,$mid_end];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 push @start_ranges, [ $seq_region_id, $start_start, $start_end ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 #the region that we actually register may actually be larger or smaller
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910 #than the region that we wanted to register.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911 #register the intersection of the region so we do not end up doing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 #extra work later
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914 if($start_start < $start || $start_end > $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915 $start_registry->check_and_register($seq_region_id,$start_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 $start_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922 # in the one step case, we load the mid ranges in the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 # last_registry and we are done
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925 for my $range ( @mid_ranges ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 $end_registry->check_and_register( $range->[0], $range->[2],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927 $range->[3] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 # and thats it for the simple case ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 ###########
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936 # now the second half of the mapping
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 # perform another query and load the mid <-> end mapper using the mid cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938 # ranges
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941 #ascertain which is component and which is actually assembled coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942 @path = @{$csa->get_mapping_path($mid_cs, $end_cs)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943 if(@path == 2 || ( @path == 3 && !defined $path[1])) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945 $asm_cs = $path[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946 $cmp_cs = $path[-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948 my $path = join(',', map({$_->name .' '. $_->version} @path));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949 my $len = scalar(@path)-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950 throw("Unexpected mapping path between intermediate and last" .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 "coord systems (". $mid_cs->name . " " . $mid_cs->version .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952 " and " . $end_cs->name . " " . $end_cs->version . ")." .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953 "\nExpected path length 1, got $len. " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 "(path=$path)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957 if(defined($to_slice)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958 my $to_cs = $to_slice->coord_system;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959 if($asm_cs->equals($to_cs)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960 $asm2cmp_sth = $self->prepare($asm2cmp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961 $cmp2asm_sth = $self->prepare($cmp2asm." AND asm.asm_seq_region_id = $to_seq_region_id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963 elsif($cmp_cs->equals($to_cs)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964 $asm2cmp_sth = $self->prepare($asm2cmp." AND asm.cmp_seq_region_id = $to_seq_region_id");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965 $cmp2asm_sth = $self->prepare($cmp2asm);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968 $asm2cmp_sth = $self->prepare($asm2cmp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969 $cmp2asm_sth = $self->prepare($cmp2asm);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973 $sth = ($asm_cs->equals($mid_cs)) ? $asm2cmp_sth : $cmp2asm_sth;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 my $end_cs_id = $end_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 foreach my $mid_range (@mid_ranges) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 my ($mid_seq_region_id, $mid_seq_region,$start, $end) = @$mid_range;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978 $sth->bind_param(1,$mid_seq_region_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979 $sth->bind_param(2,$start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980 $sth->bind_param(3,$end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981 $sth->bind_param(4,$end_cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984 #load the end <-> mid mapper with the results and record the mid cs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985 #ranges we just added to the mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987 my ($end_start, $end_end, $end_seq_region_id, $end_seq_region, $end_length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988 $ori, $mid_start, $mid_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
989
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
990 $sth->bind_columns(\$end_start, \$end_end, \$end_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
991 \$end_seq_region, \$end_length, \$ori, \$mid_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
992 \$mid_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
993
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
994 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
995 $end_mid_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
996 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
997 $end_seq_region_id, $end_start, $end_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
998 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
999 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1000
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1001 #update sr_name cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1002 my $arr = [ $end_seq_region_id,$end_seq_region,$end_cs_id,$end_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1003
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1004 $self->{'sr_name_cache'}->{"$end_seq_region:$end_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1005 $self->{'sr_id_cache'}->{"$end_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1006
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1007 #register this region on the end coord system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1008 $end_registry->check_and_register($end_seq_region_id, $end_start, $end_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1009 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1010 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1011 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1012
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1013 #########
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1014 # Now that both halves are loaded
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1015 # Do stepwise mapping using both of the loaded mappers to load
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1016 # the final start <-> end mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1017 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1018
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1019 _build_combined_mapper(\@start_ranges, $start_mid_mapper, $end_mid_mapper,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1020 $combined_mapper, $start_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1021 #all done!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1022 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1023 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1024
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1025
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1026 =head2 _register_chained_special
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1027
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1028 Arg [1] : Bio::EnsEMBL::ChainedAssemblyMapper $casm_mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1029 The chained assembly mapper to register regions on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1030 Arg [2] : string $from ('first' or 'last')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1031 The direction we are registering from, and the name of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1032 internal mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1033 Arg [3] : string $seq_region_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1034 The name of the seqregion we are registering on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1035 Arg [4] : listref $ranges
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1036 A list of ranges to register (in [$start,$end] tuples).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1037 Arg [5] : (optional) $to_slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1038 Only register those on this Slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1039 Description: Registers a set of ranges on a chained assembly mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1040 This function is at the heart of the chained mapping process.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1041 It retrieves information from the assembly table and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1042 dynamically constructs the mappings between two coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1043 systems which are 2 mapping steps apart. It does this by using
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1044 two internal mappers to load up a third mapper which is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1045 actually used by the ChainedAssemblyMapper to perform the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1046 mapping.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1047
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1048 This method must be called before any mapping is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1049 attempted on regions of interest, otherwise only gaps will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1050 be returned. Note that the ChainedAssemblyMapper automatically
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1051 calls this method when the need arises.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1052 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1053 Exceptions : throw if the seq_region to be registered does not exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1054 or if it associated with multiple assembled pieces (bad data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1055 in assembly table)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1056
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1057 throw if the mapping between the coordinate systems cannot
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1058 be performed in two steps, which means there is an internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1059 error in the data in the meta table or in the code that creates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1060 the mapping paths.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1061 Caller : Bio::EnsEMBL::AssemblyMapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1062 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1063
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1064 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1065
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1066 sub _register_chained_special {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1067 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1068 my $casm_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1069 my $from = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1070 my $seq_region_id = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1071 my $ranges = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1072 my $to_slice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1073 my $found = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1074
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1075 my $sth = $self->prepare("SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1076 asm.cmp_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1077 asm.cmp_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1078 asm.cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1079 sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1080 sr.length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1081 asm.ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1082 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1083 asm.asm_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1084 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1085 assembly asm, seq_region sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1086 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1087 asm.asm_seq_region_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1088 ? <= asm.asm_end AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1089 ? >= asm.asm_start AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1090 asm.cmp_seq_region_id = sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1091 sr.coord_system_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1092 asm.cmp_seq_region_id = ?");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1093
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1094
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1095 my ($start_name, $start_mid_mapper, $start_cs, $start_registry,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1096 $end_name, $end_mid_mapper, $end_cs, $end_registry);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1097
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1098 if($from eq 'first') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1099 $start_name = 'first';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1100 $start_mid_mapper = $casm_mapper->first_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1101 $start_cs = $casm_mapper->first_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1102 $start_registry = $casm_mapper->first_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1103 $end_mid_mapper = $casm_mapper->last_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1104 $end_cs = $casm_mapper->last_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1105 $end_registry = $casm_mapper->last_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1106 $end_name = 'last';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1107 } elsif($from eq 'last') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1108 $start_name = 'last';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1109 $start_mid_mapper = $casm_mapper->last_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1110 $start_cs = $casm_mapper->last_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1111 $start_registry = $casm_mapper->last_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1112 $end_mid_mapper = $casm_mapper->first_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1113 $end_cs = $casm_mapper->first_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1114 $end_registry = $casm_mapper->first_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1115 $end_name = 'first';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1116 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1117 throw("Invalid from argument: [$from], must be 'first' or 'last'");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1118 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1120 my $combined_mapper = $casm_mapper->first_last_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1121 my $mid_cs = $casm_mapper->middle_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1122 my $mid_name = 'middle';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1123 my $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1124
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1125 # Check for the simple case where the ChainedMapper is short
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1126 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1127 $start_mid_mapper = $combined_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1128 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1130
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1131 my @path;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1132 if( defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1133 @path = @{$csa->get_mapping_path($start_cs, $mid_cs)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1134 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1135 @path = @{$csa->get_mapping_path( $start_cs, $end_cs )};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1136 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1137 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1138 $start_mid_mapper = $combined_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1139 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1140
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1141 if(@path != 2 && defined( $path[1] )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1142 my $path = join(',', map({$_->name .' '. $_->version} @path));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1143 my $len = scalar(@path) - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1144 throw("Unexpected mapping path between start and intermediate " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1145 "coord systems (". $start_cs->name . " " . $start_cs->version .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1146 " and " . $mid_cs->name . " " . $mid_cs->version . ")." .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1147 "\nExpected path length 1, got $len. " .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1148 "(path=$path)");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1149 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1151 my ($asm_cs,$cmp_cs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1152 $asm_cs = $path[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1153 $cmp_cs = $path[-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1155 $combined_mapper = $casm_mapper->first_last_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1156 $mid_cs = $casm_mapper->middle_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1157 $mid_name = 'middle';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1158 $csa = $self->db->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1160 my $mid_cs_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1161
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1162 # Check for the simple case where the ChainedMapper is short
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1163 if ( !defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1164 $start_mid_mapper = $combined_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1165 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1166 $mid_cs_id = $mid_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1167 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1168
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1169 my @mid_ranges;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1170 my @start_ranges;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1171
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1172 my $to_cs = $to_slice->coord_system;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1173 foreach my $direction (1, 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1174 my $id1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1175 my $id2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1176 if($direction){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1177 $id1 = $seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1178 $id2 = $to_slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1179 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1180 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1181 $id2 = $seq_region_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1182 $id1 = $to_slice->get_seq_region_id();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1183 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1185 foreach my $range (@$ranges) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1186 my ($start, $end) = @$range;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1187 $sth->bind_param(1,$id1,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1188 $sth->bind_param(2,$start,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1189 $sth->bind_param(3,$end,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1190 $sth->bind_param(4,$to_cs->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1191 $sth->bind_param(5,$id2,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1192 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1194 my ($mid_start, $mid_end, $mid_seq_region_id, $mid_seq_region, $mid_length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1195 $ori, $start_start, $start_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1196
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1197 $sth->bind_columns(\$mid_start, \$mid_end, \$mid_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1198 \$mid_seq_region, \$mid_length, \$ori, \$start_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1199 \$start_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1201 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1202 $found = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1203
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1204 if( defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1205 $start_mid_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1206 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1207 $id1,$start_start, $start_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1208 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1209 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1210 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1211 if( $from eq "first") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1212 if($direction){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1213 $combined_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1214 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1215 $id1,$start_start, $start_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1216 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1217 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1218 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1219 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1220 $combined_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1221 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1222 $mid_seq_region_id, $mid_start, $mid_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1223 $id1,$start_start, $start_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1224 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1225 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1226 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1227 if($direction){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1228 $combined_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1229 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1230 $mid_seq_region_id, $mid_start, $mid_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1231 $id1,$start_start, $start_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1232 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1233 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1234 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1235 $combined_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1236 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1237 $id1,$start_start, $start_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1238 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1239 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1240 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1241 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1242 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1244 #update sr_name cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1245 my $arr = [ $mid_seq_region_id, $mid_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1246 $mid_cs_id, $mid_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1247
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1248 $self->{'sr_name_cache'}->{"$mid_seq_region:$mid_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1249 $self->{'sr_id_cache'}->{"$mid_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1251 push @mid_ranges,[$mid_seq_region_id,$mid_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1252 $mid_start,$mid_end];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1253 push @start_ranges, [ $id1, $start_start, $start_end ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1255 #the region that we actually register may actually be larger or smaller
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1256 #than the region that we wanted to register.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1257 #register the intersection of the region so we do not end up doing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1258 #extra work later
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1259
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1260 if($start_start < $start || $start_end > $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1261 $start_registry->check_and_register($id1,$start_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1262 $start_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1263 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1264 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1265 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1267 if($found){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1268 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1269 for my $range ( @mid_ranges ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1270 $end_registry->check_and_register( $range->[0], $range->[2],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1271 $range->[3] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1272 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1273
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1274 # and thats it for the simple case ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1275 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1276 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1277 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1278 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1279 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1280
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1281
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1282 =head2 register_all
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1284 Arg [1] : Bio::EnsEMBL::AssemblyMapper $mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1285 Example : $mapper = $asm_mapper_adaptor->fetch_by_CoordSystems($cs1,$cs2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1286
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1287 # make cache large enough to hold all of the mappings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1288 $mapper->max_pair_count(10e6);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1289 $asm_mapper_adaptor->register_all($mapper);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1290
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1291 # perform mappings as normal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1292 $mapper->map($slice->seq_region_name(), $sr_start, $sr_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1293 $sr_strand, $cs1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1294 ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1295 Description: This function registers the entire set of mappings between
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1296 two coordinate systems in an assembly mapper.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1297 This will use a lot of memory but will be much more efficient
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1298 when doing a lot of mapping which is spread over the entire
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1299 genome.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1300 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1301 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1302 Caller : specialised prograhsm
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1303 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1304
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1305 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1306
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1307 sub register_all {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1308 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1309 my $mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1311 my $asm_cs_id = $mapper->assembled_CoordSystem()->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1312 my $cmp_cs_id = $mapper->component_CoordSystem()->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1314 # retrieve every relevant assembled/component pair from the assembly table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1316 my $q = qq{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1317 SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1318 asm.cmp_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1319 asm.cmp_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1320 asm.cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1321 cmp_sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1322 cmp_sr.length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1323 asm.ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1324 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1325 asm.asm_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1326 asm.asm_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1327 asm_sr.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1328 asm_sr.length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1329 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1330 assembly asm, seq_region asm_sr, seq_region cmp_sr
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1331 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1332 asm.cmp_seq_region_id = cmp_sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1333 asm.asm_seq_region_id = asm_sr.seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1334 cmp_sr.coord_system_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1335 asm_sr.coord_system_id = ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1336 };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1337
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1338 my $sth = $self->prepare($q);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1339
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1340 $sth->bind_param(1,$cmp_cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1341 $sth->bind_param(2,$asm_cs_id,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1342 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1343
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1344 # load the mapper with the assembly information
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1345
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1346 my ($cmp_start, $cmp_end, $cmp_seq_region_id, $cmp_seq_region, $cmp_length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1347 $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1348 $asm_start, $asm_end, $asm_seq_region_id, $asm_seq_region, $asm_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1349
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1350 $sth->bind_columns(\$cmp_start, \$cmp_end, \$cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1351 \$cmp_seq_region, \$cmp_length, \$ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1352 \$asm_start, \$asm_end, \$asm_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1353 \$asm_seq_region, \$asm_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1354
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1355 my %asm_registered;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1357 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1358 $mapper->register_component($cmp_seq_region_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1359 $mapper->mapper->add_map_coordinates(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1360 $asm_seq_region_id, $asm_start, $asm_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1361 $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1362 $cmp_seq_region_id, $cmp_start, $cmp_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1363
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1364 my $arr = [$cmp_seq_region_id, $cmp_seq_region, $cmp_cs_id, $cmp_length];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1365
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1366 $self->{'sr_name_cache'}->{"$cmp_seq_region:$cmp_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1367 $self->{'sr_id_cache'}->{"$cmp_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1368
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1369 # only register each asm seq_region once since it requires some work
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1370 if(!$asm_registered{$asm_seq_region_id}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1371 $asm_registered{$asm_seq_region_id} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1372
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1373 # register all chunks from start of seq region to end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1374 my $end_chunk = $asm_length >> $CHUNKFACTOR;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1375 for(my $i = 0; $i <= $end_chunk; $i++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1376 $mapper->register_assembled($asm_seq_region_id, $i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1377 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1379 $arr = [$asm_seq_region_id, $asm_seq_region, $asm_cs_id, $asm_length];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1380
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1381 $self->{'sr_name_cache'}->{"$asm_seq_region:$asm_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1382 $self->{'sr_id_cache'}->{"$asm_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1383 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1384 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1385
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1386 $sth->finish();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1387
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1388 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1389 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1390
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1391
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1393 =head2 register_all_chained
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1394
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1395 Arg [1] : Bio::EnsEMBL::ChainedAssemblyMapper $casm_mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1396 Example : $mapper = $asm_mapper_adaptor->fetch_by_CoordSystems($cs1,$cs2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1397
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1398 # make the cache large enough to hold all of the mappings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1399 $mapper->max_pair_count(10e6);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1400 # load all of the mapping data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1401 $asm_mapper_adaptor->register_all_chained($mapper);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1402
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1403 # perform mappings as normal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1404 $mapper->map($slice->seq_region_name(), $sr_start, $sr_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1405 $sr_strand, $cs1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1406 ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1407 Description: This function registers the entire set of mappings between
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1408 two coordinate systems in a chained mapper. This will use a lot
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1409 of memory but will be much more efficient when doing a lot of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1410 mapping which is spread over the entire genome.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1411 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1412 Exceptions : throw if mapper is between coord systems with unexpected
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1413 mapping paths
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1414 Caller : specialised programs doing a lot of genome-wide mapping
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1415 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1416
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1417 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1418
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1419 sub register_all_chained {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1420 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1421 my $casm_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1422
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1423 my $first_cs = $casm_mapper->first_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1424 my $mid_cs = $casm_mapper->middle_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1425 my $last_cs = $casm_mapper->last_CoordSystem();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1426
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1427 my $start_mid_mapper = $casm_mapper->first_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1428 my $end_mid_mapper = $casm_mapper->last_middle_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1429 my $combined_mapper = $casm_mapper->first_last_mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1430
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1431 my @ranges;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1432
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1433 my $sth = $self->prepare(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1434 'SELECT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1435 asm.cmp_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1436 asm.cmp_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1437 asm.cmp_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1438 sr_cmp.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1439 sr_cmp.length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1440 asm.ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1441 asm.asm_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1442 asm.asm_end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1443 asm.asm_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1444 sr_asm.name,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1445 sr_asm.length
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1446 FROM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1447 assembly asm, seq_region sr_asm, seq_region sr_cmp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1448 WHERE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1449 sr_asm.seq_region_id = asm.asm_seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1450 sr_cmp.seq_region_id = asm.cmp_seq_region_id AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1451 sr_asm.coord_system_id = ? AND
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1452 sr_cmp.coord_system_id = ?');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1453
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1454 my $csa = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1455
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1456 my @path;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1457
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1458 if ( !defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1459 @path = @{ $csa->get_mapping_path( $first_cs, $last_cs ) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1460 if ( !defined( $path[1] ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1461 splice( @path, 1, 1 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1462 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1463 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1464 @path = @{ $csa->get_mapping_path( $first_cs, $mid_cs ) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1465 # fix for when we have something like supercontig#contig#chromosome
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1466 if ( !defined( $path[1] ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1467 splice( @path, 1, 1 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1468 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1469 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1470
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1471 if ( @path != 2 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1472 my $path =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1473 join( ',', map( { $_->name . ' ' . $_->version } @path ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1474 my $len = scalar(@path) - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1475 throw( "Unexpected mapping path between start and intermediate "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1476 . "coord systems ("
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1477 . $first_cs->name . " "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1478 . $first_cs->version . " and "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1479 . $mid_cs->name . " "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1480 . $mid_cs->version . ")."
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1481 . "\nExpected path length 1, got $len. "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1482 . "(path=$path)" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1483 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1484
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1485 my ($asm_cs,$cmp_cs) = @path;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1486
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1487 $sth->{mysql_use_result} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1488 $sth->bind_param(1,$asm_cs->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1489 $sth->bind_param(2,$cmp_cs->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1490 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1491
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1492
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1493 my ($mid_start, $mid_end, $mid_seq_region_id, $mid_seq_region, $mid_length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1494 $ori, $start_start, $start_end, $start_seq_region_id, $start_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1495 $start_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1496
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1497 if($asm_cs->equals($first_cs)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1498 $sth->bind_columns(\$mid_start, \$mid_end, \$mid_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1499 \$mid_seq_region, \$mid_length, \$ori, \$start_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1500 \$start_end, \$start_seq_region_id, \$start_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1501 \$start_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1502 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1503 $sth->bind_columns(\$start_start, \$start_end, \$start_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1504 \$start_seq_region, \$start_length, \$ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1505 \$mid_start, \$mid_end, \$mid_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1506 \$mid_seq_region, \$mid_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1507
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1508 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1509
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1510 my ( $mid_cs_id, $start_cs_id, $reg, $mapper );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1511 if ( !defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1512 $mid_cs_id = $last_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1513 $start_cs_id = $first_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1514 $mapper = $combined_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1515 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1516 $mid_cs_id = $mid_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1517 $start_cs_id = $first_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1518 $mapper = $start_mid_mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1519 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1520
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1521 $reg = $casm_mapper->first_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1522
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1523 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1524 $mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1525 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1526 $start_seq_region_id, $start_start, $start_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1527 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1528 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1529 push( @ranges, [$start_seq_region_id, $start_start, $start_end ] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1530
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1531 $reg->check_and_register( $start_seq_region_id, 1, $start_length );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1532 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1533 $casm_mapper->last_registry()->check_and_register
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1534 ( $mid_seq_region_id, $mid_start, $mid_end );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1535 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1536
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1537 my $arr = [ $mid_seq_region_id, $mid_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1538 $mid_cs_id, $mid_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1539
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1540 $self->{'sr_name_cache'}->{"$mid_seq_region:$mid_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1541 $self->{'sr_id_cache'}->{"$mid_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1542
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1543 $arr = [ $start_seq_region_id, $start_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1544 $start_cs_id, $start_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1545
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1546 $self->{'sr_name_cache'}->{"$start_seq_region:$start_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1547 $self->{'sr_id_cache'}->{"$start_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1548 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1550 if( ! defined $mid_cs ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1551 # thats it for the simple case
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1552 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1553 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1554
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1555
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1556 @path = @{ $csa->get_mapping_path( $last_cs, $mid_cs ) };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1557 if ( defined($mid_cs) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1558 if ( !defined( $path[1] ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1559 splice( @path, 1, 1 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1560 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1561 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1562
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1563 if ( @path != 2 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1564 my $path =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1565 join( ',', map( { $_->name . ' ' . $_->version } @path ) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1566 my $len = scalar(@path) - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1567 throw( "Unexpected mapping path between intermediate and last "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1568 . "coord systems ("
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1569 . $last_cs->name . " "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1570 . $last_cs->version . " and "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1571 . $mid_cs->name . " "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1572 . $mid_cs->version . ")."
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1573 . "\nExpected path length 1, got $len. "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1574 . "(path=$path)" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1575 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1576
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1577 ($asm_cs,$cmp_cs) = @path;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1578
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1579 $sth->bind_param(1,$asm_cs->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1580 $sth->bind_param(2,$cmp_cs->dbID,SQL_INTEGER);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1581 $sth->execute();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1582
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1583
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1584 my ($end_start, $end_end, $end_seq_region_id, $end_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1585 $end_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1586
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1587 if($asm_cs->equals($mid_cs)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1588 $sth->bind_columns(\$end_start, \$end_end, \$end_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1589 \$end_seq_region, \$end_length, \$ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1590 \$mid_start, \$mid_end, \$mid_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1591 \$mid_seq_region, \$mid_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1592 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1593 $sth->bind_columns(\$mid_start, \$mid_end, \$mid_seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1594 \$mid_seq_region, \$mid_length, \$ori, \$end_start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1595 \$end_end, \$end_seq_region_id, \$end_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1596 \$end_length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1597 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1598
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1599 my $end_cs_id = $last_cs->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1600 $reg = $casm_mapper->last_registry();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1601
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1602 while($sth->fetch()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1603 $end_mid_mapper->add_map_coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1604 (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1605 $end_seq_region_id, $end_start, $end_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1606 $mid_seq_region_id, $mid_start, $mid_end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1607 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1608
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1609 $reg->check_and_register( $end_seq_region_id, 1, $end_length );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1611 my $arr = [ $end_seq_region_id, $end_seq_region,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1612 $end_cs_id, $end_length ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1613 $self->{'sr_name_cache'}->{"$end_seq_region:$end_cs_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1614 $self->{'sr_id_cache'}->{"$end_seq_region_id"} = $arr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1615 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1617 _build_combined_mapper( \@ranges, $start_mid_mapper, $end_mid_mapper,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1618 $combined_mapper, "first" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1619
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1620 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1621 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1622
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1623
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1624
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1625 # after both halves of a chained mapper are loaded
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1626 # this function maps all ranges in $ranges and loads the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1627 # results into the combined mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1628 sub _build_combined_mapper {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1629 my $ranges = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1630 my $start_mid_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1631 my $end_mid_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1632 my $combined_mapper = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1633 my $start_name = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1634
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1635 my $mid_name = "middle";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1636
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1637 foreach my $range (@$ranges) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1638 my ( $seq_region_id, $start, $end) = @$range;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1639
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1640 my $sum = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1641
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1642 my @initial_coords = $start_mid_mapper->map_coordinates($seq_region_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1643 $start,$end,1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1644 $start_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1645
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1646 foreach my $icoord (@initial_coords) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1647 #skip gaps
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1648 if($icoord->isa('Bio::EnsEMBL::Mapper::Gap')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1649 $sum += $icoord->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1650 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1651 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1652
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1653
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1654 #feed the results of the first mapping into the second mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1655 my @final_coords =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1656 $end_mid_mapper->map_coordinates($icoord->id, $icoord->start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1657 $icoord->end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1658 $icoord->strand, $mid_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1659
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1660
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1661 foreach my $fcoord (@final_coords) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1662 #load up the final mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1663
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1664 if($fcoord->isa('Bio::EnsEMBL::Mapper::Coordinate')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1665 my $total_start = $start + $sum;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1666 my $total_end = $total_start + $fcoord->length - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1667 my $ori = $fcoord->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1668
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1669 if($start_name eq 'first') { # add coords in consistant order
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1670 $combined_mapper->add_map_coordinates(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1671 $seq_region_id, $total_start, $total_end, $ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1672 $fcoord->id(), $fcoord->start(), $fcoord->end());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1673 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1674 $combined_mapper->add_map_coordinates(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1675 $fcoord->id(), $fcoord->start(), $fcoord->end(),$ori,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1676 $seq_region_id, $total_start, $total_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1677 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1678
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1679 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1680 $sum += $fcoord->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1681 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1682 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1683 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1684 #all done!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1685 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1686
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1687
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1688 =head2 seq_regions_to_ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1689
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1690 Arg [1] : Bio::EnsEMBL::CoordSystem $coord_system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1691 Arg [2] : listref of strings $seq_regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1692 Example : my @ids = @{$asma->seq_regions_to_ids($coord_sys, \@seq_regs)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1693 Description: Converts a list of seq_region names to internal identifiers
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1694 using the internal cache that has accumulated while registering
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1695 regions for AssemblyMappers. If any requested regions are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1696 not found in the cache an attempt is made to retrieve them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1697 from the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1698 Returntype : listref of ints
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1699 Exceptions : throw if a non-existant seqregion is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1700 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1701 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1702
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1703 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1704
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1705 sub seq_regions_to_ids {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1706 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1707 my $coord_system = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1708 my $seq_regions = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1709
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1710 my $cs_id = $coord_system->dbID();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1711
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1712 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1713
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1714 foreach my $sr (@$seq_regions) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1715 my $arr = $self->{'sr_name_cache'}->{"$sr:$cs_id"};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1716 if( $arr ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1717 push( @out, $arr->[0] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1718 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1719 push @out, $self->_seq_region_name_to_id($sr,$cs_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1720 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1721 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1722
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1723 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1724 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1725
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1726
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1727 =head2 seq_ids_to_regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1728
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1729 Arg [1] : listref of seq_region ids
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1730 Example : my @ids = @{$asma->ids_to_seq_regions(\@seq_ids)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1731 Description: Converts a list of seq_region ids to seq region names
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1732 using the internal cache that has accumulated while registering
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1733 regions for AssemblyMappers. If any requested regions are
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1734 not found in the cache an attempt is made to retrieve them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1735 from the database.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1736 Returntype : listref of strings
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1737 Exceptions : throw if a non-existant seq_region_id is provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1738 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1739 Status : Stable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1740
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1741 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1742
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1743 sub seq_ids_to_regions {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1744 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1745 my $seq_region_ids = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1746
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1747 my @out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1748
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1749 foreach my $sr (@$seq_region_ids) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1750 my $arr = $self->{'sr_id_cache'}->{"$sr"};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1751 if( $arr ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1752 push( @out, $arr->[1] );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1753 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1754 push @out, $self->_seq_region_id_to_name($sr);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1755 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1756 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1757
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1758 return \@out;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1759 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1760
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1761 =head2 delete_cache
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1762
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1763 Description: Delete all the caches for the mappings/seq_regions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1764 Returntype : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1765 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1766 Caller : General
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1767 Status : At risk
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1768
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1769 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1770
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1771 sub delete_cache{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1772 my ($self) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1773
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1774 %{$self->{'sr_name_cache'}} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1775 %{$self->{'sr_id_cache'}} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1776
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1777 foreach my $key (keys %{$self->{'_asm_mapper_cache'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1778 $self->{'_asm_mapper_cache'}->{$key}->flush();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1779 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1780 %{$self->{'_asm_mapper_cache'}} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1781 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1782 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1783
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1784
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1785 =head2 register_region
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1786
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1787 Description: DEPRECATED use register_assembled instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1788
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1789 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1790
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1791 sub register_region{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1792 my ($self, $assmapper, $type, $chr_name, $start, $end) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1793
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1794 deprecate('Use register_assembled instead');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1795
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1796 $self->register_assembled($assmapper, $chr_name, $start, $end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1797 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1798
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1799
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1800 =head2 register_contig
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1801
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1802 Description: DEPRECATED use register_component instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1803
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1804 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1805
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1806 sub register_contig {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1807 my ($self, $assmapper, $type, $contig_id ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1808
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1809 deprecate('Use register_component instead');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1810
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1811 #not sure if the use is passing in a seq_region_name or a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1812 #seq_region_id...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1813 register_component($assmapper, $contig_id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1814 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1815
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1816
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1817 =head2 fetch_by_type
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1818
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1819 Description: DEPRECATED use fetch_by_CoordSystems instead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1820
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1821 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1822
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1823 sub fetch_by_type{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1824 my ($self,$type) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1825
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1826 deprecate('Use fetch_by_CoordSystems instead');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1827
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1828 #assume that what the user wanted was a mapper between the sequence coord
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1829 #level and the top coord level
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1830
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1831 my $csa = $self->db()->get_CoordSystemAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1832
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1833 my $cs1 = $csa->fetch_top_level($type);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1834 my $cs2 = $csa->fetch_sequence_level();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1835
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1836 return $self->fetch_by_CoordSystems($cs1,$cs2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1837 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1838
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1839
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1840
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1841 1;