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