JAL-2629 fix files permission issue on Mac
[jalview.git] / src / jalview / hmmer / HMMAlignThread.java
1 package jalview.hmmer;
2
3 import jalview.bin.Cache;
4 import jalview.datamodel.Alignment;
5 import jalview.datamodel.AlignmentI;
6 import jalview.datamodel.HiddenMarkovModel;
7 import jalview.datamodel.SequenceI;
8 import jalview.gui.AlignFrame;
9 import jalview.gui.Desktop;
10 import jalview.gui.Preferences;
11 import jalview.io.DataSourceType;
12 import jalview.io.FileFormat;
13 import jalview.io.FileLoader;
14 import jalview.util.MessageManager;
15
16 import java.io.File;
17 import java.io.FileNotFoundException;
18 import java.io.IOException;
19 import java.util.HashMap;
20 import java.util.Map;
21
22 public class HMMAlignThread implements Runnable
23 {
24   HMMERCommands cmds = new HMMERCommands();
25
26   AlignFrame af;
27
28   AlignmentI alignment;
29
30   HiddenMarkovModel hmm;
31
32   boolean newFrame;
33
34   long barID;
35
36   Map<Integer, SequenceI> hmmSeqs;
37
38   File hmmTemp = null;
39
40   File outTemp = null;
41
42   File inputTemp = null;
43
44   public HMMAlignThread(AlignFrame af, boolean createNewFrame)
45   {
46     this.af = af;
47     alignment = af.getViewport().getAlignment();
48     hmm = alignment.getSequenceAt(0).getHMM();
49     newFrame = createNewFrame;
50   }
51
52   @Override
53   public void run()
54   {
55     barID = System.currentTimeMillis();
56     af.setProgressBar(MessageManager.getString("status.running_hmmbuild"),
57             barID);
58     cmds.HMMERFOLDER = Cache.getProperty(Preferences.HMMER_PATH);
59     try
60     {
61       hmmTemp = File.createTempFile("hmm", ".hmm");
62       hmmTemp.deleteOnExit();
63       outTemp = File.createTempFile("output", ".sto");
64       outTemp.deleteOnExit();
65       inputTemp = File.createTempFile("input", ".sto");
66       inputTemp.deleteOnExit();
67     } catch (IOException e1)
68     {
69       // TODO Auto-generated catch block
70       e1.printStackTrace();
71     }
72
73     try
74     {
75       try
76       {
77         hmmSeqs = alignment.getHMMConsensusSequences(true);
78         cmds.exportData(alignment, outTemp.getAbsoluteFile(), hmm,
79                 hmmTemp.getAbsoluteFile());
80       } catch (FileNotFoundException e)
81       {
82         // TODO Auto-generated catch block
83         e.printStackTrace();
84
85       }
86       try
87       {
88         runCommand();
89       } catch (IOException | InterruptedException e)
90       {
91         // TODO Auto-generated catch block
92         e.printStackTrace();
93       }
94       try
95       {
96         importData();
97       } catch (IOException | InterruptedException e)
98       {
99         // TODO Auto-generated catch block
100         e.printStackTrace();
101       }
102     } catch (Exception e)
103     {
104       e.printStackTrace();
105     } finally
106     {
107       af.setProgressBar(MessageManager.getString("status.running_hmmalign"),
108               barID);
109     }
110   }
111
112   private void runCommand() throws IOException, InterruptedException
113   {
114     String command = cmds.HMMERFOLDER + cmds.HMMALIGN;
115     if (!hmm.getFileHeader().contains("HMMER3/f"))
116     {
117       command += cmds.ALLCOL;
118     }
119     command += cmds.TRIM + " -o" + inputTemp.getAbsolutePath() + cmds.SPACE
120             + hmmTemp.getAbsolutePath() + cmds.SPACE
121             + outTemp.getAbsolutePath();
122     cmds.runCommand(command);
123   }
124
125   private void importData() throws IOException, InterruptedException
126   {
127     if (newFrame)
128     {
129       FileLoader loader = new FileLoader();
130       AlignFrame aFrame = new AlignFrame(new Alignment(new SequenceI[1]),
131               AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
132       Desktop.addInternalFrame(aFrame, aFrame.getTitle(),
133               AlignFrame.DEFAULT_WIDTH, AlignFrame.DEFAULT_HEIGHT);
134       aFrame.setTitle(
135               af.getName() + "Aligned to " + hmm.getName() + "'s HMM");
136       af.getViewport().setAlignment(null);
137
138       aFrame.loadJalviewDataFile(inputTemp.getAbsolutePath(),
139               DataSourceType.FILE, FileFormat.Stockholm, null);
140
141
142
143       Map<Integer, SequenceI> copy = new HashMap<>(
144               hmmSeqs);
145       addSeqs(aFrame, copy);
146       SequenceI seq = aFrame.getViewport().getAlignment()
147               .getSequenceAt(0);
148       seq.getHMM().mapToReferenceAnnotation(aFrame, seq);
149       addSeqs(af, hmmSeqs);
150     }
151     else
152     {
153       af.getViewport().getAlignment().getSequences().clear();
154       af.setIsRecurring(true);
155       af.loadJalviewDataFile(inputTemp.getAbsolutePath(),
156               DataSourceType.FILE, FileFormat.Stockholm, null);
157       af.setIsRecurring(false);
158       addSeqs(af, hmmSeqs);
159     }
160     hmmTemp.delete();
161     outTemp.delete();
162     inputTemp.delete();
163   }
164
165   private void addSeqs(AlignFrame alignFrame, Map<Integer, SequenceI> map)
166   {
167     for (Map.Entry<Integer, SequenceI> entry : map.entrySet())
168     {
169       SequenceI seq = entry.getValue();
170       Integer pos = entry.getKey();
171       cmds.addHMMConsensusSequence(alignFrame, seq, pos);
172     }
173   }
174
175   }
176
177