3 import jalview.bin.Cache;
4 import jalview.datamodel.Alignment;
5 import jalview.datamodel.AlignmentI;
6 import jalview.datamodel.AlignmentOrder;
7 import jalview.datamodel.AlignmentView;
8 import jalview.datamodel.HiddenColumns;
9 import jalview.datamodel.HiddenMarkovModel;
10 import jalview.datamodel.SequenceI;
11 import jalview.gui.AlignFrame;
12 import jalview.gui.Desktop;
13 import jalview.gui.Preferences;
14 import jalview.gui.SplitFrame;
15 import jalview.io.DataSourceType;
16 import jalview.io.StockholmFile;
17 import jalview.util.MessageManager;
18 import jalview.viewmodel.seqfeatures.FeatureRendererSettings;
21 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.List;
26 import javax.swing.JInternalFrame;
27 import javax.swing.JOptionPane;
29 public class HMMAlignThread implements Runnable
33 * feature settings from view that job was associated with
35 protected FeatureRendererSettings featureSettings = null;
37 HMMERCommands cmds = new HMMERCommands();
45 List<AlignmentOrder> orders;
49 HiddenMarkovModel hmm;
55 Map<Integer, SequenceI> hmmSeqs;
61 File inputTemp = null;
63 List<AlignmentOrder> allOrders;
65 SequenceI[][] allResults;
67 public HMMAlignThread(AlignFrame af, boolean createNewFrame)
70 alignment = af.getViewport().getAlignment();
71 if (alignment.getDataset() != null)
73 dataset = alignment.getDataset();
75 newFrame = createNewFrame;
76 featureSettings = af.getFeatureRenderer().getSettings();
82 if (af.getViewport().getSelectedHMM() == null)
84 JOptionPane.showMessageDialog(af,
85 MessageManager.getString("warn.no_selected_hmm"));
90 hmm = af.getViewport().getSelectedHMM();
92 barID = System.currentTimeMillis();
93 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
95 cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
97 // if (!alignment.isAligned())
99 // alignment.padGaps();
102 SequenceI[][] subAlignments = msa.getVisibleContigs('-');
103 allOrders = new ArrayList<>();
104 allResults = new SequenceI[subAlignments.length][];
106 for (SequenceI[] seqs : subAlignments)
108 cmds.uniquifySequences(seqs);
111 createTemporaryFiles();
112 } catch (IOException e2)
114 e2.printStackTrace();
118 cmds.exportData(seqs, outTemp.getAbsoluteFile(), hmm,
119 hmmTemp.getAbsoluteFile());
120 } catch (IOException e1)
122 e1.printStackTrace();
127 } catch (IOException | InterruptedException e)
134 } catch (IOException | InterruptedException e)
136 // TODO Auto-generated catch block
142 displayResults(newFrame);
144 af.setProgressBar(MessageManager.getString("status.running_hmmalign"),
149 private void createTemporaryFiles() throws IOException
151 hmmTemp = File.createTempFile("hmm", ".hmm");
152 hmmTemp.deleteOnExit();
153 outTemp = File.createTempFile("output", ".sto");
154 outTemp.deleteOnExit();
155 inputTemp = File.createTempFile("input", ".sto");
156 inputTemp.deleteOnExit();
159 private void runCommand() throws IOException, InterruptedException
161 String command = cmds.HMMERFOLDER + cmds.HMMALIGN;
162 if (!hmm.getFileHeader().contains("HMMER3/f"))
164 command += cmds.ALLCOL;
167 String bool = Cache.getProperty("TRIM_TERMINI");
168 if ("false".equals(bool))
174 command += cmds.TRIM;
176 command += " -o" + inputTemp.getAbsolutePath() + cmds.SPACE
177 + hmmTemp.getAbsolutePath() + cmds.SPACE
178 + outTemp.getAbsolutePath();
179 cmds.runCommand(command);
182 private void importData(int index)
183 throws IOException, InterruptedException
185 StockholmFile file = new StockholmFile(inputTemp.getAbsolutePath(),
186 DataSourceType.FILE);
187 SequenceI[] result = file.getSeqsAsArray();
188 AlignmentOrder msaorder = new AlignmentOrder(result);
189 // always recover the order - makes parseResult()'s life easier.
190 jalview.analysis.AlignmentSorter.recoverOrder(result);
191 jalview.analysis.SeqsetUtils.deuniquify(cmds.hash, result);
192 allOrders.add(msaorder);
193 allResults[index] = result;
198 FileLoader loader = new FileLoader();
199 AlignFrame aFrame = new AlignFrame(new Alignment(new SequenceI[1]),
200 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
201 Desktop.addInternalFrame(aFrame, aFrame.getTitle(),
202 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
204 af.getName() + "Aligned to " + hmm.getName() + "'s HMM");
205 af.getViewport().setAlignment(null);
207 aFrame.loadJalviewDataFile(inputTemp.getAbsolutePath(),
208 DataSourceType.FILE, FileFormat.Stockholm, null);
212 Map<Integer, SequenceI> copy = new HashMap<>(
214 addSeqs(aFrame, copy);
215 SequenceI seq = aFrame.getViewport().getAlignment()
217 seq.getHMM().mapToReferenceAnnotation(aFrame, seq);
218 addSeqs(af, hmmSeqs);
222 af.getViewport().getAlignment().getSequences().clear();
223 af.setIsRecurring(true);
224 af.loadJalviewDataFile(inputTemp.getAbsolutePath(),
225 DataSourceType.FILE, FileFormat.Stockholm, null);
226 af.setIsRecurring(false);
227 addSeqs(af, hmmSeqs);
235 private void prepareAlignment()
237 // hmmSeqs = alignment.getHMMConsensusSequences(true);
238 msa = af.gatherSequencesForAlignment();
241 private void displayResults(boolean newFrame)
243 AlignmentOrder[] arrOrders = allOrders
244 .toArray(new AlignmentOrder[allOrders.size()]);
245 Object[] newview = msa.getUpdatedView(allResults,
247 SequenceI[] alignment = (SequenceI[]) newview[0];
248 HiddenColumns hidden = (HiddenColumns) newview[1];
249 Alignment al = new Alignment(alignment);
250 al.setProperty("Alignment Program", "hmmalign");
253 al.setDataset(dataset);
258 displayInNewFrame(al, allOrders, hidden);
262 private void displayInNewFrame(AlignmentI al,
263 List<AlignmentOrder> alorders, HiddenColumns hidden)
265 AlignFrame af = new AlignFrame(al, hidden, AlignFrame.DEFAULT_WIDTH,
266 AlignFrame.DEFAULT_HEIGHT);
268 // initialise with same renderer settings as in parent alignframe.
269 af.getFeatureRenderer().transferSettings(this.featureSettings);
271 if (allOrders.size() > 0)
273 addSortByMenuItems(af, allOrders);
276 // TODO: refactor retrieve and show as new splitFrame as Desktop method
279 * If alignment was requested from one half of a SplitFrame, show in a
280 * SplitFrame with the other pane similarly aligned.
282 AlignFrame requestedBy = this.af;
283 if (requestedBy != null && requestedBy.getSplitViewContainer() != null
284 && requestedBy.getSplitViewContainer()
285 .getComplement(requestedBy) != null)
287 AlignmentI complement = requestedBy.getSplitViewContainer()
288 .getComplement(requestedBy);
289 String complementTitle = requestedBy.getSplitViewContainer()
290 .getComplementTitle(requestedBy);
291 // becomes null if the alignment window was closed before the alignment
293 AlignmentI copyComplement = new Alignment(complement);
294 // todo should this be done by copy constructor?
295 copyComplement.setGapCharacter(complement.getGapCharacter());
296 // share the same dataset (and the mappings it holds)
297 copyComplement.setDataset(complement.getDataset());
298 copyComplement.alignAs(al);
299 if (copyComplement.getHeight() > 0)
301 af.setTitle(this.af.getTitle());
302 AlignFrame af2 = new AlignFrame(copyComplement,
303 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
304 af2.setTitle(complementTitle);
305 String linkedTitle = MessageManager
306 .getString("label.linked_view_title");
307 JInternalFrame splitFrame = new SplitFrame(
308 al.isNucleotide() ? af : af2, al.isNucleotide() ? af2 : af);
309 Desktop.addInternalFrame(splitFrame, linkedTitle, -1, -1);
315 * Not from SplitFrame, or failed to created a complementary alignment
317 Desktop.addInternalFrame(af, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
318 AlignFrame.DEFAULT_HEIGHT);
322 * Add sort order options to the AlignFrame menus.
327 protected void addSortByMenuItems(AlignFrame af,
328 List<AlignmentOrder> alorders)
331 if (alorders.size() == 1)
333 af.addSortByOrderMenuItem("hmmalign" + " Ordering", alorders.get(0));
337 // construct a non-redundant ordering set
338 List<String> names = new ArrayList<>();
339 for (int i = 0, l = alorders.size(); i < l; i++)
341 String orderName = " Region " + i;
346 if (alorders.get(i).equals(alorders.get(j)))
350 orderName += "," + j;
358 if (i == 0 && j == 1)
364 names.add(orderName);
367 for (int i = 0, l = alorders.size(); i < l; i++)
369 af.addSortByOrderMenuItem("hmmalign" + (names.get(i)) + " Ordering",