@fideus-labs/ngff-zarr 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/browser-mod.d.ts +2 -0
- package/esm/browser-mod.d.ts.map +1 -1
- package/esm/browser-mod.js +1 -0
- package/esm/browser-mod.js.map +1 -1
- package/esm/mod.d.ts +2 -0
- package/esm/mod.d.ts.map +1 -1
- package/esm/mod.js +1 -0
- package/esm/mod.js.map +1 -1
- package/esm/utils/compute_omero.d.ts +89 -0
- package/esm/utils/compute_omero.d.ts.map +1 -0
- package/esm/utils/compute_omero.js +541 -0
- package/esm/utils/compute_omero.js.map +1 -0
- package/package.json +1 -1
package/esm/browser-mod.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export * from "./schemas/multiscales.js";
|
|
|
12
12
|
export { isValidDimension, isValidUnit, validateMetadata, } from "./utils/validation.js";
|
|
13
13
|
export { createAxis, createDataset, createMetadata, createMultiscales, createNgffImage, } from "./utils/factory.js";
|
|
14
14
|
export { getMethodMetadata } from "./utils/method_metadata.js";
|
|
15
|
+
export { computeOmeroFromMultiscales, computeOmeroFromNgffImage, getDefaultColors, GLASBEY_COLORS, } from "./utils/compute_omero.js";
|
|
16
|
+
export type { ComputeOmeroFromMultiscalesOptions, ComputeOmeroOptions, } from "./utils/compute_omero.js";
|
|
15
17
|
export { fromNgffZarr, type FromNgffZarrOptions, type MemoryStore, } from "./io/from_ngff_zarr-browser.js";
|
|
16
18
|
export { isOzxPath, toNgffZarr, type ToNgffZarrOptions, toNgffZarrOzx, type ToNgffZarrOzxOptions, } from "./io/to_ngff_zarr-browser.js";
|
|
17
19
|
export { getZipFileCompressionMethod, getZipFileList, memoryStoreToZip, orderFilesForRfc9, readOzxVersion, } from "./io/rfc9_zip.js";
|
package/esm/browser-mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-mod.d.ts","sourceRoot":"","sources":["../src/browser-mod.ts"],"names":[],"mappings":"AAOA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-mod.d.ts","sourceRoot":"","sources":["../src/browser-mod.ts"],"names":[],"mappings":"AAOA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,kCAAkC,EAClC,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACjB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,SAAS,EACT,UAAU,EACV,KAAK,iBAAiB,EACtB,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAGhE,cAAc,qCAAqC,CAAC"}
|
package/esm/browser-mod.js
CHANGED
|
@@ -19,6 +19,7 @@ export * from "./schemas/multiscales.js";
|
|
|
19
19
|
export { isValidDimension, isValidUnit, validateMetadata, } from "./utils/validation.js";
|
|
20
20
|
export { createAxis, createDataset, createMetadata, createMultiscales, createNgffImage, } from "./utils/factory.js";
|
|
21
21
|
export { getMethodMetadata } from "./utils/method_metadata.js";
|
|
22
|
+
export { computeOmeroFromMultiscales, computeOmeroFromNgffImage, getDefaultColors, GLASBEY_COLORS, } from "./utils/compute_omero.js";
|
|
22
23
|
// Browser-compatible I/O modules
|
|
23
24
|
// Note: Uses browser-specific versions that don't import @zarrita/storage
|
|
24
25
|
// (which contains Node.js-specific modules like node:fs, node:buffer, node:path)
|
package/esm/browser-mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-mod.js","sourceRoot":"","sources":["../src/browser-mod.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAC/B,oCAAoC;AACpC,wEAAwE;AACxE,EAAE;AACF,kFAAkF;AAClF,yEAAyE;AACzE,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-mod.js","sourceRoot":"","sources":["../src/browser-mod.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAC/B,oCAAoC;AACpC,wEAAwE;AACxE,EAAE;AACF,kFAAkF;AAClF,yEAAyE;AACzE,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAMlC,iCAAiC;AACjC,0EAA0E;AAC1E,iFAAiF;AACjF,OAAO,EACL,YAAY,GAGb,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,SAAS,EACT,UAAU,EAEV,aAAa,GAEd,MAAM,8BAA8B,CAAC;AAEtC,gBAAgB;AAChB,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,wCAAwC;AACxC,cAAc,qCAAqC,CAAC"}
|
package/esm/mod.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export { isValidDimension, isValidUnit, validateMetadata, } from "./utils/valida
|
|
|
16
16
|
export { createAxis, createDataset, createMetadata, createMultiscales, createNgffImage, } from "./utils/factory.js";
|
|
17
17
|
export { getMethodMetadata } from "./utils/method_metadata.js";
|
|
18
18
|
export { detectVersion, extractMethodMetadata, parseOmero, } from "./utils/parse_metadata.js";
|
|
19
|
+
export { computeOmeroFromMultiscales, computeOmeroFromNgffImage, getDefaultColors, GLASBEY_COLORS, } from "./utils/compute_omero.js";
|
|
20
|
+
export type { ComputeOmeroFromMultiscalesOptions, ComputeOmeroOptions, } from "./utils/compute_omero.js";
|
|
19
21
|
export { fromZarrAttrsV04, fromZarrAttrsV05 } from "./utils/from_zarr_attrs.js";
|
|
20
22
|
export * from "./io/from_ngff_zarr.js";
|
|
21
23
|
export * from "./io/to_ngff_zarr.js";
|
package/esm/mod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAEA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAE9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAG5B,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAEA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAE9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,kCAAkC,EAClC,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAG5B,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/esm/mod.js
CHANGED
|
@@ -18,6 +18,7 @@ export { isValidDimension, isValidUnit, validateMetadata, } from "./utils/valida
|
|
|
18
18
|
export { createAxis, createDataset, createMetadata, createMultiscales, createNgffImage, } from "./utils/factory.js";
|
|
19
19
|
export { getMethodMetadata } from "./utils/method_metadata.js";
|
|
20
20
|
export { detectVersion, extractMethodMetadata, parseOmero, } from "./utils/parse_metadata.js";
|
|
21
|
+
export { computeOmeroFromMultiscales, computeOmeroFromNgffImage, getDefaultColors, GLASBEY_COLORS, } from "./utils/compute_omero.js";
|
|
21
22
|
export { fromZarrAttrsV04, fromZarrAttrsV05 } from "./utils/from_zarr_attrs.js";
|
|
22
23
|
export * from "./io/from_ngff_zarr.js";
|
|
23
24
|
export * from "./io/to_ngff_zarr.js";
|
package/esm/mod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAE9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AAEjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAE5B,gBAAgB;AAChB,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"mod.js","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,+BAA+B,CAAC;AAE9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,UAAU,GACX,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EACzB,gBAAgB,EAChB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEhF,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AAEjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,aAAa,CAAC;AAE5B,gBAAgB;AAChB,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { NgffImage } from "../types/ngff_image.js";
|
|
2
|
+
import type { Multiscales } from "../types/multiscales.js";
|
|
3
|
+
import type { Omero } from "../types/zarr_metadata.js";
|
|
4
|
+
/**
|
|
5
|
+
* Glasbey color palette from colorcet's glasbey_hv.
|
|
6
|
+
* Extended from HoloViews default colors using the Glasbey algorithm
|
|
7
|
+
* for maximum distinguishability across 256 categorical colors.
|
|
8
|
+
* See: https://colorcet.holoviz.org/user_guide/Categorical.html
|
|
9
|
+
*/
|
|
10
|
+
export declare const GLASBEY_COLORS: readonly string[];
|
|
11
|
+
/**
|
|
12
|
+
* Get default colors for channels.
|
|
13
|
+
*
|
|
14
|
+
* For a single channel, returns white (FFFFFF).
|
|
15
|
+
* For multiple channels, uses the Glasbey color progression.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDefaultColors(nChannels: number): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Options for computing OMERO metadata.
|
|
20
|
+
*/
|
|
21
|
+
export interface ComputeOmeroOptions {
|
|
22
|
+
/** Tuple of (low, high) quantile values for the display window. Default is [0.02, 0.98]. */
|
|
23
|
+
quantiles?: [number, number];
|
|
24
|
+
/** Optional list of hex color strings (without #) for each channel. */
|
|
25
|
+
colors?: string[];
|
|
26
|
+
/** Optional list of label strings for each channel. */
|
|
27
|
+
labels?: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Compute OMERO metadata from an NgffImage.
|
|
31
|
+
*
|
|
32
|
+
* This function computes visualization parameters (OMERO metadata) from image data:
|
|
33
|
+
* - min/max: The actual data range
|
|
34
|
+
* - start/end: Display window based on quantiles (default 2% and 98%)
|
|
35
|
+
*
|
|
36
|
+
* For multi-channel images (with 'c' dimension), statistics are computed
|
|
37
|
+
* separately for each channel, resulting in per-channel OMERO windows.
|
|
38
|
+
*
|
|
39
|
+
* Memory requirements: This function loads the entire image data into memory
|
|
40
|
+
* for statistics computation. For large images, use the lowest resolution
|
|
41
|
+
* image from a multiscales pyramid.
|
|
42
|
+
*
|
|
43
|
+
* Edge cases:
|
|
44
|
+
* - If all values in a channel are NaN, the statistics will be NaN.
|
|
45
|
+
* - If a channel has constant values, min/max/start/end will all be the same.
|
|
46
|
+
*
|
|
47
|
+
* @param image - The NgffImage to compute metadata for
|
|
48
|
+
* @param options - Optional configuration for quantiles, colors, and labels
|
|
49
|
+
* - quantiles: Tuple of (low, high) quantile values. Must be between 0 and 1,
|
|
50
|
+
* with low < high. Default is [0.02, 0.98] for 2% and 98% quantiles.
|
|
51
|
+
* - colors: List of hex color strings (without #) for each channel.
|
|
52
|
+
* Must be 6-digit hexadecimal strings (e.g., "FF0000" for red).
|
|
53
|
+
* If not provided, uses white for single channel or Glasbey
|
|
54
|
+
* progression for multi-channel.
|
|
55
|
+
* - labels: List of label strings for each channel.
|
|
56
|
+
* If not provided, uses empty strings.
|
|
57
|
+
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
58
|
+
* @throws {Error} If quantiles are invalid, colors are invalid format,
|
|
59
|
+
* or not enough colors/labels provided.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const omero = await computeOmeroFromNgffImage(image);
|
|
64
|
+
* multiscales.metadata.omero = omero;
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function computeOmeroFromNgffImage(image: NgffImage, options?: ComputeOmeroOptions): Promise<Omero>;
|
|
68
|
+
/**
|
|
69
|
+
* Options for computing OMERO metadata from multiscales.
|
|
70
|
+
*/
|
|
71
|
+
export interface ComputeOmeroFromMultiscalesOptions extends ComputeOmeroOptions {
|
|
72
|
+
/**
|
|
73
|
+
* If true (default), use the lowest resolution (smallest) image for faster computation.
|
|
74
|
+
* If false, use the highest resolution (largest) image for more accurate statistics.
|
|
75
|
+
*/
|
|
76
|
+
useLowestResolution?: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Compute OMERO metadata from a Multiscales object.
|
|
80
|
+
*
|
|
81
|
+
* This is a convenience function that computes OMERO metadata from the
|
|
82
|
+
* highest or lowest resolution image in a multiscales pyramid.
|
|
83
|
+
*
|
|
84
|
+
* @param multiscales - The Multiscales object to compute metadata for
|
|
85
|
+
* @param options - Optional configuration for quantiles, colors, labels, and resolution
|
|
86
|
+
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
87
|
+
*/
|
|
88
|
+
export declare function computeOmeroFromMultiscales(multiscales: Multiscales, options?: ComputeOmeroFromMultiscalesOptions): Promise<Omero>;
|
|
89
|
+
//# sourceMappingURL=compute_omero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute_omero.d.ts","sourceRoot":"","sources":["../../src/utils/compute_omero.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EACV,KAAK,EAGN,MAAM,2BAA2B,CAAC;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAiQlC,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAS5D;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,4FAA4F;IAC5F,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAwJD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,yBAAyB,CAC7C,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,KAAK,CAAC,CAqFhB;AAED;;GAEG;AACH,MAAM,WAAW,kCACf,SAAQ,mBAAmB;IAC3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,kCAAuC,GAC/C,OAAO,CAAC,KAAK,CAAC,CAwBhB"}
|
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
/**
|
|
4
|
+
* Compute OMERO metadata from NgffImage data.
|
|
5
|
+
*/
|
|
6
|
+
import * as zarr from "zarrita";
|
|
7
|
+
/**
|
|
8
|
+
* Glasbey color palette from colorcet's glasbey_hv.
|
|
9
|
+
* Extended from HoloViews default colors using the Glasbey algorithm
|
|
10
|
+
* for maximum distinguishability across 256 categorical colors.
|
|
11
|
+
* See: https://colorcet.holoviz.org/user_guide/Categorical.html
|
|
12
|
+
*/
|
|
13
|
+
export const GLASBEY_COLORS = [
|
|
14
|
+
"30A2DA",
|
|
15
|
+
"FC4F30",
|
|
16
|
+
"E5AE38",
|
|
17
|
+
"6D904F",
|
|
18
|
+
"8B8B8B",
|
|
19
|
+
"17BECF",
|
|
20
|
+
"9467BD",
|
|
21
|
+
"D62728",
|
|
22
|
+
"1F77B4",
|
|
23
|
+
"E377C2",
|
|
24
|
+
"8C564B",
|
|
25
|
+
"BCBD22",
|
|
26
|
+
"3A0183",
|
|
27
|
+
"004300",
|
|
28
|
+
"0FFFA9",
|
|
29
|
+
"5E0040",
|
|
30
|
+
"C6BDFF",
|
|
31
|
+
"425052",
|
|
32
|
+
"B80080",
|
|
33
|
+
"FFB7B3",
|
|
34
|
+
"7D0200",
|
|
35
|
+
"6126FF",
|
|
36
|
+
"FFFF9A",
|
|
37
|
+
"AEC9AB",
|
|
38
|
+
"00867C",
|
|
39
|
+
"553A00",
|
|
40
|
+
"94FCFF",
|
|
41
|
+
"00BF00",
|
|
42
|
+
"7D00A0",
|
|
43
|
+
"AB7200",
|
|
44
|
+
"91FF00",
|
|
45
|
+
"01BE8A",
|
|
46
|
+
"00457B",
|
|
47
|
+
"C8826F",
|
|
48
|
+
"FF1F83",
|
|
49
|
+
"DD00FF",
|
|
50
|
+
"057400",
|
|
51
|
+
"644461",
|
|
52
|
+
"888FFF",
|
|
53
|
+
"FFB6F4",
|
|
54
|
+
"536237",
|
|
55
|
+
"CE85FF",
|
|
56
|
+
"686A84",
|
|
57
|
+
"BEB4BE",
|
|
58
|
+
"A56089",
|
|
59
|
+
"95D3FF",
|
|
60
|
+
"0100F8",
|
|
61
|
+
"FF8002",
|
|
62
|
+
"8B2945",
|
|
63
|
+
"ADA06D",
|
|
64
|
+
"53458B",
|
|
65
|
+
"C8FFD9",
|
|
66
|
+
"AA4600",
|
|
67
|
+
"FF798F",
|
|
68
|
+
"83D371",
|
|
69
|
+
"909EBF",
|
|
70
|
+
"9400F5",
|
|
71
|
+
"EBD09B",
|
|
72
|
+
"AD8BB1",
|
|
73
|
+
"00634A",
|
|
74
|
+
"FFDC00",
|
|
75
|
+
"887751",
|
|
76
|
+
"7EABA3",
|
|
77
|
+
"000097",
|
|
78
|
+
"F500C6",
|
|
79
|
+
"653329",
|
|
80
|
+
"006678",
|
|
81
|
+
"04E3C8",
|
|
82
|
+
"A737AE",
|
|
83
|
+
"C5DBE1",
|
|
84
|
+
"4D6EFF",
|
|
85
|
+
"9B9301",
|
|
86
|
+
"CD586B",
|
|
87
|
+
"EFDEFE",
|
|
88
|
+
"795A00",
|
|
89
|
+
"5F889A",
|
|
90
|
+
"B4FF92",
|
|
91
|
+
"5E726B",
|
|
92
|
+
"520066",
|
|
93
|
+
"058751",
|
|
94
|
+
"84206F",
|
|
95
|
+
"3C9605",
|
|
96
|
+
"657300",
|
|
97
|
+
"F1A06C",
|
|
98
|
+
"5F5045",
|
|
99
|
+
"BD004A",
|
|
100
|
+
"D06827",
|
|
101
|
+
"D796AB",
|
|
102
|
+
"895DFF",
|
|
103
|
+
"826C76",
|
|
104
|
+
"2B55B9",
|
|
105
|
+
"6E7CBB",
|
|
106
|
+
"E7D5D3",
|
|
107
|
+
"5D0018",
|
|
108
|
+
"7C3B01",
|
|
109
|
+
"80B17D",
|
|
110
|
+
"C8D97D",
|
|
111
|
+
"00E83B",
|
|
112
|
+
"7CB2FF",
|
|
113
|
+
"FF55FF",
|
|
114
|
+
"A42721",
|
|
115
|
+
"1DE4FF",
|
|
116
|
+
"7DAF3B",
|
|
117
|
+
"7B4B91",
|
|
118
|
+
"E0FF48",
|
|
119
|
+
"6B00C4",
|
|
120
|
+
"CDA897",
|
|
121
|
+
"BE63C4",
|
|
122
|
+
"89CDCE",
|
|
123
|
+
"4603C8",
|
|
124
|
+
"5E9279",
|
|
125
|
+
"414A01",
|
|
126
|
+
"05A79D",
|
|
127
|
+
"CF8C37",
|
|
128
|
+
"FFF8D0",
|
|
129
|
+
"435471",
|
|
130
|
+
"B544FF",
|
|
131
|
+
"CF4993",
|
|
132
|
+
"CFA4DF",
|
|
133
|
+
"94D400",
|
|
134
|
+
"A794DA",
|
|
135
|
+
"2DA558",
|
|
136
|
+
"8DE3B6",
|
|
137
|
+
"A4A99D",
|
|
138
|
+
"6C5CB7",
|
|
139
|
+
"FF7E5E",
|
|
140
|
+
"A7838A",
|
|
141
|
+
"AFBED8",
|
|
142
|
+
"2AC4FF",
|
|
143
|
+
"A6683D",
|
|
144
|
+
"F691FE",
|
|
145
|
+
"874B64",
|
|
146
|
+
"FF0C4B",
|
|
147
|
+
"215E23",
|
|
148
|
+
"4292FF",
|
|
149
|
+
"87839D",
|
|
150
|
+
"672D45",
|
|
151
|
+
"B14F41",
|
|
152
|
+
"004E53",
|
|
153
|
+
"5F1B00",
|
|
154
|
+
"AD4167",
|
|
155
|
+
"503267",
|
|
156
|
+
"D6FFFD",
|
|
157
|
+
"7FB5D1",
|
|
158
|
+
"A9B969",
|
|
159
|
+
"FF96CB",
|
|
160
|
+
"C87495",
|
|
161
|
+
"365039",
|
|
162
|
+
"FFD063",
|
|
163
|
+
"5E5862",
|
|
164
|
+
"879476",
|
|
165
|
+
"A978FF",
|
|
166
|
+
"03C863",
|
|
167
|
+
"E7BED4",
|
|
168
|
+
"D4E3D0",
|
|
169
|
+
"876790",
|
|
170
|
+
"897C27",
|
|
171
|
+
"CDDCFF",
|
|
172
|
+
"AA676B",
|
|
173
|
+
"323474",
|
|
174
|
+
"FF5EA9",
|
|
175
|
+
"009BB0",
|
|
176
|
+
"71FFDD",
|
|
177
|
+
"785C38",
|
|
178
|
+
"50659B",
|
|
179
|
+
"CC00B3",
|
|
180
|
+
"577B55",
|
|
181
|
+
"516E7B",
|
|
182
|
+
"015F92",
|
|
183
|
+
"AABDBE",
|
|
184
|
+
"017F99",
|
|
185
|
+
"04DD97",
|
|
186
|
+
"873A2C",
|
|
187
|
+
"F0968E",
|
|
188
|
+
"75C6AA",
|
|
189
|
+
"70695D",
|
|
190
|
+
"CCDC09",
|
|
191
|
+
"AF8557",
|
|
192
|
+
"D80075",
|
|
193
|
+
"9D3F81",
|
|
194
|
+
"D94500",
|
|
195
|
+
"DD6754",
|
|
196
|
+
"5FFF79",
|
|
197
|
+
"D5B173",
|
|
198
|
+
"62265E",
|
|
199
|
+
"BAA23D",
|
|
200
|
+
"D9F2B3",
|
|
201
|
+
"57028F",
|
|
202
|
+
"A19BAA",
|
|
203
|
+
"4D4A27",
|
|
204
|
+
"A4A9FF",
|
|
205
|
+
"ACE8DB",
|
|
206
|
+
"995901",
|
|
207
|
+
"AC00E2",
|
|
208
|
+
"47822F",
|
|
209
|
+
"CBC3AD",
|
|
210
|
+
"00C5B6",
|
|
211
|
+
"615378",
|
|
212
|
+
"336D68",
|
|
213
|
+
"A59280",
|
|
214
|
+
"8499A2",
|
|
215
|
+
"FD5764",
|
|
216
|
+
"7096D2",
|
|
217
|
+
"728D07",
|
|
218
|
+
"7F004C",
|
|
219
|
+
"1530A0",
|
|
220
|
+
"D1C1E2",
|
|
221
|
+
"C985D0",
|
|
222
|
+
"6C454B",
|
|
223
|
+
"7F0024",
|
|
224
|
+
"00A279",
|
|
225
|
+
"B2A9CF",
|
|
226
|
+
"F90000",
|
|
227
|
+
"B0E9FF",
|
|
228
|
+
"939E50",
|
|
229
|
+
"727A82",
|
|
230
|
+
"D92E55",
|
|
231
|
+
"476101",
|
|
232
|
+
"0059FF",
|
|
233
|
+
"7740B5",
|
|
234
|
+
"ACE460",
|
|
235
|
+
"674525",
|
|
236
|
+
"525D51",
|
|
237
|
+
"957368",
|
|
238
|
+
"A9E49A",
|
|
239
|
+
"A30058",
|
|
240
|
+
"D962F6",
|
|
241
|
+
"8E7DCF",
|
|
242
|
+
"FFBD93",
|
|
243
|
+
"A30092",
|
|
244
|
+
"9AFFB9",
|
|
245
|
+
"A7C2FF",
|
|
246
|
+
"F46200",
|
|
247
|
+
"E5F0FF",
|
|
248
|
+
"B89CA4",
|
|
249
|
+
"609694",
|
|
250
|
+
"FF9F35",
|
|
251
|
+
"8C2900",
|
|
252
|
+
"726B32",
|
|
253
|
+
"DF824E",
|
|
254
|
+
"AF7BD5",
|
|
255
|
+
"BC2D00",
|
|
256
|
+
"7B6FA3",
|
|
257
|
+
"484362",
|
|
258
|
+
"C7A3FF",
|
|
259
|
+
"004D28",
|
|
260
|
+
"C4C68E",
|
|
261
|
+
"E048D7",
|
|
262
|
+
"E7E965",
|
|
263
|
+
"E5C10B",
|
|
264
|
+
"00F4F1",
|
|
265
|
+
"9F5BA2",
|
|
266
|
+
"4C41B7",
|
|
267
|
+
"65338E",
|
|
268
|
+
"767E6C",
|
|
269
|
+
"A98A36",
|
|
270
|
+
];
|
|
271
|
+
/**
|
|
272
|
+
* Get default colors for channels.
|
|
273
|
+
*
|
|
274
|
+
* For a single channel, returns white (FFFFFF).
|
|
275
|
+
* For multiple channels, uses the Glasbey color progression.
|
|
276
|
+
*/
|
|
277
|
+
export function getDefaultColors(nChannels) {
|
|
278
|
+
if (nChannels === 1) {
|
|
279
|
+
return ["FFFFFF"];
|
|
280
|
+
}
|
|
281
|
+
// Cycle through Glasbey colors if we have more channels than colors
|
|
282
|
+
return Array.from({ length: nChannels }, (_, i) => GLASBEY_COLORS[i % GLASBEY_COLORS.length]);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Validate that quantiles are in valid range and properly ordered.
|
|
286
|
+
*/
|
|
287
|
+
function validateQuantiles(quantiles) {
|
|
288
|
+
const [low, high] = quantiles;
|
|
289
|
+
if (!(low >= 0.0 && low <= 1.0)) {
|
|
290
|
+
throw new Error(`Low quantile must be between 0 and 1, got ${low}`);
|
|
291
|
+
}
|
|
292
|
+
if (!(high >= 0.0 && high <= 1.0)) {
|
|
293
|
+
throw new Error(`High quantile must be between 0 and 1, got ${high}`);
|
|
294
|
+
}
|
|
295
|
+
if (low >= high) {
|
|
296
|
+
throw new Error(`Low quantile must be less than high quantile, got (${low}, ${high})`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Validate that a color is a valid 6-digit hexadecimal string.
|
|
301
|
+
*/
|
|
302
|
+
function validateColor(color) {
|
|
303
|
+
const hexPattern = /^[0-9A-Fa-f]{6}$/;
|
|
304
|
+
if (!hexPattern.test(color)) {
|
|
305
|
+
throw new Error(`Color must be a 6-digit hexadecimal string without # prefix, got '${color}'`);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Maximum sample size for approximate quantile computation.
|
|
310
|
+
* For datasets larger than this, we use reservoir sampling for memory efficiency.
|
|
311
|
+
*/
|
|
312
|
+
const QUANTILE_SAMPLE_SIZE = 10_000;
|
|
313
|
+
/**
|
|
314
|
+
* Helper function to compute quantile from a sorted array.
|
|
315
|
+
*/
|
|
316
|
+
function computeQuantile(sortedValues, q) {
|
|
317
|
+
if (sortedValues.length === 0) {
|
|
318
|
+
return NaN;
|
|
319
|
+
}
|
|
320
|
+
if (sortedValues.length === 1) {
|
|
321
|
+
return sortedValues[0];
|
|
322
|
+
}
|
|
323
|
+
const index = q * (sortedValues.length - 1);
|
|
324
|
+
const lower = Math.floor(index);
|
|
325
|
+
const upper = Math.ceil(index);
|
|
326
|
+
const weight = index - lower;
|
|
327
|
+
if (lower === upper) {
|
|
328
|
+
return sortedValues[lower];
|
|
329
|
+
}
|
|
330
|
+
return sortedValues[lower] * (1 - weight) + sortedValues[upper] * weight;
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Compute channel statistics (min, max, and quantiles) from array data.
|
|
334
|
+
*
|
|
335
|
+
* For large datasets (>10,000 non-NaN values), uses reservoir sampling
|
|
336
|
+
* to compute approximate quantiles with reduced memory footprint.
|
|
337
|
+
* Min and max are always exact.
|
|
338
|
+
*/
|
|
339
|
+
function computeChannelStatistics(data, quantiles) {
|
|
340
|
+
let min = Number.POSITIVE_INFINITY;
|
|
341
|
+
let max = Number.NEGATIVE_INFINITY;
|
|
342
|
+
// Reservoir sample for approximate quantile computation
|
|
343
|
+
const sample = [];
|
|
344
|
+
let count = 0;
|
|
345
|
+
for (let i = 0; i < data.length; i++) {
|
|
346
|
+
const v = data[i];
|
|
347
|
+
if (Number.isNaN(v)) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
// Update min and max (always exact)
|
|
351
|
+
if (v < min)
|
|
352
|
+
min = v;
|
|
353
|
+
if (v > max)
|
|
354
|
+
max = v;
|
|
355
|
+
// Update reservoir sample for quantiles
|
|
356
|
+
if (sample.length < QUANTILE_SAMPLE_SIZE) {
|
|
357
|
+
sample.push(v);
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
// Reservoir sampling: replace random element with probability QUANTILE_SAMPLE_SIZE/(count+1)
|
|
361
|
+
const j = Math.floor(Math.random() * (count + 1));
|
|
362
|
+
if (j < QUANTILE_SAMPLE_SIZE) {
|
|
363
|
+
sample[j] = v;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
count++;
|
|
367
|
+
}
|
|
368
|
+
if (count === 0) {
|
|
369
|
+
return { min: NaN, max: NaN, qLow: NaN, qHigh: NaN };
|
|
370
|
+
}
|
|
371
|
+
// Sort sample for quantile computation
|
|
372
|
+
sample.sort((a, b) => a - b);
|
|
373
|
+
const qLow = computeQuantile(sample, quantiles[0]);
|
|
374
|
+
const qHigh = computeQuantile(sample, quantiles[1]);
|
|
375
|
+
return { min, max, qLow, qHigh };
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Extract a single channel from multi-dimensional typed array data.
|
|
379
|
+
*/
|
|
380
|
+
function extractChannel(data, shape, channelIndex, channelDimIndex) {
|
|
381
|
+
const nChannels = shape[channelDimIndex];
|
|
382
|
+
const result = [];
|
|
383
|
+
// Calculate the stride for the channel dimension
|
|
384
|
+
let channelStride = 1;
|
|
385
|
+
for (let i = channelDimIndex + 1; i < shape.length; i++) {
|
|
386
|
+
channelStride *= shape[i];
|
|
387
|
+
}
|
|
388
|
+
// Calculate the total size of dimensions before the channel dimension
|
|
389
|
+
let outerSize = 1;
|
|
390
|
+
for (let i = 0; i < channelDimIndex; i++) {
|
|
391
|
+
outerSize *= shape[i];
|
|
392
|
+
}
|
|
393
|
+
// Extract all values for this channel
|
|
394
|
+
for (let outer = 0; outer < outerSize; outer++) {
|
|
395
|
+
const outerOffset = outer * nChannels * channelStride;
|
|
396
|
+
const channelOffset = outerOffset + channelIndex * channelStride;
|
|
397
|
+
for (let inner = 0; inner < channelStride; inner++) {
|
|
398
|
+
result.push(data[channelOffset + inner]);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Compute OMERO metadata from an NgffImage.
|
|
405
|
+
*
|
|
406
|
+
* This function computes visualization parameters (OMERO metadata) from image data:
|
|
407
|
+
* - min/max: The actual data range
|
|
408
|
+
* - start/end: Display window based on quantiles (default 2% and 98%)
|
|
409
|
+
*
|
|
410
|
+
* For multi-channel images (with 'c' dimension), statistics are computed
|
|
411
|
+
* separately for each channel, resulting in per-channel OMERO windows.
|
|
412
|
+
*
|
|
413
|
+
* Memory requirements: This function loads the entire image data into memory
|
|
414
|
+
* for statistics computation. For large images, use the lowest resolution
|
|
415
|
+
* image from a multiscales pyramid.
|
|
416
|
+
*
|
|
417
|
+
* Edge cases:
|
|
418
|
+
* - If all values in a channel are NaN, the statistics will be NaN.
|
|
419
|
+
* - If a channel has constant values, min/max/start/end will all be the same.
|
|
420
|
+
*
|
|
421
|
+
* @param image - The NgffImage to compute metadata for
|
|
422
|
+
* @param options - Optional configuration for quantiles, colors, and labels
|
|
423
|
+
* - quantiles: Tuple of (low, high) quantile values. Must be between 0 and 1,
|
|
424
|
+
* with low < high. Default is [0.02, 0.98] for 2% and 98% quantiles.
|
|
425
|
+
* - colors: List of hex color strings (without #) for each channel.
|
|
426
|
+
* Must be 6-digit hexadecimal strings (e.g., "FF0000" for red).
|
|
427
|
+
* If not provided, uses white for single channel or Glasbey
|
|
428
|
+
* progression for multi-channel.
|
|
429
|
+
* - labels: List of label strings for each channel.
|
|
430
|
+
* If not provided, uses empty strings.
|
|
431
|
+
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
432
|
+
* @throws {Error} If quantiles are invalid, colors are invalid format,
|
|
433
|
+
* or not enough colors/labels provided.
|
|
434
|
+
*
|
|
435
|
+
* @example
|
|
436
|
+
* ```ts
|
|
437
|
+
* const omero = await computeOmeroFromNgffImage(image);
|
|
438
|
+
* multiscales.metadata.omero = omero;
|
|
439
|
+
* ```
|
|
440
|
+
*/
|
|
441
|
+
export async function computeOmeroFromNgffImage(image, options = {}) {
|
|
442
|
+
const quantiles = options.quantiles ?? [0.02, 0.98];
|
|
443
|
+
// Validate quantiles
|
|
444
|
+
validateQuantiles(quantiles);
|
|
445
|
+
const dims = image.dims;
|
|
446
|
+
const shape = image.data.shape;
|
|
447
|
+
// Check if there's a channel dimension
|
|
448
|
+
const hasChannelDim = dims.includes("c");
|
|
449
|
+
const cIndex = hasChannelDim ? dims.indexOf("c") : -1;
|
|
450
|
+
const nChannels = hasChannelDim ? shape[cIndex] : 1;
|
|
451
|
+
// Get colors
|
|
452
|
+
let channelColors;
|
|
453
|
+
if (options.colors !== undefined) {
|
|
454
|
+
if (options.colors.length < nChannels) {
|
|
455
|
+
throw new Error(`Not enough colors provided. Got ${options.colors.length}, need ${nChannels}.`);
|
|
456
|
+
}
|
|
457
|
+
// Validate each color
|
|
458
|
+
for (const color of options.colors.slice(0, nChannels)) {
|
|
459
|
+
validateColor(color);
|
|
460
|
+
}
|
|
461
|
+
channelColors = options.colors.slice(0, nChannels);
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
channelColors = getDefaultColors(nChannels);
|
|
465
|
+
}
|
|
466
|
+
// Get labels
|
|
467
|
+
let channelLabels;
|
|
468
|
+
if (options.labels !== undefined) {
|
|
469
|
+
if (options.labels.length < nChannels) {
|
|
470
|
+
throw new Error(`Not enough labels provided. Got ${options.labels.length}, need ${nChannels}.`);
|
|
471
|
+
}
|
|
472
|
+
channelLabels = options.labels.slice(0, nChannels);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
channelLabels = Array(nChannels).fill("");
|
|
476
|
+
}
|
|
477
|
+
// Read all data from the zarr array
|
|
478
|
+
const result = await zarr.get(image.data);
|
|
479
|
+
const fullData = result.data;
|
|
480
|
+
// Compute statistics for each channel
|
|
481
|
+
const channels = [];
|
|
482
|
+
for (let chIdx = 0; chIdx < nChannels; chIdx++) {
|
|
483
|
+
let channelData;
|
|
484
|
+
if (hasChannelDim) {
|
|
485
|
+
// Extract this channel's data
|
|
486
|
+
channelData = extractChannel(fullData, shape, chIdx, cIndex);
|
|
487
|
+
}
|
|
488
|
+
else {
|
|
489
|
+
channelData = fullData;
|
|
490
|
+
}
|
|
491
|
+
// Compute statistics
|
|
492
|
+
const stats = computeChannelStatistics(channelData, quantiles);
|
|
493
|
+
// Create OMERO window
|
|
494
|
+
const window = {
|
|
495
|
+
min: stats.min,
|
|
496
|
+
max: stats.max,
|
|
497
|
+
start: stats.qLow,
|
|
498
|
+
end: stats.qHigh,
|
|
499
|
+
};
|
|
500
|
+
// Create channel metadata
|
|
501
|
+
const channel = {
|
|
502
|
+
color: channelColors[chIdx],
|
|
503
|
+
window,
|
|
504
|
+
label: channelLabels[chIdx],
|
|
505
|
+
};
|
|
506
|
+
channels.push(channel);
|
|
507
|
+
}
|
|
508
|
+
return { channels };
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Compute OMERO metadata from a Multiscales object.
|
|
512
|
+
*
|
|
513
|
+
* This is a convenience function that computes OMERO metadata from the
|
|
514
|
+
* highest or lowest resolution image in a multiscales pyramid.
|
|
515
|
+
*
|
|
516
|
+
* @param multiscales - The Multiscales object to compute metadata for
|
|
517
|
+
* @param options - Optional configuration for quantiles, colors, labels, and resolution
|
|
518
|
+
* @returns Promise resolving to Omero metadata with computed window parameters
|
|
519
|
+
*/
|
|
520
|
+
export async function computeOmeroFromMultiscales(multiscales, options = {}) {
|
|
521
|
+
if (!multiscales.images || multiscales.images.length === 0) {
|
|
522
|
+
throw new Error("Multiscales has no images");
|
|
523
|
+
}
|
|
524
|
+
const useLowestResolution = options.useLowestResolution ?? true;
|
|
525
|
+
// Select which image to use based on resolution preference
|
|
526
|
+
const image = useLowestResolution
|
|
527
|
+
? multiscales.images[multiscales.images.length - 1] // Last image (lowest resolution)
|
|
528
|
+
: multiscales.images[0]; // First image (highest resolution)
|
|
529
|
+
const computeOptions = {};
|
|
530
|
+
if (options.quantiles !== undefined) {
|
|
531
|
+
computeOptions.quantiles = options.quantiles;
|
|
532
|
+
}
|
|
533
|
+
if (options.colors !== undefined) {
|
|
534
|
+
computeOptions.colors = options.colors;
|
|
535
|
+
}
|
|
536
|
+
if (options.labels !== undefined) {
|
|
537
|
+
computeOptions.labels = options.labels;
|
|
538
|
+
}
|
|
539
|
+
return await computeOmeroFromNgffImage(image, computeOptions);
|
|
540
|
+
}
|
|
541
|
+
//# sourceMappingURL=compute_omero.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute_omero.js","sourceRoot":"","sources":["../../src/utils/compute_omero.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAE/B;;GAEG;AAEH,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAShC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;I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"}
|