Program Listing for File imagesequence.cxx

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

#include "dx2/imagesequence.hpp"

using json = nlohmann::json;

// Constructor for MultiImage formats e.g. h5.
ImageSequence::ImageSequence(std::string filename, int n_images)
    : filename_(filename), n_images_(n_images) {
  single_file_indices_.reserve(n_images_);
  for (std::size_t i = 0; i < n_images_; ++i) {
    single_file_indices_.push_back(i);
  }
}

// Constructor for non-MultiImage formats e.g. cbf.
ImageSequence::ImageSequence(std::string filename) : filename_(filename) {}

ImageSequence::ImageSequence(json imagesequence_data) {
  std::vector<std::string> required_keys = {"template", "__id__"};
  for (const auto &key : required_keys) {
    if (imagesequence_data.find(key) == imagesequence_data.end()) {
      throw std::invalid_argument("Key " + key +
                                  " is missing from the input imageset JSON");
    }
  }
  if (imagesequence_data["__id__"] != std::string("ImageSequence")) {
    throw std::runtime_error("Only ImageSequences are supported");
  }
  filename_ = imagesequence_data["template"];
  if (imagesequence_data.find("single_file_indices") !=
      imagesequence_data.end()) {
    // for non-multimage formats (e.g. non-h5), allow parsing.
    json indices = imagesequence_data["single_file_indices"];
    single_file_indices_ = {};
    if (*(indices.begin()) < 0) {
      throw std::runtime_error("Starting file index <0");
    }
    for (json::iterator it = indices.begin(); it != indices.end(); ++it) {
      single_file_indices_.push_back(*it);
    }
    n_images_ = single_file_indices_.size();
  }
  imagesequence_data_ =
      imagesequence_data; // To propagate during serialization/deserialization.
}

json ImageSequence::to_json() const {
  json imageset_data = imagesequence_data_;
  imageset_data["__id__"] = "ImageSequence";
  imageset_data["template"] = filename_;
  if (single_file_indices_.size() > 0) { // i.e. MultiImage formats (h5).
    imageset_data["single_file_indices"] = single_file_indices_;
  }
  // Set defaults and null for now.
  std::vector<std::string> optional_keys = {"mask", "gain", "pedestal", "dx",
                                            "dy"};
  for (const auto &key : optional_keys) {
    if (imagesequence_data_.find(key) == imagesequence_data_.end()) {
      imageset_data[key] = nullptr;
    }
  }
  if (imagesequence_data_.find("params") == imagesequence_data_.end()) {
    json params;
    params["dynamic_shadowing"] = "Auto";
    params["multi_panel"] = false;
    imageset_data["params"] = params;
  }
  return imageset_data;
}

const std::string &ImageSequence::filename() const { return filename_; }