takane
Validators for ArtifactDB file formats
Loading...
Searching...
No Matches
ranged_summarized_experiment.hpp
Go to the documentation of this file.
1#ifndef TAKANE_RANGED_SUMMARIZED_EXPERIMENT_HPP
2#define TAKANE_RANGED_SUMMARIZED_EXPERIMENT_HPP
3
4#include "millijson/millijson.hpp"
5
7
8#include <filesystem>
9#include <stdexcept>
10#include <string>
11
17namespace takane {
18
22void validate(const std::filesystem::path&, const ObjectMetadata&, Options& options);
23size_t height(const std::filesystem::path&, const ObjectMetadata&, Options& options);
24bool derived_from(const std::string&, const std::string&, const Options&);
33namespace ranged_summarized_experiment {
34
40inline void validate(const std::filesystem::path& path, const ObjectMetadata& metadata, Options& options) {
41 ::takane::summarized_experiment::validate(path, metadata, options);
42
43 const std::string type_name = "ranged_summarized_experiment"; // use a separate variable to avoid dangling reference warnings from GCC.
44 const auto& rsemap = internal_json::extract_typed_object_from_metadata(metadata.other, type_name);
45
46 const std::string version_name = "version"; // again, avoid dangling reference warnings.
47 const std::string& vstring = internal_json::extract_string_from_typed_object(rsemap, version_name, type_name);
48 auto version = ritsuko::parse_version_string(vstring.c_str(), vstring.size(), /* skip_patch = */ true);
49 if (version.major != 1) {
50 throw std::runtime_error("unsupported version string '" + vstring + "'");
51 }
52
53 auto rangedir = path / "row_ranges";
54 if (std::filesystem::exists(rangedir)) {
55 auto rangemeta = read_object_metadata(rangedir);
56 if (!derived_from(rangemeta.type, "genomic_ranges", options) && !derived_from(rangemeta.type, "genomic_ranges_list", options)) {
57 throw std::runtime_error("object in 'row_ranges' must be a 'genomic_ranges' or 'genomic_ranges_list'");
58 }
59
60 ::takane::validate(rangedir, rangemeta, options);
61
62 auto num_row = ::takane::summarized_experiment::height(path, metadata, options);
63 if (::takane::height(rangedir, rangemeta, options) != num_row) {
64 throw std::runtime_error("object in 'row_ranges' must have length equal to the number of rows of its parent '" + metadata.type + "'");
65 }
66 }
67}
68
69}
70
71}
72
73#endif
void validate(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition ranged_summarized_experiment.hpp:40
void validate(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition summarized_experiment.hpp:43
size_t height(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition summarized_experiment.hpp:121
takane validation functions.
Definition _derived_from.hpp:15
size_t height(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition _height.hpp:88
ObjectMetadata read_object_metadata(const std::filesystem::path &path)
Definition utils_public.hpp:73
void validate(const std::filesystem::path &path, const ObjectMetadata &metadata, Options &options)
Definition _validate.hpp:109
bool derived_from(const std::string &type, const std::string &base, const Options &options)
Definition _derived_from.hpp:80
Object metadata, including the type and other fields.
Definition utils_public.hpp:25
std::unordered_map< std::string, std::shared_ptr< millijson::Base > > other
Definition utils_public.hpp:34
std::string type
Definition utils_public.hpp:29
Validation options.
Definition utils_public.hpp:93
Validation for summarized experiments.