Clover icon

jalviewX

  1. Project Clover database Wed Oct 31 2018 15:13:58 GMT
  2. Package jalview.gui

File RedundancyPanel.java

 

Coverage histogram

../../img/srcFileCovDistChart0.png
56% of files have more coverage

Code metrics

30
93
7
1
305
195
24
0.26
13.29
7
3.43

Classes

Class Line # Actions
RedundancyPanel 51 93 24 130
0.00%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3    * Copyright (C) $$Year-Rel$$ The Jalview Authors
4    *
5    * This file is part of Jalview.
6    *
7    * Jalview is free software: you can redistribute it and/or
8    * modify it under the terms of the GNU General Public License
9    * as published by the Free Software Foundation, either version 3
10    * of the License, or (at your option) any later version.
11    *
12    * Jalview is distributed in the hope that it will be useful, but
13    * WITHOUT ANY WARRANTY; without even the implied warranty
14    * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15    * PURPOSE. See the GNU General Public License for more details.
16    *
17    * You should have received a copy of the GNU General Public License
18    * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19    * The Jalview Authors are detailed in the 'AUTHORS' file.
20    */
21    package jalview.gui;
22   
23    import jalview.analysis.AlignSeq;
24    import jalview.commands.CommandI;
25    import jalview.commands.EditCommand;
26    import jalview.commands.EditCommand.Action;
27    import jalview.datamodel.SequenceGroup;
28    import jalview.datamodel.SequenceI;
29    import jalview.jbgui.GSliderPanel;
30    import jalview.util.MessageManager;
31   
32    import java.awt.event.ActionEvent;
33    import java.util.ArrayList;
34    import java.util.List;
35    import java.util.Stack;
36    import java.util.Vector;
37   
38    import javax.swing.JInternalFrame;
39    import javax.swing.JProgressBar;
40    import javax.swing.event.ChangeEvent;
41    import javax.swing.event.ChangeListener;
42    import javax.swing.event.InternalFrameAdapter;
43    import javax.swing.event.InternalFrameEvent;
44   
45    /**
46    * DOCUMENT ME!
47    *
48    * @author $author$
49    * @version $Revision$
50    */
 
51    public class RedundancyPanel extends GSliderPanel implements Runnable
52    {
53    AlignFrame af;
54   
55    AlignmentPanel ap;
56   
57    Stack<CommandI> historyList = new Stack<>();
58   
59    // simpler than synching with alignFrame.
60   
61    float[] redundancy;
62   
63    SequenceI[] originalSequences;
64   
65    JInternalFrame frame;
66   
67    Vector redundantSeqs;
68   
69    /**
70    * Creates a new RedundancyPanel object.
71    *
72    * @param ap
73    * DOCUMENT ME!
74    * @param af
75    * DOCUMENT ME!
76    */
 
77  0 toggle public RedundancyPanel(final AlignmentPanel ap, AlignFrame af)
78    {
79  0 this.ap = ap;
80  0 this.af = af;
81  0 redundantSeqs = new Vector();
82   
83  0 slider.addChangeListener(new ChangeListener()
84    {
 
85  0 toggle @Override
86    public void stateChanged(ChangeEvent evt)
87    {
88  0 valueField.setText(slider.getValue() + "");
89  0 sliderValueChanged();
90    }
91    });
92   
93  0 applyButton.setText(MessageManager.getString("action.remove"));
94  0 allGroupsCheck.setVisible(false);
95  0 slider.setMinimum(0);
96  0 slider.setMaximum(100);
97  0 slider.setValue(100);
98   
99  0 Thread worker = new Thread(this);
100  0 worker.start();
101   
102  0 frame = new JInternalFrame();
103  0 frame.setContentPane(this);
104  0 Desktop.addInternalFrame(frame,
105    MessageManager
106    .getString("label.redundancy_threshold_selection"),
107    true, FRAME_WIDTH, FRAME_HEIGHT, false, true);
108  0 frame.addInternalFrameListener(new InternalFrameAdapter()
109    {
 
110  0 toggle @Override
111    public void internalFrameClosing(InternalFrameEvent evt)
112    {
113  0 ap.getIdPanel().getIdCanvas().setHighlighted(null);
114    }
115    });
116   
117    }
118   
119    /**
120    * This is a copy of remove redundancy in jalivew.datamodel.Alignment except
121    * we dont want to remove redundancy, just calculate once so we can use the
122    * slider to dynamically hide redundant sequences
123    *
124    * @param threshold
125    * DOCUMENT ME!
126    * @param sel
127    * DOCUMENT ME!
128    *
129    * @return DOCUMENT ME!
130    */
 
131  0 toggle @Override
132    public void run()
133    {
134  0 JProgressBar progress = new JProgressBar();
135  0 progress.setIndeterminate(true);
136  0 southPanel.add(progress, java.awt.BorderLayout.SOUTH);
137   
138  0 label.setText(MessageManager.getString("label.calculating"));
139   
140  0 slider.setVisible(false);
141  0 applyButton.setEnabled(false);
142  0 valueField.setVisible(false);
143   
144  0 validate();
145   
146  0 String[] omitHidden = null;
147   
148  0 SequenceGroup sg = ap.av.getSelectionGroup();
149  0 int height;
150   
151  0 int start, end;
152   
153  0 if ((sg != null) && (sg.getSize() >= 1))
154    {
155  0 originalSequences = sg.getSequencesInOrder(ap.av.getAlignment());
156  0 start = sg.getStartRes();
157  0 end = sg.getEndRes();
158    }
159    else
160    {
161  0 originalSequences = ap.av.getAlignment().getSequencesArray();
162  0 start = 0;
163  0 end = ap.av.getAlignment().getWidth();
164    }
165   
166  0 height = originalSequences.length;
167  0 if (ap.av.hasHiddenColumns())
168    {
169  0 omitHidden = ap.av.getViewAsString(sg != null);
170    }
171  0 redundancy = AlignSeq.computeRedundancyMatrix(originalSequences,
172    omitHidden, start, end, false);
173   
174  0 progress.setIndeterminate(false);
175  0 progress.setVisible(false);
176  0 progress = null;
177   
178  0 label.setText(
179    MessageManager.getString("label.enter_redundancy_threshold"));
180  0 slider.setVisible(true);
181  0 applyButton.setEnabled(true);
182  0 valueField.setVisible(true);
183   
184  0 validate();
185  0 sliderValueChanged();
186    // System.out.println((System.currentTimeMillis()-start));
187    }
188   
 
189  0 toggle void sliderValueChanged()
190    {
191  0 if (redundancy == null)
192    {
193  0 return;
194    }
195   
196  0 float value = slider.getValue();
197  0 List<SequenceI> redundantSequences = new ArrayList<>();
198  0 for (int i = 0; i < redundancy.length; i++)
199    {
200  0 if (value <= redundancy[i])
201    {
202  0 redundantSequences.add(originalSequences[i]);
203    }
204    }
205  0 ap.getIdPanel().getIdCanvas().setHighlighted(redundantSequences);
206    }
207   
208    /**
209    * DOCUMENT ME!
210    *
211    * @param e
212    * DOCUMENT ME!
213    */
 
214  0 toggle @Override
215    public void applyButton_actionPerformed(ActionEvent e)
216    {
217  0 List<SequenceI> del = new ArrayList<>();
218   
219  0 undoButton.setEnabled(true);
220   
221  0 float value = slider.getValue();
222  0 SequenceGroup sg = ap.av.getSelectionGroup();
223   
224  0 for (int i = 0; i < redundancy.length; i++)
225    {
226  0 if (value <= redundancy[i])
227    {
228  0 del.add(originalSequences[i]);
229    }
230    }
231   
232    // This has to be done before the restoreHistoryItem method of alignFrame
233    // will actually restore these sequences.
234  0 if (del.size() > 0)
235    {
236  0 SequenceI[] deleted = new SequenceI[del.size()];
237   
238  0 int width = 0;
239  0 for (int i = 0; i < del.size(); i++)
240    {
241  0 deleted[i] = del.get(i);
242  0 if (deleted[i].getLength() > width)
243    {
244  0 width = deleted[i].getLength();
245    }
246    }
247   
248  0 EditCommand cut = new EditCommand(
249    MessageManager.getString("action.remove_redundancy"),
250    Action.CUT, deleted, 0, width, ap.av.getAlignment());
251   
252  0 for (int i = 0; i < del.size(); i++)
253    {
254  0 ap.av.getAlignment().deleteSequence(deleted[i]);
255  0 if (sg != null)
256    {
257  0 sg.deleteSequence(deleted[i], false);
258    }
259    }
260   
261  0 historyList.push(cut);
262   
263  0 ap.alignFrame.addHistoryItem(cut);
264   
265  0 PaintRefresher.Refresh(this, ap.av.getSequenceSetId(), true, true);
266  0 ap.av.firePropertyChange("alignment", null,
267    ap.av.getAlignment().getSequences());
268    }
269   
270    }
271   
272    /**
273    * DOCUMENT ME!
274    *
275    * @param e
276    * DOCUMENT ME!
277    */
 
278  0 toggle @Override
279    public void undoButton_actionPerformed(ActionEvent e)
280    {
281  0 if (historyList == null || historyList.isEmpty())
282    {
283  0 undoButton.setEnabled(false);
284  0 return;
285    }
286   
287  0 CommandI command = historyList.pop();
288  0 if (ap.av.getHistoryList().contains(command))
289    {
290  0 command.undoCommand(af.getViewAlignments());
291  0 ap.av.getHistoryList().remove(command);
292  0 ap.av.firePropertyChange("alignment", null,
293    ap.av.getAlignment().getSequences());
294  0 af.updateEditMenuBar();
295    }
296   
297  0 ap.paintAlignment(true, true);
298   
299  0 if (historyList.size() == 0)
300    {
301  0 undoButton.setEnabled(false);
302    }
303    }
304   
305    }