-
- String name;
-
- //JSplitPane splitPane;
-
- //RenderPanel renderPanel;
-
- //AlignmentPanel ap;
-
- //Vector atomsPicked = new Vector();
-
- /*public AppVarna(){
- vab = new AppVarnaBinding();
- initVarna();
- }*/
-
- public AppVarna(String seq,String struc,String name){
- ArrayList<RNA> rnaList = new ArrayList<RNA>();
- RNA rna1 = new RNA(name);
- try {
- rna1.setRNA(seq,struc);
- } catch (ExceptionUnmatchedClosingParentheses e2) {
- e2.printStackTrace();
- } catch (ExceptionFileFormatOrSyntax e3) {
- e3.printStackTrace();
- }
- rnaList.add(rna1);
-
- //vab = new AppVarnaBinding(rnaList);
- vab = new AppVarnaBinding(seq,struc);
- name=this.name;
- initVarna();
- }
-
- public void initVarna(){
- //TODO: Why is it not possible to include varnaPanel in the AppVarna-Jframe?
- //vab.setFinishedInit(false);
- varnaPanel=vab.get_varnaPanel();
- setBackground(Color.white);
- System.out.println("vp: "+vab.get_varnaPanel().getName());
- //varnaPanel.setVisible(true);
- getContentPane().setLayout(new BorderLayout());
- getContentPane().add(varnaPanel, BorderLayout.CENTER);
- setVisible(true);
- varnaPanel.addVARNAListener(this);
- jalview.gui.Desktop.addInternalFrame(this,name,getBounds().width, getBounds().height);
- //showPanel(true);
- }
-
- public void showPanel(boolean show){
- //vab.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- //vab.pack();
- //vab.setVisible(show);
-
- varnaPanel.setVisible(show);
- }
-
+
+ public String name;
+
+ public StructureSelectionManager ssm;
+
+ /*
+ * public AppVarna(){ vab = new AppVarnaBinding(); initVarna(); }
+ */
+
+ AlignmentPanel ap;
+
+ public AppVarna(String sname, SequenceI seq, String strucseq,
+ String struc, String name, AlignmentPanel ap)
+ {
+
+ // System.out.println("1:"+sname);
+ // System.out.println("2:"+seq);
+ // System.out.println("3:"+strucseq);
+ // System.out.println("4:"+struc);
+ // System.out.println("5:"+name);
+ // System.out.println("6:"+ap);
+ this.ap = ap;
+ ArrayList<RNA> rnaList = new ArrayList<RNA>();
+ RNA rna1 = new RNA(name);
+ try
+ {
+
+ rna1.setRNA(strucseq, replaceOddGaps(struc));
+ // System.out.println("The sequence is :"+rna1.getSeq());
+ // System.out.println("The sequence is:"+struc);
+ // System.out.println("The sequence is:"+replaceOddGaps(struc).toString());
+ } catch (ExceptionUnmatchedClosingParentheses e2)
+ {
+ e2.printStackTrace();
+ } catch (ExceptionFileFormatOrSyntax e3)
+ {
+ e3.printStackTrace();
+ }
+ RNA trim = trimRNA(rna1, "trimmed " + sname);
+ rnaList.add(trim);
+ rnaList.add(rna1);
+
+ rnas.put(seq, rna1);
+ rnas.put(seq, trim);
+ rna1.setName(sname + " (with gaps)");
+
+ {
+ seqs.put(trim, seq);
+ seqs.put(rna1, seq);
+
+ /**
+ * if (false || seq.getStart()!=1) { for (RNA rshift:rnaList) { ShiftList
+ * shift=offsets.get(rshift); if (shift==null) { offsets.put(rshift,
+ * shift=new ShiftList());} shift.addShift(1, seq.getStart()-1);
+ * offsetsInv.put(rshift, shift.getInverse()); } }
+ **/
+ }
+ vab = new AppVarnaBinding(rnaList);
+ // vab = new AppVarnaBinding(seq,struc);
+ this.name = sname + " trimmed to " + name;
+ initVarna();
+
+ ssm = ap.getStructureSelectionManager();
+ // System.out.println(ssm.toString());
+ ssm.addStructureViewerListener(this);
+ ssm.addSelectionListener(this);
+ }
+
+ public void initVarna()
+ {
+
+ // vab.setFinishedInit(false);
+ varnaPanel = vab.get_varnaPanel();
+ setBackground(Color.white);
+ JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true,
+ vab.getListPanel(), varnaPanel);
+ getContentPane().setLayout(new BorderLayout());
+ getContentPane().add(split, BorderLayout.CENTER);
+ // getContentPane().add(vab.getTools(), BorderLayout.NORTH);
+ varnaPanel.addVARNAListener(this);
+ varnaPanel.addSelectionListener(this);
+ jalview.gui.Desktop.addInternalFrame(this,
+ MessageManager.formatMessage("label.varna_params", new String[]
+ { name }), getBounds().width, getBounds().height);
+ this.pack();
+ showPanel(true);
+
+ }
+
+ public String replaceOddGaps(String oldStr)
+ {
+ String patternStr = "[^([{<>}])]";
+ String replacementStr = ".";
+ Pattern pattern = Pattern.compile(patternStr);
+ Matcher matcher = pattern.matcher(oldStr);
+ String newStr = matcher.replaceAll(replacementStr);
+ return newStr;
+ }
+
+ public RNA trimRNA(RNA rna, String name)
+ {
+ ShiftList offset = new ShiftList();
+
+ RNA rnaTrim = new RNA(name);
+ try
+ {
+ rnaTrim.setRNA(rna.getSeq(), replaceOddGaps(rna.getStructDBN()));
+ } catch (ExceptionUnmatchedClosingParentheses e2)
+ {
+ e2.printStackTrace();
+ } catch (ExceptionFileFormatOrSyntax e3)
+ {
+ e3.printStackTrace();
+ }
+
+ StringBuffer seq = new StringBuffer(rnaTrim.getSeq());
+ StringBuffer struc = new StringBuffer(rnaTrim.getStructDBN());
+ int ofstart = -1, sleng = rnaTrim.getSeq().length();
+ for (int i = 0; i < sleng; i++)
+ {
+ // TODO: Jalview utility for gap detection java.utils.isGap()
+ // TODO: Switch to jalview rna datamodel
+ if (jalview.util.Comparison.isGap(seq.charAt(i)))
+ {
+ if (ofstart == -1)
+ {
+ ofstart = i;
+ }
+ if (!rnaTrim.findPair(i).isEmpty())
+ {
+ int m = rnaTrim.findPair(i).get(1);
+ int l = rnaTrim.findPair(i).get(0);
+
+ struc.replace(m, m + 1, "*");
+ struc.replace(l, l + 1, "*");
+ }
+ else
+ {
+ struc.replace(i, i + 1, "*");
+ }
+ }
+ else
+ {
+ if (ofstart > -1)
+ {
+ offset.addShift(offset.shift(ofstart), ofstart - i);
+ ofstart = -1;
+ }
+ }
+ }
+ // final gap
+ if (ofstart > -1)
+ {
+ offset.addShift(offset.shift(ofstart), ofstart - sleng);
+ ofstart = -1;
+ }
+ String newSeq = rnaTrim.getSeq().replace("-", "");
+ rnaTrim.getSeq().replace(".", "");
+ String newStruc = struc.toString().replace("*", "");
+
+ try
+ {
+ rnaTrim.setRNA(newSeq, newStruc);
+ registerOffset(rnaTrim, offset);
+ } catch (ExceptionUnmatchedClosingParentheses e)
+ {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ExceptionFileFormatOrSyntax e)
+ {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return rnaTrim;
+ }
+
+ // needs to be many-many
+ Map<RNA, SequenceI> seqs = new Hashtable<RNA, SequenceI>();
+
+ Map<SequenceI, RNA> rnas = new Hashtable<SequenceI, RNA>();
+
+ Map<RNA, ShiftList> offsets = new Hashtable<RNA, ShiftList>();
+
+ Map<RNA, ShiftList> offsetsInv = new Hashtable<RNA, ShiftList>();
+
+ private void registerOffset(RNA rnaTrim, ShiftList offset)
+ {
+ offsets.put(rnaTrim, offset);
+ offsetsInv.put(rnaTrim, offset.getInverse());
+ }
+
+ public void showPanel(boolean show)
+ {
+ this.setVisible(show);
+ }
+