imported
This commit is contained in:
commit
0dbb93f3ab
38
.env
Normal file
38
.env
Normal file
@ -0,0 +1,38 @@
|
||||
# docker-compose environment file
|
||||
#
|
||||
# When you set the same environment variable in multiple files,
|
||||
# here’s the priority used by Compose to choose which value to use:
|
||||
#
|
||||
# 1. Compose file
|
||||
# 2. Shell environment variables
|
||||
# 3. Environment file
|
||||
# 4. Dockerfile
|
||||
# 5. Variable is not defined
|
||||
|
||||
#
|
||||
# Nginx configuration
|
||||
#
|
||||
NGINX_DEFAULT_CONF=./config/nginx_ohif.conf
|
||||
|
||||
#
|
||||
# OHIF Viewer
|
||||
#
|
||||
VIEWER_CONFIG=./config/ohif.js
|
||||
|
||||
#
|
||||
# Orthanc core with plugins
|
||||
#
|
||||
ORTHANC_CONFIG=./config/orthanc.json
|
||||
ORTHANC_OHIF=./config/orthanc_ohif.js
|
||||
ORTHANC_DB_MNT=./orthanc_db
|
||||
|
||||
#
|
||||
# PostgreSQL database - default values should not be used in production
|
||||
#
|
||||
POSTGRES_DATA_MNT=./pg_sql
|
||||
PGDATA=/var/lib/postgresql/data
|
||||
|
||||
POSTGRES_DB=orthanc
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=pgpassword
|
28
config/nginx_ohif.conf
Normal file
28
config/nginx_ohif.conf
Normal file
@ -0,0 +1,28 @@
|
||||
server {
|
||||
listen 80;
|
||||
# set client body size to 500M, this is to allow uploading of DICOMs, throws '413 request entity too large nginx' error otherwise #
|
||||
client_max_body_size 500M;
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
|
||||
# https://book.orthanc-server.com/faq/nginx.html#nginx
|
||||
location /orthanc/ {
|
||||
proxy_pass http://pacs:8042;
|
||||
proxy_set_header HOST $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
rewrite /orthanc(.*) $1 break;
|
||||
add_header 'Access-Control-Allow-Credentials' 'true';
|
||||
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
|
||||
add_header 'Access-Control-Allow-Origin' '*';
|
||||
}
|
||||
}
|
144
config/ohif.js
Normal file
144
config/ohif.js
Normal file
@ -0,0 +1,144 @@
|
||||
window.config = {
|
||||
// default: '/'
|
||||
routerBasename: "/",
|
||||
extensions: [],
|
||||
showStudyList: false,
|
||||
filterQueryParam: false,
|
||||
servers: {
|
||||
dicomWeb: [
|
||||
{
|
||||
name: "Orthanc",
|
||||
wadoUriRoot: "/orthanc/wado",
|
||||
qidoRoot: "/orthanc/dicom-web",
|
||||
wadoRoot: "/orthanc/dicom-web",
|
||||
qidoSupportsIncludeField: true,
|
||||
imageRendering: "wadors",
|
||||
thumbnailRendering: "wadors",
|
||||
enableStudyLazyLoad: true,
|
||||
supportsFuzzyMatching: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
whiteLabeling: {
|
||||
/* Used to replace the default Logo */
|
||||
createLogoComponentFn: function (React) {
|
||||
return React.createElement("a", {
|
||||
target: "_self",
|
||||
rel: "noopener noreferrer",
|
||||
className: "header-brand",
|
||||
href: "/",
|
||||
style: {
|
||||
display: "block",
|
||||
background: "url(/logo.png)",
|
||||
backgroundSize: "contain",
|
||||
backgroundRepeat: "no-repeat",
|
||||
width: "200px",
|
||||
},
|
||||
});
|
||||
},
|
||||
},
|
||||
// Extensions should be able to suggest default values for these?
|
||||
// Or we can require that these be explicitly set
|
||||
hotkeys: [
|
||||
// ~ Global
|
||||
{
|
||||
commandName: "incrementActiveViewport",
|
||||
label: "Next Viewport",
|
||||
keys: ["right"],
|
||||
},
|
||||
{
|
||||
commandName: "decrementActiveViewport",
|
||||
label: "Previous Viewport",
|
||||
keys: ["left"],
|
||||
},
|
||||
// Supported Keys: https://craig.is/killing/mice
|
||||
// ~ Cornerstone Extension
|
||||
{ commandName: "rotateViewportCW", label: "Rotate Right", keys: ["r"] },
|
||||
{ commandName: "rotateViewportCCW", label: "Rotate Left", keys: ["l"] },
|
||||
{ commandName: "invertViewport", label: "Invert", keys: ["i"] },
|
||||
{
|
||||
commandName: "flipViewportVertical",
|
||||
label: "Flip Horizontally",
|
||||
keys: ["h"],
|
||||
},
|
||||
{
|
||||
commandName: "flipViewportHorizontal",
|
||||
label: "Flip Vertically",
|
||||
keys: ["v"],
|
||||
},
|
||||
{ commandName: "scaleUpViewport", label: "Zoom In", keys: ["+"] },
|
||||
{ commandName: "scaleDownViewport", label: "Zoom Out", keys: ["-"] },
|
||||
{ commandName: "fitViewportToWindow", label: "Zoom to Fit", keys: ["="] },
|
||||
{ commandName: "resetViewport", label: "Reset", keys: ["space"] },
|
||||
// clearAnnotations
|
||||
{ commandName: "nextImage", label: "Next Image", keys: ["down"] },
|
||||
{ commandName: "previousImage", label: "Previous Image", keys: ["up"] },
|
||||
// firstImage
|
||||
// lastImage
|
||||
{
|
||||
commandName: "previousViewportDisplaySet",
|
||||
label: "Previous Series",
|
||||
keys: ["pagedown"],
|
||||
},
|
||||
{
|
||||
commandName: "nextViewportDisplaySet",
|
||||
label: "Next Series",
|
||||
keys: ["pageup"],
|
||||
},
|
||||
// ~ Cornerstone Tools
|
||||
{ commandName: "setZoomTool", label: "Zoom", keys: ["z"] },
|
||||
// ~ Window level presets
|
||||
{
|
||||
commandName: "windowLevelPreset1",
|
||||
label: "W/L Preset 1",
|
||||
keys: ["1"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset2",
|
||||
label: "W/L Preset 2",
|
||||
keys: ["2"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset3",
|
||||
label: "W/L Preset 3",
|
||||
keys: ["3"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset4",
|
||||
label: "W/L Preset 4",
|
||||
keys: ["4"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset5",
|
||||
label: "W/L Preset 5",
|
||||
keys: ["5"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset6",
|
||||
label: "W/L Preset 6",
|
||||
keys: ["6"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset7",
|
||||
label: "W/L Preset 7",
|
||||
keys: ["7"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset8",
|
||||
label: "W/L Preset 8",
|
||||
keys: ["8"],
|
||||
},
|
||||
{
|
||||
commandName: "windowLevelPreset9",
|
||||
label: "W/L Preset 9",
|
||||
keys: ["9"],
|
||||
},
|
||||
],
|
||||
cornerstoneExtensionConfig: {},
|
||||
|
||||
investigationalUseDialog: {
|
||||
option: 'never',
|
||||
},
|
||||
// studyListFunctionsEnabled is set to true to enable DICOM uploading
|
||||
studyListFunctionsEnabled: false,
|
||||
};
|
261
config/orthanc.json
Normal file
261
config/orthanc.json
Normal file
@ -0,0 +1,261 @@
|
||||
{
|
||||
"Name": "CHEVRON",
|
||||
"StorageDirectory": "/var/lib/orthanc/db",
|
||||
"IndexDirectory": "/var/lib/orthanc/db",
|
||||
"StorageCompression": true,
|
||||
"MaximumStorageSize": 0,
|
||||
"MaximumPatientCount": 0,
|
||||
"MaximumStorageCacheSize": 128,
|
||||
"LuaScripts": [],
|
||||
"Plugins": [
|
||||
"/usr/share/orthanc/plugins",
|
||||
"/usr/local/share/orthanc/plugins"
|
||||
],
|
||||
"OHIF": {
|
||||
"UserConfiguration": "/usr/local/share/orthanc/ohif.js"
|
||||
},
|
||||
"ExtraMainDicomTags": {
|
||||
"Instance": [
|
||||
"Rows",
|
||||
"Columns",
|
||||
"ImageType",
|
||||
"SOPClassUID",
|
||||
"ContentDate",
|
||||
"ContentTime",
|
||||
"FrameOfReferenceUID",
|
||||
"PixelSpacing",
|
||||
"SpecificCharacterSet",
|
||||
"BitsAllocated",
|
||||
"BitsStored",
|
||||
"RescaleSlope",
|
||||
"RescaleIntercept",
|
||||
"SliceThickness",
|
||||
"WindowCenter",
|
||||
"WindowWidth",
|
||||
"PhotometricInterpretation",
|
||||
"BFSenderID",
|
||||
"PixelRepresentation"
|
||||
],
|
||||
"Series": [
|
||||
"TimezoneOffsetFromUTC",
|
||||
"BodyPartExamined",
|
||||
"PerformedProcedureStepStartDate",
|
||||
"PerformedProcedureStepStartTime",
|
||||
"RequestAttributesSequence"
|
||||
],
|
||||
"Study": [
|
||||
"OtherPatientNames",
|
||||
"OtherPatientIDs",
|
||||
"TimezoneOffsetFromUTC",
|
||||
"AcquisitionUID",
|
||||
"AcquisitionDate",
|
||||
"AcquisitionDeviceProcessingDescription",
|
||||
"AcquisitionTime",
|
||||
"BodyPartExamined",
|
||||
"InstitutionAddress",
|
||||
"Manufacturer",
|
||||
"ManufacturerModelName",
|
||||
"Modality",
|
||||
"OperatorsName",
|
||||
"ProtocolName",
|
||||
"SeriesDescription",
|
||||
"SoftwareVersions",
|
||||
"ReferringPhysicianName",
|
||||
"ReferringPhysicianIdentificationSequence",
|
||||
"ConsultingPhysicianName",
|
||||
"ConsultingPhysicianIdentificationSequence",
|
||||
"RequestingPhysician",
|
||||
"BFSenderID",
|
||||
"StationName"
|
||||
],
|
||||
"Patient": [
|
||||
"OtherPatientNames",
|
||||
"OtherPatientIDs"
|
||||
]
|
||||
},
|
||||
"ConcurrentJobs": 8,
|
||||
"HttpServerEnabled": true,
|
||||
"OrthancExplorerEnabled": true,
|
||||
"HttpPort": 8042,
|
||||
"HttpDescribeErrors": true,
|
||||
"HttpCompressionEnabled": true,
|
||||
"WebDavEnabled": true,
|
||||
"WebDavDeleteAllowed": false,
|
||||
"WebDavUploadAllowed": true,
|
||||
"DicomServerEnabled": true,
|
||||
"DicomAet": "CHEVRON",
|
||||
"DicomCheckCalledAet": true,
|
||||
"DicomPort": 4242,
|
||||
"DefaultEncoding": "Latin1",
|
||||
"AcceptedTransferSyntaxes": [
|
||||
"1.2.840.10008.1.*"
|
||||
],
|
||||
"UnknownSopClassAccepted": false,
|
||||
"DicomScpTimeout": 30,
|
||||
"RemoteAccessAllowed": true,
|
||||
"SslEnabled": false,
|
||||
"SslCertificate": "certificate.pem",
|
||||
"SslMinimumProtocolVersion": 4,
|
||||
"SslVerifyPeers": false,
|
||||
"SslTrustedClientCertificates": "trustedClientCertificates.pem",
|
||||
"AuthenticationEnabled": false,
|
||||
"RegisteredUsers": {
|
||||
"dicom": "letmein"
|
||||
},
|
||||
"DicomTlsEnabled": false,
|
||||
"DicomTlsRemoteCertificateRequired": true,
|
||||
"DicomAlwaysAllowEcho": true,
|
||||
"DicomAlwaysAllowStore": true,
|
||||
"DicomAlwaysAllowFind": false,
|
||||
"DicomAlwaysAllowFindWorklist": false,
|
||||
"DicomAlwaysAllowGet": false,
|
||||
"DicomAlwaysAllowMove": false,
|
||||
"DicomCheckModalityHost": false,
|
||||
"DicomModalities": {
|
||||
// "MAPDRX" : [ "MAPDR", "127.0.0.1", 11112]
|
||||
},
|
||||
"DicomModalitiesInDatabase": false,
|
||||
"DicomEchoChecksFind": false,
|
||||
"DicomScuTimeout": 10,
|
||||
"DicomScuPreferredTransferSyntax": "1.2.840.10008.1.2.1",
|
||||
"DicomThreadsCount": 4,
|
||||
"OrthancPeers": {},
|
||||
"OrthancPeersInDatabase": false,
|
||||
"HttpProxy": "",
|
||||
"HttpVerbose": false,
|
||||
"HttpTimeout": 60,
|
||||
"HttpsVerifyPeers": true,
|
||||
"HttpsCACertificates": "/etc/ssl/certs/ca-certificates.crt",
|
||||
"UserMetadata": {
|
||||
// "Sample" : 1024
|
||||
},
|
||||
"UserContentType": {
|
||||
// "sample" : 1024
|
||||
// "sample2" : [ 1025, "application/pdf" ]
|
||||
},
|
||||
"StableAge": 60,
|
||||
"StrictAetComparison": false,
|
||||
"StoreMD5ForAttachments": true,
|
||||
"LimitFindResults": 0,
|
||||
"LimitFindInstances": 0,
|
||||
"LogExportedResources": false,
|
||||
"KeepAlive": true,
|
||||
"TcpNoDelay": true,
|
||||
"HttpThreadsCount": 50,
|
||||
"StoreDicom": true,
|
||||
"DicomAssociationCloseDelay": 5,
|
||||
"QueryRetrieveSize": 100,
|
||||
"CaseSensitivePN": false,
|
||||
"LoadPrivateDictionary": true,
|
||||
"Dictionary" : {
|
||||
"0011,1060" : [ "LO", "InnowaveUploaderID", 1, 1, "InowavePrivateGroup"],
|
||||
"1971,1020" : [ "LO", "BFSenderID", 1, 1, "BlackFish"]
|
||||
},
|
||||
"SynchronousCMove": true,
|
||||
"JobsHistorySize": 10,
|
||||
"SaveJobs": true,
|
||||
"OverwriteInstances": false,
|
||||
"MediaArchiveSize": 1,
|
||||
"StorageAccessOnFind": "Always",
|
||||
"MetricsEnabled": true,
|
||||
"ExecuteLuaEnabled": false,
|
||||
"HttpRequestTimeout": 30,
|
||||
"DefaultPrivateCreator": "",
|
||||
"StorageCommitmentReportsSize": 100,
|
||||
"TranscodeDicomProtocol": true,
|
||||
"BuiltinDecoderTranscoderOrder": "After",
|
||||
"IngestTranscoding": "1.2.840.10008.1.2.4.91",
|
||||
"IngestTranscodingOfUncompressed": true,
|
||||
"IngestTranscodingOfCompressed": true,
|
||||
"DicomLossyTranscodingQuality": 90,
|
||||
"SyncStorageArea": true,
|
||||
"MallocArenaMax": 5,
|
||||
"DeidentifyLogs": true,
|
||||
"DeidentifyLogsDicomVersion": "2021b",
|
||||
"MaximumPduLength": 16384,
|
||||
"CheckRevisions": false,
|
||||
"SynchronousZipStream": true,
|
||||
"ZipLoaderThreads": 0,
|
||||
"Warnings": {
|
||||
"W001_TagsBeingReadFromStorage": true,
|
||||
"W002_InconsistentDicomTagsInDb": true
|
||||
},
|
||||
"StoneWebViewer": {
|
||||
/**
|
||||
* Enables/disables the print button.
|
||||
**/
|
||||
"PrintEnabled": false,
|
||||
/**
|
||||
* Enables/disables the button to download a screenshot of the
|
||||
* active viewport as a JPEG file.
|
||||
**/
|
||||
"DownloadAsJpegEnabled": false,
|
||||
/**
|
||||
* Enables/disables the button to download the display study.
|
||||
* Only used if "OrthancApiRoot" is properly set.
|
||||
**/
|
||||
"DownloadStudyEnabled": false,
|
||||
/**
|
||||
* If option "DownloadDicomDir" is set to "true", the Stone Web
|
||||
* viewer will create DICOMDIR media archives (as generated by the
|
||||
* route "/studies/{id}/media" of Orthanc), instead of archives
|
||||
* containing a human-readable hierarchy of folders (as generated
|
||||
* by the route "/studies/{id}/archive").
|
||||
**/
|
||||
"DownloadDicomDir": true,
|
||||
/**
|
||||
* By setting option "InstitutionLogo" to an URL containing an
|
||||
* image, this logo will be displayed at the bottom-left of the
|
||||
* Stone Web viewer.
|
||||
**/
|
||||
"InstitutionLogo": "http://pacs.mylabctg.com:8042/stone-webviewer/img/orthanc.png",
|
||||
/**
|
||||
* Whether to display the info panel at startup. Allowed values:
|
||||
* "Always", "Never", "User". With "User", the user can decide to
|
||||
* show or not the info panel in the user preferences panel (this
|
||||
* is implemented using a cookie). (New in Stone Web viewer 2.4)
|
||||
**/
|
||||
"ShowInfoPanelAtStartup": "Never",
|
||||
/**
|
||||
* Whether to give access to the user preferences window. (New in
|
||||
* Stone Web viewer 2.4)
|
||||
**/
|
||||
"ShowUserPreferencesButton": true,
|
||||
/**
|
||||
* Display a "not for diagnostic usage" disclaimer above the list
|
||||
* of studies/series. (New in Stone Web viewer 2.4)
|
||||
**/
|
||||
"ShowNotForDiagnosticUsageDisclaimer": false
|
||||
},
|
||||
"DicomWeb": {
|
||||
"Enable": true,
|
||||
"Root": "/dicom-web/",
|
||||
"PublicRoot": "/dicom-web/",
|
||||
"EnableWado": true,
|
||||
"WadoRoot": "/wado",
|
||||
"Ssl": false,
|
||||
"Servers": {
|
||||
"main": [
|
||||
"http://pacs.mylabctg.com:8042/dicom-web/"
|
||||
]
|
||||
},
|
||||
"QidoCaseSensitive": true,
|
||||
"MetadataWorkerThreadsCount": 10,
|
||||
"EnableMetadataCache": true,
|
||||
"StudiesMetadata": "Full",
|
||||
"SeriesMetadata": "Full"
|
||||
},
|
||||
"OrthancExplorer2": {
|
||||
"Enable": true,
|
||||
"IsDefaultOrthancUI": true
|
||||
},
|
||||
"PostgreSQL": {
|
||||
"EnableIndex": true,
|
||||
"EnableStorage": false, // DICOM files are stored in the Orthanc container in /var/lib/orthanc/db/
|
||||
"Host": "postgres", // the name of the PostgreSQL container
|
||||
"Port": 5432,
|
||||
"Database": "orthanc", // default database name in PostgreSQL container (no need to create it)
|
||||
"Username": "postgres", // default user name in PostgreSQL container (no need to create it)
|
||||
"Password": "pgpassword"
|
||||
}
|
||||
}
|
256
config/orthanc_ohif.js
Normal file
256
config/orthanc_ohif.js
Normal file
@ -0,0 +1,256 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium,
|
||||
* and 2018-2024 Open Health Imaging Foundation
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
window.config = {
|
||||
extensions: [],
|
||||
modes: [],
|
||||
customizationService: {
|
||||
// Shows a custom route -access via http://localhost:3000/custom
|
||||
// helloPage: '@ohif/extension-default.customizationModule.helloPage',
|
||||
},
|
||||
|
||||
showStudyList: false,
|
||||
investigationalUseDialog: {
|
||||
option: 'never',
|
||||
},
|
||||
|
||||
whiteLabeling: {
|
||||
/* Used to replace the default Logo */
|
||||
createLogoComponentFn: function (React) {
|
||||
return React.createElement("a", {
|
||||
target: "_self",
|
||||
rel: "noopener noreferrer",
|
||||
className: "header-brand",
|
||||
href: "/",
|
||||
style: {
|
||||
display: "block",
|
||||
background: "url(/logo.png)",
|
||||
backgroundSize: "contain",
|
||||
backgroundRepeat: "no-repeat",
|
||||
width: "200px",
|
||||
},
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
customizationService: {
|
||||
cornerstoneOverlayTopLeft: {
|
||||
id: 'cornerstoneOverlayTopLeft',
|
||||
items: [
|
||||
{
|
||||
id: 'WindowLevel',
|
||||
customizationType: 'ohif.overlayItem.windowLevel',
|
||||
},
|
||||
{
|
||||
id: 'PatientName',
|
||||
customizationType: 'ohif.overlayItem',
|
||||
label: 'Pt:',
|
||||
color: 'white',
|
||||
condition: ({ instance }) =>
|
||||
instance &&
|
||||
instance.PatientName &&
|
||||
instance.PatientName.Alphabetic,
|
||||
contentF: ({ instance, formatters: { formatPN } }) => {
|
||||
if (instance && instance.PatientName && instance.PatientName.Alphabetic) {
|
||||
return formatPN(instance.PatientName.Alphabetic) + ' ' + (instance.PatientSex ? '(' + instance.PatientSex + ')' : '');
|
||||
} else {
|
||||
return 'N/A';
|
||||
}
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'PatientAge',
|
||||
customizationType: 'ohif.overlayItem',
|
||||
label: 'Age:',
|
||||
color: 'white',
|
||||
title: "Patient's Age",
|
||||
condition: ({ instance }) => instance && instance.PatientAge,
|
||||
contentF: ({ instance }) => instance.PatientAge,
|
||||
},
|
||||
{
|
||||
id: 'ID',
|
||||
customizationType: 'ohif.overlayItem',
|
||||
label: 'ID:',
|
||||
color: 'white',
|
||||
title: 'Patient PID',
|
||||
condition: ({ instance }) => instance && instance.PatientID,
|
||||
contentF: ({ instance }) => instance.PatientID,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
// some windows systems have issues with more than 3 web workers
|
||||
maxNumberOfWebWorkers: 3,
|
||||
// below flag is for performance reasons, but it might not work for all servers
|
||||
omitQuotationForMultipartRequest: true,
|
||||
showWarningMessageForCrossOrigin: true,
|
||||
showCPUFallbackMessage: true,
|
||||
showLoadingIndicator: true,
|
||||
strictZSpacingForVolumeViewport: true,
|
||||
maxNumRequests: {
|
||||
interaction: 100,
|
||||
thumbnail: 75,
|
||||
// Prefetch number is dependent on the http protocol. For http 2 or
|
||||
// above, the number of requests can be go a lot higher.
|
||||
prefetch: 25,
|
||||
},
|
||||
// filterQueryParam: false,
|
||||
httpErrorHandler: error => {
|
||||
// This is 429 when rejected from the public idc sandbox too often.
|
||||
if (error.status) {
|
||||
console.warn(error.status);
|
||||
} else {
|
||||
console.warn(error);
|
||||
}
|
||||
},
|
||||
hotkeys: [
|
||||
{
|
||||
commandName: 'incrementActiveViewport',
|
||||
label: 'Next Viewport',
|
||||
keys: ['right'],
|
||||
},
|
||||
{
|
||||
commandName: 'decrementActiveViewport',
|
||||
label: 'Previous Viewport',
|
||||
keys: ['left'],
|
||||
},
|
||||
{ commandName: 'rotateViewportCW', label: 'Rotate Right', keys: ['r'] },
|
||||
{ commandName: 'rotateViewportCCW', label: 'Rotate Left', keys: ['l'] },
|
||||
{ commandName: 'invertViewport', label: 'Invert', keys: ['i'] },
|
||||
{
|
||||
commandName: 'flipViewportHorizontal',
|
||||
label: 'Flip Horizontally',
|
||||
keys: ['h'],
|
||||
},
|
||||
{
|
||||
commandName: 'flipViewportVertical',
|
||||
label: 'Flip Vertically',
|
||||
keys: ['v'],
|
||||
},
|
||||
{ commandName: 'scaleUpViewport', label: 'Zoom In', keys: ['+'] },
|
||||
{ commandName: 'scaleDownViewport', label: 'Zoom Out', keys: ['-'] },
|
||||
{ commandName: 'fitViewportToWindow', label: 'Zoom to Fit', keys: ['='] },
|
||||
{ commandName: 'resetViewport', label: 'Reset', keys: ['space'] },
|
||||
{ commandName: 'nextImage', label: 'Next Image', keys: ['down'] },
|
||||
{ commandName: 'previousImage', label: 'Previous Image', keys: ['up'] },
|
||||
// {
|
||||
// commandName: 'previousViewportDisplaySet',
|
||||
// label: 'Previous Series',
|
||||
// keys: ['pagedown'],
|
||||
// },
|
||||
// {
|
||||
// commandName: 'nextViewportDisplaySet',
|
||||
// label: 'Next Series',
|
||||
// keys: ['pageup'],
|
||||
// },
|
||||
{
|
||||
commandName: 'setToolActive',
|
||||
commandOptions: { toolName: 'Zoom' },
|
||||
label: 'Zoom',
|
||||
keys: ['z'],
|
||||
},
|
||||
// ~ Window level presets
|
||||
{
|
||||
commandName: 'windowLevelPreset1',
|
||||
label: 'W/L Preset 1',
|
||||
keys: ['1'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset2',
|
||||
label: 'W/L Preset 2',
|
||||
keys: ['2'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset3',
|
||||
label: 'W/L Preset 3',
|
||||
keys: ['3'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset4',
|
||||
label: 'W/L Preset 4',
|
||||
keys: ['4'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset5',
|
||||
label: 'W/L Preset 5',
|
||||
keys: ['5'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset6',
|
||||
label: 'W/L Preset 6',
|
||||
keys: ['6'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset7',
|
||||
label: 'W/L Preset 7',
|
||||
keys: ['7'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset8',
|
||||
label: 'W/L Preset 8',
|
||||
keys: ['8'],
|
||||
},
|
||||
{
|
||||
commandName: 'windowLevelPreset9',
|
||||
label: 'W/L Preset 9',
|
||||
keys: ['9'],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2023-2024 Sebastien Jodogne, UCLouvain, Belgium,
|
||||
* and 2018-2024 Open Health Imaging Foundation
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
window.config.routerBasename = '/ohif/';
|
||||
|
||||
if (true) {
|
||||
window.config.dataSources = [
|
||||
{
|
||||
friendlyName: 'Orthanc DICOMweb',
|
||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||
sourceName: 'dicomweb',
|
||||
configuration: {
|
||||
name: 'orthanc',
|
||||
|
||||
wadoUriRoot: '../dicom-web',
|
||||
qidoRoot: '../dicom-web',
|
||||
wadoRoot: '../dicom-web',
|
||||
|
||||
qidoSupportsIncludeField: false,
|
||||
supportsReject: false,
|
||||
imageRendering: 'wadors',
|
||||
thumbnailRendering: 'wadors',
|
||||
enableStudyLazyLoad: true,
|
||||
supportsFuzzyMatching: false,
|
||||
supportsWildcard: true,
|
||||
staticWado: true,
|
||||
singlepart: 'bulkdata,pdf,video',
|
||||
acceptHeader: ['multipart/related; type=application/octet-stream; transfer-syntax=*']
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
window.config.defaultDataSourceName = 'dicomweb';
|
||||
|
||||
} else {
|
||||
window.config.showStudyList = false;
|
||||
window.config.dataSources = [
|
||||
{
|
||||
friendlyName: 'Orthanc DICOM JSON',
|
||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
||||
sourceName: 'dicomjson',
|
||||
configuration: {
|
||||
name: 'json',
|
||||
},
|
||||
}
|
||||
];
|
||||
|
||||
window.config.defaultDataSourceName = 'dicomjson';
|
||||
}
|
154
config/stone.json
Normal file
154
config/stone.json
Normal file
@ -0,0 +1,154 @@
|
||||
{
|
||||
"StoneWebViewer" :
|
||||
{
|
||||
/**
|
||||
* Defines how dates are displayed in the UI. If this option is not
|
||||
* set, the DICOM tags will be displayed as such. "DD" will be
|
||||
* replaced by the day, "MM" by the month, and "YYYY" by the year.
|
||||
**/
|
||||
// "DateFormat" : "DD/MM/YYYY",
|
||||
|
||||
/**
|
||||
* Defines how times are displayed in the UI. If this option is not
|
||||
* set, the DICOM tags will be displayed as such. "hh" will be
|
||||
* replaced by the hour, "mm" by the minutes, "ss" by the seconds
|
||||
* and ".f" by the fractions of seconds.
|
||||
**/
|
||||
// "TimeFormat" : "hh:mm:ss.f",
|
||||
|
||||
|
||||
/**
|
||||
* This option allows you to define windowing presets.
|
||||
* For each preset, you must provide a name, the window width
|
||||
* and window center.
|
||||
**/
|
||||
"WindowingPresets" : [
|
||||
{"Name" : "CT Lung", "WindowCenter" : -400, "WindowWidth" : 1600},
|
||||
{"Name" : "CT Abdomen", "WindowCenter" : 60, "WindowWidth" : 400},
|
||||
{"Name" : "CT Bone", "WindowCenter" : 300, "WindowWidth" : 1500},
|
||||
{"Name" : "CT Brain", "WindowCenter" : 40, "WindowWidth" : 80},
|
||||
{"Name" : "CT Chest", "WindowCenter" : 40, "WindowWidth" : 400},
|
||||
{"Name" : "CT Angio", "WindowCenter" : 300, "WindowWidth" : 600}
|
||||
],
|
||||
|
||||
/**
|
||||
* Enables/disables the combined tool. This is the default mode
|
||||
* for mouse interactions. The combined tool allows to access the
|
||||
* windowing, zoom and pan from a single mouse configuration. The
|
||||
* behaviour of the combined tool is defined in
|
||||
* CombinedToolBehaviour. The available mouse actions are
|
||||
* "Crosshair", "Windowing", "Pan", "Rotate", "Zoom" and
|
||||
* "MagnifyingGlass".
|
||||
**/
|
||||
"CombinedToolEnabled" : true,
|
||||
"CombinedToolBehaviour" : {
|
||||
"LeftMouseButton" : "Windowing",
|
||||
"MiddleMouseButton" : "Pan",
|
||||
"RightMouseButton" : "Zoom"
|
||||
},
|
||||
|
||||
/**
|
||||
* Enables/disables the print button.
|
||||
**/
|
||||
"PrintEnabled" : false,
|
||||
|
||||
/**
|
||||
* Enables/disables the button to download a screenshot of the
|
||||
* active viewport as a JPEG file.
|
||||
**/
|
||||
"DownloadAsJpegEnabled" : false,
|
||||
|
||||
/**
|
||||
* Enables/disables the button to download the display study.
|
||||
* Only used if "OrthancApiRoot" is properly set.
|
||||
**/
|
||||
"DownloadStudyEnabled" : false,
|
||||
|
||||
/**
|
||||
* The allowed origin for messages corresponding to dynamic actions
|
||||
* triggered by another Web page using "window.postMessage()". The
|
||||
* special value "*" will allow any origin, which is an insecure
|
||||
* value to be used only during development. If this option is not
|
||||
* set, all the requests for dynamic actions will be rejected.
|
||||
* https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
|
||||
**/
|
||||
"ExpectedMessageOrigin" : "http://localhost:8042",
|
||||
|
||||
/**
|
||||
* Root path of the DICOMweb server. This option is automatically
|
||||
* set by the Orthanc plugin if missing.
|
||||
**/
|
||||
"DicomWebRoot" : "../dicom-web",
|
||||
|
||||
/**
|
||||
* Set the size of the cache that stores the DICOM files. This
|
||||
* size is expressed in megabytes. The default value of 128MB
|
||||
* should work in most setups, except if very large multiframe
|
||||
* instances are encountered, which might for instance be the case
|
||||
* for mammography. Setting this parameter to zero will disable
|
||||
* the cache, which should only be done for testing.
|
||||
**/
|
||||
"DicomCacheSize" : 128,
|
||||
|
||||
/**
|
||||
* The following parameter can be set if running the Stone Web
|
||||
* viewer from Orthanc, but without using the associated plugin
|
||||
* (e.g. using the "Serve Folders" sample plugin). Using the
|
||||
* plugin would overwrite this setting. This will enable features
|
||||
* that are only available if the Orthanc REST API is accessible
|
||||
* (download of studies, and playing videos). This option is
|
||||
* typically used by the developers of Stone.
|
||||
**/
|
||||
"OrthancApiRoot" : "..",
|
||||
|
||||
/**
|
||||
* If option "DownloadDicomDir" is set to "true", the Stone Web
|
||||
* viewer will create DICOMDIR media archives (as generated by the
|
||||
* route "/studies/{id}/media" of Orthanc), instead of archives
|
||||
* containing a human-readable hierarchy of folders (as generated
|
||||
* by the route "/studies/{id}/archive").
|
||||
**/
|
||||
"DownloadDicomDir" : false,
|
||||
|
||||
/**
|
||||
* By setting option "InstitutionLogo" to an URL containing an
|
||||
* image, this logo will be displayed at the bottom-left of the
|
||||
* Stone Web viewer.
|
||||
**/
|
||||
"InstitutionLogo" : "",
|
||||
|
||||
/**
|
||||
* Define a list of modality type that the viewer will ignore.
|
||||
**/
|
||||
"SkipSeriesFromModalities": ["SR", "SEG", "PR"],
|
||||
|
||||
/**
|
||||
* Whether to display the info panel at startup. Allowed values:
|
||||
* "Always", "Never", "User". With "User", the user can decide to
|
||||
* show or not the info panel in the user preferences panel (this
|
||||
* is implemented using a cookie). (New in Stone Web viewer 2.4)
|
||||
**/
|
||||
"ShowInfoPanelAtStartup": "User",
|
||||
|
||||
/**
|
||||
* Whether to give access to the user preferences window. (New in
|
||||
* Stone Web viewer 2.4)
|
||||
**/
|
||||
"ShowUserPreferencesButton" : true,
|
||||
|
||||
/**
|
||||
* Display a "not for diagnostic usage" disclaimer above the list
|
||||
* of studies/series. (New in Stone Web viewer 2.4)
|
||||
**/
|
||||
"ShowNotForDiagnosticUsageDisclaimer": false,
|
||||
|
||||
/**
|
||||
* HTTP headers to be set in each request to the DICOMweb server.
|
||||
* Note that the value of the headers can be taken from the
|
||||
* environment variables.
|
||||
**/
|
||||
"DicomWebHttpHeaders" : {
|
||||
/* "Authorization" : "Bearer ${USER}" */
|
||||
}
|
||||
}
|
||||
}
|
56
docker-compose.yml
Normal file
56
docker-compose.yml
Normal file
@ -0,0 +1,56 @@
|
||||
services:
|
||||
postgres:
|
||||
image: postgres
|
||||
container_name: postgres
|
||||
networks:
|
||||
- pacs
|
||||
volumes:
|
||||
- ${POSTGRES_DATA_MNT}:${PGDATA}
|
||||
environment:
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- PGDATA=${PGDATA}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
|
||||
pacs:
|
||||
container_name: orthanc
|
||||
image: jodogne/orthanc-plugins
|
||||
ports:
|
||||
- 8042:8042
|
||||
- 4242:4242
|
||||
volumes:
|
||||
# configuration file
|
||||
- ${ORTHANC_CONFIG:-./config/orthanc.json}:/etc/orthanc/orthanc.json:ro
|
||||
# storage volume for raw dicoms
|
||||
- ${ORTHANC_DB_MNT:-./orthanc_db}:/var/lib/orthanc/db
|
||||
- ${ORTHANC_OHIF:-./config/orthanc_ohif.js}:/usr/local/share/orthanc/ohif.js:ro
|
||||
environment:
|
||||
VERBOSE_ENABLED: "true"
|
||||
VERBOSE_STARTUP: "true"
|
||||
DICOM_WEB_PLUGIN_ENABLED: "true"
|
||||
OHIF_PLUGIN_ENABLED: "true"
|
||||
VOLVIEW_PLUGIN_ENABLED: "true"
|
||||
restart: always
|
||||
networks:
|
||||
- pacs
|
||||
depends_on:
|
||||
- postgres
|
||||
|
||||
ohif:
|
||||
container_name: ohif
|
||||
image: ohif/viewer
|
||||
ports:
|
||||
- 3000:80
|
||||
environment:
|
||||
- APP_CONFIG:/usr/share/nginx/html/app-config.js
|
||||
volumes:
|
||||
- ${NGINX_DEFAULT_CONF}:/etc/nginx/conf.d/default.conf:ro
|
||||
- ${VIEWER_CONFIG}:/usr/share/nginx/html/app-config.js:ro
|
||||
- ./logo.png:/usr/share/nginx/html/logo.png:ro
|
||||
restart: always
|
||||
networks:
|
||||
- pacs
|
||||
|
||||
networks:
|
||||
pacs:
|
||||
external: true
|
Loading…
Reference in New Issue
Block a user