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.crystal;
39
40 import static org.apache.commons.math3.util.FastMath.pow;
41 import static org.apache.commons.math3.util.FastMath.sqrt;
42
43 import java.io.BufferedWriter;
44 import java.io.FileWriter;
45 import java.io.PrintWriter;
46 import java.util.logging.Level;
47 import java.util.logging.Logger;
48
49
50
51
52
53
54
55
56
57 public class CNSMapWriter {
58
59 private static final Logger logger = Logger.getLogger(CNSMapWriter.class.getName());
60 private final String filename;
61 private final Crystal crystal;
62 private final int nx, ny, nz;
63
64
65
66
67
68
69
70
71
72
73 public CNSMapWriter(int nx, int ny, int nz, Crystal crystal, String filename) {
74 this.nx = nx;
75 this.ny = ny;
76 this.nz = nz;
77 this.crystal = crystal;
78 this.filename = filename;
79 }
80
81
82
83
84
85
86 public void write(double[] data) {
87 try {
88 StringBuilder sb = new StringBuilder();
89 sb.append(String.format("\nwriting CNS map file: \"%s\"\n", filename));
90
91 PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(filename)));
92 double mean = 0.0;
93 double sd = 0.0;
94 out.println();
95 out.println(" 1");
96 out.println("map from ffx");
97 out.printf("%8d%8d%8d%8d%8d%8d%8d%8d%8d\n", nx, 0, nx - 1, ny, 0, ny - 1, nz, 0, nz - 1);
98 out.printf(
99 "%12.5E%12.5E%12.5E%12.5E%12.5E%12.5E\n",
100 crystal.a, crystal.b, crystal.c, crystal.alpha, crystal.beta, crystal.gamma);
101 out.println("ZYX");
102 int n = 0;
103 for (int k = 0; k < nz; k++) {
104 out.printf("%8d\n", k);
105 for (int j = 0; j < ny; j++) {
106 for (int i = 0; i < nx; i++) {
107 int index = 2 * (i + nx * (j + ny * k));
108 out.printf("%12.5E", data[index]);
109 n++;
110 mean += (data[index] - mean) / n;
111 if ((n % 6) == 0) {
112 out.println();
113 }
114 }
115 }
116 }
117
118 n = 0;
119 for (int k = 0; k < nz; k++) {
120 for (int j = 0; j < ny; j++) {
121 for (int i = 0; i < nx; i++) {
122 int index = 2 * (i + nx * (j + ny * k));
123 sd += pow(data[index] - mean, 2.0);
124 n++;
125 }
126 }
127 }
128 sd = sqrt(sd / n);
129
130 out.println(" -9999");
131 out.printf("%12.4E%12.4E\n", mean, sd);
132 sb.append(String.format("map mean: %g standard dev.: %g", mean, sd));
133 out.close();
134 if (logger.isLoggable(Level.INFO)) {
135 logger.info(sb.toString());
136 }
137 } catch (Exception e) {
138 String message = "Fatal exception evaluating structure factors.\n";
139 logger.log(Level.SEVERE, message, e);
140 System.exit(-1);
141 }
142 }
143 }