/******************************************************************************* * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with Jalview. If not, see . *******************************************************************************/ package jalview.io.packed; import jalview.datamodel.AlignmentI; import jalview.datamodel.SequenceI; import jalview.io.NewickFile; import java.util.ArrayList; import java.util.Hashtable; import java.util.List; public class JalviewDataset { /** * dataset that new data (sequences, alignments) will be added to */ AlignmentI parentDataset; /** * @return the parentDataset */ public AlignmentI getParentDataset() { return parentDataset; } /** * @param parentDataset the parentDataset to set */ public void setParentDataset(AlignmentI parentDataset) { this.parentDataset = parentDataset; } /** * @return the featureColours */ public Hashtable getFeatureColours() { return featureColours; } /** * @param featureColours the featureColours to set */ public void setFeatureColours(Hashtable featureColours) { this.featureColours = featureColours; } /** * @return the seqDetails */ public Hashtable getSeqDetails() { return seqDetails; } /** * @param seqDetails the seqDetails to set */ public void setSeqDetails(Hashtable seqDetails) { this.seqDetails = seqDetails; } /** * @return the al */ public List getAl() { return (al==null) ? new ArrayList() : al; } /** * current alignment being worked on. */ List al; public class AlignmentSet { public AlignmentI al; public List trees; AlignmentSet(AlignmentI a) { al = a; trees = new ArrayList(); } /** * deuniquify the current alignment in the context, merging any new * annotation/features with the existing set * * @param context */ void deuniquifyAlignment() { if (seqDetails==null || seqDetails.size()==0) { // nothing to do return; } // 1. recover correct names and attributes for each sequence in alignment. /* * TODO: housekeeping w.r.t. recovery of dataset and annotation * references for input sequences, and then dataset sequence creation * for new sequences retrieved from service // finally, attempt to * de-uniquify to recover input sequence identity, and try to map back * onto dataset Note: this * jalview.analysis.SeqsetUtils.deuniquify(SeqNames, alseqs, true); will * NOT WORK - the returned alignment may contain multiple versions of * the input sequence, each being a subsequence of the original. * deuniquify also removes existing annotation and features added in the * previous step... al.setDataset(dataset); // add in new sequences * retrieved from sequence search which are not already in dataset. // * trigger a 'fetchDBids' to annotate sequences with database ids... */ //jalview.analysis.SeqsetUtils.deuniquifyAndMerge(parentDataset, seqDetails, al,true); jalview.analysis.SeqsetUtils.deuniquify(seqDetails, al.getSequencesArray(),true); // 2. Update names of associated nodes in any trees for (NewickFile nf:trees) { // the following works because all trees are already had node/SequenceI associations created. jalview.analysis.NJTree njt = new jalview.analysis.NJTree(al.getSequencesArray(), nf); // this just updates the displayed leaf name on the tree according to the SequenceIs. njt.renameAssociatedNodes(); } } /** * set modification flag. If anything modifies the alignment in the current set, this flag should be true */ private boolean modified=false; /** * @return the modified */ public boolean isModified() { return modified; } /** * or the modification state with the given state * @param modifiedFromAction */ public void updateSetModified(boolean modifiedFromAction) { modified |= modifiedFromAction; } } /** * current set of feature colours */ Hashtable featureColours; /** * original identity of each sequence in results */ Hashtable seqDetails; public boolean relaxedIdMatching=false; public JalviewDataset() { seqDetails = new Hashtable(); al = new ArrayList(); parentDataset = null; featureColours = new Hashtable(); } /** * context created from an existing alignment. * @param parentAlignment */ public JalviewDataset(AlignmentI aldataset, Hashtable fc, Hashtable seqDets) { this(aldataset, fc, seqDets, null); } /** * * @param aldataset - parent dataset for any new alignment/sequence data (must not be null) * @param fc (may be null) feature settings for the alignment where new feature renderstyles are stored * @param seqDets - (may be null) anonymised sequence information created by Sequence uniquifier * @param parentAlignment (may be null) alignment to associate new annotation and trees with. */ public JalviewDataset(AlignmentI aldataset, Hashtable fc, Hashtable seqDets, AlignmentI parentAlignment) { this(); parentDataset = aldataset; if (parentAlignment!=null) { parentDataset = parentAlignment.getDataset(); if (parentDataset==null) { parentDataset = parentAlignment; } else { addAlignment(parentAlignment); } } if (seqDets!=null) { seqDetails = seqDets; } if (fc!=null) { featureColours = fc; } } public boolean hasAlignments() { return al!=null && al.size()>0; } public AlignmentI getLastAlignment() { return (al==null || al.size()<1) ? null: al.get(al.size()-1).al; } public AlignmentSet getLastAlignmentSet() { return (al==null || al.size()<1) ? null: al.get(al.size()-1); } /** * post process (deuniquify) the current alignment and its dependent data, and then add newal to the dataset. * @param newal */ public void addAlignment(AlignmentI newal) { if (!hasAlignments()) { al = new ArrayList(); } AlignmentSet last = getLastAlignmentSet(); if (last!=null) { System.err.println("Deuniquifying last alignment set."); last.deuniquifyAlignment(); } al.add(new AlignmentSet(newal)); } public void addTreeFromFile(NewickFile nf) { AlignmentSet lal = getLastAlignmentSet(); lal.trees.add(nf); } public boolean hasSequenceAssoc() { // TODO: discover where sequence associated data should be put. return false; } public SequenceI getLastAssociatedSequence() { // TODO: delineate semantics for associating uniquified data with potentially de-uniquified sequence. return null; } /** * update the modified state flag for the current set with the given modification state * @param modified - this will be ored with current modification state */ public void updateSetModified(boolean modified) { getLastAlignmentSet().updateSetModified(modified); } }