Program Listing for File experiment.cxx

↰ Return to documentation for file (dx2/experiment.cxx)

#include <dx2/beam_io.hpp>
#include <dx2/experiment.hpp>

Experiment::Experiment(const json &experiment_data) {
  std::string identifier = experiment_data["experiment"][0]["identifier"];
  json beam_data = experiment_data["beam"][0];
  Beam beam = beam_io::from_json(beam_data);
  json scan_data = experiment_data["scan"][0];
  Scan scan(scan_data);
  json gonio_data = experiment_data["goniometer"][0];
  Goniometer gonio(gonio_data);
  json detector_data = experiment_data["detector"][0];
  Detector detector(detector_data);
  this->_identifier = identifier;
  this->_beam = std::move(beam);
  this->_scan = std::move(scan);
  this->_goniometer = std::move(gonio);
  this->_detector = std::move(detector);
  // Save the imageset json to propagate when saving to file.
  json imagesequence_data = experiment_data["imageset"][0];
  ImageSequence imagesequence(imagesequence_data);
  this->_imagesequence = imagesequence;
  if (experiment_data.contains("crystal") &&
      experiment_data["crystal"].is_array() &&
      !experiment_data["crystal"].empty()) {
    const json &crystal_data = experiment_data["crystal"][0];
    Crystal crystal(crystal_data);
    this->_crystal = crystal;
  }
}

json Experiment::to_json() const {
  // save this experiment as an example experiment list
  json elist_out; // a list of potentially multiple experiments
  elist_out["__id__"] = "ExperimentList";
  json expt_out; // our single experiment
  expt_out["__id__"] = "Experiment";
  expt_out["identifier"] = _identifier;
  expt_out["beam"] =
      0; // the indices of the models that will correspond to our experiment
  expt_out["detector"] = 0;
  expt_out["goniometer"] = 0;
  expt_out["scan"] = 0;
  expt_out["imageset"] = 0;

  // add the the actual models
  elist_out["scan"] = std::array<json, 1>{_scan.to_json()};
  elist_out["goniometer"] = std::array<json, 1>{_goniometer.to_json()};
  elist_out["beam"] = std::array<json, 1>{beam_io::to_json(_beam)};
  elist_out["detector"] = std::array<json, 1>{_detector.to_json()};
  elist_out["imageset"] = std::array<json, 1>{_imagesequence.to_json()};

  if (_crystal.get_U_matrix().determinant()) {
    expt_out["crystal"] = 0;
    elist_out["crystal"] = std::array<json, 1>{_crystal.to_json()};
  } else {
    elist_out["crystal"] = std::array<json, 0>{};
  }

  elist_out["experiment"] = std::array<json, 1>{expt_out};
  return elist_out;
}

Scan &Experiment::scan() { return _scan; }

const Goniometer &Experiment::goniometer() const { return _goniometer; }

Detector &Experiment::detector() { return _detector; }

Crystal &Experiment::crystal() { return _crystal; }

ImageSequence &Experiment::imagesequence() { return _imagesequence; }

void Experiment::set_crystal(Crystal crystal) { _crystal = crystal; }

void Experiment::set_beam(Beam beam) { _beam = std::move(beam); }

Beam &Experiment::beam() { return _beam; }

const Beam &Experiment::beam() const { return _beam; }

void Experiment::set_scan(Scan scan) { _scan = scan; }

void Experiment::set_detector(Detector detector) { _detector = detector; }

void Experiment::set_goniometer(Goniometer goniometer) {
  _goniometer = goniometer;
}

void Experiment::set_imagesequence(ImageSequence imagesequence) {
  _imagesequence = imagesequence;
}

const std::string &Experiment::identifier() const { return _identifier; }

void Experiment::set_identifier(std::string identifier) {
  _identifier = identifier;
}

void Experiment::generate_identifier() { _identifier = ersatz_uuid4(); }