Skip to content

Commit

Permalink
fix: no need for wadors header provider in the demo (#356)
Browse files Browse the repository at this point in the history
* fix: no need for wadors header provider in the demo

* bump version
  • Loading branch information
sedghi authored Jan 10, 2023
1 parent c7fedd4 commit 92891cf
Show file tree
Hide file tree
Showing 8 changed files with 105 additions and 106 deletions.
3 changes: 1 addition & 2 deletions packages/docs/docs/concepts/designConsiderations.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ interfaces and functionality are broadly identified as:
- Tools

`@cornerstonejs/core` is a "rendering" library built on top of `vtk.js`.
which leverages `cornerstone`'s existing plumbing to integrate with image loaders and metadata providers. The `demo` package in this repository contains a simple "metadata provider", named "WADORSHeaderProvider", that allows for querying metadata by instance and
imageId.
which leverages `cornerstone`'s existing plumbing to integrate with image loaders and metadata providers.

This repository's `@cornerstonejs/tools` is a "tools" library that, once initialized, will listen for custom events emitted by `@cornerstonejs/core`. Please note, the event naming and handling overlaps the events and event handling in the `cornerstone-tools` library. If you attempt to use `cornerstone-tools` in tandem, you will likely encounter issues. As this is a possible use case, please don't hesitate to report any issues and propose potential solutions.
1 change: 0 additions & 1 deletion packages/docs/docs/tutorials/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ In order for `Cornerstone3D` to properly show the properties of an image such
as voi, suv values, etc., it needs metadata (in addition to the image data itself).
Therefore, proper metadata providers should be registered with `Cornerstone3D` so that it can work as intended. Examples of such providers are

- `WADORSHeaderProvider` for keeping naturalized metadata for proper PT SUV calculations


### Library Initialization
Expand Down
2 changes: 1 addition & 1 deletion packages/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
"@mdx-js/react": "^1.6.21",
"@svgr/webpack": "^6.2.1",
"clsx": "^1.1.1",
"cornerstone-wado-image-loader": "^4.6.0",
"cornerstone-wado-image-loader": "^4.7.0",
"dcmjs": "0.19.2",
"detect-gpu": "^4.0.45",
"dicom-parser": "^1.8.11",
Expand Down
4 changes: 2 additions & 2 deletions packages/streaming-image-volume-loader/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@
},
"dependencies": {
"@cornerstonejs/core": "^0.25.0",
"cornerstone-wado-image-loader": "^4.6.0"
"cornerstone-wado-image-loader": "^4.7.0"
},
"peerDependencies": {
"@cornerstonejs/calculate-suv": "1.0.2"
},
"devDependencies": {
"@cornerstonejs/calculate-suv": "1.0.2",
"cornerstone-wado-image-loader": "^4.6.0"
"cornerstone-wado-image-loader": "^4.7.0"
},
"contributors": [
{
Expand Down
42 changes: 0 additions & 42 deletions utils/demo/helpers/WADORSHeaderProvider.js

This file was deleted.

5 changes: 0 additions & 5 deletions utils/demo/helpers/createImageIdsAndCacheMetaData.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,12 @@ import { getPTImageIdInstanceMetadata } from './getPTImageIdInstanceMetadata';
import { utilities } from '@cornerstonejs/core';
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';

import WADORSHeaderProvider from './WADORSHeaderProvider';
import ptScalingMetaDataProvider from './ptScalingMetaDataProvider';
import getPixelSpacingInformation from './getPixelSpacingInformation';

const { DicomMetaDictionary } = dcmjs.data;
const { calibratedPixelSpacingMetadataProvider } = utilities;

const VOLUME = 'volume';

/**
* Uses dicomweb-client to fetch metadata of a study, cache it in cornerstone,
* and return a list of imageIds for the frames.
Expand Down Expand Up @@ -64,8 +61,6 @@ export default async function createImageIdsAndCacheMetaData({
instanceMetaData
);

WADORSHeaderProvider.addInstance(imageId, instanceMetaData);

// Add calibrated pixel spacing
const m = JSON.parse(JSON.stringify(instanceMetaData));
const instance = DicomMetaDictionary.naturalizeDataset(m);
Expand Down
149 changes: 101 additions & 48 deletions utils/demo/helpers/getPTImageIdInstanceMetadata.ts
Original file line number Diff line number Diff line change
@@ -1,55 +1,57 @@
import { metaData } from '@cornerstonejs/core';
import type {
InstanceMetadata,
PhilipsPETPrivateGroup,
} from '@cornerstonejs/calculate-suv';
import type { InstanceMetadata } from '@cornerstonejs/calculate-suv';

export default function getPTImageIdInstanceMetadata(
imageId: string
): InstanceMetadata {
const dicomMetaData = metaData.get('instance', imageId);

if (!dicomMetaData) {
throw new Error('dicom metadata are required');
}

const petSequenceModule = metaData.get('petIsotopeModule', imageId);
const generalSeriesModule = metaData.get('generalSeriesModule', imageId);
const patientStudyModule = metaData.get('patientStudyModule', imageId);

const ptSeriesModule = metaData.get('petSeriesModule', imageId);
const ptImageModule = metaData.get('petImageModule', imageId);

if (!petSequenceModule) {
throw new Error('petSequenceModule metadata is required');
}

const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;

const { seriesDate, seriesTime, acquisitionDate, acquisitionTime } =
generalSeriesModule;
const { patientWeight } = patientStudyModule;
const { correctedImage, units, decayCorrection } = ptSeriesModule;

if (
dicomMetaData.SeriesDate === undefined ||
dicomMetaData.SeriesTime === undefined ||
dicomMetaData.PatientWeight === undefined ||
dicomMetaData.CorrectedImage === undefined ||
dicomMetaData.Units === undefined ||
seriesDate === undefined ||
seriesTime === undefined ||
patientWeight === undefined ||
acquisitionDate === undefined ||
acquisitionTime === undefined ||
correctedImage === undefined ||
units === undefined ||
decayCorrection === undefined ||
radiopharmaceuticalInfo.radionuclideTotalDose === undefined ||
radiopharmaceuticalInfo.radionuclideHalfLife === undefined ||
dicomMetaData.DecayCorrection === undefined ||
dicomMetaData.AcquisitionDate === undefined ||
dicomMetaData.AcquisitionTime === undefined ||
(radiopharmaceuticalInfo.radiopharmaceuticalStartDateTime === undefined &&
dicomMetaData.SeriesDate === undefined &&
seriesDate === undefined &&
radiopharmaceuticalInfo.radiopharmaceuticalStartTime === undefined)
//
) {
throw new Error('required metadata are missing');
}

const instanceMetadata: InstanceMetadata = {
CorrectedImage: dicomMetaData.CorrectedImage,
Units: dicomMetaData.Units,
CorrectedImage: correctedImage,
Units: units,
RadionuclideHalfLife: radiopharmaceuticalInfo.radionuclideHalfLife,
RadionuclideTotalDose: radiopharmaceuticalInfo.radionuclideTotalDose,
DecayCorrection: dicomMetaData.DecayCorrection,
PatientWeight: dicomMetaData.PatientWeight,
SeriesDate: dicomMetaData.SeriesDate,
SeriesTime: dicomMetaData.SeriesTime,
AcquisitionDate: dicomMetaData.AcquisitionDate,
AcquisitionTime: dicomMetaData.AcquisitionTime,
DecayCorrection: decayCorrection,
PatientWeight: patientWeight,
SeriesDate: seriesDate,
SeriesTime: seriesTime,
AcquisitionDate: acquisitionDate,
AcquisitionTime: acquisitionTime,
};

if (
Expand All @@ -72,6 +74,28 @@ export default function getPTImageIdInstanceMetadata(
instanceMetadata.RadiopharmaceuticalStartDateTime = dateString;
}

if (
instanceMetadata.AcquisitionDate &&
instanceMetadata.AcquisitionDate !== undefined &&
typeof instanceMetadata.AcquisitionDate !== 'string'
) {
const dateString = convertInterfaceDateToString(
instanceMetadata.AcquisitionDate
);
instanceMetadata.AcquisitionDate = dateString;
}

if (
instanceMetadata.SeriesDate &&
instanceMetadata.SeriesDate !== undefined &&
typeof instanceMetadata.SeriesDate !== 'string'
) {
const dateString = convertInterfaceDateToString(
instanceMetadata.SeriesDate
);
instanceMetadata.SeriesDate = dateString;
}

if (
radiopharmaceuticalInfo.radiopharmaceuticalStartTime &&
radiopharmaceuticalInfo.radiopharmaceuticalStartTime !== undefined &&
Expand All @@ -93,44 +117,73 @@ export default function getPTImageIdInstanceMetadata(
}

if (
dicomMetaData['70531000'] ||
dicomMetaData['70531000'] !== undefined ||
dicomMetaData['70531009'] ||
dicomMetaData['70531009'] !== undefined
instanceMetadata.AcquisitionTime &&
instanceMetadata.AcquisitionTime !== undefined &&
typeof instanceMetadata.AcquisitionTime !== 'string'
) {
const philipsPETPrivateGroup: PhilipsPETPrivateGroup = {
SUVScaleFactor: dicomMetaData['70531000'],
ActivityConcentrationScaleFactor: dicomMetaData['70531009'],
};
instanceMetadata.PhilipsPETPrivateGroup = philipsPETPrivateGroup;
const timeString = convertInterfaceTimeToString(
instanceMetadata.AcquisitionTime
);
instanceMetadata.AcquisitionTime = timeString;
}

if (dicomMetaData['0009100d'] && dicomMetaData['0009100d'] !== undefined) {
instanceMetadata.GEPrivatePostInjectionDateTime = dicomMetaData['0009100d'];
if (
instanceMetadata.SeriesTime &&
instanceMetadata.SeriesTime !== undefined &&
typeof instanceMetadata.SeriesTime !== 'string'
) {
const timeString = convertInterfaceTimeToString(
instanceMetadata.SeriesTime
);
instanceMetadata.SeriesTime = timeString;
}

if (
dicomMetaData.FrameReferenceTime &&
dicomMetaData.FrameReferenceTime !== undefined
ptImageModule.frameReferenceTime &&
ptImageModule.frameReferenceTime !== undefined
) {
instanceMetadata.FrameReferenceTime = dicomMetaData.FrameReferenceTime;
instanceMetadata.FrameReferenceTime = ptImageModule.frameReferenceTime;
}

if (
dicomMetaData.ActualFrameDuration &&
dicomMetaData.ActualFrameDuration !== undefined
ptImageModule.actualFrameDuration &&
ptImageModule.actualFrameDuration !== undefined
) {
instanceMetadata.ActualFrameDuration = dicomMetaData.ActualFrameDuration;
instanceMetadata.ActualFrameDuration = ptImageModule.actualFrameDuration;
}

if (dicomMetaData.PatientSex && dicomMetaData.PatientSex !== undefined) {
instanceMetadata.PatientSex = dicomMetaData.PatientSex;
if (
patientStudyModule.patientSex &&
patientStudyModule.patientSex !== undefined
) {
instanceMetadata.PatientSex = patientStudyModule.patientSex;
}

if (dicomMetaData.PatientSize && dicomMetaData.PatientSize !== undefined) {
instanceMetadata.PatientSize = dicomMetaData.PatientSize;
if (
patientStudyModule.patientSize &&
patientStudyModule.patientSize !== undefined
) {
instanceMetadata.PatientSize = patientStudyModule.patientSize;
}

// Todo: add private tags
// if (
// dicomMetaData['70531000'] ||
// dicomMetaData['70531000'] !== undefined ||
// dicomMetaData['70531009'] ||
// dicomMetaData['70531009'] !== undefined
// ) {
// const philipsPETPrivateGroup: PhilipsPETPrivateGroup = {
// SUVScaleFactor: dicomMetaData['70531000'],
// ActivityConcentrationScaleFactor: dicomMetaData['70531009'],
// };
// instanceMetadata.PhilipsPETPrivateGroup = philipsPETPrivateGroup;
// }

// if (dicomMetaData['0009100d'] && dicomMetaData['0009100d'] !== undefined) {
// instanceMetadata.GEPrivatePostInjectionDateTime = dicomMetaData['0009100d'];
// }

return instanceMetadata;
}

Expand Down
5 changes: 0 additions & 5 deletions utils/demo/helpers/initProviders.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
import * as cornerstone from '@cornerstonejs/core';
import WADORSHeaderProvider from './WADORSHeaderProvider';
import ptScalingMetaDataProvider from './ptScalingMetaDataProvider';

const { calibratedPixelSpacingMetadataProvider } = cornerstone.utilities;

export default function initProviders() {
cornerstone.metaData.addProvider(
WADORSHeaderProvider.get.bind(WADORSHeaderProvider),
9999
);
cornerstone.metaData.addProvider(
ptScalingMetaDataProvider.get.bind(ptScalingMetaDataProvider),
10000
Expand Down

0 comments on commit 92891cf

Please sign in to comment.