1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 package ffx.potential.parsers;
39
40 import ffx.potential.bonded.Residue;
41
42 import java.io.BufferedReader;
43 import java.io.BufferedWriter;
44 import java.io.File;
45 import java.io.FileReader;
46 import java.io.FileWriter;
47 import java.io.IOException;
48 import java.util.List;
49 import java.util.logging.Level;
50 import java.util.logging.Logger;
51
52 import static java.lang.Double.parseDouble;
53 import static java.lang.String.format;
54
55
56
57
58
59
60
61 public class ESVFilter {
62
63 private static final Logger logger = Logger.getLogger(ESVFilter.class.getName());
64 private final String label;
65
66
67
68
69
70
71 public ESVFilter(String label) {
72 this.label = label;
73 }
74
75 public String getLambdaHistogram(List<Residue> titratingResidueList, final int[][][] esvHistogram,
76 double pH) {
77 int nTitr = titratingResidueList.size();
78
79 StringBuilder tautomerHeader = new StringBuilder(" X");
80 for (int k = 0; k < 10; k++) {
81 tautomerHeader.append(String.format(" %1$10s", "[" + k / 10.0 + "-" + (k + 1) / 10.0 + "]"));
82 }
83 tautomerHeader.append("\n λ\n");
84
85 StringBuilder[] histogram = new StringBuilder[nTitr];
86 for (int i = 0; i < nTitr; i++) {
87 StringBuilder hist = new StringBuilder();
88 hist.append(format(" ESV: %s (%d) pH: %4.2f\n", titratingResidueList.get(i), i, pH));
89 hist.append(tautomerHeader);
90 for (int j = 0; j < 10; j++) {
91 hist.append(" [").append(j / 10.0).append("-").append((j + 1) / 10.0).append("]");
92 for (int k = 0; k < 10; k++) {
93 hist.append(String.format("%1$10s", esvHistogram[i][j][k]));
94 }
95 hist.append("\n");
96 }
97 histogram[i] = hist.append("\n");
98 }
99
100 StringBuilder histograms = new StringBuilder();
101 for (int i = 0; i < nTitr; i++) {
102 histograms.append(histogram[i]);
103 }
104 return String.valueOf(histograms);
105 }
106
107
108
109
110
111
112
113
114
115
116 public boolean readESV(File esvFile, double[] x, double[] v, double[] a, final int[][][] esvHist) {
117 if (!esvFile.exists() || !esvFile.canRead()) {
118 return false;
119 }
120 try (BufferedReader br = new BufferedReader(new FileReader(esvFile))) {
121 br.readLine();
122 String data = br.readLine().trim();
123 String[] tokens = data.split(" +");
124 if (tokens.length == 0) {
125 return false;
126 }
127 int numESVs = Integer.parseInt(tokens[0]);
128
129
130 br.readLine();
131 for (int i = 0; i < numESVs; i++) {
132 data = br.readLine().trim();
133 tokens = data.split(" +");
134 if (tokens.length != 1) {
135 return false;
136 }
137 x[i] = parseDouble(tokens[0]);
138 }
139
140
141 br.readLine();
142 for (int i = 0; i < numESVs; i++) {
143 data = br.readLine().trim();
144 tokens = data.split(" +");
145 if (tokens.length != 1) {
146 return false;
147 }
148 v[i] = parseDouble(tokens[0]);
149 }
150
151
152 br.readLine();
153 for (int i = 0; i < numESVs; i++) {
154 data = br.readLine().trim();
155 tokens = data.split(" +");
156 if (tokens.length != 1) {
157 return false;
158 }
159 a[i] = parseDouble(tokens[0]);
160 }
161
162
163 for (int i = 0; i < esvHist.length; i++) {
164 for (int j = 0; j < 4; j++) {
165 br.readLine();
166 }
167 for (int j = 0; j < esvHist[i].length; j++) {
168 data = br.readLine().trim();
169 tokens = data.split(" +");
170 for (int k = 0; k < esvHist[i][j].length; k++) {
171 esvHist[i][j][k] = Integer.parseInt(tokens[k + 1]);
172 }
173 }
174 }
175 } catch (Exception e) {
176 String message = "Exception reading ESV restart file: " + esvFile;
177 logger.log(Level.WARNING, message, e);
178 }
179 return true;
180 }
181
182
183
184
185
186
187
188
189
190
191
192
193
194 public boolean writeESV(File dynFile, double[] x, double[] v, double[] a,
195 List<Residue> titrResList, final int[][][] esvHist, double pH) {
196 try (FileWriter fw = new FileWriter(dynFile); BufferedWriter bw = new BufferedWriter(fw)) {
197 bw.write(" Number of ESVs and Title :\n");
198 int numberOfAtoms = x.length;
199 String output = format("%7d %s\n", numberOfAtoms, label);
200 bw.write(output);
201 bw.write(" Current Theta Positions :\n");
202 for (int i = 0; i < numberOfAtoms; i++) {
203 bw.write(format("%26.16E\n", x[i]));
204 }
205 bw.write(" Current Atomic Velocities :\n");
206 for (int i = 0; i < numberOfAtoms; i++) {
207 bw.write(format("%26.16E\n", v[i]));
208 }
209 bw.write(" Current Atomic Accelerations :\n");
210 for (int i = 0; i < numberOfAtoms; i++) {
211 bw.write(format("%26.16E\n", a[i]));
212 }
213 bw.write(" Current Lambda Histogram(s) :\n");
214 bw.write(this.getLambdaHistogram(titrResList, esvHist, pH));
215 } catch (IOException e) {
216 String message = " Exception writing dynamic restart file " + dynFile;
217 logger.log(Level.SEVERE, message, e);
218 return false;
219 }
220 return true;
221 }
222 }