2 * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
\r
3 * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\r
5 * This program is free software; you can redistribute it and/or
\r
6 * modify it under the terms of the GNU General Public License
\r
7 * as published by the Free Software Foundation; either version 2
\r
8 * of the License, or (at your option) any later version.
\r
10 * This program is distributed in the hope that it will be useful,
\r
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 * GNU General Public License for more details.
\r
15 * You should have received a copy of the GNU General Public License
\r
16 * along with this program; if not, write to the Free Software
\r
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\r
19 package jalview.io.vamsas;
\r
21 import java.util.Enumeration;
\r
22 import java.util.Vector;
\r
24 import uk.ac.vamsas.objects.core.DataSet;
\r
25 import uk.ac.vamsas.objects.core.DataSetAnnotations;
\r
26 import uk.ac.vamsas.objects.core.Link;
\r
27 import uk.ac.vamsas.objects.core.Property;
\r
28 import uk.ac.vamsas.objects.core.Provenance;
\r
29 import uk.ac.vamsas.objects.core.RangeAnnotation;
\r
30 import uk.ac.vamsas.objects.core.Score;
\r
31 import uk.ac.vamsas.objects.core.Seg;
\r
32 import uk.ac.vamsas.objects.core.Sequence;
\r
33 import uk.ac.vamsas.objects.utils.Properties;
\r
34 import jalview.bin.Cache;
\r
35 import jalview.datamodel.SequenceFeature;
\r
36 import jalview.datamodel.SequenceI;
\r
37 import jalview.io.VamsasAppDatastore;
\r
38 import jalview.util.UrlLink;
\r
44 public class Sequencefeature extends Rangetype
\r
47 uk.ac.vamsas.objects.core.DataSet dataset;
\r
49 uk.ac.vamsas.objects.core.Sequence sequence;
\r
51 private SequenceI dsSeq;
\r
53 public Sequencefeature(VamsasAppDatastore vamsasAppDatastore,
\r
54 SequenceFeature sequenceFeature,
\r
55 uk.ac.vamsas.objects.core.DataSet dataset,
\r
56 uk.ac.vamsas.objects.core.Sequence sequence)
\r
58 super(vamsasAppDatastore, sequenceFeature, DataSetAnnotations.class);
\r
59 this.dataset = dataset;
\r
60 this.sequence = sequence;
\r
64 public Sequencefeature(VamsasAppDatastore vamsasAppDatastore,
\r
65 DataSetAnnotations dseta, SequenceI dsSeq)
\r
67 super(vamsasAppDatastore, dseta, jalview.datamodel.SequenceFeature.class);
\r
72 public void addToDocument()
\r
74 DataSetAnnotations dsa = (DataSetAnnotations) vobj;
\r
75 jalview.datamodel.SequenceFeature feature = (jalview.datamodel.SequenceFeature) jvobj;
\r
76 dsa = (DataSetAnnotations) getDSAnnotationFromJalview(
\r
77 new DataSetAnnotations(), feature);
\r
78 if (dsa.getProvenance() == null)
\r
80 dsa.setProvenance(new Provenance());
\r
82 addProvenance(dsa.getProvenance(), "created"); // JBPNote - need
\r
84 dsa.addSeqRef(sequence); // we have just created this annotation
\r
85 // - so safe to use this
\r
86 bindjvvobj(feature, dsa);
\r
87 dataset.addDataSetAnnotations(dsa);
\r
90 public void addFromDocument()
\r
92 DataSetAnnotations dsa = (DataSetAnnotations) vobj;
\r
93 if (dsa.getSeqRefCount()!=1)
\r
95 Cache.log.warn("Not binding "+dsa.getVorbaId()+" to Sequence Feature - has multiple dataset sequence references.");
\r
98 jalview.datamodel.SequenceFeature sf = (jalview.datamodel.SequenceFeature) jvobj;
\r
99 dsSeq.addSequenceFeature(sf = getJalviewSeqFeature(dsa));
\r
101 bindjvvobj(sf, dsa);
\r
104 public void conflict()
\r
106 log.warn("Untested sequencefeature conflict code");
\r
107 DataSetAnnotations dsa = (DataSetAnnotations) vobj;
\r
108 jalview.datamodel.SequenceFeature feature = (jalview.datamodel.SequenceFeature) jvobj;
\r
109 jalview.datamodel.SequenceFeature sf = getJalviewSeqFeature(dsa);
\r
110 replaceJvObjMapping(feature, sf); // switch binding of dsa from old feature to newly created feature
\r
111 dsSeq.addSequenceFeature(sf); // add new imported feature
\r
112 addToDocument(); // and create a new feature in the document
\r
115 public void updateToDoc()
\r
117 DataSetAnnotations dsa = (DataSetAnnotations) vobj;
\r
118 jalview.datamodel.SequenceFeature feature = (jalview.datamodel.SequenceFeature) jvobj;
\r
119 if (dsa.getSeqRefCount() != 1)
\r
121 replaceJvObjMapping(feature, null);
\r
123 .warn("Binding of annotation to jalview feature has changed. Removing binding and recreating.");
\r
124 doSync(); // re-verify bindings.
\r
128 // Sync the features from Jalview
\r
129 long oldref = dsa.get__last_hash();
\r
130 getDSAnnotationFromJalview(dsa, feature);
\r
131 if (oldref != dsa.hashCode())
\r
134 .debug("Updated dataset sequence annotation from feature.");
\r
135 addProvenance(dsa.getProvenance(), "modified");
\r
140 public void updateFromDoc()
\r
142 DataSetAnnotations dsa = (DataSetAnnotations) vobj;
\r
143 jalview.datamodel.SequenceFeature feature = (jalview.datamodel.SequenceFeature) jvobj;
\r
144 if (dsa.getSeqRefCount() != 1)
\r
146 // conflicting update from document - we cannot map this feature anymore.
\r
147 replaceJvObjMapping(feature, null);
\r
149 .warn("annotation ("+dsa.getVorbaId()+" bound to jalview feature cannot be mapped. Removing binding, deleting feature, and deleting feature.");
\r
150 // - consider deleting the feature ?
\r
151 dsSeq.deleteFeature(feature);
\r
156 // Sync the features to Jalview - easiest to delete and add the feature again
\r
157 jalview.datamodel.SequenceFeature newsf = getJalviewSeqFeature(dsa);
\r
158 dsSeq.deleteFeature(feature);
\r
159 replaceJvObjMapping(feature, newsf);
\r
160 dsSeq.addSequenceFeature(newsf);
\r
161 if (feature.otherDetails!=null) {
\r
162 // TODO later: leave this to finalise method ?
\r
163 feature.otherDetails.clear();
\r
169 * correctly create/update a RangeAnnotation from a jalview sequence feature
\r
170 * TODO: refactor to a method in jalview.io.vamsas.RangeAnnotation class
\r
173 * (typically DataSetAnnotations or
\r
174 * AlignmentSequenceAnnotation)
\r
176 * (the feature to be mapped from)
\r
179 private RangeAnnotation getDSAnnotationFromJalview(RangeAnnotation dsa,
\r
180 jalview.datamodel.SequenceFeature feature)
\r
182 dsa.setType(feature.getType());
\r
183 Seg vSeg = new Seg();
\r
184 vSeg.setStart(feature.getBegin());
\r
185 vSeg.setEnd(feature.getEnd());
\r
186 vSeg.setInclusive(true);
\r
187 if (dsa.getSegCount() > 1)
\r
190 .debug("About to destroy complex annotation in vamsas document mapped to sequence feature ("
\r
191 + dsa.getVorbaId() + ")");
\r
193 dsa.setSeg(new Seg[]
\r
195 dsa.setDescription(feature.getDescription());
\r
196 dsa.setStatus(feature.getStatus());
\r
197 if (feature.links != null && feature.links.size() > 0)
\r
199 for (int i = 0, iSize = feature.links.size(); i < iSize; i++)
\r
201 String link = (String) feature.links.elementAt(i);
\r
202 UrlLink ulink = new UrlLink(link);
\r
203 if (ulink.isValid())
\r
205 // We only add static links to the document.
\r
206 Link vLink = new Link();
\r
207 vLink.setContent(ulink.getLabel());
\r
208 vLink.setHref(ulink.getTarget());
\r
209 dsa.addLink(vLink);
\r
213 dsa.setGroup(feature.getFeatureGroup());
\r
214 if (feature.getScore() != Float.NaN)
\r
216 Score fscore = new Score();
\r
217 dsa.setScore(new Score[]
\r
219 fscore.setContent(feature.getScore());
\r
220 fscore.setName(feature.getType());
\r
222 if (feature.otherDetails != null)
\r
224 Enumeration iter = feature.otherDetails.keys();
\r
225 Vector props = dsa.getPropertyAsReference();
\r
226 while (iter.hasMoreElements())
\r
228 String key = (String) iter.nextElement();
\r
229 if (!key.equalsIgnoreCase("score")
\r
230 && !key.equalsIgnoreCase("status"))
\r
232 Property nprop = new Property();
\r
233 nprop.setName(key);
\r
234 Object vlu = feature.getValue(key);
\r
235 nprop.setContent(feature.getValue(key).toString());
\r
236 boolean valid = false;
\r
237 if (vlu instanceof String)
\r
239 nprop.setType(uk.ac.vamsas.objects.utils.Properties.STRINGTYPE);
\r
242 else if (vlu instanceof Integer)
\r
246 .setType(uk.ac.vamsas.objects.utils.Properties.INTEGERTYPE);
\r
248 else if (vlu instanceof Float)
\r
250 nprop.setType(uk.ac.vamsas.objects.utils.Properties.FLOATTYPE);
\r
257 uk.ac.vamsas.objects.utils.Properties.addOrReplace(props,
\r
262 dsa.addProperty(nprop);
\r
270 private SequenceFeature getJalviewSeqFeature(RangeAnnotation dseta)
\r
272 int[] se = getBounds(dseta);
\r
273 SequenceFeature sf = new jalview.datamodel.SequenceFeature(dseta
\r
274 .getType(), dseta.getDescription(), dseta.getStatus(), se[0],
\r
275 se[1], dseta.getGroup());
\r
276 if (dseta.getLinkCount() > 0)
\r
278 Link[] links = dseta.getLink();
\r
279 for (int i = 0; i < links.length; i++)
\r
281 // TODO: use URLLink parsing/validation here.
\r
282 sf.addLink(links[i].getContent() + "|" + links[i].getHref());
\r
285 if (dseta.getScoreCount()>0)
\r
287 Enumeration scr = dseta.enumerateScore();
\r
288 while (scr.hasMoreElements())
\r
290 Score score = (Score) scr.nextElement();
\r
291 if (score.getName().equals(sf.getType()))
\r
293 sf.setScore(score.getContent());
\r
295 sf.setValue(score.getName(), ""+score.getContent());
\r
300 Enumeration props = dseta.enumerateProperty();
\r
301 while (props.hasMoreElements())
\r
303 Property p = (Property) props.nextElement();
\r
305 if (Properties.isValid(p))
\r
307 if (Properties.isString(p))
\r
309 val = p.getContent();
\r
311 if (Properties.isBoolean(p))
\r
314 val = new Boolean(p.getContent());
\r
315 } catch (Exception e) {}
\r
317 if (Properties.isFloat(p))
\r
320 val = new Float(p.getContent());
\r
322 } catch (Exception e)
\r
326 if(Properties.isInteger(p))
\r
329 val = new Integer(p.getContent());
\r
330 } catch (Exception e)
\r
336 sf.setValue(p.getName(), val);
\r