|
11 | 11 | from enum import Enum
|
12 | 12 | import numpy as np
|
13 | 13 |
|
| 14 | +from nixio.exceptions.exceptions import OutOfBounds |
| 15 | + |
14 | 16 | from .data_view import DataView
|
15 | 17 | from .data_set import DataSet
|
16 | 18 | from .entity import Entity
|
@@ -360,13 +362,28 @@ def get_slice(self, positions, extents=None, mode=DataSliceMode.Index):
|
360 | 362 | def _get_slice_bydim(self, positions, extents):
|
361 | 363 | dpos, dext = [], []
|
362 | 364 | for dim, pos, ext in zip(self.dimensions, positions, extents):
|
363 |
| - if dim.dimension_type in (DimensionType.Sample, |
364 |
| - DimensionType.Range): |
365 |
| - dpos.append(dim.index_of(pos, mode=IndexMode.GreaterOrEqual)) |
366 |
| - dext.append(dim.index_of(pos + ext) - dpos[-1]) |
| 365 | + if dim.dimension_type == DimensionType.Sample: |
| 366 | + start_pos = dim.index_of(pos, mode=IndexMode.GreaterOrEqual) |
| 367 | + extent = dim.index_of(pos + ext) - start_pos |
| 368 | + elif dim.dimension_type == DimensionType.Range: |
| 369 | + try: |
| 370 | + start_pos = dim.index_of(pos, mode=IndexMode.GreaterOrEqual) |
| 371 | + extent = dim.index_of(pos + ext) - start_pos |
| 372 | + except IndexError: |
| 373 | + start_pos = -1 |
| 374 | + extent = -1 |
| 375 | + except Exception as e: |
| 376 | + raise e |
367 | 377 | elif dim.dimension_type == DimensionType.Set:
|
368 |
| - dpos.append(int(pos)) |
369 |
| - dext.append(int(ext)) |
| 378 | + start_pos = int(pos) |
| 379 | + extent = int(ext) |
| 380 | + else: |
| 381 | + raise IncompatibleDimensions(f"Unknown dimension type: {dim.dimension_type}") |
| 382 | + |
| 383 | + if extent < 0: |
| 384 | + return DataView(self, None) |
| 385 | + dpos.append(start_pos) |
| 386 | + dext.append(extent) |
370 | 387 | slices = tuple(slice(p, p + e) for p, e in zip(dpos, dext))
|
371 | 388 | return DataView(self, slices)
|
372 | 389 |
|
|
0 commit comments