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