remove unnecessary method
[jalview.git] / src / jalview / gui / AppVarna.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7)
3  * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, G Barton, M Clamp, S Searle
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 of the License, or (at your option) any later version.
10  * 
11  * Jalview is distributed in the hope that it will be useful, but 
12  * WITHOUT ANY WARRANTY; without even the implied warranty 
13  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
14  * PURPOSE.  See the GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package jalview.gui;
19
20 import java.util.*;
21 import java.util.regex.Matcher;
22 import java.util.regex.Pattern;
23 import java.awt.*;
24
25 import javax.swing.*;
26 import javax.swing.event.*;
27
28 import java.awt.event.*;
29 import java.io.*;
30
31 import jalview.api.SequenceStructureBinding;
32 import jalview.bin.Cache;
33 import jalview.datamodel.*;
34 import jalview.gui.ViewSelectionMenu.ViewSetProvider;
35 import jalview.structure.*;
36 import jalview.io.*;
37 import jalview.schemes.*;
38 import jalview.util.ShiftList;
39 import fr.orsay.lri.varna.VARNAPanel;
40 import fr.orsay.lri.varna.exceptions.ExceptionFileFormatOrSyntax;
41 import fr.orsay.lri.varna.exceptions.ExceptionNonEqualLength;
42 import fr.orsay.lri.varna.exceptions.ExceptionUnmatchedClosingParentheses;
43 import fr.orsay.lri.varna.interfaces.InterfaceVARNAListener;
44 import fr.orsay.lri.varna.interfaces.InterfaceVARNASelectionListener;
45 import fr.orsay.lri.varna.models.BaseList;
46 import fr.orsay.lri.varna.models.VARNAConfig;
47 import fr.orsay.lri.varna.models.annotations.HighlightRegionAnnotation;
48 import fr.orsay.lri.varna.models.rna.ModeleBase;
49 import fr.orsay.lri.varna.models.rna.ModeleBaseNucleotide;
50 import fr.orsay.lri.varna.models.rna.RNA;
51
52
53 public class AppVarna extends JInternalFrame implements InterfaceVARNAListener,SelectionListener, SecondaryStructureListener// implements Runnable,SequenceStructureBinding, ViewSetProvider
54 , InterfaceVARNASelectionListener, VamsasSource
55
56 {
57   AppVarnaBinding vab;
58
59   VARNAPanel varnaPanel;
60   
61   public String name;
62   
63   public StructureSelectionManager ssm;
64   
65   /*public AppVarna(){
66           vab = new AppVarnaBinding(); 
67           initVarna();
68   }*/
69   
70  
71   public AppVarna(SequenceI seq,String strucseq, String struc,String name,AlignmentPanel ap){
72     ArrayList<RNA> rnaList = new ArrayList<RNA>();
73     RNA rna1 = new RNA(name);
74     try {
75       rna1.setRNA(strucseq,replaceOddGaps(struc));
76     } catch (ExceptionUnmatchedClosingParentheses e2) {
77       e2.printStackTrace();
78     } catch (ExceptionFileFormatOrSyntax e3) {
79       e3.printStackTrace();
80     }
81     RNA trim=trimRNA(rna1);
82     rnaList.add(trim);    
83     rnaList.add(rna1);
84     rna1.setName("consensus_"+rna1.getName());
85     
86     {
87       this.seqs.put(trim, seq);
88       this.seqs.put(rna1, seq);
89     }
90     vab = new AppVarnaBinding(rnaList);
91     //vab = new AppVarnaBinding(seq,struc);
92     //System.out.println("Hallo: "+name);
93     this.name=name;
94     initVarna();
95     ssm = ap.getStructureSelectionManager();
96     ssm.addStructureViewerListener(this);
97     ssm.addSelectionListener(this);
98   }     
99   
100   public void initVarna(){
101           //vab.setFinishedInit(false);
102           varnaPanel=vab.get_varnaPanel();
103           setBackground(Color.white);
104           JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,vab.getListPanel(),varnaPanel);
105           getContentPane().setLayout(new BorderLayout());
106           getContentPane().add(split, BorderLayout.CENTER);
107           //getContentPane().add(vab.getTools(), BorderLayout.NORTH);   
108           varnaPanel.addVARNAListener(this);
109           varnaPanel.addSelectionListener(this);
110           jalview.gui.Desktop.addInternalFrame(this,"VARNA -"+name,getBounds().width, getBounds().height);
111           this.pack();
112           showPanel(true);
113   }
114   
115   public String replaceOddGaps(String oldStr){
116           String patternStr = "[^([{<>}])]";
117       String replacementStr = ".";
118       Pattern pattern = Pattern.compile(patternStr);
119       Matcher matcher = pattern.matcher(oldStr);
120       String newStr=matcher.replaceAll(replacementStr);
121           return newStr;
122   }
123   
124   public RNA trimRNA(RNA rna){
125     ShiftList offset=new ShiftList();
126           RNA rnaTrim = new RNA("trim_"+rna.getName());
127           try {
128                   rnaTrim.setRNA(rna.getSeq(),replaceOddGaps(rna.getStructDBN()));
129           } catch (ExceptionUnmatchedClosingParentheses e2) {
130                 e2.printStackTrace();
131           } catch (ExceptionFileFormatOrSyntax e3) {
132                 e3.printStackTrace();
133           }
134
135           StringBuffer seq=new StringBuffer(rnaTrim.getSeq());
136           StringBuffer struc=new StringBuffer(rnaTrim.getStructDBN());
137           int ofstart=-1,sleng=rnaTrim.getSeq().length();
138           for(int i=0;i<sleng;i++){
139                   //TODO: Jalview utility for gap detection java.utils.isGap()
140                   //TODO: Switch to jalview rna datamodel
141                   if(jalview.util.Comparison.isGap(seq.charAt(i))){
142                     if (ofstart==-1)
143                     {
144                       ofstart=i;
145                     }
146                           if(!rnaTrim.findPair(i).isEmpty()){
147                                   int m=rnaTrim.findPair(i).get(1);
148                                   int l=rnaTrim.findPair(i).get(0);
149                                   
150                                   struc.replace(m, m+1, "*");
151                                   struc.replace(l, l+1, "*");
152                           }else{
153                                   struc.replace(i, i+1, "*");
154                           }
155                   } else {
156                     if (ofstart>-1)
157                     {
158                       offset.addShift(ofstart, ofstart-i);
159                       ofstart=-1;
160                     }
161                   }
162             }
163           // final gap
164           if (ofstart>-1)
165           {
166             offset.addShift(ofstart, ofstart-sleng);
167             ofstart=-1;
168           }
169           String newSeq=rnaTrim.getSeq().replace("-", "");
170           rnaTrim.getSeq().replace(".", "");
171           String newStruc=struc.toString().replace("*", "");
172
173           try {
174                 rnaTrim.setRNA(newSeq,newStruc);
175                 registerOffset(rnaTrim,offset);
176           } catch (ExceptionUnmatchedClosingParentheses e) {
177                 // TODO Auto-generated catch block
178                 e.printStackTrace();
179           } catch (ExceptionFileFormatOrSyntax e) {
180                 // TODO Auto-generated catch block
181                 e.printStackTrace();
182           }
183           return rnaTrim;
184   }
185   Map<RNA,SequenceI> seqs=new Hashtable<RNA,SequenceI>();
186   Map<RNA,ShiftList> offsets=new Hashtable<RNA,ShiftList>();
187   Map<RNA,ShiftList> offsetsInv=new Hashtable<RNA,ShiftList>();
188   private void registerOffset(RNA rnaTrim, ShiftList offset)
189   {
190     offsets.put(rnaTrim, offset);
191     offsetsInv.put(rnaTrim,offset.getInverse());
192   }
193
194   public void showPanel(boolean show){
195           this.setVisible(show);
196   }
197   
198   private boolean _started = false;
199
200   public void run(){
201           _started = true;
202           
203           try
204       {
205         initVarna();
206       } catch (OutOfMemoryError oomerror)
207       {
208         new OOMWarning("When trying to open the Varna viewer!", oomerror);
209       } catch (Exception ex)
210       {
211         Cache.log.error("Couldn't open Varna viewer!", ex);
212       }
213   }
214
215 @Override
216 public void onUINewStructure(VARNAConfig v, RNA r) {
217   
218 }
219
220 @Override
221 public void onWarningEmitted(String s) {
222         // TODO Auto-generated method stub
223         
224 }
225 private class VarnaHighlighter {
226   private  HighlightRegionAnnotation _lastHighlight;
227   private RNA _lastRNAhighlighted=null;
228   public void highlightRegion(RNA rna, int start,int end)
229   {
230   if (_lastRNAhighlighted!=null)
231   {
232     _lastRNAhighlighted.removeHighlightRegion(_lastHighlight);
233   }
234   HighlightRegionAnnotation highlight = new HighlightRegionAnnotation(rna.getBasesBetween(start,end));
235   rna.addHighlightRegion(highlight);
236   _lastHighlight=highlight;
237   _lastRNAhighlighted=rna;
238
239   }
240   public HighlightRegionAnnotation getLastHighlight() {
241     return _lastHighlight;
242   }
243   public RNA getLastRNA()
244   {
245     return _lastRNAhighlighted;
246   }
247 }
248 VarnaHighlighter mouseOverHighlighter=new VarnaHighlighter(),
249 selectionHighlighter=new VarnaHighlighter();
250 /**
251  * If a mouseOver event from the AlignmentPanel 
252  * is noticed the currently selected RNA in the 
253  * VARNA window is highlighted at the specific position. 
254  * To be able to remove it before the next highlight
255  * it is saved in _lastHighlight
256  */
257 @Override
258 public void mouseOverSequence(SequenceI sequence, int index) {
259         RNA rna=vab.getSelectedRNA();
260         ShiftList shift=offsets.get(rna);
261         if (shift!=null)
262         {
263           index=shift.shift(index);
264         }
265         mouseOverHighlighter.highlightRegion(rna, index, index);
266         vab.updateSelectedRNA(rna);
267 }
268
269
270 @Override
271 public void onStructureRedrawn()
272 {
273   // TODO Auto-generated method stub
274   
275 }
276
277 @Override
278 public void selection(SequenceGroup seqsel, ColumnSelection colsel,
279         SelectionSource source)
280 {
281   int start=seqsel.getStartRes(),end=seqsel.getEndRes();
282   RNA rna=vab.getSelectedRNA();
283   ShiftList shift=offsets.get(rna);
284   if (shift!=null)
285   {
286     start=shift.shift(start);
287     end=shift.shift(end);
288   }
289   selectionHighlighter.highlightRegion(rna, start, end);
290   selectionHighlighter.getLastHighlight().setOutlineColor(seqsel.getOutlineColour());
291   vab.updateSelectedRNA(rna);
292 }
293
294 @Override
295 public void onHoverChanged(ModeleBase arg0, ModeleBase arg1)
296 {
297   RNA rna=vab.getSelectedRNA();
298   ShiftList shift=offsetsInv.get(rna);
299   SequenceI seq=seqs.get(rna);
300   if (arg1!=null && seq!=null)
301   {
302     if (shift!=null)
303     {
304       ssm.mouseOverVamsasSequence(seq, seq.findIndex(arg1.getIndex()), this);
305     } else {
306       ssm.mouseOverVamsasSequence(seq, arg1.getIndex(),  this);
307     }
308   }
309 }
310
311 @Override
312 public void onSelectionChanged(BaseList arg0, BaseList arg1, BaseList arg2)
313 {
314   // TODO Auto-generated method stub
315   
316 }
317
318
319 }