JAL-2629 add ability to select hmmer binaries folder
[jalview.git] / src / jalview / hmmer / HMMAlignThread.java
1 package jalview.hmmer;
2
3 import jalview.bin.Cache;
4 import jalview.datamodel.AlignmentI;
5 import jalview.datamodel.AlignmentOrder;
6 import jalview.datamodel.HiddenMarkovModel;
7 import jalview.datamodel.SequenceI;
8 import jalview.gui.AlignFrame;
9 import jalview.gui.Preferences;
10 import jalview.io.DataSourceType;
11 import jalview.io.FileFormat;
12 import jalview.io.FileLoader;
13 import jalview.util.MessageManager;
14
15 import java.io.FileNotFoundException;
16 import java.io.IOException;
17 import java.util.HashMap;
18 import java.util.Map;
19
20 public class HMMAlignThread implements Runnable
21 {
22
23   AlignFrame af;
24
25   AlignmentI alignment;
26
27   HiddenMarkovModel hmm;
28
29   boolean newFrame;
30
31   long barID;
32
33   Map<Integer, SequenceI> hmmSeqs;
34
35   public HMMAlignThread(AlignFrame af, boolean createNewFrame)
36   {
37     this.af = af;
38     alignment = af.getViewport().getAlignment();
39     hmm = alignment.getSequenceAt(0).getHMM();
40     newFrame = createNewFrame;
41   }
42
43   @Override
44   public void run()
45   {
46     barID = System.currentTimeMillis();
47     af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
48             barID);
49     HMMERCommands.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
50     try
51     {
52       try
53       {
54         hmmSeqs = alignment.getHMMConsensusSequences(true);
55         HMMERCommands.exportData(alignment, true, true, hmm);
56       } catch (FileNotFoundException e)
57       {
58         // TODO Auto-generated catch block
59         e.printStackTrace();
60
61       }
62       try
63       {
64         runCommand();
65       } catch (IOException | InterruptedException e)
66       {
67         // TODO Auto-generated catch block
68         e.printStackTrace();
69       }
70       try
71       {
72         importData();
73       } catch (IOException | InterruptedException e)
74       {
75         // TODO Auto-generated catch block
76         e.printStackTrace();
77       }
78     } catch (Exception e)
79     {
80       e.printStackTrace();
81     } finally
82     {
83       af.setProgressBar(MessageManager.getString("status.running_hmmalign"),
84               barID);
85     }
86   }
87
88   private void runCommand() throws IOException, InterruptedException
89   {
90     String command = HMMERCommands.HMMERFOLDER + HMMERCommands.HMMALIGN;
91     if (!hmm.getFileHeader().contains("HMMER3/f"))
92     {
93       command += HMMERCommands.ALLCOL;
94     }
95     command += HMMERCommands.TRIM + HMMERCommands.OUTPUTALIGNMENT
96             + HMMERCommands.JALVIEWDIRECTORY + HMMERCommands.HMMBUFFER
97             + HMMERCommands.JALVIEWDIRECTORY
98             + HMMERCommands.ALIGNMENTBUFFER;
99     HMMERCommands.runCommand(command);
100   }
101
102   private void importData() throws IOException, InterruptedException
103   {
104     if (newFrame)
105     {
106       FileLoader loader = new FileLoader();
107       AlignmentOrder order = new AlignmentOrder(alignment);
108       AlignFrame newAFrame = loader.LoadFileWaitTillLoaded(
109               HMMERCommands.ALIGNMENTINPUT, DataSourceType.FILE);
110       Map<Integer, SequenceI> copy = new HashMap<>(
111               hmmSeqs);
112       addSeqs(newAFrame, copy);
113       SequenceI seq = newAFrame.getViewport().getAlignment()
114               .getSequenceAt(0);
115       hmm.mapToReferenceAnnotation(newAFrame, seq);
116       addSeqs(af, hmmSeqs);
117     }
118     else
119     {
120       af.getViewport().getAlignment().getSequences().clear();
121       af.setIsRecurring(true);
122       af.loadJalviewDataFile(HMMERCommands.ALIGNMENTBUFFER,
123               DataSourceType.FILE, FileFormat.Stockholm, null);
124       af.setIsRecurring(false);
125       addSeqs(af, hmmSeqs);
126     }
127   }
128
129   private void addSeqs(AlignFrame alignFrame, Map<Integer, SequenceI> map)
130   {
131     for (Map.Entry<Integer, SequenceI> entry : map.entrySet())
132     {
133       SequenceI seq = entry.getValue();
134       Integer pos = entry.getKey();
135       HMMERCommands.addHMMConsensusSequence(alignFrame, seq, pos);
136     }
137   }
138
139   }
140
141