JAL-1365 test that RNAAliFold service settings are stored and recovered from Jalview...
[jalview.git] / test / jalview / ws / jabaws / RNAStructExportImport.java
1 package jalview.ws.jabaws;
2
3 import static org.junit.Assert.*;
4
5 import java.awt.Component;
6 import java.util.ArrayList;
7 import java.util.Arrays;
8 import java.util.List;
9 import java.util.Vector;
10
11 import javax.swing.JMenu;
12 import javax.swing.JMenuItem;
13
14 import jalview.api.AlignCalcManagerI;
15 import jalview.datamodel.AlignmentAnnotation;
16 import jalview.datamodel.AlignmentI;
17 import jalview.datamodel.Annotation;
18 import jalview.gui.Jalview2XML;
19 import jalview.io.AnnotationFile;
20 import jalview.io.FormatAdapter;
21 import jalview.io.StockholmFileTest;
22 import jalview.ws.jws2.AADisorderClient;
23 import jalview.ws.jws2.Jws2Discoverer;
24 import jalview.ws.jws2.RNAalifoldClient;
25 import jalview.ws.jws2.SequenceAnnotationWSClient;
26 import jalview.ws.jws2.dm.JabaOption;
27 import jalview.ws.jws2.jabaws2.Jws2Instance;
28 import jalview.ws.params.AutoCalcSetting;
29
30 import org.junit.AfterClass;
31 import org.junit.BeforeClass;
32 import org.junit.Test;
33
34 import compbio.metadata.WrongParameterException;
35
36 public class RNAStructExportImport
37 {
38   public static String testseqs = "examples/unfolded_RF00031.aln";
39
40   public static Jws2Discoverer disc;
41
42   public static Jws2Instance rnaalifoldws;
43
44   jalview.ws.jws2.RNAalifoldClient alifoldClient;
45
46   public static jalview.gui.AlignFrame af = null;
47
48   @BeforeClass
49   public static void setUpBeforeClass() throws Exception
50   {
51
52     jalview.bin.Cache.initLogger();
53     disc = JalviewJabawsTestUtils.getJabawsDiscoverer();
54
55     for (Jws2Instance svc : disc.getServices())
56     {
57
58       if (svc.getServiceTypeURI().toLowerCase().contains("rnaalifoldws"))
59       {
60         rnaalifoldws = svc;
61       }
62     }
63
64     System.out.println("State of rnaalifoldws: " + rnaalifoldws);
65
66     if (rnaalifoldws == null)
67       System.exit(0);
68
69     jalview.io.FileLoader fl = new jalview.io.FileLoader(false);
70
71     af = fl.LoadFileWaitTillLoaded(testseqs, jalview.io.FormatAdapter.FILE);
72
73     assertNotNull("Couldn't load test data ('" + testseqs + "')", af);
74
75   }
76
77   @AfterClass
78   public static void tearDownAfterClass() throws Exception
79   {
80     if (af != null)
81     {
82       af.setVisible(false);
83       af.dispose();
84     }
85   }
86
87   @Test
88   public void testRNAStructExport()
89   {
90
91     alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, null);
92
93     af.getViewport().getCalcManager().startWorker(alifoldClient);
94
95     do
96     {
97       try
98       {
99         Thread.sleep(50);
100       } catch (InterruptedException x)
101       {
102       }
103       ;
104     } while (af.getViewport().getCalcManager().isWorking());
105
106     AlignmentI orig_alig = af.getViewport().getAlignment();
107
108     testAnnotationFileIO("Testing RNAalifold Annotation IO", orig_alig);
109
110   }
111
112   public static void testAnnotationFileIO(String testname, AlignmentI al)
113   {
114     try
115     {
116       // what format would be appropriate for RNAalifold annotations?
117       String aligfileout = new FormatAdapter().formatSequences("PFAM",
118               al.getSequencesArray());
119
120       String anfileout = new AnnotationFile().printAnnotations(
121               al.getAlignmentAnnotation(), al.getGroups(),
122               al.getProperties());
123       assertTrue(
124               "Test "
125                       + testname
126                       + "\nAlignment annotation file was not regenerated. Null string",
127               anfileout != null);
128       assertTrue(
129               "Test "
130                       + testname
131                       + "\nAlignment annotation file was not regenerated. Empty string",
132               anfileout.length() > "JALVIEW_ANNOTATION".length());
133
134       System.out.println("Output annotation file:\n" + anfileout
135               + "\n<<EOF\n");
136
137       // again what format would be appropriate?
138       AlignmentI al_new = new FormatAdapter().readFile(aligfileout,
139               FormatAdapter.PASTE, "PFAM");
140       assertTrue(
141               "Test "
142                       + testname
143                       + "\nregenerated annotation file did not annotate alignment.",
144               new AnnotationFile().readAnnotationFile(al_new, anfileout,
145                       FormatAdapter.PASTE));
146
147       // test for consistency in io
148       StockholmFileTest.testAlignmentEquivalence(al, al_new);
149       return;
150     } catch (Exception e)
151     {
152       e.printStackTrace();
153     }
154     fail("Test "
155             + testname
156             + "\nCouldn't complete Annotation file roundtrip input/output/input test.");
157   }
158
159   @Test
160   public void testRnaalifoldSettingsRecovery()
161   {
162     List<compbio.metadata.Argument> opts = new ArrayList<compbio.metadata.Argument>();
163     for (compbio.metadata.Argument rg : (List<compbio.metadata.Argument>) rnaalifoldws
164             .getRunnerConfig().getArguments())
165     {
166       if (rg.getDescription().contains("emperature"))
167       {
168         try
169         {
170           rg.setValue("292");
171         } catch (WrongParameterException q)
172         {
173           fail("Couldn't set the temperature parameter "
174                   + q.getStackTrace());
175         }
176         opts.add(rg);
177       }
178       if (rg.getDescription().contains("max"))
179       {
180         opts.add(rg);
181       }
182     }
183     alifoldClient = new RNAalifoldClient(rnaalifoldws, af, null, opts);
184     
185     af.getViewport().getCalcManager().startWorker(alifoldClient);
186     
187     do
188     {
189       try
190       {
191         Thread.sleep(50);
192       } catch (InterruptedException x)
193       {
194       }
195       ;
196     } while (af.getViewport().getCalcManager().isWorking());
197     AutoCalcSetting oldacs = af.getViewport().getCalcIdSettingsFor(alifoldClient.getCalcId());
198     String oldsettings = oldacs.getWsParamFile();
199     // write out parameters
200     jalview.gui.AlignFrame nalf=null;
201     assertTrue("Couldn't write out the Jar file",new Jalview2XML(false).SaveAlignment(af, "testRnalifold_param.jar","trial parameter writeout"));
202     assertTrue("Couldn't read back the Jar file",(nalf = new Jalview2XML(false).LoadJalviewAlign("testRnalifold_param.jar"))!=null);
203     if (nalf!=null)
204     {
205       AutoCalcSetting acs = af.getViewport().getCalcIdSettingsFor(alifoldClient.getCalcId());
206       assertTrue("Calc ID settings not recovered from viewport stash", acs.equals(oldacs));
207       assertTrue("Serialised Calc ID settings not identical to those recovered from viewport stash", acs.getWsParamFile().equals(oldsettings));
208       JMenu nmenu=new JMenu();
209       new SequenceAnnotationWSClient().attachWSMenuEntry(nmenu, rnaalifoldws, af);
210       assertTrue("Couldn't get menu entry for service",nmenu.getItemCount()>0);
211       for (Component itm: nmenu.getMenuComponents())
212       {
213         if (itm instanceof JMenuItem)
214         {
215           JMenuItem i = (JMenuItem) itm;
216           if (i.getText().equals(rnaalifoldws.getAlignAnalysisUI().getAAconToggle()))
217                   {
218             i.doClick();
219             break;
220                   }
221         }
222       }
223       while (af.getViewport().isCalcInProgress())
224       {
225         try { Thread.sleep(200);
226         } catch (Exception x) {};
227       }
228       AutoCalcSetting acs2 = af.getViewport().getCalcIdSettingsFor(alifoldClient.getCalcId());
229       assertTrue("Calc ID settings after recalculation has not been recovered.", acs2.getWsParamFile().equals(oldsettings));
230     }
231   }
232 }