import java.awt.*;
import jalview.analysis.*;
+import jalview.api.StructureSelectionManagerProvider;
import jalview.bin.*;
* DOCUMENT ME!
*
* @author $author$
- * @version $Revision$
+ * @version $Revision: 1.141 $
*/
public class AlignViewport implements SelectionSource, VamsasSource
{
/** DOCUMENT ME!! */
public Hashtable[] hconsensus;
-
+
+ public Hashtable[] hStrucConsensus;
+
AlignmentAnnotation consensus;
+
+ AlignmentAnnotation strucConsensus;
AlignmentAnnotation conservation;
AlignmentAnnotation[] groupConservation;
boolean autoCalculateConsensus = true;
+
+ boolean autoCalculateStrucConsensus = true;
+
/** DOCUMENT ME!! */
public int ConsPercGaps = 25; // JBPNote : This should be a scalable property!
new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
consensus.hasText = true;
consensus.autoCalculated = true;
+
+ //TODO check if this can done accordingly
+ strucConsensus = new AlignmentAnnotation("StrucConsensus", "PID",
+ new Annotation[1], 0f, 100f, AlignmentAnnotation.BAR_GRAPH);
+ strucConsensus.hasText = true;
+ strucConsensus.autoCalculated = true;
if (Cache.getDefault("SHOW_IDENTITY", true))
{
alignment.addAnnotation(consensus);
+ //TODO: Make own if for structure
+ alignment.addAnnotation(strucConsensus);
}
+
}
if (jalview.bin.Cache.getProperty("DEFAULT_COLOUR") != null)
ConservationThread conservationThread;
ConsensusThread consensusThread;
+
+ StrucConsensusThread strucConsensusThread;
boolean consUpdateNeeded = false;
static boolean UPDATING_CONSENSUS = false;
+
+ static boolean UPDATING_STRUC_CONSENSUS = false;
static boolean UPDATING_CONSERVATION = false;
boolean updatingConsensus = false;
+
+ boolean updatingStrucConsensus = false;
boolean updatingConservation = false;
AAFrequency.calculate(alignment.getSequencesArray(), 0,
alignment.getWidth(), hconsensus, true);
updateAnnotation(true);
-
if (globalColourScheme != null)
{
globalColourScheme.setConsensus(hconsensus);
}
}
}
+
+ //--------START Structure Conservation
+ public void updateStrucConsensus(final AlignmentPanel ap)
+ {
+ // see note in mantis : issue number 8585
+ if (strucConsensus == null || !autoCalculateStrucConsensus)
+ {
+ return;
+ }
+ strucConsensusThread = new StrucConsensusThread(ap);
+ strucConsensusThread.start();
+ }
+
+ class StrucConsensusThread extends Thread
+ {
+ AlignmentPanel ap;
+
+ public StrucConsensusThread(AlignmentPanel ap)
+ {
+ this.ap = ap;
+ }
+
+ public void run()
+ {
+ updatingStrucConsensus = true;
+ while (UPDATING_STRUC_CONSENSUS)
+ {
+ try
+ {
+ if (ap != null)
+ {
+ ap.paintAlignment(false);
+ }
+
+ Thread.sleep(200);
+ } catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ UPDATING_STRUC_CONSENSUS = true;
+
+ try
+ {
+ int aWidth = (alignment != null) ? alignment.getWidth() : -1; // null
+ // pointer
+ // possibility
+ // here.
+ if (aWidth <= 0)
+ {
+ updatingStrucConsensus = false;
+ UPDATING_STRUC_CONSENSUS = false;
+ return;
+ }
+
+ strucConsensus.annotations = null;
+ strucConsensus.annotations = new Annotation[aWidth];
+
+ hStrucConsensus = new Hashtable[aWidth];
+
+ AlignmentAnnotation[] aa = ap.av.getAlignment().getAlignmentAnnotation();
+ AlignmentAnnotation rnaStruc = null;
+ for(int i=0; i<aa.length;i++){
+ if(aa[i].getRNAStruc() != null){
+ rnaStruc=aa[i];
+ break;
+ }
+ }
+
+ AlignmentAnnotation rna = ap.av.getAlignment().getAlignmentAnnotation()[0];
+ StructureFrequency.calculate(alignment.getSequencesArray(), 0,
+ alignment.getWidth(), hStrucConsensus, true, rnaStruc);
+ //TODO AlignmentAnnotation rnaStruc!!!
+ updateAnnotation(true);
+ if (globalColourScheme != null)
+ {
+ globalColourScheme.setConsensus(hStrucConsensus);
+ }
+
+ } catch (OutOfMemoryError error)
+ {
+ alignment.deleteAnnotation(strucConsensus);
+
+ strucConsensus = null;
+ hStrucConsensus = null;
+ new OOMWarning("calculating structure consensus", error);
+ }
+ UPDATING_STRUC_CONSENSUS = false;
+ updatingStrucConsensus = false;
+
+ if (ap != null)
+ {
+ ap.paintAlignment(true);
+ }
+ }
+
+ /**
+ * update the consensus annotation from the sequence profile data using
+ * current visualization settings.
+ */
+ public void updateAnnotation()
+ {
+ updateAnnotation(false);
+ }
+
+ protected void updateAnnotation(boolean immediate)
+ {
+ // TODO: make calls thread-safe, so if another thread calls this method,
+ // it will either return or wait until one calculation is finished.
+ if (immediate
+ || (!updatingStrucConsensus && strucConsensus != null && hStrucConsensus != null))
+ {
+ StructureFrequency.completeConsensus(strucConsensus, hStrucConsensus, 0,
+ hStrucConsensus.length, false,
+ showSequenceLogo);
+ }
+ }
+ }
+ //--------END Structure Conservation
/**
* get the consensus sequence as displayed under the PID consensus annotation
}
/**
- * DOCUMENT ME!
*
- * @return DOCUMENT ME!
+ *
+ * @return null or the currently selected sequence region
*/
public SequenceGroup getSelectionGroup()
{
}
/**
- * DOCUMENT ME!
+ * Set the selection group for this window.
*
- * @param sg
- * DOCUMENT ME!
+ * @param sg - group holding references to sequences in this alignment view
+ *
*/
public void setSelectionGroup(SequenceGroup sg)
{
}
/**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
+ * GUI state
+ * @return true if conservation based shading is enabled
*/
public boolean getConservationSelected()
{
}
/**
- * DOCUMENT ME!
- *
+ * GUI state
* @param b
- * DOCUMENT ME!
+ * enable conservation based shading
*/
public void setConservationSelected(boolean b)
{
}
/**
- * DOCUMENT ME!
- *
- * @return DOCUMENT ME!
+ * GUI state
+ * @return true if percent identity threshold is applied to shading
*/
public boolean getAbovePIDThreshold()
{
}
/**
- * DOCUMENT ME!
+ * GUI state
*
- * @param b
- * DOCUMENT ME!
+ *
+ * @param b indicate if percent identity threshold is applied to shading
*/
public void setAbovePIDThreshold(boolean b)
{
{
if (alignment != null && alignment.getCodonFrames() != null)
{
- StructureSelectionManager.getStructureSelectionManager()
+ StructureSelectionManager.getStructureSelectionManager(Desktop.instance)
.removeMappings(alignment.getCodonFrames());
}
this.alignment = align;
if (alignment.getCodonFrames() != null)
{
- StructureSelectionManager.getStructureSelectionManager().addMappings(
+ StructureSelectionManager.getStructureSelectionManager(Desktop.instance).addMappings(
alignment.getCodonFrames());
}
}
{
updateConsensus(ap);
}
+ if(autoCalculateStrucConsensus)
+ {
+ updateStrucConsensus(ap);
+ }
// Reset endRes of groups if beyond alignment width
int alWidth = alignment.getWidth();
/**
* checks current SelectionGroup against record of last hash value, and
* updates record.
+ * @param b update the record of last hash value
*
- * @return true if SelectionGroup changed since last call
+ * @return true if SelectionGroup changed since last call (when b is true)
*/
- boolean isSelectionGroupChanged()
+ boolean isSelectionGroupChanged(boolean b)
{
- int hc = (selectionGroup == null) ? -1 : selectionGroup.hashCode();
- if (hc != sgrouphash)
+ int hc = (selectionGroup == null || selectionGroup.getSize()==0) ? -1 : selectionGroup.hashCode();
+ if (hc!=-1 && hc != sgrouphash)
{
- sgrouphash = hc;
+ if (b) {sgrouphash = hc;}
return true;
}
return false;
}
/**
- * checks current colsel against record of last hash value, and updates
+ * checks current colsel against record of last hash value, and optionally updates
* record.
- *
- * @return true if colsel changed since last call
+
+ * @param b update the record of last hash value
+ * @return true if colsel changed since last call (when b is true)
*/
- boolean isColSelChanged()
+ boolean isColSelChanged(boolean b)
{
- int hc = (colSel == null) ? -1 : colSel.hashCode();
- if (hc != colselhash)
+ int hc = (colSel == null || colSel.size()==0) ? -1 : colSel.hashCode();
+ if (hc!=-1 && hc != colselhash)
{
- colselhash = hc;
+ if (b) {colselhash = hc;}
return true;
}
return false;
public void sendSelection()
{
jalview.structure.StructureSelectionManager
- .getStructureSelectionManager().sendSelection(
+ .getStructureSelectionManager(Desktop.instance).sendSelection(
new SequenceGroup(getSelectionGroup()),
new ColumnSelection(getColumnSelection()), this);
}
{
consensusThread.updateAnnotation();
}
+ if (strucConsensusThread != null)
+ {
+ strucConsensusThread.updateAnnotation();
+ }
}
this.showSequenceLogo = showSequenceLogo;
}
}
}
}
+
+ public StructureSelectionManager getStructureSelectionManager()
+ {
+ return StructureSelectionManager.getStructureSelectionManager(Desktop.instance);
+ }
+
+ /**
+ *
+ * @param pdbEntries
+ * @return a series of SequenceI arrays, one for each PDBEntry, listing which sequence in the alignment holds a reference to it
+ */
+ public SequenceI[][] collateForPDB(PDBEntry[] pdbEntries)
+ {
+ ArrayList<SequenceI[]> seqvectors = new ArrayList<SequenceI[]>();
+ for (PDBEntry pdb: pdbEntries) {
+ ArrayList<SequenceI> seqs = new ArrayList<SequenceI>();
+ for (int i = 0; i < alignment.getHeight(); i++)
+ {
+ Vector pdbs = alignment.getSequenceAt(i)
+ .getDatasetSequence().getPDBId();
+ if (pdbs == null)
+ continue;
+ SequenceI sq;
+ for (int p = 0; p < pdbs.size(); p++)
+ {
+ PDBEntry p1 = (PDBEntry) pdbs.elementAt(p);
+ if (p1.getId().equals(pdb.getId()))
+ {
+ if (!seqs.contains(sq=alignment.getSequenceAt(i)))
+ seqs.add(sq);
+
+ continue;
+ }
+ }
+ }
+ seqvectors.add(seqs.toArray(new SequenceI[seqs.size()]));
+ }
+ return seqvectors.toArray(new SequenceI[seqvectors.size()][]);
+ }
}