1 package ffx.utilities;
2
3 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
4
5 import java.util.logging.Logger;
6
7 import static java.lang.Double.parseDouble;
8 import static java.lang.String.format;
9
10
11
12
13
14
15
16
17
18
19
20 public class HistogramXmlAdapter extends XmlAdapter<String, double[][]> {
21
22
23
24
25 public static final Logger logger = Logger.getLogger(HistogramXmlAdapter.class.getName());
26
27
28
29
30
31
32
33 @Override
34 public double[][] unmarshal(String value) {
35 double[][] data;
36 try {
37 String[] lines = value.split(System.lineSeparator());
38 int lambdaBins = lines.length;
39 data = new double[lambdaBins][];
40 for (int i = 0; i < lambdaBins; i++) {
41 String[] countToks = lines[i].split(" +");
42 int dUdLBins = countToks.length;
43 data[i] = new double[dUdLBins];
44 double[] row = data[i];
45 for (int j = 0; j < dUdLBins; j++) {
46 row[j] = parseDouble(countToks[j]);
47 }
48 }
49 } catch (Exception e) {
50 logger.warning(" Returning a null histogram due to an XML parsing exception:\n " + e);
51 data = null;
52 }
53 return data;
54 }
55
56
57
58
59
60
61
62 @Override
63 public String marshal(double[][] data) {
64 StringBuilder sb = new StringBuilder();
65 for (double[] row : data) {
66 sb.append(format("%.16e", row[0]));
67 int dUdLBins = row.length;
68 for (int j = 1; j < dUdLBins; j++) {
69 sb.append(" ").append(format("%.16e", row[j]));
70 }
71 sb.append(System.lineSeparator());
72 }
73 return sb.toString();
74 }
75 }
76