Line data Source code
1 : // SPDX-License-Identifier: BSD-3-Clause
2 : // Copyright (c) 2023 Scipp contributors (https://github.com/scipp)
3 : /// @file
4 : /// @author Owen Arnold, Simon Heybrock
5 : #include <sstream>
6 :
7 : #include "scipp/dataset/slice.h"
8 : #include "scipp/variable/slice.h"
9 :
10 : namespace scipp::dataset {
11 :
12 : namespace {
13 :
14 304 : template <class T> const auto &get_coord(const T &data, const Dim dim) {
15 304 : const auto &coords = data.coords();
16 304 : if (coords.contains(dim))
17 604 : return coords[dim];
18 :
19 2 : std::ostringstream oss;
20 2 : oss << "Invalid slice dimension: '" << dim
21 2 : << "': no coordinate for that dimension. Coordinates are (";
22 4 : for (auto it = coords.keys_begin(); it != coords.keys_end(); ++it) {
23 2 : oss << to_string(*it) << ", ";
24 : }
25 2 : oss << ")";
26 2 : throw except::DimensionError(oss.str());
27 2 : }
28 :
29 : template <class T>
30 158 : T slice(const T &data, const Dim dim, const Variable &value) {
31 : return data.slice(
32 304 : std::make_from_tuple<Slice>(get_slice_params(data, dim, value)));
33 : }
34 :
35 : template <class T>
36 80 : T slice(const T &data, const Dim dim, const Variable &begin,
37 : const Variable &end) {
38 : return data.slice(
39 142 : std::make_from_tuple<Slice>(get_slice_params(data, dim, begin, end)));
40 : }
41 :
42 : } // namespace
43 :
44 : std::tuple<Dim, scipp::index>
45 140 : get_slice_params(const DataArray &data, const Dim dim, const Variable &value) {
46 140 : return get_slice_params(data.dims(), get_coord(data, dim), value);
47 : }
48 :
49 : std::tuple<Dim, scipp::index, scipp::index>
50 90 : get_slice_params(const DataArray &data, const Dim dim, const Variable &begin,
51 : const Variable &end) {
52 90 : return get_slice_params(data.dims(), get_coord(data, dim), begin, end);
53 : }
54 :
55 : std::tuple<Dim, scipp::index>
56 27 : get_slice_params(const Dataset &data, const Dim dim, const Variable &value) {
57 27 : return get_slice_params(data.dims(), get_coord(data, dim), value);
58 : }
59 :
60 : std::tuple<Dim, scipp::index, scipp::index>
61 47 : get_slice_params(const Dataset &data, const Dim dim, const Variable &begin,
62 : const Variable &end) {
63 47 : return get_slice_params(data.dims(), get_coord(data, dim), begin, end);
64 : }
65 :
66 133 : DataArray slice(const DataArray &data, const Dim dim, const Variable &value) {
67 133 : return slice<DataArray>(data, dim, value);
68 : }
69 :
70 40 : DataArray slice(const DataArray &data, const Dim dim, const Variable &begin,
71 : const Variable &end) {
72 40 : return slice<DataArray>(data, dim, begin, end);
73 : }
74 :
75 25 : Dataset slice(const Dataset &ds, const Dim dim, const Variable &value) {
76 25 : return slice<Dataset>(ds, dim, value);
77 : }
78 :
79 40 : Dataset slice(const Dataset &ds, const Dim dim, const Variable &begin,
80 : const Variable &end) {
81 40 : return slice<Dataset>(ds, dim, begin, end);
82 : }
83 :
84 : } // namespace scipp::dataset
|