@@ -10,6 +10,21 @@ import at.ac.oeaw.imba.gerlich.gerlib.zarr.OmeZarrIndex.OmeZarrStandardCoordinat
1010
1111/** Helpers for working with [[com.bc.zarr.ZarrArray ]] */
1212object ZarrArrayExtras :
13+
14+ // TODO: guard against atypical dimension order.
15+ private def getXY (za : ZarrArray ): Either [String , Dimensions2D ] =
16+ za.getShape.toList match {
17+ case _ :: _ :: _ :: y :: x :: Nil => new Dimensions2D (x = x, y = y).asRight
18+ case dims => s " ${dims.length}-D array, not 5-D " .asLeft
19+ }
20+
21+ def readFirstFullSize2DFrom5D (za : ZarrArray ): Either [String , DataRead2D ] = for
22+ dims <- getXY(za)
23+ data <- Try {
24+ JzarrTools .readFrom(za, Array (1 , 1 , 1 , dims.y, dims.x), Array (0 , 0 , 0 , 0 , 0 ))
25+ }.toEither.leftMap(_.getMessage)
26+ yield DataRead2D (data, dims)
27+
1328 extension (za : ZarrArray )
1429 def read (indexMapping : IndexMapping )(
1530 origin : OmeZarrStandardCoordinate ,
@@ -23,4 +38,14 @@ object ZarrArrayExtras:
2338 .leftMap(e =>
2439 s " For index mapping $indexMapping and starting from $origin, failed to read block of size $size: ${e.getMessage}"
2540 )
41+
42+ final class Dimensions2D (val x : Int , val y : Int ):
43+ require(x >= 0 , s " x dimension must be nonnegative, not $x" )
44+ require(y >= 0 , s " y dimension must be nonnegative, not $y" )
45+
46+ final class DataRead2D (values : Array [Int ], dimensions : Dimensions2D ):
47+ require(
48+ values.length === dimensions.x * dimensions.y,
49+ s " ${dimensions.x} * ${dimensions.y} = ${dimensions.x * dimensions.y}, not ${values.length}"
50+ )
2651end ZarrArrayExtras
0 commit comments