@cornerstonejs/nifti-volume-loader 1.14.1

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.
Files changed (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/esm/NiftiImageVolume.d.ts +21 -0
  4. package/dist/esm/NiftiImageVolume.js +26 -0
  5. package/dist/esm/NiftiImageVolume.js.map +1 -0
  6. package/dist/esm/constants/index.d.ts +2 -0
  7. package/dist/esm/constants/index.js +3 -0
  8. package/dist/esm/constants/index.js.map +1 -0
  9. package/dist/esm/constants/niftiLoaderScheme.d.ts +2 -0
  10. package/dist/esm/constants/niftiLoaderScheme.js +3 -0
  11. package/dist/esm/constants/niftiLoaderScheme.js.map +1 -0
  12. package/dist/esm/cornerstoneNiftiImageLoader.d.ts +7 -0
  13. package/dist/esm/cornerstoneNiftiImageLoader.js +10 -0
  14. package/dist/esm/cornerstoneNiftiImageLoader.js.map +1 -0
  15. package/dist/esm/enums/Events.d.ts +5 -0
  16. package/dist/esm/enums/Events.js +7 -0
  17. package/dist/esm/enums/Events.js.map +1 -0
  18. package/dist/esm/enums/index.d.ts +2 -0
  19. package/dist/esm/enums/index.js +3 -0
  20. package/dist/esm/enums/index.js.map +1 -0
  21. package/dist/esm/helpers/affineUtilities.d.ts +8 -0
  22. package/dist/esm/helpers/affineUtilities.js +45 -0
  23. package/dist/esm/helpers/affineUtilities.js.map +1 -0
  24. package/dist/esm/helpers/convert.d.ts +19 -0
  25. package/dist/esm/helpers/convert.js +83 -0
  26. package/dist/esm/helpers/convert.js.map +1 -0
  27. package/dist/esm/helpers/fetchAndAllocateNiftiVolume.d.ts +4 -0
  28. package/dist/esm/helpers/fetchAndAllocateNiftiVolume.js +163 -0
  29. package/dist/esm/helpers/fetchAndAllocateNiftiVolume.js.map +1 -0
  30. package/dist/esm/helpers/index.d.ts +4 -0
  31. package/dist/esm/helpers/index.js +5 -0
  32. package/dist/esm/helpers/index.js.map +1 -0
  33. package/dist/esm/helpers/makeVolumeMetadata.d.ts +2 -0
  34. package/dist/esm/helpers/makeVolumeMetadata.js +51 -0
  35. package/dist/esm/helpers/makeVolumeMetadata.js.map +1 -0
  36. package/dist/esm/helpers/modalityScaleNifti.d.ts +1 -0
  37. package/dist/esm/helpers/modalityScaleNifti.js +11 -0
  38. package/dist/esm/helpers/modalityScaleNifti.js.map +1 -0
  39. package/dist/esm/helpers/niftiConstants.d.ts +43 -0
  40. package/dist/esm/helpers/niftiConstants.js +44 -0
  41. package/dist/esm/helpers/niftiConstants.js.map +1 -0
  42. package/dist/esm/index.d.ts +5 -0
  43. package/dist/esm/index.js +6 -0
  44. package/dist/esm/index.js.map +1 -0
  45. package/dist/umd/index.js +3 -0
  46. package/dist/umd/index.js.LICENSE.txt +1 -0
  47. package/dist/umd/index.js.map +1 -0
  48. package/package.json +47 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Open Health Imaging Foundation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @cornerstonejs/nifti-volume-loader
2
+
3
+ Nifti volume loader for the cornerstone3D framework.
@@ -0,0 +1,21 @@
1
+ import { ImageVolume } from '@cornerstonejs/core';
2
+ import type { Types } from '@cornerstonejs/core';
3
+ declare type LoadStatus = {
4
+ loaded: boolean;
5
+ loading: boolean;
6
+ callbacks: Array<(...args: unknown[]) => void>;
7
+ };
8
+ declare type NiftiImageProperties = {
9
+ loadStatus: LoadStatus;
10
+ controller: AbortController;
11
+ };
12
+ export default class NiftiImageVolume extends ImageVolume {
13
+ loadStatus: LoadStatus;
14
+ controller: AbortController;
15
+ constructor(imageVolumeProperties: Types.IVolume, streamingProperties: NiftiImageProperties);
16
+ cancelLoading: () => void;
17
+ clearLoadCallbacks(): void;
18
+ load: (callback: (...args: unknown[]) => void, priority?: number) => void;
19
+ decache(): void;
20
+ }
21
+ export {};
@@ -0,0 +1,26 @@
1
+ import { ImageVolume, cache } from '@cornerstonejs/core';
2
+ export default class NiftiImageVolume extends ImageVolume {
3
+ constructor(imageVolumeProperties, streamingProperties) {
4
+ super(imageVolumeProperties);
5
+ this.cancelLoading = () => {
6
+ const { loadStatus } = this;
7
+ if (!loadStatus || !loadStatus.loading) {
8
+ return;
9
+ }
10
+ loadStatus.loading = false;
11
+ this.clearLoadCallbacks();
12
+ this.controller.abort();
13
+ };
14
+ this.load = (callback, priority = 5) => {
15
+ };
16
+ this.loadStatus = streamingProperties.loadStatus;
17
+ this.controller = streamingProperties.controller;
18
+ }
19
+ clearLoadCallbacks() {
20
+ this.loadStatus.callbacks = [];
21
+ }
22
+ decache() {
23
+ cache.removeVolumeLoadObject(this.volumeId);
24
+ }
25
+ }
26
+ //# sourceMappingURL=NiftiImageVolume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NiftiImageVolume.js","sourceRoot":"","sources":["../../src/NiftiImageVolume.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAkBzD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IAIvD,YACE,qBAAoC,EACpC,mBAAyC;QAEzC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAWxB,kBAAa,GAAG,GAAG,EAAE;YAC1B,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;YAE5B,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;gBACtC,OAAO;aACR;YAGD,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAG3B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAE1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC;QAeK,SAAI,GAAG,CACZ,QAAsC,EACtC,QAAQ,GAAG,CAAC,EACN,EAAE;QAMV,CAAC,CAAC;QA/CA,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;QACjD,IAAI,CAAC,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC;IACnD,CAAC;IA0BM,kBAAkB;QACvB,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;IACjC,CAAC;IAmBM,OAAO;QACZ,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import NIFTI_LOADER_SCHEME from './niftiLoaderScheme';
2
+ export { NIFTI_LOADER_SCHEME };
@@ -0,0 +1,3 @@
1
+ import NIFTI_LOADER_SCHEME from './niftiLoaderScheme';
2
+ export { NIFTI_LOADER_SCHEME };
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const niftiLoaderScheme = "nifti";
2
+ export default niftiLoaderScheme;
@@ -0,0 +1,3 @@
1
+ const niftiLoaderScheme = 'nifti';
2
+ export default niftiLoaderScheme;
3
+ //# sourceMappingURL=niftiLoaderScheme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"niftiLoaderScheme.js","sourceRoot":"","sources":["../../../src/constants/niftiLoaderScheme.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAElC,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import NiftiImageVolume from './NiftiImageVolume';
2
+ interface IVolumeLoader {
3
+ promise: Promise<NiftiImageVolume>;
4
+ cancel: () => void;
5
+ }
6
+ export default function cornerstoneNiftiImageVolumeLoader(volumeId: string): IVolumeLoader;
7
+ export {};
@@ -0,0 +1,10 @@
1
+ import { fetchAndAllocateNiftiVolume } from './helpers';
2
+ export default function cornerstoneNiftiImageVolumeLoader(volumeId) {
3
+ const niftiVolumePromise = fetchAndAllocateNiftiVolume(volumeId);
4
+ return {
5
+ promise: niftiVolumePromise,
6
+ cancel: () => {
7
+ },
8
+ };
9
+ }
10
+ //# sourceMappingURL=cornerstoneNiftiImageLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cornerstoneNiftiImageLoader.js","sourceRoot":"","sources":["../../src/cornerstoneNiftiImageLoader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAOxD,MAAM,CAAC,OAAO,UAAU,iCAAiC,CACvD,QAAgB;IAEhB,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,GAAG,EAAE;QAIb,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ declare enum Events {
2
+ NIFTI_VOLUME_LOADED = "CORNERSTONE_NIFTI_VOLUME_LOADED",
3
+ NIFTI_VOLUME_PROGRESS = "CORNERSTONE_NIFTI_VOLUME_PROGRESS"
4
+ }
5
+ export default Events;
@@ -0,0 +1,7 @@
1
+ var Events;
2
+ (function (Events) {
3
+ Events["NIFTI_VOLUME_LOADED"] = "CORNERSTONE_NIFTI_VOLUME_LOADED";
4
+ Events["NIFTI_VOLUME_PROGRESS"] = "CORNERSTONE_NIFTI_VOLUME_PROGRESS";
5
+ })(Events || (Events = {}));
6
+ export default Events;
7
+ //# sourceMappingURL=Events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Events.js","sourceRoot":"","sources":["../../../src/enums/Events.ts"],"names":[],"mappings":"AAGA,IAAK,MAUJ;AAVD,WAAK,MAAM;IAKT,iEAAuD,CAAA;IAIvD,qEAA2D,CAAA;AAC7D,CAAC,EAVI,MAAM,KAAN,MAAM,QAUV;AAED,eAAe,MAAM,CAAC"}
@@ -0,0 +1,2 @@
1
+ import Events from './Events';
2
+ export { Events };
@@ -0,0 +1,3 @@
1
+ import Events from './Events';
2
+ export { Events };
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/enums/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Types } from '@cornerstonejs/core';
2
+ declare function generateAffineMatrix(origin: Types.Point3, orientation: Types.Mat3, spacing: Types.Point3): Types.AffineMatrix;
3
+ declare function parseAffineMatrix(affine: any): {
4
+ origin: Types.Point3;
5
+ orientation: Types.Mat3;
6
+ spacing: Types.Point3;
7
+ };
8
+ export { generateAffineMatrix, parseAffineMatrix };
@@ -0,0 +1,45 @@
1
+ function generateAffineMatrix(origin, orientation, spacing) {
2
+ const Ox = origin[0];
3
+ const Oy = origin[1];
4
+ const Oz = origin[2];
5
+ const S1 = spacing[0];
6
+ const S2 = spacing[1];
7
+ const S3 = spacing[2];
8
+ const D11 = orientation[0];
9
+ const D12 = orientation[1];
10
+ const D13 = orientation[2];
11
+ const D21 = orientation[3];
12
+ const D22 = orientation[4];
13
+ const D23 = orientation[5];
14
+ const D31 = orientation[6];
15
+ const D32 = orientation[7];
16
+ const D33 = orientation[8];
17
+ return [
18
+ [D11 * S1, D12 * S2, D13 * S3, Ox],
19
+ [D21 * S1, D22 * S2, D23 * S3, Oy],
20
+ [D31 * S1, D32 * S2, D33 * S3, Oz],
21
+ [0, 0, 0, 1],
22
+ ];
23
+ }
24
+ function parseAffineMatrix(affine) {
25
+ const origin = [affine[0][3], affine[1][3], affine[2][3]];
26
+ const spacing = [
27
+ Math.sqrt(affine[0][0] ** 2 + affine[1][0] ** 2 + affine[2][0] ** 2),
28
+ Math.sqrt(affine[0][1] ** 2 + affine[1][1] ** 2 + affine[2][1] ** 2),
29
+ Math.sqrt(affine[0][2] ** 2 + affine[1][2] ** 2 + affine[2][2] ** 2),
30
+ ];
31
+ const orientation = [
32
+ affine[0][0] / spacing[0],
33
+ affine[0][1] / spacing[1],
34
+ affine[0][2] / spacing[2],
35
+ affine[1][0] / spacing[0],
36
+ affine[1][1] / spacing[1],
37
+ affine[1][2] / spacing[2],
38
+ affine[2][0] / spacing[0],
39
+ affine[2][1] / spacing[1],
40
+ affine[2][2] / spacing[2],
41
+ ];
42
+ return { origin, orientation, spacing };
43
+ }
44
+ export { generateAffineMatrix, parseAffineMatrix };
45
+ //# sourceMappingURL=affineUtilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"affineUtilities.js","sourceRoot":"","sources":["../../../src/helpers/affineUtilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Types } from '@cornerstonejs/core';
2
+ declare const invertDataPerFrame: (dimensions: any, imageDataArray: any) => any;
3
+ declare function rasToLps(niftiHeader: any): {
4
+ origin: Types.Point3;
5
+ orientation: number[];
6
+ spacing: Types.Point3;
7
+ };
8
+ declare function lpsToRas(header: any): {
9
+ orientation: any[];
10
+ origin: any[];
11
+ dataType: any;
12
+ dimensions: any;
13
+ spacing: any;
14
+ slope: any;
15
+ inter: any;
16
+ max: any;
17
+ min: any;
18
+ };
19
+ export { lpsToRas, rasToLps, invertDataPerFrame };
@@ -0,0 +1,83 @@
1
+ import { parseAffineMatrix } from './affineUtilities';
2
+ const invertDataPerFrame = (dimensions, imageDataArray) => {
3
+ let TypedArrayConstructor;
4
+ let bytesPerVoxel;
5
+ if (imageDataArray instanceof Uint8Array ||
6
+ imageDataArray instanceof ArrayBuffer ||
7
+ imageDataArray instanceof SharedArrayBuffer) {
8
+ TypedArrayConstructor = Uint8Array;
9
+ bytesPerVoxel = 1;
10
+ }
11
+ else if (imageDataArray instanceof Int16Array) {
12
+ TypedArrayConstructor = Int16Array;
13
+ bytesPerVoxel = 2;
14
+ }
15
+ else if (imageDataArray instanceof Float32Array) {
16
+ TypedArrayConstructor = Float32Array;
17
+ bytesPerVoxel = 4;
18
+ }
19
+ else {
20
+ throw new Error('imageDataArray needs to be a Uint8Array, Int16Array or Float32Array.');
21
+ }
22
+ const newImageDataArray = new TypedArrayConstructor(imageDataArray.byteLength);
23
+ const view = new TypedArrayConstructor(imageDataArray);
24
+ newImageDataArray.set(view);
25
+ const numFrames = dimensions[2];
26
+ const frameLength = dimensions[0] * dimensions[1];
27
+ const buffer = newImageDataArray.buffer;
28
+ for (let frame = 0; frame < numFrames; frame++) {
29
+ const byteOffset = frameLength * frame * bytesPerVoxel;
30
+ const frameView = new TypedArrayConstructor(buffer, byteOffset, frameLength);
31
+ frameView.reverse();
32
+ }
33
+ return newImageDataArray;
34
+ };
35
+ function rasToLps(niftiHeader) {
36
+ const { affine } = niftiHeader;
37
+ const { orientation, origin, spacing } = parseAffineMatrix(affine);
38
+ const newOrigin = [-origin[0], -origin[1], origin[2]];
39
+ const newOrientation = [
40
+ -orientation[0],
41
+ -orientation[3],
42
+ orientation[6],
43
+ -orientation[1],
44
+ -orientation[4],
45
+ orientation[7],
46
+ -orientation[2],
47
+ -orientation[5],
48
+ orientation[8],
49
+ ];
50
+ return {
51
+ origin: newOrigin,
52
+ orientation: newOrientation,
53
+ spacing,
54
+ };
55
+ }
56
+ function lpsToRas(header) {
57
+ const { origin, orientation, spacing, dimensions, dataType } = header;
58
+ const newOrigin = [-origin[0], -origin[1], origin[2]];
59
+ const newOrientation = [
60
+ -orientation[0],
61
+ -orientation[3],
62
+ orientation[6],
63
+ -orientation[1],
64
+ -orientation[4],
65
+ orientation[7],
66
+ -orientation[2],
67
+ -orientation[5],
68
+ orientation[8],
69
+ ];
70
+ return {
71
+ orientation: newOrientation,
72
+ origin: [newOrigin[0], newOrigin[1], newOrigin[2]],
73
+ dataType,
74
+ dimensions,
75
+ spacing,
76
+ slope: header.slope,
77
+ inter: header.inter,
78
+ max: header.max,
79
+ min: header.min,
80
+ };
81
+ }
82
+ export { lpsToRas, rasToLps, invertDataPerFrame };
83
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/helpers/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import NiftiImageVolume from '../NiftiImageVolume';
2
+ export declare const urlsMap: Map<any, any>;
3
+ export declare const getTypedNiftiArray: (datatypeCode: any, niftiImageBuffer: any) => Float32Array | Int16Array | Uint8Array;
4
+ export default function fetchAndAllocateNiftiVolume(volumeId: string): Promise<NiftiImageVolume>;
@@ -0,0 +1,163 @@
1
+ import * as NiftiReader from 'nifti-reader-js';
2
+ import { cache, utilities, Enums, eventTarget, triggerEvent, } from '@cornerstonejs/core';
3
+ import { vec3 } from 'gl-matrix';
4
+ import makeVolumeMetadata from './makeVolumeMetadata';
5
+ import NiftiImageVolume from '../NiftiImageVolume';
6
+ import * as NIFTICONSTANTS from './niftiConstants';
7
+ import { invertDataPerFrame, rasToLps } from './convert';
8
+ import modalityScaleNifti from './modalityScaleNifti';
9
+ import Events from '../enums/Events';
10
+ import { NIFTI_LOADER_SCHEME } from '../constants';
11
+ const { createUint8SharedArray, createFloat32SharedArray } = utilities;
12
+ export const urlsMap = new Map();
13
+ function fetchArrayBuffer(url, onProgress, signal, onload) {
14
+ return new Promise((resolve, reject) => {
15
+ const xhr = new XMLHttpRequest();
16
+ xhr.open('GET', url, true);
17
+ xhr.responseType = 'arraybuffer';
18
+ const onLoadHandler = function (e) {
19
+ if (onload && typeof onload === 'function') {
20
+ onload();
21
+ }
22
+ if (signal) {
23
+ signal.removeEventListener('abort', onAbortHandler);
24
+ }
25
+ resolve(xhr.response);
26
+ };
27
+ const onAbortHandler = () => {
28
+ xhr.abort();
29
+ xhr.removeEventListener('load', onLoadHandler);
30
+ reject(new Error('Request aborted'));
31
+ };
32
+ xhr.addEventListener('load', onLoadHandler);
33
+ if (onProgress && typeof onProgress === 'function') {
34
+ xhr.onprogress = function (e) {
35
+ onProgress(e.loaded, e.total);
36
+ };
37
+ }
38
+ if (signal && signal.aborted) {
39
+ xhr.abort();
40
+ reject(new Error('Request aborted'));
41
+ }
42
+ else if (signal) {
43
+ signal.addEventListener('abort', onAbortHandler);
44
+ }
45
+ xhr.send();
46
+ });
47
+ }
48
+ export const getTypedNiftiArray = (datatypeCode, niftiImageBuffer) => {
49
+ switch (datatypeCode) {
50
+ case NIFTICONSTANTS.NIFTI_TYPE_UINT8:
51
+ return new Uint8Array(niftiImageBuffer);
52
+ case NIFTICONSTANTS.NIFTI_TYPE_FLOAT32:
53
+ return new Float32Array(niftiImageBuffer);
54
+ case NIFTICONSTANTS.NIFTI_TYPE_INT16:
55
+ return new Int16Array(niftiImageBuffer);
56
+ default:
57
+ throw new Error(`datatypeCode ${datatypeCode} is not yet supported`);
58
+ }
59
+ };
60
+ export default async function fetchAndAllocateNiftiVolume(volumeId) {
61
+ const niftiURL = volumeId.substring(NIFTI_LOADER_SCHEME.length + 1);
62
+ const progress = (loaded, total) => {
63
+ const data = { volumeId, loaded, total };
64
+ triggerEvent(eventTarget, Events.NIFTI_VOLUME_PROGRESS, {
65
+ data,
66
+ });
67
+ };
68
+ const onLoad = () => {
69
+ const data = { volumeId };
70
+ triggerEvent(eventTarget, Events.NIFTI_VOLUME_LOADED, {
71
+ data,
72
+ });
73
+ };
74
+ const controller = new AbortController();
75
+ const signal = controller.signal;
76
+ urlsMap.set(niftiURL, { controller, loading: true });
77
+ let niftiBuffer = (await fetchArrayBuffer(niftiURL, progress, signal, onLoad));
78
+ urlsMap.delete(niftiURL);
79
+ let niftiHeader = null;
80
+ let niftiImage = null;
81
+ if (NiftiReader.isCompressed(niftiBuffer)) {
82
+ niftiBuffer = NiftiReader.decompress(niftiBuffer);
83
+ }
84
+ if (NiftiReader.isNIFTI(niftiBuffer)) {
85
+ niftiHeader = NiftiReader.readHeader(niftiBuffer);
86
+ niftiImage = NiftiReader.readImage(niftiHeader, niftiBuffer);
87
+ }
88
+ const typedNiftiArray = getTypedNiftiArray(niftiHeader.datatypeCode, niftiImage);
89
+ const { orientation, origin, spacing } = rasToLps(niftiHeader);
90
+ invertDataPerFrame(niftiHeader.dims.slice(1, 4), typedNiftiArray);
91
+ modalityScaleNifti(typedNiftiArray, niftiHeader);
92
+ const volumeMetadata = makeVolumeMetadata(niftiHeader, orientation, typedNiftiArray);
93
+ const scanAxisNormal = vec3.create();
94
+ vec3.set(scanAxisNormal, orientation[6], orientation[7], orientation[8]);
95
+ const { BitsAllocated, PixelRepresentation, PhotometricInterpretation, ImageOrientationPatient, Columns, Rows, } = volumeMetadata;
96
+ const rowCosineVec = vec3.fromValues(ImageOrientationPatient[0], ImageOrientationPatient[1], ImageOrientationPatient[2]);
97
+ const colCosineVec = vec3.fromValues(ImageOrientationPatient[3], ImageOrientationPatient[4], ImageOrientationPatient[5]);
98
+ const { dims } = niftiHeader;
99
+ const numFrames = dims[3];
100
+ const dimensions = [Columns, Rows, numFrames];
101
+ const direction = new Float32Array([
102
+ rowCosineVec[0],
103
+ rowCosineVec[1],
104
+ rowCosineVec[2],
105
+ colCosineVec[0],
106
+ colCosineVec[1],
107
+ colCosineVec[2],
108
+ scanAxisNormal[0],
109
+ scanAxisNormal[1],
110
+ scanAxisNormal[2],
111
+ ]);
112
+ const signed = PixelRepresentation === 1;
113
+ let bytesPerVoxel = 1;
114
+ if (BitsAllocated === 16 || BitsAllocated === 32) {
115
+ bytesPerVoxel = 4;
116
+ }
117
+ const sizeInBytesPerComponent = bytesPerVoxel * dimensions[0] * dimensions[1] * dimensions[2];
118
+ let numComponents = 1;
119
+ if (PhotometricInterpretation === 'RGB') {
120
+ numComponents = 3;
121
+ }
122
+ const sizeInBytes = sizeInBytesPerComponent * numComponents;
123
+ const isCacheable = cache.isCacheable(sizeInBytes);
124
+ if (!isCacheable) {
125
+ throw new Error(Enums.Events.CACHE_SIZE_EXCEEDED);
126
+ }
127
+ cache.decacheIfNecessaryUntilBytesAvailable(sizeInBytes);
128
+ let scalarData;
129
+ switch (BitsAllocated) {
130
+ case 8:
131
+ if (signed) {
132
+ throw new Error('8 Bit signed images are not yet supported by this plugin.');
133
+ }
134
+ else {
135
+ scalarData = createUint8SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);
136
+ }
137
+ break;
138
+ case 16:
139
+ case 32:
140
+ scalarData = createFloat32SharedArray(dimensions[0] * dimensions[1] * dimensions[2]);
141
+ break;
142
+ }
143
+ scalarData.set(typedNiftiArray);
144
+ const niftiImageVolume = new NiftiImageVolume({
145
+ volumeId,
146
+ metadata: volumeMetadata,
147
+ dimensions,
148
+ spacing,
149
+ origin,
150
+ direction,
151
+ scalarData,
152
+ sizeInBytes,
153
+ }, {
154
+ loadStatus: {
155
+ loaded: false,
156
+ loading: false,
157
+ callbacks: [],
158
+ },
159
+ controller,
160
+ });
161
+ return niftiImageVolume;
162
+ }
163
+ //# sourceMappingURL=fetchAndAllocateNiftiVolume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchAndAllocateNiftiVolume.js","sourceRoot":"","sources":["../../../src/helpers/fetchAndAllocateNiftiVolume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import makeVolumeMetadata from './makeVolumeMetadata';
2
+ import modalityScaleNifti from './modalityScaleNifti';
3
+ import fetchAndAllocateNiftiVolume from './fetchAndAllocateNiftiVolume';
4
+ export { modalityScaleNifti, makeVolumeMetadata, fetchAndAllocateNiftiVolume };
@@ -0,0 +1,5 @@
1
+ import makeVolumeMetadata from './makeVolumeMetadata';
2
+ import modalityScaleNifti from './modalityScaleNifti';
3
+ import fetchAndAllocateNiftiVolume from './fetchAndAllocateNiftiVolume';
4
+ export { modalityScaleNifti, makeVolumeMetadata, fetchAndAllocateNiftiVolume };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,2BAA2B,MAAM,+BAA+B,CAAC;AAExE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Types } from '@cornerstonejs/core';
2
+ export default function makeVolumeMetadata(niftiHeader: any, orientation: any, scalarData: any): Types.Metadata;
@@ -0,0 +1,51 @@
1
+ import { vec3 } from 'gl-matrix';
2
+ export default function makeVolumeMetadata(niftiHeader, orientation, scalarData) {
3
+ const { numBitsPerVoxel, littleEndian, pixDims, dims } = niftiHeader;
4
+ const rowCosines = vec3.create();
5
+ const columnCosines = vec3.create();
6
+ vec3.set(rowCosines, orientation[0], orientation[1], orientation[2]);
7
+ vec3.set(columnCosines, orientation[3], orientation[4], orientation[5]);
8
+ let min = Infinity;
9
+ let max = -Infinity;
10
+ const xDim = dims[1];
11
+ const yDim = dims[2];
12
+ const zDim = dims[3];
13
+ const frameLength = xDim * yDim;
14
+ const middleFrameIndex = Math.floor(zDim / 2);
15
+ const offset = frameLength * middleFrameIndex;
16
+ for (let voxelIndex = offset; voxelIndex < offset + frameLength; voxelIndex++) {
17
+ const voxelValue = scalarData[voxelIndex];
18
+ if (voxelValue > max) {
19
+ max = voxelValue;
20
+ }
21
+ if (voxelValue < min) {
22
+ min = voxelValue;
23
+ }
24
+ }
25
+ const windowCenter = (max + min) / 2;
26
+ const windowWidth = max - min;
27
+ return {
28
+ BitsAllocated: numBitsPerVoxel,
29
+ BitsStored: numBitsPerVoxel,
30
+ SamplesPerPixel: 1,
31
+ HighBit: littleEndian ? numBitsPerVoxel - 1 : 1,
32
+ PhotometricInterpretation: 'MONOCHROME2',
33
+ PixelRepresentation: 1,
34
+ ImageOrientationPatient: [
35
+ rowCosines[0],
36
+ rowCosines[1],
37
+ rowCosines[2],
38
+ columnCosines[0],
39
+ columnCosines[1],
40
+ columnCosines[2],
41
+ ],
42
+ PixelSpacing: [pixDims[1], pixDims[2]],
43
+ Columns: xDim,
44
+ Rows: yDim,
45
+ voiLut: [{ windowCenter, windowWidth }],
46
+ FrameOfReferenceUID: '1.2.3',
47
+ Modality: 'MR',
48
+ VOILUTFunction: 'LINEAR',
49
+ };
50
+ }
51
+ //# sourceMappingURL=makeVolumeMetadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeVolumeMetadata.js","sourceRoot":"","sources":["../../../src/helpers/makeVolumeMetadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,WAAW,EACX,WAAW,EACX,UAAU;IAEV,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAEpC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAExE,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAErB,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAEhC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAE9C,KACE,IAAI,UAAU,GAAG,MAAM,EACvB,UAAU,GAAG,MAAM,GAAG,WAAW,EACjC,UAAU,EAAE,EACZ;QACA,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAE1C,IAAI,UAAU,GAAG,GAAG,EAAE;YACpB,GAAG,GAAG,UAAU,CAAC;SAClB;QACD,IAAI,UAAU,GAAG,GAAG,EAAE;YACpB,GAAG,GAAG,UAAU,CAAC;SAClB;KACF;IAED,MAAM,YAAY,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,CAAC;IAE9B,OAAO;QACL,aAAa,EAAE,eAAe;QAC9B,UAAU,EAAE,eAAe;QAC3B,eAAe,EAAE,CAAC;QAClB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,yBAAyB,EAAE,aAAa;QACxC,mBAAmB,EAAE,CAAC;QACtB,uBAAuB,EAAE;YACvB,UAAU,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,CAAC,CAAC;YACb,UAAU,CAAC,CAAC,CAAC;YACb,aAAa,CAAC,CAAC,CAAC;YAChB,aAAa,CAAC,CAAC,CAAC;YAChB,aAAa,CAAC,CAAC,CAAC;SACjB;QACD,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QAEV,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;QAGvC,mBAAmB,EAAE,OAAO;QAC5B,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,QAAQ;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ export default function modalityScaleNifti(array: Float32Array | Int16Array | Uint8Array, niftiHeader: any): void;
@@ -0,0 +1,11 @@
1
+ export default function modalityScaleNifti(array, niftiHeader) {
2
+ const arrayLength = array.length;
3
+ const { scl_slope, scl_inter } = niftiHeader;
4
+ if (!scl_slope || scl_slope === 0 || Number.isNaN(scl_slope)) {
5
+ return;
6
+ }
7
+ for (let i = 0; i < arrayLength; i++) {
8
+ array[i] = array[i] * scl_slope + scl_inter;
9
+ }
10
+ }
11
+ //# sourceMappingURL=modalityScaleNifti.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modalityScaleNifti.js","sourceRoot":"","sources":["../../../src/helpers/modalityScaleNifti.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,KAA6C,EAC7C,WAAW;IAEX,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IACjC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;IAE7C,IAAI,CAAC,SAAS,IAAI,SAAS,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QAE5D,OAAO;KACR;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;QACpC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC;KAC7C;AACH,CAAC"}