+package jalview.io.vamsas;\r
+\r
+import java.util.Vector;\r
+\r
+import jalview.datamodel.AlignedCodonFrame;\r
+import jalview.datamodel.Mapping;\r
+import jalview.datamodel.SequenceI;\r
+import jalview.io.VamsasAppDatastore;\r
+import uk.ac.vamsas.client.Vobject;\r
+import uk.ac.vamsas.objects.core.AlignmentSequence;\r
+import uk.ac.vamsas.objects.core.DataSet;\r
+import uk.ac.vamsas.objects.core.Local;\r
+import uk.ac.vamsas.objects.core.RangeType;\r
+import uk.ac.vamsas.objects.core.Seg;\r
+import uk.ac.vamsas.objects.core.Sequence;\r
+import uk.ac.vamsas.objects.core.SequenceMapping;\r
+import uk.ac.vamsas.objects.core.SequenceType;\r
+\r
+public class Sequencemapping extends Rangetype\r
+{\r
+ public Sequencemapping(VamsasAppDatastore datastore, SequenceMapping sequenceMapping)\r
+ {\r
+ super(datastore);\r
+ Object mjvmapping = getvObj2jv(sequenceMapping);\r
+ if (mjvmapping==null)\r
+ {\r
+ add(sequenceMapping);\r
+ } else {\r
+ if (sequenceMapping.isUpdated())\r
+ {\r
+ update((jalview.datamodel.Mapping) mjvmapping, sequenceMapping);\r
+ }\r
+ }\r
+ }\r
+ /**\r
+ * create or update a vamsas sequence mapping corresponding to a jalview\r
+ * Mapping between two dataset sequences\r
+ * \r
+ * @param datastore\r
+ * @param mjvmapping\r
+ * @param from\r
+ * @param ds\r
+ */\r
+ public Sequencemapping(VamsasAppDatastore datastore, jalview.datamodel.Mapping mjvmapping, uk.ac.vamsas.objects.core.SequenceType from, uk.ac.vamsas.objects.core.DataSet ds)\r
+ {\r
+ super(datastore);\r
+ SequenceMapping sequenceMapping = (SequenceMapping) getjv2vObj(mjvmapping);\r
+ if (sequenceMapping==null)\r
+ {\r
+ add(mjvmapping, from, ds);\r
+ } else {\r
+ if (from!=null && sequenceMapping.getLoc()!=from)\r
+ {\r
+ jalview.bin.Cache.log.warn("Probable IMPLEMENTATION ERROR: "+from+" doesn't match the local mapping sequence.");\r
+ }\r
+ if (ds!=null && sequenceMapping.getV_parent()!=ds)\r
+ {\r
+ jalview.bin.Cache.log.warn("Probable IMPLEMENTATION ERROR: "+ds+" doesn't match the parent of the bound sequence mapping object.");\r
+ }\r
+ if (sequenceMapping.isUpdated())\r
+ { \r
+ conflict(mjvmapping, sequenceMapping);\r
+ } else {\r
+ update(mjvmapping, sequenceMapping);\r
+ }\r
+ }\r
+ }\r
+ private void conflict(Mapping mjvmapping, SequenceMapping sequenceMapping)\r
+ {\r
+ // TODO Auto-generated method stub\r
+\r
+ }\r
+ private void add(Mapping mjvmapping, uk.ac.vamsas.objects.core.SequenceType from, DataSet ds)\r
+ {\r
+ SequenceI jvto = mjvmapping.getTo();\r
+ while (jvto.getDatasetSequence()!=null)\r
+ {\r
+ jvto = jvto.getDatasetSequence();\r
+ }\r
+ SequenceType to = (SequenceType) getjv2vObj(jvto);\r
+ if (to==null)\r
+ {\r
+ jalview.bin.Cache.log.warn("NONFATAL - do a second update: Ignoring Forward Reference to seuqence not yet bound to vamsas seuqence object");\r
+ return;\r
+ } \r
+ SequenceMapping sequenceMapping = new SequenceMapping();\r
+ sequenceMapping.setLoc(from);\r
+ sequenceMapping.setMap(to);\r
+ boolean dnaToProt=false,sense=false;\r
+ // ensure that we create a mapping with the correct sense\r
+ if (((Sequence) sequenceMapping.getLoc())\r
+ .getDictionary()\r
+ .equals(uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_NA))\r
+ {\r
+ if (((Sequence) sequenceMapping.getMap())\r
+ .getDictionary()\r
+ .equals(uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_AA))\r
+ {\r
+ dnaToProt=true;\r
+ sense=true;\r
+ } \r
+ } else {\r
+ if (((Sequence) sequenceMapping.getMap())\r
+ .getDictionary()\r
+ .equals(uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_NA))\r
+ {\r
+ dnaToProt=true;\r
+ sense=false;\r
+ } \r
+ }\r
+\r
+ if (!dnaToProt)\r
+ {\r
+ jalview.bin.Cache.log.warn("Ignoring Mapping - don't support protein to protein mapping in vamsas document yet.");\r
+ return;\r
+ }\r
+ if (ds==null)\r
+ {\r
+ // locate dataset for storage of SequenceMapping\r
+ if (sense)\r
+ {\r
+ ds = (DataSet) ((uk.ac.vamsas.client.Vobject) sequenceMapping.getLoc()).getV_parent();\r
+ } else {\r
+ ds = (DataSet) ((uk.ac.vamsas.client.Vobject) sequenceMapping.getMap()).getV_parent();\r
+ } \r
+ }\r
+ if (sense)\r
+ {\r
+ this.initMapType(sequenceMapping, mjvmapping.getMap(), true);\r
+ } else {\r
+ this.initMapType(sequenceMapping, mjvmapping.getMap().getInverse(), true);\r
+ }\r
+ ds.addSequenceMapping(sequenceMapping);\r
+ sequenceMapping.setProvenance(this.dummyProvenance("user defined coding region translation")); // TODO:\r
+ // correctly\r
+ // construct\r
+ // provenance\r
+ // based\r
+ // on\r
+ // source\r
+ // of\r
+ // mapping\r
+ bindjvvobj(mjvmapping, sequenceMapping);\r
+\r
+ jalview.bin.Cache.log.debug("Successfully created mapping "+sequenceMapping.getVorbaId());\r
+ }\r
+ private void update(jalview.datamodel.Mapping mjvmapping, SequenceMapping sequenceMapping)\r
+ {\r
+ jalview.bin.Cache.log.error("Not implemented: Jalview Update Mapping"); \r
+ }\r
+ /**\r
+ * limitations: Currently, jalview only deals with mappings between dataset\r
+ * sequences, and even then, only between those that map from DNA to Protein.\r
+ * \r
+ * @param sequenceMapping\r
+ */\r
+ private void add(SequenceMapping sequenceMapping)\r
+ {\r
+ Object mobj;\r
+ SequenceI from=null,to=null;\r
+ boolean dnaToProt=false,sense=false;\r
+ Sequence sdloc=null, sdmap=null;\r
+ if (sequenceMapping.getLoc() instanceof AlignmentSequence)\r
+ {\r
+ sdloc = (Sequence) ((AlignmentSequence) sequenceMapping.getLoc()).getRefid();\r
+ } else {\r
+ sdloc = ((Sequence) sequenceMapping.getLoc());\r
+ }\r
+ if (sequenceMapping.getMap() instanceof AlignmentSequence)\r
+ {\r
+ sdmap = (Sequence) ((AlignmentSequence) sequenceMapping.getMap()).getRefid();\r
+ } else {\r
+ sdmap = ((Sequence) sequenceMapping.getMap());\r
+ }\r
+ if (sdloc==null || sdmap == null)\r
+ {\r
+ jalview.bin.Cache.log.info("Ignoring non sequence-sequence mapping");\r
+ return;\r
+ }\r
+ mobj = this.getvObj2jv((Vobject) sdloc);\r
+ if (mobj instanceof SequenceI)\r
+ {\r
+ from = (SequenceI) mobj;\r
+ }\r
+ mobj = this.getvObj2jv((Vobject) sdmap);\r
+ if (mobj instanceof SequenceI)\r
+ {\r
+ to = (SequenceI) mobj;\r
+ }\r
+ if (from == null || to == null)\r
+ {\r
+\r
+ jalview.bin.Cache.log.error("Probable Vamsas implementation error : unbound dataset sequences involved in a mapping are being parsed!");\r
+ return;\r
+ } \r
+ if (sdloc.getDictionary()\r
+ .equals(uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_NA))\r
+ {\r
+ if (sdmap.getDictionary()\r
+ .equals(uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_AA))\r
+ {\r
+ dnaToProt=true;\r
+ sense=true;\r
+ } \r
+ // else {\r
+\r
+ // }\r
+ } else {\r
+ if (sdmap.getDictionary()\r
+ .equals(uk.ac.vamsas.objects.utils.SymbolDictionary.STANDARD_NA))\r
+ {\r
+ dnaToProt=true;\r
+ sense=false;\r
+ } \r
+ }\r
+ // create mapping storage object and make each dataset alignment reference\r
+ // it.\r
+ jalview.datamodel.AlignmentI dsLoc = (jalview.datamodel.AlignmentI) getvObj2jv(sdloc.getV_parent());\r
+ jalview.datamodel.AlignmentI dsMap = (jalview.datamodel.AlignmentI) getvObj2jv(sdmap.getV_parent());\r
+ AlignedCodonFrame afc = new AlignedCodonFrame(0);\r
+\r
+ if (dsLoc!=null && dsLoc!=dsMap)\r
+ {\r
+ dsMap.addCodonFrame(afc);\r
+ }\r
+ if (dsMap!=null)\r
+ {\r
+ dsMap.addCodonFrame(afc);\r
+ }\r
+ // create and add the new mapping to (each) dataset's codonFrame\r
+\r
+ jalview.util.MapList mapping = null; \r
+ if (!sense)\r
+ {\r
+ mapping = this.parsemapType(sequenceMapping, 1, 3); // invert sense\r
+ mapping = new jalview.util.MapList(mapping.getToRanges(), mapping.getFromRanges(), mapping.getToRatio(), mapping.getFromRatio());\r
+ afc.addMap(to, from, mapping);\r
+ } else {\r
+ mapping = this.parsemapType(sequenceMapping, 3, 1); // correct sense\r
+ afc.addMap(from, to, mapping);\r
+ }\r
+ bindjvvobj(mapping, sequenceMapping);\r
+ jalview.structure.StructureSelectionManager.getStructureSelectionManager().addMappings(new AlignedCodonFrame[] { afc });\r
+ }\r
+}
\ No newline at end of file