annotate variant_effect_predictor/Bio/EnsEMBL/Compara/GenomicAlign.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 =head1 LICENSE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 This software is distributed under a modified Apache license.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 For license details, please see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 =head1 CONTACT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 <helpdesk@ensembl.org>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 Bio::EnsEMBL::Compara::GenomicAlign - Defines one of the sequences involved in a genomic alignment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 use Bio::EnsEMBL::Compara::GenomicAlign;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 my $genomic_align = new Bio::EnsEMBL::Compara::GenomicAlign(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 -adaptor => $genomic_align_adaptor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 -genomic_align_block => $genomic_align_block,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 -method_link_species_set => $method_link_species_set,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 -dnafrag => $dnafrag,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 -dnafrag_start => 100001,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 -dnafrag_end => 100050,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 -dnafrag_strand => -1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 -aligned_sequence => "TTGCAGGTAGGCCATCTGCAAGC----TGAGGAGCAAGGACTCCAGTCGGAGTC"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 -visible => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 SET VALUES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 $genomic_align->adaptor($adaptor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 $genomic_align->dbID(12);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 $genomic_align->genomic_align_block($genomic_align_block);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 $genomic_align->genomic_align_block_id(1032);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 $genomic_align->method_link_species_set($method_link_species_set);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 $genomic_align->method_link_species_set_id(3);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 $genomic_align->dnafrag($dnafrag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 $genomic_align->dnafrag_id(134);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 $genomic_align->dnafrag_start(100001);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 $genomic_align->dnafrag_end(100050);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 $genomic_align->dnafrag_strand(-1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 $genomic_align->aligned_sequence("TTGCAGGTAGGCCATCTGCAAGC----TGAGGAGCAAGGACTCCAGTCGGAGTC");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 $genomic_align->original_sequence("TTGCAGGTAGGCCATCTGCAAGCTGAGGAGCAAGGACTCCAGTCGGAGTC");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 $genomic_align->cigar_line("23M4D27M");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 $genomic_align->visible(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 GET VALUES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 $adaptor = $genomic_align->adaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 $dbID = $genomic_align->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 $genomic_align_block = $genomic_align->genomic_block;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 $genomic_align_block_id = $genomic_align->genomic_align_block_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 $method_link_species_set = $genomic_align->method_link_species_set;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 $method_link_species_set_id = $genomic_align->method_link_species_set_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 $dnafrag = $genomic_align->dnafrag;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 $dnafrag_id = $genomic_align->dnafrag_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 $dnafrag_start = $genomic_align->dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 $dnafrag_end = $genomic_align->dnafrag_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 $dnafrag_strand = $genomic_align->dnafrag_strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 $aligned_sequence = $genomic_align->aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 $original_sequence = $genomic_align->original_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 $cigar_line = $genomic_align->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 $visible = $genomic_align->visible;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 $slice = $genomic_align->get_Slice();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 The GenomicAlign object stores information about a single sequence within an alignment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 =head1 OBJECT ATTRIBUTES
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 =over
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 =item dbID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 corresponds to genomic_align.genomic_align_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 =item adaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor object to access DB
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 =item genomic_align_block_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 corresponds to genomic_align_block.genomic_align_block_id (ext. reference)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 =item genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 Bio::EnsEMBL::Compara::DBSQL::GenomicAlignBlock object corresponding to genomic_align_block_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 =item method_link_species_set_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 corresponds to method_link_species_set.method_link_species_set_id (external ref.)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 =item method_link_species_set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 Bio::EnsEMBL::Compara::DBSQL::MethodLinkSpeciesSet object corresponding to method_link_species_set_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 =item dnafrag_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 corresponds to dnafrag.dnafrag_id (external ref.)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 =item dnafrag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 Bio::EnsEMBL::Compara::DnaFrag object corresponding to dnafrag_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 =item dnafrag_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 corresponds to genomic_align.dnafrag_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 =item dnafrag_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 corresponds to genomic_align.dnafrag_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 =item dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 corresponds to genomic_align.dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 =item cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 corresponds to genomic_align.cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 =item visible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 corresponds to genomic_align.visible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 =item aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 corresponds to the sequence rebuilt using dnafrag and cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 =item original_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 corresponds to the original sequence. It can be rebuilt from the aligned_sequence, the dnafrag object or can be used
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 in conjuction with cigar_line to get the aligned_sequence.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 # Let the code begin...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 package Bio::EnsEMBL::Compara::GenomicAlign;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate verbose);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 use Scalar::Util qw(weaken);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 use Bio::EnsEMBL::Compara::BaseGenomicAlignSet;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 use Bio::EnsEMBL::Compara::MethodLinkSpeciesSet;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 use Bio::EnsEMBL::Mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 =head2 new (CONSTRUCTOR)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 Arg [-DBID] : (opt.) int $dbID (the database internal ID for this object)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 Arg [-ADAPTOR]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 : (opt.) Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor $adaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 (the adaptor for connecting to the database)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 Arg [-GENOMIC_ALIGN_BLOCK]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 : (opt.) Bio::EnsEMBL::Compara::GenomicAlignBlock $genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 (the block to which this Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 belongs to)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 Arg [-GENOMIC_ALIGN_BLOCK_ID]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 : (opt.) int $genomic_align_block_id (the database internal ID for the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 $genomic_align_block)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 Arg [-METHOD_LINK_SPECIES_SET]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 : (opt.) Bio::EnsEMBL::Compara::MethodLinkSpeciesSet $mlss
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 (this defines the type of alignment and the set of species used
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 to get this GenomicAlignBlock)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 Arg [-METHOD_LINK_SPECIES_SET_ID]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 : (opt.) int $mlss_id (the database internal ID for the $mlss)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 Arg [-DNAFRAG]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 : (opt.) Bio::EnsEMBL::Compara::DnaFrag $dnafrag (the genomic
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 sequence object to which this object refers to)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 Arg [-DNAFRAG_ID]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 : (opt.) int $dnafrag_id (the database internal ID for the $dnafrag)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 Arg [-DNAFRAG_START]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 : (opt.) int $dnafrag_start (the starting position of this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 Bio::EnsEMBL::Compara::GenomicAling within its corresponding $dnafrag)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 Arg [-DNAFRAG_END]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 : (opt.) int $dnafrag_end (the ending position of this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 Bio::EnsEMBL::Compara::GenomicAling within its corresponding $dnafrag)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 Arg [-DNAFRAG_STRAND]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 : (opt.) int $dnafrag_strand (1 or -1; defines in which strand of its
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 corresponding $dnafrag this Bio::EnsEMBL::Compara::GenomicAlign is)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 Arg [-ALIGNED_SEQUENCE]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 : (opt.) string $aligned_sequence (the sequence of this object, including
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 gaps and all)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 Arg [-CIGAR_LINE]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 : (opt.) string $cigar_line (a compressed way of representing the indels in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 the $aligned_sequence of this object)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 Arg [-VISIBLE]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 : (opt.) int $visible. Used in self alignments to ensure only one Bio::EnsEMBL::Compara::GenomicAlignBlock is visible when you have more than 1 block covering the same region.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 Example : my $genomic_align = new Bio::EnsEMBL::Compara::GenomicAlign(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 -adaptor => $genomic_align_adaptor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 -genomic_align_block => $genomic_align_block,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 -method_link_species_set => $method_link_species_set,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 -dnafrag => $dnafrag,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 -dnafrag_start => 100001,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 -dnafrag_end => 100050,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 -dnafrag_strand => -1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 -aligned_sequence => "TTGCAGGTAGGCCATCTGCAAGC----TGAGGAGCAAGGACTCCAGTCGGAGTC"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 -visible => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 Description : Creates a new Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 Returntype : Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 my($class, @args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 my $self = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 bless $self,$class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 my ($cigar_line, $adaptor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 $dbID, $genomic_align_block, $genomic_align_block_id, $method_link_species_set,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 $method_link_species_set_id, $dnafrag, $dnafrag_id,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 $dnafrag_start, $dnafrag_end, $dnafrag_strand,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 $aligned_sequence, $visible, $node_id ) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 rearrange([qw(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 CIGAR_LINE ADAPTOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 DBID GENOMIC_ALIGN_BLOCK GENOMIC_ALIGN_BLOCK_ID METHOD_LINK_SPECIES_SET
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 METHOD_LINK_SPECIES_SET_ID DNAFRAG DNAFRAG_ID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 DNAFRAG_START DNAFRAG_END DNAFRAG_STRAND
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 ALIGNED_SEQUENCE VISIBLE NODE_ID)], @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 $self->adaptor( $adaptor ) if defined $adaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 $self->cigar_line( $cigar_line ) if defined $cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 $self->dbID($dbID) if (defined($dbID));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 $self->genomic_align_block($genomic_align_block) if (defined($genomic_align_block));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 $self->genomic_align_block_id($genomic_align_block_id) if (defined($genomic_align_block_id));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 $self->method_link_species_set($method_link_species_set) if (defined($method_link_species_set));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 $self->method_link_species_set_id($method_link_species_set_id) if (defined($method_link_species_set_id));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 $self->dnafrag($dnafrag) if (defined($dnafrag));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 $self->dnafrag_id($dnafrag_id) if (defined($dnafrag_id));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 $self->dnafrag_start($dnafrag_start) if (defined($dnafrag_start));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 $self->dnafrag_end($dnafrag_end) if (defined($dnafrag_end));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 $self->dnafrag_strand($dnafrag_strand) if (defined($dnafrag_strand));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 $self->aligned_sequence($aligned_sequence) if (defined($aligned_sequence));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 $self->visible($visible) if (defined($visible));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 $self->node_id($node_id) if (defined($node_id));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 return $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 =head2 new_fast
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 Arg [1] : hash reference $hashref
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 Example : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 Description: This is an ultra fast constructor which requires knowledge of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 the objects internals to be used.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 Returntype :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 Caller :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 sub new_fast {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 my $hashref = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 return bless $hashref, $class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 =head2 copy (CONSTRUCTOR)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 Arg : -none-
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 Example : my $new_genomic_align = $genomic_align->copy();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 Description : Create a new object with the same attributes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 as this one.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 Returntype : Bio::EnsEMBL::Compara::GenomicAlign (or subclassed) object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 sub copy {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 my $new_copy = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 bless $new_copy, ref($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 while (my ($key, $value) = each %$self) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 $new_copy->{$key} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 return $new_copy;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 =head2 adaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 Arg [1] : Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 Example : $adaptor = $genomic_align->adaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 Example : $genomic_align->adaptor($adaptor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 Description: Getter/Setter for the adaptor this object uses for database
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 interaction.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 Returntype : Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 Exceptions : thrown if $adaptor is not a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 sub adaptor {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 if (@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 $self->{'adaptor'} = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 throw($self->{'adaptor'}." is not a Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 if ($self->{'adaptor'} and !UNIVERSAL::isa($self->{'adaptor'}, "Bio::EnsEMBL::Compara::DBSQL::GenomicAlignAdaptor"));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 return $self->{'adaptor'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 =head2 dbID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 Arg [1] : integer $dbID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 Example : $dbID = $genomic_align->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 Example : $genomic_align->dbID(12);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 Description: Getter/Setter for the attribute dbID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 sub dbID {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 my ($self, $dbID) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 if (defined($dbID)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 $self->{'dbID'} = $dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 return $self->{'dbID'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 =head2 genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 Arg [1] : Bio::EnsEMBL::Compara::GenomicAlignBlock $genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 Example : $genomic_align_block = $genomic_align->genomic_align_block;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 Example : $genomic_align->genomic_align_block($genomic_align_block);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 Description: Getter/Setter for the attribute genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 Returntype : Bio::EnsEMBL::Compara::GenomicAlignBlock object. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 argument is given, the genomic_align_block is not defined but
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 both the genomic_align_block_id and the adaptor are, it tries
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 to fetch the data using the genomic_align_block_id.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 Exception : throws if $genomic_align_block is not a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 Bio::EnsEMBL::Compara::GenomicAlignBlock object or if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 $genomic_align_block does not match a previously defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 genomic_align_block_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 sub genomic_align_block {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 my ($self, $genomic_align_block) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 if (defined($genomic_align_block)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 throw("$genomic_align_block is not a Bio::EnsEMBL::Compara::BaseGenomicAlignSet object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 if (!$genomic_align_block->isa("Bio::EnsEMBL::Compara::BaseGenomicAlignSet"));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 weaken($self->{'genomic_align_block'} = $genomic_align_block);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 ## Add adaptor to genomic_align_block object if possible and needed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 if (!defined($genomic_align_block->{'adaptor'}) and !defined($genomic_align_block->{'_adaptor'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 $genomic_align_block->adaptor($self->adaptor->db->get_GenomicAlignBlockAdaptor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 if ($genomic_align_block->isa("Bio::EnsEMBL::Compara::GenomicAlignBlock")) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 if ($self->{'genomic_align_block_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 if (!$self->{'genomic_align_block'}->{'dbID'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 $self->{'genomic_align_block'}->dbID($self->{'genomic_align_block_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 # warning("Defining both genomic_align_block_id and genomic_align_block");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 throw("dbID of genomic_align_block object does not match previously defined".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 " genomic_align_block_id. If you want to override a".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 " Bio::EnsEMBL::Compara::GenomicAlign object, you can reset the ".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 "genomic_align_block_id using \$genomic_align->genomic_align_block_id(0)")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 if ($self->{'genomic_align_block'}->{'dbID'} != $self->{'genomic_align_block_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 $self->{'genomic_align_block_id'} = $genomic_align_block->{'dbID'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 } elsif (!defined($self->{'genomic_align_block'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 # Try to get the genomic_align_block from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 if (defined($self->genomic_align_block_id) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 # ...from the genomic_align_block_id. Uses genomic_align_block_id function
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 # and not the attribute in the <if> clause because the attribute can be retrieved from other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 # sources if it has not been set before.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 my $genomic_align_block_adaptor = $self->{'adaptor'}->db->get_GenomicAlignBlockAdaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 $self->{'genomic_align_block'} = $genomic_align_block_adaptor->fetch_by_dbID(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 $self->{'genomic_align_block_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 # warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->genomic_align_block".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 # " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 # " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 return $self->{'genomic_align_block'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 =head2 genomic_align_block_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 Arg [1] : integer $genomic_align_block_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 Example : $genomic_align_block_id = $genomic_align->genomic_align_block_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 Example : $genomic_align->genomic_align_block_id(1032);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 Description: Getter/Setter for the attribute genomic_align_block_id. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 argument is given and the genomic_align_block_id is not defined, it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 tries to get the data from other sources like the corresponding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 Bio::EnsEMBL::Compara::GenomicAlignBlock object or the database using
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 Use 0 as argument to clear this attribute.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 Exceptions : thrown if $genomic_align_block_id does not match a previously defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 sub genomic_align_block_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 my ($self, $genomic_align_block_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 if (defined($genomic_align_block_id)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 $self->{'genomic_align_block_id'} = ($genomic_align_block_id or undef);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 if (defined($self->{'genomic_align_block'}) and $self->{'genomic_align_block_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 # warning("Defining both genomic_align_block_id and genomic_align_block");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 throw("genomic_align_block_id does not match previously defined genomic_align_block object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 if ($self->{'genomic_align_block'} and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 $self->{'genomic_align_block'}->dbID != $self->{'genomic_align_block_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464 } elsif (!($self->{'genomic_align_block_id'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 # Try to get the ID from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 if (defined($self->{'genomic_align_block'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 if ($self->{genomic_align_block}->isa("Bio::EnsEMBL::Compara::GenomicAlignBlock")and defined($self->{'genomic_align_block'}->dbID)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 # ...from the corresponding Bio::EnsEMBL::Compara::GenomicAlignBlock object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 $self->{'genomic_align_block_id'} = $self->{'genomic_align_block'}->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 } elsif (defined($self->{'adaptor'}) and defined($self->{'dbID'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 # ...from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 # warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->genomic_align_block_id".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 # " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 # " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 return $self->{'genomic_align_block_id'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485 =head2 method_link_species_set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487 Arg [1] : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet $method_link_species_set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 Example : $method_link_species_set = $genomic_align->method_link_species_set;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 Example : $genomic_align->method_link_species_set($method_link_species_set);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 Description: Getter/Setter for the attribute method_link_species_set. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 argument is given and the method_link_species_set is not defined, it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 tries to get the data from other sources like the corresponding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 Bio::EnsEMBL::Compara::GenomicAlignBlock object or from
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 the method_link_species_set_id.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 Returntype : Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 Exceptions : thrown if $method_link_species_set is not a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497 Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object or if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 $method_link_species_set does not match a previously defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 method_link_species_set_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 sub method_link_species_set {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507 my ($self, $method_link_species_set) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 if (defined($method_link_species_set)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 throw("$method_link_species_set is not a Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 if (!$method_link_species_set->isa("Bio::EnsEMBL::Compara::MethodLinkSpeciesSet"));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 $self->{'method_link_species_set'} = $method_link_species_set;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 if ($self->{'method_link_species_set_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 if (!$self->{'method_link_species_set'}->dbID) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 $self->{'method_link_species_set'}->dbID($self->{'method_link_species_set_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 $self->{'method_link_species_set_id'} = $self->{'method_link_species_set'}->dbID();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 $self->{'method_link_species_set_id'} = $self->{'method_link_species_set'}->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 } elsif (!defined($self->{'method_link_species_set'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 # Try to get the object from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 if (defined($self->genomic_align_block) and ($self->{'genomic_align_block'}->method_link_species_set)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 # ...from the corresponding Bio::EnsEMBL::Compara::GenomicAlignBlock object. Uses genomic_align_block
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 # function and not the attribute in the <if> clause because the attribute can be retrieved from other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528 # sources if it has not been already defined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 $self->{'method_link_species_set'} = $self->genomic_align_block->method_link_species_set;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 } elsif (defined($self->method_link_species_set_id) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 # ...from the method_link_species_set_id. Uses method_link_species_set_id function and not the attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 # in the <if> clause because the attribute can be retrieved from other sources if it has not been
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533 # already defined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 my $method_link_species_set_adaptor = $self->adaptor->db->get_MethodLinkSpeciesSetAdaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535 $self->{'method_link_species_set'} = $method_link_species_set_adaptor->fetch_by_dbID(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 $self->{'method_link_species_set_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->method_link_species_set".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544 return $self->{'method_link_species_set'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 =head2 method_link_species_set_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 Arg [1] : integer $method_link_species_set_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551 Example : $method_link_species_set_id = $genomic_align->method_link_species_set_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 Example : $genomic_align->method_link_species_set_id(3);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 Description: Getter/Setter for the attribute method_link_species_set_id. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 argument is given and the method_link_species_set_id is not defined, it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 tries to get the data from other sources like the corresponding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556 Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object or the database
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558 Use 0 as argument to clear this attribute.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 Exceptions : thrown if $method_link_species_set_id does not match a previously defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561 method_link_species_set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 sub method_link_species_set_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 my ($self, $method_link_species_set_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571 if (defined($method_link_species_set_id)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 $self->{'method_link_species_set_id'} = $method_link_species_set_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 if (defined($self->{'method_link_species_set'}) and $self->{'method_link_species_set_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 $self->{'method_link_species_set'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 } elsif (!$self->{'method_link_species_set_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 # Try to get the ID from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578 if (defined($self->{'method_link_species_set'}) and $self->{'method_link_species_set'}->dbID) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579 # ...from the corresponding Bio::EnsEMBL::Compara::MethodLinkSpeciesSet object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580 $self->{'method_link_species_set_id'} = $self->{'method_link_species_set'}->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581 } elsif (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582 # ...from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->method_link_species_set_id".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591 return $self->{'method_link_species_set_id'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595 =head2 genome_db
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 Arg [1] : Bio::EnsEMBL::Compara::GenomeDB $genome_db
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598 Example : $genome_db = $genomic_align->genome_db;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 Example : $genomic_align->genome_db($genome_db);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 Description: Getter/Setter for the attribute genome_db of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601 the dnafrag. This method is a short cut for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 $genomic_align->dnafrag->genome_db()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 Returntype : Bio::EnsEMBL::Compara::DnaFrag object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 Exceptions : thrown if $genomic_align->dnafrag is not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605 defined and cannot be fetched from other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606 sources.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612 sub genome_db {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613 my ($self, $genome_db) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615 if (defined($genome_db)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616 throw("$genome_db is not a Bio::EnsEMBL::Compara::GenomeDB object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617 if (!UNIVERSAL::isa($genome_db, "Bio::EnsEMBL::Compara::GenomeDB"));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
618 my $dnafrag = $self->dnafrag();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
619 if (!$dnafrag) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
620 throw("Cannot set genome_db if dnafrag does not exist");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
621 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
622 $self->dnafrag->genome_db($genome_db);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
623 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
624 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
625 return $self->dnafrag->genome_db;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
626 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
627
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
628
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
629 =head2 dnafrag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
630
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
631 Arg [1] : Bio::EnsEMBL::Compara::DnaFrag $dnafrag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
632 Example : $dnafrag = $genomic_align->dnafrag;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
633 Example : $genomic_align->dnafrag($dnafrag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
634 Description: Getter/Setter for the attribute dnafrag. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
635 argument is given, the dnafrag is not defined but
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
636 both the dnafrag_id and the adaptor are, it tries
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
637 to fetch the data using the dnafrag_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
638 Returntype : Bio::EnsEMBL::Compara::DnaFrag object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
639 Exceptions : thrown if $dnafrag is not a Bio::EnsEMBL::Compara::DnaFrag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
640 object or if $dnafrag does not match a previously defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
641 dnafrag_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
642 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
643 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
644 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
645
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
646 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
647
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
648 sub dnafrag {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
649 my ($self, $dnafrag) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
650
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
651 if (defined($dnafrag)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
652 throw("$dnafrag is not a Bio::EnsEMBL::Compara::DnaFrag object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
653 if (!$dnafrag->isa("Bio::EnsEMBL::Compara::DnaFrag"));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
654 $self->{'dnafrag'} = $dnafrag;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
655 if ($self->{'dnafrag_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
656 if (!$self->{'dnafrag'}->dbID) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
657 $self->{'dnafrag'}->dbID($self->{'dnafrag_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
658 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
659 # warning("Defining both dnafrag_id and dnafrag");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
660 throw("dnafrag object does not match previously defined dnafrag_id")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
661 if ($self->{'dnafrag'}->dbID != $self->{'dnafrag_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
662 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
663 $self->{'dnafrag_id'} = $self->{'dnafrag'}->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
664 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
665
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
666 } elsif (!defined($self->{'dnafrag'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
667
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
668 # Try to get data from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
669 if (defined($self->dnafrag_id) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
670 # ...from the dnafrag_id. Use dnafrag_id function and not the attribute in the <if>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
671 # clause because the attribute can be retrieved from other sources if it has not been already defined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
672 my $dnafrag_adaptor = $self->adaptor->db->get_DnaFragAdaptor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
673 $self->{'dnafrag'} = $dnafrag_adaptor->fetch_by_dbID($self->{'dnafrag_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
674 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
675 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->dnafrag".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
676 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
677 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
678 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
679 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
680 return $self->{'dnafrag'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
681 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
682
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
683
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
684 =head2 dnafrag_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
685
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
686 Arg [1] : integer $dnafrag_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
687 Example : $dnafrag_id = $genomic_align->dnafrag_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
688 Example : $genomic_align->dnafrag_id(134);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
689 Description: Getter/Setter for the attribute dnafrag_id. If no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
690 argument is given and the dnafrag_id is not defined, it tries to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
691 get the ID from other sources like the corresponding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
692 Bio::EnsEMBL::Compara::DnaFrag object or the database using the dbID
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
693 of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
694 Use 0 as argument to clear this attribute.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
695 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
696 Exceptions : thrown if $dnafrag_id does not match a previously defined
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
697 dnafrag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
698 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
699 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
700 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
701
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
702 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
703
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
704 sub dnafrag_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
705 my ($self, $dnafrag_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
706
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
707 if (defined($dnafrag_id)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
708 $self->{'dnafrag_id'} = $dnafrag_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
709 if (defined($self->{'dnafrag'}) and $self->{'dnafrag_id'}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
710 # warning("Defining both dnafrag_id and dnafrag");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
711 throw("dnafrag_id does not match previously defined dnafrag object")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
712 if ($self->{'dnafrag'} and $self->{'dnafrag'}->dbID != $self->{'dnafrag_id'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
713 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
714
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
715 } elsif (!($self->{'dnafrag_id'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
716 # Try to get the ID from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
717 if (defined($self->{'dnafrag'}) and defined($self->{'dnafrag'}->dbID)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
718 # ...from the corresponding Bio::EnsEMBL::Compara::DnaFrag object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
719 $self->{'dnafrag_id'} = $self->{'dnafrag'}->dbID;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
720 } elsif (defined($self->{'adaptor'}) and defined($self->{'dbID'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
721 # ...from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
722 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
723 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
724 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->dnafrag_id".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
725 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
726 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
727 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
728 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
729
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
730 return $self->{'dnafrag_id'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
731 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
732
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
733
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
734 =head2 dnafrag_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
735
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
736 Arg [1] : integer $dnafrag_start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
737 Example : $dnafrag_start = $genomic_align->dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
738 Example : $genomic_align->dnafrag_start(1233354);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
739 Description: Getter/Setter for the attribute dnafrag_start. If no argument is given, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
740 dnafrag_start is not defined but both the dbID and the adaptor are, it tries
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
741 to fetch and set all the direct attributes from the database using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
742 dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
743 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
744 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
745 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
746 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
747 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
748
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
749 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
750
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
751 sub dnafrag_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
752 my ($self, $dnafrag_start) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
753
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
754 if (defined($dnafrag_start)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
755 $self->{'dnafrag_start'} = $dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
756
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
757 } elsif (!defined($self->{'dnafrag_start'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
758 if (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
759 # Try to get the values from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
760 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
761 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
762 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->dnafrag_start".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
763 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
764 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
765 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
766 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
767
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
768 return $self->{'dnafrag_start'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
769 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
770
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
771
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
772 =head2 dnafrag_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
773
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
774 Arg [1] : integer $dnafrag_end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
775 Example : $dnafrag_end = $genomic_align->dnafrag_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
776 Example : $genomic_align->dnafrag_end(1235320);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
777 Description: Getter/Setter for the attribute dnafrag_end. If no argument is given, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
778 dnafrag_end is not defined but both the dbID and the adaptor are, it tries
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
779 to fetch and set all the direct attributes from the database using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
780 dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
781 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
782 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
783 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
784 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
785 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
786
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
787 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
788
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
789 sub dnafrag_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
790 my ($self, $dnafrag_end) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
791
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
792 if (defined($dnafrag_end)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
793 $self->{'dnafrag_end'} = $dnafrag_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
794
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
795 } elsif (!defined($self->{'dnafrag_end'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
796 if (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
797 # Try to get the values from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
798 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
799 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
800 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->dnafrag_end".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
801 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
802 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
803 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
804 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
805
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
806 return $self->{'dnafrag_end'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
807 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
808
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
809
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
810 =head2 dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
811
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
812 Arg [1] : integer $dnafrag_strand (1 or -1)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
813 Example : $dnafrag_strand = $genomic_align->dnafrag_strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
814 Example : $genomic_align->dnafrag_strand(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
815 Description: Getter/Setter for the attribute dnafrag_strand. If no argument is given, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
816 dnafrag_strand is not defined but both the dbID and the adaptor are, it tries
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
817 to fetch and set all the direct attributes from the database using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
818 dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
819 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
820 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
821 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
822 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
823 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
824
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
825 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
826
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
827 sub dnafrag_strand {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
828 my ($self, $dnafrag_strand) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
829
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
830 if (defined($dnafrag_strand)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
831 $self->{'dnafrag_strand'} = $dnafrag_strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
832
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
833 } elsif (!defined($self->{'dnafrag_strand'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
834 if (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
835 # Try to get the values from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
836 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
837 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
838 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->dnafrag_strand".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
839 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
840 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
841 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
842 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
843
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
844 return $self->{'dnafrag_strand'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
845 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
846
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
847
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
848 =head2 aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
849
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
850 Arg [1...] : string $aligned_sequence or string @flags
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
851 Example : $aligned_sequence = $genomic_align->aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
852 Example : $aligned_sequence = $genomic_align->aligned_sequence("+FIX_SEQ");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
853 Example : $genomic_align->aligned_sequence("ACTAGTTAGCT---TATCT--TTAAA")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
854 Description: With no arguments, rebuilds the alignment string for this sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
855 using the cigar_line information and the original sequence if needed.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
856 This sequence depends on the strand defined by the dnafrag_strand attribute.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
857 Flags : +FIX_SEQ
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
858 With this flag, the method will return a sequence that could be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
859 directly aligned with the original_sequence of the reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
860 genomic_align.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
861 Returntype : string $aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
862 Exceptions : thrown if sequence contains unknown symbols
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
863 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
864 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
865 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
866
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
867 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
868
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
869 sub aligned_sequence {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
870 my ($self, @aligned_sequence_or_flags) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
871 my $aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
872
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
873 my $fix_seq = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
874 my $fake_seq = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
875 foreach my $flag (@aligned_sequence_or_flags) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
876 if ($flag =~ /^\+/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
877 if ($flag eq "+FIX_SEQ") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
878 $fix_seq = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
879 } elsif ($flag eq "+FAKE_SEQ") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
880 $fake_seq = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
881 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
882 warning("Unknow flag $flag when calling".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
883 " Bio::EnsEMBL::Compara::GenomicAlign::aligned_sequence()");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
884 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
885 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
886 $aligned_sequence = $flag;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
887 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
888 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
889
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
890 if (defined($aligned_sequence)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
891 $aligned_sequence =~ s/[\r\n]+$//;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
892
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
893 if ($aligned_sequence) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
894 ## Check sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
895 throw("Unreadable sequence ($aligned_sequence)") if ($aligned_sequence !~ /^[\-\.A-Z]+$/i);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
896 $self->{'aligned_sequence'} = $aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
897 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
898 $self->{'aligned_sequence'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
899 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
900 } elsif (!defined($self->{'aligned_sequence'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
901 # Try to get the aligned_sequence from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
902 if (defined($self->cigar_line) and $fake_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
903 # ...from the corresponding cigar_line (using a fake seq)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
904 $aligned_sequence = _get_fake_aligned_sequence_from_cigar_line(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
905 $self->{'cigar_line'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
906
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
907 } elsif (defined($self->cigar_line) and defined($self->original_sequence)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
908 my $original_sequence = $self->original_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
909 # ...from the corresponding orginial_sequence and cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
910 $aligned_sequence = _get_aligned_sequence_from_original_sequence_and_cigar_line(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
911 $original_sequence, $self->{'cigar_line'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
912 $self->{'aligned_sequence'} = $aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
913
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
914 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
915 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->aligned_sequence".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
916 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
917 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
918 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
919 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
920
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
921 $aligned_sequence = $self->{'aligned_sequence'} if (defined($self->{'aligned_sequence'}));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
922 if ($aligned_sequence and $fix_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
923 $aligned_sequence = _get_aligned_sequence_from_original_sequence_and_cigar_line(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
924 $aligned_sequence, $self->genomic_align_block->reference_genomic_align->cigar_line, $fix_seq);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
925 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
926
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
927 return $aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
928 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
929
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
930
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
931 =head2 length
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
932
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
933 Arg [1] : -none-
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
934 Example : $length = $genomic_align->length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
935 Description: get the length of the aligned sequence. This method will try to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
936 get the length from the aligned_sequence if already set or by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
937 parsing the cigar_line otherwise
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
938 Returntype : int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
939 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
940 Warning :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
941 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
942 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
943
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
944 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
945
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
946 sub length {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
947 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
948
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
949 if ($self->{aligned_sequence}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
950 return length($self->{aligned_sequence});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
951 } elsif ($self->{cigar_line}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
952 my $length = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
953 my $cigar_line = $self->{cigar_line};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
954 my @cig = ( $cigar_line =~ /(\d*[GMDXI])/g );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
955 for my $cigElem ( @cig ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
956 my $cigType = substr( $cigElem, -1, 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
957 my $cigCount = substr( $cigElem, 0 , -1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
958 $cigCount = 1 if ($cigCount eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
959 $length += $cigCount unless ($cigType eq "I");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
960 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
961 return $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
962 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
963
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
964 return undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
965 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
966
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
967 =head2 cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
968
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
969 Arg [1] : string $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
970 Example : $cigar_line = $genomic_align->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
971 Example : $genomic_align->cigar_line("35M2D233M7D23MD100M");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
972 Description: get/set for attribute cigar_line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
973 If no argument is given, the cigar line has not been
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
974 defined yet but the aligned sequence was, it calculates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
975 the cigar line based on the aligned (gapped) sequence.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
976 If no argument is given, the cigar_line is not defined but both
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
977 the dbID and the adaptor are, it tries to fetch and set all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
978 the direct attributes from the database using the dbID of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
979 Bio::EnsEMBL::Compara::GenomicAlign object. You can reset this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
980 attribute using an empty string as argument.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
981 The cigar_line depends on the strand defined by the dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
982 attribute.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
983 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
984 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
985 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
986 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
987 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
988
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
989 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
990
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
991 sub cigar_line {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
992 my ($self, $arg) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
993
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
994 if (defined($arg)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
995 if ($arg) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
996 $self->{'cigar_line'} = $arg;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
997 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
998 $self->{'cigar_line'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
999 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1000
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1001 } elsif (!defined($self->{'cigar_line'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1002 # Try to get the cigar_line from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1003 if (defined($self->{'aligned_sequence'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1004 # ...from the aligned sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1005
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1006
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1007 my $cigar_line = _get_cigar_line_from_aligned_sequence($self->{'aligned_sequence'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1008 $self->cigar_line($cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1009
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1010 } elsif (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1011 # ...from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1012 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1013 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1014 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->cigar_line".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1015 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1016 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1017 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1018 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1019
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1020 return $self->{'cigar_line'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1021 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1022
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1023
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1024 =head2 visible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1025
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1026 Arg [1] : int $visible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1027 Example : $visible = $genomic_align->visible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1028 Example : $genomic_align->visible(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1029 Description: get/set for attribute visible. If no argument is given, visible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1030 is not defined but both the dbID and the adaptor are, it tries to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1031 fetch and set all the direct attributes from the database using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1032 dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1033 Returntype : int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1034 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1035 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1036 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1037 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1038
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1039 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1040
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1041 sub visible {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1042 my ($self, $visible) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1043
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1044 if (defined($visible)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1045 $self->{'visible'} = $visible;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1046
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1047 } elsif (!defined($self->{'visible'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1048 if (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1049 # Try to get the values from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1050 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1051 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1052 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->visible".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1053 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1054 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1055 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1056 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1057
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1058 return $self->{'visible'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1059 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1060
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1061 =head2 node_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1062
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1063 Arg [1] : [optional] int $node_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1064 Example : $node_id = $genomic_align->node_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1065 Example : $genomic_align->node_id(5530000000004);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1066 Description: get/set for the node_id.This links the Bio::EnsEMBL::Compara::GenomicAlign to the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1067 Bio::EnsEMBL::Compara::GenomicAlignTree. The default value is NULL. If no argument is given, the node_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1068 is not defined but both the dbID and the adaptor are, it tries to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1069 fetch and set all the direct attributes from the database using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1070 dbID of the Bio::EnsEMBL::Compara::GenomicAlign object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1071 Returntype : int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1072 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1073 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1074 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1075 Status : At risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1076
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1077 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1078
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1079 sub node_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1080 my ($self, $node_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1081
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1082 if (defined($node_id)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1083 $self->{'node_id'} = $node_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1084 } elsif (!defined($self->{'node_id'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1085 if (defined($self->{'dbID'}) and defined($self->{'adaptor'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1086 # Try to get the values from the database using the dbID of the Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1087 $self->adaptor->retrieve_all_direct_attributes($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1088 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1089 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1090 return $self->{'node_id'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1091 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1092
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1093 =head2 genomic_align_group
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1094
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1095 Arg [2] : [optional] Bio::EnsEMBL::Compara::GenomicAlignGroup $genomic_align_group
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1096 Example : $genomic_align_group = $genomic_align->genomic_align_group();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1097 Example : $genomic_align->genomic_align_group($genomic_align_group);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1098 Description: get/set for the Bio::EnsEMBL::Compara::GenomicAlginGroup object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1099 corresponding to this Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1100 Returntype : int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1101 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1102 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1103 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1104 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1105
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1106 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1108 sub genomic_align_group {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1109 my ($self, $genomic_align_group) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1110
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1111 deprecate("Removed genomic_align_group table");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1112
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1113 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1115
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1116 =head2 genomic_align_group_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1117
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1118 Arg [2] : [optional] int $genomic_align_group_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1119 Example : $genomic_align_group_id = $genomic_align->genomic_align_group_id();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1120 Example : $genomic_align->genomic_align_group_id(18);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1121 Description: get/set for the genomic_align_group_id corresponding to this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1122 Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1123 Returntype : int
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1124 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1125 Warning : warns if getting data from other sources fails.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1126 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1127 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1128
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1129 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1130
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1131 sub genomic_align_group_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1132 my ($self, $genomic_align_group_id) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1134 deprecate("Removed genomic_align_group table");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1135 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1136
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1137
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1138 =head2 original_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1139
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1140 Arg [1] : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1141 Example : $original_sequence = $genomic_align->original_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1142 Description: get/set original sequence. If no argument is given and the original_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1143 is not defined, it tries to fetch the data from other sources like the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1144 aligned sequence or the the Bio::EnsEMBL::Compara:DnaFrag object. You can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1145 reset this attribute using an empty string as argument.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1146 This sequence depends on the strand defined by the dnafrag_strand attribute.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1147 Returntype : string $original_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1148 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1149 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1150 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1151
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1152 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1154 sub original_sequence {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1155 my ($self, $original_sequence) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1156
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1157 if (defined($original_sequence)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1158 if ($original_sequence) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1159 $self->{'original_sequence'} = $original_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1160 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1161 $self->{'original_sequence'} = undef;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1162 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1164 } elsif (!defined($self->{'original_sequence'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1165 # Try to get the data from other sources...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1166 if ($self->{'aligned_sequence'} and $self->{'cigar_line'} !~ /I/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1167 # ...from the aligned sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1168 $self->{'original_sequence'} = $self->{'aligned_sequence'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1169 $self->{'original_sequence'} =~ s/\-//g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1170
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1171 } elsif (!defined($self->{'original_sequence'}) and defined($self->dnafrag)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1172 and defined($self->dnafrag_start) and defined($self->dnafrag_end)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1173 and defined($self->dnafrag_strand) and defined($self->dnafrag->slice)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1174 # ...from the dnafrag object. Uses dnafrag, dnafrag_start and dnafrag_methods instead of the attibutes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1175 # in the <if> clause because the attributes can be retrieved from other sources if they have not been
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1176 # already defined.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1177 $self->{'original_sequence'} = $self->dnafrag->slice->subseq(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1178 $self->dnafrag_start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1179 $self->dnafrag_end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1180 $self->dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1181 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1182 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1183 warning("Fail to get data from other sources in Bio::EnsEMBL::Compara::GenomicAlign->genomic_align_groups".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1184 " You either have to specify more information (see perldoc for".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1185 " Bio::EnsEMBL::Compara::GenomicAlign) or to set it up directly");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1186 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1187 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1188
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1189 return $self->{'original_sequence'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1190 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1192 =head2 _get_cigar_line_from_aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1194 Arg [1] : string $aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1195 Example : $cigar_line = _get_cigar_line_from_aligned_sequence("CGT-AACTGATG--TTA")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1196 Description: get cigar line from gapped sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1197 Returntype : string $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1198 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1199 Caller : methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1200 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1202 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1203
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1204 sub _get_cigar_line_from_aligned_sequence {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1205 my ($aligned_sequence) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1206 my $cigar_line = "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1207
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1208 my @pieces = grep {$_} split(/(\-+)|(\.+)/, $aligned_sequence);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1209 foreach my $piece (@pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1210 my $mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1211 if ($piece =~ /\-/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1212 $mode = "D"; # D for gaps (deletions)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1213 } elsif ($piece =~ /\./) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1214 $mode = "X"; # X for pads (in 2X genomes)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1215 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1216 $mode = "M"; # M for matches/mismatches
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1217 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1218 if (CORE::length($piece) == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1219 $cigar_line .= $mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1220 } elsif (CORE::length($piece) > 1) { #length can be 0 if the sequence starts with a gap
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1221 $cigar_line .= CORE::length($piece).$mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1222 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1223 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1225 return $cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1226 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1228
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1229 =head2 _get_aligned_sequence_from_original_sequence_and_cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1230
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1231 Arg [1] : string $original_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1232 Arg [1] : string $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1233 Example : $aligned_sequence = _get_aligned_sequence_from_original_sequence_and_cigar_line(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1234 "CGTAACTGATGTTA", "3MD8M2D3M")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1235 Description: get gapped sequence from original one and cigar line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1236 Returntype : string $aligned_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1237 Exceptions : thrown if cigar_line does not match sequence length
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1238 Caller : methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1239 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1240
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1241 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1242
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1243 sub _get_aligned_sequence_from_original_sequence_and_cigar_line {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1244 my ($original_sequence, $cigar_line, $fix_seq) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1245 my $aligned_sequence = "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1246
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1247 return undef if (!defined($original_sequence) or !$cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1248
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1249 my $seq_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1250 my @cig = ( $cigar_line =~ /(\d*[GMDXI])/g );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1251
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1252 for my $cigElem ( @cig ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1253 my $cigType = substr( $cigElem, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1254 my $cigCount = substr( $cigElem, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1255 $cigCount = 1 unless ($cigCount =~ /^\d+$/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1257 if( $cigType eq "M" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1258 $aligned_sequence .= substr($original_sequence, $seq_pos, $cigCount);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1259 $seq_pos += $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1260 } elsif( $cigType eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1261 $seq_pos += $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1262 } elsif( $cigType eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1263 $aligned_sequence .= "." x $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1264 } elsif( $cigType eq "G" || $cigType eq "D") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1265 if ($fix_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1266 $seq_pos += $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1267 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1268 $aligned_sequence .= "-" x $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1269 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1270 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1271 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1272 throw("Cigar line ($seq_pos) does not match sequence length (".CORE::length($original_sequence).")")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1273 if ($seq_pos != CORE::length($original_sequence));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1274
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1275 return $aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1276 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1277
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1278
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1279 =head2 _get_fake_aligned_sequence_from_cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1280
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1281 Arg [1] : string $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1282 Example : $aligned_sequence = _get_fake_aligned_sequence_from_cigar_line(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1283 "3MD8M2D3M")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1284 Description: get gapped sequence of N\'s from the cigar line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1285 Returntype : string $fake_aligned_sequence or undef if no $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1286 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1287 Caller : methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1288 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1289
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1290 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1291
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1292 sub _get_fake_aligned_sequence_from_cigar_line {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1293 my ($cigar_line, $fix_seq) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1294 my $fake_aligned_sequence = "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1295
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1296 return undef if (!$cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1297
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1298 my $seq_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1299
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1300 my @cig = ( $cigar_line =~ /(\d*[GMDXI])/g );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1301 for my $cigElem ( @cig ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1302 my $cigType = substr( $cigElem, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1303 my $cigCount = substr( $cigElem, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1304 $cigCount = 1 if ($cigCount eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1305
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1306 if( $cigType eq "M" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1307 $fake_aligned_sequence .= "N" x $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1308 $seq_pos += $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1309 } elsif( $cigType eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1310 $seq_pos += $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1311 } elsif( $cigType eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1312 $fake_aligned_sequence .= "." x $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1313 } elsif( $cigType eq "G" || $cigType eq "D") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1314 if ($fix_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1315 $seq_pos += $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1316 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1317 $fake_aligned_sequence .= "-" x $cigCount;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1318 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1319 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1320 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1321
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1322 return $fake_aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1323 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1324
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1325
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1326 =head2 _print
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1327
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1328 Arg [1] : ref to a FILEHANDLE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1329 Example : $genomic_align->_print
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1330 Description: print attributes of the object to the STDOUT or to the FILEHANDLE.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1331 Used for debuging purposes.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1332 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1333 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1334 Caller : object->methodname
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1335 Status : At risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1336
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1337 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1338
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1339 sub _print {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1340 my ($self, $FILEH) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1341
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1342 my $verbose = verbose;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1343 verbose(0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1344
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1345 $FILEH ||= \*STDOUT;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1346
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1347 print $FILEH
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1348 "Bio::EnsEMBL::Compara::GenomicAlign object ($self)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1349 dbID = ".($self->dbID or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1350 adaptor = ".($self->adaptor or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1351 genomic_align_block = ".($self->genomic_align_block or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1352 genomic_align_block_id = ".($self->genomic_align_block_id or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1353 method_link_species_set = ".($self->method_link_species_set or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1354 method_link_species_set_id = ".($self->method_link_species_set_id or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1355 dnafrag = ".($self->dnafrag or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1356 dnafrag_id = ".($self->dnafrag_id or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1357 dnafrag_start = ".($self->dnafrag_start or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1358 dnafrag_end = ".($self->dnafrag_end or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1359 dnafrag_strand = ".($self->dnafrag_strand or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1360 cigar_line = ".($self->cigar_line or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1361 visible = ".($self->visible or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1362 original_sequence = ".($self->original_sequence or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1363 aligned_sequence = ".($self->aligned_sequence or "-undef-")."
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1364
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1365 ";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1366 verbose($verbose);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1368 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1369
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1370 =head2 display_id
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1372 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1373 Example : my $id = $genomic_align->display_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1374 Description: returns string describing this genomic_align which can be used
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1375 as display_id of a Bio::Seq object or in a fasta file. The actual form is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1376 taxon_id:genome_db_id:coord_system_name:dnafrag_name:dnafrag_start:dnafrag_end:dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1377 e.g.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1378 9606:1:chromosome:14:50000000:51000000:-1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1380 Uses dnafrag information in addition to start and end.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1381 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1382 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1383 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1384 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1385
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1386 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1387
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1388 sub display_id {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1389 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1390
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1391 my $dnafrag = $self->dnafrag;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1392 return "" unless($dnafrag);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1393 my $id = join(':',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1394 $dnafrag->genome_db->taxon_id,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1395 $dnafrag->genome_db->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1396 $dnafrag->coord_system_name,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1397 $dnafrag->name,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1398 $self->dnafrag_start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1399 $self->dnafrag_end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1400 $self->dnafrag_strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1401 return $id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1402 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1403
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1404 =head2 reverse_complement
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1405
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1406 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1407 Example : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1408 Description: reverse complement the object modifing dnafrag_strand and cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1409 Returntype : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1410 Exceptions : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1411 Caller : general
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1412 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1413
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1414 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1415
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1416 sub reverse_complement {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1417 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1418
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1419 # reverse strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1420 #$self->dnafrag_strand($self->dnafrag_strand * -1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1421 $self->dnafrag_strand($self->{'dnafrag_strand'} * -1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1423 # reverse original and aligned sequences if cached
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1424 my $original_sequence = $self->{'original_sequence'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1425 if ($original_sequence) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1426 $original_sequence = reverse $original_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1427 $original_sequence =~ tr/ATCGatcg/TAGCtagc/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1428 $self->original_sequence($original_sequence);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1429 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1430 my $aligned_sequence = $self->{'aligned_sequence'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1431 if ($aligned_sequence) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1432 $aligned_sequence = reverse $aligned_sequence;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1433 $aligned_sequence =~ tr/ATCGatcg/TAGCtagc/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1434 $self->aligned_sequence($aligned_sequence);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1435 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1436
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1437 # reverse cigar_string as consequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1438 my $cigar_line = $self->{'cigar_line'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1439
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1440 #$cigar_line = join("", reverse grep {$_} split(/(\d*[GDMIX])/, $cigar_line));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1441 $cigar_line = join("", reverse ($cigar_line=~(/(\d*[GDMIX])/g)));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1442 $self->cigar_line($cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1443 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1445
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1446 =head2 get_Mapper
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1447
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1448 Arg[1] : [optional] integer $cache (default = FALSE)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1449 Arg[2] : [optional] boolean $condensed (default = FALSE)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1450 Example : $this_mapper = $genomic_align->get_Mapper();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1451 Example : $mapper1 = $genomic_align1->get_Mapper();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1452 $mapper2 = $genomic_align2->get_Mapper();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1453 Description: creates and returns a Bio::EnsEMBL::Mapper to map coordinates from
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1454 the original sequence of this Bio::EnsEMBL::Compara::GenomicAlign
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1455 to the aligned sequence, i.e. the alignment. In order to map a sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1456 from this Bio::EnsEMBL::Compara::GenomicAlign object to another
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1457 Bio::EnsEMBL::Compara::GenomicAlign of the same
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1458 Bio::EnsEMBL::Compara::GenomicAlignBlock object, you may use this mapper
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1459 to transform coordinates into the "alignment" coordinates and then to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1460 the other Bio::EnsEMBL::Compara::GenomicAlign coordinates using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1461 corresponding Bio::EnsEMBL::Mapper.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1462 The coordinates of the "alignment" starts with the start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1463 position of the GenomicAlignBlock if available or 1 otherwise.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1464 With the $cache argument you can decide whether you want to cache the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1465 result or not. Result is *not* cached by default.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1466 Returntype : Bio::EnsEMBL::Mapper object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1467 Exceptions : throw if no cigar_line can be found
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1468 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1469
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1470 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1471
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1472 sub get_Mapper {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1473 my ($self, $cache, $condensed) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1474 my $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1475 $cache = 0 if (!defined($cache));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1476 my $mode = "expanded";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1477 if (defined($condensed) and $condensed) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1478 $mode = "condensed";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1479 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1480
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1481 if (!defined($self->{$mode.'_mapper'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1482 if ($mode eq "condensed") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1483
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1484 $mapper = Bio::EnsEMBL::Mapper->new("sequence", "alignment");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1486 my $rel_strand = $self->dnafrag_strand; # This call ensures all direct attribs have been fetched
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1487 my $ref_cigar_line = $self->genomic_align_block->reference_genomic_align->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1488
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1489 my $aln_pos = (eval{$self->genomic_align_block->start} or 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1490
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1491 #if the reference genomic_align, I only need a simple 1 to 1 mapping
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1492 if ($self eq $self->genomic_align_block->reference_genomic_align) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1493 $mapper->add_map_coordinates(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1494 'sequence',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1495 $self->{'dnafrag_start'},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1496 $self->{'dnafrag_end'},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1497 $self->{'dnafrag_strand'},
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1498 'alignment',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1499 $self->genomic_align_block->start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1500 $self->genomic_align_block->end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1501 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1502 return $mapper if (!$cache);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1503
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1504 $self->{$mode.'_mapper'} = $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1505 return $self->{$mode.'_mapper'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1506 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1507
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1508 my $aln_seq_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1509 my $seq_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1510
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1511 my $insertions = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1512 my $target_cigar_pieces;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1513 @$target_cigar_pieces = $self->{'cigar_line'} =~ /(\d*[GMDXI])/g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1514 my $ref_cigar_pieces;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1515 @$ref_cigar_pieces = $ref_cigar_line =~ /(\d*[GMDXI])/g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1516 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1517 my $j = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1518 my ($ref_num, $ref_type) = $ref_cigar_pieces->[$i] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1519 $ref_num = 1 if (!defined($ref_num) or $ref_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1520 my ($target_num, $target_type) = $target_cigar_pieces->[$j] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1521 $target_num = 1 if (!defined($target_num) or $target_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1522
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1523 while ($i < @$ref_cigar_pieces and $j<@$target_cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1524 while ($ref_type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1525 $aln_pos += $ref_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1526 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1527 last if ($i >= @$ref_cigar_pieces);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1528 ($ref_num, $ref_type) = $ref_cigar_pieces->[$i] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1529 $ref_num = 1 if (!defined($ref_num) or $ref_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1530 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1531 while ($target_type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1532 $seq_pos += $target_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1533 $j++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1534 last if ($j >= @$target_cigar_pieces);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1535 ($target_num, $target_type) = $target_cigar_pieces->[$j] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1536 $target_num = 1 if (!defined($target_num) or $target_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1537 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1538
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1539 my $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1540
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1541 if ($ref_num == $target_num) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1542 $length = $ref_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1543 } elsif ($ref_num > $target_num) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1544 $length = $target_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1545 } elsif ($ref_num < $target_num) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1546 $length = $ref_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1547 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1548 my $this_piece_of_cigar_line = $length.$target_type;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1549
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1550 if ($ref_type eq "M") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1551 my $this_mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1552 if ($rel_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1553 _add_cigar_line_to_Mapper($this_piece_of_cigar_line, $aln_pos,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1554 $seq_pos + $self->dnafrag_start, 1, $mapper);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1555 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1556 _add_cigar_line_to_Mapper($this_piece_of_cigar_line, $aln_pos, $self->dnafrag_end - $seq_pos, -1, $mapper);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1557 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1558 $aln_pos += $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1559 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1560 my $gaps = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1561 if ($target_type eq "D" || $target_type eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1562 $gaps += $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1563 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1564
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1565 $seq_pos -= $gaps;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1566 $seq_pos += $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1567
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1568 if ($ref_num == $target_num) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1569 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1570 $j++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1571 last if ($i >= @$ref_cigar_pieces);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1572 last if ($j >= @$target_cigar_pieces);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1573 ($ref_num, $ref_type) = $ref_cigar_pieces->[$i] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1574 $ref_num = 1 if (!defined($ref_num) or $ref_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1575 ($target_num, $target_type) = $target_cigar_pieces->[$j] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1576 $target_num = 1 if (!defined($target_num) or $target_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1577 } elsif ($ref_num > $target_num) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1578 $j++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1579 $ref_num -= $target_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1580 last if ($j >= @$target_cigar_pieces);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1581 ($target_num, $target_type) = $target_cigar_pieces->[$j] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1582 $target_num = 1 if (!defined($target_num) or $target_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1583 } elsif ($ref_num < $target_num) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1584 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1585 $target_num -= $ref_num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1586 last if ($i >= @$ref_cigar_pieces);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1587 ($ref_num, $ref_type) = $ref_cigar_pieces->[$i] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1588 $ref_num = 1 if (!defined($ref_num) or $ref_num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1589 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1590 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1591 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1592 my $cigar_line = $self->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1593 if (!$cigar_line) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1594 throw("[$self] has no cigar_line and cannot be retrieved by any means");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1595 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1596 my $alignment_position = (eval{$self->genomic_align_block->start} or 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1597 my $sequence_position = $self->dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1598 my $rel_strand = $self->dnafrag_strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1599 if ($rel_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1600 $sequence_position = $self->dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1601 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1602 $sequence_position = $self->dnafrag_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1603 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1604 $mapper = _get_Mapper_from_cigar_line($cigar_line, $alignment_position, $sequence_position, $rel_strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1605 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1606
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1607 return $mapper if (!$cache);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1608
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1609 $self->{$mode.'_mapper'} = $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1610 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1611
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1612 return $self->{$mode.'_mapper'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1613 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1614
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1615 sub get_MapperOLD {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1616 my ($self, $cache, $condensed) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1617 my $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1618 $cache = 0 if (!defined($cache));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1619 my $mode = "expanded";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1620 if (defined($condensed) and $condensed) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1621 $mode = "condensed";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1622 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1623
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1624 if (!defined($self->{$mode.'_mapper'})) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1625 if ($mode eq "condensed") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1626 $mapper = Bio::EnsEMBL::Mapper->new("sequence", "alignment");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1627 my $rel_strand = $self->dnafrag_strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1628 my $ref_cigar_line = $self->genomic_align_block->reference_genomic_align->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1629 my $this_aligned_seq = $self->aligned_sequence("+FAKE_SEQ");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1630
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1631 my $aln_pos = (eval{$self->genomic_align_block->start} or 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1632 my $aln_seq_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1633 my $seq_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1634
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1635 my $target_cigar_pieces;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1636 @$target_cigar_pieces = $self->cigar_line =~ /(\d*[GMDXI])/g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1637
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1638 my $insertions = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1639 my $array_index = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1640 my $this_target_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1641 foreach my $cigar_piece ($ref_cigar_line =~ /(\d*[GMDX])/g) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1642 my ($cig_count, $cig_mode) = $cigar_piece =~ /(\d*)([GMDX])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1643 $cig_count = 1 if (!defined($cig_count) or $cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1644
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1645 #because of 2X genomes, need different method for extracting the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1646 #cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1647 #my $this_piece_of_cigar_line = _get_sub_cigar_line_slow($target_cigar_pieces, $aln_seq_pos, $cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1648
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1649 #quicker method which keeps track of how far through the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1650 #target_cigar_pieces array we are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1651 my $this_piece_of_cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1652 ($this_piece_of_cigar_line,$array_index, $this_target_pos) = _get_sub_cigar_line($target_cigar_pieces, $aln_seq_pos, $cig_count, $array_index, $this_target_pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1653
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1654 #find number of each cigar_line mode in cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1655 my $num_cigar_elements = _count_cigar_elements($this_piece_of_cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1656 if ($cig_mode eq "M") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1657
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1658 my $this_mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1659 if ($rel_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1660 $this_mapper = _get_Mapper_from_cigar_line($this_piece_of_cigar_line, $aln_pos,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1661 $seq_pos + $self->dnafrag_start, 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1662 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1663 $this_mapper = _get_Mapper_from_cigar_line($this_piece_of_cigar_line, $aln_pos,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1664 $self->dnafrag_end - $seq_pos, -1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1665 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1666 $mapper->add_Mapper($this_mapper);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1667 $aln_pos += $cig_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1668
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1669 $insertions = $num_cigar_elements->{"I"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1670
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1671 $seq_pos += $insertions;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1672 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1673 my $gaps = $num_cigar_elements->{"D"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1674 $gaps += $num_cigar_elements->{"X"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1675
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1676 $seq_pos -= $gaps;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1677 $seq_pos += $cig_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1678 $aln_seq_pos += $cig_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1679 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1680
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1681 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1682 my $cigar_line = $self->cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1683 if (!$cigar_line) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1684 throw("[$self] has no cigar_line and cannot be retrieved by any means");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1685 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1686 my $alignment_position = (eval{$self->genomic_align_block->start} or 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1687 my $sequence_position = $self->dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1688 my $rel_strand = $self->dnafrag_strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1689 if ($rel_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1690 $sequence_position = $self->dnafrag_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1691 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1692 $sequence_position = $self->dnafrag_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1693 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1694 $mapper = _get_Mapper_from_cigar_line($cigar_line, $alignment_position, $sequence_position, $rel_strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1695 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1696
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1697 return $mapper if (!$cache);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1698
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1699 $self->{$mode.'_mapper'} = $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1700 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1701
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1702 return $self->{$mode.'_mapper'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1703 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1704
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1705 =head2 _count_cigar_elements
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1706
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1707 Arg[1] : string $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1708 Example : $num_elements = _count_cigar_elements("5M3D2M5D")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1709 Description: Counts the number of each cigar_line mode in a cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1710 and stores them in a hash reference. In the above example
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1711 $num_elements->{"M"} is 7, $num_elements->{"D"} is 8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1712 Returntype : hash reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1713 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1714 Status : At risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1715
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1716 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1717 sub _count_cigar_elements {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1718 my ($cigar_line) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1719
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1720 my $this_count = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1721 my $num_elements;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1722
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1723 #initialise each element to 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1724 foreach my $mode (qw(G M D X I)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1725 $num_elements->{$mode} = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1726 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1727
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1728 foreach my $cigar_piece ($cigar_line =~ /(\d*[GMDXI])/g) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1729 my ($cig_count, $cig_mode) = $cigar_piece =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1730 $cig_count = 1 if (!defined($cig_count) or $cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1731 $num_elements->{$cig_mode} += $cig_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1732 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1733 return $num_elements;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1734 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1735
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1736 =head2 _get_sub_cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1737
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1738 Arg[1] : ref to array of target cigar_line elements
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1739 Arg[2] : int $offset start position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1740 Arg[3] : int $length amount to extract
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1741 Arg[4] : int $start_array_index current element in target array
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1742 Arg[5] : int $start_target_pos current position in target coords
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1743 Example : my $new_cigar_line = _get_sub_cigar_line($target_cigar_pieces, $pos, $count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1744 Description: Extracts a cigar_line of size $length starting at $offset
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1745 Returntype : string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1746 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1747 Status : At risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1748
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1749 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1750 sub _get_sub_cigar_line {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1751 my ($target_cigar_pieces, $offset, $length, $start_array_index, $start_target_pos) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1752 my $ref_pos = $offset + $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1753
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1754 my $i = $start_array_index;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1755 my $target_pos = $start_target_pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1756
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1757 #current target element
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1758 my ($target_cig_count, $target_cig_mode) = $target_cigar_pieces->[$i] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1759 $target_cig_count = 1 if (!defined($target_cig_count) or $target_cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1760
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1761 my $new_cigar_line = "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1762 #check to see if previous target overlaps this ref_pos
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1763 if ($offset) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1764 if ($target_pos > $offset) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1765
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1766 #need to only add on cig_count amount
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1767 my $new_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1768 if ($target_pos - $offset < $length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1769 $new_count = ($target_pos - $offset);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1770 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1771 $new_count = $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1772 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1773 #$new_cigar_line .= $new_count . $target_cig_mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1774 $new_cigar_line .= _cigar_element($target_cig_mode,$new_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1775 #print "here1 $target_cig_mode $new_count\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1776 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1777 #increment to next target element
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1778 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1779 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1780 while ($target_pos < $ref_pos && $i < @$target_cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1781 ($target_cig_count, $target_cig_mode) = $target_cigar_pieces->[$i++] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1782 $target_cig_count = 1 if (!defined($target_cig_count) or $target_cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1783
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1784 #first piece
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1785 if (!$target_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1786 if ($target_cig_count >= $length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1787 $new_cigar_line .= _cigar_element($target_cig_mode,$length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1788 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1789 $new_cigar_line .= _cigar_element($target_cig_mode,$target_cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1790 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1791 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1792 if ($target_cig_mode ne "I" &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1793 $target_cig_count + $target_pos > $ref_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1794 #if new target piece extends beyond ref_piece but is not I
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1795 #(since this doesn't count to target_pos) need to shorten it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1796 my $count = $ref_pos - $target_pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1797 $new_cigar_line .= _cigar_element($target_cig_mode,$count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1798 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1799 $new_cigar_line .= _cigar_element($target_cig_mode,$target_cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1800 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1801 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1802 $target_pos += $target_cig_count unless $target_cig_mode eq "I";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1803 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1804 #need to check if the next element is an I which doesn't count to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1805 #target_pos but need to add it to cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1806 if ($i < @$target_cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1807 ($target_cig_count, $target_cig_mode) = $target_cigar_pieces->[$i] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1808 $target_cig_count = 1 if (!defined($target_cig_count) or $target_cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1809 if ($target_cig_mode eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1810 $new_cigar_line .= _cigar_element($target_cig_mode,$target_cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1811 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1812 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1813
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1814 #decrement to return current target element
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1815 if ( $i > 0) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1816 $i--;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1817 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1818 return ($new_cigar_line, $i, $target_pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1819 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1820
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1821 sub _get_sub_cigar_line_slow {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1822 my ($target_cigar_pieces, $offset, $length) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1823 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1824 my $ref_pos = $offset + $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1825 my ($target_cig_count, $target_cig_mode);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1826 my $target_pos = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1827
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1828 #skip through target_cigar_line until get to correct position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1829 while ($target_pos < $offset && $i < @$target_cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1830 ($target_cig_count, $target_cig_mode) = $target_cigar_pieces->[$i++] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1831 $target_cig_count = 1 if (!defined($target_cig_count) or $target_cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1832
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1833 $target_pos += $target_cig_count unless $target_cig_mode eq "I";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1834 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1835
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1836 my $new_cigar_line = "";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1837 #check to see if previous target overlaps this ref_pos
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1838 if ($offset) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1839 if ($target_pos > $offset) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1840
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1841 #need to only add on cig_count amount
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1842 my $new_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1843 if ($target_pos - $offset < $length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1844 $new_count = ($target_pos - $offset);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1845 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1846 $new_count = $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1847 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1848 #$new_cigar_line .= $new_count . $target_cig_mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1849 $new_cigar_line .= _cigar_element($target_cig_mode,$new_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1850 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1851 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1852
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1853 while ($target_pos < $ref_pos && $i < @$target_cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1854 ($target_cig_count, $target_cig_mode) = $target_cigar_pieces->[$i++] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1855 $target_cig_count = 1 if (!defined($target_cig_count) or $target_cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1856
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1857 #first piece
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1858 if (!$target_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1859 if ($target_cig_count >= $length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1860 $new_cigar_line .= _cigar_element($target_cig_mode,$length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1861 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1862 $new_cigar_line .= _cigar_element($target_cig_mode,$target_cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1863 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1864 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1865 if ($target_cig_mode ne "I" &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1866 $target_cig_count + $target_pos > $ref_pos) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1867 #if new target piece extends beyond ref_piece but is not I
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1868 #(since this doesn't count to target_pos) need to shorten it
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1869 my $count = $ref_pos - $target_pos;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1870 $new_cigar_line .= _cigar_element($target_cig_mode,$count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1871 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1872 $new_cigar_line .= _cigar_element($target_cig_mode,$target_cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1873 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1874 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1875 $target_pos += $target_cig_count unless $target_cig_mode eq "I";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1876 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1877 #need to check if the next element is an I which doesn't count to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1878 #target_pos but need to add it to cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1879 if ($i < @$target_cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1880 ($target_cig_count, $target_cig_mode) = $target_cigar_pieces->[$i++] =~ /(\d*)([GMDXI])/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1881 $target_cig_count = 1 if (!defined($target_cig_count) or $target_cig_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1882 if ($target_cig_mode eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1883 $new_cigar_line .= _cigar_element($target_cig_mode,$target_cig_count);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1884 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1885 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1886 return $new_cigar_line;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1887 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1888
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1889 =head2 _cigar_element
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1890
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1891 Arg[1] : char $mode valid cigar_line mode
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1892 Arg[2] : int $length size of element
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1893 Example : $elem = _cigar_element("M", 5);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1894 Description: Creates a valid cigar element
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1895 Returntype : integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1896 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1897 Status : At risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1898
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1899 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1900 sub _cigar_element {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1901 my ($mode, $len) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1902 my $elem;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1903 if ($len == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1904 $elem = $mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1905 #} elsif ($len > 1) { #length can be 0 if the sequence starts with a gap
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1906 } else { #length can be 0 if the sequence starts with a gap
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1907 $elem = $len.$mode;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1908 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1909 return $elem;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1910 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1911
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1912 =head2 _get_Mapper_from_cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1913
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1914 Arg[1] : $cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1915 Arg[2] : $alignment_position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1916 Arg[3] : $sequence_position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1917 Arg[4] : $relative_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1918 Example : $this_mapper = _get_Mapper_from_cigar_line($cigar_line,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1919 $aln_pos, $seq_pos, 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1920 Description: creates a new Bio::EnsEMBL::Mapper object for mapping between
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1921 sequence and alignment coordinate systems using the cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1922 and starting from the $alignment_position and sequence_position.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1923 Returntype : Bio::EnsEMBL::Mapper object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1924 Exceptions : None
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1925 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1926
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1927 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1928
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1929 sub _get_Mapper_from_cigar_line {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1930 my ($cigar_line, $alignment_position, $sequence_position, $rel_strand) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1931
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1932 my $mapper = Bio::EnsEMBL::Mapper->new("sequence", "alignment");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1933
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1934 my @cigar_pieces = ($cigar_line =~ /(\d*[GMDXI])/g);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1935 if ($rel_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1936 foreach my $cigar_piece (@cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1937 my $cigar_type = substr($cigar_piece, -1, 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1938 my $cigar_count = substr($cigar_piece, 0, -1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1939 $cigar_count = 1 if ($cigar_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1940 next if ($cigar_count < 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1941
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1942 if( $cigar_type eq "M" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1943 $mapper->add_map_coordinates(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1944 "sequence", #$self->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1945 $sequence_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1946 $sequence_position + $cigar_count - 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1947 $rel_strand,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1948 "alignment", #$self->genomic_align_block->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1949 $alignment_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1950 $alignment_position + $cigar_count - 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1951 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1952 $sequence_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1953 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1954 } elsif( $cigar_type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1955 #add to sequence_position but not alignment_position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1956 $sequence_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1957 } elsif( $cigar_type eq "G" || $cigar_type eq "D" || $cigar_type eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1958 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1959 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1960 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1961 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1962 foreach my $cigar_piece (@cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1963 my $cigar_type = substr($cigar_piece, -1, 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1964 my $cigar_count = substr($cigar_piece, 0 ,-1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1965 $cigar_count = 1 if ($cigar_count eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1966 next if ($cigar_count < 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1967
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1968 if( $cigar_type eq "M" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1969 $mapper->add_map_coordinates(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1970 "sequence", #$self->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1971 $sequence_position - $cigar_count + 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1972 $sequence_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1973 $rel_strand,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1974 "alignment", #$self->genomic_align_block->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1975 $alignment_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1976 $alignment_position + $cigar_count - 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1977 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1978 $sequence_position -= $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1979 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1980 } elsif( $cigar_type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1981 #add to sequence_position but not alignment_position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1982 $sequence_position -= $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1983 } elsif( $cigar_type eq "G" || $cigar_type eq "D" || $cigar_type eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1984 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1985 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1986 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1987 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1988
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1989 return $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1990 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1991
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1992 sub _add_cigar_line_to_Mapper {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1993 my ($cigar_line, $alignment_position, $sequence_position, $rel_strand, $mapper) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1994
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1995 my @cigar_pieces = ($cigar_line =~ /(\d*[GMDXI])/g);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1996 if ($rel_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1997 foreach my $cigar_piece (@cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1998 my $cigar_type = substr($cigar_piece, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1999 my $cigar_count = substr($cigar_piece, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2000 $cigar_count = 1 unless ($cigar_count =~ /^\d+$/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2001 next if ($cigar_count < 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2002
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2003 if( $cigar_type eq "M" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2004 $mapper->add_map_coordinates(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2005 "sequence", #$self->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2006 $sequence_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2007 $sequence_position + $cigar_count - 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2008 $rel_strand,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2009 "alignment", #$self->genomic_align_block->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2010 $alignment_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2011 $alignment_position + $cigar_count - 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2012 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2013 $sequence_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2014 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2015 } elsif( $cigar_type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2016 #add to sequence_position but not alignment_position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2017 $sequence_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2018 } elsif( $cigar_type eq "G" || $cigar_type eq "D" || $cigar_type eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2019 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2020 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2021 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2022 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2023 foreach my $cigar_piece (@cigar_pieces) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2024 my $cigar_type = substr($cigar_piece, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2025 my $cigar_count = substr($cigar_piece, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2026 $cigar_count = 1 unless ($cigar_count =~ /^\d+$/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2027 next if ($cigar_count < 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2028
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2029 if( $cigar_type eq "M" ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2030 $mapper->add_map_coordinates(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2031 "sequence", #$self->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2032 $sequence_position - $cigar_count + 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2033 $sequence_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2034 $rel_strand,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2035 "alignment", #$self->genomic_align_block->dbID,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2036 $alignment_position,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2037 $alignment_position + $cigar_count - 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2038 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2039 $sequence_position -= $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2040 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2041 } elsif( $cigar_type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2042 #add to sequence_position but not alignment_position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2043 $sequence_position -= $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2044 } elsif( $cigar_type eq "G" || $cigar_type eq "D" || $cigar_type eq "X") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2045 $alignment_position += $cigar_count;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2046 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2047 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2048 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2049
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2050 return $mapper;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2051 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2052
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2053
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2054 =head2 get_Slice
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2055
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2056 Arg[1] : -none-
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2057 Example : $slice = $genomic_align->get_Slice();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2058 Description: creates and returns a Bio::EnsEMBL::Slice which corresponds to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2059 this Bio::EnsEMBL::Compara::GenomicAlign
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2060 Returntype : Bio::EnsEMBL::Slice object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2061 Exceptions : return -undef- if slice cannot be created (this is likely to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2062 happen if the Registry is misconfigured)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2063 Status : Stable
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2064
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2065 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2066
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2067 sub get_Slice {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2068 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2069
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2070 my $slice = $self->dnafrag->slice;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2071 return undef if (!defined($slice));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2072
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2073 $slice = $slice->sub_Slice(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2074 $self->dnafrag_start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2075 $self->dnafrag_end,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2076 $self->dnafrag_strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2077 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2078
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2079 return $slice;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2080 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2081
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2082
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2083 =head2 restrict
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2084
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2085 Arg[1] : int start
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2086 Arg[1] : int end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2087 Example : my $genomic_align = $genomic_align->restrict(10, 20);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2088 Description: restrict (trim) this GenomicAlign to the start and end
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2089 positions (in alignment coordinates). If no trimming is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2090 required, the original object is returned instead.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2091 Returntype : Bio::EnsEMBL::Compara::GenomicAlign object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2092 Exceptions :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2093 Status : At risk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2094
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2095 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2096
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2097 sub restrict {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2098 my ($self, $start, $end, $aligned_seq_length) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2099 throw("Wrong arguments") if (!$start or !$end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2101 my $restricted_genomic_align = $self->copy();
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2102 delete($restricted_genomic_align->{dbID});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2103 delete($restricted_genomic_align->{genomic_align_block_id});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2104 delete($restricted_genomic_align->{original_sequence});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2105 delete($restricted_genomic_align->{aligned_sequence});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2106 delete($restricted_genomic_align->{cigar_line});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2107 $restricted_genomic_align->{original_dbID} = $self->dbID if ($self->dbID);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2108
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2109 # Need to calculate the original aligned sequence length myself
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2110 if (!$aligned_seq_length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2111 my @cigar = grep {$_} split(/(\d*[GDMXI])/, $self->cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2112 foreach my $num_type (@cigar) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2113 my $type = substr($num_type, -1, 1, "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2114 $num_type = 1 if ($num_type eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2115 $aligned_seq_length += $num_type unless ($type eq "I");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2116 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2117 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2119 my $final_aligned_length = $end - $start + 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2120 my $number_of_columns_to_trim_from_the_start = $start - 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2121 my $number_of_columns_to_trim_from_the_end = $aligned_seq_length - $end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2123 my @cigar = grep {$_} split(/(\d*[GDMXI])/, $self->cigar_line);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2124
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2125 ## Trim start of cigar_line if needed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2126 if ($number_of_columns_to_trim_from_the_start >= 0) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2127 my $counter_of_trimmed_columns_from_the_start = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2128 my $counter_of_trimmed_base_pairs = 0; # num of bp we trim (from the start)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2129 ## Loop through the cigar pieces
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2130 while (my $cigar = shift(@cigar)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2131 # Parse each cigar piece
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2132 my $type = substr( $cigar, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2133 my $num = substr( $cigar, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2134 $num = 1 if ($num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2135
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2136 # Insertions are not part of the alignment, don't count them
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2137 if ($type ne "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2138 $counter_of_trimmed_columns_from_the_start += $num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2139 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2141 # Matches and insertions are actual base pairs in the sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2142 if ($type eq "M" || $type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2143 $counter_of_trimmed_base_pairs += $num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2144 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2146 # If this cigar piece is too long and we overshoot the number of columns we want to trim,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2147 # we substitute this cigar piece by a shorter one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2148 if ($counter_of_trimmed_columns_from_the_start >= $number_of_columns_to_trim_from_the_start) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2149 my $new_cigar_piece;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2150 # length of the new cigar piece
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2151 my $length = $counter_of_trimmed_columns_from_the_start - $number_of_columns_to_trim_from_the_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2152 if ($length > 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2153 $new_cigar_piece = $length.$type;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2154 } elsif ($length == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2155 $new_cigar_piece = $type;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2156 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2157 unshift(@cigar, $new_cigar_piece) if ($new_cigar_piece);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2158 if ($type eq "M") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2159 $counter_of_trimmed_base_pairs -= $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2160 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2162 ## We don't want to start with an insertion. Trim it!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2163 while (@cigar and $cigar[0] =~ /[I]/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2164 my ($num, $type) = ($cigar[0] =~ /^(\d*)([DIGMX])/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2165 #my $type = substr( $cigar, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2166 #my $num = substr( $cigar, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2167 $num = 1 if ($num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2168 $counter_of_trimmed_base_pairs += $num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2169 shift(@cigar);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2170 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2171 last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2172 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2173 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2174 if ($self->dnafrag_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2175 $restricted_genomic_align->dnafrag_start($self->dnafrag_start + $counter_of_trimmed_base_pairs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2176 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2177 $restricted_genomic_align->dnafrag_end($self->dnafrag_end - $counter_of_trimmed_base_pairs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2178 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2179 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2180
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2181 ## Trim end of cigar_line if needed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2182 if ($number_of_columns_to_trim_from_the_end >= 0) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2183 my $counter_of_trimmed_columns_from_the_end = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2184 my $counter_of_trimmed_base_pairs = 0; # num of bp we trim (from the start)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2185 ## Loop through the cigar pieces
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2186 while (my $cigar = pop(@cigar)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2187 # Parse each cigar piece
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2188 my $type = substr( $cigar, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2189 my $num = substr( $cigar, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2190 $num = 1 if ($num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2192 # Insertions are not part of the alignment, don't count them
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2193 if ($type ne "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2194 $counter_of_trimmed_columns_from_the_end += $num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2195 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2196
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2197 # Matches and insertions are actual base pairs in the sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2198 if ($type eq "M" || $type eq "I") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2199 $counter_of_trimmed_base_pairs += $num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2200 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2201 # If this cigar piece is too long and we overshoot the number of columns we want to trim,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2202 # we substitute this cigar piece by a shorter one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2203 if ($counter_of_trimmed_columns_from_the_end >= $number_of_columns_to_trim_from_the_end) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2204 my $new_cigar_piece;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2205 # length of the new cigar piece
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2206 my $length = $counter_of_trimmed_columns_from_the_end - $number_of_columns_to_trim_from_the_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2207 if ($length > 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2208 $new_cigar_piece = $length.$type;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2209 } elsif ($length == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2210 $new_cigar_piece = $type;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2211 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2212 push(@cigar, $new_cigar_piece) if ($new_cigar_piece);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2213 if ($type eq "M") {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2214 $counter_of_trimmed_base_pairs -= $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2215 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2216
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2217 ## We don't want to end with an insertion. Trim it!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2218 while (@cigar and $cigar[-1] =~ /[I]/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2219 my ($num, $type) = ($cigar[-1] =~ /^(\d*)([DIGMX])/);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2220 #my $type = substr( $cigar, -1, 1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2221 #my $num = substr( $cigar, 0 ,-1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2222 $num = 1 if ($num eq "");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2223 $counter_of_trimmed_base_pairs += $num;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2224 pop(@cigar);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2225 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2226 last;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2227 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2228 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2229 if ($self->dnafrag_strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2230 $restricted_genomic_align->dnafrag_end($restricted_genomic_align->dnafrag_end - $counter_of_trimmed_base_pairs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2231 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2232 $restricted_genomic_align->dnafrag_start($restricted_genomic_align->dnafrag_start + $counter_of_trimmed_base_pairs);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2233 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2234 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2235
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2236 ## Save genomic_align's cigar_line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2237 $restricted_genomic_align->aligned_sequence(0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2238 $restricted_genomic_align->cigar_line(join("", @cigar));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2240 return $restricted_genomic_align;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2241 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2242
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2243 1;