View Javadoc
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   * Write/read Histogram data to/from a String.
12   * The String is an array of lines separated by System dependent line separators.
13   * Each line (row) corresponds to a fixed lambda.
14   * The columns are a space-separated list of weights for the dUdL bins.
15   *
16   * @author Michael J. Schnieders
17   * @see jakarta.xml.bind.annotation.adapters.XmlAdapter
18   * @since 1.0
19   */
20  public class HistogramXmlAdapter extends XmlAdapter<String, double[][]> {
21  
22    /**
23     * The logger for this class.
24     */
25    public static final Logger logger = Logger.getLogger(HistogramXmlAdapter.class.getName());
26  
27    /**
28     * Convert the histogram data string to a 2D double array.
29     *
30     * @param value String containing the Histogram data.
31     * @return The data.
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     * Convert the 2D histogram double array into a String.
58     *
59     * @param data The histogram data.
60     * @return A String representation of the data.
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