23c775137d3d04d3c1b0b3304b3c22e756089431
[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     testAnnotationFileIO("Testing RNAalifold Annotation IO", orig_alig);
207
208   }
209
210   public static void testAnnotationFileIO(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);
246       return;
247     } catch (Exception e)
248     {
249       e.printStackTrace();
250     }
251     Assert.fail("Test "
252             + testname
253             + "\nCouldn't complete Annotation file roundtrip input/output/input test.");
254   }
255
256   @Test(groups = { "Network" })
257   public void testRnaalifoldSettingsRecovery()
258   {
259     List<Argument> opts = new ArrayList<Argument>();
260     for (Argument rg : (List<Argument>) rnaalifoldws.getRunnerConfig()
261             .getArguments())
262     {
263       if (rg.getDescription().contains("emperature"))
264       {
265         try
266         {
267           rg.setValue("292");
268         } catch (WrongParameterException q)
269         {
270           Assert.fail("Couldn't set the temperature parameter "
271                   + q.getStackTrace());
272         }
273         opts.add(rg);
274       }
275       if (rg.getDescription().contains("max"))
276       {
277         opts.add(rg);
278       }
279     }
280     alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, opts);
281
282     af.getViewport().getCalcManager().startWorker(alifoldClient);
283
284     do
285     {
286       try
287       {
288         Thread.sleep(50);
289       } catch (InterruptedException x)
290       {
291       }
292       ;
293     } while (af.getViewport().getCalcManager().isWorking());
294     AutoCalcSetting oldacs = af.getViewport().getCalcIdSettingsFor(
295             alifoldClient.getCalcId());
296     String oldsettings = oldacs.getWsParamFile();
297     // write out parameters
298     jalview.gui.AlignFrame nalf = null;
299     assertTrue("Couldn't write out the Jar file",
300             new Jalview2XML(false).saveAlignment(af, JAR_FILE_NAME,
301                     "trial parameter writeout"));
302     assertTrue("Couldn't read back the Jar file", (nalf = new Jalview2XML(
303             false).loadJalviewAlign(JAR_FILE_NAME)) != null);
304     if (nalf != null)
305     {
306       AutoCalcSetting acs = af.getViewport().getCalcIdSettingsFor(
307               alifoldClient.getCalcId());
308       assertTrue("Calc ID settings not recovered from viewport stash",
309               acs.equals(oldacs));
310       assertTrue(
311               "Serialised Calc ID settings not identical to those recovered from viewport stash",
312               acs.getWsParamFile().equals(oldsettings));
313       JMenu nmenu = new JMenu();
314       new SequenceAnnotationWSClient().attachWSMenuEntry(nmenu,
315               rnaalifoldws, af);
316       assertTrue("Couldn't get menu entry for service",
317               nmenu.getItemCount() > 0);
318       for (Component itm : nmenu.getMenuComponents())
319       {
320         if (itm instanceof JMenuItem)
321         {
322           JMenuItem i = (JMenuItem) itm;
323           if (i.getText().equals(
324                   rnaalifoldws.getAlignAnalysisUI().getAAconToggle()))
325           {
326             i.doClick();
327             break;
328           }
329         }
330       }
331       while (af.getViewport().isCalcInProgress())
332       {
333         try
334         {
335           Thread.sleep(200);
336         } catch (Exception x)
337         {
338         }
339         ;
340       }
341       AutoCalcSetting acs2 = af.getViewport().getCalcIdSettingsFor(
342               alifoldClient.getCalcId());
343       assertTrue(
344               "Calc ID settings after recalculation has not been recovered.",
345               acs2.getWsParamFile().equals(oldsettings));
346     }
347   }
348 }