+ private void recoverDatasetFor(SequenceSet vamsasSet, Alignment al)
+ {
+ jalview.datamodel.Alignment ds = getDatasetFor(vamsasSet.getDatasetId());
+ Vector dseqs = null;
+ if (ds == null)
+ {
+ // create a list of new dataset sequences
+ dseqs = new Vector();
+ }
+ for (int i = 0, iSize = vamsasSet.getSequenceCount(); i < iSize; i++)
+ {
+ Sequence vamsasSeq = vamsasSet.getSequence(i);
+ ensureJalviewDatasetSequence(vamsasSeq, ds, dseqs);
+ }
+ // create a new dataset
+ if (ds == null)
+ {
+ SequenceI[] dsseqs = new SequenceI[dseqs.size()];
+ dseqs.copyInto(dsseqs);
+ ds = new jalview.datamodel.Alignment(dsseqs);
+ addDatasetRef(vamsasSet.getDatasetId(), ds);
+ }
+ // set the dataset for the newly imported alignment.
+ if (al.getDataset() == null)
+ {
+ al.setDataset(ds);
+ }
+ }
+
+
+ /**
+ *
+ * @param vamsasSeq sequence definition to create/merge dataset sequence for
+ * @param ds dataset alignment
+ * @param dseqs vector to add new dataset sequence to
+ */
+ private void ensureJalviewDatasetSequence(Sequence vamsasSeq, AlignmentI ds, Vector dseqs)
+ {
+ jalview.datamodel.Sequence sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq.getId());
+ jalview.datamodel.SequenceI dsq = null;
+ if (sq!=null && sq.getDatasetSequence()!=null)
+ {
+ dsq = (jalview.datamodel.SequenceI) sq.getDatasetSequence();
+ }
+
+ String sqid = vamsasSeq.getDsseqid();
+ if (dsq==null)
+ {
+ // need to create or add a new dataset sequence reference to this sequence
+ if (sqid != null)
+ {
+ dsq = (jalview.datamodel.SequenceI) seqRefIds.get(sqid);
+ }
+ // check again
+ if (dsq == null)
+ {
+ // make a new dataset sequence
+ dsq = sq.createDatasetSequence();
+ if (sqid == null)
+ {
+ // make up a new dataset reference for this sequence
+ sqid = seqHash(dsq);
+ }
+ dsq.setVamsasId(uniqueSetSuffix + sqid);
+ seqRefIds.put(sqid, dsq);
+ if (ds == null)
+ {
+ if (dseqs!=null)
+ {
+ dseqs.addElement(dsq);
+ }
+ }
+ else
+ {
+ ds.addSequence(dsq);
+ }
+ } else {
+ if (sq!=dsq)
+ { // make this dataset sequence sq's dataset sequence
+ sq.setDatasetSequence(dsq);
+ }
+ }
+ }
+ // TODO: refactor this as a merge dataset sequence function
+ // now check that sq (the dataset sequence) sequence really is the union of all references to it
+ //boolean pre = sq.getStart() < dsq.getStart();
+ //boolean post = sq.getEnd() > dsq.getEnd();
+ //if (pre || post)
+ if (sq!=dsq)
+ {
+ StringBuffer sb = new StringBuffer();
+ String newres = jalview.analysis.AlignSeq.extractGaps(
+ jalview.util.Comparison.GapChars, sq.getSequenceAsString());
+ if (!newres.equalsIgnoreCase(dsq.getSequenceAsString()) && newres.length()>dsq.getLength())
+ {
+ // Update with the longer sequence.
+ synchronized (dsq)
+ {
+ /*if (pre)
+ {
+ sb.insert(0, newres
+ .substring(0, dsq.getStart() - sq.getStart()));
+ dsq.setStart(sq.getStart());
+ }
+ if (post)
+ {
+ sb.append(newres.substring(newres.length() - sq.getEnd()
+ - dsq.getEnd()));
+ dsq.setEnd(sq.getEnd());
+ }
+ */
+ dsq.setSequence(sb.toString());
+ }
+ //TODO: merges will never happen if we 'know' we have the real dataset sequence - this should be detected when id==dssid
+ System.err
+ .println("DEBUG Notice: Merged dataset sequence"); // ("
+ // + (pre ? "prepended" : "") + " "
+ //+ (post ? "appended" : ""));
+ }
+ }
+ }
+
+ java.util.Hashtable datasetIds = null;
+
+ private Alignment getDatasetFor(String datasetId)
+ {
+ if (datasetIds == null)
+ {
+ datasetIds = new Hashtable();
+ return null;
+ }
+ if (datasetIds.containsKey(datasetId))
+ {
+ return (Alignment) datasetIds.get(datasetId);
+ }
+ return null;
+ }
+
+ private void addDatasetRef(String datasetId, Alignment dataset)
+ {
+ if (datasetIds == null)
+ {
+ datasetIds = new Hashtable();
+ }
+ datasetIds.put(datasetId, dataset);
+ }
+
+ private void addDBRefs(SequenceI datasetSequence, Sequence sequence)
+ {
+ for (int d = 0; d < sequence.getDBRefCount(); d++)
+ {
+ DBRef dr = sequence.getDBRef(d);
+ jalview.datamodel.DBRefEntry entry = new jalview.datamodel.DBRefEntry(
+ sequence.getDBRef(d).getSource(), sequence.getDBRef(d)
+ .getVersion(), sequence.getDBRef(d).getAccessionId());
+ if (dr.getMapping() != null)
+ {
+ entry.setMap(addMapping(dr.getMapping()));
+ }
+ datasetSequence.addDBRef(entry);
+ }
+ }
+
+ private jalview.datamodel.Mapping addMapping(Mapping m)
+ {
+ SequenceI dsto = null;
+ // Mapping m = dr.getMapping();
+ int fr[] = new int[m.getMapListFromCount() * 2];
+ Enumeration f = m.enumerateMapListFrom();
+ for (int _i = 0; f.hasMoreElements(); _i += 2)
+ {
+ MapListFrom mf = (MapListFrom) f.nextElement();
+ fr[_i] = mf.getStart();
+ fr[_i + 1] = mf.getEnd();
+ }
+ int fto[] = new int[m.getMapListToCount() * 2];
+ f = m.enumerateMapListTo();
+ for (int _i = 0; f.hasMoreElements(); _i += 2)
+ {
+ MapListTo mf = (MapListTo) f.nextElement();
+ fto[_i] = mf.getStart();
+ fto[_i + 1] = mf.getEnd();
+ }
+ jalview.datamodel.Mapping jmap = new jalview.datamodel.Mapping(dsto,
+ fr, fto, (int) m.getMapFromUnit(), (int) m.getMapToUnit());
+ if (m.getMappingChoice() != null)
+ {
+ MappingChoice mc = m.getMappingChoice();
+ if (mc.getDseqFor() != null)
+ {
+ if (seqRefIds.containsKey(mc.getDseqFor()))
+ {
+ /**
+ * recover from hash
+ */
+ jmap.setTo((SequenceI) seqRefIds.get(mc.getDseqFor()));
+ }
+ else
+ {
+ frefedSequence.add(new Object[]
+ { mc.getDseqFor(), jmap });
+ }
+ }
+ else
+ {
+ /**
+ * local sequence definition
+ */
+ Sequence ms = mc.getSequence();
+ jalview.datamodel.Sequence djs=null;
+ String sqid = ms.getDsseqid();
+ if (sqid!=null && sqid.length()>0)
+ {
+ /*
+ * recover dataset sequence
+ */
+ djs = (jalview.datamodel.Sequence) seqRefIds.get(sqid);
+ } else {
+ System.err.println("Warning - making up dataset sequence id for DbRef sequence map reference");
+ sqid = ((Object)ms).toString(); // make up a new hascode for undefined dataset sequence hash (unlikely to happen)
+ }
+
+ if (djs==null) {
+ /**
+ * make a new dataset sequence and add it to refIds hash
+ */
+ djs = new jalview.datamodel.Sequence(ms
+ .getName(), ms.getSequence());
+ djs.setStart(jmap.getMap().getToLowest());
+ djs.setEnd(jmap.getMap().getToHighest());
+ djs.setVamsasId(uniqueSetSuffix + sqid);
+ jmap.setTo(djs);
+ seqRefIds.put(sqid, djs);
+
+ }
+ jalview.bin.Cache.log.debug("about to recurse on addDBRefs.");
+ addDBRefs(djs, ms);
+
+ }
+ }
+ return (jmap);
+
+ }
+