JAL-2507 - required callers to specify exact ignore flags for StockholmFileTest.testA...
[jalview.git] / test / jalview / ws / jabaws / RNAStructExportImport.java
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.ws.jabaws;
22
23 import static org.testng.AssertJUnit.assertNotNull;
24 import static org.testng.AssertJUnit.assertTrue;
25
26 import jalview.bin.Cache;
27 import jalview.datamodel.AlignmentAnnotation;
28 import jalview.datamodel.AlignmentI;
29 import jalview.gui.Jalview2XML;
30 import jalview.gui.JvOptionPane;
31 import jalview.io.AnnotationFile;
32 import jalview.io.DataSourceType;
33 import jalview.io.FileFormat;
34 import jalview.io.FormatAdapter;
35 import jalview.io.StockholmFileTest;
36 import jalview.ws.jws2.Jws2Discoverer;
37 import jalview.ws.jws2.RNAalifoldClient;
38 import jalview.ws.jws2.SequenceAnnotationWSClient;
39 import jalview.ws.jws2.jabaws2.Jws2Instance;
40 import jalview.ws.params.AutoCalcSetting;
41
42 import java.awt.Component;
43 import java.io.File;
44 import java.util.ArrayList;
45 import java.util.List;
46
47 import javax.swing.JMenu;
48 import javax.swing.JMenuItem;
49
50 import org.testng.Assert;
51 import org.testng.annotations.AfterClass;
52 import org.testng.annotations.BeforeClass;
53 import org.testng.annotations.Test;
54
55 import compbio.metadata.Argument;
56 import compbio.metadata.WrongParameterException;
57
58 /*
59  * All methods in this class are set to the Network group because setUpBeforeClass will fail
60  * if there is no network.
61  */
62 @Test(singleThreaded = true)
63 public class RNAStructExportImport
64 {
65
66   @BeforeClass(alwaysRun = true)
67   public void setUpJvOptionPane()
68   {
69     JvOptionPane.setInteractiveMode(false);
70     JvOptionPane.setMockResponse(JvOptionPane.CANCEL_OPTION);
71   }
72
73   private static final String JAR_FILE_NAME = "testRnalifold_param.jar";
74
75   public static String testseqs = "examples/RF00031_folded.stk";
76
77   public static Jws2Discoverer disc;
78
79   public static Jws2Instance rnaalifoldws;
80
81   jalview.ws.jws2.RNAalifoldClient alifoldClient;
82
83   public static jalview.gui.AlignFrame af = null;
84
85   @BeforeClass(alwaysRun = true)
86   public static void setUpBeforeClass() throws Exception
87   {
88     Cache.loadProperties("test/jalview/io/testProps.jvprops");
89     Cache.initLogger();
90     disc = JalviewJabawsTestUtils.getJabawsDiscoverer(false);
91
92     while (disc.isRunning())
93     {
94       // don't get services until discoverer has finished
95       Thread.sleep(100);
96     }
97
98     for (Jws2Instance svc : disc.getServices())
99     {
100
101       if (svc.getServiceTypeURI().toLowerCase().contains("rnaalifoldws"))
102       {
103         rnaalifoldws = svc;
104       }
105     }
106
107     System.out.println("State of rnaalifoldws: " + rnaalifoldws);
108
109     if (rnaalifoldws == null)
110     {
111       Assert.fail("no web service");
112     }
113
114     jalview.io.FileLoader fl = new jalview.io.FileLoader(false);
115
116     af = fl.LoadFileWaitTillLoaded(testseqs, jalview.io.DataSourceType.FILE);
117
118     assertNotNull("Couldn't load test data ('" + testseqs + "')", af);
119
120     // remove any existing annotation
121     List<AlignmentAnnotation> aal = new ArrayList<AlignmentAnnotation>();
122     for (AlignmentAnnotation rna : af.getViewport().getAlignment()
123             .getAlignmentAnnotation())
124     {
125       if (rna.isRNA())
126       {
127         aal.add(rna);
128       }
129     }
130     for (AlignmentAnnotation rna : aal)
131     {
132       af.getViewport().getAlignment().deleteAnnotation(rna);
133     }
134     af.getViewport().alignmentChanged(af.alignPanel); // why is af.alignPanel
135                                                       // public?
136   }
137
138   @AfterClass(alwaysRun = true)
139   public static void tearDownAfterClass() throws Exception
140   {
141     if (af != null)
142     {
143       af.setVisible(false);
144       af.dispose();
145       File f = new File(JAR_FILE_NAME);
146       if (f.exists())
147       {
148         f.delete();
149       }
150     }
151   }
152
153   @Test(groups = { "Network" })
154   public void testRNAAliFoldValidStructure()
155   {
156
157     alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, null);
158
159     af.getViewport().getCalcManager().startWorker(alifoldClient);
160
161     do
162     {
163       try
164       {
165         Thread.sleep(50);
166       } catch (InterruptedException x)
167       {
168       }
169     } while (af.getViewport().getCalcManager().isWorking());
170
171     AlignmentI orig_alig = af.getViewport().getAlignment();
172     for (AlignmentAnnotation aa : orig_alig.getAlignmentAnnotation())
173     {
174       if (alifoldClient.involves(aa))
175       {
176         if (aa.isRNA())
177         {
178           assertTrue(
179                   "Did not create valid structure from RNAALiFold prediction",
180                   aa.isValidStruc());
181         }
182       }
183     }
184   }
185
186   @Test(groups = { "Network" })
187   public void testRNAStructExport()
188   {
189
190     alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, null);
191
192     af.getViewport().getCalcManager().startWorker(alifoldClient);
193
194     do
195     {
196       try
197       {
198         Thread.sleep(50);
199       } catch (InterruptedException x)
200       {
201       }
202     } while (af.getViewport().getCalcManager().isWorking());
203
204     AlignmentI orig_alig = af.getViewport().getAlignment();
205
206     verifyAnnotationFileIO("Testing RNAalifold Annotation IO", orig_alig);
207
208   }
209
210   static void verifyAnnotationFileIO(String testname, AlignmentI al)
211   {
212     try
213     {
214       // what format would be appropriate for RNAalifold annotations?
215       String aligfileout = FileFormat.Pfam.getWriter(null).print(
216               al.getSequencesArray(), true);
217
218       String anfileout = new AnnotationFile()
219               .printAnnotationsForAlignment(al);
220       assertNotNull(
221               "Test "
222                       + testname
223                       + "\nAlignment annotation file was not regenerated. Null string",
224               anfileout);
225       assertTrue(
226               "Test "
227                       + testname
228                       + "\nAlignment annotation file was not regenerated. Empty string",
229               anfileout.length() > "JALVIEW_ANNOTATION".length());
230
231       System.out.println("Output annotation file:\n" + anfileout
232               + "\n<<EOF\n");
233
234       // again what format would be appropriate?
235       AlignmentI al_new = new FormatAdapter().readFile(aligfileout,
236               DataSourceType.PASTE, FileFormat.Pfam);
237       assertTrue(
238               "Test "
239                       + testname
240                       + "\nregenerated annotation file did not annotate alignment.",
241               new AnnotationFile().readAnnotationFile(al_new, anfileout,
242                       DataSourceType.PASTE));
243
244       // test for consistency in io
245       StockholmFileTest.testAlignmentEquivalence(al, al_new, false, false,
246               false);
247       return;
248     } catch (Exception e)
249     {
250       e.printStackTrace();
251     }
252     Assert.fail("Test "
253             + testname
254             + "\nCouldn't complete Annotation file roundtrip input/output/input test.");
255   }
256
257   @Test(groups = { "Network" })
258   public void testRnaalifoldSettingsRecovery()
259   {
260     List<Argument> opts = new ArrayList<Argument>();
261     for (Argument rg : (List<Argument>) rnaalifoldws.getRunnerConfig()
262             .getArguments())
263     {
264       if (rg.getDescription().contains("emperature"))
265       {
266         try
267         {
268           rg.setValue("292");
269         } catch (WrongParameterException q)
270         {
271           Assert.fail("Couldn't set the temperature parameter "
272                   + q.getStackTrace());
273         }
274         opts.add(rg);
275       }
276       if (rg.getDescription().contains("max"))
277       {
278         opts.add(rg);
279       }
280     }
281     alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, opts);
282
283     af.getViewport().getCalcManager().startWorker(alifoldClient);
284
285     do
286     {
287       try
288       {
289         Thread.sleep(50);
290       } catch (InterruptedException x)
291       {
292       }
293       ;
294     } while (af.getViewport().getCalcManager().isWorking());
295     AutoCalcSetting oldacs = af.getViewport().getCalcIdSettingsFor(
296             alifoldClient.getCalcId());
297     String oldsettings = oldacs.getWsParamFile();
298     // write out parameters
299     jalview.gui.AlignFrame nalf = null;
300     assertTrue("Couldn't write out the Jar file",
301             new Jalview2XML(false).saveAlignment(af, JAR_FILE_NAME,
302                     "trial parameter writeout"));
303     assertTrue("Couldn't read back the Jar file", (nalf = new Jalview2XML(
304             false).loadJalviewAlign(JAR_FILE_NAME)) != null);
305     if (nalf != null)
306     {
307       AutoCalcSetting acs = af.getViewport().getCalcIdSettingsFor(
308               alifoldClient.getCalcId());
309       assertTrue("Calc ID settings not recovered from viewport stash",
310               acs.equals(oldacs));
311       assertTrue(
312               "Serialised Calc ID settings not identical to those recovered from viewport stash",
313               acs.getWsParamFile().equals(oldsettings));
314       JMenu nmenu = new JMenu();
315       new SequenceAnnotationWSClient().attachWSMenuEntry(nmenu,
316               rnaalifoldws, af);
317       assertTrue("Couldn't get menu entry for service",
318               nmenu.getItemCount() > 0);
319       for (Component itm : nmenu.getMenuComponents())
320       {
321         if (itm instanceof JMenuItem)
322         {
323           JMenuItem i = (JMenuItem) itm;
324           if (i.getText().equals(
325                   rnaalifoldws.getAlignAnalysisUI().getAAconToggle()))
326           {
327             i.doClick();
328             break;
329           }
330         }
331       }
332       while (af.getViewport().isCalcInProgress())
333       {
334         try
335         {
336           Thread.sleep(200);
337         } catch (Exception x)
338         {
339         }
340         ;
341       }
342       AutoCalcSetting acs2 = af.getViewport().getCalcIdSettingsFor(
343               alifoldClient.getCalcId());
344       assertTrue(
345               "Calc ID settings after recalculation has not been recovered.",
346               acs2.getWsParamFile().equals(oldsettings));
347     }
348   }
349 }