|
| 1 | +function object = read_dsres(filename, object_name) |
| 2 | + |
| 3 | +mat = load(filename); |
| 4 | + |
| 5 | +% get the arrays |
| 6 | +file_info = mat.Aclass; |
| 7 | + |
| 8 | +if strcmp(file_info(2,1:3), '1.1') |
| 9 | + if strcmp(file_info(4,1:8), 'binTrans') |
| 10 | + info = mat.dataInfo; |
| 11 | + desc = mat.description'; |
| 12 | + cons = mat.data_1'; |
| 13 | + vars = mat.data_2'; |
| 14 | + names = mat.name'; |
| 15 | + elseif strcmp(file_info(4,1:9), 'binNormal') |
| 16 | + info = mat.dataInfo'; |
| 17 | + desc = mat.description; |
| 18 | + cons = mat.data_1; |
| 19 | + vars = mat.data_2; |
| 20 | + names = mat.name; |
| 21 | + else |
| 22 | + error('Format not supported') |
| 23 | + end |
| 24 | +elseif strcmp(file_info(2,1:3), '1.0') |
| 25 | + |
| 26 | + names = mat.names; |
| 27 | + vars = mat.data; |
| 28 | + n = size(vars, 2); |
| 29 | + desc = char(zeros(n,1)); |
| 30 | + info = [ones(n,1).*2, [1:n]']'; |
| 31 | + |
| 32 | +else |
| 33 | + error('Format not supported') |
| 34 | +end |
| 35 | + |
| 36 | +% remove the string terminators so strtrim() works correctly |
| 37 | +names(names == 0) = ' '; |
| 38 | +desc(desc == 0) = ' '; |
| 39 | + |
| 40 | +n = size(info, 2); |
| 41 | + |
| 42 | +root = SDF.Group(); |
| 43 | + |
| 44 | +ds_time = SDF.Dataset(); |
| 45 | +ds_time.name = strtrim(names(1, :)); |
| 46 | +ds_time.comment = strtrim(desc(1, :)); |
| 47 | +ds_time.unit = 's'; |
| 48 | +ds_time.data = vars(:, 1); |
| 49 | +ds_time.is_scale = true; |
| 50 | + |
| 51 | +root.datasets(end+1) = ds_time; |
| 52 | + |
| 53 | +for i = 2:n |
| 54 | + |
| 55 | + ds = SDF.Dataset(); |
| 56 | + |
| 57 | + d = info(1, i); % variability (constant=1, variable=2) |
| 58 | + x = info(2, i); |
| 59 | + c = abs(x); % colum |
| 60 | + s = sign(x); % sign |
| 61 | + |
| 62 | + path = strtrim(names(i, :)); |
| 63 | + |
| 64 | + path_elements = strsplit(path, '.'); |
| 65 | + |
| 66 | + parent_group = root; |
| 67 | + |
| 68 | + for j = 1:numel(path_elements)-1 |
| 69 | + path_element = path_elements{j}; |
| 70 | + pg = []; |
| 71 | + |
| 72 | + for k = 1:numel(parent_group.groups) |
| 73 | + if strcmp(parent_group.groups(k).name, path_element) |
| 74 | + pg = parent_group.groups(k); |
| 75 | + break |
| 76 | + end |
| 77 | + end |
| 78 | + |
| 79 | + if isempty(pg) |
| 80 | + pg = SDF.Group(); |
| 81 | + pg.name = path_element; |
| 82 | + parent_group.groups(end+1) = pg; |
| 83 | + end |
| 84 | + |
| 85 | + parent_group = pg; |
| 86 | + end |
| 87 | + |
| 88 | + comment = strtrim(desc(i, :)); |
| 89 | + last = find(comment == '[', 1, 'last'); |
| 90 | + |
| 91 | + if d == 1 |
| 92 | + data = cons(1, c); |
| 93 | + else |
| 94 | + data = vars(:, c); |
| 95 | + ds.scales = ds_time; |
| 96 | + end |
| 97 | + |
| 98 | + unit = ''; |
| 99 | + display_unit = ''; |
| 100 | + |
| 101 | + if ~isempty(comment) && comment(end) == ']' && last |
| 102 | + type_info = comment(last+1:end-1); |
| 103 | + comment = comment(1:last-1); |
| 104 | + elements = strsplit(type_info, ':#'); |
| 105 | + for j = 1:numel(elements) |
| 106 | + element = elements{j}; |
| 107 | + if strcmp(element, '(type=Integer)') |
| 108 | + % change type |
| 109 | + data = int32(data); |
| 110 | + elseif strcmp(element, '(type=Boolean)') |
| 111 | + % change type |
| 112 | + data = logical(data); |
| 113 | + elseif ~isempty(element) |
| 114 | + unit = element; |
| 115 | + end |
| 116 | + end |
| 117 | + end |
| 118 | + |
| 119 | + j = find(unit == '|'); |
| 120 | + |
| 121 | + if j |
| 122 | + display_unit = unit(j+1:end); |
| 123 | + unit = unit(1:j-1); |
| 124 | + end |
| 125 | + |
| 126 | + if s < 0 |
| 127 | + data = -data; |
| 128 | + end |
| 129 | + |
| 130 | + ds.name = path_elements{end}; |
| 131 | + ds.comment = strtrim(comment); |
| 132 | + ds.unit = unit; |
| 133 | + ds.display_unit = display_unit; |
| 134 | + ds.data = data; |
| 135 | + |
| 136 | + parent_group.datasets(end+1) = ds; |
| 137 | + |
| 138 | +end |
| 139 | + |
| 140 | +if strcmp(object_name, '/') |
| 141 | + object = root; |
| 142 | +else |
| 143 | + object = root.find_object(object_name); |
| 144 | +end |
| 145 | + |
| 146 | +end |
0 commit comments