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;
28 public class HMMAlignThread implements Runnable
32 * feature settings from view that job was associated with
34 protected FeatureRendererSettings featureSettings = null;
36 HMMERCommands cmds = new HMMERCommands();
44 List<AlignmentOrder> orders;
48 HiddenMarkovModel hmm;
54 Map<Integer, SequenceI> hmmSeqs;
60 File inputTemp = null;
62 List<AlignmentOrder> allOrders;
64 SequenceI[][] allResults;
66 public HMMAlignThread(AlignFrame af, boolean createNewFrame)
69 alignment = af.getViewport().getAlignment();
70 if (alignment.getDataset() != null)
72 dataset = alignment.getDataset();
74 hmm = alignment.getSequenceAt(0).getHMM();
75 newFrame = createNewFrame;
76 featureSettings = af.getFeatureRenderer().getSettings();
82 barID = System.currentTimeMillis();
83 af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
85 cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
87 // if (!alignment.isAligned())
89 // alignment.padGaps();
92 SequenceI[][] subAlignments = msa.getVisibleContigs('-');
93 allOrders = new ArrayList<>();
94 allResults = new SequenceI[subAlignments.length][];
96 for (SequenceI[] seqs : subAlignments)
98 cmds.uniquifySequences(seqs);
101 createTemporaryFiles();
102 } catch (IOException e2)
104 e2.printStackTrace();
108 cmds.exportData(seqs, outTemp.getAbsoluteFile(), hmm,
109 hmmTemp.getAbsoluteFile());
110 } catch (IOException e1)
112 e1.printStackTrace();
117 } catch (IOException | InterruptedException e)
124 } catch (IOException | InterruptedException e)
126 // TODO Auto-generated catch block
132 displayResults(newFrame);
134 af.setProgressBar(MessageManager.getString("status.running_hmmalign"),
139 private void createTemporaryFiles() throws IOException
141 hmmTemp = File.createTempFile("hmm", ".hmm");
142 hmmTemp.deleteOnExit();
143 outTemp = File.createTempFile("output", ".sto");
144 outTemp.deleteOnExit();
145 inputTemp = File.createTempFile("input", ".sto");
146 inputTemp.deleteOnExit();
149 private void runCommand() throws IOException, InterruptedException
151 String command = cmds.HMMERFOLDER + cmds.HMMALIGN;
152 if (!hmm.getFileHeader().contains("HMMER3/f"))
154 command += cmds.ALLCOL;
156 command += cmds.TRIM + " -o" + inputTemp.getAbsolutePath() + cmds.SPACE
157 + hmmTemp.getAbsolutePath() + cmds.SPACE
158 + outTemp.getAbsolutePath();
159 cmds.runCommand(command);
162 private void importData(int index)
163 throws IOException, InterruptedException
165 StockholmFile file = new StockholmFile(inputTemp.getAbsolutePath(),
166 DataSourceType.FILE);
167 SequenceI[] result = file.getSeqsAsArray();
168 AlignmentOrder msaorder = new AlignmentOrder(result);
169 // always recover the order - makes parseResult()'s life easier.
170 jalview.analysis.AlignmentSorter.recoverOrder(result);
171 jalview.analysis.SeqsetUtils.deuniquify(cmds.hash, result);
172 allOrders.add(msaorder);
173 allResults[index] = result;
178 FileLoader loader = new FileLoader();
179 AlignFrame aFrame = new AlignFrame(new Alignment(new SequenceI[1]),
180 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
181 Desktop.addInternalFrame(aFrame, aFrame.getTitle(),
182 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
184 af.getName() + "Aligned to " + hmm.getName() + "'s HMM");
185 af.getViewport().setAlignment(null);
187 aFrame.loadJalviewDataFile(inputTemp.getAbsolutePath(),
188 DataSourceType.FILE, FileFormat.Stockholm, null);
192 Map<Integer, SequenceI> copy = new HashMap<>(
194 addSeqs(aFrame, copy);
195 SequenceI seq = aFrame.getViewport().getAlignment()
197 seq.getHMM().mapToReferenceAnnotation(aFrame, seq);
198 addSeqs(af, hmmSeqs);
202 af.getViewport().getAlignment().getSequences().clear();
203 af.setIsRecurring(true);
204 af.loadJalviewDataFile(inputTemp.getAbsolutePath(),
205 DataSourceType.FILE, FileFormat.Stockholm, null);
206 af.setIsRecurring(false);
207 addSeqs(af, hmmSeqs);
215 private void addSeqs(AlignFrame alignFrame, Map<Integer, SequenceI> map)
217 for (Map.Entry<Integer, SequenceI> entry : map.entrySet())
219 SequenceI seq = entry.getValue();
220 Integer pos = entry.getKey();
221 cmds.addHMMConsensusSequence(alignFrame, seq, pos);
225 private void prepareAlignment()
227 // hmmSeqs = alignment.getHMMConsensusSequences(true);
228 msa = af.gatherSequencesForAlignment();
231 private void displayResults(boolean newFrame)
233 AlignmentOrder[] arrOrders = allOrders
234 .toArray(new AlignmentOrder[allOrders.size()]);
235 Object[] newview = msa.getUpdatedView(allResults,
237 SequenceI[] alignment = (SequenceI[]) newview[0];
238 HiddenColumns hidden = (HiddenColumns) newview[1];
239 Alignment al = new Alignment(alignment);
240 al.setProperty("Alignment Program", "hmmalign");
243 al.setDataset(dataset);
248 displayInNewFrame(al, allOrders, hidden);
252 private void displayInNewFrame(AlignmentI al,
253 List<AlignmentOrder> alorders, HiddenColumns hidden)
255 AlignFrame af = new AlignFrame(al, hidden, AlignFrame.DEFAULT_WIDTH,
256 AlignFrame.DEFAULT_HEIGHT);
258 // initialise with same renderer settings as in parent alignframe.
259 af.getFeatureRenderer().transferSettings(this.featureSettings);
261 if (allOrders.size() > 0)
263 addSortByMenuItems(af, allOrders);
266 // TODO: refactor retrieve and show as new splitFrame as Desktop method
269 * If alignment was requested from one half of a SplitFrame, show in a
270 * SplitFrame with the other pane similarly aligned.
272 AlignFrame requestedBy = this.af;
273 if (requestedBy != null && requestedBy.getSplitViewContainer() != null
274 && requestedBy.getSplitViewContainer()
275 .getComplement(requestedBy) != null)
277 AlignmentI complement = requestedBy.getSplitViewContainer()
278 .getComplement(requestedBy);
279 String complementTitle = requestedBy.getSplitViewContainer()
280 .getComplementTitle(requestedBy);
281 // becomes null if the alignment window was closed before the alignment
283 AlignmentI copyComplement = new Alignment(complement);
284 // todo should this be done by copy constructor?
285 copyComplement.setGapCharacter(complement.getGapCharacter());
286 // share the same dataset (and the mappings it holds)
287 copyComplement.setDataset(complement.getDataset());
288 copyComplement.alignAs(al);
289 if (copyComplement.getHeight() > 0)
291 af.setTitle(this.af.getTitle());
292 AlignFrame af2 = new AlignFrame(copyComplement,
293 AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
294 af2.setTitle(complementTitle);
295 String linkedTitle = MessageManager
296 .getString("label.linked_view_title");
297 JInternalFrame splitFrame = new SplitFrame(
298 al.isNucleotide() ? af : af2, al.isNucleotide() ? af2 : af);
299 Desktop.addInternalFrame(splitFrame, linkedTitle, -1, -1);
305 * Not from SplitFrame, or failed to created a complementary alignment
307 Desktop.addInternalFrame(af, af.getTitle(), AlignFrame.DEFAULT_WIDTH,
308 AlignFrame.DEFAULT_HEIGHT);
312 * Add sort order options to the AlignFrame menus.
317 protected void addSortByMenuItems(AlignFrame af,
318 List<AlignmentOrder> alorders)
321 if (alorders.size() == 1)
323 af.addSortByOrderMenuItem("hmmalign" + " Ordering", alorders.get(0));
327 // construct a non-redundant ordering set
328 List<String> names = new ArrayList<>();
329 for (int i = 0, l = alorders.size(); i < l; i++)
331 String orderName = " Region " + i;
336 if (alorders.get(i).equals(alorders.get(j)))
340 orderName += "," + j;
348 if (i == 0 && j == 1)
354 names.add(orderName);
357 for (int i = 0, l = alorders.size(); i < l; i++)
359 af.addSortByOrderMenuItem("hmmalign" + (names.get(i)) + " Ordering",