annotate variant_effect_predictor/Bio/SeqIO/bsml.pm @ 3:d30fa12e4cc5 default tip

Merge heads 2:a5976b2dce6f and 1:09613ce8151e which were created as a result of a recently fixed bug.
author devteam <devteam@galaxyproject.org>
date Mon, 13 Jan 2014 10:38:30 -0500
parents 1f6dce3d34e0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 # BioPerl module for Bio::SeqIO::bsml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 # Cared for by Charles Tilford (tilfordc@bms.com)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # Copyright (C) Charles Tilford 2001
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 # This library is free software; you can redistribute it and/or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 # modify it under the terms of the GNU Lesser General Public
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 # License as published by the Free Software Foundation; either
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10 # version 2.1 of the License, or (at your option) any later version.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12 # This library is distributed in the hope that it will be useful,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 # Lesser General Public License for more details.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 # You should have received a copy of the GNU Lesser General Public
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18 # License along with this library; if not, write to the Free Software
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 # Also at: http://www.gnu.org/copyleft/lesser.html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 # Much of the basic documentation in this module has been
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 # cut-and-pasted from the embl.pm (Ewan Birney) SeqIO module.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 Bio::SeqIO::bsml - BSML sequence input/output stream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 It is probably best not to use this object directly, but rather go
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 through the SeqIO handler system. To read a BSML file:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 $stream = Bio::SeqIO->new( -file => $filename, -format => 'bsml');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 while ( my $bioSeqObj = $stream->next_seq() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 # do something with $bioSeqObj
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 To write a Seq object to the current file handle in BSML XML format:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 $stream->write_seq( -seq => $seqObj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 If instead you would like a XML::DOM object containing the BSML, use:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 my $newXmlObject = $stream->to_bsml( -seq => $seqObj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 =head1 DEPENDENCIES
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 In addition to parts of the Bio:: hierarchy, this module uses:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 XML::DOM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 This object can transform Bio::Seq objects to and from BSML (XML)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 flatfiles.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 =head2 NOTE:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 2/1/02 - I have changed the API to more closely match argument
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 passing used by other BioPerl methods ( -tag => value ). Internal
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 methods are using the same API, but you should not be calling those
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 anyway...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 =head1 FEEDBACK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 =head2 Mailing Lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 User feedback is an integral part of the evolution of this and other
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 Bioperl modules. Send your comments and suggestions preferably to one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 of the Bioperl mailing lists. Your participation is much
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 appreciated.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 bioperl-l@bioperl.org - General discussion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 http://www.bioperl.org/MailList.shtml - About the mailing lists
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 =head2 Reporting Bugs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 Report bugs to the Bioperl bug tracking system to help us keep track
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 the bugs and their resolution.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 Bug reports can be submitted via email or the web:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 bioperl-bugs@bio.perl.org
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 http://bugzilla.bioperl.org/
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 =head2 Things Still to Do
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 * The module now uses the new Collection.pm system. However,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 Annotations associated with a Feature object still seem to use the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 old system, so parsing with the old methods are included..
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 * Generate Seq objects with no sequence data but an assigned
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 length. This appears to be an issue with Bio::Seq. It is possible
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 (and reasonable) to make a BSML document with features but no
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 sequence data.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 * Support <Seq-data-import>. Do not know how commonly this is used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 * Some features are awaiting implementation in later versions of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 BSML. These include:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 * Nested feature support
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 * Complex feature (ie joins)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 * Unambiguity in strand (ie -1,0,1, not just 'complement' )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 * More friendly dblink structures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 * Location.pm (or RangeI::union?) appears to have a bug when 'expand'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 is used.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 * More intelligent hunting for sequence and feature titles? It is not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 terribly clear where the most appropriate field is located, better
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 grepping (eg looking for a reasonable count for spaces and numbers)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 may allow for titles better than "AE008041".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 =head1 AUTHOR - Charles Tilford
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 Bristol-Myers Squibb Bioinformatics
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 Email tilfordc@bms.com
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 I have developed the BSML specific code for this package, but have used
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 code from other SeqIO packages for much of the nuts-and-bolts. In particular
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 I have used code from the embl.pm module either directly or as a framework
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 for many of the subroutines that are common to SeqIO modules.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 package Bio::SeqIO::bsml;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 use Bio::SeqIO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 use Bio::SeqFeature::Generic;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 use Bio::Species;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 use XML::DOM;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 use Bio::Seq::SeqFactory;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 use Bio::Annotation::Collection;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 use Bio::Annotation::Comment;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 use Bio::Annotation::Reference;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 use Bio::Annotation::DBLink;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 @ISA = qw(Bio::SeqIO);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 my $idcounter = {}; # Used to generate unique id values
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 my $nvtoken = ": "; # The token used if a name/value pair has to be stuffed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 # into a single line
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 # LS: this seems to get overwritten on line 1317, generating a redefinition error. Dead code?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 # CAT: This was inappropriately added in revision 1.10 - I added the check for existance of a sequence factory to the actual _initialize
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 # sub _initialize {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 # my($self,@args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 # $self->SUPER::_initialize(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 # if( ! defined $self->sequence_factory ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 # $self->sequence_factory(new Bio::Seq::SeqFactory(-verbose => $self->verbose(), -type => 'Bio::Seq::RichSeq'));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 # }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 =head2 next_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 Title : next_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 Usage : my $bioSeqObj = $stream->next_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 Function: Retrieves the next sequence from a SeqIO::bsml stream.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 Returns : A reference to a Bio::Seq::RichSeq object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 Args :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 sub next_seq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 my ($desc);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 my $bioSeq = $self->sequence_factory->create(-verbose =>$self->verbose());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 unless (exists $self->{'domtree'}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 $self->throw("A BSML document has not yet been parsed.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 my $dom = $self->{'domtree'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 my $seqElements = $dom->getElementsByTagName ("Sequence");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 if ($self->{'current_node'} == $seqElements->getLength ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 # There are no more <Sequence>s to process
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 my $xmlSeq = $seqElements->item($self->{'current_node'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 # Assume that title attribute contains the best display id
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 if (my $val = $xmlSeq->getAttribute( "title")) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 $bioSeq->display_id($val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 # Set the molecule type
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 if (my $val = $xmlSeq->getAttribute( "molecule" )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 my %mol = ('dna' => 'DNA', 'rna' => 'RNA', 'aa' => 'protein');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 $bioSeq->molecule($mol{ lc($val) });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 # Set the accession number
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 if (my $val = $xmlSeq->getAttribute( "ic-acckey" )) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 $bioSeq->accession_number($val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 # Get the sequence data for the element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 if (my $seqData = &FIRSTDATA($xmlSeq->getElementsByTagName("Seq-data")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 ->item(0) ) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 # Sequence data exists, transfer to the Seq object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 # Remove white space and CRs (not neccesary?)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 $seqData =~ s/[\s\n\r]//g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 $bioSeq->seq($seqData);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 } elsif (my $import = $xmlSeq->getElementsByTagName("Seq-dataimport")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 ->item(0) ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 #>>>> # What about <Seq-data-import> ??
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 } elsif (my $val = $xmlSeq->getAttribute("length")) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 # No sequence defined, set the length directly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 #>>>> # This does not appear to work - length is apparently calculated
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 # from the sequence. How to make a "virtual" sequence??? Such
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 # creatures are common in BSML...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 $bioSeq->length($val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 my $species = Bio::Species->new();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 my @classification = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 # Peruse the generic <Attributes> - those that are direct children of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 # the <Sequence> or the <Feature-tables> element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 # Sticky wicket here - data not controlled by schema, could be anything
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 my @seqDesc = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 my %specs = ('common_name' => 'y',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 'genus' => 'y',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 'species' => 'y',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 'sub_species' => 'y', );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 my %seqMap = (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 'add_date' => [ 'date' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 'keywords' => [ 'keyword', ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 'seq_version' => [ 'version' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 'division' => [ 'division' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 'add_secondary_accession' => ['accession'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 'pid' => ['pid'],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 'primary_id' => [ 'primary.id', 'primary_id' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 my $floppies = &GETFLOPPIES($xmlSeq);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 foreach my $attr (@{$floppies}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 # Don't want to get attributes from <Feature> or <Table> elements yet
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 my $parent = $attr->getParentNode->getNodeName;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 next unless($parent eq "Sequence" || $parent eq "Feature-tables");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 my ($name, $content) = &FLOPPYVALS($attr);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 $name = lc($name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 if (exists $specs{$name}) { # It looks like part of species...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 $species->$name($content);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 my $value = "";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 # Cycle through the Seq methods:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 foreach my $method (keys %seqMap) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 # Cycle through potential matching attributes:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 foreach my $match (@{$seqMap{$method}}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 # If the <Attribute> name matches one of the keys,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 # set $value, unless it has already been set
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 $value ||= $content if ($name =~ /$match/i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 if ($value ne "") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 $bioSeq->$method($value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 next if ($value ne "");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 if ($name =~ /^species$/i) { # Uh, it's the species designation?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 if ($content =~ / /) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 # Assume that a full species name has been provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 # This will screw up if the last word is the subspecies...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 my @break = split " ", $content;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 @classification = reverse @break;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 $classification[0] = $content;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 if ($name =~ /sub[_ ]?species/i) { # Should be the subspecies...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 $species->sub_species( $content );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 if ($name =~ /classification/i) { # Should be species classification
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 # We will assume that there are spaces separating the terms:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 my @bits = split " ", $content;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 # Now make sure there is not other cruft as well (eg semi-colons)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 for my $i (0..$#bits) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 $bits[$i] =~ /(\w+)/;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 $bits[$i] = $1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 $species->classification( @bits );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 if ($name =~ /comment/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 my $com = Bio::Annotation::Comment->new('-text' => $content);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 # $bioSeq->annotation->add_Comment($com);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 $bioSeq->annotation->add_Annotation('comment', $com);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 # Description line - collect all descriptions for later assembly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 if ($name =~ /descr/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 push @seqDesc, $content;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 # Ok, we have no idea what this attribute is. Dump to SimpleValue
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 my $simp = Bio::Annotation::SimpleValue->new( -value => $content);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 $bioSeq->annotation->add_Annotation($name, $simp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 unless ($#seqDesc < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 $bioSeq->desc( join "; ", @seqDesc);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 #>>>> This should be modified so that any IDREF associated with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 # <Reference> is then used to associate the reference with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 # appropriate Feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 # Extract out <Reference>s associated with the sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 my @refs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 my %tags = (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 -title => "RefTitle",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 -authors => "RefAuthors",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 -location => "RefJournal",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 foreach my $ref ( $xmlSeq->getElementsByTagName ("Reference") ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 my %refVals;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 foreach my $tag (keys %tags) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 my $rt = &FIRSTDATA($ref->getElementsByTagName($tags{$tag})
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 ->item(0));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 $rt =~ s/^[\s\r\n]+//; # Kill leading space
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 $rt =~ s/[\s\r\n]+$//; # Kill trailing space
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 $rt =~ s/[\s\r\n]+/ /; # Collapse internal space runs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $refVals{$tag} = $rt;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 my $reference = Bio::Annotation::Reference->new( %refVals );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 # Pull out any <Reference> information hidden in <Attributes>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 my %refMap = (
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 comment => [ 'comment', 'remark' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 medline => [ 'medline', ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 pubmed => [ 'pubmed' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 start => [ 'start', 'begin' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 end => [ 'stop', 'end' ],
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 my @refCom = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 my $floppies = &GETFLOPPIES($ref);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 foreach my $attr (@{$floppies}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 my ($name, $content) = &FLOPPYVALS($attr);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 my $value = "";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 # Cycle through the Seq methods:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 foreach my $method (keys %refMap) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 # Cycle through potential matching attributes:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 foreach my $match (@{$refMap{$method}}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 # If the <Attribute> name matches one of the keys,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 # set $value, unless it has already been set
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 $value ||= $content if ($name =~ /$match/i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 if ($value ne "") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 my $str = '$reference->' . $method . "($value)";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 eval($str);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 next;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 next if ($value ne "");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 # Don't know what the <Attribute> is, dump it to comments:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 push @refCom, $name . $nvtoken . $content;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 unless ($#refCom < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 # Random stuff was found, tack it to the comment field
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 my $exist = $reference->comment;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 $exist .= join ", ", @refCom;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 $reference->comment($exist);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 push @refs, $reference;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 $bioSeq->annotation->add_Annotation('reference'=>$_) foreach @refs;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 # Extract the <Feature>s for this <Sequence>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 foreach my $feat ( $xmlSeq->getElementsByTagName("Feature") ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 $bioSeq->add_SeqFeature( $self->_parse_bsml_feature($feat) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 $species->classification( @classification );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 $bioSeq->species( $species );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 # $seq->annotation->add_DBLink(@links); ->
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 $self->{'current_node'}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 return $bioSeq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 # Get all the <Attribute> and <Qualifier> children for an object, and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 # return them as an array reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 # ('floppy' since these elements have poor/no schema control)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 sub GETFLOPPIES {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 my $obj = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 my @floppies;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 my $attributes = $obj->getElementsByTagName ("Attribute");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 for (my $i = 0; $i < $attributes->getLength; $i++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 push @floppies, $attributes->item($i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 my $qualifiers = $obj->getElementsByTagName ("Qualifier");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 for (my $i = 0; $i < $qualifiers->getLength; $i++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 push @floppies, $qualifiers->item($i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 return \@floppies;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 # Given a DOM <Attribute> or <Qualifier> object, return the [name, value] pair
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 sub FLOPPYVALS {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 my $obj = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 my ($name, $value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 if ($obj->getNodeName eq "Attribute") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 $name = $obj->getAttribute('name');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 $value = $obj->getAttribute('content');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 } elsif ($obj->getNodeName eq "Qualifier") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 # Wheras <Attribute>s require both 'name' and 'content' attributes,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 # <Qualifier>s can technically have either blank (and sometimes do)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 my $n = $obj->getAttribute('value-type');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 $name = $n if ($n ne "");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 my $v = $obj->getAttribute('value');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 $value = $v if ($v ne "");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 return ($name, $value);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 # Returns the value of the first TEXT_NODE encountered below an element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 # Rational - avoid grabbing a comment rather than the PCDATA. Not foolproof...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 sub FIRSTDATA {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 my $element = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 return undef unless ($element);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 my $hopefuls = $element->getChildNodes;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 my $data;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 for (my $i = 0; $i < $hopefuls->getLength; $i++) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 if ($hopefuls->item($i)->getNodeType ==
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 XML::DOM::Node::TEXT_NODE() ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 $data = $hopefuls->item($i)->getNodeValue;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 last;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 return $data;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 #- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 # Just collapses whitespace runs in a string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 sub STRIP {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 my $string = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 $string =~ s/[\s\r\n]+/ /g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 return $string;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 =head2 to_bsml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 Title : to_bsml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 Usage : my $domDoc = $obj->to_bsml(@args)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 Function: Generates an XML structure for one or more Bio::Seq objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 If $seqref is an array ref, the XML tree generated will include
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 all the sequences in the array.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 Returns : A reference to the XML DOM::Document object generated / modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 Args : Argument array in form of -key => val. Recognized keys:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 -seq A Bio::Seq reference, or an array reference of many of them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 -xmldoc Specifies an existing XML DOM document to add the sequences
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 to. If included, then only data (no page formatting) will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 be added. If not, a new XML::DOM::Document will be made,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 and will be populated with both <Sequence> data, as well as
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 <Page> display elements.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 -nodisp Do not generate <Display> elements, or any children
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 thereof, even if -xmldoc is not set.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 -skipfeat If set to 'all', all <Feature>s will be skipped. If it is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 a hash reference, any <Feature> with a class matching a key
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 in the hash will be skipped - for example, to skip 'source'
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 and 'score' features, use:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 -skipfeat => { source => 'Y', score => 'Y' }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 -skiptags As above: if set to 'all', no tags are included, and if a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 hash reference, those specific tags will be ignored.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 Skipping some or all tags and features can result in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 noticable speed improvements.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 -nodata If true, then <Seq-data> will not be included. This may be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 useful if you just want annotations and do not care about
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 the raw ACTG information.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 -return Default is 'xml', which will return a reference to the BSML
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 XML object. If set to 'seq' will return an array ref of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 <Sequence> objects added (rather than the whole XML object)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 -close Early BSML browsers will crash if an element *could* have
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 children but does not, and is closed as an empty element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 e.g. <Styles/>. If -close is true, then such tags are given
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 a comment child to explicitly close them e.g. <Styles><!--
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 --></Styles>. This is default true, set to "0" if you do
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 not want this behavior.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 Examples : my $domObj = $stream->to_bsml( -seq => \@fourCoolSequenceObjects,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 -skipfeat => { source => 1 },
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 # Or add sequences to an existing BSML document:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 $stream->to_bsml( -seq => \@fourCoolSequenceObjects,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 -skipfeat => { source => 1 },
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 -xmldoc => $myBsmlDocumentInProgress, );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 sub to_bsml {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 my $args = $self->_parseparams( -close => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 -return => 'xml',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 @_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 $args->{NODISP} ||= $args->{NODISPLAY};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 my $seqref = $args->{SEQ};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 $seqref = (ref($seqref) eq 'ARRAY') ? $seqref : [ $seqref ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 #############################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 # Basic BSML XML Components #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 #############################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 my $xml;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 my ($bsmlElem, $defsElem, $seqsElem, $dispElem);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 if ($args->{XMLDOC}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 # The user has provided an existing XML DOM object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 $xml = $args->{XMLDOC};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 unless ($xml->isa("XML::DOM::Document")) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 die ('SeqIO::bsml.pm error:\n'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 'When calling ->to_bsml( { xmldoc => $myDoc }), $myDoc \n' .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 'should be an XML::DOM::Document object, or an object that\n'.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 'inherits from that class (like BsmlHelper.pm)');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 # The user has not provided a new document, make one from scratch
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 $xml = XML::DOM::Document->new();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 $xml->setXMLDecl( $xml->createXMLDecl("1.0") );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 my $url = "http://www.labbook.com/dtd/bsml2_2.dtd";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 my $doc = $xml->createDocumentType("Bsml",$url);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 $xml->setDoctype($doc);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 $bsmlElem = $self->_addel( $xml, 'Bsml');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 $defsElem = $self->_addel( $bsmlElem, 'Definitions');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 $seqsElem = $self->_addel( $defsElem, 'Sequences');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 unless ($args->{NODISP}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 $dispElem = $self->_addel( $bsmlElem, 'Display');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 my $stylElem = $self->_addel( $dispElem, 'Styles');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 my $style = $self->_addel( $stylElem, 'Style', {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 type => "text/css" });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 my $styleText =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 qq(Interval-widget { display : "1"; }\n) .
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 qq(Feature { display-auto : "1"; });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 $style->appendChild( $xml->createTextNode($styleText) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 # Establish fundamental BSML elements, if they do not already exist
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 $bsmlElem ||= $xml->getElementsByTagName("Bsml")->item(0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 $defsElem ||= $xml->getElementsByTagName("Definitions")->item(0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 $seqsElem ||= $xml->getElementsByTagName("Sequences")->item(0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 ###############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 # <Sequences> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 ###############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 # Map over Bio::Seq to BSML
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 my %mol = ('dna' => 'DNA', 'rna' => 'RNA', 'protein' => 'AA');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 my @xmlSequences;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 foreach my $bioSeq (@{$seqref}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 my $xmlSeq = $xml->createElement("Sequence");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 my $FTs = $xml->createElement("Feature-tables");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 # Array references to hold <Reference> objects:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 my $seqRefs = []; my $featRefs = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 # Array references to hold <Attribute> values (not objects):
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 my $seqDesc = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 push @{$seqDesc}, ["comment" , "This file generated to BSML 2.2 standards - joins will be collapsed to a single feature enclosing all members of the join"];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 push @{$seqDesc}, ["description" , eval{$bioSeq->desc}];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 foreach my $kwd ( eval{@{$bioSeq->keywords || []}} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 push @{$seqDesc}, ["keyword" , $kwd];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 push @{$seqDesc}, ["version" , eval{$bioSeq->seq_version}];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 push @{$seqDesc}, ["division" , eval{$bioSeq->division}];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 push @{$seqDesc}, ["pid" , eval{$bioSeq->pid}];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 # push @{$seqDesc}, ["bio_object" , ref($bioSeq)];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 my $pid = eval{$bioSeq->primary_id} || '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 if( $pid ne $bioSeq ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 push @{$seqDesc}, ["primary_id" , eval{$bioSeq->primary_id}];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 foreach my $dt (eval{$bioSeq->get_dates()} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 push @{$seqDesc}, ["date" , $dt];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 foreach my $ac (eval{$bioSeq->get_secondary_accessions()} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 push @{$seqDesc}, ["secondary_accession" , $ac];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 # Determine the accession number and a unique identifier
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 my $acc = $bioSeq->accession_number eq "unknown" ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 "" : $bioSeq->accession_number;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 my $id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 my $pi = $bioSeq->primary_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 if ($pi && $pi !~ /Bio::/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 # Not sure I understand what primary_id is... It sometimes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 # is a string describing a reference to a BioSeq object...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 $id = "SEQ" . $bioSeq->primary_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 # Nothing useful found, make a new unique ID
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 $id = $acc || ("SEQ-io" . $idcounter->{Sequence}++);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 # print "$id->",ref($bioSeq->primary_id),"\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 # An id field with spaces is interpreted as an idref - kill the spaces
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 $id =~ s/ /-/g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 # Map over <Sequence> attributes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 my %attr = ( 'title' => $bioSeq->display_id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 'length' => $bioSeq->length,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 'ic-acckey' => $acc,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 'id' => $id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 'representation' => 'raw',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 $attr{molecule} = $mol{ lc($bioSeq->molecule) } if $bioSeq->can('molecule');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 foreach my $a (keys %attr) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 $xmlSeq->setAttribute($a, $attr{$a}) if (defined $attr{$a} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 $attr{$a} ne "");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 # Orphaned Attributes:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 $xmlSeq->setAttribute('topology', 'circular')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 if ($bioSeq->is_circular);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 # <Sequence> strand, locus
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 $self->_add_page($xml, $xmlSeq) if ($dispElem);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 ################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 # <Attributes> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 ################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 # Check for Bio::Annotations on the * <Sequence> *.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 $self->_parse_annotation( -xml => $xml, -obj => $bioSeq,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 -desc => $seqDesc, -refs => $seqRefs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 # Incorporate species data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 if (ref($bioSeq->species) eq 'Bio::Species') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 # Need to peer into Bio::Species ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 my @specs = ('common_name', 'genus', 'species', 'sub_species');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 foreach my $sp (@specs) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 next unless (my $val = $bioSeq->species()->$sp());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661 push @{$seqDesc}, [$sp , $val];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 push @{$seqDesc}, ['classification',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664 (join " ", $bioSeq->species->classification) ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 # Species::binomial will return "genus species sub_species" ...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 } elsif (my $val = $bioSeq->species) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 # Ok, no idea what it is, just dump it in there...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 push @{$seqDesc}, ["species", $val];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 # Add the description <Attribute>s for the <Sequence>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672 foreach my $seqD (@{$seqDesc}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 $self->_addel($xmlSeq, "Attribute", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674 name => $seqD->[0], content => $seqD->[1]}) if ($seqD->[1]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 # If sequence references were added, make a Feature-table for them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 unless ($#{$seqRefs} < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 my $seqFT = $self->_addel($FTs, "Feature-table", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 title => "Sequence References", });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 foreach my $feat (@{$seqRefs}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682 $seqFT->appendChild($feat);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 # This is the appropriate place to add <Feature-tables>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 $xmlSeq->appendChild($FTs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 #############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690 # <Feature> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 #############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 #>>>> # Perhaps it is better to loop through top_Seqfeatures?...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 #>>>> # ...however, BSML does not have a hierarchy for Features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 if (defined $args->{SKIPFEAT} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 $args->{SKIPFEAT} eq 'all') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698 $args->{SKIPFEAT} = { all => 1};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 foreach my $class (keys %{$args->{SKIPFEAT}}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 $args->{SKIPFEAT}{lc($class)} = $args->{SKIPFEAT}{$class};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703 # Loop through all the features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 my @features = $bioSeq->all_SeqFeatures();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 if (@features && !$args->{SKIPFEAT}{all}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 my $ft = $self->_addel($FTs, "Feature-table", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707 title => "Features", });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 foreach my $bioFeat (@features ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709 my $featDesc = [];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 my $class = lc($bioFeat->primary_tag);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 # The user may have specified to ignore this type of feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 next if ($args->{SKIPFEAT}{$class});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 my $id = "FEAT-io" . $idcounter->{Feature}++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 my $xmlFeat = $self->_addel( $ft, 'Feature', {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 'id' => $id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 'class' => $class ,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717 'value-type' => $bioFeat->source_tag });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 # Check for Bio::Annotations on the * <Feature> *.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719 $self->_parse_annotation( -xml => $xml, -obj => $bioFeat,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 -desc => $featDesc, -id => $id,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721 -refs =>$featRefs, );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 # Add the description stuff for the <Feature>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 foreach my $de (@{$featDesc}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 $self->_addel($xmlFeat, "Attribute", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 name => $de->[0], content => $de->[1]}) if ($de->[1]);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 $self->_parse_location($xml, $xmlFeat, $bioFeat);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729 # loop through the tags, add them as <Qualifiers>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730 next if (defined $args->{SKIPTAGS} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 $args->{SKIPTAGS} =~ /all/i);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 # Tags can consume a lot of CPU cycles, and can often be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 # rather non-informative, so -skiptags can allow total or
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 # selective omission of tags.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735 foreach my $tag ($bioFeat->all_tags()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 next if (exists $args->{SKIPTAGS}{$tag});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 foreach my $val ($bioFeat->each_tag_value($tag)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 $self->_addel( $xmlFeat, 'Qualifier', {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 'value-type' => $tag ,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740 'value' => $val });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 ##############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 # <Seq-data> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 ##############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 # Add sequence data
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 if ( (my $data = $bioSeq->seq) && !$args->{NODATA} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752 my $d = $self->_addel($xmlSeq, 'Seq-data');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 $d->appendChild( $xml->createTextNode($data) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 # If references were added, make a Feature-table for them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 unless ($#{$featRefs} < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 my $seqFT = $self->_addel($FTs, "Feature-table", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759 title => "Feature References", });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 foreach my $feat (@{$featRefs}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761 $seqFT->appendChild($feat);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 # Place the completed <Sequence> tree as a child of <Sequences>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 $seqsElem->appendChild($xmlSeq);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767 push @xmlSequences, $xmlSeq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 # Prevent browser crashes by explicitly closing empty elements:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 if ($args->{CLOSE}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 my @problemChild = ('Sequences', 'Sequence', 'Feature-tables',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 'Feature-table', 'Screen', 'View',);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 foreach my $kid (@problemChild) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 foreach my $prob ($xml->getElementsByTagName($kid)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 unless ($prob->hasChildNodes) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 $prob->appendChild(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 $xml->createComment(" Must close <$kid> explicitly "));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 if (defined $args->{RETURN} &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 $args->{RETURN} =~ /seq/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 return \@xmlSequences;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 return $xml;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 =head2 write_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 Title : write_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 Usage : $obj->write_seq(@args)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 Function: Prints out an XML structure for one or more Bio::Seq objects.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 If $seqref is an array ref, the XML tree generated will include
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 all the sequences in the array. This method is fairly simple,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 most of the processing is performed within to_bsml.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 Returns : A reference to the XML object generated / modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801 Args : Argument array. Recognized keys:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803 -seq A Bio::Seq reference, or an array reference of many of them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 Alternatively, the method may be called simply as...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807 $obj->write_seq( $bioseq )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 ... if only a single argument is passed, it is assumed that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 it is the sequence object (can also be an array ref of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811 many Seq objects )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813 -printmime If true prints "Content-type: $mimetype\n\n" at top of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814 document, where $mimetype is the value designated by this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 key. For generic XML use text/xml, for BSML use text/x-bsml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 -return This option will be supressed, since the nature of this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818 method is to print out the XML document. If you wish to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 retrieve the <Sequence> objects generated, use the to_bsml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 method directly.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 sub write_seq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 my $args = $self->_parseparams( @_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827 if ($#_ == 0 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 # If only a single value is passed, assume it is the seq object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829 unshift @_, "-seq";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 # Build a BSML XML DOM object based on the sequence(s)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 my $xml = $self->to_bsml( @_,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833 -return => undef );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 # Convert to a string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 my $out = $xml->toString;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836 # Print after putting a return after each element - more readable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 $out =~ s/>/>\n/g;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 $self->_print("Content-type: " . $args->{PRINTMIME} . "\n\n")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839 if ($args->{PRINTMIME});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 $self->_print( $out );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841 # Return the DOM tree in case the user wants to do something with it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 $self->flush if $self->_flush_on_write && defined $self->_fh;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 return $xml;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 =head1 INTERNAL METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850 The following methods are used for internal processing, and should probably
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 not be accessed by the user.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 =head2 _parse_location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 Title : _parse_location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 Usage : $obj->_parse_location($xmlDocument, $parentElem, $SeqFeatureObj)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857 Function: Adds <Interval-loc> and <Site-loc> children to <$parentElem> based
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858 on locations / sublocations found in $SeqFeatureObj. If
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
859 sublocations exist, the original location will be ignored.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
860 Returns : An array ref containing the elements added to the parent.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
861 These will have already been added to <$parentElem>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
862 Args : 0 The DOM::Document being modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
863 1 The DOM::Element parent that you want to add to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
864 2 Reference to the Bio::SeqFeature being analyzed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
865
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
866 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
867
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
868 ###############################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
869 # <Interval-loc> & <Site-loc> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
870 ###############################
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
871
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
872 sub _parse_location {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
873 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
874 my ($xml, $xmlFeat, $bioFeat) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
875 my $bioLoc = $bioFeat->location;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
876 my @locations;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
877 if (ref($bioLoc) =~ /Split/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
878 @locations = $bioLoc->sub_Location;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
879 # BSML 2.2 does not recognize / support joins. For this reason,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
880 # we will just use the upper-level location. The line below can
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
881 # be deleted or commented out if/when BSML 3 supports complex
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
882 # interval deffinitions:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
883 @locations = ($bioLoc);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
884 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
885 @locations = ($bioLoc);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
886 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
887 my @added = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
888
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
889 # Add the site or interval positional information:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
890 foreach my $loc (@locations) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
891 my ($start, $end) = ($loc->start, $loc->end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
892 my %locAttr;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
893 # Strand information is not well described in BSML
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
894 $locAttr{complement} = 1 if ($loc->strand == -1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
895 if ($start ne "" && ($start == $end || $end eq "")) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
896 $locAttr{sitepos} = $start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
897 push @added, $self->_addel($xmlFeat,'Site-loc',\%locAttr);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
898 } elsif ($start ne "" && $end ne "") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
899 if ($start > $end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
900 # The feature is on the complementary strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
901 ($start, $end) = ($end, $start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
902 $locAttr{complement} = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
903 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
904 $locAttr{startpos} = $start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
905 $locAttr{endpos} = $end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
906 push @added, $self->_addel($xmlFeat,'Interval-loc',\%locAttr);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
907 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
908 warn "Failure to parse SeqFeature location. Start = '$start' & End = '$end'";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
909 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
910 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
911 return \@added;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
912 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
913
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
914 =head2 _parse_bsml_feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
915
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
916 Title : _parse_bsml_feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
917 Usage : $obj->_parse_bsml_feature($xmlFeature )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
918 Function: Will examine the <Feature> element provided by $xmlFeature and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
919 return a generic seq feature.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
920 Returns : Bio::SeqFeature::Generic
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
921 Args : 0 XML::DOM::Element <Feature> being analyzed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
922
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
923 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
924
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
925 sub _parse_bsml_feature {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
926 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
927 my ($feat) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
928
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
929 my $basegsf = new Bio::SeqFeature::Generic;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
930 # score
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
931 # frame
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
932 # source_tag
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
933
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
934 # Use the class as the primary tag value, if it is present
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
935 if ( my $val = $feat->getAttribute("class") ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
936 $basegsf->primary_tag($val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
937 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
938
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
939 # Positional information is in <Interval-loc>s or <Site-loc>s
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
940 # We need to grab these in order, to try to recreate joins...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
941 my @locations = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
942 foreach my $kid ($feat->getChildNodes) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
943 my $nodeName = $kid->getNodeName;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
944 next unless ($nodeName eq "Interval-loc" ||
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
945 $nodeName eq "Site-loc");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
946 push @locations, $kid;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
947 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
948 if ($#locations == 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
949 # There is only one location specified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
950 $self->_parse_bsml_location($locations[0], $basegsf);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
951 } elsif ($#locations > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
952 #>>>> # This is not working, I think the error is somewhere downstream
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
953 # of add_sub_SeqFeature, probably in RangeI::union ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
954 # The sub features are added fine, but the EXPANDed parent feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
955 # location has a messed up start - Bio::SeqFeature::Generic ref
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
956 # instead of an integer - and an incorrect end - the end of the first
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
957 # sub feature added, not of the union of all of them.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
958
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
959 # Also, the SeqIO::genbank.pm output is odd - the sub features appear
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
960 # to be listed with the *previous* feature, not this one.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
961
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
962 foreach my $location (@locations) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
963 my $subgsf = $self->_parse_bsml_location($location);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
964 # print "start ", $subgsf->start,"\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
965 # print "end ", $subgsf->end,"\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
966 $basegsf->add_sub_SeqFeature($subgsf, 'EXPAND');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
967 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
968 # print $feat->getAttribute('id'),"\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
969 # print $basegsf->primary_tag,"\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
970
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
971 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
972 # What to do if there are no locations? Nothing needed?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
973 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
974
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
975 # Look at any <Attribute>s or <Qualifier>s that are present:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
976 my $floppies = &GETFLOPPIES($feat);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
977 foreach my $attr (@{$floppies}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
978 my ($name, $content) = &FLOPPYVALS($attr);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
979
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
980 if ($name =~ /xref/i) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
981 # Do we want to put these in DBLinks??
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
982 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
983
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
984 # Don't know what the object is, dump it to a tag:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
985 $basegsf->add_tag_value(lc($name), $content);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
986 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
987
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
988 # Mostly this helps with debugging, but may be of utility...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
989 # Add a tag holding the BSML id value
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
990 if ( (my $val = $feat->getAttribute('id')) &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
991 !$basegsf->has_tag('bsml-id')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
992 # Decided that this got a little sloppy...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
993 # $basegsf->add_tag_value("bsml-id", $val);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
994 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
995 return $basegsf;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
996 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
997
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
998 =head2 _parse_bsml_location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
999
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1000 Title : _parse_bsml_location
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1001 Usage : $obj->_parse_bsml_feature( $intOrSiteLoc, $gsfObject )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1002 Function: Will examine the <Interval-loc> or <Site-loc> element provided
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1003 Returns : Bio::SeqFeature::Generic
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1004 Args : 0 XML::DOM::Element <Interval/Site-loc> being analyzed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1005 1 Optional SeqFeature::Generic to use
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1006
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1007 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1008
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1009 sub _parse_bsml_location {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1010 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1011 my ($loc, $gsf) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1012
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1013 $gsf ||= new Bio::SeqFeature::Generic;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1014 my $type = $loc->getNodeName;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1015 my ($start, $end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1016 if ($type eq 'Interval-loc') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1017 $start = $loc->getAttribute('startpos');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1018 $end = $loc->getAttribute('endpos');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1019 } elsif ($type eq 'Site-loc') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1020 $start = $end = $loc->getAttribute('sitepos');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1021 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1022 warn "Unknown location type '$type', could not make GSF\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1023 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1024 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1025 $gsf->start($start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1026 $gsf->end($end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1027
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1028 # BSML does not have an explicit method to set undefined strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1029 if (my $s = $loc->getAttribute("complement")) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1030 if ($s) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1031 $gsf->strand(-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1032 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1033 $gsf->strand(1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1034 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1035 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1036 # We're setting "strand nonspecific" here - bad idea?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1037 # In most cases the user likely meant it to be on the + strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1038 $gsf->strand(0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1039 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1040
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1041 return $gsf;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1042 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1043
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1044 =head2 _parse_reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1045
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1046 Title : _parse_reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1047 Usage : $obj->_parse_reference(@args )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1048 Function: Makes a new <Reference> object from a ::Reference, which is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1049 then stored in an array provide by -refs. It will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1050 appended to the XML tree later.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1051 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1052 Args : Argument array. Recognized keys:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1053
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1054 -xml The DOM::Document being modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1055
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1056 -refobj The Annotation::Reference Object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1057
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1058 -refs An array reference to hold the new <Reference> DOM object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1059
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1060 -id Optional. If the XML id for the 'calling' element is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1061 provided, it will be placed in any <Reference> refs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1062 attribute.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1063
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1064 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1065
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1066 sub _parse_reference {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1067 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1068 my $args = $self->_parseparams( @_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1069 my ($xml, $ref, $refRef) = ($args->{XML}, $args->{REFOBJ}, $args->{REFS});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1070
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1071 ###############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1072 # <Reference> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1073 ###############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1074
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1075 my $xmlRef = $xml->createElement("Reference");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1076 #>> This may not be the right way to make a BSML dbxref...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1077 if (my $link = $ref->medline) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1078 $xmlRef->setAttribute('dbxref', $link);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1079 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1080
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1081 # Make attributes for some of the characteristics
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1082 my %stuff = ( start => $ref->start,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1083 end => $ref->end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1084 rp => $ref->rp,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1085 comment => $ref->comment,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1086 pubmed => $ref->pubmed,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1087 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1088 foreach my $s (keys %stuff) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1089 $self->_addel($xmlRef, "Attribute", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1090 name => $s, content => $stuff{$s} }) if ($stuff{$s});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1091 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1092 $xmlRef->setAttribute('refs', $args->{ID}) if ($args->{ID});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1093 # Add the basic information
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1094 # Should probably check for content before creation...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1095 $self->_addel($xmlRef, "RefAuthors")->
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1096 appendChild( $xml->createTextNode(&STRIP($ref->authors)) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1097 $self->_addel($xmlRef, "RefTitle")->
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1098 appendChild( $xml->createTextNode(&STRIP($ref->title)) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1099 $self->_addel($xmlRef, "RefJournal")->
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1100 appendChild( $xml->createTextNode(&STRIP($ref->location)) );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1101 # References will be added later in a <Feature-Table>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1102 push @{$refRef}, $xmlRef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1103 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1104
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1105 =head2 _parse_annotation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1106
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1107 Title : _parse_annotation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1108 Usage : $obj->_parse_annotation(@args )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1109 Function: Will examine any Annotations found in -obj. Data found in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1110 ::Comment and ::DBLink structures, as well as Annotation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1111 description fields are stored in -desc for later
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1112 generation of <Attribute>s. <Reference> objects are generated
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1113 from ::References, and are stored in -refs - these will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1114 be appended to the XML tree later.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1115 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1116 Args : Argument array. Recognized keys:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1117
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1118 -xml The DOM::Document being modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1119
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1120 -obj Reference to the Bio object being analyzed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1121
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1122 -descr An array reference for holding description text items
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1123
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1124 -refs An array reference to hold <Reference> DOM objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1126 -id Optional. If the XML id for the 'calling' element is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1127 provided, it will be placed in any <Reference> refs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1128 attribute.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1129
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1130 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1131
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1132 sub _parse_annotation {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1133 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1134 my $args = $self->_parseparams( @_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1135 my ($xml, $obj, $descRef, $refRef) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1136 ( $args->{XML}, $args->{OBJ}, $args->{DESC}, $args->{REFS} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1137 # No good place to put any of this (except for references). Most stuff
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1138 # just gets dumped to <Attribute>s
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1139 my $ann = $obj->annotation;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1140 return undef unless ($ann);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1141 # use BMS::Branch; my $debug = BMS::Branch->new( ); warn "$obj :"; $debug->branch($ann);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1142 unless (ref($ann) =~ /Collection/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1143 # Old style annotation. It seems that Features still use this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1144 # form of object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1145 $self->_parse_annotation_old(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1146 return;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1147 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1148
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1149 foreach my $key ($ann->get_all_annotation_keys()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1150 foreach my $thing ($ann->get_Annotations($key)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1151 if ($key eq 'description') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1152 push @{$descRef}, ["description" , $thing->value];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1153 } elsif ($key eq 'comment') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1154 push @{$descRef}, ["comment" , $thing->text];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1155 } elsif ($key eq 'dblink') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1156 # DBLinks get dumped to attributes, too
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1157 push @{$descRef}, ["db_xref" , $thing->database . ":"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1158 . $thing->primary_id ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1159 if (my $com = $thing->comment) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1160 push @{$descRef}, ["link" , $com->text ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1161 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1162
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1163 } elsif ($key eq 'reference') {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1164 $self->_parse_reference( @_, -refobj => $thing );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1165 } elsif (ref($thing) =~ /SimpleValue/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1166 push @{$descRef}, [$key , $thing->value];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1167 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1168 # What is this??
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1169 push @{$descRef}, ["error", "bsml.pm did not understand ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1170 "'$key' = '$thing'" ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1171 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1172 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1173 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1174 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1175
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1176 =head2 _parse_annotation_old
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1177
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1178 Title : _parse_annotation_old
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1179 Usage : $obj->_parse_annotation_old(@args)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1180 Function: As above, but for the old Annotation system.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1181 Apparently needed because Features are still using the old-style
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1182 annotations?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1183 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1184 Args : Argument array. Recognized keys:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1185
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1186 -xml The DOM::Document being modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1187
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1188 -obj Reference to the Bio object being analyzed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1189
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1190 -descr An array reference for holding description text items
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1191
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1192 -refs An array reference to hold <Reference> DOM objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1194 -id Optional. If the XML id for the 'calling' element is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1195 provided, it will be placed in any <Reference> refs
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1196 attribute.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1197
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1198 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1199
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1200 ###############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1201 # <Reference> #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1202 ###############
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1203
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1204 sub _parse_annotation_old {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1205 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1206 my $args = $self->_parseparams( @_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1207 my ($xml, $obj, $descRef, $refRef) =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1208 ( $args->{XML}, $args->{OBJ}, $args->{DESC}, $args->{REFS} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1209 # No good place to put any of this (except for references). Most stuff
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1210 # just gets dumped to <Attribute>s
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1211 if (my $ann = $obj->annotation) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1212 push @{$descRef}, ["annotation", $ann->description];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1213 foreach my $com ($ann->each_Comment) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1214 push @{$descRef}, ["comment" , $com->text];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1215 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1217 # Gene names just get dumped to <Attribute name="gene">
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1218 foreach my $gene ($ann->each_gene_name) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1219 push @{$descRef}, ["gene" , $gene];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1220 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1221
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1222 # DBLinks get dumped to attributes, too
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1223 foreach my $link ($ann->each_DBLink) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1224 push @{$descRef}, ["db_xref" ,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1225 $link->database . ":" . $link->primary_id ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1226 if (my $com = $link->comment) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1227 push @{$descRef}, ["link" , $com->text ];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1228 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1229 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1231 # References get produced and temporarily held
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1232 foreach my $ref ($ann->each_Reference) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1233 $self->_parse_reference( @_, -refobj => $ref );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1234 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1235 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1236 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1237
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1238 =head2 _add_page
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1239
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1240 Title : _add_page
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1241 Usage : $obj->_add_page($xmlDocument, $xmlSequenceObject)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1242 Function: Adds a simple <Page> and <View> structure for a <Sequence>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1243 Returns : a reference to the newly created <Page>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1244 Args : 0 The DOM::Document being modified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1245 1 Reference to the <Sequence> object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1246
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1247 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1248
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1249 sub _add_page {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1250 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1251 my ($xml, $seq) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1252 my $disp = $xml->getElementsByTagName("Display")->item(0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1253 my $page = $self->_addel($disp, "Page");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1254 my ($width, $height) = ( 7.8, 5.5);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1255 my $screen = $self->_addel($page, "Screen", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1256 width => $width, height => $height, });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1257 # $screen->appendChild($xml->createComment("Must close explicitly"));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1258 my $view = $self->_addel($page, "View", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1259 seqref => $seq->getAttribute('id'),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1260 title => $seq->getAttribute('title'),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1261 title1 => "{NAME}",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1262 title2 => "{LENGTH} {UNIT}",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1263 });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1264 $self->_addel($view, "View-line-widget", {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1265 shape => 'horizontal',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1266 hcenter => $width/2 + 0.7,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1267 'linear-length' => $width - 2,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1268 });
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1269 $self->_addel($view, "View-axis-widget");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1270 return $page;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1271 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1272
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1273
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1274 =head2 _addel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1275
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1276 Title : _addel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1277 Usage : $obj->_addel($parentElem, 'ChildName',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1278 { anAttr => 'someValue', anotherAttr => 'aValue',})
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1279 Function: Add an element with attribute values to a DOM tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1280 Returns : a reference to the newly added element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1281 Args : 0 The DOM::Element parent that you want to add to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1282 1 The name of the new child element
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1283 2 Optional hash reference containing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1284 attribute name => attribute value assignments
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1285
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1286 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1287
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1288 sub _addel {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1289 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1290 my ($root, $name, $attr) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1291
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1292 # Find the DOM::Document for the parent
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1293 my $doc = $root->getOwnerDocument || $root;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1294 my $elem = $doc->createElement($name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1295 foreach my $a (keys %{$attr}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1296 $elem->setAttribute($a, $attr->{$a});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1297 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1298 $root->appendChild($elem);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1299 return $elem;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1300 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1301
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1302 =head2 _show_dna
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1303
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1304 Title : _show_dna
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1305 Usage : $obj->_show_dna($newval)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1306 Function: (cut-and-pasted directly from embl.pm)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1307 Returns : value of _show_dna
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1308 Args : newvalue (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1309
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1310 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1311
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1312 sub _show_dna {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1313 my $obj = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1314 if( @_ ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1315 my $value = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1316 $obj->{'_show_dna'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1317 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1318 return $obj->{'_show_dna'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1319 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1320
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1321 =head2 _initialize
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1322
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1323 Title : _initialize
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1324 Usage : $dom = $obj->_initialize(@args)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1325 Function: Coppied from embl.pm, and augmented with initialization of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1326 XML DOM tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1327 Returns :
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1328 Args : -file => the XML file to be parsed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1329
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1330 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1332 sub _initialize {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1333 my($self,@args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1334
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1335 $self->SUPER::_initialize(@args);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1336 # hash for functions for decoding keys.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1337 $self->{'_func_ftunit_hash'} = {};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1338 $self->_show_dna(1); # sets this to one by default. People can change it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1339
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1340 my %param = @args; # From SeqIO.pm
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1341 @param{ map { lc $_ } keys %param } = values %param; # lowercase keys
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1342 if ( exists $param{-file} && $param{-file} !~ /^>/) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1343 # Is it blasphemy to add your own keys to an object in another package?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1344 # domtree => the parsed DOM tree retruned by XML::DOM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1345 $self->{'domtree'} = $self->_parse_xml( $param{-file} );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1346 # current_node => the <Sequence> node next in line for next_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1347 $self->{'current_node'} = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1348 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1349
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1350 $self->sequence_factory( new Bio::Seq::SeqFactory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1351 ( -verbose => $self->verbose(),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1352 -type => 'Bio::Seq::RichSeq'))
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1353 if( ! defined $self->sequence_factory );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1354 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1355
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1356
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1357 =head2 _parseparams
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1358
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1359 Title : _parseparams
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1360 Usage : my $paramHash = $obj->_parseparams(@args)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1361 Function: Borrowed from Bio::Parse.pm, who borrowed it from CGI.pm
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1362 Lincoln Stein -> Richard Resnick -> here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1363 Returns : A hash reference of the parameter keys (uppercase) pointing to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1364 their values.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1365 Args : An array of key, value pairs. Easiest to pass values as:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1366 -key1 => value1, -key2 => value2, etc
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1367 Leading "-" are removed.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1368
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1369 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1370
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1371 sub _parseparams {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1372 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1373 my %hash = ();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1374 my @param = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1375
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1376 # Hacked out from Parse.pm
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1377 # The next few lines strip out the '-' characters which
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1378 # preceed the keys, and capitalizes them.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1379 for (my $i=0;$i<@param;$i+=2) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1380 $param[$i]=~s/^\-//;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1381 $param[$i]=~tr/a-z/A-Z/;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1382 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1383 pop @param if @param %2; # not an even multiple
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1384 %hash = @param;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1385 return \%hash;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1386 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1387
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1388 =head2 _parse_xml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1389
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1390 Title : _parse_xml
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1391 Usage : $dom = $obj->_parse_xml($filename)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1392 Function: uses XML::DOM to construct a DOM tree from the BSML document
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1393 Returns : a reference to the parsed DOM tree
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1394 Args : 0 Path to the XML file needing to be parsed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1395
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1396 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1397
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1398 sub _parse_xml {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1399 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1400 my $file = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1401
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1402 unless (-e $file) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1403 $self->throw("Could not parse non-existant XML file '$file'.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1404 return undef;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1405 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1406 my $parser = new XML::DOM::Parser;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1407 my $doc = $parser->parsefile ($file);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1408 return $doc;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1409 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1410
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1411 sub DESTROY {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1412 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1413 # Reports off the net imply that DOM::Parser will memory leak if you
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1414 # do not explicitly dispose of it:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1415 # http://aspn.activestate.com/ASPN/Mail/Message/perl-xml/788458
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1416 my $dom = $self->{'domtree'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1417 # For some reason the domtree can get undef-ed somewhere...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1418 $dom->dispose if ($dom);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1419 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1420
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1421
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1422 =head1 TESTING SCRIPT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1423
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1424 The following script may be used to test the conversion process. You
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1425 will need a file of the format you wish to test. The script will
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1426 convert the file to BSML, store it in /tmp/bsmltemp, read that file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1427 into a new SeqIO stream, and write it back as the original
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1428 format. Comparison of this second file to the original input file
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1429 will allow you to track where data may be lost or corrupted. Note
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1430 that you will need to specify $readfile and $readformat.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1431
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1432 use Bio::SeqIO;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1433 # Tests preservation of details during round-trip conversion:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1434 # $readformat -> BSML -> $readformat
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1435 my $tempspot = "/tmp/bsmltemp"; # temp folder to hold generated files
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1436 my $readfile = "rps4y.embl"; # The name of the file you want to test
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1437 my $readformat = "embl"; # The format of the file being tested
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1438
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1439 system "mkdir $tempspot" unless (-d $tempspot);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1440 # Make Seq object from the $readfile
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1441 my $biostream = Bio::SeqIO->new( -file => "$readfile" );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1442 my $seq = $biostream->next_seq();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1443
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1444 # Write BSML from SeqObject
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1445 my $bsmlout = Bio::SeqIO->new( -format => 'bsml',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1446 -file => ">$tempspot/out.bsml");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1447 warn "\nBSML written to $tempspot/out.bsml\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1448 $bsmlout->write_seq($seq);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1449 # Need to kill object for following code to work... Why is this so?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1450 $bsmlout = "";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1451
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1452 # Make Seq object from BSML
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1453 my $bsmlin = Bio::SeqIO->new( -file => "$tempspot/out.bsml",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1454 -format => 'bsml');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1455 my $seq2 = $bsmlin->next_seq();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1456
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1457 # Write format back from Seq Object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1458 my $genout = Bio::SeqIO->new( -format => $readformat,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1459 -file => ">$tempspot/out.$readformat");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1460 $genout->write_seq($seq2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1461 warn "$readformat written to $tempspot/out.$readformat\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1462
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1463 # BEING LOST:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1464 # Join information (not possible in BSML 2.2)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1465 # Sequence type (??)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1466
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1467 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1468
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1469
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1470 1;