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