From 17b7d054cf7faa5ee57ad8c8c4c9daa495d8cb35 Mon Sep 17 00:00:00 2001 From: James Procter Date: Fri, 3 Feb 2023 14:18:44 +0000 Subject: [PATCH] JAL-1551 remove temp file in src --- src/jalview/appletgui/#OverviewPanel.java# | 453 ------- src/jalview/datamodel/Profile.java~ | 143 --- src/jalview/datamodel/ProfileI.java~ | 67 - src/jalview/datamodel/Profiles.java~ | 43 - src/jalview/datamodel/ProfilesI.java~ | 12 - src/jalview/datamodel/ResidueCount.java~ | 621 --------- src/jalview/datamodel/SearchResultMatchI.java~ | 30 - src/jalview/datamodel/SearchResultsI.java~ | 84 -- src/jalview/ext/jmol/JmolParser.java~ | 670 ---------- src/jalview/gui/#OverviewPanel.java# | 468 ------- src/jalview/gui/StructureChooser.java~ | 1161 ----------------- src/jalview/gui/TreeCanvas.java~ | 1080 ---------------- .../structure/StructureSelectionManager.java~ | 1327 -------------------- src/jalview/util/SparseCount.java~ | 154 --- src/jalview/ws/dbsources/Pdb.java~ | 294 ----- 15 files changed, 6607 deletions(-) delete mode 100755 src/jalview/appletgui/#OverviewPanel.java# delete mode 100644 src/jalview/datamodel/Profile.java~ delete mode 100644 src/jalview/datamodel/ProfileI.java~ delete mode 100644 src/jalview/datamodel/Profiles.java~ delete mode 100644 src/jalview/datamodel/ProfilesI.java~ delete mode 100644 src/jalview/datamodel/ResidueCount.java~ delete mode 100644 src/jalview/datamodel/SearchResultMatchI.java~ delete mode 100644 src/jalview/datamodel/SearchResultsI.java~ delete mode 100644 src/jalview/ext/jmol/JmolParser.java~ delete mode 100755 src/jalview/gui/#OverviewPanel.java# delete mode 100644 src/jalview/gui/StructureChooser.java~ delete mode 100755 src/jalview/gui/TreeCanvas.java~ delete mode 100644 src/jalview/structure/StructureSelectionManager.java~ delete mode 100644 src/jalview/util/SparseCount.java~ delete mode 100644 src/jalview/ws/dbsources/Pdb.java~ diff --git a/src/jalview/appletgui/#OverviewPanel.java# b/src/jalview/appletgui/#OverviewPanel.java# deleted file mode 100755 index 14c3158..0000000 --- a/src/jalview/appletgui/#OverviewPanel.java# +++ /dev/null @@ -1,453 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.appletgui; - -import jalview.datamodel.SequenceI; -import jalview.viewmodel.OverviewDimensions; -import jalview.datamodel.AlignmentI; -import jalview.renderer.seqfeatures.FeatureColourFinder; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.Graphics; -import java.awt.Image; -import java.awt.Panel; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; - -public class OverviewPanel extends Panel implements Runnable, - MouseMotionListener, MouseListener -{ - private OverviewDimensions od; - - private Image miniMe; - - private Image offscreen; - - private AlignViewport av; - - private AlignmentPanel ap; - - private boolean resizing = false; - - // This is set true if the user resizes whilst - // the overview is being calculated - private boolean resizeAgain = false; - - // Can set different properties in this seqCanvas than - // main visible SeqCanvas - private SequenceRenderer sr; - - private FeatureRenderer fr; - - private Frame nullFrame; - - public OverviewPanel(AlignmentPanel alPanel) - { - this.av = alPanel.av; - this.ap = alPanel; - setLayout(null); - nullFrame = new Frame(); - nullFrame.addNotify(); - - sr = new SequenceRenderer(av); - sr.graphics = nullFrame.getGraphics(); - sr.renderGaps = false; - sr.forOverview = true; - fr = new FeatureRenderer(av); - - od = new OverviewDimensions(av.getRanges(), av.isShowAnnotation()); - - setSize(new Dimension(od.getWidth(), od.getHeight())); - addComponentListener(new ComponentAdapter() - { - - @Override - public void componentResized(ComponentEvent evt) - { - if ((getWidth() != od.getWidth()) - || (getHeight() != (od.getHeight()))) - { - updateOverviewImage(); - } - } - }); - - addMouseMotionListener(this); - - addMouseListener(this); - - updateOverviewImage(); - - } - - @Override - public void mouseEntered(MouseEvent evt) - { - } - - @Override - public void mouseExited(MouseEvent evt) - { - } - - @Override - public void mouseClicked(MouseEvent evt) - { - } - - @Override - public void mouseMoved(MouseEvent evt) - { - } - - @Override - public void mousePressed(MouseEvent evt) - { - mouseAction(evt); - } - - @Override - public void mouseReleased(MouseEvent evt) - { - mouseAction(evt); - } - - @Override - public void mouseDragged(MouseEvent evt) - { - mouseAction(evt); - } - - private void mouseAction(MouseEvent evt) - { - od.updateViewportFromMouse(evt.getX(), evt.getY(), av.getAlignment() - .getHiddenSequences(), av.getColumnSelection(), av - .getRanges()); - ap.setScrollValues(od.getScrollCol(), od.getScrollRow()); - ap.paintAlignment(false); - } - - /** - * Updates the overview image when the related alignment panel is updated - */ - public void updateOverviewImage() - { - if (resizing) - { - resizeAgain = true; - return; - } - - if (av.isShowSequenceFeatures()) - { - fr.transferSettings(ap.seqPanel.seqCanvas.fr); - } - - resizing = true; - - if ((getSize().width > 0) && (getSize().height > 0)) - { - od.setWidth(getSize().width); - od.setHeight(getSize().height); - } - setSize(new Dimension(od.getWidth(), od.getHeight())); - - Thread thread = new Thread(this); - thread.start(); - repaint(); - } - - @Override - public void run() - { - miniMe = null; - - if (av.isShowSequenceFeatures()) - { - fr.transferSettings(ap.seqPanel.seqCanvas.getFeatureRenderer()); - } - - if (getSize().width > 0 && getSize().height > 0) - { - od.setWidth(getSize().width); - od.setHeight(getSize().height); - } - - setSize(new Dimension(od.getWidth(), od.getHeight())); - - miniMe = nullFrame.createImage(od.getWidth(), od.getHeight()); - offscreen = nullFrame.createImage(od.getWidth(), od.getHeight()); - - Graphics mg = miniMe.getGraphics(); -<<<<<<< HEAD - - int alwidth = av.getAlignment().getWidth(); - int alheight = av.getAlignment().getAbsoluteHeight(); - float sampleCol = alwidth / (float) od.getWidth(); - float sampleRow = alheight / (float) od.getSequencesHeight(); -======= - float sampleCol = (float) alwidth / (float) width; - float sampleRow = (float) alheight / (float) sequencesHeight; - - int lastcol = 0, lastrow = 0; - int xstart = 0, ystart = 0; - Color color = Color.yellow; - int row, col, sameRow = 0, sameCol = 0; - jalview.datamodel.SequenceI seq; - final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av - .hasHiddenColumns(); - boolean hiddenRow = false; - AlignmentI alignment = av.getAlignment(); - - FeatureColourFinder finder = new FeatureColourFinder(fr); - for (row = 0; row <= sequencesHeight; row++) - { - if (resizeAgain) - { - break; - } - if ((int) (row * sampleRow) == lastrow) - { - sameRow++; - continue; - } - - hiddenRow = false; - if (hasHiddenRows) - { - seq = alignment.getHiddenSequences().getHiddenSequence(lastrow); - if (seq == null) - { - int index = alignment.getHiddenSequences() - .findIndexWithoutHiddenSeqs(lastrow); - - seq = alignment.getSequenceAt(index); - } - else - { - hiddenRow = true; - } - } - else - { - seq = alignment.getSequenceAt(lastrow); - } - - for (col = 0; col < width; col++) - { - if ((int) (col * sampleCol) == lastcol - && (int) (row * sampleRow) == lastrow) - { - sameCol++; - continue; - } - - lastcol = (int) (col * sampleCol); - - if (seq.getLength() > lastcol) - { - color = sr.getResidueColour(seq, lastcol, finder); - } - else - { - color = Color.white; - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection().isVisible( - lastcol))) - { - color = color.darker().darker(); - } - - mg.setColor(color); - if (sameCol == 1 && sameRow == 1) - { - mg.drawLine(xstart, ystart, xstart, ystart); - } - else - { - mg.fillRect(xstart, ystart, sameCol, sameRow); - } ->>>>>>> bug/JAL-2436featureRendererThreading - - buildImage(sampleRow, sampleCol, mg); - - if (av.isShowAnnotation()) - { - for (int col = 0; col < od.getWidth() && !resizeAgain; col++) - { - mg.translate(col, od.getSequencesHeight()); - ap.annotationPanel.renderer.drawGraph(mg, - av.getAlignmentConservationAnnotation(), - av.getAlignmentConservationAnnotation().annotations, - (int) (sampleCol) + 1, od.getGraphHeight(), - (int) (col * sampleCol), (int) (col * sampleCol) + 1); - mg.translate(-col, -od.getSequencesHeight()); - } - } - System.gc(); - - resizing = false; - - setBoxPosition(); - - if (resizeAgain) - { - resizeAgain = false; - updateOverviewImage(); - } - } - - /* - * Build the overview panel image - */ - private void buildImage(float sampleRow, float sampleCol, Graphics mg) - { - int lastcol = 0; - int lastrow = 0; - int xstart = 0; - int ystart = 0; - Color color = Color.yellow; - int sameRow = 0; - int sameCol = 0; - - SequenceI seq = null; - - final boolean hasHiddenCols = av.hasHiddenColumns(); - boolean hiddenRow = false; - - for (int row = 0; row <= od.getSequencesHeight() && !resizeAgain; row++) - { - if ((int) (row * sampleRow) == lastrow) - { - sameRow++; - } - else - { - // get the sequence which would be at alignment index 'lastrow' if no - // columns were hidden, and determine whether it is hidden or not - hiddenRow = av.getAlignment().isHidden(lastrow); - seq = av.getAlignment().getSequenceAtAbsoluteIndex(lastrow); - - for (int col = 0; col < od.getWidth(); col++) - { - if ((int) (col * sampleCol) == lastcol - && (int) (row * sampleRow) == lastrow) - { - sameCol++; - } - else - { - lastcol = (int) (col * sampleCol); - - color = getColumnColourFromSequence(seq, hiddenRow, - hasHiddenCols, lastcol); - - mg.setColor(color); - if (sameCol == 1 && sameRow == 1) - { - mg.drawLine(xstart, ystart, xstart, ystart); - } - else - { - mg.fillRect(xstart, ystart, sameCol, sameRow); - } - - xstart = col; - sameCol = 1; - } - } - lastrow = (int) (row * sampleRow); - ystart = row; - sameRow = 1; - } - } - } - - /* - * Find the colour of a sequence at a specified column position - */ - private Color getColumnColourFromSequence( - jalview.datamodel.SequenceI seq, boolean hiddenRow, - boolean hasHiddenCols, int lastcol) - { - Color color; - if (seq.getLength() > lastcol) - { - color = sr.getResidueBoxColour(seq, lastcol); - - if (av.isShowSequenceFeatures()) - { - color = fr.findFeatureColour(color, seq, lastcol); - } - } - else - { - color = Color.white; - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection() - .isVisible(lastcol))) - { - color = color.darker().darker(); - } - return color; - } - - /** - * Update the overview panel box when the associated alignment panel is - * changed - * - */ - public void setBoxPosition() - { - od.setBoxPosition(av.getAlignment() - .getHiddenSequences(), av.getColumnSelection(), av.getRanges()); - repaint(); - } - - @Override - public void update(Graphics g) - { - paint(g); - } - - @Override - public void paint(Graphics g) - { - Graphics og = offscreen.getGraphics(); - if (miniMe != null) - { - og.drawImage(miniMe, 0, 0, this); - og.setColor(Color.red); - od.drawBox(og); - g.drawImage(offscreen, 0, 0, this); - } - } - -} diff --git a/src/jalview/datamodel/Profile.java~ b/src/jalview/datamodel/Profile.java~ deleted file mode 100644 index 5464596..0000000 --- a/src/jalview/datamodel/Profile.java~ +++ /dev/null @@ -1,143 +0,0 @@ -package jalview.datamodel; - - -/** - * A profile for one column of an alignment - * - * @author gmcarstairs - * - */ -public class Profile implements ProfileI -{ - /* - * an object holding counts of symbols in the profile - */ - private ResidueCount counts; - - /* - * the number of sequences (gapped or not) in the profile - */ - private int height; - - /* - * the number of non-gapped sequences in the profile - */ - private int gapped; - - /* - * the highest count for any residue in the profile - */ - private int maxCount; - - /* - * the residue (e.g. K) or residues (e.g. KQW) with the - * highest count in the profile - */ - private String modalResidue; - - /** - * Constructor which allows derived data to be stored without having to store - * the full profile - * - * @param seqCount - * the number of sequences in the profile - * @param gaps - * the number of gapped sequences - * @param max - * the highest count for any residue - * @param modalres - * the residue (or concatenated residues) with the highest count - */ - public Profile(int seqCount, int gaps, int max, String modalRes) - { - this.height = seqCount; - this.gapped = gaps; - this.maxCount = max; - this.modalResidue = modalRes; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#setCounts(jalview.datamodel.ResidueCount) - */ - @Override - public void setCounts(ResidueCount residueCounts) - { - this.counts = residueCounts; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getPercentageIdentity(boolean) - */ - @Override - public float getPercentageIdentity(boolean ignoreGaps) - { - if (height == 0) - { - return 0f; - } - float pid = 0f; - if (ignoreGaps && gapped < height) - { - pid = (maxCount * 100f) / (height - gapped); - } - else - { - pid = (maxCount * 100f) / height; - } - return pid; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getCounts() - */ - @Override - public ResidueCount getCounts() - { - return counts; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getHeight() - */ - @Override - public int getHeight() - { - return height; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getGapped() - */ - @Override - public int getGapped() - { - return gapped; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getMaxCount() - */ - @Override - public int getMaxCount() - { - return maxCount; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getModalResidue() - */ - @Override - public String getModalResidue() - { - return modalResidue; - } - - /* (non-Javadoc) - * @see jalview.datamodel.ProfileI#getNonGapped() - */ - @Override - public int getNonGapped() - { - return height - gapped; - } -} diff --git a/src/jalview/datamodel/ProfileI.java~ b/src/jalview/datamodel/ProfileI.java~ deleted file mode 100644 index cf2b394..0000000 --- a/src/jalview/datamodel/ProfileI.java~ +++ /dev/null @@ -1,67 +0,0 @@ -package jalview.datamodel; - -public interface ProfileI -{ - - /** - * Set the full profile of counts - * - * @param residueCounts - */ - public abstract void setCounts(ResidueCount residueCounts); - - /** - * Returns the percentage identity of the profile, i.e. the highest proportion - * of conserved (equal) symbols. The percentage is as a fraction of all - * sequences, or only ungapped sequences if flag ignoreGaps is set true. - * - * @param ignoreGaps - * @return - */ - public abstract float getPercentageIdentity(boolean ignoreGaps); - - /** - * Returns the full symbol counts for this profile - * - * @return - */ - public abstract ResidueCount getCounts(); - - /** - * Returns the number of sequences in the profile - * - * @return - */ - public abstract int getHeight(); - - /** - * Returns the number of sequences in the profile which had a gap character - * (or were too short to be included in this column's profile) - * - * @return - */ - public abstract int getGapped(); - - /** - * Returns the highest count for any symbol(s) in the profile - * - * @return - */ - public abstract int getMaxCount(); - - /** - * Returns the symbol (or concatenated symbols) which have the highest count - * in the profile, or an empty string if there were no symbols counted - * - * @return - */ - public abstract String getModalResidue(); - - /** - * Answers the number of non-gapped sequences in the profile - * - * @return - */ - public abstract int getNonGapped(); - -} \ No newline at end of file diff --git a/src/jalview/datamodel/Profiles.java~ b/src/jalview/datamodel/Profiles.java~ deleted file mode 100644 index 98a8c6d..0000000 --- a/src/jalview/datamodel/Profiles.java~ +++ /dev/null @@ -1,43 +0,0 @@ -package jalview.datamodel; - -public class Profiles implements ProfilesI -{ - - private ProfileI[] profiles; - - public Profiles(ProfileI[] p) - { - profiles = p; - } - - /** - * Returns the profile for the given column, or null if none found - * - * @param col - */ - @Override - public ProfileI get(int col) - { - return profiles != null && col >= 0 && col < profiles.length ? profiles[col] - : null; - } - - /** - * Returns the first column (base 0) covered by the profiles - */ - @Override - public int getStartColumn() - { - return 0; - } - - /** - * Returns the last column (base 0) covered by the profiles - */ - @Override - public int getEndColumn() - { - return profiles == null ? 0 : profiles.length - 1; - } - -} diff --git a/src/jalview/datamodel/ProfilesI.java~ b/src/jalview/datamodel/ProfilesI.java~ deleted file mode 100644 index 6719de6..0000000 --- a/src/jalview/datamodel/ProfilesI.java~ +++ /dev/null @@ -1,12 +0,0 @@ -package jalview.datamodel; - -public interface ProfilesI -{ - - ProfileI get(int i); - - int getStartColumn(); - - int getEndColumn(); - -} diff --git a/src/jalview/datamodel/ResidueCount.java~ b/src/jalview/datamodel/ResidueCount.java~ deleted file mode 100644 index 0d0348c..0000000 --- a/src/jalview/datamodel/ResidueCount.java~ +++ /dev/null @@ -1,621 +0,0 @@ -package jalview.datamodel; - -import jalview.util.Comparison; -import jalview.util.Format; -import jalview.util.QuickSort; -import jalview.util.SparseCount; - -/** - * A class to count occurrences of residues in a profile, optimised for speed - * and memory footprint. - * @author gmcarstairs - * - */ -public class ResidueCount -{ - /** - * A data bean to hold the results of counting symbols - */ - public class SymbolCounts - { - /** - * the symbols seen (as char values), in no particular order - */ - public final char[] symbols; - - /** - * the counts for each symbol, in the same order as the symbols - */ - public final int[] values; - - SymbolCounts(char[] s, int[] v) - { - symbols = s; - values = v; - } - } - - private static final int TOUPPERCASE = 'A' - 'a'; - - /* - * nucleotide symbols to count (including N unknown) - */ - private static final String NUCS = "ACGNTU"; - - /* - * amino acid symbols to count (including X unknown) - * NB we also include U so as to support counting of RNA bases - * in the "don't know" case of nucleotide / peptide - */ - private static final String AAS = "ACDEFGHIKLMNPQRSTUVWXY"; - - private static final int GAP_COUNT = 0; - - /* - * fast lookup tables holding the index into our count - * arrays of each symbol; index 0 is reserved for gap counting - */ - private static int[] NUC_INDEX = new int[26]; - - private static int[] AA_INDEX = new int[26]; - static - { - for (int i = 0; i < NUCS.length(); i++) - { - NUC_INDEX[NUCS.charAt(i) - 'A'] = i + 1; - } - for (int i = 0; i < AAS.length(); i++) - { - AA_INDEX[AAS.charAt(i) - 'A'] = i + 1; - } - } - - /* - * counts array, just big enough for the nucleotide or peptide - * character set (plus gap counts in position 0) - */ - private short[] counts; - - /* - * alternative array of int counts for use if any count - * exceeds the maximum value of short (32767) - */ - private int[] intCounts; - - /* - * flag set if we switch from short to int counts - */ - private boolean useIntCounts; - - /* - * general-purpose counter, only for use for characters - * that are not in the expected alphabet - */ - private SparseCount otherData; - - /* - * keeps track of the maximum count value recorded - * (if this class ever allows decrements, would need to - * calculate this on request instead) - */ - int maxCount; - - /* - * if we think we are counting nucleotide, can get by with smaller - * array to hold counts - */ - private boolean isNucleotide; - - /** - * Default constructor allocates arrays able to count either nucleotide or - * peptide bases. Use this constructor if not sure which the data is. - */ - public ResidueCount() - { - this(false); - } - - /** - * Constructor that allocates an array just big enough for the anticipated - * characters, plus one position to count gaps - */ - public ResidueCount(boolean nucleotide) - { - isNucleotide = nucleotide; - int charsToCount = nucleotide ? NUCS.length() : AAS.length(); - counts = new short[charsToCount + 1]; - } - - /** - * Increments the count for the given character. The supplied character may be - * upper or lower case but counts are for the upper case only. Gap characters - * (space, ., -) are all counted together. - * - * @param c - * @return the new value of the count for the character - */ - public int add(final char c) - { - char u = toUpperCase(c); - int newValue = 0; - int offset = getOffset(u); - - /* - * offset 0 is reserved for gap counting, so 0 here means either - * an unexpected character, or a gap character passed in error - */ - if (offset == 0) - { - if (Comparison.isGap(u)) - { - newValue = addGap(); - } - else - { - newValue = addOtherCharacter(u); - } - } - else - { - newValue = increment(offset); - } - return newValue; - } - - /** - * Increment the count at the specified offset. If this would result in short - * overflow, promote to counting int values instead. - * - * @param offset - * @return the new value of the count at this offset - */ - int increment(int offset) - { - int newValue = 0; - if (useIntCounts) - { - newValue = intCounts[offset]; - intCounts[offset] = ++newValue; - } - else - { - if (counts[offset] == Short.MAX_VALUE) - { - handleOverflow(); - newValue = intCounts[offset]; - intCounts[offset] = ++newValue; - } - else - { - newValue = counts[offset]; - counts[offset] = (short) ++newValue; - } - } - maxCount = Math.max(maxCount, newValue); - return newValue; - } - - /** - * Switch from counting in short to counting in int - */ - synchronized void handleOverflow() - { - intCounts = new int[counts.length]; - for (int i = 0; i < counts.length; i++) - { - intCounts[i] = counts[i]; - } - counts = null; - useIntCounts = true; - } - - /** - * Returns this character's offset in the count array - * - * @param c - * @return - */ - int getOffset(char c) - { - int offset = 0; - if ('A' <= c && c <= 'Z') - { - offset = isNucleotide ? NUC_INDEX[c - 'A'] : AA_INDEX[c - 'A']; - } - return offset; - } - - /** - * @param c - * @return - */ - protected char toUpperCase(final char c) - { - char u = c; - if ('a' <= c && c <= 'z') - { - u = (char) (c + TOUPPERCASE); - } - return u; - } - - /** - * Increment count for some unanticipated character. The first time this - * called, a SparseCount is instantiated to hold these 'extra' counts. - * - * @param c - * @return the new value of the count for the character - */ - int addOtherCharacter(char c) - { - if (otherData == null) - { - otherData = new SparseCount(); - } - int newValue = otherData.add(c, 1); - maxCount = Math.max(maxCount, newValue); - return newValue; - } - - /** - * Set count for some unanticipated character. The first time this called, a - * SparseCount is instantiated to hold these 'extra' counts. - * - * @param c - * @param value - */ - void setOtherCharacter(char c, int value) - { - if (otherData == null) - { - otherData = new SparseCount(); - } - otherData.put(c, value); - } - - /** - * Increment count of gap characters - * - * @return the new count of gaps - */ - public int addGap() - { - int newValue; - if (useIntCounts) - { - newValue = ++intCounts[GAP_COUNT]; - } - else - { - newValue = ++counts[GAP_COUNT]; - } - return newValue; - } - - /** - * Answers true if we are counting ints (only after overflow of short counts) - * - * @return - */ - boolean isCountingInts() - { - return useIntCounts; - } - - /** - * Sets the count for the given character. The supplied character may be upper - * or lower case but counts are for the upper case only. - * - * @param c - * @param count - */ - public void put(char c, int count) - { - char u = toUpperCase(c); - int offset = getOffset(u); - - /* - * offset 0 is reserved for gap counting, so 0 here means either - * an unexpected character, or a gap character passed in error - */ - if (offset == 0) - { - if (Comparison.isGap(u)) - { - set(0, count); - } - else - { - setOtherCharacter(u, count); - maxCount = Math.max(maxCount, count); - } - } - else - { - set(offset, count); - maxCount = Math.max(maxCount, count); - } - } - - /** - * Sets the count at the specified offset. If this would result in short - * overflow, promote to counting int values instead. - * - * @param offset - * @param value - */ - void set(int offset, int value) - { - if (useIntCounts) - { - intCounts[offset] = value; - } - else - { - if (value > Short.MAX_VALUE || value < Short.MIN_VALUE) - { - handleOverflow(); - intCounts[offset] = value; - } - else - { - counts[offset] = (short) value; - } - } - } - - /** - * Returns the count for the given character, or zero if no count held - * - * @param c - * @return - */ - public int getCount(char c) - { - char u = toUpperCase(c); - int offset = getOffset(u); - if (offset == 0) - { - if (!Comparison.isGap(u)) - { - // should have called getGapCount() - return otherData == null ? 0 : otherData.get(u); - } - } - return useIntCounts ? intCounts[offset] : counts[offset]; - } - - public int getGapCount() - { - return useIntCounts ? intCounts[0] : counts[0]; - } - - /** - * Answers true if this object wraps a counter for unexpected characters - * - * @return - */ - boolean isUsingOtherData() - { - return otherData != null; - } - - /** - * Returns the character (or concatenated characters) for the symbol(s) with - * the given count in the profile. Can be used to get the modal residue by - * supplying the modal count value. Returns an empty string if no symbol has - * the given count. The symbols are in alphabetic order of standard peptide or - * nucleotide characters, followed by 'other' symbols if any. - * - * @return - */ - public String getResiduesForCount(int count) - { - if (count == 0) - { - return ""; - } - - /* - * find counts for the given value and append the - * corresponding symbol - */ - StringBuilder modal = new StringBuilder(); - if (useIntCounts) - { - for (int i = 1; i < intCounts.length; i++) - { - if (intCounts[i] == count) - { - modal.append(isNucleotide ? NUCS.charAt(i - 1) : AAS - .charAt(i - 1)); - } - } - } - else - { - for (int i = 1; i < counts.length; i++) - { - if (counts[i] == count) - { - modal.append(isNucleotide ? NUCS.charAt(i - 1) : AAS - .charAt(i - 1)); - } - } - } - if (otherData != null) - { - for (int i = 0; i < otherData.size(); i++) - { - if (otherData.valueAt(i) == count) - { - modal.append((char) otherData.keyAt(i)); - } - } - } - return modal.toString(); - } - - /** - * Returns the highest count for any symbol(s) in the profile (excluding gap) - * - * @return - */ - public int getModalCount() - { - return maxCount; - } - - /** - * Returns the number of distinct symbols with a non-zero count (excluding the - * gap symbol) - * - * @return - */ - public int size() { - int size = 0; - if (useIntCounts) - { - for (int i = 1; i < intCounts.length; i++) - { - if (intCounts[i] > 0) - { - size++; - } - } - } - else - { - for (int i = 1; i < counts.length; i++) - { - if (counts[i] > 0) - { - size++; - } - } - } - - /* - * include 'other' characters recorded (even if count is zero - * though that would be a strange use case) - */ - if (otherData != null) - { - size += otherData.size(); - } - - return size; - } - - /** - * Returns a data bean holding those symbols that have a non-zero count - * (excluding the gap symbol), with their counts. - * - * @return - */ - public SymbolCounts getSymbolCounts() - { - int size = size(); - char[] symbols = new char[size]; - int[] values = new int[size]; - int j = 0; - - if (useIntCounts) - { - for (int i = 1; i < intCounts.length; i++) - { - if (intCounts[i] > 0) - { - char symbol = isNucleotide ? NUCS.charAt(i - 1) : AAS - .charAt(i - 1); - symbols[j] = symbol; - values[j] = intCounts[i]; - j++; - } - } - } - else - { - for (int i = 1; i < counts.length; i++) - { - if (counts[i] > 0) - { - char symbol = isNucleotide ? NUCS.charAt(i - 1) : AAS - .charAt(i - 1); - symbols[j] = symbol; - values[j] = counts[i]; - j++; - } - } - } - if (otherData != null) - { - for (int i = 0; i < otherData.size(); i++) - { - symbols[j] = (char) otherData.keyAt(i); - values[j] = otherData.valueAt(i); - j++; - } - } - - return new SymbolCounts(symbols, values); - } - - /** - * Returns a tooltip string showing residues in descending order of their - * percentage frequency in the profile - * - * @param normaliseBy - * the divisor for residue counts (may or may not include gapped - * sequence count) - * @param percentageDecPl - * the number of decimal places to show in percentages - * @return - */ - public String getTooltip(int normaliseBy, int percentageDecPl) - { - SymbolCounts symbolCounts = getSymbolCounts(); - char[] ca = symbolCounts.symbols; - int[] vl = symbolCounts.values; - - /* - * sort characters into ascending order of their counts - */ - QuickSort.sort(vl, ca); - - /* - * traverse in reverse order (highest count first) to build tooltip - */ - boolean first = true; - StringBuilder sb = new StringBuilder(64); - for (int c = ca.length - 1; c >= 0; c--) - { - final char residue = ca[c]; - // TODO combine residues which share a percentage - // (see AAFrequency.completeCdnaConsensus) - float tval = (vl[c] * 100f) / normaliseBy; - sb.append(first ? "" : "; ").append(residue).append(" "); - Format.appendPercentage(sb, tval, percentageDecPl); - sb.append("%"); - first = false; - } - return sb.toString(); - } - - /** - * Returns a string representation of the symbol counts, for debug purposes. - */ - @Override - public String toString() - { - StringBuilder sb = new StringBuilder(); - sb.append("[ "); - SymbolCounts sc = getSymbolCounts(); - for (int i = 0; i < sc.symbols.length; i++) - { - sb.append(sc.symbols[i]).append(":").append(sc.values[i]).append(" "); - } - sb.append("]"); - return sb.toString(); - } -} diff --git a/src/jalview/datamodel/SearchResultMatchI.java~ b/src/jalview/datamodel/SearchResultMatchI.java~ deleted file mode 100644 index 732f1dc..0000000 --- a/src/jalview/datamodel/SearchResultMatchI.java~ +++ /dev/null @@ -1,30 +0,0 @@ -package jalview.datamodel; - -/** - * An interface that describes one matched region of an alignment, as one - * contiguous portion of a single dataset sequence - */ -public interface SearchResultMatchI -{ - /** - * Returns the matched sequence - * - * @return - */ - SequenceI getSequence(); - - /** - * Returns the start position of the match in the sequence (base 1) - * - * @return - */ - int getStart(); - - /** - * Returns the end position of the match in the sequence (base 1) - * - * @return - */ - int getEnd(); - -} \ No newline at end of file diff --git a/src/jalview/datamodel/SearchResultsI.java~ b/src/jalview/datamodel/SearchResultsI.java~ deleted file mode 100644 index 93183f2..0000000 --- a/src/jalview/datamodel/SearchResultsI.java~ +++ /dev/null @@ -1,84 +0,0 @@ -package jalview.datamodel; - -import java.util.BitSet; -import java.util.List; - -/** - * An interface describing the result of a search or other operation which - * highlights matched regions of an alignment - */ -public interface SearchResultsI -{ - - /** - * Adds one region to the results - * - * @param seq - * Sequence - * @param start - * int - * @param end - * int - * @return - */ - SearchResultMatchI addResult(SequenceI seq, int start, int end); - - /** - * Answers true if the search results include the given sequence (or its - * dataset sequence), else false - * - * @param sequence - * @return - */ - boolean involvesSequence(SequenceI sequence); - - /** - * Returns an array of [from, to, from, to..] matched columns (base 0) between - * the given start and end columns of the given sequence. Returns null if no - * matches overlap the specified region. - *

- * Implementations should provide an optimised method to return locations to - * highlight on a visible portion of an alignment. - * - * @param sequence - * @param start - * first column of range (base 0, inclusive) - * @param end - * last column of range base 0, inclusive) - * @return int[] - */ - int[] getResults(SequenceI sequence, int start, int end); - - /** - * Returns the number of matches found - * - * @return - */ - int getSize(); - - /** - * Returns true if no search result matches are held. - * - * @return - */ - boolean isEmpty(); - - /** - * Returns the list of matches. - * - * @return - */ - List getResults(); - - /** - * Set bits in a bitfield for all columns in the given sequence collection - * that are highlighted - * - * @param sqcol - * the set of sequences to search for highlighted regions - * @param bs - * bitset to set - * @return number of bits set - */ - int markColumns(SequenceCollectionI sqcol, BitSet bs); -} \ No newline at end of file diff --git a/src/jalview/ext/jmol/JmolParser.java~ b/src/jalview/ext/jmol/JmolParser.java~ deleted file mode 100644 index 9b32846..0000000 --- a/src/jalview/ext/jmol/JmolParser.java~ +++ /dev/null @@ -1,670 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.ext.jmol; - -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.Annotation; -import jalview.datamodel.PDBEntry; -import jalview.datamodel.SequenceI; -import jalview.io.FileParse; -import jalview.io.StructureFile; -import jalview.schemes.ResidueProperties; -import jalview.structure.StructureImportSettings; -import jalview.util.Format; -import jalview.util.MessageManager; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -import javajs.awt.Dimension; - -import org.jmol.api.JmolStatusListener; -import org.jmol.api.JmolViewer; -import org.jmol.c.CBK; -import org.jmol.c.STR; -import org.jmol.modelset.ModelSet; -import org.jmol.viewer.Viewer; - -import MCview.Atom; -import MCview.PDBChain; -import MCview.Residue; - -/** - * Import and process files with Jmol for file like PDB, mmCIF - * - * @author jprocter - * - */ -public class JmolParser extends StructureFile implements JmolStatusListener -{ - Viewer viewer = null; - - public JmolParser(String inFile, String type) throws IOException - { - super(inFile, type); - } - - public JmolParser(FileParse fp) throws IOException - { - super(fp); - } - - public JmolParser() - { - } - - /** - * Calls the Jmol library to parse the PDB/mmCIF file, and then inspects the - * resulting object model to generate Jalview-style sequences, with secondary - * structure annotation added where available (i.e. where it has been computed - * by Jmol using DSSP). - * - * @see jalview.io.AlignFile#parse() - */ - @Override - public void parse() throws IOException - { - setChains(new Vector()); - Viewer jmolModel = getJmolData(); - jmolModel.openReader(getDataName(), getDataName(), getReader()); - waitForScript(jmolModel); - - /* - * Convert one or more Jmol Model objects to Jalview sequences - */ - if (jmolModel.ms.mc > 0) - { - // ideally we do this - // try - // { - // setStructureFileType(jmolModel.evalString("show _fileType")); - // } catch (Exception q) - // { - // } - // ; - // instead, we distinguish .cif from non-.cif by filename - setStructureFileType(getDataName().toLowerCase().endsWith(".cif") ? PDBEntry.Type.MMCIF - .toString() : "PDB"); - - transformJmolModelToJalview(jmolModel.ms); - } - } - - /** - * create a headless jmol instance for dataprocessing - * - * @return - */ - private Viewer getJmolData() - { - if (viewer == null) - { - try - { - /* - * params -o (output to sysout) -n (nodisplay) -x (exit when finished) - * see http://wiki.jmol.org/index.php/Jmol_Application - */ - viewer = (Viewer) JmolViewer.allocateViewer(null, null, null, null, - null, "-x -o -n", this); - // ensure the 'new' (DSSP) not 'old' (Ramachandran) SS method is used - viewer.setBooleanProperty("defaultStructureDSSP", true); - } catch (ClassCastException x) - { - throw new Error(MessageManager.formatMessage( - "error.jmol_version_not_compatible_with_jalview_version", - new String[] { JmolViewer.getJmolVersion() }), x); - } - } - return viewer; - } - - public void transformJmolModelToJalview(ModelSet ms) throws IOException - { - try - { - String lastID = ""; - List rna = new ArrayList(); - List prot = new ArrayList(); - PDBChain tmpchain; - String pdbId = (String) ms.getInfo(0, "title"); - - if (pdbId == null) - { - setId(safeName(getDataName())); - setPDBIdAvailable(false); - } - else - { - setId(pdbId); - setPDBIdAvailable(true); - } - List significantAtoms = convertSignificantAtoms(ms); - for (Atom tmpatom : significantAtoms) - { - try - { - tmpchain = findChain(tmpatom.chain); - if (tmpatom.resNumIns.trim().equals(lastID)) - { - // phosphorylated protein - seen both CA and P.. - continue; - } - tmpchain.atoms.addElement(tmpatom); - } catch (Exception e) - { - tmpchain = new PDBChain(getId(), tmpatom.chain); - getChains().add(tmpchain); - tmpchain.atoms.addElement(tmpatom); - } - lastID = tmpatom.resNumIns.trim(); - } - xferSettings(); - - makeResidueList(); - makeCaBondList(); - -<<<<<<< HEAD -======= - if (getId() == null) - { - // always use resource name, not the hardwired file - // Does the value of ID get used ? Behaviour needs to be - // documented and tested - setId(getDataName()); - } ->>>>>>> spike/JAL-2040_JAL-2137_phyre2 - for (PDBChain chain : getChains()) - { - SequenceI chainseq = postProcessChain(chain); - if (isRNA(chainseq)) - { - rna.add(chainseq); - } - else - { - prot.add(chainseq); - } - - if (StructureImportSettings.isProcessSecondaryStructure()) - { - createAnnotation(chainseq, chain, ms.at); - } - } - } catch (OutOfMemoryError er) - { - System.out - .println("OUT OF MEMORY LOADING TRANSFORMING JMOL MODEL TO JALVIEW MODEL"); - throw new IOException( - MessageManager - .getString("exception.outofmemory_loading_mmcif_file")); - } - } - - private List convertSignificantAtoms(ModelSet ms) - { - List significantAtoms = new ArrayList(); - HashMap chainTerMap = new HashMap(); - org.jmol.modelset.Atom prevAtom = null; - for (org.jmol.modelset.Atom atom : ms.at) - { - if (atom.getAtomName().equalsIgnoreCase("CA") - || atom.getAtomName().equalsIgnoreCase("P")) - { - if (!atomValidated(atom, prevAtom, chainTerMap)) - { - continue; - } - Atom curAtom = new Atom(atom.x, atom.y, atom.z); - curAtom.atomIndex = atom.getIndex(); - curAtom.chain = atom.getChainIDStr(); - curAtom.insCode = atom.group.getInsertionCode() == '\000' ? ' ' - : atom.group.getInsertionCode(); - curAtom.name = atom.getAtomName(); - curAtom.number = atom.getAtomNumber(); - curAtom.resName = atom.getGroup3(true); - curAtom.resNumber = atom.getResno(); - curAtom.occupancy = ms.occupancies != null ? ms.occupancies[atom - .getIndex()] : Float.valueOf(atom.getOccupancy100()); - String fmt = new Format("%4i").form(curAtom.resNumber); - curAtom.resNumIns = (fmt + curAtom.insCode); - curAtom.tfactor = atom.getBfactor100() / 100f; - curAtom.type = 0; - // significantAtoms.add(curAtom); - // ignore atoms from subsequent models - if (!significantAtoms.contains(curAtom)) - { - significantAtoms.add(curAtom); - } - prevAtom = atom; - } - } - return significantAtoms; - } - - private boolean atomValidated(org.jmol.modelset.Atom curAtom, - org.jmol.modelset.Atom prevAtom, - HashMap chainTerMap) - { - // System.out.println("Atom: " + curAtom.getAtomNumber() - // + " Last atom index " + curAtom.group.lastAtomIndex); - if (chainTerMap == null || prevAtom == null) - { - return true; - } - String curAtomChId = curAtom.getChainIDStr(); - String prevAtomChId = prevAtom.getChainIDStr(); - // new chain encoutered - if (!prevAtomChId.equals(curAtomChId)) - { - // On chain switch add previous chain termination to xTerMap if not exists - if (!chainTerMap.containsKey(prevAtomChId)) - { - chainTerMap.put(prevAtomChId, prevAtom); - } - // if current atom belongs to an already terminated chain and the resNum - // diff < 5 then mark as valid and update termination Atom - if (chainTerMap.containsKey(curAtomChId)) - { - if (curAtom.getResno() < chainTerMap.get(curAtomChId).getResno()) - { - return false; - } - if ((curAtom.getResno() - chainTerMap.get(curAtomChId).getResno()) < 5) - { - chainTerMap.put(curAtomChId, curAtom); - return true; - } - return false; - } - } - // atom with previously terminated chain encountered - else if (chainTerMap.containsKey(curAtomChId)) - { - if (curAtom.getResno() < chainTerMap.get(curAtomChId).getResno()) - { - return false; - } - if ((curAtom.getResno() - chainTerMap.get(curAtomChId).getResno()) < 5) - { - chainTerMap.put(curAtomChId, curAtom); - return true; - } - return false; - } - // HETATM with resNum jump > 2 - return !(curAtom.isHetero() && ((curAtom.getResno() - prevAtom - .getResno()) > 2)); - } - - private void createAnnotation(SequenceI sequence, PDBChain chain, - org.jmol.modelset.Atom[] jmolAtoms) - { - char[] secstr = new char[sequence.getLength()]; - char[] secstrcode = new char[sequence.getLength()]; - - // Ensure Residue size equals Seq size - if (chain.residues.size() != sequence.getLength()) - { - return; - } - int annotIndex = 0; - for (Residue residue : chain.residues) - { - Atom repAtom = residue.getAtoms().get(0); - STR proteinStructureSubType = jmolAtoms[repAtom.atomIndex].group - .getProteinStructureSubType(); - setSecondaryStructure(proteinStructureSubType, annotIndex, secstr, - secstrcode); - ++annotIndex; - } - addSecondaryStructureAnnotation(chain.pdbid, sequence, secstr, - secstrcode, chain.id, sequence.getStart()); - } - - /** - * Helper method that adds an AlignmentAnnotation for secondary structure to - * the sequence, provided at least one secondary structure prediction has been - * made - * - * @param modelTitle - * @param seq - * @param secstr - * @param secstrcode - * @param chainId - * @param firstResNum - * @return - */ - protected void addSecondaryStructureAnnotation(String modelTitle, - SequenceI sq, char[] secstr, char[] secstrcode, String chainId, - int firstResNum) - { - char[] seq = sq.getSequence(); - boolean ssFound = false; - Annotation asecstr[] = new Annotation[seq.length + firstResNum - 1]; - for (int p = 0; p < seq.length; p++) - { - if (secstr[p] >= 'A' && secstr[p] <= 'z') - { - try - { - asecstr[p] = new Annotation(String.valueOf(secstr[p]), null, - secstrcode[p], Float.NaN); - ssFound = true; - } catch (Exception e) - { - // e.printStackTrace(); - } - } - } - - if (ssFound) - { - String mt = modelTitle == null ? getDataName() : modelTitle; - mt += chainId; - AlignmentAnnotation ann = new AlignmentAnnotation( - "Secondary Structure", "Secondary Structure for " + mt, - asecstr); - ann.belowAlignment = true; - ann.visible = true; - ann.autoCalculated = false; - ann.setCalcId(getClass().getName()); - ann.adjustForAlignment(); - ann.validateRangeAndDisplay(); - annotations.add(ann); - sq.addAlignmentAnnotation(ann); - } - } - - private void waitForScript(Viewer jmd) - { - while (jmd.isScriptExecuting()) - { - try - { - Thread.sleep(50); - - } catch (InterruptedException x) - { - } - } - } - - /** - * Convert Jmol's secondary structure code to Jalview's, and stored it in the - * secondary structure arrays at the given sequence position - * - * @param proteinStructureSubType - * @param pos - * @param secstr - * @param secstrcode - */ - protected void setSecondaryStructure(STR proteinStructureSubType, - int pos, char[] secstr, char[] secstrcode) - { - switch (proteinStructureSubType) - { - case HELIX310: - secstr[pos] = '3'; - break; - case HELIX: - case HELIXALPHA: - secstr[pos] = 'H'; - break; - case HELIXPI: - secstr[pos] = 'P'; - break; - case SHEET: - secstr[pos] = 'E'; - break; - default: - secstr[pos] = 0; - } - - switch (proteinStructureSubType) - { - case HELIX310: - case HELIXALPHA: - case HELIXPI: - case HELIX: - secstrcode[pos] = 'H'; - break; - case SHEET: - secstrcode[pos] = 'E'; - break; - default: - secstrcode[pos] = 0; - } - } - - /** - * Convert any non-standard peptide codes to their standard code table - * equivalent. (Initial version only does Selenomethionine MSE->MET.) - * - * @param threeLetterCode - * @param seq - * @param pos - */ - protected void replaceNonCanonicalResidue(String threeLetterCode, - char[] seq, int pos) - { - String canonical = ResidueProperties - .getCanonicalAminoAcid(threeLetterCode); - if (canonical != null && !canonical.equalsIgnoreCase(threeLetterCode)) - { - seq[pos] = ResidueProperties.getSingleCharacterCode(canonical); - } - } - - /** - * Not implemented - returns null - */ - @Override - public String print() - { - return null; - } - - /** - * Not implemented - */ - @Override - public void setCallbackFunction(String callbackType, - String callbackFunction) - { - } - - @Override - public void notifyCallback(CBK cbType, Object[] data) - { - String strInfo = (data == null || data[1] == null ? null : data[1] - .toString()); - switch (cbType) - { - case ECHO: - sendConsoleEcho(strInfo); - break; - case SCRIPT: - notifyScriptTermination((String) data[2], - ((Integer) data[3]).intValue()); - break; - case MEASURE: - String mystatus = (String) data[3]; - if (mystatus.indexOf("Picked") >= 0 - || mystatus.indexOf("Sequence") >= 0) - { - // Picking mode - sendConsoleMessage(strInfo); - } - else if (mystatus.indexOf("Completed") >= 0) - { - sendConsoleEcho(strInfo.substring(strInfo.lastIndexOf(",") + 2, - strInfo.length() - 1)); - } - break; - case MESSAGE: - sendConsoleMessage(data == null ? null : strInfo); - break; - case PICK: - sendConsoleMessage(strInfo); - break; - default: - break; - } - } - - String lastConsoleEcho = ""; - - private void sendConsoleEcho(String string) - { - lastConsoleEcho += string; - lastConsoleEcho += "\n"; - } - - String lastConsoleMessage = ""; - - private void sendConsoleMessage(String string) - { - lastConsoleMessage += string; - lastConsoleMessage += "\n"; - } - - int lastScriptTermination = -1; - - String lastScriptMessage = ""; - - private void notifyScriptTermination(String string, int intValue) - { - lastScriptMessage += string; - lastScriptMessage += "\n"; - lastScriptTermination = intValue; - } - - @Override - public boolean notifyEnabled(CBK callbackPick) - { - switch (callbackPick) - { - case MESSAGE: - case SCRIPT: - case ECHO: - case LOADSTRUCT: - case ERROR: - return true; - default: - return false; - } - } - - /** - * Not implemented - returns null - */ - @Override - public String eval(String strEval) - { - return null; - } - - /** - * Not implemented - returns null - */ - @Override - public float[][] functionXY(String functionName, int x, int y) - { - return null; - } - - /** - * Not implemented - returns null - */ - @Override - public float[][][] functionXYZ(String functionName, int nx, int ny, int nz) - { - return null; - } - - /** - * Not implemented - returns null - */ - @Override - public String createImage(String fileName, String imageType, - Object text_or_bytes, int quality) - { - return null; - } - - /** - * Not implemented - returns null - */ - @Override - public Map getRegistryInfo() - { - return null; - } - - /** - * Not implemented - */ - @Override - public void showUrl(String url) - { - } - - /** - * Not implemented - returns null - */ - @Override - public Dimension resizeInnerPanel(String data) - { - return null; - } - - @Override - public Map getJSpecViewProperty(String arg0) - { - return null; - } - - public boolean isPredictSecondaryStructure() - { - return predictSecondaryStructure; - } - - public void setPredictSecondaryStructure(boolean predictSecondaryStructure) - { - this.predictSecondaryStructure = predictSecondaryStructure; - } - - public boolean isVisibleChainAnnotation() - { - return visibleChainAnnotation; - } - - public void setVisibleChainAnnotation(boolean visibleChainAnnotation) - { - this.visibleChainAnnotation = visibleChainAnnotation; - } - -} diff --git a/src/jalview/gui/#OverviewPanel.java# b/src/jalview/gui/#OverviewPanel.java# deleted file mode 100755 index ce3abb5..0000000 --- a/src/jalview/gui/#OverviewPanel.java# +++ /dev/null @@ -1,468 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.gui; - -import jalview.datamodel.SequenceI; -import jalview.renderer.AnnotationRenderer; -import jalview.viewmodel.OverviewDimensions; -import jalview.renderer.seqfeatures.FeatureColourFinder; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; -import java.awt.image.BufferedImage; - -import javax.swing.JPanel; - -/** - * Panel displaying an overview of the full alignment, with an interactive box - * representing the viewport onto the alignment. - * - * @author $author$ - * @version $Revision$ - */ -public class OverviewPanel extends JPanel implements Runnable -{ - private static final Color TRANS_GREY = new Color(100, 100, 100, 25); - - private final AnnotationRenderer renderer = new AnnotationRenderer(); - - private OverviewDimensions od; - - private BufferedImage miniMe; - - private BufferedImage lastMiniMe = null; - - private AlignViewport av; - - private AlignmentPanel ap; - - // - private boolean resizing = false; - - // This is set true if the user resizes whilst - // the overview is being calculated - private boolean resizeAgain = false; - - // Can set different properties in this seqCanvas than - // main visible SeqCanvas - private SequenceRenderer sr; - - private jalview.renderer.seqfeatures.FeatureRenderer fr; - - /** - * Creates a new OverviewPanel object. - * - * @param alPanel - * The alignment panel which is shown in the overview panel - */ - public OverviewPanel(AlignmentPanel alPanel) - { - this.av = alPanel.av; - this.ap = alPanel; - setLayout(null); - - sr = new SequenceRenderer(av); - sr.renderGaps = false; - sr.forOverview = true; - fr = new FeatureRenderer(alPanel); - - od = new OverviewDimensions(av.getRanges(), av.isShowAnnotation()); - - addComponentListener(new ComponentAdapter() - { - @Override - public void componentResized(ComponentEvent evt) - { - if ((getWidth() != od.getWidth()) - || (getHeight() != (od.getHeight()))) - { - updateOverviewImage(); - } - } - }); - - addMouseMotionListener(new MouseMotionAdapter() - { - @Override - public void mouseDragged(MouseEvent evt) - { - if (!av.getWrapAlignment()) - { - od.updateViewportFromMouse(evt.getX(), evt.getY(), av - .getAlignment().getHiddenSequences(), av - .getColumnSelection(), av.getRanges()); - ap.setScrollValues(od.getScrollCol(), od.getScrollRow()); - } - } - }); - - addMouseListener(new MouseAdapter() - { - @Override - public void mousePressed(MouseEvent evt) - { - if (!av.getWrapAlignment()) - { - od.updateViewportFromMouse(evt.getX(), evt.getY(), av - .getAlignment().getHiddenSequences(), av - .getColumnSelection(), av.getRanges()); - ap.setScrollValues(od.getScrollCol(), od.getScrollRow()); - } - } - }); - - updateOverviewImage(); - } - - /** - * Updates the overview image when the related alignment panel is updated - */ - public void updateOverviewImage() - { - if (resizing) - { - resizeAgain = true; - return; - } - - resizing = true; - - if ((getWidth() > 0) && (getHeight() > 0)) - { - od.setWidth(getWidth()); - od.setHeight(getHeight()); - } - - setPreferredSize(new Dimension(od.getWidth(), od.getHeight())); - - Thread thread = new Thread(this); - thread.start(); - repaint(); - } - - @Override - public void run() - { - miniMe = null; - - if (av.isShowSequenceFeatures()) - { - fr.transferSettings(ap.getSeqPanel().seqCanvas.getFeatureRenderer()); - } - - // why do we need to set preferred size again? was set in - // updateOverviewImage - setPreferredSize(new Dimension(od.getWidth(), od.getHeight())); - - miniMe = new BufferedImage(od.getWidth(), od.getHeight(), - BufferedImage.TYPE_INT_RGB); - - Graphics mg = miniMe.getGraphics(); - mg.setColor(Color.orange); - mg.fillRect(0, 0, od.getWidth(), miniMe.getHeight()); - -<<<<<<< HEAD - // calculate sampleCol and sampleRow - // alignment width is max number of residues/bases - // alignment height is number of sequences - int alwidth = av.getAlignment().getWidth(); - int alheight = av.getAlignment().getAbsoluteHeight(); - - // sampleCol or sampleRow is the width/height allocated to each residue - // in particular, sometimes we may need more than one row/col of the - // BufferedImage allocated - // sampleCol is how much of a residue to assign to each pixel - // sampleRow is how many sequences to assign to each pixel - float sampleCol = alwidth / (float) od.getWidth(); - float sampleRow = alheight / (float) od.getSequencesHeight(); - - buildImage(sampleRow, sampleCol); -======= - float sampleCol = (float) alwidth / (float) width; - float sampleRow = (float) alheight / (float) sequencesHeight; - - int lastcol = -1, lastrow = -1; - Color color = Color.white; - int row, col; - jalview.datamodel.SequenceI seq; - final boolean hasHiddenRows = av.hasHiddenRows(), hasHiddenCols = av - .hasHiddenColumns(); - boolean hiddenRow = false; - // get hidden row and hidden column map once at beginning. - // clone featureRenderer settings to avoid race conditions... if state is - // updated just need to refresh again - - FeatureColourFinder finder = new FeatureColourFinder(fr); - - for (row = 0; row < sequencesHeight; row++) - { - if (resizeAgain) - { - break; - } - if ((int) (row * sampleRow) == lastrow) - { - // No need to recalculate the colours, - // Just copy from the row above - for (col = 0; col < width; col++) - { - if (resizeAgain) - { - break; - } - miniMe.setRGB(col, row, miniMe.getRGB(col, row - 1)); - } - continue; - } - - lastrow = (int) (row * sampleRow); - - hiddenRow = false; - if (hasHiddenRows) - { - seq = av.getAlignment().getHiddenSequences() - .getHiddenSequence(lastrow); - if (seq == null) - { - int index = av.getAlignment().getHiddenSequences() - .findIndexWithoutHiddenSeqs(lastrow); - - seq = av.getAlignment().getSequenceAt(index); - } - else - { - hiddenRow = true; - } - } - else - { - seq = av.getAlignment().getSequenceAt(lastrow); - } - - if (seq == null) - { - System.out.println(lastrow + " null"); - continue; - } - - for (col = 0; col < width; col++) - { - if (resizeAgain) - { - break; - } - if ((int) (col * sampleCol) == lastcol - && (int) (row * sampleRow) == lastrow) - { - miniMe.setRGB(col, row, color.getRGB()); - continue; - } - - lastcol = (int) (col * sampleCol); - - if (seq.getLength() > lastcol) - { - color = sr.getResidueColour(seq, lastcol, finder); - } - else - { - color = Color.WHITE; - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection().isVisible( - lastcol))) - { - color = color.darker().darker(); - } - - miniMe.setRGB(col, row, color.getRGB()); ->>>>>>> bug/JAL-2436featureRendererThreading - - if (av.isShowAnnotation()) - { - renderer.updateFromAlignViewport(av); - for (int col = 0; col < od.getWidth() && !resizeAgain; col++) - { - mg.translate(col, od.getSequencesHeight()); - renderer.drawGraph(mg, av.getAlignmentConservationAnnotation(), - av.getAlignmentConservationAnnotation().annotations, - (int) (sampleCol) + 1, od.getGraphHeight(), - (int) (col * sampleCol), (int) (col * sampleCol) + 1); - mg.translate(-col, -od.getSequencesHeight()); - - } - } - System.gc(); - - resizing = false; - - if (resizeAgain) - { - resizeAgain = false; - updateOverviewImage(); - } - else - { - lastMiniMe = miniMe; - } - - setBoxPosition(); - } - - /* - * Build the overview panel image - */ - private void buildImage(float sampleRow, float sampleCol) - { - int lastcol = -1; - int lastrow = -1; - int color = Color.white.getRGB(); - - SequenceI seq = null; - - final boolean hasHiddenCols = av.hasHiddenColumns(); - boolean hiddenRow = false; - // get hidden row and hidden column map once at beginning. - // clone featureRenderer settings to avoid race conditions... if state is - // updated just need to refresh again - for (int row = 0; row < od.getSequencesHeight() && !resizeAgain; row++) - { - boolean doCopy = true; - int currentrow = (int) (row * sampleRow); - if (currentrow != lastrow) - { - doCopy = false; - - lastrow = currentrow; - - // get the sequence which would be at alignment index 'lastrow' if no - // rows were hidden, and determine whether it is hidden or not - hiddenRow = av.getAlignment().isHidden(lastrow); - seq = av.getAlignment().getSequenceAtAbsoluteIndex(lastrow); - } - - for (int col = 0; col < od.getWidth() && !resizeAgain; col++) - { - if (doCopy) - { - color = miniMe.getRGB(col, row - 1); - } - else if ((int) (col * sampleCol) != lastcol - || (int) (row * sampleRow) != lastrow) - { - lastcol = (int) (col * sampleCol); - color = getColumnColourFromSequence(seq, hiddenRow, hasHiddenCols, - lastcol); - } - // else we just use the color we already have , so don't need to set it - - miniMe.setRGB(col, row, color); - } - } - } - - /* - * Find the colour of a sequence at a specified column position - */ - private int getColumnColourFromSequence(jalview.datamodel.SequenceI seq, - boolean hiddenRow, boolean hasHiddenCols, int lastcol) - { - int color; - - if (seq == null) - { - color = Color.white.getRGB(); - } - else if (seq.getLength() > lastcol) - { - color = sr.getResidueBoxColour(seq, lastcol).getRGB(); - - if (av.isShowSequenceFeatures()) - { - color = fr.findFeatureColour(color, seq, lastcol); - } - } - else - { - color = Color.white.getRGB(); - } - - if (hiddenRow - || (hasHiddenCols && !av.getColumnSelection() - .isVisible(lastcol))) - { - color = new Color(color).darker().darker().getRGB(); - } - - return color; - } - - /** - * Update the overview panel box when the associated alignment panel is - * changed - * - */ - public void setBoxPosition() - { - od.setBoxPosition(av.getAlignment() - .getHiddenSequences(), av.getColumnSelection(), av.getRanges()); - repaint(); - } - - - @Override - public void paintComponent(Graphics g) - { - if (resizing || resizeAgain) - { - if (lastMiniMe == null) - { - g.setColor(Color.white); - g.fillRect(0, 0, getWidth(), getHeight()); - } - else - { - g.drawImage(lastMiniMe, 0, 0, getWidth(), getHeight(), this); - } - g.setColor(TRANS_GREY); - g.fillRect(0, 0, getWidth(), getHeight()); - } - else if (lastMiniMe != null) - { - g.drawImage(lastMiniMe, 0, 0, this); - if (lastMiniMe != miniMe) - { - g.setColor(TRANS_GREY); - g.fillRect(0, 0, getWidth(), getHeight()); - } - } - - g.setColor(Color.red); - od.drawBox(g); - } -} diff --git a/src/jalview/gui/StructureChooser.java~ b/src/jalview/gui/StructureChooser.java~ deleted file mode 100644 index 5d6bef1..0000000 --- a/src/jalview/gui/StructureChooser.java~ +++ /dev/null @@ -1,1161 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ - -package jalview.gui; - -import jalview.bin.Jalview; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.DBRefSource; -import jalview.datamodel.PDBEntry; -import jalview.datamodel.SequenceI; -import jalview.fts.api.FTSData; -import jalview.fts.api.FTSDataColumnI; -import jalview.fts.api.FTSRestClientI; -import jalview.fts.core.FTSRestRequest; -import jalview.fts.core.FTSRestResponse; -import jalview.fts.service.pdb.PDBFTSRestClient; -import jalview.jbgui.GStructureChooser; -import jalview.structure.StructureSelectionManager; -import jalview.util.MessageManager; -import jalview.ws.DBRefFetcher; -import jalview.ws.sifts.SiftsSettings; - -import java.awt.event.ItemEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Vector; - -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.table.AbstractTableModel; - -/** - * Provides the behaviors for the Structure chooser Panel - * - * @author tcnofoegbu - * - */ -@SuppressWarnings("serial") -public class StructureChooser extends GStructureChooser implements - IProgressIndicator -{ - private boolean structuresDiscovered = false; - - private SequenceI selectedSequence; - - private SequenceI[] selectedSequences; - - private IProgressIndicator progressIndicator; - - private Collection discoveredStructuresSet; - - private FTSRestRequest lastPdbRequest; - - private FTSRestClientI pdbRestCleint; - - private String selectedPdbFileName; - - private boolean isValidPBDEntry; - - public StructureChooser(SequenceI[] selectedSeqs, SequenceI selectedSeq, - AlignmentPanel ap) - { - this.ap = ap; - this.selectedSequence = selectedSeq; - this.selectedSequences = selectedSeqs; - this.progressIndicator = (ap == null) ? null : ap.alignFrame; - init(); - } - - /** - * Initializes parameters used by the Structure Chooser Panel - */ - public void init() - { - if (!Jalview.isHeadlessMode()) - { - progressBar = new ProgressBar(this.statusPanel, this.statusBar); - } - - Thread discoverPDBStructuresThread = new Thread(new Runnable() - { - @Override - public void run() - { - long startTime = System.currentTimeMillis(); - updateProgressIndicator(MessageManager - .getString("status.loading_cached_pdb_entries"), startTime); - loadLocalCachedPDBEntries(); - updateProgressIndicator(null, startTime); - updateProgressIndicator(MessageManager - .getString("status.searching_for_pdb_structures"), - startTime); - fetchStructuresMetaData(); - populateFilterComboBox(); - updateProgressIndicator(null, startTime); - mainFrame.setVisible(true); - updateCurrentView(); - } - }); - discoverPDBStructuresThread.start(); - } - - /** - * Updates the progress indicator with the specified message - * - * @param message - * displayed message for the operation - * @param id - * unique handle for this indicator - */ - public void updateProgressIndicator(String message, long id) - { - if (progressIndicator != null) - { - progressIndicator.setProgressBar(message, id); - } - } - - /** - * Retrieve meta-data for all the structure(s) for a given sequence(s) in a - * selection group - */ - public void fetchStructuresMetaData() - { - long startTime = System.currentTimeMillis(); - pdbRestCleint = PDBFTSRestClient.getInstance(); - Collection wantedFields = pdbDocFieldPrefs - .getStructureSummaryFields(); - - discoveredStructuresSet = new LinkedHashSet(); - HashSet errors = new HashSet(); - for (SequenceI seq : selectedSequences) - { - FTSRestRequest pdbRequest = new FTSRestRequest(); - pdbRequest.setAllowEmptySeq(false); - pdbRequest.setResponseSize(500); - pdbRequest.setFieldToSearchBy("("); - pdbRequest.setWantedFields(wantedFields); - pdbRequest.setSearchTerm(buildQuery(seq) + ")"); - pdbRequest.setAssociatedSequence(seq); - FTSRestResponse resultList; - try - { - resultList = pdbRestCleint.executeRequest(pdbRequest); - } catch (Exception e) - { - e.printStackTrace(); - errors.add(e.getMessage()); - continue; - } - lastPdbRequest = pdbRequest; - if (resultList.getSearchSummary() != null - && !resultList.getSearchSummary().isEmpty()) - { - discoveredStructuresSet.addAll(resultList.getSearchSummary()); - } - } - - int noOfStructuresFound = 0; - String totalTime = (System.currentTimeMillis() - startTime) - + " milli secs"; - if (discoveredStructuresSet != null - && !discoveredStructuresSet.isEmpty()) - { - getResultTable().setModel( - FTSRestResponse.getTableModel(lastPdbRequest, - discoveredStructuresSet)); - structuresDiscovered = true; - noOfStructuresFound = discoveredStructuresSet.size(); - mainFrame.setTitle(MessageManager.formatMessage( - "label.structure_chooser_no_of_structures", - noOfStructuresFound, totalTime)); - } - else - { - mainFrame.setTitle(MessageManager - .getString("label.structure_chooser_manual_association")); - if (errors.size() > 0) - { - StringBuilder errorMsg = new StringBuilder(); - for (String error : errors) - { - errorMsg.append(error).append("\n"); - } - JOptionPane.showMessageDialog(this, errorMsg.toString(), - MessageManager.getString("label.pdb_web-service_error"), - JOptionPane.ERROR_MESSAGE); - } - } - } - - public void loadLocalCachedPDBEntries() - { - ArrayList entries = new ArrayList(); - for (SequenceI seq : selectedSequences) - { - if (seq.getDatasetSequence() != null - && seq.getDatasetSequence().getAllPDBEntries() != null) - { - for (PDBEntry pdbEntry : seq.getDatasetSequence() - .getAllPDBEntries()) - { - if (pdbEntry.getFile() != null) - { - entries.add(new CachedPDB(seq, pdbEntry)); - } - } - } - } - - PDBEntryTableModel tableModelx = new PDBEntryTableModel(entries); - tbl_local_pdb.setModel(tableModelx); - } - - /** - * Builds a query string for a given sequences using its DBRef entries - * - * @param seq - * the sequences to build a query for - * @return the built query string - */ - - public static String buildQuery(SequenceI seq) - { - boolean isPDBRefsFound = false; - boolean isUniProtRefsFound = false; - StringBuilder queryBuilder = new StringBuilder(); - HashSet seqRefs = new LinkedHashSet(); - - if (seq.getAllPDBEntries() != null) - { - for (PDBEntry entry : seq.getAllPDBEntries()) - { - if (isValidSeqName(entry.getId())) - { - queryBuilder.append("pdb_id") - .append(":") -.append(entry.getId().toLowerCase()) - .append(" OR "); - isPDBRefsFound = true; - // seqRefs.add(entry.getId()); - } - } - } - - if (seq.getDBRefs() != null && seq.getDBRefs().length != 0) - { - for (DBRefEntry dbRef : seq.getDBRefs()) - { - if (isValidSeqName(getDBRefId(dbRef))) - { - if (dbRef.getSource().equalsIgnoreCase(DBRefSource.UNIPROT)) - { - queryBuilder -.append("uniprot_accession").append(":") - .append(getDBRefId(dbRef)) - .append(" OR "); - queryBuilder -.append("uniprot_id") - .append(":") - .append(getDBRefId(dbRef)).append(" OR "); - isUniProtRefsFound = true; - } - else if (dbRef.getSource().equalsIgnoreCase(DBRefSource.PDB)) - { - - queryBuilder.append("pdb_id") - .append(":").append(getDBRefId(dbRef).toLowerCase()) - .append(" OR "); - isPDBRefsFound = true; - } - else - { - seqRefs.add(getDBRefId(dbRef)); - } - } - } - } - - if (!isPDBRefsFound && !isUniProtRefsFound) - { - String seqName = seq.getName(); - seqName = sanitizeSeqName(seqName); - String[] names = seqName.toLowerCase().split("\\|"); - for (String name : names) - { - // System.out.println("Found name : " + name); - name.trim(); - if (isValidSeqName(name)) - { - seqRefs.add(name); - } - } - - for (String seqRef : seqRefs) - { - queryBuilder.append("text:").append(seqRef).append(" OR "); - } - } - - int endIndex = queryBuilder.lastIndexOf(" OR "); - if (queryBuilder.toString().length() < 6) - { - return null; - } - String query = queryBuilder.toString().substring(0, endIndex); - return query; - } - - /** - * Remove the following special characters from input string +, -, &, !, (, ), - * {, }, [, ], ^, ", ~, *, ?, :, \ - * - * @param seqName - * @return - */ - static String sanitizeSeqName(String seqName) - { - Objects.requireNonNull(seqName); - return seqName.replaceAll("\\[\\d*\\]", "") - .replaceAll("[^\\dA-Za-z|_]", "").replaceAll("\\s+", "+"); - } - - - /** - * Ensures sequence ref names are not less than 3 characters and does not - * contain a database name - * - * @param seqName - * @return - */ - public static boolean isValidSeqName(String seqName) - { - // System.out.println("seqName : " + seqName); - String ignoreList = "pdb,uniprot,swiss-prot"; - if (seqName.length() < 3) - { - return false; - } - if (seqName.contains(":")) - { - return false; - } - seqName = seqName.toLowerCase(); - for (String ignoredEntry : ignoreList.split(",")) - { - if (seqName.contains(ignoredEntry)) - { - return false; - } - } - return true; - } - - public static String getDBRefId(DBRefEntry dbRef) - { - String ref = dbRef.getAccessionId().replaceAll("GO:", ""); - return ref; - } - - /** - * Filters a given list of discovered structures based on supplied argument - * - * @param fieldToFilterBy - * the field to filter by - */ - public void filterResultSet(final String fieldToFilterBy) - { - Thread filterThread = new Thread(new Runnable() - { - @Override - public void run() - { - long startTime = System.currentTimeMillis(); - pdbRestCleint = PDBFTSRestClient.getInstance(); - lbl_loading.setVisible(true); - Collection wantedFields = pdbDocFieldPrefs - .getStructureSummaryFields(); - Collection filteredResponse = new HashSet(); - HashSet errors = new HashSet(); - - for (SequenceI seq : selectedSequences) - { - FTSRestRequest pdbRequest = new FTSRestRequest(); - if (fieldToFilterBy.equalsIgnoreCase("uniprot_coverage")) - { - pdbRequest.setAllowEmptySeq(false); - pdbRequest.setResponseSize(1); - pdbRequest.setFieldToSearchBy("("); - pdbRequest.setSearchTerm(buildQuery(seq) + ")"); - pdbRequest.setWantedFields(wantedFields); - pdbRequest.setAssociatedSequence(seq); - pdbRequest.setFacet(true); - pdbRequest.setFacetPivot(fieldToFilterBy + ",entry_entity"); - pdbRequest.setFacetPivotMinCount(1); - } - else - { - pdbRequest.setAllowEmptySeq(false); - pdbRequest.setResponseSize(1); - pdbRequest.setFieldToSearchBy("("); - pdbRequest.setFieldToSortBy(fieldToFilterBy, - !chk_invertFilter.isSelected()); - pdbRequest.setSearchTerm(buildQuery(seq) + ")"); - pdbRequest.setWantedFields(wantedFields); - pdbRequest.setAssociatedSequence(seq); - } - FTSRestResponse resultList; - try - { - resultList = pdbRestCleint.executeRequest(pdbRequest); - } catch (Exception e) - { - e.printStackTrace(); - errors.add(e.getMessage()); - continue; - } - lastPdbRequest = pdbRequest; - if (resultList.getSearchSummary() != null - && !resultList.getSearchSummary().isEmpty()) - { - filteredResponse.addAll(resultList.getSearchSummary()); - } - } - - String totalTime = (System.currentTimeMillis() - startTime) - + " milli secs"; - if (!filteredResponse.isEmpty()) - { - final int filterResponseCount = filteredResponse.size(); - Collection reorderedStructuresSet = new LinkedHashSet(); - reorderedStructuresSet.addAll(filteredResponse); - reorderedStructuresSet.addAll(discoveredStructuresSet); - getResultTable().setModel( - FTSRestResponse.getTableModel( - lastPdbRequest, reorderedStructuresSet)); - - FTSRestResponse.configureTableColumn(getResultTable(), - wantedFields); - getResultTable().getColumn("Ref Sequence").setPreferredWidth(120); - getResultTable().getColumn("Ref Sequence").setMinWidth(100); - getResultTable().getColumn("Ref Sequence").setMaxWidth(200); - // Update table selection model here - getResultTable().addRowSelectionInterval(0, - filterResponseCount - 1); - mainFrame.setTitle(MessageManager.formatMessage( - "label.structure_chooser_filter_time", totalTime)); - } - else - { - mainFrame.setTitle(MessageManager.formatMessage( - "label.structure_chooser_filter_time", totalTime)); - if (errors.size() > 0) - { - StringBuilder errorMsg = new StringBuilder(); - for (String error : errors) - { - errorMsg.append(error).append("\n"); - } - JOptionPane.showMessageDialog( - null, - errorMsg.toString(), - MessageManager.getString("label.pdb_web-service_error"), - JOptionPane.ERROR_MESSAGE); - } - } - - lbl_loading.setVisible(false); - - validateSelections(); - } - }); - filterThread.start(); - } - - /** - * Handles action event for btn_pdbFromFile - */ - @Override - public void pdbFromFile_actionPerformed() - { - jalview.io.JalviewFileChooser chooser = new jalview.io.JalviewFileChooser( - jalview.bin.Cache.getProperty("LAST_DIRECTORY")); - chooser.setFileView(new jalview.io.JalviewFileView()); - chooser.setDialogTitle(MessageManager.formatMessage( - "label.select_pdb_file_for", - selectedSequence.getDisplayId(false))); - chooser.setToolTipText(MessageManager.formatMessage( - "label.load_pdb_file_associate_with_sequence", - selectedSequence.getDisplayId(false))); - - int value = chooser.showOpenDialog(null); - if (value == jalview.io.JalviewFileChooser.APPROVE_OPTION) - { - selectedPdbFileName = chooser.getSelectedFile().getPath(); - jalview.bin.Cache.setProperty("LAST_DIRECTORY", selectedPdbFileName); - validateSelections(); - } - } - - /** - * Populates the filter combo-box options dynamically depending on discovered - * structures - */ - @Override - protected void populateFilterComboBox() - { - if (isStructuresDiscovered()) - { - cmb_filterOption.addItem(new FilterOption("Best Quality", - "overall_quality", VIEWS_FILTER)); - cmb_filterOption.addItem(new FilterOption("Best Resolution", - "resolution", VIEWS_FILTER)); - cmb_filterOption.addItem(new FilterOption("Most Protein Chain", - "number_of_protein_chains", VIEWS_FILTER)); - cmb_filterOption.addItem(new FilterOption("Most Bound Molecules", - "number_of_bound_molecules", VIEWS_FILTER)); - cmb_filterOption.addItem(new FilterOption("Most Polymer Residues", - "number_of_polymer_residues", VIEWS_FILTER)); - } - cmb_filterOption.addItem(new FilterOption("Enter PDB Id", "-", - VIEWS_ENTER_ID)); - cmb_filterOption.addItem(new FilterOption("From File", "-", - VIEWS_FROM_FILE)); - cmb_filterOption.addItem(new FilterOption("Cached PDB Entries", "-", - VIEWS_LOCAL_PDB)); - } - - /** - * Updates the displayed view based on the selected filter option - */ - @Override - protected void updateCurrentView() - { - FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption - .getSelectedItem()); - layout_switchableViews.show(pnl_switchableViews, - selectedFilterOpt.getView()); - String filterTitle = mainFrame.getTitle(); - mainFrame.setTitle(frameTitle); - chk_invertFilter.setVisible(false); - if (selectedFilterOpt.getView() == VIEWS_FILTER) - { - mainFrame.setTitle(filterTitle); - chk_invertFilter.setVisible(true); - filterResultSet(selectedFilterOpt.getValue()); - } - else if (selectedFilterOpt.getView() == VIEWS_ENTER_ID - || selectedFilterOpt.getView() == VIEWS_FROM_FILE) - { - mainFrame.setTitle(MessageManager - .getString("label.structure_chooser_manual_association")); - idInputAssSeqPanel.loadCmbAssSeq(); - fileChooserAssSeqPanel.loadCmbAssSeq(); - } - validateSelections(); - } - - /** - * Validates user selection and activates the view button if all parameters - * are correct - */ - @Override - public void validateSelections() - { - FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption - .getSelectedItem()); - btn_view.setEnabled(false); - String currentView = selectedFilterOpt.getView(); - if (currentView == VIEWS_FILTER) - { - if (getResultTable().getSelectedRows().length > 0) - { - btn_view.setEnabled(true); - } - } - else if (currentView == VIEWS_LOCAL_PDB) - { - if (tbl_local_pdb.getSelectedRows().length > 0) - { - btn_view.setEnabled(true); - } - } - else if (currentView == VIEWS_ENTER_ID) - { - validateAssociationEnterPdb(); - } - else if (currentView == VIEWS_FROM_FILE) - { - validateAssociationFromFile(); - } - } - - /** - * Validates inputs from the Manual PDB entry panel - */ - public void validateAssociationEnterPdb() - { - AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) idInputAssSeqPanel - .getCmb_assSeq().getSelectedItem(); - lbl_pdbManualFetchStatus.setIcon(errorImage); - lbl_pdbManualFetchStatus.setToolTipText(""); - if (txt_search.getText().length() > 0) - { - lbl_pdbManualFetchStatus - .setToolTipText(JvSwingUtils.wrapTooltip(true, MessageManager - .formatMessage("info.no_pdb_entry_found_for", - txt_search.getText()))); - } - - if (errorWarning.length() > 0) - { - lbl_pdbManualFetchStatus.setIcon(warningImage); - lbl_pdbManualFetchStatus.setToolTipText(JvSwingUtils.wrapTooltip( - true, errorWarning.toString())); - } - - if (selectedSequences.length == 1 - || !assSeqOpt.getName().equalsIgnoreCase( - "-Select Associated Seq-")) - { - txt_search.setEnabled(true); - if (isValidPBDEntry) - { - btn_view.setEnabled(true); - lbl_pdbManualFetchStatus.setToolTipText(""); - lbl_pdbManualFetchStatus.setIcon(goodImage); - } - } - else - { - txt_search.setEnabled(false); - lbl_pdbManualFetchStatus.setIcon(errorImage); - } - } - - /** - * Validates inputs for the manual PDB file selection options - */ - public void validateAssociationFromFile() - { - AssociateSeqOptions assSeqOpt = (AssociateSeqOptions) fileChooserAssSeqPanel - .getCmb_assSeq().getSelectedItem(); - lbl_fromFileStatus.setIcon(errorImage); - if (selectedSequences.length == 1 - || (assSeqOpt != null && !assSeqOpt.getName().equalsIgnoreCase( - "-Select Associated Seq-"))) - { - btn_pdbFromFile.setEnabled(true); - if (selectedPdbFileName != null && selectedPdbFileName.length() > 0) - { - btn_view.setEnabled(true); - lbl_fromFileStatus.setIcon(goodImage); - } - } - else - { - btn_pdbFromFile.setEnabled(false); - lbl_fromFileStatus.setIcon(errorImage); - } - } - - @Override - public void cmbAssSeqStateChanged() - { - validateSelections(); - } - - /** - * Handles the state change event for the 'filter' combo-box and 'invert' - * check-box - */ - @Override - protected void stateChanged(ItemEvent e) - { - if (e.getSource() instanceof JCheckBox) - { - updateCurrentView(); - } - else - { - if (e.getStateChange() == ItemEvent.SELECTED) - { - updateCurrentView(); - } - } - - } - - /** - * Handles action event for btn_ok - */ - @Override - public void ok_ActionPerformed() - { - final StructureSelectionManager ssm = ap.getStructureSelectionManager(); - new Thread(new Runnable() - { - @Override - public void run() - { - FilterOption selectedFilterOpt = ((FilterOption) cmb_filterOption - .getSelectedItem()); - String currentView = selectedFilterOpt.getView(); - if (currentView == VIEWS_FILTER) - { - int pdbIdColIndex = getResultTable().getColumn("PDB Id") - .getModelIndex(); - int refSeqColIndex = getResultTable().getColumn("Ref Sequence") - .getModelIndex(); - int[] selectedRows = getResultTable().getSelectedRows(); - PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length]; - int count = 0; - ArrayList selectedSeqsToView = new ArrayList(); - for (int row : selectedRows) - { - String pdbIdStr = getResultTable().getValueAt(row, - pdbIdColIndex) - .toString(); - SequenceI selectedSeq = (SequenceI) getResultTable() - .getValueAt(row, - refSeqColIndex); - selectedSeqsToView.add(selectedSeq); - PDBEntry pdbEntry = selectedSeq.getPDBEntry(pdbIdStr); - if (pdbEntry == null) - { - pdbEntry = getFindEntry(pdbIdStr, - selectedSeq.getAllPDBEntries()); - } - if (pdbEntry == null) - { - pdbEntry = new PDBEntry(); - pdbEntry.setId(pdbIdStr); - pdbEntry.setType(PDBEntry.Type.PDB); - selectedSeq.getDatasetSequence().addPDBId(pdbEntry); - } - pdbEntriesToView[count++] = pdbEntry; - } - SequenceI[] selectedSeqs = selectedSeqsToView - .toArray(new SequenceI[selectedSeqsToView.size()]); - launchStructureViewer(ssm, pdbEntriesToView, ap, - selectedSeqs); - } - else if (currentView == VIEWS_LOCAL_PDB) - { - int[] selectedRows = tbl_local_pdb.getSelectedRows(); - PDBEntry[] pdbEntriesToView = new PDBEntry[selectedRows.length]; - int count = 0; - int pdbIdColIndex = tbl_local_pdb.getColumn("PDB Id") - .getModelIndex(); - int refSeqColIndex = tbl_local_pdb.getColumn("Ref Sequence") - .getModelIndex(); - ArrayList selectedSeqsToView = new ArrayList(); - for (int row : selectedRows) - { - PDBEntry pdbEntry = (PDBEntry) tbl_local_pdb.getValueAt(row, - pdbIdColIndex); - pdbEntriesToView[count++] = pdbEntry; - SequenceI selectedSeq = (SequenceI) tbl_local_pdb.getValueAt(row, - refSeqColIndex); - selectedSeqsToView.add(selectedSeq); - } - SequenceI[] selectedSeqs = selectedSeqsToView - .toArray(new SequenceI[selectedSeqsToView.size()]); - launchStructureViewer(ssm, pdbEntriesToView, ap, - selectedSeqs); - } - else if (currentView == VIEWS_ENTER_ID) - { - SequenceI userSelectedSeq = ((AssociateSeqOptions) idInputAssSeqPanel - .getCmb_assSeq().getSelectedItem()).getSequence(); - if (userSelectedSeq != null) - { - selectedSequence = userSelectedSeq; - } - - String pdbIdStr = txt_search.getText(); - PDBEntry pdbEntry = selectedSequence.getPDBEntry(pdbIdStr); - if (pdbEntry == null) - { - pdbEntry = new PDBEntry(); - if (pdbIdStr.split(":").length > 1) - { - pdbEntry.setChainCode(pdbIdStr.split(":")[1]); - } - pdbEntry.setId(pdbIdStr); - pdbEntry.setType(PDBEntry.Type.PDB); - selectedSequence.getDatasetSequence().addPDBId(pdbEntry); - } - - PDBEntry[] pdbEntriesToView = new PDBEntry[] { pdbEntry }; - launchStructureViewer(ssm, pdbEntriesToView, ap, - new SequenceI[] { selectedSequence }); - } - else if (currentView == VIEWS_FROM_FILE) - { - SequenceI userSelectedSeq = ((AssociateSeqOptions) fileChooserAssSeqPanel - .getCmb_assSeq().getSelectedItem()).getSequence(); - if (userSelectedSeq != null) - { - selectedSequence = userSelectedSeq; - } - PDBEntry fileEntry = new AssociatePdbFileWithSeq() - .associatePdbWithSeq(selectedPdbFileName, - jalview.io.AppletFormatAdapter.FILE, - selectedSequence, true, Desktop.instance); - - launchStructureViewer(ssm, - new PDBEntry[] { fileEntry }, ap, - new SequenceI[] { selectedSequence }); - } - mainFrame.dispose(); - } - }).start(); - } - - private PDBEntry getFindEntry(String id, Vector pdbEntries) - { - Objects.requireNonNull(id); - Objects.requireNonNull(pdbEntries); - PDBEntry foundEntry = null; - for (PDBEntry entry : pdbEntries) - { - if (entry.getId().equalsIgnoreCase(id)) - { - return entry; - } - } - return foundEntry; - } - - private void launchStructureViewer(StructureSelectionManager ssm, - final PDBEntry[] pdbEntriesToView, - final AlignmentPanel alignPanel, SequenceI[] sequences) - { - long progressId = sequences.hashCode(); - setProgressBar(MessageManager - .getString("status.launching_3d_structure_viewer"), progressId); - final StructureViewer sViewer = new StructureViewer(ssm); - setProgressBar(null, progressId); - - if (SiftsSettings.isMapWithSifts()) - { - // TODO: prompt user if there are lots of sequences without dbrefs. - // It can take a long time if we need to fetch all dbrefs for all - // sequences! - ArrayList seqsWithoutSourceDBRef = new ArrayList(); - for (SequenceI seq : sequences) - { - if (seq.getSourceDBRef() == null && seq.getDBRefs() == null) - { - seqsWithoutSourceDBRef.add(seq); - continue; - } - } - if (!seqsWithoutSourceDBRef.isEmpty()) - { - int y = seqsWithoutSourceDBRef.size(); - setProgressBar(MessageManager.formatMessage( - "status.fetching_dbrefs_for_sequences_without_valid_refs", - y, - progressId); - SequenceI[] seqWithoutSrcDBRef = new SequenceI[y]; - int x = 0; - for (SequenceI fSeq : seqsWithoutSourceDBRef) - { - seqWithoutSrcDBRef[x++] = fSeq; - } - new DBRefFetcher(seqWithoutSrcDBRef).fetchDBRefs(true); - setProgressBar("Fetch complete.", progressId); // todo i18n - } - } - if (pdbEntriesToView.length > 1) - { - ArrayList seqsMap = new ArrayList(); - for (SequenceI seq : sequences) - { - seqsMap.add(new SequenceI[] { seq }); - } - SequenceI[][] collatedSeqs = seqsMap.toArray(new SequenceI[0][0]); -<<<<<<< Updated upstream - ssm.setProgressBar(null); - ssm.setProgressBar(MessageManager - .getString("status.fetching_3d_structures_for_selected_entries")); -======= - setProgressBar("Fetching structure data", progressId); ->>>>>>> Stashed changes - sViewer.viewStructures(pdbEntriesToView, collatedSeqs, alignPanel); - } - else - { -<<<<<<< Updated upstream - ssm.setProgressBar(null); - ssm.setProgressBar(MessageManager.formatMessage( - "status.fetching_3d_structures_for", - pdbEntriesToView[0].getId())); -======= - setProgressBar( - "Fetching structure for " + pdbEntriesToView[0].getId(), - progressId); ->>>>>>> Stashed changes - sViewer.viewStructures(pdbEntriesToView[0], sequences, alignPanel); - } - setProgressBar(null, progressId); - } - - /** - * Populates the combo-box used in associating manually fetched structures to - * a unique sequence when more than one sequence selection is made. - */ - @Override - public void populateCmbAssociateSeqOptions( - JComboBox cmb_assSeq, JLabel lbl_associateSeq) - { - cmb_assSeq.removeAllItems(); - cmb_assSeq.addItem(new AssociateSeqOptions("-Select Associated Seq-", - null)); - lbl_associateSeq.setVisible(false); - if (selectedSequences.length > 1) - { - for (SequenceI seq : selectedSequences) - { - cmb_assSeq.addItem(new AssociateSeqOptions(seq)); - } - } - else - { - String seqName = selectedSequence.getDisplayId(false); - seqName = seqName.length() <= 40 ? seqName : seqName.substring(0, 39); - lbl_associateSeq.setText(seqName); - lbl_associateSeq.setVisible(true); - cmb_assSeq.setVisible(false); - } - } - - public boolean isStructuresDiscovered() - { - return structuresDiscovered; - } - - public void setStructuresDiscovered(boolean structuresDiscovered) - { - this.structuresDiscovered = structuresDiscovered; - } - - public Collection getDiscoveredStructuresSet() - { - return discoveredStructuresSet; - } - - @Override - protected void txt_search_ActionPerformed() - { - new Thread() - { - @Override - public void run() - { - errorWarning.setLength(0); - isValidPBDEntry = false; - if (txt_search.getText().length() > 0) - { - String searchTerm = txt_search.getText().toLowerCase(); - searchTerm = searchTerm.split(":")[0]; - // System.out.println(">>>>> search term : " + searchTerm); - List wantedFields = new ArrayList(); - FTSRestRequest pdbRequest = new FTSRestRequest(); - pdbRequest.setAllowEmptySeq(false); - pdbRequest.setResponseSize(1); - pdbRequest.setFieldToSearchBy("(pdb_id:"); - pdbRequest.setWantedFields(wantedFields); - pdbRequest -.setSearchTerm(searchTerm + ")"); - pdbRequest.setAssociatedSequence(selectedSequence); - pdbRestCleint = PDBFTSRestClient.getInstance(); - wantedFields.add(pdbRestCleint.getPrimaryKeyColumn()); - FTSRestResponse resultList; - try - { - resultList = pdbRestCleint.executeRequest(pdbRequest); - } catch (Exception e) - { - errorWarning.append(e.getMessage()); - return; - } finally - { - validateSelections(); - } - if (resultList.getSearchSummary() != null - && resultList.getSearchSummary().size() > 0) - { - isValidPBDEntry = true; - } - } - validateSelections(); - } - }.start(); - } - - @Override - public void tabRefresh() - { - if (selectedSequences != null) - { - Thread refreshThread = new Thread(new Runnable() - { - @Override - public void run() - { - fetchStructuresMetaData(); - filterResultSet(((FilterOption) cmb_filterOption - .getSelectedItem()).getValue()); - } - }); - refreshThread.start(); - } - } - - public class PDBEntryTableModel extends AbstractTableModel - { - String[] columns = { "Ref Sequence", "PDB Id", "Chain", "Type", "File" }; - - private List pdbEntries; - - public PDBEntryTableModel(List pdbEntries) - { - this.pdbEntries = new ArrayList(pdbEntries); - } - - @Override - public String getColumnName(int columnIndex) - { - return columns[columnIndex]; - } - - @Override - public int getRowCount() - { - return pdbEntries.size(); - } - - @Override - public int getColumnCount() - { - return columns.length; - } - - @Override - public boolean isCellEditable(int row, int column) - { - return false; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) - { - Object value = "??"; - CachedPDB entry = pdbEntries.get(rowIndex); - switch (columnIndex) - { - case 0: - value = entry.getSequence(); - break; - case 1: - value = entry.getPdbEntry(); - break; - case 2: - value = entry.getPdbEntry().getChainCode() == null ? "_" : entry - .getPdbEntry().getChainCode(); - break; - case 3: - value = entry.getPdbEntry().getType(); - break; - case 4: - value = entry.getPdbEntry().getFile(); - break; - } - return value; - } - - @Override - public Class getColumnClass(int columnIndex) - { - return columnIndex == 0 ? SequenceI.class : PDBEntry.class; - } - - public CachedPDB getPDBEntryAt(int row) - { - return pdbEntries.get(row); - } - - } - - private class CachedPDB - { - private SequenceI sequence; - - private PDBEntry pdbEntry; - - public CachedPDB(SequenceI sequence, PDBEntry pdbEntry) - { - this.sequence = sequence; - this.pdbEntry = pdbEntry; - } - - public SequenceI getSequence() - { - return sequence; - } - - public PDBEntry getPdbEntry() - { - return pdbEntry; - } - - } - - private IProgressIndicator progressBar; - - @Override - public void setProgressBar(String message, long id) - { - progressBar.setProgressBar(message, id); - } - - @Override - public void registerHandler(long id, IProgressIndicatorHandler handler) - { - progressBar.registerHandler(id, handler); - } - - @Override - public boolean operationInProgress() - { - return progressBar.operationInProgress(); - } -} diff --git a/src/jalview/gui/TreeCanvas.java~ b/src/jalview/gui/TreeCanvas.java~ deleted file mode 100755 index 90c74be..0000000 --- a/src/jalview/gui/TreeCanvas.java~ +++ /dev/null @@ -1,1080 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.gui; - -import jalview.analysis.Conservation; -import jalview.analysis.NJTree; -import jalview.api.AlignViewportI; -import jalview.datamodel.Sequence; -import jalview.datamodel.SequenceGroup; -import jalview.datamodel.SequenceI; -import jalview.datamodel.SequenceNode; -import jalview.schemes.ColourSchemeI; -import jalview.schemes.ColourSchemeProperty; -import jalview.schemes.ResidueProperties; -import jalview.schemes.UserColourScheme; -import jalview.structure.SelectionSource; -import jalview.util.Format; -import jalview.util.MappingUtils; -import jalview.util.MessageManager; - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.print.PageFormat; -import java.awt.print.Printable; -import java.awt.print.PrinterException; -import java.awt.print.PrinterJob; -import java.util.Enumeration; -import java.util.Hashtable; -import java.util.Vector; - -import javax.swing.JColorChooser; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; -import javax.swing.ToolTipManager; - -/** - * DOCUMENT ME! - * - * @author $author$ - * @version $Revision$ - */ -public class TreeCanvas extends JPanel implements MouseListener, Runnable, - Printable, MouseMotionListener, SelectionSource -{ - /** DOCUMENT ME!! */ - public static final String PLACEHOLDER = " * "; - - NJTree tree; - - JScrollPane scrollPane; - - TreePanel tp; - - AlignViewport av; - - AlignmentPanel ap; - - Font font; - - FontMetrics fm; - - boolean fitToWindow = true; - - boolean showDistances = false; - - boolean showBootstrap = false; - - boolean markPlaceholders = false; - - int offx = 20; - - int offy; - - float threshold; - - String longestName; - - int labelLength = -1; - - Hashtable nameHash = new Hashtable(); - - Hashtable nodeHash = new Hashtable(); - - SequenceNode highlightNode; - - boolean applyToAllViews = false; - - /** - * Creates a new TreeCanvas object. - * - * @param av - * DOCUMENT ME! - * @param tree - * DOCUMENT ME! - * @param scroller - * DOCUMENT ME! - * @param label - * DOCUMENT ME! - */ - public TreeCanvas(TreePanel tp, AlignmentPanel ap, JScrollPane scroller) - { - this.tp = tp; - this.av = ap.av; - this.ap = ap; - font = av.getFont(); - scrollPane = scroller; - addMouseListener(this); - addMouseMotionListener(this); - ToolTipManager.sharedInstance().registerComponent(this); - } - - /** - * DOCUMENT ME! - * - * @param sequence - * DOCUMENT ME! - */ - public void treeSelectionChanged(SequenceI sequence) - { - AlignmentPanel[] aps = getAssociatedPanels(); - - for (int a = 0; a < aps.length; a++) - { - SequenceGroup selected = aps[a].av.getSelectionGroup(); - - if (selected == null) - { - selected = new SequenceGroup(); - aps[a].av.setSelectionGroup(selected); - } - - selected.setEndRes(aps[a].av.getAlignment().getWidth() - 1); - selected.addOrRemove(sequence, true); - } - } - - /** - * DOCUMENT ME! - * - * @param tree - * DOCUMENT ME! - */ - public void setTree(NJTree tree) - { - this.tree = tree; - tree.findHeight(tree.getTopNode()); - - // Now have to calculate longest name based on the leaves - Vector leaves = tree.findLeaves(tree.getTopNode(), new Vector()); - boolean has_placeholders = false; - longestName = ""; - - for (int i = 0; i < leaves.size(); i++) - { - SequenceNode lf = (SequenceNode) leaves.elementAt(i); - - if (lf.isPlaceholder()) - { - has_placeholders = true; - } - - if (longestName.length() < ((Sequence) lf.element()).getName() - .length()) - { - longestName = TreeCanvas.PLACEHOLDER - + ((Sequence) lf.element()).getName(); - } - } - - setMarkPlaceholders(has_placeholders); - } - - /** - * DOCUMENT ME! - * - * @param g - * DOCUMENT ME! - * @param node - * DOCUMENT ME! - * @param chunk - * DOCUMENT ME! - * @param scale - * DOCUMENT ME! - * @param width - * DOCUMENT ME! - * @param offx - * DOCUMENT ME! - * @param offy - * DOCUMENT ME! - */ - public void drawNode(Graphics g, SequenceNode node, float chunk, - float scale, int width, int offx, int offy) - { - if (node == null) - { - return; - } - - if ((node.left() == null) && (node.right() == null)) - { - // Drawing leaf node - float height = node.height; - float dist = node.dist; - - int xstart = (int) ((height - dist) * scale) + offx; - int xend = (int) (height * scale) + offx; - - int ypos = (int) (node.ycount * chunk) + offy; - - if (node.element() instanceof SequenceI) - { - SequenceI seq = (SequenceI) node.element(); - - if (av.getSequenceColour(seq) == Color.white) - { - g.setColor(Color.black); - } - else - { - g.setColor(av.getSequenceColour(seq).darker()); - } - } - else - { - g.setColor(Color.black); - } - - // Draw horizontal line - g.drawLine(xstart, ypos, xend, ypos); - - String nodeLabel = ""; - - if (showDistances && (node.dist > 0)) - { - nodeLabel = new Format("%-.2f").form(node.dist); - } - - if (showBootstrap && node.bootstrap > -1) - { - if (showDistances) - { - nodeLabel = nodeLabel + " : "; - } - - nodeLabel = nodeLabel + String.valueOf(node.bootstrap); - } - - if (!nodeLabel.equals("")) - { - g.drawString(nodeLabel, xstart + 2, ypos - 2); - } - - String name = (markPlaceholders && node.isPlaceholder()) ? (PLACEHOLDER + node - .getName()) : node.getName(); - - int charWidth = fm.stringWidth(name) + 3; - int charHeight = font.getSize(); - - Rectangle rect = new Rectangle(xend + 10, ypos - charHeight / 2, - charWidth, charHeight); - - nameHash.put(node.element(), rect); - - // Colour selected leaves differently - SequenceGroup selected = av.getSelectionGroup(); - - if ((selected != null) - && selected.getSequences(null).contains(node.element())) - { - g.setColor(Color.gray); - - g.fillRect(xend + 10, ypos - charHeight / 2, charWidth, charHeight); - g.setColor(Color.white); - } - - g.drawString(name, xend + 10, ypos + fm.getDescent()); - g.setColor(Color.black); - } - else - { - drawNode(g, (SequenceNode) node.left(), chunk, scale, width, offx, - offy); - drawNode(g, (SequenceNode) node.right(), chunk, scale, width, offx, - offy); - - float height = node.height; - float dist = node.dist; - - int xstart = (int) ((height - dist) * scale) + offx; - int xend = (int) (height * scale) + offx; - int ypos = (int) (node.ycount * chunk) + offy; - - g.setColor(node.color.darker()); - - // Draw horizontal line - g.drawLine(xstart, ypos, xend, ypos); - if (node == highlightNode) - { - g.fillRect(xend - 3, ypos - 3, 6, 6); - } - else - { - g.fillRect(xend - 2, ypos - 2, 4, 4); - } - - int ystart = (int) (((SequenceNode) node.left()).ycount * chunk) - + offy; - int yend = (int) (((SequenceNode) node.right()).ycount * chunk) - + offy; - - Rectangle pos = new Rectangle(xend - 2, ypos - 2, 5, 5); - nodeHash.put(node, pos); - - g.drawLine((int) (height * scale) + offx, ystart, - (int) (height * scale) + offx, yend); - - String nodeLabel = ""; - - if (showDistances && (node.dist > 0)) - { - nodeLabel = new Format("%-.2f").form(node.dist); - } - - if (showBootstrap && node.bootstrap > -1) - { - if (showDistances) - { - nodeLabel = nodeLabel + " : "; - } - - nodeLabel = nodeLabel + String.valueOf(node.bootstrap); - } - - if (!nodeLabel.equals("")) - { - g.drawString(nodeLabel, xstart + 2, ypos - 2); - } - } - } - - /** - * DOCUMENT ME! - * - * @param x - * DOCUMENT ME! - * @param y - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - public Object findElement(int x, int y) - { - Enumeration keys = nameHash.keys(); - - while (keys.hasMoreElements()) - { - Object ob = keys.nextElement(); - Rectangle rect = (Rectangle) nameHash.get(ob); - - if ((x >= rect.x) && (x <= (rect.x + rect.width)) && (y >= rect.y) - && (y <= (rect.y + rect.height))) - { - return ob; - } - } - - keys = nodeHash.keys(); - - while (keys.hasMoreElements()) - { - Object ob = keys.nextElement(); - Rectangle rect = (Rectangle) nodeHash.get(ob); - - if ((x >= rect.x) && (x <= (rect.x + rect.width)) && (y >= rect.y) - && (y <= (rect.y + rect.height))) - { - return ob; - } - } - - return null; - } - - /** - * DOCUMENT ME! - * - * @param pickBox - * DOCUMENT ME! - */ - public void pickNodes(Rectangle pickBox) - { - int width = getWidth(); - int height = getHeight(); - - SequenceNode top = tree.getTopNode(); - - float wscale = (float) ((width * .8) - (offx * 2)) - / tree.getMaxHeight(); - - if (top.count == 0) - { - top.count = ((SequenceNode) top.left()).count - + ((SequenceNode) top.right()).count; - } - - float chunk = (float) (height - (offy)) / top.count; - - pickNode(pickBox, top, chunk, wscale, width, offx, offy); - } - - /** - * DOCUMENT ME! - * - * @param pickBox - * DOCUMENT ME! - * @param node - * DOCUMENT ME! - * @param chunk - * DOCUMENT ME! - * @param scale - * DOCUMENT ME! - * @param width - * DOCUMENT ME! - * @param offx - * DOCUMENT ME! - * @param offy - * DOCUMENT ME! - */ - public void pickNode(Rectangle pickBox, SequenceNode node, float chunk, - float scale, int width, int offx, int offy) - { - if (node == null) - { - return; - } - - if ((node.left() == null) && (node.right() == null)) - { - float height = node.height; - float dist = node.dist; - - int xstart = (int) ((height - dist) * scale) + offx; - int xend = (int) (height * scale) + offx; - - int ypos = (int) (node.ycount * chunk) + offy; - - if (pickBox.contains(new Point(xend, ypos))) - { - if (node.element() instanceof SequenceI) - { - SequenceI seq = (SequenceI) node.element(); - SequenceGroup sg = av.getSelectionGroup(); - - if (sg != null) - { - sg.addOrRemove(seq, true); - } - } - } - } - else - { - pickNode(pickBox, (SequenceNode) node.left(), chunk, scale, width, - offx, offy); - pickNode(pickBox, (SequenceNode) node.right(), chunk, scale, width, - offx, offy); - } - } - - /** - * DOCUMENT ME! - * - * @param node - * DOCUMENT ME! - * @param c - * DOCUMENT ME! - */ - public void setColor(SequenceNode node, Color c) - { - if (node == null) - { - return; - } - - if ((node.left() == null) && (node.right() == null)) // TODO: internal node - { - node.color = c; - - if (node.element() instanceof SequenceI) - { - AlignmentPanel[] aps = getAssociatedPanels(); - if (aps != null) - { - for (int a = 0; a < aps.length; a++) - { - final SequenceI seq = (SequenceI) node.element(); - aps[a].av.setSequenceColour(seq, c); - } - } - } - } - else - { - node.color = c; - setColor((SequenceNode) node.left(), c); - setColor((SequenceNode) node.right(), c); - } - } - - /** - * DOCUMENT ME! - */ - void startPrinting() - { - Thread thread = new Thread(this); - thread.start(); - } - - // put printing in a thread to avoid painting problems - @Override - public void run() - { - PrinterJob printJob = PrinterJob.getPrinterJob(); - PageFormat pf = printJob.pageDialog(printJob.defaultPage()); - - printJob.setPrintable(this, pf); - - if (printJob.printDialog()) - { - try - { - printJob.print(); - } catch (Exception PrintException) - { - PrintException.printStackTrace(); - } - } - } - - /** - * DOCUMENT ME! - * - * @param pg - * DOCUMENT ME! - * @param pf - * DOCUMENT ME! - * @param pi - * DOCUMENT ME! - * - * @return DOCUMENT ME! - * - * @throws PrinterException - * DOCUMENT ME! - */ - @Override - public int print(Graphics pg, PageFormat pf, int pi) - throws PrinterException - { - pg.setFont(font); - pg.translate((int) pf.getImageableX(), (int) pf.getImageableY()); - - int pwidth = (int) pf.getImageableWidth(); - int pheight = (int) pf.getImageableHeight(); - - int noPages = getHeight() / pheight; - - if (pi > noPages) - { - return Printable.NO_SUCH_PAGE; - } - - if (pwidth > getWidth()) - { - pwidth = getWidth(); - } - - if (fitToWindow) - { - if (pheight > getHeight()) - { - pheight = getHeight(); - } - - noPages = 0; - } - else - { - FontMetrics fm = pg.getFontMetrics(font); - int height = fm.getHeight() * nameHash.size(); - pg.translate(0, -pi * pheight); - pg.setClip(0, pi * pheight, pwidth, (pi * pheight) + pheight); - - // translate number of pages, - // height is screen size as this is the - // non overlapping text size - pheight = height; - } - - draw(pg, pwidth, pheight); - - return Printable.PAGE_EXISTS; - } - - /** - * DOCUMENT ME! - * - * @param g - * DOCUMENT ME! - */ - @Override - public void paintComponent(Graphics g) - { - super.paintComponent(g); - g.setFont(font); - - if (tree == null) - { - g.drawString(MessageManager.getString("label.calculating_tree") - + "....", 20, getHeight() / 2); - } - else - { - fm = g.getFontMetrics(font); - - if (nameHash.size() == 0) - { - repaint(); - } - - if (fitToWindow - || (!fitToWindow && (scrollPane.getHeight() > ((fm - .getHeight() * nameHash.size()) + offy)))) - { - draw(g, scrollPane.getWidth(), scrollPane.getHeight()); - setPreferredSize(null); - } - else - { - setPreferredSize(new Dimension(scrollPane.getWidth(), - fm.getHeight() * nameHash.size())); - draw(g, scrollPane.getWidth(), fm.getHeight() * nameHash.size()); - } - - scrollPane.revalidate(); - } - } - - /** - * DOCUMENT ME! - * - * @param fontSize - * DOCUMENT ME! - */ - @Override - public void setFont(Font font) - { - this.font = font; - repaint(); - } - - /** - * DOCUMENT ME! - * - * @param g1 - * DOCUMENT ME! - * @param width - * DOCUMENT ME! - * @param height - * DOCUMENT ME! - */ - public void draw(Graphics g1, int width, int height) - { - Graphics2D g2 = (Graphics2D) g1; - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g2.setColor(Color.white); - g2.fillRect(0, 0, width, height); - g2.setFont(font); - - if (longestName == null || tree == null) - { - g2.drawString("Calculating tree.", 20, 20); - } - offy = font.getSize() + 10; - - fm = g2.getFontMetrics(font); - - labelLength = fm.stringWidth(longestName) + 20; // 20 allows for scrollbar - - float wscale = (width - labelLength - (offx * 2)) / tree.getMaxHeight(); - - SequenceNode top = tree.getTopNode(); - - if (top.count == 0) - { - top.count = ((SequenceNode) top.left()).count - + ((SequenceNode) top.right()).count; - } - - float chunk = (float) (height - (offy)) / top.count; - - drawNode(g2, tree.getTopNode(), chunk, wscale, width, offx, offy); - - if (threshold != 0) - { - if (av.getCurrentTree() == tree) - { - g2.setColor(Color.red); - } - else - { - g2.setColor(Color.gray); - } - - int x = (int) ((threshold * (getWidth() - labelLength - (2 * offx))) + offx); - - g2.drawLine(x, 0, x, getHeight()); - } - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void mouseReleased(MouseEvent e) - { - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void mouseEntered(MouseEvent e) - { - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void mouseExited(MouseEvent e) - { - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void mouseClicked(MouseEvent evt) - { - if (highlightNode != null) - { - if (SwingUtilities.isRightMouseButton(evt)) - { - Color col = JColorChooser.showDialog(this, - MessageManager.getString("label.select_subtree_colour"), - highlightNode.color); - if (col != null) - { - setColor(highlightNode, col); - } - } - else if (evt.getClickCount() > 1) - { - tree.swapNodes(highlightNode); - tree.reCount(tree.getTopNode()); - tree.findHeight(tree.getTopNode()); - } - else - { - Vector leaves = new Vector(); - tree.findLeaves(highlightNode, leaves); - - for (int i = 0; i < leaves.size(); i++) - { - SequenceI seq = (SequenceI) ((SequenceNode) leaves.elementAt(i)) - .element(); - treeSelectionChanged(seq); - } - av.sendSelection(); - } - - PaintRefresher.Refresh(tp, av.getSequenceSetId()); - repaint(); - } - } - - @Override - public void mouseMoved(MouseEvent evt) - { - av.setCurrentTree(tree); - - Object ob = findElement(evt.getX(), evt.getY()); - - if (ob instanceof SequenceNode) - { - highlightNode = (SequenceNode) ob; - this.setToolTipText("" - + MessageManager.getString("label.highlightnode")); - repaint(); - - } - else - { - if (highlightNode != null) - { - highlightNode = null; - setToolTipText(null); - repaint(); - } - } - } - - @Override - public void mouseDragged(MouseEvent ect) - { - } - - /** - * DOCUMENT ME! - * - * @param e - * DOCUMENT ME! - */ - @Override - public void mousePressed(MouseEvent e) - { - av.setCurrentTree(tree); - - int x = e.getX(); - int y = e.getY(); - - Object ob = findElement(x, y); - - if (ob instanceof SequenceI) - { - treeSelectionChanged((Sequence) ob); - PaintRefresher.Refresh(tp, ap.av.getSequenceSetId()); - repaint(); - av.sendSelection(); - return; - } - else if (!(ob instanceof SequenceNode)) - { - // Find threshold - if (tree.getMaxHeight() != 0) - { - threshold = (float) (x - offx) - / (float) (getWidth() - labelLength - (2 * offx)); - - tree.getGroups().removeAllElements(); - tree.groupNodes(tree.getTopNode(), threshold); - setColor(tree.getTopNode(), Color.black); - - AlignmentPanel[] aps = getAssociatedPanels(); - - // TODO push calls below into a single AlignViewportI method? - // see also AlignViewController.deleteGroups - for (int a = 0; a < aps.length; a++) - { - aps[a].av.setSelectionGroup(null); - aps[a].av.getAlignment().deleteAllGroups(); - aps[a].av.clearSequenceColours(); - if (aps[a].av.getCodingComplement() != null) - { - aps[a].av.getCodingComplement().setSelectionGroup(null); - aps[a].av.getCodingComplement().getAlignment() - .deleteAllGroups(); - aps[a].av.getCodingComplement().clearSequenceColours(); - } - } - colourGroups(); - } - - PaintRefresher.Refresh(tp, ap.av.getSequenceSetId()); - repaint(); - } - - } - - void colourGroups() - { - AlignmentPanel[] aps = getAssociatedPanels(); - for (int i = 0; i < tree.getGroups().size(); i++) - { - Color col = new Color((int) (Math.random() * 255), - (int) (Math.random() * 255), (int) (Math.random() * 255)); - setColor((SequenceNode) tree.getGroups().elementAt(i), col.brighter()); - - Vector l = tree.findLeaves( - (SequenceNode) tree.getGroups().elementAt(i), new Vector()); - - Vector sequences = new Vector(); - - for (int j = 0; j < l.size(); j++) - { - SequenceI s1 = (SequenceI) ((SequenceNode) l.elementAt(j)) - .element(); - - if (!sequences.contains(s1)) - { - sequences.addElement(s1); - } - } - - ColourSchemeI cs = null; - SequenceGroup sg = new SequenceGroup(sequences, null, cs, true, true, - false, 0, av.getAlignment().getWidth() - 1); - - if (av.getGlobalColourScheme() != null) - { - if (av.getGlobalColourScheme() instanceof UserColourScheme) - { - cs = new UserColourScheme( - ((UserColourScheme) av.getGlobalColourScheme()) - .getColours()); - - } - else - { - cs = ColourSchemeProperty.getColour(sg, ColourSchemeProperty - .getColourName(av.getGlobalColourScheme())); - } - // cs is null if shading is an annotationColourGradient - if (cs != null) - { - cs.setThreshold(av.getGlobalColourScheme().getThreshold(), - av.isIgnoreGapsConsensus()); - } - } - sg.cs = cs; - // sg.recalcConservation(); - sg.setName("JTreeGroup:" + sg.hashCode()); - sg.setIdColour(col); - - for (int a = 0; a < aps.length; a++) - { - if (aps[a].av.getGlobalColourScheme() != null - && aps[a].av.getGlobalColourScheme().conservationApplied()) - { - Conservation c = new Conservation("Group", - ResidueProperties.propHash, 3, sg.getSequences(null), - sg.getStartRes(), sg.getEndRes()); - - c.calculate(); - c.verdict(false, aps[a].av.getConsPercGaps()); - sg.cs.setConservation(c); - } - - aps[a].av.getAlignment().addGroup(new SequenceGroup(sg)); - // TODO can we push all of the below into AlignViewportI? - final AlignViewportI codingComplement = aps[a].av - .getCodingComplement(); - if (codingComplement != null) - { - if (codingComplement != null) - { - SequenceGroup mappedGroup = MappingUtils.mapSequenceGroup(sg, - av, codingComplement); - if (mappedGroup.getSequences().size() > 0) - { - codingComplement.getAlignment().addGroup(mappedGroup); - for (SequenceI seq : mappedGroup.getSequences()) - { - codingComplement.setSequenceColour(seq, col.brighter()); - } - } - } - } - } - } - - // notify the panel(s) to redo any group specific stuff. - for (int a = 0; a < aps.length; a++) - { - aps[a].updateAnnotation(); - // TODO: JAL-868 - need to ensure view colour change message is broadcast - // to any Jmols listening in - final AlignViewportI codingComplement = aps[a].av - .getCodingComplement(); - if (codingComplement != null) - { - ((AlignViewport) codingComplement).getAlignPanel() - .updateAnnotation(); - - } - - } - - } - - /** - * DOCUMENT ME! - * - * @param state - * DOCUMENT ME! - */ - public void setShowDistances(boolean state) - { - this.showDistances = state; - repaint(); - } - - /** - * DOCUMENT ME! - * - * @param state - * DOCUMENT ME! - */ - public void setShowBootstrap(boolean state) - { - this.showBootstrap = state; - repaint(); - } - - /** - * DOCUMENT ME! - * - * @param state - * DOCUMENT ME! - */ - public void setMarkPlaceholders(boolean state) - { - this.markPlaceholders = state; - repaint(); - } - - AlignmentPanel[] getAssociatedPanels() - { - if (applyToAllViews) - { - return PaintRefresher.getAssociatedPanels(av.getSequenceSetId()); - } - else - { - return new AlignmentPanel[] { ap }; - } - } -} diff --git a/src/jalview/structure/StructureSelectionManager.java~ b/src/jalview/structure/StructureSelectionManager.java~ deleted file mode 100644 index 5b06097..0000000 --- a/src/jalview/structure/StructureSelectionManager.java~ +++ /dev/null @@ -1,1327 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.structure; - -import jalview.analysis.AlignSeq; -import jalview.api.StructureSelectionManagerProvider; -import jalview.commands.CommandI; -import jalview.commands.EditCommand; -import jalview.commands.OrderCommand; -import jalview.datamodel.AlignedCodonFrame; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.Annotation; -import jalview.datamodel.PDBEntry; -import jalview.datamodel.SearchResults; -import jalview.datamodel.SequenceI; -import jalview.gui.IProgressIndicator; -import jalview.io.AppletFormatAdapter; -import jalview.io.StructureFile; -import jalview.util.MappingUtils; -import jalview.util.MessageManager; -import jalview.ws.sifts.SiftsClient; -import jalview.ws.sifts.SiftsException; -import jalview.ws.sifts.SiftsSettings; - -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.IdentityHashMap; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -import MCview.Atom; -import MCview.PDBChain; -import MCview.PDBfile; - -public class StructureSelectionManager -{ - public final static String NEWLINE = System.lineSeparator(); - - static IdentityHashMap instances; - - private List mappings = new ArrayList(); - - private boolean processSecondaryStructure = false; - - private boolean secStructServices = false; - - private boolean addTempFacAnnot = false; - - private SiftsClient siftsClient = null; - - /* - * Set of any registered mappings between (dataset) sequences. - */ - private List seqmappings = new ArrayList(); - - private List commandListeners = new ArrayList(); - - private List sel_listeners = new ArrayList(); - - /** - * @return true if will try to use external services for processing secondary - * structure - */ - public boolean isSecStructServices() - { - return secStructServices; - } - - /** - * control use of external services for processing secondary structure - * - * @param secStructServices - */ - public void setSecStructServices(boolean secStructServices) - { - this.secStructServices = secStructServices; - } - - /** - * flag controlling addition of any kind of structural annotation - * - * @return true if temperature factor annotation will be added - */ - public boolean isAddTempFacAnnot() - { - return addTempFacAnnot; - } - - /** - * set flag controlling addition of structural annotation - * - * @param addTempFacAnnot - */ - public void setAddTempFacAnnot(boolean addTempFacAnnot) - { - this.addTempFacAnnot = addTempFacAnnot; - } - - /** - * - * @return if true, the structure manager will attempt to add secondary - * structure lines for unannotated sequences - */ - - public boolean isProcessSecondaryStructure() - { - return processSecondaryStructure; - } - - /** - * Control whether structure manager will try to annotate mapped sequences - * with secondary structure from PDB data. - * - * @param enable - */ - public void setProcessSecondaryStructure(boolean enable) - { - processSecondaryStructure = enable; - } - - /** - * debug function - write all mappings to stdout - */ - public void reportMapping() - { - if (mappings.isEmpty()) - { - System.err.println("reportMapping: No PDB/Sequence mappings."); - } - else - { - System.err.println("reportMapping: There are " + mappings.size() - + " mappings."); - int i = 0; - for (StructureMapping sm : mappings) - { - System.err.println("mapping " + i++ + " : " + sm.pdbfile); - } - } - } - - /** - * map between the PDB IDs (or structure identifiers) used by Jalview and the - * absolute filenames for PDB data that corresponds to it - */ - Map pdbIdFileName = new HashMap(); - - Map pdbFileNameId = new HashMap(); - - public void registerPDBFile(String idForFile, String absoluteFile) - { - pdbIdFileName.put(idForFile, absoluteFile); - pdbFileNameId.put(absoluteFile, idForFile); - } - - public String findIdForPDBFile(String idOrFile) - { - String id = pdbFileNameId.get(idOrFile); - return id; - } - - public String findFileForPDBId(String idOrFile) - { - String id = pdbIdFileName.get(idOrFile); - return id; - } - - public boolean isPDBFileRegistered(String idOrFile) - { - return pdbFileNameId.containsKey(idOrFile) - || pdbIdFileName.containsKey(idOrFile); - } - - private static StructureSelectionManager nullProvider = null; - - public static StructureSelectionManager getStructureSelectionManager( - StructureSelectionManagerProvider context) - { - if (context == null) - { - if (nullProvider == null) - { - if (instances != null) - { - throw new Error( - MessageManager - .getString("error.implementation_error_structure_selection_manager_null"), - new NullPointerException(MessageManager - .getString("exception.ssm_context_is_null"))); - } - else - { - nullProvider = new StructureSelectionManager(); - } - return nullProvider; - } - } - if (instances == null) - { - instances = new java.util.IdentityHashMap(); - } - StructureSelectionManager instance = instances.get(context); - if (instance == null) - { - if (nullProvider != null) - { - instance = nullProvider; - } - else - { - instance = new StructureSelectionManager(); - } - instances.put(context, instance); - } - return instance; - } - - /** - * flag controlling whether SeqMappings are relayed from received sequence - * mouse over events to other sequences - */ - boolean relaySeqMappings = true; - - /** - * Enable or disable relay of seqMapping events to other sequences. You might - * want to do this if there are many sequence mappings and the host computer - * is slow - * - * @param relay - */ - public void setRelaySeqMappings(boolean relay) - { - relaySeqMappings = relay; - } - - /** - * get the state of the relay seqMappings flag. - * - * @return true if sequence mouse overs are being relayed to other mapped - * sequences - */ - public boolean isRelaySeqMappingsEnabled() - { - return relaySeqMappings; - } - - Vector listeners = new Vector(); - - /** - * register a listener for alignment sequence mouseover events - * - * @param svl - */ - public void addStructureViewerListener(Object svl) - { - if (!listeners.contains(svl)) - { - listeners.addElement(svl); - } - } - - /** - * Returns the file name for a mapped PDB id (or null if not mapped). - * - * @param pdbid - * @return - */ - public String alreadyMappedToFile(String pdbid) - { - for (StructureMapping sm : mappings) - { - if (sm.getPdbId().equals(pdbid)) - { - return sm.pdbfile; - } - } - return null; - } - - /** - * Import structure data and register a structure mapping for broadcasting - * colouring, mouseovers and selection events (convenience wrapper). - * - * @param sequence - * - one or more sequences to be mapped to pdbFile - * @param targetChains - * - optional chain specification for mapping each sequence to pdb - * (may be nill, individual elements may be nill) - * @param pdbFile - * - structure data resource - * @param protocol - * - how to resolve data from resource - * @return null or the structure data parsed as a pdb file - */ - synchronized public StructureFile setMapping(SequenceI[] sequence, - String[] targetChains, String pdbFile, String protocol, - IProgressIndicator progress) - { - return computeMapping(true, sequence, targetChains, pdbFile, protocol, - progress); - } - - - /** - * create sequence structure mappings between each sequence and the given - * pdbFile (retrieved via the given protocol). - * - * @param forStructureView - * when true, record the mapping for use in mouseOvers - * - * @param sequenceArray - * - one or more sequences to be mapped to pdbFile - * @param targetChainIds - * - optional chain specification for mapping each sequence to pdb - * (may be null, individual elements may be null) - * @param pdbFile - * - structure data resource - * @param protocol - * - how to resolve data from resource - * @return null or the structure data parsed as a pdb file - */ - synchronized public StructureFile setMapping(boolean forStructureView, - SequenceI[] sequenceArray, String[] targetChainIds, - String pdbFile, - String protocol) - { - return computeMapping(forStructureView, sequenceArray, targetChainIds, - pdbFile, protocol, null); - } - - synchronized public StructureFile computeMapping( - boolean forStructureView, SequenceI[] sequenceArray, - String[] targetChainIds, String pdbFile, String protocol, - IProgressIndicator progress) - { - long progressSessionId = System.currentTimeMillis() * 3; - /* - * There will be better ways of doing this in the future, for now we'll use - * the tried and tested MCview pdb mapping - */ - boolean parseSecStr = processSecondaryStructure; - if (isPDBFileRegistered(pdbFile)) - { - for (SequenceI sq : sequenceArray) - { - SequenceI ds = sq; - while (ds.getDatasetSequence() != null) - { - ds = ds.getDatasetSequence(); - } - ; - if (ds.getAnnotation() != null) - { - for (AlignmentAnnotation ala : ds.getAnnotation()) - { - // false if any annotation present from this structure - // JBPNote this fails for jmol/chimera view because the *file* is - // passed, not the structure data ID - - if (PDBfile.isCalcIdForFile(ala, findIdForPDBFile(pdbFile))) - { - parseSecStr = false; - } - } - } - } - } - StructureFile pdb = null; - boolean isMapUsingSIFTs = SiftsSettings.isMapWithSifts(); - try - { - - if (pdbFile != null && isCIFFile(pdbFile)) - { - pdb = new jalview.ext.jmol.JmolParser(addTempFacAnnot, parseSecStr, - secStructServices, pdbFile, protocol); - } - else - { - pdb = new PDBfile(addTempFacAnnot, parseSecStr, secStructServices, - pdbFile, protocol); - } - - if (pdb.getId() != null && pdb.getId().trim().length() > 0 - && AppletFormatAdapter.FILE.equals(protocol)) - { - registerPDBFile(pdb.getId().trim(), pdbFile); - } - } catch (Exception ex) - { - ex.printStackTrace(); - return null; - } - - try - { - if (isMapUsingSIFTs) - { - siftsClient = new SiftsClient(pdb); - } - } catch (SiftsException e) - { - isMapUsingSIFTs = false; - e.printStackTrace(); - } - - String targetChainId; - for (int s = 0; s < sequenceArray.length; s++) - { - boolean infChain = true; - final SequenceI seq = sequenceArray[s]; - if (targetChainIds != null && targetChainIds[s] != null) - { - infChain = false; - targetChainId = targetChainIds[s]; - } - else if (seq.getName().indexOf("|") > -1) - { - targetChainId = seq.getName().substring( - seq.getName().lastIndexOf("|") + 1); - if (targetChainId.length() > 1) - { - if (targetChainId.trim().length() == 0) - { - targetChainId = " "; - } - else - { - // not a valid chain identifier - targetChainId = ""; - } - } - } - else - { - targetChainId = ""; - } - - /* - * Attempt pairwise alignment of the sequence with each chain in the PDB, - * and remember the highest scoring chain - */ - int max = -10; - AlignSeq maxAlignseq = null; - String maxChainId = " "; - PDBChain maxChain = null; - boolean first = true; - for (PDBChain chain : pdb.getChains()) - { - if (targetChainId.length() > 0 && !targetChainId.equals(chain.id) - && !infChain) - { - continue; // don't try to map chains don't match. - } - // TODO: correctly determine sequence type for mixed na/peptide - // structures - final String type = chain.isNa ? AlignSeq.DNA : AlignSeq.PEP; - AlignSeq as = AlignSeq.doGlobalNWAlignment(seq, chain.sequence, - type); - // equivalent to: - // AlignSeq as = new AlignSeq(sequence[s], chain.sequence, type); - // as.calcScoreMatrix(); - // as.traceAlignment(); - - if (first || as.maxscore > max - || (as.maxscore == max && chain.id.equals(targetChainId))) - { - first = false; - maxChain = chain; - max = as.maxscore; - maxAlignseq = as; - maxChainId = chain.id; - } - } - if (maxChain == null) - { - continue; - } - - if (protocol.equals(jalview.io.AppletFormatAdapter.PASTE)) - { - pdbFile = "INLINE" + pdb.getId(); - } - ArrayList seqToStrucMapping = new ArrayList(); - if (isMapUsingSIFTs) - { -<<<<<<< Updated upstream - setProgressBar(null); - setProgressBar(MessageManager - .getString("status.obtaining_mapping_with_sifts")); -======= - if (progress!=null) { - progress.setProgressBar("Obtaining mapping with SIFTS", - progressSessionId); - } ->>>>>>> Stashed changes - jalview.datamodel.Mapping sqmpping = maxAlignseq - .getMappingFromS1(false); - if (targetChainId != null && !targetChainId.trim().isEmpty()) - { - StructureMapping siftsMapping; - try - { - siftsMapping = getStructureMapping(seq, pdbFile, targetChainId, - pdb, maxChain, sqmpping, maxAlignseq); - seqToStrucMapping.add(siftsMapping); - maxChain.makeExactMapping(maxAlignseq, seq); - maxChain.transferRESNUMFeatures(seq, null); - maxChain.transferResidueAnnotation(siftsMapping, sqmpping); - } catch (SiftsException e) - { - // fall back to NW alignment - System.err.println(e.getMessage()); - StructureMapping nwMapping = getNWMappings(seq, pdbFile, - targetChainId, maxChain, pdb, maxAlignseq); - seqToStrucMapping.add(nwMapping); - } - } - else - { - ArrayList foundSiftsMappings = new ArrayList(); - for (PDBChain chain : pdb.getChains()) - { - try - { - StructureMapping siftsMapping = getStructureMapping(seq, - pdbFile, - chain.id, pdb, chain, sqmpping, maxAlignseq); - foundSiftsMappings.add(siftsMapping); - } catch (SiftsException e) - { - System.err.println(e.getMessage()); - } - } - if (!foundSiftsMappings.isEmpty()) - { - seqToStrucMapping.addAll(foundSiftsMappings); - maxChain.makeExactMapping(maxAlignseq, seq); - maxChain.transferRESNUMFeatures(seq, null); - maxChain.transferResidueAnnotation(foundSiftsMappings.get(0), - sqmpping); - } - else - { - StructureMapping nwMapping = getNWMappings(seq, pdbFile, - maxChainId, maxChain, pdb, maxAlignseq); - seqToStrucMapping.add(nwMapping); - } - } - } - else - { -<<<<<<< Updated upstream - setProgressBar(null); - setProgressBar(MessageManager - .getString("status.obtaining_mapping_with_nw_alignment")); -======= - if (progress != null) - { - progress.setProgressBar("Obtaining mapping with NW alignment", - progressSessionId); - } ->>>>>>> Stashed changes - seqToStrucMapping.add(getNWMappings(seq, pdbFile, maxChainId, - maxChain, pdb, maxAlignseq)); - } - if (forStructureView) - { - mappings.addAll(seqToStrucMapping); - } - if (progress != null) - { - progress.setProgressBar(null, progressSessionId); - } - } - return pdb; - } - - private boolean isCIFFile(String filename) - { - String fileExt = filename.substring(filename.lastIndexOf(".") + 1, - filename.length()); - return "cif".equalsIgnoreCase(fileExt); - } - - private StructureMapping getStructureMapping(SequenceI seq, - String pdbFile, String targetChainId, StructureFile pdb, - PDBChain maxChain, jalview.datamodel.Mapping sqmpping, - AlignSeq maxAlignseq) throws SiftsException - { - StructureMapping curChainMapping = siftsClient - .getSiftsStructureMapping(seq, pdbFile, targetChainId); - try - { - PDBChain chain = pdb.findChain(targetChainId); - if (chain != null) - { - chain.transferResidueAnnotation(curChainMapping, sqmpping); - } - } catch (Exception e) - { - e.printStackTrace(); - } - return curChainMapping; - } - - private StructureMapping getNWMappings(SequenceI seq, - String pdbFile, - String maxChainId, PDBChain maxChain, StructureFile pdb, - AlignSeq maxAlignseq) - { - final StringBuilder mappingDetails = new StringBuilder(128); - mappingDetails.append(NEWLINE).append( - "Sequence \u27f7 Structure mapping details"); - mappingDetails.append(NEWLINE); - mappingDetails - .append("Method: inferred with Needleman & Wunsch alignment"); - mappingDetails.append(NEWLINE).append("PDB Sequence is :") - .append(NEWLINE).append("Sequence = ") - .append(maxChain.sequence.getSequenceAsString()); - mappingDetails.append(NEWLINE).append("No of residues = ") - .append(maxChain.residues.size()).append(NEWLINE) - .append(NEWLINE); - PrintStream ps = new PrintStream(System.out) - { - @Override - public void print(String x) - { - mappingDetails.append(x); - } - - @Override - public void println() - { - mappingDetails.append(NEWLINE); - } - }; - - maxAlignseq.printAlignment(ps); - - mappingDetails.append(NEWLINE).append("PDB start/end "); - mappingDetails.append(String.valueOf(maxAlignseq.seq2start)) - .append(" "); - mappingDetails.append(String.valueOf(maxAlignseq.seq2end)); - mappingDetails.append(NEWLINE).append("SEQ start/end "); - mappingDetails.append( - String.valueOf(maxAlignseq.seq1start + (seq.getStart() - 1))) - .append(" "); - mappingDetails.append(String.valueOf(maxAlignseq.seq1end - + (seq.getStart() - 1))); - mappingDetails.append(NEWLINE); - maxChain.makeExactMapping(maxAlignseq, seq); - jalview.datamodel.Mapping sqmpping = maxAlignseq - .getMappingFromS1(false); - maxChain.transferRESNUMFeatures(seq, null); - - HashMap mapping = new HashMap(); - int resNum = -10000; - int index = 0; - char insCode = ' '; - - do - { - Atom tmp = maxChain.atoms.elementAt(index); - if ((resNum != tmp.resNumber || insCode != tmp.insCode) - && tmp.alignmentMapping != -1) - { - resNum = tmp.resNumber; - insCode = tmp.insCode; - if (tmp.alignmentMapping >= -1) - { - mapping.put(tmp.alignmentMapping + 1, new int[] { tmp.resNumber, - tmp.atomIndex }); - } - } - - index++; - } while (index < maxChain.atoms.size()); - - StructureMapping nwMapping = new StructureMapping(seq, pdbFile, - pdb.getId(), maxChainId, mapping, mappingDetails.toString()); - maxChain.transferResidueAnnotation(nwMapping, sqmpping); - return nwMapping; - } - - public void removeStructureViewerListener(Object svl, String[] pdbfiles) - { - listeners.removeElement(svl); - if (svl instanceof SequenceListener) - { - for (int i = 0; i < listeners.size(); i++) - { - if (listeners.elementAt(i) instanceof StructureListener) - { - ((StructureListener) listeners.elementAt(i)) - .releaseReferences(svl); - } - } - } - - if (pdbfiles == null) - { - return; - } - - /* - * Remove mappings to the closed listener's PDB files, but first check if - * another listener is still interested - */ - List pdbs = new ArrayList(Arrays.asList(pdbfiles)); - - StructureListener sl; - for (int i = 0; i < listeners.size(); i++) - { - if (listeners.elementAt(i) instanceof StructureListener) - { - sl = (StructureListener) listeners.elementAt(i); - for (String pdbfile : sl.getPdbFile()) - { - pdbs.remove(pdbfile); - } - } - } - - /* - * Rebuild the mappings set, retaining only those which are for 'other' PDB - * files - */ - if (pdbs.size() > 0) - { - List tmp = new ArrayList(); - for (StructureMapping sm : mappings) - { - if (!pdbs.contains(sm.pdbfile)) - { - tmp.add(sm); - } - } - - mappings = tmp; - } - } - - /** - * Propagate mouseover of a single position in a structure - * - * @param pdbResNum - * @param chain - * @param pdbfile - */ - public void mouseOverStructure(int pdbResNum, String chain, String pdbfile) - { - AtomSpec atomSpec = new AtomSpec(pdbfile, chain, pdbResNum, 0); - List atoms = Collections.singletonList(atomSpec); - mouseOverStructure(atoms); - } - - /** - * Propagate mouseover or selection of multiple positions in a structure - * - * @param atoms - */ - public void mouseOverStructure(List atoms) - { - if (listeners == null) - { - // old or prematurely sent event - return; - } - boolean hasSequenceListener = false; - for (int i = 0; i < listeners.size(); i++) - { - if (listeners.elementAt(i) instanceof SequenceListener) - { - hasSequenceListener = true; - } - } - if (!hasSequenceListener) - { - return; - } - - SearchResults results = new SearchResults(); - for (AtomSpec atom : atoms) - { - SequenceI lastseq = null; - int lastipos = -1; - for (StructureMapping sm : mappings) - { - if (sm.pdbfile.equals(atom.getPdbFile()) - && sm.pdbchain.equals(atom.getChain())) - { - int indexpos = sm.getSeqPos(atom.getPdbResNum()); - if (lastipos != indexpos && lastseq != sm.sequence) - { - results.addResult(sm.sequence, indexpos, indexpos); - lastipos = indexpos; - lastseq = sm.sequence; - // construct highlighted sequence list - for (AlignedCodonFrame acf : seqmappings) - { - acf.markMappedRegion(sm.sequence, indexpos, results); - } - } - } - } - } - for (Object li : listeners) - { - if (li instanceof SequenceListener) - { - ((SequenceListener) li).highlightSequence(results); - } - } - } - - /** - * highlight regions associated with a position (indexpos) in seq - * - * @param seq - * the sequence that the mouse over occurred on - * @param indexpos - * the absolute position being mouseovered in seq (0 to seq.length()) - * @param seqPos - * the sequence position (if -1, seq.findPosition is called to - * resolve the residue number) - */ - public void mouseOverSequence(SequenceI seq, int indexpos, int seqPos, - VamsasSource source) - { - boolean hasSequenceListeners = handlingVamsasMo - || !seqmappings.isEmpty(); - SearchResults results = null; - if (seqPos == -1) - { - seqPos = seq.findPosition(indexpos); - } - for (int i = 0; i < listeners.size(); i++) - { - Object listener = listeners.elementAt(i); - if (listener == source) - { - // TODO listener (e.g. SeqPanel) is never == source (AlignViewport) - // Temporary fudge with SequenceListener.getVamsasSource() - continue; - } - if (listener instanceof StructureListener) - { - highlightStructure((StructureListener) listener, seq, seqPos); - } - else - { - if (listener instanceof SequenceListener) - { - final SequenceListener seqListener = (SequenceListener) listener; - if (hasSequenceListeners - && seqListener.getVamsasSource() != source) - { - if (relaySeqMappings) - { - if (results == null) - { - results = MappingUtils.buildSearchResults(seq, seqPos, - seqmappings); - } - if (handlingVamsasMo) - { - results.addResult(seq, seqPos, seqPos); - - } - if (!results.isEmpty()) - { - seqListener.highlightSequence(results); - } - } - } - } - else if (listener instanceof VamsasListener && !handlingVamsasMo) - { - ((VamsasListener) listener).mouseOverSequence(seq, indexpos, - source); - } - else if (listener instanceof SecondaryStructureListener) - { - ((SecondaryStructureListener) listener).mouseOverSequence(seq, - indexpos, seqPos); - } - } - } - } - - /** - * Send suitable messages to a StructureListener to highlight atoms - * corresponding to the given sequence position(s) - * - * @param sl - * @param seq - * @param positions - */ - public void highlightStructure(StructureListener sl, SequenceI seq, - int... positions) - { - if (!sl.isListeningFor(seq)) - { - return; - } - int atomNo; - List atoms = new ArrayList(); - for (StructureMapping sm : mappings) - { - if (sm.sequence == seq - || sm.sequence == seq.getDatasetSequence() - || (sm.sequence.getDatasetSequence() != null && sm.sequence - .getDatasetSequence() == seq.getDatasetSequence())) - { - for (int index : positions) - { - atomNo = sm.getAtomNum(index); - - if (atomNo > 0) - { - atoms.add(new AtomSpec(sm.pdbfile, sm.pdbchain, sm - .getPDBResNum(index), atomNo)); - } - } - } - } - sl.highlightAtoms(atoms); - } - - /** - * true if a mouse over event from an external (ie Vamsas) source is being - * handled - */ - boolean handlingVamsasMo = false; - - long lastmsg = 0; - - /** - * as mouseOverSequence but only route event to SequenceListeners - * - * @param sequenceI - * @param position - * in an alignment sequence - */ - public void mouseOverVamsasSequence(SequenceI sequenceI, int position, - VamsasSource source) - { - handlingVamsasMo = true; - long msg = sequenceI.hashCode() * (1 + position); - if (lastmsg != msg) - { - lastmsg = msg; - mouseOverSequence(sequenceI, position, -1, source); - } - handlingVamsasMo = false; - } - - public Annotation[] colourSequenceFromStructure(SequenceI seq, - String pdbid) - { - return null; - // THIS WILL NOT BE AVAILABLE IN JALVIEW 2.3, - // UNTIL THE COLOUR BY ANNOTATION IS REWORKED - /* - * Annotation [] annotations = new Annotation[seq.getLength()]; - * - * StructureListener sl; int atomNo = 0; for (int i = 0; i < - * listeners.size(); i++) { if (listeners.elementAt(i) instanceof - * StructureListener) { sl = (StructureListener) listeners.elementAt(i); - * - * for (int j = 0; j < mappings.length; j++) { - * - * if (mappings[j].sequence == seq && mappings[j].getPdbId().equals(pdbid) - * && mappings[j].pdbfile.equals(sl.getPdbFile())) { - * System.out.println(pdbid+" "+mappings[j].getPdbId() +" - * "+mappings[j].pdbfile); - * - * java.awt.Color col; for(int index=0; index 0) { col = sl.getColour(atomNo, - * mappings[j].getPDBResNum(index), mappings[j].pdbchain, - * mappings[j].pdbfile); } - * - * annotations[index] = new Annotation("X",null,' ',0,col); } return - * annotations; } } } } - * - * return annotations; - */ - } - - public void structureSelectionChanged() - { - } - - public void sequenceSelectionChanged() - { - } - - public void sequenceColoursChanged(Object source) - { - StructureListener sl; - for (int i = 0; i < listeners.size(); i++) - { - if (listeners.elementAt(i) instanceof StructureListener) - { - sl = (StructureListener) listeners.elementAt(i); - sl.updateColours(source); - } - } - } - - public StructureMapping[] getMapping(String pdbfile) - { - List tmp = new ArrayList(); - for (StructureMapping sm : mappings) - { - if (sm.pdbfile.equals(pdbfile)) - { - tmp.add(sm); - } - } - return tmp.toArray(new StructureMapping[tmp.size()]); - } - - /** - * Returns a readable description of all mappings for the given pdbfile to any - * of the given sequences - * - * @param pdbfile - * @param seqs - * @return - */ - public String printMappings(String pdbfile, List seqs) - { - if (pdbfile == null || seqs == null || seqs.isEmpty()) - { - return ""; - } - - StringBuilder sb = new StringBuilder(64); - for (StructureMapping sm : mappings) - { - if (sm.pdbfile.equals(pdbfile) && seqs.contains(sm.sequence)) - { - sb.append(sm.mappingDetails); - sb.append(NEWLINE); - // separator makes it easier to read multiple mappings - sb.append("====================="); - sb.append(NEWLINE); - } - } - sb.append(NEWLINE); - - return sb.toString(); - } - - /** - * Remove the given mapping - * - * @param acf - */ - public void deregisterMapping(AlignedCodonFrame acf) - { - if (acf != null) - { - boolean removed = seqmappings.remove(acf); - if (removed && seqmappings.isEmpty()) - { // debug - System.out.println("All mappings removed"); - } - } - } - - /** - * Add each of the given codonFrames to the stored set, if not aready present. - * - * @param mappings - */ - public void registerMappings(List mappings) - { - if (mappings != null) - { - for (AlignedCodonFrame acf : mappings) - { - registerMapping(acf); - } - } - } - - /** - * Add the given mapping to the stored set, unless already stored. - */ - public void registerMapping(AlignedCodonFrame acf) - { - if (acf != null) - { - if (!seqmappings.contains(acf)) - { - seqmappings.add(acf); - } - } - } - - /** - * Resets this object to its initial state by removing all registered - * listeners, codon mappings, PDB file mappings - */ - public void resetAll() - { - if (mappings != null) - { - mappings.clear(); - } - if (seqmappings != null) - { - seqmappings.clear(); - } - if (sel_listeners != null) - { - sel_listeners.clear(); - } - if (listeners != null) - { - listeners.clear(); - } - if (commandListeners != null) - { - commandListeners.clear(); - } - if (view_listeners != null) - { - view_listeners.clear(); - } - if (pdbFileNameId != null) - { - pdbFileNameId.clear(); - } - if (pdbIdFileName != null) - { - pdbIdFileName.clear(); - } - } - - public void addSelectionListener(SelectionListener selecter) - { - if (!sel_listeners.contains(selecter)) - { - sel_listeners.add(selecter); - } - } - - public void removeSelectionListener(SelectionListener toremove) - { - if (sel_listeners.contains(toremove)) - { - sel_listeners.remove(toremove); - } - } - - public synchronized void sendSelection( - jalview.datamodel.SequenceGroup selection, - jalview.datamodel.ColumnSelection colsel, SelectionSource source) - { - for (SelectionListener slis : sel_listeners) - { - if (slis != source) - { - slis.selection(selection, colsel, source); - } - } - } - - Vector view_listeners = new Vector(); - - public synchronized void sendViewPosition( - jalview.api.AlignmentViewPanel source, int startRes, int endRes, - int startSeq, int endSeq) - { - - if (view_listeners != null && view_listeners.size() > 0) - { - Enumeration listeners = view_listeners - .elements(); - while (listeners.hasMoreElements()) - { - AlignmentViewPanelListener slis = listeners.nextElement(); - if (slis != source) - { - slis.viewPosition(startRes, endRes, startSeq, endSeq, source); - } - ; - } - } - } - - /** - * release all references associated with this manager provider - * - * @param jalviewLite - */ - public static void release(StructureSelectionManagerProvider jalviewLite) - { - // synchronized (instances) - { - if (instances == null) - { - return; - } - StructureSelectionManager mnger = (instances.get(jalviewLite)); - if (mnger != null) - { - instances.remove(jalviewLite); - try - { - mnger.finalize(); - } catch (Throwable x) - { - } - } - } - } - - public void registerPDBEntry(PDBEntry pdbentry) - { - if (pdbentry.getFile() != null - && pdbentry.getFile().trim().length() > 0) - { - registerPDBFile(pdbentry.getId(), pdbentry.getFile()); - } - } - - public void addCommandListener(CommandListener cl) - { - if (!commandListeners.contains(cl)) - { - commandListeners.add(cl); - } - } - - public boolean hasCommandListener(CommandListener cl) - { - return this.commandListeners.contains(cl); - } - - public boolean removeCommandListener(CommandListener l) - { - return commandListeners.remove(l); - } - - /** - * Forward a command to any command listeners (except for the command's - * source). - * - * @param command - * the command to be broadcast (in its form after being performed) - * @param undo - * if true, the command was being 'undone' - * @param source - */ - public void commandPerformed(CommandI command, boolean undo, - VamsasSource source) - { - for (CommandListener listener : commandListeners) - { - listener.mirrorCommand(command, undo, this, source); - } - } - - /** - * Returns a new CommandI representing the given command as mapped to the - * given sequences. If no mapping could be made, or the command is not of a - * mappable kind, returns null. - * - * @param command - * @param undo - * @param mapTo - * @param gapChar - * @return - */ - public CommandI mapCommand(CommandI command, boolean undo, - final AlignmentI mapTo, char gapChar) - { - if (command instanceof EditCommand) - { - return MappingUtils.mapEditCommand((EditCommand) command, undo, - mapTo, gapChar, seqmappings); - } - else if (command instanceof OrderCommand) - { - return MappingUtils.mapOrderCommand((OrderCommand) command, undo, - mapTo, seqmappings); - } - return null; - } - - public List getSequenceMappings() - { - return seqmappings; - } - -} diff --git a/src/jalview/util/SparseCount.java~ b/src/jalview/util/SparseCount.java~ deleted file mode 100644 index e6b45f2..0000000 --- a/src/jalview/util/SparseCount.java~ +++ /dev/null @@ -1,154 +0,0 @@ -package jalview.util; - -import jalview.ext.android.SparseIntArray; -import jalview.ext.android.SparseShortArray; - -/** - * A class to count occurrences of characters with minimal memory footprint. - * Sparse arrays of short values are used to hold the counts, with automatic - * promotion to arrays of int if any count exceeds the maximum value for a - * short. - * - * @author gmcarstairs - * - */ -public class SparseCount -{ - private static final int DEFAULT_PROFILE_SIZE = 2; - - /* - * array of keys (chars) and values (counts) - * held either as shorts or (if shorts overflow) as ints - */ - private SparseShortArray shortProfile; - - private SparseIntArray intProfile; - - /* - * flag is set true after short overflow occurs - */ - private boolean useInts; - - /** - * Constructor which initially creates a new sparse array of short values to - * hold counts. - * - * @param profileSize - */ - public SparseCount(int profileSize) - { - this.shortProfile = new SparseShortArray(profileSize); - } - - /** - * Constructor which allocates an initial count array for only two distinct - * values (the array will grow if needed) - */ - public SparseCount() - { - this(DEFAULT_PROFILE_SIZE); - } - - /** - * Adds the given value for the given key (or sets the initial value), and - * returns the new value - * - * @param key - * @param value - */ - public int add(int key, int value) - { - int newValue = 0; - if (useInts) - { - newValue = intProfile.add(key, value); - } - else - { - try { - newValue = shortProfile.add(key, value); - } catch (ArithmeticException e) { - handleOverflow(); - newValue = intProfile.add(key, value); - } - } - return newValue; - } - - /** - * Switch from counting shorts to counting ints - */ - synchronized void handleOverflow() - { - int size = shortProfile.size(); - intProfile = new SparseIntArray(size); - for (int i = 0; i < size; i++) - { - short key = shortProfile.keyAt(i); - short value = shortProfile.valueAt(i); - intProfile.put(key, value); - } - shortProfile = null; - useInts = true; - } - - /** - * Returns the size of the profile (number of distinct items counted) - * - * @return - */ - public int size() - { - return useInts ? intProfile.size() : shortProfile.size(); - } - - /** - * Returns the value for the key (zero if no such key) - * - * @param key - * @return - */ - public int get(int key) - { - return useInts ? intProfile.get(key) : shortProfile.get(key); - } - - /** - * Sets the value for the given key - * - * @param key - * @param value - */ - public void put(int key, int value) - { - if (useInts) - { - intProfile.put(key, value); - } - else - { - shortProfile.put(key, value); - } - } - - public int keyAt(int k) - { - return useInts ? intProfile.keyAt(k) : shortProfile.keyAt(k); - } - - public int valueAt(int k) - { - return useInts ? intProfile.valueAt(k) : shortProfile.valueAt(k); - } - - /** - * Answers true if this object wraps arrays of int values, false if using - * short values - * - * @return - */ - boolean isUsingInt() - { - return useInts; - } -} diff --git a/src/jalview/ws/dbsources/Pdb.java~ b/src/jalview/ws/dbsources/Pdb.java~ deleted file mode 100644 index 6c2f70a..0000000 --- a/src/jalview/ws/dbsources/Pdb.java~ +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) - * Copyright (C) $$Year-Rel$$ The Jalview Authors - * - * 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 . - * The Jalview Authors are detailed in the 'AUTHORS' file. - */ -package jalview.ws.dbsources; - -import jalview.api.FeatureSettingsModelI; -import jalview.datamodel.AlignmentAnnotation; -import jalview.datamodel.AlignmentI; -import jalview.datamodel.DBRefEntry; -import jalview.datamodel.DBRefSource; -import jalview.datamodel.PDBEntry; -import jalview.datamodel.SequenceI; -import jalview.io.FormatAdapter; -import jalview.io.PDBFeatureSettings; -import jalview.util.MessageManager; -import jalview.ws.ebi.EBIFetchClient; - -import java.util.ArrayList; -import java.util.List; -import java.util.Vector; - -import com.stevesoft.pat.Regex; - -/** - * @author JimP - * - */ -public class Pdb extends EbiFileRetrievedProxy -{ - public Pdb() - { - super(); - } - - public static final String FEATURE_INSERTION = "INSERTION"; - - public static final String FEATURE_RES_NUM = "RESNUM"; - - private static String currentDefaultFormat = DBRefSource.PDB; - - /* - * (non-Javadoc) - * - * @see jalview.ws.DbSourceProxy#getAccessionSeparator() - */ - @Override - public String getAccessionSeparator() - { - // TODO Auto-generated method stub - return null; - } - - /* - * (non-Javadoc) - * - * @see jalview.ws.DbSourceProxy#getAccessionValidator() - */ - @Override - public Regex getAccessionValidator() - { - return new Regex("([1-9][0-9A-Za-z]{3}):?([ _A-Za-z0-9]?)"); - } - - /* - * (non-Javadoc) - * - * @see jalview.ws.DbSourceProxy#getDbSource() - */ - @Override - public String getDbSource() - { - return DBRefSource.PDB; - } - - /* - * (non-Javadoc) - * - * @see jalview.ws.DbSourceProxy#getDbVersion() - */ - @Override - public String getDbVersion() - { - return "0"; - } - - /* - * (non-Javadoc) - * - * @see jalview.ws.DbSourceProxy#getSequenceRecords(java.lang.String[]) - */ - @Override - public AlignmentI getSequenceRecords(String queries) throws Exception - { - AlignmentI pdbAlignment = null; - Vector result = new Vector(); - String chain = null; - String id = null; - if (queries.indexOf(":") > -1) - { - chain = queries.substring(queries.indexOf(":") + 1); - id = queries.substring(0, queries.indexOf(":")); - } - else - { - id = queries; - } - if (queries.length() > 4 && chain == null) - { - chain = queries.substring(4, 5); - id = queries.substring(0, 4); - } - if (!isValidReference(id)) - { - System.err.println("Ignoring invalid pdb query: '" + id + "'"); - stopQuery(); - return null; - } - String ext = getCurrentDefaultFormat().equalsIgnoreCase("mmcif") ? ".cif" - : ".xml"; - EBIFetchClient ebi = new EBIFetchClient(); - file = ebi.fetchDataAsFile("pdb:" + id, -<<<<<<< HEAD - getCurrentDefaultFomart().toLowerCase(), ext) -======= - getCurrentDefaultFormat().toLowerCase(), "raw", ext) ->>>>>>> develop - .getAbsolutePath(); - stopQuery(); - if (file == null) - { - return null; - } - try - { - - pdbAlignment = new FormatAdapter().readFile(file, - jalview.io.AppletFormatAdapter.FILE, - getCurrentDefaultFormat()); - if (pdbAlignment != null) - { - List toremove = new ArrayList(); - for (SequenceI pdbcs : pdbAlignment.getSequences()) - { - String chid = null; - // Mapping map=null; - for (PDBEntry pid : pdbcs.getAllPDBEntries()) - { - if (pid.getFile() == file) - { - chid = pid.getChainCode(); - - } - ; - - } - if (chain == null - || (chid != null && (chid.equals(chain) - || chid.trim().equals(chain.trim()) || (chain - .trim().length() == 0 && chid.equals("_"))))) - { - pdbcs.setName(jalview.datamodel.DBRefSource.PDB + "|" + id - + "|" + pdbcs.getName()); - // Might need to add more metadata to the PDBEntry object - // like below - /* - * PDBEntry entry = new PDBEntry(); // Construct the PDBEntry - * entry.setId(id); if (entry.getProperty() == null) - * entry.setProperty(new Hashtable()); - * entry.getProperty().put("chains", pdbchain.id + "=" + - * sq.getStart() + "-" + sq.getEnd()); - * sq.getDatasetSequence().addPDBId(entry); - */ - // Add PDB DB Refs - // We make a DBRefEtntry because we have obtained the PDB file from - // a - // verifiable source - // JBPNote - PDB DBRefEntry should also carry the chain and mapping - // information - DBRefEntry dbentry = new DBRefEntry(getDbSource(), - getDbVersion(), (chid == null ? id : id + chid)); - // dbentry.setMap() - pdbcs.addDBRef(dbentry); - } - else - { - // mark this sequence to be removed from the alignment - // - since it's not from the right chain - toremove.add(pdbcs); - } - } - // now remove marked sequences - for (SequenceI pdbcs : toremove) - { - pdbAlignment.deleteSequence(pdbcs); - if (pdbcs.getAnnotation() != null) - { - for (AlignmentAnnotation aa : pdbcs.getAnnotation()) - { - pdbAlignment.deleteAnnotation(aa); - } - } - } - } - - if (pdbAlignment == null || pdbAlignment.getHeight() < 1) - { - throw new Exception(MessageManager.formatMessage( - "exception.no_pdb_records_for_chain", new String[] { id, - ((chain == null) ? "' '" : chain) })); - } - - } catch (Exception ex) // Problem parsing PDB file - { - stopQuery(); - throw (ex); - } - return pdbAlignment; - } - - /* - * (non-Javadoc) - * - * @see jalview.ws.DbSourceProxy#isValidReference(java.lang.String) - */ - @Override - public boolean isValidReference(String accession) - { - Regex r = getAccessionValidator(); - return r.search(accession.trim()); - } - - /** - * obtain human glyoxalase chain A sequence - */ - @Override - public String getTestQuery() - { - return "1QIPA"; - } - - @Override - public String getDbName() - { - return "PDB"; // getDbSource(); - } - - @Override - public int getTier() - { - return 0; - } - - public static String getCurrentDefaultFormat() - { - return currentDefaultFormat; - } - - public static void setCurrentDefaultFormat(String currentDefaultFomart) - { - Pdb.currentDefaultFormat = currentDefaultFomart; - } - - /** - * Returns a descriptor for suitable feature display settings with - *

- */ - @Override - public FeatureSettingsModelI getFeatureColourScheme() - { - return new PDBFeatureSettings(); - } -} -- 1.7.10.2