[med-svn] [vtk-dicom] 01/03: New upstream version 0.7.10
Gert Wollny
gert-guest at moszumanska.debian.org
Sat Oct 1 19:51:42 UTC 2016
This is an automated email from the git hooks/post-receive script.
gert-guest pushed a commit to branch master
in repository vtk-dicom.
commit 204548e748dac8f52185027dfc0e1c2bacbbe8dc
Author: Gert Wollny <gw.fossdev at gmail.com>
Date: Sat Oct 1 20:50:47 2016 +0200
New upstream version 0.7.10
---
CMake/DICOMConfig.cmake.in | 5 +-
CMake/pkgIndex.tcl.in | 13 +
CMake/vtkDICOMConfig.h.in | 14 +-
CMake/vtkWrapHierarchy.cmake | 97 +-
CMakeLists.txt | 65 +-
Copyright.txt | 2 +-
DicomCli/CMakeLists.txt | 9 +-
DicomCli/mainmacro.cxx | 481 +-
DicomCli/mainmacro.h | 74 +-
DicomCli/progress.cxx | 34 +-
DicomCli/readquery.cxx | 358 +-
DicomCli/readquery.h | 9 +
DicomCli/vtkConsoleOutputWindow.cxx | 53 +
DicomCli/vtkConsoleOutputWindow.h | 45 +
Examples/CMakeLists.txt | 3 -
Examples/TestDICOMCompiler.cxx | 52 +-
Examples/TestDICOMDirectory.cxx | 26 +-
Examples/TestDICOMDisplay.cxx | 76 +-
Examples/TestDICOMFileSorter.cxx | 12 +-
Examples/TestDICOMParser.cxx | 4 +-
Examples/TestDICOMReader.cxx | 10 +-
Examples/TestDICOMRealWorldValue.cxx | 26 +-
Examples/TestDICOMWriter.cxx | 10 +-
Examples/TestNIFTIDisplay.cxx | 48 +-
Examples/TestScancoCTDisplay.cxx | 48 +-
Programs/CMakeLists.txt | 3 -
Programs/dicomdump.cxx | 292 +-
Programs/dicomfind.cxx | 449 +-
Programs/dicompull.cxx | 322 +-
Programs/dicomtocsv.cxx | 539 +-
Programs/dicomtodicom.cxx | 329 +-
Programs/dicomtonifti.cxx | 573 +--
Programs/nifticenter.cxx | 10 +-
Programs/niftidump.cxx | 286 +-
Programs/niftitodicom.cxx | 413 +-
Programs/scancodump.cxx | 117 +-
Programs/scancotodicom.cxx | 341 +-
Readme.txt | 4 +-
Source/CMakeLists.txt | 99 +-
Source/vtkDICOMAlgorithm.cxx | 28 +-
Source/vtkDICOMAlgorithm.h | 60 +-
Source/vtkDICOMApplyPalette.cxx | 66 +-
Source/vtkDICOMApplyPalette.h | 35 +-
Source/vtkDICOMApplyRescale.cxx | 108 +-
Source/vtkDICOMApplyRescale.h | 38 +-
Source/vtkDICOMCTGenerator.cxx | 16 +-
Source/vtkDICOMCTGenerator.h | 4 +-
Source/vtkDICOMCTRectifier.cxx | 72 +-
Source/vtkDICOMCTRectifier.h | 96 +-
Source/vtkDICOMCharacterSet.cxx | 1037 ++--
Source/vtkDICOMCharacterSet.h | 30 +-
Source/vtkDICOMCompiler.cxx | 544 +-
Source/vtkDICOMCompiler.h | 46 +-
Source/vtkDICOMDataElement.h | 19 +-
Source/vtkDICOMDictEntry.cxx | 8 +-
Source/vtkDICOMDictHash.cxx | 6128 +++++++++++-----------
Source/vtkDICOMDictHash.h | 158 +-
Source/vtkDICOMDictPrivate.cxx | 9448 +++++++++++++++++++---------------
Source/vtkDICOMDictionary.cxx | 112 +-
Source/vtkDICOMDictionary.h | 15 +-
Source/vtkDICOMDirectory.cxx | 1066 ++--
Source/vtkDICOMDirectory.h | 62 +-
Source/vtkDICOMFile.cxx | 430 +-
Source/vtkDICOMFile.h | 38 +-
Source/vtkDICOMFileDirectory.cxx | 414 ++
Source/vtkDICOMFileDirectory.h | 109 +
Source/vtkDICOMFilePath.cxx | 851 +++
Source/vtkDICOMFilePath.h | 184 +
Source/vtkDICOMFileSorter.cxx | 324 +-
Source/vtkDICOMFileSorter.h | 18 +-
Source/vtkDICOMGenerator.cxx | 611 ++-
Source/vtkDICOMGenerator.h | 86 +-
Source/vtkDICOMImageCodec.cxx | 136 +-
Source/vtkDICOMImageCodec.h | 10 +-
Source/vtkDICOMItem.cxx | 222 +-
Source/vtkDICOMItem.h | 22 +
Source/vtkDICOMLookupTable.cxx | 154 +-
Source/vtkDICOMLookupTable.h | 44 +-
Source/vtkDICOMMRGenerator.cxx | 48 +-
Source/vtkDICOMMRGenerator.h | 4 +-
Source/vtkDICOMMetaData.cxx | 512 +-
Source/vtkDICOMMetaData.h | 46 +-
Source/vtkDICOMMetaDataAdapter.cxx | 192 +-
Source/vtkDICOMMetaDataAdapter.h | 32 +
Source/vtkDICOMParser.cxx | 780 ++-
Source/vtkDICOMParser.h | 23 +-
Source/vtkDICOMReader.cxx | 760 +--
Source/vtkDICOMReader.h | 366 +-
Source/vtkDICOMSCGenerator.cxx | 66 +-
Source/vtkDICOMSCGenerator.h | 4 +-
Source/vtkDICOMSequence.cxx | 54 +-
Source/vtkDICOMSequence.h | 37 +-
Source/vtkDICOMSliceSorter.cxx | 452 +-
Source/vtkDICOMSliceSorter.h | 127 +-
Source/vtkDICOMSorter.h | 8 +-
Source/vtkDICOMTag.cxx | 8 +-
Source/vtkDICOMTag.h | 8 +
Source/vtkDICOMTagPath.cxx | 55 +-
Source/vtkDICOMTagPath.h | 13 +
Source/vtkDICOMToRAS.cxx | 208 +-
Source/vtkDICOMToRAS.h | 147 +-
Source/vtkDICOMUIDGenerator.cxx | 523 ++
Source/vtkDICOMUIDGenerator.h | 131 +
Source/vtkDICOMUtilities.cxx | 598 +--
Source/vtkDICOMUtilities.h | 22 +-
Source/vtkDICOMUtilitiesUIDTable.cxx | 573 ++-
Source/vtkDICOMVM.cxx | 14 +-
Source/vtkDICOMVM.h | 6 +
Source/vtkDICOMVR.h | 8 +
Source/vtkDICOMValue.cxx | 1139 ++--
Source/vtkDICOMValue.h | 33 +
Source/vtkDICOMWriter.cxx | 260 +-
Source/vtkDICOMWriter.h | 283 +-
Source/vtkNIFTIHeader.cxx | 124 +-
Source/vtkNIFTIHeader.h | 250 +-
Source/vtkNIFTIReader.cxx | 523 +-
Source/vtkNIFTIReader.h | 253 +-
Source/vtkNIFTIWriter.cxx | 388 +-
Source/vtkNIFTIWriter.h | 220 +-
Source/vtkScancoCTReader.cxx | 430 +-
Source/vtkScancoCTReader.h | 206 +-
Testing/CMakeLists.txt | 29 +-
Testing/TestDICOMCharacterSet.cxx | 25 +-
Testing/TestDICOMFilePath.cxx | 205 +
Testing/TestDICOMMetaData.cxx | 68 +-
Testing/TestDICOMSequence.cxx | 38 +-
Testing/TestDICOMTcl.tcl | 13 +
Testing/TestDICOMUtilities.cxx | 8 +-
Testing/TestDICOMVR.cxx | 4 +-
Testing/TestDICOMValue.cxx | 2 +-
Utilities/makedict.py | 5 +-
Utilities/nemadict.txt | 786 ++-
Utilities/nemauids.txt | 325 +-
Utilities/parseuid.py | 12 +-
134 files changed, 23300 insertions(+), 16354 deletions(-)
diff --git a/CMake/DICOMConfig.cmake.in b/CMake/DICOMConfig.cmake.in
index 27ed25c..1113707 100644
--- a/CMake/DICOMConfig.cmake.in
+++ b/CMake/DICOMConfig.cmake.in
@@ -12,7 +12,10 @@ set(DICOM_REQUIRED_CXX_FLAGS "@DICOM_REQUIRED_CXX_FLAGS@")
# The version number
set(DICOM_MAJOR_VERSION "@DICOM_MAJOR_VERSION@")
set(DICOM_MINOR_VERSION "@DICOM_MINOR_VERSION@")
-set(DICOM_BUILD_VERSION "@DICOM_BUILD_VERSION@")
+set(DICOM_PATCH_VERSION "@DICOM_PATCH_VERSION@")
+
+# Legacy (for backwards compatibility)
+set(DICOM_BUILD_VERSION "${DICOM_PATCH_VERSION}")
# Configured settings
set(DICOM_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@")
diff --git a/CMake/pkgIndex.tcl.in b/CMake/pkgIndex.tcl.in
new file mode 100644
index 0000000..2403ad3
--- /dev/null
+++ b/CMake/pkgIndex.tcl.in
@@ -0,0 +1,13 @@
+package ifneeded @MODULE_TCL_NAME@ @VTK_VERSION_MAJOR at .@VTK_VERSION_MINOR@ {
+ set libPrefix ""
+ if {$tcl_platform(platform) == "unix"} {
+ set libPrefix "lib"
+ }
+ set libExt [info sharedlibextension]
+ set libPath {@MODULE_TCL_PATH@}
+ set libFile [file join ${libPath} ${libPrefix}@LIB_TCL_OUTPUT_NAME@${libExt}]
+ if { [file exists ${libFile}] } {
+ load ${libFile}
+ package provide @MODULE_TCL_NAME@ @VTK_VERSION_MAJOR at .@VTK_VERSION_MINOR@
+ }
+}
diff --git a/CMake/vtkDICOMConfig.h.in b/CMake/vtkDICOMConfig.h.in
index 6482281..cdca281 100644
--- a/CMake/vtkDICOMConfig.h.in
+++ b/CMake/vtkDICOMConfig.h.in
@@ -25,8 +25,20 @@
/* Version number. */
#define DICOM_MAJOR_VERSION @DICOM_MAJOR_VERSION@
#define DICOM_MINOR_VERSION @DICOM_MINOR_VERSION@
-#define DICOM_BUILD_VERSION @DICOM_BUILD_VERSION@
+#define DICOM_PATCH_VERSION @DICOM_PATCH_VERSION@
#define DICOM_SHORT_VERSION "@DICOM_SHORT_VERSION@"
#define DICOM_VERSION "@DICOM_VERSION@"
+/* Legacy (for backwards compatibility) */
+#define DICOM_BUILD_VERSION DICOM_PATCH_VERSION
+
+/* For compatibility with VTK 7.1 */
+#ifndef VTK_DELETE_FUNCTION
+#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+#define VTK_DELETE_FUNCTION =delete
+#else
+#define VTK_DELETE_FUNCTION
+#endif
+#endif
+
#endif
diff --git a/CMake/vtkWrapHierarchy.cmake b/CMake/vtkWrapHierarchy.cmake
index 03d2e83..0cb5c18 100644
--- a/CMake/vtkWrapHierarchy.cmake
+++ b/CMake/vtkWrapHierarchy.cmake
@@ -1,7 +1,7 @@
#
# a cmake macro to generate a text file with the class hierarchy
#
-macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
+macro(VTK_WRAP_HIERARCHY module_name OUTPUT_DIR SOURCES)
if(NOT VTK_WRAP_HIERARCHY_EXE)
if(TARGET vtkWrapHierarchy)
set(VTK_WRAP_HIERARCHY_EXE vtkWrapHierarchy)
@@ -10,28 +10,43 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
endif()
endif()
- # all the include directories
- if(VTK_WRAP_INCLUDE_DIRS)
- set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS})
+ # collect the common wrapper-tool arguments
+ if(NOT CMAKE_VERSION VERSION_LESS 3.1 AND
+ NOT VTK_VERSION VERSION_LESS 7.1)
+ # write wrapper-tool arguments to a file
+ set(_args_file ${module_name}Hierarchy.$<CONFIGURATION>.args)
+ file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_args_file} CONTENT "
+$<$<BOOL:$<TARGET_PROPERTY:${module_name},COMPILE_DEFINITIONS>>:
+-D\"$<JOIN:$<TARGET_PROPERTY:${module_name},COMPILE_DEFINITIONS>,\"
+-D\">\">
+$<$<BOOL:$<TARGET_PROPERTY:${module_name},INCLUDE_DIRECTORIES>>:
+-I\"$<JOIN:$<TARGET_PROPERTY:${module_name},INCLUDE_DIRECTORIES>,\"
+-I\">\">
+")
else()
- set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS})
+ set(_common_args)
+ get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS)
+ foreach(TMP_DEF ${_def_list})
+ set(_common_args "${_common_args}-D${TMP_DEF}\n")
+ endforeach()
+
+ # all the include directories
+ if(VTK_WRAP_INCLUDE_DIRS)
+ set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS})
+ else()
+ set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS})
+ endif()
+ foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS})
+ set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n")
+ endforeach()
+
+ # write wrapper-tool arguments to a file
+ set(_args_file ${module_name}Hierarchy.args)
+ string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
+ configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
+ ${_args_file} @ONLY)
endif()
- # collect the common wrapper-tool arguments
- set(_common_args)
- get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS)
- foreach(TMP_DEF ${_def_list})
- set(_common_args "${_common_args}-D${TMP_DEF}\n")
- endforeach()
- foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS})
- set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n")
- endforeach()
-
- # write wrapper-tool arguments to a file
- string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
- configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
- ${vtk-module}Hierarchy.args @ONLY)
-
# list of all files to wrap
set(VTK_WRAPPER_INIT_DATA)
# list of used files
@@ -42,8 +57,9 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
# file properties to include in the hierarchy file
get_property(TMP_WRAP_EXCLUDE SOURCE ${FILE} PROPERTY WRAP_EXCLUDE)
- get_source_file_property(TMP_WRAP_SPECIAL ${FILE} WRAP_SPECIAL)
get_source_file_property(TMP_ABSTRACT ${FILE} ABSTRACT)
+ get_source_file_property(TMP_EXCLUDE_PYTHON ${FILE} WRAP_EXCLUDE_PYTHON)
+ get_source_file_property(TMP_WRAP_SPECIAL ${FILE} WRAP_SPECIAL)
# what is the filename without the extension
get_filename_component(TMP_FILENAME ${FILE} NAME_WE)
@@ -57,11 +73,15 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
# assume header file is in the same directory
set(TMP_INPUT ${TMP_FILEPATH}/${TMP_FILENAME}.h)
- # default to including all available headers in the hierarchy files
+ # include all non-private headers in the hierarchy files
set(TMP_EXCLUDE_FROM_HIERARCHY OFF)
+ get_source_file_property(TMP_SKIP ${FILE} SKIP_HEADER_INSTALL)
+ if(TMP_SKIP)
+ set(TMP_EXCLUDE_FROM_HIERARCHY ON)
+ endif()
# ensure that header exists (assume it exists if it is marked as wrapped)
- if(TMP_WRAP_EXCLUDE AND NOT TMP_WRAP_SPECIAL)
+ if(TMP_WRAP_EXCLUDE)
if(NOT EXISTS ${TMP_INPUT})
set(TMP_EXCLUDE_FROM_HIERARCHY ON)
endif()
@@ -78,7 +98,7 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
# add the info to the init file
set(VTK_WRAPPER_INIT_DATA
- "${VTK_WRAPPER_INIT_DATA}${TMP_INPUT};${vtk-module}")
+ "${VTK_WRAPPER_INIT_DATA}${TMP_INPUT};${module_name}")
if(TMP_ABSTRACT)
set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};ABSTRACT")
@@ -88,6 +108,10 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_EXCLUDE")
endif()
+ if(TMP_EXCLUDE_PYTHON)
+ set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_EXCLUDE_PYTHON")
+ endif()
+
if(TMP_WRAP_SPECIAL)
set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_SPECIAL")
endif()
@@ -100,17 +124,18 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
# finish the data file for the init file
configure_file(
${VTK_CMAKE_DIR}/vtkWrapperInit.data.in
- ${vtk-module}Hierarchy.data
+ ${module_name}Hierarchy.data
+ @ONLY
)
# search through the deps to find modules we depend on
set(OTHER_HIERARCHY_FILES)
- # Don't use ${vtk-module}_DEPENDS. That list also includes COMPILE_DEPENDS,
+ # Don't use ${module_name}_DEPENDS. That list also includes COMPILE_DEPENDS,
# which aren't library dependencies, merely dependencies for generators and
# such. The dependecies specified under "DEPENDS" in the vtk_module(..) macro
# call are located under _LINK_DEPENDS.
- foreach(dep ${${vtk-module}_LINK_DEPENDS})
- if(NOT "${vtk-module}" STREQUAL "${dep}")
+ foreach(dep ${${module_name}_LINK_DEPENDS})
+ if(NOT "${module_name}" STREQUAL "${dep}")
if(NOT ${dep}_EXCLUDE_FROM_WRAPPING)
list(APPEND OTHER_HIERARCHY_FILES "${${dep}_WRAP_HIERARCHY_FILE}")
endif()
@@ -118,17 +143,17 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
endforeach()
add_custom_command(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.stamp
- ${OUTPUT_DIR}/${vtk-module}Hierarchy.txt
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.stamp.txt
+ ${OUTPUT_DIR}/${module_name}Hierarchy.txt
COMMAND ${VTK_WRAP_HIERARCHY_EXE}
- @${vtk-module}Hierarchy.args -o ${OUTPUT_DIR}/${vtk-module}Hierarchy.txt
- ${vtk-module}Hierarchy.data
+ @${_args_file} -o ${OUTPUT_DIR}/${module_name}Hierarchy.txt
+ ${module_name}Hierarchy.data
${OTHER_HIERARCHY_FILES}
- COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.stamp
- COMMENT "For ${vtk-module} - updating ${vtk-module}Hierarchy.txt"
+ COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.stamp.txt
+ COMMENT "For ${module_name} - updating ${module_name}Hierarchy.txt"
DEPENDS ${VTK_WRAP_HIERARCHY_EXE}
- ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.args
- ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.data
+ ${CMAKE_CURRENT_BINARY_DIR}/${_args_file}
+ ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.data
${OTHER_HIERARCHY_FILES}
${INPUT_FILES}
VERBATIM
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dd04bd5..5f60ee0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,20 +1,17 @@
+# for CMake 3, add VERSION X.Y.Z to set the version here
project(DICOM)
# CMake version requirements
cmake_minimum_required(VERSION 2.8.7)
-# Use LINK_INTERFACE_LIBRARIES instead of INTERFACE_LINK_LIBRARIES
-#if(POLICY CMP0022)
-# cmake_policy(SET CMP0022 OLD)
-#endif()
-
# When CMake 3.0.0 is required, remove this block (see CMP0042).
if(NOT DEFINED CMAKE_MACOSX_RPATH)
set(CMAKE_MACOSX_RPATH 0)
endif()
# Allow custom cmake overrides
-set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
+set(DICOM_CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/CMake)
+set(CMAKE_MODULE_PATH ${DICOM_CMAKE_DIR} ${CMAKE_MODULE_PATH})
# Use ctest for dashboard submissions
include(CTest)
@@ -22,9 +19,15 @@ include(CTest)
# Project version
set(DICOM_MAJOR_VERSION 0)
set(DICOM_MINOR_VERSION 7)
-set(DICOM_BUILD_VERSION 1)
+set(DICOM_PATCH_VERSION 10)
set(DICOM_SHORT_VERSION "${DICOM_MAJOR_VERSION}.${DICOM_MINOR_VERSION}")
-set(DICOM_VERSION "${DICOM_SHORT_VERSION}.${DICOM_BUILD_VERSION}")
+set(DICOM_VERSION "${DICOM_SHORT_VERSION}.${DICOM_PATCH_VERSION}")
+
+# Generic project version variables (forwards compatibility with CMake 3)
+set(PROJECT_MAJOR_VERSION ${DICOM_MAJOR_VERSION})
+set(PROJECT_MINOR_VERSION ${DICOM_MINOR_VERSION})
+set(PROJECT_PATCH_VERSION ${DICOM_PATCH_VERSION})
+set(PROJECT_VERSION ${DICOM_VERSION})
# Include directories
set(DICOM_INCLUDE_DIRS
@@ -44,11 +47,6 @@ if(Module_vtkDICOM) # We are being built as a VTK remote module
# To set DICOM_USE_VTKZLIB in vtkDICOMConfig.h
set(DICOM_USE_VTKZLIB ON)
- # Wrapping will be done by VTK's modular build, so turn off
- # these flags that enable our own wrapping CMake code
- set(BUILD_PYTHON_WRAPPERS OFF)
- set(BUILD_JAVA_WRAPPERS OFF)
-
option(BUILD_DICOM_PROGRAMS "Build the vtkDICOM tools" ON)
set(BUILD_PROGRAMS ${BUILD_DICOM_PROGRAMS})
@@ -57,9 +55,9 @@ else() # We are being built as a stand-alone package
option(BUILD_SHARED_LIBS "Build shared libraries." OFF)
# Which parts of the package to build
- option(BUILD_TESTING "Build the tests" ON)
+ option(BUILD_TESTING "Build the tests" OFF)
option(BUILD_PROGRAMS "Build some useful DICOM tools" ON)
- option(BUILD_EXAMPLES "Build the examples" ON)
+ option(BUILD_EXAMPLES "Build the examples" OFF)
find_package(VTK REQUIRED)
message(STATUS "vtkDICOM: Building vtkDICOM stand-alone")
@@ -75,6 +73,13 @@ else() # We are being built as a stand-alone package
unset(BUILD_PYTHON_WRAPPERS CACHE)
endif()
+ # Wrap Tcl option
+ if(VTK_WRAP_TCL)
+ option(BUILD_TCL_WRAPPERS "Build tcl wrappers" ON)
+ else()
+ unset(BUILD_TCL_WRAPPERS CACHE)
+ endif()
+
# Wrap Java option
if(VTK_WRAP_JAVA)
option(BUILD_JAVA_WRAPPERS "Build java wrappers" OFF)
@@ -152,7 +157,10 @@ if(USE_DCMTK)
if(NOT DCMTK_FOUND)
message(FATAL_ERROR "DCMTK not found or incomplete.")
endif()
- set(DCMTK_LIBS ${DCMTK_LIBRARIES})
+ set(DCMTK_LIBS ${DCMTK_LIBRARIES} ${DCMTK_charls_LIBRARY})
+ if(APPLE)
+ list(APPEND DCMTK_LIBS iconv)
+ endif()
include_directories(${DCMTK_INCLUDE_DIRS})
endif()
@@ -207,14 +215,17 @@ endif()
if(NOT DICOM_INC_DIR)
set(DICOM_INC_DIR "include") # for header files
endif()
+if(NOT DICOM_TCL_DIR)
+ set(DICOM_TCL_DIR "lib/tcltk/dicom-${DICOM_SHORT_VERSION}")
+endif()
if(NOT DICOM_JAVA_DIR)
set(DICOM_JAVA_DIR "share/java")
endif()
if(NOT DICOM_DATA_DIR)
set(DICOM_DATA_DIR "share/dicom-${DICOM_SHORT_VERSION}")
endif()
-if(NOT DICOM_CMAKE_DIR)
- set(DICOM_CMAKE_DIR "${DICOM_LIB_DIR}/dicom-${DICOM_SHORT_VERSION}/cmake")
+if(NOT DICOM_PGK_DIR)
+ set(DICOM_PGK_DIR "${DICOM_LIB_DIR}/dicom-${DICOM_SHORT_VERSION}/cmake")
endif()
# Set the full paths to the install tree
@@ -222,9 +233,10 @@ set(DICOM_RUNTIME_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_BIN_DIR})
set(DICOM_LIBRARY_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_LIB_DIR})
set(DICOM_ARCHIVE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_ARC_DIR})
set(DICOM_INCLUDE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_INC_DIR})
+set(DICOM_TCL_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_TCL_DIR})
set(DICOM_JAVA_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_JAVA_DIR})
set(DICOM_DATA_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_DATA_DIR})
-set(DICOM_CMAKE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_CMAKE_DIR})
+set(DICOM_CMAKE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_PGK_DIR})
if(NOT Module_vtkDICOM)
# Libraries
@@ -238,6 +250,11 @@ if(NOT Module_vtkDICOM)
if(TMP_INDEX GREATER -1)
set(VTK_LIBS ${VTK_LIBS} vtkIOMPIImage)
endif()
+ # If vtkIOMySQL is present, it has factories for vtkIOSQL
+ list(FIND VTK_LIBRARIES vtkIOMySQL TMP_INDEX)
+ if(TMP_INDEX GREATER -1)
+ set(VTK_LIBS ${VTK_LIBS} vtkIOMySQL)
+ endif()
else()
set(VTK_LIBS vtkCommon vtkFiltering vtkImaging vtkIO vtkInfovis) # VTK 5.x
endif()
@@ -251,6 +268,12 @@ if(NOT Module_vtkDICOM)
set(DICOM_PYTHON_LIBRARIES vtkDICOMPythonD)
endif()
+ # For the tcl wrappers
+ if(BUILD_TCL_WRAPPERS)
+ find_package(TCL REQUIRED)
+ set(DICOM_TCL_LIBRARIES vtkDICOMTCL)
+ endif()
+
# For the java wrappers
if(BUILD_JAVA_WRAPPERS)
find_package(Java REQUIRED)
@@ -332,10 +355,10 @@ if(NOT Module_vtkDICOM)
# ... for the install tree
file(RELATIVE_PATH REL_INCLUDE_DIR "${DICOM_CMAKE_INSTALL_DEST}"
"${DICOM_INCLUDE_INSTALL_DEST}")
- set(INCLUDE_DIRS_CONFIG "\${DICOM_CMAKE_DIR}/${REL_INCLUDE_DIR}")
+ set(INCLUDE_DIRS_CONFIG "\${DICOM_PGK_DIR}/${REL_INCLUDE_DIR}")
file(RELATIVE_PATH REL_LIBRARY_DIR "${DICOM_CMAKE_INSTALL_DEST}"
"${DICOM_LIBRARY_INSTALL_DEST}")
- set(LIBRARY_DIRS_CONFIG "\${DICOM_CMAKE_DIR}/${REL_LIBRARY_DIR}")
+ set(LIBRARY_DIRS_CONFIG "\${DICOM_PGK_DIR}/${REL_LIBRARY_DIR}")
configure_file(CMake/DICOMConfig.cmake.in
"${DICOM_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DICOMConfig.cmake" @ONLY)
diff --git a/Copyright.txt b/Copyright.txt
index cbe90e8..885119f 100644
--- a/Copyright.txt
+++ b/Copyright.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2015 David Gobbi
+Copyright (c) 2012-2016 David Gobbi
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/DicomCli/CMakeLists.txt b/DicomCli/CMakeLists.txt
index 8d2ae41..35cc393 100644
--- a/DicomCli/CMakeLists.txt
+++ b/DicomCli/CMakeLists.txt
@@ -2,10 +2,17 @@ include_directories(${DICOM_INCLUDE_DIRS})
set(LIB_NAME dicomcli)
+if(WIN32)
+ set(MAINMACRO_SRC mainmacro.cxx)
+else()
+ set(MAINMACRO_SRC)
+endif()
+
set(LIB_SRCS
- mainmacro.cxx
+ ${MAINMACRO_SRC}
readquery.cxx
progress.cxx
+ vtkConsoleOutputWindow.cxx
)
add_library(${LIB_NAME} STATIC ${LIB_SRCS})
diff --git a/DicomCli/mainmacro.cxx b/DicomCli/mainmacro.cxx
index d130f46..b55ca75 100644
--- a/DicomCli/mainmacro.cxx
+++ b/DicomCli/mainmacro.cxx
@@ -1,25 +1,43 @@
/*=========================================================================
- Program: DICOM for VTK
-
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2015,2016 David Gobbi
All rights reserved.
- See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notice for more information.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of David Gobbi nor the names of any contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=========================================================================*/
#include "mainmacro.h"
-#include <string.h>
#include <stddef.h>
#ifdef _WIN32
#include <windows.h>
-#include <io.h>
#endif
// A struct to arguments converted from UTF-16 to UTF-8.
@@ -29,187 +47,394 @@ namespace {
class Arguments
{
public:
- // Construct with an empty argument list.
- Arguments() : m_Argc(0), m_Argv(0) {}
-
- // Destruct by freeing the memory.
- ~Arguments() {
- if (m_Argv) {
- delete [] *m_Argv;
- delete [] m_Argv;
- }
- }
+ // Construct with an empty argument list, set console code page to UTF-8.
+ Arguments();
- // Allocate space for the next arg (of size n, including null).
- char *Next(int n);
+ // Destruct by freeing the memory and restoring the origin code page.
+ ~Arguments();
- // Add the next arg.
+ // Add the next arg (this is called by ExpandArgs).
void Push(wchar_t *arg);
+ // Expand args, result can be retrieved with GetArgc, GetArgv.
+ bool ExpandArgs(int argc, wchar_t *argv[], const char *passthrough);
+
// Get the argc and argv for the args.
int GetArgc() { return m_Argc; }
char **GetArgv() { return m_Argv; }
private:
+ // Check if the given string matches the given wildcard pattern.
+ static bool MatchesSpec(
+ const wchar_t *val, size_t vl,
+ const wchar_t *spec, size_t pl);
+
// Get the power of two equal or greater than n.
- static int NearestPowerOfTwo(int n) {
- unsigned int m = ((n > 0) ? n - 1 : 0);
+ static size_t NearestPowerOfTwo(size_t n) {
+ size_t m = ((n > 0) ? n - 1 : 0);
m |= m >> 1;
m |= m >> 2;
m |= m >> 4;
m |= m >> 8;
m |= m >> 16;
- return static_cast<int>(m + 1);
+#ifdef _WIN64
+ m |= m >> 32;
+#endif
+ return m + 1;
}
// Check if n is a power of two.
- static bool IsPowerOfTwo(int n) {
- return ((n & (n - 1)) == 0);
+ static bool IsPowerOfTwo(size_t n) {
+ return (n > 0 && (n & (n - 1)) == 0);
+ }
+
+ // Create a string of length n and add it to the given array.
+ template<class T>
+ static T *NewString(size_t n, int *count, T ***strings) {
+ T **array = *strings;
+ (*count)++;
+ if (array == 0) {
+ size_t m = NearestPowerOfTwo(n);
+ array = new T *[2];
+ array[0] = new T[m];
+ *strings = array;
+ }
+ else {
+ if (IsPowerOfTwo(*count)) {
+ T **newarray = new T *[*count * 2];
+ for (int i = 0; i < *count; i++) {
+ newarray[i] = array[i];
+ }
+ delete [] array;
+ array = newarray;
+ *strings = array;
+ }
+ size_t m = array[*count - 1] - array[0];
+ if (m + n > NearestPowerOfTwo(m)) {
+ T *cp = new T[NearestPowerOfTwo(m + n)];
+ T *oldcp = array[0];
+ for (size_t j = 0; j < m; j++) {
+ cp[j] = oldcp[j];
+ }
+ for (int i = 0; i < *count; i++) {
+ array[i] = cp + (array[i] - oldcp);
+ }
+ delete [] oldcp;
+ }
+ }
+
+ array[*count] = array[*count - 1] + n;
+ return array[*count - 1];
+ }
+
+ // Delete the array of strings.
+ template<class T>
+ static void FreeStrings(int *count, T ***strings) {
+ if (*strings) {
+ delete [] **strings;
+ delete [] *strings;
+ }
+ *count = 0;
+ *strings = 0;
}
int m_Argc;
char **m_Argv;
+ UINT m_CodePage;
};
-char *Arguments::Next(int n)
+Arguments::Arguments() : m_Argc(0), m_Argv(0)
{
- m_Argc++;
- if (m_Argv == 0)
- {
- int m = NearestPowerOfTwo(n);
- m_Argv = new char *[2];
- m_Argv[0] = new char[m];
+ // Save the current code page, then set code page to UTF-8
+ m_CodePage = GetConsoleOutputCP();
+ SetConsoleOutputCP(65001);
+}
+
+Arguments::~Arguments()
+{
+ FreeStrings(&m_Argc, &m_Argv);
+ // Restore the old code page
+ SetConsoleOutputCP(m_CodePage);
+}
+
+bool Arguments::MatchesSpec(
+ const wchar_t *val, size_t vl,
+ const wchar_t *spec, size_t sl)
+{
+ // convert to lower case for case insensitivity
+ wchar_t val_lower[MAX_PATH];
+ wchar_t spec_lower[MAX_PATH];
+
+ if (vl < MAX_PATH && sl < MAX_PATH) {
+ for (size_t i = 0; i < vl; i++) {
+ val_lower[i] = val[i];
}
- else
- {
- if (IsPowerOfTwo(m_Argc))
- {
- char **argv = new char *[m_Argc*2];
- for (int i = 0; i < m_Argc; i++)
- {
- argv[i] = m_Argv[i];
+ for (size_t i = 0; i < sl; i++) {
+ spec_lower[i] = spec[i];
+ }
+
+ if (CharLowerBuffW(val_lower, static_cast<unsigned int>(vl)) == vl &&
+ CharLowerBuffW(spec_lower, static_cast<unsigned int>(sl)) == sl) {
+ // if successful, use the lower-case strings
+ spec = spec_lower;
+ val = val_lower;
+ }
+ }
+
+ // get pointers to the end of the strings
+ const wchar_t *cp = spec;
+ const wchar_t *ep = spec + sl;
+ const wchar_t *dp = val;
+ const wchar_t *fp = val + vl;
+
+ while (cp != ep && dp != fp) {
+ if (*cp == '*') {
+ cp++;
+ // if '*' is the final character, it matches the remainder of val
+ if (cp == ep) {
+ dp = fp;
+ }
+ else {
+ while (dp != fp) {
+ if (*cp == '?' || *dp == *cp) {
+ // check if the remainder of val matches remainder of spec
+ if (MatchesSpec(dp, fp-dp, cp, ep-cp)) {
+ break;
+ }
+ }
+ // else let the "*" eat one more codepoint of "val"
+ if ((*dp++ & 0xFC00) == 0xD800) {
+ if (dp != fp && (*dp & 0xFC00) == 0xDC00) {
+ dp++;
+ }
+ }
}
- delete [] m_Argv;
- m_Argv = argv;
}
- int m = static_cast<int>(m_Argv[m_Argc-1] - m_Argv[0]);
- if (m + n > NearestPowerOfTwo(m))
- {
- char *cp = new char[NearestPowerOfTwo(m + n)];
- char *oldcp = m_Argv[0];
- memcpy(cp, oldcp, m);
- for (int i = 0; i < m_Argc; i++)
- {
- m_Argv[i] = cp + (m_Argv[i] - oldcp);
+ }
+ else if (*cp == '?') {
+ // the '?' matches a whole codepoint, not just one wchar
+ cp++;
+ if ((*dp++ & 0xFC00) == 0xD800) {
+ if (dp != fp && (*dp & 0xFC00) == 0xDC00) {
+ dp++;
}
- delete [] oldcp;
}
}
+ else if (*cp == *dp) {
+ // make sure the entire codepoint matches
+ cp++;
+ if ((*dp++ & 0xFC00) == 0xD800) {
+ if (cp != ep && dp != fp &&
+ ((*cp & 0xFC00) == 0xDC00 || (*dp & 0xFC00) == 0xDC00)) {
+ if (*dp != *cp) {
+ return false;
+ }
+ cp++;
+ dp++;
+ }
+ }
+ }
+ else {
+ return false;
+ }
+ }
+
+ // skip over any remaining '*' wildcards
+ while (cp != ep && *cp == '*') {
+ cp++;
+ }
- m_Argv[m_Argc] = m_Argv[m_Argc-1] + n;
- return m_Argv[m_Argc-1];
+ // make sure we've reached the end of both the spec and the value
+ return (cp == ep && dp == fp);
}
void Arguments::Push(wchar_t *arg)
{
int n = WideCharToMultiByte(
CP_UTF8, 0, arg, -1, NULL, 0, NULL, NULL);
- char *cp = this->Next(n);
+ char *cp = NewString(n, &m_Argc, &m_Argv);
WideCharToMultiByte(
CP_UTF8, 0, arg, -1, cp, n, NULL, NULL);
}
-} // namespace
-
-// A static variable to hold the arguments (will destruct on exit).
-static Arguments dicomcli_arguments;
-#endif /* _WIN32 */
-
-// The function, with special definition for Windows.
-#ifdef _WIN32
-bool dicomcli_expandargs(
- int argc, wchar_t *argv[],
- int *argc_p, char ***argv_p)
+bool Arguments::ExpandArgs(int argc, wchar_t *argv[], const char *passthrough)
{
- struct _wfinddata64_t data;
+ WIN32_FIND_DATAW data;
+ wchar_t *temp = 0;
+ size_t tempsize = 0;
+ bool expand_wildcards = true;
for (int i = 0; i < argc; i++)
- {
+ {
+ // for storing segments of the path that have wildcards
+ int dirstart = 0;
+ int dircount = 0;
+ wchar_t **directories = 0;
+
// check for wildcards
bool has_wildcard = false;
- wchar_t *cp = argv[i];
- wchar_t *dp = cp;
- while (*cp != 0)
- {
- if (*cp == '\?' || *cp == '*')
- {
+ bool segment_has_wildcard = false;
+ bool wildcard_expanded = false;
+ bool path_is_complete = false;
+ wchar_t *dp = argv[i];
+ for (wchar_t *cp = dp; !path_is_complete; cp++) {
+ if (expand_wildcards && (*cp == '\?' || *cp == '*')) {
has_wildcard = true;
- }
- if (*cp == '\\' || *cp == '/')
- {
- dp = cp + 1;
- has_wildcard = false;
- }
- cp++;
+ segment_has_wildcard = true;
}
-
- if (has_wildcard)
- {
- wchar_t *temp = 0;
- size_t tempsize = 0;
- intptr_t hFile = _wfindfirst64(argv[i], &data);
- if (hFile != static_cast<intptr_t>(-1))
- {
- do
- {
- if (dp == argv[i])
- {
- // Path does not contain a directory.
- dicomcli_arguments.Push(data.name);
+ else if (*cp == '\\' || *cp == '/' || *cp == 0) {
+ path_is_complete = (*cp == 0);
+ // If path has a wildcard push all matching dirs onto a list.
+ if (has_wildcard) {
+ // Check if directory list is empty.
+ if (dircount == 0) {
+ // Push path segment (argv[i]..dp) onto the directory list.
+ size_t l = dp - argv[i];
+ wchar_t *ep = NewString(l, &dircount, &directories);
+ for (size_t j = 0; j < l; j++) {
+ ep[j] = argv[i][j];
}
- else
- {
- // Append wildcard result to the directory.
- cp = argv[i];
- size_t l = dp - cp;
- size_t k = 0;
- wchar_t *ep = data.name;
- while (ep[k] != 0) { k++; }
- if (l + k + 1 > tempsize)
- {
- tempsize = l + k + 9;
+ }
+ // Get the length of the path segment.
+ size_t m = cp - dp;
+ int prevcount = dircount;
+ for (int k = dirstart; k < prevcount; k++) {
+ // Length of the directory (including the "/").
+ size_t l = directories[k + 1] - directories[k];
+ if (l+m+1 > tempsize) {
+ tempsize = l+m+9;
delete [] temp;
temp = new wchar_t[tempsize];
+ }
+ for (size_t j = 0; j < l; j++) {
+ temp[j] = directories[k][j];
+ }
+ for (size_t j = 0; j < m; j++) {
+ temp[l+j] = dp[j];
+ }
+ temp[l+m] = 0;
+ // Find all existing directories.
+ HANDLE hFile = FindFirstFileW(temp, &data);
+ if (hFile != INVALID_HANDLE_VALUE) {
+ do {
+ if (!path_is_complete &&
+ (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
+ // A directory was expected
+ continue;
+ }
+ if (data.cFileName[0] == '.' &&
+ (data.cFileName[1] == 0 ||
+ (data.cFileName[1] == '.' && data.cFileName[2] == 0))) {
+ // The found file was '.' or '..'
+ continue;
+ }
+ if (data.cFileName[0] == '.' && dp[0] != '.') {
+ // The found file began with '.' but the filespec did not.
+ continue;
+ }
+ // Append wildcard result to the directory.
+ wchar_t *result;
+ size_t n = 0;
+ while (data.cFileName[n] != 0 && n < MAX_PATH) {
+ n++;
+ }
+ // Ensure that the true filename matches the wildcards.
+ // (FindFirstFile, FindNextFile also match short filename)
+ if (!MatchesSpec(data.cFileName, n, dp, cp-dp)) {
+ continue;
+ }
+ if (path_is_complete) {
+ // Expand into temporary string if path is complete.
+ if (l+n+1 > tempsize) {
+ tempsize = l+n+9;
+ delete [] temp;
+ temp = new wchar_t[tempsize];
+ }
+ result = temp;
+ }
+ else {
+ // Add result to directory list if path is not complete yet.
+ result = NewString(l+n+1, &dircount, &directories);
+ }
+ for (size_t j = 0; j < l; j++) {
+ result[j] = directories[k][j];
+ }
+ for (size_t j = 0; j < n; j++) {
+ result[l+j] = data.cFileName[j];
+ }
+ result[l+n] = *cp;
+ // Push result onto the args if path is complete.
+ if (path_is_complete) {
+ Push(result);
+ wildcard_expanded = true;
+ }
}
- for (size_t j = 0; j < l; j++) { temp[j] = cp[j]; }
- for (size_t j = 0; j < k; j++) { temp[l+j] = ep[j]; }
- temp[l + k] = 0;
- dicomcli_arguments.Push(temp);
+ while (FindNextFileW(hFile, &data));
+ FindClose(hFile);
}
}
- while (_wfindnext64(hFile, &data) != -1);
- _findclose(hFile);
- }
- else
- {
- dicomcli_arguments.Push(argv[i]);
+ dirstart = prevcount;
}
- delete [] temp;
+ dp = cp + 1;
}
- else
- {
- dicomcli_arguments.Push(argv[i]);
+ }
+ // If no expansion could be done, push the argument as-is.
+ if (!wildcard_expanded) {
+ Push(argv[i]);
+ if (passthrough) {
+ expand_wildcards = true;
+ // Check the arg against the expansion exclusion list.
+ const char *arg = m_Argv[m_Argc-1];
+ const char *ex = passthrough;
+ while (*ex == ' ' || *ex == '\t') {
+ ex++;
+ }
+ while (*ex != '\0') {
+ const char *ee = ex;
+ while (*ee != '\0' && *ee != ' ' && *ee != '\t') {
+ ee++;
+ }
+ while (*arg != '\0' && ex != ee && *ex == *arg) {
+ ex++;
+ arg++;
+ }
+ if (*arg == '\0' && ex == ee) {
+ // Do not expand wildcards in the next arg.
+ expand_wildcards = false;
+ break;
+ }
+ ex = ee;
+ while (*ex == ' ' || *ex == '\t') {
+ ex++;
+ }
+ }
}
}
-
- *argc_p = dicomcli_arguments.GetArgc();
- *argv_p = dicomcli_arguments.GetArgv();
+ FreeStrings(&dircount, &directories);
+ }
+ delete [] temp;
return true;
}
-#else
-bool dicomcli_expandargs(int *, char ***)
+
+} // namespace
+
+// A static variable to hold the arguments (will destruct on exit).
+static Arguments mainmacro_arguments;
+#endif /* _WIN32 */
+
+// The function, with special definition for Windows.
+#ifdef _WIN32
+bool mainmacro_expandargs(
+ int argc, wchar_t *argv[],
+ int *argc_p, char ***argv_p,
+ const char *passthrough)
{
- return true;
+ if (mainmacro_arguments.ExpandArgs(argc, argv, passthrough)) {
+ *argc_p = mainmacro_arguments.GetArgc();
+ *argv_p = mainmacro_arguments.GetArgv();
+ return true;
+ }
+ return false;
}
#endif
diff --git a/DicomCli/mainmacro.h b/DicomCli/mainmacro.h
index c6fab6e..49140ef 100644
--- a/DicomCli/mainmacro.h
+++ b/DicomCli/mainmacro.h
@@ -1,14 +1,34 @@
/*=========================================================================
- Program: DICOM for VTK
-
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2015,2016 David Gobbi
All rights reserved.
- See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notice for more information.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of David Gobbi nor the names of any contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=========================================================================*/
#ifndef mainmacro_h
@@ -16,29 +36,47 @@
//! Expand command line arguments for Windows command line.
/*!
- * This will expand any wildcards in the arguments, and should usually
- * only be applied on Windows because most UNIX shells will handle the
- * wildcard expansion automatically.
+ * This will expand any wildcards in the arguments, and is only applied
+ * on Windows because UNIX shells do wildcard expansion by themselves.
*/
-bool dicomcli_expandargs(
+#ifdef _WIN32
+bool mainmacro_expandargs(
int wargc, wchar_t *wargv[],
- int *argc_p, char ***argv_p);
+ int *argc_p, char ***argv_p,
+ const char *passthrough);
+#endif
+
+//! Supply a list of options for which wildcards should be passed through.
+/*!
+ * The command-line argument that follows any of the options that are
+ * passed to this macro will not be expanded if they include wildcards.
+ * Instead, the wildcards will be passed through to main().
+ */
+//! This is the macro for specifying the passthrough options, if any.
+#ifdef _WIN32
+#define MAINMACRO_PASSTHROUGH(opts) \
+ inline const char *mainmacro_passthrough(int) { return #opts; }
+inline const char *mainmacro_passthrough(float) { return 0; }
+#else
+ #define MAINMACRO_PASSTHROUGH(opts)
+#endif
//! A macro to use wmain on Windows.
#ifdef _WIN32
-#define MAINMACRO(argc, argv) \
-int main_with_utf8_args(int argc, char *argv[]); \
+#define MAINMACRO(a, b) \
+main_with_utf8_args(a, b); \
int wmain(int wargc, wchar_t *wargv[]) \
{ \
int argc = 0; \
char **argv = 0; \
- dicomcli_expandargs(wargc, wargv, &argc, &argv); \
+ mainmacro_expandargs(wargc, wargv, &argc, &argv, \
+ mainmacro_passthrough(1)); \
return main_with_utf8_args(argc, argv); \
} \
-int main_with_utf8_args(int argc, char *argv[])
+int main_with_utf8_args(a, b)
#else
-#define MAINMACRO(argc, argv) \
-int main(int argc, char *argv[])
+#define MAINMACRO(a, b) \
+main(a, b)
#endif
#endif /* mainmacro_h */
diff --git a/DicomCli/progress.cxx b/DicomCli/progress.cxx
index 2d61db6..d21ed9f 100644
--- a/DicomCli/progress.cxx
+++ b/DicomCli/progress.cxx
@@ -14,60 +14,60 @@
#include "progress.h"
-#include <vtkTimerLog.h>
+#include <vtkDICOMUtilities.h>
void ProgressObserver::Execute(vtkObject *, unsigned long e, void *vp)
{
const double initial = 2.0; // time until first report
const double delta = 0.1; // time between reports
- double t = vtkTimerLog::GetUniversalTime();
+ double t = 1e-6*vtkDICOMUtilities::GetUTC(NULL);
if (e == vtkCommand::StartEvent)
- {
+ {
this->LastTime = t;
this->Stage = 0;
this->Anim = 0;
- }
+ }
else if (e == vtkCommand::ProgressEvent)
- {
+ {
double *dp = static_cast<double *>(vp);
int progress = static_cast<int>((*dp)*100.0 + 0.5);
if (this->Stage == 0)
- {
+ {
if (t - this->LastTime > initial)
- {
+ {
std::cout << "\r ";
this->Stage = 1;
- }
}
+ }
if (t - this->LastTime > delta)
- {
+ {
if (this->Stage == 1)
- {
+ {
if (progress == 0)
- {
+ {
const char *dots[] = { ". ", ".. ", "..." };
this->Anim = (this->Anim + 1) % 3;
std::cout << "\r" << this->Text << dots[this->Anim];
std::cout.flush();
this->LastTime = t;
- }
+ }
else
- {
+ {
std::cout << "\r" << this->Text << " " << progress << "%";
std::cout.flush();
this->LastTime = t;
- }
}
}
}
+ }
else if (e == vtkCommand::EndEvent)
- {
+ {
if (this->Stage > 0)
- {
+ {
std::cout << "\r" << this->Text << " 100%";
std::cout << std::endl;
- }
}
+ }
}
diff --git a/DicomCli/readquery.cxx b/DicomCli/readquery.cxx
index 037cd86..b908e52 100644
--- a/DicomCli/readquery.cxx
+++ b/DicomCli/readquery.cxx
@@ -21,8 +21,13 @@
#include <string.h>
#include <stdlib.h>
+#include <algorithm>
#include <iostream>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
typedef vtkDICOMVR VR;
// Prototype for function that reads one query key
@@ -35,19 +40,19 @@ vtkDICOMTagPath path_append(const vtkDICOMTagPath& tpath, vtkDICOMTag tag)
vtkDICOMTagPath result(tag);
if (tpath.GetHead() != vtkDICOMTag())
- {
+ {
if (tpath.HasTail())
- {
+ {
result = vtkDICOMTagPath(
tpath.GetHead(), tpath.GetIndex(),
tpath.GetTail().GetHead(), 0, tag);
- }
+ }
else
- {
+ {
result = vtkDICOMTagPath(
tpath.GetHead(), 0, tag);
- }
}
+ }
return result;
}
@@ -56,11 +61,19 @@ vtkDICOMTagPath path_append(const vtkDICOMTagPath& tpath, vtkDICOMTag tag)
bool dicomcli_readquery(
const char *fname, vtkDICOMItem *query, QueryTagList *ql)
{
+#ifdef _WIN32
+ int cn = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0);
+ wchar_t *wfname = new wchar_t[cn];
+ MultiByteToWideChar(CP_UTF8, 0, fname, -1, wfname, cn);
+ ifstream f(wfname);
+ delete [] wfname;
+#else
ifstream f(fname);
+#endif
if (!f.good())
- {
+ {
return false;
- }
+ }
// Each query line is either:
// # a comment
@@ -72,7 +85,7 @@ bool dicomcli_readquery(
int lineNumber = 0;
while (f.good())
- {
+ {
std::string line;
std::getline(f, line);
const char *cp = line.c_str();
@@ -82,22 +95,22 @@ bool dicomcli_readquery(
// strip leading whitespace
size_t s = 0;
while (s < n && isspace(cp[s]))
- {
+ {
s++;
- }
+ }
// skip line if it is a comment
if (s == n || cp[s] == '#')
- {
+ {
continue;
- }
+ }
if (!dicomcli_readkey_query(cp, query, ql, true))
- {
+ {
fprintf(stderr, "Error %s line %d:\n", fname, lineNumber);
return false;
- }
}
+ }
return true;
}
@@ -114,27 +127,27 @@ bool dicomcli_readkey_query(
size_t n = strlen(cp);
bool tagError = false;
while (!tagError && tagDepth < 3)
- {
+ {
// check for private creator in square brackets
size_t creatorStart = s;
size_t creatorEnd = s;
if (cp[s] == '[')
- {
+ {
s++;
creatorStart = s;
while (s < n && cp[s] != ']')
- {
+ {
s++;
- }
+ }
if (s == n)
- {
+ {
fprintf(stderr, "Error: Block is missing the final \"]\".\n");
tagError = true;
continue;
- }
+ }
creatorEnd = s;
s++;
- }
+ }
std::string creator(&cp[creatorStart], creatorEnd - creatorStart);
@@ -145,90 +158,90 @@ bool dicomcli_readkey_query(
bool hasComma = false;
size_t commaPos = 0;
while (s < n && (isalnum(cp[s]) || (cp[s] == ',' && !hasComma)))
- {
+ {
if (cp[s] == ',')
- {
+ {
hasComma = true;
commaPos = s - tagStart;
- }
+ }
else if (!isxdigit(cp[s]))
- {
+ {
isHex = false;
- }
- s++;
}
+ s++;
+ }
size_t tagEnd = s;
if (hasComma)
- {
+ {
if (isHex)
- {
+ {
unsigned int group = strtoul(&cp[tagStart], NULL, 16);
unsigned int element = strtoul(&cp[tagStart+commaPos+1], NULL, 16);
if (group < 0xFFFF && element < 0xFFFF)
- {
+ {
tag = vtkDICOMTag(group, element);
- }
}
}
+ }
else
- {
+ {
std::string key(&cp[tagStart], tagEnd - tagStart);
vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(
key.c_str(), creator.c_str());
if (de.IsValid())
- {
+ {
tag = de.GetTag();
- }
+ }
else
- {
+ {
fprintf(stderr, "Error: Unrecognized key %s\n", key.c_str());
tagError = true;
continue;
- }
}
+ }
// if creator, then resolve the tag now
if (creator.length() > 0)
- {
+ {
if (tagDepth == 0)
- {
+ {
tag = query->ResolvePrivateTagForWriting(tag, creator);
- }
+ }
else
- {
+ {
vtkDICOMSequence seq = query->GetAttributeValue(tagPath);
vtkDICOMItem item = seq.GetItem(0);
tag = item.ResolvePrivateTagForWriting(tag, creator);
vtkDICOMTag ctag(tag.GetGroup(), tag.GetElement() >> 8);
vtkDICOMTagPath ctagPath = path_append(tagPath, ctag);
query->SetAttributeValue(ctagPath, creator);
- }
}
+ }
// build the tag path
tagPath = path_append(tagPath, tag);
if (s < n && (cp[s] == '/' || cp[s] == '\\'))
- {
+ {
// create an item for the next level of depth
if (!query->GetAttributeValue(tagPath).IsValid())
- {
+ {
query->SetAttributeValue(tagPath, vtkDICOMSequence(1));
- }
+ }
s++;
tagDepth++;
- }
+ }
else
- {
+ {
break;
- }
}
+ }
// if an error occurred while reading tag, skip to next line
if (tagError || tagDepth > 2)
- {
+ {
return false;
- }
+ }
// read the DICOM vr
vtkDICOMVR vr;
@@ -236,164 +249,173 @@ bool dicomcli_readkey_query(
size_t vrStart = s;
size_t vrEnd = s;
if (s < n && cp[s] == ':')
- {
+ {
s++;
vrStart = s;
vrEnd = s;
if (n - s >= 2)
- {
+ {
s += 2;
vrEnd = s;
vr = vtkDICOMVR(&cp[vrStart]);
if (!vr.IsValid() || vr == VR::OX || vr == VR::XS || vr == VR::UN)
- {
+ {
int m = static_cast<int>(vrEnd - lineStart);
m = (m > 40 ? 40 : m);
fprintf(stderr, "Error: Unrecognized DICOM VR \"%*.*s\"\n",
m, m, &cp[lineStart]);
return false;
- }
}
}
+ }
// dig down into the tag path
const vtkDICOMItem *pitem = query;
vtkDICOMTag tag = tagPath.GetHead();
vtkDICOMTagPath tmpPath = tagPath;
while (tmpPath.HasTail())
- {
+ {
pitem = pitem->GetAttributeValue(tag).GetSequenceData();
tmpPath = tmpPath.GetTail();
tag = tmpPath.GetHead();
- }
+ }
// validate the tag and the vr against the dictionary
vtkDICOMVR dictvr = pitem->FindDictVR(tag);
// the above method returns UN for OX and XS if it cannot resolve them
if (dictvr == VR::UN)
- {
+ {
// try again, taking a more direct approach
vtkDICOMDictEntry e = pitem->FindDictEntry(tag);
if (e.IsValid())
- {
+ {
dictvr = e.GetVR();
- }
}
+ }
if (!vr.IsValid())
- {
+ {
vr = dictvr;
- }
+ }
else if (dictvr.IsValid() && dictvr != VR::UN)
- {
+ {
if (vr != dictvr &&
!(((dictvr == VR::OX && (vr == VR::OW || vr == VR::OB))) ||
((dictvr == VR::XS && (vr == VR::SS || vr == VR::US)))))
- {
+ {
int m = static_cast<int>(vrEnd - lineStart);
m = (m > 40 ? 40 : m);
fprintf(stderr, "Error: VR of \"%*.*s\" doesn't match dict VR of %s\n",
m, m, &cp[lineStart], dictvr.GetText());
- }
}
+ }
if (!vr.IsValid() || vr == VR::UN)
- {
+ {
int m = static_cast<int>(s - lineStart);
m = (m > 40 ? 40 : m);
fprintf(stderr, "Error: Unrecognized DICOM tag \"%*.*s\"\n",
m, m, &cp[lineStart]);
return false;
- }
+ }
// check for a value or pattern following "="
size_t valueStart = s;
size_t valueEnd = s;
bool valueContainsQuotes = false;
+ bool keyHasAssignment = false;
if (s < n && cp[s] == '=')
- {
+ {
+ keyHasAssignment = true;
s++;
valueStart = s;
valueEnd = s;
if (s < n && qfile && cp[s] == '\"')
- {
+ {
char delim = cp[s++];
valueStart = s;
while (s < n)
- {
+ {
if (cp[s] == delim)
- {
+ {
// a repeated quote becomes a literal quote
if (s+1 < n && cp[s+1] == delim)
- {
+ {
valueContainsQuotes = true;
s++;
- }
+ }
else
- {
+ {
break;
- }
}
- s++;
}
+ s++;
+ }
valueEnd = s;
if (s < n)
- {
+ {
s++;
- }
}
+ }
else
- {
+ {
while (s < n && (!qfile || !isspace(cp[s])))
- {
+ {
s++;
- }
- valueEnd = s;
}
+ valueEnd = s;
}
+ }
else if (s < n && (!qfile || !isspace(cp[s])))
- {
+ {
if (isgraph(cp[s]))
- {
+ {
fprintf(stderr, "Error: Illegal character \"%c\" after tag.\n", cp[s]);
- }
+ }
else
- {
+ {
fprintf(stderr, "Error: Illegal character after tag.\n");
- }
- return false;
}
+ return false;
+ }
// add the tag and value to the query data set
if (valueStart == valueEnd)
+ {
+ // only overwrite previous value if '=' was explicitly used
+ if (keyHasAssignment || !query->GetAttributeValue(tagPath).IsValid())
{
- // empty value (always matches, always retrieved)
- query->SetAttributeValue(tagPath, vtkDICOMValue(vr));
+ // empty value (always matches, always retrieved)
+ query->SetAttributeValue(tagPath, vtkDICOMValue(vr));
}
+ }
else if (valueContainsQuotes)
- {
+ {
// convert "" to ", which is the rule for csv files
std::string sval;
for (size_t t = valueStart; t < valueEnd; t++)
- {
+ {
sval.push_back(cp[t]);
if (cp[t] == '\"' && t+1 < valueEnd && cp[t+1] == '\"')
- {
+ {
t++;
- }
}
- query->SetAttributeValue(tagPath, vtkDICOMValue(vr, sval));
}
+ query->SetAttributeValue(tagPath, vtkDICOMValue(vr, sval));
+ }
else
- {
+ {
query->SetAttributeValue(tagPath,
vtkDICOMValue(vr, &cp[valueStart], valueEnd - valueStart));
- }
+ }
- // add the tag path to the list
+ // add the tag path to the list, if it isn't already there
if (ql)
+ {
+ if (std::find(ql->begin(), ql->end(), tagPath) == ql->end())
{
- ql->push_back(tagPath);
+ ql->push_back(tagPath);
}
+ }
return !tagError;
}
@@ -411,70 +433,164 @@ bool dicomcli_looks_like_key(const char *cp)
// Look for private dictionary specifier in square brackets
if (*cp == '[')
- {
+ {
while (cp[l] != ']' && cp[l] != '\0')
- {
+ {
l++;
- }
+ }
if (cp[l] == ']')
- {
+ {
l++;
s = l;
- }
+ }
else
- {
+ {
return false;
- }
}
+ }
// Look for hexadecimal tag
bool istag = true;
size_t commas = 0;
size_t digitrun = 0;
while (cp[l] != '\0' && cp[l] != ':' && cp[l] != '=')
- {
+ {
if (cp[l] == ',')
- {
+ {
commas++;
if (digitrun > 4)
- {
+ {
istag = false;
- }
- digitrun = 0;
}
+ digitrun = 0;
+ }
else if (isxdigit(cp[l]))
- {
+ {
digitrun++;
- }
+ }
else
- {
+ {
istag = false;
- }
- l++;
}
+ l++;
+ }
if (istag && digitrun > 0 &&
((commas == 0 && digitrun <= 8) ||
(commas == 1 && digitrun <= 4)))
- {
+ {
return true;
- }
+ }
// Look for dictionary key
if (l != s)
- {
+ {
std::string key(&cp[s], l - s);
std::string creator;
if (s > 0)
- {
+ {
creator = std::string(&cp[1], s-2);
- }
+ }
vtkDICOMDictEntry de =
vtkDICOMDictionary::FindDictEntry(key.c_str(), creator.c_str());
if (de.IsValid())
- {
+ {
return true;
- }
}
+ }
return false;
}
+
+bool dicomcli_readuids(
+ const char *fname, vtkDICOMItem *query, QueryTagList *ql)
+{
+#ifdef _WIN32
+ int cn = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0);
+ wchar_t *wfname = new wchar_t[cn];
+ MultiByteToWideChar(CP_UTF8, 0, fname, -1, wfname, cn);
+ ifstream f(wfname);
+ delete [] wfname;
+#else
+ ifstream f(fname);
+#endif
+ if (!f.good())
+ {
+ return false;
+ }
+
+ // Basic file structure:
+ // # one or more comments
+ // GGGG,EEEE # a tag or key (only one)
+ // 1.185.234 # a UID, followed by more UIDs
+
+ QueryTagList ql2;
+ std::string val;
+ int lineNumber = 0;
+ while (f.good())
+ {
+ std::string line;
+ std::getline(f, line);
+ const char *cp = line.c_str();
+ size_t n = line.size();
+ lineNumber++;
+
+ // strip leading whitespace
+ size_t s = 0;
+ while (s < n && isspace(cp[s]))
+ {
+ s++;
+ }
+
+ // skip trailing whitespace
+ if (n > s && isspace(cp[n-1]))
+ {
+ --n;
+ }
+
+ // skip line if it is a comment
+ if (s == n || cp[s] == '#')
+ {
+ continue;
+ }
+
+ if (ql2.size() == 0)
+ {
+ // get the tag line, if not gotten yet
+ if (!dicomcli_readkey_query(cp, query, &ql2, true))
+ {
+ fprintf(stderr, "Error %s line %d: ", fname, lineNumber);
+ fprintf(stderr, "Need Valid DICOM tag at top of file.\n");
+ return false;
+ }
+ }
+ else
+ {
+ // read and append a value
+ if (val.length() > 0)
+ {
+ val.append("\\", 1);
+ }
+ val.append(&cp[s], n-s);
+ if (val.length() >= 65535)
+ {
+ fprintf(stderr, "Error %s line %d: ", fname, lineNumber);
+ fprintf(stderr, "Too many values (there is a 65535 byte limit)\n");
+ return false;
+ }
+ }
+ }
+
+ if (ql2.size() > 0)
+ {
+ // add the key and value to the query
+ vtkDICOMTagPath tagPath = ql2[0];
+ query->SetAttributeValue(tagPath, val);
+
+ if (ql && std::find(ql->begin(), ql->end(), tagPath) == ql->end())
+ {
+ ql->push_back(tagPath);
+ }
+ }
+
+ return true;
+}
diff --git a/DicomCli/readquery.h b/DicomCli/readquery.h
index b8e6d70..7ad2419 100644
--- a/DicomCli/readquery.h
+++ b/DicomCli/readquery.h
@@ -39,4 +39,13 @@ bool dicomcli_readkey(
//! Check if text looks like a query key (for error checking).
bool dicomcli_looks_like_key(const char *key);
+//! Read a UID file, return 'true' on success.
+/*!
+ * The first line of the file must contain a valid key, for example
+ * SeriesInstanceUID, and the remainder of the file should contain
+ * values, one value per line, without quotes.
+ */
+bool dicomcli_readuids(
+ const char *fname, vtkDICOMItem *query, QueryTagList *ql=0);
+
#endif /* readquery_h */
diff --git a/DicomCli/vtkConsoleOutputWindow.cxx b/DicomCli/vtkConsoleOutputWindow.cxx
new file mode 100644
index 0000000..f74351c
--- /dev/null
+++ b/DicomCli/vtkConsoleOutputWindow.cxx
@@ -0,0 +1,53 @@
+/*=========================================================================
+
+ Program: Visualization Toolkit
+ Module: vtkConsoleOutputWindow.cxx
+
+ Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+ All rights reserved.
+ See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkConsoleOutputWindow.h"
+
+vtkConsoleOutputWindow *vtkConsoleOutputWindow::New()
+{
+ return new vtkConsoleOutputWindow;
+}
+
+vtkConsoleOutputWindow::vtkConsoleOutputWindow()
+{
+}
+
+vtkConsoleOutputWindow::~vtkConsoleOutputWindow()
+{
+}
+
+void vtkConsoleOutputWindow::Initialize()
+{
+}
+
+void vtkConsoleOutputWindow::Install()
+{
+ vtkConsoleOutputWindow *win = vtkConsoleOutputWindow::New();
+ vtkOutputWindow::SetInstance(win);
+ win->Delete();
+}
+
+void vtkConsoleOutputWindow::DisplayText(const char* text)
+{
+ if (text)
+ {
+ fwrite(text, 1, strlen(text), stderr);
+ fputc('\n', stderr);
+ }
+}
+
+void vtkConsoleOutputWindow::PrintSelf(ostream& os, vtkIndent indent)
+{
+ this->Superclass::PrintSelf(os, indent);
+}
diff --git a/DicomCli/vtkConsoleOutputWindow.h b/DicomCli/vtkConsoleOutputWindow.h
new file mode 100644
index 0000000..2259284
--- /dev/null
+++ b/DicomCli/vtkConsoleOutputWindow.h
@@ -0,0 +1,45 @@
+/*=========================================================================
+
+ Program: Visualization Toolkit
+ Module: vtkConsoleOutputWindow.h
+
+ Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+ All rights reserved.
+ See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME vtkConsoleOutputWindow - Output errors to the console.
+// .SECTION Description
+// Writes debug/warning/error output to the console, even on Windows.
+// To use this class, instantiate it and then call SetInstance(this).
+//
+
+#ifndef vtkConsoleOutputWindow_h
+#define vtkConsoleOutputWindow_h
+
+#include "vtkOutputWindow.h"
+
+class vtkConsoleOutputWindow : public vtkOutputWindow
+{
+public:
+ vtkTypeMacro(vtkConsoleOutputWindow, vtkOutputWindow);
+ static vtkConsoleOutputWindow* New();
+ virtual void PrintSelf(ostream& os, vtkIndent indent);
+ virtual void DisplayText(const char*);
+ static void Install();
+
+protected:
+ vtkConsoleOutputWindow();
+ virtual ~vtkConsoleOutputWindow();
+ void Initialize();
+
+private:
+ vtkConsoleOutputWindow(const vtkConsoleOutputWindow&); // Not implemented.
+ void operator=(const vtkConsoleOutputWindow&); // Not implemented.
+};
+
+#endif
diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt
index 9f62647..f4a0ab8 100644
--- a/Examples/CMakeLists.txt
+++ b/Examples/CMakeLists.txt
@@ -16,9 +16,6 @@ else()
endif()
set(BASE_LIBS vtkDICOM ${VTK_LIBS})
-if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- set(BASE_LIBS ${BASE_LIBS} ${DCMTK_charls_LIBRARY})
-endif()
add_executable(TestDICOMCompiler TestDICOMCompiler.cxx)
target_link_libraries(TestDICOMCompiler ${BASE_LIBS} ${KWSYS_LIBS})
diff --git a/Examples/TestDICOMCompiler.cxx b/Examples/TestDICOMCompiler.cxx
index 2554efd..1c24ed4 100644
--- a/Examples/TestDICOMCompiler.cxx
+++ b/Examples/TestDICOMCompiler.cxx
@@ -27,6 +27,12 @@
#include <string.h>
#include <stdlib.h>
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#define GetTupleValue GetTypedTuple
+#endif
+
// remove path portion of filename
const char *fileBasename(const char *filename)
{
@@ -42,18 +48,18 @@ int main(int argc, char *argv[])
int rval = 0;
if (argc < 2)
- {
+ {
printf("usage: %s file1.dcm [file2.dcm ...]\n", fileBasename(argv[0]));
return rval;
- }
+ }
vtkSmartPointer<vtkStringArray> files =
vtkSmartPointer<vtkStringArray>::New();
for (int argi = 1; argi < argc; argi++)
- {
+ {
files->InsertNextValue(argv[argi]);
- }
+ }
const char *outfile = "/tmp/%s";
@@ -78,11 +84,11 @@ int main(int argc, char *argv[])
int m = sorter->GetNumberOfStudies();
for (int j = 0; j < m; j++)
- {
+ {
int k = sorter->GetFirstSeriesForStudy(j);
int kl = sorter->GetLastSeriesForStudy(j);
for (; k <= kl; k++)
- {
+ {
vtkStringArray *a = sorter->GetFileNamesForSeries(k);
int l = static_cast<int>(a->GetNumberOfValues());
std::string fname = a->GetValue(0);
@@ -96,7 +102,7 @@ int main(int argc, char *argv[])
offsetArray->SetNumberOfTuples(l);
for (int i = 0; i < l; i++)
- {
+ {
// read the DICOM series with the parser
fname = a->GetValue(i);
parser->SetIndex(i);
@@ -107,10 +113,10 @@ int main(int argc, char *argv[])
tp[0] = parser->GetFileOffset();
tp[1] = parser->GetFileSize();
offsetArray->SetTupleValue(i, tp);
- }
+ }
for (int i = 0; i < l; i++)
- {
+ {
// write the DICOM series with the compiler
fname = a->GetValue(i);
char outpath[128];
@@ -119,10 +125,10 @@ int main(int argc, char *argv[])
const char *instanceUID = data->GetAttributeValue(
i, DC::SOPInstanceUID).GetCharData();
if (instanceUID == 0)
- {
+ {
instanceUID = data->GetAttributeValue(
i, DC::MediaStorageSOPInstanceUID).GetCharData();
- }
+ }
compiler->SetSOPInstanceUID(instanceUID);
compiler->SetTransferSyntaxUID(data->GetAttributeValue(
i, DC::TransferSyntaxUID).GetCharData());
@@ -138,7 +144,7 @@ int main(int argc, char *argv[])
compiler->WriteHeader();
if (parser->GetPixelDataFound())
- {
+ {
vtkTypeInt64 tp[2];
offsetArray->GetTupleValue(i, tp);
@@ -154,50 +160,50 @@ int main(int argc, char *argv[])
compiler->WritePixelData(
reinterpret_cast<unsigned char *>(buffer), size - offset);
delete [] buffer;
- }
+ }
compiler->Close();
// compare the md5 hash
char hash[2][40];
for (int jj = 0; jj < 2; jj++)
- {
+ {
const char *fileToHash = outpath;
if (jj == 0)
- {
+ {
fileToHash = fname.c_str();
- }
+ }
vtksysMD5* hasher = vtksysMD5_New();
vtksysMD5_Initialize(hasher);
char hashbuf[8192];
std::ifstream f(fileToHash, ios::in | ios::binary);
while (f.good())
- {
+ {
f.read(hashbuf, static_cast<std::streamsize>(sizeof(hashbuf)));
std::streamsize c = f.gcount();
vtksysMD5_Append(
hasher, reinterpret_cast<unsigned char *>(hashbuf), c);
- }
+ }
vtksysMD5_FinalizeHex(hasher, hash[jj]);
hash[jj][32] = '\0';
vtksysMD5_Delete(hasher);
- }
+ }
if (strncmp(hash[0], hash[1], 32) != 0)
- {
+ {
std::cerr << "Hash mismatch!\n";
std::cerr << hash[0] << " " << fname.c_str() << "\n";
std::cerr << hash[1] << " " << outpath << "\n";
- }
+ }
else
- {
+ {
std::cerr << "Matched for " << fname.c_str() << "\n";
- }
}
}
}
+ }
return rval;
}
diff --git a/Examples/TestDICOMDirectory.cxx b/Examples/TestDICOMDirectory.cxx
index f4c3293..d2ced52 100644
--- a/Examples/TestDICOMDirectory.cxx
+++ b/Examples/TestDICOMDirectory.cxx
@@ -36,18 +36,18 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkDICOMDirectory>::New();
if (argc < 2 || argc > 3)
- {
+ {
cout << "usage: " << exename << " <directory_name> [depth]" << endl;
exit(0);
- }
+ }
const char *dirname = argv[1];
int depth = 1;
if (argc > 2)
- {
+ {
depth = static_cast<int>(atol(argv[2]));
- }
+ }
ddir->SetDirectoryName(dirname);
ddir->SetScanDepth(depth);
@@ -55,18 +55,18 @@ int main(int argc, char *argv[])
int n = ddir->GetNumberOfPatients();
for (int i = 0; i < n; i++)
- {
+ {
const vtkDICOMItem& patientItem = ddir->GetPatientRecord(i);
cout << "Patient " << i << ": "
<< patientItem.GetAttributeValue(DC::PatientID).AsString() << "\n";
vtkIntArray *studies = ddir->GetStudiesForPatient(i);
vtkIdType m = studies->GetMaxId() + 1;
if (i == n-1 && m > 0)
- {
+ {
TestAssert(studies->GetValue(m-1) == ddir->GetNumberOfStudies() - 1);
- }
+ }
for (vtkIdType jj = 0; jj < m; jj++)
- {
+ {
int j = studies->GetValue(jj);
const vtkDICOMItem& studyItem = ddir->GetStudyRecord(j);
const vtkDICOMItem& studyPItem = ddir->GetPatientRecordForStudy(j);
@@ -79,11 +79,11 @@ int main(int argc, char *argv[])
int k0 = ddir->GetFirstSeriesForStudy(j);
int k1 = ddir->GetLastSeriesForStudy(j);
if (i == n-1 && jj == m-1)
- {
+ {
TestAssert(k1 == ddir->GetNumberOfSeries() - 1);
- }
+ }
for (int k = k0; k <= k1; k++)
- {
+ {
const vtkDICOMItem& seriesItem = ddir->GetSeriesRecord(k);
cout << " Series " << k << ": \""
<< seriesItem.GetAttributeValue(DC::SeriesDescription).AsString()
@@ -93,12 +93,12 @@ int main(int argc, char *argv[])
<< seriesItem.GetAttributeValue(DC::Modality).AsString() << "\n";
vtkStringArray *a = ddir->GetFileNamesForSeries(k);
for (vtkIdType kk = 0; kk < a->GetNumberOfValues(); kk++)
- {
+ {
cout << " " << a->GetValue(kk) << "\n";
- }
}
}
}
+ }
return rval;
}
diff --git a/Examples/TestDICOMDisplay.cxx b/Examples/TestDICOMDisplay.cxx
index 3cb1a72..cbc58ec 100644
--- a/Examples/TestDICOMDisplay.cxx
+++ b/Examples/TestDICOMDisplay.cxx
@@ -42,19 +42,19 @@ int main(int argc, char *argv[])
const char *stackID = 0;
for (int i = 1; i < argc; i++)
- {
+ {
if (strcmp(argv[i], "--stack") == 0)
- {
+ {
if (i+1 < argc)
- {
+ {
stackID = argv[++i];
- }
}
+ }
else
- {
+ {
files->InsertNextValue(argv[i]);
- }
}
+ }
// find all DICOM files supplied by the user
vtkSmartPointer<vtkDICOMDirectory> sorter =
@@ -69,19 +69,19 @@ int main(int argc, char *argv[])
int seriesIdx = 0;
int kmax = 0;
for (int i = 0; i < m; i++)
- {
+ {
int fj = sorter->GetFirstSeriesForStudy(i);
int lj = sorter->GetLastSeriesForStudy(i);
for (int j = fj; j <= lj; j++)
- {
+ {
int k = sorter->GetFileNamesForSeries(j)->GetNumberOfValues();
if (k > kmax)
- {
+ {
kmax = k;
seriesIdx = j;
- }
}
}
+ }
// display the longest series
vtkStringArray *a = sorter->GetFileNamesForSeries(seriesIdx);
@@ -93,9 +93,9 @@ int main(int argc, char *argv[])
//reader->TimeAsVectorOn();
//reader->SetDesiredTimeIndex(5);
if (stackID)
- {
+ {
reader->SetDesiredStackID(stackID);
- }
+ }
reader->SetFileNames(a);
double range[2];
@@ -103,9 +103,9 @@ int main(int argc, char *argv[])
reader->Update();
if (reader->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
return 1;
- }
+ }
reader->GetOutput()->GetScalarRange(range);
reader->GetOutput()->GetExtent(extent);
@@ -137,13 +137,13 @@ int main(int argc, char *argv[])
bool imageIs3D = (extent[5] > extent[4]);
for (int i = 2*(imageIs3D == 0); i < 3; i++)
- {
+ {
vtkSmartPointer<vtkImageResliceMapper> imageMapper =
vtkSmartPointer<vtkImageResliceMapper>::New();
if (i < 3)
- {
+ {
imageMapper->SetInputConnection(portToDisplay);
- }
+ }
imageMapper->SliceFacesCameraOn();
imageMapper->SliceAtFocalPointOn();
imageMapper->ResampleToScreenPixelsOn();
@@ -161,9 +161,9 @@ int main(int argc, char *argv[])
renderer->AddViewProp(image);
renderer->SetBackground(0.0, 0.0, 0.0);
if (imageIs3D)
- {
+ {
renderer->SetViewport(viewport[i]);
- }
+ }
renWin->AddRenderer(renderer);
@@ -175,58 +175,58 @@ int main(int argc, char *argv[])
point[2] = 0.5*(bounds[4] + bounds[5]);
double maxdim = 0.0;
for (int j = 0; j < 3; j++)
- {
+ {
double s = 0.5*(bounds[2*j+1] - bounds[2*j]);
maxdim = (s > maxdim ? s : maxdim);
- }
+ }
vtkCamera *camera = renderer->GetActiveCamera();
camera->SetFocalPoint(point);
point[i % 3] -= 500.0;
camera->SetPosition(point);
if ((i % 3) == 2)
- {
+ {
camera->SetViewUp(0.0, -1.0, 0.0);
- }
+ }
else
- {
+ {
camera->SetViewUp(0.0, 0.0, +1.0);
- }
+ }
camera->ParallelProjectionOn();
camera->SetParallelScale(maxdim);
- }
+ }
if (imageIs3D)
- {
+ {
renWin->SetSize(600, 400);
- }
+ }
else
- {
+ {
renWin->SetSize(400, 400);
- }
+ }
renWin->Render();
vtkStringArray *sarray = reader->GetStackIDs();
if (sarray->GetNumberOfValues())
- {
+ {
cout << "StackIDs (choose one with --stack):";
for (vtkIdType ii = 0; ii < sarray->GetNumberOfValues(); ii++)
- {
+ {
cout << " \"" << sarray->GetValue(ii) << "\"";
- }
- cout << "\n";
}
+ cout << "\n";
+ }
if (reader->GetTimeDimension() > 1)
- {
+ {
cout << "TimeDimension: " << reader->GetTimeDimension() << "\n";
cout << "TimeSpacing: " << reader->GetTimeSpacing() << "\n";
- }
+ }
if (reader->GetFileIndexArray()->GetNumberOfComponents() > 1)
- {
+ {
cout << "VectorDimension: "
<< reader->GetFileIndexArray()->GetNumberOfComponents() << "\n";
- }
+ }
iren->Start();
diff --git a/Examples/TestDICOMFileSorter.cxx b/Examples/TestDICOMFileSorter.cxx
index e290872..9d4cd8b 100644
--- a/Examples/TestDICOMFileSorter.cxx
+++ b/Examples/TestDICOMFileSorter.cxx
@@ -36,29 +36,29 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkStringArray>::New();
for (int i = 1; i < argc; i++)
- {
+ {
files->InsertNextValue(argv[i]);
- }
+ }
sorter->SetInputFileNames(files);
sorter->Update();
int m = sorter->GetNumberOfStudies();
for (int j = 0; j < m; j++)
- {
+ {
cout << "Study " << j << ":\n";
int k = sorter->GetFirstSeriesForStudy(j);
int kl = sorter->GetLastSeriesForStudy(j);
for (; k <= kl; k++)
- {
+ {
cout << " Series " << k << ":\n";
vtkStringArray *a = sorter->GetFileNamesForSeries(k);
for (vtkIdType kk = 0; kk < a->GetNumberOfValues(); kk++)
- {
+ {
cout << " " << a->GetValue(kk) << "\n";
- }
}
}
+ }
return rval;
}
diff --git a/Examples/TestDICOMParser.cxx b/Examples/TestDICOMParser.cxx
index 1bcc00c..8561993 100644
--- a/Examples/TestDICOMParser.cxx
+++ b/Examples/TestDICOMParser.cxx
@@ -31,7 +31,7 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkDICOMParser>::New();
for (int i = 1; i < argc; i++)
- {
+ {
cout << "=========== " << argv[i] << " =========\n";
vtkSmartPointer<vtkDICOMMetaData> data =
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
parser->SetMetaData(data);
parser->Update();
- }
+ }
return rval;
}
diff --git a/Examples/TestDICOMReader.cxx b/Examples/TestDICOMReader.cxx
index bcff48e..589beae 100644
--- a/Examples/TestDICOMReader.cxx
+++ b/Examples/TestDICOMReader.cxx
@@ -37,29 +37,29 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkStringArray>::New();
for (int i = 1; i < argc; i++)
- {
+ {
files->InsertNextValue(argv[i]);
- }
+ }
sorter->SetInputFileNames(files);
sorter->Update();
int m = sorter->GetNumberOfStudies();
for (int j = 0; j < m; j++)
- {
+ {
cout << "Study" << j << ":\n";
int k = sorter->GetFirstSeriesForStudy(j);
int kl = sorter->GetLastSeriesForStudy(j);
for (; k <= kl; k++)
- {
+ {
cout << " Series " << k << ":\n";
vtkStringArray *a = sorter->GetFileNamesForSeries(k);
vtkDICOMReader *reader = vtkDICOMReader::New();
reader->SetFileNames(a);
reader->Update();
reader->Delete();
- }
}
+ }
return rval;
}
diff --git a/Examples/TestDICOMRealWorldValue.cxx b/Examples/TestDICOMRealWorldValue.cxx
index 7fceca3..e8ca39c 100644
--- a/Examples/TestDICOMRealWorldValue.cxx
+++ b/Examples/TestDICOMRealWorldValue.cxx
@@ -41,9 +41,9 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkStringArray>::New();
for (int i = 1; i < argc; i++)
- {
+ {
files->InsertNextValue(argv[i]);
- }
+ }
sorter->SetInputFileNames(files);
sorter->Update();
@@ -52,7 +52,7 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkDICOMMetaData>::New();
if (sorter->GetNumberOfSeries() > 0)
- {
+ {
// read the meta data from the supplied image
vtkStringArray *a = sorter->GetFileNamesForSeries(0);
@@ -62,9 +62,9 @@ int main(int argc, char *argv[])
reader->UpdateInformation();
meta = reader->GetMetaData();
- }
+ }
else if (argc == 1)
- {
+ {
// create a real world value mapping sequence by hand
// 1) use Unified Code for Units of Measure (UCUM), version 1.9
// 2) the CodeMeaning should be a copy of CodeValue unless:
@@ -91,14 +91,14 @@ int main(int argc, char *argv[])
meta->SetAttributeValue(DC::RealWorldValueMappingSequence,
vtkDICOMValue(vtkDICOMVR::SQ, mappingItem));
- }
+ }
else
- {
+ {
cout << "The provided file is not DICOM!" << endl;
- }
+ }
if (meta->HasAttribute(DC::RealWorldValueMappingSequence))
- {
+ {
const vtkDICOMItem& mappingItem =
meta->GetAttributeValue(DC::RealWorldValueMappingSequence).GetItem(0);
@@ -125,19 +125,19 @@ int main(int argc, char *argv[])
cout << "and display the result with color table " << lutName << endl;
if (argc == 1)
- {
+ {
TestAssert(range[0] == 0);
TestAssert(range[1] == 4095);
TestAssert(fabs(slope - 0.438) < 1e-16);
TestAssert(fabs(inter - 0.234) < 1e-16);
TestAssert(units == "m2/s");
TestAssert(lutName == "HOT_METAL");
- }
}
+ }
else
- {
+ {
cout << "Image has no real world value mapping!" << endl;
- }
+ }
return rval;
}
diff --git a/Examples/TestDICOMWriter.cxx b/Examples/TestDICOMWriter.cxx
index 827e963..727b131 100644
--- a/Examples/TestDICOMWriter.cxx
+++ b/Examples/TestDICOMWriter.cxx
@@ -43,21 +43,21 @@ int main(int argc, char *argv[])
vtkSmartPointer<vtkStringArray>::New();
for (int i = 1; i < argc; i++)
- {
+ {
files->InsertNextValue(argv[i]);
- }
+ }
sorter->SetInputFileNames(files);
sorter->Update();
int m = sorter->GetNumberOfStudies();
for (int j = 0; j < m; j++)
- {
+ {
cout << "Study" << j << ":\n";
int k = sorter->GetFirstSeriesForStudy(j);
int kl = sorter->GetLastSeriesForStudy(j);
for (; k <= kl; k++)
- {
+ {
cout << " Series " << k << ":\n";
vtkStringArray *a = sorter->GetFileNamesForSeries(k);
@@ -81,8 +81,8 @@ int main(int argc, char *argv[])
writer->SetFilePrefix("/tmp");
writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
writer->Write();
- }
}
+ }
return rval;
}
diff --git a/Examples/TestNIFTIDisplay.cxx b/Examples/TestNIFTIDisplay.cxx
index bdc049d..92730f0 100644
--- a/Examples/TestNIFTIDisplay.cxx
+++ b/Examples/TestNIFTIDisplay.cxx
@@ -32,9 +32,9 @@ int main(int argc, char *argv[])
const char *filename = 0;
if (argc > 1)
- {
+ {
filename = argv[1];
- }
+ }
vtkSmartPointer<vtkNIFTIReader> reader =
vtkSmartPointer<vtkNIFTIReader>::New();
@@ -42,22 +42,22 @@ int main(int argc, char *argv[])
reader->Update();
if (reader->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
return 1;
- }
+ }
vtkSmartPointer<vtkMatrix4x4> matrix =
vtkSmartPointer<vtkMatrix4x4>::New();
if (reader->GetQFormMatrix())
- {
+ {
matrix->DeepCopy(reader->GetQFormMatrix());
matrix->Invert();
- }
+ }
else if (reader->GetSFormMatrix())
- {
+ {
matrix->DeepCopy(reader->GetSFormMatrix());
matrix->Invert();
- }
+ }
vtkSmartPointer<vtkImageReslice> reslice =
vtkSmartPointer<vtkImageReslice>::New();
@@ -81,13 +81,13 @@ int main(int argc, char *argv[])
bool imageIs3D = (extent[5] > extent[4]);
for (int i = 2*(imageIs3D == 0); i < 3; i++)
- {
+ {
vtkSmartPointer<vtkImageSliceMapper> imageMapper =
vtkSmartPointer<vtkImageSliceMapper>::New();
if (i < 3)
- {
+ {
imageMapper->SetInputConnection(reslice->GetOutputPort());
- }
+ }
imageMapper->SetOrientation(i % 3);
imageMapper->SliceAtFocalPointOn();
@@ -104,9 +104,9 @@ int main(int argc, char *argv[])
renderer->AddViewProp(image);
renderer->SetBackground(0.0, 0.0, 0.0);
if (imageIs3D)
- {
+ {
renderer->SetViewport(viewport[i]);
- }
+ }
renWin->AddRenderer(renderer);
@@ -118,36 +118,36 @@ int main(int argc, char *argv[])
point[2] = 0.5*(bounds[4] + bounds[5]);
double maxdim = 0.0;
for (int j = 0; j < 3; j++)
- {
+ {
double s = 0.5*(bounds[2*j+1] - bounds[2*j]);
maxdim = (s > maxdim ? s : maxdim);
- }
+ }
vtkCamera *camera = renderer->GetActiveCamera();
camera->SetFocalPoint(point);
if (imageMapper->GetOrientation() == 2)
- {
+ {
point[imageMapper->GetOrientation()] -= 500.0;
camera->SetViewUp(0.0, +1.0, 0.0);
- }
+ }
else
- {
+ {
point[imageMapper->GetOrientation()] += 500.0;
camera->SetViewUp(0.0, 0.0, +1.0);
- }
+ }
camera->SetPosition(point);
camera->ParallelProjectionOn();
camera->SetParallelScale(maxdim);
- }
+ }
if (imageIs3D)
- {
+ {
renWin->SetSize(600, 400);
- }
+ }
else
- {
+ {
renWin->SetSize(400, 400);
- }
+ }
renWin->Render();
iren->Start();
diff --git a/Examples/TestScancoCTDisplay.cxx b/Examples/TestScancoCTDisplay.cxx
index 13b1e98..66c953a 100644
--- a/Examples/TestScancoCTDisplay.cxx
+++ b/Examples/TestScancoCTDisplay.cxx
@@ -31,9 +31,9 @@ int main(int argc, char *argv[])
const char *filename = 0;
if (argc > 1)
- {
+ {
filename = argv[1];
- }
+ }
vtkSmartPointer<vtkScancoCTReader> reader =
vtkSmartPointer<vtkScancoCTReader>::New();
@@ -41,9 +41,9 @@ int main(int argc, char *argv[])
reader->Update();
if (reader->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
return 1;
- }
+ }
double range[2];
int extent[6];
@@ -60,13 +60,13 @@ int main(int argc, char *argv[])
bool imageIs3D = (extent[5] > extent[4]);
for (int i = 2*(imageIs3D == 0); i < 3; i++)
- {
+ {
vtkSmartPointer<vtkImageSliceMapper> imageMapper =
vtkSmartPointer<vtkImageSliceMapper>::New();
if (i < 3)
- {
+ {
imageMapper->SetInputConnection(reader->GetOutputPort());
- }
+ }
imageMapper->SetOrientation(i % 3);
imageMapper->SliceAtFocalPointOn();
@@ -83,9 +83,9 @@ int main(int argc, char *argv[])
renderer->AddViewProp(image);
renderer->SetBackground(0.0, 0.0, 0.0);
if (imageIs3D)
- {
+ {
renderer->SetViewport(viewport[i]);
- }
+ }
renWin->AddRenderer(renderer);
@@ -97,42 +97,42 @@ int main(int argc, char *argv[])
point[2] = 0.5*(bounds[4] + bounds[5]);
double maxdim = 0.0;
for (int j = 0; j < 3; j++)
- {
+ {
double s = 0.5*(bounds[2*j+1] - bounds[2*j]);
maxdim = (s > maxdim ? s : maxdim);
- }
+ }
vtkCamera *camera = renderer->GetActiveCamera();
camera->SetFocalPoint(point);
if ((i % 3) == 0)
- {
+ {
point[i % 3] -= 500.0;
- }
+ }
else
- {
+ {
point[i % 3] += 500.0;
- }
+ }
camera->SetPosition(point);
if ((i % 3) == 2)
- {
+ {
camera->SetViewUp(0.0, +1.0, 0.0);
- }
+ }
else
- {
+ {
camera->SetViewUp(0.0, 0.0, -1.0);
- }
+ }
camera->ParallelProjectionOn();
camera->SetParallelScale(maxdim);
- }
+ }
if (imageIs3D)
- {
+ {
renWin->SetSize(600, 400);
- }
+ }
else
- {
+ {
renWin->SetSize(400, 400);
- }
+ }
renWin->Render();
iren->Start();
diff --git a/Programs/CMakeLists.txt b/Programs/CMakeLists.txt
index 02eed08..a364f6e 100644
--- a/Programs/CMakeLists.txt
+++ b/Programs/CMakeLists.txt
@@ -24,9 +24,6 @@ else()
endif()
set(BASE_LIBS vtkDICOM ${VTK_LIBS})
-if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- set(BASE_LIBS ${BASE_LIBS} ${DCMTK_charls_LIBRARY})
-endif()
set(CLI_LIBS dicomcli)
diff --git a/Programs/dicomdump.cxx b/Programs/dicomdump.cxx
index 0c648c9..0ceb3a6 100644
--- a/Programs/dicomdump.cxx
+++ b/Programs/dicomdump.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -21,6 +21,7 @@
#include "vtkDICOMUtilities.h"
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
#include "readquery.h"
@@ -32,10 +33,6 @@
#include <string.h>
#include <stdlib.h>
-#if defined(_WIN32)
-#include <windows.h>
-#endif
-
#define MAX_INDENT 24
#define INDENT_SIZE 2
#define MAX_LENGTH 120
@@ -45,7 +42,7 @@ void printVersion(FILE *file, const char *cp)
{
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
}
@@ -99,158 +96,159 @@ void printElement(
const char *name = "";
vtkDICOMDictEntry d;
if (item)
- {
+ {
d = item->FindDictEntry(tag);
- }
+ }
else if (meta)
- {
+ {
d = meta->FindDictEntry(tag);
- }
+ }
if (d.IsValid())
- {
+ {
name = d.GetName();
if (d.GetVR() != vr &&
!(d.GetVR() == vtkDICOMVR::XS &&
(vr == vtkDICOMVR::SS || vr == vtkDICOMVR::US)) &&
!(d.GetVR() == vtkDICOMVR::OX &&
(vr == vtkDICOMVR::OB || vr == vtkDICOMVR::OW)))
- {
+ {
printf("VR mismatch! %s != %s %s\n",
vr.GetText(), d.GetVR().GetText(), name);
- }
}
+ }
else if ((tag.GetGroup() & 0xFFFE) != 0 && tag.GetElement() == 0)
- {
+ {
// group is even, element is zero
name = "GroupLength";
- }
+ }
else if ((tag.GetGroup() & 0x0001) != 0 &&
(tag.GetElement() & 0xFF00) == 0)
- {
+ {
// group is odd, element is a creator element
name = "PrivateCreator";
- }
+ }
// allow multiple values (i.e. for each image in series)
vtkDICOMValue v = iter->GetValue();
- unsigned int vn = v.GetNumberOfValues();
+ size_t vn = v.GetNumberOfValues();
const vtkDICOMValue *vp = v.GetMultiplexData();
if (vp == 0)
- {
+ {
vp = &v;
vn = 1;
- }
+ }
// make an indentation string
if (INDENT_SIZE*depth > MAX_INDENT)
- {
+ {
depth = MAX_INDENT/INDENT_SIZE;
- }
+ }
static const char spaces[MAX_INDENT+1] = " ";
const char *indent = spaces + (MAX_INDENT - INDENT_SIZE*depth);
- for (unsigned int vi = 0; vi < vn; vi++)
- {
+ for (size_t vi = 0; vi < vn; vi++)
+ {
v = vp[vi];
unsigned int vl = v.GetVL();
if (tag == DC::PixelData ||
tag == DC::FloatPixelData ||
tag == DC::DoubleFloatPixelData)
- {
+ {
vl = (depth == 0 && vl == 0 ? pixelDataVL : v.GetVL());
- }
+ }
std::string s;
if (vr == vtkDICOMVR::UN ||
vr == vtkDICOMVR::SQ)
- {
+ {
// sequences are printed later
s = (vl > 0 ? "..." : "");
- }
+ }
else if (vr == vtkDICOMVR::LT ||
vr == vtkDICOMVR::ST ||
vr == vtkDICOMVR::UT)
- {
+ {
// replace breaks with "\\", cap length to MAX_LENGTH
size_t l = (vl > MAX_LENGTH ? MAX_LENGTH-4 : vl);
const char *cp = v.GetCharData();
std::string utf8;
if (v.GetCharacterSet() != vtkDICOMCharacterSet::ISO_IR_6)
- {
+ {
utf8 = v.GetCharacterSet().ConvertToUTF8(cp, l);
l = utf8.length();
cp = utf8.data();
- }
+ }
size_t j = 0;
while (j < l && cp[j] != '\0')
- {
+ {
size_t k = j;
size_t m = j;
for (; j < l && cp[j] != '\0'; j++)
- {
+ {
m = j;
if (cp[j] == '\r' || cp[j] == '\n' || cp[j] == '\f')
- {
+ {
do { j++; }
while (j < l && (cp[j] == '\r' || cp[j] == '\n' || cp[j] == '\f'));
break;
- }
- m++;
}
+ m++;
+ }
if (j == l)
- {
+ {
while (m > 0 && cp[m-1] == ' ') { m--; }
- }
+ }
if (k != 0)
- {
+ {
s.append("\\\\");
- }
+ }
s.append(&cp[k], m-k);
if (vl > MAX_LENGTH)
- {
+ {
s.append("...");
break;
- }
}
}
+ }
else
- {
+ {
// print any other VR via conversion to string
- unsigned int n = v.GetNumberOfValues();
+ size_t n = v.GetNumberOfValues();
size_t pos = 0;
- for (unsigned int i = 0; i < n; i++)
- {
+ for (size_t i = 0; i < n; i++)
+ {
v.AppendValueToUTF8String(s, i);
if (i < n - 1)
- {
+ {
s.append("\\");
- }
+ }
if (s.size() > MAX_LENGTH-4)
- {
+ {
s.resize(pos);
s.append("...");
break;
- }
- pos = s.size();
}
+ pos = s.size();
}
+ }
if (meta && vi == 0)
- {
+ {
printf("%s(%04X,%04X) %s \"%s\" :", indent, g, e, vr.GetText(), name);
- }
+ }
if (meta && vn > 1)
- {
+ {
printf("%s%s %4.4u",
- (vi == 0 ? " (multiple values)\n" : ""), indent, vi + 1);
- }
+ (vi == 0 ? " (multiple values)\n" : ""), indent,
+ static_cast<unsigned int>(vi + 1));
+ }
if (vr == vtkDICOMVR::SQ)
- {
+ {
size_t m = v.GetNumberOfValues();
const vtkDICOMItem *items = v.GetSequenceData();
printf(" (%u %s%s)\n",
static_cast<unsigned int>(m), (m == 1 ? "item" : "items"),
(vl == 0xffffffffu ? ", delimited" : ""));
for (size_t j = 0; j < m; j++)
- {
+ {
printf("%s%s---- SQ Item %04u at offset %u ----\n",
indent, spaces+(MAX_INDENT - INDENT_SIZE),
static_cast<unsigned int>(j+1),
@@ -259,48 +257,48 @@ void printElement(
vtkDICOMDataElementIterator siterEnd = items[j].End();
for (; siter != siterEnd; ++siter)
- {
+ {
printElement(meta, &items[j], siter, depth+1, pixelDataVL);
- }
}
}
+ }
else if (vl == 0xffffffffu)
- {
+ {
if (tag == DC::PixelData ||
tag == DC::FloatPixelData ||
tag == DC::DoubleFloatPixelData)
- {
+ {
printf(" [...] (compressed)\n");
- }
+ }
else
- {
+ {
printf(" [...] (delimited)\n");
- }
}
+ }
else
- {
+ {
const char *uidName = "";
if (vr == vtkDICOMVR::UI)
- {
+ {
uidName = vtkDICOMUtilities::GetUIDName(s.c_str());
- }
+ }
if (uidName[0] != '\0')
- {
+ {
printf(" [%s] {%s} (%u bytes)\n", s.c_str(), uidName, vl);
- }
+ }
else if (vr == vtkDICOMVR::OB ||
vr == vtkDICOMVR::OW ||
vr == vtkDICOMVR::OF ||
vr == vtkDICOMVR::OD)
- {
+ {
printf(" [%s] (%u bytes)\n", (vl == 0 ? "" : "..."), vl);
- }
+ }
else
- {
+ {
printf(" [%s] (%u bytes)\n", s.c_str(), vl);
- }
}
}
+ }
}
void printElementFromTagPathRecurse(
@@ -311,32 +309,32 @@ void printElementFromTagPathRecurse(
vtkDICOMDataElementIterator iter = item->Begin();
while (iter != item->End() && iter->GetTag() != tag)
- {
+ {
++iter;
- }
+ }
if (iter != item->End())
- {
+ {
if (tagPath.HasTail())
- {
+ {
const vtkDICOMItem *items = iter->GetValue().GetSequenceData();
if (items)
- {
+ {
size_t n = iter->GetValue().GetNumberOfValues();
for (size_t i = 0; i < n; i++)
- {
+ {
printElementFromTagPathRecurse(
&items[i], tagPath.GetTail(), fullPath, count);
- }
}
}
+ }
else
- {
+ {
++(*count);
fprintf(stdout, " %04d", *count);
printElement(0, item, iter, 0, 0);
- }
}
+ }
}
void printElementFromTagPath(
@@ -347,19 +345,19 @@ void printElementFromTagPath(
vtkDICOMTag tag = tagPath.GetHead();
vtkDICOMDataElementIterator iter = data->Find(tag);
if (iter != data->End())
- {
+ {
if (tagPath.HasTail())
- {
+ {
for (vtkDICOMTagPath p = tagPath; ; p = p.GetTail())
- {
+ {
int g = p.GetHead().GetGroup();
int e = p.GetHead().GetElement();
if (p.HasTail())
- {
+ {
printf("(%04X,%04X)\\", g, e);
- }
+ }
else
- {
+ {
vtkDICOMDictEntry entry =
vtkDICOMDictionary::FindDictEntry(p.GetHead());
vtkDICOMVR vr = entry.GetVR();
@@ -368,48 +366,51 @@ void printElementFromTagPath(
printf("(%04X,%04X) %s \"%s\" : (nested)\n",
g, e, vr.GetText(), name);
break;
- }
}
+ }
if (iter->IsPerInstance())
- {
+ {
for (int j = 0; j < iter->GetNumberOfInstances(); j++)
- {
+ {
const vtkDICOMItem *items = iter->GetValue(j).GetSequenceData();
if (items)
- {
+ {
size_t n = iter->GetValue().GetNumberOfValues();
for (size_t i = 0; i < n; i++)
- {
+ {
printElementFromTagPathRecurse(
&items[i], tagPath.GetTail(), tagPath, &count);
- }
}
}
}
+ }
else
- {
+ {
const vtkDICOMItem *items = iter->GetValue().GetSequenceData();
if (items)
- {
+ {
size_t n = iter->GetValue().GetNumberOfValues();
for (size_t i = 0; i < n; i++)
- {
+ {
printElementFromTagPathRecurse(
&items[i], tagPath.GetTail(), tagPath, &count);
- }
}
}
}
+ }
else
- {
+ {
printElement(data, 0, iter, 0, pixelDataVL);
- }
}
+ }
}
// This program will dump all the metadata in the given file
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
int rval = 0;
// for the optional query file
@@ -417,77 +418,77 @@ MAINMACRO(argc, argv)
vtkDICOMItem query;
if (argc < 2)
- {
+ {
printUsage(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--help") == 0)
- {
+ {
printHelp(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--version") == 0)
- {
+ {
printVersion(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
vtkSmartPointer<vtkStringArray> files =
vtkSmartPointer<vtkStringArray>::New();
for (int argi = 1; argi < argc; argi++)
- {
+ {
const char *arg = argv[argi];
if (strcmp(arg, "-q") == 0 || strcmp(arg, "-o") == 0)
- {
+ {
if (argi + 1 == argc || argv[argi+1][0] == '-')
- {
+ {
fprintf(stderr, "%s must be followed by a file.\n\n", arg);
printUsage(stderr, fileBasename(argv[0]));
return 1;
- }
+ }
if (arg[1] == 'q')
- {
+ {
const char *qfile = argv[++argi];
if (!dicomcli_readquery(qfile, &query, &qtlist))
- {
+ {
fprintf(stderr, "Can't read query file %s\n\n", qfile);
return 1;
- }
}
+ }
else if (arg[1] == 'o')
- {
+ {
fprintf(stderr, "unrecognized option %s.\n\n", arg);
return 1;
- }
}
+ }
else if (strcmp(arg, "-k") == 0)
- {
+ {
vtkDICOMTag tag;
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "%s must be followed by gggg,eeee=value "
"where gggg,eeee is a DICOM tag.\n\n", arg);
return 1;
- }
+ }
if (!dicomcli_readkey(argv[argi], &query, &qtlist))
- {
+ {
return 1;
- }
}
+ }
else if (arg[0] == '-')
- {
+ {
fprintf(stderr, "unrecognized option %s.\n\n", arg);
printUsage(stderr, fileBasename(argv[0]));
return 1;
- }
+ }
else
- {
+ {
files->InsertNextValue(arg);
- }
}
+ }
// sort the files by study and series
vtkSmartPointer<vtkDICOMDirectory> sorter =
@@ -505,28 +506,22 @@ MAINMACRO(argc, argv)
vtkSmartPointer<vtkDICOMMetaData>::New();
parser->SetMetaData(data);
-#if defined(_WIN32)
- // Temporarily switch the console to utf-8
- UINT codePage = GetConsoleOutputCP();
- SetConsoleOutputCP(65001);
-#endif
-
int m = sorter->GetNumberOfStudies();
for (int j = 0; j < m; j++)
- {
+ {
int k = sorter->GetFirstSeriesForStudy(j);
int kl = sorter->GetLastSeriesForStudy(j);
for (; k <= kl; k++)
- {
+ {
vtkStringArray *a = sorter->GetFileNamesForSeries(k);
vtkIdType l = a->GetNumberOfValues();
std::string fname = a->GetValue(0);
if (l == 1)
- {
+ {
printf("==== %s ====\n", fname.c_str());
- }
+ }
else
- {
+ {
// print the first and last filenames (sorted)
vtkSmartPointer<vtkSortFileNames> fsort =
vtkSmartPointer<vtkSortFileNames>::New();
@@ -539,45 +534,40 @@ MAINMACRO(argc, argv)
fsort->GetFileNames()->GetValue(0).c_str(),
fileBasename(fsort->GetFileNames()->GetValue(l-1).c_str()),
static_cast<int>(l));
- }
+ }
data->Clear();
data->SetNumberOfInstances(static_cast<int>(l));
unsigned int pixelDataVL = 0;
for (vtkIdType i = 0; i < l; i++)
- {
+ {
fname = a->GetValue(i);
parser->SetIndex(i);
parser->SetFileName(fname.c_str());
parser->Update();
pixelDataVL = parser->GetPixelDataVL();
- }
+ }
if (query.GetNumberOfDataElements() > 0)
- {
+ {
for (size_t i = 0; i < qtlist.size(); i++)
- {
+ {
printElementFromTagPath(data, qtlist[i], pixelDataVL);
- }
}
+ }
else
- {
+ {
vtkDICOMDataElementIterator iter = data->Begin();
vtkDICOMDataElementIterator iterEnd = data->End();
for (; iter != iterEnd; ++iter)
- {
+ {
printElement(data, 0, iter, 0, pixelDataVL);
- }
}
}
}
-
-#if defined(_WIN32)
- // Restore the console code page
- SetConsoleOutputCP(codePage);
-#endif
+ }
return rval;
}
diff --git a/Programs/dicomfind.cxx b/Programs/dicomfind.cxx
index 9ac430f..5ad2ceb 100644
--- a/Programs/dicomfind.cxx
+++ b/Programs/dicomfind.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -20,6 +20,7 @@
#include "vtkDICOMMetaData.h"
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
#include "readquery.h"
@@ -33,6 +34,7 @@
#include <errno.h>
#else
// includes for spawn
+#include <windows.h>
#include <process.h>
#include <errno.h>
// include for getcwd
@@ -44,14 +46,13 @@
#include <stdlib.h>
#include <limits>
-#include <iostream>
// print the version
void dicomfind_version(FILE *file, const char *cp)
{
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
}
@@ -66,6 +67,7 @@ void dicomfind_usage(FILE *file, const char *cp)
" -P Do not follow symbolic links.\n"
" -k tag=value Provide an attribute to be queried and matched.\n"
" -q <query.txt> Provide a file to describe the find query.\n"
+ " -u <uids.txt> Provide a file that contains a list of UIDs.\n"
" -maxdepth n Set the maximum directory depth.\n"
" -name pattern Set a pattern to match (with \"*\" or \"?\").\n"
" -image Restrict the search to files with PixelData.\n"
@@ -127,10 +129,10 @@ std::string dicomfind_dirname(const char *filename)
{
const char *cp = filename + strlen(filename);
while (cp != filename)
- {
+ {
--cp;
if (cp[0] == '\\' || cp[0] == '/') { break; }
- }
+ }
return std::string(filename, cp - filename);
}
@@ -147,105 +149,130 @@ bool execute_command(const char *command, char *argv[])
// fork a new process
pid_t command_pid = fork();
if (command_pid == -1)
- {
+ {
fprintf(stderr, "Unable to create subprocess: %s\n", argv[0]);
- }
+ }
// if fork() returned a pid, then this is the original process
if (command_pid != 0)
- {
+ {
int command_status;
while (waitpid(command_pid, &command_status, 0) == static_cast<pid_t>(-1))
- {
+ {
if (errno != EINTR)
- {
+ {
fprintf(stderr, "Unknown error with subprocess: %s\n", argv[0]);
return false;
- }
}
+ }
if (WIFEXITED(command_status))
- {
+ {
if (WEXITSTATUS(command_status) != 0)
- {
+ {
fprintf(stderr, "Subprocess returned negative result: %s\n", argv[0]);
- }
- return true;
}
+ return true;
+ }
else
- {
+ {
fprintf(stderr, "Abnormal subprocess termination: %s\n", argv[0]);
- }
}
+ }
else if (execvp(command, argv) == -1)
- {
+ {
if (errno == ENOENT)
- {
+ {
fprintf(stderr, "Executable not found: %s\n", argv[0]);
- }
+ }
else if (errno == ENOEXEC)
- {
+ {
fprintf(stderr, "File is not executable: %s\n", argv[0]);
- }
+ }
else if (errno == EACCES)
- {
+ {
fprintf(stderr, "Access (permission) error: %s\n", argv[0]);
- }
+ }
else if (errno == E2BIG)
- {
+ {
fprintf(stderr, "Command line to long for command: %s\n", argv[0]);
- }
+ }
else if (errno == ENOMEM)
- {
+ {
fprintf(stderr, "Out of memory while running command: %s\n", argv[0]);
- }
+ }
else if (errno == EMFILE)
- {
+ {
fprintf(stderr, "No more available file handles: %s\n", argv[0]);
- }
+ }
else
- {
+ {
fprintf(stderr, "Unknown error while running command: %s\n", argv[0]);
- }
+ }
return false;
- }
+ }
return true;
}
#else
-bool execute_command(const char *command, char *argv[])
+bool execute_command(const char *, char *argv[])
{
+ bool rval = true;
+
// flush the output
fflush(stdout);
fflush(stderr);
- if (_spawnvp(_P_WAIT, command, argv) != 0)
- {
+ int m = 0;
+ while (argv[m] != 0)
+ {
+ m++;
+ }
+
+ wchar_t **wargv = new wchar_t *[m + 1];
+
+ for (int i = 0; i < m; i++)
+ {
+ int n = MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, NULL, 0);
+ wargv[i] = new wchar_t[n];
+ MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, wargv[i], n);
+ }
+
+ wargv[m] = 0;
+
+ if (_wspawnvp(_P_WAIT, wargv[0], wargv) != 0)
+ {
if (errno == ENOENT)
- {
+ {
fprintf(stderr, "Executable not found: %s\n", argv[0]);
- }
+ }
else if (errno == ENOEXEC)
- {
+ {
fprintf(stderr, "File is not executable: %s\n", argv[0]);
- }
+ }
else if (errno == E2BIG)
- {
+ {
fprintf(stderr, "Command line to long for command: %s\n", argv[0]);
- }
+ }
else if (errno == ENOMEM)
- {
+ {
fprintf(stderr, "Out of memory while running command: %s\n", argv[0]);
- }
+ }
else
- {
+ {
fprintf(stderr, "Unknown error while running command: %s\n", argv[0]);
- }
-
- return false;
}
- return true;
+ rval = false;
+ }
+
+ for (int i = 0; i < m; i++)
+ {
+ delete [] wargv[i];
+ }
+ delete [] wargv;
+
+ return rval;
}
#endif
@@ -258,7 +285,12 @@ int dicomfind_chdir(const char *dirname)
int dicomfind_chdir(const char *dirname)
{
// use _wchdir to allow paths longer than the 260 char limit
- return _chdir(dirname);
+ int n = MultiByteToWideChar(CP_UTF8, 0, dirname, -1, NULL, 0);
+ wchar_t *wp = new wchar_t[n];
+ MultiByteToWideChar(CP_UTF8, 0, dirname, -1, wp, n);
+ int rval = _wchdir(wp);
+ delete [] wp;
+ return rval;
}
#endif
@@ -271,8 +303,16 @@ std::string dicomfind_getcwd()
#else
std::string dicomfind_getcwd()
{
- char buffer[2048];
- return _getcwd(buffer, sizeof(buffer));
+ wchar_t wbuffer[2048];
+ wchar_t *wp = _wgetcwd(wbuffer, sizeof(wbuffer)/sizeof(wchar_t));
+ int n = WideCharToMultiByte(
+ CP_UTF8, 0, wp, -1, NULL, 0, NULL, NULL);
+ char *cp = new char[n];
+ WideCharToMultiByte(
+ CP_UTF8, 0, wp, -1, cp, n, NULL, NULL);
+ std::string s = cp;
+ delete [] cp;
+ return s;
}
#endif
@@ -293,89 +333,99 @@ void dicomfind_operations(
for (std::vector<Operation>::iterator op = operationList.begin();
op != operationList.end();
++op)
- {
+ {
if (op->Type == "-print" || op->Type == "-print0")
- {
+ {
char endchar = (op->Type == "-print0" ? '\0' : '\n');
for (int kk = 0; kk < sa->GetNumberOfValues(); kk++)
- {
- std::cout << sa->GetValue(kk);
- std::cout.put(endchar);
- }
- std::cout.flush();
+ {
+ fprintf(stdout, "%s", sa->GetValue(kk).c_str());
+ fputc(endchar, stdout);
}
+ fflush(stdout);
+ }
else if (op->Type == "-exec" || op->Type == "-execdir")
- {
+ {
bool execdir = (op->Type == "-execdir");
// Count the number of times {} appears in exec args
size_t subcount = 0;
for (size_t jj = 0; jj < op->Args.size(); jj++)
- {
- subcount += (op->Args[jj] == "{}");
- }
+ {
+ subcount += (op->Args[jj].find("{}") != std::string::npos);
+ }
// remember the current subdirectory
std::string currentSubdir;
if (op->Args.back() == ";")
- {
+ {
// call program for each file
for (int kk = 0; kk < sa->GetNumberOfValues(); kk++)
- {
+ {
size_t sub_argc = op->Args.size() + subcount - 1;
char **sub_argv = new char *[sub_argc+1];
+ std::vector<std::string> temp_args(subcount);
+ size_t subc = 0;
size_t ii = 0;
size_t nn = op->Args.size()-1;
for (size_t jj = 0; jj < nn; jj++)
+ {
+ const std::string& arg = op->Args[jj];
+ size_t pos = arg.find("{}");
+ if (pos != std::string::npos)
{
- if (op->Args[jj] == "{}")
- {
+ const char *sub = sa->GetValue(kk).c_str();
if (execdir)
- {
- sub_argv[ii++] = const_cast<char *>(
- dicomfind_basename(sa->GetValue(kk).c_str()));
- }
- else
- {
- sub_argv[ii++] = const_cast<char *>(
- sa->GetValue(kk).c_str());
- }
+ {
+ sub = dicomfind_basename(sub);
}
- else
+
+ std::string& temp_arg = temp_args[subc++];
+ temp_arg = arg;
+ do
{
- sub_argv[ii++] = const_cast<char *>(op->Args[jj].c_str());
+ temp_arg.replace(pos, 2, sub);
+ pos = temp_arg.find("{}", pos + strlen(sub));
}
+ while (pos != std::string::npos);
+
+ sub_argv[ii++] = const_cast<char *>(temp_arg.c_str());
}
+ else
+ {
+ sub_argv[ii++] = const_cast<char *>(arg.c_str());
+ }
+ }
sub_argv[ii] = 0;
if (execdir)
- {
+ {
std::string dirname =
dicomfind_dirname(sa->GetValue(kk).c_str());
if (dirname != currentSubdir)
- {
+ {
dicomfind_chdir(originalDir.c_str());
dicomfind_chdir(dirname.c_str());
- }
}
+ }
if (!execute_command(sub_argv[0], sub_argv))
- {
+ {
fprintf(stderr, "failure!");
- }
+ }
delete [] sub_argv;
- }
+ }
if (execdir && currentSubdir != "")
- {
+ {
dicomfind_chdir(originalDir.c_str());
- }
}
+ }
else
- {
+ {
// call program for each series
// for execdir, what if series is split across directories?
// need to call executable once per directory, using only
@@ -383,117 +433,132 @@ void dicomfind_operations(
size_t sub_argc = op->Args.size() +
subcount*sa->GetNumberOfTuples() - 1;
char **sub_argv = new char *[sub_argc+1];
+ std::vector<std::string> temp_args(subcount*sa->GetNumberOfValues());
+ size_t subc = 0;
// for execdir, keep a list of directories that are done
std::vector<std::string> done_dirs;
std::string doing_dir;
-
+
bool notdone = true;
while (notdone)
- {
+ {
notdone = false;
if (execdir)
- {
+ {
bool foundDirToProcess = false;
for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
- {
+ {
std::string dirname =
dicomfind_dirname(sa->GetValue(kk).c_str());
if (!foundDirToProcess)
- {
+ {
bool dirIsDone = false;
for (size_t ll = 0; ll < done_dirs.size(); ll++)
- {
+ {
if (dirname == done_dirs[ll])
- {
+ {
dirIsDone = true;
break;
- }
}
+ }
if (!dirIsDone)
- {
+ {
foundDirToProcess = true;
doing_dir = dirname;
done_dirs.push_back(dirname);
break;
- }
}
}
+ }
if (foundDirToProcess)
- {
+ {
notdone = true;
- }
+ }
else
- {
+ {
break;
- }
}
+ }
size_t ii = 0;
size_t nn = op->Args.size()-1;
for (size_t jj = 0; jj < nn; jj++)
+ {
+ const std::string& arg = op->Args[jj];
+ size_t pos = arg.find("{}");
+ if (pos != std::string::npos)
{
- if (op->Args[jj] == "{}")
+ for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
{
- if (execdir)
+ const char *sub = sa->GetValue(kk).c_str();
+
+ if (execdir)
{
- for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
+ std::string dirname = dicomfind_dirname(sub);
+ if (dirname != doing_dir)
{
- std::string dirname =
- dicomfind_dirname(sa->GetValue(kk).c_str());
- if (dirname == doing_dir)
- {
- sub_argv[ii++] = const_cast<char *>(
- dicomfind_basename(sa->GetValue(kk).c_str()));
- }
+ continue;
}
+ sub = dicomfind_basename(sub);
}
- else
+
+ std::string& temp_arg = temp_args[subc++];
+ temp_arg = arg;
+ pos = temp_arg.find("{}");
+ do
{
- for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
- {
- sub_argv[ii++] = const_cast<char *>(
- sa->GetValue(kk).c_str());
- }
+ temp_arg.replace(pos, 2, sub);
+ pos = temp_arg.find("{}", pos + strlen(sub));
}
+ while (pos != std::string::npos);
+
+ sub_argv[ii++] = const_cast<char *>(temp_arg.c_str());
}
+ }
else
- {
- sub_argv[ii++] = const_cast<char *>(op->Args[jj].c_str());
- }
+ {
+ sub_argv[ii++] = const_cast<char *>(arg.c_str());
}
+ }
sub_argv[ii] = 0;
if (execdir)
- {
+ {
if (doing_dir != currentSubdir)
- {
+ {
dicomfind_chdir(originalDir.c_str());
dicomfind_chdir(doing_dir.c_str());
- }
}
+ }
if (!execute_command(sub_argv[0], sub_argv))
- {
+ {
fprintf(stderr, "failure!");
- }
}
+ }
if (execdir && currentSubdir != "")
- {
+ {
dicomfind_chdir(originalDir.c_str());
- }
+ }
delete [] sub_argv;
- }
}
}
+ }
}
+// Delay wildcard expansion for -name option
+MAINMACRO_PASSTHROUGH(-name);
+
// This program will dump all the metadata in the given file
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
std::vector<Operation> operationList;
int rval = 0;
@@ -507,6 +572,9 @@ MAINMACRO(argc, argv)
vtkSmartPointer<vtkStringArray> a = vtkSmartPointer<vtkStringArray>::New();
+ // always query SpecificCharacterSet
+ query.SetAttributeValue(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS));
+
// always query the functional sequences for advanced files
query.SetAttributeValue(
DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
@@ -514,145 +582,160 @@ MAINMACRO(argc, argv)
DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
if (argc < 2)
- {
+ {
dicomfind_usage(stdout, dicomfind_basename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--help") == 0)
- {
+ {
dicomfind_help(stdout, dicomfind_basename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--version") == 0)
- {
+ {
dicomfind_version(stdout, dicomfind_basename(argv[0]));
return rval;
- }
+ }
for (int argi = 1; argi < argc; argi++)
- {
+ {
const char *arg = argv[argi];
if (strcmp(arg, "-P") == 0)
- {
+ {
followSymlinks = false;
- }
+ }
else if (strcmp(arg, "-L") == 0)
- {
+ {
followSymlinks = true;
- }
+ }
else if (strcmp(arg, "-q") == 0)
- {
+ {
if (argi + 1 == argc || argv[argi+1][0] == '-')
- {
+ {
fprintf(stderr, "%s must be followed by a file.\n\n", arg);
dicomfind_usage(stderr, dicomfind_basename(argv[0]));
return 1;
- }
+ }
const char *qfile = argv[++argi];
if (!dicomcli_readquery(qfile, &query, &qtlist))
- {
+ {
fprintf(stderr, "Can't read query file %s\n\n", qfile);
return 1;
- }
}
- else if (strcmp(arg, "-k") == 0)
+ }
+ else if (strcmp(arg, "-u") == 0)
+ {
+ if (argi + 1 == argc || argv[argi+1][0] == '-')
+ {
+ fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
+ dicomfind_usage(stderr, dicomfind_basename(argv[0]));
+ return 1;
+ }
+ const char *qfile = argv[++argi];
+ if (!dicomcli_readuids(qfile, &query, &qtlist))
{
+ fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile);
+ return 1;
+ }
+ }
+ else if (strcmp(arg, "-k") == 0)
+ {
vtkDICOMTag tag;
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "%s must be followed by gggg,eeee=value "
"where gggg,eeee is a DICOM tag.\n\n", arg);
return 1;
- }
+ }
if (!dicomcli_readkey(argv[argi], &query, &qtlist))
- {
+ {
return 1;
- }
}
+ }
else if (strcmp(arg, "-maxdepth") == 0)
- {
+ {
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "%s must be followed by an argument.\n\n", arg);
return 1;
- }
- scandepth = static_cast<int>(atol(argv[argi]));
}
+ scandepth = static_cast<int>(atol(argv[argi]));
+ }
else if (strcmp(arg, "-name") == 0)
- {
+ {
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "%s must be followed by an argument.\n\n", arg);
return 1;
- }
- pattern = argv[argi];
}
+ pattern = argv[argi];
+ }
else if (strcmp(arg, "-image") == 0)
- {
+ {
requirePixelData = true;
- }
+ }
else if (strcmp(arg, "-series") == 0)
- {
+ {
findSeries = true;
- }
+ }
else if (strcmp(arg, "-print") == 0 ||
strcmp(arg, "-print0") == 0)
- {
+ {
operationList.push_back(arg);
- }
+ }
else if (strcmp(arg, "-exec") == 0 ||
strcmp(arg, "-execdir") == 0)
- {
+ {
operationList.push_back(arg);
int argj = ++argi;
for (; argj < argc; argj++)
- {
+ {
if (strcmp(argv[argj], ";") == 0 ||
strcmp(argv[argj], "+") == 0)
- {
+ {
break;
- }
}
+ }
if (argj == argc)
- {
+ {
fprintf(stderr, "%s must be terminated with + or \\; "
"(plus or semicolon).\n\n",
arg);
return 1;
- }
+ }
for (; argi <= argj; argi++)
- {
+ {
operationList.back().Args.push_back(argv[argi]);
- }
- argi = argj;
}
+ argi = argj;
+ }
else if (arg[0] == '-')
- {
+ {
fprintf(stderr, "unrecognized option %s.\n\n", arg);
dicomfind_usage(stderr, dicomfind_basename(argv[0]));
return 1;
- }
+ }
else
- {
+ {
a->InsertNextValue(arg);
- }
}
+ }
// if no operations were specified, default to "print"
if (operationList.empty())
- {
+ {
operationList.push_back("-print");
- }
+ }
// Remember the current directory
std::string originalDir = dicomfind_getcwd();
// Write data for every input directory
if (a->GetNumberOfTuples() > 0)
- {
+ {
vtkSmartPointer<vtkDICOMDirectory> finder =
vtkSmartPointer<vtkDICOMDirectory>::New();
finder->SetInputFileNames(a);
@@ -666,17 +749,17 @@ MAINMACRO(argc, argv)
finder->Update();
for (int j = 0; j < finder->GetNumberOfStudies(); j++)
- {
+ {
int k0 = finder->GetFirstSeriesForStudy(j);
int k1 = finder->GetLastSeriesForStudy(j);
for (int k = k0; k <= k1; k++)
- {
+ {
vtkStringArray *sa = finder->GetFileNamesForSeries(k);
dicomfind_operations(operationList, sa, originalDir);
- }
}
}
+ }
return rval;
}
diff --git a/Programs/dicompull.cxx b/Programs/dicompull.cxx
index 7189bc5..6bd294a 100644
--- a/Programs/dicompull.cxx
+++ b/Programs/dicompull.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -20,8 +20,11 @@
#include "vtkDICOMMetaData.h"
#include "vtkDICOMDictionary.h"
#include "vtkDICOMFile.h"
+#include "vtkDICOMFilePath.h"
+#include "vtkDICOMFileDirectory.h"
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
#include "readquery.h"
#include "progress.h"
@@ -29,15 +32,12 @@
#include <vtkStringArray.h>
#include <vtkSmartPointer.h>
-#include <vtksys/SystemTools.hxx>
-
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <limits>
-#include <iostream>
#include <map>
#include <utility>
@@ -46,7 +46,7 @@ void dicompull_version(FILE *file, const char *cp)
{
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
}
@@ -61,6 +61,7 @@ void dicompull_usage(FILE *file, const char *cp)
" -P Do not follow symbolic links.\n"
" -k tag=value Provide an attribute to be queried and matched.\n"
" -q <query.txt> Provide a file to describe the find query.\n"
+ " -u <uids.txt> Provide a file that contains a list of UIDs.\n"
" -o <directory> Directory to place the files into.\n"
" -maxdepth n Set the maximum directory depth.\n"
" -name pattern Set file names to match (with \"*\" or \"?\").\n"
@@ -100,6 +101,10 @@ void dicompull_help(FILE *file, const char *cp)
"The values used for \"-k key=value\" can use the wildcards * and ?, and\n"
"can also use date ranges of the form \"19990103-19990105\".\n"
"\n"
+ "The \"-u\" option can be used to provide a list of UIDs. Provide a file\n"
+ "where the first line of the file is the key (e.g. SeriesInstanceUID) and\n"
+ "the rest of the file is the UIDs to match, one UID per line.\n"
+ "\n"
);
}
@@ -116,10 +121,10 @@ std::string dicompull_dirname(const char *filename)
{
const char *cp = filename + strlen(filename);
while (cp != filename)
- {
+ {
--cp;
if (cp[0] == '\\' || cp[0] == '/') { break; }
- }
+ }
return std::string(filename, cp - filename);
}
@@ -131,25 +136,25 @@ std::string dicompull_cleanup(const std::string& input)
std::string::const_iterator b = a;
std::string s;
while (a != input.end())
- {
+ {
while (a != input.end() &&
((*a & 0x80) == 0) && isgraph(*a) && !ispunct(*a))
- {
+ {
++a;
- }
+ }
s.append(b, a);
b = a;
while (a != input.end() &&
(((*a & 0x80) != 0) || !isgraph(*a) || ispunct(*a)))
- {
+ {
++a;
- }
+ }
if (b != a && b != input.begin() && a != input.end())
- {
+ {
s.append("_");
- }
- b = a;
}
+ b = a;
+ }
return s;
}
@@ -166,24 +171,24 @@ std::string dicompull_makedirname(
const char *dp = cp;
const char *bp = 0;
while (*cp != '\0')
- {
+ {
while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; }
if (*cp == '}')
- {
+ {
fprintf(stderr, "Error: Missing \'{\': %s\n", outdir);
exit(1);
- }
+ }
if (*cp == '{')
- {
+ {
bp = cp;
while (*cp != '}' && *cp != '\0') { cp++; }
if (*cp != '}')
- {
+ {
fprintf(stderr, "Error: Unmatched \'{\': %s\n", outdir);
exit(1);
- }
+ }
else
- {
+ {
s.append(dp, bp);
bp++;
key.assign(bp, cp);
@@ -192,59 +197,65 @@ std::string dicompull_makedirname(
v.Clear();
vtkDICOMTag tag;
if (key.length() > 0)
- {
+ {
vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(key.c_str());
if (de.IsValid())
- {
+ {
tag = de.GetTag();
- }
+ }
else
- {
+ {
fprintf(stderr, "Error: Unrecognized key %s\n", key.c_str());
exit(1);
- }
}
+ }
if (finder)
- {
+ {
if (!v.IsValid())
- {
+ {
v = finder->GetStudyRecord(study).GetAttributeValue(tag);
- }
+ }
if (!v.IsValid())
- {
+ {
v = finder->GetPatientRecordForStudy(study).GetAttributeValue(tag);
- }
+ }
if (!v.IsValid())
- {
+ {
v = finder->GetSeriesRecord(series).GetAttributeValue(tag);
- }
}
+ }
if (v.IsValid())
- {
+ {
val.assign(dicompull_cleanup(v.AsUTF8String()));
- }
+ }
else if (finder)
- {
+ {
fprintf(stderr, "Error: Key %s not allowed in output directory.\n",
key.c_str());
exit(1);
- }
+ }
if (val.empty())
- {
+ {
val = "Empty";
- }
- s.append(val);
}
+ s.append(val);
}
}
+ }
s.append(dp, cp);
return s;
}
+// Delay wildcard expansion for -name option
+MAINMACRO_PASSTHROUGH(-name);
+
// This program will find and copy dicom files
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
int rval = 0;
int scandepth = std::numeric_limits<int>::max();
bool followSymlinks = true;
@@ -258,6 +269,9 @@ MAINMACRO(argc, argv)
vtkSmartPointer<vtkStringArray> a = vtkSmartPointer<vtkStringArray>::New();
+ // always query SpecificCharacterSet
+ query.SetAttributeValue(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS));
+
// always query the functional sequences for advanced files
query.SetAttributeValue(
DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
@@ -265,160 +279,166 @@ MAINMACRO(argc, argv)
DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
if (argc < 2)
- {
+ {
dicompull_usage(stdout, dicompull_basename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--help") == 0)
- {
+ {
dicompull_help(stdout, dicompull_basename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--version") == 0)
- {
+ {
dicompull_version(stdout, dicompull_basename(argv[0]));
return rval;
- }
+ }
for (int argi = 1; argi < argc; argi++)
- {
+ {
const char *arg = argv[argi];
if (strcmp(arg, "-P") == 0)
- {
+ {
followSymlinks = false;
- }
+ }
else if (strcmp(arg, "-L") == 0)
- {
+ {
followSymlinks = true;
- }
+ }
else if (strcmp(arg, "-q") == 0)
- {
+ {
if (argi + 1 == argc || argv[argi+1][0] == '-')
- {
+ {
fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
dicompull_usage(stderr, dicompull_basename(argv[0]));
return 1;
- }
+ }
const char *qfile = argv[++argi];
if (!dicomcli_readquery(qfile, &query, &qtlist))
- {
+ {
fprintf(stderr, "Error: Can't read query file %s\n\n", qfile);
return 1;
- }
}
- else if (strcmp(arg, "-k") == 0)
+ }
+ else if (strcmp(arg, "-u") == 0)
+ {
+ if (argi + 1 == argc || argv[argi+1][0] == '-')
+ {
+ fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
+ dicompull_usage(stderr, dicompull_basename(argv[0]));
+ return 1;
+ }
+ const char *qfile = argv[++argi];
+ if (!dicomcli_readuids(qfile, &query, &qtlist))
{
+ fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile);
+ return 1;
+ }
+ }
+ else if (strcmp(arg, "-k") == 0)
+ {
vtkDICOMTag tag;
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "Error: %s must be followed by gggg,eeee=value "
"where gggg,eeee is a DICOM tag.\n\n", arg);
return 1;
- }
+ }
if (!dicomcli_readkey(argv[argi], &query, &qtlist))
- {
+ {
return 1;
- }
}
+ }
else if (strcmp(arg, "-o") == 0)
- {
+ {
vtkDICOMTag tag;
++argi;
if (argi == argc || argv[argi][0] == '-')
- {
+ {
fprintf(stderr, "Error: %s must be followed by output directory.\n\n",
arg);
return 1;
- }
- outdir = argv[argi];
}
+ outdir = argv[argi];
+ }
else if (strcmp(arg, "-maxdepth") == 0)
- {
+ {
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "Error: %s must be followed by an argument.\n\n", arg);
return 1;
- }
- scandepth = static_cast<int>(atol(argv[argi]));
}
+ scandepth = static_cast<int>(atol(argv[argi]));
+ }
else if (strcmp(arg, "-name") == 0)
- {
+ {
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "Error: %s must be followed by an argument.\n\n", arg);
return 1;
- }
- pattern = argv[argi];
}
+ pattern = argv[argi];
+ }
else if (strcmp(arg, "-image") == 0)
- {
+ {
requirePixelData = true;
- }
+ }
else if (strcmp(arg, "-series") == 0)
- {
+ {
findSeries = true;
- }
+ }
else if (strcmp(arg, "--silent") == 0)
- {
+ {
silent = true;
- }
+ }
else if (arg[0] == '-')
- {
+ {
fprintf(stderr, "Error: Unrecognized option %s.\n\n", arg);
dicompull_usage(stderr, dicompull_basename(argv[0]));
return 1;
- }
+ }
else
+ {
+ int code = vtkDICOMFile::Access(arg, vtkDICOMFile::In);
+ if (code == vtkDICOMFile::Good ||
+ code == vtkDICOMFile::FileIsDirectory)
{
- if (vtksys::SystemTools::FileExists(arg))
- {
a->InsertNextValue(arg);
- }
+ }
else if (dicomcli_looks_like_key(arg))
- {
+ {
fprintf(stderr, "Error: Missing -k before %s.\n\n", arg);
return 1;
- }
+ }
else
- {
+ {
fprintf(stderr, "Error: File not found: %s.\n\n", arg);
return 1;
- }
}
}
+ }
// output directory is mandatory
if (outdir.empty())
- {
+ {
fprintf(stderr,
"\nError: No output directory was specified (-o <directory>).\n\n");
exit(1);
- }
+ }
// do a dry run to make sure outdir string is valid
dicompull_makedirname(NULL, 0, 0, outdir.c_str());
- // Separator between directory and file
- const char *sep = (outdir.empty() ? "" : "//");
-#ifdef _WIN32
- for (std::string::const_iterator si = outdir.begin();
- si != outdir.end(); ++si)
- {
- if (*si == '/') { sep = "/"; }
- else if (*si == '\\') { sep = "\\"; }
- }
-#endif
-
// Create a map of all directories written to. The count is the
// number of series that have been written to the directory.
std::map<std::string, int> dircount;
// Write data for every input directory
if (a->GetNumberOfTuples() > 0)
- {
+ {
const size_t bufsize = 8192;
unsigned char *buffer = new unsigned char [bufsize];
@@ -436,33 +456,33 @@ MAINMACRO(argc, argv)
vtkSmartPointer<ProgressObserver> p =
vtkSmartPointer<ProgressObserver>::New();
if (!silent)
- {
+ {
p->SetText("Scanning");
finder->AddObserver(vtkCommand::ProgressEvent, p);
finder->AddObserver(vtkCommand::StartEvent, p);
finder->AddObserver(vtkCommand::EndEvent, p);
- }
+ }
finder->Update();
vtkIdType count = 0;
vtkIdType total = 0;
if (!silent)
- {
+ {
p->SetText("Copying");
p->Execute(NULL, vtkCommand::StartEvent, NULL);
for (int k = 0; k < finder->GetNumberOfSeries(); k++)
- {
+ {
total += finder->GetFileNamesForSeries(k)->GetNumberOfValues();
- }
}
+ }
for (int j = 0; j < finder->GetNumberOfStudies(); j++)
- {
+ {
int k0 = finder->GetFirstSeriesForStudy(j);
int k1 = finder->GetLastSeriesForStudy(j);
for (int k = k0; k <= k1; k++)
- {
+ {
vtkStringArray *sa = finder->GetFileNamesForSeries(k);
// create the directory name
std::string dirname =
@@ -470,117 +490,117 @@ MAINMACRO(argc, argv)
std::map<std::string,int>::iterator mi = dircount.find(dirname);
int si = 1;
if (mi != dircount.end())
- {
+ {
si = mi->second + 1;
mi->second = si;
- }
+ }
else
- {
+ {
dircount[dirname] = si;
- if (!vtksys::SystemTools::MakeDirectory(dirname.c_str()))
- {
+ int code = vtkDICOMFileDirectory::Create(dirname.c_str());
+ if (code != vtkDICOMFileDirectory::Good)
+ {
fprintf(stderr, "Error: Cannot create directory: %s\n",
dirname.c_str());
delete [] buffer;
exit(1);
- }
}
+ }
+ vtkDICOMFilePath outpath(dirname);
for (vtkIdType i = 0; i < sa->GetNumberOfValues(); i++)
- {
+ {
// copy the file
char fname[32];
- sprintf(fname, "%sIM-%04d-%04d.dcm",
- sep, si, static_cast<int>(i+1));
+ sprintf(fname, "IM-%04d-%04d.dcm", si, static_cast<int>(i+1));
const std::string& srcname = sa->GetValue(i);
- std::string fullname = dirname + fname;
- if (!vtksys::SystemTools::SameFile(srcname.c_str(), fullname.c_str()))
- {
+ std::string fullname = outpath.Join(fname);
+ if (!vtkDICOMFile::SameFile(srcname.c_str(), fullname.c_str()))
+ {
vtkDICOMFile infile(srcname.c_str(), vtkDICOMFile::In);
if (infile.GetError())
- {
+ {
const char *message = "Cannot copy file";
switch (infile.GetError())
- {
+ {
case vtkDICOMFile::AccessDenied:
message = "Access denied for file";
break;
- case vtkDICOMFile::IsDirectory:
+ case vtkDICOMFile::FileIsDirectory:
message = "This file is a directory";
break;
- case vtkDICOMFile::FileNotFound:
- case vtkDICOMFile::DirectoryNotFound:
- message = "File does not exist";
+ case vtkDICOMFile::ImpossiblePath:
+ message = "Bad file path";
break;
- }
- fprintf(stderr, "Error: %s: %s\n", message, srcname.c_str());
}
+ fprintf(stderr, "Error: %s: %s\n", message, srcname.c_str());
+ }
else if (infile.GetSize() == 0)
- {
+ {
fprintf(stderr, "Error: File size is zero: %s\n",
srcname.c_str());
- }
+ }
else
- {
+ {
vtkDICOMFile outfile(fullname.c_str(), vtkDICOMFile::Out);
if (outfile.GetError())
- {
+ {
const char *message = "Cannot write file";
switch (outfile.GetError())
- {
+ {
case vtkDICOMFile::AccessDenied:
message = "Access denied for output file";
break;
- case vtkDICOMFile::IsDirectory:
+ case vtkDICOMFile::FileIsDirectory:
message = "This output is a directory";
break;
- case vtkDICOMFile::DirectoryNotFound:
- message = "Directory does not exist";
+ case vtkDICOMFile::ImpossiblePath:
+ message = "Bad file path";
break;
- }
- fprintf(stderr, "Error: %s: %s\n", message, fullname.c_str());
}
+ fprintf(stderr, "Error: %s: %s\n", message, fullname.c_str());
+ }
else
- {
+ {
// copy the file
while (!infile.EndOfFile())
- {
+ {
size_t bytecount = infile.Read(buffer, bufsize);
if (bytecount == 0 && infile.GetError())
- {
+ {
fprintf(stderr, "Error, incomplete read: %s\n",
srcname.c_str());
vtkDICOMFile::Remove(fullname.c_str());
break;
- }
+ }
if (bytecount > 0 &&
outfile.Write(buffer, bytecount) != bytecount)
- {
+ {
fprintf(stderr, "Error: Incomplete write: %s\n",
fullname.c_str());
vtkDICOMFile::Remove(fullname.c_str());
break;
- }
}
}
}
}
+ }
if (!silent)
- {
+ {
count++;
double progress = (static_cast<double>(count)/
static_cast<double>(total));
p->Execute(NULL, vtkCommand::ProgressEvent, &progress);
- }
}
}
}
+ }
delete [] buffer;
if (!silent)
- {
+ {
p->Execute(NULL, vtkCommand::EndEvent, NULL);
- }
}
+ }
return rval;
}
diff --git a/Programs/dicomtocsv.cxx b/Programs/dicomtocsv.cxx
index 4b1209d..666aa4a 100644
--- a/Programs/dicomtocsv.cxx
+++ b/Programs/dicomtocsv.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -20,8 +20,10 @@
#include "vtkDICOMParser.h"
#include "vtkDICOMMetaData.h"
#include "vtkDICOMMetaDataAdapter.h"
+#include "vtkDICOMFile.h"
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
#include "readquery.h"
#include "progress.h"
@@ -31,14 +33,15 @@
#include <vtkStringArray.h>
#include <vtkSmartPointer.h>
-#include <vtksys/SystemTools.hxx>
-
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits>
-#include <iostream>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
namespace {
@@ -47,7 +50,7 @@ void dicomtocsv_version(FILE *file, const char *cp)
{
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
}
@@ -60,6 +63,7 @@ void dicomtocsv_usage(FILE *file, const char *cp)
fprintf(file, "options:\n"
" -k tag=value Provide a key to be queried and matched.\n"
" -q <query.txt> Provide a file to describe the find query.\n"
+ " -u <uids.txt> Provide a file that contains a list of UIDs.\n"
" -o <data.csv> Provide a file for the query results.\n"
" --first-nonzero Search series for first nonzero value of each key.\n"
" --directory-only Use directory scan only, do not re-scan files.\n"
@@ -85,7 +89,17 @@ void dicomtocsv_help(FILE *file, const char *cp)
"Attributes nested within sequences can be specified by giving a tag\n"
"path e.g. \"-k Tag1/Tag2/Tag3\". Either a forward slash or a backslash\n"
"can be used to separate the components of the path. Private tags\n"
- "should be preceded by the private dictionary name in square brackets.\n\n");
+ "should be preceded by the private dictionary name in square brackets.\n"
+ "\n"
+ "If the same tag is given more than once with \"-k\" (or if the tag is\n"
+ "listed multiple times in the query file, or appears in both the query\n"
+ "file and as a \"-k\" option), then its first appearance will set the\n"
+ "column number that it appears in. Also, with regards to the search,\n"
+ "the value specified in the final appearance of the tag as an option\n"
+ "will be the value used for the search.\n"
+ "\n"
+ "If no attributes are specified with either \"-k\" or \"-q\", then a\n"
+ "default set of query attributes will be used.\n\n");
}
// remove path portion of filename
@@ -98,55 +112,169 @@ const char *dicomtocsv_basename(const char *filename)
typedef vtkDICOMVR VR;
+// Create a default query for --image
+void dicomtocsv_image_default(vtkDICOMItem *query, QueryTagList *ql)
+{
+ // these are the attributes that must be part of the query
+ static const DC::EnumType defaultElements[] = {
+ // patient-level information
+ DC::PatientName, // 2
+ DC::PatientID, // 1
+ DC::PatientBirthDate, // 3
+ DC::PatientSex, // 3
+ // study-level information
+ DC::StudyDate, // 1
+ DC::StudyTime, // 1
+ DC::StudyID, // 1
+ DC::AccessionNumber, // 2
+ DC::StudyDescription, // 2
+ DC::StudyInstanceUID, // 1
+ // series-level information
+ DC::Modality, // 1
+ DC::SeriesNumber, // 1
+ DC::SeriesDescription, // 3
+ DC::SeriesInstanceUID, // 1
+ DC::Rows, // 3
+ DC::Columns, // 3
+ // image-level information
+ DC::InstanceNumber, // 1
+ DC::SOPClassUID, // 1
+ DC::SOPInstanceUID, // 1
+ DC::ReferencedFileID, // special
+ // delimiter to mark end of list
+ DC::ItemDelimitationItem
+ };
+
+ for (const DC::EnumType *tagPtr = defaultElements;
+ *tagPtr != DC::ItemDelimitationItem;
+ ++tagPtr)
+ {
+ VR vr = query->FindDictVR(*tagPtr);
+ query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
+ ql->push_back(vtkDICOMTagPath(*tagPtr));
+ }
+}
+
+// Create a default query for --series
+void dicomtocsv_series_default(vtkDICOMItem *query, QueryTagList *ql)
+{
+ // these are the attributes that must be part of the query
+ static const DC::EnumType defaultElements[] = {
+ // patient-level information
+ DC::PatientName, // 2
+ DC::PatientID, // 1
+ DC::PatientBirthDate, // 3
+ DC::PatientSex, // 3
+ // study-level information
+ DC::StudyDate, // 1
+ DC::StudyTime, // 1
+ DC::StudyID, // 1
+ DC::AccessionNumber, // 2
+ DC::StudyDescription, // 2
+ DC::StudyInstanceUID, // 1
+ // series-level information
+ DC::Modality, // 1
+ DC::SeriesNumber, // 1
+ DC::SeriesDescription, // 3
+ DC::SeriesInstanceUID, // 1
+ DC::Rows, // 3
+ DC::Columns, // 3
+ DC::NumberOfReferences, // special
+ // delimiter to mark end of list
+ DC::ItemDelimitationItem
+ };
+
+ for (const DC::EnumType *tagPtr = defaultElements;
+ *tagPtr != DC::ItemDelimitationItem;
+ ++tagPtr)
+ {
+ VR vr = query->FindDictVR(*tagPtr);
+ query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
+ ql->push_back(vtkDICOMTagPath(*tagPtr));
+ }
+}
+
+// Create a default query for --study
+void dicomtocsv_study_default(vtkDICOMItem *query, QueryTagList *ql)
+{
+ // these are the attributes that must be part of the query
+ static const DC::EnumType defaultElements[] = {
+ // patient-level information
+ DC::PatientName, // 2
+ DC::PatientID, // 1
+ DC::PatientBirthDate, // 3
+ DC::PatientSex, // 3
+ // study-level information
+ DC::StudyDate, // 1
+ DC::StudyTime, // 1
+ DC::StudyID, // 1
+ DC::AccessionNumber, // 2
+ DC::StudyDescription, // 2
+ DC::StudyInstanceUID, // 1
+ DC::NumberOfReferences, // special
+ // delimiter to mark end of list
+ DC::ItemDelimitationItem
+ };
+
+ for (const DC::EnumType *tagPtr = defaultElements;
+ *tagPtr != DC::ItemDelimitationItem;
+ ++tagPtr)
+ {
+ VR vr = query->FindDictVR(*tagPtr);
+ query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
+ ql->push_back(vtkDICOMTagPath(*tagPtr));
+ }
+}
+
// Write the header for a csv file
void dicomtocsv_writeheader(
- const vtkDICOMItem& query, const QueryTagList *ql, std::ostream& os)
+ const vtkDICOMItem& query, const QueryTagList *ql, FILE *fp)
{
// print human-readable names for each tag
for (size_t i = 0; i < ql->size(); i++)
- {
+ {
if (i != 0)
- {
- os << ",";
- }
+ {
+ fprintf(fp, "%s", ",");
+ }
const vtkDICOMItem *pitem = &query;
vtkDICOMTagPath tagPath = ql->at(i);
for (;;)
- {
+ {
vtkDICOMTag tag = tagPath.GetHead();
vtkDICOMDictEntry e = pitem->FindDictEntry(tag);
if (e.IsValid())
- {
- os << e.GetName();
- }
+ {
+ fprintf(fp, "%s", e.GetName());
+ }
if (!tagPath.HasTail())
- {
+ {
break;
- }
+ }
pitem = pitem->GetAttributeValue(tag).GetSequenceData();
tagPath = tagPath.GetTail();
- os << "\\";
- }
+ fprintf(fp, "%s", "\\");
}
- os << "\r\n";
+ }
+ fprintf(fp, "%s", "\r\n");
}
// Convert date to format YYYY-MM-DD HH:MM:SS
std::string dicomtocsv_date(const std::string& dt, vtkDICOMVR vr)
{
if (vr == VR::TM && dt.length() >= 6)
- {
+ {
return dt.substr(0,2) + ":" + dt.substr(2,2) + ":" + dt.substr(4,2);
- }
+ }
else if (vr == VR::DA && dt.length() >= 8)
- {
+ {
return dt.substr(0,4) + "-" + dt.substr(4,2) + "-" + dt.substr(6,2);
- }
+ }
else if (vr == VR::DT && dt.length() >= 14)
- {
+ {
return dt.substr(0,4) + "-" + dt.substr(4,2) + "-" + dt.substr(6,2) + " " +
dt.substr(8,2) + ":" + dt.substr(10,2) + ":" + dt.substr(12,2);
- }
+ }
return "";
}
@@ -159,86 +287,86 @@ std::string dicomtocsv_quote(const std::string& s)
std::string r;
for (;;)
- {
+ {
size_t j = s.find('\"', i);
if (j < s.length())
- {
+ {
r += s.substr(i, j-i+1);
r += "\"";
i = j+1;
- }
+ }
else
- {
+ {
r += s.substr(i);
break;
- }
}
+ }
return r;
}
// Write out the results in csv format
void dicomtocsv_write(vtkDICOMDirectory *finder,
- const vtkDICOMItem& query, const QueryTagList *ql, std::ostream& os,
+ const vtkDICOMItem& query, const QueryTagList *ql, FILE *fp,
int level, bool firstNonZero, bool useDirectoryRecords, vtkCommand *p)
{
// for keeping track of progress
vtkIdType count = 0.0;
vtkIdType total = 0.0;
if (p)
- {
+ {
for (int k = 0; k < finder->GetNumberOfSeries(); k++)
- {
+ {
total += finder->GetFileNamesForSeries(k)->GetNumberOfValues();
- }
- p->Execute(NULL, vtkCommand::StartEvent, NULL);
}
+ p->Execute(NULL, vtkCommand::StartEvent, NULL);
+ }
for (int j = 0; j < finder->GetNumberOfStudies(); j++)
- {
+ {
int k0 = finder->GetFirstSeriesForStudy(j);
int k1 = finder->GetLastSeriesForStudy(j);
int numberOfFiles = 1;
if (level < 3 && k1 > k0)
- {
+ {
// if level is "study", only look at one series
numberOfFiles = 0;
for (int k = k0; k <= k1; k++)
- {
+ {
vtkStringArray *a = finder->GetFileNamesForSeries(k);
numberOfFiles += a->GetNumberOfValues();
- }
- k1 = k0;
}
+ k1 = k0;
+ }
for (int k = k0; k <= k1; k++)
- {
+ {
vtkStringArray *a = finder->GetFileNamesForSeries(k);
if (a->GetNumberOfValues() == 0)
- {
+ {
continue;
- }
+ }
if (level == 3)
- {
+ {
// at series level, this is the number of files
numberOfFiles = a->GetNumberOfValues();
- }
+ }
vtkSmartPointer<vtkDICOMMetaData> meta;
if (useDirectoryRecords)
- {
+ {
meta = finder->GetMetaDataForSeries(k);
- }
+ }
else
- {
+ {
meta = vtkSmartPointer<vtkDICOMMetaData>::New();
if (level >= 4 || firstNonZero)
- {
+ {
// need to parse all files
meta->SetNumberOfInstances(a->GetNumberOfValues());
- }
+ }
// need to go to the files for the meta data
vtkSmartPointer<vtkDICOMParser> parser =
@@ -248,27 +376,24 @@ void dicomtocsv_write(vtkDICOMDirectory *finder,
parser->SetMetaData(meta);
for (int ii = 0; ii < meta->GetNumberOfInstances(); ii++)
- {
+ {
parser->SetIndex(ii);
parser->SetFileName(a->GetValue(ii));
parser->Update();
- }
}
-
- // create an adapter, in case of enhanced IOD
- vtkDICOMMetaDataAdapter adapter(meta);
+ }
// this loop is only for the "image" level
int m = (level >= 4 ? meta->GetNumberOfInstances() : 1);
for (int jj = 0; jj < m; jj++)
- {
+ {
// print the value of each tag
for (size_t i = 0; i < ql->size(); i++)
- {
+ {
if (i != 0)
- {
- os << ",";
- }
+ {
+ fprintf(fp, "%s", ",");
+ }
const vtkDICOMItem *qitem = &query;
const vtkDICOMItem *mitem = 0;
@@ -279,62 +404,76 @@ void dicomtocsv_write(vtkDICOMDirectory *finder,
int n = (firstNonZero ? meta->GetNumberOfInstances() : 1);
n = (level >= 4 ? jj+1 : n);
for (int ii = jj; ii < n; ii++)
- {
+ {
+ // Create an adapter, which helps with extracting attributes from
+ // the PerFrameFunctionalSequence of enhanced IODs.
+ vtkDICOMMetaDataAdapter adapter(meta, ii);
+
for (;;)
- {
+ {
vtkDICOMTag tag = tagPath.GetHead();
std::string creator;
if ((tag.GetGroup() & 0x0001) == 1)
- {
+ {
vtkDICOMTag ctag(tag.GetGroup(), tag.GetElement() >> 8);
creator = qitem->GetAttributeValue(ctag).AsString();
if (mitem)
- {
+ {
tag = mitem->ResolvePrivateTag(tag, creator);
- }
+ }
else
- {
+ {
tag = adapter->ResolvePrivateTag(tag, creator);
- }
}
+ }
if (mitem)
- {
+ {
vp = &mitem->GetAttributeValue(tag);
- }
+ }
+ else if (tag != DC::NumberOfFrames)
+ {
+ // vtkDICOMMetaDataAdapter hides NumberOfFrames, so it
+ // will never be found if we check the adapter
+ vp = &adapter->GetAttributeValue(tag);
+ }
else
- {
- vp = &adapter->GetAttributeValue(ii, tag);
- }
+ {
+ vp = &meta->GetAttributeValue(ii, tag);
+ }
if (vp && !vp->IsValid())
- {
+ {
vp = 0;
- }
+ }
+ // break if we have reached the end of a tag path
if (vp == 0 || !tagPath.HasTail())
- {
+ {
break;
- }
+ }
+ // go one level deeper into the query
qitem = qitem->GetAttributeValue(
tagPath.GetHead()).GetSequenceData();
+ // go one level deeper along the tag path
tagPath = tagPath.GetTail();
+ // go one level deeper into the meta data
mitem = vp->GetSequenceData();
if (mitem == 0 || vp->GetNumberOfValues() == 0)
- {
+ {
break;
- }
}
+ }
// If numerical value is zero, keep going until non-zero because
// the zero value is of little interest
if (vp != 0)
- {
+ {
if (!vp->GetVR().HasNumericValue() || vp->AsDouble() != 0.0)
- {
+ {
break;
- }
}
}
+ }
if (vp != 0)
- {
+ {
const vtkDICOMValue& v = *vp;
if (v.GetNumberOfValues() == 1 &&
(v.GetVR() == VR::SS ||
@@ -343,67 +482,74 @@ void dicomtocsv_write(vtkDICOMDirectory *finder,
v.GetVR() == VR::UL ||
v.GetVR() == VR::FL ||
v.GetVR() == VR::FD))
- {
- os << v;
- }
+ {
+ std::string s = v.AsString();
+ fprintf(fp, "%s", s.c_str());
+ }
else if (v.GetVR() == VR::DA ||
v.GetVR() == VR::TM ||
v.GetVR() == VR::DT)
- {
- os << "\"" << dicomtocsv_date(v.AsString(), v.GetVR()) << "\"";
- }
+ {
+ std::string s = dicomtocsv_date(v.AsString(), v.GetVR());
+ fprintf(fp, "\"%s\"", s.c_str());
+ }
else if (v.GetVR() == VR::SQ)
- {
+ {
// how should a sequence be printed out to the csv file?
- }
+ }
else if (v.GetVL() != 0 && v.GetVL() != 0xFFFFFFFF)
- {
- os << "\"" << dicomtocsv_quote(v.AsUTF8String()) << "\"";
- }
+ {
+ std::string s = dicomtocsv_quote(v.AsUTF8String());
+ fprintf(fp, "\"%s\"", s.c_str());
}
+ }
else if (tagPath.GetHead() == DC::ReferencedFileID &&
!tagPath.HasTail())
- {
+ {
// ReferencedFileID (0004,1500) is meant to be used in DICOMDIR,
// but we hijack it to report the first file in the series.
- os << "\"" << dicomtocsv_quote(a->GetValue(jj)) << "\"";
- }
+ std::string s = dicomtocsv_quote(a->GetValue(jj));
+ fprintf(fp, "\"%s\"", s.c_str());
+ }
else if (tagPath.GetHead() == DC::NumberOfReferences &&
!tagPath.HasTail())
- {
+ {
// NumberOfReferences (0004,1600) is a retired attribute meant
// to count the number of references to a file, but we hijack
// it and use it to report the number of files found for the
// series.
- os << "\"" << numberOfFiles << "\"";
- }
+ fprintf(fp, "\"%d\"", numberOfFiles);
}
+ }
- os << "\r\n";
+ fprintf(fp, "%s", "\r\n");
// report progress
if (p)
- {
+ {
count += numberOfFiles;
double progress = (static_cast<double>(count)/
static_cast<double>(total));
p->Execute(NULL, vtkCommand::ProgressEvent, &progress);
- }
}
}
}
+ }
if (p)
- {
+ {
p->Execute(NULL, vtkCommand::EndEvent, NULL);
- }
+ }
}
} // end anonymous namespace
// This program will dump all the metadata in the given file
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
int rval = 0;
int scandepth = std::numeric_limits<int>::max();
QueryTagList qtlist;
@@ -417,6 +563,9 @@ MAINMACRO(argc, argv)
vtkSmartPointer<vtkStringArray> a = vtkSmartPointer<vtkStringArray>::New();
const char *ofile = 0;
+ // always query SpecificCharacterSet
+ query.SetAttributeValue(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS));
+
// always query the functional sequences for advanced files
query.SetAttributeValue(
DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
@@ -424,178 +573,222 @@ MAINMACRO(argc, argv)
DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
if (argc < 2)
- {
+ {
dicomtocsv_usage(stdout, dicomtocsv_basename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--help") == 0)
- {
+ {
dicomtocsv_help(stdout, dicomtocsv_basename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--version") == 0)
- {
+ {
dicomtocsv_version(stdout, dicomtocsv_basename(argv[0]));
return rval;
- }
+ }
for (int argi = 1; argi < argc; argi++)
- {
+ {
const char *arg = argv[argi];
if (strcmp(arg, "-q") == 0 || strcmp(arg, "-o") == 0)
- {
+ {
if (argi + 1 == argc || argv[argi+1][0] == '-')
- {
+ {
fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0]));
return 1;
- }
+ }
if (arg[1] == 'q')
- {
+ {
const char *qfile = argv[++argi];
if (!dicomcli_readquery(qfile, &query, &qtlist))
- {
+ {
fprintf(stderr, "Error: Can't read query file %s\n\n", qfile);
return 1;
- }
}
+ }
else if (arg[1] == 'o')
- {
+ {
ofile = argv[++argi];
- }
}
- else if (strcmp(arg, "-k") == 0)
+ }
+ else if (strcmp(arg, "-u") == 0)
+ {
+ if (argi + 1 == argc || argv[argi+1][0] == '-')
+ {
+ fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
+ dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0]));
+ return 1;
+ }
+ const char *qfile = argv[++argi];
+ if (!dicomcli_readuids(qfile, &query, &qtlist))
{
+ fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile);
+ return 1;
+ }
+ }
+ else if (strcmp(arg, "-k") == 0)
+ {
vtkDICOMTag tag;
++argi;
if (argi == argc)
- {
+ {
fprintf(stderr, "Error: %s must be followed by gggg,eeee=value "
"where gggg,eeee is a DICOM tag.\n\n", arg);
return 1;
- }
+ }
if (!dicomcli_readkey(argv[argi], &query, &qtlist))
- {
+ {
return 1;
- }
}
+ }
else if (strcmp(arg, "--first-nonzero") == 0)
- {
+ {
firstNonZero = true;
- }
+ }
else if (strcmp(arg, "--directory-only") == 0)
- {
+ {
useDirectoryRecords = true;
- }
+ }
else if (strcmp(arg, "--study") == 0)
- {
+ {
level = 2;
- }
+ }
else if (strcmp(arg, "--series") == 0)
- {
+ {
level = 3;
- }
+ }
else if (strcmp(arg, "--image") == 0)
- {
+ {
level = 4;
- }
+ }
else if (strcmp(arg, "--silent") == 0)
- {
+ {
silent = true;
- }
+ }
else if (arg[0] == '-')
- {
+ {
fprintf(stderr, "Error: Unrecognized option %s.\n\n", arg);
dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0]));
return 1;
- }
+ }
else
+ {
+ int code = vtkDICOMFile::Access(arg, vtkDICOMFile::In);
+ if (code == vtkDICOMFile::Good || code == vtkDICOMFile::FileIsDirectory)
{
- if (vtksys::SystemTools::FileExists(arg))
- {
a->InsertNextValue(arg);
- }
+ }
else if (dicomcli_looks_like_key(arg))
- {
+ {
fprintf(stderr, "Error: Missing -k before %s.\n\n", arg);
return 1;
- }
+ }
else if (strlen(arg) > 4 &&
strcmp(&arg[strlen(arg) - 4], ".csv") == 0)
- {
+ {
fprintf(stderr, "Error: Missing -o before %s.\n\n", arg);
return 1;
- }
+ }
else
- {
+ {
fprintf(stderr, "Error: File not found: %s.\n\n", arg);
return 1;
- }
}
}
+ }
- std::ostream *osp = &std::cout;
- std::ofstream ofs;
+ FILE *fp = stdout;
+ FILE *fp1 = NULL;
if (ofile)
+ {
+#ifndef _WIN32
+ fp1 = fopen(ofile, "wb");
+#else
+ // use wide chars to avoid narrowing to local character set
+ int n = MultiByteToWideChar(CP_UTF8, 0, ofile, -1, NULL, 0);
+ wchar_t *wofile = new wchar_t[n];
+ MultiByteToWideChar(CP_UTF8, 0, ofile, -1, wofile, n);
+ fp1 = _wfopen(wofile, L"wb");
+ delete [] wofile;
+#endif
+
+ if (!fp1)
{
- ofs.open(ofile,
- std::ofstream::out |
- std::ofstream::binary |
- std::ofstream::trunc);
-
- if (ofs.fail())
- {
fprintf(stderr, "Error: Unable to open output file %s.\n", ofile);
return 1;
- }
- osp = &ofs;
}
+ fp = fp1;
+ }
else
- {
+ {
// if output to stdout, then silence progress reporting
silent = true;
+ }
+
+ // If no query specified, then use a default one
+ if (qtlist.size() == 0)
+ {
+ if (level == 2)
+ {
+ dicomtocsv_study_default(&query, &qtlist);
+ }
+ else if (level == 3)
+ {
+ dicomtocsv_series_default(&query, &qtlist);
}
+ else if (level == 4)
+ {
+ dicomtocsv_image_default(&query, &qtlist);
+ }
+ }
// Write the header
- dicomtocsv_writeheader(query, &qtlist, *osp);
- osp->flush();
+ dicomtocsv_writeheader(query, &qtlist, fp);
+ fflush(fp);
// Write data for every input directory
if (a->GetNumberOfTuples() > 0)
- {
+ {
vtkSmartPointer<ProgressObserver> p;
vtkSmartPointer<vtkDICOMDirectory> finder =
vtkSmartPointer<vtkDICOMDirectory>::New();
if (level < 4)
- {
+ {
finder->SetFindLevelToSeries();
- }
+ }
if (!silent)
- {
+ {
p = vtkSmartPointer<ProgressObserver>::New();
p->SetText("Scanning");
finder->AddObserver(vtkCommand::ProgressEvent, p);
finder->AddObserver(vtkCommand::StartEvent, p);
finder->AddObserver(vtkCommand::EndEvent, p);
- }
+ }
finder->SetInputFileNames(a);
finder->SetScanDepth(scandepth);
finder->SetFindQuery(query);
finder->Update();
if (!silent)
- {
+ {
p->SetText("Writing");
- }
+ }
dicomtocsv_write(
- finder, query, &qtlist, *osp, level,
+ finder, query, &qtlist, fp, level,
firstNonZero, useDirectoryRecords, p);
- osp->flush();
- }
+ fflush(fp);
+ }
+
+ if (fp1)
+ {
+ fclose(fp1);
+ }
return rval;
}
diff --git a/Programs/dicomtodicom.cxx b/Programs/dicomtodicom.cxx
index 6735741..5e09a9d 100644
--- a/Programs/dicomtodicom.cxx
+++ b/Programs/dicomtodicom.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -24,6 +24,8 @@
#include "vtkDICOMToRAS.h"
#include "vtkDICOMCTRectifier.h"
#include "vtkDICOMUtilities.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
#include <vtkImageData.h>
#include <vtkMatrix4x4.h>
@@ -34,10 +36,6 @@
#include <vtkSortFileNames.h>
#include <vtkSmartPointer.h>
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
#include <string>
#include <vector>
#include <set>
@@ -48,6 +46,7 @@
#include <ctype.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// Kinds of reformats
@@ -83,19 +82,19 @@ void dicomtodicom_version(FILE *file, const char *command_name, bool verbose)
while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
if (!verbose)
- {
+ {
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
- }
+ }
else
- {
+ {
fprintf(file,
"Head %8.8s, Built %s, %s\n",
DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
- }
+ }
}
@@ -173,32 +172,32 @@ void dicomtodicom_check_error(vtkObject *o)
const char *filename = 0;
unsigned long errorcode = 0;
if (writer)
- {
+ {
filename = writer->GetFileName();
errorcode = writer->GetErrorCode();
- }
+ }
else if (reader)
- {
+ {
filename = reader->GetInternalFileName();
errorcode = reader->GetErrorCode();
- }
+ }
else if (sorter)
- {
+ {
filename = sorter->GetInternalFileName();
errorcode = sorter->GetErrorCode();
- }
+ }
else if (parser)
- {
+ {
filename = parser->GetFileName();
errorcode = parser->GetErrorCode();
- }
+ }
if (!filename)
- {
+ {
filename = "";
- }
+ }
switch(errorcode)
- {
+ {
case vtkErrorCode::NoError:
return;
case vtkErrorCode::FileNotFoundError:
@@ -225,65 +224,11 @@ void dicomtodicom_check_error(vtkObject *o)
default:
fprintf(stderr, "An unknown error occurred.\n");
break;
- }
+ }
exit(1);
}
-// Add a dicom file to the list, expand if wildcard
-void dicomtodicom_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
- bool ispattern = false;
- bool hasbackslash = false;
- size_t n = strlen(filepath);
- for (size_t i = 0; i < n; i++)
- {
- if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
- {
- ispattern = true;
- }
- if (filepath[i] == '\\')
- {
- hasbackslash = true;
- }
- }
-
- std::string newpath = filepath;
- if (hasbackslash)
- {
- // backslashes interfere with vtksys::Glob
- vtksys::SystemTools::ConvertToUnixSlashes(newpath);
- }
- filepath = newpath.c_str();
-
- if (ispattern)
- {
- vtksys::Glob glob;
- if (glob.FindFiles(filepath))
- {
- const std::vector<std::string> &globfiles = glob.GetFiles();
- size_t m = globfiles.size();
- for (size_t j = 0; j < m; j++)
- {
- files->InsertNextValue(globfiles[j]);
- }
- }
- else
- {
- fprintf(stderr, "Could not match pattern: %s\n", filepath);
- exit(1);
- }
- }
- else
- {
- files->InsertNextValue(filepath);
- }
-#else
- files->InsertNextValue(filepath);
-#endif
-}
-
// Read the options
void dicomtodicom_read_options(
int argc, char *argv[],
@@ -301,135 +246,135 @@ void dicomtodicom_read_options(
// read the options from the command line
int argi = 1;
while (argi < argc)
- {
+ {
const char *arg = argv[argi++];
if (arg[0] == '-')
- {
+ {
if (strcmp(arg, "--") == 0)
- {
+ {
// stop processing switches
break;
- }
+ }
else if (strcmp(arg, "--modality") == 0 ||
strcmp(arg, "--series-description") == 0 ||
strcmp(arg, "--series-number") == 0 ||
strcmp(arg, "--uid-prefix") == 0)
- {
+ {
if (argi >= argc ||
argv[argi][0] == '-')
- {
+ {
fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg);
exit(1);
- }
+ }
if (strcmp(arg, "--modality") == 0)
- {
+ {
options->modality = argv[argi];
- }
+ }
else if (strcmp(arg, "--series-description") == 0)
- {
+ {
options->series_description = argv[argi];
- }
+ }
else if (strcmp(arg, "--series-number") == 0)
- {
+ {
options->series_number= argv[argi];
- }
+ }
else if (strcmp(arg, "--uid-prefix") == 0)
- {
+ {
options->uid_prefix = argv[argi];
- }
- argi++;
}
+ argi++;
+ }
else if (strcmp(arg, "--axial") == 0)
- {
+ {
options->mpr = MPRAxial;
- }
+ }
else if (strcmp(arg, "--coronal") == 0)
- {
+ {
options->mpr = MPRCoronal;
- }
+ }
else if (strcmp(arg, "--sagittal") == 0)
- {
+ {
options->mpr = MPRSagittal;
- }
+ }
else if (strcmp(arg, "--silent") == 0)
- {
+ {
options->silent = true;
- }
+ }
else if (strcmp(arg, "--verbose") == 0)
- {
+ {
options->verbose = true;
- }
+ }
else if (strcmp(arg, "--version") == 0)
- {
+ {
dicomtodicom_version(stdout, argv[0], false);
exit(0);
- }
+ }
else if (strcmp(arg, "--build-version") == 0)
- {
+ {
dicomtodicom_version(stdout, argv[0], true);
exit(0);
- }
+ }
else if (strcmp(arg, "--help") == 0)
- {
+ {
dicomtodicom_help(stdout, argv[0]);
exit(0);
- }
+ }
else if (arg[0] == '-' && arg[1] == '-')
- {
+ {
fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
dicomtodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
else if (arg[0] == '-' && arg[1] != '-')
- {
+ {
for (int argj = 1; arg[argj] != '\0'; argj++)
- {
+ {
if (arg[argj] == 's')
- {
+ {
options->silent = true;
- }
+ }
else if (arg[argj] == 'v')
- {
+ {
options->verbose = true;
- }
+ }
else if (arg[argj] == 'o')
- {
+ {
if (arg[argj+1] != '\0')
- {
+ {
arg += argj+1;
- }
+ }
else
- {
+ {
if (argi >= argc)
- {
+ {
fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
dicomtodicom_usage(stderr, argv[0]);
exit(1);
- }
- arg = argv[argi++];
}
+ arg = argv[argi++];
+ }
options->output = arg;
break;
- }
+ }
else
- {
+ {
fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
dicomtodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
+ }
else
- {
- dicomtodicom_add_file(files, arg);
- }
+ {
+ files->InsertNextValue(arg);
}
+ }
while (argi < argc)
- {
- dicomtodicom_add_file(files, argv[argi++]);
- }
+ {
+ files->InsertNextValue(argv[argi++]);
+ }
}
// Convert one DICOM series into another DICOM series
@@ -461,28 +406,28 @@ void dicomtodicom_convert_one(
(meta->GetAttributeValue(DC::SeriesDescription).AsString() +
dicomtodicom_description[options->mpr]);
if (seriesDescription.size() < 64)
- {
+ {
meta->SetAttributeValue(DC::SeriesDescription, seriesDescription);
- }
+ }
// set the metadata supplied on the command line
if (options->series_description)
- {
+ {
meta->SetAttributeValue(DC::SeriesDescription, options->series_description);
- }
+ }
if (options->series_number)
- {
+ {
meta->SetAttributeValue(DC::SeriesNumber, options->series_number);
- }
+ }
// get the matrix from the DICOM series
vtkMatrix4x4 *inputMatrix = reader->GetPatientMatrix();
vtkSmartPointer<vtkMatrix4x4> matrix =
vtkSmartPointer<vtkMatrix4x4>::New();
if (inputMatrix)
- {
+ {
matrix->DeepCopy(inputMatrix);
- }
+ }
// mpr reformat if requested
vtkSmartPointer<vtkImageReslice> reformat =
@@ -494,17 +439,17 @@ void dicomtodicom_convert_one(
int permutation[3] = { 0, 1, 2 };
if (options->mpr)
- {
+ {
// check for CT acquired with a tilted gantry
if (fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(matrix)) > 1e-2)
- {
+ {
// tilt is significant, so regrid as a rectangular volume
rectify->SetInputConnection(lastOutput);
rectify->SetVolumeMatrix(matrix);
rectify->Update();
lastOutput = rectify->GetOutputPort();
matrix = rectify->GetRectifiedMatrix();
- }
+ }
// create a permutation matrix to make the slices axial
axes->DeepCopy(matrix);
@@ -514,50 +459,50 @@ void dicomtodicom_convert_one(
int prevmaxj = -1;
int prevmaxi = -1;
for (int kdim = 0; kdim < 2; kdim++)
- {
+ {
int maxj = 0;
int maxi = 0;
double maxv = -0.0;
for (int jdim = 0; jdim < 3; jdim++)
- {
+ {
if (jdim == prevmaxj) { continue; }
for (int idim = 0; idim < 3; idim++)
- {
+ {
if (idim == prevmaxi) { continue; }
double v = axes->GetElement(jdim, idim);
if (v*v >= maxv)
- {
+ {
maxi = idim;
maxj = jdim;
maxv = v*v;
- }
}
}
+ }
maxidx[maxj] = maxi;
value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0);
prevmaxj = maxj;
prevmaxi = maxi;
- }
+ }
axes->Zero();
axes->SetElement(3, 3, 1.0);
for (int jdim = 0; jdim < 3; jdim++)
- {
+ {
int idim = maxidx[jdim];
if (idim < 0)
- {
+ {
idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3];
maxidx[jdim] = idim;
double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0);
value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm;
- }
+ }
permutation[jdim] = idim;
axes->SetElement(jdim, idim, value[jdim]);
- }
+ }
// change the permutation to the desired mpr
if (options->mpr == MPRCoronal)
- {
+ {
double cmatrix[16] = {
1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
@@ -568,9 +513,9 @@ void dicomtodicom_convert_one(
permutation[0] = tperm[0];
permutation[1] = tperm[2];
permutation[2] = tperm[1];
- }
+ }
else if (options->mpr == MPRSagittal)
- {
+ {
double smatrix[16] = {
0.0, 0.0,-1.0, 0.0,
1.0, 0.0, 0.0, 0.0,
@@ -581,7 +526,7 @@ void dicomtodicom_convert_one(
permutation[0] = tperm[1];
permutation[1] = tperm[2];
permutation[2] = tperm[0];
- }
+ }
// reformat with the permuted axes
reformat->SetResliceAxes(axes);
@@ -590,7 +535,7 @@ void dicomtodicom_convert_one(
// factor out the permuted axes
vtkMatrix4x4::Multiply4x4(matrix, axes, matrix);
- }
+ }
// make the generator
vtkSmartPointer<vtkDICOMMRGenerator> mrgenerator =
@@ -605,52 +550,52 @@ void dicomtodicom_convert_one(
if (SOPClass == "1.2.840.10008.5.1.4.1.1.2" ||
SOPClass == "1.2.840.10008.5.1.4.1.1.2.1" ||
SOPClass == "1.2.840.10008.5.1.4.1.1.2.2")
- {
+ {
generator = ctgenerator;
- }
+ }
else if (SOPClass == "1.2.840.10008.5.1.4.1.1.4" ||
SOPClass == "1.2.840.10008.5.1.4.1.1.4.1" ||
SOPClass == "1.2.840.10008.5.1.4.1.1.4.4")
- {
+ {
generator = mrgenerator;
- }
+ }
// allow the user to override the generator
if (options->modality)
- {
+ {
if (strcmp(options->modality, "CT") == 0)
- {
+ {
generator = ctgenerator;
- }
+ }
else if (strcmp(options->modality, "MR") == 0 ||
strcmp(options->modality, "MRI") == 0)
- {
+ {
generator = mrgenerator;
- }
}
+ }
// prepare the writer to write the image
vtkSmartPointer<vtkDICOMWriter> writer =
vtkSmartPointer<vtkDICOMWriter>::New();
if (generator)
- {
+ {
writer->SetGenerator(generator);
- }
+ }
writer->SetMetaData(meta);
writer->SetFilePrefix(outfile);
writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
writer->TimeAsVectorOn();
if (reader->GetTimeDimension() > 1)
- {
+ {
writer->SetTimeDimension(reader->GetTimeDimension());
writer->SetTimeSpacing(reader->GetTimeSpacing());
- }
+ }
writer->SetPatientMatrix(matrix);
if (reader->GetRescaleSlope() > 0)
- {
+ {
writer->SetRescaleSlope(reader->GetRescaleSlope());
writer->SetRescaleIntercept(reader->GetRescaleIntercept());
- }
+ }
writer->SetInputConnection(lastOutput);
writer->SetMemoryRowOrderToFileNative();
writer->Write();
@@ -682,8 +627,11 @@ void dicomtodicom_convert_files(
}
// This program will convert DICOM to DICOM
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
// for the list of input DICOM files
vtkSmartPointer<vtkStringArray> files =
vtkSmartPointer<vtkStringArray>::New();
@@ -696,41 +644,40 @@ MAINMACRO(argc, argv)
// set the UID prefix
if (options.uid_prefix)
- {
+ {
vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix);
- }
+ }
// make sure that input files were provided
if (files->GetNumberOfValues() == 0)
- {
+ {
fprintf(stderr, "\nNo input files were specified.\n\n");
dicomtodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
// the output
const char *outpath = options.output;
if (!outpath)
- {
+ {
fprintf(stderr,
"\nNo output directory was specified (\'-o\' <directory>).\n\n");
dicomtodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
- if (vtksys::SystemTools::FileExists(outpath))
- {
- if (!vtksys::SystemTools::FileIsDirectory(outpath))
- {
- fprintf(stderr, "option -o must give a directory, not a file.\n");
- exit(1);
- }
- }
- else if (!vtksys::SystemTools::MakeDirectory(outpath))
- {
+ int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
+ if (code != vtkDICOMFile::FileIsDirectory)
+ {
+ fprintf(stderr, "option -o must give a directory, not a file.\n");
+ exit(1);
+ }
+ code = vtkDICOMFileDirectory::Create(outpath);
+ if (code != vtkDICOMFileDirectory::Good)
+ {
fprintf(stderr, "Cannot create directory: %s\n", outpath);
exit(1);
- }
+ }
dicomtodicom_convert_files(&options, files, outpath);
diff --git a/Programs/dicomtonifti.cxx b/Programs/dicomtonifti.cxx
index bf4db1f..ebd181c 100644
--- a/Programs/dicomtonifti.cxx
+++ b/Programs/dicomtonifti.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -21,6 +21,9 @@
#include "vtkDICOMFileSorter.h"
#include "vtkDICOMToRAS.h"
#include "vtkDICOMCTRectifier.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
#include "vtkNIFTIHeader.h"
#include "vtkNIFTIWriter.h"
@@ -40,10 +43,6 @@
#include <vtkImageHistogramStatistics.h>
#endif
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
#include <string>
#include <vector>
#include <set>
@@ -54,6 +53,7 @@
#include <ctype.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// Simple structure for command-line options
@@ -84,19 +84,19 @@ void dicomtonifti_version(FILE *file, const char *command_name, bool verbose)
while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
if (!verbose)
- {
+ {
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
- }
+ }
else
- {
+ {
fprintf(file,
"Head %8.8s, Built %s, %s\n",
DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
- }
+ }
}
// Print the options
@@ -204,32 +204,32 @@ void dicomtonifti_check_error(vtkObject *o)
const char *filename = 0;
unsigned long errorcode = 0;
if (writer)
- {
+ {
filename = writer->GetFileName();
errorcode = writer->GetErrorCode();
- }
+ }
else if (reader)
- {
+ {
filename = reader->GetInternalFileName();
errorcode = reader->GetErrorCode();
- }
+ }
else if (sorter)
- {
+ {
filename = sorter->GetInternalFileName();
errorcode = sorter->GetErrorCode();
- }
+ }
else if (parser)
- {
+ {
filename = parser->GetFileName();
errorcode = parser->GetErrorCode();
- }
+ }
if (!filename)
- {
+ {
filename = "";
- }
+ }
switch(errorcode)
- {
+ {
case vtkErrorCode::NoError:
return;
case vtkErrorCode::FileNotFoundError:
@@ -256,65 +256,11 @@ void dicomtonifti_check_error(vtkObject *o)
default:
fprintf(stderr, "An unknown error occurred.\n");
break;
- }
+ }
exit(1);
}
-// Add a dicom file to the list, expand if wildcard
-void dicomtonifti_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
- bool ispattern = false;
- bool hasbackslash = false;
- size_t n = strlen(filepath);
- for (size_t i = 0; i < n; i++)
- {
- if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
- {
- ispattern = true;
- }
- if (filepath[i] == '\\')
- {
- hasbackslash = true;
- }
- }
-
- std::string newpath = filepath;
- if (hasbackslash)
- {
- // backslashes interfere with vtksys::Glob
- vtksys::SystemTools::ConvertToUnixSlashes(newpath);
- }
- filepath = newpath.c_str();
-
- if (ispattern)
- {
- vtksys::Glob glob;
- if (glob.FindFiles(filepath))
- {
- const std::vector<std::string> &globfiles = glob.GetFiles();
- size_t m = globfiles.size();
- for (size_t j = 0; j < m; j++)
- {
- files->InsertNextValue(globfiles[j]);
- }
- }
- else
- {
- fprintf(stderr, "Could not match pattern: %s\n", filepath);
- exit(1);
- }
- }
- else
- {
- files->InsertNextValue(filepath);
- }
-#else
- files->InsertNextValue(filepath);
-#endif
-}
-
// Read the options
void dicomtonifti_read_options(
int argc, char *argv[],
@@ -339,171 +285,171 @@ void dicomtonifti_read_options(
// read the options from the command line
int argi = 1;
while (argi < argc)
- {
+ {
const char *arg = argv[argi++];
if (arg[0] == '-')
- {
+ {
if (strcmp(arg, "--") == 0)
- {
+ {
// stop processing switches
break;
- }
+ }
else if (strcmp(arg, "--recurse") == 0)
- {
+ {
options->recurse = true;
- }
+ }
else if (strcmp(arg, "--compress") == 0)
- {
+ {
options->compress = true;
- }
+ }
else if (strcmp(arg, "--follow-symlinks") == 0)
- {
+ {
options->follow_symlinks = true;
- }
+ }
else if (strcmp(arg, "--fsl") == 0)
- {
+ {
options->fsl = true;
- }
+ }
else if (strcmp(arg, "--reformat-to-axial") == 0)
- {
+ {
options->reformat_to_axial = true;
- }
+ }
else if (strcmp(arg, "--no-slice-reordering") == 0)
- {
+ {
options->no_slice_reordering = true;
- }
+ }
else if (strcmp(arg, "--no-row-reordering") == 0)
- {
+ {
options->no_row_reordering = true;
- }
+ }
else if (strcmp(arg, "--no-column-reordering") == 0)
- {
+ {
options->no_column_reordering = true;
- }
+ }
else if (strcmp(arg, "--no-reordering") == 0)
- {
+ {
options->no_slice_reordering = true;
options->no_row_reordering = true;
options->no_column_reordering = true;
- }
+ }
else if (strcmp(arg, "--no-qform") == 0)
- {
+ {
options->no_qform = true;
- }
+ }
else if (strcmp(arg, "--no-sform") == 0)
- {
+ {
options->no_sform = true;
- }
+ }
else if (strcmp(arg, "--batch") == 0)
- {
+ {
options->batch = true;
- }
+ }
else if (strcmp(arg, "--silent") == 0)
- {
+ {
options->silent = true;
- }
+ }
else if (strcmp(arg, "--verbose") == 0)
- {
+ {
options->verbose = true;
- }
+ }
else if (strcmp(arg, "--volume") == 0)
- {
+ {
if (argi >= argc || argv[argi][0] == '-')
- {
+ {
fprintf(stderr, "\nA number must follow \'--volume\'\n\n");
dicomtonifti_usage(stderr, argv[0]);
exit(1);
- }
+ }
arg = argv[argi++];
options->volume = atoi(arg);
- }
+ }
else if (strcmp(arg, "--version") == 0)
- {
+ {
dicomtonifti_version(stdout, argv[0], false);
exit(0);
- }
+ }
else if (strcmp(arg, "--build-version") == 0)
- {
+ {
dicomtonifti_version(stdout, argv[0], true);
exit(0);
- }
+ }
else if (strcmp(arg, "--help") == 0)
- {
+ {
dicomtonifti_help(stdout, argv[0]);
exit(0);
- }
+ }
else if (arg[0] == '-' && arg[1] == '-')
- {
+ {
fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
dicomtonifti_usage(stderr, argv[0]);
exit(1);
- }
+ }
else if (arg[0] == '-' && arg[1] != '-')
- {
+ {
for (int argj = 1; arg[argj] != '\0'; argj++)
- {
+ {
if (arg[argj] == 'z')
- {
+ {
options->compress = true;
- }
+ }
else if (arg[argj] == 'r')
- {
+ {
options->recurse = true;
- }
+ }
else if (arg[argj] == 'b')
- {
+ {
options->batch = true;
- }
+ }
else if (arg[argj] == 's')
- {
+ {
options->silent = true;
- }
+ }
else if (arg[argj] == 'v')
- {
+ {
options->verbose = true;
- }
+ }
else if (arg[argj] == 'L')
- {
+ {
options->follow_symlinks = true;
- }
+ }
else if (arg[argj] == 'o')
- {
+ {
if (arg[argj+1] != '\0')
- {
+ {
arg += argj+1;
- }
+ }
else
- {
+ {
if (argi >= argc)
- {
+ {
fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
dicomtonifti_usage(stderr, argv[0]);
exit(1);
- }
- arg = argv[argi++];
}
+ arg = argv[argi++];
+ }
options->output = arg;
break;
- }
+ }
else
- {
+ {
fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
dicomtonifti_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
+ }
else
- {
- dicomtonifti_add_file(files, arg);
- }
+ {
+ files->InsertNextValue(arg);
}
+ }
while (argi < argc)
- {
- dicomtonifti_add_file(files, argv[argi++]);
- }
+ {
+ files->InsertNextValue(argv[argi++]);
+ }
}
// Remove all characters but A-Za-z0-9_ from a string
@@ -513,25 +459,25 @@ std::string dicomtonifti_safe_string(const std::string& input)
std::string::const_iterator b = a;
std::string s;
while (a != input.end())
- {
+ {
while (a != input.end() &&
((*a & 0x80) == 0) && isgraph(*a) && !ispunct(*a))
- {
+ {
++a;
- }
+ }
s.append(b, a);
b = a;
while (a != input.end() &&
(((*a & 0x80) != 0) || !isgraph(*a) || ispunct(*a)))
- {
+ {
++a;
- }
+ }
if (b != a && b != input.begin() && a != input.end())
- {
+ {
s.append("_");
- }
- b = a;
}
+ b = a;
+ }
return s;
}
@@ -549,24 +495,24 @@ std::string dicomtonifti_make_filename(
const char *dp = cp;
const char *bp = 0;
while (*cp != '\0')
- {
+ {
while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; }
if (*cp == '}')
- {
+ {
fprintf(stderr, "Missing \'{\': %s\n", outfile);
exit(1);
- }
+ }
if (*cp == '{')
- {
+ {
bp = cp;
while (*cp != '}' && *cp != '\0') { cp++; }
if (*cp != '}')
- {
+ {
fprintf(stderr, "Unmatched \'{\': %s\n", outfile);
exit(1);
- }
+ }
else
- {
+ {
s.append(dp, bp);
bp++;
key.assign(bp, cp);
@@ -575,40 +521,40 @@ std::string dicomtonifti_make_filename(
v.Clear();
vtkDICOMTag tag;
if (key.length() > 0)
- {
+ {
vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(key.c_str());
if (de.IsValid())
- {
+ {
tag = de.GetTag();
- }
+ }
else
- {
+ {
fprintf(stderr, "Unrecognized key %s\n", key.c_str());
exit(1);
- }
}
+ }
if (meta)
- {
+ {
v = meta->GetAttributeValue(tag);
- }
+ }
if (v.IsValid())
- {
+ {
val.assign(dicomtonifti_safe_string(v.AsUTF8String()));
- }
+ }
else if (meta)
- {
+ {
fprintf(stderr, "Sorry, key %s not found.\n",
key.c_str());
exit(1);
- }
+ }
if (val.empty())
- {
+ {
val = "Empty";
- }
- s.append(val);
}
+ s.append(val);
}
}
+ }
s.append(dp, cp);
return s;
@@ -637,18 +583,18 @@ void dicomtonifti_convert_one(
vtkSmartPointer<vtkImageExtractComponents>::New();
extract->SetInputConnection(lastOutput);
if (options->volume >= 0)
- {
+ {
if (reader->GetOutput()->GetNumberOfScalarComponents() <= options->volume)
- {
+ {
fprintf(stderr, "Only %d volumes, but --volume %d used.\n",
reader->GetOutput()->GetNumberOfScalarComponents(),
options->volume);
exit(1);
- }
+ }
extract->SetComponents(options->volume);
extract->Update();
lastOutput = extract->GetOutputPort();
- }
+ }
// check if slices were reordered by the reader
vtkIntArray *fileIndices = reader->GetFileIndexArray();
@@ -664,14 +610,14 @@ void dicomtonifti_convert_one(
vtkSmartPointer<vtkDICOMCTRectifier> rectifier =
vtkSmartPointer<vtkDICOMCTRectifier>::New();
if (fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(patientMatrix)) > 1e-2)
- {
+ {
// tilt is significant, so regrid as a rectangular volume
rectifier->SetInputConnection(lastOutput);
rectifier->SetVolumeMatrix(patientMatrix);
rectifier->Update();
lastOutput = rectifier->GetOutputPort();
patientMatrix = rectifier->GetRectifiedMatrix();
- }
+ }
// convert to NIFTI coordinate system
vtkSmartPointer<vtkDICOMToRAS> converter =
@@ -688,10 +634,10 @@ void dicomtonifti_convert_one(
checkMatrix->DeepCopy(patientMatrix);
// undo the DICOM to NIFTI x = -x, y = -y conversion in check matrix
for (int j = 0; j < 4; j++)
- {
+ {
checkMatrix->Element[0][j] = -checkMatrix->Element[0][j];
checkMatrix->Element[1][j] = -checkMatrix->Element[1][j];
- }
+ }
checkMatrix->Invert();
// checkMatrix = PatientMatrix^(-1) * RASMatrix
vtkMatrix4x4::Multiply4x4(
@@ -713,7 +659,7 @@ void dicomtonifti_convert_one(
int permutation[3] = { 0, 1, 2 };
if (options->reformat_to_axial || options->fsl)
- {
+ {
// this becomes meaningless after reformatting
slicesReordered = false;
@@ -725,50 +671,50 @@ void dicomtonifti_convert_one(
int prevmaxj = -1;
int prevmaxi = -1;
for (int kdim = 0; kdim < 2; kdim++)
- {
+ {
int maxj = 0;
int maxi = 0;
double maxv = -0.0;
for (int jdim = 0; jdim < 3; jdim++)
- {
+ {
if (jdim == prevmaxj) { continue; }
for (int idim = 0; idim < 3; idim++)
- {
+ {
if (idim == prevmaxi) { continue; }
double v = axes->GetElement(jdim, idim);
if (v*v >= maxv)
- {
+ {
maxi = idim;
maxj = jdim;
maxv = v*v;
- }
}
}
+ }
maxidx[maxj] = maxi;
value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0);
prevmaxj = maxj;
prevmaxi = maxi;
- }
+ }
axes->Zero();
axes->SetElement(3, 3, 1.0);
for (int jdim = 0; jdim < 3; jdim++)
- {
+ {
int idim = maxidx[jdim];
if (idim < 0)
- {
+ {
idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3];
maxidx[jdim] = idim;
double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0);
value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm;
- }
+ }
permutation[jdim] = idim;
axes->SetElement(jdim, idim, value[jdim]);
- }
+ }
// if fsl, use the fsl orientation
if (options->fsl)
- {
+ {
double fslmat[16] = {
-1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
@@ -776,7 +722,7 @@ void dicomtonifti_convert_one(
0.0, 0.0, 0.0, 1.0 };
vtkMatrix4x4::Multiply4x4(*axes->Element, fslmat, *axes->Element);
- }
+ }
// reformat with the permutated axes
reformat->SetResliceAxes(axes);
reformat->SetInputConnection(lastOutput);
@@ -784,7 +730,7 @@ void dicomtonifti_convert_one(
// factor out the permuted axes
vtkMatrix4x4::Multiply4x4(matrix, axes, matrix);
- }
+ }
// convert to signed short if fsl
int scalarType = reader->GetOutput()->GetScalarType();
@@ -792,40 +738,40 @@ void dicomtonifti_convert_one(
vtkSmartPointer<vtkImageCast>::New();
if (options->fsl && scalarType != VTK_UNSIGNED_CHAR &&
scalarType != VTK_SHORT && scalarType != VTK_FLOAT)
- {
+ {
double outputType = scalarType;
if (scalarType == VTK_UNSIGNED_SHORT ||
scalarType == VTK_CHAR ||
scalarType == VTK_SIGNED_CHAR)
- {
+ {
outputType = VTK_SHORT;
if (scalarType == VTK_UNSIGNED_SHORT)
- {
+ {
// change to float if values greater than 32767 exist
const unsigned short *sptr = static_cast<const unsigned short *>(
reader->GetOutput()->GetScalarPointer());
vtkIdType n = reader->GetOutput()->GetNumberOfPoints();
n *= reader->GetOutput()->GetNumberOfScalarComponents();
for (vtkIdType i = 0; i < n; i++)
- {
+ {
if (*sptr++ > 32767)
- {
+ {
outputType = VTK_FLOAT;
break;
- }
}
}
}
+ }
else
- {
+ {
outputType = VTK_FLOAT;
- }
+ }
caster->SetInputConnection(lastOutput);
caster->SetOutputScalarType(outputType);
lastOutput = caster->GetOutputPort();
- }
+ }
// prepare the NIFTI header information
vtkSmartPointer<vtkNIFTIHeader> hdr =
@@ -835,13 +781,13 @@ void dicomtonifti_convert_one(
// the descrip is the date followed by the series description and ID
std::string date = meta->GetAttributeValue(DC::SeriesDate).AsString();
if (date.length() >= 8)
- {
+ {
const char *months[13] = { "/ /", "/Jan/", "/Feb/", "/Mar/", "/Apr/",
"/May/", "/Jun/", "/Jul/", "/Aug/", "/Sep/", "/Oct/", "/Nov/", "/Dec/" };
unsigned int month = (date[4] - '0')*10 + (date[5] - '0');
month = (month > 12 ? 0 : month);
date = date.substr(6, 2) + months[month] + date.substr(0, 4);
- }
+ }
std::string descrip = date + " " +
meta->GetAttributeValue(DC::SeriesDescription).AsString() + " " +
meta->GetAttributeValue(DC::StudyID).AsString();
@@ -854,35 +800,35 @@ void dicomtonifti_convert_one(
std::string phase = meta->GetAttributeValue(
firstFile, firstFrame, vtkDICOMTag(0x0018,0x1312)).AsString();
if (phase == "COLUMN")
- {
+ {
hdr->SetDimInfo((permutation[2] << 4) +
(permutation[0] << 2) +
(permutation[1]));
- }
+ }
else if (phase == "ROW")
- {
+ {
hdr->SetDimInfo((permutation[2] << 4) +
(permutation[1] << 2) +
(permutation[0]));
- }
+ }
else if (phase == "OTHER")
- {
+ {
hdr->SetDimInfo(permutation[2] << 4);
- }
+ }
// get the scale information, if same for all slices
if (meta->GetAttributeValue(
firstFile, firstFrame, DC::RescaleSlope).IsValid())
- {
+ {
hdr->SetSclSlope(reader->GetRescaleSlope());
hdr->SetSclInter(reader->GetRescaleIntercept());
- }
+ }
// compute a cal_min, cal_max
bool useWindowLevel = false;
if (meta->GetAttributeValue(
firstFile, firstFrame, DC::WindowWidth).IsValid())
- {
+ {
useWindowLevel = true;
double w = meta->GetAttributeValue(
firstFile, firstFrame, DC::WindowWidth).GetDouble(0);
@@ -890,37 +836,37 @@ void dicomtonifti_convert_one(
firstFile, firstFrame, DC::WindowCenter).GetDouble(0);
int n = fileIndices->GetNumberOfTuples();
for (int i = 1; i < n; i++)
- {
+ {
int j = fileIndices->GetComponent(i, 0);
int k = frameIndices->GetComponent(i, 0);
double tw = meta->GetAttributeValue(j, k, DC::WindowWidth).GetDouble(0);
double tl = meta->GetAttributeValue(j, k, DC::WindowCenter).GetDouble(0);
if (tl != l || tw != w)
- {
+ {
useWindowLevel = false;
break;
- }
}
+ }
if (useWindowLevel)
- {
+ {
double m = hdr->GetSclSlope();
double b = hdr->GetSclInter();
if (m == 0)
- {
+ {
m = 1.0;
b = 0.0;
- }
+ }
hdr->SetCalMin((l - 0.5*w)*m + b);
hdr->SetCalMax((l + 0.5*w)*m + b);
- }
}
+ }
#if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9)
if (!useWindowLevel)
- {
+ {
std::string photometric =
meta->GetAttributeValue(DC::PhotometricInterpretation).AsString();
if (photometric == "MONOCHROME1" || photometric == "MONOCHROME2")
- {
+ {
// compute range rather than using DICOM window/level setting
vtkSmartPointer<vtkImageHistogramStatistics> histo =
vtkSmartPointer<vtkImageHistogramStatistics>::New();
@@ -929,12 +875,12 @@ void dicomtonifti_convert_one(
double hrange[2];
histo->GetAutoRange(hrange);
if (hrange[0] < hrange[1])
- {
+ {
hdr->SetCalMin(hrange[0]);
hdr->SetCalMax(hrange[1]);
- }
}
}
+ }
#endif
// prepare the writer to write the image
@@ -945,24 +891,24 @@ void dicomtonifti_convert_one(
writer->SetFileName(outfile);
if (reader->GetTimeDimension() > 1 &&
options->volume < 0)
- {
+ {
writer->SetTimeDimension(reader->GetTimeDimension());
writer->SetTimeSpacing(reader->GetTimeSpacing());
- }
+ }
if ((options->no_slice_reordering && slicesReordered) ||
options->fsl)
- {
+ {
// force NIFTI file to store images in original DICOM order
writer->SetQFac(-1.0);
- }
+ }
if (!options->no_qform)
- {
+ {
writer->SetQFormMatrix(matrix);
- }
+ }
if (!options->no_sform)
- {
+ {
writer->SetSFormMatrix(matrix);
- }
+ }
writer->SetInputConnection(lastOutput);
writer->Write();
dicomtonifti_check_error(writer);
@@ -989,24 +935,23 @@ void dicomtonifti_convert_files(
dicomtonifti_check_error(sorter);
if (!options->batch)
- {
+ {
std::string outfile = outpath;
if (options->compress)
- {
+ {
size_t os = strlen(outpath);
- if (os > 2 &&
- (outpath[os-3] != '.' ||
- tolower(outpath[os-2]) != 'g' ||
- tolower(outpath[os-1]) != 'z'))
- {
+ if (os < 3 || outpath[os-3] != '.' ||
+ tolower(outpath[os-2]) != 'g' ||
+ tolower(outpath[os-1]) != 'z')
+ {
outfile.append(".gz");
- }
}
+ }
dicomtonifti_convert_one(
options, sorter->GetOutputFileNames(), outfile.c_str());
- }
+ }
else
- {
+ {
vtkSmartPointer<vtkDICOMParser> parser =
vtkSmartPointer<vtkDICOMParser>::New();
vtkSmartPointer<vtkDICOMMetaData> meta =
@@ -1015,11 +960,11 @@ void dicomtonifti_convert_files(
int m = sorter->GetNumberOfStudies();
for (int j = 0; j < m; j++)
- {
+ {
int k = sorter->GetFirstSeriesForStudy(j);
int kl = sorter->GetLastSeriesForStudy(j);
for (; k <= kl; k++)
- {
+ {
// get metadata of first file
vtkStringArray *a = sorter->GetFileNamesForSeries(k);
std::string fname = a->GetValue(0);
@@ -1032,34 +977,40 @@ void dicomtonifti_convert_files(
std::string outfile =
dicomtonifti_make_filename(outpath, meta);
- if (options->compress)
- {
+ size_t os = outfile.length();
+ if (options->compress &&
+ (os < 3 || outfile[os-3] != '.' ||
+ tolower(outfile[os-2]) != 'g' ||
+ tolower(outfile[os-1]) != 'z'))
+ {
outfile.append(".gz");
- }
+ }
// make the directory for the file
if (k == sorter->GetFirstSeriesForStudy(j))
+ {
+ vtkDICOMFilePath path(outfile);
+ path.PopBack();
+ std::string dirname = path.AsString();
+ int code = vtkDICOMFileDirectory::Create(dirname.c_str());
+ if (code != vtkDICOMFileDirectory::Good)
{
- std::string dirname = vtksys::SystemTools::GetParentDirectory(
- outfile.c_str());
- if (!vtksys::SystemTools::MakeDirectory(dirname.c_str()))
- {
fprintf(stderr, "Cannot create directory: %s\n",
dirname.c_str());
exit(1);
- }
}
+ }
if (!options->silent)
- {
+ {
printf("%s\n", outfile.c_str());
- }
+ }
// convert the file
dicomtonifti_convert_one(options, a, outfile.c_str());
- }
}
}
+ }
}
// Process a list of files and directories
@@ -1074,71 +1025,74 @@ void dicomtonifti_files_and_dirs(
vtkSmartPointer<vtkStringArray>::New();
vtkIdType n = files->GetNumberOfValues();
for (vtkIdType i = 0; i < n; i++)
- {
+ {
std::string fname = files->GetValue(i);
+ vtkDICOMFilePath path(fname);
size_t m = fname.size();
if ((m > 1 && (fname[m-1] == '/' || fname[m-1] == '\\')) ||
- vtksys::SystemTools::FileIsDirectory(fname.c_str()))
- {
+ path.IsDirectory())
+ {
if (pastdirs->size() == 0 ||
(options->recurse &&
- (options->follow_symlinks ||
- !vtksys::SystemTools::FileIsSymlink(fname.c_str()))))
- {
+ (options->follow_symlinks || !path.IsSymlink())))
+ {
directories->InsertNextValue(fname.c_str());
- }
}
+ }
else
- {
+ {
newfiles->InsertNextValue(fname.c_str());
- }
}
+ }
if (newfiles->GetNumberOfValues() > 0)
- {
+ {
dicomtonifti_convert_files(options, newfiles, outpath);
- }
+ }
n = directories->GetNumberOfValues();
- vtksys::Directory directory;
- std::vector<std::string> pathparts;
for (vtkIdType i = 0; i < n; i++)
- {
+ {
std::string dirname = directories->GetValue(i);
+ vtkDICOMFilePath path(dirname);
// avoid infinite recursion
- std::string realpath = vtksys::SystemTools::GetRealPath(dirname.c_str());
+ std::string realpath = path.GetRealPath();
if (pastdirs->count(realpath)) { continue; }
pastdirs->insert(pastdirs->end(), realpath);
- if (!directory.Load(dirname.c_str()))
- {
+ vtkDICOMFileDirectory directory(dirname.c_str());
+ int code = directory.GetError();
+ if (code != vtkDICOMFileDirectory::Good)
+ {
fprintf(stderr, "Could not open directory %s\n", dirname.c_str());
- }
+ }
else
- {
+ {
files->Initialize();
- vtksys::SystemTools::SplitPath(directory.GetPath(), pathparts);
unsigned long nf = directory.GetNumberOfFiles();
for (unsigned long j = 0; j < nf; j++)
- {
+ {
const char *dirfile = directory.GetFile(j);
- if (dirfile[0] != '.')
- {
- pathparts.push_back(dirfile);
- std::string fullpath = vtksys::SystemTools::JoinPath(pathparts);
- files->InsertNextValue(fullpath);
- pathparts.pop_back();
- }
+ if (dirfile[0] != '.' || (dirfile[1] != '\0' &&
+ (dirfile[1] != '.' || dirfile[2] != '\0')))
+ {
+ path.PushBack(dirfile);
+ files->InsertNextValue(path.AsString());
+ path.PopBack();
}
- dicomtonifti_files_and_dirs(options, files, outpath, pastdirs);
}
+ dicomtonifti_files_and_dirs(options, files, outpath, pastdirs);
}
+ }
}
// This program will convert DICOM to NIFTI
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
// for the list of input DICOM files
vtkSmartPointer<vtkStringArray> files =
vtkSmartPointer<vtkStringArray>::New();
@@ -1152,41 +1106,36 @@ MAINMACRO(argc, argv)
// the output (NIFTI file or directory)
const char *outpath = options.output;
if (!outpath)
- {
+ {
fprintf(stderr,
"\nNo output file was specified (\'-o\' <filename>).\n\n");
dicomtonifti_usage(stderr, argv[0]);
exit(1);
- }
+ }
- bool isDirectory = vtksys::SystemTools::FileIsDirectory(outpath);
+ int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
size_t l = strlen(outpath);
- std::string tmp;
- if (options.batch && isDirectory)
- {
- std::vector<std::string> sv;
- vtksys::SystemTools::SplitPath(outpath, sv);
-
- sv.push_back(
+ vtkDICOMFilePath tmp(outpath);
+ if (options.batch && code == vtkDICOMFile::FileIsDirectory)
+ {
+ tmp.PushBack(
"{PatientID}-{StudyDate}-{SeriesDescription}-{SeriesNumber}.nii");
-
- tmp = vtksys::SystemTools::JoinPath(sv);
- outpath = tmp.c_str();
- }
- else if (!options.batch && (isDirectory ||
+ outpath = tmp.AsString().c_str();
+ }
+ else if (!options.batch && (code == vtkDICOMFile::FileIsDirectory ||
(l > 0 && (outpath[l-1] == '/' || outpath[l-1] == '\\'))))
- {
+ {
fprintf(stderr, "The -o option must give a file, not a directory.\n");
exit(1);
- }
+ }
// make sure that input files were provided
if (files->GetNumberOfValues() == 0)
- {
+ {
fprintf(stderr, "\nNo input files were specified.\n\n");
dicomtonifti_usage(stderr, argv[0]);
exit(1);
- }
+ }
std::set<std::string> pastdirs;
dicomtonifti_files_and_dirs(&options, files, outpath, &pastdirs);
diff --git a/Programs/nifticenter.cxx b/Programs/nifticenter.cxx
index 40cfca6..e435912 100644
--- a/Programs/nifticenter.cxx
+++ b/Programs/nifticenter.cxx
@@ -25,6 +25,7 @@
#include <stdlib.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// remove path portion of filename
@@ -36,15 +37,18 @@ const char *basename(const char *filename)
}
// This program will convert
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
int rval = 0;
if (argc < 2)
- {
+ {
printf("usage: %s input.nii output.nii\n", basename(argv[0]));
return rval;
- }
+ }
vtkSmartPointer<vtkNIFTIReader> reader =
vtkSmartPointer<vtkNIFTIReader>::New();
diff --git a/Programs/niftidump.cxx b/Programs/niftidump.cxx
index edcb419..b3e81ab 100644
--- a/Programs/niftidump.cxx
+++ b/Programs/niftidump.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -16,16 +16,18 @@
#include "vtkNIFTIReader.h"
#include "vtkNIFTIHeader.h"
#include "vtkNIFTIPrivate.h"
-#include "vtkMatrix4x4.h"
-#include "vtkStringArray.h"
+#include <vtkMatrix4x4.h>
+#include <vtkStringArray.h>
#include <vtkSmartPointer.h>
#include <stdio.h>
+#include <ctype.h>
#include <string.h>
#include <stdlib.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// print the version
@@ -33,7 +35,7 @@ void printVersion(FILE *file, const char *cp)
{
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
}
@@ -56,6 +58,34 @@ void printHelp(FILE *file, const char *cp)
"Dump the header from a NIfTI file.\n");
}
+// sanitize a string (remove unprintable characters)
+#define SANITIZE_BUFSIZE 82
+const char *stringSanitize(
+ char op[SANITIZE_BUFSIZE], const char *cp, size_t l)
+{
+ if (l >= SANITIZE_BUFSIZE)
+ {
+ l = SANITIZE_BUFSIZE - 1;
+ }
+
+ size_t i;
+ for (i = 0; i < l && cp[i] != '\0'; i++)
+ {
+ if (isprint(cp[i]))
+ {
+ op[i] = cp[i];
+ }
+ else
+ {
+ op[i] = '?';
+ }
+ }
+
+ op[i] = '\0';
+
+ return op;
+}
+
// remove path portion of filename
const char *fileBasename(const char *filename)
{
@@ -65,25 +95,28 @@ const char *fileBasename(const char *filename)
}
// This program will convert
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
int rval = 0;
if (argc < 2)
- {
+ {
printUsage(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--help") == 0)
- {
+ {
printHelp(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--version") == 0)
- {
+ {
printVersion(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
vtkSmartPointer<vtkNIFTIReader> reader =
vtkSmartPointer<vtkNIFTIReader>::New();
@@ -94,13 +127,13 @@ MAINMACRO(argc, argv)
reader->GetNIFTIHeader()->GetHeader(&hdr);
int version = 0;
if (hdr.magic[2] >= '0' && hdr.magic[2] <= '9')
- {
+ {
version = hdr.magic[2] - '0';
- }
+ }
const char *datatypeName = "";
switch (hdr.datatype)
- {
+ {
case NIFTI_TYPE_UINT8:
datatypeName = "uint8";
break;
@@ -149,7 +182,7 @@ MAINMACRO(argc, argv)
case NIFTI_TYPE_RGBA32:
datatypeName = "rgba32";
break;
- }
+ }
static const char *intentCodes[25] = {
"none", "unknown", "correl", "ttest",
@@ -170,21 +203,21 @@ MAINMACRO(argc, argv)
short ic = hdr.intent_code;
const char *intentCode = "unknown";
if (ic >= 0 && ic <= 25)
- {
+ {
intentCode = intentCodes[ic];
- }
+ }
else if (ic >= 1000 && ic <= 1011)
- {
+ {
intentCode = intentCodes1000[ic-1000];
- }
+ }
else if (ic >= 2000 && ic <= 2005)
- {
+ {
intentCode = intentCodes2000[ic-2000];
- }
+ }
const char *spaceUnits = "unknown";
switch (hdr.xyzt_units & 0x7)
- {
+ {
case 1:
spaceUnits = "meters";
break;
@@ -194,11 +227,11 @@ MAINMACRO(argc, argv)
case 3:
spaceUnits = "microns";
break;
- }
+ }
const char *timeUnits = "unknown";
switch (hdr.xyzt_units & 0x38)
- {
+ {
case 8:
timeUnits = "seconds";
break;
@@ -217,11 +250,11 @@ MAINMACRO(argc, argv)
case 48:
timeUnits = "radians";
break;
- }
+ }
const char *sliceCode = "unknown";
switch (hdr.slice_code)
- {
+ {
case 1:
sliceCode = "seq_inc";
break;
@@ -240,16 +273,16 @@ MAINMACRO(argc, argv)
case 6:
sliceCode = "alt_dec2";
break;
- }
+ }
const char *xformCode[2] = { "unknown", "unknown" };
short xc[2];
xc[0] = hdr.qform_code;
xc[1] = hdr.sform_code;
for (int i = 0; i < 2; i++)
- {
+ {
switch (xc[i])
- {
+ {
case 1:
xformCode[i] = "scanner_anat";
break;
@@ -262,128 +295,107 @@ MAINMACRO(argc, argv)
case 4:
xformCode[i] = "mni_152";
break;
- }
}
+ }
- cout << "sizeof_hdr: " << (version >= 2 ?
- vtkNIFTIHeader::Nifti2HeaderSize :
- vtkNIFTIHeader::Nifti1HeaderSize) << "\n";
- cout << "vox_offset: " << hdr.vox_offset << "\n";
- //cout << "data_type: " << hdr.data_type << "\n";
- //cout << "db_name: " << hdr.db_name << "\n";
- //cout << "extents: " << hdr.extents << "\n";
- //cout << "session_error: " << hdr.session_error << "\n";
- //cout << "regular: " << static_cast<int>(hdr.regular) << "\n";
- cout.setf(std::ios::hex, std::ios::basefield);
- cout << "dim_info: 0x" << static_cast<int>(hdr.dim_info);
+ // temporary space
+ char buf[SANITIZE_BUFSIZE];
+
+ printf("sizeof_hdr: %d\n", (version >= 2 ?
+ vtkNIFTIHeader::Nifti2HeaderSize :
+ vtkNIFTIHeader::Nifti1HeaderSize));
+ printf("vox_offset: %lld\n", hdr.vox_offset);
+ //printf("data_type: %.10s\n", hdr.data_type);
+ //printf("db_name: %.18s\n", hdr.db_name);
+ //printf("extents: %d\n", hdr.extents);
+ //printf("session_error: %d\n", hdr.session_error);
+ //printf("regular: %d\n", hdr.regular);
+ printf("dim_info: 0x%x", hdr.dim_info);
if (hdr.dim_info == 0)
- {
- cout << " (unknown)\n";
- }
+ {
+ printf(" (unknown)\n");
+ }
else
- {
- cout << " (freq_dim=" << (hdr.dim_info & 0x3)
- << ", phase_dim=" << ((hdr.dim_info >> 2) & 0x3)
- << ", slice_dim=" << ((hdr.dim_info >> 4) & 0x3) << ")\n";
- }
- cout.unsetf(std::ios::hex);
- cout << "dim:";
+ {
+ printf(" (freq_dim=%d, phase_dim=%d, slice_dim=%d\n",
+ (hdr.dim_info & 0x3),
+ ((hdr.dim_info >> 2) & 0x3),
+ ((hdr.dim_info >> 4) & 0x3));
+ }
+ printf("dim:");
for (int i = 0; i < 8; i++)
- {
- cout << " " << hdr.dim[i];
- }
- cout << "\n";
- cout << "pixdim:";
+ {
+ printf(" %lld", hdr.dim[i]);
+ }
+ printf("\n");
+ printf("pixdim:");
for (int i = 0; i < 8; i++)
- {
- cout << " " << hdr.pixdim[i];
- }
- cout << "\n";
- cout.setf(std::ios::hex, std::ios::basefield);
- cout << "xyzt_units: 0x" << static_cast<int>(hdr.xyzt_units)
- << " (" << spaceUnits << ", " << timeUnits << ")\n";
- cout.unsetf(std::ios::hex);
+ {
+ printf(" %g", hdr.pixdim[i]);
+ }
+ printf("\n");
+ printf("xyzt_units: 0x%x (%s, %s)\n",
+ hdr.xyzt_units, spaceUnits, timeUnits);
if (version > 0)
- {
- cout << "intent_code: " << hdr.intent_code
- << " (" << intentCode << ")\n";
- cout << "intent_name: \"";
- for (size_t j = 0;
- j < sizeof(hdr.intent_name) && hdr.intent_name[j] != '\0';
- j++)
- {
- cout << (isprint(hdr.intent_name[j]) ? hdr.intent_name[j] : '?');
- }
- cout << "\"\n";
- cout << "intent_p1: " << hdr.intent_p1 << "\n";
- cout << "intent_p2: " << hdr.intent_p2 << "\n";
- cout << "intent_p3: " << hdr.intent_p3 << "\n";
- }
- cout << "datatype: " << hdr.datatype
- << " (" << datatypeName << ")\n";
- cout << "bitpix: " << hdr.bitpix << "\n";
+ {
+ printf("intent_code: %d (%s)\n",
+ hdr.intent_code, intentCode);
+ printf("intent_name: \"%s\"\n",
+ stringSanitize(buf, hdr.intent_name, sizeof(hdr.intent_name)));
+ printf("intent_p1: %g\n", hdr.intent_p1);
+ printf("intent_p2: %g\n", hdr.intent_p2);
+ printf("intent_p3: %g\n", hdr.intent_p3);
+ }
+ printf("datatype: %d (%s)\n", hdr.datatype, datatypeName);
+ printf("bitpix: %d\n", hdr.bitpix);
if (version > 0)
+ {
+ printf("scl_slope: %g\n", hdr.scl_slope);
+ printf("scl_inter: %g\n", hdr.scl_inter);
+ printf("cal_max: %g\n", hdr.cal_max);
+ printf("cal_min: %g\n", hdr.cal_min);
+ printf("slice_code: %d (%s)\n", hdr.slice_code, sliceCode);
+ printf("slice_start: %lld\n", hdr.slice_start);
+ printf("slice_end: %lld\n", hdr.slice_end);
+ printf("slice_duration: %g\n", hdr.slice_duration);
+ printf("toffset: %g\n", hdr.toffset);
+ }
+ printf("descrip: \"%s\"\n",
+ stringSanitize(buf, hdr.descrip, sizeof(hdr.descrip)));
+ printf("aux_file: \"%s\"\n",
+ stringSanitize(buf, hdr.aux_file, sizeof(hdr.aux_file)));
+ if (version > 0)
+ {
+ printf("qform_code: %d (%s)\n", hdr.qform_code, xformCode[0]);
+ printf("sform_code: %d (%s)\n", hdr.sform_code, xformCode[1]);
+ printf("quatern_b: %g\n", hdr.quatern_b);
+ printf("quatern_c: %g\n", hdr.quatern_c);
+ printf("quatern_d: %g\n", hdr.quatern_d);
+ printf("qoffset_x: %g\n", hdr.qoffset_x);
+ printf("qoffset_y: %g\n", hdr.qoffset_y);
+ printf("qoffset_z: %g\n", hdr.qoffset_z);
+ printf("srow_x:");
+ for (int i = 0; i < 4; i++)
{
- cout << "scl_slope: " << hdr.scl_slope << "\n";
- cout << "scl_inter: " << hdr.scl_inter << "\n";
- cout << "cal_max: " << hdr.cal_max << "\n";
- cout << "cal_min: " << hdr.cal_min << "\n";
- cout << "slice_code: " << static_cast<int>(hdr.slice_code)
- << " (" << sliceCode << ")\n";
- cout << "slice_start: " << hdr.slice_start << "\n";
- cout << "slice_end: " << hdr.slice_end << "\n";
- cout << "slice_duration: " << hdr.slice_duration << "\n";
- cout << "toffset: " << hdr.toffset << "\n";
- }
- cout << "descrip: \"";
- for (size_t j = 0; j < sizeof(hdr.descrip) && hdr.descrip[j] != '\0'; j++)
- {
- cout << (isprint(hdr.descrip[j]) ? hdr.descrip[j] : '?');
+ printf(" %g", hdr.srow_x[i]);
}
- cout << "\"\n";
- cout << "aux_file: \"";
- for (size_t j = 0; j < sizeof(hdr.aux_file) && hdr.aux_file[j] != '\0'; j++)
+ printf("\n");
+ printf("srow_y:");
+ for (int i = 0; i < 4; i++)
{
- cout << (isprint(hdr.aux_file[j]) ? hdr.aux_file[j] : '?');
+ printf(" %g", hdr.srow_y[i]);
}
- cout << "\"\n";
- if (version > 0)
- {
- cout << "qform_code: " << hdr.qform_code
- << " (" << xformCode[0] << ")\n";
- cout << "sform_code: " << hdr.sform_code
- << " (" << xformCode[1] << ")\n";
- cout << "quatern_b: " << hdr.quatern_b << "\n";
- cout << "quatern_c: " << hdr.quatern_c << "\n";
- cout << "quatern_d: " << hdr.quatern_d << "\n";
- cout << "qoffset_x: " << hdr.qoffset_x << "\n";
- cout << "qoffset_y: " << hdr.qoffset_y << "\n";
- cout << "qoffset_z: " << hdr.qoffset_z << "\n";
- cout << "srow_x:";
+ printf("\n");
+ printf("srow_z:");
for (int i = 0; i < 4; i++)
- {
- cout << " " << hdr.srow_x[i];
- }
- cout << "\n";
- cout << "srow_y:";
- for (int i = 0; i < 4; i++)
- {
- cout << " " << hdr.srow_y[i];
- }
- cout << "\n";
- cout << "srow_z:";
- for (int i = 0; i < 4; i++)
- {
- cout << " " << hdr.srow_z[i];
- }
- cout << "\n";
- cout << "magic: \"";
- for (size_t j = 0; j < sizeof(hdr.magic) && hdr.magic[j] != '\0'; j++)
- {
- cout << (isprint(hdr.magic[j]) ? hdr.magic[j] : '?');
- }
- cout << "\"" << endl;
+ {
+ printf(" %g", hdr.srow_z[i]);
}
+ printf("\n");
+ printf("magic: \"%s\"\n",
+ stringSanitize(buf, hdr.magic, sizeof(hdr.magic)));
+ fflush(stdout);
+ }
return rval;
}
diff --git a/Programs/niftitodicom.cxx b/Programs/niftitodicom.cxx
index a9aa9b0..e414f22 100644
--- a/Programs/niftitodicom.cxx
+++ b/Programs/niftitodicom.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -24,6 +24,8 @@
#include "vtkDICOMToRAS.h"
#include "vtkDICOMCTRectifier.h"
#include "vtkDICOMUtilities.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
#include "vtkNIFTIHeader.h"
#include "vtkNIFTIReader.h"
@@ -42,10 +44,6 @@
#include <vtkImageHistogramStatistics.h>
#endif
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
#include <string>
#include <vector>
#include <set>
@@ -56,6 +54,7 @@
#include <ctype.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// Kinds of reformats
@@ -89,19 +88,19 @@ void niftitodicom_version(FILE *file, const char *command_name, bool verbose)
while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
if (!verbose)
- {
+ {
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
- }
+ }
else
- {
+ {
fprintf(file,
"Head %8.8s, Built %s, %s\n",
DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
- }
+ }
}
@@ -176,32 +175,32 @@ void niftitodicom_check_error(vtkObject *o)
const char *filename = 0;
unsigned long errorcode = 0;
if (writer)
- {
+ {
filename = writer->GetFileName();
errorcode = writer->GetErrorCode();
- }
+ }
else if (reader)
- {
+ {
filename = reader->GetInternalFileName();
errorcode = reader->GetErrorCode();
- }
+ }
else if (sorter)
- {
+ {
filename = sorter->GetInternalFileName();
errorcode = sorter->GetErrorCode();
- }
+ }
else if (parser)
- {
+ {
filename = parser->GetFileName();
errorcode = parser->GetErrorCode();
- }
+ }
if (!filename)
- {
+ {
filename = "";
- }
+ }
switch(errorcode)
- {
+ {
case vtkErrorCode::NoError:
return;
case vtkErrorCode::FileNotFoundError:
@@ -228,65 +227,11 @@ void niftitodicom_check_error(vtkObject *o)
default:
fprintf(stderr, "An unknown error occurred.\n");
break;
- }
+ }
exit(1);
}
-// Add a dicom file to the list, expand if wildcard
-void niftitodicom_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
- bool ispattern = false;
- bool hasbackslash = false;
- size_t n = strlen(filepath);
- for (size_t i = 0; i < n; i++)
- {
- if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
- {
- ispattern = true;
- }
- if (filepath[i] == '\\')
- {
- hasbackslash = true;
- }
- }
-
- std::string newpath = filepath;
- if (hasbackslash)
- {
- // backslashes interfere with vtksys::Glob
- vtksys::SystemTools::ConvertToUnixSlashes(newpath);
- }
- filepath = newpath.c_str();
-
- if (ispattern)
- {
- vtksys::Glob glob;
- if (glob.FindFiles(filepath))
- {
- const std::vector<std::string> &globfiles = glob.GetFiles();
- size_t m = globfiles.size();
- for (size_t j = 0; j < m; j++)
- {
- files->InsertNextValue(globfiles[j]);
- }
- }
- else
- {
- fprintf(stderr, "Could not match pattern: %s\n", filepath);
- exit(1);
- }
- }
- else
- {
- files->InsertNextValue(filepath);
- }
-#else
- files->InsertNextValue(filepath);
-#endif
-}
-
// Check that a file has a NIFTI name
bool isNIFTIFileName(const char *f)
{
@@ -296,13 +241,13 @@ bool isNIFTIFileName(const char *f)
size_t n = strlen(f);
for (const char **s = suffixes; *s != 0; s++)
- {
+ {
size_t m = strlen(*s);
if (n > m && strcmp(f + n - m, *s) == 0)
- {
+ {
return true;
- }
}
+ }
return false;
}
@@ -326,177 +271,177 @@ void niftitodicom_read_options(
// read the options from the command line
int argi = 1;
while (argi < argc)
- {
+ {
const char *arg = argv[argi++];
if (arg[0] == '-')
- {
+ {
if (strcmp(arg, "--") == 0)
- {
+ {
// stop processing switches
break;
- }
+ }
else if (strcmp(arg, "--modality") == 0 ||
strcmp(arg, "--series-description") == 0 ||
strcmp(arg, "--series-number") == 0 ||
strcmp(arg, "--uid-prefix") == 0)
- {
+ {
if (argi >= argc ||
argv[argi][0] == '-')
- {
+ {
fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg);
exit(1);
- }
+ }
if (strcmp(arg, "--modality") == 0)
- {
+ {
options->modality = argv[argi];
- }
+ }
else if (strcmp(arg, "--series-description") == 0)
- {
+ {
options->series_description = argv[argi];
- }
+ }
else if (strcmp(arg, "--series-number") == 0)
- {
+ {
options->series_number= argv[argi];
- }
+ }
else if (strcmp(arg, "--uid-prefix") == 0)
- {
+ {
options->uid_prefix = argv[argi];
- }
- argi++;
}
+ argi++;
+ }
else if (strcmp(arg, "--axial") == 0)
- {
+ {
options->mpr = MPRAxial;
- }
+ }
else if (strcmp(arg, "--coronal") == 0)
- {
+ {
options->mpr = MPRCoronal;
- }
+ }
else if (strcmp(arg, "--sagittal") == 0)
- {
+ {
options->mpr = MPRSagittal;
- }
+ }
else if (strcmp(arg, "--no-reordering") == 0)
- {
+ {
options->no_reordering = true;
- }
+ }
else if (strcmp(arg, "--silent") == 0)
- {
+ {
options->silent = true;
- }
+ }
else if (strcmp(arg, "--verbose") == 0)
- {
+ {
options->verbose = true;
- }
+ }
else if (strcmp(arg, "--version") == 0)
- {
+ {
niftitodicom_version(stdout, argv[0], false);
exit(0);
- }
+ }
else if (strcmp(arg, "--build-version") == 0)
- {
+ {
niftitodicom_version(stdout, argv[0], true);
exit(0);
- }
+ }
else if (strcmp(arg, "--help") == 0)
- {
+ {
niftitodicom_help(stdout, argv[0]);
exit(0);
- }
+ }
else if (arg[0] == '-' && arg[1] == '-')
- {
+ {
fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
else if (arg[0] == '-' && arg[1] != '-')
- {
+ {
for (int argj = 1; arg[argj] != '\0'; argj++)
- {
+ {
if (arg[argj] == 's')
- {
+ {
options->silent = true;
- }
+ }
else if (arg[argj] == 'v')
- {
+ {
options->verbose = true;
- }
+ }
else if (arg[argj] == 'o')
- {
+ {
if (arg[argj+1] != '\0')
- {
+ {
arg += argj+1;
- }
+ }
else
- {
+ {
if (argi >= argc)
- {
+ {
fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
- arg = argv[argi++];
}
+ arg = argv[argi++];
+ }
options->output = arg;
break;
- }
+ }
else
- {
+ {
fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
+ }
else
- {
- niftitodicom_add_file(files, arg);
+ {
+ files->InsertNextValue(arg);
vtkIdType m = files->GetMaxId();
if (m >= 0)
- {
+ {
const char *f = files->GetValue(m);
if (isNIFTIFileName(f))
- {
+ {
if (options->input == 0)
- {
+ {
options->input = arg;
files->SetNumberOfValues(m);
- }
+ }
else
- {
+ {
fprintf(stderr, "\nAt most one NIFTI file can be specified.\n");
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
}
+ }
while (argi < argc)
- {
- niftitodicom_add_file(files, argv[argi++]);
+ {
+ files->InsertNextValue(argv[argi++]);
vtkIdType m = files->GetMaxId();
if (m >= 0)
- {
+ {
const char *f = files->GetValue(m);
if (isNIFTIFileName(f))
- {
+ {
if (options->input == 0)
- {
+ {
options->input = argv[argi-1];
files->SetNumberOfValues(m);
- }
+ }
else
- {
+ {
fprintf(stderr, "\nAt most one NIFTI file can be specified.\n");
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
+ }
}
// Convert one NIFTI file into a DICOM series
@@ -518,21 +463,21 @@ void niftitodicom_convert_one(
dicomReader->SetMemoryRowOrderToFileNative();
vtkMatrix4x4 *readerMatrix = 0;
if (a->GetNumberOfValues() > 0)
- {
+ {
dicomReader->UpdateInformation();
meta->DeepCopy(dicomReader->GetMetaData());
readerMatrix = dicomReader->GetPatientMatrix();
- }
+ }
// set the metadata supplied on the command line
if (options->series_description)
- {
+ {
meta->SetAttributeValue(DC::SeriesDescription, options->series_description);
- }
+ }
if (options->series_number)
- {
+ {
meta->SetAttributeValue(DC::SeriesNumber, options->series_number);
- }
+ }
// read the NIFTI file
vtkSmartPointer<vtkNIFTIReader> reader =
@@ -553,15 +498,15 @@ void niftitodicom_convert_one(
vtkMatrix4x4 *inputMatrix = 0;
int xformCode = 0;
if (reader->GetQFormMatrix())
- {
+ {
inputMatrix = reader->GetQFormMatrix();
xformCode = hdr->GetQFormCode();
- }
+ }
else if (reader->GetSFormMatrix())
- {
+ {
inputMatrix = reader->GetSFormMatrix();
xformCode = hdr->GetSFormCode();
- }
+ }
// convert to NIFTI coordinate system
vtkSmartPointer<vtkDICOMToRAS> converter =
@@ -578,15 +523,15 @@ void niftitodicom_convert_one(
vtkSmartPointer<vtkMatrix4x4> checkMatrix =
vtkSmartPointer<vtkMatrix4x4>::New();
if (inputMatrix)
- {
+ {
checkMatrix->DeepCopy(inputMatrix);
- }
+ }
// undo the NIFTI to DICOM x = -x, y = -y conversion in check matrix
for (int j = 0; j < 4; j++)
- {
+ {
checkMatrix->Element[0][j] = -checkMatrix->Element[0][j];
checkMatrix->Element[1][j] = -checkMatrix->Element[1][j];
- }
+ }
checkMatrix->Invert();
// checkMatrix = PatientMatrix^(-1) * RASMatrix
vtkMatrix4x4::Multiply4x4(
@@ -607,7 +552,7 @@ void niftitodicom_convert_one(
int permutation[3] = { 0, 1, 2 };
if (options->mpr)
- {
+ {
// this becomes meaningless after reformatting
slicesReordered = false;
@@ -619,50 +564,50 @@ void niftitodicom_convert_one(
int prevmaxj = -1;
int prevmaxi = -1;
for (int kdim = 0; kdim < 2; kdim++)
- {
+ {
int maxj = 0;
int maxi = 0;
double maxv = -0.0;
for (int jdim = 0; jdim < 3; jdim++)
- {
+ {
if (jdim == prevmaxj) { continue; }
for (int idim = 0; idim < 3; idim++)
- {
+ {
if (idim == prevmaxi) { continue; }
double v = axes->GetElement(jdim, idim);
if (v*v >= maxv)
- {
+ {
maxi = idim;
maxj = jdim;
maxv = v*v;
- }
}
}
+ }
maxidx[maxj] = maxi;
value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0);
prevmaxj = maxj;
prevmaxi = maxi;
- }
+ }
axes->Zero();
axes->SetElement(3, 3, 1.0);
for (int jdim = 0; jdim < 3; jdim++)
- {
+ {
int idim = maxidx[jdim];
if (idim < 0)
- {
+ {
idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3];
maxidx[jdim] = idim;
double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0);
value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm;
- }
+ }
permutation[jdim] = idim;
axes->SetElement(jdim, idim, value[jdim]);
- }
+ }
// change the permutation to the desired mpr
if (options->mpr == MPRCoronal)
- {
+ {
double cmatrix[16] = {
1.0, 0.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
@@ -673,9 +618,9 @@ void niftitodicom_convert_one(
permutation[0] = tperm[0];
permutation[1] = tperm[2];
permutation[2] = tperm[1];
- }
+ }
else if (options->mpr == MPRSagittal)
- {
+ {
double smatrix[16] = {
0.0, 0.0,-1.0, 0.0,
1.0, 0.0, 0.0, 0.0,
@@ -686,7 +631,7 @@ void niftitodicom_convert_one(
permutation[0] = tperm[1];
permutation[1] = tperm[2];
permutation[2] = tperm[0];
- }
+ }
// reformat with the permuted axes
reformat->SetResliceAxes(axes);
@@ -695,7 +640,7 @@ void niftitodicom_convert_one(
// factor out the permuted axes
vtkMatrix4x4::Multiply4x4(matrix, axes, matrix);
- }
+ }
// convert to signed short if not short
int scalarType = reader->GetOutput()->GetScalarType();
@@ -705,16 +650,16 @@ void niftitodicom_convert_one(
// whether to allow 8-bit DICOM
bool allowUnsignedChar = false;
if (options->modality && strcmp(options->modality, "SC") == 0)
- {
+ {
allowUnsignedChar = true;
- }
+ }
if (scalarType != VTK_SHORT && scalarType != VTK_UNSIGNED_SHORT &&
(scalarType != VTK_UNSIGNED_CHAR || !allowUnsignedChar))
- {
+ {
#if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9)
if (scalarType == VTK_FLOAT || scalarType == VTK_DOUBLE)
- {
+ {
// compute range
vtkSmartPointer<vtkImageHistogramStatistics> histo =
vtkSmartPointer<vtkImageHistogramStatistics>::New();
@@ -726,33 +671,33 @@ void niftitodicom_convert_one(
histo->GetAutoRange(autoRange);
if (minVal > 32768.0 || maxVal > 32767.0)
- {
+ {
// scale down if out-of-range
double v = (maxVal > minVal ? maxVal : minVal);
caster->SetScale(32767.0/v);
- }
+ }
else if (minVal < 2.047 && maxVal < 2.047)
- {
+ {
// scale up by 1000 if values are very small
caster->SetScale(1000.0);
- }
+ }
else if (minVal < 20.47 && maxVal < 20.47)
- {
+ {
// scale up by 100 if values are small
caster->SetScale(100.0);
- }
+ }
else if (minVal < 204.7 && maxVal < 204.7)
- {
+ {
// scale up by 10
caster->SetScale(10.0);
- }
}
+ }
#endif
caster->SetInputConnection(lastOutput);
caster->SetOutputScalarType(VTK_SHORT);
lastOutput = caster->GetOutputPort();
- }
+ }
// check if requested to write as a CT tilted-gantry series via the
// series of files that were sent to the reader
@@ -760,7 +705,7 @@ void niftitodicom_convert_one(
vtkSmartPointer<vtkDICOMCTRectifier>::New();
if (readerMatrix &&
fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(readerMatrix)) > 0.01)
- {
+ {
rectifier->SetInputConnection(lastOutput);
rectifier->SetVolumeMatrix(readerMatrix);
rectifier->ReverseOn();
@@ -772,35 +717,35 @@ void niftitodicom_convert_one(
vtkMatrix4x4::Multiply4x4(testMatrix, matrix, testMatrix);
bool isIdentity = true;
for (int ii = 0; ii < 4; ii++)
- {
+ {
for (int jj = 0; jj < 4; jj++)
- {
+ {
double dd = testMatrix->GetElement(ii,jj) - (ii == jj);
isIdentity &= (fabs(dd) < 1e-3);
- }
}
+ }
if (isIdentity)
- {
+ {
// exactly the same orientation, so write like the reader's series
rectifier->Update();
lastOutput = rectifier->GetOutputPort();
matrix = readerMatrix;
- }
}
+ }
// mix in the NIFTI header information
if (xformCode == vtkNIFTIHeader::XFormTalairach)
- {
+ {
meta->SetAttributeValue(DC::FrameOfReferenceUID, "1.2.840.10008.1.4.1.1");
- }
+ }
else if (xformCode == vtkNIFTIHeader::XFormMNI152)
- {
+ {
meta->SetAttributeValue(DC::FrameOfReferenceUID, "1.2.840.10008.1.4.1.15");
- }
+ }
else if (xformCode != vtkNIFTIHeader::XFormScannerAnat)
- {
+ {
meta->RemoveAttribute(DC::FrameOfReferenceUID);
- }
+ }
// make the generator
vtkSmartPointer<vtkDICOMMRGenerator> mrgenerator =
@@ -809,44 +754,44 @@ void niftitodicom_convert_one(
vtkSmartPointer<vtkDICOMCTGenerator>::New();
vtkDICOMGenerator *generator = mrgenerator;
if (options->modality)
- {
+ {
if (strcmp(options->modality, "CT") == 0)
- {
+ {
generator = ctgenerator;
- }
+ }
else if (strcmp(options->modality, "MR") == 0 ||
strcmp(options->modality, "MRI") == 0)
- {
+ {
generator = mrgenerator;
- }
+ }
else
- {
+ {
generator = 0;
- }
}
+ }
// prepare the writer to write the image
vtkSmartPointer<vtkDICOMWriter> writer =
vtkSmartPointer<vtkDICOMWriter>::New();
if (generator)
- {
+ {
writer->SetGenerator(generator);
- }
+ }
writer->SetMetaData(meta);
writer->SetFilePrefix(outfile);
writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
writer->TimeAsVectorOn();
if (reader->GetTimeDimension() > 1)
- {
+ {
writer->SetTimeDimension(reader->GetTimeDimension());
writer->SetTimeSpacing(reader->GetTimeSpacing());
- }
+ }
writer->SetPatientMatrix(matrix);
if (reader->GetRescaleSlope() > 0)
- {
+ {
writer->SetRescaleSlope(reader->GetRescaleSlope());
writer->SetRescaleIntercept(reader->GetRescaleIntercept());
- }
+ }
writer->SetInputConnection(lastOutput);
writer->SetMemoryRowOrderToFileNative();
writer->Write();
@@ -880,8 +825,11 @@ void niftitodicom_convert_files(
}
// This program will convert NIFTI to DICOM
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
// for the list of input DICOM files
vtkSmartPointer<vtkStringArray> files =
vtkSmartPointer<vtkStringArray>::New();
@@ -894,40 +842,39 @@ MAINMACRO(argc, argv)
// set the UID prefix
if (options.uid_prefix)
- {
+ {
vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix);
- }
+ }
// the output (NIFTI file or directory)
const char *outpath = options.output;
if (!outpath)
- {
+ {
fprintf(stderr,
"\nNo output directory was specified (\'-o\' <directory>).\n\n");
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
if (!options.input)
- {
+ {
fprintf(stderr,
"\nNo input file was specified (.nii or .nii.gz).\n\n");
niftitodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
- if (vtksys::SystemTools::FileExists(outpath))
- {
- if (!vtksys::SystemTools::FileIsDirectory(outpath))
- {
- fprintf(stderr, "option -o must give a directory, not a file.\n");
- exit(1);
- }
- }
- else if (!vtksys::SystemTools::MakeDirectory(outpath))
- {
+ int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
+ if (code != vtkDICOMFile::FileIsDirectory)
+ {
+ fprintf(stderr, "option -o must give a directory, not a file.\n");
+ exit(1);
+ }
+ code = vtkDICOMFileDirectory::Create(outpath);
+ if (code != vtkDICOMFileDirectory::Good)
+ {
fprintf(stderr, "Cannot create directory: %s\n", outpath);
exit(1);
- }
+ }
niftitodicom_convert_files(&options, files, outpath);
diff --git a/Programs/scancodump.cxx b/Programs/scancodump.cxx
index 5ec448e..630e023 100644
--- a/Programs/scancodump.cxx
+++ b/Programs/scancodump.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -21,6 +21,7 @@
#include <stdlib.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// print the version
@@ -28,7 +29,7 @@ void printVersion(FILE *file, const char *cp)
{
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n"
"\n");
@@ -60,25 +61,28 @@ const char *fileBasename(const char *filename)
}
// This program will convert
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
int rval = 0;
if (argc < 2)
- {
+ {
printUsage(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--help") == 0)
- {
+ {
printHelp(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
else if (argc == 2 && strcmp(argv[1], "--version") == 0)
- {
+ {
printVersion(stdout, fileBasename(argv[0]));
return rval;
- }
+ }
vtkSmartPointer<vtkScancoCTReader> reader =
vtkSmartPointer<vtkScancoCTReader>::New();
@@ -92,57 +96,58 @@ MAINMACRO(argc, argv)
reader->GetDataSpacing(spacing);
reader->GetDataExtent(extent);
- cout << "Version: " << reader->GetVersion() << "\n";
- cout << "CreationDate: " << reader->GetCreationDate() << "\n";
+ printf("Version: %s\n", reader->GetVersion());
+ printf("CreationDate: %s\n", reader->GetCreationDate());
if (strncmp(reader->GetVersion(), "AIMDATA", 7) == 0)
- {
- cout << "ModificationDate: " << reader->GetModificationDate() << "\n";
- cout << "Position: "
- << static_cast<int>(origin[0]/spacing[0] + 0.5) << " "
- << static_cast<int>(origin[1]/spacing[1] + 0.5) << " "
- << static_cast<int>(origin[2]/spacing[2] + 0.5) << "\n";
- cout << "Dimensions: "
- << (extent[1] - extent[0] + 1) << " "
- << (extent[3] - extent[2] + 1) << " "
- << (extent[5] - extent[4] + 1) << "\n";
- cout << "ElementSize: "
- << spacing[0] << " " << spacing[1] << " " << spacing[2] << " [mm]\n";
- cout << "DataType: "
- << (reader->GetDataScalarType() == VTK_SHORT ? "short\n" : "byte\n");
- }
+ {
+ printf("ModificationDate: %s\n", reader->GetModificationDate());
+ printf("Position: %d %d %d\n",
+ static_cast<int>(origin[0]/spacing[0] + 0.5),
+ static_cast<int>(origin[1]/spacing[1] + 0.5),
+ static_cast<int>(origin[2]/spacing[2] + 0.5));
+ printf("Dimensions: %d %d %d\n",
+ (extent[1] - extent[0] + 1),
+ (extent[3] - extent[2] + 1),
+ (extent[5] - extent[4] + 1));
+ printf("ElementSize: %g %g %g [mm]\n",
+ spacing[0], spacing[1], spacing[2]);
+ printf("DataType: %s\n",
+ (reader->GetDataScalarType() == VTK_SHORT ? "short" : "byte"));
+ }
reader->GetScanDimensionsPixels(ivec);
- cout << "ScanDimensionsPixels: "
- << ivec[0] << " " << ivec[1] << " " << ivec[2] << "\n";
+ printf("ScanDimensionsPixels: %d %d %d\n",
+ ivec[0], ivec[1], ivec[2]);
reader->GetScanDimensionsPhysical(dvec);
- cout << "ScanDimensionsPhysical: "
- << dvec[0] << " " << dvec[1] << " " << dvec[2] << " [mm]\n";
- cout << "PatientName: " << reader->GetPatientName() << "\n";
- cout << "PatientIndex: " << reader->GetPatientIndex() << "\n";
- cout << "MeasurementIndex: " << reader->GetMeasurementIndex() << "\n";
- cout << "Site: " << reader->GetSite() << "\n";
- cout << "ScannerID: " << reader->GetScannerID() << "\n";
- cout << "ScannerType: " << reader->GetScannerType() << "\n";
- cout << "PositionSlice1: " << reader->GetStartPosition() << " [mm]\n";
- cout << "ReferenceLine: " << reader->GetReferenceLine() << " [mm]\n";
- cout << "NumberOfSamples: " << reader->GetNumberOfSamples() << "\n";
- cout << "NumberOfProjections: " << reader->GetNumberOfProjections() << "\n";
- cout << "ScanDistance: " << reader->GetScanDistance() << " [mm]\n";
- cout << "SampleTime: " << reader->GetSampleTime() << " [ms]\n";
- cout << "SliceThickness: " << reader->GetSliceThickness() << " [mm]\n";
- cout << "SliceIncrement: " << reader->GetSliceIncrement() << " [mm]\n";
- cout << "ReconstructionAlg: " << reader->GetReconstructionAlg() << "\n";
- cout << "Energy: " << reader->GetEnergy() << " [kV]\n";
- cout << "Intensity: " << reader->GetIntensity() << " [mA]\n";
- cout << "MuScaling: " << reader->GetMuScaling() << " [cm]\n";
+ printf("ScanDimensionsPhysical: %g %g %g [mm]\n",
+ dvec[0], dvec[1], dvec[2]);
+ printf("PatientName: %s\n", reader->GetPatientName());
+ printf("PatientIndex: %d\n", reader->GetPatientIndex());
+ printf("MeasurementIndex: %d\n", reader->GetMeasurementIndex());
+ printf("Site: %d\n", reader->GetSite());
+ printf("ScannerID: %d\n", reader->GetScannerID());
+ printf("ScannerType: %d\n", reader->GetScannerType());
+ printf("PositionSlice1: %g [mm]\n", reader->GetStartPosition());
+ printf("ReferenceLine: %g [mm]\n", reader->GetReferenceLine());
+ printf("NumberOfSamples: %d\n", reader->GetNumberOfSamples());
+ printf("NumberOfProjections: %d\n", reader->GetNumberOfProjections());
+ printf("ScanDistance: %g [mm]\n", reader->GetScanDistance());
+ printf("SampleTime: %g [ms]\n", reader->GetSampleTime());
+ printf("SliceThickness: %g [mm]\n", reader->GetSliceThickness());
+ printf("SliceIncrement: %g [mm]\n", reader->GetSliceIncrement());
+ printf("ReconstructionAlg: %d\n", reader->GetReconstructionAlg());
+ printf("Energy: %g [kV]\n", reader->GetEnergy());
+ printf("Intensity: %g [mA]\n", reader->GetIntensity());
+ printf("MuScaling: %g [cm]\n", reader->GetMuScaling());
reader->GetDataRange(dvec);
- cout << "DataRange: " << dvec[0] << " " << dvec[1] << "\n";
- cout << "CalibrationData: " << reader->GetCalibrationData() << "\n";
- cout << "RescaleType: " << reader->GetRescaleType() << "\n";
- cout << "RescaleUnits: " << reader->GetRescaleUnits() << "\n";
- cout << "RescaleSlope: " << reader->GetRescaleSlope() << "\n";
- cout << "RescaleIntercept: " << reader->GetRescaleIntercept() << "\n";
- cout << "MuWater: " << reader->GetMuWater() << " [cm^-1]\n";
- cout << "HeaderSize: " << reader->GetHeaderSize() << "\n";
+ printf("DataRange: %g %g\n", dvec[0], dvec[1]);
+ printf("CalibrationData: %s\n", reader->GetCalibrationData());
+ printf("RescaleType: %d\n", reader->GetRescaleType());
+ printf("RescaleUnits: %s\n", reader->GetRescaleUnits());
+ printf("RescaleSlope: %g\n", reader->GetRescaleSlope());
+ printf("RescaleIntercept: %g\n", reader->GetRescaleIntercept());
+ printf("MuWater: %g [cm^-1]\n", reader->GetMuWater());
+ printf("HeaderSize: %d\n", static_cast<int>(reader->GetHeaderSize()));
+ fflush(stdout);
return 0;
}
diff --git a/Programs/scancotodicom.cxx b/Programs/scancotodicom.cxx
index 0d2974e..91b7cd1 100644
--- a/Programs/scancotodicom.cxx
+++ b/Programs/scancotodicom.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -20,6 +20,8 @@
#include "vtkDICOMWriter.h"
#include "vtkDICOMCTGenerator.h"
#include "vtkDICOMUtilities.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
#include "vtkScancoCTReader.h"
#include <vtkImageData.h>
@@ -30,10 +32,6 @@
#include <vtkErrorCode.h>
#include <vtkSmartPointer.h>
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
#include <string>
#include <vector>
#include <set>
@@ -45,6 +43,7 @@
#include <limits.h>
// from dicomcli
+#include "vtkConsoleOutputWindow.h"
#include "mainmacro.h"
// The file types
@@ -76,19 +75,19 @@ void scancotodicom_version(FILE *file, const char *command_name, bool verbose)
while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
if (!verbose)
- {
+ {
fprintf(file, "%s %s\n", cp, DICOM_VERSION);
fprintf(file, "\n"
- "Copyright (c) 2012-2015, David Gobbi.\n\n"
+ "Copyright (c) 2012-2016, David Gobbi.\n\n"
"This software is distributed under an open-source license. See the\n"
"Copyright.txt file that comes with the vtk-dicom source distribution.\n");
- }
+ }
else
- {
+ {
fprintf(file,
"Head %8.8s, Built %s, %s\n",
DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
- }
+ }
}
@@ -145,27 +144,27 @@ void scancotodicom_check_error(vtkObject *o)
const char *filename = 0;
unsigned long errorcode = 0;
if (writer)
- {
+ {
filename = writer->GetFileName();
errorcode = writer->GetErrorCode();
- }
+ }
else if (reader)
- {
+ {
filename = reader->GetInternalFileName();
errorcode = reader->GetErrorCode();
- }
+ }
else if (parser)
- {
+ {
filename = parser->GetFileName();
errorcode = parser->GetErrorCode();
- }
+ }
if (!filename)
- {
+ {
filename = "";
- }
+ }
switch(errorcode)
- {
+ {
case vtkErrorCode::NoError:
return;
case vtkErrorCode::FileNotFoundError:
@@ -192,7 +191,7 @@ void scancotodicom_check_error(vtkObject *o)
default:
fprintf(stderr, "An unknown error occurred.\n");
break;
- }
+ }
exit(1);
}
@@ -211,40 +210,40 @@ void scancotodicom_convert_date(char date[32])
char *cp = date;
unsigned int parts[7];
for (int i = 0; i < 7; i++)
- {
+ {
while (*cp == ' ') { cp++; }
int lead = 0;
while (cp[0] == '0' && isdigit(cp[1]))
- {
+ {
lead++;
cp++;
- }
+ }
parts[i] = strtoul(cp, &cp, 10);
if (i == 1 && isalpha(*cp))
- {
+ {
for (int j = 0; j < 12; j++)
- {
+ {
const char *month = months[j];
if (toupper(cp[0]) == month[0] &&
toupper(cp[1]) == month[1] &&
toupper(cp[2]) == month[2])
- {
+ {
parts[i] = j+1;
break;
- }
}
- while (isalpha(*cp)) { cp++; }
}
+ while (isalpha(*cp)) { cp++; }
+ }
if (i == 6)
- {
+ {
unsigned int denom = 10;
while (denom <= parts[i]) { denom *= 10; }
while (lead > 0) { lead--; denom *= 10; }
if (denom > 1000000) { parts[i] /= (denom/1000000); }
else { parts[i] *= (1000000/denom); }
- }
- if (*cp != '\0') { cp++; }
}
+ if (*cp != '\0') { cp++; }
+ }
sprintf(date, "%04d%02d%02d%02d%02d%02d.%06d",
parts[2] % 10000, parts[1] % 100, parts[0] % 100,
@@ -252,60 +251,6 @@ void scancotodicom_convert_date(char date[32])
parts[6] % 1000000);
}
-// Add a dicom file to the list, expand if wildcard
-void scancotodicom_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
- bool ispattern = false;
- bool hasbackslash = false;
- size_t n = strlen(filepath);
- for (size_t i = 0; i < n; i++)
- {
- if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
- {
- ispattern = true;
- }
- if (filepath[i] == '\\')
- {
- hasbackslash = true;
- }
- }
-
- std::string newpath = filepath;
- if (hasbackslash)
- {
- // backslashes interfere with vtksys::Glob
- vtksys::SystemTools::ConvertToUnixSlashes(newpath);
- }
- filepath = newpath.c_str();
-
- if (ispattern)
- {
- vtksys::Glob glob;
- if (glob.FindFiles(filepath))
- {
- const std::vector<std::string> &globfiles = glob.GetFiles();
- size_t m = globfiles.size();
- for (size_t j = 0; j < m; j++)
- {
- files->InsertNextValue(globfiles[j]);
- }
- }
- else
- {
- fprintf(stderr, "Could not match pattern: %s\n", filepath);
- exit(1);
- }
- }
- else
- {
- files->InsertNextValue(filepath);
- }
-#else
- files->InsertNextValue(filepath);
-#endif
-}
-
// Check that a file has a valid extension
bool isScancoCTFileName(const char *f)
{
@@ -315,13 +260,13 @@ bool isScancoCTFileName(const char *f)
size_t n = strlen(f);
for (const char **s = suffixes; *s != 0; s++)
- {
+ {
size_t m = strlen(*s);
if (n > m && strcmp(f + n - m, *s) == 0)
- {
+ {
return true;
- }
}
+ }
return false;
}
@@ -343,156 +288,156 @@ void scancotodicom_read_options(
// read the options from the command line
int argi = 1;
while (argi < argc)
- {
+ {
const char *arg = argv[argi++];
if (arg[0] == '-')
- {
+ {
if (strcmp(arg, "--") == 0)
- {
+ {
// stop processing switches
break;
- }
+ }
else if (strcmp(arg, "--series-description") == 0 ||
strcmp(arg, "--series-number") == 0 ||
strcmp(arg, "--uid-prefix") == 0)
- {
+ {
if (argi >= argc ||
argv[argi][0] == '-')
- {
+ {
fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg);
exit(1);
- }
+ }
if (strcmp(arg, "--series-description") == 0)
- {
+ {
options->series_description = argv[argi];
- }
+ }
else if (strcmp(arg, "--series-number") == 0)
- {
+ {
options->series_number= argv[argi];
- }
+ }
else if (strcmp(arg, "--uid-prefix") == 0)
- {
+ {
options->uid_prefix = argv[argi];
- }
- argi++;
}
+ argi++;
+ }
else if (strcmp(arg, "--silent") == 0)
- {
+ {
options->silent = true;
- }
+ }
else if (strcmp(arg, "--verbose") == 0)
- {
+ {
options->verbose = true;
- }
+ }
else if (strcmp(arg, "--version") == 0)
- {
+ {
scancotodicom_version(stdout, argv[0], false);
exit(0);
- }
+ }
else if (strcmp(arg, "--build-version") == 0)
- {
+ {
scancotodicom_version(stdout, argv[0], true);
exit(0);
- }
+ }
else if (strcmp(arg, "--help") == 0)
- {
+ {
scancotodicom_help(stdout, argv[0]);
exit(0);
- }
+ }
else if (arg[0] == '-' && arg[1] == '-')
- {
+ {
fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
else if (arg[0] == '-' && arg[1] != '-')
- {
+ {
for (int argj = 1; arg[argj] != '\0'; argj++)
- {
+ {
if (arg[argj] == 's')
- {
+ {
options->silent = true;
- }
+ }
else if (arg[argj] == 'v')
- {
+ {
options->verbose = true;
- }
+ }
else if (arg[argj] == 'o')
- {
+ {
if (arg[argj+1] != '\0')
- {
+ {
arg += argj+1;
- }
+ }
else
- {
+ {
if (argi >= argc)
- {
+ {
fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
- arg = argv[argi++];
}
+ arg = argv[argi++];
+ }
options->output = arg;
break;
- }
+ }
else
- {
+ {
fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
+ }
else
- {
- scancotodicom_add_file(files, arg);
+ {
+ files->InsertNextValue(arg);
vtkIdType m = files->GetMaxId();
if (m >= 0)
- {
+ {
const char *f = files->GetValue(m);
if (isScancoCTFileName(f))
- {
+ {
if (options->input == 0)
- {
+ {
options->input = arg;
files->SetNumberOfValues(m);
- }
+ }
else
- {
+ {
fprintf(stderr, "\nAt most one uCT file can be specified.\n");
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
}
+ }
while (argi < argc)
- {
- scancotodicom_add_file(files, argv[argi++]);
+ {
+ files->InsertNextValue(argv[argi++]);
vtkIdType m = files->GetMaxId();
if (m >= 0)
- {
+ {
const char *f = files->GetValue(m);
if (isScancoCTFileName(f))
- {
+ {
if (options->input == 0)
- {
+ {
options->input = argv[argi-1];
files->SetNumberOfValues(m);
- }
+ }
else
- {
+ {
fprintf(stderr, "\nAt most one uCT file can be specified.\n");
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
}
}
}
+ }
}
// Convert one uCT file into a DICOM series
@@ -521,21 +466,21 @@ void scancotodicom_convert_one(
const char *modality = "CT";
const char *version = reader->GetVersion();
if (strncmp(version, "AIM", 3) == 0)
- {
+ {
fileType = SCANCO_AIM;
imageType = "ORIGINAL\\SECONDARY\\AXIAL";
if (reader->GetDataScalarType() != VTK_SHORT)
- {
+ {
modality = "SEG";
fileType = SCANCO_AIM_SEG;
imageType = "DERIVED\\PRIMARY";
- }
}
+ }
else if (physdim[2] == 0)
- {
+ {
fileType = SCANCO_RAD;
imageType = "ORIGINAL\\PRIMARY\\LOCALIZER";
- }
+ }
// The meta data object
vtkSmartPointer<vtkDICOMMetaData> meta =
@@ -543,21 +488,21 @@ void scancotodicom_convert_one(
// read meta data from the sample DICOM file, if provided
if (a->GetNumberOfValues() > 0)
- {
+ {
vtkSmartPointer<vtkDICOMReader> dicomReader =
vtkSmartPointer<vtkDICOMReader>::New();
dicomReader->SetFileNames(a);
if (fileType == SCANCO_RAD)
- {
+ {
dicomReader->SetMemoryRowOrderToFileNative();
- }
+ }
else
- {
+ {
dicomReader->SetMemoryRowOrderToBottomUp();
- }
+ }
dicomReader->UpdateInformation();
meta->DeepCopy(dicomReader->GetMetaData());
- }
+ }
// set metadata from the file header
meta->SetAttributeValue(DC::Modality, modality);
@@ -569,29 +514,29 @@ void scancotodicom_convert_one(
double rescaleSlope = 1.0;
double rescaleIntercept = 0.0;
if (reader->GetMuScaling() != 0 && reader->GetMuWater() != 0)
- {
+ {
// conversion to Hounsfield units
rescaleIntercept = -1000.0;
rescaleSlope = 1000.0/(reader->GetMuScaling()*reader->GetMuWater());
meta->SetAttributeValue(DC::RescaleIntercept, rescaleIntercept);
meta->SetAttributeValue(DC::RescaleSlope, rescaleSlope);
meta->SetAttributeValue(DC::RescaleType, "HU");
- }
+ }
meta->SetAttributeValue(DC::KVP, reader->GetEnergy());
meta->SetAttributeValue(DC::AcquisitionNumber, reader->GetMeasurementIndex());
meta->SetAttributeValue(DC::ExposureTime, reader->GetSampleTime());
meta->SetAttributeValue(DC::XRayTubeCurrentInuA, 1000*reader->GetIntensity());
if (fileType != SCANCO_RAD)
- {
+ {
meta->SetAttributeValue(DC::SliceThickness, reader->GetSliceThickness());
meta->SetAttributeValue(DC::DataCollectionDiameter, physdim[0]);
meta->SetAttributeValue(DC::ReconstructionDiameter, physdim[0]);
- }
+ }
// date
char date[32];
if (!meta->HasAttribute(DC::StudyDate))
- {
+ {
strncpy(date, reader->GetCreationDate(), 32);
scancotodicom_convert_date(date);
meta->SetAttributeValue(DC::StudyTime, &date[8]);
@@ -599,16 +544,16 @@ void scancotodicom_convert_one(
date[8] = '\0';
meta->SetAttributeValue(DC::StudyDate, date);
meta->SetAttributeValue(DC::SeriesDate, date);
- }
+ }
if (fileType == SCANCO_AIM_SEG)
- {
+ {
strncpy(date, reader->GetModificationDate(), 32);
scancotodicom_convert_date(date);
meta->SetAttributeValue(DC::CreationTime, &date[8]);
date[8] = '\0';
meta->SetAttributeValue(DC::CreationDate, date);
- }
+ }
// patient
const char *patient = reader->GetPatientName();
@@ -616,13 +561,13 @@ void scancotodicom_convert_one(
// set the metadata supplied on the command line
if (options->series_description)
- {
+ {
meta->SetAttributeValue(DC::SeriesDescription, options->series_description);
- }
+ }
if (options->series_number)
- {
+ {
meta->SetAttributeValue(DC::SeriesNumber, options->series_number);
- }
+ }
// The DICOM orientation matrix
vtkSmartPointer<vtkMatrix4x4> matrix =
@@ -633,7 +578,7 @@ void scancotodicom_convert_one(
double center = 0.5*physdim[0]*(pixdim[0] - 1)/pixdim[0];
if (fileType == SCANCO_RAD)
- {
+ {
// Convert localizer to DICOM coordinates (rotate)
zoffset = reader->GetZPosition() - reader->GetReferenceLine();
double radToDICOM[16] = {
@@ -642,9 +587,9 @@ void scancotodicom_convert_one(
0.0, 1.0, 0.0, zoffset,
0.0, 0.0, 0.0, 1.0 };
matrix->DeepCopy(radToDICOM);
- }
+ }
else
- {
+ {
// Convert to DICOM patient coordinates as well as we can,
// without knowing orientation of patient relative to scanner
zoffset = reader->GetStartPosition() - reader->GetReferenceLine();
@@ -654,18 +599,18 @@ void scancotodicom_convert_one(
0.0, 0.0, 1.0, zoffset,
0.0, 0.0, 0.0, 1.0 };
matrix->DeepCopy(rasToDICOM);
- }
+ }
// prepare the writer to write the image
vtkSmartPointer<vtkDICOMWriter> writer =
vtkSmartPointer<vtkDICOMWriter>::New();
writer->StreamingOn();
if (reader->GetDataScalarType() != VTK_SIGNED_CHAR)
- {
+ {
vtkSmartPointer<vtkDICOMCTGenerator> generator =
vtkSmartPointer<vtkDICOMCTGenerator>::New();
writer->SetGenerator(generator);
- }
+ }
writer->SetMetaData(meta);
writer->SetFilePrefix(outfile);
writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
@@ -675,20 +620,23 @@ void scancotodicom_convert_one(
writer->SetInputConnection(reader->GetOutputPort());
writer->SetFileSliceOrderToSame();
if (fileType == SCANCO_RAD)
- {
+ {
writer->SetMemoryRowOrderToFileNative();
- }
+ }
else
- {
+ {
writer->SetMemoryRowOrderToBottomUp();
- }
+ }
writer->Write();
scancotodicom_check_error(writer);
}
// This program will convert ScancoCT to DICOM
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
{
+ // redirect all VTK errors to stderr
+ vtkConsoleOutputWindow::Install();
+
// for the list of input DICOM files
vtkSmartPointer<vtkStringArray> files =
vtkSmartPointer<vtkStringArray>::New();
@@ -701,40 +649,39 @@ MAINMACRO(argc, argv)
// set the UID prefix
if (options.uid_prefix)
- {
+ {
vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix);
- }
+ }
// the output directory
const char *outpath = options.output;
if (!outpath)
- {
+ {
fprintf(stderr,
"\nNo output directory was specified (\'-o\' <directory>).\n\n");
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
if (!options.input)
- {
+ {
fprintf(stderr,
"\nNo input file was specified.\n\n");
scancotodicom_usage(stderr, argv[0]);
exit(1);
- }
+ }
- if (vtksys::SystemTools::FileExists(outpath))
- {
- if (!vtksys::SystemTools::FileIsDirectory(outpath))
- {
- fprintf(stderr, "option -o must give a directory, not a file.\n");
- exit(1);
- }
- }
- else if (!vtksys::SystemTools::MakeDirectory(outpath))
- {
+ int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
+ if (code != vtkDICOMFile::FileIsDirectory)
+ {
+ fprintf(stderr, "option -o must give a directory, not a file.\n");
+ exit(1);
+ }
+ code = vtkDICOMFileDirectory::Create(outpath);
+ if (code != vtkDICOMFileDirectory::Good)
+ {
fprintf(stderr, "Cannot create directory: %s\n", outpath);
exit(1);
- }
+ }
scancotodicom_convert_one(&options, options.input, files, outpath);
diff --git a/Readme.txt b/Readme.txt
index d40344e..5d6826a 100644
--- a/Readme.txt
+++ b/Readme.txt
@@ -1,6 +1,6 @@
DICOM for VTK
-Copyright (c) 2012-2015, David Gobbi
+Copyright (c) 2012-2016, David Gobbi
All rights reserved.
See Copyright.txt for more details.
@@ -22,8 +22,8 @@ given on the last page of the pdf file listed below.
More information can be found at the following website:
http://dgobbi.github.io/vtk-dicom/
http://dgobbi.github.io/vtk-dicom/doc/api/
-http://dgobbi.github.io/vtk-dicom/doc/tools/
http://dgobbi.github.io/vtk-dicom/doc/vtk-dicom.pdf
+http://github.com/dgobbi/vtk-dicom/wiki/Command-Line-Tools
A software quality dashboard is provided, with nightly builds on
Linux (gcc 4.6) and Windows (Visual Studio 2010):
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 2ba5759..669d8cb 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -3,9 +3,9 @@ set(DICOM_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
set(DICOM_BUILD_TESTING ${BUILD_TESTING})
set(DICOM_USE_GDCM ${USE_GDCM})
set(DICOM_USE_DCMTK ${USE_DCMTK})
-configure_file(${DICOM_SOURCE_DIR}/CMake/vtkDICOMConfig.h.in
+configure_file(${DICOM_CMAKE_DIR}/vtkDICOMConfig.h.in
"${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMConfig.h" @ONLY)
-configure_file(${DICOM_SOURCE_DIR}/CMake/vtkDICOMBuild.h.in
+configure_file(${DICOM_CMAKE_DIR}/vtkDICOMBuild.h.in
"${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMBuild.h" @ONLY)
# Include directories
@@ -24,7 +24,9 @@ endif()
set(LIB_SRCS
vtkDICOMMetaData.cxx
vtkDICOMDictionary.cxx
+ vtkDICOMFilePath.cxx
vtkDICOMFile.cxx
+ vtkDICOMFileDirectory.cxx
vtkDICOMTag.cxx
vtkDICOMTagPath.cxx
vtkDICOMVR.cxx
@@ -60,6 +62,7 @@ set(LIB_SRCS
vtkDICOMToRAS.cxx
vtkDICOMCTRectifier.cxx
vtkDICOMMetaDataAdapter.cxx
+ vtkDICOMUIDGenerator.cxx
vtkNIFTIHeader.cxx
vtkNIFTIReader.cxx
vtkNIFTIWriter.cxx
@@ -89,6 +92,8 @@ set(LIB_ABSTRACT
# Sources that are not vtkObjects
set(LIB_SPECIAL
vtkDICOMFile.cxx
+ vtkDICOMFileDirectory.cxx
+ vtkDICOMFilePath.cxx
vtkDICOMTag.cxx
vtkDICOMTagPath.cxx
vtkDICOMVR.cxx
@@ -123,7 +128,7 @@ if(Module_vtkDICOM) # Building as a VTK remote module
else() # else MODULE_vtkDICOM
-configure_file(${DICOM_SOURCE_DIR}/CMake/vtkDICOMModule.h.in
+configure_file(${DICOM_CMAKE_DIR}/vtkDICOMModule.h.in
"${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMModule.h" COPYONLY)
# Automatically find the header for each cxx file
@@ -137,18 +142,15 @@ endforeach()
# Create the hierarchy file
if("${VTK_MAJOR_VERSION}" GREATER 5)
- if(BUILD_PYTHON_WRAPPERS OR BUILD_JAVA_WRAPPERS)
+ if(BUILD_PYTHON_WRAPPERS OR BUILD_TCL_WRAPPERS OR BUILD_JAVA_WRAPPERS)
set_source_files_properties(${LIB_SPECIAL} PROPERTIES WRAP_SPECIAL ON)
set(MODULE_HIERARCHY_NAME ${LIB_NAME}Hierarchy)
- # The VTK 6 wrapping macros require vtk-module to be set
- set(vtk-module ${LIB_NAME})
# _LINK_DEPENDS is a variable suffix from the VTK 6 module macros
- set(${vtk-module}_LINK_DEPENDS ${VTK_LIBS} ${KWSYS_LIBS} ${ZLIB_LIBS})
- include(${DICOM_SOURCE_DIR}/CMake/vtkWrapHierarchy.cmake)
- vtk_wrap_hierarchy(${MODULE_HIERARCHY_NAME} ${CMAKE_CURRENT_BINARY_DIR}
- "${LIB_SRCS}")
+ set(${LIB_NAME}_LINK_DEPENDS ${VTK_LIBS} ${KWSYS_LIBS} ${ZLIB_LIBS})
+ include(vtkWrapHierarchy)
+ vtk_wrap_hierarchy(${LIB_NAME} ${CMAKE_CURRENT_BINARY_DIR} "${LIB_SRCS}")
set(KIT_HIERARCHY_FILE ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.txt)
- set(LIB_HIERARCHY_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.stamp)
+ set(LIB_HIERARCHY_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.stamp.txt)
endif()
endif()
@@ -165,8 +167,9 @@ if("${VTK_MAJOR_VERSION}" GREATER 5)
OUTPUT_NAME ${LIB_NAME}${LIB_NAME_SUFFIX})
endif()
set_target_properties(${LIB_NAME} PROPERTIES
- VERSION "${DICOM_VERSION}" SOVERSION "${DICOM_SHORT_VERSION}")
-if(BUILD_PYTHON_WRAPPERS OR BUILD_JAVA_WRAPPERS AND
+ VERSION "${PROJECT_VERSION}"
+ SOVERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}")
+if(BUILD_PYTHON_WRAPPERS OR BUILD_TCL_WRAPPERS OR BUILD_JAVA_WRAPPERS AND
NOT (CMAKE_VERSION VERSION_LESS 2.8))
set_target_properties(${LIB_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif()
@@ -175,8 +178,7 @@ target_link_libraries(${LIB_NAME} LINK_PRIVATE
${KWSYS_LIBS} ${ZLIB_LIBS} ${GDCM_LIBS} ${DCMTK_LIBS})
# Wrappers
-if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
- set(vtk-module ${LIB_NAME})
+if(BUILD_PYTHON_WRAPPERS)
set(XY) # Get python version, e.g. 27 for python 2.7
if(vtkPython_LIBRARIES)
list(GET vtkPython_LIBRARIES 0 TMP_LIB_NAME)
@@ -206,7 +208,7 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
endif()
# Tell vtkWrapPython to locate the python libraries for us.
set(VTK_WRAP_PYTHON_FIND_LIBS ON)
- include(${VTK_CMAKE_DIR}/vtkWrapPython.cmake)
+ include(vtkWrapPython)
vtk_wrap_python3(${MODULE_PYTHON_NAME} LIB_PYTHON_SRCS "${LIB_SRCS}")
add_library(${LIB_PYTHON_NAME} ${LIB_PYTHON_SRCS} ${LIB_PYTHON_EXTRA_SRCS})
if(NOT (CMAKE_VERSION VERSION_LESS 2.8))
@@ -214,7 +216,8 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
POSITION_INDEPENDENT_CODE ON)
endif()
set_target_properties(${LIB_PYTHON_NAME} PROPERTIES
- VERSION "${DICOM_VERSION}" SOVERSION "${DICOM_SHORT_VERSION}"
+ VERSION "${PROJECT_VERSION}"
+ SOVERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}"
OUTPUT_NAME "${LIB_PYTHON_OUTPUT_NAME}")
target_link_libraries(${LIB_PYTHON_NAME} LINK_PUBLIC
${LIB_NAME} ${LIB_PYTHON_LIBS})
@@ -226,10 +229,6 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
target_link_libraries(${LIB_PYTHON_NAME} LINK_PRIVATE
${VTK_PYTHON_LIBRARIES})
endif()
- if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- target_link_libraries(${LIB_PYTHON_NAME} LINK_PRIVATE
- ${DCMTK_charls_LIBRARY})
- endif()
if(KIT_PYTHON_DEPS)
add_dependencies(${LIB_PYTHON_NAME} ${KIT_PYTHON_DEPS})
endif()
@@ -244,8 +243,49 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
target_link_libraries(${MODULE_PYTHON_NAME} ${LIB_PYTHON_NAME})
endif()
-if(BUILD_JAVA_WRAPPERS AND NOT Module_vtkDICOM)
- set(vtk-module ${LIB_NAME})
+if(BUILD_TCL_WRAPPERS)
+ set(LIB_TCL_NAME ${LIB_NAME}TCL)
+ string(TOLOWER ${LIB_NAME} MODULE_TCL_NAME)
+ set(LIB_TCL_OUTPUT_NAME ${LIB_TCL_NAME})
+ if("${VTK_MAJOR_VERSION}" GREATER 5)
+ set(LIB_TCL_OUTPUT_NAME ${LIB_TCL_NAME}${LIB_NAME_SUFFIX})
+ endif()
+ set(LIB_TCL_LIBS)
+ foreach(TMP_LIB ${VTK_LIBS})
+ set(LIB_TCL_LIBS ${LIB_TCL_LIBS} ${TMP_LIB}TCL)
+ endforeach()
+ if(VTK_TCL_INCLUDE_DIR)
+ include_directories("${VTK_TCL_INCLUDE_DIR}")
+ endif()
+ include(vtkWrapTcl)
+ vtk_wrap_tcl3(${LIB_TCL_NAME} LIB_TCL_SRCS "${LIB_SRCS}" "")
+ add_library(${LIB_TCL_NAME} ${LIB_TCL_SRCS} ${LIB_TCL_EXTRA_SRCS}
+ ${LIB_HIERARCHY_STAMP})
+ target_link_libraries(${LIB_TCL_NAME} LINK_PUBLIC
+ ${LIB_NAME} ${LIB_TCL_LIBS})
+ if(KIT_TCL_DEPS)
+ add_dependencies(${LIB_TCL_NAME} ${KIT_TCL_DEPS})
+ endif()
+ set_target_properties(${LIB_TCL_NAME} PROPERTIES
+ OUTPUT_NAME ${LIB_TCL_OUTPUT_NAME})
+ # create the pkgIndex.tcl file
+ if(CMAKE_CONFIGURATION_TYPES)
+ foreach(config ${CMAKE_CONFIGURATION_TYPES})
+ set(MODULE_TCL_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${config}")
+ configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in
+ "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${config}/pkgIndex.tcl" @ONLY)
+ endforeach()
+ else()
+ set(MODULE_TCL_PATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+ configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in
+ "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgIndex.tcl" @ONLY)
+ endif()
+ set(MODULE_TCL_PATH ${DICOM_LIBRARY_INSTALL_DEST})
+ configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in
+ "${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl" @ONLY)
+endif()
+
+if(BUILD_JAVA_WRAPPERS)
set(VTK_WRAP_JAVA3_INIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(VTK_JAVA_HOME ${CMAKE_CURRENT_BINARY_DIR}/java/vtk)
set(VTK_JAVA_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/java/manifest.txt)
@@ -262,7 +302,7 @@ if(BUILD_JAVA_WRAPPERS AND NOT Module_vtkDICOM)
else()
include_directories("${JAVA_INCLUDE_PATH}" "${JAVA_INCLUDE_PATH2}")
endif()
- include(${VTK_CMAKE_DIR}/vtkWrapJava.cmake)
+ include(vtkWrapJava)
vtk_wrap_java3(${LIB_JAVA_NAME} LIB_JAVA_SRCS "${LIB_SRCS}")
add_library(${LIB_JAVA_NAME} SHARED ${LIB_JAVA_SRCS} ${LIB_JAVA_EXTRA_SRCS})
if(APPLE)
@@ -272,9 +312,6 @@ if(BUILD_JAVA_WRAPPERS AND NOT Module_vtkDICOM)
set_target_properties(${LIB_JAVA_NAME} PROPERTIES NO_SONAME 1)
endif()
target_link_libraries(${LIB_JAVA_NAME} ${LIB_NAME} ${LIB_JAVA_LIBS})
- if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- target_link_libraries(${LIB_JAVA_NAME} ${DCMTK_charls_LIBRARY})
- endif()
add_dependencies(${LIB_JAVA_NAME} ${LIB_NAME})
if(KIT_JAVA_DEPS)
add_dependencies(${LIB_JAVA_NAME} ${KIT_JAVA_DEPS})
@@ -318,12 +355,18 @@ endif()
# Set the install rules for the library
install(TARGETS
- ${LIB_NAME} ${LIB_PYTHON_NAME} ${MODULE_PYTHON_NAME} ${LIB_JAVA_NAME}
+ ${LIB_NAME} ${LIB_PYTHON_NAME} ${MODULE_PYTHON_NAME}
+ ${LIB_TCL_NAME} ${LIB_JAVA_NAME}
EXPORT DICOMTargets
RUNTIME DESTINATION ${DICOM_RUNTIME_INSTALL_DEST} COMPONENT RuntimeLibraries
LIBRARY DESTINATION ${DICOM_LIBRARY_INSTALL_DEST} COMPONENT RuntimeLibraries
ARCHIVE DESTINATION ${DICOM_ARCHIVE_INSTALL_DEST} COMPONENT Development)
+if(BUILD_TCL_WRAPPERS)
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl
+ DESTINATION ${DICOM_TCL_INSTALL_DEST})
+endif()
+
if(BUILD_JAVA_WRAPPERS)
install(FILES ${VTK_JAR_PATH}/vtkdicom.jar
DESTINATION ${DICOM_JAVA_INSTALL_DEST})
diff --git a/Source/vtkDICOMAlgorithm.cxx b/Source/vtkDICOMAlgorithm.cxx
index b9e5e3a..91d2fd7 100644
--- a/Source/vtkDICOMAlgorithm.cxx
+++ b/Source/vtkDICOMAlgorithm.cxx
@@ -61,18 +61,18 @@ vtkInformation *vtkDICOMAlgorithm::GetMetaDataInformation(
// If SetInputData was used, the meta data is attached to the data
vtkAlgorithmOutput *sourceConnection = this->GetInputConnection(0, 0);
if (sourceConnection)
- {
+ {
// SetInputData causes a vtkTrivialProducer to be used
vtkAlgorithm *producer = sourceConnection->GetProducer();
if (producer && vtkTrivialProducer::SafeDownCast(producer))
- {
+ {
vtkDataObject *inputData = producer->GetOutputDataObject(0);
if (inputData)
- {
+ {
metaInfo = inputData->GetInformation();
- }
}
}
+ }
return metaInfo;
}
@@ -90,14 +90,14 @@ void vtkDICOMAlgorithm::CopyMetaDataToOutputInformation(
int firstPort = outputPort;
int lastPort = outputPort;
if (outputPort < 0)
- {
+ {
firstPort = 0;
lastPort = this->GetNumberOfOutputPorts() - 1;
- }
+ }
// Copy the meta data downstream
for (int port = firstPort; port <= lastPort; port++)
- {
+ {
vtkInformation *outInfo = outputVector->GetInformationObject(port);
// Matrix is stored as a vector of 16 doubles
outInfo->CopyEntry(metaInfo, PATIENT_MATRIX());
@@ -106,13 +106,13 @@ void vtkDICOMAlgorithm::CopyMetaDataToOutputInformation(
vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast(
metaInfo->Get(META_DATA()));
if (meta)
- {
+ {
vtkSmartPointer<vtkDICOMMetaData> outMeta =
vtkSmartPointer<vtkDICOMMetaData>::New();
outMeta->ShallowCopy(meta);
outInfo->Set(META_DATA(), outMeta);
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -133,10 +133,10 @@ int vtkDICOMAlgorithm::RequestInformation(
// Copy the meta data to the output information
if (this->GetNumberOfInputPorts() > 0 &&
this->GetNumberOfInputConnections(0) > 0)
- {
+ {
this->CopyMetaDataToOutputInformation(
inputVector, 0, 0, outputVector, -1);
- }
+ }
return this->Superclass::RequestInformation(
request, inputVector, outputVector);
@@ -151,15 +151,15 @@ int vtkDICOMAlgorithm::RequestData(
// Copy the meta data downstream
int numPorts = this->GetNumberOfOutputPorts();
for (int port = 0; port < numPorts; port++)
- {
+ {
vtkInformation *outInfo = outputVector->GetInformationObject(port);
vtkImageData *outData = vtkImageData::SafeDownCast(
outInfo->Get(vtkDataObject::DATA_OBJECT()));
if (outData)
- {
+ {
this->CopyMetaDataToOutputData(outInfo, outData);
- }
}
+ }
return this->Superclass::RequestData(request, inputVector, outputVector);
}
diff --git a/Source/vtkDICOMAlgorithm.h b/Source/vtkDICOMAlgorithm.h
index bf68b73..a6ae8b8 100644
--- a/Source/vtkDICOMAlgorithm.h
+++ b/Source/vtkDICOMAlgorithm.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,12 +11,14 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMAlgorithm - Base class for DICOM image filters
-// .SECTION Description
-// This class allows the DICOM meta data to be carried by the VTK pipeline.
-// Subclasses should always call Superclass::RequestInformation() and
-// Superclass::RequestData within their own RequestInformation and
-// RequestData methods.
+/*! \class vtkDICOMAlgorithm
+ * \brief Superclass for DICOM image filters
+ *
+ * This class allows the DICOM meta data to be carried by the VTK pipeline.
+ * Subclasses should always call Superclass::RequestInformation() and
+ * Superclass::RequestData within their own RequestInformation and
+ * RequestData methods.
+ */
#ifndef vtkDICOMAlgorithm_h
#define vtkDICOMAlgorithm_h
@@ -34,45 +36,49 @@ class vtkDICOMPerFilePalette;
class VTKDICOM_EXPORT vtkDICOMAlgorithm : public vtkThreadedImageAlgorithm
{
public:
- // Description:
- // Static method for construction.
- static vtkDICOMAlgorithm *New();
vtkTypeMacro(vtkDICOMAlgorithm, vtkThreadedImageAlgorithm);
- // Description:
- // Print information about this object.
+ //@{
+ //! Static method for construction.
+ static vtkDICOMAlgorithm *New();
+
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
+ //@}
- // Description:
- // The information key for the meta data.
+ //@{
+ //! The information key for the meta data.
static vtkInformationDataObjectKey *META_DATA();
- // Description:
- // A key to get the patient matrix from the VTK pipeline.
+ //! A key to get the patient matrix from the VTK pipeline.
static vtkInformationDoubleVectorKey *PATIENT_MATRIX();
+ //@}
protected:
vtkDICOMAlgorithm();
~vtkDICOMAlgorithm();
- // Description:
- // Get the information object that holds the meta data for the given input.
+ //@{
+ //! Get the information object that holds the meta data for the given input.
vtkInformation *GetMetaDataInformation(
vtkInformationVector** inputVector, int inputPort, int inputConnection);
- // Description:
- // Copy the meta data from an input connection to an output port.
- // This is called by RequestInformation. To copy the meta data to
- // all output ports, use "-1" as the output port.
+ //! Copy the meta data from an input connection to an output port.
+ /*!
+ * This is called by RequestInformation. To copy the meta data to
+ * all output ports, use "-1" as the output port.
+ */
virtual void CopyMetaDataToOutputInformation(
vtkInformationVector** inputVector, int inputPort, int inputConnection,
vtkInformationVector* outputVector, int outputPort);
- // Description:
- // Copy the meta data from the output information to the output data.
- // This is called by RequestData.
+ //! Copy the meta data from the output information to the output data.
+ /*!
+ * This is called by RequestData.
+ */
virtual void CopyMetaDataToOutputData(
vtkInformation *outInfo, vtkDataObject *outData);
+ //@}
virtual int RequestInformation(
vtkInformation* request, vtkInformationVector** inputVector,
@@ -88,8 +94,8 @@ protected:
vtkImageData **outData, int ext[6], int id);
private:
- vtkDICOMAlgorithm(const vtkDICOMAlgorithm&); // Not implemented.
- void operator=(const vtkDICOMAlgorithm&); // Not implemented.
+ vtkDICOMAlgorithm(const vtkDICOMAlgorithm&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMAlgorithm&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMAlgorithm_h
diff --git a/Source/vtkDICOMApplyPalette.cxx b/Source/vtkDICOMApplyPalette.cxx
index 7e61a5d..cf45bf1 100644
--- a/Source/vtkDICOMApplyPalette.cxx
+++ b/Source/vtkDICOMApplyPalette.cxx
@@ -98,12 +98,12 @@ void vtkDICOMApplyPaletteExecute(
vtkIdType progress = 0;
for (int c = 0; c < inputComponents; c++)
- {
+ {
T *inPtrC = inPtr0 + c;
unsigned char *outPtrC = outPtr0 + 3*c;
for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++)
- {
+ {
int i = meta->GetFileIndex(zIdx, c, inputComponents);
int f = meta->GetFrameIndex(zIdx, c, inputComponents);
i = (i >= 0 ? i : 0);
@@ -113,9 +113,9 @@ void vtkDICOMApplyPaletteExecute(
int firstValueMapped = static_cast<int>(range[0]);
int maxIdx = static_cast<int>(range[1]) - firstValueMapped;
if (maxIdx >= table->GetNumberOfColors())
- {
+ {
maxIdx = table->GetNumberOfColors() - 1;
- }
+ }
const unsigned char *rgba = table->GetPointer(0);
T *inPtrZ = inPtrC + (zIdx - extent[4])*inIncZ;
unsigned char *outPtrZ = outPtrC + (zIdx - extent[4])*outIncZ;
@@ -125,7 +125,7 @@ void vtkDICOMApplyPaletteExecute(
double windowCenter = 0.0;
double windowScale = 1.0;
if (supplemental)
- {
+ {
// check if this frame is specifically monochrome
monochrome = meta->GetAttributeValue(
i, f, DC::PixelPresentation).Matches("MONOCHROME*");
@@ -137,10 +137,10 @@ void vtkDICOMApplyPaletteExecute(
meta->GetAttributeValue(i, f, DC::WindowWidth);
double windowWidth = 0.0;
if (wc.IsValid() && ww.IsValid())
- {
+ {
windowCenter = wc.AsDouble();
windowWidth = ww.AsDouble();
- }
+ }
// for CT images, the rescaling must be taken into account
const vtkDICOMValue& rs =
@@ -148,44 +148,44 @@ void vtkDICOMApplyPaletteExecute(
const vtkDICOMValue& ri =
meta->GetAttributeValue(i, f, DC::RescaleIntercept);
if (rs.IsValid() && ri.IsValid())
- {
+ {
double slope = rs.AsDouble();
double inter = ri.AsDouble();
if (slope > 0)
- {
+ {
windowWidth = windowWidth / slope;
windowCenter = (windowCenter - inter) / slope;
- }
}
+ }
// a scale parameter is more efficient and convenient
if (windowWidth > 0)
- {
+ {
windowScale = 255.0/windowWidth;
- }
}
+ }
for (int yIdx = extent[2]; yIdx <= extent[3]; yIdx++)
- {
+ {
T *inPtr = inPtrZ + inIncY*(yIdx - extent[2]);
unsigned char *outPtr = outPtrZ + outIncY*(yIdx - extent[2]);
// in base thread, report progress every 2% of the way to 100%
if (id == 0)
- {
+ {
++progress;
vtkIdType icount = progress*50/target;
if (progress == icount*target/50)
- {
+ {
self->UpdateProgress(progress*1.0/target);
- }
}
+ }
for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
- {
+ {
int idx = inPtr[0] - firstValueMapped;
if (monochrome || (supplemental && idx < 0))
- {
+ {
// use monochrome
double fidx = (inPtr[0] - windowCenter)*windowScale + 127.5;
fidx = (fidx >= 0.0 ? fidx : 0.0);
@@ -194,9 +194,9 @@ void vtkDICOMApplyPaletteExecute(
outPtr[0] = gray;
outPtr[1] = gray;
outPtr[2] = gray;
- }
+ }
else
- {
+ {
// use color
idx = (idx >= 0 ? idx : 0);
idx = (idx <= maxIdx ? idx : maxIdx);
@@ -204,13 +204,13 @@ void vtkDICOMApplyPaletteExecute(
outPtr[0] = rgb[0];
outPtr[1] = rgb[1];
outPtr[2] = rgb[2];
- }
+ }
inPtr += inputComponents;
outPtr += outputComponents;
- }
}
}
}
+ }
}
} // end anonymous namespace
@@ -243,8 +243,8 @@ int vtkDICOMApplyPalette::RequestInformation(
bool hasPalette = false;
if (meta && meta->GetAttributeValue(DC::SamplesPerPixel).Matches(1))
- {
- // Check if PhotometricInterpretation is PALETTE_COLOR
+ {
+ // Check if PhotometricInterpretation is PALETTE COLOR
const vtkDICOMValue& u = meta->GetAttributeValue(
DC::PhotometricInterpretation);
hasPalette = u.Matches("PALETTE?COLOR");
@@ -255,11 +255,11 @@ int vtkDICOMApplyPalette::RequestInformation(
v.Matches("MIXED") ||
v.Matches("TRUE_COLOR"));
hasPalette |= this->IsSupplemental;
- }
+ }
// Modify the information
if (hasPalette)
- {
+ {
// By setting Palette, we let RequestData know that there is a palette
this->Palette = new vtkDICOMPerFilePalette;
scalarType = VTK_UNSIGNED_CHAR;
@@ -285,7 +285,7 @@ int vtkDICOMApplyPalette::RequestInformation(
outMeta->RemoveAttribute(DC::RedPaletteColorLookupTableData);
outMeta->RemoveAttribute(DC::GreenPaletteColorLookupTableData);
outMeta->RemoveAttribute(DC::BluePaletteColorLookupTableData);
- }
+ }
return 1;
}
@@ -303,7 +303,7 @@ int vtkDICOMApplyPalette::RequestData(
// Passthrough if there is no palette to apply
if (meta == 0 || this->Palette == 0)
- {
+ {
vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
vtkInformation *outInfo = outputVector->GetInformationObject(0);
vtkImageData *inData =
@@ -314,16 +314,16 @@ int vtkDICOMApplyPalette::RequestData(
outData->CopyStructure(inData);
outData->GetPointData()->PassData(inData->GetPointData());
return 1;
- }
+ }
// Build the lookup tables for all files that make up the volume
int n = meta->GetNumberOfInstances();
this->Palette->resize(n);
for (int i = 0; i < n; i++)
- {
+ {
(*(this->Palette))[i] = vtkSmartPointer<vtkDICOMLookupTable>::New();
(*(this->Palette))[i]->BuildImagePalette(meta, i);
- }
+ }
// Allow the superclass to call the ThreadedRequestData method
int rval = this->Superclass::RequestData(
@@ -356,11 +356,11 @@ void vtkDICOMApplyPalette::ThreadedRequestData(
void *outVoidPtr = outData->GetScalarPointerForExtent(extent);
switch (scalarType)
- {
+ {
vtkTemplateAliasMacro(
vtkDICOMApplyPaletteExecute(
this, inData, static_cast<VTK_TT *>(inVoidPtr), outData,
static_cast<unsigned char *>(outVoidPtr), extent,
this->Palette, this->IsSupplemental, id));
- }
+ }
}
diff --git a/Source/vtkDICOMApplyPalette.h b/Source/vtkDICOMApplyPalette.h
index d05c7de..57637a6 100644
--- a/Source/vtkDICOMApplyPalette.h
+++ b/Source/vtkDICOMApplyPalette.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,14 +11,16 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMApplyPalette - Apply palette to PALETTE_COLOR images
-// .SECTION Description
-// If an image contains a palette LUT, then this filter will apply that
-// LUT to the image and produce an RGB image. Images without a palette
-// LUT will pass through unchanged. If the image uses a supplemental
-// palette that only applies to a specific range of pixel values, then
-// pixel values outside of that range will be mapped to greyscale via
-// the WindowWidth and WindowCenter specified in the image.
+/*! \class vtkDICOMApplyPalette
+ * \brief Apply palette to PALETTE COLOR images
+ *
+ * If an image contains a palette LUT, then this filter will apply that
+ * LUT to the image and produce an RGB image. Images without a palette
+ * LUT will pass through unchanged. If the image uses a supplemental
+ * palette that only applies to a specific range of pixel values, then
+ * pixel values outside of that range will be mapped to greyscale via
+ * the WindowWidth and WindowCenter specified in the image.
+ */
#ifndef vtkDICOMApplyPalette_h
#define vtkDICOMApplyPalette_h
@@ -33,13 +35,10 @@ class vtkDICOMPerFilePalette;
class VTKDICOM_EXPORT vtkDICOMApplyPalette : public vtkDICOMAlgorithm
{
public:
- // Description:
- // Static method for construction.
static vtkDICOMApplyPalette *New();
vtkTypeMacro(vtkDICOMApplyPalette, vtkDICOMAlgorithm);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
protected:
@@ -59,17 +58,15 @@ protected:
vtkInformationVector *outputVector, vtkImageData ***inData,
vtkImageData **outData, int ext[6], int id);
- // Description:
- // Container for the lookup tables used.
+ //! Container for the lookup tables used.
vtkDICOMPerFilePalette *Palette;
- // Description:
- // True if palette is supplemental.
+ //! True if palette is supplemental.
bool IsSupplemental;
private:
- vtkDICOMApplyPalette(const vtkDICOMApplyPalette&); // Not implemented.
- void operator=(const vtkDICOMApplyPalette&); // Not implemented.
+ vtkDICOMApplyPalette(const vtkDICOMApplyPalette&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMApplyPalette&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMApplyPalette_h
diff --git a/Source/vtkDICOMApplyRescale.cxx b/Source/vtkDICOMApplyRescale.cxx
index 8d8fa7c..2f7a65f 100644
--- a/Source/vtkDICOMApplyRescale.cxx
+++ b/Source/vtkDICOMApplyRescale.cxx
@@ -77,10 +77,10 @@ vtkDICOMApplyRescale::~vtkDICOMApplyRescale()
void vtkDICOMApplyRescale::SetOutputScalarType(int t)
{
if (t != this->OutputScalarType && (t == VTK_DOUBLE || t == VTK_FLOAT))
- {
+ {
this->OutputScalarType = t;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -115,97 +115,97 @@ void vtkDICOMApplyRescaleExecute(
vtkIdType progress = 0;
for (int c = 0; c < numComponents; c++)
- {
+ {
T *inPtrC = inPtr0 + c;
F *outPtrC = outPtr0 + c;
for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++)
- {
+ {
vtkDICOMRealWorldMapping *mapping = 0;
T first = vtkTypeTraits<T>::Min();
T last = vtkTypeTraits<T>::Max();
if (mapArray)
- {
+ {
mapping = &mapArray[(zIdx - wholeExtent[4])*numComponents + c];
if (mapping->First > static_cast<int>(first))
- {
+ {
first = static_cast<T>(mapping->First);
- }
+ }
if (mapping->Last < static_cast<int>(last))
- {
+ {
last = static_cast<T>(mapping->Last);
- }
}
+ }
T *inPtrZ = inPtrC + (zIdx - extent[4])*inIncZ;
F *outPtrZ = outPtrC + (zIdx - extent[4])*outIncZ;
for (int yIdx = extent[2]; yIdx <= extent[3]; yIdx++)
- {
+ {
T *inPtr = inPtrZ + inIncY*(yIdx - extent[2]);
F *outPtr = outPtrZ + outIncY*(yIdx - extent[2]);
// in base thread, report progress every 2% of the way to 100%
if (id == 0)
- {
+ {
++progress;
vtkIdType icount = progress*50/target;
if (progress == icount*target/50)
- {
+ {
self->UpdateProgress(progress*1.0/target);
- }
}
+ }
if (mapping == 0)
- {
+ {
// no mapping to apply
for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
- {
+ {
*outPtr = *inPtr;
inPtr += numComponents;
outPtr += numComponents;
- }
}
+ }
else if (mapping->Map)
- {
+ {
// apply lookup table
const double *table = mapping->Map;
for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
- {
+ {
if (*inPtr >= first && *inPtr <= last)
- {
+ {
*outPtr = table[*inPtr - first];
- }
+ }
else
- {
+ {
*outPtr = 0;
- }
+ }
inPtr += numComponents;
outPtr += numComponents;
- }
}
+ }
else
- {
+ {
// apply slope and intercept
double m = mapping->Slope;
double b = mapping->Intercept;
for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
- {
+ {
if (*inPtr >= first && *inPtr <= last)
- {
+ {
*outPtr = *inPtr*m + b;
- }
+ }
else
- {
+ {
*outPtr = 0;
- }
+ }
inPtr += numComponents;
outPtr += numComponents;
- }
}
}
}
}
+ }
}
} // end anonymous namespace
@@ -262,16 +262,16 @@ int vtkDICOMApplyRescale::RequestData(
metaInfo->Get(vtkDICOMAlgorithm::META_DATA()));
if (meta)
- {
+ {
size_t sz = (static_cast<size_t>(numComponents)*
static_cast<size_t>(extent[5] - extent[4] + 1));
this->Mapping = new vtkDICOMRealWorldMapping[sz];
bool hasMapping = false;
for (int c = 0; c < numComponents; c++)
- {
+ {
for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++)
- {
+ {
vtkDICOMRealWorldMapping *mapping =
&this->Mapping[(zIdx - extent[4])*numComponents + c];
mapping->First = VTK_INT_MIN;
@@ -288,7 +288,7 @@ int vtkDICOMApplyRescale::RequestData(
const vtkDICOMItem *rwvmi = rwvms.GetSequenceData();
if (rwvmi)
- {
+ {
// use the real world value mapping first item
mapping->First = rwvmi->GetAttributeValue(
DC::RealWorldValueFirstValueMapped).AsInt();
@@ -304,45 +304,45 @@ int vtkDICOMApplyRescale::RequestData(
DC::RealWorldValueLUTData);
if (v.GetNumberOfValues() >=
static_cast<size_t>(mapping->Last - mapping->First + 1))
- {
+ {
mapping->Map = v.GetDoubleData();
- }
- hasMapping = true;
}
+ hasMapping = true;
+ }
else
- {
+ {
// use the slope and intercept instead
const vtkDICOMValue& u = meta->GetAttributeValue(
i, j, DC::RescaleSlope);
const vtkDICOMValue& v = meta->GetAttributeValue(
i, j, DC::RescaleIntercept);
if (u.IsValid() && v.IsValid())
- {
+ {
mapping->Slope = u.AsDouble();
mapping->Intercept = v.AsDouble();
hasMapping = true;
- }
}
+ }
// zero slope means slope wasn't found
if (mapping->Slope == 0)
- {
+ {
mapping->Slope = 1.0;
- }
}
}
+ }
if (!hasMapping)
- {
+ {
delete [] this->Mapping;
this->Mapping = 0;
- }
}
+ }
// Passthrough if data is already floating-point
int rval = 1;
if (scalarType == VTK_DOUBLE || scalarType == VTK_FLOAT)
- {
+ {
vtkImageData *inData =
vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT()));
vtkImageData *outData =
@@ -350,13 +350,13 @@ int vtkDICOMApplyRescale::RequestData(
outData->CopyStructure(inData);
outData->GetPointData()->PassData(inData->GetPointData());
- }
+ }
else
- {
+ {
// Allow the superclass to call the ThreadedRequestData method
rval = this->Superclass::RequestData(
request, inputVector, outputVector);
- }
+ }
delete [] this->Mapping;
this->Mapping = 0;
@@ -388,23 +388,23 @@ void vtkDICOMApplyRescale::ThreadedRequestData(
int outScalarType = outData->GetScalarType();
if (outScalarType == VTK_FLOAT)
- {
+ {
switch (scalarType)
- {
+ {
vtkTemplateAliasMacro(
vtkDICOMApplyRescaleExecute(
this, inData, static_cast<VTK_TT *>(inVoidPtr), outData,
static_cast<float *>(outVoidPtr), this->Mapping, extent, id));
- }
}
+ }
else if (outScalarType == VTK_DOUBLE)
- {
+ {
switch (scalarType)
- {
+ {
vtkTemplateAliasMacro(
vtkDICOMApplyRescaleExecute(
this, inData, static_cast<VTK_TT *>(inVoidPtr), outData,
static_cast<double *>(outVoidPtr), this->Mapping, extent, id));
- }
}
+ }
}
diff --git a/Source/vtkDICOMApplyRescale.h b/Source/vtkDICOMApplyRescale.h
index 92b0435..1e81ccf 100644
--- a/Source/vtkDICOMApplyRescale.h
+++ b/Source/vtkDICOMApplyRescale.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,15 +11,17 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMApplyRescale - Convert pixels to real-world values.
-// .SECTION Description
-// This filter uses the information in the DICOM meta data to convert the
-// pixel values to real-world values with known units. It uses the DICOM
-// RealWorldValueMapping attributes, if present, otherwise it uses the
-// RescaleSlope and RescaleIntercept. If no mapping information is present,
-// then the pixels are simply converted to floating-point. Note that if
-// this filter is used, then AutoRescaleOff() should be set on the reader
-// to ensure that the reader does not rescale the data.
+/*! \class vtkDICOMApplyRescale
+ * \brief Convert pixels to real-world values.
+ *
+ * This filter uses the information in the DICOM meta data to convert the
+ * pixel values to real-world values with known units. It uses the DICOM
+ * RealWorldValueMapping attributes, if present, otherwise it uses the
+ * RescaleSlope and RescaleIntercept. If no mapping information is present,
+ * then the pixels are simply converted to floating-point. Note that if
+ * this filter is used, then AutoRescaleOff() should be set on the reader
+ * to ensure that the reader does not rescale the data.
+ */
#ifndef vtkDICOMApplyRescale_h
#define vtkDICOMApplyRescale_h
@@ -33,15 +35,16 @@ class VTKDICOM_EXPORT vtkDICOMApplyRescale :
public vtkDICOMAlgorithm
{
public:
- static vtkDICOMApplyRescale *New();
vtkTypeMacro(vtkDICOMApplyRescale, vtkDICOMAlgorithm);
- // Description:
- // Print information about this object.
+ //! Static method for construction.
+ static vtkDICOMApplyRescale *New();
+
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Set the output data type to float or double (default is double).
+ //@{
+ //! Set the output data type to float or double (default is double).
void SetOutputScalarType(int t);
void SetOutputScalarTypeToFloat() {
this->SetOutputScalarType(VTK_FLOAT); }
@@ -49,6 +52,7 @@ public:
this->SetOutputScalarType(VTK_DOUBLE); }
int GetOutputScalarType() {
return this->OutputScalarType; }
+ //@}
protected:
vtkDICOMApplyRescale();
@@ -71,8 +75,8 @@ protected:
int OutputScalarType;
private:
- vtkDICOMApplyRescale(const vtkDICOMApplyRescale&); // Not implemented.
- void operator=(const vtkDICOMApplyRescale&); // Not implemented.
+ vtkDICOMApplyRescale(const vtkDICOMApplyRescale&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMApplyRescale&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMApplyRescale_h
diff --git a/Source/vtkDICOMCTGenerator.cxx b/Source/vtkDICOMCTGenerator.cxx
index a52a7f2..ca8c7df 100644
--- a/Source/vtkDICOMCTGenerator.cxx
+++ b/Source/vtkDICOMCTGenerator.cxx
@@ -62,13 +62,13 @@ bool vtkDICOMCTGenerator::GenerateCTImageModule(vtkDICOMMetaData *source)
// AXIAL or LOCALIZER
const char *it = 0;
if (source)
- {
+ {
it = source->GetAttributeValue(DC::ImageType).GetCharData();
- }
+ }
if (it == 0 || it[0] == '\0')
- {
+ {
it = "DERIVED\\SECONDARY\\AXIAL";
- }
+ }
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(DC::ImageType, it);
@@ -164,9 +164,9 @@ bool vtkDICOMCTGenerator::GenerateCTInstance(vtkInformation *info)
!this->GenerateCTImageModule(source) ||
!this->GenerateOverlayPlaneModule(source) ||
!this->GenerateVOILUTModule(source))
- {
+ {
return false;
- }
+ }
return true;
}
@@ -175,10 +175,10 @@ bool vtkDICOMCTGenerator::GenerateCTInstance(vtkInformation *info)
bool vtkDICOMCTGenerator::GenerateInstance(vtkInformation *info)
{
if (this->MultiFrame)
- {
+ {
vtkErrorMacro("Enhanced Multi-Frame CT is not yet supported.");
return false;
- }
+ }
return this->GenerateCTInstance(info);
}
diff --git a/Source/vtkDICOMCTGenerator.h b/Source/vtkDICOMCTGenerator.h
index 7f92416..785c467 100644
--- a/Source/vtkDICOMCTGenerator.h
+++ b/Source/vtkDICOMCTGenerator.h
@@ -57,8 +57,8 @@ protected:
virtual bool GenerateCTInstance(vtkInformation *info);
private:
- vtkDICOMCTGenerator(const vtkDICOMCTGenerator&); // Not implemented.
- void operator=(const vtkDICOMCTGenerator&); // Not implemented.
+ vtkDICOMCTGenerator(const vtkDICOMCTGenerator&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMCTGenerator&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMCTGenerator_h
diff --git a/Source/vtkDICOMCTRectifier.cxx b/Source/vtkDICOMCTRectifier.cxx
index 22032f2..82290e1 100644
--- a/Source/vtkDICOMCTRectifier.cxx
+++ b/Source/vtkDICOMCTRectifier.cxx
@@ -45,17 +45,17 @@ vtkDICOMCTRectifier::vtkDICOMCTRectifier()
vtkDICOMCTRectifier::~vtkDICOMCTRectifier()
{
if (this->RectifiedMatrix)
- {
+ {
this->RectifiedMatrix->Delete();
- }
+ }
if (this->VolumeMatrix)
- {
+ {
this->VolumeMatrix->Delete();
- }
+ }
if (this->Matrix)
- {
+ {
this->Matrix->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -65,35 +65,35 @@ void vtkDICOMCTRectifier::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "VolumeMatrix:";
if (this->VolumeMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->VolumeMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "RectifiedMatrix:";
if (this->RectifiedMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->RectifiedMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "Reverse: " << this->Reverse << "\n";
}
@@ -103,10 +103,10 @@ void vtkDICOMCTRectifier::SetReverse(int val)
{
val = (val != 0);
if (val != this->Reverse)
- {
+ {
this->Reverse = val;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -115,11 +115,11 @@ void vtkDICOMCTRectifier::ComputeMatrix(
double spacing[3], double origin[3])
{
if (volumeMatrix == 0)
- {
+ {
this->RectifiedMatrix->Identity();
this->Matrix->Identity();
return;
- }
+ }
// get the first two columns of the volume matrix
double xvec[4] = { 1.0, 0.0, 0.0, 0.0 };
@@ -138,19 +138,19 @@ void vtkDICOMCTRectifier::ComputeMatrix(
// compute the shear matrix
vtkMatrix4x4 *matrix = this->Matrix;
if (this->Reverse)
- {
+ {
matrix->DeepCopy(this->RectifiedMatrix);
matrix->Invert();
double elements[16];
vtkMatrix4x4::Multiply4x4(*matrix->Element, volumeMatrix, elements);
matrix->DeepCopy(elements);
- }
+ }
else
- {
+ {
matrix->DeepCopy(volumeMatrix);
matrix->Invert();
vtkMatrix4x4::Multiply4x4(matrix, this->RectifiedMatrix, matrix);
- }
+ }
// compute the shear parameters for the volume
double zdn = matrix->GetElement(2, 2);
@@ -169,11 +169,11 @@ void vtkDICOMCTRectifier::ComputeMatrix(
matrix->SetElement(2, 3, pos[2]);
if (this->Reverse)
- {
+ {
pos[0] = -pos[0];
pos[1] = -pos[1];
pos[2] = -pos[2];
- }
+ }
vtkMatrix4x4::MultiplyPoint(volumeMatrix, pos, pos);
this->RectifiedMatrix->SetElement(0, 3, pos[0]);
@@ -223,15 +223,15 @@ int vtkDICOMCTRectifier::RequestInformation(
double *volumeMatrix;
if (this->VolumeMatrix)
- {
+ {
// If a VolumeMatrix was provided, then use it.
volumeMatrix = *this->VolumeMatrix->Element;
- }
+ }
else
- {
+ {
// Otherwise, try to get the patient matrix from the pipeline.
volumeMatrix = metaInfo->Get(vtkDICOMAlgorithm::PATIENT_MATRIX());
- }
+ }
// Compute the shear matrix and the new spacing and origin.
this->ComputeMatrix(volumeMatrix, extent, spacing, origin);
@@ -239,13 +239,13 @@ int vtkDICOMCTRectifier::RequestInformation(
// Write the new patient matrix to the pipeline.
double *outMatrix = *this->RectifiedMatrix->Element;
if (this->Reverse)
- {
+ {
outMatrix = volumeMatrix;
- }
+ }
if (outMatrix)
- {
+ {
outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), outMatrix, 16);
- }
+ }
// The spacing and origin may have changed.
outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6);
diff --git a/Source/vtkDICOMCTRectifier.h b/Source/vtkDICOMCTRectifier.h
index 379a32c..d263967 100644
--- a/Source/vtkDICOMCTRectifier.h
+++ b/Source/vtkDICOMCTRectifier.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,11 +11,13 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMCTRectifier - Prepare a CT for 3D processing
-// .SECTION Description
-// This class will identify gantry-tilted CT images and resample them
-// into a rectangular volume. This is often a necessary step prior to
-// volume rendering or other forms of 3D rendering.
+/*! \class vtkDICOMCTRectifier
+ * \brief Prepare a CT for 3D processing
+ *
+ * This class will identify gantry-tilted CT images and resample them
+ * into a rectangular volume. This is often a necessary step prior to
+ * volume rendering or other forms of 3D rendering.
+ */
#ifndef vtkDICOMCTRectifier_h
#define vtkDICOMCTRectifier_h
@@ -29,58 +31,72 @@ class vtkMatrix4x4;
class VTKDICOM_EXPORT vtkDICOMCTRectifier : public vtkDICOMAlgorithm
{
public:
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkDICOMCTRectifier *New();
vtkTypeMacro(vtkDICOMCTRectifier, vtkDICOMAlgorithm);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Reverse the default operation.
- // When this option is set, the filter takes a rectangular volume
- // as input, and produces a volume whose geometry matches the
- // VolumeMatrix.
+ //@{
+ //! Reverse the default operation.
+ /*!
+ * When this option is set, the filter takes a rectangular volume
+ * as input, and produces a volume whose geometry matches the
+ * VolumeMatrix.
+ */
void SetReverse(int v);
void ReverseOn() { this->SetReverse(1); }
void ReverseOff() { this->SetReverse(0); }
int GetReverse() { return this->Reverse; }
-
- // Description:
- // Set the matrix that describes the CT volume geometry.
- // This should be set to the PatientMatrix that comes from the
- // vtkDICOMReader.
+ //@}
+
+ //@{
+ //! Set the matrix that describes the CT volume geometry.
+ /*!
+ * This should be set to the PatientMatrix that comes from the
+ * vtkDICOMReader.
+ */
void SetVolumeMatrix(vtkMatrix4x4 *matrix);
vtkMatrix4x4 *GetVolumeMatrix() { return this->VolumeMatrix; }
-
- // Description:
- // Get the matrix that describes the rectified geometry.
- // This matrix is generated when any of these methods is called:
- // Update(), UpdateInformation(), or UpdateMatrix().
+ //@}
+
+ //@{
+ //! Get the matrix that describes the rectified geometry.
+ /*!
+ * This matrix is generated when any of these methods is called:
+ * Update(), UpdateInformation(), or UpdateMatrix().
+ */
vtkMatrix4x4 *GetRectifiedMatrix() { return this->RectifiedMatrix; }
+ //@}
- // Description:
- // Update the RectifiedMatrix without updating the output data.
- // The input data must be set before this is called.
+ //@{
+ //! Update the RectifiedMatrix without updating the output data.
+ /*!
+ * The input data must be set before this is called.
+ */
void UpdateMatrix();
-
- // Description:
- // A static method to measure the tilt from a matrix.
- // This can be used to see whether it is necessary to rectify the
- // volume. It returns the Gantry Detector Tilt angle, in degrees,
- // as computed from the shear in the volume matrix.
+ //@}
+
+ //@{
+ //! A static method to measure the tilt from a matrix.
+ /*!
+ * This can be used to see whether it is necessary to rectify the
+ * volume. It returns the Gantry Detector Tilt angle, in degrees,
+ * as computed from the shear in the volume matrix.
+ */
static double GetGantryDetectorTilt(vtkMatrix4x4 *volumeMatrix);
+ //@}
protected:
vtkDICOMCTRectifier();
~vtkDICOMCTRectifier();
- // Description:
- // Compute the rectified matrix from the given volume matrix.
- // The extent, spacing, and origin of the image must also be given,
- // and they will be adjusted as necessary.
+ //! Compute the rectified matrix from the given volume matrix.
+ /*!
+ * The extent, spacing, and origin of the image must also be given,
+ * and they will be adjusted as necessary.
+ */
void ComputeMatrix(
const double matrix[16], const int extent[6], double spacing[3],
double origin[3]);
@@ -108,8 +124,8 @@ protected:
int Reverse;
private:
- vtkDICOMCTRectifier(const vtkDICOMCTRectifier&); // Not implemented.
- void operator=(const vtkDICOMCTRectifier&); // Not implemented.
+ vtkDICOMCTRectifier(const vtkDICOMCTRectifier&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMCTRectifier&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMCTRectifier_h
diff --git a/Source/vtkDICOMCharacterSet.cxx b/Source/vtkDICOMCharacterSet.cxx
index bd47b0c..a807bb4 100644
--- a/Source/vtkDICOMCharacterSet.cxx
+++ b/Source/vtkDICOMCharacterSet.cxx
@@ -22,7 +22,7 @@ namespace {
// of the name appears in SpecificCharacterSet, then iso-2022 escape codes
// can be used to switch between character sets. The escape codes to switch
// to the character set are given in the third column.
-const char *Charsets[16][3] = {
+const char *const Charsets[16][3] = {
{ "ISO_IR 6", "ISO 2022 IR 6", "(B" }, // ascii
{ "ISO_IR 100", "ISO 2022 IR 100", "-A" }, // iso-8859-1, western europe
{ "ISO_IR 101", "ISO 2022 IR 101", "-B" }, // iso-8859-2, central europe
@@ -35,7 +35,7 @@ const char *Charsets[16][3] = {
{ "ISO_IR 148", "ISO 2022 IR 148", "-M" }, // iso-8859-9, latin5, turkish
{ "ISO_IR 166", "ISO 2022 IR 166", "-T" }, // iso-8859-11, thai
{ "ISO_IR 13", "ISO 2022 IR 13", ")I" }, // JIS X 0201, katakana
- { "ISO_IR 14", "ISO 2022 IR 14", "(J" }, // JIS X 0201, romaji
+ { "ISO_IR 13", "ISO 2022 IR 13", "(J" }, // JIS X 0201, romaji
{ "ISO_IR 192", "", "" }, // unicode multibyte
{ "GB18030", "", "" }, // chinese multibyte
{ "GBK", "", "" }, // subset of GB18030
@@ -45,15 +45,15 @@ const char *Charsets[16][3] = {
const int ISO_2022_LOWBIT = 16;
// This table gives secondary character sets.
-const char *Extensions[4][3] = {
- { "ISO_IR 58", "ISO 2022 IR 58", "$)A" }, // GB2313, chinese
+const char *const Extensions[4][3] = {
+ { "ISO_IR 58", "ISO 2022 IR 58", "$)A" }, // GB2312, chinese
{ "ISO_IR 87", "ISO 2022 IR 87", "$B" }, // JIS X 0208, japanese
{ "ISO_IR 159", "ISO 2022 IR 159", "$(D" }, // JIS X 0212, japanese
{ "ISO_IR 149", "ISO 2022 IR 149", "$)C" } }; // KS X 1001, korean
// Code pages for ISO-8859-2/3/4/5/6/7/8/9/11, these were autogenerated
// from the files at http://www.unicode.org/Public/MAPPINGS/ISO8859/
-unsigned short CodePagesISO8859[96][9] = {
+const unsigned short CodePagesISO8859[96][9] = {
{ 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0 },
{ 0x0104, 0x0126, 0x0104, 0x0401, 0xFFFD, 0x2018, 0xFFFD, 0x00A1, 0x0E01 },
{ 0x02D8, 0x02D8, 0x0138, 0x0402, 0xFFFD, 0x2019, 0x00A2, 0x00A2, 0x0E02 },
@@ -152,8 +152,9 @@ unsigned short CodePagesISO8859[96][9] = {
{ 0x02D9, 0x02D9, 0x02D9, 0x045F, 0xFFFD, 0xFFFD, 0xFFFD, 0x00FF, 0xFFFD }
};
-// Code page for JIS X 0208 from java-ISO2022JP-1.3_P.ucm
-unsigned short CodePageJISX0208[8836] = {
+// Code page for JIS X 0208 from JIS0208.TXT, except that backslash has
+// been replaced by "fullwidth reverse solidus" U+FF3C (Unicode 1.1).
+const unsigned short CodePageJISX0208[8836] = {
0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F,
0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, 0xFF3E, 0xFFE3, 0xFF3F,
0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 0x3005, 0x3006, 0x3007,
@@ -467,17 +468,17 @@ unsigned short CodePageJISX0208[8836] = {
0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 0x5197,
0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, 0x6761,
0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320,
- 0x5631, 0x57F4, 0x98FE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x6F84, 0x647A,
+ 0x5631, 0x57F4, 0x98FE, 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077,
+ 0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5,
+ 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B,
+ 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,
+ 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032,
+ 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC, 0x5C0B, 0x751A,
+ 0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808,
+ 0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34,
+ 0x708A, 0x7761, 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318,
+ 0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB,
+ 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A,
0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,
0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816,
0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD,
@@ -1138,8 +1139,9 @@ unsigned short CodePageJISX0208[8836] = {
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD
};
-// Code page for JIS X 0212 from JIS0212.TXT
-unsigned short CodePageJISX0212[8836] = {
+// Code page for JIS X 0212 from JIS0212.TXT, except that narrow tilde
+// has been replaced by fullwidth tilde U+FF5E (Unicode 1.1).
+const unsigned short CodePageJISX0212[8836] = {
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
@@ -1152,7 +1154,7 @@ unsigned short CodePageJISX0212[8836] = {
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0x02D8, 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0x007E,
+ 0x02D8, 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0xFF5E,
0x0384, 0x0385, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0x00A1, 0x00A6, 0x00BF, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
@@ -2124,8 +2126,11 @@ unsigned short CodePageJISX0212[8836] = {
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD
};
-// Code page for KS X 1001 from java-ISO2022KR-1.3_P.ucm
-unsigned short CodePageKSX1001[8836] = {
+// Code page for KS X 1001 from KSX1001.TXT, with two new symbols that were
+// added for KS X 1001:1998
+// 1) "euro sign" U+20AC
+// 2) "registered sign" 0x00AE
+const unsigned short CodePageKSX1001[8836] = {
0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x00AD,
0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014,
0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,
@@ -2144,7 +2149,7 @@ unsigned short CodePageKSX1001[8836] = {
0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6,
0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669,
0x266A, 0x266C, 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8,
- 0x2121, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+ 0x2121, 0x20AC, 0x00AE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFF01,
0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A,
@@ -2439,17 +2444,17 @@ unsigned short CodePageKSX1001[8836] = {
0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591, 0xC595, 0xC597,
0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB,
0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9,
- 0xC5CA, 0xC5CC, 0xC5CE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xC6E9, 0xC6EC,
+ 0xC5CA, 0xC5CC, 0xC5CE, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1,
+ 0xC5E3, 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7,
+ 0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,
+ 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624, 0xC625,
+ 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634, 0xC635, 0xC637,
+ 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648, 0xC650, 0xC651, 0xC653,
+ 0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678,
+ 0xC679, 0xC67C, 0xC680, 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695,
+ 0xC698, 0xC69C, 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4,
+ 0xC6B8, 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD,
+ 0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,
0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C, 0xC714,
0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728, 0xC730, 0xC731,
0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C,
@@ -3113,7 +3118,12 @@ unsigned short CodePageKSX1001[8836] = {
// Code page for gb18030 two-byte codes from gb-18030-2005.ucm.
// There were 24 codes with duplicate mappings, which are listed in
// the PrivateToStandard table below.
-unsigned short CodePageGB18030[23940] = {
+// This table is also used for GB2312 and GBK, to ensure compatibility.
+// However, note that GBK/GB18030 differs from GNU iconv's GB2312 table
+// for these two code points:
+// 1) here 'middle dot' U+00B7 -> iconv 'katakana middle dot' U+30FB
+// 2) here 'em dash' U+2014 -> iconv 'horizontal bar' U+2015
+const unsigned short CodePageGB18030[23940] = {
0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, 0x4E20,
0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, 0x4E33, 0x4E35,
0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, 0x4E46, 0x4E4A, 0x4E51,
@@ -5777,7 +5787,7 @@ unsigned short CodePageGB18030[23940] = {
};
// Linear table for gb18030 four-byte codes that map to the BMP.
-unsigned short LinearGB18030[412] = {
+const unsigned short LinearGB18030[412] = {
0x0000, 0x0080, 0x0024, 0x00A5, 0x0026, 0x00A9, 0x002D, 0x00B2,
0x0032, 0x00B8, 0x0051, 0x00D8, 0x0059, 0x00E2, 0x005F, 0x00EB,
0x0060, 0x00EE, 0x0064, 0x00F4, 0x0067, 0x00F8, 0x0068, 0x00FB,
@@ -5832,45 +5842,53 @@ unsigned short LinearGB18030[412] = {
0x9961, 0xFF5F, 0x99E2, 0xFFE6
};
-// Note: in the GB18030-2005 tables some codepoints in the private
-// range U+E000..U+F8FF migrated to standard unicode codepoints.
-// My understanding is that this allows more characters to be displayed
-// when the PUA is not mapped to GBK characters, but reduces the ability
-// of GB18030 to reversibly encode these private codepoints.
+// Note: GB18030 maps 24 characters to the private use area, though
+// as of Unicode 4.1 there are now standard unicode codes for these.
+// By moving these out of the PUA, it becomes possible to display
+// these characters on systems that support Unicode 4.1 and have the
+// necessary fonts. However, it breaks the round-trip compatibility
+// between GB18030 and Unicode and therefore breaks GB18030-2005.
const unsigned int PrivateToStandard[48] = {
- 0xE81E, 0x9FB4, 0xE826, 0x9FB5, 0xE82B, 0x9FB6, 0xE82C, 0x9FB7,
- 0xE832, 0x9FB8, 0xE843, 0x9FB9, 0xE854, 0x9FBA, 0xE864, 0x9FBB,
- 0xE78D, 0xFE10, 0xE78F, 0xFE11, 0xE78E, 0xFE12, 0xE790, 0xFE13,
+ 0xE78D, 0xFE10, 0xE78E, 0xFE12, 0xE78F, 0xFE11, 0xE790, 0xFE13,
0xE791, 0xFE14, 0xE792, 0xFE15, 0xE793, 0xFE16, 0xE794, 0xFE17,
0xE795, 0xFE18, 0xE796, 0xFE19, 0xE816, 0x20087, 0xE817, 0x20089,
- 0xE818, 0x200CC, 0xE831, 0x215D7, 0xE83B, 0x2298F, 0xE855, 0x241FE
+ 0xE818, 0x200CC, 0xE81E, 0x9FB4, 0xE826, 0x9FB5, 0xE82B, 0x9FB6,
+ 0xE82C, 0x9FB7, 0xE831, 0x215D7, 0xE832, 0x9FB8, 0xE83B, 0x2298F,
+ 0xE843, 0x9FB9, 0xE854, 0x9FBA, 0xE855, 0x241FE, 0xE864, 0x9FBB
};
// Convert a unicode code point to UTF-8
inline void UnicodeToUTF8(unsigned int code, std::string *s)
{
if (code <= 0x007F)
- {
+ {
s->push_back(code);
- }
+ }
else if (code <= 0x07FF)
- {
+ {
s->push_back(0xC0 | (code >> 6));
s->push_back(0x80 | (code & 0x3F));
- }
+ }
else if (code <= 0xFFFF)
- {
+ {
s->push_back(0xE0 | (code >> 12));
s->push_back(0x80 | ((code >> 6) & 0x3F));
s->push_back(0x80 | (code & 0x3F));
- }
+ }
else if (code <= 0x10FFFF)
- {
+ {
s->push_back(0xF0 | (code >> 18));
s->push_back(0x80 | ((code >> 12) & 0x3F));
s->push_back(0x80 | ((code >> 6) & 0x3F));
s->push_back(0x80 | (code & 0x3F));
- }
+ }
+ else
+ {
+ // indicate bad code with U+FFFD
+ s->push_back(0xEF);
+ s->push_back(0xBF);
+ s->push_back(0xBD);
+ }
}
inline unsigned int UTF8ToUnicode(const char **cpp, const char *cpEnd)
@@ -5879,68 +5897,95 @@ inline unsigned int UTF8ToUnicode(const char **cpp, const char *cpEnd)
const unsigned char *ep = reinterpret_cast<const unsigned char *>(cpEnd);
unsigned int code = 0;
if (cp != ep)
- {
+ {
code = *cp++;
- }
+ }
+ // check for non-ASCII
if ((code & 0x80) != 0)
- {
+ {
bool good = false;
if (cp != ep)
- {
+ {
if ((code & 0xE0) == 0xC0)
- {
+ {
+ // 2 bytes, 0x0080 to 0x07FF
code &= 0x1F;
code <<= 6;
unsigned int s = *cp;
- good = ((s & 0xC0) == 0x80);
+ good = (code != 0);
+ good &= ((s & 0xC0) == 0x80);
cp += good;
code |= (s & 0x3F);
- }
+ }
else if (cp+1 != ep)
- {
+ {
if ((code & 0xF0) == 0xE0)
- {
+ {
+ // 3 bytes, 0x0800 to 0xFFFF
code &= 0x0F;
code <<= 6;
unsigned int s = *cp;
- good = ((s & 0xC0) == 0x80);
+ good = ((code | (s & 0x20)) != 0);
+ good &= ((s & 0xC0) == 0x80);
cp += good;
code |= (s & 0x3F);
code <<= 6;
s = *cp;
- good = ((s & 0xC0) == 0x80);
+ good &= ((s & 0xC0) == 0x80);
cp += good;
code |= (s & 0x3F);
+ // check for UTF16 surrogates
+ if (good && (code & 0xF800) == 0xD800)
+ {
+ good = false;
+ // check for high surrogate followed by low surrogate
+ if ((code & 0xFC00) == 0xD800 &&
+ cp != ep && cp[0] == 0xED &&
+ cp+1 != ep && (cp[1] & 0xF0) == 0xB0 &&
+ cp+2 != ep && (cp[2] & 0xC0) == 0x80)
+ {
+ good = true;
+ code &= 0x03FF;
+ code <<= 4;
+ code |= cp[1] & 0x0F;
+ code <<= 6;
+ code |= cp[2] & 0x3F;
+ code += 0x010000;
+ cp += 3;
+ }
}
+ }
else if (cp+2 != ep)
- {
+ {
if ((code & 0xF8) == 0xF0)
- {
+ {
+ // 4 bytes, 0x010000 to 0x10FFFF
code &= 0x07;
code <<= 6;
unsigned int s = *cp;
- good = ((s & 0xC0) == 0x80);
+ good = ((code | (s & 0x30)) != 0);
+ good &= ((s & 0xC0) == 0x80);
cp += good;
code |= (s & 0x3F);
code <<= 6;
s = *cp;
- good = ((s & 0xC0) == 0x80);
+ good &= ((s & 0xC0) == 0x80);
cp += good;
code |= (s & 0x3F);
code <<= 6;
s = *cp;
- good = ((s & 0xC0) == 0x80);
+ good &= ((s & 0xC0) == 0x80);
cp += good;
code |= (s & 0x3F);
good &= (code <= 0x10FFFF);
- }
}
}
}
+ }
code = (good ? code : 0xFFFD);
- }
+ }
*cpp = reinterpret_cast<const char *>(cp);
return code;
@@ -5954,73 +5999,73 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
unsigned int code3 = 0;
if (code <= 0x7f)
- {
+ {
if (code >= 'A' && code <= 'Z')
- { // ascii uppercase -> ascii lowercase
+ { // ascii uppercase -> ascii lowercase
code += 0x20;
- }
}
+ }
else if (code <= 0xff)
- {
+ {
if (code >= 0xC0 && code <= 0xDE && code != 0xD7)
- { // latin1 uppercase -> latin1 lowercase
+ { // latin1 uppercase -> latin1 lowercase
code += 0x20;
- }
+ }
else if (code == 0xDF)
- { // latin1 s-sharp -> lowercase ss
+ { // latin1 s-sharp -> lowercase ss
code = 's';
code2 = 's';
- }
+ }
else if (code == 0xB5)
- { // latin1 micron -> greek lowercase mu
+ { // latin1 micron -> greek lowercase mu
code = 0x03BC;
- }
}
+ }
else if (code <= 0x017f)
- {
+ {
if (code >= 0x0100 && code <= 0x012F)
- { // various accented latin characters
+ { // various accented latin characters
code |= 0x0001;
- }
+ }
else if (code == 0x0130)
- { // I with dot becomes lowercase i
+ { // I with dot becomes lowercase i
code = 'i';
code2 = 0x0307;
- }
+ }
else if (code >= 0x0132 && code <= 0x0137)
- { // IJ and various accented latin characters
+ { // IJ and various accented latin characters
code |= 0x0001;
- }
+ }
else if (code >= 0x139 && code <= 0x148)
- { // various accented latin characters
+ { // various accented latin characters
code += (code & 0x0001);
- }
+ }
else if (code == 0x0149)
- { // 'n -> two separate characters
+ { // 'n -> two separate characters
code = 0x02BC;
code2 = 'n';
- }
+ }
else if (code >= 0x014A && code <= 0x0177)
- { // eng and various accented latin characters
+ { // eng and various accented latin characters
code |= 0x0001;
- }
+ }
else if (code == 0x0178)
- { // uppercase y with diaeresis becomes lowercase y with diaeresis
+ { // uppercase y with diaeresis becomes lowercase y with diaeresis
code = 0xFF;
- }
+ }
else if (code >= 0x0179 && code <= 0x017E)
- { // various accented latin characters
+ { // various accented latin characters
code += (code & 0x0001);
- }
+ }
else if (code == 0x017F)
- { // long s -> lowercase s
+ { // long s -> lowercase s
code = 's';
- }
}
+ }
else if (code <= 0x036f)
- { // yet more latin with accents
+ { // yet more latin with accents
if (code >= 0x0180 && code <= 0x01CA)
- {
+ {
const static unsigned short table[75] = {
0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188,
0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259,
@@ -6034,22 +6079,22 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
0x01C9, 0x01C9, 0x01CC };
code = table[code - 0x0180];
- }
+ }
else if (code >= 0x01CB && code <= 0x01DC)
- {
+ {
code += (code & 0x0001);
- }
+ }
else if (code >= 0x01DE && code <= 0x01EF)
- {
+ {
code |= 0x0001;
- }
+ }
else if (code == 0x01F0)
- {
+ {
code = 0x006A;
code2 = 0x030C;
- }
+ }
else if (code >= 0x01F0 && code <= 0x024F)
- {
+ {
const static unsigned short table[96] = {
0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F5, 0x01F5, 0x0195, 0x01BF,
0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF,
@@ -6065,17 +6110,17 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x024F };
code = table[code - 0x01F0];
- }
+ }
else if (code == 0x0345)
- { // combining greek ypogegrammeni
+ { // combining greek ypogegrammeni
code = 0x03B9;
- }
}
+ }
else if (code <= 0x03ff)
- {
+ {
// greek characters
if (code >= 0x0370 && code <= 0x038F)
- {
+ {
const static unsigned short table[32] = {
0x0371, 0x0371, 0x0373, 0x0373, 0x0374, 0x0375, 0x0377, 0x0377,
0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x03F3,
@@ -6083,108 +6128,108 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
0x03AD, 0x03AE, 0x03AF, 0x038B, 0x03CC, 0x038D, 0x03CD, 0x03CE };
code = table[code - 0x0370];
- }
+ }
else if ((code >= 0x0391 && code <= 0x03A1) ||
(code >= 0x03A3 && code <= 0x03AB))
- {
+ {
code += 0x20;
- }
+ }
else if (code == 0x0390)
- {
+ {
code = 0x03B9;
code2 = 0x0308;
code3 = 0x0301;
- }
+ }
else if (code == 0x03B0)
- {
+ {
code = 0x03C5;
code2 = 0x0308;
code3 = 0x0301;
- }
+ }
else if (code == 0x03C2)
- {
+ {
code += 0x01;
- }
+ }
else if (code >= 0x03CF && code <= 0x03D6)
- {
+ {
const static unsigned short table[8] = {
0x03D7, 0x03B2, 0x03B8, 0x03D2, 0x03D3, 0x03D4, 0x03C6, 0x03C0 };
code = table[code - 0x03CF];
- }
+ }
else if (code >= 0x03D8 && code <= 0x03EF)
- {
+ {
code |= 0x0001;
- }
+ }
else if (code >= 0x03F0 && code <= 0x03FF)
- {
+ {
const static unsigned short table[16] = {
0x03BA, 0x03C1, 0x03F2, 0x03F3, 0x03B8, 0x03B5, 0x03F6, 0x03F8,
0x03F8, 0x03F2, 0x03FB, 0x03FB, 0x03FC, 0x037B, 0x037C, 0x037D };
code = table[code - 0x03F0];
- }
}
+ }
else if (code <= 0x052f)
- { // cyrillic
+ { // cyrillic
if (code >= 0x0400 && code <= 0x040F)
- {
+ {
code += 0x50;
- }
+ }
else if (code >= 0x0410 && code <= 0x042F)
- {
+ {
code += 0x20;
- }
+ }
else if ((code >= 0x0460 && code <= 0x0481) ||
(code >= 0x048A && code <= 0x04BF))
- {
+ {
code |= 0x0001;
- }
+ }
else if (code == 0x04C0)
- {
+ {
code = 0x04CF;
- }
+ }
else if (code >= 0x04C1 && code <= 0x04CE)
- {
+ {
code += (code & 0x0001);
- }
+ }
else if (code >= 0x04D0 && code <= 0x052F)
- {
+ {
code |= 0x0001;
- }
}
+ }
else if (code <= 0x1000)
- { // armenian
+ { // armenian
if (code >= 0x0531 && code <= 0x0556)
- {
+ {
code += 0x30;
- }
+ }
else if (code == 0x0587)
- {
+ {
code = 0x0565;
code2 = 0x0582;
- }
}
+ }
else if (code <= 0x13ff)
- {
+ {
if ((code >= 0x10A0 && code <= 0x10C5) ||
code == 0x10C7 || code == 0x10CD)
- { // georgian
+ { // georgian
code += 0x1C60;
- }
+ }
else if (code >= 0x13F8 && code <= 0x13FD)
- { // cherokee
+ { // cherokee
code -= 0x08;
- }
}
+ }
else if (code <= 0x1eff)
- { // vietnamese and other latin
+ { // vietnamese and other latin
if (code >= 0x1E00 && code <= 0x1E95)
- {
+ {
code |= 0x0001;
- }
+ }
else if (code >= 0x1E96 && code <= 0x1E9B)
- {
+ {
const static unsigned short table[6] = {
'h', 't', 'w', 'y', 'a', 0x1E61 };
const static unsigned short table2[6] = {
@@ -6192,44 +6237,44 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
code2 = table2[code - 0x1E96];
code = table[code - 0x1E96];
- }
+ }
else if (code == 0x1E9E)
- { // capital s-sharp -> ss
+ { // capital s-sharp -> ss
code = 's';
code2 = 's';
- }
+ }
else if (code >= 0x1EA0 && code <= 0x1EFE)
- {
+ {
code |= 0x0001;
- }
}
+ }
else if (code <= 0x1fff)
- {
+ {
// rare greek
if ((code >= 0x1F08 && code <= 0x1F0F) ||
(code >= 0x1F18 && code <= 0x1F1D) ||
(code >= 0x1F28 && code <= 0x1F2F) ||
(code >= 0x1F38 && code <= 0x1F3F) ||
(code >= 0x1F48 && code <= 0x1F4D))
- {
+ {
code -= 0x08;
- }
+ }
else if (code >= 0x1F50 && code <= 0x1F56 && (code & 0x1) == 0)
- {
+ {
const static unsigned short table3[7] = {
0, 0, 0x0300, 0, 0x0301, 0, 0x0342 };
code3 = table3[code - 0x1F50];
code2 = 0x0313;
code = 0x03C5;
- }
+ }
else if ((code >= 0x1F59 && code <= 0x1F5F && (code & 0x1) != 0) ||
(code >= 0x1F68 && code <= 0x1F6F))
- {
+ {
code -= 0x08;
- }
+ }
else if (code >= 0x1F80 && code <= 0x1FAF)
- {
+ {
code2 = 0x03B9;
if (code <= 0x1F87) { code -= 0x80; }
else if (code <= 0x1F8F) { code -= 0x88; }
@@ -6237,9 +6282,9 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
else if (code <= 0x1F9F) { code -= 0x78; }
else if (code <= 0x1FA7) { code -= 0x40; }
else { code -= 0x48; }
- }
+ }
else if (code >= 0x1FB2 && code <= 0x1FFC)
- {
+ {
const static unsigned short table[75] = {
0x1F70, 0x03B1, 0x03AC, 0x1FB5, 0x03B1, 0x03B1, 0x1FB0, 0x1FB1,
0x1F70, 0x1F71, 0x03B1, 0x1FBD, 0x03B9, 0x1FBF, 0x1FC0, 0x1FC1,
@@ -6256,82 +6301,82 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
code == 0x1FBC || (code >= 0x1FC2 && code <= 0x1FC4) ||
code == 0x1FCC || (code >= 0x1FF2 && code <= 0x1FF4) ||
code == 0x1FFC)
- {
+ {
code2 = 0x03B9;
- }
+ }
else if (code == 0x1FB6 || code == 0x1FC6 || code == 0x1FD6 ||
code == 0x1FE6 || code == 0x1FF6)
- {
+ {
code2 = 0x0342;
- }
+ }
else if (code == 0x1FB6 || code == 0x1FB7 || code == 0x1FC7 ||
code == 0x1FF7)
- {
+ {
code2 = 0x0342;
code3 = 0x03B9;
- }
+ }
else if (code >= 0x1FD2 && code <= 0x1FD3)
- {
+ {
code2 = 0x0308;
code3 = code - (0x1FD2 - 0x0300);
- }
+ }
else if (code == 0x1FD7 || code == 0x1FE7)
- {
+ {
code2 = 0x0308;
code3 = 0x0342;
- }
+ }
else if (code >= 0x1FE2 && code <= 0x1FE3)
- {
+ {
code2 = 0x0308;
code3 = code - (0x1FE2 - 0x0300);
- }
+ }
else if (code == 0x1FE4)
- {
+ {
code2 = 0x0313;
- }
+ }
code = table[code - 0x1FB2];
- }
}
+ }
else if (code <= 0x24ff)
- { // symbols
+ { // symbols
if (code == 0x2126)
- { // Ohm symbol becomes omega
+ { // Ohm symbol becomes omega
code = 0x03C9;
- }
+ }
else if (code == 0x212A)
- { // Kelvin symbol becomes k
+ { // Kelvin symbol becomes k
code = 'k';
- }
+ }
else if (code == 0x212B)
- { // Angstrom symbol becomes a with circle
+ { // Angstrom symbol becomes a with circle
code = 0xE5;
- }
+ }
else if (code == 0x2132)
- {
+ {
code = 0x214E;
- }
+ }
else if (code >= 0x2160 && code <= 0x216F)
- {
+ {
code += 0x10;
- }
+ }
else if (code == 0x2183)
- {
+ {
code += 0x01;
- }
+ }
else if (code >= 0x24B6 && code <= 0x24CF)
- {
+ {
code += 0x1a;
- }
}
+ }
else if (code <= 0x2cff)
- {
+ {
if (code >= 0x2C00 && code <= 0x2C2E)
- { // glagolitic
+ { // glagolitic
code += 0x30;
- }
+ }
else if (code >= 0x2C60 && code <= 0x2C7F)
- { // rare latin
+ { // rare latin
const static unsigned short table[32] = {
0x2C61, 0x2C61, 0x026B, 0x1D7D, 0x027D, 0x2C65, 0x2C66, 0x2C68,
0x2C68, 0x2C6A, 0x2C6A, 0x2C6C, 0x2C6C, 0x0251, 0x0271, 0x0250,
@@ -6339,110 +6384,110 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
0x2C78, 0x2C79, 0x2C7A, 0x2C7B, 0x2C7C, 0x2C7D, 0x023F, 0x0240 };
code = table[code - 0x2C60];
- }
+ }
else if (code >= 0x2C80 && code <= 0x2CF3)
- { // coptic
+ { // coptic
if (code <= 0x2CE3)
- {
+ {
code |= 0x0001;
- }
+ }
else if (code == 0x2CEB || code == 0x2CED || code == 0x2CF2)
- {
+ {
code += 0x0001;
- }
}
}
+ }
else if (code <= 0x9fff)
- {
+ {
// cjk ideograms
- }
+ }
else if (code <= 0xabff)
- {
+ {
if ((code >= 0xA640 && code <= 0xA66D) ||
(code >= 0xA680 && code <= 0xA69B))
- { // rare cyrillic
+ { // rare cyrillic
code |= 0x0001;
- }
+ }
else if (code >= 0xA722 && code <= 0xA76F && code != 0xA730)
- { // rare latin
+ { // rare latin
code |= 0x0001;
- }
+ }
else if (code >= 0xA779 && code <= 0xA77C)
- {
+ {
code += (code & 0x0001);
- }
+ }
else if (code == 0xA77D)
- {
+ {
code = 0x1D79;
- }
+ }
else if (code >= 0xA77E && code <= 0xA787)
- {
+ {
code |= 0x0001;
- }
+ }
else if (code == 0xA78B)
- {
+ {
code += 0x0001;
- }
+ }
else if (code == 0xA78D)
- {
+ {
code = 0x0265;
- }
+ }
else if (code >= 0xA790 && code <= 0xA7A9 && code != 0xA794)
- {
+ {
code |= 0x0001;
- }
+ }
else if (code >= 0xA7AA && code <= 0xA7B6)
- {
+ {
const static unsigned short table[13] = {
0x0266, 0x025C, 0x0261, 0x026C, 0xA7AE, 0xA7AF, 0x029E, 0x0287,
0x029D, 0xAB53, 0xA7B5, 0xA7B5, 0xA7B7 };
code = table[code - 0xA7AA];
- }
+ }
else if (code >= 0xAB70 && code <= 0xABBF)
- { // cherokee
+ { // cherokee
code -= 0x97D0;
- }
}
+ }
else if (code <= 0xfaff)
- {
+ {
// hangul, cjk, private use
- }
+ }
else if (code <= 0xfbff)
- {
+ {
if (code >= 0xFB00 && code <= 0xFB06)
- { // latin ligatures
+ { // latin ligatures
if (code <= 0xFB04)
- {
+ {
if (code == 0xFB01)
- {
+ {
code2 = 'i';
- }
+ }
else if (code == 0xFB02)
- {
+ {
code2 = 'l';
- }
+ }
else
- {
+ {
code2 = 'f';
if (code == 0xFB03)
- {
+ {
code3 = 'i';
- }
+ }
else if (code == 0xFB04)
- {
+ {
code3 = 'l';
- }
}
- code = 'f';
}
+ code = 'f';
+ }
else if (code <= 0xFB06)
- {
+ {
code = 's';
code2 = 't';
- }
}
+ }
else if (code >= 0xFB13 && code <= 0xFB17)
- { // armenian ligatures
+ { // armenian ligatures
const static unsigned short table[5] = {
0x0574, 0x0574, 0x0574, 0x057E, 0x0574 };
const static unsigned short table2[5] = {
@@ -6450,42 +6495,42 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
code2 = table2[code - 0xFB13];
code = table[code - 0xFB13];
- }
}
+ }
else if (code <= 0xffff)
- {
+ {
if (code >= 0xFF21 && code <= 0xFF3A)
- { // wide latin uppercase -> wide latin lowercase
+ { // wide latin uppercase -> wide latin lowercase
code += 0x20;
- }
}
+ }
else
- {
+ {
if (code >= 0x10400 && code <= 0x10427 )
- {
+ {
code += 0x28;
- }
+ }
else if (code >= 0x10C80 && code <= 0x10CB2)
- {
+ {
code += 0x40;
- }
+ }
else if (code >= 0x118A0 && code <= 0x118BF)
- {
+ {
code += 0x20;
- }
}
+ }
UnicodeToUTF8(code, s);
if (code2)
- {
+ {
UnicodeToUTF8(code2, s);
if (code3)
- {
+ {
UnicodeToUTF8(code3, s);
- }
}
+ }
}
} // end anonymous namespace
@@ -6497,13 +6542,13 @@ unsigned char vtkDICOMCharacterSet::KeyFromString(const char *name, size_t nl)
const char *ep = name;
int key = 0;
if (cp)
- {
+ {
ep += nl;
- }
+ }
// Loop over backslash-separated values
for (int n = 0; cp != ep && *cp != '\0'; n++)
- {
+ {
// strip leading spaces
while (cp != ep && *cp == ' ') { cp++; }
// search for end of value
@@ -6514,47 +6559,47 @@ unsigned char vtkDICOMCharacterSet::KeyFromString(const char *name, size_t nl)
while (l > 0 && cp[l-1] == ' ') { l--; }
if (n == 0 && l > 0)
- {
+ {
// find the initial character set
for (int i = 0; i < ISO_2022_LOWBIT && key == 0; i++)
- {
+ {
for (int j = 0; j < 2 && key == 0; j++)
- {
+ {
if (l == strlen(Charsets[i][j]) &&
strncmp(Charsets[i][j], cp, l) == 0)
- {
+ {
key = i;
if (j != 0)
- {
+ {
key |= ISO_2022;
- }
}
}
}
}
+ }
else if (l > 0)
- {
+ {
// set the extensions as bits in the ISO_2022 bitfield
for (int k = 0; k < 4; k++)
- {
+ {
if (l == strlen(Extensions[k][1]) &&
strncmp(Extensions[k][1], cp, l) == 0)
- {
+ {
// if the whole ISO_2022 bitfield is set, clear it
if ((key & ISO_2022) == ISO_2022)
- {
+ {
key ^= ISO_2022;
- }
+ }
// set each specifc extension as a bit in the bitfield
key |= (ISO_2022_LOWBIT << k);
break;
- }
}
}
+ }
cp = dp;
if (cp != ep && *cp == '\\') { cp++; }
- }
+ }
return static_cast<unsigned char>(key);
}
@@ -6567,23 +6612,23 @@ std::string vtkDICOMCharacterSet::GetCharacterSetString() const
int base = (this->Key ^ ext);
if (base != 0)
- {
+ {
bool extended = (ext != 0);
value += Charsets[base][extended];
- }
+ }
// if ext is set to ISO_2022, there are no additional char sets
if (ext != ISO_2022)
- {
+ {
for (int k = 0; k < 4; k++)
- {
+ {
if ((ext & (ISO_2022_LOWBIT << k)) != 0)
- {
+ {
value += "\\";
value += Extensions[k][1];
- }
}
}
+ }
return value;
}
@@ -6596,134 +6641,166 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
if (this->Key == ISO_IR_6 || // US-ASCII
this->Key == ISO_IR_192) // UTF-8
- {
+ {
s.assign(text, l);
- }
+ }
else if (this->Key == ISO_IR_100) // ISO-8895-1
- {
+ {
// latin1, codepage is identity
const char *cp = text;
size_t m = l;
// compute the size of the UTF-8 string
for (size_t n = 0; n < l; n++)
- {
+ {
m += static_cast<unsigned char>(*cp++) >> 7;
- }
+ }
cp = text;
s.resize(m);
// encode as UTF-8
size_t i = 0;
while (i < m)
- {
+ {
while (i < m && (*cp & 0x80) == 0)
- {
+ {
s[i++] = *cp++;
- }
+ }
if (i < m)
- {
+ {
int code = static_cast<unsigned char>(*cp++);
s[i++] = (0xC0 | (code >> 6));
s[i++] = (0x80 | (code & 0x3F));
- }
}
}
+ }
else if (this->Key <= ISO_IR_166) // ISO-8895-X
- {
+ {
// Use the ISO-8859 codepages
int page = this->Key - ISO_IR_101;
s.reserve(l + l/2);
const char *cp = text;
const char *ep = text + l;
while (cp != ep)
- {
+ {
int code = static_cast<unsigned char>(*cp++);
if (code >= 0xA0)
- {
+ {
code = CodePagesISO8859[code - 0xA0][page];
- }
- UnicodeToUTF8(code, &s);
}
+ UnicodeToUTF8(code, &s);
}
- else if (this->Key == ISO_IR_13 || // JIS_X_0201 katakana
- this->Key == ISO_IR_14) // JIS_X_0201 romaji
- {
+ }
+ else if (this->Key == ISO_IR_13 || // JIS_X_0201 romaji & katakana
+ this->Key == ISO_IR_14)
+ {
// JIS_X_0201 romaji (<0x7f) and half-width katakana (>0x7f)
s.reserve(2*l);
const char *cp = text;
const char *ep = text + l;
while (cp != ep)
- {
+ {
int code = static_cast<unsigned char>(*cp++);
- if ((code > 0x7F && code <= 0x9F) || code == '\\')
- {
+ if (code <= 0x7F && code != '\\' && code != '~')
+ {
+ s.push_back(code);
+ }
+ else
+ {
if (code == '\\')
- {
+ {
code = 0xA5; // yen symbol
- }
- UnicodeToUTF8(code, &s);
}
- else if (code > 0x9F || code == '~')
+ else if (code == '~')
{
- if (code == '~')
- {
code = 0x203E; // macron (overline)
- }
+ }
else if (code >= 0xA1 && code <= 0xDF)
- {
+ {
code += 0xFEC0; // half-width katakana
- }
- else
+ }
+ else if (cp != ep)
+ {
+ // if the byte not a valid JIS X 0201 code, then it is probably
+ // the first byte of a two-byte Shift-JIS sequence (vendors are
+ // required to convert Shift-JIS to ISO 2022 for use in DICOM,
+ // so this code is for compatibility with non-conformant files).
+ int x = code;
+ int y = static_cast<unsigned char>(*cp++);
+ code = (y == 0 ? 0 : 0xFFFD); // illegal character or null
+
+ if (y >= 0x40 && y <= 0xFC && y != 0x7F)
{
- code = 0xFFFD; // illegal character
+ int a, b;
+ if (y < 0x9F)
+ {
+ a = 0;
+ b = y - (y < 0x7F ? 0x40 : 0x41);
+ }
+ else
+ {
+ a = 1;
+ b = y - 0x9F;
+ }
+
+ if (x >= 0x81 && x <= 0x9F)
+ {
+ a += (x - 0x81)*2;
+ code = CodePageJISX0208[a*94+b];
+ }
+ else if (x >= 0xE0 && x <= 0xEF)
+ {
+ a += (x - 0xC1)*2;
+ code = CodePageJISX0208[a*94+b];
+ }
}
- UnicodeToUTF8(code, &s);
}
- else
+ else
{
- s.push_back(code);
+ code = 0xFFFD; // illegal character
}
+ UnicodeToUTF8(code, &s);
}
}
+ }
else if (this->Key == GB18030 || this->Key == GBK)
- {
+ {
// Chinese national encoding standard
const char *cp = text;
const char *ep = text + l;
while (cp != ep)
- {
+ {
unsigned int code = static_cast<unsigned char>(*cp++);
if (code > 0x7f)
- {
+ {
if (cp == ep)
- {
+ {
// end of input, terminate early
break;
- }
+ }
unsigned short a = static_cast<unsigned char>(code);
unsigned short b = static_cast<unsigned char>(*cp++);
code = 0xFFFD; // untranslated multi-byte character
if (a > 0x80 && a < 0xFF &&
b >= 0x40 && b < 0xFF && b != 0x7F)
- {
+ {
// two-byte character
if (b > 0x7F) { b--; }
a = (a - 0x81)*190 + (b - 0x40);
code = CodePageGB18030[a];
- }
+ }
if (this->Key == GB18030)
- {
+ {
if (a > 0x80 && a < 0x90 && b >= '0' && b <= '9')
- {
+ {
// start of a four-byte code
if (cp == ep || cp+1 == ep)
- {
+ {
// unexpected end of input, terminate early
break;
- }
+ }
if (static_cast<unsigned char>(cp[0]) > 0x80 &&
static_cast<unsigned char>(cp[0]) < 0xFF &&
cp[1] >= '0' && cp[1] <= '9')
- {
+ {
// four-byte GB18030 character
unsigned short c = static_cast<unsigned char>(*cp++);
unsigned short d = static_cast<unsigned char>(*cp++);
@@ -6731,32 +6808,38 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
b = (c - 0x81)*10 + (d - '0');
unsigned int g = a*1260 + b;
if (g <= 0x99FB)
- {
+ {
// search linearly compressed table
size_t n = sizeof(LinearGB18030)/sizeof(short);
for (size_t i = 0;; i += 2)
- {
+ {
if (i >= n || LinearGB18030[i] > g)
- {
+ {
code = LinearGB18030[i-1] + (g - LinearGB18030[i-2]);
break;
- }
}
}
+ // this mapping was modified in GB18030-2005, after the linear
+ // table had already been defined, so it must be special-cased
+ if (code == 0x1E3F)
+ {
+ code = 0xE7C7;
+ }
}
}
+ }
else if (a >= 0x90 && a < 0xFF && b >= '0' && b <= '9')
- {
+ {
// start of a four-byte code
if (cp == ep || cp+1 == ep)
- {
+ {
// unexpected end of input, terminate early
break;
- }
+ }
if (static_cast<unsigned char>(cp[0]) > 0x80 &&
static_cast<unsigned char>(cp[0]) < 0xFF &&
cp[1] >= '0' && cp[1] <= '9')
- {
+ {
// four-byte GB18030 to codes beyond 0xFFFF
unsigned short c = static_cast<unsigned char>(*cp++);
unsigned short d = static_cast<unsigned char>(*cp++);
@@ -6764,33 +6847,33 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
b = (c - 0x81)*10 + (d - '0');
unsigned int g = a*1260 + b;
if (g <= 0xFFFFF)
- {
+ {
code = g + 0x10000;
- }
}
}
- // convert some private codes to new unicode standard codes
- // (do this only for GB18030, for GBK stay within the BMP for
- // maximum font compatibility between GBK and Unicode)
- if (code >= 0xE000 && code <= 0xF8FF)
- {
- size_t n = sizeof(PrivateToStandard)/sizeof(int);
+ }
+ // convert some private codes to Unicode 4.1 standard codes in order
+ // to ensure they these characters can be displayed (though this is
+ // done at the cost of the one-to-one Unicode-to-GB18030 mapping)
+ size_t n = sizeof(PrivateToStandard)/sizeof(int);
+ if (code >= PrivateToStandard[0] && code <= PrivateToStandard[n-2])
+ {
for (size_t i = 0; i < n; i += 2)
- {
+ {
if (code == PrivateToStandard[i])
- {
+ {
code = PrivateToStandard[i+1];
break;
- }
}
}
}
}
- UnicodeToUTF8(code, &s);
}
+ UnicodeToUTF8(code, &s);
}
+ }
else if ((this->Key & ISO_2022) != 0)
- {
+ {
// Uses ISO-2022 escape codes to switch character sets.
// To get the character set that is active at the beginning of
// the string, remove all the bits in the ISO_2022 bitfield.
@@ -6800,163 +6883,190 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
// and when an escape code is found, change the charset
size_t i = 0;
while (i < l)
- {
+ {
// search for the next escape
size_t j = i;
for (; j < l; j++)
- {
+ {
if (text[j] == '\033') { break; }
- }
+ }
if (charset < ISO_2022_LOWBIT)
- {
+ {
// indicates one of the single-byte character sets, convert
// characters up to the next escape code
vtkDICOMCharacterSet cs(charset);
s += cs.ConvertToUTF8(&text[i], j-i);
- }
+ }
else if (charset == ISO_2022_IR_58)
- {
+ {
// GB2312 chinese encoding
while (i < j)
- {
+ {
unsigned short code = static_cast<unsigned char>(text[i++]);
if (code >= 0xA1 && code < 0xFF)
- {
+ {
if (i == j)
- {
+ {
break;
- }
+ }
unsigned short a = code - 0x81;
code = static_cast<unsigned char>(text[i++]);
if (code >= 0xA1 && code < 0xFF)
- {
+ {
unsigned short b = code - 0x41;
code = CodePageGB18030[a*190 + b];
- }
}
- UnicodeToUTF8(code, &s);
}
+ UnicodeToUTF8(code, &s);
}
+ }
else if (charset == ISO_2022_IR_87 ||
charset == ISO_2022_IR_159)
- {
+ {
// iso-2022-jp and iso-2022-jp-2
while (i < j)
- {
+ {
// convert two bytes into unicode
unsigned short code = static_cast<unsigned char>(text[i++]);
if (code >= 0x21 && code < 0x7F)
- {
+ {
if (i == j)
- {
+ {
break;
- }
+ }
unsigned short a = code - 0x21;
code = static_cast<unsigned char>(text[i++]);
if (code >= 0x21 && code < 0x7F)
- {
+ {
unsigned short b = code - 0x21;
if (charset == ISO_2022_IR_87)
- {
+ {
code = CodePageJISX0208[a*94+b];
- }
+ }
else
- {
+ {
code = CodePageJISX0212[a*94+b];
- }
}
}
+ }
else if (code >= 0xA1 && code <= 0xDF)
- {
+ {
// most likely half-width katakana, which can be used in
// DICOM even though they are not permitted in iso-2022-jp
code += 0xFEC0;
- }
+ }
else if (code > 0x7F)
- {
- // most likely Shift JIS codes, which are not permitted
- // in DICOM or in iso-2022-jp
+ {
+ // possibly EUC-JP or Shift-JIS, neither of which should
+ // be used with ISO 2022 escape codes
code = 0xFFFD;
- }
- UnicodeToUTF8(code, &s);
}
+ UnicodeToUTF8(code, &s);
}
+ }
else if (charset == ISO_2022_IR_149)
- {
+ {
// iso-2022-kr
while (i < j)
- {
+ {
unsigned short code = static_cast<unsigned char>(text[i++]);
if (code >= 0xA1 && code < 0xFF)
- {
+ {
if (i == j)
- {
+ {
break;
- }
+ }
// convert two bytes into unicode
unsigned short a = code - 0xA1;
- unsigned short b = static_cast<unsigned char>(text[i++]) - 0xA1;
- code = CodePageKSX1001[a*94+b];
+ code = static_cast<unsigned char>(text[i++]);
+ if (code >= 0xA1 && code < 0xFF)
+ {
+ unsigned short b = code - 0xA1;
+ code = CodePageKSX1001[a*94+b];
}
- UnicodeToUTF8(code, &s);
}
+ UnicodeToUTF8(code, &s);
}
+ }
else
- {
+ {
// other multibyte conversions
while (i < j)
+ {
+ unsigned short code = 0xFFFD;
+ if (text[i++] == '\0')
{
- i++;
- if (i == j)
+ code = 0;
+ }
+ else if (i < j)
+ {
+ if (text[i++] == '\0')
{
- break;
+ code = 0;
}
- i++;
- // unrecognized multi-byte character
- UnicodeToUTF8(0xFFFD, &s);
}
+ // unrecognized multi-byte character
+ UnicodeToUTF8(code, &s);
}
+ }
// Make sure we are at the escape code (or the end of string)
i = j;
// Get the escape code for the next segment
if (text[i] == '\033')
- {
+ {
i++;
if (i + 2 > l) { break; }
+ unsigned char oldcharset = charset;
charset = 0xFF; // indicate none found yet
// look through single-byte charset escape codes
for (unsigned char k = 0; k < ISO_2022_LOWBIT; k++)
- {
+ {
const char *escape = Charsets[k][2];
size_t le = strlen(escape);
if (le > 0 && strncmp(&text[i], escape, le) == 0)
+ {
+ if (k == ISO_IR_13 && (oldcharset == ISO_2022_IR_87 ||
+ oldcharset == ISO_2022_IR_159))
+ {
+ // The ISO_IR_13 charset goes in G1, so let's keep the
+ // currently active kanji charset in G0.
+ charset = oldcharset;
+ }
+ else if (k == ISO_IR_14)
{
- charset = k;
+ // The escape code for Japanese romaji (ISO_IR 14) switches
+ // to JIS X 0201, which DICOM defines as "ISO 2022 IR 13".
+ charset = ISO_IR_13;
+ }
+ else
+ {
+ charset = k;
+ }
i += le;
break;
- }
}
+ }
// the escape code doesn't match a single-byte charset
if (charset == 0xFF)
- {
+ {
// look through multibyte charset escape codes
for (int k = 0; k < 4; k++)
- {
+ {
const char *escape = Extensions[k][2];
size_t le = strlen(escape);
if (le > 0 && strncmp(&text[i], escape, le) == 0)
- {
+ {
charset = (ISO_2022_LOWBIT << k);
i += le;
break;
- }
}
}
}
}
}
+ }
return s;
}
@@ -6973,17 +7083,17 @@ std::string vtkDICOMCharacterSet::CaseFoldedUTF8(
if (this->Key != ISO_IR_6 && // US-ASCII
this->Key != ISO_IR_192) // UTF-8
- {
+ {
t = this->ConvertToUTF8(text, l);
cp = t.data();
ep = cp + t.length();
- }
+ }
while (cp != ep)
- {
+ {
unsigned int code = UTF8ToUnicode(&cp, ep);
CaseFoldUnicode(code, &s);
- }
+ }
return s;
}
@@ -6995,86 +7105,113 @@ size_t vtkDICOMCharacterSet::NextBackslash(
const char *cp = text;
if (this->Key == GB18030 || this->Key == GBK)
- {
+ {
// ensure backslash isn't second part of a multi-byte character
while (cp != ep && *cp != '\0')
- {
+ {
if (static_cast<unsigned char>(*cp) >= 0x81)
- {
+ {
cp++;
if (cp != ep && static_cast<unsigned char>(*cp) >= 0x21)
- {
+ {
cp++;
- }
}
+ }
else if (*cp != '\\')
- {
+ {
cp++;
- }
+ }
else
- {
+ {
break;
+ }
+ }
+ }
+ else if (this->Key == ISO_IR_13)
+ {
+ // ensure backslash isn't second part of a Shift-JIS character
+ // that has been erroneously stored as ISO_IR 13
+ while (cp != ep && *cp != '\0')
+ {
+ unsigned char x = static_cast<unsigned char>(*cp);
+ if ((x >= 0x81 && x <= 0x9F) || (x >= 0xE0 && x <= 0xEF))
+ {
+ cp++;
+ if (cp != ep && static_cast<unsigned char>(*cp) >= 0x40 &&
+ static_cast<unsigned char>(*cp) <= 0xFC &&
+ static_cast<unsigned char>(*cp) != 0x7F)
+ {
+ cp++;
}
}
+ else if (*cp != '\\')
+ {
+ cp++;
+ }
+ else
+ {
+ break;
+ }
}
+ }
else if ((this->Key & ISO_2022) != 0)
- {
+ {
// ensure backslash isn't part of a G0 multi-byte code
bool multibyte = false;
while (cp != ep && *cp != '\0')
- {
+ {
// look for iso 2022 escape code
if (*cp == '\033')
- {
+ {
cp++;
size_t l = 0;
while (cp + l != ep &&
static_cast<unsigned char>(cp[l]) >= 0x20 &&
static_cast<unsigned char>(cp[l]) <= 0x2f)
- {
+ {
l++;
- }
+ }
if (cp + l != ep &&
static_cast<unsigned char>(cp[l]) >= 0x40 &&
static_cast<unsigned char>(cp[l]) <= 0x7f)
- {
+ {
l++;
if ((l == 2 && cp[0] == '$') ||
(l == 3 && cp[0] == '$' && cp[1] == '('))
- {
+ {
// G0 is designated to multibyte
multibyte = true;
- }
+ }
else if (l == 2 && cp[0] == '(')
- {
+ {
// G0 is designated to single byte
multibyte = false;
- }
}
- cp += l;
}
+ cp += l;
+ }
else if (multibyte || *cp != '\\')
- {
+ {
cp++;
- }
+ }
else
- {
+ {
break;
- }
}
}
+ }
else
- {
+ {
// no special encoding, so backslash is backslash
while (cp != ep && *cp != '\0')
- {
+ {
if (*cp == '\\')
- {
+ {
break;
- }
- cp++;
}
+ cp++;
}
+ }
return (cp - text);
}
@@ -7088,14 +7225,14 @@ unsigned int vtkDICOMCharacterSet::CountBackslashes(
const char *ep = text + l;
while (cp != ep && *cp != '\0')
- {
+ {
cp += this->NextBackslash(cp, ep);
if (cp != ep && *cp == '\\')
- {
+ {
cp++;
count++;
- }
}
+ }
return count;
}
@@ -7105,12 +7242,12 @@ ostream& operator<<(ostream& o, const vtkDICOMCharacterSet& a)
{
std::string s = a.GetCharacterSetString();
if (s.length() == 0)
- {
+ {
s = "ISO_IR 6";
- }
+ }
else if (s[0] == '\\')
- {
+ {
s.insert(0, "ISO 2022 IR 6");
- }
+ }
return o << s.c_str();
}
diff --git a/Source/vtkDICOMCharacterSet.h b/Source/vtkDICOMCharacterSet.h
index 2fb1a61..36861a2 100644
--- a/Source/vtkDICOMCharacterSet.h
+++ b/Source/vtkDICOMCharacterSet.h
@@ -60,6 +60,7 @@ public:
Unknown = 255 // signifies unknown character set
};
+ //@{
//! Construct an object that describes the default (ASCII) character set.
vtkDICOMCharacterSet() : Key(0) {}
@@ -80,23 +81,29 @@ public:
this->Key = KeyFromString(name.data(), name.length()); }
vtkDICOMCharacterSet(const char *name, size_t nl) {
this->Key = KeyFromString(name, nl); }
+ //@}
- //! Generate a SpecificCharacterSet value.
+ //@{
+ //! Generate SpecificCharacterSet code values (diagnostic only).
/*!
- * The result is given as a set of backslash-separated values if more
- * than one encoding is present. The first value may be empty to indicate
- * that it is ASCII. Since this class uses an unsigned char for storage,
- * the only secondary and tertiary values that can be represented are the
- * three multi-byte ISO 2022 character sets. Therefore, if the condition
- * "if ((GetKey() & ISO_2022_OTHER) != 0)" is true, then the string
- * returned by this method will be incomplete and only the first character
- * set will be listed.
+ * Attempt to generate SpecificCharacterSet code values. If ISO 2022
+ * encoding is not used, then a single code value is returned. If
+ * ISO 2022 encoding is used with the single-byte character sets, then
+ * only the code value for first character set will be returned (due to
+ * limitations in the way this class stores the information). A simple
+ * way to check whether such incomplete information will be returned is
+ * to check if "((GetKey() & ISO_2022) == ISO_2022)" is true. However,
+ * if ISO 2022 encoding is used with one or more multi-byte character
+ * sets, the result is a set of backslash-separated code values, where
+ * the first value will be empty if the initial coding is ASCII.
*/
std::string GetCharacterSetString() const;
//! Get the numerical code for this character set object.
unsigned char GetKey() const { return this->Key; }
+ //@}
+ //@{
//! Convert text from this encoding to UTF-8.
/*!
* This will convert text to UTF-8, which is generally a lossless
@@ -127,7 +134,9 @@ public:
*/
bool IsBiDirectional() const {
return (this->Key == ISO_IR_127 || this->Key == ISO_IR_138); }
+ //@}
+ //@{
//! Count the number of backslashes in an encoded string.
/*!
* The backslash byte is sometimes present as half of a multibyte
@@ -142,13 +151,16 @@ public:
* either at the beginning of the string or just after a backslash.
*/
size_t NextBackslash(const char *text, const char *end) const;
+ //@}
+ //@{
bool operator==(vtkDICOMCharacterSet b) const { return (this->Key == b.Key); }
bool operator!=(vtkDICOMCharacterSet b) const { return (this->Key != b.Key); }
bool operator<=(vtkDICOMCharacterSet a) const { return (this->Key <= a.Key); }
bool operator>=(vtkDICOMCharacterSet a) const { return (this->Key >= a.Key); }
bool operator<(vtkDICOMCharacterSet a) const { return (this->Key < a.Key); }
bool operator>(vtkDICOMCharacterSet a) const { return (this->Key > a.Key); }
+ //@}
private:
static unsigned char KeyFromString(const char *name, size_t nl);
diff --git a/Source/vtkDICOMCompiler.cxx b/Source/vtkDICOMCompiler.cxx
index f33ec2a..4d7999f 100644
--- a/Source/vtkDICOMCompiler.cxx
+++ b/Source/vtkDICOMCompiler.cxx
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -244,11 +244,11 @@ inline bool EncoderBase::CheckBuffer(
{
bool r = true;
if (n > static_cast<size_t>(ep - cp))
- {
+ {
r = vtkDICOMCompilerInternalFriendship::FlushBuffer(
this->Compiler, cp, ep);
r &= (n <= static_cast<size_t>(ep - cp));
- }
+ }
return r;
}
@@ -260,36 +260,36 @@ unsigned int EncoderBase::DataSize(
unsigned int l = 0;
while (iter != iterEnd)
- {
+ {
const vtkDICOMValue &v = iter->GetValue(this->Index);
vtkDICOMVR vr = v.GetVR();
unsigned int vl = v.GetVL();
if (vr == vtkDICOMVR::SQ)
- {
+ {
size_t n = v.GetNumberOfValues();
const vtkDICOMItem *ptr = v.GetSequenceData();
for (size_t i = 0; i < n && vl != HxFFFFFFFF; i++)
- {
+ {
unsigned int ll = this->DataSize(ptr[i].Begin(), ptr[i].End());
// check for overflow or ll == 0xffffffff
if (HxFFFFFFFF - vl <= ll || HxFFFFFFFF - vl - ll <= 8)
- {
+ {
vl = HxFFFFFFFF;
- }
+ }
else
- {
+ {
vl += ll + 8;
- }
}
}
+ }
// terminate if length is unknown
if (vl == HxFFFFFFFF)
- {
+ {
l = vl;
break;
- }
+ }
// force vl to even
assert((vl & 1) == 0);
@@ -298,14 +298,14 @@ unsigned int EncoderBase::DataSize(
unsigned int hl = (this->ImplicitVR || !vr.HasLongVL() ? 8 : 12);
// check for overflow
if (HxFFFFFFFF - l <= vl || HxFFFFFFFF - l - vl <= hl)
- {
+ {
l = HxFFFFFFFF;
break;
- }
+ }
l += vl + hl;
++iter;
- }
+ }
return l;
}
@@ -422,12 +422,12 @@ void Encoder<E>::PutValues(
union { float f; unsigned int i; } u;
do
- {
+ {
u.f = *ip;
Encoder<E>::PutInt32(op, u.i);
ip++;
op += 4;
- }
+ }
while (--n);
}
@@ -438,12 +438,12 @@ void Encoder<E>::PutValues(
union { double d; unsigned long long l; } u;
do
- {
+ {
u.d = *ip;
Encoder<E>::PutInt64(op, u.l);
ip++;
op += 8;
- }
+ }
while (--n);
}
@@ -452,12 +452,12 @@ void Encoder<E>::PutValues(
unsigned char *op, const vtkDICOMTag *ip, size_t n)
{
do
- {
+ {
Encoder<E>::PutInt16(op, ip->GetGroup());
Encoder<E>::PutInt16(op+2, ip->GetElement());
ip++;
op += 4;
- }
+ }
while (--n);
}
@@ -469,14 +469,14 @@ bool Encoder<E>::WriteData(
unsigned char* &cp, unsigned char* &ep, const T *ptr, size_t n)
{
while (n != 0 && this->CheckBuffer(cp, ep, sizeof(T)))
- {
+ {
size_t m = (ep - cp)/sizeof(T);
if (m > n) { m = n; }
Encoder<E>::PutValues(cp, ptr, m);
cp += m*sizeof(T);
ptr += m;
n -= m;
- }
+ }
return (n == 0);
}
@@ -494,16 +494,26 @@ size_t Encoder<E>::WriteElementHead(
cp[5] = vrt[1];
Encoder<E>::PutInt16(cp+6, static_cast<unsigned short>(vl));
if (this->ImplicitVR)
- {
+ {
Encoder<E>::PutInt32(cp+4, vl);
- }
+ }
else if (vr.HasLongVL())
- {
+ {
hl = 12;
cp[6] = 0;
cp[7] = 0;
Encoder<E>::PutInt32(cp+8, vl);
- }
+ }
+ else if (vl > 65534)
+ {
+ // CP-1066 allows overlength values to be written as UN
+ hl = 12;
+ cp[4] = 'U';
+ cp[5] = 'N';
+ cp[6] = 0;
+ cp[7] = 0;
+ Encoder<E>::PutInt32(cp+8, vl);
+ }
return hl;
}
@@ -520,15 +530,15 @@ bool Encoder<E>::WriteDataElement(
// do not write invalid values
if (!v.IsValid())
- {
+ {
return true;
- }
+ }
// handle elements of unknown length
if (vl == HxFFFFFFFF)
- {
+ {
if (vr == vtkDICOMVR::UN || vr == vtkDICOMVR::OB)
- {
+ {
// if VR is UN then it is a sequence encoded as implicit LE
// (see DICOM Part 5, Section 6.2.2, Unknown (UN) Value Representation)
// if VR is OB then it is a sequence of fragments
@@ -543,137 +553,137 @@ bool Encoder<E>::WriteDataElement(
assert(ptr[n-4] + (ptr[n-3] << 8) +
(ptr[n-2] << 16) + (ptr[n-1] << 24) == 0);
#endif
- }
+ }
else if (vr != vtkDICOMVR::SQ)
- {
+ {
// only UN, OB, and SQ can have unknown length
vtkDICOMCompilerInternalFriendship::CompileError(
this->Compiler, "Illegal item length 0xFFFFFFFF encountered.");
return false;
- }
}
+ }
else if (vr == vtkDICOMVR::SQ)
- {
+ {
// compute the true vl for the sequence
size_t n = v.GetNumberOfValues();
const vtkDICOMItem *ptr = v.GetSequenceData();
for (size_t i = 0; i < n && vl != HxFFFFFFFF; i++)
- {
+ {
unsigned int ll = this->DataSize(ptr[i].Begin(), ptr[i].End());
// check for overflow or ll == 0xffffffff
if (HxFFFFFFFF - vl <= ll || HxFFFFFFFF - vl - ll <= 8)
- {
+ {
vl = HxFFFFFFFF;
- }
+ }
else
- {
+ {
vl += ll + 8;
- }
}
}
+ }
else
- {
+ {
// vl must be even
assert((vl & 1) == 0);
vl += (vl & 1);
- }
+ }
// write the data element head (tag, vr, vl)
if (!this->CheckBuffer(cp, ep, 12))
- {
+ {
return false;
- }
+ }
cp += this->Encoder<E>::WriteElementHead(cp, tag, vr, vl);
// write the value
bool r = true;
switch (vr.GetType())
- {
+ {
case VTK_CHAR:
- {
+ {
const char *ptr = v.GetCharData();
r = this->WriteData(cp, ep, ptr, vl);
- }
break;
+ }
case VTK_UNSIGNED_CHAR:
- {
+ {
size_t n = vl;
if (vl == HxFFFFFFFF)
- {
+ {
n = v.GetNumberOfValues();
n += (n & 1);
- }
+ }
const unsigned char *ptr = v.GetUnsignedCharData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_SHORT:
- {
+ {
size_t n = vl/sizeof(short);
const short *ptr = v.GetShortData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_UNSIGNED_SHORT:
- {
+ {
size_t n = vl/sizeof(unsigned short);
const unsigned short *ptr = v.GetUnsignedShortData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_INT:
- {
+ {
size_t n = vl/sizeof(int);
const int *ptr = v.GetIntData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_UNSIGNED_INT:
- {
+ {
size_t n = vl/sizeof(unsigned int);
const unsigned int *ptr = v.GetUnsignedIntData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_FLOAT:
- {
+ {
size_t n = vl/sizeof(float);
const float *ptr = v.GetFloatData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_DOUBLE:
- {
+ {
size_t n = vl/sizeof(double);
const double *ptr = v.GetDoubleData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_DICOM_TAG:
- {
+ {
size_t n = vl/sizeof(vtkDICOMTag);
const vtkDICOMTag *ptr = v.GetTagData();
r = this->WriteData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_DICOM_ITEM:
- {
+ {
size_t n = v.GetNumberOfValues();
const vtkDICOMItem *ptr = v.GetSequenceData();
for (size_t i = 0; i < n && r; i++)
- {
+ {
unsigned int il = 0xFFFFFFFF;
if (!ptr[i].IsDelimited())
- {
+ {
// compute the bytes in the item
il = this->DataSize(ptr[i].Begin(), ptr[i].End());
- }
+ }
if ((r = this->CheckBuffer(cp, ep, 8)) == false)
- {
+ {
break;
- }
+ }
// item start
Encoder<E>::PutInt16(cp, HxFFFE);
Encoder<E>::PutInt16(cp+2, HxE000);
@@ -685,33 +695,33 @@ bool Encoder<E>::WriteDataElement(
this->Depth--;
if (il == HxFFFFFFFF && r)
- {
+ {
if ((r = this->CheckBuffer(cp, ep, 8)) == false)
- {
+ {
break;
- }
+ }
// item delimiter
Encoder<E>::PutInt16(cp, HxFFFE);
Encoder<E>::PutInt16(cp+2, HxE00D);
Encoder<E>::PutInt32(cp+4, 0);
cp += 8;
- }
}
+ }
if (vl == HxFFFFFFFF && r)
- {
+ {
if ((r = this->CheckBuffer(cp, ep, 8)) != false)
- {
+ {
// sequence delimiter
Encoder<E>::PutInt16(cp, HxFFFE);
Encoder<E>::PutInt16(cp+2, HxE0DD);
Encoder<E>::PutInt32(cp+4, 0);
cp += 8;
- }
}
}
break;
}
+ }
return r;
}
@@ -724,37 +734,37 @@ bool Encoder<E>::WriteElements(
vtkDICOMDataElementIterator iterEnd)
{
while (iter != iterEnd)
- {
+ {
// check for group length tag and length-to-end tag
if (iter->GetTag().GetElement() == Hx0000 ||
iter->GetTag() == vtkDICOMTag(0x0008, 0x0001))
- {
+ {
unsigned short group = iter->GetTag().GetGroup();
unsigned int groupLength = HxFFFFFFFF;
vtkDICOMDataElementIterator groupEnd = iter;
if (iter->GetTag().GetElement() == Hx0000)
- {
+ {
groupEnd = ++iter;
while (groupEnd != iterEnd && groupEnd->GetTag().GetGroup() == group)
- {
+ {
++groupEnd;
- }
- groupLength = this->DataSize(iter, groupEnd);
}
+ groupLength = this->DataSize(iter, groupEnd);
+ }
// check for retired LengthToEnd tag
unsigned int lengthToEnd = HxFFFFFFFF;
bool hadLengthToEnd = false;
if (group == 0x0008 && iter != iterEnd &&
iter->GetTag() == vtkDICOMTag(0x0008, 0x0001))
- {
+ {
hadLengthToEnd = true;
lengthToEnd = this->DataSize(++iter, iterEnd);
- }
+ }
// check for uncounted PixelData element size in 0x7FE0 group
if (this->Depth == 0 &&
((groupLength != HxFFFFFFFF && group == 0x7FE0 &&
iterEnd == groupEnd) || lengthToEnd != HxFFFFFFFF))
- {
+ {
// add the size of the missing PixelData element
unsigned int pl =
vtkDICOMCompilerInternalFriendship::ComputePixelDataSize(
@@ -763,80 +773,80 @@ bool Encoder<E>::WriteElements(
// check for overflow of lengthToEnd
if (HxFFFFFFFF - lengthToEnd <= pl ||
HxFFFFFFFF - lengthToEnd - pl <= hl)
- {
+ {
lengthToEnd = HxFFFFFFFF;
- }
+ }
else
- {
+ {
lengthToEnd += pl + hl;
- }
+ }
// check for overflow of groupLength
if (group == 0x7FE0)
- {
+ {
if (HxFFFFFFFF - groupLength <= pl ||
HxFFFFFFFF - groupLength - pl <= hl)
- {
+ {
groupLength = HxFFFFFFFF;
- }
+ }
else
- {
+ {
groupLength += pl + hl;
- }
}
}
+ }
if (groupLength != HxFFFFFFFF)
- {
+ {
// subtract the size of LengthToEnd element if it is invalid
if (lengthToEnd == HxFFFFFFFF && hadLengthToEnd)
- {
+ {
groupLength -= 12;
- }
+ }
// write out group length with correct value
this->WriteDataElement(cp, ep,
vtkDICOMDataElement(vtkDICOMTag(group, 0x0000),
vtkDICOMValue(vtkDICOMVR::UL, groupLength)));
- }
+ }
if (lengthToEnd != HxFFFFFFFF)
- {
+ {
// write out LengthToEnd with correct value
this->WriteDataElement(cp, ep,
vtkDICOMDataElement(vtkDICOMTag(0x0008, 0x0001),
vtkDICOMValue(vtkDICOMVR::UL, lengthToEnd)));
- }
}
+ }
else if (this->Depth == 0 && this->SOPInstanceUID &&
iter->GetTag() == vtkDICOMTag(DC::SOPInstanceUID))
- {
+ {
this->WriteDataElement(cp, ep,
vtkDICOMDataElement(
vtkDICOMTag(DC::SOPInstanceUID),
vtkDICOMValue(vtkDICOMVR::UI, this->SOPInstanceUID)));
++iter;
- }
+ }
else if (this->Depth == 0 && this->SeriesInstanceUID &&
iter->GetTag() == vtkDICOMTag(DC::SeriesInstanceUID))
- {
+ {
this->WriteDataElement(cp, ep,
vtkDICOMDataElement(
vtkDICOMTag(DC::SeriesInstanceUID),
vtkDICOMValue(vtkDICOMVR::UI, this->SeriesInstanceUID)));
++iter;
- }
+ }
else if (this->Depth == 0 && this->StudyInstanceUID &&
iter->GetTag() == vtkDICOMTag(DC::StudyInstanceUID))
- {
+ {
this->WriteDataElement(cp, ep,
vtkDICOMDataElement(
vtkDICOMTag(DC::StudyInstanceUID),
vtkDICOMValue(vtkDICOMVR::UI, this->StudyInstanceUID)));
++iter;
- }
+ }
else
- {
+ {
this->WriteDataElement(cp, ep, *iter);
++iter;
- }
}
+ }
return true;
}
@@ -905,59 +915,52 @@ vtkDICOMCompiler::~vtkDICOMCompiler()
delete [] this->TransferSyntaxUID;
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
if (this->SeriesUIDs)
- {
+ {
this->SeriesUIDs->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMCompiler::SetBufferSize(int size)
{
if (size < 256)
- {
+ {
size = 256;
- }
+ }
if (size > (2147483647 - 8))
- {
+ {
size = (2147483647 - 8);
- }
+ }
if (this->BufferSize != size)
- {
+ {
this->BufferSize = size;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMCompiler::GenerateSeriesUIDs()
{
if (this->SeriesUIDs == 0)
- {
+ {
this->SeriesUIDs = vtkStringArray::New();
- }
+ }
this->SeriesUIDs->Initialize();
if (this->MetaData)
- {
+ {
int n = this->MetaData->GetNumberOfInstances();
this->SeriesUIDs->SetNumberOfValues(n + 1); // allocate n+1
this->SeriesUIDs->SetNumberOfValues(n); // but set to n values
vtkDICOMUtilities::GenerateUIDs(DC::SOPInstanceUID, this->SeriesUIDs);
this->SeriesUIDs->InsertNextValue(
vtkDICOMUtilities::GenerateUID(DC::SeriesInstanceUID));
- }
-
- // study UID is only generated once per session
- if (vtkDICOMCompiler::StudyUID[0] == '\0')
- {
- std::string uid = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID);
- strcpy(vtkDICOMCompiler::StudyUID, uid.c_str());
- }
+ }
}
//----------------------------------------------------------------------------
@@ -971,33 +974,33 @@ void vtkDICOMCompiler::WriteHeader()
void vtkDICOMCompiler::Close()
{
if (this->Compressed && this->FrameCounter > 0)
- {
+ {
this->WriteFragments();
- }
+ }
if (this->OutputFile)
- {
+ {
this->OutputFile->Close();
delete this->OutputFile;
this->OutputFile = NULL;
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMCompiler::CloseAndRemove()
{
if (this->Compressed && this->FrameCounter > 0)
- {
+ {
this->FreeFragments();
- }
+ }
if (this->OutputFile)
- {
+ {
this->OutputFile->Close();
delete this->OutputFile;
this->OutputFile = NULL;
vtkDICOMFile::Remove(this->FileName);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -1006,7 +1009,7 @@ bool vtkDICOMCompiler::WriteFragments()
bool fileError = false;
if (this->OutputFile && this->ErrorCode == 0)
- {
+ {
// Compressed frames
unsigned int numFrames = this->FrameCounter;
size_t n = 0;
@@ -1024,30 +1027,30 @@ bool vtkDICOMCompiler::WriteFragments()
const unsigned int maxOffset = HxFFFFFFFF - 1;
unsigned int offset = 0;
for (unsigned int i = 0; i < numFrames; i++)
- {
+ {
Encoder<LE>::PutInt32(buffer + 8 + i*4, offset);
// make sure offsets don't exceed 32-bit limit
if (maxOffset - offset >= this->FrameLength[i])
- {
+ {
offset += this->FrameLength[i];
- }
+ }
else
- {
+ {
tableLength = 0;
vtkDICOMUtilities::PackUnsignedInt(tableLength, buffer + 4);
break;
- }
}
+ }
// write the offset table to the file
n = this->OutputFile->Write(buffer, tableLength + 8);
if (n < tableLength + 8)
- {
+ {
fileError = true;
- }
+ }
for (unsigned int i = 0; i < numFrames && !fileError; i++)
- {
+ {
// Fragment value header
// - Item tag (FFFE, E000)
// - Length of item in bytes (4 bytes)
@@ -1056,23 +1059,23 @@ bool vtkDICOMCompiler::WriteFragments()
Encoder<LE>::PutInt32(buffer+4, this->FrameLength[i]);
n = this->OutputFile->Write(buffer, 8);
if (n < 8)
- {
+ {
fileError = true;
break;
- }
+ }
// - Fragment data
assert((this->FrameLength[i] & 1) == 0);
n = this->OutputFile->Write(this->FrameData[i], this->FrameLength[i]);
if (n < this->FrameLength[i])
- {
+ {
fileError = true;
break;
- }
}
+ }
if (!fileError)
- {
+ {
// After final fragment:
// - Sequence delimiter tag (FFFE, E0DD)
// - Zero length
@@ -1081,20 +1084,20 @@ bool vtkDICOMCompiler::WriteFragments()
Encoder<LE>::PutInt32(buffer+4, 0);
n = this->OutputFile->Write(buffer, 8);
if (n < 8)
- {
+ {
fileError = true;
- }
}
+ }
delete [] buffer;
- }
+ }
this->FreeFragments();
if (fileError)
- {
+ {
this->DiskFullError();
- }
+ }
return !fileError;
}
@@ -1104,9 +1107,9 @@ void vtkDICOMCompiler::FreeFragments()
{
unsigned int numFrames = this->FrameCounter;
for (unsigned int i = 0; i < numFrames; i++)
- {
+ {
delete [] this->FrameData[i];
- }
+ }
delete [] this->FrameData;
delete [] this->FrameLength;
this->FrameData = 0;
@@ -1118,39 +1121,40 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
{
// Check that the file name has been set.
if (!this->FileName)
- {
+ {
this->SetErrorCode(vtkErrorCode::NoFileNameError);
vtkErrorMacro("WriteFile: No file name has been set");
return false;
- }
+ }
// Generate fresh UIDs if at index zero
- if (idx == 0 || this->SeriesUIDs == 0 ||
- this->SeriesUIDs->GetNumberOfValues() !=
- data->GetNumberOfInstances() + 1)
- {
+ if ((this->SOPInstanceUID == 0 || this->SeriesInstanceUID == 0) &&
+ (idx == 0 || this->SeriesUIDs == 0 ||
+ this->SeriesUIDs->GetNumberOfValues() !=
+ data->GetNumberOfInstances() + 1))
+ {
this->GenerateSeriesUIDs();
- }
+ }
this->OutputFile = new vtkDICOMFile(this->FileName, vtkDICOMFile::Out);
if (this->OutputFile->GetError())
- {
+ {
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
const char *errText = "Can't open the file ";
if (this->OutputFile->GetError() == vtkDICOMFile::AccessDenied)
- {
+ {
errText = "No permission to write the file ";
- }
- else if (this->OutputFile->GetError() == vtkDICOMFile::IsDirectory)
- {
+ }
+ else if (this->OutputFile->GetError() == vtkDICOMFile::FileIsDirectory)
+ {
errText = "The selected file is a directory ";
- }
+ }
delete this->OutputFile;
this->OutputFile = 0;
vtkErrorMacro("WriteFile: " << errText << this->FileName);
return false;
- }
+ }
this->Buffer = new unsigned char [this->BufferSize];
// guard against anyone changing BufferSize while compiling the file
@@ -1164,7 +1168,7 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
// only write preamble and meta header if transfer syntax is set
if (this->TransferSyntaxUID != 0)
- {
+ {
// write the preamble
memset(cp, '\0', 128);
cp += 128;
@@ -1175,30 +1179,30 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
cp += 4;
r = this->WriteMetaHeader(cp, ep, data, idx);
- }
+ }
if (r)
- {
+ {
r = this->WriteMetaData(cp, ep, data, idx);
- }
+ }
if (r)
- {
+ {
r = this->FlushBuffer(cp, ep);
- }
+ }
delete [] this->Buffer;
// delete the file if an error occurred
if (!r)
- {
+ {
if (this->GetErrorCode() == vtkErrorCode::NoError)
- {
+ {
this->DiskFullError();
- }
+ }
else
- {
+ {
this->CloseAndRemove();
- }
}
+ }
return r;
}
@@ -1207,24 +1211,24 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
void vtkDICOMCompiler::WritePixelData(const unsigned char *cp, vtkIdType size)
{
if (this->OutputFile == 0)
- {
+ {
return;
- }
+ }
size_t n = this->OutputFile->Write(cp, size);
if (n != static_cast<size_t>(size))
- {
+ {
this->DiskFullError();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
{
if (this->OutputFile == 0)
- {
+ {
return;
- }
+ }
union { char c[2]; short s; } endiancheck;
// this will set endiancheck.s to 1 on little endian architectures
@@ -1233,21 +1237,21 @@ void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
size_t n = 0;
if (this->Compressed)
- {
+ {
// if this is the first frame, do some set-up
if (this->FrameCounter == 0)
- {
+ {
unsigned int numFrames =
this->MetaData->GetAttributeValue(DC::NumberOfFrames).AsUnsignedInt();
numFrames = (numFrames == 0 ? 1 : numFrames);
this->FrameData = new unsigned char *[numFrames];
this->FrameLength = new unsigned int[numFrames];
for (unsigned int i = 0; i < numFrames; i++)
- {
+ {
this->FrameData[i] = 0;
this->FrameLength[i] = 0;
- }
}
+ }
vtkDICOMImageCodec codec(this->TransferSyntaxUID);
size_t fl = 0;
@@ -1257,48 +1261,48 @@ void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
this->FrameData[this->FrameCounter] = fd;
if (this->ErrorCode == 0 && errCode != vtkDICOMImageCodec::NoError)
- {
+ {
this->SetErrorCode(vtkErrorCode::FileFormatError);
vtkErrorMacro("Writing compressed DICOM is not supported.");
- }
+ }
// mark all data as accepted
n = size;
- }
+ }
else if (((this->BigEndian != 0) ^ (endiancheck.s != 1)) &&
this->MetaData->GetAttributeValue(DC::BitsAllocated).AsInt() > 8)
- {
+ {
// Swap bytes before writing
int scalarSize =
(this->MetaData->GetAttributeValue(DC::BitsAllocated).AsInt() + 7)/8;
unsigned char *buf = new unsigned char[size];
unsigned char *dp = buf;
if (scalarSize == 2)
- {
+ {
for (vtkIdType i = 0; i < size; i += 2)
- {
+ {
dp[0] = cp[1];
dp[1] = cp[0];
dp += 2;
cp += 2;
- }
}
+ }
else if (scalarSize == 4)
- {
+ {
for (vtkIdType i = 0; i < size; i += 4)
- {
+ {
dp[0] = cp[3];
dp[1] = cp[2];
dp[2] = cp[1];
dp[3] = cp[0];
dp += 4;
cp += 4;
- }
}
+ }
else if (scalarSize == 8)
- {
+ {
for (vtkIdType i = 0; i < size; i += 8)
- {
+ {
dp[0] = cp[7];
dp[1] = cp[6];
dp[2] = cp[5];
@@ -1309,21 +1313,21 @@ void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
dp[7] = cp[0];
dp += 8;
cp += 8;
- }
}
+ }
n = this->OutputFile->Write(buf, size);
delete [] buf;
- }
+ }
else
- {
+ {
// For uncompressed frames, write the data raw
n = this->OutputFile->Write(cp, size);
- }
+ }
if (n != static_cast<size_t>(size))
- {
+ {
this->DiskFullError();
- }
+ }
this->FrameCounter++;
}
@@ -1335,9 +1339,9 @@ bool vtkDICOMCompiler::WriteMetaHeader(
{
// if no transfer syntax is set, do not write header
if (this->TransferSyntaxUID == 0)
- {
+ {
return true;
- }
+ }
// create the encoder
LittleEndianEncoder encoder(this, idx);
@@ -1351,22 +1355,22 @@ bool vtkDICOMCompiler::WriteMetaHeader(
std::string classUIDString =
meta->GetAttributeValue(DC::SOPClassUID).AsString();
if (classUIDString == "")
- {
+ {
// if not present (e.g. DICOMDIR) get it from the meta header
classUIDString =
meta->GetAttributeValue(DC::MediaStorageSOPClassUID).AsString();
- }
+ }
const char *classUID = classUIDString.c_str();
if (instanceUID == 0)
- {
+ {
instanceUID = this->SeriesUIDs->GetValue(idx);
- }
+ }
if (implementationUID == 0)
- {
+ {
implementationUID =
vtkDICOMUtilities::GetImplementationClassUID();
- }
+ }
vtkDICOMItem item;
item.SetAttributeValue(
@@ -1389,38 +1393,38 @@ bool vtkDICOMCompiler::WriteMetaHeader(
vtkDICOMValue(vtkDICOMVR::UI, implementationUID));
if (this->ImplementationVersionName)
- {
+ {
item.SetAttributeValue(
DC::ImplementationVersionName,
vtkDICOMValue(vtkDICOMVR::SH,
this->ImplementationVersionName));
- }
+ }
if (this->SourceApplicationEntityTitle)
- {
+ {
item.SetAttributeValue(
DC::SourceApplicationEntityTitle,
vtkDICOMValue(vtkDICOMVR::AE,
this->SourceApplicationEntityTitle));
- }
+ }
// keep private information stored in meta header
const char *creatorUID =
meta->GetAttributeValue(DC::PrivateInformationCreatorUID).GetCharData();
if (creatorUID)
- {
+ {
item.SetAttributeValue(DC::PrivateInformationCreatorUID, creatorUID);
item.SetAttributeValue(DC::PrivateInformation,
meta->GetAttributeValue(DC::PrivateInformation));
- }
+ }
vtkDICOMDataElementIterator iter = item.Begin();
vtkDICOMDataElementIterator iterEnd = item.End();
if (iter != iterEnd)
- {
+ {
encoder.WriteElements(cp, ep, iter, iterEnd);
- }
+ }
return true;
}
@@ -1443,41 +1447,47 @@ bool vtkDICOMCompiler::WriteMetaData(
if (tsyntax == "" || // If no meta header, use Implicit LE
tsyntax == "1.2.840.10008.1.2" || // Implicit LE
tsyntax == "1.2.840.10008.1.20") // Papyrus Implicit LE
- {
+ {
encoder->SetImplicitVR(true);
- }
+ }
else if (tsyntax == "1.2.840.10008.1.2.2") // Explicit BE
- {
+ {
encoder = &encoderBE;
this->BigEndian = true;
- }
+ }
else if (tsyntax == "1.2.840.113619.5.2") // GE LE with BE data
- {
+ {
encoder->SetImplicitVR(true);
this->BigEndian = true;
- }
+ }
else if (tsyntax != "1.2.840.10008.1.2.1") // Explicit LE
- {
+ {
this->Compressed = true;
- }
+ }
const char *instanceUID = this->SOPInstanceUID;
const char *seriesUID = this->SeriesInstanceUID;
const char *studyUID = this->StudyInstanceUID;
if (instanceUID == 0)
- {
+ {
instanceUID = this->SeriesUIDs->GetValue(idx);
- }
+ }
if (seriesUID == 0)
- {
+ {
seriesUID = this->SeriesUIDs->GetValue(this->SeriesUIDs->GetMaxId());
- }
+ }
if (studyUID == 0 &&
meta->GetAttributeValue(DC::StudyInstanceUID).AsString() == "")
+ {
+ // study UID is only generated once per session
+ if (vtkDICOMCompiler::StudyUID[0] == '\0')
{
- studyUID = vtkDICOMCompiler::StudyUID;
+ std::string uid = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID);
+ strcpy(vtkDICOMCompiler::StudyUID, uid.c_str());
}
+ studyUID = vtkDICOMCompiler::StudyUID;
+ }
encoder->SetSOPInstanceUID(instanceUID);
encoder->SetSeriesInstanceUID(seriesUID);
@@ -1488,22 +1498,22 @@ bool vtkDICOMCompiler::WriteMetaData(
// skip past the meta header
while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002)
- {
+ {
++iter;
- }
+ }
// if last element is PixelData, don't write it yet
bool hasPixelData = false;
if (iterEnd != iter)
- {
+ {
vtkDICOMDataElementIterator finalElement = iterEnd;
--finalElement;
if (finalElement->GetTag() == vtkDICOMTag(DC::PixelData))
- {
+ {
iterEnd = finalElement;
hasPixelData = true;
- }
}
+ }
// write the meta data, get boolean status value
bool r = encoder->WriteElements(cp, ep, iter, iterEnd);
@@ -1511,24 +1521,24 @@ bool vtkDICOMCompiler::WriteMetaData(
// write the PixelData element head
if (r && hasPixelData &&
(r = encoder->CheckBuffer(cp, ep, 12)) != false)
- {
+ {
vtkDICOMVR vr = vtkDICOMVR::OW;
int bitsAllocated = this->MetaData->GetAttributeValue(
DC::BitsAllocated).AsInt();
if ((bitsAllocated > 0 && bitsAllocated <= 8) || this->Compressed)
- {
+ {
vr = vtkDICOMVR::OB;
- }
+ }
if (this->KeepOriginalPixelDataVR)
- {
+ {
vtkDICOMVR vrOriginal = this->MetaData->GetAttributeValue(
idx, DC::PixelData).GetVR();
if (vrOriginal.IsValid())
- {
+ {
vr = vrOriginal;
- }
}
+ }
unsigned int vl = this->ComputePixelDataSize();
@@ -1536,7 +1546,7 @@ bool vtkDICOMCompiler::WriteMetaData(
size_t l = encoder->WriteElementHead(
cp, vtkDICOMTag(DC::PixelData), vr, vl);
cp += l;
- }
+ }
return r;
}
@@ -1546,13 +1556,13 @@ unsigned int vtkDICOMCompiler::ComputePixelDataSize()
{
unsigned int vl = HxFFFFFFFF;
if (!this->Compressed)
- {
+ {
// compute the size
vtkDICOMMetaData *meta = this->MetaData;
int bitsAllocated = meta->GetAttributeValue(
this->Index, DC::BitsAllocated).AsInt();
if (bitsAllocated > 0)
- {
+ {
vl = meta->GetAttributeValue(
this->Index, DC::Columns).AsUnsignedInt();
vl *= meta->GetAttributeValue(
@@ -1564,33 +1574,39 @@ unsigned int vtkDICOMCompiler::ComputePixelDataSize()
vl *= ((m > 1) ? m : 1);
vl *= ((n > 1) ? n : 1);
if (bitsAllocated % 8 == 0)
- {
+ {
vl *= bitsAllocated/8;
- }
+ }
else
- {
+ {
// this will only occur in ancient data
vl = (vl*bitsAllocated + 7)/8;
vl += (vl & 1); // make it even
- }
}
}
+ }
return vl;
}
//----------------------------------------------------------------------------
bool vtkDICOMCompiler::FlushBuffer(
- unsigned char* &ucp, unsigned char* &)
+ unsigned char* &ucp, unsigned char* &ep)
{
+ bool rval = true;
const unsigned char *cp = ucp;
unsigned char *dp = this->Buffer;
ucp = dp;
- size_t n = cp - dp;
+ ep = dp + this->ChunkSize;
- size_t m = this->OutputFile->Write(dp, n);
+ if (cp)
+ {
+ size_t n = cp - dp;
+ size_t m = this->OutputFile->Write(dp, n);
+ rval = (n == m);
+ }
- return (n == m);
+ return rval;
}
//----------------------------------------------------------------------------
diff --git a/Source/vtkDICOMCompiler.h b/Source/vtkDICOMCompiler.h
index 2b4afb9..9677c3e 100644
--- a/Source/vtkDICOMCompiler.h
+++ b/Source/vtkDICOMCompiler.h
@@ -40,10 +40,13 @@ public:
//! Print a summary of the contents of this object.
void PrintSelf(ostream& os, vtkIndent indent);
+ //@{
//! Set the file name.
vtkSetStringMacro(FileName);
vtkGetStringMacro(FileName);
+ //@}
+ //@{
//! Set the SOP Instance UID.
/*!
* If you do not supply a UID, a random UID will be generated.
@@ -51,7 +54,9 @@ public:
*/
vtkSetStringMacro(SOPInstanceUID);
vtkGetStringMacro(SOPInstanceUID);
+ //@}
+ //@{
//! Set the Series Instance UID.
/*!
* If you do not supply a UID, a random UID will be generated.
@@ -59,7 +64,9 @@ public:
*/
vtkSetStringMacro(SeriesInstanceUID);
vtkGetStringMacro(SeriesInstanceUID);
+ //@}
+ //@{
//! Set the Study Instance UID.
/*!
* If you do not supply a UID, a random UID will be generated.
@@ -67,21 +74,27 @@ public:
*/
vtkSetStringMacro(StudyInstanceUID);
vtkGetStringMacro(StudyInstanceUID);
+ //@}
+ //@{
//! Set the Implementation Class UID.
/*!
* If you do not supply a UID, a default one will be used.
*/
vtkSetStringMacro(ImplementationClassUID);
vtkGetStringMacro(ImplementationClassUID);
+ //@}
+ //@{
//! Set the Implementation Version Name.
/*!
* If you do not supply a name, a default one will be used.
*/
vtkSetStringMacro(ImplementationVersionName);
vtkGetStringMacro(ImplementationVersionName);
+ //@}
+ //@{
//! Set the Source Application Entity Title.
/*!
* Provide a short name (16 chars max) for the network node that
@@ -90,7 +103,9 @@ public:
*/
vtkSetStringMacro(SourceApplicationEntityTitle);
vtkGetStringMacro(SourceApplicationEntityTitle);
+ //@}
+ //@{
//! Set the Transfer Syntax UID.
/*!
* The transfer syntax should be left at its default value of
@@ -101,15 +116,21 @@ public:
*/
vtkSetStringMacro(TransferSyntaxUID);
vtkGetStringMacro(TransferSyntaxUID);
+ //@}
+ //@{
//! Set the metadata object to write to the file.
void SetMetaData(vtkDICOMMetaData *);
vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
+ //@}
+ //@{
//! Set the instance index to use when accessing vtkDICOMMataData.
vtkSetMacro(Index, int);
int GetIndex() { return this->Index; }
+ //@}
+ //@{
//! Set the buffer size, the default is 8192 (8k).
/*!
* A larger buffer size results in fewer IO calls. The
@@ -117,7 +138,9 @@ public:
*/
void SetBufferSize(int size);
int GetBufferSize() { return this->BufferSize; }
+ //@}
+ //@{
//! Write the metadata to the file.
virtual void WriteHeader();
@@ -144,16 +167,20 @@ public:
//! Get the IO error code.
unsigned long GetErrorCode() { return this->ErrorCode; }
+ //@}
+ //@{
//! Generate a series UID and instance UIDs for the meta data.
/*!
* This will be called automatically whenever you provide a
* new meta data object for the compiler. Note that new UIDs
* will not be generated if you have already provided them with
- * SetSOPInstanceUID() and SetSeriesUID().
+ * SetSOPInstanceUID() and SetSeriesInstanceUID().
*/
void GenerateSeriesUIDs();
+ //@}
+ //@{
//! Use the original PixelData VR when writing pixel data element.
/*!
* This is really only useful when cloning data sets. It ensures
@@ -162,6 +189,7 @@ public:
vtkSetMacro(KeepOriginalPixelDataVR, bool);
vtkBooleanMacro(KeepOriginalPixelDataVR, bool);
vtkGetMacro(KeepOriginalPixelDataVR, bool);
+ //@}
protected:
vtkDICOMCompiler();
@@ -170,10 +198,14 @@ protected:
//! Internal method for flushing the IO buffer.
/*!
* This is an internal method that flushes the buffer to the file.
- * The pointer cp markes the current position in the buffer, and
- * ep marks the end of the buffer. By checking ep-cp, subroutines
- * can check how much space is left in the buffer and call FlushBuffer
- * only when the buffer is nearly full.
+ * If called with cp = 0, it will initialize cp to the beginning of
+ * the write buffer, and ep to the end of the buffer, without writing
+ * anything to the file. The caller should then write to the buffer,
+ * incrementing the pointer cp while doing so. When cp approaches the
+ * end of the buffer (which is stored in ep), FlushBuffer should be
+ * called to flush the buffer contents to the file. Every call will
+ * reset cp to the beginning of the buffer and ep to the end of the
+ * buffer.
*/
virtual bool FlushBuffer(unsigned char* &cp, unsigned char* &ep);
@@ -237,8 +269,8 @@ protected:
friend class vtkDICOMCompilerInternalFriendship;
private:
- vtkDICOMCompiler(const vtkDICOMCompiler&); // Not implemented.
- void operator=(const vtkDICOMCompiler&); // Not implemented.
+ vtkDICOMCompiler(const vtkDICOMCompiler&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMCompiler&) VTK_DELETE_FUNCTION;
};
#endif /* vtkDICOMCompiler_h */
diff --git a/Source/vtkDICOMDataElement.h b/Source/vtkDICOMDataElement.h
index b406988..fd8f6ba 100644
--- a/Source/vtkDICOMDataElement.h
+++ b/Source/vtkDICOMDataElement.h
@@ -29,21 +29,27 @@
class VTKDICOM_EXPORT vtkDICOMDataElement
{
public:
+ //@{
vtkDICOMDataElement() : Tag(), Value(), Next(0), Prev(0) {}
vtkDICOMDataElement(const vtkDICOMTag& t, const vtkDICOMValue &v) :
Tag(t), Value(v), Next(0), Prev(0) {}
+ //@}
+ //@{
//! Get the tag for this data element.
vtkDICOMTag GetTag() const { return this->Tag; }
//! Get the VR for this data element.
vtkDICOMVR GetVR() const { return this->Value.GetVR(); }
+ //@}
+ //@{
//! Check whether this data element carries per-instance values.
bool IsPerInstance() const { return (this->Value.GetMultiplexData() != 0); }
//! Get the number of value instances in this data element.
- int GetNumberOfInstances() const { return this->Value.GetNumberOfValues(); }
+ int GetNumberOfInstances() const {
+ return static_cast<int>(this->Value.GetNumberOfValues()); }
//! Get the value of the data element, if not multi-valued.
const vtkDICOMValue& GetValue() const { return this->Value; }
@@ -52,12 +58,15 @@ public:
const vtkDICOMValue& GetValue(int i) const {
const vtkDICOMValue *vptr = this->Value.GetMultiplexData();
return (vptr == 0 ? this->Value : vptr[i]); }
+ //@}
+ //@{
bool operator==(const vtkDICOMDataElement& o) const {
return (this->Tag == o.Tag && this->Value == o.Value); }
bool operator!=(const vtkDICOMDataElement& o) const {
return (this->Tag != o.Tag || this->Value != o.Value); }
+ //@}
private:
vtkDICOMTag Tag;
@@ -77,8 +86,11 @@ private:
class VTKDICOM_EXPORT vtkDICOMDataElementIterator
{
public:
+ //@{
vtkDICOMDataElementIterator() : Pointer(0) {}
+ //@}
+ //@{
vtkDICOMDataElementIterator& operator++() {
if (this->Pointer) { this->Pointer = this->Pointer->Next; }
return *this; }
@@ -96,15 +108,20 @@ public:
const vtkDICOMDataElement *ptr = this->Pointer;
if (ptr) { this->Pointer = this->Pointer->Prev; }
return vtkDICOMDataElementIterator(ptr); }
+ //@}
+ //@{
const vtkDICOMDataElement *operator->() const { return this->Pointer; }
const vtkDICOMDataElement& operator*() const { return *this->Pointer; }
+ //@}
+ //@{
bool operator==(const vtkDICOMDataElementIterator& it) const {
return (this->Pointer == it.Pointer); }
bool operator!=(const vtkDICOMDataElementIterator& it) const {
return (this->Pointer != it.Pointer); }
+ //@}
private:
vtkDICOMDataElementIterator(const vtkDICOMDataElement *ptr) {
diff --git a/Source/vtkDICOMDictEntry.cxx b/Source/vtkDICOMDictEntry.cxx
index d0e1165..25c2401 100644
--- a/Source/vtkDICOMDictEntry.cxx
+++ b/Source/vtkDICOMDictEntry.cxx
@@ -19,14 +19,14 @@ const vtkDICOMDictEntry::Entry vtkDICOMDictEntry::InvalidEntry = {
ostream& operator<<(ostream& o, const vtkDICOMDictEntry& a)
{
if (!a.IsValid())
- {
+ {
o << "INVALID";
- }
+ }
else
- {
+ {
o << a.GetTag() << "," << a.GetVR() << "," << a.GetVM() << ","
<< "\"" << a.GetName() << "\"";
- }
+ }
return o;
}
diff --git a/Source/vtkDICOMDictHash.cxx b/Source/vtkDICOMDictHash.cxx
index 7afc460..6edd42a 100644
--- a/Source/vtkDICOMDictHash.cxx
+++ b/Source/vtkDICOMDictHash.cxx
@@ -11,7 +11,7 @@ typedef vtkDICOMVR VR;
typedef vtkDICOMVM VM;
typedef vtkDICOMDictEntry::Entry DictEntry;
-DictEntry DictContents[] = {
+const DictEntry DictContents[] = {
{ 0x0002, 0x0000, 0, VR::UL, VM::M1, "FileMetaInformationGroupLength" },
{ 0x0002, 0x0001, 0, VR::OB, VM::M1, "FileMetaInformationVersion" },
{ 0x0002, 0x0002, 0, VR::UI, VM::M1, "MediaStorageSOPClassUID" },
@@ -77,6 +77,7 @@ DictEntry DictContents[] = {
{ 0x0008, 0x0052, 0, VR::CS, VM::M1, "QueryRetrieveLevel" },
{ 0x0008, 0x0053, 0, VR::CS, VM::M1, "QueryRetrieveView" },
{ 0x0008, 0x0054, 0, VR::AE, VM::M1TN, "RetrieveAETitle" },
+{ 0x0008, 0x0055, 0, VR::AE, VM::M1, "StationAETitle" },
{ 0x0008, 0x0056, 0, VR::CS, VM::M1, "InstanceAvailability" },
{ 0x0008, 0x0058, 0, VR::UI, VM::M1TN, "FailedSOPInstanceUIDList" },
{ 0x0008, 0x0060, 0, VR::CS, VM::M1, "Modality" },
@@ -117,6 +118,9 @@ DictEntry DictContents[] = {
{ 0x0008, 0x0119, 0, VR::UC, VM::M1, "LongCodeValue" },
{ 0x0008, 0x0120, 0, VR::UR, VM::M1, "URNCodeValue" },
{ 0x0008, 0x0121, 0, VR::SQ, VM::M1, "EquivalentCodeSequence" },
+{ 0x0008, 0x0122, 0, VR::LO, VM::M1, "MappingResourceName" },
+{ 0x0008, 0x0123, 0, VR::SQ, VM::M1, "ContextGroupIdentificationSequence" },
+{ 0x0008, 0x0124, 0, VR::SQ, VM::M1, "MappingResourceIdentificationSequence" },
{ 0x0008, 0x0201, 0, VR::SH, VM::M1, "TimezoneOffsetFromUTC" },
{ 0x0008, 0x0300, 0, VR::SQ, VM::M1, "PrivateDataElementCharacteristicsSequence" },
{ 0x0008, 0x0301, 0, VR::US, VM::M1, "PrivateGroupReference" },
@@ -172,6 +176,7 @@ DictEntry DictContents[] = {
{ 0x0008, 0x1197, 0, VR::US, VM::M1, "FailureReason" },
{ 0x0008, 0x1198, 0, VR::SQ, VM::M1, "FailedSOPSequence" },
{ 0x0008, 0x1199, 0, VR::SQ, VM::M1, "ReferencedSOPSequence" },
+{ 0x0008, 0x119A, 0, VR::SQ, VM::M1, "OtherFailuresSequence" },
{ 0x0008, 0x1200, 0, VR::SQ, VM::M1, "StudiesContainingOtherReferencedInstancesSequence" },
{ 0x0008, 0x1250, 0, VR::SQ, VM::M1, "RelatedSeriesSequence" },
{ 0x0008, 0x2110, 1, VR::CS, VM::M1, "LossyImageCompressionRetired" },
@@ -240,14 +245,28 @@ DictEntry DictContents[] = {
{ 0x0010, 0x0021, 0, VR::LO, VM::M1, "IssuerOfPatientID" },
{ 0x0010, 0x0022, 0, VR::CS, VM::M1, "TypeOfPatientID" },
{ 0x0010, 0x0024, 0, VR::SQ, VM::M1, "IssuerOfPatientIDQualifiersSequence" },
+{ 0x0010, 0x0026, 0, VR::SQ, VM::M1, "SourcePatientGroupIdentificationSequence" },
+{ 0x0010, 0x0027, 0, VR::SQ, VM::M1, "GroupOfPatientsIdentificationSequence" },
+{ 0x0010, 0x0028, 0, VR::US, VM::M3, "SubjectRelativePositionInImage" },
{ 0x0010, 0x0030, 0, VR::DA, VM::M1, "PatientBirthDate" },
{ 0x0010, 0x0032, 0, VR::TM, VM::M1, "PatientBirthTime" },
+{ 0x0010, 0x0033, 0, VR::LO, VM::M1, "PatientBirthDateInAlternativeCalendar" },
+{ 0x0010, 0x0034, 0, VR::LO, VM::M1, "PatientDeathDateInAlternativeCalendar" },
+{ 0x0010, 0x0035, 0, VR::CS, VM::M1, "PatientAlternativeCalendar" },
{ 0x0010, 0x0040, 0, VR::CS, VM::M1, "PatientSex" },
{ 0x0010, 0x0050, 0, VR::SQ, VM::M1, "PatientInsurancePlanCodeSequence" },
{ 0x0010, 0x0101, 0, VR::SQ, VM::M1, "PatientPrimaryLanguageCodeSequence" },
{ 0x0010, 0x0102, 0, VR::SQ, VM::M1, "PatientPrimaryLanguageModifierCodeSequence" },
{ 0x0010, 0x0200, 0, VR::CS, VM::M1, "QualityControlSubject" },
{ 0x0010, 0x0201, 0, VR::SQ, VM::M1, "QualityControlSubjectTypeCodeSequence" },
+{ 0x0010, 0x0212, 0, VR::UC, VM::M1, "StrainDescription" },
+{ 0x0010, 0x0213, 0, VR::LO, VM::M1, "StrainNomenclature" },
+{ 0x0010, 0x0214, 0, VR::LO, VM::M1, "StrainStockNumber" },
+{ 0x0010, 0x0215, 0, VR::SQ, VM::M1, "StrainSourceRegistryCodeSequence" },
+{ 0x0010, 0x0216, 0, VR::SQ, VM::M1, "StrainStockSequence" },
+{ 0x0010, 0x0217, 0, VR::LO, VM::M1, "StrainSource" },
+{ 0x0010, 0x0218, 0, VR::UT, VM::M1, "StrainAdditionalInformation" },
+{ 0x0010, 0x0219, 0, VR::SQ, VM::M1, "StrainCodeSequence" },
{ 0x0010, 0x1000, 0, VR::LO, VM::M1TN, "OtherPatientIDs" },
{ 0x0010, 0x1001, 0, VR::PN, VM::M1TN, "OtherPatientNames" },
{ 0x0010, 0x1002, 0, VR::SQ, VM::M1, "OtherPatientIDsSequence" },
@@ -310,21 +329,30 @@ DictEntry DictContents[] = {
{ 0x0012, 0x0083, 0, VR::SQ, VM::M1, "ConsentForClinicalTrialUseSequence" },
{ 0x0012, 0x0084, 0, VR::CS, VM::M1, "DistributionType" },
{ 0x0012, 0x0085, 0, VR::CS, VM::M1, "ConsentForDistributionFlag" },
-{ 0x0014, 0x0023, 1, VR::ST, VM::M1TN, "CADFileFormat" },
-{ 0x0014, 0x0024, 1, VR::ST, VM::M1TN, "ComponentReferenceSystem" },
-{ 0x0014, 0x0025, 2, VR::ST, VM::M1TN, "ComponentManufacturingProcedure" },
-{ 0x0014, 0x0028, 2, VR::ST, VM::M1TN, "ComponentManufacturer" },
+{ 0x0014, 0x0023, 1, VR::ST, VM::M1, "CADFileFormat" },
+{ 0x0014, 0x0024, 1, VR::ST, VM::M1, "ComponentReferenceSystem" },
+{ 0x0014, 0x0025, 2, VR::ST, VM::M1, "ComponentManufacturingProcedure" },
+{ 0x0014, 0x0028, 2, VR::ST, VM::M1, "ComponentManufacturer" },
{ 0x0014, 0x0030, 2, VR::DS, VM::M1TN, "MaterialThickness" },
{ 0x0014, 0x0032, 2, VR::DS, VM::M1TN, "MaterialPipeDiameter" },
{ 0x0014, 0x0034, 2, VR::DS, VM::M1TN, "MaterialIsolationDiameter" },
-{ 0x0014, 0x0042, 2, VR::ST, VM::M1TN, "MaterialGrade" },
-{ 0x0014, 0x0044, 2, VR::ST, VM::M1TN, "MaterialPropertiesDescription" },
-{ 0x0014, 0x0045, 1, VR::ST, VM::M1TN, "MaterialPropertiesFileFormatRetired" },
+{ 0x0014, 0x0042, 2, VR::ST, VM::M1, "MaterialGrade" },
+{ 0x0014, 0x0044, 2, VR::ST, VM::M1, "MaterialPropertiesDescription" },
+{ 0x0014, 0x0045, 1, VR::ST, VM::M1, "MaterialPropertiesFileFormatRetired" },
{ 0x0014, 0x0046, 2, VR::LT, VM::M1, "MaterialNotes" },
{ 0x0014, 0x0050, 2, VR::CS, VM::M1, "ComponentShape" },
{ 0x0014, 0x0052, 2, VR::CS, VM::M1, "CurvatureType" },
{ 0x0014, 0x0054, 2, VR::DS, VM::M1, "OuterDiameter" },
{ 0x0014, 0x0056, 2, VR::DS, VM::M1, "InnerDiameter" },
+{ 0x0014, 0x0100, 2, VR::LO, VM::M1TN, "ComponentWelderIDs" },
+{ 0x0014, 0x0101, 2, VR::CS, VM::M1, "SecondaryApprovalStatus" },
+{ 0x0014, 0x0102, 2, VR::DA, VM::M1, "SecondaryReviewDate" },
+{ 0x0014, 0x0103, 2, VR::TM, VM::M1, "SecondaryReviewTime" },
+{ 0x0014, 0x0104, 2, VR::PN, VM::M1, "SecondaryReviewerName" },
+{ 0x0014, 0x0105, 2, VR::ST, VM::M1, "RepairID" },
+{ 0x0014, 0x0106, 2, VR::SQ, VM::M1, "MultipleComponentApprovalSequence" },
+{ 0x0014, 0x0107, 2, VR::CS, VM::M1TN, "OtherApprovalStatus" },
+{ 0x0014, 0x0108, 2, VR::CS, VM::M1TN, "OtherSecondaryApprovalStatus" },
{ 0x0014, 0x1010, 2, VR::ST, VM::M1, "ActualEnvironmentalConditions" },
{ 0x0014, 0x1020, 2, VR::DA, VM::M1, "ExpiryDate" },
{ 0x0014, 0x1040, 2, VR::ST, VM::M1, "EnvironmentalConditions" },
@@ -671,6 +699,8 @@ DictEntry DictContents[] = {
{ 0x0018, 0x1251, 0, VR::SH, VM::M1, "TransmitCoilName" },
{ 0x0018, 0x1260, 0, VR::SH, VM::M1, "PlateType" },
{ 0x0018, 0x1261, 0, VR::LO, VM::M1, "PhosphorType" },
+{ 0x0018, 0x1271, 0, VR::FD, VM::M1, "WaterEquivalentDiameter" },
+{ 0x0018, 0x1272, 0, VR::SQ, VM::M1, "WaterEquivalentDiameterCalculationMethodCodeSequence" },
{ 0x0018, 0x1300, 0, VR::DS, VM::M1, "ScanVelocity" },
{ 0x0018, 0x1301, 0, VR::CS, VM::M1TN, "WholeBodyTechnique" },
{ 0x0018, 0x1302, 0, VR::IS, VM::M1, "ScanLength" },
@@ -1169,6 +1199,10 @@ DictEntry DictContents[] = {
{ 0x0018, 0x9605, 0, VR::FD, VM::M1, "DiffusionBValueYY" },
{ 0x0018, 0x9606, 0, VR::FD, VM::M1, "DiffusionBValueYZ" },
{ 0x0018, 0x9607, 0, VR::FD, VM::M1, "DiffusionBValueZZ" },
+{ 0x0018, 0x9621, 0, VR::SQ, VM::M1, "FunctionalMRSequence" },
+{ 0x0018, 0x9622, 0, VR::CS, VM::M1, "FunctionalSettlingPhaseFramesPresent" },
+{ 0x0018, 0x9623, 0, VR::DT, VM::M1, "FunctionalSyncPulse" },
+{ 0x0018, 0x9624, 0, VR::CS, VM::M1, "SettlingPhaseFrame" },
{ 0x0018, 0x9701, 0, VR::DT, VM::M1, "DecayCorrectionDateTime" },
{ 0x0018, 0x9715, 0, VR::FD, VM::M1, "StartDensityThreshold" },
{ 0x0018, 0x9716, 0, VR::FD, VM::M1, "StartRelativeDensityDifferenceThreshold" },
@@ -2100,6 +2134,11 @@ DictEntry DictContents[] = {
{ 0x0040, 0x4050, 0, VR::DT, VM::M1, "PerformedProcedureStepStartDateTime" },
{ 0x0040, 0x4051, 0, VR::DT, VM::M1, "PerformedProcedureStepEndDateTime" },
{ 0x0040, 0x4052, 0, VR::DT, VM::M1, "ProcedureStepCancellationDateTime" },
+{ 0x0040, 0x4070, 0, VR::SQ, VM::M1, "OutputDestinationSequence" },
+{ 0x0040, 0x4071, 0, VR::SQ, VM::M1, "DICOMStorageSequence" },
+{ 0x0040, 0x4072, 0, VR::SQ, VM::M1, "STOWRSStorageSequence" },
+{ 0x0040, 0x4073, 0, VR::UR, VM::M1, "StorageURL" },
+{ 0x0040, 0x4074, 0, VR::SQ, VM::M1, "XDSStorageSequence" },
{ 0x0040, 0x8302, 0, VR::DS, VM::M1, "EntranceDoseInmGy" },
{ 0x0040, 0x9092, 0, VR::SQ, VM::M1, "ParametricMapFrameTypeSequence" },
{ 0x0040, 0x9094, 0, VR::SQ, VM::M1, "ReferencedImageRealWorldValueMappingSequence" },
@@ -2108,6 +2147,8 @@ DictEntry DictContents[] = {
{ 0x0040, 0x9210, 0, VR::SH, VM::M1, "LUTLabel" },
{ 0x0040, 0x9211, 0, VR::XS, VM::M1, "RealWorldValueLastValueMapped" },
{ 0x0040, 0x9212, 0, VR::FD, VM::M1TN, "RealWorldValueLUTData" },
+{ 0x0040, 0x9213, 0, VR::FD, VM::M1, "DoubleFloatRealWorldValueLastValueMapped" },
+{ 0x0040, 0x9214, 0, VR::FD, VM::M1, "DoubleFloatRealWorldValueFirstValueMapped" },
{ 0x0040, 0x9216, 0, VR::XS, VM::M1, "RealWorldValueFirstValueMapped" },
{ 0x0040, 0x9220, 0, VR::SQ, VM::M1, "QuantityDefinitionSequence" },
{ 0x0040, 0x9224, 0, VR::FD, VM::M1, "RealWorldValueIntercept" },
@@ -2518,6 +2559,8 @@ DictEntry DictContents[] = {
{ 0x0062, 0x0010, 0, VR::CS, VM::M1, "SegmentationFractionalType" },
{ 0x0062, 0x0011, 0, VR::SQ, VM::M1, "SegmentedPropertyTypeModifierCodeSequence" },
{ 0x0062, 0x0012, 0, VR::SQ, VM::M1, "UsedSegmentsSequence" },
+{ 0x0062, 0x0020, 0, VR::UT, VM::M1, "TrackingID" },
+{ 0x0062, 0x0021, 0, VR::UI, VM::M1, "TrackingUID" },
{ 0x0064, 0x0002, 0, VR::SQ, VM::M1, "DeformableRegistrationSequence" },
{ 0x0064, 0x0003, 0, VR::UI, VM::M1, "SourceFrameOfReferenceUID" },
{ 0x0064, 0x0005, 0, VR::SQ, VM::M1, "DeformableRegistrationGridSequence" },
@@ -2552,13 +2595,13 @@ DictEntry DictContents[] = {
{ 0x0066, 0x001F, 0, VR::US, VM::M1, "VectorDimensionality" },
{ 0x0066, 0x0020, 0, VR::FL, VM::M1TN, "VectorAccuracy" },
{ 0x0066, 0x0021, 0, VR::OF, VM::M1, "VectorCoordinateData" },
-{ 0x0066, 0x0023, 0, VR::OW, VM::M1, "TrianglePointIndexList" },
-{ 0x0066, 0x0024, 0, VR::OW, VM::M1, "EdgePointIndexList" },
-{ 0x0066, 0x0025, 0, VR::OW, VM::M1, "VertexPointIndexList" },
+{ 0x0066, 0x0023, 1, VR::OW, VM::M1, "TrianglePointIndexList" },
+{ 0x0066, 0x0024, 1, VR::OW, VM::M1, "EdgePointIndexList" },
+{ 0x0066, 0x0025, 1, VR::OW, VM::M1, "VertexPointIndexList" },
{ 0x0066, 0x0026, 0, VR::SQ, VM::M1, "TriangleStripSequence" },
{ 0x0066, 0x0027, 0, VR::SQ, VM::M1, "TriangleFanSequence" },
{ 0x0066, 0x0028, 0, VR::SQ, VM::M1, "LineSequence" },
-{ 0x0066, 0x0029, 0, VR::OW, VM::M1, "PrimitivePointIndexList" },
+{ 0x0066, 0x0029, 1, VR::OW, VM::M1, "PrimitivePointIndexList" },
{ 0x0066, 0x002A, 0, VR::UL, VM::M1, "SurfaceCount" },
{ 0x0066, 0x002B, 0, VR::SQ, VM::M1, "ReferencedSurfaceSequence" },
{ 0x0066, 0x002C, 0, VR::UL, VM::M1, "ReferencedSurfaceNumber" },
@@ -2573,10 +2616,10 @@ DictEntry DictContents[] = {
{ 0x0066, 0x0036, 0, VR::LO, VM::M1, "AlgorithmName" },
{ 0x0066, 0x0037, 0, VR::FL, VM::M1, "RecommendedPointRadius" },
{ 0x0066, 0x0038, 0, VR::FL, VM::M1, "RecommendedLineThickness" },
-{ 0x0066, 0x0040, 0, VR::UL, VM::M1TN, "LongPrimitivePointIndexList" },
-{ 0x0066, 0x0041, 0, VR::UL, VM::M3T3N, "LongTrianglePointIndexList" },
-{ 0x0066, 0x0042, 0, VR::UL, VM::M2T2N, "LongEdgePointIndexList" },
-{ 0x0066, 0x0043, 0, VR::UL, VM::M1TN, "LongVertexPointIndexList" },
+{ 0x0066, 0x0040, 0, VR::OL, VM::M1, "LongPrimitivePointIndexList" },
+{ 0x0066, 0x0041, 0, VR::OL, VM::M1, "LongTrianglePointIndexList" },
+{ 0x0066, 0x0042, 0, VR::OL, VM::M1, "LongEdgePointIndexList" },
+{ 0x0066, 0x0043, 0, VR::OL, VM::M1, "LongVertexPointIndexList" },
{ 0x0066, 0x0101, 0, VR::SQ, VM::M1, "TrackSetSequence" },
{ 0x0066, 0x0102, 0, VR::SQ, VM::M1, "TrackSequence" },
{ 0x0066, 0x0103, 0, VR::OW, VM::M1, "RecommendedDisplayCIELabValueList" },
@@ -2753,6 +2796,7 @@ DictEntry DictContents[] = {
{ 0x0070, 0x0308, 0, VR::SQ, VM::M1, "RegistrationSequence" },
{ 0x0070, 0x0309, 0, VR::SQ, VM::M1, "MatrixRegistrationSequence" },
{ 0x0070, 0x030A, 0, VR::SQ, VM::M1, "MatrixSequence" },
+{ 0x0070, 0x030B, 0, VR::FD, VM::M16, "FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix" },
{ 0x0070, 0x030C, 0, VR::CS, VM::M1, "FrameOfReferenceTransformationMatrixType" },
{ 0x0070, 0x030D, 0, VR::SQ, VM::M1, "RegistrationTypeCodeSequence" },
{ 0x0070, 0x030F, 0, VR::ST, VM::M1, "FiducialDescription" },
@@ -2785,8 +2829,8 @@ DictEntry DictContents[] = {
{ 0x0070, 0x1302, 0, VR::CS, VM::M1, "VolumeCroppingMethod" },
{ 0x0070, 0x1303, 0, VR::FD, VM::M6, "BoundingBoxCrop" },
{ 0x0070, 0x1304, 0, VR::SQ, VM::M1, "ObliqueCroppingPlaneSequence" },
-{ 0x0070, 0x1305, 0, VR::FD, VM::M4, "ObliqueCroppingPlane" },
-{ 0x0070, 0x1306, 0, VR::FD, VM::M3, "ObliqueCroppingPlaneNormal" },
+{ 0x0070, 0x1305, 0, VR::FD, VM::M4, "Plane" },
+{ 0x0070, 0x1306, 0, VR::FD, VM::M3, "PlaneNormal" },
{ 0x0070, 0x1309, 0, VR::US, VM::M1, "CroppingSpecificationNumber" },
{ 0x0070, 0x1501, 0, VR::CS, VM::M1, "MultiPlanarReconstructionStyle" },
{ 0x0070, 0x1502, 0, VR::CS, VM::M1, "MPRThicknessType" },
@@ -2842,17 +2886,30 @@ DictEntry DictContents[] = {
{ 0x0072, 0x0052, 0, VR::AT, VM::M1TN, "SelectorSequencePointer" },
{ 0x0072, 0x0054, 0, VR::LO, VM::M1TN, "SelectorSequencePointerPrivateCreator" },
{ 0x0072, 0x0056, 0, VR::LO, VM::M1, "SelectorAttributePrivateCreator" },
+{ 0x0072, 0x005E, 0, VR::AE, VM::M1TN, "SelectorAEValue" },
+{ 0x0072, 0x005F, 0, VR::AS, VM::M1TN, "SelectorASValue" },
{ 0x0072, 0x0060, 0, VR::AT, VM::M1TN, "SelectorATValue" },
+{ 0x0072, 0x0061, 0, VR::DA, VM::M1TN, "SelectorDAValue" },
{ 0x0072, 0x0062, 0, VR::CS, VM::M1TN, "SelectorCSValue" },
+{ 0x0072, 0x0063, 0, VR::DT, VM::M1TN, "SelectorDTValue" },
{ 0x0072, 0x0064, 0, VR::IS, VM::M1TN, "SelectorISValue" },
+{ 0x0072, 0x0065, 0, VR::OB, VM::M1, "SelectorOBValue" },
{ 0x0072, 0x0066, 0, VR::LO, VM::M1TN, "SelectorLOValue" },
+{ 0x0072, 0x0067, 0, VR::OF, VM::M1, "SelectorOFValue" },
{ 0x0072, 0x0068, 0, VR::LT, VM::M1, "SelectorLTValue" },
+{ 0x0072, 0x0069, 0, VR::OW, VM::M1, "SelectorOWValue" },
{ 0x0072, 0x006A, 0, VR::PN, VM::M1TN, "SelectorPNValue" },
+{ 0x0072, 0x006B, 0, VR::TM, VM::M1TN, "SelectorTMValue" },
{ 0x0072, 0x006C, 0, VR::SH, VM::M1TN, "SelectorSHValue" },
+{ 0x0072, 0x006D, 0, VR::UN, VM::M1, "SelectorUNValue" },
{ 0x0072, 0x006E, 0, VR::ST, VM::M1, "SelectorSTValue" },
+{ 0x0072, 0x006F, 0, VR::UC, VM::M1TN, "SelectorUCValue" },
{ 0x0072, 0x0070, 0, VR::UT, VM::M1, "SelectorUTValue" },
+{ 0x0072, 0x0071, 0, VR::UR, VM::M1, "SelectorURValue" },
{ 0x0072, 0x0072, 0, VR::DS, VM::M1TN, "SelectorDSValue" },
+{ 0x0072, 0x0073, 0, VR::OD, VM::M1, "SelectorODValue" },
{ 0x0072, 0x0074, 0, VR::FD, VM::M1TN, "SelectorFDValue" },
+{ 0x0072, 0x0075, 0, VR::OL, VM::M1, "SelectorOLValue" },
{ 0x0072, 0x0076, 0, VR::FL, VM::M1TN, "SelectorFLValue" },
{ 0x0072, 0x0078, 0, VR::UL, VM::M1TN, "SelectorULValue" },
{ 0x0072, 0x007A, 0, VR::US, VM::M1TN, "SelectorUSValue" },
@@ -2982,6 +3039,20 @@ DictEntry DictContents[] = {
{ 0x0074, 0x1324, 0, VR::UL, VM::M1, "BeamOrderIndex" },
{ 0x0074, 0x1338, 0, VR::FD, VM::M1, "DoubleExposureMeterset" },
{ 0x0074, 0x133A, 0, VR::FD, VM::M4, "DoubleExposureFieldDelta" },
+{ 0x0074, 0x1401, 0, VR::SQ, VM::M1, "BrachyTaskSequence" },
+{ 0x0074, 0x1402, 0, VR::DS, VM::M1, "ContinuationStartTotalReferenceAirKerma" },
+{ 0x0074, 0x1403, 0, VR::DS, VM::M1, "ContinuationEndTotalReferenceAirKerma" },
+{ 0x0074, 0x1404, 0, VR::IS, VM::M1, "ContinuationPulseNumber" },
+{ 0x0074, 0x1405, 0, VR::SQ, VM::M1, "ChannelDeliveryOrderSequence" },
+{ 0x0074, 0x1406, 0, VR::IS, VM::M1, "ReferencedChannelNumber" },
+{ 0x0074, 0x1407, 0, VR::DS, VM::M1, "StartCumulativeTimeWeight" },
+{ 0x0074, 0x1408, 0, VR::DS, VM::M1, "EndCumulativeTimeWeight" },
+{ 0x0074, 0x1409, 0, VR::SQ, VM::M1, "OmittedChannelSequence" },
+{ 0x0074, 0x140A, 0, VR::CS, VM::M1, "ReasonForChannelOmission" },
+{ 0x0074, 0x140B, 0, VR::LO, VM::M1, "ReasonForChannelOmissionDescription" },
+{ 0x0074, 0x140C, 0, VR::IS, VM::M1, "ChannelDeliveryOrderIndex" },
+{ 0x0074, 0x140D, 0, VR::SQ, VM::M1, "ChannelDeliveryContinuationSequence" },
+{ 0x0074, 0x140E, 0, VR::SQ, VM::M1, "OmittedApplicationSetupSequence" },
{ 0x0076, 0x0001, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateName" },
{ 0x0076, 0x0003, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateIssuer" },
{ 0x0076, 0x0006, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateVersion" },
@@ -3036,6 +3107,29 @@ DictEntry DictContents[] = {
{ 0x0080, 0x0011, 0, VR::OF, VM::M1TN, "VValueData" },
{ 0x0080, 0x0012, 0, VR::SQ, VM::M1, "ReferencedTextureSequence" },
{ 0x0080, 0x0013, 0, VR::SQ, VM::M1, "ReferencedSurfaceDataSequence" },
+{ 0x0082, 0x0001, 0, VR::CS, VM::M1, "AssessmentSummary" },
+{ 0x0082, 0x0003, 0, VR::UT, VM::M1, "AssessmentSummaryDescription" },
+{ 0x0082, 0x0004, 0, VR::SQ, VM::M1, "AssessedSOPInstanceSequence" },
+{ 0x0082, 0x0005, 0, VR::SQ, VM::M1, "ReferencedComparisonSOPInstanceSequence" },
+{ 0x0082, 0x0006, 0, VR::UL, VM::M1, "NumberOfAssessmentObservations" },
+{ 0x0082, 0x0007, 0, VR::SQ, VM::M1, "AssessmentObservationsSequence" },
+{ 0x0082, 0x0008, 0, VR::CS, VM::M1, "ObservationSignificance" },
+{ 0x0082, 0x000A, 0, VR::UT, VM::M1, "ObservationDescription" },
+{ 0x0082, 0x000C, 0, VR::SQ, VM::M1, "StructuredContraintObservationSequence" },
+{ 0x0082, 0x0010, 0, VR::SQ, VM::M1, "AssessedAttributeValueSequence" },
+{ 0x0082, 0x0016, 0, VR::LO, VM::M1, "AssessmentSetID" },
+{ 0x0082, 0x0017, 0, VR::SQ, VM::M1, "AssessmentRequesterSequence" },
+{ 0x0082, 0x0018, 0, VR::LO, VM::M1, "SelectorAttributeName" },
+{ 0x0082, 0x0019, 0, VR::LO, VM::M1, "SelectorAttributeKeyword" },
+{ 0x0082, 0x0021, 0, VR::SQ, VM::M1, "AssessmentTypeCodeSequence" },
+{ 0x0082, 0x0022, 0, VR::SQ, VM::M1, "ObservationBasisCodeSequence" },
+{ 0x0082, 0x0023, 0, VR::LO, VM::M1, "AssessmentLabel" },
+{ 0x0082, 0x0032, 0, VR::CS, VM::M1, "ConstraintType" },
+{ 0x0082, 0x0033, 0, VR::UT, VM::M1, "SpecificationSelectionGuidance" },
+{ 0x0082, 0x0034, 0, VR::SQ, VM::M1, "ConstraintValueSequence" },
+{ 0x0082, 0x0035, 0, VR::SQ, VM::M1, "RecommendedDefaultValueSequence" },
+{ 0x0082, 0x0036, 0, VR::CS, VM::M1, "ConstraintViolationSignificance" },
+{ 0x0082, 0x0037, 0, VR::UT, VM::M1, "ConstraintViolationCondition" },
{ 0x0088, 0x0130, 0, VR::SH, VM::M1, "StorageMediaFileSetID" },
{ 0x0088, 0x0140, 0, VR::UI, VM::M1, "StorageMediaFileSetUID" },
{ 0x0088, 0x0200, 0, VR::SQ, VM::M1, "IconImageSequence" },
@@ -3159,7 +3253,7 @@ DictEntry DictContents[] = {
{ 0x2100, 0x0040, 0, VR::DA, VM::M1, "CreationDate" },
{ 0x2100, 0x0050, 0, VR::TM, VM::M1, "CreationTime" },
{ 0x2100, 0x0070, 0, VR::AE, VM::M1, "Originator" },
-{ 0x2100, 0x0140, 1, VR::AE, VM::M1, "DestinationAE" },
+{ 0x2100, 0x0140, 0, VR::AE, VM::M1, "DestinationAE" },
{ 0x2100, 0x0160, 0, VR::SH, VM::M1, "OwnerID" },
{ 0x2100, 0x0170, 0, VR::IS, VM::M1, "NumberOfFilms" },
{ 0x2100, 0x0500, 1, VR::SQ, VM::M1, "ReferencedPrintJobSequencePullStoredPrint" },
@@ -3454,6 +3548,9 @@ DictEntry DictContents[] = {
{ 0x300A, 0x008D, 0, VR::FL, VM::M1, "AverageBeamDosePointDepth" },
{ 0x300A, 0x008E, 0, VR::FL, VM::M1, "AverageBeamDosePointEquivalentDepth" },
{ 0x300A, 0x008F, 0, VR::FL, VM::M1, "AverageBeamDosePointSSD" },
+{ 0x300A, 0x0090, 0, VR::CS, VM::M1, "BeamDoseType" },
+{ 0x300A, 0x0091, 0, VR::DS, VM::M1, "AlternateBeamDose" },
+{ 0x300A, 0x0092, 0, VR::CS, VM::M1, "AlternateBeamDoseType" },
{ 0x300A, 0x00A0, 0, VR::IS, VM::M1, "NumberOfBrachyApplicationSetups" },
{ 0x300A, 0x00A2, 0, VR::DS, VM::M3, "BrachyApplicationSetupDoseSpecificationPoint" },
{ 0x300A, 0x00A4, 0, VR::DS, VM::M1, "BrachyApplicationSetupDose" },
@@ -3556,7 +3653,7 @@ DictEntry DictContents[] = {
{ 0x300A, 0x012C, 0, VR::DS, VM::M3, "IsocenterPosition" },
{ 0x300A, 0x012E, 0, VR::DS, VM::M3, "SurfaceEntryPoint" },
{ 0x300A, 0x0130, 0, VR::DS, VM::M1, "SourceToSurfaceDistance" },
-{ 0x300A, 0x0131, 0, VR::FL, VM::M1, "AverageBeamDosePointSourceToExternalContourSurfaceDistance" },
+{ 0x300A, 0x0131, 0, VR::FL, VM::M1, "AverageBeamDosePointSourceToExternalContourDistance" },
{ 0x300A, 0x0132, 0, VR::FL, VM::M1, "SourceToExternalContourDistance" },
{ 0x300A, 0x0133, 0, VR::FL, VM::M3, "ExternalContourEntryPoint" },
{ 0x300A, 0x0134, 0, VR::DS, VM::M1, "CumulativeMetersetWeight" },
@@ -3568,6 +3665,12 @@ DictEntry DictContents[] = {
{ 0x300A, 0x014A, 0, VR::FL, VM::M1, "GantryPitchAngle" },
{ 0x300A, 0x014C, 0, VR::CS, VM::M1, "GantryPitchRotationDirection" },
{ 0x300A, 0x014E, 0, VR::FL, VM::M1, "GantryPitchAngleTolerance" },
+{ 0x300A, 0x0150, 0, VR::CS, VM::M1, "FixationEye" },
+{ 0x300A, 0x0151, 0, VR::DS, VM::M1, "ChairHeadFramePosition" },
+{ 0x300A, 0x0152, 0, VR::DS, VM::M1, "HeadFixationAngleTolerance" },
+{ 0x300A, 0x0153, 0, VR::DS, VM::M1, "ChairHeadFramePositionTolerance" },
+{ 0x300A, 0x0154, 0, VR::DS, VM::M1, "FixationLightAzimuthalAngleTolerance" },
+{ 0x300A, 0x0155, 0, VR::DS, VM::M1, "FixationLightPolarAngleTolerance" },
{ 0x300A, 0x0180, 0, VR::SQ, VM::M1, "PatientSetupSequence" },
{ 0x300A, 0x0182, 0, VR::IS, VM::M1, "PatientSetupNumber" },
{ 0x300A, 0x0183, 0, VR::LO, VM::M1, "PatientSetupLabel" },
@@ -3675,6 +3778,7 @@ DictEntry DictContents[] = {
{ 0x300A, 0x0304, 0, VR::IS, VM::M1, "RadiationAtomicNumber" },
{ 0x300A, 0x0306, 0, VR::SS, VM::M1, "RadiationChargeState" },
{ 0x300A, 0x0308, 0, VR::CS, VM::M1, "ScanMode" },
+{ 0x300A, 0x0309, 0, VR::CS, VM::M1, "ModulatedScanModeType" },
{ 0x300A, 0x030A, 0, VR::FL, VM::M2, "VirtualSourceAxisDistances" },
{ 0x300A, 0x030C, 0, VR::SQ, VM::M1, "SnoutSequence" },
{ 0x300A, 0x030D, 0, VR::FL, VM::M1, "SnoutPosition" },
@@ -3702,6 +3806,7 @@ DictEntry DictContents[] = {
{ 0x300A, 0x0350, 0, VR::CS, VM::M1, "PatientSupportType" },
{ 0x300A, 0x0352, 0, VR::SH, VM::M1, "PatientSupportID" },
{ 0x300A, 0x0354, 0, VR::LO, VM::M1, "PatientSupportAccessoryCode" },
+{ 0x300A, 0x0355, 0, VR::LO, VM::M1, "TrayAccessoryCode" },
{ 0x300A, 0x0356, 0, VR::FL, VM::M1, "FixationLightAzimuthalAngle" },
{ 0x300A, 0x0358, 0, VR::FL, VM::M1, "FixationLightPolarAngle" },
{ 0x300A, 0x035A, 0, VR::FL, VM::M1, "MetersetRate" },
@@ -3719,8 +3824,11 @@ DictEntry DictContents[] = {
{ 0x300A, 0x0388, 0, VR::FL, VM::M1, "RangeModulatorGatingStopWaterEquivalentThickness" },
{ 0x300A, 0x038A, 0, VR::FL, VM::M1, "IsocenterToRangeModulatorDistance" },
{ 0x300A, 0x0390, 0, VR::SH, VM::M1, "ScanSpotTuneID" },
+{ 0x300A, 0x0391, 0, VR::IS, VM::M1TN, "ScanSpotPrescribedIndices" },
{ 0x300A, 0x0392, 0, VR::IS, VM::M1, "NumberOfScanSpotPositions" },
+{ 0x300A, 0x0393, 0, VR::CS, VM::M1, "ScanSpotReordered" },
{ 0x300A, 0x0394, 0, VR::FL, VM::M1TN, "ScanSpotPositionMap" },
+{ 0x300A, 0x0395, 0, VR::CS, VM::M1, "ScanSpotReorderingAllowed" },
{ 0x300A, 0x0396, 0, VR::FL, VM::M1TN, "ScanSpotMetersetWeights" },
{ 0x300A, 0x0398, 0, VR::FL, VM::M2, "ScanningSpotSize" },
{ 0x300A, 0x039A, 0, VR::IS, VM::M1, "NumberOfPaintings" },
@@ -3755,6 +3863,18 @@ DictEntry DictContents[] = {
{ 0x300A, 0x0451, 0, VR::CS, VM::M1, "DeviceMotionExecutionMode" },
{ 0x300A, 0x0452, 0, VR::CS, VM::M1, "DeviceMotionObservationMode" },
{ 0x300A, 0x0453, 0, VR::SQ, VM::M1, "DeviceMotionParameterCodeSequence" },
+{ 0x300A, 0x0501, 0, VR::FL, VM::M1, "DistalDepthFraction" },
+{ 0x300A, 0x0502, 0, VR::FL, VM::M1, "DistalDepth" },
+{ 0x300A, 0x0503, 0, VR::FL, VM::M2, "NominalRangeModulationFractions" },
+{ 0x300A, 0x0504, 0, VR::FL, VM::M2, "NominalRangeModulatedRegionDepths" },
+{ 0x300A, 0x0505, 0, VR::SQ, VM::M1, "DepthDoseParametersSequence" },
+{ 0x300A, 0x0506, 0, VR::SQ, VM::M1, "DeliveredDepthDoseParametersSequence" },
+{ 0x300A, 0x0507, 0, VR::FL, VM::M1, "DeliveredDistalDepthFraction" },
+{ 0x300A, 0x0508, 0, VR::FL, VM::M1, "DeliveredDistalDepth" },
+{ 0x300A, 0x0509, 0, VR::FL, VM::M2, "DeliveredNominalRangeModulationFractions" },
+{ 0x300A, 0x0510, 0, VR::FL, VM::M2, "DeliveredNominalRangeModulatedRegionDepths" },
+{ 0x300A, 0x0511, 0, VR::CS, VM::M1, "DeliveredReferenceDoseDefinition" },
+{ 0x300A, 0x0512, 0, VR::CS, VM::M1, "ReferenceDoseDefinition" },
{ 0x300C, 0x0002, 0, VR::SQ, VM::M1, "ReferencedRTPlanSequence" },
{ 0x300C, 0x0004, 0, VR::SQ, VM::M1, "ReferencedBeamSequence" },
{ 0x300C, 0x0006, 0, VR::IS, VM::M1, "ReferencedBeamNumber" },
@@ -4770,231 +4890,232 @@ DictEntry DictContents[] = {
{ 0xFFFE, 0xE0DD, 0, VR::XX, VM::M0, "SequenceDelimitationItem" },
};
-unsigned short DictTagHashTable[] = {
- 4097, 4132, 4153, 4174, 4193, 4212, 4231, 4252, 4269, 4284,
- 4297, 4310, 4321, 4334, 4351, 4362, 4373, 4398, 4419, 4440,
- 4457, 4472, 4489, 4502, 4519, 4542, 4559, 4576, 4593, 4606,
- 4619, 4632, 4645, 4674, 4691, 4716, 4735, 4752, 4765, 4786,
- 4797, 4816, 4835, 4854, 4871, 4890, 4905, 4922, 4935, 4958,
- 4983, 5006, 5025, 5038, 5055, 5068, 5087, 5106, 5133, 5154,
- 5179, 5202, 5221, 5238, 5259, 5300, 5345, 5384, 5421, 5456,
- 5483, 5518, 5553, 5590, 5619, 5652, 5675, 5704, 5723, 5748,
- 5773, 5810, 5851, 5880, 5911, 5930, 5961, 5982, 6009, 6038,
- 6057, 6080, 6105, 6130, 6153, 6168, 6185, 6206, 6227, 6248,
- 6267, 6282, 6299, 6314, 6331, 6342, 6361, 6380, 6395, 6408,
- 6425, 6432, 6437, 6460, 6481, 6502, 6523, 6548, 6567, 6590,
- 6613, 6632, 6649, 6662, 6683, 6694, 6707, 6716, 6725, 6746,
- 6759, 6774, 6783, 6796, 6807, 6820, 6829, 6850, 6857, 6874,
- 6885, 6900, 6907, 6924, 6935, 6956, 6965, 6984, 6997, 7008,
- 7015, 7028, 7035, 7052, 7061, 7078, 7087, 7106, 7117, 7136,
- 7141, 7154, 7163, 7168, 7177, 7182, 7191, 7198, 7209, 7218,
- 7223, 7230, 7235, 7240, 7247, 7252, 7257, 7268, 7279, 7286,
- 7293, 7300, 7307, 7310, 7315, 7322, 7329, 7334, 7341, 7344,
- 7347, 7354, 7357, 7374, 7393, 7406, 7417, 7432, 7453, 7472,
- 7483, 7498, 7511, 7528, 7539, 7552, 7561, 7580, 7591, 7610,
- 7625, 7642, 7651, 7660, 7667, 7680, 7691, 7706, 7717, 7734,
- 7745, 7758, 7767, 7780, 7791, 7800, 7811, 7822, 7827, 7836,
- 7839, 7848, 7851, 7860, 7865, 7878, 7889, 7900, 7907, 7914,
- 7917, 7928, 7941, 7952, 7959, 7966, 7975, 7984, 7989, 4096,
- 7994, 7999, 8002, 4096, 8005, 8010, 8015, 8028, 8041, 8048,
- 8063, 8082, 8093, 8106, 8127, 8142, 8159, 8162, 8171, 8180,
- 8195, 8204, 8219, 8234, 8247, 8258, 8269, 8284, 8299, 8312,
- 8323, 8334, 8349, 8356, 8369, 8376, 8387, 8394, 8403, 8412,
- 8419, 8426, 8431, 8444, 8451, 8460, 8469, 8480, 8487, 8494,
- 8499, 8510, 8521, 8528, 8535, 8542, 8547, 8556, 8561, 8572,
- 8579, 8590, 8597, 8604, 4096, 8609, 8612, 8623, 8632, 8639,
- 8644, 8655, 8668, 8685, 8700, 8715, 8732, 8745, 8764, 8781,
- 8790, 8805, 8814, 8831, 8844, 8855, 8870, 8887, 8902, 8911,
- 8920, 8935, 8950, 8965, 8980, 8993, 9004, 9013, 9016, 9031,
- 9040, 9049, 9056, 9077, 9094, 9111, 9122, 9145, 9154, 9177,
- 9198, 9219, 9230, 9243, 9252, 9269, 9280, 9293, 9298, 9317,
- 9330, 9341, 9350, 9369, 9382, 9403, 9418, 9433, 9440, 9455,
- 9460, 9479, 9490, 9505, 9514, 9519, 9524, 9529, 9532, 9547,
- 9550, 9555, 9560, 9565, 9574, 9583, 9592, 9601, 9610, 9615,
- 9622, 9629, 9636, 9643, 9646, 9659, 9666, 9671, 9674, 9687,
- 9690, 9695, 9700, 9705, 9714, 9723, 9732, 9735, 9740, 9745,
- 9748, 9761, 9768, 9773, 9776, 9781, 9786, 9789, 9794, 9801,
- 9804, 9809, 9812, 4096, 9815, 4096, 9818, 9833, 9836, 9841,
- 9844, 9853, 9860, 9863, 9866, 9879, 9882, 9895, 9900, 9923,
- 9936, 9959, 9966, 9989, 10002, 10023, 10034, 10059, 10074, 10101,
-10110, 10139, 10148, 10175, 10188, 10211, 10220, 10241, 10248, 10269,
-10282, 10305, 10312, 10339, 10352, 10379, 10390, 10417, 10428, 10457,
-10468, 10479, 10486, 10495, 10502, 10511, 10520, 10527, 10536, 10545,
-10552, 10561, 10568, 10579, 10586, 10597, 10604, 10613, 10618, 10625,
-10632, 10641, 10656, 10663, 10672, 10681, 10688, 10701, 10706, 10721,
-10728, 10741, 10748, 10755, 10764, 10769, 10774, 10777, 10780, 10785,
-10788, 10793, 10808, 10815, 10826, 10835, 10846, 10851, 10854, 10861,
-10872, 10877, 4096, 10886, 10891, 10894, 10897, 10906, 10915, 10922,
-10927, 10936, 10947, 10954, 10963, 10974, 10981, 10986, 10991, 10994,
-10997, 11004, 11009, 11018, 11027, 11036, 11043, 11048, 11055, 11062,
-11069, 11078, 11087, 4096, 4096, 4096, 11090, 11095, 11100, 11109,
-11116, 11125, 11136, 11145, 11158, 11169, 11178, 11189, 11198, 11203,
-11212, 4096, 11217, 11224, 11231, 11240, 11245, 11258, 11267, 11278,
-11287, 11294, 11303, 11312, 11321, 11326, 11329, 4096, 11332, 11335,
-11340, 4096, 11343, 11348, 11351, 11358, 11365, 11378, 11387, 11394,
-11399, 11404, 11409, 4096, 4096, 11414, 11417, 11424, 11431, 11438,
-11449, 11456, 11461, 11466, 11473, 11480, 11489, 11496, 11507, 11514,
-11517, 11520, 11527, 11538, 11545, 11554, 11563, 11566, 11575, 11582,
-11591, 11598, 11605, 11610, 11617, 11624, 11627, 11630, 11637, 11642,
-11645, 11648, 11651, 11656, 11659, 11662, 11665, 11672, 11677, 11680,
-11683, 11686, 11689, 11692, 11697, 11702, 11707, 11714, 4096, 4096,
-11721, 4096, 11724, 11731, 11738, 11741, 11746, 11749, 11752, 11755,
-11760, 11767, 4096, 4096, 4096, 4096, 4096, 11772, 11775, 4096,
- 4096, 11782, 11785, 11792, 11795, 4096, 11800, 4096, 11805, 4096,
-11810, 4096, 11815, 4096, 11818, 11825, 11832, 11841, 11848, 11853,
-11862, 11867, 11874, 11879, 11886, 11893, 11902, 11907, 11912, 11917,
-11924, 11931, 11938, 11945, 11952, 11959, 11966, 11973, 11980, 11993,
-12004, 12011, 12020, 12023, 12034, 12043, 12052, 12059, 12062, 12065,
-12070, 12075, 12080, 12085, 12088, 12091, 12096, 12099, 12102, 4096,
-12105, 12110, 12113, 12118, 12121, 12126, 12133, 12136, 12139, 4096,
- 4096, 12142, 12145, 4096, 12148, 4096, 12151, 12154, 12157, 12164,
-12171, 12180, 12185, 12192, 12195, 12200, 12205, 12212, 4096, 4096,
-12215, 12220, 4096, 12223, 12226, 4096, 12233, 4096, 12238, 12241,
- 4096, 12244, 4096, 12247, 12252, 4096, 4096, 12255, 4096, 4096,
-12258, 12263, 12266, 4096, 12269, 12274, 12279, 12282, 12285, 12290,
-12297, 12300, 12303, 12306, 12309, 12314, 12319, 12324, 12327, 12332,
-12335, 12346, 12351, 12356, 12363, 12368, 12373, 12376, 12383, 12386,
-12391, 12394, 12401, 12408, 12411, 12418, 12423, 12432, 12435, 12442,
-12445, 12448, 12451, 12454, 12459, 12470, 12475, 12482, 12487, 12490,
-12493, 12498, 12501, 12508, 12515, 4096, 12520, 12523, 12530, 12533,
-12540, 12545, 12552, 12559, 12568, 12571, 12574, 12577, 12582, 12589,
-12592, 12595, 12600, 12607, 4096, 12614, 12617, 12624, 12635, 12640,
-12647, 12650, 12653, 4096, 12658, 12663, 4096, 12668, 4096, 12675,
-12680, 12683, 12690, 12693, 12698, 12701, 12704, 12709, 12712, 12715,
-12718, 12721, 12726, 12729, 12732, 4096, 12735, 12738, 12741, 12744,
-12747, 12750, 12753, 12758, 12761, 12764, 12767, 12770, 12773, 12776,
-12779, 4096, 12782, 4096, 12785, 12788, 12791, 12794, 4096, 12797,
- 4096, 12800, 12805, 12808, 12813, 12816, 4096, 4096, 4096, 4096,
-12821, 4096, 12824, 4096, 12827, 4096, 4096, 12830, 12833, 12836,
-12841, 12844, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
-12849, 12860, 12865, 12874, 12881, 12890, 12899, 12906, 12917, 12924,
-12935, 12942, 12951, 12958, 12963, 12970, 12975, 12984, 12993, 13000,
-13005, 13012, 13019, 13024, 13031, 13038, 13043, 13050, 13057, 13064,
-13071, 13080, 13087, 13092, 13097, 13100, 13103, 13110, 13115, 13120,
- 4096, 4096, 4096, 13123, 4096, 4096, 4096, 4096, 13126, 13131,
-13136, 13139, 13142, 13145, 13148, 13151, 4096, 4096, 13154, 4096,
-13157, 13160, 13163, 13166, 13169, 13172, 4096, 13175, 13178, 13181,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 13186, 4096,
-13189, 13194, 4096, 13199, 13202, 13205, 13210, 4096, 4096, 13213,
- 4096, 13216, 4096, 4096, 13219, 4096, 4096, 13222, 4096, 13225,
- 4096, 4096, 4096, 13228, 13231, 13236, 13241, 13244, 4096, 4096,
-13249, 4096, 13252, 4096, 4096, 4096, 4096, 4096, 13257, 4096,
-13260, 13263, 13268, 13271, 13274, 4096, 4096, 4096, 4096, 13277,
-13282, 13287, 13292, 13303, 13308, 13313, 13318, 13321, 13324, 13327,
-13330, 13333, 4096, 13336, 4096, 13339, 13348, 13351, 13354, 13359,
- 4096, 13362, 4096, 13367, 13370, 13373, 4096, 4096, 4096, 13376,
-13379, 13382, 13385, 13388, 13393, 13398, 13403, 13406, 13411, 4096,
- 4096, 4096, 4096, 4096, 4096, 13414, 13417, 4096, 4096, 13420,
-13423, 13428, 13431, 13434, 4096, 13437, 13440, 13443, 13446, 13449,
-13452, 13455, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
-13458, 13461, 13464, 13467, 4096, 4096, 4096, 4096, 13470, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 13473, 13476, 13479, 13482,
-13485, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 13488, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 13491,
- 4096, 4096, 13494, 4096, 4096, 4096, 13497, 4096, 13502, 4096,
-13507, 4096, 13512, 4096, 13517, 4096, 13524, 4096, 13533, 13538,
-13541, 4096, 13546, 13551, 13554, 4096, 13559, 4096, 13564, 4096,
-13569, 13578, 13581, 13590, 13595, 13600, 13603, 13608, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 13611, 13614, 4096, 13617,
-13620, 13623, 13626, 13629, 4096, 13632, 13635, 13638, 13641, 13644,
-13647, 4096, 13650, 13653, 13656, 13659, 4096, 13662, 13665, 13668,
-13671, 13676, 13681, 4096, 13684, 13691, 13696, 13699, 4096, 4096,
-13702, 4096, 13705, 4096, 4096, 4096, 13708, 13711, 4096, 13714,
-13717, 4096, 13724, 4096, 4096, 4096, 13727, 4096, 13730, 13733,
- 4096, 4096, 13736, 13741, 13744, 13749, 13752, 13757, 13760, 13765,
-13770, 13773, 13776, 4096, 13779, 13784, 13789, 4096, 13792, 4096,
-13795, 4096, 13798, 13809, 13812, 13815, 4096, 4096, 13820, 4096,
- 4096, 4096, 4096, 4096, 13823, 13830, 13835, 4096, 13838, 13841,
-13844, 13849, 4096, 4096, 13856, 4096, 13859, 13862, 4096, 13865,
-13868, 13873, 13878, 13881, 13886, 13889, 4096, 4096, 4096, 4096,
- 4096, 13892, 13895, 13900, 13905, 13908, 13913, 13916, 13921, 13924,
-13929, 13934, 13939, 13942, 4096, 4096, 4096, 13947, 13950, 13953,
-13958, 4096, 13961, 13964, 13969, 13972, 4096, 13977, 13982, 13985,
- 4096, 4096, 4096, 4096, 13990, 13995, 4096, 4096, 4096, 4096,
- 4096, 4096, 14000, 4096, 4096, 4096, 14005, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14008, 4096,
- 4096, 4096, 14013, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14018, 4096, 4096, 4096, 14021, 4096,
+const unsigned short DictTagHashTable[] = {
+ 4097, 4132, 4155, 4176, 4197, 4216, 4235, 4256, 4275, 4290,
+ 4303, 4316, 4327, 4340, 4357, 4368, 4379, 4404, 4427, 4448,
+ 4467, 4482, 4501, 4514, 4533, 4556, 4575, 4594, 4613, 4626,
+ 4643, 4656, 4671, 4700, 4717, 4742, 4763, 4782, 4797, 4818,
+ 4829, 4848, 4867, 4886, 4903, 4924, 4941, 4958, 4971, 4994,
+ 5019, 5042, 5061, 5074, 5091, 5106, 5127, 5148, 5175, 5196,
+ 5221, 5244, 5263, 5280, 5301, 5342, 5387, 5428, 5467, 5502,
+ 5529, 5564, 5599, 5636, 5665, 5698, 5721, 5750, 5769, 5794,
+ 5819, 5856, 5897, 5926, 5957, 5976, 6007, 6028, 6055, 6086,
+ 6107, 6132, 6157, 6184, 6207, 6222, 6239, 6260, 6281, 6302,
+ 6321, 6336, 6353, 6368, 6385, 6396, 6415, 6434, 6449, 6462,
+ 6479, 6486, 6491, 6514, 6535, 6556, 6577, 6602, 6621, 6644,
+ 6667, 6686, 6703, 6716, 6737, 6748, 6761, 6770, 6779, 6800,
+ 6815, 6830, 6841, 6856, 6869, 6884, 6895, 6918, 6925, 6944,
+ 6955, 6972, 6979, 6996, 7007, 7030, 7039, 7058, 7071, 7082,
+ 7089, 7104, 7113, 7132, 7143, 7160, 7169, 7188, 7199, 7218,
+ 7223, 7236, 7247, 7254, 7265, 7270, 7279, 7286, 7297, 7306,
+ 7311, 7318, 7323, 7328, 7335, 7340, 7345, 7356, 7367, 7376,
+ 7385, 7394, 7403, 7408, 7415, 7422, 7429, 7434, 7441, 7444,
+ 7447, 7454, 7457, 7474, 7493, 7506, 7517, 7532, 7553, 7572,
+ 7583, 7598, 7611, 7628, 7639, 7652, 7661, 7680, 7691, 7710,
+ 7725, 7742, 7751, 7760, 7767, 7780, 7791, 7806, 7817, 7834,
+ 7845, 7858, 7867, 7880, 7891, 7900, 7911, 7922, 7927, 7936,
+ 7939, 7948, 7951, 7960, 7965, 7978, 7989, 8000, 8007, 8014,
+ 8017, 8028, 8041, 8052, 8059, 8066, 8075, 8084, 8089, 4096,
+ 8094, 8099, 8102, 4096, 8105, 8110, 8115, 8128, 8141, 8148,
+ 8163, 8182, 8193, 8206, 8227, 8242, 8259, 8262, 8271, 8280,
+ 8295, 8304, 8319, 8336, 8351, 8364, 8377, 8394, 8411, 8426,
+ 8439, 8452, 8467, 8474, 8487, 8494, 8505, 8512, 8521, 8530,
+ 8537, 8544, 8549, 8562, 8569, 8578, 8587, 8600, 8607, 8614,
+ 8619, 8630, 8641, 8650, 8659, 8668, 8675, 8686, 8693, 8706,
+ 8713, 8724, 8731, 8738, 4096, 8743, 8746, 8757, 8766, 8773,
+ 8778, 8789, 8802, 8819, 8834, 8849, 8866, 8879, 8898, 8915,
+ 8924, 8939, 8948, 8965, 8978, 8989, 9004, 9021, 9036, 9045,
+ 9054, 9069, 9084, 9099, 9114, 9127, 9138, 9147, 9150, 9165,
+ 9174, 9183, 9190, 9211, 9228, 9245, 9256, 9279, 9288, 9311,
+ 9332, 9353, 9364, 9377, 9386, 9403, 9414, 9427, 9432, 9451,
+ 9464, 9475, 9484, 9503, 9516, 9537, 9552, 9567, 9574, 9589,
+ 9594, 9613, 9624, 9639, 9648, 9653, 9658, 9663, 9666, 9681,
+ 9684, 9689, 9694, 9699, 9708, 9717, 9726, 9735, 9744, 9749,
+ 9756, 9763, 9770, 9777, 9780, 9793, 9800, 9805, 9808, 9821,
+ 9824, 9831, 9838, 9845, 9856, 9867, 9878, 9881, 9886, 9891,
+ 9894, 9907, 9914, 9919, 9922, 9927, 9932, 9935, 9940, 9947,
+ 9950, 9955, 9958, 4096, 9961, 4096, 9964, 9979, 9982, 9987,
+ 9990, 9999, 10006, 10009, 10012, 10025, 10028, 10041, 10046, 10069,
+10082, 10105, 10112, 10135, 10148, 10169, 10180, 10205, 10220, 10247,
+10256, 10285, 10294, 10321, 10334, 10357, 10366, 10387, 10394, 10417,
+10430, 10453, 10460, 10487, 10500, 10527, 10538, 10565, 10576, 10605,
+10616, 10627, 10634, 10643, 10650, 10659, 10668, 10675, 10684, 10693,
+10700, 10709, 10716, 10727, 10734, 10745, 10752, 10761, 10766, 10773,
+10780, 10789, 10804, 10811, 10820, 10829, 10836, 10849, 10854, 10869,
+10876, 10889, 10896, 10905, 10916, 10921, 10926, 10929, 10932, 10937,
+10940, 10945, 10960, 10969, 10982, 10993, 11006, 11013, 11018, 11025,
+11036, 11041, 4096, 11050, 11055, 11058, 11061, 11070, 11079, 11086,
+11091, 11100, 11111, 11118, 11127, 11140, 11147, 11152, 11159, 11162,
+11165, 11172, 11177, 11186, 11195, 11204, 11211, 11216, 11223, 11230,
+11237, 11246, 11255, 4096, 4096, 4096, 11258, 11263, 11268, 11277,
+11284, 11293, 11304, 11313, 11326, 11337, 11346, 11357, 11366, 11371,
+11380, 4096, 11385, 11392, 11399, 11408, 11413, 11426, 11435, 11446,
+11455, 11462, 11471, 11480, 11489, 11494, 11497, 4096, 11500, 11503,
+11508, 4096, 11511, 11516, 11519, 11526, 11533, 11546, 11555, 11562,
+11567, 11572, 11577, 4096, 4096, 11582, 11585, 11592, 11599, 11606,
+11617, 11624, 11629, 11634, 11641, 11648, 11657, 11664, 11675, 11682,
+11685, 11688, 11695, 11706, 11713, 11722, 11731, 11734, 11743, 11750,
+11759, 11766, 11773, 11778, 11785, 11792, 11795, 11798, 11805, 11810,
+11813, 11816, 11819, 11824, 11827, 11830, 11833, 11840, 11845, 11848,
+11851, 11854, 11857, 11860, 11865, 11870, 11875, 11882, 4096, 4096,
+11889, 4096, 11892, 11899, 11906, 11909, 11914, 11917, 11920, 11923,
+11928, 11935, 4096, 4096, 4096, 4096, 4096, 11940, 11943, 4096,
+ 4096, 11950, 11953, 11960, 11963, 4096, 11968, 4096, 11973, 4096,
+11978, 4096, 11983, 4096, 11986, 11993, 12000, 12009, 12016, 12021,
+12030, 12035, 12042, 12047, 12054, 12061, 12070, 12075, 12080, 12085,
+12092, 12099, 12106, 12113, 12120, 12127, 12134, 12141, 12148, 12161,
+12172, 12179, 12188, 12191, 12202, 12211, 12220, 12227, 12230, 12233,
+12238, 12243, 12248, 12253, 12256, 12259, 12264, 12267, 12270, 4096,
+12273, 12278, 12281, 12286, 12289, 12294, 12301, 12304, 12307, 4096,
+ 4096, 12310, 12313, 4096, 12316, 4096, 12319, 12322, 12325, 12332,
+12339, 12348, 12353, 12360, 12363, 12368, 12373, 12380, 4096, 4096,
+12383, 12388, 4096, 12391, 12394, 4096, 12401, 4096, 12406, 12409,
+ 4096, 12412, 4096, 12415, 12420, 4096, 4096, 12423, 4096, 4096,
+12426, 12431, 12434, 4096, 12437, 12442, 12447, 12450, 12453, 12458,
+12465, 12468, 12471, 12474, 12477, 12482, 12487, 12492, 12495, 12500,
+12503, 12514, 12519, 12524, 12531, 12536, 12541, 12544, 12551, 12554,
+12559, 12562, 12569, 12576, 12579, 12586, 12591, 12600, 12603, 12610,
+12613, 12616, 12619, 12622, 12627, 12638, 12643, 12650, 12655, 12658,
+12663, 12668, 12671, 12678, 12687, 12692, 12695, 12698, 12705, 12708,
+12715, 12720, 12727, 12734, 12743, 12746, 12749, 12752, 12757, 12764,
+12767, 12770, 12775, 12782, 4096, 12789, 12792, 12799, 12810, 12815,
+12822, 12825, 12828, 4096, 12833, 12838, 12843, 12846, 4096, 12853,
+12858, 12861, 12868, 12871, 12876, 12879, 12882, 12887, 12890, 12893,
+12896, 12899, 12904, 12907, 12910, 4096, 12913, 12916, 12919, 12922,
+12925, 12928, 12931, 12936, 12939, 12944, 12947, 12950, 12953, 12956,
+12959, 4096, 12962, 4096, 12965, 12968, 12971, 12974, 4096, 12977,
+ 4096, 12980, 12985, 12988, 12993, 12996, 4096, 4096, 4096, 4096,
+13001, 4096, 13004, 4096, 13007, 4096, 4096, 13010, 13013, 13016,
+13021, 13024, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+13029, 13040, 13045, 13054, 13061, 13070, 13079, 13086, 13097, 13104,
+13115, 13122, 13131, 13138, 13143, 13150, 13157, 13166, 13175, 13182,
+13187, 13194, 13201, 13206, 13213, 13220, 13225, 13232, 13239, 13246,
+13253, 13262, 13269, 13274, 13279, 13282, 13285, 13292, 13297, 13302,
+ 4096, 4096, 4096, 13305, 4096, 4096, 4096, 4096, 13308, 13313,
+13318, 13321, 13324, 13327, 13330, 13333, 4096, 4096, 13336, 4096,
+13339, 13342, 13345, 13348, 13351, 13354, 4096, 13357, 13360, 13363,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 13368, 4096,
+13371, 13376, 4096, 13381, 13384, 13387, 13392, 4096, 4096, 13395,
+ 4096, 13398, 4096, 4096, 13401, 4096, 13404, 13407, 13412, 13415,
+13420, 4096, 13423, 13426, 13431, 13438, 13445, 13448, 13455, 13458,
+13461, 13466, 13469, 4096, 4096, 4096, 4096, 4096, 13474, 4096,
+13477, 13480, 13485, 13488, 13491, 4096, 4096, 4096, 4096, 13494,
+13499, 13504, 13509, 13520, 13525, 13530, 13535, 13538, 13541, 13544,
+13547, 13550, 4096, 13553, 4096, 13556, 13565, 13568, 13571, 13576,
+ 4096, 13579, 4096, 13584, 13587, 13590, 4096, 4096, 4096, 13593,
+13596, 13599, 13604, 13609, 13616, 13623, 13628, 13631, 13636, 4096,
+ 4096, 4096, 4096, 4096, 4096, 13639, 13642, 4096, 4096, 13645,
+13648, 13653, 13656, 13659, 4096, 13662, 13665, 13668, 13671, 13674,
+13677, 13680, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+13683, 13686, 13689, 13692, 4096, 4096, 4096, 4096, 13695, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 13698, 13701, 13704, 13707,
+13710, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 13713, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 13716,
+ 4096, 4096, 13719, 4096, 4096, 4096, 13722, 4096, 13727, 4096,
+13732, 4096, 13737, 4096, 13742, 4096, 13749, 4096, 13758, 13763,
+13766, 4096, 13771, 13776, 13779, 4096, 13784, 4096, 13789, 4096,
+13794, 13803, 13806, 13815, 13820, 13825, 13828, 13833, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 13836, 13839, 4096, 13842,
+13845, 13848, 13851, 13854, 4096, 13857, 13860, 13863, 13866, 13869,
+13872, 4096, 13875, 13878, 13881, 13884, 4096, 13887, 13890, 13893,
+13896, 13901, 13906, 4096, 13909, 13916, 13921, 13924, 4096, 4096,
+13927, 4096, 13930, 4096, 4096, 4096, 13933, 13936, 4096, 13939,
+13942, 4096, 13949, 4096, 4096, 4096, 13952, 4096, 13955, 13958,
+ 4096, 4096, 13961, 13966, 13969, 13974, 13977, 13982, 13985, 13990,
+13995, 13998, 14001, 4096, 14004, 14009, 14014, 4096, 14017, 4096,
+14020, 4096, 14023, 14034, 14037, 14040, 4096, 4096, 14045, 4096,
+ 4096, 4096, 4096, 4096, 14048, 14055, 14060, 4096, 14063, 14066,
+14069, 14074, 4096, 4096, 14081, 4096, 14084, 14087, 4096, 14090,
+14093, 14098, 14103, 14106, 14111, 14114, 4096, 4096, 4096, 4096,
+ 4096, 14117, 14120, 14125, 14130, 14133, 14138, 14141, 14146, 14149,
+14154, 14159, 14164, 14167, 4096, 4096, 4096, 14172, 14175, 14178,
+14183, 4096, 14186, 14189, 14194, 14197, 4096, 14202, 14207, 14210,
+ 4096, 4096, 4096, 4096, 14215, 14220, 4096, 4096, 4096, 4096,
+ 4096, 4096, 14225, 4096, 4096, 4096, 14230, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14233, 4096,
+ 4096, 4096, 14238, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 14243, 4096, 4096, 4096, 14246, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14024, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14027, 4096, 4096,
- 4096, 14030, 4096, 4096, 4096, 14033, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 14036, 4096, 4096, 4096, 14039, 4096, 4096,
+ 4096, 4096, 4096, 4096, 14249, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14252, 4096, 4096,
+ 4096, 14255, 4096, 4096, 14258, 14261, 14264, 14267, 4096, 4096,
+ 4096, 4096, 4096, 14270, 14273, 14276, 14279, 14282, 14287, 14290,
+14293, 14296, 4096, 14299, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 14302, 4096, 4096, 14305, 14308, 4096, 14311,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14314,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14317, 14322, 4096, 4096,
+ 4096, 4096, 4096, 4096, 14327, 14330, 4096, 14333, 4096, 14336,
+14339, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+14342, 4096, 4096, 14345, 14348, 4096, 14351, 14354, 14357, 14360,
+14365, 4096, 4096, 4096, 4096, 4096, 14368, 4096, 14371, 14374,
+14377, 14380, 14385, 14388, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 14391, 14394, 14399, 14404, 14407, 14410, 14415, 14418,
+14423, 14428, 14431, 4096, 14436, 14439, 14442, 14445, 14448, 14453,
+14458, 14461, 14466, 14469, 14472, 14475, 14478, 14481, 14484, 4096,
+ 4096, 4096, 4096, 4096, 14487, 14490, 14493, 14498, 14501, 4096,
+ 4096, 14504, 14507, 14512, 14515, 14518, 14521, 4096, 4096, 4096,
+14524, 14527, 4096, 14532, 14537, 14540, 14545, 14550, 14555, 14558,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14563, 14566, 14569, 14572,
+14575, 14578, 14581, 14584, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 14042, 4096, 4096, 14045, 14048, 4096, 14051,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14054,
- 4096, 4096, 4096, 4096, 4096, 4096, 14057, 14062, 4096, 4096,
- 4096, 4096, 4096, 4096, 14067, 14070, 4096, 14073, 4096, 14076,
-14079, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
-14082, 4096, 4096, 14085, 14088, 4096, 14091, 14094, 14097, 14100,
-14105, 4096, 4096, 4096, 4096, 4096, 14108, 4096, 14111, 14114,
-14117, 14120, 14125, 14128, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 14131, 14134, 14139, 14144, 14147, 14150, 14155, 14158,
-14163, 14168, 14171, 4096, 14176, 14179, 14182, 14185, 14188, 14193,
-14198, 14201, 14206, 14209, 14212, 14215, 14218, 14221, 14224, 4096,
- 4096, 4096, 4096, 4096, 14227, 14230, 14233, 14238, 14241, 4096,
- 4096, 14244, 14247, 14252, 14255, 14258, 14261, 4096, 4096, 4096,
-14264, 14267, 4096, 14272, 14277, 14280, 14285, 14290, 14295, 14298,
- 4096, 4096, 4096, 4096, 4096, 4096, 14303, 14306, 14309, 14312,
-14315, 14318, 14321, 14324, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14587, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 14327, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14590, 14593, 4096, 14596,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 14330, 14333, 4096, 14336,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14599, 14604, 4096, 4096,
+14607, 14610, 14613, 14616, 14619, 4096, 14624, 14627, 4096, 4096,
+ 4096, 4096, 14630, 14635, 14640, 4096, 14645, 14648, 14653, 14656,
+14659, 14662, 14665, 14668, 4096, 4096, 4096, 4096, 14671, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 14339, 14344, 4096, 4096,
-14347, 14350, 14353, 14356, 14359, 4096, 14364, 14367, 4096, 4096,
- 4096, 4096, 14370, 14375, 14380, 4096, 14385, 14388, 14393, 14396,
-14399, 14402, 14405, 14408, 4096, 4096, 4096, 4096, 14411, 4096,
+ 4096, 4096, 4096, 4096, 14674, 14677, 14680, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14683, 4096, 14686, 4096,
+14691, 14696, 14699, 14702, 14705, 4096, 14710, 14713, 14718, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 14721, 14726, 14729, 4096,
+14732, 14735, 14738, 14741, 14744, 14749, 4096, 4096, 4096, 4096,
+ 4096, 4096, 14754, 4096, 4096, 14759, 14762, 14765, 14770, 14775,
+14780, 14783, 4096, 14786, 4096, 4096, 4096, 4096, 14789, 14792,
+ 4096, 14795, 14800, 14805, 14810, 14813, 14818, 14821, 14828, 14831,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14414, 14417, 14420, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 14423, 4096, 14426, 4096,
-14431, 14436, 14439, 14442, 14445, 4096, 14450, 14453, 14458, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 14461, 14466, 14469, 4096,
-14472, 14475, 14478, 14481, 14484, 14489, 4096, 4096, 4096, 4096,
- 4096, 4096, 14494, 4096, 4096, 14499, 14502, 14505, 14510, 14515,
-14520, 14523, 4096, 14526, 4096, 4096, 4096, 4096, 14529, 14532,
- 4096, 14535, 14540, 14545, 14550, 14553, 14558, 14561, 14568, 14571,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 14836, 4096, 14841, 4096, 14846, 4096,
+14851, 4096, 14856, 4096, 14861, 4096, 14866, 4096, 14871, 4096,
+14876, 14881, 14886, 4096, 14891, 4096, 14896, 4096, 14901, 4096,
+14906, 4096, 14911, 4096, 14916, 4096, 4096, 14921, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14576, 4096, 14581, 4096, 14586, 4096,
-14591, 4096, 14596, 4096, 14601, 4096, 14606, 4096, 14611, 4096,
-14616, 14621, 14626, 4096, 14631, 4096, 14636, 4096, 14641, 4096,
-14646, 4096, 14651, 4096, 14656, 4096, 4096, 14661, 4096, 4096,
+ 4096, 4096, 14924, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 14664, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 14927, 4096, 14932, 14935, 14938, 14941,
+14944, 14947, 14950, 14953, 14956, 14959, 14962, 4096, 4096, 4096,
+14965, 14968, 4096, 4096, 4096, 4096, 14971, 4096, 4096, 4096,
+14974, 14977, 4096, 14980, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14667, 4096, 14672, 14675, 14678, 14681,
-14684, 14687, 14690, 14693, 14696, 14699, 14702, 4096, 4096, 4096,
-14705, 14708, 4096, 4096, 4096, 4096, 14711, 4096, 4096, 4096,
-14714, 14717, 4096, 14720, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 14983, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 14723, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14986, 14989,
+14992, 14995, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 14998, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14726, 14729,
-14732, 14735, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14738, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 15001, 4096, 15004, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 14741, 4096, 14744, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5002,8 +5123,8 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+15007, 15010, 15013, 4096, 15016, 4096, 15019, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
-14747, 14750, 14753, 4096, 14756, 4096, 14759, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5016,30 +5137,30 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 15022, 4096, 15025, 15032, 15035, 15042, 15045, 15052,
+15055, 15062, 15065, 15074, 15077, 15086, 15089, 15096, 15099, 15106,
+15109, 15116, 15119, 15126, 15129, 15136, 15139, 15146, 15149, 15156,
+15159, 15166, 15169, 15178, 15181, 15190, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 14762, 4096, 14765, 14772, 14775, 14782, 14785, 14792,
-14795, 14802, 14805, 14814, 14817, 14826, 14829, 14836, 14839, 14846,
-14849, 14856, 14859, 14866, 14869, 14876, 14879, 14886, 14889, 14896,
-14899, 14906, 14909, 14918, 14921, 14930, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 15193, 4096, 15196, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 14933, 4096, 14936, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 15199, 4096, 15202, 4096, 15205, 15208,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14939, 4096, 14942, 4096, 14945, 14948,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 15211, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 15214, 15217, 4096, 15220, 15223, 15226, 15229, 15232,
+ 4096, 15235, 4096, 15238, 15241, 15244, 15247, 15250, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 14951, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 14954, 14957, 4096, 14960, 14963, 14966, 14969, 14972,
- 4096, 14975, 4096, 14978, 14981, 14984, 14987, 14990, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5063,8 +5184,8 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 15253, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 14993, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5129,16 +5250,16 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15256,
+ 4096, 4096, 4096, 4096, 4096, 4096, 15259, 15262, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 14996,
- 4096, 4096, 4096, 4096, 4096, 4096, 14999, 15002, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 15265, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15268,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15271, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 15005, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15008,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15011, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15274, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15014, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5147,13 +5268,13 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 15277, 4096, 4096, 15280, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15283, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 15017, 4096, 4096, 15020, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15023, 4096,
+ 4096, 4096, 4096, 4096, 15286, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 15026, 4096, 4096, 4096, 4096, 4096,
+15289, 15292, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
-15029, 15032, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5163,13 +5284,12 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 15295, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 15035, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15298,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 15038,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
-15041, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
+15301, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
@@ -5181,2746 +5301,2800 @@ unsigned short DictTagHashTable[] = {
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
4096, 4096, 4096, 4096, 4096, 4096, 0, 17, 2, 2,
- 34, 8, 122, 4169, 223, 16, 990, 37457, 1229, 32,
- 1369, 34, 1489, 36, 1829, 50, 2020, 4097, 2263, 70,
- 2839, 114, 3119, 162, 3782, 16384, 3795, 268, 4751, 65530,
- 4752, 65532, 10, 3, 3, 121, 4168, 245, 4176, 989,
-37456, 1490, 37, 1830, 51, 2934, 4148, 3046, 1025, 3280,
- 196, 3462, 200, 10, 0, 0, 278, 16, 992, 37459,
- 1230, 34, 1367, 32, 2022, 4099, 2262, 68, 2838, 112,
- 3047, 1026, 3118, 160, 9, 1, 1, 991, 37458, 1368,
- 33, 1851, 4208, 2021, 4098, 2935, 4150, 3048, 1027, 3281,
- 198, 3463, 202, 9, 994, 37461, 1231, 36, 1487, 32,
- 2024, 4101, 2261, 66, 2420, 80, 2841, 118, 3049, 1028,
- 3791, 264, 9, 993, 37460, 1409, 4198, 1488, 33, 2023,
- 4100, 2421, 81, 2932, 4144, 3278, 192, 3464, 204, 3792,
- 265, 10, 996, 37463, 1232, 38, 1408, 4197, 1831, 52,
- 2026, 4103, 2260, 64, 2422, 82, 2840, 116, 2987, 112,
- 3793, 266, 8, 995, 37462, 1832, 53, 2025, 4102, 2423,
- 83, 2933, 4146, 3279, 194, 3465, 206, 3794, 267, 7,
- 481, 16, 998, 37465, 1866, 48, 2028, 4105, 2843, 122,
- 3003, 112, 3810, 16384, 6, 31, 1, 120, 4160, 565,
- 4176, 997, 37464, 2027, 4104, 3455, 192, 6, 482, 18,
- 1000, 37467, 1370, 40, 1867, 50, 2842, 120, 3457, 195,
- 5, 483, 19, 999, 37466, 2029, 4106, 3336, 192, 3456,
- 194, 6, 484, 20, 1002, 37469, 1491, 40, 2845, 126,
- 3459, 197, 3787, 256, 8, 32, 5, 485, 21, 1001,
-37468, 2846, 127, 2936, 4152, 3282, 200, 3458, 196, 3788,
- 257, 5, 33, 6, 1004, 37471, 2844, 124, 3461, 199,
- 3789, 258, 5, 1003, 37470, 2937, 4154, 3460, 198, 3764,
- 192, 3790, 259, 12, 5, 18, 41, 24, 564, 4169,
- 988, 37441, 1233, 48, 1373, 50, 1494, 52, 2031, 4113,
- 2677, 96, 2831, 98, 2924, 4133, 3475, 217, 10, 6,
- 19, 244, 4160, 563, 4168, 987, 37440, 1258, 4208, 1495,
- 53, 2030, 4112, 2457, 4100, 2923, 4132, 3474, 216, 10,
- 4, 16, 42, 26, 1234, 50, 1371, 48, 1496, 54,
- 2678, 98, 2830, 96, 2926, 4135, 3094, 128, 3477, 219,
- 8, 43, 27, 1372, 49, 1497, 55, 1849, 4192, 2032,
- 4114, 2458, 4102, 2925, 4134, 3476, 218, 7, 7, 22,
- 1375, 54, 2265, 82, 2455, 4097, 2833, 102, 3479, 221,
- 3802, 280, 8, 8, 23, 315, 4160, 1235, 53, 1376,
- 55, 2454, 4096, 2921, 4128, 3478, 220, 3803, 281, 6,
- 1492, 50, 2264, 80, 2679, 102, 2832, 100, 2986, 96,
- 3804, 282, 8, 1236, 55, 1374, 53, 1493, 51, 1850,
- 4196, 2456, 4098, 2680, 103, 2922, 4130, 3480, 222, 11,
- 35, 16, 556, 4161, 1595, 48, 1864, 32, 2094, 37393,
- 2681, 104, 2835, 106, 2931, 4141, 3002, 96, 3467, 209,
- 3799, 276, 8, 123, 4176, 555, 4160, 1596, 49, 1865,
- 33, 2093, 37392, 2930, 4140, 3466, 208, 3800, 277, 8,
- 9, 24, 36, 18, 558, 4163, 1377, 56, 1597, 50,
- 1887, 32, 2834, 104, 3469, 211, 8, 37, 19, 124,
- 4178, 557, 4162, 1378, 57, 2095, 37394, 3337, 208, 3468,
- 210, 3801, 279, 6, 38, 20, 560, 4165, 1498, 56,
- 1598, 52, 2837, 110, 3471, 213, 6, 39, 21, 559,
- 4164, 1499, 57, 2927, 4136, 3470, 212, 3796, 273, 6,
- 40, 22, 562, 4167, 2836, 108, 2929, 4139, 3473, 215,
- 3797, 274, 6, 561, 4166, 2096, 37398, 2928, 4138, 3472,
- 214, 3765, 208, 3798, 275, 14, 228, 48, 304, 52,
- 505, 56, 588, 4217, 1257, 4161, 1308, 37449, 1339, 2,
- 1588, 8, 1828, 18, 1886, 26, 2672, 80, 2827, 82,
- 3082, 162, 3490, 233, 8, 506, 57, 587, 4216, 1256,
- 4160, 1307, 37448, 1340, 3, 1589, 9, 2673, 81, 3489,
- 232, 12, 50, 42, 229, 50, 281, 48, 507, 58,
- 1590, 10, 1847, 4177, 1859, 26, 2269, 100, 2674, 82,
- 2826, 80, 3080, 160, 3492, 235, 9, 282, 49, 1338,
- 1, 1402, 4160, 1846, 4176, 1860, 27, 2675, 83, 2985,
- 85, 3081, 161, 3491, 234, 8, 302, 48, 1343, 6,
- 1861, 28, 2267, 98, 2428, 112, 2563, 66, 2829, 86,
- 3494, 237, 6, 1344, 7, 1862, 29, 2268, 99, 2429,
- 113, 2564, 67, 3493, 236, 10, 303, 50, 1341, 4,
- 1848, 4181, 1863, 30, 2266, 96, 2430, 114, 2561, 64,
- 2828, 84, 3083, 164, 3496, 239, 5, 1342, 5, 1403,
- 4164, 2431, 115, 2562, 65, 3495, 238, 9, 44, 32,
- 497, 48, 580, 4209, 1303, 37441, 1347, 10, 1671, 4161,
- 1855, 16, 3001, 80, 3482, 225, 9, 45, 33, 125,
- 4192, 498, 49, 579, 4208, 1348, 11, 1670, 4160, 1856,
- 17, 2097, 37408, 3481, 224, 9, 46, 34, 499, 50,
- 582, 4211, 1345, 8, 1583, 2, 1885, 16, 2676, 90,
- 3084, 168, 3484, 227, 8, 47, 35, 126, 4194, 500,
- 51, 581, 4210, 1346, 9, 1584, 3, 3338, 224, 3483,
- 226, 9, 48, 36, 501, 52, 584, 4213, 1304, 37445,
- 1351, 14, 1585, 4, 1857, 20, 2099, 37413, 3486, 229,
- 7, 49, 37, 502, 53, 583, 4212, 1217, 13, 1586,
- 5, 2098, 37412, 3485, 228, 8, 503, 54, 586, 4215,
- 1218, 14, 1306, 37447, 1349, 12, 1587, 6, 1858, 22,
- 3488, 231, 6, 504, 55, 585, 4214, 1305, 37446, 1350,
- 13, 3487, 230, 3766, 224, 11, 224, 32, 299, 36,
- 494, 40, 575, 4201, 1219, 16, 1354, 18, 1405, 4179,
- 1854, 8, 2274, 118, 2669, 64, 3505, 249, 12, 225,
- 33, 246, 4192, 300, 37, 495, 41, 574, 4200, 1005,
-37472, 1220, 17, 1355, 19, 2275, 119, 2670, 65, 2915,
- 4100, 3504, 248, 11, 226, 34, 279, 32, 496, 42,
- 1221, 18, 1352, 16, 1485, 22, 1845, 4161, 2272, 116,
- 2671, 66, 2825, 64, 3507, 251, 9, 280, 33, 576,
- 4202, 1222, 19, 1353, 17, 1404, 4176, 1844, 4160, 2273,
- 117, 2916, 4102, 3506, 250, 6, 227, 36, 1223, 20,
- 1358, 22, 1482, 16, 2424, 96, 3095, 166, 8, 577,
- 4204, 1224, 21, 1359, 23, 1483, 17, 2425, 97, 2913,
- 4096, 3096, 167, 3508, 252, 6, 1225, 22, 1356, 20,
- 1484, 18, 2270, 112, 2426, 98, 2984, 64, 9, 298,
- 35, 578, 4206, 1226, 23, 1357, 21, 1406, 4180, 2271,
- 113, 2427, 99, 2914, 4098, 3509, 254, 9, 51, 48,
- 486, 32, 567, 4193, 1227, 24, 1310, 37457, 1362, 26,
- 1591, 16, 1673, 4177, 1826, 10, 13, 52, 49, 127,
- 4208, 487, 33, 566, 4192, 1228, 25, 1309, 37456, 1363,
- 27, 1592, 17, 1672, 4176, 2919, 4108, 3340, 242, 3497,
- 240, 3770, 246, 10, 53, 50, 488, 34, 569, 4195,
- 1312, 37459, 1360, 24, 1407, 4185, 1593, 18, 1675, 4179,
- 3097, 168, 3499, 243, 12, 54, 51, 128, 4210, 489,
- 35, 568, 4194, 1311, 37458, 1361, 25, 1674, 4178, 2920,
- 4110, 3098, 169, 3339, 240, 3498, 242, 3769, 244, 11,
- 55, 52, 301, 40, 490, 36, 571, 4197, 1314, 37461,
- 1366, 30, 1486, 24, 1594, 20, 1677, 4181, 1853, 4,
- 3501, 245, 9, 56, 53, 491, 37, 570, 4196, 1313,
-37460, 1676, 4180, 2917, 4104, 3342, 246, 3500, 244, 3768,
- 242, 8, 492, 38, 573, 4199, 1316, 37463, 1364, 28,
- 1749, 24976, 1827, 12, 1883, 4, 3503, 247, 10, 493,
- 39, 572, 4198, 1315, 37462, 1365, 29, 1678, 4182, 1884,
- 5, 2918, 4106, 3341, 244, 3502, 246, 3767, 240, 20,
- 240, 4112, 465, 20752, 547, 4120, 1255, 4128, 1301, 37416,
- 1521, 101, 1610, 105, 1841, 4146, 1921, 1, 2385, 19,
- 2406, 21, 2544, 39, 3059, 0, 3264, 132, 3434, 136,
- 3905, 260, 3933, 262, 4118, 276, 4168, 272, 4195, 274,
- 22, 231, 80, 311, 84, 466, 20753, 548, 4121, 1239,
- 96, 1520, 100, 1609, 104, 1842, 4147, 2238, 4, 2333,
- 8, 2360, 16, 2384, 18, 2405, 20, 2543, 38, 2819,
- 50, 2982, 54, 3060, 1, 3134, 130, 3265, 133, 3435,
- 137, 3906, 261, 3982, 259, 19, 286, 81, 467, 20754,
- 549, 4122, 1523, 103, 1839, 4144, 1923, 3, 2239, 7,
- 2362, 19, 2383, 17, 2408, 23, 2542, 37, 3061, 2,
- 3266, 134, 3436, 138, 3907, 262, 3931, 260, 4144, 276,
- 4169, 274, 4194, 272, 18, 285, 80, 312, 86, 468,
-20755, 550, 4123, 1240, 98, 1522, 102, 1840, 4145, 1922,
- 2, 2361, 18, 2407, 22, 2541, 36, 2818, 48, 2981,
- 52, 3062, 3, 3133, 128, 3437, 139, 3932, 261, 3956,
- 259, 17, 313, 4112, 469, 20756, 975, 37396, 1517, 97,
- 1925, 5, 2235, 1, 2364, 21, 2402, 17, 2540, 35,
- 3063, 4, 3262, 128, 3438, 140, 3957, 260, 3985, 262,
- 4116, 272, 4143, 274, 4170, 276, 13, 212, 37381, 309,
- 80, 470, 20757, 1516, 96, 1924, 4, 2363, 20, 2387,
- 22, 2401, 16, 2980, 50, 3064, 5, 3439, 141, 3930,
- 259, 3958, 261, 17, 213, 37382, 471, 20758, 1394, 4132,
- 1519, 99, 1843, 4148, 1927, 7, 2237, 3, 2366, 23,
- 2404, 19, 2539, 33, 3263, 130, 3440, 142, 3959, 262,
- 3983, 260, 4117, 274, 4142, 272, 4196, 276, 17, 214,
-37383, 310, 82, 472, 20759, 976, 37399, 1395, 4133, 1518,
- 98, 1926, 6, 2236, 2, 2365, 22, 2386, 20, 2403,
- 18, 2538, 32, 2820, 52, 2979, 48, 3441, 143, 3904,
- 259, 3984, 261, 18, 58, 65, 114, 4096, 215, 37384,
- 473, 20760, 541, 4112, 977, 37400, 1604, 97, 1929, 9,
- 2328, 1, 2368, 25, 2552, 47, 3331, 130, 3430, 128,
- 4009, 260, 4037, 262, 4222, 276, 4272, 272, 4299, 274,
- 14, 57, 64, 216, 37385, 474, 20761, 510, 80, 542,
- 4113, 978, 37401, 1299, 37409, 1603, 96, 1928, 8, 2367,
- 24, 2551, 46, 2822, 58, 4010, 261, 4086, 259, 16,
- 475, 20762, 543, 4114, 1300, 37410, 1396, 4136, 1606, 99,
- 1931, 11, 2330, 3, 2370, 27, 2550, 45, 3330, 128,
- 3431, 130, 4011, 262, 4035, 260, 4248, 276, 4273, 274,
- 4298, 272, 11, 59, 66, 476, 20763, 1397, 4137, 1605,
- 98, 1930, 10, 2329, 2, 2369, 26, 2549, 44, 2821,
- 56, 4036, 261, 4060, 259, 14, 477, 20764, 544, 4116,
- 1525, 105, 1607, 101, 2241, 9, 2372, 29, 2548, 43,
- 3267, 136, 3432, 132, 4061, 260, 4089, 262, 4220, 272,
- 4247, 274, 4274, 276, 9, 478, 20765, 1524, 104, 2240,
- 8, 2371, 28, 2409, 24, 2547, 42, 2824, 62, 4034,
- 259, 4062, 261, 12, 479, 20766, 545, 4118, 2243, 11,
- 2332, 7, 2546, 41, 3433, 134, 3761, 128, 4063, 262,
- 4087, 260, 4221, 274, 4246, 272, 4300, 276, 12, 363,
-12441, 480, 20767, 546, 4119, 1608, 102, 2242, 10, 2331,
- 6, 2373, 30, 2545, 40, 2823, 60, 2983, 56, 4008,
- 259, 4088, 261, 18, 236, 4096, 307, 69, 449, 20736,
- 540, 4104, 974, 37376, 1302, 37432, 1531, 117, 1933, 17,
- 2233, 19, 2377, 3, 2559, 55, 2665, 33, 3065, 0,
- 3910, 276, 3960, 272, 3987, 274, 4113, 260, 4141, 262,
- 20, 66, 88, 230, 64, 237, 4097, 284, 66, 306,
- 68, 450, 20737, 1241, 112, 1398, 4147, 1530, 116, 1932,
- 16, 2171, 41626, 2232, 18, 2252, 22, 2376, 2, 2558,
- 54, 2664, 32, 2814, 34, 2998, 40, 4114, 261, 4190,
- 259, 14, 238, 4098, 451, 20738, 1533, 119, 1837, 4128,
- 2231, 17, 2251, 21, 2375, 1, 2557, 53, 2667, 35,
- 3936, 276, 3961, 274, 3986, 272, 4115, 262, 4139, 260,
- 15, 283, 64, 308, 70, 452, 20739, 1532, 118, 1838,
- 4129, 1934, 18, 2230, 16, 2250, 20, 2556, 52, 2666,
- 34, 2813, 32, 2999, 42, 3135, 144, 4140, 261, 4164,
- 259, 9, 453, 20740, 1527, 113, 2245, 17, 2380, 7,
- 3908, 272, 3935, 274, 3962, 276, 4165, 260, 4193, 262,
- 15, 217, 37397, 239, 4101, 454, 20741, 1400, 4151, 1526,
- 112, 1806, 37429, 2244, 16, 2249, 18, 2359, 4, 2379,
- 6, 2555, 50, 2668, 36, 2816, 38, 4138, 259, 4166,
- 261, 10, 362, 12416, 455, 20742, 1529, 115, 2247, 19,
- 2554, 49, 3909, 274, 3934, 272, 3988, 276, 4167, 262,
- 4191, 260, 13, 305, 66, 456, 20743, 1399, 4149, 1528,
- 114, 2234, 20, 2246, 18, 2378, 4, 2553, 48, 2815,
- 36, 2978, 32, 3000, 46, 4112, 259, 4192, 261, 14,
- 61, 81, 115, 4112, 457, 20744, 533, 4096, 754, 20740,
- 1612, 113, 1872, 97, 2335, 17, 3333, 146, 4014, 276,
- 4064, 272, 4091, 274, 4217, 260, 4245, 262, 9, 60,
- 80, 458, 20745, 508, 64, 1611, 112, 1871, 96, 2334,
- 16, 2995, 32, 4218, 261, 4294, 259, 11, 63, 83,
- 459, 20746, 534, 4098, 2337, 19, 2382, 9, 3332, 144,
- 4040, 276, 4065, 274, 4090, 272, 4219, 262, 4243, 260,
- 12, 62, 82, 460, 20747, 509, 66, 535, 4099, 1401,
- 4153, 1873, 98, 2168, 41616, 2336, 18, 2381, 8, 2817,
- 40, 4244, 261, 4268, 259, 12, 461, 20748, 536, 4100,
- 752, 20736, 1535, 121, 2170, 41623, 2248, 25, 2339, 21,
- 4012, 272, 4039, 274, 4066, 276, 4269, 260, 4297, 262,
- 11, 64, 84, 462, 20749, 537, 4101, 753, 20737, 1534,
- 120, 1874, 100, 2169, 41622, 2338, 20, 2996, 36, 4242,
- 259, 4270, 261, 7, 463, 20750, 538, 4102, 4013, 274,
- 4038, 272, 4092, 276, 4271, 262, 4295, 260, 8, 65,
- 86, 464, 20751, 539, 4103, 2253, 24, 2560, 56, 2997,
- 38, 4216, 259, 4296, 261, 10, 243, 4144, 1249, 4096,
- 1503, 69, 2033, 4192, 2395, 51, 2491, 3, 2508, 5,
- 2660, 17, 2948, 4180, 3269, 164, 10, 71, 104, 292,
- 114, 982, 37425, 1250, 4097, 1380, 66, 1502, 68, 1935,
- 32, 2490, 2, 2659, 16, 2811, 18, 10, 291, 113,
- 983, 37426, 1251, 4098, 1379, 65, 1835, 4112, 2394, 49,
- 2489, 1, 2509, 7, 2949, 4182, 3270, 166, 9, 1252,
- 4099, 1504, 70, 1836, 4113, 2393, 48, 2417, 54, 2517,
- 4, 2661, 18, 2810, 16, 2950, 4183, 7, 984, 37428,
- 1253, 4100, 2414, 49, 2516, 3, 2663, 21, 2946, 4176,
- 3268, 160, 8, 1254, 4101, 1388, 4103, 1500, 64, 2397,
- 54, 2413, 48, 2494, 6, 2515, 2, 2662, 20, 7,
- 985, 37430, 1937, 39, 2416, 51, 2493, 5, 2507, 3,
- 2514, 1, 2947, 4178, 8, 1501, 66, 1936, 38, 2396,
- 52, 2415, 50, 2492, 4, 2506, 2, 2812, 20, 2977,
- 16, 5, 68, 97, 513, 113, 554, 4144, 2498, 11,
- 3442, 160, 9, 67, 96, 512, 112, 986, 37433, 1599,
- 64, 1870, 80, 2400, 58, 2497, 10, 2523, 14, 2994,
- 16, 9, 515, 115, 1382, 73, 1389, 4104, 2399, 57,
- 2496, 9, 2512, 15, 2522, 13, 3334, 160, 3443, 162,
- 7, 69, 98, 514, 114, 1381, 72, 1390, 4105, 2398,
- 56, 2495, 8, 2521, 12, 6, 517, 117, 2419, 57,
- 2502, 15, 2511, 9, 2520, 11, 3444, 164, 8, 70,
- 100, 516, 116, 1383, 78, 1505, 72, 2418, 56, 2501,
- 14, 2510, 8, 2519, 10, 3, 2500, 13, 2518, 9,
- 3762, 160, 2, 2254, 40, 2499, 12, 11, 241, 4128,
- 289, 99, 979, 37408, 1392, 4114, 1511, 85, 1938, 49,
- 2530, 23, 2651, 1, 2940, 4164, 3273, 180, 3450, 184,
- 10, 242, 4129, 288, 98, 1237, 80, 1510, 84, 2258,
- 54, 2374, 32, 2505, 18, 2529, 22, 2803, 2, 2972,
- 6, 10, 1391, 4112, 1513, 87, 1833, 4096, 1940, 51,
- 2504, 17, 2528, 21, 2653, 3, 2941, 4166, 3274, 182,
- 3451, 186, 10, 287, 96, 1238, 82, 1512, 86, 1834,
- 4097, 1939, 50, 2257, 52, 2503, 16, 2652, 2, 3275,
- 183, 3452, 187, 12, 314, 4128, 1386, 87, 1507, 81,
- 1941, 53, 2390, 39, 2411, 33, 2527, 19, 2655, 5,
- 2938, 4160, 2971, 3, 3271, 176, 3453, 188, 9, 1385,
- 86, 1506, 80, 2256, 50, 2389, 38, 2410, 32, 2513,
- 16, 2526, 18, 2654, 4, 2805, 6, 11, 118, 4158,
- 980, 37414, 1384, 85, 1509, 83, 1602, 95, 2388, 37,
- 2525, 17, 2939, 4162, 2970, 1, 3272, 178, 3454, 190,
- 11, 119, 4159, 218, 37431, 290, 100, 981, 37415, 1508,
- 82, 1942, 54, 2255, 48, 2412, 34, 2524, 16, 2656,
- 6, 2804, 4, 9, 116, 4144, 551, 4128, 1601, 81,
- 1943, 57, 2537, 31, 2658, 9, 2944, 4172, 2993, 1,
- 3445, 176, 8, 72, 112, 511, 96, 1600, 80, 1868,
- 64, 2536, 30, 2657, 8, 2807, 10, 2976, 14, 6,
- 117, 4146, 552, 4130, 2392, 41, 2945, 4174, 3335, 176,
- 3446, 178, 10, 553, 4131, 1298, 37395, 1387, 88, 1393,
- 4121, 1944, 58, 2391, 40, 2535, 28, 2806, 8, 2975,
- 12, 3447, 179, 5, 1515, 89, 2534, 27, 2942, 4168,
- 3276, 184, 3448, 180, 6, 1514, 88, 1869, 68, 2533,
- 26, 2809, 14, 2974, 10, 3277, 185, 4, 2532, 25,
- 2943, 4170, 3449, 182, 3763, 176, 4, 2259, 56, 2531,
- 24, 2808, 12, 2973, 8, 10, 321, 8212, 2051, 12289,
- 3012, 2, 3087, 16, 3114, 32, 3414, 75, 4364, 16384,
- 4392, 256, 4418, 258, 4594, 272, 6, 2488, 12320, 3013,
- 3, 3204, 66, 3258, 70, 3309, 72, 3413, 74, 7,
- 322, 8214, 3203, 65, 3257, 69, 4389, 16384, 4393, 258,
- 4417, 256, 4619, 272, 4, 3011, 1, 3202, 64, 3256,
- 68, 3412, 72, 6, 3016, 6, 3417, 79, 4342, 256,
- 4368, 258, 4414, 16384, 4544, 272, 5, 352, 12368, 3017,
- 7, 3220, 64, 3255, 66, 3416, 78, 6, 320, 8210,
- 3014, 4, 4343, 258, 4367, 256, 4439, 16384, 4569, 272,
- 4, 3015, 5, 3221, 66, 3254, 64, 3415, 76, 10,
- 75, 130, 325, 8220, 722, 8208, 1243, 170, 3303, 65,
- 3409, 67, 4464, 16384, 4492, 256, 4518, 258, 4694, 272,
- 3, 530, 147, 3302, 64, 3408, 66, 8, 73, 128,
- 326, 8222, 528, 144, 3018, 8, 4489, 16384, 4493, 258,
- 4517, 256, 4719, 272, 5, 74, 129, 529, 145, 3019,
- 9, 3304, 66, 3407, 64, 7, 323, 8216, 1748, 24864,
- 3306, 69, 4442, 256, 4468, 258, 4514, 16384, 4644, 272,
- 3, 3305, 68, 3411, 70, 3754, 64, 8, 324, 8218,
- 531, 148, 3260, 73, 3308, 71, 4443, 258, 4467, 256,
- 4539, 16384, 4669, 272, 5, 532, 149, 3259, 72, 3307,
- 70, 3410, 68, 3755, 66, 10, 251, 8192, 317, 8196,
- 3022, 18, 3066, 16, 3115, 48, 3125, 32, 4394, 272,
- 4564, 16384, 4592, 256, 4618, 258, 4, 293, 129, 3023,
- 19, 3207, 82, 3224, 84, 9, 294, 130, 318, 8198,
- 526, 136, 3020, 16, 3206, 81, 4419, 272, 4589, 16384,
- 4593, 258, 4617, 256, 6, 295, 131, 527, 137, 3021,
- 17, 3205, 80, 3225, 86, 3314, 90, 5, 296, 132,
- 4344, 272, 4542, 256, 4568, 258, 4614, 16384, 3, 297,
- 133, 351, 12352, 3222, 80, 6, 80, 156, 316, 8194,
- 4369, 272, 4543, 258, 4567, 256, 4639, 16384, 3, 81,
- 157, 3223, 82, 3261, 80, 8, 77, 146, 520, 130,
- 3421, 83, 3758, 85, 4494, 272, 4664, 16384, 4692, 256,
- 4718, 258, 4, 521, 131, 716, 8193, 3310, 80, 3420,
- 82, 8, 76, 144, 518, 128, 717, 8194, 3419, 81,
- 4519, 272, 4689, 16384, 4693, 258, 4717, 256, 4, 519,
- 129, 718, 8195, 3311, 82, 3418, 80, 9, 79, 150,
- 319, 8200, 524, 134, 719, 8196, 3757, 81, 4444, 272,
- 4642, 256, 4668, 258, 4714, 16384, 5, 525, 135, 720,
- 8197, 3226, 88, 3312, 84, 3756, 80, 9, 78, 148,
- 522, 132, 721, 8198, 3067, 30, 3422, 85, 4469, 272,
- 4643, 258, 4667, 256, 4739, 16384, 2, 523, 133, 3313,
- 86, 6, 359, 12405, 1540, 134, 3068, 32, 3088, 48,
- 3124, 16, 3129, 96, 4, 358, 12404, 1541, 135, 2482,
-12288, 3322, 104, 2, 361, 12407, 1242, 128, 4, 360,
-12406, 1539, 133, 2483, 12290, 3323, 106, 2, 327, 8240,
- 355, 12401, 4, 354, 12400, 1538, 131, 2484, 12292, 3227,
- 96, 3, 328, 8242, 357, 12403, 1536, 128, 5, 356,
-12402, 1537, 129, 2485, 12294, 3228, 98, 3760, 106, 4,
- 724, 8240, 1615, 130, 1722, 8192, 3316, 97, 2, 2486,
-12296, 3315, 96, 3, 1613, 128, 1723, 8194, 3318, 99,
- 2, 1614, 129, 3317, 98, 2, 1742, 24832, 3320, 101,
- 3, 1743, 24833, 3319, 100, 3759, 96, 2, 1542, 136,
- 1744, 24834, 2, 1543, 137, 3321, 102, 5, 1550, 150,
- 3069, 48, 3113, 16, 3130, 112, 3429, 123, 5, 1551,
- 151, 2487, 12304, 3231, 116, 3328, 120, 3428, 122, 3,
- 1548, 148, 3131, 114, 3427, 121, 3, 1549, 149, 3329,
- 122, 3426, 120, 3, 1546, 146, 2992, 192, 3132, 116,
- 3, 353, 12384, 1547, 147, 3229, 112, 1, 1544, 144,
- 2, 1545, 145, 3230, 114, 3, 723, 8224, 1618, 146,
- 1747, 24852, 3, 1619, 147, 3324, 112, 3425, 114, 2,
- 1616, 144, 3424, 113, 3, 1617, 145, 3325, 114, 3423,
- 112, 1, 1745, 24848, 1, 3326, 116, 3, 1552, 152,
- 1620, 148, 1746, 24850, 1, 3327, 118, 8, 2039, 8193,
- 3183, 2, 3210, 4, 3234, 6, 3383, 10, 3750, 12,
- 4401, 4352, 4428, 4354, 9, 3070, 64, 3090, 80, 3138,
- 16, 3147, 320, 3184, 3, 3211, 5, 3384, 11, 4402,
- 4353, 4429, 4355, 6, 249, 4240, 3212, 6, 3233, 4,
- 3751, 14, 4403, 4354, 4426, 4352, 5, 3010, 184, 3091,
- 82, 3382, 9, 4404, 4355, 4427, 4353, 7, 1007, 37526,
- 2041, 8197, 3232, 2, 3386, 14, 3747, 8, 4351, 4352,
- 4378, 4354, 10, 344, 12305, 1008, 37527, 2040, 8196, 2276,
- 128, 2991, 176, 3092, 84, 3208, 1, 3748, 9, 4352,
- 4353, 4379, 4355, 9, 345, 12306, 2043, 8199, 3185, 4,
- 3209, 2, 3385, 12, 3749, 10, 3780, 8, 4353, 4354,
- 4376, 4352, 5, 1006, 37525, 2042, 8198, 2434, 144, 4354,
- 4355, 4377, 4353, 7, 2045, 8201, 3186, 10, 3215, 12,
- 3377, 2, 3744, 4, 4501, 4352, 4528, 4354, 6, 201,
-12289, 2044, 8200, 3007, 178, 3378, 3, 4502, 4353, 4529,
- 4355, 8, 129, 4224, 597, 4240, 1009, 37528, 3216, 14,
- 3745, 6, 3778, 4, 4503, 4354, 4526, 4352, 5, 3006,
- 176, 3746, 7, 3779, 5, 4504, 4355, 4527, 4353, 6,
- 3189, 14, 3213, 8, 3380, 6, 3777, 2, 4451, 4352,
- 4478, 4354, 4, 3009, 182, 3381, 7, 4452, 4353, 4479,
- 4355, 9, 130, 4228, 598, 4244, 3187, 12, 3214, 10,
- 3235, 8, 3379, 4, 3743, 2, 4453, 4354, 4476, 4352,
- 5, 3008, 180, 3188, 13, 3236, 9, 4454, 4355, 4477,
- 4353, 9, 2047, 8209, 2279, 149, 3127, 17, 3192, 18,
- 3219, 20, 3240, 22, 3394, 26, 4601, 4352, 4628, 4354,
- 7, 2046, 8208, 2278, 148, 3071, 80, 3089, 64, 3126,
- 16, 4602, 4353, 4629, 4355, 8, 247, 4224, 596, 4232,
- 2280, 151, 3190, 16, 3239, 20, 3393, 24, 4603, 4354,
- 4626, 4352, 4, 248, 4225, 3191, 17, 4604, 4355, 4627,
- 4353, 4, 3217, 16, 3238, 18, 4551, 4352, 4578, 4354,
- 3, 2990, 160, 4552, 4353, 4579, 4355, 6, 2049, 8215,
- 2433, 129, 3218, 18, 3237, 16, 4553, 4354, 4576, 4352,
- 5, 2048, 8214, 2277, 146, 2432, 128, 4554, 4355, 4577,
- 4353, 7, 202, 12304, 591, 4226, 725, 8257, 3283, 16,
- 3388, 18, 4701, 4352, 4728, 4354, 5, 203, 12305, 592,
- 4227, 3389, 19, 4702, 4353, 4729, 4355, 8, 131, 4240,
- 204, 12306, 589, 4224, 727, 8259, 3284, 18, 3387, 16,
- 4703, 4354, 4726, 4352, 5, 590, 4225, 726, 8258, 3005,
- 160, 4704, 4355, 4727, 4353, 6, 595, 4230, 729, 8261,
- 3285, 20, 3392, 22, 4651, 4352, 4678, 4354, 4, 728,
- 8260, 2281, 152, 4652, 4353, 4679, 4355, 6, 593, 4228,
- 3241, 24, 3286, 22, 3390, 20, 4653, 4354, 4676, 4352,
- 5, 594, 4229, 730, 8262, 3391, 21, 4654, 4355, 4677,
- 4353, 4, 3073, 97, 3194, 34, 3245, 38, 3403, 42,
- 5, 3072, 96, 3116, 64, 3128, 32, 3148, 352, 3404,
- 43, 5, 3075, 99, 3193, 32, 3244, 36, 3292, 42,
- 3402, 40, 2, 3074, 98, 3293, 43, 4, 3076, 101,
- 3196, 38, 3243, 34, 3294, 44, 1, 2989, 144, 4,
- 3077, 103, 3195, 36, 3242, 32, 3405, 44, 1, 3406,
- 45, 4, 1727, 12288, 3078, 105, 3287, 32, 3397, 34,
- 2, 3288, 33, 3398, 35, 6, 1679, 4224, 1728, 12290,
- 3197, 40, 3248, 44, 3289, 34, 3395, 32, 5, 1729,
-12291, 3004, 144, 3079, 106, 3198, 41, 3396, 33, 5,
- 1730, 12292, 3247, 42, 3290, 36, 3400, 38, 3752, 32,
- 3, 2167, 41508, 3291, 37, 3401, 39, 3, 1731, 12294,
- 3246, 40, 3753, 34, 1, 3399, 37, 5, 348, 12324,
- 1410, 4240, 2685, 131, 3200, 50, 3251, 54, 6, 2684,
- 130, 2847, 128, 3093, 96, 3117, 80, 3139, 32, 3149,
- 368, 5, 349, 12326, 1411, 4242, 2683, 129, 3199, 48,
- 3300, 58, 3, 1412, 4243, 2682, 128, 3301, 59, 3,
- 346, 12320, 1413, 4244, 2688, 135, 4, 1414, 4245, 2687,
- 134, 2988, 128, 3250, 51, 4, 347, 12322, 1415, 4246,
- 3201, 52, 3249, 48, 2, 1416, 4247, 2686, 132, 2,
- 1732, 12304, 3295, 48, 2, 1680, 4240, 3296, 50, 1,
- 3297, 51, 1, 350, 12328, 2, 3252, 56, 3298, 54,
- 2, 3253, 57, 3299, 55, 6, 13, 4417, 92, 268,
- 376, 16404, 1568, 288, 2083, 16448, 3864, 4177, 6, 93,
- 269, 377, 16405, 2037, 4356, 2084, 16449, 3903, 64, 3911,
- 4097, 3, 378, 16406, 1569, 290, 3866, 4179, 7, 14,
- 4418, 94, 271, 379, 16407, 630, 4446, 3865, 4178, 3929,
- 64, 3937, 4097, 9, 11, 258, 90, 264, 372, 16400,
- 1053, 37713, 1570, 292, 2034, 4353, 2296, 326, 3050, 1280,
- 3868, 4181, 5, 373, 16401, 2297, 327, 3867, 4180, 3955,
- 64, 3963, 4097, 6, 10, 256, 144, 4427, 374, 16402,
- 1055, 37715, 1571, 294, 2036, 4355, 10, 91, 267, 143,
- 4426, 375, 16403, 629, 4442, 1054, 37714, 2035, 4354, 2295,
- 325, 3869, 4182, 3981, 64, 3989, 4097, 7, 86, 260,
- 142, 4421, 205, 16384, 384, 16412, 627, 4437, 1637, 292,
- 3871, 4185, 8, 87, 261, 385, 16413, 626, 4436, 751,
-20560, 1638, 293, 3870, 4184, 4007, 64, 4015, 4097, 1,
- 88, 262, 4, 89, 263, 628, 4438, 4033, 64, 4041,
- 4097, 4, 82, 256, 380, 16408, 623, 4433, 1633, 288,
- 7, 83, 257, 141, 4416, 381, 16409, 622, 4432, 1634,
- 289, 4059, 64, 4067, 4097, 4, 84, 258, 382, 16410,
- 625, 4435, 1635, 290, 7, 85, 259, 383, 16411, 624,
- 4434, 1636, 291, 3154, 153, 4085, 64, 4093, 4097, 7,
- 276, 16384, 365, 16388, 1051, 37701, 2085, 16464, 2460, 4353,
- 3781, 16, 3856, 4161, 6, 1050, 37700, 2086, 16465, 2459,
- 4352, 3811, 1, 4111, 64, 4119, 4097, 5, 366, 16390,
- 2087, 16466, 2462, 4355, 3812, 2, 3858, 4163, 5, 1052,
-37702, 2461, 4354, 3857, 4162, 4137, 64, 4145, 4097, 7,
- 101, 280, 621, 4425, 1047, 37697, 2464, 4357, 3051, 1296,
- 3813, 4, 3860, 4165, 7, 102, 281, 232, 257, 1046,
-37696, 2463, 4356, 3859, 4164, 4163, 64, 4171, 4097, 6,
- 233, 258, 258, 8576, 364, 16386, 1049, 37699, 3165, 160,
- 3862, 4167, 5, 147, 4442, 1048, 37698, 3861, 4166, 4189,
- 64, 4197, 4097, 5, 97, 276, 146, 4437, 369, 16396,
- 618, 4421, 737, 16384, 7, 98, 277, 617, 4420, 750,
-20544, 3581, 468, 3863, 4168, 4215, 64, 4223, 4097, 3,
- 99, 278, 370, 16398, 620, 4423, 6, 100, 279, 371,
-16399, 619, 4422, 3582, 470, 4241, 64, 4249, 4097, 3,
- 95, 272, 367, 16392, 614, 4417, 5, 145, 4432, 613,
- 4416, 3579, 464, 4267, 64, 4275, 4097, 3, 96, 274,
- 368, 16394, 616, 4419, 4, 615, 4418, 3580, 466, 4293,
- 64, 4301, 4097, 4, 395, 16436, 1272, 16384, 1553, 256,
- 3884, 4209, 3, 396, 16437, 1245, 261, 3883, 4208, 3,
- 397, 16438, 1554, 258, 3886, 4211, 2, 1555, 259, 3885,
- 4210, 6, 391, 16432, 1244, 256, 1556, 260, 1629, 264,
- 3052, 1312, 3887, 4213, 3, 392, 16433, 1557, 261, 1630,
- 265, 4, 260, 8624, 393, 16434, 1558, 262, 3889, 4215,
- 4, 394, 16435, 1431, 4416, 1559, 263, 3888, 4214, 5,
- 400, 16444, 1560, 264, 1625, 260, 1734, 16384, 3891, 4217,
- 3, 152, 4452, 1626, 261, 3890, 4216, 3, 153, 4455,
- 1627, 262, 3893, 4219, 2, 1628, 263, 3892, 4218, 5,
- 103, 288, 149, 4449, 398, 16440, 1621, 256, 3895, 4221,
- 5, 104, 289, 148, 4448, 636, 4464, 1622, 257, 3894,
- 4220, 3, 151, 4451, 399, 16442, 1623, 258, 3, 150,
- 4450, 1624, 259, 3896, 4222, 3, 388, 16420, 1561, 272,
- 3873, 4193, 2, 2760, 4356, 3872, 4192, 4, 389, 16422,
- 1434, 4437, 1562, 274, 1852, 16384, 2, 1563, 275, 3874,
- 4194, 5, 386, 16416, 1246, 272, 1433, 4435, 1564, 276,
- 2757, 4353, 3, 1056, 37728, 1565, 277, 3875, 4196, 5,
- 259, 8608, 387, 16418, 2759, 4355, 3164, 128, 3876, 4199,
- 3, 1432, 4432, 1566, 279, 2758, 4354, 3, 1567, 280,
- 1882, 16384, 3878, 4201, 2, 634, 4452, 3877, 4200, 1,
- 635, 4454, 5, 390, 16424, 632, 4449, 1631, 272, 1875,
- 256, 3880, 4205, 4, 631, 4448, 1632, 273, 1876, 257,
- 3879, 4204, 3, 1435, 4441, 1877, 258, 3882, 4207, 2,
- 633, 4450, 3881, 4206, 5, 1023, 37652, 2052, 16385, 3822,
- 4112, 4107, 16, 4363, 12288, 6, 405, 16468, 1024, 37653,
- 1423, 4391, 2284, 258, 3823, 4113, 3950, 5, 8, 407,
-16471, 1025, 37654, 2054, 16387, 2283, 257, 2573, 289, 3824,
- 4114, 4133, 16, 4388, 12288, 7, 406, 16470, 1026, 37655,
- 1422, 4389, 2053, 16386, 2282, 256, 3825, 4115, 3976, 5,
- 7, 403, 16465, 1019, 37648, 1421, 4386, 2056, 16389, 3826,
- 4116, 4159, 16, 4413, 12288, 8, 402, 16464, 1020, 37649,
- 1945, 256, 2055, 16388, 2286, 262, 2345, 264, 3827, 4117,
- 3898, 5, 6, 1021, 37650, 2058, 16391, 2575, 293, 3828,
- 4118, 4185, 16, 4438, 12288, 9, 262, 8656, 404, 16466,
- 1022, 37651, 1420, 4385, 2057, 16390, 2285, 260, 2574, 292,
- 3829, 4119, 3924, 5, 8, 602, 4372, 739, 20496, 2059,
-16393, 2342, 261, 3559, 388, 3830, 4120, 4211, 16, 4463,
-12288, 4, 411, 16476, 3783, 64, 3831, 4121, 4054, 5,
- 7, 740, 20498, 2188, 41861, 2344, 263, 2576, 297, 3832,
- 4122, 4237, 16, 4488, 12288, 4, 2343, 262, 3784, 66,
- 3833, 4123, 4080, 5, 8, 132, 4352, 409, 16473, 600,
- 4368, 1027, 37656, 3556, 384, 3834, 4124, 4263, 16, 4513,
-12288, 6, 408, 16472, 601, 4369, 1028, 37657, 2340, 256,
- 3835, 4125, 4002, 5, 5, 1424, 4392, 3557, 386, 3836,
- 4126, 4289, 16, 4538, 12288, 7, 410, 16474, 2088, 33538,
- 2187, 41856, 2341, 258, 3558, 387, 3837, 4127, 4028, 5,
- 8, 448, 20484, 1013, 37636, 2061, 16401, 2436, 257, 2579,
- 307, 2912, 289, 3899, 16, 4563, 12288, 7, 1014, 37637,
- 2060, 16400, 2435, 256, 2578, 306, 2911, 288, 3814, 4097,
- 4158, 5, 4, 1015, 37638, 1429, 4404, 3925, 16, 4588,
-12288, 4, 1016, 37639, 1430, 4405, 2577, 304, 4184, 5,
- 7, 250, 4352, 1427, 4402, 2062, 16405, 3564, 408, 3815,
- 4100, 3951, 16, 4613, 12288, 7, 401, 16448, 1010, 37633,
- 1428, 4403, 3053, 1360, 3565, 409, 3816, 4101, 4106, 5,
- 7, 447, 20482, 1011, 37634, 1425, 4400, 3566, 410, 3817,
- 4102, 3977, 16, 4638, 12288, 7, 261, 8640, 1012, 37635,
- 1426, 4401, 2063, 16406, 2580, 308, 3818, 4103, 4132, 5,
- 6, 738, 20480, 2065, 16409, 3562, 404, 3819, 4104, 4003,
- 16, 4663, 12288, 5, 135, 4373, 2064, 16408, 3785, 80,
- 3820, 4105, 4262, 5, 4, 3563, 406, 3821, 4106, 4029,
- 16, 4688, 12288, 1, 4288, 5, 7, 133, 4368, 599,
- 4352, 1017, 37640, 2347, 273, 3560, 400, 4055, 16, 4713,
-12288, 4, 134, 4369, 1018, 37641, 2346, 272, 4210, 5,
- 4, 2349, 275, 3561, 402, 4081, 16, 4738, 12288, 3,
- 2189, 41872, 2348, 274, 4236, 5, 10, 1042, 37684, 1273,
-20480, 1324, 37644, 2067, 16417, 2289, 291, 2567, 259, 3058,
- 1381, 3900, 32, 3927, 34, 4110, 48, 8, 417, 16500,
- 1043, 37685, 1325, 37645, 2066, 16416, 2288, 290, 2566, 258,
- 3057, 1380, 3849, 4145, 8, 1274, 20482, 1326, 37646, 2069,
-16419, 2287, 289, 2565, 257, 3901, 34, 3926, 32, 4136,
- 48, 5, 418, 16502, 1044, 37687, 1327, 37647, 2068, 16418,
- 3850, 4147, 11, 611, 4408, 1039, 37680, 1320, 37640, 2070,
-16421, 2571, 263, 3054, 1377, 3571, 424, 3851, 4148, 3952,
- 32, 3979, 34, 4162, 48, 4, 415, 16496, 1321, 37641,
- 1419, 4355, 2570, 262, 11, 612, 4410, 1040, 37682, 1322,
-37642, 1417, 4352, 2072, 16423, 2291, 293, 2569, 261, 3056,
- 1379, 3953, 34, 3978, 32, 4188, 48, 10, 263, 8688,
- 416, 16498, 1041, 37683, 1323, 37643, 1418, 4353, 2071, 16422,
- 2290, 292, 2568, 260, 3055, 1378, 3852, 4151, 10, 607,
- 4404, 749, 20528, 1685, 4356, 1735, 20480, 2074, 16425, 3569,
- 420, 3853, 4152, 4004, 32, 4031, 34, 4214, 48, 5,
- 137, 4389, 421, 16508, 608, 4405, 2073, 16424, 3854, 4153,
- 6, 609, 4406, 3570, 422, 3855, 4154, 4005, 34, 4030,
- 32, 4240, 48, 4, 422, 16510, 610, 4407, 1319, 37639,
- 2572, 264, 8, 136, 4384, 605, 4400, 1045, 37688, 1681,
- 4352, 3567, 416, 4056, 32, 4083, 34, 4266, 48, 5,
- 419, 16504, 606, 4401, 1317, 37633, 1682, 4353, 2350, 288,
- 6, 1318, 37634, 1683, 4354, 3568, 418, 4057, 34, 4082,
- 32, 4292, 48, 2, 420, 16506, 1684, 4355, 9, 12,
- 4400, 747, 20520, 1033, 37668, 2076, 16433, 3578, 444, 3838,
- 4128, 3902, 48, 4108, 32, 4135, 34, 6, 414, 16484,
- 748, 20521, 1034, 37669, 2075, 16432, 2851, 262, 3839, 4129,
- 5, 1035, 37670, 2078, 16435, 3928, 48, 4109, 34, 4134,
- 32, 4, 1036, 37671, 2077, 16434, 2850, 260, 3840, 4131,
- 9, 1029, 37664, 2080, 16437, 2293, 311, 2690, 257, 3576,
- 440, 3841, 4132, 3954, 48, 4160, 32, 4187, 34, 6,
- 412, 16480, 1030, 37665, 2079, 16436, 2689, 256, 2849, 258,
- 3842, 4133, 10, 140, 4410, 1031, 37666, 2082, 16439, 2292,
- 309, 2692, 259, 3577, 442, 3843, 4134, 3980, 48, 4161,
- 34, 4186, 32, 7, 413, 16482, 1032, 37667, 2081, 16438,
- 2691, 258, 2848, 256, 3166, 192, 3844, 4135, 7, 139,
- 4404, 741, 20512, 3574, 436, 3845, 4136, 4006, 48, 4212,
- 32, 4239, 34, 3, 742, 20513, 2855, 270, 3846, 4137,
- 7, 743, 20514, 2294, 313, 3575, 438, 3847, 4138, 4032,
- 48, 4213, 34, 4238, 32, 2, 2854, 268, 3848, 4139,
- 9, 138, 4400, 603, 4384, 744, 20516, 1037, 37672, 1328,
-37648, 3572, 432, 4058, 48, 4264, 32, 4291, 34, 5,
- 604, 4385, 1038, 37673, 1329, 37649, 1686, 4369, 2853, 266,
- 7, 745, 20518, 1330, 37650, 1687, 4370, 3573, 434, 4084,
- 48, 4265, 34, 4290, 32, 4, 746, 20519, 1331, 37651,
- 1688, 4371, 2852, 264, 2, 762, 24600, 3923, 12288, 2,
- 842, 28760, 3555, 334, 2, 763, 24602, 3949, 12288, 1,
- 3554, 332, 7, 252, 8464, 438, 16530, 764, 24604, 3100,
- 272, 3151, 16, 3160, 48, 3975, 12288, 1, 3553, 330,
- 2, 765, 24606, 4001, 12288, 2, 437, 16529, 3552, 328,
- 2, 1737, 24608, 4027, 12288, 4, 443, 16543, 758, 24593,
- 838, 28752, 3551, 326, 4, 441, 16540, 759, 24594, 1738,
-24610, 4053, 12288, 4, 442, 16541, 839, 28754, 1739, 24611,
- 3550, 324, 4, 439, 16538, 760, 24596, 2178, 41792, 4079,
-12288, 4, 440, 16539, 840, 28756, 3356, 320, 3549, 322,
- 2, 761, 24598, 4105, 12288, 3, 841, 28758, 3357, 322,
- 3548, 320, 3, 429, 16518, 4131, 12288, 4325, 16, 3,
- 430, 16519, 836, 28744, 4326, 17, 3, 427, 16516, 4157,
-12288, 4327, 18, 1, 428, 16517, 6, 425, 16514, 2182,
-41816, 3099, 256, 3122, 304, 3141, 16, 4183, 12288, 3,
- 426, 16515, 837, 28748, 4328, 21, 2, 423, 16512, 4209,
-12288, 1, 424, 16513, 6, 436, 16526, 757, 24576, 832,
-28737, 1740, 24624, 2181, 41812, 4235, 12288, 1, 831, 28736,
- 2, 434, 16524, 4261, 12288, 2, 435, 16525, 833, 28738,
- 2, 162, 8464, 4287, 12288, 4, 163, 8465, 433, 16523,
- 834, 28740, 3358, 336, 4, 164, 8466, 431, 16520, 2179,
-41810, 4313, 12288, 4, 432, 16521, 835, 28742, 2180, 41811,
- 3359, 338, 1, 779, 24632, 2, 780, 24633, 3159, 21,
- 2, 781, 24634, 4329, 34, 1, 782, 24635, 6, 169,
- 8488, 783, 24636, 3102, 304, 3142, 32, 3153, 48, 3158,
- 16, 3, 170, 8489, 784, 24637, 3364, 360, 2, 171,
- 8490, 785, 24638, 1, 786, 24639, 2, 167, 8484, 774,
-24624, 2, 775, 24625, 3362, 356, 1, 776, 24626, 2,
- 168, 8487, 3363, 358, 3, 165, 8480, 777, 24628, 2183,
-41824, 1, 3360, 352, 2, 166, 8482, 778, 24630, 1,
- 3361, 354, 1, 770, 24616, 1, 771, 24618, 7, 446,
-16546, 772, 24620, 3101, 288, 3120, 272, 3143, 48, 3152,
- 32, 3155, 16, 1, 3121, 273, 2, 444, 16544, 773,
-24622, 1, 445, 16545, 4, 175, 8500, 766, 24608, 1726,
- 8468, 1736, 24592, 3, 176, 8501, 843, 28768, 2186, 41845,
- 1, 767, 24610, 1, 844, 28770, 6, 172, 8496, 768,
-24612, 846, 28773, 1724, 8464, 2184, 41840, 3365, 369, 1,
- 845, 28772, 6, 173, 8498, 769, 24614, 1725, 8466, 2185,
-41842, 3024, 304, 3367, 371, 2, 174, 8499, 3366, 370,
- 11, 256, 8533, 1790, 28712, 3519, 270, 3912, 8192, 3939,
- 8194, 3966, 8196, 3993, 8198, 4020, 8200, 4047, 8202, 4074,
- 8204, 4101, 8206, 6, 255, 8532, 801, 24664, 1791, 28713,
- 3106, 340, 4330, 64, 4350, 4097, 11, 818, 28698, 1792,
-28714, 3518, 268, 3913, 8194, 3938, 8192, 3967, 8198, 3992,
- 8196, 4021, 8202, 4046, 8200, 4075, 8206, 4100, 8204, 3,
- 802, 24666, 1793, 28715, 4375, 4097, 11, 1794, 28716, 3517,
- 266, 3914, 8196, 3941, 8198, 3964, 8192, 3991, 8194, 4022,
- 8204, 4049, 8206, 4072, 8200, 4099, 8202, 4331, 69, 6,
- 253, 8528, 1795, 28717, 3104, 336, 3136, 256, 3144, 64,
- 4400, 4097, 10, 1796, 28718, 3515, 264, 3915, 8198, 3940,
- 8196, 3965, 8194, 3990, 8192, 4023, 8206, 4048, 8204, 4073,
- 8202, 4098, 8200, 5, 254, 8530, 2175, 41738, 3105, 338,
- 3516, 265, 4425, 4097, 12, 813, 28688, 1782, 28704, 3513,
- 262, 3771, 256, 3916, 8200, 3943, 8202, 3970, 8204, 3997,
- 8206, 4016, 8192, 4043, 8194, 4070, 8196, 4097, 8198, 7,
- 179, 8516, 797, 24656, 814, 28689, 1783, 28705, 3344, 261,
- 3514, 263, 4450, 4097, 13, 815, 28690, 1784, 28706, 2174,
-41735, 3512, 260, 3772, 258, 3917, 8202, 3942, 8200, 3971,
- 8206, 3996, 8204, 4017, 8194, 4042, 8192, 4071, 8198, 4096,
- 8196, 4, 798, 24658, 1785, 28707, 3107, 350, 4475, 4097,
- 14, 816, 28692, 1786, 28708, 2173, 41729, 3343, 256, 3511,
- 258, 3773, 260, 3918, 8204, 3945, 8206, 3968, 8200, 3995,
- 8202, 4018, 8196, 4045, 8198, 4068, 8192, 4095, 8194, 4,
- 799, 24660, 1787, 28709, 2172, 41728, 4500, 4097, 13, 178,
- 8515, 642, 4496, 817, 28694, 1788, 28710, 3510, 256, 3919,
- 8206, 3944, 8204, 3969, 8202, 3994, 8200, 4019, 8198, 4044,
- 8196, 4069, 8194, 4094, 8192, 6, 177, 8514, 643, 4497,
- 800, 24662, 1789, 28711, 3025, 320, 4525, 4097, 11, 809,
-28680, 3529, 286, 4120, 8192, 4147, 8194, 4174, 8196, 4201,
- 8198, 4228, 8200, 4255, 8202, 4282, 8204, 4309, 8206, 4333,
- 81, 4, 793, 24648, 3530, 287, 4332, 80, 4550, 4097,
- 10, 810, 28682, 3528, 284, 4121, 8194, 4146, 8192, 4175,
- 8198, 4200, 8196, 4229, 8202, 4254, 8200, 4283, 8206, 4308,
- 8204, 3, 794, 24650, 4334, 82, 4575, 4097, 10, 811,
-28684, 3527, 282, 4122, 8196, 4149, 8198, 4172, 8192, 4199,
- 8194, 4230, 8204, 4257, 8206, 4280, 8200, 4307, 8202, 6,
- 795, 24652, 3103, 320, 3145, 80, 3157, 112, 3163, 96,
- 4600, 4097, 11, 158, 4504, 812, 28686, 3526, 280, 4123,
- 8198, 4148, 8196, 4173, 8194, 4198, 8192, 4231, 8206, 4256,
- 8204, 4281, 8202, 4306, 8200, 3, 159, 4505, 796, 24654,
- 4625, 4097, 13, 156, 4502, 735, 12548, 788, 24641, 804,
-28672, 3525, 278, 4124, 8200, 4151, 8202, 4178, 8204, 4205,
- 8206, 4224, 8192, 4251, 8194, 4278, 8196, 4305, 8198, 6,
- 157, 4503, 736, 12549, 787, 24640, 805, 28673, 3774, 273,
- 4650, 4097, 13, 641, 4484, 790, 24643, 3346, 278, 3523,
- 276, 3775, 274, 4125, 8202, 4150, 8200, 4179, 8206, 4204,
- 8204, 4225, 8194, 4250, 8192, 4279, 8198, 4304, 8196, 5,
- 155, 4501, 789, 24642, 3524, 277, 3776, 275, 4675, 4097,
- 13, 639, 4482, 731, 12544, 806, 28676, 3345, 272, 3522,
- 274, 4126, 8204, 4153, 8206, 4176, 8200, 4203, 8202, 4226,
- 8196, 4253, 8198, 4276, 8192, 4303, 8194, 5, 640, 4483,
- 732, 12545, 791, 24644, 807, 28677, 4700, 4097, 14, 154,
- 4496, 637, 4480, 733, 12546, 808, 28678, 2176, 41747, 3520,
- 272, 4127, 8206, 4152, 8204, 4177, 8202, 4202, 8200, 4227,
- 8198, 4252, 8196, 4277, 8194, 4302, 8192, 5, 638, 4481,
- 734, 12547, 792, 24646, 3521, 273, 4725, 4097, 5, 830,
-28728, 1758, 28680, 3542, 302, 4336, 97, 4441, 105, 3,
- 1759, 28681, 4335, 96, 4440, 104, 4, 1760, 28682, 3541,
- 300, 4338, 99, 4466, 105, 3, 1761, 28683, 4337, 98,
- 4465, 104, 4, 1265, 12544, 1762, 28684, 3540, 298, 4491,
- 105, 4, 1763, 28685, 3123, 320, 3162, 80, 4490, 104,
- 3, 1764, 28686, 3538, 296, 4516, 105, 4, 1765, 28687,
- 3539, 297, 4339, 102, 4515, 104, 4, 826, 28720, 1750,
-28672, 3537, 294, 4341, 105, 3, 1741, 24640, 1751, 28673,
- 4340, 104, 4, 827, 28722, 1752, 28674, 3535, 292, 4366,
- 105, 3, 1753, 28675, 3536, 293, 4365, 104, 5, 828,
-28724, 1754, 28676, 3347, 288, 3533, 290, 4391, 105, 3,
- 1755, 28677, 3534, 291, 4390, 104, 5, 829, 28726, 1756,
-28678, 3348, 290, 3531, 288, 4416, 105, 3, 1757, 28679,
- 3532, 289, 4415, 104, 4, 823, 28712, 1774, 28696, 3355,
- 316, 4641, 105, 2, 1775, 28697, 4640, 104, 3, 824,
-28714, 1776, 28698, 4666, 105, 3, 825, 28715, 1777, 28699,
- 4665, 104, 4, 1778, 28700, 3353, 312, 3786, 255, 4691,
- 105, 7, 257, 8544, 1779, 28701, 3108, 352, 3146, 112,
- 3156, 80, 3161, 64, 4690, 104, 3, 1780, 28702, 3354,
- 314, 4716, 105, 4, 1689, 4505, 1781, 28703, 2177, 41786,
- 4715, 104, 4, 819, 28704, 1766, 28688, 3351, 308, 4541,
- 105, 3, 803, 24672, 1767, 28689, 4540, 104, 6, 646,
- 4516, 820, 28706, 1768, 28690, 3352, 310, 3547, 308, 4566,
- 105, 2, 1769, 28691, 4565, 104, 7, 645, 4514, 821,
-28708, 1733, 12560, 1770, 28692, 3349, 304, 3545, 306, 4591,
- 105, 3, 1771, 28693, 3546, 307, 4590, 104, 6, 644,
- 4512, 822, 28710, 1772, 28694, 3350, 306, 3543, 304, 4616,
- 105, 3, 1773, 28695, 3544, 305, 4615, 104, 3, 656,
- 4689, 894, 36953, 2727, 632, 4, 105, 513, 655, 4688,
- 893, 36952, 2728, 633, 2, 274, 8856, 1908, 560, 2,
- 275, 8857, 1909, 561, 1, 3809, 768, 1, 2963, 4664,
- 2, 2322, 584, 2620, 25568, 1, 2323, 585, 2, 268,
- 8850, 889, 36945, 7, 269, 8851, 888, 36944, 1446, 4706,
- 1947, 577, 2321, 583, 2961, 4660, 3643, 712, 3, 891,
-36947, 1948, 578, 2320, 580, 5, 890, 36946, 1445, 4704,
- 1949, 579, 2725, 627, 2962, 4662, 4, 272, 8854, 1950,
- 580, 2319, 578, 2726, 628, 5, 273, 8855, 892, 36948,
- 1951, 581, 2469, 4624, 2960, 4656, 2, 270, 8852, 1447,
- 4709, 1, 271, 8853, 3, 887, 36937, 1277, 36977, 1906,
- 546, 5, 161, 4688, 651, 4672, 886, 36936, 1907, 547,
- 3644, 720, 2, 653, 4675, 1904, 544, 4, 652, 4674,
- 1278, 36978, 1905, 545, 3645, 722, 2, 654, 4676, 3646,
- 724, 1, 2621, 25584, 1, 3647, 726, 4, 234, 512,
- 879, 36929, 1448, 4723, 1952, 592, 4, 235, 513, 1953,
- 593, 2723, 609, 2959, 4644, 3, 881, 36931, 1954, 594,
- 2724, 610, 2, 880, 36930, 1955, 595, 4, 883, 36933,
- 1956, 596, 2326, 594, 2466, 4609, 5, 882, 36932, 1957,
- 597, 2327, 595, 2465, 4608, 2957, 4640, 3, 885, 36935,
- 2324, 592, 2468, 4611, 4, 884, 36934, 2325, 593, 2467,
- 4610, 2958, 4642, 5, 911, 36985, 1639, 512, 1898, 530,
- 2722, 600, 3649, 737, 3, 910, 36984, 1899, 531, 3648,
- 736, 2, 1896, 528, 3651, 739, 2, 1897, 529, 3650,
- 738, 1, 3653, 741, 1, 3652, 740, 3, 1900, 532,
- 2618, 25536, 3655, 743, 2, 1901, 533, 3654, 742, 4,
- 1247, 512, 1903, 538, 1958, 608, 2714, 592, 4, 904,
-36976, 1959, 609, 2715, 593, 3656, 744, 4, 905, 36979,
- 1902, 536, 2716, 594, 3658, 747, 3, 2717, 595, 2956,
- 4630, 3657, 746, 2, 907, 36981, 2718, 596, 3, 906,
-36980, 2719, 597, 2954, 4624, 3, 909, 36983, 1572, 514,
- 2720, 598, 3, 908, 36982, 2721, 599, 2955, 4626, 4,
- 658, 4705, 903, 36969, 1889, 514, 2712, 584, 4, 657,
- 4704, 1890, 515, 2713, 585, 2768, 4616, 1, 1888, 512,
- 2, 1276, 36951, 2619, 25552, 2, 1275, 36950, 1891, 517,
- 4, 896, 36961, 1894, 522, 1960, 624, 2761, 4609, 3,
- 895, 36960, 2705, 577, 2953, 4612, 4, 898, 36963, 1892,
- 520, 2706, 578, 2763, 4611, 5, 897, 36962, 1442, 4688,
- 1893, 521, 2707, 579, 2762, 4610, 4, 900, 36965, 1444,
- 4695, 2708, 580, 2765, 4613, 6, 899, 36964, 1961, 629,
- 2470, 4640, 2709, 581, 2764, 4612, 2951, 4608, 5, 902,
-36967, 1443, 4693, 1895, 524, 2710, 582, 2767, 4615, 4,
- 901, 36966, 2711, 583, 2766, 4614, 2952, 4610, 5, 160,
- 4608, 650, 4624, 861, 36888, 2352, 513, 3619, 640, 4,
- 862, 36889, 1699, 4641, 2130, 41090, 2351, 512, 2, 1700,
- 4642, 3620, 642, 4, 1701, 4643, 2129, 41088, 2353, 514,
- 2614, 25508, 2, 1702, 4644, 3621, 644, 3, 2132, 41093,
- 2354, 519, 3622, 646, 3, 2131, 41092, 2304, 520, 2613,
-25504, 4, 854, 36880, 2303, 519, 2701, 561, 3623, 648,
- 2, 855, 36881, 2700, 560, 6, 856, 36882, 1439, 4640,
- 2134, 41097, 2302, 517, 2703, 563, 3624, 650, 4, 2133,
-41096, 2301, 516, 2616, 25516, 2702, 562, 5, 15, 4608,
- 857, 36884, 2300, 515, 2440, 529, 3625, 652, 4, 858,
-36885, 2299, 514, 2439, 528, 2704, 564, 3, 16, 4610,
- 859, 36886, 2298, 513, 4, 206, 36871, 860, 36887, 1440,
- 4645, 2615, 25512, 4, 647, 4608, 852, 36872, 2699, 553,
- 3626, 656, 4, 648, 4609, 853, 36873, 2698, 552, 3627,
- 657, 2, 649, 4610, 3628, 658, 1, 2135, 41104, 1,
- 3629, 660, 1, 3630, 662, 2, 2310, 536, 2617, 25520,
- 1, 3631, 664, 2, 1441, 4656, 2309, 533, 1, 2355,
- 538, 3, 849, 36868, 2308, 531, 3632, 668, 3, 850,
-36869, 2307, 530, 2437, 512, 6, 17, 4626, 851, 36870,
- 2306, 529, 2357, 543, 2697, 551, 3633, 670, 4, 2305,
- 528, 2356, 542, 2438, 514, 2696, 550, 3, 1263, 4616,
- 1690, 4608, 3634, 672, 2, 1264, 4617, 1691, 4609, 2,
- 1692, 4610, 3635, 674, 2, 1693, 4611, 2866, 536, 2,
- 1694, 4612, 3636, 676, 1, 2611, 25472, 3, 872, 36912,
- 1259, 4608, 2313, 551, 3, 1798, 36865, 1946, 544, 2863,
- 530, 3, 873, 36914, 1260, 4610, 1799, 36866, 5, 874,
-36915, 1248, 578, 1800, 36867, 2312, 548, 2862, 528, 3,
- 18, 4640, 875, 36916, 1261, 4612, 2, 876, 36917, 2865,
- 534, 2, 877, 36918, 1262, 4614, 3, 878, 36919, 2311,
- 544, 2864, 532, 3, 870, 36904, 2695, 521, 3637, 688,
- 4, 871, 36905, 1695, 4625, 1912, 578, 2694, 520, 3,
- 1696, 4626, 1911, 577, 3638, 690, 5, 1697, 4627, 1910,
- 576, 2136, 41136, 2861, 520, 3639, 691, 3, 1698, 4628,
- 1916, 583, 3640, 692, 1, 1915, 582, 1, 1914, 581,
- 3, 1913, 580, 2318, 568, 2612, 25488, 5, 863, 36896,
- 1438, 4626, 2858, 515, 2965, 4676, 3641, 696, 3, 864,
-36897, 2317, 566, 2857, 514, 4, 865, 36898, 1436, 4624,
- 2966, 4678, 3642, 698, 4, 1437, 4625, 1917, 584, 2316,
- 564, 2856, 512, 1, 866, 36900, 4, 867, 36901, 2315,
- 562, 2441, 544, 2860, 518, 3, 868, 36902, 2693, 519,
- 2964, 4674, 4, 869, 36903, 2314, 560, 2442, 546, 2859,
- 516, 3, 180, 8704, 2112, 41024, 3174, 8, 3, 3175,
- 9, 3374, 576, 3609, 578, 2, 3026, 512, 3176, 10,
- 3, 2113, 41027, 3177, 11, 3608, 576, 3, 181, 8708,
- 2610, 25440, 3178, 12, 1, 3179, 13, 1, 3180, 14,
- 3, 2114, 41031, 3181, 15, 3610, 580, 2, 182, 8712,
- 267, 8720, 1, 3167, 1, 1, 3168, 2, 1, 3169,
- 3, 2, 336, 8720, 3170, 4, 1, 3171, 5, 1,
- 3172, 6, 1, 3173, 7, 3, 334, 8716, 2115, 41040,
- 3376, 593, 2, 2089, 37010, 3375, 592, 1, 335, 8718,
- 1, 3611, 592, 1, 332, 8712, 1, 2091, 37014, 1,
- 333, 8714, 2, 2090, 37012, 2116, 41047, 2, 183, 8728,
- 330, 8708, 2, 264, 8705, 1214, 40961, 3, 265, 8706,
- 331, 8710, 1215, 40962, 3, 266, 8707, 1216, 40963, 2092,
-37016, 1, 329, 8706, 3, 184, 8736, 2117, 41056, 3614,
- 611, 3, 2208, 45088, 2606, 25413, 3613, 610, 1, 2607,
-25414, 2, 2608, 25415, 3612, 608, 1, 2605, 25408, 1,
- 3616, 614, 1, 2118, 41062, 2, 2119, 41063, 3615, 612,
- 3, 185, 8744, 2120, 41064, 3182, 32, 2, 186, 8745,
- 3617, 618, 1, 3618, 620, 3, 187, 8752, 343, 8748,
- 2121, 41072, 1, 2122, 41075, 3, 341, 8744, 2123, 41076,
- 2609, 25424, 1, 2124, 41077, 2, 342, 8746, 2125, 41078,
- 2, 339, 8740, 2126, 41080, 2, 340, 8742, 2127, 41082,
- 2, 337, 8736, 2128, 41084, 1, 338, 8738, 3, 3368,
- 512, 3584, 514, 4535, 4866, 3, 188, 8768, 4509, 4865,
- 4536, 4867, 4, 927, 37016, 3369, 514, 3583, 512, 4510,
- 4866, 3, 189, 8770, 4511, 4867, 4534, 4865, 2, 3585,
- 518, 4485, 4866, 4, 190, 8772, 2603, 25376, 4459, 4865,
- 4486, 4867, 2, 2100, 40967, 4460, 4866, 3, 191, 8774,
- 4461, 4867, 4484, 4865, 2, 922, 37010, 4435, 4866, 3,
- 923, 37011, 4409, 4865, 4436, 4867, 3, 920, 37008, 1963,
- 641, 4410, 4866, 4, 921, 37009, 1962, 640, 4411, 4867,
- 4434, 4865, 2, 926, 37014, 4385, 4866, 2, 4359, 4865,
- 4386, 4867, 2, 924, 37012, 4360, 4866, 3, 925, 37013,
- 4361, 4867, 4384, 4865, 3, 192, 8785, 3587, 530, 4735,
- 4866, 3, 2101, 40976, 4709, 4865, 4736, 4867, 3, 193,
- 8787, 3586, 528, 4710, 4866, 3, 919, 37001, 4711, 4867,
- 4734, 4865, 3, 194, 8789, 3589, 534, 4685, 4866, 3,
- 2604, 25392, 4659, 4865, 4686, 4867, 3, 196, 8791, 3588,
- 532, 4660, 4866, 3, 195, 8790, 4661, 4867, 4684, 4865,
- 6, 198, 8793, 207, 37010, 914, 36994, 1964, 659, 3591,
- 538, 4635, 4866, 5, 197, 8792, 915, 36995, 3592, 539,
- 4609, 4865, 4636, 4867, 3, 912, 36992, 3590, 536, 4610,
- 4866, 4, 199, 8794, 913, 36993, 4611, 4867, 4634, 4865,
- 1, 4585, 4866, 5, 200, 8796, 918, 36999, 1967, 662,
- 4559, 4865, 4586, 4867, 4, 916, 36996, 1966, 661, 3593,
- 540, 4560, 4866, 4, 917, 36997, 1965, 660, 4561, 4867,
- 4584, 4865, 3, 2103, 40993, 3370, 544, 3594, 546, 1,
- 2102, 40992, 1, 2105, 40995, 2, 2104, 40994, 3371, 547,
- 2, 3372, 548, 3596, 550, 2, 2106, 40996, 2601, 25344,
- 2, 2108, 40999, 3595, 548, 1, 2107, 40998, 1, 3599,
- 554, 2, 2109, 41000, 3600, 555, 1, 3597, 552, 1,
- 3598, 553, 1, 3602, 558, 2, 2736, 661, 3601, 556,
- 1, 2735, 660, 2, 3373, 560, 3604, 562, 1, 2110,
-41008, 2, 2734, 649, 3603, 560, 3, 1801, 37017, 2111,
-41010, 2733, 648, 1, 3606, 566, 1, 2602, 25360, 1,
- 3605, 564, 1, 2729, 642, 1, 3607, 568, 1, 2732,
- 647, 1, 2731, 645, 1, 2730, 644, 3, 110, 772,
- 1293, 37221, 3805, 512, 3, 111, 773, 1292, 37220, 2968,
- 4920, 4, 112, 774, 1294, 37223, 2598, 25312, 3806, 514,
- 2, 113, 775, 2969, 4922, 3, 106, 768, 948, 37209,
- 1289, 37217, 1, 107, 769, 2, 108, 770, 1291, 37219,
- 2, 109, 771, 1290, 37218, 3, 947, 37205, 1578, 800,
- 2473, 4881, 1, 2472, 4880, 2, 945, 37201, 1984, 832,
- 1, 1579, 805, 1, 946, 37202, 3, 1580, 824, 2600,
-25330, 3807, 528, 2, 2599, 25328, 3808, 530, 1, 1296,
-37233, 1, 1295, 37232, 1, 1297, 37234, 2, 211, 37204,
- 2471, 4864, 1, 944, 37191, 1, 2967, 4900, 2, 1575,
- 776, 1644, 772, 1, 1576, 777, 1, 2595, 25280, 2,
- 961, 37241, 1640, 768, 2, 960, 37240, 1641, 769, 1,
- 1642, 770, 1, 1643, 771, 2, 957, 37237, 1805, 37189,
- 3, 956, 37236, 2479, 4912, 4314, 37417, 1, 959, 37239,
- 1, 958, 37238, 1, 953, 37233, 1, 952, 37232, 2,
- 955, 37235, 1573, 774, 2, 954, 37234, 1574, 775, 2,
- 1285, 37205, 4315, 37424, 1, 1284, 37204, 2, 1287, 37207,
- 2596, 25296, 1, 1286, 37206, 5, 951, 37225, 1705, 4945,
- 1878, 768, 1920, 770, 2775, 4873, 2, 950, 37224, 1704,
- 4944, 2, 1283, 37203, 1918, 768, 3, 1706, 4946, 1919,
- 769, 2597, 25301, 2, 2475, 4897, 2773, 4869, 2, 2474,
- 4896, 2772, 4868, 1, 2477, 4899, 3, 949, 37222, 2476,
- 4898, 2774, 4870, 1, 2769, 4865, 2, 1288, 37208, 2478,
- 4900, 1, 2771, 4867, 3, 1577, 791, 1707, 4954, 2770,
- 4866, 3, 664, 4884, 755, 21008, 3702, 900, 1, 665,
- 4885, 3, 666, 4886, 756, 21010, 3703, 902, 2, 1974,
- 782, 2593, 25248, 4, 662, 4880, 939, 37144, 2358, 769,
- 3700, 896, 1, 940, 37145, 3, 663, 4882, 2594, 25253,
- 3701, 898, 1, 2162, 41344, 1, 936, 37140, 1, 937,
-37141, 1, 1973, 775, 2, 938, 37143, 1972, 774, 5,
- 667, 4888, 848, 33105, 1282, 37160, 1969, 769, 3704, 904,
- 2, 847, 33104, 1968, 768, 3, 935, 37138, 1971, 771,
- 3705, 906, 2, 1970, 770, 2878, 816, 1, 3708, 916,
- 1, 2447, 776, 2, 2166, 41365, 3709, 918, 1, 2165,
-41364, 3, 659, 4864, 2164, 41363, 3706, 912, 3, 660,
- 4865, 1979, 792, 2163, 41362, 2, 661, 4866, 3707, 914,
- 1, 931, 37124, 3, 932, 37125, 1977, 788, 2443, 768,
- 1, 933, 37126, 3, 934, 37127, 1978, 790, 2444, 770,
- 2, 928, 37120, 3710, 920, 3, 929, 37121, 1975, 784,
- 2445, 772, 3, 1451, 4912, 1804, 37170, 3711, 922, 4,
- 930, 37123, 1976, 786, 2446, 774, 2877, 800, 1, 3714,
- 932, 1, 2750, 796, 1, 3715, 934, 2, 2592, 25216,
- 2751, 798, 3, 1703, 4864, 1802, 37128, 3712, 928, 1,
- 2748, 792, 1, 3713, 930, 2, 2749, 794, 2876, 792,
- 3, 210, 37156, 1581, 833, 3718, 940, 3, 1982, 804,
- 2747, 788, 2875, 790, 1, 2874, 788, 3, 1981, 801,
- 2745, 785, 3716, 936, 5, 208, 37153, 1582, 836, 1980,
- 800, 2744, 784, 2873, 786, 2, 1449, 4864, 3717, 938,
- 3, 209, 37155, 2746, 786, 2872, 784, 1, 2742, 781,
- 1, 2741, 780, 2, 1281, 37142, 2743, 783, 2, 668,
- 4896, 2739, 777, 2, 1279, 37137, 2738, 776, 3, 1280,
-37139, 2740, 778, 2871, 776, 2, 941, 37157, 2870, 774,
- 1, 942, 37158, 3, 943, 37159, 2737, 774, 2869, 772,
- 1, 1803, 37136, 2, 1983, 816, 2868, 770, 1, 1450,
- 4880, 1, 2867, 768, 2, 2589, 25184, 4445, 512, 1,
- 3683, 838, 1, 4470, 512, 1, 3682, 836, 1, 4495,
- 512, 2, 2590, 25189, 3681, 834, 1, 4520, 512, 1,
- 3680, 832, 1, 4345, 512, 1, 4370, 512, 1, 3686,
- 844, 1, 4395, 512, 1, 3685, 842, 1, 4420, 512,
- 1, 3684, 840, 2, 2591, 25200, 4645, 512, 1, 3690,
- 854, 1, 4670, 512, 1, 3689, 852, 1, 4695, 512,
- 1, 3688, 850, 1, 4720, 512, 1, 3687, 848, 1,
- 4545, 512, 1, 4570, 512, 1, 4595, 512, 1, 3692,
- 858, 1, 4620, 512, 1, 3691, 856, 1, 3696, 870,
- 2, 2154, 41319, 3695, 868, 1, 2150, 41312, 2, 2151,
-41313, 3694, 866, 1, 2152, 41314, 2, 2153, 41315, 3693,
- 864, 1, 2155, 41320, 1, 2156, 41322, 1, 2161, 41332,
- 1, 3699, 884, 1, 2157, 41328, 2, 2158, 41329, 3698,
- 882, 1, 2159, 41330, 2, 2160, 41331, 3697, 880, 5,
- 2216, 57345, 2582, 25121, 3661, 774, 4455, 4608, 4482, 4610,
- 2, 4456, 4609, 4483, 4611, 4, 2584, 25123, 3660, 772,
- 4457, 4610, 4480, 4608, 3, 2583, 25122, 4458, 4611, 4481,
- 4609, 4, 2586, 25125, 3659, 770, 4505, 4608, 4532, 4610,
- 4, 2217, 57348, 2585, 25124, 4506, 4609, 4533, 4611, 3,
- 972, 37272, 4507, 4610, 4530, 4608, 5, 973, 37273, 2218,
-57350, 2587, 25126, 4508, 4611, 4531, 4609, 3, 970, 37270,
- 4355, 4608, 4382, 4610, 5, 971, 37271, 2219, 57352, 3666,
- 783, 4356, 4609, 4383, 4611, 3, 3664, 780, 4357, 4610,
- 4380, 4608, 4, 969, 37269, 3665, 781, 4358, 4611, 4381,
- 4609, 3, 3663, 778, 4405, 4608, 4432, 4610, 2, 4406,
- 4609, 4433, 4611, 3, 3662, 776, 4407, 4610, 4430, 4608,
- 2, 4408, 4611, 4431, 4609, 4, 2221, 57361, 3669, 790,
- 4655, 4608, 4682, 4610, 4, 2220, 57360, 2588, 25136, 4656,
- 4609, 4683, 4611, 3, 3668, 788, 4657, 4610, 4680, 4608,
- 2, 4658, 4611, 4681, 4609, 3, 3667, 786, 4705, 4608,
- 4732, 4610, 3, 2137, 41232, 4706, 4609, 4733, 4611, 2,
- 4707, 4610, 4730, 4608, 3, 2138, 41234, 4708, 4611, 4731,
- 4609, 3, 968, 37254, 4555, 4608, 4582, 4610, 2, 4556,
- 4609, 4583, 4611, 3, 966, 37252, 4557, 4610, 4580, 4608,
- 3, 967, 37253, 4558, 4611, 4581, 4609, 3, 964, 37250,
- 4605, 4608, 4632, 4610, 3, 965, 37251, 4606, 4609, 4633,
- 4611, 4, 962, 37248, 3670, 792, 4607, 4610, 4630, 4608,
- 3, 963, 37249, 4608, 4611, 4631, 4609, 2, 2144, 41253,
- 2223, 57377, 2, 2143, 41252, 2222, 57376, 1, 2225, 57379,
- 1, 2224, 57378, 3, 2140, 41249, 2227, 57381, 3672, 802,
- 2, 2139, 41248, 2226, 57380, 2, 2142, 41251, 3671, 800,
- 1, 2141, 41250, 1, 3109, 886, 2, 2229, 57393, 3676,
- 822, 2, 2228, 57392, 2581, 25104, 1, 3675, 820, 1,
- 2147, 41270, 1, 3674, 818, 1, 2145, 41264, 1, 3673,
- 816, 1, 2146, 41266, 1, 3679, 828, 1, 3678, 826,
- 1, 2148, 41272, 1, 3677, 824, 1, 2149, 41274, 1,
- 3036, 16, 1, 1469, 5234, 1, 1468, 5232, 1, 2481,
- 5121, 2, 2480, 5120, 3037, 21, 1, 2648, 26096, 2,
- 1463, 5219, 1986, 1088, 2, 1987, 1089, 2038, 5120, 1,
- 1462, 5216, 1, 1466, 5223, 2, 1465, 5222, 3035, 5,
- 1, 1464, 5221, 1, 678, 5200, 1, 1467, 5224, 1,
- 2647, 26080, 1, 1459, 5202, 1, 1458, 5200, 1, 1460,
- 5204, 2, 1650, 1040, 1879, 1024, 2, 679, 5216, 1651,
- 1041, 1, 1652, 1042, 2, 1461, 5208, 1653, 1043, 1,
- 2646, 26064, 2, 1456, 5187, 3038, 32, 1, 1457, 5189,
- 1, 1645, 1024, 2, 680, 5232, 1646, 1025, 1, 1647,
- 1026, 1, 1648, 1027, 1, 1649, 1028, 2, 1150, 38401,
- 2885, 1058, 2, 1151, 38402, 2884, 1057, 2, 1152, 38403,
- 2883, 1056, 5, 20, 5136, 1153, 38404, 1455, 5174, 2887,
- 1063, 4317, 272, 2, 1154, 38405, 2448, 1024, 2, 1155,
-38406, 4318, 274, 2, 1156, 38407, 2886, 1060, 1, 669,
- 5120, 1, 670, 5121, 1, 671, 5122, 1, 672, 5123,
- 1, 673, 5124, 1, 674, 5125, 1, 2645, 26032, 4,
- 1454, 5155, 1985, 1024, 2451, 1044, 2889, 1074, 1, 1453,
- 5152, 1, 2888, 1072, 2, 19, 5120, 4316, 256, 1,
- 2449, 1040, 2, 2450, 1042, 2890, 1076, 1, 675, 5137,
- 1, 676, 5138, 1, 677, 5139, 1, 2644, 26016, 1,
- 2752, 1025, 1, 2880, 1026, 1, 2754, 1027, 2, 2753,
- 1026, 2879, 1024, 2, 22, 5168, 2756, 1029, 2, 2755,
- 1028, 2882, 1030, 1, 23, 5170, 2, 1452, 5141, 2881,
- 1028, 1, 1721, 5136, 1, 2643, 26000, 1, 1715, 5128,
- 1, 1716, 5131, 2, 21, 5152, 1717, 5132, 1, 1718,
- 5133, 1, 1719, 5134, 1, 1720, 5135, 1, 1708, 5121,
- 1, 1709, 5122, 1, 1710, 5123, 1, 1711, 5124, 1,
- 1712, 5125, 1, 1713, 5126, 1, 1714, 5127, 1, 3742,
- 1107, 1, 3741, 1106, 1, 3740, 1105, 1, 3739, 1104,
- 1, 3150, 1280, 1, 3738, 1091, 1, 3737, 1090, 1,
- 3736, 1089, 1, 3735, 1088, 1, 2642, 25952, 1, 2641,
-25936, 1, 2640, 25925, 1, 2639, 25920, 2, 4180, 9472,
- 4612, 5376, 2, 4206, 9472, 4637, 5376, 2, 4128, 9472,
- 4562, 5376, 2, 4154, 9472, 4587, 5376, 3, 3722, 1042,
- 4284, 9472, 4712, 5376, 4, 681, 5248, 3721, 1040, 4310,
- 9472, 4737, 5376, 2, 4232, 9472, 4662, 5376, 1, 2638,
-25904, 2, 4258, 9472, 4687, 5376, 2, 3972, 9472, 4412,
- 5376, 1, 2050, 9216, 2, 3998, 9472, 4437, 5376, 2,
- 3920, 9472, 4362, 5376, 2, 3946, 9472, 4387, 5376, 4,
- 2201, 42497, 3720, 1026, 4076, 9472, 4512, 5376, 1, 2200,
-42496, 4, 682, 5264, 2202, 42499, 4102, 9472, 4537, 5376,
- 2, 683, 5265, 3719, 1025, 2, 4024, 9472, 4462, 5376,
- 1, 2637, 25888, 2, 4050, 9472, 4487, 5376, 1, 684,
- 5269, 1, 3730, 1074, 1, 3731, 1075, 1, 3729, 1073,
- 1, 3734, 1078, 1, 2636, 25872, 1, 3732, 1076, 1,
- 3733, 1077, 1, 1266, 13313, 1, 1267, 13314, 1, 1268,
-13315, 1, 1269, 13316, 1, 1270, 13317, 1, 1271, 13318,
- 1, 3725, 1058, 1, 3726, 1059, 1, 3723, 1056, 1,
- 3724, 1057, 1, 2635, 25856, 1, 3727, 1060, 1, 3728,
- 1061, 2, 2000, 1364, 4322, 4112, 2, 2001, 1365, 3042,
- 277, 1, 2002, 1366, 3, 1996, 1360, 3031, 1040, 3041,
- 272, 2, 1180, 38720, 1997, 1361, 1, 1998, 1362, 1,
- 1999, 1363, 1, 2634, 25840, 1, 1181, 38729, 1, 1183,
-38741, 1, 3040, 261, 1, 1184, 38742, 3, 1182, 38737,
- 3039, 256, 4319, 4100, 1, 4320, 4102, 1, 4321, 4106,
- 1, 1186, 38745, 1, 1185, 38744, 2, 1192, 38757, 2779,
- 5381, 1, 1191, 38756, 2, 1194, 38759, 2780, 5383, 1,
- 1193, 38758, 2, 1188, 38753, 2776, 5377, 1, 1187, 38752,
- 2, 1190, 38755, 2778, 5379, 2, 1189, 38754, 2777, 5378,
- 1, 2783, 5389, 1, 2782, 5388, 1, 2633, 25808, 2,
- 1196, 38761, 1880, 1280, 2, 1195, 38760, 2781, 5384, 1,
- 1881, 1282, 1, 3033, 1060, 1, 3034, 1062, 5, 1198,
-38769, 2004, 1376, 2784, 5393, 3032, 1056, 3043, 288, 1,
- 1197, 38768, 1, 2005, 1378, 2, 1199, 38770, 2785, 5394,
- 1, 2632, 25792, 3, 26, 5392, 1992, 1301, 2453, 1281,
- 2, 27, 5393, 2452, 1280, 1, 28, 5394, 1, 686,
- 5384, 1, 1157, 38657, 2, 1480, 5424, 1991, 1299, 3,
- 1481, 5425, 1990, 1298, 2896, 1312, 1, 29, 5402, 1,
- 685, 5376, 1, 1993, 1304, 1, 1994, 1306, 2, 24,
- 5376, 1476, 5414, 2, 1158, 38677, 1477, 5415, 1, 1159,
-38678, 2, 1160, 38679, 1475, 5413, 1, 25, 5380, 1,
- 1988, 1280, 1, 2631, 25760, 2, 687, 5392, 1161, 38680,
- 2, 688, 5393, 1162, 38681, 1, 1478, 5416, 2, 1479,
- 5417, 1989, 1290, 1, 1167, 38692, 2, 1168, 38693, 1473,
- 5399, 1, 1169, 38694, 2, 1170, 38695, 1472, 5397, 2,
- 1163, 38688, 1470, 5394, 2, 1164, 38689, 1471, 5395, 1,
- 1165, 38690, 2, 1166, 38691, 2891, 1280, 1, 2630, 25744,
- 1, 689, 5408, 2, 690, 5409, 1171, 38697, 1, 1474,
- 5400, 1, 1174, 38708, 2, 1175, 38709, 2895, 1302, 1,
- 1176, 38710, 2, 1177, 38711, 2894, 1300, 2, 1995, 1312,
- 2893, 1298, 1, 1172, 38706, 2, 1173, 38707, 2892, 1296,
- 2, 691, 5424, 1178, 38712, 2, 692, 5425, 1179, 38713,
- 2, 3086, 1296, 3110, 1280, 1, 2629, 25712, 2, 3085,
- 1280, 3111, 1296, 2, 2206, 42820, 2628, 25696, 1, 3112,
- 1312, 1, 2627, 25680, 1, 2626, 25664, 1, 3140, 1280,
- 1, 2625, 25648, 1, 2003, 1434, 1, 3137, 1280, 1,
- 2624, 25632, 1, 2623, 25616, 1, 2204, 42801, 1, 2203,
-42800, 1, 2205, 42802, 1, 2622, 25600, 2, 221, 37977,
- 1088, 37961, 2, 220, 37976, 1817, 38008, 1, 1085, 37953,
- 1, 1084, 37952, 1, 1086, 37954, 1, 1816, 38004, 1,
- 1087, 37959, 1, 1089, 37969, 1, 1090, 37970, 1, 1091,
-37973, 1, 1093, 37975, 1, 1092, 37974, 1, 1102, 37993,
- 2, 1101, 37992, 1333, 37968, 1, 1334, 37971, 1, 1094,
-37985, 1, 1096, 37987, 1, 1095, 37986, 1, 1098, 37989,
- 2, 1097, 37988, 1815, 37972, 1, 1100, 37991, 1, 1099,
-37990, 1, 1104, 38001, 2, 222, 37984, 1103, 38000, 2,
- 1106, 38003, 1811, 37955, 1, 1105, 38002, 1, 1813, 37957,
- 2, 1107, 38004, 1812, 37956, 1, 1109, 38007, 2, 1108,
-38006, 1814, 37958, 2, 693, 5632, 2195, 42131, 1, 2194,
-42130, 2, 694, 5634, 2193, 42129, 1, 695, 5636, 1,
- 2197, 42134, 1, 696, 5638, 1, 2196, 42132, 2, 219,
-37904, 697, 5640, 2, 1057, 37889, 2008, 1552, 1, 1058,
-37890, 2, 1059, 37891, 2009, 1554, 1, 1060, 37892, 1,
- 1061, 37893, 1, 1062, 37894, 1, 1063, 37895, 1, 698,
- 5648, 1, 1332, 37921, 1, 699, 5650, 1, 1064, 37904,
- 1, 2006, 1536, 2, 1065, 37906, 1810, 37922, 1, 2007,
- 1538, 1, 30, 5632, 1, 1066, 37911, 2, 700, 5664,
- 1073, 37928, 1, 1074, 37929, 1, 701, 5666, 1, 702,
- 5667, 1, 703, 5668, 1, 1067, 37920, 2, 1807, 37905,
- 2898, 1538, 2, 1068, 37923, 2897, 1536, 1, 1069, 37924,
- 2, 1070, 37925, 1808, 37909, 2, 1071, 37926, 1809, 37910,
- 2, 1072, 37927, 2899, 1540, 1, 1082, 37944, 2, 277,
-37937, 1083, 37945, 1, 1075, 37936, 1, 2010, 1568, 1,
- 1076, 37938, 1, 1077, 37939, 1, 1078, 37940, 1, 1079,
-37941, 1, 1080, 37942, 1, 1081, 37943, 1, 2011, 1786,
- 1, 2191, 41987, 1, 2190, 41986, 1, 2192, 41988, 2,
- 1139, 38217, 1661, 1840, 1, 1138, 38216, 1, 1135, 38213,
- 1, 1134, 38212, 1, 1137, 38215, 1, 1136, 38214, 2,
- 1131, 38209, 3045, 784, 1, 1133, 38211, 1, 1132, 38210,
- 2, 1149, 38233, 1658, 1824, 2, 1148, 38232, 1659, 1825,
- 2, 1660, 1826, 2015, 1866, 1, 1145, 38229, 2, 1144,
-38228, 3044, 773, 1, 1147, 38231, 1, 1146, 38230, 1,
- 1141, 38225, 1, 1140, 38224, 1, 1143, 38227, 1, 1142,
-38226, 1, 1657, 1808, 1, 1654, 1792, 1, 1655, 1793,
- 1, 1656, 1794, 1, 706, 5892, 2, 707, 5894, 1337,
-38198, 2, 704, 5888, 1113, 38152, 1, 1114, 38153, 1,
- 705, 5890, 1, 2012, 1818, 2, 1110, 38148, 4323, 16,
- 1, 1111, 38150, 2, 1112, 38151, 1825, 38199, 1, 708,
- 5896, 2, 709, 5904, 1121, 38168, 1, 1122, 38169, 1,
- 710, 5906, 1, 1117, 38164, 1, 1118, 38165, 1, 1119,
-38166, 1, 1120, 38167, 2, 1115, 38160, 1824, 38176, 2,
- 1116, 38161, 1336, 38185, 2, 711, 5920, 1127, 38184, 1,
- 2014, 1850, 1, 1123, 38180, 2, 1124, 38181, 2904, 1798,
- 2, 1125, 38182, 2903, 1797, 2, 1126, 38183, 2902, 1796,
- 1, 1335, 38168, 1, 2901, 1794, 1, 2900, 1792, 1,
- 1130, 38200, 1, 1662, 1856, 2, 2013, 1834, 2910, 1816,
- 2, 2909, 1815, 4324, 32, 2, 1821, 38149, 2908, 1814,
- 1, 1822, 38150, 2, 1823, 38151, 2907, 1812, 1, 1128,
-38192, 3, 1129, 38193, 1818, 38145, 2906, 1810, 1, 1819,
-38146, 2, 1820, 38147, 2905, 1808, 2, 4026, 9744, 4233,
- 9728, 2, 4052, 9744, 4259, 9728, 2, 4078, 9744, 4285,
- 9728, 2, 4104, 9744, 4311, 9728, 2, 3922, 9744, 4129,
- 9728, 2, 3948, 9744, 4155, 9728, 2, 3974, 9744, 4181,
- 9728, 2, 4000, 9744, 4207, 9728, 2, 4025, 9728, 4234,
- 9744, 2, 2198, 42244, 2650, 26144, 2, 4051, 9728, 4260,
- 9744, 2, 4077, 9728, 4286, 9744, 2, 4103, 9728, 4312,
- 9744, 2, 3921, 9728, 4130, 9744, 2, 3947, 9728, 4156,
- 9744, 2, 3973, 9728, 4182, 9744, 2, 3999, 9728, 4208,
- 9744, 1, 2649, 26128, 1, 2199, 42277, 2, 1667, 2072,
- 2786, 6145, 1, 2788, 6147, 1, 2787, 6146, 1, 2790,
- 6149, 1, 2789, 6148, 1, 2792, 6151, 1, 2791, 6150,
- 1, 1663, 2064, 1, 2793, 6152, 1, 1664, 2066, 1,
- 1665, 2067, 1, 1666, 2068, 1, 2214, 56077, 1, 2213,
-56076, 1, 2212, 56075, 1, 2211, 56071, 1, 2210, 56070,
- 1, 2209, 56064, 1, 2215, 56179, 1, 712, 6144, 1,
- 713, 6145, 1, 714, 6146, 1, 715, 6147, 1, 2018,
- 2282, 1, 2017, 2266, 1, 2016, 2264, 1, 2797, 6405,
- 1, 2796, 6404, 1, 2798, 6407, 1, 2794, 6401, 1,
- 2795, 6403, 1, 2019, 2552, 3, 4346, 2048, 4372, 2050,
- 4399, 2052, 1, 4373, 2051, 3, 4347, 2050, 4371, 2048,
- 4424, 2052, 1, 4348, 2051, 3, 4349, 2052, 4396, 2048,
- 4422, 2050, 1, 4423, 2051, 3, 4374, 2052, 4397, 2050,
- 4421, 2048, 1, 4398, 2051, 4, 3028, 2310, 4446, 2048,
- 4472, 2050, 4499, 2052, 1, 4473, 2051, 4, 3027, 2308,
- 4447, 2050, 4471, 2048, 4524, 2052, 1, 4448, 2051, 3,
- 4449, 2052, 4496, 2048, 4522, 2050, 1, 4523, 2051, 3,
- 4474, 2052, 4497, 2050, 4521, 2048, 1, 4498, 2051, 3,
- 4546, 2048, 4572, 2050, 4599, 2052, 1, 4573, 2051, 3,
- 4547, 2050, 4571, 2048, 4624, 2052, 1, 4548, 2051, 3,
- 4549, 2052, 4596, 2048, 4622, 2050, 1, 4623, 2051, 3,
- 4574, 2052, 4597, 2050, 4621, 2048, 1, 4598, 2051, 3,
- 4646, 2048, 4672, 2050, 4699, 2052, 1, 4673, 2051, 3,
- 4647, 2050, 4671, 2048, 4724, 2052, 1, 4648, 2051, 4,
- 3030, 2322, 4649, 2052, 4696, 2048, 4722, 2050, 1, 4723,
- 2051, 4, 3029, 2320, 4674, 2052, 4697, 2050, 4721, 2048,
- 1, 4698, 2051, 1, 1668, 2562, 1, 1669, 2564, 1,
- 2799, 6657, 1, 2800, 6659, 1, 2802, 6661, 1, 2801,
- 6660, 1, 1213, 38928, 1, 1206, 38920, 1, 1207, 38921,
- 1, 1208, 38923, 1, 1209, 38924, 1, 1210, 38925, 1,
- 1211, 38926, 1, 1212, 38927, 1, 1200, 38913, 1, 1201,
-38915, 1, 1202, 38916, 1, 1203, 38917, 1, 1204, 38918,
- 1, 1205, 38919, 1, 2207, 43410, 1, 4742, 16, 1,
- 4741, 9, 1, 4740, 8, 1, 4744, 48, 1, 1797,
-32736, 1, 4743, 32, 1, 4745, 64, 1, 4750, 64,
- 1, 3897, 1, 1, 4749, 48, 1, 4748, 32, 1,
- 4746, 16, 1, 4747, 17, 1, 4755, 57565, 1, 4753,
-57344, 1, 4754, 57357,
+ 34, 8, 126, 4169, 228, 16, 1020, 37457, 1263, 32,
+ 1403, 34, 1523, 36, 1863, 50, 2054, 4097, 2304, 70,
+ 2894, 114, 3213, 162, 3902, 16384, 3915, 268, 4871, 65530,
+ 4872, 65532, 11, 3, 3, 125, 4168, 264, 4176, 1019,
+37456, 1524, 37, 1864, 51, 2895, 115, 2991, 4148, 3140,
+ 1025, 3374, 196, 3559, 200, 10, 0, 0, 297, 16,
+ 1022, 37459, 1264, 34, 1401, 32, 2056, 4099, 2303, 68,
+ 2892, 112, 3141, 1026, 3212, 160, 10, 1, 1, 1021,
+37458, 1402, 33, 1885, 4208, 2055, 4098, 2893, 113, 2992,
+ 4150, 3142, 1027, 3375, 198, 3560, 202, 9, 1024, 37461,
+ 1265, 36, 1521, 32, 2058, 4101, 2302, 66, 2461, 80,
+ 2898, 118, 3143, 1028, 3911, 264, 9, 1023, 37460, 1443,
+ 4198, 1522, 33, 2057, 4100, 2462, 81, 2989, 4144, 3372,
+ 192, 3561, 204, 3912, 265, 10, 1026, 37463, 1266, 38,
+ 1442, 4197, 1865, 52, 2060, 4103, 2301, 64, 2463, 82,
+ 2896, 116, 3058, 112, 3913, 266, 9, 1025, 37462, 1866,
+ 53, 2059, 4102, 2464, 83, 2897, 117, 2990, 4146, 3373,
+ 194, 3562, 206, 3914, 267, 7, 509, 16, 1028, 37465,
+ 1900, 48, 2062, 4105, 2900, 122, 3074, 112, 3930, 16384,
+ 6, 31, 1, 124, 4160, 593, 4176, 1027, 37464, 2061,
+ 4104, 3552, 192, 6, 510, 18, 1030, 37467, 1404, 40,
+ 1901, 50, 2899, 120, 3554, 195, 5, 511, 19, 1029,
+37466, 2063, 4106, 3430, 192, 3553, 194, 6, 512, 20,
+ 1032, 37469, 1525, 40, 2902, 126, 3556, 197, 3907, 256,
+ 8, 32, 5, 513, 21, 1031, 37468, 2903, 127, 2993,
+ 4152, 3376, 200, 3555, 196, 3908, 257, 5, 33, 6,
+ 1034, 37471, 2901, 124, 3558, 199, 3909, 258, 5, 1033,
+37470, 2994, 4154, 3557, 198, 3884, 192, 3910, 259, 12,
+ 5, 18, 41, 24, 592, 4169, 1018, 37441, 1267, 48,
+ 1407, 50, 1528, 52, 2065, 4113, 2720, 96, 2878, 98,
+ 2981, 4133, 3572, 217, 11, 6, 19, 263, 4160, 591,
+ 4168, 1017, 37440, 1292, 4208, 1529, 53, 2064, 4112, 2498,
+ 4100, 2879, 99, 2980, 4132, 3571, 216, 10, 4, 16,
+ 42, 26, 1268, 50, 1405, 48, 1530, 54, 2721, 98,
+ 2876, 96, 2983, 4135, 3188, 128, 3574, 219, 9, 43,
+ 27, 1406, 49, 1531, 55, 1883, 4192, 2066, 4114, 2499,
+ 4102, 2877, 97, 2982, 4134, 3573, 218, 7, 7, 22,
+ 1409, 54, 2306, 82, 2496, 4097, 2882, 102, 3576, 221,
+ 3922, 280, 9, 8, 23, 343, 4160, 1269, 53, 1410,
+ 55, 2495, 4096, 2883, 103, 2978, 4128, 3575, 220, 3923,
+ 281, 6, 1526, 50, 2305, 80, 2722, 102, 2880, 100,
+ 3057, 96, 3924, 282, 9, 1270, 55, 1408, 53, 1527,
+ 51, 1884, 4196, 2497, 4098, 2723, 103, 2881, 101, 2979,
+ 4130, 3577, 222, 11, 35, 16, 584, 4161, 1629, 48,
+ 1898, 32, 2133, 37393, 2724, 104, 2886, 106, 2988, 4141,
+ 3073, 96, 3564, 209, 3919, 276, 9, 127, 4176, 583,
+ 4160, 1630, 49, 1899, 33, 2132, 37392, 2887, 107, 2987,
+ 4140, 3563, 208, 3920, 277, 9, 9, 24, 36, 18,
+ 586, 4163, 1411, 56, 1631, 50, 1921, 32, 2135, 37395,
+ 2884, 104, 3566, 211, 9, 37, 19, 128, 4178, 585,
+ 4162, 1412, 57, 2134, 37394, 2885, 105, 3431, 208, 3565,
+ 210, 3921, 279, 6, 38, 20, 588, 4165, 1532, 56,
+ 1632, 52, 2890, 110, 3568, 213, 8, 39, 21, 587,
+ 4164, 1533, 57, 2136, 37396, 2891, 111, 2984, 4136, 3567,
+ 212, 3916, 273, 6, 40, 22, 590, 4167, 2888, 108,
+ 2986, 4139, 3570, 215, 3917, 274, 7, 589, 4166, 2137,
+37398, 2889, 109, 2985, 4138, 3569, 214, 3885, 208, 3918,
+ 275, 14, 236, 48, 323, 52, 533, 56, 616, 4217,
+ 1291, 4161, 1342, 37449, 1373, 2, 1622, 8, 1862, 18,
+ 1920, 26, 2715, 80, 2871, 82, 3176, 162, 3587, 233,
+ 8, 534, 57, 615, 4216, 1290, 4160, 1341, 37448, 1374,
+ 3, 1623, 9, 2716, 81, 3586, 232, 12, 50, 42,
+ 237, 50, 300, 48, 535, 58, 1624, 10, 1881, 4177,
+ 1893, 26, 2310, 100, 2717, 82, 2870, 80, 3174, 160,
+ 3589, 235, 10, 238, 51, 301, 49, 1372, 1, 1436,
+ 4160, 1880, 4176, 1894, 27, 2718, 83, 3056, 85, 3175,
+ 161, 3588, 234, 9, 239, 52, 321, 48, 1377, 6,
+ 1895, 28, 2308, 98, 2469, 112, 2606, 66, 2873, 86,
+ 3591, 237, 7, 240, 53, 1378, 7, 1896, 29, 2309,
+ 99, 2470, 113, 2607, 67, 3590, 236, 10, 322, 50,
+ 1375, 4, 1882, 4181, 1897, 30, 2307, 96, 2471, 114,
+ 2604, 64, 2872, 84, 3177, 164, 3593, 239, 5, 1376,
+ 5, 1437, 4164, 2472, 115, 2605, 65, 3592, 238, 9,
+ 44, 32, 525, 48, 608, 4209, 1337, 37441, 1381, 10,
+ 1705, 4161, 1889, 16, 3072, 80, 3579, 225, 9, 45,
+ 33, 129, 4192, 526, 49, 607, 4208, 1382, 11, 1704,
+ 4160, 1890, 17, 2138, 37408, 3578, 224, 9, 46, 34,
+ 527, 50, 610, 4211, 1379, 8, 1617, 2, 1919, 16,
+ 2719, 90, 3178, 168, 3581, 227, 8, 47, 35, 130,
+ 4194, 528, 51, 609, 4210, 1380, 9, 1618, 3, 3432,
+ 224, 3580, 226, 10, 48, 36, 529, 52, 612, 4213,
+ 1338, 37445, 1385, 14, 1619, 4, 1891, 20, 2140, 37413,
+ 2874, 94, 3583, 229, 8, 49, 37, 530, 53, 611,
+ 4212, 1251, 13, 1620, 5, 2139, 37412, 2875, 95, 3582,
+ 228, 8, 531, 54, 614, 4215, 1252, 14, 1340, 37447,
+ 1383, 12, 1621, 6, 1892, 22, 3585, 231, 6, 532,
+ 55, 613, 4214, 1339, 37446, 1384, 13, 3584, 230, 3886,
+ 224, 11, 229, 32, 318, 36, 522, 40, 603, 4201,
+ 1253, 16, 1388, 18, 1439, 4179, 1888, 8, 2315, 118,
+ 2712, 64, 3602, 249, 12, 230, 33, 265, 4192, 319,
+ 37, 523, 41, 602, 4200, 1035, 37472, 1254, 17, 1389,
+ 19, 2316, 119, 2713, 65, 2972, 4100, 3601, 248, 11,
+ 231, 34, 298, 32, 524, 42, 1255, 18, 1386, 16,
+ 1519, 22, 1879, 4161, 2313, 116, 2714, 66, 2869, 64,
+ 3604, 251, 9, 299, 33, 604, 4202, 1256, 19, 1387,
+ 17, 1438, 4176, 1878, 4160, 2314, 117, 2973, 4102, 3603,
+ 250, 6, 232, 36, 1257, 20, 1392, 22, 1516, 16,
+ 2465, 96, 3189, 166, 8, 605, 4204, 1258, 21, 1393,
+ 23, 1517, 17, 2466, 97, 2970, 4096, 3190, 167, 3605,
+ 252, 7, 233, 38, 1259, 22, 1390, 20, 1518, 18,
+ 2311, 112, 2467, 98, 3055, 64, 10, 234, 39, 317,
+ 35, 606, 4206, 1260, 23, 1391, 21, 1440, 4180, 2312,
+ 113, 2468, 99, 2971, 4098, 3606, 254, 10, 51, 48,
+ 235, 40, 514, 32, 595, 4193, 1261, 24, 1344, 37457,
+ 1396, 26, 1625, 16, 1707, 4177, 1860, 10, 13, 52,
+ 49, 131, 4208, 515, 33, 594, 4192, 1262, 25, 1343,
+37456, 1397, 27, 1626, 17, 1706, 4176, 2976, 4108, 3434,
+ 242, 3594, 240, 3890, 246, 10, 53, 50, 516, 34,
+ 597, 4195, 1346, 37459, 1394, 24, 1441, 4185, 1627, 18,
+ 1709, 4179, 3191, 168, 3596, 243, 12, 54, 51, 132,
+ 4210, 517, 35, 596, 4194, 1345, 37458, 1395, 25, 1708,
+ 4178, 2977, 4110, 3192, 169, 3433, 240, 3595, 242, 3889,
+ 244, 11, 55, 52, 320, 40, 518, 36, 599, 4197,
+ 1348, 37461, 1400, 30, 1520, 24, 1628, 20, 1711, 4181,
+ 1887, 4, 3598, 245, 9, 56, 53, 519, 37, 598,
+ 4196, 1347, 37460, 1710, 4180, 2974, 4104, 3436, 246, 3597,
+ 244, 3888, 242, 8, 520, 38, 601, 4199, 1350, 37463,
+ 1398, 28, 1783, 24976, 1861, 12, 1917, 4, 3600, 247,
+ 10, 521, 39, 600, 4198, 1349, 37462, 1399, 29, 1712,
+ 4182, 1918, 5, 2975, 4106, 3435, 244, 3599, 246, 3887,
+ 240, 20, 259, 4112, 493, 20752, 575, 4120, 1289, 4128,
+ 1335, 37416, 1555, 101, 1644, 105, 1875, 4146, 1955, 1,
+ 2426, 19, 2447, 21, 2587, 39, 3153, 0, 3358, 132,
+ 3528, 136, 4025, 260, 4053, 262, 4238, 276, 4288, 272,
+ 4315, 274, 22, 242, 80, 330, 84, 494, 20753, 576,
+ 4121, 1273, 96, 1554, 100, 1643, 104, 1876, 4147, 2279,
+ 4, 2374, 8, 2401, 16, 2425, 18, 2446, 20, 2586,
+ 38, 2863, 50, 3053, 54, 3154, 1, 3228, 130, 3359,
+ 133, 3529, 137, 4026, 261, 4102, 259, 20, 305, 81,
+ 495, 20754, 577, 4122, 1557, 103, 1873, 4144, 1957, 3,
+ 2280, 7, 2403, 19, 2424, 17, 2449, 23, 2548, 33,
+ 2585, 37, 3155, 2, 3360, 134, 3530, 138, 4027, 262,
+ 4051, 260, 4264, 276, 4289, 274, 4314, 272, 19, 304,
+ 80, 331, 86, 496, 20755, 578, 4123, 1274, 98, 1556,
+ 102, 1874, 4145, 1956, 2, 2402, 18, 2448, 22, 2547,
+ 32, 2584, 36, 2862, 48, 3052, 52, 3156, 3, 3227,
+ 128, 3531, 139, 4052, 261, 4076, 259, 17, 341, 4112,
+ 497, 20756, 1005, 37396, 1551, 97, 1959, 5, 2276, 1,
+ 2405, 21, 2443, 17, 2583, 35, 3157, 4, 3356, 128,
+ 3532, 140, 4077, 260, 4105, 262, 4236, 272, 4263, 274,
+ 4290, 276, 13, 217, 37381, 328, 80, 498, 20757, 1550,
+ 96, 1958, 4, 2404, 20, 2428, 22, 2442, 16, 3051,
+ 50, 3158, 5, 3533, 141, 4050, 259, 4078, 261, 17,
+ 218, 37382, 499, 20758, 1428, 4132, 1553, 99, 1877, 4148,
+ 1961, 7, 2278, 3, 2407, 23, 2445, 19, 2582, 33,
+ 3357, 130, 3534, 142, 4079, 262, 4103, 260, 4237, 274,
+ 4262, 272, 4316, 276, 17, 219, 37383, 329, 82, 500,
+20759, 1006, 37399, 1429, 4133, 1552, 98, 1960, 6, 2277,
+ 2, 2406, 22, 2427, 20, 2444, 18, 2581, 32, 2864,
+ 52, 3050, 48, 3535, 143, 4024, 259, 4104, 261, 18,
+ 58, 65, 118, 4096, 220, 37384, 501, 20760, 569, 4112,
+ 1007, 37400, 1638, 97, 1963, 9, 2369, 1, 2409, 25,
+ 2595, 47, 3425, 130, 3524, 128, 4129, 260, 4157, 262,
+ 4342, 276, 4392, 272, 4419, 274, 14, 57, 64, 221,
+37385, 502, 20761, 538, 80, 570, 4113, 1008, 37401, 1333,
+37409, 1637, 96, 1962, 8, 2408, 24, 2594, 46, 2866,
+ 58, 4130, 261, 4206, 259, 16, 503, 20762, 571, 4114,
+ 1334, 37410, 1430, 4136, 1640, 99, 1965, 11, 2371, 3,
+ 2411, 27, 2593, 45, 3424, 128, 3525, 130, 4131, 262,
+ 4155, 260, 4368, 276, 4393, 274, 4418, 272, 11, 59,
+ 66, 504, 20763, 1431, 4137, 1639, 98, 1964, 10, 2370,
+ 2, 2410, 26, 2592, 44, 2865, 56, 4156, 261, 4180,
+ 259, 14, 505, 20764, 572, 4116, 1559, 105, 1641, 101,
+ 2282, 9, 2413, 29, 2591, 43, 3361, 136, 3526, 132,
+ 4181, 260, 4209, 262, 4340, 272, 4367, 274, 4394, 276,
+ 9, 506, 20765, 1558, 104, 2281, 8, 2412, 28, 2450,
+ 24, 2590, 42, 2868, 62, 4154, 259, 4182, 261, 12,
+ 507, 20766, 573, 4118, 2284, 11, 2373, 7, 2589, 41,
+ 3527, 134, 3881, 128, 4183, 262, 4207, 260, 4341, 274,
+ 4366, 272, 4420, 276, 12, 391, 12441, 508, 20767, 574,
+ 4119, 1642, 102, 2283, 10, 2372, 6, 2414, 30, 2588,
+ 40, 2867, 60, 3054, 56, 4128, 259, 4208, 261, 18,
+ 255, 4096, 326, 69, 477, 20736, 568, 4104, 1004, 37376,
+ 1336, 37432, 1565, 117, 1967, 17, 2274, 19, 2418, 3,
+ 2602, 55, 2708, 33, 3159, 0, 4030, 276, 4080, 272,
+ 4107, 274, 4233, 260, 4261, 262, 20, 67, 88, 241,
+ 64, 256, 4097, 303, 66, 325, 68, 478, 20737, 1275,
+ 112, 1432, 4147, 1564, 116, 1966, 16, 2212, 41626, 2273,
+ 18, 2293, 22, 2417, 2, 2601, 54, 2707, 32, 2858,
+ 34, 3069, 40, 4234, 261, 4310, 259, 14, 257, 4098,
+ 479, 20738, 1567, 119, 1871, 4128, 2272, 17, 2292, 21,
+ 2416, 1, 2600, 53, 2710, 35, 4056, 276, 4081, 274,
+ 4106, 272, 4235, 262, 4259, 260, 15, 302, 64, 327,
+ 70, 480, 20739, 1566, 118, 1872, 4129, 1968, 18, 2271,
+ 16, 2291, 20, 2599, 52, 2709, 34, 2857, 32, 3070,
+ 42, 3229, 144, 4260, 261, 4284, 259, 9, 481, 20740,
+ 1561, 113, 2286, 17, 2421, 7, 4028, 272, 4055, 274,
+ 4082, 276, 4285, 260, 4313, 262, 15, 222, 37397, 258,
+ 4101, 482, 20741, 1434, 4151, 1560, 112, 1840, 37429, 2285,
+ 16, 2290, 18, 2400, 4, 2420, 6, 2598, 50, 2711,
+ 36, 2860, 38, 4258, 259, 4286, 261, 10, 390, 12416,
+ 483, 20742, 1563, 115, 2288, 19, 2597, 49, 4029, 274,
+ 4054, 272, 4108, 276, 4287, 262, 4311, 260, 13, 324,
+ 66, 484, 20743, 1433, 4149, 1562, 114, 2275, 20, 2287,
+ 18, 2419, 4, 2596, 48, 2859, 36, 3049, 32, 3071,
+ 46, 4232, 259, 4312, 261, 15, 61, 81, 119, 4112,
+ 485, 20744, 561, 4096, 784, 20740, 1646, 113, 1906, 97,
+ 2376, 17, 3427, 146, 3536, 144, 4134, 276, 4184, 272,
+ 4211, 274, 4337, 260, 4365, 262, 10, 60, 80, 486,
+20745, 536, 64, 1645, 112, 1905, 96, 2375, 16, 3066,
+ 32, 3537, 145, 4338, 261, 4414, 259, 12, 63, 83,
+ 487, 20746, 562, 4098, 2378, 19, 2423, 9, 3426, 144,
+ 3538, 146, 4160, 276, 4185, 274, 4210, 272, 4339, 262,
+ 4363, 260, 12, 62, 82, 488, 20747, 537, 66, 563,
+ 4099, 1435, 4153, 1907, 98, 2209, 41616, 2377, 18, 2422,
+ 8, 2861, 40, 4364, 261, 4388, 259, 13, 65, 85,
+ 489, 20748, 564, 4100, 782, 20736, 1569, 121, 2211, 41623,
+ 2289, 25, 2380, 21, 4132, 272, 4159, 274, 4186, 276,
+ 4389, 260, 4417, 262, 11, 64, 84, 490, 20749, 565,
+ 4101, 783, 20737, 1568, 120, 1908, 100, 2210, 41622, 2379,
+ 20, 3067, 36, 4362, 259, 4390, 261, 7, 491, 20750,
+ 566, 4102, 4133, 274, 4158, 272, 4212, 276, 4391, 262,
+ 4415, 260, 8, 66, 86, 492, 20751, 567, 4103, 2294,
+ 24, 2603, 56, 3068, 38, 4336, 259, 4416, 261, 10,
+ 262, 4144, 1283, 4096, 1537, 69, 2067, 4192, 2436, 51,
+ 2532, 3, 2551, 5, 2703, 17, 3005, 4180, 3363, 164,
+ 10, 72, 104, 311, 114, 1012, 37425, 1284, 4097, 1414,
+ 66, 1536, 68, 1969, 32, 2531, 2, 2702, 16, 2855,
+ 18, 10, 310, 113, 1013, 37426, 1285, 4098, 1413, 65,
+ 1869, 4112, 2435, 49, 2530, 1, 2552, 7, 3006, 4182,
+ 3364, 166, 9, 1286, 4099, 1538, 70, 1870, 4113, 2434,
+ 48, 2458, 54, 2560, 4, 2704, 18, 2854, 16, 3007,
+ 4183, 7, 1014, 37428, 1287, 4100, 2455, 49, 2559, 3,
+ 2706, 21, 3003, 4176, 3362, 160, 8, 1288, 4101, 1422,
+ 4103, 1534, 64, 2438, 54, 2454, 48, 2535, 6, 2558,
+ 2, 2705, 20, 7, 1015, 37430, 1971, 39, 2457, 51,
+ 2534, 5, 2550, 3, 2557, 1, 3004, 4178, 8, 1535,
+ 66, 1970, 38, 2437, 52, 2456, 50, 2533, 4, 2549,
+ 2, 2856, 20, 3048, 16, 5, 69, 97, 541, 113,
+ 582, 4144, 2539, 11, 3539, 160, 9, 68, 96, 540,
+ 112, 1016, 37433, 1633, 64, 1904, 80, 2441, 58, 2538,
+ 10, 2566, 14, 3065, 16, 9, 543, 115, 1416, 73,
+ 1423, 4104, 2440, 57, 2537, 9, 2555, 15, 2565, 13,
+ 3428, 160, 3540, 162, 7, 70, 98, 542, 114, 1415,
+ 72, 1424, 4105, 2439, 56, 2536, 8, 2564, 12, 6,
+ 545, 117, 2460, 57, 2543, 15, 2554, 9, 2563, 11,
+ 3541, 164, 8, 71, 100, 544, 116, 1417, 78, 1539,
+ 72, 2459, 56, 2542, 14, 2553, 8, 2562, 10, 3,
+ 2541, 13, 2561, 9, 3882, 160, 2, 2295, 40, 2540,
+ 12, 11, 260, 4128, 308, 99, 1009, 37408, 1426, 4114,
+ 1545, 85, 1972, 49, 2573, 23, 2694, 1, 2997, 4164,
+ 3367, 180, 3547, 184, 10, 261, 4129, 307, 98, 1271,
+ 80, 1544, 84, 2299, 54, 2415, 32, 2546, 18, 2572,
+ 22, 2847, 2, 3043, 6, 10, 1425, 4112, 1547, 87,
+ 1867, 4096, 1974, 51, 2545, 17, 2571, 21, 2696, 3,
+ 2998, 4166, 3368, 182, 3548, 186, 10, 306, 96, 1272,
+ 82, 1546, 86, 1868, 4097, 1973, 50, 2298, 52, 2544,
+ 16, 2695, 2, 3369, 183, 3549, 187, 12, 342, 4128,
+ 1420, 87, 1541, 81, 1975, 53, 2431, 39, 2452, 33,
+ 2570, 19, 2698, 5, 2995, 4160, 3042, 3, 3365, 176,
+ 3550, 188, 9, 1419, 86, 1540, 80, 2297, 50, 2430,
+ 38, 2451, 32, 2556, 16, 2569, 18, 2697, 4, 2849,
+ 6, 11, 122, 4158, 1010, 37414, 1418, 85, 1543, 83,
+ 1636, 95, 2429, 37, 2568, 17, 2996, 4162, 3041, 1,
+ 3366, 178, 3551, 190, 11, 123, 4159, 223, 37431, 309,
+ 100, 1011, 37415, 1542, 82, 1976, 54, 2296, 48, 2453,
+ 34, 2567, 16, 2699, 6, 2848, 4, 9, 120, 4144,
+ 579, 4128, 1635, 81, 1977, 57, 2580, 31, 2701, 9,
+ 3001, 4172, 3064, 1, 3542, 176, 8, 73, 112, 539,
+ 96, 1634, 80, 1902, 64, 2579, 30, 2700, 8, 2851,
+ 10, 3047, 14, 6, 121, 4146, 580, 4130, 2433, 41,
+ 3002, 4174, 3429, 176, 3543, 178, 10, 581, 4131, 1332,
+37395, 1421, 88, 1427, 4121, 1978, 58, 2432, 40, 2578,
+ 28, 2850, 8, 3046, 12, 3544, 179, 5, 1549, 89,
+ 2577, 27, 2999, 4168, 3370, 184, 3545, 180, 6, 1548,
+ 88, 1903, 68, 2576, 26, 2853, 14, 3045, 10, 3371,
+ 185, 4, 2575, 25, 3000, 4170, 3546, 182, 3883, 176,
+ 4, 2300, 56, 2574, 24, 2852, 12, 3044, 8, 10,
+ 349, 8212, 2085, 12289, 3083, 2, 3181, 16, 3208, 32,
+ 3508, 75, 4484, 16384, 4512, 256, 4538, 258, 4714, 272,
+ 7, 2529, 12320, 3084, 3, 3095, 1, 3298, 66, 3352,
+ 70, 3403, 72, 3507, 74, 7, 350, 8214, 3297, 65,
+ 3351, 69, 4509, 16384, 4513, 258, 4537, 256, 4739, 272,
+ 5, 3082, 1, 3096, 3, 3296, 64, 3350, 68, 3506,
+ 72, 7, 3087, 6, 3097, 4, 3511, 79, 4462, 256,
+ 4488, 258, 4534, 16384, 4664, 272, 6, 380, 12368, 3088,
+ 7, 3098, 5, 3314, 64, 3349, 66, 3510, 78, 7,
+ 348, 8210, 3085, 4, 3099, 6, 4463, 258, 4487, 256,
+ 4559, 16384, 4689, 272, 5, 3086, 5, 3100, 7, 3315,
+ 66, 3348, 64, 3509, 76, 11, 76, 130, 353, 8220,
+ 752, 8208, 1277, 170, 3101, 8, 3397, 65, 3503, 67,
+ 4584, 16384, 4612, 256, 4638, 258, 4814, 272, 3, 558,
+ 147, 3396, 64, 3502, 66, 9, 74, 128, 354, 8222,
+ 556, 144, 3089, 8, 3102, 10, 4609, 16384, 4613, 258,
+ 4637, 256, 4839, 272, 5, 75, 129, 557, 145, 3090,
+ 9, 3398, 66, 3501, 64, 8, 351, 8216, 1782, 24864,
+ 3103, 12, 3400, 69, 4562, 256, 4588, 258, 4634, 16384,
+ 4764, 272, 3, 3399, 68, 3505, 70, 3874, 64, 8,
+ 352, 8218, 559, 148, 3354, 73, 3402, 71, 4563, 258,
+ 4587, 256, 4659, 16384, 4789, 272, 5, 560, 149, 3353,
+ 72, 3401, 70, 3504, 68, 3875, 66, 11, 270, 8192,
+ 345, 8196, 3093, 18, 3104, 16, 3160, 16, 3209, 48,
+ 3219, 32, 4514, 272, 4684, 16384, 4712, 256, 4738, 258,
+ 4, 312, 129, 3094, 19, 3301, 82, 3318, 84, 9,
+ 313, 130, 346, 8198, 554, 136, 3091, 16, 3300, 81,
+ 4539, 272, 4709, 16384, 4713, 258, 4737, 256, 6, 314,
+ 131, 555, 137, 3092, 17, 3299, 80, 3319, 86, 3408,
+ 90, 5, 315, 132, 4464, 272, 4662, 256, 4688, 258,
+ 4734, 16384, 3, 316, 133, 379, 12352, 3316, 80, 7,
+ 81, 156, 344, 8194, 3105, 22, 4489, 272, 4663, 258,
+ 4687, 256, 4759, 16384, 4, 82, 157, 3106, 23, 3317,
+ 82, 3355, 80, 9, 78, 146, 548, 130, 3107, 24,
+ 3515, 83, 3878, 85, 4614, 272, 4784, 16384, 4812, 256,
+ 4838, 258, 5, 549, 131, 746, 8193, 3108, 25, 3404,
+ 80, 3514, 82, 8, 77, 144, 546, 128, 747, 8194,
+ 3513, 81, 4639, 272, 4809, 16384, 4813, 258, 4837, 256,
+ 4, 547, 129, 748, 8195, 3405, 82, 3512, 80, 9,
+ 80, 150, 347, 8200, 552, 134, 749, 8196, 3877, 81,
+ 4564, 272, 4762, 256, 4788, 258, 4834, 16384, 5, 553,
+ 135, 750, 8197, 3320, 88, 3406, 84, 3876, 80, 9,
+ 79, 148, 550, 132, 751, 8198, 3161, 30, 3516, 85,
+ 4589, 272, 4763, 258, 4787, 256, 4859, 16384, 2, 551,
+ 133, 3407, 86, 6, 387, 12405, 1574, 134, 3162, 32,
+ 3182, 48, 3218, 16, 3223, 96, 5, 386, 12404, 1575,
+ 135, 2523, 12288, 3109, 33, 3416, 104, 3, 389, 12407,
+ 1276, 128, 3110, 34, 5, 388, 12406, 1573, 133, 2524,
+12290, 3111, 35, 3417, 106, 2, 355, 8240, 383, 12401,
+ 4, 382, 12400, 1572, 131, 2525, 12292, 3321, 96, 3,
+ 356, 8242, 385, 12403, 1570, 128, 5, 384, 12402, 1571,
+ 129, 2526, 12294, 3322, 98, 3880, 106, 4, 754, 8240,
+ 1649, 130, 1756, 8192, 3410, 97, 2, 2527, 12296, 3409,
+ 96, 3, 1647, 128, 1757, 8194, 3412, 99, 2, 1648,
+ 129, 3411, 98, 2, 1776, 24832, 3414, 101, 3, 1777,
+24833, 3413, 100, 3879, 96, 2, 1576, 136, 1778, 24834,
+ 2, 1577, 137, 3415, 102, 5, 1584, 150, 3163, 48,
+ 3207, 16, 3224, 112, 3523, 123, 5, 1585, 151, 2528,
+12304, 3325, 116, 3422, 120, 3522, 122, 4, 1582, 148,
+ 3112, 50, 3225, 114, 3521, 121, 4, 1583, 149, 3113,
+ 51, 3423, 122, 3520, 120, 4, 1580, 146, 3063, 192,
+ 3114, 52, 3226, 116, 4, 381, 12384, 1581, 147, 3115,
+ 53, 3323, 112, 2, 1578, 144, 3116, 54, 3, 1579,
+ 145, 3117, 55, 3324, 114, 3, 753, 8224, 1652, 146,
+ 1781, 24852, 3, 1653, 147, 3418, 112, 3519, 114, 2,
+ 1650, 144, 3518, 113, 3, 1651, 145, 3419, 114, 3517,
+ 112, 1, 1779, 24848, 1, 3420, 116, 3, 1586, 152,
+ 1654, 148, 1780, 24850, 1, 3421, 118, 8, 2073, 8193,
+ 3277, 2, 3304, 4, 3328, 6, 3477, 10, 3870, 12,
+ 4521, 4352, 4548, 4354, 9, 3164, 64, 3184, 80, 3232,
+ 16, 3241, 320, 3278, 3, 3305, 5, 3478, 11, 4522,
+ 4353, 4549, 4355, 6, 268, 4240, 3306, 6, 3327, 4,
+ 3871, 14, 4523, 4354, 4546, 4352, 5, 3081, 184, 3185,
+ 82, 3476, 9, 4524, 4355, 4547, 4353, 7, 1037, 37526,
+ 2075, 8197, 3326, 2, 3480, 14, 3867, 8, 4471, 4352,
+ 4498, 4354, 10, 372, 12305, 1038, 37527, 2074, 8196, 2317,
+ 128, 3062, 176, 3186, 84, 3302, 1, 3868, 9, 4472,
+ 4353, 4499, 4355, 9, 373, 12306, 2077, 8199, 3279, 4,
+ 3303, 2, 3479, 12, 3869, 10, 3900, 8, 4473, 4354,
+ 4496, 4352, 5, 1036, 37525, 2076, 8198, 2475, 144, 4474,
+ 4355, 4497, 4353, 7, 2079, 8201, 3280, 10, 3309, 12,
+ 3471, 2, 3864, 4, 4621, 4352, 4648, 4354, 6, 206,
+12289, 2078, 8200, 3078, 178, 3472, 3, 4622, 4353, 4649,
+ 4355, 8, 133, 4224, 625, 4240, 1039, 37528, 3310, 14,
+ 3865, 6, 3898, 4, 4623, 4354, 4646, 4352, 5, 3077,
+ 176, 3866, 7, 3899, 5, 4624, 4355, 4647, 4353, 6,
+ 3283, 14, 3307, 8, 3474, 6, 3897, 2, 4571, 4352,
+ 4598, 4354, 4, 3080, 182, 3475, 7, 4572, 4353, 4599,
+ 4355, 9, 134, 4228, 626, 4244, 3281, 12, 3308, 10,
+ 3329, 8, 3473, 4, 3863, 2, 4573, 4354, 4596, 4352,
+ 5, 3079, 180, 3282, 13, 3330, 9, 4574, 4355, 4597,
+ 4353, 9, 2081, 8209, 2320, 149, 3221, 17, 3286, 18,
+ 3313, 20, 3334, 22, 3488, 26, 4721, 4352, 4748, 4354,
+ 7, 2080, 8208, 2319, 148, 3165, 80, 3183, 64, 3220,
+ 16, 4722, 4353, 4749, 4355, 8, 266, 4224, 624, 4232,
+ 2321, 151, 3284, 16, 3333, 20, 3487, 24, 4723, 4354,
+ 4746, 4352, 4, 267, 4225, 3285, 17, 4724, 4355, 4747,
+ 4353, 4, 3311, 16, 3332, 18, 4671, 4352, 4698, 4354,
+ 3, 3061, 160, 4672, 4353, 4699, 4355, 6, 2083, 8215,
+ 2474, 129, 3312, 18, 3331, 16, 4673, 4354, 4696, 4352,
+ 5, 2082, 8214, 2318, 146, 2473, 128, 4674, 4355, 4697,
+ 4353, 7, 207, 12304, 619, 4226, 755, 8257, 3377, 16,
+ 3482, 18, 4821, 4352, 4848, 4354, 5, 208, 12305, 620,
+ 4227, 3483, 19, 4822, 4353, 4849, 4355, 8, 135, 4240,
+ 209, 12306, 617, 4224, 757, 8259, 3378, 18, 3481, 16,
+ 4823, 4354, 4846, 4352, 5, 618, 4225, 756, 8258, 3076,
+ 160, 4824, 4355, 4847, 4353, 6, 623, 4230, 759, 8261,
+ 3379, 20, 3486, 22, 4771, 4352, 4798, 4354, 4, 758,
+ 8260, 2322, 152, 4772, 4353, 4799, 4355, 6, 621, 4228,
+ 3335, 24, 3380, 22, 3484, 20, 4773, 4354, 4796, 4352,
+ 5, 622, 4229, 760, 8262, 3485, 21, 4774, 4355, 4797,
+ 4353, 4, 3167, 97, 3288, 34, 3339, 38, 3497, 42,
+ 5, 3166, 96, 3210, 64, 3222, 32, 3242, 352, 3498,
+ 43, 5, 3169, 99, 3287, 32, 3338, 36, 3386, 42,
+ 3496, 40, 2, 3168, 98, 3387, 43, 4, 3170, 101,
+ 3290, 38, 3337, 34, 3388, 44, 1, 3060, 144, 4,
+ 3171, 103, 3289, 36, 3336, 32, 3499, 44, 1, 3500,
+ 45, 4, 1761, 12288, 3172, 105, 3381, 32, 3491, 34,
+ 2, 3382, 33, 3492, 35, 6, 1713, 4224, 1762, 12290,
+ 3291, 40, 3342, 44, 3383, 34, 3489, 32, 5, 1763,
+12291, 3075, 144, 3173, 106, 3292, 41, 3490, 33, 5,
+ 1764, 12292, 3341, 42, 3384, 36, 3494, 38, 3872, 32,
+ 3, 2208, 41508, 3385, 37, 3495, 39, 3, 1765, 12294,
+ 3340, 40, 3873, 34, 1, 3493, 37, 5, 376, 12324,
+ 1444, 4240, 2728, 131, 3294, 50, 3345, 54, 6, 2727,
+ 130, 2904, 128, 3187, 96, 3211, 80, 3233, 32, 3243,
+ 368, 5, 377, 12326, 1445, 4242, 2726, 129, 3293, 48,
+ 3394, 58, 3, 1446, 4243, 2725, 128, 3395, 59, 3,
+ 374, 12320, 1447, 4244, 2731, 135, 4, 1448, 4245, 2730,
+ 134, 3059, 128, 3344, 51, 4, 375, 12322, 1449, 4246,
+ 3295, 52, 3343, 48, 2, 1450, 4247, 2729, 132, 2,
+ 1766, 12304, 3389, 48, 2, 1714, 4240, 3390, 50, 1,
+ 3391, 51, 1, 378, 12328, 2, 3346, 56, 3392, 54,
+ 2, 3347, 57, 3393, 55, 6, 13, 4417, 93, 268,
+ 404, 16404, 1602, 288, 2117, 16448, 3984, 4177, 6, 94,
+ 269, 405, 16405, 2071, 4356, 2118, 16449, 4023, 64, 4031,
+ 4097, 3, 406, 16406, 1603, 290, 3986, 4179, 7, 14,
+ 4418, 95, 271, 407, 16407, 658, 4446, 3985, 4178, 4049,
+ 64, 4057, 4097, 9, 11, 258, 91, 264, 400, 16400,
+ 1083, 37713, 1604, 292, 2068, 4353, 2337, 326, 3144, 1280,
+ 3988, 4181, 5, 401, 16401, 2338, 327, 3987, 4180, 4075,
+ 64, 4083, 4097, 6, 10, 256, 148, 4427, 402, 16402,
+ 1085, 37715, 1605, 294, 2070, 4355, 10, 92, 267, 147,
+ 4426, 403, 16403, 657, 4442, 1084, 37714, 2069, 4354, 2336,
+ 325, 3989, 4182, 4101, 64, 4109, 4097, 7, 87, 260,
+ 146, 4421, 210, 16384, 412, 16412, 655, 4437, 1671, 292,
+ 3991, 4185, 8, 88, 261, 413, 16413, 654, 4436, 781,
+20560, 1672, 293, 3990, 4184, 4127, 64, 4135, 4097, 1,
+ 89, 262, 4, 90, 263, 656, 4438, 4153, 64, 4161,
+ 4097, 4, 83, 256, 408, 16408, 651, 4433, 1667, 288,
+ 7, 84, 257, 145, 4416, 409, 16409, 650, 4432, 1668,
+ 289, 4179, 64, 4187, 4097, 4, 85, 258, 410, 16410,
+ 653, 4435, 1669, 290, 7, 86, 259, 411, 16411, 652,
+ 4434, 1670, 291, 3248, 153, 4205, 64, 4213, 4097, 8,
+ 295, 16384, 332, 256, 393, 16388, 1081, 37701, 2119, 16464,
+ 2501, 4353, 3901, 16, 3976, 4161, 7, 333, 257, 1080,
+37700, 2120, 16465, 2500, 4352, 3931, 1, 4231, 64, 4239,
+ 4097, 6, 334, 258, 394, 16390, 2121, 16466, 2503, 4355,
+ 3932, 2, 3978, 4163, 6, 335, 259, 1082, 37702, 2502,
+ 4354, 3977, 4162, 4257, 64, 4265, 4097, 8, 102, 280,
+ 336, 260, 649, 4425, 1077, 37697, 2505, 4357, 3145, 1296,
+ 3933, 4, 3980, 4165, 8, 103, 281, 243, 257, 337,
+ 261, 1076, 37696, 2504, 4356, 3979, 4164, 4283, 64, 4291,
+ 4097, 7, 244, 258, 277, 8576, 338, 262, 392, 16386,
+ 1079, 37699, 3259, 160, 3982, 4167, 6, 151, 4442, 339,
+ 263, 1078, 37698, 3981, 4166, 4309, 64, 4317, 4097, 6,
+ 98, 276, 150, 4437, 340, 264, 397, 16396, 646, 4421,
+ 767, 16384, 7, 99, 277, 645, 4420, 780, 20544, 3684,
+ 468, 3983, 4168, 4335, 64, 4343, 4097, 3, 100, 278,
+ 398, 16398, 648, 4423, 6, 101, 279, 399, 16399, 647,
+ 4422, 3685, 470, 4361, 64, 4369, 4097, 3, 96, 272,
+ 395, 16392, 642, 4417, 5, 149, 4432, 641, 4416, 3682,
+ 464, 4387, 64, 4395, 4097, 3, 97, 274, 396, 16394,
+ 644, 4419, 4, 643, 4418, 3683, 466, 4413, 64, 4421,
+ 4097, 4, 423, 16436, 1306, 16384, 1587, 256, 4004, 4209,
+ 3, 424, 16437, 1279, 261, 4003, 4208, 3, 425, 16438,
+ 1588, 258, 4006, 4211, 2, 1589, 259, 4005, 4210, 6,
+ 419, 16432, 1278, 256, 1590, 260, 1663, 264, 3146, 1312,
+ 4007, 4213, 3, 420, 16433, 1591, 261, 1664, 265, 4,
+ 279, 8624, 421, 16434, 1592, 262, 4009, 4215, 4, 422,
+16435, 1465, 4416, 1593, 263, 4008, 4214, 6, 108, 292,
+ 428, 16444, 1594, 264, 1659, 260, 1768, 16384, 4011, 4217,
+ 3, 156, 4452, 1660, 261, 4010, 4216, 3, 157, 4455,
+ 1661, 262, 4013, 4219, 2, 1662, 263, 4012, 4218, 5,
+ 104, 288, 153, 4449, 426, 16440, 1655, 256, 4015, 4221,
+ 5, 105, 289, 152, 4448, 664, 4464, 1656, 257, 4014,
+ 4220, 4, 106, 290, 155, 4451, 427, 16442, 1657, 258,
+ 4, 107, 291, 154, 4450, 1658, 259, 4016, 4222, 4,
+ 416, 16420, 1595, 272, 2122, 16496, 3993, 4193, 3, 2123,
+16497, 2804, 4356, 3992, 4192, 5, 417, 16422, 1468, 4437,
+ 1596, 274, 1886, 16384, 2124, 16498, 3, 1597, 275, 2125,
+16499, 3994, 4194, 6, 414, 16416, 1280, 272, 1467, 4435,
+ 1598, 276, 2126, 16500, 2801, 4353, 3, 1086, 37728, 1599,
+ 277, 3995, 4196, 5, 278, 8608, 415, 16418, 2803, 4355,
+ 3258, 128, 3996, 4199, 3, 1466, 4432, 1600, 279, 2802,
+ 4354, 3, 1601, 280, 1916, 16384, 3998, 4201, 2, 662,
+ 4452, 3997, 4200, 1, 663, 4454, 5, 418, 16424, 660,
+ 4449, 1665, 272, 1909, 256, 4000, 4205, 4, 659, 4448,
+ 1666, 273, 1910, 257, 3999, 4204, 3, 1469, 4441, 1911,
+ 258, 4002, 4207, 2, 661, 4450, 4001, 4206, 5, 1053,
+37652, 2086, 16385, 3942, 4112, 4227, 16, 4483, 12288, 6,
+ 433, 16468, 1054, 37653, 1457, 4391, 2325, 258, 3943, 4113,
+ 4070, 5, 8, 435, 16471, 1055, 37654, 2088, 16387, 2324,
+ 257, 2616, 289, 3944, 4114, 4253, 16, 4508, 12288, 7,
+ 434, 16470, 1056, 37655, 1456, 4389, 2087, 16386, 2323, 256,
+ 3945, 4115, 4096, 5, 7, 431, 16465, 1049, 37648, 1455,
+ 4386, 2090, 16389, 3946, 4116, 4279, 16, 4533, 12288, 8,
+ 430, 16464, 1050, 37649, 1979, 256, 2089, 16388, 2327, 262,
+ 2386, 264, 3947, 4117, 4018, 5, 6, 1051, 37650, 2092,
+16391, 2618, 293, 3948, 4118, 4305, 16, 4558, 12288, 9,
+ 281, 8656, 432, 16466, 1052, 37651, 1454, 4385, 2091, 16390,
+ 2326, 260, 2617, 292, 3949, 4119, 4044, 5, 8, 630,
+ 4372, 769, 20496, 2093, 16393, 2383, 261, 3662, 388, 3950,
+ 4120, 4331, 16, 4583, 12288, 4, 439, 16476, 3903, 64,
+ 3951, 4121, 4174, 5, 7, 770, 20498, 2229, 41861, 2385,
+ 263, 2619, 297, 3952, 4122, 4357, 16, 4608, 12288, 4,
+ 2384, 262, 3904, 66, 3953, 4123, 4200, 5, 8, 136,
+ 4352, 437, 16473, 628, 4368, 1057, 37656, 3659, 384, 3954,
+ 4124, 4383, 16, 4633, 12288, 6, 436, 16472, 629, 4369,
+ 1058, 37657, 2381, 256, 3955, 4125, 4122, 5, 5, 1458,
+ 4392, 3660, 386, 3956, 4126, 4409, 16, 4658, 12288, 7,
+ 438, 16474, 2127, 33538, 2228, 41856, 2382, 258, 3661, 387,
+ 3957, 4127, 4148, 5, 8, 476, 20484, 1043, 37636, 2095,
+16401, 2477, 257, 2622, 307, 2969, 289, 4019, 16, 4683,
+12288, 7, 1044, 37637, 2094, 16400, 2476, 256, 2621, 306,
+ 2968, 288, 3934, 4097, 4278, 5, 4, 1045, 37638, 1463,
+ 4404, 4045, 16, 4708, 12288, 4, 1046, 37639, 1464, 4405,
+ 2620, 304, 4304, 5, 7, 269, 4352, 1461, 4402, 2096,
+16405, 3667, 408, 3935, 4100, 4071, 16, 4733, 12288, 7,
+ 429, 16448, 1040, 37633, 1462, 4403, 3147, 1360, 3668, 409,
+ 3936, 4101, 4226, 5, 7, 475, 20482, 1041, 37634, 1459,
+ 4400, 3669, 410, 3937, 4102, 4097, 16, 4758, 12288, 7,
+ 280, 8640, 1042, 37635, 1460, 4401, 2097, 16406, 2623, 308,
+ 3938, 4103, 4252, 5, 6, 768, 20480, 2099, 16409, 3665,
+ 404, 3939, 4104, 4123, 16, 4783, 12288, 5, 139, 4373,
+ 2098, 16408, 3905, 80, 3940, 4105, 4382, 5, 4, 3666,
+ 406, 3941, 4106, 4149, 16, 4808, 12288, 1, 4408, 5,
+ 7, 137, 4368, 627, 4352, 1047, 37640, 2388, 273, 3663,
+ 400, 4175, 16, 4833, 12288, 4, 138, 4369, 1048, 37641,
+ 2387, 272, 4330, 5, 4, 2390, 275, 3664, 402, 4201,
+ 16, 4858, 12288, 3, 2230, 41872, 2389, 274, 4356, 5,
+ 10, 1072, 37684, 1307, 20480, 1358, 37644, 2101, 16417, 2330,
+ 291, 2610, 259, 3152, 1381, 4020, 32, 4047, 34, 4230,
+ 48, 8, 445, 16500, 1073, 37685, 1359, 37645, 2100, 16416,
+ 2329, 290, 2609, 258, 3151, 1380, 3969, 4145, 8, 1308,
+20482, 1360, 37646, 2103, 16419, 2328, 289, 2608, 257, 4021,
+ 34, 4046, 32, 4256, 48, 5, 446, 16502, 1074, 37687,
+ 1361, 37647, 2102, 16418, 3970, 4147, 11, 639, 4408, 1069,
+37680, 1354, 37640, 2104, 16421, 2614, 263, 3148, 1377, 3674,
+ 424, 3971, 4148, 4072, 32, 4099, 34, 4282, 48, 4,
+ 443, 16496, 1355, 37641, 1453, 4355, 2613, 262, 11, 640,
+ 4410, 1070, 37682, 1356, 37642, 1451, 4352, 2106, 16423, 2332,
+ 293, 2612, 261, 3150, 1379, 4073, 34, 4098, 32, 4308,
+ 48, 10, 282, 8688, 444, 16498, 1071, 37683, 1357, 37643,
+ 1452, 4353, 2105, 16422, 2331, 292, 2611, 260, 3149, 1378,
+ 3972, 4151, 10, 635, 4404, 779, 20528, 1719, 4356, 1769,
+20480, 2108, 16425, 3672, 420, 3973, 4152, 4124, 32, 4151,
+ 34, 4334, 48, 5, 141, 4389, 449, 16508, 636, 4405,
+ 2107, 16424, 3974, 4153, 6, 637, 4406, 3673, 422, 3975,
+ 4154, 4125, 34, 4150, 32, 4360, 48, 4, 450, 16510,
+ 638, 4407, 1353, 37639, 2615, 264, 8, 140, 4384, 633,
+ 4400, 1075, 37688, 1715, 4352, 3670, 416, 4176, 32, 4203,
+ 34, 4386, 48, 5, 447, 16504, 634, 4401, 1351, 37633,
+ 1716, 4353, 2391, 288, 6, 1352, 37634, 1717, 4354, 3671,
+ 418, 4177, 34, 4202, 32, 4412, 48, 2, 448, 16506,
+ 1718, 4355, 9, 12, 4400, 777, 20520, 1063, 37668, 2110,
+16433, 3681, 444, 3958, 4128, 4022, 48, 4228, 32, 4255,
+ 34, 6, 442, 16484, 778, 20521, 1064, 37669, 2109, 16432,
+ 2908, 262, 3959, 4129, 5, 1065, 37670, 2112, 16435, 4048,
+ 48, 4229, 34, 4254, 32, 4, 1066, 37671, 2111, 16434,
+ 2907, 260, 3960, 4131, 9, 1059, 37664, 2114, 16437, 2334,
+ 311, 2733, 257, 3679, 440, 3961, 4132, 4074, 48, 4280,
+ 32, 4307, 34, 6, 440, 16480, 1060, 37665, 2113, 16436,
+ 2732, 256, 2906, 258, 3962, 4133, 10, 144, 4410, 1061,
+37666, 2116, 16439, 2333, 309, 2735, 259, 3680, 442, 3963,
+ 4134, 4100, 48, 4281, 34, 4306, 32, 7, 441, 16482,
+ 1062, 37667, 2115, 16438, 2734, 258, 2905, 256, 3260, 192,
+ 3964, 4135, 7, 143, 4404, 771, 20512, 3677, 436, 3965,
+ 4136, 4126, 48, 4332, 32, 4359, 34, 3, 772, 20513,
+ 2912, 270, 3966, 4137, 7, 773, 20514, 2335, 313, 3678,
+ 438, 3967, 4138, 4152, 48, 4333, 34, 4358, 32, 2,
+ 2911, 268, 3968, 4139, 9, 142, 4400, 631, 4384, 774,
+20516, 1067, 37672, 1362, 37648, 3675, 432, 4178, 48, 4384,
+ 32, 4411, 34, 5, 632, 4385, 1068, 37673, 1363, 37649,
+ 1720, 4369, 2910, 266, 7, 775, 20518, 1364, 37650, 1721,
+ 4370, 3676, 434, 4204, 48, 4385, 34, 4410, 32, 4,
+ 776, 20519, 1365, 37651, 1722, 4371, 2909, 264, 2, 792,
+24600, 4043, 12288, 2, 872, 28760, 3652, 334, 2, 793,
+24602, 4069, 12288, 1, 3651, 332, 7, 271, 8464, 466,
+16530, 794, 24604, 3194, 272, 3245, 16, 3254, 48, 4095,
+12288, 1, 3650, 330, 2, 795, 24606, 4121, 12288, 2,
+ 465, 16529, 3649, 328, 2, 1771, 24608, 4147, 12288, 4,
+ 471, 16543, 788, 24593, 868, 28752, 3648, 326, 4, 469,
+16540, 789, 24594, 1772, 24610, 4173, 12288, 4, 470, 16541,
+ 869, 28754, 1773, 24611, 3647, 324, 4, 467, 16538, 790,
+24596, 2219, 41792, 4199, 12288, 4, 468, 16539, 870, 28756,
+ 3450, 320, 3646, 322, 2, 791, 24598, 4225, 12288, 3,
+ 871, 28758, 3451, 322, 3645, 320, 3, 457, 16518, 4251,
+12288, 4445, 16, 3, 458, 16519, 866, 28744, 4446, 17,
+ 3, 455, 16516, 4277, 12288, 4447, 18, 1, 456, 16517,
+ 6, 453, 16514, 2223, 41816, 3193, 256, 3216, 304, 3235,
+ 16, 4303, 12288, 3, 454, 16515, 867, 28748, 4448, 21,
+ 2, 451, 16512, 4329, 12288, 1, 452, 16513, 6, 464,
+16526, 787, 24576, 862, 28737, 1774, 24624, 2222, 41812, 4355,
+12288, 1, 861, 28736, 3, 462, 16524, 3658, 341, 4381,
+12288, 3, 463, 16525, 863, 28738, 3657, 340, 3, 167,
+ 8464, 3656, 339, 4407, 12288, 5, 168, 8465, 461, 16523,
+ 864, 28740, 3452, 336, 3655, 338, 5, 169, 8466, 459,
+16520, 2220, 41810, 3654, 337, 4433, 12288, 5, 460, 16521,
+ 865, 28742, 2221, 41811, 3453, 338, 3653, 336, 1, 809,
+24632, 2, 810, 24633, 3253, 21, 2, 811, 24634, 4449,
+ 34, 1, 812, 24635, 6, 174, 8488, 813, 24636, 3196,
+ 304, 3236, 32, 3247, 48, 3252, 16, 3, 175, 8489,
+ 814, 24637, 3458, 360, 2, 176, 8490, 815, 24638, 1,
+ 816, 24639, 2, 172, 8484, 804, 24624, 2, 805, 24625,
+ 3456, 356, 1, 806, 24626, 2, 173, 8487, 3457, 358,
+ 3, 170, 8480, 807, 24628, 2224, 41824, 1, 3454, 352,
+ 2, 171, 8482, 808, 24630, 1, 3455, 354, 1, 800,
+24616, 1, 801, 24618, 7, 474, 16546, 802, 24620, 3195,
+ 288, 3214, 272, 3237, 48, 3246, 32, 3249, 16, 1,
+ 3215, 273, 2, 472, 16544, 803, 24622, 1, 473, 16545,
+ 4, 180, 8500, 796, 24608, 1760, 8468, 1770, 24592, 3,
+ 181, 8501, 873, 28768, 2227, 41845, 1, 797, 24610, 1,
+ 874, 28770, 6, 177, 8496, 798, 24612, 876, 28773, 1758,
+ 8464, 2225, 41840, 3459, 369, 1, 875, 28772, 6, 178,
+ 8498, 799, 24614, 1759, 8466, 2226, 41842, 3118, 304, 3461,
+ 371, 2, 179, 8499, 3460, 370, 11, 275, 8533, 1824,
+28712, 3616, 270, 4032, 8192, 4059, 8194, 4086, 8196, 4113,
+ 8198, 4140, 8200, 4167, 8202, 4194, 8204, 4221, 8206, 6,
+ 274, 8532, 831, 24664, 1825, 28713, 3200, 340, 4450, 64,
+ 4470, 4097, 11, 848, 28698, 1826, 28714, 3615, 268, 4033,
+ 8194, 4058, 8192, 4087, 8198, 4112, 8196, 4141, 8202, 4166,
+ 8200, 4195, 8206, 4220, 8204, 3, 832, 24666, 1827, 28715,
+ 4495, 4097, 11, 1828, 28716, 3614, 266, 4034, 8196, 4061,
+ 8198, 4084, 8192, 4111, 8194, 4142, 8204, 4169, 8206, 4192,
+ 8200, 4219, 8202, 4451, 69, 6, 272, 8528, 1829, 28717,
+ 3198, 336, 3230, 256, 3238, 64, 4520, 4097, 10, 1830,
+28718, 3612, 264, 4035, 8198, 4060, 8196, 4085, 8194, 4110,
+ 8192, 4143, 8206, 4168, 8204, 4193, 8202, 4218, 8200, 5,
+ 273, 8530, 2216, 41738, 3199, 338, 3613, 265, 4545, 4097,
+ 12, 843, 28688, 1816, 28704, 3610, 262, 3891, 256, 4036,
+ 8200, 4063, 8202, 4090, 8204, 4117, 8206, 4136, 8192, 4163,
+ 8194, 4190, 8196, 4217, 8198, 7, 184, 8516, 827, 24656,
+ 844, 28689, 1817, 28705, 3438, 261, 3611, 263, 4570, 4097,
+ 13, 845, 28690, 1818, 28706, 2215, 41735, 3609, 260, 3892,
+ 258, 4037, 8202, 4062, 8200, 4091, 8206, 4116, 8204, 4137,
+ 8194, 4162, 8192, 4191, 8198, 4216, 8196, 4, 828, 24658,
+ 1819, 28707, 3201, 350, 4595, 4097, 14, 846, 28692, 1820,
+28708, 2214, 41729, 3437, 256, 3608, 258, 3893, 260, 4038,
+ 8204, 4065, 8206, 4088, 8200, 4115, 8202, 4138, 8196, 4165,
+ 8198, 4188, 8192, 4215, 8194, 4, 829, 24660, 1821, 28709,
+ 2213, 41728, 4620, 4097, 13, 183, 8515, 670, 4496, 847,
+28694, 1822, 28710, 3607, 256, 4039, 8206, 4064, 8204, 4089,
+ 8202, 4114, 8200, 4139, 8198, 4164, 8196, 4189, 8194, 4214,
+ 8192, 6, 182, 8514, 671, 4497, 830, 24662, 1823, 28711,
+ 3119, 320, 4645, 4097, 11, 839, 28680, 3626, 286, 4240,
+ 8192, 4267, 8194, 4294, 8196, 4321, 8198, 4348, 8200, 4375,
+ 8202, 4402, 8204, 4429, 8206, 4453, 81, 4, 823, 24648,
+ 3627, 287, 4452, 80, 4670, 4097, 10, 840, 28682, 3625,
+ 284, 4241, 8194, 4266, 8192, 4295, 8198, 4320, 8196, 4349,
+ 8202, 4374, 8200, 4403, 8206, 4428, 8204, 3, 824, 24650,
+ 4454, 82, 4695, 4097, 11, 164, 4506, 841, 28684, 3624,
+ 282, 4242, 8196, 4269, 8198, 4292, 8192, 4319, 8194, 4350,
+ 8204, 4377, 8206, 4400, 8200, 4427, 8202, 6, 825, 24652,
+ 3197, 320, 3239, 80, 3251, 112, 3257, 96, 4720, 4097,
+ 11, 162, 4504, 842, 28686, 3623, 280, 4243, 8198, 4268,
+ 8196, 4293, 8194, 4318, 8192, 4351, 8206, 4376, 8204, 4401,
+ 8202, 4426, 8200, 3, 163, 4505, 826, 24654, 4745, 4097,
+ 13, 160, 4502, 765, 12548, 818, 24641, 834, 28672, 3622,
+ 278, 4244, 8200, 4271, 8202, 4298, 8204, 4325, 8206, 4344,
+ 8192, 4371, 8194, 4398, 8196, 4425, 8198, 6, 161, 4503,
+ 766, 12549, 817, 24640, 835, 28673, 3894, 273, 4770, 4097,
+ 13, 669, 4484, 820, 24643, 3440, 278, 3620, 276, 3895,
+ 274, 4245, 8202, 4270, 8200, 4299, 8206, 4324, 8204, 4345,
+ 8194, 4370, 8192, 4399, 8198, 4424, 8196, 5, 159, 4501,
+ 819, 24642, 3621, 277, 3896, 275, 4795, 4097, 13, 667,
+ 4482, 761, 12544, 836, 28676, 3439, 272, 3619, 274, 4246,
+ 8204, 4273, 8206, 4296, 8200, 4323, 8202, 4346, 8196, 4373,
+ 8198, 4396, 8192, 4423, 8194, 5, 668, 4483, 762, 12545,
+ 821, 24644, 837, 28677, 4820, 4097, 14, 158, 4496, 665,
+ 4480, 763, 12546, 838, 28678, 2217, 41747, 3617, 272, 4247,
+ 8206, 4272, 8204, 4297, 8202, 4322, 8200, 4347, 8198, 4372,
+ 8196, 4397, 8194, 4422, 8192, 5, 666, 4481, 764, 12547,
+ 822, 24646, 3618, 273, 4845, 4097, 5, 860, 28728, 1792,
+28680, 3639, 302, 4456, 97, 4561, 105, 3, 1793, 28681,
+ 4455, 96, 4560, 104, 4, 1794, 28682, 3638, 300, 4458,
+ 99, 4586, 105, 3, 1795, 28683, 4457, 98, 4585, 104,
+ 4, 1299, 12544, 1796, 28684, 3637, 298, 4611, 105, 4,
+ 1797, 28685, 3217, 320, 3256, 80, 4610, 104, 3, 1798,
+28686, 3635, 296, 4636, 105, 4, 1799, 28687, 3636, 297,
+ 4459, 102, 4635, 104, 4, 856, 28720, 1784, 28672, 3634,
+ 294, 4461, 105, 3, 1775, 24640, 1785, 28673, 4460, 104,
+ 4, 857, 28722, 1786, 28674, 3632, 292, 4486, 105, 3,
+ 1787, 28675, 3633, 293, 4485, 104, 5, 858, 28724, 1788,
+28676, 3441, 288, 3630, 290, 4511, 105, 3, 1789, 28677,
+ 3631, 291, 4510, 104, 5, 859, 28726, 1790, 28678, 3442,
+ 290, 3628, 288, 4536, 105, 3, 1791, 28679, 3629, 289,
+ 4535, 104, 4, 853, 28712, 1808, 28696, 3449, 316, 4761,
+ 105, 2, 1809, 28697, 4760, 104, 3, 854, 28714, 1810,
+28698, 4786, 105, 3, 855, 28715, 1811, 28699, 4785, 104,
+ 4, 1812, 28700, 3447, 312, 3906, 255, 4811, 105, 7,
+ 276, 8544, 1813, 28701, 3202, 352, 3240, 112, 3250, 80,
+ 3255, 64, 4810, 104, 3, 1814, 28702, 3448, 314, 4836,
+ 105, 4, 1723, 4505, 1815, 28703, 2218, 41786, 4835, 104,
+ 4, 849, 28704, 1800, 28688, 3445, 308, 4661, 105, 3,
+ 833, 24672, 1801, 28689, 4660, 104, 6, 674, 4516, 850,
+28706, 1802, 28690, 3446, 310, 3644, 308, 4686, 105, 2,
+ 1803, 28691, 4685, 104, 7, 673, 4514, 851, 28708, 1767,
+12560, 1804, 28692, 3443, 304, 3642, 306, 4711, 105, 3,
+ 1805, 28693, 3643, 307, 4710, 104, 6, 672, 4512, 852,
+28710, 1806, 28694, 3444, 306, 3640, 304, 4736, 105, 3,
+ 1807, 28695, 3641, 305, 4735, 104, 4, 253, 536, 684,
+ 4689, 924, 36953, 2770, 632, 5, 109, 513, 254, 537,
+ 683, 4688, 923, 36952, 2771, 633, 2, 293, 8856, 1942,
+ 560, 2, 294, 8857, 1943, 561, 1, 3929, 768, 1,
+ 3020, 4664, 2, 2363, 584, 2663, 25568, 1, 2364, 585,
+ 2, 287, 8850, 919, 36945, 7, 288, 8851, 918, 36944,
+ 1480, 4706, 1981, 577, 2362, 583, 3018, 4660, 3746, 712,
+ 4, 247, 530, 921, 36947, 1982, 578, 2361, 580, 6,
+ 248, 531, 920, 36946, 1479, 4704, 1983, 579, 2768, 627,
+ 3019, 4662, 5, 249, 532, 291, 8854, 1984, 580, 2360,
+ 578, 2769, 628, 6, 250, 533, 292, 8855, 922, 36948,
+ 1985, 581, 2510, 4624, 3017, 4656, 3, 251, 534, 289,
+ 8852, 1481, 4709, 2, 252, 535, 290, 8853, 3, 917,
+36937, 1311, 36977, 1940, 546, 5, 166, 4688, 679, 4672,
+ 916, 36936, 1941, 547, 3747, 720, 2, 681, 4675, 1938,
+ 544, 4, 680, 4674, 1312, 36978, 1939, 545, 3748, 722,
+ 2, 682, 4676, 3749, 724, 1, 2664, 25584, 1, 3750,
+ 726, 4, 245, 512, 909, 36929, 1482, 4723, 1986, 592,
+ 4, 246, 513, 1987, 593, 2766, 609, 3016, 4644, 3,
+ 911, 36931, 1988, 594, 2767, 610, 2, 910, 36930, 1989,
+ 595, 4, 913, 36933, 1990, 596, 2367, 594, 2507, 4609,
+ 5, 912, 36932, 1991, 597, 2368, 595, 2506, 4608, 3014,
+ 4640, 3, 915, 36935, 2365, 592, 2509, 4611, 4, 914,
+36934, 2366, 593, 2508, 4610, 3015, 4642, 6, 687, 4721,
+ 941, 36985, 1673, 512, 1932, 530, 2765, 600, 3752, 737,
+ 3, 940, 36984, 1933, 531, 3751, 736, 2, 1930, 528,
+ 3754, 739, 3, 688, 4722, 1931, 529, 3753, 738, 1,
+ 3756, 741, 1, 3755, 740, 3, 1934, 532, 2661, 25536,
+ 3758, 743, 2, 1935, 533, 3757, 742, 4, 1281, 512,
+ 1937, 538, 1992, 608, 2757, 592, 4, 934, 36976, 1993,
+ 609, 2758, 593, 3759, 744, 4, 935, 36979, 1936, 536,
+ 2759, 594, 3761, 747, 3, 2760, 595, 3013, 4630, 3760,
+ 746, 2, 937, 36981, 2761, 596, 3, 936, 36980, 2762,
+ 597, 3011, 4624, 3, 939, 36983, 1606, 514, 2763, 598,
+ 3, 938, 36982, 2764, 599, 3012, 4626, 4, 686, 4705,
+ 933, 36969, 1923, 514, 2755, 584, 4, 685, 4704, 1924,
+ 515, 2756, 585, 2812, 4616, 1, 1922, 512, 2, 1310,
+36951, 2662, 25552, 2, 1309, 36950, 1925, 517, 4, 926,
+36961, 1928, 522, 1994, 624, 2805, 4609, 3, 925, 36960,
+ 2748, 577, 3010, 4612, 4, 928, 36963, 1926, 520, 2749,
+ 578, 2807, 4611, 5, 927, 36962, 1476, 4688, 1927, 521,
+ 2750, 579, 2806, 4610, 4, 930, 36965, 1478, 4695, 2751,
+ 580, 2809, 4613, 6, 929, 36964, 1995, 629, 2511, 4640,
+ 2752, 581, 2808, 4612, 3008, 4608, 5, 932, 36967, 1477,
+ 4693, 1929, 524, 2753, 582, 2811, 4615, 4, 931, 36966,
+ 2754, 583, 2810, 4614, 3009, 4610, 5, 165, 4608, 678,
+ 4624, 891, 36888, 2393, 513, 3722, 640, 4, 892, 36889,
+ 1733, 4641, 2171, 41090, 2392, 512, 2, 1734, 4642, 3723,
+ 642, 4, 1735, 4643, 2170, 41088, 2394, 514, 2657, 25508,
+ 2, 1736, 4644, 3724, 644, 3, 2173, 41093, 2395, 519,
+ 3725, 646, 3, 2172, 41092, 2345, 520, 2656, 25504, 4,
+ 884, 36880, 2344, 519, 2744, 561, 3726, 648, 2, 885,
+36881, 2743, 560, 6, 886, 36882, 1473, 4640, 2175, 41097,
+ 2343, 517, 2746, 563, 3727, 650, 4, 2174, 41096, 2342,
+ 516, 2659, 25516, 2745, 562, 5, 15, 4608, 887, 36884,
+ 2341, 515, 2481, 529, 3728, 652, 4, 888, 36885, 2340,
+ 514, 2480, 528, 2747, 564, 3, 16, 4610, 889, 36886,
+ 2339, 513, 4, 211, 36871, 890, 36887, 1474, 4645, 2658,
+25512, 4, 675, 4608, 882, 36872, 2742, 553, 3729, 656,
+ 4, 676, 4609, 883, 36873, 2741, 552, 3730, 657, 2,
+ 677, 4610, 3731, 658, 1, 2176, 41104, 1, 3732, 660,
+ 1, 3733, 662, 2, 2351, 536, 2660, 25520, 1, 3734,
+ 664, 2, 1475, 4656, 2350, 533, 1, 2396, 538, 3,
+ 879, 36868, 2349, 531, 3735, 668, 3, 880, 36869, 2348,
+ 530, 2478, 512, 6, 17, 4626, 881, 36870, 2347, 529,
+ 2398, 543, 2740, 551, 3736, 670, 4, 2346, 528, 2397,
+ 542, 2479, 514, 2739, 550, 3, 1297, 4616, 1724, 4608,
+ 3737, 672, 2, 1298, 4617, 1725, 4609, 2, 1726, 4610,
+ 3738, 674, 2, 1727, 4611, 2923, 536, 2, 1728, 4612,
+ 3739, 676, 1, 2654, 25472, 3, 902, 36912, 1293, 4608,
+ 2354, 551, 3, 1832, 36865, 1980, 544, 2920, 530, 3,
+ 903, 36914, 1294, 4610, 1833, 36866, 5, 904, 36915, 1282,
+ 578, 1834, 36867, 2353, 548, 2919, 528, 3, 18, 4640,
+ 905, 36916, 1295, 4612, 2, 906, 36917, 2922, 534, 2,
+ 907, 36918, 1296, 4614, 3, 908, 36919, 2352, 544, 2921,
+ 532, 3, 900, 36904, 2738, 521, 3740, 688, 4, 901,
+36905, 1729, 4625, 1946, 578, 2737, 520, 3, 1730, 4626,
+ 1945, 577, 3741, 690, 5, 1731, 4627, 1944, 576, 2177,
+41136, 2918, 520, 3742, 691, 3, 1732, 4628, 1950, 583,
+ 3743, 692, 1, 1949, 582, 1, 1948, 581, 3, 1947,
+ 580, 2359, 568, 2655, 25488, 5, 893, 36896, 1472, 4626,
+ 2915, 515, 3022, 4676, 3744, 696, 3, 894, 36897, 2358,
+ 566, 2914, 514, 4, 895, 36898, 1470, 4624, 3023, 4678,
+ 3745, 698, 4, 1471, 4625, 1951, 584, 2357, 564, 2913,
+ 512, 1, 896, 36900, 4, 897, 36901, 2356, 562, 2482,
+ 544, 2917, 518, 3, 898, 36902, 2736, 519, 3021, 4674,
+ 4, 899, 36903, 2355, 560, 2483, 546, 2916, 516, 3,
+ 185, 8704, 2153, 41024, 3268, 8, 3, 3269, 9, 3468,
+ 576, 3712, 578, 2, 3120, 512, 3270, 10, 3, 2154,
+41027, 3271, 11, 3711, 576, 3, 186, 8708, 2653, 25440,
+ 3272, 12, 1, 3273, 13, 1, 3274, 14, 3, 2155,
+41031, 3275, 15, 3713, 580, 2, 187, 8712, 286, 8720,
+ 1, 3261, 1, 1, 3262, 2, 1, 3263, 3, 2,
+ 364, 8720, 3264, 4, 1, 3265, 5, 1, 3266, 6,
+ 1, 3267, 7, 3, 362, 8716, 2156, 41040, 3470, 593,
+ 2, 2128, 37010, 3469, 592, 1, 363, 8718, 1, 3714,
+ 592, 1, 360, 8712, 1, 2130, 37014, 1, 361, 8714,
+ 2, 2129, 37012, 2157, 41047, 2, 188, 8728, 358, 8708,
+ 2, 283, 8705, 1248, 40961, 3, 284, 8706, 359, 8710,
+ 1249, 40962, 3, 285, 8707, 1250, 40963, 2131, 37016, 1,
+ 357, 8706, 3, 189, 8736, 2158, 41056, 3717, 611, 3,
+ 2249, 45088, 2649, 25413, 3716, 610, 1, 2650, 25414, 2,
+ 2651, 25415, 3715, 608, 1, 2648, 25408, 1, 3719, 614,
+ 1, 2159, 41062, 2, 2160, 41063, 3718, 612, 3, 190,
+ 8744, 2161, 41064, 3276, 32, 2, 191, 8745, 3720, 618,
+ 1, 3721, 620, 3, 192, 8752, 371, 8748, 2162, 41072,
+ 1, 2163, 41075, 3, 369, 8744, 2164, 41076, 2652, 25424,
+ 1, 2165, 41077, 2, 370, 8746, 2166, 41078, 2, 367,
+ 8740, 2167, 41080, 2, 368, 8742, 2168, 41082, 2, 365,
+ 8736, 2169, 41084, 1, 366, 8738, 3, 3462, 512, 3687,
+ 514, 4655, 4866, 3, 193, 8768, 4629, 4865, 4656, 4867,
+ 4, 957, 37016, 3463, 514, 3686, 512, 4630, 4866, 3,
+ 194, 8770, 4631, 4867, 4654, 4865, 2, 3688, 518, 4605,
+ 4866, 4, 195, 8772, 2646, 25376, 4579, 4865, 4606, 4867,
+ 2, 2141, 40967, 4580, 4866, 3, 196, 8774, 4581, 4867,
+ 4604, 4865, 2, 952, 37010, 4555, 4866, 3, 953, 37011,
+ 4529, 4865, 4556, 4867, 3, 950, 37008, 1997, 641, 4530,
+ 4866, 4, 951, 37009, 1996, 640, 4531, 4867, 4554, 4865,
+ 2, 956, 37014, 4505, 4866, 2, 4479, 4865, 4506, 4867,
+ 2, 954, 37012, 4480, 4866, 3, 955, 37013, 4481, 4867,
+ 4504, 4865, 3, 197, 8785, 3690, 530, 4855, 4866, 3,
+ 2142, 40976, 4829, 4865, 4856, 4867, 3, 198, 8787, 3689,
+ 528, 4830, 4866, 3, 949, 37001, 4831, 4867, 4854, 4865,
+ 3, 199, 8789, 3692, 534, 4805, 4866, 3, 2647, 25392,
+ 4779, 4865, 4806, 4867, 3, 201, 8791, 3691, 532, 4780,
+ 4866, 3, 200, 8790, 4781, 4867, 4804, 4865, 6, 203,
+ 8793, 212, 37010, 944, 36994, 1998, 659, 3694, 538, 4755,
+ 4866, 5, 202, 8792, 945, 36995, 3695, 539, 4729, 4865,
+ 4756, 4867, 3, 942, 36992, 3693, 536, 4730, 4866, 4,
+ 204, 8794, 943, 36993, 4731, 4867, 4754, 4865, 1, 4705,
+ 4866, 5, 205, 8796, 948, 36999, 2001, 662, 4679, 4865,
+ 4706, 4867, 4, 946, 36996, 2000, 661, 3696, 540, 4680,
+ 4866, 4, 947, 36997, 1999, 660, 4681, 4867, 4704, 4865,
+ 3, 2144, 40993, 3464, 544, 3697, 546, 1, 2143, 40992,
+ 1, 2146, 40995, 2, 2145, 40994, 3465, 547, 2, 3466,
+ 548, 3699, 550, 2, 2147, 40996, 2644, 25344, 2, 2149,
+40999, 3698, 548, 1, 2148, 40998, 1, 3702, 554, 2,
+ 2150, 41000, 3703, 555, 1, 3700, 552, 1, 3701, 553,
+ 1, 3705, 558, 2, 2779, 661, 3704, 556, 1, 2778,
+ 660, 2, 3467, 560, 3707, 562, 1, 2151, 41008, 2,
+ 2777, 649, 3706, 560, 3, 1835, 37017, 2152, 41010, 2776,
+ 648, 1, 3709, 566, 1, 2645, 25360, 1, 3708, 564,
+ 1, 2772, 642, 1, 3710, 568, 1, 2775, 647, 1,
+ 2774, 645, 1, 2773, 644, 3, 114, 772, 1327, 37221,
+ 3925, 512, 3, 115, 773, 1326, 37220, 3025, 4920, 4,
+ 116, 774, 1328, 37223, 2641, 25312, 3926, 514, 2, 117,
+ 775, 3026, 4922, 3, 110, 768, 978, 37209, 1323, 37217,
+ 1, 111, 769, 2, 112, 770, 1325, 37219, 2, 113,
+ 771, 1324, 37218, 3, 977, 37205, 1612, 800, 2514, 4881,
+ 1, 2513, 4880, 2, 975, 37201, 2018, 832, 1, 1613,
+ 805, 1, 976, 37202, 3, 1614, 824, 2643, 25330, 3927,
+ 528, 2, 2642, 25328, 3928, 530, 1, 1330, 37233, 1,
+ 1329, 37232, 1, 1331, 37234, 2, 216, 37204, 2512, 4864,
+ 1, 974, 37191, 1, 3024, 4900, 2, 1609, 776, 1678,
+ 772, 1, 1610, 777, 1, 2638, 25280, 2, 991, 37241,
+ 1674, 768, 2, 990, 37240, 1675, 769, 1, 1676, 770,
+ 1, 1677, 771, 2, 987, 37237, 1839, 37189, 3, 986,
+37236, 2520, 4912, 4434, 37417, 1, 989, 37239, 1, 988,
+37238, 1, 983, 37233, 1, 982, 37232, 2, 985, 37235,
+ 1607, 774, 2, 984, 37234, 1608, 775, 2, 1319, 37205,
+ 4435, 37424, 1, 1318, 37204, 2, 1321, 37207, 2639, 25296,
+ 1, 1320, 37206, 5, 981, 37225, 1739, 4945, 1912, 768,
+ 1954, 770, 2819, 4873, 2, 980, 37224, 1738, 4944, 2,
+ 1317, 37203, 1952, 768, 3, 1740, 4946, 1953, 769, 2640,
+25301, 2, 2516, 4897, 2817, 4869, 2, 2515, 4896, 2816,
+ 4868, 1, 2518, 4899, 3, 979, 37222, 2517, 4898, 2818,
+ 4870, 1, 2813, 4865, 2, 1322, 37208, 2519, 4900, 1,
+ 2815, 4867, 3, 1611, 791, 1741, 4954, 2814, 4866, 3,
+ 694, 4884, 785, 21008, 3807, 900, 1, 695, 4885, 3,
+ 696, 4886, 786, 21010, 3808, 902, 2, 2008, 782, 2636,
+25248, 4, 692, 4880, 969, 37144, 2399, 769, 3805, 896,
+ 1, 970, 37145, 3, 693, 4882, 2637, 25253, 3806, 898,
+ 1, 2203, 41344, 1, 966, 37140, 1, 967, 37141, 1,
+ 2007, 775, 2, 968, 37143, 2006, 774, 5, 697, 4888,
+ 878, 33105, 1316, 37160, 2003, 769, 3809, 904, 2, 877,
+33104, 2002, 768, 3, 965, 37138, 2005, 771, 3810, 906,
+ 2, 2004, 770, 2935, 816, 1, 3815, 916, 2, 2488,
+ 776, 3816, 917, 2, 2207, 41365, 3817, 918, 1, 2206,
+41364, 3, 689, 4864, 2205, 41363, 3811, 912, 4, 690,
+ 4865, 2013, 792, 2204, 41362, 3812, 913, 2, 691, 4866,
+ 3813, 914, 1, 3814, 915, 1, 961, 37124, 3, 962,
+37125, 2011, 788, 2484, 768, 1, 963, 37126, 3, 964,
+37127, 2012, 790, 2485, 770, 2, 958, 37120, 3818, 920,
+ 3, 959, 37121, 2009, 784, 2486, 772, 3, 1485, 4912,
+ 1838, 37170, 3819, 922, 4, 960, 37123, 2010, 786, 2487,
+ 774, 2934, 800, 1, 3822, 932, 1, 2794, 796, 1,
+ 3823, 934, 2, 2635, 25216, 2795, 798, 3, 1737, 4864,
+ 1836, 37128, 3820, 928, 1, 2792, 792, 1, 3821, 930,
+ 2, 2793, 794, 2933, 792, 3, 215, 37156, 1615, 833,
+ 3826, 940, 3, 2016, 804, 2791, 788, 2932, 790, 1,
+ 2931, 788, 3, 2015, 801, 2789, 785, 3824, 936, 5,
+ 213, 37153, 1616, 836, 2014, 800, 2788, 784, 2930, 786,
+ 2, 1483, 4864, 3825, 938, 3, 214, 37155, 2790, 786,
+ 2929, 784, 1, 2786, 781, 1, 2785, 780, 2, 1315,
+37142, 2787, 783, 2, 698, 4896, 2782, 777, 2, 1313,
+37137, 2781, 776, 1, 2784, 779, 3, 1314, 37139, 2783,
+ 778, 2928, 776, 2, 971, 37157, 2927, 774, 1, 972,
+37158, 3, 973, 37159, 2780, 774, 2926, 772, 1, 1837,
+37136, 2, 2017, 816, 2925, 770, 1, 1484, 4880, 1,
+ 2924, 768, 2, 2632, 25184, 4565, 512, 1, 3787, 838,
+ 1, 4590, 512, 1, 3786, 836, 1, 4615, 512, 2,
+ 2633, 25189, 3785, 834, 1, 4640, 512, 1, 3784, 832,
+ 1, 4465, 512, 1, 4490, 512, 1, 3790, 844, 1,
+ 4515, 512, 1, 3789, 842, 1, 4540, 512, 1, 3788,
+ 840, 2, 2634, 25200, 4765, 512, 1, 3795, 854, 2,
+ 3794, 853, 4790, 512, 1, 3793, 852, 1, 4815, 512,
+ 1, 3792, 850, 1, 4840, 512, 1, 3791, 848, 1,
+ 4665, 512, 1, 4690, 512, 1, 4715, 512, 1, 3797,
+ 858, 1, 4740, 512, 1, 3796, 856, 1, 3801, 870,
+ 2, 2195, 41319, 3800, 868, 1, 2191, 41312, 2, 2192,
+41313, 3799, 866, 1, 2193, 41314, 2, 2194, 41315, 3798,
+ 864, 1, 2196, 41320, 1, 2197, 41322, 1, 2202, 41332,
+ 1, 3804, 884, 1, 2198, 41328, 2, 2199, 41329, 3803,
+ 882, 1, 2200, 41330, 2, 2201, 41331, 3802, 880, 5,
+ 2257, 57345, 2625, 25121, 3764, 774, 4575, 4608, 4602, 4610,
+ 2, 4576, 4609, 4603, 4611, 4, 2627, 25123, 3763, 772,
+ 4577, 4610, 4600, 4608, 3, 2626, 25122, 4578, 4611, 4601,
+ 4609, 4, 2629, 25125, 3762, 770, 4625, 4608, 4652, 4610,
+ 4, 2258, 57348, 2628, 25124, 4626, 4609, 4653, 4611, 3,
+ 1002, 37272, 4627, 4610, 4650, 4608, 5, 1003, 37273, 2259,
+57350, 2630, 25126, 4628, 4611, 4651, 4609, 3, 1000, 37270,
+ 4475, 4608, 4502, 4610, 5, 1001, 37271, 2260, 57352, 3770,
+ 783, 4476, 4609, 4503, 4611, 3, 3768, 780, 4477, 4610,
+ 4500, 4608, 4, 999, 37269, 3769, 781, 4478, 4611, 4501,
+ 4609, 3, 3767, 778, 4525, 4608, 4552, 4610, 2, 4526,
+ 4609, 4553, 4611, 3, 3765, 776, 4527, 4610, 4550, 4608,
+ 3, 3766, 777, 4528, 4611, 4551, 4609, 4, 2262, 57361,
+ 3773, 790, 4775, 4608, 4802, 4610, 4, 2261, 57360, 2631,
+25136, 4776, 4609, 4803, 4611, 3, 3772, 788, 4777, 4610,
+ 4800, 4608, 2, 4778, 4611, 4801, 4609, 3, 3771, 786,
+ 4825, 4608, 4852, 4610, 3, 2178, 41232, 4826, 4609, 4853,
+ 4611, 2, 4827, 4610, 4850, 4608, 3, 2179, 41234, 4828,
+ 4611, 4851, 4609, 3, 998, 37254, 4675, 4608, 4702, 4610,
+ 2, 4676, 4609, 4703, 4611, 3, 996, 37252, 4677, 4610,
+ 4700, 4608, 3, 997, 37253, 4678, 4611, 4701, 4609, 3,
+ 994, 37250, 4725, 4608, 4752, 4610, 3, 995, 37251, 4726,
+ 4609, 4753, 4611, 4, 992, 37248, 3774, 792, 4727, 4610,
+ 4750, 4608, 3, 993, 37249, 4728, 4611, 4751, 4609, 2,
+ 2185, 41253, 2264, 57377, 2, 2184, 41252, 2263, 57376, 1,
+ 2266, 57379, 1, 2265, 57378, 3, 2181, 41249, 2268, 57381,
+ 3776, 802, 2, 2180, 41248, 2267, 57380, 2, 2183, 41251,
+ 3775, 800, 1, 2182, 41250, 1, 3203, 886, 2, 2270,
+57393, 3780, 822, 2, 2269, 57392, 2624, 25104, 1, 3779,
+ 820, 1, 2188, 41270, 1, 3778, 818, 1, 2186, 41264,
+ 1, 3777, 816, 1, 2187, 41266, 1, 3783, 828, 1,
+ 3782, 826, 1, 2189, 41272, 1, 3781, 824, 1, 2190,
+41274, 1, 3130, 16, 1, 1503, 5234, 1, 1502, 5232,
+ 1, 2522, 5121, 2, 2521, 5120, 3131, 21, 1, 2691,
+26096, 2, 1497, 5219, 2020, 1088, 2, 2021, 1089, 2072,
+ 5120, 1, 1496, 5216, 1, 1500, 5223, 2, 1499, 5222,
+ 3129, 5, 1, 1498, 5221, 1, 708, 5200, 1, 1501,
+ 5224, 1, 2690, 26080, 1, 3031, 5125, 2, 1493, 5202,
+ 3030, 5124, 1, 3033, 5127, 2, 1492, 5200, 3032, 5126,
+ 1, 3027, 5121, 1, 3029, 5123, 2, 1494, 5204, 3028,
+ 5122, 3, 1684, 1040, 1913, 1024, 3039, 5133, 3, 709,
+ 5216, 1685, 1041, 3038, 5132, 1, 1686, 1042, 3, 1495,
+ 5208, 1687, 1043, 3040, 5134, 1, 3035, 5129, 1, 3034,
+ 5128, 2, 2689, 26064, 3037, 5131, 1, 3036, 5130, 2,
+ 1490, 5187, 3132, 32, 1, 1491, 5189, 1, 1679, 1024,
+ 2, 710, 5232, 1680, 1025, 1, 1681, 1026, 1, 1682,
+ 1027, 1, 1683, 1028, 2, 1180, 38401, 2942, 1058, 2,
+ 1181, 38402, 2941, 1057, 2, 1182, 38403, 2940, 1056, 5,
+ 20, 5136, 1183, 38404, 1489, 5174, 2944, 1063, 4437, 272,
+ 2, 1184, 38405, 2489, 1024, 2, 1185, 38406, 4438, 274,
+ 2, 1186, 38407, 2943, 1060, 1, 699, 5120, 1, 700,
+ 5121, 1, 701, 5122, 1, 702, 5123, 1, 703, 5124,
+ 1, 704, 5125, 1, 2688, 26032, 4, 1488, 5155, 2019,
+ 1024, 2492, 1044, 2946, 1074, 1, 1487, 5152, 1, 2945,
+ 1072, 2, 19, 5120, 4436, 256, 1, 2490, 1040, 2,
+ 2491, 1042, 2947, 1076, 1, 705, 5137, 1, 706, 5138,
+ 1, 707, 5139, 1, 2687, 26016, 1, 2796, 1025, 2,
+ 1187, 38433, 2937, 1026, 2, 1188, 38434, 2798, 1027, 3,
+ 1189, 38435, 2797, 1026, 2936, 1024, 3, 22, 5168, 1190,
+38436, 2800, 1029, 2, 2799, 1028, 2939, 1030, 1, 23,
+ 5170, 2, 1486, 5141, 2938, 1028, 1, 1755, 5136, 1,
+ 2686, 26000, 1, 1749, 5128, 1, 1750, 5131, 2, 21,
+ 5152, 1751, 5132, 1, 1752, 5133, 1, 1753, 5134, 1,
+ 1754, 5135, 1, 1742, 5121, 1, 1743, 5122, 1, 1744,
+ 5123, 1, 1745, 5124, 1, 1746, 5125, 1, 1747, 5126,
+ 1, 1748, 5127, 1, 3850, 1107, 1, 3849, 1106, 1,
+ 3848, 1105, 1, 3847, 1104, 1, 3244, 1280, 1, 3846,
+ 1091, 1, 3845, 1090, 1, 3844, 1089, 1, 3843, 1088,
+ 1, 2685, 25952, 1, 2684, 25936, 1, 2683, 25925, 1,
+ 2682, 25920, 2, 4300, 9472, 4732, 5376, 2, 4326, 9472,
+ 4757, 5376, 2, 4248, 9472, 4682, 5376, 2, 4274, 9472,
+ 4707, 5376, 3, 3830, 1042, 4404, 9472, 4832, 5376, 4,
+ 711, 5248, 3829, 1040, 4430, 9472, 4857, 5376, 2, 4352,
+ 9472, 4782, 5376, 1, 2681, 25904, 2, 4378, 9472, 4807,
+ 5376, 2, 4092, 9472, 4532, 5376, 1, 2084, 9216, 2,
+ 4118, 9472, 4557, 5376, 2, 4040, 9472, 4482, 5376, 2,
+ 4066, 9472, 4507, 5376, 4, 2242, 42497, 3828, 1026, 4196,
+ 9472, 4632, 5376, 1, 2241, 42496, 4, 712, 5264, 2243,
+42499, 4222, 9472, 4657, 5376, 2, 713, 5265, 3827, 1025,
+ 2, 4144, 9472, 4582, 5376, 1, 2680, 25888, 2, 4170,
+ 9472, 4607, 5376, 1, 714, 5269, 1, 3838, 1074, 1,
+ 3839, 1075, 1, 3837, 1073, 1, 3842, 1078, 1, 2679,
+25872, 1, 3840, 1076, 1, 3841, 1077, 1, 1300, 13313,
+ 1, 1301, 13314, 1, 1302, 13315, 1, 1303, 13316, 1,
+ 1304, 13317, 1, 1305, 13318, 1, 3833, 1058, 1, 3834,
+ 1059, 1, 3831, 1056, 1, 3832, 1057, 1, 2678, 25856,
+ 1, 3835, 1060, 1, 3836, 1061, 2, 2034, 1364, 4442,
+ 4112, 2, 2035, 1365, 3136, 277, 1, 2036, 1366, 3,
+ 2030, 1360, 3125, 1040, 3135, 272, 2, 1214, 38720, 2031,
+ 1361, 1, 2032, 1362, 1, 2033, 1363, 1, 2677, 25840,
+ 1, 1215, 38729, 1, 1217, 38741, 1, 3134, 261, 1,
+ 1218, 38742, 3, 1216, 38737, 3133, 256, 4439, 4100, 1,
+ 4440, 4102, 1, 4441, 4106, 1, 1220, 38745, 1, 1219,
+38744, 2, 1226, 38757, 2823, 5381, 1, 1225, 38756, 2,
+ 1228, 38759, 2824, 5383, 1, 1227, 38758, 2, 1222, 38753,
+ 2820, 5377, 1, 1221, 38752, 2, 1224, 38755, 2822, 5379,
+ 2, 1223, 38754, 2821, 5378, 1, 2827, 5389, 1, 2826,
+ 5388, 1, 2676, 25808, 2, 1230, 38761, 1914, 1280, 2,
+ 1229, 38760, 2825, 5384, 1, 1915, 1282, 1, 3127, 1060,
+ 1, 3128, 1062, 5, 1232, 38769, 2038, 1376, 2828, 5393,
+ 3126, 1056, 3137, 288, 1, 1231, 38768, 1, 2039, 1378,
+ 2, 1233, 38770, 2829, 5394, 1, 2675, 25792, 3, 26,
+ 5392, 2026, 1301, 2494, 1281, 2, 27, 5393, 2493, 1280,
+ 1, 28, 5394, 1, 716, 5384, 1, 1191, 38657, 2,
+ 1514, 5424, 2025, 1299, 3, 1515, 5425, 2024, 1298, 2953,
+ 1312, 1, 29, 5402, 1, 715, 5376, 1, 2027, 1304,
+ 1, 2028, 1306, 2, 24, 5376, 1510, 5414, 2, 1192,
+38677, 1511, 5415, 1, 1193, 38678, 2, 1194, 38679, 1509,
+ 5413, 1, 25, 5380, 1, 2022, 1280, 1, 2674, 25760,
+ 2, 717, 5392, 1195, 38680, 2, 718, 5393, 1196, 38681,
+ 1, 1512, 5416, 2, 1513, 5417, 2023, 1290, 1, 1201,
+38692, 2, 1202, 38693, 1507, 5399, 1, 1203, 38694, 2,
+ 1204, 38695, 1506, 5397, 2, 1197, 38688, 1504, 5394, 2,
+ 1198, 38689, 1505, 5395, 1, 1199, 38690, 2, 1200, 38691,
+ 2948, 1280, 1, 2673, 25744, 1, 719, 5408, 2, 720,
+ 5409, 1205, 38697, 1, 1508, 5400, 1, 1208, 38708, 2,
+ 1209, 38709, 2952, 1302, 1, 1210, 38710, 2, 1211, 38711,
+ 2951, 1300, 2, 2029, 1312, 2950, 1298, 1, 1206, 38706,
+ 2, 1207, 38707, 2949, 1296, 2, 721, 5424, 1212, 38712,
+ 2, 722, 5425, 1213, 38713, 2, 3180, 1296, 3204, 1280,
+ 1, 2672, 25712, 2, 3179, 1280, 3205, 1296, 2, 2247,
+42820, 2671, 25696, 1, 3206, 1312, 1, 2670, 25680, 1,
+ 2669, 25664, 1, 3234, 1280, 1, 2668, 25648, 1, 3862,
+ 1298, 1, 2037, 1434, 1, 3860, 1296, 1, 3861, 1297,
+ 1, 3231, 1280, 1, 3858, 1288, 1, 3859, 1289, 1,
+ 3856, 1286, 2, 2667, 25632, 3857, 1287, 1, 3854, 1284,
+ 1, 3855, 1285, 1, 3852, 1282, 1, 3853, 1283, 1,
+ 3851, 1281, 1, 2666, 25616, 1, 2245, 42801, 1, 2244,
+42800, 1, 2246, 42802, 1, 2665, 25600, 2, 226, 37977,
+ 1118, 37961, 2, 225, 37976, 1851, 38008, 1, 1115, 37953,
+ 1, 1114, 37952, 1, 1116, 37954, 1, 1850, 38004, 1,
+ 1117, 37959, 1, 1119, 37969, 1, 1120, 37970, 1, 1121,
+37973, 1, 1123, 37975, 1, 1122, 37974, 1, 1132, 37993,
+ 2, 1131, 37992, 1367, 37968, 1, 1368, 37971, 1, 1124,
+37985, 1, 1126, 37987, 1, 1125, 37986, 1, 1128, 37989,
+ 2, 1127, 37988, 1849, 37972, 1, 1130, 37991, 1, 1129,
+37990, 1, 1134, 38001, 2, 227, 37984, 1133, 38000, 2,
+ 1136, 38003, 1845, 37955, 1, 1135, 38002, 1, 1847, 37957,
+ 2, 1137, 38004, 1846, 37956, 1, 1139, 38007, 2, 1138,
+38006, 1848, 37958, 2, 723, 5632, 2236, 42131, 1, 2235,
+42130, 2, 724, 5634, 2234, 42129, 1, 725, 5636, 1,
+ 2238, 42134, 1, 726, 5638, 1, 2237, 42132, 2, 224,
+37904, 727, 5640, 2, 1087, 37889, 2042, 1552, 1, 1088,
+37890, 2, 1089, 37891, 2043, 1554, 1, 1090, 37892, 1,
+ 1091, 37893, 1, 1092, 37894, 1, 1093, 37895, 1, 728,
+ 5648, 1, 1366, 37921, 1, 729, 5650, 1, 1094, 37904,
+ 1, 2040, 1536, 2, 1095, 37906, 1844, 37922, 1, 2041,
+ 1538, 1, 30, 5632, 1, 1096, 37911, 2, 730, 5664,
+ 1103, 37928, 1, 1104, 37929, 1, 731, 5666, 1, 732,
+ 5667, 1, 733, 5668, 1, 1097, 37920, 2, 1841, 37905,
+ 2955, 1538, 2, 1098, 37923, 2954, 1536, 1, 1099, 37924,
+ 2, 1100, 37925, 1842, 37909, 2, 1101, 37926, 1843, 37910,
+ 2, 1102, 37927, 2956, 1540, 1, 1112, 37944, 2, 296,
+37937, 1113, 37945, 1, 1105, 37936, 1, 2044, 1568, 1,
+ 1106, 37938, 1, 1107, 37939, 1, 1108, 37940, 1, 1109,
+37941, 1, 1110, 37942, 1, 1111, 37943, 1, 2045, 1786,
+ 1, 2232, 41987, 1, 2231, 41986, 1, 2233, 41988, 2,
+ 1169, 38217, 1695, 1840, 1, 1168, 38216, 1, 1165, 38213,
+ 1, 1164, 38212, 1, 1167, 38215, 1, 1166, 38214, 2,
+ 1161, 38209, 3139, 784, 1, 1163, 38211, 1, 1162, 38210,
+ 2, 1179, 38233, 1692, 1824, 2, 1178, 38232, 1693, 1825,
+ 2, 1694, 1826, 2049, 1866, 1, 1175, 38229, 2, 1174,
+38228, 3138, 773, 1, 1177, 38231, 1, 1176, 38230, 1,
+ 1171, 38225, 1, 1170, 38224, 1, 1173, 38227, 1, 1172,
+38226, 1, 1691, 1808, 1, 1688, 1792, 1, 1689, 1793,
+ 1, 1690, 1794, 1, 736, 5892, 2, 737, 5894, 1371,
+38198, 2, 734, 5888, 1143, 38152, 1, 1144, 38153, 1,
+ 735, 5890, 1, 2046, 1818, 2, 1140, 38148, 4443, 16,
+ 1, 1141, 38150, 2, 1142, 38151, 1859, 38199, 1, 738,
+ 5896, 2, 739, 5904, 1151, 38168, 1, 1152, 38169, 1,
+ 740, 5906, 1, 1147, 38164, 1, 1148, 38165, 1, 1149,
+38166, 1, 1150, 38167, 2, 1145, 38160, 1858, 38176, 2,
+ 1146, 38161, 1370, 38185, 2, 741, 5920, 1157, 38184, 1,
+ 2048, 1850, 1, 1153, 38180, 2, 1154, 38181, 2961, 1798,
+ 2, 1155, 38182, 2960, 1797, 2, 1156, 38183, 2959, 1796,
+ 1, 1369, 38168, 1, 2958, 1794, 1, 2957, 1792, 1,
+ 1160, 38200, 1, 1696, 1856, 2, 2047, 1834, 2967, 1816,
+ 2, 2966, 1815, 4444, 32, 2, 1855, 38149, 2965, 1814,
+ 1, 1856, 38150, 2, 1857, 38151, 2964, 1812, 1, 1158,
+38192, 3, 1159, 38193, 1852, 38145, 2963, 1810, 1, 1853,
+38146, 2, 1854, 38147, 2962, 1808, 2, 4146, 9744, 4353,
+ 9728, 2, 4172, 9744, 4379, 9728, 2, 4198, 9744, 4405,
+ 9728, 2, 4224, 9744, 4431, 9728, 2, 4042, 9744, 4249,
+ 9728, 2, 4068, 9744, 4275, 9728, 2, 4094, 9744, 4301,
+ 9728, 2, 4120, 9744, 4327, 9728, 2, 4145, 9728, 4354,
+ 9744, 2, 2239, 42244, 2693, 26144, 2, 4171, 9728, 4380,
+ 9744, 2, 4197, 9728, 4406, 9744, 2, 4223, 9728, 4432,
+ 9744, 2, 4041, 9728, 4250, 9744, 2, 4067, 9728, 4276,
+ 9744, 2, 4093, 9728, 4302, 9744, 2, 4119, 9728, 4328,
+ 9744, 1, 2692, 26128, 1, 2240, 42277, 2, 1701, 2072,
+ 2830, 6145, 1, 2832, 6147, 1, 2831, 6146, 1, 2834,
+ 6149, 1, 2833, 6148, 1, 2836, 6151, 1, 2835, 6150,
+ 1, 1697, 2064, 1, 2837, 6152, 1, 1698, 2066, 1,
+ 1699, 2067, 1, 1700, 2068, 1, 2255, 56077, 1, 2254,
+56076, 1, 2253, 56075, 1, 2252, 56071, 1, 2251, 56070,
+ 1, 2250, 56064, 1, 2256, 56179, 1, 742, 6144, 1,
+ 743, 6145, 1, 744, 6146, 1, 745, 6147, 1, 2052,
+ 2282, 1, 2051, 2266, 1, 2050, 2264, 1, 2841, 6405,
+ 1, 2840, 6404, 1, 2842, 6407, 1, 2838, 6401, 1,
+ 2839, 6403, 1, 2053, 2552, 3, 4466, 2048, 4492, 2050,
+ 4519, 2052, 1, 4493, 2051, 3, 4467, 2050, 4491, 2048,
+ 4544, 2052, 1, 4468, 2051, 3, 4469, 2052, 4516, 2048,
+ 4542, 2050, 1, 4543, 2051, 3, 4494, 2052, 4517, 2050,
+ 4541, 2048, 1, 4518, 2051, 4, 3122, 2310, 4566, 2048,
+ 4592, 2050, 4619, 2052, 1, 4593, 2051, 4, 3121, 2308,
+ 4567, 2050, 4591, 2048, 4644, 2052, 1, 4568, 2051, 3,
+ 4569, 2052, 4616, 2048, 4642, 2050, 1, 4643, 2051, 3,
+ 4594, 2052, 4617, 2050, 4641, 2048, 1, 4618, 2051, 3,
+ 4666, 2048, 4692, 2050, 4719, 2052, 1, 4693, 2051, 3,
+ 4667, 2050, 4691, 2048, 4744, 2052, 1, 4668, 2051, 3,
+ 4669, 2052, 4716, 2048, 4742, 2050, 1, 4743, 2051, 3,
+ 4694, 2052, 4717, 2050, 4741, 2048, 1, 4718, 2051, 3,
+ 4766, 2048, 4792, 2050, 4819, 2052, 1, 4793, 2051, 3,
+ 4767, 2050, 4791, 2048, 4844, 2052, 1, 4768, 2051, 4,
+ 3124, 2322, 4769, 2052, 4816, 2048, 4842, 2050, 1, 4843,
+ 2051, 4, 3123, 2320, 4794, 2052, 4817, 2050, 4841, 2048,
+ 1, 4818, 2051, 1, 1702, 2562, 1, 1703, 2564, 1,
+ 2843, 6657, 1, 2844, 6659, 1, 2846, 6661, 1, 2845,
+ 6660, 1, 1247, 38928, 1, 1240, 38920, 1, 1241, 38921,
+ 1, 1242, 38923, 1, 1243, 38924, 1, 1244, 38925, 1,
+ 1245, 38926, 1, 1246, 38927, 1, 1234, 38913, 1, 1235,
+38915, 1, 1236, 38916, 1, 1237, 38917, 1, 1238, 38918,
+ 1, 1239, 38919, 1, 2248, 43410, 1, 4862, 16, 1,
+ 4861, 9, 1, 4860, 8, 1, 4864, 48, 1, 1831,
+32736, 1, 4863, 32, 1, 4865, 64, 1, 4870, 64,
+ 1, 4017, 1, 1, 4869, 48, 1, 4868, 32, 1,
+ 4866, 16, 1, 4867, 17, 1, 4875, 57565, 1, 4873,
+57344, 1, 4874, 57357,
};
-unsigned short DictKeyHashTable[] = {
- 4096, 4097, 4100, 4096, 4103, 4096, 4106, 4096, 4096, 4109,
- 4112, 4115, 4118, 4096, 4096, 4096, 4121, 4124, 4127, 4130,
- 4133, 4138, 4141, 4096, 4144, 4096, 4096, 4149, 4152, 4155,
- 4096, 4160, 4163, 4168, 4096, 4171, 4096, 4174, 4096, 4177,
- 4182, 4187, 4190, 4096, 4195, 4096, 4096, 4198, 4096, 4203,
- 4208, 4096, 4215, 4218, 4223, 4228, 4096, 4231, 4096, 4234,
- 4237, 4096, 4096, 4240, 4096, 4096, 4096, 4243, 4246, 4251,
- 4096, 4254, 4257, 4260, 4265, 4096, 4268, 4273, 4276, 4096,
- 4096, 4096, 4096, 4096, 4096, 4283, 4096, 4286, 4297, 4096,
- 4096, 4300, 4305, 4096, 4096, 4308, 4096, 4311, 4096, 4096,
- 4096, 4316, 4319, 4322, 4096, 4325, 4328, 4337, 4342, 4345,
- 4352, 4357, 4364, 4369, 4376, 4379, 4386, 4389, 4394, 4397,
- 4400, 4407, 4410, 4417, 4422, 4431, 4438, 4441, 4444, 4096,
- 4096, 4449, 4096, 4456, 4459, 4464, 4469, 4096, 4096, 4096,
- 4096, 4096, 4472, 4479, 4096, 4096, 4482, 4491, 4494, 4096,
- 4096, 4499, 4502, 4507, 4514, 4519, 4522, 4096, 4529, 4096,
- 4532, 4537, 4542, 4545, 4548, 4096, 4096, 4096, 4553, 4096,
- 4096, 4096, 4556, 4565, 4096, 4568, 4571, 4096, 4576, 4581,
- 4096, 4096, 4096, 4584, 4096, 4096, 4096, 4589, 4592, 4096,
- 4096, 4601, 4096, 4604, 4607, 4610, 4615, 4096, 4096, 4096,
- 4618, 4621, 4624, 4627, 4632, 4635, 4644, 4096, 4649, 4096,
- 4096, 4652, 4096, 4096, 4655, 4658, 4096, 4661, 4096, 4096,
- 4666, 4669, 4096, 4096, 4674, 4679, 4684, 4687, 4696, 4703,
- 4710, 4717, 4722, 4729, 4734, 4739, 4096, 4096, 4746, 4753,
- 4096, 4756, 4761, 4096, 4764, 4096, 4767, 4772, 4777, 4784,
- 4791, 4796, 4805, 4812, 4821, 4096, 4096, 4096, 4824, 4829,
- 4096, 4832, 4837, 4096, 4096, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 4840, 4096, 4096, 4843, 4846, 4853, 4860, 4096,
- 4863, 4096, 4868, 4096, 4096, 4871, 4096, 4874, 4877, 4880,
- 4096, 4096, 4883, 4888, 4897, 4900, 4905, 4910, 4915, 4922,
- 4931, 4936, 4939, 4944, 4947, 4096, 4950, 4953, 4096, 4956,
- 4959, 4966, 4969, 4096, 4974, 4977, 4980, 4985, 4990, 4997,
- 5002, 5007, 5014, 5021, 5030, 5035, 5042, 4096, 4096, 4096,
- 5047, 5050, 5053, 5058, 5061, 4096, 5064, 5069, 4096, 5072,
- 4096, 5075, 5078, 5081, 4096, 5088, 4096, 4096, 4096, 4096,
- 5091, 4096, 5098, 5101, 5108, 5111, 5114, 5117, 4096, 5122,
- 5125, 4096, 5128, 4096, 5131, 4096, 5136, 5141, 5146, 5149,
- 5152, 5157, 5164, 4096, 5167, 4096, 5170, 5173, 4096, 5176,
- 5179, 5186, 4096, 5189, 4096, 5194, 4096, 4096, 5197, 5202,
- 4096, 5205, 5208, 4096, 5215, 4096, 5218, 5223, 4096, 5226,
- 5229, 5234, 4096, 5239, 5244, 5247, 4096, 5250, 5255, 4096,
- 5258, 5263, 4096, 5266, 4096, 4096, 4096, 5275, 5280, 5285,
- 5292, 5295, 5300, 5309, 5312, 5315, 5318, 5321, 5324, 5329,
- 5332, 5337, 5342, 4096, 5345, 4096, 4096, 5348, 4096, 5351,
- 4096, 5354, 5359, 4096, 5362, 4096, 5367, 5372, 4096, 5377,
- 5380, 5385, 5390, 4096, 4096, 5397, 5400, 5405, 5410, 5417,
- 5420, 5425, 5430, 5433, 4096, 5436, 4096, 5439, 5446, 5449,
- 4096, 4096, 4096, 4096, 4096, 4096, 4096, 4096, 5452, 5455,
- 5462, 5469, 5476, 5481, 5484, 4096, 5491, 4096, 4096, 5494,
- 5497, 4096, 4096, 5500, 5503, 5508, 5511, 4096, 4096, 5514,
- 4096, 5517, 4096, 5522, 5527, 5530, 4096, 5533, 5538, 5543,
- 4096, 5548, 5553, 4096, 5556, 5561, 4096, 5566, 5569, 4096,
- 5572, 5575, 5580, 5585, 5590, 5595, 5602, 5607, 5614, 5621,
- 5626, 5633, 5638, 5647, 5652, 5657, 5660, 5663, 4096, 4096,
- 5666, 5675, 5680, 5683, 5688, 5691, 4096, 5696, 5699, 4096,
- 5702, 4096, 5705, 5708, 5711, 5718, 5727, 5734, 5739, 5742,
- 5747, 5750, 4096, 5757, 5762, 4096, 5767, 5770, 5773, 5778,
- 5781, 5784, 5793, 5800, 5807, 5812, 4096, 5815, 4096, 4096,
- 5820, 5823, 4096, 5826, 4096, 4096, 5833, 5836, 4096, 5839,
- 5842, 5845, 5850, 4096, 5853, 5856, 5859, 5862, 4096, 5867,
- 4096, 4096, 5870, 4096, 4096, 5875, 4096, 5878, 5881, 5884,
- 5887, 5890, 5893, 4096, 5896, 5901, 4096, 4096, 4096, 4096,
- 5908, 4096, 5915, 4096, 5918, 5923, 5926, 4096, 5929, 5936,
- 5941, 5944, 5949, 5954, 5959, 5962, 5969, 4096, 4096, 5974,
- 5977, 5980, 4096, 5983, 5986, 4096, 5991, 4096, 4096, 5994,
- 4096, 4096, 5999, 6004, 4096, 6007, 6012, 4096, 6015, 4096,
- 6018, 6021, 6026, 4096, 6033, 6036, 4096, 6039, 6042, 4096,
- 6047, 4096, 6050, 4096, 6053, 6056, 6063, 6066, 4096, 4096,
- 6069, 4096, 4096, 6072, 6075, 4096, 6078, 6085, 6088, 6091,
- 6096, 4096, 6099, 6104, 6107, 6110, 6115, 6118, 4096, 4096,
- 6121, 6126, 6129, 6132, 6137, 6140, 4096, 4096, 6145, 4096,
- 6150, 6153, 4096, 6156, 4096, 6161, 4096, 4096, 6164, 4096,
- 6169, 6174, 4096, 6177, 4096, 4096, 4096, 6182, 4096, 6185,
- 6190, 4096, 4096, 6193, 6196, 6203, 6206, 6221, 6224, 6229,
- 6234, 6245, 6250, 6255, 6258, 6263, 6270, 4096, 6275, 6280,
- 6283, 4096, 6286, 4096, 4096, 4096, 6289, 6292, 6295, 4096,
- 6298, 6303, 6306, 6309, 6314, 6319, 4096, 4096, 6324, 4096,
- 4096, 6329, 4096, 4096, 4096, 4096, 6332, 4096, 6339, 6346,
- 4096, 4096, 4096, 6349, 4096, 6354, 6359, 6366, 6369, 6374,
- 6377, 6380, 4096, 6385, 6388, 6393, 6396, 6403, 4096, 4096,
- 6406, 6413, 4096, 4096, 4096, 4096, 4096, 6418, 4096, 4096,
- 6421, 6424, 4096, 4096, 4096, 4096, 6427, 4096, 4096, 4096,
- 6430, 6433, 6438, 4096, 4096, 6441, 4096, 6444, 6449, 6454,
- 6457, 6460, 6463, 6466, 6471, 6474, 6477, 6480, 6483, 6486,
- 6491, 6496, 6501, 6504, 4096, 6507, 6510, 6517, 6520, 4096,
- 6523, 6526, 6531, 4096, 4096, 6534, 4096, 4096, 4096, 4096,
- 6541, 6546, 4096, 4096, 6549, 4096, 4096, 6552, 4096, 4096,
- 6555, 6560, 6565, 4096, 6568, 6573, 6576, 6581, 6592, 6595,
- 6600, 6603, 4096, 6606, 4096, 4096, 6609, 4096, 4096, 4096,
- 4096, 6614, 4096, 4096, 6621, 6624, 6627, 6630, 6633, 6638,
- 6641, 4096, 4096, 6644, 4096, 6647, 6650, 6655, 4096, 6658,
- 4096, 6663, 6666, 4096, 6671, 4096, 6678, 4096, 4096, 6683,
- 4096, 4096, 4096, 4096, 6690, 6693, 6696, 4096, 6699, 6702,
- 4096, 6707, 6710, 6717, 4096, 6720, 6723, 4096, 6726, 6733,
- 6736, 4096, 6739, 6744, 6749, 6752, 6759, 6764, 6767, 6776,
- 6779, 6782, 6787, 6794, 6801, 6804, 6811, 4096, 6814, 6817,
- 6820, 6827, 6832, 4096, 4096, 6839, 6842, 6847, 6852, 6857,
- 6862, 6865, 6874, 4096, 4096, 6879, 4096, 6882, 4096, 6885,
- 6888, 6891, 6894, 4096, 6897, 6900, 6905, 6908, 6911, 4096,
- 6914, 6919, 6922, 4096, 6925, 4096, 6932, 6939, 6948, 6951,
- 6954, 6957, 6960, 6963, 6968, 6975, 6980, 6987, 6992, 6995,
- 4096, 6998, 7009, 4096, 4096, 7012, 7015, 7020, 7023, 7026,
- 7029, 7034, 7037, 7040, 7043, 4096, 7046, 7051, 7054, 7057,
- 7062, 7069, 7072, 4096, 7075, 7080, 7085, 4096, 4096, 7088,
- 7093, 7096, 4096, 7103, 7108, 7111, 4096, 4096, 4096, 7118,
- 4096, 4096, 4096, 4096, 7123, 7126, 4096, 7131, 7142, 4096,
- 4096, 7145, 4096, 4096, 4096, 4096, 7150, 7159, 7166, 7169,
- 7176, 7181, 7186, 7189, 4096, 4096, 7194, 7197, 7200, 7203,
- 7206, 7209, 4096, 4096, 4096, 7212, 7215, 7218, 4096, 7223,
- 4096, 4096, 7228, 4096, 7231, 7236, 7239, 7242, 7245, 4096,
- 4096, 7248, 4096, 7257, 7262, 7265, 7268, 4096, 7271, 7274,
- 4096, 4096, 4096, 4096, 7277, 4096, 7280, 7283, 7290, 4096,
- 7293, 7304, 7309, 7316, 7319, 7322, 7327, 7332, 7335, 7338,
- 7343, 7346, 7349, 4096, 7352, 7361, 7364, 7367, 7370, 7373,
- 7378, 7381, 7386, 4096, 7389, 4096, 4096, 4096, 7392, 7395,
- 7398, 4096, 7407, 7412, 4096, 7419, 7426, 7433, 7438, 7447,
- 7450, 7453, 4096, 7458, 4096, 7465, 4096, 7468, 7471, 4096,
- 7474, 4096, 7481, 7488, 7491, 7498, 4096, 7501, 4096, 7506,
- 4096, 4096, 7509, 7512, 4096, 7517, 7520, 7523, 4096, 7526,
- 7531, 4096, 4096, 4096, 7534, 7537, 7540, 4096, 7543, 4096,
- 7546, 4096, 7549, 7554, 7557, 7560, 4096, 7565, 4096, 7568,
- 4096, 4096, 4096, 7575, 7580, 7583, 7586, 4096, 7589, 7592,
- 7597, 7602, 7607, 7614, 7619, 7624, 7633, 7638, 7645, 7650,
- 7659, 4096, 4096, 4096, 7666, 7671, 7678, 7685, 7690, 7703,
- 7708, 7713, 4096, 4096, 7716, 7721, 7724, 7727, 7730, 7733,
- 7736, 4096, 4096, 4096, 7739, 7742, 7745, 7748, 4096, 7751,
- 4096, 7754, 7761, 7764, 4096, 4096, 4096, 7769, 7772, 4096,
- 7777, 7784, 7787, 7790, 7797, 7804, 4096, 4096, 4096, 7807,
- 7810, 4096, 4096, 4096, 7815, 7820, 7823, 7828, 7831, 4096,
- 4096, 7834, 7837, 7840, 4096, 7843, 7846, 4096, 4096, 7851,
- 7854, 7857, 7866, 7873, 7876, 7881, 7886, 7889, 7898, 4096,
- 4096, 7903, 7906, 7909, 7912, 7915, 7918, 7921, 4096, 7924,
- 7927, 7930, 4096, 7937, 4096, 7942, 7945, 7950, 7953, 7960,
- 7965, 7972, 7975, 7980, 7985, 7990, 7995, 8000, 4096, 4096,
- 8003, 4096, 8010, 8013, 8016, 8019, 8024, 8031, 8036, 4096,
- 4096, 4096, 4096, 8039, 8042, 4096, 8045, 4096, 4096, 8048,
- 8055, 4096, 4096, 4096, 8062, 8065, 8068, 8071, 8076, 4096,
- 4096, 8083, 8086, 8091, 8094, 4096, 8099, 4096, 8102, 8107,
- 8110, 4096, 8113, 8116, 8121, 8124, 8127, 8134, 4096, 8139,
- 8142, 4096, 8145, 8150, 8155, 8158, 8161, 4096, 8166, 8169,
- 8172, 4096, 8175, 4096, 8178, 8183, 8186, 8189, 4096, 8192,
- 8195, 8198, 8203, 8206, 4096, 8209, 4096, 8216, 8219, 4096,
- 8222, 8229, 8234, 8237, 8244, 8249, 8252, 4096, 8257, 8260,
- 8265, 8268, 4096, 4096, 8273, 8278, 8281, 4096, 8284, 8289,
- 4096, 4096, 8292, 8297, 8300, 8309, 8314, 8317, 8320, 8323,
- 4096, 8326, 8331, 8334, 4096, 8339, 8344, 4096, 4096, 8347,
- 8350, 8353, 8356, 8359, 8362, 8367, 8374, 8377, 8382, 4096,
- 8385, 4096, 8388, 8391, 4096, 4096, 4096, 4096, 8394, 8397,
- 8402, 8405, 4096, 8408, 8413, 8416, 8421, 8426, 4096, 8433,
- 8436, 4096, 4096, 8439, 4096, 8442, 4096, 8449, 8456, 8463,
- 8466, 8471, 8474, 8479, 8486, 8489, 8498, 8503, 8512, 8515,
- 8526, 8533, 8538, 8541, 8546, 8549, 8552, 8555, 4096, 8558,
- 4096, 4096, 8561, 4096, 8564, 8571, 8576, 8581, 8584, 8587,
- 8590, 8593, 8596, 8599, 4096, 8608, 8611, 4096, 4096, 8614,
- 8617, 4096, 4096, 8620, 8625, 8630, 4096, 8633, 8636, 8643,
- 8650, 8653, 4096, 4096, 4096, 8656, 4096, 8659, 8662, 8667,
- 8672, 8677, 4096, 4096, 8684, 8691, 8694, 8697, 4096, 8700,
- 8703, 8708, 8715, 8722, 8725, 8728, 8735, 4096, 8738, 4096,
- 8741, 4096, 8744, 4096, 8747, 8752, 8757, 8760, 4096, 8763,
- 8770, 8773, 8776, 8781, 8788, 8791, 8796, 8801, 8812, 8815,
- 8824, 4096, 4096, 4096, 4096, 8829, 8838, 4096, 8845, 8848,
- 8853, 8856, 8859, 4096, 8864, 8867, 8872, 8875, 8878, 8881,
- 4096, 8884, 8889, 8896, 4096, 4096, 8899, 8902, 8905, 8908,
- 8911, 4096, 8914, 8917, 8920, 8923, 4096, 8926, 8929, 4096,
- 8932, 8935, 4096, 4096, 8938, 8941, 8946, 8949, 8954, 8957,
- 8960, 8963, 8966, 8971, 4096, 4096, 8976, 4096, 8979, 4096,
- 8982, 8985, 4096, 4096, 8988, 8997, 9000, 9003, 9006, 9011,
- 9014, 9019, 9024, 4096, 9027, 4096, 9030, 9033, 9036, 9039,
- 9046, 9055, 9058, 4096, 4096, 4096, 9063, 9066, 4096, 9071,
- 9074, 9079, 9082, 9085, 9088, 9095, 9098, 9101, 9104, 9107,
- 4096, 9110, 4096, 4096, 9113, 9116, 4096, 9119, 9122, 9127,
- 9130, 9133, 9138, 9141, 9144, 9153, 9156, 4096, 4096, 9159,
- 9162, 9165, 9168, 9173, 9178, 9181, 9192, 9197, 4096, 9202,
- 9205, 9208, 9215, 9218, 9225, 9230, 9233, 4096, 4096, 4096,
- 4096, 9236, 9239, 9246, 9251, 9254, 4096, 9259, 9264, 9267,
- 9270, 9275, 9278, 9281, 9286, 9289, 9294, 4096, 9299, 4096,
- 9302, 4096, 9305, 4096, 9310, 9313, 4096, 9318, 9321, 9326,
- 9331, 4096, 9336, 4096, 9341, 4096, 9346, 9351, 4096, 9358,
- 9361, 9364, 4096, 4096, 9369, 9372, 9375, 9384, 9387, 9392,
- 9395, 9398, 4096, 9401, 9406, 9411, 9416, 9419, 9428, 9433,
- 9442, 9449, 9458, 9465, 9472, 9477, 9480, 9483, 9488, 9491,
- 9494, 9499, 9504, 9511, 9518, 9527, 9532, 9539, 9542, 9549,
- 4096, 9552, 9557, 4096, 9560, 4096, 4096, 4096, 9565, 4096,
- 4096, 9572, 4096, 9575, 9584, 9589, 4096, 4096, 4096, 9594,
- 4096, 9599, 9606, 4096, 4096, 9611, 9614, 9617, 9622, 9625,
- 9628, 9631, 9636, 9639, 4096, 4096, 9644, 9647, 9652, 4096,
- 4096, 4096, 9655, 9658, 9663, 9666, 9669, 9672, 9677, 9680,
- 9683, 4096, 9686, 9691, 9694, 4096, 4096, 9701, 4096, 4096,
- 4096, 9706, 9709, 9714, 4096, 9717, 4096, 4096, 4096, 9722,
- 4096, 4096, 9725, 4096, 4096, 4096, 9728, 9731, 9734, 9737,
- 9740, 4096, 4096, 9743, 4096, 4096, 4096, 9748, 4096, 9751,
- 9754, 4096, 9757, 9762, 9767, 9774, 9779, 9788, 9795, 9798,
- 9803, 9806, 9813, 4096, 9816, 9819, 9824, 4096, 4096, 9827,
- 9836, 9839, 9842, 9845, 9848, 9853, 9862, 9865, 9870, 9873,
- 9878, 9881, 9884, 9889, 4096, 4096, 9892, 4096, 4096, 4096,
- 4096, 4096, 9897, 9902, 9905, 9908, 9911, 4096, 9914, 9919,
- 4096, 9922, 9925, 4096, 4096, 4096, 4096, 4096, 9930, 4096,
- 4096, 9933, 9936, 9939, 9944, 9947, 9952, 9957, 9960, 4096,
- 9963, 4096, 4096, 9966, 9969, 9972, 4096, 9975, 9978, 9989,
- 9992, 9997, 10002, 10007, 10012, 10019, 10024, 10031, 10034, 10037,
-10042, 10053, 10056, 10061, 4096, 10064, 4096, 4096, 10067, 4096,
-10070, 10073, 10078, 10085, 10092, 10095, 10098, 10101, 10108, 10111,
- 4096, 4096, 10116, 4096, 4096, 10119, 10122, 10125, 10130, 10133,
-10136, 10141, 4096, 4096, 4096, 10146, 10149, 10152, 10155, 4096,
- 4096, 4096, 4096, 10162, 10167, 4096, 10174, 10179, 10184, 10189,
- 4096, 10194, 10197, 4096, 10204, 10207, 10210, 4096, 10217, 10224,
-10227, 10230, 10237, 10240, 10243, 10250, 10257, 4096, 4096, 10260,
-10265, 10272, 4096, 10277, 10280, 10285, 10288, 10295, 4096, 10300,
-10307, 10310, 10313, 4096, 4096, 4096, 10316, 10321, 10324, 10327,
- 4096, 10334, 10337, 10340, 10343, 10348, 4096, 10355, 10358, 4096,
-10361, 10364, 10371, 10374, 10381, 10384, 10389, 10392, 10397, 10400,
-10407, 4096, 4096, 10410, 10413, 10416, 10423, 4096, 4096, 10426,
-10431, 10438, 4096, 10441, 10446, 10449, 10454, 4096, 10461, 10464,
- 4096, 10467, 10470, 10475, 10480, 10487, 10490, 10493, 10496, 10503,
- 4096, 10508, 10515, 10518, 4096, 10521, 10524, 4096, 10529, 10534,
-10539, 4096, 4096, 10544, 4096, 10547, 4096, 10552, 10555, 4096,
-10558, 10561, 10566, 10569, 10576, 10581, 10588, 4096, 10593, 4096,
-10596, 4096, 10603, 10606, 4096, 4096, 4096, 10609, 10616, 4096,
- 4096, 10619, 10624, 10627, 4096, 10630, 4096, 4096, 10635, 4096,
- 4096, 4096, 4096, 10638, 10641, 10644, 10647, 10650, 10653, 10656,
- 4096, 10659, 10662, 10665, 4096, 10672, 4096, 10675, 10678, 10683,
-10688, 10691, 10696, 10699, 10704, 10707, 4096, 10716, 4096, 10721,
- 4096, 4096, 10724, 10729, 4096, 10732, 10739, 10742, 10747, 4096,
- 4096, 4096, 4096, 10754, 4096, 10757, 10768, 10773, 10780, 4096,
-10785, 4096, 4096, 10788, 4096, 10791, 10796, 10799, 4096, 10802,
- 4096, 10805, 4096, 10808, 10813, 10816, 10821, 4096, 10826, 10829,
-10832, 10835, 10844, 10847, 10850, 10855, 10858, 10865, 10874, 10877,
-10882, 10887, 10890, 10893, 10896, 4096, 4096, 4096, 10899, 4096,
-10902, 10905, 4096, 10910, 4096, 10915, 10918, 4096, 4096, 4096,
-10925, 4096, 10928, 10933, 4096, 10938, 4096, 10943, 4096, 10946,
-10951, 4096, 10954, 10957, 10962, 10975, 10980, 10985, 10992, 10997,
-11000, 11007, 11012, 11015, 11020, 11025, 11028, 4096, 11031, 11040,
-11043, 11048, 11051, 11054, 11059, 11062, 11065, 11068, 11071, 11076,
-11081, 11086, 11089, 11094, 11097, 4096, 11100, 4096, 4096, 11105,
-11110, 11113, 4096, 11118, 11121, 4096, 11124, 11129, 11132, 4096,
-11135, 11142, 11149, 11154, 11159, 11166, 11173, 11180, 11185, 11192,
-11195, 11198, 11203, 4096, 11206, 4096, 11209, 11212, 11215, 11218,
-11227, 11234, 11237, 11242, 11245, 11248, 4096, 11253, 11258, 11261,
- 4096, 11264, 11267, 11272, 11275, 11280, 11283, 11290, 11293, 11298,
-11303, 11308, 11313, 11316, 11323, 11328, 11331, 11338, 11341, 11346,
- 4096, 11351, 11358, 11361, 11368, 11371, 11376, 11383, 11390, 4096,
-11395, 4096, 11398, 11407, 11412, 11415, 11418, 11421, 11426, 11429,
- 4096, 4096, 11434, 11437, 11440, 11443, 11452, 11455, 11458, 11469,
-11474, 11477, 4096, 11482, 11485, 4096, 11490, 4096, 11495, 4096,
-11500, 11503, 4096, 11508, 4096, 11511, 4096, 4096, 11516, 11519,
-11522, 4096, 11525, 11528, 4096, 11533, 11536, 11543, 11546, 4096,
-11549, 11552, 4096, 4096, 11557, 4096, 4096, 11562, 11565, 11568,
-11575, 11584, 11587, 11590, 4096, 11595, 11604, 11607, 11612, 11617,
-11620, 11623, 11626, 4096, 4096, 11631, 4096, 11634, 11643, 4096,
- 4096, 4096, 11648, 11653, 4096, 4096, 11656, 11659, 11662, 11665,
- 4096, 4096, 11668, 11673, 11676, 4096, 11683, 11690, 4096, 11695,
- 4096, 4096, 4096, 4096, 11698, 11707, 4096, 4096, 4096, 11714,
- 4096, 11719, 4096, 11722, 11725, 11728, 4096, 11731, 4096, 4096,
-11734, 11737, 11740, 4096, 11745, 4096, 11750, 4096, 11753, 4096,
- 4096, 4096, 4096, 11756, 11761, 4096, 4096, 4096, 11764, 11767,
-11770, 4096, 4096, 11773, 11776, 4096, 11781, 4096, 4096, 11784,
- 4096, 11789, 4096, 11794, 11797, 11802, 11807, 11814, 11817, 11820,
-11825, 11828, 4096, 11833, 11836, 4096, 4096, 4096, 11839, 4096,
-11846, 4096, 4096, 4096, 4096, 4096, 11857, 4096, 11866, 4096,
-11871, 11874, 11877, 4096, 4096, 4096, 11880, 11885, 11890, 11893,
-11896, 11899, 11902, 4096, 4096, 4096, 11907, 4096, 11910, 11915,
-11918, 11921, 4096, 4096, 4096, 4096, 11924, 11927, 4096, 11930,
-11933, 4096, 4096, 11940, 11947, 11952, 4096, 11957, 4096, 4096,
-11960, 11965, 4096, 4096, 4096, 11968, 11971, 11974, 11979, 11982,
-11985, 11988, 11991, 11994, 4096, 4096, 11997, 12000, 4096, 4096,
-12003, 12010, 12013, 4096, 4096, 4096, 4096, 12018, 12023, 4096,
-12026, 12029, 12034, 12037, 12046, 12053, 12056, 4096, 4096, 12063,
- 4096, 12068, 4096, 12071, 12074, 4096, 12079, 4096, 12084, 4096,
-12087, 4096, 4096, 4096, 12092, 12095, 4096, 12100, 12103, 12110,
-12115, 12118, 12125, 4096, 4096, 12132, 12137, 12140, 12147, 12150,
-12155, 12158, 12161, 12166, 12171, 12174, 4096, 12177, 12180, 12183,
- 4096, 12186, 12191, 4096, 12194, 4096, 12201, 12204, 4096, 12207,
-12218, 12227, 12230, 12237, 12240, 12247, 12250, 12253, 4096, 12258,
-12265, 12268, 12271, 12278, 4096, 12281, 12284, 12287, 12290, 4096,
-12293, 12296, 12299, 12304, 12311, 12314, 12319, 12324, 12331, 12338,
-12343, 12348, 12353, 12358, 4096, 12361, 4096, 12364, 12369, 4096,
- 4096, 4096, 12374, 4096, 4096, 12377, 12384, 12387, 12392, 12395,
- 4096, 12398, 4096, 12403, 12408, 12411, 12418, 12421, 4096, 12426,
-12429, 12432, 12435, 12440, 12445, 12448, 12451, 12454, 12459, 4096,
- 4096, 4096, 12462, 12469, 4096, 12472, 4096, 12475, 4096, 12480,
-12485, 12488, 4096, 12493, 12500, 12509, 4096, 12512, 4096, 12515,
- 4096, 12518, 12521, 12528, 12531, 4096, 4096, 12534, 12537, 12542,
-12547, 12552, 12557, 12560, 12563, 12568, 4096, 12573, 12578, 12585,
-12592, 12597, 12602, 12611, 12618, 12625, 12636, 4096, 12639, 12642,
- 4096, 4096, 4096, 4096, 4096, 12645, 12648, 12651, 12656, 4096,
-12663, 12666, 12669, 12674, 12677, 4096, 12682, 12689, 4096, 12692,
-12697, 12700, 12705, 12708, 12711, 12714, 12725, 12732, 12741, 12746,
-12753, 12758, 12765, 12770, 12777, 12780, 12785, 4096, 12788, 4096,
-12793, 4096, 12796, 12805, 12814, 4096, 12819, 4096, 12826, 12829,
-12832, 12835, 12840, 12843, 12848, 4096, 4096, 4096, 12855, 4096,
- 4096, 4096, 12858, 12861, 12864, 12869, 12874, 12883, 4096, 4096,
-12886, 12889, 12892, 12897, 4096, 4096, 4096, 12900, 12907, 12910,
-12915, 12918, 12921, 12928, 12931, 12938, 12941, 12946, 12949, 12952,
-12955, 12960, 12965, 12970, 4096, 4096, 4096, 4096, 12973, 12976,
- 4096, 12979, 12982, 12987, 4096, 12994, 12999, 13004, 4096, 13009,
- 4096, 13012, 13017, 13020, 13023, 13030, 13033, 4096, 4096, 4096,
- 4096, 4096, 13036, 13039, 13046, 4096, 13051, 13054, 13057, 13060,
-13063, 13068, 13073, 13076, 4096, 13081, 13086, 13091, 13094, 13099,
-13102, 13105, 13110, 13115, 13120, 13125, 4096, 13132, 4096, 13135,
-13142, 13147, 13152, 13159, 13168, 4096, 13173, 13176, 13181, 4096,
- 4096, 13186, 13189, 13192, 4096, 13197, 13202, 13205, 13212, 13215,
-13220, 13227, 13234, 13237, 13240, 13245, 4096, 13248, 13251, 4096,
-13256, 4096, 4096, 13259, 13264, 4096, 13271, 13276, 13281, 13286,
-13291, 13296, 13301, 13304, 4096, 4096, 4096, 4096, 13307, 13310,
-13315, 13320, 13323, 13326, 13331, 4096, 13336, 4096, 13345, 13348,
- 4096, 4096, 4096, 13353, 4096, 4096, 13356, 13359, 4096, 4096,
- 4096, 4096, 13362, 13367, 13370, 4096, 13375, 13378, 13381, 13384,
-13389, 13392, 4096, 13397, 13400, 13407, 13412, 13415, 4096, 13422,
- 4096, 13425, 4096, 13428, 13433, 4096, 13436, 13445, 13448, 4096,
-13451, 4096, 4096, 13458, 13463, 13468, 13471, 4096, 13474, 13479,
-13484, 13489, 13494, 13499, 13504, 4096, 13509, 4096, 4096, 13512,
- 4096, 13519, 13524, 13527, 4096, 13530, 13533, 4096, 4096, 13536,
- 4096, 13541, 13544, 4096, 13547, 4096, 4096, 4096, 13550, 4096,
- 4096, 13555, 4096, 13560, 4096, 4096, 13563, 4096, 13566, 13569,
-13576, 13583, 13588, 13595, 13598, 13607, 4096, 4096, 4096, 13610,
-13615, 13624, 13629, 4096, 13634, 13639, 13644, 13651, 13654, 13657,
-13660, 13665, 13670, 13675, 4096, 4096, 13678, 13681, 13684, 4096,
- 4096, 13687, 4096, 13690, 4096, 13697, 4096, 13700, 13703, 4096,
- 4096, 4096, 4096, 13706, 4096, 4096, 13713, 13718, 13725, 13730,
-13739, 13742, 13749, 13752, 13757, 4096, 13762, 4096, 13767, 13772,
-13775, 13780, 4096, 4096, 13783, 13788, 4096, 13791, 4096, 4096,
-13794, 4096, 4096, 4096, 13797, 4096, 4096, 4096, 4096, 4096,
-13804, 13807, 13810, 13813, 13816, 4096, 13819, 4096, 13824, 13827,
-13832, 13835, 4096, 13838, 13841, 13846, 13849, 13856, 13859, 13866,
-13869, 4096, 13872, 13875, 4096, 13880, 13883, 13886, 13891, 4096,
- 4096, 4096, 4096, 13894, 13899, 13902, 4096, 4096, 4096, 4096,
-13907, 4096, 4096, 13910, 13913, 13916, 13923, 13928, 13933, 4096,
- 4096, 4096, 4096, 13938, 4096, 13941, 13948, 13955, 13958, 13963,
-13970, 13975, 13978, 13983, 13986, 13991, 13994, 4096, 13997, 4096,
- 4096, 4096, 4096, 14004, 4096, 14007, 4096, 14012, 14015, 14018,
-14021, 14028, 14033, 4096, 14036, 14041, 14044, 14049, 14054, 4096,
-14059, 14062, 4096, 14065, 4096, 14068, 4096, 4096, 4096, 14071,
-14074, 14077, 14080, 14085, 14088, 14091, 14094, 4096, 14099, 14102,
-14105, 4096, 14108, 14111, 14116, 4096, 4096, 14121, 14124, 14127,
- 4096, 14130, 14135, 4096, 4096, 4096, 14138, 14141, 4096, 4096,
- 4096, 4096, 4096, 14144, 14153, 14156, 4096, 14163, 14168, 4096,
- 4096, 14173, 14178, 14181, 14184, 4096, 14189, 14192, 14197, 14202,
-14207, 14210, 4096, 14213, 14216, 14219, 4096, 14224, 14231, 14236,
-14241, 14244, 14251, 14254, 14261, 4096, 14266, 4096, 14273, 4096,
-14276, 14279, 14284, 4096, 14287, 4096, 14294, 14297, 14300, 4096,
-14303, 4096, 4096, 14308, 14311, 14316, 14319, 4096, 14322, 4096,
- 4096, 4096, 14325, 14332, 14337, 14340, 4096, 14347, 14350, 4096,
- 4096, 14353, 14360, 4096, 14367, 14370, 4096, 14375, 4096, 14378,
-14383, 14388, 4096, 14393, 14398, 14405, 14408, 14415, 14420, 14425,
-14430, 14433, 4096, 4096, 14440, 14445, 4096, 4096, 14450, 14453,
-14460, 4096, 14465, 4096, 14472, 14475, 14478, 14481, 14488, 14493,
-14496, 4096, 14499, 4096, 14502, 4096, 14505, 14510, 14513, 4096,
- 4096, 14516, 14519, 14526, 4096, 4096, 4096, 4096, 4096, 14529,
-14532, 14537, 14542, 14545, 14554, 14559, 14564, 14571, 14578, 14585,
-14590, 14593, 14596, 4096, 4096, 14601, 14604, 14607, 14610, 14613,
-14618, 4096, 4096, 14623, 14626, 4096, 14633, 14638, 14643, 4096,
- 4096, 14648, 14651, 14656, 14659, 14668, 14675, 14682, 14685, 14688,
-14693, 4096, 14696, 14699, 14702, 14705, 14708, 14711, 14714, 14717,
-14722, 14733, 14740, 14747, 14756, 14759, 14762, 4096, 14765, 14768,
-14771, 4096, 14776, 14783, 4096, 14786, 14791, 4096, 14794, 4096,
-14799, 14802, 14807, 14810, 14815, 14818, 4096, 4096, 4096, 4096,
-14821, 14824, 4096, 4096, 14827, 14832, 4096, 14835, 14840, 14843,
-14846, 14851, 4096, 14856, 4096, 14861, 14868, 4096, 14873, 14878,
- 4096, 14881, 14884, 14887, 14890, 14897, 14902, 14909, 14912, 14917,
-14924, 14927, 4096, 14930, 14935, 4096, 4096, 4096, 14940, 14945,
-14952, 14957, 14964, 14971, 14976, 14979, 14986, 4096, 4096, 14989,
-14992, 14995, 4096, 14998, 4096, 15001, 15004, 15007, 15016, 15021,
-15026, 15029, 15034, 4096, 15037, 4096, 15040, 15049, 15052, 15057,
- 4096, 4096, 4096, 4096, 15060, 4096, 15063, 4096, 15068, 15071,
- 4096, 4096, 4096, 15076, 15083, 15086, 15091, 15094, 15097, 15100,
-15103, 15106, 4096, 4096, 4096, 15111, 15114, 15119, 4096, 15122,
-15125, 15128, 15135, 15140, 4096, 15147, 15150, 15155, 15160, 15167,
-15170, 15177, 15182, 15187, 4096, 4096, 15196, 15199, 15202, 4096,
-15205, 15208, 4096, 4096, 4096, 15213, 15216, 15219, 15224, 15227,
-15230, 4096, 15233, 4096, 15236, 15245, 15248, 4096, 15251, 4096,
-15256, 15261, 4096, 15266, 4096, 15269, 4096, 15274, 4096, 15277,
- 4096, 4096, 15280, 15285, 4096, 15288, 15291, 4096, 15298, 4096,
- 4096, 4096, 4096, 15301, 15304, 15311, 15316, 15325, 15332, 15343,
-15348, 15357, 15360, 4096, 15365, 15374, 4096, 15379, 15388, 4096,
- 4096, 15391, 4096, 4096, 15396, 4096, 4096, 4096, 4096, 4096,
- 4096, 4096, 15399, 4096, 15402, 15407, 15410, 4096, 15415, 15420,
-15429, 15436, 4096, 15443, 15448, 4096, 4096, 15453, 4096, 15458,
-15463, 15466, 15469, 4096, 15472, 4096, 4096, 15477, 15480, 15483,
- 4096, 15488, 15493, 15496, 4096, 4096, 4096, 15499, 15502, 4096,
-15505, 4096, 4096, 15508, 15511, 15514, 15519, 15522, 15525, 15528,
-15531, 15534, 4096, 4096, 4096, 4096, 15537, 15542, 15545, 15550,
- 4096, 15555, 15560, 15567, 15572, 15579, 15586, 15589, 15594, 15599,
-15602, 4096, 15605, 4096, 15608, 15613, 15616, 15619, 4096, 4096,
-15622, 15627, 15632, 4096, 4096, 4096, 15635, 15640, 15647, 15650,
-15653, 15658, 15661, 4096, 15666, 4096, 15671, 4096, 4096, 4096,
-15674, 15677, 4096, 15680, 15683, 15686, 15691, 15694, 15697, 4096,
-15702, 4096, 4096, 15705, 4096, 15708, 15711, 15716, 15723, 15726,
-15739, 15742, 15747, 15752, 15759, 15762, 15767, 15772, 15781, 15790,
- 4096, 4096, 4096, 15793, 4096, 15798, 15801, 15804, 15807, 4096,
- 4096, 15810, 15813, 4096, 4096, 4096, 4096, 4096, 15816, 15819,
- 4096, 15824, 15829, 15832, 15835, 15838, 15841, 15848, 15853, 15858,
-15863, 15868, 4096, 4096, 4096, 15873, 4096, 4096, 15876, 4096,
- 4096, 15881, 4096, 4096, 4096, 15884, 4096, 15887, 15892, 15897,
-15900, 15903, 4096, 15906, 15909, 15912, 4096, 15921, 15924, 15927,
-15930, 15937, 15940, 15945, 15950, 4096, 15953, 15956, 15961, 4096,
-15964, 15969, 4096, 15972, 4096, 4096, 15975, 15978, 4096, 4096,
- 4096, 15981, 15984, 15987, 15994, 16001, 4096, 4096, 16004, 16007,
-16012, 16021, 16028, 16031, 16034, 16037, 16042, 4096, 4096, 4096,
- 4096, 16045, 4096, 16050, 16053, 4096, 16058, 4096, 16063, 16068,
-16071, 4096, 16074, 16079, 16082, 16087, 16090, 16095, 16098, 16103,
-16106, 16111, 4096, 4096, 16114, 4096, 16119, 4096, 16126, 16135,
-16140, 16145, 16152, 16157, 16160, 16163, 16166, 16169, 16172, 16175,
-16180, 16185, 16190, 16195, 16200, 16203, 16210, 16217, 16220, 16231,
-16236, 4096, 16239, 16242, 16249, 16254, 16261, 16266, 16271, 4096,
-16274, 4096, 16277, 4096, 16280, 16287, 16294, 4096, 16297, 16302,
-16309, 4096, 16312, 16315, 16318, 4096, 4096, 16321, 16324, 16327,
- 4096, 4096, 4096, 4096, 16334, 16341, 4096, 16344, 16347, 16352,
-16355, 16358, 4096, 16361, 4096, 16364, 16367, 4096, 4096, 16370,
-16375, 16378, 16381, 16384, 16387, 16392, 16395, 16400, 16403, 4096,
-16408, 4096, 16411, 4096, 4096, 16414, 0, 1, 510, 8621,
- 1, 643, 60856, 1, 938, 12549, 1, 3541, 2910, 1,
- 2866, 39925, 1, 620, 62074, 1, 2332, 28221, 1, 829,
-46293, 1, 3255, 56632, 1, 2315, 49074, 1, 2018, 59737,
- 1, 1025, 10411, 2, 1850, 43325, 3162, 36851, 1, 3547,
-26552, 1, 1619, 6093, 2, 291, 62685, 1742, 11249, 1,
- 2105, 8987, 1, 1997, 11294, 2, 448, 44554, 3123, 20788,
- 1, 52, 24850, 2, 368, 34819, 2073, 37979, 1, 3482,
-57855, 1, 1425, 3049, 1, 2218, 55510, 2, 2318, 15723,
- 3163, 44945, 2, 851, 58597, 1570, 36070, 1, 125, 13698,
- 2, 277, 53997, 2369, 55031, 1, 582, 37910, 2, 2797,
-65354, 3070, 2453, 2, 2924, 9862, 2971, 5240, 3, 587,
-22080, 2663, 20467, 3826, 12015, 1, 4335, 28030, 2, 466,
-57619, 3890, 46154, 2, 376, 34969, 2030, 5353, 1, 377,
-34969, 1, 106, 21934, 1, 1638, 5258, 1, 2596, 22156,
- 1, 1985, 11349, 1, 3897, 33411, 2, 1715, 52977, 1764,
-29829, 1, 1000, 4783, 1, 3585, 49539, 1, 1377, 36198,
- 2, 242, 35245, 1875, 18852, 1, 3551, 35726, 2, 148,
-46517, 2817, 13198, 1, 1549, 20494, 3, 913, 53203, 2260,
-42382, 3811, 31469, 1, 1986, 24768, 5, 105, 15505, 225,
-44635, 470, 24345, 664, 19012, 2547, 47072, 1, 1831, 11004,
- 2, 313, 42146, 4333, 63423, 1, 1613, 40187, 1, 3574,
-22412, 2, 806, 44063, 3276, 42722, 1, 693, 12262, 1,
- 1199, 60025, 1, 1020, 44543, 1, 4378, 63644, 4, 586,
-28932, 756, 62878, 1759, 11073, 4403, 63644, 2, 940, 11950,
- 4428, 63644, 1, 4453, 63644, 3, 290, 10466, 631, 35285,
- 4478, 63644, 2, 3196, 36801, 4503, 63644, 3, 1904, 41086,
- 4528, 63644, 4579, 14274, 2, 4553, 63644, 4604, 14274, 3,
- 969, 49574, 2361, 40152, 4629, 14274, 1, 4654, 14274, 3,
- 2322, 24341, 3772, 21252, 4679, 14274, 1, 4704, 14274, 2,
- 349, 61257, 4729, 14274, 1, 3221, 40573, 1, 1788, 40209,
- 3, 1050, 52961, 1669, 15014, 3387, 40265, 1, 4387, 40309,
- 3, 2252, 60233, 2437, 54457, 4412, 40309, 2, 1062, 30366,
- 4437, 40309, 4, 610, 6544, 2245, 31976, 3169, 29647, 4462,
-40309, 3, 2736, 51298, 2811, 11901, 4487, 40309, 1, 4512,
-40309, 1, 4537, 40309, 2, 3427, 6339, 4562, 40309, 3,
- 1349, 52410, 2461, 63753, 2501, 5182, 1, 3329, 61675, 2,
- 1256, 55360, 1796, 59431, 2, 3134, 37852, 3248, 58724, 1,
- 3069, 29157, 3, 387, 32842, 1616, 30594, 2023, 14646, 1,
- 3848, 30918, 4, 76, 40351, 1441, 11656, 1662, 31564, 2459,
-21395, 1, 1580, 10672, 2, 3023, 17865, 3442, 63522, 1,
- 2363, 63959, 2, 27, 51816, 2771, 8159, 3, 1786, 44711,
- 2152, 43425, 2764, 51260, 2, 2755, 17997, 2786, 50244, 1,
- 1751, 47453, 3, 107, 43648, 1143, 8060, 3615, 8464, 1,
- 3319, 61344, 2, 1158, 49812, 4347, 37379, 2, 151, 41372,
- 1784, 47768, 1, 221, 56676, 1, 2029, 49744, 2, 964,
-48620, 2529, 19985, 1, 4359, 38867, 4, 945, 64135, 3137,
-18801, 3419, 63330, 3506, 28960, 1, 3764, 24133, 1, 2399,
-48575, 2, 1594, 62632, 3472, 58465, 2, 1811, 37210, 3171,
-51283, 1, 1631, 4237, 2, 2048, 1975, 3907, 14692, 1,
- 2408, 9769, 4, 319, 46683, 546, 57055, 2200, 11799, 3812,
-18875, 1, 2186, 15357, 1, 3226, 16660, 1, 930, 32652,
- 2, 1434, 40759, 3407, 64437, 1, 1016, 58285, 1, 3524,
-21862, 1, 2450, 30424, 1, 3467, 49193, 2, 523, 42162,
- 1951, 607, 1, 1620, 5955, 4, 70, 1636, 2248, 50620,
- 3262, 57409, 4355, 53994, 2, 505, 118, 2818, 50901, 1,
- 3570, 46929, 1, 2852, 65309, 1, 488, 61057, 1, 1449,
- 1171, 2, 26, 5383, 2330, 7959, 1, 867, 21498, 2,
- 1644, 57277, 3110, 8451, 2, 625, 13269, 4321, 37872, 2,
- 2872, 35422, 3520, 54517, 1, 4369, 35615, 4, 890, 48155,
- 1222, 32759, 3286, 49421, 4394, 35615, 3, 2328, 13492, 3679,
- 5811, 4419, 35615, 3, 190, 6787, 1709, 5438, 4444, 35615,
- 3, 1185, 61510, 4320, 51487, 4469, 35615, 2, 555, 745,
- 4494, 35615, 3, 1429, 64738, 3340, 3744, 4519, 35615, 2,
- 1236, 20482, 4544, 35615, 2, 1528, 19151, 2892, 46008, 3,
- 2136, 17998, 3102, 20331, 3475, 21491, 3, 83, 57075, 928,
-20964, 1407, 49831, 1, 2712, 20026, 2, 521, 42731, 2469,
-18144, 1, 3203, 16632, 1, 581, 10750, 2, 670, 13850,
- 3096, 17930, 2, 1436, 47159, 4134, 19574, 3, 2654, 19029,
- 4141, 8853, 4160, 19574, 3, 2649, 48192, 4167, 8853, 4186,
-19574, 2, 4193, 8853, 4212, 19574, 4, 2660, 40280, 2873,
-62710, 4219, 8853, 4238, 19574, 3, 3634, 57922, 4245, 8853,
- 4264, 19574, 4, 2329, 38658, 2466, 5225, 4271, 8853, 4290,
-19574, 1, 4297, 8853, 2, 637, 1484, 780, 25404, 1,
- 2947, 34695, 2, 205, 30501, 2155, 53707, 1, 2453, 39411,
- 1, 3663, 45485, 1, 2930, 43792, 3, 272, 60715, 2517,
- 704, 3818, 62351, 3, 639, 10801, 1217, 956, 2104, 26202,
- 1, 1412, 35738, 2, 2491, 12644, 3341, 30214, 1, 3593,
-55788, 1, 286, 42062, 1, 3519, 7245, 1, 253, 27183,
- 1, 2988, 4306, 2, 32, 11748, 4586, 6213, 4, 227,
-60963, 260, 22514, 4316, 16499, 4611, 6213, 1, 4636, 6213,
- 2, 2255, 50439, 4661, 6213, 2, 2432, 496, 4686, 6213,
- 2, 4584, 55488, 4711, 6213, 3, 2965, 62290, 4609, 55488,
- 4736, 6213, 4, 367, 26288, 3386, 27124, 3684, 30177, 4634,
-55488, 2, 1186, 12160, 4659, 55488, 1, 4684, 55488, 2,
- 828, 62131, 4709, 55488, 1, 4734, 55488, 1, 3431, 2540,
- 1, 1996, 59198, 1, 2334, 33068, 1, 2505, 58064, 3,
- 933, 60450, 1491, 24965, 3565, 46256, 1, 1605, 48656, 2,
- 1164, 41014, 2737, 35236, 1, 3851, 7127, 1, 1326, 34878,
- 2, 1524, 62471, 2064, 3340, 2, 1167, 9979, 1795, 40147,
- 3, 2053, 6420, 2060, 36952, 3861, 1318, 2, 3928, 1598,
- 4365, 44049, 2, 3954, 1598, 4390, 44049, 3, 2556, 35812,
- 3980, 1598, 4415, 44049, 3, 1200, 33016, 4006, 1598, 4440,
-44049, 4, 3209, 40839, 3623, 60753, 4032, 1598, 4465, 44049,
- 2, 4058, 1598, 4490, 44049, 3, 3381, 9286, 4084, 1598,
- 4515, 44049, 2, 4110, 1598, 4540, 44049, 1, 2549, 7571,
- 1, 635, 51295, 2, 821, 21991, 3505, 23956, 1, 567,
-29873, 1, 1065, 20705, 2, 757, 35182, 1515, 3029, 1,
- 214, 33622, 1, 280, 8435, 1, 2623, 15256, 1, 1288,
-61370, 3, 415, 451, 2731, 17439, 3116, 1336, 1, 429,
-60073, 3, 866, 48859, 1331, 18073, 3737, 13914, 1, 425,
-52993, 3, 2132, 30972, 3571, 8767, 3879, 53668, 1, 1292,
-32838, 1, 503, 8529, 1, 2968, 54845, 2, 1413, 25133,
- 3653, 18165, 1, 322, 16285, 1, 566, 51570, 1, 691,
-10546, 2, 1496, 40966, 3847, 27968, 2, 2144, 62063, 2966,
-49902, 2, 486, 17117, 4341, 14122, 1, 426, 54009, 1,
- 1133, 57083, 2, 2410, 25490, 2945, 33524, 3, 2740, 57773,
- 3176, 16073, 3498, 1675, 1, 1055, 24405, 1, 81, 4512,
- 1, 2224, 61099, 1, 2007, 48648, 1, 2015, 28022, 3,
- 697, 57038, 2494, 11168, 4752, 18451, 1, 879, 26484, 2,
- 1807, 49566, 2723, 47967, 1, 826, 47107, 2, 2880, 23041,
- 3923, 44013, 1, 1854, 39122, 1, 3292, 24815, 3, 49,
-44013, 3000, 865, 4314, 8579, 1, 2310, 51212, 2, 1627,
-23331, 3922, 47097, 1, 1131, 21696, 1, 3138, 55538, 2,
- 992, 39560, 3637, 23903, 2, 3545, 11038, 3726, 57499, 2,
- 64, 61386, 2605, 30329, 1, 2931, 14002, 1, 3005, 10990,
- 2, 3189, 44381, 3216, 57369, 1, 1630, 32276, 2, 3059,
-40523, 3692, 28681, 1, 4343, 63295, 4, 901, 32175, 1077,
-11499, 3412, 43920, 3659, 41356, 2, 961, 35237, 1464, 35329,
- 2, 2472, 11102, 4588, 29565, 3, 219, 33531, 808, 28695,
- 4613, 29565, 1, 4638, 29565, 2, 2347, 20620, 4663, 29565,
- 4, 650, 16712, 906, 59149, 1431, 19799, 4688, 29565, 1,
- 4713, 29565, 1, 4738, 29565, 1, 381, 38661, 1, 2506,
-25574, 1, 2470, 39468, 2, 435, 38215, 1318, 6328, 1,
- 436, 38215, 2, 694, 48994, 3759, 31034, 2, 2977, 54704,
- 3214, 33153, 1, 3717, 39102, 1, 988, 7490, 1, 1569,
-12537, 1, 3619, 21172, 2, 3152, 43431, 3553, 19782, 1,
- 335, 660, 2, 44, 18941, 1321, 48528, 2, 2061, 24192,
- 2707, 62543, 2, 1927, 22771, 2725, 62826, 1, 4751, 63261,
- 2, 2826, 4493, 3297, 56801, 2, 389, 58663, 2135, 53526,
- 3, 2468, 31092, 3097, 50456, 3434, 46868, 1, 4381, 54087,
- 2, 3346, 4813, 4406, 54087, 2, 2202, 19430, 4431, 54087,
- 3, 602, 54625, 1829, 62962, 4456, 54087, 1, 4481, 54087,
- 2, 1097, 44520, 4506, 54087, 2, 2100, 20703, 4531, 54087,
- 1, 4556, 54087, 1, 575, 37052, 1, 2172, 63035, 3,
- 728, 56350, 2158, 16029, 3050, 64340, 1, 191, 64246, 1,
- 208, 947, 1, 3296, 16378, 3, 1379, 5820, 2871, 15219,
- 3344, 57051, 3, 688, 52360, 1492, 54256, 3260, 12659, 3,
- 819, 61303, 2863, 58357, 3357, 30767, 2, 3239, 42053, 3800,
-42173, 1, 2959, 18330, 3, 1013, 62437, 1160, 52854, 2975,
-26311, 1, 3306, 28045, 1, 2983, 60301, 1, 34, 16521,
- 1, 2070, 34104, 2, 1975, 40343, 3546, 6774, 1, 98,
-41809, 1, 2214, 14867, 1, 2856, 43015, 2, 557, 392,
- 893, 65353, 2, 1458, 26142, 3363, 21101, 1, 2532, 43695,
- 1, 948, 33119, 2, 411, 17258, 3647, 7259, 2, 514,
-56684, 3741, 52237, 2, 974, 62521, 1842, 8355, 2, 989,
-30243, 2348, 58552, 1, 482, 43092, 2, 1169, 31419, 1949,
-31168, 2, 782, 43779, 3402, 45949, 1, 3773, 49823, 1,
- 506, 32106, 1, 2897, 54908, 2, 3261, 33551, 4140, 44372,
- 2, 3091, 47233, 4166, 44372, 2, 2929, 48061, 4192, 44372,
- 2, 803, 44420, 4218, 44372, 3, 1610, 45208, 2161, 22229,
- 4244, 44372, 2, 4270, 44372, 4589, 44243, 3, 1826, 11645,
- 4296, 44372, 4614, 44243, 3, 1924, 63733, 4138, 16876, 4639,
-44243, 2, 4164, 16876, 4664, 44243, 3, 3011, 41504, 4190,
-16876, 4689, 44243, 2, 4216, 16876, 4714, 44243, 4, 1192,
-17096, 4242, 16876, 4739, 44243, 4753, 51313, 2, 723, 22294,
- 4268, 16876, 2, 1140, 39748, 4294, 16876, 1, 207, 41678,
- 1, 3220, 23067, 1, 1400, 3379, 4, 672, 9740, 1012,
-54312, 2802, 11583, 3724, 18588, 2, 28, 41136, 3350, 49541,
- 1, 1993, 23463, 2, 656, 49969, 3349, 479, 1, 1005,
-57871, 2, 904, 59277, 3497, 12078, 1, 649, 49699, 1,
- 3813, 5384, 1, 1780, 18116, 1, 3723, 47543, 1, 3500,
-22952, 3, 816, 46352, 1634, 40460, 3941, 37180, 4, 422,
- 3078, 1190, 17926, 2828, 53502, 3967, 37180, 3, 299, 43279,
- 3765, 40077, 3993, 37180, 2, 2380, 48188, 4019, 37180, 1,
- 4045, 37180, 2, 3006, 47968, 4071, 37180, 1, 4097, 37180,
- 3, 304, 16849, 3844, 42853, 4123, 37180, 2, 413, 6949,
- 993, 41456, 2, 735, 42119, 3885, 32781, 1, 3949, 10640,
- 1, 3975, 10640, 2, 10, 51927, 4001, 10640, 1, 4027,
-10640, 1, 4053, 10640, 4, 730, 6196, 1142, 23817, 2891,
-37142, 4079, 10640, 3, 1258, 52357, 2169, 62694, 4105, 10640,
- 3, 308, 7681, 1188, 11060, 4131, 10640, 2, 1480, 53815,
- 1861, 33705, 1, 3339, 49832, 2, 317, 60940, 3103, 51409,
- 1, 2209, 20758, 1, 3718, 33192, 3, 172, 29426, 1688,
-19665, 2358, 15507, 1, 3608, 3155, 1, 3791, 21515, 1,
- 2282, 48303, 1, 3155, 59436, 2, 2626, 13322, 2661, 51090,
- 1, 2615, 50060, 1, 1234, 62045, 1, 2191, 25451, 1,
- 2498, 62992, 2, 2386, 20821, 2761, 48602, 1, 2002, 43530,
- 2, 653, 26886, 3107, 19847, 1, 1572, 21078, 1, 2373,
-51422, 1, 244, 17898, 1, 2331, 60067, 1, 2103, 39379,
- 1, 3104, 14149, 1, 2722, 41081, 2, 843, 58431, 1037,
-33602, 3, 96, 35667, 3614, 64701, 4319, 13541, 3, 181,
-61426, 2076, 53567, 3088, 55066, 1, 2360, 42968, 2, 495,
- 5180, 4755, 29595, 1, 3020, 23416, 1, 1066, 17931, 3,
- 2684, 34781, 3557, 31105, 3752, 53367, 2, 2078, 21521, 4386,
- 4160, 1, 4411, 4160, 2, 1264, 23981, 4436, 4160, 2,
- 3014, 62178, 4461, 4160, 2, 3729, 43162, 4486, 4160, 1,
- 4511, 4160, 3, 22, 30305, 270, 4714, 4536, 4160, 2,
- 2036, 21557, 4561, 4160, 1, 513, 57802, 1, 3316, 38423,
- 1, 418, 62774, 1, 2806, 38592, 2, 1260, 24514, 2952,
-31076, 1, 3721, 34297, 2, 1856, 32844, 3145, 9366, 2,
- 1070, 24098, 3655, 6955, 1, 3280, 5017, 2, 1308, 9759,
- 1737, 23906, 1, 1388, 37159, 1, 1002, 30297, 1, 3597,
-15725, 2, 966, 60439, 1897, 59055, 3, 995, 17639, 1282,
- 5170, 3763, 6314, 1, 2145, 50338, 1, 289, 15516, 1,
- 1521, 1108, 2, 2998, 8280, 3657, 30530, 1, 2287, 57538,
- 1, 3449, 56945, 1, 4346, 23011, 3, 1280, 17261, 1540,
- 7350, 3433, 42800, 1, 529, 11593, 1, 690, 49169, 1,
- 741, 55151, 1, 3865, 51077, 1, 2443, 56461, 3, 2444,
-59961, 2981, 45482, 3444, 59598, 1, 3064, 27091, 1, 2021,
-46461, 2, 1702, 16628, 2679, 47047, 1, 1962, 23929, 2,
- 141, 36340, 3696, 26517, 1, 157, 50018, 1, 3625, 50158,
- 2, 665, 26601, 1750, 962, 1, 2455, 58356, 1, 2024,
-17603, 2, 2188, 37723, 2997, 4378, 1, 1338, 8838, 1,
- 1345, 64024, 2, 3406, 43043, 4334, 49101, 1, 2682, 57856,
- 2, 563, 30775, 2306, 32501, 2, 1042, 5824, 2393, 13945,
- 1, 3463, 27184, 1, 1938, 5625, 2, 849, 2405, 2631,
-21960, 1, 3558, 31960, 2, 1214, 27858, 3477, 54611, 2,
- 92, 15170, 1127, 5121, 1, 831, 4397, 2, 1287, 3195,
- 3353, 17244, 1, 3710, 57985, 2, 2738, 49754, 3327, 31960,
- 1, 1178, 61958, 1, 4382, 13759, 3, 2111, 58474, 3703,
-42484, 4407, 13759, 1, 4432, 13759, 7, 276, 49585, 889,
-50028, 1210, 31055, 2033, 32528, 2765, 41529, 3314, 65008, 4457,
-13759, 1, 4482, 13759, 2, 743, 65127, 4507, 13759, 2,
- 4532, 13759, 4583, 29925, 5, 2309, 4426, 2957, 39349, 3075,
- 9913, 4557, 13759, 4608, 29925, 2, 3351, 21817, 4633, 29925,
- 2, 3526, 52684, 4658, 29925, 1, 4683, 29925, 2, 1545,
-55409, 4708, 29925, 3, 2413, 390, 3671, 39266, 4733, 29925,
- 2, 15, 65322, 2735, 47992, 2, 585, 49021, 1860, 40744,
- 1, 1289, 25536, 1, 1755, 14257, 1, 1607, 44004, 1,
- 1255, 30834, 1, 4356, 61217, 1, 232, 28572, 2, 2253,
-41222, 3915, 17014, 1, 601, 63102, 1, 1141, 37611, 2,
- 2364, 34094, 3563, 61119, 2, 1708, 59664, 2676, 18123, 2,
- 2194, 27442, 2790, 9012, 2, 525, 5251, 2247, 36394, 1,
- 3887, 37965, 3, 119, 3800, 1837, 9998, 2785, 2131, 3,
- 386, 19569, 2066, 19418, 2624, 33378, 1, 3430, 57893, 2,
- 1394, 32794, 3715, 12861, 2, 316, 9922, 2680, 25878, 3,
- 1876, 12806, 2882, 38052, 2962, 42347, 1, 2658, 53577, 2,
- 905, 34466, 1559, 64468, 1, 2807, 52650, 1, 3049, 47232,
- 2, 1535, 26817, 3279, 43442, 1, 2296, 59609, 2, 2093,
-32194, 3884, 59602, 1, 1531, 45935, 3, 619, 29460, 1777,
-54797, 2972, 8980, 1, 1246, 62491, 3, 549, 12151, 2382,
-37452, 3880, 57494, 2, 1244, 12046, 2343, 18752, 1, 2861,
-18908, 1, 161, 4772, 1, 3016, 40440, 1, 2246, 49495,
- 1, 1995, 20454, 2, 1739, 24572, 3527, 5370, 1, 3683,
-25303, 1, 883, 31306, 2, 531, 49273, 758, 27881, 2,
- 1568, 2987, 2502, 59811, 1, 1758, 31647, 1, 3948, 46876,
- 1, 3974, 46876, 1, 4000, 46876, 2, 2308, 7662, 4026,
-46876, 1, 4052, 46876, 1, 4078, 46876, 1, 4104, 46876,
- 1, 4130, 46876, 1, 2921, 58873, 2, 3201, 42687, 3578,
-20277, 2, 770, 46069, 3673, 23342, 2, 771, 46069, 2428,
-26515, 1, 2837, 16517, 1, 3264, 27973, 1, 1495, 13664,
- 3, 847, 33602, 1024, 4170, 2350, 48923, 1, 2396, 49392,
- 1, 1113, 39442, 1, 3136, 29597, 2, 522, 4069, 1462,
-15255, 1, 1979, 58319, 3, 833, 36113, 1427, 7485, 3039,
-29090, 2, 1907, 17612, 3510, 3241, 1, 2125, 60525, 1,
- 2652, 31799, 1, 1240, 37783, 2, 721, 56284, 1598, 28849,
- 2, 1863, 31376, 4362, 42926, 1, 3875, 39577, 2, 668,
-52322, 2109, 25355, 1, 4154, 14108, 2, 1368, 31932, 4180,
-14108, 5, 2840, 24587, 3321, 4682, 3902, 39767, 4206, 14108,
- 4340, 21194, 1, 4232, 14108, 2, 3650, 43416, 4258, 14108,
- 1, 4284, 14108, 1, 4310, 14108, 1, 1793, 14863, 2,
- 1971, 2318, 3062, 28190, 3, 982, 33526, 1772, 26397, 2394,
-19548, 1, 226, 20005, 1, 3058, 20633, 1, 3550, 41812,
- 1, 31, 5027, 2, 245, 23803, 1329, 35085, 1, 1103,
-53733, 1, 3639, 34093, 1, 2994, 14618, 1, 2085, 18626,
- 2, 1211, 23388, 2648, 11862, 1, 1319, 51926, 2, 36,
-25674, 2043, 34040, 1, 1067, 58455, 2, 1011, 26460, 1687,
- 9859, 3, 997, 179, 3021, 39969, 3391, 52683, 2, 121,
- 9955, 1235, 47114, 3, 2114, 14279, 2573, 27085, 3562, 50115,
- 1, 1551, 47881, 1, 1313, 3533, 1, 1812, 18793, 1,
- 3849, 30395, 2, 1041, 11205, 1665, 41251, 1, 3908, 15813,
- 3, 863, 29737, 973, 31721, 3077, 17977, 1, 630, 65267,
- 1, 3317, 36459, 1, 1146, 11917, 3, 152, 24762, 3026,
- 3413, 3577, 24043, 1, 2632, 6414, 1, 2877, 53266, 2,
- 3268, 37320, 4137, 1877, 2, 2922, 42463, 4163, 1877, 1,
- 4189, 1877, 3, 493, 25426, 2721, 49440, 4215, 1877, 2,
- 2850, 37379, 4241, 1877, 1, 4267, 1877, 4, 2422, 41178,
- 2800, 54304, 3441, 61149, 4293, 1877, 1, 3924, 12838, 1,
- 3950, 12838, 2, 3490, 46308, 3976, 12838, 3, 1033, 19397,
- 3259, 3829, 4002, 12838, 3, 1719, 24609, 3713, 39562, 4028,
-12838, 1, 4054, 12838, 3, 814, 3205, 2249, 22686, 4080,
-12838, 1, 4106, 12838, 1, 2427, 48658, 1, 3845, 42660,
- 3, 674, 38769, 1663, 8837, 3742, 31967, 2, 2537, 62005,
- 3423, 1008, 3, 182, 54398, 775, 15977, 3186, 42346, 1,
- 3944, 35064, 2, 3451, 51635, 3970, 35064, 2, 1900, 44383,
- 3996, 35064, 2, 3786, 5708, 4022, 35064, 2, 3484, 4875,
- 4048, 35064, 1, 4074, 35064, 4, 372, 44464, 1014, 30817,
- 1558, 26715, 4100, 35064, 2, 3425, 32125, 4126, 35064, 1,
- 3586, 50276, 1, 1578, 32517, 1, 1914, 24663, 1, 1798,
-30693, 1, 2175, 36578, 1, 761, 27140, 1, 2242, 53755,
- 2, 39, 13658, 2203, 38732, 1, 1713, 6881, 1, 909,
-16279, 1, 2232, 64670, 2, 1498, 35223, 3689, 4825, 1,
- 1224, 59741, 1, 3294, 20097, 3, 327, 47051, 3466, 13993,
- 3743, 52384, 3, 1980, 2730, 2336, 29641, 3393, 29959, 4,
- 1060, 6400, 3042, 32118, 3739, 44824, 3840, 64213, 1, 944,
- 5142, 1, 2515, 50821, 1, 3926, 30382, 1, 3952, 30382,
- 1, 3978, 30382, 2, 2340, 51994, 4004, 30382, 3, 937,
-15790, 1994, 2381, 4030, 30382, 2, 778, 48558, 4056, 30382,
- 3, 428, 1529, 975, 29729, 4082, 30382, 2, 1373, 54466,
- 4108, 30382, 1, 897, 26208, 1, 3699, 8168, 5, 960,
-48030, 1396, 23865, 2566, 20151, 3231, 62713, 3405, 51729, 1,
- 908, 63499, 1, 2550, 4179, 2, 140, 30206, 2576, 14516,
- 1, 248, 18700, 1, 1123, 50097, 1, 830, 52419, 2,
- 114, 20773, 2708, 23925, 1, 3037, 1662, 1, 3315, 59621,
- 1, 3548, 12017, 1, 3891, 26247, 2, 2035, 4474, 2195,
-24421, 1, 3589, 32402, 1, 1514, 29647, 2, 1059, 20609,
- 2327, 62876, 3, 962, 36969, 1125, 50983, 4754, 39848, 1,
- 3528, 18623, 1, 2919, 15195, 2, 527, 40520, 996, 19247,
- 2, 3352, 23829, 3512, 34823, 1, 405, 37776, 2, 1410,
-33231, 1707, 55360, 1, 2656, 58942, 3, 594, 36433, 2686,
-41475, 3361, 57855, 2, 971, 24798, 3002, 64212, 1, 872,
-27480, 3, 158, 5157, 2295, 9479, 2302, 63466, 2, 1469,
-48703, 1932, 29966, 1, 1195, 50814, 2, 1284, 56536, 2915,
-31521, 5, 946, 27979, 1588, 51913, 2542, 10878, 2920, 4391,
- 3809, 42803, 1, 2283, 27978, 2, 1445, 59258, 1749, 13700,
- 4, 1536, 25960, 1656, 2745, 3324, 19484, 3947, 51942, 3,
- 2518, 17510, 2843, 47738, 3973, 51942, 1, 3999, 51942, 3,
- 1541, 16272, 1827, 51384, 4025, 51942, 2, 1272, 392, 4051,
-51942, 2, 1171, 36135, 4077, 51942, 1, 4103, 51942, 2,
- 1671, 41022, 4129, 51942, 1, 1731, 42610, 1, 476, 31758,
- 1, 2878, 29425, 1, 379, 29798, 1, 380, 29798, 1,
- 537, 24099, 1, 657, 22542, 1, 716, 60765, 2, 1226,
-20330, 2565, 23007, 2, 1261, 62318, 3537, 9391, 1, 3295,
-35288, 2, 1301, 60893, 2590, 25793, 1, 3065, 12412, 1,
- 1390, 5536, 1, 3776, 57729, 1, 859, 53689, 4, 1422,
-52188, 3514, 50995, 3843, 5886, 4364, 59438, 2, 401, 15402,
- 2065, 24950, 1, 1838, 36530, 1, 2075, 43858, 1, 3627,
-27406, 1, 2939, 5419, 1, 548, 31503, 1, 3323, 60703,
- 1, 3178, 2048, 3, 252, 61166, 1822, 12252, 1959, 34645,
- 1, 1867, 21699, 5, 616, 28300, 1529, 56155, 1670, 53142,
- 3060, 4952, 4379, 42137, 2, 259, 8450, 4404, 42137, 3,
- 356, 8874, 3085, 55420, 4429, 42137, 1, 4454, 42137, 1,
- 4479, 42137, 2, 678, 43855, 4504, 42137, 2, 2221, 35584,
- 4529, 42137, 1, 4554, 42137, 1, 1096, 37347, 2, 99,
- 6073, 3712, 25552, 1, 2171, 7210, 1, 2445, 3068, 1,
- 3012, 57393, 4, 91, 65064, 1889, 136, 2471, 9650, 3017,
- 6668, 1, 408, 47761, 1, 237, 49357, 1, 409, 47761,
- 1, 2633, 27868, 2, 1193, 59069, 3291, 30062, 1, 3591,
-49992, 2, 2808, 49346, 3866, 10948, 1, 3377, 41907, 1,
- 1733, 42985, 1, 3761, 60345, 1, 2207, 29888, 4, 163,
-10120, 766, 10258, 1664, 49691, 1845, 53209, 2, 633, 14413,
- 1109, 10714, 3, 1039, 8618, 1493, 19161, 3384, 40520, 3,
- 162, 20527, 4147, 20195, 4348, 9757, 3, 2585, 38715, 2646,
-20133, 4173, 20195, 2, 433, 6221, 4199, 20195, 4, 1676,
-43858, 3779, 13668, 3871, 26949, 4225, 20195, 1, 4251, 20195,
- 1, 4277, 20195, 2, 496, 9457, 4303, 20195, 3, 573,
-20884, 2052, 3779, 3666, 6456, 1, 2108, 61894, 1, 2881,
-43137, 1, 321, 38115, 3, 1397, 23873, 2454, 24854, 3631,
- 3963, 3, 2355, 33033, 2441, 39857, 2481, 11642, 1, 153,
- 7834, 3, 149, 31091, 416, 59886, 1879, 33259, 1, 1474,
-54252, 2, 1299, 32066, 3829, 51343, 1, 1463, 24348, 1,
- 1432, 59923, 2, 767, 10258, 2611, 46497, 1, 2148, 62516,
- 1, 3473, 3384, 1, 351, 10684, 2, 2589, 13392, 3828,
-54007, 1, 1047, 17711, 1, 2460, 1724, 1, 1168, 51802,
- 1, 3311, 22099, 1, 1364, 47398, 1, 1276, 27884, 2,
- 1215, 39103, 1504, 57292, 1, 2588, 20135, 1, 118, 2050,
- 2, 179, 60554, 2256, 53036, 1, 77, 36166, 3, 1399,
-38680, 2196, 11736, 3561, 35356, 2, 2819, 16483, 3474, 57055,
- 1, 2995, 14218, 1, 2644, 5984, 1, 3462, 58445, 1,
- 1348, 49698, 2, 1046, 24723, 1499, 41600, 2, 2525, 48096,
- 3837, 1715, 2, 1203, 58624, 1508, 59085, 3, 2522, 36867,
- 2898, 26024, 3910, 13884, 2, 1360, 36993, 4144, 46721, 2,
- 1078, 56720, 4170, 46721, 4, 1119, 50235, 1512, 12322, 3864,
-11151, 4196, 46721, 2, 1790, 6474, 4222, 46721, 3, 455,
-63297, 1130, 13153, 4248, 46721, 2, 892, 53527, 4274, 46721,
- 4, 671, 52348, 1489, 38807, 2079, 49999, 4300, 46721, 3,
- 1330, 59133, 2895, 16451, 3857, 10640, 2, 3158, 52617, 4372,
-53860, 3, 2638, 34649, 2789, 32011, 4397, 53860, 3, 9,
-28902, 477, 19875, 4422, 53860, 2, 2213, 57095, 4447, 53860,
- 6, 471, 25423, 1668, 52305, 1887, 55045, 2703, 26425, 2902,
-31483, 4472, 53860, 2, 2225, 36037, 4497, 53860, 2, 2402,
-23314, 4522, 53860, 1, 4547, 53860, 2, 1502, 11857, 2153,
- 7784, 1, 1433, 20669, 1, 2133, 58793, 1, 3784, 53208,
- 1, 1418, 39563, 1, 168, 2601, 1, 1277, 26968, 1,
- 266, 31308, 1, 203, 3502, 1, 89, 15725, 1, 3205,
- 2127, 1, 1101, 36073, 3, 3177, 22486, 3302, 47886, 3868,
-42143, 1, 41, 20221, 2, 459, 28331, 3370, 20531, 1,
- 681, 33156, 2, 941, 43496, 2269, 50119, 3, 288, 39597,
- 1238, 36400, 3900, 12836, 1, 3378, 9231, 1, 3921, 57180,
- 3, 1577, 32355, 1658, 10686, 3485, 46492, 3, 1281, 61757,
- 1901, 36078, 3304, 63075, 1, 2467, 11960, 1, 1337, 3618,
- 2, 297, 48827, 3638, 17262, 2, 772, 15241, 1769, 6388,
- 1, 773, 15241, 2, 143, 5275, 2643, 56998, 1, 685,
-60130, 1, 2642, 26508, 1, 394, 3140, 1, 3277, 32477,
- 1, 558, 31638, 1, 3833, 32360, 2, 1334, 51849, 3215,
-13877, 1, 1353, 55141, 1, 1724, 63757, 4, 705, 30736,
- 1134, 41014, 2489, 6788, 4373, 59846, 3, 2742, 49033, 2798,
-57580, 4398, 59846, 1, 4423, 59846, 2, 2769, 64351, 4448,
-59846, 2, 502, 57537, 4473, 59846, 1, 4498, 59846, 4,
- 2634, 18709, 2729, 11069, 3347, 50761, 4523, 59846, 2, 936,
-57375, 4548, 59846, 1, 2514, 30964, 1, 320, 57334, 1,
- 3770, 9021, 1, 560, 26692, 1, 1952, 19807, 1, 745,
-28596, 1, 2667, 26857, 1, 2400, 10784, 1, 2423, 21224,
- 3, 512, 53587, 1557, 31890, 2228, 1271, 2, 1290, 10930,
- 3606, 8184, 1, 4368, 57122, 2, 3004, 39258, 4393, 57122,
- 1, 4418, 57122, 3, 1157, 53342, 1821, 10185, 4443, 57122,
- 2, 1191, 41828, 4468, 57122, 3, 898, 12281, 3601, 33611,
- 4493, 57122, 1, 4518, 57122, 2, 128, 56913, 4543, 57122,
- 2, 2430, 62235, 3032, 12882, 2, 1727, 31502, 1878, 5594,
- 2, 2118, 31234, 2435, 41423, 2, 953, 3589, 3598, 16048,
- 1, 318, 52106, 3, 325, 9807, 1339, 13503, 3373, 36393,
- 1, 541, 5041, 1, 234, 4278, 1, 3552, 4983, 2,
- 896, 38965, 2553, 13356, 3, 229, 11602, 1447, 50802, 3794,
-37975, 2, 2140, 51264, 3895, 857, 1, 2088, 30205, 1,
- 2704, 56181, 1, 264, 21533, 1, 888, 31853, 3, 877,
- 9771, 1903, 4572, 3092, 50618, 3, 2117, 11622, 3056, 23665,
- 3338, 57577, 1, 1851, 10841, 1, 858, 23387, 1, 210,
-40461, 2, 3007, 26170, 4353, 43633, 3, 1652, 24854, 2267,
-39677, 2493, 49243, 1, 3265, 39960, 2, 1471, 31297, 3030,
-31235, 1, 82, 11735, 2, 12, 58971, 3149, 59089, 1,
- 524, 55999, 2, 393, 61013, 1286, 57216, 1, 2893, 1881,
- 1, 509, 4316, 1, 60, 52612, 2, 1711, 23585, 1978,
-52044, 1, 2409, 50726, 1, 2054, 1513, 3, 2574, 50022,
- 2743, 57757, 3041, 980, 2, 1001, 45832, 1465, 62842, 1,
- 102, 22765, 1, 3808, 59991, 2, 1342, 58633, 3414, 9578,
- 2, 95, 22961, 873, 32809, 1, 916, 44751, 1, 970,
-49024, 2, 611, 30732, 1868, 16694, 1, 796, 65131, 1,
- 2804, 53992, 1, 1270, 42453, 1, 2419, 37491, 2, 1533,
-51925, 2582, 54304, 1, 1478, 26319, 1, 1818, 10573, 1,
- 2612, 23628, 1, 1973, 19350, 1, 3913, 620, 2, 2538,
- 6259, 3459, 36681, 1, 727, 37900, 1, 3874, 8122, 3,
- 565, 27047, 2012, 14524, 2210, 50411, 1, 848, 8618, 1,
- 230, 928, 3, 38, 17788, 1653, 51034, 2561, 36875, 2,
- 935, 40317, 1079, 7911, 1, 1406, 31032, 3, 2597, 24984,
- 2964, 16021, 3749, 35964, 2, 194, 64022, 1853, 53812, 1,
- 2783, 21123, 2, 454, 24026, 1510, 61935, 1, 3581, 53203,
- 2, 69, 11652, 2885, 7687, 1, 2160, 33613, 2, 1207,
-34431, 2516, 21740, 2, 740, 64043, 1073, 60546, 1, 2226,
-14619, 1, 1423, 14230, 2, 3187, 33269, 3382, 51360, 1,
- 3624, 17353, 2, 281, 8393, 3872, 55224, 1, 192, 46716,
- 4, 314, 36554, 914, 41352, 1579, 33615, 2087, 50574, 2,
- 1518, 1474, 2985, 6226, 1, 3594, 43604, 1, 3858, 10627,
- 1, 1320, 42985, 1, 3257, 33401, 2, 592, 55163, 918,
-23624, 1, 3569, 7373, 2, 1984, 55571, 3218, 41015, 2,
- 3538, 51428, 3825, 51563, 1, 3535, 42312, 1, 2063, 39305,
- 1, 4367, 42399, 1, 4392, 42399, 1, 4417, 42399, 1,
- 4442, 42399, 2, 3461, 32507, 4467, 42399, 3, 1315, 23932,
- 3436, 37659, 4492, 42399, 1, 4517, 42399, 2, 1128, 56194,
- 4542, 42399, 1, 920, 15950, 1, 3454, 28137, 1, 1048,
-28256, 1, 695, 32344, 1, 2005, 15310, 2, 1922, 59925,
- 2362, 51881, 1, 3376, 9180, 1, 2205, 4121, 2, 2862,
-45394, 3287, 18597, 1, 2603, 64212, 2, 2006, 50078, 3633,
- 6837, 2, 3052, 10667, 3701, 65531, 3, 1367, 56372, 2782,
- 2382, 3086, 38498, 1, 1843, 28876, 1, 2456, 56453, 1,
- 3098, 29119, 3, 130, 44684, 1753, 58199, 3566, 22990, 3,
- 2677, 34179, 2717, 49025, 3217, 2398, 3, 2014, 54240, 2184,
-25526, 4384, 37428, 1, 4409, 37428, 2, 2894, 55182, 4434,
-37428, 1, 4459, 37428, 2, 3082, 21145, 4484, 37428, 3,
- 279, 34671, 3539, 19948, 4509, 37428, 1, 4534, 37428, 4,
- 2591, 46305, 3389, 61106, 3930, 34272, 4559, 37428, 2, 535,
-27881, 3956, 34272, 4, 5, 24899, 662, 36623, 3982, 34272,
- 4361, 55732, 1, 4008, 34272, 5, 1179, 37500, 3491, 8366,
- 3694, 6842, 3775, 17221, 4034, 34272, 3, 870, 64033, 1626,
-64522, 4060, 34272, 2, 2858, 56536, 4086, 34272, 1, 4112,
-34272, 2, 1314, 65066, 3785, 29407, 1, 3284, 14515, 1,
- 3873, 53767, 1, 3604, 8243, 1, 797, 48068, 1, 815,
- 6670, 1, 1242, 44690, 3, 543, 24673, 1312, 57657, 3939,
-20471, 2, 407, 60390, 3965, 20471, 2, 3448, 28711, 3991,
-20471, 1, 4017, 20471, 1, 4043, 20471, 1, 4069, 20471,
- 1, 4095, 20471, 1, 4121, 20471, 1, 1700, 28257, 4,
- 209, 64296, 1554, 17244, 2483, 2099, 2619, 3496, 1, 2510,
-26913, 1, 759, 22224, 1, 3705, 55000, 1, 3691, 33537,
- 2, 3105, 64168, 3760, 16012, 2, 706, 19661, 2690, 21454,
- 1, 124, 60087, 1, 3530, 49194, 3, 267, 59165, 2899,
-52867, 3720, 38568, 3, 1204, 42832, 1752, 29140, 1930, 23040,
- 1, 187, 19872, 1, 1612, 43949, 1, 3483, 43460, 1,
- 355, 40472, 2, 55, 60951, 1187, 1772, 2, 534, 2584,
- 561, 20723, 2, 751, 13656, 1311, 31204, 3, 606, 13471,
- 2592, 43395, 3114, 15598, 3, 1815, 59009, 2317, 42204, 3636,
-23431, 1, 799, 64927, 1, 2577, 11745, 1, 465, 14479,
- 1, 4570, 47091, 2, 1848, 36094, 4595, 47091, 3, 1785,
-52412, 2044, 24497, 4620, 47091, 3, 1027, 53982, 2263, 64607,
- 4645, 47091, 1, 4670, 47091, 1, 4695, 47091, 3, 2143,
-47234, 2150, 45452, 4720, 47091, 1, 3790, 56320, 1, 2923,
-28235, 1, 2001, 27398, 1, 507, 38521, 2, 2809, 18812,
- 3181, 51992, 2, 2452, 2219, 2775, 44084, 1, 2211, 354,
- 1, 839, 43854, 3, 840, 35849, 1604, 61825, 2451, 38211,
- 1, 2243, 17863, 1, 3607, 65176, 2, 441, 8791, 3057,
-15298, 3, 442, 8791, 659, 2864, 2378, 50537, 1, 4146,
-23087, 2, 2531, 62926, 4172, 23087, 2, 3722, 15305, 4198,
-23087, 5, 184, 50447, 1380, 16592, 1457, 35413, 3518, 56124,
- 4224, 23087, 1, 4250, 23087, 4, 202, 4871, 220, 34671,
- 2190, 24415, 4276, 23087, 2, 1166, 34981, 4302, 23087, 4,
- 338, 39877, 1486, 56993, 2182, 14258, 3839, 13480, 3, 2335,
-36765, 2940, 13730, 3660, 53648, 1, 2178, 8331, 2, 358,
-41233, 2278, 33524, 1, 3805, 3585, 1, 1477, 30239, 2,
- 651, 63901, 1636, 48256, 1, 1647, 47250, 2, 292, 54392,
- 2637, 14110, 1, 499, 23819, 1, 1877, 40475, 1, 1956,
-19570, 1, 3246, 22053, 2, 211, 53242, 1666, 3958, 3,
- 2094, 4655, 3348, 32352, 3360, 49972, 1, 2040, 13421, 1,
- 2449, 22471, 1, 2500, 50124, 1, 734, 22068, 1, 1964,
-22476, 1, 434, 8886, 1, 1472, 10110, 1, 2478, 40983,
- 1, 2071, 61262, 1, 3755, 3921, 1, 3886, 16949, 1,
- 2699, 40615, 1, 1717, 41960, 1, 3048, 47038, 1, 661,
- 9667, 2, 794, 52415, 2949, 49767, 1, 4354, 17164, 2,
- 2463, 43056, 3249, 36085, 1, 2359, 37590, 1, 764, 49235,
- 1, 3801, 29943, 1, 1915, 4261, 2, 1147, 59313, 2084,
- 5725, 2, 25, 18807, 1566, 24059, 1, 2223, 20291, 1,
- 2559, 46502, 1, 216, 25805, 1, 3810, 20481, 4, 1555,
-49315, 1654, 50003, 2208, 59103, 3368, 25738, 1, 2333, 39134,
- 1, 1112, 62960, 1, 1775, 29133, 2, 2092, 36075, 2767,
-57674, 1, 1683, 14532, 2, 2980, 24570, 3702, 31336, 2,
- 1608, 36844, 2647, 37532, 1, 3285, 3472, 1, 1100, 51830,
- 1, 1871, 60427, 1, 2281, 45766, 1, 1615, 24763, 3,
- 467, 46733, 1004, 47568, 3502, 30027, 4, 556, 62726, 1230,
-65304, 3031, 23608, 3782, 62771, 1, 542, 53647, 2, 765,
-49235, 2799, 34314, 1, 2752, 32903, 2, 2567, 64671, 3478,
-28997, 1, 1265, 13141, 2, 3511, 42598, 3680, 53867, 1,
- 1251, 45574, 1, 3646, 62391, 1, 1419, 18132, 3, 1581,
-54126, 2272, 20521, 2914, 12816, 1, 569, 7601, 1, 2527,
-40420, 1, 2492, 11625, 1, 166, 49484, 1, 1361, 5774,
- 1, 2010, 55961, 1, 437, 45567, 1, 2536, 15232, 1,
- 4376, 43632, 2, 2259, 56853, 4401, 43632, 1, 4426, 43632,
- 1, 4451, 43632, 2, 3450, 8172, 4476, 43632, 1, 4501,
-43632, 1, 4526, 43632, 4, 1448, 3086, 1802, 46396, 3390,
- 2208, 4551, 43632, 1, 3605, 5622, 1, 3300, 15334, 1,
- 4349, 56406, 1, 3931, 43911, 1, 3957, 43911, 2, 2650,
-37849, 3983, 43911, 2, 1617, 21082, 4009, 43911, 1, 4035,
-43911, 5, 501, 45970, 1547, 42678, 2199, 63519, 4061, 43911,
- 4338, 11743, 2, 2385, 32593, 4087, 43911, 2, 2674, 48952,
- 4113, 43911, 1, 910, 59441, 1, 4577, 46703, 3, 1542,
-12478, 3270, 8213, 4602, 46703, 1, 4627, 46703, 3, 2341,
-15183, 3365, 63297, 4652, 46703, 2, 2097, 43585, 4677, 46703,
- 1, 4702, 46703, 1, 4727, 46703, 1, 3860, 57715, 3,
- 342, 20679, 2314, 33576, 3229, 3467, 2, 111, 54960, 2601,
-62908, 1, 261, 6342, 2, 1705, 53020, 3236, 48673, 2,
- 1538, 60837, 3789, 16512, 1, 3658, 64254, 1, 959, 54540,
- 2, 370, 54753, 3507, 15348, 1, 3029, 3189, 1, 3471,
-54059, 2, 1220, 6973, 1539, 36791, 1, 265, 4190, 2,
- 223, 30590, 1633, 53383, 2, 2239, 28218, 3420, 50461, 1,
- 1488, 1052, 1, 2479, 17624, 2, 2796, 39993, 3040, 21416,
- 1, 2059, 3982, 2, 1038, 23685, 2081, 37318, 1, 1847,
-51662, 2, 2165, 18365, 3559, 45267, 2, 1081, 5993, 3143,
-27723, 2, 795, 64545, 1354, 59884, 2, 2116, 4429, 2297,
-28932, 2, 2055, 51623, 2687, 41613, 2, 339, 46067, 3669,
-38424, 3, 3272, 46717, 3288, 47873, 3424, 571, 1, 3175,
-45099, 1, 3896, 48116, 2, 180, 54947, 1316, 8609, 1,
- 4574, 19359, 1, 4599, 19359, 4, 293, 58227, 395, 41629,
- 1685, 44342, 4624, 19359, 1, 4649, 19359, 2, 1090, 13084,
- 4674, 19359, 1, 4699, 19359, 1, 4724, 19359, 1, 832,
- 7104, 2, 146, 11387, 1139, 38977, 2, 1765, 64539, 3010,
-26205, 2, 3192, 29903, 3787, 10989, 1, 1814, 14115, 4,
- 382, 55682, 1366, 8221, 1446, 1228, 3942, 5895, 2, 2713,
-51250, 3968, 5895, 4, 1159, 19448, 2357, 2549, 3630, 48663,
- 3994, 5895, 3, 1247, 44293, 3045, 30856, 4020, 5895, 4,
- 868, 22696, 2130, 59669, 3769, 62955, 4046, 5895, 3, 1761,
-32873, 3394, 38573, 4072, 5895, 3, 576, 33697, 3240, 31260,
- 4098, 5895, 2, 3748, 58342, 4124, 5895, 1, 2875, 50664,
- 1, 715, 4606, 2, 2289, 31310, 3945, 41419, 1, 3971,
-41419, 1, 3997, 41419, 2, 3396, 6371, 4023, 41419, 2,
- 1725, 36994, 4049, 41419, 3, 1690, 42748, 4075, 41419, 4371,
-38472, 3, 2235, 36207, 4101, 41419, 4396, 38472, 4, 2004,
-16531, 2137, 61512, 4127, 41419, 4421, 38472, 2, 1582, 56096,
- 4446, 38472, 3, 1, 48137, 1075, 17590, 4471, 38472, 1,
- 4496, 38472, 3, 683, 40683, 1767, 36736, 4521, 38472, 1,
- 4546, 38472, 2, 1905, 5907, 3590, 62772, 1, 47, 25514,
- 2, 1632, 14334, 2614, 24053, 3, 1490, 15230, 2887, 1967,
- 3731, 17587, 1, 2636, 24361, 4, 7, 1918, 398, 26948,
- 1714, 47858, 2562, 22177, 2, 2292, 46868, 3197, 18200, 2,
- 1121, 23196, 2389, 5117, 2, 66, 38570, 3487, 36425, 3,
- 2026, 17416, 2082, 31153, 2580, 44582, 2, 1296, 60614, 3335,
-41952, 1, 3124, 45766, 1, 1983, 25273, 2, 122, 13428,
- 3343, 7944, 1, 660, 55786, 1, 3687, 65124, 1, 2539,
-33764, 2, 1414, 5512, 1880, 28055, 1, 3055, 12440, 2,
- 2688, 2740, 3142, 54903, 1, 2770, 25562, 2, 2776, 26745,
- 3867, 30115, 1, 885, 48012, 1, 3053, 43448, 2, 494,
-45886, 583, 27797, 1, 115, 48129, 1, 3549, 27910, 1,
- 1035, 56754, 2, 1372, 16267, 1609, 33506, 1, 1804, 11591,
- 1, 3730, 30091, 1, 692, 21547, 2, 269, 53389, 2673,
- 2142, 1, 201, 19254, 3, 103, 53695, 1649, 30262, 1886,
- 6857, 2, 952, 49113, 1694, 3456, 1, 1507, 55988, 2,
- 1051, 8822, 1442, 62300, 1, 3033, 3580, 2, 1173, 4965,
- 3440, 37110, 1, 1645, 24550, 1, 2978, 40700, 1, 2420,
-30490, 1, 3200, 18573, 1, 2618, 36062, 1, 680, 40123,
- 1, 3001, 26117, 2, 3446, 18216, 3632, 42809, 1, 3881,
-52927, 1, 2436, 50744, 1, 3219, 4806, 2, 1546, 3685,
- 2671, 30577, 2, 3157, 45806, 4149, 47296, 3, 1202, 39999,
- 2868, 25567, 4175, 47296, 2, 3415, 50890, 4201, 47296, 4,
- 2523, 61588, 3051, 17393, 3774, 51927, 4227, 47296, 3, 638,
-20552, 2697, 62125, 4253, 47296, 1, 4279, 47296, 2, 1124,
-11676, 4305, 47296, 1, 3797, 47344, 3, 231, 23991, 1639,
-25670, 2593, 44340, 1, 2823, 57719, 1, 2222, 5006, 2,
- 1057, 5237, 3600, 644, 1, 2185, 35922, 4, 1832, 11146,
- 2168, 59776, 2284, 58501, 2635, 18372, 1, 3943, 23945, 1,
- 3969, 23945, 1, 3995, 23945, 1, 4021, 23945, 2, 820,
-28024, 4047, 23945, 4, 40, 33038, 1122, 12972, 1564, 45099,
- 4073, 23945, 1, 4099, 23945, 2, 2311, 57088, 4125, 23945,
- 1, 2440, 63799, 2, 519, 36226, 3445, 57741, 1, 1657,
-16177, 1, 3326, 59842, 2, 3707, 54821, 4350, 27077, 1,
- 1911, 61191, 2, 1989, 60810, 2034, 22592, 2, 2954, 4503,
- 4345, 19180, 1, 2772, 27337, 1, 3644, 39426, 1, 3708,
-48871, 1, 3676, 30697, 2, 1110, 30525, 3686, 64561, 1,
- 2507, 6188, 1, 334, 23845, 2, 2953, 8809, 3258, 29734,
- 1, 3711, 24933, 1, 2119, 64323, 1, 4150, 63477, 2,
- 1017, 41615, 4176, 63477, 1, 4202, 63477, 2, 609, 39900,
- 4228, 63477, 2, 3588, 28028, 4254, 63477, 1, 4280, 63477,
- 1, 4306, 63477, 1, 213, 12834, 1, 3267, 36872, 1,
- 2123, 2916, 1, 1899, 18171, 1, 717, 63995, 5, 1293,
-50415, 1623, 26886, 2351, 24087, 2842, 46392, 4573, 8848, 1,
- 4598, 8848, 2, 3179, 45290, 4623, 8848, 2, 817, 49083,
- 4648, 8848, 2, 2932, 3131, 4673, 8848, 2, 3933, 26085,
- 4698, 8848, 3, 855, 37670, 3959, 26085, 4723, 8848, 2,
- 3661, 17068, 3985, 26085, 3, 1520, 61144, 3135, 60891, 4011,
-26085, 1, 4037, 26085, 1, 4063, 26085, 2, 752, 37657,
- 4089, 26085, 5, 444, 38326, 468, 31546, 900, 6913, 3230,
-54793, 4115, 26085, 1, 469, 31546, 2, 461, 31546, 4741,
-19242, 1, 3223, 8484, 1, 3690, 14725, 1, 193, 2394,
- 1, 2816, 47606, 2, 917, 8868, 2763, 21976, 3, 1006,
-63089, 1359, 12311, 3946, 34188, 3, 354, 34958, 2371, 35894,
- 3972, 34188, 1, 3998, 34188, 1, 4024, 34188, 1, 4050,
-34188, 3, 1021, 40442, 3395, 50434, 4076, 34188, 1, 4102,
-34188, 2, 1250, 31150, 4128, 34188, 1, 93, 19959, 1,
- 1896, 39849, 1, 3409, 57178, 2, 331, 62397, 3736, 25261,
- 1, 46, 26313, 1, 876, 23839, 2, 483, 51223, 846,
-55652, 2, 884, 9102, 3582, 34061, 1, 1943, 60734, 1,
- 1782, 13080, 1, 235, 65087, 3, 344, 40242, 887, 60379,
- 3555, 27734, 2, 1456, 6071, 2238, 37872, 3, 1768, 4399,
- 2274, 22842, 2584, 5571, 2, 533, 52498, 1071, 12995, 2,
- 954, 39587, 1369, 16230, 2, 1720, 8662, 2365, 2684, 2,
- 2695, 16708, 3645, 26502, 1, 2625, 36121, 3, 391, 20497,
- 861, 42321, 911, 37568, 1, 160, 46167, 1, 249, 11984,
- 3, 850, 40346, 1269, 47910, 1918, 31350, 3, 3127, 23164,
- 3153, 23084, 3935, 52618, 1, 3961, 52618, 1, 3987, 52618,
- 3, 1912, 51547, 2874, 14338, 4013, 52618, 1, 4039, 52618,
- 1, 4065, 52618, 3, 1426, 40727, 2477, 21870, 4091, 52618,
- 3, 2099, 12730, 2986, 55334, 4117, 52618, 1, 18, 52003,
- 2, 1506, 61754, 2032, 42341, 3, 298, 20825, 2270, 55375,
- 2779, 23737, 2, 1402, 63752, 4336, 25365, 1, 3820, 60334,
- 2, 739, 15830, 1305, 32042, 1, 1151, 36810, 3, 171,
- 9374, 1152, 36810, 2138, 44321, 2, 1153, 36810, 3148, 10465,
- 3, 251, 29685, 1094, 7310, 2425, 43320, 1, 3281, 15943,
- 1, 3651, 49654, 1, 1648, 51604, 2, 605, 29883, 732,
-57990, 1, 1174, 55332, 1, 67, 50637, 3, 1099, 2051,
- 1184, 22054, 3101, 58494, 1, 841, 26965, 1, 3035, 46073,
- 1, 842, 18960, 2, 1031, 4878, 3568, 20159, 3, 1371,
- 9608, 1384, 59915, 1500, 57852, 1, 3336, 54613, 1, 4325,
-60935, 1, 3817, 4469, 3, 2319, 6396, 2448, 50987, 3934,
-63084, 1, 3960, 63084, 3, 2847, 41874, 3754, 43791, 3986,
-63084, 1, 4012, 63084, 2, 1517, 60631, 4038, 63084, 1,
- 4064, 63084, 2, 1833, 44483, 4090, 63084, 1, 4116, 63084,
- 3, 1149, 11417, 1154, 36810, 3269, 61765, 1, 1155, 36810,
- 1, 1068, 6114, 1, 2867, 14973, 3, 212, 55853, 2062,
-51876, 3126, 56305, 1, 845, 10711, 2, 1341, 25011, 3289,
-62949, 3, 2201, 12767, 2307, 45570, 2595, 10376, 1, 2744,
-28562, 2, 2037, 21224, 3804, 8540, 1, 2102, 65162, 2,
- 871, 52922, 4324, 25934, 3, 371, 7574, 1105, 58553, 3777,
-38993, 1, 577, 15290, 1, 3509, 21043, 1, 3266, 64707,
- 2, 2694, 61521, 4383, 10836, 2, 1560, 20895, 4408, 10836,
- 3, 1052, 40973, 2499, 61158, 4433, 10836, 1, 4458, 10836,
- 1, 4483, 10836, 1, 4508, 10836, 3, 2548, 21447, 3054,
-44195, 4533, 10836, 2, 3488, 45632, 4558, 10836, 3, 189,
- 1478, 1376, 57051, 3853, 20584, 1, 2261, 3225, 1, 1156,
-36810, 1, 2424, 50155, 2, 1735, 45886, 2552, 43202, 2,
- 1864, 19916, 3740, 39939, 2, 1881, 17947, 2258, 32491, 2,
- 484, 1159, 579, 56196, 1, 1216, 2410, 2, 1129, 45125,
- 2535, 28572, 1, 2883, 59084, 1, 3531, 36937, 1, 3889,
-38712, 2, 1813, 39734, 2984, 1017, 1, 2406, 5691, 3,
- 1437, 59363, 1835, 24892, 3916, 4150, 2, 755, 26484, 2368,
- 2826, 3, 241, 30636, 2841, 35487, 3883, 45352, 2, 2107,
-61425, 3649, 19409, 1, 2503, 36887, 3, 2457, 43976, 3172,
-10290, 3322, 24159, 1, 1175, 13086, 1, 3855, 45877, 3,
- 315, 41925, 1556, 52511, 2323, 42347, 1, 2691, 49513, 2,
- 1263, 55200, 2215, 61086, 1, 3629, 26600, 1, 481, 61284,
- 2, 324, 54190, 3204, 59971, 1, 1503, 14272, 1, 3337,
-15711, 1, 571, 43886, 1, 1116, 3560, 1, 3464, 16534,
- 1, 2989, 27830, 1, 3704, 25046, 1, 3046, 55598, 1,
- 1628, 26677, 1, 3263, 54146, 3, 427, 11988, 1606, 35271,
- 3738, 23943, 1, 2095, 25198, 1, 1061, 22251, 2, 137,
-35996, 1138, 54734, 2, 2346, 32479, 4133, 2197, 1, 4159,
- 2197, 2, 1988, 32421, 4185, 2197, 1, 4211, 2197, 2,
- 2829, 16099, 4237, 2197, 1, 4263, 2197, 4, 129, 18788,
- 295, 55340, 1385, 64616, 4289, 2197, 2, 446, 38313, 3579,
-55222, 1, 2337, 46896, 2, 1102, 49389, 2219, 11139, 1,
- 3662, 16509, 3, 779, 20534, 3489, 40116, 3622, 9636, 1,
- 400, 5300, 2, 452, 24827, 474, 58935, 3, 451, 7102,
- 1114, 12586, 2956, 35391, 1, 56, 44155, 5, 1026, 9463,
- 1955, 22848, 3456, 55478, 3767, 42010, 3836, 62817, 2, 798,
-61033, 1600, 49545, 3, 1228, 229, 1673, 40583, 3496, 37315,
- 2, 1118, 8852, 2129, 51674, 1, 2526, 32883, 1, 1601,
-31074, 2, 663, 7682, 760, 50767, 1, 2372, 45706, 1,
- 540, 23831, 1, 2416, 2298, 1, 1787, 15160, 2, 350,
- 8612, 1748, 48746, 1, 724, 50380, 2, 61, 55617, 622,
-22342, 2, 2609, 27136, 2859, 12345, 1, 1327, 10832, 1,
- 931, 35176, 1, 737, 14113, 4, 753, 18173, 2415, 24212,
- 2581, 5558, 3447, 50755, 1, 1942, 23988, 1, 2911, 58761,
- 2, 1481, 54623, 3517, 8876, 1, 4151, 3768, 3, 783,
-52072, 3241, 15197, 4177, 3768, 4, 144, 3386, 1172, 17467,
- 3009, 30697, 4203, 3768, 1, 4229, 3768, 2, 3256, 15927,
- 4255, 3768, 2, 2072, 54521, 4281, 3768, 1, 4307, 3768,
- 1, 1562, 63565, 1, 804, 21408, 1, 3435, 12567, 1,
- 3744, 9649, 1, 750, 28412, 2, 1778, 14606, 4339, 46848,
- 2, 2291, 5510, 2864, 1466, 1, 51, 19083, 3, 45,
-24707, 965, 20866, 1455, 12378, 1, 164, 30858, 2, 239,
-11547, 3416, 34063, 2, 74, 4780, 1516, 861, 2, 2702,
-62914, 3100, 44525, 1, 3089, 42123, 2, 1830, 63104, 2377,
-33073, 1, 3417, 24256, 1, 4153, 56121, 2, 3367, 43364,
- 4179, 56121, 6, 597, 39642, 2151, 9640, 2244, 13082, 2936,
-36394, 3222, 60381, 4205, 56121, 2, 2050, 12410, 4231, 56121,
- 2, 3140, 58080, 4257, 56121, 3, 1858, 40648, 2442, 47547,
- 4283, 56121, 2, 3852, 19328, 4309, 56121, 1, 4157, 23444,
- 3, 1828, 5298, 2545, 56114, 4183, 23444, 2, 1082, 7510,
- 4209, 23444, 1, 4235, 23444, 2, 2392, 1335, 4261, 23444,
- 2, 326, 61004, 4287, 23444, 1, 4313, 23444, 1, 312,
-46660, 4, 550, 30709, 726, 61350, 811, 13314, 2057, 44601,
- 1, 2791, 59178, 2, 2031, 46078, 2857, 55687, 1, 951,
- 3283, 1, 3504, 21102, 2, 487, 19054, 3746, 6411, 1,
- 2854, 4870, 1, 2572, 40733, 1, 2407, 28536, 1, 1817,
-18914, 2, 925, 55552, 3243, 49564, 2, 978, 17868, 3677,
- 6304, 2, 1416, 55466, 3325, 36756, 1, 101, 17546, 2,
- 1104, 29691, 2917, 58594, 1, 1233, 54000, 1, 600, 52957,
- 2, 8, 36679, 3675, 56955, 2, 3165, 26806, 3392, 10083,
- 1, 2275, 10492, 2, 1420, 34217, 3095, 19098, 1, 240,
- 923, 1, 3364, 21243, 2, 133, 8519, 2990, 17426, 1,
- 595, 11283, 1, 2482, 4300, 3, 1098, 2521, 4136, 52736,
- 4565, 11827, 3, 3118, 47122, 4162, 52736, 4590, 11827, 2,
- 4188, 52736, 4615, 11827, 2, 4214, 52736, 4640, 11827, 3,
- 3080, 19575, 4240, 52736, 4665, 11827, 3, 1347, 9723, 4266,
-52736, 4690, 11827, 3, 1913, 62865, 4292, 52736, 4715, 11827,
- 2, 793, 25768, 2934, 45132, 3, 528, 15741, 2313, 57132,
- 3516, 19778, 1, 3421, 31319, 1, 2541, 11405, 2, 2824,
-19175, 4323, 55082, 1, 2401, 6109, 1, 2678, 2693, 1,
- 1762, 16572, 1, 669, 19760, 1, 275, 55939, 4, 1706,
-60224, 1925, 63875, 2835, 61866, 2963, 19958, 3, 1439, 27237,
- 2338, 21316, 2778, 25725, 1, 2273, 26371, 2, 131, 24943,
- 200, 44118, 1, 3432, 55394, 1, 3714, 64610, 2, 615,
- 6465, 3628, 26659, 2, 2784, 15270, 2996, 43119, 1, 2120,
-45515, 1, 4357, 12332, 1, 303, 3436, 2, 768, 45467,
- 1108, 18562, 1, 2583, 37445, 2, 1660, 31035, 3560, 52621,
- 1, 1223, 1367, 3, 1640, 32965, 1774, 23340, 3132, 52320,
- 1, 1701, 1382, 2, 822, 7733, 927, 1335, 2, 1991,
-13892, 3878, 20205, 2, 126, 51386, 1362, 64281, 2, 1089,
-50377, 1987, 5865, 1, 2121, 28874, 3, 62, 41330, 2391,
-63359, 4143, 32474, 2, 1611, 43367, 4169, 32474, 1, 4195,
-32474, 3, 421, 3220, 2533, 11021, 4221, 32474, 1, 4247,
-32474, 2, 3120, 47440, 4273, 32474, 2, 812, 6387, 4299,
-32474, 3, 3083, 61022, 3452, 35968, 4742, 35567, 1, 2607,
-24122, 3, 702, 63843, 746, 40328, 2271, 61255, 1, 2815,
-19043, 2, 233, 13498, 2279, 65473, 3, 682, 33160, 792,
-59593, 3066, 22511, 3, 224, 47690, 1675, 5127, 2999, 51830,
- 2, 1064, 34673, 3534, 17310, 1, 1243, 65152, 4, 874,
-17211, 958, 29496, 1509, 41146, 2486, 47012, 2, 2020, 8967,
- 2558, 24344, 1, 3428, 57726, 1, 1862, 33847, 1, 1044,
-28533, 2, 520, 28941, 2473, 45750, 1, 886, 48078, 2,
- 2091, 45499, 2575, 55994, 1, 1894, 38808, 1, 1693, 28786,
- 1, 590, 45466, 4, 307, 65044, 895, 10619, 2011, 42492,
- 4155, 10158, 1, 4181, 10158, 1, 4207, 10158, 5, 2546,
-28423, 2941, 61831, 3458, 55537, 3792, 21657, 4233, 10158, 2,
- 2666, 26710, 4259, 10158, 1, 4285, 10158, 2, 2629, 8985,
- 4311, 10158, 1, 2689, 61080, 2, 2741, 15674, 2851, 8281,
- 2, 14, 31121, 2112, 43730, 2, 754, 29529, 1294, 52402,
- 1, 3906, 31755, 2, 1526, 54603, 2528, 47645, 1, 1198,
-44176, 2, 3147, 49454, 3543, 38543, 1, 1438, 8268, 1,
- 3331, 44374, 1, 3735, 23744, 1, 921, 3250, 2, 934,
- 7495, 2134, 41426, 1, 498, 25327, 3, 29, 55180, 1957,
-61185, 3667, 25830, 1, 439, 9083, 1, 1950, 464, 1,
- 1374, 46786, 2, 915, 56983, 3418, 24227, 2, 302, 54417,
- 3621, 268, 1, 4571, 24406, 1, 4596, 24406, 3, 301,
-48639, 2685, 34923, 4621, 24406, 4, 856, 62321, 3298, 61214,
- 4646, 24406, 4750, 9940, 1, 4671, 24406, 1, 4696, 24406,
- 2, 2187, 55263, 4721, 24406, 4, 1285, 27166, 1597, 57802,
- 1629, 29797, 3937, 36921, 1, 3963, 36921, 2, 403, 30233,
- 3989, 36921, 2, 744, 60768, 4015, 36921, 1, 4041, 36921,
- 1, 4067, 36921, 1, 4093, 36921, 2, 262, 26823, 4119,
-36921, 1, 3893, 24644, 4, 104, 45106, 1003, 58122, 2938,
-49562, 3112, 47552, 2, 538, 23671, 2236, 35765, 2, 173,
-12248, 1703, 24050, 1, 2356, 57371, 1, 899, 25730, 1,
- 2918, 22924, 1, 116, 10592, 1, 2587, 62130, 2, 2433,
-43380, 2705, 59620, 1, 2240, 59123, 3, 536, 20421, 1523,
-18211, 2758, 6940, 3, 1734, 63992, 3503, 8683, 4327, 16169,
- 2, 196, 45668, 1585, 57266, 1, 2512, 11635, 4, 343,
-29110, 1072, 27055, 1710, 38532, 1968, 50561, 3, 215, 58908,
- 1387, 25167, 2384, 33025, 2, 1840, 65518, 2293, 53273, 1,
- 3429, 32392, 1, 785, 4911, 1, 532, 20557, 1, 2266,
-19945, 1, 979, 53702, 1, 2146, 65080, 1, 607, 15112,
- 2, 1201, 64079, 3154, 61848, 2, 714, 7083, 852, 34444,
- 1, 3388, 11018, 1, 2241, 51657, 2, 2353, 36974, 4332,
- 8420, 1, 2508, 44381, 1, 2803, 65003, 1, 1317, 39362,
- 1, 2848, 37472, 1, 1681, 47899, 2, 1976, 4905, 3596,
-32655, 1, 63, 17228, 2, 942, 17372, 3278, 26577, 2,
- 174, 20583, 2753, 23174, 1, 2834, 37642, 2, 2276, 9946,
- 2993, 232, 2, 596, 33602, 713, 2693, 3, 359, 8813,
- 1209, 45420, 1680, 10589, 1, 1356, 40950, 1, 1939, 40404,
- 2, 449, 44361, 1534, 55540, 1, 3156, 7039, 2, 617,
- 2981, 2157, 53021, 1, 3151, 26372, 1, 1298, 25787, 3,
- 1674, 41500, 3210, 5203, 3859, 33749, 5, 1182, 28144, 1274,
- 725, 1346, 26564, 2578, 30696, 3380, 9143, 4, 59, 643,
- 1355, 61242, 1882, 48, 1977, 53681, 2, 1150, 31271, 2715,
-21677, 1, 3282, 60733, 1, 2751, 57107, 1, 3899, 15588,
- 2, 504, 21921, 1791, 32255, 2, 1902, 29154, 2458, 22210,
- 1, 136, 4792, 1, 2300, 56410, 1, 2370, 49149, 1,
- 2544, 54117, 2, 3342, 19283, 4749, 9940, 1, 1126, 24403,
- 2, 2447, 65460, 2693, 36328, 1, 2564, 28465, 1, 3253,
-30248, 1, 1225, 14069, 1, 3532, 63504, 1, 2013, 14922,
- 1, 2599, 29832, 3, 1575, 40438, 2604, 42815, 3328, 36028,
- 3, 1137, 4955, 1197, 9419, 2147, 27733, 2, 1249, 21168,
- 2810, 42014, 2, 1088, 57668, 2077, 43773, 1, 2916, 65123,
- 2, 346, 51902, 3356, 45576, 1, 1766, 44263, 1, 3411,
-28847, 1, 3648, 4017, 2, 1548, 65335, 2889, 33060, 1,
- 1961, 60567, 1, 612, 44791, 1, 3245, 38976, 1, 1404,
-14240, 1, 599, 54399, 1, 3228, 30080, 1, 363, 39060,
- 1, 1074, 12613, 3, 1117, 25613, 1527, 34195, 1661, 10225,
- 1, 2000, 32457, 2, 2227, 53494, 2888, 31017, 2, 1022,
-25292, 1586, 61106, 1, 3022, 24164, 1, 4132, 30445, 2,
- 2417, 22605, 4158, 30445, 1, 4184, 30445, 4, 21, 64258,
- 559, 22994, 4210, 30445, 4746, 7130, 3, 891, 3624, 1145,
-49466, 4236, 30445, 1, 4262, 30445, 3, 3355, 8194, 3920,
-12951, 4288, 30445, 2, 2345, 34663, 2627, 1035, 1, 769,
-62020, 1, 562, 43459, 2, 199, 58580, 1954, 34804, 2,
- 3068, 32927, 3180, 29376, 1, 1589, 62975, 2, 1162, 23589,
- 1745, 50362, 1, 3572, 29346, 2, 88, 13885, 1440, 20182,
- 1, 3439, 2764, 3, 2280, 2984, 2813, 52082, 3237, 41087,
- 2, 950, 62489, 1092, 32866, 1, 145, 47468, 3, 3,
-28480, 3233, 48618, 3771, 23331, 3, 1974, 38287, 2233, 13877,
- 3247, 6652, 2, 2429, 27356, 3892, 48247, 1, 4375, 41588,
- 3, 1424, 64894, 4330, 60955, 4400, 41588, 1, 4425, 41588,
- 2, 1278, 54663, 4450, 41588, 1, 4475, 41588, 1, 4500,
-41588, 2, 1435, 41095, 4525, 41588, 2, 1789, 62630, 4550,
-41588, 1, 1030, 11068, 1, 1383, 41529, 1, 2366, 61520,
- 1, 1325, 51469, 1, 3013, 39036, 2, 1295, 42309, 4740,
-37121, 1, 462, 61013, 3, 255, 62101, 1135, 7142, 3870,
-51716, 1, 1684, 55553, 1, 654, 57624, 5, 1336, 22501,
- 1468, 5061, 2304, 38056, 2876, 3857, 4380, 12331, 4, 1692,
-15085, 1888, 38912, 2598, 19831, 4405, 12331, 1, 4430, 12331,
- 3, 2777, 14067, 3354, 2025, 4455, 12331, 1, 4480, 12331,
- 3, 332, 30933, 1852, 38107, 4505, 12331, 1, 4530, 12331,
- 1, 4555, 12331, 2, 1084, 18589, 2793, 26183, 3, 1596,
-19675, 2845, 6962, 3521, 53464, 1, 3652, 63757, 1, 1254,
-64806, 3, 1086, 7079, 2189, 19307, 2321, 6646, 1, 1839,
-20170, 1, 1483, 7261, 1, 4344, 52713, 1, 2655, 31849,
- 1, 3495, 45652, 1, 109, 40063, 1, 1870, 32245, 2,
- 2162, 60657, 4581, 15402, 3, 3043, 56708, 3334, 28717, 4606,
-15402, 1, 4631, 15402, 2, 2206, 55810, 4656, 15402, 2,
- 3932, 64894, 4681, 15402, 3, 998, 31353, 3958, 64894, 4706,
-15402, 3, 2164, 25054, 3984, 64894, 4731, 15402, 2, 733,
-64470, 4010, 64894, 2, 37, 25816, 4036, 64894, 2, 1393,
-62764, 4062, 64894, 2, 1921, 27109, 4088, 64894, 1, 4114,
-64894, 1, 3835, 28440, 2, 1981, 49668, 3656, 19248, 2,
- 2042, 18363, 2403, 54539, 1, 328, 43059, 3, 805, 51008,
- 1801, 18340, 3333, 38187, 1, 1967, 29242, 2, 2520, 2318,
- 3642, 36163, 1, 3109, 13383, 1, 2727, 14566, 2, 684,
-38210, 2234, 431, 2, 65, 20767, 2557, 2619, 1, 976,
-58610, 3, 305, 5675, 807, 13797, 2257, 27821, 1, 1926,
-13500, 2, 1999, 14082, 3443, 18906, 1, 50, 39912, 1,
- 4568, 50028, 1, 4593, 50028, 2, 1781, 62207, 4618, 50028,
- 2, 641, 14201, 4643, 50028, 1, 4668, 50028, 1, 4693,
-50028, 1, 4718, 50028, 2, 159, 42174, 287, 42499, 1,
- 3131, 4881, 3, 310, 11600, 423, 46734, 1622, 15319, 1,
- 3244, 62626, 1, 2750, 37601, 2, 1642, 12981, 2488, 12143,
- 2, 2973, 18026, 3780, 41776, 1, 652, 2991, 2, 985,
- 7333, 2869, 43601, 3, 2820, 32942, 3024, 62730, 3359, 43488,
- 4, 2628, 47564, 3028, 8282, 3492, 62222, 3709, 58464, 1,
- 2074, 58061, 1, 1689, 6586, 1, 3400, 41955, 1, 3034,
-11825, 3, 1163, 51292, 1300, 50382, 1485, 33442, 1, 2910,
-57877, 1, 3202, 28451, 1, 3940, 38155, 2, 365, 40480,
- 3966, 38155, 2, 823, 35090, 3992, 38155, 2, 3842, 20877,
- 4018, 38155, 2, 127, 15446, 4044, 38155, 1, 4070, 38155,
- 1, 4096, 38155, 2, 378, 46707, 4122, 38155, 2, 385,
-46707, 2286, 34942, 2, 1741, 4996, 3824, 50883, 3, 1283,
-31447, 2395, 49182, 3802, 9641, 3, 491, 63930, 882, 13348,
- 4156, 39586, 2, 1678, 64612, 4182, 39586, 2, 2167, 55313,
- 4208, 39586, 4, 361, 17383, 1358, 45661, 2411, 40399, 4234,
-39586, 3, 1618, 28748, 2748, 39002, 4260, 39586, 3, 206,
- 7605, 341, 34193, 4286, 39586, 5, 584, 26687, 2762, 11374,
- 2933, 24721, 3274, 59418, 4312, 39586, 1, 3150, 33521, 1,
- 3213, 44087, 1, 336, 27600, 1, 712, 61174, 1, 3814,
-43870, 2, 185, 29555, 2832, 65228, 3, 1637, 28090, 3093,
-44250, 3821, 28159, 1, 1382, 62228, 1, 369, 1030, 2,
- 1069, 62259, 2976, 55878, 1, 1177, 38395, 2, 285, 3501,
- 2027, 19533, 3, 2326, 55902, 2749, 26982, 2879, 54622, 1,
- 990, 19895, 2, 2173, 25010, 3672, 56871, 1, 748, 39262,
- 2, 2724, 57501, 3685, 10936, 1, 2814, 41761, 1, 991,
- 9655, 1, 4148, 13953, 5, 120, 61178, 450, 42206, 2089,
- 1556, 2484, 26497, 4174, 13953, 3, 1076, 33940, 3185, 61772,
- 4200, 13953, 4, 2668, 11210, 3036, 51863, 4226, 13953, 4388,
-40614, 2, 4252, 13953, 4413, 40614, 3, 963, 24134, 4278,
-13953, 4438, 40614, 2, 4304, 13953, 4463, 40614, 3, 112,
-20732, 1641, 39467, 4488, 40614, 2, 2320, 11750, 4513, 40614,
- 3, 1712, 30080, 3207, 34874, 4538, 40614, 1, 4563, 40614,
- 2, 1667, 8983, 2613, 52742, 1, 1928, 1408, 2, 1303,
-60558, 3293, 51575, 1, 2299, 11941, 4, 2069, 792, 2288,
-50225, 2344, 61696, 3362, 57997, 4, 340, 4155, 1056, 60806,
- 1307, 53321, 3146, 3921, 2, 2586, 4111, 3783, 21159, 3,
- 3027, 31309, 3106, 32025, 3823, 59702, 1, 2563, 15092, 1,
- 923, 14866, 1, 1691, 8177, 2, 1165, 54477, 2039, 63793,
- 1, 1180, 8336, 2, 1323, 8507, 3318, 12124, 3, 836,
-60530, 1409, 51308, 2250, 49710, 1, 3398, 25358, 1, 447,
-12386, 1, 1370, 36437, 2, 736, 35935, 3144, 9223, 2,
- 3508, 50119, 4351, 17209, 4, 1552, 43763, 2787, 30401, 2839,
-61593, 3170, 58729, 1, 3678, 33016, 1, 2049, 8457, 1,
- 3525, 26426, 2, 1398, 53679, 4745, 30283, 1, 1732, 31605,
- 3, 1722, 60143, 2176, 23331, 3242, 2279, 1, 11, 19010,
- 2, 294, 22575, 1375, 46126, 1, 977, 54388, 1, 2969,
-42094, 3, 588, 10789, 1744, 2833, 2662, 47857, 1, 1696,
-36041, 3, 263, 29735, 3564, 56112, 3863, 16573, 1, 3877,
-37354, 2, 1484, 17975, 3307, 64094, 1, 929, 43590, 1,
- 578, 56074, 1, 3071, 24547, 2, 1120, 2311, 2265, 62165,
- 2, 3399, 46271, 3408, 11341, 2, 1972, 61021, 2701, 60996,
- 1, 3090, 13222, 1, 4328, 28975, 1, 3008, 63185, 1,
- 33, 21793, 2, 1497, 52594, 2621, 15802, 3, 1797, 29640,
- 3465, 18007, 3587, 55801, 2, 3125, 35023, 3499, 30958, 2,
- 1743, 3302, 3232, 30969, 2, 667, 51536, 2390, 40065, 1,
- 2149, 14645, 2, 1273, 12486, 3139, 47948, 1, 3522, 48425,
- 1, 3494, 13672, 3, 2571, 50525, 2709, 12658, 3299, 59414,
- 1, 2710, 12658, 1, 865, 3339, 1, 2086, 46874, 3,
- 4, 23290, 138, 14645, 1947, 49038, 2, 274, 9293, 2019,
-63553, 1, 1405, 11781, 1, 4575, 61705, 1, 4600, 61705,
- 1, 4625, 61705, 2, 1248, 56551, 4650, 61705, 2, 2497,
- 6296, 4675, 61705, 1, 4700, 61705, 2, 2951, 44859, 4725,
-61705, 2, 2534, 19859, 3188, 25188, 2, 374, 38263, 2446,
-45551, 1, 3697, 48734, 2, 3816, 56996, 4385, 40787, 1,
- 4410, 40787, 1, 4435, 40787, 2, 1941, 3347, 4460, 40787,
- 2, 2113, 27536, 4485, 40787, 2, 2961, 44760, 4510, 40787,
- 2, 1212, 22662, 4535, 40787, 3, 827, 14008, 1049, 34923,
- 4560, 40787, 1, 500, 35888, 3, 912, 3273, 949, 21621,
- 3061, 53055, 2, 2890, 17896, 3479, 53292, 2, 388, 54648,
- 1115, 13271, 3, 333, 22494, 384, 27125, 2780, 20795, 4,
- 530, 13595, 986, 4043, 3167, 24970, 3641, 51532, 2, 2139,
-57004, 2928, 58500, 1, 1584, 24150, 2, 632, 40124, 2198,
-21151, 2, 2487, 60465, 2992, 24289, 1, 170, 47738, 1,
- 258, 37918, 2, 1859, 40601, 3856, 26818, 2, 410, 16290,
- 2142, 10967, 1, 2836, 32934, 3, 86, 15583, 360, 33506,
- 3929, 37789, 1, 3955, 37789, 2, 329, 41110, 3981, 37789,
- 3, 1565, 46511, 3251, 5560, 4007, 37789, 3, 2747, 37070,
- 4033, 37789, 4315, 57356, 1, 4059, 37789, 1, 4085, 37789,
- 2, 919, 63264, 4111, 37789, 1, 2180, 61490, 1, 2579,
-58081, 2, 167, 45627, 3164, 29995, 1, 608, 28622, 2,
- 1467, 3085, 3904, 60616, 3, 254, 57895, 1401, 54326, 3309,
-43001, 2, 2653, 44094, 4370, 43131, 2, 1213, 35859, 4395,
-43131, 2, 3617, 54409, 4420, 43131, 2, 3115, 60368, 4445,
-43131, 2, 722, 51396, 4470, 43131, 2, 3664, 57072, 4495,
-43131, 1, 4520, 43131, 1, 4545, 43131, 1, 1032, 15253,
- 2, 1034, 2901, 1916, 24065, 2, 375, 51918, 624, 49561,
- 1, 1677, 3822, 1, 4358, 53948, 2, 593, 25894, 3635,
-47162, 2, 1992, 39505, 4744, 30283, 4, 591, 50623, 707,
-15230, 1306, 57682, 2543, 44803, 1, 2387, 16006, 2, 169,
-20563, 1505, 50261, 1, 1271, 46107, 1, 2608, 28715, 1,
- 2774, 48914, 2, 1132, 61306, 1267, 58172, 1, 518, 27424,
- 2, 999, 29841, 4748, 9940, 1, 838, 44226, 1, 1747,
- 9481, 1, 3732, 56097, 2, 2047, 52307, 3733, 56097, 1,
- 825, 52445, 2, 1344, 48335, 3122, 26899, 1, 4352, 52158,
- 3, 117, 40869, 1036, 18137, 3129, 12756, 2, 3554, 37345,
- 3603, 62042, 1, 3556, 25476, 3, 2264, 19873, 2431, 30037,
- 2979, 47808, 1, 1218, 57949, 1, 2254, 49006, 2, 438,
-51061, 2913, 11002, 1, 1452, 59769, 4, 222, 43302, 718,
-52902, 3834, 18854, 3901, 10076, 1, 3184, 34748, 1, 3795,
-21583, 3, 2554, 37746, 3271, 9728, 3618, 11411, 2, 731,
- 7203, 2732, 44119, 2, 2290, 31149, 3166, 29226, 1, 58,
-10068, 1, 955, 13539, 2, 134, 15193, 4576, 63613, 2,
- 2946, 55896, 4601, 63613, 2, 139, 42791, 4626, 63613, 2,
- 2756, 26665, 4651, 63613, 2, 2665, 51496, 4676, 63613, 2,
- 490, 9810, 4701, 63613, 2, 1239, 39081, 4726, 63613, 1,
- 1891, 5846, 3, 903, 30332, 1963, 37055, 2068, 1998, 2,
- 337, 39179, 3320, 62520, 1, 1275, 59569, 1, 2426, 58006,
- 1, 1043, 29561, 1, 2513, 25054, 2, 1291, 12972, 2045,
-13558, 1, 598, 24146, 1, 72, 64772, 1, 3592, 24459,
- 2, 1392, 14279, 3640, 34192, 2, 1917, 54628, 2692, 47287,
- 1, 2670, 52385, 1, 2496, 41251, 1, 3173, 26759, 3,
- 75, 11204, 2925, 48574, 4567, 22922, 3, 1824, 7262, 1869,
-41111, 4592, 22922, 2, 390, 1788, 4617, 22922, 3, 396,
-14107, 2645, 5307, 4642, 22922, 1, 4667, 22922, 4, 1266,
-60170, 2216, 53580, 3575, 31271, 4692, 22922, 1, 4717, 22922,
- 2, 824, 9748, 1443, 53410, 4, 183, 54086, 984, 20974,
- 1756, 150, 2967, 59719, 2, 419, 62838, 894, 18911, 2,
- 864, 61943, 3831, 31620, 2, 2766, 4809, 3815, 54103, 2,
- 440, 26931, 4377, 17302, 3, 1953, 19949, 3854, 24510, 4402,
-17302, 1, 4427, 17302, 1, 4452, 17302, 1, 4477, 17302,
- 2, 3917, 28528, 4502, 17302, 2, 2630, 41437, 4527, 17302,
- 2, 2349, 58488, 4552, 17302, 1, 1106, 38133, 1, 1183,
-46791, 1, 3191, 45896, 1, 2912, 42257, 1, 3602, 33753,
- 3, 2757, 24873, 3161, 13149, 3806, 53644, 1, 2316, 2545,
- 1, 3208, 16806, 1, 3044, 29518, 3, 1650, 2467, 2003,
-61057, 3211, 26256, 2, 1746, 31346, 3523, 7540, 3, 686,
-60479, 802, 41505, 2926, 16409, 2, 2141, 51406, 4152, 43007,
- 4, 19, 50140, 1726, 60089, 3401, 32061, 4178, 43007, 1,
- 4204, 43007, 3, 749, 38505, 2008, 12807, 4230, 43007, 1,
- 4256, 43007, 2, 87, 44325, 4282, 43007, 2, 679, 55254,
- 4308, 43007, 2, 2944, 47335, 3301, 50881, 2, 545, 14159,
- 1136, 50768, 1, 3544, 6358, 2, 902, 63562, 3573, 27863,
- 1, 3515, 59776, 2, 700, 30948, 2277, 62207, 1, 629,
-19144, 1, 123, 31011, 1, 2519, 58203, 3, 217, 20775,
- 742, 15070, 3273, 49985, 1, 1357, 26940, 1, 1045, 4756,
- 1, 3019, 25034, 1, 2943, 38467, 1, 554, 4047, 2,
- 1087, 24467, 2754, 40545, 1, 623, 7740, 2, 1389, 20984,
- 2127, 45507, 1, 2905, 43751, 1, 572, 49570, 1, 35,
-36192, 2, 20, 30554, 2991, 29328, 1, 1232, 38827, 3,
- 1083, 109, 2640, 35683, 3595, 64582, 1, 1063, 61225, 3,
- 2230, 60079, 3113, 27739, 3803, 52349, 1, 406, 14914, 1,
- 2900, 57031, 1, 3174, 21682, 2, 666, 47233, 1310, 39271,
- 1, 1365, 3055, 1, 3283, 56550, 2, 397, 11321, 2870,
-43284, 1, 3862, 31050, 2, 300, 37995, 2812, 62810, 1,
- 3493, 48544, 2, 939, 36715, 2970, 22430, 1, 402, 29352,
- 1, 1885, 61844, 1, 1501, 41564, 3, 424, 23340, 458,
-25646, 2398, 7027, 2, 2159, 51142, 2960, 48111, 2, 1919,
-64772, 2801, 1792, 2, 818, 16013, 3611, 56467, 1, 2948,
-62355, 3, 147, 46216, 323, 12234, 3938, 60277, 3, 186,
-42759, 2838, 57292, 3964, 60277, 1, 3990, 60277, 2, 3626,
- 6858, 4016, 60277, 3, 1809, 51603, 3716, 49697, 4042, 60277,
- 2, 655, 63854, 4068, 60277, 1, 4094, 60277, 2, 3751,
- 7709, 4120, 60277, 1, 3725, 9183, 2, 1825, 25460, 3882,
-58070, 1, 2849, 16352, 1, 3038, 21591, 3, 197, 24868,
- 813, 5649, 3909, 57200, 1, 445, 7123, 2, 676, 43285,
- 1909, 48230, 1, 204, 47477, 1, 1697, 23463, 1, 1453,
-21574, 3, 2339, 52874, 2683, 42027, 3753, 26797, 2, 30,
-17980, 968, 42152, 1, 2570, 36905, 2, 1944, 61204, 2462,
-24085, 1, 1181, 43168, 2, 2262, 54528, 3542, 8171, 2,
- 1511, 45132, 2163, 29181, 2, 810, 38976, 2438, 49013, 1,
- 383, 61050, 1, 3914, 15057, 1, 364, 61189, 1, 932,
-12792, 1, 3536, 63814, 1, 1923, 60067, 1, 2906, 4244,
- 2, 1686, 30976, 2383, 15569, 1, 1587, 47449, 1, 2700,
-58473, 1, 922, 4403, 2, 1095, 1089, 1237, 56483, 1,
- 1053, 9036, 1, 2495, 41310, 1, 273, 61748, 1, 1820,
-22523, 2, 24, 13785, 2375, 14804, 2, 1229, 59424, 3576,
-46397, 1, 2617, 55736, 1, 2620, 52277, 1, 1721, 40287,
- 2, 854, 45805, 3194, 23340, 1, 2083, 18345, 1, 1614,
-35687, 1, 3303, 6915, 4, 636, 64979, 2193, 55180, 2540,
- 6033, 2855, 53089, 1, 1009, 15122, 3, 1343, 50818, 2251,
-40256, 3799, 54052, 2, 516, 16288, 1378, 25559, 2, 150,
- 4276, 1007, 44949, 2, 23, 63719, 2028, 62873, 1, 1819,
-31227, 1, 738, 15953, 2, 869, 61057, 1279, 33621, 1,
- 3374, 55600, 2, 453, 49225, 2711, 40417, 2, 2773, 44392,
- 4326, 5555, 2, 1934, 46289, 3480, 45, 1, 1363, 59128,
- 1, 2907, 11942, 1, 1866, 21556, 1, 218, 12718, 2,
- 489, 37296, 3838, 43919, 3, 362, 4767, 2046, 27877, 4569,
-61184, 2, 719, 56203, 4594, 61184, 2, 3918, 24893, 4619,
-61184, 1, 4644, 61184, 3, 1196, 32757, 3018, 53608, 4669,
-61184, 1, 4694, 61184, 3, 1590, 59233, 4317, 36838, 4719,
-61184, 2, 675, 13264, 981, 22156, 3, 404, 1515, 1391,
-26505, 1718, 41758, 1, 1176, 55205, 1, 97, 16928, 2,
- 2154, 63181, 3750, 17754, 1, 2903, 55088, 3, 2904, 63661,
- 3290, 29919, 4342, 1284, 1, 2, 46303, 1, 3830, 40322,
- 1, 1335, 17934, 2, 1262, 36416, 3025, 38499, 1, 784,
-27178, 2, 788, 27178, 3310, 23273, 1, 1844, 53066, 1,
- 539, 6688, 1, 432, 49439, 3, 85, 22351, 2067, 62572,
- 3584, 42915, 2, 1695, 59650, 3778, 13525, 1, 511, 47231,
- 3, 284, 49598, 1221, 51902, 2476, 51379, 1, 2126, 48268,
- 1, 165, 27361, 3, 17, 9911, 2884, 39141, 3111, 37955,
- 3, 1395, 3737, 1479, 48315, 1890, 65505, 1, 1621, 37404,
- 2, 1757, 57907, 2594, 20917, 1, 3613, 49321, 2, 1770,
-41462, 2016, 63697, 2, 352, 29281, 1091, 29875, 2, 296,
-52408, 3250, 36122, 2, 1771, 55858, 2090, 60188, 3, 2639,
-53820, 3168, 29538, 3513, 20955, 1, 2719, 31271, 3, 786,
-27178, 2439, 13341, 3599, 2275, 2, 790, 27178, 1704, 42444,
- 2, 1655, 17995, 1910, 53052, 2, 1386, 43602, 2530, 12496,
- 1, 4360, 38968, 3, 853, 45205, 1470, 53751, 3693, 45427,
- 2, 1936, 20093, 3670, 45471, 2, 2935, 38045, 3781, 803,
- 1, 2974, 22489, 3, 2760, 8615, 3706, 9335, 3912, 59418,
- 2, 2716, 51871, 3076, 6443, 3, 2560, 10321, 2718, 36643,
- 3079, 62501, 1, 640, 10307, 1, 1093, 44072, 1, 1970,
-12131, 3, 420, 52765, 1763, 13251, 3047, 64099, 2, 2312,
-20388, 3385, 27154, 1, 246, 19544, 1, 1908, 47068, 1,
- 3063, 21278, 1, 1929, 20085, 2, 1736, 35504, 1799, 38016,
- 1, 1189, 52146, 1, 1573, 26528, 1, 2781, 56075, 3,
- 73, 16808, 1302, 28321, 2388, 43356, 1, 881, 63913, 1,
- 3366, 18304, 2, 568, 47726, 4578, 3100, 2, 1906, 65509,
- 4603, 3100, 1, 4628, 3100, 4, 1459, 65125, 2017, 41987,
- 2465, 58793, 4653, 3100, 2, 1297, 25283, 4678, 3100, 2,
- 357, 13237, 4703, 3100, 3, 1672, 32983, 3159, 29606, 4728,
- 3100, 3, 698, 20914, 1730, 38716, 2298, 18374, 3, 347,
-57571, 1679, 4476, 1816, 14290, 2, 1487, 36728, 2354, 27170,
- 1, 1417, 46443, 1, 642, 52596, 2, 809, 43998, 3198,
-23343, 1, 1544, 33445, 1, 1451, 64325, 1, 309, 19773,
- 1, 2475, 56990, 2, 2115, 58398, 2156, 62719, 2, 100,
- 1686, 3846, 24994, 1, 2728, 17403, 3, 3369, 28535, 3476,
-42834, 3674, 61636, 2, 3682, 36320, 4743, 30283, 2, 646,
-62446, 2955, 55543, 2, 417, 54197, 2675, 53805, 1, 2865,
-32340, 2, 2830, 42752, 3936, 64965, 1, 3962, 64965, 4,
- 1324, 51003, 1351, 15771, 3468, 9702, 3988, 64965, 3, 787,
-36741, 2376, 18920, 4014, 64965, 3, 2098, 56963, 3128, 17244,
- 4040, 64965, 1, 4066, 64965, 1, 4092, 64965, 2, 1935,
-32163, 4118, 64965, 1, 460, 18233, 1, 3305, 65298, 1,
- 132, 41224, 1, 3688, 63308, 1, 1740, 52245, 1, 3905,
-27147, 1, 4139, 7284, 1, 4165, 7284, 2, 4191, 7284,
- 4374, 26403, 5, 480, 23382, 1567, 10044, 2303, 26611, 4217,
- 7284, 4399, 26403, 3, 2418, 30441, 4243, 7284, 4424, 26403,
- 3, 1948, 49054, 4269, 7284, 4449, 26403, 4, 2268, 3266,
- 2367, 31313, 4295, 7284, 4474, 26403, 1, 4499, 26403, 1,
- 4524, 26403, 1, 4549, 26403, 1, 3224, 51354, 1, 2192,
-18075, 2, 1170, 52299, 3119, 38609, 3, 282, 30908, 613,
-35753, 1080, 6490, 1, 2651, 17394, 2, 2324, 11548, 4337,
- 9968, 1, 3540, 13315, 2, 2664, 42294, 3793, 1457, 1,
- 1018, 35960, 2, 696, 64438, 3252, 52082, 1, 2229, 4335,
- 2, 2788, 31147, 2846, 17728, 1, 1015, 6091, 1, 515,
-18957, 1, 2381, 35625, 1, 366, 23318, 2, 2106, 4859,
- 2170, 6090, 1, 3903, 42849, 2, 177, 5789, 580, 57616,
- 1, 1646, 39174, 1, 1525, 31339, 2, 472, 998, 1998,
-28246, 2, 1231, 59183, 3665, 60563, 2, 1874, 4666, 1969,
-59916, 3, 1738, 11316, 1794, 23744, 2606, 52173, 2, 2511,
-42717, 3117, 40602, 2, 2657, 5447, 3067, 18212, 1, 1054,
-55599, 1, 2325, 28869, 1, 2412, 729, 1, 3312, 45682,
- 3, 2051, 64259, 3275, 19355, 3927, 4852, 2, 2124, 23045,
- 3953, 4852, 3, 1857, 34409, 3073, 4772, 3979, 4852, 1,
- 4005, 4852, 2, 1450, 31809, 4031, 4852, 3, 862, 36885,
- 3643, 35008, 4057, 4852, 1, 4083, 4852, 1, 4109, 4852,
- 2, 551, 48463, 1322, 11720, 2, 835, 19139, 2720, 17570,
- 2, 2181, 25363, 2706, 17551, 3, 1576, 26701, 2524, 59626,
- 4135, 29072, 2, 3003, 61654, 4161, 29072, 3, 228, 11459,
- 1635, 45990, 4187, 29072, 3, 1823, 32049, 2982, 50692, 4213,
-29072, 2, 1460, 28532, 4239, 29072, 1, 4265, 29072, 3,
- 2901, 55050, 3698, 28545, 4291, 29072, 1, 1241, 16611, 1,
- 1473, 62248, 1, 3141, 28607, 1, 2128, 56504, 1, 2745,
-17720, 1, 4389, 60918, 1, 4414, 60918, 4, 430, 60835,
- 1206, 55850, 3130, 37699, 4439, 60918, 2, 243, 42267, 4464,
-60918, 2, 747, 18788, 4489, 60918, 1, 4514, 60918, 2,
- 2937, 55036, 4539, 60918, 1, 4564, 60918, 1, 345, 28619,
- 4, 844, 34051, 2096, 18184, 2696, 50966, 3160, 54996, 1,
- 1219, 65372, 2, 704, 22428, 729, 27195, 1, 980, 42939,
- 1, 1960, 24156, 2, 1841, 34929, 3788, 11131, 1, 2056,
-30795, 2, 1023, 49258, 1381, 52017, 3, 725, 26652, 2220,
-64626, 3345, 43235, 1, 3453, 51457, 2, 553, 5400, 2485,
- 7437, 1, 154, 64626, 1, 3094, 8283, 1, 1659, 4704,
- 1, 3481, 10434, 1, 2844, 5616, 2, 1430, 20272, 3455,
-63270, 1, 1268, 42310, 2, 2166, 43816, 3254, 9806, 1,
- 626, 15049, 1, 2397, 40571, 1, 3766, 64549, 3, 57,
-26587, 94, 45178, 155, 63908, 2, 2294, 60879, 3728, 15367,
- 3, 54, 25656, 1958, 23018, 2726, 39060, 1, 1599, 29068,
- 2, 6, 59391, 3925, 55672, 2, 994, 35517, 3951, 55672,
- 3, 2464, 33961, 2860, 45068, 3977, 55672, 1, 4003, 55672,
- 3, 113, 31354, 2080, 2194, 4029, 55672, 2, 1895, 35328,
- 4055, 55672, 2, 497, 25021, 4081, 55672, 4, 3199, 10477,
- 3413, 20501, 3911, 64668, 4107, 55672, 1, 2616, 43725, 1,
- 3227, 40192, 1, 3457, 29566, 1, 1010, 23421, 2, 2896,
-24522, 3330, 57981, 1, 3719, 62596, 1, 4322, 40740, 2,
- 1461, 59275, 2669, 3105, 1, 2041, 62521, 1, 2480, 62607,
- 1, 1982, 17489, 1, 2204, 27516, 4, 188, 43003, 473,
-51618, 1810, 45477, 2179, 7602, 1, 604, 62223, 1, 3182,
-58496, 2, 464, 31537, 774, 64063, 2, 926, 19922, 1805,
-10811, 2, 238, 22594, 278, 23948, 1, 1792, 43025, 2,
- 1553, 31176, 4318, 26662, 1, 3313, 15004, 1, 1252, 37099,
- 2, 1898, 1100, 2551, 50931, 1, 1333, 39439, 1, 1571,
-11029, 3, 878, 36491, 1428, 22888, 3758, 55486, 1, 2659,
-13849, 1, 1990, 44757, 3, 3206, 48476, 3438, 3880, 4582,
-60836, 2, 257, 32233, 4607, 60836, 4, 1028, 1302, 3183,
-32014, 4580, 13728, 4632, 60836, 3, 2183, 31071, 4605, 13728,
- 4657, 60836, 5, 1591, 51390, 2734, 24152, 3238, 39063, 4630,
-13728, 4682, 60836, 2, 4655, 13728, 4707, 60836, 4, 414,
-53447, 781, 5000, 4680, 13728, 4732, 60836, 1, 4705, 13728,
- 2, 1945, 41262, 4730, 13728, 4, 16, 52539, 479, 54702,
- 644, 59975, 3193, 49315, 2, 1475, 65093, 3375, 9037, 4,
- 399, 46021, 2831, 8437, 3084, 57941, 3734, 55304, 1, 1931,
-34669, 2, 2434, 7880, 3332, 5094, 1, 68, 175, 1,
- 198, 27005, 2, 2942, 15447, 3372, 58789, 1, 2197, 55426,
- 2, 2174, 26297, 3807, 7633, 2, 1257, 39980, 1532, 21480,
- 4, 791, 57289, 1332, 1474, 1682, 45965, 2217, 9345, 3,
- 1723, 11105, 2821, 27933, 2853, 2093, 3, 43, 27621, 3798,
-47486, 3850, 33390, 2, 3612, 6036, 3700, 52041, 2, 80,
-24260, 1208, 44765, 2, 526, 22684, 3841, 39687, 2, 2101,
-31628, 3015, 48448, 1, 777, 62825, 1, 176, 35084, 1,
- 789, 55116, 2, 3827, 13184, 3876, 16959, 1, 1352, 45275,
- 1, 3681, 3744, 2, 3099, 20169, 3747, 11488, 2, 348,
-61388, 1776, 61025, 1, 1592, 16615, 1, 1561, 51326, 1,
- 4329, 59443, 1, 3074, 6834, 1, 1085, 52437, 1, 78,
-36106, 1, 621, 40150, 2, 1602, 42586, 4331, 58506, 1,
- 79, 24488, 1, 2110, 25566, 1, 3745, 6115, 1, 943,
-32283, 1, 1040, 13266, 1, 1625, 61175, 2, 589, 65534,
- 2833, 55405, 1, 1408, 28357, 2, 478, 60018, 2827, 24195,
- 2, 1161, 65310, 4363, 60808, 2, 834, 31658, 1920, 21856,
- 3, 2509, 37355, 2681, 3214, 4142, 50172, 2, 48, 60808,
- 4168, 50172, 3, 673, 15085, 2602, 36351, 4194, 50172, 3,
- 2414, 13492, 2759, 32181, 4220, 50172, 1, 4246, 50172, 2,
- 1808, 54846, 4272, 50172, 2, 1893, 61478, 4298, 50172, 1,
- 2795, 30805, 1, 1595, 61432, 1, 762, 49302, 2, 907,
-59459, 3078, 3325, 1, 603, 62231, 1, 2237, 9064, 1,
- 1519, 44223, 2, 142, 49255, 552, 6251, 2, 1328, 26821,
- 2342, 20087, 1, 2212, 16575, 2, 3768, 1430, 3819, 411,
- 3, 13, 57660, 1144, 57838, 3486, 8105, 1, 3410, 25582,
- 1, 1482, 63800, 2, 268, 64728, 2555, 60876, 1, 3695,
-10542, 2, 2908, 13568, 3610, 6135, 2, 857, 42151, 3437,
-55601, 1, 956, 58539, 1, 2025, 8092, 1, 392, 18430,
- 1, 1530, 11343, 1, 457, 11988, 2, 763, 49302, 2131,
-47401, 1, 547, 37451, 1, 983, 26558, 2, 618, 38885,
- 972, 58177, 1, 1933, 16423, 1, 1883, 36825, 1, 1728,
- 1062, 2, 3379, 57949, 4145, 38764, 3, 837, 17890, 1194,
- 6398, 4171, 38764, 1, 4197, 38764, 6, 53, 26455, 1205,
-38217, 1729, 39122, 3501, 40942, 3654, 57750, 4223, 38764, 1,
- 4249, 38764, 2, 1513, 4048, 4275, 38764, 2, 1543, 9729,
- 4301, 38764, 3, 1107, 41572, 1444, 34190, 4572, 7917, 1,
- 4597, 7917, 2, 3898, 36135, 4622, 7917, 2, 3072, 17234,
- 4647, 7917, 4, 306, 36444, 648, 16610, 1803, 6420, 4672,
- 7917, 4, 709, 48056, 1806, 3362, 3234, 19045, 4697, 7917,
- 1, 4722, 7917, 2, 271, 29701, 3756, 27087, 1, 2622,
-49557, 1, 456, 17896, 1, 3832, 26703, 1, 508, 47018,
- 1, 3469, 31596, 1, 3404, 52352, 1, 3894, 64092, 2,
- 2672, 11534, 2714, 43291, 2, 175, 12513, 3919, 7212, 1,
- 3470, 64240, 1, 311, 59172, 1, 677, 45227, 1, 2058,
-55543, 3, 2022, 46038, 3121, 50731, 3460, 19208, 2, 1873,
- 622, 2822, 46988, 2, 353, 16232, 1849, 64423, 2, 800,
-44392, 3567, 5275, 2, 645, 47045, 2421, 45414, 2, 875,
-55222, 880, 21013, 1, 1754, 5848, 2, 1029, 27280, 2739,
-39677, 1, 1253, 12991, 1, 71, 4988, 2, 2305, 65362,
- 2886, 44622, 2, 564, 10615, 1415, 14601, 1, 2374, 27846,
- 1, 1466, 58506, 1, 1760, 23081, 1, 2521, 61438, 1,
- 84, 36249, 4, 108, 59717, 1476, 58589, 2698, 64582, 3195,
-23340, 1, 634, 43560, 1, 3133, 54198, 1, 1583, 19933,
- 3, 1550, 53755, 3081, 30822, 3580, 535, 1, 544, 16900,
- 2, 699, 4512, 2038, 57860, 2, 178, 5986, 3620, 23999,
- 1, 2301, 12837, 1, 1940, 49970, 2, 628, 1140, 3108,
-28019, 1, 1834, 44625, 2, 2927, 7885, 3426, 54010, 1,
- 2405, 58703, 1, 2490, 45704, 1, 2177, 11209, 1, 1494,
-30780, 1, 1946, 52507, 1, 658, 18283, 3, 492, 18862,
- 947, 16776, 2285, 38215, 3, 687, 59921, 1872, 14696, 2610,
-42866, 1, 283, 64742, 1, 3668, 780, 2, 2641, 55178,
- 4366, 7276, 4, 110, 40205, 1698, 16758, 2568, 61555, 4391,
- 7276, 3, 708, 7829, 3212, 11696, 4416, 7276, 1, 4441,
- 7276, 1, 4466, 7276, 1, 4491, 7276, 2, 3869, 33796,
- 4516, 7276, 1, 4541, 7276, 2, 710, 44158, 2746, 5490,
- 1, 1454, 6904, 2, 90, 41933, 250, 44713, 2, 570,
-12175, 860, 42920, 2, 801, 63355, 1403, 9183, 1, 1865,
-20058, 1, 1884, 52675, 2, 1019, 49337, 3727, 36661, 1,
- 1855, 18019, 2, 1624, 50063, 2352, 39761, 1, 195, 37349,
- 2, 1800, 57327, 1966, 5877, 1, 2009, 20522, 2, 627,
-40693, 3533, 46354, 1, 2474, 63403, 2, 3235, 48530, 3403,
-46473, 1, 0, 7644, 2, 1716, 3207, 1836, 25034, 3,
- 1350, 60379, 1421, 1549, 1699, 17276, 4, 1340, 33519, 1593,
-42321, 3422, 2900, 4587, 19477, 2, 2987, 20001, 4612, 19477,
- 2, 1783, 44422, 4637, 19477, 3, 2504, 26159, 2805, 47425,
- 4662, 19477, 2, 703, 15833, 4687, 19477, 1, 4712, 19477,
- 1, 4737, 19477, 1, 463, 25647, 1, 4566, 43531, 1,
- 4591, 43531, 1, 4616, 43531, 2, 957, 38259, 4641, 43531,
- 2, 475, 14563, 4666, 43531, 2, 1227, 47174, 4691, 43531,
- 2, 1846, 51519, 4716, 43531, 2, 443, 566, 3371, 14509,
- 1, 3583, 26647, 3, 517, 35819, 967, 46840, 2730, 2935,
- 3, 1259, 35606, 1643, 54555, 3190, 61208, 1, 1304, 62771,
- 5, 135, 17129, 247, 47768, 330, 19697, 373, 55050, 987,
- 5079, 2, 924, 60229, 2231, 26786, 1, 2958, 9911, 1,
- 1148, 33108, 3, 689, 9387, 3529, 7993, 3822, 26112, 2,
- 2950, 27341, 3383, 33841, 3, 156, 53073, 2794, 21033, 3609,
- 6194, 2, 614, 24074, 3888, 40674, 2, 2733, 18922, 3796,
-16310, 1, 3762, 24843, 1, 1892, 10913, 1, 3397, 38989,
- 3, 574, 27824, 2768, 14947, 2792, 44312, 3, 701, 40146,
- 2404, 9678, 2909, 64474, 1, 42, 24074, 2, 412, 32566,
- 2600, 8269, 3, 1574, 21282, 3225, 53760, 4747, 26805, 1,
- 1603, 41117, 1, 647, 32733, 1, 485, 61418, 1, 1773,
-29620, 1, 2122, 26927, 1, 1111, 13636, 3, 1937, 57413,
- 3616, 8404, 3757, 37244, 3, 431, 37813, 1008, 28955, 3308,
-24389, 1, 720, 8994, 1, 776, 4843, 2, 1779, 57942,
- 1965, 21275, 1, 1651, 57245, 1, 1563, 1041, 1, 3087,
-38438, 1, 256, 2928, 1, 711, 58359, 1, 2379, 49169,
- 2, 1245, 46678, 2569, 63238, 1, 1058, 29764, 1, 4585,
-35274, 1, 4610, 35274, 1, 4635, 35274, 2, 2825, 1727,
- 4660, 35274, 1, 4685, 35274, 2, 1522, 49889, 4710, 35274,
- 1, 4735, 35274, 2, 1537, 3087, 3358, 56148, 1, 1411,
-47683, 1, 236, 7144, 1, 1309, 63534,
+const unsigned short DictKeyHashTable[] = {
+ 4096, 4097, 4100, 4096, 4103, 4096, 4106, 4096, 4109, 4112,
+ 4115, 4118, 4121, 4096, 4096, 4096, 4124, 4127, 4130, 4133,
+ 4136, 4141, 4144, 4096, 4147, 4096, 4096, 4152, 4155, 4158,
+ 4096, 4163, 4166, 4171, 4096, 4174, 4096, 4177, 4096, 4180,
+ 4185, 4190, 4193, 4096, 4198, 4096, 4096, 4201, 4096, 4208,
+ 4213, 4096, 4220, 4223, 4228, 4233, 4096, 4236, 4096, 4239,
+ 4242, 4096, 4096, 4245, 4096, 4096, 4248, 4251, 4254, 4259,
+ 4096, 4262, 4267, 4270, 4275, 4096, 4278, 4283, 4286, 4096,
+ 4096, 4096, 4096, 4096, 4096, 4293, 4096, 4296, 4307, 4096,
+ 4096, 4310, 4315, 4096, 4096, 4318, 4096, 4321, 4096, 4326,
+ 4096, 4329, 4332, 4335, 4096, 4338, 4341, 4350, 4355, 4358,
+ 4365, 4370, 4377, 4382, 4389, 4392, 4399, 4402, 4407, 4410,
+ 4413, 4420, 4423, 4430, 4435, 4444, 4451, 4454, 4457, 4096,
+ 4096, 4462, 4096, 4469, 4472, 4477, 4482, 4096, 4096, 4096,
+ 4096, 4096, 4485, 4492, 4096, 4096, 4495, 4504, 4507, 4096,
+ 4096, 4512, 4515, 4520, 4527, 4532, 4535, 4096, 4542, 4096,
+ 4545, 4550, 4557, 4560, 4563, 4096, 4096, 4096, 4568, 4096,
+ 4096, 4096, 4571, 4580, 4096, 4583, 4586, 4096, 4591, 4596,
+ 4096, 4096, 4096, 4599, 4096, 4096, 4096, 4604, 4607, 4096,
+ 4096, 4616, 4096, 4619, 4622, 4625, 4630, 4096, 4096, 4096,
+ 4633, 4636, 4639, 4642, 4647, 4650, 4659, 4096, 4664, 4096,
+ 4096, 4667, 4096, 4096, 4670, 4673, 4096, 4676, 4096, 4096,
+ 4681, 4684, 4096, 4096, 4689, 4694, 4699, 4702, 4711, 4718,
+ 4725, 4732, 4737, 4744, 4749, 4754, 4096, 4096, 4761, 4768,
+ 4096, 4771, 4776, 4096, 4779, 4096, 4782, 4787, 4792, 4799,
+ 4806, 4811, 4820, 4827, 4836, 4096, 4096, 4096, 4841, 4848,
+ 4096, 4851, 4856, 4859, 4096, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 4862, 4096, 4096, 4865, 4868, 4875, 4882, 4885,
+ 4888, 4096, 4893, 4096, 4096, 4896, 4096, 4899, 4902, 4905,
+ 4096, 4096, 4908, 4913, 4922, 4925, 4930, 4935, 4940, 4947,
+ 4956, 4961, 4964, 4969, 4972, 4096, 4975, 4978, 4096, 4981,
+ 4984, 4991, 4994, 4096, 4999, 5002, 5005, 5010, 5015, 5022,
+ 5027, 5032, 5039, 5046, 5057, 5062, 5069, 4096, 4096, 4096,
+ 5074, 5077, 5080, 5085, 5088, 4096, 5091, 5096, 4096, 5099,
+ 4096, 5102, 5105, 5108, 4096, 5115, 4096, 4096, 4096, 4096,
+ 5118, 4096, 5125, 5128, 5135, 5138, 5143, 5146, 4096, 5151,
+ 5154, 4096, 5157, 5160, 5163, 4096, 5170, 5175, 5180, 5183,
+ 5186, 5191, 5198, 4096, 5201, 4096, 5204, 5207, 4096, 5210,
+ 5213, 5220, 4096, 5223, 4096, 5228, 4096, 4096, 5231, 5236,
+ 4096, 5239, 5242, 4096, 5249, 4096, 5252, 5257, 4096, 5260,
+ 5263, 5268, 4096, 5273, 5278, 5281, 5284, 5287, 5292, 4096,
+ 5295, 5302, 4096, 5305, 4096, 4096, 5314, 5317, 5322, 5327,
+ 5334, 5337, 5342, 5351, 5354, 5357, 5360, 5363, 5366, 5371,
+ 5374, 5379, 5384, 4096, 5387, 4096, 5390, 5393, 4096, 5396,
+ 4096, 5399, 5404, 4096, 5407, 4096, 5412, 5417, 4096, 5422,
+ 5425, 5430, 5435, 4096, 4096, 5442, 5445, 5450, 5455, 5462,
+ 5465, 5470, 5475, 5478, 4096, 5481, 4096, 5484, 5491, 5494,
+ 4096, 4096, 4096, 4096, 4096, 4096, 5497, 4096, 5500, 5503,
+ 5510, 5517, 5524, 5529, 5532, 4096, 5539, 4096, 4096, 5542,
+ 5545, 4096, 4096, 5548, 5551, 5556, 5559, 4096, 4096, 5562,
+ 4096, 5565, 4096, 5570, 5575, 5578, 4096, 5581, 5586, 5591,
+ 4096, 5596, 5601, 4096, 5604, 5609, 4096, 5614, 5617, 4096,
+ 5620, 5623, 5628, 5633, 5638, 5643, 5650, 5655, 5662, 5669,
+ 5674, 5681, 5686, 5695, 5700, 5705, 5708, 5711, 4096, 4096,
+ 5714, 5723, 5728, 5731, 5736, 5739, 4096, 5744, 5747, 5750,
+ 5753, 4096, 5756, 5759, 5762, 5769, 5778, 5785, 5790, 5793,
+ 5798, 5801, 4096, 5808, 5813, 5818, 5821, 5824, 5829, 5834,
+ 5837, 5840, 5849, 5856, 5863, 5868, 4096, 5871, 4096, 4096,
+ 5876, 5879, 4096, 5882, 4096, 5889, 5892, 5895, 4096, 5898,
+ 5901, 5904, 5909, 4096, 5912, 5915, 5918, 5921, 4096, 5926,
+ 4096, 4096, 5929, 4096, 4096, 5934, 4096, 5937, 5940, 5943,
+ 5946, 5949, 5952, 4096, 5955, 5960, 4096, 4096, 4096, 4096,
+ 5967, 4096, 5974, 4096, 5977, 5982, 5985, 4096, 5988, 5995,
+ 6000, 6003, 6008, 6013, 6018, 6021, 6028, 4096, 4096, 6033,
+ 6036, 6039, 4096, 6042, 6045, 4096, 6050, 4096, 4096, 6053,
+ 4096, 4096, 6058, 6063, 4096, 6066, 6071, 4096, 6076, 4096,
+ 6081, 6084, 6089, 4096, 6096, 6099, 4096, 6102, 6107, 6112,
+ 6115, 4096, 6118, 4096, 6121, 6124, 6131, 6134, 4096, 4096,
+ 6137, 4096, 4096, 6140, 6143, 4096, 6146, 6153, 6156, 6159,
+ 6164, 4096, 6167, 6172, 6175, 6178, 6183, 6186, 4096, 4096,
+ 6189, 6194, 6197, 6200, 6205, 6208, 4096, 4096, 6213, 4096,
+ 6218, 6221, 4096, 6224, 4096, 6229, 4096, 4096, 6234, 4096,
+ 6239, 6244, 4096, 6247, 4096, 4096, 4096, 6252, 4096, 6255,
+ 6260, 4096, 4096, 6263, 6266, 6273, 6276, 6291, 6294, 6299,
+ 6304, 6315, 6320, 6325, 6328, 6333, 6340, 4096, 6345, 6350,
+ 6353, 4096, 6356, 4096, 4096, 4096, 6359, 6362, 6365, 4096,
+ 6368, 6373, 6376, 6381, 6386, 6393, 4096, 4096, 6398, 4096,
+ 4096, 6403, 4096, 4096, 4096, 4096, 6406, 4096, 6413, 6420,
+ 4096, 4096, 4096, 6423, 4096, 6428, 6433, 6440, 6443, 6448,
+ 6451, 6454, 4096, 6459, 6462, 6467, 6470, 6477, 4096, 4096,
+ 6480, 6487, 6492, 4096, 4096, 4096, 4096, 6495, 4096, 4096,
+ 6498, 6501, 4096, 4096, 4096, 4096, 6504, 4096, 4096, 4096,
+ 6507, 6510, 6515, 4096, 4096, 6518, 4096, 6521, 6526, 6531,
+ 6534, 6537, 6540, 6543, 6548, 6551, 6554, 6557, 6560, 6563,
+ 6568, 6573, 6578, 6581, 4096, 6584, 6587, 6594, 6597, 4096,
+ 6600, 6603, 6608, 4096, 4096, 6611, 4096, 4096, 4096, 4096,
+ 6618, 6623, 4096, 4096, 6628, 4096, 4096, 6631, 4096, 4096,
+ 6634, 6639, 6644, 4096, 6647, 6652, 6655, 6660, 6671, 6674,
+ 6679, 6682, 4096, 6685, 4096, 4096, 6688, 4096, 4096, 4096,
+ 6693, 6696, 4096, 4096, 6703, 6706, 6709, 6712, 6715, 6720,
+ 6723, 4096, 4096, 6726, 4096, 6729, 6732, 6737, 4096, 6740,
+ 4096, 6745, 6750, 4096, 6755, 4096, 6762, 4096, 4096, 6767,
+ 4096, 4096, 4096, 4096, 6774, 6777, 6780, 4096, 6783, 6786,
+ 4096, 6791, 6794, 6803, 4096, 6806, 6809, 4096, 6812, 6819,
+ 6822, 4096, 6825, 6830, 6835, 6838, 6845, 6850, 6855, 6864,
+ 6867, 6870, 6875, 6882, 6889, 6892, 6899, 4096, 6902, 6905,
+ 6908, 6915, 6920, 4096, 4096, 6927, 6930, 6935, 6940, 6945,
+ 6950, 6953, 6962, 4096, 4096, 6967, 4096, 6970, 4096, 6973,
+ 6976, 6979, 6982, 4096, 6985, 6988, 6995, 6998, 7001, 4096,
+ 7004, 7009, 7012, 7015, 7018, 4096, 7025, 7032, 7041, 7044,
+ 7047, 7050, 7053, 7056, 7061, 7068, 7073, 7080, 7085, 7088,
+ 4096, 7091, 7102, 7105, 4096, 7108, 7111, 7116, 7119, 7122,
+ 7127, 7132, 7135, 7138, 7141, 4096, 7144, 7149, 7152, 7155,
+ 7160, 7167, 7170, 4096, 7173, 7178, 7183, 4096, 4096, 7186,
+ 7191, 7194, 4096, 7201, 7206, 7209, 4096, 4096, 4096, 7216,
+ 4096, 4096, 4096, 4096, 7221, 7224, 4096, 7229, 7240, 4096,
+ 4096, 7245, 4096, 4096, 4096, 4096, 7250, 7259, 7266, 7271,
+ 7278, 7283, 7288, 7291, 4096, 4096, 7296, 7299, 7302, 7305,
+ 7308, 7311, 4096, 4096, 4096, 7314, 7317, 7320, 4096, 7325,
+ 4096, 4096, 7330, 4096, 7333, 7338, 7341, 7344, 7347, 4096,
+ 4096, 7350, 4096, 7359, 7364, 7367, 7370, 4096, 7375, 7378,
+ 4096, 4096, 4096, 4096, 7381, 4096, 7384, 7387, 7394, 4096,
+ 7397, 7408, 7413, 7420, 7423, 7426, 7431, 7436, 7439, 7442,
+ 7447, 7450, 7453, 4096, 7456, 7465, 7468, 7471, 7474, 7477,
+ 7482, 7485, 7490, 4096, 7493, 4096, 4096, 4096, 7496, 7499,
+ 7502, 4096, 7511, 7516, 4096, 7523, 7530, 7537, 7542, 7551,
+ 7554, 7557, 4096, 7562, 7569, 7572, 4096, 7577, 7580, 4096,
+ 7583, 4096, 7590, 7597, 7600, 7607, 4096, 7610, 4096, 7615,
+ 4096, 4096, 7618, 7621, 4096, 7626, 7629, 7632, 4096, 7635,
+ 7640, 4096, 4096, 4096, 7643, 7646, 7649, 4096, 7652, 4096,
+ 7655, 4096, 7658, 7663, 7666, 7669, 4096, 7674, 4096, 7677,
+ 4096, 4096, 4096, 7684, 7689, 7692, 7695, 4096, 7698, 7701,
+ 7706, 7711, 7716, 7723, 7728, 7733, 7742, 7747, 7754, 7759,
+ 7768, 4096, 4096, 4096, 7775, 7780, 7787, 7794, 7799, 7812,
+ 7817, 7822, 4096, 4096, 7825, 7830, 7833, 7836, 7839, 7842,
+ 7845, 4096, 4096, 4096, 7848, 7851, 7854, 7857, 4096, 7860,
+ 4096, 7863, 7870, 7873, 4096, 4096, 4096, 7878, 7881, 4096,
+ 7888, 7895, 7898, 7901, 7908, 7915, 4096, 4096, 4096, 7918,
+ 7921, 4096, 4096, 4096, 7926, 7931, 7934, 7939, 7942, 4096,
+ 4096, 7945, 7948, 7951, 4096, 7954, 7957, 4096, 4096, 7962,
+ 7965, 7968, 7977, 7984, 7989, 7994, 7999, 8002, 8013, 4096,
+ 4096, 8018, 8021, 8024, 8027, 8030, 8033, 8036, 4096, 8041,
+ 8046, 8049, 4096, 8056, 4096, 8061, 8064, 8069, 8072, 8079,
+ 8084, 8091, 8094, 8099, 8104, 8109, 8114, 8119, 4096, 4096,
+ 8122, 4096, 8129, 8132, 8135, 8138, 8143, 8150, 8155, 4096,
+ 4096, 4096, 4096, 8158, 8161, 4096, 8164, 4096, 4096, 8167,
+ 8174, 8181, 4096, 4096, 8184, 8187, 8190, 8193, 8198, 4096,
+ 4096, 8205, 8208, 8213, 8216, 4096, 8221, 4096, 8224, 8229,
+ 8232, 4096, 8235, 8238, 8243, 8246, 8249, 8256, 4096, 8261,
+ 8264, 4096, 8267, 8272, 8277, 8282, 8285, 4096, 8290, 8293,
+ 8296, 4096, 8299, 8302, 8307, 8312, 8315, 8318, 4096, 8321,
+ 8324, 8327, 8332, 8335, 4096, 8338, 4096, 8345, 8348, 4096,
+ 8351, 8360, 8365, 8368, 8375, 8380, 8383, 4096, 8388, 8391,
+ 8396, 8399, 4096, 4096, 8404, 8409, 8412, 4096, 8415, 8420,
+ 4096, 4096, 8423, 8428, 8431, 8440, 8445, 8448, 8451, 8454,
+ 4096, 8457, 8462, 8465, 4096, 8470, 8475, 4096, 8478, 8481,
+ 8484, 8487, 8490, 8493, 8496, 8501, 8508, 8511, 8516, 4096,
+ 8519, 4096, 8522, 8525, 4096, 4096, 4096, 4096, 8528, 8531,
+ 8536, 8539, 4096, 8542, 8547, 8550, 8555, 8560, 4096, 8567,
+ 8570, 4096, 4096, 8573, 4096, 8576, 4096, 8583, 8590, 8597,
+ 8600, 8605, 8608, 8613, 8622, 8625, 8634, 8639, 8648, 8651,
+ 8662, 8669, 8674, 8677, 8682, 8685, 8688, 8691, 4096, 8694,
+ 4096, 4096, 8697, 4096, 8700, 8707, 8712, 8717, 8720, 8723,
+ 8726, 8729, 8732, 8735, 4096, 8744, 8747, 4096, 4096, 8750,
+ 8753, 4096, 4096, 8756, 8761, 8766, 4096, 8769, 8772, 8779,
+ 8786, 8789, 4096, 4096, 4096, 8792, 4096, 8795, 8798, 8803,
+ 8808, 8815, 4096, 4096, 8822, 8829, 8832, 8835, 4096, 8838,
+ 8841, 8846, 8853, 8860, 8863, 8866, 8873, 4096, 8876, 4096,
+ 8879, 4096, 8882, 4096, 8885, 8890, 8895, 8898, 4096, 8901,
+ 8908, 8913, 8916, 8921, 8930, 8933, 8938, 8943, 8954, 8957,
+ 8966, 4096, 4096, 8971, 4096, 8974, 8983, 4096, 8990, 8993,
+ 8998, 9001, 9004, 4096, 9009, 9012, 9017, 9020, 9023, 9026,
+ 4096, 9029, 9034, 9041, 4096, 4096, 9044, 9047, 9050, 9053,
+ 9056, 4096, 9059, 9062, 9065, 9068, 4096, 9071, 9074, 4096,
+ 9077, 9080, 4096, 4096, 9083, 9086, 9091, 9094, 9099, 9102,
+ 9105, 9108, 9111, 9116, 4096, 4096, 9121, 4096, 9124, 9127,
+ 9130, 9133, 4096, 4096, 9136, 9145, 9148, 9151, 9154, 9159,
+ 9162, 9167, 9172, 4096, 9175, 4096, 9178, 9181, 9184, 9187,
+ 9194, 9203, 9206, 4096, 4096, 4096, 9211, 9214, 4096, 9219,
+ 9222, 9227, 9230, 9233, 9236, 9243, 9246, 9249, 9252, 9255,
+ 4096, 9258, 4096, 4096, 9261, 9264, 4096, 9267, 9270, 9275,
+ 9278, 9281, 9286, 9289, 9292, 9301, 9304, 4096, 4096, 9307,
+ 9310, 9313, 9316, 9321, 9326, 9329, 9340, 9345, 4096, 9350,
+ 9353, 9356, 9363, 9366, 9373, 9378, 9381, 4096, 4096, 4096,
+ 4096, 9384, 9387, 9394, 9399, 9402, 4096, 9407, 9412, 9415,
+ 9418, 9423, 9426, 9429, 9434, 9437, 9442, 4096, 9447, 4096,
+ 9450, 4096, 9453, 4096, 9458, 9461, 4096, 9466, 9469, 9474,
+ 9479, 4096, 9484, 4096, 9489, 4096, 9494, 9499, 4096, 9506,
+ 9509, 9512, 4096, 4096, 9517, 9520, 9523, 9532, 9535, 9540,
+ 9543, 9546, 4096, 9549, 9554, 9559, 9564, 9567, 9576, 9581,
+ 9590, 9597, 9606, 9613, 9620, 9625, 9628, 9631, 9636, 9639,
+ 9642, 9647, 9652, 9659, 9668, 9677, 9682, 9689, 9692, 9699,
+ 4096, 9702, 9707, 4096, 9710, 4096, 4096, 4096, 9715, 4096,
+ 4096, 9722, 4096, 9725, 9734, 9739, 4096, 9746, 4096, 9749,
+ 4096, 9754, 9761, 4096, 4096, 9766, 9769, 9772, 9777, 9780,
+ 9783, 9786, 9793, 9796, 4096, 4096, 9801, 9804, 9809, 4096,
+ 9812, 4096, 9815, 9818, 9825, 9828, 9831, 9834, 9839, 9842,
+ 9845, 4096, 9848, 9853, 9856, 4096, 4096, 9863, 4096, 4096,
+ 4096, 9870, 9873, 9878, 4096, 9881, 4096, 4096, 4096, 9886,
+ 4096, 4096, 9889, 4096, 4096, 4096, 9892, 9895, 9898, 9901,
+ 9904, 4096, 4096, 9907, 4096, 4096, 4096, 9912, 4096, 9915,
+ 9918, 4096, 9921, 9928, 9933, 9940, 9945, 9954, 9961, 9964,
+ 9969, 9972, 9979, 4096, 9982, 9985, 9990, 4096, 4096, 9993,
+10002, 10005, 10008, 10011, 10014, 10019, 10028, 10031, 10036, 10039,
+10044, 10047, 10050, 10055, 4096, 4096, 10058, 4096, 4096, 4096,
+ 4096, 4096, 10063, 10068, 10071, 10074, 10077, 4096, 10080, 10085,
+ 4096, 10088, 10091, 4096, 4096, 4096, 4096, 4096, 10098, 4096,
+ 4096, 10101, 10104, 10107, 10112, 10115, 10120, 10125, 10128, 4096,
+10131, 4096, 4096, 10134, 10137, 10140, 4096, 10143, 10146, 10157,
+10160, 10165, 10170, 10175, 10180, 10187, 10192, 10199, 10202, 10205,
+10210, 10221, 10224, 10229, 4096, 10232, 4096, 4096, 10235, 4096,
+10238, 10241, 10246, 10253, 10260, 10263, 10266, 10269, 10278, 10281,
+ 4096, 4096, 10286, 4096, 4096, 10289, 10292, 10295, 10300, 10303,
+10306, 10311, 4096, 4096, 4096, 10316, 10319, 10322, 10325, 4096,
+ 4096, 4096, 4096, 10332, 10337, 4096, 10344, 10349, 10354, 10359,
+ 4096, 10364, 10367, 4096, 10374, 10377, 10380, 4096, 10387, 10394,
+10397, 10400, 10407, 10410, 10413, 10420, 10427, 4096, 4096, 10430,
+10435, 10442, 4096, 10447, 10450, 10455, 10458, 10465, 4096, 10470,
+10477, 10480, 10483, 4096, 4096, 10486, 10489, 10494, 10497, 10500,
+ 4096, 10507, 10510, 10513, 10516, 10521, 4096, 10528, 10531, 4096,
+10534, 10537, 10544, 10547, 10554, 10557, 10562, 10565, 10570, 10573,
+10580, 4096, 4096, 10583, 10586, 10589, 10596, 4096, 4096, 10599,
+10604, 10611, 4096, 10614, 10619, 10622, 10627, 4096, 10634, 10637,
+ 4096, 10640, 10643, 10648, 10653, 10660, 10663, 10666, 10669, 10676,
+ 4096, 10681, 10688, 10691, 4096, 10694, 10697, 4096, 10702, 10707,
+10712, 4096, 4096, 10717, 4096, 10720, 4096, 10725, 10728, 4096,
+10731, 10734, 10739, 10742, 10749, 10754, 10761, 4096, 10766, 4096,
+10769, 4096, 10776, 10779, 4096, 4096, 4096, 10782, 10789, 4096,
+ 4096, 10792, 10797, 10800, 4096, 10803, 10808, 4096, 10811, 4096,
+ 4096, 4096, 4096, 10814, 10817, 10820, 10823, 10826, 10829, 10832,
+ 4096, 10835, 10838, 10841, 4096, 10848, 4096, 10851, 10854, 10859,
+10864, 10867, 10872, 10875, 10880, 10883, 4096, 10892, 4096, 10897,
+ 4096, 4096, 10900, 10905, 4096, 10908, 10915, 10918, 10923, 4096,
+10930, 4096, 4096, 10933, 4096, 10936, 10947, 10952, 10959, 4096,
+10964, 4096, 4096, 10967, 4096, 10970, 10975, 10978, 4096, 10981,
+ 4096, 10984, 4096, 10987, 10992, 10995, 11000, 4096, 11005, 11008,
+11011, 11014, 11023, 11026, 11029, 11034, 11037, 11044, 11053, 11056,
+11063, 11068, 11071, 11076, 11079, 4096, 4096, 4096, 11082, 4096,
+11085, 11088, 4096, 11093, 4096, 11098, 11101, 4096, 4096, 4096,
+11108, 4096, 11111, 11116, 4096, 11121, 4096, 11126, 4096, 11129,
+11134, 4096, 11137, 11140, 11145, 11158, 11163, 11168, 11175, 11180,
+11183, 11192, 11197, 11200, 11205, 11210, 11213, 4096, 11216, 11225,
+11228, 11233, 11236, 11239, 11244, 11247, 11250, 11255, 11258, 11263,
+11268, 11273, 11276, 11281, 11284, 4096, 11289, 4096, 4096, 11294,
+11299, 11302, 4096, 11307, 11310, 4096, 11313, 11318, 11321, 4096,
+11324, 11331, 11338, 11343, 11348, 11355, 11364, 11371, 11376, 11383,
+11386, 11389, 11394, 4096, 11397, 4096, 11400, 11403, 11406, 11409,
+11418, 11425, 11428, 11433, 11436, 11439, 4096, 11444, 11449, 11452,
+ 4096, 11455, 11458, 11463, 11466, 11471, 11474, 11481, 11484, 11489,
+11494, 11499, 11504, 11507, 11514, 11519, 11522, 11529, 11532, 11537,
+ 4096, 11542, 11549, 11552, 11559, 11562, 11567, 11574, 11581, 4096,
+11586, 4096, 11589, 11598, 11603, 11606, 11609, 11612, 11617, 11622,
+ 4096, 4096, 11627, 11630, 11633, 11636, 11645, 11648, 11651, 11662,
+11667, 11670, 4096, 11675, 11678, 4096, 11683, 4096, 11688, 4096,
+11693, 11696, 4096, 11701, 4096, 11704, 4096, 4096, 11709, 11714,
+11717, 4096, 11722, 11725, 4096, 11730, 11733, 11740, 11743, 4096,
+11746, 11749, 4096, 4096, 11754, 4096, 4096, 11759, 11762, 11765,
+11772, 11781, 11784, 11787, 11794, 11797, 11806, 11809, 11814, 11819,
+11822, 11825, 11828, 4096, 4096, 11833, 4096, 11836, 11845, 4096,
+ 4096, 4096, 11850, 11855, 4096, 4096, 11858, 11861, 11864, 11867,
+ 4096, 4096, 11870, 11875, 11878, 4096, 11885, 11892, 4096, 11897,
+11902, 4096, 4096, 4096, 11905, 11914, 4096, 4096, 4096, 11921,
+ 4096, 11926, 4096, 11929, 11932, 11935, 4096, 11938, 4096, 4096,
+11941, 11944, 11947, 4096, 11952, 4096, 11957, 4096, 11960, 4096,
+ 4096, 4096, 4096, 11963, 11968, 11971, 4096, 4096, 11974, 11977,
+11980, 4096, 4096, 11983, 11986, 4096, 11991, 4096, 4096, 11994,
+ 4096, 11999, 4096, 12004, 12007, 12012, 12017, 12024, 12027, 12030,
+12035, 12038, 4096, 12043, 12046, 4096, 4096, 4096, 12049, 4096,
+12056, 4096, 4096, 4096, 4096, 4096, 12067, 12076, 12079, 4096,
+12084, 12087, 12090, 4096, 4096, 4096, 12093, 12098, 12103, 12106,
+12109, 12112, 12117, 4096, 4096, 4096, 12122, 4096, 12125, 12130,
+12133, 12136, 4096, 4096, 4096, 4096, 12139, 12142, 4096, 12145,
+12148, 4096, 4096, 12155, 12162, 12167, 4096, 12172, 4096, 4096,
+12175, 12180, 4096, 4096, 4096, 12183, 12186, 12189, 12194, 12197,
+12200, 12203, 12206, 12209, 4096, 4096, 12212, 12215, 4096, 4096,
+12218, 12225, 12228, 4096, 4096, 4096, 4096, 12233, 12238, 4096,
+12241, 12244, 12249, 12252, 12261, 12268, 12271, 4096, 4096, 12278,
+ 4096, 12283, 4096, 12286, 12289, 4096, 12294, 4096, 12299, 4096,
+12302, 4096, 4096, 4096, 12307, 12310, 4096, 12315, 12318, 12325,
+12330, 12333, 12340, 4096, 4096, 12347, 12352, 12355, 12362, 12367,
+12372, 12375, 12378, 12383, 12388, 12391, 4096, 12394, 12399, 12402,
+ 4096, 12405, 12410, 4096, 12413, 4096, 12420, 12423, 4096, 12426,
+12437, 12446, 12449, 12456, 12459, 12466, 12469, 12472, 4096, 12477,
+12484, 12487, 12490, 12497, 4096, 12500, 12503, 12506, 12509, 4096,
+12512, 12515, 12518, 12523, 12530, 12533, 12538, 12545, 12552, 12559,
+12564, 12569, 12574, 12579, 4096, 12582, 4096, 12585, 12590, 4096,
+ 4096, 4096, 12595, 4096, 4096, 12598, 12605, 12608, 12613, 12616,
+ 4096, 12619, 4096, 12624, 12629, 12632, 12639, 12642, 4096, 12647,
+12650, 12653, 12656, 12661, 12666, 12669, 12672, 12675, 12680, 12683,
+ 4096, 4096, 12686, 12693, 4096, 12696, 4096, 12699, 4096, 12704,
+12709, 12712, 4096, 12717, 12724, 12733, 4096, 12736, 4096, 12739,
+ 4096, 12742, 12745, 12752, 12755, 4096, 4096, 12758, 12761, 12766,
+12771, 12776, 12781, 12784, 12787, 12792, 4096, 12797, 12802, 12809,
+12816, 12821, 12826, 12835, 12842, 12849, 12860, 4096, 12863, 12866,
+ 4096, 4096, 12869, 4096, 4096, 12872, 12875, 12878, 12883, 4096,
+12890, 12893, 12896, 12901, 12904, 4096, 12909, 12916, 4096, 12919,
+12924, 12927, 12932, 12935, 12938, 12941, 12952, 12959, 12968, 12973,
+12980, 12985, 12992, 12997, 13004, 13007, 13012, 4096, 13015, 4096,
+13022, 4096, 13025, 13034, 13043, 4096, 13048, 4096, 13057, 13062,
+13065, 13068, 13073, 13076, 13081, 4096, 4096, 4096, 13088, 4096,
+ 4096, 4096, 13091, 13094, 13097, 13102, 13107, 13116, 4096, 4096,
+13119, 13122, 13125, 13130, 4096, 4096, 4096, 13133, 13140, 13143,
+13148, 13151, 13154, 13161, 13164, 13171, 13174, 13179, 13182, 13185,
+13188, 13193, 13198, 13203, 4096, 4096, 4096, 4096, 13206, 13209,
+ 4096, 13212, 13215, 13220, 4096, 13229, 13234, 13239, 4096, 13244,
+ 4096, 13247, 13252, 13255, 13258, 13267, 13270, 4096, 4096, 4096,
+ 4096, 4096, 13273, 13276, 13283, 4096, 13288, 13291, 13294, 13297,
+13300, 13305, 13310, 13313, 4096, 13318, 13323, 13328, 13331, 13336,
+13339, 13342, 13347, 13352, 13357, 13362, 4096, 13369, 4096, 13372,
+13379, 13386, 13391, 13398, 13407, 4096, 13412, 13415, 13420, 4096,
+ 4096, 13425, 13428, 13431, 4096, 13436, 13441, 13444, 13451, 13454,
+13459, 13466, 13473, 13476, 13479, 13484, 4096, 13487, 13490, 4096,
+13495, 4096, 4096, 13498, 13503, 4096, 13510, 13515, 13520, 13525,
+13530, 13535, 13540, 13543, 4096, 4096, 4096, 4096, 13546, 13549,
+13554, 13559, 13562, 13565, 13570, 4096, 13575, 4096, 13584, 13589,
+ 4096, 4096, 4096, 13594, 4096, 4096, 13597, 4096, 4096, 4096,
+ 4096, 4096, 13600, 13605, 13608, 4096, 13613, 13616, 13619, 13622,
+13627, 13630, 4096, 13635, 13638, 13645, 13650, 13653, 4096, 13660,
+ 4096, 13663, 4096, 13666, 13671, 4096, 13674, 13683, 13686, 4096,
+13689, 4096, 4096, 13696, 13701, 13706, 13709, 4096, 13712, 13717,
+13722, 13727, 13732, 13737, 13742, 4096, 13747, 4096, 4096, 13750,
+ 4096, 13757, 13762, 13765, 4096, 13768, 13771, 4096, 4096, 13774,
+ 4096, 13779, 13782, 4096, 13785, 4096, 4096, 4096, 13788, 4096,
+ 4096, 13793, 4096, 13798, 13801, 4096, 13804, 4096, 13807, 13810,
+13817, 13824, 13829, 13836, 13839, 13848, 4096, 4096, 4096, 13853,
+13858, 13867, 13872, 4096, 13877, 13882, 13887, 13894, 13897, 13900,
+13903, 13908, 13913, 13918, 4096, 4096, 13921, 13924, 13927, 4096,
+ 4096, 13930, 4096, 13933, 4096, 13940, 4096, 13943, 13946, 4096,
+ 4096, 4096, 4096, 13949, 4096, 4096, 13956, 13961, 13968, 13973,
+13982, 13985, 13992, 13995, 14000, 4096, 14005, 4096, 14010, 4096,
+14015, 14020, 4096, 4096, 14023, 14028, 4096, 14031, 4096, 4096,
+14034, 4096, 4096, 4096, 14037, 4096, 4096, 4096, 4096, 4096,
+14044, 14047, 14052, 14055, 14058, 4096, 14061, 4096, 14066, 14069,
+14074, 14077, 4096, 14080, 14083, 14088, 14091, 14098, 14101, 14108,
+14111, 4096, 14114, 14117, 4096, 14122, 14125, 14128, 14133, 4096,
+ 4096, 4096, 4096, 14136, 14141, 14144, 4096, 4096, 4096, 4096,
+14149, 4096, 4096, 14152, 14155, 14158, 14165, 14170, 14175, 4096,
+ 4096, 4096, 4096, 14180, 4096, 14183, 14190, 14197, 14200, 14205,
+14212, 14217, 14220, 14225, 14228, 14233, 14236, 14239, 14242, 4096,
+ 4096, 4096, 4096, 14249, 4096, 14252, 4096, 14257, 14260, 14263,
+14266, 14273, 14278, 4096, 14281, 14286, 14289, 14294, 14299, 4096,
+14304, 14307, 4096, 14310, 4096, 14313, 4096, 4096, 4096, 14316,
+14319, 14322, 14325, 14330, 14333, 14336, 14339, 4096, 14344, 14347,
+14350, 4096, 14353, 14356, 14361, 4096, 4096, 14366, 14369, 14372,
+ 4096, 14375, 14380, 4096, 4096, 4096, 14383, 14386, 4096, 4096,
+ 4096, 4096, 4096, 14389, 14398, 14401, 4096, 14408, 14413, 4096,
+ 4096, 14418, 14423, 14426, 14429, 4096, 14434, 14437, 14442, 14445,
+14450, 14453, 4096, 14456, 14459, 14462, 4096, 14467, 14476, 14481,
+14486, 14489, 14496, 14499, 14506, 4096, 14511, 14518, 14521, 4096,
+14524, 14527, 14532, 4096, 14535, 4096, 14542, 14545, 14548, 4096,
+14551, 4096, 4096, 14556, 14559, 14564, 14567, 4096, 14570, 14573,
+ 4096, 4096, 14576, 14583, 14588, 14591, 4096, 14598, 14601, 4096,
+ 4096, 14604, 14611, 4096, 14618, 14621, 4096, 14626, 4096, 14629,
+14634, 14639, 4096, 14644, 14649, 14656, 14659, 14666, 14671, 14676,
+14681, 14684, 4096, 4096, 14691, 14698, 4096, 4096, 14703, 14706,
+14713, 4096, 14718, 4096, 14725, 14728, 14731, 14734, 14741, 14746,
+14749, 4096, 14752, 4096, 14755, 4096, 14758, 14763, 14766, 4096,
+ 4096, 14769, 14772, 14779, 14782, 4096, 4096, 4096, 4096, 14785,
+14788, 14793, 14798, 14801, 14810, 14815, 14820, 14829, 14836, 14843,
+14848, 14851, 14854, 4096, 14859, 14862, 14865, 14868, 14871, 14874,
+14879, 4096, 4096, 14884, 14887, 4096, 14894, 14899, 14904, 4096,
+ 4096, 14909, 14912, 14917, 14920, 14929, 14936, 14943, 14946, 14949,
+14954, 4096, 14957, 14960, 14963, 14966, 14971, 14974, 14977, 14980,
+14985, 14996, 15003, 15010, 15019, 15022, 15025, 4096, 15028, 15031,
+15034, 4096, 15039, 15046, 4096, 15049, 15054, 4096, 15057, 4096,
+15062, 15065, 15070, 15073, 15078, 15081, 4096, 4096, 4096, 4096,
+15084, 15087, 4096, 4096, 15090, 15095, 4096, 15098, 15103, 15106,
+15109, 15114, 4096, 15119, 4096, 15124, 15131, 4096, 15136, 15141,
+ 4096, 15144, 15147, 15150, 15153, 15162, 15167, 15174, 15177, 15182,
+15189, 15192, 4096, 15195, 15200, 4096, 4096, 4096, 15205, 15210,
+15217, 15222, 15229, 15236, 15241, 15244, 15251, 4096, 4096, 15254,
+15257, 15260, 4096, 15263, 4096, 15266, 15269, 15272, 15281, 15286,
+15291, 15294, 15299, 4096, 15302, 4096, 15305, 15314, 15317, 15322,
+ 4096, 4096, 4096, 4096, 15325, 4096, 15328, 4096, 15333, 15336,
+ 4096, 4096, 4096, 15341, 15348, 15351, 15356, 15359, 15362, 15365,
+15368, 15371, 15376, 4096, 4096, 15379, 15382, 15387, 4096, 15390,
+15393, 15396, 15403, 15408, 4096, 15415, 15418, 15423, 15428, 15435,
+15438, 15445, 15450, 15455, 4096, 4096, 15464, 15467, 15470, 4096,
+15473, 15476, 4096, 4096, 4096, 15481, 15484, 15487, 15492, 15495,
+15498, 4096, 15501, 4096, 15504, 15513, 15518, 4096, 15521, 4096,
+15526, 15531, 4096, 15536, 4096, 15539, 4096, 15544, 4096, 15547,
+ 4096, 4096, 15550, 15555, 4096, 15558, 15561, 4096, 15568, 4096,
+ 4096, 4096, 4096, 15571, 15574, 15581, 15586, 15595, 15602, 15613,
+15618, 15627, 15630, 4096, 15635, 15644, 4096, 15649, 15658, 4096,
+ 4096, 15661, 4096, 4096, 15666, 4096, 4096, 4096, 4096, 4096,
+ 4096, 4096, 15669, 4096, 15672, 15677, 15680, 4096, 15685, 15690,
+15699, 15706, 4096, 15713, 15718, 4096, 4096, 15723, 4096, 15728,
+15733, 15736, 15739, 4096, 15742, 4096, 4096, 15747, 15750, 15753,
+ 4096, 15758, 15763, 15766, 4096, 4096, 4096, 15769, 15772, 4096,
+15775, 4096, 4096, 15778, 15781, 15784, 15789, 15792, 15795, 15798,
+15801, 15804, 4096, 4096, 4096, 4096, 15807, 15812, 15815, 15820,
+ 4096, 15825, 15830, 15837, 15842, 15849, 15856, 15859, 15864, 15869,
+15872, 4096, 15875, 4096, 15878, 15883, 15886, 15889, 4096, 4096,
+15892, 15897, 15902, 15905, 4096, 4096, 15908, 15913, 15920, 15923,
+15926, 15931, 15934, 4096, 15939, 4096, 15944, 4096, 4096, 4096,
+15947, 15950, 4096, 15953, 15956, 15959, 15964, 15967, 15970, 4096,
+15975, 4096, 4096, 15978, 4096, 15981, 15984, 15989, 15996, 15999,
+16012, 16015, 16020, 16025, 16032, 16035, 16040, 16045, 16054, 16063,
+ 4096, 4096, 4096, 16066, 4096, 16071, 16074, 16077, 16080, 4096,
+ 4096, 16083, 16086, 4096, 16089, 4096, 4096, 4096, 16092, 16095,
+ 4096, 16100, 16105, 16108, 16111, 16114, 16117, 16124, 16129, 16134,
+16139, 16144, 4096, 4096, 4096, 16149, 4096, 4096, 16152, 4096,
+ 4096, 16157, 4096, 4096, 4096, 16160, 4096, 16163, 16168, 16173,
+16176, 16179, 4096, 16182, 16185, 16188, 4096, 16197, 16200, 16203,
+16206, 16213, 16216, 16221, 16226, 4096, 16229, 16232, 16237, 4096,
+16240, 16245, 4096, 16248, 4096, 4096, 16251, 16254, 4096, 4096,
+ 4096, 16257, 16260, 16263, 16270, 16277, 4096, 4096, 16280, 16283,
+16288, 16297, 16304, 16307, 16310, 16313, 16318, 4096, 4096, 4096,
+ 4096, 16321, 4096, 16326, 16329, 4096, 16336, 4096, 16341, 16346,
+16349, 4096, 16352, 16357, 16360, 16365, 16368, 16373, 16376, 16381,
+16384, 16389, 4096, 4096, 16392, 4096, 16397, 4096, 16404, 16413,
+16418, 16423, 16430, 16435, 16438, 16441, 16444, 16447, 16450, 16453,
+16458, 16463, 16468, 16473, 16478, 16481, 16488, 16495, 16498, 16509,
+16514, 4096, 16517, 16520, 16527, 16532, 16539, 16544, 16549, 4096,
+16552, 4096, 16555, 4096, 16558, 16565, 16572, 4096, 16575, 16580,
+16587, 4096, 16590, 16593, 16596, 4096, 4096, 16601, 16604, 16607,
+ 4096, 4096, 4096, 4096, 16614, 16621, 4096, 16624, 16627, 16632,
+16635, 16638, 4096, 16641, 4096, 16644, 16647, 4096, 4096, 16650,
+16655, 16658, 16661, 16664, 16667, 16672, 16675, 16680, 16683, 4096,
+16688, 4096, 16691, 4096, 4096, 16694, 0, 1, 538, 8621,
+ 1, 671, 60856, 1, 968, 12549, 1, 3638, 2910, 1,
+ 2877, 20684, 1, 2923, 39925, 1, 648, 62074, 1, 2373,
+28221, 1, 859, 46293, 1, 3349, 56632, 1, 2356, 49074,
+ 1, 2052, 59737, 1, 1055, 10411, 2, 1884, 43325, 3256,
+36851, 1, 3644, 26552, 1, 1653, 6093, 2, 310, 62685,
+ 1776, 11249, 1, 2146, 8987, 1, 2031, 11294, 2, 476,
+44554, 3217, 20788, 1, 52, 24850, 2, 396, 34819, 2107,
+37979, 1, 3579, 57855, 1, 1459, 3049, 1, 2259, 55510,
+ 2, 2359, 15723, 3257, 44945, 2, 881, 58597, 1604, 36070,
+ 1, 129, 13698, 2, 296, 53997, 2410, 55031, 1, 610,
+37910, 3, 2841, 65354, 3164, 2453, 3858, 13852, 2, 2981,
+ 9862, 3042, 5240, 3, 615, 22080, 2706, 20467, 3946, 12015,
+ 1, 4455, 28030, 2, 494, 57619, 4010, 46154, 2, 404,
+34969, 2064, 5353, 1, 405, 34969, 1, 110, 21934, 1,
+ 1672, 5258, 1, 2639, 22156, 1, 2019, 11349, 1, 2126,
+11629, 1, 4017, 33411, 2, 1749, 52977, 1798, 29829, 1,
+ 1030, 4783, 2, 252, 39503, 3688, 49539, 1, 1411, 36198,
+ 2, 261, 35245, 1909, 18852, 1, 3648, 35726, 2, 152,
+46517, 2861, 13198, 1, 1583, 20494, 3, 943, 53203, 2301,
+42382, 3931, 31469, 1, 2020, 24768, 5, 109, 15505, 230,
+44635, 498, 24345, 694, 19012, 2590, 47072, 1, 1865, 11004,
+ 2, 341, 42146, 4453, 63423, 1, 1647, 40187, 1, 3677,
+22412, 2, 836, 44063, 3370, 42722, 1, 3100, 18054, 1,
+ 723, 12262, 1, 1233, 60025, 1, 1050, 44543, 1, 4498,
+63644, 4, 614, 28932, 786, 62878, 1793, 11073, 4523, 63644,
+ 2, 970, 11950, 4548, 63644, 1, 4573, 63644, 3, 309,
+10466, 659, 35285, 4598, 63644, 2, 3290, 36801, 4623, 63644,
+ 3, 1938, 41086, 4648, 63644, 4699, 14274, 2, 4673, 63644,
+ 4724, 14274, 3, 999, 49574, 2402, 40152, 4749, 14274, 1,
+ 4774, 14274, 3, 2363, 24341, 3892, 21252, 4799, 14274, 1,
+ 4824, 14274, 2, 377, 61257, 4849, 14274, 1, 3315, 40573,
+ 1, 1822, 40209, 3, 1080, 52961, 1703, 15014, 3481, 40265,
+ 1, 4507, 40309, 3, 2293, 60233, 2478, 54457, 4532, 40309,
+ 2, 1092, 30366, 4557, 40309, 4, 638, 6544, 2286, 31976,
+ 3263, 29647, 4582, 40309, 3, 2779, 51298, 2855, 11901, 4607,
+40309, 1, 4632, 40309, 1, 4657, 40309, 2, 3521, 6339,
+ 4682, 40309, 3, 1383, 52410, 2502, 63753, 2542, 5182, 1,
+ 3423, 61675, 2, 1290, 55360, 1830, 59431, 2, 3228, 37852,
+ 3342, 58724, 1, 3163, 29157, 3, 415, 32842, 1650, 30594,
+ 2057, 14646, 1, 3968, 30918, 4, 77, 40351, 1475, 11656,
+ 1696, 31564, 2500, 21395, 1, 1614, 10672, 2, 3094, 17865,
+ 3539, 63522, 1, 2404, 63959, 2, 27, 51816, 2815, 8159,
+ 3, 1820, 44711, 2193, 43425, 2808, 51260, 2, 2799, 17997,
+ 2830, 50244, 1, 1785, 47453, 3, 111, 43648, 1173, 8060,
+ 3718, 8464, 1, 3413, 61344, 2, 1192, 49812, 4467, 37379,
+ 3, 155, 41372, 1818, 47768, 3658, 55874, 1, 226, 56676,
+ 1, 2063, 49744, 2, 994, 48620, 2572, 19985, 1, 4479,
+38867, 4, 975, 64135, 3231, 18801, 3513, 63330, 3603, 28960,
+ 1, 3884, 24133, 1, 2440, 48575, 2, 1628, 62632, 3569,
+58465, 2, 1845, 37210, 3265, 51283, 1, 1665, 4237, 2,
+ 2082, 1975, 4027, 14692, 1, 2449, 9769, 4, 347, 46683,
+ 574, 57055, 2241, 11799, 3932, 18875, 1, 2227, 15357, 1,
+ 3320, 16660, 1, 960, 32652, 2, 1468, 40759, 3501, 64437,
+ 1, 1046, 58285, 1, 3621, 21862, 1, 2491, 30424, 1,
+ 3564, 49193, 2, 551, 42162, 1985, 607, 1, 1654, 5955,
+ 4, 71, 1636, 2289, 50620, 3356, 57409, 4475, 53994, 2,
+ 533, 118, 2862, 50901, 1, 3673, 46929, 1, 2909, 65309,
+ 1, 516, 61057, 1, 1483, 1171, 2, 26, 5383, 2371,
+ 7959, 1, 897, 21498, 2, 1678, 57277, 3204, 8451, 2,
+ 653, 13269, 4441, 37872, 2, 2929, 35422, 3617, 54517, 1,
+ 4489, 35615, 4, 920, 48155, 1256, 32759, 3380, 49421, 4514,
+35615, 3, 2369, 13492, 3783, 5811, 4539, 35615, 3, 195,
+ 6787, 1743, 5438, 4564, 35615, 3, 1219, 61510, 4440, 51487,
+ 4589, 35615, 2, 583, 745, 4614, 35615, 3, 1463, 64738,
+ 3434, 3744, 4639, 35615, 2, 1270, 20482, 4664, 35615, 2,
+ 1562, 19151, 2949, 46008, 3, 2177, 17998, 3196, 20331, 3572,
+21491, 3, 84, 57075, 958, 20964, 1441, 49831, 1, 2755,
+20026, 2, 549, 42731, 2510, 18144, 1, 3297, 16632, 1,
+ 609, 10750, 2, 700, 13850, 3190, 17930, 2, 1470, 47159,
+ 4254, 19574, 3, 2697, 19029, 4261, 8853, 4280, 19574, 3,
+ 2692, 48192, 4287, 8853, 4306, 19574, 2, 4313, 8853, 4332,
+19574, 4, 2703, 40280, 2930, 62710, 4339, 8853, 4358, 19574,
+ 3, 3737, 57922, 4365, 8853, 4384, 19574, 4, 2370, 38658,
+ 2507, 5225, 4391, 8853, 4410, 19574, 2, 1189, 42935, 4417,
+ 8853, 3, 665, 1484, 810, 25404, 3037, 33435, 1, 3004,
+34695, 2, 210, 30501, 2196, 53707, 1, 2494, 39411, 1,
+ 3538, 18058, 1, 3767, 45485, 1, 2987, 43792, 3, 291,
+60715, 2560, 704, 3938, 62351, 3, 667, 10801, 1251, 956,
+ 2145, 26202, 1, 1446, 35738, 1, 3031, 28587, 2, 2532,
+12644, 3435, 30214, 1, 3696, 55788, 1, 305, 42062, 1,
+ 3616, 7245, 1, 272, 27183, 1, 3059, 4306, 2, 32,
+11748, 4706, 6213, 4, 232, 60963, 279, 22514, 4436, 16499,
+ 4731, 6213, 1, 4756, 6213, 2, 2296, 50439, 4781, 6213,
+ 2, 2473, 496, 4806, 6213, 2, 4704, 55488, 4831, 6213,
+ 3, 3022, 62290, 4729, 55488, 4856, 6213, 4, 395, 26288,
+ 3480, 27124, 3788, 30177, 4754, 55488, 2, 1220, 12160, 4779,
+55488, 1, 4804, 55488, 2, 858, 62131, 4829, 55488, 1,
+ 4854, 55488, 1, 3525, 2540, 1, 2030, 59198, 1, 2375,
+33068, 1, 2546, 58064, 3, 963, 60450, 1525, 24965, 3668,
+46256, 1, 1639, 48656, 2, 1198, 41014, 2780, 35236, 1,
+ 3971, 7127, 1, 1360, 34878, 2, 1558, 62471, 2098, 3340,
+ 2, 1201, 9979, 1829, 40147, 3, 2087, 6420, 2094, 36952,
+ 3981, 1318, 2, 4048, 1598, 4485, 44049, 2, 4074, 1598,
+ 4510, 44049, 3, 2599, 35812, 4100, 1598, 4535, 44049, 3,
+ 1234, 33016, 4126, 1598, 4560, 44049, 5, 249, 32605, 3303,
+40839, 3726, 60753, 4152, 1598, 4585, 44049, 2, 4178, 1598,
+ 4610, 44049, 3, 3475, 9286, 4204, 1598, 4635, 44049, 2,
+ 4230, 1598, 4660, 44049, 1, 2592, 7571, 1, 663, 51295,
+ 2, 851, 21991, 3602, 23956, 1, 595, 29873, 1, 1095,
+20705, 2, 787, 35182, 1549, 3029, 1, 219, 33622, 1,
+ 299, 8435, 1, 2666, 15256, 1, 1322, 61370, 3, 443,
+ 451, 2774, 17439, 3210, 1336, 1, 457, 60073, 3, 896,
+48859, 1365, 18073, 3845, 13914, 1, 453, 52993, 3, 2173,
+30972, 3674, 8767, 3999, 53668, 1, 1326, 32838, 2, 531,
+ 8529, 3115, 29778, 1, 3025, 54845, 2, 1447, 25133, 3756,
+18165, 1, 350, 16285, 1, 594, 51570, 1, 721, 10546,
+ 1, 3111, 15927, 3, 1530, 40966, 3113, 24897, 3967, 27968,
+ 2, 2185, 62063, 3023, 49902, 2, 514, 17117, 4461, 14122,
+ 1, 454, 54009, 1, 1163, 57083, 2, 2451, 25490, 3002,
+33524, 3, 2783, 57773, 3270, 16073, 3595, 1675, 1, 1085,
+24405, 1, 82, 4512, 1, 2265, 61099, 1, 2041, 48648,
+ 1, 2049, 28022, 3, 727, 57038, 2535, 11168, 4872, 18451,
+ 1, 909, 26484, 2, 1841, 49566, 2766, 47967, 1, 856,
+47107, 2, 2937, 23041, 4043, 44013, 1, 1888, 39122, 1,
+ 3386, 24815, 3, 49, 44013, 3071, 865, 4434, 8579, 1,
+ 2351, 51212, 2, 1661, 23331, 4042, 47097, 1, 1161, 21696,
+ 1, 3232, 55538, 2, 1022, 39560, 3740, 23903, 2, 3642,
+11038, 3834, 57499, 2, 64, 61386, 2648, 30329, 1, 2988,
+14002, 1, 3076, 10990, 1, 333, 9319, 2, 3283, 44381,
+ 3310, 57369, 1, 1664, 32276, 3, 106, 54694, 3153, 40523,
+ 3797, 28681, 1, 4463, 63295, 4, 931, 32175, 1107, 11499,
+ 3506, 43920, 3762, 41356, 1, 235, 14887, 2, 991, 35237,
+ 1498, 35329, 2, 2513, 11102, 4708, 29565, 3, 224, 33531,
+ 838, 28695, 4733, 29565, 1, 4758, 29565, 2, 2388, 20620,
+ 4783, 29565, 4, 678, 16712, 936, 59149, 1465, 19799, 4808,
+29565, 1, 4833, 29565, 1, 4858, 29565, 1, 409, 38661,
+ 1, 2549, 25574, 1, 2511, 39468, 2, 463, 38215, 1352,
+ 6328, 1, 464, 38215, 2, 724, 48994, 3879, 31034, 2,
+ 3048, 54704, 3308, 33153, 1, 3825, 39102, 1, 1018, 7490,
+ 1, 250, 53674, 1, 1603, 12537, 1, 3722, 21172, 2,
+ 3246, 43431, 3650, 19782, 1, 363, 660, 2, 44, 18941,
+ 1355, 48528, 2, 2095, 24192, 2750, 62543, 2, 1961, 22771,
+ 2768, 62826, 1, 4871, 63261, 2, 2870, 4493, 3391, 56801,
+ 2, 417, 58663, 2176, 53526, 3, 2509, 31092, 3191, 50456,
+ 3528, 46868, 1, 4501, 54087, 2, 3440, 4813, 4526, 54087,
+ 2, 2243, 19430, 4551, 54087, 3, 630, 54625, 1863, 62962,
+ 4576, 54087, 1, 4601, 54087, 2, 1127, 44520, 4626, 54087,
+ 2, 2141, 20703, 4651, 54087, 1, 4676, 54087, 1, 603,
+37052, 1, 2213, 63035, 3, 758, 56350, 2199, 16029, 3144,
+64340, 1, 196, 64246, 1, 213, 947, 1, 108, 30471,
+ 1, 3390, 16378, 3, 1413, 5820, 2928, 15219, 3438, 57051,
+ 3, 718, 52360, 1526, 54256, 3354, 12659, 3, 849, 61303,
+ 2920, 58357, 3451, 30767, 2, 3333, 42053, 3920, 42173, 1,
+ 3016, 18330, 3, 1043, 62437, 1194, 52854, 3046, 26311, 1,
+ 3400, 28045, 1, 3054, 60301, 1, 34, 16521, 1, 2104,
+34104, 2, 2009, 40343, 3643, 6774, 1, 99, 41809, 1,
+ 2255, 14867, 1, 2913, 43015, 2, 585, 392, 923, 65353,
+ 2, 1492, 26142, 3457, 21101, 1, 2575, 43695, 1, 978,
+33119, 2, 439, 17258, 3750, 7259, 2, 542, 56684, 3849,
+52237, 2, 1004, 62521, 1876, 8355, 2, 1019, 30243, 2389,
+58552, 1, 510, 43092, 2, 1203, 31419, 1983, 31168, 2,
+ 812, 43779, 3496, 45949, 1, 3893, 49823, 1, 534, 32106,
+ 1, 2954, 54908, 2, 3355, 33551, 4260, 44372, 2, 3185,
+47233, 4286, 44372, 2, 2986, 48061, 4312, 44372, 2, 833,
+44420, 4338, 44372, 3, 1644, 45208, 2202, 22229, 4364, 44372,
+ 2, 4390, 44372, 4709, 44243, 3, 1860, 11645, 4416, 44372,
+ 4734, 44243, 3, 1958, 63733, 4258, 16876, 4759, 44243, 2,
+ 4284, 16876, 4784, 44243, 3, 3082, 41504, 4310, 16876, 4809,
+44243, 2, 4336, 16876, 4834, 44243, 4, 1226, 17096, 4362,
+16876, 4859, 44243, 4873, 51313, 2, 753, 22294, 4388, 16876,
+ 2, 1170, 39748, 4414, 16876, 1, 212, 41678, 1, 3314,
+23067, 1, 1434, 3379, 4, 702, 9740, 1042, 54312, 2846,
+11583, 3832, 18588, 2, 28, 41136, 3444, 49541, 1, 2027,
+23463, 2, 684, 49969, 3443, 479, 1, 1035, 57871, 2,
+ 934, 59277, 3594, 12078, 1, 677, 49699, 1, 3933, 5384,
+ 1, 2547, 14481, 1, 1814, 18116, 1, 3831, 47543, 1,
+ 3597, 22952, 3, 846, 46352, 1668, 40460, 4061, 37180, 4,
+ 450, 3078, 1224, 17926, 2872, 53502, 4087, 37180, 3, 318,
+43279, 3885, 40077, 4113, 37180, 2, 2421, 48188, 4139, 37180,
+ 1, 4165, 37180, 2, 3077, 47968, 4191, 37180, 1, 4217,
+37180, 3, 323, 16849, 3964, 42853, 4243, 37180, 2, 441,
+ 6949, 1023, 41456, 2, 765, 42119, 4005, 32781, 1, 688,
+46591, 1, 4069, 10640, 2, 336, 27607, 4095, 10640, 2,
+ 10, 51927, 4121, 10640, 1, 4147, 10640, 1, 4173, 10640,
+ 4, 760, 6196, 1172, 23817, 2948, 37142, 4199, 10640, 3,
+ 1292, 52357, 2210, 62694, 4225, 10640, 3, 327, 7681, 1222,
+11060, 4251, 10640, 2, 1514, 53815, 1895, 33705, 1, 3433,
+49832, 2, 345, 60940, 3197, 51409, 1, 2250, 20758, 1,
+ 3826, 33192, 3, 177, 29426, 1722, 19665, 2399, 15507, 1,
+ 3816, 5552, 1, 3711, 3155, 1, 3911, 21515, 1, 2323,
+48303, 1, 3249, 59436, 2, 2669, 13322, 2704, 51090, 1,
+ 2658, 50060, 1, 1268, 62045, 1, 2232, 25451, 1, 2539,
+62992, 2, 2427, 20821, 2805, 48602, 1, 2036, 43530, 2,
+ 681, 26886, 3201, 19847, 1, 1606, 21078, 1, 2414, 51422,
+ 1, 263, 17898, 1, 2372, 60067, 1, 2144, 39379, 1,
+ 3198, 14149, 1, 2765, 41081, 2, 873, 58431, 1067, 33602,
+ 3, 97, 35667, 3717, 64701, 4439, 13541, 3, 186, 61426,
+ 2110, 53567, 3182, 55066, 1, 2401, 42968, 2, 523, 5180,
+ 4875, 29595, 1, 3091, 23416, 1, 1096, 17931, 3, 2727,
+34781, 3660, 31105, 3872, 53367, 2, 2112, 21521, 4506, 4160,
+ 1, 4531, 4160, 2, 1298, 23981, 4556, 4160, 2, 3085,
+62178, 4581, 4160, 2, 3837, 43162, 4606, 4160, 1, 4631,
+ 4160, 3, 22, 30305, 289, 4714, 4656, 4160, 2, 2070,
+21557, 4681, 4160, 1, 541, 57802, 1, 3410, 38423, 1,
+ 446, 62774, 1, 2850, 38592, 2, 1294, 24514, 3009, 31076,
+ 1, 3829, 34297, 2, 1890, 32844, 3239, 9366, 2, 1100,
+24098, 3758, 6955, 1, 3374, 5017, 2, 1342, 9759, 1771,
+23906, 2, 339, 22154, 1422, 37159, 2, 1032, 30297, 1188,
+39391, 1, 3700, 15725, 2, 996, 60439, 1931, 59055, 3,
+ 1025, 17639, 1316, 5170, 3883, 6314, 1, 2186, 50338, 1,
+ 308, 15516, 2, 233, 25686, 1555, 1108, 2, 3069, 8280,
+ 3760, 30530, 1, 334, 8277, 1, 2328, 57538, 1, 3546,
+56945, 1, 4466, 23011, 3, 1314, 17261, 1574, 7350, 3527,
+42800, 1, 557, 11593, 1, 720, 49169, 1, 771, 55151,
+ 1, 3985, 51077, 1, 2484, 56461, 3, 2485, 59961, 3052,
+45482, 3541, 59598, 1, 3158, 27091, 1, 2055, 46461, 2,
+ 1736, 16628, 2722, 47047, 1, 1996, 23929, 2, 145, 36340,
+ 3801, 26517, 1, 161, 50018, 1, 3728, 50158, 2, 695,
+26601, 1784, 962, 1, 2496, 58356, 1, 2058, 17603, 2,
+ 2229, 37723, 3068, 4378, 1, 1372, 8838, 1, 1379, 64024,
+ 2, 3500, 43043, 4454, 49101, 1, 2725, 57856, 2, 591,
+30775, 2347, 32501, 2, 1072, 5824, 2434, 13945, 1, 3560,
+27184, 1, 1972, 5625, 2, 879, 2405, 2674, 21960, 2,
+ 3661, 31960, 3854, 7404, 2, 1248, 27858, 3574, 54611, 2,
+ 93, 15170, 1157, 5121, 1, 861, 4397, 2, 1321, 3195,
+ 3447, 17244, 1, 3818, 57985, 2, 2781, 49754, 3421, 31960,
+ 1, 1212, 61958, 1, 4502, 13759, 3, 2152, 58474, 3808,
+42484, 4527, 13759, 1, 4552, 13759, 7, 295, 49585, 919,
+50028, 1244, 31055, 2067, 32528, 2809, 41529, 3408, 65008, 4577,
+13759, 1, 4602, 13759, 2, 773, 65127, 4627, 13759, 2,
+ 4652, 13759, 4703, 29925, 5, 2350, 4426, 3014, 39349, 3169,
+ 9913, 4677, 13759, 4728, 29925, 2, 3445, 21817, 4753, 29925,
+ 2, 3623, 52684, 4778, 29925, 1, 4803, 29925, 2, 1579,
+55409, 4828, 29925, 3, 2454, 390, 3775, 39266, 4853, 29925,
+ 2, 15, 65322, 2778, 47992, 2, 613, 49021, 1894, 40744,
+ 1, 1323, 25536, 1, 1789, 14257, 1, 1641, 44004, 1,
+ 1289, 30834, 1, 4476, 61217, 1, 243, 28572, 2, 2294,
+41222, 4035, 17014, 1, 629, 63102, 2, 247, 25966, 1171,
+37611, 2, 2405, 34094, 3666, 61119, 3, 1742, 59664, 2719,
+18123, 3861, 5715, 2, 2235, 27442, 2834, 9012, 2, 553,
+ 5251, 2288, 36394, 1, 4007, 37965, 3, 123, 3800, 1871,
+ 9998, 2829, 2131, 3, 414, 19569, 2100, 19418, 2667, 33378,
+ 1, 3524, 57893, 2, 1428, 32794, 3823, 12861, 2, 344,
+ 9922, 2723, 25878, 3, 1910, 12806, 2939, 38052, 3019, 42347,
+ 1, 2701, 53577, 2, 935, 34466, 1593, 64468, 1, 2851,
+52650, 1, 3143, 47232, 2, 1569, 26817, 3373, 43442, 1,
+ 2337, 59609, 2, 2132, 32194, 4004, 59602, 1, 1565, 45935,
+ 3, 647, 29460, 1811, 54797, 3043, 8980, 1, 1280, 62491,
+ 3, 577, 12151, 2423, 37452, 4000, 57494, 2, 1278, 12046,
+ 2384, 18752, 1, 338, 58831, 1, 2918, 18908, 1, 166,
+ 4772, 1, 3087, 40440, 1, 2287, 49495, 1, 2029, 20454,
+ 2, 1773, 24572, 3624, 5370, 1, 3787, 25303, 1, 913,
+31306, 2, 559, 49273, 788, 27881, 2, 1602, 2987, 2543,
+59811, 1, 1792, 31647, 1, 4068, 46876, 1, 4094, 46876,
+ 1, 4120, 46876, 2, 2349, 7662, 4146, 46876, 1, 4172,
+46876, 1, 4198, 46876, 1, 4224, 46876, 1, 4250, 46876,
+ 1, 2978, 58873, 2, 3295, 42687, 3681, 20277, 2, 800,
+46069, 3777, 23342, 2, 801, 46069, 2469, 26515, 1, 2890,
+16517, 1, 3358, 27973, 1, 1529, 13664, 3, 877, 33602,
+ 1054, 4170, 2391, 48923, 1, 2437, 49392, 1, 1143, 39442,
+ 1, 3230, 29597, 2, 550, 4069, 1496, 15255, 1, 2013,
+58319, 3, 863, 36113, 1461, 7485, 3133, 29090, 2, 1941,
+17612, 3607, 3241, 2, 2166, 60525, 3655, 52742, 1, 2695,
+31799, 1, 1274, 37783, 2, 751, 56284, 1632, 28849, 2,
+ 1897, 31376, 4482, 42926, 1, 3995, 39577, 2, 698, 52322,
+ 2150, 25355, 1, 4274, 14108, 2, 1402, 31932, 4300, 14108,
+ 5, 2896, 24587, 3415, 4682, 4022, 39767, 4326, 14108, 4460,
+21194, 1, 4352, 14108, 2, 3753, 43416, 4378, 14108, 1,
+ 4404, 14108, 1, 4430, 14108, 1, 1827, 14863, 2, 2005,
+ 2318, 3156, 28190, 1, 107, 65526, 3, 1012, 33526, 1806,
+26397, 2435, 19548, 1, 231, 20005, 1, 3152, 20633, 1,
+ 3647, 41812, 1, 31, 5027, 2, 264, 23803, 1363, 35085,
+ 1, 1133, 53733, 1, 3742, 34093, 1, 3065, 14618, 1,
+ 2119, 18626, 2, 1245, 23388, 2691, 11862, 1, 1353, 51926,
+ 2, 36, 25674, 2077, 34040, 2, 65, 19431, 1097, 58455,
+ 2, 1041, 26460, 1721, 9859, 3, 1027, 179, 3092, 39969,
+ 3485, 52683, 2, 125, 9955, 1269, 47114, 3, 2155, 14279,
+ 2616, 27085, 3665, 50115, 1, 1585, 47881, 1, 1347, 3533,
+ 1, 1846, 18793, 1, 3969, 30395, 2, 1071, 11205, 1699,
+41251, 1, 4028, 15813, 4, 893, 29737, 1003, 31721, 2887,
+ 2791, 3171, 17977, 1, 658, 65267, 1, 3411, 36459, 1,
+ 1176, 11917, 3, 156, 24762, 3120, 3413, 3680, 24043, 1,
+ 2675, 6414, 1, 2934, 53266, 2, 3362, 37320, 4257, 1877,
+ 2, 2979, 42463, 4283, 1877, 1, 4309, 1877, 3, 521,
+25426, 2764, 49440, 4335, 1877, 2, 2907, 37379, 4361, 1877,
+ 2, 240, 53007, 4387, 1877, 4, 2463, 41178, 2844, 54304,
+ 3535, 61149, 4413, 1877, 1, 4044, 12838, 1, 4070, 12838,
+ 2, 3587, 46308, 4096, 12838, 3, 1063, 19397, 3353, 3829,
+ 4122, 12838, 3, 1753, 24609, 3821, 39562, 4148, 12838, 1,
+ 4174, 12838, 3, 844, 3205, 2290, 22686, 4200, 12838, 1,
+ 4226, 12838, 1, 2468, 48658, 1, 3965, 42660, 3, 704,
+38769, 1697, 8837, 3850, 31967, 2, 2580, 62005, 3517, 1008,
+ 3, 187, 54398, 805, 15977, 3280, 42346, 1, 4064, 35064,
+ 2, 3548, 51635, 4090, 35064, 2, 1934, 44383, 4116, 35064,
+ 2, 3906, 5708, 4142, 35064, 2, 3581, 4875, 4168, 35064,
+ 1, 4194, 35064, 4, 400, 44464, 1044, 30817, 1592, 26715,
+ 4220, 35064, 2, 3519, 32125, 4246, 35064, 1, 3689, 50276,
+ 1, 1612, 32517, 1, 1948, 24663, 1, 1832, 30693, 1,
+ 2216, 36578, 1, 791, 27140, 1, 2283, 53755, 3, 39,
+13658, 2244, 38732, 3859, 39828, 1, 1747, 6881, 1, 939,
+16279, 1, 2273, 64670, 2, 1532, 35223, 3793, 4825, 1,
+ 1258, 59741, 1, 3388, 20097, 1, 3109, 54956, 3, 355,
+47051, 3563, 13993, 3863, 52384, 3, 2014, 2730, 2377, 29641,
+ 3487, 29959, 4, 1090, 6400, 3136, 32118, 3847, 44824, 3960,
+64213, 1, 974, 5142, 1, 2558, 50821, 1, 4046, 30382,
+ 1, 4072, 30382, 1, 4098, 30382, 2, 2381, 51994, 4124,
+30382, 3, 967, 15790, 2028, 2381, 4150, 30382, 2, 808,
+48558, 4176, 30382, 3, 456, 1529, 1005, 29729, 4202, 30382,
+ 2, 1407, 54466, 4228, 30382, 1, 927, 26208, 1, 3804,
+ 8168, 5, 990, 48030, 1430, 23865, 2609, 20151, 3325, 62713,
+ 3499, 51729, 1, 938, 63499, 1, 337, 15808, 1, 2593,
+ 4179, 2, 144, 30206, 2619, 14516, 1, 267, 18700, 1,
+ 1153, 50097, 2, 860, 52419, 2879, 5612, 2, 118, 20773,
+ 2751, 23925, 1, 3131, 1662, 1, 3409, 59621, 1, 3645,
+12017, 1, 4011, 26247, 2, 2069, 4474, 2236, 24421, 1,
+ 3692, 32402, 1, 1548, 29647, 2, 1089, 20609, 2368, 62876,
+ 3, 992, 36969, 1155, 50983, 4874, 39848, 1, 3625, 18623,
+ 1, 2976, 15195, 2, 555, 40520, 1026, 19247, 2, 3446,
+23829, 3609, 34823, 1, 433, 37776, 2, 1444, 33231, 1741,
+55360, 1, 2699, 58942, 3, 622, 36433, 2729, 41475, 3455,
+57855, 2, 1001, 24798, 3073, 64212, 1, 902, 27480, 3,
+ 162, 5157, 2336, 9479, 2343, 63466, 2, 1503, 48703, 1966,
+29966, 1, 1229, 50814, 2, 1318, 56536, 2972, 31521, 5,
+ 976, 27979, 1622, 51913, 2585, 10878, 2977, 4391, 3929, 42803,
+ 2, 2324, 27978, 3116, 17664, 2, 1479, 59258, 1783, 13700,
+ 4, 1570, 25960, 1690, 2745, 3418, 19484, 4067, 51942, 3,
+ 2561, 17510, 2900, 47738, 4093, 51942, 2, 3814, 24199, 4119,
+51942, 3, 1575, 16272, 1861, 51384, 4145, 51942, 2, 1306,
+ 392, 4171, 51942, 2, 1205, 36135, 4197, 51942, 1, 4223,
+51942, 2, 1705, 41022, 4249, 51942, 1, 1765, 42610, 1,
+ 504, 31758, 1, 2935, 29425, 1, 407, 29798, 1, 408,
+29798, 1, 565, 24099, 1, 685, 22542, 1, 746, 60765,
+ 2, 1260, 20330, 2608, 23007, 2, 1295, 62318, 3634, 9391,
+ 1, 3389, 35288, 2, 1335, 60893, 2633, 25793, 1, 3159,
+12412, 1, 1424, 5536, 1, 3896, 57729, 1, 889, 53689,
+ 4, 1456, 52188, 3611, 50995, 3963, 5886, 4484, 59438, 2,
+ 429, 15402, 2099, 24950, 1, 1872, 36530, 1, 2109, 43858,
+ 2, 3730, 27406, 3812, 16429, 1, 2996, 5419, 1, 576,
+31503, 1, 3417, 60703, 1, 3272, 2048, 3, 271, 61166,
+ 1856, 12252, 1993, 34645, 1, 1901, 21699, 5, 644, 28300,
+ 1563, 56155, 1704, 53142, 3154, 4952, 4499, 42137, 2, 278,
+ 8450, 4524, 42137, 3, 384, 8874, 3179, 55420, 4549, 42137,
+ 1, 4574, 42137, 1, 4599, 42137, 2, 708, 43855, 4624,
+42137, 2, 2262, 35584, 4649, 42137, 1, 4674, 42137, 1,
+ 1126, 37347, 2, 100, 6073, 3820, 25552, 1, 2212, 7210,
+ 1, 2486, 3068, 1, 3083, 57393, 4, 92, 65064, 1923,
+ 136, 2512, 9650, 3088, 6668, 1, 436, 47761, 1, 256,
+49357, 1, 437, 47761, 1, 2676, 27868, 2, 1227, 59069,
+ 3385, 30062, 1, 3694, 49992, 2, 2852, 49346, 3986, 10948,
+ 1, 3471, 41907, 1, 1767, 42985, 1, 3881, 60345, 1,
+ 2248, 29888, 4, 168, 10120, 796, 10258, 1698, 49691, 1879,
+53209, 2, 661, 14413, 1139, 10714, 3, 1069, 8618, 1527,
+19161, 3478, 40520, 3, 167, 20527, 4267, 20195, 4468, 9757,
+ 3, 2628, 38715, 2689, 20133, 4293, 20195, 2, 461, 6221,
+ 4319, 20195, 4, 1710, 43858, 3899, 13668, 3991, 26949, 4345,
+20195, 1, 4371, 20195, 1, 4397, 20195, 2, 524, 9457,
+ 4423, 20195, 3, 601, 20884, 2086, 3779, 3770, 6456, 1,
+ 3112, 58961, 2, 2125, 62425, 2149, 61894, 1, 2938, 43137,
+ 1, 349, 38115, 3, 1431, 23873, 2495, 24854, 3734, 3963,
+ 3, 2396, 33033, 2482, 39857, 2522, 11642, 1, 157, 7834,
+ 3, 153, 31091, 444, 59886, 1913, 33259, 1, 1508, 54252,
+ 2, 1333, 32066, 3949, 51343, 1, 1497, 24348, 1, 1466,
+59923, 2, 797, 10258, 2654, 46497, 1, 2189, 62516, 1,
+ 3570, 3384, 1, 379, 10684, 2, 2632, 13392, 3948, 54007,
+ 1, 1077, 17711, 1, 2501, 1724, 1, 1202, 51802, 1,
+ 3405, 22099, 1, 1398, 47398, 1, 1310, 27884, 2, 1249,
+39103, 1538, 57292, 1, 2631, 20135, 1, 122, 2050, 2,
+ 184, 60554, 2297, 53036, 1, 78, 36166, 3, 1433, 38680,
+ 2237, 11736, 3664, 35356, 2, 2863, 16483, 3571, 57055, 1,
+ 3066, 14218, 1, 2687, 5984, 1, 3559, 58445, 1, 1382,
+49698, 2, 1076, 24723, 1533, 41600, 2, 2568, 48096, 3957,
+ 1715, 2, 1237, 58624, 1542, 59085, 3, 2565, 36867, 2955,
+26024, 4030, 13884, 2, 1394, 36993, 4264, 46721, 2, 1108,
+56720, 4290, 46721, 4, 1149, 50235, 1546, 12322, 3984, 11151,
+ 4316, 46721, 2, 1824, 6474, 4342, 46721, 3, 483, 63297,
+ 1160, 13153, 4368, 46721, 2, 922, 53527, 4394, 46721, 4,
+ 701, 52348, 1523, 38807, 2113, 49999, 4420, 46721, 3, 1364,
+59133, 2952, 16451, 3977, 10640, 2, 3252, 52617, 4492, 53860,
+ 3, 2681, 34649, 2833, 32011, 4517, 53860, 3, 9, 28902,
+ 505, 19875, 4542, 53860, 2, 2254, 57095, 4567, 53860, 6,
+ 499, 25423, 1702, 52305, 1921, 55045, 2746, 26425, 2959, 31483,
+ 4592, 53860, 2, 2266, 36037, 4617, 53860, 2, 2443, 23314,
+ 4642, 53860, 1, 4667, 53860, 2, 1536, 11857, 2194, 7784,
+ 1, 1467, 20669, 1, 2174, 58793, 1, 3904, 53208, 1,
+ 1452, 39563, 1, 173, 2601, 1, 1311, 26968, 1, 285,
+31308, 1, 208, 3502, 1, 90, 15725, 1, 3299, 2127,
+ 1, 1131, 36073, 3, 3271, 22486, 3396, 47886, 3988, 42143,
+ 1, 41, 20221, 2, 487, 28331, 3464, 20531, 1, 711,
+33156, 3, 971, 43496, 2310, 50119, 2881, 25128, 3, 307,
+39597, 1272, 36400, 4020, 12836, 1, 3472, 9231, 1, 4041,
+57180, 3, 1611, 32355, 1692, 10686, 3582, 46492, 3, 1315,
+61757, 1935, 36078, 3398, 63075, 1, 2508, 11960, 1, 1371,
+ 3618, 2, 316, 48827, 3741, 17262, 2, 802, 15241, 1803,
+ 6388, 1, 803, 15241, 2, 147, 5275, 2686, 56998, 1,
+ 715, 60130, 1, 2685, 26508, 1, 422, 3140, 1, 3371,
+32477, 1, 586, 31638, 1, 3953, 32360, 2, 1368, 51849,
+ 3309, 13877, 1, 1387, 55141, 1, 1758, 63757, 4, 735,
+30736, 1164, 41014, 2530, 6788, 4493, 59846, 3, 2786, 49033,
+ 2842, 57580, 4518, 59846, 2, 2875, 33198, 4543, 59846, 2,
+ 2813, 64351, 4568, 59846, 2, 530, 57537, 4593, 59846, 1,
+ 4618, 59846, 5, 164, 22512, 2677, 18709, 2772, 11069, 3441,
+50761, 4643, 59846, 2, 966, 57375, 4668, 59846, 1, 2557,
+30964, 1, 348, 57334, 1, 3890, 9021, 1, 588, 26692,
+ 1, 1986, 19807, 1, 775, 28596, 2, 2710, 26857, 3537,
+34439, 2, 2441, 10784, 3536, 47158, 1, 2464, 21224, 3,
+ 540, 53587, 1591, 31890, 2269, 1271, 2, 1324, 10930, 3709,
+ 8184, 1, 4488, 57122, 2, 3075, 39258, 4513, 57122, 1,
+ 4538, 57122, 3, 1191, 53342, 1855, 10185, 4563, 57122, 2,
+ 1225, 41828, 4588, 57122, 3, 928, 12281, 3704, 33611, 4613,
+57122, 1, 4638, 57122, 2, 132, 56913, 4663, 57122, 2,
+ 2471, 62235, 3126, 12882, 2, 1761, 31502, 1912, 5594, 2,
+ 2159, 31234, 2476, 41423, 2, 983, 3589, 3701, 16048, 1,
+ 346, 52106, 3, 353, 9807, 1373, 13503, 3467, 36393, 1,
+ 569, 5041, 1, 245, 4278, 1, 3649, 4983, 2, 926,
+38965, 2596, 13356, 3, 237, 11602, 1481, 50802, 3914, 37975,
+ 2, 2181, 51264, 4015, 857, 1, 2127, 30205, 1, 2747,
+56181, 1, 283, 21533, 1, 918, 31853, 3, 907, 9771,
+ 1937, 4572, 3186, 50618, 3, 2158, 11622, 3150, 23665, 3432,
+57577, 1, 2122, 8407, 1, 1885, 10841, 1, 888, 23387,
+ 1, 215, 40461, 2, 3078, 26170, 4473, 43633, 3, 1686,
+24854, 2308, 39677, 2534, 49243, 1, 3359, 39960, 2, 1505,
+31297, 3124, 31235, 1, 83, 11735, 2, 12, 58971, 3243,
+59089, 1, 552, 55999, 2, 421, 61013, 1320, 57216, 1,
+ 2950, 1881, 1, 537, 4316, 1, 60, 52612, 2, 1745,
+23585, 2012, 52044, 1, 2450, 50726, 1, 2088, 1513, 3,
+ 2617, 50022, 2787, 57757, 3135, 980, 2, 1031, 45832, 1499,
+62842, 1, 103, 22765, 1, 3928, 59991, 2, 1376, 58633,
+ 3508, 9578, 2, 96, 22961, 903, 32809, 2, 946, 44751,
+ 3034, 11611, 1, 1000, 49024, 2, 639, 30732, 1902, 16694,
+ 1, 826, 65131, 1, 2848, 53992, 1, 1304, 42453, 1,
+ 2460, 37491, 2, 3107, 43267, 3656, 3129, 2, 1567, 51925,
+ 2625, 54304, 1, 1512, 26319, 1, 1852, 10573, 1, 2655,
+23628, 1, 2007, 19350, 1, 4033, 620, 2, 2581, 6259,
+ 3556, 36681, 1, 757, 37900, 1, 3994, 8122, 3, 593,
+27047, 2046, 14524, 2251, 50411, 1, 878, 8618, 1, 241,
+ 928, 4, 38, 17788, 1687, 51034, 2604, 36875, 3794, 60130,
+ 2, 965, 40317, 1109, 7911, 1, 1440, 31032, 3, 2640,
+24984, 3021, 16021, 3869, 35964, 2, 199, 64022, 1887, 53812,
+ 1, 2827, 21123, 2, 482, 24026, 1544, 61935, 1, 3684,
+53203, 2, 70, 11652, 2942, 7687, 1, 2201, 33613, 2,
+ 1241, 34431, 2559, 21740, 2, 770, 64043, 1103, 60546, 1,
+ 2267, 14619, 1, 1457, 14230, 2, 3281, 33269, 3476, 51360,
+ 1, 3727, 17353, 2, 300, 8393, 3992, 55224, 1, 197,
+46716, 4, 342, 36554, 944, 41352, 1613, 33615, 2121, 50574,
+ 2, 1552, 1474, 3056, 6226, 1, 3697, 43604, 1, 3978,
+10627, 1, 1354, 42985, 1, 3351, 33401, 2, 620, 55163,
+ 948, 23624, 1, 3672, 7373, 2, 2018, 55571, 3312, 41015,
+ 2, 3635, 51428, 3945, 51563, 1, 3632, 42312, 1, 234,
+18914, 1, 2097, 39305, 1, 4487, 42399, 1, 4512, 42399,
+ 1, 4537, 42399, 1, 4562, 42399, 2, 3558, 32507, 4587,
+42399, 3, 1349, 23932, 3530, 37659, 4612, 42399, 1, 4637,
+42399, 2, 1158, 56194, 4662, 42399, 1, 950, 15950, 1,
+ 3551, 28137, 1, 1078, 28256, 1, 725, 32344, 1, 2039,
+15310, 2, 1956, 59925, 2403, 51881, 1, 3470, 9180, 1,
+ 2246, 4121, 2, 2919, 45394, 3381, 18597, 1, 2646, 64212,
+ 2, 2040, 50078, 3736, 6837, 2, 3146, 10667, 3806, 65531,
+ 3, 1401, 56372, 2826, 2382, 3180, 38498, 1, 1877, 28876,
+ 1, 2497, 56453, 1, 3192, 29119, 3, 134, 44684, 1787,
+58199, 3669, 22990, 3, 2720, 34179, 2760, 49025, 3311, 2398,
+ 3, 2048, 54240, 2225, 25526, 4504, 37428, 1, 4529, 37428,
+ 2, 2951, 55182, 4554, 37428, 1, 4579, 37428, 2, 3176,
+21145, 4604, 37428, 4, 298, 34671, 2123, 3991, 3636, 19948,
+ 4629, 37428, 1, 4654, 37428, 4, 2634, 46305, 3483, 61106,
+ 4050, 34272, 4679, 37428, 2, 563, 27881, 4076, 34272, 4,
+ 5, 24899, 692, 36623, 4102, 34272, 4481, 55732, 1, 4128,
+34272, 5, 1213, 37500, 3588, 8366, 3799, 6842, 3895, 17221,
+ 4154, 34272, 3, 900, 64033, 1660, 64522, 4180, 34272, 2,
+ 2915, 56536, 4206, 34272, 1, 4232, 34272, 2, 1348, 65066,
+ 3905, 29407, 1, 3378, 14515, 1, 3993, 53767, 1, 3707,
+ 8243, 1, 827, 48068, 1, 845, 6670, 1, 1276, 44690,
+ 3, 571, 24673, 1346, 57657, 4059, 20471, 2, 435, 60390,
+ 4085, 20471, 2, 3545, 28711, 4111, 20471, 1, 4137, 20471,
+ 1, 4163, 20471, 1, 4189, 20471, 1, 4215, 20471, 1,
+ 4241, 20471, 1, 1734, 28257, 4, 214, 64296, 1588, 17244,
+ 2524, 2099, 2662, 3496, 1, 2553, 26913, 1, 789, 22224,
+ 1, 3810, 55000, 1, 3796, 33537, 2, 3199, 64168, 3880,
+16012, 2, 736, 19661, 2733, 21454, 1, 128, 60087, 1,
+ 3627, 49194, 3, 286, 59165, 2956, 52867, 3828, 38568, 3,
+ 1238, 42832, 1786, 29140, 1964, 23040, 1, 192, 19872, 1,
+ 1646, 43949, 1, 3580, 43460, 1, 383, 40472, 2, 55,
+60951, 1221, 1772, 2, 562, 2584, 589, 20723, 3, 340,
+42986, 781, 13656, 1345, 31204, 3, 634, 13471, 2635, 43395,
+ 3208, 15598, 3, 1849, 59009, 2358, 42204, 3739, 23431, 1,
+ 829, 64927, 1, 2620, 11745, 1, 493, 14479, 1, 4690,
+47091, 2, 1882, 36094, 4715, 47091, 3, 1819, 52412, 2078,
+24497, 4740, 47091, 3, 1057, 53982, 2304, 64607, 4765, 47091,
+ 1, 4790, 47091, 1, 4815, 47091, 3, 2184, 47234, 2191,
+45452, 4840, 47091, 1, 3910, 56320, 1, 2980, 28235, 1,
+ 2035, 27398, 1, 535, 38521, 2, 2853, 18812, 3275, 51992,
+ 2, 2493, 2219, 2819, 44084, 1, 2252, 354, 1, 869,
+43854, 3, 870, 35849, 1638, 61825, 2492, 38211, 2, 2284,
+17863, 2895, 44237, 1, 3710, 65176, 2, 469, 8791, 3151,
+15298, 4, 470, 8791, 689, 2864, 2419, 50537, 3040, 5494,
+ 1, 4266, 23087, 2, 2574, 62926, 4292, 23087, 2, 3830,
+15305, 4318, 23087, 5, 189, 50447, 1414, 16592, 1491, 35413,
+ 3615, 56124, 4344, 23087, 1, 4370, 23087, 4, 207, 4871,
+ 225, 34671, 2231, 24415, 4396, 23087, 2, 1200, 34981, 4422,
+23087, 1, 248, 30758, 4, 366, 39877, 1520, 56993, 2223,
+14258, 3959, 13480, 3, 2376, 36765, 2997, 13730, 3763, 53648,
+ 1, 2219, 8331, 2, 386, 41233, 2319, 33524, 1, 3925,
+ 3585, 1, 1511, 30239, 2, 679, 63901, 1670, 48256, 1,
+ 1681, 47250, 2, 311, 54392, 2680, 14110, 1, 527, 23819,
+ 1, 1911, 40475, 1, 1990, 19570, 1, 3340, 22053, 2,
+ 216, 53242, 1700, 3958, 3, 2133, 4655, 3442, 32352, 3454,
+49972, 1, 2074, 13421, 1, 2490, 22471, 1, 2541, 50124,
+ 1, 764, 22068, 1, 1998, 22476, 1, 462, 8886, 1,
+ 1506, 10110, 1, 2519, 40983, 1, 2105, 61262, 1, 3875,
+ 3921, 1, 4006, 16949, 1, 2742, 40615, 1, 1751, 41960,
+ 1, 3142, 47038, 1, 691, 9667, 2, 824, 52415, 3006,
+49767, 1, 4474, 17164, 2, 2504, 43056, 3343, 36085, 1,
+ 2400, 37590, 1, 794, 49235, 1, 3921, 29943, 1, 1949,
+ 4261, 2, 1177, 59313, 2118, 5725, 2, 25, 18807, 1600,
+24059, 1, 2264, 20291, 1, 2602, 46502, 1, 3852, 56842,
+ 1, 221, 25805, 1, 3930, 20481, 4, 1589, 49315, 1688,
+50003, 2249, 59103, 3462, 25738, 1, 2374, 39134, 1, 1142,
+62960, 1, 1809, 29133, 2, 2131, 36075, 2811, 57674, 1,
+ 1717, 14532, 2, 3051, 24570, 3807, 31336, 2, 1642, 36844,
+ 2690, 37532, 1, 3379, 3472, 1, 1130, 51830, 1, 1905,
+60427, 1, 2322, 45766, 1, 1649, 24763, 3, 495, 46733,
+ 1034, 47568, 3599, 30027, 4, 584, 62726, 1264, 65304, 3125,
+23608, 3902, 62771, 1, 570, 53647, 2, 795, 49235, 2843,
+34314, 1, 2796, 32903, 2, 2610, 64671, 3575, 28997, 1,
+ 1299, 13141, 2, 3608, 42598, 3784, 53867, 1, 1285, 45574,
+ 1, 3749, 62391, 1, 1453, 18132, 3, 1615, 54126, 2313,
+20521, 2971, 12816, 1, 597, 7601, 1, 2570, 40420, 1,
+ 2533, 11625, 1, 171, 49484, 1, 1395, 5774, 1, 2044,
+55961, 1, 465, 45567, 1, 2579, 15232, 1, 4496, 43632,
+ 2, 2300, 56853, 4521, 43632, 1, 4546, 43632, 1, 4571,
+43632, 2, 3547, 8172, 4596, 43632, 1, 4621, 43632, 1,
+ 4646, 43632, 4, 1482, 3086, 1836, 46396, 3484, 2208, 4671,
+43632, 1, 3708, 5622, 1, 3394, 15334, 1, 4469, 56406,
+ 1, 4051, 43911, 1, 4077, 43911, 2, 2693, 37849, 4103,
+43911, 2, 1651, 21082, 4129, 43911, 1, 4155, 43911, 5,
+ 529, 45970, 1581, 42678, 2240, 63519, 4181, 43911, 4458, 11743,
+ 2, 2426, 32593, 4207, 43911, 2, 2717, 48952, 4233, 43911,
+ 1, 940, 59441, 1, 4697, 46703, 3, 1576, 12478, 3364,
+ 8213, 4722, 46703, 1, 4747, 46703, 3, 2382, 15183, 3459,
+63297, 4772, 46703, 2, 2138, 43585, 4797, 46703, 1, 4822,
+46703, 1, 4847, 46703, 1, 3980, 57715, 3, 370, 20679,
+ 2355, 33576, 3323, 3467, 2, 115, 54960, 2644, 62908, 1,
+ 280, 6342, 2, 1739, 53020, 3330, 48673, 2, 1572, 60837,
+ 3909, 16512, 1, 3761, 64254, 1, 989, 54540, 2, 398,
+54753, 3604, 15348, 1, 3123, 3189, 1, 3568, 54059, 2,
+ 1254, 6973, 1573, 36791, 1, 284, 4190, 2, 228, 30590,
+ 1667, 53383, 2, 2280, 28218, 3514, 50461, 1, 1522, 1052,
+ 1, 2520, 17624, 2, 2840, 39993, 3134, 21416, 1, 2093,
+ 3982, 2, 1068, 23685, 2115, 37318, 1, 1881, 51662, 2,
+ 2206, 18365, 3662, 45267, 2, 1111, 5993, 3237, 27723, 2,
+ 825, 64545, 1388, 59884, 2, 2157, 4429, 2338, 28932, 2,
+ 2089, 51623, 2730, 41613, 2, 367, 46067, 3773, 38424, 3,
+ 3366, 46717, 3382, 47873, 3518, 571, 1, 3269, 45099, 1,
+ 4016, 48116, 2, 185, 54947, 1350, 8609, 1, 4694, 19359,
+ 1, 4719, 19359, 4, 312, 58227, 423, 41629, 1719, 44342,
+ 4744, 19359, 1, 4769, 19359, 2, 1120, 13084, 4794, 19359,
+ 1, 4819, 19359, 1, 4844, 19359, 1, 862, 7104, 2,
+ 150, 11387, 1169, 38977, 2, 1799, 64539, 3081, 26205, 2,
+ 3286, 29903, 3907, 10989, 1, 1848, 14115, 4, 410, 55682,
+ 1400, 8221, 1480, 1228, 4062, 5895, 2, 2756, 51250, 4088,
+ 5895, 4, 1193, 19448, 2398, 2549, 3733, 48663, 4114, 5895,
+ 3, 1281, 44293, 3139, 30856, 4140, 5895, 4, 898, 22696,
+ 2171, 59669, 3889, 62955, 4166, 5895, 3, 1795, 32873, 3488,
+38573, 4192, 5895, 3, 604, 33697, 3334, 31260, 4218, 5895,
+ 2, 3868, 58342, 4244, 5895, 1, 2932, 50664, 1, 745,
+ 4606, 2, 2330, 31310, 4065, 41419, 1, 4091, 41419, 1,
+ 4117, 41419, 2, 3490, 6371, 4143, 41419, 2, 1759, 36994,
+ 4169, 41419, 3, 1724, 42748, 4195, 41419, 4491, 38472, 4,
+ 2276, 36207, 3102, 10539, 4221, 41419, 4516, 38472, 4, 2038,
+16531, 2178, 61512, 4247, 41419, 4541, 38472, 2, 1616, 56096,
+ 4566, 38472, 3, 1, 48137, 1105, 17590, 4591, 38472, 1,
+ 4616, 38472, 3, 713, 40683, 1801, 36736, 4641, 38472, 1,
+ 4666, 38472, 2, 1939, 5907, 3693, 62772, 1, 47, 25514,
+ 2, 1666, 14334, 2657, 24053, 3, 1524, 15230, 2944, 1967,
+ 3839, 17587, 1, 2679, 24361, 4, 7, 1918, 426, 26948,
+ 1748, 47858, 2605, 22177, 2, 2333, 46868, 3291, 18200, 3,
+ 1151, 23196, 1190, 8989, 2430, 5117, 1, 3035, 26919, 2,
+ 67, 38570, 3584, 36425, 3, 2060, 17416, 2116, 31153, 2623,
+44582, 2, 1330, 60614, 3429, 41952, 1, 3218, 45766, 1,
+ 2017, 25273, 2, 126, 13428, 3437, 7944, 1, 690, 55786,
+ 1, 3791, 65124, 1, 2582, 33764, 3, 332, 6580, 1448,
+ 5512, 1914, 28055, 1, 3149, 12440, 2, 2731, 2740, 3236,
+54903, 1, 2814, 25562, 2, 2820, 26745, 3987, 30115, 1,
+ 915, 48012, 1, 3105, 17993, 1, 3147, 43448, 3, 522,
+45886, 611, 27797, 2135, 23107, 1, 119, 48129, 1, 3646,
+27910, 1, 1065, 56754, 2, 1406, 16267, 1643, 33506, 1,
+ 1838, 11591, 1, 3838, 30091, 1, 722, 21547, 2, 288,
+53389, 2716, 2142, 1, 206, 19254, 3, 104, 53695, 1683,
+30262, 1920, 6857, 3, 253, 20355, 982, 49113, 1728, 3456,
+ 1, 1541, 55988, 2, 1081, 8822, 1476, 62300, 1, 3127,
+ 3580, 2, 1207, 4965, 3534, 37110, 1, 1679, 24550, 1,
+ 3049, 40700, 1, 2461, 30490, 1, 3294, 18573, 1, 2661,
+36062, 1, 710, 40123, 1, 3072, 26117, 2, 3543, 18216,
+ 3735, 42809, 1, 4001, 52927, 1, 2477, 50744, 1, 3313,
+ 4806, 3, 1580, 3685, 2714, 30577, 2883, 63346, 2, 3251,
+45806, 4269, 47296, 3, 1236, 39999, 2925, 25567, 4295, 47296,
+ 2, 3509, 50890, 4321, 47296, 4, 2566, 61588, 3145, 17393,
+ 3894, 51927, 4347, 47296, 3, 666, 20552, 2740, 62125, 4373,
+47296, 1, 4399, 47296, 2, 1154, 11676, 4425, 47296, 1,
+ 3917, 47344, 3, 242, 23991, 1673, 25670, 2636, 44340, 1,
+ 2867, 57719, 1, 2263, 5006, 2, 1087, 5237, 3703, 644,
+ 1, 2226, 35922, 4, 1866, 11146, 2209, 59776, 2325, 58501,
+ 2678, 18372, 1, 4063, 23945, 1, 4089, 23945, 1, 4115,
+23945, 1, 4141, 23945, 2, 850, 28024, 4167, 23945, 4,
+ 40, 33038, 1152, 12972, 1598, 45099, 4193, 23945, 1, 4219,
+23945, 2, 2352, 57088, 4245, 23945, 1, 2481, 63799, 2,
+ 547, 36226, 3542, 57741, 1, 1691, 16177, 1, 3420, 59842,
+ 2, 3813, 54821, 4470, 27077, 1, 1945, 61191, 2, 2023,
+60810, 2068, 22592, 2, 3011, 4503, 4465, 19180, 1, 2816,
+27337, 1, 3747, 39426, 1, 3815, 48871, 1, 3780, 30697,
+ 2, 1140, 30525, 3790, 64561, 1, 2550, 6188, 1, 362,
+23845, 3, 3010, 8809, 3104, 41922, 3352, 29734, 1, 3819,
+24933, 1, 2160, 64323, 1, 4270, 63477, 2, 1047, 41615,
+ 4296, 63477, 1, 4322, 63477, 2, 637, 39900, 4348, 63477,
+ 2, 3691, 28028, 4374, 63477, 1, 4400, 63477, 1, 4426,
+63477, 1, 218, 12834, 1, 3361, 36872, 1, 2164, 2916,
+ 1, 1933, 18171, 1, 747, 63995, 5, 1327, 50415, 1657,
+26886, 2392, 24087, 2899, 46392, 4693, 8848, 1, 4718, 8848,
+ 2, 3273, 45290, 4743, 8848, 2, 847, 49083, 4768, 8848,
+ 2, 2989, 3131, 4793, 8848, 2, 4053, 26085, 4818, 8848,
+ 3, 885, 37670, 4079, 26085, 4843, 8848, 2, 3764, 17068,
+ 4105, 26085, 3, 1554, 61144, 3229, 60891, 4131, 26085, 1,
+ 4157, 26085, 1, 4183, 26085, 2, 782, 37657, 4209, 26085,
+ 5, 472, 38326, 496, 31546, 930, 6913, 3324, 54793, 4235,
+26085, 1, 497, 31546, 2, 489, 31546, 4861, 19242, 1,
+ 3317, 8484, 1, 3795, 14725, 1, 198, 2394, 1, 2860,
+47606, 2, 947, 8868, 2807, 21976, 3, 1036, 63089, 1393,
+12311, 4066, 34188, 3, 382, 34958, 2412, 35894, 4092, 34188,
+ 1, 4118, 34188, 1, 4144, 34188, 1, 4170, 34188, 4,
+ 238, 3567, 1051, 40442, 3489, 50434, 4196, 34188, 1, 4222,
+34188, 2, 1284, 31150, 4248, 34188, 1, 94, 19959, 1,
+ 1930, 39849, 1, 3503, 57178, 2, 359, 62397, 3844, 25261,
+ 1, 46, 26313, 1, 906, 23839, 2, 511, 51223, 876,
+55652, 2, 914, 9102, 3685, 34061, 1, 1977, 60734, 1,
+ 1816, 13080, 1, 246, 65087, 3, 372, 40242, 917, 60379,
+ 3652, 27734, 2, 1490, 6071, 2279, 37872, 3, 1802, 4399,
+ 2315, 22842, 2627, 5571, 2, 561, 52498, 1101, 12995, 2,
+ 984, 39587, 1403, 16230, 2, 1754, 8662, 2406, 2684, 2,
+ 2738, 16708, 3748, 26502, 1, 2668, 36121, 3, 419, 20497,
+ 891, 42321, 941, 37568, 1, 165, 46167, 1, 268, 11984,
+ 3, 880, 40346, 1303, 47910, 1952, 31350, 3, 3221, 23164,
+ 3247, 23084, 4055, 52618, 1, 4081, 52618, 1, 4107, 52618,
+ 3, 1946, 51547, 2931, 14338, 4133, 52618, 1, 4159, 52618,
+ 1, 4185, 52618, 3, 1460, 40727, 2518, 21870, 4211, 52618,
+ 3, 2140, 12730, 3057, 55334, 4237, 52618, 1, 18, 52003,
+ 2, 1540, 61754, 2066, 42341, 3, 317, 20825, 2311, 55375,
+ 2823, 23737, 2, 1436, 63752, 4456, 25365, 1, 3940, 60334,
+ 2, 769, 15830, 1339, 32042, 1, 1181, 36810, 3, 176,
+ 9374, 1182, 36810, 2179, 44321, 2, 1183, 36810, 3242, 10465,
+ 3, 270, 29685, 1124, 7310, 2466, 43320, 1, 3375, 15943,
+ 1, 3754, 49654, 1, 1682, 51604, 1, 3853, 33304, 2,
+ 633, 29883, 762, 57990, 1, 1208, 55332, 1, 68, 50637,
+ 3, 1129, 2051, 1218, 22054, 3195, 58494, 1, 871, 26965,
+ 1, 3129, 46073, 1, 872, 18960, 2, 1061, 4878, 3671,
+20159, 3, 1405, 9608, 1418, 59915, 1534, 57852, 1, 3430,
+54613, 1, 4445, 60935, 1, 3937, 4469, 3, 2360, 6396,
+ 2489, 50987, 4054, 63084, 1, 4080, 63084, 3, 2904, 41874,
+ 3874, 43791, 4106, 63084, 1, 4132, 63084, 2, 1551, 60631,
+ 4158, 63084, 1, 4184, 63084, 2, 1867, 44483, 4210, 63084,
+ 1, 4236, 63084, 3, 1179, 11417, 1184, 36810, 3363, 61765,
+ 1, 1185, 36810, 1, 1098, 6114, 1, 2924, 14973, 3,
+ 217, 55853, 2096, 51876, 3220, 56305, 1, 875, 10711, 2,
+ 1375, 25011, 3383, 62949, 3, 2242, 12767, 2348, 45570, 2638,
+10376, 1, 2788, 28562, 2, 2071, 21224, 3924, 8540, 1,
+ 2143, 65162, 2, 901, 52922, 4444, 25934, 3, 399, 7574,
+ 1135, 58553, 3897, 38993, 1, 605, 15290, 1, 3606, 21043,
+ 1, 3360, 64707, 2, 2737, 61521, 4503, 10836, 2, 1594,
+20895, 4528, 10836, 3, 1082, 40973, 2540, 61158, 4553, 10836,
+ 1, 4578, 10836, 1, 4603, 10836, 1, 4628, 10836, 3,
+ 2591, 21447, 3148, 44195, 4653, 10836, 2, 3585, 45632, 4678,
+10836, 3, 194, 1478, 1410, 57051, 3973, 20584, 1, 2302,
+ 3225, 1, 1186, 36810, 1, 2465, 50155, 2, 1769, 45886,
+ 2595, 43202, 2, 1898, 19916, 3848, 39939, 2, 1915, 17947,
+ 2299, 32491, 2, 512, 1159, 607, 56196, 1, 1250, 2410,
+ 2, 1159, 45125, 2578, 28572, 1, 2940, 59084, 1, 3628,
+36937, 1, 4009, 38712, 2, 1847, 39734, 3055, 1017, 1,
+ 2447, 5691, 3, 1471, 59363, 1869, 24892, 4036, 4150, 2,
+ 785, 26484, 2409, 2826, 3, 260, 30636, 2898, 35487, 4003,
+45352, 2, 2148, 61425, 3752, 19409, 1, 2544, 36887, 3,
+ 2498, 43976, 3266, 10290, 3416, 24159, 1, 1209, 13086, 1,
+ 3975, 45877, 3, 343, 41925, 1590, 52511, 2364, 42347, 1,
+ 2734, 49513, 2, 1297, 55200, 2256, 61086, 1, 3732, 26600,
+ 1, 509, 61284, 2, 352, 54190, 3298, 59971, 1, 3653,
+35949, 1, 1537, 14272, 1, 3431, 15711, 1, 599, 43886,
+ 1, 1146, 3560, 1, 3561, 16534, 1, 3060, 27830, 1,
+ 3809, 25046, 1, 3140, 55598, 1, 1662, 26677, 1, 3357,
+54146, 3, 455, 11988, 1640, 35271, 3846, 23943, 1, 2134,
+25198, 1, 1091, 22251, 2, 141, 35996, 1168, 54734, 2,
+ 2387, 32479, 4253, 2197, 1, 4279, 2197, 2, 2022, 32421,
+ 4305, 2197, 1, 4331, 2197, 2, 2873, 16099, 4357, 2197,
+ 1, 4383, 2197, 4, 133, 18788, 314, 55340, 1419, 64616,
+ 4409, 2197, 2, 474, 38313, 3682, 55222, 1, 2378, 46896,
+ 2, 1132, 49389, 2260, 11139, 1, 3765, 16509, 3, 809,
+20534, 3586, 40116, 3725, 9636, 1, 428, 5300, 2, 480,
+24827, 502, 58935, 3, 479, 7102, 1144, 12586, 3013, 35391,
+ 1, 3038, 13914, 1, 56, 44155, 5, 1056, 9463, 1989,
+22848, 3553, 55478, 3887, 42010, 3956, 62817, 2, 828, 61033,
+ 1634, 49545, 3, 1262, 229, 1707, 40583, 3593, 37315, 2,
+ 1148, 8852, 2170, 51674, 1, 2569, 32883, 1, 1635, 31074,
+ 2, 693, 7682, 790, 50767, 1, 2413, 45706, 1, 568,
+23831, 1, 2457, 2298, 1, 1821, 15160, 2, 378, 8612,
+ 1782, 48746, 1, 754, 50380, 2, 61, 55617, 650, 22342,
+ 2, 2652, 27136, 2916, 12345, 1, 1361, 10832, 1, 961,
+35176, 1, 767, 14113, 4, 783, 18173, 2456, 24212, 2624,
+ 5558, 3544, 50755, 1, 1976, 23988, 1, 2968, 58761, 2,
+ 1515, 54623, 3614, 8876, 1, 4271, 3768, 3, 813, 52072,
+ 3335, 15197, 4297, 3768, 4, 148, 3386, 1206, 17467, 3080,
+30697, 4323, 3768, 1, 4349, 3768, 3, 3096, 1904, 3350,
+15927, 4375, 3768, 2, 2106, 54521, 4401, 3768, 1, 4427,
+ 3768, 2, 1596, 63565, 3114, 39015, 1, 834, 21408, 1,
+ 3529, 12567, 1, 3864, 9649, 1, 780, 28412, 2, 1812,
+14606, 4459, 46848, 2, 2332, 5510, 2921, 1466, 1, 51,
+19083, 3, 45, 24707, 995, 20866, 1489, 12378, 1, 169,
+30858, 2, 258, 11547, 3510, 34063, 2, 75, 4780, 1550,
+ 861, 2, 2745, 62914, 3194, 44525, 1, 3183, 42123, 2,
+ 1864, 63104, 2418, 33073, 1, 3511, 24256, 1, 4273, 56121,
+ 2, 3461, 43364, 4299, 56121, 6, 625, 39642, 2192, 9640,
+ 2285, 13082, 2993, 36394, 3316, 60381, 4325, 56121, 2, 2084,
+12410, 4351, 56121, 2, 3234, 58080, 4377, 56121, 3, 1892,
+40648, 2483, 47547, 4403, 56121, 2, 3972, 19328, 4429, 56121,
+ 1, 4277, 23444, 4, 1862, 5298, 2588, 56114, 2889, 65501,
+ 4303, 23444, 2, 1112, 7510, 4329, 23444, 1, 4355, 23444,
+ 2, 2433, 1335, 4381, 23444, 2, 354, 61004, 4407, 23444,
+ 1, 4433, 23444, 1, 331, 46660, 4, 578, 30709, 756,
+61350, 841, 13314, 2091, 44601, 1, 2835, 59178, 2, 2065,
+46078, 2914, 55687, 1, 981, 3283, 1, 3601, 21102, 2,
+ 515, 19054, 3866, 6411, 1, 2911, 4870, 1, 2615, 40733,
+ 2, 2448, 28536, 3029, 10824, 1, 1851, 18914, 2, 955,
+55552, 3337, 49564, 2, 1008, 17868, 3781, 6304, 2, 1450,
+55466, 3419, 36756, 1, 102, 17546, 2, 1134, 29691, 2974,
+58594, 1, 1267, 54000, 2, 628, 52957, 2818, 4308, 2,
+ 8, 36679, 3779, 56955, 2, 3259, 26806, 3486, 10083, 1,
+ 2316, 10492, 2, 1454, 34217, 3189, 19098, 1, 259, 923,
+ 1, 3458, 21243, 2, 137, 8519, 3061, 17426, 1, 623,
+11283, 1, 2523, 4300, 3, 1128, 2521, 4256, 52736, 4685,
+11827, 3, 3212, 47122, 4282, 52736, 4710, 11827, 2, 4308,
+52736, 4735, 11827, 2, 4334, 52736, 4760, 11827, 3, 3174,
+19575, 4360, 52736, 4785, 11827, 4, 1381, 9723, 3098, 22343,
+ 4386, 52736, 4810, 11827, 3, 1947, 62865, 4412, 52736, 4835,
+11827, 2, 823, 25768, 2991, 45132, 3, 556, 15741, 2354,
+57132, 3613, 19778, 1, 3515, 31319, 1, 2584, 11405, 2,
+ 2868, 19175, 4443, 55082, 1, 2442, 6109, 1, 2721, 2693,
+ 1, 1796, 16572, 1, 699, 19760, 1, 294, 55939, 4,
+ 1740, 60224, 1959, 63875, 2886, 61866, 3020, 19958, 3, 1473,
+27237, 2379, 21316, 2822, 25725, 1, 2314, 26371, 2, 135,
+24943, 205, 44118, 1, 3526, 55394, 1, 3822, 64610, 2,
+ 643, 6465, 3731, 26659, 2, 2828, 15270, 3067, 43119, 1,
+ 2161, 45515, 1, 4477, 12332, 1, 322, 3436, 2, 798,
+45467, 1138, 18562, 1, 2626, 37445, 2, 1694, 31035, 3663,
+52621, 1, 1257, 1367, 3, 1674, 32965, 1808, 23340, 3226,
+52320, 1, 1735, 1382, 2, 852, 7733, 957, 1335, 2,
+ 2025, 13892, 3998, 20205, 2, 130, 51386, 1396, 64281, 2,
+ 1119, 50377, 2021, 5865, 1, 2162, 28874, 3, 62, 41330,
+ 2432, 63359, 4263, 32474, 2, 1645, 43367, 4289, 32474, 1,
+ 4315, 32474, 3, 449, 3220, 2576, 11021, 4341, 32474, 1,
+ 4367, 32474, 2, 3214, 47440, 4393, 32474, 2, 842, 6387,
+ 4419, 32474, 3, 3177, 61022, 3549, 35968, 4862, 35567, 1,
+ 2650, 24122, 3, 732, 63843, 776, 40328, 2312, 61255, 1,
+ 2859, 19043, 2, 244, 13498, 2320, 65473, 3, 712, 33160,
+ 822, 59593, 3160, 22511, 3, 229, 47690, 1709, 5127, 3070,
+51830, 2, 1094, 34673, 3631, 17310, 1, 1277, 65152, 4,
+ 904, 17211, 988, 29496, 1543, 41146, 2527, 47012, 2, 2054,
+ 8967, 2601, 24344, 1, 3522, 57726, 1, 1896, 33847, 1,
+ 1074, 28533, 2, 548, 28941, 2514, 45750, 2, 916, 48078,
+ 3030, 64423, 2, 2130, 45499, 2618, 55994, 1, 1928, 38808,
+ 1, 1727, 28786, 1, 618, 45466, 4, 326, 65044, 925,
+10619, 2045, 42492, 4275, 10158, 1, 4301, 10158, 1, 4327,
+10158, 5, 2589, 28423, 2998, 61831, 3555, 55537, 3912, 21657,
+ 4353, 10158, 2, 2709, 26710, 4379, 10158, 1, 4405, 10158,
+ 2, 2672, 8985, 4431, 10158, 1, 2732, 61080, 2, 2785,
+15674, 2908, 8281, 2, 14, 31121, 2153, 43730, 2, 784,
+29529, 1328, 52402, 1, 4026, 31755, 2, 1560, 54603, 2571,
+47645, 1, 1232, 44176, 2, 3241, 49454, 3640, 38543, 2,
+ 1187, 60132, 1472, 8268, 1, 3425, 44374, 2, 3843, 23744,
+ 3855, 60955, 1, 951, 3250, 2, 964, 7495, 2175, 41426,
+ 1, 526, 25327, 3, 29, 55180, 1991, 61185, 3771, 25830,
+ 1, 467, 9083, 1, 1984, 464, 1, 1408, 46786, 2,
+ 945, 56983, 3512, 24227, 2, 321, 54417, 3724, 268, 1,
+ 4691, 24406, 1, 4716, 24406, 3, 320, 48639, 2728, 34923,
+ 4741, 24406, 4, 886, 62321, 3392, 61214, 4766, 24406, 4870,
+ 9940, 1, 4791, 24406, 1, 4816, 24406, 3, 2228, 55263,
+ 3033, 20225, 4841, 24406, 1, 3027, 4313, 4, 1319, 27166,
+ 1631, 57802, 1663, 29797, 4057, 36921, 1, 4083, 36921, 2,
+ 431, 30233, 4109, 36921, 2, 774, 60768, 4135, 36921, 1,
+ 4161, 36921, 1, 4187, 36921, 1, 4213, 36921, 2, 281,
+26823, 4239, 36921, 1, 4013, 24644, 4, 105, 45106, 1033,
+58122, 2995, 49562, 3206, 47552, 2, 566, 23671, 2277, 35765,
+ 2, 178, 12248, 1737, 24050, 1, 2397, 57371, 1, 929,
+25730, 1, 2975, 22924, 1, 120, 10592, 1, 2630, 62130,
+ 2, 2474, 43380, 2748, 59620, 1, 2281, 59123, 3, 564,
+20421, 1557, 18211, 2802, 6940, 3, 1768, 63992, 3600, 8683,
+ 4447, 16169, 2, 201, 45668, 1619, 57266, 2, 2555, 11635,
+ 3028, 25744, 1, 335, 8419, 4, 371, 29110, 1102, 27055,
+ 1744, 38532, 2002, 50561, 3, 220, 58908, 1421, 25167, 2425,
+33025, 2, 1874, 65518, 2334, 53273, 1, 3523, 32392, 1,
+ 815, 4911, 1, 560, 20557, 1, 2307, 19945, 1, 1009,
+53702, 1, 2187, 65080, 1, 635, 15112, 2, 1235, 64079,
+ 3248, 61848, 2, 744, 7083, 882, 34444, 1, 3482, 11018,
+ 1, 2282, 51657, 2, 2394, 36974, 4452, 8420, 1, 2551,
+44381, 1, 3103, 22543, 1, 2847, 65003, 1, 1351, 39362,
+ 1, 2905, 37472, 1, 1715, 47899, 2, 2010, 4905, 3699,
+32655, 1, 63, 17228, 2, 972, 17372, 3372, 26577, 2,
+ 179, 20583, 2797, 23174, 1, 2884, 37642, 2, 2317, 9946,
+ 3064, 232, 2, 624, 33602, 743, 2693, 3, 387, 8813,
+ 1243, 45420, 1714, 10589, 1, 1390, 40950, 1, 1973, 40404,
+ 2, 477, 44361, 1568, 55540, 1, 3250, 7039, 2, 645,
+ 2981, 2198, 53021, 1, 3245, 26372, 1, 1332, 25787, 3,
+ 1708, 41500, 3304, 5203, 3979, 33749, 5, 1216, 28144, 1308,
+ 725, 1380, 26564, 2621, 30696, 3474, 9143, 4, 59, 643,
+ 1389, 61242, 1916, 48, 2011, 53681, 1, 2891, 25937, 2,
+ 1180, 31271, 2758, 21677, 1, 3376, 60733, 1, 2795, 57107,
+ 1, 4019, 15588, 2, 532, 21921, 1825, 32255, 2, 1936,
+29154, 2499, 22210, 1, 140, 4792, 1, 2341, 56410, 1,
+ 2411, 49149, 2, 2587, 54117, 2885, 29165, 2, 3436, 19283,
+ 4869, 9940, 1, 1156, 24403, 2, 2488, 65460, 2736, 36328,
+ 1, 2607, 28465, 1, 3347, 30248, 1, 1259, 14069, 1,
+ 3629, 63504, 1, 2047, 14922, 1, 2642, 29832, 3, 1609,
+40438, 2647, 42815, 3422, 36028, 3, 1167, 4955, 1231, 9419,
+ 2188, 27733, 2, 1283, 21168, 2854, 42014, 2, 1118, 57668,
+ 2111, 43773, 1, 2973, 65123, 2, 374, 51902, 3450, 45576,
+ 1, 1800, 44263, 1, 3505, 28847, 1, 3751, 4017, 2,
+ 1582, 65335, 2946, 33060, 1, 1995, 60567, 1, 640, 44791,
+ 1, 3339, 38976, 1, 1438, 14240, 1, 627, 54399, 1,
+ 3322, 30080, 1, 391, 39060, 1, 1104, 12613, 3, 1147,
+25613, 1561, 34195, 1695, 10225, 1, 2034, 32457, 2, 2268,
+53494, 2945, 31017, 2, 1052, 25292, 1620, 61106, 1, 3093,
+24164, 1, 4252, 30445, 2, 2458, 22605, 4278, 30445, 1,
+ 4304, 30445, 4, 21, 64258, 587, 22994, 4330, 30445, 4866,
+ 7130, 3, 921, 3624, 1175, 49466, 4356, 30445, 1, 4382,
+30445, 3, 3449, 8194, 4040, 12951, 4408, 30445, 2, 2386,
+34663, 2670, 1035, 1, 799, 62020, 1, 590, 43459, 2,
+ 204, 58580, 1988, 34804, 2, 3162, 32927, 3274, 29376, 1,
+ 1623, 62975, 2, 1196, 23589, 1779, 50362, 1, 3675, 29346,
+ 2, 89, 13885, 1474, 20182, 1, 3533, 2764, 3, 2321,
+ 2984, 2857, 52082, 3331, 41087, 2, 980, 62489, 1122, 32866,
+ 1, 149, 47468, 3, 3, 28480, 3327, 48618, 3891, 23331,
+ 3, 2008, 38287, 2274, 13877, 3341, 6652, 2, 2470, 27356,
+ 4012, 48247, 1, 4495, 41588, 3, 1458, 64894, 4450, 60955,
+ 4520, 41588, 2, 254, 19402, 4545, 41588, 2, 1312, 54663,
+ 4570, 41588, 1, 4595, 41588, 1, 4620, 41588, 2, 1469,
+41095, 4645, 41588, 2, 1823, 62630, 4670, 41588, 1, 1060,
+11068, 1, 1417, 41529, 2, 251, 20495, 2407, 61520, 1,
+ 1359, 51469, 1, 3084, 39036, 2, 1329, 42309, 4860, 37121,
+ 1, 490, 61013, 3, 274, 62101, 1165, 7142, 3990, 51716,
+ 1, 1718, 55553, 1, 682, 57624, 5, 1370, 22501, 1502,
+ 5061, 2345, 38056, 2933, 3857, 4500, 12331, 4, 1726, 15085,
+ 1922, 38912, 2641, 19831, 4525, 12331, 1, 4550, 12331, 3,
+ 2821, 14067, 3448, 2025, 4575, 12331, 1, 4600, 12331, 3,
+ 360, 30933, 1886, 38107, 4625, 12331, 1, 4650, 12331, 1,
+ 4675, 12331, 2, 1114, 18589, 2837, 26183, 3, 1630, 19675,
+ 2902, 6962, 3618, 53464, 1, 3755, 63757, 1, 1288, 64806,
+ 3, 1116, 7079, 2230, 19307, 2362, 6646, 1, 1873, 20170,
+ 1, 1517, 7261, 1, 4464, 52713, 1, 2698, 31849, 1,
+ 3592, 45652, 1, 113, 40063, 1, 1904, 32245, 2, 2203,
+60657, 4701, 15402, 3, 3137, 56708, 3428, 28717, 4726, 15402,
+ 1, 4751, 15402, 2, 2247, 55810, 4776, 15402, 3, 2548,
+19128, 4052, 64894, 4801, 15402, 3, 1028, 31353, 4078, 64894,
+ 4826, 15402, 3, 2205, 25054, 4104, 64894, 4851, 15402, 2,
+ 763, 64470, 4130, 64894, 2, 37, 25816, 4156, 64894, 2,
+ 1427, 62764, 4182, 64894, 2, 1955, 27109, 4208, 64894, 1,
+ 4234, 64894, 1, 3955, 28440, 2, 2015, 49668, 3759, 19248,
+ 2, 2076, 18363, 2444, 54539, 1, 356, 43059, 3, 835,
+51008, 1835, 18340, 3427, 38187, 1, 2001, 29242, 2, 2563,
+ 2318, 3745, 36163, 1, 3203, 13383, 1, 2770, 14566, 2,
+ 714, 38210, 2275, 431, 2, 66, 20767, 2600, 2619, 1,
+ 1006, 58610, 3, 324, 5675, 837, 13797, 2298, 27821, 1,
+ 1960, 13500, 2, 2033, 14082, 3540, 18906, 1, 50, 39912,
+ 1, 4688, 50028, 1, 4713, 50028, 2, 1815, 62207, 4738,
+50028, 2, 669, 14201, 4763, 50028, 1, 4788, 50028, 1,
+ 4813, 50028, 1, 4838, 50028, 2, 163, 42174, 306, 42499,
+ 1, 3225, 4881, 1, 3857, 28400, 3, 329, 11600, 451,
+46734, 1656, 15319, 1, 3338, 62626, 1, 2794, 37601, 2,
+ 1676, 12981, 2529, 12143, 2, 3044, 18026, 3900, 41776, 1,
+ 680, 2991, 2, 1015, 7333, 2926, 43601, 3, 2864, 32942,
+ 3118, 62730, 3453, 43488, 4, 2671, 47564, 3122, 8282, 3589,
+62222, 3817, 58464, 1, 2108, 58061, 1, 1723, 6586, 1,
+ 3494, 41955, 1, 3128, 11825, 3, 1197, 51292, 1334, 50382,
+ 1519, 33442, 1, 2967, 57877, 1, 3296, 28451, 1, 4060,
+38155, 2, 393, 40480, 4086, 38155, 2, 853, 35090, 4112,
+38155, 2, 3962, 20877, 4138, 38155, 2, 131, 15446, 4164,
+38155, 1, 4190, 38155, 1, 4216, 38155, 2, 406, 46707,
+ 4242, 38155, 2, 413, 46707, 2327, 34942, 2, 1775, 4996,
+ 3944, 50883, 3, 1317, 31447, 2436, 49182, 3922, 9641, 3,
+ 519, 63930, 912, 13348, 4276, 39586, 2, 1712, 64612, 4302,
+39586, 2, 2208, 55313, 4328, 39586, 4, 389, 17383, 1392,
+45661, 2452, 40399, 4354, 39586, 3, 1652, 28748, 2792, 39002,
+ 4380, 39586, 3, 211, 7605, 369, 34193, 4406, 39586, 5,
+ 612, 26687, 2806, 11374, 2990, 24721, 3368, 59418, 4432, 39586,
+ 1, 3244, 33521, 1, 3307, 44087, 1, 364, 27600, 1,
+ 3032, 9830, 1, 742, 61174, 1, 3934, 43870, 2, 190,
+29555, 2880, 65228, 3, 1671, 28090, 3187, 44250, 3941, 28159,
+ 1, 1416, 62228, 1, 397, 1030, 2, 1099, 62259, 3047,
+55878, 1, 1211, 38395, 2, 304, 3501, 2061, 19533, 3,
+ 2367, 55902, 2793, 26982, 2936, 54622, 1, 1020, 19895, 2,
+ 2214, 25010, 3776, 56871, 1, 778, 39262, 2, 2767, 57501,
+ 3789, 10936, 1, 2858, 41761, 1, 1021, 9655, 1, 4268,
+13953, 5, 124, 61178, 478, 42206, 2128, 1556, 2525, 26497,
+ 4294, 13953, 3, 1106, 33940, 3279, 61772, 4320, 13953, 4,
+ 2711, 11210, 3130, 51863, 4346, 13953, 4508, 40614, 2, 4372,
+13953, 4533, 40614, 3, 993, 24134, 4398, 13953, 4558, 40614,
+ 2, 4424, 13953, 4583, 40614, 3, 116, 20732, 1675, 39467,
+ 4608, 40614, 2, 2361, 11750, 4633, 40614, 3, 1746, 30080,
+ 3301, 34874, 4658, 40614, 1, 4683, 40614, 2, 1701, 8983,
+ 2656, 52742, 1, 1962, 1408, 3, 1337, 60558, 2897, 55137,
+ 3387, 51575, 1, 2340, 11941, 4, 2103, 792, 2329, 50225,
+ 2385, 61696, 3456, 57997, 4, 368, 4155, 1086, 60806, 1341,
+53321, 3240, 3921, 2, 2629, 4111, 3903, 21159, 4, 3121,
+31309, 3200, 32025, 3856, 60027, 3943, 59702, 2, 2606, 15092,
+ 3862, 47678, 1, 953, 14866, 1, 1725, 8177, 2, 1199,
+54477, 2073, 63793, 1, 1214, 8336, 2, 1357, 8507, 3412,
+12124, 3, 866, 60530, 1443, 51308, 2291, 49710, 1, 3492,
+25358, 1, 475, 12386, 1, 1404, 36437, 2, 766, 35935,
+ 3238, 9223, 2, 3605, 50119, 4471, 17209, 4, 1586, 43763,
+ 2831, 30401, 2894, 61593, 3264, 58729, 1, 3782, 33016, 1,
+ 2083, 8457, 1, 3622, 26426, 2, 1432, 53679, 4865, 30283,
+ 1, 1766, 31605, 3, 1756, 60143, 2217, 23331, 3336, 2279,
+ 1, 11, 19010, 2, 313, 22575, 1409, 46126, 1, 1007,
+54388, 1, 3026, 42094, 3, 616, 10789, 1778, 2833, 2705,
+47857, 1, 1730, 36041, 3, 282, 29735, 3667, 56112, 3983,
+16573, 1, 3997, 37354, 2, 1518, 17975, 3401, 64094, 1,
+ 959, 43590, 1, 606, 56074, 1, 3165, 24547, 2, 1150,
+ 2311, 2306, 62165, 2, 3493, 46271, 3502, 11341, 2, 2006,
+61021, 2744, 60996, 1, 3184, 13222, 1, 4448, 28975, 1,
+ 3079, 63185, 1, 33, 21793, 2, 1531, 52594, 2664, 15802,
+ 4, 1831, 29640, 3562, 18007, 3690, 55801, 3860, 33859, 2,
+ 3219, 35023, 3596, 30958, 2, 1777, 3302, 3326, 30969, 2,
+ 697, 51536, 2431, 40065, 1, 2190, 14645, 2, 1307, 12486,
+ 3233, 47948, 1, 3619, 48425, 1, 3591, 13672, 4, 2614,
+50525, 2752, 12658, 2893, 38183, 3393, 59414, 1, 2753, 12658,
+ 1, 895, 3339, 1, 2120, 46874, 3, 4, 23290, 142,
+14645, 1981, 49038, 2, 293, 9293, 2053, 63553, 1, 1439,
+11781, 1, 4695, 61705, 1, 4720, 61705, 1, 4745, 61705,
+ 2, 1282, 56551, 4770, 61705, 2, 2538, 6296, 4795, 61705,
+ 1, 4820, 61705, 2, 3008, 44859, 4845, 61705, 2, 2577,
+19859, 3282, 25188, 2, 402, 38263, 2487, 45551, 1, 3802,
+48734, 2, 3936, 56996, 4505, 40787, 1, 4530, 40787, 1,
+ 4555, 40787, 2, 1975, 3347, 4580, 40787, 2, 2154, 27536,
+ 4605, 40787, 2, 3018, 44760, 4630, 40787, 2, 1246, 22662,
+ 4655, 40787, 3, 857, 14008, 1079, 34923, 4680, 40787, 1,
+ 528, 35888, 3, 942, 3273, 979, 21621, 3155, 53055, 3,
+ 239, 62560, 2947, 17896, 3576, 53292, 2, 416, 54648, 1145,
+13271, 3, 361, 22494, 412, 27125, 2824, 20795, 4, 558,
+13595, 1016, 4043, 3261, 24970, 3744, 51532, 2, 2180, 57004,
+ 2985, 58500, 1, 1618, 24150, 2, 660, 40124, 2239, 21151,
+ 2, 2528, 60465, 3063, 24289, 1, 175, 47738, 1, 277,
+37918, 2, 1893, 40601, 3976, 26818, 2, 438, 16290, 2183,
+10967, 1, 2888, 32934, 3, 87, 15583, 388, 33506, 4049,
+37789, 1, 4075, 37789, 2, 357, 41110, 4101, 37789, 3,
+ 1599, 46511, 3345, 5560, 4127, 37789, 3, 2791, 37070, 4153,
+37789, 4435, 57356, 1, 4179, 37789, 1, 4205, 37789, 2,
+ 949, 63264, 4231, 37789, 1, 2221, 61490, 1, 2622, 58081,
+ 2, 172, 45627, 3258, 29995, 1, 636, 28622, 2, 1501,
+ 3085, 4024, 60616, 3, 273, 57895, 1435, 54326, 3403, 43001,
+ 2, 2696, 44094, 4490, 43131, 2, 1247, 35859, 4515, 43131,
+ 2, 3720, 54409, 4540, 43131, 2, 3209, 60368, 4565, 43131,
+ 2, 752, 51396, 4590, 43131, 2, 3768, 57072, 4615, 43131,
+ 1, 4640, 43131, 1, 4665, 43131, 1, 1062, 15253, 2,
+ 1064, 2901, 1950, 24065, 2, 403, 51918, 652, 49561, 1,
+ 1711, 3822, 1, 4478, 53948, 2, 621, 25894, 3738, 47162,
+ 2, 2026, 39505, 4864, 30283, 4, 619, 50623, 737, 15230,
+ 1340, 57682, 2586, 44803, 2, 2428, 16006, 3099, 43030, 2,
+ 174, 20563, 1539, 50261, 1, 1305, 46107, 1, 2651, 28715,
+ 2, 1162, 61306, 1301, 58172, 1, 546, 27424, 2, 1029,
+29841, 4868, 9940, 1, 868, 44226, 1, 1781, 9481, 1,
+ 3840, 56097, 2, 2081, 52307, 3841, 56097, 1, 855, 52445,
+ 2, 1378, 48335, 3216, 26899, 1, 4472, 52158, 3, 121,
+40869, 1066, 18137, 3223, 12756, 2, 3651, 37345, 3706, 62042,
+ 1, 3659, 25476, 3, 2305, 19873, 2472, 30037, 3050, 47808,
+ 1, 1252, 57949, 1, 2295, 49006, 2, 466, 51061, 2970,
+11002, 1, 1486, 59769, 4, 227, 43302, 748, 52902, 3954,
+18854, 4021, 10076, 1, 3278, 34748, 1, 3915, 21583, 3,
+ 2597, 37746, 3365, 9728, 3721, 11411, 2, 761, 7203, 2775,
+44119, 2, 2331, 31149, 3260, 29226, 1, 58, 10068, 1,
+ 985, 13539, 2, 138, 15193, 4696, 63613, 2, 3003, 55896,
+ 4721, 63613, 2, 143, 42791, 4746, 63613, 2, 2800, 26665,
+ 4771, 63613, 2, 2708, 51496, 4796, 63613, 2, 518, 9810,
+ 4821, 63613, 2, 1273, 39081, 4846, 63613, 1, 1925, 5846,
+ 3, 933, 30332, 1997, 37055, 2102, 1998, 2, 365, 39179,
+ 3414, 62520, 1, 1309, 59569, 1, 2467, 58006, 1, 1073,
+29561, 1, 2556, 25054, 2, 1325, 12972, 2079, 13558, 1,
+ 626, 24146, 1, 73, 64772, 1, 3695, 24459, 2, 1426,
+14279, 3743, 34192, 2, 1951, 54628, 2735, 47287, 1, 2713,
+52385, 1, 3036, 18019, 1, 2537, 41251, 1, 3267, 26759,
+ 3, 76, 11204, 2982, 48574, 4687, 22922, 3, 1858, 7262,
+ 1903, 41111, 4712, 22922, 2, 418, 1788, 4737, 22922, 3,
+ 424, 14107, 2688, 5307, 4762, 22922, 1, 4787, 22922, 4,
+ 1300, 60170, 2257, 53580, 3678, 31271, 4812, 22922, 2, 2874,
+30506, 4837, 22922, 2, 854, 9748, 1477, 53410, 4, 188,
+54086, 1014, 20974, 1790, 150, 3024, 59719, 2, 447, 62838,
+ 924, 18911, 2, 894, 61943, 3951, 31620, 2, 2810, 4809,
+ 3935, 54103, 2, 468, 26931, 4497, 17302, 3, 1987, 19949,
+ 3974, 24510, 4522, 17302, 1, 4547, 17302, 1, 4572, 17302,
+ 1, 4597, 17302, 2, 4037, 28528, 4622, 17302, 2, 2673,
+41437, 4647, 17302, 2, 2390, 58488, 4672, 17302, 1, 1136,
+38133, 1, 1217, 46791, 1, 3285, 45896, 1, 2969, 42257,
+ 1, 3705, 33753, 3, 2801, 24873, 3255, 13149, 3926, 53644,
+ 1, 2357, 2545, 1, 3302, 16806, 1, 3138, 29518, 3,
+ 1684, 2467, 2037, 61057, 3305, 26256, 2, 1780, 31346, 3620,
+ 7540, 3, 716, 60479, 832, 41505, 2983, 16409, 2, 2182,
+51406, 4272, 43007, 4, 19, 50140, 1760, 60089, 3495, 32061,
+ 4298, 43007, 1, 4324, 43007, 3, 779, 38505, 2042, 12807,
+ 4350, 43007, 1, 4376, 43007, 2, 88, 44325, 4402, 43007,
+ 2, 709, 55254, 4428, 43007, 2, 3001, 47335, 3395, 50881,
+ 2, 573, 14159, 1166, 50768, 2, 932, 63562, 3676, 27863,
+ 1, 3612, 59776, 2, 730, 30948, 2318, 62207, 1, 657,
+19144, 1, 127, 31011, 1, 2562, 58203, 3, 222, 20775,
+ 772, 15070, 3367, 49985, 1, 1391, 26940, 2, 1075, 4756,
+ 2817, 56888, 1, 3090, 25034, 1, 3000, 38467, 1, 582,
+ 4047, 2, 1117, 24467, 2798, 40545, 1, 651, 7740, 2,
+ 1423, 20984, 2168, 45507, 1, 2962, 43751, 1, 600, 49570,
+ 1, 35, 36192, 2, 20, 30554, 3062, 29328, 1, 1266,
+38827, 3, 1113, 109, 2683, 35683, 3698, 64582, 1, 1093,
+61225, 3, 2271, 60079, 3207, 27739, 3923, 52349, 1, 434,
+14914, 1, 2957, 57031, 1, 3268, 21682, 2, 696, 47233,
+ 1344, 39271, 1, 1399, 3055, 1, 3377, 56550, 2, 425,
+11321, 2927, 43284, 1, 3982, 31050, 2, 319, 37995, 2856,
+62810, 1, 3590, 48544, 2, 969, 36715, 3041, 22430, 1,
+ 430, 29352, 1, 1919, 61844, 1, 1535, 41564, 3, 452,
+23340, 486, 25646, 2439, 7027, 2, 2200, 51142, 3017, 48111,
+ 2, 1953, 64772, 2845, 1792, 2, 848, 16013, 3714, 56467,
+ 1, 3005, 62355, 3, 151, 46216, 351, 12234, 4058, 60277,
+ 3, 191, 42759, 2892, 57292, 4084, 60277, 1, 4110, 60277,
+ 2, 3729, 6858, 4136, 60277, 3, 1843, 51603, 3824, 49697,
+ 4162, 60277, 2, 683, 63854, 4188, 60277, 1, 4214, 60277,
+ 2, 3871, 7709, 4240, 60277, 1, 3833, 9183, 2, 1859,
+25460, 4002, 58070, 1, 2906, 16352, 1, 3132, 21591, 1,
+ 3110, 58840, 3, 202, 24868, 843, 5649, 4029, 57200, 1,
+ 473, 7123, 2, 706, 43285, 1943, 48230, 1, 209, 47477,
+ 1, 1731, 23463, 1, 1487, 21574, 3, 2380, 52874, 2726,
+42027, 3873, 26797, 2, 30, 17980, 998, 42152, 1, 2613,
+36905, 2, 1978, 61204, 2503, 24085, 1, 1215, 43168, 2,
+ 2303, 54528, 3639, 8171, 2, 1545, 45132, 2204, 29181, 2,
+ 840, 38976, 2479, 49013, 1, 411, 61050, 1, 4034, 15057,
+ 1, 392, 61189, 1, 962, 12792, 1, 3633, 63814, 1,
+ 1957, 60067, 1, 2963, 4244, 2, 1720, 30976, 2424, 15569,
+ 1, 1621, 47449, 1, 2743, 58473, 1, 952, 4403, 2,
+ 1125, 1089, 1271, 56483, 1, 1083, 9036, 1, 2536, 41310,
+ 1, 292, 61748, 1, 1854, 22523, 2, 24, 13785, 2416,
+14804, 2, 1263, 59424, 3679, 46397, 1, 2660, 55736, 1,
+ 2663, 52277, 1, 1755, 40287, 2, 884, 45805, 3288, 23340,
+ 1, 2117, 18345, 1, 1648, 35687, 1, 3397, 6915, 4,
+ 664, 64979, 2234, 55180, 2583, 6033, 2912, 53089, 1, 1039,
+15122, 3, 1377, 50818, 2292, 40256, 3919, 54052, 2, 544,
+16288, 1412, 25559, 2, 154, 4276, 1037, 44949, 2, 23,
+63719, 2062, 62873, 1, 1853, 31227, 1, 768, 15953, 2,
+ 899, 61057, 1313, 33621, 1, 3468, 55600, 2, 481, 49225,
+ 2754, 40417, 1, 4446, 5555, 2, 1968, 46289, 3577, 45,
+ 1, 1397, 59128, 1, 2964, 11942, 1, 1900, 21556, 1,
+ 223, 12718, 2, 517, 37296, 3958, 43919, 4, 390, 4767,
+ 2080, 27877, 3851, 7767, 4689, 61184, 2, 749, 56203, 4714,
+61184, 2, 4038, 24893, 4739, 61184, 1, 4764, 61184, 3,
+ 1230, 32757, 3089, 53608, 4789, 61184, 1, 4814, 61184, 3,
+ 1624, 59233, 4437, 36838, 4839, 61184, 2, 705, 13264, 1011,
+22156, 3, 432, 1515, 1425, 26505, 1752, 41758, 1, 2136,
+37278, 1, 1210, 55205, 1, 98, 16928, 2, 2195, 63181,
+ 3870, 17754, 1, 2960, 55088, 3, 2961, 63661, 3384, 29919,
+ 4462, 1284, 1, 2, 46303, 1, 3950, 40322, 1, 1369,
+17934, 2, 1296, 36416, 3119, 38499, 1, 814, 27178, 2,
+ 818, 27178, 3404, 23273, 1, 1878, 53066, 1, 567, 6688,
+ 1, 460, 49439, 1, 687, 41966, 3, 86, 22351, 2101,
+62572, 3687, 42915, 2, 1729, 59650, 3898, 13525, 1, 539,
+47231, 3, 303, 49598, 1255, 51902, 2517, 51379, 1, 2167,
+48268, 1, 170, 27361, 3, 17, 9911, 2941, 39141, 3205,
+37955, 3, 1429, 3737, 1513, 48315, 1924, 65505, 1, 1655,
+37404, 2, 1791, 57907, 2637, 20917, 1, 3716, 49321, 2,
+ 1804, 41462, 2050, 63697, 2, 380, 29281, 1121, 29875, 2,
+ 315, 52408, 3344, 36122, 2, 1805, 55858, 2129, 60188, 3,
+ 2682, 53820, 3262, 29538, 3610, 20955, 1, 2762, 31271, 3,
+ 816, 27178, 2480, 13341, 3702, 2275, 2, 820, 27178, 1738,
+42444, 2, 1689, 17995, 1944, 53052, 2, 1420, 43602, 2573,
+12496, 1, 4480, 38968, 3, 883, 45205, 1504, 53751, 3798,
+45427, 3, 1970, 20093, 3101, 10969, 3774, 45471, 2, 2992,
+38045, 3901, 803, 1, 3045, 22489, 3, 2804, 8615, 3811,
+ 9335, 4032, 59418, 2, 2759, 51871, 3170, 6443, 3, 2603,
+10321, 2761, 36643, 3173, 62501, 1, 668, 10307, 1, 1123,
+44072, 1, 2004, 12131, 3, 448, 52765, 1797, 13251, 3141,
+64099, 2, 2353, 20388, 3479, 27154, 1, 265, 19544, 1,
+ 1942, 47068, 1, 3157, 21278, 1, 1963, 20085, 2, 1770,
+35504, 1833, 38016, 1, 1223, 52146, 1, 1607, 26528, 1,
+ 2825, 56075, 3, 74, 16808, 1336, 28321, 2429, 43356, 1,
+ 911, 63913, 1, 3657, 39007, 1, 3460, 18304, 2, 596,
+47726, 4698, 3100, 2, 1940, 65509, 4723, 3100, 1, 4748,
+ 3100, 4, 1493, 65125, 2051, 41987, 2506, 58793, 4773, 3100,
+ 2, 1331, 25283, 4798, 3100, 2, 385, 13237, 4823, 3100,
+ 4, 1706, 32983, 3253, 29606, 3654, 41797, 4848, 3100, 3,
+ 728, 20914, 1764, 38716, 2339, 18374, 3, 375, 57571, 1713,
+ 4476, 1850, 14290, 2, 1521, 36728, 2395, 27170, 1, 1451,
+46443, 1, 670, 52596, 2, 839, 43998, 3292, 23343, 1,
+ 3117, 14812, 1, 1578, 33445, 1, 1485, 64325, 1, 328,
+19773, 1, 2516, 56990, 2, 2156, 58398, 2197, 62719, 2,
+ 101, 1686, 3966, 24994, 1, 2771, 17403, 3, 3463, 28535,
+ 3573, 42834, 3778, 61636, 2, 3786, 36320, 4863, 30283, 2,
+ 674, 62446, 3012, 55543, 2, 445, 54197, 2718, 53805, 1,
+ 2922, 32340, 2, 2876, 42752, 4056, 64965, 1, 4082, 64965,
+ 4, 1358, 51003, 1385, 15771, 3565, 9702, 4108, 64965, 3,
+ 817, 36741, 2417, 18920, 4134, 64965, 3, 2139, 56963, 3222,
+17244, 4160, 64965, 1, 4186, 64965, 1, 4212, 64965, 2,
+ 1969, 32163, 4238, 64965, 1, 488, 18233, 1, 3399, 65298,
+ 1, 136, 41224, 1, 3792, 63308, 2, 1774, 52245, 2124,
+20325, 1, 4025, 27147, 1, 4259, 7284, 1, 4285, 7284,
+ 2, 4311, 7284, 4494, 26403, 5, 508, 23382, 1601, 10044,
+ 2344, 26611, 4337, 7284, 4519, 26403, 3, 2459, 30441, 4363,
+ 7284, 4544, 26403, 3, 1982, 49054, 4389, 7284, 4569, 26403,
+ 4, 2309, 3266, 2408, 31313, 4415, 7284, 4594, 26403, 1,
+ 4619, 26403, 1, 4644, 26403, 1, 4669, 26403, 1, 3318,
+51354, 1, 2233, 18075, 2, 1204, 52299, 3213, 38609, 3,
+ 301, 30908, 641, 35753, 1110, 6490, 1, 2694, 17394, 2,
+ 2365, 11548, 4457, 9968, 1, 3637, 13315, 2, 2707, 42294,
+ 3913, 1457, 1, 1048, 35960, 2, 726, 64438, 3346, 52082,
+ 1, 2270, 4335, 2, 2832, 31147, 2903, 17728, 1, 1045,
+ 6091, 1, 543, 18957, 1, 2422, 35625, 1, 394, 23318,
+ 2, 2147, 4859, 2211, 6090, 1, 4023, 42849, 2, 182,
+ 5789, 608, 57616, 1, 1680, 39174, 1, 1559, 31339, 2,
+ 500, 998, 2032, 28246, 2, 1265, 59183, 3769, 60563, 2,
+ 1908, 4666, 2003, 59916, 3, 1772, 11316, 1828, 23744, 2649,
+52173, 2, 2554, 42717, 3211, 40602, 2, 2700, 5447, 3161,
+18212, 1, 1084, 55599, 1, 2366, 28869, 1, 2453, 729,
+ 1, 3406, 45682, 4, 2085, 64259, 3097, 37473, 3369, 19355,
+ 4047, 4852, 2, 2165, 23045, 4073, 4852, 3, 1891, 34409,
+ 3167, 4772, 4099, 4852, 1, 4125, 4852, 2, 1484, 31809,
+ 4151, 4852, 3, 892, 36885, 3746, 35008, 4177, 4852, 1,
+ 4203, 4852, 1, 4229, 4852, 2, 579, 48463, 1356, 11720,
+ 2, 865, 19139, 2763, 17570, 2, 2222, 25363, 2749, 17551,
+ 3, 1610, 26701, 2567, 59626, 4255, 29072, 2, 3074, 61654,
+ 4281, 29072, 3, 236, 11459, 1669, 45990, 4307, 29072, 3,
+ 1857, 32049, 3053, 50692, 4333, 29072, 2, 1494, 28532, 4359,
+29072, 1, 4385, 29072, 3, 2958, 55050, 3803, 28545, 4411,
+29072, 1, 1275, 16611, 1, 1507, 62248, 1, 3235, 28607,
+ 1, 2169, 56504, 1, 2789, 17720, 1, 4509, 60918, 1,
+ 4534, 60918, 4, 458, 60835, 1240, 55850, 3224, 37699, 4559,
+60918, 2, 262, 42267, 4584, 60918, 2, 777, 18788, 4609,
+60918, 1, 4634, 60918, 2, 2994, 55036, 4659, 60918, 1,
+ 4684, 60918, 1, 373, 28619, 4, 874, 34051, 2137, 18184,
+ 2739, 50966, 3254, 54996, 1, 1253, 65372, 2, 734, 22428,
+ 759, 27195, 1, 1010, 42939, 1, 1994, 24156, 2, 1875,
+34929, 3908, 11131, 1, 2090, 30795, 2, 1053, 49258, 1415,
+52017, 3, 755, 26652, 2261, 64626, 3439, 43235, 1, 3550,
+51457, 2, 581, 5400, 2526, 7437, 1, 158, 64626, 1,
+ 3188, 8283, 1, 1693, 4704, 1, 3578, 10434, 1, 2901,
+ 5616, 2, 1464, 20272, 3552, 63270, 1, 3106, 28313, 1,
+ 1302, 42310, 2, 2207, 43816, 3348, 9806, 1, 654, 15049,
+ 1, 2438, 40571, 1, 3886, 64549, 3, 57, 26587, 95,
+45178, 159, 63908, 2, 2335, 60879, 3836, 15367, 3, 54,
+25656, 1992, 23018, 2769, 39060, 1, 1633, 29068, 2, 6,
+59391, 4045, 55672, 2, 1024, 35517, 4071, 55672, 3, 2505,
+33961, 2917, 45068, 4097, 55672, 1, 4123, 55672, 3, 117,
+31354, 2114, 2194, 4149, 55672, 2, 1929, 35328, 4175, 55672,
+ 2, 525, 25021, 4201, 55672, 4, 3293, 10477, 3507, 20501,
+ 4031, 64668, 4227, 55672, 1, 2659, 43725, 1, 3321, 40192,
+ 1, 3554, 29566, 1, 1040, 23421, 2, 2953, 24522, 3424,
+57981, 1, 3827, 62596, 1, 4442, 40740, 2, 1495, 59275,
+ 2712, 3105, 1, 2075, 62521, 1, 2521, 62607, 1, 2016,
+17489, 1, 2245, 27516, 4, 193, 43003, 501, 51618, 1844,
+45477, 2220, 7602, 2, 632, 62223, 2784, 35943, 1, 3276,
+58496, 2, 492, 31537, 804, 64063, 2, 956, 19922, 1839,
+10811, 2, 257, 22594, 297, 23948, 1, 1826, 43025, 2,
+ 1587, 31176, 4438, 26662, 1, 3407, 15004, 1, 1286, 37099,
+ 2, 1932, 1100, 2594, 50931, 1, 1367, 39439, 1, 1605,
+11029, 3, 908, 36491, 1462, 22888, 3878, 55486, 1, 2702,
+13849, 1, 2024, 44757, 3, 3300, 48476, 3532, 3880, 4702,
+60836, 2, 276, 32233, 4727, 60836, 4, 1058, 1302, 3277,
+32014, 4700, 13728, 4752, 60836, 3, 2224, 31071, 4725, 13728,
+ 4777, 60836, 5, 1625, 51390, 2777, 24152, 3332, 39063, 4750,
+13728, 4802, 60836, 2, 4775, 13728, 4827, 60836, 4, 442,
+53447, 811, 5000, 4800, 13728, 4852, 60836, 1, 4825, 13728,
+ 2, 1979, 41262, 4850, 13728, 4, 16, 52539, 507, 54702,
+ 672, 59975, 3287, 49315, 2, 1509, 65093, 3469, 9037, 4,
+ 427, 46021, 2878, 8437, 3178, 57941, 3842, 55304, 1, 1965,
+34669, 2, 2475, 7880, 3426, 5094, 1, 69, 175, 1,
+ 203, 27005, 2, 2999, 15447, 3466, 58789, 1, 2238, 55426,
+ 2, 2215, 26297, 3927, 7633, 2, 1291, 39980, 1566, 21480,
+ 4, 821, 57289, 1366, 1474, 1716, 45965, 2258, 9345, 3,
+ 1757, 11105, 2865, 27933, 2910, 2093, 3, 43, 27621, 3918,
+47486, 3970, 33390, 2, 3715, 6036, 3805, 52041, 2, 81,
+24260, 1242, 44765, 2, 554, 22684, 3961, 39687, 2, 2142,
+31628, 3086, 48448, 1, 807, 62825, 1, 181, 35084, 1,
+ 819, 55116, 2, 3947, 13184, 3996, 16959, 1, 1386, 45275,
+ 1, 3785, 3744, 2, 3193, 20169, 3867, 11488, 2, 376,
+61388, 1810, 61025, 1, 1626, 16615, 1, 1595, 51326, 1,
+ 4449, 59443, 1, 3168, 6834, 1, 1115, 52437, 1, 79,
+36106, 1, 649, 40150, 2, 1636, 42586, 4451, 58506, 1,
+ 80, 24488, 1, 2151, 25566, 1, 3865, 6115, 1, 973,
+32283, 1, 1070, 13266, 1, 1659, 61175, 2, 617, 65534,
+ 2882, 55405, 1, 1442, 28357, 2, 506, 60018, 2871, 24195,
+ 2, 1195, 65310, 4483, 60808, 2, 864, 31658, 1954, 21856,
+ 3, 2552, 37355, 2724, 3214, 4262, 50172, 2, 48, 60808,
+ 4288, 50172, 3, 703, 15085, 2645, 36351, 4314, 50172, 3,
+ 2455, 13492, 2803, 32181, 4340, 50172, 1, 4366, 50172, 2,
+ 1842, 54846, 4392, 50172, 2, 1927, 61478, 4418, 50172, 1,
+ 2839, 30805, 1, 1629, 61432, 1, 792, 49302, 2, 937,
+59459, 3172, 3325, 1, 631, 62231, 1, 2278, 9064, 1,
+ 1553, 44223, 2, 146, 49255, 580, 6251, 2, 1362, 26821,
+ 2383, 20087, 1, 2253, 16575, 1, 3095, 19705, 2, 3888,
+ 1430, 3939, 411, 3, 13, 57660, 1174, 57838, 3583, 8105,
+ 1, 3504, 25582, 1, 1516, 63800, 2, 287, 64728, 2598,
+60876, 1, 3800, 10542, 2, 2965, 13568, 3713, 6135, 2,
+ 887, 42151, 3531, 55601, 1, 986, 58539, 1, 2059, 8092,
+ 1, 420, 18430, 1, 1564, 11343, 1, 485, 11988, 2,
+ 793, 49302, 2172, 47401, 1, 575, 37451, 1, 1013, 26558,
+ 2, 646, 38885, 1002, 58177, 1, 1967, 16423, 1, 1917,
+36825, 1, 1762, 1062, 2, 3473, 57949, 4265, 38764, 3,
+ 867, 17890, 1228, 6398, 4291, 38764, 1, 4317, 38764, 6,
+ 53, 26455, 1239, 38217, 1763, 39122, 3598, 40942, 3757, 57750,
+ 4343, 38764, 1, 4369, 38764, 2, 1547, 4048, 4395, 38764,
+ 2, 1577, 9729, 4421, 38764, 3, 1137, 41572, 1478, 34190,
+ 4692, 7917, 1, 4717, 7917, 2, 4018, 36135, 4742, 7917,
+ 2, 3166, 17234, 4767, 7917, 4, 325, 36444, 676, 16610,
+ 1837, 6420, 4792, 7917, 4, 739, 48056, 1840, 3362, 3328,
+19045, 4817, 7917, 1, 4842, 7917, 2, 290, 29701, 3876,
+27087, 1, 2665, 49557, 1, 484, 17896, 1, 3952, 26703,
+ 1, 536, 47018, 1, 3566, 31596, 1, 3498, 52352, 1,
+ 3039, 64998, 1, 4014, 64092, 2, 2715, 11534, 2757, 43291,
+ 2, 180, 12513, 4039, 7212, 1, 3567, 64240, 1, 330,
+59172, 1, 707, 45227, 1, 2092, 55543, 3, 2056, 46038,
+ 3215, 50731, 3557, 19208, 2, 1907, 622, 2866, 46988, 2,
+ 381, 16232, 1883, 64423, 2, 830, 44392, 3670, 5275, 2,
+ 673, 47045, 2462, 45414, 2, 905, 55222, 910, 21013, 1,
+ 1788, 5848, 2, 1059, 27280, 2782, 39677, 1, 1287, 12991,
+ 1, 72, 4988, 2, 2346, 65362, 2943, 44622, 2, 592,
+10615, 1449, 14601, 1, 2415, 27846, 1, 1500, 58506, 1,
+ 1794, 23081, 1, 2564, 61438, 1, 85, 36249, 4, 112,
+59717, 1510, 58589, 2741, 64582, 3289, 23340, 1, 662, 43560,
+ 1, 3227, 54198, 1, 1617, 19933, 3, 1584, 53755, 3175,
+30822, 3683, 535, 1, 572, 16900, 2, 729, 4512, 2072,
+57860, 2, 183, 5986, 3723, 23999, 1, 2342, 12837, 1,
+ 1974, 49970, 2, 656, 1140, 3202, 28019, 1, 1868, 44625,
+ 2, 2984, 7885, 3520, 54010, 1, 2446, 58703, 1, 2531,
+45704, 1, 2218, 11209, 1, 1528, 30780, 1, 1980, 52507,
+ 1, 686, 18283, 3, 520, 18862, 977, 16776, 2326, 38215,
+ 3, 717, 59921, 1906, 14696, 2653, 42866, 1, 302, 64742,
+ 1, 3772, 780, 2, 2684, 55178, 4486, 7276, 4, 114,
+40205, 1732, 16758, 2611, 61555, 4511, 7276, 3, 738, 7829,
+ 3306, 11696, 4536, 7276, 1, 4561, 7276, 1, 4586, 7276,
+ 1, 4611, 7276, 2, 3989, 33796, 4636, 7276, 1, 4661,
+ 7276, 2, 740, 44158, 2790, 5490, 1, 1488, 6904, 3,
+ 91, 41933, 269, 44713, 3766, 19735, 2, 598, 12175, 890,
+42920, 2, 831, 63355, 1437, 9183, 1, 1899, 20058, 1,
+ 1918, 52675, 2, 1049, 49337, 3835, 36661, 1, 1889, 18019,
+ 2, 1658, 50063, 2393, 39761, 1, 200, 37349, 2, 1834,
+57327, 2000, 5877, 1, 2043, 20522, 2, 655, 40693, 3630,
+46354, 1, 2515, 63403, 2, 3329, 48530, 3497, 46473, 1,
+ 0, 7644, 2, 1750, 3207, 1870, 25034, 3, 1384, 60379,
+ 1455, 1549, 1733, 17276, 4, 1374, 33519, 1627, 42321, 3516,
+ 2900, 4707, 19477, 2, 3058, 20001, 4732, 19477, 2, 1817,
+44422, 4757, 19477, 3, 2545, 26159, 2849, 47425, 4782, 19477,
+ 2, 733, 15833, 4807, 19477, 1, 4832, 19477, 1, 4857,
+19477, 1, 491, 25647, 1, 4686, 43531, 1, 4711, 43531,
+ 1, 4736, 43531, 2, 987, 38259, 4761, 43531, 2, 503,
+14563, 4786, 43531, 2, 1261, 47174, 4811, 43531, 2, 1880,
+51519, 4836, 43531, 2, 471, 566, 3465, 14509, 1, 3686,
+26647, 3, 545, 35819, 997, 46840, 2773, 2935, 3, 1293,
+35606, 1677, 54555, 3284, 61208, 1, 1338, 62771, 5, 139,
+17129, 266, 47768, 358, 19697, 401, 55050, 1017, 5079, 2,
+ 954, 60229, 2272, 26786, 1, 3015, 9911, 1, 1178, 33108,
+ 3, 719, 9387, 3626, 7993, 3942, 26112, 2, 3007, 27341,
+ 3477, 33841, 3, 160, 53073, 2838, 21033, 3712, 6194, 2,
+ 642, 24074, 4008, 40674, 2, 2776, 18922, 3916, 16310, 1,
+ 3882, 24843, 1, 1926, 10913, 1, 3491, 38989, 3, 602,
+27824, 2812, 14947, 2836, 44312, 3, 731, 40146, 2445, 9678,
+ 2966, 64474, 1, 42, 24074, 2, 440, 32566, 2643, 8269,
+ 3, 1608, 21282, 3319, 53760, 4867, 26805, 1, 1637, 41117,
+ 1, 675, 32733, 1, 513, 61418, 2, 1807, 29620, 3641,
+19100, 1, 2163, 26927, 1, 1141, 13636, 3, 1971, 57413,
+ 3719, 8404, 3877, 37244, 3, 459, 37813, 1038, 28955, 3402,
+24389, 1, 750, 8994, 1, 806, 4843, 2, 1813, 57942,
+ 1999, 21275, 1, 1685, 57245, 1, 1597, 1041, 1, 3181,
+38438, 1, 275, 2928, 1, 741, 58359, 1, 2420, 49169,
+ 2, 1279, 46678, 2612, 63238, 1, 1088, 29764, 1, 4705,
+35274, 1, 4730, 35274, 1, 4755, 35274, 2, 2869, 1727,
+ 4780, 35274, 1, 4805, 35274, 2, 1556, 49889, 4830, 35274,
+ 1, 4855, 35274, 2, 1571, 3087, 3452, 56148, 1, 1445,
+47683, 1, 255, 7144, 2, 1343, 63534, 3108, 4837,
};
} // end anonymous namespace
@@ -7928,7 +8102,7 @@ unsigned short DictKeyHashTable[] = {
vtkDICOMDictionary::Dict vtkDICOMDictionary::DictData = {
"DICOM",
4096,
-4756,
+4876,
DictTagHashTable,
DictKeyHashTable,
DictContents
diff --git a/Source/vtkDICOMDictHash.h b/Source/vtkDICOMDictHash.h
index b93a3b1..4cd75dd 100644
--- a/Source/vtkDICOMDictHash.h
+++ b/Source/vtkDICOMDictHash.h
@@ -74,6 +74,7 @@ IssuerOfAccessionNumberSequence = 0x00080051, // SQ M1 0
QueryRetrieveLevel = 0x00080052, // CS M1 0
QueryRetrieveView = 0x00080053, // CS M1 0
RetrieveAETitle = 0x00080054, // AE M1TN 0
+StationAETitle = 0x00080055, // AE M1 0
InstanceAvailability = 0x00080056, // CS M1 0
FailedSOPInstanceUIDList = 0x00080058, // UI M1TN 0
Modality = 0x00080060, // CS M1 0
@@ -114,6 +115,9 @@ MappingResourceUID = 0x00080118, // UI M1 0
LongCodeValue = 0x00080119, // UC M1 0
URNCodeValue = 0x00080120, // UR M1 0
EquivalentCodeSequence = 0x00080121, // SQ M1 0
+MappingResourceName = 0x00080122, // LO M1 0
+ContextGroupIdentificationSequence = 0x00080123, // SQ M1 0
+MappingResourceIdentificationSequence = 0x00080124, // SQ M1 0
TimezoneOffsetFromUTC = 0x00080201, // SH M1 0
PrivateDataElementCharacteristicsSequence = 0x00080300, // SQ M1 0
PrivateGroupReference = 0x00080301, // US M1 0
@@ -169,6 +173,7 @@ WarningReason = 0x00081196, // US M1 0
FailureReason = 0x00081197, // US M1 0
FailedSOPSequence = 0x00081198, // SQ M1 0
ReferencedSOPSequence = 0x00081199, // SQ M1 0
+OtherFailuresSequence = 0x0008119A, // SQ M1 0
StudiesContainingOtherReferencedInstancesSequence = 0x00081200, // SQ M1 0
RelatedSeriesSequence = 0x00081250, // SQ M1 0
LossyImageCompressionRetired = 0x00082110, // CS M1 1
@@ -237,14 +242,28 @@ PatientID = 0x00100020, // LO M1 0
IssuerOfPatientID = 0x00100021, // LO M1 0
TypeOfPatientID = 0x00100022, // CS M1 0
IssuerOfPatientIDQualifiersSequence = 0x00100024, // SQ M1 0
+SourcePatientGroupIdentificationSequence = 0x00100026, // SQ M1 0
+GroupOfPatientsIdentificationSequence = 0x00100027, // SQ M1 0
+SubjectRelativePositionInImage = 0x00100028, // US M3 0
PatientBirthDate = 0x00100030, // DA M1 0
PatientBirthTime = 0x00100032, // TM M1 0
+PatientBirthDateInAlternativeCalendar = 0x00100033, // LO M1 0
+PatientDeathDateInAlternativeCalendar = 0x00100034, // LO M1 0
+PatientAlternativeCalendar = 0x00100035, // CS M1 0
PatientSex = 0x00100040, // CS M1 0
PatientInsurancePlanCodeSequence = 0x00100050, // SQ M1 0
PatientPrimaryLanguageCodeSequence = 0x00100101, // SQ M1 0
PatientPrimaryLanguageModifierCodeSequence = 0x00100102, // SQ M1 0
QualityControlSubject = 0x00100200, // CS M1 0
QualityControlSubjectTypeCodeSequence = 0x00100201, // SQ M1 0
+StrainDescription = 0x00100212, // UC M1 0
+StrainNomenclature = 0x00100213, // LO M1 0
+StrainStockNumber = 0x00100214, // LO M1 0
+StrainSourceRegistryCodeSequence = 0x00100215, // SQ M1 0
+StrainStockSequence = 0x00100216, // SQ M1 0
+StrainSource = 0x00100217, // LO M1 0
+StrainAdditionalInformation = 0x00100218, // UT M1 0
+StrainCodeSequence = 0x00100219, // SQ M1 0
OtherPatientIDs = 0x00101000, // LO M1TN 0
OtherPatientNames = 0x00101001, // PN M1TN 0
OtherPatientIDsSequence = 0x00101002, // SQ M1 0
@@ -307,21 +326,30 @@ ClinicalTrialProtocolEthicsCommitteeApprovalNumber = 0x00120082, // LO M1 0
ConsentForClinicalTrialUseSequence = 0x00120083, // SQ M1 0
DistributionType = 0x00120084, // CS M1 0
ConsentForDistributionFlag = 0x00120085, // CS M1 0
-CADFileFormat = 0x00140023, // ST M1TN 1
-ComponentReferenceSystem = 0x00140024, // ST M1TN 1
-ComponentManufacturingProcedure = 0x00140025, // ST M1TN DICONDE
-ComponentManufacturer = 0x00140028, // ST M1TN DICONDE
+CADFileFormat = 0x00140023, // ST M1 1
+ComponentReferenceSystem = 0x00140024, // ST M1 1
+ComponentManufacturingProcedure = 0x00140025, // ST M1 DICONDE
+ComponentManufacturer = 0x00140028, // ST M1 DICONDE
MaterialThickness = 0x00140030, // DS M1TN DICONDE
MaterialPipeDiameter = 0x00140032, // DS M1TN DICONDE
MaterialIsolationDiameter = 0x00140034, // DS M1TN DICONDE
-MaterialGrade = 0x00140042, // ST M1TN DICONDE
-MaterialPropertiesDescription = 0x00140044, // ST M1TN DICONDE
-MaterialPropertiesFileFormatRetired = 0x00140045, // ST M1TN 1
+MaterialGrade = 0x00140042, // ST M1 DICONDE
+MaterialPropertiesDescription = 0x00140044, // ST M1 DICONDE
+MaterialPropertiesFileFormatRetired = 0x00140045, // ST M1 1
MaterialNotes = 0x00140046, // LT M1 DICONDE
ComponentShape = 0x00140050, // CS M1 DICONDE
CurvatureType = 0x00140052, // CS M1 DICONDE
OuterDiameter = 0x00140054, // DS M1 DICONDE
InnerDiameter = 0x00140056, // DS M1 DICONDE
+ComponentWelderIDs = 0x00140100, // LO M1TN DICONDE
+SecondaryApprovalStatus = 0x00140101, // CS M1 DICONDE
+SecondaryReviewDate = 0x00140102, // DA M1 DICONDE
+SecondaryReviewTime = 0x00140103, // TM M1 DICONDE
+SecondaryReviewerName = 0x00140104, // PN M1 DICONDE
+RepairID = 0x00140105, // ST M1 DICONDE
+MultipleComponentApprovalSequence = 0x00140106, // SQ M1 DICONDE
+OtherApprovalStatus = 0x00140107, // CS M1TN DICONDE
+OtherSecondaryApprovalStatus = 0x00140108, // CS M1TN DICONDE
ActualEnvironmentalConditions = 0x00141010, // ST M1 DICONDE
ExpiryDate = 0x00141020, // DA M1 DICONDE
EnvironmentalConditions = 0x00141040, // ST M1 DICONDE
@@ -668,6 +696,8 @@ ReceiveCoilName = 0x00181250, // SH M1 0
TransmitCoilName = 0x00181251, // SH M1 0
PlateType = 0x00181260, // SH M1 0
PhosphorType = 0x00181261, // LO M1 0
+WaterEquivalentDiameter = 0x00181271, // FD M1 0
+WaterEquivalentDiameterCalculationMethodCodeSequence = 0x00181272, // SQ M1 0
ScanVelocity = 0x00181300, // DS M1 0
WholeBodyTechnique = 0x00181301, // CS M1TN 0
ScanLength = 0x00181302, // IS M1 0
@@ -1166,6 +1196,10 @@ DiffusionBValueXZ = 0x00189604, // FD M1 0
DiffusionBValueYY = 0x00189605, // FD M1 0
DiffusionBValueYZ = 0x00189606, // FD M1 0
DiffusionBValueZZ = 0x00189607, // FD M1 0
+FunctionalMRSequence = 0x00189621, // SQ M1 0
+FunctionalSettlingPhaseFramesPresent = 0x00189622, // CS M1 0
+FunctionalSyncPulse = 0x00189623, // DT M1 0
+SettlingPhaseFrame = 0x00189624, // CS M1 0
DecayCorrectionDateTime = 0x00189701, // DT M1 0
StartDensityThreshold = 0x00189715, // FD M1 0
StartRelativeDensityDifferenceThreshold = 0x00189716, // FD M1 0
@@ -2097,6 +2131,11 @@ InputReadinessState = 0x00404041, // CS M1 0
PerformedProcedureStepStartDateTime = 0x00404050, // DT M1 0
PerformedProcedureStepEndDateTime = 0x00404051, // DT M1 0
ProcedureStepCancellationDateTime = 0x00404052, // DT M1 0
+OutputDestinationSequence = 0x00404070, // SQ M1 0
+DICOMStorageSequence = 0x00404071, // SQ M1 0
+STOWRSStorageSequence = 0x00404072, // SQ M1 0
+StorageURL = 0x00404073, // UR M1 0
+XDSStorageSequence = 0x00404074, // SQ M1 0
EntranceDoseInmGy = 0x00408302, // DS M1 0
ParametricMapFrameTypeSequence = 0x00409092, // SQ M1 0
ReferencedImageRealWorldValueMappingSequence = 0x00409094, // SQ M1 0
@@ -2105,6 +2144,8 @@ PixelValueMappingCodeSequence = 0x00409098, // SQ M1 0
LUTLabel = 0x00409210, // SH M1 0
RealWorldValueLastValueMapped = 0x00409211, // XS M1 0
RealWorldValueLUTData = 0x00409212, // FD M1TN 0
+DoubleFloatRealWorldValueLastValueMapped = 0x00409213, // FD M1 0
+DoubleFloatRealWorldValueFirstValueMapped = 0x00409214, // FD M1 0
RealWorldValueFirstValueMapped = 0x00409216, // XS M1 0
QuantityDefinitionSequence = 0x00409220, // SQ M1 0
RealWorldValueIntercept = 0x00409224, // FD M1 0
@@ -2515,6 +2556,8 @@ SegmentedPropertyTypeCodeSequence = 0x0062000F, // SQ M1 0
SegmentationFractionalType = 0x00620010, // CS M1 0
SegmentedPropertyTypeModifierCodeSequence = 0x00620011, // SQ M1 0
UsedSegmentsSequence = 0x00620012, // SQ M1 0
+TrackingID = 0x00620020, // UT M1 0
+TrackingUID = 0x00620021, // UI M1 0
DeformableRegistrationSequence = 0x00640002, // SQ M1 0
SourceFrameOfReferenceUID = 0x00640003, // UI M1 0
DeformableRegistrationGridSequence = 0x00640005, // SQ M1 0
@@ -2549,13 +2592,13 @@ NumberOfVectors = 0x0066001E, // UL M1 0
VectorDimensionality = 0x0066001F, // US M1 0
VectorAccuracy = 0x00660020, // FL M1TN 0
VectorCoordinateData = 0x00660021, // OF M1 0
-TrianglePointIndexList = 0x00660023, // OW M1 0
-EdgePointIndexList = 0x00660024, // OW M1 0
-VertexPointIndexList = 0x00660025, // OW M1 0
+TrianglePointIndexList = 0x00660023, // OW M1 1
+EdgePointIndexList = 0x00660024, // OW M1 1
+VertexPointIndexList = 0x00660025, // OW M1 1
TriangleStripSequence = 0x00660026, // SQ M1 0
TriangleFanSequence = 0x00660027, // SQ M1 0
LineSequence = 0x00660028, // SQ M1 0
-PrimitivePointIndexList = 0x00660029, // OW M1 0
+PrimitivePointIndexList = 0x00660029, // OW M1 1
SurfaceCount = 0x0066002A, // UL M1 0
ReferencedSurfaceSequence = 0x0066002B, // SQ M1 0
ReferencedSurfaceNumber = 0x0066002C, // UL M1 0
@@ -2570,10 +2613,10 @@ SurfaceProcessingAlgorithmIdentificationSequence = 0x00660035, // SQ M1 0
AlgorithmName = 0x00660036, // LO M1 0
RecommendedPointRadius = 0x00660037, // FL M1 0
RecommendedLineThickness = 0x00660038, // FL M1 0
-LongPrimitivePointIndexList = 0x00660040, // UL M1TN 0
-LongTrianglePointIndexList = 0x00660041, // UL M3T3N 0
-LongEdgePointIndexList = 0x00660042, // UL M2T2N 0
-LongVertexPointIndexList = 0x00660043, // UL M1TN 0
+LongPrimitivePointIndexList = 0x00660040, // OL M1 0
+LongTrianglePointIndexList = 0x00660041, // OL M1 0
+LongEdgePointIndexList = 0x00660042, // OL M1 0
+LongVertexPointIndexList = 0x00660043, // OL M1 0
TrackSetSequence = 0x00660101, // SQ M1 0
TrackSequence = 0x00660102, // SQ M1 0
RecommendedDisplayCIELabValueList = 0x00660103, // OW M1 0
@@ -2750,6 +2793,7 @@ ShapeType = 0x00700306, // CS M1 0
RegistrationSequence = 0x00700308, // SQ M1 0
MatrixRegistrationSequence = 0x00700309, // SQ M1 0
MatrixSequence = 0x0070030A, // SQ M1 0
+FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix = 0x0070030B, // FD M16 0
FrameOfReferenceTransformationMatrixType = 0x0070030C, // CS M1 0
RegistrationTypeCodeSequence = 0x0070030D, // SQ M1 0
FiducialDescription = 0x0070030F, // ST M1 0
@@ -2782,8 +2826,8 @@ VolumeCroppingSequence = 0x00701301, // SQ M1 0
VolumeCroppingMethod = 0x00701302, // CS M1 0
BoundingBoxCrop = 0x00701303, // FD M6 0
ObliqueCroppingPlaneSequence = 0x00701304, // SQ M1 0
-ObliqueCroppingPlane = 0x00701305, // FD M4 0
-ObliqueCroppingPlaneNormal = 0x00701306, // FD M3 0
+Plane = 0x00701305, // FD M4 0
+PlaneNormal = 0x00701306, // FD M3 0
CroppingSpecificationNumber = 0x00701309, // US M1 0
MultiPlanarReconstructionStyle = 0x00701501, // CS M1 0
MPRThicknessType = 0x00701502, // CS M1 0
@@ -2839,17 +2883,30 @@ SelectorAttributeVR = 0x00720050, // CS M1 0
SelectorSequencePointer = 0x00720052, // AT M1TN 0
SelectorSequencePointerPrivateCreator = 0x00720054, // LO M1TN 0
SelectorAttributePrivateCreator = 0x00720056, // LO M1 0
+SelectorAEValue = 0x0072005E, // AE M1TN 0
+SelectorASValue = 0x0072005F, // AS M1TN 0
SelectorATValue = 0x00720060, // AT M1TN 0
+SelectorDAValue = 0x00720061, // DA M1TN 0
SelectorCSValue = 0x00720062, // CS M1TN 0
+SelectorDTValue = 0x00720063, // DT M1TN 0
SelectorISValue = 0x00720064, // IS M1TN 0
+SelectorOBValue = 0x00720065, // OB M1 0
SelectorLOValue = 0x00720066, // LO M1TN 0
+SelectorOFValue = 0x00720067, // OF M1 0
SelectorLTValue = 0x00720068, // LT M1 0
+SelectorOWValue = 0x00720069, // OW M1 0
SelectorPNValue = 0x0072006A, // PN M1TN 0
+SelectorTMValue = 0x0072006B, // TM M1TN 0
SelectorSHValue = 0x0072006C, // SH M1TN 0
+SelectorUNValue = 0x0072006D, // UN M1 0
SelectorSTValue = 0x0072006E, // ST M1 0
+SelectorUCValue = 0x0072006F, // UC M1TN 0
SelectorUTValue = 0x00720070, // UT M1 0
+SelectorURValue = 0x00720071, // UR M1 0
SelectorDSValue = 0x00720072, // DS M1TN 0
+SelectorODValue = 0x00720073, // OD M1 0
SelectorFDValue = 0x00720074, // FD M1TN 0
+SelectorOLValue = 0x00720075, // OL M1 0
SelectorFLValue = 0x00720076, // FL M1TN 0
SelectorULValue = 0x00720078, // UL M1TN 0
SelectorUSValue = 0x0072007A, // US M1TN 0
@@ -2979,6 +3036,20 @@ UnifiedProcedureStepListStatus = 0x00741246, // CS M1 0
BeamOrderIndex = 0x00741324, // UL M1 0
DoubleExposureMeterset = 0x00741338, // FD M1 0
DoubleExposureFieldDelta = 0x0074133A, // FD M4 0
+BrachyTaskSequence = 0x00741401, // SQ M1 0
+ContinuationStartTotalReferenceAirKerma = 0x00741402, // DS M1 0
+ContinuationEndTotalReferenceAirKerma = 0x00741403, // DS M1 0
+ContinuationPulseNumber = 0x00741404, // IS M1 0
+ChannelDeliveryOrderSequence = 0x00741405, // SQ M1 0
+ReferencedChannelNumber = 0x00741406, // IS M1 0
+StartCumulativeTimeWeight = 0x00741407, // DS M1 0
+EndCumulativeTimeWeight = 0x00741408, // DS M1 0
+OmittedChannelSequence = 0x00741409, // SQ M1 0
+ReasonForChannelOmission = 0x0074140A, // CS M1 0
+ReasonForChannelOmissionDescription = 0x0074140B, // LO M1 0
+ChannelDeliveryOrderIndex = 0x0074140C, // IS M1 0
+ChannelDeliveryContinuationSequence = 0x0074140D, // SQ M1 0
+OmittedApplicationSetupSequence = 0x0074140E, // SQ M1 0
ImplantAssemblyTemplateName = 0x00760001, // LO M1 0
ImplantAssemblyTemplateIssuer = 0x00760003, // LO M1 0
ImplantAssemblyTemplateVersion = 0x00760006, // LO M1 0
@@ -3033,6 +3104,29 @@ UValueData = 0x00800010, // OF M1TN 0
VValueData = 0x00800011, // OF M1TN 0
ReferencedTextureSequence = 0x00800012, // SQ M1 0
ReferencedSurfaceDataSequence = 0x00800013, // SQ M1 0
+AssessmentSummary = 0x00820001, // CS M1 0
+AssessmentSummaryDescription = 0x00820003, // UT M1 0
+AssessedSOPInstanceSequence = 0x00820004, // SQ M1 0
+ReferencedComparisonSOPInstanceSequence = 0x00820005, // SQ M1 0
+NumberOfAssessmentObservations = 0x00820006, // UL M1 0
+AssessmentObservationsSequence = 0x00820007, // SQ M1 0
+ObservationSignificance = 0x00820008, // CS M1 0
+ObservationDescription = 0x0082000A, // UT M1 0
+StructuredContraintObservationSequence = 0x0082000C, // SQ M1 0
+AssessedAttributeValueSequence = 0x00820010, // SQ M1 0
+AssessmentSetID = 0x00820016, // LO M1 0
+AssessmentRequesterSequence = 0x00820017, // SQ M1 0
+SelectorAttributeName = 0x00820018, // LO M1 0
+SelectorAttributeKeyword = 0x00820019, // LO M1 0
+AssessmentTypeCodeSequence = 0x00820021, // SQ M1 0
+ObservationBasisCodeSequence = 0x00820022, // SQ M1 0
+AssessmentLabel = 0x00820023, // LO M1 0
+ConstraintType = 0x00820032, // CS M1 0
+SpecificationSelectionGuidance = 0x00820033, // UT M1 0
+ConstraintValueSequence = 0x00820034, // SQ M1 0
+RecommendedDefaultValueSequence = 0x00820035, // SQ M1 0
+ConstraintViolationSignificance = 0x00820036, // CS M1 0
+ConstraintViolationCondition = 0x00820037, // UT M1 0
StorageMediaFileSetID = 0x00880130, // SH M1 0
StorageMediaFileSetUID = 0x00880140, // UI M1 0
IconImageSequence = 0x00880200, // SQ M1 0
@@ -3156,7 +3250,7 @@ ExecutionStatusInfo = 0x21000030, // CS M1 0
CreationDate = 0x21000040, // DA M1 0
CreationTime = 0x21000050, // TM M1 0
Originator = 0x21000070, // AE M1 0
-DestinationAE = 0x21000140, // AE M1 1
+DestinationAE = 0x21000140, // AE M1 0
OwnerID = 0x21000160, // SH M1 0
NumberOfFilms = 0x21000170, // IS M1 0
ReferencedPrintJobSequencePullStoredPrint = 0x21000500, // SQ M1 1
@@ -3451,6 +3545,9 @@ BeamDoseVerificationControlPointSequence = 0x300A008C, // SQ M1 0
AverageBeamDosePointDepth = 0x300A008D, // FL M1 0
AverageBeamDosePointEquivalentDepth = 0x300A008E, // FL M1 0
AverageBeamDosePointSSD = 0x300A008F, // FL M1 0
+BeamDoseType = 0x300A0090, // CS M1 0
+AlternateBeamDose = 0x300A0091, // DS M1 0
+AlternateBeamDoseType = 0x300A0092, // CS M1 0
NumberOfBrachyApplicationSetups = 0x300A00A0, // IS M1 0
BrachyApplicationSetupDoseSpecificationPoint = 0x300A00A2, // DS M3 0
BrachyApplicationSetupDose = 0x300A00A4, // DS M1 0
@@ -3553,7 +3650,7 @@ TableTopLateralPosition = 0x300A012A, // DS M1 0
IsocenterPosition = 0x300A012C, // DS M3 0
SurfaceEntryPoint = 0x300A012E, // DS M3 0
SourceToSurfaceDistance = 0x300A0130, // DS M1 0
-AverageBeamDosePointSourceToExternalContourSurfaceDistance = 0x300A0131, // FL M1 0
+AverageBeamDosePointSourceToExternalContourDistance = 0x300A0131, // FL M1 0
SourceToExternalContourDistance = 0x300A0132, // FL M1 0
ExternalContourEntryPoint = 0x300A0133, // FL M3 0
CumulativeMetersetWeight = 0x300A0134, // DS M1 0
@@ -3565,6 +3662,12 @@ HeadFixationAngle = 0x300A0148, // FL M1 0
GantryPitchAngle = 0x300A014A, // FL M1 0
GantryPitchRotationDirection = 0x300A014C, // CS M1 0
GantryPitchAngleTolerance = 0x300A014E, // FL M1 0
+FixationEye = 0x300A0150, // CS M1 0
+ChairHeadFramePosition = 0x300A0151, // DS M1 0
+HeadFixationAngleTolerance = 0x300A0152, // DS M1 0
+ChairHeadFramePositionTolerance = 0x300A0153, // DS M1 0
+FixationLightAzimuthalAngleTolerance = 0x300A0154, // DS M1 0
+FixationLightPolarAngleTolerance = 0x300A0155, // DS M1 0
PatientSetupSequence = 0x300A0180, // SQ M1 0
PatientSetupNumber = 0x300A0182, // IS M1 0
PatientSetupLabel = 0x300A0183, // LO M1 0
@@ -3672,6 +3775,7 @@ RadiationMassNumber = 0x300A0302, // IS M1 0
RadiationAtomicNumber = 0x300A0304, // IS M1 0
RadiationChargeState = 0x300A0306, // SS M1 0
ScanMode = 0x300A0308, // CS M1 0
+ModulatedScanModeType = 0x300A0309, // CS M1 0
VirtualSourceAxisDistances = 0x300A030A, // FL M2 0
SnoutSequence = 0x300A030C, // SQ M1 0
SnoutPosition = 0x300A030D, // FL M1 0
@@ -3699,6 +3803,7 @@ BeamCurrentModulationID = 0x300A034C, // SH M1 0
PatientSupportType = 0x300A0350, // CS M1 0
PatientSupportID = 0x300A0352, // SH M1 0
PatientSupportAccessoryCode = 0x300A0354, // LO M1 0
+TrayAccessoryCode = 0x300A0355, // LO M1 0
FixationLightAzimuthalAngle = 0x300A0356, // FL M1 0
FixationLightPolarAngle = 0x300A0358, // FL M1 0
MetersetRate = 0x300A035A, // FL M1 0
@@ -3716,8 +3821,11 @@ RangeModulatorGatingStartWaterEquivalentThickness = 0x300A0386, // FL M1 0
RangeModulatorGatingStopWaterEquivalentThickness = 0x300A0388, // FL M1 0
IsocenterToRangeModulatorDistance = 0x300A038A, // FL M1 0
ScanSpotTuneID = 0x300A0390, // SH M1 0
+ScanSpotPrescribedIndices = 0x300A0391, // IS M1TN 0
NumberOfScanSpotPositions = 0x300A0392, // IS M1 0
+ScanSpotReordered = 0x300A0393, // CS M1 0
ScanSpotPositionMap = 0x300A0394, // FL M1TN 0
+ScanSpotReorderingAllowed = 0x300A0395, // CS M1 0
ScanSpotMetersetWeights = 0x300A0396, // FL M1TN 0
ScanningSpotSize = 0x300A0398, // FL M2 0
NumberOfPaintings = 0x300A039A, // IS M1 0
@@ -3752,6 +3860,18 @@ DeviceMotionControlSequence = 0x300A0450, // SQ M1 0
DeviceMotionExecutionMode = 0x300A0451, // CS M1 0
DeviceMotionObservationMode = 0x300A0452, // CS M1 0
DeviceMotionParameterCodeSequence = 0x300A0453, // SQ M1 0
+DistalDepthFraction = 0x300A0501, // FL M1 0
+DistalDepth = 0x300A0502, // FL M1 0
+NominalRangeModulationFractions = 0x300A0503, // FL M2 0
+NominalRangeModulatedRegionDepths = 0x300A0504, // FL M2 0
+DepthDoseParametersSequence = 0x300A0505, // SQ M1 0
+DeliveredDepthDoseParametersSequence = 0x300A0506, // SQ M1 0
+DeliveredDistalDepthFraction = 0x300A0507, // FL M1 0
+DeliveredDistalDepth = 0x300A0508, // FL M1 0
+DeliveredNominalRangeModulationFractions = 0x300A0509, // FL M2 0
+DeliveredNominalRangeModulatedRegionDepths = 0x300A0510, // FL M2 0
+DeliveredReferenceDoseDefinition = 0x300A0511, // CS M1 0
+ReferenceDoseDefinition = 0x300A0512, // CS M1 0
ReferencedRTPlanSequence = 0x300C0002, // SQ M1 0
ReferencedBeamSequence = 0x300C0004, // SQ M1 0
ReferencedBeamNumber = 0x300C0006, // IS M1 0
diff --git a/Source/vtkDICOMDictPrivate.cxx b/Source/vtkDICOMDictPrivate.cxx
index e4ccc3d..4d42239 100644
--- a/Source/vtkDICOMDictPrivate.cxx
+++ b/Source/vtkDICOMDictPrivate.cxx
@@ -1,9 +1,9 @@
/*=========================================================================
This is an automatically generated file. Include errata for any changes.
-This file was generated by parsetpl.py and makedict.py on Sep 28, 2015
+This file was generated by parsetpl.py and makedict.py on Jan 22, 2016
from the following files in David Clunie's dicom3tools package,
-dicom3tools_1.00.snapshot.20150717110018/libsrc/standard/elmdict/
+dicom3tools_1.00.snapshot.20160610072711/libsrc/standard/elmdict/
acuson.tpl dicondep.tpl hitachi.tpl papyrus.tpl siemens.tpl
agfa.tpl elscint.tpl isg.tpl philips.tpl spi.tpl
@@ -11,22 +11,49 @@ camtron.tpl gems.tpl other.tpl picker.tpl toshiba.tpl
Errata:
+AGFA
+-{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "Logarithmic PLT Full Scale" },
++{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "LogarithmicPLTFullScale" },
+AGFA PACS Archive Mirroring 1.0
+-{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "" },
+-{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "" },
++{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "StudyStatus" },
++{ 0x0031, 0x0001, 0, VR::CS, VM::M1, "DateTimeVerified" },
+MITRA LINKED ATTRIBUTES 1.0
+-{ 0x0031, 0x0020, 0, VR::IS, VM::M1, "" },
++{ 0x0031, 0x0020, 0, VR::LO, VM::M1, "GlobalPatientID" },
+MITRA OBJECT UTF8 ATTRIBUTES 1.0
+-{ 0x0033, 0x0002, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "" },
+-{ 0x0033, 0x0006, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x0008, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x000a, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "" },
+-{ 0x0033, 0x000e, 0, VR::OB, VM::M1, "" },
++{ 0x0033, 0x0002, 0, VR::PN, VM::M1, "PatientNameUTF8Encoded" },
++{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "StudyDescriptionUTF8Encoded" },
++{ 0x0033, 0x0006, 0, VR::PN, VM::M1, "ReferringPhysicianNameUTF8Encoded" },
++{ 0x0033, 0x0008, 0, VR::PN, VM::M1, "RequestingPhysicianNameUTF8Encoded" },
++{ 0x0033, 0x000a, 0, VR::PN, VM::M1, "PerformingPhysicianNameUTF8Encoded" },
++{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "ReasonForStudyUTF8Encoded" },
++{ 0x0033, 0x000e, 0, VR::LO, VM::M1, "StudyCommentsUTF8Encoded" },
SIEMENS MR HEADER
-{ 0x0051, 0x000b, 0, VR::SH, VM::M1, "AcquisitionMatrixText" },
+{ 0x0051, 0x000b, 0, VR::LO, VM::M1, "AcquisitionMatrixText" },
Applicare/Centricity Radiology Web/Version 2.0
-{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "Secondary pineLabel" },
+{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "SecondarySpineLabel" },
-GEMS_PARM_01
--{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBH Coefficients" },
-+{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBHCoefficients" },
--{ 0x0043, 0x0064, 0, VR::CS, VM::M1TN, "ImageFilter" },
-+{ 0x0043, 0x0064, 0, VR::LO, VM::M1, "ReconFilter" },
+GEMS_ADWSoft_3D1
+-{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "Reconstruction Parameters Sequence" },
++{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "ReconstructionParametersSequence" },
GEMS_DL_STUDY_01
-{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "Study Dose" },
+{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "StudyDose" },
-{ 0x0015, 0x0083, 0, VR::IS, VM::M1, "Study luoroTime" },
+{ 0x0015, 0x0083, 0, VR::IS, VM::M1, "StudyFluoroTime" },
+GEMS_DL_FRAME_01
+-{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "Table Lateral Position" },
++{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "TableLateralPosition" },
Philips MR Imaging DD 004
-{ 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "Sort Attributes" },
+{ 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "SortAttributes" },
@@ -47,7 +74,6 @@ AMI Sequence AnnotElements_01
GEMS_ACQU_01
-{ 0x0019, 0x0014, 0, VR::SS, VM::M1, "End NumberForBaseline" },
+{ 0x0019, 0x0014, 0, VR::SS, VM::M1, "EndNumberForBaseline" },
-GEMS_ACQU_01
-{ 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetition Time" },
+{ 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetitionTime" },
Applicare/RadWorks/Version 5.0
@@ -59,9 +85,27 @@ AMI Sequence Annotations_01
AMI ImageContext_01
-{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "Show mageOverlay" },
+{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "ShowImageOverlay" },
+AMI StudyExtensions_01
+-{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "Last Released Annot Label" },
++{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "LastReleasedAnnotLabel" },
+AMI ImageTransform_01
+-{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "Transformation Matrix" },
++{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" },
SIEMENS CSA REPORT
-{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOP InstanceUID" },
+{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOPInstanceUID" },
+GEMS_MR_RAW_01
++{ 0x7001, 0x1001, 0, VR::OB, VM::M1, "Rdb_hdr_rec" },
++{ 0x7001, 0x1002, 0, VR::OB, VM::M1, "Rdb_hdr_per_pass_tab" },
++{ 0x7001, 0x1003, 0, VR::OB, VM::M1, "Rdb_hdr_unlock_raw" },
++{ 0x7001, 0x1004, 0, VR::OB, VM::M1, "Rdb_hdr_data_acq_tab" },
++{ 0x7001, 0x1005, 0, VR::OB, VM::M1, "Rdb_hdr_nex_tab" },
++{ 0x7001, 0x1006, 0, VR::OB, VM::M1, "Rdb_hdr_nex_abort_tab" },
++{ 0x7001, 0x1007, 0, VR::OB, VM::M1, "Rdb_hdr_tool" },
++{ 0x7001, 0x1008, 0, VR::OB, VM::M1, "Rdb_raw_data" },
++{ 0x7001, 0x1009, 0, VR::OB, VM::M1, "SSPSave" },
++{ 0x7001, 0x100A, 0, VR::OB, VM::M1, "UDASave" },
++{ 0x7001, 0x100B, 0, VR::OB, VM::M1, "Rdb_chemsat_data" },
GEMS_FUNCTOOL_01
-{ 0x0051, 0x000c, 0, VR::SL, VM::M1, "WizardStateDataSize" },
-{ 0x0051, 0x000d, 0, VR::OB, VM::M1, "WizardState" },
@@ -76,6 +120,10 @@ GEMS_0039
GEMS_RELA_01
+{ 0x0021, 0x0094, 0, VR::LO, VM::M1TN, "AnnotationStrings" },
GEMS_PARM_01
+-{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBH Coefficients" },
++{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBHCoefficients" },
+-{ 0x0043, 0x0064, 0, VR::CS, VM::M1TN, "ImageFilter" },
++{ 0x0043, 0x0064, 0, VR::LO, VM::M1, "ReconFilter" },
+{ 0x0043, 0x009b, 0, VR::DS, VM::M1, "NPWFactor" },
+{ 0x0043, 0x009c, 0, VR::OB, VM::M1, "ResearchTag1" },
+{ 0x0043, 0x009d, 0, VR::OB, VM::M1, "ResearchTag2" },
@@ -119,6 +167,10 @@ GEMS_CT_CARDIAC_001
+{ 0x0049, 0x0025, 0, VR::OW, VM::M1, "PreBlendedCycle2" },
+{ 0x0049, 0x0026, 0, VR::CS, VM::M1, "CompressionAlg" },
GEHC_CT_ADVAPP_001
+-{ 0x0053, 0x0064, 0, VR::IS, VM::M1, "" },
+-{ 0x0053, 0x0065, 0, VR::IS, VM::M1, "" },
+-{ 0x0053, 0x0066, 0, VR::LO, VM::M1, "" },
+-{ 0x0053, 0x0067, 0, VR::IS, VM::M1, "" },
-{ 0x0053, 0x009D, 0, VR::LO, VM::M1, "" },
+{ 0x0053, 0x0063, 0, VR::CS, VM::M1, "ImagePositionPatientSetting" },
+{ 0x0053, 0x0064, 0, VR::IS, VM::M1, "ShutterMode" },
@@ -174,6 +226,96 @@ GEHC_CT_ADVAPP_001
+{ 0x0053, 0x009D, 0, VR::LO, VM::M1, "MARsAnnotation" },
+{ 0x0053, 0x009E, 0, VR::IS, VM::M1, "MultiEnergyNumNoiseRedPairs" },
+{ 0x0053, 0x009F, 0, VR::LO, VM::M1TN, "MultiEnergyNoiseRedString" },
+BRAINWAVE: 1.2.840.113819.3
++{ 0x2001, 0x0010, 0, VR::UI, VM::M1, "DICOMImplementationUID" },
++{ 0x2001, 0x0011, 0, VR::SH, VM::M1, "DICOMImplementationVersion" },
++{ 0x2001, 0x0012, 0, VR::UI, VM::M1, "WithinDICOMImplementationSOPInstanceUID"
++{ 0x2001, 0x0013, 0, VR::SH, VM::M1, "ApplicationName" },
++{ 0x2001, 0x0014, 0, VR::SH, VM::M1, "ApplicationVersion" },
++{ 0x2001, 0x0015, 0, VR::SH, VM::M1, "CompatibilityVersion" },
++{ 0x2001, 0x0021, 0, VR::UI, VM::M1TN, "ReferencedSeriesUID" },
++{ 0x2001, 0x0031, 0, VR::US, VM::M1, "NumberOfObjectsAveraged" },
++{ 0x2001, 0x0041, 0, VR::US, VM::M1, "NumberOfExpectedTimePoints" },
++{ 0x2001, 0x0051, 0, VR::US, VM::M1, "NumberOfSlicesPerVolume" },
++{ 0x2001, 0x0060, 0, VR::US, VM::M1, "BWImageType" },
++{ 0x2001, 0x0061, 0, VR::US, VM::M1, "ExperimentType" },
++{ 0x2001, 0x0071, 0, VR::UI, VM::M1, "ParadigmUID" },
++{ 0x2001, 0x0072, 0, VR::LO, VM::M1, "ParadigmName" },
++{ 0x2001, 0x0073, 0, VR::ST, VM::M1, "ParadigmDescription" },
++{ 0x2001, 0x0080, 0, VR::OB, VM::M1, "Contrast" },
++{ 0x2001, 0x0081, 0, VR::FL, VM::M1TN, "RegressorValues" },
++{ 0x2001, 0x0086, 0, VR::US, VM::M1, "NumberOfDegreesOfFreedom" },
++{ 0x2001, 0x008A, 0, VR::FL, VM::M1, "ZThreshold" },
++{ 0x2001, 0x008B, 0, VR::FL, VM::M1, "PThreshold" },
++{ 0x2001, 0x0090, 0, VR::OB, VM::M1, "ProcessingParameters" },
++{ 0x2001, 0x0091, 0, VR::OB, VM::M1, "MotionPlot" },
++{ 0x2001, 0x0092, 0, VR::OB, VM::M1, "ROIs" },
++{ 0x2001, 0x0093, 0, VR::OB, VM::M1, "Tracts" },
++{ 0x2001, 0x0094, 0, VR::OB, VM::M1, "Report" },
++{ 0x2001, 0x0095, 0, VR::OB, VM::M1, "ResponseData" },
++{ 0x2001, 0x0096, 0, VR::OB, VM::M1, "DesignMatrix" },
++{ 0x2001, 0x0097, 0, VR::FL, VM::M1TN, "QualityMetrics" },
++{ 0x2001, 0x00A0, 0, VR::FL, VM::M1TN, "MotionParameters" },
++{ 0x2001, 0x00A1, 0, VR::FL, VM::M1TN, "RegistrationParameters" },
++{ 0x2001, 0x00A2, 0, VR::FL, VM::M1TN, "SubjectData" },
++{ 0x2001, 0x00B0, 0, VR::OB, VM::M1, "DTIParameters" },
++{ 0x2001, 0x00C0, 0, VR::OB, VM::M1, "ParadigmInfo" },
+INTELERAD MEDICAL SYSTEMS
+-{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "" },
+-{ 0x0029, 0x0011, 0, VR::US, VM::M1, "" },
+-{ 0x0029, 0x0012, 0, VR::US, VM::M1, "" },
+-{ 0x0029, 0x0013, 0, VR::US, VM::M1, "" },
+-{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "" },
++{ 0x0029, 0x0001, 0, VR::FD, VM::M1, "ImageCompressionFraction" },
++{ 0x0029, 0x0002, 0, VR::FD, VM::M1, "ImageQuality" },
++{ 0x0029, 0x0003, 0, VR::FD, VM::M1, "ImageBytesTransferred" },
++{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "J2cParameterType" },
++{ 0x0029, 0x0011, 0, VR::US, VM::M1, "J2cPixelRepresentation" },
++{ 0x0029, 0x0012, 0, VR::US, VM::M1, "J2cBitsAllocated" },
++{ 0x0029, 0x0013, 0, VR::US, VM::M1, "J2cPixelShiftValue" },
++{ 0x0029, 0x0014, 0, VR::US, VM::M1, "J2cPlanarConfiguration" },
++{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "J2cRescaleIntercept" },
+-{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "MD5Sum" },
++{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "PixelDataMD5SumPerFrame" },
+-{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "" },
+-{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "" },
+-{ 0x3F01, 0x0004, 0, VR::LO, VM::M1, "" },
+-{ 0x3F01, 0x0005, 0, VR::AE, VM::M1, "" },
+-{ 0x3F01, 0x0007, 0, VR::LO, VM::M1, "" },
++{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "InstitutionCode" },
++{ 0x3F01, 0x0002, 0, VR::AE, VM::M1, "RoutedTransferAE" },
++{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "SourcedAE" },
++{ 0x3F01, 0x0004, 0, VR::SH, VM::M1, "DeferredValidation" },
++{ 0x3F01, 0x0005, 0, VR::LO, VM::M1, "SeriesOwner" },
++{ 0x3F01, 0x0007, 0, VR::SH, VM::M1, "StrippedPixelData" },
++{ 0x3F01, 0x0008, 0, VR::SH, VM::M1, "PendingMoveRequest" },
+CMR42 CIRCLECVI
++{ 0x0025, 0x0010, 0, VR::LO, VM::M1, "WorkspaceID" },
++{ 0x0025, 0x0020, 0, VR::LO, VM::M1, "WorkspaceTimeString" },
++{ 0x0025, 0x0030, 0, VR::LO, VM::M1, "WorkspaceStream" },
+Philips Imaging DD 129
+-{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "PresentationStateSequence" },
++{ 0x2001, 0x0001, 0, VR::SQ, VM::M1, "" },
+http://www.gemedicalsystems.com/it_solutions/rad_pacs/
+-{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "Reference to pacs study" },
+-{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "Reference to pacs image" },
+-{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "Pacs examnotes flag" },
++{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "ReferenceToPacsStudy" },
++{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "ReferenceToPacsImage" },
++{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "PacsExamnotesFlag" },
+http://www.gemedicalsystems.com/it_solutions/orthoview/2.1
+-{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoView Session Date/Time" },
+-{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoView Session Creator" },
+-{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoView Session Completion Flag" },
+-{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoView File Sequence" },
+-{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoView File Name" },
+-{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoView File Content" },
++{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoViewSessionDateTime" },
++{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoViewSessionCreator" },
++{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoViewSessionCompletionFlag" },
++{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoViewFileSequence" },
++{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoViewFileName" },
++{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoViewFileContent" },
=========================================================================*/
@@ -188,7 +330,7 @@ typedef vtkDICOMDictEntry::Entry DictEntry;
// ----- WG12 Supplement 43 -----
-DictEntry Dict001Contents[] = {
+const DictEntry Dict001Contents[] = {
{ 0x0009, 0x0001, 0, VR::SQ, VM::M1, "EventTimerSequence" },
{ 0x0009, 0x0002, 0, VR::FD, VM::M1, "EventTimeInterval" },
{ 0x0009, 0x0003, 0, VR::SQ, VM::M1, "EventCodeSequence" },
@@ -234,7 +376,7 @@ DictEntry Dict001Contents[] = {
{ 0x0041, 0x0001, 0, VR::CS, VM::M1, "PerformedProtocolType" },
};
-unsigned short Dict001TagHashTable[] = {
+const unsigned short Dict001TagHashTable[] = {
44, 49, 54, 59, 64, 69, 72, 43, 75, 43,
78, 81, 43, 43, 84, 43, 87, 90, 93, 43,
96, 99, 102, 107, 110, 43, 113, 43, 116, 119,
@@ -254,7 +396,7 @@ unsigned short Dict001TagHashTable[] = {
19, 8, 1, 30, 3,
};
-unsigned short Dict001KeyHashTable[] = {
+const unsigned short Dict001KeyHashTable[] = {
44, 43, 47, 43, 54, 43, 59, 43, 43, 43,
64, 67, 70, 43, 73, 76, 43, 79, 84, 87,
92, 97, 102, 43, 43, 107, 110, 113, 43, 116,
@@ -284,7 +426,7 @@ Dict001Contents
// ----- SVISION -----
-DictEntry Dict002Contents[] = {
+const DictEntry Dict002Contents[] = {
{ 0x0017, 0x0000, 0, VR::LO, VM::M1, "ExtendedBodyPart" },
{ 0x0017, 0x0010, 0, VR::LO, VM::M1, "ExtendedViewPosition" },
{ 0x0017, 0x0020, 0, VR::SQ, VM::M1, "ScheduledProcedureStepList" },
@@ -375,7 +517,7 @@ DictEntry Dict002Contents[] = {
{ 0x0029, 0x0005, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict002TagHashTable[] = {
+const unsigned short Dict002TagHashTable[] = {
89, 92, 101, 104, 109, 112, 88, 117, 120, 125,
132, 135, 88, 88, 88, 138, 141, 146, 88, 88,
149, 152, 88, 155, 158, 165, 172, 175, 88, 88,
@@ -410,7 +552,7 @@ unsigned short Dict002TagHashTable[] = {
80, 1, 38, 177, 1, 37, 176,
};
-unsigned short Dict002KeyHashTable[] = {
+const unsigned short Dict002KeyHashTable[] = {
88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
88, 88, 88, 89, 88, 88, 88, 88, 88, 88,
88, 88, 88, 88, 88, 88, 88, 88, 88, 88,
@@ -452,15 +594,15 @@ Dict002Contents
// ----- GEMS_XR3DCAL_01 -----
-DictEntry Dict003Contents[] = {
+const DictEntry Dict003Contents[] = {
{ 0x0021, 0x0020, 0, VR::LT, VM::M1, "GeneralizedCalibration" },
};
-unsigned short Dict003TagHashTable[] = {
+const unsigned short Dict003TagHashTable[] = {
2, 0, 1, 0, 32,
};
-unsigned short Dict003KeyHashTable[] = {
+const unsigned short Dict003KeyHashTable[] = {
2, 0, 1, 0, 46679,
};
@@ -475,7 +617,7 @@ Dict003Contents
// ----- GEMS_IMPS_01 -----
-DictEntry Dict004Contents[] = {
+const DictEntry Dict004Contents[] = {
{ 0x0029, 0x0004, 0, VR::SL, VM::M1, "LowerRangeOfPixels" },
{ 0x0029, 0x0005, 0, VR::DS, VM::M1, "LowerRangeOfPixels" },
{ 0x0029, 0x0006, 0, VR::DS, VM::M1, "LowerRangeOfPixels" },
@@ -493,7 +635,7 @@ DictEntry Dict004Contents[] = {
{ 0x0029, 0x0035, 0, VR::SL, VM::M1, "AdvantageCompUnderflow" },
};
-unsigned short Dict004TagHashTable[] = {
+const unsigned short Dict004TagHashTable[] = {
16, 23, 26, 33, 38, 41, 44, 15, 15, 15,
15, 15, 15, 47, 50, 0, 3, 0, 4, 7,
21, 12, 38, 1, 3, 7, 3, 2, 6, 5,
@@ -502,7 +644,7 @@ unsigned short Dict004TagHashTable[] = {
2, 1, 5, 13, 52,
};
-unsigned short Dict004KeyHashTable[] = {
+const unsigned short Dict004KeyHashTable[] = {
16, 19, 24, 27, 30, 15, 15, 15, 15, 15,
15, 33, 36, 15, 39, 0, 1, 13, 17181, 2,
8, 51880, 14, 36140, 1, 10, 51880, 1, 7, 53853,
@@ -522,16 +664,16 @@ Dict004Contents
// ----- Applicare/Centricity Radiology Web/Version 2.0 -----
-DictEntry Dict005Contents[] = {
+const DictEntry Dict005Contents[] = {
{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "SecondarySpineLabel" },
{ 0x4111, 0x0002, 0, VR::IS, VM::M1, "AdditionalTagsForPresentationState" },
};
-unsigned short Dict005TagHashTable[] = {
+const unsigned short Dict005TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 2,
};
-unsigned short Dict005KeyHashTable[] = {
+const unsigned short Dict005KeyHashTable[] = {
3, 6, 0, 1, 0, 62822, 1, 1, 41832,
};
@@ -546,15 +688,15 @@ Dict005Contents
// ----- TOSHIBA_MEC_OT3 -----
-DictEntry Dict006Contents[] = {
+const DictEntry Dict006Contents[] = {
{ 0x0009, 0x0000, 0, VR::LO, VM::M1, "HISRISStudyID" },
};
-unsigned short Dict006TagHashTable[] = {
+const unsigned short Dict006TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict006KeyHashTable[] = {
+const unsigned short Dict006KeyHashTable[] = {
2, 0, 1, 0, 20925,
};
@@ -569,7 +711,7 @@ Dict006Contents
// ----- GEIIS -----
-DictEntry Dict007Contents[] = {
+const DictEntry Dict007Contents[] = {
{ 0x0009, 0x0010, 0, VR::SQ, VM::M1, "GEPrivateImageThumbnailSequence" },
{ 0x0009, 0x0012, 0, VR::IS, VM::M1, "" },
{ 0x0029, 0x0010, 0, VR::UL, VM::M1, "ShiftCount" },
@@ -587,7 +729,7 @@ DictEntry Dict007Contents[] = {
{ 0x7fd1, 0x0060, 0, VR::UL, VM::M1TN, "SubbandBytecounts" },
};
-unsigned short Dict007TagHashTable[] = {
+const unsigned short Dict007TagHashTable[] = {
16, 19, 15, 15, 15, 22, 25, 15, 28, 15,
31, 36, 39, 48, 53, 0, 1, 6, 16, 1,
4, 20, 1, 10, 32, 1, 11, 48, 1, 9,
@@ -596,7 +738,7 @@ unsigned short Dict007TagHashTable[] = {
48, 13, 80, 1, 3, 18,
};
-unsigned short Dict007KeyHashTable[] = {
+const unsigned short Dict007KeyHashTable[] = {
16, 23, 15, 26, 15, 29, 32, 35, 38, 43,
15, 46, 49, 52, 55, 0, 3, 0, 15028, 10,
19611, 13, 20619, 1, 6, 52327, 1, 12, 41716, 1,
@@ -616,15 +758,15 @@ Dict007Contents
// ----- Philips NM Private Group -----
-DictEntry Dict008Contents[] = {
+const DictEntry Dict008Contents[] = {
{ 0x7043, 0x0000, 0, VR::SH, VM::M1, "" },
};
-unsigned short Dict008TagHashTable[] = {
+const unsigned short Dict008TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict008KeyHashTable[] = {
+const unsigned short Dict008KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
@@ -639,7 +781,7 @@ Dict008Contents
// ----- GEMS_ACRQA_1.0 BLOCK1 -----
-DictEntry Dict009Contents[] = {
+const DictEntry Dict009Contents[] = {
{ 0x0023, 0x0000, 0, VR::LO, VM::M1, "CRExposureMenuCode" },
{ 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRExposureMenuString" },
{ 0x0023, 0x0020, 0, VR::LO, VM::M1, "CREDRMode" },
@@ -652,14 +794,14 @@ DictEntry Dict009Contents[] = {
{ 0x0023, 0x0090, 0, VR::LO, VM::M1, "CRSShiftString" },
};
-unsigned short Dict009TagHashTable[] = {
+const unsigned short Dict009TagHashTable[] = {
10, 11, 16, 19, 22, 25, 28, 31, 34, 37,
0, 2, 1, 16, 8, 128, 1, 7, 112, 1,
2, 32, 1, 5, 80, 1, 0, 0, 1, 6,
96, 1, 9, 144, 1, 4, 64, 1, 3, 48,
};
-unsigned short Dict009KeyHashTable[] = {
+const unsigned short Dict009KeyHashTable[] = {
11, 14, 17, 22, 27, 10, 30, 35, 10, 10,
0, 1, 2, 48761, 1, 1, 46224, 2, 3, 41522,
5, 31050, 2, 6, 39736, 8, 39860, 1, 4, 55886,
@@ -677,7 +819,7 @@ Dict009Contents
// ----- GEMS_ACRQA_1.0 BLOCK3 -----
-DictEntry Dict010Contents[] = {
+const DictEntry Dict010Contents[] = {
{ 0x0023, 0x0000, 0, VR::DS, VM::M1, "CRDRE" },
{ 0x0023, 0x0010, 0, VR::US, VM::M1, "CRDRN" },
{ 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRORE" },
@@ -690,14 +832,14 @@ DictEntry Dict010Contents[] = {
{ 0x0023, 0x0090, 0, VR::LO, VM::M1, "CREnergySubtractionParameters" },
};
-unsigned short Dict010TagHashTable[] = {
+const unsigned short Dict010TagHashTable[] = {
10, 11, 16, 19, 22, 25, 28, 31, 34, 37,
0, 2, 1, 16, 8, 128, 1, 7, 112, 1,
2, 32, 1, 5, 80, 1, 0, 0, 1, 6,
96, 1, 9, 144, 1, 4, 64, 1, 3, 48,
};
-unsigned short Dict010KeyHashTable[] = {
+const unsigned short Dict010KeyHashTable[] = {
11, 14, 10, 17, 20, 23, 28, 33, 10, 36,
0, 1, 6, 9446, 1, 5, 26824, 1, 8, 55588,
1, 9, 43581, 2, 3, 37578, 4, 37577, 2, 1,
@@ -715,7 +857,7 @@ Dict010Contents
// ----- GEMS_ACRQA_1.0 BLOCK2 -----
-DictEntry Dict011Contents[] = {
+const DictEntry Dict011Contents[] = {
{ 0x0023, 0x0000, 0, VR::US, VM::M1, "CRSShift" },
{ 0x0023, 0x0010, 0, VR::DS, VM::M1, "CRCShift" },
{ 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRGT" },
@@ -728,14 +870,14 @@ DictEntry Dict011Contents[] = {
{ 0x0023, 0x0090, 0, VR::DS, VM::M1, "CRDRT" },
};
-unsigned short Dict011TagHashTable[] = {
+const unsigned short Dict011TagHashTable[] = {
10, 11, 16, 19, 22, 25, 28, 31, 34, 37,
0, 2, 1, 16, 8, 128, 1, 7, 112, 1,
2, 32, 1, 5, 80, 1, 0, 0, 1, 6,
96, 1, 9, 144, 1, 4, 64, 1, 3, 48,
};
-unsigned short Dict011KeyHashTable[] = {
+const unsigned short Dict011KeyHashTable[] = {
11, 10, 14, 10, 10, 21, 24, 27, 32, 35,
0, 1, 3, 34077, 3, 4, 34077, 6, 34115, 9,
36381, 1, 0, 28887, 1, 8, 34114, 2, 1, 64674,
@@ -753,15 +895,15 @@ Dict011Contents
// ----- Siemens Ultrasound Miscellaneous -----
-DictEntry Dict012Contents[] = {
+const DictEntry Dict012Contents[] = {
{ 0x0019, 0x0020, 0, VR::SH, VM::M1, "" },
};
-unsigned short Dict012TagHashTable[] = {
+const unsigned short Dict012TagHashTable[] = {
2, 0, 1, 0, 32,
};
-unsigned short Dict012KeyHashTable[] = {
+const unsigned short Dict012KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
@@ -776,7 +918,7 @@ Dict012Contents
// ----- SPI -----
-DictEntry Dict013Contents[] = {
+const DictEntry Dict013Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" },
{ 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" },
{ 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" },
@@ -787,13 +929,13 @@ DictEntry Dict013Contents[] = {
{ 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" },
};
-unsigned short Dict013TagHashTable[] = {
+const unsigned short Dict013TagHashTable[] = {
9, 14, 8, 8, 23, 8, 8, 8, 0, 2,
2, 64, 7, 96, 4, 0, 16, 3, 65, 4,
16, 6, 32, 2, 1, 21, 5, 21,
};
-unsigned short Dict013KeyHashTable[] = {
+const unsigned short Dict013KeyHashTable[] = {
9, 8, 12, 15, 18, 8, 23, 26, 0, 1,
2, 24415, 1, 3, 55708, 1, 0, 52021, 2, 4,
39623, 6, 29229, 1, 7, 57071, 2, 1, 1220, 5,
@@ -811,7 +953,7 @@ Dict013Contents
// ----- GE ??? From Adantage Review CS -----
-DictEntry Dict014Contents[] = {
+const DictEntry Dict014Contents[] = {
{ 0x0019, 0x0030, 0, VR::LO, VM::M1, "CREDRMode" },
{ 0x0019, 0x0040, 0, VR::LO, VM::M1, "CRLatitude" },
{ 0x0019, 0x0050, 0, VR::LO, VM::M1, "CRGroupNumber" },
@@ -820,13 +962,13 @@ DictEntry Dict014Contents[] = {
{ 0x0019, 0x0090, 0, VR::LO, VM::M1, "CRFilmOutputExposures" },
};
-unsigned short Dict014TagHashTable[] = {
+const unsigned short Dict014TagHashTable[] = {
7, 10, 13, 6, 16, 19, 0, 1, 2, 80,
1, 5, 144, 1, 3, 112, 1, 1, 64, 2,
0, 48, 4, 128,
};
-unsigned short Dict014KeyHashTable[] = {
+const unsigned short Dict014KeyHashTable[] = {
7, 6, 6, 6, 12, 17, 0, 2, 0, 59423,
3, 29905, 2, 1, 3667, 2, 5762, 2, 4, 44381,
5, 33146,
@@ -843,7 +985,7 @@ Dict014Contents
// ----- SIEMENS SMS-AX QUANT 1.0 -----
-DictEntry Dict015Contents[] = {
+const DictEntry Dict015Contents[] = {
{ 0x0023, 0x0000, 0, VR::DS, VM::M2, "HorizontalCalibrationPixelSize" },
{ 0x0023, 0x0001, 0, VR::DS, VM::M2, "VerticalCalibrationPixelSize" },
{ 0x0023, 0x0002, 0, VR::LO, VM::M1, "CalibrationObject" },
@@ -855,14 +997,14 @@ DictEntry Dict015Contents[] = {
{ 0x0023, 0x0008, 0, VR::IS, VM::M1, "CalibrationTableObjectDistance" },
};
-unsigned short Dict015TagHashTable[] = {
+const unsigned short Dict015TagHashTable[] = {
10, 13, 16, 19, 9, 22, 25, 28, 33, 0,
1, 7, 7, 1, 6, 6, 1, 5, 5, 1,
4, 4, 1, 3, 3, 1, 2, 2, 2, 1,
1, 8, 8, 1, 0, 0,
};
-unsigned short Dict015KeyHashTable[] = {
+const unsigned short Dict015KeyHashTable[] = {
10, 13, 9, 18, 9, 23, 9, 26, 31, 0,
1, 0, 13876, 2, 3, 18830, 5, 23389, 2, 1,
44985, 8, 15636, 1, 2, 21895, 2, 4, 18319, 6,
@@ -880,7 +1022,7 @@ Dict015Contents
// ----- AgilityRuntime -----
-DictEntry Dict016Contents[] = {
+const DictEntry Dict016Contents[] = {
{ 0x0011, 0x0020, 0, VR::LO, VM::M1, "" },
{ 0x0011, 0x0021, 0, VR::LO, VM::M1, "" },
{ 0x0011, 0x0022, 0, VR::LO, VM::M1, "" },
@@ -891,14 +1033,14 @@ DictEntry Dict016Contents[] = {
{ 0x0029, 0x001f, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict016TagHashTable[] = {
+const unsigned short Dict016TagHashTable[] = {
9, 14, 17, 20, 8, 25, 28, 8, 0, 2,
1, 33, 3, 17, 1, 0, 32, 1, 5, 19,
2, 2, 34, 4, 18, 1, 6, 20, 1, 7,
31,
};
-unsigned short Dict016KeyHashTable[] = {
+const unsigned short Dict016KeyHashTable[] = {
8, 8, 8, 8, 8, 9, 8, 8, 0, 8,
0, 672, 1, 672, 2, 672, 3, 672, 4, 672,
5, 672, 6, 672, 7, 672,
@@ -915,7 +1057,7 @@ Dict016Contents
// ----- SIEMENS RA GEN -----
-DictEntry Dict017Contents[] = {
+const DictEntry Dict017Contents[] = {
{ 0x0011, 0x0020, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x0025, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x0026, 0, VR::UL, VM::M1, "" },
@@ -1005,7 +1147,7 @@ DictEntry Dict017Contents[] = {
{ 0x0021, 0x0040, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict017TagHashTable[] = {
+const unsigned short Dict017TagHashTable[] = {
87, 88, 93, 96, 101, 106, 111, 116, 119, 122,
87, 131, 136, 139, 142, 145, 150, 153, 87, 160,
87, 163, 87, 166, 87, 169, 87, 172, 87, 87,
@@ -1041,7 +1183,7 @@ unsigned short Dict017TagHashTable[] = {
30, 76,
};
-unsigned short Dict017KeyHashTable[] = {
+const unsigned short Dict017KeyHashTable[] = {
87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
@@ -1082,7 +1224,7 @@ Dict017Contents
// ----- Mayo/IBM Archive Project -----
-DictEntry Dict018Contents[] = {
+const DictEntry Dict018Contents[] = {
{ 0x0021, 0x0001, 0, VR::UN, VM::M1, "" },
{ 0x0021, 0x0010, 0, VR::UN, VM::M1, "" },
{ 0x0021, 0x0011, 0, VR::UN, VM::M1, "" },
@@ -1108,7 +1250,7 @@ DictEntry Dict018Contents[] = {
{ 0x0021, 0x0065, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict018TagHashTable[] = {
+const unsigned short Dict018TagHashTable[] = {
24, 27, 30, 33, 36, 41, 46, 49, 52, 55,
60, 63, 66, 69, 72, 75, 78, 81, 84, 23,
87, 23, 23, 0, 1, 22, 101, 1, 17, 32,
@@ -1120,7 +1262,7 @@ unsigned short Dict018TagHashTable[] = {
31, 1, 15, 30, 1, 21, 96, 1, 20, 80,
};
-unsigned short Dict018KeyHashTable[] = {
+const unsigned short Dict018KeyHashTable[] = {
23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
23, 23, 24, 0, 23, 0, 233, 1, 233, 2,
@@ -1142,15 +1284,15 @@ Dict018Contents
// ----- SIEMENS SIENET -----
-DictEntry Dict019Contents[] = {
+const DictEntry Dict019Contents[] = {
{ 0x0019, 0x0001, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict019TagHashTable[] = {
+const unsigned short Dict019TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict019KeyHashTable[] = {
+const unsigned short Dict019KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
@@ -1165,7 +1307,7 @@ Dict019Contents
// ----- MDS NORDION OTP ANATOMY MODELLING -----
-DictEntry Dict020Contents[] = {
+const DictEntry Dict020Contents[] = {
{ 0x3005, 0x0000, 0, VR::SQ, VM::M1, "" },
{ 0x3005, 0x0002, 0, VR::CS, VM::M1, "" },
{ 0x3005, 0x0004, 0, VR::DS, VM::M1, "" },
@@ -1178,14 +1320,14 @@ DictEntry Dict020Contents[] = {
{ 0x3005, 0x0012, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict020TagHashTable[] = {
+const unsigned short Dict020TagHashTable[] = {
10, 11, 10, 18, 10, 25, 10, 30, 10, 33,
0, 3, 2, 4, 7, 14, 8, 16, 3, 3,
6, 4, 8, 9, 18, 2, 0, 0, 5, 10,
1, 1, 2, 1, 6, 12,
};
-unsigned short Dict020KeyHashTable[] = {
+const unsigned short Dict020KeyHashTable[] = {
10, 11, 10, 10, 10, 10, 10, 10, 10, 10,
0, 10, 0, 538, 1, 538, 2, 538, 3, 538,
4, 538, 5, 538, 6, 538, 7, 538, 8, 538,
@@ -1203,7 +1345,7 @@ Dict020Contents
// ----- SIEMENS CT APPL DATASET -----
-DictEntry Dict021Contents[] = {
+const DictEntry Dict021Contents[] = {
{ 0x0029, 0x0000, 0, VR::LT, VM::M1, "DualEnergyAlgorithmParameters" },
{ 0x0029, 0x0001, 0, VR::US, VM::M1, "ValidCTVolumeMBoxTasks" },
{ 0x0029, 0x0002, 0, VR::LT, VM::M1, "ScanOptions" },
@@ -1258,7 +1400,7 @@ DictEntry Dict021Contents[] = {
{ 0x0029, 0x0045, 0, VR::DS, VM::M1, "FrameCount" },
};
-unsigned short Dict021TagHashTable[] = {
+const unsigned short Dict021TagHashTable[] = {
53, 58, 63, 68, 73, 80, 87, 92, 97, 102,
107, 112, 117, 120, 123, 126, 129, 132, 52, 52,
52, 52, 52, 52, 135, 138, 141, 144, 147, 150,
@@ -1281,7 +1423,7 @@ unsigned short Dict021TagHashTable[] = {
19, 25, 1, 18, 24,
};
-unsigned short Dict021KeyHashTable[] = {
+const unsigned short Dict021KeyHashTable[] = {
53, 52, 52, 52, 56, 59, 62, 52, 52, 67,
74, 52, 52, 52, 79, 84, 93, 98, 52, 101,
106, 52, 52, 52, 52, 52, 109, 114, 121, 126,
@@ -1314,7 +1456,7 @@ Dict021Contents
// ----- DCMTK_ANONYMIZER -----
-DictEntry Dict022Contents[] = {
+const DictEntry Dict022Contents[] = {
{ 0x0009, 0x0000, 0, VR::SQ, VM::M1, "AnonymizerUIDMap" },
{ 0x0009, 0x0010, 0, VR::UI, VM::M1, "AnonymizerUIDKey" },
{ 0x0009, 0x0020, 0, VR::UI, VM::M1, "AnonymizerUIDValue" },
@@ -1323,13 +1465,13 @@ DictEntry Dict022Contents[] = {
{ 0x0009, 0x0050, 0, VR::LO, VM::M1, "AnonymizerPatientIDValue" },
};
-unsigned short Dict022TagHashTable[] = {
+const unsigned short Dict022TagHashTable[] = {
7, 10, 6, 13, 18, 21, 0, 1, 4, 64,
1, 1, 16, 2, 0, 0, 3, 48, 1, 5,
80, 1, 2, 32,
};
-unsigned short Dict022KeyHashTable[] = {
+const unsigned short Dict022KeyHashTable[] = {
6, 6, 7, 6, 6, 16, 0, 4, 1, 45231,
2, 25229, 4, 19471, 5, 21997, 2, 0, 45570, 3,
19810,
@@ -1344,25 +1486,44 @@ Dict022KeyHashTable,
Dict022Contents
};
-// ----- AGFA PACS Archive Mirroring 1.0 -----
+// ----- ULTRAVISUAL_TAG_SET1 -----
-DictEntry Dict023Contents[] = {
-{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "" },
-{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "" },
+const DictEntry Dict023Contents[] = {
+{ 0x0011, 0x0001, 0, VR::CS, VM::M1, "" },
+{ 0x0011, 0x0002, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x0003, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x0008, 0, VR::LO, VM::M1, "" },
+{ 0x0011, 0x0010, 0, VR::US, VM::M1, "" },
+{ 0x0011, 0x0011, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x0012, 0, VR::UI, VM::M1, "" },
+{ 0x0011, 0x0018, 0, VR::UL, VM::M1, "" },
+{ 0x0011, 0x0019, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x001a, 0, VR::CS, VM::M1, "" },
+{ 0x0011, 0x001b, 0, VR::IS, VM::M1, "" },
+{ 0x0011, 0x001c, 0, VR::IS, VM::M1, "" },
+{ 0x0011, 0x001d, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict023TagHashTable[] = {
- 3, 6, 0, 1, 1, 1, 1, 0, 0,
+const unsigned short Dict023TagHashTable[] = {
+ 14, 19, 13, 22, 13, 27, 30, 13, 33, 36,
+ 39, 42, 45, 0, 2, 5, 17, 11, 28, 1,
+ 4, 16, 2, 0, 1, 6, 18, 1, 2, 3,
+ 1, 1, 2, 1, 8, 25, 1, 7, 24, 1,
+ 10, 27, 1, 9, 26, 2, 3, 8, 12, 29,
};
-unsigned short Dict023KeyHashTable[] = {
- 2, 3, 0, 2, 0, 2690, 1, 2690,
+const unsigned short Dict023KeyHashTable[] = {
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 14, 0, 13, 0, 413, 1, 413, 2,
+ 413, 3, 413, 4, 413, 5, 413, 6, 413, 7,
+ 413, 8, 413, 9, 413, 10, 413, 11, 413, 12,
+ 413,
};
vtkDICOMDictionary::Dict Dict023Data = {
-"AGFA PACS Archive Mirroring 1.0",
-2,
-2,
+"ULTRAVISUAL_TAG_SET1",
+13,
+13,
Dict023TagHashTable,
Dict023KeyHashTable,
Dict023Contents
@@ -1370,18 +1531,18 @@ Dict023Contents
// ----- syngoDynamics -----
-DictEntry Dict024Contents[] = {
+const DictEntry Dict024Contents[] = {
{ 0x0021, 0x00ae, 0, VR::OB, VM::M1, "" },
{ 0x0021, 0x00b0, 0, VR::LO, VM::M1, "" },
{ 0x0021, 0x00b1, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict024TagHashTable[] = {
+const unsigned short Dict024TagHashTable[] = {
4, 3, 9, 0, 2, 0, 174, 1, 176, 1,
2, 177,
};
-unsigned short Dict024KeyHashTable[] = {
+const unsigned short Dict024KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2,
1793,
};
@@ -1397,19 +1558,19 @@ Dict024Contents
// ----- SIEMENS SYNGO ULTRA-SOUND TOYON DATA STREAMING -----
-DictEntry Dict025Contents[] = {
+const DictEntry Dict025Contents[] = {
{ 0x7FD1, 0x0001, 0, VR::OB, VM::M1, "Padding" },
{ 0x7FD1, 0x0009, 0, VR::OB, VM::M1, "VersionID" },
{ 0x7FD1, 0x0010, 0, VR::LO, VM::M1, "Payload" },
{ 0x7FD1, 0x0011, 0, VR::LO, VM::M1, "AfterPayload" },
};
-unsigned short Dict025TagHashTable[] = {
+const unsigned short Dict025TagHashTable[] = {
4, 4, 5, 8, 0, 1, 2, 16, 3, 0,
1, 1, 9, 3, 17,
};
-unsigned short Dict025KeyHashTable[] = {
+const unsigned short Dict025KeyHashTable[] = {
5, 10, 4, 13, 0, 2, 0, 19727, 1, 42278,
1, 3, 47800, 1, 2, 27755,
};
@@ -1425,7 +1586,7 @@ Dict025Contents
// ----- Hipaa Private Creator -----
-DictEntry Dict026Contents[] = {
+const DictEntry Dict026Contents[] = {
{ 0x0011, 0x0001, 0, VR::LT, VM::M1, "EncryptedInstanceCreatorID" },
{ 0x0011, 0x0002, 0, VR::LT, VM::M1, "EncryptedSOPInstanceUID" },
{ 0x0011, 0x0003, 0, VR::LT, VM::M1, "EncryptedAccessionNumber" },
@@ -1470,7 +1631,7 @@ DictEntry Dict026Contents[] = {
{ 0x0011, 0x0042, 0, VR::LT, VM::M1, "EncryptedUID" },
};
-unsigned short Dict026TagHashTable[] = {
+const unsigned short Dict026TagHashTable[] = {
43, 46, 49, 52, 55, 58, 61, 66, 71, 76,
81, 84, 87, 90, 93, 96, 99, 42, 102, 105,
108, 111, 114, 117, 120, 123, 42, 42, 42, 42,
@@ -1490,7 +1651,7 @@ unsigned short Dict026TagHashTable[] = {
37, 56,
};
-unsigned short Dict026KeyHashTable[] = {
+const unsigned short Dict026KeyHashTable[] = {
43, 48, 42, 42, 42, 51, 42, 54, 61, 64,
67, 72, 81, 42, 84, 89, 94, 99, 42, 42,
102, 42, 105, 42, 108, 42, 111, 114, 121, 42,
@@ -1520,16 +1681,16 @@ Dict026Contents
// ----- GEMS_GNHD_01 -----
-DictEntry Dict027Contents[] = {
+const DictEntry Dict027Contents[] = {
{ 0x0033, 0x0001, 0, VR::UN, VM::M1, "" },
{ 0x0033, 0x0002, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict027TagHashTable[] = {
+const unsigned short Dict027TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 2,
};
-unsigned short Dict027KeyHashTable[] = {
+const unsigned short Dict027KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
@@ -1544,7 +1705,7 @@ Dict027Contents
// ----- PAPYRUS 3.0 -----
-DictEntry Dict028Contents[] = {
+const DictEntry Dict028Contents[] = {
{ 0x0041, 0x0000, 0, VR::LT, VM::M1, "PapyrusComments" },
{ 0x0041, 0x0010, 0, VR::SQ, VM::M1, "PointerSequence" },
{ 0x0041, 0x0011, 0, VR::UL, VM::M1, "ImagePointer" },
@@ -1561,7 +1722,7 @@ DictEntry Dict028Contents[] = {
{ 0x0041, 0x0050, 0, VR::SQ, VM::M1, "ImageSequence" },
};
-unsigned short Dict028TagHashTable[] = {
+const unsigned short Dict028TagHashTable[] = {
15, 22, 27, 30, 14, 14, 14, 14, 35, 14,
38, 41, 44, 47, 0, 3, 5, 20, 8, 34,
11, 65, 2, 6, 21, 9, 49, 1, 10, 50,
@@ -1570,7 +1731,7 @@ unsigned short Dict028TagHashTable[] = {
7, 33,
};
-unsigned short Dict028KeyHashTable[] = {
+const unsigned short Dict028KeyHashTable[] = {
14, 14, 15, 18, 14, 23, 14, 26, 29, 34,
14, 37, 44, 49, 0, 1, 4, 43943, 2, 1,
49618, 9, 38509, 1, 13, 32018, 1, 0, 44436, 2,
@@ -1588,9 +1749,39 @@ Dict028KeyHashTable,
Dict028Contents
};
+// ----- Philips MR Imaging DD 003 -----
+
+const DictEntry Dict029Contents[] = {
+{ 0x2005, 0x0082, 0, VR::CS, VM::M1TN, "RunningAttributes" },
+};
+
+const unsigned short Dict029TagHashTable[] = {
+ 2, 0, 1, 0, 130,
+};
+
+const unsigned short Dict029KeyHashTable[] = {
+ 2, 0, 1, 0, 45837,
+};
+
+vtkDICOMDictionary::Dict Dict029Data = {
+"Philips MR Imaging DD 003",
+1,
+1,
+Dict029TagHashTable,
+Dict029KeyHashTable,
+Dict029Contents
+};
+
// ----- ACUSON -----
-DictEntry Dict029Contents[] = {
+const DictEntry Dict030Contents[] = {
+{ 0x0009, 0x0000, 0, VR::IS, VM::M1, "" },
+{ 0x0009, 0x0001, 0, VR::IS, VM::M1, "" },
+{ 0x0009, 0x0002, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0003, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0004, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0005, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0006, 0, VR::UN, VM::M1, "" },
{ 0x0009, 0x0007, 0, VR::UN, VM::M1, "" },
{ 0x0009, 0x0008, 0, VR::LT, VM::M1, "" },
{ 0x0009, 0x0009, 0, VR::LT, VM::M1, "" },
@@ -1608,40 +1799,47 @@ DictEntry Dict029Contents[] = {
{ 0x0009, 0x0015, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict029TagHashTable[] = {
- 16, 19, 22, 25, 28, 31, 34, 37, 15, 40,
- 43, 46, 49, 52, 55, 0, 1, 2, 9, 1,
- 1, 8, 1, 4, 11, 1, 3, 10, 1, 6,
- 13, 1, 5, 12, 1, 8, 15, 1, 7, 14,
- 1, 10, 17, 1, 9, 16, 1, 12, 19, 1,
- 11, 18, 1, 14, 21, 2, 0, 7, 13, 20,
+const unsigned short Dict030TagHashTable[] = {
+ 23, 26, 29, 34, 39, 44, 49, 54, 59, 62,
+ 65, 68, 71, 74, 77, 80, 22, 22, 22, 22,
+ 22, 22, 0, 1, 9, 9, 1, 8, 8, 2,
+ 11, 11, 17, 17, 2, 10, 10, 16, 16, 2,
+ 13, 13, 19, 19, 2, 12, 12, 18, 18, 2,
+ 15, 15, 21, 21, 2, 14, 14, 20, 20, 1,
+ 1, 1, 1, 0, 0, 1, 3, 3, 1, 2,
+ 2, 1, 5, 5, 1, 4, 4, 1, 7, 7,
+ 1, 6, 6,
};
-unsigned short Dict029KeyHashTable[] = {
- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 16, 15, 15, 15, 0, 15, 0, 358, 1,
- 358, 2, 358, 3, 358, 4, 358, 5, 358, 6,
- 358, 7, 358, 8, 358, 9, 358, 10, 358, 11,
- 358, 12, 358, 13, 358, 14, 358,
+const unsigned short Dict030KeyHashTable[] = {
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 23, 22, 22, 22, 22, 22, 22,
+ 22, 22, 0, 22, 0, 244, 1, 244, 2, 244,
+ 3, 244, 4, 244, 5, 244, 6, 244, 7, 244,
+ 8, 244, 9, 244, 10, 244, 11, 244, 12, 244,
+ 13, 244, 14, 244, 15, 244, 16, 244, 17, 244,
+ 18, 244, 19, 244, 20, 244, 21, 244,
};
-vtkDICOMDictionary::Dict Dict029Data = {
+vtkDICOMDictionary::Dict Dict030Data = {
"ACUSON",
-15,
-15,
-Dict029TagHashTable,
-Dict029KeyHashTable,
-Dict029Contents
+22,
+22,
+Dict030TagHashTable,
+Dict030KeyHashTable,
+Dict030Contents
};
// ----- Philips MR Imaging DD 001 -----
-DictEntry Dict030Contents[] = {
+const DictEntry Dict031Contents[] = {
{ 0x2005, 0x0000, 0, VR::FL, VM::M1, "ImageAngulationAP" },
{ 0x2005, 0x0001, 0, VR::FL, VM::M1, "ImageAngulationFH" },
{ 0x2005, 0x0002, 0, VR::FL, VM::M1, "ImageAngulationRL" },
+{ 0x2005, 0x0003, 0, VR::IS, VM::M1, "ImageAnnotationCount" },
{ 0x2005, 0x0004, 0, VR::CS, VM::M1, "ImageDisplayOrientation" },
{ 0x2005, 0x0005, 0, VR::CS, VM::M1, "SynergyReconstructionType" },
+{ 0x2005, 0x0007, 0, VR::IS, VM::M1, "ImageLineCount" },
{ 0x2005, 0x0008, 0, VR::FL, VM::M1, "ImageOffcenterAP" },
{ 0x2005, 0x0009, 0, VR::FL, VM::M1, "ImageOffcenterFH" },
{ 0x2005, 0x000a, 0, VR::FL, VM::M1, "ImageOffCentreRL" },
@@ -1711,7 +1909,7 @@ DictEntry Dict030Contents[] = {
{ 0x2005, 0x004b, 0, VR::IS, VM::M1TN, "ReferencedEchoNumber" },
{ 0x2005, 0x004c, 0, VR::CS, VM::M1TN, "ReferencedEntity" },
{ 0x2005, 0x004d, 0, VR::CS, VM::M1TN, "ReferencedImageType" },
-{ 0x2005, 0x004e, 0, VR::FL, VM::M1, "SlabFOVRL" },
+{ 0x2005, 0x004e, 0, VR::FL, VM::M1TN, "SlabFOVRL" },
{ 0x2005, 0x004f, 0, VR::FL, VM::M1TN, "SlabOffcentreAP" },
{ 0x2005, 0x0050, 0, VR::FL, VM::M1TN, "SlabOffcentreFH" },
{ 0x2005, 0x0051, 0, VR::FL, VM::M1TN, "SlabOffcentreRL" },
@@ -1727,7 +1925,7 @@ DictEntry Dict030Contents[] = {
{ 0x2005, 0x005b, 0, VR::FL, VM::M1TN, "VolumeOffcentreFH" },
{ 0x2005, 0x005c, 0, VR::FL, VM::M1TN, "VolumeOffcentreRL" },
{ 0x2005, 0x005d, 0, VR::CS, VM::M1TN, "VolumeType" },
-{ 0x2005, 0x005e, 0, VR::CS, VM::M1, "VolumeViewAxis" },
+{ 0x2005, 0x005e, 0, VR::CS, VM::M1TN, "VolumeViewAxis" },
{ 0x2005, 0x005f, 0, VR::CS, VM::M1, "StudyOrigin" },
{ 0x2005, 0x0060, 0, VR::IS, VM::M1, "StudySequenceNumber" },
{ 0x2005, 0x0061, 0, VR::CS, VM::M1, "PrepulseType" },
@@ -1765,6 +1963,12 @@ DictEntry Dict030Contents[] = {
{ 0x2005, 0x0087, 0, VR::SL, VM::M1TN, "NumberOfGeometrySlices" },
{ 0x2005, 0x0088, 0, VR::FL, VM::M1TN, "GeomAngulationAP" },
{ 0x2005, 0x0089, 0, VR::FL, VM::M1TN, "GeomAngulationFH" },
+{ 0x2005, 0x008A, 0, VR::FL, VM::M1TN, "GeomAngulationRL" },
+{ 0x2005, 0x008B, 0, VR::FL, VM::M1TN, "GeomFOVAP" },
+{ 0x2005, 0x008C, 0, VR::FL, VM::M1TN, "GeomFOVFH" },
+{ 0x2005, 0x008D, 0, VR::FL, VM::M1TN, "GeomFOVRL" },
+{ 0x2005, 0x008E, 0, VR::FL, VM::M1TN, "GeomOffCentreAP" },
+{ 0x2005, 0x008F, 0, VR::FL, VM::M1TN, "GeomOffCentreFH" },
{ 0x2005, 0x0090, 0, VR::FL, VM::M1TN, "GeomOffCentreRL" },
{ 0x2005, 0x0091, 0, VR::CS, VM::M1TN, "GeomPreparationDirect" },
{ 0x2005, 0x0092, 0, VR::FL, VM::M1TN, "GeomRadialAngle" },
@@ -1775,7 +1979,11 @@ DictEntry Dict030Contents[] = {
{ 0x2005, 0x0097, 0, VR::CS, VM::M1TN, "GeomViewAxis" },
{ 0x2005, 0x0098, 0, VR::CS, VM::M1TN, "GeomColour" },
{ 0x2005, 0x0099, 0, VR::CS, VM::M1TN, "GeomApplicationType" },
-{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "Geometry" },
+{ 0x2005, 0x009a, 0, VR::SL, VM::M1TN, "GeomId" },
+{ 0x2005, 0x009b, 0, VR::SH, VM::M1TN, "GeomApplicationName" },
+{ 0x2005, 0x009c, 0, VR::SH, VM::M1TN, "GeomLabelName" },
+{ 0x2005, 0x009d, 0, VR::CS, VM::M1TN, "GeomLineStyle" },
+{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "SeriesGeometry" },
{ 0x2005, 0x009f, 0, VR::CS, VM::M1, "SpectralSelectiveExcitationPulse" },
{ 0x2005, 0x00a0, 0, VR::FL, VM::M1, "DynamicScanBeginTime" },
{ 0x2005, 0x00a1, 0, VR::CS, VM::M1, "SyncraScanType" },
@@ -1786,152 +1994,160 @@ DictEntry Dict030Contents[] = {
{ 0x2005, 0x00a6, 0, VR::IS, VM::M1, "StackChannelCombi" },
{ 0x2005, 0x00a7, 0, VR::CS, VM::M1, "StackCoilConnection" },
{ 0x2005, 0x00a8, 0, VR::DS, VM::M1, "InversionTime" },
-{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "SeriesGeometryCorrection" },
+{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "GeometryCorrection" },
{ 0x2005, 0x00b0, 0, VR::FL, VM::M1, "DiffusionDirectionRL" },
{ 0x2005, 0x00b1, 0, VR::FL, VM::M1, "DiffusionDirectionAP" },
{ 0x2005, 0x00b2, 0, VR::FL, VM::M1, "DiffusionDirectionFH" },
-{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "SeriesScanSequence" },
+{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "ScanSequence" },
};
-unsigned short Dict030TagHashTable[] = {
- 154, 154, 154, 154, 155, 158, 154, 154, 161, 164,
- 154, 167, 170, 173, 176, 179, 182, 185, 188, 191,
+const unsigned short Dict031TagHashTable[] = {
+ 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 167, 170, 173, 166, 176, 179, 182, 185, 188, 191,
194, 197, 200, 203, 206, 209, 212, 215, 218, 221,
- 224, 229, 234, 239, 244, 249, 252, 257, 260, 263,
- 266, 269, 272, 275, 278, 283, 288, 293, 298, 303,
- 308, 313, 318, 323, 328, 333, 338, 341, 344, 347,
- 350, 355, 360, 365, 370, 375, 380, 385, 390, 395,
- 400, 403, 406, 409, 412, 415, 418, 423, 428, 431,
- 434, 437, 440, 443, 448, 453, 458, 461, 464, 467,
- 470, 473, 476, 479, 482, 485, 488, 491, 494, 497,
- 500, 505, 508, 511, 514, 517, 154, 520, 523, 526,
- 529, 532, 535, 538, 541, 544, 547, 550, 553, 154,
- 556, 559, 562, 565, 154, 154, 568, 154, 571, 574,
- 577, 580, 154, 154, 154, 154, 154, 154, 154, 154,
- 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
- 154, 154, 154, 154, 0, 1, 4, 5, 1, 3,
- 4, 1, 1, 1, 1, 0, 0, 1, 2, 2,
- 1, 10, 13, 1, 9, 12, 1, 12, 15, 1,
- 11, 14, 1, 6, 9, 1, 5, 8, 1, 8,
- 11, 1, 7, 10, 1, 18, 21, 1, 17, 20,
- 1, 20, 23, 1, 19, 22, 1, 14, 17, 1,
- 13, 16, 1, 16, 19, 1, 15, 18, 1, 26,
- 29, 1, 25, 28, 2, 28, 31, 125, 135, 2,
- 27, 30, 124, 134, 2, 22, 25, 123, 133, 2,
- 21, 24, 122, 132, 2, 24, 27, 121, 131, 1,
- 23, 26, 2, 33, 37, 120, 129, 1, 119, 128,
- 1, 35, 39, 1, 34, 38, 1, 30, 33, 1,
- 29, 32, 1, 32, 35, 1, 31, 34, 2, 41,
- 45, 127, 137, 2, 40, 44, 126, 136, 2, 43,
- 47, 135, 151, 2, 42, 46, 134, 150, 2, 37,
- 41, 133, 149, 2, 36, 40, 132, 148, 2, 39,
- 43, 131, 147, 2, 38, 42, 130, 146, 2, 49,
- 53, 129, 145, 2, 48, 52, 128, 144, 2, 51,
- 55, 139, 159, 2, 50, 54, 138, 158, 1, 45,
- 49, 1, 44, 48, 1, 47, 51, 1, 46, 50,
- 2, 57, 61, 137, 153, 2, 56, 60, 136, 152,
- 2, 59, 63, 147, 167, 2, 58, 62, 146, 166,
- 2, 53, 57, 145, 165, 2, 52, 56, 144, 164,
- 2, 55, 59, 143, 163, 2, 54, 58, 142, 162,
- 2, 64, 68, 141, 161, 2, 65, 69, 140, 160,
- 1, 66, 70, 1, 67, 71, 1, 60, 64, 1,
- 61, 65, 1, 62, 66, 1, 63, 67, 2, 72,
- 76, 149, 169, 2, 73, 77, 148, 168, 1, 74,
- 78, 1, 75, 79, 1, 68, 72, 1, 69, 73,
- 1, 70, 74, 2, 71, 75, 152, 178, 2, 80,
- 84, 151, 177, 2, 81, 85, 150, 176, 1, 82,
- 86, 1, 83, 87, 1, 76, 80, 1, 77, 81,
- 1, 78, 82, 1, 79, 83, 1, 88, 92, 1,
- 89, 93, 1, 90, 94, 1, 91, 95, 1, 84,
- 88, 1, 85, 89, 1, 86, 90, 1, 87, 91,
- 2, 95, 100, 153, 192, 1, 96, 101, 1, 97,
- 102, 1, 98, 103, 1, 92, 96, 1, 93, 97,
- 1, 94, 99, 1, 103, 108, 1, 104, 109, 1,
- 105, 110, 1, 106, 111, 1, 99, 104, 1, 100,
- 105, 1, 101, 106, 1, 102, 107, 1, 111, 116,
- 1, 112, 117, 1, 113, 118, 1, 107, 112, 1,
- 108, 113, 1, 109, 114, 1, 110, 115, 1, 118,
- 126, 1, 114, 120, 1, 115, 121, 1, 116, 122,
- 1, 117, 123,
-};
-
-unsigned short Dict030KeyHashTable[] = {
- 155, 154, 154, 158, 154, 154, 163, 154, 168, 173,
- 178, 185, 198, 201, 204, 154, 211, 154, 214, 219,
- 222, 225, 232, 235, 154, 238, 154, 154, 154, 154,
- 154, 241, 244, 154, 154, 154, 247, 250, 255, 260,
- 265, 154, 268, 154, 273, 276, 154, 279, 154, 282,
- 154, 154, 285, 290, 293, 296, 301, 308, 311, 154,
- 154, 314, 154, 154, 317, 154, 322, 325, 154, 328,
- 331, 154, 334, 337, 154, 344, 154, 154, 154, 347,
- 350, 353, 154, 356, 361, 364, 154, 369, 374, 154,
- 379, 382, 387, 390, 154, 397, 400, 154, 154, 403,
- 154, 154, 154, 410, 154, 413, 416, 154, 423, 154,
- 426, 429, 154, 436, 441, 446, 453, 154, 154, 154,
- 154, 154, 456, 154, 459, 154, 154, 466, 154, 154,
- 471, 474, 479, 154, 154, 486, 489, 154, 492, 495,
- 500, 507, 154, 510, 515, 520, 523, 528, 533, 540,
- 547, 552, 154, 154, 0, 1, 33, 26803, 2, 96,
-51718, 131, 25182, 2, 71, 46113, 123, 35877, 2, 86,
-43029, 121, 57289, 2, 13, 2754, 49, 55612, 3, 17,
- 4821, 36, 39351, 53, 41583, 6, 0, 58352, 5, 32121,
- 34, 60629, 45, 29628, 83, 20403, 87, 43030, 1, 106,
-47562, 1, 130, 42226, 3, 1, 58353, 6, 32122, 84,
-20404, 1, 100, 49025, 2, 80, 31859, 114, 7623, 1,
- 101, 49026, 1, 108, 56729, 3, 81, 31860, 115, 7624,
- 129, 332, 1, 14, 4498, 1, 109, 56730, 1, 16,
-20610, 1, 70, 24612, 1, 95, 28483, 1, 63, 43114,
- 2, 30, 65514, 135, 50540, 2, 4, 4930, 35, 63512,
- 2, 55, 53916, 134, 46164, 1, 29, 22773, 2, 22,
-23670, 149, 61673, 1, 12, 36381, 1, 72, 34644, 1,
- 124, 52416, 1, 56, 51239, 2, 113, 14792, 151, 40233,
- 1, 103, 28531, 1, 54, 55213, 2, 20, 1741, 152,
-40234, 3, 46, 23381, 61, 39643, 104, 28532, 1, 136,
-51604, 1, 39, 58257, 1, 42, 28859, 2, 26, 5258,
- 118, 1319, 1, 38, 33570, 1, 117, 45531, 1, 143,
- 2345, 1, 47, 37507, 1, 28, 57755, 3, 21, 59828,
- 66, 9850, 140, 51793, 1, 37, 5074, 1, 79, 29492,
- 1, 126, 28080, 1, 138, 50096, 2, 78, 30999, 127,
-28081, 1, 153, 11809, 2, 77, 558, 90, 39836, 2,
- 27, 8879, 67, 19476, 2, 125, 37761, 139, 7384, 1,
- 133, 48478, 2, 52, 21761, 93, 37590, 1, 146, 12341,
- 3, 8, 45786, 89, 52469, 98, 45768, 1, 120, 64814,
- 1, 99, 28775, 3, 59, 60698, 105, 7582, 148, 59939,
- 1, 88, 43032, 1, 142, 59875, 3, 2, 58355, 85,
-20406, 92, 4711, 1, 25, 13519, 1, 119, 44957, 3,
- 10, 9630, 102, 49028, 111, 14788, 2, 82, 31862, 116,
- 7626, 2, 32, 46719, 112, 14789, 3, 9, 47582, 31,
- 5021, 110, 56732, 1, 23, 27452, 1, 141, 40165, 3,
- 7, 41615, 11, 11922, 50, 40526, 2, 44, 6828, 51,
-56517, 1, 48, 27159, 2, 19, 25049, 128, 32986, 3,
- 18, 3119, 107, 5332, 132, 43210, 1, 69, 44547, 1,
- 97, 50583, 1, 91, 6646, 2, 58, 46551, 94, 25859,
- 3, 15, 50673, 65, 56757, 144, 32211, 1, 145, 32211,
- 2, 41, 35172, 62, 17462, 2, 24, 2725, 75, 554,
- 1, 137, 9949, 2, 3, 62428, 147, 47696, 2, 76,
- 555, 150, 40236, 3, 43, 11112, 68, 54887, 74, 28534,
- 3, 64, 10228, 73, 34516, 122, 12489, 2, 57, 28759,
- 60, 52921, 1, 40, 31947,
+ 224, 227, 230, 233, 236, 239, 242, 245, 248, 251,
+ 254, 257, 260, 166, 263, 266, 269, 272, 275, 280,
+ 285, 290, 295, 300, 303, 308, 313, 318, 323, 328,
+ 333, 338, 343, 348, 353, 358, 363, 368, 373, 378,
+ 383, 388, 393, 398, 403, 408, 413, 418, 423, 428,
+ 433, 438, 443, 448, 453, 458, 463, 468, 473, 476,
+ 479, 482, 485, 488, 491, 496, 501, 504, 507, 510,
+ 513, 516, 521, 526, 531, 534, 537, 540, 543, 546,
+ 549, 552, 166, 555, 558, 561, 564, 567, 570, 575,
+ 578, 581, 584, 587, 590, 166, 593, 596, 599, 602,
+ 166, 166, 605, 166, 608, 611, 614, 617, 166, 166,
+ 166, 166, 166, 166, 166, 166, 166, 166, 166, 166,
+ 166, 166, 166, 166, 166, 166, 0, 1, 5, 5,
+ 1, 4, 4, 1, 6, 7, 1, 1, 1, 1,
+ 0, 0, 1, 3, 3, 1, 2, 2, 1, 12,
+ 13, 1, 11, 12, 1, 14, 15, 1, 13, 14,
+ 1, 8, 9, 1, 7, 8, 1, 10, 11, 1,
+ 9, 10, 1, 20, 21, 1, 19, 20, 1, 22,
+ 23, 1, 21, 22, 1, 16, 17, 1, 15, 16,
+ 1, 18, 19, 1, 17, 18, 1, 28, 29, 1,
+ 27, 28, 1, 30, 31, 1, 29, 30, 1, 24,
+ 25, 1, 23, 24, 1, 26, 27, 1, 25, 26,
+ 1, 35, 37, 1, 37, 39, 1, 36, 38, 1,
+ 32, 33, 1, 31, 32, 2, 34, 35, 127, 135,
+ 2, 33, 34, 126, 134, 2, 43, 45, 125, 133,
+ 2, 42, 44, 124, 132, 2, 45, 47, 123, 131,
+ 1, 44, 46, 2, 39, 41, 122, 129, 2, 38,
+ 40, 121, 128, 2, 41, 43, 135, 143, 2, 40,
+ 42, 134, 142, 2, 51, 53, 133, 141, 2, 50,
+ 52, 132, 140, 2, 53, 55, 131, 139, 2, 52,
+ 54, 130, 138, 2, 47, 49, 129, 137, 2, 46,
+ 48, 128, 136, 2, 49, 51, 143, 151, 2, 48,
+ 50, 142, 150, 2, 59, 61, 141, 149, 2, 58,
+ 60, 140, 148, 2, 61, 63, 139, 147, 2, 60,
+ 62, 138, 146, 2, 55, 57, 137, 145, 2, 54,
+ 56, 136, 144, 2, 57, 59, 151, 159, 2, 56,
+ 58, 150, 158, 2, 66, 68, 149, 157, 2, 67,
+ 69, 148, 156, 2, 68, 70, 147, 155, 2, 69,
+ 71, 146, 154, 2, 62, 64, 145, 153, 2, 63,
+ 65, 144, 152, 2, 64, 66, 159, 167, 2, 65,
+ 67, 158, 166, 2, 74, 76, 157, 165, 2, 75,
+ 77, 156, 164, 2, 76, 78, 155, 163, 2, 77,
+ 79, 154, 162, 2, 70, 72, 153, 161, 2, 71,
+ 73, 152, 160, 1, 72, 74, 1, 73, 75, 1,
+ 82, 84, 1, 83, 85, 1, 84, 86, 1, 85,
+ 87, 2, 78, 80, 161, 169, 2, 79, 81, 160,
+ 168, 1, 80, 82, 1, 81, 83, 1, 90, 92,
+ 1, 91, 93, 1, 92, 94, 2, 93, 95, 164,
+ 178, 2, 86, 88, 163, 177, 2, 87, 89, 162,
+ 176, 1, 88, 90, 1, 89, 91, 1, 97, 100,
+ 1, 98, 101, 1, 99, 102, 1, 100, 103, 1,
+ 94, 96, 1, 95, 97, 1, 96, 99, 1, 105,
+ 108, 1, 106, 109, 1, 107, 110, 1, 108, 111,
+ 2, 101, 104, 165, 192, 1, 102, 105, 1, 103,
+ 106, 1, 104, 107, 1, 113, 116, 1, 114, 117,
+ 1, 115, 118, 1, 109, 112, 1, 110, 113, 1,
+ 111, 114, 1, 112, 115, 1, 120, 126, 1, 116,
+ 120, 1, 117, 121, 1, 118, 122, 1, 119, 123,
+};
+
+const unsigned short Dict031KeyHashTable[] = {
+ 167, 166, 170, 175, 178, 181, 166, 184, 187, 166,
+ 166, 190, 195, 166, 200, 166, 166, 203, 166, 166,
+ 208, 211, 220, 225, 230, 233, 166, 240, 166, 166,
+ 166, 245, 248, 251, 254, 166, 257, 166, 166, 262,
+ 265, 268, 273, 166, 278, 281, 284, 166, 291, 300,
+ 307, 310, 313, 166, 316, 166, 321, 326, 329, 332,
+ 335, 166, 166, 340, 343, 166, 166, 346, 166, 349,
+ 352, 355, 358, 361, 366, 369, 374, 377, 380, 166,
+ 383, 166, 386, 166, 166, 166, 166, 389, 396, 166,
+ 399, 402, 405, 408, 166, 411, 420, 166, 423, 426,
+ 429, 432, 166, 166, 166, 437, 442, 445, 450, 453,
+ 166, 458, 461, 464, 467, 166, 470, 166, 473, 480,
+ 166, 485, 488, 491, 166, 498, 166, 166, 501, 166,
+ 506, 509, 512, 519, 522, 166, 525, 166, 530, 166,
+ 166, 535, 542, 545, 548, 551, 556, 559, 166, 564,
+ 166, 166, 166, 569, 572, 577, 580, 166, 166, 166,
+ 583, 588, 595, 166, 600, 603, 0, 1, 109, 49954,
+ 2, 67, 62130, 115, 13723, 1, 83, 60351, 1, 35,
+25655, 1, 105, 10677, 1, 54, 38349, 1, 77, 63682,
+ 2, 74, 33719, 112, 13152, 2, 82, 60350, 86, 53671,
+ 1, 9, 18078, 2, 11, 5453, 92, 61434, 1, 34,
+ 1494, 4, 81, 10779, 85, 53670, 91, 39991, 100, 34564,
+ 2, 99, 37452, 132, 61192, 2, 51, 49223, 129, 26841,
+ 1, 24, 56701, 3, 104, 55749, 135, 55077, 152, 33047,
+ 2, 98, 15606, 164, 44432, 1, 131, 61191, 1, 128,
+26840, 1, 42, 53326, 1, 134, 55076, 2, 93, 4587,
+ 163, 44431, 1, 117, 52869, 1, 149, 33877, 2, 22,
+ 3984, 61, 51573, 2, 27, 55180, 30, 30682, 1, 125,
+ 4858, 1, 137, 54000, 3, 49, 1633, 146, 61458, 150,
+ 4653, 4, 52, 43124, 116, 52868, 141, 46553, 156, 33831,
+ 3, 66, 11858, 119, 18552, 157, 33831, 1, 73, 31725,
+ 1, 43, 32630, 1, 14, 33751, 2, 40, 41408, 108,
+22015, 2, 5, 13259, 140, 10872, 1, 53, 40588, 1,
+ 13, 41065, 1, 69, 7014, 2, 1, 24130, 148, 34531,
+ 1, 126, 15464, 1, 76, 10680, 1, 79, 63685, 1,
+ 0, 24129, 1, 123, 24722, 1, 84, 60353, 1, 50,
+29144, 2, 15, 45982, 44, 37827, 1, 127, 49244, 2,
+ 12, 47624, 33, 10975, 1, 59, 624, 1, 139, 4411,
+ 1, 48, 11426, 1, 87, 53673, 1, 16, 43652, 3,
+ 32, 23667, 89, 18600, 138, 12327, 1, 37, 15493, 1,
+ 133, 61194, 1, 130, 26843, 1, 8, 34537, 1, 136,
+55079, 4, 23, 51555, 57, 27120, 142, 51512, 162, 44434,
+ 1, 88, 18599, 1, 45, 45051, 1, 72, 23622, 1,
+ 114, 13720, 2, 7, 34536, 58, 19899, 2, 71, 50802,
+ 95, 64877, 1, 17, 54906, 2, 75, 9123, 118, 52871,
+ 1, 56, 65434, 2, 111, 13149, 113, 13719, 1, 161,
+48623, 1, 28, 38830, 1, 60, 12392, 1, 94, 53325,
+ 1, 63, 59675, 3, 4, 33438, 55, 18047, 110, 13148,
+ 2, 80, 3491, 124, 8428, 1, 143, 46886, 1, 25,
+64947, 3, 39, 14182, 103, 55746, 160, 65081, 1, 107,
+35459, 2, 2, 24132, 3, 30386, 1, 26, 10424, 1,
+ 154, 33438, 3, 62, 40410, 97, 58007, 102, 55745, 1,
+ 10, 3786, 1, 159, 25298, 2, 65, 33680, 70, 13019,
+ 2, 31, 2176, 101, 12482, 3, 18, 37280, 47, 63017,
+ 96, 61890, 1, 120, 65180, 1, 144, 21027, 1, 41,
+48518, 2, 155, 36917, 165, 27267, 1, 151, 12377, 2,
+ 21, 17711, 29, 23239, 2, 6, 18278, 145, 6861, 1,
+ 64, 1987, 2, 147, 5404, 158, 20134, 1, 90, 18602,
+ 1, 38, 58614, 2, 19, 3682, 121, 8544, 3, 36,
+62562, 68, 27298, 122, 31703, 2, 20, 47900, 106, 10677,
+ 1, 153, 8836, 2, 46, 4755, 78, 63682,
};
-vtkDICOMDictionary::Dict Dict030Data = {
+vtkDICOMDictionary::Dict Dict031Data = {
"Philips MR Imaging DD 001",
-154,
-154,
-Dict030TagHashTable,
-Dict030KeyHashTable,
-Dict030Contents
+166,
+166,
+Dict031TagHashTable,
+Dict031KeyHashTable,
+Dict031Contents
};
// ----- Philips MR Imaging DD 005 -----
-DictEntry Dict031Contents[] = {
+const DictEntry Dict032Contents[] = {
{ 0x2005, 0x0000, 0, VR::CS, VM::M1, "VolumeViewEnabled" },
{ 0x2005, 0x0001, 0, VR::UL, VM::M1, "NumberOfStudyReference" },
{ 0x2005, 0x0002, 0, VR::SQ, VM::M1, "SPSCode" },
{ 0x2005, 0x0003, 0, VR::UL, VM::M1, "NumberOfSPSCodes" },
{ 0x2005, 0x0004, 0, VR::SS, VM::M1, "" },
-{ 0x2005, 0x0006, 0, VR::SS, VM::M1, "" },
+{ 0x2005, 0x0006, 0, VR::SS, VM::M1, "NumberOfPSSpecificCharacterSets" },
{ 0x2005, 0x0007, 0, VR::SS, VM::M1, "NumberOfSpecificCharacterSet" },
{ 0x2005, 0x0009, 0, VR::DS, VM::M1, "RescaleInterceptOriginal" },
{ 0x2005, 0x000a, 0, VR::DS, VM::M1, "RescaleSlopeOriginal" },
@@ -1961,6 +2177,7 @@ DictEntry Dict031Contents[] = {
{ 0x2005, 0x0024, 0, VR::UL, VM::M1, "LUT2BeginColor" },
{ 0x2005, 0x0025, 0, VR::UL, VM::M1, "LUT2EndColor" },
{ 0x2005, 0x0026, 0, VR::CS, VM::M1, "ViewingHardcopyOnly" },
+{ 0x2005, 0x0027, 0, VR::CS, VM::M1, "" },
{ 0x2005, 0x0028, 0, VR::SL, VM::M1, "NumberOfLabelTypes" },
{ 0x2005, 0x0029, 0, VR::CS, VM::M1, "LabelType" },
{ 0x2005, 0x002a, 0, VR::CS, VM::M1, "ExamPrintStatus" },
@@ -2016,99 +2233,100 @@ DictEntry Dict031Contents[] = {
{ 0x2005, 0x005c, 0, VR::SQ, VM::M1, "ContrastBolusSequence" },
{ 0x2005, 0x005d, 0, VR::IS, VM::M1, "ContrastBolusID" },
{ 0x2005, 0x0060, 0, VR::CS, VM::M1, "LUTToRGBJobParams" },
-{ 0x2005, 0x0090, 0, VR::SQ, VM::M1, "" },
-{ 0x2005, 0x0091, 0, VR::SQ, VM::M1, "" },
-};
-
-unsigned short Dict031TagHashTable[] = {
- 93, 96, 99, 102, 105, 108, 111, 114, 117, 120,
- 123, 126, 129, 132, 135, 138, 141, 144, 147, 150,
- 153, 156, 159, 162, 165, 168, 171, 176, 181, 184,
- 187, 190, 193, 196, 199, 202, 205, 208, 92, 92,
- 211, 214, 219, 224, 229, 232, 235, 238, 241, 92,
- 244, 247, 250, 92, 253, 256, 259, 262, 265, 268,
- 271, 274, 277, 280, 283, 286, 289, 292, 295, 298,
- 301, 304, 307, 310, 92, 313, 316, 319, 322, 325,
- 328, 331, 334, 337, 340, 343, 346, 349, 352, 355,
- 358, 361, 0, 1, 44, 49, 1, 43, 48, 1,
- 46, 51, 1, 45, 50, 1, 56, 61, 1, 55,
- 60, 1, 58, 63, 1, 57, 62, 1, 52, 57,
- 1, 51, 56, 1, 54, 59, 1, 53, 58, 1,
- 63, 68, 1, 64, 69, 1, 65, 70, 1, 66,
- 71, 1, 59, 64, 1, 60, 65, 1, 61, 66,
- 1, 62, 67, 1, 71, 76, 1, 72, 77, 1,
- 73, 78, 1, 74, 79, 1, 67, 72, 1, 68,
- 73, 2, 69, 74, 91, 145, 2, 70, 75, 90,
- 144, 1, 79, 84, 1, 80, 85, 1, 81, 86,
- 1, 82, 87, 1, 75, 80, 1, 76, 81, 1,
- 77, 82, 1, 78, 83, 1, 87, 92, 1, 88,
- 93, 1, 83, 88, 2, 4, 4, 84, 89, 2,
- 6, 7, 85, 90, 2, 5, 6, 86, 91, 1,
- 1, 1, 1, 0, 0, 1, 3, 3, 1, 2,
- 2, 1, 89, 96, 1, 11, 15, 1, 10, 14,
- 1, 7, 9, 1, 9, 11, 1, 8, 10, 1,
- 17, 21, 1, 16, 20, 1, 19, 23, 1, 18,
- 22, 1, 13, 17, 1, 12, 16, 1, 15, 19,
- 1, 14, 18, 1, 25, 29, 1, 24, 28, 1,
- 27, 31, 1, 26, 30, 1, 21, 25, 1, 20,
- 24, 1, 23, 27, 1, 22, 26, 1, 33, 37,
- 1, 32, 36, 1, 34, 38, 1, 29, 33, 1,
- 28, 32, 1, 31, 35, 1, 30, 34, 1, 40,
- 45, 1, 39, 44, 1, 42, 47, 1, 41, 46,
- 1, 36, 41, 1, 35, 40, 1, 38, 43, 1,
- 37, 42, 1, 48, 53, 1, 47, 52, 1, 50,
- 55, 1, 49, 54,
-};
-
-unsigned short Dict031KeyHashTable[] = {
- 93, 96, 101, 104, 92, 111, 118, 92, 123, 92,
- 126, 129, 92, 92, 132, 92, 92, 135, 140, 92,
- 143, 150, 92, 153, 156, 92, 92, 92, 159, 92,
- 162, 165, 92, 92, 172, 175, 92, 180, 183, 186,
- 191, 194, 197, 92, 200, 203, 92, 92, 218, 221,
- 92, 226, 233, 236, 239, 246, 249, 254, 259, 262,
- 265, 270, 92, 273, 92, 278, 283, 92, 92, 92,
- 92, 92, 288, 291, 298, 301, 92, 92, 304, 92,
- 307, 312, 92, 315, 92, 92, 92, 322, 92, 325,
- 328, 331, 0, 1, 61, 41279, 2, 29, 28072, 53,
- 2878, 1, 76, 60453, 3, 9, 60562, 36, 47375, 71,
-40754, 3, 12, 48304, 18, 1772, 62, 14490, 2, 26,
-63509, 34, 24595, 1, 32, 42342, 1, 44, 40933, 1,
- 83, 38936, 1, 49, 9197, 2, 24, 48093, 25, 60266,
- 1, 86, 42955, 3, 10, 2705, 16, 49366, 85, 59479,
- 1, 46, 55341, 1, 0, 15605, 1, 27, 1000, 1,
- 84, 28779, 1, 2, 13242, 3, 50, 53081, 59, 33018,
- 79, 24852, 1, 60, 19308, 2, 17, 36739, 30, 10964,
- 1, 64, 31503, 1, 6, 44793, 2, 13, 58710, 41,
-30985, 1, 80, 9187, 1, 87, 49886, 1, 56, 11573,
- 1, 43, 48005, 7, 4, 58, 5, 58, 51, 58,
- 52, 58, 66, 51469, 90, 58, 91, 58, 1, 14,
- 8463, 2, 67, 7181, 88, 52683, 3, 7, 23123, 57,
-46998, 89, 7887, 1, 81, 41346, 1, 55, 45860, 3,
- 38, 48040, 45, 55808, 48, 15851, 1, 11, 33867, 2,
- 22, 13146, 65, 38636, 2, 37, 43614, 47, 46042, 1,
- 33, 36934, 1, 19, 50678, 2, 35, 39161, 70, 39719,
- 1, 23, 29599, 2, 21, 52635, 63, 6319, 2, 20,
-54691, 68, 52538, 2, 39, 22404, 72, 60153, 1, 77,
-41459, 3, 42, 18351, 58, 25982, 69, 34723, 1, 54,
-44621, 1, 40, 6419, 1, 75, 32069, 2, 8, 8309,
- 15, 17738, 1, 74, 58413, 3, 1, 51458, 3, 53363,
- 73, 50349, 1, 28, 36138, 1, 31, 33168, 1, 82,
- 2734, 1, 78, 14568,
+{ 0x2005, 0x0090, 0, VR::SQ, VM::M1, "OriginalVOILUTSequence" },
+{ 0x2005, 0x0091, 0, VR::SQ, VM::M1, "OriginalModalityLUTSequence" },
+};
+
+const unsigned short Dict032TagHashTable[] = {
+ 94, 97, 100, 103, 106, 109, 112, 115, 118, 121,
+ 124, 127, 130, 133, 136, 139, 142, 145, 148, 151,
+ 154, 157, 160, 163, 166, 169, 172, 175, 178, 181,
+ 184, 189, 194, 197, 200, 203, 206, 209, 212, 215,
+ 93, 93, 218, 221, 224, 229, 234, 237, 240, 243,
+ 246, 93, 93, 251, 254, 257, 93, 260, 263, 266,
+ 269, 272, 275, 278, 281, 284, 287, 290, 293, 296,
+ 299, 302, 305, 308, 311, 314, 317, 320, 323, 326,
+ 329, 332, 335, 338, 341, 344, 347, 350, 353, 356,
+ 359, 362, 365, 0, 1, 51, 55, 1, 50, 54,
+ 1, 45, 49, 1, 44, 48, 1, 47, 51, 1,
+ 46, 50, 1, 57, 61, 1, 56, 60, 1, 59,
+ 63, 1, 58, 62, 1, 53, 57, 1, 52, 56,
+ 1, 55, 59, 1, 54, 58, 1, 64, 68, 1,
+ 65, 69, 1, 66, 70, 1, 67, 71, 1, 60,
+ 64, 1, 61, 65, 1, 62, 66, 1, 63, 67,
+ 1, 72, 76, 1, 73, 77, 1, 74, 78, 1,
+ 75, 79, 1, 68, 72, 1, 69, 73, 1, 70,
+ 74, 1, 71, 75, 2, 80, 84, 92, 145, 2,
+ 81, 85, 91, 144, 1, 82, 86, 1, 83, 87,
+ 1, 76, 80, 1, 77, 81, 1, 78, 82, 1,
+ 79, 83, 1, 88, 92, 1, 89, 93, 1, 84,
+ 88, 1, 85, 89, 2, 4, 4, 86, 90, 2,
+ 6, 7, 87, 91, 1, 5, 6, 1, 1, 1,
+ 1, 0, 0, 1, 3, 3, 2, 2, 2, 90,
+ 96, 1, 11, 15, 1, 10, 14, 1, 7, 9,
+ 1, 9, 11, 1, 8, 10, 1, 17, 21, 1,
+ 16, 20, 1, 19, 23, 1, 18, 22, 1, 13,
+ 17, 1, 12, 16, 1, 15, 19, 1, 14, 18,
+ 1, 25, 29, 1, 24, 28, 1, 27, 31, 1,
+ 26, 30, 1, 21, 25, 1, 20, 24, 1, 23,
+ 27, 1, 22, 26, 1, 33, 37, 1, 32, 36,
+ 1, 35, 39, 1, 34, 38, 1, 29, 33, 1,
+ 28, 32, 1, 31, 35, 1, 30, 34, 1, 41,
+ 45, 1, 40, 44, 1, 43, 47, 1, 42, 46,
+ 1, 37, 41, 1, 36, 40, 1, 39, 43, 1,
+ 38, 42, 1, 49, 53, 1, 48, 52,
+};
+
+const unsigned short Dict032KeyHashTable[] = {
+ 94, 93, 99, 104, 107, 114, 93, 119, 122, 93,
+ 125, 134, 137, 142, 147, 150, 153, 93, 93, 93,
+ 156, 159, 162, 165, 170, 175, 178, 93, 181, 184,
+ 93, 187, 190, 93, 193, 196, 201, 204, 93, 209,
+ 214, 217, 93, 220, 223, 226, 231, 234, 93, 237,
+ 242, 245, 93, 248, 93, 93, 93, 93, 255, 93,
+ 258, 261, 264, 269, 272, 275, 93, 282, 285, 288,
+ 291, 93, 93, 296, 93, 301, 304, 93, 307, 312,
+ 315, 93, 93, 326, 93, 93, 329, 332, 93, 335,
+ 93, 93, 338, 0, 2, 7, 47539, 84, 23719, 2,
+ 49, 22728, 72, 57933, 1, 66, 33993, 3, 24, 36301,
+ 33, 33014, 38, 1569, 2, 0, 57014, 6, 21057, 1,
+ 46, 8699, 1, 45, 33446, 4, 17, 61713, 27, 42566,
+ 41, 16921, 71, 24494, 1, 89, 65506, 2, 25, 25793,
+ 26, 17726, 2, 42, 48974, 43, 7584, 1, 77, 32320,
+ 1, 69, 64658, 1, 87, 26990, 1, 65, 27641, 1,
+ 18, 41920, 1, 80, 28813, 2, 60, 41824, 85, 52429,
+ 2, 22, 24280, 54, 9189, 1, 64, 45714, 1, 63,
+48159, 1, 19, 14899, 1, 67, 59372, 1, 90, 38104,
+ 1, 81, 21068, 1, 47, 6827, 2, 10, 65393, 56,
+31978, 1, 73, 42594, 2, 20, 13936, 59, 14428, 2,
+ 51, 25732, 57, 46683, 1, 50, 58426, 1, 12, 18892,
+ 1, 15, 39393, 1, 23, 53945, 2, 30, 10846, 34,
+31377, 1, 28, 51253, 1, 48, 11722, 2, 1, 60066,
+ 36, 4915, 1, 68, 47271, 1, 44, 55945, 3, 11,
+49006, 76, 28201, 86, 34175, 1, 32, 58094, 1, 9,
+64843, 1, 83, 27369, 2, 40, 6660, 61, 59972, 1,
+ 70, 42806, 1, 29, 55957, 3, 21, 40794, 39, 36953,
+ 74, 56150, 1, 58, 9144, 1, 78, 43832, 1, 91,
+ 1285, 2, 8, 59662, 75, 35235, 2, 31, 4624, 82,
+34559, 1, 5, 23985, 1, 13, 58783, 2, 2, 42696,
+ 37, 10221, 1, 16, 63633, 5, 4, 57, 35, 57,
+ 52, 57, 53, 57, 55, 28638, 1, 79, 10888, 1,
+ 92, 54585, 1, 62, 23217, 1, 14, 11895, 2, 3,
+ 5575, 88, 4249,
};
-vtkDICOMDictionary::Dict Dict031Data = {
+vtkDICOMDictionary::Dict Dict032Data = {
"Philips MR Imaging DD 005",
-92,
-92,
-Dict031TagHashTable,
-Dict031KeyHashTable,
-Dict031Contents
+93,
+93,
+Dict032TagHashTable,
+Dict032KeyHashTable,
+Dict032Contents
};
// ----- Philips MR Imaging DD 004 -----
-DictEntry Dict032Contents[] = {
+const DictEntry Dict033Contents[] = {
{ 0x2005, 0x0000, 0, VR::SS, VM::M1, "SpectrumExtraNumber" },
{ 0x2005, 0x0001, 0, VR::SS, VM::M1, "SpectrumKxCoordinate" },
{ 0x2005, 0x0002, 0, VR::SS, VM::M1, "SpectrumKyCoordinate" },
@@ -2204,7 +2422,7 @@ DictEntry Dict032Contents[] = {
{ 0x2005, 0x0099, 0, VR::CS, VM::M1, "IViewBoldEnabled" },
};
-unsigned short Dict032TagHashTable[] = {
+const unsigned short Dict033TagHashTable[] = {
94, 97, 100, 103, 106, 93, 93, 93, 109, 112,
115, 120, 125, 128, 131, 136, 141, 144, 147, 150,
153, 156, 159, 162, 165, 168, 171, 176, 181, 184,
@@ -2243,7 +2461,7 @@ unsigned short Dict032TagHashTable[] = {
40, 1, 33, 53, 1, 32, 52,
};
-unsigned short Dict032KeyHashTable[] = {
+const unsigned short Dict033KeyHashTable[] = {
94, 97, 93, 100, 105, 108, 113, 120, 123, 93,
93, 126, 129, 134, 137, 93, 142, 145, 148, 153,
156, 159, 93, 164, 167, 172, 175, 178, 181, 184,
@@ -2281,18 +2499,18 @@ unsigned short Dict032KeyHashTable[] = {
8, 15065, 1, 27, 47868,
};
-vtkDICOMDictionary::Dict Dict032Data = {
+vtkDICOMDictionary::Dict Dict033Data = {
"Philips MR Imaging DD 004",
93,
93,
-Dict032TagHashTable,
-Dict032KeyHashTable,
-Dict032Contents
+Dict033TagHashTable,
+Dict033KeyHashTable,
+Dict033Contents
};
// ----- dcm4che/archive -----
-DictEntry Dict033Contents[] = {
+const DictEntry Dict034Contents[] = {
{ 0x0043, 0x0010, 0, VR::OB, VM::M1, "PatientPk" },
{ 0x0043, 0x0011, 0, VR::OB, VM::M1, "StudyPk" },
{ 0x0043, 0x0012, 0, VR::OB, VM::M1, "SeriesPk" },
@@ -2304,55 +2522,55 @@ DictEntry Dict033Contents[] = {
{ 0x0043, 0x0030, 0, VR::UI, VM::M1, "Dcm4cheURIReferencedTransferSyntaxUID" },
};
-unsigned short Dict033TagHashTable[] = {
+const unsigned short Dict034TagHashTable[] = {
10, 13, 16, 19, 9, 22, 25, 9, 30, 0,
1, 3, 19, 1, 0, 16, 1, 1, 17, 1,
6, 22, 1, 4, 20, 2, 5, 21, 8, 48,
2, 2, 18, 7, 32,
};
-unsigned short Dict033KeyHashTable[] = {
+const unsigned short Dict034KeyHashTable[] = {
10, 9, 9, 15, 9, 20, 9, 27, 30, 0,
2, 5, 55426, 6, 1849, 2, 3, 42978, 7, 16085,
3, 1, 64148, 2, 49206, 8, 36481, 1, 4, 23520,
1, 0, 26693,
};
-vtkDICOMDictionary::Dict Dict033Data = {
+vtkDICOMDictionary::Dict Dict034Data = {
"dcm4che/archive",
9,
9,
-Dict033TagHashTable,
-Dict033KeyHashTable,
-Dict033Contents
+Dict034TagHashTable,
+Dict034KeyHashTable,
+Dict034Contents
};
// ----- AMI Annotations_02 -----
-DictEntry Dict034Contents[] = {
+const DictEntry Dict035Contents[] = {
{ 0x3101, 0x0020, 0, VR::SQ, VM::M1, "AnnotationSequence" },
};
-unsigned short Dict034TagHashTable[] = {
+const unsigned short Dict035TagHashTable[] = {
2, 0, 1, 0, 32,
};
-unsigned short Dict034KeyHashTable[] = {
+const unsigned short Dict035KeyHashTable[] = {
2, 0, 1, 0, 13593,
};
-vtkDICOMDictionary::Dict Dict034Data = {
+vtkDICOMDictionary::Dict Dict035Data = {
"AMI Annotations_02",
1,
1,
-Dict034TagHashTable,
-Dict034KeyHashTable,
-Dict034Contents
+Dict035TagHashTable,
+Dict035KeyHashTable,
+Dict035Contents
};
// ----- TERARECON AQUARIUS -----
-DictEntry Dict035Contents[] = {
+const DictEntry Dict036Contents[] = {
{ 0x0077, 0x0010, 0, VR::UI, VM::M1TN, "OriginalSeriesStudyUID" },
{ 0x0077, 0x0012, 0, VR::UI, VM::M1TN, "OriginalSOPUID" },
{ 0x0077, 0x0014, 0, VR::LO, VM::M1TN, "ReferencedVolumeID" },
@@ -2375,7 +2593,7 @@ DictEntry Dict035Contents[] = {
{ 0x0077, 0x0090, 0, VR::FL, VM::M1, "COFRefinementLevel" },
};
-unsigned short Dict035TagHashTable[] = {
+const unsigned short Dict036TagHashTable[] = {
21, 20, 28, 35, 38, 20, 43, 46, 49, 20,
54, 20, 57, 20, 60, 63, 66, 20, 69, 72,
0, 3, 1, 18, 7, 38, 16, 132, 3, 0,
@@ -2386,7 +2604,7 @@ unsigned short Dict035TagHashTable[] = {
2, 20, 1, 12, 80,
};
-unsigned short Dict035KeyHashTable[] = {
+const unsigned short Dict036KeyHashTable[] = {
21, 24, 20, 20, 27, 30, 33, 20, 42, 47,
20, 20, 52, 20, 57, 60, 20, 63, 66, 20,
0, 1, 12, 49303, 1, 14, 27846, 1, 11, 55840,
@@ -2397,45 +2615,45 @@ unsigned short Dict035KeyHashTable[] = {
3460, 17, 64960,
};
-vtkDICOMDictionary::Dict Dict035Data = {
+vtkDICOMDictionary::Dict Dict036Data = {
"TERARECON AQUARIUS",
20,
20,
-Dict035TagHashTable,
-Dict035KeyHashTable,
-Dict035Contents
+Dict036TagHashTable,
+Dict036KeyHashTable,
+Dict036Contents
};
// ----- TOSHIBA COMAPL OOG -----
-DictEntry Dict036Contents[] = {
+const DictEntry Dict037Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "COMAPLOOGType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "COMAPLOOGVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "COMAPLOOGInfo" },
};
-unsigned short Dict036TagHashTable[] = {
+const unsigned short Dict037TagHashTable[] = {
4, 3, 9, 0, 2, 0, 8, 2, 16, 1,
1, 9,
};
-unsigned short Dict036KeyHashTable[] = {
+const unsigned short Dict037KeyHashTable[] = {
4, 9, 3, 0, 2, 0, 15896, 1, 42148, 1,
2, 11099,
};
-vtkDICOMDictionary::Dict Dict036Data = {
+vtkDICOMDictionary::Dict Dict037Data = {
"TOSHIBA COMAPL OOG",
3,
3,
-Dict036TagHashTable,
-Dict036KeyHashTable,
-Dict036Contents
+Dict037TagHashTable,
+Dict037KeyHashTable,
+Dict037Contents
};
// ----- SYNARC_1.0 -----
-DictEntry Dict037Contents[] = {
+const DictEntry Dict038Contents[] = {
{ 0x0099, 0x0001, 0, VR::OB, VM::M1, "" },
{ 0x0099, 0x0002, 0, VR::OB, VM::M1, "" },
{ 0x0099, 0x0003, 0, VR::LO, VM::M1, "" },
@@ -2443,28 +2661,28 @@ DictEntry Dict037Contents[] = {
{ 0x0099, 0x0005, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict037TagHashTable[] = {
+const unsigned short Dict038TagHashTable[] = {
5, 5, 6, 9, 14, 0, 1, 2, 3, 2,
1, 2, 4, 5, 2, 0, 1, 3, 4,
};
-unsigned short Dict037KeyHashTable[] = {
+const unsigned short Dict038KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict037Data = {
+vtkDICOMDictionary::Dict Dict038Data = {
"SYNARC_1.0",
5,
5,
-Dict037TagHashTable,
-Dict037KeyHashTable,
-Dict037Contents
+Dict038TagHashTable,
+Dict038KeyHashTable,
+Dict038Contents
};
// ----- LORAD Selenia -----
-DictEntry Dict038Contents[] = {
+const DictEntry Dict039Contents[] = {
{ 0x0019, 0x0006, 0, VR::LO, VM::M1, "PaddleID" },
{ 0x0019, 0x0007, 0, VR::SH, VM::M1, "PaddlePosition" },
{ 0x0019, 0x0008, 0, VR::LO, VM::M1, "CollimationSize" },
@@ -2493,7 +2711,7 @@ DictEntry Dict038Contents[] = {
{ 0x0019, 0x0090, 0, VR::DS, VM::M1, "ConventionalTomoAngle" },
};
-unsigned short Dict038TagHashTable[] = {
+const unsigned short Dict039TagHashTable[] = {
27, 30, 26, 26, 33, 36, 26, 26, 26, 39,
42, 47, 26, 26, 52, 55, 60, 65, 70, 73,
76, 81, 84, 89, 26, 94, 0, 1, 22, 112,
@@ -2506,7 +2724,7 @@ unsigned short Dict038TagHashTable[] = {
6, 40, 20, 83, 1, 24, 128,
};
-unsigned short Dict038KeyHashTable[] = {
+const unsigned short Dict039KeyHashTable[] = {
27, 26, 26, 26, 32, 35, 38, 45, 50, 26,
53, 56, 61, 26, 66, 69, 74, 77, 26, 80,
83, 86, 26, 26, 89, 92, 0, 2, 0, 3062,
@@ -2519,18 +2737,18 @@ unsigned short Dict038KeyHashTable[] = {
7, 2416, 2, 20, 13643, 23, 34231,
};
-vtkDICOMDictionary::Dict Dict038Data = {
+vtkDICOMDictionary::Dict Dict039Data = {
"LORAD Selenia",
26,
26,
-Dict038TagHashTable,
-Dict038KeyHashTable,
-Dict038Contents
+Dict039TagHashTable,
+Dict039KeyHashTable,
+Dict039Contents
};
// ----- SIEMENS SYNGO LAYOUT PROTOCOL -----
-DictEntry Dict039Contents[] = {
+const DictEntry Dict040Contents[] = {
{ 0x0073, 0x0002, 0, VR::US, VM::M1, "HangingProtocolExcellenceRank" },
{ 0x0073, 0x0004, 0, VR::CS, VM::M1, "TemplateDataRoleID" },
{ 0x0073, 0x0006, 0, VR::CS, VM::M1, "DataSharingFlag" },
@@ -2639,7 +2857,7 @@ DictEntry Dict039Contents[] = {
{ 0x0073, 0x00FF, 0, VR::LO, VM::M1, "VRTPreset" },
};
-unsigned short Dict039TagHashTable[] = {
+const unsigned short Dict040TagHashTable[] = {
107, 112, 106, 115, 118, 121, 124, 127, 106, 130,
133, 136, 139, 144, 147, 150, 153, 158, 161, 164,
167, 170, 173, 176, 181, 184, 187, 190, 195, 198,
@@ -2682,7 +2900,7 @@ unsigned short Dict039TagHashTable[] = {
7, 22, 74, 190, 1, 6, 20, 1, 64, 162,
};
-unsigned short Dict039KeyHashTable[] = {
+const unsigned short Dict040KeyHashTable[] = {
107, 106, 116, 119, 122, 129, 132, 106, 135, 140,
106, 143, 150, 106, 155, 158, 106, 161, 106, 106,
164, 167, 106, 106, 106, 106, 106, 106, 106, 170,
@@ -2724,18 +2942,18 @@ unsigned short Dict039KeyHashTable[] = {
51, 31276,
};
-vtkDICOMDictionary::Dict Dict039Data = {
+vtkDICOMDictionary::Dict Dict040Data = {
"SIEMENS SYNGO LAYOUT PROTOCOL",
106,
106,
-Dict039TagHashTable,
-Dict039KeyHashTable,
-Dict039Contents
+Dict040TagHashTable,
+Dict040KeyHashTable,
+Dict040Contents
};
// ----- SIEMENS MR VA0 RAW -----
-DictEntry Dict040Contents[] = {
+const DictEntry Dict041Contents[] = {
{ 0x0021, 0x0000, 0, VR::CS, VM::M1, "SequenceType" },
{ 0x0021, 0x0001, 0, VR::IS, VM::M1, "VectorSizeOriginal" },
{ 0x0021, 0x0002, 0, VR::IS, VM::M1, "VectorSizeExtended" },
@@ -2768,7 +2986,7 @@ DictEntry Dict040Contents[] = {
{ 0x0021, 0x0055, 0, VR::DS, VM::M6, "SaturationDistance" },
};
-unsigned short Dict040TagHashTable[] = {
+const unsigned short Dict041TagHashTable[] = {
31, 34, 37, 40, 43, 46, 49, 52, 55, 58,
61, 64, 30, 30, 30, 30, 67, 70, 73, 76,
79, 82, 85, 90, 95, 100, 105, 110, 30, 30,
@@ -2783,7 +3001,7 @@ unsigned short Dict040TagHashTable[] = {
2, 18, 24, 29, 85,
};
-unsigned short Dict040KeyHashTable[] = {
+const unsigned short Dict041KeyHashTable[] = {
31, 30, 38, 41, 46, 30, 30, 49, 56, 61,
64, 67, 72, 75, 78, 30, 81, 84, 30, 87,
90, 93, 30, 96, 30, 99, 102, 107, 30, 30,
@@ -2798,18 +3016,18 @@ unsigned short Dict040KeyHashTable[] = {
24, 22965,
};
-vtkDICOMDictionary::Dict Dict040Data = {
+vtkDICOMDictionary::Dict Dict041Data = {
"SIEMENS MR VA0 RAW",
30,
30,
-Dict040TagHashTable,
-Dict040KeyHashTable,
-Dict040Contents
+Dict041TagHashTable,
+Dict041KeyHashTable,
+Dict041Contents
};
// ----- SIEMENS CM VA0 LAB -----
-DictEntry Dict041Contents[] = {
+const DictEntry Dict042Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "GeneratorIdentificationLabel" },
{ 0x0009, 0x0011, 0, VR::LO, VM::M1, "GantryIdentificationLabel" },
{ 0x0009, 0x0012, 0, VR::LO, VM::M1, "XRayTubeIdentificationLabel" },
@@ -2820,91 +3038,124 @@ DictEntry Dict041Contents[] = {
{ 0x0009, 0x0020, 0, VR::SH, VM::M1, "HeaderVersion" },
};
-unsigned short Dict041TagHashTable[] = {
+const unsigned short Dict042TagHashTable[] = {
9, 12, 17, 20, 23, 26, 8, 29, 0, 1,
1, 17, 2, 0, 16, 7, 32, 1, 3, 19,
1, 2, 18, 1, 5, 21, 1, 4, 20, 1,
6, 22,
};
-unsigned short Dict041KeyHashTable[] = {
+const unsigned short Dict042KeyHashTable[] = {
9, 12, 8, 15, 18, 8, 23, 26, 0, 1,
5, 29799, 1, 3, 55069, 1, 2, 18716, 2, 1,
54980, 7, 47602, 1, 0, 122, 2, 4, 60080, 6,
33446,
};
-vtkDICOMDictionary::Dict Dict041Data = {
+vtkDICOMDictionary::Dict Dict042Data = {
"SIEMENS CM VA0 LAB",
8,
8,
-Dict041TagHashTable,
-Dict041KeyHashTable,
-Dict041Contents
+Dict042TagHashTable,
+Dict042KeyHashTable,
+Dict042Contents
+};
+
+// ----- CoActiv_PvtTags -----
+
+const DictEntry Dict043Contents[] = {
+{ 0x7501, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x7501, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x7501, 0x0003, 0, VR::UI, VM::M1, "" },
+{ 0x7501, 0x0004, 0, VR::LO, VM::M1, "" },
+};
+
+const unsigned short Dict043TagHashTable[] = {
+ 5, 8, 11, 14, 0, 1, 0, 1, 1, 3,
+ 4, 1, 2, 3, 1, 1, 2,
+};
+
+const unsigned short Dict043KeyHashTable[] = {
+ 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
+ 2, 1345, 3, 1345,
+};
+
+vtkDICOMDictionary::Dict Dict043Data = {
+"CoActiv_PvtTags",
+4,
+4,
+Dict043TagHashTable,
+Dict043KeyHashTable,
+Dict043Contents
};
// ----- MDDX -----
-DictEntry Dict042Contents[] = {
+const DictEntry Dict044Contents[] = {
{ 0x0011, 0x0001, 0, VR::UT, VM::M1, "AESEncryptedValues" },
{ 0x0011, 0x0002, 0, VR::LO, VM::M1, "AllupVersionDetails" },
{ 0x0011, 0x0003, 0, VR::LO, VM::M1, "MaskID" },
+{ 0x7fe1, 0x0001, 0, VR::UT, VM::M1, "AESEncryptedValues" },
+{ 0x7fe1, 0x0002, 0, VR::LO, VM::M1, "AllupVersionDetails" },
+{ 0x7fe1, 0x0003, 0, VR::LO, VM::M1, "MaskID" },
};
-unsigned short Dict042TagHashTable[] = {
- 4, 7, 3, 0, 1, 2, 3, 2, 0, 1,
- 1, 2,
+const unsigned short Dict044TagHashTable[] = {
+ 7, 10, 6, 6, 15, 20, 0, 1, 2, 3,
+ 2, 1, 2, 3, 1, 2, 0, 1, 4, 2,
+ 1, 5, 3,
};
-unsigned short Dict042KeyHashTable[] = {
- 4, 9, 3, 0, 2, 0, 22612, 1, 5893, 1,
- 2, 30591,
+const unsigned short Dict044KeyHashTable[] = {
+ 7, 6, 6, 12, 17, 6, 0, 2, 0, 44074,
+ 3, 44074, 2, 1, 2946, 4, 2946, 2, 2, 48063,
+ 5, 48063,
};
-vtkDICOMDictionary::Dict Dict042Data = {
+vtkDICOMDictionary::Dict Dict044Data = {
"MDDX",
-3,
-3,
-Dict042TagHashTable,
-Dict042KeyHashTable,
-Dict042Contents
+6,
+6,
+Dict044TagHashTable,
+Dict044KeyHashTable,
+Dict044Contents
};
// ----- http://www.gemedicalsystems.com/it_solutions/orthoview/2.1 -----
-DictEntry Dict043Contents[] = {
-{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoView Session Date/Time" },
-{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoView Session Creator" },
-{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoView Session Completion Flag" },
-{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoView File Sequence" },
-{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoView File Name" },
-{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoView File Content" },
+const DictEntry Dict045Contents[] = {
+{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoViewSessionDateTime" },
+{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoViewSessionCreator" },
+{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoViewSessionCompletionFlag" },
+{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoViewFileSequence" },
+{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoViewFileName" },
+{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoViewFileContent" },
};
-unsigned short Dict043TagHashTable[] = {
+const unsigned short Dict045TagHashTable[] = {
7, 10, 15, 20, 6, 6, 0, 1, 3, 64,
2, 0, 16, 1, 32, 2, 4, 80, 5, 96,
1, 2, 48,
};
-unsigned short Dict043KeyHashTable[] = {
- 7, 10, 17, 6, 6, 6, 0, 1, 2, 35654,
- 3, 3, 12582, 4, 31362, 5, 57809, 2, 0, 32343,
- 1, 13269,
+const unsigned short Dict045KeyHashTable[] = {
+ 7, 12, 6, 15, 6, 20, 0, 2, 1, 15840,
+ 2, 7958, 1, 0, 19322, 2, 4, 12279, 5, 9030,
+ 1, 3, 19440,
};
-vtkDICOMDictionary::Dict Dict043Data = {
+vtkDICOMDictionary::Dict Dict045Data = {
"http://www.gemedicalsystems.com/it_solutions/orthoview/2.1",
6,
6,
-Dict043TagHashTable,
-Dict043KeyHashTable,
-Dict043Contents
+Dict045TagHashTable,
+Dict045KeyHashTable,
+Dict045Contents
};
// ----- PHILIPS NM -Private -----
-DictEntry Dict044Contents[] = {
+const DictEntry Dict046Contents[] = {
{ 0x7051, 0x0000, 0, VR::US, VM::M1, "CurrentSegment" },
{ 0x7051, 0x0001, 0, VR::US, VM::M1, "NumberOfSegments" },
{ 0x7051, 0x0002, 0, VR::FL, VM::M1, "SegmentStartPosition" },
@@ -2924,7 +3175,7 @@ DictEntry Dict044Contents[] = {
{ 0x7051, 0x0029, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict044TagHashTable[] = {
+const unsigned short Dict046TagHashTable[] = {
17, 17, 18, 21, 26, 31, 38, 43, 48, 55,
17, 17, 17, 17, 17, 17, 17, 0, 1, 0,
0, 2, 1, 1, 8, 16, 2, 2, 2, 9,
@@ -2933,7 +3184,7 @@ unsigned short Dict044TagHashTable[] = {
6, 11, 21, 15, 40, 2, 7, 7, 16, 41,
};
-unsigned short Dict044KeyHashTable[] = {
+const unsigned short Dict046KeyHashTable[] = {
17, 18, 17, 23, 26, 29, 17, 32, 17, 35,
46, 17, 49, 52, 55, 60, 17, 0, 2, 6,
17152, 11, 42235, 1, 4, 49858, 1, 7, 40226, 1,
@@ -2943,42 +3194,42 @@ unsigned short Dict044KeyHashTable[] = {
1, 8, 47239,
};
-vtkDICOMDictionary::Dict Dict044Data = {
+vtkDICOMDictionary::Dict Dict046Data = {
"PHILIPS NM -Private",
17,
17,
-Dict044TagHashTable,
-Dict044KeyHashTable,
-Dict044Contents
+Dict046TagHashTable,
+Dict046KeyHashTable,
+Dict046Contents
};
// ----- SIEMENS WH SR 1.0 -----
-DictEntry Dict045Contents[] = {
+const DictEntry Dict047Contents[] = {
{ 0x0071, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x0071, 0x0002, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict045TagHashTable[] = {
+const unsigned short Dict047TagHashTable[] = {
3, 6, 0, 1, 1, 2, 1, 0, 1,
};
-unsigned short Dict045KeyHashTable[] = {
+const unsigned short Dict047KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict045Data = {
+vtkDICOMDictionary::Dict Dict047Data = {
"SIEMENS WH SR 1.0",
2,
2,
-Dict045TagHashTable,
-Dict045KeyHashTable,
-Dict045Contents
+Dict047TagHashTable,
+Dict047KeyHashTable,
+Dict047Contents
};
// ----- PMOD_1 -----
-DictEntry Dict046Contents[] = {
+const DictEntry Dict048Contents[] = {
{ 0x0055, 0x0001, 0, VR::FD, VM::M1TN, "FrameStartTimesVector" },
{ 0x0055, 0x0002, 0, VR::FD, VM::M3T3N, "FramePositionsVector" },
{ 0x0055, 0x0003, 0, VR::FD, VM::M6T6N, "FrameOrientationsVector" },
@@ -2986,28 +3237,28 @@ DictEntry Dict046Contents[] = {
{ 0x0055, 0x0005, 0, VR::FD, VM::M1TN, "FrameRescaleSlopeVector" },
};
-unsigned short Dict046TagHashTable[] = {
+const unsigned short Dict048TagHashTable[] = {
6, 11, 16, 5, 5, 0, 2, 0, 1, 3,
4, 2, 1, 2, 4, 5, 1, 2, 3,
};
-unsigned short Dict046KeyHashTable[] = {
+const unsigned short Dict048KeyHashTable[] = {
5, 6, 5, 11, 16, 0, 2, 2, 11757, 3,
64319, 2, 0, 60720, 4, 17754, 1, 1, 8603,
};
-vtkDICOMDictionary::Dict Dict046Data = {
+vtkDICOMDictionary::Dict Dict048Data = {
"PMOD_1",
5,
5,
-Dict046TagHashTable,
-Dict046KeyHashTable,
-Dict046Contents
+Dict048TagHashTable,
+Dict048KeyHashTable,
+Dict048Contents
};
// ----- QCA Results -----
-DictEntry Dict047Contents[] = {
+const DictEntry Dict049Contents[] = {
{ 0x0009, 0x0000, 0, VR::CS, VM::M1, "AnalysisType" },
{ 0x0009, 0x0004, 0, VR::LO, VM::M1, "SegmentName" },
{ 0x0009, 0x0012, 0, VR::DS, VM::M1, "PreProcedureCatheterSize" },
@@ -3026,7 +3277,7 @@ DictEntry Dict047Contents[] = {
{ 0x0009, 0x0028, 0, VR::DS, VM::M1, "PostProcedureGeometricAreaReductionPercentage" },
};
-unsigned short Dict047TagHashTable[] = {
+const unsigned short Dict049TagHashTable[] = {
16, 17, 16, 16, 16, 16, 16, 16, 16, 22,
25, 30, 35, 40, 47, 52, 0, 2, 8, 24,
15, 40, 1, 0, 0, 2, 3, 19, 10, 35,
@@ -3035,7 +3286,7 @@ unsigned short Dict047TagHashTable[] = {
14, 39, 2, 6, 22, 13, 38,
};
-unsigned short Dict047KeyHashTable[] = {
+const unsigned short Dict049KeyHashTable[] = {
17, 16, 16, 16, 16, 16, 16, 20, 23, 26,
29, 34, 41, 44, 47, 52, 0, 1, 2, 59650,
1, 15, 2407, 1, 8, 40137, 1, 1, 56857, 2,
@@ -3044,18 +3295,18 @@ unsigned short Dict047KeyHashTable[] = {
13, 18002, 3, 3, 40892, 6, 40912, 9, 9799,
};
-vtkDICOMDictionary::Dict Dict047Data = {
+vtkDICOMDictionary::Dict Dict049Data = {
"QCA Results",
16,
16,
-Dict047TagHashTable,
-Dict047KeyHashTable,
-Dict047Contents
+Dict049TagHashTable,
+Dict049KeyHashTable,
+Dict049Contents
};
// ----- SIEMENS MED MG -----
-DictEntry Dict048Contents[] = {
+const DictEntry Dict050Contents[] = {
{ 0x0029, 0x0010, 0, VR::US, VM::M1, "ListOfGroupNumbers" },
{ 0x0029, 0x0015, 0, VR::LO, VM::M1, "ListOfShadowOwnerCodes" },
{ 0x0029, 0x0020, 0, VR::US, VM::M1, "ListOfElementNumbers" },
@@ -3066,54 +3317,54 @@ DictEntry Dict048Contents[] = {
{ 0x0029, 0x0070, 0, VR::LO, VM::M1, "ListOfTextConcatenation" },
};
-unsigned short Dict048TagHashTable[] = {
+const unsigned short Dict050TagHashTable[] = {
9, 18, 8, 8, 25, 8, 8, 8, 0, 4,
4, 64, 5, 80, 6, 96, 7, 112, 3, 0,
16, 2, 32, 3, 48, 1, 1, 21,
};
-unsigned short Dict048KeyHashTable[] = {
+const unsigned short Dict050KeyHashTable[] = {
9, 12, 17, 8, 22, 25, 8, 28, 0, 1,
6, 28194, 2, 5, 28059, 7, 2168, 2, 3, 16906,
4, 43179, 1, 2, 50495, 1, 1, 4798, 1, 0,
31019,
};
-vtkDICOMDictionary::Dict Dict048Data = {
+vtkDICOMDictionary::Dict Dict050Data = {
"SIEMENS MED MG",
8,
8,
-Dict048TagHashTable,
-Dict048KeyHashTable,
-Dict048Contents
+Dict050TagHashTable,
+Dict050KeyHashTable,
+Dict050Contents
};
// ----- GEMS_CTHD_01 -----
-DictEntry Dict049Contents[] = {
+const DictEntry Dict051Contents[] = {
{ 0x0033, 0x0002, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict049TagHashTable[] = {
+const unsigned short Dict051TagHashTable[] = {
2, 0, 1, 0, 2,
};
-unsigned short Dict049KeyHashTable[] = {
+const unsigned short Dict051KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict049Data = {
+vtkDICOMDictionary::Dict Dict051Data = {
"GEMS_CTHD_01",
1,
1,
-Dict049TagHashTable,
-Dict049KeyHashTable,
-Dict049Contents
+Dict051TagHashTable,
+Dict051KeyHashTable,
+Dict051Contents
};
// ----- astm.org/diconde/iod/Component -----
-DictEntry Dict050Contents[] = {
+const DictEntry Dict052Contents[] = {
{ 0x0011, 0x0023, 0, VR::ST, VM::M1TN, "CADFileFormat" },
{ 0x0011, 0x0024, 0, VR::ST, VM::M1TN, "ComponentReferenceSystem" },
{ 0x0011, 0x0025, 0, VR::ST, VM::M1TN, "ComponentManufacturingProcedure" },
@@ -3131,7 +3382,7 @@ DictEntry Dict050Contents[] = {
{ 0x0011, 0x0056, 0, VR::DS, VM::M1, "InnerDiameter" },
};
-unsigned short Dict050TagHashTable[] = {
+const unsigned short Dict052TagHashTable[] = {
15, 15, 15, 16, 19, 22, 27, 30, 37, 42,
45, 50, 53, 15, 15, 0, 1, 4, 48, 1,
11, 80, 2, 0, 35, 5, 50, 1, 12, 82,
@@ -3140,7 +3391,7 @@ unsigned short Dict050TagHashTable[] = {
1, 10, 70, 1, 3, 40,
};
-unsigned short Dict050KeyHashTable[] = {
+const unsigned short Dict052KeyHashTable[] = {
16, 25, 28, 33, 15, 15, 38, 15, 15, 15,
41, 46, 15, 15, 51, 0, 4, 0, 28810, 3,
30475, 5, 34019, 6, 35263, 1, 4, 48497, 2, 10,
@@ -3149,69 +3400,98 @@ unsigned short Dict050KeyHashTable[] = {
39507, 1, 9, 58756,
};
-vtkDICOMDictionary::Dict Dict050Data = {
+vtkDICOMDictionary::Dict Dict052Data = {
"astm.org/diconde/iod/Component",
15,
15,
-Dict050TagHashTable,
-Dict050KeyHashTable,
-Dict050Contents
+Dict052TagHashTable,
+Dict052KeyHashTable,
+Dict052Contents
+};
+
+// ----- GEMS_IDI_01 -----
+
+const DictEntry Dict053Contents[] = {
+{ 0x0073, 0x0020, 0, VR::DS, VM::M1, "" },
+{ 0x0073, 0x0021, 0, VR::DS, VM::M1, "" },
+{ 0x0073, 0x0030, 0, VR::OW, VM::M1, "HeightMap" },
+{ 0x0073, 0x0040, 0, VR::DS, VM::M1, "" },
+{ 0x0073, 0x0050, 0, VR::DS, VM::M1TN, "" },
+};
+
+const unsigned short Dict053TagHashTable[] = {
+ 6, 9, 14, 17, 5, 0, 1, 4, 80, 2,
+ 2, 48, 3, 64, 1, 0, 32, 1, 1, 33,
+};
+
+const unsigned short Dict053KeyHashTable[] = {
+ 5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
+ 1076, 2, 32383, 3, 1076, 4, 1076,
+};
+
+vtkDICOMDictionary::Dict Dict053Data = {
+"GEMS_IDI_01",
+5,
+5,
+Dict053TagHashTable,
+Dict053KeyHashTable,
+Dict053Contents
};
// ----- PMOD_GENPET -----
-DictEntry Dict051Contents[] = {
+const DictEntry Dict054Contents[] = {
{ 0x7fe1, 0x0001, 0, VR::UT, VM::M1, "SlicesNames" },
{ 0x7fe1, 0x0002, 0, VR::UT, VM::M1, "GeneCodes" },
{ 0x7fe1, 0x0003, 0, VR::UT, VM::M1, "GeneLabels" },
};
-unsigned short Dict051TagHashTable[] = {
+const unsigned short Dict054TagHashTable[] = {
3, 4, 9, 0, 2, 0, 1, 1, 2, 1,
2, 3,
};
-unsigned short Dict051KeyHashTable[] = {
+const unsigned short Dict054KeyHashTable[] = {
4, 7, 3, 0, 1, 1, 21830, 2, 0, 47785,
2, 42962,
};
-vtkDICOMDictionary::Dict Dict051Data = {
+vtkDICOMDictionary::Dict Dict054Data = {
"PMOD_GENPET",
3,
3,
-Dict051TagHashTable,
-Dict051KeyHashTable,
-Dict051Contents
+Dict054TagHashTable,
+Dict054KeyHashTable,
+Dict054Contents
};
// ----- SHS MagicView 300 -----
-DictEntry Dict052Contents[] = {
+const DictEntry Dict055Contents[] = {
{ 0x0029, 0x0002, 0, VR::FD, VM::M1, "" },
{ 0x0029, 0x0003, 0, VR::FD, VM::M1, "" },
};
-unsigned short Dict052TagHashTable[] = {
+const unsigned short Dict055TagHashTable[] = {
3, 6, 0, 1, 1, 3, 1, 0, 2,
};
-unsigned short Dict052KeyHashTable[] = {
+const unsigned short Dict055KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict052Data = {
+vtkDICOMDictionary::Dict Dict055Data = {
"SHS MagicView 300",
2,
2,
-Dict052TagHashTable,
-Dict052KeyHashTable,
-Dict052Contents
+Dict055TagHashTable,
+Dict055KeyHashTable,
+Dict055Contents
};
// ----- INTELERAD MEDICAL SYSTEMS INTELEVIEWER -----
-DictEntry Dict053Contents[] = {
+const DictEntry Dict056Contents[] = {
{ 0x0071, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x0071, 0x0002, 0, VR::LO, VM::M1, "" },
{ 0x0071, 0x0003, 0, VR::UN, VM::M1, "" },
@@ -3222,104 +3502,104 @@ DictEntry Dict053Contents[] = {
{ 0x0071, 0x000A, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict053TagHashTable[] = {
+const unsigned short Dict056TagHashTable[] = {
8, 9, 12, 17, 20, 23, 26, 29, 0, 1,
0, 1, 2, 1, 2, 7, 10, 1, 2, 3,
1, 3, 4, 1, 4, 5, 1, 5, 6, 1,
6, 7,
};
-unsigned short Dict053KeyHashTable[] = {
+const unsigned short Dict056KeyHashTable[] = {
8, 8, 8, 8, 8, 9, 8, 8, 0, 8,
0, 672, 1, 672, 2, 672, 3, 672, 4, 672,
5, 672, 6, 672, 7, 672,
};
-vtkDICOMDictionary::Dict Dict053Data = {
+vtkDICOMDictionary::Dict Dict056Data = {
"INTELERAD MEDICAL SYSTEMS INTELEVIEWER",
8,
8,
-Dict053TagHashTable,
-Dict053KeyHashTable,
-Dict053Contents
+Dict056TagHashTable,
+Dict056KeyHashTable,
+Dict056Contents
};
// ----- SIEMENS IKM CKS CXRCAD FINDINGS -----
-DictEntry Dict054Contents[] = {
+const DictEntry Dict057Contents[] = {
{ 0x0029, 0x0001, 0, VR::UT, VM::M1, "" },
};
-unsigned short Dict054TagHashTable[] = {
+const unsigned short Dict057TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict054KeyHashTable[] = {
+const unsigned short Dict057KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict054Data = {
+vtkDICOMDictionary::Dict Dict057Data = {
"SIEMENS IKM CKS CXRCAD FINDINGS",
1,
1,
-Dict054TagHashTable,
-Dict054KeyHashTable,
-Dict054Contents
+Dict057TagHashTable,
+Dict057KeyHashTable,
+Dict057Contents
};
// ----- SIEMENS NUMARIS II -----
-DictEntry Dict055Contents[] = {
+const DictEntry Dict058Contents[] = {
{ 0x7fe3, 0x0000, 0, VR::LO, VM::M1, "ImageGraphicsFormatCode" },
{ 0x7fe3, 0x0010, 0, VR::OB, VM::M1, "ImageGraphics" },
{ 0x7fe3, 0x0020, 0, VR::OB, VM::M1, "ImageGraphicsDummy" },
};
-unsigned short Dict055TagHashTable[] = {
+const unsigned short Dict058TagHashTable[] = {
4, 9, 3, 0, 2, 1, 16, 2, 32, 1,
0, 0,
};
-unsigned short Dict055KeyHashTable[] = {
+const unsigned short Dict058KeyHashTable[] = {
4, 7, 3, 0, 1, 2, 53079, 2, 0, 55636,
1, 54408,
};
-vtkDICOMDictionary::Dict Dict055Data = {
+vtkDICOMDictionary::Dict Dict058Data = {
"SIEMENS NUMARIS II",
3,
3,
-Dict055TagHashTable,
-Dict055KeyHashTable,
-Dict055Contents
+Dict058TagHashTable,
+Dict058KeyHashTable,
+Dict058Contents
};
// ----- REPORT_FROM_APP -----
-DictEntry Dict056Contents[] = {
+const DictEntry Dict059Contents[] = {
{ 0x0039, 0x0095, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict056TagHashTable[] = {
+const unsigned short Dict059TagHashTable[] = {
2, 0, 1, 0, 149,
};
-unsigned short Dict056KeyHashTable[] = {
+const unsigned short Dict059KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict056Data = {
+vtkDICOMDictionary::Dict Dict059Data = {
"REPORT_FROM_APP",
1,
1,
-Dict056TagHashTable,
-Dict056KeyHashTable,
-Dict056Contents
+Dict059TagHashTable,
+Dict059KeyHashTable,
+Dict059Contents
};
// ----- KINETDX -----
-DictEntry Dict057Contents[] = {
+const DictEntry Dict060Contents[] = {
{ 0x0021, 0x00a5, 0, VR::US, VM::M1, "" },
{ 0x0021, 0x00a6, 0, VR::OB, VM::M1, "" },
{ 0x0021, 0x00a8, 0, VR::LO, VM::M1, "" },
@@ -3329,30 +3609,30 @@ DictEntry Dict057Contents[] = {
{ 0x0021, 0x00b4, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict057TagHashTable[] = {
+const unsigned short Dict060TagHashTable[] = {
8, 11, 7, 14, 19, 7, 24, 0, 1, 1,
166, 1, 0, 165, 2, 4, 171, 5, 172, 2,
3, 170, 6, 180, 1, 2, 168,
};
-unsigned short Dict057KeyHashTable[] = {
+const unsigned short Dict060KeyHashTable[] = {
7, 7, 7, 7, 7, 8, 7, 0, 7, 0,
768, 1, 768, 2, 768, 3, 768, 4, 768, 5,
768, 6, 768,
};
-vtkDICOMDictionary::Dict Dict057Data = {
+vtkDICOMDictionary::Dict Dict060Data = {
"KINETDX",
7,
7,
-Dict057TagHashTable,
-Dict057KeyHashTable,
-Dict057Contents
+Dict060TagHashTable,
+Dict060KeyHashTable,
+Dict060Contents
};
// ----- SIEMENS SYNGO WORKFLOW -----
-DictEntry Dict058Contents[] = {
+const DictEntry Dict061Contents[] = {
{ 0x0031, 0x0010, 0, VR::UI, VM::M1, "InternalPatientUID" },
{ 0x0031, 0x0011, 0, VR::SH, VM::M1, "PatientsDeathIndicator" },
{ 0x0031, 0x0012, 0, VR::DA, VM::M1, "PatientsDeathDate" },
@@ -3391,7 +3671,7 @@ DictEntry Dict058Contents[] = {
{ 0x0031, 0x0083, 0, VR::SQ, VM::M1, "InstitutionCodeSequence" },
};
-unsigned short Dict058TagHashTable[] = {
+const unsigned short Dict061TagHashTable[] = {
37, 42, 47, 50, 53, 56, 61, 64, 69, 74,
36, 36, 36, 36, 36, 36, 36, 77, 36, 36,
80, 36, 36, 36, 83, 86, 89, 92, 95, 98,
@@ -3408,7 +3688,7 @@ unsigned short Dict058TagHashTable[] = {
18, 27, 91,
};
-unsigned short Dict058KeyHashTable[] = {
+const unsigned short Dict061KeyHashTable[] = {
37, 40, 36, 45, 36, 48, 36, 55, 60, 63,
36, 66, 69, 36, 36, 36, 72, 75, 36, 78,
81, 86, 91, 36, 94, 99, 102, 36, 109, 36,
@@ -3425,33 +3705,39 @@ unsigned short Dict058KeyHashTable[] = {
1, 35, 44232,
};
-vtkDICOMDictionary::Dict Dict058Data = {
+vtkDICOMDictionary::Dict Dict061Data = {
"SIEMENS SYNGO WORKFLOW",
36,
36,
-Dict058TagHashTable,
-Dict058KeyHashTable,
-Dict058Contents
+Dict061TagHashTable,
+Dict061KeyHashTable,
+Dict061Contents
};
// ----- INTELERAD MEDICAL SYSTEMS -----
-DictEntry Dict059Contents[] = {
-{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "" },
-{ 0x0029, 0x0011, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0012, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0013, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "" },
+const DictEntry Dict062Contents[] = {
+{ 0x0029, 0x0001, 0, VR::FD, VM::M1, "ImageCompressionFraction" },
+{ 0x0029, 0x0002, 0, VR::FD, VM::M1, "ImageQuality" },
+{ 0x0029, 0x0003, 0, VR::FD, VM::M1, "ImageBytesTransferred" },
+{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "J2cParameterType" },
+{ 0x0029, 0x0011, 0, VR::US, VM::M1, "J2cPixelRepresentation" },
+{ 0x0029, 0x0012, 0, VR::US, VM::M1, "J2cBitsAllocated" },
+{ 0x0029, 0x0013, 0, VR::US, VM::M1, "J2cPixelShiftValue" },
+{ 0x0029, 0x0014, 0, VR::US, VM::M1, "J2cPlanarConfiguration" },
+{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "J2cRescaleIntercept" },
{ 0x0029, 0x0016, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x0017, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "MD5Sum" },
+{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "PixelDataMD5SumPerFrame" },
{ 0x0029, 0x0021, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x0022, 0, VR::US, VM::M1, "" },
-{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "" },
-{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "" },
-{ 0x3F01, 0x0004, 0, VR::LO, VM::M1, "" },
-{ 0x3F01, 0x0005, 0, VR::AE, VM::M1, "" },
-{ 0x3F01, 0x0007, 0, VR::LO, VM::M1, "" },
+{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "InstitutionCode" },
+{ 0x3F01, 0x0002, 0, VR::AE, VM::M1, "RoutedTransferAE" },
+{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "SourcedAE" },
+{ 0x3F01, 0x0004, 0, VR::SH, VM::M1, "DeferredValidation" },
+{ 0x3F01, 0x0005, 0, VR::LO, VM::M1, "SeriesOwner" },
+{ 0x3F01, 0x0007, 0, VR::SH, VM::M1, "StrippedPixelData" },
+{ 0x3F01, 0x0008, 0, VR::SH, VM::M1, "PendingMoveRequest" },
{ 0x3F01, 0x0009, 0, VR::LO, VM::M1, "" },
{ 0x3F01, 0x000A, 0, VR::DA, VM::M1, "" },
{ 0x3F01, 0x000B, 0, VR::TM, VM::M1, "" },
@@ -3461,109 +3747,151 @@ DictEntry Dict059Contents[] = {
{ 0x3F03, 0x0004, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict059TagHashTable[] = {
- 22, 22, 22, 22, 23, 22, 26, 29, 32, 37,
- 42, 45, 50, 57, 62, 69, 72, 22, 75, 78,
- 22, 22, 0, 1, 15, 9, 1, 17, 11, 1,
- 16, 10, 2, 8, 33, 13, 5, 2, 7, 32,
- 12, 4, 1, 14, 7, 2, 9, 34, 21, 4,
- 3, 1, 17, 10, 1, 20, 3, 2, 0, 16,
- 19, 2, 3, 3, 19, 11, 3, 18, 1, 1,
- 2, 18, 1, 4, 21, 1, 6, 23, 1, 5,
- 22,
+const unsigned short Dict062TagHashTable[] = {
+ 29, 36, 41, 48, 53, 56, 59, 62, 65, 68,
+ 28, 71, 74, 28, 77, 80, 28, 28, 28, 28,
+ 83, 86, 89, 92, 95, 98, 101, 104, 0, 3,
+ 4, 17, 14, 1, 26, 3, 2, 3, 16, 25,
+ 2, 3, 6, 19, 16, 3, 24, 1, 2, 5,
+ 18, 15, 2, 1, 8, 21, 1, 7, 20, 1,
+ 10, 23, 1, 9, 22, 1, 12, 33, 1, 11,
+ 32, 1, 13, 34, 1, 0, 1, 1, 2, 3,
+ 1, 1, 2, 1, 21, 9, 1, 20, 8, 1,
+ 23, 11, 1, 22, 10, 1, 18, 5, 1, 17,
+ 4, 1, 19, 7, 1, 27, 4,
+};
+
+const unsigned short Dict062KeyHashTable[] = {
+ 28, 29, 32, 35, 38, 41, 66, 69, 28, 74,
+ 77, 28, 28, 28, 28, 28, 80, 28, 28, 83,
+ 28, 86, 28, 89, 92, 95, 98, 28, 0, 1,
+ 1, 4956, 1, 14, 20478, 1, 18, 24242, 1, 19,
+44398, 12, 8, 53317, 9, 192, 10, 192, 12, 192,
+ 13, 192, 21, 192, 22, 192, 23, 192, 24, 192,
+ 25, 192, 26, 192, 27, 192, 1, 11, 37862, 2,
+ 2, 18574, 3, 4512, 1, 6, 48802, 1, 20, 21816,
+ 1, 0, 28368, 1, 5, 38941, 1, 4, 62031, 1,
+ 15, 31693, 1, 16, 16142, 1, 17, 3178, 1, 7,
+ 7296,
+};
+
+vtkDICOMDictionary::Dict Dict062Data = {
+"INTELERAD MEDICAL SYSTEMS",
+28,
+28,
+Dict062TagHashTable,
+Dict062KeyHashTable,
+Dict062Contents
};
-unsigned short Dict059KeyHashTable[] = {
- 22, 22, 22, 22, 22, 22, 23, 22, 22, 22,
- 22, 22, 22, 26, 22, 22, 22, 22, 22, 22,
- 22, 22, 0, 1, 7, 63303, 21, 0, 244, 1,
- 244, 2, 244, 3, 244, 4, 244, 5, 244, 6,
- 244, 8, 244, 9, 244, 10, 244, 11, 244, 12,
- 244, 13, 244, 14, 244, 15, 244, 16, 244, 17,
- 244, 18, 244, 19, 244, 20, 244, 21, 244,
+// ----- DVMInsight Receiver Tracking -----
+
+const DictEntry Dict063Contents[] = {
+{ 0x5AB3, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0004, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0006, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0008, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0010, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0012, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0014, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0016, 0, VR::LO, VM::M1, "" },
};
-vtkDICOMDictionary::Dict Dict059Data = {
-"INTELERAD MEDICAL SYSTEMS",
-22,
-22,
-Dict059TagHashTable,
-Dict059KeyHashTable,
-Dict059Contents
+const unsigned short Dict063TagHashTable[] = {
+ 10, 9, 15, 9, 20, 23, 26, 29, 9, 0,
+ 2, 2, 4, 6, 18, 2, 3, 6, 7, 20,
+ 1, 8, 22, 1, 0, 0, 1, 4, 8, 2,
+ 1, 2, 5, 16,
+};
+
+const unsigned short Dict063KeyHashTable[] = {
+ 9, 9, 9, 9, 9, 9, 9, 9, 10, 0,
+ 9, 0, 597, 1, 597, 2, 597, 3, 597, 4,
+ 597, 5, 597, 6, 597, 7, 597, 8, 597,
+};
+
+vtkDICOMDictionary::Dict Dict063Data = {
+"DVMInsight Receiver Tracking",
+9,
+9,
+Dict063TagHashTable,
+Dict063KeyHashTable,
+Dict063Contents
};
// ----- SIEMENS SYNGO FUNCTION ASSIGNMENT -----
-DictEntry Dict060Contents[] = {
+const DictEntry Dict064Contents[] = {
{ 0x0029, 0x0001, 0, VR::LO, VM::M1, "DataReference" },
};
-unsigned short Dict060TagHashTable[] = {
+const unsigned short Dict064TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict060KeyHashTable[] = {
+const unsigned short Dict064KeyHashTable[] = {
2, 0, 1, 0, 62574,
};
-vtkDICOMDictionary::Dict Dict060Data = {
+vtkDICOMDictionary::Dict Dict064Data = {
"SIEMENS SYNGO FUNCTION ASSIGNMENT",
1,
1,
-Dict060TagHashTable,
-Dict060KeyHashTable,
-Dict060Contents
+Dict064TagHashTable,
+Dict064KeyHashTable,
+Dict064Contents
};
// ----- FFP DATA -----
-DictEntry Dict061Contents[] = {
+const DictEntry Dict065Contents[] = {
{ 0x0009, 0x0001, 0, VR::UN, VM::M1, "CRHeaderInformation" },
};
-unsigned short Dict061TagHashTable[] = {
+const unsigned short Dict065TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict061KeyHashTable[] = {
+const unsigned short Dict065KeyHashTable[] = {
2, 0, 1, 0, 60169,
};
-vtkDICOMDictionary::Dict Dict061Data = {
+vtkDICOMDictionary::Dict Dict065Data = {
"FFP DATA",
1,
1,
-Dict061TagHashTable,
-Dict061KeyHashTable,
-Dict061Contents
+Dict065TagHashTable,
+Dict065KeyHashTable,
+Dict065Contents
};
// ----- astm.org/diconde/iod/ComponentStudy -----
-DictEntry Dict062Contents[] = {
+const DictEntry Dict066Contents[] = {
{ 0x0009, 0x0020, 0, VR::DA, VM::M1, "ExpiryDate" },
};
-unsigned short Dict062TagHashTable[] = {
+const unsigned short Dict066TagHashTable[] = {
2, 0, 1, 0, 32,
};
-unsigned short Dict062KeyHashTable[] = {
+const unsigned short Dict066KeyHashTable[] = {
2, 0, 1, 0, 42404,
};
-vtkDICOMDictionary::Dict Dict062Data = {
+vtkDICOMDictionary::Dict Dict066Data = {
"astm.org/diconde/iod/ComponentStudy",
1,
1,
-Dict062TagHashTable,
-Dict062KeyHashTable,
-Dict062Contents
+Dict066TagHashTable,
+Dict066KeyHashTable,
+Dict066Contents
};
// ----- SIEMENS SYNGO INDEX SERVICE -----
-DictEntry Dict063Contents[] = {
+const DictEntry Dict067Contents[] = {
{ 0x0009, 0x0020, 0, VR::DA, VM::M1, "ObjectInsertionDate" },
{ 0x0009, 0x0030, 0, VR::SQ, VM::M1, "InstanceObjectStates" },
{ 0x0009, 0x0031, 0, VR::SQ, VM::M1, "SeriesObjectStates" },
@@ -3581,7 +3909,7 @@ DictEntry Dict063Contents[] = {
{ 0x0009, 0x00A0, 0, VR::LO, VM::M1, "SenderSystemDeviceName" },
};
-unsigned short Dict063TagHashTable[] = {
+const unsigned short Dict067TagHashTable[] = {
16, 19, 22, 25, 28, 33, 36, 15, 15, 15,
15, 39, 44, 49, 54, 0, 1, 6, 67, 1,
7, 68, 1, 8, 69, 1, 9, 70, 2, 10,
@@ -3590,7 +3918,7 @@ unsigned short Dict063TagHashTable[] = {
4, 65, 13, 80, 1, 5, 66,
};
-unsigned short Dict063KeyHashTable[] = {
+const unsigned short Dict067KeyHashTable[] = {
16, 19, 15, 22, 25, 30, 15, 33, 40, 43,
15, 15, 48, 51, 54, 0, 1, 4, 16890, 1,
6, 23062, 1, 7, 18517, 2, 3, 42506, 12, 15723,
@@ -3599,96 +3927,96 @@ unsigned short Dict063KeyHashTable[] = {
56295, 1, 8, 35058, 1, 9, 63221,
};
-vtkDICOMDictionary::Dict Dict063Data = {
+vtkDICOMDictionary::Dict Dict067Data = {
"SIEMENS SYNGO INDEX SERVICE",
15,
15,
-Dict063TagHashTable,
-Dict063KeyHashTable,
-Dict063Contents
+Dict067TagHashTable,
+Dict067KeyHashTable,
+Dict067Contents
};
// ----- http://www.gemedicalsystems.com/it_solutions/rad_pacs/ -----
-DictEntry Dict064Contents[] = {
-{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "Reference to pacs study" },
-{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "Reference to pacs image" },
-{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "Pacs examnotes flag" },
+const DictEntry Dict068Contents[] = {
+{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "ReferenceToPacsStudy" },
+{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "ReferenceToPacsImage" },
+{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "PacsExamnotesFlag" },
};
-unsigned short Dict064TagHashTable[] = {
+const unsigned short Dict068TagHashTable[] = {
3, 4, 7, 0, 1, 2, 3, 2, 0, 1,
1, 2,
};
-unsigned short Dict064KeyHashTable[] = {
- 4, 7, 3, 0, 1, 0, 11293, 2, 1, 30368,
- 2, 33011,
+const unsigned short Dict068KeyHashTable[] = {
+ 4, 3, 7, 0, 1, 1, 9387, 2, 0, 55847,
+ 2, 3144,
};
-vtkDICOMDictionary::Dict Dict064Data = {
+vtkDICOMDictionary::Dict Dict068Data = {
"http://www.gemedicalsystems.com/it_solutions/rad_pacs/",
3,
3,
-Dict064TagHashTable,
-Dict064KeyHashTable,
-Dict064Contents
+Dict068TagHashTable,
+Dict068KeyHashTable,
+Dict068Contents
};
// ----- SIEMENS CT APPL TMP DATAMODEL -----
-DictEntry Dict065Contents[] = {
+const DictEntry Dict069Contents[] = {
{ 0x0029, 0x0000, 0, VR::OB, VM::M1, "CTTaskCommonDataModel" },
};
-unsigned short Dict065TagHashTable[] = {
+const unsigned short Dict069TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict065KeyHashTable[] = {
+const unsigned short Dict069KeyHashTable[] = {
2, 0, 1, 0, 20131,
};
-vtkDICOMDictionary::Dict Dict065Data = {
+vtkDICOMDictionary::Dict Dict069Data = {
"SIEMENS CT APPL TMP DATAMODEL",
1,
1,
-Dict065TagHashTable,
-Dict065KeyHashTable,
-Dict065Contents
+Dict069TagHashTable,
+Dict069KeyHashTable,
+Dict069Contents
};
// ----- CTP -----
-DictEntry Dict066Contents[] = {
+const DictEntry Dict070Contents[] = {
{ 0x0013, 0x0010, 0, VR::LO, VM::M1, "ProjectName" },
{ 0x0013, 0x0011, 0, VR::LO, VM::M1, "TrialName" },
{ 0x0013, 0x0012, 0, VR::LO, VM::M1, "SiteName" },
{ 0x0013, 0x0013, 0, VR::LO, VM::M1, "SiteID" },
};
-unsigned short Dict066TagHashTable[] = {
+const unsigned short Dict070TagHashTable[] = {
5, 8, 11, 14, 0, 1, 3, 19, 1, 2,
18, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict066KeyHashTable[] = {
+const unsigned short Dict070KeyHashTable[] = {
4, 5, 8, 11, 0, 1, 0, 39615, 1, 1,
8344, 2, 2, 12198, 3, 9289,
};
-vtkDICOMDictionary::Dict Dict066Data = {
+vtkDICOMDictionary::Dict Dict070Data = {
"CTP",
4,
4,
-Dict066TagHashTable,
-Dict066KeyHashTable,
-Dict066Contents
+Dict070TagHashTable,
+Dict070KeyHashTable,
+Dict070Contents
};
// ----- PixelMed Publishing -----
-DictEntry Dict067Contents[] = {
+const DictEntry Dict071Contents[] = {
{ 0x0011, 0x0002, 0, VR::UC, VM::M1, "StrainDescription" },
{ 0x0011, 0x0003, 0, VR::LO, VM::M1, "StrainNomenclature" },
{ 0x0011, 0x0004, 0, VR::LO, VM::M1, "StrainStockNumber" },
@@ -3713,7 +4041,7 @@ DictEntry Dict067Contents[] = {
{ 0x7FE1, 0x0002, 0, VR::OD, VM::M1, "DoublePixelData" },
};
-unsigned short Dict067TagHashTable[] = {
+const unsigned short Dict071TagHashTable[] = {
23, 28, 33, 36, 22, 39, 22, 22, 22, 42,
45, 52, 55, 58, 22, 22, 22, 22, 63, 66,
69, 74, 0, 2, 5, 7, 10, 82, 2, 4,
@@ -3725,7 +4053,7 @@ unsigned short Dict067TagHashTable[] = {
1,
};
-unsigned short Dict067KeyHashTable[] = {
+const unsigned short Dict071KeyHashTable[] = {
22, 22, 22, 22, 23, 26, 31, 36, 22, 22,
41, 22, 44, 22, 47, 22, 50, 57, 66, 69,
72, 77, 0, 1, 21, 7700, 2, 9, 47329, 19,
@@ -3736,116 +4064,116 @@ unsigned short Dict067KeyHashTable[] = {
20, 18182, 2, 0, 44345, 18, 716, 1, 16, 7011,
};
-vtkDICOMDictionary::Dict Dict067Data = {
+vtkDICOMDictionary::Dict Dict071Data = {
"PixelMed Publishing",
22,
22,
-Dict067TagHashTable,
-Dict067KeyHashTable,
-Dict067Contents
+Dict071TagHashTable,
+Dict071KeyHashTable,
+Dict071Contents
};
// ----- POLYTRON-SMS 2.5 -----
-DictEntry Dict068Contents[] = {
+const DictEntry Dict072Contents[] = {
{ 0x0009, 0x0002, 0, VR::OB, VM::M1, "" },
{ 0x0009, 0x0004, 0, VR::OB, VM::M1, "" },
{ 0x0009, 0x0006, 0, VR::OB, VM::M1, "" },
{ 0x0089, 0x0010, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict068TagHashTable[] = {
+const unsigned short Dict072TagHashTable[] = {
4, 5, 4, 8, 0, 1, 1, 4, 3, 0,
2, 2, 6, 3, 16,
};
-unsigned short Dict068KeyHashTable[] = {
+const unsigned short Dict072KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict068Data = {
+vtkDICOMDictionary::Dict Dict072Data = {
"POLYTRON-SMS 2.5",
4,
4,
-Dict068TagHashTable,
-Dict068KeyHashTable,
-Dict068Contents
+Dict072TagHashTable,
+Dict072KeyHashTable,
+Dict072Contents
};
// ----- Philips Imaging DD 129 -----
-DictEntry Dict069Contents[] = {
-{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "" },
+const DictEntry Dict073Contents[] = {
+{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "PresentationStateSequence" },
{ 0x2001, 0x0001, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict069TagHashTable[] = {
+const unsigned short Dict073TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict069KeyHashTable[] = {
- 2, 3, 0, 2, 0, 2690, 1, 2690,
+const unsigned short Dict073KeyHashTable[] = {
+ 2, 3, 0, 2, 0, 11901, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict069Data = {
+vtkDICOMDictionary::Dict Dict073Data = {
"Philips Imaging DD 129",
2,
2,
-Dict069TagHashTable,
-Dict069KeyHashTable,
-Dict069Contents
+Dict073TagHashTable,
+Dict073KeyHashTable,
+Dict073Contents
};
// ----- Philips Imaging DD 124 -----
-DictEntry Dict070Contents[] = {
+const DictEntry Dict074Contents[] = {
{ 0x1001, 0x0003, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict070TagHashTable[] = {
+const unsigned short Dict074TagHashTable[] = {
2, 0, 1, 0, 3,
};
-unsigned short Dict070KeyHashTable[] = {
+const unsigned short Dict074KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict070Data = {
+vtkDICOMDictionary::Dict Dict074Data = {
"Philips Imaging DD 124",
1,
1,
-Dict070TagHashTable,
-Dict070KeyHashTable,
-Dict070Contents
+Dict074TagHashTable,
+Dict074KeyHashTable,
+Dict074Contents
};
// ----- PMS-THORA-5.1 -----
-DictEntry Dict071Contents[] = {
+const DictEntry Dict075Contents[] = {
{ 0x0089, 0x0020, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict071TagHashTable[] = {
+const unsigned short Dict075TagHashTable[] = {
2, 0, 1, 0, 32,
};
-unsigned short Dict071KeyHashTable[] = {
+const unsigned short Dict075KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict071Data = {
+vtkDICOMDictionary::Dict Dict075Data = {
"PMS-THORA-5.1",
1,
1,
-Dict071TagHashTable,
-Dict071KeyHashTable,
-Dict071Contents
+Dict075TagHashTable,
+Dict075KeyHashTable,
+Dict075Contents
};
// ----- SIEMENS MED SMS USG S2000 -----
-DictEntry Dict072Contents[] = {
+const DictEntry Dict076Contents[] = {
{ 0x0019, 0x0000, 0, VR::SH, VM::M1, "PrivateCreatorVersion" },
{ 0x0019, 0x0003, 0, VR::FD, VM::M1, "FrameRate" },
{ 0x0019, 0x000C, 0, VR::US, VM::M1, "BurnedInGraphics" },
@@ -3899,7 +4227,7 @@ DictEntry Dict072Contents[] = {
{ 0x0019, 0x0095, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict072TagHashTable[] = {
+const unsigned short Dict076TagHashTable[] = {
52, 57, 62, 65, 68, 75, 78, 81, 84, 87,
90, 93, 98, 51, 103, 51, 51, 51, 106, 109,
112, 117, 51, 122, 127, 130, 137, 51, 51, 140,
@@ -3922,7 +4250,7 @@ unsigned short Dict072TagHashTable[] = {
131,
};
-unsigned short Dict072KeyHashTable[] = {
+const unsigned short Dict076KeyHashTable[] = {
51, 51, 51, 51, 52, 55, 51, 58, 63, 51,
68, 73, 78, 81, 84, 89, 51, 92, 97, 51,
102, 105, 108, 51, 51, 113, 116, 51, 51, 137,
@@ -3944,41 +4272,41 @@ unsigned short Dict072KeyHashTable[] = {
32, 40330,
};
-vtkDICOMDictionary::Dict Dict072Data = {
+vtkDICOMDictionary::Dict Dict076Data = {
"SIEMENS MED SMS USG S2000",
51,
51,
-Dict072TagHashTable,
-Dict072KeyHashTable,
-Dict072Contents
+Dict076TagHashTable,
+Dict076KeyHashTable,
+Dict076Contents
};
// ----- SIEMENS MED OCS SS VERSION INFO -----
-DictEntry Dict073Contents[] = {
+const DictEntry Dict077Contents[] = {
{ 0x0039, 0x0076, 0, VR::LO, VM::M1, "StructureSetPredecessor" },
};
-unsigned short Dict073TagHashTable[] = {
+const unsigned short Dict077TagHashTable[] = {
2, 0, 1, 0, 118,
};
-unsigned short Dict073KeyHashTable[] = {
+const unsigned short Dict077KeyHashTable[] = {
2, 0, 1, 0, 27329,
};
-vtkDICOMDictionary::Dict Dict073Data = {
+vtkDICOMDictionary::Dict Dict077Data = {
"SIEMENS MED OCS SS VERSION INFO",
1,
1,
-Dict073TagHashTable,
-Dict073KeyHashTable,
-Dict073Contents
+Dict077TagHashTable,
+Dict077KeyHashTable,
+Dict077Contents
};
// ----- ELSCINT1 -----
-DictEntry Dict074Contents[] = {
+const DictEntry Dict078Contents[] = {
{ 0x0003, 0x0001, 0, VR::OW, VM::M1, "OffsetListStructure" },
{ 0x00E1, 0x0001, 0, VR::US, VM::M1, "DataDictionaryVersion" },
{ 0x00E1, 0x0005, 0, VR::IS, VM::M1, "" },
@@ -4140,21 +4468,33 @@ DictEntry Dict074Contents[] = {
{ 0x07A1, 0x003D, 0, VR::US, VM::M1, "" },
{ 0x07A1, 0x0040, 0, VR::CS, VM::M1, "" },
{ 0x07A1, 0x0043, 0, VR::IS, VM::M1, "" },
+{ 0x07A1, 0x0045, 0, VR::LT, VM::M1, "" },
{ 0x07A1, 0x0047, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x004A, 0, VR::SH, VM::M1, "" },
{ 0x07A1, 0x0050, 0, VR::US, VM::M1, "" },
{ 0x07A1, 0x0056, 0, VR::US, VM::M1, "" },
+{ 0x07A1, 0x0058, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x005D, 0, VR::DT, VM::M1, "" },
+{ 0x07A1, 0x005F, 0, VR::CS, VM::M1, "" },
{ 0x07A1, 0x0070, 0, VR::SH, VM::M1, "" },
{ 0x07A1, 0x0071, 0, VR::SH, VM::M1, "" },
{ 0x07A1, 0x0075, 0, VR::LO, VM::M2, "" },
+{ 0x07A1, 0x0076, 0, VR::ST, VM::M1, "" },
{ 0x07A1, 0x0085, 0, VR::UL, VM::M1, "" },
{ 0x07A1, 0x0087, 0, VR::LT, VM::M1, "" },
{ 0x07A1, 0x0088, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x008C, 0, VR::ST, VM::M1, "" },
+{ 0x07A1, 0x0094, 0, VR::ST, VM::M1, "" },
+{ 0x07A1, 0x0096, 0, VR::DA, VM::M1, "" },
+{ 0x07A1, 0x0097, 0, VR::SH, VM::M1, "" },
{ 0x07A1, 0x0098, 0, VR::CS, VM::M1, "" },
{ 0x07A1, 0x009F, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x00D0, 0, VR::LO, VM::M1, "" },
{ 0x07A3, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x07A3, 0x0003, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x0005, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x0006, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x0009, 0, VR::IS, VM::M1, "" },
{ 0x07A3, 0x0013, 0, VR::SH, VM::M1, "" },
{ 0x07A3, 0x0014, 0, VR::ST, VM::M1, "" },
{ 0x07A3, 0x0015, 0, VR::ST, VM::M1, "" },
@@ -4173,13 +4513,34 @@ DictEntry Dict074Contents[] = {
{ 0x07A3, 0x0065, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x0066, 0, VR::IS, VM::M1, "" },
{ 0x07A3, 0x0080, 0, VR::SQ, VM::M1, "" },
+{ 0x07A3, 0x0092, 0, VR::DS, VM::M1, "" },
+{ 0x07A3, 0x0093, 0, VR::DS, VM::M1, "" },
{ 0x07A3, 0x0099, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x009C, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x009F, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x00B9, 0, VR::CS, VM::M1, "" },
{ 0x07A3, 0x00BB, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00C0, 0, VR::SQ, VM::M1, "" },
+{ 0x07A3, 0x00C1, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00C2, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00C3, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00C4, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00C5, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00C8, 0, VR::AE, VM::M1, "" },
+{ 0x07A3, 0x00C9, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00CB, 0, VR::SQ, VM::M1, "" },
+{ 0x07A3, 0x00CC, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00E3, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00F2, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00F5, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00FA, 0, VR::DT, VM::M1, "" },
+{ 0x07A3, 0x00FB, 0, VR::DT, VM::M1, "" },
{ 0x07A5, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x07A5, 0x0054, 0, VR::DT, VM::M1, "" },
{ 0x07A5, 0x0056, 0, VR::CS, VM::M1, "" },
+{ 0x07A5, 0x0059, 0, VR::IS, VM::M1, "" },
+{ 0x07A5, 0x0062, 0, VR::LO, VM::M1, "" },
+{ 0x07A5, 0x0069, 0, VR::LO, VM::M1, "" },
{ 0x5001, 0x0070, 0, VR::SQ, VM::M1, "" },
{ 0x5001, 0x0071, 0, VR::SH, VM::M1, "" },
{ 0x5001, 0x0080, 0, VR::SQ, VM::M1, "" },
@@ -4189,168 +4550,215 @@ DictEntry Dict074Contents[] = {
{ 0x5001, 0x0084, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict074TagHashTable[] = {
- 209, 208, 212, 217, 220, 223, 226, 229, 208, 208,
- 232, 235, 238, 241, 208, 208, 248, 251, 254, 257,
- 262, 267, 208, 272, 208, 277, 280, 283, 286, 289,
- 292, 208, 295, 302, 208, 307, 310, 313, 318, 323,
- 208, 208, 326, 208, 208, 208, 329, 334, 337, 342,
- 345, 352, 208, 355, 358, 361, 366, 369, 208, 376,
- 379, 382, 385, 208, 390, 397, 402, 405, 410, 415,
- 422, 427, 432, 435, 438, 441, 444, 449, 452, 457,
- 462, 465, 468, 473, 478, 481, 486, 495, 504, 509,
- 514, 521, 526, 531, 534, 543, 208, 208, 208, 548,
- 208, 551, 554, 557, 560, 565, 208, 568, 573, 576,
- 579, 208, 208, 208, 208, 208, 208, 208, 208, 208,
- 582, 585, 208, 588, 208, 208, 591, 594, 597, 602,
- 607, 612, 617, 208, 620, 625, 628, 635, 642, 208,
- 208, 645, 648, 651, 208, 208, 208, 208, 208, 208,
- 208, 208, 654, 659, 208, 208, 662, 208, 665, 208,
- 668, 673, 676, 681, 208, 686, 689, 208, 208, 692,
- 208, 208, 208, 695, 698, 701, 208, 704, 707, 712,
- 715, 718, 208, 208, 723, 728, 731, 208, 208, 208,
- 736, 739, 742, 747, 208, 752, 208, 208, 755, 758,
- 208, 208, 208, 208, 208, 208, 208, 208, 0, 1,
- 14, 50, 2, 0, 1, 12, 48, 1, 13, 49,
- 1, 78, 83, 1, 15, 55, 1, 43, 65, 1,
- 42, 64, 1, 36, 235, 1, 16, 57, 1, 17,
- 62, 3, 18, 63, 37, 236, 121, 92, 1, 71,
- 71, 1, 70, 70, 1, 69, 69, 2, 1, 1,
- 68, 68, 2, 3, 6, 67, 67, 2, 4, 7,
- 66, 66, 2, 2, 5, 65, 64, 1, 77, 78,
- 1, 76, 77, 1, 75, 76, 1, 74, 75, 1,
- 73, 74, 1, 72, 73, 3, 40, 38, 61, 54,
- 119, 48, 2, 62, 55, 120, 49, 1, 33, 194,
- 1, 59, 50, 2, 34, 196, 60, 51, 2, 5,
- 20, 58, 48, 1, 39, 33, 1, 6, 24, 2,
- 35, 207, 63, 56, 1, 64, 57, 2, 55, 38,
- 93, 36, 1, 56, 39, 3, 41, 52, 108, 34,
- 158, 61, 1, 109, 35, 1, 110, 37, 1, 111,
- 38, 2, 92, 35, 112, 39, 1, 113, 40, 3,
- 114, 41, 157, 54, 184, 52, 1, 115, 43, 1,
- 116, 44, 1, 117, 45, 2, 57, 40, 118, 46,
- 3, 32, 160, 86, 20, 94, 16, 2, 87, 21,
- 95, 17, 1, 88, 22, 2, 89, 23, 96, 19,
- 2, 97, 20, 156, 43, 3, 83, 17, 98, 21,
- 155, 42, 2, 84, 18, 99, 22, 2, 85, 19,
- 100, 23, 1, 101, 24, 1, 102, 25, 1, 103,
- 26, 1, 104, 27, 2, 90, 24, 105, 28, 1,
- 91, 25, 2, 106, 30, 183, 35, 2, 107, 31,
- 182, 34, 1, 82, 4, 1, 49, 7, 2, 47,
- 4, 181, 31, 2, 48, 5, 154, 28, 1, 45,
- 2, 2, 46, 3, 79, 1, 4, 80, 2, 130,
- 8, 153, 25, 180, 27, 4, 44, 1, 81, 3,
- 131, 9, 152, 24, 2, 54, 14, 178, 21, 2,
- 151, 22, 177, 20, 3, 52, 12, 128, 4, 179,
- 23, 2, 53, 13, 129, 5, 2, 51, 10, 150,
- 19, 1, 149, 18, 4, 38, 24, 50, 8, 148,
- 17, 176, 19, 2, 127, 1, 147, 16, 1, 146,
- 12, 1, 145, 10, 1, 144, 9, 1, 143, 8,
- 2, 142, 7, 174, 5, 1, 132, 0, 2, 175,
- 6, 199, 0, 1, 172, 1, 1, 141, 2, 1,
- 173, 3, 1, 136, 49, 1, 135, 48, 1, 166,
- 117, 1, 164, 112, 1, 165, 113, 2, 28, 99,
- 206, 131, 2, 27, 98, 205, 130, 2, 26, 97,
- 204, 129, 2, 25, 96, 203, 128, 1, 198, 187,
- 2, 29, 101, 197, 185, 1, 207, 132, 3, 31,
- 107, 134, 33, 190, 100, 3, 30, 106, 133, 32,
- 191, 101, 1, 192, 102, 1, 187, 97, 1, 188,
- 98, 1, 189, 99, 2, 137, 80, 163, 86, 1,
- 186, 85, 1, 200, 86, 1, 162, 80, 2, 22,
- 67, 196, 159, 1, 21, 66, 2, 20, 65, 171,
- 159, 2, 19, 64, 195, 156, 1, 170, 152, 1,
- 194, 153, 1, 161, 71, 1, 160, 67, 1, 159,
- 64, 1, 185, 67, 1, 122, 112, 2, 24, 81,
- 123, 115, 1, 23, 80, 1, 125, 117, 2, 124,
- 116, 169, 136, 2, 138, 112, 167, 133, 1, 139,
- 113, 2, 140, 114, 168, 135, 1, 126, 127, 1,
- 193, 128, 2, 8, 34, 201, 112, 2, 9, 35,
- 202, 113, 1, 7, 33, 1, 10, 36, 1, 11,
- 37,
-};
-
-unsigned short Dict074KeyHashTable[] = {
- 208, 208, 208, 208, 209, 208, 208, 208, 212, 208,
- 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
- 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
- 215, 208, 220, 208, 223, 208, 208, 208, 208, 208,
- 226, 208, 208, 208, 208, 208, 208, 208, 229, 208,
- 208, 208, 232, 208, 208, 208, 208, 208, 208, 208,
- 235, 208, 208, 208, 208, 208, 208, 208, 238, 208,
- 208, 208, 208, 241, 208, 208, 244, 208, 208, 208,
- 208, 208, 249, 208, 252, 208, 208, 208, 208, 208,
- 208, 255, 208, 208, 208, 208, 258, 208, 261, 208,
- 208, 208, 264, 267, 208, 208, 208, 208, 208, 208,
- 270, 208, 208, 208, 208, 208, 208, 208, 208, 208,
- 273, 208, 208, 208, 208, 276, 208, 208, 208, 208,
- 208, 208, 208, 208, 208, 208, 208, 208, 279, 208,
- 208, 208, 208, 208, 208, 282, 208, 208, 285, 208,
- 208, 208, 208, 208, 208, 208, 208, 208, 208, 208,
- 208, 208, 208, 208, 208, 288, 208, 208, 208, 291,
- 208, 208, 208, 208, 208, 294, 208, 297, 208, 208,
- 208, 300, 208, 208, 208, 208, 208, 641, 644, 647,
- 650, 208, 653, 208, 208, 208, 208, 208, 208, 208,
- 208, 656, 208, 208, 208, 208, 659, 208, 0, 1,
- 45, 28650, 1, 26, 56733, 2, 8, 16578, 127, 50619,
- 1, 50, 5267, 1, 57, 57159, 1, 19, 44316, 1,
- 44, 27022, 1, 9, 4060, 1, 49, 60926, 1, 23,
-33441, 1, 128, 10891, 2, 52, 35680, 53, 17207, 1,
- 134, 58701, 1, 56, 61829, 1, 1, 40198, 1, 138,
-12521, 1, 139, 14762, 1, 59, 18434, 1, 46, 22081,
- 1, 133, 14121, 1, 51, 23763, 1, 48, 10768, 1,
- 47, 52584, 1, 132, 57458, 1, 60, 61093, 1, 137,
-60632, 1, 7, 11800, 1, 15, 53654, 1, 129, 63551,
- 170, 2, 25, 3, 25, 4, 25, 5, 25, 6,
- 25, 10, 25, 11, 25, 12, 25, 13, 25, 14,
- 25, 16, 25, 17, 25, 18, 25, 20, 25, 21,
- 25, 22, 25, 24, 25, 25, 25, 27, 25, 29,
- 25, 30, 25, 31, 25, 32, 25, 33, 25, 34,
- 25, 35, 25, 36, 25, 37, 25, 38, 25, 39,
- 25, 41, 25, 42, 25, 43, 25, 54, 25, 58,
- 25, 61, 25, 62, 25, 63, 25, 64, 25, 65,
- 25, 66, 25, 67, 25, 68, 25, 69, 25, 70,
- 25, 71, 25, 72, 25, 73, 25, 74, 25, 75,
- 25, 76, 25, 77, 25, 78, 25, 79, 25, 80,
- 25, 81, 25, 82, 25, 83, 25, 84, 25, 85,
- 25, 86, 25, 87, 25, 88, 25, 89, 25, 90,
- 25, 91, 25, 92, 25, 93, 25, 94, 25, 95,
- 25, 96, 25, 97, 25, 98, 25, 99, 25, 100,
- 25, 101, 25, 102, 25, 103, 25, 104, 25, 105,
- 25, 106, 25, 107, 25, 108, 25, 109, 25, 110,
- 25, 111, 25, 112, 25, 113, 25, 114, 25, 115,
- 25, 116, 25, 117, 25, 118, 25, 119, 25, 120,
- 25, 121, 25, 122, 25, 123, 25, 124, 25, 125,
- 25, 126, 25, 130, 25, 131, 25, 141, 25, 142,
- 25, 143, 25, 144, 25, 145, 25, 146, 25, 147,
- 25, 148, 25, 149, 25, 150, 25, 151, 25, 152,
- 25, 153, 25, 154, 25, 155, 25, 156, 25, 157,
- 25, 158, 25, 159, 25, 160, 25, 161, 25, 162,
- 25, 163, 25, 164, 25, 165, 25, 166, 25, 167,
- 25, 168, 25, 169, 25, 170, 25, 171, 25, 172,
- 25, 173, 25, 174, 25, 175, 25, 176, 25, 177,
- 25, 178, 25, 179, 25, 180, 25, 181, 25, 182,
- 25, 183, 25, 184, 25, 185, 25, 186, 25, 187,
- 25, 188, 25, 189, 25, 190, 25, 191, 25, 192,
- 25, 193, 25, 194, 25, 195, 25, 196, 25, 197,
- 25, 198, 25, 199, 25, 200, 25, 201, 25, 202,
- 25, 203, 25, 204, 25, 205, 25, 206, 25, 207,
- 25, 1, 135, 3010, 1, 136, 23976, 1, 55, 5738,
- 1, 28, 29418, 1, 140, 13622, 1, 0, 10589, 1,
- 40, 25955,
+const unsigned short Dict078TagHashTable[] = {
+ 242, 245, 254, 259, 264, 269, 276, 279, 282, 285,
+ 290, 297, 300, 305, 312, 315, 318, 321, 324, 327,
+ 332, 337, 344, 349, 352, 357, 362, 367, 370, 375,
+ 378, 383, 386, 389, 394, 397, 400, 403, 408, 413,
+ 241, 241, 241, 416, 419, 422, 425, 430, 433, 241,
+ 241, 438, 443, 446, 449, 241, 241, 241, 452, 455,
+ 241, 241, 241, 241, 458, 241, 241, 463, 241, 241,
+ 466, 469, 241, 241, 241, 472, 241, 241, 241, 241,
+ 475, 480, 483, 241, 241, 486, 489, 492, 241, 495,
+ 241, 498, 241, 241, 503, 241, 506, 509, 241, 241,
+ 512, 241, 515, 241, 241, 241, 241, 241, 520, 523,
+ 241, 526, 241, 529, 241, 532, 241, 537, 540, 543,
+ 241, 241, 241, 241, 241, 241, 241, 241, 546, 549,
+ 552, 557, 241, 241, 562, 241, 565, 568, 241, 573,
+ 576, 241, 579, 582, 585, 588, 591, 596, 603, 608,
+ 611, 241, 241, 241, 614, 241, 241, 617, 620, 241,
+ 623, 626, 631, 636, 241, 241, 241, 241, 641, 241,
+ 241, 241, 241, 644, 647, 241, 241, 241, 650, 653,
+ 658, 661, 666, 241, 241, 241, 241, 241, 669, 241,
+ 241, 672, 675, 680, 685, 690, 697, 241, 702, 709,
+ 712, 715, 718, 723, 728, 733, 241, 738, 745, 752,
+ 755, 758, 763, 766, 773, 241, 241, 241, 241, 776,
+ 781, 784, 789, 794, 801, 806, 811, 814, 819, 826,
+ 833, 840, 847, 241, 852, 855, 860, 863, 241, 868,
+ 873, 0, 1, 88, 22, 4, 89, 23, 96, 19,
+ 157, 54, 196, 52, 2, 0, 1, 97, 20, 2,
+ 83, 17, 98, 21, 2, 84, 18, 99, 22, 3,
+ 5, 20, 85, 19, 100, 23, 1, 101, 24, 1,
+ 102, 25, 1, 103, 26, 2, 6, 24, 104, 27,
+ 3, 36, 235, 90, 24, 105, 28, 1, 91, 25,
+ 2, 106, 30, 156, 43, 3, 37, 236, 107, 31,
+ 155, 42, 1, 82, 4, 1, 49, 7, 1, 47,
+ 4, 1, 48, 5, 1, 45, 2, 2, 46, 3,
+ 79, 1, 2, 80, 2, 130, 8, 3, 44, 1,
+ 81, 3, 131, 9, 2, 54, 14, 195, 35, 1,
+ 194, 34, 2, 52, 12, 128, 4, 2, 53, 13,
+ 129, 5, 2, 51, 10, 193, 31, 1, 154, 28,
+ 2, 38, 24, 50, 8, 1, 127, 1, 2, 153,
+ 25, 192, 27, 1, 152, 24, 1, 190, 21, 2,
+ 151, 22, 189, 20, 1, 191, 23, 1, 33, 194,
+ 1, 150, 19, 2, 34, 196, 149, 18, 2, 148,
+ 17, 188, 19, 1, 147, 16, 1, 146, 12, 1,
+ 187, 9, 1, 145, 10, 2, 35, 207, 144, 9,
+ 1, 143, 8, 2, 142, 7, 185, 5, 2, 186,
+ 6, 228, 0, 1, 183, 1, 1, 141, 2, 1,
+ 184, 3, 1, 234, 112, 1, 235, 113, 2, 32,
+ 160, 172, 118, 1, 171, 117, 1, 169, 112, 1,
+ 170, 113, 1, 233, 105, 2, 202, 100, 232, 98,
+ 1, 203, 101, 1, 204, 102, 1, 199, 97, 1,
+ 200, 98, 1, 201, 99, 1, 168, 95, 2, 167,
+ 93, 231, 89, 1, 166, 88, 1, 165, 86, 1,
+ 198, 85, 1, 230, 86, 2, 164, 80, 229, 84,
+ 1, 163, 74, 1, 212, 187, 1, 211, 185, 1,
+ 162, 71, 2, 132, 0, 161, 69, 1, 160, 67,
+ 1, 159, 64, 1, 197, 67, 1, 28, 99, 1,
+ 27, 98, 2, 26, 97, 136, 49, 2, 25, 96,
+ 135, 48, 1, 29, 101, 1, 31, 107, 2, 30,
+ 106, 210, 159, 1, 181, 159, 1, 209, 156, 1,
+ 180, 152, 1, 208, 153, 1, 122, 112, 1, 123,
+ 115, 2, 134, 33, 177, 148, 3, 125, 117, 133,
+ 32, 179, 151, 2, 124, 116, 178, 150, 1, 207,
+ 147, 1, 206, 146, 1, 176, 140, 1, 126, 127,
+ 1, 175, 136, 1, 22, 67, 2, 21, 66, 173,
+ 133, 2, 20, 65, 137, 80, 2, 19, 64, 174,
+ 135, 1, 205, 128, 1, 226, 250, 1, 227, 251,
+ 1, 24, 81, 2, 23, 80, 78, 83, 1, 225,
+ 245, 2, 43, 65, 224, 242, 1, 42, 64, 1,
+ 121, 92, 1, 71, 71, 2, 8, 34, 70, 70,
+ 2, 9, 35, 69, 69, 2, 68, 68, 138, 112,
+ 3, 7, 33, 67, 67, 139, 113, 2, 66, 66,
+ 140, 114, 3, 10, 36, 65, 64, 223, 227, 1,
+ 11, 37, 1, 77, 78, 1, 76, 77, 2, 75,
+ 76, 239, 131, 2, 74, 75, 238, 130, 2, 73,
+ 74, 237, 129, 2, 72, 73, 236, 128, 3, 40,
+ 38, 61, 54, 119, 48, 3, 14, 50, 62, 55,
+ 120, 49, 1, 240, 132, 1, 12, 48, 2, 13,
+ 49, 59, 50, 1, 60, 51, 3, 15, 55, 58,
+ 48, 182, 208, 1, 39, 33, 2, 16, 57, 222,
+ 204, 1, 17, 62, 2, 18, 63, 63, 56, 2,
+ 64, 57, 221, 203, 3, 55, 38, 93, 36, 219,
+ 200, 2, 56, 39, 220, 201, 2, 41, 52, 108,
+ 34, 1, 109, 35, 2, 1, 1, 217, 196, 3,
+ 3, 6, 110, 37, 218, 197, 3, 4, 7, 111,
+ 38, 215, 194, 3, 92, 35, 112, 39, 216, 195,
+ 3, 2, 5, 113, 40, 213, 192, 2, 114, 41,
+ 214, 193, 1, 115, 43, 2, 116, 44, 158, 61,
+ 1, 117, 45, 2, 57, 40, 118, 46, 2, 86,
+ 20, 94, 16, 2, 87, 21, 95, 17,
+};
+
+const unsigned short Dict078KeyHashTable[] = {
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 242, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 245, 241, 241, 241, 241, 241,
+ 241, 241, 248, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 251, 241, 254, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 257, 241, 260, 241,
+ 241, 241, 241, 263, 241, 241, 266, 241, 241, 269,
+ 241, 241, 241, 241, 241, 241, 241, 241, 272, 275,
+ 241, 684, 687, 241, 241, 241, 241, 241, 241, 241,
+ 690, 241, 241, 241, 241, 241, 241, 241, 693, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 241, 696, 699, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 702, 241, 241, 241, 241,
+ 241, 241, 241, 241, 241, 241, 241, 705, 241, 241,
+ 241, 241, 241, 241, 241, 241, 708, 241, 241, 241,
+ 241, 241, 241, 241, 711, 241, 241, 241, 714, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 717, 241,
+ 722, 241, 725, 241, 241, 730, 241, 241, 733, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 736, 241,
+ 241, 241, 241, 241, 241, 241, 241, 241, 241, 739,
+ 241, 241, 742, 241, 241, 241, 241, 241, 241, 241,
+ 745, 241, 241, 241, 241, 241, 241, 241, 241, 748,
+ 241, 241, 241, 751, 241, 241, 241, 241, 241, 241,
+ 241, 241, 241, 754, 241, 241, 241, 241, 241, 241,
+ 241, 0, 1, 60, 57351, 1, 57, 25946, 1, 48,
+13101, 1, 136, 35378, 1, 127, 1538, 1, 53, 10500,
+ 1, 51, 18062, 1, 128, 154, 1, 47, 45384, 1,
+ 15, 20202, 1, 44, 55138, 204, 2, 22, 3, 22,
+ 4, 22, 5, 22, 6, 22, 10, 22, 11, 22,
+ 12, 22, 13, 22, 14, 22, 16, 22, 17, 22,
+ 18, 22, 20, 22, 21, 22, 22, 22, 24, 22,
+ 25, 22, 27, 22, 29, 22, 30, 22, 31, 22,
+ 32, 22, 33, 22, 34, 22, 35, 22, 36, 22,
+ 37, 22, 38, 22, 39, 22, 41, 22, 42, 22,
+ 43, 22, 54, 22, 55, 49006, 58, 22, 61, 22,
+ 62, 22, 63, 22, 64, 22, 65, 22, 66, 22,
+ 67, 22, 68, 22, 69, 22, 70, 22, 71, 22,
+ 72, 22, 73, 22, 74, 22, 75, 22, 76, 22,
+ 77, 22, 78, 22, 79, 22, 80, 22, 81, 22,
+ 82, 22, 83, 22, 84, 22, 85, 22, 86, 22,
+ 87, 22, 88, 22, 89, 22, 90, 22, 91, 22,
+ 92, 22, 93, 22, 94, 22, 95, 22, 96, 22,
+ 97, 22, 98, 22, 99, 22, 100, 22, 101, 22,
+ 102, 22, 103, 22, 104, 22, 105, 22, 106, 22,
+ 107, 22, 108, 22, 109, 22, 110, 22, 111, 22,
+ 112, 22, 113, 22, 114, 22, 115, 22, 116, 22,
+ 117, 22, 118, 22, 119, 22, 120, 22, 121, 22,
+ 122, 22, 123, 22, 124, 22, 125, 22, 126, 22,
+ 130, 22, 131, 22, 141, 22, 142, 22, 143, 22,
+ 144, 22, 145, 22, 146, 22, 147, 22, 148, 22,
+ 149, 22, 150, 22, 151, 22, 152, 22, 153, 22,
+ 154, 22, 155, 22, 156, 22, 157, 22, 158, 22,
+ 159, 22, 160, 22, 161, 22, 162, 22, 163, 22,
+ 164, 22, 165, 22, 166, 22, 167, 22, 168, 22,
+ 169, 22, 170, 22, 171, 22, 172, 22, 173, 22,
+ 174, 22, 175, 22, 176, 22, 177, 22, 178, 22,
+ 179, 22, 180, 22, 181, 22, 182, 22, 183, 22,
+ 184, 22, 185, 22, 186, 22, 187, 22, 188, 22,
+ 189, 22, 190, 22, 191, 22, 192, 22, 193, 22,
+ 194, 22, 195, 22, 196, 22, 197, 22, 198, 22,
+ 199, 22, 200, 22, 201, 22, 202, 22, 203, 22,
+ 204, 22, 205, 22, 206, 22, 207, 22, 208, 22,
+ 209, 22, 210, 22, 211, 22, 212, 22, 213, 22,
+ 214, 22, 215, 22, 216, 22, 217, 22, 218, 22,
+ 219, 22, 220, 22, 221, 22, 222, 22, 223, 22,
+ 224, 22, 225, 22, 226, 22, 227, 22, 228, 22,
+ 229, 22, 230, 22, 231, 22, 232, 22, 233, 22,
+ 234, 22, 235, 22, 236, 22, 237, 22, 238, 22,
+ 239, 22, 240, 22, 1, 9, 56531, 1, 56, 56626,
+ 1, 132, 47687, 1, 46, 4645, 1, 45, 43218, 1,
+ 19, 48581, 1, 0, 39324, 1, 139, 59785, 1, 134,
+13136, 1, 140, 40038, 1, 23, 59862, 2, 49, 64820,
+ 133, 33398, 1, 7, 47983, 2, 26, 15788, 40, 18866,
+ 1, 59, 9927, 1, 52, 30522, 1, 129, 38261, 1,
+ 1, 39860, 1, 138, 11078, 1, 50, 17054, 1, 28,
+ 3635, 1, 135, 42300, 2, 8, 6693, 137, 41724,
};
-vtkDICOMDictionary::Dict Dict074Data = {
+vtkDICOMDictionary::Dict Dict078Data = {
"ELSCINT1",
-208,
-208,
-Dict074TagHashTable,
-Dict074KeyHashTable,
-Dict074Contents
+241,
+241,
+Dict078TagHashTable,
+Dict078KeyHashTable,
+Dict078Contents
+};
+
+// ----- Brainlab-S9-History -----
+
+const DictEntry Dict079Contents[] = {
+{ 0x0009, 0x0031, 0, VR::SQ, VM::M1, "" },
+{ 0x0009, 0x0032, 0, VR::SQ, VM::M1, "" },
+{ 0x0009, 0x0033, 0, VR::SQ, VM::M1, "" },
+};
+
+const unsigned short Dict079TagHashTable[] = {
+ 3, 4, 7, 0, 1, 2, 51, 2, 0, 49,
+ 1, 50,
+};
+
+const unsigned short Dict079KeyHashTable[] = {
+ 3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2,
+ 1793,
+};
+
+vtkDICOMDictionary::Dict Dict079Data = {
+"Brainlab-S9-History",
+3,
+3,
+Dict079TagHashTable,
+Dict079KeyHashTable,
+Dict079Contents
};
// ----- SIEMENS IMAGE SHADOW ATTRIBUTES -----
-DictEntry Dict075Contents[] = {
+const DictEntry Dict080Contents[] = {
{ 0x0021, 0x0001, 0, VR::US, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::FD, VM::M1TN, "" },
{ 0x0021, 0x0003, 0, VR::DS, VM::M1, "" },
@@ -4405,7 +4813,7 @@ DictEntry Dict075Contents[] = {
{ 0x0021, 0x005e, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict075TagHashTable[] = {
+const unsigned short Dict080TagHashTable[] = {
53, 56, 52, 61, 66, 69, 72, 77, 52, 84,
89, 96, 101, 106, 109, 112, 115, 118, 121, 126,
129, 132, 135, 52, 52, 52, 140, 143, 146, 149,
@@ -4428,7 +4836,7 @@ unsigned short Dict075TagHashTable[] = {
69, 1, 35, 70, 1, 36, 71,
};
-unsigned short Dict075KeyHashTable[] = {
+const unsigned short Dict080KeyHashTable[] = {
52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 52, 52, 52, 52, 52,
52, 52, 52, 52, 52, 53, 52, 52, 52, 52,
@@ -4447,18 +4855,18 @@ unsigned short Dict075KeyHashTable[] = {
48, 103, 49, 103, 50, 103, 51, 103,
};
-vtkDICOMDictionary::Dict Dict075Data = {
+vtkDICOMDictionary::Dict Dict080Data = {
"SIEMENS IMAGE SHADOW ATTRIBUTES",
52,
52,
-Dict075TagHashTable,
-Dict075KeyHashTable,
-Dict075Contents
+Dict080TagHashTable,
+Dict080KeyHashTable,
+Dict080Contents
};
// ----- Harmony R1.0 -----
-DictEntry Dict076Contents[] = {
+const DictEntry Dict081Contents[] = {
{ 0x0019, 0x0000, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::US, VM::M1, "" },
@@ -4576,7 +4984,7 @@ DictEntry Dict076Contents[] = {
{ 0x0019, 0x0083, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict076TagHashTable[] = {
+const unsigned short Dict081TagHashTable[] = {
116, 121, 124, 127, 130, 133, 138, 141, 144, 149,
154, 159, 164, 169, 172, 175, 178, 181, 184, 187,
190, 193, 196, 199, 202, 205, 208, 211, 214, 217,
@@ -4624,7 +5032,7 @@ unsigned short Dict076TagHashTable[] = {
117, 1, 93, 104, 1, 94, 105, 1, 95, 106,
};
-unsigned short Dict076KeyHashTable[] = {
+const unsigned short Dict081KeyHashTable[] = {
115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
115, 115, 115, 115, 115, 115, 115, 115, 115, 115,
@@ -4662,18 +5070,18 @@ unsigned short Dict076KeyHashTable[] = {
46, 112, 46, 113, 46, 114, 46,
};
-vtkDICOMDictionary::Dict Dict076Data = {
+vtkDICOMDictionary::Dict Dict081Data = {
"Harmony R1.0",
115,
115,
-Dict076TagHashTable,
-Dict076KeyHashTable,
-Dict076Contents
+Dict081TagHashTable,
+Dict081KeyHashTable,
+Dict081Contents
};
// ----- FDMS 1.0 -----
-DictEntry Dict077Contents[] = {
+const DictEntry Dict082Contents[] = {
{ 0x0009, 0x0004, 0, VR::SH, VM::M1, "ImageControlUnit" },
{ 0x0009, 0x0005, 0, VR::OW, VM::M1, "ImageUID" },
{ 0x0009, 0x0006, 0, VR::OW, VM::M1, "RouteImageUID" },
@@ -4786,7 +5194,7 @@ DictEntry Dict077Contents[] = {
{ 0x50F1, 0x0020, 0, VR::CS, VM::M1, "ImageProcessingModificationFlag" },
};
-unsigned short Dict077TagHashTable[] = {
+const unsigned short Dict082TagHashTable[] = {
111, 114, 117, 120, 123, 126, 131, 134, 139, 144,
151, 110, 156, 163, 110, 166, 169, 172, 110, 179,
182, 187, 190, 199, 210, 215, 110, 110, 224, 227,
@@ -4829,7 +5237,7 @@ unsigned short Dict077TagHashTable[] = {
95, 68, 108, 16,
};
-unsigned short Dict077KeyHashTable[] = {
+const unsigned short Dict082KeyHashTable[] = {
110, 110, 111, 110, 110, 110, 110, 110, 110, 110,
114, 110, 110, 110, 110, 110, 110, 110, 117, 122,
125, 110, 110, 110, 128, 131, 110, 110, 136, 110,
@@ -4870,18 +5278,18 @@ unsigned short Dict077KeyHashTable[] = {
1, 106, 6441, 1, 4, 49943,
};
-vtkDICOMDictionary::Dict Dict077Data = {
+vtkDICOMDictionary::Dict Dict082Data = {
"FDMS 1.0",
110,
110,
-Dict077TagHashTable,
-Dict077KeyHashTable,
-Dict077Contents
+Dict082TagHashTable,
+Dict082KeyHashTable,
+Dict082Contents
};
// ----- SIEMENS SYNGO SOP CLASS PACKING -----
-DictEntry Dict078Contents[] = {
+const DictEntry Dict083Contents[] = {
{ 0x0031, 0x0010, 0, VR::SQ, VM::M1, "SOPClassPackingSequence" },
{ 0x0031, 0x0020, 0, VR::CS, VM::M1, "PackingVersion" },
{ 0x0031, 0x0021, 0, VR::CS, VM::M1, "PackingOriginator" },
@@ -4903,7 +5311,7 @@ DictEntry Dict078Contents[] = {
{ 0x0031, 0x0080, 0, VR::OB, VM::M1, "StreamChunk" },
};
-unsigned short Dict078TagHashTable[] = {
+const unsigned short Dict083TagHashTable[] = {
20, 23, 28, 33, 36, 39, 19, 42, 45, 50,
55, 19, 19, 19, 58, 19, 61, 64, 69, 0,
1, 4, 49, 2, 3, 48, 10, 80, 2, 6,
@@ -4914,7 +5322,7 @@ unsigned short Dict078TagHashTable[] = {
9, 65,
};
-unsigned short Dict078KeyHashTable[] = {
+const unsigned short Dict083KeyHashTable[] = {
19, 20, 25, 19, 19, 28, 35, 19, 19, 19,
40, 43, 46, 19, 49, 52, 59, 19, 62, 0,
2, 6, 59670, 14, 16357, 1, 2, 62314, 3, 5,
@@ -4924,18 +5332,18 @@ unsigned short Dict078KeyHashTable[] = {
11, 42793, 3, 1, 46226, 3, 56742, 9, 34825,
};
-vtkDICOMDictionary::Dict Dict078Data = {
+vtkDICOMDictionary::Dict Dict083Data = {
"SIEMENS SYNGO SOP CLASS PACKING",
19,
19,
-Dict078TagHashTable,
-Dict078KeyHashTable,
-Dict078Contents
+Dict083TagHashTable,
+Dict083KeyHashTable,
+Dict083Contents
};
// ----- Sound Technologies -----
-DictEntry Dict079Contents[] = {
+const DictEntry Dict084Contents[] = {
{ 0xf001, 0x0000, 0, VR::LO, VM::M1, "PatientSpecies" },
{ 0xf001, 0x0001, 0, VR::LO, VM::M1, "PatientBreed" },
{ 0xf001, 0x0002, 0, VR::LO, VM::M1, "PatientCategorySize" },
@@ -4969,7 +5377,7 @@ DictEntry Dict079Contents[] = {
{ 0xf001, 0x001e, 0, VR::LO, VM::M1, "ReceptorBitsPerPixel" },
};
-unsigned short Dict079TagHashTable[] = {
+const unsigned short Dict084TagHashTable[] = {
32, 35, 38, 41, 44, 47, 50, 53, 56, 59,
62, 65, 68, 71, 74, 77, 80, 83, 86, 89,
92, 95, 98, 101, 104, 107, 110, 31, 113, 118,
@@ -4985,7 +5393,7 @@ unsigned short Dict079TagHashTable[] = {
0, 1, 3, 3,
};
-unsigned short Dict079KeyHashTable[] = {
+const unsigned short Dict084KeyHashTable[] = {
31, 31, 32, 31, 39, 42, 31, 45, 31, 48,
51, 60, 31, 63, 66, 71, 74, 77, 80, 83,
86, 31, 93, 98, 31, 101, 104, 31, 109, 112,
@@ -5000,42 +5408,42 @@ unsigned short Dict079KeyHashTable[] = {
0, 60758, 1, 21, 8879,
};
-vtkDICOMDictionary::Dict Dict079Data = {
+vtkDICOMDictionary::Dict Dict084Data = {
"Sound Technologies",
31,
31,
-Dict079TagHashTable,
-Dict079KeyHashTable,
-Dict079Contents
+Dict084TagHashTable,
+Dict084KeyHashTable,
+Dict084Contents
};
// ----- PHILIPS XCT -Private -----
-DictEntry Dict080Contents[] = {
+const DictEntry Dict085Contents[] = {
{ 0x7051, 0x0001, 0, VR::DS, VM::M1, "AttenuationThreshold" },
{ 0x7051, 0x0002, 0, VR::DS, VM::M1, "DLPEstimate" },
};
-unsigned short Dict080TagHashTable[] = {
+const unsigned short Dict085TagHashTable[] = {
3, 6, 0, 1, 1, 2, 1, 0, 1,
};
-unsigned short Dict080KeyHashTable[] = {
+const unsigned short Dict085KeyHashTable[] = {
3, 6, 0, 1, 0, 53311, 1, 1, 62176,
};
-vtkDICOMDictionary::Dict Dict080Data = {
+vtkDICOMDictionary::Dict Dict085Data = {
"PHILIPS XCT -Private",
2,
2,
-Dict080TagHashTable,
-Dict080KeyHashTable,
-Dict080Contents
+Dict085TagHashTable,
+Dict085KeyHashTable,
+Dict085Contents
};
// ----- Siemens: Thorax/Multix FD Image Stamp -----
-DictEntry Dict081Contents[] = {
+const DictEntry Dict086Contents[] = {
{ 0x0023, 0x0000, 0, VR::US, VM::M1, "" },
{ 0x0023, 0x0001, 0, VR::US, VM::M1, "" },
{ 0x0023, 0x0002, 0, VR::US, VM::M1, "" },
@@ -5043,28 +5451,28 @@ DictEntry Dict081Contents[] = {
{ 0x0023, 0x0004, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict081TagHashTable[] = {
+const unsigned short Dict086TagHashTable[] = {
6, 5, 9, 12, 15, 0, 1, 0, 0, 1,
3, 3, 1, 2, 2, 2, 1, 1, 4, 4,
};
-unsigned short Dict081KeyHashTable[] = {
+const unsigned short Dict086KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict081Data = {
+vtkDICOMDictionary::Dict Dict086Data = {
"Siemens: Thorax/Multix FD Image Stamp",
5,
5,
-Dict081TagHashTable,
-Dict081KeyHashTable,
-Dict081Contents
+Dict086TagHashTable,
+Dict086KeyHashTable,
+Dict086Contents
};
// ----- GEMS_PARM_01 -----
-DictEntry Dict082Contents[] = {
+const DictEntry Dict087Contents[] = {
{ 0x0043, 0x0001, 0, VR::SS, VM::M1, "BitmapOfPrescanOptions" },
{ 0x0043, 0x0002, 0, VR::SS, VM::M1, "GradientOffsetInX" },
{ 0x0043, 0x0003, 0, VR::SS, VM::M1, "GradientOffsetInY" },
@@ -5219,7 +5627,7 @@ DictEntry Dict082Contents[] = {
{ 0x0043, 0x00b2, 0, VR::DS, VM::M1TN, "AdvancedEddyCorrection" },
};
-unsigned short Dict082TagHashTable[] = {
+const unsigned short Dict087TagHashTable[] = {
153, 156, 159, 162, 165, 168, 171, 174, 177, 180,
183, 186, 152, 189, 192, 195, 152, 152, 152, 152,
152, 152, 152, 152, 152, 152, 152, 152, 152, 152,
@@ -5278,7 +5686,7 @@ unsigned short Dict082TagHashTable[] = {
1, 49, 53, 1, 52, 56, 1, 53, 57,
};
-unsigned short Dict082KeyHashTable[] = {
+const unsigned short Dict087KeyHashTable[] = {
153, 156, 159, 152, 162, 165, 152, 152, 152, 168,
171, 152, 152, 174, 152, 152, 177, 182, 152, 152,
152, 185, 152, 188, 193, 198, 203, 206, 209, 152,
@@ -5337,41 +5745,41 @@ unsigned short Dict082KeyHashTable[] = {
2, 8, 8174, 135, 7544,
};
-vtkDICOMDictionary::Dict Dict082Data = {
+vtkDICOMDictionary::Dict Dict087Data = {
"GEMS_PARM_01",
152,
152,
-Dict082TagHashTable,
-Dict082KeyHashTable,
-Dict082Contents
+Dict087TagHashTable,
+Dict087KeyHashTable,
+Dict087Contents
};
// ----- MedIns HP Extensions -----
-DictEntry Dict083Contents[] = {
+const DictEntry Dict088Contents[] = {
{ 0x5473, 0x0003, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict083TagHashTable[] = {
+const unsigned short Dict088TagHashTable[] = {
2, 0, 1, 0, 3,
};
-unsigned short Dict083KeyHashTable[] = {
+const unsigned short Dict088KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict083Data = {
+vtkDICOMDictionary::Dict Dict088Data = {
"MedIns HP Extensions",
1,
1,
-Dict083TagHashTable,
-Dict083KeyHashTable,
-Dict083Contents
+Dict088TagHashTable,
+Dict088KeyHashTable,
+Dict088Contents
};
// ----- SIEMENS CM VA0 ACQU -----
-DictEntry Dict084Contents[] = {
+const DictEntry Dict089Contents[] = {
{ 0x0019, 0x0010, 0, VR::LO, VM::M1, "ParameterFileName" },
{ 0x0019, 0x0011, 0, VR::LO, VM::M1, "SequenceFileName" },
{ 0x0019, 0x0012, 0, VR::LO, VM::M1, "SequenceFileOwner" },
@@ -5379,28 +5787,28 @@ DictEntry Dict084Contents[] = {
{ 0x0019, 0x0014, 0, VR::LO, VM::M1, "EPIFileName" },
};
-unsigned short Dict084TagHashTable[] = {
+const unsigned short Dict089TagHashTable[] = {
6, 9, 5, 12, 17, 0, 1, 3, 19, 1,
2, 18, 2, 1, 17, 4, 20, 1, 0, 16,
};
-unsigned short Dict084KeyHashTable[] = {
+const unsigned short Dict089KeyHashTable[] = {
5, 6, 9, 12, 5, 0, 1, 1, 34950, 1,
3, 6208, 3, 0, 13588, 2, 2254, 4, 33901,
};
-vtkDICOMDictionary::Dict Dict084Data = {
+vtkDICOMDictionary::Dict Dict089Data = {
"SIEMENS CM VA0 ACQU",
5,
5,
-Dict084TagHashTable,
-Dict084KeyHashTable,
-Dict084Contents
+Dict089TagHashTable,
+Dict089KeyHashTable,
+Dict089Contents
};
// ----- PHILIPS MR/LAST -----
-DictEntry Dict085Contents[] = {
+const DictEntry Dict090Contents[] = {
{ 0x0019, 0x0009, 0, VR::DS, VM::M1, "MainMagneticField" },
{ 0x0019, 0x000e, 0, VR::IS, VM::M1, "FlowCompensation" },
{ 0x0019, 0x00B7, 0, VR::IS, VM::M1, "" },
@@ -5457,7 +5865,7 @@ DictEntry Dict085Contents[] = {
{ 0x6001, 0x0000, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict085TagHashTable[] = {
+const unsigned short Dict090TagHashTable[] = {
55, 60, 63, 66, 71, 54, 74, 79, 84, 89,
94, 54, 97, 102, 54, 54, 107, 112, 117, 122,
129, 54, 54, 132, 54, 135, 54, 54, 54, 54,
@@ -5480,7 +5888,7 @@ unsigned short Dict085TagHashTable[] = {
1, 32, 19, 1, 31, 18,
};
-unsigned short Dict085KeyHashTable[] = {
+const unsigned short Dict090KeyHashTable[] = {
55, 54, 58, 54, 54, 61, 54, 64, 67, 70,
73, 54, 76, 54, 54, 79, 82, 54, 54, 85,
54, 88, 54, 91, 54, 96, 54, 54, 54, 54,
@@ -5502,18 +5910,18 @@ unsigned short Dict085KeyHashTable[] = {
2, 38, 14666, 39, 7005,
};
-vtkDICOMDictionary::Dict Dict085Data = {
+vtkDICOMDictionary::Dict Dict090Data = {
"PHILIPS MR/LAST",
54,
54,
-Dict085TagHashTable,
-Dict085KeyHashTable,
-Dict085Contents
+Dict090TagHashTable,
+Dict090KeyHashTable,
+Dict090Contents
};
// ----- AEGIS_DICOM_2.00 -----
-DictEntry Dict086Contents[] = {
+const DictEntry Dict091Contents[] = {
{ 0x0003, 0x0000, 0, VR::US, VM::M1TN, "" },
{ 0x0005, 0x0000, 0, VR::US, VM::M1TN, "" },
{ 0x0009, 0x0000, 0, VR::US, VM::M1TN, "" },
@@ -5522,29 +5930,29 @@ DictEntry Dict086Contents[] = {
{ 0x1369, 0x0000, 0, VR::US, VM::M1TN, "" },
};
-unsigned short Dict086TagHashTable[] = {
+const unsigned short Dict091TagHashTable[] = {
6, 7, 6, 10, 15, 18, 0, 1, 3, 0,
2, 0, 0, 2, 0, 1, 5, 0, 2, 1,
0, 4, 0,
};
-unsigned short Dict086KeyHashTable[] = {
+const unsigned short Dict091KeyHashTable[] = {
6, 6, 6, 6, 6, 7, 0, 6, 0, 896,
1, 896, 2, 896, 3, 896, 4, 896, 5, 896,
};
-vtkDICOMDictionary::Dict Dict086Data = {
+vtkDICOMDictionary::Dict Dict091Data = {
"AEGIS_DICOM_2.00",
6,
6,
-Dict086TagHashTable,
-Dict086KeyHashTable,
-Dict086Contents
+Dict091TagHashTable,
+Dict091KeyHashTable,
+Dict091Contents
};
// ----- MeVis eD: Absolute Temporal Positions -----
-DictEntry Dict087Contents[] = {
+const DictEntry Dict092Contents[] = {
{ 0x0021, 0x0010, 0, VR::LT, VM::M1, "TimepointDateTime" },
{ 0x0021, 0x0011, 0, VR::CS, VM::M1, "TimepointDateTimeType" },
{ 0x0021, 0x0012, 0, VR::UN, VM::M1, "TimepointSeriesDescription" },
@@ -5552,28 +5960,28 @@ DictEntry Dict087Contents[] = {
{ 0x0021, 0x0071, 0, VR::UN, VM::M1, "TimepointEmptyFrames" },
};
-unsigned short Dict087TagHashTable[] = {
+const unsigned short Dict092TagHashTable[] = {
6, 9, 5, 14, 17, 0, 1, 3, 19, 2,
2, 18, 4, 113, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict087KeyHashTable[] = {
+const unsigned short Dict092KeyHashTable[] = {
6, 5, 11, 14, 5, 0, 2, 0, 20911, 1,
25769, 1, 2, 4175, 2, 3, 13689, 4, 63720,
};
-vtkDICOMDictionary::Dict Dict087Data = {
+vtkDICOMDictionary::Dict Dict092Data = {
"MeVis eD: Absolute Temporal Positions",
5,
5,
-Dict087TagHashTable,
-Dict087KeyHashTable,
-Dict087Contents
+Dict092TagHashTable,
+Dict092KeyHashTable,
+Dict092Contents
};
// ----- NQLeft -----
-DictEntry Dict088Contents[] = {
+const DictEntry Dict093Contents[] = {
{ 0x0199, 0x0001, 0, VR::FL, VM::M1, "LeftCorticalWhiteMatter" },
{ 0x0199, 0x0002, 0, VR::FL, VM::M1, "LeftCorticalGrayMatter" },
{ 0x0199, 0x0003, 0, VR::FL, VM::M1, "Left3rdVentricle" },
@@ -5634,7 +6042,7 @@ DictEntry Dict088Contents[] = {
{ 0x0199, 0x003a, 0, VR::FL, VM::M1, "LeftMeningie" },
};
-unsigned short Dict088TagHashTable[] = {
+const unsigned short Dict093TagHashTable[] = {
59, 62, 65, 68, 71, 74, 77, 80, 83, 58,
58, 58, 58, 58, 58, 86, 89, 92, 95, 98,
101, 104, 107, 110, 113, 116, 119, 122, 125, 128,
@@ -5660,7 +6068,7 @@ unsigned short Dict088TagHashTable[] = {
12, 1, 10, 11, 1, 9, 10,
};
-unsigned short Dict088KeyHashTable[] = {
+const unsigned short Dict093KeyHashTable[] = {
59, 62, 65, 70, 58, 58, 73, 58, 58, 58,
58, 78, 58, 83, 90, 58, 93, 58, 58, 58,
98, 101, 110, 58, 58, 113, 118, 121, 124, 137,
@@ -5685,18 +6093,18 @@ unsigned short Dict088KeyHashTable[] = {
27, 16416,
};
-vtkDICOMDictionary::Dict Dict088Data = {
+vtkDICOMDictionary::Dict Dict093Data = {
"NQLeft",
58,
58,
-Dict088TagHashTable,
-Dict088KeyHashTable,
-Dict088Contents
+Dict093TagHashTable,
+Dict093KeyHashTable,
+Dict093Contents
};
// ----- iCAD PK Study -----
-DictEntry Dict089Contents[] = {
+const DictEntry Dict094Contents[] = {
{ 0x3335, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x3335, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x3335, 0x0002, 0, VR::LO, VM::M1, "" },
@@ -5727,7 +6135,7 @@ DictEntry Dict089Contents[] = {
{ 0x3335, 0x001b, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict089TagHashTable[] = {
+const unsigned short Dict094TagHashTable[] = {
29, 32, 35, 38, 41, 44, 47, 50, 53, 58,
63, 68, 28, 28, 28, 28, 73, 76, 79, 82,
85, 88, 91, 94, 97, 100, 103, 106, 0, 1,
@@ -5741,7 +6149,7 @@ unsigned short Dict089TagHashTable[] = {
1, 8, 8, 1, 11, 11, 1, 10, 10,
};
-unsigned short Dict089KeyHashTable[] = {
+const unsigned short Dict094KeyHashTable[] = {
28, 28, 28, 28, 28, 29, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 0, 28,
@@ -5753,42 +6161,42 @@ unsigned short Dict089KeyHashTable[] = {
25, 192, 26, 192, 27, 192,
};
-vtkDICOMDictionary::Dict Dict089Data = {
+vtkDICOMDictionary::Dict Dict094Data = {
"iCAD PK Study",
28,
28,
-Dict089TagHashTable,
-Dict089KeyHashTable,
-Dict089Contents
+Dict094TagHashTable,
+Dict094KeyHashTable,
+Dict094Contents
};
// ----- SPI-P-Private_ICS Release 1;3 -----
-DictEntry Dict090Contents[] = {
+const DictEntry Dict095Contents[] = {
{ 0x0029, 0x0000, 0, VR::ST, VM::M1, "" },
{ 0x0029, 0x0001, 0, VR::ST, VM::M1, "" },
};
-unsigned short Dict090TagHashTable[] = {
+const unsigned short Dict095TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict090KeyHashTable[] = {
+const unsigned short Dict095KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict090Data = {
+vtkDICOMDictionary::Dict Dict095Data = {
"SPI-P-Private_ICS Release 1;3",
2,
2,
-Dict090TagHashTable,
-Dict090KeyHashTable,
-Dict090Contents
+Dict095TagHashTable,
+Dict095KeyHashTable,
+Dict095Contents
};
// ----- SPI-P-Private_ICS Release 1;2 -----
-DictEntry Dict091Contents[] = {
+const DictEntry Dict096Contents[] = {
{ 0x0029, 0x0000, 0, VR::FD, VM::M1, "" },
{ 0x0029, 0x0001, 0, VR::FD, VM::M1, "" },
{ 0x0029, 0x0002, 0, VR::FD, VM::M1, "" },
@@ -5805,7 +6213,7 @@ DictEntry Dict091Contents[] = {
{ 0x0029, 0x00d9, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict091TagHashTable[] = {
+const unsigned short Dict096TagHashTable[] = {
15, 18, 23, 28, 14, 31, 14, 14, 14, 14,
34, 37, 42, 47, 0, 1, 3, 3, 2, 2,
2, 12, 166, 2, 5, 5, 11, 165, 1, 4,
@@ -5814,7 +6222,7 @@ unsigned short Dict091TagHashTable[] = {
7, 160,
};
-unsigned short Dict091KeyHashTable[] = {
+const unsigned short Dict096KeyHashTable[] = {
14, 14, 14, 14, 14, 15, 14, 14, 14, 14,
14, 14, 14, 14, 0, 14, 0, 384, 1, 384,
2, 384, 3, 384, 4, 384, 5, 384, 6, 384,
@@ -5822,18 +6230,18 @@ unsigned short Dict091KeyHashTable[] = {
12, 384, 13, 384,
};
-vtkDICOMDictionary::Dict Dict091Data = {
+vtkDICOMDictionary::Dict Dict096Data = {
"SPI-P-Private_ICS Release 1;2",
14,
14,
-Dict091TagHashTable,
-Dict091KeyHashTable,
-Dict091Contents
+Dict096TagHashTable,
+Dict096KeyHashTable,
+Dict096Contents
};
// ----- SPI-P-Private_ICS Release 1;1 -----
-DictEntry Dict092Contents[] = {
+const DictEntry Dict097Contents[] = {
{ 0x0029, 0x0000, 0, VR::SL, VM::M1, "" },
{ 0x0029, 0x0005, 0, VR::FL, VM::M1, "" },
{ 0x0029, 0x0006, 0, VR::FL, VM::M1, "" },
@@ -5853,7 +6261,7 @@ DictEntry Dict092Contents[] = {
{ 0x0029, 0x00d6, 0, VR::ST, VM::M1, "" },
};
-unsigned short Dict092TagHashTable[] = {
+const unsigned short Dict097TagHashTable[] = {
18, 17, 17, 17, 21, 17, 17, 24, 27, 30,
35, 42, 45, 48, 55, 17, 60, 0, 1, 15,
213, 1, 7, 203, 1, 0, 0, 1, 4, 33,
@@ -5863,7 +6271,7 @@ unsigned short Dict092TagHashTable[] = {
1, 14, 212,
};
-unsigned short Dict092KeyHashTable[] = {
+const unsigned short Dict097KeyHashTable[] = {
17, 17, 17, 17, 17, 17, 17, 17, 17, 18,
17, 17, 17, 17, 17, 17, 17, 0, 17, 0,
316, 1, 316, 2, 316, 3, 316, 4, 316, 5,
@@ -5872,18 +6280,18 @@ unsigned short Dict092KeyHashTable[] = {
316, 16, 316,
};
-vtkDICOMDictionary::Dict Dict092Data = {
+vtkDICOMDictionary::Dict Dict097Data = {
"SPI-P-Private_ICS Release 1;1",
17,
17,
-Dict092TagHashTable,
-Dict092KeyHashTable,
-Dict092Contents
+Dict097TagHashTable,
+Dict097KeyHashTable,
+Dict097Contents
};
// ----- SIEMENS CT VA0 GEN -----
-DictEntry Dict093Contents[] = {
+const DictEntry Dict098Contents[] = {
{ 0x0019, 0x0010, 0, VR::DS, VM::M1, "SourceSideCollimatorAperture" },
{ 0x0019, 0x0011, 0, VR::DS, VM::M1, "DetectorSideCollimatorAperture" },
{ 0x0019, 0x0020, 0, VR::IS, VM::M1, "ExposureTime" },
@@ -5935,7 +6343,7 @@ DictEntry Dict093Contents[] = {
{ 0x0021, 0x00a7, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict093TagHashTable[] = {
+const unsigned short Dict098TagHashTable[] = {
50, 55, 49, 58, 61, 64, 67, 74, 83, 92,
95, 98, 49, 49, 103, 108, 113, 116, 49, 123,
49, 126, 49, 129, 132, 49, 49, 49, 49, 49,
@@ -5956,7 +6364,7 @@ unsigned short Dict093TagHashTable[] = {
1, 9, 69, 1, 26, 64, 1, 20, 17,
};
-unsigned short Dict093KeyHashTable[] = {
+const unsigned short Dict098KeyHashTable[] = {
50, 49, 53, 56, 61, 64, 49, 49, 49, 69,
72, 49, 49, 49, 77, 80, 49, 49, 83, 88,
91, 96, 99, 102, 105, 110, 49, 49, 113, 49,
@@ -5977,42 +6385,42 @@ unsigned short Dict093KeyHashTable[] = {
47014, 42, 29886,
};
-vtkDICOMDictionary::Dict Dict093Data = {
+vtkDICOMDictionary::Dict Dict098Data = {
"SIEMENS CT VA0 GEN",
49,
49,
-Dict093TagHashTable,
-Dict093KeyHashTable,
-Dict093Contents
+Dict098TagHashTable,
+Dict098KeyHashTable,
+Dict098Contents
};
// ----- SPI-P-Private_ICS Release 1;5 -----
-DictEntry Dict094Contents[] = {
+const DictEntry Dict099Contents[] = {
{ 0x0029, 0x0050, 0, VR::CS, VM::M1, "" },
{ 0x0029, 0x0055, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict094TagHashTable[] = {
+const unsigned short Dict099TagHashTable[] = {
3, 6, 0, 1, 0, 80, 1, 1, 85,
};
-unsigned short Dict094KeyHashTable[] = {
+const unsigned short Dict099KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict094Data = {
+vtkDICOMDictionary::Dict Dict099Data = {
"SPI-P-Private_ICS Release 1;5",
2,
2,
-Dict094TagHashTable,
-Dict094KeyHashTable,
-Dict094Contents
+Dict099TagHashTable,
+Dict099KeyHashTable,
+Dict099Contents
};
// ----- SPI-P-Private_ICS Release 1;4 -----
-DictEntry Dict095Contents[] = {
+const DictEntry Dict100Contents[] = {
{ 0x0029, 0x00d6, 0, VR::FD, VM::M1, "" },
{ 0x0029, 0x00d7, 0, VR::FD, VM::M1, "" },
{ 0x0029, 0x00d8, 0, VR::FD, VM::M1, "" },
@@ -6023,31 +6431,31 @@ DictEntry Dict095Contents[] = {
{ 0x0029, 0x00e0, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict095TagHashTable[] = {
+const unsigned short Dict100TagHashTable[] = {
9, 8, 12, 17, 20, 23, 26, 29, 0, 1,
4, 218, 2, 2, 216, 7, 224, 1, 3, 217,
1, 0, 214, 1, 1, 215, 1, 5, 220, 1,
6, 221,
};
-unsigned short Dict095KeyHashTable[] = {
+const unsigned short Dict100KeyHashTable[] = {
8, 8, 8, 8, 8, 9, 8, 8, 0, 8,
0, 672, 1, 672, 2, 672, 3, 672, 4, 672,
5, 672, 6, 672, 7, 672,
};
-vtkDICOMDictionary::Dict Dict095Data = {
+vtkDICOMDictionary::Dict Dict100Data = {
"SPI-P-Private_ICS Release 1;4",
8,
8,
-Dict095TagHashTable,
-Dict095KeyHashTable,
-Dict095Contents
+Dict100TagHashTable,
+Dict100KeyHashTable,
+Dict100Contents
};
// ----- SPI-P-GV-CT Release 1 -----
-DictEntry Dict096Contents[] = {
+const DictEntry Dict101Contents[] = {
{ 0x0009, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0020, 0, VR::LO, VM::M1, "" },
@@ -6106,7 +6514,7 @@ DictEntry Dict096Contents[] = {
{ 0x0029, 0x00d1, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict096TagHashTable[] = {
+const unsigned short Dict101TagHashTable[] = {
57, 60, 69, 74, 56, 56, 56, 56, 79, 86,
56, 93, 98, 101, 56, 56, 106, 117, 126, 131,
56, 56, 56, 140, 143, 148, 153, 158, 56, 56,
@@ -6129,7 +6537,7 @@ unsigned short Dict096TagHashTable[] = {
22, 112, 1, 38, 128,
};
-unsigned short Dict096KeyHashTable[] = {
+const unsigned short Dict101KeyHashTable[] = {
56, 56, 56, 56, 56, 57, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 56, 56, 56, 56, 56,
@@ -6149,64 +6557,64 @@ unsigned short Dict096KeyHashTable[] = {
51, 96, 52, 96, 53, 96, 54, 96, 55, 96,
};
-vtkDICOMDictionary::Dict Dict096Data = {
+vtkDICOMDictionary::Dict Dict101Data = {
"SPI-P-GV-CT Release 1",
56,
56,
-Dict096TagHashTable,
-Dict096KeyHashTable,
-Dict096Contents
+Dict101TagHashTable,
+Dict101KeyHashTable,
+Dict101Contents
};
// ----- GEMS_ADWSoft_DPO1 -----
-DictEntry Dict097Contents[] = {
+const DictEntry Dict102Contents[] = {
{ 0x0039, 0x0095, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict097TagHashTable[] = {
+const unsigned short Dict102TagHashTable[] = {
2, 0, 1, 0, 149,
};
-unsigned short Dict097KeyHashTable[] = {
+const unsigned short Dict102KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict097Data = {
+vtkDICOMDictionary::Dict Dict102Data = {
"GEMS_ADWSoft_DPO1",
1,
1,
-Dict097TagHashTable,
-Dict097KeyHashTable,
-Dict097Contents
+Dict102TagHashTable,
+Dict102KeyHashTable,
+Dict102Contents
};
// ----- PHILIPS MR R5.5/PART -----
-DictEntry Dict098Contents[] = {
+const DictEntry Dict103Contents[] = {
{ 0x0019, 0x0000, 0, VR::DS, VM::M1, "FieldOfView" },
};
-unsigned short Dict098TagHashTable[] = {
+const unsigned short Dict103TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict098KeyHashTable[] = {
+const unsigned short Dict103KeyHashTable[] = {
2, 0, 1, 0, 16313,
};
-vtkDICOMDictionary::Dict Dict098Data = {
+vtkDICOMDictionary::Dict Dict103Data = {
"PHILIPS MR R5.5/PART",
1,
1,
-Dict098TagHashTable,
-Dict098KeyHashTable,
-Dict098Contents
+Dict103TagHashTable,
+Dict103KeyHashTable,
+Dict103Contents
};
// ----- iCAD PK -----
-DictEntry Dict099Contents[] = {
+const DictEntry Dict104Contents[] = {
{ 0x3335, 0x0010, 0, VR::LO, VM::M1, "" },
{ 0x3335, 0x0015, 0, VR::LO, VM::M1, "" },
{ 0x3335, 0x0016, 0, VR::LO, VM::M1, "" },
@@ -6274,7 +6682,7 @@ DictEntry Dict099Contents[] = {
{ 0x3335, 0x00c0, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict099TagHashTable[] = {
+const unsigned short Dict104TagHashTable[] = {
66, 73, 80, 65, 65, 65, 83, 86, 91, 94,
97, 100, 103, 106, 109, 112, 115, 118, 121, 124,
127, 130, 65, 65, 65, 65, 65, 65, 65, 135,
@@ -6302,7 +6710,7 @@ unsigned short Dict099TagHashTable[] = {
113, 1, 20, 114,
};
-unsigned short Dict099KeyHashTable[] = {
+const unsigned short Dict104KeyHashTable[] = {
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
@@ -6325,18 +6733,18 @@ unsigned short Dict099KeyHashTable[] = {
82, 62, 82, 63, 82, 64, 82,
};
-vtkDICOMDictionary::Dict Dict099Data = {
+vtkDICOMDictionary::Dict Dict104Data = {
"iCAD PK",
65,
65,
-Dict099TagHashTable,
-Dict099KeyHashTable,
-Dict099Contents
+Dict104TagHashTable,
+Dict104KeyHashTable,
+Dict104Contents
};
// ----- AGFA_ADC_Compact -----
-DictEntry Dict100Contents[] = {
+const DictEntry Dict105Contents[] = {
{ 0x0019, 0x0030, 0, VR::ST, VM::M1, "SetOfDestinationTypes" },
{ 0x0019, 0x0040, 0, VR::ST, VM::M1, "SetOfDestinationIds" },
{ 0x0019, 0x0050, 0, VR::ST, VM::M1, "SetOfProcessingCodes" },
@@ -6351,7 +6759,7 @@ DictEntry Dict100Contents[] = {
{ 0x0019, 0x0095, 0, VR::CS, VM::M1, "ImageQuality" },
};
-unsigned short Dict100TagHashTable[] = {
+const unsigned short Dict105TagHashTable[] = {
13, 20, 23, 12, 26, 29, 12, 12, 32, 35,
38, 43, 0, 3, 2, 80, 3, 96, 10, 116,
1, 4, 97, 1, 5, 98, 1, 1, 64, 1,
@@ -6359,7 +6767,7 @@ unsigned short Dict100TagHashTable[] = {
114, 11, 149, 1, 9, 115,
};
-unsigned short Dict100KeyHashTable[] = {
+const unsigned short Dict105KeyHashTable[] = {
13, 16, 21, 12, 12, 24, 31, 12, 34, 37,
40, 43, 0, 1, 8, 42909, 2, 7, 13980, 11,
11564, 1, 3, 34741, 3, 2, 8609, 5, 22700, 10,
@@ -6367,18 +6775,18 @@ unsigned short Dict100KeyHashTable[] = {
1, 9, 47443, 1, 6, 23732,
};
-vtkDICOMDictionary::Dict Dict100Data = {
+vtkDICOMDictionary::Dict Dict105Data = {
"AGFA_ADC_Compact",
12,
12,
-Dict100TagHashTable,
-Dict100KeyHashTable,
-Dict100Contents
+Dict105TagHashTable,
+Dict105KeyHashTable,
+Dict105Contents
};
// ----- SIEMENS SMS-AX ACQ 1.0 -----
-DictEntry Dict101Contents[] = {
+const DictEntry Dict106Contents[] = {
{ 0x0021, 0x0000, 0, VR::US, VM::M1, "AcquisitionType" },
{ 0x0021, 0x0001, 0, VR::US, VM::M1, "AcquisitionMode" },
{ 0x0021, 0x0002, 0, VR::US, VM::M1, "FootswitchIndex" },
@@ -6472,7 +6880,7 @@ DictEntry Dict101Contents[] = {
{ 0x0021, 0x00A6, 0, VR::FD, VM::M1, "ThreeDRRIntervalTimeMeasured" },
};
-unsigned short Dict101TagHashTable[] = {
+const unsigned short Dict106TagHashTable[] = {
92, 95, 98, 101, 91, 104, 109, 114, 119, 124,
129, 134, 139, 142, 145, 91, 91, 148, 91, 91,
91, 91, 151, 154, 157, 160, 163, 168, 173, 178,
@@ -6510,7 +6918,7 @@ unsigned short Dict101TagHashTable[] = {
114,
};
-unsigned short Dict101KeyHashTable[] = {
+const unsigned short Dict106KeyHashTable[] = {
92, 95, 91, 98, 103, 91, 91, 106, 111, 91,
91, 91, 114, 91, 119, 122, 91, 91, 125, 128,
91, 133, 91, 136, 139, 91, 146, 149, 152, 91,
@@ -6547,41 +6955,41 @@ unsigned short Dict101KeyHashTable[] = {
90, 10165,
};
-vtkDICOMDictionary::Dict Dict101Data = {
+vtkDICOMDictionary::Dict Dict106Data = {
"SIEMENS SMS-AX ACQ 1.0",
91,
91,
-Dict101TagHashTable,
-Dict101KeyHashTable,
-Dict101Contents
+Dict106TagHashTable,
+Dict106KeyHashTable,
+Dict106Contents
};
// ----- SPI-P-CTBE-Private Release 1 -----
-DictEntry Dict102Contents[] = {
+const DictEntry Dict107Contents[] = {
{ 0x0021, 0x0000, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict102TagHashTable[] = {
+const unsigned short Dict107TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict102KeyHashTable[] = {
+const unsigned short Dict107KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict102Data = {
+vtkDICOMDictionary::Dict Dict107Data = {
"SPI-P-CTBE-Private Release 1",
1,
1,
-Dict102TagHashTable,
-Dict102KeyHashTable,
-Dict102Contents
+Dict107TagHashTable,
+Dict107KeyHashTable,
+Dict107Contents
};
// ----- SIEMENS SYNGO VOLUME -----
-DictEntry Dict103Contents[] = {
+const DictEntry Dict108Contents[] = {
{ 0x0029, 0x0012, 0, VR::US, VM::M1, "Slices" },
{ 0x0029, 0x0014, 0, VR::OB, VM::M1, "VolumeHistogram" },
{ 0x0029, 0x0018, 0, VR::IS, VM::M1, "VolumeLevel" },
@@ -6595,7 +7003,7 @@ DictEntry Dict103Contents[] = {
{ 0x0029, 0x0047, 0, VR::OB, VM::M1, "VolumeHistogramData" },
};
-unsigned short Dict103TagHashTable[] = {
+const unsigned short Dict108TagHashTable[] = {
12, 15, 11, 18, 21, 24, 31, 34, 37, 40,
11, 0, 1, 9, 70, 1, 10, 71, 1, 3,
48, 1, 0, 18, 3, 2, 24, 4, 50, 6,
@@ -6603,7 +7011,7 @@ unsigned short Dict103TagHashTable[] = {
1, 8, 68,
};
-unsigned short Dict103KeyHashTable[] = {
+const unsigned short Dict108KeyHashTable[] = {
11, 12, 15, 20, 23, 26, 29, 32, 11, 35,
40, 0, 1, 0, 4789, 2, 1, 59707, 5, 17396,
1, 10, 10630, 1, 6, 13799, 1, 9, 1256, 1,
@@ -6611,18 +7019,18 @@ unsigned short Dict103KeyHashTable[] = {
1, 7, 30644,
};
-vtkDICOMDictionary::Dict Dict103Data = {
+vtkDICOMDictionary::Dict Dict108Data = {
"SIEMENS SYNGO VOLUME",
11,
11,
-Dict103TagHashTable,
-Dict103KeyHashTable,
-Dict103Contents
+Dict108TagHashTable,
+Dict108KeyHashTable,
+Dict108Contents
};
// ----- Applicare/RadWorks/Version 6.0 -----
-DictEntry Dict104Contents[] = {
+const DictEntry Dict109Contents[] = {
{ 0x4103, 0x0001, 0, VR::AT, VM::M1TN, "NonExistentTags" },
{ 0x4103, 0x0002, 0, VR::UI, VM::M1TN, "NonExistentObjects" },
{ 0x4105, 0x0001, 0, VR::CS, VM::M1, "AnnotationType" },
@@ -6643,7 +7051,7 @@ DictEntry Dict104Contents[] = {
{ 0x4107, 0x0001, 0, VR::SQ, VM::M1, "RequestedPaletteColorLUT" },
};
-unsigned short Dict104TagHashTable[] = {
+const unsigned short Dict109TagHashTable[] = {
18, 19, 18, 22, 25, 18, 28, 33, 36, 39,
44, 49, 52, 55, 58, 61, 64, 67, 0, 1,
15, 14, 1, 16, 16, 1, 2, 1, 2, 4,
@@ -6653,7 +7061,7 @@ unsigned short Dict104TagHashTable[] = {
11, 1, 11, 10, 1, 14, 13, 1, 13, 12,
};
-unsigned short Dict104KeyHashTable[] = {
+const unsigned short Dict109KeyHashTable[] = {
18, 19, 18, 22, 25, 28, 31, 36, 39, 42,
45, 50, 18, 55, 58, 18, 18, 63, 0, 1,
7, 42844, 1, 13, 28566, 1, 9, 57638, 1, 12,
@@ -6663,23 +7071,26 @@ unsigned short Dict104KeyHashTable[] = {
60586, 8, 10865, 2, 6, 36303, 16, 298,
};
-vtkDICOMDictionary::Dict Dict104Data = {
+vtkDICOMDictionary::Dict Dict109Data = {
"Applicare/RadWorks/Version 6.0",
18,
18,
-Dict104TagHashTable,
-Dict104KeyHashTable,
-Dict104Contents
+Dict109TagHashTable,
+Dict109KeyHashTable,
+Dict109Contents
};
// ----- SIEMENS MED SP DXMG WH AWS 1 -----
-DictEntry Dict105Contents[] = {
+const DictEntry Dict110Contents[] = {
{ 0x0019, 0x0001, 0, VR::UL, VM::M1TN, "AECCoordinates" },
{ 0x0019, 0x0002, 0, VR::US, VM::M2, "AECCoordinatesSize" },
{ 0x0019, 0x0010, 0, VR::ST, VM::M1, "DerivationDescription" },
{ 0x0041, 0x0002, 0, VR::SH, VM::M1, "ReasonForTheRequestedProcedure" },
{ 0x0051, 0x0010, 0, VR::DS, VM::M1, "" },
+{ 0x0051, 0x0020, 0, VR::DS, VM::M1TN, "" },
+{ 0x0051, 0x0021, 0, VR::LO, VM::M1, "" },
+{ 0x0051, 0x0032, 0, VR::DS, VM::M3, "" },
{ 0x0051, 0x0037, 0, VR::DS, VM::M6, "" },
{ 0x0051, 0x0050, 0, VR::UI, VM::M1, "" },
{ 0x0051, 0x0060, 0, VR::DS, VM::M1, "PrimaryPositionerScanArc" },
@@ -6691,58 +7102,61 @@ DictEntry Dict105Contents[] = {
{ 0x0055, 0x0001, 0, VR::LO, VM::M1, "ProjectionViewDisplayString" },
};
-unsigned short Dict105TagHashTable[] = {
- 14, 15, 14, 14, 14, 20, 23, 26, 29, 34,
- 39, 46, 14, 49, 0, 2, 6, 80, 13, 1,
- 1, 5, 55, 1, 8, 97, 1, 7, 96, 2,
- 4, 16, 10, 99, 2, 2, 16, 9, 98, 3,
- 0, 1, 3, 2, 12, 101, 1, 11, 100, 1,
- 1, 2,
+const unsigned short Dict110TagHashTable[] = {
+ 18, 23, 30, 17, 17, 17, 17, 33, 17, 36,
+ 39, 44, 17, 47, 52, 55, 60, 0, 2, 12,
+ 98, 16, 1, 3, 8, 55, 9, 80, 15, 101,
+ 1, 14, 100, 1, 0, 1, 1, 2, 16, 2,
+ 1, 2, 5, 32, 1, 6, 33, 2, 4, 16,
+ 7, 50, 1, 11, 97, 2, 3, 2, 10, 96,
+ 1, 13, 99,
};
-unsigned short Dict105KeyHashTable[] = {
- 15, 20, 14, 23, 26, 33, 14, 14, 14, 14,
- 42, 14, 47, 14, 0, 2, 2, 11785, 8, 40534,
- 1, 10, 58671, 1, 0, 32133, 3, 1, 64000, 11,
-22717, 13, 709, 4, 4, 384, 5, 384, 6, 384,
- 9, 25667, 2, 7, 33413, 12, 52822, 1, 3, 45982,
+const unsigned short Dict110KeyHashTable[] = {
+ 18, 17, 17, 23, 28, 31, 34, 17, 17, 37,
+ 17, 52, 55, 17, 58, 17, 17, 0, 2, 10,
+15952, 16, 58410, 2, 0, 61158, 12, 44268, 1, 14,
+10998, 1, 15, 58921, 1, 11, 60366, 7, 2, 25125,
+ 4, 316, 5, 316, 6, 316, 7, 316, 8, 316,
+ 9, 316, 1, 1, 21865, 1, 13, 5911, 1, 3,
+10882,
};
-vtkDICOMDictionary::Dict Dict105Data = {
+vtkDICOMDictionary::Dict Dict110Data = {
"SIEMENS MED SP DXMG WH AWS 1",
-14,
-14,
-Dict105TagHashTable,
-Dict105KeyHashTable,
-Dict105Contents
+17,
+17,
+Dict110TagHashTable,
+Dict110KeyHashTable,
+Dict110Contents
};
// ----- SIEMENS MR PS 04 -----
-DictEntry Dict106Contents[] = {
+const DictEntry Dict111Contents[] = {
{ 0x0021, 0x0001, 0, VR::FD, VM::M1TN, "" },
};
-unsigned short Dict106TagHashTable[] = {
+const unsigned short Dict111TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict106KeyHashTable[] = {
+const unsigned short Dict111KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict106Data = {
+vtkDICOMDictionary::Dict Dict111Data = {
"SIEMENS MR PS 04",
1,
1,
-Dict106TagHashTable,
-Dict106KeyHashTable,
-Dict106Contents
+Dict111TagHashTable,
+Dict111KeyHashTable,
+Dict111Contents
};
// ----- GEMS_Ultrasound_MovieGroup_001 -----
-DictEntry Dict107Contents[] = {
+const DictEntry Dict112Contents[] = {
{ 0x7fe1, 0x0001, 0, VR::SQ, VM::M1, "" },
{ 0x7fe1, 0x0002, 0, VR::LO, VM::M1, "" },
{ 0x7fe1, 0x0003, 0, VR::UL, VM::M1, "" },
@@ -6788,7 +7202,7 @@ DictEntry Dict107Contents[] = {
{ 0x7fe1, 0x0088, 0, VR::FD, VM::M1, "" },
};
-unsigned short Dict107TagHashTable[] = {
+const unsigned short Dict112TagHashTable[] = {
43, 43, 44, 47, 52, 43, 57, 60, 43, 65,
43, 43, 68, 43, 43, 43, 43, 43, 73, 76,
79, 82, 85, 43, 88, 91, 96, 99, 102, 107,
@@ -6807,7 +7221,7 @@ unsigned short Dict107TagHashTable[] = {
15, 60, 20, 82, 1, 19, 81, 1, 14, 58,
};
-unsigned short Dict107KeyHashTable[] = {
+const unsigned short Dict112KeyHashTable[] = {
43, 43, 43, 43, 43, 43, 44, 43, 43, 43,
43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
@@ -6824,18 +7238,18 @@ unsigned short Dict107KeyHashTable[] = {
125,
};
-vtkDICOMDictionary::Dict Dict107Data = {
+vtkDICOMDictionary::Dict Dict112Data = {
"GEMS_Ultrasound_MovieGroup_001",
43,
43,
-Dict107TagHashTable,
-Dict107KeyHashTable,
-Dict107Contents
+Dict112TagHashTable,
+Dict112KeyHashTable,
+Dict112Contents
};
// ----- CARESTREAM IMAGE INFORMATION -----
-DictEntry Dict108Contents[] = {
+const DictEntry Dict113Contents[] = {
{ 0x0029, 0x0015, 0, VR::LO, VM::M1, "" },
{ 0x0029, 0x0016, 0, VR::LO, VM::M1, "" },
{ 0x0029, 0x0017, 0, VR::LO, VM::M1, "" },
@@ -6845,30 +7259,30 @@ DictEntry Dict108Contents[] = {
{ 0x0029, 0x001b, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict108TagHashTable[] = {
+const unsigned short Dict113TagHashTable[] = {
8, 13, 16, 7, 19, 7, 22, 0, 2, 1,
22, 3, 24, 1, 6, 27, 1, 5, 26, 1,
0, 21, 2, 2, 23, 4, 25,
};
-unsigned short Dict108KeyHashTable[] = {
+const unsigned short Dict113KeyHashTable[] = {
7, 7, 7, 7, 7, 8, 7, 0, 7, 0,
768, 1, 768, 2, 768, 3, 768, 4, 768, 5,
768, 6, 768,
};
-vtkDICOMDictionary::Dict Dict108Data = {
+vtkDICOMDictionary::Dict Dict113Data = {
"CARESTREAM IMAGE INFORMATION",
7,
7,
-Dict108TagHashTable,
-Dict108KeyHashTable,
-Dict108Contents
+Dict113TagHashTable,
+Dict113KeyHashTable,
+Dict113Contents
};
// ----- GEMS_DL_STUDY_01 -----
-DictEntry Dict109Contents[] = {
+const DictEntry Dict114Contents[] = {
{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "StudyDose" },
{ 0x0015, 0x0081, 0, VR::DS, VM::M1, "StudyTotalDap" },
{ 0x0015, 0x0082, 0, VR::DS, VM::M1, "FluoroDoseAreaProduct" },
@@ -6896,7 +7310,7 @@ DictEntry Dict109Contents[] = {
{ 0x0015, 0x009d, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict109TagHashTable[] = {
+const unsigned short Dict114TagHashTable[] = {
26, 29, 32, 35, 40, 43, 46, 51, 56, 61,
25, 25, 25, 64, 67, 70, 73, 76, 79, 25,
82, 85, 88, 91, 94, 0, 1, 1, 129, 1,
@@ -6909,7 +7323,7 @@ unsigned short Dict109TagHashTable[] = {
132, 1, 3, 131, 1, 2, 130,
};
-unsigned short Dict109KeyHashTable[] = {
+const unsigned short Dict114KeyHashTable[] = {
25, 25, 26, 25, 31, 36, 39, 25, 25, 25,
25, 25, 68, 25, 25, 25, 71, 76, 25, 79,
82, 25, 25, 25, 25, 0, 2, 0, 7999, 8,
@@ -6921,18 +7335,18 @@ unsigned short Dict109KeyHashTable[] = {
2, 47198, 1, 3, 31344,
};
-vtkDICOMDictionary::Dict Dict109Data = {
+vtkDICOMDictionary::Dict Dict114Data = {
"GEMS_DL_STUDY_01",
25,
25,
-Dict109TagHashTable,
-Dict109KeyHashTable,
-Dict109Contents
+Dict114TagHashTable,
+Dict114KeyHashTable,
+Dict114Contents
};
// ----- Silhouette VRS 3.0 -----
-DictEntry Dict110Contents[] = {
+const DictEntry Dict115Contents[] = {
{ 0x0029, 0x0013, 0, VR::UN, VM::M1, "" },
{ 0x0029, 0x0014, 0, VR::UN, VM::M1, "" },
{ 0x0029, 0x0017, 0, VR::UN, VM::M1, "" },
@@ -6952,7 +7366,7 @@ DictEntry Dict110Contents[] = {
{ 0x0029, 0x0036, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict110TagHashTable[] = {
+const unsigned short Dict115TagHashTable[] = {
18, 21, 26, 17, 29, 17, 17, 32, 35, 17,
38, 43, 48, 17, 51, 58, 61, 0, 1, 5,
26, 2, 8, 29, 11, 40, 1, 7, 28, 1,
@@ -6962,7 +7376,7 @@ unsigned short Dict110TagHashTable[] = {
24, 1, 6, 27,
};
-unsigned short Dict110KeyHashTable[] = {
+const unsigned short Dict115KeyHashTable[] = {
17, 17, 17, 17, 17, 17, 17, 17, 17, 18,
17, 17, 17, 17, 17, 17, 17, 0, 17, 0,
316, 1, 316, 2, 316, 3, 316, 4, 316, 5,
@@ -6971,18 +7385,18 @@ unsigned short Dict110KeyHashTable[] = {
316, 16, 316,
};
-vtkDICOMDictionary::Dict Dict110Data = {
+vtkDICOMDictionary::Dict Dict115Data = {
"Silhouette VRS 3.0",
17,
17,
-Dict110TagHashTable,
-Dict110KeyHashTable,
-Dict110Contents
+Dict115TagHashTable,
+Dict115KeyHashTable,
+Dict115Contents
};
// ----- GEMS_HELIOS_01 -----
-DictEntry Dict111Contents[] = {
+const DictEntry Dict116Contents[] = {
{ 0x0045, 0x0001, 0, VR::SS, VM::M1, "NumberOfMacroRowsInDetector" },
{ 0x0045, 0x0002, 0, VR::FL, VM::M1, "MacroWidthAtISOCenter" },
{ 0x0045, 0x0003, 0, VR::SS, VM::M1, "DASType" },
@@ -7023,7 +7437,7 @@ DictEntry Dict111Contents[] = {
{ 0x0045, 0x0045, 0, VR::ST, VM::M1, "CardiacScanOptions" },
};
-unsigned short Dict111TagHashTable[] = {
+const unsigned short Dict116TagHashTable[] = {
39, 46, 53, 58, 63, 68, 73, 76, 79, 82,
87, 92, 38, 97, 38, 38, 100, 38, 38, 38,
38, 38, 38, 38, 38, 103, 106, 111, 114, 117,
@@ -7041,7 +7455,7 @@ unsigned short Dict111TagHashTable[] = {
15,
};
-unsigned short Dict111KeyHashTable[] = {
+const unsigned short Dict116KeyHashTable[] = {
39, 38, 38, 38, 44, 38, 38, 53, 58, 38,
38, 38, 61, 38, 64, 69, 74, 79, 38, 84,
38, 87, 38, 90, 38, 38, 93, 96, 99, 38,
@@ -7058,18 +7472,18 @@ unsigned short Dict111KeyHashTable[] = {
34, 31006, 1, 10, 65035,
};
-vtkDICOMDictionary::Dict Dict111Data = {
+vtkDICOMDictionary::Dict Dict116Data = {
"GEMS_HELIOS_01",
38,
38,
-Dict111TagHashTable,
-Dict111KeyHashTable,
-Dict111Contents
+Dict116TagHashTable,
+Dict116KeyHashTable,
+Dict116Contents
};
// ----- Kodak Image Information -----
-DictEntry Dict112Contents[] = {
+const DictEntry Dict117Contents[] = {
{ 0x0029, 0x0015, 0, VR::LO, VM::M1, "" },
{ 0x0029, 0x0016, 0, VR::LO, VM::M1, "" },
{ 0x0029, 0x0017, 0, VR::LO, VM::M1, "" },
@@ -7078,29 +7492,29 @@ DictEntry Dict112Contents[] = {
{ 0x0029, 0x001a, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict112TagHashTable[] = {
+const unsigned short Dict117TagHashTable[] = {
7, 12, 15, 18, 6, 6, 0, 2, 0, 21,
4, 25, 1, 3, 24, 1, 2, 23, 2, 1,
22, 5, 26,
};
-unsigned short Dict112KeyHashTable[] = {
+const unsigned short Dict117KeyHashTable[] = {
6, 6, 6, 6, 6, 7, 0, 6, 0, 896,
1, 896, 2, 896, 3, 896, 4, 896, 5, 896,
};
-vtkDICOMDictionary::Dict Dict112Data = {
+vtkDICOMDictionary::Dict Dict117Data = {
"Kodak Image Information",
6,
6,
-Dict112TagHashTable,
-Dict112KeyHashTable,
-Dict112Contents
+Dict117TagHashTable,
+Dict117KeyHashTable,
+Dict117Contents
};
// ----- QUASAR_INTERNAL_USE -----
-DictEntry Dict113Contents[] = {
+const DictEntry Dict118Contents[] = {
{ 0x0009, 0x0001, 0, VR::UL, VM::M1TN, "RateVector" },
{ 0x0009, 0x0002, 0, VR::UL, VM::M1TN, "CountVector" },
{ 0x0009, 0x0003, 0, VR::UL, VM::M1TN, "TimeVector" },
@@ -7145,7 +7559,7 @@ DictEntry Dict113Contents[] = {
{ 0x0041, 0x0001, 0, VR::UT, VM::M1, "" },
};
-unsigned short Dict113TagHashTable[] = {
+const unsigned short Dict118TagHashTable[] = {
43, 46, 51, 42, 42, 42, 56, 59, 62, 42,
65, 68, 42, 42, 71, 42, 74, 77, 80, 85,
88, 42, 91, 94, 99, 102, 105, 110, 115, 120,
@@ -7164,7 +7578,7 @@ unsigned short Dict113TagHashTable[] = {
28, 16, 39, 144, 1, 40, 146,
};
-unsigned short Dict113KeyHashTable[] = {
+const unsigned short Dict118KeyHashTable[] = {
42, 43, 42, 42, 42, 46, 42, 99, 102, 107,
42, 42, 42, 42, 114, 119, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 124, 42, 42,
@@ -7181,41 +7595,41 @@ unsigned short Dict113KeyHashTable[] = {
1, 9, 8070, 1, 11, 5450, 1, 3, 63967,
};
-vtkDICOMDictionary::Dict Dict113Data = {
+vtkDICOMDictionary::Dict Dict118Data = {
"QUASAR_INTERNAL_USE",
42,
42,
-Dict113TagHashTable,
-Dict113KeyHashTable,
-Dict113Contents
+Dict118TagHashTable,
+Dict118KeyHashTable,
+Dict118Contents
};
// ----- VEPRO BROKER 1.0 -----
-DictEntry Dict114Contents[] = {
+const DictEntry Dict119Contents[] = {
{ 0x0057, 0x0010, 0, VR::SQ, VM::M1, "DataReplaceSequence" },
};
-unsigned short Dict114TagHashTable[] = {
+const unsigned short Dict119TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict114KeyHashTable[] = {
+const unsigned short Dict119KeyHashTable[] = {
2, 0, 1, 0, 61012,
};
-vtkDICOMDictionary::Dict Dict114Data = {
+vtkDICOMDictionary::Dict Dict119Data = {
"VEPRO BROKER 1.0",
1,
1,
-Dict114TagHashTable,
-Dict114KeyHashTable,
-Dict114Contents
+Dict119TagHashTable,
+Dict119KeyHashTable,
+Dict119Contents
};
// ----- SIEMENS CT VA0 COAD -----
-DictEntry Dict115Contents[] = {
+const DictEntry Dict120Contents[] = {
{ 0x0019, 0x0010, 0, VR::IS, VM::M1, "DistanceSourceToSourceSideCollimator" },
{ 0x0019, 0x0011, 0, VR::IS, VM::M1, "DistanceSourceToDetectorSideCollimator" },
{ 0x0019, 0x0020, 0, VR::IS, VM::M1, "NumberOfPossibleChannels" },
@@ -7267,7 +7681,7 @@ DictEntry Dict115Contents[] = {
{ 0x0019, 0x00c5, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict115TagHashTable[] = {
+const unsigned short Dict120TagHashTable[] = {
49, 49, 49, 49, 49, 49, 50, 55, 60, 67,
72, 49, 75, 49, 49, 49, 49, 78, 81, 84,
87, 90, 93, 98, 103, 106, 109, 112, 119, 122,
@@ -7289,7 +7703,7 @@ unsigned short Dict115TagHashTable[] = {
1, 21, 148,
};
-unsigned short Dict115KeyHashTable[] = {
+const unsigned short Dict120KeyHashTable[] = {
49, 49, 50, 53, 49, 56, 59, 49, 49, 62,
49, 49, 49, 65, 49, 49, 68, 75, 49, 49,
80, 49, 83, 86, 91, 49, 49, 49, 94, 49,
@@ -7309,152 +7723,193 @@ unsigned short Dict115KeyHashTable[] = {
16906, 2, 4, 42439, 22, 57762, 1, 40, 62864,
};
-vtkDICOMDictionary::Dict Dict115Data = {
+vtkDICOMDictionary::Dict Dict120Data = {
"SIEMENS CT VA0 COAD",
49,
49,
-Dict115TagHashTable,
-Dict115KeyHashTable,
-Dict115Contents
+Dict120TagHashTable,
+Dict120KeyHashTable,
+Dict120Contents
};
// ----- PHILIPS MR -----
-DictEntry Dict116Contents[] = {
+const DictEntry Dict121Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "SPIRelease" },
{ 0x0009, 0x0012, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict116TagHashTable[] = {
+const unsigned short Dict121TagHashTable[] = {
2, 3, 0, 2, 0, 16, 1, 18,
};
-unsigned short Dict116KeyHashTable[] = {
+const unsigned short Dict121KeyHashTable[] = {
3, 6, 0, 1, 0, 59817, 1, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict116Data = {
+vtkDICOMDictionary::Dict Dict121Data = {
"PHILIPS MR",
2,
2,
-Dict116TagHashTable,
-Dict116KeyHashTable,
-Dict116Contents
+Dict121TagHashTable,
+Dict121KeyHashTable,
+Dict121Contents
};
// ----- MeVis BreastCare -----
-DictEntry Dict117Contents[] = {
+const DictEntry Dict122Contents[] = {
{ 0x0019, 0x0001, 0, VR::LO, VM::M1, "AnnotationVersion" },
{ 0x0071, 0x0001, 0, VR::LO, VM::M1, "XMLFormattedTextValue" },
};
-unsigned short Dict117TagHashTable[] = {
+const unsigned short Dict122TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 1,
};
-unsigned short Dict117KeyHashTable[] = {
+const unsigned short Dict122KeyHashTable[] = {
3, 2, 0, 2, 0, 6835, 1, 62111,
};
-vtkDICOMDictionary::Dict Dict117Data = {
+vtkDICOMDictionary::Dict Dict122Data = {
"MeVis BreastCare",
2,
2,
-Dict117TagHashTable,
-Dict117KeyHashTable,
-Dict117Contents
+Dict122TagHashTable,
+Dict122KeyHashTable,
+Dict122Contents
+};
+
+// ----- GEMS_MR_RAW_01 -----
+
+const DictEntry Dict123Contents[] = {
+{ 0x7001, 0x1001, 0, VR::OB, VM::M1, "Rdb_hdr_rec" },
+{ 0x7001, 0x1002, 0, VR::OB, VM::M1, "Rdb_hdr_per_pass_tab" },
+{ 0x7001, 0x1003, 0, VR::OB, VM::M1, "Rdb_hdr_unlock_raw" },
+{ 0x7001, 0x1004, 0, VR::OB, VM::M1, "Rdb_hdr_data_acq_tab" },
+{ 0x7001, 0x1005, 0, VR::OB, VM::M1, "Rdb_hdr_nex_tab" },
+{ 0x7001, 0x1006, 0, VR::OB, VM::M1, "Rdb_hdr_nex_abort_tab" },
+{ 0x7001, 0x1007, 0, VR::OB, VM::M1, "Rdb_hdr_tool" },
+{ 0x7001, 0x1008, 0, VR::OB, VM::M1, "Rdb_raw_data" },
+{ 0x7001, 0x1009, 0, VR::OB, VM::M1, "SSPSave" },
+{ 0x7001, 0x100A, 0, VR::OB, VM::M1, "UDASave" },
+{ 0x7001, 0x100B, 0, VR::OB, VM::M1, "Rdb_chemsat_data" },
+};
+
+const unsigned short Dict123TagHashTable[] = {
+ 12, 15, 11, 20, 23, 26, 29, 32, 35, 38,
+ 41, 0, 1, 10, 4107, 2, 0, 4097, 9, 4106,
+ 1, 2, 4099, 1, 1, 4098, 1, 4, 4101, 1,
+ 3, 4100, 1, 6, 4103, 1, 5, 4102, 1, 8,
+ 4105, 1, 7, 4104,
+};
+
+const unsigned short Dict123KeyHashTable[] = {
+ 11, 11, 11, 12, 15, 20, 25, 28, 31, 36,
+ 39, 0, 1, 3, 23886, 2, 0, 7693, 9, 11838,
+ 2, 5, 37924, 6, 11222, 1, 2, 46296, 1, 10,
+11129, 2, 4, 38678, 8, 1958, 1, 7, 19522, 1,
+ 1, 12326,
+};
+
+vtkDICOMDictionary::Dict Dict123Data = {
+"GEMS_MR_RAW_01",
+11,
+11,
+Dict123TagHashTable,
+Dict123KeyHashTable,
+Dict123Contents
};
// ----- VEPRO VIF 3.0 DATA -----
-DictEntry Dict118Contents[] = {
+const DictEntry Dict124Contents[] = {
{ 0x0055, 0x0020, 0, VR::OB, VM::M1, "" },
{ 0x0055, 0x0030, 0, VR::OB, VM::M1, "IconData" },
{ 0x0055, 0x0065, 0, VR::OB, VM::M1, "ImageHashValue" },
};
-unsigned short Dict118TagHashTable[] = {
+const unsigned short Dict124TagHashTable[] = {
4, 7, 10, 0, 1, 2, 101, 1, 1, 48,
1, 0, 32,
};
-unsigned short Dict118KeyHashTable[] = {
+const unsigned short Dict124KeyHashTable[] = {
4, 3, 7, 0, 1, 2, 33635, 2, 0, 1793,
1, 56642,
};
-vtkDICOMDictionary::Dict Dict118Data = {
+vtkDICOMDictionary::Dict Dict124Data = {
"VEPRO VIF 3.0 DATA",
3,
3,
-Dict118TagHashTable,
-Dict118KeyHashTable,
-Dict118Contents
+Dict124TagHashTable,
+Dict124KeyHashTable,
+Dict124Contents
};
// ----- MeVis eatDicom -----
-DictEntry Dict119Contents[] = {
+const DictEntry Dict125Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "eatDicomVersion" },
{ 0x0009, 0x0011, 0, VR::ST, VM::M1, "eatDicomOptions" },
};
-unsigned short Dict119TagHashTable[] = {
+const unsigned short Dict125TagHashTable[] = {
3, 6, 0, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict119KeyHashTable[] = {
+const unsigned short Dict125KeyHashTable[] = {
2, 3, 0, 2, 0, 24984, 1, 21435,
};
-vtkDICOMDictionary::Dict Dict119Data = {
+vtkDICOMDictionary::Dict Dict125Data = {
"MeVis eatDicom",
2,
2,
-Dict119TagHashTable,
-Dict119KeyHashTable,
-Dict119Contents
+Dict125TagHashTable,
+Dict125KeyHashTable,
+Dict125Contents
};
// ----- DIGISCAN IMAGE -----
-DictEntry Dict120Contents[] = {
+const DictEntry Dict126Contents[] = {
{ 0x0029, 0x0031, 0, VR::US, VM::M1TN, "" },
{ 0x0029, 0x0032, 0, VR::US, VM::M1TN, "" },
{ 0x0029, 0x0033, 0, VR::LO, VM::M1, "" },
{ 0x0029, 0x0034, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict120TagHashTable[] = {
+const unsigned short Dict126TagHashTable[] = {
5, 8, 11, 14, 0, 1, 0, 49, 1, 3,
52, 1, 2, 51, 1, 1, 50,
};
-unsigned short Dict120KeyHashTable[] = {
+const unsigned short Dict126KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict120Data = {
+vtkDICOMDictionary::Dict Dict126Data = {
"DIGISCAN IMAGE",
4,
4,
-Dict120TagHashTable,
-Dict120KeyHashTable,
-Dict120Contents
+Dict126TagHashTable,
+Dict126KeyHashTable,
+Dict126Contents
};
// ----- MITRA OBJECT UTF8 ATTRIBUTES 1.0 -----
-DictEntry Dict121Contents[] = {
-{ 0x0033, 0x0002, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "" },
-{ 0x0033, 0x0006, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x0008, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x000a, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "" },
-{ 0x0033, 0x000e, 0, VR::OB, VM::M1, "" },
+const DictEntry Dict127Contents[] = {
+{ 0x0033, 0x0002, 0, VR::PN, VM::M1, "PatientNameUTF8Encoded" },
+{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "StudyDescriptionUTF8Encoded" },
+{ 0x0033, 0x0006, 0, VR::PN, VM::M1, "ReferringPhysicianNameUTF8Encoded" },
+{ 0x0033, 0x0008, 0, VR::PN, VM::M1, "RequestingPhysicianNameUTF8Encoded" },
+{ 0x0033, 0x000a, 0, VR::PN, VM::M1, "PerformingPhysicianNameUTF8Encoded" },
+{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "ReasonForStudyUTF8Encoded" },
+{ 0x0033, 0x000e, 0, VR::LO, VM::M1, "StudyCommentsUTF8Encoded" },
{ 0x0033, 0x0013, 0, VR::PN, VM::M1, "" },
{ 0x0033, 0x0014, 0, VR::OB, VM::M1, "" },
{ 0x0033, 0x0015, 0, VR::OB, VM::M1, "" },
@@ -7462,7 +7917,7 @@ DictEntry Dict121Contents[] = {
{ 0x0033, 0x0019, 0, VR::PN, VM::M1, "" },
};
-unsigned short Dict121TagHashTable[] = {
+const unsigned short Dict127TagHashTable[] = {
12, 13, 20, 23, 12, 28, 31, 34, 37, 40,
12, 43, 0, 3, 0, 2, 6, 14, 10, 22,
1, 9, 21, 2, 5, 12, 8, 20, 1, 2,
@@ -7470,49 +7925,50 @@ unsigned short Dict121TagHashTable[] = {
1, 4, 10, 1, 3, 8,
};
-unsigned short Dict121KeyHashTable[] = {
- 12, 12, 12, 12, 12, 13, 12, 12, 12, 12,
- 12, 12, 0, 12, 0, 448, 1, 448, 2, 448,
- 3, 448, 4, 448, 5, 448, 6, 448, 7, 448,
- 8, 448, 9, 448, 10, 448, 11, 448,
+const unsigned short Dict127KeyHashTable[] = {
+ 13, 16, 19, 12, 12, 22, 33, 36, 39, 12,
+ 12, 42, 0, 1, 4, 22592, 1, 6, 57109, 1,
+ 5, 52851, 5, 7, 448, 8, 448, 9, 448, 10,
+ 448, 11, 448, 1, 3, 2102, 1, 1, 45511, 1,
+ 0, 33809, 1, 2, 23768,
};
-vtkDICOMDictionary::Dict Dict121Data = {
+vtkDICOMDictionary::Dict Dict127Data = {
"MITRA OBJECT UTF8 ATTRIBUTES 1.0",
12,
12,
-Dict121TagHashTable,
-Dict121KeyHashTable,
-Dict121Contents
+Dict127TagHashTable,
+Dict127KeyHashTable,
+Dict127Contents
};
// ----- GEMS_Ultrasound_ExamGroup_001 -----
-DictEntry Dict122Contents[] = {
+const DictEntry Dict128Contents[] = {
{ 0x6005, 0x0010, 0, VR::UT, VM::M1, "" },
{ 0x6005, 0x0020, 0, VR::UT, VM::M1, "" },
};
-unsigned short Dict122TagHashTable[] = {
+const unsigned short Dict128TagHashTable[] = {
2, 3, 0, 2, 0, 16, 1, 32,
};
-unsigned short Dict122KeyHashTable[] = {
+const unsigned short Dict128KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict122Data = {
+vtkDICOMDictionary::Dict Dict128Data = {
"GEMS_Ultrasound_ExamGroup_001",
2,
2,
-Dict122TagHashTable,
-Dict122KeyHashTable,
-Dict122Contents
+Dict128TagHashTable,
+Dict128KeyHashTable,
+Dict128Contents
};
// ----- VEPRO BROKER 1.0 DATA REPLACE -----
-DictEntry Dict123Contents[] = {
+const DictEntry Dict129Contents[] = {
{ 0x0057, 0x0020, 0, VR::SQ, VM::M1, "OriginalDataSequence" },
{ 0x0057, 0x0030, 0, VR::SQ, VM::M1, "ReplacedDataSequence" },
{ 0x0057, 0x0040, 0, VR::DA, VM::M1, "DateOfDataReplacement" },
@@ -7522,81 +7978,81 @@ DictEntry Dict123Contents[] = {
{ 0x0057, 0x0044, 0, VR::LO, VM::M1, "ComputerName" },
};
-unsigned short Dict123TagHashTable[] = {
+const unsigned short Dict129TagHashTable[] = {
8, 11, 14, 7, 17, 20, 23, 0, 1, 4,
66, 1, 3, 65, 1, 2, 64, 1, 1, 48,
1, 6, 68, 2, 0, 32, 5, 67,
};
-unsigned short Dict123KeyHashTable[] = {
+const unsigned short Dict129KeyHashTable[] = {
8, 7, 11, 14, 17, 22, 25, 0, 1, 0,
58411, 1, 6, 30261, 1, 4, 44241, 2, 2, 5234,
3, 17497, 1, 1, 24725, 1, 5, 10092,
};
-vtkDICOMDictionary::Dict Dict123Data = {
+vtkDICOMDictionary::Dict Dict129Data = {
"VEPRO BROKER 1.0 DATA REPLACE",
7,
7,
-Dict123TagHashTable,
-Dict123KeyHashTable,
-Dict123Contents
+Dict129TagHashTable,
+Dict129KeyHashTable,
+Dict129Contents
};
// ----- PHILIPS-MR-1 -----
-DictEntry Dict124Contents[] = {
+const DictEntry Dict130Contents[] = {
{ 0x0019, 0x0011, 0, VR::IS, VM::M1, "ChemicalShiftNumber" },
{ 0x0019, 0x0012, 0, VR::IS, VM::M1, "PhaseNumber" },
{ 0x0021, 0x0001, 0, VR::IS, VM::M1, "ReconstructionNumber" },
{ 0x0021, 0x0002, 0, VR::IS, VM::M1, "SliceNumber" },
};
-unsigned short Dict124TagHashTable[] = {
+const unsigned short Dict130TagHashTable[] = {
5, 4, 4, 10, 0, 2, 0, 17, 2, 1,
2, 1, 18, 3, 2,
};
-unsigned short Dict124KeyHashTable[] = {
+const unsigned short Dict130KeyHashTable[] = {
5, 4, 8, 13, 0, 1, 2, 1804, 2, 0,
57880, 3, 7303, 1, 1, 29943,
};
-vtkDICOMDictionary::Dict Dict124Data = {
+vtkDICOMDictionary::Dict Dict130Data = {
"PHILIPS-MR-1",
4,
4,
-Dict124TagHashTable,
-Dict124KeyHashTable,
-Dict124Contents
+Dict130TagHashTable,
+Dict130KeyHashTable,
+Dict130Contents
};
// ----- MERGE TECHNOLOGIES, INC. -----
-DictEntry Dict125Contents[] = {
+const DictEntry Dict131Contents[] = {
{ 0x0009, 0x0000, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict125TagHashTable[] = {
+const unsigned short Dict131TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict125KeyHashTable[] = {
+const unsigned short Dict131KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict125Data = {
+vtkDICOMDictionary::Dict Dict131Data = {
"MERGE TECHNOLOGIES, INC.",
1,
1,
-Dict125TagHashTable,
-Dict125KeyHashTable,
-Dict125Contents
+Dict131TagHashTable,
+Dict131KeyHashTable,
+Dict131Contents
};
// ----- SIEMENS DLR.01 -----
-DictEntry Dict126Contents[] = {
+const DictEntry Dict132Contents[] = {
{ 0x0019, 0x0010, 0, VR::LO, VM::M1, "MeasurementMode" },
{ 0x0019, 0x0011, 0, VR::LO, VM::M1, "ImageType" },
{ 0x0019, 0x0015, 0, VR::LO, VM::M1, "SoftwareVersion" },
@@ -7643,7 +8099,7 @@ DictEntry Dict126Contents[] = {
{ 0x0041, 0x0031, 0, VR::LO, VM::M1, "FullFilmFormat" },
};
-unsigned short Dict126TagHashTable[] = {
+const unsigned short Dict132TagHashTable[] = {
45, 48, 51, 44, 44, 54, 44, 57, 60, 65,
68, 71, 74, 79, 82, 85, 88, 93, 98, 101,
44, 104, 107, 110, 113, 118, 44, 44, 123, 126,
@@ -7663,7 +8119,7 @@ unsigned short Dict126TagHashTable[] = {
103, 1, 13, 49, 1, 12, 48, 1, 14, 50,
};
-unsigned short Dict126KeyHashTable[] = {
+const unsigned short Dict132KeyHashTable[] = {
44, 45, 44, 50, 55, 58, 44, 44, 44, 61,
44, 44, 44, 68, 81, 44, 88, 95, 98, 44,
103, 44, 106, 111, 44, 114, 117, 120, 123, 126,
@@ -7682,18 +8138,18 @@ unsigned short Dict126KeyHashTable[] = {
1, 3, 36627, 1, 8, 41394, 1, 26, 4098,
};
-vtkDICOMDictionary::Dict Dict126Data = {
+vtkDICOMDictionary::Dict Dict132Data = {
"SIEMENS DLR.01",
44,
44,
-Dict126TagHashTable,
-Dict126KeyHashTable,
-Dict126Contents
+Dict132TagHashTable,
+Dict132KeyHashTable,
+Dict132Contents
};
// ----- Agfa ADC NX -----
-DictEntry Dict127Contents[] = {
+const DictEntry Dict133Contents[] = {
{ 0x0019, 0x0007, 0, VR::CS, VM::M1, "" },
{ 0x0019, 0x0009, 0, VR::SQ, VM::M1, "" },
{ 0x0019, 0x0021, 0, VR::FL, VM::M1, "" },
@@ -7713,7 +8169,7 @@ DictEntry Dict127Contents[] = {
{ 0x0019, 0x00fe, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict127TagHashTable[] = {
+const unsigned short Dict133TagHashTable[] = {
18, 21, 17, 24, 17, 27, 17, 32, 17, 35,
38, 41, 44, 47, 52, 55, 60, 0, 1, 8,
244, 1, 9, 245, 1, 13, 250, 2, 2, 33,
@@ -7723,7 +8179,7 @@ unsigned short Dict127TagHashTable[] = {
2, 1, 9, 11, 247,
};
-unsigned short Dict127KeyHashTable[] = {
+const unsigned short Dict133KeyHashTable[] = {
18, 17, 17, 21, 17, 24, 17, 17, 17, 27,
17, 17, 17, 46, 49, 52, 57, 0, 1, 8,
58476, 1, 11, 50881, 1, 9, 49224, 9, 0, 316,
@@ -7732,42 +8188,42 @@ unsigned short Dict127KeyHashTable[] = {
5, 58475, 2, 6, 58475, 10, 41319, 1, 7, 58475,
};
-vtkDICOMDictionary::Dict Dict127Data = {
+vtkDICOMDictionary::Dict Dict133Data = {
"Agfa ADC NX",
17,
17,
-Dict127TagHashTable,
-Dict127KeyHashTable,
-Dict127Contents
+Dict133TagHashTable,
+Dict133KeyHashTable,
+Dict133Contents
};
// ----- Imaging Dynamics Company Ltd. -----
-DictEntry Dict128Contents[] = {
+const DictEntry Dict134Contents[] = {
{ 0x4321, 0x0042, 0, VR::US, VM::M1, "" },
{ 0x4321, 0x0064, 0, VR::LO, VM::M1, "PODMode" },
};
-unsigned short Dict128TagHashTable[] = {
+const unsigned short Dict134TagHashTable[] = {
3, 2, 0, 2, 0, 66, 1, 100,
};
-unsigned short Dict128KeyHashTable[] = {
+const unsigned short Dict134KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 25126,
};
-vtkDICOMDictionary::Dict Dict128Data = {
+vtkDICOMDictionary::Dict Dict134Data = {
"Imaging Dynamics Company Ltd.",
2,
2,
-Dict128TagHashTable,
-Dict128KeyHashTable,
-Dict128Contents
+Dict134TagHashTable,
+Dict134KeyHashTable,
+Dict134Contents
};
// ----- SIEMENS DFR.01 ORIGINAL -----
-DictEntry Dict129Contents[] = {
+const DictEntry Dict135Contents[] = {
{ 0x0017, 0x0011, 0, VR::US, VM::M1, "" },
{ 0x0017, 0x0012, 0, VR::US, VM::M1, "" },
{ 0x0017, 0x0014, 0, VR::US, VM::M1, "" },
@@ -7813,7 +8269,7 @@ DictEntry Dict129Contents[] = {
{ 0x0017, 0x00c2, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict129TagHashTable[] = {
+const unsigned short Dict135TagHashTable[] = {
43, 44, 49, 52, 55, 58, 63, 70, 73, 78,
85, 88, 91, 43, 94, 97, 43, 102, 105, 43,
43, 43, 108, 111, 43, 114, 43, 43, 119, 43,
@@ -7832,7 +8288,7 @@ unsigned short Dict129TagHashTable[] = {
23, 69, 1, 41, 193, 2, 21, 67, 42, 194,
};
-unsigned short Dict129KeyHashTable[] = {
+const unsigned short Dict135KeyHashTable[] = {
43, 43, 43, 43, 43, 43, 44, 43, 43, 43,
43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
43, 43, 43, 43, 43, 43, 43, 43, 43, 43,
@@ -7849,18 +8305,18 @@ unsigned short Dict129KeyHashTable[] = {
125,
};
-vtkDICOMDictionary::Dict Dict129Data = {
+vtkDICOMDictionary::Dict Dict135Data = {
"SIEMENS DFR.01 ORIGINAL",
43,
43,
-Dict129TagHashTable,
-Dict129KeyHashTable,
-Dict129Contents
+Dict135TagHashTable,
+Dict135KeyHashTable,
+Dict135Contents
};
// ----- NQHeader -----
-DictEntry Dict130Contents[] = {
+const DictEntry Dict136Contents[] = {
{ 0x0099, 0x0001, 0, VR::UI, VM::M1, "Version" },
{ 0x0099, 0x0002, 0, VR::UI, VM::M1, "AnalyzedSeriesUID" },
{ 0x0099, 0x0003, 0, VR::LT, VM::M1, "License" },
@@ -7871,31 +8327,31 @@ DictEntry Dict130Contents[] = {
{ 0x0099, 0x0021, 0, VR::FL, VM::M1, "ICV" },
};
-unsigned short Dict130TagHashTable[] = {
+const unsigned short Dict136TagHashTable[] = {
9, 12, 15, 20, 8, 8, 25, 28, 0, 1,
2, 3, 1, 1, 2, 2, 0, 1, 7, 33,
2, 5, 16, 6, 32, 1, 4, 5, 1, 3,
4,
};
-unsigned short Dict130KeyHashTable[] = {
+const unsigned short Dict136KeyHashTable[] = {
9, 8, 16, 21, 8, 8, 8, 26, 0, 3,
2, 513, 3, 36268, 6, 59479, 2, 1, 13509, 4,
12345, 2, 0, 6789, 5, 11919, 1, 7, 65100,
};
-vtkDICOMDictionary::Dict Dict130Data = {
+vtkDICOMDictionary::Dict Dict136Data = {
"NQHeader",
8,
8,
-Dict130TagHashTable,
-Dict130KeyHashTable,
-Dict130Contents
+Dict136TagHashTable,
+Dict136KeyHashTable,
+Dict136Contents
};
// ----- SIEMENS CT APPL PRESENTATION -----
-DictEntry Dict131Contents[] = {
+const DictEntry Dict137Contents[] = {
{ 0x0029, 0x0000, 0, VR::US, VM::M1, "TranslucentMode" },
{ 0x0029, 0x0001, 0, VR::FD, VM::M1, "TranslucentWindowSize" },
{ 0x0029, 0x0002, 0, VR::US, VM::M1, "PanoramicMode" },
@@ -7909,7 +8365,7 @@ DictEntry Dict131Contents[] = {
{ 0x0029, 0x0010, 0, VR::US, VM::M1, "KernelFilter" },
};
-unsigned short Dict131TagHashTable[] = {
+const unsigned short Dict137TagHashTable[] = {
12, 17, 20, 25, 11, 11, 11, 28, 31, 34,
37, 0, 2, 5, 5, 8, 8, 1, 4, 4,
2, 7, 7, 10, 16, 1, 6, 6, 1, 1,
@@ -7917,48 +8373,48 @@ unsigned short Dict131TagHashTable[] = {
9, 9,
};
-unsigned short Dict131KeyHashTable[] = {
+const unsigned short Dict137KeyHashTable[] = {
11, 12, 17, 11, 20, 11, 11, 11, 25, 34,
37, 0, 2, 6, 57280, 8, 4794, 1, 0, 40913,
2, 3, 15109, 10, 34552, 4, 1, 489, 2, 3604,
5, 30722, 7, 49656, 1, 4, 55748, 1, 9, 43036,
};
-vtkDICOMDictionary::Dict Dict131Data = {
+vtkDICOMDictionary::Dict Dict137Data = {
"SIEMENS CT APPL PRESENTATION",
11,
11,
-Dict131TagHashTable,
-Dict131KeyHashTable,
-Dict131Contents
+Dict137TagHashTable,
+Dict137KeyHashTable,
+Dict137Contents
};
// ----- SIEMENS SYNGO PRINT SERVICE -----
-DictEntry Dict132Contents[] = {
+const DictEntry Dict138Contents[] = {
{ 0x0029, 0x0010, 0, VR::IS, VM::M1, "SheetNumber" },
};
-unsigned short Dict132TagHashTable[] = {
+const unsigned short Dict138TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict132KeyHashTable[] = {
+const unsigned short Dict138KeyHashTable[] = {
2, 0, 1, 0, 41639,
};
-vtkDICOMDictionary::Dict Dict132Data = {
+vtkDICOMDictionary::Dict Dict138Data = {
"SIEMENS SYNGO PRINT SERVICE",
1,
1,
-Dict132TagHashTable,
-Dict132KeyHashTable,
-Dict132Contents
+Dict138TagHashTable,
+Dict138KeyHashTable,
+Dict138Contents
};
// ----- Siemens: Thorax/Multix FD Raw Image Settings -----
-DictEntry Dict133Contents[] = {
+const DictEntry Dict139Contents[] = {
{ 0x0025, 0x0000, 0, VR::SS, VM::M1, "RawImageAmplification" },
{ 0x0025, 0x0001, 0, VR::SS, VM::M1, "GammaLUT" },
{ 0x0025, 0x0002, 0, VR::US, VM::M1, "" },
@@ -7999,7 +8455,7 @@ DictEntry Dict133Contents[] = {
{ 0x0025, 0x0037, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict133TagHashTable[] = {
+const unsigned short Dict139TagHashTable[] = {
39, 42, 45, 48, 51, 54, 57, 60, 63, 66,
69, 72, 75, 78, 81, 84, 87, 92, 97, 102,
107, 110, 113, 118, 123, 126, 38, 38, 38, 38,
@@ -8017,7 +8473,7 @@ unsigned short Dict133TagHashTable[] = {
6, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict133KeyHashTable[] = {
+const unsigned short Dict139KeyHashTable[] = {
38, 38, 38, 38, 38, 38, 38, 39, 38, 38,
38, 42, 45, 38, 48, 51, 38, 38, 54, 38,
38, 59, 38, 66, 38, 105, 38, 38, 38, 110,
@@ -8033,42 +8489,42 @@ unsigned short Dict133KeyHashTable[] = {
34, 16771, 1, 28, 19197, 2, 10, 26273, 13, 6170,
};
-vtkDICOMDictionary::Dict Dict133Data = {
+vtkDICOMDictionary::Dict Dict139Data = {
"Siemens: Thorax/Multix FD Raw Image Settings",
38,
38,
-Dict133TagHashTable,
-Dict133KeyHashTable,
-Dict133Contents
+Dict139TagHashTable,
+Dict139KeyHashTable,
+Dict139Contents
};
// ----- SIEMENS CT VA0 ORI -----
-DictEntry Dict134Contents[] = {
+const DictEntry Dict140Contents[] = {
{ 0x0009, 0x0020, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0030, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict134TagHashTable[] = {
+const unsigned short Dict140TagHashTable[] = {
2, 3, 0, 2, 0, 32, 1, 48,
};
-unsigned short Dict134KeyHashTable[] = {
+const unsigned short Dict140KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict134Data = {
+vtkDICOMDictionary::Dict Dict140Data = {
"SIEMENS CT VA0 ORI",
2,
2,
-Dict134TagHashTable,
-Dict134KeyHashTable,
-Dict134Contents
+Dict140TagHashTable,
+Dict140KeyHashTable,
+Dict140Contents
};
// ----- Philips X-ray Imaging DD 001 -----
-DictEntry Dict135Contents[] = {
+const DictEntry Dict141Contents[] = {
{ 0x2003, 0x0000, 0, VR::CS, VM::M1, "" },
{ 0x2003, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x2003, 0x0002, 0, VR::FD, VM::M3, "" },
@@ -8102,7 +8558,7 @@ DictEntry Dict135Contents[] = {
{ 0x2003, 0x0032, 0, VR::UI, VM::M1, "" },
};
-unsigned short Dict135TagHashTable[] = {
+const unsigned short Dict141TagHashTable[] = {
32, 37, 42, 45, 48, 31, 31, 51, 54, 31,
31, 31, 57, 60, 63, 68, 31, 71, 76, 79,
82, 85, 88, 93, 96, 31, 99, 102, 105, 110,
@@ -8117,7 +8573,7 @@ unsigned short Dict135TagHashTable[] = {
1, 8, 18, 2, 7, 17, 30, 50,
};
-unsigned short Dict135KeyHashTable[] = {
+const unsigned short Dict141KeyHashTable[] = {
31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
31, 31, 31, 31, 31, 31, 31, 31, 32, 31,
31, 31, 31, 31, 31, 31, 31, 31, 31, 31,
@@ -8130,18 +8586,18 @@ unsigned short Dict135KeyHashTable[] = {
173, 29, 173, 30, 173,
};
-vtkDICOMDictionary::Dict Dict135Data = {
+vtkDICOMDictionary::Dict Dict141Data = {
"Philips X-ray Imaging DD 001",
31,
31,
-Dict135TagHashTable,
-Dict135KeyHashTable,
-Dict135Contents
+Dict141TagHashTable,
+Dict141KeyHashTable,
+Dict141Contents
};
// ----- SIEMENS SMS-AX VIEW 1.0 -----
-DictEntry Dict136Contents[] = {
+const DictEntry Dict142Contents[] = {
{ 0x0019, 0x0000, 0, VR::US, VM::M1, "ReviewMode" },
{ 0x0019, 0x0001, 0, VR::US, VM::M1, "AnatomicalBackgroundPercent" },
{ 0x0019, 0x0002, 0, VR::US, VM::M1, "NumberOfPhases" },
@@ -8176,7 +8632,7 @@ DictEntry Dict136Contents[] = {
{ 0x0019, 0x0042, 0, VR::SL, VM::M2, "DispayedAreaBottomRightHandCorner" },
};
-unsigned short Dict136TagHashTable[] = {
+const unsigned short Dict142TagHashTable[] = {
32, 32, 33, 36, 39, 42, 45, 48, 51, 54,
57, 60, 63, 66, 69, 72, 75, 78, 81, 84,
87, 90, 93, 96, 99, 102, 107, 112, 115, 118,
@@ -8192,7 +8648,7 @@ unsigned short Dict136TagHashTable[] = {
4, 1, 7, 7, 1, 6, 6,
};
-unsigned short Dict136KeyHashTable[] = {
+const unsigned short Dict142KeyHashTable[] = {
32, 33, 32, 36, 39, 44, 47, 50, 53, 32,
56, 32, 61, 64, 67, 70, 32, 32, 73, 78,
83, 32, 86, 91, 32, 32, 32, 100, 103, 110,
@@ -8207,96 +8663,96 @@ unsigned short Dict136KeyHashTable[] = {
1, 20, 21703, 2, 5, 20548, 12, 57634,
};
-vtkDICOMDictionary::Dict Dict136Data = {
+vtkDICOMDictionary::Dict Dict142Data = {
"SIEMENS SMS-AX VIEW 1.0",
32,
32,
-Dict136TagHashTable,
-Dict136KeyHashTable,
-Dict136Contents
+Dict142TagHashTable,
+Dict142KeyHashTable,
+Dict142Contents
};
// ----- SPI-P-Private_CDS Release 1 -----
-DictEntry Dict137Contents[] = {
+const DictEntry Dict143Contents[] = {
{ 0x0021, 0x0040, 0, VR::IS, VM::M1, "" },
{ 0x0029, 0x0000, 0, VR::UN, VM::M1, "" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict137TagHashTable[] = {
+const unsigned short Dict143TagHashTable[] = {
4, 3, 9, 0, 2, 0, 64, 2, 16, 1,
1, 0,
};
-unsigned short Dict137KeyHashTable[] = {
+const unsigned short Dict143KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2,
1793,
};
-vtkDICOMDictionary::Dict Dict137Data = {
+vtkDICOMDictionary::Dict Dict143Data = {
"SPI-P-Private_CDS Release 1",
3,
3,
-Dict137TagHashTable,
-Dict137KeyHashTable,
-Dict137Contents
+Dict143TagHashTable,
+Dict143KeyHashTable,
+Dict143Contents
};
// ----- astm.org/diconde/iod/NdeCtImage -----
-DictEntry Dict138Contents[] = {
+const DictEntry Dict144Contents[] = {
{ 0x0009, 0x0002, 0, VR::IS, VM::M1, "LINACEnergy" },
{ 0x0009, 0x0004, 0, VR::IS, VM::M1, "LINACOutput" },
};
-unsigned short Dict138TagHashTable[] = {
+const unsigned short Dict144TagHashTable[] = {
2, 3, 0, 2, 0, 2, 1, 4,
};
-unsigned short Dict138KeyHashTable[] = {
+const unsigned short Dict144KeyHashTable[] = {
3, 6, 0, 1, 0, 5547, 1, 1, 20494,
};
-vtkDICOMDictionary::Dict Dict138Data = {
+vtkDICOMDictionary::Dict Dict144Data = {
"astm.org/diconde/iod/NdeCtImage",
2,
2,
-Dict138TagHashTable,
-Dict138KeyHashTable,
-Dict138Contents
+Dict144TagHashTable,
+Dict144KeyHashTable,
+Dict144Contents
};
// ----- SIEMENS SYNGO TIME POINT SERVICE -----
-DictEntry Dict139Contents[] = {
+const DictEntry Dict145Contents[] = {
{ 0x0029, 0x0001, 0, VR::LO, VM::M1, "TimePointID" },
{ 0x0029, 0x0002, 0, VR::LO, VM::M1, "TimePointInformation" },
{ 0x0029, 0x0050, 0, VR::SQ, VM::M1, "StudiesinTimePointSequence" },
};
-unsigned short Dict139TagHashTable[] = {
+const unsigned short Dict145TagHashTable[] = {
4, 7, 3, 0, 1, 2, 80, 2, 0, 1,
1, 2,
};
-unsigned short Dict139KeyHashTable[] = {
+const unsigned short Dict145KeyHashTable[] = {
3, 4, 7, 0, 1, 0, 17902, 2, 1, 4630,
2, 57039,
};
-vtkDICOMDictionary::Dict Dict139Data = {
+vtkDICOMDictionary::Dict Dict145Data = {
"SIEMENS SYNGO TIME POINT SERVICE",
3,
3,
-Dict139TagHashTable,
-Dict139KeyHashTable,
-Dict139Contents
+Dict145TagHashTable,
+Dict145KeyHashTable,
+Dict145Contents
};
// ----- Silhouette Line V1.0 -----
-DictEntry Dict140Contents[] = {
+const DictEntry Dict146Contents[] = {
{ 0x0029, 0x0011, 0, VR::IS, VM::M1, "LineName" },
{ 0x0029, 0x0012, 0, VR::LT, VM::M1, "LineNameFont" },
{ 0x0029, 0x0013, 0, VR::UL, VM::M1, "LineNameDisplay" },
@@ -8318,7 +8774,7 @@ DictEntry Dict140Contents[] = {
{ 0x0029, 0x0029, 0, VR::UL, VM::M1, "LineDontSave" },
};
-unsigned short Dict140TagHashTable[] = {
+const unsigned short Dict146TagHashTable[] = {
20, 23, 28, 31, 34, 37, 40, 19, 43, 46,
49, 54, 59, 62, 65, 68, 19, 19, 71, 0,
1, 18, 41, 2, 2, 19, 17, 40, 1, 1,
@@ -8329,7 +8785,7 @@ unsigned short Dict140TagHashTable[] = {
38, 1, 0, 17,
};
-unsigned short Dict140KeyHashTable[] = {
+const unsigned short Dict146KeyHashTable[] = {
19, 20, 19, 19, 29, 32, 19, 19, 35, 40,
47, 50, 53, 19, 19, 60, 63, 66, 19, 0,
4, 8, 50265, 11, 56860, 14, 53126, 16, 22638, 1,
@@ -8339,18 +8795,18 @@ unsigned short Dict140KeyHashTable[] = {
1, 1, 44530, 1, 2, 16316, 1, 17, 19604,
};
-vtkDICOMDictionary::Dict Dict140Data = {
+vtkDICOMDictionary::Dict Dict146Data = {
"Silhouette Line V1.0",
19,
19,
-Dict140TagHashTable,
-Dict140KeyHashTable,
-Dict140Contents
+Dict146TagHashTable,
+Dict146KeyHashTable,
+Dict146Contents
};
// ----- BrainLAB_BeamProfile -----
-DictEntry Dict141Contents[] = {
+const DictEntry Dict147Contents[] = {
{ 0x3411, 0x0001, 0, VR::SQ, VM::M1, "BeamProfileSequence" },
{ 0x3411, 0x0002, 0, VR::IS, VM::M1, "BeamProfileNumber" },
{ 0x3411, 0x0003, 0, VR::SQ, VM::M1, "BeamParameterSequence" },
@@ -8359,30 +8815,30 @@ DictEntry Dict141Contents[] = {
{ 0x3411, 0x0006, 0, VR::IS, VM::M1, "ReferencedBeamProfileNumber" },
};
-unsigned short Dict141TagHashTable[] = {
+const unsigned short Dict147TagHashTable[] = {
7, 10, 13, 16, 19, 22, 0, 1, 2, 3,
1, 1, 2, 1, 4, 5, 1, 3, 4, 1,
0, 1, 1, 5, 6,
};
-unsigned short Dict141KeyHashTable[] = {
+const unsigned short Dict147KeyHashTable[] = {
7, 12, 15, 6, 20, 6, 0, 2, 0, 57638,
3, 30167, 1, 5, 42433, 2, 2, 5395, 4, 42837,
1, 1, 52792,
};
-vtkDICOMDictionary::Dict Dict141Data = {
+vtkDICOMDictionary::Dict Dict147Data = {
"BrainLAB_BeamProfile",
6,
6,
-Dict141TagHashTable,
-Dict141KeyHashTable,
-Dict141Contents
+Dict147TagHashTable,
+Dict147KeyHashTable,
+Dict147Contents
};
// ----- astm.org/diconde/iod/NdeDxCalibrationData -----
-DictEntry Dict142Contents[] = {
+const DictEntry Dict148Contents[] = {
{ 0x0009, 0x0040, 0, VR::SQ, VM::M1, "DarkCurrentSequence" },
{ 0x0009, 0x0050, 0, VR::OW, VM::M1, "DarkCurrentCounts" },
{ 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" },
@@ -8398,7 +8854,7 @@ DictEntry Dict142Contents[] = {
{ 0x0009, 0x0099, 0, VR::LT, VM::M1, "CalibrationNotes" },
};
-unsigned short Dict142TagHashTable[] = {
+const unsigned short Dict148TagHashTable[] = {
14, 13, 13, 17, 22, 25, 28, 31, 36, 39,
44, 13, 13, 0, 1, 2, 96, 2, 3, 112,
12, 153, 1, 4, 113, 1, 5, 114, 1, 6,
@@ -8406,7 +8862,7 @@ unsigned short Dict142TagHashTable[] = {
9, 118, 11, 128, 2, 1, 80, 10, 119,
};
-unsigned short Dict142KeyHashTable[] = {
+const unsigned short Dict148KeyHashTable[] = {
14, 19, 22, 13, 25, 30, 35, 13, 38, 43,
13, 13, 13, 0, 2, 7, 25645, 11, 50357, 1,
3, 29772, 1, 0, 24037, 2, 2, 48192, 5, 8278,
@@ -8414,18 +8870,18 @@ unsigned short Dict142KeyHashTable[] = {
9334, 10, 7464, 2, 4, 53052, 9, 5902,
};
-vtkDICOMDictionary::Dict Dict142Data = {
+vtkDICOMDictionary::Dict Dict148Data = {
"astm.org/diconde/iod/NdeDxCalibrationData",
13,
13,
-Dict142TagHashTable,
-Dict142KeyHashTable,
-Dict142Contents
+Dict148TagHashTable,
+Dict148KeyHashTable,
+Dict148Contents
};
// ----- GEMS_XELPRV_01 -----
-DictEntry Dict143Contents[] = {
+const DictEntry Dict149Contents[] = {
{ 0x0033, 0x0008, 0, VR::CS, VM::M1, "" },
{ 0x0033, 0x0010, 0, VR::SL, VM::M1, "" },
{ 0x0033, 0x0011, 0, VR::LO, VM::M1, "" },
@@ -8449,7 +8905,7 @@ DictEntry Dict143Contents[] = {
{ 0x0033, 0x0072, 0, VR::UI, VM::M1, "" },
};
-unsigned short Dict143TagHashTable[] = {
+const unsigned short Dict149TagHashTable[] = {
22, 25, 30, 35, 40, 45, 21, 21, 21, 21,
21, 21, 21, 48, 51, 54, 57, 62, 67, 70,
75, 0, 1, 6, 25, 2, 5, 24, 20, 114,
@@ -8460,7 +8916,7 @@ unsigned short Dict143TagHashTable[] = {
2, 8, 27, 13, 32, 1, 7, 26,
};
-unsigned short Dict143KeyHashTable[] = {
+const unsigned short Dict149KeyHashTable[] = {
21, 21, 21, 21, 21, 22, 21, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 0, 21, 0, 256, 1, 256, 2, 256, 3,
@@ -8470,18 +8926,18 @@ unsigned short Dict143KeyHashTable[] = {
256, 19, 256, 20, 256,
};
-vtkDICOMDictionary::Dict Dict143Data = {
+vtkDICOMDictionary::Dict Dict149Data = {
"GEMS_XELPRV_01",
21,
21,
-Dict143TagHashTable,
-Dict143KeyHashTable,
-Dict143Contents
+Dict149TagHashTable,
+Dict149KeyHashTable,
+Dict149Contents
};
// ----- AgilityOverlay -----
-DictEntry Dict144Contents[] = {
+const DictEntry Dict150Contents[] = {
{ 0x0071, 0x0001, 0, VR::ST, VM::M1, "" },
{ 0x0071, 0x0002, 0, VR::ST, VM::M1, "" },
{ 0x0071, 0x0003, 0, VR::ST, VM::M1, "" },
@@ -8524,7 +8980,7 @@ DictEntry Dict144Contents[] = {
{ 0x0071, 0x0060, 0, VR::FD, VM::M1, "" },
};
-unsigned short Dict144TagHashTable[] = {
+const unsigned short Dict150TagHashTable[] = {
41, 46, 49, 56, 59, 62, 40, 40, 40, 40,
40, 40, 65, 68, 71, 40, 74, 77, 82, 85,
88, 91, 94, 97, 100, 103, 40, 106, 109, 112,
@@ -8543,7 +8999,7 @@ unsigned short Dict144TagHashTable[] = {
86,
};
-unsigned short Dict144KeyHashTable[] = {
+const unsigned short Dict150KeyHashTable[] = {
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
40, 41, 40, 40, 40, 40, 40, 40, 40, 40,
@@ -8559,18 +9015,18 @@ unsigned short Dict144KeyHashTable[] = {
39, 134,
};
-vtkDICOMDictionary::Dict Dict144Data = {
+vtkDICOMDictionary::Dict Dict150Data = {
"AgilityOverlay",
40,
40,
-Dict144TagHashTable,
-Dict144KeyHashTable,
-Dict144Contents
+Dict150TagHashTable,
+Dict150KeyHashTable,
+Dict150Contents
};
// ----- VEPRO VIM 5.0 DATA -----
-DictEntry Dict145Contents[] = {
+const DictEntry Dict151Contents[] = {
{ 0x0055, 0x0010, 0, VR::OB, VM::M1, "" },
{ 0x0055, 0x0020, 0, VR::OB, VM::M1, "" },
{ 0x0055, 0x0030, 0, VR::OB, VM::M1, "IconData" },
@@ -8578,52 +9034,52 @@ DictEntry Dict145Contents[] = {
{ 0x0055, 0x0065, 0, VR::OB, VM::M1, "ImageHashValue" },
};
-unsigned short Dict145TagHashTable[] = {
+const unsigned short Dict151TagHashTable[] = {
6, 9, 5, 12, 17, 0, 1, 2, 48, 1,
1, 32, 2, 0, 16, 4, 101, 1, 3, 81,
};
-unsigned short Dict145KeyHashTable[] = {
+const unsigned short Dict151KeyHashTable[] = {
6, 11, 5, 5, 5, 0, 2, 2, 60200, 4,
20181, 3, 0, 1076, 1, 1076, 3, 1076,
};
-vtkDICOMDictionary::Dict Dict145Data = {
+vtkDICOMDictionary::Dict Dict151Data = {
"VEPRO VIM 5.0 DATA",
5,
5,
-Dict145TagHashTable,
-Dict145KeyHashTable,
-Dict145Contents
+Dict151TagHashTable,
+Dict151KeyHashTable,
+Dict151Contents
};
// ----- SIEMENS DICOM -----
-DictEntry Dict146Contents[] = {
+const DictEntry Dict152Contents[] = {
{ 0x0009, 0x0010, 0, VR::UN, VM::M1, "" },
{ 0x0009, 0x0012, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict146TagHashTable[] = {
+const unsigned short Dict152TagHashTable[] = {
2, 3, 0, 2, 0, 16, 1, 18,
};
-unsigned short Dict146KeyHashTable[] = {
+const unsigned short Dict152KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict146Data = {
+vtkDICOMDictionary::Dict Dict152Data = {
"SIEMENS DICOM",
2,
2,
-Dict146TagHashTable,
-Dict146KeyHashTable,
-Dict146Contents
+Dict152TagHashTable,
+Dict152KeyHashTable,
+Dict152Contents
};
// ----- SIEMENS MED NM -----
-DictEntry Dict147Contents[] = {
+const DictEntry Dict153Contents[] = {
{ 0x0009, 0x0080, 0, VR::ST, VM::M1, "" },
{ 0x0011, 0x0010, 0, VR::ST, VM::M1, "" },
{ 0x0017, 0x0000, 0, VR::ST, VM::M1, "" },
@@ -8818,7 +9274,7 @@ DictEntry Dict147Contents[] = {
{ 0x7fe3, 0x0028, 0, VR::OW, VM::M1, "" },
};
-unsigned short Dict147TagHashTable[] = {
+const unsigned short Dict153TagHashTable[] = {
193, 200, 205, 210, 213, 218, 221, 226, 233, 236,
241, 244, 192, 192, 192, 247, 250, 255, 264, 267,
192, 270, 273, 278, 285, 288, 293, 296, 192, 192,
@@ -8891,7 +9347,7 @@ unsigned short Dict147TagHashTable[] = {
167, 1, 11, 166, 1, 10, 165,
};
-unsigned short Dict147KeyHashTable[] = {
+const unsigned short Dict153KeyHashTable[] = {
193, 192, 192, 196, 192, 199, 192, 192, 192, 192,
192, 192, 192, 192, 192, 192, 192, 316, 321, 328,
335, 340, 345, 348, 351, 354, 192, 363, 366, 192,
@@ -8962,18 +9418,18 @@ unsigned short Dict147KeyHashTable[] = {
159, 39388,
};
-vtkDICOMDictionary::Dict Dict147Data = {
+vtkDICOMDictionary::Dict Dict153Data = {
"SIEMENS MED NM",
192,
192,
-Dict147TagHashTable,
-Dict147KeyHashTable,
-Dict147Contents
+Dict153TagHashTable,
+Dict153KeyHashTable,
+Dict153Contents
};
// ----- SPI-P-XSB-DCI Release 1 -----
-DictEntry Dict148Contents[] = {
+const DictEntry Dict154Contents[] = {
{ 0x0019, 0x0010, 0, VR::LT, VM::M1, "VideoBeamBoost" },
{ 0x0019, 0x0011, 0, VR::US, VM::M1, "ChannelGeneratingVideoSync" },
{ 0x0019, 0x0012, 0, VR::US, VM::M1, "VideoGain" },
@@ -8981,29 +9437,29 @@ DictEntry Dict148Contents[] = {
{ 0x0019, 0x0020, 0, VR::DS, VM::M1, "RTDDataCompressionFactor" },
};
-unsigned short Dict148TagHashTable[] = {
+const unsigned short Dict154TagHashTable[] = {
6, 9, 12, 15, 18, 0, 1, 3, 19, 1,
2, 18, 1, 4, 32, 1, 1, 17, 1, 0,
16,
};
-unsigned short Dict148KeyHashTable[] = {
+const unsigned short Dict154KeyHashTable[] = {
5, 5, 5, 6, 13, 0, 3, 1, 23927, 2,
49848, 3, 24448, 2, 0, 35076, 4, 22366,
};
-vtkDICOMDictionary::Dict Dict148Data = {
+vtkDICOMDictionary::Dict Dict154Data = {
"SPI-P-XSB-DCI Release 1",
5,
5,
-Dict148TagHashTable,
-Dict148KeyHashTable,
-Dict148Contents
+Dict154TagHashTable,
+Dict154KeyHashTable,
+Dict154Contents
};
// ----- GEMS_AWSOFT_CD1 -----
-DictEntry Dict149Contents[] = {
+const DictEntry Dict155Contents[] = {
{ 0x0039, 0x0065, 0, VR::UI, VM::M1, "ReferenceToStudyUID" },
{ 0x0039, 0x0070, 0, VR::UI, VM::M1, "ReferenceToSeriesUID" },
{ 0x0039, 0x0075, 0, VR::IS, VM::M1, "ReferenceToOriginalInstance" },
@@ -9015,32 +9471,32 @@ DictEntry Dict149Contents[] = {
{ 0x0039, 0x00FF, 0, VR::OB, VM::M1, "DPOData" },
};
-unsigned short Dict149TagHashTable[] = {
+const unsigned short Dict155TagHashTable[] = {
10, 15, 9, 20, 9, 25, 9, 28, 31, 0,
2, 1, 112, 5, 144, 2, 4, 133, 7, 170,
2, 0, 101, 6, 149, 1, 2, 117, 1, 3,
128, 1, 8, 255,
};
-unsigned short Dict149KeyHashTable[] = {
+const unsigned short Dict155KeyHashTable[] = {
9, 10, 13, 16, 19, 26, 29, 9, 32, 0,
1, 4, 7069, 1, 2, 61095, 1, 1, 56857, 3,
5, 6363, 6, 21677, 7, 8310, 1, 0, 25477, 1,
8, 7068, 1, 3, 20833,
};
-vtkDICOMDictionary::Dict Dict149Data = {
+vtkDICOMDictionary::Dict Dict155Data = {
"GEMS_AWSOFT_CD1",
9,
9,
-Dict149TagHashTable,
-Dict149KeyHashTable,
-Dict149Contents
+Dict155TagHashTable,
+Dict155KeyHashTable,
+Dict155Contents
};
// ----- GEMS_SEND_02 -----
-DictEntry Dict150Contents[] = {
+const DictEntry Dict156Contents[] = {
{ 0x0045, 0x0055, 0, VR::DS, VM::M8, "A_Coefficients" },
{ 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" },
{ 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" },
@@ -9051,35 +9507,35 @@ DictEntry Dict150Contents[] = {
{ 0x0045, 0x0073, 0, VR::IS, VM::M1, "CollimatorHeight" },
};
-unsigned short Dict150TagHashTable[] = {
+const unsigned short Dict156TagHashTable[] = {
9, 8, 14, 8, 17, 8, 20, 25, 0, 2,
0, 85, 3, 101, 1, 4, 103, 1, 5, 105,
2, 2, 99, 7, 115, 2, 1, 98, 6, 114,
};
-unsigned short Dict150KeyHashTable[] = {
+const unsigned short Dict156KeyHashTable[] = {
8, 8, 8, 9, 16, 23, 8, 26, 0, 3,
4, 5352, 5, 13265, 6, 22843, 3, 2, 29079, 3,
16921, 7, 6426, 1, 1, 25135, 1, 0, 59138,
};
-vtkDICOMDictionary::Dict Dict150Data = {
+vtkDICOMDictionary::Dict Dict156Data = {
"GEMS_SEND_02",
8,
8,
-Dict150TagHashTable,
-Dict150KeyHashTable,
-Dict150Contents
+Dict156TagHashTable,
+Dict156KeyHashTable,
+Dict156Contents
};
// ----- Philips Imaging DD 001 -----
-DictEntry Dict151Contents[] = {
+const DictEntry Dict157Contents[] = {
{ 0x2001, 0x0001, 0, VR::FL, VM::M1, "ChemicalShift" },
{ 0x2001, 0x0002, 0, VR::IS, VM::M1, "ChemicalShiftNumberMR" },
{ 0x2001, 0x0003, 0, VR::FL, VM::M1, "DiffusionBFactor" },
{ 0x2001, 0x0004, 0, VR::CS, VM::M1, "DiffusionDirection" },
-{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "" },
+{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "GraphicAnnotationParentID" },
{ 0x2001, 0x0006, 0, VR::CS, VM::M1, "ImageEnhanced" },
{ 0x2001, 0x0007, 0, VR::CS, VM::M1, "ImageTypeEDES" },
{ 0x2001, 0x0008, 0, VR::IS, VM::M1, "PhaseNumber" },
@@ -9111,53 +9567,59 @@ DictEntry Dict151Contents[] = {
{ 0x2001, 0x0023, 0, VR::DS, VM::M1, "FlipAngle" },
{ 0x2001, 0x0024, 0, VR::CS, VM::M1, "SeriesIsInteractive" },
{ 0x2001, 0x0025, 0, VR::SH, VM::M1, "EchoTimeDisplay" },
-{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "PresentationStateSubtractionActive" },
{ 0x2001, 0x0029, 0, VR::FL, VM::M1, "" },
{ 0x2001, 0x002b, 0, VR::CS, VM::M1, "" },
{ 0x2001, 0x002d, 0, VR::SS, VM::M1, "NumberOfSlicesInStack" },
{ 0x2001, 0x0032, 0, VR::FL, VM::M1, "StackRadialAngle" },
{ 0x2001, 0x0033, 0, VR::CS, VM::M1, "StackRadialAxis" },
{ 0x2001, 0x0035, 0, VR::SS, VM::M1, "StackSliceNumber" },
-{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackSliceType" },
+{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackType" },
{ 0x2001, 0x0039, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "" },
-{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "" },
-{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "" },
-{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "ContourFillColor" },
+{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "DisplayedAreaZoomInterpolationMeth" },
+{ 0x2001, 0x0043, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxFrstEndPnt" },
+{ 0x2001, 0x0044, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxScndEndPnt" },
+{ 0x2001, 0x0045, 0, VR::IS, VM::M2, "EllipsDisplShutOtherAxFrstEndPnt" },
+{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "GraphicLineStyle" },
+{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "GraphicLineWidth" },
+{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "GraphicAnnotationID" },
+{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "InterpolationMethod" },
+{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "PolyLineBeginPointStyle" },
+{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "PolyLineEndPointStyle" },
+{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "WindowSmoothingTaste" },
+{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "GraphicMarkerType" },
+{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "OverlayPlaneID" },
+{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "ImagePresentationStateUID" },
+{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "PresentationGLTrafoInvert" },
+{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "ContourFillTransparency" },
+{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "GraphicLineColor" },
+{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "GraphicType" },
{ 0x2001, 0x0058, 0, VR::UL, VM::M1, "ContrastTransferTaste" },
-{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "" },
+{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "GraphicAnnotationModel" },
+{ 0x2001, 0x005d, 0, VR::ST, VM::M1, "MeasurementTextUnits" },
+{ 0x2001, 0x005e, 0, VR::ST, VM::M1, "MeasurementTextType" },
{ 0x2001, 0x005f, 0, VR::SQ, VM::M1, "StackSequence" },
{ 0x2001, 0x0060, 0, VR::SL, VM::M1, "NumberOfStacks" },
{ 0x2001, 0x0061, 0, VR::CS, VM::M1, "SeriesTransmitted" },
{ 0x2001, 0x0062, 0, VR::CS, VM::M1, "SeriesCommitted" },
{ 0x2001, 0x0063, 0, VR::CS, VM::M1, "ExaminationSource" },
-{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "" },
-{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "TextType" },
+{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "GraphicOverlayPlane" },
{ 0x2001, 0x0067, 0, VR::CS, VM::M1, "LinearPresentationGLTrafoShapeSub" },
-{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "LinearModalityGLTrafo" },
+{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "DisplayShutter" },
+{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "SpatialTransformation" },
{ 0x2001, 0x006b, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "TextFont" },
{ 0x2001, 0x006e, 0, VR::SH, VM::M1, "SeriesType" },
-{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "GraphicConstraint" },
+{ 0x2001, 0x0072, 0, VR::IS, VM::M1, "EllipsDisplShutOtherAxScndEndPnt" },
{ 0x2001, 0x0074, 0, VR::DS, VM::M1, "" },
{ 0x2001, 0x0075, 0, VR::DS, VM::M1, "" },
{ 0x2001, 0x0076, 0, VR::UL, VM::M1, "NumberOfFrames" },
{ 0x2001, 0x0077, 0, VR::CS, VM::M1, "GLTrafoType" },
-{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "" },
+{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "WindowRoundingFactor" },
{ 0x2001, 0x007b, 0, VR::IS, VM::M1, "AcquisitionNumber" },
{ 0x2001, 0x007c, 0, VR::US, VM::M1, "FrameNumber" },
{ 0x2001, 0x0080, 0, VR::LO, VM::M1, "" },
@@ -9166,25 +9628,25 @@ DictEntry Dict151Contents[] = {
{ 0x2001, 0x0083, 0, VR::DS, VM::M1, "ImagingFrequency" },
{ 0x2001, 0x0084, 0, VR::DS, VM::M1, "InversionTime" },
{ 0x2001, 0x0085, 0, VR::DS, VM::M1, "MagneticFieldStrength" },
-{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "NumberOfPhaseEncodingSteps" },
+{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "NrOfPhaseEncodingSteps" },
{ 0x2001, 0x0087, 0, VR::SH, VM::M1, "ImagedNucleus" },
{ 0x2001, 0x0088, 0, VR::DS, VM::M1, "NumberOfAverages" },
{ 0x2001, 0x0089, 0, VR::DS, VM::M1, "PhaseFOVPercent" },
{ 0x2001, 0x008a, 0, VR::DS, VM::M1, "SamplingPercent" },
{ 0x2001, 0x008b, 0, VR::SH, VM::M1, "TransmittingCoil" },
-{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "TextForegroundColor" },
+{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "TextBackgroundColor" },
+{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "TextShadowColor" },
+{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "TextStyle" },
{ 0x2001, 0x009a, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "GraphicNumber" },
+{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "GraphicAnnotationLabel" },
{ 0x2001, 0x009f, 0, VR::US, VM::M2, "PixelProcessingKernelSize" },
{ 0x2001, 0x00a1, 0, VR::CS, VM::M1, "IsRawImage" },
-{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "TextColorForeground" },
+{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "TextColorBackground" },
+{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "TextColorShadow" },
+{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "LinearModalityGLTrafo" },
{ 0x2001, 0x00c8, 0, VR::LO, VM::M1, "ExamCardName" },
{ 0x2001, 0x00cc, 0, VR::ST, VM::M1, "DerivationDescription" },
{ 0x2001, 0x00da, 0, VR::CS, VM::M1, "" },
@@ -9192,111 +9654,117 @@ DictEntry Dict151Contents[] = {
{ 0x2001, 0x00f2, 0, VR::FL, VM::M6, "RetrospectiveMotionCorrection" },
};
-unsigned short Dict151TagHashTable[] = {
- 116, 121, 124, 127, 115, 130, 133, 136, 139, 142,
- 145, 148, 115, 151, 115, 154, 115, 115, 115, 115,
- 157, 160, 163, 166, 169, 174, 177, 180, 185, 190,
- 195, 200, 205, 210, 213, 218, 223, 226, 229, 115,
- 234, 237, 240, 245, 252, 259, 264, 269, 274, 279,
- 284, 287, 292, 295, 298, 301, 306, 309, 312, 317,
- 322, 325, 330, 333, 336, 339, 344, 349, 352, 355,
- 358, 361, 364, 367, 370, 373, 376, 379, 115, 382,
- 385, 115, 388, 115, 391, 115, 115, 115, 115, 115,
- 394, 397, 400, 115, 403, 406, 409, 115, 115, 115,
- 412, 415, 418, 115, 115, 421, 115, 115, 115, 115,
- 424, 427, 430, 115, 115, 0, 2, 50, 75, 112,
- 218, 1, 51, 76, 1, 52, 77, 1, 53, 78,
- 1, 54, 80, 1, 55, 81, 1, 56, 82, 1,
- 57, 83, 1, 58, 84, 1, 59, 85, 1, 60,
- 86, 1, 61, 88, 1, 62, 90, 1, 63, 95,
- 1, 64, 96, 1, 65, 97, 1, 66, 98, 2,
- 67, 99, 114, 242, 1, 68, 100, 1, 69, 101,
- 2, 88, 131, 113, 241, 2, 70, 103, 87, 130,
- 2, 71, 104, 86, 129, 2, 72, 105, 85, 128,
- 2, 73, 106, 92, 135, 2, 74, 107, 91, 134,
- 1, 90, 133, 2, 75, 109, 89, 132, 2, 76,
- 110, 96, 139, 1, 95, 138, 1, 94, 137, 2,
- 77, 113, 93, 136, 1, 0, 1, 1, 78, 116,
- 2, 2, 3, 79, 117, 3, 1, 2, 80, 118,
- 100, 147, 3, 4, 5, 81, 119, 99, 146, 2,
- 3, 4, 98, 145, 2, 6, 7, 97, 144, 2,
- 5, 6, 82, 122, 2, 8, 9, 83, 123, 2,
- 7, 8, 84, 124, 1, 10, 11, 2, 9, 10,
- 102, 155, 1, 101, 154, 1, 11, 12, 1, 13,
- 15, 2, 12, 14, 104, 159, 1, 15, 17, 1,
- 14, 16, 2, 17, 19, 103, 156, 2, 16, 18,
- 106, 163, 1, 19, 21, 2, 18, 20, 105, 161,
- 1, 21, 23, 1, 20, 22, 1, 23, 25, 2,
- 22, 24, 108, 165, 2, 25, 27, 107, 164, 1,
- 24, 26, 1, 27, 29, 1, 26, 28, 1, 29,
- 31, 1, 28, 30, 1, 31, 33, 1, 30, 32,
- 1, 33, 35, 1, 32, 34, 1, 35, 37, 1,
- 34, 36, 1, 36, 38, 1, 37, 41, 1, 38,
- 43, 1, 39, 45, 1, 41, 51, 1, 40, 50,
- 1, 42, 53, 1, 109, 193, 1, 43, 54, 1,
- 44, 57, 1, 45, 61, 1, 110, 200, 1, 46,
- 63, 1, 111, 204, 1, 47, 70, 1, 48, 71,
- 1, 49, 72,
-};
-
-unsigned short Dict151KeyHashTable[] = {
- 115, 116, 115, 115, 119, 115, 115, 124, 115, 115,
- 127, 115, 130, 135, 115, 138, 115, 115, 141, 144,
- 147, 150, 115, 153, 115, 158, 161, 115, 166, 115,
- 169, 172, 115, 115, 115, 175, 115, 180, 183, 186,
- 115, 115, 191, 194, 201, 204, 209, 115, 212, 115,
- 215, 115, 218, 225, 228, 115, 115, 115, 115, 231,
- 234, 115, 237, 240, 115, 243, 115, 246, 115, 249,
- 115, 115, 115, 115, 252, 115, 115, 115, 255, 115,
- 115, 258, 261, 266, 115, 269, 272, 275, 115, 115,
- 115, 278, 115, 375, 378, 115, 115, 115, 381, 115,
- 115, 115, 384, 115, 387, 115, 390, 115, 115, 115,
- 393, 115, 115, 115, 398, 0, 1, 0, 2088, 2,
- 17, 35626, 39, 44341, 1, 26, 25264, 1, 9, 9372,
- 2, 13, 44827, 31, 16493, 1, 28, 18577, 1, 88,
-25260, 1, 64, 27166, 1, 23, 64272, 1, 80, 31103,
- 1, 91, 22519, 2, 24, 80, 104, 54963, 1, 89,
- 9032, 2, 14, 42773, 81, 56404, 1, 94, 15378, 1,
- 12, 4822, 1, 43, 2266, 2, 25, 31003, 105, 60713,
- 1, 34, 21703, 1, 84, 28737, 2, 40, 49592, 93,
-35726, 1, 70, 48180, 3, 21, 62292, 63, 53651, 86,
-15159, 1, 61, 6687, 2, 6, 27050, 16, 42136, 1,
- 7, 1611, 1, 8, 52205, 1, 87, 326, 3, 65,
-63497, 67, 3013, 110, 14157, 1, 83, 65494, 1, 18,
-62604, 1, 5, 32337, 1, 3, 2891, 1, 10, 16721,
- 1, 22, 12701, 1, 30, 13913, 1, 113, 52492, 1,
- 42, 9525, 1, 95, 44829, 1, 20, 20148, 1, 35,
-27688, 2, 96, 38698, 114, 40816, 1, 11, 34906, 1,
- 2, 12392, 1, 27, 62, 1, 1, 33166, 48, 4,
- 46, 32, 21122, 36, 46, 37, 46, 38, 46, 41,
-60502, 44, 46, 45, 46, 46, 46, 47, 46, 48,
- 46, 49, 46, 50, 46, 51, 46, 52, 46, 53,
- 46, 54, 46, 55, 46, 56, 46, 57, 46, 58,
- 46, 59, 46, 60, 46, 62, 46, 68, 46, 69,
- 46, 71, 46, 72, 46, 73, 46, 74, 46, 75,
- 46, 77, 46, 78, 46, 79, 46, 82, 46, 85,
- 46, 97, 46, 98, 46, 99, 46, 100, 46, 101,
- 46, 102, 46, 103, 46, 106, 46, 107, 46, 108,
- 46, 109, 46, 112, 46, 1, 15, 34543, 1, 29,
-14876, 1, 92, 61619, 1, 76, 23588, 1, 66, 53818,
- 1, 19, 30631, 2, 33, 62259, 90, 30886, 1, 111,
- 9412,
+const unsigned short Dict157TagHashTable[] = {
+ 122, 125, 128, 133, 138, 141, 144, 147, 150, 121,
+ 153, 156, 121, 159, 121, 162, 121, 121, 121, 121,
+ 121, 165, 168, 171, 121, 121, 174, 177, 121, 121,
+ 121, 180, 121, 185, 121, 121, 121, 121, 188, 193,
+ 196, 199, 202, 207, 121, 121, 210, 213, 216, 219,
+ 121, 222, 225, 230, 233, 236, 239, 242, 121, 245,
+ 121, 248, 121, 121, 251, 254, 257, 260, 263, 266,
+ 269, 272, 275, 121, 278, 281, 284, 289, 292, 295,
+ 298, 301, 121, 121, 304, 307, 312, 315, 320, 325,
+ 330, 335, 338, 343, 348, 355, 362, 367, 370, 373,
+ 376, 379, 384, 389, 394, 397, 400, 403, 406, 409,
+ 414, 419, 422, 425, 430, 433, 436, 441, 446, 449,
+ 454, 0, 1, 26, 28, 1, 29, 31, 2, 28,
+ 30, 114, 165, 2, 31, 33, 113, 164, 1, 30,
+ 32, 1, 33, 35, 1, 32, 34, 1, 35, 37,
+ 1, 34, 36, 1, 36, 38, 1, 37, 41, 1,
+ 38, 43, 1, 39, 45, 1, 41, 51, 1, 40,
+ 50, 1, 42, 53, 1, 43, 54, 1, 44, 57,
+ 2, 45, 61, 115, 193, 1, 46, 63, 2, 47,
+ 67, 116, 200, 1, 48, 68, 1, 49, 69, 1,
+ 50, 70, 2, 51, 71, 117, 204, 1, 52, 72,
+ 1, 53, 75, 1, 54, 76, 1, 55, 77, 1,
+ 56, 78, 1, 57, 80, 2, 58, 81, 118, 218,
+ 1, 59, 82, 1, 60, 83, 1, 61, 84, 1,
+ 62, 85, 1, 63, 86, 1, 64, 88, 1, 65,
+ 90, 1, 66, 93, 1, 67, 94, 1, 68, 95,
+ 1, 69, 96, 1, 70, 97, 1, 71, 98, 1,
+ 72, 99, 1, 73, 100, 1, 74, 101, 1, 75,
+ 103, 1, 76, 104, 2, 77, 105, 120, 242, 1,
+ 78, 106, 1, 79, 107, 1, 119, 241, 1, 80,
+ 109, 1, 81, 110, 1, 82, 113, 2, 83, 114,
+ 94, 131, 1, 93, 130, 2, 84, 116, 92, 129,
+ 2, 85, 117, 91, 128, 2, 86, 118, 98, 135,
+ 2, 87, 119, 97, 134, 1, 96, 133, 2, 0,
+ 1, 95, 132, 2, 88, 122, 102, 139, 3, 2,
+ 3, 89, 123, 101, 138, 3, 1, 2, 90, 124,
+ 100, 137, 2, 4, 5, 99, 136, 1, 3, 4,
+ 1, 6, 7, 1, 5, 6, 1, 8, 9, 2,
+ 7, 8, 106, 147, 2, 10, 11, 105, 146, 2,
+ 9, 10, 104, 145, 1, 103, 144, 1, 11, 12,
+ 1, 13, 15, 1, 12, 14, 1, 15, 17, 2,
+ 14, 16, 108, 155, 2, 17, 19, 107, 154, 1,
+ 16, 18, 1, 19, 21, 2, 18, 20, 110, 159,
+ 1, 21, 23, 1, 20, 22, 2, 23, 25, 109,
+ 156, 2, 22, 24, 112, 163, 1, 25, 27, 2,
+ 24, 26, 111, 161, 1, 27, 29,
+};
+
+const unsigned short Dict157KeyHashTable[] = {
+ 121, 121, 121, 121, 121, 122, 125, 132, 137, 121,
+ 121, 140, 143, 146, 149, 154, 159, 162, 165, 168,
+ 121, 121, 121, 121, 171, 121, 174, 177, 121, 121,
+ 121, 182, 185, 121, 188, 121, 191, 196, 121, 201,
+ 206, 211, 121, 121, 214, 217, 121, 121, 222, 225,
+ 234, 237, 244, 247, 121, 121, 252, 255, 274, 277,
+ 121, 282, 285, 121, 290, 295, 121, 121, 300, 303,
+ 306, 121, 309, 312, 315, 320, 325, 328, 331, 334,
+ 339, 121, 344, 349, 352, 121, 121, 355, 358, 365,
+ 368, 371, 121, 378, 121, 381, 386, 389, 392, 395,
+ 400, 121, 403, 406, 411, 121, 414, 121, 121, 419,
+ 422, 425, 428, 431, 121, 121, 434, 437, 121, 121,
+ 440, 0, 1, 36, 38495, 3, 67, 48876, 74, 48231,
+ 96, 36938, 2, 61, 25073, 101, 3610, 1, 93, 6268,
+ 1, 80, 29542, 1, 31, 33007, 1, 102, 40571, 2,
+ 90, 37603, 97, 26027, 2, 14, 26570, 15, 60995, 1,
+ 54, 13865, 1, 4, 53828, 1, 19, 11781, 1, 94,
+40256, 1, 40, 35759, 1, 99, 1999, 2, 60, 13301,
+ 83, 37303, 1, 58, 23725, 1, 25, 48964, 1, 20,
+49480, 2, 21, 53787, 22, 16946, 2, 8, 27410, 24,
+56946, 2, 41, 26630, 49, 18458, 2, 33, 44007, 116,
+10747, 1, 104, 51872, 1, 62, 9966, 2, 29, 53677,
+ 32, 47156, 1, 34, 44458, 4, 16, 35172, 65, 11534,
+ 109, 63093, 113, 14616, 1, 23, 3673, 3, 5, 25859,
+ 68, 30409, 82, 4893, 1, 103, 33584, 2, 6, 63622,
+ 50, 37311, 1, 9, 50070, 9, 37, 44, 38, 44,
+ 44, 44, 79, 44, 84, 44, 85, 44, 91, 44,
+ 107, 44, 118, 44, 1, 105, 30749, 2, 27, 28765,
+ 66, 14024, 1, 11, 52132, 2, 30, 26222, 73, 33790,
+ 2, 46, 59320, 63, 54477, 2, 87, 4861, 89, 11334,
+ 1, 57, 52379, 1, 119, 31474, 1, 3, 9247, 1,
+ 71, 61982, 1, 98, 55314, 2, 39, 23185, 72, 46193,
+ 2, 17, 16527, 78, 61047, 1, 92, 18740, 1, 43,
+15568, 1, 51, 7525, 2, 42, 19885, 110, 49529, 2,
+ 1, 40729, 77, 22250, 2, 28, 5198, 75, 40916, 1,
+ 7, 34028, 1, 10, 8309, 1, 53, 62351, 3, 45,
+45029, 55, 23907, 111, 57702, 1, 108, 40875, 1, 56,
+46044, 3, 70, 14852, 76, 61743, 115, 61743, 1, 0,
+10108, 2, 18, 28627, 86, 38226, 1, 59, 37023, 1,
+ 13, 13356, 1, 64, 29103, 2, 95, 10750, 100, 40071,
+ 1, 48, 45173, 1, 26, 6137, 2, 106, 60724, 117,
+ 9487, 1, 12, 7832, 2, 2, 35067, 120, 64248, 1,
+ 112, 34383, 1, 81, 25668, 1, 88, 59755, 1, 47,
+26328, 1, 69, 27443, 1, 35, 317, 1, 114, 37450,
+ 1, 52, 45035,
};
-vtkDICOMDictionary::Dict Dict151Data = {
+vtkDICOMDictionary::Dict Dict157Data = {
"Philips Imaging DD 001",
-115,
-115,
-Dict151TagHashTable,
-Dict151KeyHashTable,
-Dict151Contents
+121,
+121,
+Dict157TagHashTable,
+Dict157KeyHashTable,
+Dict157Contents
};
// ----- PRIVATE_CODE_STRING_1003 -----
-DictEntry Dict152Contents[] = {
+const DictEntry Dict158Contents[] = {
{ 0x1003, 0x0001, 0, VR::UN, VM::M1, "NumberOfProbes" },
-{ 0x1003, 0x0010, 0, VR::UN, VM::M1, "US Probe Sequence" },
+{ 0x1003, 0x0010, 0, VR::UN, VM::M1, "USProbeSequence" },
{ 0x1003, 0x0011, 0, VR::UN, VM::M1, "Identifier" },
{ 0x1003, 0x0012, 0, VR::UN, VM::M1, "ProbeName" },
{ 0x1003, 0x0013, 0, VR::UN, VM::M1, "Depth" },
@@ -9323,7 +9791,7 @@ DictEntry Dict152Contents[] = {
{ 0x1003, 0x0043, 0, VR::UN, VM::M1, "Focus" },
};
-unsigned short Dict152TagHashTable[] = {
+const unsigned short Dict158TagHashTable[] = {
27, 30, 33, 26, 26, 26, 26, 26, 26, 36,
26, 26, 26, 26, 39, 44, 49, 54, 59, 64,
69, 74, 79, 84, 89, 92, 0, 1, 10, 25,
@@ -9336,31 +9804,31 @@ unsigned short Dict152TagHashTable[] = {
19, 49, 1, 18, 48,
};
-unsigned short Dict152KeyHashTable[] = {
- 27, 26, 34, 26, 37, 40, 45, 48, 26, 26,
- 53, 26, 62, 65, 68, 26, 26, 26, 26, 26,
- 71, 74, 77, 82, 87, 26, 0, 3, 2, 62212,
- 7, 54333, 23, 62212, 1, 13, 48157, 1, 9, 3088,
- 2, 20, 32205, 25, 56144, 1, 14, 30943, 2, 8,
-16664, 18, 2750, 4, 0, 14266, 4, 17176, 16, 5098,
- 17, 55538, 1, 12, 40215, 1, 24, 50301, 1, 21,
- 9095, 1, 6, 4184, 1, 11, 35619, 2, 19, 17277,
- 22, 64610, 2, 5, 24208, 10, 43477, 3, 1, 751,
+const unsigned short Dict158KeyHashTable[] = {
+ 27, 26, 34, 26, 39, 42, 47, 50, 26, 26,
+ 55, 26, 64, 67, 70, 26, 26, 26, 26, 26,
+ 73, 76, 79, 84, 89, 26, 0, 3, 2, 62212,
+ 7, 54333, 23, 62212, 2, 1, 45350, 13, 48157, 1,
+ 9, 3088, 2, 20, 32205, 25, 56144, 1, 14, 30943,
+ 2, 8, 16664, 18, 2750, 4, 0, 14266, 4, 17176,
+ 16, 5098, 17, 55538, 1, 12, 40215, 1, 24, 50301,
+ 1, 21, 9095, 1, 6, 4184, 1, 11, 35619, 2,
+ 19, 17277, 22, 64610, 2, 5, 24208, 10, 43477, 2,
3, 41983, 15, 50436,
};
-vtkDICOMDictionary::Dict Dict152Data = {
+vtkDICOMDictionary::Dict Dict158Data = {
"PRIVATE_CODE_STRING_1003",
26,
26,
-Dict152TagHashTable,
-Dict152KeyHashTable,
-Dict152Contents
+Dict158TagHashTable,
+Dict158KeyHashTable,
+Dict158Contents
};
// ----- Applicare/Workflow/Version 1.0 -----
-DictEntry Dict153Contents[] = {
+const DictEntry Dict159Contents[] = {
{ 0x3113, 0x0001, 0, VR::CS, VM::M1, "OrderControl" },
{ 0x3113, 0x0010, 0, VR::SH, VM::M1, "ScheduledActionItemCodeValue" },
{ 0x3113, 0x0011, 0, VR::SH, VM::M1, "ScheduledActionItemCodingSchemeDesignator" },
@@ -9381,7 +9849,7 @@ DictEntry Dict153Contents[] = {
{ 0x3113, 0x00E2, 0, VR::CS, VM::M1, "KfEditLockUser" },
};
-unsigned short Dict153TagHashTable[] = {
+const unsigned short Dict159TagHashTable[] = {
18, 18, 18, 18, 19, 22, 25, 18, 18, 28,
31, 36, 41, 46, 49, 54, 59, 64, 0, 1,
12, 39, 1, 11, 38, 1, 10, 37, 1, 9,
@@ -9391,7 +9859,7 @@ unsigned short Dict153TagHashTable[] = {
2, 17, 17, 226, 1, 1, 16,
};
-unsigned short Dict153KeyHashTable[] = {
+const unsigned short Dict159KeyHashTable[] = {
19, 22, 25, 18, 18, 30, 33, 18, 36, 18,
39, 18, 18, 42, 51, 56, 61, 18, 0, 1,
10, 48685, 1, 11, 15677, 2, 0, 7200, 2, 39829,
@@ -9401,18 +9869,85 @@ unsigned short Dict153KeyHashTable[] = {
19055, 2, 12, 20206, 17, 41562,
};
-vtkDICOMDictionary::Dict Dict153Data = {
+vtkDICOMDictionary::Dict Dict159Data = {
"Applicare/Workflow/Version 1.0",
18,
18,
-Dict153TagHashTable,
-Dict153KeyHashTable,
-Dict153Contents
+Dict159TagHashTable,
+Dict159KeyHashTable,
+Dict159Contents
};
// ----- PRIVATE_CODE_STRING_1001 -----
-DictEntry Dict154Contents[] = {
+const DictEntry Dict160Contents[] = {
+{ 0x1001, 0x00A0, 0, VR::SQ, VM::M1, "MarkerSequence" },
+{ 0x1001, 0x00A1, 0, VR::SL, VM::M1, "MarkerType" },
+{ 0x1001, 0x00A2, 0, VR::SL, VM::M1, "MarkerNumber" },
+{ 0x1001, 0x00A3, 0, VR::FD, VM::M3, "Marker3DPosition" },
+{ 0x1001, 0x00B0, 0, VR::SL, VM::M1, "DistanceUnit" },
+{ 0x1001, 0x00B1, 0, VR::SL, VM::M1, "DoseUnit" },
+{ 0x1001, 0x00B2, 0, VR::SL, VM::M1, "NormalisationMode" },
+{ 0x1001, 0x00B3, 0, VR::FD, VM::M1, "NormalisationFactor" },
+{ 0x1001, 0x00B4, 0, VR::FD, VM::M1, "FValue" },
+{ 0x1001, 0x00B5, 0, VR::FD, VM::M1, "PrescribedDose" },
+{ 0x1001, 0x00B6, 0, VR::FD, VM::M1, "AbsoluteDoseFactor" },
+{ 0x1001, 0x00B7, 0, VR::SL, VM::M1, "DecoupledSK" },
+{ 0x1001, 0x00B8, 0, VR::FD, VM::M1, "AbsoluteTimeFactor" },
+{ 0x1001, 0x00B9, 0, VR::FD, VM::M1, "TotalTreatmentTime" },
+{ 0x1001, 0x00BA, 0, VR::SL, VM::M1, "TG43Model" },
+{ 0x1001, 0x00BB, 0, VR::SL, VM::M1, "ThreeDDoseGridSize" },
+{ 0x1001, 0x00BC, 0, VR::FD, VM::M3, "DoseGridCorner1" },
+{ 0x1001, 0x00BD, 0, VR::FD, VM::M3, "DoseGridCorner2" },
+{ 0x1001, 0x00BE, 0, VR::FD, VM::M1, "PatientDataConversion" },
+{ 0x1001, 0x00BF, 0, VR::FD, VM::M1, "VolumeDataConversion" },
+{ 0x1001, 0x00C0, 0, VR::FD, VM::M3, "VolumeDataVector" },
+{ 0x1001, 0x00C1, 0, VR::SL, VM::M1, "OptimizationMethod" },
+{ 0x1001, 0x00C2, 0, VR::SL, VM::M1, "DisplayMethod" },
+{ 0x1001, 0x00C3, 0, VR::SQ, VM::M1, "VOIBasedOptimizationSettingsSequence" },
+{ 0x1001, 0x00C5, 0, VR::SL, VM::M1, "VOINumber" },
+{ 0x1001, 0x00C6, 0, VR::LO, VM::M1, "VOIName" },
+{ 0x1001, 0x00C7, 0, VR::SL, VM::M1, "VOIType" },
+{ 0x1001, 0x00C8, 0, VR::SL, VM::M1, "VOIClass" },
+{ 0x1001, 0x00C9, 0, VR::SL, VM::M1, "VOIPriority" },
+{ 0x1001, 0x00CA, 0, VR::SL, VM::M1, "NoOfPoints" },
+{ 0x1001, 0x00CB, 0, VR::FD, VM::M1, "PercentOnSurface" },
+{ 0x1001, 0x00CC, 0, VR::FD, VM::M1, "SurfaceMargin" },
+{ 0x1001, 0x00CD, 0, VR::SL, VM::M1, "Selected" },
+{ 0x1001, 0x00CE, 0, VR::FD, VM::M1, "DoseLimit" },
+{ 0x1001, 0x00CF, 0, VR::FD, VM::M1, "ImportanceFactor" },
+{ 0x1001, 0x00D0, 0, VR::FD, VM::M1, "ImportanceFactorFrom" },
+{ 0x1001, 0x00D1, 0, VR::FD, VM::M1, "ImportanceFactorTo" },
+{ 0x1001, 0x00D2, 0, VR::FD, VM::M1, "Focus" },
+{ 0x1001, 0x00D3, 0, VR::SL, VM::M1, "SurfaceSamplingMethod" },
+{ 0x1001, 0x00D4, 0, VR::FD, VM::M1, "NumberOfSamplingPointsPerccm" },
+{ 0x1001, 0x00D5, 0, VR::SL, VM::M1, "ConvergenceAccuracy" },
+{ 0x1001, 0x00D6, 0, VR::SL, VM::M1, "MaxNoOfConvergenceIterations" },
+{ 0x1001, 0x00D7, 0, VR::FD, VM::M1, "WeightSmoothing" },
+{ 0x1001, 0x00D8, 0, VR::SL, VM::M1, "StepsPerImportanceFactor" },
+{ 0x1001, 0x00D9, 0, VR::FD, VM::M1, "ConstraintsPTVDmax" },
+{ 0x1001, 0x00DA, 0, VR::FD, VM::M1, "ConstraintsNTDmax" },
+{ 0x1001, 0x00DB, 0, VR::SL, VM::M1, "AlgorithmicPopulationSize" },
+{ 0x1001, 0x00DC, 0, VR::SL, VM::M1, "AlgorithmicGenerations" },
+{ 0x1001, 0x00DD, 0, VR::SL, VM::M1, "AlgorithmicInitializations" },
+{ 0x1001, 0x00DE, 0, VR::SL, VM::M1, "MinNoOfSDP" },
+{ 0x1001, 0x00DF, 0, VR::SL, VM::M1, "DepthMethod" },
+{ 0x1001, 0x00E0, 0, VR::SL, VM::M1, "DepthDefinedOn" },
+{ 0x1001, 0x00E1, 0, VR::FD, VM::M1, "Depth" },
+{ 0x1001, 0x00E2, 0, VR::SQ, VM::M1, "VOIBasedPlacementSettingsSequence" },
+{ 0x1001, 0x00E7, 0, VR::SL, VM::M1, "VOISelected" },
+{ 0x1001, 0x00E8, 0, VR::FD, VM::M1, "Margin" },
+{ 0x1001, 0x00E9, 0, VR::SL, VM::M1, "SelectionMethod" },
+{ 0x1001, 0x00EA, 0, VR::FD, VM::M1, "SelectionDistance" },
+{ 0x1001, 0x00EB, 0, VR::FD, VM::M1, "WBTOnContourSpacing" },
+{ 0x1001, 0x00EC, 0, VR::FD, VM::M1, "WBTUrethraMargin" },
+{ 0x1001, 0x00ED, 0, VR::FD, VM::M1, "WBTSearchingRadiusPTV" },
+{ 0x1001, 0x00EE, 0, VR::FD, VM::M1, "WBTSearchingRadiusOAR" },
+{ 0x1001, 0x00EF, 0, VR::FD, VM::M3, "WBTStartingPoint" },
+{ 0x1001, 0x00F0, 0, VR::FD, VM::M4, "WBTSurface" },
+{ 0x1001, 0x00F1, 0, VR::FD, VM::M4, "WBTNoOfInteriorCatheters" },
+{ 0x1001, 0x00F2, 0, VR::FD, VM::M4, "WBTRelativeRadius" },
+{ 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" },
{ 0x1001, 0x00A0, 0, VR::SQ, VM::M1, "MarkerSequence" },
{ 0x1001, 0x00A1, 0, VR::SL, VM::M1, "MarkerType" },
{ 0x1001, 0x00A2, 0, VR::SL, VM::M1, "MarkerNumber" },
@@ -9426,7 +9961,7 @@ DictEntry Dict154Contents[] = {
{ 0x1001, 0x00B6, 0, VR::FD, VM::M1, "AbsoluteDoseFactor" },
{ 0x1001, 0x00B7, 0, VR::SL, VM::M1, "DecoupledSK" },
{ 0x1001, 0x00B8, 0, VR::FD, VM::M1, "AbsoluteTimeFactor" },
-{ 0x1001, 0x00B9, 0, VR::FD, VM::M1, "Total Treatment Time" },
+{ 0x1001, 0x00B9, 0, VR::FD, VM::M1, "TotalTreatmentTime" },
{ 0x1001, 0x00BA, 0, VR::SL, VM::M1, "TG43Model" },
{ 0x1001, 0x00BB, 0, VR::SL, VM::M1, "ThreeDDoseGridSize" },
{ 0x1001, 0x00BC, 0, VR::FD, VM::M3, "DoseGridCorner1" },
@@ -9482,125 +10017,167 @@ DictEntry Dict154Contents[] = {
{ 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" },
};
-unsigned short Dict154TagHashTable[] = {
- 67, 67, 67, 68, 71, 74, 77, 80, 83, 67,
- 86, 89, 92, 95, 98, 101, 104, 107, 110, 113,
- 116, 119, 122, 125, 128, 131, 134, 137, 140, 143,
- 146, 149, 152, 157, 162, 167, 67, 172, 175, 67,
- 178, 67, 67, 181, 184, 187, 190, 193, 196, 201,
- 206, 211, 216, 221, 226, 231, 234, 237, 240, 243,
- 246, 249, 252, 255, 67, 67, 67, 0, 1, 22,
- 194, 1, 23, 195, 1, 20, 192, 1, 21, 193,
- 1, 25, 198, 1, 26, 199, 1, 24, 197, 1,
- 29, 202, 1, 30, 203, 1, 27, 200, 1, 28,
- 201, 1, 33, 206, 1, 34, 207, 1, 31, 204,
- 1, 32, 205, 1, 37, 210, 1, 38, 211, 1,
- 35, 208, 1, 36, 209, 1, 41, 214, 1, 42,
- 215, 1, 39, 212, 1, 40, 213, 1, 45, 218,
- 1, 46, 219, 1, 43, 216, 1, 44, 217, 1,
- 49, 222, 2, 3, 163, 50, 223, 2, 2, 162,
- 47, 220, 2, 1, 161, 48, 221, 2, 0, 160,
- 53, 226, 1, 51, 224, 1, 52, 225, 1, 54,
- 231, 1, 57, 234, 1, 58, 235, 1, 55, 232,
- 1, 56, 233, 1, 61, 238, 2, 7, 179, 62,
- 239, 2, 6, 178, 59, 236, 2, 5, 177, 60,
- 237, 2, 4, 176, 65, 242, 2, 11, 183, 66,
- 243, 2, 10, 182, 63, 240, 2, 9, 181, 64,
- 241, 1, 8, 180, 1, 15, 187, 1, 14, 186,
- 1, 13, 185, 1, 12, 184, 1, 19, 191, 1,
- 18, 190, 1, 17, 189, 1, 16, 188,
-};
-
-unsigned short Dict154KeyHashTable[] = {
- 68, 73, 67, 78, 67, 85, 92, 95, 67, 98,
- 101, 104, 111, 114, 67, 117, 67, 124, 67, 67,
- 67, 67, 127, 134, 137, 142, 145, 148, 151, 67,
- 154, 67, 157, 67, 160, 163, 166, 169, 172, 67,
- 175, 67, 178, 181, 67, 184, 191, 67, 67, 67,
- 194, 197, 202, 67, 205, 210, 213, 216, 221, 67,
- 224, 229, 234, 239, 244, 67, 67, 0, 2, 32,
-59034, 34, 55346, 2, 29, 5649, 62, 14253, 3, 13,
- 5667, 33, 24356, 48, 38032, 3, 50, 45042, 58, 61715,
- 66, 9709, 1, 23, 7679, 1, 7, 29535, 1, 65,
-55151, 1, 51, 13172, 3, 24, 539, 45, 19530, 47,
-37028, 1, 52, 50682, 1, 43, 21717, 3, 1, 58302,
- 46, 24805, 60, 47315, 1, 41, 895, 3, 9, 45279,
- 10, 12136, 12, 43860, 1, 18, 49089, 2, 15, 36775,
- 64, 52169, 1, 22, 23873, 1, 39, 9833, 1, 40,
- 8652, 1, 0, 18796, 1, 30, 25994, 1, 21, 4239,
- 1, 44, 63381, 1, 5, 22095, 1, 6, 45058, 1,
- 61, 47289, 1, 4, 49838, 1, 42, 11999, 1, 16,
-34562, 1, 17, 34562, 3, 26, 36856, 35, 43551, 54,
-65285, 1, 8, 1374, 1, 14, 23522, 2, 19, 36846,
- 49, 8197, 1, 31, 18120, 2, 38, 37084, 56, 44274,
- 1, 53, 8170, 1, 55, 34041, 2, 2, 25885, 28,
-25300, 1, 25, 33246, 2, 37, 25699, 59, 26501, 2,
- 3, 17778, 36, 4148, 2, 11, 17758, 63, 21471, 2,
- 20, 37337, 27, 57166, 1, 57, 42386,
+const unsigned short Dict160TagHashTable[] = {
+ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 135, 140, 145, 150, 134, 134, 134, 134,
+ 134, 134, 134, 134, 134, 134, 134, 134, 155, 160,
+ 165, 170, 175, 180, 185, 190, 195, 200, 205, 210,
+ 215, 220, 225, 230, 134, 134, 134, 134, 134, 134,
+ 235, 240, 245, 250, 255, 260, 134, 265, 270, 275,
+ 280, 285, 290, 295, 300, 305, 310, 315, 320, 325,
+ 330, 335, 340, 345, 350, 355, 360, 365, 370, 375,
+ 380, 385, 390, 134, 395, 400, 134, 405, 134, 134,
+ 410, 415, 420, 425, 430, 435, 440, 445, 450, 455,
+ 460, 465, 134, 134, 134, 134, 134, 134, 134, 134,
+ 134, 134, 134, 134, 0, 2, 3, 163, 70, 163,
+ 2, 2, 162, 69, 162, 2, 1, 161, 68, 161,
+ 2, 0, 160, 67, 160, 2, 7, 179, 74, 179,
+ 2, 6, 178, 73, 178, 2, 5, 177, 72, 177,
+ 2, 4, 176, 71, 176, 2, 11, 183, 78, 183,
+ 2, 10, 182, 77, 182, 2, 9, 181, 76, 181,
+ 2, 8, 180, 75, 180, 2, 15, 187, 82, 187,
+ 2, 14, 186, 81, 186, 2, 13, 185, 80, 185,
+ 2, 12, 184, 79, 184, 2, 19, 191, 86, 191,
+ 2, 18, 190, 85, 190, 2, 17, 189, 84, 189,
+ 2, 16, 188, 83, 188, 2, 22, 194, 89, 194,
+ 2, 23, 195, 90, 195, 2, 20, 192, 87, 192,
+ 2, 21, 193, 88, 193, 2, 25, 198, 92, 198,
+ 2, 26, 199, 93, 199, 2, 24, 197, 91, 197,
+ 2, 29, 202, 96, 202, 2, 30, 203, 97, 203,
+ 2, 27, 200, 94, 200, 2, 28, 201, 95, 201,
+ 2, 33, 206, 100, 206, 2, 34, 207, 101, 207,
+ 2, 31, 204, 98, 204, 2, 32, 205, 99, 205,
+ 2, 37, 210, 104, 210, 2, 38, 211, 105, 211,
+ 2, 35, 208, 102, 208, 2, 36, 209, 103, 209,
+ 2, 41, 214, 108, 214, 2, 42, 215, 109, 215,
+ 2, 39, 212, 106, 212, 2, 40, 213, 107, 213,
+ 2, 45, 218, 112, 218, 2, 46, 219, 113, 219,
+ 2, 43, 216, 110, 216, 2, 44, 217, 111, 217,
+ 2, 49, 222, 116, 222, 2, 50, 223, 117, 223,
+ 2, 47, 220, 114, 220, 2, 48, 221, 115, 221,
+ 2, 53, 226, 120, 226, 2, 51, 224, 118, 224,
+ 2, 52, 225, 119, 225, 2, 54, 231, 121, 231,
+ 2, 57, 234, 124, 234, 2, 58, 235, 125, 235,
+ 2, 55, 232, 122, 232, 2, 56, 233, 123, 233,
+ 2, 61, 238, 128, 238, 2, 62, 239, 129, 239,
+ 2, 59, 236, 126, 236, 2, 60, 237, 127, 237,
+ 2, 65, 242, 132, 242, 2, 66, 243, 133, 243,
+ 2, 63, 240, 130, 240, 2, 64, 241, 131, 241,
+};
+
+const unsigned short Dict160KeyHashTable[] = {
+ 135, 134, 134, 144, 134, 153, 134, 134, 134, 134,
+ 158, 163, 172, 134, 134, 177, 134, 134, 134, 134,
+ 134, 134, 182, 134, 134, 134, 134, 191, 196, 134,
+ 201, 134, 134, 134, 134, 134, 206, 134, 211, 134,
+ 134, 134, 216, 221, 134, 226, 231, 134, 134, 134,
+ 236, 241, 246, 134, 251, 260, 134, 265, 270, 134,
+ 134, 275, 284, 289, 294, 134, 134, 134, 299, 134,
+ 134, 134, 308, 317, 322, 134, 327, 134, 332, 134,
+ 341, 134, 346, 134, 355, 134, 134, 134, 134, 360,
+ 365, 370, 379, 384, 134, 134, 134, 134, 134, 389,
+ 134, 394, 399, 134, 404, 134, 134, 409, 134, 134,
+ 134, 134, 414, 134, 134, 134, 134, 134, 423, 134,
+ 134, 134, 134, 428, 433, 134, 134, 438, 134, 447,
+ 452, 134, 134, 134, 0, 4, 32, 29517, 34, 27673,
+ 99, 29517, 101, 27673, 4, 33, 12178, 48, 19016, 100,
+12178, 115, 19016, 2, 50, 22521, 117, 22521, 2, 51,
+39354, 118, 39354, 4, 45, 9765, 47, 51282, 112, 9765,
+ 114, 51282, 2, 52, 58109, 119, 58109, 2, 1, 61919,
+ 68, 61919, 4, 10, 38836, 12, 21930, 77, 38836, 79,
+21930, 2, 40, 37094, 107, 37094, 2, 0, 42166, 67,
+42166, 2, 30, 45765, 97, 45765, 2, 6, 22529, 73,
+22529, 2, 4, 24919, 71, 24919, 2, 16, 50049, 83,
+50049, 2, 17, 50049, 84, 50049, 2, 26, 51196, 93,
+51196, 2, 8, 687, 75, 687, 2, 14, 44529, 81,
+44529, 2, 19, 18423, 86, 18423, 2, 31, 9060, 98,
+ 9060, 4, 38, 51310, 56, 54905, 105, 51310, 123, 54905,
+ 2, 53, 36853, 120, 36853, 2, 28, 12650, 95, 12650,
+ 2, 25, 49391, 92, 49391, 4, 3, 8889, 36, 2074,
+ 70, 8889, 103, 2074, 2, 11, 41647, 78, 41647, 2,
+ 27, 61351, 94, 61351, 2, 57, 53961, 124, 53961, 4,
+ 29, 35592, 62, 39894, 96, 35592, 129, 39894, 4, 58,
+63625, 66, 4854, 125, 63625, 133, 4854, 2, 23, 3839,
+ 90, 3839, 2, 7, 47535, 74, 47535, 2, 65, 60343,
+ 132, 60343, 4, 13, 11749, 24, 33037, 80, 11749, 91,
+33037, 2, 43, 10858, 110, 10858, 4, 46, 12402, 60,
+56425, 113, 12402, 127, 56425, 2, 41, 33215, 108, 33215,
+ 2, 9, 55407, 76, 55407, 2, 18, 24544, 85, 24544,
+ 4, 15, 18387, 64, 26084, 82, 18387, 131, 26084, 2,
+ 22, 11936, 89, 11936, 2, 39, 4916, 106, 4916, 2,
+ 21, 2119, 88, 2119, 2, 44, 31690, 111, 31690, 2,
+ 5, 43815, 72, 43815, 2, 61, 56412, 128, 56412, 2,
+ 42, 5999, 109, 5999, 4, 35, 54543, 54, 32642, 102,
+54543, 121, 32642, 2, 49, 36866, 116, 36866, 2, 55,
+49788, 122, 49788, 2, 2, 45710, 69, 45710, 4, 37,
+12849, 59, 46018, 104, 12849, 126, 46018, 2, 63, 10735,
+ 130, 10735, 2, 20, 51436, 87, 51436,
};
-vtkDICOMDictionary::Dict Dict154Data = {
+vtkDICOMDictionary::Dict Dict160Data = {
"PRIVATE_CODE_STRING_1001",
-67,
-67,
-Dict154TagHashTable,
-Dict154KeyHashTable,
-Dict154Contents
+134,
+134,
+Dict160TagHashTable,
+Dict160KeyHashTable,
+Dict160Contents
};
// ----- SIEMENS MR EXTRACTED CSA HEADER -----
-DictEntry Dict155Contents[] = {
+const DictEntry Dict161Contents[] = {
{ 0x0025, 0x0001, 0, VR::SQ, VM::M1, "ExtractedMRHeaderInformationSequence" },
{ 0x0025, 0x0002, 0, VR::LO, VM::M1, "ExtractedMRHeaderCreatorIdentificationCode" },
{ 0x0025, 0x0003, 0, VR::AT, VM::M1, "ExtractedMRHeaderTag" },
};
-unsigned short Dict155TagHashTable[] = {
+const unsigned short Dict161TagHashTable[] = {
4, 3, 9, 0, 2, 0, 1, 1, 2, 1,
2, 3,
};
-unsigned short Dict155KeyHashTable[] = {
+const unsigned short Dict161KeyHashTable[] = {
4, 7, 3, 0, 1, 2, 9615, 2, 0, 12741,
1, 45335,
};
-vtkDICOMDictionary::Dict Dict155Data = {
+vtkDICOMDictionary::Dict Dict161Data = {
"SIEMENS MR EXTRACTED CSA HEADER",
3,
3,
-Dict155TagHashTable,
-Dict155KeyHashTable,
-Dict155Contents
+Dict161TagHashTable,
+Dict161KeyHashTable,
+Dict161Contents
};
// ----- KRETZ_US -----
-DictEntry Dict156Contents[] = {
+const DictEntry Dict162Contents[] = {
{ 0x7fe1, 0x0001, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict156TagHashTable[] = {
+const unsigned short Dict162TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict156KeyHashTable[] = {
+const unsigned short Dict162KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict156Data = {
+vtkDICOMDictionary::Dict Dict162Data = {
"KRETZ_US",
1,
1,
-Dict156TagHashTable,
-Dict156KeyHashTable,
-Dict156Contents
+Dict162TagHashTable,
+Dict162KeyHashTable,
+Dict162Contents
};
// ----- GEIIS PACS -----
-DictEntry Dict157Contents[] = {
+const DictEntry Dict163Contents[] = {
{ 0x0903, 0x0010, 0, VR::US, VM::M1, "RejectImageFlag" },
{ 0x0903, 0x0011, 0, VR::US, VM::M1, "SignificantFlag" },
{ 0x0903, 0x0012, 0, VR::US, VM::M1, "ConfidentialFlag" },
@@ -9612,32 +10189,32 @@ DictEntry Dict157Contents[] = {
{ 0x0907, 0x0031, 0, VR::UI, VM::M1TN, "ExcludeStudyUIDs" },
};
-unsigned short Dict157TagHashTable[] = {
+const unsigned short Dict163TagHashTable[] = {
10, 17, 22, 9, 9, 9, 9, 25, 30, 0,
3, 1, 17, 6, 35, 8, 49, 2, 0, 16,
5, 34, 1, 4, 33, 2, 3, 32, 7, 36,
1, 2, 18,
};
-unsigned short Dict157KeyHashTable[] = {
+const unsigned short Dict163KeyHashTable[] = {
10, 9, 9, 13, 9, 16, 19, 22, 29, 0,
1, 8, 17205, 1, 4, 31146, 1, 0, 35306, 1,
5, 48128, 3, 1, 7407, 6, 21601, 7, 57919, 2,
2, 34991, 3, 597,
};
-vtkDICOMDictionary::Dict Dict157Data = {
+vtkDICOMDictionary::Dict Dict163Data = {
"GEIIS PACS",
9,
9,
-Dict157TagHashTable,
-Dict157KeyHashTable,
-Dict157Contents
+Dict163TagHashTable,
+Dict163KeyHashTable,
+Dict163Contents
};
// ----- PRIVATE_CODE_STRING_0021 -----
-DictEntry Dict158Contents[] = {
+const DictEntry Dict164Contents[] = {
{ 0x0021, 0x0070, 0, VR::FD, VM::M1, "DistanceBasePlaneToTemplate" },
{ 0x0021, 0x0071, 0, VR::FD, VM::M16, "VolumeToPatientMatrix" },
{ 0x0021, 0x0072, 0, VR::FD, VM::M16, "PatientToWorldMatrix" },
@@ -9647,30 +10224,30 @@ DictEntry Dict158Contents[] = {
{ 0x0021, 0x0076, 0, VR::FD, VM::M1, "BasePlaneOffset" },
};
-unsigned short Dict158TagHashTable[] = {
+const unsigned short Dict164TagHashTable[] = {
8, 11, 14, 17, 20, 23, 26, 0, 1, 4,
116, 1, 5, 117, 1, 6, 118, 1, 0, 112,
1, 1, 113, 1, 2, 114, 1, 3, 115,
};
-unsigned short Dict158KeyHashTable[] = {
+const unsigned short Dict164KeyHashTable[] = {
8, 11, 14, 17, 7, 20, 25, 0, 1, 3,
20656, 1, 2, 38847, 1, 4, 15502, 1, 6, 44588,
2, 0, 47747, 1, 60787, 1, 5, 64891,
};
-vtkDICOMDictionary::Dict Dict158Data = {
+vtkDICOMDictionary::Dict Dict164Data = {
"PRIVATE_CODE_STRING_0021",
7,
7,
-Dict158TagHashTable,
-Dict158KeyHashTable,
-Dict158Contents
+Dict164TagHashTable,
+Dict164KeyHashTable,
+Dict164Contents
};
// ----- SIEMENS CT VA0 IDE -----
-DictEntry Dict159Contents[] = {
+const DictEntry Dict165Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0030, 0, VR::CS, VM::M1, "" },
{ 0x0009, 0x0031, 0, VR::SH, VM::M1, "" },
@@ -9682,55 +10259,55 @@ DictEntry Dict159Contents[] = {
{ 0x0009, 0x0051, 0, VR::TM, VM::M1, "" },
};
-unsigned short Dict159TagHashTable[] = {
+const unsigned short Dict165TagHashTable[] = {
10, 9, 13, 18, 9, 21, 9, 24, 31, 0,
1, 5, 64, 2, 2, 49, 6, 66, 1, 1,
48, 1, 3, 50, 3, 0, 16, 4, 52, 7,
80, 1, 8, 81,
};
-unsigned short Dict159KeyHashTable[] = {
+const unsigned short Dict165KeyHashTable[] = {
9, 9, 9, 9, 9, 9, 9, 9, 10, 0,
9, 0, 597, 1, 597, 2, 597, 3, 597, 4,
597, 5, 597, 6, 597, 7, 597, 8, 597,
};
-vtkDICOMDictionary::Dict Dict159Data = {
+vtkDICOMDictionary::Dict Dict165Data = {
"SIEMENS CT VA0 IDE",
9,
9,
-Dict159TagHashTable,
-Dict159KeyHashTable,
-Dict159Contents
+Dict165TagHashTable,
+Dict165KeyHashTable,
+Dict165Contents
};
// ----- SCHICK TECHNOLOGIES - Note List Creator ID -----
-DictEntry Dict160Contents[] = {
+const DictEntry Dict166Contents[] = {
{ 0x0021, 0x0001, 0, VR::UI, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict160TagHashTable[] = {
+const unsigned short Dict166TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 2,
};
-unsigned short Dict160KeyHashTable[] = {
+const unsigned short Dict166KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict160Data = {
+vtkDICOMDictionary::Dict Dict166Data = {
"SCHICK TECHNOLOGIES - Note List Creator ID",
2,
2,
-Dict160TagHashTable,
-Dict160KeyHashTable,
-Dict160Contents
+Dict166TagHashTable,
+Dict166KeyHashTable,
+Dict166Contents
};
// ----- Mortara_Inc -----
-DictEntry Dict161Contents[] = {
+const DictEntry Dict167Contents[] = {
{ 0x1455, 0x0000, 0, VR::OW, VM::M1, "ELIInterpretationVector" },
{ 0x1455, 0x0001, 0, VR::UN, VM::M1, "CustomID" },
{ 0x1455, 0x0002, 0, VR::UT, VM::M1, "Race" },
@@ -9743,32 +10320,32 @@ DictEntry Dict161Contents[] = {
{ 0x1455, 0x0010, 0, VR::LO, VM::M1, "ManufacturerName" },
};
-unsigned short Dict161TagHashTable[] = {
+const unsigned short Dict167TagHashTable[] = {
11, 16, 19, 24, 27, 30, 33, 36, 10, 10,
0, 2, 4, 4, 9, 16, 1, 5, 5, 2,
6, 6, 8, 8, 1, 7, 7, 1, 0, 0,
1, 1, 1, 1, 2, 2, 1, 3, 3,
};
-unsigned short Dict161KeyHashTable[] = {
+const unsigned short Dict167KeyHashTable[] = {
11, 16, 10, 23, 28, 10, 10, 10, 10, 31,
0, 2, 2, 24176, 6, 8606, 3, 4, 51201, 7,
8606, 9, 49301, 2, 1, 44833, 8, 41000, 1, 0,
15367, 2, 3, 19436, 5, 48235,
};
-vtkDICOMDictionary::Dict Dict161Data = {
+vtkDICOMDictionary::Dict Dict167Data = {
"Mortara_Inc",
10,
10,
-Dict161TagHashTable,
-Dict161KeyHashTable,
-Dict161Contents
+Dict167TagHashTable,
+Dict167KeyHashTable,
+Dict167Contents
};
// ----- SMIL_PB79 -----
-DictEntry Dict162Contents[] = {
+const DictEntry Dict168Contents[] = {
{ 0x0079, 0x0000, 0, VR::LO, VM::M1, "Analgesia" },
{ 0x0079, 0x0001, 0, VR::LO, VM::M1, "Anesthesia" },
{ 0x0079, 0x0002, 0, VR::IS, VM::M1, "BedMotion" },
@@ -9793,7 +10370,7 @@ DictEntry Dict162Contents[] = {
{ 0x0079, 0x0017, 0, VR::IS, VM::M1, "SubjectOrientation" },
};
-unsigned short Dict162TagHashTable[] = {
+const unsigned short Dict168TagHashTable[] = {
22, 23, 26, 29, 32, 35, 38, 41, 44, 47,
50, 53, 56, 59, 62, 22, 65, 70, 75, 78,
81, 84, 0, 1, 21, 23, 1, 7, 8, 1,
@@ -9805,7 +10382,7 @@ unsigned short Dict162TagHashTable[] = {
19, 1, 19, 20, 1, 20, 21,
};
-unsigned short Dict162KeyHashTable[] = {
+const unsigned short Dict168KeyHashTable[] = {
23, 22, 22, 28, 35, 42, 45, 48, 22, 51,
22, 22, 22, 54, 57, 60, 63, 66, 69, 72,
77, 80, 0, 2, 1, 9743, 2, 22793, 3, 3,
@@ -9817,64 +10394,64 @@ unsigned short Dict162KeyHashTable[] = {
1, 15, 9402,
};
-vtkDICOMDictionary::Dict Dict162Data = {
+vtkDICOMDictionary::Dict Dict168Data = {
"SMIL_PB79",
22,
22,
-Dict162TagHashTable,
-Dict162KeyHashTable,
-Dict162Contents
+Dict168TagHashTable,
+Dict168KeyHashTable,
+Dict168Contents
};
// ----- SIEMENS IKM CKS LUNGCAD BMK -----
-DictEntry Dict163Contents[] = {
+const DictEntry Dict169Contents[] = {
{ 0x0029, 0x0001, 0, VR::UT, VM::M1, "" },
};
-unsigned short Dict163TagHashTable[] = {
+const unsigned short Dict169TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict163KeyHashTable[] = {
+const unsigned short Dict169KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict163Data = {
+vtkDICOMDictionary::Dict Dict169Data = {
"SIEMENS IKM CKS LUNGCAD BMK",
1,
1,
-Dict163TagHashTable,
-Dict163KeyHashTable,
-Dict163Contents
+Dict169TagHashTable,
+Dict169KeyHashTable,
+Dict169Contents
};
// ----- APEX_PRIVATE -----
-DictEntry Dict164Contents[] = {
+const DictEntry Dict170Contents[] = {
{ 0x0027, 0x0011, 0, VR::DS, VM::M1, "BedPosition" },
};
-unsigned short Dict164TagHashTable[] = {
+const unsigned short Dict170TagHashTable[] = {
2, 0, 1, 0, 17,
};
-unsigned short Dict164KeyHashTable[] = {
+const unsigned short Dict170KeyHashTable[] = {
2, 0, 1, 0, 32165,
};
-vtkDICOMDictionary::Dict Dict164Data = {
+vtkDICOMDictionary::Dict Dict170Data = {
"APEX_PRIVATE",
1,
1,
-Dict164TagHashTable,
-Dict164KeyHashTable,
-Dict164Contents
+Dict170TagHashTable,
+Dict170KeyHashTable,
+Dict170Contents
};
// ----- PRIVATE_CODE_STRING_0019 -----
-DictEntry Dict165Contents[] = {
+const DictEntry Dict171Contents[] = {
{ 0x0019, 0x0000, 0, VR::FD, VM::M1, "Calibration" },
{ 0x0019, 0x0001, 0, VR::FD, VM::M1, "DepthConversion" },
{ 0x0019, 0x0002, 0, VR::FD, VM::M1, "Stepsize" },
@@ -9882,28 +10459,28 @@ DictEntry Dict165Contents[] = {
{ 0x0019, 0x0004, 0, VR::ST, VM::M1, "DataID" },
};
-unsigned short Dict165TagHashTable[] = {
+const unsigned short Dict171TagHashTable[] = {
6, 9, 12, 5, 15, 0, 1, 0, 0, 1,
3, 3, 1, 2, 2, 2, 1, 1, 4, 4,
};
-unsigned short Dict165KeyHashTable[] = {
+const unsigned short Dict171KeyHashTable[] = {
5, 6, 9, 5, 12, 0, 1, 3, 61458, 1,
1, 32134, 3, 0, 16277, 2, 5976, 4, 30856,
};
-vtkDICOMDictionary::Dict Dict165Data = {
+vtkDICOMDictionary::Dict Dict171Data = {
"PRIVATE_CODE_STRING_0019",
5,
5,
-Dict165TagHashTable,
-Dict165KeyHashTable,
-Dict165Contents
+Dict171TagHashTable,
+Dict171KeyHashTable,
+Dict171Contents
};
// ----- GEMS_IMAG_01 -----
-DictEntry Dict166Contents[] = {
+const DictEntry Dict172Contents[] = {
{ 0x0027, 0x0006, 0, VR::SL, VM::M1, "ImageArchiveFlag" },
{ 0x0027, 0x0010, 0, VR::SS, VM::M1, "ScoutType" },
{ 0x0027, 0x001c, 0, VR::SL, VM::M1, "VmaMamp" },
@@ -9942,7 +10519,7 @@ DictEntry Dict166Contents[] = {
{ 0x0027, 0x0062, 0, VR::FL, VM::M1, "NumberOfExcitations" },
};
-unsigned short Dict166TagHashTable[] = {
+const unsigned short Dict172TagHashTable[] = {
37, 40, 43, 46, 36, 36, 49, 52, 57, 60,
63, 66, 36, 36, 36, 36, 36, 69, 72, 75,
78, 83, 88, 93, 98, 101, 104, 107, 110, 113,
@@ -9959,7 +10536,7 @@ unsigned short Dict166TagHashTable[] = {
76, 33, 96, 2, 26, 77, 34, 97,
};
-unsigned short Dict166KeyHashTable[] = {
+const unsigned short Dict172KeyHashTable[] = {
36, 37, 36, 42, 47, 50, 53, 36, 60, 63,
68, 71, 76, 36, 81, 36, 84, 87, 90, 36,
93, 98, 36, 36, 103, 36, 36, 106, 109, 36,
@@ -9976,18 +10553,18 @@ unsigned short Dict166KeyHashTable[] = {
16095, 34, 5761,
};
-vtkDICOMDictionary::Dict Dict166Data = {
+vtkDICOMDictionary::Dict Dict172Data = {
"GEMS_IMAG_01",
36,
36,
-Dict166TagHashTable,
-Dict166KeyHashTable,
-Dict166Contents
+Dict172TagHashTable,
+Dict172KeyHashTable,
+Dict172Contents
};
// ----- Silhouette ROI V1.0 -----
-DictEntry Dict167Contents[] = {
+const DictEntry Dict173Contents[] = {
{ 0x0029, 0x0011, 0, VR::IS, VM::M1, "ROIName" },
{ 0x0029, 0x0012, 0, VR::LT, VM::M1, "ROINameFont" },
{ 0x0029, 0x0013, 0, VR::LT, VM::M1, "ROINormalColor" },
@@ -10014,7 +10591,7 @@ DictEntry Dict167Contents[] = {
{ 0x0029, 0x0034, 0, VR::UL, VM::M1, "ROIDontSave" },
};
-unsigned short Dict167TagHashTable[] = {
+const unsigned short Dict173TagHashTable[] = {
25, 32, 39, 42, 24, 45, 24, 24, 48, 53,
56, 61, 66, 71, 76, 81, 24, 24, 24, 24,
24, 24, 24, 24, 0, 3, 8, 25, 18, 41,
@@ -10026,7 +10603,7 @@ unsigned short Dict167TagHashTable[] = {
39, 2, 5, 22, 15, 38,
};
-unsigned short Dict167KeyHashTable[] = {
+const unsigned short Dict173KeyHashTable[] = {
25, 24, 30, 33, 36, 39, 42, 45, 48, 24,
24, 51, 24, 54, 57, 24, 62, 65, 24, 70,
73, 76, 79, 82, 0, 2, 0, 32878, 4, 10856,
@@ -10039,18 +10616,18 @@ unsigned short Dict167KeyHashTable[] = {
15238,
};
-vtkDICOMDictionary::Dict Dict167Data = {
+vtkDICOMDictionary::Dict Dict173Data = {
"Silhouette ROI V1.0",
24,
24,
-Dict167TagHashTable,
-Dict167KeyHashTable,
-Dict167Contents
+Dict173TagHashTable,
+Dict173KeyHashTable,
+Dict173Contents
};
// ----- DZDICOM 4.3.0 -----
-DictEntry Dict168Contents[] = {
+const DictEntry Dict174Contents[] = {
{ 0x0009, 0x0001, 0, VR::UI, VM::M1, "" },
{ 0x0009, 0x0002, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0003, 0, VR::LO, VM::M1, "" },
@@ -10078,7 +10655,7 @@ DictEntry Dict168Contents[] = {
{ 0x0009, 0x00f9, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict168TagHashTable[] = {
+const unsigned short Dict174TagHashTable[] = {
25, 26, 33, 36, 41, 44, 47, 25, 50, 25,
53, 56, 59, 62, 65, 70, 25, 25, 73, 76,
79, 84, 87, 25, 90, 0, 3, 7, 8, 10,
@@ -10091,7 +10668,7 @@ unsigned short Dict168TagHashTable[] = {
2, 8, 17, 18, 116,
};
-unsigned short Dict168KeyHashTable[] = {
+const unsigned short Dict174KeyHashTable[] = {
25, 25, 25, 25, 25, 25, 26, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 0, 25, 0, 215, 1,
@@ -10102,18 +10679,18 @@ unsigned short Dict168KeyHashTable[] = {
215, 22, 215, 23, 215, 24, 215,
};
-vtkDICOMDictionary::Dict Dict168Data = {
+vtkDICOMDictionary::Dict Dict174Data = {
"DZDICOM 4.3.0",
25,
25,
-Dict168TagHashTable,
-Dict168KeyHashTable,
-Dict168Contents
+Dict174TagHashTable,
+Dict174KeyHashTable,
+Dict174Contents
};
// ----- SIEMENS SERIES SHADOW ATTRIBUTES -----
-DictEntry Dict169Contents[] = {
+const DictEntry Dict175Contents[] = {
{ 0x0021, 0x0001, 0, VR::IS, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::DS, VM::M1TN, "" },
{ 0x0021, 0x0003, 0, VR::OB, VM::M1, "" },
@@ -10163,7 +10740,7 @@ DictEntry Dict169Contents[] = {
{ 0x0021, 0x003b, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict169TagHashTable[] = {
+const unsigned short Dict175TagHashTable[] = {
47, 48, 51, 56, 61, 47, 66, 71, 76, 79,
82, 87, 92, 97, 102, 107, 112, 115, 118, 121,
124, 127, 47, 130, 47, 133, 136, 47, 47, 47,
@@ -10184,7 +10761,7 @@ unsigned short Dict169TagHashTable[] = {
11, 13, 1, 10, 12, 1, 12, 15,
};
-unsigned short Dict169KeyHashTable[] = {
+const unsigned short Dict175KeyHashTable[] = {
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
47, 47, 47, 48, 47, 47, 47, 47, 47, 47,
@@ -10202,41 +10779,41 @@ unsigned short Dict169KeyHashTable[] = {
114, 46, 114,
};
-vtkDICOMDictionary::Dict Dict169Data = {
+vtkDICOMDictionary::Dict Dict175Data = {
"SIEMENS SERIES SHADOW ATTRIBUTES",
47,
47,
-Dict169TagHashTable,
-Dict169KeyHashTable,
-Dict169Contents
+Dict175TagHashTable,
+Dict175KeyHashTable,
+Dict175Contents
};
// ----- DL_INTERNAL_USE -----
-DictEntry Dict170Contents[] = {
+const DictEntry Dict176Contents[] = {
{ 0x0015, 0x008f, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict170TagHashTable[] = {
+const unsigned short Dict176TagHashTable[] = {
2, 0, 1, 0, 143,
};
-unsigned short Dict170KeyHashTable[] = {
+const unsigned short Dict176KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict170Data = {
+vtkDICOMDictionary::Dict Dict176Data = {
"DL_INTERNAL_USE",
1,
1,
-Dict170TagHashTable,
-Dict170KeyHashTable,
-Dict170Contents
+Dict176TagHashTable,
+Dict176KeyHashTable,
+Dict176Contents
};
// ----- HOLOGIC, Inc. -----
-DictEntry Dict171Contents[] = {
+const DictEntry Dict177Contents[] = {
{ 0x0019, 0x0001, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::IS, VM::M1, "" },
@@ -10294,7 +10871,7 @@ DictEntry Dict171Contents[] = {
{ 0x7f01, 0x0012, 0, VR::OB, VM::M1, "CodecContent" },
};
-unsigned short Dict171TagHashTable[] = {
+const unsigned short Dict177TagHashTable[] = {
55, 55, 55, 56, 55, 59, 62, 65, 68, 55,
71, 74, 77, 55, 55, 80, 55, 83, 88, 91,
96, 101, 104, 55, 107, 55, 110, 113, 55, 116,
@@ -10318,7 +10895,7 @@ unsigned short Dict171TagHashTable[] = {
112, 1, 35, 113,
};
-unsigned short Dict171KeyHashTable[] = {
+const unsigned short Dict177KeyHashTable[] = {
56, 55, 55, 55, 55, 63, 70, 55, 55, 55,
55, 55, 75, 55, 84, 55, 55, 87, 55, 92,
95, 55, 98, 103, 55, 55, 106, 109, 120, 123,
@@ -10341,41 +10918,41 @@ unsigned short Dict171KeyHashTable[] = {
1, 39, 35678,
};
-vtkDICOMDictionary::Dict Dict171Data = {
+vtkDICOMDictionary::Dict Dict177Data = {
"HOLOGIC, Inc.",
55,
55,
-Dict171TagHashTable,
-Dict171KeyHashTable,
-Dict171Contents
+Dict177TagHashTable,
+Dict177KeyHashTable,
+Dict177Contents
};
// ----- AMI StudyExtensions_01 -----
-DictEntry Dict172Contents[] = {
-{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "Last Released Annot Label" },
+const DictEntry Dict178Contents[] = {
+{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "LastReleasedAnnotLabel" },
};
-unsigned short Dict172TagHashTable[] = {
+const unsigned short Dict178TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict172KeyHashTable[] = {
- 2, 0, 1, 0, 56990,
+const unsigned short Dict178KeyHashTable[] = {
+ 2, 0, 1, 0, 5022,
};
-vtkDICOMDictionary::Dict Dict172Data = {
+vtkDICOMDictionary::Dict Dict178Data = {
"AMI StudyExtensions_01",
1,
1,
-Dict172TagHashTable,
-Dict172KeyHashTable,
-Dict172Contents
+Dict178TagHashTable,
+Dict178KeyHashTable,
+Dict178Contents
};
// ----- SPI-P-Private-DCI Release 1 -----
-DictEntry Dict173Contents[] = {
+const DictEntry Dict179Contents[] = {
{ 0x0019, 0x0010, 0, VR::UN, VM::M1, "ECGTimeMapDataBitsAllocated" },
{ 0x0019, 0x0011, 0, VR::UN, VM::M1, "ECGTimeMapDataBitsStored" },
{ 0x0019, 0x0012, 0, VR::UN, VM::M1, "ECGTimeMapDataHighBit" },
@@ -10386,31 +10963,31 @@ DictEntry Dict173Contents[] = {
{ 0x0019, 0x0017, 0, VR::UN, VM::M1, "ECGTimeMapData" },
};
-unsigned short Dict173TagHashTable[] = {
+const unsigned short Dict179TagHashTable[] = {
9, 12, 15, 18, 21, 24, 27, 30, 0, 1,
1, 17, 1, 0, 16, 1, 3, 19, 1, 2,
18, 1, 5, 21, 1, 4, 20, 1, 7, 23,
1, 6, 22,
};
-unsigned short Dict173KeyHashTable[] = {
+const unsigned short Dict179KeyHashTable[] = {
8, 8, 9, 12, 17, 8, 20, 27, 0, 1,
2, 29379, 2, 6, 7908, 7, 35587, 1, 5, 27872,
3, 0, 64646, 1, 8751, 3, 48465, 1, 4, 9486,
};
-vtkDICOMDictionary::Dict Dict173Data = {
+vtkDICOMDictionary::Dict Dict179Data = {
"SPI-P-Private-DCI Release 1",
8,
8,
-Dict173TagHashTable,
-Dict173KeyHashTable,
-Dict173Contents
+Dict179TagHashTable,
+Dict179KeyHashTable,
+Dict179Contents
};
// ----- GEMS_FALCON_03 -----
-DictEntry Dict174Contents[] = {
+const DictEntry Dict180Contents[] = {
{ 0x0045, 0x0055, 0, VR::DS, VM::M8, "A_Coefficients" },
{ 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" },
{ 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" },
@@ -10421,30 +10998,30 @@ DictEntry Dict174Contents[] = {
{ 0x0045, 0x0073, 0, VR::IS, VM::M1, "CollimatorHeight" },
};
-unsigned short Dict174TagHashTable[] = {
+const unsigned short Dict180TagHashTable[] = {
9, 8, 14, 8, 17, 8, 20, 25, 0, 2,
0, 85, 3, 101, 1, 4, 103, 1, 5, 105,
2, 2, 99, 7, 115, 2, 1, 98, 6, 114,
};
-unsigned short Dict174KeyHashTable[] = {
+const unsigned short Dict180KeyHashTable[] = {
8, 8, 8, 9, 16, 23, 8, 26, 0, 3,
4, 5352, 5, 13265, 6, 22843, 3, 2, 29079, 3,
16921, 7, 6426, 1, 1, 25135, 1, 0, 59138,
};
-vtkDICOMDictionary::Dict Dict174Data = {
+vtkDICOMDictionary::Dict Dict180Data = {
"GEMS_FALCON_03",
8,
8,
-Dict174TagHashTable,
-Dict174KeyHashTable,
-Dict174Contents
+Dict180TagHashTable,
+Dict180KeyHashTable,
+Dict180Contents
};
// ----- SIEMENS CM VA0 CMS -----
-DictEntry Dict175Contents[] = {
+const DictEntry Dict181Contents[] = {
{ 0x0009, 0x0000, 0, VR::DS, VM::M1, "NumberOfMeasurements" },
{ 0x0009, 0x0010, 0, VR::CS, VM::M1, "StorageMode" },
{ 0x0009, 0x0012, 0, VR::UL, VM::M1, "EvaluationMaskImage" },
@@ -10517,7 +11094,7 @@ DictEntry Dict175Contents[] = {
{ 0x7fe1, 0x0000, 0, VR::OB, VM::M1TN, "BinaryData" },
};
-unsigned short Dict175TagHashTable[] = {
+const unsigned short Dict181TagHashTable[] = {
71, 76, 85, 90, 97, 100, 70, 105, 70, 108,
115, 122, 127, 70, 130, 133, 136, 141, 70, 144,
70, 151, 70, 154, 70, 157, 70, 160, 70, 70,
@@ -10546,7 +11123,7 @@ unsigned short Dict175TagHashTable[] = {
86, 1, 49, 101,
};
-unsigned short Dict175KeyHashTable[] = {
+const unsigned short Dict181KeyHashTable[] = {
71, 70, 76, 79, 86, 70, 89, 92, 70, 70,
70, 70, 70, 95, 106, 113, 70, 116, 70, 119,
122, 70, 70, 125, 70, 128, 131, 70, 134, 70,
@@ -10575,67 +11152,67 @@ unsigned short Dict175KeyHashTable[] = {
1, 9, 24952,
};
-vtkDICOMDictionary::Dict Dict175Data = {
+vtkDICOMDictionary::Dict Dict181Data = {
"SIEMENS CM VA0 CMS",
70,
70,
-Dict175TagHashTable,
-Dict175KeyHashTable,
-Dict175Contents
+Dict181TagHashTable,
+Dict181KeyHashTable,
+Dict181Contents
};
// ----- PHILIPS MR/PART 7 -----
-DictEntry Dict176Contents[] = {
+const DictEntry Dict182Contents[] = {
{ 0x0019, 0x0000, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict176TagHashTable[] = {
+const unsigned short Dict182TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict176KeyHashTable[] = {
+const unsigned short Dict182KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict176Data = {
+vtkDICOMDictionary::Dict Dict182Data = {
"PHILIPS MR/PART 7",
1,
1,
-Dict176TagHashTable,
-Dict176KeyHashTable,
-Dict176Contents
+Dict182TagHashTable,
+Dict182KeyHashTable,
+Dict182Contents
};
// ----- PHILIPS MR/PART 6 -----
-DictEntry Dict177Contents[] = {
+const DictEntry Dict183Contents[] = {
{ 0x0019, 0x0010, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict177TagHashTable[] = {
+const unsigned short Dict183TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict177KeyHashTable[] = {
+const unsigned short Dict183KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict177Data = {
+vtkDICOMDictionary::Dict Dict183Data = {
"PHILIPS MR/PART 6",
1,
1,
-Dict177TagHashTable,
-Dict177KeyHashTable,
-Dict177Contents
+Dict183TagHashTable,
+Dict183KeyHashTable,
+Dict183Contents
};
// ----- PHILIPS MR/PART -----
-DictEntry Dict178Contents[] = {
+const DictEntry Dict184Contents[] = {
{ 0x0019, 0x0000, 0, VR::IS, VM::M1, "NumberOfStacks" },
{ 0x0019, 0x0001, 0, VR::IS, VM::M1TN, "StackType" },
-{ 0x0019, 0x0002, 0, VR::IS, VM::M1TN, "" },
+{ 0x0019, 0x0002, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0005, 0, VR::DS, VM::M1, "CCAngulation" },
{ 0x0019, 0x0006, 0, VR::DS, VM::M1, "APAngulation" },
@@ -10659,10 +11236,10 @@ DictEntry Dict178Contents[] = {
{ 0x0019, 0x001c, 0, VR::CS, VM::M1, "" },
{ 0x0019, 0x001d, 0, VR::CS, VM::M1, "" },
{ 0x0019, 0x001e, 0, VR::DS, VM::M1, "" },
-{ 0x0019, 0x0021, 0, VR::DS, VM::M1TN, "" },
+{ 0x0019, 0x0021, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0022, 0, VR::DS, VM::M1, "DynamicScanTimeBegin" },
{ 0x0019, 0x0023, 0, VR::DS, VM::M1TN, "" },
-{ 0x0019, 0x0024, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x0024, 0, VR::DS, VM::M1TN, "" },
{ 0x0019, 0x0025, 0, VR::DS, VM::M1TN, "" },
{ 0x0019, 0x0026, 0, VR::DS, VM::M1TN, "" },
{ 0x0019, 0x0027, 0, VR::DS, VM::M1TN, "" },
@@ -10672,7 +11249,7 @@ DictEntry Dict178Contents[] = {
{ 0x0019, 0x0031, 0, VR::DS, VM::M1TN, "" },
{ 0x0019, 0x0040, 0, VR::US, VM::M1, "" },
{ 0x0019, 0x0045, 0, VR::IS, VM::M1, "ReconstructionResolution" },
-{ 0x0019, 0x0050, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x0050, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0051, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0052, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0053, 0, VR::IS, VM::M1, "" },
@@ -10686,7 +11263,7 @@ DictEntry Dict178Contents[] = {
{ 0x0019, 0x0061, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0062, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0063, 0, VR::DS, VM::M1, "" },
-{ 0x0019, 0x0064, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x0064, 0, VR::DS, VM::M1, "RepetitionTimeSE" },
{ 0x0019, 0x0065, 0, VR::DS, VM::M1, "RepetitionTimeIR" },
{ 0x0019, 0x0066, 0, VR::US, VM::M1, "" },
{ 0x0019, 0x0067, 0, VR::US, VM::M1, "" },
@@ -10748,10 +11325,10 @@ DictEntry Dict178Contents[] = {
{ 0x0019, 0x00da, 0, VR::IS, VM::M1, "TurboFactor" },
{ 0x0019, 0x00db, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x00e0, 0, VR::IS, VM::M1, "PrepulseType" },
-{ 0x0019, 0x00e1, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x00e1, 0, VR::DS, VM::M1, "PrepulseDelay" },
{ 0x0019, 0x00e3, 0, VR::DS, VM::M1, "PhaseContrastVelocity" },
{ 0x0019, 0x00fc, 0, VR::IS, VM::M1, "ResonanceFrequency" },
-{ 0x0021, 0x0000, 0, VR::IS, VM::M1, "ReconstructionNumber" },
+{ 0x0021, 0x0000, 0, VR::DA, VM::M1, "SeriesDate" },
{ 0x0021, 0x0006, 0, VR::LO, VM::M1, "" },
{ 0x0021, 0x0008, 0, VR::LO, VM::M1, "" },
{ 0x0021, 0x0009, 0, VR::CS, VM::M1, "" },
@@ -10786,7 +11363,7 @@ DictEntry Dict178Contents[] = {
{ 0x0029, 0x00d5, 0, VR::LT, VM::M1, "SliceThickness" },
};
-unsigned short Dict178TagHashTable[] = {
+const unsigned short Dict184TagHashTable[] = {
152, 159, 164, 167, 172, 177, 151, 180, 185, 190,
151, 151, 195, 198, 151, 151, 201, 206, 211, 214,
217, 222, 225, 230, 235, 242, 245, 248, 253, 151,
@@ -10845,7 +11422,7 @@ unsigned short Dict178TagHashTable[] = {
72, 142, 1, 71, 141,
};
-unsigned short Dict178KeyHashTable[] = {
+const unsigned short Dict184KeyHashTable[] = {
151, 152, 151, 151, 151, 151, 151, 151, 151, 151,
151, 151, 151, 151, 151, 151, 151, 151, 151, 155,
151, 151, 151, 151, 160, 151, 163, 151, 166, 151,
@@ -10855,11 +11432,11 @@ unsigned short Dict178KeyHashTable[] = {
151, 151, 201, 204, 207, 151, 151, 151, 151, 151,
210, 151, 151, 151, 215, 151, 218, 151, 151, 151,
221, 224, 151, 229, 151, 151, 236, 151, 151, 239,
- 151, 151, 151, 244, 151, 247, 250, 151, 427, 151,
- 151, 151, 151, 430, 151, 151, 151, 151, 151, 439,
- 442, 445, 448, 451, 151, 151, 151, 151, 454, 459,
- 151, 151, 151, 151, 462, 151, 151, 151, 465, 468,
- 151, 471, 151, 151, 151, 474, 477, 482, 151, 485,
+ 151, 151, 151, 244, 151, 247, 250, 151, 423, 151,
+ 151, 151, 151, 426, 151, 151, 151, 151, 151, 435,
+ 440, 443, 446, 449, 151, 151, 151, 151, 452, 457,
+ 151, 151, 151, 151, 460, 151, 151, 151, 463, 466,
+ 151, 469, 151, 151, 151, 474, 477, 482, 151, 485,
151, 151, 151, 490, 495, 498, 501, 151, 151, 151,
151, 0, 1, 18, 49582, 2, 67, 44003, 134, 46911,
1, 19, 2734, 1, 1, 757, 1, 57, 46573, 1,
@@ -10871,46 +11448,46 @@ unsigned short Dict178KeyHashTable[] = {
16359, 1, 110, 12083, 2, 116, 36718, 150, 62416, 3,
7, 38884, 97, 27911, 105, 4802, 1, 62, 39687, 2,
9, 1016, 117, 48580, 1, 60, 65032, 1, 98, 38247,
- 88, 2, 35, 3, 35, 13, 35, 17, 35, 23,
+ 86, 2, 35, 3, 35, 13, 35, 17, 35, 23,
35, 24, 35, 25, 35, 26, 35, 28, 35, 29,
35, 30, 35, 31, 35, 32, 35, 33, 35, 34,
35, 35, 35, 36, 35, 37, 35, 39, 35, 40,
35, 41, 35, 42, 35, 43, 35, 44, 35, 45,
35, 46, 35, 47, 35, 48, 35, 49, 35, 50,
- 35, 51, 35, 52, 35, 53, 35, 55, 35, 56,
- 35, 63, 35, 68, 35, 69, 35, 70, 35, 71,
- 35, 72, 35, 73, 35, 76, 35, 77, 35, 78,
- 35, 79, 35, 80, 35, 81, 35, 82, 35, 83,
- 35, 84, 35, 85, 35, 86, 35, 87, 35, 88,
- 35, 89, 35, 90, 35, 91, 35, 92, 35, 93,
- 35, 94, 35, 96, 35, 100, 35, 101, 35, 102,
- 35, 107, 35, 108, 35, 113, 35, 115, 35, 119,
- 35, 120, 35, 121, 35, 122, 35, 123, 35, 125,
- 35, 126, 35, 136, 35, 137, 35, 138, 35, 139,
- 35, 140, 35, 141, 35, 142, 35, 143, 35, 144,
- 35, 145, 35, 146, 35, 147, 35, 1, 27, 54183,
- 4, 59, 57414, 104, 43137, 124, 24126, 148, 43137, 1,
- 135, 8815, 1, 22, 15995, 1, 75, 33723, 1, 103,
-42470, 1, 58, 28443, 2, 61, 18544, 109, 58878, 1,
- 8, 56009, 1, 54, 29050, 1, 0, 724, 1, 16,
-36067, 1, 99, 16766, 1, 5, 8583, 2, 6, 10939,
- 129, 57091, 1, 132, 56346, 2, 12, 11601, 118, 4387,
+ 35, 51, 35, 52, 35, 55, 35, 56, 35, 63,
+ 35, 68, 35, 69, 35, 70, 35, 71, 35, 72,
+ 35, 73, 35, 76, 35, 77, 35, 78, 35, 79,
+ 35, 80, 35, 81, 35, 82, 35, 83, 35, 84,
+ 35, 85, 35, 86, 35, 87, 35, 88, 35, 89,
+ 35, 90, 35, 91, 35, 92, 35, 93, 35, 94,
+ 35, 96, 35, 100, 35, 101, 35, 102, 35, 107,
+ 35, 108, 35, 113, 35, 119, 35, 120, 35, 121,
+ 35, 122, 35, 123, 35, 125, 35, 126, 35, 136,
+ 35, 137, 35, 138, 35, 139, 35, 140, 35, 141,
+ 35, 142, 35, 143, 35, 144, 35, 145, 35, 146,
+ 35, 147, 35, 1, 27, 54183, 4, 59, 57414, 104,
+43137, 124, 24126, 148, 43137, 2, 118, 39591, 135, 8815,
+ 1, 22, 15995, 1, 75, 33723, 1, 103, 42470, 1,
+ 58, 28443, 2, 61, 18544, 109, 58878, 1, 8, 56009,
+ 1, 54, 29050, 1, 0, 724, 1, 16, 36067, 2,
+ 99, 16766, 115, 26215, 1, 5, 8583, 2, 6, 10939,
+ 129, 57091, 1, 132, 56346, 2, 12, 11601, 53, 29052,
2, 130, 52465, 131, 24101, 1, 21, 61928, 1, 106,
7113, 1, 133, 5770,
};
-vtkDICOMDictionary::Dict Dict178Data = {
+vtkDICOMDictionary::Dict Dict184Data = {
"PHILIPS MR/PART",
151,
151,
-Dict178TagHashTable,
-Dict178KeyHashTable,
-Dict178Contents
+Dict184TagHashTable,
+Dict184KeyHashTable,
+Dict184Contents
};
// ----- GEMS_DL_IMG_01 -----
-DictEntry Dict179Contents[] = {
+const DictEntry Dict185Contents[] = {
{ 0x0019, 0x000B, 0, VR::DS, VM::M1T2, "FOVDimensionDouble" },
{ 0x0019, 0x002B, 0, VR::FL, VM::M1, "DistanceToTableTop" },
{ 0x0019, 0x0030, 0, VR::LO, VM::M1, "ImageFileName" },
@@ -11040,7 +11617,7 @@ DictEntry Dict179Contents[] = {
{ 0x0019, 0x00ef, 0, VR::FL, VM::M1, "" },
};
-unsigned short Dict179TagHashTable[] = {
+const unsigned short Dict185TagHashTable[] = {
128, 131, 134, 137, 140, 143, 146, 149, 152, 155,
158, 161, 164, 167, 170, 173, 176, 179, 182, 187,
190, 193, 196, 199, 202, 205, 208, 211, 214, 217,
@@ -11092,7 +11669,7 @@ unsigned short Dict179TagHashTable[] = {
42, 100, 1, 43, 101, 1, 44, 102,
};
-unsigned short Dict179KeyHashTable[] = {
+const unsigned short Dict185KeyHashTable[] = {
128, 127, 131, 134, 139, 127, 127, 127, 142, 145,
127, 127, 127, 148, 155, 160, 165, 168, 127, 173,
176, 181, 127, 184, 127, 187, 190, 195, 200, 127,
@@ -11141,64 +11718,64 @@ unsigned short Dict179KeyHashTable[] = {
100, 35521, 2, 10, 8739, 11, 61602, 1, 78, 46024,
};
-vtkDICOMDictionary::Dict Dict179Data = {
+vtkDICOMDictionary::Dict Dict185Data = {
"GEMS_DL_IMG_01",
127,
127,
-Dict179TagHashTable,
-Dict179KeyHashTable,
-Dict179Contents
+Dict185TagHashTable,
+Dict185KeyHashTable,
+Dict185Contents
};
// ----- ESOFT_DICOM_ECAT_OWNERCODE -----
-DictEntry Dict180Contents[] = {
+const DictEntry Dict186Contents[] = {
{ 0x0015, 0x0000, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict180TagHashTable[] = {
+const unsigned short Dict186TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict180KeyHashTable[] = {
+const unsigned short Dict186KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict180Data = {
+vtkDICOMDictionary::Dict Dict186Data = {
"ESOFT_DICOM_ECAT_OWNERCODE",
1,
1,
-Dict180TagHashTable,
-Dict180KeyHashTable,
-Dict180Contents
+Dict186TagHashTable,
+Dict186KeyHashTable,
+Dict186Contents
};
// ----- KINETDX_GRAPHICS -----
-DictEntry Dict181Contents[] = {
+const DictEntry Dict187Contents[] = {
{ 0x0021, 0x00a4, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict181TagHashTable[] = {
+const unsigned short Dict187TagHashTable[] = {
2, 0, 1, 0, 164,
};
-unsigned short Dict181KeyHashTable[] = {
+const unsigned short Dict187KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict181Data = {
+vtkDICOMDictionary::Dict Dict187Data = {
"KINETDX_GRAPHICS",
1,
1,
-Dict181TagHashTable,
-Dict181KeyHashTable,
-Dict181Contents
+Dict187TagHashTable,
+Dict187KeyHashTable,
+Dict187Contents
};
// ----- GEMS_PETD_01 -----
-DictEntry Dict182Contents[] = {
+const DictEntry Dict188Contents[] = {
{ 0x0009, 0x0001, 0, VR::LO, VM::M2, "ImplementationVersionName" },
{ 0x0009, 0x0002, 0, VR::LO, VM::M1, "PatientID" },
{ 0x0009, 0x0003, 0, VR::SH, VM::M1, "PatientCompatibleVersion" },
@@ -11536,7 +12113,7 @@ DictEntry Dict182Contents[] = {
{ 0x5005, 0x000d, 0, VR::LO, VM::M1, "PointColor" },
};
-unsigned short Dict182TagHashTable[] = {
+const unsigned short Dict188TagHashTable[] = {
336, 339, 342, 345, 348, 351, 354, 357, 360, 365,
370, 375, 380, 385, 390, 395, 400, 409, 416, 425,
432, 439, 446, 453, 458, 463, 466, 473, 480, 487,
@@ -11664,7 +12241,7 @@ unsigned short Dict182TagHashTable[] = {
229,
};
-unsigned short Dict182KeyHashTable[] = {
+const unsigned short Dict188KeyHashTable[] = {
336, 341, 344, 347, 335, 335, 352, 355, 360, 363,
376, 335, 335, 335, 379, 386, 391, 335, 335, 335,
394, 399, 335, 414, 417, 335, 335, 420, 423, 426,
@@ -11789,41 +12366,41 @@ unsigned short Dict182KeyHashTable[] = {
162, 7261, 2, 21, 55087, 23, 53378,
};
-vtkDICOMDictionary::Dict Dict182Data = {
+vtkDICOMDictionary::Dict Dict188Data = {
"GEMS_PETD_01",
335,
335,
-Dict182TagHashTable,
-Dict182KeyHashTable,
-Dict182Contents
+Dict188TagHashTable,
+Dict188KeyHashTable,
+Dict188Contents
};
// ----- ISI -----
-DictEntry Dict183Contents[] = {
+const DictEntry Dict189Contents[] = {
{ 0x0009, 0x0001, 0, VR::UN, VM::M1, "SIENETGeneralPurposeIMGEF" },
};
-unsigned short Dict183TagHashTable[] = {
+const unsigned short Dict189TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict183KeyHashTable[] = {
+const unsigned short Dict189KeyHashTable[] = {
2, 0, 1, 0, 1153,
};
-vtkDICOMDictionary::Dict Dict183Data = {
+vtkDICOMDictionary::Dict Dict189Data = {
"ISI",
1,
1,
-Dict183TagHashTable,
-Dict183KeyHashTable,
-Dict183Contents
+Dict189TagHashTable,
+Dict189KeyHashTable,
+Dict189Contents
};
// ----- GEMS_DRS_1 -----
-DictEntry Dict184Contents[] = {
+const DictEntry Dict190Contents[] = {
{ 0x0037, 0x0010, 0, VR::LO, VM::M1, "ReferringDepartment" },
{ 0x0037, 0x0020, 0, VR::US, VM::M1, "ScreenNumber" },
{ 0x0037, 0x0040, 0, VR::SH, VM::M1, "LeftOrientation" },
@@ -11832,103 +12409,103 @@ DictEntry Dict184Contents[] = {
{ 0x0037, 0x0060, 0, VR::US, VM::M1, "DSA" },
};
-unsigned short Dict184TagHashTable[] = {
+const unsigned short Dict190TagHashTable[] = {
7, 6, 10, 15, 18, 21, 0, 1, 4, 80,
2, 3, 66, 5, 96, 1, 0, 16, 1, 2,
64, 1, 1, 32,
};
-unsigned short Dict184KeyHashTable[] = {
+const unsigned short Dict190KeyHashTable[] = {
7, 10, 6, 13, 16, 21, 0, 1, 1, 59757,
1, 3, 23101, 1, 0, 49695, 2, 2, 62532, 4,
11413, 1, 5, 64132,
};
-vtkDICOMDictionary::Dict Dict184Data = {
+vtkDICOMDictionary::Dict Dict190Data = {
"GEMS_DRS_1",
6,
6,
-Dict184TagHashTable,
-Dict184KeyHashTable,
-Dict184Contents
+Dict190TagHashTable,
+Dict190KeyHashTable,
+Dict190Contents
};
// ----- RamSoft Race Identifier -----
-DictEntry Dict185Contents[] = {
+const DictEntry Dict191Contents[] = {
{ 0x3129, 0x0010, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict185TagHashTable[] = {
+const unsigned short Dict191TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict185KeyHashTable[] = {
+const unsigned short Dict191KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict185Data = {
+vtkDICOMDictionary::Dict Dict191Data = {
"RamSoft Race Identifier",
1,
1,
-Dict185TagHashTable,
-Dict185KeyHashTable,
-Dict185Contents
+Dict191TagHashTable,
+Dict191KeyHashTable,
+Dict191Contents
};
// ----- TOSHIBA MDW NON-IMAGE -----
-DictEntry Dict186Contents[] = {
+const DictEntry Dict192Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "NonImageHeaderType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "NonImageHeaderVersion" },
{ 0x0029, 0x0020, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict186TagHashTable[] = {
+const unsigned short Dict192TagHashTable[] = {
4, 3, 9, 0, 2, 0, 8, 2, 32, 1,
1, 9,
};
-unsigned short Dict186KeyHashTable[] = {
+const unsigned short Dict192KeyHashTable[] = {
3, 4, 7, 0, 1, 0, 30143, 2, 1, 59488,
2, 1793,
};
-vtkDICOMDictionary::Dict Dict186Data = {
+vtkDICOMDictionary::Dict Dict192Data = {
"TOSHIBA MDW NON-IMAGE",
3,
3,
-Dict186TagHashTable,
-Dict186KeyHashTable,
-Dict186Contents
+Dict192TagHashTable,
+Dict192KeyHashTable,
+Dict192Contents
};
// ----- SIEMENS MED OCS PUBLIC RT PLAN ATTRIBUTES -----
-DictEntry Dict187Contents[] = {
+const DictEntry Dict193Contents[] = {
{ 0x0039, 0x0001, 0, VR::UT, VM::M1, "ExternalAttributes" },
};
-unsigned short Dict187TagHashTable[] = {
+const unsigned short Dict193TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict187KeyHashTable[] = {
+const unsigned short Dict193KeyHashTable[] = {
2, 0, 1, 0, 18287,
};
-vtkDICOMDictionary::Dict Dict187Data = {
+vtkDICOMDictionary::Dict Dict193Data = {
"SIEMENS MED OCS PUBLIC RT PLAN ATTRIBUTES",
1,
1,
-Dict187TagHashTable,
-Dict187KeyHashTable,
-Dict187Contents
-};
+Dict193TagHashTable,
+Dict193KeyHashTable,
+Dict193Contents
+};
// ----- DR Systems, Inc. -----
-DictEntry Dict188Contents[] = {
+const DictEntry Dict194Contents[] = {
{ 0x4453, 0x0001, 0, VR::LO, VM::M1, "ExamID" },
{ 0x4453, 0x0002, 0, VR::LO, VM::M1, "ImageType" },
{ 0x4453, 0x0004, 0, VR::LO, VM::M1, "FileType" },
@@ -11937,30 +12514,30 @@ DictEntry Dict188Contents[] = {
{ 0x4453, 0x000C, 0, VR::SQ, VM::M1, "OriginalInstanceUIDSequence" },
};
-unsigned short Dict188TagHashTable[] = {
+const unsigned short Dict194TagHashTable[] = {
7, 12, 6, 6, 15, 20, 0, 2, 4, 10,
5, 12, 1, 0, 1, 2, 1, 2, 2, 4,
1, 3, 5,
};
-unsigned short Dict188KeyHashTable[] = {
+const unsigned short Dict194KeyHashTable[] = {
7, 14, 19, 6, 6, 6, 0, 3, 1, 28071,
3, 29887, 5, 30295, 2, 0, 16330, 2, 14801, 1,
4, 50688,
};
-vtkDICOMDictionary::Dict Dict188Data = {
+vtkDICOMDictionary::Dict Dict194Data = {
"DR Systems, Inc.",
6,
6,
-Dict188TagHashTable,
-Dict188KeyHashTable,
-Dict188Contents
+Dict194TagHashTable,
+Dict194KeyHashTable,
+Dict194Contents
};
// ----- SCHICK TECHNOLOGIES - Change Item Creator ID -----
-DictEntry Dict189Contents[] = {
+const DictEntry Dict195Contents[] = {
{ 0x0021, 0x0001, 0, VR::UI, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::US, VM::M1, "" },
{ 0x0021, 0x0003, 0, VR::DT, VM::M1, "" },
@@ -11968,52 +12545,52 @@ DictEntry Dict189Contents[] = {
{ 0x0021, 0x0005, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict189TagHashTable[] = {
+const unsigned short Dict195TagHashTable[] = {
6, 9, 12, 5, 17, 0, 1, 1, 2, 1,
4, 5, 2, 0, 1, 3, 4, 1, 2, 3,
};
-unsigned short Dict189KeyHashTable[] = {
+const unsigned short Dict195KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict189Data = {
+vtkDICOMDictionary::Dict Dict195Data = {
"SCHICK TECHNOLOGIES - Change Item Creator ID",
5,
5,
-Dict189TagHashTable,
-Dict189KeyHashTable,
-Dict189Contents
+Dict195TagHashTable,
+Dict195KeyHashTable,
+Dict195Contents
};
// ----- SIEMENS AX INSPACE_EP -----
-DictEntry Dict190Contents[] = {
+const DictEntry Dict196Contents[] = {
{ 0x0009, 0x0050, 0, VR::UI, VM::M1, "" },
{ 0x0009, 0x0051, 0, VR::UI, VM::M1, "" },
};
-unsigned short Dict190TagHashTable[] = {
+const unsigned short Dict196TagHashTable[] = {
3, 6, 0, 1, 0, 80, 1, 1, 81,
};
-unsigned short Dict190KeyHashTable[] = {
+const unsigned short Dict196KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict190Data = {
+vtkDICOMDictionary::Dict Dict196Data = {
"SIEMENS AX INSPACE_EP",
2,
2,
-Dict190TagHashTable,
-Dict190KeyHashTable,
-Dict190Contents
+Dict196TagHashTable,
+Dict196KeyHashTable,
+Dict196Contents
};
// ----- AGFA-AG_HPState -----
-DictEntry Dict191Contents[] = {
+const DictEntry Dict197Contents[] = {
{ 0x0011, 0x0011, 0, VR::SH, VM::M1, "" },
{ 0x0019, 0x00a0, 0, VR::SQ, VM::M1, "" },
{ 0x0019, 0x00a1, 0, VR::FL, VM::M1, "" },
@@ -12048,7 +12625,7 @@ DictEntry Dict191Contents[] = {
{ 0x0087, 0x0008, 0, VR::FD, VM::M2, "" },
};
-unsigned short Dict191TagHashTable[] = {
+const unsigned short Dict197TagHashTable[] = {
33, 38, 41, 44, 47, 32, 52, 55, 58, 61,
64, 32, 67, 70, 73, 32, 76, 81, 86, 89,
92, 32, 95, 32, 98, 101, 104, 109, 114, 117,
@@ -12064,7 +12641,7 @@ unsigned short Dict191TagHashTable[] = {
1, 5, 164,
};
-unsigned short Dict191KeyHashTable[] = {
+const unsigned short Dict197KeyHashTable[] = {
32, 32, 32, 32, 32, 33, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
@@ -12077,18 +12654,18 @@ unsigned short Dict191KeyHashTable[] = {
28, 168, 29, 168, 30, 168, 31, 168,
};
-vtkDICOMDictionary::Dict Dict191Data = {
+vtkDICOMDictionary::Dict Dict197Data = {
"AGFA-AG_HPState",
32,
32,
-Dict191TagHashTable,
-Dict191KeyHashTable,
-Dict191Contents
+Dict197TagHashTable,
+Dict197KeyHashTable,
+Dict197Contents
};
// ----- SPI-P-Private_ICS Release 1 -----
-DictEntry Dict192Contents[] = {
+const DictEntry Dict198Contents[] = {
{ 0x0019, 0x0030, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0031, 0, VR::LO, VM::M1, "" },
{ 0x0029, 0x000d, 0, VR::SQ, VM::M1, "" },
@@ -12116,7 +12693,7 @@ DictEntry Dict192Contents[] = {
{ 0x0029, 0x0091, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict192TagHashTable[] = {
+const unsigned short Dict198TagHashTable[] = {
26, 31, 34, 39, 44, 47, 25, 50, 53, 56,
25, 61, 25, 66, 69, 74, 79, 84, 25, 25,
87, 90, 25, 25, 25, 0, 2, 7, 27, 13,
@@ -12129,7 +12706,7 @@ unsigned short Dict192TagHashTable[] = {
1, 18, 81,
};
-unsigned short Dict192KeyHashTable[] = {
+const unsigned short Dict198KeyHashTable[] = {
25, 25, 25, 25, 25, 25, 26, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 0, 25, 0, 215, 1,
@@ -12140,90 +12717,99 @@ unsigned short Dict192KeyHashTable[] = {
215, 22, 215, 23, 215, 24, 215,
};
-vtkDICOMDictionary::Dict Dict192Data = {
+vtkDICOMDictionary::Dict Dict198Data = {
"SPI-P-Private_ICS Release 1",
25,
25,
-Dict192TagHashTable,
-Dict192KeyHashTable,
-Dict192Contents
+Dict198TagHashTable,
+Dict198KeyHashTable,
+Dict198Contents
};
// ----- RadWorksTBR -----
-DictEntry Dict193Contents[] = {
+const DictEntry Dict199Contents[] = {
{ 0x3111, 0x0002, 0, VR::CS, VM::M1, "CompressionType" },
{ 0x3111, 0x00FF, 0, VR::SQ, VM::M1, "QueryResult" },
};
-unsigned short Dict193TagHashTable[] = {
+const unsigned short Dict199TagHashTable[] = {
2, 3, 0, 2, 0, 2, 1, 255,
};
-unsigned short Dict193KeyHashTable[] = {
+const unsigned short Dict199KeyHashTable[] = {
3, 6, 0, 1, 1, 42557, 1, 0, 44844,
};
-vtkDICOMDictionary::Dict Dict193Data = {
+vtkDICOMDictionary::Dict Dict199Data = {
"RadWorksTBR",
2,
2,
-Dict193TagHashTable,
-Dict193KeyHashTable,
-Dict193Contents
+Dict199TagHashTable,
+Dict199KeyHashTable,
+Dict199Contents
};
-// ----- SIEMENS SYNGO REGISTRATION -----
+// ----- Riverain Medical -----
-DictEntry Dict194Contents[] = {
-{ 0x0071, 0x0020, 0, VR::SQ, VM::M1, "RegisteredImageSequence" },
-{ 0x0071, 0x0021, 0, VR::CS, VM::M1, "RegistrationIsValidatedFlag" },
+const DictEntry Dict200Contents[] = {
+{ 0x0203, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0003, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0010, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x00f0, 0, VR::UI, VM::M1, "" },
+{ 0x0203, 0x00f1, 0, VR::UI, VM::M1, "" },
};
-unsigned short Dict194TagHashTable[] = {
- 3, 6, 0, 1, 0, 32, 1, 1, 33,
+const unsigned short Dict200TagHashTable[] = {
+ 8, 7, 11, 14, 17, 22, 7, 0, 1, 4,
+ 16, 1, 3, 3, 1, 2, 2, 2, 1, 1,
+ 5, 240, 2, 0, 0, 6, 241,
};
-unsigned short Dict194KeyHashTable[] = {
- 3, 6, 0, 1, 1, 65362, 1, 0, 53639,
+const unsigned short Dict200KeyHashTable[] = {
+ 7, 7, 7, 7, 7, 8, 7, 0, 7, 0,
+ 768, 1, 768, 2, 768, 3, 768, 4, 768, 5,
+ 768, 6, 768,
};
-vtkDICOMDictionary::Dict Dict194Data = {
-"SIEMENS SYNGO REGISTRATION",
-2,
-2,
-Dict194TagHashTable,
-Dict194KeyHashTable,
-Dict194Contents
+vtkDICOMDictionary::Dict Dict200Data = {
+"Riverain Medical",
+7,
+7,
+Dict200TagHashTable,
+Dict200KeyHashTable,
+Dict200Contents
};
// ----- AMI Sequence AnnotElements_01 -----
-DictEntry Dict195Contents[] = {
+const DictEntry Dict201Contents[] = {
{ 0x3105, 0x0010, 0, VR::DS, VM::M1TN, "AnnotationElementPosition" },
{ 0x3105, 0x0020, 0, VR::LT, VM::M1, "AnnotationElementText" },
};
-unsigned short Dict195TagHashTable[] = {
+const unsigned short Dict201TagHashTable[] = {
2, 3, 0, 2, 0, 16, 1, 32,
};
-unsigned short Dict195KeyHashTable[] = {
+const unsigned short Dict201KeyHashTable[] = {
2, 3, 0, 2, 0, 22223, 1, 63671,
};
-vtkDICOMDictionary::Dict Dict195Data = {
+vtkDICOMDictionary::Dict Dict201Data = {
"AMI Sequence AnnotElements_01",
2,
2,
-Dict195TagHashTable,
-Dict195KeyHashTable,
-Dict195Contents
+Dict201TagHashTable,
+Dict201KeyHashTable,
+Dict201Contents
};
// ----- AMI ImageTransform_01 -----
-DictEntry Dict196Contents[] = {
+const DictEntry Dict202Contents[] = {
{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" },
{ 0x3107, 0x0020, 0, VR::DS, VM::M1, "CenterOffset" },
{ 0x3107, 0x0030, 0, VR::DS, VM::M1, "Magnification" },
@@ -12232,82 +12818,82 @@ DictEntry Dict196Contents[] = {
{ 0x3107, 0x0060, 0, VR::DS, VM::M1, "CalibrationFactor" },
};
-unsigned short Dict196TagHashTable[] = {
+const unsigned short Dict202TagHashTable[] = {
7, 10, 13, 16, 19, 22, 0, 1, 4, 80,
1, 2, 48, 1, 3, 64, 1, 1, 32, 1,
5, 96, 1, 0, 16,
};
-unsigned short Dict196KeyHashTable[] = {
+const unsigned short Dict202KeyHashTable[] = {
7, 12, 17, 6, 6, 20, 0, 2, 3, 18224,
5, 9826, 2, 0, 2792, 1, 49378, 1, 2, 47562,
1, 4, 25284,
};
-vtkDICOMDictionary::Dict Dict196Data = {
+vtkDICOMDictionary::Dict Dict202Data = {
"AMI ImageTransform_01",
6,
6,
-Dict196TagHashTable,
-Dict196KeyHashTable,
-Dict196Contents
+Dict202TagHashTable,
+Dict202KeyHashTable,
+Dict202Contents
};
// ----- SECTRA_ImageInfo_01 -----
-DictEntry Dict197Contents[] = {
+const DictEntry Dict203Contents[] = {
{ 0x0029, 0x0001, 0, VR::OB, VM::M1, "ImageInfo" },
{ 0x0029, 0x0002, 0, VR::CS, VM::M1, "Marking" },
{ 0x0029, 0x0003, 0, VR::LO, VM::M1, "NoDecompression" },
{ 0x0029, 0x0004, 0, VR::OB, VM::M1, "ImageInfoNew" },
};
-unsigned short Dict197TagHashTable[] = {
+const unsigned short Dict203TagHashTable[] = {
5, 8, 11, 14, 0, 1, 0, 1, 1, 3,
4, 1, 2, 3, 1, 1, 2,
};
-unsigned short Dict197KeyHashTable[] = {
+const unsigned short Dict203KeyHashTable[] = {
5, 8, 11, 4, 0, 1, 0, 38509, 1, 2,
36303, 2, 1, 60139, 3, 61855,
};
-vtkDICOMDictionary::Dict Dict197Data = {
+vtkDICOMDictionary::Dict Dict203Data = {
"SECTRA_ImageInfo_01",
4,
4,
-Dict197TagHashTable,
-Dict197KeyHashTable,
-Dict197Contents
+Dict203TagHashTable,
+Dict203KeyHashTable,
+Dict203Contents
};
// ----- HMC - CT - ID -----
-DictEntry Dict198Contents[] = {
+const DictEntry Dict204Contents[] = {
{ 0x0009, 0x0000, 0, VR::OB, VM::M1, "ImageIDInformationPatientNameID" },
{ 0x0009, 0x0001, 0, VR::OB, VM::M1, "ImageIDInformationPatientComment" },
};
-unsigned short Dict198TagHashTable[] = {
+const unsigned short Dict204TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict198KeyHashTable[] = {
+const unsigned short Dict204KeyHashTable[] = {
3, 6, 0, 1, 0, 17343, 1, 1, 63969,
};
-vtkDICOMDictionary::Dict Dict198Data = {
+vtkDICOMDictionary::Dict Dict204Data = {
"HMC - CT - ID",
2,
2,
-Dict198TagHashTable,
-Dict198KeyHashTable,
-Dict198Contents
+Dict204TagHashTable,
+Dict204KeyHashTable,
+Dict204Contents
};
// ----- VEPRO DICOM RECEIVE DATA 1.0 -----
-DictEntry Dict199Contents[] = {
+const DictEntry Dict205Contents[] = {
{ 0x0059, 0x0040, 0, VR::DA, VM::M1, "ReceiveDate" },
{ 0x0059, 0x0041, 0, VR::TM, VM::M1, "ReceiveTime" },
{ 0x0059, 0x0042, 0, VR::ST, VM::M1, "ReceiveNode" },
@@ -12319,123 +12905,144 @@ DictEntry Dict199Contents[] = {
{ 0x0059, 0x0070, 0, VR::UI, VM::M1, "ReceiveOriginalTransferSyntax" },
};
-unsigned short Dict199TagHashTable[] = {
+const unsigned short Dict205TagHashTable[] = {
10, 9, 15, 18, 9, 21, 24, 27, 30, 0,
2, 2, 66, 4, 80, 1, 7, 97, 1, 6,
96, 1, 8, 112, 1, 1, 65, 1, 0, 64,
2, 3, 67, 5, 81,
};
-unsigned short Dict199KeyHashTable[] = {
+const unsigned short Dict205KeyHashTable[] = {
10, 13, 16, 21, 9, 26, 29, 9, 32, 0,
1, 5, 34915, 1, 4, 8601, 2, 1, 28845, 2,
5580, 2, 7, 51377, 8, 62294, 1, 3, 16927, 1,
6, 42133, 1, 0, 29550,
};
-vtkDICOMDictionary::Dict Dict199Data = {
+vtkDICOMDictionary::Dict Dict205Data = {
"VEPRO DICOM RECEIVE DATA 1.0",
9,
9,
-Dict199TagHashTable,
-Dict199KeyHashTable,
-Dict199Contents
+Dict205TagHashTable,
+Dict205KeyHashTable,
+Dict205Contents
};
// ----- ADAC_IMG -----
-DictEntry Dict200Contents[] = {
+const DictEntry Dict206Contents[] = {
{ 0x0019, 0x0002, 0, VR::IS, VM::M1, "ADACPegasysFileSize" },
{ 0x0019, 0x0021, 0, VR::US, VM::M1, "NumberOfADACHeaders" },
{ 0x0019, 0x0041, 0, VR::IS, VM::M1TN, "ADACHeaderImageSize" },
{ 0x0019, 0x0061, 0, VR::OB, VM::M1, "ADACPegasysHeaders" },
};
-unsigned short Dict200TagHashTable[] = {
+const unsigned short Dict206TagHashTable[] = {
5, 8, 4, 13, 0, 1, 1, 33, 2, 2,
65, 3, 97, 1, 0, 2,
};
-unsigned short Dict200KeyHashTable[] = {
+const unsigned short Dict206KeyHashTable[] = {
5, 8, 13, 4, 0, 1, 1, 22938, 2, 0,
7665, 2, 36501, 1, 3, 58761,
};
-vtkDICOMDictionary::Dict Dict200Data = {
+vtkDICOMDictionary::Dict Dict206Data = {
"ADAC_IMG",
4,
4,
-Dict200TagHashTable,
-Dict200KeyHashTable,
-Dict200Contents
+Dict206TagHashTable,
+Dict206KeyHashTable,
+Dict206Contents
};
// ----- SIEMENS MEDCOM HEADER2 -----
-DictEntry Dict201Contents[] = {
+const DictEntry Dict207Contents[] = {
{ 0x0029, 0x0060, 0, VR::LO, VM::M1, "SeriesWorkFlowStatus" },
};
-unsigned short Dict201TagHashTable[] = {
+const unsigned short Dict207TagHashTable[] = {
2, 0, 1, 0, 96,
};
-unsigned short Dict201KeyHashTable[] = {
+const unsigned short Dict207KeyHashTable[] = {
2, 0, 1, 0, 26191,
};
-vtkDICOMDictionary::Dict Dict201Data = {
+vtkDICOMDictionary::Dict Dict207Data = {
"SIEMENS MEDCOM HEADER2",
1,
1,
-Dict201TagHashTable,
-Dict201KeyHashTable,
-Dict201Contents
+Dict207TagHashTable,
+Dict207KeyHashTable,
+Dict207Contents
};
// ----- Philips MR Imaging DD 002 -----
-DictEntry Dict202Contents[] = {
-{ 0x2005, 0x0032, 0, VR::SQ, VM::M1, "" },
-{ 0x2005, 0x0034, 0, VR::LT, VM::M1, "" },
-{ 0x2005, 0x0037, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0038, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0039, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0040, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0041, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0043, 0, VR::SL, VM::M1, "" },
-{ 0x2005, 0x0044, 0, VR::OW, VM::M1, "" },
-{ 0x2005, 0x0047, 0, VR::CS, VM::M1, "" },
-{ 0x2005, 0x0099, 0, VR::UL, VM::M1, "" },
-};
-
-unsigned short Dict202TagHashTable[] = {
- 11, 11, 12, 11, 15, 18, 23, 26, 11, 29,
- 36, 0, 1, 8, 68, 1, 0, 50, 2, 9,
- 71, 10, 153, 1, 5, 64, 1, 6, 65, 3,
- 1, 52, 4, 57, 7, 67, 2, 2, 55, 3,
- 56,
-};
-
-unsigned short Dict202KeyHashTable[] = {
- 11, 11, 12, 11, 11, 11, 11, 11, 11, 11,
- 11, 0, 11, 0, 489, 1, 489, 2, 489, 3,
- 489, 4, 489, 5, 489, 6, 489, 7, 489, 8,
- 489, 9, 489, 10, 489,
+const DictEntry Dict208Contents[] = {
+{ 0x2005, 0x0015, 0, VR::LO, VM::M1, "UserName" },
+{ 0x2005, 0x0016, 0, VR::LO, VM::M1, "PassWord" },
+{ 0x2005, 0x0017, 0, VR::LO, VM::M1, "ServerName" },
+{ 0x2005, 0x0018, 0, VR::LO, VM::M1, "DataBaseName" },
+{ 0x2005, 0x0019, 0, VR::LO, VM::M1, "RootName" },
+{ 0x2005, 0x0020, 0, VR::LO, VM::M1, "DMIApplicationName" },
+{ 0x2005, 0x002D, 0, VR::LO, VM::M1, "RootId" },
+{ 0x2005, 0x0032, 0, VR::SQ, VM::M1, "BlobDataObjectArray" },
+{ 0x2005, 0x0034, 0, VR::LT, VM::M1, "SeriesTransactionUID" },
+{ 0x2005, 0x0035, 0, VR::IS, VM::M1, "ParentID" },
+{ 0x2005, 0x0036, 0, VR::LO, VM::M1, "ParentType" },
+{ 0x2005, 0x0037, 0, VR::LO, VM::M1, "BlobName" },
+{ 0x2005, 0x0038, 0, VR::LO, VM::M1, "ApplicationName" },
+{ 0x2005, 0x0039, 0, VR::LO, VM::M1, "TypeName" },
+{ 0x2005, 0x0040, 0, VR::LO, VM::M1, "VersionStr" },
+{ 0x2005, 0x0041, 0, VR::LO, VM::M1, "CommentStr" },
+{ 0x2005, 0x0042, 0, VR::CS, VM::M1, "BlobInFile" },
+{ 0x2005, 0x0043, 0, VR::SL, VM::M1, "ActualBlobSize" },
+{ 0x2005, 0x0044, 0, VR::OW, VM::M1, "BlobData" },
+{ 0x2005, 0x0045, 0, VR::LO, VM::M1, "BlobFilename" },
+{ 0x2005, 0x0046, 0, VR::SL, VM::M1, "BlobOffset" },
+{ 0x2005, 0x0047, 0, VR::CS, VM::M1, "BlobFlag" },
+{ 0x2005, 0x0099, 0, VR::UL, VM::M1, "NumberOfRequestExcerpts" },
+};
+
+const unsigned short Dict208TagHashTable[] = {
+ 24, 23, 23, 27, 23, 23, 23, 23, 30, 35,
+ 38, 41, 46, 51, 56, 59, 62, 65, 68, 71,
+ 76, 79, 82, 0, 1, 3, 24, 1, 7, 50,
+ 2, 5, 32, 13, 57, 1, 12, 56, 1, 0,
+ 21, 2, 6, 45, 22, 153, 2, 2, 23, 18,
+ 68, 2, 1, 22, 19, 69, 1, 20, 70, 1,
+ 21, 71, 1, 14, 64, 1, 15, 65, 1, 16,
+ 66, 2, 9, 53, 17, 67, 1, 8, 52, 1,
+ 11, 55, 2, 4, 25, 10, 54,
+};
+
+const unsigned short Dict208KeyHashTable[] = {
+ 24, 29, 23, 23, 36, 39, 44, 23, 47, 50,
+ 53, 60, 63, 23, 23, 23, 66, 23, 69, 23,
+ 72, 75, 82, 0, 2, 3, 54397, 18, 64850, 3,
+ 4, 54079, 14, 52277, 20, 13446, 1, 8, 18028, 2,
+ 12, 42963, 22, 55251, 1, 9, 42394, 1, 15, 56895,
+ 1, 10, 9976, 3, 2, 39013, 5, 20102, 17, 36841,
+ 1, 16, 22288, 1, 1, 4852, 1, 6, 44138, 1,
+ 21, 2932, 1, 19, 38231, 3, 0, 10384, 7, 7545,
+ 11, 14928, 1, 13, 16350,
};
-vtkDICOMDictionary::Dict Dict202Data = {
+vtkDICOMDictionary::Dict Dict208Data = {
"Philips MR Imaging DD 002",
-11,
-11,
-Dict202TagHashTable,
-Dict202KeyHashTable,
-Dict202Contents
+23,
+23,
+Dict208TagHashTable,
+Dict208KeyHashTable,
+Dict208Contents
};
// ----- SIEMENS CSA HEADER -----
-DictEntry Dict203Contents[] = {
+const DictEntry Dict209Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "CSAImageHeaderType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "CSAImageHeaderVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "CSAImageHeaderInfo" },
@@ -12444,80 +13051,177 @@ DictEntry Dict203Contents[] = {
{ 0x0029, 0x0020, 0, VR::OB, VM::M1, "CSASeriesHeaderInfo" },
};
-unsigned short Dict203TagHashTable[] = {
+const unsigned short Dict209TagHashTable[] = {
7, 10, 13, 16, 6, 6, 0, 1, 4, 25,
1, 3, 24, 1, 1, 9, 3, 0, 8, 2,
16, 5, 32,
};
-unsigned short Dict203KeyHashTable[] = {
+const unsigned short Dict209KeyHashTable[] = {
7, 6, 12, 6, 15, 6, 0, 2, 0, 16775,
5, 1386, 1, 3, 3784, 3, 1, 53655, 2, 14376,
4, 20995,
};
-vtkDICOMDictionary::Dict Dict203Data = {
+vtkDICOMDictionary::Dict Dict209Data = {
"SIEMENS CSA HEADER",
6,
6,
-Dict203TagHashTable,
-Dict203KeyHashTable,
-Dict203Contents
+Dict209TagHashTable,
+Dict209KeyHashTable,
+Dict209Contents
+};
+
+// ----- MEDISO-1 -----
+
+const DictEntry Dict210Contents[] = {
+{ 0x0009, 0x0030, 0, VR::DT, VM::M1, "" },
+{ 0x0009, 0x0036, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00c0, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00c1, 0, VR::OB, VM::M1, "" },
+{ 0x0009, 0x00c4, 0, VR::OB, VM::M1, "" },
+{ 0x0009, 0x00d2, 0, VR::LO, VM::M1, "" },
+{ 0x0009, 0x00d5, 0, VR::LO, VM::M1, "" },
+{ 0x0009, 0x00dc, 0, VR::SQ, VM::M1, "" },
+{ 0x0009, 0x00de, 0, VR::UL, VM::M1, "" },
+{ 0x0009, 0x00df, 0, VR::UL, VM::M1, "" },
+{ 0x0009, 0x00e0, 0, VR::US, VM::M1, "" },
+{ 0x0009, 0x00e1, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00e6, 0, VR::OB, VM::M1, "" },
+{ 0x0009, 0x00e9, 0, VR::UI, VM::M1TN, "" },
+{ 0x0009, 0x00ee, 0, VR::DT, VM::M1, "" },
+{ 0x0009, 0x00ef, 0, VR::DT, VM::M1, "" },
+{ 0x0009, 0x00f0, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00f1, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00f2, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00f3, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00fa, 0, VR::ST, VM::M1, "" },
+{ 0x0009, 0x00fb, 0, VR::US, VM::M1, "" },
+{ 0x0011, 0x0006, 0, VR::LO, VM::M1, "" },
+};
+
+const unsigned short Dict210TagHashTable[] = {
+ 24, 23, 23, 23, 27, 30, 35, 40, 23, 43,
+ 46, 49, 23, 23, 23, 23, 54, 57, 60, 65,
+ 70, 75, 80, 0, 1, 22, 6, 1, 10, 224,
+ 2, 8, 222, 11, 225, 2, 9, 223, 12, 230,
+ 1, 7, 220, 1, 5, 210, 1, 20, 250, 2,
+ 0, 48, 21, 251, 1, 6, 213, 1, 1, 54,
+ 2, 2, 192, 18, 242, 2, 3, 193, 19, 243,
+ 2, 13, 233, 16, 240, 2, 14, 238, 17, 241,
+ 2, 4, 196, 15, 239,
+};
+
+const unsigned short Dict210KeyHashTable[] = {
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 24, 0, 23, 0, 233, 1, 233, 2,
+ 233, 3, 233, 4, 233, 5, 233, 6, 233, 7,
+ 233, 8, 233, 9, 233, 10, 233, 11, 233, 12,
+ 233, 13, 233, 14, 233, 15, 233, 16, 233, 17,
+ 233, 18, 233, 19, 233, 20, 233, 21, 233, 22,
+ 233,
+};
+
+vtkDICOMDictionary::Dict Dict210Data = {
+"MEDISO-1",
+23,
+23,
+Dict210TagHashTable,
+Dict210KeyHashTable,
+Dict210Contents
};
// ----- MeVis eD: Geometry Information -----
-DictEntry Dict204Contents[] = {
+const DictEntry Dict211Contents[] = {
{ 0x0021, 0x0010, 0, VR::UN, VM::M1, "GeometryScannerOrigin" },
};
-unsigned short Dict204TagHashTable[] = {
+const unsigned short Dict211TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict204KeyHashTable[] = {
+const unsigned short Dict211KeyHashTable[] = {
2, 0, 1, 0, 24355,
};
-vtkDICOMDictionary::Dict Dict204Data = {
+vtkDICOMDictionary::Dict Dict211Data = {
"MeVis eD: Geometry Information",
1,
1,
-Dict204TagHashTable,
-Dict204KeyHashTable,
-Dict204Contents
+Dict211TagHashTable,
+Dict211KeyHashTable,
+Dict211Contents
};
// ----- SIEMENS SYNGO 3D FUSION MATRIX -----
-DictEntry Dict205Contents[] = {
+const DictEntry Dict212Contents[] = {
{ 0x0029, 0x0008, 0, VR::UI, VM::M1, "ObjectSeriesInstanceUID" },
{ 0x0029, 0x0009, 0, VR::UI, VM::M1, "ModelSeriesInstanceUID" },
{ 0x0029, 0x0010, 0, VR::UI, VM::M1, "MatrixReferencedSeriesInstanceUID" },
};
-unsigned short Dict205TagHashTable[] = {
+const unsigned short Dict212TagHashTable[] = {
4, 3, 9, 0, 2, 0, 8, 2, 16, 1,
1, 9,
};
-unsigned short Dict205KeyHashTable[] = {
+const unsigned short Dict212KeyHashTable[] = {
4, 9, 3, 0, 2, 1, 51112, 2, 20485, 1,
0, 40511,
};
-vtkDICOMDictionary::Dict Dict205Data = {
+vtkDICOMDictionary::Dict Dict212Data = {
"SIEMENS SYNGO 3D FUSION MATRIX",
3,
3,
-Dict205TagHashTable,
-Dict205KeyHashTable,
-Dict205Contents
+Dict212TagHashTable,
+Dict212KeyHashTable,
+Dict212Contents
};
// ----- GEMS_3D_INTVL_01 -----
-DictEntry Dict206Contents[] = {
+const DictEntry Dict213Contents[] = {
+{ 0x0023, 0x0001, 0, VR::SQ, VM::M1, "XRayMarkerSequence" },
+{ 0x0023, 0x0002, 0, VR::SH, VM::M1, "MarkerID" },
+{ 0x0023, 0x0003, 0, VR::CS, VM::M1, "MarkerType" },
+{ 0x0023, 0x0004, 0, VR::FL, VM::M1, "MarkerSize" },
+{ 0x0023, 0x0005, 0, VR::US, VM::M3, "MarkerColorCIELabValue" },
+{ 0x0023, 0x0006, 0, VR::LO, VM::M1, "MarkerLabel" },
+{ 0x0023, 0x0007, 0, VR::CS, VM::M1, "MarkerVisibleState" },
+{ 0x0023, 0x0008, 0, VR::LO, VM::M1, "MarkerDescription" },
+{ 0x0023, 0x0010, 0, VR::SQ, VM::M1, "MarkerPointsSequence" },
+{ 0x0023, 0x0011, 0, VR::SH, VM::M1, "MarkerPointID" },
+{ 0x0023, 0x0012, 0, VR::FL, VM::M3, "MarkerPointPosition" },
+{ 0x0023, 0x0013, 0, VR::FL, VM::M1, "MarkerPointSize" },
+{ 0x0023, 0x0014, 0, VR::US, VM::M3, "MarkerPointColorCIELabValue" },
+{ 0x0023, 0x0016, 0, VR::CS, VM::M1, "MarkerPointVisibleState" },
+{ 0x0023, 0x0017, 0, VR::IS, VM::M1, "MarkerPointOrder" },
+{ 0x0023, 0x0018, 0, VR::FL, VM::M3, "VolumeManualRegistration" },
+{ 0x0023, 0x0020, 0, VR::IS, VM::M1TN, "VolumesThreshold" },
+{ 0x0023, 0x0025, 0, VR::CS, VM::M1, "CutPlaneActivationFlag" },
+{ 0x0023, 0x0026, 0, VR::IS, VM::M1, "CutPlanePositionValue" },
+{ 0x0023, 0x0027, 0, VR::FL, VM::M3, "CutPlaneNormalValue" },
+{ 0x0023, 0x0028, 0, VR::FL, VM::M1, "VolumeScalingFactor" },
+{ 0x0023, 0x0029, 0, VR::FL, VM::M1, "ROIToTableTopDistance" },
+{ 0x0023, 0x0030, 0, VR::IS, VM::M1TN, "DRRThreshold" },
+{ 0x0023, 0x0031, 0, VR::FL, VM::M3, "VolumeTablePosition" },
+{ 0x0023, 0x0032, 0, VR::IS, VM::M1, "RenderingMode" },
+{ 0x0023, 0x0033, 0, VR::IS, VM::M1, "ThreeDObjectOpacity" },
+{ 0x0023, 0x0034, 0, VR::IS, VM::M1, "InvertImage" },
+{ 0x0023, 0x0035, 0, VR::IS, VM::M1, "EnhanceFull" },
+{ 0x0023, 0x0036, 0, VR::FL, VM::M1, "Zoom" },
+{ 0x0023, 0x0037, 0, VR::IS, VM::M2, "Roam" },
+{ 0x0023, 0x0038, 0, VR::IS, VM::M1, "WindowLevel" },
+{ 0x0023, 0x0039, 0, VR::IS, VM::M1, "WindowWidth" },
+{ 0x0023, 0x0040, 0, VR::CS, VM::M1, "BMCSetting" },
+{ 0x0023, 0x0041, 0, VR::CS, VM::M1, "BackViewSetting" },
+{ 0x0023, 0x0042, 0, VR::CS, VM::M1TN, "SubVolumeVisibility" },
+{ 0x0023, 0x0043, 0, VR::CS, VM::M1, "ThreeDLandmarksVisibility" },
+{ 0x0023, 0x0044, 0, VR::CS, VM::M1, "AblationPointVisibility" },
{ 0x0023, 0x0001, 0, VR::SQ, VM::M1, "XRayMarkerSequence" },
{ 0x0023, 0x0002, 0, VR::SH, VM::M1, "MarkerID" },
{ 0x0023, 0x0003, 0, VR::CS, VM::M1, "MarkerType" },
@@ -12557,53 +13261,76 @@ DictEntry Dict206Contents[] = {
{ 0x0023, 0x0044, 0, VR::CS, VM::M1, "AblationPointVisibility" },
};
-unsigned short Dict206TagHashTable[] = {
- 38, 41, 44, 47, 50, 53, 56, 37, 37, 37,
- 61, 64, 69, 72, 75, 78, 81, 86, 89, 94,
- 97, 100, 103, 110, 115, 118, 121, 124, 127, 37,
- 37, 37, 130, 133, 136, 37, 139, 0, 1, 5,
- 6, 1, 4, 5, 1, 3, 4, 1, 16, 32,
- 1, 19, 39, 1, 18, 38, 2, 7, 8, 17,
- 37, 1, 21, 41, 2, 11, 19, 20, 40, 1,
- 10, 18, 1, 9, 17, 1, 8, 16, 1, 14,
- 23, 2, 13, 22, 25, 51, 1, 24, 50, 2,
- 12, 20, 23, 49, 1, 22, 48, 1, 29, 55,
- 1, 28, 54, 3, 15, 24, 27, 53, 34, 66,
- 2, 26, 52, 35, 67, 1, 32, 64, 1, 33,
- 65, 1, 31, 57, 1, 30, 56, 1, 36, 68,
- 1, 2, 3, 1, 1, 2, 1, 0, 1, 1,
- 6, 7,
-};
-
-unsigned short Dict206KeyHashTable[] = {
- 37, 38, 41, 46, 37, 49, 58, 61, 64, 37,
- 67, 37, 70, 73, 76, 79, 82, 37, 85, 88,
- 91, 37, 94, 37, 105, 37, 37, 112, 117, 120,
- 123, 128, 37, 131, 37, 37, 37, 0, 1, 2,
-45352, 2, 10, 51252, 14, 2895, 1, 33, 51772, 4,
- 20, 28632, 24, 36359, 29, 47683, 30, 55824, 1, 17,
-24731, 1, 4, 9996, 1, 34, 45435, 1, 1, 63746,
- 1, 15, 33346, 1, 36, 21668, 1, 35, 31448, 1,
- 27, 767, 1, 5, 33291, 1, 8, 28111, 1, 18,
-30144, 1, 11, 6840, 5, 0, 35286, 7, 39569, 9,
-58920, 21, 48218, 32, 3955, 3, 16, 39873, 22, 52602,
- 26, 24424, 2, 12, 16970, 23, 39699, 1, 3, 43918,
- 1, 28, 55465, 2, 19, 40885, 31, 18547, 1, 25,
-27498, 2, 6, 50609, 13, 63859,
+const unsigned short Dict213TagHashTable[] = {
+ 74, 74, 74, 75, 80, 85, 90, 74, 74, 74,
+ 95, 100, 74, 74, 74, 74, 105, 110, 115, 120,
+ 125, 130, 135, 144, 153, 158, 163, 168, 173, 74,
+ 74, 74, 178, 183, 188, 74, 193, 198, 203, 208,
+ 74, 74, 74, 213, 74, 74, 74, 74, 218, 223,
+ 228, 233, 238, 243, 74, 248, 74, 74, 74, 253,
+ 74, 74, 74, 74, 74, 74, 74, 74, 74, 74,
+ 74, 74, 74, 74, 0, 2, 16, 32, 53, 32,
+ 2, 19, 39, 56, 39, 2, 18, 38, 55, 38,
+ 2, 17, 37, 54, 37, 2, 21, 41, 58, 41,
+ 2, 20, 40, 57, 40, 2, 25, 51, 62, 51,
+ 2, 24, 50, 61, 50, 2, 23, 49, 60, 49,
+ 2, 22, 48, 59, 48, 2, 29, 55, 66, 55,
+ 2, 28, 54, 65, 54, 4, 27, 53, 34, 66,
+ 64, 53, 71, 66, 4, 26, 52, 35, 67, 63,
+ 52, 72, 67, 2, 32, 64, 69, 64, 2, 33,
+ 65, 70, 65, 2, 31, 57, 68, 57, 2, 30,
+ 56, 67, 56, 2, 36, 68, 73, 68, 2, 2,
+ 3, 39, 3, 2, 1, 2, 38, 2, 2, 0,
+ 1, 37, 1, 2, 6, 7, 43, 7, 2, 5,
+ 6, 42, 6, 2, 4, 5, 41, 5, 2, 3,
+ 4, 40, 4, 2, 7, 8, 44, 8, 2, 11,
+ 19, 48, 19, 2, 10, 18, 47, 18, 2, 9,
+ 17, 46, 17, 2, 8, 16, 45, 16, 2, 14,
+ 23, 51, 23, 2, 13, 22, 50, 22, 2, 12,
+ 20, 49, 20, 2, 15, 24, 52, 24,
+};
+
+const unsigned short Dict213KeyHashTable[] = {
+ 74, 75, 80, 85, 74, 90, 74, 99, 74, 74,
+ 104, 74, 109, 114, 119, 74, 74, 74, 74, 124,
+ 129, 74, 134, 74, 147, 74, 74, 156, 161, 74,
+ 74, 166, 74, 74, 74, 74, 74, 74, 74, 171,
+ 74, 74, 176, 185, 74, 190, 74, 74, 74, 74,
+ 74, 74, 195, 200, 74, 205, 74, 74, 74, 210,
+ 74, 219, 74, 74, 224, 74, 229, 234, 74, 74,
+ 243, 74, 74, 74, 0, 2, 2, 55444, 39, 55444,
+ 2, 10, 25626, 47, 25626, 2, 33, 58654, 70, 58654,
+ 4, 20, 47084, 30, 27912, 57, 47084, 67, 27912, 2,
+ 4, 4998, 41, 4998, 2, 1, 64641, 38, 64641, 2,
+ 15, 16673, 52, 16673, 2, 36, 43602, 73, 43602, 2,
+ 35, 15724, 72, 15724, 2, 18, 47840, 55, 47840, 2,
+ 11, 36188, 48, 36188, 6, 0, 17643, 9, 62228, 21,
+24109, 37, 17643, 46, 62228, 58, 24109, 4, 22, 26301,
+ 26, 44980, 59, 26301, 63, 44980, 2, 12, 41253, 49,
+41253, 2, 3, 54727, 40, 54727, 2, 25, 13749, 62,
+13749, 2, 14, 34215, 51, 34215, 4, 24, 18179, 29,
+56609, 61, 18179, 66, 56609, 2, 17, 45133, 54, 45133,
+ 2, 34, 22717, 71, 22717, 2, 27, 33151, 64, 33151,
+ 2, 5, 49413, 42, 49413, 2, 8, 46823, 45, 46823,
+ 4, 7, 52552, 32, 34745, 44, 52552, 69, 34745, 2,
+ 16, 52704, 53, 52704, 2, 23, 52617, 60, 52617, 2,
+ 28, 60500, 65, 60500, 4, 19, 53210, 31, 9273, 56,
+53210, 68, 9273, 4, 6, 58072, 13, 31929, 43, 58072,
+ 50, 31929,
};
-vtkDICOMDictionary::Dict Dict206Data = {
+vtkDICOMDictionary::Dict Dict213Data = {
"GEMS_3D_INTVL_01",
-37,
-37,
-Dict206TagHashTable,
-Dict206KeyHashTable,
-Dict206Contents
+74,
+74,
+Dict213TagHashTable,
+Dict213KeyHashTable,
+Dict213Contents
};
// ----- Philips Imaging DD 002 -----
-DictEntry Dict207Contents[] = {
+const DictEntry Dict214Contents[] = {
{ 0x2001, 0x0001, 0, VR::US, VM::M1, "" },
{ 0x2001, 0x0002, 0, VR::FD, VM::M1, "" },
{ 0x2001, 0x0013, 0, VR::SS, VM::M1, "" },
@@ -12655,7 +13382,7 @@ DictEntry Dict207Contents[] = {
{ 0x2001, 0x0073, 0, VR::FL, VM::M2, "" },
};
-unsigned short Dict207TagHashTable[] = {
+const unsigned short Dict214TagHashTable[] = {
50, 53, 56, 59, 62, 65, 68, 71, 74, 49,
77, 80, 83, 86, 89, 92, 95, 98, 101, 104,
107, 110, 113, 116, 119, 122, 125, 128, 131, 134,
@@ -12678,7 +13405,7 @@ unsigned short Dict207TagHashTable[] = {
39, 57, 1, 41, 59,
};
-unsigned short Dict207KeyHashTable[] = {
+const unsigned short Dict214KeyHashTable[] = {
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
@@ -12696,18 +13423,18 @@ unsigned short Dict207KeyHashTable[] = {
109, 45, 109, 46, 109, 47, 109, 48, 109,
};
-vtkDICOMDictionary::Dict Dict207Data = {
+vtkDICOMDictionary::Dict Dict214Data = {
"Philips Imaging DD 002",
49,
49,
-Dict207TagHashTable,
-Dict207KeyHashTable,
-Dict207Contents
+Dict214TagHashTable,
+Dict214KeyHashTable,
+Dict214Contents
};
// ----- KONICA1.0 -----
-DictEntry Dict208Contents[] = {
+const DictEntry Dict215Contents[] = {
{ 0x0031, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0031, 0x0001, 0, VR::US, VM::M1, "" },
{ 0x0031, 0x0005, 0, VR::US, VM::M1, "" },
@@ -12902,7 +13629,7 @@ DictEntry Dict208Contents[] = {
{ 0x0031, 0x00ff, 0, VR::SQ, VM::M1, "PrivateDataSequence" },
};
-unsigned short Dict208TagHashTable[] = {
+const unsigned short Dict215TagHashTable[] = {
193, 196, 199, 204, 207, 210, 213, 216, 219, 222,
225, 228, 231, 234, 239, 242, 245, 250, 255, 260,
265, 270, 273, 278, 283, 286, 289, 292, 295, 298,
@@ -12979,7 +13706,7 @@ unsigned short Dict208TagHashTable[] = {
141, 1, 116, 140,
};
-unsigned short Dict208KeyHashTable[] = {
+const unsigned short Dict215KeyHashTable[] = {
192, 192, 192, 192, 192, 193, 192, 192, 192, 192,
192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
@@ -13040,69 +13767,69 @@ unsigned short Dict208KeyHashTable[] = {
188, 28, 189, 28, 190, 28, 1, 191, 5825,
};
-vtkDICOMDictionary::Dict Dict208Data = {
+vtkDICOMDictionary::Dict Dict215Data = {
"KONICA1.0",
192,
192,
-Dict208TagHashTable,
-Dict208KeyHashTable,
-Dict208Contents
+Dict215TagHashTable,
+Dict215KeyHashTable,
+Dict215Contents
};
// ----- Applicare/Centricity Radiology Web/Version 1.0 -----
-DictEntry Dict209Contents[] = {
+const DictEntry Dict216Contents[] = {
{ 0x4109, 0x0001, 0, VR::SH, VM::M1, "MammographyLaterality" },
{ 0x4109, 0x0002, 0, VR::SH, VM::M1, "MammographyViewName" },
{ 0x4109, 0x0003, 0, VR::SH, VM::M1, "MammographyViewModifier" },
};
-unsigned short Dict209TagHashTable[] = {
+const unsigned short Dict216TagHashTable[] = {
4, 7, 3, 0, 1, 2, 3, 2, 0, 1,
1, 2,
};
-unsigned short Dict209KeyHashTable[] = {
+const unsigned short Dict216KeyHashTable[] = {
4, 9, 3, 0, 2, 1, 5633, 2, 59419, 1,
0, 24043,
};
-vtkDICOMDictionary::Dict Dict209Data = {
+vtkDICOMDictionary::Dict Dict216Data = {
"Applicare/Centricity Radiology Web/Version 1.0",
3,
3,
-Dict209TagHashTable,
-Dict209KeyHashTable,
-Dict209Contents
+Dict216TagHashTable,
+Dict216KeyHashTable,
+Dict216Contents
};
// ----- SIEMENS Ultrasound S2000 -----
-DictEntry Dict210Contents[] = {
+const DictEntry Dict217Contents[] = {
{ 0x0021, 0x0000, 0, VR::US, VM::M1, "NipplePosition" },
{ 0x0021, 0x0001, 0, VR::US, VM::M1, "ABVSClipDerivedFromVolume" },
};
-unsigned short Dict210TagHashTable[] = {
+const unsigned short Dict217TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict210KeyHashTable[] = {
+const unsigned short Dict217KeyHashTable[] = {
3, 2, 0, 2, 0, 64705, 1, 21012,
};
-vtkDICOMDictionary::Dict Dict210Data = {
+vtkDICOMDictionary::Dict Dict217Data = {
"SIEMENS Ultrasound S2000",
2,
-2,
-Dict210TagHashTable,
-Dict210KeyHashTable,
-Dict210Contents
+2,
+Dict217TagHashTable,
+Dict217KeyHashTable,
+Dict217Contents
};
// ----- 1.2.840.113708.794.1.1.2.0 -----
-DictEntry Dict211Contents[] = {
+const DictEntry Dict218Contents[] = {
{ 0x0087, 0x0010, 0, VR::CS, VM::M1, "MediaType" },
{ 0x0087, 0x0020, 0, VR::CS, VM::M1, "MediaLocation" },
{ 0x0087, 0x0030, 0, VR::ST, VM::M1, "StorageFileID" },
@@ -13110,28 +13837,28 @@ DictEntry Dict211Contents[] = {
{ 0x0087, 0x0050, 0, VR::IS, VM::M1, "EstimatedRetrieveTime" },
};
-unsigned short Dict211TagHashTable[] = {
+const unsigned short Dict218TagHashTable[] = {
6, 9, 14, 5, 17, 0, 1, 1, 32, 2,
2, 48, 3, 64, 1, 4, 80, 1, 0, 16,
};
-unsigned short Dict211KeyHashTable[] = {
+const unsigned short Dict218KeyHashTable[] = {
6, 5, 13, 5, 5, 0, 3, 0, 43643, 1,
27878, 4, 54482, 2, 2, 32513, 3, 1965,
};
-vtkDICOMDictionary::Dict Dict211Data = {
+vtkDICOMDictionary::Dict Dict218Data = {
"1.2.840.113708.794.1.1.2.0",
5,
5,
-Dict211TagHashTable,
-Dict211KeyHashTable,
-Dict211Contents
+Dict218TagHashTable,
+Dict218KeyHashTable,
+Dict218Contents
};
// ----- TOSHIBA MDW HEADER -----
-DictEntry Dict212Contents[] = {
+const DictEntry Dict219Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "ImageHeaderType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "ImageHeaderVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "ImageHeaderInfo" },
@@ -13140,53 +13867,53 @@ DictEntry Dict212Contents[] = {
{ 0x0029, 0x0020, 0, VR::OB, VM::M1, "SeriesHeaderInfo" },
};
-unsigned short Dict212TagHashTable[] = {
+const unsigned short Dict219TagHashTable[] = {
7, 10, 13, 16, 6, 6, 0, 1, 4, 25,
1, 3, 24, 1, 1, 9, 3, 0, 8, 2,
16, 5, 32,
};
-unsigned short Dict212KeyHashTable[] = {
+const unsigned short Dict219KeyHashTable[] = {
6, 7, 6, 10, 6, 15, 0, 1, 2, 58538,
2, 0, 60936, 5, 16923, 3, 1, 43859, 3, 19321,
4, 3567,
};
-vtkDICOMDictionary::Dict Dict212Data = {
+vtkDICOMDictionary::Dict Dict219Data = {
"TOSHIBA MDW HEADER",
6,
6,
-Dict212TagHashTable,
-Dict212KeyHashTable,
-Dict212Contents
+Dict219TagHashTable,
+Dict219KeyHashTable,
+Dict219Contents
};
// ----- GEMS_IQTB_IDEN_47 -----
-DictEntry Dict213Contents[] = {
+const DictEntry Dict220Contents[] = {
{ 0x0047, 0x0002, 0, VR::UL, VM::M1, "" },
};
-unsigned short Dict213TagHashTable[] = {
+const unsigned short Dict220TagHashTable[] = {
2, 0, 1, 0, 2,
};
-unsigned short Dict213KeyHashTable[] = {
+const unsigned short Dict220KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict213Data = {
+vtkDICOMDictionary::Dict Dict220Data = {
"GEMS_IQTB_IDEN_47",
1,
1,
-Dict213TagHashTable,
-Dict213KeyHashTable,
-Dict213Contents
+Dict220TagHashTable,
+Dict220KeyHashTable,
+Dict220Contents
};
// ----- GEMS_ACQU_01 -----
-DictEntry Dict214Contents[] = {
+const DictEntry Dict221Contents[] = {
{ 0x0009, 0x0024, 0, VR::DS, VM::M1, "" },
{ 0x0009, 0x0025, 0, VR::US, VM::M1, "" },
{ 0x0009, 0x003e, 0, VR::US, VM::M1, "" },
@@ -13374,7 +14101,7 @@ DictEntry Dict214Contents[] = {
{ 0x0019, 0x00f9, 0, VR::DS, VM::M1, "TransmitGain" },
};
-unsigned short Dict214TagHashTable[] = {
+const unsigned short Dict221TagHashTable[] = {
186, 191, 196, 201, 185, 206, 209, 212, 217, 222,
225, 230, 235, 240, 245, 250, 255, 258, 185, 261,
264, 267, 270, 275, 280, 285, 288, 293, 298, 303,
@@ -13448,7 +14175,7 @@ unsigned short Dict214TagHashTable[] = {
163,
};
-unsigned short Dict214KeyHashTable[] = {
+const unsigned short Dict221KeyHashTable[] = {
185, 185, 185, 186, 185, 185, 185, 189, 185, 185,
185, 194, 199, 185, 202, 205, 208, 185, 185, 295,
298, 185, 301, 185, 304, 185, 307, 312, 315, 318,
@@ -13517,69 +14244,69 @@ unsigned short Dict214KeyHashTable[] = {
45150, 2, 11, 54484, 31, 16389,
};
-vtkDICOMDictionary::Dict Dict214Data = {
+vtkDICOMDictionary::Dict Dict221Data = {
"GEMS_ACQU_01",
185,
185,
-Dict214TagHashTable,
-Dict214KeyHashTable,
-Dict214Contents
+Dict221TagHashTable,
+Dict221KeyHashTable,
+Dict221Contents
};
// ----- GEMS_IT_US_REPORT -----
-DictEntry Dict215Contents[] = {
+const DictEntry Dict222Contents[] = {
{ 0x0045, 0x0111, 0, VR::OW, VM::M1, "VividExcelFile" },
{ 0x0045, 0x0112, 0, VR::OW, VM::M1, "VividCHMFile" },
{ 0x0045, 0x0113, 0, VR::OW, VM::M1, "VividPDFFile" },
};
-unsigned short Dict215TagHashTable[] = {
+const unsigned short Dict222TagHashTable[] = {
4, 7, 10, 0, 1, 2, 275, 1, 0, 273,
1, 1, 274,
};
-unsigned short Dict215KeyHashTable[] = {
+const unsigned short Dict222KeyHashTable[] = {
4, 7, 3, 0, 1, 2, 55563, 2, 0, 34973,
1, 60362,
};
-vtkDICOMDictionary::Dict Dict215Data = {
+vtkDICOMDictionary::Dict Dict222Data = {
"GEMS_IT_US_REPORT",
3,
3,
-Dict215TagHashTable,
-Dict215KeyHashTable,
-Dict215Contents
+Dict222TagHashTable,
+Dict222KeyHashTable,
+Dict222Contents
};
// ----- SCHICK TECHNOLOGIES - Change List Creator ID -----
-DictEntry Dict216Contents[] = {
+const DictEntry Dict223Contents[] = {
{ 0x0021, 0x0001, 0, VR::UI, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict216TagHashTable[] = {
+const unsigned short Dict223TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 2,
};
-unsigned short Dict216KeyHashTable[] = {
+const unsigned short Dict223KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict216Data = {
+vtkDICOMDictionary::Dict Dict223Data = {
"SCHICK TECHNOLOGIES - Change List Creator ID",
2,
2,
-Dict216TagHashTable,
-Dict216KeyHashTable,
-Dict216Contents
+Dict223TagHashTable,
+Dict223KeyHashTable,
+Dict223Contents
};
// ----- astm.org/diconde/iod/NdeCtDetector -----
-DictEntry Dict217Contents[] = {
+const DictEntry Dict224Contents[] = {
{ 0x0009, 0x0011, 0, VR::DS, VM::M1, "InternalDetectorFrameTime" },
{ 0x0009, 0x0012, 0, VR::DS, VM::M1, "NumberOfFramesIntegrated" },
{ 0x0009, 0x0020, 0, VR::SQ, VM::M1, "DetectorTemperatureSequence" },
@@ -13589,53 +14316,53 @@ DictEntry Dict217Contents[] = {
{ 0x0009, 0x0028, 0, VR::DS, VM::M1, "SensorTemperature" },
};
-unsigned short Dict217TagHashTable[] = {
+const unsigned short Dict224TagHashTable[] = {
7, 8, 7, 11, 7, 16, 21, 0, 1, 3,
34, 2, 0, 17, 4, 36, 2, 5, 38, 6,
40, 2, 1, 18, 2, 32,
};
-unsigned short Dict217KeyHashTable[] = {
+const unsigned short Dict224KeyHashTable[] = {
8, 7, 13, 16, 7, 19, 24, 0, 2, 0,
20186, 6, 21387, 1, 3, 20978, 1, 5, 52094, 2,
1, 53765, 2, 8567, 1, 4, 7561,
};
-vtkDICOMDictionary::Dict Dict217Data = {
+vtkDICOMDictionary::Dict Dict224Data = {
"astm.org/diconde/iod/NdeCtDetector",
7,
7,
-Dict217TagHashTable,
-Dict217KeyHashTable,
-Dict217Contents
+Dict224TagHashTable,
+Dict224KeyHashTable,
+Dict224Contents
};
// ----- DLX_PATNT_01 -----
-DictEntry Dict218Contents[] = {
+const DictEntry Dict225Contents[] = {
{ 0x0011, 0x0001, 0, VR::LT, VM::M1, "PatientDOB" },
};
-unsigned short Dict218TagHashTable[] = {
+const unsigned short Dict225TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict218KeyHashTable[] = {
+const unsigned short Dict225KeyHashTable[] = {
2, 0, 1, 0, 49839,
};
-vtkDICOMDictionary::Dict Dict218Data = {
+vtkDICOMDictionary::Dict Dict225Data = {
"DLX_PATNT_01",
1,
1,
-Dict218TagHashTable,
-Dict218KeyHashTable,
-Dict218Contents
+Dict225TagHashTable,
+Dict225KeyHashTable,
+Dict225Contents
};
// ----- MEDIFACE -----
-DictEntry Dict219Contents[] = {
+const DictEntry Dict226Contents[] = {
{ 0x0029, 0x0001, 0, VR::UL, VM::M1, "" },
{ 0x0029, 0x0010, 0, VR::DS, VM::M1, "" },
{ 0x0029, 0x0011, 0, VR::DS, VM::M1, "" },
@@ -13645,30 +14372,30 @@ DictEntry Dict219Contents[] = {
{ 0x0029, 0x0030, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict219TagHashTable[] = {
+const unsigned short Dict226TagHashTable[] = {
8, 11, 16, 7, 19, 24, 7, 0, 1, 2,
17, 2, 1, 16, 4, 33, 1, 3, 32, 2,
5, 34, 6, 48, 1, 0, 1,
};
-unsigned short Dict219KeyHashTable[] = {
+const unsigned short Dict226KeyHashTable[] = {
7, 7, 7, 7, 7, 8, 7, 0, 7, 0,
768, 1, 768, 2, 768, 3, 768, 4, 768, 5,
768, 6, 768,
};
-vtkDICOMDictionary::Dict Dict219Data = {
+vtkDICOMDictionary::Dict Dict226Data = {
"MEDIFACE",
7,
7,
-Dict219TagHashTable,
-Dict219KeyHashTable,
-Dict219Contents
+Dict226TagHashTable,
+Dict226KeyHashTable,
+Dict226Contents
};
// ----- MITRA OBJECT ATTRIBUTES 1.0 -----
-DictEntry Dict220Contents[] = {
+const DictEntry Dict227Contents[] = {
{ 0x0033, 0x0002, 0, VR::LO, VM::M1, "" },
{ 0x0033, 0x0004, 0, VR::LO, VM::M1, "" },
{ 0x0033, 0x0006, 0, VR::LO, VM::M1, "" },
@@ -13676,28 +14403,28 @@ DictEntry Dict220Contents[] = {
{ 0x0033, 0x000a, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict220TagHashTable[] = {
+const unsigned short Dict227TagHashTable[] = {
6, 5, 9, 12, 15, 0, 1, 1, 4, 1,
4, 10, 1, 2, 6, 2, 0, 2, 3, 8,
};
-unsigned short Dict220KeyHashTable[] = {
+const unsigned short Dict227KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict220Data = {
+vtkDICOMDictionary::Dict Dict227Data = {
"MITRA OBJECT ATTRIBUTES 1.0",
5,
5,
-Dict220TagHashTable,
-Dict220KeyHashTable,
-Dict220Contents
+Dict227TagHashTable,
+Dict227KeyHashTable,
+Dict227Contents
};
// ----- SIEMENS MR DATAMAPPING ATTRIBUTES -----
-DictEntry Dict221Contents[] = {
+const DictEntry Dict228Contents[] = {
{ 0x0011, 0x0001, 0, VR::ST, VM::M1, "ReprocessingInfo" },
{ 0x0011, 0x0002, 0, VR::CS, VM::M1TN, "DataRoleType" },
{ 0x0011, 0x0003, 0, VR::ST, VM::M1, "DataRoleName" },
@@ -13715,7 +14442,7 @@ DictEntry Dict221Contents[] = {
{ 0x0011, 0x000F, 0, VR::ST, VM::M1, "IsInternalDataRole" },
};
-unsigned short Dict221TagHashTable[] = {
+const unsigned short Dict228TagHashTable[] = {
16, 19, 15, 24, 27, 30, 33, 36, 39, 42,
45, 48, 51, 54, 57, 0, 1, 14, 15, 2,
0, 1, 13, 14, 1, 2, 3, 1, 1, 2,
@@ -13724,7 +14451,7 @@ unsigned short Dict221TagHashTable[] = {
11, 1, 9, 10, 1, 12, 13, 1, 11, 12,
};
-unsigned short Dict221KeyHashTable[] = {
+const unsigned short Dict228KeyHashTable[] = {
15, 16, 15, 19, 24, 15, 27, 30, 15, 15,
15, 35, 46, 51, 15, 0, 1, 14, 46599, 2,
7, 7781, 13, 43440, 1, 1, 53729, 1, 3, 63044,
@@ -13733,70 +14460,70 @@ unsigned short Dict221KeyHashTable[] = {
60941, 1, 6, 52096,
};
-vtkDICOMDictionary::Dict Dict221Data = {
+vtkDICOMDictionary::Dict Dict228Data = {
"SIEMENS MR DATAMAPPING ATTRIBUTES",
15,
15,
-Dict221TagHashTable,
-Dict221KeyHashTable,
-Dict221Contents
+Dict228TagHashTable,
+Dict228KeyHashTable,
+Dict228Contents
};
// ----- SET WINDOW -----
-DictEntry Dict222Contents[] = {
+const DictEntry Dict229Contents[] = {
{ 0x0019, 0x0000, 0, VR::SH, VM::M1, "SetWindowImageFilter" },
{ 0x0019, 0x0001, 0, VR::US, VM::M1, "SetWindowMagnificationPower" },
};
-unsigned short Dict222TagHashTable[] = {
+const unsigned short Dict229TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict222KeyHashTable[] = {
+const unsigned short Dict229KeyHashTable[] = {
3, 6, 0, 1, 0, 4537, 1, 1, 59799,
};
-vtkDICOMDictionary::Dict Dict222Data = {
+vtkDICOMDictionary::Dict Dict229Data = {
"SET WINDOW",
2,
2,
-Dict222TagHashTable,
-Dict222KeyHashTable,
-Dict222Contents
+Dict229TagHashTable,
+Dict229KeyHashTable,
+Dict229Contents
};
// ----- SIEMENS CSA NON-IMAGE -----
-DictEntry Dict223Contents[] = {
+const DictEntry Dict230Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "CSADataType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "CSADataVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "CSADataInfo" },
{ 0x7fe1, 0x0010, 0, VR::OB, VM::M1, "CSAData" },
};
-unsigned short Dict223TagHashTable[] = {
+const unsigned short Dict230TagHashTable[] = {
5, 8, 13, 4, 0, 1, 1, 9, 2, 0,
8, 2, 16, 1, 3, 16,
};
-unsigned short Dict223KeyHashTable[] = {
+const unsigned short Dict230KeyHashTable[] = {
5, 4, 10, 4, 0, 2, 0, 38590, 1, 50215,
2, 2, 2224, 3, 14245,
};
-vtkDICOMDictionary::Dict Dict223Data = {
+vtkDICOMDictionary::Dict Dict230Data = {
"SIEMENS CSA NON-IMAGE",
4,
4,
-Dict223TagHashTable,
-Dict223KeyHashTable,
-Dict223Contents
+Dict230TagHashTable,
+Dict230KeyHashTable,
+Dict230Contents
};
// ----- GEMS_ADWSoft_DPO -----
-DictEntry Dict224Contents[] = {
+const DictEntry Dict231Contents[] = {
{ 0x0039, 0x0080, 0, VR::IS, VM::M1, "PrivateEntityNumber" },
{ 0x0039, 0x0085, 0, VR::DA, VM::M1, "PrivateEntityDate" },
{ 0x0039, 0x0090, 0, VR::TM, VM::M1, "PrivateEntityTime" },
@@ -13804,103 +14531,103 @@ DictEntry Dict224Contents[] = {
{ 0x0039, 0x00AA, 0, VR::CS, VM::M1, "PrivateEntityType" },
};
-unsigned short Dict224TagHashTable[] = {
+const unsigned short Dict231TagHashTable[] = {
6, 11, 14, 5, 17, 0, 2, 1, 133, 4,
170, 1, 2, 144, 1, 0, 128, 1, 3, 149,
};
-unsigned short Dict224KeyHashTable[] = {
+const unsigned short Dict231KeyHashTable[] = {
6, 5, 9, 14, 17, 0, 1, 2, 10204, 2,
1, 24581, 3, 50609, 1, 4, 13708, 1, 0, 26074,
};
-vtkDICOMDictionary::Dict Dict224Data = {
+vtkDICOMDictionary::Dict Dict231Data = {
"GEMS_ADWSoft_DPO",
5,
5,
-Dict224TagHashTable,
-Dict224KeyHashTable,
-Dict224Contents
+Dict231TagHashTable,
+Dict231KeyHashTable,
+Dict231Contents
};
// ----- EMAGEON STUDY HOME -----
-DictEntry Dict225Contents[] = {
+const DictEntry Dict232Contents[] = {
{ 0x0009, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0001, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict225TagHashTable[] = {
+const unsigned short Dict232TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict225KeyHashTable[] = {
+const unsigned short Dict232KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict225Data = {
+vtkDICOMDictionary::Dict Dict232Data = {
"EMAGEON STUDY HOME",
2,
2,
-Dict225TagHashTable,
-Dict225KeyHashTable,
-Dict225Contents
+Dict232TagHashTable,
+Dict232KeyHashTable,
+Dict232Contents
};
// ----- SIEMENS MR IMA -----
-DictEntry Dict226Contents[] = {
+const DictEntry Dict233Contents[] = {
{ 0x0021, 0x0001, 0, VR::SQ, VM::M1, "MRImageSequence" },
};
-unsigned short Dict226TagHashTable[] = {
+const unsigned short Dict233TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict226KeyHashTable[] = {
+const unsigned short Dict233KeyHashTable[] = {
2, 0, 1, 0, 11488,
};
-vtkDICOMDictionary::Dict Dict226Data = {
+vtkDICOMDictionary::Dict Dict233Data = {
"SIEMENS MR IMA",
1,
1,
-Dict226TagHashTable,
-Dict226KeyHashTable,
-Dict226Contents
+Dict233TagHashTable,
+Dict233KeyHashTable,
+Dict233Contents
};
// ----- SIEMENS MED PT -----
-DictEntry Dict227Contents[] = {
+const DictEntry Dict234Contents[] = {
{ 0x0071, 0x0021, 0, VR::UI, VM::M1, "RegistrationMatrixUID" },
{ 0x0071, 0x0022, 0, VR::DT, VM::M1, "DecayCorrectionDateTime" },
{ 0x0071, 0x0023, 0, VR::US, VM::M1, "VolumeIndex" },
{ 0x0071, 0x0024, 0, VR::IS, VM::M1, "TimeSliceDuration" },
};
-unsigned short Dict227TagHashTable[] = {
+const unsigned short Dict234TagHashTable[] = {
5, 8, 11, 14, 0, 1, 3, 36, 1, 0,
33, 1, 1, 34, 1, 2, 35,
};
-unsigned short Dict227KeyHashTable[] = {
+const unsigned short Dict234KeyHashTable[] = {
5, 8, 11, 14, 0, 1, 1, 31052, 1, 2,
24277, 1, 3, 35418, 1, 0, 14317,
};
-vtkDICOMDictionary::Dict Dict227Data = {
+vtkDICOMDictionary::Dict Dict234Data = {
"SIEMENS MED PT",
4,
4,
-Dict227TagHashTable,
-Dict227KeyHashTable,
-Dict227Contents
+Dict234TagHashTable,
+Dict234KeyHashTable,
+Dict234Contents
};
// ----- SIEMENS MED -----
-DictEntry Dict228Contents[] = {
+const DictEntry Dict235Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "RecognitionCode" },
{ 0x0009, 0x0030, 0, VR::US, VM::M1, "ByteOffsetOfOriginalHeader" },
{ 0x0009, 0x0031, 0, VR::UL, VM::M1, "LengthOfOriginalHeader" },
@@ -13919,7 +14646,7 @@ DictEntry Dict228Contents[] = {
{ 0x7005, 0x0010, 0, VR::LO, VM::M1, "Dummy" },
};
-unsigned short Dict228TagHashTable[] = {
+const unsigned short Dict235TagHashTable[] = {
17, 20, 16, 27, 16, 32, 16, 16, 35, 42,
16, 16, 51, 16, 16, 54, 0, 1, 10, 17,
3, 9, 16, 12, 32, 13, 16, 2, 11, 18,
@@ -13928,7 +14655,7 @@ unsigned short Dict228TagHashTable[] = {
81, 1, 8, 246, 1, 7, 245,
};
-unsigned short Dict228KeyHashTable[] = {
+const unsigned short Dict235KeyHashTable[] = {
16, 17, 16, 28, 16, 31, 36, 16, 16, 16,
39, 44, 47, 16, 54, 16, 0, 5, 0, 24778,
4, 31907, 7, 62752, 13, 63631, 15, 63631, 1, 1,
@@ -13937,46 +14664,46 @@ unsigned short Dict228KeyHashTable[] = {
10, 48788, 11, 10273, 1, 14, 53320,
};
-vtkDICOMDictionary::Dict Dict228Data = {
+vtkDICOMDictionary::Dict Dict235Data = {
"SIEMENS MED",
16,
16,
-Dict228TagHashTable,
-Dict228KeyHashTable,
-Dict228Contents
+Dict235TagHashTable,
+Dict235KeyHashTable,
+Dict235Contents
};
// ----- GEMS_AWSoft_SB1 -----
-DictEntry Dict229Contents[] = {
+const DictEntry Dict236Contents[] = {
{ 0x0039, 0x0050, 0, VR::UI, VM::M1, "ReferenceToStudyUID" },
{ 0x0039, 0x0051, 0, VR::UI, VM::M1, "ReferenceToSeriesUID" },
{ 0x0039, 0x0052, 0, VR::IS, VM::M1, "ReferenceToOriginalInstance" },
{ 0x0039, 0x0095, 0, VR::LO, VM::M1, "PrivateEntityLaunchCommand" },
};
-unsigned short Dict229TagHashTable[] = {
+const unsigned short Dict236TagHashTable[] = {
5, 8, 11, 4, 0, 1, 0, 80, 1, 1,
81, 2, 2, 82, 3, 149,
};
-unsigned short Dict229KeyHashTable[] = {
+const unsigned short Dict236KeyHashTable[] = {
5, 8, 11, 14, 0, 1, 1, 29625, 1, 2,
39160, 1, 0, 57324, 1, 3, 63261,
};
-vtkDICOMDictionary::Dict Dict229Data = {
+vtkDICOMDictionary::Dict Dict236Data = {
"GEMS_AWSoft_SB1",
4,
4,
-Dict229TagHashTable,
-Dict229KeyHashTable,
-Dict229Contents
+Dict236TagHashTable,
+Dict236KeyHashTable,
+Dict236Contents
};
// ----- ShowcaseAppearance -----
-DictEntry Dict230Contents[] = {
+const DictEntry Dict237Contents[] = {
{ 0x0029, 0x0010, 0, VR::DS, VM::M1, "" },
{ 0x0029, 0x0011, 0, VR::DS, VM::M1, "" },
{ 0x0029, 0x0012, 0, VR::DS, VM::M1, "" },
@@ -13984,52 +14711,52 @@ DictEntry Dict230Contents[] = {
{ 0x0029, 0x0014, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict230TagHashTable[] = {
+const unsigned short Dict237TagHashTable[] = {
5, 6, 11, 14, 17, 0, 2, 1, 17, 4,
20, 1, 0, 16, 1, 3, 19, 1, 2, 18,
};
-unsigned short Dict230KeyHashTable[] = {
+const unsigned short Dict237KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict230Data = {
+vtkDICOMDictionary::Dict Dict237Data = {
"ShowcaseAppearance",
5,
5,
-Dict230TagHashTable,
-Dict230KeyHashTable,
-Dict230Contents
+Dict237TagHashTable,
+Dict237KeyHashTable,
+Dict237Contents
};
// ----- SIEMENS SYNGO INSTANCE MANIFEST -----
-DictEntry Dict231Contents[] = {
+const DictEntry Dict238Contents[] = {
{ 0x0009, 0x0000, 0, VR::SQ, VM::M1, "TemporaryOriginalHeaderSequence" },
{ 0x0009, 0x0010, 0, VR::AE, VM::M1, "syngoIndexSourceAETitle" },
};
-unsigned short Dict231TagHashTable[] = {
+const unsigned short Dict238TagHashTable[] = {
2, 3, 0, 2, 0, 0, 1, 16,
};
-unsigned short Dict231KeyHashTable[] = {
+const unsigned short Dict238KeyHashTable[] = {
3, 6, 0, 1, 1, 21619, 1, 0, 18847,
};
-vtkDICOMDictionary::Dict Dict231Data = {
+vtkDICOMDictionary::Dict Dict238Data = {
"SIEMENS SYNGO INSTANCE MANIFEST",
2,
2,
-Dict231TagHashTable,
-Dict231KeyHashTable,
-Dict231Contents
+Dict238TagHashTable,
+Dict238KeyHashTable,
+Dict238Contents
};
// ----- Image (ID, Version, Size, Dump, GUID) -----
-DictEntry Dict232Contents[] = {
+const DictEntry Dict239Contents[] = {
{ 0x8003, 0x0000, 0, VR::LO, VM::M1, "ID" },
{ 0x8003, 0x0010, 0, VR::LO, VM::M1, "Version" },
{ 0x8003, 0x0020, 0, VR::UL, VM::M1, "Size" },
@@ -14037,55 +14764,55 @@ DictEntry Dict232Contents[] = {
{ 0x8003, 0x0040, 0, VR::LO, VM::M1, "GUID" },
};
-unsigned short Dict232TagHashTable[] = {
+const unsigned short Dict239TagHashTable[] = {
6, 9, 5, 14, 17, 0, 1, 2, 32, 2,
3, 48, 4, 64, 1, 0, 0, 1, 1, 16,
};
-unsigned short Dict232KeyHashTable[] = {
+const unsigned short Dict239KeyHashTable[] = {
6, 9, 5, 12, 17, 0, 1, 1, 10863, 1,
0, 58365, 2, 2, 57433, 3, 17688, 1, 4, 32034,
};
-vtkDICOMDictionary::Dict Dict232Data = {
+vtkDICOMDictionary::Dict Dict239Data = {
"Image (ID, Version, Size, Dump, GUID)",
5,
5,
-Dict232TagHashTable,
-Dict232KeyHashTable,
-Dict232Contents
+Dict239TagHashTable,
+Dict239KeyHashTable,
+Dict239Contents
};
// ----- SIEMENS SYNGO ENHANCED IDATASET API -----
-DictEntry Dict233Contents[] = {
+const DictEntry Dict240Contents[] = {
{ 0x0027, 0x0001, 0, VR::CS, VM::M1, "BusinessUnitCode" },
{ 0x0027, 0x0002, 0, VR::LO, VM::M1, "ApplicationType" },
{ 0x0027, 0x0003, 0, VR::SQ, VM::M1, "ApplicationAttributesSequence" },
};
-unsigned short Dict233TagHashTable[] = {
+const unsigned short Dict240TagHashTable[] = {
4, 7, 10, 0, 1, 2, 3, 1, 1, 2,
1, 0, 1,
};
-unsigned short Dict233KeyHashTable[] = {
+const unsigned short Dict240KeyHashTable[] = {
4, 7, 10, 0, 1, 0, 43524, 1, 1, 60478,
1, 2, 14077,
};
-vtkDICOMDictionary::Dict Dict233Data = {
+vtkDICOMDictionary::Dict Dict240Data = {
"SIEMENS SYNGO ENHANCED IDATASET API",
3,
3,
-Dict233TagHashTable,
-Dict233KeyHashTable,
-Dict233Contents
+Dict240TagHashTable,
+Dict240KeyHashTable,
+Dict240Contents
};
// ----- astm.org/diconde/iod/NdeUsEquipmentSettings -----
-DictEntry Dict234Contents[] = {
+const DictEntry Dict241Contents[] = {
{ 0x0009, 0x0020, 0, VR::SQ, VM::M1, "PulserSettingsSequence" },
{ 0x0009, 0x0022, 0, VR::DS, VM::M1, "PulseWidth" },
{ 0x0009, 0x0024, 0, VR::DS, VM::M1, "ExcitationFrequency" },
@@ -14125,7 +14852,7 @@ DictEntry Dict234Contents[] = {
{ 0x0009, 0x007E, 0, VR::DA, VM::M1TN, "CalibrationDate" },
};
-unsigned short Dict234TagHashTable[] = {
+const unsigned short Dict241TagHashTable[] = {
37, 38, 37, 41, 44, 47, 50, 55, 60, 65,
68, 73, 76, 79, 82, 87, 92, 37, 97, 100,
103, 108, 113, 116, 119, 37, 122, 37, 37, 37,
@@ -14142,7 +14869,7 @@ unsigned short Dict234TagHashTable[] = {
98, 1, 4, 40, 1, 28, 100, 1, 15, 64,
};
-unsigned short Dict234KeyHashTable[] = {
+const unsigned short Dict241KeyHashTable[] = {
37, 38, 43, 46, 53, 56, 37, 59, 64, 67,
70, 37, 73, 76, 79, 84, 37, 89, 98, 101,
104, 107, 112, 37, 115, 37, 118, 37, 121, 37,
@@ -14159,18 +14886,18 @@ unsigned short Dict234KeyHashTable[] = {
29, 10968, 1, 26, 2544, 1, 36, 13077,
};
-vtkDICOMDictionary::Dict Dict234Data = {
+vtkDICOMDictionary::Dict Dict241Data = {
"astm.org/diconde/iod/NdeUsEquipmentSettings",
37,
37,
-Dict234TagHashTable,
-Dict234KeyHashTable,
-Dict234Contents
+Dict241TagHashTable,
+Dict241KeyHashTable,
+Dict241Contents
};
// ----- SIEMENS MR HEADER -----
-DictEntry Dict235Contents[] = {
+const DictEntry Dict242Contents[] = {
{ 0x0019, 0x0008, 0, VR::CS, VM::M1, "" },
{ 0x0019, 0x0009, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x000A, 0, VR::US, VM::M1, "NumberOfImagesInMosaic" },
@@ -14211,7 +14938,7 @@ DictEntry Dict235Contents[] = {
{ 0x0051, 0x0019, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict235TagHashTable[] = {
+const unsigned short Dict242TagHashTable[] = {
38, 39, 38, 38, 38, 38, 38, 38, 42, 38,
45, 50, 55, 60, 65, 70, 75, 80, 85, 90,
95, 100, 103, 108, 111, 114, 38, 117, 120, 123,
@@ -14229,7 +14956,7 @@ unsigned short Dict235TagHashTable[] = {
25,
};
-unsigned short Dict235KeyHashTable[] = {
+const unsigned short Dict242KeyHashTable[] = {
39, 42, 45, 38, 48, 38, 38, 38, 53, 38,
56, 61, 38, 38, 38, 38, 38, 38, 66, 71,
38, 38, 74, 77, 38, 112, 38, 38, 38, 38,
@@ -14246,93 +14973,93 @@ unsigned short Dict235KeyHashTable[] = {
8471,
};
-vtkDICOMDictionary::Dict Dict235Data = {
+vtkDICOMDictionary::Dict Dict242Data = {
"SIEMENS MR HEADER",
38,
38,
-Dict235TagHashTable,
-Dict235KeyHashTable,
-Dict235Contents
+Dict242TagHashTable,
+Dict242KeyHashTable,
+Dict242Contents
};
// ----- AGFA KOSD 1.0 -----
-DictEntry Dict236Contents[] = {
+const DictEntry Dict243Contents[] = {
{ 0x0035, 0x0000, 0, VR::SH, VM::M1, "" },
{ 0x0035, 0x0003, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict236TagHashTable[] = {
+const unsigned short Dict243TagHashTable[] = {
3, 6, 0, 1, 1, 3, 1, 0, 0,
};
-unsigned short Dict236KeyHashTable[] = {
+const unsigned short Dict243KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict236Data = {
+vtkDICOMDictionary::Dict Dict243Data = {
"AGFA KOSD 1.0",
2,
2,
-Dict236TagHashTable,
-Dict236KeyHashTable,
-Dict236Contents
+Dict243TagHashTable,
+Dict243KeyHashTable,
+Dict243Contents
};
// ----- Siemens: Thorax/Multix FD Version -----
-DictEntry Dict237Contents[] = {
+const DictEntry Dict244Contents[] = {
{ 0x0017, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0017, 0x0001, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict237TagHashTable[] = {
+const unsigned short Dict244TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict237KeyHashTable[] = {
+const unsigned short Dict244KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict237Data = {
+vtkDICOMDictionary::Dict Dict244Data = {
"Siemens: Thorax/Multix FD Version",
2,
2,
-Dict237TagHashTable,
-Dict237KeyHashTable,
-Dict237Contents
+Dict244TagHashTable,
+Dict244KeyHashTable,
+Dict244Contents
};
// ----- SPI-P-Private-DiDi Release 1 -----
-DictEntry Dict238Contents[] = {
+const DictEntry Dict245Contents[] = {
{ 0x0019, 0x0000, 0, VR::LT, VM::M1, "PostModeString" },
{ 0x0019, 0x0001, 0, VR::LT, VM::M1, "PostData" },
{ 0x0019, 0x0010, 0, VR::LT, VM::M1, "ImageHeader" },
};
-unsigned short Dict238TagHashTable[] = {
+const unsigned short Dict245TagHashTable[] = {
4, 9, 3, 0, 2, 1, 1, 2, 16, 1,
0, 0,
};
-unsigned short Dict238KeyHashTable[] = {
+const unsigned short Dict245KeyHashTable[] = {
4, 9, 3, 0, 2, 0, 33837, 2, 58907, 1,
1, 10284,
};
-vtkDICOMDictionary::Dict Dict238Data = {
+vtkDICOMDictionary::Dict Dict245Data = {
"SPI-P-Private-DiDi Release 1",
3,
3,
-Dict238TagHashTable,
-Dict238KeyHashTable,
-Dict238Contents
+Dict245TagHashTable,
+Dict245KeyHashTable,
+Dict245Contents
};
// ----- SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0 -----
-DictEntry Dict239Contents[] = {
+const DictEntry Dict246Contents[] = {
{ 0x0025, 0x0000, 0, VR::US, VM::M1, "ViewNative" },
{ 0x0025, 0x0001, 0, VR::US, VM::M1, "OriginalSeriesNumber" },
{ 0x0025, 0x0002, 0, VR::US, VM::M1, "OriginalImageNumber" },
@@ -14358,7 +15085,7 @@ DictEntry Dict239Contents[] = {
{ 0x0025, 0x0016, 0, VR::IS, VM::M1, "ReadyProcessingStatus" },
};
-unsigned short Dict239TagHashTable[] = {
+const unsigned short Dict246TagHashTable[] = {
24, 27, 30, 33, 23, 36, 39, 42, 45, 48,
53, 56, 59, 62, 65, 68, 71, 74, 77, 80,
83, 86, 89, 0, 1, 11, 11, 1, 10, 10,
@@ -14371,7 +15098,7 @@ unsigned short Dict239TagHashTable[] = {
8, 8,
};
-unsigned short Dict239KeyHashTable[] = {
+const unsigned short Dict246KeyHashTable[] = {
23, 24, 27, 23, 34, 23, 39, 44, 47, 50,
23, 23, 59, 62, 23, 65, 68, 71, 23, 74,
77, 80, 83, 0, 1, 7, 14171, 3, 1, 45204,
@@ -14383,18 +15110,18 @@ unsigned short Dict239KeyHashTable[] = {
1, 9, 12229, 1, 6, 3597,
};
-vtkDICOMDictionary::Dict Dict239Data = {
+vtkDICOMDictionary::Dict Dict246Data = {
"SIEMENS SMS-AX ORIGINAL IMAGE INFO 1.0",
23,
23,
-Dict239TagHashTable,
-Dict239KeyHashTable,
-Dict239Contents
+Dict246TagHashTable,
+Dict246KeyHashTable,
+Dict246Contents
};
// ----- SIENET -----
-DictEntry Dict240Contents[] = {
+const DictEntry Dict247Contents[] = {
{ 0x0009, 0x0001, 0, VR::US, VM::M1, "SIENETCommandField" },
{ 0x0009, 0x0014, 0, VR::LO, VM::M1, "ReceiverPLA" },
{ 0x0009, 0x0016, 0, VR::US, VM::M1, "TransferPriority" },
@@ -14420,7 +15147,7 @@ DictEntry Dict240Contents[] = {
{ 0x00A5, 0x0005, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict240TagHashTable[] = {
+const unsigned short Dict247TagHashTable[] = {
23, 24, 23, 23, 23, 27, 30, 39, 42, 51,
60, 23, 63, 23, 23, 68, 23, 71, 74, 23,
77, 23, 80, 0, 1, 22, 5, 1, 4, 112,
@@ -14432,7 +15159,7 @@ unsigned short Dict240TagHashTable[] = {
1, 17, 32,
};
-unsigned short Dict240KeyHashTable[] = {
+const unsigned short Dict247KeyHashTable[] = {
23, 24, 23, 23, 23, 23, 27, 30, 23, 23,
33, 23, 36, 39, 44, 23, 23, 23, 49, 52,
23, 23, 55, 0, 1, 12, 9350, 1, 14, 2362,
@@ -14443,18 +15170,18 @@ unsigned short Dict240KeyHashTable[] = {
16, 233, 18, 233, 19, 233, 21, 233, 22, 233,
};
-vtkDICOMDictionary::Dict Dict240Data = {
+vtkDICOMDictionary::Dict Dict247Data = {
"SIENET",
23,
23,
-Dict240TagHashTable,
-Dict240KeyHashTable,
-Dict240Contents
+Dict247TagHashTable,
+Dict247KeyHashTable,
+Dict247Contents
};
// ----- TOSHIBA_MEC_CT3 -----
-DictEntry Dict241Contents[] = {
+const DictEntry Dict248Contents[] = {
{ 0x7005, 0x0000, 0, VR::OB, VM::M1, "CTPrivateData1" },
{ 0x7005, 0x0003, 0, VR::SH, VM::M1, "CardiacRRMeanTime" },
{ 0x7005, 0x0004, 0, VR::SH, VM::M1, "CardiacReconstructionGettingPhaseInPercent" },
@@ -14520,78 +15247,79 @@ DictEntry Dict241Contents[] = {
{ 0x7005, 0x006b, 0, VR::DS, VM::M3, "ImagePositionOf4DVolumeTopEquipment" },
{ 0x7005, 0x006c, 0, VR::UI, VM::M1, "SOPInstanceUIDOf4DVolume" },
{ 0x7005, 0x006d, 0, VR::UI, VM::M1, "SeriesInstanceUIDOf4DVolume" },
+{ 0x7005, 0x0079, 0, VR::SH, VM::M1, "InjectorElapsedTime" },
{ 0x7005, 0x00F1, 0, VR::CS, VM::M1, "ProtectMarkForStudyRecord" },
};
-unsigned short Dict241TagHashTable[] = {
- 66, 67, 66, 66, 66, 66, 66, 66, 70, 73,
- 66, 66, 66, 66, 78, 81, 84, 89, 94, 97,
- 102, 107, 110, 115, 120, 123, 126, 129, 132, 137,
- 142, 145, 148, 151, 154, 157, 160, 163, 166, 169,
- 172, 175, 178, 181, 184, 187, 190, 193, 66, 196,
- 199, 202, 207, 210, 215, 218, 221, 224, 227, 230,
- 233, 236, 239, 244, 247, 250, 0, 1, 39, 48,
- 1, 44, 57, 2, 43, 56, 65, 241, 1, 3,
- 5, 1, 2, 4, 2, 5, 7, 49, 68, 2,
- 4, 6, 50, 69, 1, 51, 70, 2, 0, 0,
- 52, 71, 2, 1, 3, 45, 64, 1, 46, 65,
- 2, 11, 13, 47, 66, 2, 10, 12, 48, 67,
- 1, 13, 15, 1, 12, 14, 1, 7, 9, 1,
- 6, 8, 2, 9, 11, 53, 72, 2, 8, 10,
- 54, 73, 1, 19, 21, 1, 18, 20, 1, 21,
- 23, 1, 20, 22, 1, 15, 17, 1, 14, 16,
- 1, 17, 19, 1, 16, 18, 1, 27, 29, 1,
- 26, 28, 1, 29, 31, 1, 28, 30, 1, 23,
- 25, 1, 22, 24, 1, 25, 27, 1, 24, 26,
- 1, 35, 37, 1, 34, 36, 1, 36, 38, 1,
- 31, 33, 2, 30, 32, 58, 103, 1, 33, 35,
- 2, 32, 34, 55, 97, 1, 56, 98, 1, 57,
- 99, 1, 63, 108, 1, 64, 109, 1, 38, 41,
- 1, 37, 40, 1, 59, 104, 1, 60, 105, 2,
- 40, 53, 61, 106, 1, 62, 107, 1, 42, 55,
- 1, 41, 54,
-};
-
-unsigned short Dict241KeyHashTable[] = {
- 67, 70, 73, 80, 87, 66, 66, 66, 90, 101,
- 104, 107, 66, 66, 110, 113, 118, 121, 124, 127,
- 66, 66, 132, 135, 138, 145, 148, 153, 156, 159,
- 66, 164, 167, 66, 66, 66, 170, 66, 66, 173,
- 66, 176, 66, 66, 179, 184, 187, 192, 197, 202,
- 66, 66, 205, 66, 208, 66, 213, 66, 66, 216,
- 219, 222, 225, 228, 233, 240, 0, 1, 41, 17458,
- 1, 40, 61467, 3, 30, 22097, 35, 41118, 43, 6094,
- 3, 20, 47934, 62, 24709, 63, 49672, 1, 54, 3083,
- 5, 1, 4076, 29, 18111, 32, 12642, 37, 64111, 48,
-12708, 1, 10, 34540, 1, 59, 8269, 1, 9, 39104,
- 1, 8, 35304, 2, 25, 48740, 36, 42766, 1, 3,
- 6412, 1, 42, 15643, 1, 18, 25668, 2, 2, 38163,
- 39, 47429, 1, 57, 6597, 1, 7, 53816, 3, 12,
-54866, 24, 57566, 51, 61399, 1, 22, 25248, 2, 28,
-40604, 64, 24329, 1, 49, 13202, 1, 26, 50046, 2,
- 21, 34712, 55, 15446, 1, 17, 3625, 1, 16, 64413,
- 1, 56, 44466, 1, 46, 21478, 1, 15, 11085, 2,
- 33, 55432, 52, 48323, 1, 50, 9211, 2, 11, 42535,
- 34, 17130, 2, 23, 58825, 45, 47531, 2, 5, 26492,
- 27, 19968, 1, 4, 26561, 1, 38, 43903, 2, 31,
- 203, 47, 40967, 1, 19, 27641, 1, 53, 40151, 1,
- 13, 17717, 1, 61, 36172, 1, 60, 45185, 2, 6,
-54302, 44, 30308, 3, 0, 17457, 58, 9682, 65, 25672,
- 1, 14, 17457,
+const unsigned short Dict248TagHashTable[] = {
+ 68, 71, 74, 77, 80, 83, 86, 89, 92, 67,
+ 95, 98, 101, 104, 109, 112, 115, 118, 121, 124,
+ 129, 67, 132, 135, 140, 143, 148, 67, 151, 67,
+ 67, 67, 67, 67, 67, 154, 157, 67, 67, 160,
+ 67, 67, 165, 168, 171, 174, 179, 182, 187, 192,
+ 195, 200, 205, 210, 213, 216, 219, 222, 227, 232,
+ 235, 238, 241, 244, 247, 250, 253, 0, 1, 26,
+ 28, 1, 29, 31, 1, 28, 30, 1, 23, 25,
+ 1, 22, 24, 1, 25, 27, 1, 24, 26, 1,
+ 35, 37, 1, 34, 36, 1, 36, 38, 1, 31,
+ 33, 1, 30, 32, 2, 33, 35, 58, 103, 1,
+ 32, 34, 1, 55, 97, 1, 56, 98, 1, 57,
+ 99, 1, 63, 108, 2, 38, 41, 64, 109, 1,
+ 37, 40, 1, 59, 104, 2, 40, 53, 60, 105,
+ 1, 61, 106, 2, 42, 55, 62, 107, 1, 41,
+ 54, 1, 39, 48, 1, 44, 57, 1, 43, 56,
+ 2, 65, 121, 66, 241, 1, 3, 5, 1, 2,
+ 4, 1, 5, 7, 2, 4, 6, 49, 68, 1,
+ 50, 69, 2, 0, 0, 51, 70, 2, 1, 3,
+ 52, 71, 1, 45, 64, 2, 11, 13, 46, 65,
+ 2, 10, 12, 47, 66, 2, 13, 15, 48, 67,
+ 1, 12, 14, 1, 7, 9, 1, 6, 8, 1,
+ 9, 11, 2, 8, 10, 53, 72, 2, 19, 21,
+ 54, 73, 1, 18, 20, 1, 21, 23, 1, 20,
+ 22, 1, 15, 17, 1, 14, 16, 1, 17, 19,
+ 1, 16, 18, 1, 27, 29,
+};
+
+const unsigned short Dict248KeyHashTable[] = {
+ 67, 68, 67, 67, 71, 74, 81, 86, 89, 67,
+ 67, 92, 97, 100, 103, 67, 67, 106, 67, 109,
+ 67, 112, 117, 67, 122, 125, 67, 128, 67, 67,
+ 67, 67, 135, 67, 140, 67, 143, 67, 146, 149,
+ 152, 67, 157, 67, 164, 169, 172, 177, 182, 185,
+ 196, 199, 67, 67, 202, 207, 67, 67, 67, 67,
+ 214, 67, 217, 224, 231, 234, 237, 0, 1, 3,
+35661, 1, 22, 61063, 3, 0, 54367, 60, 41577, 64,
+16141, 2, 9, 16023, 14, 54367, 1, 41, 54367, 1,
+ 37, 23050, 2, 18, 25285, 21, 6806, 1, 8, 40646,
+ 1, 7, 20734, 1, 2, 8249, 1, 36, 4958, 1,
+ 47, 7099, 2, 33, 54605, 38, 35423, 2, 6, 32951,
+ 65, 58942, 1, 16, 38998, 1, 10, 19352, 3, 15,
+25592, 29, 21753, 57, 23127, 2, 20, 26677, 63, 41105,
+ 1, 44, 62135, 1, 55, 25975, 1, 26, 43430, 1,
+ 58, 30079, 2, 30, 56980, 40, 60549, 3, 24, 40078,
+ 28, 15544, 42, 14431, 2, 23, 5127, 43, 29478, 1,
+ 19, 42879, 2, 35, 29744, 61, 26829, 2, 12, 3183,
+ 56, 62387, 1, 45, 3783, 5, 4, 48662, 34, 60891,
+ 50, 25702, 52, 29995, 59, 8145, 1, 32, 60382, 1,
+ 49, 9092, 2, 27, 59774, 66, 5726, 3, 39, 3682,
+ 46, 13332, 54, 34337, 1, 48, 15452, 3, 11, 55594,
+ 13, 824, 62, 61509, 3, 1, 60747, 25, 9864, 31,
+47151, 1, 5, 36856, 1, 53, 28792, 2, 17, 33893,
+ 51, 21356,
};
-vtkDICOMDictionary::Dict Dict241Data = {
+vtkDICOMDictionary::Dict Dict248Data = {
"TOSHIBA_MEC_CT3",
-66,
-66,
-Dict241TagHashTable,
-Dict241KeyHashTable,
-Dict241Contents
+67,
+67,
+Dict248TagHashTable,
+Dict248KeyHashTable,
+Dict248Contents
};
// ----- Silhouette Annot V1.0 -----
-DictEntry Dict242Contents[] = {
+const DictEntry Dict249Contents[] = {
{ 0x0029, 0x0011, 0, VR::IS, VM::M1, "AnnotationName" },
{ 0x0029, 0x0012, 0, VR::LT, VM::M1, "AnnotationFont" },
{ 0x0029, 0x0013, 0, VR::LT, VM::M1, "AnnotationTextForegroundColor" },
@@ -14629,7 +15357,7 @@ DictEntry Dict242Contents[] = {
{ 0x0029, 0x0045, 0, VR::UL, VM::M1, "AnnotationDontSave" },
};
-unsigned short Dict242TagHashTable[] = {
+const unsigned short Dict249TagHashTable[] = {
36, 41, 46, 49, 52, 35, 35, 35, 55, 58,
61, 64, 67, 70, 75, 80, 83, 86, 35, 35,
35, 89, 35, 92, 95, 100, 105, 110, 115, 120,
@@ -14646,7 +15374,7 @@ unsigned short Dict242TagHashTable[] = {
29, 64,
};
-unsigned short Dict242KeyHashTable[] = {
+const unsigned short Dict249KeyHashTable[] = {
36, 39, 35, 35, 42, 35, 45, 48, 51, 56,
59, 62, 35, 69, 72, 77, 35, 80, 83, 86,
35, 35, 91, 96, 99, 106, 35, 35, 109, 114,
@@ -14662,92 +15390,92 @@ unsigned short Dict242KeyHashTable[] = {
0, 61697, 12, 32355, 2, 17, 6091, 29, 37795,
};
-vtkDICOMDictionary::Dict Dict242Data = {
+vtkDICOMDictionary::Dict Dict249Data = {
"Silhouette Annot V1.0",
35,
35,
-Dict242TagHashTable,
-Dict242KeyHashTable,
-Dict242Contents
+Dict249TagHashTable,
+Dict249KeyHashTable,
+Dict249Contents
};
// ----- SIEMENS CT APPL MEASUREMENT -----
-DictEntry Dict243Contents[] = {
+const DictEntry Dict250Contents[] = {
{ 0x0029, 0x0000, 0, VR::UT, VM::M1, "OncologySegmentationMeasurementValues" },
{ 0x0029, 0x0001, 0, VR::ST, VM::M1, "OncologyMeasurementRecistStandard" },
{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "DualEnergyROIAnnotationMode" },
};
-unsigned short Dict243TagHashTable[] = {
+const unsigned short Dict250TagHashTable[] = {
4, 7, 10, 0, 1, 2, 16, 1, 1, 1,
1, 0, 0,
};
-unsigned short Dict243KeyHashTable[] = {
+const unsigned short Dict250KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 61627, 1, 7898, 2,
27039,
};
-vtkDICOMDictionary::Dict Dict243Data = {
+vtkDICOMDictionary::Dict Dict250Data = {
"SIEMENS CT APPL MEASUREMENT",
3,
3,
-Dict243TagHashTable,
-Dict243KeyHashTable,
-Dict243Contents
+Dict250TagHashTable,
+Dict250KeyHashTable,
+Dict250Contents
};
// ----- GEMS_CT_FLRO_1 -----
-DictEntry Dict244Contents[] = {
+const DictEntry Dict251Contents[] = {
{ 0x0029, 0x0001, 0, VR::SS, VM::M1, "CTIntFluoro" },
{ 0x0029, 0x0002, 0, VR::DS, VM::M1, "ImagePreciseLocation" },
};
-unsigned short Dict244TagHashTable[] = {
+const unsigned short Dict251TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 2,
};
-unsigned short Dict244KeyHashTable[] = {
+const unsigned short Dict251KeyHashTable[] = {
3, 2, 0, 2, 0, 51487, 1, 30694,
};
-vtkDICOMDictionary::Dict Dict244Data = {
+vtkDICOMDictionary::Dict Dict251Data = {
"GEMS_CT_FLRO_1",
2,
2,
-Dict244TagHashTable,
-Dict244KeyHashTable,
-Dict244Contents
+Dict251TagHashTable,
+Dict251KeyHashTable,
+Dict251Contents
};
// ----- RadWorksMarconi -----
-DictEntry Dict245Contents[] = {
+const DictEntry Dict252Contents[] = {
{ 0x0029, 0x0024, 0, VR::US, VM::M1TN, "KeyFrameIndices" },
};
-unsigned short Dict245TagHashTable[] = {
+const unsigned short Dict252TagHashTable[] = {
2, 0, 1, 0, 36,
};
-unsigned short Dict245KeyHashTable[] = {
+const unsigned short Dict252KeyHashTable[] = {
2, 0, 1, 0, 35992,
};
-vtkDICOMDictionary::Dict Dict245Data = {
+vtkDICOMDictionary::Dict Dict252Data = {
"RadWorksMarconi",
1,
1,
-Dict245TagHashTable,
-Dict245KeyHashTable,
-Dict245Contents
+Dict252TagHashTable,
+Dict252KeyHashTable,
+Dict252Contents
};
// ----- A.L.I. Technologies, Inc. -----
-DictEntry Dict246Contents[] = {
+const DictEntry Dict253Contents[] = {
{ 0x3711, 0x0001, 0, VR::LO, VM::M1, "Filename" },
{ 0x3711, 0x0002, 0, VR::OB, VM::M1, "DataBlobOfAVisit" },
{ 0x3711, 0x0003, 0, VR::US, VM::M1, "RevisionNumber" },
@@ -14761,7 +15489,7 @@ DictEntry Dict246Contents[] = {
{ 0x3711, 0x0097, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict246TagHashTable[] = {
+const unsigned short Dict253TagHashTable[] = {
12, 11, 17, 20, 11, 23, 26, 31, 34, 39,
11, 0, 2, 9, 48, 10, 151, 1, 4, 5,
1, 3, 4, 1, 6, 13, 2, 0, 1, 5,
@@ -14769,7 +15497,7 @@ unsigned short Dict246TagHashTable[] = {
1, 2,
};
-unsigned short Dict246KeyHashTable[] = {
+const unsigned short Dict253KeyHashTable[] = {
11, 11, 12, 15, 20, 27, 30, 11, 11, 35,
38, 0, 1, 10, 489, 2, 5, 40854, 8, 65259,
3, 4, 43240, 7, 7295, 9, 13293, 1, 2, 27112,
@@ -14777,93 +15505,93 @@ unsigned short Dict246KeyHashTable[] = {
27161,
};
-vtkDICOMDictionary::Dict Dict246Data = {
+vtkDICOMDictionary::Dict Dict253Data = {
"A.L.I. Technologies, Inc.",
11,
11,
-Dict246TagHashTable,
-Dict246KeyHashTable,
-Dict246Contents
+Dict253TagHashTable,
+Dict253KeyHashTable,
+Dict253Contents
};
// ----- SEGAMI MIML -----
-DictEntry Dict247Contents[] = {
+const DictEntry Dict254Contents[] = {
{ 0x0031, 0x0098, 0, VR::OW, VM::M1, "" },
};
-unsigned short Dict247TagHashTable[] = {
+const unsigned short Dict254TagHashTable[] = {
2, 0, 1, 0, 152,
};
-unsigned short Dict247KeyHashTable[] = {
+const unsigned short Dict254KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict247Data = {
+vtkDICOMDictionary::Dict Dict254Data = {
"SEGAMI MIML",
1,
1,
-Dict247TagHashTable,
-Dict247KeyHashTable,
-Dict247Contents
+Dict254TagHashTable,
+Dict254KeyHashTable,
+Dict254Contents
};
// ----- EMAGEON JPEG2K INFO -----
-DictEntry Dict248Contents[] = {
+const DictEntry Dict255Contents[] = {
{ 0x0009, 0x0000, 0, VR::SQ, VM::M1, "" },
{ 0x0009, 0x0001, 0, VR::DT, VM::M1, "" },
};
-unsigned short Dict248TagHashTable[] = {
+const unsigned short Dict255TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict248KeyHashTable[] = {
+const unsigned short Dict255KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict248Data = {
+vtkDICOMDictionary::Dict Dict255Data = {
"EMAGEON JPEG2K INFO",
2,
2,
-Dict248TagHashTable,
-Dict248KeyHashTable,
-Dict248Contents
+Dict255TagHashTable,
+Dict255KeyHashTable,
+Dict255Contents
};
// ----- FOEM 1.0 -----
-DictEntry Dict249Contents[] = {
+const DictEntry Dict256Contents[] = {
{ 0x0019, 0x0050, 0, VR::IS, VM::M1, "" },
{ 0x0025, 0x0010, 0, VR::US, VM::M1, "" },
{ 0x0025, 0x0012, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x0020, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict249TagHashTable[] = {
+const unsigned short Dict256TagHashTable[] = {
5, 8, 4, 13, 0, 1, 0, 80, 2, 1,
16, 3, 32, 1, 2, 18,
};
-unsigned short Dict249KeyHashTable[] = {
+const unsigned short Dict256KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict249Data = {
+vtkDICOMDictionary::Dict Dict256Data = {
"FOEM 1.0",
4,
4,
-Dict249TagHashTable,
-Dict249KeyHashTable,
-Dict249Contents
+Dict256TagHashTable,
+Dict256KeyHashTable,
+Dict256Contents
};
// ----- MeVis eD: Timepoint Information -----
-DictEntry Dict250Contents[] = {
+const DictEntry Dict257Contents[] = {
{ 0x0021, 0x0010, 0, VR::LT, VM::M1, "TimepointDateTime" },
{ 0x0021, 0x0011, 0, VR::CS, VM::M1, "TimepointDateTimeType" },
{ 0x0021, 0x0012, 0, VR::UN, VM::M1, "TimepointSeriesDescription" },
@@ -14871,28 +15599,28 @@ DictEntry Dict250Contents[] = {
{ 0x0021, 0x0071, 0, VR::UN, VM::M1, "TimepointEmptyFrames" },
};
-unsigned short Dict250TagHashTable[] = {
+const unsigned short Dict257TagHashTable[] = {
6, 9, 5, 14, 17, 0, 1, 3, 19, 2,
2, 18, 4, 113, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict250KeyHashTable[] = {
+const unsigned short Dict257KeyHashTable[] = {
6, 5, 11, 14, 5, 0, 2, 0, 20911, 1,
25769, 1, 2, 4175, 2, 3, 13689, 4, 63720,
};
-vtkDICOMDictionary::Dict Dict250Data = {
+vtkDICOMDictionary::Dict Dict257Data = {
"MeVis eD: Timepoint Information",
5,
5,
-Dict250TagHashTable,
-Dict250KeyHashTable,
-Dict250Contents
+Dict257TagHashTable,
+Dict257KeyHashTable,
+Dict257Contents
};
// ----- Harmony R2.0 -----
-DictEntry Dict251Contents[] = {
+const DictEntry Dict258Contents[] = {
{ 0x0019, 0x0079, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x007c, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x007d, 0, VR::UN, VM::M1, "" },
@@ -14920,7 +15648,7 @@ DictEntry Dict251Contents[] = {
{ 0x0019, 0x0099, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict251TagHashTable[] = {
+const unsigned short Dict258TagHashTable[] = {
26, 31, 36, 39, 42, 45, 48, 51, 54, 57,
25, 60, 63, 66, 69, 72, 75, 78, 81, 25,
84, 87, 90, 95, 25, 0, 2, 1, 124, 14,
@@ -14933,7 +15661,7 @@ unsigned short Dict251TagHashTable[] = {
2, 0, 121, 10, 136, 1, 15, 143,
};
-unsigned short Dict251KeyHashTable[] = {
+const unsigned short Dict258KeyHashTable[] = {
25, 25, 25, 25, 25, 25, 26, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 0, 25, 0, 215, 1,
@@ -14944,18 +15672,18 @@ unsigned short Dict251KeyHashTable[] = {
215, 22, 215, 23, 215, 24, 215,
};
-vtkDICOMDictionary::Dict Dict251Data = {
+vtkDICOMDictionary::Dict Dict258Data = {
"Harmony R2.0",
25,
25,
-Dict251TagHashTable,
-Dict251KeyHashTable,
-Dict251Contents
+Dict258TagHashTable,
+Dict258KeyHashTable,
+Dict258Contents
};
// ----- PAPYRUS -----
-DictEntry Dict252Contents[] = {
+const DictEntry Dict259Contents[] = {
{ 0x0009, 0x0000, 0, VR::LT, VM::M1, "OriginalFileName" },
{ 0x0009, 0x0010, 0, VR::LT, VM::M1, "OriginalFileLocation" },
{ 0x0009, 0x0018, 0, VR::LT, VM::M1, "DataSetIdentifier" },
@@ -14981,7 +15709,7 @@ DictEntry Dict252Contents[] = {
{ 0x0041, 0x00b3, 0, VR::UL, VM::M1TN, "InternalOffsetToImage" },
};
-unsigned short Dict252TagHashTable[] = {
+const unsigned short Dict259TagHashTable[] = {
23, 24, 29, 32, 35, 23, 23, 23, 23, 38,
41, 46, 51, 58, 23, 23, 23, 61, 68, 73,
76, 23, 81, 0, 2, 9, 52, 11, 64, 1,
@@ -14993,7 +15721,7 @@ unsigned short Dict252TagHashTable[] = {
161, 1, 8, 50,
};
-unsigned short Dict252KeyHashTable[] = {
+const unsigned short Dict259KeyHashTable[] = {
24, 23, 27, 23, 23, 30, 33, 23, 36, 47,
23, 23, 52, 55, 23, 23, 58, 61, 64, 69,
74, 79, 23, 0, 1, 7, 24168, 1, 2, 54676,
@@ -15005,18 +15733,18 @@ unsigned short Dict252KeyHashTable[] = {
11, 65124, 20, 22909,
};
-vtkDICOMDictionary::Dict Dict252Data = {
+vtkDICOMDictionary::Dict Dict259Data = {
"PAPYRUS",
23,
23,
-Dict252TagHashTable,
-Dict252KeyHashTable,
-Dict252Contents
+Dict259TagHashTable,
+Dict259KeyHashTable,
+Dict259Contents
};
// ----- Philips Imaging DD 070 -----
-DictEntry Dict253Contents[] = {
+const DictEntry Dict260Contents[] = {
{ 0x4001, 0x0010, 0, VR::SQ, VM::M1, "" },
{ 0x4001, 0x0011, 0, VR::SQ, VM::M1, "" },
{ 0x4001, 0x0012, 0, VR::SQ, VM::M1, "" },
@@ -15028,31 +15756,31 @@ DictEntry Dict253Contents[] = {
{ 0x4001, 0x001d, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict253TagHashTable[] = {
+const unsigned short Dict260TagHashTable[] = {
10, 15, 9, 18, 21, 9, 24, 29, 32, 0,
2, 2, 18, 8, 29, 1, 7, 28, 1, 5,
23, 1, 4, 22, 2, 1, 17, 6, 24, 1,
0, 16, 1, 3, 19,
};
-unsigned short Dict253KeyHashTable[] = {
+const unsigned short Dict260KeyHashTable[] = {
9, 9, 9, 9, 9, 9, 9, 9, 10, 0,
9, 0, 597, 1, 597, 2, 597, 3, 597, 4,
597, 5, 597, 6, 597, 7, 597, 8, 597,
};
-vtkDICOMDictionary::Dict Dict253Data = {
+vtkDICOMDictionary::Dict Dict260Data = {
"Philips Imaging DD 070",
9,
9,
-Dict253TagHashTable,
-Dict253KeyHashTable,
-Dict253Contents
+Dict260TagHashTable,
+Dict260KeyHashTable,
+Dict260Contents
};
// ----- TOSHIBA_MEC_XA3 -----
-DictEntry Dict254Contents[] = {
+const DictEntry Dict261Contents[] = {
{ 0x7079, 0x0021, 0, VR::SH, VM::M5, "" },
{ 0x7079, 0x0022, 0, VR::IS, VM::M2, "" },
{ 0x7079, 0x0023, 0, VR::IS, VM::M2, "" },
@@ -15144,7 +15872,7 @@ DictEntry Dict254Contents[] = {
{ 0x7079, 0x0080, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict254TagHashTable[] = {
+const unsigned short Dict261TagHashTable[] = {
89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
89, 89, 89, 89, 89, 89, 89, 90, 93, 96,
89, 89, 89, 89, 89, 99, 102, 105, 108, 111,
@@ -15180,7 +15908,7 @@ unsigned short Dict254TagHashTable[] = {
68, 1, 36, 71, 1, 35, 70,
};
-unsigned short Dict254KeyHashTable[] = {
+const unsigned short Dict261KeyHashTable[] = {
89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
@@ -15210,18 +15938,18 @@ unsigned short Dict254KeyHashTable[] = {
60, 85, 60, 86, 60, 87, 60, 88, 60,
};
-vtkDICOMDictionary::Dict Dict254Data = {
+vtkDICOMDictionary::Dict Dict261Data = {
"TOSHIBA_MEC_XA3",
89,
89,
-Dict254TagHashTable,
-Dict254KeyHashTable,
-Dict254Contents
+Dict261TagHashTable,
+Dict261KeyHashTable,
+Dict261Contents
};
// ----- Philips Imaging DD 073 -----
-DictEntry Dict255Contents[] = {
+const DictEntry Dict262Contents[] = {
{ 0x4007, 0x0048, 0, VR::FL, VM::M1, "" },
{ 0x4007, 0x004b, 0, VR::FL, VM::M1, "" },
{ 0x4007, 0x004c, 0, VR::LO, VM::M1, "" },
@@ -15230,53 +15958,53 @@ DictEntry Dict255Contents[] = {
{ 0x4007, 0x004f, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict255TagHashTable[] = {
+const unsigned short Dict262TagHashTable[] = {
6, 7, 10, 15, 18, 21, 0, 1, 1, 75,
2, 0, 72, 4, 78, 1, 5, 79, 1, 2,
76, 1, 3, 77,
};
-unsigned short Dict255KeyHashTable[] = {
+const unsigned short Dict262KeyHashTable[] = {
6, 6, 6, 6, 6, 7, 0, 6, 0, 896,
1, 896, 2, 896, 3, 896, 4, 896, 5, 896,
};
-vtkDICOMDictionary::Dict Dict255Data = {
+vtkDICOMDictionary::Dict Dict262Data = {
"Philips Imaging DD 073",
6,
6,
-Dict255TagHashTable,
-Dict255KeyHashTable,
-Dict255Contents
+Dict262TagHashTable,
+Dict262KeyHashTable,
+Dict262Contents
};
// ----- SEGAMI_HEADER -----
-DictEntry Dict256Contents[] = {
+const DictEntry Dict263Contents[] = {
{ 0x0029, 0x0031, 0, VR::CS, VM::M1, "" },
{ 0x0029, 0x0032, 0, VR::OW, VM::M1, "" },
};
-unsigned short Dict256TagHashTable[] = {
+const unsigned short Dict263TagHashTable[] = {
3, 6, 0, 1, 0, 49, 1, 1, 50,
};
-unsigned short Dict256KeyHashTable[] = {
+const unsigned short Dict263KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict256Data = {
+vtkDICOMDictionary::Dict Dict263Data = {
"SEGAMI_HEADER",
2,
2,
-Dict256TagHashTable,
-Dict256KeyHashTable,
-Dict256Contents
+Dict263TagHashTable,
+Dict263KeyHashTable,
+Dict263Contents
};
// ----- IMS s.r.l. Mammography Private Code -----
-DictEntry Dict257Contents[] = {
+const DictEntry Dict264Contents[] = {
{ 0x1271, 0x0001, 0, VR::IS, VM::M1, "Threshold1" },
{ 0x1271, 0x0002, 0, VR::IS, VM::M1, "Threshold2" },
{ 0x1271, 0x0010, 0, VR::IS, VM::M1, "SegmentationLeftBorder" },
@@ -15336,7 +16064,7 @@ DictEntry Dict257Contents[] = {
{ 0x1271, 0x0085, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict257TagHashTable[] = {
+const unsigned short Dict264TagHashTable[] = {
58, 63, 68, 73, 78, 85, 90, 97, 102, 105,
108, 113, 118, 121, 57, 124, 127, 130, 57, 57,
57, 57, 133, 136, 139, 142, 57, 57, 57, 57,
@@ -15361,7 +16089,7 @@ unsigned short Dict257TagHashTable[] = {
49, 120,
};
-unsigned short Dict257KeyHashTable[] = {
+const unsigned short Dict264KeyHashTable[] = {
57, 58, 57, 61, 64, 67, 57, 70, 57, 73,
76, 83, 88, 93, 98, 103, 106, 111, 114, 57,
57, 119, 57, 124, 127, 130, 135, 57, 138, 143,
@@ -15386,45 +16114,45 @@ unsigned short Dict257KeyHashTable[] = {
14681,
};
-vtkDICOMDictionary::Dict Dict257Data = {
+vtkDICOMDictionary::Dict Dict264Data = {
"IMS s.r.l. Mammography Private Code",
57,
57,
-Dict257TagHashTable,
-Dict257KeyHashTable,
-Dict257Contents
+Dict264TagHashTable,
+Dict264KeyHashTable,
+Dict264Contents
};
// ----- Silhouette Sequence Ids V1.0 -----
-DictEntry Dict258Contents[] = {
+const DictEntry Dict265Contents[] = {
{ 0x0029, 0x0041, 0, VR::SQ, VM::M1, "" },
{ 0x0029, 0x0042, 0, VR::SQ, VM::M1, "" },
{ 0x0029, 0x0043, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict258TagHashTable[] = {
+const unsigned short Dict265TagHashTable[] = {
4, 7, 10, 0, 1, 0, 65, 1, 1, 66,
1, 2, 67,
};
-unsigned short Dict258KeyHashTable[] = {
+const unsigned short Dict265KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2,
1793,
};
-vtkDICOMDictionary::Dict Dict258Data = {
+vtkDICOMDictionary::Dict Dict265Data = {
"Silhouette Sequence Ids V1.0",
3,
3,
-Dict258TagHashTable,
-Dict258KeyHashTable,
-Dict258Contents
+Dict265TagHashTable,
+Dict265KeyHashTable,
+Dict265Contents
};
// ----- SIEMENS SYNGO ADVANCED PRESENTATION -----
-DictEntry Dict259Contents[] = {
+const DictEntry Dict266Contents[] = {
{ 0x0029, 0x0000, 0, VR::CS, VM::M1, "PresentationName" },
{ 0x0029, 0x0001, 0, VR::CS, VM::M1, "PresentationType" },
{ 0x0029, 0x0002, 0, VR::SQ, VM::M1, "AdvancedPresentationSequence" },
@@ -15614,7 +16342,7 @@ DictEntry Dict259Contents[] = {
{ 0x0029, 0x00FD, 0, VR::LO, VM::M1, "MeasurementApplicationTypeID" },
};
-unsigned short Dict259TagHashTable[] = {
+const unsigned short Dict266TagHashTable[] = {
187, 188, 193, 196, 199, 187, 187, 187, 202, 205,
208, 211, 214, 217, 222, 227, 232, 237, 240, 243,
246, 249, 254, 259, 264, 269, 272, 275, 280, 285,
@@ -15689,7 +16417,7 @@ unsigned short Dict259TagHashTable[] = {
1, 112, 147, 1, 111, 146, 1, 110, 145,
};
-unsigned short Dict259KeyHashTable[] = {
+const unsigned short Dict266KeyHashTable[] = {
188, 193, 187, 198, 201, 204, 187, 207, 187, 187,
212, 215, 218, 187, 187, 221, 187, 187, 187, 187,
226, 187, 233, 187, 240, 243, 187, 248, 251, 256,
@@ -15761,18 +16489,18 @@ unsigned short Dict259KeyHashTable[] = {
62279,
};
-vtkDICOMDictionary::Dict Dict259Data = {
+vtkDICOMDictionary::Dict Dict266Data = {
"SIEMENS SYNGO ADVANCED PRESENTATION",
187,
187,
-Dict259TagHashTable,
-Dict259KeyHashTable,
-Dict259Contents
+Dict266TagHashTable,
+Dict266KeyHashTable,
+Dict266Contents
};
// ----- MITRA PRESENTATION 1.0 -----
-DictEntry Dict260Contents[] = {
+const DictEntry Dict267Contents[] = {
{ 0x0029, 0x0000, 0, VR::CS, VM::M1, "Rotation" },
{ 0x0029, 0x0001, 0, VR::LO, VM::M1, "WindowWidth" },
{ 0x0029, 0x0002, 0, VR::LO, VM::M1, "WindowCentre" },
@@ -15785,7 +16513,7 @@ DictEntry Dict260Contents[] = {
{ 0x0029, 0x0013, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict260TagHashTable[] = {
+const unsigned short Dict267TagHashTable[] = {
11, 14, 17, 20, 23, 26, 29, 32, 35, 38,
0, 1, 1, 1, 1, 0, 0, 1, 3, 3,
1, 2, 2, 1, 5, 5, 1, 4, 4, 1,
@@ -15793,123 +16521,123 @@ unsigned short Dict260TagHashTable[] = {
18,
};
-unsigned short Dict260KeyHashTable[] = {
+const unsigned short Dict267KeyHashTable[] = {
10, 11, 24, 29, 10, 10, 10, 10, 10, 32,
0, 6, 0, 6066, 1, 16198, 6, 538, 7, 538,
8, 538, 9, 538, 2, 2, 22918, 4, 58278, 1,
3, 29993, 1, 5, 33367,
};
-vtkDICOMDictionary::Dict Dict260Data = {
+vtkDICOMDictionary::Dict Dict267Data = {
"MITRA PRESENTATION 1.0",
10,
10,
-Dict260TagHashTable,
-Dict260KeyHashTable,
-Dict260Contents
+Dict267TagHashTable,
+Dict267KeyHashTable,
+Dict267Contents
};
// ----- CAMTRONICS IP -----
-DictEntry Dict261Contents[] = {
+const DictEntry Dict268Contents[] = {
{ 0x0029, 0x0010, 0, VR::LT, VM::M1, "" },
{ 0x0029, 0x0020, 0, VR::UN, VM::M1, "" },
{ 0x0029, 0x0030, 0, VR::UN, VM::M1, "" },
{ 0x0029, 0x0040, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict261TagHashTable[] = {
+const unsigned short Dict268TagHashTable[] = {
5, 8, 4, 4, 0, 1, 3, 64, 3, 0,
16, 1, 32, 2, 48,
};
-unsigned short Dict261KeyHashTable[] = {
+const unsigned short Dict268KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict261Data = {
+vtkDICOMDictionary::Dict Dict268Data = {
"CAMTRONICS IP",
4,
4,
-Dict261TagHashTable,
-Dict261KeyHashTable,
-Dict261Contents
+Dict268TagHashTable,
+Dict268KeyHashTable,
+Dict268Contents
};
// ----- GEMS_VXTL_USERDATA_01 -----
-DictEntry Dict262Contents[] = {
+const DictEntry Dict269Contents[] = {
{ 0x0047, 0x0011, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict262TagHashTable[] = {
+const unsigned short Dict269TagHashTable[] = {
2, 0, 1, 0, 17,
};
-unsigned short Dict262KeyHashTable[] = {
+const unsigned short Dict269KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict262Data = {
+vtkDICOMDictionary::Dict Dict269Data = {
"GEMS_VXTL_USERDATA_01",
1,
1,
-Dict262TagHashTable,
-Dict262KeyHashTable,
-Dict262Contents
+Dict269TagHashTable,
+Dict269KeyHashTable,
+Dict269Contents
};
// ----- MITRA OBJECT DOCUMENT 1.0 -----
-DictEntry Dict263Contents[] = {
+const DictEntry Dict270Contents[] = {
{ 0x0029, 0x0000, 0, VR::OB, VM::M1, "IMPAXObjectDocument" },
{ 0x0029, 0x0001, 0, VR::OB, VM::M1, "IMPAXMarkupXMLStored" },
};
-unsigned short Dict263TagHashTable[] = {
+const unsigned short Dict270TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict263KeyHashTable[] = {
+const unsigned short Dict270KeyHashTable[] = {
3, 2, 0, 2, 0, 48829, 1, 31771,
};
-vtkDICOMDictionary::Dict Dict263Data = {
+vtkDICOMDictionary::Dict Dict270Data = {
"MITRA OBJECT DOCUMENT 1.0",
2,
2,
-Dict263TagHashTable,
-Dict263KeyHashTable,
-Dict263Contents
+Dict270TagHashTable,
+Dict270KeyHashTable,
+Dict270Contents
};
// ----- QTUltrasound -----
-DictEntry Dict264Contents[] = {
+const DictEntry Dict271Contents[] = {
{ 0x0099, 0x0000, 0, VR::SS, VM::M1, "BreastDensityValue" },
};
-unsigned short Dict264TagHashTable[] = {
+const unsigned short Dict271TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict264KeyHashTable[] = {
+const unsigned short Dict271KeyHashTable[] = {
2, 0, 1, 0, 16835,
};
-vtkDICOMDictionary::Dict Dict264Data = {
+vtkDICOMDictionary::Dict Dict271Data = {
"QTUltrasound",
1,
1,
-Dict264TagHashTable,
-Dict264KeyHashTable,
-Dict264Contents
+Dict271TagHashTable,
+Dict271KeyHashTable,
+Dict271Contents
};
// ----- SIEMENS MED SMS USG ANTARES -----
-DictEntry Dict265Contents[] = {
+const DictEntry Dict272Contents[] = {
{ 0x0019, 0x0000, 0, VR::SH, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::FD, VM::M1, "" },
{ 0x0019, 0x000c, 0, VR::US, VM::M1, "" },
@@ -15963,7 +16691,7 @@ DictEntry Dict265Contents[] = {
{ 0x0019, 0x00a0, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict265TagHashTable[] = {
+const unsigned short Dict272TagHashTable[] = {
52, 57, 62, 65, 68, 75, 78, 81, 84, 87,
90, 93, 98, 51, 103, 51, 51, 51, 106, 109,
112, 117, 51, 122, 127, 130, 137, 51, 51, 140,
@@ -15986,7 +16714,7 @@ unsigned short Dict265TagHashTable[] = {
131,
};
-unsigned short Dict265KeyHashTable[] = {
+const unsigned short Dict272KeyHashTable[] = {
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
51, 51, 51, 51, 51, 51, 52, 51, 51, 51,
@@ -16005,93 +16733,93 @@ unsigned short Dict265KeyHashTable[] = {
105, 49, 105, 50, 105,
};
-vtkDICOMDictionary::Dict Dict265Data = {
+vtkDICOMDictionary::Dict Dict272Data = {
"SIEMENS MED SMS USG ANTARES",
51,
51,
-Dict265TagHashTable,
-Dict265KeyHashTable,
-Dict265Contents
+Dict272TagHashTable,
+Dict272KeyHashTable,
+Dict272Contents
};
// ----- PI Private Block (0781:3000 - 0781:30FF) -----
-DictEntry Dict266Contents[] = {
+const DictEntry Dict273Contents[] = {
{ 0x0781, 0x0001, 0, VR::US, VM::M1, "" },
{ 0x0781, 0x0002, 0, VR::US, VM::M1, "" },
{ 0x0781, 0x0005, 0, VR::FL, VM::M1, "" },
{ 0x0781, 0x0009, 0, VR::FL, VM::M4, "" },
};
-unsigned short Dict266TagHashTable[] = {
+const unsigned short Dict273TagHashTable[] = {
4, 5, 8, 4, 0, 1, 1, 2, 3, 0,
1, 2, 5, 3, 9,
};
-unsigned short Dict266KeyHashTable[] = {
+const unsigned short Dict273KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict266Data = {
+vtkDICOMDictionary::Dict Dict273Data = {
"PI Private Block (0781:3000 - 0781:30FF)",
4,
4,
-Dict266TagHashTable,
-Dict266KeyHashTable,
-Dict266Contents
+Dict273TagHashTable,
+Dict273KeyHashTable,
+Dict273Contents
};
// ----- SIEMENS MED MAMMO -----
-DictEntry Dict267Contents[] = {
+const DictEntry Dict274Contents[] = {
{ 0x0029, 0x005a, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict267TagHashTable[] = {
+const unsigned short Dict274TagHashTable[] = {
2, 0, 1, 0, 90,
};
-unsigned short Dict267KeyHashTable[] = {
+const unsigned short Dict274KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict267Data = {
+vtkDICOMDictionary::Dict Dict274Data = {
"SIEMENS MED MAMMO",
1,
1,
-Dict267TagHashTable,
-Dict267KeyHashTable,
-Dict267Contents
+Dict274TagHashTable,
+Dict274KeyHashTable,
+Dict274Contents
};
// ----- PM -----
-DictEntry Dict268Contents[] = {
+const DictEntry Dict275Contents[] = {
{ 0x0101, 0x0005, 0, VR::LO, VM::M1TN, "ImageEnhancementParameterFile" },
{ 0x0101, 0x0006, 0, VR::IS, VM::M1, "OriginalSigmoidRatio" },
};
-unsigned short Dict268TagHashTable[] = {
+const unsigned short Dict275TagHashTable[] = {
3, 6, 0, 1, 0, 5, 1, 1, 6,
};
-unsigned short Dict268KeyHashTable[] = {
+const unsigned short Dict275KeyHashTable[] = {
2, 3, 0, 2, 0, 39543, 1, 33778,
};
-vtkDICOMDictionary::Dict Dict268Data = {
+vtkDICOMDictionary::Dict Dict275Data = {
"PM",
2,
2,
-Dict268TagHashTable,
-Dict268KeyHashTable,
-Dict268Contents
+Dict275TagHashTable,
+Dict275KeyHashTable,
+Dict275Contents
};
// ----- MITRA MARKUP 1.0 -----
-DictEntry Dict269Contents[] = {
+const DictEntry Dict276Contents[] = {
{ 0x0029, 0x0000, 0, VR::OB, VM::M1TN, "Markup1" },
{ 0x0029, 0x0001, 0, VR::OB, VM::M1TN, "Markup2" },
{ 0x0029, 0x0002, 0, VR::OB, VM::M1TN, "Markup3" },
@@ -16109,7 +16837,7 @@ DictEntry Dict269Contents[] = {
{ 0x0029, 0x0014, 0, VR::OB, VM::M1TN, "Markup15" },
};
-unsigned short Dict269TagHashTable[] = {
+const unsigned short Dict276TagHashTable[] = {
16, 19, 24, 29, 15, 15, 15, 15, 15, 15,
32, 35, 40, 45, 50, 0, 1, 4, 4, 2,
7, 7, 14, 20, 2, 6, 6, 9, 9, 1,
@@ -16118,7 +16846,7 @@ unsigned short Dict269TagHashTable[] = {
2, 5, 5, 12, 18,
};
-unsigned short Dict269KeyHashTable[] = {
+const unsigned short Dict276KeyHashTable[] = {
16, 15, 15, 19, 22, 25, 28, 31, 34, 37,
40, 45, 50, 53, 56, 0, 1, 14, 24981, 1,
0, 16909, 1, 1, 16909, 1, 2, 16909, 1, 3,
@@ -16127,18 +16855,18 @@ unsigned short Dict269KeyHashTable[] = {
1, 11, 24980, 1, 12, 24980, 1, 13, 24980,
};
-vtkDICOMDictionary::Dict Dict269Data = {
+vtkDICOMDictionary::Dict Dict276Data = {
"MITRA MARKUP 1.0",
15,
15,
-Dict269TagHashTable,
-Dict269KeyHashTable,
-Dict269Contents
+Dict276TagHashTable,
+Dict276KeyHashTable,
+Dict276Contents
};
// ----- SIEMENS_FLCOMPACT_VA01A_PROC -----
-DictEntry Dict270Contents[] = {
+const DictEntry Dict277Contents[] = {
{ 0x0017, 0x000a, 0, VR::SS, VM::M1, "" },
{ 0x0017, 0x000b, 0, VR::SS, VM::M1, "" },
{ 0x0017, 0x000c, 0, VR::SS, VM::M1, "" },
@@ -16206,7 +16934,7 @@ DictEntry Dict270Contents[] = {
{ 0x0017, 0x00c0, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict270TagHashTable[] = {
+const unsigned short Dict277TagHashTable[] = {
66, 69, 74, 77, 82, 85, 88, 93, 96, 99,
65, 104, 107, 110, 113, 118, 121, 124, 65, 65,
65, 65, 129, 132, 137, 144, 149, 156, 161, 166,
@@ -16233,7 +16961,7 @@ unsigned short Dict270TagHashTable[] = {
1, 27, 41, 1, 26, 40,
};
-unsigned short Dict270KeyHashTable[] = {
+const unsigned short Dict277KeyHashTable[] = {
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
65, 65, 65, 65, 65, 65, 65, 65, 65, 65,
@@ -16256,18 +16984,18 @@ unsigned short Dict270KeyHashTable[] = {
82, 62, 82, 63, 82, 64, 82,
};
-vtkDICOMDictionary::Dict Dict270Data = {
+vtkDICOMDictionary::Dict Dict277Data = {
"SIEMENS_FLCOMPACT_VA01A_PROC",
65,
65,
-Dict270TagHashTable,
-Dict270KeyHashTable,
-Dict270Contents
+Dict277TagHashTable,
+Dict277KeyHashTable,
+Dict277Contents
};
// ----- Applicare/RadStore/Version 1.0 -----
-DictEntry Dict271Contents[] = {
+const DictEntry Dict278Contents[] = {
{ 0x3113, 0x0001, 0, VR::SL, VM::M1, "" },
{ 0x3113, 0x0002, 0, VR::SL, VM::M1, "Id1" },
{ 0x3113, 0x0003, 0, VR::SL, VM::M1, "Id2" },
@@ -16310,7 +17038,7 @@ DictEntry Dict271Contents[] = {
{ 0x3113, 0x0069, 0, VR::AT, VM::M1TN, "DeletedTags" },
};
-unsigned short Dict271TagHashTable[] = {
+const unsigned short Dict278TagHashTable[] = {
40, 40, 40, 40, 40, 40, 41, 40, 44, 47,
50, 40, 53, 56, 59, 62, 65, 68, 71, 76,
81, 86, 91, 96, 40, 99, 102, 105, 108, 113,
@@ -16328,7 +17056,7 @@ unsigned short Dict271TagHashTable[] = {
33, 82, 2, 1, 2, 34, 83, 1, 0, 1,
};
-unsigned short Dict271KeyHashTable[] = {
+const unsigned short Dict278KeyHashTable[] = {
41, 40, 48, 51, 56, 59, 62, 65, 68, 40,
73, 76, 81, 40, 84, 40, 40, 40, 87, 90,
40, 95, 40, 40, 40, 110, 40, 40, 40, 40,
@@ -16346,18 +17074,18 @@ unsigned short Dict271KeyHashTable[] = {
1, 14, 12256,
};
-vtkDICOMDictionary::Dict Dict271Data = {
+vtkDICOMDictionary::Dict Dict278Data = {
"Applicare/RadStore/Version 1.0",
40,
40,
-Dict271TagHashTable,
-Dict271KeyHashTable,
-Dict271Contents
+Dict278TagHashTable,
+Dict278KeyHashTable,
+Dict278Contents
};
// ----- Siemens: Thorax/Multix FD Post Processing -----
-DictEntry Dict272Contents[] = {
+const DictEntry Dict279Contents[] = {
{ 0x0021, 0x0000, 0, VR::US, VM::M1, "" },
{ 0x0021, 0x0001, 0, VR::SS, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::FL, VM::M1, "" },
@@ -16387,7 +17115,7 @@ DictEntry Dict272Contents[] = {
{ 0x0021, 0x0031, 0, VR::US, VM::M1, "AcquisitionSortNumber" },
};
-unsigned short Dict272TagHashTable[] = {
+const unsigned short Dict279TagHashTable[] = {
28, 31, 27, 34, 27, 37, 40, 43, 46, 49,
52, 55, 58, 61, 64, 67, 70, 75, 80, 83,
86, 89, 92, 95, 98, 101, 104, 0, 1, 23,
@@ -16401,7 +17129,7 @@ unsigned short Dict272TagHashTable[] = {
18, 1, 21, 21, 1, 20, 20,
};
-unsigned short Dict272KeyHashTable[] = {
+const unsigned short Dict279KeyHashTable[] = {
28, 31, 27, 34, 37, 27, 27, 27, 42, 27,
73, 27, 27, 27, 27, 27, 27, 76, 79, 82,
27, 27, 27, 27, 85, 27, 27, 0, 1, 22,
@@ -16414,72 +17142,75 @@ unsigned short Dict272KeyHashTable[] = {
24, 65387,
};
-vtkDICOMDictionary::Dict Dict272Data = {
+vtkDICOMDictionary::Dict Dict279Data = {
"Siemens: Thorax/Multix FD Post Processing",
27,
27,
-Dict272TagHashTable,
-Dict272KeyHashTable,
-Dict272Contents
+Dict279TagHashTable,
+Dict279KeyHashTable,
+Dict279Contents
};
-// ----- SIEMENS MED PT WAVEFORM -----
+// ----- AMICAS0 -----
-DictEntry Dict273Contents[] = {
-{ 0x0071, 0x0046, 0, VR::UN, VM::M1, "StartingRespiratoryAmplitude" },
-{ 0x0071, 0x0047, 0, VR::UN, VM::M1, "StartingRespiratoryPhase" },
-{ 0x0071, 0x0048, 0, VR::UN, VM::M1, "EndingRespiratoryAmplitude" },
-{ 0x0071, 0x0049, 0, VR::UN, VM::M1, "EndingRespiratoryPhase" },
-{ 0x0071, 0x0050, 0, VR::CS, VM::M1, "RespiratoryTriggerType" },
+const DictEntry Dict280Contents[] = {
+{ 0x0023, 0x0001, 0, VR::UI, VM::M1, "" },
+{ 0x0023, 0x0008, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0010, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0016, 0, VR::SL, VM::M1, "" },
+{ 0x0023, 0x0043, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0045, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0054, 0, VR::ST, VM::M1, "" },
};
-
-unsigned short Dict273TagHashTable[] = {
- 6, 9, 12, 15, 18, 0, 1, 0, 70, 1,
- 3, 73, 1, 2, 72, 1, 4, 80, 1, 1,
- 71,
+
+const unsigned short Dict280TagHashTable[] = {
+ 7, 8, 11, 7, 14, 17, 20, 0, 1, 1,
+ 8, 1, 2, 16, 1, 3, 22, 1, 5, 69,
+ 3, 0, 1, 4, 67, 6, 84,
};
-unsigned short Dict273KeyHashTable[] = {
- 5, 5, 6, 9, 12, 0, 1, 4, 51609, 1,
- 0, 61035, 3, 1, 15354, 2, 34163, 3, 64847,
+const unsigned short Dict280KeyHashTable[] = {
+ 7, 7, 7, 7, 7, 8, 7, 0, 7, 0,
+ 768, 1, 768, 2, 768, 3, 768, 4, 768, 5,
+ 768, 6, 768,
};
-vtkDICOMDictionary::Dict Dict273Data = {
-"SIEMENS MED PT WAVEFORM",
-5,
-5,
-Dict273TagHashTable,
-Dict273KeyHashTable,
-Dict273Contents
+vtkDICOMDictionary::Dict Dict280Data = {
+"AMICAS0",
+7,
+7,
+Dict280TagHashTable,
+Dict280KeyHashTable,
+Dict280Contents
};
// ----- RamSoft Custom Report Identifier -----
-DictEntry Dict274Contents[] = {
+const DictEntry Dict281Contents[] = {
{ 0x3113, 0x0010, 0, VR::OB, VM::M1, "BinaryDocument" },
{ 0x3113, 0x0020, 0, VR::UL, VM::M1, "BinaryDocumentSize" },
};
-unsigned short Dict274TagHashTable[] = {
+const unsigned short Dict281TagHashTable[] = {
2, 3, 0, 2, 0, 16, 1, 32,
};
-unsigned short Dict274KeyHashTable[] = {
+const unsigned short Dict281KeyHashTable[] = {
3, 6, 0, 1, 1, 16338, 1, 0, 28788,
};
-vtkDICOMDictionary::Dict Dict274Data = {
+vtkDICOMDictionary::Dict Dict281Data = {
"RamSoft Custom Report Identifier",
2,
2,
-Dict274TagHashTable,
-Dict274KeyHashTable,
-Dict274Contents
+Dict281TagHashTable,
+Dict281KeyHashTable,
+Dict281Contents
};
// ----- Applicare/RadWorks/Version 5.0 -----
-DictEntry Dict275Contents[] = {
+const DictEntry Dict282Contents[] = {
{ 0x3109, 0x0001, 0, VR::ST, VM::M1, "WorklistFilename" },
{ 0x3109, 0x0002, 0, VR::SH, VM::M1, "NewSeenStatus" },
{ 0x3109, 0x0003, 0, VR::CS, VM::M1, "DeleteLock" },
@@ -16530,7 +17261,7 @@ DictEntry Dict275Contents[] = {
{ 0x3109, 0x00EF, 0, VR::CS, VM::M1, "Action" },
};
-unsigned short Dict275TagHashTable[] = {
+const unsigned short Dict282TagHashTable[] = {
49, 52, 48, 48, 57, 60, 63, 66, 69, 72,
75, 78, 81, 86, 91, 96, 101, 104, 48, 107,
110, 115, 120, 123, 126, 131, 136, 141, 144, 149,
@@ -16551,7 +17282,7 @@ unsigned short Dict275TagHashTable[] = {
17, 1, 14, 16, 1, 17, 19, 1, 16, 18,
};
-unsigned short Dict275KeyHashTable[] = {
+const unsigned short Dict282KeyHashTable[] = {
49, 52, 48, 48, 48, 55, 66, 48, 69, 72,
48, 48, 77, 48, 80, 48, 83, 94, 99, 104,
48, 107, 110, 113, 120, 125, 134, 48, 48, 48,
@@ -16572,18 +17303,18 @@ unsigned short Dict275KeyHashTable[] = {
27686, 1, 13, 32764,
};
-vtkDICOMDictionary::Dict Dict275Data = {
+vtkDICOMDictionary::Dict Dict282Data = {
"Applicare/RadWorks/Version 5.0",
48,
48,
-Dict275TagHashTable,
-Dict275KeyHashTable,
-Dict275Contents
+Dict282TagHashTable,
+Dict282KeyHashTable,
+Dict282Contents
};
// ----- Voxar 2.16.124.113543.6003.1999.12.20.12.5.0 -----
-DictEntry Dict276Contents[] = {
+const DictEntry Dict283Contents[] = {
{ 0x1135, 0x0000, 0, VR::UI, VM::M1, "" },
{ 0x1135, 0x0001, 0, VR::OB, VM::M1, "" },
{ 0x1135, 0x0002, 0, VR::SQ, VM::M1, "" },
@@ -16600,7 +17331,7 @@ DictEntry Dict276Contents[] = {
{ 0x1135, 0x0021, 0, VR::UL, VM::M1, "" },
};
-unsigned short Dict276TagHashTable[] = {
+const unsigned short Dict283TagHashTable[] = {
14, 15, 20, 23, 26, 29, 34, 37, 40, 14,
14, 43, 46, 51, 0, 2, 2, 2, 9, 20,
1, 11, 23, 1, 10, 22, 1, 4, 7, 2,
@@ -16609,7 +17340,7 @@ unsigned short Dict276TagHashTable[] = {
19, 1, 0, 0,
};
-unsigned short Dict276KeyHashTable[] = {
+const unsigned short Dict283KeyHashTable[] = {
14, 14, 14, 14, 14, 15, 14, 14, 14, 14,
14, 14, 14, 14, 0, 14, 0, 384, 1, 384,
2, 384, 3, 384, 4, 384, 5, 384, 6, 384,
@@ -16617,18 +17348,18 @@ unsigned short Dict276KeyHashTable[] = {
12, 384, 13, 384,
};
-vtkDICOMDictionary::Dict Dict276Data = {
+vtkDICOMDictionary::Dict Dict283Data = {
"Voxar 2.16.124.113543.6003.1999.12.20.12.5.0",
14,
14,
-Dict276TagHashTable,
-Dict276KeyHashTable,
-Dict276Contents
+Dict283TagHashTable,
+Dict283KeyHashTable,
+Dict283Contents
};
// ----- astm.org/diconde/iod/NDEGeometry -----
-DictEntry Dict277Contents[] = {
+const DictEntry Dict284Contents[] = {
{ 0x0021, 0x0002, 0, VR::IS, VM::M1, "CoordinateSystemNumberOfAxes" },
{ 0x0021, 0x0004, 0, VR::SQ, VM::M1, "CoordinateSystemAxesSequence" },
{ 0x0021, 0x0006, 0, VR::ST, VM::M1, "CoordinateSystemAxisDescription" },
@@ -16646,7 +17377,7 @@ DictEntry Dict277Contents[] = {
{ 0x0021, 0x002C, 0, VR::DS, VM::M1TN, "CoordinateSystemTransformTranslationMatrix" },
};
-unsigned short Dict277TagHashTable[] = {
+const unsigned short Dict284TagHashTable[] = {
16, 19, 22, 25, 28, 31, 15, 36, 15, 41,
15, 46, 15, 51, 15, 0, 1, 5, 12, 1,
8, 32, 1, 6, 14, 1, 9, 34, 1, 7,
@@ -16655,7 +17386,7 @@ unsigned short Dict277TagHashTable[] = {
42, 2, 4, 10, 14, 44,
};
-unsigned short Dict277KeyHashTable[] = {
+const unsigned short Dict284KeyHashTable[] = {
15, 16, 21, 24, 27, 15, 15, 32, 35, 42,
15, 45, 15, 15, 50, 0, 2, 2, 8054, 11,
11934, 1, 5, 5865, 1, 1, 39863, 2, 0, 19315,
@@ -16664,41 +17395,120 @@ unsigned short Dict277KeyHashTable[] = {
2, 6, 14228, 10, 22782,
};
-vtkDICOMDictionary::Dict Dict277Data = {
+vtkDICOMDictionary::Dict Dict284Data = {
"astm.org/diconde/iod/NDEGeometry",
15,
15,
-Dict277TagHashTable,
-Dict277KeyHashTable,
-Dict277Contents
+Dict284TagHashTable,
+Dict284KeyHashTable,
+Dict284Contents
+};
+
+// ----- BRAINWAVE: 1.2.840.113819.3 -----
+
+const DictEntry Dict285Contents[] = {
+{ 0x2001, 0x0010, 0, VR::UI, VM::M1, "DICOMImplementationUID" },
+{ 0x2001, 0x0011, 0, VR::SH, VM::M1, "DICOMImplementationVersion" },
+{ 0x2001, 0x0012, 0, VR::UI, VM::M1, "WithinDICOMImplementationSOPInstanceUID" },
+{ 0x2001, 0x0013, 0, VR::SH, VM::M1, "ApplicationName" },
+{ 0x2001, 0x0014, 0, VR::SH, VM::M1, "ApplicationVersion" },
+{ 0x2001, 0x0015, 0, VR::SH, VM::M1, "CompatibilityVersion" },
+{ 0x2001, 0x0021, 0, VR::UI, VM::M1TN, "ReferencedSeriesUID" },
+{ 0x2001, 0x0031, 0, VR::US, VM::M1, "NumberOfObjectsAveraged" },
+{ 0x2001, 0x0041, 0, VR::US, VM::M1, "NumberOfExpectedTimePoints" },
+{ 0x2001, 0x0051, 0, VR::US, VM::M1, "NumberOfSlicesPerVolume" },
+{ 0x2001, 0x0060, 0, VR::US, VM::M1, "BWImageType" },
+{ 0x2001, 0x0061, 0, VR::US, VM::M1, "ExperimentType" },
+{ 0x2001, 0x0071, 0, VR::UI, VM::M1, "ParadigmUID" },
+{ 0x2001, 0x0072, 0, VR::LO, VM::M1, "ParadigmName" },
+{ 0x2001, 0x0073, 0, VR::ST, VM::M1, "ParadigmDescription" },
+{ 0x2001, 0x0080, 0, VR::OB, VM::M1, "Contrast" },
+{ 0x2001, 0x0081, 0, VR::FL, VM::M1TN, "RegressorValues" },
+{ 0x2001, 0x0086, 0, VR::US, VM::M1, "NumberOfDegreesOfFreedom" },
+{ 0x2001, 0x008A, 0, VR::FL, VM::M1, "ZThreshold" },
+{ 0x2001, 0x008B, 0, VR::FL, VM::M1, "PThreshold" },
+{ 0x2001, 0x0090, 0, VR::OB, VM::M1, "ProcessingParameters" },
+{ 0x2001, 0x0091, 0, VR::OB, VM::M1, "MotionPlot" },
+{ 0x2001, 0x0092, 0, VR::OB, VM::M1, "ROIs" },
+{ 0x2001, 0x0093, 0, VR::OB, VM::M1, "Tracts" },
+{ 0x2001, 0x0094, 0, VR::OB, VM::M1, "Report" },
+{ 0x2001, 0x0095, 0, VR::OB, VM::M1, "ResponseData" },
+{ 0x2001, 0x0096, 0, VR::OB, VM::M1, "DesignMatrix" },
+{ 0x2001, 0x0097, 0, VR::FL, VM::M1TN, "QualityMetrics" },
+{ 0x2001, 0x00A0, 0, VR::FL, VM::M1TN, "MotionParameters" },
+{ 0x2001, 0x00A1, 0, VR::FL, VM::M1TN, "RegistrationParameters" },
+{ 0x2001, 0x00A2, 0, VR::FL, VM::M1TN, "SubjectData" },
+{ 0x2001, 0x00B0, 0, VR::OB, VM::M1, "DTIParameters" },
+{ 0x2001, 0x00C0, 0, VR::OB, VM::M1, "ParadigmInfo" },
+};
+
+const unsigned short Dict285TagHashTable[] = {
+ 33, 34, 37, 40, 33, 33, 33, 33, 45, 50,
+ 53, 58, 33, 61, 33, 33, 64, 67, 70, 73,
+ 80, 85, 88, 91, 94, 99, 104, 109, 112, 115,
+ 118, 121, 33, 0, 1, 10, 96, 1, 11, 97,
+ 2, 6, 33, 8, 65, 2, 30, 162, 32, 192,
+ 1, 29, 161, 2, 16, 129, 28, 160, 1, 15,
+ 128, 1, 17, 134, 1, 19, 139, 1, 18, 138,
+ 1, 12, 113, 3, 7, 49, 9, 81, 13, 114,
+ 2, 1, 17, 14, 115, 1, 0, 16, 1, 3,
+ 19, 1, 2, 18, 2, 5, 21, 23, 147, 2,
+ 4, 20, 22, 146, 2, 21, 145, 31, 176, 1,
+ 20, 144, 1, 27, 151, 1, 26, 150, 1, 25,
+ 149, 1, 24, 148,
+};
+
+const unsigned short Dict285KeyHashTable[] = {
+ 34, 37, 33, 33, 42, 33, 51, 33, 54, 33,
+ 57, 60, 65, 72, 75, 33, 33, 82, 87, 90,
+ 93, 33, 33, 96, 33, 99, 104, 107, 110, 113,
+ 33, 116, 119, 0, 1, 18, 60524, 2, 26, 883,
+ 31, 24793, 4, 0, 61333, 7, 38376, 27, 4897, 28,
+10251, 1, 32, 51312, 1, 29, 41996, 1, 19, 23448,
+ 2, 5, 29882, 11, 46877, 3, 17, 57709, 22, 10678,
+ 23, 18186, 1, 24, 13940, 3, 1, 24399, 12, 61310,
+ 21, 59116, 2, 4, 37294, 8, 22544, 1, 10, 7665,
+ 1, 2, 56256, 1, 25, 2202, 1, 20, 20031, 2,
+ 3, 39873, 9, 24844, 1, 15, 37913, 1, 14, 51987,
+ 1, 16, 42645, 1, 13, 56334, 1, 30, 33808, 1,
+ 6, 56805,
+};
+
+vtkDICOMDictionary::Dict Dict285Data = {
+"BRAINWAVE: 1.2.840.113819.3",
+33,
+33,
+Dict285TagHashTable,
+Dict285KeyHashTable,
+Dict285Contents
};
// ----- GEMS_CT_VES_01 -----
-DictEntry Dict278Contents[] = {
+const DictEntry Dict286Contents[] = {
{ 0x0051, 0x1001, 0, VR::SQ, VM::M1, "CTVESSequence" },
};
-unsigned short Dict278TagHashTable[] = {
+const unsigned short Dict286TagHashTable[] = {
2, 0, 1, 0, 4097,
};
-unsigned short Dict278KeyHashTable[] = {
+const unsigned short Dict286KeyHashTable[] = {
2, 0, 1, 0, 32067,
};
-vtkDICOMDictionary::Dict Dict278Data = {
+vtkDICOMDictionary::Dict Dict286Data = {
"GEMS_CT_VES_01",
1,
1,
-Dict278TagHashTable,
-Dict278KeyHashTable,
-Dict278Contents
+Dict286TagHashTable,
+Dict286KeyHashTable,
+Dict286Contents
};
// ----- AMI Sequence Annotations_01 -----
-DictEntry Dict279Contents[] = {
+const DictEntry Dict287Contents[] = {
{ 0x3103, 0x0010, 0, VR::CS, VM::M1, "AnnotationSequence" },
{ 0x3103, 0x0020, 0, VR::UI, VM::M1, "AnnotationUID" },
{ 0x3103, 0x0030, 0, VR::US, VM::M1, "AnnotationColor" },
@@ -16714,7 +17524,7 @@ DictEntry Dict279Contents[] = {
{ 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" },
};
-unsigned short Dict279TagHashTable[] = {
+const unsigned short Dict287TagHashTable[] = {
13, 13, 13, 14, 13, 13, 19, 13, 13, 28,
13, 13, 37, 0, 2, 6, 128, 10, 192, 4,
0, 16, 3, 80, 7, 144, 11, 208, 4, 1,
@@ -16722,7 +17532,7 @@ unsigned short Dict279TagHashTable[] = {
5, 112, 9, 176,
};
-unsigned short Dict279KeyHashTable[] = {
+const unsigned short Dict287KeyHashTable[] = {
13, 14, 17, 20, 23, 28, 31, 34, 13, 37,
42, 47, 13, 0, 1, 1, 40997, 1, 2, 9937,
1, 9, 18917, 2, 10, 9359, 12, 45136, 1, 0,
@@ -16730,18 +17540,18 @@ unsigned short Dict279KeyHashTable[] = {
8, 39570, 2, 4, 58303, 6, 14270, 1, 11, 12683,
};
-vtkDICOMDictionary::Dict Dict279Data = {
+vtkDICOMDictionary::Dict Dict287Data = {
"AMI Sequence Annotations_01",
13,
13,
-Dict279TagHashTable,
-Dict279KeyHashTable,
-Dict279Contents
+Dict287TagHashTable,
+Dict287KeyHashTable,
+Dict287Contents
};
// ----- AMI Sequence Annotations_02 -----
-DictEntry Dict280Contents[] = {
+const DictEntry Dict288Contents[] = {
{ 0x3103, 0x0010, 0, VR::CS, VM::M1, "AnnotationSequence" },
{ 0x3103, 0x0020, 0, VR::UI, VM::M1, "AnnotationUID" },
{ 0x3103, 0x0030, 0, VR::US, VM::M1, "AnnotationColor" },
@@ -16757,7 +17567,7 @@ DictEntry Dict280Contents[] = {
{ 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" },
};
-unsigned short Dict280TagHashTable[] = {
+const unsigned short Dict288TagHashTable[] = {
13, 13, 13, 14, 13, 13, 19, 13, 13, 28,
13, 13, 37, 0, 2, 6, 128, 10, 192, 4,
0, 16, 3, 80, 7, 144, 11, 208, 4, 1,
@@ -16765,7 +17575,7 @@ unsigned short Dict280TagHashTable[] = {
5, 112, 9, 176,
};
-unsigned short Dict280KeyHashTable[] = {
+const unsigned short Dict288KeyHashTable[] = {
13, 14, 19, 22, 25, 30, 33, 36, 13, 39,
44, 13, 13, 0, 2, 1, 40997, 11, 48691, 1,
2, 9937, 1, 9, 18917, 2, 10, 9359, 12, 45136,
@@ -16773,41 +17583,41 @@ unsigned short Dict280KeyHashTable[] = {
7, 55037, 8, 39570, 2, 4, 58303, 6, 14270,
};
-vtkDICOMDictionary::Dict Dict280Data = {
+vtkDICOMDictionary::Dict Dict288Data = {
"AMI Sequence Annotations_02",
13,
13,
-Dict280TagHashTable,
-Dict280KeyHashTable,
-Dict280Contents
+Dict288TagHashTable,
+Dict288KeyHashTable,
+Dict288Contents
};
// ----- GE LUT Asymmetry Parameter -----
-DictEntry Dict281Contents[] = {
+const DictEntry Dict289Contents[] = {
{ 0x0045, 0x0067, 0, VR::DS, VM::M1, "LUTAssymetry" },
};
-unsigned short Dict281TagHashTable[] = {
+const unsigned short Dict289TagHashTable[] = {
2, 0, 1, 0, 103,
};
-unsigned short Dict281KeyHashTable[] = {
+const unsigned short Dict289KeyHashTable[] = {
2, 0, 1, 0, 59819,
};
-vtkDICOMDictionary::Dict Dict281Data = {
+vtkDICOMDictionary::Dict Dict289Data = {
"GE LUT Asymmetry Parameter",
1,
1,
-Dict281TagHashTable,
-Dict281KeyHashTable,
-Dict281Contents
+Dict289TagHashTable,
+Dict289KeyHashTable,
+Dict289Contents
};
// ----- ACUSON:1.2.840.113680.1.0:0910 -----
-DictEntry Dict282Contents[] = {
+const DictEntry Dict290Contents[] = {
{ 0x0009, 0x0000, 0, VR::IS, VM::M1, "" },
{ 0x0009, 0x0001, 0, VR::IS, VM::M1, "" },
{ 0x0009, 0x0002, 0, VR::LO, VM::M1, "PatientRegistrationCustomField1" },
@@ -16816,137 +17626,137 @@ DictEntry Dict282Contents[] = {
{ 0x0009, 0x000f, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict282TagHashTable[] = {
+const unsigned short Dict290TagHashTable[] = {
7, 10, 13, 16, 19, 22, 0, 1, 5, 15,
1, 4, 4, 1, 1, 1, 1, 0, 0, 1,
3, 3, 1, 2, 2,
};
-unsigned short Dict282KeyHashTable[] = {
+const unsigned short Dict290KeyHashTable[] = {
7, 6, 6, 6, 10, 13, 0, 1, 3, 2065,
1, 4, 8233, 4, 0, 896, 1, 896, 2, 2064,
5, 896,
};
-vtkDICOMDictionary::Dict Dict282Data = {
+vtkDICOMDictionary::Dict Dict290Data = {
"ACUSON:1.2.840.113680.1.0:0910",
6,
6,
-Dict282TagHashTable,
-Dict282KeyHashTable,
-Dict282Contents
+Dict290TagHashTable,
+Dict290KeyHashTable,
+Dict290Contents
};
// ----- MATAKINA_10 -----
-DictEntry Dict283Contents[] = {
+const DictEntry Dict291Contents[] = {
{ 0x0015, 0x0028, 0, VR::LO, VM::M1, "VolparaDensityGrade" },
{ 0x0015, 0x0029, 0, VR::LT, VM::M1, "VolparaRunInformation" },
{ 0x0015, 0x0030, 0, VR::LO, VM::M1, "VolparaDensityGradeCutoffs" },
};
-unsigned short Dict283TagHashTable[] = {
+const unsigned short Dict291TagHashTable[] = {
4, 7, 3, 0, 1, 1, 41, 2, 0, 40,
2, 48,
};
-unsigned short Dict283KeyHashTable[] = {
+const unsigned short Dict291KeyHashTable[] = {
4, 3, 7, 0, 1, 2, 49309, 2, 0, 48841,
1, 31377,
};
-vtkDICOMDictionary::Dict Dict283Data = {
+vtkDICOMDictionary::Dict Dict291Data = {
"MATAKINA_10",
3,
3,
-Dict283TagHashTable,
-Dict283KeyHashTable,
-Dict283Contents
+Dict291TagHashTable,
+Dict291KeyHashTable,
+Dict291Contents
};
// ----- SIEMENS CT VA0 OST -----
-DictEntry Dict284Contents[] = {
+const DictEntry Dict292Contents[] = {
{ 0x6021, 0x0000, 0, VR::LO, VM::M1, "OsteoContourComment" },
{ 0x6021, 0x0010, 0, VR::US, VM::M256, "OsteoContourBuffer" },
};
-unsigned short Dict284TagHashTable[] = {
+const unsigned short Dict292TagHashTable[] = {
2, 3, 0, 2, 0, 0, 1, 16,
};
-unsigned short Dict284KeyHashTable[] = {
+const unsigned short Dict292KeyHashTable[] = {
3, 6, 0, 1, 0, 64726, 1, 1, 37913,
};
-vtkDICOMDictionary::Dict Dict284Data = {
+vtkDICOMDictionary::Dict Dict292Data = {
"SIEMENS CT VA0 OST",
2,
2,
-Dict284TagHashTable,
-Dict284KeyHashTable,
-Dict284Contents
+Dict292TagHashTable,
+Dict292KeyHashTable,
+Dict292Contents
};
// ----- SIEMENS MED DISPLAY 0000 -----
-DictEntry Dict285Contents[] = {
+const DictEntry Dict293Contents[] = {
{ 0x0029, 0x0099, 0, VR::CS, VM::M1, "" },
{ 0x0029, 0x00b0, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x00b2, 0, VR::US, VM::M1TN, "" },
{ 0x0029, 0x00c1, 0, VR::US, VM::M1TN, "" },
};
-unsigned short Dict285TagHashTable[] = {
+const unsigned short Dict293TagHashTable[] = {
4, 5, 8, 11, 0, 1, 2, 178, 1, 0,
153, 2, 1, 176, 3, 193,
};
-unsigned short Dict285KeyHashTable[] = {
+const unsigned short Dict293KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict285Data = {
+vtkDICOMDictionary::Dict Dict293Data = {
"SIEMENS MED DISPLAY 0000",
4,
4,
-Dict285TagHashTable,
-Dict285KeyHashTable,
-Dict285Contents
+Dict293TagHashTable,
+Dict293KeyHashTable,
+Dict293Contents
};
// ----- SIEMENS MED DISPLAY 0001 -----
-DictEntry Dict286Contents[] = {
+const DictEntry Dict294Contents[] = {
{ 0x0029, 0x0099, 0, VR::CS, VM::M1, "" },
{ 0x0029, 0x00a0, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x00a1, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x00a2, 0, VR::US, VM::M1TN, "" },
};
-unsigned short Dict286TagHashTable[] = {
+const unsigned short Dict294TagHashTable[] = {
4, 5, 8, 13, 0, 1, 3, 162, 2, 0,
153, 2, 161, 1, 1, 160,
};
-unsigned short Dict286KeyHashTable[] = {
+const unsigned short Dict294KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict286Data = {
+vtkDICOMDictionary::Dict Dict294Data = {
"SIEMENS MED DISPLAY 0001",
4,
4,
-Dict286TagHashTable,
-Dict286KeyHashTable,
-Dict286Contents
+Dict294TagHashTable,
+Dict294KeyHashTable,
+Dict294Contents
};
// ----- Picker NM Private Group -----
-DictEntry Dict287Contents[] = {
+const DictEntry Dict295Contents[] = {
{ 0x7001, 0x0001, 0, VR::UI, VM::M1, "" },
{ 0x7001, 0x0002, 0, VR::OB, VM::M1, "" },
{ 0x7001, 0x0003, 0, VR::OB, VM::M1, "" },
@@ -16965,7 +17775,7 @@ DictEntry Dict287Contents[] = {
{ 0x7001, 0x0017, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict287TagHashTable[] = {
+const unsigned short Dict295TagHashTable[] = {
17, 22, 25, 30, 35, 38, 43, 48, 53, 56,
16, 16, 16, 16, 16, 16, 0, 2, 0, 1,
10, 17, 1, 9, 16, 2, 2, 3, 12, 19,
@@ -16974,7 +17784,7 @@ unsigned short Dict287TagHashTable[] = {
6, 14, 22, 1, 8, 9, 1, 7, 8,
};
-unsigned short Dict287KeyHashTable[] = {
+const unsigned short Dict295KeyHashTable[] = {
16, 16, 16, 16, 16, 17, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 0, 16, 0, 336,
1, 336, 2, 336, 3, 336, 4, 336, 5, 336,
@@ -16982,18 +17792,18 @@ unsigned short Dict287KeyHashTable[] = {
11, 336, 12, 336, 13, 336, 14, 336, 15, 336,
};
-vtkDICOMDictionary::Dict Dict287Data = {
+vtkDICOMDictionary::Dict Dict295Data = {
"Picker NM Private Group",
16,
16,
-Dict287TagHashTable,
-Dict287KeyHashTable,
-Dict287Contents
+Dict295TagHashTable,
+Dict295KeyHashTable,
+Dict295Contents
};
// ----- PHILIPS MR SPECTRO;1 -----
-DictEntry Dict288Contents[] = {
+const DictEntry Dict296Contents[] = {
{ 0x0019, 0x0001, 0, VR::US, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::US, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::US, VM::M1, "" },
@@ -17046,7 +17856,7 @@ DictEntry Dict288Contents[] = {
{ 0x0019, 0x0080, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict288TagHashTable[] = {
+const unsigned short Dict296TagHashTable[] = {
50, 51, 50, 50, 54, 57, 62, 67, 72, 77,
82, 89, 96, 101, 106, 109, 112, 115, 50, 50,
118, 121, 124, 50, 127, 50, 130, 133, 136, 139,
@@ -17068,7 +17878,7 @@ unsigned short Dict288TagHashTable[] = {
1, 26, 41, 1, 25, 40,
};
-unsigned short Dict288KeyHashTable[] = {
+const unsigned short Dict296KeyHashTable[] = {
50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
@@ -17087,18 +17897,18 @@ unsigned short Dict288KeyHashTable[] = {
49, 107,
};
-vtkDICOMDictionary::Dict Dict288Data = {
+vtkDICOMDictionary::Dict Dict296Data = {
"PHILIPS MR SPECTRO;1",
50,
50,
-Dict288TagHashTable,
-Dict288KeyHashTable,
-Dict288Contents
+Dict296TagHashTable,
+Dict296KeyHashTable,
+Dict296Contents
};
// ----- astm.org/diconde/iod/NdeIndication -----
-DictEntry Dict289Contents[] = {
+const DictEntry Dict297Contents[] = {
{ 0x0021, 0x0002, 0, VR::SQ, VM::M1, "EvaluatorSequence" },
{ 0x0021, 0x0004, 0, VR::IS, VM::M1, "EvaluatorNumber" },
{ 0x0021, 0x0006, 0, VR::PN, VM::M1, "EvaluatorName" },
@@ -17114,7 +17924,7 @@ DictEntry Dict289Contents[] = {
{ 0x0021, 0x0032, 0, VR::SH, VM::M1, "PropertyLabel" },
};
-unsigned short Dict289TagHashTable[] = {
+const unsigned short Dict297TagHashTable[] = {
14, 17, 20, 23, 26, 29, 32, 35, 13, 38,
13, 43, 48, 0, 1, 2, 6, 1, 5, 20,
1, 3, 8, 1, 6, 22, 1, 11, 48, 1,
@@ -17123,7 +17933,7 @@ unsigned short Dict289TagHashTable[] = {
18,
};
-unsigned short Dict289KeyHashTable[] = {
+const unsigned short Dict297KeyHashTable[] = {
14, 13, 17, 22, 13, 13, 31, 34, 39, 42,
13, 13, 45, 0, 1, 4, 37280, 2, 5, 46406,
11, 43872, 4, 0, 15814, 1, 23990, 7, 58856, 8,
@@ -17131,46 +17941,46 @@ unsigned short Dict289KeyHashTable[] = {
9, 35076, 1, 3, 33727, 1, 2, 53665,
};
-vtkDICOMDictionary::Dict Dict289Data = {
+vtkDICOMDictionary::Dict Dict297Data = {
"astm.org/diconde/iod/NdeIndication",
13,
13,
-Dict289TagHashTable,
-Dict289KeyHashTable,
-Dict289Contents
+Dict297TagHashTable,
+Dict297KeyHashTable,
+Dict297Contents
};
// ----- GEMS_LUNAR_RAW -----
-DictEntry Dict290Contents[] = {
+const DictEntry Dict298Contents[] = {
{ 0x7003, 0x0001, 0, VR::ST, VM::M1, "enCOREFileName" },
{ 0x7003, 0x0002, 0, VR::OB, VM::M1, "enCOREFileData" },
{ 0x7003, 0x0003, 0, VR::UL, VM::M1, "enCOREFileLength" },
{ 0x7003, 0x0004, 0, VR::LO, VM::M1, "enCOREFileModifiedTime" },
};
-unsigned short Dict290TagHashTable[] = {
+const unsigned short Dict298TagHashTable[] = {
5, 8, 11, 14, 0, 1, 2, 3, 1, 1,
2, 1, 0, 1, 1, 3, 4,
};
-unsigned short Dict290KeyHashTable[] = {
+const unsigned short Dict298KeyHashTable[] = {
4, 5, 8, 11, 0, 1, 3, 47668, 1, 0,
24392, 2, 1, 142, 2, 168,
};
-vtkDICOMDictionary::Dict Dict290Data = {
+vtkDICOMDictionary::Dict Dict298Data = {
"GEMS_LUNAR_RAW",
4,
4,
-Dict290TagHashTable,
-Dict290KeyHashTable,
-Dict290Contents
+Dict298TagHashTable,
+Dict298KeyHashTable,
+Dict298Contents
};
// ----- PRIVATE_CODE_STRING_3007 -----
-DictEntry Dict291Contents[] = {
+const DictEntry Dict299Contents[] = {
{ 0x3007, 0x0000, 0, VR::FD, VM::M16, "VolumeToPatientMatrix" },
{ 0x3007, 0x0001, 0, VR::FD, VM::M16, "VolumeResolutionConversion" },
{ 0x3007, 0x0002, 0, VR::FD, VM::M16, "VolumeDataConversion" },
@@ -17178,29 +17988,52 @@ DictEntry Dict291Contents[] = {
{ 0x3007, 0x0004, 0, VR::FD, VM::M16, "DICOMDataConversion" },
};
-unsigned short Dict291TagHashTable[] = {
+const unsigned short Dict299TagHashTable[] = {
6, 9, 12, 15, 18, 0, 1, 2, 2, 1,
1, 1, 1, 0, 0, 1, 4, 4, 1, 3,
3,
};
-unsigned short Dict291KeyHashTable[] = {
+const unsigned short Dict299KeyHashTable[] = {
6, 11, 14, 5, 17, 0, 2, 2, 61209, 4,
10045, 1, 0, 45781, 1, 1, 59953, 1, 3, 41758,
};
-vtkDICOMDictionary::Dict Dict291Data = {
+vtkDICOMDictionary::Dict Dict299Data = {
"PRIVATE_CODE_STRING_3007",
5,
5,
-Dict291TagHashTable,
-Dict291KeyHashTable,
-Dict291Contents
+Dict299TagHashTable,
+Dict299KeyHashTable,
+Dict299Contents
+};
+
+// ----- TELEMIS -----
+
+const DictEntry Dict300Contents[] = {
+{ 0x0029, 0x0004, 0, VR::US, VM::M1, "" },
+};
+
+const unsigned short Dict300TagHashTable[] = {
+ 2, 0, 1, 0, 4,
+};
+
+const unsigned short Dict300KeyHashTable[] = {
+ 2, 0, 1, 0, 5381,
+};
+
+vtkDICOMDictionary::Dict Dict300Data = {
+"TELEMIS",
+1,
+1,
+Dict300TagHashTable,
+Dict300KeyHashTable,
+Dict300Contents
};
// ----- SIEMENS Selma -----
-DictEntry Dict292Contents[] = {
+const DictEntry Dict301Contents[] = {
{ 0x0019, 0x0006, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0007, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0008, 0, VR::IS, VM::M1, "" },
@@ -17214,7 +18047,7 @@ DictEntry Dict292Contents[] = {
{ 0x0019, 0x0035, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict292TagHashTable[] = {
+const unsigned short Dict301TagHashTable[] = {
12, 15, 11, 11, 18, 11, 21, 24, 27, 34,
39, 0, 1, 10, 53, 1, 9, 52, 1, 4,
41, 1, 2, 8, 1, 6, 49, 3, 1, 7,
@@ -17222,76 +18055,76 @@ unsigned short Dict292TagHashTable[] = {
7, 50,
};
-unsigned short Dict292KeyHashTable[] = {
+const unsigned short Dict301KeyHashTable[] = {
11, 11, 12, 11, 11, 11, 11, 11, 11, 11,
11, 0, 11, 0, 489, 1, 489, 2, 489, 3,
489, 4, 489, 5, 489, 6, 489, 7, 489, 8,
489, 9, 489, 10, 489,
};
-vtkDICOMDictionary::Dict Dict292Data = {
+vtkDICOMDictionary::Dict Dict301Data = {
"SIEMENS Selma",
11,
11,
-Dict292TagHashTable,
-Dict292KeyHashTable,
-Dict292Contents
+Dict301TagHashTable,
+Dict301KeyHashTable,
+Dict301Contents
};
// ----- ETIAM DICOMDIR -----
-DictEntry Dict293Contents[] = {
+const DictEntry Dict302Contents[] = {
{ 0x0859, 0x0040, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict293TagHashTable[] = {
+const unsigned short Dict302TagHashTable[] = {
2, 0, 1, 0, 64,
};
-unsigned short Dict293KeyHashTable[] = {
+const unsigned short Dict302KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict293Data = {
+vtkDICOMDictionary::Dict Dict302Data = {
"ETIAM DICOMDIR",
1,
1,
-Dict293TagHashTable,
-Dict293KeyHashTable,
-Dict293Contents
+Dict302TagHashTable,
+Dict302KeyHashTable,
+Dict302Contents
};
// ----- MAROTECH Inc. -----
-DictEntry Dict294Contents[] = {
+const DictEntry Dict303Contents[] = {
{ 0x0037, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x0037, 0x0021, 0, VR::US, VM::M1, "" },
{ 0x0037, 0x0022, 0, VR::US, VM::M1, "" },
{ 0x0037, 0x0023, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict294TagHashTable[] = {
+const unsigned short Dict303TagHashTable[] = {
5, 8, 11, 4, 0, 1, 3, 35, 1, 2,
34, 2, 0, 1, 1, 33,
};
-unsigned short Dict294KeyHashTable[] = {
+const unsigned short Dict303KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict294Data = {
+vtkDICOMDictionary::Dict Dict303Data = {
"MAROTECH Inc.",
4,
4,
-Dict294TagHashTable,
-Dict294KeyHashTable,
-Dict294Contents
+Dict303TagHashTable,
+Dict303KeyHashTable,
+Dict303Contents
};
// ----- GEMS_DL_FRAME_01 -----
-DictEntry Dict295Contents[] = {
+const DictEntry Dict304Contents[] = {
{ 0x0025, 0x0002, 0, VR::IS, VM::M1, "FrameID" },
{ 0x0025, 0x0003, 0, VR::DS, VM::M1, "DistanceSourceToDetector" },
{ 0x0025, 0x0004, 0, VR::DS, VM::M1, "DistanceSourceToPatient" },
@@ -17305,7 +18138,7 @@ DictEntry Dict295Contents[] = {
{ 0x0025, 0x001A, 0, VR::DS, VM::M1, "ArcAngle" },
{ 0x0025, 0x001B, 0, VR::DS, VM::M1, "TableVerticalPosition" },
{ 0x0025, 0x001C, 0, VR::DS, VM::M1, "TableLongitudinalPosition" },
-{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "Table Lateral Position" },
+{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "TableLateralPosition" },
{ 0x0025, 0x001E, 0, VR::IS, VM::M1, "BeamCoverArea" },
{ 0x0025, 0x001F, 0, VR::DS, VM::M1, "kVPActual" },
{ 0x0025, 0x0020, 0, VR::DS, VM::M1, "mASActual" },
@@ -17337,7 +18170,7 @@ DictEntry Dict295Contents[] = {
{ 0x0025, 0x003C, 0, VR::CS, VM::M1, "InternalLabelFrame" },
};
-unsigned short Dict295TagHashTable[] = {
+const unsigned short Dict304TagHashTable[] = {
44, 47, 52, 57, 60, 65, 68, 71, 74, 77,
80, 85, 88, 91, 96, 101, 106, 111, 114, 117,
122, 125, 128, 43, 43, 131, 43, 43, 134, 137,
@@ -17357,16 +18190,16 @@ unsigned short Dict295TagHashTable[] = {
3, 1, 0, 2,
};
-unsigned short Dict295KeyHashTable[] = {
+const unsigned short Dict304KeyHashTable[] = {
44, 47, 50, 43, 55, 43, 60, 63, 43, 43,
- 43, 66, 69, 72, 79, 43, 82, 43, 85, 88,
+ 66, 69, 72, 75, 82, 43, 43, 43, 85, 88,
91, 94, 99, 104, 113, 43, 116, 119, 122, 43,
127, 132, 43, 135, 138, 141, 144, 147, 150, 153,
43, 158, 43, 0, 1, 7, 13416, 1, 38, 17788,
2, 4, 42862, 19, 45860, 2, 24, 39748, 39, 43540,
- 1, 34, 47277, 1, 15, 54363, 1, 37, 25091, 1,
- 33, 49284, 3, 27, 43570, 29, 54804, 30, 8248, 1,
- 2, 34881, 1, 13, 48517, 1, 3, 27637, 1, 17,
+ 1, 34, 47277, 1, 15, 54363, 1, 13, 55351, 1,
+ 37, 25091, 1, 33, 49284, 3, 27, 43570, 29, 54804,
+ 30, 8248, 1, 2, 34881, 1, 3, 27637, 1, 17,
1305, 1, 12, 3080, 2, 10, 47879, 41, 28484, 2,
0, 39765, 42, 39045, 4, 18, 6901, 22, 34119, 25,
56972, 31, 54562, 1, 32, 46650, 1, 28, 10917, 1,
@@ -17377,41 +18210,41 @@ unsigned short Dict295KeyHashTable[] = {
46905,
};
-vtkDICOMDictionary::Dict Dict295Data = {
+vtkDICOMDictionary::Dict Dict304Data = {
"GEMS_DL_FRAME_01",
43,
43,
-Dict295TagHashTable,
-Dict295KeyHashTable,
-Dict295Contents
+Dict304TagHashTable,
+Dict304KeyHashTable,
+Dict304Contents
};
// ----- PHILIPS MR/PART 12 -----
-DictEntry Dict296Contents[] = {
+const DictEntry Dict305Contents[] = {
{ 0x0009, 0x0010, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict296TagHashTable[] = {
+const unsigned short Dict305TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict296KeyHashTable[] = {
+const unsigned short Dict305KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict296Data = {
+vtkDICOMDictionary::Dict Dict305Data = {
"PHILIPS MR/PART 12",
1,
1,
-Dict296TagHashTable,
-Dict296KeyHashTable,
-Dict296Contents
+Dict305TagHashTable,
+Dict305KeyHashTable,
+Dict305Contents
};
// ----- SIEMENS MR N3D -----
-DictEntry Dict297Contents[] = {
+const DictEntry Dict306Contents[] = {
{ 0x0021, 0x0030, 0, VR::SQ, VM::M1, "BackgroundColorDRSequence" },
{ 0x0021, 0x0031, 0, VR::DS, VM::M3, "BackgroundColor" },
{ 0x0021, 0x0036, 0, VR::SQ, VM::M1, "FieldMapDRSequence" },
@@ -17524,7 +18357,7 @@ DictEntry Dict297Contents[] = {
{ 0x0021, 0x00C2, 0, VR::CS, VM::M1, "CurrentActivePlane" },
};
-unsigned short Dict297TagHashTable[] = {
+const unsigned short Dict306TagHashTable[] = {
111, 110, 114, 117, 120, 125, 128, 133, 138, 141,
144, 147, 150, 153, 110, 110, 156, 159, 162, 165,
168, 171, 174, 179, 184, 189, 194, 199, 204, 207,
@@ -17569,7 +18402,7 @@ unsigned short Dict297TagHashTable[] = {
1, 14, 75, 1, 15, 76, 1, 16, 77,
};
-unsigned short Dict297KeyHashTable[] = {
+const unsigned short Dict306KeyHashTable[] = {
111, 114, 119, 122, 131, 134, 139, 110, 110, 110,
110, 110, 142, 110, 147, 110, 152, 110, 155, 158,
161, 110, 164, 167, 170, 173, 110, 176, 179, 188,
@@ -17613,18 +18446,18 @@ unsigned short Dict297KeyHashTable[] = {
16233, 25, 10468, 63, 36589,
};
-vtkDICOMDictionary::Dict Dict297Data = {
+vtkDICOMDictionary::Dict Dict306Data = {
"SIEMENS MR N3D",
110,
110,
-Dict297TagHashTable,
-Dict297KeyHashTable,
-Dict297Contents
+Dict306TagHashTable,
+Dict306KeyHashTable,
+Dict306Contents
};
// ----- Camtronics image level data -----
-DictEntry Dict298Contents[] = {
+const DictEntry Dict307Contents[] = {
{ 0x0009, 0x0004, 0, VR::IS, VM::M1, "" },
{ 0x0009, 0x0006, 0, VR::IS, VM::M1, "" },
{ 0x0009, 0x0009, 0, VR::LO, VM::M1, "" },
@@ -17633,29 +18466,29 @@ DictEntry Dict298Contents[] = {
{ 0x0009, 0x0018, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict298TagHashTable[] = {
+const unsigned short Dict307TagHashTable[] = {
7, 12, 6, 17, 6, 20, 0, 2, 2, 9,
4, 23, 2, 0, 4, 3, 22, 1, 1, 6,
1, 5, 24,
};
-unsigned short Dict298KeyHashTable[] = {
+const unsigned short Dict307KeyHashTable[] = {
6, 6, 6, 6, 6, 7, 0, 6, 0, 896,
1, 896, 2, 896, 3, 896, 4, 896, 5, 896,
};
-vtkDICOMDictionary::Dict Dict298Data = {
+vtkDICOMDictionary::Dict Dict307Data = {
"Camtronics image level data",
6,
6,
-Dict298TagHashTable,
-Dict298KeyHashTable,
-Dict298Contents
+Dict307TagHashTable,
+Dict307KeyHashTable,
+Dict307Contents
};
// ----- SIEMENS MED HG -----
-DictEntry Dict299Contents[] = {
+const DictEntry Dict308Contents[] = {
{ 0x0029, 0x0010, 0, VR::US, VM::M1, "ListOfGroupNumbers" },
{ 0x0029, 0x0015, 0, VR::LO, VM::M1, "ListOfShadowOwnerCodes" },
{ 0x0029, 0x0020, 0, VR::US, VM::M1, "ListOfElementNumbers" },
@@ -17666,31 +18499,31 @@ DictEntry Dict299Contents[] = {
{ 0x0029, 0x0070, 0, VR::LO, VM::M1, "ListOfTextConcatenation" },
};
-unsigned short Dict299TagHashTable[] = {
+const unsigned short Dict308TagHashTable[] = {
9, 18, 8, 8, 25, 8, 8, 8, 0, 4,
4, 64, 5, 80, 6, 96, 7, 112, 3, 0,
16, 2, 32, 3, 48, 1, 1, 21,
};
-unsigned short Dict299KeyHashTable[] = {
+const unsigned short Dict308KeyHashTable[] = {
9, 12, 17, 8, 22, 25, 8, 28, 0, 1,
6, 28194, 2, 5, 28059, 7, 2168, 2, 3, 16906,
4, 43179, 1, 2, 50495, 1, 1, 4798, 1, 0,
31019,
};
-vtkDICOMDictionary::Dict Dict299Data = {
+vtkDICOMDictionary::Dict Dict308Data = {
"SIEMENS MED HG",
8,
8,
-Dict299TagHashTable,
-Dict299KeyHashTable,
-Dict299Contents
+Dict308TagHashTable,
+Dict308KeyHashTable,
+Dict308Contents
};
// ----- SCIVIS-1 -----
-DictEntry Dict300Contents[] = {
+const DictEntry Dict309Contents[] = {
{ 0x6001, 0x00a0, 0, VR::DS, VM::M1, "" },
{ 0x6001, 0x00a1, 0, VR::DS, VM::M1, "" },
{ 0x6001, 0x00a2, 0, VR::US, VM::M1, "" },
@@ -17705,7 +18538,7 @@ DictEntry Dict300Contents[] = {
{ 0x6001, 0x00ab, 0, VR::ST, VM::M1, "" },
};
-unsigned short Dict300TagHashTable[] = {
+const unsigned short Dict309TagHashTable[] = {
13, 16, 19, 22, 25, 28, 31, 34, 37, 40,
43, 46, 0, 1, 3, 163, 1, 2, 162, 1,
1, 161, 1, 0, 160, 1, 7, 167, 1, 6,
@@ -17713,49 +18546,49 @@ unsigned short Dict300TagHashTable[] = {
1, 10, 170, 1, 9, 169, 1, 8, 168,
};
-unsigned short Dict300KeyHashTable[] = {
+const unsigned short Dict309KeyHashTable[] = {
12, 12, 12, 12, 12, 13, 12, 12, 12, 12,
12, 12, 0, 12, 0, 448, 1, 448, 2, 448,
3, 448, 4, 448, 5, 448, 6, 448, 7, 448,
8, 448, 9, 448, 10, 448, 11, 448,
};
-vtkDICOMDictionary::Dict Dict300Data = {
+vtkDICOMDictionary::Dict Dict309Data = {
"SCIVIS-1",
12,
12,
-Dict300TagHashTable,
-Dict300KeyHashTable,
-Dict300Contents
+Dict309TagHashTable,
+Dict309KeyHashTable,
+Dict309Contents
};
// ----- BrainLAB_PatientSetup -----
-DictEntry Dict301Contents[] = {
+const DictEntry Dict310Contents[] = {
{ 0x3273, 0x0000, 0, VR::DS, VM::M3, "IsocenterPosition" },
{ 0x3273, 0x0001, 0, VR::CS, VM::M1, "PatientPosition" },
};
-unsigned short Dict301TagHashTable[] = {
+const unsigned short Dict310TagHashTable[] = {
3, 6, 0, 1, 0, 0, 1, 1, 1,
};
-unsigned short Dict301KeyHashTable[] = {
+const unsigned short Dict310KeyHashTable[] = {
3, 6, 0, 1, 0, 61443, 1, 1, 52199,
};
-vtkDICOMDictionary::Dict Dict301Data = {
+vtkDICOMDictionary::Dict Dict310Data = {
"BrainLAB_PatientSetup",
2,
2,
-Dict301TagHashTable,
-Dict301KeyHashTable,
-Dict301Contents
+Dict310TagHashTable,
+Dict310KeyHashTable,
+Dict310Contents
};
// ----- GEMS_CT_CARDIAC_001 -----
-DictEntry Dict302Contents[] = {
+const DictEntry Dict311Contents[] = {
{ 0x0049, 0x0001, 0, VR::SQ, VM::M1, "CTCardiacSequence" },
{ 0x0049, 0x0002, 0, VR::CS, VM::M1, "HeartRateAtConfirm" },
{ 0x0049, 0x0003, 0, VR::FL, VM::M1, "AvgHeartRatePriorToConfirm" },
@@ -17777,7 +18610,7 @@ DictEntry Dict302Contents[] = {
{ 0x0049, 0x0026, 0, VR::CS, VM::M1, "CompressionAlg" },
};
-unsigned short Dict302TagHashTable[] = {
+const unsigned short Dict311TagHashTable[] = {
20, 23, 26, 29, 19, 19, 19, 32, 37, 40,
43, 46, 51, 54, 57, 60, 63, 66, 69, 0,
1, 3, 4, 1, 4, 5, 1, 5, 6, 1,
@@ -17788,7 +18621,7 @@ unsigned short Dict302TagHashTable[] = {
2, 3, 12, 22,
};
-unsigned short Dict302KeyHashTable[] = {
+const unsigned short Dict311KeyHashTable[] = {
20, 23, 28, 33, 19, 19, 19, 36, 43, 46,
19, 53, 56, 19, 59, 19, 19, 19, 66, 0,
1, 12, 19816, 2, 16, 65086, 18, 45230, 2, 15,
@@ -17798,18 +18631,18 @@ unsigned short Dict302KeyHashTable[] = {
0, 19450, 2, 21766, 8, 12075, 1, 13, 16609,
};
-vtkDICOMDictionary::Dict Dict302Data = {
+vtkDICOMDictionary::Dict Dict311Data = {
"GEMS_CT_CARDIAC_001",
19,
19,
-Dict302TagHashTable,
-Dict302KeyHashTable,
-Dict302Contents
+Dict311TagHashTable,
+Dict311KeyHashTable,
+Dict311Contents
};
// ----- MMCPrivate -----
-DictEntry Dict303Contents[] = {
+const DictEntry Dict312Contents[] = {
{ 0x0009, 0x0001, 0, VR::LO, VM::M1, "Technologist" },
{ 0x0009, 0x0002, 0, VR::LO, VM::M1, "ScheduledStudyDateTime" },
{ 0x0009, 0x0003, 0, VR::OB, VM::M1, "StudyAppData" },
@@ -18063,7 +18896,7 @@ DictEntry Dict303Contents[] = {
{ 0x0029, 0x00d7, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict303TagHashTable[] = {
+const unsigned short Dict312TagHashTable[] = {
252, 257, 264, 271, 276, 283, 288, 291, 296, 303,
308, 315, 322, 327, 332, 337, 342, 349, 354, 361,
368, 375, 382, 389, 396, 401, 404, 409, 414, 419,
@@ -18161,7 +18994,7 @@ unsigned short Dict303TagHashTable[] = {
197, 1, 247, 211, 1, 246, 208,
};
-unsigned short Dict303KeyHashTable[] = {
+const unsigned short Dict312KeyHashTable[] = {
251, 251, 252, 255, 251, 251, 258, 261, 251, 264,
269, 274, 279, 292, 299, 251, 251, 302, 307, 312,
315, 251, 318, 321, 324, 327, 332, 251, 337, 251,
@@ -18255,68 +19088,68 @@ unsigned short Dict303KeyHashTable[] = {
176, 12982,
};
-vtkDICOMDictionary::Dict Dict303Data = {
+vtkDICOMDictionary::Dict Dict312Data = {
"MMCPrivate",
251,
251,
-Dict303TagHashTable,
-Dict303KeyHashTable,
-Dict303Contents
+Dict312TagHashTable,
+Dict312KeyHashTable,
+Dict312Contents
};
// ----- IDEXX -----
-DictEntry Dict304Contents[] = {
+const DictEntry Dict313Contents[] = {
{ 0x0011, 0x0000, 0, VR::LO, VM::M1, "BreedName" },
{ 0x0011, 0x0001, 0, VR::LO, VM::M1, "SpeciesName" },
{ 0x0011, 0x0002, 0, VR::PN, VM::M1, "Owner" },
};
-unsigned short Dict304TagHashTable[] = {
+const unsigned short Dict313TagHashTable[] = {
3, 4, 9, 0, 2, 1, 1, 2, 2, 1,
0, 0,
};
-unsigned short Dict304KeyHashTable[] = {
+const unsigned short Dict313KeyHashTable[] = {
4, 3, 9, 0, 2, 0, 32408, 1, 51206, 1,
2, 15226,
};
-vtkDICOMDictionary::Dict Dict304Data = {
+vtkDICOMDictionary::Dict Dict313Data = {
"IDEXX",
3,
3,
-Dict304TagHashTable,
-Dict304KeyHashTable,
-Dict304Contents
+Dict313TagHashTable,
+Dict313KeyHashTable,
+Dict313Contents
};
// ----- VEPRO DICOM TRANSFER 1.0 -----
-DictEntry Dict305Contents[] = {
+const DictEntry Dict314Contents[] = {
{ 0x0059, 0x0010, 0, VR::SQ, VM::M1, "DicomTransferInfo" },
};
-unsigned short Dict305TagHashTable[] = {
+const unsigned short Dict314TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict305KeyHashTable[] = {
+const unsigned short Dict314KeyHashTable[] = {
2, 0, 1, 0, 610,
};
-vtkDICOMDictionary::Dict Dict305Data = {
+vtkDICOMDictionary::Dict Dict314Data = {
"VEPRO DICOM TRANSFER 1.0",
1,
1,
-Dict305TagHashTable,
-Dict305KeyHashTable,
-Dict305Contents
+Dict314TagHashTable,
+Dict314KeyHashTable,
+Dict314Contents
};
// ----- SPI-P Release 1 -----
-DictEntry Dict306Contents[] = {
+const DictEntry Dict315Contents[] = {
{ 0x0009, 0x0000, 0, VR::LT, VM::M1, "DataObjectRecognitionCode" },
{ 0x0009, 0x0004, 0, VR::LO, VM::M1, "ImageDataConsistency" },
{ 0x0009, 0x0008, 0, VR::US, VM::M1, "" },
@@ -18410,7 +19243,7 @@ DictEntry Dict306Contents[] = {
{ 0x7FE1, 0x0010, 0, VR::OW, VM::M1, "PixelData" },
};
-unsigned short Dict306TagHashTable[] = {
+const unsigned short Dict315TagHashTable[] = {
91, 92, 91, 91, 97, 104, 91, 91, 91, 109,
91, 91, 116, 119, 124, 129, 91, 132, 91, 91,
91, 91, 91, 91, 137, 140, 91, 147, 152, 155,
@@ -18446,7 +19279,7 @@ unsigned short Dict306TagHashTable[] = {
78, 159, 1, 66, 114,
};
-unsigned short Dict306KeyHashTable[] = {
+const unsigned short Dict315KeyHashTable[] = {
92, 91, 91, 91, 91, 99, 91, 91, 102, 91,
107, 91, 112, 193, 196, 91, 91, 91, 91, 201,
206, 91, 91, 91, 91, 91, 91, 209, 212, 91,
@@ -18481,111 +19314,111 @@ unsigned short Dict306KeyHashTable[] = {
89, 39565,
};
-vtkDICOMDictionary::Dict Dict306Data = {
+vtkDICOMDictionary::Dict Dict315Data = {
"SPI-P Release 1",
91,
91,
-Dict306TagHashTable,
-Dict306KeyHashTable,
-Dict306Contents
+Dict315TagHashTable,
+Dict315KeyHashTable,
+Dict315Contents
};
// ----- Philips EV Imaging DD 022 -----
-DictEntry Dict307Contents[] = {
+const DictEntry Dict316Contents[] = {
{ 0x2007, 0x0000, 0, VR::ST, VM::M1, "" },
};
-unsigned short Dict307TagHashTable[] = {
+const unsigned short Dict316TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict307KeyHashTable[] = {
+const unsigned short Dict316KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict307Data = {
+vtkDICOMDictionary::Dict Dict316Data = {
"Philips EV Imaging DD 022",
1,
1,
-Dict307TagHashTable,
-Dict307KeyHashTable,
-Dict307Contents
+Dict316TagHashTable,
+Dict316KeyHashTable,
+Dict316Contents
};
// ----- TOSHIBA ENCRYPTED SR DATA -----
-DictEntry Dict308Contents[] = {
+const DictEntry Dict317Contents[] = {
{ 0x7015, 0x0000, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict308TagHashTable[] = {
+const unsigned short Dict317TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict308KeyHashTable[] = {
+const unsigned short Dict317KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict308Data = {
+vtkDICOMDictionary::Dict Dict317Data = {
"TOSHIBA ENCRYPTED SR DATA",
1,
1,
-Dict308TagHashTable,
-Dict308KeyHashTable,
-Dict308Contents
+Dict317TagHashTable,
+Dict317KeyHashTable,
+Dict317Contents
};
// ----- SECTRA_OverlayInfo_01 -----
-DictEntry Dict309Contents[] = {
+const DictEntry Dict318Contents[] = {
{ 0x6001, 0x0001, 0, VR::LO, VM::M1, "SectraOverlay" },
};
-unsigned short Dict309TagHashTable[] = {
+const unsigned short Dict318TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict309KeyHashTable[] = {
+const unsigned short Dict318KeyHashTable[] = {
2, 0, 1, 0, 38985,
};
-vtkDICOMDictionary::Dict Dict309Data = {
+vtkDICOMDictionary::Dict Dict318Data = {
"SECTRA_OverlayInfo_01",
1,
1,
-Dict309TagHashTable,
-Dict309KeyHashTable,
-Dict309Contents
+Dict318TagHashTable,
+Dict318KeyHashTable,
+Dict318Contents
};
// ----- SIEMENS CSA ENVELOPE -----
-DictEntry Dict310Contents[] = {
+const DictEntry Dict319Contents[] = {
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "syngoReportData" },
{ 0x0029, 0x0011, 0, VR::OB, VM::M1, "syngoReportPresentation" },
};
-unsigned short Dict310TagHashTable[] = {
+const unsigned short Dict319TagHashTable[] = {
3, 6, 0, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict310KeyHashTable[] = {
+const unsigned short Dict319KeyHashTable[] = {
2, 3, 0, 2, 0, 22501, 1, 44118,
};
-vtkDICOMDictionary::Dict Dict310Data = {
+vtkDICOMDictionary::Dict Dict319Data = {
"SIEMENS CSA ENVELOPE",
2,
2,
-Dict310TagHashTable,
-Dict310KeyHashTable,
-Dict310Contents
+Dict319TagHashTable,
+Dict319KeyHashTable,
+Dict319Contents
};
// ----- SIEMENS RA PLANE A -----
-DictEntry Dict311Contents[] = {
+const DictEntry Dict320Contents[] = {
{ 0x0011, 0x0028, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x0029, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x002a, 0, VR::UL, VM::M1, "" },
@@ -18721,7 +19554,7 @@ DictEntry Dict311Contents[] = {
{ 0x0019, 0x00e0, 0, VR::UL, VM::M1, "" },
};
-unsigned short Dict311TagHashTable[] = {
+const unsigned short Dict320TagHashTable[] = {
134, 139, 142, 147, 150, 155, 158, 163, 166, 133,
169, 133, 172, 133, 177, 133, 180, 133, 183, 133,
186, 133, 189, 133, 192, 133, 195, 198, 133, 201,
@@ -18775,7 +19608,7 @@ unsigned short Dict311TagHashTable[] = {
152,
};
-unsigned short Dict311KeyHashTable[] = {
+const unsigned short Dict320KeyHashTable[] = {
133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
@@ -18819,18 +19652,18 @@ unsigned short Dict311KeyHashTable[] = {
40,
};
-vtkDICOMDictionary::Dict Dict311Data = {
+vtkDICOMDictionary::Dict Dict320Data = {
"SIEMENS RA PLANE A",
133,
133,
-Dict311TagHashTable,
-Dict311KeyHashTable,
-Dict311Contents
+Dict320TagHashTable,
+Dict320KeyHashTable,
+Dict320Contents
};
// ----- SIEMENS RA PLANE B -----
-DictEntry Dict312Contents[] = {
+const DictEntry Dict321Contents[] = {
{ 0x0011, 0x0028, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x0029, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x002a, 0, VR::UL, VM::M1, "" },
@@ -18966,7 +19799,7 @@ DictEntry Dict312Contents[] = {
{ 0x0019, 0x00e0, 0, VR::UL, VM::M1, "" },
};
-unsigned short Dict312TagHashTable[] = {
+const unsigned short Dict321TagHashTable[] = {
134, 139, 142, 147, 150, 155, 158, 163, 166, 133,
169, 133, 172, 133, 177, 133, 180, 133, 183, 133,
186, 133, 189, 133, 192, 133, 195, 198, 133, 201,
@@ -19020,7 +19853,7 @@ unsigned short Dict312TagHashTable[] = {
152,
};
-unsigned short Dict312KeyHashTable[] = {
+const unsigned short Dict321KeyHashTable[] = {
133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
133, 133, 133, 133, 133, 133, 133, 133, 133, 133,
@@ -19064,18 +19897,18 @@ unsigned short Dict312KeyHashTable[] = {
40,
};
-vtkDICOMDictionary::Dict Dict312Data = {
+vtkDICOMDictionary::Dict Dict321Data = {
"SIEMENS RA PLANE B",
133,
133,
-Dict312TagHashTable,
-Dict312KeyHashTable,
-Dict312Contents
+Dict321TagHashTable,
+Dict321KeyHashTable,
+Dict321Contents
};
// ----- Silhouette V1.0 -----
-DictEntry Dict313Contents[] = {
+const DictEntry Dict322Contents[] = {
{ 0x0029, 0x0013, 0, VR::UL, VM::M1, "" },
{ 0x0029, 0x0014, 0, VR::UL, VM::M1, "" },
{ 0x0029, 0x0017, 0, VR::UN, VM::M1, "" },
@@ -19114,7 +19947,7 @@ DictEntry Dict313Contents[] = {
{ 0x0029, 0x0091, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict313TagHashTable[] = {
+const unsigned short Dict322TagHashTable[] = {
37, 40, 43, 46, 36, 36, 49, 52, 55, 36,
60, 63, 66, 71, 76, 83, 88, 93, 98, 103,
112, 36, 115, 118, 121, 124, 129, 36, 36, 36,
@@ -19131,7 +19964,7 @@ unsigned short Dict313TagHashTable[] = {
2, 23,
};
-unsigned short Dict313KeyHashTable[] = {
+const unsigned short Dict322KeyHashTable[] = {
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 37, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
@@ -19145,18 +19978,48 @@ unsigned short Dict313KeyHashTable[] = {
31, 149, 32, 149, 33, 149, 34, 149, 35, 149,
};
-vtkDICOMDictionary::Dict Dict313Data = {
+vtkDICOMDictionary::Dict Dict322Data = {
"Silhouette V1.0",
36,
36,
-Dict313TagHashTable,
-Dict313KeyHashTable,
-Dict313Contents
+Dict322TagHashTable,
+Dict322KeyHashTable,
+Dict322Contents
+};
+
+// ----- SIEMENS MED PT WAVEFORM -----
+
+const DictEntry Dict323Contents[] = {
+{ 0x0071, 0x0046, 0, VR::UN, VM::M1, "StartingRespiratoryAmplitude" },
+{ 0x0071, 0x0047, 0, VR::UN, VM::M1, "StartingRespiratoryPhase" },
+{ 0x0071, 0x0048, 0, VR::UN, VM::M1, "EndingRespiratoryAmplitude" },
+{ 0x0071, 0x0049, 0, VR::UN, VM::M1, "EndingRespiratoryPhase" },
+{ 0x0071, 0x0050, 0, VR::CS, VM::M1, "RespiratoryTriggerType" },
+};
+
+const unsigned short Dict323TagHashTable[] = {
+ 6, 9, 12, 15, 18, 0, 1, 0, 70, 1,
+ 3, 73, 1, 2, 72, 1, 4, 80, 1, 1,
+ 71,
+};
+
+const unsigned short Dict323KeyHashTable[] = {
+ 5, 5, 6, 9, 12, 0, 1, 4, 51609, 1,
+ 0, 61035, 3, 1, 15354, 2, 34163, 3, 64847,
+};
+
+vtkDICOMDictionary::Dict Dict323Data = {
+"SIEMENS MED PT WAVEFORM",
+5,
+5,
+Dict323TagHashTable,
+Dict323KeyHashTable,
+Dict323Contents
};
// ----- GEMS_STDY_01 -----
-DictEntry Dict314Contents[] = {
+const DictEntry Dict324Contents[] = {
{ 0x0023, 0x0001, 0, VR::SL, VM::M1, "NumberOfSeriesInStudy" },
{ 0x0023, 0x0002, 0, VR::SL, VM::M1, "NumberOfUnarchivedSeries" },
{ 0x0023, 0x0010, 0, VR::SS, VM::M1, "ReferenceImageField" },
@@ -19167,30 +20030,30 @@ DictEntry Dict314Contents[] = {
{ 0x0023, 0x0080, 0, VR::SQ, VM::M1, "PPSDataSequence" },
};
-unsigned short Dict314TagHashTable[] = {
+const unsigned short Dict324TagHashTable[] = {
8, 9, 14, 21, 8, 8, 24, 27, 0, 2,
1, 2, 7, 128, 3, 0, 1, 3, 80, 4,
112, 1, 2, 16, 1, 5, 116, 1, 6, 125,
};
-unsigned short Dict314KeyHashTable[] = {
+const unsigned short Dict324KeyHashTable[] = {
8, 8, 9, 12, 8, 17, 20, 27, 0, 1,
6, 5368, 2, 2, 41255, 7, 57601, 1, 5, 42112,
3, 0, 19343, 3, 33850, 4, 6019, 1, 1, 29474,
};
-vtkDICOMDictionary::Dict Dict314Data = {
+vtkDICOMDictionary::Dict Dict324Data = {
"GEMS_STDY_01",
8,
8,
-Dict314TagHashTable,
-Dict314KeyHashTable,
-Dict314Contents
+Dict324TagHashTable,
+Dict324KeyHashTable,
+Dict324Contents
};
// ----- TOSHIBA COMAPL HEADER -----
-DictEntry Dict315Contents[] = {
+const DictEntry Dict325Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "COMAPLHeaderType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "COMAPLHeaderVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "COMAPLHeaderInfo" },
@@ -19199,30 +20062,30 @@ DictEntry Dict315Contents[] = {
{ 0x0029, 0x0034, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict315TagHashTable[] = {
+const unsigned short Dict325TagHashTable[] = {
7, 6, 10, 13, 6, 20, 0, 1, 4, 49,
1, 1, 9, 3, 0, 8, 2, 16, 3, 32,
1, 5, 52,
};
-unsigned short Dict315KeyHashTable[] = {
+const unsigned short Dict325KeyHashTable[] = {
6, 7, 10, 6, 15, 18, 0, 1, 3, 16724,
2, 1, 6957, 2, 61854, 1, 0, 64252, 2, 4,
896, 5, 896,
};
-vtkDICOMDictionary::Dict Dict315Data = {
+vtkDICOMDictionary::Dict Dict325Data = {
"TOSHIBA COMAPL HEADER",
6,
6,
-Dict315TagHashTable,
-Dict315KeyHashTable,
-Dict315Contents
+Dict325TagHashTable,
+Dict325KeyHashTable,
+Dict325Contents
};
// ----- GEMS_GDXE_FALCON_04 -----
-DictEntry Dict316Contents[] = {
+const DictEntry Dict326Contents[] = {
{ 0x0011, 0x0003, 0, VR::UI, VM::M1, "ProcessedSeriesUID" },
{ 0x0011, 0x0004, 0, VR::CS, VM::M1, "AcquisitionType" },
{ 0x0011, 0x0005, 0, VR::UI, VM::M1, "AcquisitionUID" },
@@ -19264,7 +20127,7 @@ DictEntry Dict316Contents[] = {
{ 0x0011, 0x006d, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict316TagHashTable[] = {
+const unsigned short Dict326TagHashTable[] = {
40, 45, 50, 57, 62, 67, 72, 77, 80, 87,
39, 39, 39, 39, 39, 90, 39, 93, 96, 39,
101, 104, 107, 110, 113, 116, 39, 39, 39, 39,
@@ -19282,7 +20145,7 @@ unsigned short Dict316TagHashTable[] = {
52, 1, 26, 55,
};
-unsigned short Dict316KeyHashTable[] = {
+const unsigned short Dict326KeyHashTable[] = {
40, 43, 48, 39, 39, 53, 39, 39, 56, 59,
62, 39, 39, 39, 39, 39, 67, 39, 70, 39,
39, 73, 78, 81, 39, 39, 39, 39, 84, 39,
@@ -19299,29 +20162,29 @@ unsigned short Dict316KeyHashTable[] = {
35, 137, 36, 137, 37, 137, 38, 137,
};
-vtkDICOMDictionary::Dict Dict316Data = {
+vtkDICOMDictionary::Dict Dict326Data = {
"GEMS_GDXE_FALCON_04",
39,
39,
-Dict316TagHashTable,
-Dict316KeyHashTable,
-Dict316Contents
+Dict326TagHashTable,
+Dict326KeyHashTable,
+Dict326Contents
};
// ----- PHILIPS IMAGING DD 001 -----
-DictEntry Dict317Contents[] = {
+const DictEntry Dict327Contents[] = {
{ 0x2001, 0x0001, 0, VR::FL, VM::M1, "ChemicalShift" },
{ 0x2001, 0x0002, 0, VR::IS, VM::M1, "ChemicalShiftNumberMR" },
{ 0x2001, 0x0003, 0, VR::FL, VM::M1, "DiffusionBFactor" },
{ 0x2001, 0x0004, 0, VR::CS, VM::M1, "DiffusionDirection" },
-{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "" },
+{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "GraphicAnnotationParentID" },
{ 0x2001, 0x0006, 0, VR::CS, VM::M1, "ImageEnhanced" },
{ 0x2001, 0x0007, 0, VR::CS, VM::M1, "ImageTypeEDES" },
{ 0x2001, 0x0008, 0, VR::IS, VM::M1, "PhaseNumber" },
{ 0x2001, 0x0009, 0, VR::FL, VM::M1, "ImagePrepulseDelay" },
-{ 0x2001, 0x000a, 0, VR::IS, VM::M1, "SliceNumberMR" },
-{ 0x2001, 0x000b, 0, VR::CS, VM::M1, "SliceOrientation" },
+{ 0x2001, 0x000a, 0, VR::IS, VM::M1, "ImagePlaneNumber" },
+{ 0x2001, 0x000b, 0, VR::CS, VM::M1, "ImageOrientation" },
{ 0x2001, 0x000c, 0, VR::CS, VM::M1, "ArrhythmiaRejection" },
{ 0x2001, 0x000e, 0, VR::CS, VM::M1, "CardiacCycled" },
{ 0x2001, 0x000f, 0, VR::SS, VM::M1, "CardiacGateWidth" },
@@ -19332,14 +20195,14 @@ DictEntry Dict317Contents[] = {
{ 0x2001, 0x0014, 0, VR::SL, VM::M1, "NumberOfEchoes" },
{ 0x2001, 0x0015, 0, VR::SS, VM::M1, "NumberOfLocations" },
{ 0x2001, 0x0016, 0, VR::SS, VM::M1, "NumberOfPCDirections" },
-{ 0x2001, 0x0017, 0, VR::SL, VM::M1, "NumberOfPhasesMR" },
-{ 0x2001, 0x0018, 0, VR::SL, VM::M1, "NumberOfSlicesMR" },
+{ 0x2001, 0x0017, 0, VR::SL, VM::M1, "NumberOfPhases" },
+{ 0x2001, 0x0018, 0, VR::SL, VM::M1, "NumberOfSlices" },
{ 0x2001, 0x0019, 0, VR::CS, VM::M1, "PartialMatrixScanned" },
{ 0x2001, 0x001a, 0, VR::FL, VM::M3, "PCVelocity" },
{ 0x2001, 0x001b, 0, VR::FL, VM::M1, "PrepulseDelay" },
{ 0x2001, 0x001c, 0, VR::CS, VM::M1, "PrepulseType" },
-{ 0x2001, 0x001d, 0, VR::IS, VM::M1, "ReconstructionNumberMR" },
-{ 0x2001, 0x001e, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x001d, 0, VR::IS, VM::M1, "ReconstructionNumber" },
+{ 0x2001, 0x001e, 0, VR::CS, VM::M1, "ReformatAccuracy" },
{ 0x2001, 0x001f, 0, VR::CS, VM::M1, "RespirationSync" },
{ 0x2001, 0x0020, 0, VR::LO, VM::M1, "ScanningTechnique" },
{ 0x2001, 0x0021, 0, VR::CS, VM::M1, "SPIR" },
@@ -19347,187 +20210,202 @@ DictEntry Dict317Contents[] = {
{ 0x2001, 0x0023, 0, VR::DS, VM::M1, "FlipAngle" },
{ 0x2001, 0x0024, 0, VR::CS, VM::M1, "SeriesIsInteractive" },
{ 0x2001, 0x0025, 0, VR::SH, VM::M1, "EchoTimeDisplay" },
-{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "PresentationStateSubtractionActive" },
{ 0x2001, 0x0029, 0, VR::FL, VM::M1, "" },
{ 0x2001, 0x002b, 0, VR::CS, VM::M1, "" },
{ 0x2001, 0x002d, 0, VR::SS, VM::M1, "NumberOfSlicesInStack" },
{ 0x2001, 0x0032, 0, VR::FL, VM::M1, "StackRadialAngle" },
{ 0x2001, 0x0033, 0, VR::CS, VM::M1, "StackRadialAxis" },
{ 0x2001, 0x0035, 0, VR::SS, VM::M1, "StackSliceNumber" },
-{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackSliceType" },
+{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackType" },
{ 0x2001, 0x0039, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "" },
-{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "" },
-{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "" },
-{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "ContourFillColor" },
+{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "DisplayedAreaZoomInterpolationMeth" },
+{ 0x2001, 0x0043, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxFrstEndPnt" },
+{ 0x2001, 0x0044, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxScndEndPnt" },
+{ 0x2001, 0x0045, 0, VR::IS, VM::M2, "EllipsDisplShutOtherAxFrstEndPnt" },
+{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "GraphicLineStyle" },
+{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "GraphicLineWidth" },
+{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "GraphicAnnotationID" },
+{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "InterpolationMethod" },
+{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "PolyLineBeginPointStyle" },
+{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "PolyLineEndPointStyle" },
+{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "WindowSmoothingTaste" },
+{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "GraphicMarkerType" },
+{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "OverlayPlaneID" },
+{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "ImagePresentationStateUID" },
+{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "PresentationGLTrafoInvert" },
+{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "ContourFillTransparency" },
+{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "GraphicLineColor" },
+{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "GraphicType" },
{ 0x2001, 0x0058, 0, VR::UL, VM::M1, "ContrastTransferTaste" },
-{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "" },
+{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "GraphicAnnotationModel" },
+{ 0x2001, 0x005d, 0, VR::ST, VM::M1, "MeasurementTextUnits" },
+{ 0x2001, 0x005e, 0, VR::ST, VM::M1, "MeasurementTextType" },
{ 0x2001, 0x005f, 0, VR::SQ, VM::M1, "StackSequence" },
{ 0x2001, 0x0060, 0, VR::SL, VM::M1, "NumberOfStacks" },
{ 0x2001, 0x0061, 0, VR::CS, VM::M1, "SeriesTransmitted" },
{ 0x2001, 0x0062, 0, VR::CS, VM::M1, "SeriesCommitted" },
{ 0x2001, 0x0063, 0, VR::CS, VM::M1, "ExaminationSource" },
-{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "" },
-{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "TextType" },
+{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "GraphicOverlayPlane" },
{ 0x2001, 0x0067, 0, VR::CS, VM::M1, "LinearPresentationGLTrafoShapeSub" },
-{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "LinearModalityGLTrafo" },
+{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "DisplayShutter" },
+{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "SpatialTransformation" },
{ 0x2001, 0x006b, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "TextFont" },
{ 0x2001, 0x006e, 0, VR::SH, VM::M1, "SeriesType" },
-{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "GraphicConstraint" },
+{ 0x2001, 0x0072, 0, VR::IS, VM::M1, "EllipsDisplShutOtherAxScndEndPnt" },
{ 0x2001, 0x0074, 0, VR::DS, VM::M1, "" },
{ 0x2001, 0x0075, 0, VR::DS, VM::M1, "" },
-{ 0x2001, 0x0076, 0, VR::UL, VM::M1, "" },
+{ 0x2001, 0x0076, 0, VR::UL, VM::M1, "NumberOfFrames" },
{ 0x2001, 0x0077, 0, VR::CS, VM::M1, "GLTrafoType" },
-{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "" },
+{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "WindowRoundingFactor" },
{ 0x2001, 0x007b, 0, VR::IS, VM::M1, "AcquisitionNumber" },
+{ 0x2001, 0x007c, 0, VR::US, VM::M1, "FrameNumber" },
{ 0x2001, 0x0080, 0, VR::LO, VM::M1, "" },
{ 0x2001, 0x0081, 0, VR::IS, VM::M1, "NumberOfDynamicScans" },
{ 0x2001, 0x0082, 0, VR::IS, VM::M1, "EchoTrainLength" },
{ 0x2001, 0x0083, 0, VR::DS, VM::M1, "ImagingFrequency" },
{ 0x2001, 0x0084, 0, VR::DS, VM::M1, "InversionTime" },
{ 0x2001, 0x0085, 0, VR::DS, VM::M1, "MagneticFieldStrength" },
-{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "" },
+{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "NrOfPhaseEncodingSteps" },
{ 0x2001, 0x0087, 0, VR::SH, VM::M1, "ImagedNucleus" },
{ 0x2001, 0x0088, 0, VR::DS, VM::M1, "NumberOfAverages" },
{ 0x2001, 0x0089, 0, VR::DS, VM::M1, "PhaseFOVPercent" },
{ 0x2001, 0x008a, 0, VR::DS, VM::M1, "SamplingPercent" },
-{ 0x2001, 0x008b, 0, VR::SH, VM::M1, "" },
-{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x008b, 0, VR::SH, VM::M1, "TransmittingCoil" },
+{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "TextForegroundColor" },
+{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "TextBackgroundColor" },
+{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "TextShadowColor" },
+{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "TextStyle" },
{ 0x2001, 0x009a, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "GraphicNumber" },
+{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "GraphicAnnotationLabel" },
{ 0x2001, 0x009f, 0, VR::US, VM::M2, "PixelProcessingKernelSize" },
{ 0x2001, 0x00a1, 0, VR::CS, VM::M1, "IsRawImage" },
-{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x00c8, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x00cc, 0, VR::ST, VM::M1, "" },
+{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "TextColorForeground" },
+{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "TextColorBackground" },
+{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "TextColorShadow" },
+{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "LinearModalityGLTrafo" },
+{ 0x2001, 0x00c8, 0, VR::LO, VM::M1, "ExamCardName" },
+{ 0x2001, 0x00cc, 0, VR::ST, VM::M1, "DerivationDescription" },
{ 0x2001, 0x00da, 0, VR::CS, VM::M1, "" },
{ 0x2001, 0x00f1, 0, VR::FL, VM::M1TN, "ProspectiveMotionCorrection" },
{ 0x2001, 0x00f2, 0, VR::FL, VM::M1TN, "RetrospectiveMotionCorrection" },
};
-unsigned short Dict317TagHashTable[] = {
- 115, 122, 129, 136, 143, 146, 149, 154, 159, 164,
- 114, 169, 172, 177, 180, 183, 188, 193, 196, 201,
- 204, 207, 210, 215, 220, 223, 226, 229, 232, 235,
- 238, 241, 244, 247, 250, 253, 114, 256, 259, 114,
- 262, 114, 265, 114, 114, 114, 114, 114, 268, 271,
- 274, 277, 114, 280, 283, 114, 114, 114, 286, 114,
- 291, 114, 294, 114, 114, 114, 114, 114, 297, 300,
- 303, 114, 306, 309, 312, 315, 318, 114, 321, 324,
- 327, 330, 333, 336, 339, 114, 342, 114, 345, 114,
- 114, 114, 114, 348, 351, 354, 357, 362, 365, 370,
- 377, 380, 385, 390, 395, 400, 405, 408, 413, 418,
- 114, 421, 424, 114, 0, 3, 2, 3, 78, 116,
- 99, 147, 3, 1, 2, 79, 117, 98, 146, 3,
- 4, 5, 80, 118, 97, 145, 3, 3, 4, 81,
- 119, 96, 144, 1, 6, 7, 1, 5, 6, 2,
- 8, 9, 82, 122, 2, 7, 8, 83, 123, 2,
- 10, 11, 101, 155, 2, 9, 10, 100, 154, 1,
- 11, 12, 2, 13, 15, 103, 159, 1, 12, 14,
- 1, 15, 17, 2, 14, 16, 102, 156, 2, 17,
- 19, 105, 163, 1, 16, 18, 2, 19, 21, 104,
- 161, 1, 18, 20, 1, 21, 23, 1, 20, 22,
- 2, 23, 25, 107, 165, 2, 22, 24, 106, 164,
- 1, 25, 27, 1, 24, 26, 1, 27, 29, 1,
- 26, 28, 1, 29, 31, 1, 28, 30, 1, 31,
- 33, 1, 30, 32, 1, 33, 35, 1, 32, 34,
- 1, 35, 37, 1, 34, 36, 1, 36, 38, 1,
- 37, 41, 1, 38, 43, 1, 39, 45, 1, 41,
- 51, 1, 40, 50, 1, 42, 53, 1, 108, 193,
- 1, 43, 54, 1, 44, 57, 2, 45, 61, 109,
- 200, 1, 46, 63, 1, 110, 204, 1, 47, 70,
- 1, 48, 71, 1, 49, 72, 1, 111, 218, 1,
- 50, 75, 1, 51, 76, 1, 52, 77, 1, 53,
- 78, 1, 54, 80, 1, 55, 81, 1, 56, 82,
- 1, 57, 83, 1, 58, 84, 1, 59, 85, 1,
- 60, 86, 1, 61, 88, 1, 62, 90, 1, 63,
- 95, 1, 64, 96, 1, 65, 97, 2, 66, 98,
- 113, 242, 1, 67, 99, 2, 68, 100, 87, 131,
- 3, 69, 101, 86, 130, 112, 241, 1, 85, 129,
- 2, 70, 103, 84, 128, 2, 71, 104, 91, 135,
- 2, 72, 105, 90, 134, 2, 73, 106, 89, 133,
- 2, 74, 107, 88, 132, 1, 95, 139, 2, 75,
- 109, 94, 138, 2, 76, 110, 93, 137, 1, 92,
- 136, 1, 77, 113, 1, 0, 1,
-};
-
-unsigned short Dict317KeyHashTable[] = {
- 114, 114, 114, 115, 114, 118, 114, 127, 130, 114,
- 133, 114, 114, 114, 136, 139, 144, 114, 114, 114,
- 147, 150, 114, 155, 114, 260, 263, 114, 114, 266,
- 114, 269, 274, 114, 277, 114, 280, 283, 114, 286,
- 114, 289, 292, 114, 295, 298, 301, 114, 114, 114,
- 114, 114, 114, 114, 304, 114, 114, 307, 114, 310,
- 114, 313, 114, 316, 321, 324, 331, 334, 337, 340,
- 114, 343, 114, 114, 114, 114, 114, 346, 114, 114,
- 114, 114, 114, 349, 352, 355, 358, 363, 114, 114,
- 114, 368, 371, 374, 114, 114, 114, 114, 114, 377,
- 114, 114, 380, 114, 114, 114, 383, 114, 114, 114,
- 386, 114, 389, 114, 0, 1, 35, 44603, 4, 22,
-25792, 24, 36873, 61, 6746, 88, 1638, 1, 41, 39763,
- 1, 76, 27245, 1, 64, 61897, 1, 15, 14726, 2,
- 27, 25264, 67, 34658, 1, 93, 15513, 1, 103, 14054,
- 2, 7, 7949, 9, 42244, 52, 4, 47, 28, 47,
- 36, 47, 37, 47, 38, 47, 44, 47, 45, 47,
- 46, 47, 47, 47, 48, 47, 49, 47, 50, 47,
- 51, 47, 52, 47, 53, 47, 54, 47, 55, 47,
- 56, 47, 57, 47, 58, 47, 59, 47, 60, 47,
- 62, 47, 68, 47, 69, 47, 71, 47, 72, 47,
- 73, 47, 74, 47, 75, 47, 77, 47, 78, 47,
- 79, 47, 80, 47, 82, 47, 84, 47, 90, 47,
- 95, 47, 96, 47, 97, 47, 98, 47, 99, 47,
- 100, 47, 101, 47, 102, 47, 105, 47, 106, 47,
- 107, 47, 108, 47, 109, 47, 110, 47, 111, 47,
- 1, 13, 50394, 1, 89, 53003, 1, 11, 24290, 2,
- 2, 32047, 3, 5791, 1, 86, 61266, 1, 104, 7782,
- 1, 63, 38600, 1, 92, 61334, 1, 19, 22852, 1,
- 39, 10237, 1, 21, 30286, 1, 30, 19784, 1, 23,
-48739, 1, 17, 31914, 1, 113, 33126, 1, 40, 21283,
- 1, 83, 44798, 1, 112, 17885, 2, 14, 42573, 94,
-56145, 1, 25, 43922, 3, 26, 63427, 32, 51776, 33,
-23139, 1, 81, 12058, 1, 10, 15143, 1, 18, 53955,
- 1, 8, 18745, 1, 0, 47521, 1, 16, 20660, 1,
- 65, 6566, 1, 66, 18073, 1, 87, 34679, 2, 20,
-42170, 29, 31678, 2, 6, 17514, 31, 44806, 1, 1,
-28283, 1, 70, 30781, 1, 91, 13295, 1, 43, 59773,
- 1, 42, 38927, 1, 34, 48912, 1, 12, 12337, 2,
- 5, 14799, 85, 49784,
+const unsigned short Dict327TagHashTable[] = {
+ 122, 125, 128, 133, 138, 141, 144, 147, 150, 121,
+ 153, 156, 121, 159, 121, 162, 121, 121, 121, 121,
+ 121, 165, 168, 171, 121, 121, 174, 177, 121, 121,
+ 121, 180, 121, 185, 121, 121, 121, 121, 188, 193,
+ 196, 199, 202, 207, 121, 121, 210, 213, 216, 219,
+ 121, 222, 225, 230, 233, 236, 239, 242, 121, 245,
+ 121, 248, 121, 121, 251, 254, 257, 260, 263, 266,
+ 269, 272, 275, 121, 278, 281, 284, 289, 292, 295,
+ 298, 301, 121, 121, 304, 307, 312, 315, 320, 325,
+ 330, 335, 338, 343, 348, 355, 362, 367, 370, 373,
+ 376, 379, 384, 389, 394, 397, 400, 403, 406, 409,
+ 414, 419, 422, 425, 430, 433, 436, 441, 446, 449,
+ 454, 0, 1, 26, 28, 1, 29, 31, 2, 28,
+ 30, 114, 165, 2, 31, 33, 113, 164, 1, 30,
+ 32, 1, 33, 35, 1, 32, 34, 1, 35, 37,
+ 1, 34, 36, 1, 36, 38, 1, 37, 41, 1,
+ 38, 43, 1, 39, 45, 1, 41, 51, 1, 40,
+ 50, 1, 42, 53, 1, 43, 54, 1, 44, 57,
+ 2, 45, 61, 115, 193, 1, 46, 63, 2, 47,
+ 67, 116, 200, 1, 48, 68, 1, 49, 69, 1,
+ 50, 70, 2, 51, 71, 117, 204, 1, 52, 72,
+ 1, 53, 75, 1, 54, 76, 1, 55, 77, 1,
+ 56, 78, 1, 57, 80, 2, 58, 81, 118, 218,
+ 1, 59, 82, 1, 60, 83, 1, 61, 84, 1,
+ 62, 85, 1, 63, 86, 1, 64, 88, 1, 65,
+ 90, 1, 66, 93, 1, 67, 94, 1, 68, 95,
+ 1, 69, 96, 1, 70, 97, 1, 71, 98, 1,
+ 72, 99, 1, 73, 100, 1, 74, 101, 1, 75,
+ 103, 1, 76, 104, 2, 77, 105, 120, 242, 1,
+ 78, 106, 1, 79, 107, 1, 119, 241, 1, 80,
+ 109, 1, 81, 110, 1, 82, 113, 2, 83, 114,
+ 94, 131, 1, 93, 130, 2, 84, 116, 92, 129,
+ 2, 85, 117, 91, 128, 2, 86, 118, 98, 135,
+ 2, 87, 119, 97, 134, 1, 96, 133, 2, 0,
+ 1, 95, 132, 2, 88, 122, 102, 139, 3, 2,
+ 3, 89, 123, 101, 138, 3, 1, 2, 90, 124,
+ 100, 137, 2, 4, 5, 99, 136, 1, 3, 4,
+ 1, 6, 7, 1, 5, 6, 1, 8, 9, 2,
+ 7, 8, 106, 147, 2, 10, 11, 105, 146, 2,
+ 9, 10, 104, 145, 1, 103, 144, 1, 11, 12,
+ 1, 13, 15, 1, 12, 14, 1, 15, 17, 2,
+ 14, 16, 108, 155, 2, 17, 19, 107, 154, 1,
+ 16, 18, 1, 19, 21, 2, 18, 20, 110, 159,
+ 1, 21, 23, 1, 20, 22, 2, 23, 25, 109,
+ 156, 2, 22, 24, 112, 163, 1, 25, 27, 2,
+ 24, 26, 111, 161, 1, 27, 29,
+};
+
+const unsigned short Dict327KeyHashTable[] = {
+ 121, 121, 121, 121, 121, 122, 125, 132, 137, 121,
+ 121, 140, 143, 146, 149, 154, 159, 162, 165, 168,
+ 121, 121, 121, 121, 171, 121, 174, 177, 121, 121,
+ 121, 182, 185, 121, 188, 121, 191, 196, 121, 201,
+ 206, 211, 121, 121, 214, 217, 121, 121, 222, 225,
+ 234, 237, 244, 247, 121, 121, 121, 252, 271, 274,
+ 121, 279, 282, 121, 287, 292, 121, 121, 297, 300,
+ 303, 121, 306, 309, 312, 317, 324, 327, 330, 333,
+ 338, 121, 343, 348, 121, 121, 121, 351, 354, 361,
+ 364, 367, 121, 374, 121, 377, 382, 385, 388, 391,
+ 396, 121, 399, 402, 407, 121, 410, 121, 121, 415,
+ 418, 423, 426, 429, 121, 121, 432, 435, 121, 121,
+ 438, 0, 1, 36, 38495, 3, 67, 48876, 74, 48231,
+ 96, 36938, 2, 61, 25073, 101, 3610, 1, 93, 6268,
+ 1, 80, 29542, 1, 31, 33007, 1, 102, 40571, 2,
+ 90, 37603, 97, 26027, 2, 14, 26570, 15, 60995, 1,
+ 54, 13865, 1, 4, 53828, 1, 19, 11781, 1, 94,
+40256, 1, 40, 35759, 1, 99, 1999, 2, 60, 13301,
+ 83, 37303, 1, 58, 23725, 1, 25, 48964, 1, 20,
+49480, 2, 21, 53787, 22, 16946, 2, 8, 27410, 24,
+56946, 2, 41, 26630, 49, 18458, 2, 33, 44007, 116,
+10747, 1, 104, 51872, 1, 62, 9966, 2, 29, 53677,
+ 32, 47156, 1, 34, 44458, 4, 16, 35172, 65, 11534,
+ 109, 63093, 113, 14616, 1, 23, 3673, 3, 5, 25859,
+ 68, 30409, 82, 4893, 1, 103, 33584, 2, 6, 63622,
+ 50, 37311, 9, 37, 44, 38, 44, 44, 44, 79,
+ 44, 84, 44, 85, 44, 91, 44, 107, 44, 118,
+ 44, 1, 105, 30749, 2, 27, 28765, 66, 14024, 1,
+ 11, 52132, 2, 30, 26222, 73, 33790, 2, 46, 59320,
+ 63, 54477, 2, 87, 4861, 89, 11334, 1, 57, 52379,
+ 1, 119, 31474, 1, 3, 9247, 1, 71, 61982, 1,
+ 98, 55314, 2, 39, 23185, 72, 46193, 3, 10, 9553,
+ 17, 16527, 78, 61047, 1, 92, 18740, 1, 43, 15568,
+ 1, 51, 7525, 2, 42, 19885, 110, 49529, 2, 1,
+40729, 77, 22250, 2, 28, 5198, 75, 40916, 1, 7,
+34028, 1, 53, 62351, 3, 45, 45029, 55, 23907, 111,
+57702, 1, 108, 40875, 1, 56, 46044, 3, 70, 14852,
+ 76, 61743, 115, 61743, 1, 0, 10108, 2, 18, 28627,
+ 86, 38226, 1, 59, 37023, 1, 13, 13356, 1, 64,
+29103, 2, 95, 10750, 100, 40071, 1, 48, 45173, 1,
+ 26, 6137, 2, 106, 60724, 117, 9487, 1, 12, 7832,
+ 2, 2, 35067, 120, 64248, 1, 112, 34383, 2, 9,
+31243, 81, 25668, 1, 88, 59755, 1, 47, 26328, 1,
+ 69, 27443, 1, 35, 317, 1, 114, 37450, 1, 52,
+45035,
};
-vtkDICOMDictionary::Dict Dict317Data = {
+vtkDICOMDictionary::Dict Dict327Data = {
"PHILIPS IMAGING DD 001",
-114,
-114,
-Dict317TagHashTable,
-Dict317KeyHashTable,
-Dict317Contents
+121,
+121,
+Dict327TagHashTable,
+Dict327KeyHashTable,
+Dict327Contents
};
// ----- NQRight -----
-DictEntry Dict318Contents[] = {
+const DictEntry Dict328Contents[] = {
{ 0x0299, 0x0001, 0, VR::FL, VM::M1, "RightCorticalWhiteMatter" },
{ 0x0299, 0x0002, 0, VR::FL, VM::M1, "RightCorticalGrayMatter" },
{ 0x0299, 0x0003, 0, VR::FL, VM::M1, "Right3rdVentricle" },
@@ -19588,7 +20466,7 @@ DictEntry Dict318Contents[] = {
{ 0x0299, 0x003a, 0, VR::FL, VM::M1, "RightMeningie" },
};
-unsigned short Dict318TagHashTable[] = {
+const unsigned short Dict328TagHashTable[] = {
59, 62, 65, 70, 75, 80, 85, 90, 95, 98,
101, 104, 107, 110, 113, 116, 119, 122, 125, 128,
131, 58, 134, 137, 140, 143, 146, 149, 152, 155,
@@ -19614,7 +20492,7 @@ unsigned short Dict318TagHashTable[] = {
38, 1, 36, 37, 1, 35, 36,
};
-unsigned short Dict318KeyHashTable[] = {
+const unsigned short Dict328KeyHashTable[] = {
58, 58, 59, 58, 62, 65, 72, 58, 75, 58,
78, 83, 86, 58, 58, 89, 58, 92, 58, 95,
98, 105, 108, 58, 115, 118, 58, 125, 128, 58,
@@ -19639,18 +20517,18 @@ unsigned short Dict318KeyHashTable[] = {
23833, 46, 24728, 1, 27, 12877,
};
-vtkDICOMDictionary::Dict Dict318Data = {
+vtkDICOMDictionary::Dict Dict328Data = {
"NQRight",
58,
58,
-Dict318TagHashTable,
-Dict318KeyHashTable,
-Dict318Contents
+Dict328TagHashTable,
+Dict328KeyHashTable,
+Dict328Contents
};
// ----- Siemens: Thorax/Multix FD Lab Settings -----
-DictEntry Dict319Contents[] = {
+const DictEntry Dict329Contents[] = {
{ 0x0019, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x0001, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::LO, VM::M1, "TotalDoseAreaProduct" },
@@ -19672,7 +20550,7 @@ DictEntry Dict319Contents[] = {
{ 0x0021, 0x0031, 0, VR::SH, VM::M1, "AcquisitionSortNumber" },
};
-unsigned short Dict319TagHashTable[] = {
+const unsigned short Dict329TagHashTable[] = {
19, 19, 20, 23, 26, 29, 34, 37, 40, 43,
46, 49, 52, 19, 55, 58, 61, 66, 19, 0,
1, 10, 9, 1, 9, 8, 1, 12, 11, 2,
@@ -19683,7 +20561,7 @@ unsigned short Dict319TagHashTable[] = {
22, 17, 48,
};
-unsigned short Dict319KeyHashTable[] = {
+const unsigned short Dict329KeyHashTable[] = {
20, 23, 26, 19, 31, 42, 45, 19, 48, 19,
19, 19, 53, 56, 59, 19, 19, 62, 65, 0,
1, 14, 27708, 1, 9, 58517, 2, 10, 21495, 11,
@@ -19693,74 +20571,79 @@ unsigned short Dict319KeyHashTable[] = {
2, 33760, 1, 6, 55050, 2, 15, 46275, 17, 55280,
};
-vtkDICOMDictionary::Dict Dict319Data = {
+vtkDICOMDictionary::Dict Dict329Data = {
"Siemens: Thorax/Multix FD Lab Settings",
19,
19,
-Dict319TagHashTable,
-Dict319KeyHashTable,
-Dict319Contents
+Dict329TagHashTable,
+Dict329KeyHashTable,
+Dict329Contents
};
// ----- CAD Sciences -----
-DictEntry Dict320Contents[] = {
+const DictEntry Dict330Contents[] = {
{ 0x3335, 0x0000, 0, VR::UN, VM::M1, "" },
{ 0x3335, 0x0006, 0, VR::UN, VM::M1, "" },
{ 0x3335, 0x0007, 0, VR::UN, VM::M1, "" },
{ 0x3335, 0x0008, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict320TagHashTable[] = {
+const unsigned short Dict330TagHashTable[] = {
4, 5, 10, 13, 0, 2, 0, 0, 3, 8,
1, 2, 7, 1, 1, 6,
};
-unsigned short Dict320KeyHashTable[] = {
+const unsigned short Dict330KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict320Data = {
+vtkDICOMDictionary::Dict Dict330Data = {
"CAD Sciences",
4,
4,
-Dict320TagHashTable,
-Dict320KeyHashTable,
-Dict320Contents
+Dict330TagHashTable,
+Dict330KeyHashTable,
+Dict330Contents
};
// ----- V1 -----
-DictEntry Dict321Contents[] = {
+const DictEntry Dict331Contents[] = {
{ 0x0011, 0x0001, 0, VR::OB, VM::M1, "UserData" },
{ 0x0011, 0x0002, 0, VR::DS, VM::M1, "NormalizationCoefficient" },
{ 0x0011, 0x0003, 0, VR::DS, VM::M1TN, "ReceivingGain" },
{ 0x0011, 0x0004, 0, VR::DS, VM::M1, "MeanImageNoise" },
+{ 0x0011, 0x0005, 0, VR::LT, VM::M1, "" },
+{ 0x0011, 0x0006, 0, VR::LT, VM::M1, "" },
+{ 0x0011, 0x0007, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict321TagHashTable[] = {
- 5, 8, 11, 14, 0, 1, 0, 1, 1, 3,
- 4, 1, 2, 3, 1, 1, 2,
+const unsigned short Dict331TagHashTable[] = {
+ 8, 11, 14, 7, 19, 22, 25, 0, 1, 3,
+ 4, 1, 6, 7, 2, 0, 1, 5, 6, 1,
+ 2, 3, 1, 1, 2, 1, 4, 5,
};
-unsigned short Dict321KeyHashTable[] = {
- 5, 4, 8, 11, 0, 1, 2, 47152, 1, 0,
-51847, 2, 1, 7530, 3, 17937,
+const unsigned short Dict331KeyHashTable[] = {
+ 8, 7, 11, 7, 7, 14, 21, 0, 1, 1,
+60477, 1, 3, 47699, 3, 4, 768, 5, 768, 6,
+ 768, 2, 0, 20264, 2, 55030,
};
-vtkDICOMDictionary::Dict Dict321Data = {
+vtkDICOMDictionary::Dict Dict331Data = {
"V1",
-4,
-4,
-Dict321TagHashTable,
-Dict321KeyHashTable,
-Dict321Contents
+7,
+7,
+Dict331TagHashTable,
+Dict331KeyHashTable,
+Dict331Contents
};
// ----- GEMS_SERS_01 -----
-DictEntry Dict322Contents[] = {
+const DictEntry Dict332Contents[] = {
{ 0x0025, 0x0006, 0, VR::SS, VM::M1, "LastPulseSequenceUsed" },
{ 0x0025, 0x0007, 0, VR::SL, VM::M1, "ImagesInSeries" },
{ 0x0025, 0x0010, 0, VR::SL, VM::M1, "LandmarkCounter" },
@@ -19773,32 +20656,32 @@ DictEntry Dict322Contents[] = {
{ 0x0025, 0x001b, 0, VR::OB, VM::M1, "ProtocolDataBlockCompressed" },
};
-unsigned short Dict322TagHashTable[] = {
+const unsigned short Dict332TagHashTable[] = {
11, 16, 19, 24, 29, 32, 10, 10, 10, 35,
0, 2, 5, 23, 7, 25, 1, 6, 24, 2,
3, 17, 9, 27, 2, 2, 16, 8, 26, 1,
1, 7, 1, 0, 6, 1, 4, 20,
};
-unsigned short Dict322KeyHashTable[] = {
+const unsigned short Dict332KeyHashTable[] = {
11, 10, 10, 14, 17, 20, 10, 27, 10, 30,
0, 1, 0, 48638, 1, 4, 38095, 1, 7, 10378,
3, 5, 57651, 6, 44233, 8, 31186, 1, 9, 20657,
3, 1, 31090, 2, 30503, 3, 40239,
};
-vtkDICOMDictionary::Dict Dict322Data = {
+vtkDICOMDictionary::Dict Dict332Data = {
"GEMS_SERS_01",
10,
10,
-Dict322TagHashTable,
-Dict322KeyHashTable,
-Dict322Contents
+Dict332TagHashTable,
+Dict332KeyHashTable,
+Dict332Contents
};
// ----- astm.org/diconde/iod/NdeUsEquipment -----
-DictEntry Dict323Contents[] = {
+const DictEntry Dict333Contents[] = {
{ 0x0009, 0x0002, 0, VR::SQ, VM::M1, "PulserEquipmentSequence" },
{ 0x0009, 0x0004, 0, VR::CS, VM::M1, "PulserType" },
{ 0x0009, 0x0006, 0, VR::LT, VM::M1, "PulserNotes" },
@@ -19822,7 +20705,7 @@ DictEntry Dict323Contents[] = {
{ 0x0009, 0x001C, 0, VR::DS, VM::M1, "MeasuredBandwidth" },
};
-unsigned short Dict323TagHashTable[] = {
+const unsigned short Dict333TagHashTable[] = {
22, 25, 21, 28, 33, 36, 41, 46, 51, 54,
57, 60, 21, 63, 21, 66, 69, 72, 75, 78,
21, 0, 1, 20, 28, 1, 3, 8, 2, 4,
@@ -19834,7 +20717,7 @@ unsigned short Dict323TagHashTable[] = {
26,
};
-unsigned short Dict323KeyHashTable[] = {
+const unsigned short Dict333KeyHashTable[] = {
21, 21, 22, 25, 21, 30, 35, 40, 21, 43,
48, 21, 55, 58, 21, 21, 21, 21, 61, 72,
21, 0, 1, 12, 26724, 2, 5, 26272, 13, 26724,
@@ -19845,18 +20728,18 @@ unsigned short Dict323KeyHashTable[] = {
15, 51153, 1, 16, 51153,
};
-vtkDICOMDictionary::Dict Dict323Data = {
+vtkDICOMDictionary::Dict Dict333Data = {
"astm.org/diconde/iod/NdeUsEquipment",
21,
21,
-Dict323TagHashTable,
-Dict323KeyHashTable,
-Dict323Contents
+Dict333TagHashTable,
+Dict333KeyHashTable,
+Dict333Contents
};
// ----- AMI ImageContext_01 -----
-DictEntry Dict324Contents[] = {
+const DictEntry Dict334Contents[] = {
{ 0x3109, 0x0010, 0, VR::CS, VM::M1, "WindowInvert" },
{ 0x3109, 0x0020, 0, VR::IS, VM::M1, "WindowCenter" },
{ 0x3109, 0x0030, 0, VR::IS, VM::M1, "WindowWidth" },
@@ -19868,32 +20751,32 @@ DictEntry Dict324Contents[] = {
{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "ShowImageOverlay" },
};
-unsigned short Dict324TagHashTable[] = {
+const unsigned short Dict334TagHashTable[] = {
9, 10, 9, 15, 9, 22, 25, 9, 28, 0,
2, 1, 32, 4, 80, 3, 0, 16, 3, 64,
8, 144, 1, 7, 128, 1, 6, 112, 2, 2,
48, 5, 96,
};
-unsigned short Dict324KeyHashTable[] = {
+const unsigned short Dict334KeyHashTable[] = {
9, 9, 10, 13, 18, 23, 28, 31, 9, 0,
1, 4, 14990, 2, 0, 3266, 2, 3434, 2, 1,
25418, 3, 28245, 2, 5, 12513, 7, 9639, 1, 6,
34690, 1, 8, 62020,
};
-vtkDICOMDictionary::Dict Dict324Data = {
+vtkDICOMDictionary::Dict Dict334Data = {
"AMI ImageContext_01",
9,
9,
-Dict324TagHashTable,
-Dict324KeyHashTable,
-Dict324Contents
+Dict334TagHashTable,
+Dict334KeyHashTable,
+Dict334Contents
};
// ----- SPI-P-XSB-VISUB Release 1 -----
-DictEntry Dict325Contents[] = {
+const DictEntry Dict335Contents[] = {
{ 0x0019, 0x0000, 0, VR::UN, VM::M1, "" },
{ 0x0019, 0x0010, 0, VR::UN, VM::M1, "" },
{ 0x0019, 0x0011, 0, VR::UN, VM::M1, "" },
@@ -19919,7 +20802,7 @@ DictEntry Dict325Contents[] = {
{ 0x0029, 0x003f, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict325TagHashTable[] = {
+const unsigned short Dict335TagHashTable[] = {
23, 24, 27, 32, 35, 23, 38, 23, 41, 48,
53, 56, 23, 65, 23, 68, 23, 71, 74, 77,
80, 23, 83, 0, 1, 20, 49, 2, 0, 0,
@@ -19931,7 +20814,7 @@ unsigned short Dict325TagHashTable[] = {
1, 9, 2, 1, 22, 63,
};
-unsigned short Dict325KeyHashTable[] = {
+const unsigned short Dict335KeyHashTable[] = {
23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
23, 23, 24, 0, 23, 0, 233, 1, 233, 2,
@@ -19942,18 +20825,18 @@ unsigned short Dict325KeyHashTable[] = {
233,
};
-vtkDICOMDictionary::Dict Dict325Data = {
+vtkDICOMDictionary::Dict Dict335Data = {
"SPI-P-XSB-VISUB Release 1",
23,
23,
-Dict325TagHashTable,
-Dict325KeyHashTable,
-Dict325Contents
+Dict335TagHashTable,
+Dict335KeyHashTable,
+Dict335Contents
};
// ----- 2.16.840.1.114059.1.1.6.1.50.1 -----
-DictEntry Dict326Contents[] = {
+const DictEntry Dict336Contents[] = {
{ 0x0029, 0x0020, 0, VR::LT, VM::M1, "" },
{ 0x0029, 0x0021, 0, VR::ST, VM::M1, "" },
{ 0x0029, 0x0022, 0, VR::ST, VM::M1, "" },
@@ -19964,31 +20847,31 @@ DictEntry Dict326Contents[] = {
{ 0x0029, 0x0027, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict326TagHashTable[] = {
+const unsigned short Dict336TagHashTable[] = {
9, 12, 15, 18, 21, 24, 27, 30, 0, 1,
1, 33, 1, 0, 32, 1, 3, 35, 1, 2,
34, 1, 5, 37, 1, 4, 36, 1, 7, 39,
1, 6, 38,
};
-unsigned short Dict326KeyHashTable[] = {
+const unsigned short Dict336KeyHashTable[] = {
8, 8, 8, 8, 8, 9, 8, 8, 0, 8,
0, 672, 1, 672, 2, 672, 3, 672, 4, 672,
5, 672, 6, 672, 7, 672,
};
-vtkDICOMDictionary::Dict Dict326Data = {
+vtkDICOMDictionary::Dict Dict336Data = {
"2.16.840.1.114059.1.1.6.1.50.1",
8,
8,
-Dict326TagHashTable,
-Dict326KeyHashTable,
-Dict326Contents
+Dict336TagHashTable,
+Dict336KeyHashTable,
+Dict336Contents
};
// ----- SIEMENS RIS -----
-DictEntry Dict327Contents[] = {
+const DictEntry Dict337Contents[] = {
{ 0x0011, 0x0010, 0, VR::LO, VM::M1, "PatientUID" },
{ 0x0011, 0x0011, 0, VR::LO, VM::M1, "PatientID" },
{ 0x0011, 0x0020, 0, VR::DA, VM::M1, "PatientRegistrationDate" },
@@ -20004,7 +20887,7 @@ DictEntry Dict327Contents[] = {
{ 0x0033, 0x0010, 0, VR::LO, VM::M1, "PatientStudyUID" },
};
-unsigned short Dict327TagHashTable[] = {
+const unsigned short Dict337TagHashTable[] = {
14, 19, 22, 25, 28, 31, 34, 37, 13, 42,
47, 13, 13, 0, 2, 1, 17, 10, 69, 1,
0, 16, 1, 6, 64, 1, 7, 65, 1, 8,
@@ -20012,7 +20895,7 @@ unsigned short Dict327TagHashTable[] = {
9, 16, 2, 3, 33, 12, 16, 1, 2, 32,
};
-unsigned short Dict327KeyHashTable[] = {
+const unsigned short Dict337KeyHashTable[] = {
14, 17, 20, 13, 23, 26, 13, 31, 38, 13,
13, 13, 43, 0, 1, 11, 3643, 1, 2, 61210,
1, 1, 8377, 1, 6, 50806, 2, 7, 47106, 8,
@@ -20020,42 +20903,42 @@ unsigned short Dict327KeyHashTable[] = {
45572, 3, 40556, 2, 4, 46545, 12, 32781,
};
-vtkDICOMDictionary::Dict Dict327Data = {
+vtkDICOMDictionary::Dict Dict337Data = {
"SIEMENS RIS",
13,
13,
-Dict327TagHashTable,
-Dict327KeyHashTable,
-Dict327Contents
+Dict337TagHashTable,
+Dict337KeyHashTable,
+Dict337Contents
};
// ----- GEMS_YMHD_01 -----
-DictEntry Dict328Contents[] = {
+const DictEntry Dict338Contents[] = {
{ 0x0033, 0x0005, 0, VR::UN, VM::M1, "" },
{ 0x0033, 0x0006, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict328TagHashTable[] = {
+const unsigned short Dict338TagHashTable[] = {
3, 6, 0, 1, 0, 5, 1, 1, 6,
};
-unsigned short Dict328KeyHashTable[] = {
+const unsigned short Dict338KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict328Data = {
+vtkDICOMDictionary::Dict Dict338Data = {
"GEMS_YMHD_01",
2,
2,
-Dict328TagHashTable,
-Dict328KeyHashTable,
-Dict328Contents
+Dict338TagHashTable,
+Dict338KeyHashTable,
+Dict338Contents
};
// ----- SPI-P-CTBE Release 1 -----
-DictEntry Dict329Contents[] = {
+const DictEntry Dict339Contents[] = {
{ 0x0019, 0x0000, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
@@ -20072,7 +20955,7 @@ DictEntry Dict329Contents[] = {
{ 0x0019, 0x001d, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict329TagHashTable[] = {
+const unsigned short Dict339TagHashTable[] = {
15, 20, 25, 28, 31, 36, 14, 39, 14, 14,
14, 42, 45, 48, 0, 2, 4, 5, 9, 25,
2, 3, 4, 8, 24, 1, 11, 27, 1, 10,
@@ -20081,7 +20964,7 @@ unsigned short Dict329TagHashTable[] = {
2, 7, 20,
};
-unsigned short Dict329KeyHashTable[] = {
+const unsigned short Dict339KeyHashTable[] = {
14, 14, 14, 14, 14, 15, 14, 14, 14, 14,
14, 14, 14, 14, 0, 14, 0, 384, 1, 384,
2, 384, 3, 384, 4, 384, 5, 384, 6, 384,
@@ -20089,105 +20972,96 @@ unsigned short Dict329KeyHashTable[] = {
12, 384, 13, 384,
};
-vtkDICOMDictionary::Dict Dict329Data = {
+vtkDICOMDictionary::Dict Dict339Data = {
"SPI-P-CTBE Release 1",
14,
14,
-Dict329TagHashTable,
-Dict329KeyHashTable,
-Dict329Contents
+Dict339TagHashTable,
+Dict339KeyHashTable,
+Dict339Contents
};
// ----- ISG shadow -----
-DictEntry Dict330Contents[] = {
+const DictEntry Dict340Contents[] = {
{ 0x0029, 0x0070, 0, VR::IS, VM::M1, "" },
{ 0x0029, 0x0080, 0, VR::IS, VM::M1, "" },
{ 0x0029, 0x0090, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict330TagHashTable[] = {
+const unsigned short Dict340TagHashTable[] = {
4, 7, 3, 0, 1, 1, 128, 2, 0, 112,
2, 144,
};
-unsigned short Dict330KeyHashTable[] = {
+const unsigned short Dict340KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2,
1793,
};
-vtkDICOMDictionary::Dict Dict330Data = {
+vtkDICOMDictionary::Dict Dict340Data = {
"ISG shadow",
3,
3,
-Dict330TagHashTable,
-Dict330KeyHashTable,
-Dict330Contents
+Dict340TagHashTable,
+Dict340KeyHashTable,
+Dict340Contents
};
// ----- METAEMOTION GINKGO RETINAL -----
-DictEntry Dict331Contents[] = {
+const DictEntry Dict341Contents[] = {
{ 0x0011, 0x0001, 0, VR::LT, VM::M1, "KeyFileIndicator" },
{ 0x0011, 0x000B, 0, VR::LT, VM::M1, "SerializedDiagnoseAndMarkers" },
{ 0x0011, 0x000C, 0, VR::UN, VM::M1, "VirtualAneritraContrastImage" },
};
-unsigned short Dict331TagHashTable[] = {
+const unsigned short Dict341TagHashTable[] = {
3, 4, 7, 0, 1, 0, 1, 2, 1, 11,
2, 12,
};
-unsigned short Dict331KeyHashTable[] = {
+const unsigned short Dict341KeyHashTable[] = {
4, 9, 3, 0, 2, 0, 32761, 2, 48753, 1,
1, 8406,
};
-vtkDICOMDictionary::Dict Dict331Data = {
+vtkDICOMDictionary::Dict Dict341Data = {
"METAEMOTION GINKGO RETINAL",
3,
3,
-Dict331TagHashTable,
-Dict331KeyHashTable,
-Dict331Contents
+Dict341TagHashTable,
+Dict341KeyHashTable,
+Dict341Contents
};
-// ----- Riverain Medical -----
+// ----- SIEMENS SYNGO REGISTRATION -----
-DictEntry Dict332Contents[] = {
-{ 0x0203, 0x0000, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0001, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0002, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0003, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0010, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x00f0, 0, VR::UI, VM::M1, "" },
-{ 0x0203, 0x00f1, 0, VR::UI, VM::M1, "" },
+const DictEntry Dict342Contents[] = {
+{ 0x0071, 0x0020, 0, VR::SQ, VM::M1, "RegisteredImageSequence" },
+{ 0x0071, 0x0021, 0, VR::CS, VM::M1, "RegistrationIsValidatedFlag" },
};
-unsigned short Dict332TagHashTable[] = {
- 8, 7, 11, 14, 17, 22, 7, 0, 1, 4,
- 16, 1, 3, 3, 1, 2, 2, 2, 1, 1,
- 5, 240, 2, 0, 0, 6, 241,
+const unsigned short Dict342TagHashTable[] = {
+ 3, 6, 0, 1, 0, 32, 1, 1, 33,
};
-unsigned short Dict332KeyHashTable[] = {
- 7, 7, 7, 7, 7, 8, 7, 0, 7, 0,
- 768, 1, 768, 2, 768, 3, 768, 4, 768, 5,
- 768, 6, 768,
+const unsigned short Dict342KeyHashTable[] = {
+ 3, 6, 0, 1, 1, 65362, 1, 0, 53639,
};
-vtkDICOMDictionary::Dict Dict332Data = {
-"Riverain Medical",
-7,
-7,
-Dict332TagHashTable,
-Dict332KeyHashTable,
-Dict332Contents
+vtkDICOMDictionary::Dict Dict342Data = {
+"SIEMENS SYNGO REGISTRATION",
+2,
+2,
+Dict342TagHashTable,
+Dict342KeyHashTable,
+Dict342Contents
};
// ----- HOLOGIC -----
-DictEntry Dict333Contents[] = {
+const DictEntry Dict343Contents[] = {
{ 0x0011, 0x0000, 0, VR::OB, VM::M1, "HxQuestionnaire" },
{ 0x0013, 0x0000, 0, VR::LO, VM::M1, "IVAResultsFlag" },
{ 0x0019, 0x0000, 0, VR::UT, VM::M1, "ReportData" },
@@ -20202,7 +21076,7 @@ DictEntry Dict333Contents[] = {
{ 0x0029, 0x0001, 0, VR::UL, VM::M1, "GraphBitmapSize" },
};
-unsigned short Dict333TagHashTable[] = {
+const unsigned short Dict343TagHashTable[] = {
12, 13, 16, 19, 22, 25, 12, 30, 33, 38,
41, 44, 0, 1, 2, 0, 1, 9, 5, 1,
8, 4, 1, 11, 1, 2, 0, 0, 10, 0,
@@ -20210,7 +21084,7 @@ unsigned short Dict333TagHashTable[] = {
2, 1, 5, 1, 1, 4, 0,
};
-unsigned short Dict333KeyHashTable[] = {
+const unsigned short Dict343KeyHashTable[] = {
12, 13, 12, 18, 21, 12, 24, 27, 12, 30,
33, 38, 0, 2, 8, 19844, 9, 18946, 1, 4,
54723, 1, 0, 12614, 1, 5, 1260, 1, 2, 46831,
@@ -20218,18 +21092,18 @@ unsigned short Dict333KeyHashTable[] = {
36867, 7, 33057, 11, 10475,
};
-vtkDICOMDictionary::Dict Dict333Data = {
+vtkDICOMDictionary::Dict Dict343Data = {
"HOLOGIC",
12,
12,
-Dict333TagHashTable,
-Dict333KeyHashTable,
-Dict333Contents
+Dict343TagHashTable,
+Dict343KeyHashTable,
+Dict343Contents
};
// ----- GEMS_ACRQA_2.0 BLOCK1 -----
-DictEntry Dict334Contents[] = {
+const DictEntry Dict344Contents[] = {
{ 0x0023, 0x0000, 0, VR::LO, VM::M1, "CRExposureMenuCode" },
{ 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRExposureMenuString" },
{ 0x0023, 0x0020, 0, VR::LO, VM::M1, "CREDRMode" },
@@ -20242,32 +21116,32 @@ DictEntry Dict334Contents[] = {
{ 0x0023, 0x0090, 0, VR::LO, VM::M1, "CRSShiftString" },
};
-unsigned short Dict334TagHashTable[] = {
+const unsigned short Dict344TagHashTable[] = {
10, 11, 16, 19, 22, 25, 28, 31, 34, 37,
0, 2, 1, 16, 8, 128, 1, 7, 112, 1,
2, 32, 1, 5, 80, 1, 0, 0, 1, 6,
96, 1, 9, 144, 1, 4, 64, 1, 3, 48,
};
-unsigned short Dict334KeyHashTable[] = {
+const unsigned short Dict344KeyHashTable[] = {
11, 14, 17, 22, 27, 10, 30, 35, 10, 10,
0, 1, 2, 48761, 1, 1, 46224, 2, 3, 41522,
5, 31050, 2, 6, 39736, 8, 39860, 1, 4, 55886,
2, 7, 30788, 9, 22214, 1, 0, 6115,
};
-vtkDICOMDictionary::Dict Dict334Data = {
+vtkDICOMDictionary::Dict Dict344Data = {
"GEMS_ACRQA_2.0 BLOCK1",
10,
10,
-Dict334TagHashTable,
-Dict334KeyHashTable,
-Dict334Contents
+Dict344TagHashTable,
+Dict344KeyHashTable,
+Dict344Contents
};
// ----- GEMS_ACRQA_2.0 BLOCK2 -----
-DictEntry Dict335Contents[] = {
+const DictEntry Dict345Contents[] = {
{ 0x0023, 0x0000, 0, VR::US, VM::M1, "CRSShift" },
{ 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRCShift" },
{ 0x0023, 0x0020, 0, VR::LO, VM::M1, "CRGT" },
@@ -20280,32 +21154,32 @@ DictEntry Dict335Contents[] = {
{ 0x0023, 0x0090, 0, VR::DS, VM::M1, "CRDRT" },
};
-unsigned short Dict335TagHashTable[] = {
+const unsigned short Dict345TagHashTable[] = {
10, 11, 16, 19, 22, 25, 28, 31, 34, 37,
0, 2, 1, 16, 8, 128, 1, 7, 112, 1,
2, 32, 1, 5, 80, 1, 0, 0, 1, 6,
96, 1, 9, 144, 1, 4, 64, 1, 3, 48,
};
-unsigned short Dict335KeyHashTable[] = {
+const unsigned short Dict345KeyHashTable[] = {
11, 10, 14, 10, 10, 21, 24, 27, 32, 35,
0, 1, 3, 34077, 3, 4, 34077, 6, 34115, 9,
36381, 1, 0, 28887, 1, 8, 34114, 2, 1, 64674,
7, 34113, 1, 5, 34078, 1, 2, 34078,
};
-vtkDICOMDictionary::Dict Dict335Data = {
+vtkDICOMDictionary::Dict Dict345Data = {
"GEMS_ACRQA_2.0 BLOCK2",
10,
10,
-Dict335TagHashTable,
-Dict335KeyHashTable,
-Dict335Contents
+Dict345TagHashTable,
+Dict345KeyHashTable,
+Dict345Contents
};
// ----- GEMS_ACRQA_2.0 BLOCK3 -----
-DictEntry Dict336Contents[] = {
+const DictEntry Dict346Contents[] = {
{ 0x0023, 0x0000, 0, VR::DS, VM::M1, "CRDRE" },
{ 0x0023, 0x0010, 0, VR::US, VM::M1, "CRDRN" },
{ 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRORE" },
@@ -20320,7 +21194,7 @@ DictEntry Dict336Contents[] = {
{ 0x0023, 0x00ff, 0, VR::US, VM::M1, "CRShuttersApplied" },
};
-unsigned short Dict336TagHashTable[] = {
+const unsigned short Dict346TagHashTable[] = {
12, 12, 13, 16, 21, 24, 27, 32, 12, 37,
40, 43, 0, 1, 4, 64, 2, 1, 16, 2,
32, 1, 10, 240, 1, 8, 128, 2, 5, 80,
@@ -20328,7 +21202,7 @@ unsigned short Dict336TagHashTable[] = {
1, 7, 112, 1, 0, 0,
};
-unsigned short Dict336KeyHashTable[] = {
+const unsigned short Dict346KeyHashTable[] = {
12, 13, 18, 21, 12, 24, 29, 32, 37, 42,
12, 12, 0, 2, 5, 508, 7, 36020, 1, 1,
30317, 1, 11, 14138, 2, 0, 30316, 3, 31315, 1,
@@ -20336,18 +21210,18 @@ unsigned short Dict336KeyHashTable[] = {
6, 40639, 1, 10, 61249,
};
-vtkDICOMDictionary::Dict Dict336Data = {
+vtkDICOMDictionary::Dict Dict346Data = {
"GEMS_ACRQA_2.0 BLOCK3",
12,
12,
-Dict336TagHashTable,
-Dict336KeyHashTable,
-Dict336Contents
+Dict346TagHashTable,
+Dict346KeyHashTable,
+Dict346Contents
};
// ----- GEMS_3DSTATE_001 -----
-DictEntry Dict337Contents[] = {
+const DictEntry Dict347Contents[] = {
{ 0x0047, 0x00e9, 0, VR::FL, VM::M3, "" },
{ 0x0047, 0x00ea, 0, VR::DS, VM::M3, "" },
{ 0x0047, 0x00eb, 0, VR::DS, VM::M3, "" },
@@ -20355,75 +21229,75 @@ DictEntry Dict337Contents[] = {
{ 0x0047, 0x00ed, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict337TagHashTable[] = {
+const unsigned short Dict347TagHashTable[] = {
6, 5, 9, 12, 15, 0, 1, 1, 234, 1,
0, 233, 1, 4, 237, 2, 2, 235, 3, 236,
};
-unsigned short Dict337KeyHashTable[] = {
+const unsigned short Dict347KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict337Data = {
+vtkDICOMDictionary::Dict Dict347Data = {
"GEMS_3DSTATE_001",
5,
5,
-Dict337TagHashTable,
-Dict337KeyHashTable,
-Dict337Contents
+Dict347TagHashTable,
+Dict347KeyHashTable,
+Dict347Contents
};
// ----- RamSoft File Kind Identifier -----
-DictEntry Dict338Contents[] = {
+const DictEntry Dict348Contents[] = {
{ 0x3111, 0x0010, 0, VR::CS, VM::M1, "BinaryDocumentKind" },
};
-unsigned short Dict338TagHashTable[] = {
+const unsigned short Dict348TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict338KeyHashTable[] = {
+const unsigned short Dict348KeyHashTable[] = {
2, 0, 1, 0, 6927,
};
-vtkDICOMDictionary::Dict Dict338Data = {
+vtkDICOMDictionary::Dict Dict348Data = {
"RamSoft File Kind Identifier",
1,
1,
-Dict338TagHashTable,
-Dict338KeyHashTable,
-Dict338Contents
+Dict348TagHashTable,
+Dict348KeyHashTable,
+Dict348Contents
};
// ----- SEGAMI__PAGE -----
-DictEntry Dict339Contents[] = {
+const DictEntry Dict349Contents[] = {
{ 0x0033, 0x0097, 0, VR::IS, VM::M1, "" },
{ 0x0033, 0x0098, 0, VR::OW, VM::M1, "" },
};
-unsigned short Dict339TagHashTable[] = {
+const unsigned short Dict349TagHashTable[] = {
3, 6, 0, 1, 0, 151, 1, 1, 152,
};
-unsigned short Dict339KeyHashTable[] = {
+const unsigned short Dict349KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict339Data = {
+vtkDICOMDictionary::Dict Dict349Data = {
"SEGAMI__PAGE",
2,
2,
-Dict339TagHashTable,
-Dict339KeyHashTable,
-Dict339Contents
+Dict349TagHashTable,
+Dict349KeyHashTable,
+Dict349Contents
};
// ----- SECTRA_Ident_01 -----
-DictEntry Dict340Contents[] = {
+const DictEntry Dict350Contents[] = {
{ 0x0009, 0x0001, 0, VR::SH, VM::M1, "RequestNumber" },
{ 0x0009, 0x0002, 0, VR::SH, VM::M1, "ExaminationNumber" },
{ 0x0009, 0x0004, 0, VR::LO, VM::M1, "SeriesIdentifier" },
@@ -20432,30 +21306,30 @@ DictEntry Dict340Contents[] = {
{ 0x0009, 0x0007, 0, VR::LO, VM::M1, "ImageDataID" },
};
-unsigned short Dict340TagHashTable[] = {
+const unsigned short Dict350TagHashTable[] = {
7, 10, 13, 18, 6, 21, 0, 1, 3, 5,
1, 2, 4, 2, 0, 1, 5, 7, 1, 4,
6, 1, 1, 2,
};
-unsigned short Dict340KeyHashTable[] = {
+const unsigned short Dict350KeyHashTable[] = {
7, 10, 6, 6, 15, 18, 0, 1, 3, 59522,
2, 0, 3545, 1, 48247, 1, 4, 40027, 2, 2,
18701, 5, 359,
};
-vtkDICOMDictionary::Dict Dict340Data = {
+vtkDICOMDictionary::Dict Dict350Data = {
"SECTRA_Ident_01",
6,
6,
-Dict340TagHashTable,
-Dict340KeyHashTable,
-Dict340Contents
+Dict350TagHashTable,
+Dict350KeyHashTable,
+Dict350Contents
};
// ----- STENTOR -----
-DictEntry Dict341Contents[] = {
+const DictEntry Dict351Contents[] = {
{ 0x0073, 0x0001, 0, VR::ST, VM::M1, "" },
{ 0x0073, 0x0002, 0, VR::ST, VM::M1, "" },
{ 0x0073, 0x0003, 0, VR::ST, VM::M1, "" },
@@ -20463,127 +21337,127 @@ DictEntry Dict341Contents[] = {
{ 0x0073, 0x0006, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict341TagHashTable[] = {
+const unsigned short Dict351TagHashTable[] = {
6, 9, 12, 15, 5, 0, 1, 0, 1, 1,
4, 6, 1, 1, 2, 2, 2, 3, 3, 4,
};
-unsigned short Dict341KeyHashTable[] = {
+const unsigned short Dict351KeyHashTable[] = {
5, 6, 5, 5, 5, 0, 5, 0, 1076, 1,
1076, 2, 1076, 3, 1076, 4, 1076,
};
-vtkDICOMDictionary::Dict Dict341Data = {
+vtkDICOMDictionary::Dict Dict351Data = {
"STENTOR",
5,
5,
-Dict341TagHashTable,
-Dict341KeyHashTable,
-Dict341Contents
+Dict351TagHashTable,
+Dict351KeyHashTable,
+Dict351Contents
};
// ----- ObjectModel (ID, Version, Place, PlaceDescription) -----
-DictEntry Dict342Contents[] = {
+const DictEntry Dict352Contents[] = {
{ 0x8101, 0x0000, 0, VR::LO, VM::M1, "ID" },
{ 0x8101, 0x0010, 0, VR::LO, VM::M1, "Version" },
};
-unsigned short Dict342TagHashTable[] = {
+const unsigned short Dict352TagHashTable[] = {
2, 3, 0, 2, 0, 0, 1, 16,
};
-unsigned short Dict342KeyHashTable[] = {
+const unsigned short Dict352KeyHashTable[] = {
3, 6, 0, 1, 0, 47609, 1, 1, 27157,
};
-vtkDICOMDictionary::Dict Dict342Data = {
+vtkDICOMDictionary::Dict Dict352Data = {
"ObjectModel (ID, Version, Place, PlaceDescription)",
2,
2,
-Dict342TagHashTable,
-Dict342KeyHashTable,
-Dict342Contents
+Dict352TagHashTable,
+Dict352KeyHashTable,
+Dict352Contents
};
// ----- SIEMENS CSA REPORT -----
-DictEntry Dict343Contents[] = {
+const DictEntry Dict353Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "ReportType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "ReportVersion" },
{ 0x0029, 0x0015, 0, VR::US, VM::M1, "SRVariant" },
{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOPInstanceUID" },
};
-unsigned short Dict343TagHashTable[] = {
+const unsigned short Dict353TagHashTable[] = {
5, 10, 13, 4, 0, 2, 1, 9, 2, 21,
1, 0, 8, 1, 3, 23,
};
-unsigned short Dict343KeyHashTable[] = {
+const unsigned short Dict353KeyHashTable[] = {
5, 4, 4, 8, 0, 1, 3, 38633, 3, 0,
28600, 1, 7209, 2, 38167,
};
-vtkDICOMDictionary::Dict Dict343Data = {
+vtkDICOMDictionary::Dict Dict353Data = {
"SIEMENS CSA REPORT",
4,
4,
-Dict343TagHashTable,
-Dict343KeyHashTable,
-Dict343Contents
+Dict353TagHashTable,
+Dict353KeyHashTable,
+Dict353Contents
};
// ----- astm.org/diconde/iod/ComponentSeries -----
-DictEntry Dict344Contents[] = {
+const DictEntry Dict354Contents[] = {
{ 0x0009, 0x0010, 0, VR::ST, VM::M1, "ActualEnvironmentalConditions" },
{ 0x0009, 0x0040, 0, VR::ST, VM::M1, "EnvironmentalConditions" },
};
-unsigned short Dict344TagHashTable[] = {
+const unsigned short Dict354TagHashTable[] = {
3, 6, 0, 1, 1, 64, 1, 0, 16,
};
-unsigned short Dict344KeyHashTable[] = {
+const unsigned short Dict354KeyHashTable[] = {
2, 3, 0, 2, 0, 4141, 1, 11328,
};
-vtkDICOMDictionary::Dict Dict344Data = {
+vtkDICOMDictionary::Dict Dict354Data = {
"astm.org/diconde/iod/ComponentSeries",
2,
2,
-Dict344TagHashTable,
-Dict344KeyHashTable,
-Dict344Contents
+Dict354TagHashTable,
+Dict354KeyHashTable,
+Dict354Contents
};
// ----- GEMS_0039 -----
-DictEntry Dict345Contents[] = {
+const DictEntry Dict355Contents[] = {
{ 0x0039, 0x0095, 0, VR::LO, VM::M1, "SRApplicationName" },
};
-unsigned short Dict345TagHashTable[] = {
+const unsigned short Dict355TagHashTable[] = {
2, 0, 1, 0, 149,
};
-unsigned short Dict345KeyHashTable[] = {
+const unsigned short Dict355KeyHashTable[] = {
2, 0, 1, 0, 43423,
};
-vtkDICOMDictionary::Dict Dict345Data = {
+vtkDICOMDictionary::Dict Dict355Data = {
"GEMS_0039",
1,
1,
-Dict345TagHashTable,
-Dict345KeyHashTable,
-Dict345Contents
+Dict355TagHashTable,
+Dict355KeyHashTable,
+Dict355Contents
};
// ----- PHILIPS MR IMAGING DD 001 -----
-DictEntry Dict346Contents[] = {
+const DictEntry Dict356Contents[] = {
{ 0x2005, 0x0000, 0, VR::FL, VM::M1, "ImageAngulationAP" },
{ 0x2005, 0x0001, 0, VR::FL, VM::M1, "ImageAngulationFH" },
{ 0x2005, 0x0002, 0, VR::FL, VM::M1, "ImageAngulationRL" },
@@ -20701,7 +21575,7 @@ DictEntry Dict346Contents[] = {
{ 0x2005, 0x0084, 0, VR::SQ, VM::M1, "SeriesReference" },
{ 0x2005, 0x0085, 0, VR::SQ, VM::M1, "SeriesVolume" },
{ 0x2005, 0x0086, 0, VR::SS, VM::M1, "NumberOfGeometry" },
-{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "Geometry" },
+{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "SeriesGeometry" },
{ 0x2005, 0x009f, 0, VR::CS, VM::M1, "SpectralSelectiveExcitationPulse" },
{ 0x2005, 0x00a0, 0, VR::FL, VM::M1, "DynamicScanBeginTime" },
{ 0x2005, 0x00a1, 0, VR::CS, VM::M1, "SyncraScanType" },
@@ -20712,14 +21586,14 @@ DictEntry Dict346Contents[] = {
{ 0x2005, 0x00a6, 0, VR::IS, VM::M1, "StackChannelCombi" },
{ 0x2005, 0x00a7, 0, VR::CS, VM::M1, "StackCoilConnection" },
{ 0x2005, 0x00a8, 0, VR::DS, VM::M1, "InversionTime" },
-{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "SeriesGeometryCorrection" },
+{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "GeometryCorrection" },
{ 0x2005, 0x00b0, 0, VR::FL, VM::M1, "DiffusionDirectionRL" },
{ 0x2005, 0x00b1, 0, VR::FL, VM::M1, "DiffusionDirectionAP" },
{ 0x2005, 0x00b2, 0, VR::FL, VM::M1, "DiffusionDirectionFH" },
-{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "SeriesScanSequence" },
+{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "ScanSequence" },
};
-unsigned short Dict346TagHashTable[] = {
+const unsigned short Dict356TagHashTable[] = {
134, 139, 144, 147, 150, 133, 133, 133, 133, 133,
133, 133, 133, 153, 156, 159, 162, 167, 170, 173,
176, 179, 182, 185, 188, 191, 194, 197, 200, 203,
@@ -20774,70 +21648,70 @@ unsigned short Dict346TagHashTable[] = {
131, 178,
};
-unsigned short Dict346KeyHashTable[] = {
- 134, 137, 133, 140, 143, 133, 133, 150, 153, 133,
- 156, 159, 164, 175, 133, 178, 181, 133, 186, 189,
- 192, 133, 195, 133, 198, 133, 133, 201, 208, 211,
- 214, 217, 220, 227, 230, 235, 240, 133, 243, 133,
- 133, 246, 249, 252, 257, 260, 133, 267, 270, 133,
- 275, 278, 283, 288, 133, 133, 291, 296, 305, 133,
- 133, 312, 133, 133, 133, 133, 315, 318, 133, 133,
- 323, 328, 331, 334, 133, 133, 339, 342, 345, 133,
- 350, 353, 358, 361, 364, 133, 133, 369, 133, 133,
- 133, 378, 387, 133, 133, 390, 395, 398, 133, 401,
- 408, 133, 413, 416, 419, 424, 133, 427, 432, 435,
- 133, 442, 445, 133, 448, 451, 454, 133, 133, 133,
- 133, 457, 460, 133, 133, 133, 463, 466, 471, 476,
- 133, 479, 133, 0, 1, 96, 39936, 1, 66, 39939,
- 1, 88, 59884, 3, 45, 58451, 75, 2929, 117, 64905,
- 1, 33, 31035, 1, 43, 57708, 1, 120, 63754, 2,
- 5, 40642, 40, 19746, 5, 7, 13694, 11, 10356, 42,
-19619, 83, 55986, 93, 56767, 1, 94, 56770, 1, 82,
- 1286, 2, 32, 9256, 49, 54045, 1, 109, 59619, 1,
- 91, 33319, 1, 58, 40105, 1, 26, 64726, 1, 9,
-20603, 3, 3, 20547, 99, 23421, 122, 47556, 1, 76,
- 2930, 1, 77, 2933, 1, 90, 52995, 1, 4, 12607,
- 3, 67, 48932, 72, 33440, 112, 6063, 1, 37, 12774,
- 2, 63, 43046, 126, 44880, 2, 6, 40643, 47, 64125,
- 1, 97, 39823, 1, 27, 58571, 1, 70, 63488, 1,
- 123, 54544, 2, 124, 54544, 127, 10766, 1, 39, 46760,
- 3, 21, 7188, 31, 54104, 62, 28498, 1, 111, 317,
- 2, 86, 47189, 103, 37819, 1, 60, 35960, 2, 30,
-20670, 114, 31708, 2, 17, 33176, 119, 59971, 1, 0,
-26174, 2, 68, 48933, 73, 33441, 4, 69, 48936, 74,
-33444, 78, 1533, 110, 49817, 3, 8, 18523, 29, 58137,
- 81, 36609, 1, 19, 60048, 1, 38, 31972, 2, 23,
-59381, 106, 5377, 2, 52, 63139, 56, 4141, 1, 59,
-42688, 1, 104, 37820, 2, 36, 21419, 105, 37823, 1,
- 115, 38092, 1, 1, 26175, 2, 2, 26178, 14, 60396,
- 1, 130, 15542, 2, 48, 62491, 79, 1534, 1, 80,
- 1537, 1, 10, 14600, 2, 15, 13834, 85, 26279, 4,
- 35, 49395, 41, 2784, 53, 6757, 57, 2257, 4, 22,
-27407, 107, 5378, 121, 55532, 128, 12773, 1, 108, 5381,
- 2, 34, 39158, 87, 8835, 1, 116, 36547, 1, 20,
-46856, 3, 44, 56196, 84, 33049, 125, 7391, 2, 28,
- 1338, 61, 51581, 1, 118, 63738, 1, 98, 27477, 2,
- 100, 44990, 131, 15543, 1, 129, 15546, 2, 12, 4183,
- 71, 54844, 1, 25, 60494, 3, 16, 3168, 55, 55530,
- 95, 39934, 1, 18, 34655, 1, 46, 9826, 1, 13,
-54927, 1, 64, 19418, 1, 24, 10054, 1, 92, 56765,
- 1, 89, 20628, 1, 132, 10224, 2, 51, 3354, 113,
- 4247, 2, 65, 26169, 101, 44991, 1, 102, 44994, 2,
- 50, 36577, 54, 60481,
+const unsigned short Dict356KeyHashTable[] = {
+ 134, 137, 133, 140, 143, 133, 133, 148, 151, 133,
+ 154, 157, 162, 173, 133, 176, 179, 133, 184, 187,
+ 190, 133, 193, 133, 196, 133, 133, 199, 206, 209,
+ 212, 215, 218, 225, 228, 233, 238, 133, 241, 133,
+ 133, 244, 247, 250, 255, 258, 133, 265, 268, 133,
+ 273, 276, 281, 286, 133, 133, 289, 294, 303, 133,
+ 133, 310, 133, 133, 133, 133, 313, 316, 321, 133,
+ 324, 329, 332, 335, 133, 133, 340, 343, 346, 133,
+ 351, 354, 359, 362, 365, 133, 133, 370, 133, 133,
+ 133, 379, 386, 133, 133, 389, 394, 397, 133, 400,
+ 407, 133, 412, 415, 418, 423, 133, 426, 431, 434,
+ 133, 441, 444, 133, 447, 450, 455, 133, 133, 133,
+ 133, 458, 461, 133, 133, 464, 133, 467, 472, 477,
+ 133, 480, 133, 0, 1, 96, 39936, 1, 66, 39939,
+ 1, 88, 59884, 2, 45, 58451, 75, 2929, 1, 33,
+31035, 1, 43, 57708, 1, 120, 63754, 2, 5, 40642,
+ 40, 19746, 5, 7, 13694, 11, 10356, 42, 19619, 83,
+55986, 93, 56767, 1, 94, 56770, 1, 82, 1286, 2,
+ 32, 9256, 49, 54045, 1, 109, 59619, 1, 91, 33319,
+ 1, 58, 40105, 1, 26, 64726, 1, 9, 20603, 3,
+ 3, 20547, 99, 23421, 122, 47556, 1, 76, 2930, 1,
+ 77, 2933, 1, 90, 52995, 1, 4, 12607, 3, 67,
+48932, 72, 33440, 112, 6063, 1, 37, 12774, 2, 63,
+43046, 126, 44880, 2, 6, 40643, 47, 64125, 1, 97,
+39823, 1, 27, 58571, 1, 70, 63488, 1, 123, 54544,
+ 2, 124, 54544, 127, 10766, 1, 39, 46760, 3, 21,
+ 7188, 31, 54104, 62, 28498, 1, 111, 317, 2, 86,
+47189, 103, 37819, 1, 60, 35960, 2, 30, 20670, 114,
+31708, 2, 17, 33176, 119, 59971, 1, 0, 26174, 2,
+ 68, 48933, 73, 33441, 4, 69, 48936, 74, 33444, 78,
+ 1533, 110, 49817, 3, 8, 18523, 29, 58137, 81, 36609,
+ 1, 19, 60048, 1, 38, 31972, 2, 23, 59381, 106,
+ 5377, 1, 132, 14323, 2, 52, 63139, 56, 4141, 1,
+ 59, 42688, 1, 104, 37820, 2, 36, 21419, 105, 37823,
+ 1, 115, 38092, 1, 1, 26175, 2, 2, 26178, 14,
+60396, 1, 130, 15542, 2, 48, 62491, 79, 1534, 1,
+ 80, 1537, 1, 10, 14600, 2, 15, 13834, 85, 26279,
+ 4, 35, 49395, 41, 2784, 53, 6757, 57, 2257, 3,
+ 22, 27407, 107, 5378, 121, 55532, 1, 108, 5381, 2,
+ 34, 39158, 87, 8835, 1, 116, 36547, 1, 20, 46856,
+ 3, 44, 56196, 84, 33049, 125, 7391, 2, 28, 1338,
+ 61, 51581, 1, 118, 63738, 1, 98, 27477, 2, 100,
+44990, 131, 15543, 1, 129, 15546, 2, 12, 4183, 71,
+54844, 1, 25, 60494, 3, 16, 3168, 55, 55530, 95,
+39934, 1, 18, 34655, 1, 46, 9826, 1, 13, 54927,
+ 2, 64, 19418, 117, 9749, 1, 24, 10054, 1, 92,
+56765, 1, 89, 20628, 1, 128, 61180, 2, 51, 3354,
+ 113, 4247, 2, 65, 26169, 101, 44991, 1, 102, 44994,
+ 2, 50, 36577, 54, 60481,
};
-vtkDICOMDictionary::Dict Dict346Data = {
+vtkDICOMDictionary::Dict Dict356Data = {
"PHILIPS MR IMAGING DD 001",
133,
133,
-Dict346TagHashTable,
-Dict346KeyHashTable,
-Dict346Contents
+Dict356TagHashTable,
+Dict356KeyHashTable,
+Dict356Contents
};
// ----- GE_GENESIS_REV3.0 -----
-DictEntry Dict347Contents[] = {
+const DictEntry Dict357Contents[] = {
{ 0x0019, 0x0039, 0, VR::SS, VM::M1, "AxialType" },
{ 0x0019, 0x008f, 0, VR::SS, VM::M1, "SwapPhaseFrequency" },
{ 0x0019, 0x009c, 0, VR::SS, VM::M1, "PulseSequenceName" },
@@ -20855,7 +21729,7 @@ DictEntry Dict347Contents[] = {
{ 0x0043, 0x0027, 0, VR::SH, VM::M1, "ScanPitchRatio" },
};
-unsigned short Dict347TagHashTable[] = {
+const unsigned short Dict357TagHashTable[] = {
16, 15, 21, 15, 26, 15, 15, 29, 32, 35,
15, 38, 43, 48, 51, 0, 2, 2, 156, 11,
217, 2, 0, 57, 13, 30, 1, 8, 204, 1,
@@ -20864,7 +21738,7 @@ unsigned short Dict347TagHashTable[] = {
143, 2, 7, 203, 10, 216,
};
-unsigned short Dict347KeyHashTable[] = {
+const unsigned short Dict357KeyHashTable[] = {
16, 21, 24, 29, 34, 39, 15, 42, 15, 15,
15, 15, 45, 52, 15, 0, 2, 8, 37446, 13,
7540, 1, 5, 39961, 2, 3, 45780, 10, 5150, 2,
@@ -20873,18 +21747,18 @@ unsigned short Dict347KeyHashTable[] = {
14, 42747, 1, 12, 18822,
};
-vtkDICOMDictionary::Dict Dict347Data = {
+vtkDICOMDictionary::Dict Dict357Data = {
"GE_GENESIS_REV3.0",
15,
15,
-Dict347TagHashTable,
-Dict347KeyHashTable,
-Dict347Contents
+Dict357TagHashTable,
+Dict357KeyHashTable,
+Dict357Contents
};
// ----- SIEMENS MR VA0 COAD -----
-DictEntry Dict348Contents[] = {
+const DictEntry Dict358Contents[] = {
{ 0x0019, 0x0012, 0, VR::DS, VM::M1, "MagneticFieldStrength" },
{ 0x0019, 0x0014, 0, VR::DS, VM::M1, "ADCVoltage" },
{ 0x0019, 0x0016, 0, VR::DS, VM::M2, "ADCOffset" },
@@ -20932,7 +21806,7 @@ DictEntry Dict348Contents[] = {
{ 0x0019, 0x00da, 0, VR::CS, VM::M1, "PhaseCodingDirection" },
};
-unsigned short Dict348TagHashTable[] = {
+const unsigned short Dict358TagHashTable[] = {
45, 45, 46, 49, 52, 55, 58, 61, 45, 64,
67, 70, 75, 80, 83, 90, 97, 45, 102, 45,
107, 112, 45, 115, 118, 121, 124, 127, 132, 135,
@@ -20952,7 +21826,7 @@ unsigned short Dict348TagHashTable[] = {
1, 30, 193, 1, 33, 196, 1, 34, 197,
};
-unsigned short Dict348KeyHashTable[] = {
+const unsigned short Dict358KeyHashTable[] = {
45, 46, 45, 45, 45, 51, 45, 64, 45, 67,
70, 77, 82, 85, 88, 45, 95, 45, 45, 45,
98, 103, 45, 45, 45, 45, 45, 106, 45, 109,
@@ -20971,41 +21845,41 @@ unsigned short Dict348KeyHashTable[] = {
59617, 1, 31, 61907, 1, 37, 53889, 1, 6, 39638,
};
-vtkDICOMDictionary::Dict Dict348Data = {
+vtkDICOMDictionary::Dict Dict358Data = {
"SIEMENS MR VA0 COAD",
45,
45,
-Dict348TagHashTable,
-Dict348KeyHashTable,
-Dict348Contents
+Dict358TagHashTable,
+Dict358KeyHashTable,
+Dict358Contents
};
// ----- GEMS_PATI_01 -----
-DictEntry Dict349Contents[] = {
+const DictEntry Dict359Contents[] = {
{ 0x0011, 0x0010, 0, VR::SS, VM::M1, "PatientStatus" },
};
-unsigned short Dict349TagHashTable[] = {
+const unsigned short Dict359TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict349KeyHashTable[] = {
+const unsigned short Dict359KeyHashTable[] = {
2, 0, 1, 0, 24862,
};
-vtkDICOMDictionary::Dict Dict349Data = {
+vtkDICOMDictionary::Dict Dict359Data = {
"GEMS_PATI_01",
1,
1,
-Dict349TagHashTable,
-Dict349KeyHashTable,
-Dict349Contents
+Dict359TagHashTable,
+Dict359KeyHashTable,
+Dict359Contents
};
// ----- NNT -----
-DictEntry Dict350Contents[] = {
+const DictEntry Dict360Contents[] = {
{ 0x0019, 0x0002, 0, VR::US, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
{ 0x0019, 0x0004, 0, VR::DS, VM::M1, "" },
@@ -21038,7 +21912,7 @@ DictEntry Dict350Contents[] = {
{ 0x0019, 0x0033, 0, VR::DS, VM::M8, "" },
};
-unsigned short Dict350TagHashTable[] = {
+const unsigned short Dict360TagHashTable[] = {
31, 36, 41, 44, 30, 30, 47, 50, 30, 30,
53, 58, 63, 66, 30, 30, 69, 30, 72, 75,
80, 83, 86, 89, 30, 30, 92, 97, 102, 107,
@@ -21053,7 +21927,7 @@ unsigned short Dict350TagHashTable[] = {
19, 34,
};
-unsigned short Dict350KeyHashTable[] = {
+const unsigned short Dict360KeyHashTable[] = {
30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
30, 31, 30, 30, 30, 30, 30, 30, 30, 30,
30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
@@ -21066,70 +21940,94 @@ unsigned short Dict350KeyHashTable[] = {
29, 179,
};
-vtkDICOMDictionary::Dict Dict350Data = {
+vtkDICOMDictionary::Dict Dict360Data = {
"NNT",
30,
30,
-Dict350TagHashTable,
-Dict350KeyHashTable,
-Dict350Contents
+Dict360TagHashTable,
+Dict360KeyHashTable,
+Dict360Contents
};
// ----- agfa/displayableImages -----
-DictEntry Dict351Contents[] = {
+const DictEntry Dict361Contents[] = {
{ 0x2e13, 0x0010, 0, VR::IS, VM::M1, "" },
{ 0x2e13, 0x0011, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict351TagHashTable[] = {
+const unsigned short Dict361TagHashTable[] = {
3, 6, 0, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict351KeyHashTable[] = {
+const unsigned short Dict361KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict351Data = {
+vtkDICOMDictionary::Dict Dict361Data = {
"agfa/displayableImages",
2,
2,
-Dict351TagHashTable,
-Dict351KeyHashTable,
-Dict351Contents
+Dict361TagHashTable,
+Dict361KeyHashTable,
+Dict361Contents
+};
+
+// ----- Brainlab-S32-SO -----
+
+const DictEntry Dict362Contents[] = {
+{ 0x0063, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x0063, 0x0010, 0, VR::SQ, VM::M1, "" },
+};
+
+const unsigned short Dict362TagHashTable[] = {
+ 3, 6, 0, 1, 1, 16, 1, 0, 1,
+};
+
+const unsigned short Dict362KeyHashTable[] = {
+ 2, 3, 0, 2, 0, 2690, 1, 2690,
+};
+
+vtkDICOMDictionary::Dict Dict362Data = {
+"Brainlab-S32-SO",
+2,
+2,
+Dict362TagHashTable,
+Dict362KeyHashTable,
+Dict362Contents
};
// ----- GEMS_Ultrasound_ImageGroup_001 -----
-DictEntry Dict352Contents[] = {
+const DictEntry Dict363Contents[] = {
{ 0x6003, 0x0010, 0, VR::SQ, VM::M1, "" },
{ 0x6003, 0x0011, 0, VR::OB, VM::M1, "" },
{ 0x6003, 0x0012, 0, VR::LT, VM::M1, "" },
{ 0x6003, 0x0015, 0, VR::LT, VM::M1TN, "" },
};
-unsigned short Dict352TagHashTable[] = {
+const unsigned short Dict363TagHashTable[] = {
4, 5, 8, 13, 0, 1, 2, 18, 2, 1,
17, 3, 21, 1, 0, 16,
};
-unsigned short Dict352KeyHashTable[] = {
+const unsigned short Dict363KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict352Data = {
+vtkDICOMDictionary::Dict Dict363Data = {
"GEMS_Ultrasound_ImageGroup_001",
4,
4,
-Dict352TagHashTable,
-Dict352KeyHashTable,
-Dict352Contents
+Dict363TagHashTable,
+Dict363KeyHashTable,
+Dict363Contents
};
// ----- SIEMENS MEDCOM HEADER -----
-DictEntry Dict353Contents[] = {
+const DictEntry Dict364Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "MedComHeaderType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "MedComHeaderVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "MedComHeaderInfo" },
@@ -21160,7 +22058,7 @@ DictEntry Dict353Contents[] = {
{ 0x0029, 0x0077, 0, VR::UL, VM::M1, "ReferencedObjectOffset" },
};
-unsigned short Dict353TagHashTable[] = {
+const unsigned short Dict364TagHashTable[] = {
29, 32, 28, 28, 37, 42, 47, 50, 53, 58,
65, 70, 75, 78, 28, 28, 28, 28, 28, 28,
81, 84, 87, 90, 93, 28, 98, 101, 0, 1,
@@ -21174,7 +22072,7 @@ unsigned short Dict353TagHashTable[] = {
51, 1, 5, 50,
};
-unsigned short Dict353KeyHashTable[] = {
+const unsigned short Dict364KeyHashTable[] = {
29, 28, 32, 28, 39, 28, 28, 42, 47, 50,
55, 28, 58, 28, 63, 66, 69, 28, 72, 75,
78, 28, 28, 81, 86, 91, 98, 101, 0, 1,
@@ -21188,18 +22086,18 @@ unsigned short Dict353KeyHashTable[] = {
39385, 1, 8, 39385,
};
-vtkDICOMDictionary::Dict Dict353Data = {
+vtkDICOMDictionary::Dict Dict364Data = {
"SIEMENS MEDCOM HEADER",
28,
28,
-Dict353TagHashTable,
-Dict353KeyHashTable,
-Dict353Contents
+Dict364TagHashTable,
+Dict364KeyHashTable,
+Dict364Contents
};
// ----- SIEMENS SYNGO EVIDENCE DOCUMENT DATA -----
-DictEntry Dict354Contents[] = {
+const DictEntry Dict365Contents[] = {
{ 0x0077, 0x0010, 0, VR::LO, VM::M1, "EvidenceDocumentTemplateName" },
{ 0x0077, 0x0011, 0, VR::DS, VM::M1, "EvidenceDocumentTemplateVersion" },
{ 0x0077, 0x0020, 0, VR::OB, VM::M1, "ClinicalFindingData" },
@@ -21214,7 +22112,7 @@ DictEntry Dict354Contents[] = {
{ 0x0077, 0x0080, 0, VR::OB, VM::M1, "VolumeCatalog" },
};
-unsigned short Dict354TagHashTable[] = {
+const unsigned short Dict365TagHashTable[] = {
12, 12, 13, 16, 21, 24, 27, 32, 12, 12,
39, 42, 0, 1, 2, 32, 2, 3, 33, 6,
80, 1, 11, 128, 1, 10, 114, 2, 0, 16,
@@ -21222,7 +22120,7 @@ unsigned short Dict354TagHashTable[] = {
4, 48, 1, 7, 96,
};
-unsigned short Dict354KeyHashTable[] = {
+const unsigned short Dict365KeyHashTable[] = {
13, 20, 12, 25, 12, 28, 12, 12, 33, 36,
39, 42, 0, 3, 0, 15331, 5, 22763, 9, 43355,
2, 6, 43689, 10, 53675, 1, 7, 30572, 2, 2,
@@ -21230,18 +22128,18 @@ unsigned short Dict354KeyHashTable[] = {
3, 2677, 1, 8, 45714,
};
-vtkDICOMDictionary::Dict Dict354Data = {
+vtkDICOMDictionary::Dict Dict365Data = {
"SIEMENS SYNGO EVIDENCE DOCUMENT DATA",
12,
12,
-Dict354TagHashTable,
-Dict354KeyHashTable,
-Dict354Contents
+Dict365TagHashTable,
+Dict365KeyHashTable,
+Dict365Contents
};
// ----- GEMS_DL_SERIES_01 -----
-DictEntry Dict355Contents[] = {
+const DictEntry Dict366Contents[] = {
{ 0x0015, 0x0085, 0, VR::LO, VM::M1, "SeriesFileName" },
{ 0x0015, 0x0087, 0, VR::IS, VM::M1, "NumberOfImages" },
{ 0x0015, 0x008C, 0, VR::CS, VM::M1, "SentFlag" },
@@ -21250,30 +22148,30 @@ DictEntry Dict355Contents[] = {
{ 0x0019, 0x004d, 0, VR::CS, VM::M1, "BrowserHide" },
};
-unsigned short Dict355TagHashTable[] = {
+const unsigned short Dict366TagHashTable[] = {
7, 12, 15, 6, 18, 21, 0, 2, 1, 135,
4, 76, 1, 5, 77, 1, 0, 133, 1, 3,
141, 1, 2, 140,
};
-unsigned short Dict355KeyHashTable[] = {
+const unsigned short Dict366KeyHashTable[] = {
7, 10, 17, 6, 6, 20, 0, 1, 3, 45009,
3, 1, 37972, 2, 22596, 5, 28427, 1, 4, 7152,
1, 0, 18914,
};
-vtkDICOMDictionary::Dict Dict355Data = {
+vtkDICOMDictionary::Dict Dict366Data = {
"GEMS_DL_SERIES_01",
6,
6,
-Dict355TagHashTable,
-Dict355KeyHashTable,
-Dict355Contents
+Dict366TagHashTable,
+Dict366KeyHashTable,
+Dict366Contents
};
// ----- Canon Inc. -----
-DictEntry Dict356Contents[] = {
+const DictEntry Dict367Contents[] = {
{ 0x0019, 0x0010, 0, VR::UN, VM::M1, "" },
{ 0x0019, 0x0013, 0, VR::UN, VM::M1, "" },
{ 0x0019, 0x0015, 0, VR::DS, VM::M2, "" },
@@ -21289,7 +22187,7 @@ DictEntry Dict356Contents[] = {
{ 0x0019, 0x0021, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict356TagHashTable[] = {
+const unsigned short Dict367TagHashTable[] = {
14, 17, 22, 27, 30, 33, 36, 39, 13, 42,
45, 13, 48, 0, 1, 6, 25, 2, 4, 23,
5, 24, 2, 3, 22, 8, 27, 1, 7, 26,
@@ -21298,7 +22196,7 @@ unsigned short Dict356TagHashTable[] = {
21,
};
-unsigned short Dict356KeyHashTable[] = {
+const unsigned short Dict367KeyHashTable[] = {
13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 14, 0, 13, 0, 413, 1, 413, 2,
413, 3, 413, 4, 413, 5, 413, 6, 413, 7,
@@ -21306,18 +22204,18 @@ unsigned short Dict356KeyHashTable[] = {
413,
};
-vtkDICOMDictionary::Dict Dict356Data = {
+vtkDICOMDictionary::Dict Dict367Data = {
"Canon Inc.",
13,
13,
-Dict356TagHashTable,
-Dict356KeyHashTable,
-Dict356Contents
+Dict367TagHashTable,
+Dict367KeyHashTable,
+Dict367Contents
};
// ----- GEMS_GENIE_1 -----
-DictEntry Dict357Contents[] = {
+const DictEntry Dict368Contents[] = {
{ 0x0009, 0x0001, 0, VR::SH, VM::M1, "" },
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "StudyName" },
{ 0x0009, 0x0011, 0, VR::SL, VM::M1, "StudyFlags" },
@@ -21606,7 +22504,7 @@ DictEntry Dict357Contents[] = {
{ 0x5001, 0x0060, 0, VR::LO, VM::M1TN, "DatasetROIMapping" },
};
-unsigned short Dict357TagHashTable[] = {
+const unsigned short Dict368TagHashTable[] = {
287, 296, 303, 310, 319, 326, 335, 344, 355, 362,
367, 372, 377, 380, 385, 390, 395, 398, 401, 404,
286, 286, 286, 407, 412, 415, 418, 421, 426, 429,
@@ -21714,7 +22612,7 @@ unsigned short Dict357TagHashTable[] = {
1, 252, 58, 1, 255, 61, 1, 254, 60,
};
-unsigned short Dict357KeyHashTable[] = {
+const unsigned short Dict368KeyHashTable[] = {
286, 287, 290, 286, 295, 286, 286, 298, 301, 286,
306, 286, 309, 312, 315, 286, 318, 286, 286, 323,
286, 328, 286, 286, 331, 334, 337, 286, 340, 345,
@@ -21821,41 +22719,117 @@ unsigned short Dict357KeyHashTable[] = {
30, 61371,
};
-vtkDICOMDictionary::Dict Dict357Data = {
+vtkDICOMDictionary::Dict Dict368Data = {
"GEMS_GENIE_1",
286,
286,
-Dict357TagHashTable,
-Dict357KeyHashTable,
-Dict357Contents
+Dict368TagHashTable,
+Dict368KeyHashTable,
+Dict368Contents
+};
+
+// ----- CT IMG ACQUISITION -----
+
+const DictEntry Dict369Contents[] = {
+{ 0x7029, 0x0002, 0, VR::FL, VM::M1, "DetectorElementTransverseSpacing" },
+{ 0x7029, 0x0006, 0, VR::FL, VM::M1, "DetectorElementAxialSpacing" },
+{ 0x7029, 0x000B, 0, VR::CS, VM::M1, "DetectorShape" },
+{ 0x7029, 0x0010, 0, VR::US, VM::M1, "NumberofDetectorRows" },
+{ 0x7029, 0x0011, 0, VR::US, VM::M1, "NumberofDetectorColumns" },
+{ 0x7031, 0x0001, 0, VR::FL, VM::M1, "DetectorFocalCenterAngularPosition" },
+{ 0x7031, 0x0002, 0, VR::FL, VM::M1, "DetectorFocalCenterAxialPosition" },
+{ 0x7031, 0x0003, 0, VR::FL, VM::M1, "DetectorFocalCenterRadialDistance" },
+{ 0x7031, 0x0031, 0, VR::FL, VM::M1, "ConstantRadialDistance" },
+{ 0x7031, 0x0033, 0, VR::FL, VM::M1TN, "DetectorCentralElement" },
+{ 0x7033, 0x000B, 0, VR::FL, VM::M1, "SourceAxialPositionShift" },
+{ 0x7033, 0x000C, 0, VR::FL, VM::M1, "SourceAngularPositionShift" },
+{ 0x7033, 0x000D, 0, VR::FL, VM::M1, "SourceRadialDistanceShift" },
+{ 0x7033, 0x000E, 0, VR::CS, VM::M1, "FlyingFocalSpotMode" },
+{ 0x7033, 0x0013, 0, VR::US, VM::M1, "NumberofSourceAngularSteps" },
+{ 0x7033, 0x0061, 0, VR::US, VM::M1, "NumberofSources" },
+{ 0x7033, 0x0063, 0, VR::US, VM::M1, "SourceIndex" },
+{ 0x7033, 0x0065, 0, VR::FL, VM::M1TN, "PhotonStatistics" },
+{ 0x7037, 0x0009, 0, VR::CS, VM::M1, "TypeofProjectionData" },
+{ 0x7037, 0x000A, 0, VR::CS, VM::M1, "TypeofProjectionGeometry" },
+{ 0x7039, 0x0003, 0, VR::CS, VM::M1, "BeamHardeningCorrectionFlag" },
+{ 0x7039, 0x0004, 0, VR::CS, VM::M1, "GainCorrectionFlag" },
+{ 0x7039, 0x0005, 0, VR::CS, VM::M1, "DarkFieldCorrectionFlag" },
+{ 0x7039, 0x0006, 0, VR::CS, VM::M1, "FlatFieldCorrectionFlag" },
+{ 0x7039, 0x0007, 0, VR::CS, VM::M1, "BadPixelCorrectionFlag" },
+{ 0x7039, 0x0008, 0, VR::CS, VM::M1, "ScatterCorrectionFlag" },
+{ 0x7039, 0x0009, 0, VR::CS, VM::M1, "LogFlag" },
+{ 0x7041, 0x0003, 0, VR::US, VM::M1, "NumberofLesions" },
+{ 0x7041, 0x0004, 0, VR::ST, VM::M1, "LesionPathologyArray" },
+{ 0x7041, 0x0005, 0, VR::FL, VM::M1TN, "LesionAngularPositionArray" },
+{ 0x7041, 0x0006, 0, VR::FL, VM::M1TN, "LesionAxialPositionArray" },
+{ 0x7041, 0x0007, 0, VR::FL, VM::M1TN, "LesionRadialDistanceArray" },
+};
+
+const unsigned short Dict369TagHashTable[] = {
+ 33, 32, 38, 43, 46, 49, 52, 55, 32, 32,
+ 32, 58, 32, 32, 32, 61, 64, 69, 74, 77,
+ 32, 32, 32, 82, 85, 90, 93, 32, 96, 99,
+ 106, 113, 0, 2, 8, 49, 14, 19, 2, 2,
+ 11, 9, 51, 1, 27, 3, 1, 28, 4, 1,
+ 29, 5, 1, 30, 6, 1, 31, 7, 1, 0,
+ 2, 1, 1, 6, 2, 5, 1, 26, 9, 2,
+ 16, 99, 25, 8, 1, 7, 3, 2, 6, 2,
+ 15, 97, 1, 17, 101, 2, 4, 17, 10, 11,
+ 1, 3, 16, 1, 20, 3, 1, 22, 5, 3,
+ 13, 14, 19, 10, 21, 4, 3, 12, 13, 18,
+ 9, 24, 7, 2, 11, 12, 23, 6,
+};
+
+const unsigned short Dict369KeyHashTable[] = {
+ 33, 38, 41, 32, 44, 47, 52, 55, 60, 65,
+ 32, 32, 68, 71, 78, 32, 81, 32, 84, 89,
+ 32, 32, 94, 32, 97, 32, 32, 100, 103, 106,
+ 113, 32, 0, 2, 24, 33915, 27, 55861, 1, 26,
+13018, 1, 23, 40542, 1, 5, 5741, 2, 19, 43492,
+ 28, 34785, 1, 31, 55547, 2, 8, 60381, 15, 31635,
+ 2, 3, 63269, 17, 12517, 1, 6, 53763, 1, 12,
+ 3316, 3, 14, 62790, 25, 25536, 29, 46276, 1, 16,
+ 7091, 1, 2, 8860, 2, 9, 16138, 30, 21279, 2,
+ 11, 20548, 18, 37884, 1, 21, 2742, 1, 10, 29809,
+ 1, 0, 5262, 1, 20, 3334, 3, 1, 49312, 7,
+ 6736, 22, 60115, 2, 4, 38638, 13, 25005,
+};
+
+vtkDICOMDictionary::Dict Dict369Data = {
+"CT IMG ACQUISITION",
+32,
+32,
+Dict369TagHashTable,
+Dict369KeyHashTable,
+Dict369Contents
};
// ----- SCHICK TECHNOLOGIES - Image Security Creator ID -----
-DictEntry Dict358Contents[] = {
+const DictEntry Dict370Contents[] = {
{ 0x0029, 0x0001, 0, VR::UL, VM::M1, "" },
};
-unsigned short Dict358TagHashTable[] = {
+const unsigned short Dict370TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict358KeyHashTable[] = {
+const unsigned short Dict370KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict358Data = {
+vtkDICOMDictionary::Dict Dict370Data = {
"SCHICK TECHNOLOGIES - Image Security Creator ID",
1,
1,
-Dict358TagHashTable,
-Dict358KeyHashTable,
-Dict358Contents
+Dict370TagHashTable,
+Dict370KeyHashTable,
+Dict370Contents
};
// ----- SIEMENS MR VA0 GEN -----
-DictEntry Dict359Contents[] = {
+const DictEntry Dict371Contents[] = {
{ 0x0019, 0x0010, 0, VR::DS, VM::M1, "TotalMeasurementTimeNominal" },
{ 0x0019, 0x0011, 0, VR::DS, VM::M1, "TotalMeasurementTimeCurrent" },
{ 0x0019, 0x0012, 0, VR::DS, VM::M1, "StartDelayTime" },
@@ -21939,7 +22913,7 @@ DictEntry Dict359Contents[] = {
{ 0x0021, 0x0096, 0, VR::DS, VM::M1, "EPIChangeValueOfZComponent" },
};
-unsigned short Dict359TagHashTable[] = {
+const unsigned short Dict371TagHashTable[] = {
82, 85, 94, 97, 81, 100, 81, 103, 106, 111,
116, 121, 126, 129, 134, 137, 144, 151, 156, 159,
164, 169, 176, 179, 186, 193, 81, 81, 81, 81,
@@ -21972,7 +22946,7 @@ unsigned short Dict359TagHashTable[] = {
27, 133, 1, 26, 132, 1, 71, 112,
};
-unsigned short Dict359KeyHashTable[] = {
+const unsigned short Dict371KeyHashTable[] = {
81, 82, 81, 81, 87, 94, 97, 81, 81, 81,
100, 109, 114, 119, 122, 81, 127, 81, 130, 81,
133, 81, 136, 141, 81, 144, 147, 81, 81, 81,
@@ -22005,18 +22979,18 @@ unsigned short Dict359KeyHashTable[] = {
49082, 1, 21, 15575,
};
-vtkDICOMDictionary::Dict Dict359Data = {
+vtkDICOMDictionary::Dict Dict371Data = {
"SIEMENS MR VA0 GEN",
81,
81,
-Dict359TagHashTable,
-Dict359KeyHashTable,
-Dict359Contents
+Dict371TagHashTable,
+Dict371KeyHashTable,
+Dict371Contents
};
// ----- Hologic -----
-DictEntry Dict360Contents[] = {
+const DictEntry Dict372Contents[] = {
{ 0x0011, 0x0000, 0, VR::OB, VM::M1, "HxQuestionnaire" },
{ 0x0013, 0x0000, 0, VR::LO, VM::M1, "IVAResultsFlag" },
{ 0x0019, 0x0000, 0, VR::UT, VM::M1, "ReportData" },
@@ -22031,7 +23005,7 @@ DictEntry Dict360Contents[] = {
{ 0x0029, 0x0001, 0, VR::UL, VM::M1, "GraphBitmapSize" },
};
-unsigned short Dict360TagHashTable[] = {
+const unsigned short Dict372TagHashTable[] = {
12, 13, 16, 19, 22, 25, 12, 30, 33, 38,
41, 44, 0, 1, 2, 0, 1, 9, 5, 1,
8, 4, 1, 11, 1, 2, 0, 0, 10, 0,
@@ -22039,7 +23013,7 @@ unsigned short Dict360TagHashTable[] = {
2, 1, 5, 1, 1, 4, 0,
};
-unsigned short Dict360KeyHashTable[] = {
+const unsigned short Dict372KeyHashTable[] = {
12, 13, 12, 18, 21, 12, 24, 27, 12, 30,
33, 38, 0, 2, 8, 19844, 9, 18946, 1, 4,
54723, 1, 0, 12614, 1, 5, 1260, 1, 2, 46831,
@@ -22047,46 +23021,46 @@ unsigned short Dict360KeyHashTable[] = {
36867, 7, 33057, 11, 10475,
};
-vtkDICOMDictionary::Dict Dict360Data = {
+vtkDICOMDictionary::Dict Dict372Data = {
"Hologic",
12,
12,
-Dict360TagHashTable,
-Dict360KeyHashTable,
-Dict360Contents
+Dict372TagHashTable,
+Dict372KeyHashTable,
+Dict372Contents
};
// ----- GEMS_DL_PATNT_01 -----
-DictEntry Dict361Contents[] = {
+const DictEntry Dict373Contents[] = {
{ 0x0011, 0x0080, 0, VR::UI, VM::M1, "PatientInstanceUid" },
{ 0x0011, 0x0081, 0, VR::IS, VM::M1, "LastStudyNumber" },
{ 0x0011, 0x0082, 0, VR::CS, VM::M1, "PatientRepaired" },
{ 0x0011, 0x0083, 0, VR::CS, VM::M1, "LockDemographics" },
};
-unsigned short Dict361TagHashTable[] = {
+const unsigned short Dict373TagHashTable[] = {
5, 8, 11, 14, 0, 1, 3, 131, 1, 2,
130, 1, 1, 129, 1, 0, 128,
};
-unsigned short Dict361KeyHashTable[] = {
+const unsigned short Dict373KeyHashTable[] = {
5, 8, 11, 14, 0, 1, 3, 21937, 1, 0,
49412, 1, 2, 12345, 1, 1, 37238,
};
-vtkDICOMDictionary::Dict Dict361Data = {
+vtkDICOMDictionary::Dict Dict373Data = {
"GEMS_DL_PATNT_01",
4,
4,
-Dict361TagHashTable,
-Dict361KeyHashTable,
-Dict361Contents
+Dict373TagHashTable,
+Dict373KeyHashTable,
+Dict373Contents
};
// ----- SIEMENS SYNGO FRAME SET -----
-DictEntry Dict362Contents[] = {
+const DictEntry Dict374Contents[] = {
{ 0x0029, 0x0010, 0, VR::SQ, VM::M1, "ImageFrameSequence" },
{ 0x0029, 0x0012, 0, VR::CS, VM::M1, "TypeOfProgression" },
{ 0x0029, 0x0014, 0, VR::IS, VM::M1, "RepresentationLevel" },
@@ -22095,54 +23069,54 @@ DictEntry Dict362Contents[] = {
{ 0x0029, 0x0020, 0, VR::IS, VM::M1, "RepresentationPixelOffset" },
};
-unsigned short Dict362TagHashTable[] = {
+const unsigned short Dict374TagHashTable[] = {
6, 7, 6, 12, 6, 19, 0, 2, 2, 20,
4, 24, 3, 0, 16, 3, 22, 5, 32, 1,
1, 18,
};
-unsigned short Dict362KeyHashTable[] = {
+const unsigned short Dict374KeyHashTable[] = {
6, 7, 6, 12, 15, 20, 0, 2, 4, 10332,
5, 36944, 1, 3, 18894, 2, 0, 45420, 2, 21842,
1, 1, 34947,
};
-vtkDICOMDictionary::Dict Dict362Data = {
+vtkDICOMDictionary::Dict Dict374Data = {
"SIEMENS SYNGO FRAME SET",
6,
6,
-Dict362TagHashTable,
-Dict362KeyHashTable,
-Dict362Contents
+Dict374TagHashTable,
+Dict374KeyHashTable,
+Dict374Contents
};
// ----- SIEMENS MR CM 03 -----
-DictEntry Dict363Contents[] = {
+const DictEntry Dict375Contents[] = {
{ 0x0021, 0x0001, 0, VR::IS, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict363TagHashTable[] = {
+const unsigned short Dict375TagHashTable[] = {
3, 6, 0, 1, 0, 1, 1, 1, 2,
};
-unsigned short Dict363KeyHashTable[] = {
+const unsigned short Dict375KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict363Data = {
+vtkDICOMDictionary::Dict Dict375Data = {
"SIEMENS MR CM 03",
2,
2,
-Dict363TagHashTable,
-Dict363KeyHashTable,
-Dict363Contents
+Dict375TagHashTable,
+Dict375KeyHashTable,
+Dict375Contents
};
// ----- SIEMENS Ultrasound SC2000 -----
-DictEntry Dict364Contents[] = {
+const DictEntry Dict376Contents[] = {
{ 0x0019, 0x002D, 0, VR::US, VM::M1, "BModeTintIndex" },
{ 0x0019, 0x0072, 0, VR::US, VM::M1, "DopplerTintIndex" },
{ 0x0019, 0x0088, 0, VR::US, VM::M1, "MModeTintIndex" },
@@ -22187,7 +23161,7 @@ DictEntry Dict364Contents[] = {
{ 0x7FD1, 0x0011, 0, VR::UN, VM::M1, "AfterPayload" },
};
-unsigned short Dict364TagHashTable[] = {
+const unsigned short Dict376TagHashTable[] = {
42, 42, 43, 46, 49, 52, 42, 57, 60, 63,
66, 42, 42, 42, 42, 42, 69, 74, 79, 82,
87, 92, 97, 104, 107, 110, 42, 42, 115, 118,
@@ -22206,7 +23180,7 @@ unsigned short Dict364TagHashTable[] = {
2, 2, 25, 8, 37, 3,
};
-unsigned short Dict364KeyHashTable[] = {
+const unsigned short Dict376KeyHashTable[] = {
42, 43, 42, 46, 51, 54, 57, 60, 63, 66,
69, 42, 42, 76, 42, 79, 82, 87, 90, 93,
96, 99, 102, 42, 42, 105, 42, 114, 42, 121,
@@ -22225,18 +23199,18 @@ unsigned short Dict364KeyHashTable[] = {
1, 31, 8093, 2, 18, 23632, 23, 41492,
};
-vtkDICOMDictionary::Dict Dict364Data = {
+vtkDICOMDictionary::Dict Dict376Data = {
"SIEMENS Ultrasound SC2000",
42,
42,
-Dict364TagHashTable,
-Dict364KeyHashTable,
-Dict364Contents
+Dict376TagHashTable,
+Dict376KeyHashTable,
+Dict376Contents
};
// ----- TOSHIBA_MEC_1.0 -----
-DictEntry Dict365Contents[] = {
+const DictEntry Dict377Contents[] = {
{ 0x0009, 0x0001, 0, VR::LT, VM::M1, "" },
{ 0x0009, 0x0002, 0, VR::US, VM::M1TN, "" },
{ 0x0009, 0x0003, 0, VR::US, VM::M1TN, "" },
@@ -22254,7 +23228,7 @@ DictEntry Dict365Contents[] = {
{ 0x7ff1, 0x0010, 0, VR::US, VM::M1TN, "" },
};
-unsigned short Dict365TagHashTable[] = {
+const unsigned short Dict377TagHashTable[] = {
15, 16, 19, 22, 25, 32, 35, 15, 40, 43,
46, 49, 52, 55, 15, 0, 1, 4, 1, 1,
8, 1, 1, 12, 2, 3, 5, 2, 10, 3,
@@ -22263,7 +23237,7 @@ unsigned short Dict365TagHashTable[] = {
1, 2, 1, 7, 2, 1, 3, 4,
};
-unsigned short Dict365KeyHashTable[] = {
+const unsigned short Dict377KeyHashTable[] = {
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 16, 15, 15, 15, 0, 15, 0, 358, 1,
358, 2, 358, 3, 358, 4, 358, 5, 358, 6,
@@ -22271,18 +23245,18 @@ unsigned short Dict365KeyHashTable[] = {
358, 12, 358, 13, 358, 14, 358,
};
-vtkDICOMDictionary::Dict Dict365Data = {
+vtkDICOMDictionary::Dict Dict377Data = {
"TOSHIBA_MEC_1.0",
15,
15,
-Dict365TagHashTable,
-Dict365KeyHashTable,
-Dict365Contents
+Dict377TagHashTable,
+Dict377KeyHashTable,
+Dict377Contents
};
// ----- SIEMENS MED SMS USG S2000 3D VOLUME -----
-DictEntry Dict366Contents[] = {
+const DictEntry Dict378Contents[] = {
{ 0x0039, 0x0050, 0, VR::LO, VM::M1, "PrivateCreatorVersionOfBookmark" },
{ 0x0039, 0x0051, 0, VR::US, VM::M1, "BCutPlaneEnable" },
{ 0x0039, 0x0052, 0, VR::US, VM::M1, "BMprColorMapIndex" },
@@ -22384,7 +23358,7 @@ DictEntry Dict366Contents[] = {
{ 0x0039, 0x00f6, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict366TagHashTable[] = {
+const unsigned short Dict378TagHashTable[] = {
100, 103, 106, 111, 116, 121, 126, 131, 134, 139,
144, 149, 152, 157, 160, 163, 99, 166, 169, 172,
175, 178, 181, 184, 187, 190, 99, 99, 99, 99,
@@ -22424,7 +23398,7 @@ unsigned short Dict366TagHashTable[] = {
10, 90,
};
-unsigned short Dict366KeyHashTable[] = {
+const unsigned short Dict378KeyHashTable[] = {
100, 107, 99, 112, 117, 120, 123, 99, 99, 99,
99, 126, 99, 131, 136, 139, 142, 147, 152, 99,
99, 157, 99, 99, 162, 165, 99, 168, 173, 99,
@@ -22463,18 +23437,18 @@ unsigned short Dict366KeyHashTable[] = {
18, 23800, 34, 54477, 1, 46, 24860,
};
-vtkDICOMDictionary::Dict Dict366Data = {
+vtkDICOMDictionary::Dict Dict378Data = {
"SIEMENS MED SMS USG S2000 3D VOLUME",
99,
99,
-Dict366TagHashTable,
-Dict366KeyHashTable,
-Dict366Contents
+Dict378TagHashTable,
+Dict378KeyHashTable,
+Dict378Contents
};
// ----- Picker MR Private Group -----
-DictEntry Dict367Contents[] = {
+const DictEntry Dict379Contents[] = {
{ 0x7101, 0x0000, 0, VR::OB, VM::M1, "" },
{ 0x7101, 0x0001, 0, VR::SL, VM::M1, "" },
{ 0x7101, 0x0002, 0, VR::OB, VM::M1, "" },
@@ -22485,31 +23459,31 @@ DictEntry Dict367Contents[] = {
{ 0x7101, 0x0010, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict367TagHashTable[] = {
+const unsigned short Dict379TagHashTable[] = {
9, 12, 8, 15, 18, 21, 26, 29, 0, 1,
5, 5, 1, 4, 4, 1, 6, 6, 1, 1,
1, 2, 0, 0, 7, 16, 1, 3, 3, 1,
2, 2,
};
-unsigned short Dict367KeyHashTable[] = {
+const unsigned short Dict379KeyHashTable[] = {
8, 8, 8, 8, 8, 9, 8, 8, 0, 8,
0, 672, 1, 672, 2, 672, 3, 672, 4, 672,
5, 672, 6, 672, 7, 672,
};
-vtkDICOMDictionary::Dict Dict367Data = {
+vtkDICOMDictionary::Dict Dict379Data = {
"Picker MR Private Group",
8,
8,
-Dict367TagHashTable,
-Dict367KeyHashTable,
-Dict367Contents
+Dict379TagHashTable,
+Dict379KeyHashTable,
+Dict379Contents
};
// ----- DLX_SERIE_01 -----
-DictEntry Dict368Contents[] = {
+const DictEntry Dict380Contents[] = {
{ 0x0019, 0x0001, 0, VR::DS, VM::M1, "AngleValueLArm" },
{ 0x0019, 0x0002, 0, VR::DS, VM::M1, "AngleValuePArm" },
{ 0x0019, 0x0003, 0, VR::DS, VM::M1, "AngleValueCArm" },
@@ -22545,7 +23519,7 @@ DictEntry Dict368Contents[] = {
{ 0x0019, 0x1028, 0, VR::DS, VM::M1, "ImageChainFWHMPsfMmMax" },
};
-unsigned short Dict368TagHashTable[] = {
+const unsigned short Dict380TagHashTable[] = {
34, 37, 40, 43, 46, 49, 52, 55, 58, 61,
33, 33, 64, 67, 70, 73, 76, 79, 82, 85,
33, 33, 33, 88, 91, 96, 99, 104, 109, 114,
@@ -22561,7 +23535,7 @@ unsigned short Dict368TagHashTable[] = {
30, 38, 2, 5, 6, 31, 4135,
};
-unsigned short Dict368KeyHashTable[] = {
+const unsigned short Dict380KeyHashTable[] = {
34, 33, 33, 33, 33, 33, 33, 33, 33, 33,
33, 37, 33, 42, 33, 45, 48, 59, 62, 33,
71, 33, 74, 77, 94, 33, 33, 99, 102, 105,
@@ -22576,135 +23550,119 @@ unsigned short Dict368KeyHashTable[] = {
2, 11, 38012, 20, 62065,
};
-vtkDICOMDictionary::Dict Dict368Data = {
+vtkDICOMDictionary::Dict Dict380Data = {
"DLX_SERIE_01",
33,
33,
-Dict368TagHashTable,
-Dict368KeyHashTable,
-Dict368Contents
+Dict380TagHashTable,
+Dict380KeyHashTable,
+Dict380Contents
};
// ----- SIEMENS SYNGO ENCAPSULATED DOCUMENT DATA -----
-DictEntry Dict369Contents[] = {
+const DictEntry Dict381Contents[] = {
{ 0x0087, 0x0020, 0, VR::OB, VM::M1, "StudyModel" },
{ 0x0087, 0x0030, 0, VR::OB, VM::M1, "ReportXMLSchema" },
{ 0x0087, 0x0040, 0, VR::OB, VM::M1, "ReportIdentifier" },
};
-unsigned short Dict369TagHashTable[] = {
+const unsigned short Dict381TagHashTable[] = {
4, 7, 3, 0, 1, 0, 32, 2, 1, 48,
2, 64,
};
-unsigned short Dict369KeyHashTable[] = {
+const unsigned short Dict381KeyHashTable[] = {
3, 4, 9, 0, 2, 0, 6778, 2, 17185, 1,
1, 11691,
};
-vtkDICOMDictionary::Dict Dict369Data = {
+vtkDICOMDictionary::Dict Dict381Data = {
"SIEMENS SYNGO ENCAPSULATED DOCUMENT DATA",
3,
3,
-Dict369TagHashTable,
-Dict369KeyHashTable,
-Dict369Contents
+Dict381TagHashTable,
+Dict381KeyHashTable,
+Dict381Contents
};
// ----- 1.2.840.113663.1 -----
-DictEntry Dict370Contents[] = {
+const DictEntry Dict382Contents[] = {
{ 0x0029, 0x0000, 0, VR::US, VM::M1, "" },
{ 0x0029, 0x0001, 0, VR::US, VM::M1, "" },
};
-unsigned short Dict370TagHashTable[] = {
+const unsigned short Dict382TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict370KeyHashTable[] = {
+const unsigned short Dict382KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict370Data = {
+vtkDICOMDictionary::Dict Dict382Data = {
"1.2.840.113663.1",
2,
2,
-Dict370TagHashTable,
-Dict370KeyHashTable,
-Dict370Contents
+Dict382TagHashTable,
+Dict382KeyHashTable,
+Dict382Contents
};
// ----- SIEMENS MED OCS BEAM DISPLAY INFO -----
-DictEntry Dict371Contents[] = {
+const DictEntry Dict383Contents[] = {
{ 0x0039, 0x0076, 0, VR::CS, VM::M1, "BeamDisplayProperties" },
};
-unsigned short Dict371TagHashTable[] = {
+const unsigned short Dict383TagHashTable[] = {
2, 0, 1, 0, 118,
};
-unsigned short Dict371KeyHashTable[] = {
+const unsigned short Dict383KeyHashTable[] = {
2, 0, 1, 0, 57277,
};
-vtkDICOMDictionary::Dict Dict371Data = {
+vtkDICOMDictionary::Dict Dict383Data = {
"SIEMENS MED OCS BEAM DISPLAY INFO",
1,
1,
-Dict371TagHashTable,
-Dict371KeyHashTable,
-Dict371Contents
+Dict383TagHashTable,
+Dict383KeyHashTable,
+Dict383Contents
};
-// ----- ULTRAVISUAL_TAG_SET1 -----
+// ----- CMR42 CIRCLECVI -----
-DictEntry Dict372Contents[] = {
-{ 0x0011, 0x0001, 0, VR::CS, VM::M1, "" },
-{ 0x0011, 0x0002, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x0003, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x0008, 0, VR::LO, VM::M1, "" },
-{ 0x0011, 0x0010, 0, VR::US, VM::M1, "" },
-{ 0x0011, 0x0011, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x0012, 0, VR::UI, VM::M1, "" },
-{ 0x0011, 0x0018, 0, VR::UL, VM::M1, "" },
-{ 0x0011, 0x0019, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x001a, 0, VR::CS, VM::M1, "" },
-{ 0x0011, 0x001b, 0, VR::IS, VM::M1, "" },
-{ 0x0011, 0x001c, 0, VR::IS, VM::M1, "" },
-{ 0x0011, 0x001d, 0, VR::LO, VM::M1, "" },
+const DictEntry Dict384Contents[] = {
+{ 0x0025, 0x0010, 0, VR::LO, VM::M1, "WorkspaceID" },
+{ 0x0025, 0x0020, 0, VR::LO, VM::M1, "WorkspaceTimeString" },
+{ 0x0025, 0x0030, 0, VR::LO, VM::M1, "WorkspaceStream" },
};
-unsigned short Dict372TagHashTable[] = {
- 14, 19, 13, 22, 13, 27, 30, 13, 33, 36,
- 39, 42, 45, 0, 2, 5, 17, 11, 28, 1,
- 4, 16, 2, 0, 1, 6, 18, 1, 2, 3,
- 1, 1, 2, 1, 8, 25, 1, 7, 24, 1,
- 10, 27, 1, 9, 26, 2, 3, 8, 12, 29,
+const unsigned short Dict384TagHashTable[] = {
+ 4, 3, 7, 0, 1, 2, 48, 2, 0, 16,
+ 1, 32,
};
-unsigned short Dict372KeyHashTable[] = {
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 14, 0, 13, 0, 413, 1, 413, 2,
- 413, 3, 413, 4, 413, 5, 413, 6, 413, 7,
- 413, 8, 413, 9, 413, 10, 413, 11, 413, 12,
- 413,
+const unsigned short Dict384KeyHashTable[] = {
+ 4, 3, 7, 0, 1, 2, 28192, 2, 0, 42805,
+ 1, 61032,
};
-vtkDICOMDictionary::Dict Dict372Data = {
-"ULTRAVISUAL_TAG_SET1",
-13,
-13,
-Dict372TagHashTable,
-Dict372KeyHashTable,
-Dict372Contents
+vtkDICOMDictionary::Dict Dict384Data = {
+"CMR42 CIRCLECVI",
+3,
+3,
+Dict384TagHashTable,
+Dict384KeyHashTable,
+Dict384Contents
};
// ----- Applicare/RadWorks/Version 6.0/Summary -----
-DictEntry Dict373Contents[] = {
+const DictEntry Dict385Contents[] = {
{ 0x3109, 0x0001, 0, VR::SH, VM::M1, "Status" },
{ 0x3109, 0x0011, 0, VR::ST, VM::M1, "ReceiveOriginSiteName" },
{ 0x3109, 0x0012, 0, VR::ST, VM::M1, "ReceiveOriginDescription" },
@@ -22712,28 +23670,28 @@ DictEntry Dict373Contents[] = {
{ 0x3109, 0x0016, 0, VR::TM, VM::M1, "ReceiveTime" },
};
-unsigned short Dict373TagHashTable[] = {
+const unsigned short Dict385TagHashTable[] = {
6, 5, 9, 12, 17, 0, 1, 3, 21, 1,
2, 18, 2, 0, 1, 4, 22, 1, 1, 17,
};
-unsigned short Dict373KeyHashTable[] = {
+const unsigned short Dict385KeyHashTable[] = {
6, 9, 14, 17, 5, 0, 1, 0, 45525, 2,
2, 11863, 4, 38814, 1, 1, 5876, 1, 3, 53191,
};
-vtkDICOMDictionary::Dict Dict373Data = {
+vtkDICOMDictionary::Dict Dict385Data = {
"Applicare/RadWorks/Version 6.0/Summary",
5,
5,
-Dict373TagHashTable,
-Dict373KeyHashTable,
-Dict373Contents
+Dict385TagHashTable,
+Dict385KeyHashTable,
+Dict385Contents
};
// ----- CARDIO-D.R. 1.0 -----
-DictEntry Dict374Contents[] = {
+const DictEntry Dict386Contents[] = {
{ 0x0009, 0x0000, 0, VR::UL, VM::M1, "FileLocation" },
{ 0x0009, 0x0001, 0, VR::UL, VM::M1, "FileSize" },
{ 0x0009, 0x0040, 0, VR::SQ, VM::M1, "AlternateImageSequence" },
@@ -22754,7 +23712,7 @@ DictEntry Dict374Contents[] = {
{ 0x0029, 0x00AD, 0, VR::FL, VM::M1, "DisplayedAreaTopLeftHandCornerFractional" },
};
-unsigned short Dict374TagHashTable[] = {
+const unsigned short Dict386TagHashTable[] = {
19, 18, 18, 18, 22, 25, 30, 33, 38, 43,
18, 52, 18, 57, 60, 18, 18, 63, 0, 1,
2, 64, 1, 13, 1, 2, 10, 48, 12, 0,
@@ -22764,7 +23722,7 @@ unsigned short Dict374TagHashTable[] = {
1, 11, 19, 1, 7, 8,
};
-unsigned short Dict374KeyHashTable[] = {
+const unsigned short Dict386KeyHashTable[] = {
19, 24, 27, 30, 33, 18, 18, 36, 18, 39,
18, 46, 18, 18, 51, 18, 54, 63, 0, 2,
10, 35814, 17, 45961, 1, 16, 47059, 1, 14, 8195,
@@ -22774,18 +23732,18 @@ unsigned short Dict374KeyHashTable[] = {
49832, 11, 41349, 1, 6, 15396,
};
-vtkDICOMDictionary::Dict Dict374Data = {
+vtkDICOMDictionary::Dict Dict386Data = {
"CARDIO-D.R. 1.0",
18,
18,
-Dict374TagHashTable,
-Dict374KeyHashTable,
-Dict374Contents
+Dict386TagHashTable,
+Dict386KeyHashTable,
+Dict386Contents
};
// ----- LODOX_STATSCAN -----
-DictEntry Dict375Contents[] = {
+const DictEntry Dict387Contents[] = {
{ 0x0019, 0x0001, 0, VR::IS, VM::M1TN, "" },
{ 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
@@ -22796,31 +23754,31 @@ DictEntry Dict375Contents[] = {
{ 0x0019, 0x0008, 0, VR::DS, VM::M1, "" },
};
-unsigned short Dict375TagHashTable[] = {
+const unsigned short Dict387TagHashTable[] = {
9, 12, 15, 18, 21, 24, 27, 30, 0, 1,
0, 1, 1, 7, 8, 1, 2, 3, 1, 1,
2, 1, 4, 5, 1, 3, 4, 1, 6, 7,
1, 5, 6,
};
-unsigned short Dict375KeyHashTable[] = {
+const unsigned short Dict387KeyHashTable[] = {
8, 8, 8, 8, 8, 9, 8, 8, 0, 8,
0, 672, 1, 672, 2, 672, 3, 672, 4, 672,
5, 672, 6, 672, 7, 672,
};
-vtkDICOMDictionary::Dict Dict375Data = {
+vtkDICOMDictionary::Dict Dict387Data = {
"LODOX_STATSCAN",
8,
8,
-Dict375TagHashTable,
-Dict375KeyHashTable,
-Dict375Contents
+Dict387TagHashTable,
+Dict387KeyHashTable,
+Dict387Contents
};
// ----- SIEMENS MED SMS USG ANTARES 3D VOLUME -----
-DictEntry Dict376Contents[] = {
+const DictEntry Dict388Contents[] = {
{ 0x0039, 0x0000, 0, VR::UN, VM::M1, "ReleaseVersion" },
{ 0x0039, 0x0003, 0, VR::UN, VM::M1, "VolumeAcquisitionDuration" },
{ 0x0039, 0x0004, 0, VR::UN, VM::M1, "VolumeRawDataType" },
@@ -22959,7 +23917,7 @@ DictEntry Dict376Contents[] = {
{ 0x0039, 0x00f6, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict376TagHashTable[] = {
+const unsigned short Dict388TagHashTable[] = {
137, 140, 136, 136, 136, 136, 136, 136, 143, 146,
149, 152, 155, 158, 161, 136, 164, 167, 170, 173,
136, 136, 136, 136, 176, 179, 184, 187, 190, 195,
@@ -23013,7 +23971,7 @@ unsigned short Dict376TagHashTable[] = {
86, 1, 44, 87, 1, 36, 64,
};
-unsigned short Dict376KeyHashTable[] = {
+const unsigned short Dict388KeyHashTable[] = {
136, 136, 137, 136, 140, 136, 145, 148, 136, 136,
153, 136, 136, 136, 158, 136, 136, 136, 136, 161,
166, 136, 136, 136, 136, 169, 136, 172, 136, 175,
@@ -23065,46 +24023,46 @@ unsigned short Dict376KeyHashTable[] = {
85, 60047, 94, 31579, 1, 60, 44115, 1, 8, 24323,
};
-vtkDICOMDictionary::Dict Dict376Data = {
+vtkDICOMDictionary::Dict Dict388Data = {
"SIEMENS MED SMS USG ANTARES 3D VOLUME",
136,
136,
-Dict376TagHashTable,
-Dict376KeyHashTable,
-Dict376Contents
+Dict388TagHashTable,
+Dict388KeyHashTable,
+Dict388Contents
};
// ----- 1.2.840.113681 -----
-DictEntry Dict377Contents[] = {
+const DictEntry Dict389Contents[] = {
{ 0x0019, 0x0010, 0, VR::ST, VM::M1, "CRImageParamsCommon" },
{ 0x0019, 0x0011, 0, VR::ST, VM::M1, "CRImageIPParamsSingle" },
{ 0x0019, 0x0012, 0, VR::ST, VM::M1, "CRImageIPParamsLeft" },
{ 0x0019, 0x0013, 0, VR::ST, VM::M1, "CRImageIPParamsRight" },
};
-unsigned short Dict377TagHashTable[] = {
+const unsigned short Dict389TagHashTable[] = {
5, 8, 11, 14, 0, 1, 1, 17, 1, 0,
16, 1, 3, 19, 1, 2, 18,
};
-unsigned short Dict377KeyHashTable[] = {
+const unsigned short Dict389KeyHashTable[] = {
5, 10, 13, 4, 0, 2, 1, 31079, 3, 6414,
1, 2, 26617, 1, 0, 12906,
};
-vtkDICOMDictionary::Dict Dict377Data = {
+vtkDICOMDictionary::Dict Dict389Data = {
"1.2.840.113681",
4,
4,
-Dict377TagHashTable,
-Dict377KeyHashTable,
-Dict377Contents
+Dict389TagHashTable,
+Dict389KeyHashTable,
+Dict389Contents
};
// ----- Philips PET Private Group -----
-DictEntry Dict378Contents[] = {
+const DictEntry Dict390Contents[] = {
{ 0x0511, 0x0000, 0, VR::US, VM::M1, "PrivateData" },
{ 0x0511, 0x0001, 0, VR::US, VM::M1, "PrivateData" },
{ 0x0511, 0x0002, 0, VR::OB, VM::M1, "PrivateData" },
@@ -23134,7 +24092,7 @@ DictEntry Dict378Contents[] = {
{ 0x7053, 0x00c2, 0, VR::UI, VM::M1, "" },
};
-unsigned short Dict378TagHashTable[] = {
+const unsigned short Dict390TagHashTable[] = {
28, 27, 27, 31, 34, 39, 42, 47, 50, 53,
56, 59, 62, 65, 68, 73, 76, 79, 82, 27,
85, 88, 91, 94, 97, 100, 103, 0, 1, 11,
@@ -23148,7 +24106,7 @@ unsigned short Dict378TagHashTable[] = {
1, 13, 7, 1, 10, 4,
};
-unsigned short Dict378KeyHashTable[] = {
+const unsigned short Dict390KeyHashTable[] = {
27, 28, 27, 45, 27, 27, 27, 48, 51, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
27, 84, 27, 27, 27, 27, 27, 0, 8, 0,
@@ -23160,64 +24118,64 @@ unsigned short Dict378KeyHashTable[] = {
25, 199, 26, 199, 1, 11, 56148,
};
-vtkDICOMDictionary::Dict Dict378Data = {
+vtkDICOMDictionary::Dict Dict390Data = {
"Philips PET Private Group",
27,
27,
-Dict378TagHashTable,
-Dict378KeyHashTable,
-Dict378Contents
+Dict390TagHashTable,
+Dict390KeyHashTable,
+Dict390Contents
};
// ----- GEMS-IT/Centricity RA600/7.0 -----
-DictEntry Dict379Contents[] = {
+const DictEntry Dict391Contents[] = {
{ 0x4113, 0x0010, 0, VR::UI, VM::M1, "NumberOfImagesInStudy" },
};
-unsigned short Dict379TagHashTable[] = {
+const unsigned short Dict391TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict379KeyHashTable[] = {
+const unsigned short Dict391KeyHashTable[] = {
2, 0, 1, 0, 48361,
};
-vtkDICOMDictionary::Dict Dict379Data = {
+vtkDICOMDictionary::Dict Dict391Data = {
"GEMS-IT/Centricity RA600/7.0",
1,
1,
-Dict379TagHashTable,
-Dict379KeyHashTable,
-Dict379Contents
+Dict391TagHashTable,
+Dict391KeyHashTable,
+Dict391Contents
};
// ----- syngoDynamics_Reporting -----
-DictEntry Dict380Contents[] = {
+const DictEntry Dict392Contents[] = {
{ 0x0021, 0x00AD, 0, VR::OB, VM::M1, "Data" },
};
-unsigned short Dict380TagHashTable[] = {
+const unsigned short Dict392TagHashTable[] = {
2, 0, 1, 0, 173,
};
-unsigned short Dict380KeyHashTable[] = {
+const unsigned short Dict392KeyHashTable[] = {
2, 0, 1, 0, 1343,
};
-vtkDICOMDictionary::Dict Dict380Data = {
+vtkDICOMDictionary::Dict Dict392Data = {
"syngoDynamics_Reporting",
-1,
-1,
-Dict380TagHashTable,
-Dict380KeyHashTable,
-Dict380Contents
+1,
+1,
+Dict392TagHashTable,
+Dict392KeyHashTable,
+Dict392Contents
};
// ----- Harmony R1.0 C3 -----
-DictEntry Dict381Contents[] = {
+const DictEntry Dict393Contents[] = {
{ 0x0019, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x0007, 0, VR::LO, VM::M1, "" },
@@ -23262,7 +24220,7 @@ DictEntry Dict381Contents[] = {
{ 0x0019, 0x00f2, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict381TagHashTable[] = {
+const unsigned short Dict393TagHashTable[] = {
43, 46, 49, 52, 42, 55, 42, 42, 42, 42,
42, 42, 58, 61, 64, 69, 74, 79, 84, 89,
42, 42, 92, 42, 95, 100, 107, 42, 42, 114,
@@ -23281,7 +24239,7 @@ unsigned short Dict381TagHashTable[] = {
1, 36, 237,
};
-unsigned short Dict381KeyHashTable[] = {
+const unsigned short Dict393KeyHashTable[] = {
42, 42, 42, 42, 42, 43, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
@@ -23297,18 +24255,18 @@ unsigned short Dict381KeyHashTable[] = {
38, 128, 39, 128, 40, 128, 41, 128,
};
-vtkDICOMDictionary::Dict Dict381Data = {
+vtkDICOMDictionary::Dict Dict393Data = {
"Harmony R1.0 C3",
42,
42,
-Dict381TagHashTable,
-Dict381KeyHashTable,
-Dict381Contents
+Dict393TagHashTable,
+Dict393KeyHashTable,
+Dict393Contents
};
// ----- Harmony R1.0 C2 -----
-DictEntry Dict382Contents[] = {
+const DictEntry Dict394Contents[] = {
{ 0x0019, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0019, 0x0001, 0, VR::UN, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::UN, VM::M1, "" },
@@ -23337,7 +24295,7 @@ DictEntry Dict382Contents[] = {
{ 0x0019, 0x0091, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict382TagHashTable[] = {
+const unsigned short Dict394TagHashTable[] = {
27, 30, 33, 36, 41, 46, 49, 26, 52, 26,
55, 26, 58, 61, 64, 26, 67, 70, 73, 76,
81, 26, 84, 87, 90, 95, 0, 1, 3, 3,
@@ -23350,7 +24308,7 @@ unsigned short Dict382TagHashTable[] = {
2, 1, 1, 21, 129, 2, 0, 0, 20, 128,
};
-unsigned short Dict382KeyHashTable[] = {
+const unsigned short Dict394KeyHashTable[] = {
26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 27, 0, 26, 0, 206,
@@ -23361,42 +24319,42 @@ unsigned short Dict382KeyHashTable[] = {
21, 206, 22, 206, 23, 206, 24, 206, 25, 206,
};
-vtkDICOMDictionary::Dict Dict382Data = {
+vtkDICOMDictionary::Dict Dict394Data = {
"Harmony R1.0 C2",
26,
26,
-Dict382TagHashTable,
-Dict382KeyHashTable,
-Dict382Contents
+Dict394TagHashTable,
+Dict394KeyHashTable,
+Dict394Contents
};
// ----- SEGAMI__MEMO -----
-DictEntry Dict383Contents[] = {
+const DictEntry Dict395Contents[] = {
{ 0x0035, 0x0097, 0, VR::SH, VM::M1, "" },
{ 0x0035, 0x0098, 0, VR::LT, VM::M1, "" },
};
-unsigned short Dict383TagHashTable[] = {
+const unsigned short Dict395TagHashTable[] = {
3, 6, 0, 1, 0, 151, 1, 1, 152,
};
-unsigned short Dict383KeyHashTable[] = {
+const unsigned short Dict395KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict383Data = {
+vtkDICOMDictionary::Dict Dict395Data = {
"SEGAMI__MEMO",
2,
2,
-Dict383TagHashTable,
-Dict383KeyHashTable,
-Dict383Contents
+Dict395TagHashTable,
+Dict395KeyHashTable,
+Dict395Contents
};
// ----- AGFA -----
-DictEntry Dict384Contents[] = {
+const DictEntry Dict396Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0011, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0013, 0, VR::LO, VM::M1, "" },
@@ -23410,7 +24368,7 @@ DictEntry Dict384Contents[] = {
{ 0x0019, 0x0015, 0, VR::LO, VM::M1, "DoseMonitoring" },
{ 0x0019, 0x0016, 0, VR::LO, VM::M1, "OtherInfo" },
{ 0x0019, 0x001a, 0, VR::LO, VM::M1, "ClippedExposureDeviation" },
-{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "Logarithmic PLT Full Scale" },
+{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "LogarithmicPLTFullScale" },
{ 0x0019, 0x0060, 0, VR::US, VM::M1, "TotalNumberSeries" },
{ 0x0019, 0x0061, 0, VR::SH, VM::M1, "SessionNumber" },
{ 0x0019, 0x0062, 0, VR::SH, VM::M1, "IDStationName" },
@@ -23422,7 +24380,7 @@ DictEntry Dict384Contents[] = {
{ 0x0019, 0x0093, 0, VR::CS, VM::M1, "Status" },
};
-unsigned short Dict384TagHashTable[] = {
+const unsigned short Dict396TagHashTable[] = {
23, 24, 27, 32, 23, 37, 44, 49, 52, 55,
58, 23, 63, 68, 23, 71, 76, 79, 23, 23,
23, 82, 23, 0, 1, 1, 17, 2, 0, 16,
@@ -23434,130 +24392,130 @@ unsigned short Dict384TagHashTable[] = {
19, 128, 1, 22, 147,
};
-unsigned short Dict384KeyHashTable[] = {
- 24, 23, 29, 32, 37, 42, 23, 23, 51, 23,
+const unsigned short Dict396KeyHashTable[] = {
+ 24, 23, 27, 32, 37, 42, 23, 23, 51, 23,
23, 23, 58, 23, 23, 23, 23, 63, 23, 23,
- 23, 23, 66, 0, 2, 13, 45429, 15, 16126, 1,
- 10, 3564, 2, 16, 446, 18, 53827, 2, 5, 61109,
+ 23, 23, 66, 0, 1, 15, 16126, 2, 10, 3564,
+ 13, 58343, 2, 16, 446, 18, 53827, 2, 5, 61109,
20, 56072, 4, 7, 15484, 9, 63060, 11, 49602, 12,
42521, 3, 8, 23404, 17, 16022, 19, 5701, 2, 21,
30571, 22, 15595, 1, 6, 40216, 6, 0, 233, 1,
233, 2, 233, 3, 233, 4, 233, 14, 37233,
};
-vtkDICOMDictionary::Dict Dict384Data = {
+vtkDICOMDictionary::Dict Dict396Data = {
"AGFA",
23,
23,
-Dict384TagHashTable,
-Dict384KeyHashTable,
-Dict384Contents
+Dict396TagHashTable,
+Dict396KeyHashTable,
+Dict396Contents
};
// ----- Philips Imaging DD 067 -----
-DictEntry Dict385Contents[] = {
+const DictEntry Dict397Contents[] = {
{ 0x4001, 0x0000, 0, VR::SQ, VM::M1, "" },
{ 0x4001, 0x0001, 0, VR::CS, VM::M1, "" },
{ 0x4001, 0x0008, 0, VR::CS, VM::M1, "" },
{ 0x4001, 0x0009, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict385TagHashTable[] = {
+const unsigned short Dict397TagHashTable[] = {
5, 10, 4, 4, 0, 2, 1, 1, 3, 9,
2, 0, 0, 2, 8,
};
-unsigned short Dict385KeyHashTable[] = {
+const unsigned short Dict397KeyHashTable[] = {
4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
2, 1345, 3, 1345,
};
-vtkDICOMDictionary::Dict Dict385Data = {
+vtkDICOMDictionary::Dict Dict397Data = {
"Philips Imaging DD 067",
4,
4,
-Dict385TagHashTable,
-Dict385KeyHashTable,
-Dict385Contents
+Dict397TagHashTable,
+Dict397KeyHashTable,
+Dict397Contents
};
// ----- DLX_EXAMS_01 -----
-DictEntry Dict386Contents[] = {
+const DictEntry Dict398Contents[] = {
{ 0x0015, 0x0001, 0, VR::DS, VM::M1, "StenosisCalibrationRatio" },
{ 0x0015, 0x0002, 0, VR::DS, VM::M1, "StenosisMagnification" },
{ 0x0015, 0x0003, 0, VR::DS, VM::M1, "CardiacCalibrationRatio" },
};
-unsigned short Dict386TagHashTable[] = {
+const unsigned short Dict398TagHashTable[] = {
3, 4, 7, 0, 1, 2, 3, 2, 0, 1,
1, 2,
};
-unsigned short Dict386KeyHashTable[] = {
+const unsigned short Dict398KeyHashTable[] = {
3, 4, 9, 0, 2, 0, 7265, 2, 44742, 1,
1, 40220,
};
-vtkDICOMDictionary::Dict Dict386Data = {
+vtkDICOMDictionary::Dict Dict398Data = {
"DLX_EXAMS_01",
3,
3,
-Dict386TagHashTable,
-Dict386KeyHashTable,
-Dict386Contents
+Dict398TagHashTable,
+Dict398KeyHashTable,
+Dict398Contents
};
// ----- Philips Imaging DD 065 -----
-DictEntry Dict387Contents[] = {
+const DictEntry Dict399Contents[] = {
{ 0x4007, 0x0000, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict387TagHashTable[] = {
+const unsigned short Dict399TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict387KeyHashTable[] = {
+const unsigned short Dict399KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict387Data = {
+vtkDICOMDictionary::Dict Dict399Data = {
"Philips Imaging DD 065",
1,
1,
-Dict387TagHashTable,
-Dict387KeyHashTable,
-Dict387Contents
+Dict399TagHashTable,
+Dict399KeyHashTable,
+Dict399Contents
};
// ----- GE_GROUP -----
-DictEntry Dict388Contents[] = {
+const DictEntry Dict400Contents[] = {
{ 0x6005, 0x0010, 0, VR::UT, VM::M1, "" },
};
-unsigned short Dict388TagHashTable[] = {
+const unsigned short Dict400TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict388KeyHashTable[] = {
+const unsigned short Dict400KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict388Data = {
+vtkDICOMDictionary::Dict Dict400Data = {
"GE_GROUP",
1,
1,
-Dict388TagHashTable,
-Dict388KeyHashTable,
-Dict388Contents
+Dict400TagHashTable,
+Dict400KeyHashTable,
+Dict400Contents
};
// ----- SIEMENS SYNGO OBJECT GRAPHICS -----
-DictEntry Dict389Contents[] = {
+const DictEntry Dict401Contents[] = {
{ 0x0071, 0x0000, 0, VR::SQ, VM::M1, "GraphicObjectSequence" },
{ 0x0071, 0x0001, 0, VR::SL, VM::M1, "FillStyleVersion" },
{ 0x0071, 0x0002, 0, VR::FL, VM::M4, "FillBackgroundColor" },
@@ -23682,7 +24640,7 @@ DictEntry Dict389Contents[] = {
{ 0x0071, 0x00B7, 0, VR::SL, VM::M1, "GraphicObjectReferenceLabel" },
};
-unsigned short Dict389TagHashTable[] = {
+const unsigned short Dict401TagHashTable[] = {
123, 128, 133, 138, 143, 146, 149, 154, 159, 162,
122, 122, 122, 122, 122, 122, 165, 168, 171, 174,
177, 180, 183, 186, 189, 192, 122, 122, 122, 122,
@@ -23732,7 +24690,7 @@ unsigned short Dict389TagHashTable[] = {
129,
};
-unsigned short Dict389KeyHashTable[] = {
+const unsigned short Dict401KeyHashTable[] = {
122, 122, 123, 130, 133, 136, 139, 122, 144, 122,
122, 122, 153, 122, 158, 122, 163, 166, 122, 169,
176, 122, 122, 179, 186, 122, 191, 194, 197, 200,
@@ -23780,18 +24738,18 @@ unsigned short Dict389KeyHashTable[] = {
2, 37, 30873, 82, 26040, 1, 12, 21249,
};
-vtkDICOMDictionary::Dict Dict389Data = {
+vtkDICOMDictionary::Dict Dict401Data = {
"SIEMENS SYNGO OBJECT GRAPHICS",
122,
122,
-Dict389TagHashTable,
-Dict389KeyHashTable,
-Dict389Contents
+Dict401TagHashTable,
+Dict401KeyHashTable,
+Dict401Contents
};
// ----- Visus Change -----
-DictEntry Dict390Contents[] = {
+const DictEntry Dict402Contents[] = {
{ 0x5533, 0x0033, 0, VR::SQ, VM::M1, "SaveSequence" },
{ 0x5533, 0x0035, 0, VR::DA, VM::M1, "SaveDate" },
{ 0x5533, 0x0037, 0, VR::LO, VM::M1, "SaveOriginator" },
@@ -23799,28 +24757,28 @@ DictEntry Dict390Contents[] = {
{ 0x5533, 0x003b, 0, VR::TM, VM::M1, "SaveTime" },
};
-unsigned short Dict390TagHashTable[] = {
+const unsigned short Dict402TagHashTable[] = {
5, 6, 5, 11, 16, 0, 2, 1, 53, 4,
59, 2, 0, 51, 3, 57, 1, 2, 55,
};
-unsigned short Dict390KeyHashTable[] = {
+const unsigned short Dict402KeyHashTable[] = {
6, 9, 12, 5, 15, 0, 1, 2, 39946, 1,
0, 60092, 1, 4, 33901, 2, 1, 48278, 3, 11769,
};
-vtkDICOMDictionary::Dict Dict390Data = {
+vtkDICOMDictionary::Dict Dict402Data = {
"Visus Change",
5,
5,
-Dict390TagHashTable,
-Dict390KeyHashTable,
-Dict390Contents
+Dict402TagHashTable,
+Dict402KeyHashTable,
+Dict402Contents
};
// ----- SIEMENS ISI -----
-DictEntry Dict391Contents[] = {
+const DictEntry Dict403Contents[] = {
{ 0x0003, 0x0008, 0, VR::US, VM::M1, "ISICommandField" },
{ 0x0003, 0x0011, 0, VR::US, VM::M1, "AttachIDApplicationCode" },
{ 0x0003, 0x0012, 0, VR::UL, VM::M1, "AttachIDMessageCount" },
@@ -23863,7 +24821,7 @@ DictEntry Dict391Contents[] = {
{ 0x4009, 0x00e3, 0, VR::LO, VM::M1, "ReportingRadiologist" },
};
-unsigned short Dict391TagHashTable[] = {
+const unsigned short Dict403TagHashTable[] = {
41, 44, 51, 56, 40, 40, 40, 61, 66, 40,
71, 78, 85, 40, 40, 88, 91, 94, 101, 110,
40, 115, 40, 118, 40, 40, 40, 121, 40, 40,
@@ -23881,7 +24839,7 @@ unsigned short Dict391TagHashTable[] = {
38, 225,
};
-unsigned short Dict391KeyHashTable[] = {
+const unsigned short Dict403KeyHashTable[] = {
41, 40, 40, 44, 47, 50, 53, 56, 61, 40,
40, 66, 69, 76, 79, 40, 40, 40, 82, 87,
92, 97, 100, 105, 40, 40, 108, 40, 111, 116,
@@ -23899,65 +24857,65 @@ unsigned short Dict391KeyHashTable[] = {
9, 42663, 2, 2, 37434, 21, 41031,
};
-vtkDICOMDictionary::Dict Dict391Data = {
+vtkDICOMDictionary::Dict Dict403Data = {
"SIEMENS ISI",
40,
40,
-Dict391TagHashTable,
-Dict391KeyHashTable,
-Dict391Contents
+Dict403TagHashTable,
+Dict403KeyHashTable,
+Dict403Contents
};
// ----- PHILIPS MR R5.6/PART -----
-DictEntry Dict392Contents[] = {
+const DictEntry Dict404Contents[] = {
{ 0x0019, 0x0000, 0, VR::DS, VM::M1, "FieldOfView" },
};
-unsigned short Dict392TagHashTable[] = {
+const unsigned short Dict404TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict392KeyHashTable[] = {
+const unsigned short Dict404KeyHashTable[] = {
2, 0, 1, 0, 16313,
};
-vtkDICOMDictionary::Dict Dict392Data = {
+vtkDICOMDictionary::Dict Dict404Data = {
"PHILIPS MR R5.6/PART",
1,
1,
-Dict392TagHashTable,
-Dict392KeyHashTable,
-Dict392Contents
+Dict404TagHashTable,
+Dict404KeyHashTable,
+Dict404Contents
};
// ----- METAEMOTION GINKGO -----
-DictEntry Dict393Contents[] = {
+const DictEntry Dict405Contents[] = {
{ 0x0011, 0x0001, 0, VR::LT, VM::M1, "KeyFileIndicator" },
{ 0x0011, 0x000B, 0, VR::LT, VM::M1, "SerializedDiagnoseAndMarkers" },
};
-unsigned short Dict393TagHashTable[] = {
+const unsigned short Dict405TagHashTable[] = {
3, 2, 0, 2, 0, 1, 1, 11,
};
-unsigned short Dict393KeyHashTable[] = {
+const unsigned short Dict405KeyHashTable[] = {
2, 3, 0, 2, 0, 16373, 1, 45377,
};
-vtkDICOMDictionary::Dict Dict393Data = {
+vtkDICOMDictionary::Dict Dict405Data = {
"METAEMOTION GINKGO",
2,
2,
-Dict393TagHashTable,
-Dict393KeyHashTable,
-Dict393Contents
+Dict405TagHashTable,
+Dict405KeyHashTable,
+Dict405Contents
};
// ----- GEMS_IDEN_01 -----
-DictEntry Dict394Contents[] = {
+const DictEntry Dict406Contents[] = {
{ 0x0009, 0x0001, 0, VR::LO, VM::M1, "FullFidelity" },
{ 0x0009, 0x0002, 0, VR::SH, VM::M1, "SuiteId" },
{ 0x0009, 0x0004, 0, VR::SH, VM::M1, "ProductId" },
@@ -23976,7 +24934,7 @@ DictEntry Dict394Contents[] = {
{ 0x0009, 0x00e9, 0, VR::SL, VM::M1, "ActualSeriesDataTimeStamp" },
};
-unsigned short Dict394TagHashTable[] = {
+const unsigned short Dict406TagHashTable[] = {
16, 16, 17, 20, 16, 16, 25, 16, 28, 35,
16, 42, 45, 48, 53, 16, 0, 1, 14, 232,
2, 4, 26, 15, 233, 1, 7, 47, 3, 0,
@@ -23985,7 +24943,7 @@ unsigned short Dict394TagHashTable[] = {
4, 13, 231, 2, 3, 23, 6, 39,
};
-unsigned short Dict394KeyHashTable[] = {
+const unsigned short Dict406KeyHashTable[] = {
17, 16, 20, 25, 16, 30, 16, 41, 44, 16,
16, 16, 47, 50, 16, 53, 0, 1, 6, 45802,
2, 0, 39865, 13, 31860, 2, 2, 9495, 8, 8204,
@@ -23994,88 +24952,111 @@ unsigned short Dict394KeyHashTable[] = {
1, 12, 17514, 2, 9, 34293, 11, 62425,
};
-vtkDICOMDictionary::Dict Dict394Data = {
+vtkDICOMDictionary::Dict Dict406Data = {
"GEMS_IDEN_01",
16,
16,
-Dict394TagHashTable,
-Dict394KeyHashTable,
-Dict394Contents
+Dict406TagHashTable,
+Dict406KeyHashTable,
+Dict406Contents
+};
+
+// ----- Silhouette Graphics Export V1.0 -----
+
+const DictEntry Dict407Contents[] = {
+{ 0x0029, 0x0000, 0, VR::UI, VM::M1, "" },
+};
+
+const unsigned short Dict407TagHashTable[] = {
+ 2, 0, 1, 0, 0,
+};
+
+const unsigned short Dict407KeyHashTable[] = {
+ 2, 0, 1, 0, 5381,
+};
+
+vtkDICOMDictionary::Dict Dict407Data = {
+"Silhouette Graphics Export V1.0",
+1,
+1,
+Dict407TagHashTable,
+Dict407KeyHashTable,
+Dict407Contents
};
// ----- SIEMENS MED ECAT FILE INFO -----
-DictEntry Dict395Contents[] = {
+const DictEntry Dict408Contents[] = {
{ 0x0021, 0x0000, 0, VR::OB, VM::M1, "ECATMainHeader" },
{ 0x0021, 0x0001, 0, VR::OB, VM::M1, "ECATImageSubheader" },
};
-unsigned short Dict395TagHashTable[] = {
+const unsigned short Dict408TagHashTable[] = {
3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict395KeyHashTable[] = {
+const unsigned short Dict408KeyHashTable[] = {
3, 2, 0, 2, 0, 2200, 1, 20300,
};
-vtkDICOMDictionary::Dict Dict395Data = {
+vtkDICOMDictionary::Dict Dict408Data = {
"SIEMENS MED ECAT FILE INFO",
2,
2,
-Dict395TagHashTable,
-Dict395KeyHashTable,
-Dict395Contents
+Dict408TagHashTable,
+Dict408KeyHashTable,
+Dict408Contents
};
// ----- SIEMENS CT APPL EVIDENCEDOCUMENT -----
-DictEntry Dict396Contents[] = {
+const DictEntry Dict409Contents[] = {
{ 0x0029, 0x0000, 0, VR::UT, VM::M1, "PrivateTaskDatamodel" },
};
-unsigned short Dict396TagHashTable[] = {
+const unsigned short Dict409TagHashTable[] = {
2, 0, 1, 0, 0,
};
-unsigned short Dict396KeyHashTable[] = {
+const unsigned short Dict409KeyHashTable[] = {
2, 0, 1, 0, 45534,
};
-vtkDICOMDictionary::Dict Dict396Data = {
+vtkDICOMDictionary::Dict Dict409Data = {
"SIEMENS CT APPL EVIDENCEDOCUMENT",
1,
1,
-Dict396TagHashTable,
-Dict396KeyHashTable,
-Dict396Contents
+Dict409TagHashTable,
+Dict409KeyHashTable,
+Dict409Contents
};
// ----- Viewing Protocol -----
-DictEntry Dict397Contents[] = {
+const DictEntry Dict410Contents[] = {
{ 0x0065, 0x0093, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict397TagHashTable[] = {
+const unsigned short Dict410TagHashTable[] = {
2, 0, 1, 0, 147,
};
-unsigned short Dict397KeyHashTable[] = {
+const unsigned short Dict410KeyHashTable[] = {
2, 0, 1, 0, 5381,
};
-vtkDICOMDictionary::Dict Dict397Data = {
+vtkDICOMDictionary::Dict Dict410Data = {
"Viewing Protocol",
1,
1,
-Dict397TagHashTable,
-Dict397KeyHashTable,
-Dict397Contents
+Dict410TagHashTable,
+Dict410KeyHashTable,
+Dict410Contents
};
// ----- SIEMENS DFR.01 MANIPULATED -----
-DictEntry Dict398Contents[] = {
+const DictEntry Dict411Contents[] = {
{ 0x0017, 0x0011, 0, VR::US, VM::M1, "" },
{ 0x0017, 0x0012, 0, VR::US, VM::M1, "" },
{ 0x0017, 0x0014, 0, VR::US, VM::M1, "" },
@@ -24106,7 +25087,7 @@ DictEntry Dict398Contents[] = {
{ 0x0017, 0x00a3, 0, VR::SH, VM::M1, "ImageNameExtension2" },
};
-unsigned short Dict398TagHashTable[] = {
+const unsigned short Dict411TagHashTable[] = {
28, 28, 29, 32, 35, 38, 43, 28, 50, 53,
58, 63, 66, 69, 72, 77, 80, 83, 28, 86,
91, 28, 94, 28, 97, 28, 100, 103, 0, 1,
@@ -24120,7 +25101,7 @@ unsigned short Dict398TagHashTable[] = {
1, 19, 120, 1, 20, 121,
};
-unsigned short Dict398KeyHashTable[] = {
+const unsigned short Dict411KeyHashTable[] = {
28, 29, 28, 28, 32, 35, 28, 28, 28, 28,
28, 28, 28, 28, 28, 74, 79, 28, 28, 82,
28, 28, 85, 88, 91, 28, 28, 28, 0, 1,
@@ -24133,18 +25114,18 @@ unsigned short Dict398KeyHashTable[] = {
55280, 1, 27, 55280,
};
-vtkDICOMDictionary::Dict Dict398Data = {
+vtkDICOMDictionary::Dict Dict411Data = {
"SIEMENS DFR.01 MANIPULATED",
28,
28,
-Dict398TagHashTable,
-Dict398KeyHashTable,
-Dict398Contents
+Dict411TagHashTable,
+Dict411KeyHashTable,
+Dict411Contents
};
// ----- BioPri -----
-DictEntry Dict399Contents[] = {
+const DictEntry Dict412Contents[] = {
{ 0x0009, 0x0000, 0, VR::LO, VM::M1, "" },
{ 0x0009, 0x0001, 0, VR::UN, VM::M1, "" },
{ 0x0009, 0x0002, 0, VR::UN, VM::M1, "" },
@@ -24157,32 +25138,32 @@ DictEntry Dict399Contents[] = {
{ 0x0009, 0x0010, 0, VR::UN, VM::M1, "" },
};
-unsigned short Dict399TagHashTable[] = {
+const unsigned short Dict412TagHashTable[] = {
11, 16, 21, 24, 27, 30, 10, 10, 33, 36,
0, 2, 3, 3, 8, 9, 2, 2, 2, 7,
8, 1, 5, 5, 1, 4, 4, 1, 6, 7,
1, 9, 16, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict399KeyHashTable[] = {
+const unsigned short Dict412KeyHashTable[] = {
10, 11, 10, 10, 10, 10, 10, 10, 10, 10,
0, 10, 0, 538, 1, 538, 2, 538, 3, 538,
4, 538, 5, 538, 6, 538, 7, 538, 8, 538,
9, 538,
};
-vtkDICOMDictionary::Dict Dict399Data = {
+vtkDICOMDictionary::Dict Dict412Data = {
"BioPri",
10,
10,
-Dict399TagHashTable,
-Dict399KeyHashTable,
-Dict399Contents
+Dict412TagHashTable,
+Dict412KeyHashTable,
+Dict412Contents
};
// ----- GEMS_FUNCTOOL_01 -----
-DictEntry Dict400Contents[] = {
+const DictEntry Dict413Contents[] = {
{ 0x0051, 0x0001, 0, VR::LO, VM::M1, "GroupName" },
{ 0x0051, 0x0002, 0, VR::LO, VM::M1, "FunctionName" },
{ 0x0051, 0x0003, 0, VR::SL, VM::M1, "Bias" },
@@ -24198,7 +25179,7 @@ DictEntry Dict400Contents[] = {
{ 0x0051, 0x000e, 0, VR::SL, VM::M1, "Hidden" },
};
-unsigned short Dict400TagHashTable[] = {
+const unsigned short Dict413TagHashTable[] = {
14, 17, 13, 20, 25, 28, 31, 34, 37, 40,
43, 46, 49, 0, 1, 10, 11, 1, 11, 12,
2, 0, 1, 12, 14, 1, 1, 2, 1, 2,
@@ -24207,7 +25188,7 @@ unsigned short Dict400TagHashTable[] = {
9, 10,
};
-unsigned short Dict400KeyHashTable[] = {
+const unsigned short Dict413KeyHashTable[] = {
13, 14, 19, 13, 22, 29, 32, 13, 13, 35,
38, 43, 46, 0, 2, 4, 35430, 5, 51288, 1,
7, 31826, 3, 1, 31080, 3, 19661, 9, 32853, 1,
@@ -24215,18 +25196,18 @@ unsigned short Dict400KeyHashTable[] = {
19301, 12, 55683, 1, 2, 60733, 1, 11, 39629,
};
-vtkDICOMDictionary::Dict Dict400Data = {
+vtkDICOMDictionary::Dict Dict413Data = {
"GEMS_FUNCTOOL_01",
13,
13,
-Dict400TagHashTable,
-Dict400KeyHashTable,
-Dict400Contents
+Dict413TagHashTable,
+Dict413KeyHashTable,
+Dict413Contents
};
// ----- Vital Images SW 3.4 -----
-DictEntry Dict401Contents[] = {
+const DictEntry Dict414Contents[] = {
{ 0x5653, 0x0010, 0, VR::OB, VM::M1, "SavedWorkflow" },
{ 0x5653, 0x0011, 0, VR::LO, VM::M1, "SavedWorkflowFileName" },
{ 0x5653, 0x0012, 0, VR::OB, VM::M1, "SavedWorkflowFileData" },
@@ -24245,7 +25226,7 @@ DictEntry Dict401Contents[] = {
{ 0x5653, 0x0025, 0, VR::SL, VM::M1, "SavedWorkflowDataLength" },
};
-unsigned short Dict401TagHashTable[] = {
+const unsigned short Dict414TagHashTable[] = {
16, 16, 17, 20, 16, 16, 16, 16, 23, 28,
33, 38, 43, 46, 49, 54, 0, 1, 8, 24,
1, 9, 25, 2, 2, 18, 12, 34, 2, 3,
@@ -24254,7 +25235,7 @@ unsigned short Dict401TagHashTable[] = {
4, 20, 14, 36, 2, 5, 21, 15, 37,
};
-unsigned short Dict401KeyHashTable[] = {
+const unsigned short Dict414KeyHashTable[] = {
17, 20, 16, 23, 26, 29, 32, 16, 16, 16,
16, 35, 38, 41, 50, 55, 0, 1, 11, 42451,
1, 5, 19824, 1, 0, 43211, 1, 1, 40701, 1,
@@ -24263,41 +25244,41 @@ unsigned short Dict401KeyHashTable[] = {
2, 8, 14641, 10, 24291, 2, 12, 52573, 15, 3896,
};
-vtkDICOMDictionary::Dict Dict401Data = {
+vtkDICOMDictionary::Dict Dict414Data = {
"Vital Images SW 3.4",
16,
16,
-Dict401TagHashTable,
-Dict401KeyHashTable,
-Dict401Contents
+Dict414TagHashTable,
+Dict414KeyHashTable,
+Dict414Contents
};
// ----- AMI Annotations_01 -----
-DictEntry Dict402Contents[] = {
+const DictEntry Dict415Contents[] = {
{ 0x3101, 0x0010, 0, VR::SQ, VM::M1, "AnnotationSequence" },
};
-unsigned short Dict402TagHashTable[] = {
+const unsigned short Dict415TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict402KeyHashTable[] = {
+const unsigned short Dict415KeyHashTable[] = {
2, 0, 1, 0, 13593,
};
-vtkDICOMDictionary::Dict Dict402Data = {
+vtkDICOMDictionary::Dict Dict415Data = {
"AMI Annotations_01",
1,
1,
-Dict402TagHashTable,
-Dict402KeyHashTable,
-Dict402Contents
+Dict415TagHashTable,
+Dict415KeyHashTable,
+Dict415Contents
};
// ----- CAMTRONICS -----
-DictEntry Dict403Contents[] = {
+const DictEntry Dict416Contents[] = {
{ 0x0029, 0x0010, 0, VR::LT, VM::M1, "Commentline" },
{ 0x0029, 0x0020, 0, VR::DS, VM::M1, "EdgeEnhancementCoefficient" },
{ 0x0029, 0x0050, 0, VR::LT, VM::M1, "SceneText" },
@@ -24307,30 +25288,30 @@ DictEntry Dict403Contents[] = {
{ 0x0029, 0x0090, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict403TagHashTable[] = {
+const unsigned short Dict416TagHashTable[] = {
7, 8, 13, 18, 21, 24, 7, 0, 2, 0,
16, 2, 80, 2, 1, 32, 3, 96, 1, 5,
128, 1, 4, 112, 1, 6, 144,
};
-unsigned short Dict403KeyHashTable[] = {
+const unsigned short Dict416KeyHashTable[] = {
7, 8, 11, 16, 19, 22, 7, 0, 1, 5,
22482, 2, 0, 13618, 2, 13114, 1, 1, 33636, 1,
3, 30351, 2, 4, 10278, 6, 768,
};
-vtkDICOMDictionary::Dict Dict403Data = {
+vtkDICOMDictionary::Dict Dict416Data = {
"CAMTRONICS",
7,
7,
-Dict403TagHashTable,
-Dict403KeyHashTable,
-Dict403Contents
+Dict416TagHashTable,
+Dict416KeyHashTable,
+Dict416Contents
};
// ----- Applicare/Print/Version 5.1 -----
-DictEntry Dict404Contents[] = {
+const DictEntry Dict417Contents[] = {
{ 0x4101, 0x0001, 0, VR::UL, VM::M1, "MaskState" },
{ 0x4101, 0x0002, 0, VR::SQ, VM::M1, "Annotations" },
{ 0x4101, 0x0003, 0, VR::LO, VM::M1, "Font" },
@@ -24342,32 +25323,32 @@ DictEntry Dict404Contents[] = {
{ 0x4101, 0x0009, 0, VR::US, VM::M1, "ShowCaliper" },
};
-unsigned short Dict404TagHashTable[] = {
+const unsigned short Dict417TagHashTable[] = {
9, 10, 13, 9, 16, 19, 22, 25, 30, 0,
1, 2, 3, 1, 1, 2, 1, 4, 5, 1,
3, 4, 1, 6, 7, 2, 5, 6, 8, 9,
2, 0, 1, 7, 8,
};
-unsigned short Dict404KeyHashTable[] = {
+const unsigned short Dict417KeyHashTable[] = {
10, 9, 13, 16, 19, 22, 27, 30, 33, 0,
1, 4, 7803, 1, 1, 32969, 1, 5, 37252, 1,
8, 18802, 2, 6, 44289, 7, 40123, 1, 0, 19596,
1, 2, 60781, 1, 3, 34391,
};
-vtkDICOMDictionary::Dict Dict404Data = {
+vtkDICOMDictionary::Dict Dict417Data = {
"Applicare/Print/Version 5.1",
9,
9,
-Dict404TagHashTable,
-Dict404KeyHashTable,
-Dict404Contents
+Dict417TagHashTable,
+Dict417KeyHashTable,
+Dict417Contents
};
// ----- GEHC_CT_ADVAPP_001 -----
-DictEntry Dict405Contents[] = {
+const DictEntry Dict418Contents[] = {
{ 0x0053, 0x0020, 0, VR::IS, VM::M1, "TableSpeedNotReachesTargetFlag" },
{ 0x0053, 0x0040, 0, VR::SH, VM::M1, "IterativeReconAnnotation" },
{ 0x0053, 0x0041, 0, VR::SH, VM::M1, "IterativeReconMode" },
@@ -24397,7 +25378,7 @@ DictEntry Dict405Contents[] = {
{ 0x0053, 0x0079, 0, VR::LO, VM::M1, "MultiEnergyAcqMethod" },
{ 0x0053, 0x007A, 0, VR::SH, VM::M1, "MultiEnergyFeatAnnotName" },
{ 0x0053, 0x007B, 0, VR::SH, VM::M1, "MultiEnergyNoiseReduced" },
-{ 0x0053, 0x007C, 0, VR::LO, VM::M1, "MultiEnergyNoiseReducdeMethod" },
+{ 0x0053, 0x007C, 0, VR::LO, VM::M1, "MultiEnergyNoiseReduceMethod" },
{ 0x0053, 0x007D, 0, VR::LO, VM::M1, "SubOptimalIQString" },
{ 0x0053, 0x007E, 0, VR::DS, VM::M1, "MultiEnergyHighLowRatio" },
{ 0x0053, 0x007F, 0, VR::DS, VM::M1, "MultiEnergyDutyCycle" },
@@ -24432,7 +25413,7 @@ DictEntry Dict405Contents[] = {
{ 0x0053, 0x009F, 0, VR::LO, VM::M1TN, "MultiEnergyNoiseRedString" },
};
-unsigned short Dict405TagHashTable[] = {
+const unsigned short Dict418TagHashTable[] = {
62, 62, 62, 62, 62, 62, 62, 62, 63, 66,
62, 69, 72, 75, 78, 81, 84, 89, 94, 99,
104, 107, 110, 113, 116, 119, 122, 125, 128, 131,
@@ -24459,68 +25440,68 @@ unsigned short Dict405TagHashTable[] = {
15, 106, 1, 14, 105, 1, 13, 104,
};
-unsigned short Dict405KeyHashTable[] = {
+const unsigned short Dict418KeyHashTable[] = {
63, 66, 69, 72, 62, 75, 80, 62, 85, 88,
62, 93, 96, 62, 62, 99, 102, 105, 110, 113,
- 62, 62, 118, 121, 124, 127, 130, 133, 62, 136,
- 62, 62, 141, 62, 62, 144, 147, 152, 155, 158,
- 62, 62, 165, 170, 62, 175, 62, 180, 183, 190,
- 193, 196, 62, 199, 202, 62, 205, 208, 62, 211,
- 214, 221, 0, 1, 44, 27548, 1, 6, 63239, 1,
+ 62, 62, 118, 62, 121, 124, 127, 130, 62, 133,
+ 62, 62, 138, 62, 62, 141, 144, 149, 152, 155,
+ 62, 62, 162, 167, 62, 172, 62, 177, 180, 187,
+ 190, 193, 62, 198, 201, 62, 204, 207, 62, 210,
+ 213, 220, 0, 1, 44, 27548, 1, 6, 63239, 1,
51, 18530, 1, 14, 11761, 2, 15, 21939, 49, 22296,
2, 12, 35503, 30, 22440, 1, 46, 45856, 2, 11,
14497, 53, 17487, 1, 25, 46296, 1, 10, 23489, 1,
42, 52010, 1, 48, 30604, 2, 16, 10503, 27, 15851,
1, 1, 20951, 2, 3, 39321, 31, 25828, 1, 37,
-25160, 1, 29, 52753, 1, 35, 32349, 1, 36, 11679,
- 1, 26, 24117, 1, 47, 19118, 2, 7, 35629, 18,
-33070, 1, 17, 49494, 1, 22, 51192, 2, 41, 5460,
- 61, 43197, 1, 0, 60877, 1, 23, 16858, 3, 9,
-18183, 24, 16858, 34, 43180, 2, 39, 58808, 54, 1754,
- 2, 33, 37351, 57, 48169, 2, 13, 36912, 59, 27885,
- 1, 52, 24200, 3, 2, 40673, 8, 17968, 32, 23472,
- 1, 40, 41757, 1, 5, 40168, 1, 21, 56836, 1,
- 45, 39096, 1, 58, 62935, 1, 56, 36614, 1, 20,
-46221, 1, 4, 57645, 3, 28, 56356, 50, 7785, 60,
- 8845, 4, 19, 52485, 38, 3709, 43, 27547, 55, 49177,
+25160, 1, 35, 32349, 1, 36, 11679, 1, 26, 24117,
+ 1, 47, 19118, 2, 7, 35629, 18, 33070, 1, 17,
+49494, 1, 22, 51192, 2, 41, 5460, 61, 43197, 1,
+ 0, 60877, 1, 23, 16858, 3, 9, 18183, 24, 16858,
+ 34, 43180, 2, 39, 58808, 54, 1754, 2, 33, 37351,
+ 57, 48169, 2, 13, 36912, 59, 27885, 1, 52, 24200,
+ 3, 2, 40673, 8, 17968, 32, 23472, 1, 40, 41757,
+ 1, 5, 40168, 2, 21, 56836, 29, 40641, 1, 45,
+39096, 1, 58, 62935, 1, 56, 36614, 1, 20, 46221,
+ 1, 4, 57645, 3, 28, 56356, 50, 7785, 60, 8845,
+ 4, 19, 52485, 38, 3709, 43, 27547, 55, 49177,
};
-vtkDICOMDictionary::Dict Dict405Data = {
+vtkDICOMDictionary::Dict Dict418Data = {
"GEHC_CT_ADVAPP_001",
62,
62,
-Dict405TagHashTable,
-Dict405KeyHashTable,
-Dict405Contents
+Dict418TagHashTable,
+Dict418KeyHashTable,
+Dict418Contents
};
// ----- NUD_PRIVATE -----
-DictEntry Dict406Contents[] = {
+const DictEntry Dict419Contents[] = {
{ 0x7777, 0x0002, 0, VR::UT, VM::M1, "Interfile" },
{ 0x7777, 0x0005, 0, VR::IS, VM::M1, "" },
};
-unsigned short Dict406TagHashTable[] = {
+const unsigned short Dict419TagHashTable[] = {
3, 6, 0, 1, 0, 2, 1, 1, 5,
};
-unsigned short Dict406KeyHashTable[] = {
+const unsigned short Dict419KeyHashTable[] = {
2, 3, 0, 2, 0, 47187, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict406Data = {
+vtkDICOMDictionary::Dict Dict419Data = {
"NUD_PRIVATE",
2,
2,
-Dict406TagHashTable,
-Dict406KeyHashTable,
-Dict406Contents
+Dict419TagHashTable,
+Dict419KeyHashTable,
+Dict419Contents
};
// ----- astm.org/diconde/iod/NdeCtCalibrationData -----
-DictEntry Dict407Contents[] = {
+const DictEntry Dict420Contents[] = {
{ 0x0009, 0x0040, 0, VR::SQ, VM::M1, "DarkCurrentSequence" },
{ 0x0009, 0x0050, 0, VR::OW, VM::M1, "DarkCurrentCounts" },
{ 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" },
@@ -24536,7 +25517,7 @@ DictEntry Dict407Contents[] = {
{ 0x0009, 0x0099, 0, VR::LT, VM::M1, "CalibrationNotes" },
};
-unsigned short Dict407TagHashTable[] = {
+const unsigned short Dict420TagHashTable[] = {
14, 13, 13, 17, 22, 25, 28, 31, 36, 39,
44, 13, 13, 0, 1, 2, 96, 2, 3, 112,
12, 153, 1, 4, 113, 1, 5, 114, 1, 6,
@@ -24544,7 +25525,7 @@ unsigned short Dict407TagHashTable[] = {
9, 118, 11, 128, 2, 1, 80, 10, 119,
};
-unsigned short Dict407KeyHashTable[] = {
+const unsigned short Dict420KeyHashTable[] = {
14, 19, 22, 13, 25, 30, 35, 13, 38, 43,
13, 13, 13, 0, 2, 7, 25645, 11, 50357, 1,
3, 29772, 1, 0, 24037, 2, 2, 48192, 5, 8278,
@@ -24552,45 +25533,45 @@ unsigned short Dict407KeyHashTable[] = {
9334, 10, 7464, 2, 4, 53052, 9, 5902,
};
-vtkDICOMDictionary::Dict Dict407Data = {
+vtkDICOMDictionary::Dict Dict420Data = {
"astm.org/diconde/iod/NdeCtCalibrationData",
13,
13,
-Dict407TagHashTable,
-Dict407KeyHashTable,
-Dict407Contents
+Dict420TagHashTable,
+Dict420KeyHashTable,
+Dict420Contents
};
// ----- SPI-P-Private-CWS Release 1 -----
-DictEntry Dict408Contents[] = {
+const DictEntry Dict421Contents[] = {
{ 0x0021, 0x0000, 0, VR::LT, VM::M1, "WindowOfImagesID" },
{ 0x0021, 0x0001, 0, VR::CS, VM::M1, "WindowOfImagesType" },
{ 0x0021, 0x0002, 0, VR::IS, VM::M1TN, "WindowOfImagesScope" },
};
-unsigned short Dict408TagHashTable[] = {
+const unsigned short Dict421TagHashTable[] = {
4, 3, 7, 0, 1, 0, 0, 2, 1, 1,
2, 2,
};
-unsigned short Dict408KeyHashTable[] = {
+const unsigned short Dict421KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 12497, 1, 65208, 2,
51040,
};
-vtkDICOMDictionary::Dict Dict408Data = {
+vtkDICOMDictionary::Dict Dict421Data = {
"SPI-P-Private-CWS Release 1",
3,
3,
-Dict408TagHashTable,
-Dict408KeyHashTable,
-Dict408Contents
+Dict421TagHashTable,
+Dict421KeyHashTable,
+Dict421Contents
};
// ----- GEMS_SENO_02 -----
-DictEntry Dict409Contents[] = {
+const DictEntry Dict422Contents[] = {
{ 0x0045, 0x0004, 0, VR::CS, VM::M1, "AES" },
{ 0x0045, 0x0006, 0, VR::DS, VM::M1, "Angulation" },
{ 0x0045, 0x0009, 0, VR::DS, VM::M1, "RealMagnificationFactor" },
@@ -24654,73 +25635,75 @@ DictEntry Dict409Contents[] = {
{ 0x0045, 0x00A6, 0, VR::UI, VM::M1, "SOPInstanceUIDForLossyCompression" },
{ 0x0045, 0x00A7, 0, VR::LT, VM::M1, "ReconstructionParameters" },
{ 0x0045, 0x00A8, 0, VR::DS, VM::M1, "EntranceDoseIndGyForCompleteDBTSequence" },
+{ 0x0045, 0x00AD, 0, VR::LO, VM::M1TN, "" },
+};
+
+const unsigned short Dict422TagHashTable[] = {
+ 65, 64, 68, 64, 64, 64, 64, 64, 71, 74,
+ 64, 64, 77, 80, 64, 83, 86, 91, 96, 101,
+ 104, 107, 112, 119, 64, 124, 127, 130, 133, 136,
+ 64, 139, 142, 149, 156, 161, 166, 173, 178, 185,
+ 64, 64, 64, 192, 195, 198, 201, 206, 64, 64,
+ 64, 64, 209, 64, 64, 212, 215, 218, 221, 224,
+ 64, 227, 230, 233, 0, 1, 0, 4, 1, 1,
+ 6, 1, 4, 12, 1, 5, 13, 1, 35, 73,
+ 1, 2, 9, 1, 3, 11, 2, 9, 20, 41,
+ 85, 2, 10, 21, 40, 84, 2, 11, 22, 43,
+ 87, 1, 42, 86, 1, 37, 81, 2, 6, 17,
+ 36, 80, 3, 7, 18, 39, 83, 55, 144, 2,
+ 8, 19, 38, 82, 1, 13, 29, 1, 14, 30,
+ 1, 15, 31, 1, 45, 89, 1, 44, 88, 1,
+ 12, 27, 3, 20, 36, 51, 101, 60, 166, 3,
+ 21, 37, 50, 100, 61, 167, 2, 22, 38, 59,
+ 164, 2, 23, 39, 52, 102, 3, 16, 32, 47,
+ 97, 58, 162, 2, 17, 33, 46, 96, 3, 18,
+ 34, 49, 99, 56, 160, 3, 19, 35, 48, 98,
+ 57, 161, 1, 63, 173, 1, 24, 40, 1, 25,
+ 41, 2, 26, 42, 62, 168, 1, 27, 43, 1,
+ 53, 113, 1, 54, 114, 1, 31, 60, 1, 32,
+ 61, 1, 33, 62, 1, 34, 63, 1, 28, 57,
+ 1, 29, 58, 1, 30, 59,
+};
+
+const unsigned short Dict422KeyHashTable[] = {
+ 65, 68, 64, 71, 64, 74, 81, 84, 87, 90,
+ 93, 64, 96, 64, 99, 102, 64, 64, 105, 64,
+ 64, 108, 113, 64, 118, 64, 121, 128, 131, 134,
+ 139, 144, 149, 154, 157, 64, 160, 163, 166, 171,
+ 176, 64, 179, 64, 182, 64, 185, 64, 192, 195,
+ 198, 64, 203, 64, 208, 211, 214, 64, 217, 220,
+ 227, 230, 64, 64, 0, 1, 14, 2092, 1, 2,
+26934, 1, 13, 3712, 3, 6, 42766, 27, 20105, 63,
+ 84, 1, 54, 39771, 1, 19, 190, 1, 46, 63783,
+ 1, 47, 63783, 1, 32, 21408, 1, 29, 19452, 1,
+ 62, 52307, 1, 25, 44181, 1, 58, 16673, 2, 57,
+44440, 59, 33457, 2, 18, 48831, 28, 41874, 1, 4,
+52391, 3, 9, 55321, 11, 36206, 23, 6887, 1, 35,
+56906, 1, 22, 46780, 2, 43, 19364, 56, 47940, 2,
+ 0, 8002, 53, 7442, 2, 12, 28929, 17, 62639, 2,
+ 33, 59491, 50, 9218, 1, 60, 26155, 1, 37, 29117,
+ 1, 26, 33043, 1, 8, 60324, 2, 30, 52136, 38,
+21624, 2, 34, 21132, 44, 26066, 1, 5, 11847, 1,
+ 7, 37129, 1, 36, 710, 3, 3, 58581, 10, 40279,
+ 31, 24949, 1, 20, 19146, 1, 52, 26194, 2, 21,
+57911, 45, 20606, 2, 15, 4917, 39, 55896, 1, 40,
+23141, 1, 1, 58911, 1, 41, 52049, 1, 51, 8027,
+ 3, 42, 46789, 55, 47343, 61, 17716, 1, 49, 20018,
+ 3, 16, 58686, 24, 17156, 48, 27717,
};
-unsigned short Dict409TagHashTable[] = {
- 64, 67, 63, 72, 63, 63, 63, 63, 63, 75,
- 78, 63, 81, 63, 84, 63, 87, 92, 97, 102,
- 107, 110, 113, 118, 123, 126, 129, 132, 135, 140,
- 63, 63, 143, 148, 153, 156, 163, 170, 177, 182,
- 189, 192, 195, 63, 63, 198, 201, 204, 207, 210,
- 63, 63, 213, 63, 63, 216, 63, 219, 222, 225,
- 228, 63, 231, 0, 1, 29, 58, 2, 0, 4,
- 30, 59, 1, 1, 6, 1, 4, 12, 1, 5,
- 13, 1, 35, 73, 1, 2, 9, 2, 3, 11,
- 41, 85, 2, 9, 20, 40, 84, 2, 10, 21,
- 43, 87, 2, 11, 22, 42, 86, 1, 37, 81,
- 1, 36, 80, 2, 6, 17, 39, 83, 2, 7,
- 18, 38, 82, 1, 8, 19, 1, 55, 144, 1,
- 13, 29, 1, 14, 30, 2, 15, 31, 45, 89,
- 1, 44, 88, 2, 12, 27, 51, 101, 2, 20,
- 36, 50, 100, 1, 21, 37, 3, 22, 38, 52,
- 102, 60, 166, 3, 23, 39, 47, 97, 61, 167,
- 3, 16, 32, 46, 96, 59, 164, 2, 17, 33,
- 49, 99, 3, 18, 34, 48, 98, 58, 162, 1,
- 19, 35, 1, 56, 160, 1, 57, 161, 1, 24,
- 40, 1, 25, 41, 1, 26, 42, 1, 27, 43,
- 1, 62, 168, 1, 53, 113, 1, 54, 114, 1,
- 31, 60, 1, 32, 61, 1, 33, 62, 1, 34,
- 63, 1, 28, 57,
-};
-
-unsigned short Dict409KeyHashTable[] = {
- 64, 63, 63, 63, 63, 67, 63, 70, 73, 63,
- 63, 76, 81, 86, 63, 63, 63, 63, 95, 98,
- 63, 101, 63, 104, 109, 112, 115, 122, 125, 63,
- 128, 131, 63, 63, 63, 138, 63, 143, 63, 152,
- 157, 162, 165, 170, 173, 63, 176, 63, 63, 181,
- 184, 187, 190, 63, 193, 196, 63, 199, 202, 209,
- 218, 223, 226, 0, 1, 37, 38942, 1, 60, 65060,
- 1, 49, 62987, 1, 4, 25136, 2, 0, 55981, 61,
-26320, 2, 13, 62025, 22, 36080, 4, 14, 2125, 16,
-50256, 18, 52727, 23, 755, 1, 54, 15436, 1, 10,
-33637, 1, 20, 63141, 2, 25, 3272, 34, 39152, 1,
- 40, 12066, 1, 17, 33466, 3, 2, 59609, 27, 8981,
- 45, 31336, 1, 39, 21415, 1, 53, 31486, 1, 19,
-26199, 3, 26, 14843, 58, 31501, 62, 53137, 2, 41,
-50795, 52, 26610, 4, 9, 7307, 12, 4422, 33, 2181,
- 57, 7696, 2, 29, 63451, 44, 27520, 2, 31, 61754,
- 48, 18795, 1, 1, 42162, 2, 28, 16532, 59, 39189,
- 1, 11, 55505, 1, 56, 58063, 2, 6, 63209, 24,
- 2865, 1, 38, 5323, 1, 5, 41162, 1, 36, 24647,
- 1, 43, 19671, 1, 30, 39440, 1, 50, 21847, 1,
- 51, 26879, 3, 3, 15820, 8, 11349, 46, 29426, 4,
- 7, 16913, 15, 21639, 21, 38025, 47, 29426, 2, 32,
-17586, 42, 3841, 1, 35, 63010, 1, 55, 1283,
-};
-
-vtkDICOMDictionary::Dict Dict409Data = {
-"GEMS_SENO_02",
-63,
-63,
-Dict409TagHashTable,
-Dict409KeyHashTable,
-Dict409Contents
+vtkDICOMDictionary::Dict Dict422Data = {
+"GEMS_SENO_02",
+64,
+64,
+Dict422TagHashTable,
+Dict422KeyHashTable,
+Dict422Contents
};
// ----- BioPri3D -----
-DictEntry Dict410Contents[] = {
+const DictEntry Dict423Contents[] = {
{ 0x0011, 0x0020, 0, VR::UL, VM::M1, "" },
{ 0x0011, 0x0024, 0, VR::DS, VM::M1TN, "" },
{ 0x0011, 0x0030, 0, VR::LO, VM::M1, "" },
@@ -24741,7 +25724,7 @@ DictEntry Dict410Contents[] = {
{ 0x0063, 0x0035, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict410TagHashTable[] = {
+const unsigned short Dict423TagHashTable[] = {
18, 18, 19, 18, 22, 18, 25, 28, 33, 36,
18, 18, 39, 44, 51, 56, 18, 61, 0, 1,
14, 12, 1, 5, 57, 1, 10, 226, 2, 6,
@@ -24751,7 +25734,7 @@ unsigned short Dict410TagHashTable[] = {
53, 2, 1, 36, 4, 50,
};
-unsigned short Dict410KeyHashTable[] = {
+const unsigned short Dict423KeyHashTable[] = {
18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 19, 0, 18,
0, 298, 1, 298, 2, 298, 3, 298, 4, 298,
@@ -24760,42 +25743,42 @@ unsigned short Dict410KeyHashTable[] = {
15, 298, 16, 298, 17, 298,
};
-vtkDICOMDictionary::Dict Dict410Data = {
+vtkDICOMDictionary::Dict Dict423Data = {
"BioPri3D",
18,
18,
-Dict410TagHashTable,
-Dict410KeyHashTable,
-Dict410Contents
+Dict423TagHashTable,
+Dict423KeyHashTable,
+Dict423Contents
};
// ----- TOSHIBA_SR -----
-DictEntry Dict411Contents[] = {
+const DictEntry Dict424Contents[] = {
{ 0x7015, 0x0010, 0, VR::OB, VM::M1, "" },
{ 0x7015, 0x0060, 0, VR::OB, VM::M1, "" },
};
-unsigned short Dict411TagHashTable[] = {
+const unsigned short Dict424TagHashTable[] = {
3, 6, 0, 1, 1, 96, 1, 0, 16,
};
-unsigned short Dict411KeyHashTable[] = {
+const unsigned short Dict424KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict411Data = {
+vtkDICOMDictionary::Dict Dict424Data = {
"TOSHIBA_SR",
2,
2,
-Dict411TagHashTable,
-Dict411KeyHashTable,
-Dict411Contents
+Dict424TagHashTable,
+Dict424KeyHashTable,
+Dict424Contents
};
// ----- DIDI TO PCR 1.1 -----
-DictEntry Dict412Contents[] = {
+const DictEntry Dict425Contents[] = {
{ 0x0019, 0x0022, 0, VR::LO, VM::M1, "RouteAET" },
{ 0x0019, 0x0023, 0, VR::DS, VM::M1, "PCRPrintScale" },
{ 0x0019, 0x0024, 0, VR::ST, VM::M1, "PCRPrintJobEnd" },
@@ -24840,7 +25823,7 @@ DictEntry Dict412Contents[] = {
{ 0x0089, 0x0010, 0, VR::SQ, VM::M1, "StampImageSequence" },
};
-unsigned short Dict412TagHashTable[] = {
+const unsigned short Dict425TagHashTable[] = {
43, 46, 49, 52, 42, 55, 58, 61, 64, 67,
70, 73, 78, 83, 88, 91, 94, 99, 104, 111,
118, 127, 134, 139, 144, 147, 42, 42, 42, 150,
@@ -24859,7 +25842,7 @@ unsigned short Dict412TagHashTable[] = {
1, 41, 16,
};
-unsigned short Dict412KeyHashTable[] = {
+const unsigned short Dict425KeyHashTable[] = {
42, 42, 43, 48, 53, 42, 58, 42, 42, 42,
42, 61, 64, 42, 69, 72, 42, 42, 75, 78,
42, 81, 84, 89, 96, 42, 42, 42, 99, 42,
@@ -24878,45 +25861,45 @@ unsigned short Dict412KeyHashTable[] = {
7, 759,
};
-vtkDICOMDictionary::Dict Dict412Data = {
+vtkDICOMDictionary::Dict Dict425Data = {
"DIDI TO PCR 1.1",
42,
42,
-Dict412TagHashTable,
-Dict412KeyHashTable,
-Dict412Contents
+Dict425TagHashTable,
+Dict425KeyHashTable,
+Dict425Contents
};
// ----- SIEMENS MEDCOM OOG -----
-DictEntry Dict413Contents[] = {
+const DictEntry Dict426Contents[] = {
{ 0x0029, 0x0008, 0, VR::CS, VM::M1, "MedComOOGType" },
{ 0x0029, 0x0009, 0, VR::LO, VM::M1, "MedComOOGVersion" },
{ 0x0029, 0x0010, 0, VR::OB, VM::M1, "MedComOOGInfo" },
};
-unsigned short Dict413TagHashTable[] = {
+const unsigned short Dict426TagHashTable[] = {
4, 3, 9, 0, 2, 0, 8, 2, 16, 1,
1, 9,
};
-unsigned short Dict413KeyHashTable[] = {
+const unsigned short Dict426KeyHashTable[] = {
4, 7, 10, 0, 1, 0, 36427, 1, 2, 31630,
1, 1, 38561,
};
-vtkDICOMDictionary::Dict Dict413Data = {
+vtkDICOMDictionary::Dict Dict426Data = {
"SIEMENS MEDCOM OOG",
3,
3,
-Dict413TagHashTable,
-Dict413KeyHashTable,
-Dict413Contents
+Dict426TagHashTable,
+Dict426KeyHashTable,
+Dict426Contents
};
// ----- astm.org/diconde/iod/NdeDxDetector -----
-DictEntry Dict414Contents[] = {
+const DictEntry Dict427Contents[] = {
{ 0x0009, 0x0011, 0, VR::DS, VM::M1, "InternalDetectorFrameTime" },
{ 0x0009, 0x0012, 0, VR::DS, VM::M1, "NumberOfFramesIntegrated" },
{ 0x0009, 0x0020, 0, VR::SQ, VM::M1, "DetectorTemperatureSequence" },
@@ -24926,30 +25909,30 @@ DictEntry Dict414Contents[] = {
{ 0x0009, 0x0028, 0, VR::DS, VM::M1, "SensorTemperature" },
};
-unsigned short Dict414TagHashTable[] = {
+const unsigned short Dict427TagHashTable[] = {
7, 8, 7, 11, 7, 16, 21, 0, 1, 3,
34, 2, 0, 17, 4, 36, 2, 5, 38, 6,
40, 2, 1, 18, 2, 32,
};
-unsigned short Dict414KeyHashTable[] = {
+const unsigned short Dict427KeyHashTable[] = {
8, 7, 13, 16, 7, 19, 24, 0, 2, 0,
20186, 6, 21387, 1, 3, 20978, 1, 5, 52094, 2,
1, 53765, 2, 8567, 1, 4, 7561,
};
-vtkDICOMDictionary::Dict Dict414Data = {
+vtkDICOMDictionary::Dict Dict427Data = {
"astm.org/diconde/iod/NdeDxDetector",
7,
7,
-Dict414TagHashTable,
-Dict414KeyHashTable,
-Dict414Contents
+Dict427TagHashTable,
+Dict427KeyHashTable,
+Dict427Contents
};
// ----- PMTF INFORMATION DATA -----
-DictEntry Dict415Contents[] = {
+const DictEntry Dict428Contents[] = {
{ 0x0029, 0x0001, 0, VR::SQ, VM::M1, "" },
{ 0x0029, 0x0031, 0, VR::LO, VM::M1, "PMTFInformation1" },
{ 0x0029, 0x0032, 0, VR::UL, VM::M1, "PMTFInformation2" },
@@ -24960,30 +25943,30 @@ DictEntry Dict415Contents[] = {
{ 0x7015, 0x0073, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict415TagHashTable[] = {
+const unsigned short Dict428TagHashTable[] = {
9, 8, 14, 19, 8, 24, 8, 27, 0, 2,
0, 1, 1, 49, 2, 3, 51, 5, 137, 2,
2, 50, 6, 144, 1, 4, 52, 1, 7, 115,
};
-unsigned short Dict415KeyHashTable[] = {
+const unsigned short Dict428KeyHashTable[] = {
8, 8, 8, 9, 12, 15, 26, 8, 0, 1,
1, 6778, 1, 2, 6778, 5, 0, 672, 3, 6778,
5, 672, 6, 672, 7, 672, 1, 4, 6778,
};
-vtkDICOMDictionary::Dict Dict415Data = {
+vtkDICOMDictionary::Dict Dict428Data = {
"PMTF INFORMATION DATA",
8,
8,
-Dict415TagHashTable,
-Dict415KeyHashTable,
-Dict415Contents
+Dict428TagHashTable,
+Dict428KeyHashTable,
+Dict428Contents
};
// ----- SIEMENS MED DISPLAY -----
-DictEntry Dict416Contents[] = {
+const DictEntry Dict429Contents[] = {
{ 0x0029, 0x0004, 0, VR::CS, VM::M1, "PhotometricInterpretation" },
{ 0x0029, 0x0010, 0, VR::US, VM::M1, "RowsOfSubmatrix" },
{ 0x0029, 0x0011, 0, VR::US, VM::M1, "ColumnsOfSubmatrix" },
@@ -25000,7 +25983,7 @@ DictEntry Dict416Contents[] = {
{ 0x0029, 0x00c1, 0, VR::US, VM::M1, "ContourOfIrregularShutter" },
};
-unsigned short Dict416TagHashTable[] = {
+const unsigned short Dict429TagHashTable[] = {
15, 18, 14, 23, 14, 14, 14, 14, 28, 33,
36, 39, 44, 47, 0, 1, 2, 17, 2, 1,
16, 11, 176, 2, 0, 4, 6, 128, 2, 4,
@@ -25009,7 +25992,7 @@ unsigned short Dict416TagHashTable[] = {
12, 178,
};
-unsigned short Dict416KeyHashTable[] = {
+const unsigned short Dict429KeyHashTable[] = {
15, 14, 18, 14, 14, 23, 32, 37, 40, 14,
45, 14, 14, 48, 0, 1, 1, 50526, 2, 2,
14292, 9, 23104, 4, 0, 5445, 3, 384, 4, 384,
@@ -25018,41 +26001,41 @@ unsigned short Dict416KeyHashTable[] = {
20118,
};
-vtkDICOMDictionary::Dict Dict416Data = {
+vtkDICOMDictionary::Dict Dict429Data = {
"SIEMENS MED DISPLAY",
14,
14,
-Dict416TagHashTable,
-Dict416KeyHashTable,
-Dict416Contents
+Dict429TagHashTable,
+Dict429KeyHashTable,
+Dict429Contents
};
// ----- MITRA LINKED ATTRIBUTES 1.0 -----
-DictEntry Dict417Contents[] = {
-{ 0x0031, 0x0020, 0, VR::IS, VM::M1, "" },
+const DictEntry Dict430Contents[] = {
+{ 0x0031, 0x0020, 0, VR::LO, VM::M1, "GlobalPatientID" },
};
-unsigned short Dict417TagHashTable[] = {
+const unsigned short Dict430TagHashTable[] = {
2, 0, 1, 0, 32,
};
-unsigned short Dict417KeyHashTable[] = {
- 2, 0, 1, 0, 5381,
+const unsigned short Dict430KeyHashTable[] = {
+ 2, 0, 1, 0, 55096,
};
-vtkDICOMDictionary::Dict Dict417Data = {
+vtkDICOMDictionary::Dict Dict430Data = {
"MITRA LINKED ATTRIBUTES 1.0",
1,
1,
-Dict417TagHashTable,
-Dict417KeyHashTable,
-Dict417Contents
+Dict430TagHashTable,
+Dict430KeyHashTable,
+Dict430Contents
};
// ----- BRIT Systems, Inc. -----
-DictEntry Dict418Contents[] = {
+const DictEntry Dict431Contents[] = {
{ 0x0021, 0x0000, 0, VR::SQ, VM::M1, "PersonInformationSequence" },
{ 0x0021, 0x0001, 0, VR::LO, VM::M1, "PersonID" },
{ 0x0021, 0x0002, 0, VR::PN, VM::M1, "PersonName" },
@@ -25104,65 +26087,79 @@ DictEntry Dict418Contents[] = {
{ 0x0021, 0x00a6, 0, VR::SH, VM::M1, "LocalIPAddress" },
{ 0x0021, 0x00a7, 0, VR::AE, VM::M1, "RemoteAETitle" },
{ 0x0021, 0x00a8, 0, VR::SH, VM::M1, "RemoteIPAddress" },
-};
-
-unsigned short Dict418TagHashTable[] = {
- 52, 57, 62, 67, 72, 77, 82, 87, 51, 90,
- 93, 96, 51, 51, 51, 51, 99, 102, 105, 108,
- 51, 111, 51, 114, 117, 120, 123, 128, 131, 134,
- 137, 140, 143, 148, 151, 154, 157, 160, 165, 168,
- 171, 174, 177, 180, 183, 186, 51, 51, 189, 51,
- 192, 0, 2, 15, 18, 25, 33, 2, 18, 21,
- 24, 32, 2, 17, 20, 27, 35, 2, 20, 23,
- 26, 34, 2, 19, 22, 29, 37, 2, 22, 25,
- 28, 36, 2, 21, 24, 31, 39, 1, 30, 38,
- 1, 32, 40, 1, 38, 80, 1, 23, 31, 1,
- 34, 49, 1, 33, 48, 1, 36, 51, 1, 35,
- 50, 1, 37, 52, 1, 42, 147, 1, 41, 146,
- 1, 40, 145, 2, 39, 144, 46, 163, 1, 45,
+{ 0x0021, 0x00b0, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b1, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b2, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b3, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b4, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b5, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b6, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b7, 0, VR::ST, VM::M1, "" },
+};
+
+const unsigned short Dict431TagHashTable[] = {
+ 60, 65, 70, 75, 80, 83, 86, 89, 59, 92,
+ 95, 98, 101, 104, 107, 110, 113, 118, 121, 124,
+ 59, 127, 59, 59, 59, 59, 132, 135, 138, 141,
+ 144, 147, 150, 155, 160, 163, 166, 169, 172, 175,
+ 178, 181, 184, 187, 190, 193, 59, 59, 196, 59,
+ 199, 202, 205, 208, 213, 216, 219, 222, 225, 0,
+ 2, 25, 33, 41, 146, 2, 24, 32, 40, 145,
+ 2, 27, 35, 39, 144, 2, 23, 31, 26, 34,
+ 1, 29, 37, 1, 28, 36, 1, 31, 39, 1,
+ 30, 38, 1, 32, 40, 1, 46, 163, 1, 45,
162, 1, 44, 161, 1, 43, 160, 1, 49, 167,
- 1, 48, 166, 2, 1, 1, 47, 165, 1, 0,
- 0, 1, 3, 3, 1, 2, 2, 1, 5, 5,
- 2, 4, 4, 50, 168, 1, 7, 7, 1, 6,
- 6, 1, 9, 9, 1, 8, 8, 1, 11, 11,
- 1, 10, 10, 1, 13, 13, 1, 12, 12, 1,
- 14, 17, 1, 16, 19,
-};
-
-unsigned short Dict418KeyHashTable[] = {
- 51, 52, 61, 51, 51, 64, 51, 69, 72, 77,
- 51, 80, 51, 85, 90, 93, 96, 51, 51, 99,
- 102, 107, 110, 51, 51, 51, 113, 118, 121, 128,
- 135, 140, 143, 148, 151, 154, 157, 160, 51, 163,
- 51, 166, 51, 51, 51, 51, 171, 51, 51, 178,
- 181, 0, 4, 14, 60697, 25, 4552, 30, 50815, 34,
-34219, 1, 36, 505, 2, 13, 2775, 29, 56087, 1,
- 50, 52531, 2, 38, 52685, 43, 46825, 1, 31, 59379,
- 2, 0, 39376, 24, 28400, 2, 5, 44580, 45, 14249,
- 1, 1, 17497, 1, 21, 16123, 1, 23, 63827, 1,
- 37, 22778, 2, 41, 2102, 47, 8748, 1, 35, 42553,
- 1, 42, 58920, 2, 22, 32886, 44, 7328, 1, 19,
- 4931, 3, 11, 46497, 28, 27925, 33, 11878, 3, 12,
- 7048, 16, 33669, 26, 32713, 2, 27, 2954, 49, 1913,
- 1, 18, 15968, 2, 8, 43799, 32, 29666, 1, 6,
-60759, 1, 4, 59023, 1, 3, 48713, 1, 39, 36005,
- 1, 9, 25605, 1, 48, 34808, 2, 2, 45596, 20,
- 4826, 3, 15, 53940, 40, 25388, 46, 25689, 1, 17,
-18107, 2, 7, 46785, 10, 48368,
+ 1, 48, 166, 2, 34, 49, 47, 165, 1, 33,
+ 48, 1, 36, 51, 1, 35, 50, 2, 37, 52,
+ 50, 168, 1, 54, 179, 1, 53, 178, 1, 52,
+ 177, 1, 51, 176, 1, 58, 183, 1, 57, 182,
+ 2, 1, 1, 56, 181, 2, 0, 0, 55, 180,
+ 1, 3, 3, 1, 2, 2, 1, 5, 5, 1,
+ 4, 4, 1, 7, 7, 1, 6, 6, 1, 9,
+ 9, 1, 8, 8, 1, 11, 11, 1, 10, 10,
+ 1, 13, 13, 1, 12, 12, 1, 14, 17, 1,
+ 16, 19, 1, 15, 18, 1, 18, 21, 2, 17,
+ 20, 38, 80, 1, 20, 23, 1, 19, 22, 1,
+ 22, 25, 1, 21, 24, 1, 42, 147,
+};
+
+const unsigned short Dict431KeyHashTable[] = {
+ 59, 60, 65, 59, 59, 68, 59, 73, 78, 81,
+ 88, 91, 96, 59, 113, 59, 59, 59, 116, 121,
+ 124, 127, 130, 59, 133, 138, 59, 143, 59, 146,
+ 149, 152, 155, 59, 158, 161, 59, 164, 59, 169,
+ 172, 175, 180, 59, 59, 59, 59, 59, 185, 188,
+ 191, 194, 59, 197, 200, 203, 208, 211, 59, 0,
+ 2, 4, 53242, 13, 56827, 1, 37, 38573, 2, 0,
+44034, 18, 40462, 2, 10, 28481, 47, 43107, 1, 49,
+11651, 3, 30, 27263, 45, 12317, 50, 40965, 1, 36,
+32649, 2, 3, 23225, 9, 9915, 8, 51, 91, 52,
+ 91, 53, 91, 54, 91, 55, 91, 56, 91, 57,
+ 91, 58, 91, 1, 21, 38374, 2, 15, 34408, 23,
+47397, 1, 39, 12240, 1, 44, 54098, 1, 22, 48421,
+ 1, 42, 9832, 2, 28, 47465, 34, 48462, 2, 7,
+23780, 19, 16481, 1, 41, 16257, 1, 43, 12706, 1,
+ 6, 60296, 1, 46, 22206, 1, 40, 10838, 1, 12,
+52745, 1, 1, 46226, 2, 17, 5655, 24, 63426, 1,
+ 33, 1381, 1, 25, 65027, 2, 8, 37860, 29, 25155,
+ 2, 38, 28879, 48, 31199, 1, 35, 50112, 1, 27,
+53649, 1, 32, 46748, 1, 14, 22475, 1, 20, 16390,
+ 1, 16, 55762, 2, 2, 20530, 31, 20225, 1, 11,
+64629, 2, 5, 768, 26, 42717,
};
-vtkDICOMDictionary::Dict Dict418Data = {
+vtkDICOMDictionary::Dict Dict431Data = {
"BRIT Systems, Inc.",
-51,
-51,
-Dict418TagHashTable,
-Dict418KeyHashTable,
-Dict418Contents
+59,
+59,
+Dict431TagHashTable,
+Dict431KeyHashTable,
+Dict431Contents
};
// ----- SIEMENS CT VA0 RAW -----
-DictEntry Dict419Contents[] = {
+const DictEntry Dict432Contents[] = {
{ 0x0021, 0x0010, 0, VR::UL, VM::M2, "CreationMask" },
{ 0x0021, 0x0020, 0, VR::UL, VM::M2, "EvaluationMask" },
{ 0x0021, 0x0030, 0, VR::US, VM::M7, "ExtendedProcessingMask" },
@@ -25174,59 +26171,59 @@ DictEntry Dict419Contents[] = {
{ 0x0021, 0x0050, 0, VR::CS, VM::M1, "" },
};
-unsigned short Dict419TagHashTable[] = {
+const unsigned short Dict432TagHashTable[] = {
10, 13, 9, 9, 18, 9, 23, 26, 29, 0,
1, 6, 67, 2, 1, 32, 7, 68, 2, 0,
16, 8, 80, 1, 3, 64, 1, 4, 65, 2,
2, 48, 5, 66,
};
-unsigned short Dict419KeyHashTable[] = {
+const unsigned short Dict432KeyHashTable[] = {
10, 13, 9, 16, 9, 9, 9, 9, 19, 0,
1, 1, 2209, 1, 0, 17597, 1, 2, 37852, 6,
3, 597, 4, 597, 5, 597, 6, 597, 7, 597,
8, 597,
};
-vtkDICOMDictionary::Dict Dict419Data = {
+vtkDICOMDictionary::Dict Dict432Data = {
"SIEMENS CT VA0 RAW",
9,
9,
-Dict419TagHashTable,
-Dict419KeyHashTable,
-Dict419Contents
+Dict432TagHashTable,
+Dict432KeyHashTable,
+Dict432Contents
};
// ----- SPI-P Release 2;1 -----
-DictEntry Dict420Contents[] = {
+const DictEntry Dict433Contents[] = {
{ 0x0011, 0x0018, 0, VR::LT, VM::M1, "" },
{ 0x0023, 0x000d, 0, VR::UI, VM::M1, "" },
{ 0x0023, 0x000e, 0, VR::UI, VM::M1, "" },
};
-unsigned short Dict420TagHashTable[] = {
+const unsigned short Dict433TagHashTable[] = {
4, 9, 3, 0, 2, 0, 24, 2, 14, 1,
1, 13,
};
-unsigned short Dict420KeyHashTable[] = {
+const unsigned short Dict433KeyHashTable[] = {
3, 3, 4, 0, 3, 0, 1793, 1, 1793, 2,
1793,
};
-vtkDICOMDictionary::Dict Dict420Data = {
+vtkDICOMDictionary::Dict Dict433Data = {
"SPI-P Release 2;1",
3,
3,
-Dict420TagHashTable,
-Dict420KeyHashTable,
-Dict420Contents
+Dict433TagHashTable,
+Dict433KeyHashTable,
+Dict433Contents
};
// ----- SPI RELEASE 1 -----
-DictEntry Dict421Contents[] = {
+const DictEntry Dict434Contents[] = {
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" },
{ 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" },
{ 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" },
@@ -25237,100 +26234,124 @@ DictEntry Dict421Contents[] = {
{ 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" },
};
-unsigned short Dict421TagHashTable[] = {
+const unsigned short Dict434TagHashTable[] = {
9, 14, 8, 8, 23, 8, 8, 8, 0, 2,
2, 64, 7, 96, 4, 0, 16, 3, 65, 4,
16, 6, 32, 2, 1, 21, 5, 21,
};
-unsigned short Dict421KeyHashTable[] = {
+const unsigned short Dict434KeyHashTable[] = {
9, 8, 12, 15, 18, 8, 23, 26, 0, 1,
2, 24415, 1, 3, 55708, 1, 0, 52021, 2, 4,
39623, 6, 29229, 1, 7, 57071, 2, 1, 1220, 5,
21898,
};
-vtkDICOMDictionary::Dict Dict421Data = {
+vtkDICOMDictionary::Dict Dict434Data = {
"SPI RELEASE 1",
8,
8,
-Dict421TagHashTable,
-Dict421KeyHashTable,
-Dict421Contents
+Dict434TagHashTable,
+Dict434KeyHashTable,
+Dict434Contents
};
// ----- SIEMENS MI RWVM SUV -----
-DictEntry Dict422Contents[] = {
+const DictEntry Dict435Contents[] = {
{ 0x0041, 0x0001, 0, VR::CS, VM::M1, "SUVDecayCorrectionMethod" },
};
-unsigned short Dict422TagHashTable[] = {
+const unsigned short Dict435TagHashTable[] = {
2, 0, 1, 0, 1,
};
-unsigned short Dict422KeyHashTable[] = {
+const unsigned short Dict435KeyHashTable[] = {
2, 0, 1, 0, 19490,
};
-vtkDICOMDictionary::Dict Dict422Data = {
+vtkDICOMDictionary::Dict Dict435Data = {
"SIEMENS MI RWVM SUV",
1,
1,
-Dict422TagHashTable,
-Dict422KeyHashTable,
-Dict422Contents
+Dict435TagHashTable,
+Dict435KeyHashTable,
+Dict435Contents
};
// ----- MeVis eD: Slice Information -----
-DictEntry Dict423Contents[] = {
+const DictEntry Dict436Contents[] = {
{ 0x0021, 0x0010, 0, VR::UI, VM::M1TN, "SliceSOPInstanceUIDs" },
};
-unsigned short Dict423TagHashTable[] = {
+const unsigned short Dict436TagHashTable[] = {
2, 0, 1, 0, 16,
};
-unsigned short Dict423KeyHashTable[] = {
+const unsigned short Dict436KeyHashTable[] = {
2, 0, 1, 0, 16081,
};
-vtkDICOMDictionary::Dict Dict423Data = {
+vtkDICOMDictionary::Dict Dict436Data = {
"MeVis eD: Slice Information",
1,
1,
-Dict423TagHashTable,
-Dict423KeyHashTable,
-Dict423Contents
+Dict436TagHashTable,
+Dict436KeyHashTable,
+Dict436Contents
};
-// ----- Silhouette Graphics Export V1.0 -----
+// ----- AGFA PACS Archive Mirroring 1.0 -----
-DictEntry Dict424Contents[] = {
-{ 0x0029, 0x0000, 0, VR::UI, VM::M1, "" },
+const DictEntry Dict437Contents[] = {
+{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "StudyStatus" },
+{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "DateTimeVerified" },
};
-unsigned short Dict424TagHashTable[] = {
- 2, 0, 1, 0, 0,
+const unsigned short Dict437TagHashTable[] = {
+ 3, 6, 0, 1, 1, 1, 1, 0, 0,
};
-unsigned short Dict424KeyHashTable[] = {
- 2, 0, 1, 0, 5381,
+const unsigned short Dict437KeyHashTable[] = {
+ 3, 2, 0, 2, 0, 9201, 1, 56416,
};
-vtkDICOMDictionary::Dict Dict424Data = {
-"Silhouette Graphics Export V1.0",
+vtkDICOMDictionary::Dict Dict437Data = {
+"AGFA PACS Archive Mirroring 1.0",
+2,
+2,
+Dict437TagHashTable,
+Dict437KeyHashTable,
+Dict437Contents
+};
+
+// ----- Brainlab-S23-ProjectiveFusion -----
+
+const DictEntry Dict438Contents[] = {
+{ 0x0073, 0x0010, 0, VR::SQ, VM::M1, "ProjectiveRegistrationSequence" },
+};
+
+const unsigned short Dict438TagHashTable[] = {
+ 2, 0, 1, 0, 16,
+};
+
+const unsigned short Dict438KeyHashTable[] = {
+ 2, 0, 1, 0, 58996,
+};
+
+vtkDICOMDictionary::Dict Dict438Data = {
+"Brainlab-S23-ProjectiveFusion",
1,
1,
-Dict424TagHashTable,
-Dict424KeyHashTable,
-Dict424Contents
+Dict438TagHashTable,
+Dict438KeyHashTable,
+Dict438Contents
};
// ----- SPI-P Release 1;3 -----
-DictEntry Dict425Contents[] = {
+const DictEntry Dict439Contents[] = {
{ 0x0029, 0x0000, 0, VR::LT, VM::M1, "ImageEnhancementID" },
{ 0x0029, 0x0001, 0, VR::LT, VM::M1, "ImageEnhancement" },
{ 0x0029, 0x0002, 0, VR::LT, VM::M1, "ConvolutionID" },
@@ -25343,32 +26364,32 @@ DictEntry Dict425Contents[] = {
{ 0x0029, 0x001f, 0, VR::CS, VM::M1, "ImageEnhancementSelectStatus" },
};
-unsigned short Dict425TagHashTable[] = {
+const unsigned short Dict439TagHashTable[] = {
11, 14, 17, 20, 23, 28, 10, 33, 10, 10,
0, 1, 1, 1, 1, 0, 0, 1, 3, 3,
1, 2, 2, 2, 5, 5, 9, 31, 2, 4,
4, 8, 30, 2, 6, 6, 7, 12,
};
-unsigned short Dict425KeyHashTable[] = {
+const unsigned short Dict439KeyHashTable[] = {
11, 16, 19, 10, 10, 10, 10, 10, 10, 28,
0, 2, 1, 41307, 4, 35963, 1, 8, 23628, 4,
2, 31800, 6, 16426, 7, 14052, 9, 58824, 3, 0,
38981, 3, 7555, 5, 1404,
};
-vtkDICOMDictionary::Dict Dict425Data = {
+vtkDICOMDictionary::Dict Dict439Data = {
"SPI-P Release 1;3",
10,
10,
-Dict425TagHashTable,
-Dict425KeyHashTable,
-Dict425Contents
+Dict439TagHashTable,
+Dict439KeyHashTable,
+Dict439Contents
};
// ----- SPI-P Release 1;2 -----
-DictEntry Dict426Contents[] = {
+const DictEntry Dict440Contents[] = {
{ 0x0029, 0x0000, 0, VR::LT, VM::M1, "SubtractionMaskID" },
{ 0x0029, 0x0004, 0, VR::UN, VM::M1, "MaskingFunction" },
{ 0x0029, 0x000c, 0, VR::UN, VM::M1, "ProprietaryMaskingParameters" },
@@ -25376,28 +26397,28 @@ DictEntry Dict426Contents[] = {
{ 0x0029, 0x001f, 0, VR::CS, VM::M1, "SubtractionMaskSelectStatus" },
};
-unsigned short Dict426TagHashTable[] = {
+const unsigned short Dict440TagHashTable[] = {
6, 11, 14, 5, 17, 0, 2, 1, 4, 3,
30, 1, 0, 0, 1, 2, 12, 1, 4, 31,
};
-unsigned short Dict426KeyHashTable[] = {
+const unsigned short Dict440KeyHashTable[] = {
6, 9, 12, 5, 15, 0, 1, 3, 1026, 1,
4, 5882, 1, 2, 7098, 2, 0, 22248, 1, 24029,
};
-vtkDICOMDictionary::Dict Dict426Data = {
+vtkDICOMDictionary::Dict Dict440Data = {
"SPI-P Release 1;2",
5,
5,
-Dict426TagHashTable,
-Dict426KeyHashTable,
-Dict426Contents
+Dict440TagHashTable,
+Dict440KeyHashTable,
+Dict440Contents
};
// ----- SPI-P Release 1;1 -----
-DictEntry Dict427Contents[] = {
+const DictEntry Dict441Contents[] = {
{ 0x0009, 0x00c0, 0, VR::LT, VM::M1, "" },
{ 0x0009, 0x00c1, 0, VR::LT, VM::M1, "" },
{ 0x0019, 0x0000, 0, VR::UN, VM::M1, "PhysiologicalDataType" },
@@ -25436,7 +26457,7 @@ DictEntry Dict427Contents[] = {
{ 0x0029, 0x004f, 0, VR::CS, VM::M1, "MagnifyingGlassSelectStatus" },
};
-unsigned short Dict427TagHashTable[] = {
+const unsigned short Dict441TagHashTable[] = {
37, 42, 45, 48, 53, 56, 59, 36, 62, 65,
70, 73, 76, 79, 82, 85, 88, 91, 36, 94,
36, 36, 97, 100, 103, 106, 109, 112, 115, 118,
@@ -25453,7 +26474,7 @@ unsigned short Dict427TagHashTable[] = {
79, 1, 30, 64, 1, 31, 65, 1, 32, 67,
};
-unsigned short Dict427KeyHashTable[] = {
+const unsigned short Dict441KeyHashTable[] = {
37, 36, 44, 53, 36, 56, 59, 66, 69, 36,
72, 36, 75, 78, 36, 83, 86, 89, 36, 96,
36, 103, 36, 36, 106, 109, 36, 36, 112, 36,
@@ -25470,18 +26491,18 @@ unsigned short Dict427KeyHashTable[] = {
21, 43250,
};
-vtkDICOMDictionary::Dict Dict427Data = {
+vtkDICOMDictionary::Dict Dict441Data = {
"SPI-P Release 1;1",
36,
36,
-Dict427TagHashTable,
-Dict427KeyHashTable,
-Dict427Contents
+Dict441TagHashTable,
+Dict441KeyHashTable,
+Dict441Contents
};
// ----- SPI-P-PCR Release 2 -----
-DictEntry Dict428Contents[] = {
+const DictEntry Dict442Contents[] = {
{ 0x0019, 0x0010, 0, VR::US, VM::M1, "" },
{ 0x0019, 0x0020, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0021, 0, VR::LO, VM::M1, "" },
@@ -25517,7 +26538,7 @@ DictEntry Dict428Contents[] = {
{ 0x0019, 0x00ba, 0, VR::ST, VM::M1, "" },
};
-unsigned short Dict428TagHashTable[] = {
+const unsigned short Dict442TagHashTable[] = {
33, 33, 33, 34, 37, 40, 43, 46, 51, 56,
61, 64, 67, 70, 73, 76, 79, 82, 85, 88,
33, 91, 96, 99, 106, 111, 114, 33, 33, 117,
@@ -25533,7 +26554,7 @@ unsigned short Dict428TagHashTable[] = {
1, 31, 185, 1, 30, 184,
};
-unsigned short Dict428KeyHashTable[] = {
+const unsigned short Dict442KeyHashTable[] = {
33, 33, 34, 33, 33, 33, 33, 33, 33, 33,
33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
33, 33, 33, 33, 33, 33, 33, 33, 33, 33,
@@ -25547,46 +26568,46 @@ unsigned short Dict428KeyHashTable[] = {
163,
};
-vtkDICOMDictionary::Dict Dict428Data = {
+vtkDICOMDictionary::Dict Dict442Data = {
"SPI-P-PCR Release 2",
33,
33,
-Dict428TagHashTable,
-Dict428KeyHashTable,
-Dict428Contents
+Dict442TagHashTable,
+Dict442KeyHashTable,
+Dict442Contents
};
// ----- SIEMENS MR PHOENIX ATTRIBUTES -----
-DictEntry Dict429Contents[] = {
+const DictEntry Dict443Contents[] = {
{ 0x0021, 0x0001, 0, VR::UL, VM::M1, "MdsModeMask" },
{ 0x0021, 0x0002, 0, VR::US, VM::M1, "Dixon" },
{ 0x0021, 0x0003, 0, VR::LT, VM::M1, "SequenceFileName" },
{ 0x0021, 0x00F1, 0, VR::UL, VM::M1, "CountOfPseudoAttributes" },
};
-unsigned short Dict429TagHashTable[] = {
+const unsigned short Dict443TagHashTable[] = {
5, 4, 8, 11, 0, 1, 0, 1, 1, 2,
3, 2, 1, 2, 3, 241,
};
-unsigned short Dict429KeyHashTable[] = {
+const unsigned short Dict443KeyHashTable[] = {
4, 4, 5, 10, 0, 2, 0, 9150, 3, 33686,
2, 1, 18649, 2, 43687,
};
-vtkDICOMDictionary::Dict Dict429Data = {
+vtkDICOMDictionary::Dict Dict443Data = {
"SIEMENS MR PHOENIX ATTRIBUTES",
4,
4,
-Dict429TagHashTable,
-Dict429KeyHashTable,
-Dict429Contents
+Dict443TagHashTable,
+Dict443KeyHashTable,
+Dict443Contents
};
// ----- SIEMENS MR SDI 02 -----
-DictEntry Dict430Contents[] = {
+const DictEntry Dict444Contents[] = {
{ 0x0021, 0x0001, 0, VR::US, VM::M1, "NumberOfImagesInMosaic" },
{ 0x0021, 0x0002, 0, VR::FD, VM::M3, "SliceNormalVector" },
{ 0x0021, 0x0003, 0, VR::DS, VM::M1, "SliceMeasurementDuration" },
@@ -25680,7 +26701,7 @@ DictEntry Dict430Contents[] = {
{ 0x0021, 0x00FE, 0, VR::SQ, VM::M1, "SiemensMRSDISequence" },
};
-unsigned short Dict430TagHashTable[] = {
+const unsigned short Dict444TagHashTable[] = {
92, 95, 98, 101, 104, 107, 112, 117, 122, 127,
130, 135, 140, 145, 150, 155, 158, 161, 166, 171,
176, 181, 186, 191, 196, 201, 206, 211, 216, 221,
@@ -25717,7 +26738,7 @@ unsigned short Dict430TagHashTable[] = {
86, 119, 1, 87, 120, 1, 88, 121,
};
-unsigned short Dict430KeyHashTable[] = {
+const unsigned short Dict444KeyHashTable[] = {
92, 95, 100, 103, 91, 91, 108, 113, 91, 118,
121, 91, 126, 131, 134, 137, 144, 91, 147, 91,
150, 91, 91, 91, 153, 158, 161, 91, 166, 91,
@@ -25754,18 +26775,18 @@ unsigned short Dict430KeyHashTable[] = {
80, 53629, 1, 8, 6773,
};
-vtkDICOMDictionary::Dict Dict430Data = {
+vtkDICOMDictionary::Dict Dict444Data = {
"SIEMENS MR SDI 02",
91,
91,
-Dict430TagHashTable,
-Dict430KeyHashTable,
-Dict430Contents
+Dict444TagHashTable,
+Dict444KeyHashTable,
+Dict444Contents
};
// ----- Biospace Med : EOS Tag -----
-DictEntry Dict431Contents[] = {
+const DictEntry Dict445Contents[] = {
{ 0x0863, 0x0010, 0, VR::SL, VM::M1, "ImageType" },
{ 0x0863, 0x0023, 0, VR::SL, VM::M1, "CalibrationFlag" },
{ 0x0863, 0x0026, 0, VR::UL, VM::M1, "AttributeVersion" },
@@ -25789,7 +26810,7 @@ DictEntry Dict431Contents[] = {
{ 0x0863, 0x0057, 0, VR::CS, VM::M1, "ImageHorizontalFlip" },
};
-unsigned short Dict431TagHashTable[] = {
+const unsigned short Dict445TagHashTable[] = {
21, 22, 25, 28, 33, 21, 36, 39, 44, 47,
50, 53, 56, 61, 64, 21, 67, 70, 73, 78,
21, 0, 1, 9, 54, 1, 10, 55, 2, 1,
@@ -25801,7 +26822,7 @@ unsigned short Dict431TagHashTable[] = {
51,
};
-unsigned short Dict431KeyHashTable[] = {
+const unsigned short Dict445KeyHashTable[] = {
22, 21, 27, 21, 21, 30, 21, 21, 39, 42,
21, 47, 21, 21, 54, 61, 66, 21, 21, 69,
72, 0, 2, 3, 55074, 9, 6471, 1, 4, 12148,
@@ -25812,42 +26833,42 @@ unsigned short Dict431KeyHashTable[] = {
7, 51514, 1, 18, 26685,
};
-vtkDICOMDictionary::Dict Dict431Data = {
+vtkDICOMDictionary::Dict Dict445Data = {
"Biospace Med : EOS Tag",
21,
21,
-Dict431TagHashTable,
-Dict431KeyHashTable,
-Dict431Contents
+Dict445TagHashTable,
+Dict445KeyHashTable,
+Dict445Contents
};
// ----- AMI ImageContextExt_01 -----
-DictEntry Dict432Contents[] = {
+const DictEntry Dict446Contents[] = {
{ 0x3107, 0x00A0, 0, VR::CS, VM::M1, "WindowFunction" },
{ 0x3107, 0x00B0, 0, VR::DS, VM::M1, "WindowSlope" },
};
-unsigned short Dict432TagHashTable[] = {
+const unsigned short Dict446TagHashTable[] = {
2, 3, 0, 2, 0, 160, 1, 176,
};
-unsigned short Dict432KeyHashTable[] = {
+const unsigned short Dict446KeyHashTable[] = {
3, 6, 0, 1, 1, 62736, 1, 0, 38065,
};
-vtkDICOMDictionary::Dict Dict432Data = {
+vtkDICOMDictionary::Dict Dict446Data = {
"AMI ImageContextExt_01",
2,
2,
-Dict432TagHashTable,
-Dict432KeyHashTable,
-Dict432Contents
+Dict446TagHashTable,
+Dict446KeyHashTable,
+Dict446Contents
};
// ----- IMS s.r.l. Biopsy Private Code -----
-DictEntry Dict433Contents[] = {
+const DictEntry Dict447Contents[] = {
{ 0x1269, 0x0001, 0, VR::IS, VM::M1, "BiopsyImage" },
{ 0x1269, 0x0010, 0, VR::IS, VM::M1TN, "BiopsyMarkersX" },
{ 0x1269, 0x0011, 0, VR::IS, VM::M1TN, "BiopsyMarkersY" },
@@ -25859,32 +26880,32 @@ DictEntry Dict433Contents[] = {
{ 0x1269, 0x0024, 0, VR::IS, VM::M1, "BiopsyNumber" },
};
-unsigned short Dict433TagHashTable[] = {
+const unsigned short Dict447TagHashTable[] = {
10, 13, 16, 19, 24, 29, 32, 9, 9, 0,
1, 4, 32, 1, 5, 33, 1, 6, 34, 2,
1, 16, 7, 35, 2, 2, 17, 8, 36, 1,
3, 18, 1, 0, 1,
};
-unsigned short Dict433KeyHashTable[] = {
+const unsigned short Dict447KeyHashTable[] = {
9, 10, 15, 20, 9, 25, 9, 28, 31, 0,
2, 0, 51605, 4, 12124, 2, 1, 6166, 3, 48415,
2, 2, 6166, 7, 42788, 1, 6, 8128, 1, 8,
21301, 1, 5, 21960,
};
-vtkDICOMDictionary::Dict Dict433Data = {
+vtkDICOMDictionary::Dict Dict447Data = {
"IMS s.r.l. Biopsy Private Code",
9,
9,
-Dict433TagHashTable,
-Dict433KeyHashTable,
-Dict433Contents
+Dict447TagHashTable,
+Dict447KeyHashTable,
+Dict447Contents
};
// ----- PMI Private Calibration Module Version 2.0 -----
-DictEntry Dict434Contents[] = {
+const DictEntry Dict448Contents[] = {
{ 0x2121, 0x0001, 0, VR::ST, VM::M1, "CalibrationMethod" },
{ 0x2121, 0x0002, 0, VR::ST, VM::M1, "CalibrationMethodInfo" },
{ 0x2121, 0x0003, 0, VR::FL, VM::M1, "CalibrationObjectSize" },
@@ -25900,7 +26921,7 @@ DictEntry Dict434Contents[] = {
{ 0x2121, 0x000e, 0, VR::FL, VM::M1, "VerticalPixelSDev" },
};
-unsigned short Dict434TagHashTable[] = {
+const unsigned short Dict448TagHashTable[] = {
14, 17, 20, 25, 30, 33, 36, 13, 39, 42,
45, 48, 13, 0, 1, 12, 14, 1, 7, 9,
2, 4, 5, 6, 8, 2, 3, 4, 9, 11,
@@ -25909,7 +26930,7 @@ unsigned short Dict434TagHashTable[] = {
12,
};
-unsigned short Dict434KeyHashTable[] = {
+const unsigned short Dict448KeyHashTable[] = {
14, 17, 13, 20, 23, 28, 13, 13, 31, 34,
43, 46, 13, 0, 1, 1, 44194, 1, 12, 26778,
1, 3, 19967, 2, 8, 29024, 10, 24532, 1, 11,
@@ -25917,19 +26938,19 @@ unsigned short Dict434KeyHashTable[] = {
1048, 9, 9474, 1, 5, 54420, 1, 4, 30559,
};
-vtkDICOMDictionary::Dict Dict434Data = {
+vtkDICOMDictionary::Dict Dict448Data = {
"PMI Private Calibration Module Version 2.0",
13,
13,
-Dict434TagHashTable,
-Dict434KeyHashTable,
-Dict434Contents
+Dict448TagHashTable,
+Dict448KeyHashTable,
+Dict448Contents
};
// ----- GEMS_ADWSoft_3D1 -----
-DictEntry Dict435Contents[] = {
-{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "Reconstruction Parameters Sequence" },
+const DictEntry Dict449Contents[] = {
+{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "ReconstructionParametersSequence" },
{ 0x0047, 0x0050, 0, VR::UL, VM::M1, "VolumeVoxelCount" },
{ 0x0047, 0x0051, 0, VR::UL, VM::M1, "VolumeSegmentCount" },
{ 0x0047, 0x0053, 0, VR::US, VM::M1, "VolumeSliceSize" },
@@ -25983,7 +27004,7 @@ DictEntry Dict435Contents[] = {
{ 0x0047, 0x00D5, 0, VR::OB, VM::M1, "VolumeOriginalIndexList" },
};
-unsigned short Dict435TagHashTable[] = {
+const unsigned short Dict449TagHashTable[] = {
53, 56, 61, 66, 52, 69, 72, 75, 78, 52,
52, 52, 81, 84, 87, 90, 93, 52, 96, 99,
104, 52, 107, 110, 52, 52, 52, 52, 113, 116,
@@ -26006,65 +27027,93 @@ unsigned short Dict435TagHashTable[] = {
20, 138, 1, 21, 139,
};
-unsigned short Dict435KeyHashTable[] = {
- 53, 58, 52, 63, 68, 52, 73, 76, 79, 82,
- 87, 92, 95, 98, 101, 106, 52, 109, 114, 117,
- 52, 120, 125, 128, 133, 52, 138, 141, 52, 52,
- 144, 149, 152, 52, 52, 52, 155, 160, 163, 52,
- 52, 52, 166, 169, 172, 52, 179, 184, 187, 52,
- 52, 190, 0, 2, 9, 4240, 15, 30510, 2, 26,
-41838, 32, 13112, 2, 35, 43240, 43, 39675, 2, 0,
-22268, 18, 615, 1, 29, 31433, 1, 31, 39219, 1,
- 36, 58080, 2, 21, 62660, 49, 36836, 2, 7, 49915,
- 19, 64687, 1, 48, 1619, 1, 16, 15156, 1, 12,
-32015, 2, 4, 39802, 14, 7813, 1, 22, 22548, 2,
- 2, 5410, 42, 14339, 1, 51, 32153, 1, 45, 51122,
- 2, 17, 47037, 37, 54208, 1, 39, 40598, 2, 41,
-40805, 46, 51894, 2, 10, 45812, 25, 46127, 1, 13,
- 6923, 1, 8, 24751, 2, 11, 11041, 28, 14543, 1,
- 33, 56869, 1, 34, 6980, 2, 47, 19394, 50, 19909,
- 1, 20, 54841, 1, 38, 6792, 1, 40, 25108, 1,
- 24, 34906, 3, 1, 51250, 23, 3630, 27, 33546, 2,
- 6, 55963, 30, 49438, 1, 5, 33470, 1, 3, 38110,
- 1, 44, 51324,
-};
-
-vtkDICOMDictionary::Dict Dict435Data = {
+const unsigned short Dict449KeyHashTable[] = {
+ 53, 58, 52, 63, 68, 52, 71, 74, 77, 80,
+ 85, 90, 93, 96, 99, 104, 52, 107, 112, 115,
+ 52, 118, 123, 126, 131, 52, 136, 139, 52, 52,
+ 142, 147, 150, 52, 52, 52, 153, 158, 161, 52,
+ 164, 52, 167, 170, 173, 52, 180, 185, 188, 52,
+ 52, 191, 0, 2, 9, 4240, 15, 30510, 2, 26,
+41838, 32, 13112, 2, 35, 43240, 43, 39675, 1, 18,
+ 615, 1, 29, 31433, 1, 31, 39219, 1, 36, 58080,
+ 2, 21, 62660, 49, 36836, 2, 7, 49915, 19, 64687,
+ 1, 48, 1619, 1, 16, 15156, 1, 12, 32015, 2,
+ 4, 39802, 14, 7813, 1, 22, 22548, 2, 2, 5410,
+ 42, 14339, 1, 51, 32153, 1, 45, 51122, 2, 17,
+47037, 37, 54208, 1, 39, 40598, 2, 41, 40805, 46,
+51894, 2, 10, 45812, 25, 46127, 1, 13, 6923, 1,
+ 8, 24751, 2, 11, 11041, 28, 14543, 1, 33, 56869,
+ 1, 34, 6980, 2, 47, 19394, 50, 19909, 1, 20,
+54841, 1, 38, 6792, 1, 0, 19823, 1, 40, 25108,
+ 1, 24, 34906, 3, 1, 51250, 23, 3630, 27, 33546,
+ 2, 6, 55963, 30, 49438, 1, 5, 33470, 1, 3,
+38110, 1, 44, 51324,
+};
+
+vtkDICOMDictionary::Dict Dict449Data = {
"GEMS_ADWSoft_3D1",
52,
52,
-Dict435TagHashTable,
-Dict435KeyHashTable,
-Dict435Contents
+Dict449TagHashTable,
+Dict449KeyHashTable,
+Dict449Contents
};
// ----- INFINITT_FMX -----
-DictEntry Dict436Contents[] = {
+const DictEntry Dict450Contents[] = {
{ 0x0015, 0x0010, 0, VR::LO, VM::M1, "" },
{ 0x0015, 0x0011, 0, VR::LO, VM::M1, "" },
};
-unsigned short Dict436TagHashTable[] = {
+const unsigned short Dict450TagHashTable[] = {
3, 6, 0, 1, 1, 17, 1, 0, 16,
};
-unsigned short Dict436KeyHashTable[] = {
+const unsigned short Dict450KeyHashTable[] = {
2, 3, 0, 2, 0, 2690, 1, 2690,
};
-vtkDICOMDictionary::Dict Dict436Data = {
+vtkDICOMDictionary::Dict Dict450Data = {
"INFINITT_FMX",
2,
2,
-Dict436TagHashTable,
-Dict436KeyHashTable,
-Dict436Contents
+Dict450TagHashTable,
+Dict450KeyHashTable,
+Dict450Contents
+};
+
+// ----- Nautilus Medical -----
+
+const DictEntry Dict451Contents[] = {
+{ 0x0857, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x0857, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x0857, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x0857, 0x0003, 0, VR::LO, VM::M1, "" },
+};
+
+const unsigned short Dict451TagHashTable[] = {
+ 5, 8, 11, 14, 0, 1, 2, 2, 1, 3,
+ 3, 1, 0, 0, 1, 1, 1,
+};
+
+const unsigned short Dict451KeyHashTable[] = {
+ 4, 5, 4, 4, 0, 4, 0, 1345, 1, 1345,
+ 2, 1345, 3, 1345,
+};
+
+vtkDICOMDictionary::Dict Dict451Data = {
+"Nautilus Medical",
+4,
+4,
+Dict451TagHashTable,
+Dict451KeyHashTable,
+Dict451Contents
};
// ----- SIEMENS MR SDS 01 -----
-DictEntry Dict437Contents[] = {
+const DictEntry Dict452Contents[] = {
{ 0x0021, 0x0001, 0, VR::IS, VM::M1, "" },
{ 0x0021, 0x0002, 0, VR::DS, VM::M1TN, "" },
{ 0x0021, 0x0003, 0, VR::OB, VM::M1, "" },
@@ -26157,7 +27206,7 @@ DictEntry Dict437Contents[] = {
{ 0x0021, 0x00fe, 0, VR::SQ, VM::M1, "" },
};
-unsigned short Dict437TagHashTable[] = {
+const unsigned short Dict452TagHashTable[] = {
90, 91, 94, 97, 100, 103, 106, 111, 116, 119,
122, 129, 136, 143, 150, 157, 164, 167, 170, 173,
176, 179, 182, 185, 190, 195, 200, 90, 205, 208,
@@ -26194,7 +27243,7 @@ unsigned short Dict437TagHashTable[] = {
33, 30,
};
-unsigned short Dict437KeyHashTable[] = {
+const unsigned short Dict452KeyHashTable[] = {
90, 90, 90, 90, 91, 90, 90, 90, 90, 90,
90, 94, 90, 90, 97, 90, 90, 90, 90, 90,
90, 100, 90, 90, 90, 90, 103, 90, 90, 90,
@@ -26227,18 +27276,18 @@ unsigned short Dict437KeyHashTable[] = {
54723, 51, 64335, 88, 27848, 1, 43, 19302,
};
-vtkDICOMDictionary::Dict Dict437Data = {
+vtkDICOMDictionary::Dict Dict452Data = {
"SIEMENS MR SDS 01",
90,
90,
-Dict437TagHashTable,
-Dict437KeyHashTable,
-Dict437Contents
+Dict452TagHashTable,
+Dict452KeyHashTable,
+Dict452Contents
};
// ----- GEMS_RELA_01 -----
-DictEntry Dict438Contents[] = {
+const DictEntry Dict453Contents[] = {
{ 0x0021, 0x0003, 0, VR::SS, VM::M1, "SeriesFromWhichPrescribed" },
{ 0x0021, 0x0005, 0, VR::SH, VM::M1, "GenesisVersionNow" },
{ 0x0021, 0x0007, 0, VR::UL, VM::M1, "SeriesRecordChecksum" },
@@ -26282,7 +27331,7 @@ DictEntry Dict438Contents[] = {
{ 0x0021, 0x0094, 0, VR::LO, VM::M1TN, "AnnotationStrings" },
};
-unsigned short Dict438TagHashTable[] = {
+const unsigned short Dict453TagHashTable[] = {
42, 45, 50, 53, 58, 41, 41, 41, 41, 41,
41, 61, 64, 67, 70, 75, 80, 41, 41, 83,
86, 41, 89, 92, 95, 41, 41, 41, 98, 101,
@@ -26301,7 +27350,7 @@ unsigned short Dict438TagHashTable[] = {
90, 31, 113,
};
-unsigned short Dict438KeyHashTable[] = {
+const unsigned short Dict453KeyHashTable[] = {
42, 41, 41, 47, 50, 41, 41, 41, 41, 53,
56, 71, 41, 76, 79, 82, 85, 90, 93, 41,
96, 101, 41, 106, 111, 41, 114, 119, 41, 41,
@@ -26319,18 +27368,18 @@ unsigned short Dict438KeyHashTable[] = {
26866, 2, 25, 65225, 26, 65225, 1, 15, 1703,
};
-vtkDICOMDictionary::Dict Dict438Data = {
+vtkDICOMDictionary::Dict Dict453Data = {
"GEMS_RELA_01",
41,
41,
-Dict438TagHashTable,
-Dict438KeyHashTable,
-Dict438Contents
+Dict453TagHashTable,
+Dict453KeyHashTable,
+Dict453Contents
};
// ----- SIEMENS MR MRS 05 -----
-DictEntry Dict439Contents[] = {
+const DictEntry Dict454Contents[] = {
{ 0x0021, 0x0001, 0, VR::FD, VM::M1, "TransmitterReferenceAmplitude" },
{ 0x0021, 0x0002, 0, VR::US, VM::M1, "HammingFilterWidth" },
{ 0x0021, 0x0003, 0, VR::FD, VM::M3, "CSIGridshiftVector" },
@@ -26349,7 +27398,7 @@ DictEntry Dict439Contents[] = {
{ 0x0021, 0x004B, 0, VR::CS, VM::M1, "SpectroResultExtendTypeDetailed" },
};
-unsigned short Dict439TagHashTable[] = {
+const unsigned short Dict454TagHashTable[] = {
17, 22, 25, 30, 35, 38, 43, 46, 49, 52,
55, 58, 16, 16, 16, 16, 0, 2, 0, 1,
4, 64, 1, 5, 65, 2, 2, 3, 6, 66,
@@ -26359,7 +27408,7 @@ unsigned short Dict439TagHashTable[] = {
75,
};
-unsigned short Dict439KeyHashTable[] = {
+const unsigned short Dict454KeyHashTable[] = {
17, 20, 16, 16, 16, 16, 25, 30, 16, 35,
38, 41, 44, 51, 54, 57, 0, 1, 3, 15396,
2, 7, 18467, 12, 19400, 2, 0, 41119, 5, 12810,
@@ -26368,18 +27417,18 @@ unsigned short Dict439KeyHashTable[] = {
65199, 1, 14, 57592, 1, 6, 16634, 1, 10, 57721,
};
-vtkDICOMDictionary::Dict Dict439Data = {
+vtkDICOMDictionary::Dict Dict454Data = {
"SIEMENS MR MRS 05",
16,
16,
-Dict439TagHashTable,
-Dict439KeyHashTable,
-Dict439Contents
+Dict454TagHashTable,
+Dict454KeyHashTable,
+Dict454Contents
};
// ----- TOSHIBA_MEC_CT_1.0 -----
-DictEntry Dict440Contents[] = {
+const DictEntry Dict455Contents[] = {
{ 0x0019, 0x0001, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
{ 0x0019, 0x0003, 0, VR::US, VM::M1TN, "" },
@@ -26408,7 +27457,7 @@ DictEntry Dict440Contents[] = {
{ 0x7ff1, 0x000d, 0, VR::US, VM::M1TN, "" },
};
-unsigned short Dict440TagHashTable[] = {
+const unsigned short Dict455TagHashTable[] = {
27, 32, 37, 42, 47, 50, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 55, 58, 61, 66,
71, 76, 81, 84, 89, 92, 0, 2, 2, 3,
@@ -26421,7 +27470,7 @@ unsigned short Dict440TagHashTable[] = {
0, 1, 1, 19, 7,
};
-unsigned short Dict440KeyHashTable[] = {
+const unsigned short Dict455KeyHashTable[] = {
26, 26, 27, 26, 26, 30, 26, 26, 26, 26,
26, 35, 38, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 43, 0, 1, 12, 22493,
@@ -26433,18 +27482,18 @@ unsigned short Dict440KeyHashTable[] = {
24, 206, 25, 206,
};
-vtkDICOMDictionary::Dict Dict440Data = {
+vtkDICOMDictionary::Dict Dict455Data = {
"TOSHIBA_MEC_CT_1.0",
26,
26,
-Dict440TagHashTable,
-Dict440KeyHashTable,
-Dict440Contents
+Dict455TagHashTable,
+Dict455KeyHashTable,
+Dict455Contents
};
// ----- SPI Release 1 -----
-DictEntry Dict441Contents[] = {
+const DictEntry Dict456Contents[] = {
{ 0x0009, 0x0008, 0, VR::CS, VM::M1, "" },
{ 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" },
{ 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" },
@@ -26456,27 +27505,27 @@ DictEntry Dict441Contents[] = {
{ 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" },
};
-unsigned short Dict441TagHashTable[] = {
+const unsigned short Dict456TagHashTable[] = {
10, 15, 9, 9, 24, 9, 9, 29, 9, 0,
2, 3, 64, 8, 96, 4, 0, 8, 2, 21,
4, 65, 5, 16, 2, 6, 21, 7, 32, 1,
1, 16,
};
-unsigned short Dict441KeyHashTable[] = {
+const unsigned short Dict456KeyHashTable[] = {
9, 10, 15, 9, 20, 9, 9, 23, 26, 0,
2, 3, 58111, 5, 27939, 2, 2, 1085, 7, 11418,
1, 4, 49518, 1, 1, 60804, 3, 0, 597, 6,
12183, 8, 36166,
};
-vtkDICOMDictionary::Dict Dict441Data = {
+vtkDICOMDictionary::Dict Dict456Data = {
"SPI Release 1",
9,
9,
-Dict441TagHashTable,
-Dict441KeyHashTable,
-Dict441Contents
+Dict456TagHashTable,
+Dict456KeyHashTable,
+Dict456Contents
};
vtkDICOMDictionary::Dict *PrivateDictData[] = {
@@ -26568,7 +27617,10 @@ vtkDICOMDictionary::Dict *PrivateDictData[] = {
&Dict426Data, &Dict427Data, &Dict428Data, &Dict429Data, &Dict430Data,
&Dict431Data, &Dict432Data, &Dict433Data, &Dict434Data, &Dict435Data,
&Dict436Data, &Dict437Data, &Dict438Data, &Dict439Data, &Dict440Data,
-&Dict441Data, NULL
+&Dict441Data, &Dict442Data, &Dict443Data, &Dict444Data, &Dict445Data,
+&Dict446Data, &Dict447Data, &Dict448Data, &Dict449Data, &Dict450Data,
+&Dict451Data, &Dict452Data, &Dict453Data, &Dict454Data, &Dict455Data,
+&Dict456Data, NULL
};
} // end anonymous namespace
@@ -26578,21 +27630,21 @@ static unsigned int vtkDICOMDictPrivateInitializerCounter;
vtkDICOMDictPrivateInitializer::vtkDICOMDictPrivateInitializer()
{
if (vtkDICOMDictPrivateInitializerCounter++ == 0)
- {
+ {
for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++)
- {
+ {
vtkDICOMDictionary::AddPrivateDictionary(*dp);
- }
}
+ }
}
vtkDICOMDictPrivateInitializer::~vtkDICOMDictPrivateInitializer()
{
if (--vtkDICOMDictPrivateInitializerCounter == 0)
- {
+ {
for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++)
- {
+ {
vtkDICOMDictionary::RemovePrivateDictionary((*dp)->Name);
- }
}
+ }
}
diff --git a/Source/vtkDICOMDictionary.cxx b/Source/vtkDICOMDictionary.cxx
index d0329c3..614c583 100644
--- a/Source/vtkDICOMDictionary.cxx
+++ b/Source/vtkDICOMDictionary.cxx
@@ -40,24 +40,24 @@ static unsigned int vtkDICOMDictionaryInitializerCounter;
vtkDICOMDictionaryInitializer::vtkDICOMDictionaryInitializer()
{
if (vtkDICOMDictionaryInitializerCounter++ == 0)
- {
+ {
for (int i = 0; i < DICT_PRIVATE_TABLE_SIZE; i++)
- {
+ {
vtkDICOMDictionary::PrivateDictTable[i] = 0;
- }
}
+ }
}
// Perform cleanup of static variables.
vtkDICOMDictionaryInitializer::~vtkDICOMDictionaryInitializer()
{
if (--vtkDICOMDictionaryInitializerCounter == 0)
- {
+ {
for (int i = 0; i < DICT_PRIVATE_TABLE_SIZE; i++)
- {
+ {
delete [] vtkDICOMDictionary::PrivateDictTable[i];
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -69,7 +69,7 @@ unsigned int vtkDICOMDictionary::HashLongString(
// length even, the pad space is ignored.
unsigned int h = 5381;
for (int k = 0; k < 64; k += 2)
- {
+ {
unsigned char c = input[k];
output[k] = c;
if (c == '\0') { break; }
@@ -77,13 +77,13 @@ unsigned int vtkDICOMDictionary::HashLongString(
c = input[k+1];
// trim pad space before terminating null
if (c == ' ' && input[k+2] == '\0')
- {
+ {
c = '\0';
- }
+ }
output[k+1] = c;
if (c == '\0') { break; }
h = (h << 5) + h + c;
- }
+ }
return h;
}
@@ -102,16 +102,16 @@ vtkDICOMDictionary::Dict *vtkDICOMDictionary::FindPrivateDict(
unsigned int i = (h & m);
if (htable && (hptr = htable[i]) != NULL)
- {
+ {
while (hptr->Dict != 0)
- {
+ {
if (hptr->Hash == h && strncmp(hptr->Dict->Name, stripname, 64) == 0)
- {
+ {
return hptr->Dict;
- }
- hptr++;
}
+ hptr++;
}
+ }
return 0;
}
@@ -132,29 +132,29 @@ vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry(
// for odd group number, only search the private dictionary
if ((group & 1) != 0 && dictname != 0)
- {
+ {
dict = vtkDICOMDictionary::FindPrivateDict(dictname);
if (dict == 0)
- {
+ {
// private dictionary not found
return vtkDICOMDictEntry();
- }
- i = (h % dict->HashSize);
}
+ i = (h % dict->HashSize);
+ }
// search the hash table
- unsigned short *hptr = &dict->TagHashTable[dict->TagHashTable[i]];
- vtkDICOMDictEntry::Entry *dptr = dict->Contents;
+ const unsigned short *hptr = &dict->TagHashTable[dict->TagHashTable[i]];
+ const vtkDICOMDictEntry::Entry *dptr = dict->Contents;
for (unsigned short n = *hptr; n != 0; --n)
- {
+ {
++hptr;
- vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
+ const vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
++hptr;
if (*hptr == element && entry->Group == group)
- {
+ {
return vtkDICOMDictEntry(entry);
- }
}
+ }
// not found in dictionary
return vtkDICOMDictEntry();
@@ -165,9 +165,9 @@ vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry(
const char *key, const char *dictname)
{
if (key == 0 || key[0] == '\0')
- {
+ {
return vtkDICOMDictEntry();
- }
+ }
char stripkey[64];
unsigned int h = vtkDICOMDictionary::HashLongString(key, stripkey);
@@ -177,46 +177,46 @@ vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry(
// for odd group number, only search the private dictionary
if (dictname != 0 && dictname[0] != '\0')
- {
+ {
dict = vtkDICOMDictionary::FindPrivateDict(dictname);
if (dict == 0)
- {
+ {
// private dictionary not found
return vtkDICOMDictEntry();
- }
}
+ }
unsigned short i = static_cast<unsigned short>(h % dict->HashSize);
unsigned short j = static_cast<unsigned short>(h / dict->HashSize);
// search the hash table
- unsigned short *hptr = &dict->KeyHashTable[dict->KeyHashTable[i]];
- vtkDICOMDictEntry::Entry *dptr = dict->Contents;
+ const unsigned short *hptr = &dict->KeyHashTable[dict->KeyHashTable[i]];
+ const vtkDICOMDictEntry::Entry *dptr = dict->Contents;
for (unsigned short n = *hptr; n != 0; --n)
- {
+ {
++hptr;
- vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
+ const vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
++hptr;
if (*hptr == j && strncmp(stripkey, entry->Name, 64) == 0)
- {
+ {
return vtkDICOMDictEntry(entry);
- }
}
+ }
if (dictname != 0 && dictname[0] != '\0')
- {
+ {
// brute force search the entire dictionary, if hash lookup failed
// (in case people manually changed the key strings in the code,
// without re-running makedict.py to re-generate the hash table)
for (unsigned short k = 0; k < dict->DataSize; k++)
- {
- vtkDICOMDictEntry::Entry *entry = &dptr[k];
+ {
+ const vtkDICOMDictEntry::Entry *entry = &dptr[k];
if (strncmp(stripkey, entry->Name, 64) == 0)
- {
+ {
return vtkDICOMDictEntry(entry);
- }
}
}
+ }
// not found in dictionary
return vtkDICOMDictEntry();
@@ -236,34 +236,34 @@ void vtkDICOMDictionary::AddPrivateDictionary(Dict *dict)
// create hash table row if it is empty
if (hptr == 0)
- {
+ {
htable[i] = new DictHashEntry[2];
hptr = htable[i];
hptr->Hash = 0;
hptr->Dict = 0;
- }
+ }
// go to the end of the row in the hash table
int n = 0;
while (hptr->Dict != 0)
- {
+ {
n++;
hptr++;
- }
+ }
// if n+1 is a power of two, double allocated space
if (n > 0 && (n & (n+1)) == 0)
- {
+ {
DictHashEntry *oldptr = htable[i];
hptr = new DictHashEntry[2*(n+1)];
htable[i] = hptr;
// copy the old list
for (int j = 0; j < n; j++)
- {
+ {
*hptr++ = oldptr[j];
- }
- delete [] oldptr;
}
+ delete [] oldptr;
+ }
hptr->Hash = h;
hptr->Dict = dict;
@@ -286,21 +286,21 @@ void vtkDICOMDictionary::RemovePrivateDictionary(const char *name)
unsigned int i = (h & m);
if (htable && (hptr = htable[i]) != NULL)
- {
+ {
while (hptr->Dict != 0)
- {
+ {
if (hptr->Hash == h && strncmp(hptr->Dict->Name, stripname, 64) == 0)
- {
+ {
break;
- }
- hptr++;
}
+ hptr++;
+ }
// erase
while (hptr->Dict != 0)
- {
+ {
*hptr = *(hptr + 1);
hptr++;
- }
}
+ }
}
diff --git a/Source/vtkDICOMDictionary.h b/Source/vtkDICOMDictionary.h
index 8d431b2..c406f7d 100644
--- a/Source/vtkDICOMDictionary.h
+++ b/Source/vtkDICOMDictionary.h
@@ -26,18 +26,20 @@
class VTKDICOM_EXPORT vtkDICOMDictionary
{
public:
+ //! A struct to store a DICOM dictionary hash table.
struct Dict
{
const char *Name;
unsigned short HashSize;
unsigned short DataSize;
- unsigned short *TagHashTable;
- unsigned short *KeyHashTable;
- vtkDICOMDictEntry::Entry *Contents;
+ const unsigned short *TagHashTable;
+ const unsigned short *KeyHashTable;
+ const vtkDICOMDictEntry::Entry *Contents;
};
struct DictHashEntry;
+ //@{
//! Find the dictionary entry for the given tag.
static vtkDICOMDictEntry FindDictEntry(const vtkDICOMTag tag) {
return vtkDICOMDictionary::FindDictEntry(tag, 0); }
@@ -45,7 +47,9 @@ public:
//! Find the dictionary for the given key.
static vtkDICOMDictEntry FindDictEntry(const char *key) {
return vtkDICOMDictionary::FindDictEntry(key, 0); }
+ //@}
+ //@{
//! Include a private dictionary when searching for the tag.
/*!
* This method requires that the creator of the private dictionary
@@ -66,7 +70,9 @@ public:
*/
static vtkDICOMDictEntry FindDictEntry(
const char *key, const char *privateDict);
+ //@}
+ //@{
//! Add the hash table for a private dictionary.
/*!
* The name should be the text that appears in the PrivateCreator
@@ -77,6 +83,7 @@ public:
//! Remove a private dictionary.
static void RemovePrivateDictionary(const char *name);
+ //@}
private:
friend class vtkDICOMDictionaryInitializer;
@@ -102,6 +109,7 @@ private:
static DictHashEntry *PrivateDictTable[DICT_PRIVATE_TABLE_SIZE];
};
+//! @cond
//! Initializer (Schwarz counter).
/*!
* This ensures that the vtkDICOMDictionary module is initialized before
@@ -119,6 +127,7 @@ private:
};
static vtkDICOMDictionaryInitializer vtkDICOMDictionaryInitializerInstance;
+//! @endcond
#endif /* vtkDICOMDictionary_h */
// VTK-HeaderTest-Exclude: vtkDICOMDictionary.h
diff --git a/Source/vtkDICOMDirectory.cxx b/Source/vtkDICOMDirectory.cxx
index 7ec5287..a7cabf4 100644
--- a/Source/vtkDICOMDirectory.cxx
+++ b/Source/vtkDICOMDirectory.cxx
@@ -13,6 +13,9 @@
=========================================================================*/
#include "vtkDICOMDirectory.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
#include "vtkDICOMItem.h"
#include "vtkDICOMMetaData.h"
#include "vtkDICOMSequence.h"
@@ -38,9 +41,6 @@
#include <algorithm>
#include <utility>
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-
#include <ctype.h>
#include <stdlib.h>
@@ -142,6 +142,7 @@ vtkDICOMDirectory::vtkDICOMDirectory()
this->InternalFileName = 0;
this->RequirePixelData = 1;
this->FollowSymlinks = 1;
+ this->ShowHidden = 1;
this->ScanDepth = 1;
this->Query = 0;
this->FindLevel = vtkDICOMDirectory::IMAGE;
@@ -152,9 +153,9 @@ vtkDICOMDirectory::vtkDICOMDirectory()
vtkDICOMDirectory::~vtkDICOMDirectory()
{
if (this->InputFileNames)
- {
+ {
this->InputFileNames->Delete();
- }
+ }
delete [] this->DirectoryName;
delete [] this->FilePattern;
@@ -206,18 +207,18 @@ void vtkDICOMDirectory::SetDirectoryName(const char *name)
if (name == this->DirectoryName ||
(name && this->DirectoryName &&
strcmp(name, this->DirectoryName) == 0))
- {
+ {
return;
- }
+ }
delete [] this->DirectoryName;
this->DirectoryName = 0;
if (name)
- {
+ {
char *cp = new char[strlen(name) + 1];
strcpy(cp, name);
this->DirectoryName = cp;
- }
+ }
this->Modified();
}
@@ -227,18 +228,18 @@ void vtkDICOMDirectory::SetFilePattern(const char *name)
if (name == this->FilePattern ||
(name && this->FilePattern &&
strcmp(name, this->FilePattern) == 0))
- {
+ {
return;
- }
+ }
delete [] this->FilePattern;
this->FilePattern = 0;
if (name)
- {
+ {
char *cp = new char[strlen(name) + 1];
strcpy(cp, name);
this->FilePattern = cp;
- }
+ }
this->Modified();
}
@@ -246,51 +247,72 @@ void vtkDICOMDirectory::SetFilePattern(const char *name)
void vtkDICOMDirectory::SetInputFileNames(vtkStringArray *sa)
{
if (sa != this->InputFileNames)
+ {
+ if (!sa)
{
- if (this->InputFileNames)
- {
this->InputFileNames->Delete();
- }
- if (sa)
+ }
+ else
+ {
+ if (!this->InputFileNames)
{
- sa->Register(this);
+ this->InputFileNames = vtkStringArray::New();
}
- this->InputFileNames = sa;
+ this->InputFileNames->DeepCopy(sa);
+ }
this->Modified();
+ }
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMDirectory::AddInputFileNames(vtkStringArray *sa)
+{
+ if (sa && sa->GetNumberOfValues() > 0)
+ {
+ if (!this->InputFileNames)
+ {
+ this->InputFileNames = vtkStringArray::New();
+ }
+ vtkIdType n = sa->GetNumberOfValues();
+ for (vtkIdType i = 0; i < n; i++)
+ {
+ this->InputFileNames->InsertNextValue(sa->GetValue(i));
}
+ this->Modified();
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMDirectory::SetFindQuery(const vtkDICOMItem& item)
{
if (this->Query != &item)
- {
+ {
delete this->Query;
this->Query = 0;
if (!item.IsEmpty())
- {
+ {
this->Query = new vtkDICOMItem;
*(this->Query) = item;
- }
}
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMDirectory::SetFindLevel(int level)
{
if (level < vtkDICOMDirectory::SERIES)
- {
+ {
level = vtkDICOMDirectory::SERIES;
- }
+ }
if (level > vtkDICOMDirectory::IMAGE)
- {
+ {
level = vtkDICOMDirectory::IMAGE;
- }
+ }
if (level != this->FindLevel)
- {
+ {
this->FindLevel = level;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -377,13 +399,13 @@ std::string OsirixCleanString(const std::string& text)
std::string s;
size_t l = text.length();
if (l > 0)
- {
+ {
char space = '\0';
for (size_t i = 0; i < l; i++)
- {
+ {
char c = text[i];
switch (c)
- {
+ {
case ',':
case '^':
c = '\0';
@@ -403,18 +425,18 @@ std::string OsirixCleanString(const std::string& text)
c = '\0';
space = ' ';
break;
- }
+ }
if (c)
- {
+ {
if (space)
- {
+ {
s.push_back(space);
space = '\0';
- }
- s.push_back(c);
}
+ s.push_back(c);
}
}
+ }
return s;
}
@@ -427,7 +449,7 @@ bool MatchesOsirixDatabase(
unsigned short g = tag.GetGroup();
if (u.GetNumberOfValues() > 0 && v.GetNumberOfValues() > 0 &&
(g == 0x0008 || g == 0x0010))
- {
+ {
const DC::EnumType tagsToClean[] = {
DC::StudyDescription,
DC::SeriesDescription,
@@ -439,14 +461,14 @@ bool MatchesOsirixDatabase(
};
for (int i = 0; tagsToClean[i] != DC::ItemDelimitationItem; i++)
- {
+ {
needsCleanCompare |= (tag == tagsToClean[i]);
- }
}
+ }
bool matched = false;
if (needsCleanCompare)
- {
+ {
vtkDICOMValue uclean(
u.GetVR(), vtkDICOMCharacterSet::ISO_IR_192,
OsirixCleanString(u.AsUTF8String()));
@@ -454,11 +476,11 @@ bool MatchesOsirixDatabase(
v.GetVR(), vtkDICOMCharacterSet::ISO_IR_192,
OsirixCleanString(v.AsUTF8String()));
matched = uclean.Matches(vclean);
- }
+ }
else
- {
+ {
matched = u.Matches(v);
- }
+ }
return matched;
}
@@ -472,37 +494,37 @@ bool vtkDICOMDirectory::MatchesQuery(
bool matched = true;
if (this->Query)
- {
+ {
vtkDICOMDataElementIterator iter;
for (iter = record.Begin(); iter != record.End(); ++iter)
- {
+ {
vtkDICOMTag tag = iter->GetTag();
if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004)
- {
+ {
const vtkDICOMValue& v = this->Query->GetAttributeValue(tag);
if (v.IsValid())
- {
+ {
const vtkDICOMValue& u = iter->GetValue();
if (this->UsingOsirixDatabase)
- {
+ {
matched = MatchesOsirixDatabase(tag, u, v);
- }
+ }
else
- {
+ {
matched = u.Matches(v);
- }
+ }
if (matched)
- {
+ {
results.SetAttributeValue(tag, u);
- }
+ }
else
- {
+ {
break;
- }
}
}
}
}
+ }
return matched;
}
@@ -515,51 +537,51 @@ int vtkDICOMDirectory::MatchesImageQuery(
bool misMatched = false;
if (this->Query)
- {
+ {
vtkDICOMDataElementIterator iter;
for (iter = this->Query->Begin(); iter != this->Query->End(); ++iter)
- {
+ {
vtkDICOMTag tag = iter->GetTag();
const vtkDICOMValue& v = iter->GetValue();
if (v.GetVR() == vtkDICOMVR::SQ)
- {
+ {
if (v.GetNumberOfValues() > 0)
- {
+ {
fullyMatched = false;
break;
- }
}
+ }
else if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004)
- {
+ {
if (v.GetVL() > 0)
- {
+ {
if (!results.GetAttributeValue(tag).IsValid())
- {
+ {
const vtkDICOMValue& u = record.GetAttributeValue(tag);
if (!u.IsValid())
- {
+ {
fullyMatched = false;
- }
+ }
else if (!u.Matches(v))
- {
+ {
misMatched = true;
break;
- }
}
}
}
}
}
+ }
int r = 1;
if (fullyMatched)
- {
+ {
r = 0;
- }
+ }
if (misMatched)
- {
+ {
r = -1;
- }
+ }
return r;
}
@@ -573,12 +595,12 @@ void vtkDICOMDirectory::AddSeriesWithQuery(
const vtkDICOMItem *imageRecords[])
{
if (this->Query == 0)
- {
+ {
this->AddSeriesFileNames(
patient, study, files,
patientRecord, studyRecord, seriesRecord, imageRecords);
return;
- }
+ }
// To store results of querying the patient, study, series records
vtkDICOMItem results;
@@ -586,41 +608,41 @@ void vtkDICOMDirectory::AddSeriesWithQuery(
if (this->MatchesQuery(patientRecord, results) &&
this->MatchesQuery(studyRecord, results) &&
this->MatchesQuery(seriesRecord, results))
- {
+ {
// Have we checked all the attributes in the query?
bool fullyMatched = true;
vtkDICOMDataElementIterator iter;
for (iter = this->Query->Begin(); iter != this->Query->End(); ++iter)
- {
+ {
vtkDICOMTag tag = iter->GetTag();
const vtkDICOMValue& v = iter->GetValue();
if (v.GetVR() == vtkDICOMVR::SQ)
- {
+ {
if (v.GetNumberOfValues() > 0)
- {
+ {
fullyMatched = false;
break;
- }
}
+ }
else if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004)
- {
+ {
if (v.GetVL() > 0 &&
!results.GetAttributeValue(tag).IsValid())
- {
+ {
fullyMatched = false;
break;
- }
}
}
+ }
if (fullyMatched)
- {
+ {
// All query attributes have been matched!
this->AddSeriesFileNames(
patient, study, files,
patientRecord, studyRecord, seriesRecord, imageRecords);
return;
- }
+ }
// Need to query against the actual files
const vtkDICOMItem **usedImageRecords = imageRecords;
@@ -642,64 +664,64 @@ void vtkDICOMDirectory::AddSeriesWithQuery(
vtkIdType n = files->GetNumberOfValues();
// Only check the first file unless image-level query
if (n > 0 && this->FindLevel < vtkDICOMDirectory::IMAGE)
- {
+ {
n = 1;
- }
+ }
for (vtkIdType i = 0; i < n; i++)
- {
+ {
const std::string& fileName = files->GetValue(i);
bool matched = false;
int r = this->MatchesImageQuery(*imageRecords[i], results);
if (r == 0)
- {
+ {
// All remaining queries were matched by image record
matched = true;
- }
+ }
else if (r > 0)
- {
+ {
// Read the file metadata
meta->Initialize();
this->SetInternalFileName(fileName.c_str());
parser->SetFileName(fileName.c_str());
parser->Update();
if (!parser->GetPixelDataFound())
- {
+ {
if (!this->ErrorCode)
- {
+ {
this->ErrorCode = parser->GetErrorCode();
- }
+ }
if (this->ErrorCode || this->RequirePixelData)
- {
+ {
continue;
- }
}
- matched = parser->GetQueryMatched();
}
+ matched = parser->GetQueryMatched();
+ }
if (matched)
- {
+ {
if (this->FindLevel < vtkDICOMDirectory::IMAGE)
- {
+ {
// Add all the files.
a = files;
- }
+ }
else
- {
+ {
// Add the matched file.
a->InsertNextValue(fileName);
newImageRecords.push_back(imageRecords[i]);
usedImageRecords = &newImageRecords[0];
- }
}
}
+ }
if (a->GetNumberOfValues() > 0)
- {
+ {
this->AddSeriesFileNames(
patient, study, a,
patientRecord, studyRecord, seriesRecord, usedImageRecords);
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -715,72 +737,127 @@ void vtkDICOMDirectory::AddSeriesFileNames(
int series = static_cast<int>(this->Series->size());
if (study == n)
- {
+ {
this->Studies->push_back(StudyItem());
StudyItem& item = this->Studies->back();
item.Record = studyRecord;
item.PatientRecord = patientRecord;
item.FirstSeries = series;
item.LastSeries = series;
- }
- else if (n >= 0 && study == n-1)
- {
- (*this->Studies)[study].LastSeries = series;
- }
- else
- {
+ }
+ else if (n < 0 || study != n-1)
+ {
vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing study")
return;
- }
+ }
if (patient == m)
- {
+ {
this->Patients->push_back(PatientItem());
PatientItem& item = this->Patients->back();
item.Record = patientRecord;
item.Studies = vtkSmartPointer<vtkIntArray>::New();
item.Studies->InsertNextValue(study);
- }
+ }
else if (m >= 0 && patient <= m-1)
- {
+ {
PatientItem& item = (*this->Patients)[patient];
vtkIdType nn = item.Studies->GetMaxId() + 1;
vtkIdType ii = 0;
for (; ii < nn; ii++)
- {
+ {
if (study == item.Studies->GetValue(ii))
- {
+ {
break;
- }
}
+ }
if (ii == nn)
- {
+ {
item.Studies->InsertNextValue(study);
- }
}
+ }
else
- {
+ {
vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing patient")
return;
- }
+ }
+ // Check for files that are duplicate instances
int ni = static_cast<int>(files->GetNumberOfValues());
- vtkSmartPointer<vtkDICOMMetaData> meta =
- vtkSmartPointer<vtkDICOMMetaData>::New();
- meta->SetNumberOfInstances(ni);
- this->CopyRecord(meta, &patientRecord, -1);
- this->CopyRecord(meta, &studyRecord, -1);
- this->CopyRecord(meta, &seriesRecord, -1);
+ std::vector<const vtkDICOMValue *> uids(ni);
+ for (int ii = 0; ii < ni; ii++)
+ {
+ uids[ii] = &imageRecords[ii]->GetAttributeValue(DC::SOPInstanceUID);
+ }
+ std::vector<int> duplicate(ni);
+ std::vector<int> seriesLength;
+ seriesLength.push_back(0);
+ int numberOfDuplicates = 0;
for (int ii = 0; ii < ni; ii++)
+ {
+ int count = 0;
+ const vtkDICOMValue *uid = uids[ii];
+ if (uid->GetVL() > 0)
+ {
+ for (int jj = 0; jj < ii; jj++)
+ {
+ if (*(uids[jj]) == *uid)
+ {
+ count++;
+ }
+ }
+ }
+ duplicate[ii] = count;
+ if (count > numberOfDuplicates)
+ {
+ numberOfDuplicates = count;
+ seriesLength.push_back(0);
+ }
+ seriesLength[count]++;
+ }
+
+ // Add each duplicate as a separate series
+ for (int kk = 0; kk <= numberOfDuplicates; kk++)
+ {
+ vtkSmartPointer<vtkDICOMMetaData> meta =
+ vtkSmartPointer<vtkDICOMMetaData>::New();
+ meta->SetNumberOfInstances(seriesLength[kk]);
+ this->CopyRecord(meta, &patientRecord, -1);
+ this->CopyRecord(meta, &studyRecord, -1);
+ this->CopyRecord(meta, &seriesRecord, -1);
+
+ vtkSmartPointer<vtkStringArray> newfiles;
+ if (numberOfDuplicates > 0)
{
- this->CopyRecord(meta, imageRecords[ii], ii);
+ newfiles = vtkSmartPointer<vtkStringArray>::New();
+ newfiles->SetNumberOfValues(seriesLength[kk]);
+ }
+ else
+ {
+ newfiles = files;
+ }
+
+ int jj = 0;
+ for (int ii = 0; ii < ni; ii++)
+ {
+ if (duplicate[ii] == kk)
+ {
+ this->CopyRecord(meta, imageRecords[ii], jj);
+ if (numberOfDuplicates > 0)
+ {
+ newfiles->SetValue(jj, files->GetValue(ii));
+ }
+ jj++;
+ }
}
- this->Series->push_back(SeriesItem());
- SeriesItem& item = this->Series->back();
- item.Record = seriesRecord;
- item.Files = files;
- item.Meta = meta;
+ (*this->Studies)[study].LastSeries = series++;
+ this->Series->push_back(SeriesItem());
+ SeriesItem& item = this->Series->back();
+ item.Record = seriesRecord;
+ item.Files = newfiles;
+ item.Meta = meta;
+ }
}
//----------------------------------------------------------------------------
@@ -790,38 +867,38 @@ void vtkDICOMDirectory::CopyRecord(
vtkDICOMDataElementIterator iter = item->Begin();
vtkDICOMDataElementIterator iterEnd = item->End();
for (; iter != iterEnd; ++iter)
- {
+ {
vtkDICOMTag tag = iter->GetTag();
if (tag.GetGroup() == 0x0004)
- {
+ {
// DICOMDIR-specific tags
if (tag == DC::ReferencedSOPClassUIDInFile)
- {
+ {
tag = DC::SOPClassUID;
- }
+ }
else if (tag == DC::ReferencedSOPInstanceUIDInFile)
- {
+ {
tag = DC::SOPInstanceUID;
- }
+ }
else if (tag == DC::ReferencedTransferSyntaxUIDInFile)
- {
+ {
tag = DC::TransferSyntaxUID;
- }
+ }
else
- {
+ {
continue;
- }
}
+ }
if (instance >= 0)
- {
+ {
meta->SetAttributeValue(instance, tag, iter->GetValue());
- }
+ }
else
- {
+ {
meta->SetAttributeValue(tag, iter->GetValue());
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -839,10 +916,10 @@ void vtkDICOMDirectory::FillImageRecord(
const DC::EnumType *tag = tags;
while (*tag != DC::ItemDelimitationItem)
- {
+ {
item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
tag++;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -862,10 +939,10 @@ void vtkDICOMDirectory::FillSeriesRecord(
const DC::EnumType *tag = tags;
while (*tag != DC::ItemDelimitationItem)
- {
+ {
item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
tag++;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -887,10 +964,10 @@ void vtkDICOMDirectory::FillStudyRecord(
const DC::EnumType *tag = tags;
while (*tag != DC::ItemDelimitationItem)
- {
+ {
item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
tag++;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -908,10 +985,31 @@ void vtkDICOMDirectory::FillPatientRecord(
const DC::EnumType *tag = tags;
while (*tag != DC::ItemDelimitationItem)
- {
+ {
item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
tag++;
- }
+ }
+}
+
+//----------------------------------------------------------------------------
+namespace {
+
+unsigned int vtkDICOMDirectoryHashString(const std::string& str)
+{
+ // Compute a string hash based on the function "djb2".
+ unsigned int h = 5381;
+ size_t n = str.size();
+ const char *cp = str.data();
+ for (size_t k = 0; k < n; k++)
+ {
+ unsigned char c = cp[k];
+ if (c == '\0') { break; }
+ h = (h << 5) + h + c;
+ }
+
+ return h;
+}
+
}
//----------------------------------------------------------------------------
@@ -967,24 +1065,24 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
for (const DC::EnumType *tagPtr = requiredElements;
*tagPtr != DC::ItemDelimitationItem;
++tagPtr)
- {
+ {
vtkDICOMVR vr = query->FindDictVR(0, *tagPtr);
query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
- }
+ }
if (this->Query)
- {
+ {
// add elements that the user requested for the query
vtkDICOMDataElementIterator iter = this->Query->Begin();
vtkDICOMDataElementIterator iterEnd = this->Query->End();
while (iter != iterEnd)
- {
+ {
query->SetAttributeValue(iter->GetTag(), iter->GetValue());
++iter;
- }
+ }
// use a buffer size equal to one disk block
parser->SetBufferSize(4096);
- }
+ }
parser->SetQuery(query);
@@ -992,19 +1090,66 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
SeriesInfoList::iterator li;
vtkIdType numberOfStrings = input->GetNumberOfValues();
+
+ // Hash table for efficiently checking for duplicates
+ typedef std::vector<vtkIdType> rowType;
+ typedef std::vector<rowType> tableType;
+ tableType dupcheck(numberOfStrings/4 + 1);
+ std::vector<std::string> realnames;
+ realnames.reserve(numberOfStrings);
+
for (vtkIdType j = 0; j < numberOfStrings; j++)
- {
+ {
const std::string& fileName = input->GetValue(j);
+ // Check to see if this file name has already appeared, this is
+ // done with a hash table and is an O(n) check, which is better
+ // than using std::map at O(n log n) or brute-force at O(n^2)
+ realnames.push_back(vtkDICOMFilePath(fileName).GetRealPath());
+ const std::string& realname = realnames.back();
+ unsigned int hash = vtkDICOMDirectoryHashString(realname);
+ hash = hash % dupcheck.size();
+ rowType& row = dupcheck[hash];
+ rowType::iterator iter = row.begin();
+ for (; iter != row.end(); ++iter)
+ {
+ if (realnames[*iter] == realname)
+ {
+ break;
+ }
+ }
+ if (iter != row.end())
+ {
+ continue;
+ }
+ row.push_back(j);
+
// Skip anything that does not look like a DICOM file.
if (!vtkDICOMUtilities::IsDICOMFile(fileName.c_str()))
+ {
+ int code = vtkDICOMFile::Access(fileName.c_str(), vtkDICOMFile::In);
+ if (code == vtkDICOMFile::FileNotFound)
{
- if (!vtksys::SystemTools::FileExists(fileName.c_str()))
- {
vtkWarningMacro("File does not exist: " << fileName.c_str());
- }
- continue;
}
+ else if (code == vtkDICOMFile::AccessDenied)
+ {
+ vtkWarningMacro("File permission denied: " << fileName.c_str());
+ }
+ else if (code == vtkDICOMFile::FileIsDirectory)
+ {
+ vtkWarningMacro("File is a directory: " << fileName.c_str());
+ }
+ else if (code == vtkDICOMFile::ImpossiblePath)
+ {
+ vtkWarningMacro("Bad file path: " << fileName.c_str());
+ }
+ else if (code != 0)
+ {
+ vtkWarningMacro("Unknown file error: " << fileName.c_str());
+ }
+ continue;
+ }
// Read the file metadata
meta->Initialize();
@@ -1012,38 +1157,38 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
parser->SetFileName(fileName.c_str());
parser->Update();
if (!parser->GetPixelDataFound())
- {
+ {
if (!this->ErrorCode)
- {
+ {
this->ErrorCode = parser->GetErrorCode();
- }
+ }
if (this->ErrorCode || this->RequirePixelData)
- {
+ {
continue;
- }
}
+ }
// Check for abort and update progress at 1% intervals
if (!this->AbortExecute)
- {
+ {
double progress = (j + 1.0)/numberOfStrings;
if (progress == 1.0 || progress > this->GetProgress() + 0.01)
- {
+ {
progress = static_cast<int>(progress*100.0)/100.0;
this->UpdateProgress(progress);
- }
}
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
+ }
// Check if the file matches the query
bool queryMatched = (!this->Query || parser->GetQueryMatched());
if (!queryMatched && this->FindLevel == vtkDICOMDirectory::IMAGE)
- {
+ {
continue;
- }
+ }
// Insert the file into the sorted list
FileInfo fileInfo;
@@ -1078,7 +1223,7 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
bool foundSeries = false;
for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
- {
+ {
// Compare patient, then study, then series.
const char *patientName2 = li->PatientName.GetCharData();
patientName2 = (patientName2 ? patientName2 : "");
@@ -1086,48 +1231,48 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
patientID2 = (patientID2 ? patientID2 : "");
int c = strcmp(patientID2, patientID);
if (c != 0 || patientID[0] == '\0')
- {
+ {
// Use ID to identify patient, but use name to sort.
int c2 = strcmp(patientName2, patientName);
c = (c2 == 0 ? c : c2);
- }
+ }
if (c == 0)
- {
+ {
c = vtkDICOMUtilities::CompareUIDs(
studyUID, li->StudyUID.GetCharData());
if (c != 0 || studyUID == 0)
- {
+ {
// Use UID to identify study, but use date to sort.
int c2 = 0;
const char *studyDate2 = li->StudyDate.GetCharData();
if (studyDate && studyDate2)
- {
+ {
c2 = strcmp(studyDate2, studyDate);
if (c2 == 0)
- {
+ {
const char *studyTime2 = li->StudyTime.GetCharData();
if (studyTime2 && studyTime)
- {
+ {
c2 = strcmp(studyTime, studyTime2);
- }
}
}
- c = (c2 == 0 ? c : c2);
}
+ c = (c2 == 0 ? c : c2);
+ }
if (c == 0)
- {
+ {
c = vtkDICOMUtilities::CompareUIDs(
seriesUID, li->SeriesUID.GetCharData());
if (c != 0 || seriesUID == 0)
- {
+ {
// Use UID to identify series, but use series number to sort.
int c2 = li->SeriesNumber - seriesNumber;
c = (c2 == 0 ? c : c2);
- }
}
}
+ }
if (c == 0 && seriesUID != 0)
- {
+ {
std::vector<FileInfo>::iterator pos =
li->Files.insert(
std::upper_bound(li->Files.begin(), li->Files.end(), fileInfo,
@@ -1136,15 +1281,15 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
li->QueryMatched |= queryMatched;
foundSeries = true;
break;
- }
+ }
else if (c >= 0)
- {
+ {
break;
- }
}
+ }
if (!foundSeries)
- {
+ {
li = sortedFiles.insert(li, SeriesInfo());
li->PatientName = patientNameValue;
li->PatientID = patientIDValue;
@@ -1158,8 +1303,8 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
this->FillStudyRecord(&li->StudyRecord, meta);
this->FillSeriesRecord(&li->SeriesRecord, meta);
this->FillImageRecord(&li->Files.back().ImageRecord, meta);
- }
}
+ }
// Visit each series and call AddSeriesFileNames
int patientCount = this->GetNumberOfPatients();
@@ -1169,23 +1314,23 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
vtkDICOMValue lastPatientID;
for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
- {
+ {
SeriesInfo &v = *li;
if (!v.QueryMatched) { continue; }
// Is this a new patient or a new study?
if (!lastPatientID.IsValid() || v.PatientID != lastPatientID)
- {
+ {
lastPatientID = v.PatientID;
patientCount++;
lastStudyUID = v.StudyUID;
studyCount++;
- }
+ }
else if (!lastStudyUID.IsValid() || v.StudyUID != lastStudyUID)
- {
+ {
lastStudyUID = v.StudyUID;
studyCount++;
- }
+ }
vtkSmartPointer<vtkStringArray> sa =
vtkSmartPointer<vtkStringArray>::New();
@@ -1193,14 +1338,14 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
sa->SetNumberOfValues(n);
std::vector<const vtkDICOMItem *> imageRecords(n);
for (vtkIdType i = 0; i < n; i++)
- {
+ {
sa->SetValue(i, v.Files[i].FileName);
imageRecords[i] = &v.Files[i].ImageRecord;
- }
+ }
this->AddSeriesFileNames(
patientCount-1, studyCount-1, sa,
v.PatientRecord, v.StudyRecord, v.SeriesRecord, &imageRecords[0]);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -1218,7 +1363,7 @@ std::string DecompressUID(const std::string& s)
size_t n = s.length();
size_t m = 0;
for (size_t i = 0; i < n && i < 32; i++)
- {
+ {
unsigned char c = s[i];
c >>= 4;
if (c == 0) { break; }
@@ -1231,7 +1376,7 @@ std::string DecompressUID(const std::string& s)
c += ('0' - 1);
if (c > '9') { c = '.'; }
uid[m++] = c;
- }
+ }
return std::string(uid, m);
}
@@ -1245,29 +1390,28 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
vtkSmartPointer<vtkSQLiteDatabase>::New();
dbase->SetDatabaseFileName(fname);
if (!dbase->Open("", vtkSQLiteDatabase::USE_EXISTING))
- {
+ {
vtkErrorMacro("Unable to open database file " << fname);
return;
- }
+ }
// Make sure this is an OsiriX database file.
vtkStringArray *tables = dbase->GetTables();
int count = 0;
for (vtkIdType i = 0; i < tables->GetNumberOfValues(); i++)
- {
+ {
std::string s = tables->GetValue(i);
count += (s == "ZSTUDY" || s == "ZSERIES" || s == "ZIMAGE");
- }
+ }
if (count != 3)
- {
+ {
return;
- }
+ }
// Create the path to DATABASE.noindex, where .dcm files are stored
- std::vector<std::string> path;
- vtksys::SystemTools::SplitPath(fname, path);
- path.pop_back();
- path.push_back("DATABASE.noindex");
+ vtkDICOMFilePath path(fname);
+ path.PopBack();
+ path.PushBack("DATABASE.noindex");
vtkSQLQuery *q = dbase->GetQueryInstance();
@@ -1305,46 +1449,46 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
"ZACCESSIONNUMBER,ZPATIENTSEX,ZPATIENTID from ZSTUDY"
" order by ZDATE") ||
!q->Execute())
- {
+ {
vtkErrorMacro("Badly structured ZSTUDY table: " << fname);
q->CommitTransaction();
q->Delete();
return;
- }
+ }
while (q->NextRow())
- {
+ {
studyTable.push_back(StudyRow());
StudyRow *row = &studyTable.back();
for (int k = 0; k < ST_NCOLS; k++)
- {
+ {
row->col[k] = q->DataValue(k);
- }
}
+ }
// Read the series table
if (!q->SetQuery("select Z_PK,ZID,ZDATE,ZSERIESSOPCLASSUID,"
"ZMODALITY,ZNAME,ZSERIESDICOMUID,ZSERIESDESCRIPTION,"
"ZSTUDY from ZSERIES order by ZSTUDY,ZID") ||
!q->Execute())
- {
+ {
vtkErrorMacro("Badly structured ZSERIES table: " << fname);
q->CommitTransaction();
q->Delete();
return;
- }
+ }
std::vector<vtkTypeInt64> zseriesVec;
while (q->NextRow())
- {
+ {
seriesTable.push_back(SeriesRow());
SeriesRow *row = &seriesTable.back();
for (int k = 0; k < SE_NCOLS; k++)
- {
+ {
row->col[k] = q->DataValue(k);
- }
- zseriesVec.push_back(q->DataValue(SE_NCOLS).ToTypeInt64());
}
+ zseriesVec.push_back(q->DataValue(SE_NCOLS).ToTypeInt64());
+ }
// Read the image table
if (!q->SetQuery("select ZINSTANCENUMBER,ZFRAMEID,ZPATHNUMBER,"
@@ -1353,24 +1497,24 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
" from ZIMAGE order by"
" ZSERIES,ZINSTANCENUMBER") ||
!q->Execute())
- {
+ {
vtkErrorMacro("Badly structured IMAGE table: " << fname);
q->CommitTransaction();
q->Delete();
return;
- }
+ }
std::vector<vtkTypeInt64> zimageVec;
while (q->NextRow())
- {
+ {
imageTable.push_back(ImageRow());
ImageRow *row = &imageTable.back();
for (int k = 0; k < IM_NCOLS; k++)
- {
+ {
row->col[k] = q->DataValue(k);
- }
- zimageVec.push_back(q->DataValue(IM_NCOLS).ToTypeInt64());
}
+ zimageVec.push_back(q->DataValue(IM_NCOLS).ToTypeInt64());
+ }
// Close the database and delete it by setting the smart pointer to NULL.
// Calling CommitTransaction doesn't write anything, because only SELECT
@@ -1384,18 +1528,18 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
// Check for abort.
if (!this->AbortExecute)
- {
+ {
this->UpdateProgress(0.0);
- }
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
+ }
// Go through all of the studies
for (std::vector<StudyRow>::iterator st = studyTable.begin();
st != studyTable.end(); ++st)
- {
+ {
vtkDICOMItem patientItem;
vtkDICOMItem studyItem;
vtkTypeInt64 zstudy = st->col[ST_PK].ToTypeInt64();
@@ -1439,28 +1583,28 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
int firstUnusedPatientIdx = this->GetNumberOfPatients();
// Loop until corrent patientIdx is found
for (patientIdx = 0; patientIdx < firstUnusedPatientIdx; patientIdx++)
- {
+ {
const vtkDICOMItem& pitem = this->GetPatientRecord(patientIdx);
const vtkDICOMValue& vid = pitem.GetAttributeValue(DC::PatientID);
if (vid.IsValid() && vid.GetVL() > 0)
- {
+ {
if (patientID.length() > 0 && vid.Matches(patientID.c_str()))
- {
+ {
break;
- }
}
+ }
else // Use PatientName if PatientID is empty
- {
+ {
const vtkDICOMValue& vna = pitem.GetAttributeValue(DC::PatientName);
if (vna.IsValid() && vna.GetVL() > 0)
- {
+ {
if (name.length() > 0 && vna.Matches(name.c_str()))
- {
+ {
break;
- }
}
}
}
+ }
// Search for the first series in the study
std::vector<vtkTypeInt64>::iterator zseriesVecIter =
@@ -1470,12 +1614,12 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
// Go through all of the series in the study
for (std::vector<SeriesRow>::iterator se = seriesTable.begin() + seIdx;
se != seriesTable.end(); ++se)
- {
+ {
// Break when we find a series that isn't part of the study
if (*zseriesVecIter > zstudy)
- {
+ {
break;
- }
+ }
++zseriesVecIter;
vtkDICOMItem seriesItem;
@@ -1490,13 +1634,13 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
size_t k = 0;
while (k < seriesUID.length() &&
(seriesUID[k] <= '0' || seriesUID[k] >= '9'))
- {
+ {
k++;
- }
+ }
if (k > 0)
- {
+ {
seriesUID = seriesUID.substr(k, seriesUID.length()-k);
- }
+ }
seriesItem.SetAttributeValue(
DC::SpecificCharacterSet, vtkDICOMCharacterSet::ISO_IR_192);
@@ -1526,42 +1670,42 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
// Go through all of the images in the series
for (std::vector<ImageRow>::iterator im = imageTable.begin() + imIdx;
im != imageTable.end(); ++im)
- {
+ {
// Break when we find a series that isn't part of the study
if (*zimageVecIter > zseries)
- {
+ {
break;
- }
+ }
++zimageVecIter;
std::string fpath = im->col[IM_PATHSTRING].ToString();
if (fpath.length() == 0)
- {
+ {
// no PATHSTRING, so use PATHNUMBER instead
vtkTypeInt64 fnum = im->col[IM_PATHNUMBER].ToTypeInt64();
vtkTypeInt64 dnum = (fnum/10000 + 1)*10000;
vtkVariant fv(fnum);
vtkVariant dv(dnum);
- path.push_back(dv.ToString());
- path.push_back(fv.ToString() + ".dcm");
- fpath = vtksys::SystemTools::JoinPath(path);
- path.pop_back();
- path.pop_back();
- }
+ path.PushBack(dv.ToString());
+ path.PushBack(fv.ToString() + ".dcm");
+ fpath = path.AsString();
+ path.PopBack();
+ path.PopBack();
+ }
else if (fpath[0] != '/')
- {
+ {
// PATHSTRING is a local path, not an absolute path
vtkTypeInt64 fnum = atol(fpath.c_str());
vtkTypeInt64 dnum = (fnum/10000 + 1)*10000;
vtkVariant dv(dnum);
- path.push_back(dv.ToString());
- path.push_back(fpath);
- fpath = vtksys::SystemTools::JoinPath(path);
- path.pop_back();
- path.pop_back();
- }
+ path.PushBack(dv.ToString());
+ path.PushBack(fpath);
+ fpath = path.AsString();
+ path.PopBack();
+ path.PopBack();
+ }
if (fpath != lastpath)
- {
+ {
// Add the path to the list of filenames
vtkDICOMItem imageRecord;
imageRecord.SetAttributeValue(DC::SOPClassUID, sopClassUID);
@@ -1577,22 +1721,22 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
imageRecordSequence.AddItem(imageRecord);
fileNames->InsertNextValue(fpath);
lastpath = fpath;
- }
+ }
// Increment the progress counter.
imageCounter++;
- }
+ }
// Add the series if it passes the query
size_t n = imageRecordSequence.GetNumberOfItems();
if (n > 0)
- {
+ {
const vtkDICOMItem *data = imageRecordSequence.GetSequenceData();
std::vector<const vtkDICOMItem *> imageRecords(n);
for (size_t i = 0; i < n; i++)
- {
+ {
imageRecords[i] = &data[i];
- }
+ }
// Set a flag to indicate that loose matching is needed, because
// the Osirix database "cleans" certain attribute value strings
@@ -1603,24 +1747,24 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
patientItem, studyItem, seriesItem, &imageRecords[0]);
this->UsingOsirixDatabase = false;
- }
+ }
// Check for abort and update progress at 1% intervals
if (!this->AbortExecute)
- {
+ {
double progress = (imageCounter + 1.0)/imageTable.size();
if (progress == 1.0 || progress > this->GetProgress() + 0.01)
- {
+ {
progress = static_cast<int>(progress*100.0)/100.0;
this->UpdateProgress(progress);
- }
}
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
}
}
+ }
}
//----------------------------------------------------------------------------
@@ -1629,24 +1773,24 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
{
// Get the ID of this file set (informative only).
if (meta->HasAttribute(DC::FileSetID))
- {
+ {
std::string fileSetID = meta->GetAttributeValue(DC::FileSetID).AsString();
this->FileSetID = new char[fileSetID.length() + 1];
strcpy(this->FileSetID, fileSetID.c_str());
- }
+ }
// Get the directory as a sequence.
const vtkDICOMValue& seq =
meta->GetAttributeValue(DC::DirectoryRecordSequence);
- unsigned int n = seq.GetNumberOfValues();
+ unsigned int n = static_cast<unsigned int>(seq.GetNumberOfValues());
const vtkDICOMItem *items = seq.GetSequenceData();
// The DICOMDIR uses byte offsets to identify items in the sequence.
std::map<unsigned int, unsigned int> offsetToIndexMap;
for (unsigned int i = 0; i < n; i++)
- {
+ {
offsetToIndexMap[items[i].GetByteOffset()] = i;
- }
+ }
// Get the first entry.
unsigned int offset =
@@ -1656,22 +1800,22 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
// This check is just for insurance.
if (offset == 0 && n > 0)
- {
+ {
offset = items[0].GetByteOffset();
- }
+ }
// To track progress, count number of items processed.
unsigned int itemCounter = 0;
// Check for abort.
if (!this->AbortExecute)
- {
+ {
this->UpdateProgress(0.0);
- }
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
+ }
// A stack to track the directory level.
std::vector<std::pair<unsigned int, std::string> > offsetStack;
@@ -1686,28 +1830,19 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
vtkSmartPointer<vtkStringArray>::New();
std::vector<const vtkDICOMItem *> imageRecords;
- // Path broken into components.
- std::vector<std::string> path;
- vtksys::SystemTools::SplitPath(dirname, path);
- if (path.size() > 0 && path.back() == "")
- {
- path.pop_back();
- }
- size_t pathDepth = path.size();
-
// The entry type that is currently being processed.
std::string entryType;
// Go through the directory, using the "next" and "child" pointers.
while (offset != 0)
- {
+ {
unsigned int offsetOfChild = 0;
std::map<unsigned int, unsigned int>::iterator iter =
offsetToIndexMap.find(offset);
offset = 0;
if (iter != offsetToIndexMap.end() && iter->second != 0xffffffffu)
- {
+ {
// Get the item index, mark the item as used.
unsigned int j = iter->second;
iter->second = 0xffffffffu;
@@ -1722,68 +1857,88 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
DC::DirectoryRecordType).AsString();
if (entryType == "PATIENT")
- {
+ {
patientItem = j;
- }
+ }
else if (entryType == "STUDY")
- {
+ {
studyItem = j;
- }
+ }
else if (entryType == "SERIES")
- {
+ {
seriesItem = j;
- }
+ }
else if (entryType == "IMAGE" || !this->RequirePixelData)
- {
+ {
const vtkDICOMValue& fileID =
items[j].GetAttributeValue(DC::ReferencedFileID);
if (fileID.IsValid())
- {
- unsigned int m = fileID.GetNumberOfValues();
+ {
+ size_t m = fileID.GetNumberOfValues();
if (m > 0)
+ {
+ vtkDICOMFilePath path(dirname);
+ for (size_t k = 0; k < m; k++)
{
- for (unsigned int k = 0; k < m; k++)
+ path.PushBack(fileID.GetString(k));
+ }
+ vtkIdType ki = fileNames->InsertNextValue(path.AsString());
+ imageRecords.push_back(&items[j]);
+ // sort the files by instance number, they will almost always
+ // already be in order so we use a simple algorithm
+ int inst = items[j].GetAttributeValue(DC::InstanceNumber).AsInt();
+ while (ki > 0)
+ {
+ const vtkDICOMItem *prev = imageRecords[--ki];
+ int inst2 = prev->GetAttributeValue(DC::InstanceNumber).AsInt();
+ if (inst < inst2)
{
- path.push_back(fileID.GetString(k));
+ std::string s = fileNames->GetValue(ki + 1);
+ fileNames->SetValue(ki + 1, fileNames->GetValue(ki));
+ fileNames->SetValue(ki, s);
+ std::swap(imageRecords[ki], imageRecords[ki + 1]);
+ }
+ else
+ {
+ // sorting is finished!
+ break;
}
- fileNames->InsertNextValue(vtksys::SystemTools::JoinPath(path));
- path.resize(pathDepth);
- imageRecords.push_back(&items[j]);
}
}
}
}
+ }
if (offsetOfChild != 0)
- {
+ {
// Go up one directory level.
offsetStack.push_back(std::make_pair(offset, entryType));
offset = offsetOfChild;
- }
+ }
else
- {
+ {
// Pop the stack until the next offset is not zero.
while (offset == 0 && offsetStack.size() > 0)
- {
+ {
// Go down one directory level.
offset = offsetStack.back().first;
entryType = offsetStack.back().second;
offsetStack.pop_back();
if (entryType == "PATIENT")
- {
+ {
// Get current max patient index plus one
patientIdx = this->GetNumberOfPatients();
- }
+ }
else if (entryType == "STUDY")
- {
+ {
// Get current max study index plus one
studyIdx = this->GetNumberOfStudies();
- }
+ }
else if (entryType == "SERIES")
- {
+ {
if (!imageRecords.empty())
- {
+ {
// Add the series if it passes the query
this->AddSeriesWithQuery(
patientIdx, studyIdx, fileNames,
@@ -1792,27 +1947,27 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
fileNames = vtkSmartPointer<vtkStringArray>::New();
imageRecords.clear();
- }
}
}
}
+ }
// Check for abort and update progress at 1% intervals
if (!this->AbortExecute)
- {
+ {
double progress = (itemCounter + 1.0)/n;
if (progress == 1.0 || progress > this->GetProgress() + 0.01)
- {
+ {
progress = static_cast<int>(progress*100.0)/100.0;
this->UpdateProgress(progress);
- }
}
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
- ++itemCounter;
}
+ ++itemCounter;
+ }
}
//----------------------------------------------------------------------------
@@ -1821,38 +1976,33 @@ void vtkDICOMDirectory::ProcessDirectory(
{
// Check if the directory has been visited yet. This avoids infinite
// recursion when following circular links.
- std::string realname = vtksys::SystemTools::GetRealPath(dirname);
+ std::string realname = vtkDICOMFilePath(dirname).GetRealPath();
std::vector<std::string>::iterator viter =
std::lower_bound(this->Visited->begin(), this->Visited->end(), realname);
if (viter == this->Visited->end() || *viter != realname)
- {
+ {
// Add this directory to the "visited" list.
this->Visited->insert(viter, realname);
- }
+ }
else
- {
+ {
// This directory has already been visited.
return;
- }
+ }
// Find the path to the directory.
- std::vector<std::string> path;
- vtksys::SystemTools::SplitPath(dirname, path);
- if (path.size() > 0 && path.back() == "")
- {
- path.pop_back();
- }
+ vtkDICOMFilePath path(dirname);
if (depth == this->ScanDepth)
- {
+ {
// Build the path to the DICOMDIR file.
- path.push_back("DICOMDIR");
- std::string dicomdir = vtksys::SystemTools::JoinPath(path);
- path.pop_back();
+ path.PushBack("DICOMDIR");
+ std::string dicomdir = path.AsString();
+ path.PopBack();
// Check to see if the DICOMDIR file exists.
- if (vtksys::SystemTools::FileExists(dicomdir.c_str(), true))
- {
+ if (vtkDICOMFile::Access(dicomdir.c_str(), vtkDICOMFile::In) == 0)
+ {
vtkSmartPointer<vtkDICOMMetaData> meta =
vtkSmartPointer<vtkDICOMMetaData>::New();
vtkDICOMParser *parser = vtkDICOMParser::New();
@@ -1866,78 +2016,88 @@ void vtkDICOMDirectory::ProcessDirectory(
parser->Delete();
if (errorCode && depth == 0)
- {
+ {
// Only fail if depth is zero. Otherwise, we can ignore the
// DICOMDIR and look for the DICOM files directly.
this->ErrorCode = errorCode;
return;
- }
+ }
else if (errorCode == 0)
- {
+ {
// Process the DICOMDIR file.
this->ProcessDirectoryFile(dirname, meta);
return;
- }
}
}
+ }
// If depth is zero, recursion is complete.
if (depth <= 0)
- {
+ {
return;
- }
+ }
// Check for abort.
if (!this->AbortExecute)
- {
+ {
this->UpdateProgress(0.0);
- }
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
+ }
- vtksys::Directory d;
- if (!d.Load(dirname))
- {
+ vtkDICOMFileDirectory d(dirname);
+ if (d.GetError() != 0)
+ {
// Only fail at the initial depth.
if (depth == this->ScanDepth)
- {
+ {
vtkErrorMacro(<< "Could not read directory " << dirname);
this->ErrorCode = vtkErrorCode::CannotOpenFileError;
return;
- }
}
+ }
- unsigned long n = d.GetNumberOfFiles();
- for (unsigned long i = 0; i < n; i++)
- {
+ int n = d.GetNumberOfFiles();
+ for (int i = 0; i < n; i++)
+ {
const char *fname = d.GetFile(i);
- if (fname[0] != '.' && strcmp(fname, "DICOMDIR") != 0)
+ if ((fname[0] != '.' || (fname[1] != '\0' &&
+ (fname[1] != '.' || fname[2] != '\0'))) &&
+ strcmp(fname, "DICOMDIR") != 0)
+ {
+ path.PushBack(fname);
+ std::string fileString = path.AsString();
+ path.PopBack();
+ if (!this->FollowSymlinks && d.IsSymlink(i))
{
- path.push_back(fname);
- std::string fileString = vtksys::SystemTools::JoinPath(path);
- path.pop_back();
- if (!this->FollowSymlinks &&
- vtksys::SystemTools::FileIsSymlink(fileString.c_str()))
- {
// Do nothing unless FollowSymlinks is On
- }
- else if (vtksys::SystemTools::FileIsDirectory(fileString.c_str()))
- {
+ }
+#ifdef _WIN32
+ else if (!this->ShowHidden && d.IsHidden(i))
+#else
+ else if (!this->ShowHidden && (d.IsHidden(i) || fname[0] == '.'))
+#endif
+ {
+ // Do nothing for hidden files unless ShowHidden is On
+ // (on Linux and OS X, consider "." files to be hidden)
+ }
+ else if (d.IsDirectory(i))
+ {
if (depth > 1)
- {
+ {
this->ProcessDirectory(fileString.c_str(), depth-1, files);
- }
}
+ }
else if (this->FilePattern == 0 || this->FilePattern[0] == '\0' ||
vtkDICOMUtilities::PatternMatches(
this->FilePattern, fileString.c_str()))
- {
+ {
files->InsertNextValue(fileString);
- }
}
}
+ }
}
//----------------------------------------------------------------------------
@@ -1958,68 +2118,110 @@ void vtkDICOMDirectory::Execute()
vtkSmartPointer<vtkStringArray>::New();
if (this->InputFileNames)
- {
+ {
for (vtkIdType i = 0; i < this->InputFileNames->GetNumberOfValues(); i++)
- {
+ {
const std::string& fname = this->InputFileNames->GetValue(i);
- if (vtksys::SystemTools::FileIsDirectory(fname.c_str()))
- {
+ int code = vtkDICOMFile::Access(fname.c_str(), vtkDICOMFile::In);
+ if (code == vtkDICOMFile::FileIsDirectory)
+ {
this->ProcessDirectory(fname.c_str(), this->ScanDepth, files);
- }
- else if (!vtksys::SystemTools::FileExists(fname.c_str()))
- {
+ }
+ else if (code == vtkDICOMFile::FileNotFound)
+ {
+ this->ErrorCode = vtkErrorCode::FileNotFoundError;
vtkErrorMacro("File or directory not found: " << fname.c_str());
return;
- }
+ }
+ else if (code == vtkDICOMFile::AccessDenied)
+ {
+ this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+ vtkErrorMacro("Permission denied: " << fname.c_str());
+ return;
+ }
+ else if (code == vtkDICOMFile::ImpossiblePath)
+ {
+ this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+ vtkErrorMacro("Bad file path: " << fname.c_str());
+ return;
+ }
+ else if (code != 0)
+ {
+ this->ErrorCode = vtkErrorCode::UnknownError;
+ vtkErrorMacro("Unknown file error: " << fname.c_str());
+ return;
+ }
else if (vtkDICOMUtilities::PatternMatches("*.sql", fname.c_str()))
- {
+ {
this->ProcessOsirixDatabase(fname.c_str());
- }
+ }
else if (this->FilePattern == 0 || this->FilePattern[0] == '\0' ||
vtkDICOMUtilities::PatternMatches(
this->FilePattern, fname.c_str()))
- {
+ {
files->InsertNextValue(fname);
- }
}
}
+ }
else
- {
+ {
if (this->DirectoryName == 0)
- {
+ {
// No directory is a valid input. Return an empty output.
return;
- }
- else if (!vtksys::SystemTools::FileExists(this->DirectoryName))
- {
+ }
+
+ int code = vtkDICOMFile::Access(this->DirectoryName, vtkDICOMFile::In);
+ if (code == vtkDICOMFile::FileIsDirectory)
+ {
+ this->ProcessDirectory(this->DirectoryName, this->ScanDepth, files);
+ }
+ else if (code == vtkDICOMFile::FileNotFound)
+ {
this->ErrorCode = vtkErrorCode::FileNotFoundError;
vtkErrorMacro("Directory not found: " << this->DirectoryName);
return;
- }
- else if (!vtksys::SystemTools::FileIsDirectory(this->DirectoryName))
- {
+ }
+ else if (code == vtkDICOMFile::AccessDenied)
+ {
+ this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+ vtkErrorMacro("Permission denied: " << this->DirectoryName);
+ return;
+ }
+ else if (code == vtkDICOMFile::ImpossiblePath)
+ {
+ this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+ vtkErrorMacro("Bad file path: " << this->DirectoryName);
+ return;
+ }
+ else if (code != 0)
+ {
+ this->ErrorCode = vtkErrorCode::UnknownError;
+ vtkErrorMacro("Unknown error: " << this->DirectoryName);
+ return;
+ }
+ else
+ {
this->ErrorCode = vtkErrorCode::CannotOpenFileError;
vtkErrorMacro("Found a file, not a directory: " << this->DirectoryName);
return;
- }
-
- this->ProcessDirectory(this->DirectoryName, this->ScanDepth, files);
}
+ }
// Check for abort.
if (!this->AbortExecute)
- {
+ {
this->UpdateProgress(0.0);
- }
+ }
if (this->AbortExecute)
- {
+ {
return;
- }
+ }
if (files->GetNumberOfValues() > 0)
- {
+ {
this->SortFiles(files);
- }
+ }
this->InvokeEvent(vtkCommand::EndEvent);
}
@@ -2030,57 +2232,57 @@ void vtkDICOMDirectory::Update(int)
this->AbortExecute = 0;
if (this->GetMTime() > this->UpdateTime.GetMTime())
- {
+ {
this->Execute();
this->UpdateTime.Modified();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMDirectory::SetInternalFileName(const char *name)
{
if (this->InternalFileName == NULL && name == NULL)
- {
+ {
return;
- }
+ }
if (this->InternalFileName != 0 && name != 0 &&
strcmp(this->InternalFileName, name) == 0)
- {
+ {
return;
- }
+ }
if (this->InternalFileName)
- {
+ {
delete [] this->InternalFileName;
- }
+ }
if (name)
- {
+ {
size_t n = strlen(name) + 1;
char *cp1 = new char[n];
const char *cp2 = (name);
this->InternalFileName = cp1;
do { *cp1++ = *cp2++; } while (--n);
- }
+ }
else
- {
+ {
this->InternalFileName = 0;
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMDirectory::RelayError(vtkObject *o, unsigned long e, void *data)
{
if (e == vtkCommand::ErrorEvent)
- {
+ {
vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o);
if (parser)
- {
+ {
this->SetErrorCode(parser->GetErrorCode());
this->SetInternalFileName(parser->GetFileName());
- }
- vtkErrorMacro(<< static_cast<char *>(data));
}
+ vtkErrorMacro(<< static_cast<char *>(data));
+ }
else
- {
+ {
this->InvokeEvent(e, data);
- }
+ }
}
diff --git a/Source/vtkDICOMDirectory.h b/Source/vtkDICOMDirectory.h
index 0e342aa..e0cb54a 100644
--- a/Source/vtkDICOMDirectory.h
+++ b/Source/vtkDICOMDirectory.h
@@ -41,17 +41,20 @@ public:
PATIENT, STUDY, SERIES, IMAGE, FRAME
};
+ //@{
//! Set the input directory.
/*!
- * Set the input directory. If it has a DICOMDIR file, then that
- * file will be scanned to get info about the directory. Otherwise,
+ * If the directory has a DICOMDIR file, then that file will be scanned
+ * to get information about the DICOM files in the directory. Otherwise,
* the directory will be scanned for DICOM files. The depth of the
* scan (how many subdirectories deep) can be controlled with the
* SetScanDepth() method.
*/
void SetDirectoryName(const char *name);
const char *GetDirectoryName() { return this->DirectoryName; }
+ //@}
+ //@{
//! Set a list of filenames (or files and directories) to read.
/*!
* This can be used as alternative to setting a single input directory.
@@ -59,6 +62,17 @@ public:
void SetInputFileNames(vtkStringArray *sa);
vtkStringArray *GetInputFileNames() { return this->InputFileNames; }
+ //! Add more filenames to be read.
+ /*!
+ * This allows the directory to be updated. The new files can belong to
+ * an existing series or a new series. If any of the new files are
+ * already present in the directory, then nothing will be done for those
+ * files.
+ */
+ void AddInputFileNames(vtkStringArray *sa);
+ //@}
+
+ //@{
//! Set a pattern to match for the filenames.
/*!
* For example "*.dcm" will match files ending with ".dcm". The two
@@ -66,7 +80,9 @@ public:
*/
void SetFilePattern(const char *pattern);
const char *GetFilePattern() { return this->FilePattern; }
+ //@}
+ //@{
//! Set the scan depth to use when no DICOMDIR is found.
/*!
* The default scan depth is 1, which scans only the given directory
@@ -75,10 +91,14 @@ public:
*/
vtkSetMacro(ScanDepth, int);
int GetScanDepth() { return this->ScanDepth; }
+ //@}
+ //@{
//! Specify a find query.
void SetFindQuery(const vtkDICOMItem& query);
+ //@}
+ //@{
//! Specify the find level.
/*!
* If this is Series, then the whole series will be found if a single
@@ -90,7 +110,9 @@ public:
void SetFindLevelToImage() { this->SetFindLevel(IMAGE); }
void SetFindLevelToSeries() { this->SetFindLevel(SERIES); }
int GetFindLevel() { return this->FindLevel; }
+ //@}
+ //@{
//! Update the information about the files.
/*!
* This method causes the directory to be read. It must be called before
@@ -98,7 +120,14 @@ public:
*/
virtual void Update() { this->Update(0); }
virtual void Update(int);
+#if (VTK_MAJOR_VERSION == 7 && VTK_MINOR_VERSION > 0) || VTK_MAJOR_VERSION > 7
+ virtual int Update(vtkInformation *) { this->Update(); return 1; }
+ virtual int Update(int i, vtkInformationVector *) {
+ this->Update(i); return 1; }
+#endif
+ //@}
+ //@{
//! Get the total number of series that were found.
int GetNumberOfSeries();
@@ -127,7 +156,9 @@ public:
//! Get the studies for this patient.
vtkIntArray *GetStudiesForPatient(int patient);
+ //@}
+ //@{
//! Get the first series in a particular study.
int GetFirstSeriesForStudy(int study);
@@ -145,13 +176,19 @@ public:
* and InstanceNumber for each file.
*/
vtkDICOMMetaData *GetMetaDataForSeries(int i);
+ //@}
+ //@{
//! Get the file set ID. This will be NULL unless a DICOMDIR was found.
const char *GetFileSetID() { return this->FileSetID; }
+ //@}
+ //@{
//! Get the filename associated with the error code.
const char *GetInternalFileName() { return this->InternalFileName; }
+ //@}
+ //@{
//! If this is On, files with no pixel data will be skipped.
/*!
* This is On by default. Some files, such as dicom directory files,
@@ -160,11 +197,25 @@ public:
vtkSetMacro(RequirePixelData, int);
vtkBooleanMacro(RequirePixelData, int);
int GetRequirePixelData() { return this->RequirePixelData; }
+ //@}
- //! If On (the default), symbolic links will not be followed.
+ //@{
+ //! If On (the default), symbolic links will be followed.
vtkSetMacro(FollowSymlinks, int);
vtkBooleanMacro(FollowSymlinks, int);
int GetFollowSymlinks() { return this->FollowSymlinks; }
+ //@}
+
+ //@{
+ //! If On (the default), hidden files will be listed.
+ /*!
+ * A file is hidden if it has a "hidden" attribute set. On Linux and
+ * OS X, any file that begins with "." will also be considered "hidden".
+ */
+ vtkSetMacro(ShowHidden, int);
+ vtkBooleanMacro(ShowHidden, int);
+ int GetShowHidden() { return this->ShowHidden; }
+ //@}
protected:
vtkDICOMDirectory();
@@ -175,6 +226,7 @@ protected:
const char *FilePattern;
int RequirePixelData;
int FollowSymlinks;
+ int ShowHidden;
int ScanDepth;
vtkTimeStamp UpdateTime;
@@ -269,8 +321,8 @@ protected:
vtkDICOMMetaData *meta, const vtkDICOMItem *item, int instance);
private:
- vtkDICOMDirectory(const vtkDICOMDirectory&); // Not implemented.
- void operator=(const vtkDICOMDirectory&); // Not implemented.
+ vtkDICOMDirectory(const vtkDICOMDirectory&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMDirectory&) VTK_DELETE_FUNCTION;
struct SeriesItem;
struct StudyItem;
diff --git a/Source/vtkDICOMFile.cxx b/Source/vtkDICOMFile.cxx
index 7ac3e71..ecf8116 100644
--- a/Source/vtkDICOMFile.cxx
+++ b/Source/vtkDICOMFile.cxx
@@ -13,6 +13,7 @@
=========================================================================*/
#include "vtkDICOMFile.h"
+#include "vtkDICOMFilePath.h"
#if defined(VTK_DICOM_POSIX_IO)
#include <sys/types.h>
@@ -34,6 +35,8 @@
#include <errno.h>
#endif
+#include <string.h>
+
//----------------------------------------------------------------------------
vtkDICOMFile::vtkDICOMFile(const char *filename, Mode mode)
{
@@ -43,123 +46,117 @@ vtkDICOMFile::vtkDICOMFile(const char *filename, Mode mode)
this->Eof = false;
if (mode == In)
- {
+ {
this->Handle = open(filename, O_RDONLY);
- }
+ }
else if (mode == Out)
- {
+ {
this->Handle = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 000666);
- }
+ }
if (this->Handle == -1)
- {
+ {
int errorCode = errno;
if (errorCode == EACCES)
- {
+ {
this->Error = AccessDenied;
- }
+ }
else if (errorCode == EISDIR)
- {
- this->Error = IsDirectory;
- }
+ {
+ this->Error = FileIsDirectory;
+ }
else if (errorCode == ENOTDIR)
- {
- this->Error = DirectoryNotFound;
- }
+ {
+ this->Error = (mode == Out ? ImpossiblePath : FileNotFound);
+ }
else if (errorCode == ENOENT)
- {
+ {
this->Error = FileNotFound;
- }
+ }
else if (errorCode == ENOSPC)
- {
+ {
// some systems also have EDQUOT for "quota exceeded"
this->Error = OutOfSpace;
- }
+ }
else
- {
- this->Error = Bad;
- }
+ {
+ this->Error = UnknownError;
}
+ }
#elif defined(VTK_DICOM_WIN32_IO)
this->Handle = INVALID_HANDLE_VALUE;
this->Error = 0;
this->Eof = false;
- WCHAR *wideFilename = 0;
- int n = MultiByteToWideChar(
- CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, NULL, 0);
- if (n > 0)
- {
- wideFilename = new WCHAR[n];
- n = MultiByteToWideChar(
- CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wideFilename, n);
-
+ vtkDICOMFilePath fpath(filename);
+ const wchar_t *wideFilename = fpath.Wide();
+ if (wideFilename)
+ {
if (mode == In)
- {
+ {
this->Handle = CreateFileW(wideFilename,
GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
- }
+ }
else if (mode == Out)
- {
+ {
this->Handle = CreateFileW(wideFilename,
GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- }
}
+ }
if (this->Handle == INVALID_HANDLE_VALUE)
- {
+ {
DWORD errorCode = GetLastError();
if (errorCode == ERROR_ACCESS_DENIED ||
errorCode == ERROR_SHARING_VIOLATION)
- {
+ {
this->Error = AccessDenied;
if (wideFilename)
- {
+ {
DWORD attr = GetFileAttributesW(wideFilename);
if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
- {
- this->Error = IsDirectory;
- }
+ {
+ this->Error = FileIsDirectory;
}
}
- else if (errorCode == ERROR_DIRECTORY)
- {
- this->Error = DirectoryNotFound;
- }
+ }
+ else if (errorCode == ERROR_PATH_NOT_FOUND)
+ {
+ this->Error = (mode == Out ? ImpossiblePath : FileNotFound);
+ }
else if (errorCode == ERROR_FILE_NOT_FOUND)
- {
+ {
this->Error = FileNotFound;
- }
+ }
else if (errorCode == ERROR_DISK_FULL)
- {
+ {
this->Error = OutOfSpace;
- }
+ }
else
- {
- this->Error = Bad;
- }
+ {
+ this->Error = UnknownError;
}
+ }
- delete [] wideFilename;
#else
this->Handle = 0;
this->Error = 0;
this->Eof = false;
if (mode == In)
- {
+ {
this->Handle = fopen(filename, "rb");
- }
+ }
else if (mode == Out)
- {
+ {
this->Handle = fopen(filename, "wb");
- }
+ }
if (this->Handle == 0)
- {
- this->Error = Bad;
- }
+ {
+ this->Error = UnknownError;
+ }
#endif
}
@@ -174,25 +171,25 @@ void vtkDICOMFile::Close()
{
#if defined(VTK_DICOM_POSIX_IO)
if (this->Handle)
- {
+ {
if (close(this->Handle) == 0)
- {
+ {
this->Error = 0;
- }
+ }
else if (errno != EINTR)
- {
- this->Error = Bad;
- }
- this->Handle = 0;
+ {
+ this->Error = UnknownError;
}
+ this->Handle = 0;
+ }
#elif defined(VTK_DICOM_WIN32_IO)
CloseHandle(this->Handle);
this->Handle = INVALID_HANDLE_VALUE;
#else
if (this->Handle)
- {
+ {
fclose(static_cast<FILE *>(this->Handle));
- }
+ }
this->Handle = 0;
#endif
}
@@ -203,51 +200,52 @@ size_t vtkDICOMFile::Read(unsigned char *data, size_t len)
#if defined(VTK_DICOM_POSIX_IO)
ssize_t n;
while ((n = read(this->Handle, data, len)) == -1)
- {
+ {
if (errno != EINTR)
- {
+ {
break;
- }
- errno = 0;
}
+ errno = 0;
+ }
if (n == 0)
- {
+ {
this->Eof = true;
- }
+ }
else if (n == -1)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
n = 0;
- }
+ }
return n;
#elif defined(VTK_DICOM_WIN32_IO)
// handle large requests in 1GB chunks
const size_t chunksize = 1024*1024*1024;
size_t n = 0;
while (n < len)
- {
+ {
DWORD l = static_cast<DWORD>(len - n < chunksize ? len - n : chunksize);
DWORD r = 0;
if (ReadFile(this->Handle, &data[n], l, &r, NULL) == FALSE)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
break;
- }
+ }
else if (r == 0)
- {
+ {
this->Eof = true;
break;
- }
- n += r;
}
+ n += r;
+ }
return n;
#else
size_t n = fread(data, 1, len, static_cast<FILE *>(this->Handle));
if (n != len || len == 0)
- {
+ {
this->Eof = (feof(static_cast<FILE *>(this->Handle)) != 0);
- this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ? 0 : Bad);
- }
+ this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ?
+ 0 : UnknownError);
+ }
return n;
#endif
}
@@ -258,49 +256,50 @@ size_t vtkDICOMFile::Write(const unsigned char *data, size_t len)
#if defined(VTK_DICOM_POSIX_IO)
ssize_t n;
while ((n = write(this->Handle, data, len)) == -1)
- {
+ {
if (errno != EINTR)
- {
+ {
break;
- }
- errno = 0;
}
+ errno = 0;
+ }
if (n == -1)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
n = 0;
- }
+ }
return n;
#elif defined(VTK_DICOM_WIN32_IO)
// handle large requests in 1GB chunks
const size_t chunksize = 1024*1024*1024;
size_t n = 0;
while (n < len)
- {
+ {
DWORD l = static_cast<DWORD>(len - n < chunksize ? len - n : chunksize);
DWORD r = 0;
if (WriteFile(this->Handle, &data[n], l, &r, NULL) == FALSE)
- {
+ {
DWORD errorCode = GetLastError();
if (errorCode == ERROR_HANDLE_DISK_FULL)
- {
+ {
this->Error = OutOfSpace;
- }
+ }
else
- {
- this->Error = Bad;
- }
- break;
+ {
+ this->Error = UnknownError;
}
- n += r;
+ break;
}
+ n += r;
+ }
return n;
#else
size_t n = fwrite(data, 1, len, static_cast<FILE *>(this->Handle));
if (n != len || len == 0)
- {
- this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ? 0 : Bad);
- }
+ {
+ this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ?
+ 0 : UnknownError);
+ }
return n;
#endif
}
@@ -315,20 +314,20 @@ bool vtkDICOMFile::SetPosition(Size offset)
off_t pos = lseek(this->Handle, offset, SEEK_SET);
#endif
if (pos == -1)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
return false;
- }
+ }
return true;
#elif defined(VTK_DICOM_WIN32_IO)
LONG lowerBits = static_cast<LONG>(offset);
LONG upperBits = static_cast<LONG>(offset >> 32);
DWORD pos = SetFilePointer(this->Handle, lowerBits, &upperBits, FILE_BEGIN);
if (pos == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
return false;
- }
+ }
return true;
#else
return (fseek(static_cast<FILE *>(this->Handle), offset, SEEK_SET) == 0);
@@ -341,40 +340,114 @@ vtkDICOMFile::Size vtkDICOMFile::GetSize()
#if defined(VTK_DICOM_POSIX_IO)
struct stat fs;
if (fstat(this->Handle, &fs) != 0)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
return static_cast<long long>(-1);
- }
+ }
return fs.st_size;
#elif defined(VTK_DICOM_WIN32_IO)
DWORD upperBits = 0;
DWORD lowerBits = GetFileSize(this->Handle, &upperBits);
if (lowerBits == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
- {
- this->Error = Bad;
+ {
+ this->Error = UnknownError;
return static_cast<long long>(-1);
- }
+ }
return lowerBits | (static_cast<Size>(upperBits) << 32);
#else
FILE *fp = static_cast<FILE *>(this->Handle);
long long size = -1;
fpos_t pos;
if (fgetpos(fp, &pos) == 0)
- {
+ {
if (fseek(fp, 0, SEEK_END) == 0)
- {
+ {
size = ftell(fp);
- }
+ }
if (fsetpos(fp, &pos) != 0)
+ {
+ this->Error = UnknownError;
+ }
+ }
+ if (size == -1)
+ {
+ this->Error = UnknownError;
+ }
+ return size;
+#endif
+}
+
+//----------------------------------------------------------------------------
+int vtkDICOMFile::Access(const char *filename, Mode mode)
+{
+#ifdef _WIN32
+ int errorCode = UnknownError;
+ vtkDICOMFilePath fpath(filename);
+ const wchar_t *wideFilename = fpath.Wide();
+ if (wideFilename)
+ {
+ errorCode = 0;
+ DWORD code = GetFileAttributesW(wideFilename);
+ if (code == INVALID_FILE_ATTRIBUTES)
+ {
+ DWORD lastError = GetLastError();
+ if (lastError == ERROR_ACCESS_DENIED ||
+ lastError == ERROR_SHARING_VIOLATION)
+ {
+ errorCode = AccessDenied;
+ }
+ else if (lastError == ERROR_FILE_NOT_FOUND)
+ {
+ errorCode = FileNotFound;
+ }
+ else if (lastError == ERROR_PATH_NOT_FOUND)
{
- this->Error = Bad;
+ errorCode = (mode == Out ? ImpossiblePath : FileNotFound);
+ }
+ else
+ {
+ errorCode = UnknownError;
}
}
- if (size == -1)
+ else if (mode == Out && (code & FILE_ATTRIBUTE_READONLY) != 0)
+ {
+ errorCode = AccessDenied;
+ }
+ else if ((code & FILE_ATTRIBUTE_DIRECTORY) != 0)
{
- this->Error = Bad;
+ errorCode = FileIsDirectory;
}
- return size;
+ }
+ return errorCode;
+#else
+ int errorCode = 0;
+ struct stat fs;
+ if (stat(filename, &fs) != 0 ||
+ access(filename, (mode == In ? R_OK : W_OK)) != 0)
+ {
+ int e = errno;
+ if (e == EACCES || e == EPERM)
+ {
+ errorCode = AccessDenied;
+ }
+ else if (e == ENOENT)
+ {
+ errorCode = FileNotFound;
+ }
+ else if (e == ENOTDIR)
+ {
+ errorCode = (mode == Out ? ImpossiblePath : FileNotFound);
+ }
+ else
+ {
+ errorCode = UnknownError;
+ }
+ }
+ else if (S_ISDIR(fs.st_mode))
+ {
+ errorCode = FileIsDirectory;
+ }
+ return errorCode;
#endif
}
@@ -383,60 +456,99 @@ int vtkDICOMFile::Remove(const char *filename)
{
#if defined(VTK_DICOM_WIN32_IO)
int errorCode = 0;
- WCHAR *wideFilename = 0;
- int n = MultiByteToWideChar(
- CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, NULL, 0);
- if (n > 0)
- {
- wideFilename = new WCHAR[n];
- n = MultiByteToWideChar(
- CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wideFilename, n);
+ vtkDICOMFilePath fpath(filename);
+ const wchar_t *wideFilename = fpath.Wide();
+ if (wideFilename)
+ {
if (!DeleteFileW(wideFilename))
- {
+ {
DWORD lastError = GetLastError();
if (lastError == ERROR_ACCESS_DENIED ||
lastError == ERROR_SHARING_VIOLATION)
- {
+ {
errorCode = AccessDenied;
- }
- else if (lastError == ERROR_FILE_NOT_FOUND)
- {
+ }
+ else if (lastError == ERROR_FILE_NOT_FOUND ||
+ lastError == ERROR_PATH_NOT_FOUND)
+ {
errorCode = FileNotFound;
- }
- else if (lastError == ERROR_DIRECTORY)
- {
- errorCode = DirectoryNotFound;
- }
+ }
else
- {
- errorCode = Bad;
- }
+ {
+ errorCode = UnknownError;
}
- delete [] wideFilename;
}
+ }
return errorCode;
#else
int errorCode = 0;
if (unlink(filename) != 0)
- {
+ {
int e = errno;
if (e == EACCES || e == EPERM)
- {
+ {
errorCode = AccessDenied;
- }
- else if (e == ENOENT)
- {
+ }
+ else if (e == ENOENT || e == ENOTDIR)
+ {
errorCode = FileNotFound;
- }
- else if (e == ENOTDIR)
- {
- errorCode = DirectoryNotFound;
- }
+ }
else
- {
- errorCode = Bad;
- }
+ {
+ errorCode = UnknownError;
}
+ }
return errorCode;
#endif
}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFile::SameFile(const char *file1, const char *file2)
+{
+ // Two files are considered to be the same if:
+ // 1) they are on the same device
+ // 2) their index (inode number) is the same
+
+ bool result = false;
+#ifdef _WIN32
+ vtkDICOMFilePath fpath1(file1);
+ const wchar_t *widepath = fpath1.Wide();
+ HANDLE h1 = CreateFileW(widepath,
+ GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ vtkDICOMFilePath fpath2(file2);
+ widepath = fpath2.Wide();
+ HANDLE h2 = CreateFileW(widepath,
+ GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (h1 != INVALID_HANDLE_VALUE && h2 != INVALID_HANDLE_VALUE)
+ {
+ BY_HANDLE_FILE_INFORMATION buf;
+ GetFileInformationByHandle(h1, &buf);
+ DWORD sn = buf.dwVolumeSerialNumber;
+ DWORD hi = buf.nFileIndexHigh;
+ DWORD li = buf.nFileIndexLow;
+ GetFileInformationByHandle(h2, &buf);
+ result = (buf.dwVolumeSerialNumber == sn);
+ result &= (buf.nFileIndexHigh == hi);
+ result &= (buf.nFileIndexLow == li);
+ }
+ if (h1 != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(h1);
+ }
+ if (h2 != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(h2);
+ }
+#else
+ struct stat st1;
+ struct stat st2;
+ if (stat(file1, &st1) == 0 && stat(file2, &st2) == 0)
+ {
+ result = (memcmp(&st1.st_dev, &st2.st_dev, sizeof(st1.st_dev)) == 0);
+ result &= (memcmp(&st1.st_ino, &st2.st_ino, sizeof(st1.st_ino)) == 0);
+ }
+#endif
+ return result;
+}
diff --git a/Source/vtkDICOMFile.h b/Source/vtkDICOMFile.h
index 82ff1b4..77901bf 100644
--- a/Source/vtkDICOMFile.h
+++ b/Source/vtkDICOMFile.h
@@ -43,10 +43,10 @@ public:
enum Code
{
Good, // no error
- Bad, // unspecified error
+ UnknownError, // unspecified error
AccessDenied, // file permission error
- IsDirectory, // can't open file: directory with that name exists
- DirectoryNotFound, // one of the directories in the path doesn't exist
+ FileIsDirectory, // can't open file: directory with that name exists
+ ImpossiblePath, // part of the path doesn't exist or goes through a file
FileNotFound, // requested file (or directory) doesn't exist
OutOfSpace // disk full or quota exceeded
};
@@ -54,6 +54,7 @@ public:
//! Typedef for a file size.
typedef unsigned long long Size;
+ //@{
//! Construct the file object.
/*!
* The Mode can be "In" or "Out" (read or write).
@@ -62,7 +63,9 @@ public:
//! Destruct the object and close the file.
~vtkDICOMFile();
+ //@}
+ //@{
//! Close a file.
void Close();
@@ -94,6 +97,16 @@ public:
//! Return an error indicator (zero if no error).
int GetError() { return this->Error; }
+ //@}
+
+ //@{
+ //! Test the specified file for accessibility (static method).
+ /*!
+ * The mode should be "In" or "Out" to indicate how you intend to use
+ * the file. The return value will be zero (for an ordinary file) or
+ * one of the codes returned by GetError.
+ */
+ static int Access(const char *filename, Mode mode);
//! Delete the specified file (static method).
/*!
@@ -103,7 +116,26 @@ public:
*/
static int Remove(const char *filename);
+ //! Check if two files are the same.
+ /*!
+ * This does not check that the filenames are the same. Instead,
+ * it checks to see if the two filenames point to the same actual
+ * disk file. If either file does not exist or is otherwise not
+ * accessible, then it returns false.
+ */
+ static bool SameFile(const char *file1, const char *file2);
+ //@}
+
+ //! @cond
+ // Copy constructor creates a closed file. The copy constructor would
+ // normally be deleted, but that would cause the VTK python wrappers to
+ // skip this class. Once the wrappers are fixed, this can be deleted.
+ vtkDICOMFile(const vtkDICOMFile&) : Handle(0), Error(0), Eof(false) {}
+ //! @endcond
+
private:
+ vtkDICOMFile& operator=(const vtkDICOMFile&); // = delete;
+
#ifdef VTK_DICOM_POSIX_IO
int Handle;
#else
diff --git a/Source/vtkDICOMFileDirectory.cxx b/Source/vtkDICOMFileDirectory.cxx
new file mode 100644
index 0000000..27c96c4
--- /dev/null
+++ b/Source/vtkDICOMFileDirectory.cxx
@@ -0,0 +1,414 @@
+/*=========================================================================
+
+ Program: DICOM for VTK
+
+ Copyright (c) 2012-2015 David Gobbi
+ All rights reserved.
+ See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
+#include "vtkDICOMFile.h"
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <errno.h>
+#endif
+
+#include <string>
+#include <vector>
+
+// for PGI compiler, use dirent64 if readdir is readdir64
+#if defined(__PGI) && defined(__GLIBC__)
+# define redef_dirent_readdir dirent
+# define redef_dirent_readdir64 dirent64
+# define redef_dirent redef_dirent_lookup(readdir)
+# define redef_dirent_lookup(x) redef_dirent_lookup2(x)
+# define redef_dirent_lookup2(x) redef_dirent_##x
+#else
+# define redef_dirent dirent
+#endif
+
+//----------------------------------------------------------------------------
+struct vtkDICOMFileDirectory::Entry
+{
+ std::string Name;
+ unsigned short Flags;
+ unsigned short Mask;
+};
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory::vtkDICOMFileDirectory(const char *dirname)
+ : Name(dirname), Error(0), NumberOfFiles(0), Entries(0)
+{
+#ifdef _WIN32
+ vtkDICOMFilePath path(dirname);
+ path.PushBack("*");
+ const wchar_t *widename = path.Wide();
+ if (widename == 0)
+ {
+ this->Error = UnknownError;
+ }
+ else
+ {
+ WIN32_FIND_DATAW fileData;
+ HANDLE h = FindFirstFileW(widename, &fileData);
+ DWORD code = 0;
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ code = GetLastError();
+ if (code == ERROR_FILE_NOT_FOUND)
+ {
+ code = ERROR_NO_MORE_FILES;
+ }
+ }
+ else
+ {
+ // each utf-16 wchar converts to three or fewer utf-8 bytes
+ int n = MAX_PATH*3;
+ char name[MAX_PATH*3];
+ do
+ {
+ WideCharToMultiByte(
+ CP_UTF8, 0, fileData.cFileName, -1, name, n, 0, 0);
+ unsigned int flags = 0;
+ if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0 &&
+ fileData.dwReserved0 == IO_REPARSE_TAG_SYMLINK)
+ {
+ flags |= TypeSymlink;
+ }
+ if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0)
+ {
+ flags |= TypeHidden;
+ }
+ if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
+ {
+ flags |= TypeDirectory;
+ }
+ this->AddEntry(name, flags, (TypeSymlink | TypeDirectory));
+ }
+ while (FindNextFileW(h, &fileData));
+ code = GetLastError();
+ }
+ if (code == ERROR_ACCESS_DENIED)
+ {
+ this->Error = AccessDenied;
+ }
+ else if (code == ERROR_FILE_NOT_FOUND ||
+ code == ERROR_PATH_NOT_FOUND)
+ {
+ this->Error = FileNotFound;
+ }
+ else if (code != ERROR_NO_MORE_FILES)
+ {
+ this->Error = UnknownError;
+ }
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ FindClose(h);
+ }
+ }
+#else
+ errno = 0;
+ DIR* dir = opendir(dirname);
+
+ if (!dir)
+ {
+ int e = errno;
+ if (e == EACCES || e == EPERM)
+ {
+ this->Error = AccessDenied;
+ }
+ else if (e == ENOENT || e == ENOTDIR)
+ {
+ this->Error = FileNotFound;
+ }
+ else
+ {
+ this->Error = UnknownError;
+ }
+ }
+ else
+ {
+ for (redef_dirent *d = readdir(dir); d; d = readdir(dir))
+ {
+ if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0)
+ {
+ this->AddEntry(d->d_name, 0, 0);
+ }
+ }
+ closedir(dir);
+ }
+#endif
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory::vtkDICOMFileDirectory(const vtkDICOMFileDirectory& o)
+ : Name(o.Name), Error(o.Error), NumberOfFiles(0), Entries(0)
+{
+ if (o.Entries && o.NumberOfFiles)
+ {
+ for (int i = 0; i < o.NumberOfFiles; i++)
+ {
+ const Entry& e = o.Entries[i];
+ this->AddEntry(e.Name.c_str(), e.Flags, e.Mask);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory& vtkDICOMFileDirectory::operator=(
+ const vtkDICOMFileDirectory& o)
+{
+ if (this != &o)
+ {
+ delete [] this->Entries;
+
+ this->Name = o.Name;
+ this->Error = o.Error;
+ this->NumberOfFiles = 0;
+ this->Entries = 0;
+
+ if (o.Entries && o.NumberOfFiles)
+ {
+ for (int i = 0; i < o.NumberOfFiles; i++)
+ {
+ const Entry& e = o.Entries[i];
+ this->AddEntry(e.Name.c_str(), e.Flags, e.Mask);
+ }
+ }
+ }
+
+ return *this;
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory::~vtkDICOMFileDirectory()
+{
+ delete [] this->Entries;
+}
+
+//----------------------------------------------------------------------------
+const char *vtkDICOMFileDirectory::GetFile(int i)
+{
+ if (i < 0 || i >= this->NumberOfFiles)
+ {
+ return 0;
+ }
+ return this->Entries[i].Name.c_str();
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFileDirectory::IsDirectory(int i)
+{
+ if (i < 0 || i >= this->NumberOfFiles)
+ {
+ return false;
+ }
+#ifndef _WIN32
+ if ((this->Entries[i].Mask & TypeDirectory) == 0)
+ {
+ struct stat fs;
+ vtkDICOMFilePath path(this->Name);
+ path.PushBack(this->Entries[i].Name);
+ if (stat(path.AsString().c_str(), &fs) == 0)
+ {
+ if (S_ISDIR(fs.st_mode))
+ {
+ this->Entries[i].Flags |= TypeDirectory;
+ }
+ this->Entries[i].Mask |= TypeDirectory;
+ }
+ }
+#endif
+ return ((this->Entries[i].Flags & TypeDirectory) != 0);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFileDirectory::IsSymlink(int i)
+{
+ if (i < 0 || i >= this->NumberOfFiles)
+ {
+ return false;
+ }
+ if ((this->Entries[i].Mask & TypeSymlink) == 0)
+ {
+ this->StatEntry(i);
+ }
+
+ return ((this->Entries[i].Flags & TypeSymlink) != 0);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFileDirectory::IsHidden(int i)
+{
+ if (i < 0 || i >= this->NumberOfFiles)
+ {
+ return false;
+ }
+ if ((this->Entries[i].Mask & TypeHidden) == 0)
+ {
+ this->StatEntry(i);
+ }
+
+ return ((this->Entries[i].Flags & TypeHidden) != 0);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFileDirectory::AddEntry(
+ const char *name, unsigned short flags, unsigned short mask)
+{
+ int n = this->NumberOfFiles;
+ if (this->Entries == 0)
+ {
+ this->Entries = new Entry[4];
+ }
+ else if (n >= 4 && ((n-1) & n) == 0)
+ {
+ Entry *entries = new Entry[n*2];
+ for (int i = 0; i < n; i++)
+ {
+ entries[i] = this->Entries[i];
+ }
+ delete [] this->Entries;
+ this->Entries = entries;
+ }
+
+ this->Entries[n].Name = name;
+ this->Entries[n].Flags = flags;
+ this->Entries[n].Mask= mask;
+
+ this->NumberOfFiles++;
+}
+
+//----------------------------------------------------------------------------
+#ifndef _WIN32
+void vtkDICOMFileDirectory::StatEntry(int i)
+{
+ if (i >= 0 && i < this->NumberOfFiles)
+ {
+ struct stat fs;
+ vtkDICOMFilePath path(this->Name);
+ path.PushBack(this->Entries[i].Name);
+ if (lstat(path.AsString().c_str(), &fs) == 0)
+ {
+ if (S_ISLNK(fs.st_mode))
+ {
+ this->Entries[i].Flags |= TypeSymlink;
+ }
+ this->Entries[i].Mask |= TypeSymlink;
+#ifdef __APPLE__
+ if ((fs.st_flags & UF_HIDDEN) != 0)
+ {
+ this->Entries[i].Flags |= TypeHidden;
+ }
+ this->Entries[i].Mask |= TypeHidden;
+#endif
+ }
+ }
+}
+#else /* _WIN32 */
+void vtkDICOMFileDirectory::StatEntry(int)
+{
+ // on Windows, the attributes were collected when the
+ // directory listing was done in the constructor, so
+ // there is no need to run stat on the files
+}
+#endif
+
+//----------------------------------------------------------------------------
+int vtkDICOMFileDirectory::Create(const char *name)
+{
+ int result = 0;
+
+ std::vector<std::string> dirsToCreate;
+ vtkDICOMFilePath path(name);
+
+ while (!path.IsRoot() && !path.IsEmpty() && result == 0)
+ {
+ int code = vtkDICOMFile::Access(path.AsString().c_str(), vtkDICOMFile::In);
+ if (code == 0 || code == vtkDICOMFile::AccessDenied)
+ {
+ // The name exists as a file, or there is no permission to use path
+ result = AccessDenied;
+ }
+ else if (code == vtkDICOMFile::FileIsDirectory)
+ {
+ // Found a directory!
+ break;
+ }
+ dirsToCreate.push_back(path.AsString());
+ path.PopBack();
+ }
+
+ while (dirsToCreate.size() > 0 && result == 0)
+ {
+ const std::string& dirname = dirsToCreate.back();
+#ifdef _WIN32
+ vtkDICOMFilePath dirpath(dirname);
+ const wchar_t *widename = dirpath.Wide();
+ if (widename == 0)
+ {
+ result = UnknownError;
+ }
+ else if (!CreateDirectoryW(widename, NULL))
+ {
+ DWORD e = GetLastError();
+ if (e == ERROR_ACCESS_DENIED ||
+ e == ERROR_ALREADY_EXISTS)
+ {
+ result = AccessDenied;
+ }
+ else if (e == ERROR_PATH_NOT_FOUND)
+ {
+ result = ImpossiblePath;
+ }
+ else if (e == ERROR_DISK_FULL)
+ {
+ result = OutOfSpace;
+ }
+ else
+ {
+ result = UnknownError;
+ }
+ }
+#else
+ if (mkdir(dirname.c_str(), 00777) != 0)
+ {
+ int e = errno;
+ if (e == EACCES || e == EPERM)
+ {
+ result = AccessDenied;
+ }
+ else if (e == ENOENT || e == ENOTDIR)
+ {
+ result = ImpossiblePath;
+ }
+ else if (e == ENOSPC)
+ {
+ // some systems also have EDQUOT for "quota exceeded"
+ result = OutOfSpace;
+ }
+ else
+ {
+ result = UnknownError;
+ }
+ }
+#endif
+ dirsToCreate.pop_back();
+ }
+
+ return result;
+}
diff --git a/Source/vtkDICOMFileDirectory.h b/Source/vtkDICOMFileDirectory.h
new file mode 100644
index 0000000..618c35d
--- /dev/null
+++ b/Source/vtkDICOMFileDirectory.h
@@ -0,0 +1,109 @@
+/*=========================================================================
+
+ Program: DICOM for VTK
+
+ Copyright (c) 2012-2015 David Gobbi
+ All rights reserved.
+ See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef vtkDICOMFileDirectory_h
+#define vtkDICOMFileDirectory_h
+
+#include <vtkSystemIncludes.h>
+#include "vtkDICOMModule.h" // For export macro
+
+#include <string> // Interface type
+
+//! A class that provides directory listings.
+class VTKDICOM_EXPORT vtkDICOMFileDirectory
+{
+public:
+ //! Error codes.
+ enum Code
+ {
+ Good, // no error
+ UnknownError, // unspecified error
+ AccessDenied, // file permission error
+ Reserved,
+ ImpossiblePath, // part of the path doesn't exist or goes through a file
+ FileNotFound, // requested file (or directory) doesn't exist
+ OutOfSpace // disk full or quota exceeded
+ };
+
+ //@{
+ //! Construct the object from a directory name.
+ /*!
+ * This causes the directory to be read. Use GetError() to check whether
+ * the read was successful.
+ */
+ vtkDICOMFileDirectory(const char *dirname);
+
+ //! Copy constructor.
+ vtkDICOMFileDirectory(const vtkDICOMFileDirectory&);
+
+ //! Destruct the object.
+ ~vtkDICOMFileDirectory();
+ //@}
+
+ //@{
+ //! Return an error indicator (zero if no error).
+ int GetError() { return this->Error; }
+ //@}
+
+ //@{
+ //! Get the number of files and subdirectories in the directory.
+ int GetNumberOfFiles() { return this->NumberOfFiles; }
+
+ //! Get the name of the ith file or subdirectory.
+ const char *GetFile(int i);
+
+ //! Check if the list entry is a directory.
+ bool IsDirectory(int i);
+
+ //! Check if the list entry is a symbolic link.
+ bool IsSymlink(int i);
+
+ //! Check if the list entry has an attribute that marks it as hidden.
+ bool IsHidden(int i);
+ //@}
+
+ //@{
+ //! Create a new directory with default permissions.
+ /*!
+ * This will create any intermediate directories, as well. The return
+ * value is zero for success. Otherwise, one of the error codes is
+ * returned.
+ */
+ static int Create(const char *dirname);
+ //@}
+
+ //@{
+ //! Assignment operator.
+ vtkDICOMFileDirectory& operator=(const vtkDICOMFileDirectory&);
+ //@}
+
+private:
+ //! Add a directory entry.
+ void AddEntry(const char *name, unsigned short flags, unsigned short mask);
+
+ //! Stat a file to set flags
+ void StatEntry(int i);
+
+ struct Entry;
+ static const unsigned int TypeDirectory = 1;
+ static const unsigned int TypeSymlink = 2;
+ static const unsigned int TypeHidden = 4;
+
+ std::string Name;
+ int Error;
+ int NumberOfFiles;
+ Entry *Entries;
+};
+
+#endif /* vtkDICOMFileDirectory_h */
+// VTK-HeaderTest-Exclude: vtkDICOMFileDirectory.h
diff --git a/Source/vtkDICOMFilePath.cxx b/Source/vtkDICOMFilePath.cxx
new file mode 100644
index 0000000..0dd5c3c
--- /dev/null
+++ b/Source/vtkDICOMFilePath.cxx
@@ -0,0 +1,851 @@
+/*=========================================================================
+
+ Program: DICOM for VTK
+
+ Copyright (c) 2012-2015 David Gobbi
+ All rights reserved.
+ See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "vtkDICOMFilePath.h"
+
+#include <stdlib.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath::vtkDICOMFilePath(const std::string& path)
+ : Path(path), Separator('/')
+{
+#ifdef _WIN32
+ size_t l = path.length();
+ for (size_t i = 0; i < l; i++)
+ {
+ if (IsSeparator(path[i]))
+ {
+ this->Separator = path[i];
+ break;
+ }
+ }
+ this->WidePath = 0;
+ this->LocalPath = 0;
+#endif
+ StripTrailingSlash(&this->Path);
+}
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+vtkDICOMFilePath::vtkDICOMFilePath(const std::wstring& path)
+{
+ char *filename = ConvertToUTF8(path.c_str());
+ this->Path = filename;
+ this->Separator = '/';
+ delete [] filename;
+
+ size_t l = path.length();
+ for (size_t i = 0; i < l; i++)
+ {
+ if (IsSeparator(path[i]))
+ {
+ this->Separator = path[i];
+ break;
+ }
+ }
+ this->WidePath = 0;
+ this->LocalPath = 0;
+ StripTrailingSlash(&this->Path);
+}
+#endif
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath::vtkDICOMFilePath(const vtkDICOMFilePath& other) :
+ Path(other.Path), Separator(other.Separator)
+{
+#ifdef _WIN32
+ this->WidePath = 0;
+ this->LocalPath = 0;
+#endif
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath::~vtkDICOMFilePath()
+{
+#ifdef _WIN32
+ delete [] this->WidePath;
+ delete [] this->LocalPath;
+#endif
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath& vtkDICOMFilePath::operator=(const vtkDICOMFilePath& other)
+{
+ if (this != &other)
+ {
+ this->Path = other.Path;
+ this->Separator = other.Separator;
+ }
+ return *this;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::Join(const std::string& second) const
+{
+#ifdef _WIN32
+ std::string path = this->Path;
+ char sep = this->Separator;
+
+ // if extended prefix is present, then all forward slashes must be
+ // converted into back slashes, and "." and ".." must be removed
+ bool extended = false;
+ if (HasExtendedPrefix(path))
+ {
+ sep = '\\';
+ extended = true;
+ }
+
+ // check whether the second part might be an absolute path
+ size_t pos = 0;
+ size_t r = RootLength(second);
+ if (r > 0)
+ {
+ // if second drive letter mismatches the first, paths can't be joined
+ char drive1 = DriveLetter(path);
+ char drive2 = DriveLetter(second);
+ if (HasExtendedPrefix(second))
+ {
+ // if second part uses extended prefix, ignore the first part
+ path.resize(0);
+ }
+ else if (drive2 && drive1 == drive2 && r != 3)
+ {
+ // skip the drive letter in the second path
+ pos = 2;
+ }
+ else if (extended && drive2 && r >= 2)
+ {
+ // move the drive letter from the second path to the first
+ pos = 2;
+ path = "\\\\\?\\";
+ path.append(second, 0, pos);
+ pos += (r >= 3 && IsSeparator(second[pos]));
+ }
+ else if (drive1 && drive2 == 0 && r == 1)
+ {
+ // keep the drive letter, but use absolute path from second part
+ sep = second[0];
+ path.resize(4*extended + 2);
+ }
+ else if (extended && r >= 2 &&
+ IsSeparator(second[0]) && IsSeparator(second[1]))
+ {
+ // create an extended UNC path
+ pos = 2;
+ path = "\\\\\?\\UNC\\";
+ }
+ else
+ {
+ // ignore the first path completely
+ path.resize(0);
+ }
+ }
+
+ // append a separator before appending the second part
+ size_t l = path.length();
+ if (l > 0 && !IsSeparator(path[l-1]) && !(l == 2 && path[1] == ':'))
+ {
+ path.push_back(sep);
+ }
+
+ // append one part at a time
+ while (pos != second.length())
+ {
+ if (IsSeparator(second[pos]))
+ {
+ path.push_back(sep);
+ pos++;
+ }
+ size_t endpos = pos;
+ while (endpos != second.length() && !IsSeparator(second[endpos]))
+ {
+ endpos++;
+ }
+ size_t n = endpos - pos;
+ if (n > 0)
+ {
+ if (extended)
+ {
+ if (n == 1 && second[pos] == '.')
+ {
+ // Ignore the '.' and the following slash
+ if (endpos != second.length() && IsSeparator(second[endpos]))
+ {
+ endpos++;
+ }
+ }
+ else if (n == 2 && second[pos] == '.' && second[pos+1] == '.')
+ {
+ // Ignore the '..' and the following slash
+ if (endpos != second.length() && IsSeparator(second[endpos]))
+ {
+ endpos++;
+ }
+ // Remove the preceeding part of the path
+ l = path.length();
+ size_t m = RootLength(path);
+ if (l > m && path[l-1] == sep)
+ {
+ l--;
+ while (l > m && path[l-1] != sep)
+ {
+ l--;
+ }
+ path.resize(l);
+ }
+ }
+ else if (n > 2 && second[pos + 1] == ':')
+ {
+ path.append(second, pos, 2);
+ path.push_back(sep);
+ path.append(second, pos+2, n-2);
+ }
+ else
+ {
+ path.append(second, pos, n);
+ }
+ }
+ else
+ {
+ path.append(second, pos, n);
+ }
+ }
+ pos = endpos;
+ }
+#else
+ if (this->Path.length() == 0)
+ {
+ // first part is empty, so just return second
+ return second;
+ }
+
+ if (second.length() > 0 && IsSeparator(second[0]))
+ {
+ // second part is an absolute path
+ return second;
+ }
+
+ // append the second part to the first
+ std::string path = this->Path;
+ size_t l = path.length();
+ if (l > 0 && !IsSeparator(path[l-1]))
+ {
+ path.push_back(this->Separator);
+ }
+ path.append(second);
+#endif
+ StripTrailingSlash(&path);
+ return path;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::GetBack() const
+{
+ size_t l = this->Path.length();
+ size_t r = RootLength(this->Path);
+#ifdef _WIN32
+ if (r >= 4 && HasExtendedPrefix(this->Path))
+ {
+ while (l > r && this->Path[l-1] != '\\')
+ {
+ --l;
+ }
+ }
+ else
+#endif
+ {
+ while (l > r && !IsSeparator(this->Path[l-1]))
+ {
+ --l;
+ }
+ }
+ return this->Path.substr(l);
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::GetExtension() const
+{
+ size_t i = ExtensionPosition(this->Path);
+ return this->Path.substr(i);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PopExtension()
+{
+ size_t i = ExtensionPosition(this->Path);
+ this->Path.resize(i);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PushExtension(const std::string& ext)
+{
+ size_t l = ext.length();
+ if (l == 0 || (l == 1 && ext[0] == '.'))
+ {
+ return;
+ }
+ for (size_t i = 0; i < l; i++)
+ {
+ if (IsSeparator(ext[i]))
+ {
+ return;
+ }
+ }
+
+ if (l > 0 && ext[0] != '.')
+ {
+ this->Path.push_back('.');
+ }
+
+ this->Path.append(ext);
+}
+
+//----------------------------------------------------------------------------
+size_t vtkDICOMFilePath::ExtensionPosition(const std::string& path)
+{
+ size_t l = path.length();
+ size_t r = RootLength(path);
+ size_t i = l;
+
+#ifdef _WIN32
+ if (r >= 4 && HasExtendedPrefix(path))
+ {
+ while (l > r && path[l-1] != '\\')
+ {
+ if (path[--l] == '.')
+ {
+ i = l;
+ break;
+ }
+ }
+ }
+ else
+#endif
+ {
+ while (l > r && !IsSeparator(path[l-1]))
+ {
+ if (path[--l] == '.')
+ {
+ i = l;
+ break;
+ }
+ }
+ }
+
+ return i;
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFilePath::IsRoot() const
+{
+ size_t l = this->Path.length();
+ return (l > 0 && l == RootLength(this->Path));
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFilePath::IsDirectory() const
+{
+ bool result = false;
+#ifdef _WIN32
+ wchar_t *widepath = ConvertToWideChar(this->Path.c_str());
+ if (widepath)
+ {
+ DWORD a = GetFileAttributesW(widepath);
+ delete [] widepath;
+ result = ((a & FILE_ATTRIBUTE_DIRECTORY) != 0);
+ }
+#else
+ struct stat fs;
+ if (stat(this->Path.c_str(), &fs) == 0 && S_ISDIR(fs.st_mode))
+ {
+ result = true;
+ }
+#endif
+ return result;
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFilePath::IsSymlink() const
+{
+ bool result = false;
+#ifdef _WIN32
+ wchar_t *widepath = ConvertToWideChar(this->Path.c_str());
+ if (widepath && GetFileAttributesW(widepath) != INVALID_FILE_ATTRIBUTES)
+ {
+ WIN32_FIND_DATAW buf;
+ HANDLE h = FindFirstFileW(widepath, &buf);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ CloseHandle(h);
+ if ((buf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0 &&
+ buf.dwReserved0 == 0xA000000C)
+ {
+ result = true;
+ }
+ }
+ }
+ delete [] widepath;
+#else
+ struct stat fs;
+ if (lstat(this->Path.c_str(), &fs) == 0 && S_ISLNK(fs.st_mode))
+ {
+ result = true;
+ }
+#endif
+ return result;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::GetRealPath() const
+{
+#ifdef _WIN32
+
+ std::string result;
+ wchar_t *widepath = ConvertToWideChar(this->Path.c_str());
+
+#ifndef DICOM_DEPRECATE_WINXP
+ wchar_t buffer[512];
+ DWORD m = 512;
+ wchar_t *tmp = buffer;
+ DWORD n = GetFullPathNameW(widepath, m, tmp, NULL);
+ if (n >= m-1)
+ {
+ tmp = new wchar_t[n+3];
+ n = GetFullPathNameW(widepath, n+3, tmp, NULL);
+ }
+ delete [] widepath;
+ widepath = tmp;
+#else
+ HANDLE h = CreateFileW(widepath,
+ GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ delete [] widepath;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ return result;
+ }
+
+ wchar_t buffer[512];
+ widepath = buffer;
+ DWORD m = 512;
+ // GetFinalPathNameByHandle() is not supported on Windows XP
+ DWORD n = GetFinalPathNameByHandleW(h, widepath, m, 0);
+ if (n >= m)
+ {
+ widepath = new wchar_t[n+1];
+ n = GetFinalPathNameByHandleW(h, widepath, n+1, 0);
+ }
+ CloseHandle(h);
+#endif
+
+ if (n != 0)
+ {
+ char *path = ConvertToUTF8(widepath);
+ if (widepath != buffer)
+ {
+ delete [] widepath;
+ }
+
+ if (path == 0)
+ {
+ return result;
+ }
+
+#ifndef DICOM_DEPRECATE_WINXP
+ // Add extended prefix if not present
+ if (path[0] == '\0' ||
+ strncmp("\\\\?\\", path, 4) == 0 ||
+ strncmp("\\\\.\\", path, 4) == 0)
+ {
+ result = path;
+ }
+ else
+ {
+ size_t l = strlen(path);
+ if (l >= 2 && path[0] == '\\' && path[1] == '\\')
+ {
+ result = "\\\\?\\UNC\\";
+ result.append(&path[2]);
+ }
+ else
+ {
+ result = "\\\\?\\";
+ result.append(path);
+ }
+ }
+#else
+ result = path;
+#endif
+
+ delete [] path;
+ }
+
+ return result;
+
+#else
+
+#if _POSIX_VERSION >= 200809L
+ char *storage = 0;
+#else
+ char *storage = static_cast<char *>(malloc(PATH_MAX));
+#endif
+
+ std::string result;
+ char *path = realpath(this->Path.c_str(), storage);
+ if (path != 0)
+ {
+ result = path;
+ storage = path;
+ }
+ free(storage);
+ return result;
+
+#endif
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PushBack(const std::string& second)
+{
+ if (this->Path.length() == 0 || RootLength(second) == 0)
+ {
+ this->Path = this->Join(second);
+ }
+#ifdef _WIN32
+ else if (this->Path.length() == 4 && HasExtendedPrefix(this->Path))
+ {
+ this->Path = this->Join(second);
+ }
+ else if (RootLength(this->Path) == 2 && DriveLetter(this->Path) &&
+ (DriveLetter(this->Path) == DriveLetter(second) ||
+ RootLength(second) == 1))
+ {
+ this->Path = this->Join(second);
+ }
+ // Check if the separator changed, make it sticky.
+ size_t l = this->Path.length();
+ for (size_t i = 0; i < l; i++)
+ {
+ if (IsSeparator(this->Path[i]))
+ {
+ this->Separator = this->Path[i];
+ break;
+ }
+ }
+#endif
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PopBack()
+{
+ const std::string& path = this->Path;
+ size_t root = RootLength(path);
+ size_t l = path.length();
+
+#ifdef _WIN32
+ if (l >= 4 && HasExtendedPrefix(path))
+ {
+ // only allow backslash as a separator with the "\\?\" prefix
+ while (l > root && path[l-1] != '\\')
+ {
+ --l;
+ }
+ // strip all trailing slashes that aren't part of the root
+ while (l > root && path[l-1] == '\\')
+ {
+ --l;
+ }
+ }
+ else
+#endif
+ {
+ // back up to the last separator
+ while (l > root && !IsSeparator(path[l-1]))
+ {
+ --l;
+ }
+ // strip all trailing slashes that aren't part of the root
+ while (l > root && IsSeparator(path[l-1]))
+ {
+ --l;
+ }
+ }
+
+ this->Path.resize(l);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::StripTrailingSlash(std::string *path)
+{
+ size_t l = path->length();
+ size_t r = RootLength(*path);
+#ifdef _WIN32
+ if (r >= 4 && HasExtendedPrefix(*path))
+ {
+ // remove the trailing slash, if present and not the root
+ while (l > r && (*path)[l-1] == '\\')
+ {
+ path->resize(--l);
+ }
+ }
+ else
+#endif
+ {
+ // remove the trailing slash, if present and not the root
+ while (l > r && IsSeparator((*path)[l-1]))
+ {
+ path->resize(--l);
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+size_t vtkDICOMFilePath::RootLength(const std::string& path)
+{
+ size_t root = 0;
+ size_t l = path.length();
+
+#ifdef _WIN32
+ // Several possible base prefixes exist on Windows:
+ // \ (the root of the current device)
+ // A: (indicates a relative path on a device)
+ // A:\ (the root of a device)
+ // \\server\share\ (a UNC path prefix)
+ // There's also the special "\\?\" prefix, which allows paths to go beyond
+ // the usual 260 char limits, but is only allowed for absolute paths and
+ // does not allows substitutions such as "/" for "\" or "." and "..".
+ // \\?\A:\ (the root of a device)
+ // \\?\UNC\server\share\ (a UNC path prefix)
+ // Finally, the special "\\?\" prefix is used to name system devices:
+ // \\.\DEVICE (name of a special devices)
+ if (l >= 4 && HasExtendedPrefix(path))
+ {
+ root = 4;
+ if (path[2] == '\?')
+ {
+ if (l >= 7 && path[4] == 'U' && path[5] == 'N' && path[6] == 'C')
+ {
+ if (l == 7)
+ {
+ root = 7;
+ }
+ else if (l > 7 && path[7] == '\\')
+ {
+ root = 8;
+ while (root != l && path[root] != '\\')
+ {
+ root++;
+ }
+ if (root != l && path[root] == '\\')
+ {
+ root++;
+ }
+ while (root != l && path[root] != '\\')
+ {
+ root++;
+ }
+ }
+ }
+ else if (l > 5 && path[5] == ':' &&
+ ((path[4] >= 'A' && path[4] <= 'Z') ||
+ (path[4] >= 'a' && path[4] <= 'z')))
+ {
+ root = 6;
+ if (l > 6 && path[6] == '\\')
+ {
+ root = 7;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (l > 0 && IsSeparator(path[0]))
+ {
+ root = 1;
+ if (l > 1 && IsSeparator(path[1]))
+ {
+ // UNC path
+ root = 2;
+ while (root != l && !IsSeparator(path[root]))
+ {
+ root++;
+ }
+ if (root != l && IsSeparator(path[root]))
+ {
+ root++;
+ }
+ while (root != l && !IsSeparator(path[root]))
+ {
+ root++;
+ }
+ }
+ }
+ else if (l >= 2 && path[1] == ':' &&
+ ((path[0] >= 'A' && path[0] <= 'Z') ||
+ (path[0] >= 'a' && path[0] <= 'z')))
+ {
+ root = 2;
+ if (l > 2 && IsSeparator(path[2]))
+ {
+ root = 3;
+ }
+ }
+ }
+#else
+ // For UNIX, the only possible root is "/"
+ if (l > 0 && IsSeparator(path[0]))
+ {
+ root = 1;
+ }
+#endif
+
+ return root;
+}
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+const wchar_t *vtkDICOMFilePath::Wide()
+{
+ delete [] this->WidePath;
+ this->WidePath = ConvertToWideChar(this->Path.c_str());
+ return this->WidePath;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+const char *vtkDICOMFilePath::Local()
+{
+ delete [] this->LocalPath;
+ this->LocalPath = 0;
+ if (this->Wide())
+ {
+ this->LocalPath = ConvertToLocal(this->WidePath);
+ }
+ return this->LocalPath;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+bool vtkDICOMFilePath::HasExtendedPrefix(const std::string& path)
+{
+ // extended prefixes are '\\?\' and '\\.\'
+ return (path.length() >= 4 &&
+ path[0] == '\\' && path[1] == '\\' && path[3] == '\\' &&
+ (path[2] == '\?' || path[2] == '.'));
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+char vtkDICOMFilePath::DriveLetter(const std::string& path)
+{
+ char d = '\0';
+ size_t l = path.length();
+ size_t pos = 0;
+ if (l >= 4 && HasExtendedPrefix(path))
+ {
+ pos = 4;
+ }
+ if (l >= pos+2 && path[pos+1] == ':')
+ {
+ char e = path[pos];
+ if (e >= 'A' && e <= 'Z')
+ {
+ d = e;
+ }
+ else if (e >= 'a' && e <= 'z')
+ {
+ d = e - ('a' - 'A');
+ }
+ }
+ return d;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+wchar_t *vtkDICOMFilePath::ConvertToWideChar(const char *filename)
+{
+ wchar_t *wideFilename = 0;
+ int n = MultiByteToWideChar(
+ CP_UTF8, 0, filename, -1, NULL, 0);
+ if (n > 0)
+ {
+ wideFilename = new wchar_t[n];
+ n = MultiByteToWideChar(
+ CP_UTF8, 0, filename, -1, wideFilename, n);
+ if (n == 0)
+ {
+ delete [] wideFilename;
+ wideFilename = 0;
+ }
+ }
+ return wideFilename;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+char *vtkDICOMFilePath::ConvertToUTF8(const wchar_t *wideFilename)
+{
+ char *filename = 0;
+ int n = WideCharToMultiByte(
+ CP_UTF8, 0, wideFilename, -1, NULL, 0, 0, 0);
+ if (n > 0)
+ {
+ filename = new char[n];
+ n = WideCharToMultiByte(
+ CP_UTF8, 0, wideFilename, -1, filename, n, 0, 0);
+ if (n == 0)
+ {
+ delete [] filename;
+ filename = 0;
+ }
+ }
+ return filename;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+char *vtkDICOMFilePath::ConvertToLocal(const wchar_t *wideFilename)
+{
+ char *filename = 0;
+ int n = WideCharToMultiByte(
+ CP_ACP, 0, wideFilename, -1, NULL, 0, 0, 0);
+ if (n > 0)
+ {
+ filename = new char[n];
+ n = WideCharToMultiByte(
+ CP_ACP, 0, wideFilename, -1, filename, n, 0, 0);
+ if (n == 0)
+ {
+ delete [] filename;
+ filename = 0;
+ }
+ }
+ return filename;
+}
+#endif
diff --git a/Source/vtkDICOMFilePath.h b/Source/vtkDICOMFilePath.h
new file mode 100644
index 0000000..e1d6687
--- /dev/null
+++ b/Source/vtkDICOMFilePath.h
@@ -0,0 +1,184 @@
+/*=========================================================================
+
+ Program: DICOM for VTK
+
+ Copyright (c) 2012-2015 David Gobbi
+ All rights reserved.
+ See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef vtkDICOMFilePath_h
+#define vtkDICOMFilePath_h
+
+#include <vtkSystemIncludes.h>
+#include "vtkDICOMModule.h" // For export macro
+
+#include <string> // Interface type
+
+//! A class that provides path manipulation.
+class VTKDICOM_EXPORT vtkDICOMFilePath
+{
+public:
+ //@{
+ //! Create a new path from the given string.
+ /*!
+ * Trailing slashes will be removed (unless the trailing slash is
+ * the root of the filesystem).
+ */
+ vtkDICOMFilePath(const std::string& path);
+
+#ifdef _WIN32
+ //! Create a new path from a wide string.
+ /*!
+ * This is to support unicode paths on Windows.
+ */
+ vtkDICOMFilePath(const std::wstring& path);
+#endif
+
+ //! Copy constructor.
+ vtkDICOMFilePath(const vtkDICOMFilePath&);
+
+ //! Destructor.
+ ~vtkDICOMFilePath();
+ //@}
+
+ //@{
+ //! Get the path as a string.
+ const std::string& AsString() const { return this->Path; }
+ //@}
+
+ //@{
+ //! Check if the path is empty.
+ bool IsEmpty() const { return (this->Path.length() == 0); }
+
+ //! Check if the path is a root path.
+ bool IsRoot() const;
+
+ //! Check whether the path is an existing directory.
+ bool IsDirectory() const;
+
+ //! Check whether the path is a symbolic link.
+ bool IsSymlink() const;
+ //@}
+
+ //@{
+ //! Return the path joined with the given extra component.
+ std::string Join(const std::string& second) const;
+ //@}
+
+ //@{
+ //! Get the final component of the path.
+ std::string GetBack() const;
+
+ //! Remove a component from the path.
+ void PopBack();
+
+ //! Add a new component (or components) to the path.
+ void PushBack(const std::string& path);
+ //@}
+
+ //@{
+ //! Get the file extension (the final dot and everything after).
+ std::string GetExtension() const;
+
+ //! Remove the current file extension, including the dot.
+ void PopExtension();
+
+ //! Add a new file extension to the current file path.
+ void PushExtension(const std::string& path);
+ //@}
+
+ //@{
+ //! Get the full absolute path (or empty string if file doesn't exist).
+ /*!
+ * This will go to the file system to find the true path to a file,
+ * including exactly the same case as used by the file system. On
+ * Windows, all forward slashes will be converted to back slashes,
+ * and the returned file name will have a \\?\ prefix to indicate
+ * that extended path processing should be used.
+ */
+ std::string GetRealPath() const;
+ //@}
+
+#ifdef _WIN32
+ //@{
+ //! Convert the path to a wchar_t pointer for Windows methods.
+ /*!
+ * Call this method if the path is going to be passed to a Windows
+ * method that expects a unicode string.
+ */
+ const wchar_t *Wide();
+
+ //! Convert the path to a local 8-bit string for Windows methods.
+ /*!
+ * Call this method if the path is going to be passed to a Windows
+ * method that expects an 8-bit string with the local encoding.
+ */
+ const char *Local();
+ //@}
+
+#endif
+
+ //@{
+ //! Assignment operator.
+ vtkDICOMFilePath& operator=(const vtkDICOMFilePath&);
+ //@}
+
+private:
+
+ //! Check if the given character is a separator.
+ static bool IsSeparator(char c) {
+#ifndef __WRAP__
+#ifdef _WIN32
+ return (c == '/' || c == '\\');
+#else
+ return (c == '/');
+#endif
+#endif
+ }
+
+ //! Strip the trailing slash, if present.
+ static void StripTrailingSlash(std::string *path);
+
+ //! Find the position of the extension (including the dot).
+ static size_t ExtensionPosition(const std::string& path);
+
+ //! Get the length of the "root device" part of the path.
+ /*!
+ * On UNIX, the root is '/' for absolute paths, and is empty for relative
+ * paths. On Windows, the root includes the device letter plus any slash
+ * that immediately follows it, or the network share path for UNC paths.
+ */
+ static size_t RootLength(const std::string& path);
+
+#ifdef _WIN32
+ //! Check if an extended path prefix is present.
+ static bool HasExtendedPrefix(const std::string& path);
+
+ //! Get the drive letter (or zero if none).
+ static char DriveLetter(const std::string& path);
+
+ //! Convert to WideChar. Returns NULL or new string (free with delete []).
+ static wchar_t *ConvertToWideChar(const char *filename);
+
+ //! Convert to utf8. Returns NULL or new string (free with delete []).
+ static char *ConvertToUTF8(const wchar_t *filename);
+
+ //! Convert to local 8-bit. Returns NULL or new string (free with delete []).
+ static char *ConvertToLocal(const wchar_t *filename);
+#endif
+
+ std::string Path;
+ char Separator;
+#ifdef _WIN32
+ wchar_t *WidePath;
+ char *LocalPath;
+#endif
+};
+
+#endif /* vtkDICOMFilePath_h */
+// VTK-HeaderTest-Exclude: vtkDICOMFilePath.h
diff --git a/Source/vtkDICOMFileSorter.cxx b/Source/vtkDICOMFileSorter.cxx
index 12a5e94..dd1dfb3 100644
--- a/Source/vtkDICOMFileSorter.cxx
+++ b/Source/vtkDICOMFileSorter.cxx
@@ -12,9 +12,13 @@
=========================================================================*/
#include "vtkDICOMFileSorter.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
#include "vtkDICOMMetaData.h"
#include "vtkDICOMParser.h"
#include "vtkDICOMUtilities.h"
+#include "vtkDICOMCharacterSet.h"
#include <vtkObjectFactory.h>
#include <vtkSmartPointer.h>
@@ -28,11 +32,16 @@
#include <vector>
#include <list>
#include <algorithm>
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Glob.hxx>
#include <ctype.h>
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#define GetTupleValue GetTypedTuple
+#define InsertNextTupleValue InsertNextTypedTuple
+#endif
+
vtkStandardNewMacro(vtkDICOMFileSorter);
//----------------------------------------------------------------------------
@@ -51,7 +60,8 @@ struct vtkDICOMFileSorter::FileInfo
std::string FileName;
vtkDICOMValue StudyUID;
vtkDICOMValue SeriesUID;
- int InstanceNumber;
+ vtkDICOMValue InstanceUID;
+ unsigned int InstanceNumber;
};
bool vtkDICOMFileSorter::CompareInstance(
@@ -86,17 +96,17 @@ vtkDICOMFileSorter::vtkDICOMFileSorter()
vtkDICOMFileSorter::~vtkDICOMFileSorter()
{
if (this->InputFileName)
- {
+ {
delete [] this->InputFileName;
- }
+ }
if (this->InputFileNames)
- {
+ {
this->InputFileNames->Delete();
- }
+ }
if (this->InternalFileName)
- {
+ {
delete [] this->InternalFileName;
- }
+ }
this->OutputFileNames->Delete();
delete this->Series;
@@ -130,18 +140,18 @@ void vtkDICOMFileSorter::SetInputFileName(const char *name)
if (name == this->InputFileName ||
(name && this->InputFileName &&
strcmp(name, this->InputFileName) == 0))
- {
+ {
return;
- }
+ }
delete [] this->InputFileName;
this->InputFileName = 0;
if (name)
- {
+ {
char *cp = new char[strlen(name) + 1];
strcpy(cp, name);
this->InputFileName = cp;
- }
+ }
this->Modified();
}
@@ -194,21 +204,21 @@ void vtkDICOMFileSorter::AddSeriesFileNames(int study, vtkStringArray *files)
vtkIdType n = this->Studies->GetNumberOfTuples();
int st[2];
if (study == n)
- {
+ {
st[0] = static_cast<int>(this->Series->size());
st[1] = st[0];
this->Studies->InsertNextTupleValue(st);
- }
+ }
else if (n >= 0 && study == n-1)
- {
+ {
this->Studies->GetTupleValue(study, st);
st[1]++;
this->Studies->SetTupleValue(study, st);
- }
+ }
else
- {
+ {
vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing study")
- }
+ }
this->Series->push_back(files);
}
@@ -226,6 +236,7 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
parser->AddObserver(
vtkCommand::ErrorEvent, this, &vtkDICOMFileSorter::RelayError);
+ groups->InsertNextValue(0x0008);
groups->InsertNextValue(0x0020);
parser->SetMetaData(meta);
parser->SetGroups(groups);
@@ -235,15 +246,35 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
vtkIdType numberOfStrings = input->GetNumberOfValues();
for (vtkIdType j = 0; j < numberOfStrings; j++)
- {
+ {
const std::string& fileName = input->GetValue(j);
this->SetInternalFileName(fileName.c_str());
- // Skip anything that is a directory
- if (vtksys::SystemTools::FileIsDirectory(fileName.c_str()))
- {
+ int code = vtkDICOMFile::Access(fileName.c_str(), vtkDICOMFile::In);
+ if (code == vtkDICOMFile::FileIsDirectory)
+ {
+ // Skip anything that is a directory
continue;
+ }
+ else if (code != 0)
+ {
+ const char *errText = "Can't open the file ";
+ this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
+ if (code == vtkDICOMFile::AccessDenied)
+ {
+ errText = "No permission to read the file ";
+ }
+ else if (code == vtkDICOMFile::FileNotFound)
+ {
+ errText = "File not found ";
+ }
+ else if (code == vtkDICOMFile::ImpossiblePath)
+ {
+ errText = "Bad file path ";
}
+ vtkErrorMacro("SortFiles: " << errText << this->InternalFileName);
+ continue;
+ }
// Read the file metadata
meta->Initialize();
@@ -251,22 +282,23 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
parser->SetFileName(fileName.c_str());
parser->Update();
if (!parser->GetPixelDataFound())
- {
+ {
if (!this->ErrorCode)
- {
+ {
this->ErrorCode = parser->GetErrorCode();
- }
+ }
if (this->ErrorCode || this->RequirePixelData)
- {
+ {
continue;
- }
}
+ }
// Insert the file into the sorted list
FileInfo fileInfo;
fileInfo.FileName = fileName;
fileInfo.StudyUID = meta->GetAttributeValue(DC::StudyInstanceUID);
fileInfo.SeriesUID = meta->GetAttributeValue(DC::SeriesInstanceUID);
+ fileInfo.InstanceUID = meta->GetAttributeValue(DC::SOPInstanceUID);
fileInfo.InstanceNumber =
meta->GetAttributeValue(DC::InstanceNumber).AsUnsignedInt();
@@ -275,62 +307,97 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
bool foundSeries = false;
for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
- {
+ {
// compare studyId first, then seriesId
int c1 = vtkDICOMUtilities::CompareUIDs(
studyUID, (*li)[0].StudyUID.GetCharData());
int c2 = 0;
if (c1 == 0)
- {
+ {
c2 = vtkDICOMUtilities::CompareUIDs(
seriesUID, (*li)[0].SeriesUID.GetCharData());
- }
+ }
if (c1 == 0 && c2 == 0 && seriesUID != 0)
- {
+ {
(*li).push_back(fileInfo);
foundSeries = true;
break;
- }
+ }
else if (c1 >= 0 || (c1 == 0 && c2 >= 0))
- {
+ {
break;
- }
}
+ }
if (!foundSeries)
- {
+ {
std::vector<FileInfo> newSeries;
newSeries.push_back(fileInfo);
sortedFiles.insert(li, newSeries);
- }
}
+ }
// Sort each series by InstanceNumber
int studyCount = 0;
vtkDICOMValue lastStudyUID;
for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
- {
+ {
std::vector<FileInfo> &v = *li;
std::stable_sort(v.begin(), v.end(), CompareInstance);
// Is this a new study?
if (studyCount == 0 || v[0].StudyUID != lastStudyUID)
- {
+ {
lastStudyUID = v[0].StudyUID;
studyCount++;
- }
+ }
- vtkSmartPointer<vtkStringArray> sa =
- vtkSmartPointer<vtkStringArray>::New();
+ // Check for duplicate instances, put them into a new series
vtkIdType n = static_cast<vtkIdType>(v.size());
- sa->SetNumberOfValues(n);
+ std::vector<vtkIdType> duplicate(n);
+ std::vector<vtkIdType> seriesLength;
+ seriesLength.push_back(0);
+ vtkIdType numberOfDuplicates = 0;
for (vtkIdType i = 0; i < n; i++)
+ {
+ const vtkDICOMValue& uid = v[i].InstanceUID;
+ vtkIdType count = 0;
+ if (uid.GetVL() > 0)
{
- sa->SetValue(i, v[i].FileName);
+ for (vtkIdType j = 0; j < i; j++)
+ {
+ if (v[j].InstanceUID == uid)
+ {
+ count++;
+ }
+ }
+ }
+ duplicate[i] = count;
+ if (count > numberOfDuplicates)
+ {
+ numberOfDuplicates = count;
+ seriesLength.push_back(0);
+ }
+ seriesLength[count]++;
+ }
+
+ for (vtkIdType k = 0; k <= numberOfDuplicates; k++)
+ {
+ vtkSmartPointer<vtkStringArray> sa =
+ vtkSmartPointer<vtkStringArray>::New();
+ sa->SetNumberOfValues(seriesLength[k]);
+ vtkIdType j = 0;
+ for (vtkIdType i = 0; i < n; i++)
+ {
+ if (duplicate[i] == k)
+ {
+ sa->SetValue(j++, v[i].FileName);
+ }
}
- this->AddSeriesFileNames(studyCount - 1, sa);
+ this->AddSeriesFileNames(studyCount - 1, sa);
}
+ }
}
//----------------------------------------------------------------------------
@@ -340,23 +407,42 @@ void vtkDICOMFileSorter::Execute()
this->OutputFileNames->Reset();
this->Series->clear();
this->Studies->Reset();
- this->SetInputFileName(0);
+ this->SetInternalFileName(0);
this->ErrorCode = 0;
if (this->InputFileName) // The input was a single file
+ {
+ int code = vtkDICOMFile::Access(this->InputFileName, vtkDICOMFile::In);
+ if (code == vtkDICOMFile::FileNotFound)
{
- if (!vtksys::SystemTools::FileExists(this->InputFileName))
- {
this->ErrorCode = vtkErrorCode::FileNotFoundError;
- vtkErrorMacro("File not found: " << this->InputFileName);
+ vtkErrorMacro("File or directory not found: " << this->InputFileName);
return;
- }
- else if (vtksys::SystemTools::FileIsDirectory(this->InputFileName))
- {
+ }
+ else if (code == vtkDICOMFile::FileIsDirectory)
+ {
this->ErrorCode = vtkErrorCode::CannotOpenFileError;
vtkErrorMacro("Named file is a directory: " << this->InputFileName);
return;
- }
+ }
+ else if (code == vtkDICOMFile::AccessDenied)
+ {
+ this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+ vtkErrorMacro("Permission denied: " << this->InputFileName);
+ return;
+ }
+ else if (code == vtkDICOMFile::ImpossiblePath)
+ {
+ this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+ vtkErrorMacro("Bad file path: " << this->InputFileName);
+ return;
+ }
+ else if (code != 0)
+ {
+ this->ErrorCode = vtkErrorCode::UnknownError;
+ vtkErrorMacro("Unknown file error: " << this->InputFileName);
+ return;
+ }
vtkDICOMParser *parser = vtkDICOMParser::New();
parser->AddObserver(
@@ -369,86 +455,108 @@ void vtkDICOMFileSorter::Execute()
parser->Delete();
if (!pixelDataFound)
- {
+ {
if (!errorCode)
- {
+ {
this->ErrorCode = vtkErrorCode::FileFormatError;
vtkErrorMacro("Not a DICOM image: " << this->InputFileName);
- }
+ }
else if (!this->ErrorCode)
- {
+ {
this->ErrorCode = errorCode;
- }
- return;
}
+ return;
+ }
// Find the path to the file
- std::vector<std::string> path;
- vtksys::SystemTools::SplitPath(this->InputFileName, path);
+ vtkDICOMFilePath path(this->InputFileName);
- // Replace file with a glob pattern
- std::string ext =
- vtksys::SystemTools::GetFilenameLastExtension(path.back());
- path.back() = "*";
+ // Create a glob pattern
+ std::string base = path.GetBack();
+ std::string ext = path.GetExtension();
+ std::string pattern = "*";
if (ext == ".dc" || ext == ".dcm" || ext == ".DC" || ext == ".DCM")
- {
- path.back() += ext;
- }
- std::string pattern = vtksys::SystemTools::JoinPath(path);
+ {
+ pattern += ext;
+ }
+ path.PopBack();
+ std::string dirname = path.AsString();
// Find all the files that match the pattern
- vtksys::Glob glob;
- glob.RecurseOff();
- glob.FindFiles(pattern);
- std::vector<std::string> files = glob.GetFiles();
+ vtkDICOMFileDirectory d(dirname.c_str());
// Create a vtkStringArray from the matching files
vtkSmartPointer<vtkStringArray> array =
vtkSmartPointer<vtkStringArray>::New();
- for (size_t i = 0; i < files.size(); i++)
+ if (d.GetError() == 0)
+ {
+ int n = d.GetNumberOfFiles();
+ for (int i = 0; i < n; i++)
{
- array->InsertNextValue(files[i]);
+ const char *filename = d.GetFile(i);
+ if (vtkDICOMUtilities::PatternMatches(pattern.c_str(), filename) &&
+ !d.IsDirectory(i))
+ {
+ path.PushBack(filename);
+ array->InsertNextValue(path.AsString());
+ path.PopBack();
+ }
}
+ }
// Sort the files
this->SortFiles(array);
- // Set FileNames to contain the matched series
+ // Find the series that the original file belonged to. Do the search
+ // twice, once with case-sensitivity and once without
bool done = false;
- for (size_t j = 0; j < this->Series->size() && !done; j++)
+ for (int caseless = 0; !done && caseless < 2; caseless++)
+ {
+ if (caseless)
{
- vtkStringArray *sa = (*this->Series)[j];
- for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++)
+ vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192);
+ base = cs.CaseFoldedUTF8(base.data(), base.length());
+ }
+ for (size_t j = 0; j < this->Series->size() && !done; j++)
+ {
+ vtkStringArray *sa = (*this->Series)[j];
+ for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++)
{
- if (vtksys::SystemTools::ComparePath(
- sa->GetValue(k).c_str(), this->InputFileName))
+ std::string tmp = vtkDICOMFilePath(sa->GetValue(k)).GetBack();
+ if (caseless)
{
- this->OutputFileNames->DeepCopy(sa);
- done = true;
- break;
+ vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192);
+ tmp = cs.CaseFoldedUTF8(tmp.data(), tmp.length());
+ }
+ if (tmp == base)
+ {
+ this->OutputFileNames->DeepCopy(sa);
+ done = true;
+ break;
}
}
}
+ }
// This should never happen
if (!done)
- {
+ {
vtkErrorMacro("Pattern didn't match original file.");
- }
}
+ }
else if (this->InputFileNames) // The input was a list of files
- {
+ {
this->SortFiles(this->InputFileNames);
for (size_t j = 0; j < this->Series->size(); j++)
- {
+ {
vtkStringArray *sa = (*this->Series)[j];
for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++)
- {
+ {
this->OutputFileNames->InsertNextValue(sa->GetValue(k));
- }
}
}
+ }
}
//----------------------------------------------------------------------------
@@ -457,57 +565,57 @@ void vtkDICOMFileSorter::Update()
if (this->GetMTime() > this->UpdateTime.GetMTime() ||
(this->InputFileNames &&
this->InputFileNames->GetMTime() > this->UpdateTime.GetMTime()))
- {
+ {
this->Execute();
this->UpdateTime.Modified();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMFileSorter::SetInternalFileName(const char *name)
{
if (this->InternalFileName == NULL && name == NULL)
- {
+ {
return;
- }
+ }
if (this->InternalFileName != 0 && name != 0 &&
strcmp(this->InternalFileName, name) == 0)
- {
+ {
return;
- }
+ }
if (this->InternalFileName)
- {
+ {
delete [] this->InternalFileName;
- }
+ }
if (name)
- {
+ {
size_t n = strlen(name) + 1;
char *cp1 = new char[n];
const char *cp2 = (name);
this->InternalFileName = cp1;
do { *cp1++ = *cp2++; } while (--n);
- }
+ }
else
- {
+ {
this->InternalFileName = 0;
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMFileSorter::RelayError(vtkObject *o, unsigned long e, void *data)
{
if (e == vtkCommand::ErrorEvent)
- {
+ {
vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o);
if (parser)
- {
+ {
this->SetErrorCode(parser->GetErrorCode());
this->SetInternalFileName(parser->GetFileName());
- }
- vtkErrorMacro(<< static_cast<char *>(data));
}
+ vtkErrorMacro(<< static_cast<char *>(data));
+ }
else
- {
+ {
this->InvokeEvent(e, data);
- }
+ }
}
diff --git a/Source/vtkDICOMFileSorter.h b/Source/vtkDICOMFileSorter.h
index b781003..278ec98 100644
--- a/Source/vtkDICOMFileSorter.h
+++ b/Source/vtkDICOMFileSorter.h
@@ -36,6 +36,7 @@ public:
void PrintSelf(ostream& os, vtkIndent indent);
static vtkDICOMFileSorter *New();
+ //@{
//! Set one file from the desired series.
/*!
* When Update() is called, all files that belong to the
@@ -44,7 +45,9 @@ public:
*/
void SetInputFileName(const char *name);
const char *GetInputFileName() { return this->InputFileName; }
+ //@}
+ //@{
//! Set a list of file names to group and sort.
/*!
* This method is mutually exclusive with SetInputFileName().
@@ -53,13 +56,17 @@ public:
*/
void SetInputFileNames(vtkStringArray *input);
vtkStringArray *GetInputFileNames() { return this->InputFileNames; }
+ //@}
+ //@{
//! Update the information about the files.
/*!
* This method must be called before any of the Get methods.
*/
virtual void Update();
+ //@}
+ //@{
//! Get the total number of series that were found.
int GetNumberOfSeries();
@@ -71,19 +78,25 @@ public:
//! Get the last series (inclusive) for a particular study.
int GetLastSeriesForStudy(int study);
+ //@}
+ //@{
//! Get the full list of sorted filenames.
vtkStringArray *GetOutputFileNames() { return this->OutputFileNames; }
//! Get the file names for a specific series.
vtkStringArray *GetFileNamesForSeries(int i);
+ //@}
+ //@{
//! Get the error code.
unsigned long GetErrorCode() { return this->ErrorCode; }
//! Get the filename associated with the error code.
const char *GetInternalFileName() { return this->InternalFileName; }
+ //@}
+ //@{
//! If this is On, files with no pixel data will be skipped.
/*!
* This is On by default. Some files, such as dicom directory files,
@@ -92,6 +105,7 @@ public:
vtkSetMacro(RequirePixelData, int);
vtkBooleanMacro(RequirePixelData, int);
int GetRequirePixelData() { return this->RequirePixelData; }
+ //@}
protected:
vtkDICOMFileSorter();
@@ -133,8 +147,8 @@ protected:
void SetErrorCode(unsigned long e) { this->ErrorCode = e; }
private:
- vtkDICOMFileSorter(const vtkDICOMFileSorter&); // Not implemented.
- void operator=(const vtkDICOMFileSorter&); // Not implemented.
+ vtkDICOMFileSorter(const vtkDICOMFileSorter&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMFileSorter&) VTK_DELETE_FUNCTION;
class StringArrayVector;
struct FileInfo;
diff --git a/Source/vtkDICOMGenerator.cxx b/Source/vtkDICOMGenerator.cxx
index e7e3860..481f291 100644
--- a/Source/vtkDICOMGenerator.cxx
+++ b/Source/vtkDICOMGenerator.cxx
@@ -17,6 +17,7 @@
#include "vtkDICOMItem.h"
#include "vtkDICOMTagPath.h"
#include "vtkDICOMMetaDataAdapter.h"
+#include "vtkDICOMUIDGenerator.h"
#include "vtkDICOMUtilities.h"
#include "vtkObjectFactory.h"
@@ -33,14 +34,21 @@
#include <math.h>
#include <stdlib.h>
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#endif
+
vtkCxxSetObjectMacro(vtkDICOMGenerator,PatientMatrix,vtkMatrix4x4);
vtkCxxSetObjectMacro(vtkDICOMGenerator,SourceMetaData,vtkDICOMMetaData);
+vtkCxxSetObjectMacro(vtkDICOMGenerator,UIDGenerator,vtkDICOMUIDGenerator);
//----------------------------------------------------------------------------
vtkDICOMGenerator::vtkDICOMGenerator()
{
this->MetaData = 0;
this->SourceMetaData = 0;
+ this->UIDGenerator = 0;
this->MultiFrame = 0;
this->OriginAtBottom = 1;
this->ReverseSliceOrder = 0;
@@ -63,44 +71,48 @@ vtkDICOMGenerator::vtkDICOMGenerator()
this->PixelValueRange[1] = -1;
for (int i = 0; i < 5; i++)
- {
+ {
this->Dimensions[i] = 0;
this->Spacing[i] = 0;
this->Origin[i] = 0;
- }
+ }
}
//----------------------------------------------------------------------------
vtkDICOMGenerator::~vtkDICOMGenerator()
{
if (this->RangeArray)
- {
+ {
this->RangeArray->Delete();
- }
+ }
if (this->SourceInstanceArray)
- {
+ {
this->SourceInstanceArray->Delete();
- }
+ }
if (this->SliceIndexArray)
- {
+ {
this->SliceIndexArray->Delete();
- }
+ }
if (this->ComponentIndexArray)
- {
+ {
this->ComponentIndexArray->Delete();
- }
+ }
if (this->PatientMatrix)
- {
+ {
this->PatientMatrix->Delete();
- }
+ }
+ if (this->UIDGenerator)
+ {
+ this->UIDGenerator->Delete();
+ }
if (this->SourceMetaData)
- {
+ {
this->SourceMetaData->Delete();
- }
+ }
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -122,40 +134,49 @@ void vtkDICOMGenerator::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "MetaData: ";
if (this->MetaData)
- {
+ {
os << this->MetaData << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "SourceMetaData: ";
if (this->SourceMetaData)
- {
+ {
os << this->SourceMetaData << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
+ os << indent << "UIDGenerator: ";
+ if (this->UIDGenerator)
+ {
+ os << this->UIDGenerator << "\n";
+ }
+ else
+ {
+ os << "(none)\n";
+ }
os << indent << "SliceIndexArray: ";
if (this->SliceIndexArray)
- {
+ {
os << this->SliceIndexArray << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "ComponentIndexArray: ";
if (this->ComponentIndexArray)
- {
+ {
os << this->ComponentIndexArray << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "MultiFrame: "
<< (this->MultiFrame ? "On\n" : "Off\n");
os << indent << "OriginAtBottom: "
@@ -171,19 +192,42 @@ void vtkDICOMGenerator::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "PatientMatrix:";
if (this->PatientMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMUIDGenerator *vtkDICOMGenerator::GetUIDGenerator()
+{
+ vtkDICOMUIDGenerator *uidgen = this->UIDGenerator;
+ if (uidgen == 0)
+ {
+ uidgen = vtkDICOMUIDGenerator::GetDefault();
+ }
+ return uidgen;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMGenerator::GenerateUID(vtkDICOMTag tag)
+{
+ return this->GetUIDGenerator()->GenerateUID(tag);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMGenerator::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids)
+{
+ return this->GetUIDGenerator()->GenerateUIDs(tag, uids);
}
//----------------------------------------------------------------------------
@@ -217,28 +261,28 @@ void vtkDICOMGenerator::ComputeAspectRatio(
double minrem = fabs(a - 1.0);
for (int j = 0; primes[j] != 0; j++)
- {
+ {
int x = primes[j];
double b = a*x;
int y = static_cast<int>(b + 0.5);
double r = fabs(b - y);
if (r < minrem)
- {
+ {
minrem = r;
yaspect = y;
xaspect = x;
- }
+ }
y = x;
b = y/a;
x = static_cast<int>(b + 0.5);
r = fabs(b - x);
if (r < minrem)
- {
+ {
minrem = r;
yaspect = y;
xaspect = x;
- }
}
+ }
aspect[0] = yaspect;
aspect[1] = xaspect;
@@ -249,13 +293,13 @@ void vtkDICOMGenerator::ComputeAdjustedMatrix(
double matrix[16], double origin[3], double spacing[3])
{
if (this->PatientMatrix)
- {
+ {
vtkMatrix4x4::DeepCopy(matrix, this->PatientMatrix);
- }
+ }
else
- {
+ {
vtkMatrix4x4::Identity(matrix);
- }
+ }
spacing[0] = this->Spacing[0];
spacing[1] = this->Spacing[1];
@@ -266,7 +310,7 @@ void vtkDICOMGenerator::ComputeAdjustedMatrix(
origin[2] = this->Origin[2];
if (this->OriginAtBottom)
- {
+ {
// move origin to the correct corner
origin[1] -= spacing[1]*(this->Dimensions[1] - 1);
matrix[1] = -matrix[1];
@@ -277,7 +321,7 @@ void vtkDICOMGenerator::ComputeAdjustedMatrix(
matrix[2] = -matrix[2];
matrix[6] = -matrix[6];
matrix[10] = -matrix[10];
- }
+ }
}
//----------------------------------------------------------------------------
@@ -328,40 +372,40 @@ void vtkDICOMGenerator::ComputeDimensions(
// time is either in the slices or in the components
int numTimeSlots = this->TimeDimension;
if (numTimeSlots)
- {
+ {
if (this->TimeAsVector)
- {
+ {
if (numComponents % numTimeSlots == 0)
- {
+ {
numComponents /= numTimeSlots;
- }
+ }
else
- {
+ {
numTimeSlots = 0;
- }
}
+ }
else
- {
+ {
if (numSlices % numTimeSlots == 0)
- {
+ {
numSlices /= numTimeSlots;
- }
+ }
else
- {
+ {
numTimeSlots = 0;
- }
}
}
+ }
// if unsigned char, assume scalars are colors, not vector components
if (scalarType == VTK_UNSIGNED_CHAR)
- {
+ {
numComponents /= this->NumberOfColorComponents;
if (numComponents < 2)
- {
+ {
numComponents = 0;
- }
}
+ }
dims[0] = extent[1] - extent[0] + 1;
dims[1] = extent[3] - extent[2] + 1;
@@ -381,11 +425,11 @@ void vtkDICOMGenerator::ComputeDimensions(
// get the dimension spacing
if (!this->TimeAsVector && numTimeSlots > 1 && numSlices > 1)
- {
+ {
// adjust spacing for multiple temporal positions per spatial position
spacing[2] *= (numTimeSlots*numSlices - 1);
spacing[2] /= (numSlices - 1);
- }
+ }
spacing[3] = this->TimeSpacing;
spacing[4] = 0.0;
@@ -399,16 +443,16 @@ void vtkDICOMGenerator::ComputeDimensions(
void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
{
if (this->SourceInstanceArray)
- {
+ {
this->SourceInstanceArray->Delete();
this->SourceInstanceArray = 0;
- }
+ }
// make sure there is sourcemeta data to compare with
if (!sourcemeta)
- {
+ {
return;
- }
+ }
// create an adapter to handle enhanced multi-frame source
vtkDICOMMetaDataAdapter source(sourcemeta);
@@ -421,32 +465,32 @@ void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
bool mismatch = false;
int m = source->GetNumberOfInstances();
for (int j = 0; j < m && !mismatch; j++)
- {
+ {
const vtkDICOMValue &o =
source->GetAttributeValue(j, DC::ImageOrientationPatient);
if (o.GetNumberOfValues() != 6)
- {
+ {
mismatch = true;
break;
- }
+ }
double orientation[6];
o.GetValues(orientation, 6);
for (int i = 0; i < 3; i++)
- {
+ {
if (fabs(matrix[4*i] - orientation[i]) > 1e-4 ||
fabs(matrix[4*i + 1] - orientation[i + 3]) > 1e-4)
- {
+ {
mismatch = true;
break;
- }
}
}
+ }
if (mismatch)
- {
+ {
return;
- }
+ }
this->SourceInstanceArray = vtkIntArray::New();
this->SourceInstanceArray->SetNumberOfComponents(1);
@@ -455,21 +499,21 @@ void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
int timeSlices = 1;
if (!this->TimeAsVector && this->Dimensions[3] > 0)
- {
+ {
timeSlices = this->Dimensions[3];
- }
+ }
// for keeping track of which source instances have been matched
bool *usedInstances = new bool[m];
for (int j = 0; j < m; j++)
- {
+ {
usedInstances[j] = false;
- }
+ }
int n = this->MetaData->GetNumberOfInstances();
double zorigin = origin[2];
for (int i = 0; i < n && !mismatch; i++)
- {
+ {
int sliceIdx = this->SliceIndexArray->GetComponent(i, 0);
// remove the time from the slice index
sliceIdx /= timeSlices;
@@ -484,44 +528,44 @@ void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
// the 4th and 5th dimensions correctly
bool foundOne = false;
for (int j = 0; j < m; j++)
- {
+ {
if (usedInstances[j])
- {
+ {
continue;
- }
+ }
const vtkDICOMValue &p =
source->GetAttributeValue(j, DC::ImagePositionPatient);
if (p.GetNumberOfValues() == 3)
- {
+ {
double r[3];
p.GetValues(r, 3);
double dd = 0;
for (int k = 0; k < 3; k++)
- {
+ {
double d = r[k] - position[k];
dd += d*d;
- }
+ }
if (dd/(spacing[2]*spacing[2]) < 1e-8)
- {
+ {
this->SourceInstanceArray->SetComponent(i, 0, j);
usedInstances[j] = true;
foundOne = true;
break;
- }
}
}
+ }
mismatch = !foundOne;
- }
+ }
delete [] usedInstances;
if (mismatch)
- {
+ {
this->SourceInstanceArray->Delete();
this->SourceInstanceArray = 0;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -533,33 +577,33 @@ void vtkDICOMGeneratorComputeHistogram(
vtkIdType *histogram)
{
if (n > 0)
- {
+ {
if (nComponents == totalComponents)
- {
+ {
do { histogram[*ptr++]++; } while (--n > 0);
- }
+ }
else if (nComponents == 1)
- {
+ {
do
- {
+ {
histogram[*ptr]++;
ptr += totalComponents;
n -= totalComponents;
- }
- while (n > 0);
}
+ while (n > 0);
+ }
else
- {
+ {
do
- {
+ {
int m = nComponents;
do { histogram[*ptr++]++; } while (--m > 0);
ptr += (totalComponents - nComponents);
n -= totalComponents;
- }
- while (n > 0);
}
+ while (n > 0);
}
+ }
}
} // end anonymous namespace
@@ -579,14 +623,14 @@ void vtkDICOMGenerator::ComputePixelValueRange(
data->GetExtent(extent);
info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent);
for (int i = 0; i < 6; i++)
- {
+ {
if (extent[i] != wholeExtent[i])
- {
+ {
seriesRange[0] = 0;
seriesRange[1] = -1;
return;
- }
}
+ }
vtkDataArray *a = data->GetPointData()->GetScalars();
vtkIdType nt = a->GetNumberOfTuples();
@@ -601,15 +645,15 @@ void vtkDICOMGenerator::ComputePixelValueRange(
seriesRange[1] = static_cast<int>(range[1]);
if (this->RangeArray)
- {
+ {
this->RangeArray->Delete();
this->RangeArray = 0;
- }
+ }
if (this->ScalarType == VTK_UNSIGNED_SHORT ||
this->ScalarType == VTK_SHORT || this->ScalarType == VTK_SIGNED_CHAR ||
this->ScalarType == VTK_UNSIGNED_CHAR)
- {
+ {
vtkIdType *h = new vtkIdType[seriesRange[1] - seriesRange[0] + 1];
vtkIdType *histogram = h - seriesRange[0];
@@ -619,9 +663,9 @@ void vtkDICOMGenerator::ComputePixelValueRange(
int nvector = (this->Dimensions[4] > 0 ? this->Dimensions[4] : 1);
int sliceSize = npixels/(npositions*ntimes);
if (this->TimeAsVector)
- {
+ {
sliceSize = npixels/npositions;
- }
+ }
int nframes = this->SliceIndexArray->GetNumberOfComponents();
int ninstances = this->SliceIndexArray->GetNumberOfTuples();
@@ -632,9 +676,9 @@ void vtkDICOMGenerator::ComputePixelValueRange(
this->RangeArray->SetNumberOfTuples(ntotal);
for (int i = 0; i < ninstances; i++)
- {
+ {
for (int j = 0; j < nframes; j++)
- {
+ {
int k = i*nframes + j;
int idx = 0;
int s = this->SliceIndexArray->GetComponent(i, j);
@@ -642,22 +686,22 @@ void vtkDICOMGenerator::ComputePixelValueRange(
int n = nc/nvector; // ntimes*samplesPerPixel
idx += s*sliceSize;
if (this->TimeAsVector)
- {
+ {
n /= ntimes; // samplesPerPixel
int t = v/nvector;
v = v % nvector;
idx += t*nvector*n;
- }
+ }
idx += v*n;
void *ptr = a->GetVoidPointer(idx);
for (int hi = seriesRange[0]; hi <= seriesRange[1]; hi++)
- {
+ {
histogram[hi] = 0;
- }
+ }
switch (this->ScalarType)
- {
+ {
case VTK_UNSIGNED_SHORT:
vtkDICOMGeneratorComputeHistogram(
static_cast<unsigned short *>(ptr), sliceSize, n, nc, histogram);
@@ -674,7 +718,7 @@ void vtkDICOMGenerator::ComputePixelValueRange(
vtkDICOMGeneratorComputeHistogram(
static_cast<signed char *>(ptr), sliceSize, n, nc, histogram);
break;
- }
+ }
// compute the min/max from the histogram,
// also try to compute window/level as 99th percentile
@@ -687,18 +731,18 @@ void vtkDICOMGenerator::ComputePixelValueRange(
int minVal = seriesRange[0] - 1;
int maxVal = seriesRange[0];
for (int hi = seriesRange[0]; hi <= seriesRange[1]; hi++)
- {
+ {
vtkIdType b = histogram[hi];
sum += b;
lowVal = (sum > lowSum ? lowVal : hi);
highVal = (sum > highSum ? highVal : hi);
minVal = (sum > 0 ? minVal : hi);
maxVal = (b == 0 ? maxVal : hi);
- }
+ }
if (minVal < maxVal)
- {
+ {
minVal++;
- }
+ }
// expand the window slightly, but keep within total range
int lowExpansion = static_cast<int>((highVal - lowVal)*0.1);
int highExpansion = static_cast<int>((highVal - lowVal)*0.1);
@@ -713,20 +757,20 @@ void vtkDICOMGenerator::ComputePixelValueRange(
tp[2] = lowVal;
tp[3] = highVal;
this->RangeArray->SetTupleValue(k, tp);
- }
}
+ }
delete [] h;
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info)
{
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
this->MetaData = vtkDICOMMetaData::New();
vtkDICOMMetaData *meta = this->MetaData;
@@ -746,23 +790,23 @@ void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info)
// compute the SliceIndexArray, either use one multi-frame file to save
// the data or use a series of non-multi-frame files
if (this->MultiFrame)
- {
+ {
this->NumberOfFrames = nframes;
this->SliceIndexArray->SetNumberOfComponents(nframes);
this->SliceIndexArray->SetNumberOfTuples(1);
this->ComponentIndexArray->SetNumberOfComponents(nframes);
this->ComponentIndexArray->SetNumberOfTuples(1);
meta->SetNumberOfInstances(1);
- }
+ }
else
- {
+ {
this->NumberOfFrames = 0;
this->SliceIndexArray->SetNumberOfComponents(1);
this->SliceIndexArray->SetNumberOfTuples(nframes);
this->ComponentIndexArray->SetNumberOfComponents(1);
this->ComponentIndexArray->SetNumberOfTuples(nframes);
meta->SetNumberOfInstances(nframes);
- }
+ }
// Reversing slice ordering isn't necessary if the ImagePlane module
// is present, because then every file has an ImagePositionPatient,
@@ -772,53 +816,53 @@ void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info)
// dimension) comes before the slice dimension in the files.
bool switchDimensions = false;
for (int k = 0; k < 4; k++)
- {
+ {
int m = nframes/numSlices;
int n = m/numTimeSlots;
for (int i = 0; i < nframes; i++)
- {
+ {
int componentIdx = (switchDimensions ? i / numSlices : i % m);
int sliceIdx = (switchDimensions ? i % numSlices : i / m);
sliceIdx = (reverseSlices ? (numSlices - sliceIdx - 1) : sliceIdx);
if (!this->TimeAsVector)
- {
+ {
int timeIdx = componentIdx / n;
componentIdx = componentIdx % n;
sliceIdx = sliceIdx*numTimeSlots + timeIdx;
- }
+ }
this->SliceIndexArray->SetValue(i, sliceIdx);
this->ComponentIndexArray->SetValue(i, componentIdx);
- }
+ }
// Try to match each generated slice to an input slice
this->MatchInstances(this->SourceMetaData);
if (this->SourceInstanceArray)
- {
+ {
// If MatchInstances generated a reversed array, try again with
// the slices in the opposite order.
if (this->SourceInstanceArray->GetComponent(0, 0) >
this->SourceInstanceArray->GetComponent(nframes-1, 0))
- {
+ {
reverseSlices = !reverseSlices;
continue;
- }
+ }
// If MatchInstances generated a shuffled array, try again with
// a different dimension ordering.
for (int j = 1; j < nframes; j++)
- {
+ {
if (this->SourceInstanceArray->GetComponent(j-1, 0) >
this->SourceInstanceArray->GetComponent(j, 0))
- {
+ {
switchDimensions = !switchDimensions;
continue;
- }
}
}
+ }
break;
- }
+ }
this->ComputePixelValueRange(info, this->PixelValueRange);
}
@@ -831,79 +875,79 @@ bool vtkDICOMGenerator::CopyRequiredAttributes(
if (source && source == this->SourceMetaData && this->SourceInstanceArray &&
source->HasAttribute(DC::PerFrameFunctionalGroupsSequence))
- {
+ {
while (*tags != DC::ItemDelimitationItem)
- {
+ {
vtkDICOMTag tag = *tags++;
vtkDICOMMetaDataAdapter sourceAdapter(source);
bool nonevalid = true;
int n = meta->GetNumberOfInstances();
for (int i = 0; i < n; i++)
- {
+ {
int j = this->SourceInstanceArray->GetComponent(i, 0);
const vtkDICOMValue& v = sourceAdapter->GetAttributeValue(j, tag);
if (v.IsValid())
- {
+ {
nonevalid = false;
meta->SetAttributeValue(i, tag, v);
- }
}
+ }
if (nonevalid)
- {
+ {
// set the attribute to zero-length value.
vtkDICOMVR vr = meta->FindDictVR(0, tag);
if (vr != vtkDICOMVR::UN)
- {
+ {
meta->SetAttributeValue(tag, vtkDICOMValue(vr));
- }
}
}
}
+ }
else if (source)
- {
+ {
while (*tags != DC::ItemDelimitationItem)
- {
+ {
vtkDICOMTag tag = *tags++;
vtkDICOMDataElementIterator iter = source->Find(tag);
if (iter != source->End())
- {
+ {
if (!iter->IsPerInstance())
- {
+ {
meta->SetAttributeValue(tag, iter->GetValue());
- }
+ }
else if (this->SourceInstanceArray && source == this->SourceMetaData)
- {
+ {
int n = meta->GetNumberOfInstances();
for (int i = 0; i < n; i++)
- {
+ {
int j = this->SourceInstanceArray->GetComponent(i, 0);
meta->SetAttributeValue(i, tag, iter->GetValue(j));
- }
}
}
+ }
else
- {
+ {
// set the attribute to zero-length value.
vtkDICOMVR vr = meta->FindDictVR(0, tag);
if (vr != vtkDICOMVR::UN)
- {
+ {
meta->SetAttributeValue(tag, vtkDICOMValue(vr));
- }
}
}
}
+ }
else
- {
+ {
while (*tags != DC::ItemDelimitationItem)
- {
+ {
vtkDICOMTag tag = *tags++;
vtkDICOMVR vr = meta->FindDictVR(0, tag);
if (vr != vtkDICOMVR::UN)
- {
+ {
meta->SetAttributeValue(tag, vtkDICOMValue(vr));
- }
}
}
+ }
return true;
}
@@ -916,47 +960,47 @@ bool vtkDICOMGenerator::CopyOptionalAttributes(
if (source && source == this->SourceMetaData && this->SourceInstanceArray &&
source->HasAttribute(DC::PerFrameFunctionalGroupsSequence))
- {
+ {
while (*tags != DC::ItemDelimitationItem)
- {
+ {
vtkDICOMTag tag = *tags++;
vtkDICOMMetaDataAdapter sourceAdapter(source);
int n = meta->GetNumberOfInstances();
for (int i = 0; i < n; i++)
- {
+ {
int j = this->SourceInstanceArray->GetComponent(i, 0);
const vtkDICOMValue& v = sourceAdapter->GetAttributeValue(j, tag);
if (v.IsValid())
- {
+ {
meta->SetAttributeValue(i, tag, v);
- }
}
}
}
+ }
else if (source)
- {
+ {
while (*tags != DC::ItemDelimitationItem)
- {
+ {
vtkDICOMTag tag = *tags++;
vtkDICOMDataElementIterator iter = source->Find(tag);
if (iter != source->End())
- {
+ {
if (!iter->IsPerInstance())
- {
+ {
meta->SetAttributeValue(tag, iter->GetValue());
- }
+ }
else if (this->SourceInstanceArray && source == this->SourceMetaData)
- {
+ {
int n = meta->GetNumberOfInstances();
for (int i = 0; i < n; i++)
- {
+ {
int j = this->SourceInstanceArray->GetComponent(i, 0);
meta->SetAttributeValue(i, tag, iter->GetValue(j));
- }
}
}
}
}
+ }
return true;
}
@@ -982,19 +1026,19 @@ bool vtkDICOMGenerator::GenerateSOPCommonModule(
vtkSmartPointer<vtkStringArray> uids =
vtkSmartPointer<vtkStringArray>::New();
uids->SetNumberOfValues(n);
- vtkDICOMUtilities::GenerateUIDs(DC::SOPInstanceUID, uids);
+ this->GenerateUIDs(DC::SOPInstanceUID, uids);
for (int i = 0; i < n; i++)
- {
+ {
meta->SetAttributeValue(i, DC::SOPInstanceUID, uids->GetValue(i));
- }
+ }
// set the InstanceCreationDate and Time
const char *tz = 0;
if (source)
- {
+ {
tz = source->GetAttributeValue(
DC::TimezoneOffsetFromUTC).GetCharData();
- }
+ }
std::string dt = vtkDICOMUtilities::GenerateDateTime(tz);
meta->SetAttributeValue(DC::InstanceCreationDate, dt.substr(0, 8));
meta->SetAttributeValue(DC::InstanceCreationTime, dt.substr(8, 13));
@@ -1090,14 +1134,14 @@ bool vtkDICOMGenerator::GenerateGeneralStudyModule(vtkDICOMMetaData *source)
// The StudyInstanceUID is mandatory.
std::string studyUID;
if (source)
- {
+ {
studyUID = source->GetAttributeValue(
DC::StudyInstanceUID).AsString();
- }
+ }
if (studyUID == "")
- {
- studyUID = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID);
- }
+ {
+ studyUID = this->GenerateUID(DC::StudyInstanceUID);
+ }
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(DC::StudyInstanceUID, studyUID);
@@ -1179,53 +1223,53 @@ bool vtkDICOMGenerator::GenerateGeneralSeriesModule(vtkDICOMMetaData *source)
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(
DC::SeriesInstanceUID,
- vtkDICOMUtilities::GenerateUID(DC::SeriesInstanceUID));
+ this->GenerateUID(DC::SeriesInstanceUID));
// The modality is mandatory, it cannot be left blank,
// and it must agree with the SOP Class IOD.
std::string m;
if (source)
- {
+ {
m = source->GetAttributeValue(DC::Modality).AsString();
- }
+ }
if (m == "")
- {
+ {
m = "OT"; // Other, i.e. unknown
- }
+ }
meta->SetAttributeValue(DC::Modality, m);
// Set pixel min/max information
if (this->ScalarType != VTK_INT && this->ScalarType != VTK_UNSIGNED_INT)
- {
+ {
// Get the pixel VR
vtkDICOMVR pixelVR = vtkDICOMVR::US;
if (this->ScalarType == VTK_SIGNED_CHAR ||
this->ScalarType == VTK_SHORT)
- {
+ {
pixelVR = vtkDICOMVR::SS;
- }
+ }
// Force it to conform the VRs allowed by the SOP Class
if ((this->AllowedPixelRepresentation & RepresentationSigned) == 0)
- {
+ {
pixelVR = vtkDICOMVR::US;
- }
+ }
else if ((this->AllowedPixelRepresentation & RepresentationUnsigned) == 0)
- {
+ {
pixelVR = vtkDICOMVR::SS;
- }
+ }
// These are optional, but very nice to have
if (this->PixelValueRange[0] <= this->PixelValueRange[1])
- {
+ {
meta->SetAttributeValue(
DC::SmallestPixelValueInSeries,
vtkDICOMValue(pixelVR, this->PixelValueRange[0]));
meta->SetAttributeValue(
DC::LargestPixelValueInSeries,
vtkDICOMValue(pixelVR, this->PixelValueRange[1]));
- }
}
+ }
// required items: use simple read/write validation
DC::EnumType required[] = {
@@ -1294,16 +1338,16 @@ bool vtkDICOMGenerator::GenerateFrameOfReferenceModule(
// Note that, depending on how the image has been manipulated,
// the frame of reference might have changed.
if (source)
- {
+ {
uid = source->GetAttributeValue(
DC::FrameOfReferenceUID).AsString();
fid = source->GetAttributeValue(
DC::PositionReferenceIndicator).AsString();
- }
+ }
if (uid == "")
- {
- uid = vtkDICOMUtilities::GenerateUID(DC::FrameOfReferenceUID);
- }
+ {
+ uid = this->GenerateUID(DC::FrameOfReferenceUID);
+ }
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(DC::FrameOfReferenceUID, uid);
@@ -1351,10 +1395,10 @@ bool vtkDICOMGenerator::GenerateGeneralImageModule(
vtkDICOMMetaData *meta = this->MetaData;
int n = meta->GetNumberOfInstances();
for (int i = 0; i < n; i++)
- {
+ {
unsigned int instance = i + 1;
meta->SetAttributeValue(i, DC::InstanceNumber, instance);
- }
+ }
// PatientInformation is required if no ImagePlane module is present,
// it will be overwritten if a real value is found
@@ -1402,9 +1446,9 @@ bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source)
int timeSlices = 1;
if (!this->TimeAsVector && this->Dimensions[3] > 0)
- {
+ {
timeSlices = this->Dimensions[3];
- }
+ }
// remove attributes that conflict with this module
vtkDICOMMetaData *meta = this->MetaData;
@@ -1419,7 +1463,7 @@ bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source)
int n = meta->GetNumberOfInstances();
double zorigin = origin[2];
for (int i = 0; i < n; i++)
- {
+ {
int sliceIdx = this->SliceIndexArray->GetComponent(i, 0);
// remove the time from the slice index
sliceIdx /= timeSlices;
@@ -1449,32 +1493,32 @@ bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source)
// use the original value if possible, to avoid surprises
if (this->SourceInstanceArray && source == this->SourceMetaData && source)
- {
+ {
vtkDICOMMetaDataAdapter sourceAdapter(source);
if (sourceAdapter->HasAttribute(DC::SliceLocation))
- {
+ {
int j = this->SourceInstanceArray->GetComponent(i, 0);
location = sourceAdapter->GetAttributeValue(
j, DC::SliceLocation).AsDouble();
- }
}
+ }
meta->SetAttributeValue(i, DC::SliceLocation, location);
- }
+ }
// the original SliceThickness should be used if it is still valid,
// i.e. if the slices are original slices rather than reformatted.
double thickness = 0;
if (this->SourceInstanceArray && source == this->SourceMetaData && source)
- {
+ {
vtkDICOMMetaDataAdapter sourceAdapter(source);
thickness = sourceAdapter->GetAttributeValue(
0, DC::SliceThickness).AsDouble();
- }
+ }
if (thickness <= 0)
- {
+ {
thickness = fabs(spacing[2]);
- }
+ }
meta->SetAttributeValue(DC::SliceThickness, thickness);
return true;
@@ -1491,7 +1535,7 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
short pixelrep = 0;
switch (this->ScalarType)
- {
+ {
case VTK_SIGNED_CHAR:
pixelrep = 1;
pixelbits = 8;
@@ -1516,89 +1560,90 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
break;
default:
break;
- }
+ }
if (pixelbits == 0)
- {
+ {
vtkErrorMacro("Illegal scalar type: " <<
vtkImageScalarTypeNameMacro(this->ScalarType));
return false;
- }
+ }
// modify the type based on what SOP allows
int storedbits = pixelbits;
if ((this->AllowedPixelRepresentation & (1 << pixelrep)) == 0)
- {
+ {
// if data is signed but no negative values are present,
// then write as unsigned if SOP Class doesn't allow signed
if (pixelrep == 1 && this->PixelValueRange[0] >= 0)
- {
+ {
pixelrep = 0;
- }
+ }
else
- {
+ {
vtkErrorMacro("This SOP class requires unsigned values.");
return false;
- }
}
+ }
if ((this->AllowedBitsStored & (1 << (pixelbits-1))) == 0)
- {
+ {
vtkErrorMacro("Illegal scalar type: " <<
vtkImageScalarTypeNameMacro(this->ScalarType));
- }
+ }
// reduce BitsStored if the SOP class allows
unsigned int minv = static_cast<unsigned int>(-this->PixelValueRange[0]);
unsigned int maxv = static_cast<unsigned int>(this->PixelValueRange[1]);
for (int bi = pixelbits/2 + 1; bi < pixelbits; bi++)
- {
+ {
if ((this->AllowedBitsStored & (1u << bi)) != 0 &&
((pixelrep == 0 && maxv < (1u << (bi + 1))) ||
(pixelrep == 1 && maxv < (1u << bi) && minv <= (1u << bi))))
- {
+ {
storedbits = bi + 1;
break;
- }
}
+ }
if (rows > 65535 || cols > 65535)
- {
+ {
vtkErrorMacro("Image dimensions " << rows << "x"
<< cols << " are too large for DICOM");
return false;
- }
+ }
vtkDICOMMetaData *meta = this->MetaData;
bool paletteColor = false;
if (this->NumberOfColorComponents >= 3)
- {
+ {
meta->SetAttributeValue(DC::SamplesPerPixel, 3);
meta->SetAttributeValue(DC::PlanarConfiguration, 0);
meta->SetAttributeValue(DC::PhotometricInterpretation, "RGB");
- }
+ }
else
- {
+ {
meta->SetAttributeValue(DC::SamplesPerPixel, 1);
std::string pm;
if (source)
- {
+ {
pm = source->GetAttributeValue(
DC::PhotometricInterpretation).AsString();
- }
- if (pm == "PALETTE COLOR" && source &&
- source->HasAttribute(DC::RedPaletteColorLookupTableData))
- {
+ }
+ if ((pm == "PALETTE COLOR" || pm == "PALETTE_COLOR") &&
+ source && source->HasAttribute(DC::RedPaletteColorLookupTableData))
+ {
+ pm = "PALETTE COLOR";
paletteColor = true;
- }
+ }
else if (pm != "MONOCHROME1")
- {
+ {
pm = "MONOCHROME2";
- }
- meta->SetAttributeValue(DC::PhotometricInterpretation, pm);
}
+ meta->SetAttributeValue(DC::PhotometricInterpretation, pm);
+ }
if (paletteColor && source)
- {
+ {
static const DC::EnumType palette[] = {
DC::RedPaletteColorLookupTableDescriptor,
DC::GreenPaletteColorLookupTableDescriptor,
@@ -1609,11 +1654,11 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
DC::ItemDelimitationItem
};
for (int i = 0; palette[i] != DC::ItemDelimitationItem; i++)
- {
+ {
meta->SetAttributeValue(palette[i],
source->GetAttributeValue(palette[i]));
- }
}
+ }
meta->SetAttributeValue(DC::Rows, rows);
meta->SetAttributeValue(DC::Columns, cols);
@@ -1624,55 +1669,55 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
// This cannot be set if PixelSpacing is set
if (!meta->HasAttribute(DC::PixelSpacing))
- {
+ {
int aspect[2];
vtkDICOMGenerator::ComputeAspectRatio(this->Spacing, aspect);
meta->SetAttributeValue(
DC::PixelAspectRatio,
vtkDICOMValue(vtkDICOMVR::IS, aspect, 2));
- }
+ }
// The Smallest/LargestPixelValue are optional, but nice to have
if (this->RangeArray)
- {
+ {
// Get the pixel VR
vtkDICOMVR pixelVR = vtkDICOMVR::US;
if (this->ScalarType == VTK_SIGNED_CHAR ||
this->ScalarType == VTK_SHORT)
- {
+ {
pixelVR = vtkDICOMVR::SS;
- }
+ }
// Force it to conform the VRs allowed by the SOP Class
if ((this->AllowedPixelRepresentation & RepresentationSigned) == 0)
- {
+ {
pixelVR = vtkDICOMVR::US;
- }
+ }
else if ((this->AllowedPixelRepresentation & RepresentationUnsigned) == 0)
- {
+ {
pixelVR = vtkDICOMVR::SS;
- }
+ }
int n = meta->GetNumberOfInstances();
for (int i = 0; i < n; i++)
- {
+ {
int nframes = (this->NumberOfFrames > 0 ? this->NumberOfFrames : 1);
int minVal = VTK_INT_MAX;
int maxVal = VTK_INT_MIN;
for (int j = 0; j < nframes; j++)
- {
+ {
int v = this->RangeArray->GetComponent(i*nframes + j, 0);
minVal = (minVal <= v ? minVal : v);
v = this->RangeArray->GetComponent(i*nframes + j, 1);
maxVal = (maxVal >= v ? maxVal : v);
- }
+ }
meta->SetAttributeValue(
i, DC::SmallestImagePixelValue, vtkDICOMValue(pixelVR, minVal));
meta->SetAttributeValue(
i, DC::LargestImagePixelValue, vtkDICOMValue(pixelVR, maxVal));
- }
}
+ }
return true;
}
@@ -1768,21 +1813,21 @@ bool vtkDICOMGenerator::GenerateOverlayPlaneModule(vtkDICOMMetaData *source)
// overlay is a repeating group, it repeats 16 times
DC::EnumType tags[16];
for (int i = 0; i < 16; i++)
- {
+ {
if (source && source->HasAttribute(vtkDICOMTag(0x6000 + i*2, 0x0010)))
- {
+ {
for (int j = 0; j < 12; j++)
- {
+ {
tags[j] = static_cast<DC::EnumType>(basetags[j] + i*0x20000);
- }
+ }
tags[13] = DC::ItemDelimitationItem;
if (!this->CopyOptionalAttributes(tags, source))
- {
+ {
return false;
- }
}
}
+ }
return true;
}
@@ -1797,36 +1842,36 @@ bool vtkDICOMGenerator::GenerateVOILUTModule(vtkDICOMMetaData *source)
this->RangeArray &&
(this->ScalarType == VTK_SHORT ||
this->ScalarType == VTK_UNSIGNED_SHORT))
- {
+ {
int n = meta->GetNumberOfInstances();
int m = static_cast<int>(this->RangeArray->GetNumberOfTuples()/n);
for (int i = 0; i < n; i++)
- {
+ {
int lowVal = this->RangeArray->GetComponent(i*m, 2);
int highVal = this->RangeArray->GetComponent(i*m, 3);
// set a limit on how tight the window can be
if (highVal - lowVal < 20)
- {
+ {
highVal = lowVal + 20;
- }
+ }
// make sure that WindowCenter will be an integer
if ((highVal - lowVal) % 2 != 0)
- {
+ {
if (lowVal > 0)
- {
+ {
lowVal--;
- }
+ }
else
- {
+ {
highVal--;
- }
}
+ }
meta->SetAttributeValue(i, DC::WindowCenter, 0.5*(highVal + lowVal));
meta->SetAttributeValue(i, DC::WindowWidth, 1.0*(highVal - lowVal));
- }
+ }
return true;
- }
+ }
// if data is real-valued like CT, then use original window/level
static const DC::EnumType tags[] = {
diff --git a/Source/vtkDICOMGenerator.h b/Source/vtkDICOMGenerator.h
index 1b491a5..7340d01 100644
--- a/Source/vtkDICOMGenerator.h
+++ b/Source/vtkDICOMGenerator.h
@@ -15,14 +15,17 @@
#define vtkDICOMGenerator_h
#include <vtkObject.h>
+#include <vtkStdString.h> // For std::string
#include "vtkDICOMModule.h" // For export macro
#include "vtkDICOMTag.h" // For method parameter
class vtkIntArray;
class vtkMatrix4x4;
class vtkInformation;
+class vtkStringArray;
class vtkDICOMMetaData;
class vtkDICOMItem;
+class vtkDICOMUIDGenerator;
//! Generate DICOM data series for specific IOD classes.
/*!
@@ -47,6 +50,7 @@ public:
//! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
+ //@{
//! Generate an instance of one of the supported classes.
/*!
* This is the primary interface method of this class. Given the
@@ -54,14 +58,18 @@ public:
* attributes of the supplied vtkDICOMMetaData object.
*/
virtual bool GenerateInstance(vtkInformation *) = 0;
+ //@}
+ //@{
//! Get the generated meta data.
/*!
* Every time GenerateInstance() is called, it will generate a
* new meta data object that can be retrieved with this method.
*/
vtkDICOMMetaData *GetMetaData();
+ //@}
+ //@{
//! Create a multi-frame object (default: Off).
/*!
* If this is on, the one multi-frame data set will be created. If
@@ -71,7 +79,9 @@ public:
vtkSetMacro(MultiFrame, int);
vtkBooleanMacro(MultiFrame, int);
vtkGetMacro(MultiFrame, int);
+ //@}
+ //@{
//! Write scalar components as the time dimension (default: Off).
/*!
* If this is on, then each time slot is stored in a different scalar
@@ -81,7 +91,9 @@ public:
vtkSetMacro(TimeAsVector, int);
vtkBooleanMacro(TimeAsVector, int);
vtkGetMacro(TimeAsVector, int);
+ //@}
+ //@{
//! Set the time dimension to use in the DICOM file (or zero if none).
/*!
* The number of components of the input data must be divisible by the
@@ -94,7 +106,9 @@ public:
vtkGetMacro(TimeDimension, int);
vtkSetMacro(TimeSpacing, double);
vtkGetMacro(TimeSpacing, double);
+ //@}
+ //@{
//! Set the rescaling parameters, for example for CT.
/*!
* CT, PET, and some other modalities require rescaling parameters
@@ -105,7 +119,9 @@ public:
vtkGetMacro(RescaleIntercept, double);
vtkSetMacro(RescaleSlope, double);
vtkGetMacro(RescaleSlope, double);
+ //@}
+ //@{
//! Set the matrix that places the image in DICOM patient coords.
/*!
* The 3x3 portion of the matrix must be orthonormal, and the
@@ -113,7 +129,9 @@ public:
*/
void SetPatientMatrix(vtkMatrix4x4 *);
vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
+ //@}
+ //@{
//! Let the generator know how the image is arranged in memory.
/*!
* The generator needs to know how to interpret the geometry of
@@ -125,7 +143,9 @@ public:
*/
vtkSetMacro(OriginAtBottom, int);
vtkGetMacro(OriginAtBottom, int);
+ //@}
+ //@{
//! Let the generator know how to order the slices.
/*!
* By default, the generator will try to keep the same slice order
@@ -135,7 +155,9 @@ public:
*/
vtkSetMacro(ReverseSliceOrder, int);
vtkGetMacro(ReverseSliceOrder, int);
+ //@}
+ //@{
//! Set some meta data for the constructor to use as a source.
/*!
* The supplied meta data can provide some general properties
@@ -145,7 +167,19 @@ public:
*/
void SetSourceMetaData(vtkDICOMMetaData *);
vtkDICOMMetaData *GetSourceMetaData();
+ //@}
+ //@{
+ //! Set the UID generator, for generating unique IDs.
+ /*!
+ * If no UID generator is supplied, then the default UID generator
+ * will be used.
+ */
+ void SetUIDGenerator(vtkDICOMUIDGenerator *);
+ vtkDICOMUIDGenerator *GetUIDGenerator();
+ //@}
+
+ //@{
//! Get an array that maps file and frame to slice.
/*!
* Once the generator has created the metadata, this array lets the
@@ -163,11 +197,9 @@ public:
* frame as the second index.
*/
vtkIntArray *GetComponentIndexArray() { return this->ComponentIndexArray; }
+ //@}
protected:
- vtkDICOMGenerator();
- ~vtkDICOMGenerator();
-
//! Enumerated values for restricting pixel values.
enum {
RepresentationUnsigned = 1u,
@@ -181,11 +213,40 @@ protected:
BitsStored32 = (1u << 31)
};
+ //@{
+ //! Protected constructor method.
+ vtkDICOMGenerator();
+ ~vtkDICOMGenerator();
+ //@}
+
+ //@{
+ //! Generate a UID for the provided tag.
+ /*
+ * The generator uses the tag as a hint when generating the UIDs,
+ * for example the SOPInstanceUID might have a different format from
+ * the FrameOfReferenceUID.
+ */
+ std::string GenerateUID(vtkDICOMTag tag);
+
+ //! Generate a series of UIDs, sorted from low to high.
+ /*!
+ * Before passing the string array, call SetNumberOfValues() on
+ * the array to specify the number of UIDs that you want to be
+ * stored in it. The stored UIDs will be sorted, low to high.
+ * Generating a batch of UIDs is more efficient than calling
+ * GenerateUID() repeatedly.
+ */
+ void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids);
+ //@}
+
+ //@{
//! Used by subclasses to place restrictions on the pixel type.
void SetPixelRestrictions(
unsigned int pixelRepresentation, unsigned int bitsStored,
int colorComponents);
+ //@}
+ //@{
//! Generate the DICOM SOP Common Module.
virtual bool GenerateSOPCommonModule(
vtkDICOMMetaData *meta, const char *SOPClass);
@@ -243,7 +304,9 @@ protected:
//! Generate the DICOM VOI LUT Module.
virtual bool GenerateVOILUTModule(vtkDICOMMetaData *source);
+ //@}
+ //@{
//! Copy required attributes into the meta data.
/*!
* Required attributes must be set, so if no value is available,
@@ -259,13 +322,16 @@ protected:
*/
virtual bool CopyOptionalAttributes(
const DC::EnumType *tags, vtkDICOMMetaData *source);
+ //@}
//! Compute aspect ratio from spacing.
static void ComputeAspectRatio(const double spacing[2], int aspect[2]);
+ //@{
//! Compute the matrix, needed for Position and Orientation.
void ComputeAdjustedMatrix(
double matrix[16], double origin[3], double spacing[3]);
+ //@}
//! Compute the position and orientation for a slice.
/*!
@@ -277,6 +343,7 @@ protected:
const double origin[3], const double matrix[16],
double position[3], double orientation[6]);
+ //@{
//! Compute the dimensions.
/*!
* This will compute the dimensions of the data, given the information
@@ -293,9 +360,14 @@ protected:
*/
virtual void ComputePixelValueRange(
vtkInformation *info, int seriesRange[2]);
+ //@}
+ //@{
+ //! Attempt to match each slice to a source meta data slice.
virtual void MatchInstances(vtkDICOMMetaData *source);
+ //@}
+ //@{
//! Initialize the meta data and compute the slice index array.
/*!
* This must be done before any of the meta data has been generated.
@@ -303,6 +375,7 @@ protected:
* and the slices that make up the image data.
*/
virtual void InitializeMetaData(vtkInformation *info);
+ //@}
//! The generated meta data
vtkDICOMMetaData *MetaData;
@@ -310,6 +383,9 @@ protected:
//! The source meta data.
vtkDICOMMetaData *SourceMetaData;
+ //! The UID generator.
+ vtkDICOMUIDGenerator *UIDGenerator;
+
//! Whether to prefer multi-frame files over single-frame.
int MultiFrame;
@@ -390,8 +466,8 @@ protected:
vtkIntArray *RangeArray;
private:
- vtkDICOMGenerator(const vtkDICOMGenerator&); // Not implemented.
- void operator=(const vtkDICOMGenerator&); // Not implemented.
+ vtkDICOMGenerator(const vtkDICOMGenerator&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMGenerator&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMGenerator_h
diff --git a/Source/vtkDICOMImageCodec.cxx b/Source/vtkDICOMImageCodec.cxx
index 4f665c9..92561ce 100644
--- a/Source/vtkDICOMImageCodec.cxx
+++ b/Source/vtkDICOMImageCodec.cxx
@@ -62,13 +62,13 @@ vtkDICOMImageCodec::vtkDICOMImageCodec(const std::string& tsyntax)
const char *ts = tsyntax.c_str();
for (int i = 0; i < NumberOfCodecs; i++)
- {
+ {
if (strcmp(ts, vtkDICOMImageCodec::UIDs[i]) == 0)
- {
+ {
key = i;
break;
- }
}
+ }
this->Key = static_cast<unsigned char>(key);
}
@@ -79,9 +79,9 @@ std::string vtkDICOMImageCodec::GetTransferSyntaxUID() const
const char *result = "";
if (this->Key < NumberOfCodecs)
- {
+ {
result = vtkDICOMImageCodec::UIDs[this->Key];
- }
+ }
return result;
}
@@ -119,7 +119,7 @@ int vtkDICOMImageCodec::DecodeRLE(
// loop over all RLE segments
for (unsigned int i = 0; i < n; i++)
- {
+ {
// sample position in pixel
unsigned int s = i / bps;
// byte position in sample
@@ -127,84 +127,84 @@ int vtkDICOMImageCodec::DecodeRLE(
// compute the offset into the output buffer for this segment
size_t outOffset = s*segInc + b; // big-endian
if (endiancheck.s == 1) // little-endian
- {
+ {
outOffset = s*segInc + (bps - b - 1);
- }
+ }
// get the offset into the input buffer for this segment
unsigned int offset =
vtkDICOMUtilities::UnpackUnsignedInt(inPtr + (i+1)*4);
if (offset >= sourceSize)
- {
+ {
break;
- }
+ }
// loop over the segment and decompress it
const signed char *cp =
reinterpret_cast<const signed char *>(inPtr + offset);
signed char *dp = reinterpret_cast<signed char *>(outPtr + outOffset);
size_t remaining = segmentSize;
while (remaining > 0 && offset < sourceSize)
- {
+ {
if (++offset == sourceSize)
- {
+ {
break;
- }
+ }
// check the indicator byte (use short to avoid overflow)
short c = *cp++;
if (c >= 0)
- {
+ {
// do a literal run
c = c + 1;
if (sourceSize - offset < static_cast<size_t>(c))
- {
+ {
// safety check: limit to the number available input bytes
c = static_cast<short>(sourceSize - offset);
- }
+ }
offset += c;
if (static_cast<size_t>(c) > remaining)
- {
+ {
// safety check: limit to the size of the output dest
- c = remaining;
- }
+ c = static_cast<short>(remaining);
+ }
remaining -= c;
do
- {
+ {
*dp = *cp++;
dp += outInc;
- }
- while (--c);
}
+ while (--c);
+ }
else if (c > -128)
- {
+ {
// do a replication run
c = 1 - c;
offset += 1;
if (static_cast<size_t>(c) > remaining)
- {
+ {
// safety check: limit to the size of the output dest
- c = remaining;
- }
+ c = static_cast<short>(remaining);
+ }
remaining -= c;
do
- {
+ {
*dp = *cp;
dp += outInc;
- }
+ }
while (--c);
cp++;
- }
}
+ }
if (remaining > 0)
- {
+ {
// short read, clear remainder of dest
errorCode = MissingData;
do
- {
+ {
*dp = 0;
dp += outInc;
- }
- while (--remaining);
}
+ while (--remaining);
}
+ }
return errorCode;
}
@@ -226,18 +226,18 @@ int vtkDICOMImageCodec::EncodeRLE(
// the number of segments
unsigned int n = spp*bps;
if (n == 0 || n > 15)
- {
+ {
*destP = 0;
*destSizeP = 0;
return BadPixelFormat;
- }
+ }
// number of bytes per segment
size_t segmentSize = sourceSize/n;
// the amount to advance after each input byte
unsigned int inInc = (image.PlanarConfiguration ? bps : n);
- // the amount to advance advance after each sample
+ // the amount to advance after each sample
size_t segInc = (image.PlanarConfiguration ? segmentSize : 1);
segInc *= bps;
@@ -248,9 +248,9 @@ int vtkDICOMImageCodec::EncodeRLE(
// write the table
vtkDICOMUtilities::PackUnsignedInt(n, dest);
for (unsigned int i = 0; i < 15; i++)
- {
+ {
vtkDICOMUtilities::PackUnsignedInt(0, dest + 4*(i + 1));
- }
+ }
// the offset to the first segment
unsigned int offset = 64;
@@ -265,7 +265,7 @@ int vtkDICOMImageCodec::EncodeRLE(
// loop over all RLE segments
// write the segments
for (unsigned int i = 0; i < n; i++)
- {
+ {
// write the offset into the table
vtkDICOMUtilities::PackUnsignedInt(offset, dest + 4*(i + 1));
// sample position in pixel
@@ -275,18 +275,18 @@ int vtkDICOMImageCodec::EncodeRLE(
// compute the offset into the input buffer for this segment
size_t inOffset = s*segInc + b; // big-endian
if (endiancheck.s == 1) // little-endian
- {
+ {
inOffset = s*segInc + (bps - b - 1);
- }
+ }
const signed char *cp =
reinterpret_cast<const signed char *>(source + inOffset);
signed char *dp = reinterpret_cast<signed char *>(dest + offset);
for (size_t j = 0; j < numrows; j++)
- {
+ {
const signed char *ep = cp + rowlen*inInc;
while (cp != ep)
- {
+ {
short maxcount = 128;
ptrdiff_t remainder = (ep - cp)/inInc;
maxcount = (remainder < maxcount ? remainder : maxcount);
@@ -296,26 +296,26 @@ int vtkDICOMImageCodec::EncodeRLE(
// count repeated characters
signed char prev = *cp;
do
- {
+ {
cp += inInc;
- }
+ }
while (--counter != 0 && *cp == prev);
if (maxcount - counter > 1)
- {
+ {
// negative count for repeating
counter = -(maxcount - counter - 1);
- }
+ }
else if (counter > 0)
- {
+ {
// count non-repeated bytes until a triplicate found
signed char pprev;
do
- {
+ {
pprev = prev;
prev = *cp;
cp += inInc;
- }
+ }
while (--counter != 0 && (*cp != prev || prev != pprev));
// positive count for literal
@@ -323,23 +323,23 @@ int vtkDICOMImageCodec::EncodeRLE(
// remove repeats at the end that can join with next run
if (remainder > counter + 1 && *cp == prev)
- {
+ {
short reps = 1 + (prev == pprev);
reps = (reps < counter ? reps : counter);
counter -= reps;
cp -= reps*inInc;
- }
+ }
// increment for the next offset into the destination
offset += counter;
- }
+ }
// at least two bytes are always written to destination
offset += 2;
// check whether destination buffer is large enough
if (offset > destReserve)
- {
+ {
destReserve *= 2;
unsigned char *newdest = new unsigned char[destReserve];
size_t size = dp-reinterpret_cast<signed char *>(dest);
@@ -347,26 +347,26 @@ int vtkDICOMImageCodec::EncodeRLE(
delete [] dest;
dest = newdest;
dp = reinterpret_cast<signed char *>(dest + size);
- }
+ }
// write the results
*dp++ = counter;
do
- {
+ {
*dp++ = *sp;
sp += inInc;
- }
- while (--counter >= 0);
}
+ while (--counter >= 0);
}
+ }
// add a pad byte to the segment if needed
if ((offset & 1) != 0)
- {
+ {
offset++;
*dp = 0;
- }
}
+ }
*destP = dest;
*destSizeP = offset;
@@ -377,9 +377,9 @@ int vtkDICOMImageCodec::EncodeRLE(
DecodeRLE(image, dest, offset, check, sourceSize);
for (size_t k = 0; k < sourceSize; k++)
- {
+ {
assert(source[k] == check[k]);
- }
+ }
delete [] check;
#endif
@@ -394,9 +394,9 @@ int vtkDICOMImageCodec::Decode(
{
int code = MissingCodec;
if (this->Key == RLE)
- {
+ {
code = DecodeRLE(image, source, sourceSize, dest, destSize);
- }
+ }
return code;
}
@@ -409,9 +409,9 @@ int vtkDICOMImageCodec::Encode(
{
int code = MissingCodec;
if (this->Key == RLE)
- {
+ {
code = EncodeRLE(image, source, sourceSize, dest, destSize);
- }
+ }
return code;
}
@@ -421,8 +421,8 @@ ostream& operator<<(ostream& o, const vtkDICOMImageCodec& a)
{
std::string c = a.GetTransferSyntaxUID();
if (c == "")
- {
+ {
c = "Unknown";
- }
+ }
return o << c;
}
diff --git a/Source/vtkDICOMImageCodec.h b/Source/vtkDICOMImageCodec.h
index 2feda78..ed433e4 100644
--- a/Source/vtkDICOMImageCodec.h
+++ b/Source/vtkDICOMImageCodec.h
@@ -76,6 +76,7 @@ public:
ImageFormat(vtkDICOMMetaData *meta);
};
+ //@{
//! Construct an object for the default codec (little endian uncompressed).
vtkDICOMImageCodec() : Key(0) {}
@@ -91,7 +92,9 @@ public:
* compression method, given the transfer syntax.
*/
explicit vtkDICOMImageCodec(const std::string& syntax);
+ //@}
+ //@{
//! Get the transfer syntax for this codec.
/*!
* If the object is invalid, then an empty string is returned.
@@ -100,7 +103,9 @@ public:
//! Get the numerical identifier for this codec.
unsigned char GetKey() const { return this->Key; }
+ //@}
+ //@{
//! Decode a compressed image into the given destination buffer.
/*!
* The length of the source buffer must be provided. The destination
@@ -113,19 +118,22 @@ public:
//! Encode a compressed image, and return an allocated destination buffer.
/*!
- * The caller has the responsibility of calling "free" on the returned
+ * The caller has the responsibility of calling "delete []" on the returned
* destination buffer.
*/
int Encode(const ImageFormat& image,
const unsigned char *source, size_t sourceSize,
unsigned char **dest, size_t *destSize) const;
+ //@}
+ //@{
bool operator==(vtkDICOMImageCodec b) const { return (this->Key == b.Key); }
bool operator!=(vtkDICOMImageCodec b) const { return (this->Key != b.Key); }
bool operator<=(vtkDICOMImageCodec a) const { return (this->Key <= a.Key); }
bool operator>=(vtkDICOMImageCodec a) const { return (this->Key >= a.Key); }
bool operator<(vtkDICOMImageCodec a) const { return (this->Key < a.Key); }
bool operator>(vtkDICOMImageCodec a) const { return (this->Key > a.Key); }
+ //@}
private:
unsigned char Key;
diff --git a/Source/vtkDICOMItem.cxx b/Source/vtkDICOMItem.cxx
index fdf45f8..a7d132d 100644
--- a/Source/vtkDICOMItem.cxx
+++ b/Source/vtkDICOMItem.cxx
@@ -29,21 +29,21 @@ vtkDICOMItem::vtkDICOMItem(vtkDICOMMetaData *meta)
this->L->Head.Next = &this->L->Tail;
this->L->Tail.Prev = &this->L->Head;
if (meta)
- {
+ {
const vtkDICOMValue& vcs =
meta->GetAttributeValue(DC::SpecificCharacterSet);
if (vcs.IsValid())
- {
+ {
this->L->CharacterSet =
vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
- }
+ }
const vtkDICOMValue &v = meta->GetAttributeValue(DC::PixelRepresentation);
if (v.IsValid())
- {
+ {
this->L->VRForXS = (v.AsUnsignedShort() == 0 ?
vtkDICOMVR::US : vtkDICOMVR::SS);
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -67,17 +67,17 @@ vtkDICOMDataElement *vtkDICOMItem::NewDataElement(vtkDICOMDataElement **iter)
// if no data elements yet, then allocate four
if (this->L->DataElements == 0)
- {
+ {
this->L->DataElements = new vtkDICOMDataElement[4];
- }
+ }
// if n is a power of two, double allocated space
else if (n >= 4 && (n & (n-1)) == 0)
- {
+ {
// but first check if a free element exists
do { --n; } while (n > 0 && this->L->DataElements[n].Next != 0);
if (this->L->DataElements[n].Next != 0)
- {
+ {
// make a new, larger list
n = this->L->NumberOfDataElements;
vtkDICOMDataElement *oldptr = this->L->DataElements;
@@ -85,17 +85,17 @@ vtkDICOMDataElement *vtkDICOMItem::NewDataElement(vtkDICOMDataElement **iter)
vtkDICOMItem::CopyDataElements(
this->L->Head.Next, &this->L->Tail, this->L);
if (iter)
- {
+ {
// fix the address of the provided node, since it was re-alloced
vtkDICOMDataElement *tptr = *iter;
vtkDICOMDataElement *nptr = &this->L->Tail;
do { tptr = tptr->Next; nptr = nptr->Prev; }
while (tptr != &this->L->Tail);
*iter = nptr;
- }
- delete [] oldptr;
}
+ delete [] oldptr;
}
+ }
return &this->L->DataElements[n];
}
@@ -116,7 +116,7 @@ void vtkDICOMItem::CopyList(const List *o, List *t)
int n = o->NumberOfDataElements;
if (n > 0)
- {
+ {
// round up to power of two
int m = n - 1;
m |= m >> 1;
@@ -130,7 +130,7 @@ void vtkDICOMItem::CopyList(const List *o, List *t)
if (m < 4) { m = 4; }
t->DataElements = new vtkDICOMDataElement[m];
vtkDICOMItem::CopyDataElements(o->Head.Next, &o->Tail, t);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -142,14 +142,14 @@ void vtkDICOMItem::CopyDataElements(
const vtkDICOMDataElement *ptr = begin;
while (ptr != end)
- {
+ {
e->Tag = ptr->Tag;
e->Value = ptr->Value;
e->Next = e + 1;
e->Prev = e - 1;
ptr = ptr->Next;
e++;
- }
+ }
t->Tail.Prev = e - 1;
t->Head.Next->Prev = &t->Head;
@@ -161,30 +161,30 @@ vtkDICOMDataElement *vtkDICOMItem::FindDataElementOrInsert(vtkDICOMTag tag)
{
// make a container if we don't have one yet
if (this->L == 0)
- {
+ {
this->L = new List;
this->L->Head.Next = &this->L->Tail;
this->L->Tail.Prev = &this->L->Head;
- }
+ }
// if we aren't the sole owner, copy before modifying
else if (this->L->ReferenceCount != 1)
- {
+ {
List *t = new List;
vtkDICOMItem::CopyList(this->L, t);
this->Clear();
this->L = t;
- }
+ }
// find the insert location in the linked list
vtkDICOMDataElement *tptr = &this->L->Tail;
do
- {
+ {
tptr = tptr->Prev;
- }
+ }
while (tag < tptr->GetTag());
if (tag != tptr->GetTag())
- {
+ {
// create a new data element
vtkDICOMDataElement *e = this->NewDataElement(&tptr);
e->Tag = tag;
@@ -195,7 +195,7 @@ vtkDICOMDataElement *vtkDICOMItem::FindDataElementOrInsert(vtkDICOMTag tag)
tptr = e;
this->L->NumberOfDataElements++;
- }
+ }
return tptr;
}
@@ -207,80 +207,80 @@ vtkDICOMItem *vtkDICOMItem::FindItemOrInsert(
vtkDICOMItem *item = 0;
if (tagpath.HasTail())
- {
+ {
vtkDICOMTag tag = tagpath.GetHead();
vtkDICOMDataElement *tptr = this->FindDataElementOrInsert(tag);
vtkDICOMVR vr = tptr->Value.GetVR();
if (!vr.IsValid())
- {
+ {
vr = this->FindDictVR(tag);
if (vr == vtkDICOMVR::UN)
- {
+ {
// let it through if it isn't in the dictionary
vr = vtkDICOMVR::SQ;
- }
}
- // add the item to the sequences, or create a sequence
+ }
+ // add the item to the sequence, or create a sequence
if (vr == vtkDICOMVR::SQ)
- {
- unsigned int i = tagpath.GetIndex();
- unsigned int n = i+1;
- unsigned int m = 0;
+ {
+ size_t i = tagpath.GetIndex();
+ size_t n = i+1;
+ size_t m = 0;
const vtkDICOMItem *oldItems = tptr->Value.GetSequenceData();
if (oldItems != 0)
- {
+ {
m = tptr->Value.GetNumberOfValues();
n = (n > m ? n : m);
- }
+ }
vtkDICOMValue seq;
vtkDICOMItem *items = seq.AllocateSequenceData(vtkDICOMVR::SQ, n);
// copy the old sequence into the new one (shallow copy)
- for (unsigned int j = 0; j < m; j++)
- {
+ for (size_t j = 0; j < m; j++)
+ {
items[j] = oldItems[j];
- }
+ }
// Get the character set and default VR for XS
vtkDICOMCharacterSet cs = this->L->CharacterSet;
vtkDICOMVR vrForXS = this->L->VRForXS;
if (n > m)
- {
+ {
const vtkDICOMValue& vcs =
this->GetAttributeValue(DC::SpecificCharacterSet);
if (vcs.IsValid())
- {
+ {
cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
- }
+ }
const vtkDICOMValue &v = this->GetAttributeValue(
DC::PixelRepresentation);
if (v.IsValid())
- {
+ {
vrForXS = (v.AsUnsignedShort() == 0 ?
vtkDICOMVR::US : vtkDICOMVR::SS);
- }
}
- for (unsigned int j = m; j < n; j++)
- {
+ }
+ for (size_t j = m; j < n; j++)
+ {
// Inherit properties that originally came from parent data set
items[j] = vtkDICOMItem(cs, vrForXS);
- }
+ }
tptr->Value = seq;
item = items[i].FindItemOrInsert(tagpath.GetTail(), tagptr);
- }
+ }
else if (!tptr->Value.IsValid())
- {
+ {
// we just inserted a non-SQ value, remove it
tptr->Prev->Next = tptr->Next;
tptr->Next->Prev = tptr->Prev;
tptr->Next = 0;
tptr->Prev = 0;
this->L->NumberOfDataElements--;
- }
}
+ }
else
- {
+ {
item = this;
*tagptr = tagpath.GetHead();
- }
+ }
return item;
}
@@ -294,14 +294,14 @@ void vtkDICOMItem::SetAttributeValue(
tptr->Value = v;
if (!v.IsValid())
- {
+ {
// setting a value to the invalid value causes deletion
tptr->Prev->Next = tptr->Next;
tptr->Next->Prev = tptr->Prev;
tptr->Next = 0;
tptr->Prev = 0;
this->L->NumberOfDataElements--;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -312,9 +312,9 @@ void vtkDICOMItem::SetAttributeValue(
vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag);
// if item is NULL, the path was invalid
if (item)
- {
+ {
item->SetAttributeValue(tag, v);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -325,14 +325,14 @@ void vtkDICOMItem::SetAttributeValue(
vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag);
// if item is NULL, the path was invalid
if (item)
- {
+ {
vtkDICOMVR vr = item->FindDictVR(tag);
assert(vr != vtkDICOMVR::UN);
if (vr != vtkDICOMVR::UN)
- {
+ {
item->SetAttributeValue(tag, vtkDICOMValue(vr, v));
- }
}
+ }
}
void vtkDICOMItem::SetAttributeValue(
@@ -342,26 +342,26 @@ void vtkDICOMItem::SetAttributeValue(
vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag);
// if item is NULL, the path was invalid
if (item)
- {
+ {
vtkDICOMVR vr = item->FindDictVR(tag);
assert(vr != vtkDICOMVR::UN);
// note that there is similar code in vtkDICOMMetaData
if (vr.HasSpecificCharacterSet() && item->L != 0)
- {
+ {
vtkDICOMCharacterSet cs = item->L->CharacterSet;
const vtkDICOMValue& vcs =
item->GetAttributeValue(DC::SpecificCharacterSet);
if (vcs.IsValid())
- {
+ {
cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
- }
- item->SetAttributeValue(tag, vtkDICOMValue(vr, cs, v));
}
+ item->SetAttributeValue(tag, vtkDICOMValue(vr, cs, v));
+ }
else if (vr != vtkDICOMVR::UN)
- {
+ {
item->SetAttributeValue(tag, vtkDICOMValue(vr, v));
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -380,18 +380,18 @@ const vtkDICOMValue &vtkDICOMItem::GetAttributeValue(
vtkDICOMTag tag) const
{
if (this->L)
- {
+ {
vtkDICOMDataElement *e = this->L->Head.Next;
vtkDICOMDataElement *tail = &this->L->Tail;
while (e != tail)
- {
+ {
if (e->Tag == tag)
- {
+ {
return e->Value;
- }
- e = e->Next;
}
+ e = e->Next;
}
+ }
return vtkDICOMItem::InvalidValue;
}
@@ -401,19 +401,19 @@ const vtkDICOMValue &vtkDICOMItem::GetAttributeValue(
{
const vtkDICOMValue &v = this->GetAttributeValue(tagpath.GetHead());
if (!tagpath.HasTail())
- {
+ {
return v;
- }
+ }
if (v.IsValid())
- {
- unsigned int i = tagpath.GetIndex();
- unsigned int n = v.GetNumberOfValues();
+ {
+ size_t i = tagpath.GetIndex();
+ size_t n = v.GetNumberOfValues();
const vtkDICOMItem *items = v.GetSequenceData();
if (items != 0 && i < n)
- {
+ {
return items[i].GetAttributeValue(tagpath.GetTail());
- }
}
+ }
return vtkDICOMItem::InvalidValue;
}
@@ -424,36 +424,40 @@ vtkDICOMVR vtkDICOMItem::FindDictVR(vtkDICOMTag tag) const
vtkDICOMDictEntry e = this->FindDictEntry(tag);
if (e.IsValid())
- {
+ {
vr = e.GetVR();
// use the dictionary VR
if (vr == vtkDICOMVR::XS)
- {
+ {
const vtkDICOMValue &v =
this->GetAttributeValue(DC::PixelRepresentation);
if (v.IsValid())
- {
+ {
unsigned short r = v.AsUnsignedShort();
vr = (r == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS);
- }
+ }
+ else if (this->L)
+ {
+ vr = this->L->VRForXS;
+ }
else
- {
- vr = (this->L ? this->L->VRForXS : vtkDICOMVR::US);
- }
+ {
+ vr = vtkDICOMVR::US;
}
+ }
else if (vr == vtkDICOMVR::OX)
- {
+ {
vr = vtkDICOMVR::OW;
vtkDICOMTag reftag = (tag.GetGroup() == 0x5400 ?
DC::WaveformBitsAllocated :
DC::BitsAllocated);
const vtkDICOMValue& v = this->GetAttributeValue(reftag);
if (v.IsValid() && v.AsUnsignedShort() <= 8)
- {
+ {
vr = vtkDICOMVR::OB;
- }
}
}
+ }
return vr;
}
@@ -464,9 +468,9 @@ vtkDICOMTag vtkDICOMItem::ResolvePrivateTag(
{
unsigned short g = ptag.GetGroup();
if ((g & 0x0001) == 0)
- {
+ {
return ptag;
- }
+ }
// if not resolved, the result will be (ffff,ffff)
vtkDICOMTag otag(0xFFFF, 0xFFFF);
@@ -478,21 +482,21 @@ vtkDICOMTag vtkDICOMItem::ResolvePrivateTag(
// search for the correct group
while (iter != iterEnd && iter->GetTag() < ctag)
- {
+ {
++iter;
- }
+ }
// look for private creator elements within the group
while (iter != iterEnd && iter->GetTag() <= etag)
- {
+ {
ctag = iter->GetTag();
if (iter->GetValue().AsString() == creator)
- {
+ {
otag = vtkDICOMTag(
g, (ctag.GetElement() << 8) | (ptag.GetElement() & 0x00FF));
break;
- }
- ++iter;
}
+ ++iter;
+ }
return otag;
}
@@ -503,30 +507,30 @@ vtkDICOMTag vtkDICOMItem::ResolvePrivateTagForWriting(
{
vtkDICOMTag otag = this->ResolvePrivateTag(ptag, creator);
if (otag == vtkDICOMTag(0xFFFF, 0xFFFF))
- {
+ {
unsigned short g = ptag.GetGroup();
for (unsigned short e = 0x0010; e <= 0x00FF; e++)
- {
+ {
vtkDICOMTag ctag(g, e);
vtkDICOMDataElement *d = this->FindDataElementOrInsert(ctag);
if (!d->Value.IsValid())
- {
+ {
// creator elements are LO, which uses SpecificCharacterSet
vtkDICOMCharacterSet cs = this->L->CharacterSet;
const vtkDICOMValue& vcs =
this->GetAttributeValue(DC::SpecificCharacterSet);
if (vcs.IsValid())
- {
+ {
cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
- }
+ }
// if an empty slot was found, use it for this creator
d->Tag = ctag;
d->Value = vtkDICOMValue(vtkDICOMVR::LO, cs, creator);
otag = vtkDICOMTag(g, (e << 8) | (ptag.GetElement() & 0x00FF));
break;
- }
}
}
+ }
return otag;
}
@@ -540,13 +544,13 @@ vtkDICOMDictEntry vtkDICOMItem::FindDictEntry(vtkDICOMTag tag) const
// note that there is similar code in vtkDICOMMetaData
const char *dict = 0;
if ((group & 1) != 0 && element > 0x00ffu)
- {
+ {
unsigned short creatorElement = (element >> 8);
element &= 0x00ffu;
tag = vtkDICOMTag(group, element);
vtkDICOMTag creatorTag(group, creatorElement);
dict = this->GetAttributeValue(creatorTag).GetCharData();
- }
+ }
return vtkDICOMDictionary::FindDictEntry(tag, dict);
}
@@ -559,26 +563,26 @@ bool vtkDICOMItem::operator==(const vtkDICOMItem& ob) const
bool r = true;
if (t != o)
- {
+ {
r = false;
if (t != 0 && o != 0 &&
t->NumberOfDataElements == o->NumberOfDataElements)
- {
+ {
r = true;
int n = t->NumberOfDataElements;
if (n > 0)
- {
+ {
vtkDICOMDataElement *a = t->Head.Next;
vtkDICOMDataElement *b = o->Head.Next;
do
- {
+ {
r &= (*a == *b);
a = a->Next;
b = b->Next;
- }
- while (r && --n);
}
+ while (r && --n);
}
}
+ }
return r;
}
diff --git a/Source/vtkDICOMItem.h b/Source/vtkDICOMItem.h
index d9d9d30..1d5bfed 100644
--- a/Source/vtkDICOMItem.h
+++ b/Source/vtkDICOMItem.h
@@ -56,6 +56,7 @@ private:
public:
+ //@{
//! Default constructor creates an empty item.
vtkDICOMItem() : L(0) {}
@@ -85,7 +86,9 @@ public:
//! Destructor does reference counting.
~vtkDICOMItem() { this->Clear(); }
+ //@}
+ //@{
//! Clear the data.
void Clear() {
if (this->L && --(this->L->ReferenceCount) == 0) { this->FreeList(); }
@@ -97,7 +100,9 @@ public:
//! Check if this was read as a delimited item.
bool IsDelimited() const {
return (this->L == 0 || this->L->Delimited != 0); }
+ //@}
+ //@{
//! Add a data element to this item.
/*!
* If you specify a string, it must either be an ASCII string, or it must
@@ -106,7 +111,9 @@ public:
void SetAttributeValue(vtkDICOMTag tag, const vtkDICOMValue& v);
void SetAttributeValue(vtkDICOMTag tag, double v);
void SetAttributeValue(vtkDICOMTag tag, const std::string& v);
+ //@}
+ //@{
//! Add a data element at the specified path.
/*!
* The data element is inserted at the tail of the given path. If the
@@ -117,11 +124,15 @@ public:
void SetAttributeValue(const vtkDICOMTagPath& tag, const vtkDICOMValue& v);
void SetAttributeValue(const vtkDICOMTagPath& tag, double v);
void SetAttributeValue(const vtkDICOMTagPath& tag, const std::string& v);
+ //@}
+ //@{
//! Get a data element from this item.
const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag) const;
const vtkDICOMValue &GetAttributeValue(const vtkDICOMTagPath &tag) const;
+ //@}
+ //@{
//! Get the offset of this item from the beginning of the file.
/*!
* Some DICOM files, such as DICOMDIR files, index into sequences via
@@ -130,7 +141,9 @@ public:
*/
unsigned int GetByteOffset() const {
return (this->L == 0 ? 0 : this->L->ByteOffset); }
+ //@}
+ //@{
//! Get the number of data elements.
int GetNumberOfDataElements() const {
return (this->L ? this->L->NumberOfDataElements : 0); }
@@ -142,7 +155,9 @@ public:
//! Get an end iterator for the list of data elements.
vtkDICOMDataElementIterator End() const {
return (this->L ? &this->L->Tail : 0); }
+ //@}
+ //@{
//! Resolve a private tag, or return (ffff,ffff) if not resolved.
/*!
* Private data elements are mobile, which means that different data
@@ -166,7 +181,9 @@ public:
*/
vtkDICOMTag ResolvePrivateTagForWriting(
vtkDICOMTag ptag, const std::string& creator);
+ //@}
+ //@{
//! Look up a tag in the DICOM dictionary.
/*!
* Unlike the method in vtkDICOMDictionary, this method can identify
@@ -177,11 +194,15 @@ public:
//! Use the dictionary to get the VR, returns UN on failure.
vtkDICOMVR FindDictVR(vtkDICOMTag tag) const;
+ //@}
+ //@{
bool operator==(const vtkDICOMItem& o) const;
bool operator!=(const vtkDICOMItem& o) const {
return !(*this == o); }
+ //@}
+ //@{
//! Assignment operator does reference counting.
vtkDICOMItem &operator=(const vtkDICOMItem &o) {
if (this->L != o.L) {
@@ -189,6 +210,7 @@ public:
if (this->L && --(this->L->ReferenceCount) == 0) { this->FreeList(); }
this->L = o.L; }
return *this; }
+ //@}
private:
void FreeList();
diff --git a/Source/vtkDICOMLookupTable.cxx b/Source/vtkDICOMLookupTable.cxx
index 7343a95..5b791e1 100644
--- a/Source/vtkDICOMLookupTable.cxx
+++ b/Source/vtkDICOMLookupTable.cxx
@@ -40,185 +40,185 @@ void vtkDICOMLookupTable::PrintSelf(ostream& os, vtkIndent indent)
void vtkDICOMLookupTable::BuildStandardPalette(const char *cs)
{
if (cs == 0)
- {
+ {
vtkErrorMacro("Null string passed to BuildStandardPalette()!");
- }
+ }
else if (strcmp(cs, "HOT_IRON") == 0)
- {
+ {
// use small adjustments to exactly match the DICOM hot iron table,
// while still maintaining the ability to create a table of any size
int n = this->GetNumberOfColors();
unsigned char *cptr = this->WritePointer(0, n);
double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
for (int i = 0; i < n; i++)
- {
+ {
double x = static_cast<double>(i)/(n - 1);
if (x < 0.5)
- {
+ {
rgba[0] = 2.0*x;
- }
+ }
else if (x < 0.5 + 0.5/255.0)
- {
+ {
rgba[0] = 1.0;
- }
+ }
else if (x < 0.75 - 0.25/255.0)
- {
+ {
rgba[0] = 1.0;
rgba[1] = 2.0*x - (1.0 + 1.0/255.0);
- }
+ }
else if (x < 1.0 - 0.25/255.0)
- {
+ {
rgba[0] = 1.0;
rgba[1] = 2.0*x - (1.0 + 1.0/255.0);
rgba[2] = 4.0*x - (3.0 - 1.0/255.0);
- }
+ }
else if (x < 1.0)
- {
+ {
rgba[0] = 1.0;
rgba[1] = 2.0*x - (1.0 + 1.0/255.0);
rgba[2] = 1.0;
- }
+ }
else
- {
+ {
rgba[0] = 1.0;
rgba[1] = 1.0;
rgba[2] = 1.0;
- }
+ }
cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
cptr += 4;
- }
- this->Modified();
}
+ this->Modified();
+ }
else if (strcmp(cs, "PET") == 0)
- {
+ {
// algorithmically create the table, this uses linear segments that
// have been fit to the numerical data in the standard table
int n = this->GetNumberOfColors();
unsigned char *cptr = this->WritePointer(0, n);
double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
for (int i = 0; i < n; i++)
- {
+ {
double x = static_cast<double>(i)/(n - 1);
if (x < 0.2475252060520769 - 0.5/(n - 1))
- {
+ {
rgba[1] = 2.024199843871975*x - 0.001028608164577255;
rgba[2] = 2.0*x - 0.00392156862745098;
- }
+ }
else if (x < 0.2475252060520769 + 0.5/(n - 1))
- {
+ {
rgba[1] = 0.5;
rgba[2] = 2.0*x - 0.00392156862745098;
- }
+ }
else if (x < 0.5019607843137255)
- {
+ {
rgba[0] = 1.9792076771653557*x -0.49153398564149964;
rgba[1] = -1.9765567765567764*x + 0.9892594986712628;
rgba[2] = 2.0*x - 0.00392156862745098;
- }
+ }
else if (x < 0.5029411764705882)
- {
+ {
rgba[0] = 1.9792076771653557*x -0.49153398564149964;
rgba[1] = -1.9765567765567764*x + 0.9892594986712628;
rgba[2] = 1.0;
- }
+ }
else if (x < 0.7531036189872085)
- {
+ {
rgba[0] = 1.9792076771653557*x -0.49153398564149964;
rgba[1] = 2.0*x - 1.00392156862745;
rgba[2] = -4.0*x + 3.011764705882353;
- }
+ }
else if (x < 1.0)
- {
+ {
rgba[0] = 1.0;
rgba[1] = 2.0*x - 1.00392156862745;
rgba[2] = 4.0428344791115824*x - 3.045323047251687;
- }
+ }
else
- {
+ {
rgba[0] = 1.0;
rgba[1] = 1.0;
rgba[2] = 1.0;
- }
+ }
cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
cptr += 4;
- }
- this->Modified();
}
+ this->Modified();
+ }
else if (strcmp(cs, "HOT_METAL_BLUE") == 0)
- {
+ {
// algorithmically create the "hot metal blue" table
int n = this->GetNumberOfColors();
unsigned char *cptr = this->WritePointer(0, n);
double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
for (int i = 0; i < n; i++)
- {
+ {
double x = static_cast<double>(i)/(n - 1);
if (x < 0.3333333333333333)
- {
+ {
rgba[2] = 1.96*x;
- }
+ }
else if (x < 0.4)
- {
+ {
rgba[0] = 3.0*x - 1.0;
rgba[2] = 1.96*x;
- }
+ }
else if (x < 0.4666666666666666)
- {
+ {
rgba[0] = 2.25*x - 0.7;
rgba[2] = 1.96 - 2.94*x;
- }
+ }
else if (x < 0.5333333333333333)
- {
+ {
rgba[0] = 3.0*x - 1.05;
rgba[1] = 1.875*x - 0.875;
rgba[2] = 3.332 - 5.88*x;
- }
+ }
else if (x < 0.6)
- {
+ {
rgba[0] = 3.0*x - 1.05;
rgba[1] = 1.875*x - 0.875;
rgba[2] = 1.764 - 2.94*x;
- }
+ }
else if (x < 0.6666666666666666)
- {
+ {
rgba[0] = 3.75*x - 1.5;
rgba[1] = 1.875*x - 0.875;
rgba[2] = 0.0;
- }
+ }
else if (x < 0.9333333333333333)
- {
+ {
rgba[0] = 1.0;
rgba[1] = 1.875*x - 0.875;
rgba[2] = 2.95*x - 1.9666666666666666;
- }
+ }
else if (x < 1.0)
- {
+ {
rgba[0] = 1.0;
rgba[1] = 1.875*x - 0.875;
rgba[2] = 3.2*x - 2.2;
- }
+ }
else
- {
+ {
rgba[0] = 1.0;
rgba[1] = 1.0;
rgba[2] = 1.0;
- }
+ }
cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
cptr += 4;
- }
- this->Modified();
}
+ this->Modified();
+ }
else if (strcmp(cs, "PET_20_STEP") == 0)
- {
+ {
// segment the table into 20 steps
double values[20][4] = {
{ 0.0, 0.0, 0.0, 1.0 },
@@ -245,7 +245,7 @@ void vtkDICOMLookupTable::BuildStandardPalette(const char *cs)
int n = this->GetNumberOfColors();
unsigned char *cptr = this->WritePointer(0, n);
for (int i = 0; i < n; i++)
- {
+ {
double x = static_cast<double>(i)/(n - 1);
double *rgba;
if (x < 0.05) { rgba = values[0]; }
@@ -274,9 +274,9 @@ void vtkDICOMLookupTable::BuildStandardPalette(const char *cs)
cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
cptr += 4;
- }
- this->Modified();
}
+ this->Modified();
+ }
}
//----------------------------------------------------------------------------
@@ -306,12 +306,12 @@ void vtkDICOMLookupTable::BuildImagePalette(
const unsigned short *spp[4] = { 0, 0, 0, 0 };
const unsigned char *cpp[4] = { 0, 0, 0, 0 };
for (int j = 0; j < 4; j++)
- {
+ {
const vtkDICOMValue& v = meta->GetAttributeValue(
fileIndex, descTag[j]);
// Descriptor must have three values
if (v.GetNumberOfValues() == 3)
- {
+ {
// First value is number of entries in the this
int n = v.GetUnsignedShort(0);
n = (n == 0 ? 65536 : n);
@@ -333,50 +333,50 @@ void vtkDICOMLookupTable::BuildImagePalette(
const vtkDICOMValue& d = meta->GetAttributeValue(
fileIndex, dataTag[j]);
if (d.GetVL() >= static_cast<unsigned int>(2*n))
- {
+ {
spp[j] = d.GetUnsignedShortData();
- }
+ }
else if (d.GetVL() >= static_cast<unsigned int>(n))
- {
+ {
cpp[j] = d.GetUnsignedCharData();
if (cpp[j] == 0)
- {
+ {
cpp[j] = reinterpret_cast<const unsigned char *>(
d.GetUnsignedShortData());
- }
}
}
}
+ }
if (maxValue > minValue)
- {
+ {
// Generate the lookup table
this->SetRange(minValue, maxValue);
this->SetNumberOfColors(maxValue - minValue + 1);
unsigned char *cptr = this->WritePointer(0, maxValue - minValue + 1);
for (int i = minValue; i <= maxValue; i++)
- {
+ {
double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
for (int j = 0; j < 4; j++)
- {
+ {
int k = i - firstValue[j];
k = (i >= firstValue[j] ? k : 0);
k = (i <= lastValue[j] ? k : lastValue[j] - firstValue[j]);
if (spp[j])
- {
+ {
rgba[j] = spp[j][k] / divisor[j];
- }
+ }
else if (cpp[j])
- {
+ {
rgba[j] = cpp[j][k] / divisor[j];
- }
}
+ }
cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
cptr += 4;
- }
}
+ }
this->Modified();
}
diff --git a/Source/vtkDICOMLookupTable.h b/Source/vtkDICOMLookupTable.h
index 455c4bb..1d2c33b 100644
--- a/Source/vtkDICOMLookupTable.h
+++ b/Source/vtkDICOMLookupTable.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,11 +11,13 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMLookupTable - Lookup tables from DICOM data.
-// .SECTION Description
-// This class can create VTK lookup tables from the information in a
-// DICOM data set. Lookup tables can be created from a palette LUT,
-// or from standard DICOM LUTs such as HOT_IRON.
+/*! \class vtkDICOMLookupTable
+ * \brief Lookup tables from DICOM data.
+ *
+ * This class can create VTK lookup tables from the information in a
+ * DICOM data set. Lookup tables can be created from a palette LUT,
+ * or from standard DICOM LUTs such as HOT_IRON.
+ */
#ifndef vtkDICOMLookupTable_h
#define vtkDICOMLookupTable_h
@@ -29,26 +31,26 @@ class vtkDICOMMetaData;
class VTKDICOM_EXPORT vtkDICOMLookupTable : public vtkLookupTable
{
public:
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkDICOMLookupTable *New();
vtkTypeMacro(vtkDICOMLookupTable, vtkLookupTable);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Build the a standard lookup table, given a code string.
- // The supported code strings are HOT_IRON, HOT_METAL_BLUE, PET,
- // and PET_20_STEP. This does not set the range of the table.
+ //! Build the a standard lookup table, given a code string.
+ /*!
+ * The supported code strings are HOT_IRON, HOT_METAL_BLUE, PET,
+ * and PET_20_STEP. This does not set the range of the table.
+ */
void BuildStandardPalette(const char *name);
- // Description:
- // Build the lookup table from the supplied meta data.
- // An index may be given to specify which data set instance in the
- // meta data will be used. The range of the table will be set to
- // the smallest and largest pixel values to be mapped.
+ //! Build the lookup table from the supplied meta data.
+ /*!
+ * An index may be given to specify which data set instance in the
+ * meta data will be used. The range of the table will be set to
+ * the smallest and largest pixel values to be mapped.
+ */
void BuildImagePalette(vtkDICOMMetaData *meta, int idx=0);
protected:
@@ -56,8 +58,8 @@ protected:
~vtkDICOMLookupTable();
private:
- vtkDICOMLookupTable(const vtkDICOMLookupTable&); // Not implemented.
- void operator=(const vtkDICOMLookupTable&); // Not implemented.
+ vtkDICOMLookupTable(const vtkDICOMLookupTable&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMLookupTable&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMLookupTable_h
diff --git a/Source/vtkDICOMMRGenerator.cxx b/Source/vtkDICOMMRGenerator.cxx
index ccb2e54..e9de061 100644
--- a/Source/vtkDICOMMRGenerator.cxx
+++ b/Source/vtkDICOMMRGenerator.cxx
@@ -65,13 +65,13 @@ bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source)
// DENSITY MAP, IMAGE ADDITION, OTHER
const char *it = 0;
if (source)
- {
+ {
it = source->GetAttributeValue(DC::ImageType).GetCharData();
- }
+ }
if (it == 0 || it[0] == '\0')
- {
+ {
it = "DERIVED\\SECONDARY\\OTHER";
- }
+ }
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(DC::ImageType, it);
@@ -84,18 +84,18 @@ bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source)
const char *ss = 0;
const char *sv = 0;
if (source)
- {
+ {
ss = source->GetAttributeValue(DC::ScanningSequence).GetCharData();
sv = source->GetAttributeValue(DC::SequenceVariant).GetCharData();
- }
+ }
if (ss == 0 || ss[0] == '\0')
- { // default to "research mode"
+ { // default to "research mode"
ss = "RM";
- }
+ }
if (sv == 0 || sv[0] == '\0')
- {
+ {
sv = "NONE";
- }
+ }
meta->SetAttributeValue(DC::ScanningSequence, ss);
meta->SetAttributeValue(DC::SequenceVariant, sv);
@@ -103,41 +103,41 @@ bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source)
meta->SetAttributeValue(DC::SpacingBetweenSlices, this->Spacing[2]);
if (source)
- {
+ {
// set this to the time dimension
if (source->HasAttribute(DC::CardiacNumberOfImages))
- {
+ {
meta->SetAttributeValue(DC::CardiacNumberOfImages, this->Dimensions[3]);
- }
+ }
// keep this if data was not reformatted
if (this->SourceInstanceArray != 0 && source == this->SourceMetaData)
- {
+ {
vtkDICOMMetaDataAdapter sourceAdapter(source);
const char *ped = sourceAdapter->GetAttributeValue(
DC::InPlanePhaseEncodingDirection).GetCharData();
if (ped != 0 && ped[0] != '\0')
- {
+ {
meta->SetAttributeValue(DC::InPlanePhaseEncodingDirection, ped);
- }
}
}
+ }
// temporal information
if (this->Dimensions[3] > 1)
- {
+ {
int n = meta->GetNumberOfInstances();
int nslices = (this->Dimensions[2] > 0 ? this->Dimensions[2] : 1);
for (int i = 0; i < n; i++)
- {
+ {
int t = (i % (n / nslices)) / (n / (nslices*this->Dimensions[3]));
meta->SetAttributeValue(i, DC::TemporalPositionIdentifier, t + 1);
- }
+ }
meta->SetAttributeValue(
DC::NumberOfTemporalPositions, this->Dimensions[3]);
meta->SetAttributeValue(
DC::TemporalResolution, this->Spacing[3]);
- }
+ }
// required items: use simple read/write validation
DC::EnumType required[] = {
@@ -229,9 +229,9 @@ bool vtkDICOMMRGenerator::GenerateMRInstance(vtkInformation *info)
!this->GenerateMRImageModule(source) ||
!this->GenerateOverlayPlaneModule(source) ||
!this->GenerateVOILUTModule(source))
- {
+ {
return false;
- }
+ }
return true;
}
@@ -240,10 +240,10 @@ bool vtkDICOMMRGenerator::GenerateMRInstance(vtkInformation *info)
bool vtkDICOMMRGenerator::GenerateInstance(vtkInformation *info)
{
if (this->MultiFrame)
- {
+ {
vtkErrorMacro("Enhanced Multi-Frame MR is not yet supported.");
return false;
- }
+ }
return this->GenerateMRInstance(info);
}
diff --git a/Source/vtkDICOMMRGenerator.h b/Source/vtkDICOMMRGenerator.h
index ccbb898..506237f 100644
--- a/Source/vtkDICOMMRGenerator.h
+++ b/Source/vtkDICOMMRGenerator.h
@@ -57,8 +57,8 @@ protected:
virtual bool GenerateMRInstance(vtkInformation *info);
private:
- vtkDICOMMRGenerator(const vtkDICOMMRGenerator&); // Not implemented.
- void operator=(const vtkDICOMMRGenerator&); // Not implemented.
+ vtkDICOMMRGenerator(const vtkDICOMMRGenerator&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMMRGenerator&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMMRGenerator_h
diff --git a/Source/vtkDICOMMetaData.cxx b/Source/vtkDICOMMetaData.cxx
index dca91c1..9158988 100644
--- a/Source/vtkDICOMMetaData.cxx
+++ b/Source/vtkDICOMMetaData.cxx
@@ -50,13 +50,13 @@ vtkDICOMMetaData::~vtkDICOMMetaData()
{
this->Clear();
if (this->FileIndexArray)
- {
+ {
this->FileIndexArray->Delete();
- }
+ }
if (this->FrameIndexArray)
- {
+ {
this->FrameIndexArray->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -65,13 +65,13 @@ void vtkDICOMMetaData::Clear()
vtkDICOMDataElement **htable = this->Table;
if (htable)
- {
+ {
for (unsigned int i = 0; i < METADATA_HASH_SIZE; i++)
- {
+ {
delete [] htable[i];
- }
- delete [] htable;
}
+ delete [] htable;
+ }
this->NumberOfDataElements = 0;
this->Table = NULL;
@@ -85,65 +85,65 @@ void vtkDICOMMetaData::Initialize()
this->Clear();
this->NumberOfInstances = 1;
if (this->FileIndexArray)
- {
+ {
this->FileIndexArray->Delete();
this->FileIndexArray = 0;
- }
+ }
if (this->FrameIndexArray)
- {
+ {
this->FrameIndexArray->Delete();
this->FrameIndexArray = 0;
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMMetaData::SetNumberOfInstances(int n)
{
if (this->Table != NULL)
- {
+ {
vtkErrorMacro("SetNumberOfInstances: Cannot set NumberOfInstances after "
"attributes have been added");
- }
+ }
else
- {
+ {
this->NumberOfInstances = n;
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMMetaData::SetFileIndexArray(vtkIntArray *a)
{
if (this->FileIndexArray != a)
- {
+ {
if (this->FileIndexArray)
- {
+ {
this->FileIndexArray->Delete();
- }
+ }
this->FileIndexArray = a;
if (this->FileIndexArray)
- {
+ {
this->FileIndexArray->Register(this);
- }
- this->Modified();
}
+ this->Modified();
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMMetaData::SetFrameIndexArray(vtkIntArray *a)
{
if (this->FrameIndexArray != a)
- {
+ {
if (this->FrameIndexArray)
- {
+ {
this->FrameIndexArray->Delete();
- }
+ }
this->FrameIndexArray = a;
if (this->FrameIndexArray)
- {
+ {
this->FrameIndexArray->Register(this);
- }
- this->Modified();
}
+ this->Modified();
+ }
}
//----------------------------------------------------------------------------
@@ -156,30 +156,30 @@ void vtkDICOMMetaData::RemoveAttribute(vtkDICOMTag tag)
vtkDICOMDataElement *hptr;
if (htable && (hptr = htable[i]) != NULL)
- {
+ {
while (hptr->Next != 0)
- {
+ {
if (hptr->Tag == tag)
- {
+ {
// remove from the linked list
hptr->Next->Prev = hptr->Prev;
hptr->Prev->Next = hptr->Next;
// remove from the hash table
hptr[0] = hptr[1];
while (hptr->Next != 0)
- {
+ {
// adjust links as necessary
hptr->Prev->Next = hptr;
hptr->Next->Prev = hptr;
hptr++;
hptr[0] = hptr[1];
- }
+ }
this->NumberOfDataElements--;
break;
- }
- hptr++;
}
+ hptr++;
}
+ }
}
//----------------------------------------------------------------------------
@@ -193,16 +193,16 @@ vtkDICOMDataElement *vtkDICOMMetaData::FindDataElement(
vtkDICOMDataElement *hptr;
if (htable && (hptr = htable[i]) != NULL)
- {
+ {
while (hptr->Next != 0)
- {
+ {
if (hptr->Tag == tag)
- {
+ {
return hptr;
- }
- hptr++;
}
+ hptr++;
}
+ }
return NULL;
}
@@ -221,23 +221,23 @@ const vtkDICOMValue *vtkDICOMMetaData::FindAttributeValue(
const vtkDICOMValue *vptr = 0;
if (a != 0)
- {
+ {
vptr = &a->Value;
// is this a sequence of values?
const vtkDICOMValue *sptr = vptr->GetMultiplexData();
if (sptr)
- {
+ {
size_t n = vptr->GetNumberOfValues();
vptr = 0;
if (idx >= 0 && static_cast<size_t>(idx) < n)
- {
+ {
if (sptr[idx].IsValid())
- {
+ {
vptr = &sptr[idx];
- }
}
}
}
+ }
return vptr;
}
@@ -248,20 +248,20 @@ const vtkDICOMValue *vtkDICOMMetaData::FindAttributeValue(
{
const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath.GetHead());
if (vptr != 0 && tagpath.HasTail())
- {
- unsigned int i = tagpath.GetIndex();
- unsigned int n = vptr->GetNumberOfValues();
+ {
+ size_t i = tagpath.GetIndex();
+ size_t n = vptr->GetNumberOfValues();
const vtkDICOMItem *items = vptr->GetSequenceData();
vptr = 0;
if (items != 0 && i < n)
- {
+ {
vptr = &items[i].GetAttributeValue(tagpath.GetTail());
if (!vptr->IsValid())
- {
+ {
vptr = 0;
- }
}
}
+ }
return vptr;
}
@@ -314,51 +314,51 @@ const vtkDICOMValue &vtkDICOMMetaData::GetAttributeValue(
// (if frame is "-1", then only search SharedFunctionalGroups)
int istart = (frame < 0 ? 1 : 0);
for (int i = istart; i < 2; i++)
- {
+ {
// we only need the frame number for the PerFrame sequence
size_t f = (i == 0 ? frame : 0);
const vtkDICOMValue *seq = this->FindAttributeValue(idx, fgs[i]);
if (seq && f < seq->GetNumberOfValues())
- {
+ {
// search for the item that matches the frame
const vtkDICOMItem *items = seq->GetSequenceData();
const vtkDICOMValue &v = items[f].GetAttributeValue(tagpath);
if (v.IsValid())
- {
+ {
return v;
- }
+ }
// search within all the sequences in the item
vtkDICOMDataElementIterator iter = items[f].Begin();
vtkDICOMDataElementIterator iterEnd = items[f].End();
while (iter != iterEnd)
- {
+ {
const vtkDICOMValue &u = iter->GetValue();
if (u.GetNumberOfValues() == 1)
- {
+ {
const vtkDICOMItem *item = u.GetSequenceData();
if (item)
- {
+ {
const vtkDICOMValue &w = item->GetAttributeValue(tagpath);
if (w.IsValid())
- {
+ {
if ((iter->GetTag().GetGroup() & 1) == 0)
- {
+ {
return w;
- }
+ }
else if (privateValue == 0)
- {
+ {
// if we found the attribute in a private sequence,
// then save but and keep searching to see if it will
// eventually be found somewhere public
privateValue = &w;
- }
}
}
}
- ++iter;
}
+ ++iter;
}
}
+ }
// search root last of all
const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath);
@@ -381,9 +381,9 @@ int vtkDICOMMetaData::GetFileIndex(int sliceIdx)
{
if (this->FileIndexArray == 0 || sliceIdx < 0 ||
sliceIdx >= this->FileIndexArray->GetNumberOfTuples())
- {
+ {
return -1;
- }
+ }
int n = this->FileIndexArray->GetNumberOfComponents();
return this->FileIndexArray->GetValue(sliceIdx*n);
@@ -395,9 +395,9 @@ int vtkDICOMMetaData::GetFileIndex(int sliceIdx, int compIdx, int numComp)
if (this->FileIndexArray == 0 || sliceIdx < 0 ||
sliceIdx >= this->FileIndexArray->GetNumberOfTuples() ||
compIdx < 0 || compIdx >= numComp)
- {
+ {
return -1;
- }
+ }
int n = this->FileIndexArray->GetNumberOfComponents();
return this->FileIndexArray->GetValue(sliceIdx*n + compIdx*n/numComp);
@@ -408,9 +408,9 @@ int vtkDICOMMetaData::GetFrameIndex(int sliceIdx)
{
if (this->FrameIndexArray == 0 || sliceIdx < 0 ||
sliceIdx >= this->FrameIndexArray->GetNumberOfTuples())
- {
+ {
return -1;
- }
+ }
int n = this->FrameIndexArray->GetNumberOfComponents();
return this->FrameIndexArray->GetValue(sliceIdx*n);
@@ -422,9 +422,9 @@ int vtkDICOMMetaData::GetFrameIndex(int sliceIdx, int compIdx, int numComp)
if (this->FrameIndexArray == 0 || sliceIdx < 0 ||
sliceIdx >= this->FrameIndexArray->GetNumberOfTuples() ||
compIdx < 0 || compIdx >= numComp)
- {
+ {
return -1;
- }
+ }
int n = this->FrameIndexArray->GetNumberOfComponents();
return this->FrameIndexArray->GetValue(sliceIdx*n + compIdx*n/numComp);
@@ -442,62 +442,62 @@ vtkDICOMDataElement *vtkDICOMMetaData::FindDataElementOrInsert(
vtkDICOMDataElement *hptr;
if (htable == NULL)
- {
+ {
// allocate the hash table
m = METADATA_HASH_SIZE;
htable = new vtkDICOMDataElement *[METADATA_HASH_SIZE];
this->Table = htable;
do { *htable++ = NULL; } while (--m);
htable = this->Table;
- }
+ }
hptr = htable[i];
if (hptr == NULL)
- {
+ {
hptr = new vtkDICOMDataElement[4];
htable[i] = hptr;
- }
+ }
else if (hptr->Next != 0)
- {
+ {
// see if item is already there
unsigned int n = 0;
do
- {
+ {
if (hptr->Tag == tag)
- {
+ {
return hptr;
- }
+ }
n++;
hptr++;
- }
+ }
while (hptr->Next != 0);
// if n+1 is a power of two, double allocated space
if (n > 2 && (n & (n+1)) == 0)
- {
+ {
vtkDICOMDataElement *oldptr = htable[i];
hptr = new vtkDICOMDataElement[2*(n+1)];
htable[i] = hptr;
// copy the old list
for (unsigned int j = 0; j < n; j++)
- {
+ {
*hptr = oldptr[j];
// link the new element into the list
hptr->Next->Prev = hptr;
hptr->Prev->Next = hptr;
hptr++;
- }
- delete [] oldptr;
}
+ delete [] oldptr;
}
+ }
// insert into the linked list
vtkDICOMDataElement *tptr = &this->Tail;
do
- {
+ {
tptr = tptr->Prev;
- }
+ }
while (tag < tptr->GetTag());
hptr->Prev = tptr;
@@ -518,109 +518,109 @@ int vtkDICOMMetaData::FindItemsOrInsert(
vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag);
if (loc == 0)
- {
+ {
vtkErrorMacro("SetAttributeValue: tag group number must not be zero.");
return 0;
- }
+ }
loc->Tag = tag;
vtkDICOMValue *vptr = &loc->Value;
if (!vptr->IsValid())
- {
+ {
vtkDICOMVR vr = this->FindDictVR(idx, tag);
if (vr != vtkDICOMVR::SQ && vr != vtkDICOMVR::UN)
- {
+ {
// we just inserted a non-SQ value, remove it
this->RemoveAttribute(tag);
return 0;
- }
}
+ }
else if (vptr->GetVR() != vtkDICOMVR::SQ)
- {
+ {
return 0;
- }
+ }
// is this a series of values?
int count = 1;
vtkDICOMValue *sptr = vtkDICOMValueFriendMetaData::GetMultiplex(vptr);
if (sptr != 0)
- {
+ {
if (useidx)
- {
+ {
assert(idx >= 0 && idx < this->NumberOfInstances);
sptr = &sptr[idx];
- }
+ }
else
- {
+ {
count = this->NumberOfInstances;
- }
}
+ }
else if (useidx && this->NumberOfInstances > 1)
- {
+ {
// create a multiplex
assert(idx >= 0 && idx < this->NumberOfInstances);
int n = this->NumberOfInstances;
vtkDICOMValue l;
sptr = l.AllocateMultiplexData(vtkDICOMVR::SQ, n);
for (int i = 0; i < n; i++)
- {
+ {
if (i != idx)
- {
+ {
sptr[i] = *vptr;
- }
}
+ }
*vptr = l;
sptr = &sptr[idx];
- }
+ }
else
- {
+ {
sptr = vptr;
- }
+ }
- unsigned int i = tagpath.GetIndex();
+ size_t i = tagpath.GetIndex();
for (int k = 0; k < count; k++)
- {
- unsigned int n = i+1;
- unsigned int m = 0;
+ {
+ size_t n = i+1;
+ size_t m = 0;
const vtkDICOMItem *oldItems = sptr[k].GetSequenceData();
if (oldItems != 0)
- {
+ {
m = sptr[k].GetNumberOfValues();
n = (n > m ? n : m);
- }
+ }
vtkDICOMValue seq;
vtkDICOMItem *items = seq.AllocateSequenceData(vtkDICOMVR::SQ, n);
// copy the old sequence into the new one (shallow copy)
- for (unsigned int j = 0; j < m; j++)
- {
+ for (size_t j = 0; j < m; j++)
+ {
items[j] = oldItems[j];
- }
+ }
// Get the character set and default VR for XS
vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_IR_6;
vtkDICOMVR vrForXS = vtkDICOMVR::US;
if (n > m)
- {
+ {
const vtkDICOMValue& vcs =
this->GetAttributeValue(DC::SpecificCharacterSet);
if (vcs.IsValid())
- {
+ {
cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
- }
+ }
const vtkDICOMValue &v = this->GetAttributeValue(
DC::PixelRepresentation);
if (v.IsValid())
- {
+ {
vrForXS = (v.AsUnsignedShort() == 0 ?
vtkDICOMVR::US : vtkDICOMVR::SS);
- }
}
- for (unsigned int j = m; j < n; j++)
- {
+ }
+ for (size_t j = m; j < n; j++)
+ {
items[j] = vtkDICOMItem(cs, vrForXS);
- }
+ }
sptr[k] = seq;
itemarray[k] = &items[i];
- }
+ }
return count;
}
@@ -639,53 +639,53 @@ void vtkDICOMMetaData::SetAttributeValue(
vtkDICOMTag tag, const vtkDICOMValue& v)
{
if (v.IsValid())
- {
+ {
vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag);
if (loc == 0)
- {
+ {
vtkErrorMacro("SetAttributeValue: tag group number must not be zero.");
return;
- }
+ }
loc->Tag = tag;
loc->Value = v;
- }
+ }
else
- {
+ {
this->RemoveAttribute(tag);
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(vtkDICOMTag tag, double v)
{
vtkDICOMVR vr = this->FindDictVR(0, tag);
if (vr != vtkDICOMVR::UN)
- {
+ {
this->SetAttributeValue(tag, vtkDICOMValue(vr, v));
- }
+ }
else
- {
+ {
vtkErrorMacro("SetAttributeValue: could not find tag (" <<
tag << ") in the dictionary");
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(vtkDICOMTag tag, const std::string& v)
{
vtkDICOMVR vr = this->FindDictVR(0, tag);
if (vr.HasSpecificCharacterSet() && tag > DC::SpecificCharacterSet)
- {
+ {
this->SetAttributeValue(tag,
this->MakeValueWithSpecificCharacterSet(vr, v));
- }
+ }
else if (vr != vtkDICOMVR::UN)
- {
+ {
this->SetAttributeValue(tag, vtkDICOMValue(vr, v));
- }
+ }
else
- {
+ {
vtkErrorMacro("SetAttributeValue: could not find tag (" <<
tag << ") in the dictionary");
- }
+ }
}
//----------------------------------------------------------------------------
@@ -695,10 +695,10 @@ void vtkDICOMMetaData::SetAttributeValue(
{
vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag);
if (loc == 0)
- {
+ {
vtkErrorMacro("SetAttributeValue: tag group number must not be zero.");
return;
- }
+ }
loc->Tag = tag;
vtkDICOMValue *vptr = &loc->Value;
@@ -708,46 +708,46 @@ void vtkDICOMMetaData::SetAttributeValue(
// is this a sequence of values?
vtkDICOMValue *sptr = vtkDICOMValueFriendMetaData::GetMultiplex(vptr);
if (sptr)
- {
+ {
sptr[idx] = v;
// if invalid value was added, make sure valid values remain
if (!v.IsValid())
- {
+ {
bool valid = false;
for (int i = 0; i < this->NumberOfInstances; i++)
- {
+ {
valid |= sptr[i].IsValid();
- }
+ }
if (!valid)
- {
+ {
this->RemoveAttribute(tag);
- }
}
}
+ }
else if (v != *vptr)
- {
+ {
// differs from other instances, must turn value into a list,
// so create a value that is actually a list of values
int n = this->NumberOfInstances;
vtkDICOMValue l;
sptr = l.AllocateMultiplexData(vptr->GetVR(), n);
for (int i = 0; i < n; i++)
- {
+ {
if (i == idx)
- {
+ {
sptr[i] = v;
- }
+ }
else
- {
+ {
sptr[i] = *vptr;
- }
}
- *vptr = l;
}
+ *vptr = l;
+ }
else if (!vptr->IsValid())
- {
+ {
this->RemoveAttribute(tag);
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(
@@ -755,14 +755,14 @@ void vtkDICOMMetaData::SetAttributeValue(
{
vtkDICOMVR vr = this->FindDictVR(idx, tag);
if (vr != vtkDICOMVR::UN)
- {
+ {
this->SetAttributeValue(idx, tag, vtkDICOMValue(vr, v));
- }
+ }
else
- {
+ {
vtkErrorMacro("SetAttributeValue: could not find tag (" <<
tag << ") in the dictionary");
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(
@@ -770,19 +770,19 @@ void vtkDICOMMetaData::SetAttributeValue(
{
vtkDICOMVR vr = this->FindDictVR(idx, tag);
if (vr.HasSpecificCharacterSet() && tag > DC::SpecificCharacterSet)
- {
+ {
this->SetAttributeValue(idx, tag,
this->MakeValueWithSpecificCharacterSet(vr, v));
- }
+ }
else if (vr != vtkDICOMVR::UN)
- {
+ {
this->SetAttributeValue(idx, tag, vtkDICOMValue(vr, v));
- }
+ }
else
- {
+ {
vtkErrorMacro("SetAttributeValue: could not find tag (" <<
tag << ") in the dictionary");
- }
+ }
}
//----------------------------------------------------------------------------
@@ -791,57 +791,57 @@ void vtkDICOMMetaData::SetAttributeValue(
const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v)
{
if (tagpath.HasTail())
- {
+ {
vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances];
int n = this->FindItemsOrInsert(0, false, tagpath, items);
for (int i = 0; i < n; i++)
- {
+ {
items[i]->SetAttributeValue(tagpath.GetTail(), v);
- }
- delete [] items;
}
+ delete [] items;
+ }
else
- {
+ {
this->SetAttributeValue(tagpath.GetHead(), v);
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(
const vtkDICOMTagPath& tagpath, double v)
{
if (tagpath.HasTail())
- {
+ {
vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances];
int n = this->FindItemsOrInsert(0, false, tagpath, items);
for (int i = 0; i < n; i++)
- {
+ {
items[i]->SetAttributeValue(tagpath.GetTail(), v);
- }
- delete [] items;
}
+ delete [] items;
+ }
else
- {
+ {
this->SetAttributeValue(tagpath.GetHead(), v);
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(
const vtkDICOMTagPath& tagpath, const std::string& v)
{
if (tagpath.HasTail())
- {
+ {
vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances];
int n = this->FindItemsOrInsert(0, false, tagpath, items);
for (int i = 0; i < n; i++)
- {
+ {
items[i]->SetAttributeValue(tagpath.GetTail(), v);
- }
- delete [] items;
}
+ delete [] items;
+ }
else
- {
+ {
this->SetAttributeValue(tagpath.GetHead(), v);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -850,51 +850,51 @@ void vtkDICOMMetaData::SetAttributeValue(
int idx, const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v)
{
if (tagpath.HasTail())
- {
+ {
vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath);
if (item)
- {
+ {
item->SetAttributeValue(tagpath.GetTail(), v);
- }
}
+ }
else
- {
+ {
this->SetAttributeValue(idx, tagpath.GetHead(), v);
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(
int idx, const vtkDICOMTagPath& tagpath, double v)
{
if (tagpath.HasTail())
- {
+ {
vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath);
if (item)
- {
+ {
item->SetAttributeValue(tagpath.GetTail(), v);
- }
}
+ }
else
- {
+ {
this->SetAttributeValue(idx, tagpath.GetHead(), v);
- }
+ }
}
void vtkDICOMMetaData::SetAttributeValue(
int idx, const vtkDICOMTagPath& tagpath, const std::string& v)
{
if (tagpath.HasTail())
- {
+ {
vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath);
if (item)
- {
+ {
item->SetAttributeValue(tagpath.GetTail(), v);
- }
}
+ }
else
- {
+ {
this->SetAttributeValue(idx, tagpath.GetHead(), v);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -906,9 +906,9 @@ vtkDICOMValue vtkDICOMMetaData::MakeValueWithSpecificCharacterSet(
const vtkDICOMValue& vcs =
this->GetAttributeValue(DC::SpecificCharacterSet);
if (vcs.IsValid())
- {
+ {
cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
- }
+ }
return vtkDICOMValue(vr, cs, v);
}
@@ -920,37 +920,37 @@ void vtkDICOMMetaData::CopyAttributes(vtkDICOMMetaData *o)
// can safely have private tags when this method is called.
if (o != 0 && o != this)
- {
+ {
vtkDICOMDataElement **otable = o->Table;
if (otable != 0)
- {
+ {
const vtkDICOMDataElement *iter = o->Head.Next;
const vtkDICOMDataElement *iterEnd = &o->Tail;
while (iter != iterEnd)
- {
+ {
// if this is a per-instance element, then make a copy of it
const vtkDICOMValue *vptr = iter->Value.GetMultiplexData();
if (vptr == 0)
- {
+ {
vtkDICOMDataElement *e = this->FindDataElementOrInsert(iter->Tag);
e->Tag = iter->Tag;
e->Value = iter->Value;
- }
+ }
else if (this->NumberOfInstances == o->NumberOfInstances)
- {
+ {
vtkDICOMDataElement *e = this->FindDataElementOrInsert(iter->Tag);
e->Tag = iter->Tag;
vtkDICOMValue *nvptr = e->Value.AllocateMultiplexData(
iter->Value.GetVR(), this->NumberOfInstances);
for (int i = 0; i < this->NumberOfInstances; i++)
- {
+ {
nvptr[i] = vptr[i];
- }
}
- iter = iter->Next;
}
+ iter = iter->Next;
}
}
+ }
}
//----------------------------------------------------------------------------
@@ -958,17 +958,17 @@ void vtkDICOMMetaData::ShallowCopy(vtkDataObject *source)
{
vtkDICOMMetaData *o = vtkDICOMMetaData::SafeDownCast(source);
if (o != this)
- {
+ {
this->Initialize();
if (o != 0)
- {
+ {
this->NumberOfInstances = o->NumberOfInstances;
this->CopyAttributes(o);
this->SetFileIndexArray(o->FileIndexArray);
this->SetFrameIndexArray(o->FrameIndexArray);
- }
- this->vtkDataObject::ShallowCopy(source);
}
+ this->vtkDataObject::ShallowCopy(source);
+ }
}
//----------------------------------------------------------------------------
@@ -976,25 +976,25 @@ void vtkDICOMMetaData::DeepCopy(vtkDataObject *source)
{
vtkDICOMMetaData *o = vtkDICOMMetaData::SafeDownCast(source);
if (o != this)
- {
+ {
this->Initialize();
if (o != 0)
- {
+ {
this->NumberOfInstances = o->NumberOfInstances;
this->CopyAttributes(o);
if (o->FileIndexArray)
- {
+ {
this->FileIndexArray = vtkIntArray::New();
this->FileIndexArray->DeepCopy(o->FileIndexArray);
- }
+ }
if (o->FrameIndexArray)
- {
+ {
this->FrameIndexArray = vtkIntArray::New();
this->FrameIndexArray->DeepCopy(o->FrameIndexArray);
- }
}
- this->vtkDataObject::DeepCopy(source);
}
+ this->vtkDataObject::DeepCopy(source);
+ }
}
//----------------------------------------------------------------------------
@@ -1005,60 +1005,60 @@ vtkDICOMVR vtkDICOMMetaData::FindDictVR(int idx, vtkDICOMTag tag)
vtkDICOMDictEntry e = this->FindDictEntry(tag);
if (e.IsValid())
- {
+ {
vr = e.GetVR();
// use the dictionary VR
if (vr == vtkDICOMVR::XS)
- {
+ {
vr = vtkDICOMVR::US;
const vtkDICOMValue &v =
this->GetAttributeValue(idx, DC::PixelRepresentation);
if (v.IsValid())
- {
+ {
unsigned short r = v.AsUnsignedShort();
vr = (r == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS);
- }
+ }
else if (tag > DC::PixelRepresentation)
- {
+ {
vtkErrorMacro("SetAttributeValue: could not look up vr for (" <<
tag << ") because PixelRepresentation is not set.");
- }
}
+ }
else if (vr == vtkDICOMVR::OX)
- {
+ {
vr = vtkDICOMVR::OW;
if (tag.GetGroup() == 0x5400)
- {
+ {
const vtkDICOMValue &v =
this->GetAttributeValue(idx, DC::WaveformBitsAllocated);
if (v.IsValid())
- {
+ {
unsigned short s = v.AsUnsignedShort();
vr = (s > 8 ? vtkDICOMVR::OW : vtkDICOMVR::OB);
- }
+ }
else
- {
+ {
vtkErrorMacro("SetAttributeValue: could not look up vr for (" <<
tag << ") because WaveformBitsAllocated is not set.");
- }
}
+ }
else
- {
+ {
const vtkDICOMValue &v =
this->GetAttributeValue(idx, DC::BitsAllocated);
if (v.IsValid())
- {
+ {
unsigned short s = v.AsUnsignedShort();
vr = (s > 8 ? vtkDICOMVR::OW : vtkDICOMVR::OB);
- }
+ }
else
- {
+ {
vtkErrorMacro("SetAttributeValue: could not look up vr for (" <<
tag << ") because BitsAllocated is not set.");
- }
}
}
}
+ }
return vr;
}
@@ -1069,9 +1069,9 @@ vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTag(
{
unsigned short g = ptag.GetGroup();
if ((g & 0x0001) == 0)
- {
+ {
return ptag;
- }
+ }
// if not resolved, the result will be (ffff,ffff)
vtkDICOMTag otag(0xFFFF, 0xFFFF);
@@ -1083,31 +1083,31 @@ vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTag(
vtkDICOMDataElement *e = this->FindDataElement(ctag);
if (e != 0)
- {
+ {
// found (gggg,0010) in the hash table
iter = vtkDICOMDataElementIterator(e);
- }
+ }
else
- {
+ {
// skip through list of elements until group is found
while (iter != iterEnd && iter->GetTag() < ctag)
- {
+ {
++iter;
- }
}
+ }
// look for private creator elements within the group
while (iter != iterEnd && iter->GetTag() <= etag)
- {
+ {
ctag = iter->GetTag();
if (iter->GetValue().AsString() == creator)
- {
+ {
otag = vtkDICOMTag(
g, (ctag.GetElement() << 8) | (ptag.GetElement() & 0x00FF));
break;
- }
- ++iter;
}
+ ++iter;
+ }
return otag;
}
@@ -1118,23 +1118,23 @@ vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTagForWriting(
{
vtkDICOMTag otag = this->ResolvePrivateTag(ptag, creator);
if (otag == vtkDICOMTag(0xFFFF, 0xFFFF))
- {
+ {
unsigned short g = ptag.GetGroup();
for (unsigned short e = 0x0010; e <= 0x00FF; e++)
- {
+ {
vtkDICOMTag ctag(g, e);
vtkDICOMDataElement *d = this->FindDataElementOrInsert(ctag);
if (!d->Value.IsValid())
- {
+ {
// if an empty slot was found, use it for this creator
d->Tag = ctag;
d->Value = this->MakeValueWithSpecificCharacterSet(
vtkDICOMVR::LO, creator);
otag = vtkDICOMTag(g, (e << 8) | (ptag.GetElement() & 0x00FF));
break;
- }
}
}
+ }
return otag;
}
@@ -1148,13 +1148,13 @@ vtkDICOMDictEntry vtkDICOMMetaData::FindDictEntry(vtkDICOMTag tag)
// note that there is similar code in vtkDICOMItem
const char *dict = 0;
if ((group & 1) != 0 && element > 0x00ffu)
- {
+ {
unsigned short creatorElement = (element >> 8);
element &= 0x00ffu;
tag = vtkDICOMTag(group, element);
vtkDICOMTag creatorTag(group, creatorElement);
dict = this->GetAttributeValue(creatorTag).GetCharData();
- }
+ }
return vtkDICOMDictionary::FindDictEntry(tag, dict);
}
diff --git a/Source/vtkDICOMMetaData.h b/Source/vtkDICOMMetaData.h
index f41611c..7e57311 100644
--- a/Source/vtkDICOMMetaData.h
+++ b/Source/vtkDICOMMetaData.h
@@ -41,6 +41,7 @@ public:
//! Print a summary of the contents of this object.
void PrintSelf(ostream& os, vtkIndent indent);
+ //@{
//! Get the number of instances (i.e. files).
/*!
* We want to track the metadata from all of the files that
@@ -51,13 +52,17 @@ public:
*/
int GetNumberOfInstances() { return this->NumberOfInstances; }
void SetNumberOfInstances(int n);
+ //@}
+ //@{
//! Remove all data elements.
void Clear();
//! Remove all data elements and initialize all members.
void Initialize();
+ //@}
+ //@{
//! Get the number of data elements that are present.
int GetNumberOfDataElements() {
return this->NumberOfDataElements; }
@@ -69,7 +74,9 @@ public:
//! Get an end iterator for the list of data elements.
vtkDICOMDataElementIterator End() {
return &this->Tail; }
+ //@}
+ //@{
//! Get the iterator for a specific data element.
/*!
* If the element was not found, then End() will be returned.
@@ -77,13 +84,17 @@ public:
vtkDICOMDataElementIterator Find(vtkDICOMTag tag) {
vtkDICOMDataElement *e = this->FindDataElement(tag);
return (e != 0 ? e : &this->Tail); }
+ //@}
+ //@{
//! Check whether an attribute is present in the metadata.
bool HasAttribute(vtkDICOMTag tag);
//! Erase an attribute.
void RemoveAttribute(vtkDICOMTag tag);
+ //@}
+ //@{
//! Get an attribute value.
/*!
* The tag will usually be specified in one of these two ways:
@@ -94,7 +105,9 @@ public:
*/
const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag);
const vtkDICOMValue &GetAttributeValue(const vtkDICOMTagPath &p);
+ //@}
+ //@{
//! Get an attribute value for the specified file index.
/*!
* If this meta data object is used to hold the meta data for
@@ -105,7 +118,9 @@ public:
*/
const vtkDICOMValue &GetAttributeValue(int idx, vtkDICOMTag tag);
const vtkDICOMValue &GetAttributeValue(int idx, const vtkDICOMTagPath &p);
+ //@}
+ //@{
//! Get an attribute value for the specified file and frame index.
/*!
* In order to get the file and frame index for a particular slice
@@ -120,7 +135,9 @@ public:
const vtkDICOMValue &GetAttributeValue(int idx, int frame, vtkDICOMTag tag);
const vtkDICOMValue &GetAttributeValue(
int idx, int frame, const vtkDICOMTagPath &p);
+ //@}
+ //@{
//! Get the file index for the given image slice and component.
/*!
* This takes into account the way the files were sorted to create
@@ -131,7 +148,9 @@ public:
*/
int GetFileIndex(int sliceIdx, int compIdx, int numComps);
int GetFileIndex(int sliceIdx);
+ //@}
+ //@{
//! Get the frame index for the given image slice and component.
/*!
* This takes into account the way the frames were sorted to create
@@ -142,7 +161,9 @@ public:
*/
int GetFrameIndex(int sliceIdx, int compIdx, int numComps);
int GetFrameIndex(int sliceIdx);
+ //@}
+ //@{
//! Set an attribute value for the image at file index "idx".
/*!
* Except for the method that takes a vtkDICOMValue, these methods
@@ -157,12 +178,16 @@ public:
void SetAttributeValue(int idx, vtkDICOMTag tag, const vtkDICOMValue& v);
void SetAttributeValue(int idx, vtkDICOMTag tag, double v);
void SetAttributeValue(int idx, vtkDICOMTag tag, const std::string& v);
+ //@}
+ //@{
//! Set the same attribute value for all images.
void SetAttributeValue(vtkDICOMTag tag, const vtkDICOMValue& v);
void SetAttributeValue(vtkDICOMTag tag, double v);
void SetAttributeValue(vtkDICOMTag tag, const std::string& v);
+ //@}
+ //@{
//! Set the attribute at the specified path.
/*!
* The data element is inserted at the tail of the given path. If the
@@ -176,12 +201,16 @@ public:
int idx, const vtkDICOMTagPath& tag, double v);
void SetAttributeValue(
int idx, const vtkDICOMTagPath& tag, const std::string& v);
+ //@}
+ //@{
//! Set the attribute value along this path for all images.
void SetAttributeValue(const vtkDICOMTagPath& tag, const vtkDICOMValue& v);
void SetAttributeValue(const vtkDICOMTagPath& tag, double v);
void SetAttributeValue(const vtkDICOMTagPath& tag, const std::string& v);
+ //@}
+ //@{
//! Resolve a private tag, or return (ffff,ffff) if not resolved.
/*!
* Private data elements are mobile, which means that different data
@@ -204,7 +233,9 @@ public:
*/
vtkDICOMTag ResolvePrivateTagForWriting(
vtkDICOMTag ptag, const std::string& creator);
+ //@}
+ //@{
//! Look up a tag in the DICOM dictionary.
/*!
* Unlike the method in vtkDICOMDictionary, this method can identify
@@ -215,19 +246,27 @@ public:
//! Use the dictionary to get the VR, return UN if not found.
vtkDICOMVR FindDictVR(int idx, vtkDICOMTag tag);
+ //@}
+ //@{
//! Create a value from text in a specific character set.
vtkDICOMValue MakeValueWithSpecificCharacterSet(
vtkDICOMVR vr, const std::string& v);
+ //@}
+ //@{
//! Set the array to convert slice, component indices to file index.
void SetFileIndexArray(vtkIntArray *fileArray);
vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; }
+ //@}
+ //@{
//! Set the array to convert slice, component indices to frame index.
void SetFrameIndexArray(vtkIntArray *frameArray);
vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; }
+ //@}
+ //@{
//! Copy all the attributes from another MetaData object.
/*!
* Copy attributes from the source meta data object into this one.
@@ -237,10 +276,13 @@ public:
* value for all instances.
*/
void CopyAttributes(vtkDICOMMetaData *source);
+ //@}
+ //@{
//! DataObject interface function.
void ShallowCopy(vtkDataObject *source);
void DeepCopy(vtkDataObject *source);
+ //@}
protected:
vtkDICOMMetaData();
@@ -289,8 +331,8 @@ private:
//! An array to map slices and components to frames.
vtkIntArray *FrameIndexArray;
- vtkDICOMMetaData(const vtkDICOMMetaData&); // Not implemented.
- void operator=(const vtkDICOMMetaData&); // Not implemented.
+ vtkDICOMMetaData(const vtkDICOMMetaData&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMMetaData&) VTK_DELETE_FUNCTION;
};
#endif /* vtkDICOMMetaData_h */
diff --git a/Source/vtkDICOMMetaDataAdapter.cxx b/Source/vtkDICOMMetaDataAdapter.cxx
index ee41a61..54572ff 100644
--- a/Source/vtkDICOMMetaDataAdapter.cxx
+++ b/Source/vtkDICOMMetaDataAdapter.cxx
@@ -20,136 +20,211 @@
//----------------------------------------------------------------------------
vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta)
{
+ this->ConstructionHelper(meta, -1);
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(
+ vtkDICOMMetaData *meta, int i)
+{
+ this->ConstructionHelper(meta, i);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMMetaDataAdapter::ConstructionHelper(
+ vtkDICOMMetaData *meta, int i)
+{
this->Meta = meta;
this->PerFrame = 0;
this->Shared = 0;
- this->NumberOfInstances = 0;
this->NullValue = 0;
+ this->NumberOfInstances = 0;
+ this->MetaInstance = (i >= 0 ? i : 0);
if (meta)
- {
+ {
meta->Register(0);
vtkDICOMDataElementIterator iter;
iter = meta->Find(DC::PerFrameFunctionalGroupsSequence);
if (iter != meta->End())
+ {
+ if (iter->IsPerInstance())
{
- this->PerFrame = &iter->GetValue();
+ this->PerFrame = &iter->GetValue(this->MetaInstance);
}
+ else
+ {
+ this->PerFrame = &iter->GetValue();
+ }
+ }
iter = meta->Find(DC::SharedFunctionalGroupsSequence);
if (iter != meta->End())
+ {
+ if (iter->IsPerInstance())
+ {
+ this->Shared = &iter->GetValue(this->MetaInstance);
+ }
+ else
{
- this->Shared = &iter->GetValue();
+ this->Shared = &iter->GetValue();
}
}
+ }
- if (this->Shared && this->PerFrame)
- {
- this->NumberOfInstances =
- meta->GetAttributeValue(DC::NumberOfFrames).AsInt();
+ if (this->Shared && this->Shared->IsValid() &&
+ this->PerFrame && this->PerFrame->IsValid())
+ {
+ this->NumberOfInstances = meta->GetAttributeValue(
+ this->MetaInstance, DC::NumberOfFrames).AsInt();
// an invalid value to return when asked for NumberOfFrames
this->NullValue = new vtkDICOMValue();
- }
+ }
else if (meta)
- {
- this->NumberOfInstances = meta->GetNumberOfInstances();
+ {
+ this->NumberOfInstances = (i < 0 ? meta->GetNumberOfInstances() : 1);
this->Shared = 0;
this->PerFrame = 0;
- }
+ }
}
+//----------------------------------------------------------------------------
+// Copy constructor
+vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(
+ const vtkDICOMMetaDataAdapter& other)
+ : Meta(other.Meta), PerFrame(other.PerFrame), Shared(other.Shared),
+ NullValue(other.NullValue), NumberOfInstances(other.NumberOfInstances),
+ MetaInstance(other.MetaInstance)
+{
+ if (other.Meta)
+ {
+ this->Meta->Register(0);
+ }
+ if (this->NullValue)
+ {
+ this->NullValue = new vtkDICOMValue();
+ }
+}
+
+//----------------------------------------------------------------------------
// Destructor
vtkDICOMMetaDataAdapter::~vtkDICOMMetaDataAdapter()
{
if (this->Meta)
- {
+ {
this->Meta->Delete();
- }
+ }
delete this->NullValue;
}
//----------------------------------------------------------------------------
+// Assignment
+vtkDICOMMetaDataAdapter& vtkDICOMMetaDataAdapter::operator=(
+ const vtkDICOMMetaDataAdapter& other)
+{
+ if (this != &other)
+ {
+ this->Meta = other.Meta;
+ this->PerFrame = other.PerFrame;
+ this->Shared = other.Shared;
+ this->NullValue = other.NullValue;
+ this->NumberOfInstances = other.NumberOfInstances;
+ this->MetaInstance = other.MetaInstance;
+
+ if (other.Meta)
+ {
+ this->Meta->Register(0);
+ }
+ if (this->NullValue)
+ {
+ this->NullValue = new vtkDICOMValue();
+ }
+ }
+ return *this;
+}
+
+//----------------------------------------------------------------------------
const vtkDICOMValue &vtkDICOMMetaDataAdapter::GetAttributeValue(
int idx, vtkDICOMTag tag) const
{
vtkDICOMMetaData *meta = this->Meta;
if (this->PerFrame)
- {
+ {
// if asked for NumberOfFrames, pretend that it isn't set
if (tag == DC::NumberOfFrames)
- {
+ {
return *this->NullValue;
- }
+ }
// search PerFrameFunctionalGroupsSequence first,
// then search SharedFunctionalGroupsSequence
const vtkDICOMValue *privateValue = 0;
for (int i = 0; i < 2; i++)
- {
+ {
const vtkDICOMValue *seq = this->PerFrame;
unsigned int f = idx;
if (i == 1)
- {
+ {
seq = this->Shared;
f = 0;
- }
+ }
if (seq && f < seq->GetNumberOfValues())
- {
+ {
// search for the item that matches the frame
const vtkDICOMItem *items = seq->GetSequenceData();
const vtkDICOMValue &v = items[f].GetAttributeValue(tag);
if (v.IsValid())
- {
+ {
return v;
- }
+ }
// search within all the sequences in the item
vtkDICOMDataElementIterator iter = items[f].Begin();
vtkDICOMDataElementIterator iterEnd = items[f].End();
while (iter != iterEnd)
- {
+ {
const vtkDICOMValue &u = iter->GetValue();
if (u.GetNumberOfValues() == 1)
- {
+ {
const vtkDICOMItem *item = u.GetSequenceData();
if (item)
- {
+ {
const vtkDICOMValue &w = item->GetAttributeValue(tag);
if (w.IsValid())
- {
+ {
if ((iter->GetTag().GetGroup() & 1) == 0)
- {
+ {
return w;
- }
+ }
else if (privateValue == 0)
- {
+ {
// if we found the attribute in a private sequence,
// then save but and keep searching to see if it will
// eventually be found somewhere public
privateValue = &w;
- }
}
}
}
- ++iter;
}
+ ++iter;
}
}
+ }
// if it wasn't in a PerFrame or Shared functional group
- const vtkDICOMValue& v = meta->GetAttributeValue(0, tag);
+ const vtkDICOMValue& v = meta->GetAttributeValue(this->MetaInstance, tag);
if (privateValue && !v.IsValid())
- {
+ {
// attributes found in private parts of the PerFrame or Shared are
// only returned if the attribute could not be found elsewhere
return *privateValue;
- }
- return v;
}
+ return v;
+ }
// if no per-frame data, use file instance
- return meta->GetAttributeValue(idx, tag);
+ return meta->GetAttributeValue(idx + this->MetaInstance, tag);
}
//----------------------------------------------------------------------------
@@ -174,82 +249,81 @@ vtkDICOMTag vtkDICOMMetaDataAdapter::ResolvePrivateTag(
vtkDICOMMetaData *meta = this->Meta;
if (this->PerFrame)
- {
+ {
// search PerFrameFunctionalGroupsSequence first,
// then search SharedFunctionalGroupsSequence
vtkDICOMTag tagFromPrivSeq(0xFFFF,0xFFFF);
for (int i = 0; i < 2; i++)
- {
+ {
const vtkDICOMValue *seq = this->PerFrame;
unsigned int f = 0;
if (i == 1)
- {
+ {
seq = this->Shared;
f = 0;
- }
+ }
if (seq && f < seq->GetNumberOfValues())
- {
+ {
// search for the item that matches the frame
const vtkDICOMItem *items = seq->GetSequenceData();
vtkDICOMTag tag = items[f].ResolvePrivateTag(ptag, creator);
if (tag != vtkDICOMTag(0xFFFF, 0xFFFF))
- {
+ {
const vtkDICOMValue &v = items[f].GetAttributeValue(tag);
if (v.IsValid())
- {
+ {
return tag;
- }
}
+ }
// search within all the sequences in the item
vtkDICOMDataElementIterator iter = items[f].Begin();
vtkDICOMDataElementIterator iterEnd = items[f].End();
while (iter != iterEnd)
- {
+ {
const vtkDICOMValue &u = iter->GetValue();
if (u.GetNumberOfValues() == 1)
- {
+ {
const vtkDICOMItem *item = u.GetSequenceData();
if (item)
- {
+ {
tag = item->ResolvePrivateTag(ptag, creator);
if (tag != vtkDICOMTag(0xFFFF, 0xFFFF))
- {
+ {
const vtkDICOMValue &v = item->GetAttributeValue(tag);
if (v.IsValid())
- {
+ {
if ((iter->GetTag().GetGroup() & 1) == 0)
- {
+ {
return tag;
- }
+ }
else if (tagFromPrivSeq == vtkDICOMTag(0xFFFF, 0xFFFF))
- {
+ {
// if desired attribute was found within a private
// sequence, we want to keep searching in case it
// later appears within a public sequence (this matches
// the behavior of GetAttributeValue)
tagFromPrivSeq = tag;
- }
}
}
}
}
- ++iter;
}
+ ++iter;
}
}
+ }
// if it wasn't in a PerFrame or Shared functional group
vtkDICOMTag tag = meta->ResolvePrivateTag(ptag, creator);
if (tag == vtkDICOMTag(0xFFFF, 0xFFFF))
- {
+ {
tag = tagFromPrivSeq;
- }
- return tag;
}
+ return tag;
+ }
// if no per-frame data, use file instance
return meta->ResolvePrivateTag(ptag, creator);
}
-
diff --git a/Source/vtkDICOMMetaDataAdapter.h b/Source/vtkDICOMMetaDataAdapter.h
index 1e2d424..109b0d1 100644
--- a/Source/vtkDICOMMetaDataAdapter.h
+++ b/Source/vtkDICOMMetaDataAdapter.h
@@ -32,12 +32,31 @@ class vtkDICOMValue;
class VTKDICOM_EXPORT vtkDICOMMetaDataAdapter
{
public:
+ //@{
//! Construct an adapter for the given meta data object.
+ /*!
+ * If the provided meta-data is from an enhanced multi-frame data set,
+ * then the adapter will make it look like a series of data sets. If
+ * the provided meta-data is from a series of non-enhanced data sets,
+ * the adapter will act as a simple pass-through.
+ */
vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta);
+ //! Construct an adapter for one DICOM object instance.
+ /*!
+ * If instance i of the provided meta-data is an enhanced multi-frame
+ * data set, make it look like a series.
+ */
+ vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta, int i);
+
+ //! Copy constructor.
+ vtkDICOMMetaDataAdapter(const vtkDICOMMetaDataAdapter&);
+
//! Destructor release the reference to the meta data.
~vtkDICOMMetaDataAdapter();
+ //@}
+ //@{
//! Get the number of instances (i.e. files).
/*!
* For an enhanced multi-frame data set, this will return the
@@ -45,7 +64,9 @@ public:
* the number of instances in the series.
*/
int GetNumberOfInstances() const { return this->NumberOfInstances; }
+ //@}
+ //@{
//! Check whether an attribute is present in the metadata.
/*!
* For an enhanced multi-frame data set, this will search the Shared
@@ -76,10 +97,20 @@ public:
* data set attributes.
*/
vtkDICOMTag ResolvePrivateTag(vtkDICOMTag ptag, const std::string& creator);
+ //@}
+ //@{
//! Make the adapter look like a pointer (for convenience).
const vtkDICOMMetaDataAdapter* operator->() const { return this; }
vtkDICOMMetaDataAdapter* operator->() { return this; }
+ //@}
+
+ //! Copy constructor.
+ vtkDICOMMetaDataAdapter& operator=(const vtkDICOMMetaDataAdapter&);
+
+protected:
+ //! Helper function for the constructors. Set all members.
+ void ConstructionHelper(vtkDICOMMetaData *meta, int i);
private:
@@ -88,6 +119,7 @@ private:
const vtkDICOMValue *Shared;
vtkDICOMValue *NullValue;
int NumberOfInstances;
+ int MetaInstance;
};
#endif /* vtkDICOMMetaDataAdapter_h */
diff --git a/Source/vtkDICOMParser.cxx b/Source/vtkDICOMParser.cxx
index f82dc6f..dd4cde4 100644
--- a/Source/vtkDICOMParser.cxx
+++ b/Source/vtkDICOMParser.cxx
@@ -153,14 +153,14 @@ private:
const vtkDICOMValue& DecoderContext::GetAttributeValue(vtkDICOMTag tag)
{
if (this->Item)
- {
+ {
return this->Item->GetAttributeValue(tag);
- }
+ }
else
- {
+ {
int idx = (this->Index == -1 ? 0 : this->Index);
return this->MetaData->GetAttributeValue(idx, tag);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -168,26 +168,26 @@ vtkDICOMCharacterSet DecoderContext::GetCharacterSet()
{
vtkDICOMCharacterSet cs = this->CharacterSet;
if (cs == vtkDICOMCharacterSet::Unknown)
- {
+ {
const vtkDICOMValue& v =
this->GetAttributeValue(DC::SpecificCharacterSet);
if (v.IsValid())
- {
+ {
cs = vtkDICOMCharacterSet(v.GetCharData(), v.GetVL());
- }
+ }
else if (this->Prev)
- {
+ {
cs = this->Prev->GetCharacterSet();
- }
+ }
else
- {
+ {
cs = vtkDICOMCharacterSet::ISO_IR_6;
- }
+ }
if (this->CurrentTag > DC::SpecificCharacterSet)
- {
+ {
this->CharacterSet = cs;
- }
}
+ }
return cs;
}
@@ -197,26 +197,26 @@ vtkDICOMVR DecoderContext::GetVRForXS()
{
vtkDICOMVR vr = this->VRForXS;
if (vr == vtkDICOMVR::XX)
- {
+ {
const vtkDICOMValue& v =
this->GetAttributeValue(DC::PixelRepresentation);
if (v.IsValid())
- {
+ {
vr = (v.AsUnsignedShort() == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS);
- }
+ }
else if (this->Prev)
- {
+ {
vr = this->Prev->GetVRForXS();
- }
+ }
else
- {
+ {
vr = vtkDICOMVR::US;
- }
+ }
if (this->CurrentTag > DC::PixelRepresentation)
- {
+ {
this->VRForXS = vr;
- }
}
+ }
return vr;
}
@@ -226,42 +226,42 @@ vtkDICOMVR DecoderContext::FindDictVR(vtkDICOMTag tag)
vtkDICOMVR vr = vtkDICOMVR::UN;
if (tag.GetElement() == 0x0000)
- {
+ {
// this is a group length element, which has VR of "UL"
vr = vtkDICOMVR::UL;
- }
+ }
else if ((tag.GetGroup() & 0x1) != 0 &&
tag.GetElement() >= 0x0010 && tag.GetElement() < 0x0100)
- {
+ {
// this is a private creator tag
vr = vtkDICOMVR::LO;
- }
+ }
else
- {
+ {
vtkDICOMDictEntry de;
if ((tag.GetGroup() & 0x1) == 0)
- {
+ {
de = vtkDICOMDictionary::FindDictEntry(tag);
- }
+ }
else if (this->Item)
- {
+ {
de = this->Item->FindDictEntry(tag);
- }
+ }
else if (this->MetaData)
- {
+ {
de = this->MetaData->FindDictEntry(tag);
- }
+ }
if (de.IsValid())
- {
+ {
vr = de.GetVR();
if (vr == vtkDICOMVR::XS)
- {
+ {
// disambiguate tags that may be either "US" or "SS"
this->CurrentTag = tag;
vr = this->GetVRForXS();
- }
+ }
else if (vr == vtkDICOMVR::OX)
- {
+ {
// disambiguate tags that may be either "OB" or "OW"
vr = vtkDICOMVR::OW;
vtkDICOMTag reftag = (tag.GetGroup() == 0x5400 ?
@@ -269,12 +269,12 @@ vtkDICOMVR DecoderContext::FindDictVR(vtkDICOMTag tag)
DC::BitsAllocated);
const vtkDICOMValue& v = this->GetAttributeValue(reftag);
if (v.IsValid() && v.AsUnsignedShort() <= 8)
- {
+ {
vr = vtkDICOMVR::OB;
- }
}
}
}
+ }
return vr;
}
@@ -348,7 +348,7 @@ public:
// Get the last tag that was read.
vtkDICOMTag GetLastTag() { return this->LastTag; }
- // Get the VR of the last data element.
+ // Get the VR of the last data element (invalid if implicit)
vtkDICOMVR GetLastVR() { return this->LastVR; }
// Get the VL of the last data element.
@@ -506,10 +506,10 @@ public:
unsigned short g = 0;
unsigned short e = 0;
if (this->CheckBuffer(cp, ep, 4))
- {
+ {
g = Decoder<E>::GetInt16(cp);
e = Decoder<E>::GetInt16(cp + 2);
- }
+ }
return vtkDICOMTag(g, e);
}
@@ -593,18 +593,18 @@ void DecoderBase::SetQuery(
const vtkDICOMDataElementIterator& iterEnd)
{
if (iter != iterEnd)
- {
+ {
this->HasQuery = true;
this->QueryMatched = true;
this->Query = iter;
this->QueryEnd = iterEnd;
this->QuerySave = iter;
- }
+ }
else
- {
+ {
this->HasQuery = false;
this->QueryMatched = false;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -613,12 +613,12 @@ inline void DecoderBase::CopyBuffer(
{
// append bytes from sp to cp into the supplied value "v"
if (v && cp != sp)
- {
+ {
size_t m = cp - sp;
size_t n = v->GetNumberOfValues();
unsigned char *ptr = v->ReallocateUnsignedCharData(n + m) + n;
do { *ptr++ = *sp++; } while (--m);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -627,11 +627,11 @@ inline bool DecoderBase::CheckBuffer(
{
bool r = true;
if (n > static_cast<size_t>(ep - cp))
- {
+ {
r = vtkDICOMParserInternalFriendship::FillBuffer(
this->Parser, cp, ep);
r &= (n <= static_cast<size_t>(ep - cp));
- }
+ }
return r;
}
@@ -641,13 +641,13 @@ inline bool DecoderBase::CheckBuffer(
{
bool r = true;
if (n > static_cast<size_t>(ep - cp))
- {
+ {
this->CopyBuffer(v, sp, cp);
r = vtkDICOMParserInternalFriendship::FillBuffer(
this->Parser, cp, ep);
r &= (n <= static_cast<size_t>(ep - cp));
sp = cp;
- }
+ }
return r;
}
@@ -668,28 +668,28 @@ void DecoderBase::HandleMissingAttributes(vtkDICOMTag tag)
--iter;
if (iter->GetTag() != this->LastWrittenTag &&
iter->GetTag().GetGroup() != 0x0002)
- {
+ {
int count = 0;
do
- {
+ {
count++;
--iter;
- }
+ }
while (iter->GetTag() != this->LastWrittenTag &&
iter->GetTag().GetGroup() != 0x0002);
vtkDICOMTag *missing = new vtkDICOMTag[count];
for (int i = 0; i < count; i++)
- {
+ {
missing[i] = (++iter)->GetTag();
- }
+ }
for (int i = 0; i < count; i++)
- {
+ {
this->MetaData->SetAttributeValue(
this->Index, missing[i], vtkDICOMValue());
- }
- delete [] missing;
}
+ delete [] missing;
+ }
this->LastWrittenTag = tag;
}
@@ -698,7 +698,7 @@ void DecoderBase::AdvanceQueryIterator(vtkDICOMTag tag)
{
// advance the query iterator to the given tag
while (this->Query != this->QueryEnd && this->Query->GetTag() < tag)
- {
+ {
// for query keys that weren't in the data set, only match if:
// 1) the key is SpecificCharacterSet (not used for matching), or
// 2) the key is a group length element (gggg,0000)
@@ -707,60 +707,60 @@ void DecoderBase::AdvanceQueryIterator(vtkDICOMTag tag)
vtkDICOMTag qtag = this->Query->GetTag();
if (qtag != DC::SpecificCharacterSet && qtag.GetElement() != 0 &&
((qtag.GetGroup() & 1) == 0 || qtag.GetElement() > 0x00ff))
- {
+ {
vtkDICOMValue nullValue;
bool matched = nullValue.Matches(this->Query->GetValue());
// if query tag is private, need additional checks
if (!matched && (qtag.GetGroup() & 1) != 0)
- {
+ {
// compute creator tag, and search for it
vtkDICOMTag ctag =
vtkDICOMTag(qtag.GetGroup(), qtag.GetElement() >> 8);
vtkDICOMDataElementIterator iter = this->QuerySave;
while (iter != this->QueryEnd && iter->GetTag() < ctag)
- {
+ {
++iter;
- }
+ }
if (iter != this->QueryEnd && iter->GetTag() == ctag)
- {
+ {
// if we already read the element, we already checked whether it
// but if we didn't read it, then it doesn't exist, so don't match
if (this->Item)
- {
+ {
vtkDICOMTag ptag = this->Item->ResolvePrivateTag(
qtag, iter->GetValue().AsString());
matched = (ptag != vtkDICOMTag(0xffff,0xffff) &&
this->Item->GetAttributeValue(ptag).IsValid());
- }
+ }
else
- {
+ {
vtkDICOMTag ptag = this->MetaData->ResolvePrivateTag(
qtag, iter->GetValue().AsString());
matched = (ptag != vtkDICOMTag(0xffff,0xffff) &&
this->MetaData->HasAttribute(ptag));
- }
}
+ }
else
- {
+ {
// query has a private tag with no creator!
if (this->Item)
- {
+ {
matched = this->Item->GetAttributeValue(qtag).Matches(
this->Query->GetValue());
- }
+ }
else
- {
+ {
matched = this->MetaData->GetAttributeValue(qtag).Matches(
this->Query->GetValue());
- }
}
}
+ }
this->QueryMatched &= matched;
- }
- ++this->Query;
}
+ ++this->Query;
+ }
}
//----------------------------------------------------------------------------
@@ -768,13 +768,13 @@ bool DecoderBase::QueryContains(vtkDICOMTag tag)
{
// if the tag isn't private
if ((tag.GetGroup() & 1) == 0)
- {
+ {
// advance the query iterator until the tag is found in the query
this->AdvanceQueryIterator(tag);
// return true if the tag exists in the query
return (this->Query != this->QueryEnd && this->Query->GetTag() == tag);
- }
+ }
// the remainder of this function handles private tags
unsigned short g = tag.GetGroup();
@@ -787,57 +787,57 @@ bool DecoderBase::QueryContains(vtkDICOMTag tag)
// save the query iterator
if (this->QuerySave->GetTag() < gtag)
- {
+ {
this->QuerySave = this->Query;
- }
+ }
// if query doesn't contain any more keys in this group, return
vtkDICOMDataElementIterator iter = this->Query;
if (iter == this->QueryEnd || iter->GetTag().GetGroup() != g)
- {
+ {
return false;
- }
+ }
// if this is a creator element (e is 0x00XX), return true
if (e >= 0x0010 && e <= 0x00FF)
- {
+ {
return true;
- }
+ }
// search for the creator element within the query
vtkDICOMTag ctag = vtkDICOMTag(g, e >> 8);
vtkDICOMValue creator = this->Context->GetAttributeValue(ctag);
if (creator.IsValid())
- {
+ {
// maximum possible creator element is (gggg,00FF)
gtag = vtkDICOMTag(g, 0x00FF);
while (iter != this->QueryEnd && iter->GetTag() <= gtag)
- {
+ {
if (iter->GetValue().Matches(creator))
- {
+ {
tag = vtkDICOMTag(
g, (iter->GetTag().GetElement() << 8) | (e & 0x00FF));
break;
- }
- ++iter;
}
+ ++iter;
+ }
// if creator not found in query, tag obviously won't be found
if (iter == this->QueryEnd || iter->GetTag() > gtag)
- {
+ {
return false;
- }
}
+ }
// finally, look for the private tag at its resolved location
while (iter != this->QueryEnd && iter->GetTag() < tag)
- {
+ {
++iter;
- }
+ }
if (iter != this->QueryEnd && iter->GetTag() == tag)
- {
+ {
this->Query = iter;
return true;
- }
+ }
return false;
}
@@ -849,34 +849,34 @@ bool DecoderBase::QueryMatches(const vtkDICOMValue& v)
vtkDICOMTag tag = this->Query->GetTag();
if (v.GetVR() != vtkDICOMVR::SQ)
- {
+ {
// a query match is always true for SpecificCharacterSet, because this
// element exists to describe the character encoding of the query, not
// because it is to be matched.
if (tag != DC::SpecificCharacterSet && tag.GetElement() != 0 &&
((tag.GetGroup() & 1) == 0 || tag.GetElement() > 0x00ff))
- {
+ {
// if above conditions don't apply, check if the query key matches
matched = v.Matches(this->Query->GetValue());
- }
}
+ }
else
- {
+ {
// if VR is SQ, then the matching was done when the sequence items were
// parsed, and we just have to return the current value of QueryMatched
matched = this->QueryMatched;
- }
+ }
if ((tag.GetGroup() & 1) == 0)
- {
+ {
// advance the query iterator
++this->Query;
- }
+ }
else
- {
+ {
// if private, restore to the start of the private group
this->Query = this->QuerySave;
- }
+ }
return matched;
}
@@ -885,9 +885,9 @@ bool DecoderBase::QueryMatches(const vtkDICOMValue& v)
bool DecoderBase::FinishQuery()
{
if (this->HasQuery && this->QueryMatched)
- {
+ {
this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff));
- }
+ }
return this->QueryMatched;
}
@@ -984,11 +984,11 @@ void Decoder<E>::GetValues(
union { float f; unsigned int i; } u;
do
- {
+ {
u.i = Decoder<E>::GetInt32(ip);
*op++ = u.f;
ip += 4;
- }
+ }
while (--n);
}
@@ -999,11 +999,11 @@ void Decoder<E>::GetValues(
union { double d; unsigned long long l; } u;
do
- {
+ {
u.l = Decoder<E>::GetInt64(ip);
*op++ = u.d;
ip += 8;
- }
+ }
while (--n);
}
@@ -1012,12 +1012,12 @@ void Decoder<E>::GetValues(
const unsigned char *ip, vtkDICOMTag *op, size_t n)
{
do
- {
+ {
unsigned short g = Decoder<E>::GetInt16(ip);
unsigned short e = Decoder<E>::GetInt16(ip + 2);
*op++ = vtkDICOMTag(g, e);
ip += 4;
- }
+ }
while (--n);
}
@@ -1030,14 +1030,14 @@ size_t Decoder<E>::ReadData(
{
size_t l = n*sizeof(T);
while (n != 0 && this->CheckBuffer(cp, ep, sizeof(T)))
- {
+ {
size_t m = (ep - cp)/sizeof(T);
if (m > n) { m = n; }
Decoder<E>::GetValues(cp, ptr, m);
cp += m*sizeof(T);
ptr += m;
n -= m;
- }
+ }
return l - n*sizeof(T);
}
@@ -1051,12 +1051,12 @@ size_t Decoder<E>::SkipData(
size_t n = l;
while (n != 0 && this->CheckBuffer(cp, ep, 2))
- {
+ {
size_t m = ep - cp;
if (m > n) { m = n; }
cp += m;
n -= m;
- }
+ }
return l - n;
}
@@ -1070,51 +1070,52 @@ size_t Decoder<E>::ReadElementHead(
// basic size is 4 bytes
size_t l = 4;
- if (this->ImplicitVR)
- {
+ // sequence and item delimiters are always decoded as implicit
+ if (this->ImplicitVR || tag.GetGroup() == HxFFFE)
+ {
// implicit VR
- vr = this->Context->FindDictVR(tag);
vl = Decoder<E>::GetInt32(cp);
// ignore vl in group length tags, it is corrupt in some files
// and we know that it should always have a value of "4".
if (tag.GetElement() == 0x0000) { vl = 4; }
cp += 4;
- }
+ }
else
- {
+ {
// explicit VR
bool implicit = false;
vr = vtkDICOMVR(cp);
vl = Decoder<E>::GetInt16(cp + 2);
cp += 4;
if (!vr.IsValid())
- {
+ {
// invalid vr, try to get VR from dictionary instead
vr = this->Context->FindDictVR(tag);
- if (cp[-4] <= 0x20 || cp[-4] >= 0x7f ||
- cp[-3] <= 0x20 || cp[-3] >= 0x7f)
- {
- // if VR is not a graphical character within the default character
+ // check that vr was composed of reasonable chars
+ if (cp[-4] < 0x20 || cp[-4] >= 0x7f ||
+ cp[-3] < 0x20 || cp[-3] >= 0x7f)
+ {
+ // if VR is not a printable character within the default character
// set, assume implicit encoding for this particular element
implicit = true;
vl = Decoder<E>::GetInt32(cp - 4);
- }
}
+ }
if (!implicit && vr.HasLongVL())
- {
+ {
// for OB, OD, OF, OL, OW, SQ, UC, UN, UR, UT, and unrecognized
// check that buffer has 4 bytes for 32-bit VL
if (!this->CheckBuffer(cp, ep, 4))
- {
+ {
vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
"Unexpected end of file.");
return 0;
- }
+ }
vl = Decoder<E>::GetInt32(cp);
cp += 4;
l += 4;
- }
}
+ }
return l;
}
@@ -1129,144 +1130,144 @@ size_t Decoder<E>::ReadElementValue(
// handle elements of unknown length
if (vl == HxFFFFFFFF)
- {
+ {
if (vr == vtkDICOMVR::UN)
- {
+ {
// if VR is UN then it is a sequence encoded as implicit LE
// (see DICOM Part 5, Section 6.2.2, Unknown (UN) Value Representation
v.AllocateUnsignedCharData(vr, 0);
this->ImplicitLE->SkipElements(
cp, ep, vl, vtkDICOMTag(HxFFFE,HxE0DD), &v);
return v.GetNumberOfValues();
- }
+ }
else if (vr == vtkDICOMVR::OB)
- {
+ {
// make sure unknown length data is properly encapsulated
if (!this->CheckBuffer(cp, ep, 8))
- {
+ {
vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
"Unexpected end of file.");
return 0;
- }
+ }
unsigned short g1 = Decoder<E>::GetInt16(cp);
unsigned short e1 = Decoder<E>::GetInt16(cp + 2);
if (g1 != HxFFFE || (e1 != HxE000 && e1 != HxE0DD))
- {
+ {
vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
"Encapsulated object is missing (FFFE,E000) tag.");
return 0;
- }
+ }
v.AllocateUnsignedCharData(vr, 0);
this->SkipElements(
cp, ep, vl, vtkDICOMTag(HxFFFE,HxE0DD), &v);
return v.GetNumberOfValues();
- }
+ }
else if (vr != vtkDICOMVR::SQ)
- {
+ {
// only UN, OB, and SQ can have unknown length
vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
"Illegal item length FFFFFFFF encountered.");
return 0;
- }
}
+ }
else if (static_cast<size_t>(ep - cp) < static_cast<size_t>(vl))
- {
+ {
// value is larger than what remains in buffer,
// make sure there are enough bytes left in file
vtkTypeInt64 bytesRemaining =
vtkDICOMParserInternalFriendship::GetBytesRemaining(
this->Parser, cp, ep);
if (static_cast<vtkTypeInt64>(vl) > bytesRemaining)
- {
+ {
vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
"Item length exceeds the bytes remaining in file.");
return 0;
- }
}
+ }
switch (vr.GetType())
- {
+ {
case VTK_CHAR:
- {
+ {
char *ptr;
if (vr.HasSpecificCharacterSet() &&
this->LastTag > DC::SpecificCharacterSet)
- {
+ {
ptr = v.AllocateCharData(vr, this->Context->GetCharacterSet(), vl);
- }
+ }
else
- {
+ {
ptr = v.AllocateCharData(vr, vl);
- }
+ }
l = this->ReadData(cp, ep, ptr, vl);
// AllocateCharData makes room for terminal null
if (l == 0 || ptr[l-1] != '\0') { ptr[l] = '\0'; }
v.ComputeNumberOfValuesForCharData();
- }
break;
+ }
case VTK_UNSIGNED_CHAR:
- {
+ {
unsigned char *ptr = v.AllocateUnsignedCharData(vr, vl);
l = this->ReadData(cp, ep, ptr, vl);
- }
break;
+ }
case VTK_SHORT:
- {
+ {
unsigned int n = vl/sizeof(short);
short *ptr = v.AllocateShortData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_UNSIGNED_SHORT:
- {
+ {
unsigned int n = vl/sizeof(unsigned short);
unsigned short *ptr = v.AllocateUnsignedShortData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_INT:
- {
+ {
unsigned int n = vl/sizeof(int);
int *ptr = v.AllocateIntData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_UNSIGNED_INT:
- {
+ {
unsigned int n = vl/sizeof(unsigned int);
unsigned int *ptr = v.AllocateUnsignedIntData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_FLOAT:
- {
+ {
unsigned int n = vl/sizeof(float);
float *ptr = v.AllocateFloatData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_DOUBLE:
- {
+ {
unsigned int n = vl/sizeof(double);
double *ptr = v.AllocateDoubleData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_DICOM_TAG:
- {
+ {
unsigned int n = vl/sizeof(vtkDICOMTag);
vtkDICOMTag *ptr = v.AllocateTagData(vr, n);
l = this->ReadData(cp, ep, ptr, n);
- }
break;
+ }
case VTK_DICOM_ITEM:
- {
+ {
vtkDICOMTag tag = this->LastTag;
vtkDICOMSequence seq;
l = 0;
while (l < static_cast<size_t>(vl) || vl == HxFFFFFFFF)
- {
+ {
if (!this->CheckBuffer(cp, ep, 8)) { return l; }
unsigned short g = Decoder<E>::GetInt16(cp);
unsigned short e = Decoder<E>::GetInt16(cp + 2);
@@ -1275,19 +1276,19 @@ size_t Decoder<E>::ReadElementValue(
l += 8;
if (g == HxFFFE && e == HxE000)
- {
+ {
// read one item
- unsigned int offset = this->GetByteOffset(cp, ep) - 8;
+ size_t offset = this->GetByteOffset(cp, ep) - 8;
bool delimited = (il == HxFFFFFFFF);
vtkDICOMTag endtag(HxFFFE, HxE00D);
vtkDICOMItem item(this->Context->GetCharacterSet(),
this->Context->GetVRForXS(),
- delimited, offset);
+ delimited, static_cast<unsigned int>(offset));
DecoderContext context(&item);
this->PushContext(&context, tag);
if (this->HasQuery)
- {
+ {
assert(this->Query != this->QueryEnd);
// save the current query state before going one level deeper
@@ -1302,12 +1303,12 @@ size_t Decoder<E>::ReadElementValue(
if ((query->GetTag().GetGroup() & 1) == 0 &&
query->GetValue().GetNumberOfValues() > 0)
- {
+ {
// if query sequence isn't empty, set HasQuery to 'true' and
// use the sequence item as the new data set query
const vtkDICOMItem *qitems = query->GetValue().GetSequenceData();
if (qitems != 0 && qitems[0].GetNumberOfDataElements() != 0)
- {
+ {
this->HasQuery = true;
this->QueryMatched = true;
this->Query = qitems[0].Begin();
@@ -1316,16 +1317,16 @@ size_t Decoder<E>::ReadElementValue(
// initialize queryMatched to false at the start of seq
queryMatched &= (seq.GetNumberOfItems() > 0);
- }
}
+ }
this->ReadElements(cp, ep, il, endtag, l);
// check query keys up to the end of the item
if (this->HasQuery)
- {
+ {
this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff));
- }
+ }
// restore the query state
this->HasQuery = hasQuery;
@@ -1333,52 +1334,52 @@ size_t Decoder<E>::ReadElementValue(
this->Query = query;
this->QueryEnd = queryEnd;
this->QuerySave = querySave;
- }
+ }
else
- {
+ {
// if HasQuery is false, simply read the item
this->ReadElements(cp, ep, il, endtag, l);
- }
+ }
seq.AddItem(item);
this->PopContext();
- }
+ }
else if (g == HxFFFE && e == HxE0DD)
- {
+ {
// sequence delimiter found
break;
- }
+ }
else
- {
+ {
// non-item tag found, skip to end if vl is known
if (vl != HxFFFFFFFF)
- {
+ {
l += this->SkipData(cp, ep, static_cast<size_t>(vl) - l);
- }
- break;
}
+ break;
}
+ }
if (vl != HxFFFFFFFF)
- {
+ {
// if vl != 0xffffffff, then the sequence was fixed-size rather
// than delimited, so let's make our own fixed-size sequence and
// copy all of the items into it
- size_t n = seq.GetNumberOfItems();
+ unsigned int n = static_cast<unsigned int>(seq.GetNumberOfItems());
vtkDICOMSequence seq2(n);
- for (size_t i = 0; i < n; i++)
- {
+ for (unsigned int i = 0; i < n; i++)
+ {
seq2.SetItem(i, seq.GetItem(i));
- }
- seq = seq2;
}
+ seq = seq2;
+ }
v = seq;
// reset the tag and VR as we step out of the sequence
this->LastTag = tag;
this->LastVR = vr;
this->LastVL = vl;
- }
break;
}
+ }
return l;
}
@@ -1396,7 +1397,7 @@ bool Decoder<E>::ReadElements(
bool readGroup = (delimiter.GetElement() == 0x0000);
while (tl < static_cast<size_t>(l) || l == HxFFFFFFFF)
- {
+ {
// read the tag
if (!this->CheckBuffer(cp, ep, 8)) { break; }
unsigned short g = Decoder<E>::GetInt16(cp);
@@ -1416,6 +1417,9 @@ bool Decoder<E>::ReadElements(
// return false if could not read element
if (hl == 0) { return false; }
+ // if VR wasn't in the element head (e.g. implicit), use dictionary
+ if (!vr.IsValid()) { vr = this->Context->FindDictVR(tag); }
+
// save this as the most recent tag
this->LastTag = tag;
this->LastVR = vr;
@@ -1426,88 +1430,89 @@ bool Decoder<E>::ReadElements(
// skip the value if this tag is not in the query
if (this->HasQuery && !this->QueryContains(tag))
- {
+ {
if (vl != HxFFFFFFFF)
- {
+ {
// constant length item
tl = this->SkipData(cp, ep, vl);
if (tl != static_cast<size_t>(vl)) { return false; }
- }
+ }
else
- {
+ {
// if vl == 0xffffffff, the value is delimited
vtkDICOMTag newdelim(HxFFFE, HxE0DD);
if (tag == vtkDICOMTag(HxFFFE, HxE000))
- { // if tag is item tag, use item delimiter
+ { // if tag is item tag, use item delimiter
newdelim = vtkDICOMTag(HxFFFE, HxE00D);
- }
+ }
if (vr != vtkDICOMVR::UN)
- {
+ {
// Value is either a sequence or is encapsulated data
if (!this->SkipElements(cp, ep, vl, newdelim, NULL))
- {
+ {
return false;
- }
}
+ }
else
- {
+ {
// VR of UN indicates the value is an implicit LE sequence
if (!this->ImplicitLE->SkipElements(cp, ep, vl, newdelim, NULL))
- {
+ {
return false;
- }
}
}
- continue;
}
+ continue;
+ }
// read the value
vtkDICOMValue v;
size_t rl = 0;
if (vr == vtkDICOMVR::UN && !this->ImplicitVR)
- {
+ {
// if it was explicitly labeled 'UN' then check dictionary
vr = this->Context->FindDictVR(tag);
+ this->LastVR = vr; // save true VR, rather than recorded VR
rl = this->ImplicitLE->ReadElementValue(cp, ep, vr, vl, v);
- }
+ }
else
- {
+ {
rl = this->ReadElementValue(cp, ep, vr, vl, v);
- }
+ }
// was it a short read?
if (rl < static_cast<size_t>(vl) && vl != HxFFFFFFFF)
- {
+ {
size_t dl = static_cast<size_t>(vl) - rl;
// is the difference small, and not due to buffer underrun?
if (dl <= 8 && this->CheckBuffer(cp, ep, dl))
- {
+ {
// treat the difference as if it is padding
cp += dl;
rl = vl;
- }
+ }
else
- {
+ {
return false;
- }
}
+ }
tl += rl;
// store the value
if (this->Item)
- {
+ {
this->Item->SetAttributeValue(tag, v);
- }
+ }
else if (this->Index < 0)
- {
+ {
this->MetaData->SetAttributeValue(tag, v);
- }
+ }
else
- {
+ {
this->MetaData->SetAttributeValue(this->Index, tag, v);
this->HandleMissingAttributes(tag);
- }
+ }
/*
cout << tag << " " << vr << " " << vl << " " << v;
@@ -1521,16 +1526,16 @@ bool Decoder<E>::ReadElements(
// check if the value matches the query
if (this->HasQuery && !this->QueryMatches(v))
- {
+ {
this->QueryMatched = false;
- }
}
+ }
// if reading by group, advance the query to the next group
if (readGroup && this->HasQuery && this->QueryMatched)
- {
+ {
this->AdvanceQueryIterator(vtkDICOMTag(group+1, 0x0000));
- }
+ }
bytesRead += tl;
@@ -1544,7 +1549,7 @@ bool Decoder<E>::SkipElements(
unsigned int l, vtkDICOMTag delimiter, vtkDICOMValue *v)
{
if (l == HxFFFFFFFF)
- {
+ {
// save the current buffer position
const unsigned char *sp = cp;
@@ -1554,7 +1559,7 @@ bool Decoder<E>::SkipElements(
// skip until delimiter found
for (;;)
- {
+ {
if (!this->CheckBuffer(cp, ep, 8, v, sp)) { return false; }
unsigned short g = Decoder<E>::GetInt16(cp);
unsigned short e = Decoder<E>::GetInt16(cp + 2);
@@ -1563,50 +1568,14 @@ bool Decoder<E>::SkipElements(
if (readGroup && group != g) { break; }
cp += 4;
- size_t tl = 8;
+ vtkDICOMTag tag(g, e);
unsigned int vl = 0;
vtkDICOMVR vr;
- // sequence and item delimiters are always decoded as implicit
- if (g == HxFFFE || this->ImplicitVR)
- {
- vl = Decoder<E>::GetInt32(cp);
- // ignore vl in group length tags, it is corrupt in some files
- // and we know that it should always have a value of "4".
- if (e == 0x0000) { vl = 4; }
- cp += 4;
- }
- else
- {
- // explicit VR
- bool implicit = false;
- vr = vtkDICOMVR(cp);
- vl = Decoder<E>::GetInt16(cp + 2);
- cp += 4;
- if (!vr.IsValid())
- {
- // invalid vr, try to get VR from dictionary instead
- vr = this->Context->FindDictVR(vtkDICOMTag(g,e));
- // check that vr was composed of reasonable chars
- if (cp[-4] <= 0x20 || cp[-4] >= 0x7f ||
- cp[-3] <= 0x20 || cp[-3] >= 0x7f)
- {
- // assume an implicitly coded element slipped into the data
- implicit = true;
- vl = Decoder<E>::GetInt32(cp - 4);
- }
- }
- if (!implicit && vr.HasLongVL())
- {
- if (!this->CheckBuffer(cp, ep, 4, v, sp)) { return false; }
- vl = Decoder<E>::GetInt32(cp);
- cp += 4;
- tl += 4;
- }
- }
+ if (this->ReadElementHead(cp, ep, tag, vr, vl) == 0) { return false; }
// save this as the most recent tag
- this->LastTag = vtkDICOMTag(g, e);
+ this->LastTag = tag;
this->LastVR = vr;
this->LastVL = vl;
@@ -1614,7 +1583,7 @@ bool Decoder<E>::SkipElements(
if (!readGroup && this->LastTag == delimiter) { break; }
if (vl == HxFFFFFFFF)
- {
+ {
// copy data up to current buffer position
this->CopyBuffer(v, sp, cp);
sp = cp;
@@ -1622,32 +1591,32 @@ bool Decoder<E>::SkipElements(
// use sequence delimiter
vtkDICOMTag newdelim(HxFFFE, HxE0DD);
if (g == HxFFFE && e == HxE000)
- {
+ {
// use item delimiter
newdelim = vtkDICOMTag(HxFFFE, HxE00D);
- }
+ }
// skip internal segment until new delimiter found
if (vr != vtkDICOMVR::UN)
- {
+ {
if (!this->SkipElements(cp, ep, vl, newdelim, v))
- {
+ {
return false;
- }
}
+ }
// if VR is explicit UN, sequence is implicit LE
// (see DICOM Part 5, Section 6.2.2)
else if (!this->ImplicitLE->SkipElements(
cp, ep, vl, newdelim, v))
- {
+ {
return false;
- }
- sp = cp;
}
+ sp = cp;
+ }
else
- {
+ {
// fixed length element (vl != 0xffffffff)
if (v != 0 && static_cast<size_t>(vl) > static_cast<size_t>(ep - cp))
- {
+ {
// if vl is larger than number of bytes left in buffer,
// then copy data from save point "sp" up to "cp" into v,
// and read the value into "v".
@@ -1655,41 +1624,41 @@ bool Decoder<E>::SkipElements(
size_t n = v->GetNumberOfValues();
unsigned char *ptr = v->ReallocateUnsignedCharData(n + vl + m) + n;
if (m) { do { *ptr++ = *sp++; } while (--m); }
- tl = this->ReadData(cp, ep, ptr, vl);
+ size_t tl = this->ReadData(cp, ep, ptr, vl);
sp = cp;
if (tl != static_cast<size_t>(vl)) { return false; }
- }
+ }
else
- {
- tl = this->SkipData(cp, ep, vl);
+ {
+ size_t tl = this->SkipData(cp, ep, vl);
if (tl != static_cast<size_t>(vl)) { return false; }
- }
}
}
+ }
// the for(;;) loop is done, copy data from the save point sp
// up to current position cp into the value v
this->CopyBuffer(v, sp, cp);
- }
+ }
else if (l != 0) // l != 0xffffffff
- {
+ {
// skipped a fixed number of bytes
size_t tl;
if (v != 0)
- {
+ {
// read bytes into the value "v"
size_t n = v->GetNumberOfValues();
unsigned char *ptr = v->ReallocateUnsignedCharData(n + l) + n;
tl = this->ReadData(cp, ep, ptr, l);
if (tl != static_cast<size_t>(l)) { return false; }
- }
+ }
else
- {
+ {
// simply skip "l" bytes
tl = this->SkipData(cp, ep, l);
if (tl != static_cast<size_t>(l)) { return false; }
- }
}
+ }
return true;
}
@@ -1727,45 +1696,45 @@ vtkDICOMParser::~vtkDICOMParser()
delete this->QueryItem;
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
if (this->Query)
- {
+ {
this->Query->Delete();
- }
+ }
if (this->Groups)
- {
+ {
this->Groups->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMParser::SetQueryItem(const vtkDICOMItem& query)
{
if (this->Query)
- {
+ {
this->Query->Delete();
this->Query = 0;
- }
+ }
delete this->QueryItem;
this->QueryItem = 0;
if (query.GetNumberOfDataElements() > 0)
- {
+ {
this->QueryItem = new vtkDICOMItem(query);
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMParser::SetBufferSize(int size)
{
if (this->BufferSize != size)
- {
+ {
if (size < 256) { size = 256; }
if (size > (2147483647 - 8)) { size = (2147483647 - 8); }
this->BufferSize = size;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -1778,15 +1747,15 @@ void vtkDICOMParser::Update()
if (this->MetaData &&
this->MetaData->GetNumberOfDataElements() > 0 &&
this->MetaData->GetNumberOfInstances() > 1)
- {
+ {
idx = this->Index;
- }
+ }
this->ReadFile(this->MetaData, idx);
if (this->MetaData)
- {
+ {
this->MetaData->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -1800,29 +1769,29 @@ bool vtkDICOMParser::ReadFile(vtkDICOMMetaData *data, int idx)
// Check that the file name has been set.
if (!this->FileName)
- {
+ {
this->SetErrorCode(vtkErrorCode::NoFileNameError);
vtkErrorMacro("ReadFile: No file name has been set");
return false;
- }
+ }
// Make sure that the file is readable.
vtkDICOMFile infile(this->FileName, vtkDICOMFile::In);
if (infile.GetError())
- {
+ {
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
const char *errText = "Can't open the file ";
if (infile.GetError() == vtkDICOMFile::AccessDenied)
- {
+ {
errText = "No permission to read the file ";
- }
- else if (infile.GetError() == vtkDICOMFile::IsDirectory)
- {
+ }
+ else if (infile.GetError() == vtkDICOMFile::FileIsDirectory)
+ {
errText = "The selected file is a directory ";
- }
+ }
vtkErrorMacro("ReadFile: " << errText << this->FileName);
return false;
- }
+ }
this->InputFile = &infile;
this->FileSize = infile.GetSize();
@@ -1837,16 +1806,16 @@ bool vtkDICOMParser::ReadFile(vtkDICOMMetaData *data, int idx)
if (ep - cp >= 132 &&
cp[128] == 'D' && cp[129] == 'I' && cp[130] == 'C' && cp[131] == 'M')
- {
+ {
// DICM magic number at offset 128, where it belongs in DICOM
cp += 132;
- }
+ }
else if (ep - cp >= 4 &&
cp[0] == 'D' && cp[1] == 'I' && cp[2] == 'C' && cp[3] == 'M')
- {
+ {
// DICM magic number at beginning of file, where it doesn't belong
cp += 4;
- }
+ }
this->ReadMetaHeader(cp, ep, data, idx);
this->ReadMetaData(cp, ep, data, idx);
@@ -1865,10 +1834,10 @@ bool vtkDICOMParser::ReadMetaHeader(
{
bool tempMeta = false;
if (meta == 0)
- {
+ {
meta = vtkDICOMMetaData::New();
tempMeta = true;
- }
+ }
LittleEndianDecoder decoder(this, meta, idx);
@@ -1880,34 +1849,34 @@ bool vtkDICOMParser::ReadMetaHeader(
// verify that this is the right tag
if (g == 0x0002)
- {
+ {
// check for strange files with implicit VR meta header
decoder.SetImplicitVR(!vr.IsValid());
unsigned int l = HxFFFFFFFF;
if (e == 0x0000 && vl == 4)
- {
+ {
// get length from tag 0x0002,0x0000
l = Decoder<LE>::GetInt32(cp + 8) + 12;
- }
+ }
decoder.ReadElements(cp, ep, l, vtkDICOMTag(g,0));
int i = (idx == -1 ? 0 : idx);
this->TransferSyntax =
meta->GetAttributeValue(i, DC::TransferSyntaxUID).AsString();
- }
+ }
else
- {
+ {
this->TransferSyntax = "";
- }
+ }
this->FileOffset = this->GetBytesProcessed(cp, ep);
if (tempMeta)
- {
+ {
meta->Delete();
- }
+ }
return true;
}
@@ -1924,131 +1893,131 @@ bool vtkDICOMParser::ReadMetaData(
// make sure there is at least one data element
if (ep - cp < 8)
- {
+ {
this->FillBuffer(cp, ep);
if (ep - cp < 8)
- {
+ {
return false;
- }
}
+ }
std::string &tsyntax = this->TransferSyntax;
if (tsyntax == "") // try to guess the syntax
- {
+ {
if (!decoder->CheckBuffer(cp, ep, 8)) { return false; }
if (cp[0] == 0x00 && cp[1] == 0x08)
- {
+ {
tsyntax = "1.2.840.10008.1.2.2";
decoder = &decoderBE;
- }
- decoder->SetImplicitVR(!vtkDICOMVR(cp + 4).IsValid());
}
+ decoder->SetImplicitVR(!vtkDICOMVR(cp + 4).IsValid());
+ }
else if (tsyntax == "1.2.840.10008.1.2" || // Implicit LE
tsyntax == "1.2.840.10008.1.20" || // Papyrus Implicit LE
tsyntax == "1.2.840.113619.5.2") // GE Implicit LE
- {
+ {
decoder->SetImplicitVR(true);
- }
+ }
else if (tsyntax == "1.2.840.10008.1.2.2") // Explicit BE
- {
+ {
decoder = &decoderBE;
- }
+ }
// get the Query
vtkDICOMDataElementIterator iter;
vtkDICOMDataElementIterator iterEnd;
bool hasQuery = false;
if (this->Query)
- {
+ {
hasQuery = true;
iter = this->Query->Begin();
iterEnd = this->Query->End();
- }
+ }
else if (this->QueryItem)
- {
+ {
hasQuery = true;
iter = this->QueryItem->Begin();
iterEnd = this->QueryItem->End();
- }
+ }
if (hasQuery)
- {
+ {
// skip any elements in groups less than 0002
while (iter != iterEnd && iter->GetTag().GetGroup() < 0x0002)
- {
+ {
++iter;
- }
+ }
if (iter->GetTag() == vtkDICOMTag(0x0002,0x0000))
- {
+ {
// if FileMetaInformationGroupLength is set, assume that the
// query was read from a file and that we don't actually want
// to query the meta header
while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002)
- {
+ {
++iter;
- }
}
+ }
else
- {
+ {
// check the query against the meta header, which was already read
bool matched = true;
vtkDICOMDataElementIterator metaIter = meta->Begin();
vtkDICOMDataElementIterator metaEnd = meta->End();
while (metaIter != metaEnd && iter != iterEnd &&
iter->GetTag().GetGroup() <= 0x0002)
- {
+ {
if (metaIter->GetTag() == iter->GetTag())
- {
+ {
matched &= metaIter->GetValue(this->Index).Matches(iter->GetValue());
++iter;
++metaIter;
- }
+ }
else if (metaIter->GetTag() < iter->GetTag())
- {
+ {
++metaIter;
- }
+ }
else
- {
+ {
// this is a mismatch unless the query key is for universal matching
vtkDICOMValue nullValue;
matched &= nullValue.Matches(iter->GetValue());
++iter;
- }
}
- this->QueryMatched &= matched;
}
+ this->QueryMatched &= matched;
+ }
// set the query for the decoder so it can scan the rest of the file
decoder->SetQuery(iter, iterEnd);
- }
+ }
// make a list of the groups of interest
std::vector<unsigned short> groups;
if (hasQuery)
- {
+ {
unsigned short lastg = 0;
while (iter != iterEnd)
- {
+ {
unsigned short g = iter->GetTag().GetGroup();
if (g > lastg)
- {
+ {
lastg = g;
groups.push_back(g);
- }
- ++iter;
}
+ ++iter;
}
+ }
else if (this->Groups)
- {
+ {
vtkIdType n = this->Groups->GetNumberOfTuples();
for (vtkIdType i = 0; i < n; i++)
- {
+ {
groups.push_back(this->Groups->GetValue(i));
- }
+ }
std::sort(groups.begin(),groups.end());
groups.erase(std::unique(groups.begin(),groups.end()), groups.end());
- }
+ }
// iterator for going through the groups to read
std::vector<unsigned short>::iterator giter = groups.begin();
@@ -2060,7 +2029,7 @@ bool vtkDICOMParser::ReadMetaData(
bool bailOnQueryFailure = (meta && meta->GetNumberOfInstances() == 1);
while (!foundPixelData && !readFailure &&
(!queryFailure || !bailOnQueryFailure))
- {
+ {
vtkDICOMTag tag = decoder->Peek(cp, ep);
// if there is no data left to decode, then break
@@ -2069,13 +2038,13 @@ bool vtkDICOMParser::ReadMetaData(
// do we want to read or skip this group?
bool found = true;
if (!groups.empty())
- {
+ {
while (giter != groups.end() && *giter < tag.GetGroup())
- {
+ {
++giter;
- }
- found = (giter != groups.end() && *giter == tag.GetGroup());
}
+ found = (giter != groups.end() && *giter == tag.GetGroup());
+ }
// create a delimiter to read/skip only this group
vtkDICOMTag delimiter(tag.GetGroup(), 0);
@@ -2083,30 +2052,30 @@ bool vtkDICOMParser::ReadMetaData(
// check for PixelData group 0x7fe0, or obsolete 0x7fxx
unsigned int l = HxFFFFFFFF;
if ((tag.GetGroup() & 0xff01) == 0x7f00)
- {
+ {
if (tag.GetElement() == 0x0000)
- {
+ {
// have to read "group length" before pixel data
l = 12;
- }
+ }
else
- {
+ {
// set delimiter to pixel data tag
delimiter = tag;
foundPixelData = true;
- }
}
+ }
if (found && meta)
- {
+ {
readFailure = !decoder->ReadElements(cp, ep, l, delimiter);
queryFailure = (hasQuery && !decoder->GetQueryMatched());
- }
+ }
else
- {
+ {
readFailure = !decoder->SkipElements(cp, ep, l, delimiter);
- }
}
+ }
vtkDICOMTag lastTag = decoder->GetLastTag();
this->FileOffset = this->GetBytesProcessed(cp, ep);
@@ -2116,24 +2085,35 @@ bool vtkDICOMParser::ReadMetaData(
this->PixelDataVL = 0;
if (meta && this->PixelDataFound)
- {
+ {
// the last tag read will be PixelData (or an equivalent), and we
// want to add it as an empty attribute because we did not read its
// value (the FileOffset was saved so it can be read later)
unsigned short x = 0;
- vtkDICOMValue v(decoder->GetLastVR(), &x, x);
+ vtkDICOMVR lastVR = decoder->GetLastVR();
+ if (!lastVR.IsValid())
+ {
+ lastVR = vtkDICOMVR::OW;
+ const vtkDICOMValue& ba =
+ meta->GetAttributeValue(idx, DC::BitsAllocated);
+ if (ba.IsValid() && ba.AsUnsignedInt() <= 8)
+ {
+ lastVR = vtkDICOMVR::OB;
+ }
+ }
+ vtkDICOMValue v(lastVR, &x, x);
this->PixelDataVL = decoder->GetLastVL();
if (idx >= 0)
- {
+ {
meta->SetAttributeValue(idx, lastTag, v);
decoder->HandleMissingAttributes(lastTag);
- }
+ }
else
- {
+ {
meta->SetAttributeValue(lastTag, v);
- }
}
+ }
return true;
}
@@ -2149,26 +2129,26 @@ bool vtkDICOMParser::FillBuffer(
// number of bytes to read
size_t nbytes = this->ChunkSize;
if (n != 0)
- {
+ {
// make sure read will not overflow the buffer
if (n > 8)
- {
+ {
nbytes -= (n - 8);
- }
+ }
// recycle unused buffer chars to head of buffer
do { *dp++ = *cp++; } while (--n);
- }
+ }
else if (this->InputFile->GetError())
- {
+ {
this->SetErrorCode(vtkErrorCode::UnknownError);
vtkErrorMacro("FillBuffer: error reading from file " << this->FileName);
return false;
- }
+ }
else if (this->InputFile->EndOfFile())
- {
+ {
// if buffer is drained, and eof, then done
return false;
- }
+ }
// read at most n bytes
n = this->InputFile->Read(dp, nbytes);
diff --git a/Source/vtkDICOMParser.h b/Source/vtkDICOMParser.h
index 137beaf..74217f9 100644
--- a/Source/vtkDICOMParser.h
+++ b/Source/vtkDICOMParser.h
@@ -44,18 +44,25 @@ public:
//! Print a summary of the contents of this object.
void PrintSelf(ostream& os, vtkIndent indent);
+ //@{
//! Set the file name.
vtkSetStringMacro(FileName);
vtkGetStringMacro(FileName);
+ //@}
+ //@{
//! Set the metadata object for storing the data elements.
void SetMetaData(vtkDICOMMetaData *);
vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
+ //@}
+ //@{
//! Set the instance index to use when storing metadata.
vtkSetMacro(Index, int);
int GetIndex() { return this->Index; }
+ //@}
+ //@{
//! Set a query. Only matching data will be retrieved.
/*!
* This can be used to scan a file for data that matches a given
@@ -64,7 +71,9 @@ public:
*/
void SetQuery(vtkDICOMMetaData *query);
vtkDICOMMetaData *GetQuery() { return this->Query; }
+ //@}
+ //@{
//! Set a query, using an item instead of vtkDICOMMetaData.
/*!
* This can be used to scan a file for data that matches a given
@@ -73,14 +82,18 @@ public:
* empty item.
*/
void SetQueryItem(const vtkDICOMItem& query);
+ //@}
+ //@{
//! Set specific metadata groups to read (obsolete).
/*!
* This method is obsolete, the SetQuery() method should be used instead.
*/
void SetGroups(vtkUnsignedShortArray *groups);
vtkUnsignedShortArray *GetGroups() { return this->Groups; }
+ //@}
+ //@{
//! This is true only if the file matched the query.
bool GetQueryMatched() { return this->QueryMatched; }
@@ -89,7 +102,9 @@ public:
//! Get the VL for the PixelData, will be 0xffffffff if compressed.
unsigned int GetPixelDataVL() { return this->PixelDataVL; }
+ //@}
+ //@{
//! Get the byte offset to the end of the metadata.
/*!
* After the metadata has been read, the file offset
@@ -100,6 +115,7 @@ public:
//! Get the total file length (only valid after Update).
vtkTypeInt64 GetFileSize() { return this->FileSize; }
+ //@{
//! Set the buffer size, the default is 8192 (8k).
/*!
* A larger buffer size results in fewer IO calls. The
@@ -107,12 +123,15 @@ public:
*/
void SetBufferSize(int size);
int GetBufferSize() { return this->BufferSize; }
+ //@}
+ //@{
//! Read the metadata from the file.
virtual void Update();
//! Get the error code.
unsigned long GetErrorCode() { return this->ErrorCode; }
+ //@}
protected:
vtkDICOMParser();
@@ -183,8 +202,8 @@ protected:
friend class vtkDICOMParserInternalFriendship;
private:
- vtkDICOMParser(const vtkDICOMParser&); // Not implemented.
- void operator=(const vtkDICOMParser&); // Not implemented.
+ vtkDICOMParser(const vtkDICOMParser&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMParser&) VTK_DELETE_FUNCTION;
};
#endif /* vtkDICOMParser_h */
diff --git a/Source/vtkDICOMReader.cxx b/Source/vtkDICOMReader.cxx
index 9a6f965..6124cd6 100644
--- a/Source/vtkDICOMReader.cxx
+++ b/Source/vtkDICOMReader.cxx
@@ -62,19 +62,25 @@
#include "gdcmImageReader.h"
#endif
-#include "vtksys/SystemTools.hxx"
-
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#define GetTupleValue GetTypedTuple
+#endif
+
vtkStandardNewMacro(vtkDICOMReader);
vtkCxxSetObjectMacro(vtkDICOMReader,Sorter,vtkDICOMSliceSorter);
//----------------------------------------------------------------------------
vtkDICOMReader::vtkDICOMReader()
{
+ this->AutoYBRToRGB = 1;
+ this->NeedsYBRToRGB = 0;
this->AutoRescale = 1;
this->NeedsRescale = 0;
this->RescaleSlope = 1.0;
@@ -126,41 +132,41 @@ vtkDICOMReader::~vtkDICOMReader()
#endif
if (this->Parser)
- {
+ {
this->Parser->Delete();
- }
+ }
if (this->Sorter)
- {
+ {
this->Sorter->Delete();
- }
+ }
if (this->FileOffsetArray)
- {
+ {
this->FileOffsetArray->Delete();
- }
+ }
if (this->FileIndexArray)
- {
+ {
this->FileIndexArray->Delete();
- }
+ }
if (this->FrameIndexArray)
- {
+ {
this->FrameIndexArray->Delete();
- }
+ }
if (this->StackIDs)
- {
+ {
this->StackIDs->Delete();
- }
+ }
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
if (this->PatientMatrix)
- {
+ {
this->PatientMatrix->Delete();
- }
+ }
if (this->MedicalImageProperties)
- {
+ {
this->MedicalImageProperties->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -170,33 +176,33 @@ void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "MetaData: ";
if (this->MetaData)
- {
+ {
os << this->MetaData << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "MedicalImageProperties: ";
if (this->MedicalImageProperties)
- {
+ {
os << this->MedicalImageProperties << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "Sorter: ";
if (this->Sorter)
- {
+ {
os << this->Sorter << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "DesiredStackID: "
<< (*this->DesiredStackID ? "(empty)" : this->DesiredStackID) << "\n";
@@ -219,19 +225,19 @@ void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "PatientMatrix:";
if (this->PatientMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "MemoryRowOrder: "
<< this->GetMemoryRowOrderAsString() << "\n";
@@ -241,17 +247,17 @@ void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent)
void vtkDICOMReader::SetDesiredStackID(const char *stackId)
{
if (stackId == 0)
- {
+ {
stackId = "";
- }
+ }
// the maximum length of a stackId is 16
if (strncmp(this->DesiredStackID, stackId, 16) != 0)
- {
+ {
strncpy(this->DesiredStackID, stackId, 16);
this->DesiredStackID[17] = '\0';
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -281,13 +287,13 @@ void vtkDICOMErrorSilencer::Execute(vtkObject *, unsigned long, void *)
void vtkDICOMReader::SetMemoryRowOrder(int order)
{
if (order >= 0 && order <= vtkDICOMReader::BottomUp)
- {
+ {
if (order != this->MemoryRowOrder)
- {
+ {
this->MemoryRowOrder = order;
this->Modified();
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -295,7 +301,7 @@ const char *vtkDICOMReader::GetMemoryRowOrderAsString()
{
const char *text = "";
switch (this->MemoryRowOrder)
- {
+ {
case vtkDICOMReader::FileNative:
text = "FileNative";
break;
@@ -305,7 +311,7 @@ const char *vtkDICOMReader::GetMemoryRowOrderAsString()
case vtkDICOMReader::BottomUp:
text = "BottomUp";
break;
- }
+ }
return text;
}
@@ -391,16 +397,16 @@ void vtkDICOMReader::NoSortFiles(vtkIntArray *files, vtkIntArray *frames)
frames->SetNumberOfComponents(1);
for (int i = 0; i < numFiles; i++)
- {
+ {
int numFrames = meta->GetAttributeValue(i, DC::NumberOfFrames).AsInt();
numFrames = (numFrames > 0 ? numFrames : 1);
for (int j = 0; j < numFrames; j++)
- {
+ {
files->InsertNextValue(i);
frames->InsertNextValue(j);
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -417,25 +423,25 @@ bool vtkDICOMReader::ValidateStructure(
vtkIdType numSlices = fileArray->GetNumberOfTuples();
if (numSlices != frameArray->GetNumberOfTuples() ||
numComponents != fileArray->GetNumberOfComponents())
- {
+ {
this->SetErrorCode(vtkErrorCode::FileFormatError);
vtkErrorMacro("Critical failure in file sorting!");
return false;
- }
+ }
for (vtkIdType i = 0; i < numSlices; i++)
- {
+ {
for (int j = 0; j < numComponents; j++)
- {
+ {
int fileIndex = fileArray->GetComponent(i, j);
int frameIndex = frameArray->GetComponent(i, j);
if (fileIndex < 0 || fileIndex >= numFiles)
- {
+ {
this->SetErrorCode(vtkErrorCode::FileFormatError);
vtkErrorMacro("File index " << fileIndex << " is out of range!");
return false;
- }
+ }
usedFiles[fileIndex]++;
@@ -444,13 +450,13 @@ bool vtkDICOMReader::ValidateStructure(
numFrames = (numFrames == 0 ? 1 : numFrames);
if (frameIndex < 0 || frameIndex >= numFrames)
- {
+ {
this->SetErrorCode(vtkErrorCode::FileFormatError);
vtkErrorMacro("Frame index " << frameIndex << " is out of range!");
return false;
- }
}
}
+ }
// The reader requires the following mandatory attributes
static const DC::EnumType imagePixelAttribs[] = {
@@ -464,65 +470,65 @@ bool vtkDICOMReader::ValidateStructure(
for (const DC::EnumType *tags = imagePixelAttribs;
*tags != DC::ItemDelimitationItem;
tags++)
- {
+ {
int firstValue = 0;
for (int fileIndex = 0; fileIndex < numFiles; fileIndex++)
- {
+ {
if (usedFiles[fileIndex] == 0) { continue; }
const char *errorText = 0;
vtkDICOMValue v = meta->GetAttributeValue(fileIndex, *tags);
int i = 1;
if (v.IsValid())
- {
+ {
i = v.AsInt();
- }
+ }
else if (*tags != DC::SamplesPerPixel)
- {
+ {
// Some ACR-NEMA files do not contain SamplesPerPixel, all
// other tags must be present
errorText = "Missing pixel info ";
- }
+ }
if (firstValue == 0)
- {
+ {
firstValue = i;
- }
+ }
else if (firstValue != i)
- {
+ {
errorText = "Inconsistent pixel info ";
- }
+ }
if (i <= 0 ||
(*tags == DC::BitsAllocated &&
i != 1 && i != 8 && i != 12 && i != 16 && i != 32 && i != 64))
- {
+ {
errorText = "Illegal value ";
- }
+ }
if (errorText)
- {
+ {
this->ComputeInternalFileName(this->DataExtent[4] + fileIndex);
this->Parser->SetFileName(this->InternalFileName);
vtkDICOMDictEntry de = meta->FindDictEntry(*tags);
this->SetErrorCode(vtkErrorCode::FileFormatError);
if (v.IsValid())
- {
+ {
vtkErrorMacro(<< errorText << i << " for " << de.GetTag()
<< " \"" << de.GetName() << "\" in "
<< this->InternalFileName);
- }
+ }
else
- {
+ {
vtkErrorMacro(<< errorText << "for " << de.GetTag()
<< " \"" << de.GetName() << "\" in"
<< this->InternalFileName);
- }
- return false;
}
+ return false;
}
}
+ }
return true;
}
@@ -538,35 +544,35 @@ int vtkDICOMReader::RequestInformation(
// How many files are to be loaded?
if (this->FileNames)
- {
+ {
vtkIdType numFileNames = this->FileNames->GetNumberOfValues();
this->DataExtent[4] = 0;
this->DataExtent[5] = static_cast<int>(numFileNames - 1);
- }
+ }
else if (this->FileName)
- {
+ {
this->DataExtent[4] = 0;
this->DataExtent[5] = 0;
- }
+ }
int numFiles = this->DataExtent[5] - this->DataExtent[4] + 1;
if (numFiles <= 0)
- {
+ {
this->SetErrorCode(vtkErrorCode::FileFormatError);
if (this->FileNames)
- {
+ {
vtkErrorMacro("No filenames were provided for reader.");
- }
+ }
else
- {
+ {
vtkErrorMacro("Bad DataExtent " << this->DataExtent[4]
<< "," << this->DataExtent[5] << ".");
- }
+ }
// Reset the data extent to legal values
this->DataExtent[4] = 0;
this->DataExtent[5] = 0;
- }
+ }
// Reset the time information
this->TimeDimension = 0;
@@ -575,15 +581,15 @@ int vtkDICOMReader::RequestInformation(
// Clear the meta data, prepare the parser.
this->MetaData->Initialize();
if (numFiles > 0)
- {
+ {
this->MetaData->SetNumberOfInstances(numFiles);
- }
+ }
if (this->Parser)
- {
+ {
this->Parser->Delete();
this->FileOffsetArray->Delete();
- }
+ }
// Parser reads just the meta data, not the pixel data.
this->Parser = vtkDICOMParser::New();
@@ -597,49 +603,49 @@ int vtkDICOMReader::RequestInformation(
this->FileOffsetArray->SetNumberOfTuples(numFiles);
for (int idx = 0; idx < numFiles; idx++)
- {
+ {
this->ComputeInternalFileName(this->DataExtent[4] + idx);
this->Parser->SetFileName(this->InternalFileName);
this->Parser->SetIndex(idx);
this->Parser->Update();
if (this->Parser->GetErrorCode())
- {
+ {
break;
- }
+ }
// save the offset to the pixel data
vtkTypeInt64 offset[2];
offset[0] = this->Parser->GetFileOffset();
offset[1] = this->Parser->GetFileSize();
this->FileOffsetArray->SetTupleValue(idx, offset);
- }
+ }
// Files are read in the order provided, but they might have
// to be re-sorted to create a proper volume. The FileIndexArray
// holds the sorted order of the files.
this->StackIDs->Initialize();
if (this->GetErrorCode() == vtkErrorCode::NoError)
- {
+ {
if (this->Sorting && this->Sorter)
- {
+ {
this->SortFiles(this->FileIndexArray, this->FrameIndexArray);
- }
+ }
else
- {
+ {
this->NoSortFiles(this->FileIndexArray, this->FrameIndexArray);
- }
+ }
// Verify the consistency of the data, e.g. verify that the dimensions
// and data type are the same for all files.
this->ValidateStructure(this->FileIndexArray, this->FrameIndexArray);
- }
+ }
if (this->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
// Last chance to bail out
return false;
- }
+ }
// Set the indexing arrays for the meta data
this->MetaData->SetFileIndexArray(this->FileIndexArray);
@@ -676,9 +682,9 @@ int vtkDICOMReader::RequestInformation(
// (the DataExtent gives the number of files)
this->FileDimensionality = 2;
if (slices > this->DataExtent[5] - this->DataExtent[4] + 1)
- {
+ {
this->FileDimensionality = 3;
- }
+ }
// DICOM uses a upper-left origin
this->FileLowerLeft = 0;
@@ -692,39 +698,39 @@ int vtkDICOMReader::RequestInformation(
vtkDICOMValue pixelAspectRatio = this->MetaData->GetAttributeValue(
fileIndex, frameIndex, DC::PixelAspectRatio);
if (pixelAspectRatio.GetNumberOfValues() == 2)
- {
+ {
// use double, even though data is stored as integer strings
double ya = pixelAspectRatio.GetDouble(0);
double xa = pixelAspectRatio.GetDouble(1);
if (xa > 0)
- {
+ {
ratio = ya/xa;
- }
}
+ }
else if (pixelAspectRatio.GetNumberOfValues() == 1)
- {
+ {
// ratio should be expressed as two values,
// so this is only to support incorrect files
ratio = pixelAspectRatio.AsDouble();
- }
+ }
if (ratio > 0)
- {
+ {
this->DataSpacing[0] = this->DataSpacing[1]/ratio;
- }
+ }
// Set spacing from PixelSpacing
vtkDICOMValue pixelSpacing = this->MetaData->GetAttributeValue(
fileIndex, frameIndex, DC::PixelSpacing);
if (pixelSpacing.GetNumberOfValues() == 2)
- {
+ {
double spacing[2];
pixelSpacing.GetValues(spacing, 2);
if (spacing[0] > 0 && spacing[1] > 0)
- {
+ {
this->DataSpacing[0] = spacing[0];
this->DataSpacing[1] = spacing[1];
- }
}
+ }
// offset is part of the transform, so set origin to zero
this->DataOrigin[0] = 0.0;
@@ -745,43 +751,43 @@ int vtkDICOMReader::RequestInformation(
int scalarType = 0;
if (bitsAllocated <= 8)
- {
+ {
scalarType = (pixelRepresentation ? VTK_SIGNED_CHAR : VTK_UNSIGNED_CHAR);
- }
+ }
else if (bitsAllocated <= 16)
- {
+ {
scalarType = (pixelRepresentation ? VTK_SHORT : VTK_UNSIGNED_SHORT);
- }
+ }
else if (bitsAllocated <= 32)
- {
+ {
if (this->MetaData->GetAttributeValue(
fileIndex, DC::FloatPixelData).IsValid())
- {
+ {
scalarType = VTK_FLOAT;
- }
+ }
else
- {
+ {
scalarType = (pixelRepresentation ? VTK_INT : VTK_UNSIGNED_INT);
- }
}
+ }
else if (bitsAllocated <= 64)
- {
+ {
if (this->MetaData->GetAttributeValue(
fileIndex, DC::DoubleFloatPixelData).IsValid())
- {
+ {
scalarType = VTK_DOUBLE;
- }
+ }
else
- {
+ {
scalarType = (pixelRepresentation ? VTK_TYPE_INT64: VTK_TYPE_UINT64);
- }
}
+ }
// number of components
if (numComponents <= 0)
- {
+ {
numComponents = 1;
- }
+ }
this->DataScalarType = scalarType;
this->NumberOfPackedComponents =
@@ -793,7 +799,7 @@ int vtkDICOMReader::RequestInformation(
// photometric interpretation
// "MONOCHROME1" "MONOCHROME2"
- // "PALETTE_COLOR" "RGB" (convert palette color to RGB)
+ // "PALETTE COLOR" "RGB" (convert palette color to RGB)
// "HSV" "ARGB" "CMYK" (all three are retired)
// "YBR_FULL" "YBR_FULL_422" (use CCIR 601-2 to convert to RGB)
// "YBR_PARTIAL_422" "YBR_PARTIAL_420" (use CCIR 601-2 to convert to RGB)
@@ -824,17 +830,17 @@ int vtkDICOMReader::RequestInformation(
fileIndex, frameIndex, DC::RescaleSlope).IsValid() &&
this->MetaData->GetAttributeValue(
fileIndex, frameIndex, DC::RescaleIntercept).IsValid())
- {
+ {
bool mismatch = false;
double mMax = VTK_DOUBLE_MIN;
double bMax = VTK_DOUBLE_MIN;
vtkIdType numSlices = this->FileIndexArray->GetNumberOfTuples();
for (vtkIdType iSlice = 0; iSlice < numSlices; iSlice++)
- {
+ {
int numComp = this->FileIndexArray->GetNumberOfComponents();
for (int iComp = 0; iComp < numComp; iComp++)
- {
+ {
int iFile = this->FileIndexArray->GetComponent(iSlice, iComp);
int iFrame = this->FrameIndexArray->GetComponent(iSlice, iComp);
@@ -843,23 +849,23 @@ int vtkDICOMReader::RequestInformation(
double b = this->MetaData->GetAttributeValue(
iFile, iFrame, DC::RescaleIntercept).AsDouble();
if ((iSlice != 0 || iComp != 0) && (m != mMax || b != bMax))
- {
+ {
mismatch = true;
- }
+ }
if (m > mMax)
- {
+ {
mMax = m;
- }
+ }
if (b > bMax)
- {
+ {
bMax = b;
- }
}
}
+ }
this->NeedsRescale = (mismatch && this->AutoRescale);
this->RescaleSlope = mMax;
this->RescaleIntercept = bMax;
- }
+ }
// === Image Orientation in DICOM files ===
//
@@ -878,7 +884,7 @@ int vtkDICOMReader::RequestInformation(
// go through the slices in reverse order, so we end on the first
for (vtkIdType iSlice = numSlices-1; iSlice >= 0; --iSlice)
- {
+ {
int iFile = this->FileIndexArray->GetComponent(iSlice, 0);
int iFrame = this->FrameIndexArray->GetComponent(iSlice, 0);
vtkDICOMValue pv = this->MetaData->GetAttributeValue(
@@ -886,23 +892,23 @@ int vtkDICOMReader::RequestInformation(
vtkDICOMValue ov = this->MetaData->GetAttributeValue(
fileIndex, frameIndex, DC::ImageOrientationPatient);
if (pv.GetNumberOfValues() == 3 && ov.GetNumberOfValues() == 6)
- {
+ {
pv.GetValues(point, 3);
ov.GetValues(orient, 6);
vtkMath::Cross(&orient[0], &orient[3], normal);
if (vtkMath::Normalize(normal) < 1e-10)
- {
+ {
orient[0] = 1.0; orient[1] = 0.0; orient[2] = 0.0;
orient[3] = 0.0; orient[4] = 1.0; orient[5] = 0.0;
normal[0] = 0.0; normal[1] = 0.0; normal[2] = 1.0;
- }
+ }
// re-orthogonalize x vector (improve precision)
vtkMath::Cross(&orient[3], normal, &orient[0]);
vtkMath::Normalize(&orient[0]);
vtkMath::Normalize(&orient[3]);
if (this->MemoryRowOrder == vtkDICOMReader::BottomUp)
- {
+ {
// calculate position of point at lower left
double yspacing = this->DataSpacing[1];
point[0] = point[0] + orient[3]*yspacing*(rows - 1);
@@ -912,23 +918,23 @@ int vtkDICOMReader::RequestInformation(
orient[3] = -orient[3];
orient[4] = -orient[4];
orient[5] = -orient[5];
- }
+ }
size_t ip = points.size();
points.resize(ip + 3);
for (int ii = 0; ii < 3; ii++)
- {
+ {
centroid[ii] += point[ii];
points[ip+ii] = point[ii];
- }
}
}
+ }
// compute Z vector by fitting points to a line
double vector[3] = { normal[0], normal[1], normal[2] };
size_t nPoints = points.size()/3;
if (nPoints > 0)
- {
+ {
centroid[0] /= nPoints;
centroid[1] /= nPoints;
centroid[2] /= nPoints;
@@ -938,27 +944,27 @@ int vtkDICOMReader::RequestInformation(
double *A[3] = { &storage[0], &storage[3], &storage[6] };
double *E[3] = { &storage[9], &storage[12], &storage[15] };
for (size_t iPoint = 0; iPoint < nPoints; iPoint++)
- {
+ {
for (int ii = 0; ii < 3; ii++)
- {
+ {
for (int jj = 0; jj < 3; jj++)
- {
+ {
A[ii][jj] = ((points[3*iPoint + ii] - centroid[ii]) *
(points[3*iPoint + jj] - centroid[jj]));
- }
}
}
+ }
double eigenvalues[3];
vtkMath::Jacobi(A, eigenvalues, E);
// only use eigenvector if the points fit a line very precisely
if (eigenvalues[1]*eigenvalues[1] + eigenvalues[2]*eigenvalues[2] <
1e-6*eigenvalues[0]*eigenvalues[0])
- {
+ {
// create the vector, dot(vector,normal) should be unity
double vdn = E[0][0]*normal[0] + E[1][0]*normal[1] + E[2][0]*normal[2];
if (vdn > 0)
- {
+ {
vector[0] = E[0][0]/vdn;
vector[1] = E[1][0]/vdn;
vector[2] = E[2][0]/vdn;
@@ -967,14 +973,14 @@ int vtkDICOMReader::RequestInformation(
double vcn[3];
vtkMath::Cross(vector, normal, vcn);
if (vtkMath::Norm(vcn) < 1e-4)
- {
+ {
// use normal (more precise) if they are the same
vector[0] = normal[0];
vector[1] = normal[1];
vector[2] = normal[2];
- }
}
}
+ }
// build the patient matrix
double pm[16];
@@ -984,17 +990,17 @@ int vtkDICOMReader::RequestInformation(
pm[12] = 0.0; pm[13] = 0.0; pm[14] = 0.0; pm[15] = 1.0;
this->PatientMatrix->DeepCopy(pm);
- }
+ }
else
- {
+ {
this->PatientMatrix->Identity();
- }
+ }
// Set the medical image properties
if (this->MedicalImageProperties)
- {
+ {
this->UpdateMedicalImageProperties();
- }
+ }
// Set the output information.
vtkInformation* outInfo = outputVector->GetInformationObject(0);
@@ -1023,24 +1029,24 @@ void vtkDICOMReaderRescaleBuffer(T *p, double m, double b, size_t bytecount)
{
size_t n = bytecount/sizeof(T);
if (n > 0 && (m != 1.0 || b != 0.0))
- {
+ {
double minval = vtkTypeTraits<T>::Min();
double maxval = vtkTypeTraits<T>::Max();
do
- {
+ {
double val = (*p)*m + b;
if (val < minval)
- {
+ {
val = minval;
- }
+ }
if (val > maxval)
- {
+ {
val = maxval;
- }
- *p++ = static_cast<T>(vtkMath::Round(val));
}
- while (--n);
+ *p++ = static_cast<T>(vtkMath::Round(val));
}
+ while (--n);
+ }
}
} // end anonymous namespace
@@ -1067,44 +1073,128 @@ void vtkDICOMReader::RescaleBuffer(
fileIdx, DC::PixelRepresentation).AsInt();
if (bitsAllocated <= 8)
- {
+ {
if (pixelRep == 0)
- {
+ {
vtkDICOMReaderRescaleBuffer(
static_cast<unsigned char *>(buffer), m, b, bufferSize);
- }
+ }
else
- {
+ {
vtkDICOMReaderRescaleBuffer(
static_cast<signed char *>(buffer), m, b, bufferSize);
- }
}
+ }
else if (bitsAllocated <= 16)
- {
+ {
if (pixelRep == 0)
- {
+ {
vtkDICOMReaderRescaleBuffer(
static_cast<unsigned short *>(buffer), m, b, bufferSize);
- }
+ }
else
- {
+ {
vtkDICOMReaderRescaleBuffer(
static_cast<short *>(buffer), m, b, bufferSize);
- }
}
+ }
else if (bitsAllocated <= 32)
- {
+ {
if (pixelRep == 0)
- {
+ {
vtkDICOMReaderRescaleBuffer(
static_cast<unsigned int *>(buffer), m, b, bufferSize);
- }
+ }
else
- {
+ {
vtkDICOMReaderRescaleBuffer(
static_cast<int *>(buffer), m, b, bufferSize);
- }
}
+ }
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMReader::YBRToRGB(
+ int fileIdx, int, void *buffer, vtkIdType bufferSize)
+{
+ // digital luminance levels and color levels from Rec. 601
+ const int ylevels = 220;
+ const int clevels = 225;
+
+ // the digital black level from Rec. 601
+ double ymin = 16.0;
+
+ // the color constants from Rec. 601
+ const double Kb = 0.114;
+ const double Kr = 0.299;
+ double Kg = 1.0 - Kb - Kr;
+
+ // compute the matrix for YPbPr to RGB conversion
+ double matrix[3][3] = {
+ { 1.0, 0.0, 2.0*(1.0-Kr) },
+ { 1.0, -2.0*Kb*(1.0-Kb)/Kg, -2.0*Kr*(1.0-Kr)/Kg },
+ { 1.0, 2.0*(1.0-Kb), 0.0 }
+ };
+
+ // get information from the meta data
+ vtkDICOMMetaData *meta = this->MetaData;
+ const vtkDICOMValue& photometric = meta->GetAttributeValue(
+ fileIdx, DC::PhotometricInterpretation);
+ const vtkDICOMValue& transferSyntax = meta->GetAttributeValue(
+ fileIdx, DC::TransferSyntaxUID);
+
+ // catch JPEG baseline images with incorrect PhotometricInterpretation
+ if (transferSyntax.Matches("1.2.840.10008.1.2.4.50") ||
+ photometric.Matches("YBR_FULL*"))
+ {
+ // use full-range, therefore black level is zero
+ ymin = 0.0;
+ }
+ else if (photometric.Matches("YBR_PARTIAL*"))
+ {
+ // stretch the matrix so that full-range RGB is produced
+ for (int i = 0; i < 3; i++)
+ {
+ matrix[i][0] *= 255.0/(ylevels - 1);
+ matrix[i][1] *= 255.0/(clevels - 1);
+ matrix[i][2] *= 255.0/(clevels - 1);
+ }
+ }
+ else
+ {
+ // no YBR here, so exit!
+ return;
+ }
+
+ if (bufferSize >= 3)
+ {
+ unsigned char *cp = static_cast<unsigned char *>(buffer);
+ vtkIdType n = bufferSize/3;
+ double ybr[3];
+ double rgb[3];
+ do
+ {
+ ybr[0] = cp[0] - ymin;
+ ybr[1] = cp[1] - 128.0;
+ ybr[2] = cp[2] - 128.0;
+
+ vtkMath::Multiply3x3(matrix, ybr, rgb);
+
+ rgb[0] = (rgb[0] >= 0.0 ? rgb[0] : 0.0);
+ rgb[0] = (rgb[0] <= 255.0 ? rgb[0] : 255.0);
+ rgb[1] = (rgb[1] >= 0.0 ? rgb[1] : 0.0);
+ rgb[1] = (rgb[1] <= 255.0 ? rgb[1] : 255.0);
+ rgb[2] = (rgb[2] >= 0.0 ? rgb[2] : 0.0);
+ rgb[2] = (rgb[2] <= 255.0 ? rgb[2] : 255.0);
+
+ cp[0] = static_cast<unsigned char>(vtkMath::Floor(rgb[0] + 0.5));
+ cp[1] = static_cast<unsigned char>(vtkMath::Floor(rgb[1] + 0.5));
+ cp[2] = static_cast<unsigned char>(vtkMath::Floor(rgb[2] + 0.5));
+
+ cp += 3;
+ }
+ while (--n);
+ }
}
//----------------------------------------------------------------------------
@@ -1112,13 +1202,13 @@ void vtkDICOMReader::UnpackBits(
const void *filePtr, void *buffer, vtkIdType bufferSize, int bits)
{
if (bits == 12)
- {
+ {
const unsigned char *readPtr =
static_cast<const unsigned char *>(filePtr);
unsigned char *writePtr =
static_cast<unsigned char *>(buffer);
for (vtkIdType n = bufferSize/2; n > 0; n -= 2)
- {
+ {
unsigned int a1 = readPtr[0];
unsigned int a2 = readPtr[1];
unsigned int b1 = (a1 << 4) | (a2 & 0x0f);
@@ -1134,36 +1224,36 @@ void vtkDICOMReader::UnpackBits(
readPtr += 3;
writePtr += 4;
- }
}
+ }
else if (bits == 1)
- {
+ {
const unsigned char *readPtr =
static_cast<const unsigned char *>(filePtr);
unsigned char *writePtr =
static_cast<unsigned char *>(buffer);
for (vtkIdType n = bufferSize/8; n > 0; n--)
- {
+ {
unsigned int a = *readPtr;
for (int i = 0; i < 8; i++)
- {
+ {
writePtr[i] = (a & 1);
a >>= 1;
- }
+ }
readPtr++;
writePtr += 8;
- }
+ }
size_t r = (bufferSize % 8);
if (r > 0)
- {
+ {
unsigned int a = *readPtr;
for (size_t j = 0; j < r; j++)
- {
+ {
writePtr[j] = static_cast<unsigned char>(a & 1);
a >>= 1;
- }
}
}
+ }
}
//----------------------------------------------------------------------------
@@ -1180,19 +1270,19 @@ bool vtkDICOMReader::ReadFileNative(
vtkDICOMFile infile(filename, vtkDICOMFile::In);
if (infile.GetError())
- {
+ {
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
vtkErrorMacro("ReadFile: Can't read the file " << filename);
return false;
- }
+ }
if (!infile.SetPosition(offset))
- {
+ {
this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError);
vtkErrorMacro("DICOM file is truncated, some data is missing.");
infile.Close();
return false;
- }
+ }
std::string transferSyntax = this->MetaData->GetAttributeValue(
fileIdx, DC::TransferSyntaxUID).AsString();
@@ -1209,7 +1299,7 @@ bool vtkDICOMReader::ReadFileNative(
size_t readSize = bufferSize;
size_t resultSize = 0;
if (transferSyntax == "1.2.840.10008.1.2.5")
- {
+ {
vtkDICOMImageCodec codec(transferSyntax);
unsigned int numFrames = this->MetaData->GetAttributeValue(
@@ -1220,9 +1310,9 @@ bool vtkDICOMReader::ReadFileNative(
readSize = static_cast<size_t>(
offsetAndSize[1] - offsetAndSize[0]);
if (readSize < 8)
- {
+ {
readSize = 8;
- }
+ }
unsigned char *rleBuffer = new unsigned char[readSize];
unsigned char *filePtr = rleBuffer;
resultSize = infile.Read(filePtr, readSize);
@@ -1231,7 +1321,7 @@ bool vtkDICOMReader::ReadFileNative(
vtkIdType frameSize = bufferSize/numFrames;
bool isOffsetTable = true;
while (bytesRemaining >= 8 && bufferPos < bufferSize)
- {
+ {
// get the item header
unsigned int tagkey = vtkDICOMUtilities::UnpackUnsignedInt(filePtr);
unsigned int length = vtkDICOMUtilities::UnpackUnsignedInt(filePtr + 4);
@@ -1239,31 +1329,31 @@ bool vtkDICOMReader::ReadFileNative(
bytesRemaining -= 8;
// make sure the tag is valid
if (tagkey != 0xE000FFFE)
- {
+ {
break;
- }
+ }
if (length > bytesRemaining)
- {
+ {
// actual file size should have been at least this much larger
readSize += length - bytesRemaining;
- length = bytesRemaining;
- }
+ length = static_cast<unsigned int>(bytesRemaining);
+ }
// first item is the offset table
if (!isOffsetTable)
- {
+ {
// unpack an RLE fragment
codec.Decode(this->MetaData,
filePtr, length, buffer + bufferPos, frameSize);
bufferPos += frameSize;
- }
+ }
filePtr += length;
bytesRemaining -= length;
isOffsetTable = false;
- }
- delete [] rleBuffer;
}
+ delete [] rleBuffer;
+ }
else if (bitsAllocated == 12)
- {
+ {
// unpack 12 bits little endian into 16 bits little endian,
// the result will have to be swapped if machine is BE (the
// swapping is done at the end of this function)
@@ -1272,9 +1362,9 @@ bool vtkDICOMReader::ReadFileNative(
resultSize = infile.Read(filePtr, readSize);
vtkDICOMReader::UnpackBits(filePtr, buffer, bufferSize, bitsAllocated);
- }
+ }
else if (bitsAllocated == 1)
- {
+ {
// unpack 1 bit into 8 bits, source assumed to be either OB
// or little endian OW, never big endian OW
readSize = (bufferSize + 7)/8;
@@ -1282,31 +1372,31 @@ bool vtkDICOMReader::ReadFileNative(
resultSize = infile.Read(filePtr, readSize);
vtkDICOMReader::UnpackBits(filePtr, buffer, bufferSize, bitsAllocated);
- }
+ }
else
- {
+ {
resultSize = infile.Read(buffer, readSize);
- }
+ }
bool success = true;
if (infile.EndOfFile() || resultSize != readSize)
- {
+ {
this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError);
vtkErrorMacro("DICOM file is truncated, " <<
(readSize - resultSize) << " bytes are missing.");
success = false;
- }
+ }
else if (infile.GetError())
- {
+ {
this->SetErrorCode(vtkErrorCode::FileFormatError);
vtkErrorMacro("Error in DICOM file, cannot read.");
success = false;
- }
+ }
else if (fileBigEndian != memoryBigEndian)
- {
+ {
int scalarSize = vtkDataArray::GetDataTypeSize(this->DataScalarType);
vtkByteSwap::SwapVoidRange(buffer, bufferSize/scalarSize, scalarSize);
- }
+ }
infile.Close();
return success;
@@ -1318,6 +1408,8 @@ bool vtkDICOMReader::ReadFileDelegated(
unsigned char *buffer, vtkIdType bufferSize)
{
#if defined(DICOM_USE_DCMTK)
+ // For JPEG, DCMTK will do the YBR to RGB
+ this->NeedsYBRToRGB = false;
DcmFileFormat *fileformat = new DcmFileFormat();
fileformat->loadFile(filename);
@@ -1325,12 +1417,12 @@ bool vtkDICOMReader::ReadFileDelegated(
EXS_LittleEndianExplicit, NULL);
if (!status.good())
- {
+ {
vtkErrorMacro("DCMTK error: " << status.text());
this->SetErrorCode(vtkErrorCode::FileFormatError);
delete fileformat;
return false;
- }
+ }
unsigned long count;
const Uint8 *pixelData;
@@ -1342,25 +1434,25 @@ bool vtkDICOMReader::ReadFileDelegated(
fileIdx, DC::BitsAllocated).AsInt();
if (bitsAllocated == 12 && imageSize >= bufferSize/2 + (bufferSize+3)/4)
- {
+ {
vtkDICOMReader::UnpackBits(pixelData, buffer, bufferSize, bitsAllocated);
- }
+ }
else if (bitsAllocated == 1 && imageSize >= (bufferSize + 7)/8)
- {
+ {
vtkDICOMReader::UnpackBits(pixelData, buffer, bufferSize, bitsAllocated);
- }
+ }
else if (imageSize >= bufferSize)
- {
+ {
memcpy(buffer, pixelData, bufferSize);
- }
+ }
else
- {
+ {
vtkErrorMacro(<< filename << ": The uncompressed image size is "
<< imageSize << " bytes, expected "
<< bufferSize << " bytes.");
delete fileformat;
return false;
- }
+ }
delete fileformat;
return true;
@@ -1372,21 +1464,21 @@ bool vtkDICOMReader::ReadFileDelegated(
gdcm::ImageReader reader;
reader.SetFileName(filename);
if(!reader.Read())
- {
+ {
vtkErrorMacro("The GDCM ImageReader could not read the image.");
this->SetErrorCode(vtkErrorCode::FileFormatError);
return false;
- }
+ }
gdcm::Image &image = reader.GetImage();
if (static_cast<vtkIdType>(image.GetBufferLength()) < bufferSize)
- {
+ {
vtkErrorMacro(<< filename << ": The uncompressed image size is "
<< image.GetBufferLength() << " bytes, expected "
<< bufferSize << " bytes.");
this->SetErrorCode(vtkErrorCode::FileFormatError);
return false;
- }
+ }
image.GetBuffer(reinterpret_cast<char *>(buffer));
return true;
@@ -1420,9 +1512,9 @@ bool vtkDICOMReader::ReadOneFile(
transferSyntax == "1.2.840.10008.1.2.5" || // RLE compressed
transferSyntax == "1.2.840.113619.5.2" || // GE LE with BE data
transferSyntax == "")
- {
+ {
return this->ReadFileNative(filename, fileIdx, buffer, bufferSize);
- }
+ }
return this->ReadFileDelegated(filename, fileIdx, buffer, bufferSize);
}
@@ -1435,9 +1527,9 @@ int vtkDICOMReader::RequestData(
{
// check whether the reader is in an error state
if (this->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
return false;
- }
+ }
// which output port did the request come from
int outputPort =
@@ -1445,49 +1537,49 @@ int vtkDICOMReader::RequestData(
// for now, this reader has only one output
if (outputPort > 0)
- {
+ {
return true;
- }
+ }
vtkInformation* outInfo = outputVector->GetInformationObject(0);
int extent[6];
outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
if (this->FileDimensionality == 2)
- {
+ {
// limit the number of slices to the requested update extent
int uExtent[6];
outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uExtent);
extent[4] = uExtent[4];
extent[5] = uExtent[5];
- }
+ }
// make a list of all the files inside the update extent
std::vector<vtkDICOMReaderFileInfo> files;
int nComp = this->FileIndexArray->GetNumberOfComponents();
for (int sIdx = extent[4]; sIdx <= extent[5]; sIdx++)
- {
+ {
for (int cIdx = 0; cIdx < nComp; cIdx++)
- {
+ {
int fileIdx = this->FileIndexArray->GetComponent(sIdx, cIdx);
int frameIdx = this->FrameIndexArray->GetComponent(sIdx, cIdx);
std::vector<vtkDICOMReaderFileInfo>::iterator iter = files.begin();
while (iter != files.end() && iter->FileIndex != fileIdx)
- {
+ {
++iter;
- }
+ }
if (iter == files.end())
- {
+ {
int n = this->MetaData->GetAttributeValue(
fileIdx, DC::NumberOfFrames).AsInt();
n = (n > 0 ? n : 1);
files.push_back(vtkDICOMReaderFileInfo(fileIdx, n));
iter = files.end();
--iter;
- }
- iter->Frames.push_back(vtkDICOMReaderFrameInfo(frameIdx, sIdx, cIdx));
}
+ iter->Frames.push_back(vtkDICOMReaderFrameInfo(frameIdx, sIdx, cIdx));
}
+ }
// get the data object, allocate memory
vtkImageData *data =
@@ -1529,15 +1621,15 @@ int vtkDICOMReader::RequestData(
bool planarToPacked = (filePixelSize != pixelSize);
unsigned char *rowBuffer = 0;
if (flipImage)
- {
+ {
rowBuffer = new unsigned char[fileRowSize];
- }
+ }
unsigned char *fileBuffer = 0;
int framesInPreviousFile = -1;
// loop through all files in the update extent
for (size_t idx = 0; idx < files.size(); idx++)
- {
+ {
if (this->AbortExecute) { break; }
this->UpdateProgress(static_cast<double>(idx)/
@@ -1552,32 +1644,39 @@ int vtkDICOMReader::RequestData(
// we need a file buffer if input frames don't match output slices
bool needBuffer = (planarToPacked || numFrames != framesInFile);
for (int sIdx = 0; sIdx < numFrames && !needBuffer; sIdx++)
- {
+ {
needBuffer = (sIdx != frames[sIdx].FrameIndex);
- }
+ }
unsigned char *bufferPtr = 0;
if (needBuffer)
- {
+ {
if (numFrames != framesInPreviousFile)
- {
+ {
// allocate a buffer for planar-to-packed conversion
delete [] fileBuffer;
fileBuffer = new unsigned char[fileFrameSize*framesInFile];
framesInPreviousFile = numFrames;
- }
- bufferPtr = fileBuffer;
}
+ bufferPtr = fileBuffer;
+ }
else
- {
+ {
// read directly into the output
int sliceIdx = frames[0].SliceIndex;
int componentIdx = frames[0].ComponentIndex;
bufferPtr = (dataPtr +
(sliceIdx - extent[4])*sliceSize +
componentIdx*filePixelSize*numPlanes);
- }
+ }
+
+ // ReadOneFile will set NeedsYBRToRGB to false if it does YBR->RGB itself
+ // (note: NeedsYBRToRGB will is ignored unless PhotometricInterpretation
+ // is YBR_FULL* or YBR_PARTIAL*)
+ this->NeedsYBRToRGB = (this->AutoYBRToRGB &&
+ numComponents == 3 &&
+ scalarSize == 1);
this->ComputeInternalFileName(fileIdx);
this->ReadOneFile(this->InternalFileName, fileIdx,
@@ -1585,7 +1684,7 @@ int vtkDICOMReader::RequestData(
// iterate through all frames contained in the file
for (int sIdx = 0; sIdx < numFrames; sIdx++)
- {
+ {
int frameIdx = frames[sIdx].FrameIndex;
int sliceIdx = frames[sIdx].SliceIndex;
int componentIdx = frames[sIdx].ComponentIndex;
@@ -1599,52 +1698,58 @@ int vtkDICOMReader::RequestData(
// rescale if Rescale was different for different files
if (this->NeedsRescale &&
this->MetaData->GetAttributeValue(fileIdx, DC::PixelData).IsValid())
- {
+ {
this->RescaleBuffer(fileIdx, frameIdx, bufferPtr, sliceSize);
- }
+ }
// iterate through all color planes in the slice
unsigned char *planePtr = framePtr;
for (int pIdx = 0; pIdx < numPlanes; pIdx++)
- {
+ {
// flip the data if necessary
if (flipImage)
- {
+ {
int numRows = extent[3] - extent[2] + 1;
int halfRows = numRows/2;
for (int yIdx = 0; yIdx < halfRows; yIdx++)
- {
+ {
unsigned char *row1 = planePtr + yIdx*fileRowSize;
unsigned char *row2 = planePtr + (numRows-yIdx-1)*fileRowSize;
memcpy(rowBuffer, row1, fileRowSize);
memcpy(row1, row2, fileRowSize);
memcpy(row2, rowBuffer, fileRowSize);
- }
}
+ }
// convert planes into vector components
if (planarToPacked)
- {
+ {
const unsigned char *tmpInPtr = planePtr;
unsigned char *tmpOutPtr = slicePtr;
int m = sliceSize/pixelSize;
for (int i = 0; i < m; i++)
- {
+ {
vtkIdType n = filePixelSize;
do { *tmpOutPtr++ = *tmpInPtr++; } while (--n);
tmpOutPtr += pixelSize - filePixelSize;
- }
- slicePtr += filePixelSize;
}
+ slicePtr += filePixelSize;
+ }
else if (slicePtr != planePtr)
- {
+ {
memcpy(slicePtr, planePtr, filePlaneSize);
- }
+ }
planePtr += filePlaneSize;
- }
+ }
+
+ // convert to RGB if data was read from file as YUV
+ if (this->NeedsYBRToRGB)
+ {
+ this->YBRToRGB(fileIdx, frameIdx, slicePtr, sliceSize);
}
}
+ }
delete [] rowBuffer;
delete [] fileBuffer;
@@ -1659,40 +1764,40 @@ int vtkDICOMReader::RequestData(
void vtkDICOMReader::RelayError(vtkObject *o, unsigned long e, void *data)
{
if (e == vtkCommand::ErrorEvent)
- {
+ {
vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o);
if (parser && parser->GetErrorCode())
- {
+ {
this->SetErrorCode(parser->GetErrorCode());
- }
+ }
else
- {
+ {
this->SetErrorCode(vtkErrorCode::UnknownError);
- }
+ }
if (data)
- {
+ {
vtkErrorMacro(<< static_cast<char *>(data));
- }
+ }
else
- {
+ {
vtkErrorMacro(<< "An unknown error ocurred!");
- }
}
+ }
else
- {
+ {
this->InvokeEvent(e, data);
- }
+ }
}
//----------------------------------------------------------------------------
vtkMedicalImageProperties *vtkDICOMReader::GetMedicalImageProperties()
{
if (this->MedicalImageProperties == 0)
- {
+ {
this->MedicalImageProperties = vtkMedicalImageProperties::New();
this->UpdateMedicalImageProperties();
- }
+ }
return this->MedicalImageProperties;
}
@@ -1704,10 +1809,13 @@ void vtkDICOMReader::UpdateMedicalImageProperties()
vtkMatrix4x4 *matrix = this->PatientMatrix;
vtkMedicalImageProperties *properties = this->MedicalImageProperties;
- properties->SetPatientName(
- meta->GetAttributeValue(DC::PatientName).GetCharData());
- properties->SetPatientID(
- meta->GetAttributeValue(DC::PatientID).GetCharData());
+ const vtkDICOMValue *vptr;
+ vptr = &meta->GetAttributeValue(DC::PatientName);
+ properties->SetPatientName(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::PatientID);
+ properties->SetPatientID(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
properties->SetPatientAge(
meta->GetAttributeValue(DC::PatientAge).GetCharData());
properties->SetPatientSex(
@@ -1730,24 +1838,32 @@ void vtkDICOMReader::UpdateMedicalImageProperties()
meta->GetAttributeValue(DC::InstanceNumber).GetCharData());
properties->SetSeriesNumber(
meta->GetAttributeValue(DC::SeriesNumber).GetCharData());
- properties->SetSeriesDescription(
- meta->GetAttributeValue(DC::SeriesDescription).GetCharData());
- properties->SetStudyID(
- meta->GetAttributeValue(DC::StudyID).GetCharData());
- properties->SetStudyDescription(
- meta->GetAttributeValue(DC::StudyDescription).GetCharData());
+ vptr = &meta->GetAttributeValue(DC::SeriesDescription);
+ properties->SetSeriesDescription(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::StudyID);
+ properties->SetStudyID(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::StudyDescription);
+ properties->SetStudyDescription(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
properties->SetModality(
meta->GetAttributeValue(DC::Modality).GetCharData());
- properties->SetManufacturer(
- meta->GetAttributeValue(DC::Manufacturer).GetCharData());
- properties->SetManufacturerModelName(
- meta->GetAttributeValue(DC::ManufacturerModelName).GetCharData());
- properties->SetStationName(
- meta->GetAttributeValue(DC::StationName).GetCharData());
- properties->SetInstitutionName(
- meta->GetAttributeValue(DC::InstitutionName).GetCharData());
- properties->SetConvolutionKernel(
- meta->GetAttributeValue(DC::ConvolutionKernel).GetCharData());
+ vptr = &meta->GetAttributeValue(DC::Manufacturer);
+ properties->SetManufacturer(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::ManufacturerModelName);
+ properties->SetManufacturerModelName(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::StationName);
+ properties->SetStationName(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::InstitutionName);
+ properties->SetInstitutionName(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
+ vptr = &meta->GetAttributeValue(DC::ConvolutionKernel);
+ properties->SetConvolutionKernel(vptr->IsValid() ?
+ vptr->AsUTF8String().c_str() : NULL);
properties->SetSliceThickness(
meta->GetAttributeValue(DC::SliceThickness).GetCharData());
properties->SetKVP(
@@ -1775,31 +1891,31 @@ void vtkDICOMReader::UpdateMedicalImageProperties()
n = (m < n ? m : n);
properties->RemoveAllWindowLevelPresets();
for (int i = 0; i < n; i++)
- {
+ {
properties->AddWindowLevelPreset(
center.GetDouble(i), width.GetDouble(i));
- }
+ }
const vtkDICOMValue& comment =
meta->GetAttributeValue(DC::WindowCenterWidthExplanation);
- m = comment.GetNumberOfValues();
+ m = static_cast<int>(comment.GetNumberOfValues());
m = (n < m ? n : m);
for (int j = 0; j < m; j++)
- {
+ {
properties->SetNthWindowLevelPresetComment(
j, comment.GetString(j).c_str());
- }
+ }
double dircos[6] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0 };
if (matrix)
- {
+ {
for (int jj = 0; jj < 2; jj++)
- {
+ {
for (int ii = 0; ii < 3; ii++)
- {
+ {
dircos[ii + 3*jj] = matrix->GetElement(ii, jj);
- }
}
}
+ }
properties->SetDirectionCosine(dircos);
}
diff --git a/Source/vtkDICOMReader.h b/Source/vtkDICOMReader.h
index d316de3..0532beb 100644
--- a/Source/vtkDICOMReader.h
+++ b/Source/vtkDICOMReader.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,10 +11,12 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMReader - Read DICOM image files.
-// .SECTION Description
-// This class reads a series of DICOM files into a vtkImageData object,
-// and also provides access to the DICOM meta data for each file.
+/*! \class vtkDICOMReader
+ * \brief Read DICOM image files.
+ *
+ * This class reads a series of DICOM files into a vtkImageData object,
+ * and also provides access to the DICOM meta data for each file.
+ */
#ifndef vtkDICOMReader_h
#define vtkDICOMReader_h
@@ -35,145 +37,187 @@ class vtkDICOMSliceSorter;
class VTKDICOM_EXPORT vtkDICOMReader : public vtkImageReader2
{
public:
- // Description:
- // Static method for construction.
- static vtkDICOMReader *New();
vtkTypeMacro(vtkDICOMReader, vtkImageReader2);
- // Description:
- // Print information about this object.
+ //! Static method for construction.
+ static vtkDICOMReader *New();
+
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Valid extensions for this file type.
+ //@{
+ //! Valid extensions for this file type.
virtual const char* GetFileExtensions() {
return ".dcm .dc"; }
- // Description:
- // Return a descriptive name that might be useful in a GUI.
+ //! Return a descriptive name that might be useful in a GUI.
virtual const char* GetDescriptiveName() {
return "DICOM"; }
- // Description:
- // Return true if this reader can read the given file.
+ //! Return true if this reader can read the given file.
int CanReadFile(const char* filename);
-
- // Description:
- // Set the Stack ID of the stack to load, for named stacks.
- // If the series has multiple stacks, then by default the reader
- // will only load the first stack. This method allows you to select
- // a different stack, if you know the DICOM StackID for the stack.
+ //@}
+
+ //@{
+ //! Set the Stack ID of the stack to load, for named stacks.
+ /*!
+ * If the series has multiple stacks, then by default the reader
+ * will only load the first stack. This method allows you to select
+ * a different stack, if you know the DICOM StackID for the stack.
+ */
void SetDesiredStackID(const char *stackId);
const char *GetDesiredStackID() { return this->DesiredStackID; }
- // Description:
- // Get a list of the stacks that are present in the input files.
- // A stack is a contiguous array of slices that form a volume.
+ //! Get a list of the stacks that are present in the input files.
+ /*!
+ * A stack is a contiguous array of slices that form a volume.
+ */
vtkStringArray *GetStackIDs() { return this->StackIDs; }
-
- // Description:
- // Get an array that converts slice index to input file index.
- // If the reader has generated scalar components, then this will
- // be a two-dimensional array and calling array->GetComponent(i,j)
- // will return the file index for slice i and scalar component j
- // for monochrome images, or for slice i and scalar component 3*j
- // for RGB images (or more precisely, at scalar component N*j where
- // N is the SamplesPerPixel value from the DICOM metadata). If the
- // data has just one component, then use j=0. If you used SetFileNames()
- // to provide a list of files to the reader, then use this array to
- // find out which file provided which slice, or to index into the
- // MetaData object to get the metadata for a particular slice.
+ //@}
+
+ //@{
+ //! Get an array that converts slice index to input file index.
+ /*!
+ * If the reader has generated scalar components, then this will
+ * be a two-dimensional array and calling array->GetComponent(i,j)
+ * will return the file index for slice i and scalar component j
+ * for monochrome images, or for slice i and scalar component 3*j
+ * for RGB images (or more precisely, at scalar component N*j where
+ * N is the SamplesPerPixel value from the DICOM metadata). If the
+ * data has just one component, then use j=0. If you used SetFileNames()
+ * to provide a list of files to the reader, then use this array to
+ * find out which file provided which slice, or to index into the
+ * MetaData object to get the metadata for a particular slice.
+ */
vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; }
- // Description:
- // Get an array that converts slice index to frame index.
- // The purpose of this array is to identify individual frames in
- // multi-frame DICOM files. The dimensions of this array are identical
- // to the FileIndexArray. Use FileIndexArray to identify the file,
- // then use FrameIndexArray to identify the frame within that file.
+ //! Get an array that converts slice index to frame index.
+ /*!
+ * The purpose of this array is to identify individual frames in
+ * multi-frame DICOM files. The dimensions of this array are identical
+ * to the FileIndexArray. Use FileIndexArray to identify the file,
+ * then use FrameIndexArray to identify the frame within that file.
+ */
vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; }
-
- // Description:
- // Get the meta data for the DICOM files.
- // The GetAttributeValue() method of vtkDICOMMataData takes optional
- // file and frame indices, which specify the file and the frame within
- // that file to get the attribute from. If you have a slice index rather
- // than a file index and frame index, then use the FileIndexArray and
- // FrameIndexArray to convert the slice index into file and frame indices.
+ //@}
+
+ //@{
+ //! Get the meta data for the DICOM files.
+ /*!
+ * The GetAttributeValue() method of vtkDICOMMataData takes optional
+ * file and frame indices, which specify the file and the frame within
+ * that file to get the attribute from. If you have a slice index rather
+ * than a file index and frame index, then use the FileIndexArray and
+ * FrameIndexArray to convert the slice index into file and frame indices.
+ */
vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
+ //@}
- // Description:
- // If the files have been pre-sorted, the sorting can be disabled.
+ //@{
+ //! If the files have been pre-sorted, the sorting can be disabled.
vtkGetMacro(Sorting, int);
vtkSetMacro(Sorting, int);
vtkBooleanMacro(Sorting, int)
-
- // Description:
- // Set a custom sorter to be used to sort files and frames into slices.
- // The default sorter uses the attributes "ImagePositionPatient" and
- // "ImageOrientationPatient" to spatially arrange the slices.
+ //@}
+
+ //@{
+ //! Set a custom sorter to be used to sort files and frames into slices.
+ /*!
+ * The default sorter uses the attributes "ImagePositionPatient" and
+ * "ImageOrientationPatient" to spatially arrange the slices.
+ */
void SetSorter(vtkDICOMSliceSorter *sorter);
vtkDICOMSliceSorter *GetSorter() { return this->Sorter; }
-
- // Description:
- // Read the time dimension as scalar components (default: Off).
- // If this is on, then each time point will be stored as a scalar
- // component in the image data. If the data has both a time dimension
- // and a vector dimension, then the number of components will be the
- // product of these two dimensions, i.e. the components will store
- // a sequence of vectors, one vector for each time point.
+ //@}
+
+ //@{
+ //! Read the time dimension as scalar components (default: Off).
+ /*!
+ * If this is on, then each time point will be stored as a scalar
+ * component in the image data. If the data has both a time dimension
+ * and a vector dimension, then the number of components will be the
+ * product of these two dimensions, i.e. the components will store
+ * a sequence of vectors, one vector for each time point.
+ */
vtkGetMacro(TimeAsVector, int);
vtkSetMacro(TimeAsVector, int);
vtkBooleanMacro(TimeAsVector, int);
+ //@}
- // Description:
- // Get the time dimension if the DICOM series has one.
+ //@{
+ //! Get the time dimension if the DICOM series has one.
int GetTimeDimension() { return this->TimeDimension; }
double GetTimeSpacing() { return this->TimeSpacing; }
+ //@}
- // Description:
- // Set the desired time index (set to -1 for all).
+ //@{
+ //! Set the desired time index (set to -1 for all).
vtkSetMacro(DesiredTimeIndex, int);
vtkGetMacro(DesiredTimeIndex, int);
-
- // Description:
- // Turn off automatic rescaling of intensity values.
- // By default, of the reader sees different RescaleSlope and
- // RescaleIntercept values for different slices, then it will
- // adjust the pixel values so that they can all use the same
- // slope and intercept. This is a lossy process, so you might
- // want to turn it off and use vtkDICOMApplyRescale instead.
+ //@}
+
+ //@{
+ //! Turn off automatic conversion of YBR images to RGB.
+ /*!
+ * By default, YBR images are always converted to RGB (though the
+ * photometric interpretation in the metadata will remain the same).
+ */
+ vtkGetMacro(AutoYBRToRGB, int);
+ vtkSetMacro(AutoYBRToRGB, int);
+ vtkBooleanMacro(AutoYBRToRGB, int);
+ //@}
+
+ //@{
+ //! Turn off automatic rescaling of intensity values.
+ /*!
+ * By default, if the RescaleSlope and RescaleIntercept values differ
+ * between slices (as occurs for all PET images and some CT images),
+ * then the reader will adjust the pixel values for the slices so
+ * that the same RescaleSlope and RescaleIntercept can be used for
+ * all slices. This adjustment is a lossy process, so a preferable
+ * option is to call AutoRescaleOff() and use vtkDICOMApplyRescale
+ * to apply the pixel value rescaling instead.
+ */
vtkGetMacro(AutoRescale, int);
vtkSetMacro(AutoRescale, int);
vtkBooleanMacro(AutoRescale, int);
-
- // Description:
- // Get the slope and intercept for rescaling the scalar values.
- // These values allow calibration of the data to real values.
- // Use the equation v = u*RescaleSlope + RescaleIntercept.
+ //@}
+
+ //@{
+ //! Get the slope and intercept for rescaling the scalar values.
+ /*!
+ * These values allow calibration of the data to real values.
+ * Use the equation v = u*RescaleSlope + RescaleIntercept.
+ */
double GetRescaleSlope() { return this->RescaleSlope; }
double GetRescaleIntercept() { return this->RescaleIntercept; }
-
- // Description:
- // Get a matrix to place the image within DICOM patient coords.
- // This matrix is constructed from the ImageOrientationPatient
- // and ImagePositionPatient meta data attributes. See the
- // SetMemoryRowOrder method for additional information.
+ //@}
+
+ //@{
+ //! Get a matrix to place the image within DICOM patient coords.
+ /*!
+ * This matrix is constructed from the ImageOrientationPatient
+ * and ImagePositionPatient meta data attributes. See the
+ * SetMemoryRowOrder method for additional information.
+ */
vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
+ //@}
- // Description:
- // Get a MedicalImageProperties object for this file.
+ //@{
+ //! Get a MedicalImageProperties object for this file.
vtkMedicalImageProperties *GetMedicalImageProperties();
+ //@}
- // Description:
- // Enumeration for top-down vs. bottom-up ordering.
+ //! Enumeration for top-down vs. bottom-up ordering.
enum RowOrder { FileNative, TopDown, BottomUp };
- // Description:
- // Set the ordering of the image rows in memory.
- // If the order is BottomUp (which is the default) then
- // the images will be flipped when they are read from disk.
- // The native orientation of DICOM images is top-to-bottom.
+ //@{
+ //! Set the ordering of the image rows in memory.
+ /*!
+ * If the order is BottomUp (which is the default) then
+ * the images will be flipped when they are read from disk.
+ * The native orientation of DICOM images is top-to-bottom.
+ */
void SetMemoryRowOrder(int order);
void SetMemoryRowOrderToFileNative() {
this->SetMemoryRowOrder(FileNative); }
@@ -183,151 +227,147 @@ public:
this->SetMemoryRowOrder(BottomUp); }
int GetMemoryRowOrder() { return this->MemoryRowOrder; }
const char *GetMemoryRowOrderAsString();
+ //@}
protected:
vtkDICOMReader();
~vtkDICOMReader();
- // Description:
- // Read the header information.
+ //@{
+ //! Read the header information.
virtual int RequestInformation(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // Read the voxel data.
+ //! Read the voxel data.
virtual int RequestData(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
+ //@}
- // Description:
- // Read one file. Specify the offset to the PixelData.
+ //@{
+ //! Read one file. Specify the offset to the PixelData.
virtual bool ReadOneFile(
const char *filename, int idx,
unsigned char *buffer, vtkIdType bufferSize);
- // Description:
- // Unpack 1 bit to 8 bits or 12 bits to 16 bits.
+ //! Unpack 1 bit to 8 bits or 12 bits to 16 bits.
void UnpackBits(
const void *source, void *buffer, vtkIdType bufferSize, int bits);
- // Description:
- // Read an DICOM file directly.
+ //! Read an DICOM file directly.
virtual bool ReadFileNative(
const char *filename, int idx,
unsigned char *buffer, vtkIdType bufferSize);
- // Description:
- // Read a DICOM file via DCMTK or GDCM.
+ //! Read a DICOM file via DCMTK or GDCM.
virtual bool ReadFileDelegated(
const char *filename, int idx,
unsigned char *buffer, vtkIdType bufferSize);
+ //@}
- // Description:
- // Rescale the data in the buffer.
+ //@{
+ //! Rescale the data in the buffer.
virtual void RescaleBuffer(
int fileIdx, int frameIdx, void *buffer, vtkIdType bufferSize);
- // Description:
- // Convert parser errors into reader errors.
- void RelayError(vtkObject *o, unsigned long e, void *data);
+ //! Convert buffer from YUV to RGB.
+ virtual void YBRToRGB(
+ int fileIdx, int frameIdx, void *buffer, vtkIdType bufferSize);
+ //@}
- // Description:
- // Verify that the files can be composed into a volume.
- // This is called after SortFiles has been called. It should invoke an
- // error event and return zero upon failure.
+ //@{
+ //! Convert parser errors into reader errors.
+ void RelayError(vtkObject *o, unsigned long e, void *data);
+ //@}
+
+ //@{
+ //! Verify that the files can be composed into a volume.
+ /*!
+ * This is called after SortFiles has been called. It should invoke an
+ * error event and return zero upon failure.
+ */
virtual bool ValidateStructure(
vtkIntArray *fileArray, vtkIntArray *frameArray);
- // Description:
- // Sort the input files, put the sort in the supplied arrays.
+ //! Sort the input files, put the sort in the supplied arrays.
virtual void SortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray);
- // Description:
- // Do not sort the files, just build the arrays.
+ //! Do not sort the files, just build the arrays.
void NoSortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray);
+ //@}
- // Description:
- // Update the medical image properties;
+ //@{
+ //! Update the medical image properties;
virtual void UpdateMedicalImageProperties();
+ //@}
- // Description:
- // Select whether to sort the files.
+ //! Select whether to sort the files.
int Sorting;
- // Description:
- // Information for rescaling data to quantitative units.
+ //! Information for rescaling data to quantitative units.
double RescaleIntercept;
double RescaleSlope;
- // Description:
- // The orientation matrix for the DICOM file.
+ //! The orientation matrix for the DICOM file.
vtkMatrix4x4 *PatientMatrix;
- // Description:
- // The meta data for the image.
+ //! The meta data for the image.
vtkDICOMMetaData *MetaData;
- // Description:
- // The MedicalImageProperties, for compatibility with other readers.
+ //! The MedicalImageProperties, for compatibility with other readers.
vtkMedicalImageProperties *MedicalImageProperties;
- // Description:
- // The parser that is used to read the file.
+ //! The parser that is used to read the file.
vtkDICOMParser *Parser;
- // Description:
- // The sorter that orders the slices within the volume.
+ //! The sorter that orders the slices within the volume.
vtkDICOMSliceSorter *Sorter;
- // Description:
- // The offsets to the pixel data in each file.
+ //! The offsets to the pixel data in each file.
vtkTypeInt64Array *FileOffsetArray;
- // Description:
- // An array to convert slice indices to input files
+ //! An array to convert slice indices to input files
vtkIntArray *FileIndexArray;
- // Description:
- // An array to convert slice indices to input frames
+ //! An array to convert slice indices to input frames
vtkIntArray *FrameIndexArray;
- // Description:
- // An array that holds the stack IDs.
+ //! An array that holds the stack IDs.
vtkStringArray *StackIDs;
- // Description:
- // The row order to use when storing the data in memory.
+ //! The row order to use when storing the data in memory.
int MemoryRowOrder;
- // Description:
- // This indicates that the data must be rescaled.
+ //! This indicates that the data must be rescaled.
int NeedsRescale;
int AutoRescale;
- // Description:
- // The number of packed pixel components in the input file.
- // This is for packed, rather than planar, components.
+ //! This indicates that the data must be converted to RGB.
+ int NeedsYBRToRGB;
+ int AutoYBRToRGB;
+
+ //! The number of packed pixel components in the input file.
+ /*!
+ * This is for packed, rather than planar, components.
+ */
int NumberOfPackedComponents;
- // Description:
- // The number of color planes in the file.
+ //! The number of color planes in the file.
int NumberOfPlanarComponents;
- // Description:
- // Time dimension variables.
+ //! Time dimension variables.
int TimeAsVector;
int TimeDimension;
int DesiredTimeIndex;
double TimeSpacing;
- // Description:
- // The stack to load.
+ //! The stack to load.
char DesiredStackID[20];
private:
- vtkDICOMReader(const vtkDICOMReader&); // Not implemented.
- void operator=(const vtkDICOMReader&); // Not implemented.
+ vtkDICOMReader(const vtkDICOMReader&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMReader&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMReader_h
diff --git a/Source/vtkDICOMSCGenerator.cxx b/Source/vtkDICOMSCGenerator.cxx
index 5348618..9d15c57 100644
--- a/Source/vtkDICOMSCGenerator.cxx
+++ b/Source/vtkDICOMSCGenerator.cxx
@@ -46,25 +46,25 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameImageModule(
// The BurnedInAnnotation attribute is mandatory
std::string bia;
if (source)
- {
+ {
bia = source->GetAttributeValue(
DC::BurnedInAnnotation).AsString();
- }
+ }
if (bia != "YES")
- {
+ {
bia = "NO";
- }
+ }
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(DC::BurnedInAnnotation, bia);
// These are mandatory, and must be set to these values
if (meta->GetAttributeValue(DC::BitsStored).AsInt() != 1)
- {
+ {
meta->SetAttributeValue(DC::PresentationLUTShape, "IDENTITY");
meta->SetAttributeValue(DC::RescaleIntercept, 0.0);
meta->SetAttributeValue(DC::RescaleSlope, 1.0);
meta->SetAttributeValue(DC::RescaleType, "US");
- }
+ }
// get dimensions of the data set: x,y,z,t,v
int nframes = this->NumberOfFrames;
@@ -83,26 +83,26 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameImageModule(
int vdim = (dims[4] > 0 ? dims[4] : 1);
int tdim = (dims[3] > 0 ? dims[3] : 1);
for (int f = 0; f < nframes; f++)
- {
+ {
int t = (f / vdim) % tdim;
int z = f / (vdim * tdim);
zvector[f] = z*spacing[2];
tvector[f] = (t == 0 ? 0.0 : spacing[3]);
- }
+ }
if (dims[3] > 0 || (dims[2] == 0 && nframes == 1))
- {
+ {
pointers[npointers++] = DC::FrameTimeVector;
meta->SetAttributeValue(
DC::FrameTimeVector,
vtkDICOMValue(vtkDICOMVR::DS, tvector, nframes));
- }
+ }
if (dims[2] > 0)
- {
+ {
pointers[npointers++] = DC::SliceLocationVector;
meta->SetAttributeValue(DC::SliceLocationVector,
vtkDICOMValue(vtkDICOMVR::DS, zvector, nframes));
- }
+ }
meta->RemoveAttribute(DC::FrameTime);
meta->SetAttributeValue(
@@ -159,22 +159,22 @@ bool vtkDICOMSCGenerator::GenerateSCEquipmentModule(vtkDICOMMetaData *source)
// ConversionType is a mandatory attribute
std::string ct;
if (source)
- {
+ {
ct = source->GetAttributeValue(DC::ConversionType).AsString();
- }
+ }
if (ct == "")
- {
+ {
ct = "WSD"; // workstation
- }
+ }
vtkDICOMMetaData *meta = this->MetaData;
meta->SetAttributeValue(DC::ConversionType, ct);
// Modality is optional for Secondary Capture
std::string m = meta->GetAttributeValue(DC::Modality).AsString();
if (m == "" || m == "OT")
- {
+ {
meta->RemoveAttribute(DC::Modality);
- }
+ }
// optional and conditional: direct copy of values with no checks
static const DC::EnumType optional[] = {
@@ -205,30 +205,30 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameInstance(vtkInformation *info)
const char *SOPClass = 0;
if (scalarType == VTK_UNSIGNED_CHAR)
- {
+ {
this->SetPixelRestrictions(
RepresentationUnsigned,
BitsStored8,
numComponents);
if (numComponents < 3)
- {
+ {
SOPClass = "1.2.840.10008.5.1.4.1.1.7.2";
- }
+ }
else
- {
+ {
SOPClass = "1.2.840.10008.5.1.4.1.1.7.4";
- }
}
+ }
else
- {
+ {
this->SetPixelRestrictions(
RepresentationUnsigned,
BitsStored10 | BitsStored12 | BitsStored16,
1);
SOPClass = "1.2.840.10008.5.1.4.1.1.7.3";
- }
+ }
this->InitializeMetaData(info);
@@ -249,9 +249,9 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameInstance(vtkInformation *info)
!this->GenerateDeviceModule(source) ||
!this->GenerateSpecimenModule(source) ||
!this->GenerateSCMultiFrameImageModule(source))
- {
+ {
return false;
- }
+ }
return true;
}
@@ -270,9 +270,9 @@ bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info)
int samplesPerPixel = 1;
if (scalarType == VTK_UNSIGNED_CHAR)
- {
+ {
samplesPerPixel = numComponents;
- }
+ }
this->SetPixelRestrictions(
RepresentationUnsigned | RepresentationSigned,
@@ -299,9 +299,9 @@ bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info)
!this->GenerateSpecimenModule(source) ||
!this->GenerateSCImageModule(source) ||
!this->GenerateOverlayPlaneModule(source))
- {
+ {
return false;
- }
+ }
return true;
}
@@ -310,9 +310,9 @@ bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info)
bool vtkDICOMSCGenerator::GenerateInstance(vtkInformation *info)
{
if (this->MultiFrame == 0)
- {
+ {
return this->GenerateSCInstance(info);
- }
+ }
return this->GenerateSCMultiFrameInstance(info);
}
diff --git a/Source/vtkDICOMSCGenerator.h b/Source/vtkDICOMSCGenerator.h
index 91440f9..3c8884c 100644
--- a/Source/vtkDICOMSCGenerator.h
+++ b/Source/vtkDICOMSCGenerator.h
@@ -67,8 +67,8 @@ protected:
virtual bool GenerateSCMultiFrameInstance(vtkInformation *info);
private:
- vtkDICOMSCGenerator(const vtkDICOMSCGenerator&); // Not implemented.
- void operator=(const vtkDICOMSCGenerator&); // Not implemented.
+ vtkDICOMSCGenerator(const vtkDICOMSCGenerator&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMSCGenerator&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMSCGenerator_h
diff --git a/Source/vtkDICOMSequence.cxx b/Source/vtkDICOMSequence.cxx
index f368664..d80b2dd 100644
--- a/Source/vtkDICOMSequence.cxx
+++ b/Source/vtkDICOMSequence.cxx
@@ -16,6 +16,18 @@
#include <assert.h>
+// provide extern declarations for all the template methods we use
+#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700)
+extern template
+void vtkDICOMValue::AppendInit<vtkDICOMItem>(vtkDICOMVR);
+
+extern template
+void vtkDICOMValue::AppendValue<vtkDICOMItem>(const vtkDICOMItem&);
+
+extern template
+void vtkDICOMValue::SetValue<vtkDICOMItem>(size_t, const vtkDICOMItem&);
+#endif
+
//----------------------------------------------------------------------------
// For use by methods that must return an invalid value
const vtkDICOMValue vtkDICOMSequence::InvalidValue;
@@ -24,14 +36,44 @@ const vtkDICOMValue vtkDICOMSequence::InvalidValue;
const vtkDICOMItem vtkDICOMSequence::EmptyItem;
//----------------------------------------------------------------------------
+vtkDICOMSequence::vtkDICOMSequence()
+{
+ this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ);
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMSequence::vtkDICOMSequence(unsigned int n)
+{
+ this->V.AllocateSequenceData(vtkDICOMVR::SQ, n);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMSequence::Clear()
+{
+ this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMSequence::AddItem(const vtkDICOMItem& item)
+{
+ this->V.AppendValue(item);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMSequence::SetItem(size_t i, const vtkDICOMItem& item)
+{
+ this->V.SetValue(i, item);
+}
+
+//----------------------------------------------------------------------------
const vtkDICOMValue &vtkDICOMSequence::GetAttributeValue(
size_t i, vtkDICOMTag tag) const
{
const vtkDICOMItem *ptr = this->V.GetSequenceData();
if (ptr != 0 && i < this->V.GetNumberOfValues())
- {
+ {
return ptr[i].GetAttributeValue(tag);
- }
+ }
return vtkDICOMSequence::InvalidValue;
}
@@ -41,9 +83,9 @@ const vtkDICOMValue &vtkDICOMSequence::GetAttributeValue(
{
const vtkDICOMItem *ptr = this->V.GetSequenceData();
if (ptr != 0 && i < this->V.GetNumberOfValues())
- {
+ {
return ptr[i].GetAttributeValue(tagpath);
- }
+ }
return vtkDICOMSequence::InvalidValue;
}
@@ -52,9 +94,9 @@ const vtkDICOMItem &vtkDICOMSequence::GetItem(size_t i) const
{
const vtkDICOMItem *ptr = this->V.GetSequenceData();
if (ptr != 0 && i < this->V.GetNumberOfValues())
- {
+ {
return ptr[i];
- }
+ }
return vtkDICOMSequence::EmptyItem;
}
diff --git a/Source/vtkDICOMSequence.h b/Source/vtkDICOMSequence.h
index b595878..ca4ed54 100644
--- a/Source/vtkDICOMSequence.h
+++ b/Source/vtkDICOMSequence.h
@@ -31,24 +31,28 @@ class vtkDICOMTagPath;
class VTKDICOM_EXPORT vtkDICOMSequence
{
public:
+ //@{
//! Construct a growable sequence with no items.
- vtkDICOMSequence() {
- this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ); }
+ vtkDICOMSequence();
//! Construct a sequence of fixed size.
- explicit vtkDICOMSequence(unsigned int n) {
- this->V.AllocateSequenceData(vtkDICOMVR::SQ, n); }
+ explicit vtkDICOMSequence(unsigned int n);
+ //@}
+ //@{
//! Clear a sequence, remove its contents and make it empty.
- void Clear() {
- this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ); }
+ void Clear();
+ //@}
+ //@{
//! Get a value from an item in the sequence.
const vtkDICOMValue &GetAttributeValue(
size_t i, vtkDICOMTag tag) const;
const vtkDICOMValue &GetAttributeValue(
size_t i, const vtkDICOMTagPath &p) const;
+ //@}
+ //@{
//! Add an item to the sequence.
/*!
* After calling this method, GetNumberOfItems() will report
@@ -56,20 +60,20 @@ public:
* the special value 0xffffffff to indicate that this is a delimited
* sequence rather than a fixed-size sequence.
*/
- void AddItem(const vtkDICOMItem& item) {
- this->V.AppendValue(item); }
+ void AddItem(const vtkDICOMItem& item);
//! Get the number of items in the sequence.
size_t GetNumberOfItems() const {
return this->V.GetNumberOfValues(); }
+ //@}
+ //@{
//! Set an item in the sequence.
/*!
* This method can only be used if space as been allocated within
* the sequence by specifying a size when calling the constructor.
*/
- void SetItem(size_t i, const vtkDICOMItem& item) {
- this->V.SetValue(i, item); }
+ void SetItem(size_t i, const vtkDICOMItem& item);
//! Get an item from the sequence.
const vtkDICOMItem& GetItem(size_t i) const;
@@ -77,11 +81,9 @@ public:
//! Get a pointer to the items in the sequence.
const vtkDICOMItem *GetSequenceData() const {
return this->V.GetSequenceData(); }
+ //@}
- //! Check that the sequence was constructed from a valid value.
- bool IsValid() const {
- return this->V.IsValid(); }
-
+ //@{
//! Copy constructor.
vtkDICOMSequence(const vtkDICOMSequence& o) : V(o.V) {}
@@ -89,6 +91,12 @@ public:
vtkDICOMSequence(const vtkDICOMValue& o) : V(o) {
if (o.GetVR() != vtkDICOMVR::SQ) { this->V.Clear(); } }
+ //! Check that the sequence was constructed from a valid value.
+ bool IsValid() const {
+ return this->V.IsValid(); }
+ //@}
+
+ //@{
//! Assignment operator.
vtkDICOMSequence& operator=(const vtkDICOMSequence& o) {
this->V = o.V; return *this; }
@@ -97,6 +105,7 @@ public:
vtkDICOMSequence& operator=(const vtkDICOMValue& o) {
if (o.GetVR() == vtkDICOMVR::SQ) { this->V = o; }
else { this->V.Clear(); } return *this; }
+ //@}
private:
friend class vtkDICOMValue;
diff --git a/Source/vtkDICOMSliceSorter.cxx b/Source/vtkDICOMSliceSorter.cxx
index 6b85c05..1477a01 100644
--- a/Source/vtkDICOMSliceSorter.cxx
+++ b/Source/vtkDICOMSliceSorter.cxx
@@ -49,21 +49,21 @@ vtkDICOMSliceSorter::vtkDICOMSliceSorter()
vtkDICOMSliceSorter::~vtkDICOMSliceSorter()
{
if (this->FileIndexArray)
- {
+ {
this->FileIndexArray->Delete();
- }
+ }
if (this->FrameIndexArray)
- {
+ {
this->FrameIndexArray->Delete();
- }
+ }
if (this->StackIDs)
- {
+ {
this->StackIDs->Delete();
- }
+ }
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -73,13 +73,13 @@ void vtkDICOMSliceSorter::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "MetaData: ";
if (this->MetaData)
- {
+ {
os << this->MetaData << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "DesiredStackID: "
<< (*this->DesiredStackID ? "(empty)" : this->DesiredStackID) << "\n";
@@ -103,35 +103,35 @@ void vtkDICOMSliceSorter::PrintSelf(ostream& os, vtkIndent indent)
void vtkDICOMSliceSorter::SetMetaData(vtkDICOMMetaData *meta)
{
if (this->MetaData != meta)
- {
+ {
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
if (meta)
- {
+ {
meta->Register(this);
- }
+ }
this->MetaData = meta;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
void vtkDICOMSliceSorter::SetDesiredStackID(const char *stackId)
{
if (stackId == 0)
- {
+ {
stackId = "";
- }
+ }
// the maximum length of a stackId is 16
if (strncmp(this->DesiredStackID, stackId, 16) != 0)
- {
+ {
strncpy(this->DesiredStackID, stackId, 16);
this->DesiredStackID[17] = '\0';
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -191,9 +191,9 @@ const vtkDICOMValue& vtkDICOMSliceSorterGetFrameAttributeValue(
const vtkDICOMValue& v =
frameSeq.GetAttributeValue(i, vtkDICOMTagPath(stag, 0, vtag));
if (v.IsValid())
- {
+ {
return v;
- }
+ }
return sharedSeq.GetAttributeValue(0, vtkDICOMTagPath(stag, 0, vtag));
}
@@ -205,11 +205,11 @@ double vtkDICOMSliceSorterComputeLocation(
double location = 0.0;
if (pv.GetNumberOfValues() != 3 || ov.GetNumberOfValues() != 6)
- {
+ {
*checkPtr = false;
- }
+ }
else
- {
+ {
double orientation[6], normal[3], position[3];
pv.GetValues(position, 3);
ov.GetValues(orientation, 6);
@@ -220,24 +220,24 @@ double vtkDICOMSliceSorterComputeLocation(
location = vtkMath::Dot(normal, position);
if (checkOrientation[9] == 0)
- {
+ {
// save the orientation and position for later checks
for (int i = 0; i < 3; i++)
- {
+ {
checkOrientation[i] = orientation[i];
checkOrientation[3+i] = orientation[3+i];
checkOrientation[6+i] = position[i];
checkOrientation[10+i] = normal[i];
- }
+ }
// indicate that checkOrientation has been set
checkOrientation[9] = 1.0;
- }
+ }
else
- {
+ {
const double directionTolerance = 1e-4;
const double positionTolerance = 1e-3;
for (int i = 0; i < 2; i++)
- {
+ {
// make sure the orientation vectors stay the same
double *vec = &orientation[3*i];
double *checkVec = &checkOrientation[3*i];
@@ -248,16 +248,16 @@ double vtkDICOMSliceSorterComputeLocation(
// (actually compute the square of the sine, it's easier)
double d = 1.0;
if (b > 0 && c > 0)
- {
+ {
d = 1.0 - (a*a)/(b*c);
- }
+ }
// the tolerance is in radians (small angle approximation)
if (d > directionTolerance*directionTolerance)
- {
+ {
// not all slices have the same orientation
*checkPtr = false;
- }
}
+ }
// make sure the positions line up
double *checkPosition = &checkOrientation[6];
double v[3];
@@ -270,13 +270,13 @@ double vtkDICOMSliceSorterComputeLocation(
if (checkOrientation[13] == 0 &&
v[0]*v[0] + v[1]*v[1] + v[2]*v[2] >
positionTolerance*positionTolerance)
- {
+ {
for (int i = 0; i < 3; i++)
- {
+ {
checkOrientation[10+i] = vdir*v[i];
- }
- vtkMath::Normalize(&checkOrientation[10]);
}
+ vtkMath::Normalize(&checkOrientation[10]);
+ }
// compare vector to check vector
double w = vtkMath::Norm(&checkOrientation[10]);
@@ -289,33 +289,33 @@ double vtkDICOMSliceSorterComputeLocation(
// the position tolerance is in millimetres
if (d > (positionTolerance*positionTolerance +
t*t*directionTolerance*directionTolerance))
- {
+ {
// positions don't line up along the normal
*checkPtr = false;
- }
+ }
else if (checkOrientation[13] != 0 && vtkMath::Norm(v) > w)
- {
+ {
// use new vector as check vector if it is longer
for (int i = 0; i < 3; i++)
- {
+ {
checkOrientation[10+i] = vdir*v[i];
- }
}
}
+ }
if (*checkPtr == false)
- {
+ {
// re-set the check orientation to the current stack
for (int i = 0; i < 3; i++)
- {
+ {
checkOrientation[i] = orientation[i];
checkOrientation[3+i] = orientation[3+i];
checkOrientation[6+i] = position[i];
checkOrientation[10+i] = normal[i];
- }
+ }
// mark the check vector as unset
checkOrientation[13] = 0;
- }
}
+ }
return location;
}
@@ -331,39 +331,39 @@ double vtkDICOMSliceSorterComputeSpacing(
int o = 0;
while (m != 0)
- {
+ {
// compute the mean spacing and the variance in spacing
double s1 = 0.0;
double s2 = 0.0;
size_t n = 0;
o = 0;
for (size_t i = 1; i < info.size(); i++)
- {
+ {
// first verify that locations aren't identical
if (vtkDICOMSliceSorterSortInfo::CompareLocation(info[i-1], info[i]))
- {
+ {
// compute the offset
double d = info[i].ComputedLocation - info[i-1].ComputedLocation;
double dd = (d - a)*(d - a);
// make sure offset is within 3 sigma or 10% of average offset
if (dd < 0.01*a*a || dd < 9*v)
- {
+ {
s1 += d;
s2 += d*d;
n++;
- }
+ }
else
- {
+ {
o++;
- }
}
}
+ }
// no results!
if (n == 0)
- {
+ {
break;
- }
+ }
// compute the mean and variance
a = s1 / n;
@@ -371,13 +371,13 @@ double vtkDICOMSliceSorterComputeSpacing(
// break if within tolerance or if results haven't changed
if (v/(a*a) < 1e-6 || n == m)
- {
+ {
break;
- }
+ }
// save count to use as check
m = n;
- }
+ }
*missing = o;
return a;
@@ -439,17 +439,17 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
// sort by instance first
for (int i = 0; i < numFiles; i++)
- {
+ {
int inst = meta->GetAttributeValue(i, DC::InstanceNumber).AsInt();
info.push_back(vtkDICOMSliceSorterSortInfo(i, inst));
- }
+ }
std::stable_sort(info.begin(), info.end(),
vtkDICOMSliceSorterSortInfo::CompareInstance);
std::vector<int> fileOrder(info.size());
for (int i = 0; i < numFiles; i++)
- {
+ {
fileOrder[i] = info[i].FileNumber;
- }
+ }
info.clear();
// important position-related variables
@@ -460,20 +460,20 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
meta->GetAttributeValue(DC::SpacingBetweenSlices).AsDouble();
double spacingSign = 1.0;
if (spacingBetweenSlices == 0)
- {
+ {
spacingBetweenSlices = 1.0;
- }
+ }
else if (spacingBetweenSlices < 0)
- {
+ {
spacingBetweenSlices = -spacingBetweenSlices;
spacingSign = -1.0;
- }
+ }
// important time-related variables
int temporalSpacing = 1.0;
if (meta->HasAttribute(DC::SharedFunctionalGroupsSequence))
- {
+ {
// a special stackInfo for the desired stack
std::vector<vtkDICOMSliceSorterSortInfo> stackInfo;
vtkDICOMValue firstStackId;
@@ -484,7 +484,7 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
// files have enhanced frame information
for (int ii = 0; ii < numFiles; ii++)
- {
+ {
int i = fileOrder[ii];
int inst = meta->GetAttributeValue(i, DC::InstanceNumber).AsInt();
int numberOfFrames =
@@ -497,70 +497,70 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
meta->GetAttributeValue(i, DC::SharedFunctionalGroupsSequence);
if (ii == 0 && numberOfFrames > 0)
- {
+ {
firstStackId = vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, 0, DC::FrameContentSequence,
DC::StackID);
- }
+ }
// attributes for getting time information
vtkDICOMTag timeSequence;
vtkDICOMTag timeTag;
if (numberOfFrames > 0)
- {
+ {
// time information can come from these attributes
if (vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, 0, DC::CardiacSynchronizationSequence,
DC::NominalCardiacTriggerDelayTime).IsValid())
- {
+ {
timeSequence = DC::CardiacSynchronizationSequence;
timeTag = DC::NominalCardiacTriggerDelayTime;
- }
+ }
else if (vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, 0, DC::TemporalPositionSequence,
DC::TemporalPositionTimeOffset).IsValid())
- {
+ {
timeSequence = DC::TemporalPositionSequence;
timeTag = DC::TemporalPositionTimeOffset;
temporalSpacing = 1000.0; // convert seconds to milliseconds
- }
+ }
else if (vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, 0, DC::FrameContentSequence,
DC::TemporalPositionIndex).IsValid())
- {
+ {
timeSequence = DC::FrameContentSequence;
timeTag = DC::TemporalPositionIndex;
- }
+ }
else if (vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, 0, DC::MREchoSequence,
DC::EffectiveEchoTime).IsValid())
- {
+ {
timeSequence = DC::MREchoSequence;
timeTag = DC::EffectiveEchoTime;
- }
}
+ }
// position counter
int position = 0;
double lastTime = 0.0;
for (int k = 0; k < numberOfFrames; k++)
- {
+ {
// time: use chosen time tag, if present
double t = 0.0;
if (timeTag.GetGroup() != 0)
- {
+ {
t = vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, k, timeSequence, timeTag).AsDouble();
- }
+ }
// adjust position only if time did not change
if (fabs(t - lastTime) < 1e-3 || k == 0)
- {
+ {
position = k;
lastTime = t;
- }
+ }
// get the StackID
vtkDICOMValue stackId = vtkDICOMSliceSorterGetFrameAttributeValue(
@@ -568,25 +568,25 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
DC::StackID);
if (stackId.IsValid())
- {
+ {
// append new StackIDs to this->StackIDs
vtkIdType stacksFound = this->StackIDs->GetNumberOfValues();
std::string stackName = stackId.AsString();
vtkIdType si;
for (si = 0; si < stacksFound; si++)
- {
+ {
if (stackName == this->StackIDs->GetValue(si)) { break; }
- }
+ }
if (si == stacksFound)
- {
+ {
this->StackIDs->InsertNextValue(stackName);
- }
+ }
// position: look for InStackPositionNumber
position = vtkDICOMSliceSorterGetFrameAttributeValue(
frameSeq, sharedSeq, k, DC::FrameContentSequence,
DC::InStackPositionNumber).AsInt();
- }
+ }
// check for valid Image Plane Module information
vtkDICOMValue pv = vtkDICOMSliceSorterGetFrameAttributeValue(
@@ -598,7 +598,7 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
// check if the StackId is the one the user specified
if (stackId == desiredStackId)
- {
+ {
// compute location from orientation and IPP
double location = vtkDICOMSliceSorterComputeLocation(
pv, ov, stackCheckNormal, &canSortStackByIPP);
@@ -607,9 +607,9 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
stackInfo.push_back(
vtkDICOMSliceSorterSortInfo(i, k, inst, position, location, t));
- }
+ }
else if (stackId == firstStackId)
- {
+ {
// compute location from orientation and IPP
double location = vtkDICOMSliceSorterComputeLocation(
pv, ov, checkOrientation, &canSortByLocation);
@@ -618,54 +618,54 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
// force output of one single volume
if ((ii > 0 || k > 0) && !firstStackId.IsValid() &&
pv.IsValid() && !canSortByLocation)
- {
+ {
canSortByLocation = true;
volumeBreaks.push_back(info.size());
- }
+ }
info.push_back(
vtkDICOMSliceSorterSortInfo(i, k, inst, position, location, t));
- }
}
}
+ }
// if frames with the desired stack ID were found, use them
if (stackInfo.size() > 0)
- {
+ {
canSortByLocation = canSortStackByIPP;
info = stackInfo;
- }
}
+ }
else
- {
+ {
// ways to get time information
vtkDICOMTag timeTag;
if (meta->GetAttributeValue(DC::CardiacNumberOfImages).AsInt() > 1)
- {
+ {
timeTag = DC::TriggerTime;
- }
+ }
else if (meta->GetAttributeValue(
DC::NumberOfTemporalPositions).AsInt() > 1)
- {
+ {
timeTag = DC::TemporalPositionIdentifier;
temporalSpacing =
meta->GetAttributeValue(DC::TemporalResolution).AsDouble();
- }
+ }
else if (meta->HasAttribute(DC::TemporalPositionIndex))
- {
+ {
timeTag = DC::TemporalPositionIndex;
- }
+ }
else if (meta->HasAttribute(DC::EchoTime))
- {
+ {
timeTag = DC::EchoTime;
- }
+ }
// position counter
int position = 0;
double lastTime = 0.0;
for (int ii = 0; ii < numFiles; ii++)
- {
+ {
int i = fileOrder[ii];
// get the instance number
@@ -686,33 +686,33 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
// force output of one single rectilinear volume
if (ii > 0 && !canSortByLocation && pv.IsValid())
- {
+ {
canSortByLocation = true;
volumeBreaks.push_back(info.size());
- }
+ }
int numberOfFrames =
meta->GetAttributeValue(i, DC::NumberOfFrames).AsInt();
if (numberOfFrames <= 1)
- {
+ {
double t = 0.0;
if (timeTag.GetGroup() != 0)
- {
+ {
t = meta->GetAttributeValue(i, timeTag).AsDouble();
- }
+ }
// adjust position only if time did not change
if (fabs(t - lastTime) < 1e-3 || ii == 0)
- {
+ {
position = inst;
lastTime = t;
- }
+ }
info.push_back(
vtkDICOMSliceSorterSortInfo(i, 0, inst, position, location, t));
- }
+ }
else
- {
+ {
// multi-frame image
double frameTimeSpacing = 0;
vtkDICOMValue timeVector;
@@ -721,212 +721,230 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
vtkDICOMValue locationVector;
vtkDICOMValue fip =
meta->GetAttributeValue(i, DC::FrameIncrementPointer);
- unsigned int n = fip.GetNumberOfValues();
- for (unsigned int j = 0; j < n; j++)
- {
+ size_t n = fip.GetNumberOfValues();
+ for (size_t j = 0; j < n; j++)
+ {
vtkDICOMTag tag = fip.GetTag(j);
if (tag == DC::FrameTime)
- { // for CINE
+ { // for CINE
frameTimeSpacing = meta->GetAttributeValue(i, tag).AsDouble();
- }
+ }
else if (tag == DC::FrameTimeVector)
- { // for CINE
+ { // for CINE
timeVector = meta->GetAttributeValue(i, tag);
- }
+ }
else if (tag == DC::SliceLocationVector)
- { // generic
+ { // generic
locationVector = meta->GetAttributeValue(i, tag);
canSortByLocation = true;
- }
+ }
else if (tag == DC::TimeSlotVector)
- { // for NM
+ { // for NM
timeSlotVector = meta->GetAttributeValue(i, tag);
- }
+ }
else if (tag == DC::SliceVector)
- { // for NM
+ { // for NM
sliceVector = meta->GetAttributeValue(i, tag);
- }
+ }
// in dynamic NM, the total number of time frames is the
// sum of the number of frames in all collected phases,
// we do not support dynamic NM yet
- }
+ }
if (timeSlotVector.IsValid() || sliceVector.IsValid())
- {
+ {
// tomographic NM
for (int k = 0; k < numberOfFrames; k++)
- {
+ {
double t = 0.0;
double frameloc = location;
if (k < static_cast<int>(timeSlotVector.GetNumberOfValues()))
- {
+ {
t = (timeSlotVector.GetDouble(k) - 1.0)*frameTimeSpacing;
- }
+ }
if (k < static_cast<int>(sliceVector.GetNumberOfValues()))
- {
+ {
position = sliceVector.GetInt(k) - 1;
frameloc += position*spacingSign;
- }
+ }
info.push_back(
vtkDICOMSliceSorterSortInfo(i, k, inst, position, frameloc, t));
- }
}
+ }
else
- {
+ {
// CINE
double t = 0.0;
for (int k = 0; k < numberOfFrames; k++)
- {
+ {
if (k > 0)
- {
+ {
if (k < static_cast<int>(timeVector.GetNumberOfValues()))
- {
+ {
frameTimeSpacing = timeVector.GetDouble(k);
- }
- t += frameTimeSpacing;
}
+ t += frameTimeSpacing;
+ }
if (k < static_cast<int>(locationVector.GetNumberOfValues()))
- {
+ {
location = locationVector.GetDouble(k);
location /= spacingBetweenSlices;
- }
+ }
info.push_back(
vtkDICOMSliceSorterSortInfo(i, k, inst, inst, location, t));
- }
}
}
}
}
+ }
// orientation changes suggest that multiple volumes are present
if (volumeBreaks.size() > 0)
- {
+ {
// count the number of unique positions
size_t pcount = 0;
for (size_t j = 0; j < info.size(); j++)
- {
+ {
int p = info[j].PositionNumber;
size_t k;
for (k = 0; k < j; k++)
- {
+ {
if (info[k].PositionNumber == p) { break; }
- }
- pcount += (k == j);
}
+ pcount += (k == j);
+ }
if (volumeBreaks.size() + 1 > pcount/2)
- {
+ {
// too many unique volumes would be created, assume
// that the acquisition was not rectilinear.
canSortByLocation = false;
- }
+ }
else
+ {
+ // breaks will be used to indicate new stacks
+ volumeBreaks.push_back(info.size());
+
+ size_t stt = 0;
+ size_t sttlen = volumeBreaks[0];
+ for (size_t k = 0; k < volumeBreaks.size(); k++)
{
- // load just one of the rectilinear stacks that are present
- size_t stt = strtoul(this->DesiredStackID, 0, 10);
- if (stt > volumeBreaks.size())
+ // build the list of StackIDs
+ vtkVariant var(k);
+ this->StackIDs->InsertNextValue(var.ToString());
+ size_t len = volumeBreaks[k] - (k == 0 ? 0 : volumeBreaks[k-1]);
+ // identify the first stack with multiple images
+ if (sttlen == 1 && len > sttlen)
{
- stt = 0;
+ stt = k;
+ sttlen = len;
}
- volumeBreaks.push_back(info.size());
+ }
+
+ // if DesiredStackID is set, use it
+ if (this->DesiredStackID[0] != '\0')
+ {
+ stt = strtoul(this->DesiredStackID, 0, 10);
+ }
+
+ // load just one of the rectilinear stacks that are present
+ if (stt >= volumeBreaks.size())
+ {
+ stt = 0;
+ }
info.erase(info.begin() + volumeBreaks[stt], info.end());
if (stt > 0)
- {
+ {
info.erase(info.begin(), info.begin() + volumeBreaks[stt-1]);
- }
- for (size_t k = 0; k < volumeBreaks.size(); k++)
- {
- vtkVariant var(k);
- this->StackIDs->InsertNextValue(var.ToString());
- }
}
}
+ }
// sort by position, count the number of slices per location
int numSlices = static_cast<int>(info.size());
int slicesPerLocation = 0;
if (numSlices > 1)
- {
+ {
if (canSortByLocation)
- {
+ {
std::stable_sort(info.begin(), info.end(),
vtkDICOMSliceSorterSortInfo::CompareLocation);
- }
+ }
else
- {
+ {
std::stable_sort(info.begin(), info.end(),
vtkDICOMSliceSorterSortInfo::ComparePosition);
- }
+ }
// look for slices at the same location
std::vector<vtkDICOMSliceSorterSortInfo>::iterator iter = info.begin();
int slicesAtThisLocation = 0;
while (iter != info.end())
- {
+ {
std::vector<vtkDICOMSliceSorterSortInfo>::iterator nextIter = iter + 1;
slicesAtThisLocation++;
bool positionIncreased = false;
if (nextIter != info.end())
- {
+ {
// use the tolerance built into CompareLocation
if (canSortByLocation)
- {
+ {
positionIncreased =
vtkDICOMSliceSorterSortInfo::CompareLocation(*iter, *nextIter);
- }
+ }
else
- {
+ {
positionIncreased =
vtkDICOMSliceSorterSortInfo::ComparePosition(*iter, *nextIter);
- }
}
+ }
if (nextIter == info.end() || positionIncreased)
- {
+ {
if (slicesPerLocation == 0)
- {
+ {
slicesPerLocation = slicesAtThisLocation;
- }
+ }
else if (slicesPerLocation != slicesAtThisLocation)
- {
+ {
slicesPerLocation = -1;
- }
- slicesAtThisLocation = 0;
}
- iter = nextIter;
+ slicesAtThisLocation = 0;
}
+ iter = nextIter;
}
+ }
if (slicesPerLocation == 0)
- {
+ {
slicesPerLocation = 1;
- }
+ }
else if (slicesPerLocation == -1)
- {
+ {
slicesPerLocation = 1;
vtkWarningMacro("Multidimensional series appears to be missing slices,"
" representation will be inaccurate.");
- }
+ }
// count number of unique time points
int temporalPositions = 0;
double tMin = VTK_DOUBLE_MAX;
double tMax = VTK_DOUBLE_MIN;
for (int i = 0; i < slicesPerLocation; i++)
- {
+ {
double d = info[i].Time;
tMin = (d > tMin ? tMin : d);
tMax = (d < tMax ? tMax : d);
int u = 1;
for (int j = 0; j < i; j++)
- {
+ {
u &= !(fabs(info[j].Time - d) < 1e-3);
- }
- temporalPositions += u;
}
+ temporalPositions += u;
+ }
// compute temporalSpacing from the apparent time spacing
if (temporalPositions > 1)
- {
+ {
temporalSpacing *= (tMax - tMin)/(temporalPositions - 1);
- }
+ }
// compute the number of slices in the output image
int spatialLocations = numSlices/slicesPerLocation;
@@ -934,34 +952,34 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
if (temporalPositions > 0 &&
this->TimeAsVector == 0 &&
this->DesiredTimeIndex < 0)
- {
+ {
locations *= temporalPositions;
- }
+ }
// recompute slice spacing from position info
if (canSortByLocation)
- {
+ {
double locDiff = 0;
if (locations > 1)
- {
+ {
int missing = 0;
locDiff = vtkDICOMSliceSorterComputeSpacing(info, &missing);
if (missing > 0)
- {
+ {
vtkWarningMacro("Series has " << missing <<
" gaps due to missing slices.");
- }
+ }
if (locations > spatialLocations)
- {
+ {
// squeeze time slices between spatial slices
locDiff *= spatialLocations*1.0/locations;
- }
}
+ }
if (locDiff > 0)
- {
+ {
spacingBetweenSlices *= locDiff;
- }
}
+ }
// write out the sorted indices
bool flipOrder = (this->ReverseSlices != 0);
@@ -970,14 +988,14 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
int numberOfComponents = filesPerOutputSlice;
int desiredTimeIndex = this->DesiredTimeIndex;
if (desiredTimeIndex < 0)
- {
+ {
desiredTimeIndex = 0;
- }
+ }
else
- {
+ {
desiredTimeIndex %= temporalPositions;
numberOfComponents /= temporalPositions;
- }
+ }
files->SetNumberOfComponents(numberOfComponents);
files->SetNumberOfTuples(locations);
@@ -985,21 +1003,21 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
frames->SetNumberOfTuples(locations);
for (int loc = 0; loc < locations; loc++)
- {
+ {
int l = loc/locationsPerSpatialLocation;
int j = loc - l*locationsPerSpatialLocation;
if (flipOrder)
- {
+ {
l = spatialLocations - l - 1;
- }
+ }
for (int k = 0; k < numberOfComponents; k++)
- {
+ {
int i = ((l*locationsPerSpatialLocation + j)*filesPerOutputSlice +
desiredTimeIndex*numberOfComponents + k);
files->SetComponent(loc, k, info[i].FileNumber);
frames->SetComponent(loc, k, info[i].FrameNumber);
- }
}
+ }
// save the slice spacing and time information
this->SliceSpacing = spacingBetweenSlices;
diff --git a/Source/vtkDICOMSliceSorter.h b/Source/vtkDICOMSliceSorter.h
index e8f54fe..1e643df 100644
--- a/Source/vtkDICOMSliceSorter.h
+++ b/Source/vtkDICOMSliceSorter.h
@@ -34,83 +34,104 @@ public:
void PrintSelf(ostream& os, vtkIndent indent);
static vtkDICOMSliceSorter *New();
- // Description:
- // Set the Stack ID of the stack to use, for named stacks.
- // If the series has multiple stacks, then by default only the
- // first stack will be used. This method allows you to select
- // a different stack, if you know the DICOM StackID for the stack.
+ //@{
+ //! Set the Stack ID of the stack to use, for named stacks.
+ /*!
+ * If the series has multiple stacks, then by default only the
+ * first stack will be used. This method allows you to select
+ * a different stack, if you know the DICOM StackID for the stack.
+ */
void SetDesiredStackID(const char *stackId);
const char *GetDesiredStackID() { return this->DesiredStackID; }
- // Description:
- // Get a list of the stacks that are present.
- // A stack is a contiguous array of slices that form a volume.
+ //! Get a list of the stacks that are present.
+ /*!
+ * A stack is a contiguous array of slices that form a volume.
+ */
vtkStringArray *GetStackIDs() { return this->StackIDs; }
-
- // Description:
- // Get an array that converts slice index to input file index.
- // The array can be two-dimensional and calling array->GetComponent(i,j)
- // will return the file index for slice i and scalar component j
- // for monochrome images, or for slice i and scalar component 3*j
- // for RGB images (or more precisely, at scalar component N*j where
- // N is the SamplesPerPixel value from the DICOM metadata). If the
- // data has just one component, then use j=0. Use this array to index
- // into the MetaData object to get the metadata for a particular slice.
+ //@}
+
+ //@{
+ //! Get an array that converts slice index to input file index.
+ /*!
+ * The array can be two-dimensional and calling array->GetComponent(i,j)
+ * will return the file index for slice i and scalar component j
+ * for monochrome images, or for slice i and scalar component 3*j
+ * for RGB images (or more precisely, at scalar component N*j where
+ * N is the SamplesPerPixel value from the DICOM metadata). If the
+ * data has just one component, then use j=0. Use this array to index
+ * into the MetaData object to get the metadata for a particular slice.
+ */
vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; }
- // Description:
- // Get an array that converts slice index to frame index.
- // The purpose of this array is to identify individual frames in
- // multi-frame DICOM files. The dimensions of this array are identical
- // to the FileIndexArray. Use FileIndexArray to identify the file,
- // then use FrameIndexArray to identify the frame within that file.
+ //! Get an array that converts slice index to frame index.
+ /*!
+ * The purpose of this array is to identify individual frames in
+ * multi-frame DICOM files. The dimensions of this array are identical
+ * to the FileIndexArray. Use FileIndexArray to identify the file,
+ * then use FrameIndexArray to identify the frame within that file.
+ */
vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; }
-
- // Description:
- // Set the meta data for the DICOM files.
- // The GetAttributeValue() method of vtkDICOMMetaData takes optional
- // file and frame indices, which specify the file and the frame within
- // that file to get the attribute from. If you have a slice index rather
- // than a file index and frame index, then use the FileIndexArray and
- // FrameIndexArray to convert the slice index into file and frame indices.
+ //@}
+
+ //@{
+ //! Set the meta data for the DICOM files.
+ /*!
+ * The GetAttributeValue() method of vtkDICOMMetaData takes optional
+ * file and frame indices, which specify the file and the frame within
+ * that file to get the attribute from. If you have a slice index rather
+ * than a file index and frame index, then use the FileIndexArray and
+ * FrameIndexArray to convert the slice index into file and frame indices.
+ */
void SetMetaData(vtkDICOMMetaData *meta);
vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
-
- // Description:
- // Read the time dimension as scalar components (default: Off).
- // If this is on, then each time point will be stored as a scalar
- // component in the image data. If the data has both a time dimension
- // and a vector dimension, then the number of components will be the
- // product of these two dimensions, i.e. the components will store
- // a sequence of vectors, one vector for each time point.
+ //@}
+
+ //@{
+ //! Read the time dimension as scalar components (default: Off).
+ /*!
+ * If this is on, then each time point will be stored as a scalar
+ * component in the image data. If the data has both a time dimension
+ * and a vector dimension, then the number of components will be the
+ * product of these two dimensions, i.e. the components will store
+ * a sequence of vectors, one vector for each time point.
+ */
vtkGetMacro(TimeAsVector, int);
vtkSetMacro(TimeAsVector, int);
vtkBooleanMacro(TimeAsVector, int);
+ //@}
- // Description:
- // Get the time dimension if the DICOM series has one.
+ //@{
+ //! Get the time dimension if the DICOM series has one.
int GetTimeDimension() { return this->TimeDimension; }
double GetTimeSpacing() { return this->TimeSpacing; }
+ //@}
- // Description:
- // Set the desired time index (set to -1 for all).
+ //@{
+ //! Set the desired time index (set to -1 for all).
vtkSetMacro(DesiredTimeIndex, int);
vtkGetMacro(DesiredTimeIndex, int);
+ //@}
- // Description:
- // Set whether to reverse the slice order.
- // This is desired if the images are to be flipped.
+ //@{
+ //! Set whether to reverse the slice order.
+ /*!
+ * This is desired if the images are to be flipped.
+ */
vtkGetMacro(ReverseSlices, int);
vtkSetMacro(ReverseSlices, int);
vtkBooleanMacro(ReverseSlices, int);
+ //@}
- // Description:
- // Get the slice spacing for the volume.
+ //@{
+ //! Get the slice spacing for the volume.
double GetSliceSpacing() { return this->SliceSpacing; }
+ //@}
- // Description:
- // Update the arrays.
+ //@{
+ //! Update the arrays.
void Update();
+ //@}
protected:
vtkDICOMSliceSorter();
@@ -153,8 +174,8 @@ protected:
double SliceSpacing;
private:
- vtkDICOMSliceSorter(const vtkDICOMSliceSorter&); // Not implemented.
- void operator=(const vtkDICOMSliceSorter&); // Not implemented.
+ vtkDICOMSliceSorter(const vtkDICOMSliceSorter&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMSliceSorter&) VTK_DELETE_FUNCTION;
};
#endif
diff --git a/Source/vtkDICOMSorter.h b/Source/vtkDICOMSorter.h
index fc07575..3dfdbb3 100644
--- a/Source/vtkDICOMSorter.h
+++ b/Source/vtkDICOMSorter.h
@@ -20,23 +20,27 @@
class VTKDICOM_EXPORT vtkDICOMSorter : public vtkDICOMFileSorter
{
public:
+ //@{
vtkTypeMacro(vtkDICOMSorter,vtkDICOMFileSorter);
void PrintSelf(ostream& os, vtkIndent indent);
static vtkDICOMSorter *New();
+ //@}
+ //@{
//! Get the first series in a particular study.
int GetFirstSeriesInStudy(int study);
//! Get the number of series in a particular study.
int GetNumberOfSeriesInStudy(int study);
+ //@}
protected:
vtkDICOMSorter();
~vtkDICOMSorter();
private:
- vtkDICOMSorter(const vtkDICOMSorter&); // Not implemented.
- void operator=(const vtkDICOMSorter&); // Not implemented.
+ vtkDICOMSorter(const vtkDICOMSorter&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMSorter&) VTK_DELETE_FUNCTION;
};
#endif
diff --git a/Source/vtkDICOMTag.cxx b/Source/vtkDICOMTag.cxx
index 385df68..4abe906 100644
--- a/Source/vtkDICOMTag.cxx
+++ b/Source/vtkDICOMTag.cxx
@@ -26,14 +26,14 @@ ostream& operator<<(ostream& o, const vtkDICOMTag& a)
char *cp = text;
*cp++ = '(';
for (int j = 0; j < 2; j++)
- {
+ {
for (int i = 12; i >= 0; i -= 4)
- {
+ {
char d = ((t[j] >> i) & 0x000F);
*cp++ = (d < 10 ? '0' + d : 'A' - 10 + d);
- }
- *cp++ = ',';
}
+ *cp++ = ',';
+ }
cp[-1] = ')';
*cp = '\0';
diff --git a/Source/vtkDICOMTag.h b/Source/vtkDICOMTag.h
index 7855975..92b9593 100644
--- a/Source/vtkDICOMTag.h
+++ b/Source/vtkDICOMTag.h
@@ -28,6 +28,7 @@ public:
unsigned int Key;
};
+ //@{
vtkDICOMTag() : Key(0) {}
//! Construct a tag from group, element numbers.
@@ -38,7 +39,9 @@ public:
//! Construct a tag object from a static tag.
vtkDICOMTag(StaticTag tag) : Key(tag.Key) {}
+ //@}
+ //@{
//! Get the 16-bit group identifier.
unsigned short GetGroup() const {
return static_cast<unsigned short>(this->Key >> 16); }
@@ -46,12 +49,16 @@ public:
//! Get the 16-bit element identifier.
unsigned short GetElement() const {
return static_cast<unsigned short>(this->Key); }
+ //@}
+ //@{
//! Compute a hash value, used for accelerating lookups.
unsigned int ComputeHash() const {
unsigned int h = (((this->Key >> 6) & 0x03FF03FF) ^ this->Key);
return (h ^ (h << 16)) >> 16; }
+ //@}
+ //@{
bool operator==(const vtkDICOMTag& b) const {
return (this->Key == b.Key); }
@@ -69,6 +76,7 @@ public:
bool operator>(const vtkDICOMTag& b) const {
return (this->Key > b.Key); }
+ //@}
private:
unsigned int Key;
diff --git a/Source/vtkDICOMTagPath.cxx b/Source/vtkDICOMTagPath.cxx
index 53ab85a..99e86a9 100644
--- a/Source/vtkDICOMTagPath.cxx
+++ b/Source/vtkDICOMTagPath.cxx
@@ -13,23 +13,72 @@
=========================================================================*/
#include "vtkDICOMTagPath.h"
+//----------------------------------------------------------------------------
ostream& operator<<(ostream& o, const vtkDICOMTagPath& a)
{
o << "[";
o << a.GetHead();
if (a.HasTail())
- {
+ {
vtkDICOMTagPath b = a;
while (b.HasTail())
- {
+ {
o << ",";
o << b.GetIndex();
o << ",";
o << b.GetHead();
b = b.GetTail();
- }
}
+ }
o << "]";
return o;
}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator==(const vtkDICOMTagPath& b) const
+{
+ return (this->Head == b.Head &&
+ this->Index == b.Index &&
+ this->Tail == b.Tail &&
+ this->Index2 == b.Index2 &&
+ this->Tail2 == b.Tail2);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator!=(const vtkDICOMTagPath& b) const
+{
+ return !(*this == b);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator<(const vtkDICOMTagPath& b) const
+{
+ return (this->Head < b.Head ||
+ (this->Head == b.Head &&
+ (this->Index < b.Index ||
+ (this->Index == b.Index &&
+ (this->Tail < b.Tail ||
+ (this->Tail == b.Tail &&
+ (this->Index2 < b.Index2 ||
+ (this->Index2 == b.Index2 &&
+ (this->Tail2 < b.Tail2)))))))));
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator>(const vtkDICOMTagPath& b) const
+{
+ return !(*this < b || *this == b);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator<=(const vtkDICOMTagPath& b) const
+{
+ return (*this < b || *this == b);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator>=(const vtkDICOMTagPath& b) const
+{
+ return !(*this < b);
+}
diff --git a/Source/vtkDICOMTagPath.h b/Source/vtkDICOMTagPath.h
index 6d9bdc5..6778d5b 100644
--- a/Source/vtkDICOMTagPath.h
+++ b/Source/vtkDICOMTagPath.h
@@ -27,6 +27,7 @@
class VTKDICOM_EXPORT vtkDICOMTagPath
{
public:
+ //@{
//! Construct a tag path with an empty head and tail.
vtkDICOMTagPath() : Head(), Index(0), Tail(), Index2(0), Tail2() {}
@@ -42,7 +43,9 @@ public:
//! Construct a tag path from just a single tag.
explicit vtkDICOMTagPath(vtkDICOMTag tag) :
Head(tag), Index(0), Tail(), Index2(0), Tail2() {}
+ //@}
+ //@{
//! If there is no tail, then Head is the end of the path.
bool HasTail() const {
return (this->Tail > vtkDICOMTag()); }
@@ -58,6 +61,16 @@ public:
//! Get the remainder of the path.
vtkDICOMTagPath GetTail() const {
return vtkDICOMTagPath(this->Tail, this->Index2, this->Tail2); }
+ //@}
+
+ //@{
+ bool operator==(const vtkDICOMTagPath& b) const;
+ bool operator!=(const vtkDICOMTagPath& b) const;
+ bool operator<=(const vtkDICOMTagPath& b) const;
+ bool operator>=(const vtkDICOMTagPath& b) const;
+ bool operator<(const vtkDICOMTagPath& b) const;
+ bool operator>(const vtkDICOMTagPath& b) const;
+ //@}
private:
vtkDICOMTag Head;
diff --git a/Source/vtkDICOMToRAS.cxx b/Source/vtkDICOMToRAS.cxx
index 9a75a97..4f3656b 100644
--- a/Source/vtkDICOMToRAS.cxx
+++ b/Source/vtkDICOMToRAS.cxx
@@ -39,22 +39,22 @@ vtkDICOMToRAS::vtkDICOMToRAS()
this->ReorderRows = 1;
this->ReorderColumns = 1;
for (int i = 0; i < 16; i++)
- {
+ {
this->Matrix[i] = 0.0;
- }
+ }
}
//----------------------------------------------------------------------------
vtkDICOMToRAS::~vtkDICOMToRAS()
{
if (this->RASMatrix)
- {
+ {
this->RASMatrix->Delete();
- }
+ }
if (this->PatientMatrix)
- {
+ {
this->PatientMatrix->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -64,35 +64,35 @@ void vtkDICOMToRAS::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "PatientMatrix:";
if (this->PatientMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "RASMatrix:";
if (this->RASMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->RASMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "RASToDICOM: " << this->RASToDICOM << "\n";
@@ -111,10 +111,10 @@ void vtkDICOMToRAS::SetRASToDICOM(int val)
{
val = (val != 0);
if (val != this->RASToDICOM)
- {
+ {
this->RASToDICOM = val;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -122,10 +122,10 @@ void vtkDICOMToRAS::SetRASMatrixHasPosition(int val)
{
val = (val != 0);
if (val != this->RASMatrixHasPosition)
- {
+ {
this->RASMatrixHasPosition = val;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -133,10 +133,10 @@ void vtkDICOMToRAS::SetAllowColumnReordering(int val)
{
val = (val != 0);
if (val != this->AllowColumnReordering)
- {
+ {
this->AllowColumnReordering = val;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -144,10 +144,10 @@ void vtkDICOMToRAS::SetAllowRowReordering(int val)
{
val = (val != 0);
if (val != this->AllowRowReordering)
- {
+ {
this->AllowRowReordering = val;
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -160,10 +160,10 @@ void vtkDICOMToRAS::CheckNeedToReorder()
vtkMatrix4x4 *inputMatrix = (this->RASToDICOM == 0 ?
this->PatientMatrix : this->RASMatrix);
if (inputMatrix)
- {
+ {
inputMatrix->MultiplyPoint(hdir, hdir);
inputMatrix->MultiplyPoint(vdir, vdir);
- }
+ }
// do the DICOM-to-RAS sign changes
hdir[0] = -hdir[0];
@@ -172,7 +172,7 @@ void vtkDICOMToRAS::CheckNeedToReorder()
vdir[1] = -vdir[1];
if (this->RASToDICOM)
- {
+ {
// for DICOM, hdir should be left (+x) or posterior (+y)
this->ReorderColumns = (this->AllowColumnReordering &&
hdir[0] + hdir[1] < 0);
@@ -180,9 +180,9 @@ void vtkDICOMToRAS::CheckNeedToReorder()
// for RAS, vdir should be inferior (-z) or posterior (+y)
this->ReorderRows = (this->AllowRowReordering &&
vdir[1] - vdir[2] < 0);
- }
+ }
else
- {
+ {
// for RAS, hdir should be right (+x) or anterior (+y)
this->ReorderColumns = (this->AllowColumnReordering &&
hdir[0] + hdir[1] < 0);
@@ -190,7 +190,7 @@ void vtkDICOMToRAS::CheckNeedToReorder()
// for RAS, vdir should be superior (+z) or anterior (+y)
this->ReorderRows = (this->AllowRowReordering &&
vdir[1] + vdir[2] < 0);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -200,17 +200,17 @@ void vtkDICOMToRAS::ComputeMatrix(
double *matrix = this->Matrix;
if (this->PatientMatrix && this->RASToDICOM == 0)
- {
+ {
vtkMatrix4x4::DeepCopy(matrix, this->PatientMatrix);
- }
+ }
else if (this->RASMatrix && this->RASToDICOM != 0)
- {
+ {
vtkMatrix4x4::DeepCopy(matrix, this->RASMatrix);
- }
+ }
else
- {
+ {
vtkMatrix4x4::Identity(matrix);
- }
+ }
// what corner of the input image will become the (0,0,0) corner
// of the output image?
@@ -221,7 +221,7 @@ void vtkDICOMToRAS::ComputeMatrix(
double bounds[6];
for (int i = 0; i < 3; i++)
- {
+ {
bounds[2*i] = extent[2*i]*spacing[i] + origin[i];
bounds[2*i + 1] = extent[2*i + 1]*spacing[i] + origin[i];
origin[i] = bounds[2*i + flip[i]];
@@ -230,26 +230,26 @@ void vtkDICOMToRAS::ComputeMatrix(
extent[2*i] = 0;
if (flip[i])
- {
+ {
// reverse along columns for flips
origin[i] = -origin[i];
matrix[i] = -matrix[i];
matrix[4 + i] = -matrix[4 + i];
matrix[8 + i] = -matrix[8 + i];
- }
+ }
if (i == 0 || i == 1)
- {
+ {
// reverse along rows for LPS to RAS conversion
matrix[4*i] = -matrix[4*i];
matrix[4*i + 1] = -matrix[4*i + 1];
matrix[4*i + 2] = -matrix[4*i + 2];
matrix[4*i + 3] = -matrix[4*i + 3];
- }
}
+ }
if (this->RASMatrixHasPosition || this->RASToDICOM)
- {
+ {
// origin moves into position (last column of matrix)
double offset[4];
offset[0] = origin[0];
@@ -266,9 +266,9 @@ void vtkDICOMToRAS::ComputeMatrix(
origin[0] = 0.0;
origin[1] = 0.0;
origin[2] = 0.0;
- }
+ }
else
- {
+ {
// position moves into origin
double offset[4];
offset[0] = matrix[3];
@@ -287,7 +287,7 @@ void vtkDICOMToRAS::ComputeMatrix(
origin[0] += offset[0];
origin[1] += offset[1];
origin[2] += offset[2];
- }
+ }
}
//----------------------------------------------------------------------------
@@ -298,36 +298,36 @@ void vtkDICOMToRAS::UpdateMatrix()
vtkMatrix4x4 *outMatrix;
if (this->RASToDICOM == 0)
- {
+ {
if (this->RASMatrix == 0)
- {
+ {
this->RASMatrix = vtkMatrix4x4::New();
- }
- outMatrix = this->RASMatrix;
}
+ outMatrix = this->RASMatrix;
+ }
else
- {
+ {
if (this->PatientMatrix == 0)
- {
+ {
this->PatientMatrix = vtkMatrix4x4::New();
- }
- outMatrix = this->PatientMatrix;
}
+ outMatrix = this->PatientMatrix;
+ }
const double *inElements = this->Matrix;
double *outElements = *outMatrix->Element;
bool changed = false;
for (int i = 0; i < 16; i++)
- {
+ {
changed |= (inElements[i] != outElements[i]);
- }
+ }
// this ensures that the timestamp isn't changed unless values changed
if (changed)
- {
+ {
outMatrix->DeepCopy(this->Matrix);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -354,9 +354,9 @@ int vtkDICOMToRAS::RequestInformation(
// if converting to DICOM, add patient matrix to information
if (this->RASToDICOM && this->RASMatrix)
- {
+ {
outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), this->Matrix, 16);
- }
+ }
outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6);
outInfo->Set(vtkDataObject::SPACING(), spacing, 3);
@@ -388,17 +388,17 @@ int vtkDICOMToRAS::RequestUpdateExtent(
flip[2] = flip[0] ^ flip[1];
for (int i = 0; i < 3; i++)
- {
+ {
int offset = outExt[2*i];
int size = outExt[2*i + 1] - outExt[2*i] + 1;
int wholeSize = wholeExt[2*i + 1] - wholeExt[2*i] + 1;
if (flip[i])
- {
+ {
offset = wholeSize - size - offset;
- }
+ }
inExt[2*i] = wholeExt[2*i] + offset;
inExt[2*i + 1] = inExt[2*i] + size - 1;
- }
+ }
inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), outExt, 6);
@@ -414,19 +414,19 @@ int vtkDICOMToRAS::RequestData(
// output the matrix that goes with the image
vtkMatrix4x4 *outMatrix = 0;
if (this->RASToDICOM == 0)
- {
+ {
if (this->RASMatrix == 0)
- {
+ {
this->RASMatrix = vtkMatrix4x4::New();
- }
- outMatrix = this->RASMatrix;
}
+ outMatrix = this->RASMatrix;
+ }
else
- {
+ {
if (this->PatientMatrix == 0)
- {
+ {
this->PatientMatrix = vtkMatrix4x4::New();
- }
+ }
outMatrix = this->PatientMatrix;
// copy the supplied matrix to the data information
@@ -434,22 +434,22 @@ int vtkDICOMToRAS::RequestData(
vtkDataObject *outData = outInfo->Get(vtkDataObject::DATA_OBJECT());
vtkInformation *dataInfo = outData->GetInformation();
dataInfo->CopyEntry(outInfo, vtkDICOMAlgorithm::PATIENT_MATRIX());
- }
+ }
const double *inElements = this->Matrix;
double *outElements = *outMatrix->Element;
bool changed = false;
for (int i = 0; i < 16; i++)
- {
+ {
changed |= (inElements[i] != outElements[i]);
- }
+ }
// this ensures that the timestamp isn't changed unless values changed
if (changed)
- {
+ {
outMatrix->DeepCopy(this->Matrix);
- }
+ }
return this->Superclass::RequestData(request, inputVector, outputVector);
}
@@ -479,20 +479,20 @@ void vtkDICOMToRASExecute(
vtkIdType inIncY = inIncX*(inExt[1] - inExt[0] + 1);
vtkIdType inIncZ = inIncY*(inExt[3] - inExt[2] + 1);
if (flip[0])
- {
+ {
inPtr += inIncX*(sizeX - 1);
inIncX = -inIncX;
- }
+ }
if (flip[1])
- {
+ {
inPtr += inIncY*(sizeY - 1);
inIncY = -inIncY;
- }
+ }
if (flip[2])
- {
+ {
inPtr += inIncZ*(sizeZ - 1);
inIncZ = -inIncZ;
- }
+ }
// progress tracking
vtkIdType progressGoal = static_cast<vtkIdType>(sizeZ)*sizeY;
@@ -502,41 +502,41 @@ void vtkDICOMToRASExecute(
// loop through the data and rearrange it
const T *inPtrZ = inPtr;
for (int k = 0; k < sizeZ; k++)
- {
+ {
const T *inPtrY = inPtrZ;
for (int j = 0; j < sizeY; j++)
- {
+ {
if (progress != NULL && (progressCount % progressStep) == 0)
- {
+ {
progress->UpdateProgress(progressCount*1.0/progressGoal);
- }
+ }
progressCount++;
const T *inPtrX = inPtrY;
if (numComponents == 1)
- {
+ {
for (int i = 0; i < sizeX; i++)
- {
+ {
*outPtr++ = *inPtrX;
inPtrX += inIncX;
- }
}
+ }
else
- {
+ {
for (int i = 0; i < sizeX; i++)
- {
+ {
int c = numComponents;
const T *inPtrC = inPtrX;
do { *outPtr++ = *inPtrC++; } while (--c);
inPtrX += inIncX;
- }
}
+ }
inPtrY += inIncY;
outPtr += outSkipY;
- }
+ }
inPtrZ += inIncZ;
outPtr += outSkipZ;
- }
+ }
}
} // end anonymous namespace
@@ -569,17 +569,17 @@ void vtkDICOMToRAS::ThreadedRequestData(
int inExecuteExt[6];
for (int i = 0; i < 3; i++)
- {
+ {
int offset = outExecuteExt[2*i];
int size = outExecuteExt[2*i + 1] - outExecuteExt[2*i] + 1;
int wholeSize = inWholeExt[2*i + 1] - inWholeExt[2*i] + 1;
if (flip[i])
- {
+ {
offset = wholeSize - size - offset;
- }
+ }
inExecuteExt[2*i] = inWholeExt[2*i] + offset;
inExecuteExt[2*i + 1] = inExecuteExt[2*i] + size - 1;
- }
+ }
int numComponents = input->GetNumberOfScalarComponents();
@@ -594,21 +594,21 @@ void vtkDICOMToRAS::ThreadedRequestData(
// call the execute method
if (outScalarType == inScalarType)
- {
+ {
switch (inScalarType)
- {
+ {
vtkTemplateAliasMacro(
vtkDICOMToRASExecute(
static_cast<const VTK_TT *>(inPtr), static_cast<VTK_TT *>(outPtr),
flip, numComponents, inExt, outExt, outExecuteExt, progress));
default:
vtkErrorMacro("Execute: Unknown ScalarType");
- }
}
+ }
else
- {
+ {
vtkErrorMacro("ThreadedRequestData: output scalar type does not match "
"input scalar type");
- }
+ }
}
diff --git a/Source/vtkDICOMToRAS.h b/Source/vtkDICOMToRAS.h
index 0cc76ac..d119149 100644
--- a/Source/vtkDICOMToRAS.h
+++ b/Source/vtkDICOMToRAS.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2012-2015 David Gobbi
+ Copyright (c) 2012-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,17 +11,17 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMToRAS - Convert DICOM orientation to RAS orientation
-// .SECTION Description
-// This class will modify an image and its position-and-orientation matrix
-// so that the patient coordinate system follows the conventions of NIFTI
-// and MINC, i.e. the x, y, and z axes will point in the right, anterior,
-// and superior directions respectively. Optionally, the row and column
-// ordering of the image will also be modified so that the row direction
-// preferentially points right or anterior, and the column direction
-// preferentially points superior or anterior.
-// .SECTION Thanks
-// This class was contributed to VTK by David Gobbi.
+/*! \class vtkDICOMToRAS
+ * \brief Convert DICOM orientation to RAS orientation
+ *
+ * This class will modify an image and its position-and-orientation matrix
+ * so that the patient coordinate system follows the conventions of NIFTI
+ * and MINC, i.e. the x, y, and z axes will point in the right, anterior,
+ * and superior directions respectively. Optionally, the row and column
+ * ordering of the image will also be modified so that the row direction
+ * preferentially points right or anterior, and the column direction
+ * preferentially points superior or anterior.
+ */
#ifndef vtkDICOMToRAS_h
#define vtkDICOMToRAS_h
@@ -35,90 +35,107 @@ class vtkMatrix4x4;
class VTKDICOM_EXPORT vtkDICOMToRAS : public vtkThreadedImageAlgorithm
{
public:
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkDICOMToRAS *New();
vtkTypeMacro(vtkDICOMToRAS, vtkThreadedImageAlgorithm);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Perform RAS to DICOM instead of DICOM to RAS.
+ //@{
+ //! Perform RAS to DICOM instead of DICOM to RAS.
void SetRASToDICOM(int v);
void RASToDICOMOn() { this->SetRASToDICOM(1); }
void RASToDICOMOff() { this->SetRASToDICOM(0); }
int GetRASToDICOM() { return this->RASToDICOM; }
-
- // Description:
- // Get a matrix to place the image within DICOM patient coords.
- // This matrix is constructed from the ImageOrientationPatient
- // and ImagePositionPatient meta data attributes. See the
- // SetMemoryRowOrder method for additional information.
+ //@}
+
+ //@{
+ //! Get a matrix to place the image within DICOM patient coords.
+ /*!
+ * This matrix is constructed from the ImageOrientationPatient
+ * and ImagePositionPatient meta data attributes. See the
+ * SetMemoryRowOrder method for additional information.
+ */
void SetPatientMatrix(vtkMatrix4x4 *matrix);
vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
-
- // Description:
- // Get a matrix that follows the RAS convention that can be used
- // with the output image. This matrix is only valid for the output
- // image, it is not valid for the input image.
+ //@}
+
+ //@{
+ //! Get a matrix that follows the RAS convention that can be used
+ /*!
+ * with the output image. This matrix is only valid for the output
+ * image, it is not valid for the input image.
+ */
void SetRASMatrix(vtkMatrix4x4 *matrix);
vtkMatrix4x4 *GetRASMatrix() { return this->RASMatrix; }
-
- // Description:
- // Update the RAS matrix without updating the output data.
- // This requires that an input has been set, because the origin,
- // spacing, and extent of the input data must be known in order
- // to compute the matrix.
+ //@}
+
+ //@{
+ //! Update the RAS matrix without updating the output data.
+ /*!
+ * This requires that an input has been set, because the origin,
+ * spacing, and extent of the input data must be known in order
+ * to compute the matrix.
+ */
void UpdateMatrix();
-
- // Description:
- // Specify whether the RAS matrix should include the position in its
- // final column (NIFTI style), or whether the final column should be
- // zero and the position instead used to compute a new Origin for the
- // output image. If this option is On, then the Origin of the output
- // image will be (0,0,0), and if it is Off, then the position stored
- // the matrix will be (0,0,0).
+ //@}
+
+ //@{
+ //! Specify whether the RAS matrix should include the position in its
+ /*!
+ * final column (NIFTI style), or whether the final column should be
+ * zero and the position instead used to compute a new Origin for the
+ * output image. If this option is On, then the Origin of the output
+ * image will be (0,0,0), and if it is Off, then the position stored
+ * the matrix will be (0,0,0).
+ */
void SetRASMatrixHasPosition(int v);
void RASMatrixHasPositionOn() { this->SetRASMatrixHasPosition(1); }
void RASMatrixHasPositionOff() { this->SetRASMatrixHasPosition(0); }
int GetRASMatrixHasPosition() { return this->RASMatrixHasPosition; }
-
- // Description:
- // Allow the columns to be reordered so that columns with higher indices
- // are further to the right or further anterior. Note that if you turn
- // this option on, then you are implicitly allowing slice reordering to
- // occur as well. If you turn both ColumnReordering and SliceReordering
- // off, then the input data will be directly passed to the output.
+ //@}
+
+ //@{
+ //! Allow the columns to be reordered so that columns with higher indices
+ /*!
+ * are further to the right or further anterior. Note that if you turn
+ * this option on, then you are implicitly allowing slice reordering to
+ * occur as well. If you turn both ColumnReordering and SliceReordering
+ * off, then the input data will be directly passed to the output.
+ */
void SetAllowColumnReordering(int v);
void AllowColumnReorderingOn() { this->SetAllowColumnReordering(1); }
void AllowColumnReorderingOff() { this->SetAllowColumnReordering(0); }
int GetAllowColumnReordering() { return this->AllowColumnReordering; }
-
- // Description:
- // Allow the rows to be reordered so that rows with higher indices
- // are further superior or further anterior. Note that if you turn
- // this option on, then you are implicitly allowing slice reordering to
- // occur as well. If you turn both ColumnReordering and SliceReordering
- // off, then the input data will be directly passed to the output.
+ //@}
+
+ //@{
+ //! Allow the rows to be reordered so that rows with higher indices
+ /*!
+ * are further superior or further anterior. Note that if you turn
+ * this option on, then you are implicitly allowing slice reordering to
+ * occur as well. If you turn both ColumnReordering and SliceReordering
+ * off, then the input data will be directly passed to the output.
+ */
void SetAllowRowReordering(int v);
void AllowRowReorderingOn() { this->SetAllowRowReordering(1); }
void AllowRowReorderingOff() { this->SetAllowRowReordering(0); }
int GetAllowRowReordering() { return this->AllowRowReordering; }
+ //@}
protected:
vtkDICOMToRAS();
~vtkDICOMToRAS();
- // Description:
- // Check whether the data will be reordered in cols or rows.
+ //! Check whether the data will be reordered in cols or rows.
void CheckNeedToReorder();
- // Description:
- // Compute the RAS matrix and store it in this->Matrix.
- // If extent doesn't start at zero, make it so that it does.
- // Also change the origin if RASMatrixHasPosition is Off.
+ //! Compute the RAS matrix and store it in this->Matrix.
+ /*!
+ * If extent doesn't start at zero, make it so that it does.
+ * Also change the origin if RASMatrixHasPosition is Off.
+ */
void ComputeMatrix(int extent[6], double spacing[3], double origin[3]);
virtual int RequestInformation(
@@ -150,8 +167,8 @@ protected:
double Matrix[16];
private:
- vtkDICOMToRAS(const vtkDICOMToRAS&); // Not implemented.
- void operator=(const vtkDICOMToRAS&); // Not implemented.
+ vtkDICOMToRAS(const vtkDICOMToRAS&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMToRAS&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMToRAS_h
diff --git a/Source/vtkDICOMUIDGenerator.cxx b/Source/vtkDICOMUIDGenerator.cxx
new file mode 100644
index 0000000..2e5f61b
--- /dev/null
+++ b/Source/vtkDICOMUIDGenerator.cxx
@@ -0,0 +1,523 @@
+/*=========================================================================
+
+ Program: DICOM for VTK
+
+ Copyright (c) 2012-2016 David Gobbi
+ All rights reserved.
+ See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkDICOMUIDGenerator.h"
+
+#include "vtkDICOMFile.h"
+#include "vtkDICOMUtilities.h"
+
+#include <vtkObjectFactory.h>
+#include <vtkStringArray.h>
+
+#include <string.h>
+
+// needed for random number generation and time
+#ifdef _WIN32
+#include <windows.h>
+#include <wincrypt.h>
+#endif
+
+vtkStandardNewMacro(vtkDICOMUIDGenerator);
+vtkDICOMUIDGenerator *vtkDICOMUIDGenerator::Default;
+
+//----------------------------------------------------------------------------
+// A helper class to delete static variables when program exits.
+static unsigned int vtkDICOMUIDGeneratorInitializerCounter;
+
+// Perform initialization of static variables.
+vtkDICOMUIDGeneratorInitializer::vtkDICOMUIDGeneratorInitializer()
+{
+ if (vtkDICOMUIDGeneratorInitializerCounter++ == 0)
+ {
+ vtkDICOMUIDGenerator::Default = vtkDICOMUIDGenerator::New();
+ }
+}
+
+// Perform cleanup of static variables.
+vtkDICOMUIDGeneratorInitializer::~vtkDICOMUIDGeneratorInitializer()
+{
+ if (--vtkDICOMUIDGeneratorInitializerCounter == 0)
+ {
+ if (vtkDICOMUIDGenerator::Default)
+ {
+ vtkDICOMUIDGenerator::Default->Delete();
+ }
+ }
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMUIDGenerator::vtkDICOMUIDGenerator()
+{
+ this->UIDPrefix = NULL;
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMUIDGenerator::~vtkDICOMUIDGenerator()
+{
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::PrintSelf(ostream& os, vtkIndent indent)
+{
+ this->Superclass::PrintSelf(os, indent);
+
+ os << indent << "UIDPrefix: "
+ << (this->UIDPrefix ? this->UIDPrefix : "(NULL)") << "\n";
+}
+
+//----------------------------------------------------------------------------
+const char *vtkDICOMUIDGenerator::GetUIDPrefix()
+{
+ const char *prefix = this->UIDPrefix;
+ if (prefix == NULL)
+ {
+ prefix = vtkDICOMUtilities::GetUIDPrefix();
+ }
+ return prefix;
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::SetUIDPrefix(const char *uid)
+{
+ if (uid)
+ {
+ this->UIDPrefix = this->UIDPrefixStore;
+ strncpy(this->UIDPrefix, uid, 63);
+ this->UIDPrefix[63] = '\0';
+ }
+ else
+ {
+ this->UIDPrefix = NULL;
+ }
+}
+
+//----------------------------------------------------------------------------
+namespace {
+
+// divide a hex string by 10, return remainder
+int vtkDivideHexStringBy10(char *value)
+{
+ char *cp = value;
+
+ // convert hex string to binary
+ unsigned int x = 0;
+ while (*cp != '\0')
+ {
+ // skip any hyphens
+ if (*cp == '-')
+ {
+ cp++;
+ continue;
+ }
+
+ // convert hex digit to a nibble
+ unsigned int d = *cp;
+ if ((d -= '0') > 9)
+ {
+ if ((d -= ('A' - '0' - 10)) > 15)
+ {
+ d -= ('a' - 'A');
+ }
+ }
+
+ // append the nibble
+ x <<= 4;
+ x += d;
+
+ // divide by 10
+ unsigned int y = (10 << 3);
+ unsigned int z = 0;
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ z <<= 1;
+ int nx = x - y;
+ if (nx >= 0)
+ {
+ x = nx;
+ z++;
+ }
+ y >>= 1;
+ }
+
+ // convert quotient to new hex digit
+ if ((z += '0') > '9')
+ {
+ z += ('A' - '0' - 10);
+ }
+
+ *cp++ = static_cast<char>(z);
+ }
+
+ // return the remainder
+ return static_cast<int>(x);
+}
+
+// convert a hex uuid string to a decimal uid string, the
+// supplied uid will be at most 1.5 times as long as the uuid
+void vtkConvertHexToDecimal(const char *uuid, char *uid)
+{
+ // max characters in a uuid and uid
+ const unsigned int uuidlen = 36;
+ const unsigned int uidlen = 64;
+
+ char x[uuidlen + 4];
+ char y[uidlen + 4];
+
+ if (uuid[0] == '0' && uuid[1] == 'x')
+ {
+ uuid += 2;
+ }
+
+ strncpy(x, uuid, uuidlen);
+ x[uuidlen] = '\0';
+
+ char *cp = y + uidlen;
+ *cp = '\0';
+
+ char *dp = x;
+ do
+ {
+ *(--cp) = vtkDivideHexStringBy10(x) + '0';
+ // remove any leading zeros
+ while (*dp == '0' || *dp == '-')
+ {
+ dp++;
+ }
+ }
+ while (*dp != '\0');
+
+ // copy out the result
+ strcpy(uid, cp);
+}
+
+// convert a byte into two hexadecimal digits
+inline void vtkGenerateHexDigits(unsigned char y, char cp[2])
+{
+ unsigned int z = (y >> 4);
+ for (int j = 0; j < 2; j++)
+ {
+ if ((z += '0') > '9')
+ {
+ z += ('A' - '0' - 10);
+ }
+ cp[j] = static_cast<char>(z);
+ z = (y & 0x0F);
+ }
+}
+
+// convert n bytes into 2*n hexadecimal digits
+void vtkConvertBytesToHex(const unsigned char *bytes, size_t n, char *cp)
+{
+ for (size_t i = 0; i < n; i++)
+ {
+ vtkGenerateHexDigits(*bytes, cp);
+ bytes++;
+ cp += 2;
+ }
+ *cp = '\0';
+}
+
+// generate a 36-character uuid from a 128-bit random number
+// (the supplied pointer must have 37 bytes of available space)
+void vtkConvertRandomToUUID(const unsigned char bytes[16], char *uuid)
+{
+ // copy it so that we can modify it
+ char r[16];
+ for (int j = 0; j < 16; j++)
+ {
+ r[j] = bytes[j];
+ }
+
+ // set bits to show that this is a version 4 uuid
+ r[6] = ((r[6] & 0x0f) | 0x40);
+
+ // set the uuid variant to "0b10" (0b == binary)
+ r[8] = ((r[8] & 0x3f) | 0x80);
+
+ // convert the uuid into hexidecimal text
+ char *cp = uuid;
+ for (unsigned int i = 0; i < 16; i++)
+ {
+ // add hyphens to the uuid (just to be pedantic)
+ if (i == 4 || i == 6 || i == 8 || i == 10)
+ {
+ *cp++ = '-';
+ }
+
+ vtkGenerateHexDigits(r[i], cp);
+ cp += 2;
+ }
+
+ *cp = '\0';
+}
+
+// convert a 36-character uuid to a 44-character uid
+void vtkConvertUUIDToUID(const char *uuid, char *uid)
+{
+ strncpy(uid, "2.25.", 5);
+ vtkConvertHexToDecimal(uuid, uid + 5);
+}
+
+// read from the random number generator
+void vtkGenerateRandomBytes(unsigned char *bytes, vtkIdType n)
+{
+ int r = 0;
+#ifdef _WIN32
+ // use the Windows cryptography interface (WinXP and later)
+ HCRYPTPROV hProv;
+ r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_SILENT);
+ if (r == 0 && GetLastError() == NTE_BAD_KEYSET)
+ {
+ r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_SILENT | CRYPT_NEWKEYSET);
+ }
+ if (r != 0)
+ {
+ r = CryptGenRandom(hProv, n, reinterpret_cast<BYTE *>(bytes));
+ CryptReleaseContext(hProv, 0);
+ }
+#else
+ vtkDICOMFile infile("/dev/urandom", vtkDICOMFile::In);
+ if (infile.GetError() == 0)
+ {
+ size_t m = infile.Read(bytes, n);
+ r = (m == static_cast<size_t>(n));
+ infile.Close();
+ }
+#endif
+ if (r == 0)
+ {
+ memset(bytes, '\0', n);
+ vtkGenericWarningMacro(
+ "vtkDICOMUIDGenerator::GenerateUID() failed to read from "
+ "the random number generator");
+ }
+}
+
+// to add a little bit of recognizability to UIDs
+char vtkDICOMTagToDigit(vtkDICOMTag tag)
+{
+ char d = '1';
+
+ if (tag == DC::SOPInstanceUID ||
+ tag == DC::MediaStorageSOPInstanceUID)
+ {
+ d = '2';
+ }
+ else if (tag == DC::SeriesInstanceUID ||
+ tag == DC::ConcatenationUID)
+ {
+ d = '3';
+ }
+ else if (tag == DC::StudyInstanceUID)
+ {
+ d = '4';
+ }
+ else if (tag == DC::FrameOfReferenceUID ||
+ tag == DC::VolumeFrameOfReferenceUID ||
+ tag == DC::SourceFrameOfReferenceUID ||
+ tag == DC::SynchronizationFrameOfReferenceUID ||
+ tag == DC::TableFrameOfReferenceUID)
+ {
+ d = '5';
+ }
+
+ return d;
+}
+
+// get the number of random bytes to generate after this prefix
+vtkIdType vtkRandomBytesForPrefix(const char *prefix)
+{
+ size_t n = strlen(prefix);
+ if (n > 0 && prefix[n-1] != '.')
+ {
+ n++;
+ }
+ n = 64 - n;
+ vtkIdType m = 0;
+ if (n > 40)
+ {
+ m = 16; // use 128 bit random number
+ }
+ else
+ {
+ m = 12; // use 96 bit random number
+ }
+
+ return m;
+}
+
+// generate a prefixed UID using the provided random bytes
+void vtkGeneratePrefixedUID(
+ const unsigned char *r, vtkIdType m, const char *prefix, char d,
+ char uid[64])
+{
+ size_t i = 0;
+ while (*prefix != '\0' && i < 62)
+ {
+ uid[i++] = *prefix++;
+ }
+ if (i > 0 && i < 62 && uid[i-1] != '.')
+ {
+ uid[i++] = '.';
+ }
+
+ char hexs[36];
+ vtkConvertBytesToHex(r, m, hexs);
+ char decs[40];
+ vtkConvertHexToDecimal(hexs, decs);
+
+ // generate the leading digit as the UID type
+ if (d >= '1' && d <= '9')
+ {
+ // decimal digits required to store an integer with N-1 bytes
+ static const int maxDigits[16] = {
+ 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39
+ };
+
+ uid[i++] = d;
+ // add zeros so all uids will be the same length
+ size_t n = maxDigits[(m-1) & 0x0f];
+ for (size_t l = strlen(decs); l < n && i < 63; l++)
+ {
+ uid[i++] = '0';
+ }
+ }
+
+ const char *cp = decs;
+ while (i < 63 && *cp != '\0')
+ {
+ uid[i++] = *cp++;
+ }
+
+ while (i < 64)
+ {
+ uid[i++] = '\0';
+ }
+}
+
+} // end anonymous namespace
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMUIDGenerator::GenerateUID(vtkDICOMTag tag)
+{
+ const char *prefix = this->GetUIDPrefix();
+ char uid[64];
+
+ if (prefix[0] == '\0' ||
+ (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
+ prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')))
+ {
+ // generate a 128-bit random number
+ unsigned char r[16];
+ vtkGenerateRandomBytes(r, 16);
+
+ // convert to a hex uuid
+ char uuid[40];
+ vtkConvertRandomToUUID(r, uuid);
+
+ // convert the hex uuid into a DICOM UID with root 2.25
+ vtkConvertUUIDToUID(uuid, uid);
+ }
+ else
+ {
+ // after prefix, add a "UID type" digit followed by random digits
+ unsigned char r[16];
+ vtkIdType m = vtkRandomBytesForPrefix(prefix);
+ vtkGenerateRandomBytes(r, m);
+ char d = vtkDICOMTagToDigit(tag);
+ vtkGeneratePrefixedUID(r, m, prefix, d, uid);
+ }
+
+ return uid;
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids)
+{
+ const char *prefix = this->GetUIDPrefix();
+
+ bool useUUIDForUID =
+ (prefix[0] == '\0' ||
+ (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
+ prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')));
+
+ vtkIdType m = 16;
+ char d = '0';
+ if (!useUUIDForUID)
+ {
+ m = vtkRandomBytesForPrefix(prefix);
+ d = vtkDICOMTagToDigit(tag);
+ }
+
+ // read from random number generator
+ vtkIdType n = uids->GetNumberOfValues();
+ unsigned char *r = new unsigned char[n*m];
+ vtkGenerateRandomBytes(r, n*m);
+
+ for (vtkIdType i = 0; i < n; i++)
+ {
+ char uid[64];
+
+ if (useUUIDForUID)
+ {
+ char uuid[40];
+ vtkConvertRandomToUUID(r + i*m, uuid);
+ vtkConvertUUIDToUID(uuid, uid);
+ }
+ else
+ {
+ vtkGeneratePrefixedUID(r + i*m, m, prefix, d, uid);
+ }
+
+ // put uids into the array in order (simple insertion sort)
+ vtkIdType j = 0;
+ for (; j < i; j++)
+ {
+ if (vtkDICOMUtilities::CompareUIDs(uids->GetValue(j), uid) > 0)
+ {
+ break;
+ }
+ }
+ for (vtkIdType k = i; k > j; --k)
+ {
+ uids->SetValue(k, uids->GetValue(k - 1));
+ }
+ uids->SetValue(j, uid);
+ }
+
+ delete [] r;
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::SetDefault(vtkDICOMUIDGenerator *uidgen)
+{
+ if (uidgen != vtkDICOMUIDGenerator::Default)
+ {
+ if (vtkDICOMUIDGenerator::Default)
+ {
+ vtkDICOMUIDGenerator::Default->Delete();
+ }
+ if (uidgen)
+ {
+ uidgen->Register(NULL);
+ }
+ else
+ {
+ uidgen = vtkDICOMUIDGenerator::New();
+ }
+ vtkDICOMUIDGenerator::Default = uidgen;
+ }
+}
diff --git a/Source/vtkDICOMUIDGenerator.h b/Source/vtkDICOMUIDGenerator.h
new file mode 100644
index 0000000..771db15
--- /dev/null
+++ b/Source/vtkDICOMUIDGenerator.h
@@ -0,0 +1,131 @@
+/*=========================================================================
+
+ Program: DICOM for VTK
+
+ Copyright (c) 2012-2016 David Gobbi
+ All rights reserved.
+ See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef vtkDICOMUIDGenerator_h
+#define vtkDICOMUIDGenerator_h
+
+#include <vtkObject.h>
+#include <vtkStdString.h> // For std::string
+#include "vtkDICOMModule.h" // For export macro
+#include "vtkDICOMTag.h" // For method parameter
+
+class vtkStringArray;
+
+//! Generate UIDs for written DICOM files.
+/*!
+ * This class generates UIDs that begin with a specified prefix, and are
+ * are followed by a sequence of digits that are sufficiently random that
+ * the possibility of UID collisions is vanishingly small. The default
+ * prefix 2.25. (which can be used by anyone) is followed by a 128-bit
+ * random number. Other prefixes (which can only be used by a designated
+ * organization) are followed by a 128-bit random number if the prefix is
+ * shorter than 24 chars, or a 96-bit random number if the prefix is 24
+ * chars or longer.
+ */
+class VTKDICOM_EXPORT vtkDICOMUIDGenerator : public vtkObject
+{
+public:
+ //! Static method for construction.
+ //@{
+ static vtkDICOMUIDGenerator *New();
+ vtkTypeMacro(vtkDICOMUIDGenerator, vtkObject);
+ //@}
+
+ //! Print information about this object.
+ virtual void PrintSelf(ostream& os, vtkIndent indent);
+
+ //@{
+ //! Set a UID prefix to use when generating UIDs.
+ /*!
+ * If this is not set, or if it is set to NULL, then the default
+ * prefix set via vtkDICOMUtilities::SetUIDPrefix() will be used.
+ * Its default is the 2.25. prefix.
+ */
+ void SetUIDPrefix(const char *prefix);
+
+ //! Get the current UID prefix.
+ /*!
+ * If no prefix was set, then this will return the same value as
+ * vtkDICOMUtilities::GetUIDPrefix().
+ */
+ const char *GetUIDPrefix();
+ //@}
+
+ //@{
+ //! Generate a UID for the provided tag.
+ /*
+ * The generator uses the tag as a hint when generating the UIDs,
+ * for example the SOPInstanceUID might have a different format from
+ * the FrameOfReferenceUID.
+ */
+ virtual std::string GenerateUID(vtkDICOMTag tag);
+
+ //! Generate a series of UIDs, sorted from low to high.
+ /*!
+ * Before passing the string array, call SetNumberOfValues() on
+ * the array to specify the number of UIDs that you want to be
+ * stored in it. The stored UIDs will be sorted, low to high.
+ * Generating a batch of UIDs is more efficient than calling
+ * GenerateUID() repeatedly.
+ */
+ virtual void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids);
+ //@}
+
+ //@{
+ //! Set the default UID generator.
+ /*!
+ * This can be used to set an application-wide UID generator.
+ */
+ static void SetDefault(vtkDICOMUIDGenerator *uidgen);
+
+ //! Get the default UID generator.
+ static vtkDICOMUIDGenerator *GetDefault() {
+ return vtkDICOMUIDGenerator::Default; }
+ //@}
+
+protected:
+ vtkDICOMUIDGenerator();
+ ~vtkDICOMUIDGenerator();
+
+ char *UIDPrefix;
+ char UIDPrefixStore[64];
+ static vtkDICOMUIDGenerator *Default;
+
+private:
+ friend class vtkDICOMUIDGeneratorInitializer;
+
+ vtkDICOMUIDGenerator(const vtkDICOMUIDGenerator&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMUIDGenerator&) VTK_DELETE_FUNCTION;
+};
+
+//! @cond
+//! Initializer (Schwarz counter).
+/*!
+ * This ensures that the vtkDICOMUIDGenerator module is initialized before
+ * any other module that includes this header file.
+ */
+class VTKDICOM_EXPORT vtkDICOMUIDGeneratorInitializer
+{
+public:
+ vtkDICOMUIDGeneratorInitializer();
+ ~vtkDICOMUIDGeneratorInitializer();
+private:
+ vtkDICOMUIDGeneratorInitializer(const vtkDICOMUIDGeneratorInitializer&);
+ vtkDICOMUIDGeneratorInitializer& operator=(
+ const vtkDICOMUIDGeneratorInitializer&);
+};
+
+static vtkDICOMUIDGeneratorInitializer vtkDICOMUIDGeneratorInitializerInstance;
+//! @endcond
+
+#endif // vtkDICOMUIDGenerator_h
diff --git a/Source/vtkDICOMUtilities.cxx b/Source/vtkDICOMUtilities.cxx
index a25135c..0496728 100644
--- a/Source/vtkDICOMUtilities.cxx
+++ b/Source/vtkDICOMUtilities.cxx
@@ -16,6 +16,7 @@
#include <vtkStringArray.h>
#include <vtkObjectFactory.h>
#include "vtkDICOMUtilities.h"
+#include "vtkDICOMUIDGenerator.h"
#include "vtkDICOMFile.h"
#include "vtkDICOMConfig.h"
@@ -39,403 +40,18 @@
vtkStandardNewMacro(vtkDICOMUtilities);
-namespace {
-
-// divide a hex string by 10, return remainder
-int vtkDivideHexStringBy10(char *value)
-{
- char *cp = value;
-
- // convert hex string to binary
- unsigned int x = 0;
- while (*cp != '\0')
- {
- // skip any hyphens
- if (*cp == '-')
- {
- cp++;
- continue;
- }
-
- // convert hex digit to a nibble
- unsigned int d = *cp;
- if ((d -= '0') > 9)
- {
- if ((d -= ('A' - '0' - 10)) > 15)
- {
- d -= ('a' - 'A');
- }
- }
-
- // append the nibble
- x <<= 4;
- x += d;
-
- // divide by 10
- unsigned int y = (10 << 3);
- unsigned int z = 0;
- int i;
- for (i = 0; i < 4; i++)
- {
- z <<= 1;
- int nx = x - y;
- if (nx >= 0)
- {
- x = nx;
- z++;
- }
- y >>= 1;
- }
-
- // convert quotient to new hex digit
- if ((z += '0') > '9')
- {
- z += ('A' - '0' - 10);
- }
-
- *cp++ = static_cast<char>(z);
- }
-
- // return the remainder
- return static_cast<int>(x);
-}
-
-// convert a hex uuid string to a decimal uid string, the
-// supplied uid will be at most 1.5 times as long as the uuid
-void vtkConvertHexToDecimal(const char *uuid, char *uid)
-{
- // max characters in a uuid and uid
- const unsigned int uuidlen = 36;
- const unsigned int uidlen = 64;
-
- char x[uuidlen + 4];
- char y[uidlen + 4];
-
- if (uuid[0] == '0' && uuid[1] == 'x')
- {
- uuid += 2;
- }
-
- strncpy(x, uuid, uuidlen);
- x[uuidlen] = '\0';
-
- char *cp = y + uidlen;
- *cp = '\0';
-
- char *dp = x;
- do
- {
- *(--cp) = vtkDivideHexStringBy10(x) + '0';
- // remove any leading zeros
- while (*dp == '0' || *dp == '-')
- {
- dp++;
- }
- }
- while (*dp != '\0');
-
- // copy out the result
- strcpy(uid, cp);
-}
-
-// convert a byte into two hexadecimal digits
-inline void vtkGenerateHexDigits(unsigned char y, char cp[2])
-{
- unsigned int z = (y >> 4);
- for (int j = 0; j < 2; j++)
- {
- if ((z += '0') > '9')
- {
- z += ('A' - '0' - 10);
- }
- cp[j] = static_cast<char>(z);
- z = (y & 0x0F);
- }
-}
-
-// convert n bytes into 2*n hexadecimal digits
-void vtkConvertBytesToHex(const unsigned char *bytes, size_t n, char *cp)
-{
- for (size_t i = 0; i < n; i++)
- {
- vtkGenerateHexDigits(*bytes, cp);
- bytes++;
- cp += 2;
- }
- *cp = '\0';
-}
-
-// generate a 36-character uuid from a 128-bit random number
-// (the supplied pointer must have 37 bytes of available space)
-void vtkConvertRandomToUUID(const unsigned char bytes[16], char *uuid)
-{
- // copy it so that we can modify it
- char r[16];
- for (int j = 0; j < 16; j++)
- {
- r[j] = bytes[j];
- }
-
- // set bits to show that this is a version 4 uuid
- r[6] = ((r[6] & 0x0f) | 0x40);
-
- // set the uuid variant to "0b10" (0b == binary)
- r[8] = ((r[8] & 0x3f) | 0x80);
-
- // convert the uuid into hexidecimal text
- char *cp = uuid;
- for (unsigned int i = 0; i < 16; i++)
- {
- // add hyphens to the uuid (just to be pedantic)
- if (i == 4 || i == 6 || i == 8 || i == 10)
- {
- *cp++ = '-';
- }
-
- vtkGenerateHexDigits(r[i], cp);
- cp += 2;
- }
-
- *cp = '\0';
-}
-
-// convert a 36-character uuid to a 44-character uid
-void vtkConvertUUIDToUID(const char *uuid, char *uid)
-{
- strncpy(uid, "2.25.", 5);
- vtkConvertHexToDecimal(uuid, uid + 5);
-}
-
-// read from the random number generator
-void vtkGenerateRandomBytes(unsigned char *bytes, vtkIdType n)
-{
- int r = 0;
-#ifdef _WIN32
- // use the Windows cryptography interface (WinXP and later)
- HCRYPTPROV hProv;
- r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
- CRYPT_SILENT);
- if (r == 0 && GetLastError() == NTE_BAD_KEYSET)
- {
- r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
- CRYPT_SILENT | CRYPT_NEWKEYSET);
- }
- if (r != 0)
- {
- r = CryptGenRandom(hProv, n, reinterpret_cast<BYTE *>(bytes));
- CryptReleaseContext(hProv, 0);
- }
-#else
- vtkDICOMFile infile("/dev/urandom", vtkDICOMFile::In);
- if (infile.GetError() == 0)
- {
- size_t m = infile.Read(bytes, n);
- r = (m == static_cast<size_t>(n));
- infile.Close();
- }
-#endif
- if (r == 0)
- {
- memset(bytes, '\0', n);
- vtkGenericWarningMacro(
- "vtkDICOMUtilities::GenerateUID() failed to read from "
- "the random number generator");
- }
-}
-
-// to add a little bit of recognizability to UIDs
-char vtkDICOMTagToDigit(vtkDICOMTag tag)
-{
- char d = '1';
-
- if (tag == DC::SOPInstanceUID ||
- tag == DC::MediaStorageSOPInstanceUID)
- {
- d = '2';
- }
- else if (tag == DC::SeriesInstanceUID ||
- tag == DC::ConcatenationUID)
- {
- d = '3';
- }
- else if (tag == DC::StudyInstanceUID)
- {
- d = '4';
- }
- else if (tag == DC::FrameOfReferenceUID ||
- tag == DC::VolumeFrameOfReferenceUID ||
- tag == DC::SourceFrameOfReferenceUID ||
- tag == DC::SynchronizationFrameOfReferenceUID ||
- tag == DC::TableFrameOfReferenceUID)
- {
- d = '5';
- }
-
- return d;
-}
-
-// get the number of random bytes to generate after this prefix
-vtkIdType vtkRandomBytesForPrefix(const char *prefix)
-{
- size_t n = strlen(prefix);
- if (n > 0 && prefix[n-1] != '.')
- {
- n++;
- }
- n = 64 - n;
- vtkIdType m = 0;
- if (n > 40)
- {
- m = 16; // use 128 bit random number
- }
- else
- {
- m = 12; // use 96 bit random number
- }
-
- return m;
-}
-
-// generate a prefixed UID using the provided random bytes
-void vtkGeneratePrefixedUID(
- const unsigned char *r, vtkIdType m, const char *prefix, char d,
- char uid[64])
-{
- size_t i = 0;
- while (*prefix != '\0' && i < 62)
- {
- uid[i++] = *prefix++;
- }
- if (i > 0 && i < 62 && uid[i-1] != '.')
- {
- uid[i++] = '.';
- }
-
- char hexs[36];
- vtkConvertBytesToHex(r, m, hexs);
- char decs[40];
- vtkConvertHexToDecimal(hexs, decs);
-
- // generate the leading digit as the UID type
- if (d >= '1' && d <= '9')
- {
- // decimal digits required to store an integer with N-1 bytes
- static const int maxDigits[16] = {
- 3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39
- };
-
- uid[i++] = d;
- // add zeros so all uids will be the same length
- size_t n = maxDigits[(m-1) & 0x0f];
- for (size_t l = strlen(decs); l < n && i < 63; l++)
- {
- uid[i++] = '0';
- }
- }
-
- const char *cp = decs;
- while (i < 63 && *cp != '\0')
- {
- uid[i++] = *cp++;
- }
-
- while (i < 64)
- {
- uid[i++] = '\0';
- }
-}
-
-} // end anonymous namespace
-
//----------------------------------------------------------------------------
std::string vtkDICOMUtilities::GenerateUID(vtkDICOMTag tag)
{
- const char *prefix = vtkDICOMUtilities::UIDPrefix;
- char uid[64];
-
- if (prefix[0] == '\0' ||
- (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
- prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')))
- {
- // generate a 128-bit random number
- unsigned char r[16];
- vtkGenerateRandomBytes(r, 16);
-
- // convert to a hex uuid
- char uuid[40];
- vtkConvertRandomToUUID(r, uuid);
-
- // convert the hex uuid into a DICOM UID with root 2.25
- vtkConvertUUIDToUID(uuid, uid);
- }
- else
- {
- // after prefix, add a "UID type" digit followed by random digits
- unsigned char r[16];
- vtkIdType m = vtkRandomBytesForPrefix(prefix);
- vtkGenerateRandomBytes(r, m);
- char d = vtkDICOMTagToDigit(tag);
- vtkGeneratePrefixedUID(r, m, prefix, d, uid);
- }
-
- return uid;
+ vtkDICOMUIDGenerator *uidgen = vtkDICOMUIDGenerator::GetDefault();
+ return uidgen->GenerateUID(tag);
}
//----------------------------------------------------------------------------
void vtkDICOMUtilities::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids)
{
- const char *prefix = vtkDICOMUtilities::UIDPrefix;
-
- bool useUUIDForUID =
- (prefix[0] == '\0' ||
- (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
- prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')));
-
- vtkIdType m = 16;
- char d = '0';
- if (!useUUIDForUID)
- {
- m = vtkRandomBytesForPrefix(prefix);
- d = vtkDICOMTagToDigit(tag);
- }
-
- // read from random number generator
- vtkIdType n = uids->GetNumberOfValues();
- unsigned char *r = new unsigned char[n*m];
- vtkGenerateRandomBytes(r, n*m);
-
- for (vtkIdType i = 0; i < n; i++)
- {
- char uid[64];
-
- if (useUUIDForUID)
- {
- char uuid[40];
- vtkConvertRandomToUUID(r + i*m, uuid);
- vtkConvertUUIDToUID(uuid, uid);
- }
- else
- {
- vtkGeneratePrefixedUID(r + i*m, m, prefix, d, uid);
- }
-
- // put uids into the array in order (simple insertion sort)
- vtkIdType j = 0;
- for (; j < i; j++)
- {
- if (vtkDICOMUtilities::CompareUIDs(uids->GetValue(j), uid) > 0)
- {
- break;
- }
- }
- for (vtkIdType k = i; k > j; --k)
- {
- uids->SetValue(k, uids->GetValue(k - 1));
- }
- uids->SetValue(j, uid);
- }
-
- delete [] r;
+ vtkDICOMUIDGenerator *uidgen = vtkDICOMUIDGenerator::GetDefault();
+ uidgen->GenerateUIDs(tag, uids);
}
//----------------------------------------------------------------------------
@@ -444,39 +60,39 @@ int vtkDICOMUtilities::CompareUIDs(const char *u1, const char *u2)
int r = 0;
if (u1 == 0 || u2 == 0)
- {
+ {
// if one or both are null
r = (u2 == 0 ? r : -1);
r = (u1 == 0 ? r : 1);
- }
+ }
else
- {
+ {
while (r == 0 && *u1 != 0 && *u2 != 0)
- {
+ {
int i1 = 0;
int i2 = 0;
do { i1++; } while (isdigit(u1[i1]));
do { i2++; } while (isdigit(u2[i2]));
r = i1 - i2; // longer number wins
if (r == 0)
- { // lexically compare numbers of the same length
+ { // lexically compare numbers of the same length
do { r = *u1++ - *u2++; } while (r == 0 && --i1 != 0);
- }
}
+ }
if (r == 0)
- {
+ {
// uid with remaining parts wins
r = (*u2 == 0 ? r : -1);
r = (*u1 == 0 ? r : 1);
- }
+ }
else
- {
+ {
// convert r to sgn(r)
r = (r >= 0 ? r : -1);
r = (r <= 0 ? r : 1);
- }
}
+ }
return r;
}
@@ -492,7 +108,7 @@ long long vtkDICOMUtilities::GetUTC(long long *offset)
static_cast<long long>(ft.dwLowDateTime));
if (offset)
- {
+ {
// get the current timezone offset by subtracting UTC from local time
TIME_ZONE_INFORMATION tzi;
GetTimeZoneInformation(&tzi);
@@ -506,15 +122,15 @@ long long vtkDICOMUtilities::GetUTC(long long *offset)
long long tzo = ((static_cast<long long>(lft.dwHighDateTime) << 32) +
static_cast<long long>(lft.dwLowDateTime) - t1);
if (tzo >= 0)
- {
+ {
tzo = (tzo + 5000000)/10000000;
- }
+ }
else
- {
+ {
tzo = -((-tzo + 5000000)/10000000);
- }
- *offset = tzo*1000000;
}
+ *offset = tzo*1000000;
+ }
// convert file time to unix time
return t1/10 - 11644473600000000ll;
@@ -525,21 +141,21 @@ long long vtkDICOMUtilities::GetUTC(long long *offset)
gettimeofday(&tv, 0);
long long t = (tv.tv_sec*1000000ll + tv.tv_usec);
if (offset)
- {
+ {
static long long lastT = 0;
if (t - lastT > 1000000ll)
- {
+ {
// this is needed on some systems to set timezone info,
// because it might do I/O do it at most once per second
tzset();
lastT = t;
- }
+ }
// use localtime to get the offset from utc
struct tm tmv;
time_t tod = static_cast<time_t>(t/1000000);
localtime_r(&tod, &tmv);
*offset = tmv.tm_gmtoff*1000000ll;
- }
+ }
return t;
@@ -564,32 +180,32 @@ std::string vtkDICOMUtilities::GenerateDateTime(
// all time stamps for the data set
if (z && strlen(z) == 5 && (z[0] == '+' || z[0] == '-') &&
isdigit(z[1]) && isdigit(z[2]) && isdigit(z[3]) && isdigit(z[4]))
- {
+ {
int zh = (z[1] - '0')*10 + (z[2] - '0');
int zm = (z[3] - '0')*10 + (z[4] - '0');
zs = (zh*3600 + zm*60) * (z[0] == '-' ? -1 : +1) * 1000000ll;
- }
+ }
if (z == 0 || z[0] == '\0' || t == VTK_LONG_LONG_MIN)
- {
+ {
long long *zsp = 0;
if (z == 0 || z[0] == '\0')
- {
+ {
zsp = &zs;
- }
+ }
long long t1 = vtkDICOMUtilities::GetUTC(zsp);
if (t == VTK_LONG_LONG_MIN)
- {
+ {
t = t1;
- }
}
+ }
// generate a new timezone offset string
char tzs[6] = { '+', '0', '0', '0', '0', '\0' };
if (z == 0 || z[0] == '\0')
- {
+ {
long long zst = zs/1000000;
tzs[0] = (zst < 0 ? '-' : '+');
zst = (zst < 0 ? -zst : zst);
@@ -597,7 +213,7 @@ std::string vtkDICOMUtilities::GenerateDateTime(
static_cast<int>((zst/3600)%24),
static_cast<int>((zst%3600)/60));
z = tzs;
- }
+ }
// add the time zone offset (in microseconds)
t += zs;
@@ -619,9 +235,9 @@ std::string vtkDICOMUtilities::GenerateDateTime(
int m = j + 2 - (12 * ell);
int y = 100 * (n - 49) + i + ell;
if (y > 9999)
- {
+ {
y = 9999;
- }
+ }
// convert microseconds to hours/minutes/seconds.microseconds
int S = static_cast<int>(tus/1000000);
@@ -646,34 +262,34 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
const char *epoch = "19700101000000.000000+0000";
char normalized[27];
for (int i = 0; i < 27; i++)
- {
+ {
normalized[i] = epoch[i];
- }
+ }
char *tp = normalized;
const char *cp = datetime;
while (*tp != 0 && *cp >= '0' && *cp <= '9')
- {
+ {
*tp++ = *cp++;
- }
+ }
if (*tp == '.' && *cp == '.')
- {
+ {
*tp++ = *cp++;
while (*tp != 0 && *cp >= '0' && *cp <= '9')
- {
+ {
*tp++ = *cp++;
- }
}
+ }
if (*cp == '-' || *cp == '+')
- {
+ {
tp = normalized + 21;
*tp++ = *cp++;
while (*tp != 0 && *cp >= '0' && *cp <= '9')
- {
+ {
*tp++ = *cp++;
- }
}
+ }
else
- {
+ {
// use local time zone
long long offset = 0;
vtkDICOMUtilities::GetUTC(&offset);
@@ -689,7 +305,7 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
tp[3] = M/10 + '0';
tp[4] = M%10 + '0';
tp[5] = 0;
- }
+ }
// convert normalized datetime to year, month, day etc.
// first, convert all digits (and only digits) to binary values
@@ -697,9 +313,9 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
normalized[14] += '0';
normalized[21] += '0';
for (int i = 0; i < 26; i++)
- {
+ {
normalized[i] -= '0';
- }
+ }
int y = tp[0]*1000 + tp[1]*100 + tp[2]*10 + tp[3];
int m = tp[4]*10 + tp[5];
@@ -713,9 +329,9 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
// get the timezone offset, in seconds
int tzs = (tp[22]*600 + tp[23]*60 + tp[24]*10 + tp[25])*60;
if (tp[21] == '-')
- {
+ {
tzs = -tzs;
- }
+ }
// use algorithm from Henry F. Fliegel and Thomas C. Van Flandern
// to compute the day according to Gregorian calendar
@@ -738,73 +354,82 @@ bool vtkDICOMUtilities::IsDICOMFile(const char *filename)
unsigned char buffer[256];
if (filename == 0)
- {
+ {
return false;
- }
+ }
vtkDICOMFile infile(filename, vtkDICOMFile::In);
if (infile.GetError() != 0)
- {
+ {
return false;
- }
+ }
// valid file should be at least 256 chars long (probably longer)
size_t size = infile.GetSize();
if (size < sizeof(buffer))
- {
+ {
return 0;
- }
+ }
size = sizeof(buffer);
size_t rsize = infile.Read(buffer, size);
infile.Close();
if (rsize != static_cast<size_t>(size))
- {
+ {
return false;
- }
+ }
const unsigned char *cp = buffer;
// Look for the magic number and the first meta header tag.
size_t skip = 128;
for (int i = 0; i < 2; i++)
- {
+ {
if (size > skip + 8)
- {
+ {
cp = &buffer[skip];
if (cp[0] == 'D' && cp[1] == 'I' && cp[2] == 'C' && cp[3] == 'M' &&
cp[4] == 2 && cp[5] == 0 && cp[6] == 0 && cp[7] == 0)
- {
+ {
return true;
- }
}
+ }
// Some non-standard files have DICM at the beginning.
skip = 0;
- }
+ }
// File must be a reasonable size.
if (size < 256)
- {
+ {
return false;
- }
+ }
cp = buffer;
// If no magic number found, look for a valid meta header.
if (cp[0] == 2 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 &&
cp[4] == 'U' && cp[5] == 'L' && cp[6] == 4 && cp[7] == 0)
- {
+ {
return true;
- }
+ }
- // Finally, look for little-endian implicit ACR-NEMA.
- if (cp[0] == 8 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 &&
- cp[4] == 4 && cp[5] == 0 && cp[6] == 0 && cp[7] == 0 &&
- cp[12] == 8 && cp[13] == 0 && (cp[14] != 0 || cp[15] != 0))
+ // Look for two valid implicitly-encoded data elements in Group 0x0008,
+ // where the first element must be (0008,0016) or less (e.g. SOPClassUID)
+ // with a size of 64 or less, and the second element must be (0008,0018)
+ // or less (e.g. SOPInstanceUID) with a size of 64 or less.
+ if (cp[0] == 0x08 && cp[1] == 0x00 && cp[2] <= 0x16 && cp[3] == 0x00 &&
+ cp[4] <= 0x40 && cp[5] == 0x00 && cp[6] == 0x00 && cp[7] == 0x00)
+ {
+ unsigned char e = cp[2];
+ cp += (cp[4] + 8);
+ if (cp[0] == 0x08 && cp[1] == 0x00 && cp[2] <= 0x18 && cp[3] == 0x00 &&
+ cp[4] <= 0x40 && cp[5] == 0x00 && cp[6] == 0x00 && cp[7] == 0x00 &&
+ cp[2] > e)
{
- return true;
+ return true;
}
+ }
return false;
}
@@ -848,7 +473,7 @@ void vtkDICOMUtilities::SetImplementationClassUID(const char *uid)
char vtkDICOMUtilities::ImplementationVersionName[17] =
VTK_DICOM_VERSION_CREATOR("VTK_DICOM",
- DICOM_MAJOR_VERSION, DICOM_MINOR_VERSION, DICOM_BUILD_VERSION);
+ DICOM_MAJOR_VERSION, DICOM_MINOR_VERSION, DICOM_PATCH_VERSION);
const char *vtkDICOMUtilities::GetImplementationVersionName()
{
@@ -880,78 +505,79 @@ bool vtkDICOMUtilities::PatternMatches(
const char *fp = val + vl;
while (cp != ep && dp != fp)
- {
+ {
if (*cp == '*')
- {
+ {
cp++;
// if '*' is the final character, it matches the remainder of val
if (cp == ep)
- {
+ {
dp = fp;
- }
+ }
else
- {
+ {
while (dp != fp)
- {
+ {
if (*cp == '?' || *dp == *cp)
- {
+ {
// check if the remainder of val matches remainder of pattern
if (PatternMatches(cp, ep-cp, dp, fp-dp))
- {
+ {
break;
- }
}
+ }
// else let the "*" eat one more codepoint of "val"
if (static_cast<signed char>(*dp++) < 0)
- {
+ {
while (dp != fp && (*dp & 0xC0) == 0x80)
- {
+ {
dp++;
- }
}
}
}
}
+ }
else if (*cp == '?')
- {
- // the '?' matches a whole codepoint, not just one character
+ {
+ // the '?' matches a whole codepoint, not just one byte
cp++;
if (static_cast<signed char>(*dp++) < 0)
- {
+ {
while (dp != fp && (*dp & 0xC0) == 0x80)
- {
+ {
dp++;
- }
}
}
+ }
else if (*cp == *dp)
- {
+ {
// make sure the entire codepoint matches
cp++;
if (static_cast<signed char>(*dp++) < 0)
+ {
+ while (cp != ep && dp != fp &&
+ ((*cp & 0xC0) == 0x80 || (*dp & 0xC0) == 0x80))
{
- while (cp != ep && dp != fp && (*cp & 0xC0) == 0x80)
- {
if (*dp != *cp)
- {
+ {
return false;
- }
+ }
cp++;
dp++;
- }
}
}
+ }
else
- {
+ {
return false;
- }
}
+ }
// skip over any remaining '*' wildcards
while (cp != ep && *cp == '*')
- {
+ {
cp++;
- }
+ }
// make sure we've reached the end of both the pattern and the value
return (cp == ep && dp == fp);
diff --git a/Source/vtkDICOMUtilities.h b/Source/vtkDICOMUtilities.h
index 88df199..151a8a6 100644
--- a/Source/vtkDICOMUtilities.h
+++ b/Source/vtkDICOMUtilities.h
@@ -25,6 +25,7 @@ class vtkStringArray;
class VTKDICOM_EXPORT vtkDICOMUtilities : public vtkObject
{
public:
+ //@{
//! VTK new method (for Java and Tcl wrappers)
static vtkDICOMUtilities *New();
@@ -33,7 +34,9 @@ public:
//! Print a summary of the contents of this object.
void PrintSelf(ostream& os, vtkIndent indent);
+ //@}
+ //@{
//! Set a UID prefix to use when generating UIDs.
/*!
* This is optional, if you do not own a UID prefix then the publicly
@@ -41,7 +44,9 @@ public:
*/
static void SetUIDPrefix(const char *prefix);
static const char *GetUIDPrefix();
+ //@}
+ //@{
//! Generate a UID for the provided tag.
static std::string GenerateUID(vtkDICOMTag tag);
@@ -57,7 +62,9 @@ public:
//! Numerically compare two UIDs, returns -1, 0, or +1.
static int CompareUIDs(const char *u1, const char *u2);
+ //@}
+ //@{
//! Generate a DICOM date time string in the given timezone.
/*!
* The time zone is to be given in the DICOM format of
@@ -97,7 +104,9 @@ public:
* can pass a null pointer.
*/
static long long GetUTC(long long *offset);
+ //@}
+ //@{
//! Check if the specified file is a DICOM file.
/*!
* This will return true if the file exists, is readable, and
@@ -105,7 +114,9 @@ public:
* the file look like DICOM data elements.
*/
static bool IsDICOMFile(const char *filename);
+ //@}
+ //@{
//! Get the UID for this DICOM implementation.
static const char *GetImplementationClassUID();
@@ -127,7 +138,9 @@ public:
* The ImplementationVersionName appears in the DICOM meta header.
*/
static void SetImplementationVersionName(const char *name);
+ //@}
+ //@{
//! Unpack one little-endian int from a stream of bytes.
/*!
* This is a very common operation that is required in many different
@@ -146,7 +159,9 @@ public:
cp[1] = static_cast<unsigned char>(i >> 8);
cp[2] = static_cast<unsigned char>(i >> 16);
cp[3] = static_cast<unsigned char>(i >> 24); }
+ //@}
+ //@{
//! Return true if the pattern matches the given string (utf-8).
/*!
* This performs simple matching with "*" and "?" as the only wildcard.
@@ -158,12 +173,15 @@ public:
//! Match patterns on non-terminated strings.
static bool PatternMatches(
const char *pattern, size_t pl, const char *val, size_t vl);
+ //@}
+ //@{
//! Get the name associated with the given UID.
static const char *GetUIDName(const char *uid);
//! Get the CID from the UID.
unsigned short GetCIDFromUID(const char *uid);
+ //@}
protected:
vtkDICOMUtilities() {}
@@ -174,8 +192,8 @@ protected:
static char ImplementationVersionName[17];
private:
- vtkDICOMUtilities(const vtkDICOMUtilities&); // Not implemented.
- void operator=(const vtkDICOMUtilities&); // Not implemented.
+ vtkDICOMUtilities(const vtkDICOMUtilities&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMUtilities&) VTK_DELETE_FUNCTION;
};
#endif /* vtkDICOMUtilities_h */
diff --git a/Source/vtkDICOMUtilitiesUIDTable.cxx b/Source/vtkDICOMUtilitiesUIDTable.cxx
index 421c987..eca009d 100644
--- a/Source/vtkDICOMUtilitiesUIDTable.cxx
+++ b/Source/vtkDICOMUtilitiesUIDTable.cxx
@@ -15,23 +15,23 @@ struct UIDTableEntry
const char *Name;
};
-UIDTableEntry UIDTable[] = {
+const UIDTableEntry UIDTable[] = {
{ 1, 15, 1, 0, 0 },
{ 16, 42, 1, 0, 0 },
{ 157, 11, 6, 0, 0 },
-{ 170, 1, 1, 0, 0 },
-{ 196, 1, 2, 0, 0 },
-{ 197, 1, 1, 0, 0 },
-{ 1142, 1, 1, 0, 0 },
-{ 2205, 1, 1, 0, 0 },
-{ 2208, 1, 1, 0, 0 },
-{ 2210, 24, 1, 0, 0 },
+{ 175, 1, 1, 0, 0 },
+{ 201, 1, 2, 0, 0 },
+{ 202, 1, 1, 0, 0 },
+{ 1224, 1, 1, 0, 0 },
+{ 2345, 1, 1, 0, 0 },
+{ 2348, 1, 1, 0, 0 },
+{ 2350, 24, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 2234, 2, 0, 0, 0 },
+{ 2374, 2, 0, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.1.1
"Verification SOP Class" },
{ 58, 6, 1, 0, // 1.2.840.10008.1.2
@@ -54,7 +54,8 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 151, 2, 1, 0, 0 },
+{ 151, 2, 1, 0, // 1.2.840.10008.1.20 (Retired)
+ "Papyrus 3 Implicit VR Little Endian" },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -258,22 +259,32 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 169, 1, 4, 0, 0 },
+{ 169, 6, 4, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.2.6.1
"DICOM UID Registry" },
{ 0, 0, 0, 0, // 1.2.840.10008.2.16.4
"DICOM Controlled Terminology" },
-{ 171, 2, 1, 0, 0 },
-{ 173, 1, 1, 0, 0 },
-{ 174, 6, 1, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.5
+ "Adult Mouse Anatomy Ontology" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.6
+ "Uberon Ontology" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.7
+ "Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN)" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.8
+ "Mouse Genome Initiative (MGI)" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.9
+ "PubChem Compound CID" },
+{ 176, 2, 1, 0, 0 },
+{ 178, 1, 1, 0, 0 },
+{ 179, 6, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.3.1.1.1
"DICOM Application Context Name" },
-{ 180, 4, 1, 0, 0 },
-{ 184, 1, 1, 0, 0 },
-{ 185, 5, 1, 0, 0 },
-{ 0, 0, 0, 0, 0 },
+{ 185, 4, 1, 0, 0 },
+{ 189, 1, 1, 0, 0 },
{ 190, 5, 1, 0, 0 },
-{ 195, 1, 1, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 195, 5, 1, 0, 0 },
+{ 200, 1, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.3.1.2.1.1 (Retired)
"Detached Patient Management SOP Class" },
{ 0, 0, 0, 0, 0 },
@@ -304,23 +315,23 @@ UIDTableEntry UIDTable[] = {
"Detached Interpretation Management SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.4.2
"Storage Service Class" },
-{ 198, 4, 1, 0, 0 },
-{ 202, 40, 1, 0, 0 },
+{ 203, 4, 1, 0, 0 },
+{ 207, 40, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 250, 45, 1, 0, 0 },
+{ 255, 45, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.1
"Basic Film Session SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.2
"Basic Film Box SOP Class" },
{ 0, 0, 0, 0, 0 },
-{ 242, 2, 1, 0, // 1.2.840.10008.5.1.1.4
+{ 247, 2, 1, 0, // 1.2.840.10008.5.1.1.4
"Basic Grayscale Image Box SOP Class" },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 244, 1, 1, 0, // 1.2.840.10008.5.1.1.9
+{ 249, 1, 1, 0, // 1.2.840.10008.5.1.1.9
"Basic Grayscale Print Management Meta SOP Class" },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -330,11 +341,11 @@ UIDTableEntry UIDTable[] = {
"Print Job SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.15
"Basic Annotation Box SOP Class" },
-{ 245, 1, 376, 0, // 1.2.840.10008.5.1.1.16
+{ 250, 1, 376, 0, // 1.2.840.10008.5.1.1.16
"Printer SOP Class" },
-{ 246, 1, 376, 0, // 1.2.840.10008.5.1.1.17
+{ 251, 1, 376, 0, // 1.2.840.10008.5.1.1.17
"Printer SOP Instance" },
-{ 247, 1, 1, 0, // 1.2.840.10008.5.1.1.18
+{ 252, 1, 1, 0, // 1.2.840.10008.5.1.1.18
"Basic Color Print Management Meta SOP Class" },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -343,7 +354,7 @@ UIDTableEntry UIDTable[] = {
"VOI LUT Box SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.23
"Presentation LUT SOP Class" },
-{ 248, 1, 1, 0, // 1.2.840.10008.5.1.1.24 (Retired)
+{ 253, 1, 1, 0, // 1.2.840.10008.5.1.1.24 (Retired)
"Image Overlay Box SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.25 (Retired)
"Print Queue SOP Instance" },
@@ -368,7 +379,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 249, 1, 1, 0, // 1.2.840.10008.5.1.1.40
+{ 254, 1, 1, 0, // 1.2.840.10008.5.1.1.40
"Display System SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.4.1
"Basic Color Image Box SOP Class" },
@@ -386,7 +397,7 @@ UIDTableEntry UIDTable[] = {
"Basic Print Image Overlay Box SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.1.40.1
"Display System SOP Instance" },
-{ 295, 2, 1, 0, 0 },
+{ 300, 2, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -418,51 +429,51 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.31
"Modality Worklist Information Model - FIND" },
-{ 1098, 3, 1, 0, // 1.2.840.10008.5.1.4.32 (Retired)
+{ 1179, 3, 1, 0, // 1.2.840.10008.5.1.4.32 (Retired)
"General Purpose Worklist Management Meta SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.33
"Instance Availability Notification SOP Class" },
-{ 1101, 9, 1, 0, 0 },
+{ 1182, 10, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 1119, 3, 1, 0, 0 },
-{ 1122, 4, 1, 0, 0 },
-{ 1126, 4, 1, 0, 0 },
+{ 1201, 3, 1, 0, 0 },
+{ 1204, 4, 1, 0, 0 },
+{ 1208, 4, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.41
"Product Characteristics Query SOP Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.42
"Substance Approval Query SOP Class" },
-{ 1130, 4, 1, 0, 0 },
-{ 1134, 4, 1, 0, 0 },
-{ 1138, 4, 1, 0, 0 },
-{ 297, 601, 1, 0, 0 },
-{ 1081, 5, 1, 0, 0 },
-{ 898, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1
+{ 1212, 4, 1, 0, 0 },
+{ 1216, 4, 1, 0, 0 },
+{ 1220, 4, 1, 0, 0 },
+{ 302, 601, 1, 0, 0 },
+{ 1162, 5, 1, 0, 0 },
+{ 903, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1
"Computed Radiography Image Storage" },
-{ 904, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2
+{ 909, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2
"CT Image Storage" },
-{ 906, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired)
+{ 911, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired)
"Ultrasound Multi-frame Image Storage" },
-{ 907, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.4
+{ 912, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.4
"MR Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.5 (Retired)
"Nuclear Medicine Image Storage" },
-{ 911, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired)
+{ 916, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired)
"Ultrasound Image Storage" },
-{ 913, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.7
+{ 918, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.7
"Secondary Capture Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.8 (Retired)
"Standalone Overlay Storage" },
-{ 917, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.9 (Retired)
+{ 922, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.9 (Retired)
"Standalone Curve Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.10 (Retired)
"Standalone Modality LUT Storage" },
-{ 932, 7, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired)
+{ 937, 7, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired)
"Standalone VOI LUT Storage" },
-{ 939, 3, 1, 0, 0 },
-{ 944, 1, 1, 0, 0 },
-{ 950, 2, 1, 0, 0 },
+{ 944, 77, 1, 0, 0 },
+{ 1023, 1, 1, 0, 0 },
+{ 1029, 2, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -490,6 +501,8 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.40 (Retired)
+ "1.2.840.10008.5.1.4.1.1.40" },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -515,13 +528,11 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 0, 0, 0, 0, 0 },
-{ 952, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.66
+{ 1031, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.66
"Raw Data Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.67
"Real World Value Mapping Storage" },
-{ 958, 2, 1, 0, 0 },
-{ 0, 0, 0, 0, 0 },
+{ 1037, 2, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -529,20 +540,21 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 960, 2, 1, 0, 0 },
-{ 977, 8, 1, 0, 0 },
-{ 985, 1, 1, 0, 0 },
-{ 986, 1, 1, 0, 0 },
-{ 987, 1, 1, 0, 0 },
-{ 988, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
+{ 1039, 2, 1, 0, 0 },
+{ 1056, 8, 1, 0, 0 },
+{ 1064, 1, 1, 0, 0 },
+{ 1065, 1, 1, 0, 0 },
+{ 1066, 1, 1, 0, 0 },
+{ 1067, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 989, 70, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
+{ 1068, 71, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
+{ 1139, 1, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -556,7 +568,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 1059, 2, 1, 0, 0 },
+{ 1140, 2, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -580,7 +592,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 1061, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.128
+{ 1142, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.128
"Positron Emission Tomography Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.129 (Retired)
"Standalone PET Curve Storage" },
@@ -937,7 +949,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 1062, 9, 1, 0, 0 },
+{ 1143, 9, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -957,7 +969,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 1071, 6, 1, 0, 0 },
+{ 1152, 6, 1, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
@@ -1057,12 +1069,12 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 },
-{ 1079, 2, 1, 0, 0 },
-{ 901, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1
+{ 1160, 2, 1, 0, 0 },
+{ 906, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1
"Digital X-Ray Image Storage - For Presentation" },
-{ 902, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2
+{ 907, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2
"Digital Mammography X-Ray Image Storage - For Presentation" },
-{ 903, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.3
+{ 908, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.3
"Digital Intra-Oral X-Ray Image Storage - For Presentation" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.1.1.1
"Digital X-Ray Image Storage - For Processing" },
@@ -1096,13 +1108,13 @@ UIDTableEntry UIDTable[] = {
"Multi-frame Grayscale Word Secondary Capture Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.7.4
"Multi-frame True Color Secondary Capture Image Storage" },
-{ 923, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired)
+{ 928, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired)
"Waveform Storage - Trial" },
-{ 926, 1, 1, 0, 0 },
-{ 927, 1, 1, 0, 0 },
-{ 928, 2, 1, 0, 0 },
-{ 930, 1, 1, 0, 0 },
{ 931, 1, 1, 0, 0 },
+{ 932, 1, 1, 0, 0 },
+{ 933, 2, 1, 0, 0 },
+{ 935, 1, 1, 0, 0 },
+{ 936, 1, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.1
"12-lead ECG Waveform Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.2
@@ -1135,17 +1147,92 @@ UIDTableEntry UIDTable[] = {
"Grayscale Planar MPR Volumetric Presentation State Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.7
"Compositing Planar MPR Volumetric Presentation State Storage" },
-{ 942, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1
+{ 1021, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1
"X-Ray Angiographic Image Storage" },
-{ 943, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.2
+{ 1022, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.2
"X-Ray Radiofluoroscopic Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.3 (Retired)
"X-Ray Angiographic Bi-Plane Image Storage" },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.77 (Retired)
+ "1.2.840.10008.5.1.4.1.1.12.77" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.1.1
"Enhanced XA Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.2.1
"Enhanced XRF Image Storage" },
-{ 945, 5, 1, 0, 0 },
+{ 1024, 5, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.1
"X-Ray 3D Angiographic Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.2
@@ -1171,24 +1258,24 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.5
"Surface Segmentation Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.6
- "Tractography Results" },
+ "Tractography Results Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.1
"Surface Scan Mesh Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.2
"Surface Scan Point Cloud Storage" },
-{ 962, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1 (Retired)
+{ 1041, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1 (Retired)
"VL Image Storage - Trial" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.2 (Retired)
"VL Multi-frame Image Storage - Trial" },
-{ 968, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1
+{ 1047, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1
"VL Endoscopic Image Storage" },
-{ 969, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2
+{ 1048, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2
"VL Microscopic Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.3
"VL Slide-Coordinates Microscopic Image Storage" },
-{ 970, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4
+{ 1049, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4
"VL Photographic Image Storage" },
-{ 971, 6, 1, 0, 0 },
+{ 1050, 6, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.6
"VL Whole Slide Microscopy Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1.1
@@ -1320,6 +1407,10 @@ UIDTableEntry UIDTable[] = {
"Colon CAD SR Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.70
"Implantation Plan SR Storage" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.71
+ "Acquisition Context SR Storage" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.90.1
+ "Content Assessment Results Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.1
"Encapsulated PDF Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.2
@@ -1346,7 +1437,7 @@ UIDTableEntry UIDTable[] = {
"RT Ion Beams Treatment Record Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.1
"DICOS CT Image Storage" },
-{ 1077, 2, 1, 0, 0 },
+{ 1158, 2, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.3
"DICOS Threat Detection Report Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.4
@@ -1363,11 +1454,11 @@ UIDTableEntry UIDTable[] = {
"Eddy Current Image Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.601.2
"Eddy Current Multi-frame Image Storage" },
-{ 1086, 3, 1, 0, 0 },
-{ 1089, 3, 1, 0, 0 },
-{ 1092, 3, 1, 0, 0 },
-{ 1095, 2, 2, 0, 0 },
-{ 1097, 1, 3, 0, 0 },
+{ 1167, 3, 1, 0, 0 },
+{ 1170, 3, 1, 0, 0 },
+{ 1173, 3, 1, 0, 0 },
+{ 1176, 2, 2, 0, 0 },
+{ 1178, 1, 3, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.1
"Patient Root Query/Retrieve Information Model - FIND" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.2
@@ -1404,11 +1495,11 @@ UIDTableEntry UIDTable[] = {
"RT Conventional Machine Verification - Trial" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.3 (Retired)
"RT Ion Machine Verification - Trial" },
-{ 1110, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired)
+{ 1192, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired)
"Unified Worklist and Procedure Step Service Class - Trial" },
-{ 1114, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5
+{ 1196, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5
"UPS Global Subscription SOP Instance" },
-{ 1115, 4, 1, 0, // 1.2.840.10008.5.1.4.34.6
+{ 1197, 4, 1, 0, // 1.2.840.10008.5.1.4.34.6
"Unified Worklist and Procedure Step Service Class" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.7
"RT Beams Delivery Instruction Storage" },
@@ -1416,6 +1507,8 @@ UIDTableEntry UIDTable[] = {
"RT Conventional Machine Verification" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.9
"RT Ion Machine Verification" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.10
+ "RT Brachy Application Setup Delivery Instruction Storage" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.1 (Retired)
"Unified Procedure Step - Push SOP Class - Trial" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.2 (Retired)
@@ -1480,7 +1573,7 @@ UIDTableEntry UIDTable[] = {
"Implant Template Group Information Model - MOVE" },
{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.45.4
"Implant Template Group Information Model - GET" },
-{ 1143, 1062, 1, 0, 0 },
+{ 1225, 1120, 1, 0, 0 },
{ 0, 0, 0, 2, // 1.2.840.10008.6.1.1
"Anatomic Modifier" },
{ 0, 0, 0, 4, // 1.2.840.10008.6.1.2
@@ -1864,7 +1957,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 3677, // 1.2.840.10008.6.1.191
"Summary Codes ECG" },
{ 0, 0, 0, 3678, // 1.2.840.10008.6.1.192
- "Qt Correction Algorithms" },
+ "QT Correction Algorithms" },
{ 0, 0, 0, 3679, // 1.2.840.10008.6.1.193 (Retired)
"ECG Morphology Descriptions" },
{ 0, 0, 0, 3680, // 1.2.840.10008.6.1.194
@@ -1960,7 +2053,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 3742, // 1.2.840.10008.6.1.239
"Medication Administration, PCI" },
{ 0, 0, 0, 3743, // 1.2.840.10008.6.1.240
- "Clopidogrel/ticlopidine Administration" },
+ "Clopidogrel/Ticlopidine Administration" },
{ 0, 0, 0, 3744, // 1.2.840.10008.6.1.241
"EF Testing Method" },
{ 0, 0, 0, 3745, // 1.2.840.10008.6.1.242
@@ -2034,7 +2127,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 3820, // 1.2.840.10008.6.1.276
"Non-invasive Vascular Procedures" },
{ 0, 0, 0, 3821, // 1.2.840.10008.6.1.277
- "Papillary Muscle Included/excluded" },
+ "Papillary Muscle Included/Excluded" },
{ 0, 0, 0, 3823, // 1.2.840.10008.6.1.278
"Respiratory Status" },
{ 0, 0, 0, 3826, // 1.2.840.10008.6.1.279
@@ -2084,7 +2177,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 4017, // 1.2.840.10008.6.1.301
"Anatomic Region Modifier for Intra-oral Radiography" },
{ 0, 0, 0, 4018, // 1.2.840.10008.6.1.302
- "Primary Anatomic Structure for Intra-oral Radiography (permanent Dentition - Designation of Teeth)" },
+ "Primary Anatomic Structure for Intra-oral Radiography (Permanent Dentition - Designation of Teeth)" },
{ 0, 0, 0, 4019, // 1.2.840.10008.6.1.303
"Primary Anatomic Structure for Intra-oral Radiography (Deciduous Dentition - Designation of Teeth)" },
{ 0, 0, 0, 4020, // 1.2.840.10008.6.1.304
@@ -2106,7 +2199,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 4042, // 1.2.840.10008.6.1.312
"XA/XRF Anatomy Imaged" },
{ 0, 0, 0, 4050, // 1.2.840.10008.6.1.313
- "Drug Or Contrast Agent Characteristics" },
+ "Drug or Contrast Agent Characteristics" },
{ 0, 0, 0, 4051, // 1.2.840.10008.6.1.314
"General Devices" },
{ 0, 0, 0, 4052, // 1.2.840.10008.6.1.315
@@ -2142,71 +2235,71 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 6000, // 1.2.840.10008.6.1.330
"Overall Breast Composition" },
{ 0, 0, 0, 6001, // 1.2.840.10008.6.1.331
- "Overall Breast Composition From BI-RADS(R)" },
+ "Overall Breast Composition from BI-RADS(R)" },
{ 0, 0, 0, 6002, // 1.2.840.10008.6.1.332
- "Change Since Last Mammogram Or Prior Surgery" },
+ "Change Since Last Mammogram or Prior Surgery" },
{ 0, 0, 0, 6003, // 1.2.840.10008.6.1.333
- "Change Since Last Mammogram Or Prior Surgery From BI-RADS(R)" },
+ "Change Since Last Mammogram or Prior Surgery from BI-RADS(R)" },
{ 0, 0, 0, 6004, // 1.2.840.10008.6.1.334
"Mammography Characteristics of Shape" },
{ 0, 0, 0, 6005, // 1.2.840.10008.6.1.335
- "Characteristics of Shape From BI-RADS(R)" },
+ "Characteristics of Shape from BI-RADS(R)" },
{ 0, 0, 0, 6006, // 1.2.840.10008.6.1.336
"Mammography Characteristics of Margin" },
{ 0, 0, 0, 6007, // 1.2.840.10008.6.1.337
- "Characteristics of Margin From BI-RADS(R)" },
+ "Characteristics of Margin from BI-RADS(R)" },
{ 0, 0, 0, 6008, // 1.2.840.10008.6.1.338
"Density Modifier" },
{ 0, 0, 0, 6009, // 1.2.840.10008.6.1.339
- "Density Modifier From BI-RADS(R)" },
+ "Density Modifier from BI-RADS(R)" },
{ 0, 0, 0, 6010, // 1.2.840.10008.6.1.340
"Mammography Calcification Types" },
{ 0, 0, 0, 6011, // 1.2.840.10008.6.1.341
- "Calcification Types From BI-RADS(R)" },
+ "Calcification Types from BI-RADS(R)" },
{ 0, 0, 0, 6012, // 1.2.840.10008.6.1.342
"Calcification Distribution Modifier" },
{ 0, 0, 0, 6013, // 1.2.840.10008.6.1.343
- "Calcification Distribution Modifier From BI-RADS(R)" },
+ "Calcification Distribution Modifier from BI-RADS(R)" },
{ 0, 0, 0, 6014, // 1.2.840.10008.6.1.344
"Mammography Single Image Finding" },
{ 0, 0, 0, 6015, // 1.2.840.10008.6.1.345
- "Single Image Finding From BI-RADS(R)" },
+ "Single Image Finding from BI-RADS(R)" },
{ 0, 0, 0, 6016, // 1.2.840.10008.6.1.346
"Mammography Composite Feature" },
{ 0, 0, 0, 6017, // 1.2.840.10008.6.1.347
- "Composite Feature From BI-RADS(R)" },
+ "Composite Feature from BI-RADS(R)" },
{ 0, 0, 0, 6018, // 1.2.840.10008.6.1.348
"Clockface Location or Region" },
{ 0, 0, 0, 6019, // 1.2.840.10008.6.1.349
- "Clockface Location Or Region From BI-RADS(R)" },
+ "Clockface Location or Region from BI-RADS(R)" },
{ 0, 0, 0, 6020, // 1.2.840.10008.6.1.350
"Quadrant Location" },
{ 0, 0, 0, 6021, // 1.2.840.10008.6.1.351
- "Quadrant Location From BI-RADS(R)" },
+ "Quadrant Location from BI-RADS(R)" },
{ 0, 0, 0, 6022, // 1.2.840.10008.6.1.352
"Side" },
{ 0, 0, 0, 6023, // 1.2.840.10008.6.1.353
- "Side From BI-RADS(R)" },
+ "Side from BI-RADS(R)" },
{ 0, 0, 0, 6024, // 1.2.840.10008.6.1.354
"Depth" },
{ 0, 0, 0, 6025, // 1.2.840.10008.6.1.355
- "Depth From BI-RADS(R)" },
+ "Depth from BI-RADS(R)" },
{ 0, 0, 0, 6026, // 1.2.840.10008.6.1.356
"Mammography Assessment" },
{ 0, 0, 0, 6027, // 1.2.840.10008.6.1.357
- "Assessment From BI-RADS(R)" },
+ "Assessment from BI-RADS(R)" },
{ 0, 0, 0, 6028, // 1.2.840.10008.6.1.358
"Mammography Recommended Follow-up" },
{ 0, 0, 0, 6029, // 1.2.840.10008.6.1.359
- "Recommended Follow-up From BI-RADS(R)" },
+ "Recommended Follow-up from BI-RADS(R)" },
{ 0, 0, 0, 6030, // 1.2.840.10008.6.1.360
"Mammography Pathology Codes" },
{ 0, 0, 0, 6031, // 1.2.840.10008.6.1.361
- "Benign Pathology Codes From BI-RADS(R)" },
+ "Benign Pathology Codes from BI-RADS(R)" },
{ 0, 0, 0, 6032, // 1.2.840.10008.6.1.362
- "High Risk Lesions Pathology Codes From BI-RADS(R)" },
+ "High Risk Lesions Pathology Codes from BI-RADS(R)" },
{ 0, 0, 0, 6033, // 1.2.840.10008.6.1.363
- "Malignant Pathology Codes From BI-RADS(R)" },
+ "Malignant Pathology Codes from BI-RADS(R)" },
{ 0, 0, 0, 6034, // 1.2.840.10008.6.1.364
"Intended Use of CAD Output" },
{ 0, 0, 0, 6035, // 1.2.840.10008.6.1.365
@@ -2248,7 +2341,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 6054, // 1.2.840.10008.6.1.383
"Breast Imaging Findings" },
{ 0, 0, 0, 6055, // 1.2.840.10008.6.1.384
- "Breast Clinical Finding Or Indicated Problem" },
+ "Breast Clinical Finding or Indicated Problem" },
{ 0, 0, 0, 6056, // 1.2.840.10008.6.1.385
"Associated Findings for Breast" },
{ 0, 0, 0, 6057, // 1.2.840.10008.6.1.386
@@ -2322,33 +2415,33 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 6100, // 1.2.840.10008.6.1.420
"Chest Component Categories" },
{ 0, 0, 0, 6101, // 1.2.840.10008.6.1.421
- "Chest Finding Or Feature" },
+ "Chest Finding or Feature" },
{ 0, 0, 0, 6102, // 1.2.840.10008.6.1.422
- "Chest Finding Or Feature Modifier" },
+ "Chest Finding or Feature Modifier" },
{ 0, 0, 0, 6103, // 1.2.840.10008.6.1.423
- "Abnormal Lines Finding Or Feature" },
+ "Abnormal Lines Finding or Feature" },
{ 0, 0, 0, 6104, // 1.2.840.10008.6.1.424
- "Abnormal Opacity Finding Or Feature" },
+ "Abnormal Opacity Finding or Feature" },
{ 0, 0, 0, 6105, // 1.2.840.10008.6.1.425
- "Abnormal Lucency Finding Or Feature" },
+ "Abnormal Lucency Finding or Feature" },
{ 0, 0, 0, 6106, // 1.2.840.10008.6.1.426
- "Abnormal Texture Finding Or Feature" },
+ "Abnormal Texture Finding or Feature" },
{ 0, 0, 0, 6107, // 1.2.840.10008.6.1.427
"Width Descriptor" },
{ 0, 0, 0, 6108, // 1.2.840.10008.6.1.428
"Chest Anatomic Structure Abnormal Distribution" },
{ 0, 0, 0, 6109, // 1.2.840.10008.6.1.429
- "Radiographic Anatomy Finding Or Feature" },
+ "Radiographic Anatomy Finding or Feature" },
{ 0, 0, 0, 6110, // 1.2.840.10008.6.1.430
- "Lung Anatomy Finding Or Feature" },
+ "Lung Anatomy Finding or Feature" },
{ 0, 0, 0, 6111, // 1.2.840.10008.6.1.431
- "Bronchovascular Anatomy Finding Or Feature" },
+ "Bronchovascular Anatomy Finding or Feature" },
{ 0, 0, 0, 6112, // 1.2.840.10008.6.1.432
- "Pleura Anatomy Finding Or Feature" },
+ "Pleura Anatomy Finding or Feature" },
{ 0, 0, 0, 6113, // 1.2.840.10008.6.1.433
- "Mediastinum Anatomy Finding Or Feature" },
+ "Mediastinum Anatomy Finding or Feature" },
{ 0, 0, 0, 6114, // 1.2.840.10008.6.1.434
- "Osseous Anatomy Finding Or Feature" },
+ "Osseous Anatomy Finding or Feature" },
{ 0, 0, 0, 6115, // 1.2.840.10008.6.1.435
"Osseous Anatomy Modifiers" },
{ 0, 0, 0, 6116, // 1.2.840.10008.6.1.436
@@ -2516,7 +2609,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 7453, // 1.2.840.10008.6.1.517
"Performing Roles" },
{ 0, 0, 0, 7454, // 1.2.840.10008.6.1.518
- "Species" },
+ "Animal Taxonomic Rank Values" },
{ 0, 0, 0, 7455, // 1.2.840.10008.6.1.519
"Sex" },
{ 0, 0, 0, 7456, // 1.2.840.10008.6.1.520
@@ -2564,7 +2657,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 10008, // 1.2.840.10008.6.1.541
"Dose Related Distance Measurements" },
{ 0, 0, 0, 10009, // 1.2.840.10008.6.1.542
- "Measured/calculated" },
+ "Measured/Calculated" },
{ 0, 0, 0, 10010, // 1.2.840.10008.6.1.543
"Dose Measurement Devices" },
{ 0, 0, 0, 10011, // 1.2.840.10008.6.1.544
@@ -2626,7 +2719,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 12105, // 1.2.840.10008.6.1.572
"Intracranial Cerebral Vessels" },
{ 0, 0, 0, 12106, // 1.2.840.10008.6.1.573
- "Intracranial Cerebral Vessels (unilateral)" },
+ "Intracranial Cerebral Vessels (Unilateral)" },
{ 0, 0, 0, 12107, // 1.2.840.10008.6.1.574
"Upper Extremity Arteries" },
{ 0, 0, 0, 12108, // 1.2.840.10008.6.1.575
@@ -2636,13 +2729,13 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 12110, // 1.2.840.10008.6.1.577
"Lower Extremity Veins" },
{ 0, 0, 0, 12111, // 1.2.840.10008.6.1.578
- "Abdominal Arteries (lateral)" },
+ "Abdominal Arteries (Lateral)" },
{ 0, 0, 0, 12112, // 1.2.840.10008.6.1.579
- "Abdominal Arteries (unilateral)" },
+ "Abdominal Arteries (Unilateral)" },
{ 0, 0, 0, 12113, // 1.2.840.10008.6.1.580
- "Abdominal Veins (lateral)" },
+ "Abdominal Veins (Lateral)" },
{ 0, 0, 0, 12114, // 1.2.840.10008.6.1.581
- "Abdominal Veins (unilateral)" },
+ "Abdominal Veins (Unilateral)" },
{ 0, 0, 0, 12115, // 1.2.840.10008.6.1.582
"Renal Vessels" },
{ 0, 0, 0, 12116, // 1.2.840.10008.6.1.583
@@ -2959,9 +3052,9 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 6200, // 1.2.840.10008.6.1.787
"Colon Overall Assessment" },
{ 0, 0, 0, 6201, // 1.2.840.10008.6.1.788
- "Colon Finding Or Feature" },
+ "Colon Finding or Feature" },
{ 0, 0, 0, 6202, // 1.2.840.10008.6.1.789
- "Colon Finding Or Feature Modifier" },
+ "Colon Finding or Feature Modifier" },
{ 0, 0, 0, 6203, // 1.2.840.10008.6.1.790
"Colon Non-lesion Object Type" },
{ 0, 0, 0, 6204, // 1.2.840.10008.6.1.791
@@ -3120,7 +3213,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 12288, // 1.2.840.10008.6.1.868
"Cardiac Ultrasound Outflow Tracts Finding Sites" },
{ 0, 0, 0, 12289, // 1.2.840.10008.6.1.869
- "Cardiac Ultrasound Semilunar Valves, Annulate and Sinuses Finding Sites" },
+ "Cardiac Ultrasound Semilunar Valves, Annulus and Sinuses Finding Sites" },
{ 0, 0, 0, 12290, // 1.2.840.10008.6.1.870
"Cardiac Ultrasound Pulmonary Arteries Finding Sites" },
{ 0, 0, 0, 12291, // 1.2.840.10008.6.1.871
@@ -3153,12 +3246,12 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 4239, // 1.2.840.10008.6.1.885
"Anterior Chamber Depth Definition" },
{ 0, 0, 0, 4240, // 1.2.840.10008.6.1.886
- "Ophthalmic Measurement Or Calculation Data Source" },
+ "Ophthalmic Measurement or Calculation Data Source" },
{ 0, 0, 0, 4241, // 1.2.840.10008.6.1.887
"Ophthalmic Axial Length Selection Method" },
{ 0, 0, 0, 0, 0 },
{ 0, 0, 0, 4243, // 1.2.840.10008.6.1.889
- "Ophthalmic Axial Length Quality Metric Type" },
+ "Ophthalmic Quality Metric Type" },
{ 0, 0, 0, 4244, // 1.2.840.10008.6.1.890
"Ophthalmic Agent Concentration Units" },
{ 0, 0, 0, 91, // 1.2.840.10008.6.1.891
@@ -3388,7 +3481,7 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 12021, // 1.2.840.10008.6.1.1006
"Fetal Long Bone Anatomic Sites" },
{ 0, 0, 0, 12022, // 1.2.840.10008.6.1.1007
- "Fetal Cranium Bone Anatomic Sites" },
+ "Fetal Cranium Anatomic Sites" },
{ 0, 0, 0, 12023, // 1.2.840.10008.6.1.1008
"Pelvis and Uterus Anatomic Sites" },
{ 0, 0, 0, 7222, // 1.2.840.10008.6.1.1009
@@ -3420,11 +3513,11 @@ UIDTableEntry UIDTable[] = {
{ 0, 0, 0, 4026, // 1.2.840.10008.6.1.1022
"Primary Anatomic Structure for Intra-oral and Craniofacial Radiography" },
{ 0, 0, 0, 9401, // 1.2.840.10008.6.1.1023
- "IEC6127 Device Position Parameters" },
+ "IEC61217 Device Position Parameters" },
{ 0, 0, 0, 9402, // 1.2.840.10008.6.1.1024
- "IEC6127 Gantry Position Parameters" },
+ "IEC61217 Gantry Position Parameters" },
{ 0, 0, 0, 9403, // 1.2.840.10008.6.1.1025
- "IEC6127 Patient Support Position Parameters" },
+ "IEC61217 Patient Support Position Parameters" },
{ 0, 0, 0, 7035, // 1.2.840.10008.6.1.1026
"Actionable Finding Classification" },
{ 0, 0, 0, 7036, // 1.2.840.10008.6.1.1027
@@ -3499,12 +3592,128 @@ UIDTableEntry UIDTable[] = {
"Diffusion Tractography Algorithm Families" },
{ 0, 0, 0, 7263, // 1.2.840.10008.6.1.1062
"Diffusion Tractography Measurement Types" },
-{ 2206, 2, 1, 0, 0 },
+{ 0, 0, 0, 7490, // 1.2.840.10008.6.1.1063
+ "Research Animal Source Registries" },
+{ 0, 0, 0, 231, // 1.2.840.10008.6.1.1064
+ "Yes-No Only" },
+{ 0, 0, 0, 601, // 1.2.840.10008.6.1.1065
+ "Biosafety Levels" },
+{ 0, 0, 0, 602, // 1.2.840.10008.6.1.1066
+ "Biosafety Control Reasons" },
+{ 0, 0, 0, 7457, // 1.2.840.10008.6.1.1067
+ "Sex - Male Female or Both" },
+{ 0, 0, 0, 603, // 1.2.840.10008.6.1.1068
+ "Animal Room Types" },
+{ 0, 0, 0, 604, // 1.2.840.10008.6.1.1069
+ "Device Reuse" },
+{ 0, 0, 0, 605, // 1.2.840.10008.6.1.1070
+ "Animal Bedding Material" },
+{ 0, 0, 0, 606, // 1.2.840.10008.6.1.1071
+ "Animal Shelter Types" },
+{ 0, 0, 0, 607, // 1.2.840.10008.6.1.1072
+ "Animal Feed Types" },
+{ 0, 0, 0, 608, // 1.2.840.10008.6.1.1073
+ "Animal Feed Sources" },
+{ 0, 0, 0, 609, // 1.2.840.10008.6.1.1074
+ "Animal Feeding Methods" },
+{ 0, 0, 0, 610, // 1.2.840.10008.6.1.1075
+ "Water Types" },
+{ 0, 0, 0, 611, // 1.2.840.10008.6.1.1076
+ "Anesthesia Category Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 612, // 1.2.840.10008.6.1.1077
+ "Anesthesia Category Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 613, // 1.2.840.10008.6.1.1078
+ "Anesthesia Induction Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 614, // 1.2.840.10008.6.1.1079
+ "Anesthesia Induction Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 615, // 1.2.840.10008.6.1.1080
+ "Anesthesia Maintenance Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 616, // 1.2.840.10008.6.1.1081
+ "Anesthesia Maintenance Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 617, // 1.2.840.10008.6.1.1082
+ "Airway Management Method Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 618, // 1.2.840.10008.6.1.1083
+ "Airway Management Method Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 619, // 1.2.840.10008.6.1.1084
+ "Airway Management Sub-Method Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 620, // 1.2.840.10008.6.1.1085
+ "Airway Management Sub-Method Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 621, // 1.2.840.10008.6.1.1086
+ "Medication Type Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 622, // 1.2.840.10008.6.1.1087
+ "Medication Type Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 623, // 1.2.840.10008.6.1.1088
+ "Medication for Small Animal Anesthesia" },
+{ 0, 0, 0, 624, // 1.2.840.10008.6.1.1089
+ "Inhalational Anesthesia Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 625, // 1.2.840.10008.6.1.1090
+ "Injectable Anesthesia Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 626, // 1.2.840.10008.6.1.1091
+ "Premedication Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 627, // 1.2.840.10008.6.1.1092
+ "Neuromuscular Blocking Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 628, // 1.2.840.10008.6.1.1093
+ "Ancillary Medications for Small Animal Anesthesia" },
+{ 0, 0, 0, 629, // 1.2.840.10008.6.1.1094
+ "Carrier Gases for Small Animal Anesthesia" },
+{ 0, 0, 0, 630, // 1.2.840.10008.6.1.1095
+ "Local Anesthetics for Small Animal Anesthesia" },
+{ 0, 0, 0, 631, // 1.2.840.10008.6.1.1096
+ "Phase of Procedure Requiring Anesthesia" },
+{ 0, 0, 0, 632, // 1.2.840.10008.6.1.1097
+ "Phase of Surgical Procedure Requiring Anesthesia" },
+{ 0, 0, 0, 633, // 1.2.840.10008.6.1.1098
+ "Phase of Imaging Procedure Requiring Anesthesia" },
+{ 0, 0, 0, 634, // 1.2.840.10008.6.1.1099
+ "Phase of Animal Handling" },
+{ 0, 0, 0, 635, // 1.2.840.10008.6.1.1100
+ "Heating Method" },
+{ 0, 0, 0, 636, // 1.2.840.10008.6.1.1101
+ "Temperature Sensor Device Component Type for Small Animal Procedures" },
+{ 0, 0, 0, 637, // 1.2.840.10008.6.1.1102
+ "Exogenous Substance Types" },
+{ 0, 0, 0, 638, // 1.2.840.10008.6.1.1103
+ "Exogenous Substance" },
+{ 0, 0, 0, 639, // 1.2.840.10008.6.1.1104
+ "Tumor Graft Histologic Type" },
+{ 0, 0, 0, 640, // 1.2.840.10008.6.1.1105
+ "Fibrils" },
+{ 0, 0, 0, 641, // 1.2.840.10008.6.1.1106
+ "Viruses" },
+{ 0, 0, 0, 642, // 1.2.840.10008.6.1.1107
+ "Cytokines" },
+{ 0, 0, 0, 643, // 1.2.840.10008.6.1.1108
+ "Toxins" },
+{ 0, 0, 0, 644, // 1.2.840.10008.6.1.1109
+ "Exogenous Substance Administration Sites" },
+{ 0, 0, 0, 645, // 1.2.840.10008.6.1.1110
+ "Exogenous Substance Tissue of Origin" },
+{ 0, 0, 0, 646, // 1.2.840.10008.6.1.1111
+ "Preclinical Small Animal Imaging Procedures" },
+{ 0, 0, 0, 647, // 1.2.840.10008.6.1.1112
+ "Position Reference Indicator for Frame of Reference" },
+{ 0, 0, 0, 241, // 1.2.840.10008.6.1.1113
+ "Present-Absent Only" },
+{ 0, 0, 0, 10024, // 1.2.840.10008.6.1.1114
+ "Water Equivalent Diameter Method" },
+{ 0, 0, 0, 7022, // 1.2.840.10008.6.1.1115
+ "Radiotherapy Purposes of Reference" },
+{ 0, 0, 0, 701, // 1.2.840.10008.6.1.1116
+ "Content Assessment Types" },
+{ 0, 0, 0, 702, // 1.2.840.10008.6.1.1117
+ "RT Content Assessment Types" },
+{ 0, 0, 0, 703, // 1.2.840.10008.6.1.1118
+ "Basis of Assessment" },
+{ 0, 0, 0, 7449, // 1.2.840.10008.6.1.1119
+ "Reader Specialty" },
+{ 0, 0, 0, 9233, // 1.2.840.10008.6.1.1120
+ "Requested Report Types" },
+{ 2346, 2, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.7.1.1
"Native DICOM Model" },
{ 0, 0, 0, 0, // 1.2.840.10008.7.1.2
"Abstract Multi-Dimensional Image Model" },
-{ 2209, 1, 1, 0, 0 },
+{ 2349, 1, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.8.1.1
"DICOM Content Mapping Resource" },
{ 0, 0, 0, 0, // 1.2.840.10008.9.1
@@ -3555,10 +3764,10 @@ UIDTableEntry UIDTable[] = {
"General Section Entries" },
{ 0, 0, 0, 0, // 1.2.840.10008.9.24
"Imaging Addendum Report" },
-{ 2236, 2, 3, 0, 0 },
-{ 2277, 1, 1, 0, 0 },
-{ 2238, 31, 1, 0, 0 },
-{ 2269, 8, 1, 0, 0 },
+{ 2376, 2, 3, 0, 0 },
+{ 2417, 1, 1, 0, 0 },
+{ 2378, 31, 1, 0, 0 },
+{ 2409, 8, 1, 0, 0 },
{ 0, 0, 0, 0, // 1.2.840.10008.15.0.3.1
"dicomDeviceName" },
{ 0, 0, 0, 0, // 1.2.840.10008.15.0.3.2
@@ -3641,65 +3850,65 @@ UIDTableEntry UIDTable[] = {
"Universal Coordinated Time" },
};
-UIDTableEntry *GetUIDTableEntry(const char *uid)
+const UIDTableEntry *GetUIDTableEntry(const char *uid)
{
if (uid == 0)
- {
+ {
return 0;
- }
+ }
const char *prefix = "1.2.840.10008.";
while (*prefix != '\0' && *uid != '\0' && *prefix == *uid)
- {
+ {
prefix++;
uid++;
- }
+ }
if (*prefix != '\0')
- {
+ {
return 0;
- }
+ }
- UIDTableEntry *table = UIDTable;
+ const UIDTableEntry *table = UIDTable;
while (*uid != '\0')
- {
+ {
int i = -1;
if (*uid >= '0' && *uid <= '9')
- {
+ {
if (uid[0] != '0' || uid[1] != '0')
- {
+ {
i = 0;
do
- {
+ {
i *= 10;
i += (*uid - '0');
uid++;
- }
- while (*uid >= '0' && *uid <= '9' && i < 214748364);
}
+ while (*uid >= '0' && *uid <= '9' && i < 214748364);
}
+ }
if (*uid == '.')
- {
+ {
uid++;
if (*uid == '\0')
- {
+ {
table = 0;
break;
- }
}
+ }
else if (*uid != '\0')
- {
+ {
table = 0;
break;
- }
+ }
i -= table->First;
if (i < 0 || i >= static_cast<int>(table->Size))
- {
+ {
table = 0;
break;
- }
- table = &UIDTable[table->Next + i];
}
+ table = &UIDTable[table->Next + i];
+ }
return table;
}
@@ -3709,24 +3918,24 @@ UIDTableEntry *GetUIDTableEntry(const char *uid)
const char *vtkDICOMUtilities::GetUIDName(const char *uid)
{
const char *result = "";
- UIDTableEntry *table = GetUIDTableEntry(uid);
+ const UIDTableEntry *table = GetUIDTableEntry(uid);
if (table)
- {
+ {
if (table->Name)
- {
+ {
result = table->Name;
- }
}
+ }
return result;
}
unsigned short vtkDICOMUtilities::GetCIDFromUID(const char *uid)
{
unsigned short result = 0;
- UIDTableEntry *table = GetUIDTableEntry(uid);
+ const UIDTableEntry *table = GetUIDTableEntry(uid);
if (table)
- {
+ {
result = table->CID;
- }
+ }
return result;
}
diff --git a/Source/vtkDICOMVM.cxx b/Source/vtkDICOMVM.cxx
index c7b8ed9..fd87d3a 100644
--- a/Source/vtkDICOMVM.cxx
+++ b/Source/vtkDICOMVM.cxx
@@ -20,21 +20,21 @@ ostream& operator<<(ostream& o, const vtkDICOMVM& a)
int s = a.GetStep();
o << n;
if (m > n || m < 0)
- {
+ {
o << "-";
if (s > 1)
- {
+ {
o << s;
- }
+ }
if (m > 0)
- {
+ {
o << m;
- }
+ }
else
- {
+ {
o << "n";
- }
}
+ }
return o;
}
diff --git a/Source/vtkDICOMVM.h b/Source/vtkDICOMVM.h
index fd9fc41..eff5fc7 100644
--- a/Source/vtkDICOMVM.h
+++ b/Source/vtkDICOMVM.h
@@ -432,12 +432,15 @@ public:
M8192 = 0xA000
};
+ //@{
//! Construct an empty, invalid VM.
vtkDICOMVM() : Key(0) {}
//! Construct a VM from a VM enum constant.
vtkDICOMVM(EnumType vm) : Key(static_cast<unsigned short>(vm)) {}
+ //@}
+ //@{
//! Check validity of this VM.
bool IsValid() const { return (this->Key != 0); }
@@ -455,13 +458,16 @@ public:
int GetStep() const {
if ((this->Key & 0x8000) != 0) { return 1; }
else { return ((this->Key & 0x80) == 0 ? 1 : ((-this->Key) & 0xff)); } }
+ //@}
+ //@{
bool operator==(vtkDICOMVM b) const { return (this->Key == b.Key); }
bool operator!=(vtkDICOMVM b) const { return (this->Key != b.Key); }
bool operator<=(vtkDICOMVM a) const { return (this->Key <= a.Key); }
bool operator>=(vtkDICOMVM a) const { return (this->Key >= a.Key); }
bool operator<(vtkDICOMVM a) const { return (this->Key < a.Key); }
bool operator>(vtkDICOMVM a) const { return (this->Key > a.Key); }
+ //@}
private:
unsigned short Key;
diff --git a/Source/vtkDICOMVR.h b/Source/vtkDICOMVR.h
index 23e915f..148f51e 100644
--- a/Source/vtkDICOMVR.h
+++ b/Source/vtkDICOMVR.h
@@ -63,6 +63,7 @@ public:
XS = 0x21 //!< Either SS or US (for dict entries, not data elements)
};
+ //@{
//! Construct an empty, invalid VR.
vtkDICOMVR() : Key(0) {}
@@ -75,7 +76,9 @@ public:
//! Attempt to construct a VR from a two unsigned bytes.
vtkDICOMVR(const unsigned char vr[2]) : Key(VRTable[vr[0]][vr[1]]) {}
+ //@}
+ //@{
//! Check validity of this VR.
bool IsValid() const { return (this->Key != 0); }
@@ -84,7 +87,9 @@ public:
//! Get the two-character text for this VR.
const char *GetText() const { return TextTable[this->Key]; }
+ //@}
+ //@{
//! The VRs OB, OD, OF, OL, OW, SQ, UC, UN, UR, UT require a 32-bit VL.
bool HasLongVL() const {
return (((1ull << this->Key) & 0xb223e001u) != 0); }
@@ -113,13 +118,16 @@ public:
*/
bool HasSingleValue() const {
return (((1ull << this->Key) & 0x80801000u) != 0); }
+ //@}
+ //@{
bool operator==(vtkDICOMVR a) const { return (this->Key == a.Key); }
bool operator!=(vtkDICOMVR a) const { return (this->Key != a.Key); }
bool operator<=(vtkDICOMVR a) const { return (this->Key <= a.Key); }
bool operator>=(vtkDICOMVR a) const { return (this->Key >= a.Key); }
bool operator<(vtkDICOMVR a) const { return (this->Key < a.Key); }
bool operator>(vtkDICOMVR a) const { return (this->Key > a.Key); }
+ //@}
private:
unsigned char Key;
diff --git a/Source/vtkDICOMValue.cxx b/Source/vtkDICOMValue.cxx
index 18835ee..95d1836 100644
--- a/Source/vtkDICOMValue.cxx
+++ b/Source/vtkDICOMValue.cxx
@@ -58,48 +58,48 @@ void StringConversion(
const char *cp, vtkDICOMVR vr, OT *v, size_t i, size_t n)
{
if (vr == vtkDICOMVR::IS || vr == vtkDICOMVR::DS)
- {
+ {
for (size_t j = 0; j < i && *cp != '\0'; j++)
- {
+ {
bool bk = false;
do
- {
+ {
bk = (*cp == '\\');
cp++;
- }
- while (!bk && *cp != '\0');
}
+ while (!bk && *cp != '\0');
+ }
for (size_t k = 0; k < n && *cp != '\0'; k++)
- {
+ {
if (vr == vtkDICOMVR::DS)
- {
+ {
*v++ = static_cast<OT>(strtod(cp, NULL));
- }
+ }
else
- {
+ {
*v++ = static_cast<OT>(strtol(cp, NULL, 10));
- }
+ }
bool bk = false;
do
- {
+ {
bk = (*cp == '\\');
cp++;
- }
- while (!bk && *cp != '\0');
}
+ while (!bk && *cp != '\0');
}
+ }
else if (n > 0)
- {
+ {
do { *v++ = 0; } while (--n);
- }
+ }
}
// specialize conversion for vtkDICOMTag
void StringConversionAT(const char *cp, vtkDICOMTag *v, size_t n)
{
for (size_t k = 0; k < n && *cp != '\0'; k++)
- {
+ {
while (!IsHexDigit(*cp) && *cp != '\\' && *cp != '\0') { cp++; }
const char *dp = cp;
while (IsHexDigit(*dp)) { dp++; }
@@ -110,12 +110,12 @@ void StringConversionAT(const char *cp, vtkDICOMTag *v, size_t n)
bool bk = false;
do
- {
+ {
bk = (*cp == '\\');
cp++;
- }
- while (!bk && *cp != '\0');
}
+ while (!bk && *cp != '\0');
+ }
}
// custom allocator
@@ -123,20 +123,20 @@ void *ValueMalloc(size_t size)
{
void *vp = 0;
while ((vp = malloc(size)) == 0)
- {
+ {
// for C++11, get_new_handler is preferred
std::new_handler global_handler = std::set_new_handler(0);
std::set_new_handler(global_handler);
if (global_handler)
- {
+ {
global_handler();
- }
+ }
else
- {
+ {
throw std::bad_alloc();
- }
}
+ }
return vp;
}
@@ -164,8 +164,8 @@ vtkDICOMValue::ValueT<T>::ValueT(vtkDICOMVR vr, size_t vn)
this->CharacterSet = 0;
this->Overflow = OVERFLOW_BYTE(vn);
this->VR = vr;
- this->VL = vn*sizeof(T);
- this->NumberOfValues = vn;
+ this->VL = static_cast<unsigned int>(vn*sizeof(T));
+ this->NumberOfValues = static_cast<unsigned int>(vn);
}
// Construct a string value.
@@ -177,7 +177,7 @@ vtkDICOMValue::ValueT<char>::ValueT(vtkDICOMVR vr, size_t vn)
this->CharacterSet = 0;
this->Overflow = OVERFLOW_BYTE(vn);
this->VR = vr;
- this->VL = vn;
+ this->VL = static_cast<unsigned int>(vn);
this->NumberOfValues = (vn > 0);
}
@@ -189,8 +189,9 @@ vtkDICOMValue::ValueT<unsigned char>::ValueT(vtkDICOMVR vr, size_t vn)
this->CharacterSet = 0;
this->Overflow = OVERFLOW_BYTE(vn);
this->VR = vr;
- this->VL = vn + (vn & 1); // pad VL to make it even
- this->NumberOfValues = vn;
+ // pad VL to make it even
+ this->VL = static_cast<unsigned int>(vn + (vn & 1));
+ this->NumberOfValues = static_cast<unsigned int>(vn);
}
// Construct a list of attribute tags.
@@ -201,15 +202,15 @@ vtkDICOMValue::ValueT<vtkDICOMTag>::ValueT(vtkDICOMVR vr, size_t vn)
this->CharacterSet = 0;
this->Overflow = OVERFLOW_BYTE(vn);
this->VR = vr;
- this->VL = 4*vn;
- this->NumberOfValues = vn;
+ this->VL = static_cast<unsigned int>(4*vn);
+ this->NumberOfValues = static_cast<unsigned int>(vn);
vtkDICOMTag *dp = this->Data;
for (size_t i = 0; i < vn; i++)
- {
+ {
// call constructor manually with placement new
new(dp) vtkDICOMTag();
dp++;
- }
+ }
}
// Construct a sequence of items.
@@ -221,14 +222,14 @@ vtkDICOMValue::ValueT<vtkDICOMItem>::ValueT(vtkDICOMVR vr, size_t vn)
this->Overflow = OVERFLOW_BYTE(vn);
this->VR = vr; // better be SQ
this->VL = 0;
- this->NumberOfValues = vn;
+ this->NumberOfValues = static_cast<unsigned int>(vn);
vtkDICOMItem *dp = this->Data;
for (size_t i = 0; i < vn; i++)
- {
+ {
// call constructor manually with placement new
new(dp) vtkDICOMItem();
dp++;
- }
+ }
}
// Construct a list of values.
@@ -240,14 +241,14 @@ vtkDICOMValue::ValueT<vtkDICOMValue>::ValueT(vtkDICOMVR vr, size_t vn)
this->Overflow = OVERFLOW_BYTE(vn);
this->VR = vr;
this->VL = 0;
- this->NumberOfValues = vn;
+ this->NumberOfValues = static_cast<unsigned int>(vn);
vtkDICOMValue *dp = this->Data;
for (size_t i = 0; i < vn; i++)
- {
+ {
// call constructor manually with placement new
new(dp) vtkDICOMValue();
dp++;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -323,9 +324,9 @@ char *vtkDICOMValue::AllocateCharData(
{
char *data = this->Allocate<char>(vr, vn);
if (vr.HasSpecificCharacterSet() && this->V)
- {
+ {
this->V->CharacterSet = cs.GetKey();
- }
+ }
return data;
}
@@ -389,32 +390,32 @@ vtkDICOMValue *vtkDICOMValue::AllocateMultiplexData(
void vtkDICOMValue::ComputeNumberOfValuesForCharData()
{
if (this->V && this->V->Type == VTK_CHAR)
- {
+ {
if (this->V->VL == 0)
- {
+ {
this->V->NumberOfValues = 0;
- }
+ }
else if (this->V->VR.HasSingleValue())
- {
+ {
this->V->NumberOfValues = 1;
- }
+ }
else
- {
+ {
const char *ptr = static_cast<const ValueT<char> *>(this->V)->Data;
unsigned int n = 1;
size_t vl = this->V->VL;
if (this->V->CharacterSet == 0)
- {
+ {
do { n += (*ptr++ == '\\'); } while (--vl);
- }
+ }
else
- {
+ {
vtkDICOMCharacterSet cs = this->GetCharacterSet();
n += cs.CountBackslashes(ptr, vl);
- }
- this->V->NumberOfValues = n;
}
+ this->V->NumberOfValues = n;
}
+ }
}
//----------------------------------------------------------------------------
@@ -441,9 +442,9 @@ unsigned char *vtkDICOMValue::ReallocateUnsignedCharData(size_t vn)
// decrement the refcount of the old V
if (--(v->ReferenceCount) == 0)
- {
+ {
vtkDICOMValue::FreeValue(v);
- }
+ }
return ptr;
}
@@ -460,182 +461,182 @@ void vtkDICOMValue::CreateValue(vtkDICOMVR vr, const T *data, size_t n)
this->V = 0;
if (vr == VR::OX)
- {
+ {
// OX means "OB or OW", use type to find out which
vr = (vt == VTK_UNSIGNED_CHAR ? VR::OB : VR::OW);
- }
+ }
else if (vr == VR::XS)
- {
+ {
// XS means "SS or US", use type to find out which
vr = (vt == VTK_UNSIGNED_SHORT ? VR::US : VR::SS);
- }
+ }
// use VR to set data type, then convert input to that type
if (vr == VR::FD)
- {
+ {
double *ptr = this->AllocateDoubleData(vr, n);
NumericalConversion(data, ptr, n);
- }
+ }
else if (vr == VR::FL)
- {
+ {
float *ptr = this->AllocateFloatData(vr, n);
NumericalConversion(data, ptr, n);
- }
+ }
else if (vr == VR::UL)
- {
+ {
unsigned int *ptr = this->AllocateUnsignedIntData(vr, n);
NumericalConversion(data, ptr, n);
- }
+ }
else if (vr == VR::SL)
- {
+ {
int *ptr = this->AllocateIntData(vr, n);
NumericalConversion(data, ptr, n);
- }
+ }
else if (vr == VR::US)
- {
+ {
unsigned short *ptr = this->AllocateUnsignedShortData(vr, n);
NumericalConversion(data, ptr, n);
- }
+ }
else if (vr == VR::SS)
- {
+ {
short *ptr = this->AllocateShortData(vr, n);
NumericalConversion(data, ptr, n);
- }
+ }
else if (vr == VR::DS)
- {
+ {
char *cp = this->AllocateCharData(vr, 17*n);
char *dp = cp;
for (size_t i = 0; i < n; i++)
- {
+ {
double d = static_cast<double>(data[i]);
// clamp to the range allowed for DICOM decimal strings
if (d > 9.999999999e+99)
- {
+ {
d = 9.999999999e+99;
- }
+ }
else if (d < -9.999999999e+99)
- {
+ {
d = -9.999999999e+99;
- }
+ }
else if (fabs(d) < 1e-99 || vtkMath::IsNan(d))
- {
+ {
d = 0.0;
- }
+ }
// use a precision that will use 16 characters maximum
sprintf(cp, "%.10g", d);
size_t dl = strlen(cp);
// look for extra leading zeros on exponent
if (dl >= 5 && (cp[dl-5] == 'e' || cp[dl-5] =='E') && cp[dl-3] == '0')
- {
+ {
cp[dl-3] = cp[dl-2];
cp[dl-2] = cp[dl-1];
cp[dl-1] = '\0';
dl--;
- }
+ }
cp += dl;
*cp++ = '\\';
- }
+ }
if (cp != dp) { --cp; }
this->V->NumberOfValues = static_cast<unsigned int>(n);
this->V->VL = static_cast<unsigned int>(cp - dp);
if (this->V->VL & 1)
- { // pad to even number of chars
+ { // pad to even number of chars
*cp++ = ' ';
this->V->VL++;
- }
- *cp = '\0';
}
+ *cp = '\0';
+ }
else if (vr == VR::IS)
- {
+ {
char *cp = this->AllocateCharData(vr, 13*n);
char *dp = cp;
for (size_t i = 0; i < n; i++)
- {
+ {
sprintf(cp, "%i", static_cast<int>(data[i]));
cp += strlen(cp);
*cp++ = '\\';
- }
+ }
if (cp != dp) { --cp; }
this->V->NumberOfValues = static_cast<unsigned int>(n);
this->V->VL = static_cast<unsigned int>(cp - dp);
if (this->V->VL & 1)
- { // pad to even number of chars
+ { // pad to even number of chars
*cp++ = ' ';
this->V->VL++;
- }
- *cp = '\0';
}
+ *cp = '\0';
+ }
else if (vr == VR::OB || vr == VR::UN)
- {
+ {
size_t m = n*sizeof(T);
int pad = (m & 1);
unsigned char *ptr = this->AllocateUnsignedCharData(vr, m + pad);
memcpy(ptr, data, m);
if (pad) { ptr[m] = 0; } // pad to even
this->V->NumberOfValues = static_cast<unsigned int>(m);
- }
+ }
else if (vr == VR::OW)
- {
+ {
if (vt == VTK_SHORT)
- {
+ {
short *ptr = this->AllocateShortData(vr, n);
memcpy(ptr, data, n*2);
- }
+ }
else
- {
+ {
unsigned short *ptr = this->AllocateUnsignedShortData(vr, n*sizeof(T)/2);
memcpy(ptr, data, n*sizeof(T));
- }
}
+ }
else if (vr == VR::OL)
- {
+ {
if (vt == VTK_INT)
- {
+ {
int *ptr = this->AllocateIntData(vr, n);
memcpy(ptr, data, n*4);
- }
+ }
else
- {
+ {
unsigned int *ptr = this->AllocateUnsignedIntData(vr, n*sizeof(T)/4);
memcpy(ptr, data, n*sizeof(T));
- }
}
+ }
else if (vr == VR::OF)
- {
+ {
float *ptr = this->AllocateFloatData(vr, n*sizeof(T)/4);
memcpy(ptr, data, n*sizeof(T));
- }
+ }
else if (vr == VR::OD)
- {
+ {
double *ptr = this->AllocateDoubleData(vr, n*sizeof(T)/8);
memcpy(ptr, data, n*sizeof(T));
- }
+ }
else if (vr == VR::AT)
- {
+ {
if (sizeof(T) > 2)
- {
+ {
// subsequent values represent 32-bit keys
vtkDICOMTag *ptr = this->AllocateTagData(vr, n);
for (size_t i = 0; i < n; i++)
- {
+ {
unsigned int k = static_cast<unsigned int>(data[i]);
unsigned short g = static_cast<unsigned short>(k >> 16);
unsigned short e = static_cast<unsigned short>(k);
ptr[i] = vtkDICOMTag(g,e);
- }
}
+ }
else
- {
+ {
// subsequent values represent group,element pairs
vtkDICOMTag *ptr = this->AllocateTagData(vr, n/2);
for (size_t i = 0; i < n; i += 2)
- {
+ {
unsigned short g = static_cast<unsigned short>(data[i]);
unsigned short e = static_cast<unsigned short>(data[i+1]);
ptr[i/2] = vtkDICOMTag(g,e);
- }
}
}
+ }
}
template<>
@@ -649,13 +650,13 @@ void vtkDICOMValue::CreateValue<vtkDICOMTag>(
this->V = 0;
if (vr == VR::AT)
- {
+ {
vtkDICOMTag *ptr = this->AllocateTagData(vr, n);
for (size_t i = 0; i < n; i++)
- {
+ {
ptr[i] = data[i];
- }
}
+ }
}
template<>
@@ -669,13 +670,13 @@ void vtkDICOMValue::CreateValue<vtkDICOMItem>(
this->V = 0;
if (vr == VR::SQ)
- {
+ {
vtkDICOMItem *ptr = this->AllocateSequenceData(vr, n);
for (size_t i = 0; i < n; i++)
- {
+ {
ptr[i] = data[i];
- }
}
+ }
}
template<>
@@ -690,7 +691,7 @@ void vtkDICOMValue::CreateValue<char>(
// directly copy data into these VRs without conversion
if (vr.HasSingleValue())
- {
+ {
int pad = (m & 1);
char *ptr = this->AllocateCharData(vr, m + pad);
memcpy(ptr, data, m);
@@ -698,51 +699,51 @@ void vtkDICOMValue::CreateValue<char>(
if (pad) { ptr[m++] = ' '; }
ptr[m] = '\0';
this->V->NumberOfValues = 1;
- }
+ }
else if (vr == VR::OW)
- {
+ {
unsigned short *ptr = this->AllocateUnsignedShortData(vr, m/2);
memcpy(ptr, data, m);
- }
+ }
else if (vr == VR::OL)
- {
+ {
unsigned int *ptr = this->AllocateUnsignedIntData(vr, m/4);
memcpy(ptr, data, m);
- }
+ }
else if (vr == VR::OF)
- {
+ {
float *ptr = this->AllocateFloatData(vr, m/4);
memcpy(ptr, data, m);
- }
+ }
else if (vr == VR::OD)
- {
+ {
double *ptr = this->AllocateDoubleData(vr, m/8);
memcpy(ptr, data, m);
- }
+ }
else if (vr == VR::UN || vr == VR::OB || vr == VR::OX)
- {
+ {
int pad = (m & 1);
unsigned char *ptr = this->AllocateUnsignedCharData(vr, m + pad);
memcpy(ptr, data, m);
// pad to even length with a null
if (pad != 0) { ptr[m] = 0; }
- }
+ }
if (this->V)
- {
+ {
return;
- }
+ }
// count the number of backslash-separated values
size_t n = (m > 0);
for (size_t i = 0; i < m; i++)
- {
+ {
n += (data[i] == '\\');
- }
+ }
// convert input string to the specified VR
if (vr.HasTextValue())
- {
+ {
int pad = (m & 1);
char *cp = this->AllocateCharData(vr, m);
strncpy(cp, data, m);
@@ -750,42 +751,42 @@ void vtkDICOMValue::CreateValue<char>(
if (pad && vr != VR::UI) { cp[m++] = ' '; }
cp[m] = '\0';
this->V->NumberOfValues = static_cast<unsigned int>(n);
- }
+ }
else if (vr == VR::FD)
- {
+ {
double *ptr = this->AllocateDoubleData(vr, n);
StringConversion(data, VR::DS, ptr, 0, n);
- }
+ }
else if (vr == VR::FL)
- {
+ {
float *ptr = this->AllocateFloatData(vr, n);
StringConversion(data, VR::DS, ptr, 0, n);
- }
+ }
else if (vr == VR::UL)
- {
+ {
unsigned int *ptr = this->AllocateUnsignedIntData(vr, n);
StringConversion(data, VR::IS, ptr, 0, n);
- }
+ }
else if (vr == VR::SL)
- {
+ {
int *ptr = this->AllocateIntData(vr, n);
StringConversion(data, VR::IS, ptr, 0, n);
- }
+ }
else if (vr == VR::US)
- {
+ {
unsigned short *ptr = this->AllocateUnsignedShortData(vr, n);
StringConversion(data, VR::IS, ptr, 0, n);
- }
+ }
else if (vr == VR::SS || vr == VR::XS)
- {
+ {
short *ptr = this->AllocateShortData(vr, n);
StringConversion(data, VR::IS, ptr, 0, n);
- }
+ }
else if (vr == VR::AT)
- {
+ {
vtkDICOMTag *ptr = this->AllocateTagData(vr, n);
StringConversionAT(data, ptr, n);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -886,14 +887,14 @@ void vtkDICOMValue::CreateValueWithSpecificCharacterSet(
{
this->CreateValue(vr, data, l);
if (vr.HasSpecificCharacterSet() && this->V)
- {
+ {
this->V->CharacterSet = cs.GetKey();
// character set might change interpretation of backslashes
if (cs.GetKey() > vtkDICOMCharacterSet::ISO_IR_192)
- {
+ {
this->ComputeNumberOfValuesForCharData();
- }
}
+ }
}
vtkDICOMValue::vtkDICOMValue(
@@ -916,49 +917,49 @@ vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr)
this->V = 0;
if (vr.HasTextValue())
- {
+ {
this->AllocateCharData(vr, 0);
- }
+ }
else if (vr == VR::OW || vr == VR::OX)
- {
+ {
this->AllocateUnsignedShortData(VR::OW, 0);
- }
+ }
else if (vr == VR::OF || vr == VR::FL)
- {
+ {
this->AllocateFloatData(vr, 0);
- }
+ }
else if (vr == VR::OD || vr == VR::FD)
- {
+ {
this->AllocateDoubleData(vr, 0);
- }
+ }
else if (vr == VR::OB || vr == VR::UN)
- {
+ {
this->AllocateUnsignedCharData(vr, 0);
- }
+ }
else if (vr == VR::OL || vr == VR::UL)
- {
+ {
this->AllocateUnsignedIntData(vr, 0);
- }
+ }
else if (vr == VR::SL)
- {
+ {
this->AllocateIntData(vr, 0);
- }
+ }
else if (vr == VR::US)
- {
+ {
this->AllocateUnsignedShortData(vr, 0);
- }
+ }
else if (vr == VR::SS || vr == VR::XS)
- {
+ {
this->AllocateShortData(VR::SS, 0);
- }
+ }
else if (vr == VR::AT)
- {
+ {
this->AllocateTagData(vr, 0);
- }
+ }
else if (vr == VR::SQ)
- {
+ {
this->AllocateSequenceData(vr, 0);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -967,30 +968,30 @@ vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr)
void vtkDICOMValue::FreeValue(Value *v)
{
if (v)
- {
+ {
if (v->Type == VTK_DICOM_ITEM)
- {
+ {
vtkDICOMItem *dp = static_cast<ValueT<vtkDICOMItem> *>(v)->Data;
for (size_t i = 0; i < v->NumberOfValues; i++)
- {
+ {
// placement new was used, so destructor must be called manually
dp->~vtkDICOMItem();
dp++;
- }
}
+ }
else if (v->Type == VTK_DICOM_VALUE)
- {
+ {
vtkDICOMValue *dp = static_cast<ValueT<vtkDICOMValue> *>(v)->Data;
for (size_t i = 0; i < v->NumberOfValues; i++)
- {
+ {
// placement new was used, so destructor must be called manually
dp->~vtkDICOMValue();
dp++;
- }
}
+ }
ValueFree(v);
- }
+ }
}
//----------------------------------------------------------------------------
template<class T>
@@ -1011,9 +1012,9 @@ void vtkDICOMValue::AppendValue(const T &item)
{
// do nothing if not initialized yet
if (this->V == 0)
- {
+ {
return;
- }
+ }
T *ptr = static_cast<vtkDICOMValue::ValueT<T> *>(this->V)->Data;
@@ -1021,33 +1022,33 @@ void vtkDICOMValue::AppendValue(const T &item)
size_t nn = 0;
// reallocate if not unique reference, or not yet growable
if (this->V->ReferenceCount != 1 || this->V->VL != 0xffffffff)
- {
+ {
// get next power of two that is greater than n
nn = 1;
do { nn <<= 1; } while (nn <= n);
- }
+ }
// reallocate if n is a power of two
else if (n > 1 && ((n - 1) & n) == 0)
- {
+ {
nn = 2*n;
- }
+ }
// reallocate the array
if (nn != 0)
- {
+ {
vtkDICOMValue::Value *v = this->V;
++(v->ReferenceCount);
const T *cptr = ptr;
ptr = this->Allocate<T>(v->VR, nn);
this->V->NumberOfValues = static_cast<unsigned int>(n);
for (size_t i = 0; i < n; i++)
- {
+ {
ptr[i] = cptr[i];
- }
+ }
if (--(v->ReferenceCount) == 0)
- {
+ {
vtkDICOMValue::FreeValue(v);
- }
}
+ }
// mark as growable
this->V->VL = 0xffffffff;
@@ -1070,15 +1071,15 @@ void vtkDICOMValue::SetValue(size_t i, const T &item)
// reallocate the array if we aren't the sole owner
assert(this->V->ReferenceCount == 1);
if (this->V->ReferenceCount != 1)
- {
+ {
size_t m = this->V->NumberOfValues;
const T *cptr = ptr;
ptr = this->Allocate<T>(this->V->VR, m);
for (size_t j = 0; j < m; j++)
- {
+ {
ptr[j] = cptr[j];
- }
}
+ }
ptr[i] = item;
}
@@ -1091,9 +1092,9 @@ const char *vtkDICOMValue::GetCharData() const
{
const char *ptr = 0;
if (this->V && this->V->Type == VTK_CHAR)
- {
+ {
ptr = static_cast<const ValueT<char> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1101,9 +1102,9 @@ const unsigned char *vtkDICOMValue::GetUnsignedCharData() const
{
const unsigned char *ptr = 0;
if (this->V && this->V->Type == VTK_UNSIGNED_CHAR)
- {
+ {
ptr = static_cast<const ValueT<unsigned char> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1111,18 +1112,18 @@ const short *vtkDICOMValue::GetShortData() const
{
const short *ptr = 0;
if (this->V)
- {
+ {
if (this->V->Type == VTK_SHORT)
- {
+ {
ptr = static_cast<const ValueT<short> *>(this->V)->Data;
- }
+ }
else if (this->V->Type == VTK_UNSIGNED_SHORT &&
this->V->VR == vtkDICOMVR::OW)
- {
+ {
ptr = reinterpret_cast<const short *>(
static_cast<const ValueT<unsigned short> *>(this->V)->Data);
- }
}
+ }
return ptr;
}
@@ -1130,18 +1131,18 @@ const unsigned short *vtkDICOMValue::GetUnsignedShortData() const
{
const unsigned short *ptr = 0;
if (this->V)
- {
+ {
if (this->V->Type == VTK_UNSIGNED_SHORT)
- {
+ {
ptr = static_cast<const ValueT<unsigned short> *>(this->V)->Data;
- }
+ }
else if (this->V->Type == VTK_SHORT &&
this->V->VR == vtkDICOMVR::OW)
- {
+ {
ptr = reinterpret_cast<const unsigned short *>(
static_cast<const ValueT<short> *>(this->V)->Data);
- }
}
+ }
return ptr;
}
@@ -1149,18 +1150,18 @@ const int *vtkDICOMValue::GetIntData() const
{
const int *ptr = 0;
if (this->V)
- {
+ {
if (this->V->Type == VTK_INT)
- {
+ {
ptr = static_cast<const ValueT<int> *>(this->V)->Data;
- }
+ }
else if (this->V->Type == VTK_UNSIGNED_INT &&
this->V->VR == vtkDICOMVR::OL)
- {
+ {
ptr = reinterpret_cast<const int *>(
static_cast<const ValueT<unsigned int> *>(this->V)->Data);
- }
}
+ }
return ptr;
}
@@ -1168,18 +1169,18 @@ const unsigned int *vtkDICOMValue::GetUnsignedIntData() const
{
const unsigned int *ptr = 0;
if (this->V)
- {
+ {
if (this->V->Type == VTK_UNSIGNED_INT)
- {
+ {
ptr = static_cast<const ValueT<unsigned int> *>(this->V)->Data;
- }
+ }
else if (this->V->Type == VTK_INT &&
this->V->VR == vtkDICOMVR::OL)
- {
+ {
ptr = reinterpret_cast<const unsigned int *>(
static_cast<const ValueT<int> *>(this->V)->Data);
- }
}
+ }
return ptr;
}
@@ -1187,9 +1188,9 @@ const float *vtkDICOMValue::GetFloatData() const
{
const float *ptr = 0;
if (this->V && this->V->Type == VTK_FLOAT)
- {
+ {
ptr = static_cast<const ValueT<float> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1197,9 +1198,9 @@ const double *vtkDICOMValue::GetDoubleData() const
{
const double *ptr = 0;
if (this->V && this->V->Type == VTK_DOUBLE)
- {
+ {
ptr = static_cast<const ValueT<double> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1207,9 +1208,9 @@ const vtkDICOMTag *vtkDICOMValue::GetTagData() const
{
const vtkDICOMTag *ptr = 0;
if (this->V && this->V->Type == VTK_DICOM_TAG)
- {
+ {
ptr = static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1217,9 +1218,9 @@ const vtkDICOMItem *vtkDICOMValue::GetSequenceData() const
{
const vtkDICOMItem *ptr = 0;
if (this->V && this->V->Type == VTK_DICOM_ITEM)
- {
+ {
ptr = static_cast<const ValueT<vtkDICOMItem> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1227,9 +1228,9 @@ const vtkDICOMValue *vtkDICOMValue::GetMultiplexData() const
{
const vtkDICOMValue *ptr = 0;
if (this->V && this->V->Type == VTK_DICOM_VALUE)
- {
+ {
ptr = static_cast<const ValueT<vtkDICOMValue> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1237,9 +1238,9 @@ vtkDICOMValue *vtkDICOMValue::GetMultiplex()
{
vtkDICOMValue *ptr = 0;
if (this->V && this->V->Type == VTK_DICOM_VALUE)
- {
+ {
ptr = static_cast<ValueT<vtkDICOMValue> *>(this->V)->Data;
- }
+ }
return ptr;
}
@@ -1248,7 +1249,7 @@ template<class VT>
void vtkDICOMValue::GetValuesT(VT *v, size_t c, size_t s) const
{
switch (this->V->Type)
- {
+ {
case VTK_CHAR:
StringConversion(
static_cast<const ValueT<char> *>(this->V)->Data, this->V->VR,
@@ -1283,17 +1284,17 @@ void vtkDICOMValue::GetValuesT(VT *v, size_t c, size_t s) const
static_cast<const ValueT<double> *>(this->V)->Data+s, v, c);
break;
case VTK_DICOM_TAG:
- {
+ {
const vtkDICOMTag *tptr =
static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data + s;
for (size_t i = 0; i < c; i += 2)
- {
- v[i] = static_cast<VT>(tptr[i/2].GetGroup());
- v[i+1] = static_cast<VT>(tptr[i/2].GetElement());
- }
+ {
+ v[i] = tptr[i/2].GetGroup();
+ v[i+1] = tptr[i/2].GetElement();
}
- break;
}
+ break;
+ }
}
template<>
@@ -1301,10 +1302,10 @@ void vtkDICOMValue::GetValuesT<std::string>(
std::string *v, size_t c, size_t s) const
{
for (size_t i = 0; i < c; i++)
- {
+ {
v->clear();
this->AppendValueToString(*v++, s++);
- }
+ }
}
template<>
@@ -1312,14 +1313,14 @@ void vtkDICOMValue::GetValuesT<vtkDICOMTag>(
vtkDICOMTag *v, size_t c, size_t s) const
{
if (this->V->Type == VTK_DICOM_TAG)
- {
+ {
const vtkDICOMTag *ptr =
static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data + s;
for (size_t i = 0; i < c; i++)
- {
+ {
*v++ = *ptr++;
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -1383,9 +1384,9 @@ unsigned char vtkDICOMValue::GetUnsignedChar(size_t i) const
{
unsigned char v = 0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1393,9 +1394,9 @@ short vtkDICOMValue::GetShort(size_t i) const
{
short v = 0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1403,9 +1404,9 @@ unsigned short vtkDICOMValue::GetUnsignedShort(size_t i) const
{
unsigned short v = 0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1413,9 +1414,9 @@ int vtkDICOMValue::GetInt(size_t i) const
{
int v = 0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1423,9 +1424,9 @@ unsigned int vtkDICOMValue::GetUnsignedInt(size_t i) const
{
unsigned int v = 0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1433,9 +1434,9 @@ float vtkDICOMValue::GetFloat(size_t i) const
{
float v = 0.0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1443,23 +1444,23 @@ double vtkDICOMValue::GetDouble(size_t i) const
{
double v = 0.0;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
std::string vtkDICOMValue::GetUTF8String(size_t i) const
{
if (this->V && this->V->CharacterSet != 0)
- {
+ {
if (this->V && i < this->V->NumberOfValues)
- {
+ {
std::string v;
this->AppendValueToUTF8String(v, i);
return v;
- }
}
+ }
return this->GetString(i);
}
@@ -1468,9 +1469,9 @@ std::string vtkDICOMValue::GetString(size_t i) const
{
std::string v;
if (this->V && i < this->V->NumberOfValues)
- {
+ {
this->AppendValueToString(v, i);
- }
+ }
return v;
}
@@ -1479,9 +1480,9 @@ vtkDICOMTag vtkDICOMValue::GetTag(size_t i) const
vtkDICOMTag v;
if (this->V && this->V->VR == vtkDICOMVR::AT &&
i < this->V->NumberOfValues)
- {
+ {
this->GetValuesT(&v, 1, i);
- }
+ }
return v;
}
@@ -1489,11 +1490,11 @@ const vtkDICOMItem& vtkDICOMValue::GetItem(size_t i) const
{
if (this->V && this->V->Type == VTK_DICOM_ITEM &&
i < this->V->NumberOfValues)
- {
+ {
const vtkDICOMItem *ptr =
static_cast<const ValueT<vtkDICOMItem> *>(this->V)->Data;
return ptr[i];
- }
+ }
return vtkDICOMValue::EmptyItem;
}
@@ -1502,9 +1503,9 @@ unsigned char vtkDICOMValue::AsUnsignedChar() const
{
unsigned char v = 0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1512,9 +1513,9 @@ short vtkDICOMValue::AsShort() const
{
short v = 0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1522,9 +1523,9 @@ unsigned short vtkDICOMValue::AsUnsignedShort() const
{
unsigned short v = 0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1532,9 +1533,9 @@ int vtkDICOMValue::AsInt() const
{
int v = 0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1542,9 +1543,9 @@ unsigned int vtkDICOMValue::AsUnsignedInt() const
{
unsigned int v = 0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1552,9 +1553,9 @@ float vtkDICOMValue::AsFloat() const
{
float v = 0.0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1562,9 +1563,9 @@ double vtkDICOMValue::AsDouble() const
{
double v = 0.0;
if (this->V && this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1572,22 +1573,22 @@ std::string vtkDICOMValue::AsUTF8String() const
{
const char *cp = this->GetCharData();
if (cp)
- {
+ {
vtkDICOMCharacterSet cs(this->V->CharacterSet);
size_t l = this->V->VL;
while (l > 0 && cp[l-1] == '\0') { l--; }
if (this->V->VR.HasSingleValue())
- {
+ {
while (l > 0 && cp[l-1] == ' ') { l--; }
return cs.ConvertToUTF8(cp, l);
- }
+ }
else
- {
+ {
// convert each value separately
const char *ep = cp + l;
std::string s;
while (cp != ep && *cp != '\0')
- {
+ {
size_t n = cs.NextBackslash(cp, ep);
while (n > 0 && *cp == ' ') { cp++; n--; }
size_t m = n;
@@ -1595,14 +1596,14 @@ std::string vtkDICOMValue::AsUTF8String() const
s.append(cs.ConvertToUTF8(cp, m));
cp += n;
if (cp != ep && *cp == '\\')
- {
+ {
s.append(cp, 1);
cp++;
- }
}
- return s;
}
+ return s;
}
+ }
return vtkDICOMValue::AsString();
}
@@ -1611,22 +1612,22 @@ std::string vtkDICOMValue::AsString() const
{
const char *cp = this->GetCharData();
if (cp)
- {
+ {
size_t l = this->V->VL;
while (l > 0 && cp[l-1] == '\0') { l--; }
if (this->V->VR.HasSingleValue())
- {
+ {
while (l > 0 && cp[l-1] == ' ') { l--; }
return std::string(cp, l);
- }
+ }
else
- {
+ {
// convert each value separately
vtkDICOMCharacterSet cs(this->V->CharacterSet);
const char *ep = cp + l;
std::string s;
while (cp != ep && *cp != '\0')
- {
+ {
size_t n = cs.NextBackslash(cp, ep);
while (n > 0 && *cp == ' ') { cp++; n--; }
size_t m = n;
@@ -1634,14 +1635,14 @@ std::string vtkDICOMValue::AsString() const
s.append(cp, m);
cp += n;
if (cp != ep && *cp == '\\')
- {
+ {
s.append(cp, 1);
cp++;
- }
}
- return s;
}
+ return s;
}
+ }
std::string v;
if (this->V && this->V->VR != vtkDICOMVR::UN &&
@@ -1651,17 +1652,17 @@ std::string vtkDICOMValue::AsString() const
this->V->VR != vtkDICOMVR::OL &&
this->V->VR != vtkDICOMVR::OF &&
this->V->VR != vtkDICOMVR::OD)
- {
+ {
size_t n = this->V->NumberOfValues;
for (size_t i = 0; i < n; i++)
- {
+ {
if (i > 0)
- {
+ {
v.append("\\");
- }
- this->AppendValueToString(v, i);
}
+ this->AppendValueToString(v, i);
}
+ }
return v;
}
@@ -1670,9 +1671,9 @@ vtkDICOMTag vtkDICOMValue::AsTag() const
vtkDICOMTag v;
if (this->V && this->V->VR == vtkDICOMVR::AT &&
this->V->NumberOfValues >= 1)
- {
+ {
this->GetValuesT(&v, 1, 0);
- }
+ }
return v;
}
@@ -1691,34 +1692,34 @@ void vtkDICOMValue::Substring(
const char *dp = ep;
if (this->V->NumberOfValues > 1 && ++i > 0)
- {
+ {
if (this->V->CharacterSet == 0)
- {
+ {
dp = cp - 1;
do
- {
+ {
cp = dp + 1;
do { dp++; } while (*dp != '\\' && dp != ep);
- }
- while (--i != 0 && dp != ep);
}
+ while (--i != 0 && dp != ep);
+ }
else
- {
+ {
vtkDICOMCharacterSet cs(this->V->CharacterSet);
for (;;)
- {
+ {
dp = cp + cs.NextBackslash(cp, ep);
if (--i == 0 || *dp != '\\') { break; }
cp = dp + 1;
- }
}
}
+ }
// remove any spaces used as padding
if (!this->V->VR.HasSingleValue())
- {
+ {
while (cp != dp && cp[0] == ' ') { cp++; }
- }
+ }
while (cp != dp && dp[-1] == ' ') { dp--; }
start = cp;
@@ -1731,20 +1732,20 @@ void vtkDICOMValue::AppendValueToUTF8String(
{
if (this->V && this->V->Type == VTK_CHAR &&
this->V->CharacterSet != 0)
- {
+ {
const char *cp = static_cast<const ValueT<char> *>(this->V)->Data;
const char *dp = cp + (i == 0 ? this->V->VL : 0);
if (!this->V->VR.HasSingleValue())
- {
+ {
this->Substring(i, cp, dp);
- }
+ }
vtkDICOMCharacterSet cs(this->V->CharacterSet);
str += cs.ConvertToUTF8(cp, dp-cp);
- }
+ }
else
- {
+ {
this->AppendValueToString(str, i);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -1760,27 +1761,27 @@ void vtkDICOMValue::AppendValueToString(
vtkDICOMTag a;
if (this->V == 0)
- {
+ {
return;
- }
+ }
assert(i < this->V->NumberOfValues);
switch (this->V->Type)
- {
+ {
case VTK_CHAR:
cp = static_cast<const ValueT<char> *>(this->V)->Data;
dp = cp + (i == 0 ? this->V->VL : 0);
if (this->V->VR.HasSingleValue())
- {
+ {
// strip trailing spaces
while (dp != cp && dp[-1] == ' ') { --dp; }
- }
+ }
else
- {
+ {
// get just one of the values, strip leading & trailing spaces
this->Substring(i, cp, dp);
- }
+ }
break;
case VTK_UNSIGNED_CHAR:
d = static_cast<const ValueT<unsigned char> *>(this->V)->Data[i];
@@ -1806,27 +1807,27 @@ void vtkDICOMValue::AppendValueToString(
case VTK_DICOM_TAG:
a = static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data[i];
break;
- }
+ }
if (this->V->Type == VTK_CHAR)
- {
+ {
while (cp != dp && dp[-1] == '\0') { --dp; }
str.append(cp, dp);
- }
+ }
else if (this->V->Type == VTK_FLOAT ||
this->V->Type == VTK_DOUBLE)
- {
+ {
// force consistent printing of "inf", "nan" regardless of platform
if (vtkMath::IsNan(f))
- {
+ {
str.append("nan");
- }
+ }
else if (vtkMath::IsInf(f))
- {
+ {
str.append((f < 0) ? "-inf" : "inf");
- }
+ }
else
- {
+ {
char text[32];
// guard against printing non-significant digits:
// use exponential form if printing in "%f" format
@@ -1836,34 +1837,34 @@ void vtkDICOMValue::AppendValueToString(
fabs(f) <= 9007199254740992.0) || // 2^53
(this->V->Type == VTK_FLOAT &&
fabs(f) <= 16777216.0)) // 2^24
- {
+ {
if (this->V->Type == VTK_DOUBLE)
- {
+ {
sprintf(text, "%#.16g", f);
- }
+ }
else
- {
+ {
sprintf(text, "%#.8g", f);
- }
+ }
// make sure there is a zero after the decimal point
size_t l = strlen(text);
if (l > 0 && text[l-1] == '.')
- {
+ {
text[l++] = '0';
text[l] = '\0';
- }
}
+ }
else
- {
+ {
if (this->V->Type == VTK_DOUBLE)
- {
+ {
sprintf(text, "%.15e", f);
- }
+ }
else
- {
+ {
sprintf(text, "%.7e", f);
- }
}
+ }
// trim trailing zeros, except the one following decimal point
size_t ti = 0;
@@ -1874,52 +1875,52 @@ void vtkDICOMValue::AppendValueToString(
// if exponent has three digits, clear the first if it is zero
if (tj >= 5 && text[tj-5] == 'e' && text[tj-3] == '0')
- {
+ {
text[tj-3] = text[tj-2];
text[tj-2] = text[tj-1];
tj--;
- }
+ }
text[tj] = '\0';
str.append(text);
- }
}
+ }
else if (this->V->Type == VTK_UNSIGNED_CHAR ||
this->V->Type == VTK_SHORT ||
this->V->Type == VTK_UNSIGNED_SHORT ||
this->V->Type == VTK_INT ||
this->V->Type == VTK_UNSIGNED_INT)
- {
+ {
// simple code to convert an integer to a string
char text[16];
size_t ti = 16;
// if d is nonzero, set u to abs(d)
if (d > 0)
- {
+ {
u = d;
- }
+ }
if (d < 0)
- {
+ {
u = -d;
- }
+ }
// convert u to a string
do
- {
+ {
text[--ti] = '0' + static_cast<char>(u % 10);
u /= 10;
- }
+ }
while (u != 0);
// add sign
if (d < 0)
- {
+ {
text[--ti] = '-';
- }
+ }
str.append(&text[ti], &text[16]);
- }
+ }
else if (this->V->Type == VTK_DICOM_TAG)
- {
+ {
char text[12];
int t[2];
t[0] = a.GetGroup();
@@ -1927,18 +1928,18 @@ void vtkDICOMValue::AppendValueToString(
char *tp = text;
*tp++ = '(';
for (int j = 0; j < 2; j++)
- {
+ {
for (int k = 12; k >= 0; k -= 4)
- {
+ {
char c = ((t[j] >> k) & 0x000F);
*tp++ = (c < 10 ? '0' + c : 'A' - 10 + c);
- }
- *tp++ = ',';
}
+ *tp++ = ',';
+ }
tp[-1] = ')';
*tp = '\0';
str.append(text, &text[11]);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -1951,11 +1952,11 @@ bool vtkDICOMValue::ValueT<T>::Compare(const Value *a, const Value *b)
bool r = (a->VL == b->VL);
size_t n = a->VL/sizeof(T);
if (n != 0 && r)
- {
+ {
const T *ap = static_cast<const ValueT<T> *>(a)->Data;
const T *bp = static_cast<const ValueT<T> *>(b)->Data;
do { r &= (*ap++ == *bp++); } while (r && --n);
- }
+ }
return r;
}
@@ -1967,13 +1968,13 @@ bool vtkDICOMValue::ValueT<char>::Compare(
r &= (a->CharacterSet == b->CharacterSet);
size_t n = a->VL;
if (n != 0 && r)
- {
+ {
const unsigned char *ap =
static_cast<const ValueT<unsigned char> *>(a)->Data;
const unsigned char *bp =
static_cast<const ValueT<unsigned char> *>(b)->Data;
do { r &= (*ap++ == *bp++); } while (r && --n);
- }
+ }
return r;
}
@@ -1984,22 +1985,22 @@ bool vtkDICOMValue::ValueT<unsigned char>::Compare(
bool r = (a->VL == b->VL);
size_t n = a->VL;
if (a->VL == 0xFFFFFFFF)
- {
+ {
n = a->NumberOfValues;
r &= (n == b->NumberOfValues);
#ifdef VTK_DICOM_USE_OVERFLOW_BYTE
n += (static_cast<size_t>(a->Overflow) << 32);
r &= (a->Overflow == b->Overflow);
#endif
- }
+ }
if (n != 0 && r)
- {
+ {
const unsigned char *ap =
static_cast<const ValueT<unsigned char> *>(a)->Data;
const unsigned char *bp =
static_cast<const ValueT<unsigned char> *>(b)->Data;
do { r &= (*ap++ == *bp++); } while (r && --n);
- }
+ }
return r;
}
@@ -2010,13 +2011,13 @@ bool vtkDICOMValue::ValueT<vtkDICOMItem>::Compare(
size_t n = a->NumberOfValues; // do not use VL/sizeof()
bool r = (n == b->NumberOfValues);
if (n != 0 && r)
- {
+ {
const vtkDICOMItem *ap =
static_cast<const ValueT<vtkDICOMItem> *>(a)->Data;
const vtkDICOMItem *bp =
static_cast<const ValueT<vtkDICOMItem> *>(b)->Data;
do { r &= (*ap++ == *bp++); } while (r && --n);
- }
+ }
return r;
}
@@ -2027,13 +2028,13 @@ bool vtkDICOMValue::ValueT<vtkDICOMValue>::Compare(
size_t n = a->NumberOfValues; // do not use VL/sizeof()
bool r = (n == b->NumberOfValues);
if (n != 0 && r)
- {
+ {
const vtkDICOMValue *ap =
static_cast<const ValueT<vtkDICOMValue> *>(a)->Data;
const vtkDICOMValue *bp =
static_cast<const ValueT<vtkDICOMValue> *>(b)->Data;
do { r &= (*ap++ == *bp++); } while (r && --n);
- }
+ }
return r;
}
@@ -2046,36 +2047,36 @@ bool vtkDICOMValue::ValueT<T>::CompareEach(const Value *a, const Value *b)
{
bool r = true;
if (a->NumberOfValues > 0 && b->NumberOfValues > 0)
- {
+ {
size_t n = a->NumberOfValues;
size_t mm = b->NumberOfValues;
const T *ap = static_cast<const ValueT<T> *>(a)->Data;
const T *bbp = static_cast<const ValueT<T> *>(b)->Data;
do
- {
+ {
size_t m = mm;
const T *bp = bbp;
do
- {
+ {
r = (*ap == *bp);
bp++;
- }
+ }
while (--m && !r);
if (r)
- {
+ {
// set new start for inner loop
bbp = bp;
mm = m;
if (mm == 0)
- {
+ {
r = (n == 1);
break;
- }
}
- ap++;
}
- while (--n && r);
+ ap++;
}
+ while (--n && r);
+ }
return r;
}
@@ -2084,13 +2085,16 @@ bool vtkDICOMValue::ValueT<T>::CompareEach(const Value *a, const Value *b)
bool vtkDICOMValue::PatternMatchesMulti(
const char *pattern, const char *val, vtkDICOMVR vr)
{
- bool inclusive = (vr == vtkDICOMVR::UI);
- bool ordered = (vr == vtkDICOMVR::IS || vr == vtkDICOMVR::DS);
+ typedef vtkDICOMVR VR;
+ bool inclusive = (vr == VR::UI);
+ bool ordered = (vr == VR::IS || vr == VR::DS);
+ bool nowildcards = (vr == VR::UI || vr == VR::AS ||
+ vr == VR::IS || vr == VR::DS);
bool match = !inclusive;
const char *pp = pattern;
while (match ^ inclusive)
- {
+ {
// get pattern value start and end
const char *pd = pp;
while (*pd != '\0' && *pd != '\\') { pd++; }
@@ -2102,7 +2106,7 @@ bool vtkDICOMValue::PatternMatchesMulti(
match = false;
const char *vp = val;
while (!match)
- {
+ {
// get value start and end
const char *vd = vp;
while (*vd != '\0' && *vd != '\\') { vd++; }
@@ -2111,22 +2115,37 @@ bool vtkDICOMValue::PatternMatchesMulti(
while (*vp == ' ') { vp++; }
while (vf != vp && vf[-1] == ' ') { --vf; }
- match = vtkDICOMUtilities::PatternMatches(pp, pf-pp, vp, vf-vp);
+ if (nowildcards)
+ {
+ // if VR doesn't allow wildcards, use simple string comparison
+ // (start at back, because UIDs often share the same prefix).
+ const char *cf = pf;
+ match = (pf-pp == vf-vp);
+ while (match && cf != pp)
+ {
+ match = (*(--vf) == *(--cf));
+ }
+ }
+ else
+ {
+ // use wildcard pattern matching
+ match = vtkDICOMUtilities::PatternMatches(pp, pf-pp, vp, vf-vp);
+ }
// break if no values remain
if (*vd == '\0') { break; }
vp = vd + 1;
- }
+ }
if (match && ordered)
- {
+ {
// set inner loop start to current position
val = vp;
- }
+ }
// break if no patterns remain
if (*pd == '\0') { break; }
pp = pd + 1;
- }
+ }
return match;
}
@@ -2142,13 +2161,13 @@ bool vtkDICOMValue::PatternMatchesPersonName(
const char *pp = pattern;
while (!match)
- {
+ {
// normalize the pattern
vtkDICOMValue::NormalizePersonName(pp, normalizedPattern, true);
const char *vp = val;
while (!match)
- {
+ {
// normalize the name
vtkDICOMValue::NormalizePersonName(vp, normalizedName);
@@ -2160,13 +2179,13 @@ bool vtkDICOMValue::PatternMatchesPersonName(
while (*vp != '\0' && *vp != '\\') { vp++; }
if (*vp == '\0') { break; }
vp++;
- }
+ }
// break if no patterns remain
while (*pp != '\0' && *pp != '\\') { pp++; }
if (*pp == '\0') { break; }
pp++;
- }
+ }
return match;
}
@@ -2183,7 +2202,7 @@ void vtkDICOMValue::NormalizePersonName(
// loop over component groups
for (int i = 0; i < 3; i++)
- {
+ {
// set maximum length of extended component group to 85 bytes
// (because 85*3 + 1 == 256, and 85 > 64 where 64 is max for PN)
char *groupStart = dp;
@@ -2191,67 +2210,67 @@ void vtkDICOMValue::NormalizePersonName(
// loop over components
for (int j = 0; j < 5; j++)
- {
+ {
// save start location
char *componentStart = dp;
// copy characters
while (*cp != '^' && *cp != '=' && *cp != '\\' &&
*cp != '\0' && dp != ep)
- {
+ {
*dp++ = *cp++;
- }
+ }
// strip trailing spaces and periods
while (dp != componentStart && (dp[-1] == ' ' || dp[-1] == '.'))
- {
+ {
--dp;
- }
+ }
if (dp != ep)
- {
+ {
// if query, replace empty components with wildcard
if (isquery && dp == componentStart) { *dp++ = '*'; }
// mark end of component
if (j != 4) { *dp++ = '^'; }
- }
+ }
else if (isquery && dp != componentStart)
- {
+ {
// back up by one unicode code point, replace with wildcard
do { --dp; } while (dp != componentStart && (*dp & 0xC0) == 0x80);
*dp++ = '*';
- }
+ }
// go to next component of input
if (*cp == '^') { cp++; }
- }
+ }
// collapse repeated wildcards
if (isquery)
- {
+ {
while (dp - groupStart > 2 && dp[-3] == '*' &&
dp[-2] == '^' && dp[-1] == '*')
- {
+ {
dp -= 2;
- }
}
+ }
// mark end of component group
if (i != 2) { *dp++ = '='; }
// go to next component group of input
if (*cp == '=') { cp++; }
- }
+ }
// collapse repeated wildcards
if (isquery)
- {
+ {
while (dp - output > 2 && dp[-3] == '*' &&
dp[-2] == '=' && dp[-1] == '*')
- {
+ {
dp -= 2;
- }
}
+ }
// terminate
*dp = '\0';
@@ -2268,29 +2287,29 @@ size_t vtkDICOMValue::NormalizeDateTime(
// use UNIX epoch as our arbitrary time base
static const char epoch[22] = "19700101000000.000000";
for (int i = 0; i < 22; i++)
- {
+ {
output[i] = epoch[i];
- }
+ }
char *tp = output;
if (vr == vtkDICOMVR::TM)
- {
+ {
tp += 8;
- }
+ }
const char *cp = input;
while (*tp != 0 && *cp >= '0' && *cp <= '9')
- {
+ {
*tp++ = *cp++;
- }
+ }
if (*tp == '.' && *cp == '.')
- {
+ {
*tp++ = *cp++;
while (*tp != 0 && *cp >= '0' && *cp <= '9')
- {
+ {
*tp++ = *cp++;
- }
}
+ }
return static_cast<size_t>(tp - output);
}
@@ -2316,30 +2335,30 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
// keys with no value match (universal matching)
if (value.V == 0)
- {
+ {
return true;
- }
+ }
if (value.V->Type != VTK_DICOM_ITEM)
- {
+ {
// for everything but sequences, check if the length is zero
if (value.V->VL == 0)
- {
+ {
return true;
- }
}
+ }
else if (value.GetNumberOfValues() == 0 ||
static_cast<const ValueT<vtkDICOMItem> *>(value.V)->Data
->GetNumberOfDataElements() == 0)
- {
+ {
// empty sequences match
return true;
- }
+ }
if (this->V == 0 || this->V->VR != value.V->VR)
- {
+ {
// match is impossible if VRs differ
return false;
- }
+ }
bool match = false;
vtkDICOMVR vr = this->V->VR;
@@ -2347,17 +2366,17 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
// First, do comparisons for string values
if (type == VTK_CHAR)
- {
+ {
// Does the pattern string have wildcards?
bool wildcard = false;
const char *pattern = static_cast<const ValueT<char> *>(value.V)->Data;
size_t pl = 0;
while (pattern[pl] != '\0' && pl < value.V->VL)
- {
+ {
char c = pattern[pl++];
wildcard |= (c == '*');
wildcard |= (c == '?');
- }
+ }
while (pl > 0 && pattern[pl-1] == ' ') { pl--; }
// Get string value and remove any trailing nulls and spaces
@@ -2370,22 +2389,22 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
(vr == vtkDICOMVR::DA ||
vr == vtkDICOMVR::TM ||
vr == vtkDICOMVR::DT))
- {
+ {
// Find the position of the hyphen
size_t hp = 0;
while (hp < pl && pattern[hp] != '-') { hp++; }
if (vr == vtkDICOMVR::DT && hp + 5 < pl)
- {
+ {
// Check if the hyphen was part of the timezone offset
if (pattern[hp+5] == '-')
- {
+ {
hp += 5;
- }
+ }
else if (hp != 4 && pattern[hp+5] == '\0')
- {
+ {
hp = 0;
- }
}
+ }
// Get a pointer to the part of pattern after the hyphen
const char *dp = &pattern[hp];
bool hyphen = (*dp == '-');
@@ -2398,181 +2417,181 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
vtkDICOMValue::NormalizeDateTime(cp, d, vr);
r1[0] = '\0';
if (pattern[0] != '\0' && pattern[0] != '-')
- {
+ {
n1 = vtkDICOMValue::NormalizeDateTime(pattern, r1, vr);
- }
+ }
r2[0] = '\0';
if (dp[0] != '\0' && dp[0] != '-')
- {
+ {
n2 = vtkDICOMValue::NormalizeDateTime(dp, r2, vr);
- }
+ }
// Perform lexical comparison on normalized datetime
if (!hyphen)
- {
+ {
match = (strncmp(d, r1, n1) == 0);
- }
+ }
else if (*r1 != '\0')
- {
+ {
match = (strncmp(d, r1, n1) >= 0);
- }
+ }
else if (*r2 != '\0')
- {
+ {
match = (strncmp(r2, d, n2) >= 0);
- }
+ }
else
- {
+ {
match = (strncmp(r2, d, n2) >= 0 && strncmp(d, r1, n1) >= 0);
- }
}
+ }
else
- {
+ {
// Perform wildcard matching and list matching
std::string str;
std::string pstr;
if (vr == vtkDICOMVR::PN)
- {
+ {
// Convert to lowercase UTF8 before matching
vtkDICOMCharacterSet cs = this->GetCharacterSet();
const char *ep = cp + l;
while (cp != ep && *cp != '\0')
- {
+ {
size_t n = cs.NextBackslash(cp, ep);
str.append(cs.CaseFoldedUTF8(cp, n));
cp += n;
if (cp != ep && *cp == '\\')
- {
+ {
str.append(cp, 1);
cp++;
- }
}
+ }
cp = str.c_str();
l = str.length();
pstr = value.GetCharacterSet().CaseFoldedUTF8(pattern, pl);
pattern = pstr.c_str();
pl = pstr.length();
- }
+ }
else if (vr.HasSpecificCharacterSet())
- {
+ {
if (this->V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_6 &&
this->V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_192)
- {
+ {
// Convert value to UTF8 before matching
str = this->AsUTF8String();
cp = str.c_str();
l = str.length();
- }
+ }
if (value.V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_6 &&
value.V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_192)
- {
+ {
// Convert pattern to UTF8 before matching
pstr = value.AsUTF8String();
pattern = pstr.c_str();
pl = pstr.length();
- }
}
+ }
if (vr == vtkDICOMVR::PN)
- {
+ {
match = vtkDICOMValue::PatternMatchesPersonName(pattern, cp);
- }
+ }
else if (vr.HasSingleValue())
- {
+ {
match = vtkDICOMUtilities::PatternMatches(pattern, pl, cp, l);
- }
+ }
else
- {
+ {
match = vtkDICOMValue::PatternMatchesMulti(pattern, cp, vr);
- }
}
}
+ }
else if (type == VTK_DICOM_VALUE)
- {
+ {
// Match if any of the contained values match
vtkDICOMValue *vp = static_cast<ValueT<vtkDICOMValue> *>(this->V)->Data;
size_t vn = this->GetNumberOfValues();
for (size_t i = 0; i < vn && !match; i++)
- {
+ {
match = vp->Matches(value);
vp++;
- }
}
+ }
else if (type == VTK_DICOM_ITEM)
- {
+ {
// Match if any item matches
vtkDICOMItem *item = static_cast<ValueT<vtkDICOMItem> *>(value.V)->Data;
vtkDICOMItem *ip = static_cast<ValueT<vtkDICOMItem> *>(this->V)->Data;
size_t n = this->GetNumberOfValues();
for (size_t i = 0; i < n && !match; i++)
- {
+ {
vtkDICOMDataElementIterator iter = item->Begin();
vtkDICOMDataElementIterator iterEnd = item->End();
match = true;
while (match && iter != iterEnd)
- {
+ {
vtkDICOMTag tag = iter->GetTag();
// The SpecificCharacterSet is always considered to match. Its
// presence in the query describes the character encoding of the
// query, so that query strings can be converted to utf-8 at the
// point of comparison with the data set strings.
if (tag != DC::SpecificCharacterSet)
- {
+ {
match = ip->GetAttributeValue(tag).Matches(iter->GetValue());
- }
- ++iter;
}
- ip++;
+ ++iter;
}
+ ip++;
}
+ }
else if (type == VTK_DICOM_TAG)
- {
+ {
// Comparing tags between data sets should just always return "true"
match = true;
- }
+ }
else if (vr == vtkDICOMVR::OB || vr == vtkDICOMVR::UN)
- {
+ {
// OB and UN must match exactly
match = ValueT<unsigned char>::Compare(value.V, this->V);
- }
+ }
else if (vr == vtkDICOMVR::OW)
- {
+ {
// OW must match exactly
match = ValueT<unsigned short>::Compare(value.V, this->V);
- }
+ }
else if (vr == vtkDICOMVR::OL)
- {
+ {
// OL must match exactly
match = ValueT<unsigned int>::Compare(value.V, this->V);
- }
+ }
else if (vr == vtkDICOMVR::OF)
- {
+ {
// OF must match exactly
match = ValueT<float>::Compare(value.V, this->V);
- }
+ }
else if (vr == vtkDICOMVR::OD)
- {
+ {
// OF must match exactly
match = ValueT<double>::Compare(value.V, this->V);
- }
+ }
else if (type == VTK_SHORT || type == VTK_UNSIGNED_SHORT)
- {
+ {
// Match if any value matches
match = ValueT<short>::CompareEach(value.V, this->V);
- }
+ }
else if (type == VTK_INT || type == VTK_UNSIGNED_INT)
- {
+ {
// Match if any value matches
match = ValueT<int>::CompareEach(value.V, this->V);
- }
+ }
else if (type == VTK_FLOAT)
- {
+ {
// Match if any value matches
match = ValueT<float>::CompareEach(value.V, this->V);
- }
+ }
else if (type == VTK_DOUBLE)
- {
+ {
// Match if any value matches
match = ValueT<double>::CompareEach(value.V, this->V);
- }
+ }
return match;
}
@@ -2581,24 +2600,24 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
bool vtkDICOMValue::Matches(const std::string& value) const
{
if (value.length() == 0)
- {
+ {
// to support universal matching
return true;
- }
+ }
if (this->V)
- {
+ {
if (this->V->VR.HasTextValue())
- {
+ {
return this->Matches(vtkDICOMValue(
this->V->VR, this->V->CharacterSet, value));
- }
+ }
else
- {
+ {
vtkDICOMValue v(this->V->VR, value);
return (v.AsString() == value && this->Matches(v));
- }
}
+ }
return false;
}
@@ -2607,10 +2626,10 @@ bool vtkDICOMValue::Matches(const std::string& value) const
bool vtkDICOMValue::Matches(double value) const
{
if (this->V && this->V->VL > 0 && this->V->VR.HasNumericValue())
- {
+ {
vtkDICOMValue v(this->V->VR, value);
return (v.AsDouble() == value && this->Matches(v));
- }
+ }
return false;
}
@@ -2623,15 +2642,15 @@ bool vtkDICOMValue::operator==(const vtkDICOMValue& o) const
bool r = true;
if (a != b)
- {
+ {
r = false;
if (a != 0 && b != 0)
- {
+ {
if (a->VR == b->VR && a->VL == b->VL && a->Type == b->Type)
- {
+ {
r = true;
switch (a->Type)
- {
+ {
case VTK_CHAR:
r = ValueT<char>::Compare(a, b);
break;
@@ -2658,10 +2677,10 @@ bool vtkDICOMValue::operator==(const vtkDICOMValue& o) const
case VTK_DICOM_VALUE:
r = ValueT<vtkDICOMValue>::Compare(a, b);
break;
- }
}
}
}
+ }
return r;
}
@@ -2673,104 +2692,104 @@ ostream& operator<<(ostream& os, const vtkDICOMValue& v)
const char *cp = v.GetCharData();
if (!v.IsValid())
- {
+ {
os << "empty[0]";
- }
+ }
else if (vr == vtkDICOMVR::UN)
- {
+ {
os << "unknown[" << v.GetNumberOfValues() << "]";
- }
+ }
else if (vr == vtkDICOMVR::ST ||
vr == vtkDICOMVR::LT ||
vr == vtkDICOMVR::UT)
- {
+ {
// might have control characters, don't print it
os << "text[" << v.GetVL() << "]";
- }
+ }
else if (cp)
- {
+ {
const char *dp = cp + v.GetVL();
while (cp != dp && *cp == ' ') { cp++; }
while (cp != dp && dp[-1] == ' ') { dp--; }
if (cp != dp)
- {
+ {
if (dp[-1] == '\0' || *dp == '\0')
- {
+ {
os << cp;
- }
+ }
else
- {
+ {
std::string s = std::string(cp, dp);
os << s.c_str();
- }
}
}
+ }
else if (vr == vtkDICOMVR::AT)
- {
+ {
const vtkDICOMTag *tp = v.GetTagData();
size_t m = v.GetNumberOfValues();
if (tp)
- {
+ {
for (size_t j = 0; j < m; j++)
- {
+ {
if (j > 0) { os << ","; }
os << tp[j];
- }
}
+ }
else
- {
+ {
os << "tags[" << m << "]";
- }
}
+ }
else if (vr == vtkDICOMVR::SQ)
- {
+ {
os << "items[" << v.GetNumberOfValues() << "]";
- }
+ }
else if (vr == vtkDICOMVR::OB)
- {
+ {
os << "bytes[" << v.GetNumberOfValues() << "]";
- }
+ }
else if (vr == vtkDICOMVR::OW)
- {
+ {
os << "words[" << v.GetNumberOfValues() << "]";
- }
+ }
else if (vr == vtkDICOMVR::OW)
- {
+ {
os << "longwords[" << v.GetNumberOfValues() << "]";
- }
+ }
else if (vr == vtkDICOMVR::OF)
- {
+ {
os << "floats[" << v.GetNumberOfValues() << "]";
- }
+ }
else if (vr == vtkDICOMVR::OD)
- {
+ {
os << "doubles[" << v.GetNumberOfValues() << "]";
- }
+ }
else
- {
+ {
const vtkDICOMValue *vp = v.GetMultiplexData();
if (vp)
- {
+ {
// value is a multiplex of per-instance values
os << "values[" << v.GetNumberOfValues() << "]";
- }
+ }
else
- {
+ {
std::string s;
size_t m = v.GetNumberOfValues();
size_t n = (m <= 16 ? m : 16);
for (size_t i = 0; i < n; i++)
- {
+ {
s.append((i == 0 ? "" : ","));
v.AppendValueToUTF8String(s, i);
- }
+ }
if (m > n)
- {
+ {
s.append(",...");
- }
- os << s.c_str();
}
+ os << s.c_str();
}
+ }
return os;
}
diff --git a/Source/vtkDICOMValue.h b/Source/vtkDICOMValue.h
index 6cf3ca3..f5a9c88 100644
--- a/Source/vtkDICOMValue.h
+++ b/Source/vtkDICOMValue.h
@@ -76,6 +76,8 @@ private:
};
public:
+
+ //@{
//! Construct a new value from the data that is provided.
/*!
* The data will be copied into the value, with conversion if
@@ -102,7 +104,9 @@ public:
vtkDICOMValue(vtkDICOMVR vr, const double *data, size_t count);
vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMTag *data, size_t count);
vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMItem *data, size_t count);
+ //@}
+ //@{
//! Construct a string value with a specific character set.
/*!
* This will set the character set that will be used to interpret
@@ -114,7 +118,9 @@ public:
const std::string& v);
vtkDICOMValue(vtkDICOMVR vr, vtkDICOMCharacterSet cs,
const char *data, size_t l);
+ //@}
+ //@{
//! Create an emtpy value.
explicit vtkDICOMValue(vtkDICOMVR vr);
@@ -130,13 +136,17 @@ public:
//! Construct from a sequence.
vtkDICOMValue(const vtkDICOMSequence &v);
+ //@}
+ //@{
//! Default constructor, constructs an invalid value.
vtkDICOMValue() : V(0) {}
//! Destructor releases the internal data array.
~vtkDICOMValue() { this->Clear(); }
+ //@}
+ //@{
//! Clear the value, the result is an invalid value.
void Clear() {
if (this->V && --(this->V->ReferenceCount) == 0) {
@@ -145,7 +155,9 @@ public:
//! Check whether this value is valid, i.e. contains data.
bool IsValid() const { return (this->V != 0); }
+ //@}
+ //@{
//! Get the VR, the representation of the data values.
vtkDICOMVR GetVR() const { return (this->V ? this->V->VR : vtkDICOMVR()); }
@@ -183,7 +195,9 @@ public:
+ (static_cast<size_t>(this->V->Overflow) << 32)
#endif
: 0); }
+ //@}
+ //@{
//! Copy "n" values into vb, starting at value "i".
/*!
* Get one or more values, doing conversion from the stored type to
@@ -200,7 +214,9 @@ public:
void GetValues(float *vb, size_t n, size_t i=0) const;
void GetValues(double *vb, size_t n, size_t i=0) const;
void GetValues(vtkDICOMTag *vb, size_t n, size_t i=0) const;
+ //@}
+ //@{
//! Get one scalar, string, tag or item from the value.
/*!
* Convert the i'th value to the desired type, if possible, and return
@@ -220,7 +236,9 @@ public:
double GetDouble(size_t i) const;
vtkDICOMTag GetTag(size_t i) const;
const vtkDICOMItem& GetItem(size_t i) const;
+ //@}
+ //@{
//! Get the value as a scalar, string, tag, or item.
/*!
* The value is converted to the desired type, if possible, and returned.
@@ -240,7 +258,9 @@ public:
double AsDouble() const;
vtkDICOMTag AsTag() const;
const vtkDICOMItem& AsItem() const;
+ //@}
+ //@{
//! Get a pointer to the internal data array.
/*!
* GetCharData will return a null-terminated string if VR is
@@ -266,7 +286,9 @@ public:
const vtkDICOMTag *GetTagData() const;
const vtkDICOMItem *GetSequenceData() const;
const vtkDICOMValue *GetMultiplexData() const;
+ //@}
+ //@{
//! Allocate space within a value object.
/*!
* Allocate an array of the specified size (number of elements)
@@ -288,7 +310,9 @@ public:
vtkDICOMTag *AllocateTagData(vtkDICOMVR vr, size_t vn);
vtkDICOMItem *AllocateSequenceData(vtkDICOMVR vr, size_t vn);
vtkDICOMValue *AllocateMultiplexData(vtkDICOMVR vr, size_t vn);
+ //@}
+ //@{
//! Compute the number of backslash-separated string values.
/*!
* After calling AllocateCharData and writing text into the allocated
@@ -305,7 +329,9 @@ public:
* the NumberOfValues will be vn, and the VL will be 0xffffffff.
*/
unsigned char *ReallocateUnsignedCharData(size_t vn);
+ //@}
+ //@{
//! Append value "i" to the supplied UTF8 string.
/*
* String values will be converted from their native encoding
@@ -321,7 +347,9 @@ public:
* long, and might contain special (i.e. non-printable) characters.
*/
void AppendValueToString(std::string &str, size_t i) const;
+ //@}
+ //@{
//! Check if the value matches the specified find query value.
/*!
* This method is used during "find" requests, according to the rules
@@ -353,7 +381,9 @@ public:
* then the match is true if at least one value matches.
*/
bool Matches(double v) const;
+ //@}
+ //@{
//! Override assignment operator for reference counting.
vtkDICOMValue& operator=(const vtkDICOMValue& o) {
if (this->V != o.V) {
@@ -365,10 +395,13 @@ public:
//! Assign a value from a sequence object.
vtkDICOMValue& operator=(const vtkDICOMSequence& o);
+ //@}
+ //@{
//! Equality requires that all elements of the value are equal.
bool operator==(const vtkDICOMValue& o) const;
bool operator!=(const vtkDICOMValue& o) const { return !(*this == o); }
+ //@}
private:
//! Allocate an array of size vn for the specified vr
diff --git a/Source/vtkDICOMWriter.cxx b/Source/vtkDICOMWriter.cxx
index 15ee127..31c3c19 100644
--- a/Source/vtkDICOMWriter.cxx
+++ b/Source/vtkDICOMWriter.cxx
@@ -73,17 +73,17 @@ vtkDICOMWriter::vtkDICOMWriter()
vtkDICOMWriter::~vtkDICOMWriter()
{
if (this->PatientMatrix)
- {
+ {
this->PatientMatrix->Delete();
- }
+ }
if (this->MetaData)
- {
+ {
this->MetaData->Delete();
- }
+ }
if (this->Generator)
- {
+ {
this->Generator->Delete();
- }
+ }
delete [] this->TransferSyntaxUID;
delete [] this->SeriesDescription;
delete [] this->ImageType;
@@ -104,31 +104,31 @@ void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "ImageType: " << this->ImageType << "\n";
os << indent << "TransferSyntaxUID: ";
if (this->TransferSyntaxUID)
- {
+ {
os << this->TransferSyntaxUID << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "MetaData: ";
if (this->MetaData)
- {
+ {
os << this->MetaData << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "Generator: ";
if (this->Generator)
- {
+ {
os << this->Generator << "\n";
- }
+ }
else
- {
+ {
os << "(none)\n";
- }
+ }
os << indent << "TimeAsVector: "
<< (this->TimeAsVector ? "On\n" : "Off\n");
os << indent << "TimeDimension: " << this->TimeDimension << "\n";
@@ -138,19 +138,19 @@ void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "PatientMatrix:";
if (this->PatientMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "MemoryRowOrder: "
<< this->GetMemoryRowOrderAsString() << "\n";
@@ -164,13 +164,13 @@ void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent)
void vtkDICOMWriter::SetMemoryRowOrder(int order)
{
if (order >= 0 && order <= vtkDICOMWriter::BottomUp)
- {
+ {
if (order != this->MemoryRowOrder)
- {
+ {
this->MemoryRowOrder = order;
this->Modified();
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -178,7 +178,7 @@ const char *vtkDICOMWriter::GetMemoryRowOrderAsString()
{
const char *text = "";
switch (this->MemoryRowOrder)
- {
+ {
case vtkDICOMWriter::FileNative:
text = "FileNative";
break;
@@ -188,7 +188,7 @@ const char *vtkDICOMWriter::GetMemoryRowOrderAsString()
case vtkDICOMWriter::BottomUp:
text = "BottomUp";
break;
- }
+ }
return text;
}
@@ -197,13 +197,13 @@ const char *vtkDICOMWriter::GetMemoryRowOrderAsString()
void vtkDICOMWriter::SetFileSliceOrder(int order)
{
if (order >= 0 && order <= vtkDICOMWriter::Reverse)
- {
+ {
if (order != this->FileSliceOrder)
- {
+ {
this->FileSliceOrder = order;
this->Modified();
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -211,7 +211,7 @@ const char *vtkDICOMWriter::GetFileSliceOrderAsString()
{
const char *text = "";
switch (this->FileSliceOrder)
- {
+ {
case vtkDICOMWriter::RHR:
text = "RHR";
break;
@@ -224,7 +224,7 @@ const char *vtkDICOMWriter::GetFileSliceOrderAsString()
case vtkDICOMWriter::Reverse:
text = "Reverse";
break;
- }
+ }
return text;
}
@@ -235,38 +235,38 @@ void vtkDICOMWriter::ComputeInternalFileName(int slice)
size_t n = 0;
if (this->FileName)
- {
+ {
n = strlen(this->FileName) + 1;
- }
+ }
else if (this->FilePrefix)
- {
+ {
n = strlen(this->FilePrefix) + strlen(this->FilePattern) + 10;
- }
+ }
else
- {
+ {
n = strlen(this->FilePattern) + 10;
- }
+ }
if (this->InternalFileName == 0 ||
strlen(this->InternalFileName) + 10 < n)
- {
+ {
delete [] this->InternalFileName;
this->InternalFileName = new char[n + 11];
- }
+ }
if (this->FileName)
- {
+ {
sprintf(this->InternalFileName, "%s", this->FileName);
- }
+ }
else if (this->FilePrefix)
- {
+ {
sprintf(this->InternalFileName,
this->FilePattern, this->FilePrefix, slice);
- }
+ }
else
- {
+ {
sprintf(this->InternalFileName, this->FilePattern, slice);
- }
+ }
}
//----------------------------------------------------------------------------
@@ -280,73 +280,73 @@ void vtkDICOMWriter::FreeInternalFileName()
int vtkDICOMWriter::GenerateMetaData(vtkInformation *info)
{
if (this->GeneratedMetaData)
- {
+ {
this->GeneratedMetaData->Delete();
this->GeneratedMetaData = 0;
- }
+ }
if (!this->Generator)
- {
+ {
vtkErrorMacro("No Generator was supplied, unable to create a DICOM "
"data set");
return 0;
- }
+ }
// Check whether image is stored top-to-bottom or bottom-to-top
bool flipImage = (this->MemoryRowOrder == vtkDICOMWriter::BottomUp);
bool reverseSlices = flipImage;
if (this->FileSliceOrder == vtkDICOMWriter::LHR)
- {
+ {
reverseSlices = !flipImage;
- }
+ }
else if (this->FileSliceOrder == vtkDICOMWriter::Same)
- {
+ {
reverseSlices = false;
- }
+ }
else if (this->FileSliceOrder == vtkDICOMWriter::Reverse)
- {
+ {
reverseSlices = true;
- }
+ }
// Get the meta data from the pipeline if not given explicitly
vtkDICOMMetaData *inMeta = this->MetaData;
vtkMatrix4x4 *inMatrix = this->PatientMatrix;
vtkInformation *metaInfo = info;
if (inMeta == 0 || inMatrix == 0)
- {
+ {
// this code is needed for when SetInputData was used
vtkAlgorithmOutput *sourceConnection = this->GetInputConnection(0, 0);
if (sourceConnection)
- {
+ {
vtkAlgorithm *producer = sourceConnection->GetProducer();
if (producer && vtkTrivialProducer::SafeDownCast(producer))
- {
+ {
vtkDataObject *inputData = producer->GetOutputDataObject(0);
if (inputData)
- {
+ {
metaInfo = inputData->GetInformation();
- }
}
}
}
+ }
if (inMeta == 0)
- {
+ {
inMeta = vtkDICOMMetaData::SafeDownCast(
metaInfo->Get(vtkDICOMAlgorithm::META_DATA()));
- }
+ }
if (inMatrix == 0)
- {
+ {
double *elements = metaInfo->Get(vtkDICOMAlgorithm::PATIENT_MATRIX());
if (elements)
- {
+ {
inMatrix = vtkMatrix4x4::New();
inMatrix->DeepCopy(elements);
- }
}
+ }
else
- {
+ {
inMatrix->Register(0);
- }
+ }
// Generate the meta data
this->Generator->SetMultiFrame(this->FileDimensionality > 2);
@@ -360,30 +360,30 @@ int vtkDICOMWriter::GenerateMetaData(vtkInformation *info)
this->Generator->SetSourceMetaData(inMeta);
this->Generator->SetPatientMatrix(inMatrix);
if (inMatrix)
- {
+ {
inMatrix->Delete();
- }
+ }
if (!this->Generator->GenerateInstance(info))
- {
+ {
return 0;
- }
+ }
this->GeneratedMetaData = this->Generator->GetMetaData();
this->GeneratedMetaData->Register(this);
vtkDICOMMetaData *meta = this->GeneratedMetaData;
// set the series description from the member variable
if (this->SeriesDescription && this->SeriesDescription[0] != '\0')
- {
+ {
char sd[65];
strncpy(sd, this->SeriesDescription, 64);
sd[64] = '\0';
meta->SetAttributeValue(DC::SeriesDescription, sd);
meta->RemoveAttribute(DC::SeriesDescriptionCodeSequence);
- }
+ }
// set the image type from the member variable
if (this->ImageType && this->ImageType[0] != '\0')
- {
+ {
const char *allowedTypes[] = {
"ORIGINAL\\PRIMARY", "DERIVED\\PRIMARY",
"ORIGINAL\\SECONDARY", "DERIVED\\SECONDARY",
@@ -396,43 +396,43 @@ int vtkDICOMWriter::GenerateMetaData(vtkInformation *info)
char *sdp = sd;
char *lsdp = sd;
while (*sdp != '\0')
- {
+ {
char c = *sdp++;
if (((c < 'A' || c > 'Z') && (c < '0' || c > '9') &&
c != '_' && c != ' ') || (sdp - lsdp > 16))
- {
+ {
vtkErrorMacro("Illegal ImageType: " << this->ImageType);
return 0;
- }
+ }
if (*sdp == '/' || *sdp == '\\')
- {
+ {
*sdp++ = '\\';
lsdp = sdp;
- }
}
+ }
bool isAllowed = false;
for (const char **allowed = allowedTypes; *allowed != 0; allowed++)
- {
+ {
size_t sl = strlen(*allowed);
if (strncmp(*allowed, sd, sl) == 0 && (sd[sl] == '\0' || sd[sl] == '\\'))
- {
+ {
isAllowed = true;
break;
- }
}
+ }
if (!isAllowed)
- {
+ {
vtkErrorMacro("Illegal ImageType: " << this->ImageType << ", "
"the first part must be ORIGINAL or DERIVED, the "
"second part must be PRIMARY or SECONDARY");
return 0;
- }
+ }
meta->SetAttributeValue(DC::ImageType, sd);
- }
+ }
// add an empty PixelData to be filled in by the compiler
unsigned short empty = 0;
@@ -455,27 +455,27 @@ int vtkDICOMWriter::RequestData(
vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT()));
if (data == NULL)
- {
+ {
vtkErrorMacro("No input provided!");
return 0;
- }
+ }
if (!this->FileName && !this->FilePattern)
- {
+ {
vtkErrorMacro("Write:Please specify either a FileName "
"or a file prefix and pattern");
this->SetErrorCode(vtkErrorCode::NoFileNameError);
return 0;
- }
+ }
if (!this->GeneratedMetaData)
- {
+ {
// Generate the meta data to go with the image
if (!this->GenerateMetaData(info))
- {
+ {
return 0;
- }
}
+ }
// Get the map from file,frame to slice.
vtkIntArray *sliceMap = this->Generator->GetSliceIndexArray();
@@ -492,24 +492,24 @@ int vtkDICOMWriter::RequestData(
int minFileIdx = numFiles-1;
int maxFileIdx = 0;
for (int fileIdx = 0; fileIdx < numFiles; fileIdx++)
- {
+ {
for (int frameIdx = 0; frameIdx < numFrames; frameIdx++)
- {
+ {
int sliceIdx = sliceMap->GetComponent(fileIdx, frameIdx);
if (sliceIdx >= extent[4] && sliceIdx <= extent[5])
- {
+ {
minFileIdx = (minFileIdx < fileIdx ? minFileIdx : fileIdx);
maxFileIdx = (maxFileIdx > fileIdx ? maxFileIdx : fileIdx);
- }
}
}
+ }
vtkSmartPointer<vtkDICOMCompiler> compiler =
vtkSmartPointer<vtkDICOMCompiler>::New();
if (this->TransferSyntaxUID)
- {
+ {
compiler->SetTransferSyntaxUID(this->TransferSyntaxUID);
- }
+ }
vtkDICOMMetaData *meta = this->GeneratedMetaData;
compiler->SetMetaData(meta);
@@ -543,18 +543,18 @@ int vtkDICOMWriter::RequestData(
bool packedToPlanar = (filePixelSize != pixelSize);
unsigned char *rowBuffer = 0;
if (flipImage)
- {
+ {
rowBuffer = new unsigned char[fileRowSize];
- }
+ }
unsigned char *frameBuffer = 0;
if (flipImage || packedToPlanar)
- {
+ {
frameBuffer = new unsigned char[fileFrameSize];
- }
+ }
// loop through all files in the update extent
for (int fileIdx = minFileIdx; fileIdx <= maxFileIdx; fileIdx++)
- {
+ {
// get the index for this file
this->ComputeInternalFileName(fileIdx + 1);
compiler->SetFileName(this->InternalFileName);
@@ -567,7 +567,7 @@ int vtkDICOMWriter::RequestData(
// iterate through all frames in the file
for (int frameIdx = 0; frameIdx < numFrames; frameIdx++)
- {
+ {
if (this->AbortExecute) { break; }
this->UpdateProgress(static_cast<double>(fileIdx*numFrames + frameIdx)/
@@ -580,10 +580,10 @@ int vtkDICOMWriter::RequestData(
unsigned char *framePtr = frameBuffer;
if (!framePtr)
- {
+ {
// write the frame directly from image data
framePtr = (dataPtr + (sliceIdx - extent[4])*sliceSize);
- }
+ }
// go to the correct position in image data
unsigned char *slicePtr =
@@ -593,48 +593,48 @@ int vtkDICOMWriter::RequestData(
// iterate through all color planes in the slice
unsigned char *planePtr = framePtr;
for (int pIdx = 0; pIdx < numPlanes; pIdx++)
- {
+ {
// convert scalar components to planes
if (packedToPlanar)
- {
+ {
const unsigned char *tmpInPtr = slicePtr;
unsigned char *tmpOutPtr = planePtr;
int m = sliceSize/pixelSize;
for (int i = 0; i < m; i++)
- {
+ {
vtkIdType n = filePixelSize;
do { *tmpOutPtr++ = *tmpInPtr++; } while (--n);
tmpInPtr += pixelSize - filePixelSize;
- }
- slicePtr += filePixelSize;
}
+ slicePtr += filePixelSize;
+ }
else
- {
+ {
memcpy(framePtr, slicePtr, fileFrameSize);
- }
+ }
// flip the data if necessary
if (flipImage)
- {
+ {
int numRows = extent[3] - extent[2] + 1;
int halfRows = numRows/2;
for (int yIdx = 0; yIdx < halfRows; yIdx++)
- {
+ {
unsigned char *row1 = planePtr + yIdx*fileRowSize;
unsigned char *row2 = planePtr + (numRows-yIdx-1)*fileRowSize;
memcpy(rowBuffer, row1, fileRowSize);
memcpy(row1, row2, fileRowSize);
memcpy(row2, rowBuffer, fileRowSize);
- }
}
+ }
planePtr += filePlaneSize;
- }
+ }
// write the frame to the file
compiler->WriteFrame(framePtr, fileFrameSize);
- }
- compiler->Close();
}
+ compiler->Close();
+ }
delete [] rowBuffer;
delete [] frameBuffer;
@@ -657,16 +657,16 @@ void vtkDICOMWriter::Write()
inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent);
// if streaming is on, write the slices one-at-a-time
if (this->Streaming && this->FileDimensionality == 2)
- {
+ {
if (this->GenerateMetaData(inInfo))
- {
+ {
int extent[6] = {
wholeExtent[0], wholeExtent[1],
wholeExtent[2], wholeExtent[3],
wholeExtent[4], wholeExtent[5]
};
for (int i = wholeExtent[4]; i <= wholeExtent[5]; i++)
- {
+ {
// set the update extent to the slice
extent[4] = i;
extent[5] = i;
@@ -674,21 +674,21 @@ void vtkDICOMWriter::Write()
inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(),
extent, 6);
this->Update();
- }
}
}
+ }
else
- {
+ {
// set update wholeExtent to whole wholeExtent
inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(),
wholeExtent, 6);
this->Update();
- }
+ }
// do some cleanup
if (this->GeneratedMetaData)
- {
+ {
this->GeneratedMetaData->Delete();
this->GeneratedMetaData = 0;
- }
+ }
}
diff --git a/Source/vtkDICOMWriter.h b/Source/vtkDICOMWriter.h
index ef42975..fd934dc 100644
--- a/Source/vtkDICOMWriter.h
+++ b/Source/vtkDICOMWriter.h
@@ -11,16 +11,16 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkDICOMWriter - Write DICOM image files.
-// .SECTION Description
-// This class writes a series of one or more DICOM files. The default
-// behavior is to write a series of Secondary Capture files with no
-// modality-specific information. To write other kinds of DICOM files,
-// use the SetGenerator() method to supply a generator for the type of
-// data set that you wish to write. Currently, there are generators for
-// MR and CT data sets.
-// .SECTION Thanks
-// This class was contributed to VTK by David Gobbi.
+/*! \class vtkDICOMWriter
+ * \brief Write DICOM image files.
+ *
+ * This class writes a series of one or more DICOM files. The default
+ * behavior is to write a series of Secondary Capture files with no
+ * modality-specific information. To write other kinds of DICOM files,
+ * use the SetGenerator() method to supply a generator for the type of
+ * data set that you wish to write. Currently, there are generators for
+ * MR and CT data sets.
+ */
#ifndef vtkDICOMWriter_h
#define vtkDICOMWriter_h
@@ -35,80 +35,98 @@ class vtkDICOMGenerator;
class VTKDICOM_EXPORT vtkDICOMWriter : public vtkImageWriter
{
public:
- // Description:
- // Static method for construction.
- static vtkDICOMWriter *New();
vtkTypeMacro(vtkDICOMWriter, vtkImageWriter);
- // Description:
- // Print information about this object.
+ //! Static method for construction.
+ static vtkDICOMWriter *New();
+
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Set a short description (max 64 chars) for the DICOM series.
- // The default description is "VTKX.Y" where X.Y is the VTK version.
+ //@{
+ //! Set a short description (max 64 chars) for the DICOM series.
+ /*!
+ * The default description is "VTKX.Y" where X.Y is the VTK version.
+ */
vtkSetStringMacro(SeriesDescription);
vtkGetStringMacro(SeriesDescription);
-
- // Description:
- // Set the image type, using a series of DICOM code strings.
- // This must follow the DICOM standard, an error will be generated
- // if it doesn't. The default value is DERIVED/SECONDARY/OTHER,
- // where the forward-slashes will be replaced by backslashes when
- // the attribute is written. Set this to NULL if you wish to use
- // the original ImageType.
+ //@}
+
+ //@{
+ //! Set the image type, using a series of DICOM code strings.
+ /*!
+ * This must follow the DICOM standard, an error will be generated
+ * if it doesn't. The default value is DERIVED/SECONDARY/OTHER,
+ * where the forward-slashes will be replaced by backslashes when
+ * the attribute is written. Set this to NULL if you wish to use
+ * the original ImageType.
+ */
vtkSetStringMacro(ImageType);
vtkGetStringMacro(ImageType);
-
- // Description:
- // Write scalar components as the time dimension (default: Off).
- // If this is on, the writer assumes that each time slot is stored
- // in a different scalar component of the image data. If it is off,
- // the writer assumes that each block of N adjacent slices correspond
- // to the N time slots of the time dimension.
+ //@}
+
+ //@{
+ //! Write scalar components as the time dimension (default: Off).
+ /*!
+ * If this is on, the writer assumes that each time slot is stored
+ * in a different scalar component of the image data. If it is off,
+ * the writer assumes that each block of N adjacent slices correspond
+ * to the N time slots of the time dimension.
+ */
vtkSetMacro(TimeAsVector, int);
vtkBooleanMacro(TimeAsVector, int);
vtkGetMacro(TimeAsVector, int);
-
- // Description:
- // Set the time dimension to use in the DICOM file (or zero if none).
- // The number of components of the input data must be divisible by the time
- // dimension if the time dimension is not set to zero. The vector dimension
- // will be set to the number of components divided by the time dimension.
- // This will be ignored if the SOP Class IOD does not permit a time
- // dimension.
+ //@}
+
+ //@{
+ //! Set the time dimension to use in the DICOM file (or zero if none).
+ /*!
+ * The number of components of the input data must be divisible by the time
+ * dimension if the time dimension is not set to zero. The vector dimension
+ * will be set to the number of components divided by the time dimension.
+ * This will be ignored if the SOP Class IOD does not permit a time
+ * dimension.
+ */
vtkSetMacro(TimeDimension, int);
vtkGetMacro(TimeDimension, int);
vtkSetMacro(TimeSpacing, double);
vtkGetMacro(TimeSpacing, double);
-
- // Description:
- // Set the parameters to rescale integer pixel values into real values.
- // These parameters are the intercept and slope int the equation v = m*x + b
- // that converts the stored pixel values to real units such as Hounsfield
- // units. Most modalities (including MR) ignore these values, while certain
- // modalities (such as CT) require them.
+ //@}
+
+ //@{
+ //! Set the parameters to rescale integer pixel values into real values.
+ /*!
+ * These parameters are the intercept and slope int the equation v = m*x + b
+ * that converts the stored pixel values to real units such as Hounsfield
+ * units. Most modalities (including MR) ignore these values, while certain
+ * modalities (such as CT) require them.
+ */
vtkSetMacro(RescaleIntercept, double);
vtkGetMacro(RescaleIntercept, double);
vtkSetMacro(RescaleSlope, double);
vtkGetMacro(RescaleSlope, double);
-
- // Description:
- // Set the matrix that places the image in DICOM patient coords.
- // The 3x3 portion of the matrix must be orthonormal, and the
- // last column of the matrix is understood to be in millimetres.
+ //@}
+
+ //@{
+ //! Set the matrix that places the image in DICOM patient coords.
+ /*!
+ * The 3x3 portion of the matrix must be orthonormal, and the
+ * last column of the matrix is understood to be in millimetres.
+ */
void SetPatientMatrix(vtkMatrix4x4 *);
vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
+ //@}
- // Description:
- // Enumeration for top-down vs. bottom-up ordering.
+ //! Enumeration for top-down vs. bottom-up ordering.
enum RowOrder { FileNative, TopDown, BottomUp };
- // Description:
- // Set the ordering of the image rows in memory.
- // If the order is BottomUp (which is the default) then
- // the images will be flipped when they are read from disk.
- // The native orientation of DICOM images is top-to-bottom.
+ //@{
+ //! Set the ordering of the image rows in memory.
+ /*!
+ * If the order is BottomUp (which is the default) then
+ * the images will be flipped when they are read from disk.
+ * The native orientation of DICOM images is top-to-bottom.
+ */
void SetMemoryRowOrder(int order);
void SetMemoryRowOrderToFileNative() {
this->SetMemoryRowOrder(FileNative); }
@@ -118,18 +136,20 @@ public:
this->SetMemoryRowOrder(BottomUp); }
int GetMemoryRowOrder() { return this->MemoryRowOrder; }
const char *GetMemoryRowOrderAsString();
+ //@}
- // Description:
- // Enumeration for file order.
+ //! Enumeration for file order.
enum SliceOrder { RHR, LHR, Same, Reverse };
- // Description:
- // Set the slice ordering of the files to be written.
- // The default is RHR (right-hand-rule), which means that if your
- // right thumb points along an image row, and your index finger points
- // down a row (starting at the top left of the image), then a bent middle
- // finger points in the direction of increasing slice index. LHR is the
- // reverse of this. Same keeps files in the same order as VTK slices.
+ //@{
+ //! Set the slice ordering of the files to be written.
+ /*!
+ * The default is RHR (right-hand-rule), which means that if your
+ * right thumb points along an image row, and your index finger points
+ * down a row (starting at the top left of the image), then a bent middle
+ * finger points in the direction of increasing slice index. LHR is the
+ * reverse of this. Same keeps files in the same order as VTK slices.
+ */
void SetFileSliceOrder(int order);
void SetFileSliceOrderToRHR() { this->SetFileSliceOrder(RHR); }
void SetFileSliceOrderToLHR() { this->SetFileSliceOrder(LHR); }
@@ -137,125 +157,122 @@ public:
void SetFileSliceOrderToReverse() { this->SetFileSliceOrder(Reverse); }
int GetFileSliceOrder() { return this->FileSliceOrder; }
const char *GetFileSliceOrderAsString();
-
- // Description:
- // Set the meta data to include with the file.
- // The supplied meta data is only used as a hint, the writer
- // will override attributes that aren't valid for the image.
+ //@}
+
+ //@{
+ //! Set the meta data to include with the file.
+ /*!
+ * The supplied meta data is only used as a hint, the writer
+ * will override attributes that aren't valid for the image.
+ */
void SetMetaData(vtkDICOMMetaData *);
vtkDICOMMetaData *GetMetaData();
-
- // Description:
- // Set the generator for image modality you wish to write.
- // The generator combines the image information from VTK with the
- // supplied MetaData to create the DICOM data series that will be
- // written to disk. The default generator will write a Secondary
- // Capture series, rather than a series belonging to a specific
- // imaging modality.
+ //@}
+
+ //@{
+ //! Set the generator for image modality you wish to write.
+ /*!
+ * The generator combines the image information from VTK with the
+ * supplied MetaData to create the DICOM data series that will be
+ * written to disk. The default generator will write a Secondary
+ * Capture series, rather than a series belonging to a specific
+ * imaging modality.
+ */
void SetGenerator(vtkDICOMGenerator *);
vtkDICOMGenerator *GetGenerator() { return this->Generator; }
-
- // Description:
- // Set the Transfer Syntax UID.
- // Setting the transfer syntax is an experimental feature. If not
- // set, the transfer syntax will be 1.2.840.10008.1.2.1 (uncompressed
- // little-endian with explicit VR).
+ //@}
+
+ //@{
+ //! Set the Transfer Syntax UID.
+ /*!
+ * Setting the transfer syntax is an experimental feature. If not
+ * set, the transfer syntax will be 1.2.840.10008.1.2.1 (uncompressed
+ * little-endian with explicit VR).
+ */
vtkSetStringMacro(TransferSyntaxUID);
vtkGetStringMacro(TransferSyntaxUID);
-
- // Description:
- // Turn on streaming, to pass one slice though the pipeline at a time.
- // Streaming decreases memory usage for images with a large number of
- // slices, since only one slice will have to be in memory at a time.
- // However, streaming can be slower (sometimes much slower) than
- // reading and processing all of the slices at once.
+ //@}
+
+ //@{
+ //! Turn on streaming, to pass one slice though the pipeline at a time.
+ /*!
+ * Streaming decreases memory usage for images with a large number of
+ * slices, since only one slice will have to be in memory at a time.
+ * However, streaming can be slower (sometimes much slower) than
+ * reading and processing all of the slices at once.
+ */
vtkSetMacro(Streaming, int);
vtkGetMacro(Streaming, int);
vtkBooleanMacro(Streaming, int);
+ //@}
- // Description:
- // Write the file to disk.
+ //@{
+ //! Write the file to disk.
virtual void Write();
+ //@}
protected:
vtkDICOMWriter();
~vtkDICOMWriter();
- // Description:
- // Compute the name of one of the output files.
+ //! Compute the name of one of the output files.
void ComputeInternalFileName(int slice);
- // Description:
- // Free the filename created by ComputeInternalFileName.
+ //! Free the filename created by ComputeInternalFileName.
void FreeInternalFileName();
- // Description:
- // Generate the meta data to be written for the files.
+ //! Generate the meta data to be written for the files.
virtual int GenerateMetaData(vtkInformation *info);
- // Description:
- // The main execution method, which writes the file.
+ //! The main execution method, which writes the file.
virtual int RequestData(vtkInformation *request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // The meta data set by the user.
+ //! The meta data set by the user.
vtkDICOMMetaData *MetaData;
- // Description:
- // The meta data generated by the generator.
+ //! The meta data generated by the generator.
vtkDICOMMetaData *GeneratedMetaData;
- // Description:
- // The modality-specific generator for the DICOM data object.
+ //! The modality-specific generator for the DICOM data object.
vtkDICOMGenerator *Generator;
- // Description:
- // Whether time is stored in slices or in scalar components.
+ //! Whether time is stored in slices or in scalar components.
int TimeAsVector;
- // Description:
- // Time dimension to use in the file.
+ //! Time dimension to use in the file.
int TimeDimension;
double TimeSpacing;
- // Description:
- // The parameters for rescaling the data to real values.
+ //! The parameters for rescaling the data to real values.
double RescaleIntercept;
double RescaleSlope;
- // Description:
- // The orientation matrix for the DICOM file.
+ //! The orientation matrix for the DICOM file.
vtkMatrix4x4 *PatientMatrix;
- // Description:
- // A description of how the file was produced.
+ //! A description of how the file was produced.
char *SeriesDescription;
- // Description:
- // The transfer syntax to use when writing the data.
+ //! The transfer syntax to use when writing the data.
char *TransferSyntaxUID;
- // Description:
- // The DICOM Image Type.
+ //! The DICOM Image Type.
char *ImageType;
- // Description:
- // The row order to use when storing the data in memory.
+ //! The row order to use when storing the data in memory.
int MemoryRowOrder;
- // Description:
- // The slice order to use when writing the files to disk.
+ //! The slice order to use when writing the files to disk.
int FileSliceOrder;
- // Description:
- // Whether to stream the data and write one file at a time.
+ //! Whether to stream the data and write one file at a time.
int Streaming;
private:
- vtkDICOMWriter(const vtkDICOMWriter&); // Not implemented.
- void operator=(const vtkDICOMWriter&); // Not implemented.
+ vtkDICOMWriter(const vtkDICOMWriter&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkDICOMWriter&) VTK_DELETE_FUNCTION;
};
#endif // vtkDICOMWriter_h
diff --git a/Source/vtkNIFTIHeader.cxx b/Source/vtkNIFTIHeader.cxx
index f303b16..c77778b 100644
--- a/Source/vtkNIFTIHeader.cxx
+++ b/Source/vtkNIFTIHeader.cxx
@@ -59,10 +59,10 @@ void vtkNIFTIHeader::Initialize()
this->DataType = 0;
this->BitPix = 0;
for (int i = 0; i < 8; i++)
- {
+ {
this->Dim[i] = 0;
this->PixDim[i] = 0.0;
- }
+ }
this->IntentCode = 0;
memset(this->IntentName, '\0', sizeof(this->IntentName));
this->IntentP1 = 0.0;
@@ -90,11 +90,11 @@ void vtkNIFTIHeader::Initialize()
this->QOffsetY = 0.0;
this->QOffsetZ = 0.0;
for (int i = 0; i < 4; i++)
- {
+ {
this->SRowX[i] = 0.0;
this->SRowY[i] = 0.0;
this->SRowZ[i] = 0.0;
- }
+ }
}
//----------------------------------------------------------------------------
@@ -110,19 +110,19 @@ void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr)
hdr->magic[3] == '\0');
if (isnifti)
- {
+ {
memcpy(this->Magic, hdr->magic, sizeof(hdr->magic));
- }
+ }
this->VoxOffset = static_cast<vtkTypeInt64>(hdr->vox_offset);
this->DataType = hdr->datatype;
this->BitPix = hdr->bitpix;
for (int i = 0; i < 8; i++)
- {
+ {
this->Dim[i] = hdr->dim[i];
this->PixDim[i] = hdr->pixdim[i];
- }
+ }
if (isnifti)
- {
+ {
this->IntentCode = hdr->intent_code;
strncpy(this->IntentName, hdr->intent_name, sizeof(hdr->intent_name));
this->IntentP1 = hdr->intent_p1;
@@ -130,23 +130,23 @@ void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr)
this->IntentP3 = hdr->intent_p3;
this->SclSlope = hdr->scl_slope;
this->SclInter = hdr->scl_inter;
- }
+ }
this->CalMin = hdr->cal_min;
this->CalMax = hdr->cal_max;
if (isnifti)
- {
+ {
this->SliceDuration = hdr->slice_duration;
this->TOffset = hdr->toffset;
this->SliceStart = hdr->slice_start;
this->SliceEnd = hdr->slice_end;
this->SliceCode = hdr->slice_code;
- }
+ }
this->XYZTUnits = hdr->xyzt_units;
this->DimInfo = hdr->dim_info;
strncpy(this->Descrip, hdr->descrip, sizeof(hdr->descrip));
strncpy(this->AuxFile, hdr->aux_file, sizeof(hdr->aux_file));
if (isnifti)
- {
+ {
this->QFormCode = hdr->qform_code;
this->SFormCode = hdr->sform_code;
this->QuaternB = hdr->quatern_b;
@@ -156,12 +156,12 @@ void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr)
this->QOffsetY = hdr->qoffset_y;
this->QOffsetZ = hdr->qoffset_z;
for (int i = 0; i < 4; i++)
- {
+ {
this->SRowX[i] = hdr->srow_x[i];
this->SRowY[i] = hdr->srow_y[i];
this->SRowZ[i] = hdr->srow_z[i];
- }
}
+ }
}
//----------------------------------------------------------------------------
@@ -183,12 +183,13 @@ void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr)
hdr->bitpix = static_cast<short>(this->BitPix);
hdr->slice_start = this->SliceStart;
for (int i = 0; i < 8; i++)
- {
+ {
hdr->dim[i] = static_cast<short>(this->Dim[i]);
hdr->pixdim[i] = vtkNIFTINormalizeFloat(this->PixDim[i]);
- }
+ }
hdr->vox_offset = static_cast<float>(this->VoxOffset);
- strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name));
+ strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name) - 1);
+ hdr->intent_name[sizeof(hdr->intent_name) - 1] = '\0';
hdr->scl_slope = vtkNIFTINormalizeFloat(this->SclSlope);
hdr->scl_inter = vtkNIFTINormalizeFloat(this->SclInter);
hdr->cal_min = vtkNIFTINormalizeFloat(this->CalMin);
@@ -200,8 +201,10 @@ void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr)
hdr->slice_end = this->SliceEnd;
hdr->slice_code = this->SliceCode;
hdr->xyzt_units = this->XYZTUnits;
- strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip));
- strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file));
+ strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip) - 1);
+ hdr->descrip[sizeof(hdr->descrip) - 1] = '\0';
+ strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file) - 1);
+ hdr->aux_file[sizeof(hdr->aux_file) - 1] = '\0';
hdr->qform_code = static_cast<short>(this->QFormCode);
hdr->sform_code = static_cast<short>(this->SFormCode);
hdr->quatern_b = vtkNIFTINormalizeFloat(this->QuaternB);
@@ -211,11 +214,11 @@ void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr)
hdr->qoffset_y = vtkNIFTINormalizeFloat(this->QOffsetY);
hdr->qoffset_z = vtkNIFTINormalizeFloat(this->QOffsetZ);
for (int i = 0; i < 4; i++)
- {
+ {
hdr->srow_x[i] = vtkNIFTINormalizeFloat(this->SRowX[i]);
hdr->srow_y[i] = vtkNIFTINormalizeFloat(this->SRowY[i]);
hdr->srow_z[i] = vtkNIFTINormalizeFloat(this->SRowZ[i]);
- }
+ }
}
@@ -227,10 +230,10 @@ void vtkNIFTIHeader::SetHeader(const nifti_2_header *hdr)
this->DataType = hdr->datatype;
this->BitPix = hdr->bitpix;
for (int i = 0; i < 8; i++)
- {
+ {
this->Dim[i] = hdr->dim[i];
this->PixDim[i] = hdr->pixdim[i];
- }
+ }
this->IntentCode = hdr->intent_code;
strncpy(this->IntentName, hdr->intent_name, sizeof(hdr->intent_name));
this->IntentP1 = hdr->intent_p1;
@@ -258,11 +261,11 @@ void vtkNIFTIHeader::SetHeader(const nifti_2_header *hdr)
this->QOffsetY = hdr->qoffset_y;
this->QOffsetZ = hdr->qoffset_z;
for (int i = 0; i < 4; i++)
- {
+ {
this->SRowX[i] = hdr->srow_x[i];
this->SRowY[i] = hdr->srow_y[i];
this->SRowZ[i] = hdr->srow_z[i];
- }
+ }
}
//----------------------------------------------------------------------------
@@ -273,10 +276,10 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
hdr->datatype = static_cast<short>(this->DataType);
hdr->bitpix = static_cast<short>(this->BitPix);
for (int i = 0; i < 8; i++)
- {
+ {
hdr->dim[i] = static_cast<short>(this->Dim[i]);
hdr->pixdim[i] = vtkNIFTINormalizeDouble(this->PixDim[i]);
- }
+ }
hdr->intent_p1 = vtkNIFTINormalizeDouble(this->IntentP1);
hdr->intent_p2 = vtkNIFTINormalizeDouble(this->IntentP2);
hdr->intent_p3 = vtkNIFTINormalizeDouble(this->IntentP3);
@@ -289,8 +292,10 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
hdr->toffset = vtkNIFTINormalizeDouble(this->TOffset);
hdr->slice_start = this->SliceStart;
hdr->slice_end = this->SliceEnd;
- strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip));
- strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file));
+ strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip) - 1);
+ hdr->descrip[sizeof(hdr->descrip) - 1] = '\0';
+ strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file) - 1);
+ hdr->aux_file[sizeof(hdr->aux_file) - 1] = '\0';
hdr->qform_code = static_cast<short>(this->QFormCode);
hdr->sform_code = static_cast<short>(this->SFormCode);
hdr->quatern_b = vtkNIFTINormalizeDouble(this->QuaternB);
@@ -300,15 +305,16 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
hdr->qoffset_y = vtkNIFTINormalizeDouble(this->QOffsetY);
hdr->qoffset_z = vtkNIFTINormalizeDouble(this->QOffsetZ);
for (int i = 0; i < 4; i++)
- {
+ {
hdr->srow_x[i] = vtkNIFTINormalizeDouble(this->SRowX[i]);
hdr->srow_y[i] = vtkNIFTINormalizeDouble(this->SRowY[i]);
hdr->srow_z[i] = vtkNIFTINormalizeDouble(this->SRowZ[i]);
- }
+ }
hdr->slice_code = this->SliceCode;
hdr->xyzt_units = this->XYZTUnits;
hdr->intent_code = static_cast<short>(this->IntentCode);
- strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name));
+ strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name) - 1);
+ hdr->intent_name[sizeof(hdr->intent_name) - 1] = '\0';
hdr->dim_info = static_cast<char>(this->DimInfo);
memset(hdr->unused_str, '\0', 15);
}
@@ -317,15 +323,15 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
void vtkNIFTIHeader::DeepCopy(vtkNIFTIHeader *o)
{
if (o)
- {
+ {
nifti_2_header hdr;
o->GetHeader(&hdr);
this->SetHeader(&hdr);
- }
+ }
else
- {
+ {
this->Initialize();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -338,15 +344,15 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
os.unsetf(std::ios::hex);
os << indent << "Dim:";
for (int i = 0; i < 8; i++)
- {
+ {
os << " " << this->Dim[i];
- }
+ }
os << indent << "\n";
os << indent << "PixDim:";
for (int i = 0; i < 8; i++)
- {
+ {
os << " " << this->PixDim[i];
- }
+ }
os << indent << "\n";
os << indent << "VoxOffset:" << this->VoxOffset << "\n";
os << indent << "IntentP1: " << this->IntentP1 << "\n";
@@ -369,15 +375,15 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "TOffset: " << this->TOffset << "\n";
os << indent << "Descrip: \"";
for (size_t j = 0; j < 80 && this->Descrip[j] != '\0'; j++)
- {
+ {
os << (isprint(this->Descrip[j]) ? this->Descrip[j] : '?');
- }
+ }
os << "\"\n";
os << indent << "AuxFile: \"";
for (size_t j = 0; j < 24 && this->AuxFile[j] != '\0'; j++)
- {
+ {
os << (isprint(this->AuxFile[j]) ? this->AuxFile[j] : '?');
- }
+ }
os << "\"\n";
os << indent << "QFormCode: " << this->QFormCode << "\n";
os << indent << "SFormCode: " << this->SFormCode << "\n";
@@ -389,33 +395,33 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "QOffsetZ: " << this->QOffsetZ << "\n";
os << indent << "SRowX:";
for (int i = 0; i < 4; i++)
- {
+ {
os << " " << this->SRowX[i];
- }
+ }
os << "\n";
os << indent << "SRowY:";
for (int i = 0; i < 4; i++)
- {
+ {
os << " " << this->SRowY[i];
- }
+ }
os << "\n";
os << indent << "SRowZ:";
for (int i = 0; i < 4; i++)
- {
+ {
os << " " << this->SRowZ[i];
- }
+ }
os << "\n";
os << indent << "IntentName: \"";
for (size_t j = 0; j < 16 && this->IntentName[j] != '\0'; j++)
- {
+ {
os << (isprint(this->IntentName[j]) ? this->IntentName[j] : '?');
- }
+ }
os << "\"\n";
os << indent << "Magic: \"";
for (size_t j = 0; j < 4 && this->Magic[j] != '\0'; j++)
- {
+ {
os << (isprint(this->Magic[j]) ? this->Magic[j] : '?');
- }
+ }
os << "\"\n";
}
@@ -423,15 +429,15 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
void vtkNIFTIHeader::SetStringValue(char *x, const char *y, size_t n)
{
if (y == 0)
- {
+ {
y = "";
- }
+ }
if (strncmp(x, y, n) != 0)
- {
+ {
strncpy(x, y, n);
x[n] = '\0';
this->Modified();
- }
+ }
}
//----------------------------------------------------------------------------
diff --git a/Source/vtkNIFTIHeader.h b/Source/vtkNIFTIHeader.h
index d0d5493..adb7e8a 100644
--- a/Source/vtkNIFTIHeader.h
+++ b/Source/vtkNIFTIHeader.h
@@ -12,23 +12,25 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkNIFTIHeader - Store NIfTI header information.
-// .SECTION Description
-// This class stores the header of a NIfTI file in a VTK-friendly format.
-// By using this class, it is possible to specify the header information
-// that will be stored in a file written by the vtkNIFTIWriter. Note
-// that the SForm and QForm orientation information in this class will be
-// ignored by the writer if an SForm and QForm have been explicitly set
-// via the writer's SetSForm and SetQForm methods. Also note that all
-// info like Dim, PixDim, DataType, etc. will be ignored by the writer
-// because this information must instead be taken from the vtkImageData
-// information. Finally, note that the vtkNIFTIWriter will ignore the
-// Descrip field, since it has its own SetDescription method.
-// .SECTION Thanks
-// This class was contributed to VTK by the Calgary Image Processing and
-// Analysis Centre (CIPAC).
-// .SECTION See Also
-// vtkNIFTIReader, vtkNIFTIWriter
+/*! \class vtkNIFTIHeader
+ * \brief Store NIfTI header information.
+ *
+ * This class stores the header of a NIfTI file in a VTK-friendly format.
+ * By using this class, it is possible to specify the header information
+ * that will be stored in a file written by the vtkNIFTIWriter. Note
+ * that the SForm and QForm orientation information in this class will be
+ * ignored by the writer if an SForm and QForm have been explicitly set
+ * via the writer's SetSForm and SetQForm methods. Also note that all
+ * info like Dim, PixDim, DataType, etc. will be ignored by the writer
+ * because this information must instead be taken from the vtkImageData
+ * information. Finally, note that the vtkNIFTIWriter will ignore the
+ * Descrip field, since it has its own SetDescription method.
+ *
+ * This class was contributed to VTK by the Calgary Image Processing and
+ * Analysis Centre (CIPAC).
+ *
+ * \sa vtkNIFTIReader, vtkNIFTIWriter
+ */
#ifndef vtkNIFTIHeader_h
#define vtkNIFTIHeader_h
@@ -44,8 +46,7 @@ class VTKDICOM_EXPORT vtkNIFTIHeader : public vtkObject
{
public:
- // Description:
- // NIFTI intent codes.
+ //! NIFTI intent codes.
enum IntentCodeEnum {
IntentNone = 0,
IntentCorrel = 2,
@@ -89,8 +90,7 @@ public:
IntentShape = 2005
};
- // Description:
- // NIFTI transform codes.
+ //! NIFTI transform codes.
enum XFormCodeEnum {
XFormUnkown = 0,
XFormScannerAnat = 1,
@@ -99,8 +99,7 @@ public:
XFormMNI152 = 4
};
- // Description:
- // NIFTI slice codes.
+ //! NIFTI slice codes.
enum SliceCodeEnum {
SliceUnknown = 0,
SliceSeqInc = 1,
@@ -111,8 +110,7 @@ public:
SliceAltDec2 = 6
};
- // Description:
- // NIFTI unit codes.
+ //! NIFTI unit codes.
enum UnitsXYZTEnum {
UnitsUnknown = 0,
UnitsMeter = 1,
@@ -128,11 +126,12 @@ public:
UnitsTime = 56
};
- // Description:
- // NIFTI data types.
- // Types RGB24 and RGB32 are represented in VTK as a multi-component
- // unsigned char image. Complex values are represented as two-component
- // images. The NIFTI types Float128 and Complex256 are not supported.
+ //! NIFTI data types.
+ /*!
+ * Types RGB24 and RGB32 are represented in VTK as a multi-component
+ * unsigned char image. Complex values are represented as two-component
+ * images. The NIFTI types Float128 and Complex256 are not supported.
+ */
enum DataTypeEnum {
TypeUInt8 = 2,
TypeInt16 = 4,
@@ -152,145 +151,168 @@ public:
TypeRGBA32 = 2304
};
- // Description:
- // NIFTI header sizes.
+ //! NIFTI header sizes.
enum HeaderSizeEnum {
Nifti1HeaderSize = 348,
Nifti2HeaderSize = 540
};
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkNIFTIHeader *New();
vtkTypeMacro(vtkNIFTIHeader, vtkObject);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Get the magic number for the NIFTI file as a null-terminated string.
+ //@{
+ //! Get the magic number for the NIFTI file as a null-terminated string.
const char *GetMagic() { return this->Magic; }
- // Description:
- // Get the offset to the pixel data within the file.
+ //! Get the offset to the pixel data within the file.
vtkTypeInt64 GetVoxOffset() { return this->VoxOffset; }
- // Description:
- // Get the data type.
+ //! Get the data type.
int GetDataType() { return this->DataType; }
- // Description:
- // Get the number of bits per pixel.
+ //! Get the number of bits per pixel.
int GetBitPix() { return this->BitPix; }
+ //@}
- // Description:
- // Get the nth dimension of the data, where GetDim(0) returns the
- // number of dimensions that are defined for the file.
+ //@{
+ //! Get the nth dimension of the data, where 1 is first dimension.
+ /*!
+ * GetDim(0) returns the number of dimensions that are defined for the file.
+ */
vtkTypeInt64 GetDim(int i) {
return (i < 0 || i > 7 ? 0 : this->Dim[i]); }
- // Description:
- // Get the sample spacing in the nth dimension. If GetPixDim(0) is
- // negative, then the quaternion for the qform describes the correct
- // orientation only after the slice ordering has been reversed.
+ //! Get the sample spacing in the nth dimension, 1 is first dimension.
+ /*!
+ * If GetPixDim(0) is negative, then the quaternion for the qform describes
+ * the correct orientation only after the slice ordering has been reversed.
+ */
double GetPixDim(int i) {
return (i < 0 || i > 7 ? 0.0 : this->PixDim[i]); }
-
- // Description:
- // Get the NIFTI intent code. This is an enumerated value in the NIFTI
- // header that states what the data is intended to be used for.
+ //@}
+
+ //@{
+ //! Get the NIFTI intent code.
+ /*!
+ * This is an enumerated value in the NIFTI header that states what the
+ * data is intended to be used for.
+ */
vtkSetMacro(IntentCode, int);
int GetIntentCode() { return this->IntentCode; }
+ //@}
- // Description:
- // Get the intent name. This should match the intent code.
+ //@{
+ //! Get the intent name. This should match the intent code.
void SetIntentName(const char *name);
const char *GetIntentName() { return this->IntentName; }
+ //@}
- // Description:
- // Get one of the NIFTI intent parameters. The definition of these
- // parameters varies according to the IntentCode.
+ //@{
+ //! Get one of the NIFTI intent parameters.
+ /*!
+ * The definition of these parameters varies according to the IntentCode.
+ */
vtkSetMacro(IntentP1, double);
double GetIntentP1() { return this->IntentP1; }
vtkSetMacro(IntentP2, double);
double GetIntentP2() { return this->IntentP2; }
vtkSetMacro(IntentP3, double);
double GetIntentP3() { return this->IntentP3; }
+ //@}
- // Description:
- // Get the scale and slope to apply to the data in order to get
- // the real-valued data values.
+ //@{
+ //! Get the scale and slope to apply to get real-valued data.
vtkSetMacro(SclSlope, double);
double GetSclSlope() { return this->SclSlope; }
vtkSetMacro(SclInter, double);
double GetSclInter() { return this->SclInter; }
+ //@}
- // Description:
- // Get the calibrated range of the data, i.e. the values stored in the
- // cal_min and cal_max fields in the header.
+ //@{
+ //! Get the calibrated range (cal_min, cal_max) of the data.
vtkSetMacro(CalMin, double);
double GetCalMin() { return this->CalMin; }
vtkSetMacro(CalMax, double);
double GetCalMax() { return this->CalMax; }
+ //@}
- // Description:
- // Get the slice_duration and toffset from the header.
+ //@{
+ //! Get the slice_duration and toffset from the header.
vtkSetMacro(SliceDuration, double);
double GetSliceDuration() { return this->SliceDuration; }
vtkSetMacro(TOffset, double);
double GetTOffset() { return this->TOffset; }
+ //@}
- // Description:
- // Get the slice range for the data.
+ //@{
+ //! Get the slice range for the data.
vtkSetMacro(SliceStart, vtkTypeInt64);
vtkTypeInt64 GetSliceStart() { return this->SliceStart; }
vtkSetMacro(SliceEnd, vtkTypeInt64);
vtkTypeInt64 GetSliceEnd() { return this->SliceEnd; }
+ //@}
- // Description:
- // Get the slice code for the data.
+ //@{
+ //! Get the slice code for the data.
vtkSetMacro(SliceCode, int);
int GetSliceCode() { return this->SliceCode; }
+ //@}
- // Description:
- // Get a bitfield that describes the units for the first 4 dims.
+ //@{
+ //! Get a bitfield that describes the units for the first 4 dims.
vtkSetMacro(XYZTUnits, int);
int GetXYZTUnits() { return this->XYZTUnits; }
-
- // Description:
- // Get a bitfield with extra information about the dimensions, it
- // states which dimensions are the phase encode, frequency encode,
- // and slice encode dimensions for MRI acquisitions.
+ //@}
+
+ //@{
+ //! Get a bitfield with extra information about the dimensions, it
+ /*!
+ * states which dimensions are the phase encode, frequency encode,
+ * and slice encode dimensions for MRI acquisitions.
+ */
vtkSetMacro(DimInfo, int);
int GetDimInfo() { return this->DimInfo; }
-
- // Description:
- // Get a null-terminated file descriptor, this usually gives the
- // name of the software that wrote the file. It will have a maximum
- // length of 80 characters.
+ //@}
+
+ //@{
+ //! Get a null-terminated file descriptor, this usually gives the
+ /*!
+ * name of the software that wrote the file. It will have a maximum
+ * length of 80 characters.
+ */
void SetDescrip(const char *descrip);
const char *GetDescrip() { return this->Descrip; }
-
- // Description:
- // Get an auxiliary file, e.g. a color table, that is associated
- // with this data. The length of the filename must be a maximum of
- // 24 characters, and it will be assumed to be in the same directory
- // as the NIFTI file.
+ //@}
+
+ //@{
+ //! Get an auxiliary file, e.g. a color table, that is associated
+ /*!
+ * with this data. The length of the filename must be a maximum of
+ * 24 characters, and it will be assumed to be in the same directory
+ * as the NIFTI file.
+ */
void SetAuxFile(const char *auxfile);
const char *GetAuxFile() { return this->AuxFile; }
+ //@}
- // Description:
- // Get the QForm or SForm code.
+ //@{
+ //! Get the QForm or SForm code.
vtkSetMacro(QFormCode, int);
int GetQFormCode() { return this->QFormCode; }
vtkSetMacro(SFormCode, int);
int GetSFormCode() { return this->SFormCode; }
-
- // Description:
- // Get information about the quaternion transformation. Note that
- // the vtkNIFTIWriter ignores this part of the header if a quaternion
- // has been set via vtkNIFTIWriter::SetQFormMatrix().
+ //@}
+
+ //@{
+ //! Get information about the quaternion transformation. Note that
+ /*!
+ * Note that the vtkNIFTIWriter ignores this part of the header if a
+ * quaternion has been set via vtkNIFTIWriter::SetQFormMatrix().
+ */
vtkSetMacro(QuaternB, double);
double GetQuaternB() { return this->QuaternB; }
vtkSetMacro(QuaternC, double);
@@ -303,33 +325,39 @@ public:
double GetQOffsetY() { return this->QOffsetY; }
vtkSetMacro(QOffsetZ, double);
double GetQOffsetZ() { return this->QOffsetZ; }
-
- // Description:
- // Get information about the matrix transformation. Note that
- // the vtkNIFTIWriter ignores this part of the header if a matrix
- // has been set via vtkNIFTIWriter::SetSFormMatrix().
+ //@}
+
+ //@{
+ //! Get information about the matrix transformation.
+ /*!
+ * Note that the vtkNIFTIWriter ignores this part of the header if a
+ * matrix has been set via vtkNIFTIWriter::SetSFormMatrix().
+ */
vtkSetVector4Macro(SRowX, double);
vtkGetVector4Macro(SRowX, double);
vtkSetVector4Macro(SRowY, double);
vtkGetVector4Macro(SRowY, double);
vtkSetVector4Macro(SRowZ, double);
vtkGetVector4Macro(SRowZ, double);
+ //@}
- // Description:
- // Initialize the header to default values.
+ //@{
+ //! Initialize the header to default values.
void Initialize();
+ //@}
- // Description:
- // Make a copy of the header.
+ //@{
+ //! Make a copy of the header.
void DeepCopy(vtkNIFTIHeader *o);
+ //@}
- // Description:
- // Set the values from an existing nifti struct, or store
- // the values in an existing nifti struct.
+ //@{
+ //! Set the values from an existing nifti struct, or vice-versa.
void SetHeader(const nifti_1_header *hdr);
void GetHeader(nifti_1_header *hdr);
void SetHeader(const nifti_2_header *hdr);
void GetHeader(nifti_2_header *hdr);
+ //@}
protected:
vtkNIFTIHeader();
@@ -374,8 +402,8 @@ protected:
void SetStringValue(char *x, const char *y, size_t n);
private:
- vtkNIFTIHeader(const vtkNIFTIHeader&); // Not implemented.
- void operator=(const vtkNIFTIHeader&); // Not implemented.
+ vtkNIFTIHeader(const vtkNIFTIHeader&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkNIFTIHeader&) VTK_DELETE_FUNCTION;
};
#endif // vtkNIFTIHeader_h
diff --git a/Source/vtkNIFTIReader.cxx b/Source/vtkNIFTIReader.cxx
index 5224d37..2554e4e 100644
--- a/Source/vtkNIFTIReader.cxx
+++ b/Source/vtkNIFTIReader.cxx
@@ -29,7 +29,11 @@
#include "vtkStringArray.h"
#include "vtkVersion.h"
-#include "vtksys/SystemTools.hxx"
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#endif
+#include "vtkDICOMFile.h"
// Header for NIFTI
#include "vtkNIFTIHeader.h"
@@ -47,19 +51,30 @@
#include <string.h>
#include <string>
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#if VTK_MAJOR_VERSION >= 7
+#ifdef gzopen
+#undef gzopen
+#endif
+#define gzopen gzopen_w
+#endif
+#endif
+
vtkStandardNewMacro(vtkNIFTIReader);
//----------------------------------------------------------------------------
vtkNIFTIReader::vtkNIFTIReader()
{
for (int i = 0; i < 8; i++)
- {
+ {
this->Dim[i] = 0;
- }
+ }
for (int i = 0; i < 8; i++)
- {
+ {
this->PixDim[i] = 1.0;
- }
+ }
this->TimeAsVector = 0;
this->RescaleSlope = 1.0;
this->RescaleIntercept = 0.0;
@@ -74,17 +89,17 @@ vtkNIFTIReader::vtkNIFTIReader()
vtkNIFTIReader::~vtkNIFTIReader()
{
if (this->QFormMatrix)
- {
+ {
this->QFormMatrix->Delete();
- }
+ }
if (this->SFormMatrix)
- {
+ {
this->SFormMatrix->Delete();
- }
+ }
if (this->NIFTIHeader)
- {
+ {
this->NIFTIHeader->Delete();
- }
+ }
}
//----------------------------------------------------------------------------
@@ -119,7 +134,7 @@ void vtkNIFTIReaderSwapHeader(nifti_1_header *hdr)
// All NIFTI-specific (meaning is totally different in Analyze 7.5)
if (strncmp(hdr->magic, "ni1", 4) == 0 ||
strncmp(hdr->magic, "n+1", 4) == 0)
- {
+ {
vtkByteSwap::SwapVoidRange(&hdr->qform_code, 1, 2);
vtkByteSwap::SwapVoidRange(&hdr->sform_code, 1, 2);
vtkByteSwap::SwapVoidRange(&hdr->quatern_b, 1, 4);
@@ -131,7 +146,7 @@ void vtkNIFTIReaderSwapHeader(nifti_1_header *hdr)
vtkByteSwap::SwapVoidRange(hdr->srow_x, 4, 4);
vtkByteSwap::SwapVoidRange(hdr->srow_y, 4, 4);
vtkByteSwap::SwapVoidRange(hdr->srow_z, 4, 4);
- }
+ }
}
void vtkNIFTIReaderSwapHeader(nifti_2_header *hdr)
@@ -175,9 +190,9 @@ void vtkNIFTIReaderSwapHeader(nifti_2_header *hdr)
vtkNIFTIHeader *vtkNIFTIReader::GetNIFTIHeader()
{
if (!this->NIFTIHeader)
- {
+ {
this->NIFTIHeader = vtkNIFTIHeader::New();
- }
+ }
return this->NIFTIHeader;
}
@@ -196,35 +211,35 @@ void vtkNIFTIReader::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "QFormMatrix:";
if (this->QFormMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->QFormMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "SFormMatrix:";
if (this->SFormMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->SFormMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "NIFTIHeader:" << (this->NIFTIHeader ? "\n" : " (none)\n");
os << indent << "PlanarRGB: " << (this->PlanarRGB ? "On\n" : "Off\n");
@@ -235,22 +250,22 @@ bool vtkNIFTIReader::CheckExtension(
const char *filename, const char *ext)
{
if (strlen(ext) == 4 && ext[0] == '.')
- {
+ {
size_t n = strlen(filename);
if (n > 2 && filename[n-3] == '.' &&
tolower(filename[n-2]) == 'g' &&
tolower(filename[n-1]) == 'z')
- {
+ {
n -= 3;
- }
+ }
if (n > 3 && filename[n-4] == '.' &&
tolower(filename[n-3]) == tolower(ext[1]) &&
tolower(filename[n-2]) == tolower(ext[2]) &&
tolower(filename[n-1]) == tolower(ext[3]))
- {
+ {
return true;
- }
}
+ }
return false;
}
@@ -262,7 +277,7 @@ char *vtkNIFTIReader::ReplaceExtension(
if (strlen(ext1) == 4 && ext1[0] == '.' &&
strlen(ext2) == 4 && ext2[0] == '.')
- {
+ {
size_t n = strlen(filename);
size_t m = n;
newname = new char[n+4];
@@ -272,56 +287,57 @@ char *vtkNIFTIReader::ReplaceExtension(
if (n > 2 && filename[n-3] == '.' &&
tolower(filename[n-2]) == 'g' &&
tolower(filename[n-1]) == 'z')
- {
+ {
m = n - 3;
- }
+ }
if (vtkNIFTIReader::CheckExtension(filename, ext1))
- {
+ {
// replace the extension
if (isupper(filename[m-3]))
- {
+ {
newname[m-3] = toupper(ext2[1]);
newname[m-2] = toupper(ext2[2]);
newname[m-1] = toupper(ext2[3]);
- }
+ }
else
- {
+ {
newname[m-3] = tolower(ext2[1]);
newname[m-2] = tolower(ext2[2]);
newname[m-1] = tolower(ext2[3]);
- }
}
+ }
// existence of file
for (int i = 0; i < 2; i++)
+ {
+ int code = vtkDICOMFile::Access(newname, vtkDICOMFile::In);
+ if (code != vtkDICOMFile::FileNotFound)
{
- if (vtksys::SystemTools::FileExists(newname))
- {
return newname;
- }
+ }
if (i == 0)
- {
+ {
if (m < n)
- {
+ {
// try again without the ".gz"
newname[m] = '\0';
n = m;
- }
+ }
else
- {
+ {
// try again with the ".gz"
newname[m] = '.';
newname[m+1] = (isupper(newname[m-3]) ? 'G' : 'g');
newname[m+2] = (isupper(newname[m-3]) ? 'Z' : 'z');
newname[m+3] = '\0';
- }
}
}
+ }
delete [] newname;
newname = 0;
- }
+ }
return newname;
}
@@ -337,26 +353,26 @@ int vtkNIFTIReader::CheckNIFTIVersion(const nifti_1_header *hdr)
(hdr->data_type[1] == '+' || hdr->data_type[1] == 'i') &&
(hdr->data_type[2] >= '2' && hdr->data_type[2] <= '9') &&
hdr->data_type[3] == '\0')
- {
+ {
version = (hdr->data_type[2] - '0');
if (hdr->data_type[4] != '\r' ||
hdr->data_type[5] != '\n' ||
hdr->data_type[6] != '\032' ||
hdr->data_type[7] != '\n')
- {
+ {
// Indicate that file was corrupted by newline conversion
version = -version;
- }
}
+ }
// Check for NIFTIv1
else if (hdr->magic[0] == 'n' &&
(hdr->magic[1] == '+' || hdr->magic[1] == 'i') &&
hdr->magic[2] == '1' &&
hdr->magic[3] == '\0')
- {
+ {
version = 1;
- }
+ }
return version;
}
@@ -366,9 +382,9 @@ bool vtkNIFTIReader::CheckAnalyzeHeader(const nifti_1_header *hdr)
{
if (hdr->sizeof_hdr == 348 || // Analyze 7.5 header size
hdr->sizeof_hdr == 1543569408) // byte-swapped 348
- {
+ {
return true;
- }
+ }
return false;
}
@@ -381,19 +397,33 @@ int vtkNIFTIReader::CanReadFile(const char *filename)
filename, ".img", ".hdr");
if (hdrname == 0)
- {
+ {
return 0;
- }
+ }
+
+#if _WIN32
+ vtkDICOMFilePath fp(hdrname);
+#if VTK_MAJOR_VERSION < 7
+ // convert to the local character set
+ const char *uhdrname = fp.Local();
+#else
+ // use wide character
+ const wchar_t *uhdrname = fp.Wide();
+ fprintf(stderr, "uhdrname\n");
+#endif
+#else
+ const char *uhdrname = hdrname;
+#endif
// try opening file
- gzFile file = gzopen(hdrname, "rb");
+ gzFile file = gzopen(uhdrname, "rb");
delete [] hdrname;
if (!file)
- {
+ {
return 0;
- }
+ }
// read and check the header
bool canRead = false;
@@ -401,19 +431,19 @@ int vtkNIFTIReader::CanReadFile(const char *filename)
int hsize = vtkNIFTIHeader::Nifti1HeaderSize; // nifti_1 header size
int rsize = gzread(file, &hdr, hsize);
if (rsize == hsize)
- {
+ {
int version = vtkNIFTIReader::CheckNIFTIVersion(&hdr);
if (version > 0)
- {
+ {
// NIFTI file
canRead = true;
- }
+ }
else if (version == 0)
- {
+ {
// Analyze 7.5 file
canRead = vtkNIFTIReader::CheckAnalyzeHeader(&hdr);
- }
}
+ }
gzclose(file);
@@ -431,9 +461,9 @@ int vtkNIFTIReader::RequestInformation(
// Create the header object
if (!this->NIFTIHeader)
- {
+ {
this->NIFTIHeader = vtkNIFTIHeader::New();
- }
+ }
// default byte order is native byte order
#ifdef VTK_WORDS_BIGENDIAN
@@ -447,63 +477,80 @@ int vtkNIFTIReader::RequestInformation(
char *hdrname = 0;
if (this->FileNames)
- {
+ {
vtkIdType n = this->FileNames->GetNumberOfValues();
int headers = 0;
for (int i = 0; i < 2; i++)
- {
+ {
filename = this->FileNames->GetValue(i);
// this checks for .hdr and .hdr.gz, case insensitive
if (vtkNIFTIReader::CheckExtension(filename, ".hdr"))
- {
+ {
headers++;
hdrname = new char[strlen(filename) + 1];
strcpy(hdrname, filename);
- }
}
+ }
if (n != 2 || headers != 1)
- {
+ {
vtkErrorMacro("There must be two files and one must be a .hdr file.");
return 0;
- }
}
+ }
else
- {
+ {
filename = this->GetFileName();
- }
+ }
if (filename == 0)
- {
+ {
vtkErrorMacro("A FileName must be provided");
this->SetErrorCode(vtkErrorCode::NoFileNameError);
return 0;
- }
+ }
if (hdrname == 0)
- {
+ {
hdrname = vtkNIFTIReader::ReplaceExtension(
filename, ".img", ".hdr");
- }
+ }
if (hdrname == 0)
- {
+ {
vtkErrorMacro("Unable to locate header for file " << filename);
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
return 0;
- }
+ }
vtkDebugMacro("Opening NIFTI file " << hdrname);
+#if _WIN32
+ vtkDICOMFilePath fph(hdrname);
+#if VTK_MAJOR_VERSION < 7
+ // convert to the local character set
+ const char *uhdrname = fph.Local();
+#else
+ // use wide character
+ const wchar_t *uhdrname = fph.Wide();
+#endif
+#else
+ const char *uhdrname = hdrname;
+#endif
+
// try opening file
- gzFile file = gzopen(hdrname, "rb");
+ gzFile file = 0;
+ if (uhdrname)
+ {
+ file = gzopen(uhdrname, "rb");
+ }
if (!file)
- {
+ {
vtkErrorMacro("Cannot open file " << hdrname);
delete [] hdrname;
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
return 0;
- }
+ }
// read and check the header
bool canRead = false;
@@ -514,10 +561,10 @@ int vtkNIFTIReader::RequestInformation(
const int hsize = vtkNIFTIHeader::Nifti1HeaderSize;
int rsize = gzread(file, hdr1, hsize);
if (rsize == hsize)
- {
+ {
niftiVersion = vtkNIFTIReader::CheckNIFTIVersion(hdr1);
if (niftiVersion >= 2)
- {
+ {
// the header was a NIFTIv2 header
const int h2size = vtkNIFTIHeader::Nifti2HeaderSize;
// copy what was read into the NIFTIv1 header
@@ -525,45 +572,45 @@ int vtkNIFTIReader::RequestInformation(
// read the remainder of the NIFTIv2 header
rsize = gzread(file, reinterpret_cast<char *>(hdr2)+hsize, h2size-hsize);
if (rsize == h2size-hsize)
- {
+ {
canRead = true;
- }
}
+ }
else if (niftiVersion == 1)
- {
+ {
// the header was a NIFTIv1 header
canRead = true;
- }
+ }
else if (niftiVersion == 0)
- {
+ {
// Analyze 7.5 file
canRead = vtkNIFTIReader::CheckAnalyzeHeader(hdr1);
- }
}
+ }
if (canRead)
- {
+ {
if (niftiVersion >= 2)
- {
+ {
if (NIFTI_NEEDS_SWAP(*hdr2))
- {
+ {
vtkNIFTIReaderSwapHeader(hdr2);
isLittleEndian = !isLittleEndian;
- }
- this->NIFTIHeader->SetHeader(hdr2);
}
+ this->NIFTIHeader->SetHeader(hdr2);
+ }
else
- {
+ {
if (NIFTI_NEEDS_SWAP(*hdr1))
- {
+ {
vtkNIFTIReaderSwapHeader(hdr1);
isLittleEndian = !isLittleEndian;
- }
+ }
// convert NIFTIv1 header into NIFTIv2
this->NIFTIHeader->SetHeader(hdr1);
this->NIFTIHeader->GetHeader(hdr2);
- }
}
+ }
gzclose(file);
@@ -572,7 +619,7 @@ int vtkNIFTIReader::RequestInformation(
hdr1 = 0;
if (!canRead)
- {
+ {
const char *message = (niftiVersion <= -2 ?
"NIfTI header has newline corruption " :
"Bad NIfTI header in file ");
@@ -580,72 +627,72 @@ int vtkNIFTIReader::RequestInformation(
this->SetErrorCode(vtkErrorCode::UnrecognizedFileTypeError);
delete [] hdrname;
return 0;
- }
+ }
delete [] hdrname;
// number of dimensions
int ndim = hdr2->dim[0];
if (ndim < 0 || ndim > 7)
- {
+ {
vtkErrorMacro("NIfTI image has illegal ndim of " << ndim);
this->SetErrorCode(vtkErrorCode::FileFormatError);
return 0;
- }
+ }
// sanity checks
for (int i = 0; i < 8; i++)
- {
+ {
// voxel spacing cannot be zero
if (hdr2->pixdim[i] == 0)
- {
+ {
hdr2->pixdim[i] = 1.0;
- }
+ }
if (i > ndim)
- {
+ {
// dimensions greater than ndim have size of 1
hdr2->dim[i] = 1;
- }
+ }
else if (hdr2->dim[i] < 0)
- {
+ {
vtkErrorMacro("NIfTI image dimension " << i << " is negative");
this->SetErrorCode(vtkErrorCode::FileFormatError);
return 0;
- }
+ }
else if ((hdr2->dim[i] & 0x7fffffff) != hdr2->dim[i])
- {
+ {
// dimension does not fit in signed int
vtkErrorMacro("NIfTI image dimension " << i << " is larger than int32");
this->SetErrorCode(vtkErrorCode::FileFormatError);
return 0;
- }
}
+ }
if (niftiVersion > 0)
- {
+ {
// pass rescale info to user (do not rescale in the reader)
this->RescaleSlope = hdr2->scl_slope;
this->RescaleIntercept = hdr2->scl_inter;
- }
+ }
else
- {
+ {
// rescale information not available for Analyze 7.5
this->RescaleSlope = 1.0;
this->RescaleIntercept = 0.0;
- }
+ }
// header might be extended, vox_offset says where data starts
this->SetHeaderSize(static_cast<unsigned long>(hdr2->vox_offset));
// endianness of data
if (isLittleEndian)
- {
+ {
this->SetDataByteOrderToLittleEndian();
- }
+ }
else
- {
+ {
this->SetDataByteOrderToBigEndian();
- }
+ }
// NIFTI images are stored in a single file, not one file per slice
this->SetFileDimensionality(3);
@@ -689,32 +736,32 @@ int vtkNIFTIReader::RequestInformation(
int numComponents = 0;
for (int i = 0; typeMap[2] != 0; i++)
- {
+ {
if (hdr2->datatype == typeMap[i][0])
- {
+ {
scalarType = typeMap[i][1];
numComponents = typeMap[i][2];
break;
- }
}
+ }
// if loop finished without finding a match
if (numComponents == 0)
- {
+ {
vtkErrorMacro("Unrecognized NIFTI data type: " << hdr2->datatype);
this->SetErrorCode(vtkErrorCode::FileFormatError);
return 0;
- }
+ }
// vector planes become vector components
if (ndim >= 5)
- {
+ {
numComponents *= hdr2->dim[5];
- }
+ }
if (ndim >= 4 && this->TimeAsVector)
- {
+ {
numComponents *= hdr2->dim[4];
- }
+ }
this->SetDataScalarType(scalarType);
this->SetNumberOfScalarComponents(numComponents);
@@ -732,10 +779,10 @@ int vtkNIFTIReader::RequestInformation(
// copy dim for when RequestData is called
for (int j = 0; j < 8; j++)
- {
+ {
this->Dim[j] = hdr2->dim[j];
this->PixDim[j] = hdr2->pixdim[j];
- }
+ }
// === Image Orientation in NIfTI files ===
//
@@ -895,20 +942,20 @@ int vtkNIFTIReader::RequestInformation(
// Initialize
this->QFac = 1.0;
if (this->QFormMatrix)
- {
+ {
this->QFormMatrix->Delete();
this->QFormMatrix = NULL;
- }
+ }
if (this->SFormMatrix)
- {
+ {
this->SFormMatrix->Delete();
this->SFormMatrix = NULL;
- }
+ }
// Set the QFormMatrix from the quaternion data in the header.
// See the long discussion above for more information.
if (niftiVersion > 0 && hdr2->qform_code > 0)
- {
+ {
double mmat[16];
double rmat[3][3];
double quat[4];
@@ -919,13 +966,13 @@ int vtkNIFTIReader::RequestInformation(
quat[0] = 1.0 - quat[1]*quat[1] - quat[2]*quat[2] - quat[3]*quat[3];
if (quat[0] > 0.0)
- {
+ {
quat[0] = sqrt(quat[0]);
- }
+ }
else
- {
+ {
quat[0] = 0.0;
- }
+ }
vtkMath::QuaternionToMatrix3x3(quat, rmat);
@@ -934,16 +981,16 @@ int vtkNIFTIReader::RequestInformation(
// quaternion-to-matrix conversion.
const double tol = 2.384185791015625e-07; // 2**-22
for (int i = 0; i < 3; i++)
- {
+ {
for (int j = 0; j < 3; j++)
- {
+ {
if (fabs(rmat[i][j]) < tol)
- {
+ {
rmat[i][j] = 0.0;
- }
}
- vtkMath::Normalize(rmat[i]);
}
+ vtkMath::Normalize(rmat[i]);
+ }
// first row
mmat[0] = rmat[0][0];
@@ -971,23 +1018,23 @@ int vtkNIFTIReader::RequestInformation(
this->QFac = ((hdr2->pixdim[0] < 0) ? -1.0 : 1.0);
if (this->QFac < 0)
- {
+ {
// We will be reversing the order of the slices, so the first VTK
// slice will be at the position of the last NIfTI slice, and we
// must adjust the offset to compensate for this.
mmat[3] -= rmat[0][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
mmat[7] -= rmat[1][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
mmat[11] -= rmat[2][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
- }
+ }
this->QFormMatrix = vtkMatrix4x4::New();
this->QFormMatrix->DeepCopy(mmat);
- }
+ }
// Set the SFormMatrix from the matrix information in the header.
// See the long discussion above for more information.
if (niftiVersion > 0 && hdr2->sform_code > 0)
- {
+ {
double mmat[16];
// first row
@@ -1016,12 +1063,12 @@ int vtkNIFTIReader::RequestInformation(
// Set QFac to -1 if the determinant is negative, unless QFac
// has already been set by the qform information.
if (vtkMatrix4x4::Determinant(mmat) < 0 && hdr2->qform_code == 0)
- {
+ {
this->QFac = -1.0;
- }
+ }
if (this->QFac < 0)
- {
+ {
// If QFac is set to -1 then the slices will be reversed, and we must
// reverse the slice orientation vector (the third column of the matrix)
// to compensate.
@@ -1035,16 +1082,16 @@ int vtkNIFTIReader::RequestInformation(
mmat[3] += hdr2->srow_x[2]*(hdr2->dim[3] - 1);
mmat[7] += hdr2->srow_y[2]*(hdr2->dim[3] - 1);
mmat[11] += hdr2->srow_z[2]*(hdr2->dim[3] - 1);
- }
+ }
this->SFormMatrix = vtkMatrix4x4::New();
this->SFormMatrix->DeepCopy(mmat);
if (this->SFormMatrix->Determinant() < 0)
- {
+ {
vtkWarningMacro("SFormMatrix is flipped compared to QFormMatrix");
- }
}
+ }
return 1;
}
@@ -1057,9 +1104,9 @@ int vtkNIFTIReader::RequestData(
{
// check whether the reader is in an error state
if (this->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
return 0;
- }
+ }
// which output port did the request come from
int outputPort =
@@ -1067,9 +1114,9 @@ int vtkNIFTIReader::RequestData(
// for now, this reader has only one output
if (outputPort > 0)
- {
+ {
return 1;
- }
+ }
vtkInformation* outInfo = outputVector->GetInformationObject(0);
@@ -1091,50 +1138,50 @@ int vtkNIFTIReader::RequestData(
char *imgname = 0;
if (this->FileNames)
- {
+ {
vtkIdType n = this->FileNames->GetNumberOfValues();
int headers = 0;
for (int i = 0; i < 2; i++)
- {
+ {
filename = this->FileNames->GetValue(i);
// this checks for .hdr and .hdr.gz, case insensitive
if (vtkNIFTIReader::CheckExtension(filename, ".hdr"))
- {
+ {
headers++;
- }
+ }
else
- {
+ {
imgname = new char[strlen(filename) + 1];
strcpy(imgname, filename);
- }
}
+ }
if (n != 2 || headers != 1)
- {
+ {
vtkErrorMacro("There must be two files and one must be a .hdr file.");
return 0;
- }
}
+ }
else
- {
+ {
filename = this->GetFileName();
- }
+ }
if (filename == 0)
- {
+ {
vtkErrorMacro("A FileName must be provided");
return 0;
- }
+ }
if (imgname == 0)
- {
+ {
imgname = vtkNIFTIReader::ReplaceExtension(filename, ".hdr", ".img");
- }
+ }
if (imgname == 0)
- {
+ {
vtkErrorMacro("Unable to locate image for file " << filename);
return 0;
- }
+ }
vtkDebugMacro("Opening NIFTI file " << imgname);
@@ -1143,14 +1190,32 @@ int vtkNIFTIReader::RequestData(
unsigned char *dataPtr =
static_cast<unsigned char *>(data->GetScalarPointer());
- gzFile file = gzopen(imgname, "rb");
+#if _WIN32
+ vtkDICOMFilePath fpi(imgname);
+#if VTK_MAJOR_VERSION < 7
+ // convert to the local character set
+ const char *uimgname = fpi.Local();
+#else
+ // use wide character
+ const wchar_t *uimgname = fpi.Wide();
+ fprintf(stderr, "uhdrname\n");
+#endif
+#else
+ const char *uimgname = imgname;
+#endif
+
+ gzFile file = 0;
+ if (uimgname)
+ {
+ file = gzopen(uimgname, "rb");
+ }
delete [] imgname;
if (!file)
- {
+ {
return 0;
- }
+ }
// check if planar RGB is applicable (Analyze only)
bool planarRGB = (this->PlanarRGB &&
@@ -1163,9 +1228,9 @@ int vtkNIFTIReader::RequestData(
int timeDim = (this->Dim[0] >= 4 ? this->Dim[4] : 1);
int vectorDim = (this->Dim[0] >= 5 ? this->Dim[5] : 1);
if (this->TimeAsVector)
- {
+ {
vectorDim *= timeDim;
- }
+ }
int outSizeX = extent[1] - extent[0] + 1;
int outSizeY = extent[3] - extent[2] + 1;
@@ -1178,50 +1243,50 @@ int vtkNIFTIReader::RequestData(
z_off_t fileTimeIncr = fileSliceIncr*this->Dim[3];
z_off_t fileVectorIncr = fileTimeIncr*this->Dim[4];
if (this->TimeAsVector)
- {
+ {
fileVectorIncr = fileTimeIncr;
- }
+ }
// planar RGB requires different increments
int planarSize = 1; // if > 1, indicates planar RGB
if (planarRGB)
- {
+ {
planarSize = numComponents/vectorDim;
fileVoxelIncr = scalarSize;
fileRowIncr = fileVoxelIncr*this->Dim[1];
filePlaneIncr = fileRowIncr*this->Dim[2];
- }
+ }
// add a buffer for planar-vector to packed-vector conversion
unsigned char *rowBuffer = 0;
if (vectorDim > 1 || planarRGB)
- {
+ {
rowBuffer = new unsigned char[outSizeX*fileVoxelIncr];
- }
+ }
// special increment to reverse the slices if needed
vtkIdType sliceOffset = 0;
if (this->GetQFac() < 0)
- {
+ {
// put slices in reverse order
sliceOffset = scalarSize*numComponents;
sliceOffset *= outSizeX;
sliceOffset *= outSizeY;
dataPtr += sliceOffset*(outSizeZ - 1);
- }
+ }
// special increment to handle planar RGB
vtkIdType planarOffset = 0;
vtkIdType planarEndOffset = 0;
if (planarRGB)
- {
+ {
planarOffset = scalarSize*numComponents;
planarOffset *= outSizeX;
planarOffset *= outSizeY;
planarOffset -= scalarSize;
planarEndOffset = planarOffset - scalarSize*(planarSize - 1);
- }
+ }
// report progress every 2% of the way to completion
this->InvokeEvent(vtkCommand::StartEvent);
@@ -1249,130 +1314,130 @@ int vtkNIFTIReader::RequestData(
int errorCode = 0;
while (!this->AbortExecute)
- {
+ {
if (offset)
- {
+ {
int rval = gzseek(file, offset, SEEK_CUR);
if (rval == -1)
- {
+ {
errorCode = vtkErrorCode::FileFormatError;
if (gzeof(file))
- {
+ {
errorCode = vtkErrorCode::PrematureEndOfFileError;
- }
- break;
}
+ break;
}
+ }
if (vectorDim == 1 && !planarRGB)
- {
+ {
// read directly into the output instead of into a buffer
rowBuffer = ptr;
- }
+ }
int code = gzread(file, rowBuffer, rowSize*scalarSize);
if (code != rowSize*scalarSize)
- {
+ {
errorCode = vtkErrorCode::FileFormatError;
if (gzeof(file))
- {
+ {
errorCode = vtkErrorCode::PrematureEndOfFileError;
- }
- break;
}
+ break;
+ }
if (swapBytes != 0 && scalarSize > 1)
- {
+ {
vtkByteSwap::SwapVoidRange(rowBuffer, rowSize, scalarSize);
- }
+ }
if (vectorDim == 1 && !planarRGB)
- {
+ {
// advance the pointer to the next row
ptr += outSizeX*numComponents*scalarSize;
rowBuffer = 0;
- }
+ }
else
- {
+ {
// write vector plane to packed vector component
unsigned char *tmpPtr = rowBuffer;
z_off_t skipOther = scalarSize*numComponents - fileVoxelIncr;
for (int i = 0; i < outSizeX; i++)
- {
+ {
// write one vector component of one voxel
z_off_t n = fileVoxelIncr;
do { *ptr++ = *tmpPtr++; } while (--n);
// skip past the other components
ptr += skipOther;
- }
}
+ }
if (++count % target == 0)
- {
+ {
this->UpdateProgress(0.02*count/target);
- }
+ }
// offset to skip unread sections of the file, for when
// the update extent is less than the whole extent
offset = fileRowIncr - outSizeX*fileVoxelIncr;
if (++j == outSizeY)
- {
+ {
j = 0;
offset += filePlaneIncr - outSizeY*fileRowIncr;
// back up for next plane (R, G, or B) if planar mode
ptr -= planarOffset;
if (++p == planarSize)
- {
+ {
p = 0;
ptr += planarEndOffset; // advance to start of next slice
ptr -= 2*sliceOffset; // for reverse slice order
if (++k == outSizeZ)
- {
+ {
k = 0;
offset += fileVectorIncr - outSizeZ*fileSliceIncr;
if (++t == timeDim)
- {
+ {
t = 0;
- }
+ }
if (++c == vectorDim)
- {
+ {
break;
- }
+ }
// back up the ptr to the beginning of the image,
// then increment to the next vector component
ptr = dataPtr + c*fileVoxelIncr*planarSize;
if (this->TimeAsVector)
- {
+ {
// if timeDim is included in the vectorDim (and hence in the
// VTK scalar components) then we have to make sure that
// the vector components are packed before the time steps
ptr = dataPtr + (c + t*(vectorDim - 1))/timeDim*
fileVoxelIncr*planarSize;
- }
}
}
}
}
+ }
if (vectorDim > 1 || planarRGB)
- {
+ {
delete [] rowBuffer;
- }
+ }
gzclose(file);
if (errorCode)
- {
+ {
const char *errorText = "Error in NIFTI file, cannot read.";
if (errorCode == vtkErrorCode::PrematureEndOfFileError)
- {
+ {
errorText = "NIFTI file is truncated, some data is missing.";
- }
+ }
this->SetErrorCode(errorCode);
vtkErrorMacro(<< errorText);
return 0;
- }
+ }
this->UpdateProgress(1.0);
this->InvokeEvent(vtkCommand::EndEvent);
diff --git a/Source/vtkNIFTIReader.h b/Source/vtkNIFTIReader.h
index 3a5302e..1183610 100644
--- a/Source/vtkNIFTIReader.h
+++ b/Source/vtkNIFTIReader.h
@@ -12,22 +12,24 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkNIFTIReader - Read NIfTI-1 and NIfTI-2 medical image files
-// .SECTION Description
-// This class reads NIFTI files, either in .nii format or as separate
-// .img and .hdr files. If two files are used, then they can be passed
-// by using SetFileNames() instead of SetFileName(). Files ending in .gz
-// are decompressed on-the-fly while they are being read. Files with
-// complex numbers or vector dimensions will be read as multi-component
-// images. If a NIFTI file has a time dimension, then by default only the
-// first image in the time series will be read, but the TimeAsVector
-// flag can be set to read the time steps as vector components. Files in
-// Analyze 7.5 format are also supported by this reader.
-// .SECTION Thanks
-// This class was contributed to VTK by the Calgary Image Processing and
-// Analysis Centre (CIPAC).
-// .SECTION See Also
-// vtkNIFTIWriter, vtkNIFTIHeader
+/*! \class vtkNIFTIReader
+ * \brief Read NIfTI-1 and NIfTI-2 medical image files
+ *
+ * This class reads NIFTI files, either in .nii format or as separate
+ * .img and .hdr files. If two files are used, then they can be passed
+ * by using SetFileNames() instead of SetFileName(). Files ending in .gz
+ * are decompressed on-the-fly while they are being read. Files with
+ * complex numbers or vector dimensions will be read as multi-component
+ * images. If a NIFTI file has a time dimension, then by default only the
+ * first image in the time series will be read, but the TimeAsVector
+ * flag can be set to read the time steps as vector components. Files in
+ * Analyze 7.5 format are also supported by this reader.
+ *
+ * This class was contributed to VTK by the Calgary Image Processing and
+ * Analysis Centre (CIPAC).
+ *
+ * \sa vtkNIFTIWriter, vtkNIFTIHeader
+ */
#ifndef vtkNIFTIReader_h
#define vtkNIFTIReader_h
@@ -44,183 +46,188 @@ struct nifti_1_header;
class VTKDICOM_EXPORT vtkNIFTIReader : public vtkImageReader2
{
public:
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkNIFTIReader *New();
vtkTypeMacro(vtkNIFTIReader, vtkImageReader2);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Valid extensions for this file type.
+ //@{
+ //! Valid extensions for this file type.
virtual const char* GetFileExtensions() {
return ".nii .nii.gz .img .img.gz .hdr .hdr.gz"; }
- // Description:
- // Return a descriptive name that might be useful in a GUI.
+ //! Return a descriptive name that might be useful in a GUI.
virtual const char* GetDescriptiveName() {
return "NIfTI"; }
- // Description:
- // Return true if this reader can read the given file.
+ //! Return true if this reader can read the given file.
int CanReadFile(const char* filename);
-
- // Description:
- // Read the time dimension as scalar components (default: Off).
- // If this is on, then each time point will be stored as a component in
- // the image data. If the file has both a time dimension and a vector
- // dimension, then the number of components will be the product of these
- // two dimensions, i.e. the components will store a sequence of vectors.
+ //@}
+
+ //@{
+ //! Read the time dimension as scalar components (default: Off).
+ /*!
+ * If this is on, then each time point will be stored as a component in
+ * the image data. If the file has both a time dimension and a vector
+ * dimension, then the number of components will be the product of these
+ * two dimensions, i.e. the components will store a sequence of vectors.
+ */
vtkGetMacro(TimeAsVector, int);
vtkSetMacro(TimeAsVector, int);
vtkBooleanMacro(TimeAsVector, int);
+ //@}
- // Description:
- // Get the time dimension that was stored in the NIFTI header.
+ //@{
+ //! Get the time dimension that was stored in the NIFTI header.
int GetTimeDimension() { return this->Dim[4]; }
double GetTimeSpacing() { return this->PixDim[4]; }
-
- // Description:
- // Get the slope and intercept for rescaling the scalar values.
- // These values allow calibration of the data to real values.
- // Use the equation v = u*RescaleSlope + RescaleIntercept.
- // This directly returns the values stored in the scl_slope and
- // scl_inter fields in the NIFTI header.
+ //@}
+
+ //@{
+ //! Get the slope and intercept for rescaling the scalar values.
+ /*!
+ * These values allow calibration of the data to real values.
+ * Use the equation v = u*RescaleSlope + RescaleIntercept.
+ * This directly returns the values stored in the scl_slope and
+ * scl_inter fields in the NIFTI header.
+ */
double GetRescaleSlope() { return this->RescaleSlope; }
double GetRescaleIntercept() { return this->RescaleIntercept; }
-
- // Description:
- // Read planar RGB (separate R, G, and B planes), rather than packed RGB.
- // The NIFTI format should always use packed RGB. The Analyze format,
- // however, was used to store both planar RGB and packed RGB depending
- // on the software, without any indication in the header about which
- // convention was being used. Use this if you have a planar RGB file.
+ //@}
+
+ //@{
+ //! Read planar RGB (separate R, G, and B planes), rather than packed RGB.
+ /*!
+ * The NIFTI format should always use packed RGB. The Analyze format,
+ * however, was used to store both planar RGB and packed RGB depending
+ * on the software, without any indication in the header about which
+ * convention was being used. Use this if you have a planar RGB file.
+ */
vtkGetMacro(PlanarRGB, bool);
vtkSetMacro(PlanarRGB, bool);
vtkBooleanMacro(PlanarRGB, bool);
-
- // Description:
- // QFac gives the slice order in the NIFTI file versus the VTK image.
- // If QFac is -1, then the VTK slice index J is related to the NIFTI
- // slice index j by the equation J = (num_slices - j - 1). VTK requires
- // the slices to be ordered so that the voxel indices (I,J,K) provide a
- // right-handed coordinate system, whereas NIFTI does not. Instead,
- // NIFTI stores a factor called "qfac" in the header to signal when the
- // (i,j,k) indices form a left-handed coordinate system. QFac will only
- // ever have values of +1 or -1.
+ //@}
+
+ //@{
+ //! QFac gives the slice order in the NIFTI file versus the VTK image.
+ /*!
+ * If QFac is -1, then the VTK slice index J is related to the NIFTI
+ * slice index j by the equation J = (num_slices - j - 1). VTK requires
+ * the slices to be ordered so that the voxel indices (I,J,K) provide a
+ * right-handed coordinate system, whereas NIFTI does not. Instead,
+ * NIFTI stores a factor called "qfac" in the header to signal when the
+ * (i,j,k) indices form a left-handed coordinate system. QFac will only
+ * ever have values of +1 or -1.
+ */
double GetQFac() { return this->QFac; }
-
- // Description:
- // Get a matrix that gives the "qform" orientation and offset for the data.
- // If no qform matrix was stored in the file, the return value is NULL.
- // This matrix will transform VTK data coordinates into the NIFTI oriented
- // data coordinates, where +X points right, +Y points anterior (toward the
- // front), and +Z points superior (toward the head). The qform matrix will
- // always have a positive determinant. The offset that is stored in the
- // matrix gives the position of the first pixel in the first slice of the
- // VTK image data. Note that if QFac is -1, then the first slice in the
- // VTK image data is the last slice in the NIFTI file, and the Z offset
- // will automatically be adjusted to compensate for this.
+ //@}
+
+ //@{
+ //! Get a matrix that gives the "qform" orientation and offset for the data.
+ /*!
+ * If no qform matrix was stored in the file, the return value is NULL.
+ * This matrix will transform VTK data coordinates into the NIFTI oriented
+ * data coordinates, where +X points right, +Y points anterior (toward the
+ * front), and +Z points superior (toward the head). The qform matrix will
+ * always have a positive determinant. The offset that is stored in the
+ * matrix gives the position of the first pixel in the first slice of the
+ * VTK image data. Note that if QFac is -1, then the first slice in the
+ * VTK image data is the last slice in the NIFTI file, and the Z offset
+ * will automatically be adjusted to compensate for this.
+ */
vtkMatrix4x4 *GetQFormMatrix() { return this->QFormMatrix; }
- // Description:
- // Get a matrix that gives the "sform" orientation and offset for the data.
- // If no sform matrix was stored in the file, the return value is NULL.
- // Like the qform matrix, this matrix will transform VTK data coordinates
- // into a NIFTI coordinate system. Unlike the qform matrix, the sform
- // matrix can contain scaling information and can even (rarely) have
- // a negative determinant, i.e. a flip. This matrix is modified slightly
- // as compared to the sform matrix stored in the NIFTI header: the pixdim
- // pixel spacing is factored out. Also, if QFac is -1, then the VTK slices
- // are in reverse order as compared to the NIFTI slices, hence as compared
- // to the sform matrix stored in the header, the third column of this matrix
- // is multiplied by -1 and the Z offset is shifted to compensate for the
- // fact that the last slice has become the first.
+ //! Get a matrix that gives the "sform" orientation and offset for the data.
+ /*!
+ * If no sform matrix was stored in the file, the return value is NULL.
+ * Like the qform matrix, this matrix will transform VTK data coordinates
+ * into a NIFTI coordinate system. Unlike the qform matrix, the sform
+ * matrix can contain scaling information and can even (rarely) have
+ * a negative determinant, i.e. a flip. This matrix is modified slightly
+ * as compared to the sform matrix stored in the NIFTI header: the pixdim
+ * pixel spacing is factored out. Also, if QFac is -1, then the VTK slices
+ * are in reverse order as compared to the NIFTI slices, hence as compared
+ * to the sform matrix stored in the header, the third column of this matrix
+ * is multiplied by -1 and the Z offset is shifted to compensate for the
+ * fact that the last slice has become the first.
+ */
vtkMatrix4x4 *GetSFormMatrix() { return this->SFormMatrix; }
+ //@}
- // Description:
- // Get the raw header information from the NIfTI file.
+ //@{
+ //! Get the raw header information from the NIfTI file.
vtkNIFTIHeader *GetNIFTIHeader();
+ //@}
protected:
vtkNIFTIReader();
~vtkNIFTIReader();
- // Description:
- // Read the header information.
+ //! Read the header information.
virtual int RequestInformation(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // Read the voxel data.
+ //! Read the voxel data.
virtual int RequestData(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // Doe a case-insensitive check for the given extension.
- // The check will succeed if the filename ends in ".gz", and if the
- // extension matches after removing the ".gz".
+ //! Doe a case-insensitive check for the given extension.
+ /*!
+ * The check will succeed if the filename ends in ".gz", and if the
+ * extension matches after removing the ".gz".
+ */
static bool CheckExtension(const char *fname, const char *ext);
- // Description:
- // Make a new filename by replacing extension "ext1" with "ext2".
- // The extensions must include a period, must be three characters
- // long, and must be lower case. This method also verifies that
- // the file exists, and adds or subtracts a ".gz" as necessary
- // If the file exists, a new string is returned that must be
- // deleted by the caller. Otherwise, the return value is NULL.
+ //! Make a new filename by replacing extension "ext1" with "ext2".
+ /*!
+ * The extensions must include a period, must be three characters
+ * long, and must be lower case. This method also verifies that
+ * the file exists, and adds or subtracts a ".gz" as necessary
+ * If the file exists, a new string is returned that must be
+ * deleted by the caller. Otherwise, the return value is NULL.
+ */
static char *ReplaceExtension(
const char *fname, const char *ext1, const char *ext2);
- // Description:
- // Check the version of the header.
+ //! Check the version of the header.
static int CheckNIFTIVersion(const nifti_1_header *hdr);
- // Description:
- // Check for Analyze 7.5 header.
+ //! Check for Analyze 7.5 header.
static bool CheckAnalyzeHeader(const nifti_1_header *hdr);
- // Description:
- // Read the time dimension as if it was a vector dimension.
+ //! Read the time dimension as if it was a vector dimension.
int TimeAsVector;
- // Description:
- // Information for rescaling data to quantitative units.
+ //! Information for rescaling data to quantitative units.
double RescaleIntercept;
double RescaleSlope;
- // Description:
- // Set to -1 when VTK slice order is opposite to NIFTI slice order.
+ //! Set to -1 when VTK slice order is opposite to NIFTI slice order.
double QFac;
- // Description:
- // The orientation matrices for the NIFTI file.
+ //! The orientation matrices for the NIFTI file.
vtkMatrix4x4 *QFormMatrix;
vtkMatrix4x4 *SFormMatrix;
- // Description:
- // The dimensions of the NIFTI file.
+ //! The dimensions of the NIFTI file.
int Dim[8];
- // Description:
- // The spacings in the NIFTI file.
+ //! The spacings in the NIFTI file.
double PixDim[8];
- // Description:
- // A copy of the header from the file that was most recently read.
+ //! A copy of the header from the file that was most recently read.
vtkNIFTIHeader *NIFTIHeader;
- // Description:
- // Use planar RGB instead of the default (packed).
+ //! Use planar RGB instead of the default (packed).
bool PlanarRGB;
private:
- vtkNIFTIReader(const vtkNIFTIReader&); // Not implemented.
- void operator=(const vtkNIFTIReader&); // Not implemented.
+ vtkNIFTIReader(const vtkNIFTIReader&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkNIFTIReader&) VTK_DELETE_FUNCTION;
};
#endif // vtkNIFTIReader_h
diff --git a/Source/vtkNIFTIWriter.cxx b/Source/vtkNIFTIWriter.cxx
index 0ccd9dd..88e5e44 100644
--- a/Source/vtkNIFTIWriter.cxx
+++ b/Source/vtkNIFTIWriter.cxx
@@ -28,7 +28,8 @@
#include "vtkCommand.h"
#include "vtkVersion.h"
-#include "vtksys/SystemTools.hxx"
+// For removing file if write failed
+#include "vtkDICOMFile.h"
// Header for NIFTI
#include "vtkNIFTIHeader.h"
@@ -47,6 +48,23 @@
#include <float.h>
#include <math.h>
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#if VTK_MAJOR_VERSION >= 7
+#ifdef gzopen
+#undef gzopen
+#endif
+#define gzopen gzopen_w
+#define fopen _wfopen
+#define NIFTI_FILE_MODE L"wb"
+#else
+#define NIFTI_FILE_MODE "wb"
+#endif
+#else
+#define NIFTI_FILE_MODE "wb"
+#endif
+
vtkStandardNewMacro(vtkNIFTIWriter);
vtkCxxSetObjectMacro(vtkNIFTIWriter,QFormMatrix,vtkMatrix4x4);
vtkCxxSetObjectMacro(vtkNIFTIWriter,SFormMatrix,vtkMatrix4x4);
@@ -68,10 +86,7 @@ vtkNIFTIWriter::vtkNIFTIWriter()
this->OwnHeader = 0;
this->NIFTIHeader = 0;
this->NIFTIVersion = 0;
- this->Description = new char[80];
- // Default description is "VTKX.Y.Z"
- strncpy(this->Description, "VTK", 3);
- strncpy(&this->Description[3], vtkVersion::GetVTKVersion(), 77);
+ this->Description = 0;
// Planar RGB (NIFTI doesn't allow this, it's here for Analyze)
this->PlanarRGB = false;
}
@@ -80,21 +95,21 @@ vtkNIFTIWriter::vtkNIFTIWriter()
vtkNIFTIWriter::~vtkNIFTIWriter()
{
if (this->QFormMatrix)
- {
+ {
this->QFormMatrix->Delete();
- }
+ }
if (this->SFormMatrix)
- {
+ {
this->SFormMatrix->Delete();
- }
+ }
if (this->OwnHeader)
- {
+ {
this->OwnHeader->Delete();
- }
+ }
if (this->NIFTIHeader)
- {
+ {
this->NIFTIHeader->Delete();
- }
+ }
delete [] this->Description;
}
@@ -102,9 +117,9 @@ vtkNIFTIWriter::~vtkNIFTIWriter()
vtkNIFTIHeader *vtkNIFTIWriter::GetNIFTIHeader()
{
if (!this->NIFTIHeader)
- {
+ {
this->NIFTIHeader = vtkNIFTIHeader::New();
- }
+ }
return this->NIFTIHeader;
}
@@ -113,7 +128,8 @@ void vtkNIFTIWriter::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os, indent);
- os << indent << "Description: " << this->Description << "\n";
+ os << indent << "Description: "
+ << (this->Description ? this->Description : "(NULL)") << "\n";
os << indent << "TimeDimension: " << this->TimeDimension << "\n";
os << indent << "TimeSpacing: " << this->TimeSpacing << "\n";
os << indent << "RescaleSlope: " << this->RescaleSlope << "\n";
@@ -122,35 +138,35 @@ void vtkNIFTIWriter::PrintSelf(ostream& os, vtkIndent indent)
os << indent << "QFormMatrix:";
if (this->QFormMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->QFormMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "SFormMatrix:";
if (this->SFormMatrix)
- {
+ {
double mat[16];
vtkMatrix4x4::DeepCopy(mat, this->SFormMatrix);
for (int i = 0; i < 16; i++)
- {
+ {
os << " " << mat[i];
- }
- os << "\n";
}
+ os << "\n";
+ }
else
- {
+ {
os << " (none)\n";
- }
+ }
os << indent << "NIFTIHeader:" << (this->NIFTIHeader ? "\n" : " (none)\n");
os << indent << "NIFTIVersion: " << this->NIFTIVersion << "\n";
@@ -169,27 +185,27 @@ char *vtkNIFTIWriter::ReplaceExtension(
if (n > 2 && filename[n-3] == '.' &&
tolower(filename[n-2]) == 'g' &&
tolower(filename[n-1]) == 'z')
- {
+ {
m -= 3;
- }
+ }
if (m > 3 && filename[m-4] == '.' &&
tolower(filename[m-3]) == tolower(ext1[1]) &&
tolower(filename[m-2]) == tolower(ext1[2]) &&
tolower(filename[m-1]) == tolower(ext1[3]))
- {
+ {
if (isupper(filename[m-3]))
- {
+ {
newname[m-3] = toupper(ext2[1]);
newname[m-2] = toupper(ext2[2]);
newname[m-1] = toupper(ext2[3]);
- }
+ }
else
- {
+ {
newname[m-3] = tolower(ext2[1]);
newname[m-2] = tolower(ext2[2]);
newname[m-1] = tolower(ext2[3]);
- }
}
+ }
return newname;
}
@@ -272,14 +288,14 @@ void vtkNIFTIWriterSetInformation(
short databits = 0;
for (int i = 0; typeMap[2] != 0; i++)
- {
+ {
if (scalarType == typeMap[i][0])
- {
+ {
datatype = typeMap[i][1];
databits = typeMap[i][2];
break;
- }
}
+ }
// number of spatial dimensions
int spaceDim = (extent[4] == extent[5] ? 2 : 3);
@@ -325,22 +341,22 @@ void vtkNIFTIWriterSetQForm(
double quat[4];
vtkMath::Matrix3x3ToQuaternion(rmat, quat);
if (quat[0] < 0)
- {
+ {
quat[0] = -quat[0];
quat[1] = -quat[1];
quat[2] = -quat[2];
quat[3] = -quat[3];
- }
+ }
if (qfac < 0)
- {
+ {
// We will be reversing the order of the slices, so the first VTK
// slice will be at the position of the last NIfTI slice, and we
// must adjust the offset to compensate for this.
mmat[3] += rmat[0][2]*hdr->pixdim[3]*(hdr->dim[3] - 1);
mmat[7] += rmat[1][2]*hdr->pixdim[3]*(hdr->dim[3] - 1);
mmat[11] += rmat[2][2]*hdr->pixdim[3]*(hdr->dim[3] - 1);
- }
+ }
hdr->pixdim[0] = qfac;
hdr->quatern_b = quat[1];
@@ -356,7 +372,7 @@ void vtkNIFTIWriterSetSForm(
nifti_2_header *hdr, double mmat[16], double qfac)
{
if (qfac < 0)
- {
+ {
// If QFac is set to -1 (which only occurs if qform_code was set)
// then the slices will be reversed, and we must reverse the slice
// orientation vector (the third column of the matrix) to compensate.
@@ -370,7 +386,7 @@ void vtkNIFTIWriterSetSForm(
mmat[2] = -mmat[2];
mmat[6] = -mmat[6];
mmat[10] = -mmat[10];
- }
+ }
// first row
hdr->srow_x[0] = mmat[0] * hdr->pixdim[1];
@@ -402,14 +418,14 @@ void vtkNIFTIWriterMatrix(
offset[3] = 1.0;
if (matrix)
- {
+ {
matrix->MultiplyPoint(offset, offset);
vtkMatrix4x4::DeepCopy(mmat, matrix);
- }
+ }
else
- {
+ {
vtkMatrix4x4::Identity(mmat);
- }
+ }
mmat[3] = offset[0];
mmat[7] = offset[1];
@@ -425,50 +441,50 @@ int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile)
nifti_2_header hdr;
int version = 0;
if (this->OwnHeader == 0)
- {
+ {
this->OwnHeader = vtkNIFTIHeader::New();
- }
+ }
else
- {
+ {
this->OwnHeader->Initialize();
- }
+ }
if (this->NIFTIHeader)
- {
+ {
// use the header supplied by SetNIFTIHeader()
this->NIFTIHeader->GetHeader(&hdr);
version = hdr.magic[2] - '0';
if (version > 2)
- {
+ {
version = 2;
- }
}
+ }
else
- {
+ {
// start with a blank header
this->OwnHeader->GetHeader(&hdr);
hdr.scl_slope = 1.0;
- }
+ }
// copy the image information into the header
vtkNIFTIWriterSetInformation(&hdr, info);
if (hdr.datatype == 0)
- {
+ {
vtkErrorMacro("Illegal data type for NIFTI file.");
return 0;
- }
+ }
// override the version if set via SetNIFTIVersion
if (this->NIFTIVersion != 0)
- {
+ {
version = this->NIFTIVersion;
- }
+ }
// set the rescale slope/intercept if not (0.0,0.0)
if (this->RescaleSlope != 0.0 || this->RescaleIntercept != 0.0)
- {
+ {
hdr.scl_slope = this->RescaleSlope;
hdr.scl_inter = this->RescaleIntercept;
- }
+ }
// set the header size
hdr.sizeof_hdr = (version == 2 ?
@@ -477,26 +493,27 @@ int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile)
// modify magic number and voxel offset for .img files
if (!singleFile)
- {
+ {
strncpy(hdr.magic, (version == 2 ? "ni2" : "ni1"), 4);
hdr.vox_offset = 0;
- }
+ }
else
- {
+ {
strncpy(hdr.magic, (version == 2 ? "n+2" : "n+1"), 4);
hdr.vox_offset = (version == 2 ? 544 : 352);
- }
+ }
if (version == 2)
- {
+ {
// version 2 has four bytes for newline transfer checks
strncpy(&hdr.magic[4], "\r\n\032\n", 4);
- }
+ }
// set the description
if (this->Description)
- {
- strncpy(hdr.descrip, this->Description, 80);
- }
+ {
+ strncpy(hdr.descrip, this->Description, sizeof(hdr.descrip) - 1);
+ hdr.descrip[sizeof(hdr.descrip) - 1] = '\0';
+ }
// qfac dictates the slice ordering in the file
double qfac = (this->QFac < 0 ? -1.0 : 1.0);
@@ -507,72 +524,72 @@ int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile)
if (this->QFormMatrix ||
(origin[0] != 0 || origin[1] != 0 || origin[2] != 0))
- {
+ {
hdr.qform_code = 1; // SCANNER_ANAT
double mat16[16];
vtkNIFTIWriterMatrix(mat16, this->QFormMatrix, origin);
vtkNIFTIWriterSetQForm(&hdr, mat16, qfac);
- }
+ }
if (this->SFormMatrix)
- {
+ {
hdr.sform_code = 2; // ALIGNED_ANAT
double mat16[16];
vtkNIFTIWriterMatrix(mat16, this->SFormMatrix, origin);
vtkNIFTIWriterSetSForm(&hdr, mat16, qfac);
- }
+ }
// base dimension not counting vector dimension
int basedim = (hdr.dim[3] == 1 ? 2 : 3);
if (this->TimeDimension)
- {
+ {
int tdim = this->TimeDimension;
if (hdr.dim[5] % tdim != 0)
- {
+ {
vtkErrorMacro("Number of components in the image data must be "
"divisible by the TimeDimension");
return 0;
- }
+ }
hdr.pixdim[4] = this->TimeSpacing;
hdr.dim[4] = tdim;
hdr.dim[5] /= tdim;
hdr.dim[0] = (hdr.dim[5] > 1 ? 5 : 4);
basedim = 4;
- }
+ }
if (hdr.dim[5] == 2 && hdr.datatype == NIFTI_TYPE_FLOAT32)
- {
+ {
// float with 2 components becomes COMPLEX64
hdr.datatype = NIFTI_TYPE_COMPLEX64;
hdr.bitpix = 64;
hdr.dim[0] = basedim;
hdr.dim[5] = 1;
- }
+ }
else if (hdr.dim[5] == 2 && hdr.datatype == NIFTI_TYPE_FLOAT64)
- {
+ {
// double with 2 components becomes COMPLEX128
hdr.datatype = NIFTI_TYPE_COMPLEX128;
hdr.bitpix = 32;
hdr.dim[0] = basedim;
hdr.dim[5] = 1;
- }
+ }
else if (hdr.dim[5] == 3 && hdr.datatype == NIFTI_TYPE_UINT8)
- {
+ {
// unsigned char with 3 components becomes RGB24
hdr.datatype = NIFTI_TYPE_RGB24;
hdr.bitpix = 24;
hdr.dim[0] = basedim;
hdr.dim[5] = 1;
- }
+ }
else if (hdr.dim[5] == 4 && hdr.datatype == NIFTI_TYPE_UINT8)
- {
+ {
// unsigned char with 4 components becomes RGBA32
hdr.datatype = NIFTI_TYPE_RGBA32;
hdr.bitpix = 32;
hdr.dim[0] = basedim;
hdr.dim[5] = 1;
- }
+ }
this->OwnHeader->SetHeader(&hdr);
return 1;
@@ -591,18 +608,18 @@ int vtkNIFTIWriter::RequestData(
vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT()));
if (data == NULL)
- {
+ {
vtkErrorMacro("No input provided!");
return 0;
- }
+ }
const char *filename = this->GetFileName();
if (filename == NULL)
- {
+ {
vtkErrorMacro("A FileName must be provided");
this->SetErrorCode(vtkErrorCode::NoFileNameError);
return 0;
- }
+ }
int extent[6];
info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
@@ -614,10 +631,10 @@ int vtkNIFTIWriter::RequestData(
if (n > 2 && filename[n-3] == '.' &&
tolower(filename[n-2]) == 'g' &&
tolower(filename[n-1]) == 'z')
- {
+ {
m = n - 3;
isCompressed = true;
- }
+ }
// after the optional ".gz" is removed, is it a ".img/.hdr" file?
bool singleFile = true;
@@ -628,15 +645,15 @@ int vtkNIFTIWriter::RequestData(
(tolower(filename[m-3]) == 'i' &&
tolower(filename[m-2]) == 'm' &&
tolower(filename[m-1]) == 'g')))
- {
+ {
singleFile = false;
- }
+ }
// generate the header information
if (this->GenerateHeader(info, singleFile) == 0)
- {
+ {
return 0;
- }
+ }
// if file is not .nii, then get .hdr and .img filenames
char *hdrname = vtkNIFTIWriter::ReplaceExtension(
@@ -653,45 +670,64 @@ int vtkNIFTIWriter::RequestData(
size_t hdrsize = 0;
int version = this->OwnHeader->GetMagic()[2] - '0';
if (version == 2)
- {
+ {
this->OwnHeader->GetHeader(&hdr2);
hdrptr = &hdr2;
hdrsize = hdr2.sizeof_hdr;
- }
+ }
else
- {
+ {
this->OwnHeader->GetHeader(&hdr1);
hdrptr = &hdr1;
hdrsize = hdr1.sizeof_hdr;
if (extent[1] - extent[0] + 1 > VTK_SHORT_MAX ||
extent[3] - extent[2] + 1 > VTK_SHORT_MAX ||
extent[5] - extent[4] + 1 > VTK_SHORT_MAX)
- {
+ {
vtkErrorMacro("Image too large to store in NIFTI-1 format");
return 0;
- }
}
+ }
+
+#if _WIN32
+ vtkDICOMFilePath fph(hdrname);
+ vtkDICOMFilePath fpi(imgname);
+#if VTK_MAJOR_VERSION < 7
+ // convert to the local character set
+ const char *uhdrname = fph.Local();
+ const char *uimgname = fpi.Local();
+#else
+ // use wide character
+ const wchar_t *uhdrname = fph.Wide();
+ const wchar_t *uimgname = fpi.Wide();
+#endif
+#else
+ const char *uhdrname = hdrname;
+ const char *uimgname = imgname;
+#endif
// try opening file
gzFile file = 0;
FILE *ufile = 0;
- if (isCompressed)
+ if (uhdrname && uimgname)
+ {
+ if (isCompressed)
{
- file = gzopen(hdrname, "wb");
+ file = gzopen(uhdrname, "wb");
}
- else
+ else
{
- ufile = fopen(hdrname, "wb");
+ ufile = fopen(uhdrname, NIFTI_FILE_MODE);
}
+ }
if (!file && !ufile)
- {
- vtkErrorMacro("Cannot open file " << hdrname);
+ {
delete [] hdrname;
delete [] imgname;
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
return 0;
- }
+ }
this->InvokeEvent(vtkCommand::StartEvent);
this->UpdateProgress(0.0);
@@ -699,62 +735,62 @@ int vtkNIFTIWriter::RequestData(
// write the header
size_t bytesWritten = 0;
if (isCompressed)
- {
+ {
unsigned int hsize = static_cast<unsigned int>(hdrsize);
int code = gzwrite(file, hdrptr, hsize);
bytesWritten = (code < 0 ? 0 : code);
- }
+ }
else
- {
+ {
bytesWritten = fwrite(hdrptr, 1, hdrsize, ufile);
- }
+ }
if (bytesWritten < hdrsize)
- {
+ {
this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError);
- }
+ }
if (singleFile && !this->ErrorCode)
- {
+ {
// write the padding between the header and the image to the .nii file
size_t padsize = (static_cast<size_t>(this->OwnHeader->GetVoxOffset()) -
hdrsize);
char *padding = new char[padsize];
memset(padding, '\0', padsize);
if (isCompressed)
- {
+ {
int code = gzwrite(file, padding, static_cast<unsigned int>(padsize));
bytesWritten = (code < 0 ? 0 : code);
- }
+ }
else
- {
+ {
bytesWritten = fwrite(padding, 1, padsize, ufile);
- }
+ }
delete [] padding;
if (bytesWritten < padsize)
- {
+ {
this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError);
- }
}
+ }
else if (!this->ErrorCode)
- {
+ {
// close the .hdr file and open the .img file
if (isCompressed)
- {
+ {
gzclose(file);
- file = gzopen(imgname, "wb");
- }
+ file = gzopen(uimgname, "wb");
+ }
else
- {
+ {
fclose(ufile);
- ufile = fopen(imgname, "wb");
- }
+ ufile = fopen(uimgname, NIFTI_FILE_MODE);
}
+ }
if (!file && !ufile)
- {
+ {
vtkErrorMacro("Cannot open file " << imgname);
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
- }
+ }
// write the image
unsigned char *dataPtr =
@@ -780,41 +816,41 @@ int vtkNIFTIWriter::RequestData(
z_off_t fileVoxelIncr = scalarSize*numComponents/vectorDim;
int planarSize = 1;
if (planarRGB)
- {
+ {
planarSize = numComponents/vectorDim;
fileVoxelIncr = scalarSize;
- }
+ }
// add a buffer for planar-vector to packed-vector conversion
unsigned char *rowBuffer = 0;
if (vectorDim > 1 || planarRGB || swapBytes)
- {
+ {
rowBuffer = new unsigned char[outSizeX*fileVoxelIncr];
- }
+ }
// special increment to reverse the slices if needed
vtkIdType sliceOffset = 0;
if (this->QFac < 0)
- {
+ {
// put slices in reverse order
sliceOffset = scalarSize*numComponents;
sliceOffset *= outSizeX;
sliceOffset *= outSizeY;
dataPtr += sliceOffset*(outSizeZ - 1);
- }
+ }
// special increment to handle planar RGB
vtkIdType planarOffset = 0;
vtkIdType planarEndOffset = 0;
if (planarRGB)
- {
+ {
planarOffset = scalarSize*numComponents;
planarOffset *= outSizeX;
planarOffset *= outSizeY;
planarOffset -= scalarSize;
planarEndOffset = planarOffset - scalarSize*(planarSize - 1);
- }
+ }
// report progress every 2% of the way to completion
vtkIdType target =
@@ -833,115 +869,115 @@ int vtkNIFTIWriter::RequestData(
unsigned char *ptr = dataPtr;
while (!this->AbortExecute && !this->ErrorCode)
- {
+ {
if (vectorDim == 1 && !planarRGB && !swapBytes)
- {
+ {
// write directly from input, instead of using a buffer
rowBuffer = ptr;
ptr += outSizeX*numComponents*scalarSize;
- }
+ }
else
- {
+ {
// create a vector plane from packed vector components
unsigned char *tmpPtr = rowBuffer;
z_off_t skipOther = scalarSize*numComponents - fileVoxelIncr;
for (int i = 0; i < outSizeX; i++)
- {
+ {
// write one vector component of one voxel
z_off_t nn = fileVoxelIncr;
do { *tmpPtr++ = *ptr++; } while (--nn);
// skip past the other components
ptr += skipOther;
- }
}
+ }
if (swapBytes != 0 && scalarSize > 1)
- {
+ {
vtkByteSwap::SwapVoidRange(rowBuffer, rowSize, scalarSize);
- }
+ }
if (isCompressed)
- {
+ {
int code = gzwrite(file, rowBuffer, rowSize*scalarSize);
bytesWritten = (code < 0 ? 0 : code);
- }
+ }
else
- {
+ {
bytesWritten = fwrite(rowBuffer, scalarSize, rowSize, ufile)*scalarSize;
- }
+ }
if (bytesWritten < static_cast<size_t>(rowSize*scalarSize))
- {
+ {
this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError);
break;
- }
+ }
if (++count % target == 0)
- {
+ {
this->UpdateProgress(0.02*count/target);
- }
+ }
if (++j == outSizeY)
- {
+ {
j = 0;
// back up for next plane (R, G, or B) if planar mode
ptr -= planarOffset;
if (++p == planarSize)
- {
+ {
p = 0;
ptr += planarEndOffset; // advance to start of next slice
ptr -= 2*sliceOffset; // for reverse slice order
if (++k == outSizeZ)
- {
+ {
k = 0;
if (++t == timeDim)
- {
+ {
t = 0;
- }
+ }
if (++c == vectorDim)
- {
+ {
break;
- }
+ }
// back up the ptr to the beginning of the image,
// then increment to the next vector component
ptr = dataPtr + c*fileVoxelIncr*planarSize;
if (timeDim > 1)
- {
+ {
// if timeDim is included in the vectorDim (and hence in the
// VTK scalar components) then we have to make sure that
// the vector components are packed before the time steps
ptr = dataPtr + (c + t*(vectorDim - 1))/timeDim*
fileVoxelIncr*planarSize;
- }
}
}
}
}
+ }
if (vectorDim > 1 || swapBytes || planarRGB)
- {
+ {
delete [] rowBuffer;
- }
+ }
if (isCompressed)
- {
+ {
gzclose(file);
- }
+ }
else
- {
+ {
fclose(ufile);
- }
+ }
if (this->ErrorCode == vtkErrorCode::OutOfDiskSpaceError)
- {
+ {
// erase the file, rather than leave a corrupt file on disk
vtkErrorMacro("Out of disk space, removing incomplete file " << imgname);
- vtksys::SystemTools::RemoveFile(imgname);
+ vtkDICOMFile::Remove(imgname);
if (!singleFile)
- {
- vtksys::SystemTools::RemoveFile(hdrname);
- }
+ {
+ vtkDICOMFile::Remove(hdrname);
}
+ }
this->UpdateProgress(1.0);
this->InvokeEvent(vtkCommand::EndEvent);
diff --git a/Source/vtkNIFTIWriter.h b/Source/vtkNIFTIWriter.h
index 3589c43..2322512 100644
--- a/Source/vtkNIFTIWriter.h
+++ b/Source/vtkNIFTIWriter.h
@@ -12,20 +12,22 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkNIFTIWriter - Write NIfTI-1 and NIfTI-2 medical image files
-// .SECTION Description
-// This class writes NIFTI files, either in .nii format or as separate
-// .img and .hdr files. If told to write a file that ends in ".gz",
-// then the writer will automatically compress the file with zlib.
-// Images of type unsigned char that have 3 or 4 scalar components
-// will automatically be written as RGB or RGBA respectively. Images
-// of type float or double that have 2 components will automatically be
-// written as complex values.
-// .SECTION Thanks
-// This class was contributed to VTK by the Calgary Image Processing and
-// Analysis Centre (CIPAC).
-// .SECTION See Also
-// vtkNIFTIReader
+/*! \class vtkNIFTIWriter
+ * \brief Write NIfTI-1 and NIfTI-2 medical image files
+ *
+ * This class writes NIFTI files, either in .nii format or as separate
+ * .img and .hdr files. If told to write a file that ends in ".gz",
+ * then the writer will automatically compress the file with zlib.
+ * Images of type unsigned char that have 3 or 4 scalar components
+ * will automatically be written as RGB or RGBA respectively. Images
+ * of type float or double that have 2 components will automatically be
+ * written as complex values.
+ *
+ * This class was contributed to VTK by the Calgary Image Processing and
+ * Analysis Centre (CIPAC).
+ *
+ * \sa vtkNIFTIReader
+ */
#ifndef vtkNIFTIWriter_h
#define vtkNIFTIWriter_h
@@ -39,153 +41,167 @@ class vtkNIFTIHeader;
class VTKDICOM_EXPORT vtkNIFTIWriter : public vtkImageWriter
{
public:
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkNIFTIWriter *New();
vtkTypeMacro(vtkNIFTIWriter, vtkImageWriter);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Set the version number for the NIfTI file format to use.
- // This can be 1, 2, or 0 (the default). If set to zero, then it
- // will save as NIfTI version 1 unless SetNIFTIHeader() provided
- // header information from a NIfTI version 2 file.
+ //@{
+ //! Set the version number for the NIfTI file format to use.
+ /*!
+ * This can be 1, 2, or 0 (the default). If set to zero, then it
+ * will save as NIfTI version 1 unless SetNIFTIHeader() provided
+ * header information from a NIfTI version 2 file.
+ */
vtkSetMacro(NIFTIVersion, int);
vtkGetMacro(NIFTIVersion, int);
+ //@}
- // Description:
- // Set a short description (max 80 chars) of how the file was produced.
- // The default description is "VTKX.Y" where X.Y is the VTK version.
+ //@{
+ //! Set a short description (max 80 chars) of how the file was produced.
vtkSetStringMacro(Description);
vtkGetStringMacro(Description);
-
- // Description:
- // Set the time dimension to use in the NIFTI file (or zero if none).
- // The number of components of the input data must be divisible by the time
- // dimension if the time dimension is not set to zero. The vector dimension
- // will be set to the number of components divided by the time dimension.
+ //@}
+
+ //@{
+ //! Set the time dimension to use in the NIFTI file (or zero if none).
+ /*!
+ * The number of components of the input data must be divisible by the time
+ * dimension if the time dimension is not set to zero. The vector dimension
+ * will be set to the number of components divided by the time dimension.
+ */
vtkGetMacro(TimeDimension, int);
vtkSetMacro(TimeDimension, int);
vtkGetMacro(TimeSpacing, double);
vtkSetMacro(TimeSpacing, double);
-
- // Description:
- // Set the slope and intercept for calibrating the scalar values.
- // Other programs that read the NIFTI file can use the equation
- // v = u*RescaleSlope + RescaleIntercept to rescale the data to
- // real values. If both the slope and the intercept are zero,
- // then the SclSlope and SclIntercept in the header info provided
- // via SetNIFTIHeader() are used instead.
- vtkSetMacro(RescaleSlope, double);
- vtkGetMacro(RescaleSlope, double);
- vtkSetMacro(RescaleIntercept, double);
- vtkGetMacro(RescaleIntercept, double);
-
- // Description:
- // Write planar RGB (separate R, G, and B planes), rather than packed RGB.
- // Use this option with extreme caution: the NIFTI standard requires RGB
- // pixels to be packed. The Analyze format, however, was used to store
- // both planar RGB and packed RGB depending on the software, without any
- // indication in the header about which convention was being used.
+ //@}
+
+ //@{
+ //! Set the slope and intercept for calibrating the scalar values.
+ /*!
+ * Other programs that read the NIFTI file can use the equation
+ * v = u*RescaleSlope + RescaleIntercept to rescale the data to
+ * real values. If both the slope and the intercept are zero,
+ * then the SclSlope and SclIntercept in the header info provided
+ * via SetNIFTIHeader() are used instead.
+ */
+ vtkSetMacro(RescaleSlope, double);
+ vtkGetMacro(RescaleSlope, double);
+ vtkSetMacro(RescaleIntercept, double);
+ vtkGetMacro(RescaleIntercept, double);
+ //@}
+
+ //@{
+ //! Write planar RGB (separate R, G, and B planes), rather than packed RGB.
+ /*!
+ * Use this option with extreme caution: the NIFTI standard requires RGB
+ * pixels to be packed. The Analyze format, however, was used to store
+ * both planar RGB and packed RGB depending on the software, without any
+ * indication in the header about which convention was being used.
+ */
vtkGetMacro(PlanarRGB, bool);
vtkSetMacro(PlanarRGB, bool);
vtkBooleanMacro(PlanarRGB, bool);
-
- // Description:
- // The QFac sets the ordering of the slices in the NIFTI file.
- // If QFac is -1, then the slice ordering in the file will be reversed
- // as compared to VTK. Use with caution.
+ //@}
+
+ //@{
+ //! The QFac sets the ordering of the slices in the NIFTI file.
+ /*!
+ * If QFac is -1, then the slice ordering in the file will be reversed
+ * as compared to VTK. Use with caution.
+ */
vtkSetMacro(QFac, double);
vtkGetMacro(QFac, double);
-
- // Description:
- // Set the "qform" orientation and offset for the image data.
- // The 3x3 portion of the matrix must be orthonormal and have a
- // positive determinant, it will be used to compute the quaternion.
- // The last column of the matrix will be used for the offset.
- // In the NIFTI header, the qform_code will be set to 1.
+ //@}
+
+ //@{
+ //! Set the "qform" orientation and offset for the image data.
+ /*!
+ * The 3x3 portion of the matrix must be orthonormal and have a
+ * positive determinant, it will be used to compute the quaternion.
+ * The last column of the matrix will be used for the offset.
+ * In the NIFTI header, the qform_code will be set to 1.
+ */
void SetQFormMatrix(vtkMatrix4x4 *);
vtkMatrix4x4 *GetQFormMatrix() { return this->QFormMatrix; }
-
- // Description:
- // Set a matrix for the "sform" transformation stored in the file.
- // Unlike the qform matrix, the sform matrix can contain scaling
- // information. Before being stored in the NIFTI header, the
- // first three columns of the matrix will be multipled by the voxel
- // spacing. In the NIFTI header, the sform_code will be set to 2.
+ //@}
+
+ //@{
+ //! Set a matrix for the "sform" transformation stored in the file.
+ /*!
+ * Unlike the qform matrix, the sform matrix can contain scaling
+ * information. Before being stored in the NIFTI header, the
+ * first three columns of the matrix will be multipled by the voxel
+ * spacing. In the NIFTI header, the sform_code will be set to 2.
+ */
void SetSFormMatrix(vtkMatrix4x4 *);
vtkMatrix4x4 *GetSFormMatrix() { return this->SFormMatrix; }
-
- // Description:
- // Set the NIFTI header information to use when writing the file.
- // The data dimensions and pixdim from the supplied header will be
- // ignored. Likewise, the QForm and SForm information in the supplied
- // header will be ignored if you have called SetQFormMatrix() or
- // SetSFormMatrix() to provide the orientation information for the file.
+ //@}
+
+ //@{
+ //! Set the NIFTI header information to use when writing the file.
+ /*!
+ * The data dimensions and pixdim from the supplied header will be
+ * ignored. Likewise, the QForm and SForm information in the supplied
+ * header will be ignored if you have called SetQFormMatrix() or
+ * SetSFormMatrix() to provide the orientation information for the file.
+ */
void SetNIFTIHeader(vtkNIFTIHeader *hdr);
vtkNIFTIHeader *GetNIFTIHeader();
+ //@}
protected:
vtkNIFTIWriter();
~vtkNIFTIWriter();
- // Description:
- // Generate the header information for the file.
+ //! Generate the header information for the file.
int GenerateHeader(vtkInformation *info, bool singleFile);
- // Description:
- // The main execution method, which writes the file.
+ //! The main execution method, which writes the file.
virtual int RequestData(vtkInformation *request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // Make a new filename by replacing extension "ext1" with "ext2".
- // The extensions must include a period, must be three characters
- // long, and must be lower case. A new string is returned that must
- // be deleted by the caller.
+ //! Make a new filename by replacing extension "ext1" with "ext2".
+ /*!
+ * The extensions must include a period, must be three characters
+ * long, and must be lower case. A new string is returned that must
+ * be deleted by the caller.
+ */
static char *ReplaceExtension(
const char *fname, const char *ext1, const char *ext2);
- // Description:
- // Time dimension to use in the file.
+ //! Time dimension to use in the file.
int TimeDimension;
double TimeSpacing;
- // Description:
- // Information for rescaling data to quantitative units.
+ //! Information for rescaling data to quantitative units.
double RescaleIntercept;
double RescaleSlope;
- // Description:
- // Set to -1 when VTK slice order is opposite to NIFTI slice order.
+ //! Set to -1 when VTK slice order is opposite to NIFTI slice order.
double QFac;
- // Description:
- // The orientation matrices for the NIFTI file.
+ //! The orientation matrices for the NIFTI file.
vtkMatrix4x4 *QFormMatrix;
vtkMatrix4x4 *SFormMatrix;
- // Description
- // A description of how the file was produced.
+ //! A description of how the file was produced.
char *Description;
- // Description:
- // The header information.
+ //! The header information.
vtkNIFTIHeader *NIFTIHeader;
vtkNIFTIHeader *OwnHeader;
int NIFTIVersion;
- // Description:
- // Use planar RGB instead of the default (packed).
+ //! Use planar RGB instead of the default (packed).
bool PlanarRGB;
private:
- vtkNIFTIWriter(const vtkNIFTIWriter&); // Not implemented.
- void operator=(const vtkNIFTIWriter&); // Not implemented.
+ vtkNIFTIWriter(const vtkNIFTIWriter&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkNIFTIWriter&) VTK_DELETE_FUNCTION;
};
#endif // vtkNIFTIWriter_h
diff --git a/Source/vtkScancoCTReader.cxx b/Source/vtkScancoCTReader.cxx
index 7fc9e37..9b379dd 100644
--- a/Source/vtkScancoCTReader.cxx
+++ b/Source/vtkScancoCTReader.cxx
@@ -25,6 +25,11 @@
#include "vtkStreamingDemandDrivenPipeline.h"
#include "vtkVersion.h"
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#endif
+
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -146,22 +151,22 @@ int vtkScancoCTReader::CheckVersion(const char header[16])
int fileType = 0;
if (strncmp(header, "CTDATA-HEADER_V1", 16) == 0)
- {
+ {
fileType = 1;
- }
+ }
else if (strcmp(header, "AIMDATA_V030 ") == 0)
- {
+ {
fileType = 3;
- }
+ }
else
- {
+ {
int preHeaderSize = vtkScancoCTReader::DecodeInt(header);
int imageHeaderSize = vtkScancoCTReader::DecodeInt(header + 4);
if (preHeaderSize == 20 && imageHeaderSize == 140)
- {
+ {
fileType = 2;
- }
}
+ }
return fileType;
}
@@ -173,16 +178,16 @@ int vtkScancoCTReader::CanReadFile(const char *filename)
bool canRead = false;
if (infile.good())
- {
+ {
// header is a 512 byte block
char buffer[512];
infile.read(buffer, 512);
if (!infile.bad())
- {
+ {
int fileType = vtkScancoCTReader::CheckVersion(buffer);
canRead = (fileType > 0);
- }
}
+ }
infile.close();
@@ -275,13 +280,13 @@ void vtkScancoCTReader::StripString(char *dest, const char *cp, size_t l)
{
char *dp = dest;
for (size_t i = 0; i < l && *cp != '\0'; i++)
- {
+ {
*dp++ = *cp++;
- }
+ }
while (dp != dest && dp[-1] == ' ')
- {
+ {
dp--;
- }
+ }
*dp = '\0';
}
@@ -289,9 +294,9 @@ void vtkScancoCTReader::StripString(char *dest, const char *cp, size_t l)
int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
{
if (bytesRead < 512)
- {
+ {
return 0;
- }
+ }
char *h = this->RawHeader;
vtkScancoCTReader::StripString(this->Version, h, 16); h += 16;
@@ -314,7 +319,7 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
bool isRAD = (dataType == 9 || physdim[2] == 0);
if (isRAD) // RAD file
- {
+ {
this->MeasurementIndex = vtkScancoCTReader::DecodeInt(h); h += 4;
this->DataRange[0] = vtkScancoCTReader::DecodeInt(h); h += 4;
this->DataRange[1] = vtkScancoCTReader::DecodeInt(h); h += 4;
@@ -329,9 +334,9 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
this->StartPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
this->EndPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
h += 88*4;
- }
+ }
else // ISQ file or RSQ file
- {
+ {
this->SliceThickness = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
this->SliceIncrement = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
this->StartPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
@@ -353,23 +358,23 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
this->Energy = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
this->Intensity = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
h += 83*4;
- }
+ }
int dataOffset = vtkScancoCTReader::DecodeInt(h);
// fix SliceThickness and SliceIncrement if they were truncated
if (physdim[2] != 0)
- {
+ {
double computedSpacing = physdim[2]*1e-3/pixdim[2];
if (fabs(computedSpacing - this->SliceThickness) < 1.1e-3)
- {
+ {
this->SliceThickness = computedSpacing;
- }
+ }
if (fabs(computedSpacing - this->SliceIncrement) < 1.1e-3)
- {
+ {
this->SliceIncrement = computedSpacing;
- }
}
+ }
// Convert date information into a string
month = ((month > 12 || month < 1) ? 0 : month);
@@ -387,19 +392,19 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
// Perform a sanity check on the dimensions
for (int i = 0; i < 3; i++)
- {
+ {
this->ScanDimensionsPixels[i] = pixdim[i];
if (pixdim[i] < 1)
- {
+ {
pixdim[i] = 1;
- }
+ }
this->ScanDimensionsPhysical[i] =
(isRAD ? physdim[i]*1e-6 : physdim[i]*1e-3);
if (physdim[i] == 0)
- {
+ {
physdim[i] = 1.0;
- }
}
+ }
this->SetDataExtent(0, pixdim[0]-1,
0, pixdim[1]-1,
@@ -408,17 +413,17 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
this->SetDataOrigin(0.0, 0.0, 0.0);
if (isRAD) // RAD file
- {
+ {
this->SetDataSpacing(physdim[0]*1e-6/pixdim[0],
physdim[1]*1e-6/pixdim[1],
1.0);
- }
+ }
else
- {
+ {
this->SetDataSpacing(physdim[0]*1e-3/pixdim[0],
physdim[1]*1e-3/pixdim[1],
physdim[2]*1e-3/pixdim[2]);
- }
+ }
this->SetDataScalarType(VTK_SHORT);
this->SetNumberOfScalarComponents(1);
@@ -429,50 +434,50 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
// read the rest of the header
if (headerSize > bytesRead)
- {
+ {
h = new char[headerSize];
memcpy(h, this->RawHeader, bytesRead);
delete [] this->RawHeader;
this->RawHeader = h;
file->read(h + bytesRead, headerSize - bytesRead);
if (static_cast<unsigned long>(file->gcount()) < headerSize - bytesRead)
- {
+ {
return 0;
- }
}
+ }
// decode the extended header (lots of guesswork)
if (headerSize >= 2048)
- {
+ {
char *calHeader = 0;
int calHeaderSize = 0;
h = this->RawHeader + 512;
unsigned long hskip = 1;
char *headerName = h + 8;
if (strncmp(headerName, "MultiHeader ", 16) == 0)
- {
+ {
h += 512;
hskip += 1;
- }
+ }
unsigned long hsize = 0;
for (int i = 0; i < 4; i++)
- {
+ {
hsize = vtkScancoCTReader::DecodeInt(h + i*128 + 24);
if ((1 + hskip + hsize)*512 > headerSize)
- {
+ {
break;
- }
+ }
headerName = h + i*128 + 8;
if (strncmp(headerName, "Calibration ", 16) == 0)
- {
+ {
calHeader = this->RawHeader + (1 + hskip)*512;
calHeaderSize = hsize*512;
- }
- hskip += hsize;
}
+ hskip += hsize;
+ }
if (calHeader && calHeaderSize >= 1024)
- {
+ {
h = calHeader;
vtkScancoCTReader::StripString(this->CalibrationData, h + 28, 64);
// std::string calFile(h + 112, 256);
@@ -484,14 +489,14 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
this->RescaleSlope = vtkScancoCTReader::DecodeDouble(h + 664);
this->RescaleIntercept = vtkScancoCTReader::DecodeDouble(h + 672);
this->MuWater = vtkScancoCTReader::DecodeDouble(h + 688);
- }
}
+ }
// Include conversion to linear att coeff in the rescaling
if (this->MuScaling != 0)
- {
+ {
this->RescaleSlope /= this->MuScaling;
- }
+ }
return 1;
}
@@ -500,27 +505,27 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
{
if (bytesRead < 160)
- {
+ {
return 0;
- }
+ }
char *h = this->RawHeader;
int intSize = 0;
unsigned long headerSize = 0;
if (strcmp(h, "AIMDATA_V030 ") == 0)
- {
+ {
// header uses 64-bit ints (8 bytes)
intSize = 8;
strcpy(this->Version, h);
headerSize = 16;
h += headerSize;
- }
+ }
else
- {
+ {
// header uses 32-bit ints (4 bytes)
intSize = 4;
strcpy(this->Version, "AIMDATA_V020 ");
- }
+ }
// read the pre-header
char *preheader = h;
@@ -532,7 +537,7 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
headerSize += preheaderSize + structSize + logSize;
this->SetHeaderSize(headerSize);
if (headerSize > bytesRead)
- {
+ {
h = new char[headerSize];
memcpy(h, this->RawHeader, bytesRead);
preheader = h + (preheader - this->RawHeader);
@@ -540,10 +545,10 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
this->RawHeader = h;
file->read(h + bytesRead, headerSize - bytesRead);
if (static_cast<unsigned long>(file->gcount()) < headerSize - bytesRead)
- {
+ {
return 0;
- }
}
+ }
// decode the struct header
h = preheader + preheaderSize;
@@ -551,19 +556,19 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
int dataType = vtkScancoCTReader::DecodeInt(h); h += 4;
int structValues[21];
for (int i = 0; i < 21; i++)
- {
+ {
structValues[i] = vtkScancoCTReader::DecodeInt(h); h += intSize;
- }
+ }
float elementSize[3];
for (int i = 0; i < 3; i++)
- {
+ {
elementSize[i] = vtkScancoCTReader::DecodeFloat(h);
if (elementSize[i] == 0)
- {
+ {
elementSize[i] = 1.0;
- }
- h += 4;
}
+ h += 4;
+ }
// number of components per pixel is 1 by default
int scalarType = VTK_UNSIGNED_CHAR;
@@ -573,7 +578,7 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
// a limited selection of data types are supported
// (only 0x00010001 (char) and 0x00020002 (short) are fully tested)
switch (dataType)
- {
+ {
case 0x00160001:
scalarType = VTK_UNSIGNED_CHAR;
break;
@@ -618,7 +623,7 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
default:
vtkErrorMacro("Unrecognized data type in AIM file: " << dataType);
return 0;
- }
+ }
this->SetDataScalarType(scalarType);
this->SetNumberOfScalarComponents(scalarComponents);
@@ -643,190 +648,190 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
char *logEnd = h + logSize;
while (h != logEnd && *h != '\0')
- {
+ {
// skip newline and go to next line
if (*h == '\n')
- {
+ {
h++;
- }
+ }
// search for the end of this line
char *lineEnd = h;
while (lineEnd != logEnd && *lineEnd != '\n' && *lineEnd != '\0')
- {
+ {
lineEnd++;
- }
+ }
// if not a comment, search for keys
if (h != lineEnd && *h != '!' && (*lineEnd == '\n' || *lineEnd == '\0'))
- {
+ {
// key and value are separated by multiple spaces
char *key = h;
while (h+1 != lineEnd && (h[0] != ' ' || h[1] != ' '))
- {
+ {
h++;
- }
+ }
// this gives the length of the key
size_t keylen = h - key;
// skip to the end of the spaces
while (h != lineEnd && *h == ' ')
- {
+ {
h++;
- }
+ }
// this is where the value starts
char *value = h;
size_t valuelen = lineEnd - value;
// look for trailing spaces
while (valuelen > 0 &&
(h[valuelen-1] == ' ' || h[valuelen-1] == '\r'))
- {
+ {
valuelen--;
- }
+ }
// convert into a std::string for convenience
std::string skey(key, keylen);
// check for known keys
if (skey == "Time")
- {
+ {
valuelen = (valuelen > 31 ? 31 : valuelen);
strncpy(this->ModificationDate, value, valuelen);
this->ModificationDate[valuelen] = '\0';
- }
+ }
else if (skey == "Original Creation-Date")
- {
+ {
valuelen = (valuelen > 31 ? 31 : valuelen);
strncpy(this->CreationDate, value, valuelen);
this->CreationDate[valuelen] = '\0';
- }
+ }
else if (skey == "Orig-ISQ-Dim-p")
- {
+ {
for (int i = 0; i < 3; i++)
- {
+ {
this->ScanDimensionsPixels[i] = strtol(value, &value, 10);
- }
}
+ }
else if (skey == "Orig-ISQ-Dim-um")
- {
+ {
for (int i = 0; i < 3; i++)
- {
+ {
this->ScanDimensionsPhysical[i] = strtod(value, &value)*1e-3;
- }
}
+ }
else if (skey == "Patient Name")
- {
+ {
valuelen = (valuelen > 41 ? 41 : valuelen);
strncpy(this->PatientName, value, valuelen);
this->PatientName[valuelen] = '\0';
- }
+ }
else if (skey == "Index Patient")
- {
+ {
this->PatientIndex = strtol(value, 0, 10);
- }
+ }
else if (skey == "Index Measurement")
- {
+ {
this->MeasurementIndex = strtol(value, 0, 10);
- }
+ }
else if (skey == "Site")
- {
+ {
this->Site = strtol(value, 0, 10);
- }
+ }
else if (skey == "Scanner ID")
- {
+ {
this->ScannerID = strtol(value, 0, 10);
- }
+ }
else if (skey == "Scanner type")
- {
+ {
this->ScannerType = strtol(value, 0, 10);
- }
+ }
else if (skey == "Position Slice 1 [um]")
- {
+ {
this->StartPosition = strtod(value, 0)*1e-3;
this->EndPosition =
this->StartPosition + elementSize[2]*(structValues[5] - 1);
- }
+ }
else if (skey == "No. samples")
- {
+ {
this->NumberOfSamples = strtol(value, 0, 10);
- }
+ }
else if (skey == "No. projections per 180")
- {
+ {
this->NumberOfProjections = strtol(value, 0, 10);
- }
+ }
else if (skey == "Scan Distance [um]")
- {
+ {
this->ScanDistance = strtod(value, 0)*1e-3;
- }
+ }
else if (skey == "Integration time [us]")
- {
+ {
this->SampleTime = strtod(value, 0)*1e-3;
- }
+ }
else if (skey == "Reference line [um]")
- {
+ {
this->ReferenceLine = strtod(value, 0)*1e-3;
- }
+ }
else if (skey == "Reconstruction-Alg.")
- {
+ {
this->ReconstructionAlg = strtol(value, 0, 10);
- }
+ }
else if (skey == "Energy [V]")
- {
+ {
this->Energy = strtod(value, 0)*1e-3;
- }
+ }
else if (skey == "Intensity [uA]")
- {
+ {
this->Intensity = strtod(value, 0)*1e-3;
- }
+ }
else if (skey == "Mu_Scaling")
- {
+ {
this->MuScaling = strtol(value, 0, 10);
- }
+ }
else if (skey == "Minimum data value")
- {
+ {
this->DataRange[0] = strtod(value, 0);
- }
+ }
else if (skey == "Maximum data value")
- {
+ {
this->DataRange[1] = strtod(value, 0);
- }
+ }
else if (skey == "Calib. default unit type")
- {
+ {
this->RescaleType = strtol(value, 0, 10);
- }
+ }
else if (skey == "Calibration Data")
- {
+ {
valuelen = (valuelen > 64 ? 64 : valuelen);
strncpy(this->CalibrationData, value, valuelen);
this->CalibrationData[valuelen] = '\0';
- }
+ }
else if (skey == "Density: unit")
- {
+ {
valuelen = (valuelen > 16 ? 16 : valuelen);
strncpy(this->RescaleUnits, value, valuelen);
this->RescaleUnits[valuelen] = '\0';
- }
+ }
else if (skey == "Density: slope")
- {
+ {
this->RescaleSlope = strtod(value, 0);
- }
+ }
else if (skey == "Density: intercept")
- {
+ {
this->RescaleIntercept = strtod(value, 0);
- }
+ }
else if (skey == "HU: mu water")
- {
+ {
this->MuWater = strtod(value, 0);
- }
}
+ }
// skip to the end of the line
h = lineEnd;
- }
+ }
// Include conversion to linear att coeff in the rescaling
if (this->MuScaling != 0)
- {
+ {
this->RescaleSlope /= this->MuScaling;
- }
+ }
// these items are not in the processing log
this->SliceThickness = elementSize[2];
@@ -848,20 +853,27 @@ int vtkScancoCTReader::RequestInformation(
const char *filename = this->FileName;
if (filename == 0)
- {
+ {
vtkErrorMacro("A filename must be specified");
return 0;
- }
+ }
vtkDebugMacro("Opening ISQ/AIM file " << filename);
- ifstream infile(filename, ios::in | ios::binary);
+#ifdef _WIN32
+ vtkDICOMFilePath fp(filename);
+ const wchar_t *ufilename = fp.Wide();
+#else
+ const char *ufilename = filename;
+#endif
+
+ ifstream infile(ufilename, ios::in | ios::binary);
if (!infile.good())
- {
+ {
vtkErrorMacro("Cannot open file " << filename);
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
return 0;
- }
+ }
// header is a 512 byte block
delete [] this->RawHeader;
@@ -870,28 +882,28 @@ int vtkScancoCTReader::RequestInformation(
int fileType = 0;
unsigned long bytesRead = 0;
if (!infile.bad())
- {
+ {
bytesRead = static_cast<unsigned long>(infile.gcount());
fileType = vtkScancoCTReader::CheckVersion(this->RawHeader);
- }
+ }
if (fileType == 0)
- {
+ {
vtkErrorMacro(<< "Unrecognized header in " << filename);
this->SetErrorCode(vtkErrorCode::UnrecognizedFileTypeError);
infile.close();
return 0;
- }
+ }
int returnValue = 0;
if (fileType == 1)
- {
+ {
returnValue = this->ReadISQHeader(&infile, bytesRead);
- }
+ }
else
- {
+ {
returnValue = this->ReadAIMHeader(&infile, bytesRead);
- }
+ }
infile.close();
@@ -926,15 +938,15 @@ int vtkScancoCTReader::RequestData(
vtkInformationVector* outputVector)
{
if (this->Compression == 0)
- {
+ {
return this->Superclass::RequestData(request, inputVector, outputVector);
- }
+ }
// check whether the reader is in an error state
if (this->GetErrorCode() != vtkErrorCode::NoError)
- {
+ {
return 0;
- }
+ }
// which output port did the request come from
int outputPort =
@@ -942,9 +954,9 @@ int vtkScancoCTReader::RequestData(
// for now, this reader has only one output
if (outputPort > 0)
- {
+ {
return 1;
- }
+ }
vtkInformation* outInfo = outputVector->GetInformationObject(0);
@@ -964,19 +976,19 @@ int vtkScancoCTReader::RequestData(
const char *filename = 0;
if (this->FileNames && this->FileNames->GetNumberOfValues() == 1)
- {
+ {
filename = this->FileNames->GetValue(0);
- }
+ }
else
- {
+ {
filename = this->GetFileName();
- }
+ }
if (filename == 0)
- {
+ {
vtkErrorMacro("A FileName must be provided");
return 0;
- }
+ }
// get the pointer to the output
unsigned char *dataPtr =
@@ -985,11 +997,11 @@ int vtkScancoCTReader::RequestData(
// open the file
ifstream infile(filename, ios::in | ios::binary);
if (!infile.good())
- {
+ {
vtkErrorMacro("Cannot open file " << filename);
this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
return 0;
- }
+ }
// seek to the data
infile.seekg(this->HeaderSize);
@@ -997,10 +1009,10 @@ int vtkScancoCTReader::RequestData(
// get the size of the compressed data
int intSize = 4;
if (strcmp(this->Version, "AIMDATA_V030 ") == 0)
- {
+ {
// header uses 64-bit ints (8 bytes)
intSize = 8;
- }
+ }
// Dimensions of the data
int xsize = (extent[1] - extent[0] + 1);
@@ -1015,7 +1027,7 @@ int vtkScancoCTReader::RequestData(
size_t size = 0;
if (this->Compression == 0x00b1)
- {
+ {
// Compute the size of the binary packed data
size_t xinc = (xsize+1)/2;
size_t yinc = (ysize+1)/2;
@@ -1023,38 +1035,38 @@ int vtkScancoCTReader::RequestData(
size = xinc*yinc*zinc + 1;
input = new char[size];
infile.read(input, size);
- }
+ }
else if (this->Compression == 0x00b2 ||
this->Compression == 0x00c2)
- {
+ {
// Get the size of the compressed data
char head[8];
infile.read(head, intSize);
size = static_cast<unsigned int>(vtkScancoCTReader::DecodeInt(head));
if (intSize == 8)
- {
+ {
// Read the high word of a 64-bit int
unsigned int high = vtkScancoCTReader::DecodeInt(head + 4);
size += (static_cast<vtkTypeUInt64>(high) << 32);
- }
+ }
input = new char[size - intSize];
size -= intSize;
infile.read(input, size);
- }
+ }
// confirm that enough data was read
size_t shortread = size - infile.gcount();
if (shortread != 0)
- {
+ {
this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError);
vtkErrorMacro("File is truncated, " << shortread << " bytes are missing");
- }
+ }
// Close the file
infile.close();
if (this->Compression == 0x00b1)
- {
+ {
// Unpack binary data, each byte becomes a 2x2x2 block of voxels
size_t xinc = (xsize+1)/2;
size_t yinc = (ysize+1)/2;
@@ -1062,89 +1074,89 @@ int vtkScancoCTReader::RequestData(
v = (v == 0 ? 0x7f : v);
unsigned char bit = 0;
for (int i = 0; i < zsize; i++)
- {
+ {
bit ^= (bit & 2);
for (int j = 0; j < ysize; j++)
- {
+ {
char *inPtr = input + (i*yinc + j)*xinc;
bit ^= (bit & 1);
for (int k = 0; k < xsize; k++)
- {
+ {
unsigned char c = *inPtr;
*dataPtr++ = ((c >> bit) & 1)*v;
inPtr += (bit & 1);
bit ^= 1;
- }
- bit ^= 2;
}
- bit ^= 4;
+ bit ^= 2;
}
+ bit ^= 4;
}
+ }
else if (this->Compression == 0x00b2)
- {
+ {
// Decompress binary run-lengths
bool flip = 0;
unsigned char v = input[flip];
char *inPtr = input + 2;
size -= 2;
if (size > 0)
- {
+ {
do
- {
+ {
unsigned char l = *inPtr++;
if (l == 255)
- {
+ {
l = 254;
flip = !flip;
- }
+ }
if (l > outSize)
- {
- l = outSize;
- }
+ {
+ l = static_cast<unsigned char>(outSize);
+ }
outSize -= l;
if (l > 0)
- {
+ {
do
- {
+ {
*dataPtr++ = v;
- }
- while (--l);
}
+ while (--l);
+ }
flip = !flip;
v = input[flip];
- }
- while (--size != 0 && outSize != 0);
}
+ while (--size != 0 && outSize != 0);
}
+ }
else if (this->Compression == 0x00c2)
- {
+ {
// Decompress 8-bit run-lengths
char *inPtr = input;
size /= 2;
if (size > 0)
- {
+ {
do
- {
+ {
unsigned char l = inPtr[0];
unsigned char v = inPtr[1];
inPtr += 2;
if (l > outSize)
- {
- l = outSize;
- }
+ {
+ l = static_cast<unsigned char>(outSize);
+ }
outSize -= l;
if (l > 0)
- {
+ {
do
- {
+ {
*dataPtr++ = v;
- }
- while (--l);
}
+ while (--l);
}
- while (--size != 0 && outSize != 0);
}
+ while (--size != 0 && outSize != 0);
}
+ }
delete [] input;
diff --git a/Source/vtkScancoCTReader.h b/Source/vtkScancoCTReader.h
index b6780b5..1e39691 100644
--- a/Source/vtkScancoCTReader.h
+++ b/Source/vtkScancoCTReader.h
@@ -2,7 +2,7 @@
Program: DICOM for VTK
- Copyright (c) 2015 David Gobbi
+ Copyright (c) 2015-2016 David Gobbi
All rights reserved.
See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
@@ -11,22 +11,24 @@
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
-// .NAME vtkScancoCTReader - Read SCANCO ISQ and AIM medical image files
-// .SECTION Description
-// This class reads ISQ and AIM files, which are used for high-resolution
-// computed tomography. The information that it provides uses different
-// units as compared to the original files: all distances are given in
-// millimeters (instead of micrometers), times are given in milliseconds
-// (instead of microseconds), voltage and current given in kV and mA
-// (instead of volts and microamps). If the scanner was calibrated, then
-// the data values can be converted to calibrated units. To convert
-// to linear attenuation coefficients [cm^-1], simply divide the data
-// values by the MuScaling. To convert to density values, multiply
-// the data values by the RescaleSlope and add the RescaleIntercept.
-// To convert to Hounsfield units, multiply by 1000/(MuScaling*MuWater)
-// and subtract 1000.
-// .SECTION Thanks
-// Created at the Calgary Image Processing and Analysis Centre (CIPAC).
+/*! \class vtkScancoCTReader
+ * \brief Read SCANCO ISQ and AIM medical image files
+ *
+ * This class reads ISQ and AIM files, which are used for high-resolution
+ * computed tomography. The information that it provides uses different
+ * units as compared to the original files: all distances are given in
+ * millimeters (instead of micrometers), times are given in milliseconds
+ * (instead of microseconds), voltage and current given in kV and mA
+ * (instead of volts and microamps). If the scanner was calibrated, then
+ * the data values can be converted to calibrated units. To convert
+ * to linear attenuation coefficients [cm^-1], simply divide the data
+ * values by the MuScaling. To convert to density values, multiply
+ * the data values by the RescaleSlope and add the RescaleIntercept.
+ * To convert to Hounsfield units, multiply by 1000/(MuScaling*MuWater)
+ * and subtract 1000.
+ *
+ * Created at the Calgary Image Processing and Analysis Centre (CIPAC).
+ */
#ifndef vtkScancoCTReader_h
#define vtkScancoCTReader_h
@@ -38,215 +40,179 @@
class VTKDICOM_EXPORT vtkScancoCTReader : public vtkImageReader2
{
public:
- // Description:
- // Static method for construction.
+ //! Static method for construction.
static vtkScancoCTReader *New();
vtkTypeMacro(vtkScancoCTReader, vtkImageReader2);
- // Description:
- // Print information about this object.
+ //! Print information about this object.
virtual void PrintSelf(ostream& os, vtkIndent indent);
- // Description:
- // Valid extensions for this file type.
+ //@{
+ //! Valid extensions for this file type.
virtual const char* GetFileExtensions() {
return ".isq .rsq .rad .aim" ; }
- // Description:
- // Return a descriptive name that might be useful in a GUI.
+ //! Return a descriptive name that might be useful in a GUI.
virtual const char* GetDescriptiveName() {
return "SCANCO MicroCT"; }
+ //@}
- // Description:
- // Return true if this reader can read the given file.
+ //@{
+ //! Return true if this reader can read the given file.
int CanReadFile(const char* filename);
+ //@}
- // Description:
- // Get a string that states the version of the file header.
+ //@{
+ //! Get a string that states the version of the file header.
const char *GetVersion() { return this->Version; }
- // Description:
- // Get the patient index from the header.
+ //! Get the patient index from the header.
int GetPatientIndex() { return this->PatientIndex; }
- // Description:
- // Get the scanner ID from the header.
+ //! Get the scanner ID from the header.
int GetScannerID() { return this->ScannerID; }
- // Description:
- // Get the creation date as a string.
+ //! Get the creation date as a string.
const char *GetCreationDate() { return this->CreationDate; }
- // Description:
- // Get the date when the data was last modified.
+ //! Get the date when the data was last modified.
const char *GetModificationDate() { return this->ModificationDate; }
- // Description:
- // Get the slice thickness in millimeters.
+ //! Get the slice thickness in millimeters.
double GetSliceThickness() { return this->SliceThickness; }
- // Description:
- // Get the slice increment in millimeters.
+ //! Get the slice increment in millimeters.
double GetSliceIncrement() { return this->SliceIncrement; }
- // Description:
- // Get the position of the first slice in millimeters.
+ //! Get the position of the first slice in millimeters.
double GetStartPosition() { return this->StartPosition; }
- // Description:
- // Get the position of the final slice in millimeters.
+ //! Get the position of the final slice in millimeters.
double GetEndPosition() { return this->EndPosition; }
- // Description:
- // Get the location of the edge of a locator scan.
+ //! Get the location of the edge of a locator scan.
double GetZPosition() { return this->ZPosition; }
- // Description:
- // Get the data range, as stored in the file header.
+ //! Get the data range, as stored in the file header.
vtkGetVector2Macro(DataRange, double);
- // Description:
- // Get the scaling factor from linear attenuation [1/cm] to data values.
+ //! Get the scaling factor from linear attenuation [1/cm] to data values.
double GetMuScaling() { return this->MuScaling; }
- // Description:
- // Get the number of samples.
+ //! Get the number of samples.
int GetNumberOfSamples() { return this->NumberOfSamples; }
- // Description:
- // Get the nubmer of projections.
+ //! Get the nubmer of projections.
int GetNumberOfProjections() { return this->NumberOfProjections; }
- // Description:
- // Get the scan distance (in millimeters).
+ //! Get the scan distance (in millimeters).
double GetScanDistance() { return this->ScanDistance; }
- // Description:
- // Get the scanner type, as an integer code.
+ //! Get the scanner type, as an integer code.
int GetScannerType() { return this->ScannerType; }
- // Description:
- // Get the sample time (in milliseconds).
+ //! Get the sample time (in milliseconds).
double GetSampleTime() { return this->SampleTime; }
- // Description:
- // Get the index measurement.
+ //! Get the index measurement.
int GetMeasurementIndex() { return this->MeasurementIndex; }
- // Description:
- // Get an integer value that identifies the site on the body.
+ //! Get an integer value that identifies the site on the body.
int GetSite() { return this->Site; }
- // Description:
- // Get the reference line (in millimeters).
+ //! Get the reference line (in millimeters).
double GetReferenceLine() { return this->ReferenceLine; }
- // Description:
- // Get an integer value that identifies the reconstruction algorithm.
+ //! Get an integer value that identifies the reconstruction algorithm.
int GetReconstructionAlg() { return this->ReconstructionAlg; }
- // Description:
- // Get a descriptive name for this scan.
+ //! Get a descriptive name for this scan.
const char *GetPatientName() { return this->PatientName; }
- // Description:
- // Get the X-ray energy (in kVp).
+ //! Get the X-ray energy (in kVp).
double GetEnergy() { return this->Energy; }
- // Description:
- // Get the X-ray intensity (in mA).
+ //! Get the X-ray intensity (in mA).
double GetIntensity() { return this->Intensity; }
- // Description:
- // Get the slope and intercept for rescaling the scalar values.
- // These values allow calibration of the data to real values.
- // Use the equation v = u*RescaleSlope + RescaleIntercept.
+ //! Get the slope and intercept for rescaling the scalar values.
+ /*!
+ * These values allow calibration of the data to real values.
+ * Use the equation v = u*RescaleSlope + RescaleIntercept.
+ */
double GetRescaleSlope() { return this->RescaleSlope; }
double GetRescaleIntercept() { return this->RescaleIntercept; }
- // Description:
- // Get the rescale type as an integer code.
+ //! Get the rescale type as an integer code.
int GetRescaleType() { return this->RescaleType; }
- // Description:
- // Get the units of the data after rescaling with slope and intercept.
+ //! Get the units of the data after rescaling with slope and intercept.
const char *GetRescaleUnits() { return this->RescaleUnits; }
- // Description:
- // Get the linear attenuation of water, in units of [1/cm].
+ //! Get the linear attenuation of water, in units of [1/cm].
double GetMuWater() { return this->MuWater; }
- // Description:
- // Get the calibration data (energy, filtration, etc.)
+ //! Get the calibration data (energy, filtration, etc.)
const char *GetCalibrationData() { return this->CalibrationData; }
- // Description:
- // Get the full scan dimensions in pixels.
+ //! Get the full scan dimensions in pixels.
vtkGetVector3Macro(ScanDimensionsPixels, int);
- // Description:
- // Get the full scan dimensions in millimeters.
+ //! Get the full scan dimensions in millimeters.
vtkGetVector3Macro(ScanDimensionsPhysical, double);
- // Description:
- // Get the raw header information (512 bytes) from the file.
+ //! Get the raw header information (512 bytes) from the file.
void *GetRawHeader() { return this->RawHeader; }
+ //@}
protected:
vtkScancoCTReader();
~vtkScancoCTReader();
- // Description:
- // Read the header information.
+ //! Read the header information.
virtual int RequestInformation(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // Read the voxel data.
+ //! Read the voxel data.
virtual int RequestData(
vtkInformation* request, vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
- // Description:
- // Initialize the header information
+ //! Initialize the header information
void InitializeHeader();
- // Description:
- // Read an ISQ header.
+ //! Read an ISQ header.
int ReadISQHeader(ifstream *file, unsigned long bytesRead);
- // Description:
- // Read AIM header.
+ //! Read AIM header.
int ReadAIMHeader(ifstream *file, unsigned long bytesRead);
- // Description:
- // Check the file header to see what type of file it is.
- // Return values are: 0 if unrecognized, 1 if ISQ/RAD,
- // 2 if AIM 020, 3 if AIM 030.
+ //! Check the file header to see what type of file it is.
+ /*!
+ * Return values are: 0 if unrecognized, 1 if ISQ/RAD,
+ * 2 if AIM 020, 3 if AIM 030.
+ */
static int CheckVersion(const char header[16]);
- // Description:
- // Convert a VMS timestamp to a calendar date.
+ //! Convert a VMS timestamp to a calendar date.
void DecodeDate(const void *data,
int& year, int& month, int& day,
int& hour, int& minute, int& second, int& millis);
- // Description:
- // Convert char data to 32-bit int (little-endian).
+ //! Convert char data to 32-bit int (little-endian).
static int DecodeInt(const void *data);
- // Description:
- // Convert char data to float (single precision).
+ //! Convert char data to float (single precision).
static float DecodeFloat(const void *data);
- // Description:
- // Convert char data to float (double precision).
+ //! Convert char data to float (double precision).
static double DecodeDouble(const void *data);
- // Description:
- // Strip a string by removing trailing whitespace.
- // The dest must have a size of at least l+1.
+ //! Strip a string by removing trailing whitespace.
+ /*!
+ * The dest must have a size of at least l+1.
+ */
static void StripString(char *dest, const char *source, size_t l);
// Header information
@@ -288,8 +254,8 @@ protected:
int Compression;
private:
- vtkScancoCTReader(const vtkScancoCTReader&); // Not implemented.
- void operator=(const vtkScancoCTReader&); // Not implemented.
+ vtkScancoCTReader(const vtkScancoCTReader&) VTK_DELETE_FUNCTION;
+ void operator=(const vtkScancoCTReader&) VTK_DELETE_FUNCTION;
};
#endif // vtkScancoCTReader_h
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 240e7c6..7f08796 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -1,9 +1,6 @@
include_directories(${DICOM_INCLUDE_DIRS})
set(BASE_LIBS vtkDICOM ${VTK_LIBS})
-if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- set(BASE_LIBS ${BASE_LIBS} ${DCMTK_charls_LIBRARY})
-endif()
add_executable(TestDICOMDictionary TestDICOMDictionary.cxx)
target_link_libraries(TestDICOMDictionary ${BASE_LIBS})
@@ -50,6 +47,11 @@ target_link_libraries(TestDICOMUtilities ${BASE_LIBS})
get_target_property(pth TestDICOMUtilities RUNTIME_OUTPUT_DIRECTORY)
add_test(TestDICOMUtilities ${pth}/TestDICOMUtilities)
+add_executable(TestDICOMFilePath TestDICOMFilePath.cxx)
+target_link_libraries(TestDICOMFilePath ${BASE_LIBS})
+get_target_property(pth TestDICOMFilePath RUNTIME_OUTPUT_DIRECTORY)
+add_test(TestDICOMFilePath ${pth}/TestDICOMFilePath)
+
if(BUILD_PYTHON_WRAPPERS)
if(NOT VTK_PYTHON_EXE)
get_target_property(WRAP_PYTHON_PATH vtkWrapPython LOCATION_<CONFIG>)
@@ -70,6 +72,27 @@ if(BUILD_PYTHON_WRAPPERS)
endif()
endif()
+if(BUILD_TCL_WRAPPERS)
+ if(CMAKE_CONFIGURATION_TYPES)
+ if(NOT VTK_TCL_EXE)
+ get_target_property(WRAP_TCL_PATH vtkWrapTcl LOCATION_<CONFIG>)
+ get_filename_component(VTK_EXE_DIR ${WRAP_TCL_PATH} PATH)
+ find_program(VTK_TCL_EXE vtk "${VTK_EXE_DIR}")
+ endif()
+ if(NOT VTK_TCL_EXE)
+ # fall back to using tclsh
+ set(VTK_TCL_EXE ${TCL_TCLSH})
+ endif()
+ add_test(TestDICOMTcl "${VTK_TCL_EXE}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMTcl.tcl")
+ else()
+ add_test(TestDICOMTcl "${TCL_TCLSH}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMTcl.tcl")
+ set_tests_properties(TestDICOMTcl PROPERTIES ENVIRONMENT
+ "TCLLIBPATH={${VTK_DIR}/Wrapping/Tcl} {${CMAKE_LIBRARY_OUTPUT_DIRECTORY}}")
+ endif()
+endif()
+
if(BUILD_JAVA_WRAPPERS)
set(_sep ":")
if(WIN32)
diff --git a/Testing/TestDICOMCharacterSet.cxx b/Testing/TestDICOMCharacterSet.cxx
index 5fa319a..80ad172 100644
--- a/Testing/TestDICOMCharacterSet.cxx
+++ b/Testing/TestDICOMCharacterSet.cxx
@@ -75,19 +75,19 @@ int main(int argc, char *argv[])
{ // test the listed encodings
for (int i = 0; ClunieText[i][0] != 0; i++)
- {
+ {
std::string name = ClunieText[i][0];
std::string utf = ClunieText[i][1];
std::string raw = ClunieText[i][2];
vtkDICOMCharacterSet cs(name);
std::string s = cs.ConvertToUTF8(raw.c_str(), raw.length());
TestAssert(s == utf);
- }
+ }
}
{ // test storing values in their native encoding in an item
for (int i = 0; ClunieText[i][0] != 0; i++)
- {
+ {
std::string name = ClunieText[i][0];
std::string utf = ClunieText[i][1];
std::string raw = ClunieText[i][2];
@@ -98,12 +98,12 @@ int main(int argc, char *argv[])
TestAssert(s == utf);
std::string t = item.GetAttributeValue(DC::PatientName).GetUTF8String(0);
TestAssert(t == utf);
- }
+ }
}
{ // test storing values in their native encoding in metadata
for (int i = 0; ClunieText[i][0] != 0; i++)
- {
+ {
std::string name = ClunieText[i][0];
std::string utf = ClunieText[i][1];
std::string raw = ClunieText[i][2];
@@ -115,12 +115,12 @@ int main(int argc, char *argv[])
TestAssert(s == utf);
std::string t = meta->GetAttributeValue(DC::PatientName).GetUTF8String(0);
TestAssert(t == utf);
- }
+ }
}
{ // test storing multiple values in their native encoding in metadata
for (int i = 0; ClunieText[i][0] != 0; i++)
- {
+ {
std::string name = ClunieText[i][0];
std::string utf = ClunieText[i][1];
std::string raw = ClunieText[i][2];
@@ -132,7 +132,7 @@ int main(int argc, char *argv[])
meta->SetAttributeValue(1, DC::PatientName, raw);
std::string s = meta->GetAttributeValue(1, DC::PatientName).AsUTF8String();
TestAssert(s == utf);
- }
+ }
}
{ // test for proper escaping of backslashes in GB18030
@@ -169,5 +169,14 @@ int main(int argc, char *argv[])
TestAssert(v.GetString(2) == "\x1b$B$d$^$@\x1b(J^\x1b$B$\x3f$m$&\x1b(J");
}
+ { // test for handling of utf-16 surrogates encoded in utf-8
+ vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_IR_192;
+ // the following string has a matched surrogate pair
+ std::string raw = "\xed\xa1\x80\xed\xb3\x8c"; // D840 DCCC
+ // case folding causes decoding + encoding
+ std::string cooked = cs.CaseFoldedUTF8(raw.data(), raw.length());
+ TestAssert(cooked == "\xf0\xa0\x83\x8c"); // 0200CC
+ }
+
return rval;
}
diff --git a/Testing/TestDICOMFilePath.cxx b/Testing/TestDICOMFilePath.cxx
new file mode 100644
index 0000000..dcd720b
--- /dev/null
+++ b/Testing/TestDICOMFilePath.cxx
@@ -0,0 +1,205 @@
+#include "vtkDICOMFilePath.h"
+
+#include <string>
+
+#include <string.h>
+#include <stdlib.h>
+
+// macro for performing tests
+#define TestAssert(t) \
+if (!(t)) \
+{ \
+ cout << exename << ": Assertion Failed: " << #t << "\n"; \
+ cout << __FILE__ << ":" << __LINE__ << "\n"; \
+ cout.flush(); \
+ rval |= 1; \
+}
+
+int main(int argc, char *argv[])
+{
+ int rval = 0;
+ const char *exename = (argc > 0 ? argv[0] : "TestDICOMFilePath");
+
+ // remove path portion of exename
+ const char *cp = exename + strlen(exename);
+ while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
+ exename = cp;
+
+ // Test common to all platforms
+
+ { // test the constructor
+ vtkDICOMFilePath path1("/hello/");
+ TestAssert(path1.AsString() == "/hello");
+ vtkDICOMFilePath path2("/");
+ TestAssert(path2.AsString() == "/");
+ vtkDICOMFilePath path3("");
+ TestAssert(path3.AsString() == "");
+ }
+
+ { // test push and pop for absolute paths
+ vtkDICOMFilePath path("/hello");
+ path.PushBack("world");
+ TestAssert(path.AsString() == "/hello/world");
+ TestAssert(path.GetBack() == "world");
+ path.PopBack();
+ path.PushBack("world/");
+ TestAssert(path.AsString() == "/hello/world");
+ TestAssert(path.GetBack() == "world");
+ path.PopBack();
+ TestAssert(path.AsString() == "/hello");
+ path.PushBack("/world");
+ TestAssert(path.AsString() == "/hello");
+ path.PushBack("world/");
+ TestAssert(path.AsString() == "/hello/world");
+ path.PushBack("/");
+ TestAssert(path.AsString() == "/hello/world");
+ path.PopBack();
+ path.PopBack();
+ TestAssert(path.AsString() == "/");
+ path.PopBack();
+ TestAssert(path.AsString() == "/");
+ TestAssert(path.IsRoot());
+ TestAssert(!path.IsEmpty());
+ }
+
+ { // test push and pop for relative paths
+ vtkDICOMFilePath path("hello");
+ path.PushBack("world");
+ TestAssert(path.AsString() == "hello/world");
+ TestAssert(path.GetBack() == "world");
+ path.PopBack();
+ TestAssert(path.AsString() == "hello");
+ path.PopBack();
+ TestAssert(path.AsString() == "");
+ path.PopBack();
+ TestAssert(path.AsString() == "");
+ TestAssert(path.IsEmpty());
+ TestAssert(!path.IsRoot());
+ }
+
+ { // test join
+ vtkDICOMFilePath path("/hello");
+ TestAssert(path.Join("world") == "/hello/world");
+ TestAssert(path.Join("/world") == "/world");
+ TestAssert(path.Join("/") == "/");
+ }
+
+ { // test extension
+ vtkDICOMFilePath path("/hello");
+ TestAssert(path.GetExtension() == "");
+ path.PushBack("world.wld");
+ TestAssert(path.GetExtension() == ".wld");
+ path.PushBack("space.tar.gz");
+ TestAssert(path.GetExtension() == ".gz");
+ path.PopExtension();
+ TestAssert(path.GetExtension() == ".tar");
+ path.PopExtension();
+ TestAssert(path.GetExtension() == "");
+ TestAssert(path.AsString() == "/hello/world.wld/space");
+ path.PushExtension("");
+ TestAssert(path.AsString() == "/hello/world.wld/space");
+ path.PushExtension(".");
+ TestAssert(path.AsString() == "/hello/world.wld/space");
+ path.PushExtension("/");
+ TestAssert(path.AsString() == "/hello/world.wld/space");
+ path.PushExtension("./");
+ TestAssert(path.AsString() == "/hello/world.wld/space");
+ path.PushExtension(".com");
+ TestAssert(path.AsString() == "/hello/world.wld/space.com");
+ }
+
+#ifdef _WIN32
+ { // test the various roots
+ TestAssert(vtkDICOMFilePath("\\").IsRoot());
+ TestAssert(vtkDICOMFilePath("/").IsRoot());
+ TestAssert(vtkDICOMFilePath("f:").IsRoot());
+ TestAssert(vtkDICOMFilePath("E:\\").IsRoot());
+ TestAssert(vtkDICOMFilePath("E:/").IsRoot());
+ TestAssert(vtkDICOMFilePath("\\\\server\\share").IsRoot());
+ TestAssert(vtkDICOMFilePath("//server/share").IsRoot());
+ }
+
+ { // test stripping of trailing slash from root
+ vtkDICOMFilePath path1("C:");
+ TestAssert(path1.AsString() == "C:");
+ vtkDICOMFilePath path2("C:\\");
+ TestAssert(path2.AsString() == "C:\\");
+ vtkDICOMFilePath path3("\\\\server\\share\\");
+ TestAssert(path3.AsString() == "\\\\server\\share");
+ }
+
+ { // test separator
+ vtkDICOMFilePath path1("");
+ path1.PushBack("hello");
+ path1.PushBack("there");
+ TestAssert(path1.AsString() == "hello/there");
+ vtkDICOMFilePath path2("\\");
+ path2.PushBack("hello");
+ path2.PushBack("there");
+ TestAssert(path2.AsString() == "\\hello\\there");
+ }
+
+ { // test special rules for device paths
+ vtkDICOMFilePath path1("E:\\hello");
+ TestAssert(path1.Join("\\") == "E:\\");
+ TestAssert(path1.Join("E:world") == "E:\\hello\\world");
+ TestAssert(path1.Join("D:world") == "D:world");
+ TestAssert(path1.Join("E:\\world") == "E:\\world");
+ vtkDICOMFilePath path2("E:");
+ TestAssert(path2.Join("\\world") == "E:\\world");
+ TestAssert(path2.Join("\\") == "E:\\");
+ path2.PushBack("D:");
+ TestAssert(path2.AsString() == "E:");
+ path2.PushBack("D:\\");
+ TestAssert(path2.AsString() == "E:");
+ path2.PushBack("D:\\hello");
+ TestAssert(path2.AsString() == "E:");
+ path2.PushBack("\\\\server\\share");
+ TestAssert(path2.AsString() == "E:");
+ path2.PushBack("\\hello");
+ TestAssert(path2.AsString() == "E:\\hello");
+ path2.PushBack("world");
+ TestAssert(path2.AsString() == "E:\\hello\\world");
+ }
+
+ { // test UNC path names
+ vtkDICOMFilePath path1("\\\\server\\share");
+ TestAssert(path1.Join("\\") == "\\");
+ TestAssert(path1.Join("\\dir") == "\\dir");
+ TestAssert(path1.Join("dir") == "\\\\server\\share\\dir");
+ vtkDICOMFilePath path2("//server/share");
+ TestAssert(path2.Join("/") == "/");
+ TestAssert(path2.Join("/dir") == "/dir");
+ TestAssert(path2.Join("dir") == "//server/share/dir");
+ vtkDICOMFilePath path3("//server/share/dir");
+ path3.PopBack();
+ TestAssert(path3.AsString() == "//server/share");
+ path3.PopBack();
+ TestAssert(path3.AsString() == "//server/share");
+ }
+
+ { // test the extended prefix
+ TestAssert(vtkDICOMFilePath("\\\\\?\\").IsRoot());
+ TestAssert(vtkDICOMFilePath("\\\\.\\").IsRoot());
+ TestAssert(vtkDICOMFilePath("\\\\\?\\D:").IsRoot());
+ TestAssert(vtkDICOMFilePath("\\\\\?\\D:\\").IsRoot());
+ TestAssert(vtkDICOMFilePath("\\\\\?\\UNC\\server\\share").IsRoot());
+ vtkDICOMFilePath path1("\\\\\?\\");
+ path1.PushBack("D:/");
+ TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+ path1.PushBack(".");
+ TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+ path1.PushBack("..");
+ TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+ path1.PushBack("hello");
+ TestAssert(path1.AsString() == "\\\\\?\\D:\\hello");
+ path1.PushBack("..");
+ TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+ path1.PushBack("hello/../world/./");
+ TestAssert(path1.AsString() == "\\\\\?\\D:\\world");
+ }
+
+#endif
+
+ return rval;
+}
diff --git a/Testing/TestDICOMMetaData.cxx b/Testing/TestDICOMMetaData.cxx
index 13a16ae..81303a2 100644
--- a/Testing/TestDICOMMetaData.cxx
+++ b/Testing/TestDICOMMetaData.cxx
@@ -106,23 +106,23 @@ int main(int argc, char *argv[])
int n = metaData->GetNumberOfDataElements();
TestAssert(n == 2);
for (int i = 0; i < n; i++)
- {
+ {
if (i == 0)
- {
+ {
TestAssert(iter->GetTag() == DC::AcquisitionDateTime);
TestAssert(iter->GetVR() == vtkDICOMVR::DT);
TestAssert(iter->GetValue().GetVL() == 26);
TestAssert(iter->GetValue().AsString() == acquisitionTime);
- }
+ }
else
- {
+ {
TestAssert(iter->GetTag() == DC::Modality);
TestAssert(iter->GetVR() == vtkDICOMVR::CS);
TestAssert(iter->GetValue().GetVL() == 2);
TestAssert(iter->GetValue().AsString() == "CT");
- }
- ++iter;
}
+ ++iter;
+ }
TestAssert(iter == iterEnd);
metaData->Clear();
@@ -136,14 +136,14 @@ int main(int argc, char *argv[])
n = metaData->GetNumberOfDataElements();
TestAssert(n == 2);
for (int i = 0; i < n; i++)
- {
+ {
if (i == 0)
- {
+ {
TestAssert(iter->GetTag() == DC::AcquisitionDateTime);
TestAssert(iter->GetValue().AsString() == acquisitionTime);
- }
+ }
else
- {
+ {
// two values multiplexed together in one value
TestAssert(iter->GetTag() == DC::Modality);
vtkDICOMValue v = iter->GetValue();
@@ -151,9 +151,9 @@ int main(int argc, char *argv[])
const vtkDICOMValue *vp = v.GetMultiplexData();
TestAssert(vp[0].AsString() == "CT");
TestAssert(vp[1].AsString() == "MR");
- }
- ++iter;
}
+ ++iter;
+ }
TestAssert(iter == iterEnd);
metaData->Clear();
@@ -166,12 +166,12 @@ int main(int argc, char *argv[])
TestAssert(iter->GetValue().AsString() == acquisitionTime);
iter = metaData->Find(DC::Modality);
if (iter != metaData->End())
- {
+ {
vtkDICOMValue v = iter->GetValue();
const vtkDICOMValue *vp = v.GetMultiplexData();
TestAssert(vp[0].AsString() == "CT");
TestAssert(vp[1].AsString() == "MR");
- }
+ }
iter = metaData->Find(DC::StudyDate);
TestAssert(iter == metaData->End());
metaData->Clear();
@@ -188,7 +188,7 @@ int main(int argc, char *argv[])
// only add one item to the outer sequence
for (int i = 0; i < 1; i++)
- {
+ {
// add the first data element to the item
vtkDICOMItem item(metaData);
item.SetAttributeValue(DC::SeriesInstanceUID,
@@ -200,7 +200,7 @@ int main(int argc, char *argv[])
// add ten items to this sequence
for (int j = 0; j < 10; j++)
- {
+ {
// create a unique InstanceUID
sprintf(instanceUID, instanceUIDFormat, 255+j);
vtkDICOMItem item2(metaData);
@@ -209,14 +209,14 @@ int main(int argc, char *argv[])
item2.SetAttributeValue(DC::ReferencedSOPInstanceUID,
vtkDICOMValue(vtkDICOMVR::UI, instanceUID));
seq2.AddItem(item2);
- }
+ }
// create the ReferencedInstanceSequence from the items
item.SetAttributeValue(DC::ReferencedInstanceSequence, seq2);
// add this sequence-containing item to the original sequence
seq.SetItem(i, item);
- }
+ }
// test nested access with tag path
metaData->SetAttributeValue(DC::ReferencedSeriesSequence, seq);
@@ -225,11 +225,11 @@ int main(int argc, char *argv[])
DC::SeriesInstanceUID));
TestAssert(v2.GetCharData() != 0);
if (v2.GetCharData())
- {
+ {
TestAssert(
strcmp(v2.GetCharData(),
"1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0);
- }
+ }
// test access two levels deep
v2 = metaData->GetAttributeValue(
@@ -238,9 +238,9 @@ int main(int argc, char *argv[])
DC::ReferencedSOPClassUID));
TestAssert(v2.GetCharData() != 0);
if (v2.GetCharData())
- {
+ {
TestAssert(strcmp(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4") == 0);
- }
+ }
metaData->Clear();
@@ -253,7 +253,7 @@ int main(int argc, char *argv[])
"1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"));
for (int j = 0; j < 10; j++)
- {
+ {
// create a unique InstanceUID
sprintf(instanceUID, instanceUIDFormat, 255+j);
metaData->SetAttributeValue(
@@ -266,7 +266,7 @@ int main(int argc, char *argv[])
DC::ReferencedInstanceSequence, j,
DC::ReferencedSOPInstanceUID),
instanceUID);
- }
+ }
// test nested access with tag path
v2 = metaData->GetAttributeValue(
@@ -274,11 +274,11 @@ int main(int argc, char *argv[])
DC::SeriesInstanceUID));
TestAssert(v2.GetCharData() != 0);
if (v2.GetCharData())
- {
+ {
TestAssert(
strcmp(v2.GetCharData(),
"1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0);
- }
+ }
// test access two levels deep
v2 = metaData->GetAttributeValue(
@@ -287,20 +287,20 @@ int main(int argc, char *argv[])
DC::ReferencedSOPClassUID));
TestAssert(v2.GetCharData() != 0);
if (v2.GetCharData())
- {
+ {
TestAssert(strcmp(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4") == 0);
- }
+ }
v2 = metaData->GetAttributeValue(
vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0,
DC::ReferencedInstanceSequence, 8,
DC::ReferencedSOPInstanceUID));
TestAssert(v2.GetCharData() != 0);
if (v2.GetCharData())
- {
+ {
TestAssert(0 == strcmp(
v2.GetCharData(),
"1.2.840.113619.2.176.2025.4110284.7408.1276101323.263"));
- }
+ }
metaData->Clear();
@@ -410,11 +410,11 @@ int main(int argc, char *argv[])
TestAssert(!v2.IsValid());
v2 = metaData->GetAttributeValue(vtkDICOMTagPath(DC::SeriesInstanceUID));
if (v2.GetCharData())
- {
+ {
TestAssert(
strcmp(v2.GetCharData(),
"1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0);
- }
+ }
// test using a tag path with a private sequence
metaData->SetAttributeValue(
@@ -465,12 +465,12 @@ int main(int argc, char *argv[])
DC::SeriesInstanceUID),
"1.2.840.113619.2.176.2025.4110284.747");
for (int i = 0; i < 3; i++)
- {
+ {
v2 = metaData->GetAttributeValue(i,
vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0,
DC::SeriesInstanceUID));
TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.747");
- }
+ }
metaData->Clear();
diff --git a/Testing/TestDICOMSequence.cxx b/Testing/TestDICOMSequence.cxx
index 19bf0c3..741615a 100644
--- a/Testing/TestDICOMSequence.cxx
+++ b/Testing/TestDICOMSequence.cxx
@@ -24,13 +24,13 @@ bool StringsEqual(const char *s1, const char *s2)
{
bool result = true;
if (s1 != s2)
- {
+ {
result = false;
if (s1 != 0 && s2 != 0)
- {
+ {
result = (strcmp(s1, s2) == 0);
- }
}
+ }
return result;
}
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
// only add one item to the sequence
for (int i = 0; i < 1; i++)
- {
+ {
// add the first data element to the item
vtkDICOMItem item;
item.SetAttributeValue(DC::SeriesInstanceUID,
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
// add ten items to this sequence
for (int j = 0; j < 10; j++)
- {
+ {
// create a unique InstanceUID
sprintf(instanceUID, instanceUIDFormat, 255+j);
vtkDICOMItem item2;
@@ -78,17 +78,17 @@ int main(int argc, char *argv[])
item2.SetAttributeValue(DC::ReferencedSOPInstanceUID,
vtkDICOMValue(vtkDICOMVR::UI, instanceUID));
seq2.AddItem(item2);
- }
+ }
// create the ReferencedInstanceSequence from the items
item.SetAttributeValue(DC::ReferencedInstanceSequence, seq2);
// add this sequence-containing item to the original sequence
seq.SetItem(i, item);
- }
+ }
// do the tests
- unsigned int n = seq.GetNumberOfItems();
+ size_t n = seq.GetNumberOfItems();
TestAssert(n == 1);
// use iterator to go through the elements in each item
@@ -104,28 +104,28 @@ int main(int argc, char *argv[])
// go through the item in ReferencedSeriesSequence
for (iter = ip1->Begin(); iter != ip1->End(); ++iter)
- {
+ {
// make sure SeriesInstanceUID was found
if (iter->GetTag() == DC::SeriesInstanceUID)
- {
+ {
found1 = true;
TestAssert(StringsEqual(iter->GetValue().GetCharData(),
"1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"));
- }
+ }
// make sure ReferencedInstanceSequence was found
if (iter->GetTag() == DC::ReferencedInstanceSequence)
- {
+ {
found2 = true;
vtkDICOMDataElementIterator iter2;
// get the nested sequence
vtkDICOMSequence v2 = iter->GetValue();
- unsigned int m = v2.GetNumberOfItems();
+ size_t m = v2.GetNumberOfItems();
TestAssert(m == 10);
// go through the 10 items in the sequence
- for (unsigned int j = 0; j < m; j++)
- {
+ for (size_t j = 0; j < m; j++)
+ {
// check the two elements in each item
const vtkDICOMItem &item = v2.GetItem(j);
TestAssert(item.GetNumberOfDataElements() == 2);
@@ -135,10 +135,10 @@ int main(int argc, char *argv[])
v3 = item.GetAttributeValue(DC::ReferencedSOPInstanceUID);
sprintf(instanceUID, instanceUIDFormat, 255+j);
TestAssert(StringsEqual(v3.GetCharData(), instanceUID));
- }
}
- fullcount++;
}
+ fullcount++;
+ }
// check that there were two elements in the ReferencedSeriesSequence item
TestAssert(fullcount == 2);
@@ -170,13 +170,13 @@ int main(int argc, char *argv[])
TestAssert(val3.GetNumberOfValues() == 0);
for (int i = 0; i < 1; i++)
- {
+ {
vtkDICOMItem item;
item.SetAttributeValue(DC::SeriesInstanceUID,
vtkDICOMValue(vtkDICOMVR::UI,
"1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"));
seq3.AddItem(item);
- }
+ }
TestAssert(seq3.GetNumberOfItems() == 1);
diff --git a/Testing/TestDICOMTcl.tcl b/Testing/TestDICOMTcl.tcl
new file mode 100644
index 0000000..33c01a8
--- /dev/null
+++ b/Testing/TestDICOMTcl.tcl
@@ -0,0 +1,13 @@
+package require vtk
+package require vtkdicom
+
+vtkDICOMMetaData meta
+vtkDICOMReader reader
+vtkDICOMWriter writer
+writer SetInputConnection [reader GetOutputPort]
+
+meta Delete
+reader Delete
+writer Delete
+
+exit 0
diff --git a/Testing/TestDICOMUtilities.cxx b/Testing/TestDICOMUtilities.cxx
index e2194f2..d4b65ba 100644
--- a/Testing/TestDICOMUtilities.cxx
+++ b/Testing/TestDICOMUtilities.cxx
@@ -54,9 +54,9 @@ int main(int argc, char *argv[])
a->SetNumberOfValues(10);
DU::GenerateUIDs(DC::SeriesInstanceUID, a);
for (int i = 0; i < 9; i++)
- {
+ {
TestAssert(DU::CompareUIDs(a->GetValue(i), a->GetValue(i+1)) < 0);
- }
+ }
}
{ // Test UID generation with given prefix
@@ -67,9 +67,9 @@ int main(int argc, char *argv[])
a->SetNumberOfValues(10);
DU::GenerateUIDs(DC::SeriesInstanceUID, a);
for (int i = 0; i < 9; i++)
- {
+ {
TestAssert(DU::CompareUIDs(a->GetValue(i), a->GetValue(i+1)) < 0);
- }
+ }
}
{ // Test DateTime generation
diff --git a/Testing/TestDICOMVR.cxx b/Testing/TestDICOMVR.cxx
index 75706dc..4bd180d 100644
--- a/Testing/TestDICOMVR.cxx
+++ b/Testing/TestDICOMVR.cxx
@@ -221,13 +221,13 @@ int main(int argc, char *argv[])
};
for (int i = 0; i < 34; i++)
- {
+ {
TestAssert(hasLongVL[i] == vrs[i].HasLongVL());
TestAssert(hasSpecificCharacterSet[i] == vrs[i].HasSpecificCharacterSet());
TestAssert(hasTextValue[i] == vrs[i].HasTextValue());
TestAssert(hasNumericValue[i] == vrs[i].HasNumericValue());
TestAssert(hasSingleValue[i] == vrs[i].HasSingleValue());
- }
+ }
}
return rval;
diff --git a/Testing/TestDICOMValue.cxx b/Testing/TestDICOMValue.cxx
index f38589f..9a1af4e 100644
--- a/Testing/TestDICOMValue.cxx
+++ b/Testing/TestDICOMValue.cxx
@@ -112,7 +112,7 @@ int main(int argc, char *argv[])
TestAssert(v.GetVL() == 10);
TestAssert(memcmp(v.GetShortData(), data, 10) == 0);
TestAssert(memcmp(v.GetUnsignedShortData(), data, 10) == 0);
- static const float fdata[5] = { 1.0, 3.5, -2.0, 6.0, 0.13 };
+ static const float fdata[5] = { 1.0f, 3.5f, -2.0f, 6.0f, 0.13f };
v = vtkDICOMValue(vtkDICOMVR::OF, fdata, 5);
TestAssert(v.GetNumberOfValues() == 5);
TestAssert(v.GetVL() == 20);
diff --git a/Utilities/makedict.py b/Utilities/makedict.py
index fdfa359..9f0ea04 100644
--- a/Utilities/makedict.py
+++ b/Utilities/makedict.py
@@ -303,13 +303,13 @@ def printbody(entry_dict, classname):
ds = "%03d" % (dn,)
print "// ----- %s -----" % (name,)
print
- print "DictEntry Dict%sContents[] = {" % (ds,)
+ print "const DictEntry Dict%sContents[] = {" % (ds,)
for l in entry_list:
print l
print "};"
for table,tagorkey in [(tag_table,"Tag"),(key_table,"Key")]:
print
- print "unsigned short Dict%s%sHashTable[] = {" % (ds,tagorkey)
+ print "const unsigned short Dict%s%sHashTable[] = {" % (ds,tagorkey)
i = 0
j = len(table) + 1
for l in table:
@@ -418,6 +418,7 @@ else:
if printheader:
printhead({"DICOM" : enum_list}, classname)
+ print "// VTK-HeaderTest-Exclude: %s.h" % (classname,)
else:
printbody({"DICOM" : (entry_list, tag_table, key_table)}, classname)
diff --git a/Utilities/nemadict.txt b/Utilities/nemadict.txt
index 92d6b3b..851bcaa 100644
--- a/Utilities/nemadict.txt
+++ b/Utilities/nemadict.txt
@@ -388,6 +388,12 @@ RetrieveAETitle
AE
1-n
+(0008,0055)
+Station AE Title
+StationAETitle
+AE
+1
+
(0008,0056)
Instance Availability
InstanceAvailability
@@ -628,6 +634,24 @@ EquivalentCodeSequence
SQ
1
+(0008,0122)
+Mapping Resource Name
+MappingResourceName
+LO
+1
+
+(0008,0123)
+Context Group Identification Sequence
+ContextGroupIdentificationSequence
+SQ
+1
+
+(0008,0124)
+Mapping Resource Identification Sequence
+MappingResourceIdentificationSequence
+SQ
+1
+
(0008,0201)
Timezone Offset From UTC
TimezoneOffsetFromUTC
@@ -958,6 +982,12 @@ ReferencedSOPSequence
SQ
1
+(0008,119A)
+Other Failures Sequence
+OtherFailuresSequence
+SQ
+1
+
(0008,1200)
Studies Containing Other Referenced Instances Sequence
StudiesContainingOtherReferencedInstancesSequence
@@ -1366,6 +1396,24 @@ IssuerOfPatientIDQualifiersSequence
SQ
1
+(0010,0026)
+Source Patient Group Identification Sequence
+SourcePatientGroupIdentificationSequence
+SQ
+1
+
+(0010,0027)
+Group of Patients Identification Sequence
+GroupOfPatientsIdentificationSequence
+SQ
+1
+
+(0010,0028)
+Subject Relative Position in Image
+SubjectRelativePositionInImage
+US
+3
+
(0010,0030)
Patient's Birth Date
PatientBirthDate
@@ -1378,6 +1426,24 @@ PatientBirthTime
TM
1
+(0010,0033)
+Patient's Birth Date in Alternative Calendar
+PatientBirthDateInAlternativeCalendar
+LO
+1
+
+(0010,0034)
+Patient's Death Date in Alternative Calendar
+PatientDeathDateInAlternativeCalendar
+LO
+1
+
+(0010,0035)
+Patient's Alternative Calendar
+PatientAlternativeCalendar
+CS
+1
+
(0010,0040)
Patient's Sex
PatientSex
@@ -1414,6 +1480,54 @@ QualityControlSubjectTypeCodeSequence
SQ
1
+(0010,0212)
+Strain Description
+StrainDescription
+UC
+1
+
+(0010,0213)
+Strain Nomenclature
+StrainNomenclature
+LO
+1
+
+(0010,0214)
+Strain Stock Number
+StrainStockNumber
+LO
+1
+
+(0010,0215)
+Strain Source Registry Code Sequence
+StrainSourceRegistryCodeSequence
+SQ
+1
+
+(0010,0216)
+Strain Stock Sequence
+StrainStockSequence
+SQ
+1
+
+(0010,0217)
+Strain Source
+StrainSource
+LO
+1
+
+(0010,0218)
+Strain Additional Information
+StrainAdditionalInformation
+UT
+1
+
+(0010,0219)
+Strain Code Sequence
+StrainCodeSequence
+SQ
+1
+
(0010,1000)
Other Patient IDs
OtherPatientIDs
@@ -1790,25 +1904,25 @@ CS
CAD File Format
CADFileFormat
ST
-1-n
+1
RET
(0014,0024)
Component Reference System
ComponentReferenceSystem
ST
-1-n
+1
RET
(0014,0025)
Component Manufacturing Procedure
ComponentManufacturingProcedure
ST
-1-n
+1
DICONDE
(0014,0028)
Component Manufacturer
ComponentManufacturer
ST
-1-n
+1
DICONDE
(0014,0030)
Material Thickness
@@ -1832,19 +1946,19 @@ DICONDE
Material Grade
MaterialGrade
ST
-1-n
+1
DICONDE
(0014,0044)
Material Properties Description
MaterialPropertiesDescription
ST
-1-n
+1
DICONDE
(0014,0045)
Material Properties File Format (Retired)
MaterialPropertiesFileFormatRetired
ST
-1-n
+1
RET
(0014,0046)
Material Notes
@@ -1876,6 +1990,60 @@ InnerDiameter
DS
1
DICONDE
+(0014,0100)
+Component Welder IDs
+ComponentWelderIDs
+LO
+1-n
+DICONDE
+(0014,0101)
+Secondary Approval Status
+SecondaryApprovalStatus
+CS
+1
+DICONDE
+(0014,0102)
+Secondary Review Date
+SecondaryReviewDate
+DA
+1
+DICONDE
+(0014,0103)
+Secondary Review Time
+SecondaryReviewTime
+TM
+1
+DICONDE
+(0014,0104)
+Secondary Reviewer Name
+SecondaryReviewerName
+PN
+1
+DICONDE
+(0014,0105)
+Repair ID
+RepairID
+ST
+1
+DICONDE
+(0014,0106)
+Multiple Component Approval Sequence
+MultipleComponentApprovalSequence
+SQ
+1
+DICONDE
+(0014,0107)
+Other Approval Status
+OtherApprovalStatus
+CS
+1-n
+DICONDE
+(0014,0108)
+Other Secondary Approval Status
+OtherSecondaryApprovalStatus
+CS
+1-n
+DICONDE
(0014,1010)
Actual Environmental Conditions
ActualEnvironmentalConditions
@@ -3070,6 +3238,12 @@ KVP
DS
1
+(0018,0061)
+
+
+DS
+1
+RET
(0018,0070)
Counts Accumulated
CountsAccumulated
@@ -3952,6 +4126,18 @@ PhosphorType
LO
1
+(0018,1271)
+Water Equivalent Diameter
+WaterEquivalentDiameter
+FD
+1
+
+(0018,1272)
+Water Equivalent Diameter Calculation Method Code Sequence
+WaterEquivalentDiameterCalculationMethodCodeSequence
+SQ
+1
+
(0018,1300)
Scan Velocity
ScanVelocity
@@ -6946,6 +7132,30 @@ DiffusionBValueZZ
FD
1
+(0018,9621)
+Functional MR Sequence
+FunctionalMRSequence
+SQ
+1
+
+(0018,9622)
+Functional Settling Phase Frames Present
+FunctionalSettlingPhaseFramesPresent
+CS
+1
+
+(0018,9623)
+Functional Sync Pulse
+FunctionalSyncPulse
+DT
+1
+
+(0018,9624)
+Settling Phase Frame
+SettlingPhaseFrame
+CS
+1
+
(0018,9701)
Decay Correction DateTime
DecayCorrectionDateTime
@@ -8867,7 +9077,7 @@ SQ
1
(0022,1527)
-Wide Field Ophthalmic Photography Threshold Quality Rating
+Wide Field Ophthalmic Photography Threshold Quality Rating
WideFieldOphthalmicPhotographyThresholdQualityRating
FL
1
@@ -12538,6 +12748,36 @@ ProcedureStepCancellationDateTime
DT
1
+(0040,4070)
+Output Destination Sequence
+OutputDestinationSequence
+SQ
+1
+
+(0040,4071)
+DICOM Storage Sequence
+DICOMStorageSequence
+SQ
+1
+
+(0040,4072)
+STOW-RS Storage Sequence
+STOWRSStorageSequence
+SQ
+1
+
+(0040,4073)
+Storage URL
+StorageURL
+UR
+1
+
+(0040,4074)
+XDS Storage Sequence
+XDSStorageSequence
+SQ
+1
+
(0040,8302)
Entrance Dose in mGy
EntranceDoseInmGy
@@ -12586,6 +12826,18 @@ RealWorldValueLUTData
FD
1-n
+(0040,9213)
+Double Float Real World Value Last Value Mapped
+DoubleFloatRealWorldValueLastValueMapped
+FD
+1
+
+(0040,9214)
+Double Float Real World Value First Value Mapped
+DoubleFloatRealWorldValueFirstValueMapped
+FD
+1
+
(0040,9216)
Real World Value First Value Mapped
RealWorldValueFirstValueMapped
@@ -15046,6 +15298,18 @@ UsedSegmentsSequence
SQ
1
+(0062,0020)
+Tracking ID
+TrackingID
+UT
+1
+
+(0062,0021)
+Tracking UID
+TrackingUID
+UI
+1
+
(0064,0002)
Deformable Registration Sequence
DeformableRegistrationSequence
@@ -15255,19 +15519,19 @@ Triangle Point Index List
TrianglePointIndexList
OW
1
-
+RET
(0066,0024)
Edge Point Index List
EdgePointIndexList
OW
1
-
+RET
(0066,0025)
Vertex Point Index List
VertexPointIndexList
OW
1
-
+RET
(0066,0026)
Triangle Strip Sequence
TriangleStripSequence
@@ -15291,7 +15555,7 @@ Primitive Point Index List
PrimitivePointIndexList
OW
1
-
+RET
(0066,002A)
Surface Count
SurfaceCount
@@ -15379,26 +15643,26 @@ FL
(0066,0040)
Long Primitive Point Index List
LongPrimitivePointIndexList
-UL
-1-n
+OL
+1
(0066,0041)
Long Triangle Point Index List
LongTrianglePointIndexList
-UL
-3-3n
+OL
+1
(0066,0042)
Long Edge Point Index List
LongEdgePointIndexList
-UL
-2-2n
+OL
+1
(0066,0043)
Long Vertex Point Index List
LongVertexPointIndexList
-UL
-1-n
+OL
+1
(0066,0101)
Track Set Sequence
@@ -16456,6 +16720,12 @@ MatrixSequence
SQ
1
+(0070,030B)
+Frame of Reference to Displayed Coordinate System Transformation Matrix
+FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix
+FD
+16
+
(0070,030C)
Frame of Reference Transformation Matrix Type
FrameOfReferenceTransformationMatrixType
@@ -16649,14 +16919,14 @@ SQ
1
(0070,1305)
-Oblique Cropping Plane
-ObliqueCroppingPlane
+Plane
+Plane
FD
4
(0070,1306)
-Oblique Cropping Plane Normal
-ObliqueCroppingPlaneNormal
+Plane Normal
+PlaneNormal
FD
3
@@ -16990,72 +17260,150 @@ SelectorAttributePrivateCreator
LO
1
+(0072,005E)
+Selector AE Value
+SelectorAEValue
+AE
+1-n
+
+(0072,005F)
+Selector AS Value
+SelectorASValue
+AS
+1-n
+
(0072,0060)
Selector AT Value
SelectorATValue
AT
1-n
+(0072,0061)
+Selector DA Value
+SelectorDAValue
+DA
+1-n
+
(0072,0062)
Selector CS Value
SelectorCSValue
CS
1-n
+(0072,0063)
+Selector DT Value
+SelectorDTValue
+DT
+1-n
+
(0072,0064)
Selector IS Value
SelectorISValue
IS
1-n
+(0072,0065)
+Selector OB Value
+SelectorOBValue
+OB
+1
+
(0072,0066)
Selector LO Value
SelectorLOValue
LO
1-n
+(0072,0067)
+Selector OF Value
+SelectorOFValue
+OF
+1
+
(0072,0068)
Selector LT Value
SelectorLTValue
LT
1
+(0072,0069)
+Selector OW Value
+SelectorOWValue
+OW
+1
+
(0072,006A)
Selector PN Value
SelectorPNValue
PN
1-n
+(0072,006B)
+Selector TM Value
+SelectorTMValue
+TM
+1-n
+
(0072,006C)
Selector SH Value
SelectorSHValue
SH
1-n
+(0072,006D)
+Selector UN Value
+SelectorUNValue
+UN
+1
+
(0072,006E)
Selector ST Value
SelectorSTValue
ST
1
+(0072,006F)
+Selector UC Value
+SelectorUCValue
+UC
+1-n
+
(0072,0070)
Selector UT Value
SelectorUTValue
UT
1
+(0072,0071)
+Selector UR Value
+SelectorURValue
+UR
+1
+
(0072,0072)
Selector DS Value
SelectorDSValue
DS
1-n
+(0072,0073)
+Selector OD Value
+SelectorODValue
+OD
+1
+
(0072,0074)
Selector FD Value
SelectorFDValue
FD
1-n
+(0072,0075)
+Selector OL Value
+SelectorOLValue
+OL
+1
+
(0072,0076)
Selector FL Value
SelectorFLValue
@@ -17830,6 +18178,90 @@ DoubleExposureFieldDelta
FD
4
+(0074,1401)
+Brachy Task Sequence
+BrachyTaskSequence
+SQ
+1
+
+(0074,1402)
+Continuation Start Total Reference Air Kerma
+ContinuationStartTotalReferenceAirKerma
+DS
+1
+
+(0074,1403)
+Continuation End Total Reference Air Kerma
+ContinuationEndTotalReferenceAirKerma
+DS
+1
+
+(0074,1404)
+Continuation Pulse Number
+ContinuationPulseNumber
+IS
+1
+
+(0074,1405)
+Channel Delivery Order Sequence
+ChannelDeliveryOrderSequence
+SQ
+1
+
+(0074,1406)
+Referenced Channel Number
+ReferencedChannelNumber
+IS
+1
+
+(0074,1407)
+Start Cumulative Time Weight
+StartCumulativeTimeWeight
+DS
+1
+
+(0074,1408)
+End Cumulative Time Weight
+EndCumulativeTimeWeight
+DS
+1
+
+(0074,1409)
+Omitted Channel Sequence
+OmittedChannelSequence
+SQ
+1
+
+(0074,140A)
+Reason for Channel Omission
+ReasonForChannelOmission
+CS
+1
+
+(0074,140B)
+Reason for Channel Omission Description
+ReasonForChannelOmissionDescription
+LO
+1
+
+(0074,140C)
+Channel Delivery Order Index
+ChannelDeliveryOrderIndex
+IS
+1
+
+(0074,140D)
+Channel Delivery Continuation Sequence
+ChannelDeliveryContinuationSequence
+SQ
+1
+
+(0074,140E)
+Omitted Application Setup Sequence
+OmittedApplicationSetupSequence
+SQ
+1
+
(0076,0001)
Implant Assembly Template Name
ImplantAssemblyTemplateName
@@ -18154,6 +18586,144 @@ ReferencedSurfaceDataSequence
SQ
1
+(0082,0001)
+Assessment Summary
+AssessmentSummary
+CS
+1
+
+(0082,0003)
+Assessment Summary Description
+AssessmentSummaryDescription
+UT
+1
+
+(0082,0004)
+Assessed SOP Instance Sequence
+AssessedSOPInstanceSequence
+SQ
+1
+
+(0082,0005)
+Referenced Comparison SOP Instance Sequence
+ReferencedComparisonSOPInstanceSequence
+SQ
+1
+
+(0082,0006)
+Number of Assessment Observations
+NumberOfAssessmentObservations
+UL
+1
+
+(0082,0007)
+Assessment Observations Sequence
+AssessmentObservationsSequence
+SQ
+1
+
+(0082,0008)
+Observation Significance
+ObservationSignificance
+CS
+1
+
+(0082,000A)
+Observation Description
+ObservationDescription
+UT
+1
+
+(0082,000C)
+Structured Constraint Observation Sequence
+StructuredContraintObservationSequence
+SQ
+1
+
+(0082,0010)
+Assessed Attribute Value Sequence
+AssessedAttributeValueSequence
+SQ
+1
+
+(0082,0016)
+Assessment Set ID
+AssessmentSetID
+LO
+1
+
+(0082,0017)
+Assessment Requester Sequence
+AssessmentRequesterSequence
+SQ
+1
+
+(0082,0018)
+Selector Attribute Name
+SelectorAttributeName
+LO
+1
+
+(0082,0019)
+Selector Attribute Keyword
+SelectorAttributeKeyword
+LO
+1
+
+(0082,0021)
+Assessment Type Code Sequence
+AssessmentTypeCodeSequence
+SQ
+1
+
+(0082,0022)
+Observation Basis Code Sequence
+ObservationBasisCodeSequence
+SQ
+1
+
+(0082,0023)
+Assessment Label
+AssessmentLabel
+LO
+1
+
+(0082,0032)
+Constraint Type
+ConstraintType
+CS
+1
+
+(0082,0033)
+Specification Selection Guidance
+SpecificationSelectionGuidance
+UT
+1
+
+(0082,0034)
+Constraint Value Sequence
+ConstraintValueSequence
+SQ
+1
+
+(0082,0035)
+Recommended Default Value Sequence
+RecommendedDefaultValueSequence
+SQ
+1
+
+(0082,0036)
+Constraint Violation Significance
+ConstraintViolationSignificance
+CS
+1
+
+(0082,0037)
+Constraint Violation Condition
+ConstraintViolationCondition
+UT
+1
+
(0088,0130)
Storage Media File-set ID
StorageMediaFileSetID
@@ -18286,6 +18856,12 @@ CertifiedTimestamp
OB
1
+(0400,0315)
+
+
+FL
+1
+RET
(0400,0401)
Digital Signature Purpose Code Sequence
DigitalSignaturePurposeCodeSequence
@@ -18897,7 +19473,7 @@ Destination AE
DestinationAE
AE
1
-RET
+
(2100,0160)
Owner ID
OwnerID
@@ -20662,6 +21238,24 @@ AverageBeamDosePointSSD
FL
1
+(300A,0090)
+Beam Dose Type
+BeamDoseType
+CS
+1
+
+(300A,0091)
+Alternate Beam Dose
+AlternateBeamDose
+DS
+1
+
+(300A,0092)
+Alternate Beam Dose Type
+AlternateBeamDoseType
+CS
+1
+
(300A,00A0)
Number of Brachy Application Setups
NumberOfBrachyApplicationSetups
@@ -21275,8 +21869,8 @@ DS
1
(300A,0131)
-Average Beam Dose Point Source to External Contour Surface Distance
-AverageBeamDosePointSourceToExternalContourSurfaceDistance
+Average Beam Dose Point Source to External Contour Distance
+AverageBeamDosePointSourceToExternalContourDistance
FL
1
@@ -21346,6 +21940,42 @@ GantryPitchAngleTolerance
FL
1
+(300A,0150)
+Fixation Eye
+FixationEye
+CS
+1
+
+(300A,0151)
+Chair Head Frame Position
+ChairHeadFramePosition
+DS
+1
+
+(300A,0152)
+Head Fixation Angle Tolerance
+HeadFixationAngleTolerance
+DS
+1
+
+(300A,0153)
+Chair Head Frame Position Tolerance
+ChairHeadFramePositionTolerance
+DS
+1
+
+(300A,0154)
+Fixation Light Azimuthal Angle Tolerance
+FixationLightAzimuthalAngleTolerance
+DS
+1
+
+(300A,0155)
+Fixation Light Polar Angle Tolerance
+FixationLightPolarAngleTolerance
+DS
+1
+
(300A,0180)
Patient Setup Sequence
PatientSetupSequence
@@ -21988,6 +22618,12 @@ ScanMode
CS
1
+(300A,0309)
+Modulated Scan Mode Type
+ModulatedScanModeType
+CS
+1
+
(300A,030A)
Virtual Source-Axis Distances
VirtualSourceAxisDistances
@@ -22150,6 +22786,12 @@ PatientSupportAccessoryCode
LO
1
+(300A,0355)
+Tray Accessory Code
+TrayAccessoryCode
+LO
+1
+
(300A,0356)
Fixation Light Azimuthal Angle
FixationLightAzimuthalAngle
@@ -22252,18 +22894,36 @@ ScanSpotTuneID
SH
1
+(300A,0391)
+Scan Spot Prescribed Indices
+ScanSpotPrescribedIndices
+IS
+1-n
+
(300A,0392)
Number of Scan Spot Positions
NumberOfScanSpotPositions
IS
1
+(300A,0393)
+Scan Spot Reordered
+ScanSpotReordered
+CS
+1
+
(300A,0394)
Scan Spot Position Map
ScanSpotPositionMap
FL
1-n
+(300A,0395)
+Scan Spot Reordering Allowed
+ScanSpotReorderingAllowed
+CS
+1
+
(300A,0396)
Scan Spot Meterset Weights
ScanSpotMetersetWeights
@@ -22468,6 +23128,78 @@ DeviceMotionParameterCodeSequence
SQ
1
+(300A,0501)
+Distal Depth Fraction
+DistalDepthFraction
+FL
+1
+
+(300A,0502)
+Distal Depth
+DistalDepth
+FL
+1
+
+(300A,0503)
+Nominal Range Modulation Fractions
+NominalRangeModulationFractions
+FL
+2
+
+(300A,0504)
+Nominal Range Modulated Region Depths
+NominalRangeModulatedRegionDepths
+FL
+2
+
+(300A,0505)
+Depth Dose Parameters Sequence
+DepthDoseParametersSequence
+SQ
+1
+
+(300A,0506)
+Delivered Depth Dose Parameters Sequence
+DeliveredDepthDoseParametersSequence
+SQ
+1
+
+(300A,0507)
+Delivered Distal Depth Fraction
+DeliveredDistalDepthFraction
+FL
+1
+
+(300A,0508)
+Delivered Distal Depth
+DeliveredDistalDepth
+FL
+1
+
+(300A,0509)
+Delivered Nominal Range Modulation Fractions
+DeliveredNominalRangeModulationFractions
+FL
+2
+
+(300A,0510)
+Delivered Nominal Range Modulated Region Depths
+DeliveredNominalRangeModulatedRegionDepths
+FL
+2
+
+(300A,0511)
+Delivered Reference Dose Definition
+DeliveredReferenceDoseDefinition
+CS
+1
+
+(300A,0512)
+Reference Dose Definition
+ReferenceDoseDefinition
+CS
+1
+
(300C,0002)
Referenced RT Plan Sequence
ReferencedRTPlanSequence
diff --git a/Utilities/nemauids.txt b/Utilities/nemauids.txt
index 7f3d670..af2ea9f 100644
--- a/Utilities/nemauids.txt
+++ b/Utilities/nemauids.txt
@@ -267,6 +267,9 @@ PS 3.6
Basic Study Content Notification SOP Class (Retired)
SOP Class
PS3.4
+1.2.840.10008.1.20
+Papyrus 3 Implicit VR Little Endian (Retired)
+Transfer Syntax
1.2.840.10008.1.20.1
Storage Commitment Push Model SOP Class
SOP Class
@@ -307,6 +310,26 @@ PS 3.6
DICOM Controlled Terminology
Coding Scheme
PS3.16
+1.2.840.10008.2.16.5
+Adult Mouse Anatomy Ontology
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.6
+Uberon Ontology
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.7
+Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN)
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.8
+Mouse Genome Initiative (MGI)
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.9
+PubChem Compound CID
+Coding Scheme
+PS3.16
1.2.840.10008.3.1.1.1
DICOM Application Context Name
Application Context Name
@@ -687,6 +710,10 @@ PS3.4
X-Ray Angiographic Bi-Plane Image Storage (Retired)
SOP Class
PS3.4
+1.2.840.10008.5.1.4.1.1.12.77
+1.2.840.10008.5.1.4.1.1.12.77 (Retired)
+SOP Class
+PS3.4
1.2.840.10008.5.1.4.1.1.13.1.1
X-Ray 3D Angiographic Image Storage
SOP Class
@@ -723,6 +750,10 @@ PS3.4
Parametric Map Storage
SOP Class
PS3.4
+1.2.840.10008.5.1.4.1.1.40
+1.2.840.10008.5.1.4.1.1.40 (Retired)
+PS3.4
+SOP Class
1.2.840.10008.5.1.4.1.1.66
Raw Data Storage
SOP Class
@@ -748,7 +779,7 @@ Surface Segmentation Storage
SOP Class
PS3.4
1.2.840.10008.5.1.4.1.1.66.6
-Tractography Results
+Tractography Results Storage
SOP Class
PS3.4
1.2.840.10008.5.1.4.1.1.67
@@ -943,6 +974,14 @@ PS3.4
Implantation Plan SR Storage
SOP Class
PS3.4
+1.2.840.10008.5.1.4.1.1.88.71
+Acquisition Context SR Storage
+SOP Class
+PS3.4
+1.2.840.10008.5.1.4.1.1.90.1
+Content Assessment Results Storage
+SOP Class
+PS3.4
1.2.840.10008.5.1.4.1.1.104.1
Encapsulated PDF Storage
SOP Class
@@ -1187,6 +1226,10 @@ PS3.4
RT Ion Machine Verification
SOP Class
PS3.4
+1.2.840.10008.5.1.4.34.10
+RT Brachy Application Setup Delivery Instruction Storage
+SOP Class
+PS3.4
1.2.840.10008.5.1.4.37.1
General Relevant Patient Information Query
SOP Class
@@ -2192,7 +2235,7 @@ CID 3677
Summary Codes ECG
1.2.840.10008.6.1.192
CID 3678
-Qt Correction Algorithms
+QT Correction Algorithms
1.2.840.10008.6.1.193
CID 3679
ECG Morphology Descriptions (Retired)
@@ -2336,7 +2379,7 @@ CID 3742
Medication Administration, PCI
1.2.840.10008.6.1.240
CID 3743
-Clopidogrel/ticlopidine Administration
+Clopidogrel/Ticlopidine Administration
1.2.840.10008.6.1.241
CID 3744
EF Testing Method
@@ -2447,7 +2490,7 @@ CID 3820
Non-invasive Vascular Procedures
1.2.840.10008.6.1.277
CID 3821
-Papillary Muscle Included/excluded
+Papillary Muscle Included/Excluded
1.2.840.10008.6.1.278
CID 3823
Respiratory Status
@@ -2522,7 +2565,7 @@ CID 4017
Anatomic Region Modifier for Intra-oral Radiography
1.2.840.10008.6.1.302
CID 4018
-Primary Anatomic Structure for Intra-oral Radiography (permanent Dentition - Designation of Teeth)
+Primary Anatomic Structure for Intra-oral Radiography (Permanent Dentition - Designation of Teeth)
1.2.840.10008.6.1.303
CID 4019
Primary Anatomic Structure for Intra-oral Radiography (Deciduous Dentition - Designation of Teeth)
@@ -2555,7 +2598,7 @@ CID 4042
XA/XRF Anatomy Imaged
1.2.840.10008.6.1.313
CID 4050
-Drug Or Contrast Agent Characteristics
+Drug or Contrast Agent Characteristics
1.2.840.10008.6.1.314
CID 4051
General Devices
@@ -2609,103 +2652,103 @@ CID 6000
Overall Breast Composition
1.2.840.10008.6.1.331
CID 6001
-Overall Breast Composition From BI-RADS(R)
+Overall Breast Composition from BI-RADS(R)
1.2.840.10008.6.1.332
CID 6002
-Change Since Last Mammogram Or Prior Surgery
+Change Since Last Mammogram or Prior Surgery
1.2.840.10008.6.1.333
CID 6003
-Change Since Last Mammogram Or Prior Surgery From BI-RADS(R)
+Change Since Last Mammogram or Prior Surgery from BI-RADS(R)
1.2.840.10008.6.1.334
CID 6004
Mammography Characteristics of Shape
1.2.840.10008.6.1.335
CID 6005
-Characteristics of Shape From BI-RADS(R)
+Characteristics of Shape from BI-RADS(R)
1.2.840.10008.6.1.336
CID 6006
Mammography Characteristics of Margin
1.2.840.10008.6.1.337
CID 6007
-Characteristics of Margin From BI-RADS(R)
+Characteristics of Margin from BI-RADS(R)
1.2.840.10008.6.1.338
CID 6008
Density Modifier
1.2.840.10008.6.1.339
CID 6009
-Density Modifier From BI-RADS(R)
+Density Modifier from BI-RADS(R)
1.2.840.10008.6.1.340
CID 6010
Mammography Calcification Types
1.2.840.10008.6.1.341
CID 6011
-Calcification Types From BI-RADS(R)
+Calcification Types from BI-RADS(R)
1.2.840.10008.6.1.342
CID 6012
Calcification Distribution Modifier
1.2.840.10008.6.1.343
CID 6013
-Calcification Distribution Modifier From BI-RADS(R)
+Calcification Distribution Modifier from BI-RADS(R)
1.2.840.10008.6.1.344
CID 6014
Mammography Single Image Finding
1.2.840.10008.6.1.345
CID 6015
-Single Image Finding From BI-RADS(R)
+Single Image Finding from BI-RADS(R)
1.2.840.10008.6.1.346
CID 6016
Mammography Composite Feature
1.2.840.10008.6.1.347
CID 6017
-Composite Feature From BI-RADS(R)
+Composite Feature from BI-RADS(R)
1.2.840.10008.6.1.348
CID 6018
Clockface Location or Region
1.2.840.10008.6.1.349
CID 6019
-Clockface Location Or Region From BI-RADS(R)
+Clockface Location or Region from BI-RADS(R)
1.2.840.10008.6.1.350
CID 6020
Quadrant Location
1.2.840.10008.6.1.351
CID 6021
-Quadrant Location From BI-RADS(R)
+Quadrant Location from BI-RADS(R)
1.2.840.10008.6.1.352
CID 6022
Side
1.2.840.10008.6.1.353
CID 6023
-Side From BI-RADS(R)
+Side from BI-RADS(R)
1.2.840.10008.6.1.354
CID 6024
Depth
1.2.840.10008.6.1.355
CID 6025
-Depth From BI-RADS(R)
+Depth from BI-RADS(R)
1.2.840.10008.6.1.356
CID 6026
Mammography Assessment
1.2.840.10008.6.1.357
CID 6027
-Assessment From BI-RADS(R)
+Assessment from BI-RADS(R)
1.2.840.10008.6.1.358
CID 6028
Mammography Recommended Follow-up
1.2.840.10008.6.1.359
CID 6029
-Recommended Follow-up From BI-RADS(R)
+Recommended Follow-up from BI-RADS(R)
1.2.840.10008.6.1.360
CID 6030
Mammography Pathology Codes
1.2.840.10008.6.1.361
CID 6031
-Benign Pathology Codes From BI-RADS(R)
+Benign Pathology Codes from BI-RADS(R)
1.2.840.10008.6.1.362
CID 6032
-High Risk Lesions Pathology Codes From BI-RADS(R)
+High Risk Lesions Pathology Codes from BI-RADS(R)
1.2.840.10008.6.1.363
CID 6033
-Malignant Pathology Codes From BI-RADS(R)
+Malignant Pathology Codes from BI-RADS(R)
1.2.840.10008.6.1.364
CID 6034
Intended Use of CAD Output
@@ -2768,7 +2811,7 @@ CID 6054
Breast Imaging Findings
1.2.840.10008.6.1.384
CID 6055
-Breast Clinical Finding Or Indicated Problem
+Breast Clinical Finding or Indicated Problem
1.2.840.10008.6.1.385
CID 6056
Associated Findings for Breast
@@ -2879,22 +2922,22 @@ CID 6100
Chest Component Categories
1.2.840.10008.6.1.421
CID 6101
-Chest Finding Or Feature
+Chest Finding or Feature
1.2.840.10008.6.1.422
CID 6102
-Chest Finding Or Feature Modifier
+Chest Finding or Feature Modifier
1.2.840.10008.6.1.423
CID 6103
-Abnormal Lines Finding Or Feature
+Abnormal Lines Finding or Feature
1.2.840.10008.6.1.424
CID 6104
-Abnormal Opacity Finding Or Feature
+Abnormal Opacity Finding or Feature
1.2.840.10008.6.1.425
CID 6105
-Abnormal Lucency Finding Or Feature
+Abnormal Lucency Finding or Feature
1.2.840.10008.6.1.426
CID 6106
-Abnormal Texture Finding Or Feature
+Abnormal Texture Finding or Feature
1.2.840.10008.6.1.427
CID 6107
Width Descriptor
@@ -2903,22 +2946,22 @@ CID 6108
Chest Anatomic Structure Abnormal Distribution
1.2.840.10008.6.1.429
CID 6109
-Radiographic Anatomy Finding Or Feature
+Radiographic Anatomy Finding or Feature
1.2.840.10008.6.1.430
CID 6110
-Lung Anatomy Finding Or Feature
+Lung Anatomy Finding or Feature
1.2.840.10008.6.1.431
CID 6111
-Bronchovascular Anatomy Finding Or Feature
+Bronchovascular Anatomy Finding or Feature
1.2.840.10008.6.1.432
CID 6112
-Pleura Anatomy Finding Or Feature
+Pleura Anatomy Finding or Feature
1.2.840.10008.6.1.433
CID 6113
-Mediastinum Anatomy Finding Or Feature
+Mediastinum Anatomy Finding or Feature
1.2.840.10008.6.1.434
CID 6114
-Osseous Anatomy Finding Or Feature
+Osseous Anatomy Finding or Feature
1.2.840.10008.6.1.435
CID 6115
Osseous Anatomy Modifiers
@@ -3170,7 +3213,7 @@ CID 7453
Performing Roles
1.2.840.10008.6.1.518
CID 7454
-Species
+Animal Taxonomic Rank Values
1.2.840.10008.6.1.519
CID 7455
Sex
@@ -3242,7 +3285,7 @@ CID 10008
Dose Related Distance Measurements
1.2.840.10008.6.1.542
CID 10009
-Measured/calculated
+Measured/Calculated
1.2.840.10008.6.1.543
CID 10010
Dose Measurement Devices
@@ -3335,7 +3378,7 @@ CID 12105
Intracranial Cerebral Vessels
1.2.840.10008.6.1.573
CID 12106
-Intracranial Cerebral Vessels (unilateral)
+Intracranial Cerebral Vessels (Unilateral)
1.2.840.10008.6.1.574
CID 12107
Upper Extremity Arteries
@@ -3350,16 +3393,16 @@ CID 12110
Lower Extremity Veins
1.2.840.10008.6.1.578
CID 12111
-Abdominal Arteries (lateral)
+Abdominal Arteries (Lateral)
1.2.840.10008.6.1.579
CID 12112
-Abdominal Arteries (unilateral)
+Abdominal Arteries (Unilateral)
1.2.840.10008.6.1.580
CID 12113
-Abdominal Veins (lateral)
+Abdominal Veins (Lateral)
1.2.840.10008.6.1.581
CID 12114
-Abdominal Veins (unilateral)
+Abdominal Veins (Unilateral)
1.2.840.10008.6.1.582
CID 12115
Renal Vessels
@@ -3689,10 +3732,10 @@ CID 6200
Colon Overall Assessment
1.2.840.10008.6.1.788
CID 6201
-Colon Finding Or Feature
+Colon Finding or Feature
1.2.840.10008.6.1.789
CID 6202
-Colon Finding Or Feature Modifier
+Colon Finding or Feature Modifier
1.2.840.10008.6.1.790
CID 6203
Colon Non-lesion Object Type
@@ -3930,7 +3973,7 @@ CID 12288
Cardiac Ultrasound Outflow Tracts Finding Sites
1.2.840.10008.6.1.869
CID 12289
-Cardiac Ultrasound Semilunar Valves, Annulate and Sinuses Finding Sites
+Cardiac Ultrasound Semilunar Valves, Annulus and Sinuses Finding Sites
1.2.840.10008.6.1.870
CID 12290
Cardiac Ultrasound Pulmonary Arteries Finding Sites
@@ -3978,7 +4021,7 @@ CID 4239
Anterior Chamber Depth Definition
1.2.840.10008.6.1.886
CID 4240
-Ophthalmic Measurement Or Calculation Data Source
+Ophthalmic Measurement or Calculation Data Source
1.2.840.10008.6.1.887
CID 4241
Ophthalmic Axial Length Selection Method
@@ -3987,7 +4030,7 @@ Ophthalmic Axial Length Selection Method
1.2.840.10008.6.1.889
CID 4243
-Ophthalmic Axial Length Quality Metric Type
+Ophthalmic Quality Metric Type
1.2.840.10008.6.1.890
CID 4244
Ophthalmic Agent Concentration Units
@@ -4329,7 +4372,7 @@ CID 12021
Fetal Long Bone Anatomic Sites
1.2.840.10008.6.1.1007
CID 12022
-Fetal Cranium Bone Anatomic Sites
+Fetal Cranium Anatomic Sites
1.2.840.10008.6.1.1008
CID 12023
Pelvis and Uterus Anatomic Sites
@@ -4377,13 +4420,13 @@ CID 4026
Primary Anatomic Structure for Intra-oral and Craniofacial Radiography
1.2.840.10008.6.1.1023
CID 9401
-IEC6127 Device Position Parameters
+IEC61217 Device Position Parameters
1.2.840.10008.6.1.1024
CID 9402
-IEC6127 Gantry Position Parameters
+IEC61217 Gantry Position Parameters
1.2.840.10008.6.1.1025
CID 9403
-IEC6127 Patient Support Position Parameters
+IEC61217 Patient Support Position Parameters
1.2.840.10008.6.1.1026
CID 7035
Actionable Finding Classification
@@ -4495,3 +4538,177 @@ Diffusion Tractography Algorithm Families
1.2.840.10008.6.1.1062
CID 7263
Diffusion Tractography Measurement Types
+1.2.840.10008.6.1.1063
+CID 7490
+Research Animal Source Registries
+1.2.840.10008.6.1.1064
+CID 231
+Yes-No Only
+1.2.840.10008.6.1.1065
+CID 601
+Biosafety Levels
+1.2.840.10008.6.1.1066
+CID 602
+Biosafety Control Reasons
+1.2.840.10008.6.1.1067
+CID 7457
+Sex - Male Female or Both
+1.2.840.10008.6.1.1068
+CID 603
+Animal Room Types
+1.2.840.10008.6.1.1069
+CID 604
+Device Reuse
+1.2.840.10008.6.1.1070
+CID 605
+Animal Bedding Material
+1.2.840.10008.6.1.1071
+CID 606
+Animal Shelter Types
+1.2.840.10008.6.1.1072
+CID 607
+Animal Feed Types
+1.2.840.10008.6.1.1073
+CID 608
+Animal Feed Sources
+1.2.840.10008.6.1.1074
+CID 609
+Animal Feeding Methods
+1.2.840.10008.6.1.1075
+CID 610
+Water Types
+1.2.840.10008.6.1.1076
+CID 611
+Anesthesia Category Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1077
+CID 612
+Anesthesia Category Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1078
+CID 613
+Anesthesia Induction Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1079
+CID 614
+Anesthesia Induction Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1080
+CID 615
+Anesthesia Maintenance Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1081
+CID 616
+Anesthesia Maintenance Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1082
+CID 617
+Airway Management Method Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1083
+CID 618
+Airway Management Method Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1084
+CID 619
+Airway Management Sub-Method Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1085
+CID 620
+Airway Management Sub-Method Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1086
+CID 621
+Medication Type Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1087
+CID 622
+Medication Type Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1088
+CID 623
+Medication for Small Animal Anesthesia
+1.2.840.10008.6.1.1089
+CID 624
+Inhalational Anesthesia Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1090
+CID 625
+Injectable Anesthesia Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1091
+CID 626
+Premedication Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1092
+CID 627
+Neuromuscular Blocking Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1093
+CID 628
+Ancillary Medications for Small Animal Anesthesia
+1.2.840.10008.6.1.1094
+CID 629
+Carrier Gases for Small Animal Anesthesia
+1.2.840.10008.6.1.1095
+CID 630
+Local Anesthetics for Small Animal Anesthesia
+1.2.840.10008.6.1.1096
+CID 631
+Phase of Procedure Requiring Anesthesia
+1.2.840.10008.6.1.1097
+CID 632
+Phase of Surgical Procedure Requiring Anesthesia
+1.2.840.10008.6.1.1098
+CID 633
+Phase of Imaging Procedure Requiring Anesthesia
+1.2.840.10008.6.1.1099
+CID 634
+Phase of Animal Handling
+1.2.840.10008.6.1.1100
+CID 635
+Heating Method
+1.2.840.10008.6.1.1101
+CID 636
+Temperature Sensor Device Component Type for Small Animal Procedures
+1.2.840.10008.6.1.1102
+CID 637
+Exogenous Substance Types
+1.2.840.10008.6.1.1103
+CID 638
+Exogenous Substance
+1.2.840.10008.6.1.1104
+CID 639
+Tumor Graft Histologic Type
+1.2.840.10008.6.1.1105
+CID 640
+Fibrils
+1.2.840.10008.6.1.1106
+CID 641
+Viruses
+1.2.840.10008.6.1.1107
+CID 642
+Cytokines
+1.2.840.10008.6.1.1108
+CID 643
+Toxins
+1.2.840.10008.6.1.1109
+CID 644
+Exogenous Substance Administration Sites
+1.2.840.10008.6.1.1110
+CID 645
+Exogenous Substance Tissue of Origin
+1.2.840.10008.6.1.1111
+CID 646
+Preclinical Small Animal Imaging Procedures
+1.2.840.10008.6.1.1112
+CID 647
+Position Reference Indicator for Frame of Reference
+1.2.840.10008.6.1.1113
+CID 241
+Present-Absent Only
+1.2.840.10008.6.1.1114
+CID 10024
+Water Equivalent Diameter Method
+1.2.840.10008.6.1.1115
+CID 7022
+Radiotherapy Purposes of Reference
+1.2.840.10008.6.1.1116
+CID 701
+Content Assessment Types
+1.2.840.10008.6.1.1117
+CID 702
+RT Content Assessment Types
+1.2.840.10008.6.1.1118
+CID 703
+Basis of Assessment
+1.2.840.10008.6.1.1119
+CID 7449
+Reader Specialty
+1.2.840.10008.6.1.1120
+CID 9233
+Requested Report Types
diff --git a/Utilities/parseuid.py b/Utilities/parseuid.py
index 9d7ea8e..c26b32c 100644
--- a/Utilities/parseuid.py
+++ b/Utilities/parseuid.py
@@ -86,7 +86,7 @@ print "/*=======================================================================
print "This is an automatically generated file. Include errata for any changes."
print "=========================================================================*/"
-print "\n#include \"vtkDICOMUtilities.h\""
+print "\n#include \"vtkDICOMUtilitiesUIDTable.h\""
print "\nnamespace {\n"
@@ -123,7 +123,7 @@ def recursetrie(node, counter):
for child in node[0]:
recursetrie(child, counter)
-print "\nUIDTableEntry UIDTable[] = {"
+print "\nconst UIDTableEntry UIDTable[] = {"
recursetrie(root, [0])
printnode(root)
recursetrie(root, None)
@@ -131,7 +131,7 @@ print "};"
getterfunc = \
"""
-UIDTableEntry *GetUIDTableEntry(const char *uid)
+const UIDTableEntry *GetUIDTableEntry(const char *uid)
{
if (uid == 0)
{
@@ -150,7 +150,7 @@ UIDTableEntry *GetUIDTableEntry(const char *uid)
return 0;
}
- UIDTableEntry *table = UIDTable;
+ const UIDTableEntry *table = UIDTable;
while (*uid != '\\0')
{
int i = -1;
@@ -202,7 +202,7 @@ exportedcode = \
const char *vtkDICOMUtilities::GetUIDName(const char *uid)
{
const char *result = "";
- UIDTableEntry *table = GetUIDTableEntry(uid);
+ const UIDTableEntry *table = GetUIDTableEntry(uid);
if (table)
{
if (table->Name)
@@ -216,7 +216,7 @@ const char *vtkDICOMUtilities::GetUIDName(const char *uid)
unsigned short vtkDICOMUtilities::GetCIDFromUID(const char *uid)
{
unsigned short result = 0;
- UIDTableEntry *table = GetUIDTableEntry(uid);
+ const UIDTableEntry *table = GetUIDTableEntry(uid);
if (table)
{
result = table->CID;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/vtk-dicom.git
More information about the debian-med-commit
mailing list