annotate variant_effect_predictor/Bio/Structure/Entry.pm @ 2:a5976b2dce6f

changing defualt values for ensembl database
author mahtabm
date Thu, 11 Apr 2013 17:15:42 +1000
parents 1f6dce3d34e0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: Entry.pm,v 1.17 2002/10/22 07:38:44 lapp Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # bioperl module for Bio::Structure::Entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # Cared for by Kris Boulez <kris.boulez@algonomics.com>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 # Copyright Kris Boulez
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 # POD documentation - main docs before the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 Bio::Structure::Entry - Bioperl structure Object, describes the whole entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 #add synopsis here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 This object stores a whole Bio::Structure entry. It can consist of one or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 more models (Bio::Structure::Model), which in turn consist of one or more
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 chains (Bio::Structure::Chain). A chain is composed of residues
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 (Bio::Structure::Residue) and a residue consists of atoms (Bio::Structure::Atom)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 If no specific model or chain is chosen, the first one is choosen.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 User feedback is an integral part of the evolution of this and other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 Bioperl modules. Send your comments and suggestions preferably to one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 of the Bioperl mailing lists. Your participation is much appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 http://bio.perl.org/MailList.html - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 the bugs and their resolution. Bug reports can be submitted via email
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 or the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 bioperl-bugs@bio.perl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 =head1 AUTHOR - Kris Boulez
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 Email kris.boulez@algonomics.com
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 The rest of the documentation details each of the object methods. Internal methods are usually preceded with a _
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 package Bio::Structure::Entry;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 use Bio::Root::Root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 use Bio::Structure::StructureI;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 use Bio::Structure::Model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 use Bio::Structure::Chain;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 use Bio::Annotation::Collection;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 use Tie::RefHash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 @ISA = qw(Bio::Root::Root Bio::Structure::StructureI);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 =head2 new()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 Title : new()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 Usage : $struc = Bio::Structure::Entry->new(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 -id => 'structure_id',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 Function: Returns a new Bio::Structure::Entry object from basic
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 constructors. Probably most called from Bio::Structure::IO.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 Returns : a new Bio::Structure::Model object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 my ($class, @args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 my $self = $class->SUPER::new(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 my($id, $model, $chain, $residue ) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 $self->_rearrange([qw(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 ID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 MODEL
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 CHAIN
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 RESIDUE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 )],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 @args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 # where to store parent->child relations (1 -> 1..n)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 # value to this hash will be an array ref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 # by using Tie::RefHash we can store references in this hash
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 $self->{'p_c'} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 tie %{ $self->{'p_c'} } , "Tie::RefHash";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 # where to store child->parent relations (1 -> 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 $self->{'c_p'} = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 tie %{ $self->{'c_p'} } , "Tie::RefHash";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 $id && $self->id($id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 $self->{'model'} = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 $model && $self->model($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 if($chain) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 if ( ! defined($self->model) ) { # no model yet, create default one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 $self->_create_default_model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 for my $m ($self->model) { # add this chain on all models
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 $m->chain($chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 $residue && $self->residue($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 # taken from Bio::Seq (or should we just inherit Bio::Seq and override some methods)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 my $ann = Bio::Annotation::Collection->new;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 $self->annotation($ann);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 =head2 model()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 Title : model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 Function: Connects a (or a list of) Model objects to a Bio::Structure::Entry.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 To add a Model (and keep the existing ones) use add_model()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 It returns a list of Model objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 Returns : list of Bio::Structure::Model objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 Args : One Model or a reference to an array of Model objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 sub model {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 my ($self, $model) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 if( defined $model) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 if( (ref($model) eq "ARRAY") ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 ($model->isa('Bio::Structure::Model')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 # remove existing ones, tell they've become orphan
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 my @obj = $self->model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 if (@obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 for my $m (@obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 $self->_remove_from_graph($m);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 $self->{'model'} = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 # add the new ones
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 $self->add_model($self,$model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 $self->throw("Supplied a $model to model, we want a Bio::Structure::Model or a list of these\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 # give back list of models via general get method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 $self->get_models($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 =head2 add_model()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 Title : add_model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 Usage : $structure->add_model($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 Function: Adds a (or a list of) Model objects to a Bio::Structure::Entry.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 Args : One Model or a reference to an array of Model objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 sub add_model {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 my($self,$entry,$model) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 # if only one argument and it's a model, change evrything one place
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 # this is for people calling $entry->add_model($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 if ( !defined $model && ref($entry) =~ /^Bio::Structure::Model/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 $model = $entry;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 $entry = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 # $self and $entry are the same here, but it's used for uniformicity
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 if ( !defined($entry) || ref($entry) !~ /^Bio::Structure::Entry/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 $self->throw("first argument to add_model needs to be a Bio::Structure::Entry object\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 if (defined $model) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 if (ref($model) eq "ARRAY") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 # if the user passed in a reference to an array
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 for my $m ( @{$model} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 if( ! $m->isa('Bio::Structure::Model') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 $self->throw("$m is not a Model\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 if ( $self->_parent($m) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 $self->throw("$m already assigned to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 push @{$self->{'model'}}, $m;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 # create a stringified version of our ref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 # not used untill we get symbolic ref working
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 #my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 #$m->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 elsif ( $model->isa('Bio::Structure::Model') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 if ( $self->_parent($model) ) { # already assigned to a parent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 $self->throw("$model already assigned\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 push @{$self->{'model'}}, $model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 # create a stringified version of our ref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 #my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 #$model->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 $self->throw("Supplied a $model to add_model, we want a Model or list of Models\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 my $array_ref = $self->{'model'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 return $array_ref ? @{$array_ref} : ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 =head2 get_models()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 Title : get_models
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 Usage : $structure->get_models($structure);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 Function: general get method for models attached to an Entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 Returns : a list of models attached to this entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 Args : an Entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 sub get_models {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 my ($self, $entry) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 # self and entry can be the same
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 if ( !defined $entry) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 $entry = $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 # pass through to add_model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 $self->add_model($entry);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 =head2 id()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 Title : id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 Usage : $entry->id("identity");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 Function: Gets/sets the ID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 sub id {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 my ($self, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 if (defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 $self->{'id'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 return $self->{'id'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 =head2 chain()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 Title : chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 Usage : @chains = $structure->chain($chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 Function: Connects a (or a list of) Chain objects to a Bio::Structure::Entry.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 Returns : list of Bio::Structure::Residue objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 Args : One Residue or a reference to an array of Residue objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 sub chain {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 my ($self, $chain) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 if ( ! $self->model ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 $self->_create_default_model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 my @models = $self->model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 my $first_model = $models[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 if ( defined $chain) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 if( (ref($chain) eq "ARRAY") ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 ($chain->isa('Bio::Structure::Chain')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 # remove existing ones, tell they've become orphan
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 my @obj = $self->get_chains($first_model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 if (@obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 for my $c (@obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 $self->_remove_from_graph($c);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 # add the new ones
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 $self->add_chain($first_model,$chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 $self->throw("Supplied a $chain to chain, we want a Bio::Structure::Chain or a list of these\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 $self->get_chains($first_model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 =head2 add_chain()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 Title : add_chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 Usage : @chains = $structure->add_chain($add_chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 Function: Adds a (or a list of) Chain objects to a Bio::Structure::Entry.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 sub add_chain {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 my($self, $model, $chain) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 if (ref($model) !~ /^Bio::Structure::Model/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 $self->throw("add_chain: first argument needs to be a Model object ($model)\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 if (defined $chain) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 if (ref($chain) eq "ARRAY") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 # if the user passed in a reference to an array
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 for my $c ( @{$chain} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 if( ! $c->isa('Bio::Structure::Chain') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 $self->throw("$c is not a Chain\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 if ( $self->_parent($c) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 $self->throw("$c already assigned to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $self->_parent($c, $model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 $self->_child($model, $c);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 # stringify $self ref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 #my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 #$c->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 elsif ( $chain->isa('Bio::Structure::Chain') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 if ( $self->_parent($chain) ) { # already assigned to parent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 $self->throw("$chain already assigned to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 $self->_parent($chain,$model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 $self->_child($model, $chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 # stringify $self ref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 #my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 #$chain->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 $self->throw("Supplied a $chain to add_chain, we want a Chain or list of Chains\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 my $array_ref = $self->_child($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 return $array_ref ? @{$array_ref} : ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 =head2 get_chains()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 Title : get_chains
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 Usage : $entry->get_chains($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 Function: general get method for chains attached to a Model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 Returns : a list of chains attached to this model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 Args : a Model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 sub get_chains {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 my ($self, $model) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 if (! defined $model) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 $model = ($self->get_models)[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 # pass through to add_chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 $self->add_chain($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 =head2 residue()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 Title : residue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 Usage : @residues = $structure->residue($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 Function: Connects a (or a list of) Residue objects to a Bio::Structure::Entry.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 Returns : list of Bio::Structure::Residue objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 Args : One Residue or a reference to an array of Residue objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 sub residue {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 my ($self, $residue) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 if ( ! $self->model ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 my $m = $self->_create_default_model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 $self->add_model($self,$m);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 my @models = $self->model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 my $first_model = $models[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 if ( ! $self->get_chains($first_model) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 my $c = $self->_create_default_chain;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 $self->add_chain($first_model, $c);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 my @chains = $self->get_chains($first_model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 my $first_chain = $chains[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 if( defined $residue) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 if( (ref($residue) eq "ARRAY") ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 ($residue->isa('Bio::Structure::Residue')) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 # remove existing ones, tell they've become orphan
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 my @obj = $self->get_residues($first_chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 if (@obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 for my $r (@obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 $self->_remove_from_graph($r);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 # add the new ones
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 $self->add_residue($first_chain,$residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 $self->throw("Supplied a $residue to residue, we want a Bio::Structure::Residue or a list of these\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 $self->get_residues($first_chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 =head2 add_residue()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 Title : add_residue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 Usage : @residues = $structure->add_residue($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 Function: Adds a (or a list of) Residue objects to a Bio::Structure::Entry.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 Returns : list of Bio::Structure::Residue objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 Args : One Residue or a reference to an array of Residue objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 sub add_residue {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 my($self,$chain,$residue) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 if (ref($chain) !~ /^Bio::Structure::Chain/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 $self->throw("add_residue: first argument needs to be a Chain object\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 if (defined $residue) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 if (ref($residue) eq "ARRAY") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 # if the user passed in a reference to an array
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 for my $r ( @{$residue} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 if( ! $r->isa('Bio::Structure::Residue') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 $self->throw("$r is not a Residue\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 if ( $self->_parent($r) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 $self->throw("$r already belongs to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 $self->_parent($r, $chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 $self->_child($chain, $r);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 # stringify
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 $r->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 elsif ( $residue->isa('Bio::Structure::Residue') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 if ( $self->_parent($residue) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 $self->throw("$residue already belongs to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 $self->_parent($residue, $chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 $self->_child($chain, $residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 # stringify
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 $residue->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 $self->throw("Supplied a $residue to add_residue, we want a Residue or list of Residues\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 my $array_ref = $self->_child($chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 return $array_ref ? @{$array_ref} : ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 =head2 get_residues()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 Title : get_residues
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 Usage : $structure->get_residues($chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 Function: general get method for residues attached to a Chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 Returns : a list of residues attached to this chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 Args : a chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 sub get_residues {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 my ($self, $chain) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 if ( !defined $chain) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 $self->throw("get_residues needs a Chain as argument");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 # pass through to add_residue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 $self->add_residue($chain);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 =head2 add_atom()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 Title : add_atom
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 Usage : @atoms = $structure->add_atom($residue,$atom);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 Function: Adds a (or a list of) Atom objects to a Bio::Structure::Residue.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 Returns : list of Bio::Structure::Atom objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 Args : a residue and an atom
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 sub add_atom {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 my($self,$residue,$atom) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 if (ref($residue) !~ /^Bio::Structure::Residue/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 $self->throw("add_atom: first argument needs to be a Residue object\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 if (defined $atom) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 if (ref($atom) eq "ARRAY") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 # if the user passed in a reference to an array
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 for my $a ( @{$atom} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 if( ! $a->isa('Bio::Structure::Atom') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 $self->throw("$a is not an Atom\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 if ( $self->_parent($a) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 $self->throw("$a already belongs to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 $self->_parent($a, $residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 $self->_child($residue, $a);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 # stringify
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 #my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 #$r->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 #elsif ( $atom->isa('Bio::Structure::Atom') ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 elsif ( ref($atom) =~ /^Bio::Structure::Atom/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 if ( $self->_parent($atom) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 $self->throw("$atom already belongs to a parent\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 $self->_parent($atom, $residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 $self->_child($residue, $atom);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 # stringify
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 #my $str_ref = "$self";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 #$atom->_grandparent($str_ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 my $array_ref = $self->_child($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 return $array_ref ? @{$array_ref} : ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 =head2 get_atoms()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 Title : get_atoms
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 Usage : $structure->get_atoms($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 Function: general get method for atoms attached to a Residue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 Returns : a list of atoms attached to this residue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 Args : a residue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 sub get_atoms {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 my ($self, $residue) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 if ( !defined $residue) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 $self->throw("get_atoms needs a Residue as argument");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 # pass through to add_atom
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 $self->add_atom($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 =head2 parent()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 Title : parent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 Usage : $structure->parent($residue);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 Function: returns the parent of the argument
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 Returns : the parent of the argument
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 Args : a Bio::Structure object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 =head2 conect()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 Title : conect
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 Usage : $structure->conect($source);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 Function: get/set method for conect
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 Returns : a list of serial numbers for atoms connected to source
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 (together with $entry->get_atom_by_serial($model, $serial) this should be OK for now)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 Args : the serial number for the source atom
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 sub conect {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 my ($self, $source, $serial, $type) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 if ( !defined $source ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 $self->throw("You need to supply at least a source to conect");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 if ( defined $serial && defined $type ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 if ( !exists(${$self->{'conect'}}{$source}) || ref(${$self->{'conect'}}{$source} !~ /^ARRAY/ ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 ${$self->{'conect'}}{$source} = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 # we also need to store type, a conect object might be better
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 my $c = $serial . "_" . $type;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 push @{ ${$self->{'conect'}}{$source} }, $c;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 return @{ ${$self->{'conect'}}{$source} };
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 =head2 get_all_conect_source()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 Title : get_all_conect_source
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 Usage : @sources = $structure->get_all_conect_source;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 Function: get all the sources for the conect records
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 Returns : a list of serial numbers for atoms connected to source
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 (together with $entry->get_atom_by_serial($model, $serial) this should be OK for now)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 Description : This is a bit of a kludge, but it's the best for now. Conect info might need
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 to go in a sepearte object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 sub get_all_conect_source {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 my ($self) = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 my (@sources);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 for my $source (sort {$a<=>$b} keys %{$self->{'conect'}}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 push @sources, $source;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 return @sources;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 =head2 master()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 Title : master
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 Usage : $structure->master($source);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 Function: get/set method for master
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 Returns : the master line
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 Args : the master line for this entry
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 sub master {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 my ($self, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 if (defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 $self->{'master'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 return $self->{'master'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 =head2 seqres()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 Title : seqres
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 Usage : $seqobj = $structure->seqres("A");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 Function: gets a sequence object containing the sequence from the SEQRES record.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 if a chain-ID is given , the sequence for this chain is given, if none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 is provided the first chain is choosen
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 Returns : a Bio::PrimarySeq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 Args : the chain-ID of the chain you want the sequence from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 sub seqres {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 my ($self, $chainid) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 my $s_u = "x3 A1 x7 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3 x1 A3";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 my (%seq_ch);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 if ( !defined $chainid) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 my $m = ($self->get_models($self))[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 my $c = ($self->get_chains($m))[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682 $chainid = $c->id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 my $seqres = ($self->annotation->get_Annotations("seqres"))[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 my $seqres_string = $seqres->as_text;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 $self->debug("seqres : $seqres_string\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 $seqres_string =~ s/^Value: //;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 # split into lines of 62 long
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 my @l = unpack("A62" x (length($seqres_string)/62), $seqres_string);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 for my $line (@l) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 # get out chain_id and sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692 # we use a1, as A1 strips all spaces :(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 my ($chid, $seq) = unpack("x3 a1 x7 A51", $line);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 if ($chid eq " ") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 $chid = "default";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 $seq =~ s/(\w+)/\u\L$1/g; # ALA -> Ala (for SeqUtils)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 $seq =~ s/\s//g; # strip all spaces
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 $seq_ch{$chid} .= $seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 $self->debug("seqres : $chid $seq_ch{$chid}\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 # do we have a seqres for this chainid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703 if(! exists $seq_ch{$chainid} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 $self->warn("There is no SEQRES known for chainid \"$chainid\"");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 # this will break for non-protein structures (about 10% for now) XXX KB
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709 my $pseq = Bio::PrimarySeq->new(-alphabet => 'protein');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 $pseq = Bio::SeqUtils->seq3in($pseq,$seq_ch{$chainid});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 my $id = $self->id . "_" . $chainid;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 $pseq->id($id);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 return $pseq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 =head2 get_atom_by_serial()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 Title : get_atom_by_serial
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719 Usage : $structure->get_atom_by_serial($module, $serial);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 Function: get the Atom for a for get_atom_by_serial
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 Returns : the Atom object with this serial number in the model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 Args : Model on which to work, serial number for atom
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 (if only a number is supplied, the first model is chosen)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 sub get_atom_by_serial {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728 my ($self, $model, $serial) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730 if ($model =~ /^\d+$/ && !defined $serial) { # only serial given
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 $serial = $model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 my @m = $self->get_models($self);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 $model = $m[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 if ( !defined $model || ref($model) !~ /^Bio::Structure::Model/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 $self->throw("Could not find (first) model\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 if ( !defined $serial || ($serial !~ /^\d+$/) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 $self->throw("The serial number you provided looks fishy ($serial)\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 for my $chain ($self->get_chains($model) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742 for my $residue ($self->get_residues($chain) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 for my $atom ($self->get_atoms($residue) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 # this could get expensive, do we cache ???
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 next unless ($atom->serial == $serial);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 return $atom;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752 sub parent {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 my ($self, $obj) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755 if ( !defined $obj) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 $self->throw("parent: you need to supply an argument to get the parent from\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759 # for now we pass on to _parent, untill we get the symbolic ref thing working.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 $self->_parent($obj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 sub DESTROY {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 #print STDERR "DESTROY on $self being called\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 ## for my $pc (keys %{ $self->{'p_c'} } ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 ## next unless ( defined ${ $self->{'p_c'} }{$pc} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 ## delete ${$self->{'p_c'}}{$pc};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 ## }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 ## for my $cp (keys %{ $self->{'c_p'} } ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 ## next unless ( defined ${ $self->{'c_p'} }{$cp} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 ## delete ${$self->{'c_p'}}{$cp};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 ## }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 %{ $self->{'p_c'} } = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 %{ $self->{'c_p'} } = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 # copied from Bio::Seq.pm
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 =head2 annotation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 Title : annotation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 Usage : $obj->annotation($seq_obj)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 Function:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 Example :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 Returns : value of annotation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 sub annotation {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 my ($obj,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 if( defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 $obj->{'annotation'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 return $obj->{'annotation'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 # from here on only private methods
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 =head2 _remove_models()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 Title : _remove_models
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 Usage :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 Function: Removes the models attached to an Entry. Tells the models they
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 don't belong to this Entry any more
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 #'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 sub _remove_models {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 my ($self) = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 ;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 =head2 _create_default_model()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 Title : _create_default_model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 Usage :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 Function: Creates a default Model for this Entry. Typical situation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833 in an X-ray structure where there is only one model
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 sub _create_default_model {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 my ($self) = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842 my $model = Bio::Structure::Model->new(-id => "default");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 return $model;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 =head2 _create_default_chain()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 Title : _create_default_chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850 Usage :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 Function: Creates a default Chain for this Model. Typical situation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 in an X-ray structure where there is only one chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858 sub _create_default_chain {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859 my ($self) = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 my $chain = Bio::Structure::Chain->new(-id => "default");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862 return $chain;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867 =head2 _parent()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869 Title : _parent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 Usage : This is an internal function only. It is used to have one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871 place that keeps track of which object has which other object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 as parent. Thus allowing the underlying modules (Atom, Residue,...)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873 to have no knowledge about all this (and thus removing the possibility
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 of reference cycles).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875 This method hides the details of manipulating references to an anonymous
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 hash.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877 Function: To get/set an objects parent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 Returns : a reference to the parent if it exist, undef otherwise. In the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 current implementation each node should have a parent (except Entry).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 # manipulating the c_p hash
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 sub _parent {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887 no strict "refs";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888 my ($self, $key, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 if ( (!defined $key) || (ref($key) !~ /^Bio::/) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 $self->throw("First argument to _parent needs to be a reference to a Bio:: object ($key)\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 if ( (defined $value) && (ref($value) !~ /^Bio::/) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894 $self->throw("Second argument to _parent needs to be a reference to a Bio:: object\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 # no checking here for consistency of key and value, needs to happen in caller
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 if (defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 # is this value already in, shout
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 if (defined ( $self->{'c_p'}->{$key}) &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901 exists ( $self->{'c_p'}->{$key})
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903 $self->throw("_parent: $key already has a parent ${$self->{'c_p'}}{$key}\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905 ${$self->{'c_p'}}{$key} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 return ${$self->{'c_p'}}{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911 =head2 _child()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913 Title : _child
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914 Usage : This is an internal function only. It is used to have one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915 place that keeps track of which object has which other object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 as child. Thus allowing the underlying modules (Atom, Residue,...)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917 to have no knowledge about all this (and thus removing the possibility
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 to have no knowledge about all this (and thus removing the possibility
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 of reference cycles).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 This method hides the details of manipulating references to an anonymous
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921 hash.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922 Function: To get/set an object's child(ren)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 Returns : a reference to an array of child(ren) if it exist, undef otherwise.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928 # manipulating the p_c hash
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929 sub _child {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 my ($self, $key, $value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932 if ( (!defined $key) || (ref($key) !~ /^Bio::/) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933 $self->throw("First argument to _child needs to be a reference to a Bio:: object\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 if ( (defined $value) && (ref($value) !~ /^Bio::/) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936 $self->throw("Second argument to _child needs to be a reference to a Bio:: object\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938 # no checking here for consistency of key and value, needs to happen in caller
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940 if (defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941 if ( !exists(${$self->{'p_c'}}{$key}) || ref(${$self->{'p_c'}}{$key}) !~ /^ARRAY/ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942 ${$self->{'p_c'}}{$key} = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944 push @{ ${$self->{'p_c'}}{$key} }, $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946 return ${$self->{'p_c'}}{$key};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 =head2 _remove_from_graph()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953 Title : _remove_from_graph
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 Usage : This is an internal function only. It is used to remove from
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955 the parent/child graph. We only remove the links from object to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956 his parent. Not the ones from object to its children.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957 Function: To remove an object from the parent/child graph
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959 Args : the object to be orphaned
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963 sub _remove_from_graph {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964 my ($self, $object) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966 if ( !defined($object) && ref($object) !~ /^Bio::/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 $self->throw("_remove_from_graph needs a Bio object as argument");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969 if ( $self->_parent($object) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970 my $dad = $self->_parent($object);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 # if we have a parent, remove me as being a child
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972 for my $k (0 .. $#{$self->_child($dad)}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973 if ($object eq ${$self->{'p_c'}{$dad}}[$k]) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974 splice(@{$self->{'p_c'}{$dad}}, $k,1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 delete( $self->{'c_p'}{$object});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 sub _print_stats_pc {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983 # print stats about the parent/child hashes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984 my ($self) =@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985 my $pc = scalar keys %{$self->{'p_c'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986 my $cp = scalar keys %{$self->{'c_p'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987 my $now_time = Time::HiRes::time();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988 $self->debug("pc stats: P_C $pc C_P $cp $now_time\n");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
989 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
990
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
991
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
992 1;