[med-svn] [Git][med-team/vtk-dicom][upstream] New upstream version 0.8.11

Gert Wollny gitlab at salsa.debian.org
Fri Nov 1 16:22:40 GMT 2019



Gert Wollny pushed to branch upstream at Debian Med / vtk-dicom


Commits:
c8b97ae1 by Gert Wollny at 2019-11-01T16:19:00Z
New upstream version 0.8.11
- - - - -


16 changed files:

- CMakeLists.txt
- DicomCli/mainmacro.cxx
- DicomCli/readquery.cxx
- Programs/dicomdump.cxx
- Source/vtkDICOMDictHash.cxx
- Source/vtkDICOMDictHash.h
- Source/vtkDICOMDirectory.cxx
- Source/vtkDICOMDirectory.h
- Source/vtkDICOMGenerator.cxx
- Source/vtkDICOMParser.cxx
- Source/vtkDICOMUtilitiesUIDTable.cxx
- Source/vtkDICOMValue.cxx
- Source/vtkDICOMValue.h
- Testing/TestDICOMValue.cxx
- Utilities/nemadict.txt
- Utilities/nemauids.txt


Changes:

=====================================
CMakeLists.txt
=====================================
@@ -14,7 +14,7 @@ include(CTest)
 # Project version
 set(DICOM_MAJOR_VERSION 0)
 set(DICOM_MINOR_VERSION 8)
-set(DICOM_PATCH_VERSION 10)
+set(DICOM_PATCH_VERSION 11)
 set(DICOM_SHORT_VERSION "${DICOM_MAJOR_VERSION}.${DICOM_MINOR_VERSION}")
 set(DICOM_VERSION "${DICOM_SHORT_VERSION}.${DICOM_PATCH_VERSION}")
 


=====================================
DicomCli/mainmacro.cxx
=====================================
@@ -335,7 +335,7 @@ bool Arguments::ExpandArgs(int argc, wchar_t *argv[], const char *passthrough)
                 // Append wildcard result to the directory.
                 wchar_t *result;
                 size_t n = 0;
-                while (data.cFileName[n] != 0 && n < MAX_PATH) {
+                while (n < MAX_PATH && data.cFileName[n] != 0) {
                   n++;
                 }
                 // Ensure that the true filename matches the wildcards.


=====================================
DicomCli/readquery.cxx
=====================================
@@ -43,6 +43,9 @@ public:
   size_t ReadLine(std::string *s);
 
 private:
+  LineReader(const LineReader&); // = delete;
+  LineReader& operator=(const LineReader&); // = delete;
+
   vtkDICOMFile *File;
   size_t BufferSize;
   unsigned char *Buffer;
@@ -340,12 +343,11 @@ bool dicomcli_readkey_query(
   // read the DICOM vr
   vtkDICOMVR vr;
 
-  size_t vrStart = s;
   size_t vrEnd = s;
   if (s < n && cp[s] == ':')
   {
     s++;
-    vrStart = s;
+    size_t vrStart = s;
     vrEnd = s;
     if (n - s >= 2)
     {
@@ -422,7 +424,6 @@ bool dicomcli_readkey_query(
     keyHasAssignment = true;
     s++;
     valueStart = s;
-    valueEnd = s;
     if (s < n && qfile && cp[s] == '\"')
     {
       char delim = cp[s++];
@@ -445,10 +446,6 @@ bool dicomcli_readkey_query(
         s++;
       }
       valueEnd = s;
-      if (s < n)
-      {
-        s++;
-      }
     }
     else
     {
@@ -526,7 +523,7 @@ bool dicomcli_readkey_query(
     }
   }
 
-  return !tagError;
+  return true;
 }
 
 bool dicomcli_readkey(


=====================================
Programs/dicomdump.cxx
=====================================
@@ -548,19 +548,6 @@ int MAINMACRO(int argc, char *argv[])
     vtkSmartPointer<vtkDICOMMetaData>::New();
   parser->SetMetaData(data);
 
-      {
-        vtkDICOMDataElementIterator iter = query.Begin();
-        vtkDICOMDataElementIterator iterEnd = query.End();
-
-        for (; iter != iterEnd; ++iter)
-        {
-          printElement(data, 0, iter, 0, 0);
-        }
-        for (size_t i = 0; i < qtlist.size(); i++)
-        {
-          std::cout << qtlist[i] << "\n";
-        }
-      }
   int m = sorter->GetNumberOfStudies();
   for (int j = 0; j < m; j++)
   {


=====================================
Source/vtkDICOMDictHash.cxx
=====================================
The diff for this file was not included because it is too large.

=====================================
Source/vtkDICOMDictHash.h
=====================================
@@ -19,6 +19,13 @@ ImplementationVersionName               = 0x00020013, // SH M1    0
 SourceApplicationEntityTitle            = 0x00020016, // AE M1    0
 SendingApplicationEntityTitle           = 0x00020017, // AE M1    0
 ReceivingApplicationEntityTitle         = 0x00020018, // AE M1    0
+RTVMetaInformationVersion               = 0x00020031, // OB M1    0
+RTVCommunicationSOPClassUID             = 0x00020032, // UI M1    0
+RTVCommunicationSOPInstanceUID          = 0x00020033, // UI M1    0
+RTVSourceIdentifier                     = 0x00020035, // OB M1    0
+RTVFlowIdentifier                       = 0x00020036, // OB M1    0
+RTVFlowRTPSamplingRate                  = 0x00020037, // UL M1    0
+RTVFlowActualFrameDuration              = 0x00020038, // FD M1    0
 PrivateInformationCreatorUID            = 0x00020100, // UI M1    0
 PrivateInformation                      = 0x00020102, // OB M1    0
 FileSetID                               = 0x00041130, // CS M1    0
@@ -40,6 +47,7 @@ ReferencedSOPInstanceUIDInFile          = 0x00041511, // UI M1    0
 ReferencedTransferSyntaxUIDInFile       = 0x00041512, // UI M1    0
 ReferencedRelatedGeneralSOPClassUIDInFile = 0x0004151A, // UI M1TN  0
 NumberOfReferences                      = 0x00041600, // UL M1    1
+CurrentFrameFunctionalGroupsSequence    = 0x00060001, // SQ M1    0
 LengthToEnd                             = 0x00080001, // UL M1    1
 SpecificCharacterSet                    = 0x00080005, // CS M1TN  0
 LanguageCodeSequence                    = 0x00080006, // SQ M1    0
@@ -714,6 +722,7 @@ CassetteID                              = 0x00181007, // LO M1    0
 GantryID                                = 0x00181008, // LO M1    0
 UniqueDeviceIdentifier                  = 0x00181009, // UT M1    0
 UDISequence                             = 0x0018100A, // SQ M1    0
+ManufacturerDeviceClassUID              = 0x0018100B, // UI M1TN  0
 SecondaryCaptureDeviceID                = 0x00181010, // LO M1    0
 HardcopyCreationDeviceID                = 0x00181011, // LO M1    1
 DateOfSecondaryCapture                  = 0x00181012, // DA M1    0
@@ -881,6 +890,15 @@ VerticesOfThePolygonalShutter           = 0x00181620, // IS M2T2N 0
 ShutterPresentationValue                = 0x00181622, // US M1    0
 ShutterOverlayGroup                     = 0x00181623, // US M1    0
 ShutterPresentationColorCIELabValue     = 0x00181624, // US M3    0
+OutlineShapeType                        = 0x00181630, // CS M1    0
+OutlineLeftVerticalEdge                 = 0x00181631, // FD M1    0
+OutlineRightVerticalEdge                = 0x00181632, // FD M1    0
+OutlineUpperHorizontalEdge              = 0x00181633, // FD M1    0
+OutlineLowerHorizontalEdge              = 0x00181634, // FD M1    0
+CenterOfCircularOutline                 = 0x00181635, // FD M2    0
+DiameterOfCircularOutline               = 0x00181636, // FD M1    0
+NumberOfPolygonalVertices               = 0x00181637, // UL M1    0
+VerticesOfThePolygonalOutline           = 0x00181638, // OF M1    0
 CollimatorShape                         = 0x00181700, // CS M1T3  0
 CollimatorLeftVerticalEdge              = 0x00181702, // IS M1    0
 CollimatorRightVerticalEdge             = 0x00181704, // IS M1    0
@@ -2165,6 +2183,18 @@ ReasonForVisit                          = 0x00321066, // UT M1    0
 ReasonForVisitCodeSequence              = 0x00321067, // SQ M1    0
 RequestedContrastAgent                  = 0x00321070, // LO M1    0
 StudyComments                           = 0x00324000, // LT M1    1
+FlowIdentifierSequence                  = 0x00340001, // SQ M1    0
+FlowIdentifier                          = 0x00340002, // OB M1    0
+FlowTransferSyntaxUID                   = 0x00340003, // UI M1    0
+FlowRTPSamplingRate                     = 0x00340004, // UL M1    0
+SourceIdentifier                        = 0x00340005, // OB M1    0
+FrameOriginTimestamp                    = 0x00340007, // OB M1    0
+IncludesImagingSubject                  = 0x00340008, // CS M1    0
+FrameUsefulnessGroupSequence            = 0x00340009, // SQ M1    0
+RealTimeBulkDataFlowSequence            = 0x0034000A, // SQ M1    0
+CameraPositionGroupSequence             = 0x0034000B, // SQ M1    0
+IncludesInformation                     = 0x0034000C, // CS M1    0
+TimeOfFrameGroupSequence                = 0x0034000D, // SQ M1    0
 ReferencedPatientAliasSequence          = 0x00380004, // SQ M1    0
 VisitStatusID                           = 0x00380008, // CS M1    0
 AdmissionID                             = 0x00380010, // LO M1    0
@@ -3728,6 +3758,9 @@ RelatedFrameOfReferenceUID              = 0x300600C2, // UI M1    1
 FrameOfReferenceTransformationType      = 0x300600C4, // CS M1    1
 FrameOfReferenceTransformationMatrix    = 0x300600C6, // DS M16   0
 FrameOfReferenceTransformationComment   = 0x300600C8, // LO M1    0
+PatientLocationCoordinatesSequence      = 0x300600C9, // SQ M1    0
+PatientLocationCoordinatesCodeSequence  = 0x300600CA, // SQ M1    0
+PatientSupportPositionSequence          = 0x300600CB, // SQ M1    0
 MeasuredDoseReferenceSequence           = 0x30080010, // SQ M1    0
 MeasuredDoseDescription                 = 0x30080012, // ST M1    0
 MeasuredDoseType                        = 0x30080014, // CS M1    0
@@ -3877,7 +3910,7 @@ NumberOfFractionPatternDigitsPerDay     = 0x300A0079, // IS M1    0
 RepeatFractionCycleLength               = 0x300A007A, // IS M1    0
 FractionPattern                         = 0x300A007B, // LT M1    0
 NumberOfBeams                           = 0x300A0080, // IS M1    0
-BeamDoseSpecificationPoint              = 0x300A0082, // DS M3    0
+BeamDoseSpecificationPoint              = 0x300A0082, // DS M3    1
 ReferencedDoseReferenceUID              = 0x300A0083, // UI M1    0
 BeamDose                                = 0x300A0084, // DS M1    0
 BeamMeterset                            = 0x300A0086, // DS M1    0
@@ -4223,6 +4256,144 @@ DeliveredNominalRangeModulationFractions = 0x300A0509, // FL M2    0
 DeliveredNominalRangeModulatedRegionDepths = 0x300A0510, // FL M2    0
 DeliveredReferenceDoseDefinition        = 0x300A0511, // CS M1    0
 ReferenceDoseDefinition                 = 0x300A0512, // CS M1    0
+RTControlPointIndex                     = 0x300A0600, // US M1    0
+RadiationGenerationModeIndex            = 0x300A0601, // US M1    0
+ReferencedDefinedDeviceIndex            = 0x300A0602, // US M1    0
+RadiationDoseIdentificationIndex        = 0x300A0603, // US M1    0
+NumberOfRTControlPoints                 = 0x300A0604, // US M1    0
+ReferencedRadiationGenerationModeIndex  = 0x300A0605, // US M1    0
+TreatmentPositionIndex                  = 0x300A0606, // US M1    0
+ReferencedDeviceIndex                   = 0x300A0607, // US M1    0
+TreatmentPositionGroupLabel             = 0x300A0608, // LO M1    0
+TreatmentPositionGroupUID               = 0x300A0609, // UI M1    0
+TreatmentPositionGroupSequence          = 0x300A060A, // SQ M1    0
+ReferencedTreatmentPositionIndex        = 0x300A060B, // US M1    0
+ReferencedRadiationDoseIdentificationIndex = 0x300A060C, // US M1    0
+RTAccessoryHolderWaterEquivalentThickness = 0x300A060D, // FD M1    0
+ReferencedRTAccessoryHolderDeviceIndex  = 0x300A060E, // US M1    0
+RTAccessoryHolderSlotExistenceFlag      = 0x300A060F, // CS M1    0
+RTAccessoryHolderSlotSequence           = 0x300A0610, // SQ M1    0
+RTAccessoryHolderSlotID                 = 0x300A0611, // LO M1    0
+RTAccessoryHolderSlotDistance           = 0x300A0612, // FD M1    0
+RTAccessorySlotDistance                 = 0x300A0613, // FD M1    0
+RTAccessoryHolderDefinitionSequence     = 0x300A0614, // SQ M1    0
+RTAccessoryDeviceSlotID                 = 0x300A0615, // LO M1    0
+RTRadiationSequence                     = 0x300A0616, // SQ M1    0
+RadiationDoseSequence                   = 0x300A0617, // SQ M1    0
+RadiationDoseIdentificationSequence     = 0x300A0618, // SQ M1    0
+RadiationDoseIdentificationLabel        = 0x300A0619, // LO M1    0
+ReferenceDoseType                       = 0x300A061A, // CS M1    0
+PrimaryDoseValueIndicator               = 0x300A061B, // CS M1    0
+DoseValuesSequence                      = 0x300A061C, // SQ M1    0
+DoseValuePurpose                        = 0x300A061D, // CS M1TN  0
+ReferenceDosePointCoordinates           = 0x300A061E, // FD M3    0
+RadiationDoseValuesParametersSequence   = 0x300A061F, // SQ M1    0
+MetersetToDoseMappingSequence           = 0x300A0620, // SQ M1    0
+ExpectedInVivoMeasurementValuesSequence = 0x300A0621, // SQ M1    0
+ExpectedInVivoMeasurementValueIndex     = 0x300A0622, // US M1    0
+RadiationDoseInVivoMeasurementLabel     = 0x300A0623, // LO M1    0
+RadiationDoseCentralAxisDisplacement    = 0x300A0624, // FD M2    0
+RadiationDoseValue                      = 0x300A0625, // FD M1    0
+RadiationDoseSourceToSkinDistance       = 0x300A0626, // FD M1    0
+RadiationDoseMeasurementPointCoordinates = 0x300A0627, // FD M3    0
+RadiationDoseSourceToExternalContourDistance = 0x300A0628, // FD M1    0
+RTToleranceSetSequence                  = 0x300A0629, // SQ M1    0
+RTToleranceSetLabel                     = 0x300A062A, // LO M1    0
+AttributeToleranceValuesSequence        = 0x300A062B, // SQ M1    0
+ToleranceValue                          = 0x300A062C, // FD M1    0
+PatientSupportPositionToleranceSequence = 0x300A062D, // SQ M1    0
+TreatmentTimeLimit                      = 0x300A062E, // FD M1    0
+CArmPhotonElectronControlPointSequence  = 0x300A062F, // SQ M1    0
+ReferencedRTRadiationSequence           = 0x300A0630, // SQ M1    0
+ReferencedRTInstanceSequence            = 0x300A0631, // SQ M1    0
+ReferencedRTPatientSetupSequence        = 0x300A0632, // SQ M1    0
+SourceToPatientSurfaceDistance          = 0x300A0634, // FD M1    0
+TreatmentMachineSpecialModeCodeSequence = 0x300A0635, // SQ M1    0
+IntendedNumberOfFractions               = 0x300A0636, // US M1    0
+RTRadiationSetIntent                    = 0x300A0637, // CS M1    0
+RTRadiationPhysicalAndGeometricContentDetailFlag = 0x300A0638, // CS M1    0
+RTRecordFlag                            = 0x300A0639, // CS M1    0
+TreatmentDeviceIdentificationSequence   = 0x300A063A, // SQ M1    0
+ReferencedRTPhysicianIntentSequence     = 0x300A063B, // SQ M1    0
+CumulativeMeterset                      = 0x300A063C, // FD M1    0
+DeliveryRate                            = 0x300A063D, // FD M1    0
+DeliveryRateUnitSequence                = 0x300A063E, // SQ M1    0
+TreatmentPositionSequence               = 0x300A063F, // SQ M1    0
+RadiationSourceAxisDistance             = 0x300A0640, // FD M1    0
+NumberOfRTBeamLimitingDevices           = 0x300A0641, // US M1    0
+RTBeamLimitingDeviceProximalDistance    = 0x300A0642, // FD M1    0
+RTBeamLimitingDeviceDistalDistance      = 0x300A0643, // FD M1    0
+ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence = 0x300A0644, // SQ M1    0
+BeamModifierOrientationAngle            = 0x300A0645, // FD M1    0
+FixedRTBeamDelimiterDeviceSequence      = 0x300A0646, // SQ M1    0
+ParallelRTBeamDelimiterDeviceSequence   = 0x300A0647, // SQ M1    0
+NumberOfParallelRTBeamDelimiters        = 0x300A0648, // US M1    0
+ParallelRTBeamDelimiterBoundaries       = 0x300A0649, // FD M2TN  0
+ParallelRTBeamDelimiterPositions        = 0x300A064A, // FD M2TN  0
+RTBeamLimitingDeviceOffset              = 0x300A064B, // FD M2    0
+RTBeamDelimiterGeometrySequence         = 0x300A064C, // SQ M1    0
+RTBeamLimitingDeviceDefinitionSequence  = 0x300A064D, // SQ M1    0
+ParallelRTBeamDelimiterOpeningMode      = 0x300A064E, // CS M1    0
+ParallelRTBeamDelimiterLeafMountingSide = 0x300A064F, // CS M1TN  0
+PatientSetupUID                         = 0x300A0650, // UI M1    0
+WedgeDefinitionSequence                 = 0x300A0651, // SQ M1    0
+RadiationBeamWedgeAngle                 = 0x300A0652, // FD M1    0
+RadiationBeamWedgeThinEdgeDistance      = 0x300A0653, // FD M1    0
+RadiationBeamEffectiveWedgeAngle        = 0x300A0654, // FD M1    0
+NumberOfWedgePositions                  = 0x300A0655, // US M1    0
+RTBeamLimitingDeviceOpeningSequence     = 0x300A0656, // SQ M1    0
+NumberOfRTBeamLimitingDeviceOpenings    = 0x300A0657, // US M1    0
+RadiationDosimeterUnitSequence          = 0x300A0658, // SQ M1    0
+RTDeviceDistanceReferenceLocationCodeSequence = 0x300A0659, // SQ M1    0
+RadiationDeviceConfigurationAndCommissioningKeySequence = 0x300A065A, // SQ M1    0
+PatientSupportPositionParameterSequence = 0x300A065B, // SQ M1    0
+PatientSupportPositionSpecificationMethod = 0x300A065C, // CS M1    0
+PatientSupportPositionDeviceParameterSequence = 0x300A065D, // SQ M1    0
+DeviceOrderIndex                        = 0x300A065E, // US M1    0
+PatientSupportPositionParameterOrderIndex = 0x300A065F, // US M1    0
+PatientSupportPositionDeviceToleranceSequence = 0x300A0660, // SQ M1    0
+PatientSupportPositionToleranceOrderIndex = 0x300A0661, // US M1    0
+CompensatorDefinitionSequence           = 0x300A0662, // SQ M1    0
+CompensatorMapOrientation               = 0x300A0663, // CS M1    0
+CompensatorProximalThicknessMap         = 0x300A0664, // OF M1    0
+CompensatorDistalThicknessMap           = 0x300A0665, // OF M1    0
+CompensatorBasePlaneOffset              = 0x300A0666, // FD M1    0
+CompensatorShapeFabricationCodeSequence = 0x300A0667, // SQ M1    0
+CompensatorShapeSequence                = 0x300A0668, // SQ M1    0
+RadiationBeamCompensatorMillingToolDiameter = 0x300A0669, // FD M1    0
+BlockDefinitionSequence                 = 0x300A066A, // SQ M1    0
+BlockEdgeData                           = 0x300A066B, // OF M1    0
+BlockOrientation                        = 0x300A066C, // CS M1    0
+RadiationBeamBlockThickness             = 0x300A066D, // FD M1    0
+RadiationBeamBlockSlabThickness         = 0x300A066E, // FD M1    0
+BlockEdgeDataSequence                   = 0x300A066F, // SQ M1    0
+NumberOfRTAccessoryHolders              = 0x300A0670, // US M1    0
+GeneralAccessoryDefinitionSequence      = 0x300A0671, // SQ M1    0
+NumberOfGeneralAccessories              = 0x300A0672, // US M1    0
+BolusDefinitionSequence                 = 0x300A0673, // SQ M1    0
+NumberOfBoluses                         = 0x300A0674, // US M1    0
+EquipmentFrameOfReferenceUID            = 0x300A0675, // UI M1    0
+EquipmentFrameOfReferenceDescription    = 0x300A0676, // ST M1    0
+EquipmentReferencePointCoordinatesSequence = 0x300A0677, // SQ M1    0
+EquipmentReferencePointCodeSequence     = 0x300A0678, // SQ M1    0
+RTBeamLimitingDeviceAngle               = 0x300A0679, // FD M1    0
+SourceRollAngle                         = 0x300A067A, // FD M1    0
+RadiationGenerationModeSequence         = 0x300A067B, // SQ M1    0
+RadiationGenerationModeLabel            = 0x300A067C, // SH M1    0
+RadiationGenerationModeDescription      = 0x300A067D, // ST M1    0
+RadiationGenerationModeMachineCodeSequence = 0x300A067E, // SQ M1    0
+RadiationTypeCodeSequence               = 0x300A067F, // SQ M1    0
+NominalEnergy                           = 0x300A0680, // DS M1    0
+MinimumNominalEnergy                    = 0x300A0681, // DS M1    0
+MaximumNominalEnergy                    = 0x300A0682, // DS M1    0
+RadiationFluenceModifierCodeSequence    = 0x300A0683, // SQ M1    0
+EnergyUnitCodeSequence                  = 0x300A0684, // SQ M1    0
+NumberOfRadiationGenerationModes        = 0x300A0685, // US M1    0
+PatientSupportDevicesSequence           = 0x300A0686, // SQ M1    0
+NumberOfPatientSupportDevices           = 0x300A0687, // US M1    0
+RTBeamModifierDefinitionDistance        = 0x300A0688, // FD M1    0
+BeamAreaLimitSequence                   = 0x300A0689, // SQ M1    0
+ReferencedRTPrescriptionSequence        = 0x300A068A, // SQ M1    0
 ReferencedRTPlanSequence                = 0x300C0002, // SQ M1    0
 ReferencedBeamSequence                  = 0x300C0004, // SQ M1    0
 ReferencedBeamNumber                    = 0x300C0006, // IS M1    0


=====================================
Source/vtkDICOMDirectory.cxx
=====================================
@@ -99,6 +99,14 @@ struct vtkDICOMDirectory::FileInfo
   vtkDICOMItem ImageRecord;
 };
 
+struct vtkDICOMDirectory::FileInfoPair
+{
+  const char *Key;
+  FileInfo *Info;
+
+  FileInfoPair(const char *key, FileInfo *ptr) : Key(key), Info(ptr) {}
+};
+
 struct vtkDICOMDirectory::SeriesInfo
 {
   // -- PATIENT --
@@ -114,16 +122,110 @@ struct vtkDICOMDirectory::SeriesInfo
   vtkDICOMItem  SeriesRecord;
   vtkDICOMValue SeriesUID;
   unsigned int SeriesNumber;
-  std::vector<FileInfo> Files;
+  // -- INSTANCES --
+  std::list<FileInfo> Files;
+  std::vector<FileInfoPair> FilesByUID;
   bool QueryMatched;
 };
 
+bool vtkDICOMDirectory::CompareInstanceUIDs(
+  const FileInfoPair& p, const char *uid)
+{
+  return (vtkDICOMUtilities::CompareUIDs(p.Key, uid) < 0);
+}
+
 bool vtkDICOMDirectory::CompareInstance(
   const FileInfo &fi1, const FileInfo &fi2)
 {
-  return (fi1.InstanceNumber < fi2.InstanceNumber);
+  if (fi1.InstanceNumber != fi2.InstanceNumber)
+  {
+    return (fi1.InstanceNumber < fi2.InstanceNumber);
+  }
+
+  // fall back to filename comparison
+  if (fi1.FileName != 0 && fi2.FileName != 0)
+  {
+    return (strcmp(fi1.FileName, fi2.FileName) < 0);
+  }
+
+  // null filename sorts before non-null filename
+  return (fi2.FileName != 0);
+}
+
+bool vtkDICOMDirectory::CompareSeriesUIDs(
+  const SeriesInfo *si, const char *uid)
+{
+  return (vtkDICOMUtilities::CompareUIDs(
+    si->SeriesUID.GetCharData(), uid) < 0);
+}
+
+bool vtkDICOMDirectory::CompareSeriesIds(
+  const SeriesInfo *si1, const SeriesInfo *si2)
+{
+  // Compare patient, then study, then series
+  const char *patientID1 = si1->PatientID.GetCharData();
+  patientID1 = (patientID1 ? patientID1 : "");
+  const char *patientID2 = si2->PatientID.GetCharData();
+  patientID2 = (patientID2 ? patientID2 : "");
+
+  int c = strcmp(patientID1, patientID2);
+
+  if (c == 0)
+  {
+    c = vtkDICOMUtilities::CompareUIDs(
+      si1->StudyUID.GetCharData(),
+      si2->StudyUID.GetCharData());
+
+    if (c == 0)
+    {
+      c = vtkDICOMUtilities::CompareUIDs(
+        si1->SeriesUID.GetCharData(),
+        si2->SeriesUID.GetCharData());
+    }
+  }
+
+  return (c < 0);
 }
 
+bool vtkDICOMDirectory::CompareSeriesInfo(
+  const SeriesInfo &si1, const SeriesInfo &si2)
+{
+  // Use PatientName to sort the patients
+  const char *patientName1 = si1.PatientName.GetCharData();
+  patientName1 = (patientName1 ? patientName1 : "");
+  const char *patientName2 = si2.PatientName.GetCharData();
+  patientName2 = (patientName2 ? patientName2 : "");
+
+  int c = strcmp(patientName1, patientName2);
+
+  if (c == 0)
+  {
+    // Use StudyDate and StudyTime to sort the studies
+    const char *studyDate1 = si1.StudyDate.GetCharData();
+    const char *studyDate2 = si2.StudyDate.GetCharData();
+    if (studyDate1 && studyDate2)
+    {
+      c = strcmp(studyDate1, studyDate2);
+      if (c == 0)
+      {
+        const char *studyTime1 = si1.StudyTime.GetCharData();
+        const char *studyTime2 = si2.StudyTime.GetCharData();
+        if (studyTime1 && studyTime2)
+        {
+          c = strcmp(studyTime1, studyTime2);
+        }
+      }
+    }
+
+    if (c == 0)
+    {
+      // Use SeriesNumber to sort the series
+      c = si1.SeriesNumber - si2.SeriesNumber;
+    }
+  }
+
+  return (c < 0);
+}
 //----------------------------------------------------------------------------
 // These are the attributes used for a directory scan
 
@@ -205,6 +307,10 @@ class vtkDICOMDirectory::SeriesInfoList
   : public std::list<vtkDICOMDirectory::SeriesInfo>
 {};
 
+class vtkDICOMDirectory::SeriesInfoVector
+  : public std::vector<vtkDICOMDirectory::SeriesInfo *>
+{};
+
 //----------------------------------------------------------------------------
 // A helper class for building a sorted list of unique tags
 class SortedTags : public std::vector<vtkDICOMTag>
@@ -1206,9 +1312,9 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
   // will be stored at patient, study, or series level instead
   SortedTags skip;
 
-  // List of files
-  SeriesInfoList sortedFiles;
-  SeriesInfoList::iterator li;
+  // List of all series that have been found
+  SeriesInfoList seriesList; // in order of discovery
+  SeriesInfoVector seriesByUID; // sorted by UID
 
   vtkIdType numberOfStrings = input->GetNumberOfValues();
 
@@ -1293,174 +1399,217 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
       continue;
     }
 
-    // Insert the file into the sorted list
+    // Create a FileInfo record and find the series it belongs to
     FileInfo fileInfo;
     fileInfo.InstanceNumber = meta->Get(DC::InstanceNumber).AsUnsignedInt();
     fileInfo.FileName = fileName.c_str(); // stored in input StringArray
     fileInfo.ImageUID = meta->Get(DC::SOPInstanceUID);
 
-    const vtkDICOMValue& patientNameValue = meta->Get(DC::PatientName);
-    const vtkDICOMValue& patientIDValue = meta->Get(DC::PatientID);
-    const vtkDICOMValue& studyDateValue = meta->Get(DC::StudyDate);
-    const vtkDICOMValue& studyTimeValue = meta->Get(DC::StudyTime);
     const vtkDICOMValue& studyUIDValue = meta->Get(DC::StudyInstanceUID);
     const vtkDICOMValue& seriesUIDValue = meta->Get(DC::SeriesInstanceUID);
     unsigned int seriesNumber = meta->Get(DC::SeriesNumber).AsUnsignedInt();
 
-    const char *patientName = patientNameValue.GetCharData();
-    const char *patientID = patientIDValue.GetCharData();
-    const char *studyDate = studyDateValue.GetCharData();
-    const char *studyTime = studyTimeValue.GetCharData();
     const char *studyUID = studyUIDValue.GetCharData();
     const char *seriesUID = seriesUIDValue.GetCharData();
     const char *imageUID = fileInfo.ImageUID.GetCharData();
 
-    patientName = (patientName ? patientName : "");
-    patientID = (patientID ? patientID : "");
-
+    bool sameFile = false;
     bool foundSeries = false;
-    for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
+
+    // Locate the first potential match
+    SeriesInfoVector::iterator vib =
+      std::lower_bound(seriesByUID.begin(), seriesByUID.end(), seriesUID,
+                       CompareSeriesUIDs);
+
+    // Iterate through all possible matches
+    for (SeriesInfoVector::iterator vi = vib;
+         vi != seriesByUID.end() &&
+         vtkDICOMUtilities::CompareUIDs((*vi)->SeriesUID.GetCharData(),
+                                        seriesUID) == 0;
+         ++vi)
     {
-      // Compare patient, then study, then series.
-      const char *patientName2 = li->PatientName.GetCharData();
-      patientName2 = (patientName2 ? patientName2 : "");
-      const char *patientID2 = li->PatientID.GetCharData();
-      patientID2 = (patientID2 ? patientID2 : "");
-      int c = strcmp(patientID2, patientID);
-      if (c != 0 || patientID[0] == '\0')
+      SeriesInfo &v = *(*vi);
+
+      // For files that lack the mandatory SeriesInstanceUID,
+      // we also check whether SeriesNumber is the same
+      if ((seriesUID == 0 || seriesUID[0] == '\0') &&
+          seriesNumber != v.SeriesNumber)
       {
-        // Use ID to identify patient, but use name to sort.
-        int c2 = strcmp(patientName2, patientName);
-        c = (c2 == 0 ? c : c2);
+        continue;
       }
-      if (c == 0)
+
+      // Ensure that the StudyInstanceUID also matches
+      if (vtkDICOMUtilities::CompareUIDs(v.StudyUID.GetCharData(),
+                                         studyUID) != 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);
-        }
-        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);
-          }
-        }
+        continue;
       }
-      if (c == 0 && seriesUID != 0)
+
+      // Prepare to insert this file into the series
+      std::vector<FileInfoPair>::iterator im =
+        std::lower_bound(v.FilesByUID.begin(), v.FilesByUID.end(),
+          imageUID, CompareInstanceUIDs);
+
+      if (im != v.FilesByUID.end())
       {
-        // Use UID to identify the image, but use instance number to sort.
-        bool sameFile = false;
-        bool repeatUID = false;
-        for (std::vector<FileInfo>::iterator im = li->Files.begin();
-             im != li->Files.end(); ++im)
+        // Check if this SOPInstanceUID is a duplicate
+        if (vtkDICOMUtilities::CompareUIDs(imageUID, im->Key) == 0)
         {
-          if (vtkDICOMUtilities::CompareUIDs(
-                imageUID, im->ImageUID.GetCharData()) == 0)
+          // Duplicate UID! Check to see if it is the same file
+          // (SameFile() is expensive, so check InstanceNumber first)
+          FileInfo &f = *im->Info;
+          if (f.InstanceNumber == fileInfo.InstanceNumber &&
+              vtkDICOMFile::SameFile(f.FileName, fileInfo.FileName))
           {
-            // Duplicate UID! Check InstanceNumber.
-            if (im->InstanceNumber == fileInfo.InstanceNumber)
-            {
-              sameFile = vtkDICOMFile::SameFile(
-                im->FileName, fileInfo.FileName);
-              repeatUID = true;
-              break;
-            }
-            else if (imageUID && imageUID[0] != '\0')
-            {
-              repeatUID = true;
-            }
+            // Let's ignore this file
+            sameFile = true;
+            break;
           }
-        }
-        if (repeatUID)
-        {
-          if (sameFile)
+
+          if (imageUID == 0 || imageUID[0] == '\0')
           {
-            break;
+            // If SOPInstanceUID is missing, advance iterator to end
+            // (this is necessary to keep the sort stable)
+            do { ++im; } while (im != v.FilesByUID.end() &&
+                                vtkDICOMUtilities::CompareUIDs(
+                                  im->Key, imageUID) == 0);
+          }
+          else
+          {
+            // For duplicate UID, continue to the next series
+            continue;
           }
-          continue;
         }
+      }
 
-        std::vector<FileInfo>::iterator pos =
-          li->Files.insert(
-            std::upper_bound(li->Files.begin(), li->Files.end(), fileInfo,
-              CompareInstance), fileInfo);
-        this->FillImageRecord(&pos->ImageRecord, meta, &skip[0], skip.size());
-        li->QueryMatched |= queryMatched;
-        foundSeries = true;
-        break;
+      // Insert this image into the series and break
+      v.Files.push_back(fileInfo);
+      FileInfo &f = v.Files.back();
+      v.FilesByUID.insert(im, FileInfoPair(f.ImageUID.GetCharData(), &f));
+      this->FillImageRecord(&f.ImageRecord, meta, &skip[0], skip.size());
+      v.QueryMatched |= queryMatched;
+      foundSeries = true;
+      break;
+    }
+
+    if (sameFile)
+    {
+      // This same file was already encountered, so skip it
+      continue;
+    }
+
+    if (!foundSeries)
+    {
+      // Use this image to begin a new series
+      seriesList.push_back(SeriesInfo());
+      SeriesInfo &v = seriesList.back();
+      seriesByUID.insert(vib, &v);
+      v.PatientName = meta->Get(DC::PatientName);
+      v.PatientID = meta->Get(DC::PatientID);
+      v.StudyDate = meta->Get(DC::StudyDate);
+      v.StudyTime = meta->Get(DC::StudyTime);
+      v.StudyUID = studyUIDValue;
+      v.SeriesUID = seriesUIDValue;
+      v.SeriesNumber = seriesNumber;
+      v.Files.push_back(fileInfo);
+      FileInfo &f = v.Files.back();
+      v.FilesByUID.push_back(FileInfoPair(f.ImageUID.GetCharData(), &f));
+      v.QueryMatched = queryMatched;
+      this->FillPatientRecord(&v.PatientRecord, meta);
+      this->FillStudyRecord(&v.StudyRecord, meta);
+      this->FillSeriesRecord(&v.SeriesRecord, meta);
+      skip.SetFrom(v.PatientRecord, v.StudyRecord, v.SeriesRecord);
+      this->FillImageRecord(&f.ImageRecord, meta, &skip[0], skip.size());
+    }
+  }
+
+  // Remove any series that do not match the query
+  seriesByUID.clear();
+  SeriesInfoList::iterator li = seriesList.begin();
+  while (li != seriesList.end())
+  {
+    if (!li->QueryMatched)
+    {
+      SeriesInfoList::iterator ci = li;
+      ++li;
+      seriesList.erase(ci);
+    }
+    else
+    {
+      seriesByUID.push_back(&(*li));
+      ++li;
+    }
+  }
+
+  SeriesInfo *lastInfo = 0;
+
+  // Force consistent PatientName, StudyDate, StudyTime keys for sorting
+  std::sort(seriesByUID.begin(), seriesByUID.end(), CompareSeriesIds);
+  for (SeriesInfoVector::iterator vi = seriesByUID.begin();
+       vi != seriesByUID.end(); ++vi)
+  {
+    SeriesInfo &v = *(*vi);
+
+    // Is this a new patient or a new study?
+    if (!lastInfo || v.PatientID != lastInfo->PatientID)
+    {
+      const char *cp = v.PatientName.GetCharData();
+      size_t l = v.PatientName.GetVL();
+      if (!cp)
+      {
+        // if PatientName key is missing, use PatientID as replacment
+        cp = v.PatientID.GetCharData();
+        l = v.PatientID.GetVL();
       }
-      else if (c >= 0)
+      if (cp)
       {
-        break;
+        // Strip padding space
+        while (l > 0 && cp[l-1] == ' ') { --l; }
+        // Make PatientName key lower-case for case-insensitive sorting
+        vtkDICOMCharacterSet cs = v.PatientName.GetCharacterSet();
+        v.PatientName = vtkDICOMValue(
+          vtkDICOMVR::PN, vtkDICOMCharacterSet::ISO_IR_192,
+          cs.CaseFoldedUTF8(cp, l));
       }
+      lastInfo = &v;
     }
-
-    if (!foundSeries)
+    else if (v.StudyUID != lastInfo->StudyUID)
     {
-      li = sortedFiles.insert(li, SeriesInfo());
-      li->PatientName = patientNameValue;
-      li->PatientID = patientIDValue;
-      li->StudyDate = studyDateValue;
-      li->StudyUID = studyUIDValue;
-      li->SeriesUID = seriesUIDValue;
-      li->SeriesNumber = seriesNumber;
-      li->Files.push_back(fileInfo);
-      li->QueryMatched = queryMatched;
-      this->FillPatientRecord(&li->PatientRecord, meta);
-      this->FillStudyRecord(&li->StudyRecord, meta);
-      this->FillSeriesRecord(&li->SeriesRecord, meta);
-      skip.SetFrom(li->PatientRecord, li->StudyRecord, li->SeriesRecord);
-      this->FillImageRecord(&li->Files.back().ImageRecord, meta,
-                            &skip[0], skip.size());
+      v.PatientName = lastInfo->PatientName;
+      lastInfo = &v;
+    }
+    else
+    {
+      v.PatientName = lastInfo->PatientName;
+      v.StudyDate = lastInfo->StudyDate;
+      v.StudyTime = lastInfo->StudyTime;
     }
   }
 
+  // Sort by PatientName, StudyDate, StudyTime, and SeriesNumber
+  seriesList.sort(CompareSeriesInfo);
+
   // Visit each series and call AddSeriesFileNames
   int patientCount = this->GetNumberOfPatients();
   int studyCount = this->GetNumberOfStudies();
 
-  vtkDICOMValue lastStudyUID;
-  vtkDICOMValue lastPatientID;
+  lastInfo = 0;
 
-  for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
+  for (li = seriesList.begin(); li != seriesList.end(); ++li)
   {
     SeriesInfo &v = *li;
-    if (!v.QueryMatched) { continue; }
 
     // Is this a new patient or a new study?
-    if (!lastPatientID.IsValid() || v.PatientID != lastPatientID)
+    if (!lastInfo || v.PatientID != lastInfo->PatientID)
     {
-      lastPatientID = v.PatientID;
       patientCount++;
-      lastStudyUID = v.StudyUID;
       studyCount++;
+      lastInfo = &v;
     }
-    else if (!lastStudyUID.IsValid() || v.StudyUID != lastStudyUID)
+    else if (v.StudyUID != lastInfo->StudyUID)
     {
-      lastStudyUID = v.StudyUID;
       studyCount++;
+      lastInfo = &v;
     }
 
     vtkSmartPointer<vtkStringArray> sa =
@@ -1468,10 +1617,13 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
     vtkIdType n = static_cast<vtkIdType>(v.Files.size());
     sa->SetNumberOfValues(n);
     std::vector<const vtkDICOMItem *> imageRecords(n);
+    li->Files.sort(CompareInstance);
+    std::list<FileInfo>::iterator fi = li->Files.begin();
     for (vtkIdType i = 0; i < n; i++)
     {
-      sa->SetValue(i, v.Files[i].FileName);
-      imageRecords[i] = &v.Files[i].ImageRecord;
+      sa->SetValue(i, fi->FileName);
+      imageRecords[i] = &fi->ImageRecord;
+      ++fi;
     }
     this->AddSeriesFileNames(
       patientCount-1, studyCount-1, sa,
@@ -1533,13 +1685,59 @@ private:
 
 bool SimpleSQL::Open(const char *fname)
 {
-  int r = sqlite3_open_v2(fname, &this->DBase, SQLITE_OPEN_READONLY, NULL);
+  // convert to URI for use with sqlite3_open()
+  const char uri_reserved[] = " !#$%&'()*+,:;=?@[]";
+
+  // first, get absolute path
+  vtkDICOMFilePath path(fname);
+  std::string fullpath = path.GetRealPath();
+
+  // build the URI using percent encoding
+  std::string uri = "file://";
+
+  for (size_t i = 0; i < fullpath.length(); i++)
+  {
+    bool use_percent = false;
+    char c = fullpath[i];
+    if (c < ' ' || c > '~')
+    {
+      use_percent = true;
+    }
+    else for (size_t j = 0; j < sizeof(uri_reserved); j++)
+    {
+      if (c == uri_reserved[j])
+      {
+        use_percent = true;
+        break;
+      }
+    }
+
+    if (use_percent)
+    {
+      char enc[4];
+      sprintf(enc, "%%%2.2x", static_cast<unsigned char>(c));
+      uri += enc;
+    }
+    else
+    {
+      uri.push_back(c);
+    }
+  }
+
+  // we need to use "immutable" or else a read-only open will fail
+  // if the .sql-wal file is missing (and we definitely want to open
+  // the file in read-only mode, we never ever wish to modify the file!)
+  uri += "?mode=ro&immutable=1";
+
+  int r = sqlite3_open_v2(uri.c_str(), &this->DBase,
+                          SQLITE_OPEN_READONLY|SQLITE_OPEN_URI, 0);
   if (r == SQLITE_OK)
   {
     char *errmsg;
     r = sqlite3_exec(this->DBase, "BEGIN TRANSACTION", NULL, NULL, &errmsg);
     this->InTransaction = (r == SQLITE_OK);
   }
+
   return (r == SQLITE_OK);
 }
 


=====================================
Source/vtkDICOMDirectory.h
=====================================
@@ -401,8 +401,10 @@ private:
   class StudyVector;
   class PatientVector;
   struct FileInfo;
+  struct FileInfoPair;
   struct SeriesInfo;
   class SeriesInfoList;
+  class SeriesInfoVector;
   class VisitedVector;
 
   vtkDICOMItem *Query;
@@ -421,6 +423,18 @@ private:
 
   //! Compare FileInfo entries by instance number
   static bool CompareInstance(const FileInfo &fi1, const FileInfo &fi2);
+
+  //! Compare SeriesInfo entries by SeriesUID
+  static bool CompareSeriesUIDs(const SeriesInfo *si, const char *uid);
+
+  //! Compare SeriesInfo entries by PatientID, StudyUID, and SeriesUID
+  static bool CompareSeriesIds(const SeriesInfo *li1, const SeriesInfo *li2);
+
+  //! Compare SeriesInfo entries by PatientName, StudyDate, and SeriesNumber
+  static bool CompareSeriesInfo(const SeriesInfo &li1, const SeriesInfo &li2);
+
+  //! Compare SOPInstanceUID to a FileInfo entry.
+  static bool CompareInstanceUIDs(const FileInfoPair& p, const char *uid);
 };
 
 #endif


=====================================
Source/vtkDICOMGenerator.cxx
=====================================
@@ -1051,7 +1051,7 @@ bool vtkDICOMGenerator::CopyAttributes(
         const DC::EnumType *tags = blacklist;
         while (*tags != DC::ItemDelimitationItem)
         {
-          if (*tags++ == tag.GetKey())
+          if (static_cast<unsigned int>(*tags++) == tag.GetKey())
           {
             blacklisted = true;
             break;


=====================================
Source/vtkDICOMParser.cxx
=====================================
@@ -384,6 +384,9 @@ public:
   // Returns true if all queries have matched so far.
   bool GetQueryMatched() { return this->QueryMatched; }
 
+  // Check whether the query is finished.
+  bool GetQueryFinished() { return this->Query == this->QueryEnd; }
+
   // Finish the query (check for unused keys that must match).
   bool FinishQuery();
 
@@ -910,7 +913,7 @@ bool DecoderBase::QueryMatches(const vtkDICOMValue& v)
 //----------------------------------------------------------------------------
 bool DecoderBase::FinishQuery()
 {
-  if (this->HasQuery && this->QueryMatched)
+  if (this->HasQuery)
   {
     this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff));
   }
@@ -2135,49 +2138,51 @@ bool vtkDICOMParser::ReadMetaData(
 
   // read group-by-group
   bool readFailure = false;
-  bool queryFailure = (hasQuery && !this->QueryMatched);
-  bool bailOnQueryFailure = (meta && meta->GetNumberOfInstances() == 1);
-  while (!readFailure && (!queryFailure || !bailOnQueryFailure))
+  while (!readFailure)
   {
-    vtkDICOMTag tag = decoder->Peek(cp, ep);
+    // peek ahead to get the next tag
+    vtkDICOMTag nextTag = decoder->Peek(cp, ep);
 
     // if there is no data left to decode, then break
     if (cp == ep) { break; }
 
     // do we want to read or skip this group?
-    bool found = true;
+    bool skipGroup = false;
     if (!groups.empty())
     {
-      while (giter != groups.end() && *giter < tag.GetGroup())
+      while (giter != groups.end() && *giter < nextTag.GetGroup())
       {
         ++giter;
       }
-      found = (giter != groups.end() && *giter == tag.GetGroup());
+      skipGroup = (giter == groups.end() || *giter != nextTag.GetGroup());
     }
 
     // create a delimiter to read/skip only this group
-    vtkDICOMTag delimiter(tag.GetGroup(), 0);
+    vtkDICOMTag delimiter(nextTag.GetGroup(), 0);
 
-    // check for PixelData group 0x7fe0, or obsolete 0x7fxx
+    // check for PixelData group 0x7fe0, or obsolete 0x7fxx, but do not
+    // accept private groups like 7fe1
     unsigned int l = HxFFFFFFFF;
-    if ((tag.GetGroup() & 0xff01) == 0x7f00)
+    if ((nextTag.GetGroup() & 0xff01) == 0x7f00)
     {
-      if (tag.GetElement() == 0x0000)
+      if (nextTag.GetElement() == 0x0000)
       {
-        // have to read "group length" before pixel data
+        // this is a "group length" tag, we want to read exactly
+        // 12 bytes to get to the next element (the pixel data)
         l = 12;
       }
       else
       {
-        // set delimiter to pixel data tag
-        delimiter = tag;
+        // this tag is pixel data, so we want to read the data
+        // element header for this tag and then stop
+        delimiter = nextTag;
       }
     }
 
-    if (found && meta)
+    // read or skip this group of data elements
+    if (meta && !skipGroup)
     {
       readFailure = !decoder->ReadElements(cp, ep, l, delimiter);
-      queryFailure = (hasQuery && !decoder->GetQueryMatched());
     }
     else
     {
@@ -2222,6 +2227,17 @@ bool vtkDICOMParser::ReadMetaData(
         }
       }
 
+      // if all attributes in the query have been scanned, then break now
+      // to avoid seeking through the pixel data fragments
+      if (hasQuery && this->PixelDataFound)
+      {
+        decoder->AdvanceQueryIterator(lastTag);
+        if (decoder->GetQueryFinished())
+        {
+          break;
+        }
+      }
+
       // skip over the PixelData
       unsigned int vl = decoder->GetLastVL();
       vtkTypeInt64 r = this->GetBytesRemaining(cp, ep);


=====================================
Source/vtkDICOMUtilitiesUIDTable.cxx
=====================================
@@ -18,27 +18,27 @@ struct UIDTableEntry
 const UIDTableEntry UIDTable[] = {
 { 1, 15, 1, 0, 0 },
 { 16, 42, 1, 0, 0 },
-{ 163, 11, 6, 0, 0 },
-{ 186, 1, 1, 0, 0 },
-{ 212, 1, 2, 0, 0 },
-{ 213, 1, 1, 0, 0 },
-{ 1257, 1, 1, 0, 0 },
-{ 2545, 1, 1, 0, 0 },
-{ 2548, 1, 1, 0, 0 },
-{ 2550, 24, 1, 0, 0 },
+{ 169, 11, 6, 0, 0 },
+{ 192, 1, 1, 0, 0 },
+{ 218, 1, 2, 0, 0 },
+{ 219, 1, 1, 0, 0 },
+{ 1265, 1, 1, 0, 0 },
+{ 2569, 1, 1, 0, 0 },
+{ 2572, 1, 1, 0, 0 },
+{ 2574, 24, 1, 0, 0 },
+{ 2598, 4, 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 },
-{ 2574, 2, 0, 0, 0 },
+{ 2602, 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
+{ 58, 7, 1, 0, // 1.2.840.10008.1.2
   "Implicit VR Little Endian" },
-{ 126, 1, 10, 0, 0 },
-{ 127, 2, 1, 0, 0 },
-{ 149, 8, 1, 0, 0 },
+{ 130, 1, 10, 0, 0 },
+{ 131, 3, 1, 0, 0 },
+{ 155, 8, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -54,7 +54,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 157, 2, 1, 0, // 1.2.840.10008.1.20 (Retired)
+{ 163, 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 },
@@ -75,20 +75,21 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 161, 1, 1, 0, // 1.2.840.10008.1.40
+{ 167, 1, 1, 0, // 1.2.840.10008.1.40
   "Procedural Event Logging SOP Class" },
 { 0, 0, 0, 0, 0 },
-{ 162, 1, 1, 0, // 1.2.840.10008.1.42
+{ 168, 1, 1, 0, // 1.2.840.10008.1.42
   "Substance Administration Logging SOP Class" },
-{ 64, 1, 99, 0, // 1.2.840.10008.1.2.1
+{ 65, 1, 99, 0, // 1.2.840.10008.1.2.1
   "Explicit VR Little Endian" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.2.2 (Retired)
   "Explicit VR Big Endian" },
 { 0, 0, 0, 0, 0 },
-{ 65, 59, 50, 0, 0 },
+{ 66, 59, 50, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.1.2.5
   "RLE Lossless" },
-{ 124, 2, 1, 0, 0 },
+{ 125, 2, 1, 0, 0 },
+{ 127, 3, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.1.2.1.99
   "Deflated Explicit VR Little Endian" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.2.4.50
@@ -189,10 +190,17 @@ const UIDTableEntry UIDTable[] = {
   "RFC 2557 MIME encapsulation" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.2.6.2 (Retired)
   "XML Encoding" },
+{ 0, 0, 0, 0, // 1.2.840.10008.1.2.7.1
+  "SMPTE ST 2110-20 Uncompressed Progressive Active Video" },
+{ 0, 0, 0, 0, // 1.2.840.10008.1.2.7.2
+  "SMPTE ST 2110-20 Uncompressed Interlaced Active Video" },
+{ 0, 0, 0, 0, // 1.2.840.10008.1.2.7.3
+  "SMPTE ST 2110-30 PCM Digital Audio" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.3.10
   "Media Storage Directory Storage" },
-{ 129, 18, 1, 0, 0 },
-{ 147, 2, 1, 0, 0 },
+{ 134, 18, 1, 0, 0 },
+{ 152, 2, 1, 0, 0 },
+{ 154, 1, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.1
   "Talairach Brain Atlas Frame of Reference" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.4.1.2
@@ -233,6 +241,8 @@ const UIDTableEntry UIDTable[] = {
   "ICBM 452 T1 Frame of Reference" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.4.2.2
   "ICBM Single Subject MRI Frame of Reference" },
+{ 0, 0, 0, 0, // 1.2.840.10008.1.4.3.1
+  "IEC 61217 Fixed Coordinate System Frame of Reference" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.5.1
   "Hot Iron Color Palette SOP Instance" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.5.2
@@ -249,9 +259,9 @@ const UIDTableEntry UIDTable[] = {
   "Fall Color Palette SOP Instance" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.5.8
   "Winter Color Palette SOP Instance" },
-{ 159, 1, 1, 0, // 1.2.840.10008.1.20.1
+{ 165, 1, 1, 0, // 1.2.840.10008.1.20.1
   "Storage Commitment Push Model SOP Class" },
-{ 160, 1, 1, 0, // 1.2.840.10008.1.20.2 (Retired)
+{ 166, 1, 1, 0, // 1.2.840.10008.1.20.2 (Retired)
   "Storage Commitment Pull Model SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.20.1.1
   "Storage Commitment Push Model SOP Instance" },
@@ -261,7 +271,7 @@ const UIDTableEntry UIDTable[] = {
   "Procedural Event Logging SOP Instance" },
 { 0, 0, 0, 0, // 1.2.840.10008.1.42.1
   "Substance Administration Logging SOP Instance" },
-{ 174, 1, 1, 0, 0 },
+{ 180, 1, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -271,7 +281,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 175, 11, 4, 0, 0 },
+{ 181, 11, 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
@@ -296,17 +306,17 @@ const UIDTableEntry UIDTable[] = {
   "Image Biomarker Standardisation Initiative" },
 { 0, 0, 0, 0, // 1.2.840.10008.2.16.14
   "Radiomics Ontology" },
-{ 187, 2, 1, 0, 0 },
-{ 189, 1, 1, 0, 0 },
-{ 190, 6, 1, 0, 0 },
+{ 193, 2, 1, 0, 0 },
+{ 195, 1, 1, 0, 0 },
+{ 196, 6, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.3.1.1.1
   "DICOM Application Context Name" },
-{ 196, 4, 1, 0, 0 },
-{ 200, 1, 1, 0, 0 },
-{ 201, 5, 1, 0, 0 },
+{ 202, 4, 1, 0, 0 },
+{ 206, 1, 1, 0, 0 },
+{ 207, 5, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 206, 5, 1, 0, 0 },
-{ 211, 1, 1, 0, 0 },
+{ 212, 5, 1, 0, 0 },
+{ 217, 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 },
@@ -337,23 +347,23 @@ const UIDTableEntry UIDTable[] = {
   "Detached Interpretation Management SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.4.2
   "Storage Service Class" },
-{ 214, 4, 1, 0, 0 },
-{ 218, 40, 1, 0, 0 },
+{ 220, 4, 1, 0, 0 },
+{ 224, 40, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 266, 45, 1, 0, 0 },
+{ 272, 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 },
-{ 258, 2, 1, 0, // 1.2.840.10008.5.1.1.4
+{ 264, 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 },
-{ 260, 1, 1, 0, // 1.2.840.10008.5.1.1.9
+{ 266, 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 },
@@ -363,11 +373,11 @@ const UIDTableEntry UIDTable[] = {
   "Print Job SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.15
   "Basic Annotation Box SOP Class" },
-{ 261, 1, 376, 0, // 1.2.840.10008.5.1.1.16
+{ 267, 1, 376, 0, // 1.2.840.10008.5.1.1.16
   "Printer SOP Class" },
-{ 262, 1, 376, 0, // 1.2.840.10008.5.1.1.17
+{ 268, 1, 376, 0, // 1.2.840.10008.5.1.1.17
   "Printer SOP Instance" },
-{ 263, 1, 1, 0, // 1.2.840.10008.5.1.1.18
+{ 269, 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 },
@@ -376,7 +386,7 @@ const UIDTableEntry UIDTable[] = {
   "VOI LUT Box SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.23
   "Presentation LUT SOP Class" },
-{ 264, 1, 1, 0, // 1.2.840.10008.5.1.1.24 (Retired)
+{ 270, 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" },
@@ -401,7 +411,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 265, 1, 1, 0, // 1.2.840.10008.5.1.1.40
+{ 271, 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" },
@@ -419,7 +429,7 @@ const 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" },
-{ 311, 2, 1, 0, 0 },
+{ 317, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -438,7 +448,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1209, 3, 1, 0, 0 },
+{ 1217, 3, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -451,51 +461,51 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.31
   "Modality Worklist Information Model - FIND" },
-{ 1212, 3, 1, 0, // 1.2.840.10008.5.1.4.32 (Retired)
+{ 1220, 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" },
-{ 1215, 10, 1, 0, 0 },
+{ 1223, 10, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1234, 3, 1, 0, 0 },
-{ 1237, 4, 1, 0, 0 },
-{ 1241, 4, 1, 0, 0 },
+{ 1242, 3, 1, 0, 0 },
+{ 1245, 4, 1, 0, 0 },
+{ 1249, 4, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.41
   "Product Characteristics Query" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.42
   "Substance Approval Query" },
-{ 1245, 4, 1, 0, 0 },
-{ 1249, 4, 1, 0, 0 },
 { 1253, 4, 1, 0, 0 },
-{ 313, 601, 1, 0, 0 },
-{ 1192, 5, 1, 0, 0 },
-{ 914, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1
+{ 1257, 4, 1, 0, 0 },
+{ 1261, 4, 1, 0, 0 },
+{ 319, 601, 1, 0, 0 },
+{ 1200, 5, 1, 0, 0 },
+{ 920, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1
   "Computed Radiography Image Storage" },
-{ 920, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2
+{ 926, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2
   "CT Image Storage" },
-{ 922, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired)
+{ 928, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired)
   "Ultrasound Multi-frame Image Storage" },
-{ 923, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.4
+{ 929, 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" },
-{ 927, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired)
+{ 933, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired)
   "Ultrasound Image Storage" },
-{ 929, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.7
+{ 935, 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" },
-{ 933, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.9 (Retired)
+{ 939, 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" },
-{ 948, 11, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired)
+{ 954, 11, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired)
   "Standalone VOI LUT Storage" },
-{ 959, 77, 1, 0, 0 },
-{ 1038, 1, 1, 0, 0 },
-{ 1044, 2, 1, 0, 0 },
+{ 965, 77, 1, 0, 0 },
+{ 1044, 1, 1, 0, 0 },
+{ 1050, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -550,11 +560,11 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1046, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.66
+{ 1052, 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" },
-{ 1052, 2, 1, 0, 0 },
+{ 1058, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -563,20 +573,20 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1054, 2, 1, 0, 0 },
-{ 1073, 8, 1, 0, 0 },
-{ 1081, 1, 1, 0, 0 },
-{ 1082, 1, 1, 0, 0 },
-{ 1083, 1, 1, 0, 0 },
-{ 1084, 1, 1, 0, 0 },
+{ 1060, 2, 1, 0, 0 },
+{ 1079, 8, 1, 0, 0 },
+{ 1087, 1, 1, 0, 0 },
+{ 1088, 1, 1, 0, 0 },
+{ 1089, 1, 1, 0, 0 },
+{ 1090, 1, 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 },
-{ 1085, 75, 1, 0, 0 },
+{ 1091, 75, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1160, 1, 1, 0, 0 },
+{ 1166, 1, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -590,7 +600,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1161, 3, 1, 0, 0 },
+{ 1167, 3, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -614,7 +624,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1164, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.128
+{ 1170, 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" },
@@ -690,7 +700,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1165, 6, 1, 0, 0 },
+{ 1171, 6, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -971,7 +981,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1171, 11, 1, 0, 0 },
+{ 1177, 13, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -991,7 +1001,7 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1182, 6, 1, 0, 0 },
+{ 1190, 6, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -1091,12 +1101,12 @@ const UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1190, 2, 1, 0, 0 },
-{ 917, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1
+{ 1198, 2, 1, 0, 0 },
+{ 923, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1
   "Digital X-Ray Image Storage - For Presentation" },
-{ 918, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2
+{ 924, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2
   "Digital Mammography X-Ray Image Storage - For Presentation" },
-{ 919, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.3
+{ 925, 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" },
@@ -1130,13 +1140,13 @@ const 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" },
-{ 939, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired)
+{ 945, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired)
   "Waveform Storage - Trial" },
-{ 942, 1, 1, 0, 0 },
-{ 943, 1, 1, 0, 0 },
-{ 944, 2, 1, 0, 0 },
-{ 946, 1, 1, 0, 0 },
-{ 947, 1, 1, 0, 0 },
+{ 948, 1, 1, 0, 0 },
+{ 949, 1, 1, 0, 0 },
+{ 950, 2, 1, 0, 0 },
+{ 952, 1, 1, 0, 0 },
+{ 953, 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
@@ -1177,9 +1187,9 @@ const UIDTableEntry UIDTable[] = {
   "Segmented Volume Rendering Volumetric Presentation State Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.11
   "Multiple Volume Rendering Volumetric Presentation State Storage" },
-{ 1036, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1
+{ 1042, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1
   "X-Ray Angiographic Image Storage" },
-{ 1037, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.2
+{ 1043, 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" },
@@ -1262,7 +1272,7 @@ const UIDTableEntry UIDTable[] = {
   "Enhanced XA Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.2.1
   "Enhanced XRF Image Storage" },
-{ 1039, 5, 1, 0, 0 },
+{ 1045, 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
@@ -1293,19 +1303,19 @@ const UIDTableEntry UIDTable[] = {
   "Surface Scan Mesh Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.2
   "Surface Scan Point Cloud Storage" },
-{ 1056, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1 (Retired)
+{ 1062, 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" },
-{ 1062, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1
+{ 1068, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1
   "VL Endoscopic Image Storage" },
-{ 1063, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2
+{ 1069, 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" },
-{ 1064, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4
+{ 1070, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4
   "VL Photographic Image Storage" },
-{ 1065, 8, 1, 0, 0 },
+{ 1071, 8, 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
@@ -1495,9 +1505,13 @@ const UIDTableEntry UIDTable[] = {
   "RT Physician Intent Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.11
   "RT Segment Annotation Storage" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.12
+  "RT Radiation Set Storage" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.481.13
+  "C-Arm Photon-Electron Radiation Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.1
   "DICOS CT Image Storage" },
-{ 1188, 2, 1, 0, 0 },
+{ 1196, 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
@@ -1514,11 +1528,11 @@ const 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" },
-{ 1197, 3, 1, 0, 0 },
-{ 1200, 3, 1, 0, 0 },
-{ 1203, 3, 1, 0, 0 },
-{ 1206, 2, 2, 0, 0 },
-{ 1208, 1, 3, 0, 0 },
+{ 1205, 3, 1, 0, 0 },
+{ 1208, 3, 1, 0, 0 },
+{ 1211, 3, 1, 0, 0 },
+{ 1214, 2, 2, 0, 0 },
+{ 1216, 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
@@ -1561,11 +1575,11 @@ const 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" },
-{ 1225, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired)
+{ 1233, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired)
   "Unified Worklist and Procedure Step Service Class - Trial" },
-{ 1229, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5
+{ 1237, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5
   "UPS Global Subscription SOP Instance" },
-{ 1230, 4, 1, 0, // 1.2.840.10008.5.1.4.34.6
+{ 1238, 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" },
@@ -1639,7 +1653,7 @@ const 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" },
-{ 1258, 1287, 1, 0, 0 },
+{ 1266, 1303, 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
@@ -4108,12 +4122,44 @@ const UIDTableEntry UIDTable[] = {
   "Qualitative Evaluation Modifier Values" },
 { 0, 0, 0, 212, // 1.2.840.10008.6.1.1287
   "Generic Anatomic Location Modifiers" },
-{ 2546, 2, 1, 0, 0 },
+{ 0, 0, 0, 9541, // 1.2.840.10008.6.1.1288
+  "Beam Limiting Device Types" },
+{ 0, 0, 0, 9542, // 1.2.840.10008.6.1.1289
+  "Compensator Device Types" },
+{ 0, 0, 0, 9543, // 1.2.840.10008.6.1.1290
+  "Radiotherapy Treatment Machine Modes" },
+{ 0, 0, 0, 9544, // 1.2.840.10008.6.1.1291
+  "Radiotherapy Distance Reference Locations" },
+{ 0, 0, 0, 9545, // 1.2.840.10008.6.1.1292
+  "Fixed Beam Limiting Device Types" },
+{ 0, 0, 0, 9546, // 1.2.840.10008.6.1.1293
+  "Radiotherapy Wedge Types" },
+{ 0, 0, 0, 9547, // 1.2.840.10008.6.1.1294
+  "RT Beam Limiting Device Orientation Labels" },
+{ 0, 0, 0, 9548, // 1.2.840.10008.6.1.1295
+  "General Accessory Device Types" },
+{ 0, 0, 0, 9549, // 1.2.840.10008.6.1.1296
+  "Radiation Generation Mode Types" },
+{ 0, 0, 0, 9550, // 1.2.840.10008.6.1.1297
+  "C-Arm Photon-Electron Delivery Rate Units" },
+{ 0, 0, 0, 9551, // 1.2.840.10008.6.1.1298
+  "Treatment Delivery Device Types" },
+{ 0, 0, 0, 9552, // 1.2.840.10008.6.1.1299
+  "C-Arm Photon-Electron Dosimeter Units" },
+{ 0, 0, 0, 9553, // 1.2.840.10008.6.1.1300
+  "Treatment Points" },
+{ 0, 0, 0, 9554, // 1.2.840.10008.6.1.1301
+  "Equipment Reference Points" },
+{ 0, 0, 0, 9555, // 1.2.840.10008.6.1.1302
+  "Radiotherapy Treatment Planning Person Roles" },
+{ 0, 0, 0, 7070, // 1.2.840.10008.6.1.1303
+  "Real Time Video Rendition Titles" },
+{ 2570, 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" },
-{ 2549, 1, 1, 0, 0 },
+{ 2573, 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
@@ -4164,10 +4210,18 @@ const UIDTableEntry UIDTable[] = {
   "General Section Entries" },
 { 0, 0, 0, 0, // 1.2.840.10008.9.24
   "Imaging Addendum Report" },
-{ 2576, 2, 3, 0, 0 },
-{ 2617, 1, 1, 0, 0 },
-{ 2578, 31, 1, 0, 0 },
-{ 2609, 8, 1, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.10.1
+  "Video Endoscopic Image Real-Time Communication" },
+{ 0, 0, 0, 0, // 1.2.840.10008.10.2
+  "Video Photographic Image Real-Time Communication" },
+{ 0, 0, 0, 0, // 1.2.840.10008.10.3
+  "Audio Waveform Real-Time Communication" },
+{ 0, 0, 0, 0, // 1.2.840.10008.10.4
+  "Rendition Selection Document Real-Time Communication" },
+{ 2604, 2, 3, 0, 0 },
+{ 2645, 1, 1, 0, 0 },
+{ 2606, 31, 1, 0, 0 },
+{ 2637, 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


=====================================
Source/vtkDICOMValue.cxx
=====================================
@@ -102,9 +102,9 @@ void StringConversion(
       }
       else
       {
-        int d = 0;
+        OT d = 0;
         sbs >> d;
-        *v++ = static_cast<OT>(d);
+        *v++ = d;
       }
       if (k + 1 < n)
       {
@@ -941,6 +941,18 @@ vtkDICOMValue::vtkDICOMValue(
   this->CreateValue(vr, data, count);
 }
 
+vtkDICOMValue::vtkDICOMValue(
+  vtkDICOMVR vr, const long long *data, size_t count)
+{
+  this->CreateValue(vr, data, count);
+}
+
+vtkDICOMValue::vtkDICOMValue(
+  vtkDICOMVR vr, const unsigned long long *data, size_t count)
+{
+  this->CreateValue(vr, data, count);
+}
+
 vtkDICOMValue::vtkDICOMValue(
   vtkDICOMVR vr, const float *data, size_t count)
 {
@@ -1502,6 +1514,14 @@ void vtkDICOMValue::GetValuesT(VT *v, size_t c, size_t s) const
       NumericalConversion(
         static_cast<const ValueT<unsigned int> *>(this->V)->Data+s, v, c);
       break;
+    case VTK_LONG_LONG:
+      NumericalConversion(
+        static_cast<const ValueT<long long> *>(this->V)->Data+s, v, c);
+      break;
+    case VTK_UNSIGNED_LONG_LONG:
+      NumericalConversion(
+        static_cast<const ValueT<unsigned long long> *>(this->V)->Data+s, v, c);
+      break;
     case VTK_FLOAT:
       NumericalConversion(
         static_cast<const ValueT<float> *>(this->V)->Data+s, v, c);
@@ -1582,6 +1602,18 @@ void vtkDICOMValue::GetValues(unsigned int *v, size_t c, size_t s) const
   this->GetValuesT(v, c, s);
 }
 
+void vtkDICOMValue::GetValues(long long *v, size_t c, size_t s) const
+{
+  assert((s + c) <= this->V->NumberOfValues);
+  this->GetValuesT(v, c, s);
+}
+
+void vtkDICOMValue::GetValues(unsigned long long *v, size_t c, size_t s) const
+{
+  assert((s + c) <= this->V->NumberOfValues);
+  this->GetValuesT(v, c, s);
+}
+
 void vtkDICOMValue::GetValues(float *v, size_t c, size_t s) const
 {
   assert((s + c) <= this->V->NumberOfValues);
@@ -1917,6 +1949,7 @@ std::string vtkDICOMValue::AsString() const
       this->V->VR != vtkDICOMVR::OW &&
       this->V->VR != vtkDICOMVR::OB &&
       this->V->VR != vtkDICOMVR::OL &&
+      this->V->VR != vtkDICOMVR::OV &&
       this->V->VR != vtkDICOMVR::OF &&
       this->V->VR != vtkDICOMVR::OD)
   {
@@ -2061,8 +2094,8 @@ void vtkDICOMValue::AppendValueToString(
   const char *cp = 0;
   const char *dp = 0;
   double f = 0.0;
-  int d = 0;
-  size_t u = 0;
+  long long d = 0;
+  unsigned long long u = 0;
   vtkDICOMTag a;
 
   if (this->V == 0)
@@ -2104,6 +2137,12 @@ void vtkDICOMValue::AppendValueToString(
     case VTK_UNSIGNED_INT:
       u = static_cast<const ValueT<unsigned int> *>(this->V)->Data[i];
       break;
+    case VTK_LONG_LONG:
+      d = static_cast<const ValueT<long long> *>(this->V)->Data[i];
+      break;
+    case VTK_UNSIGNED_LONG_LONG:
+      u = static_cast<const ValueT<unsigned long long> *>(this->V)->Data[i];
+      break;
     case VTK_FLOAT:
       f = static_cast<const ValueT<float> *>(this->V)->Data[i];
       break;
@@ -2227,11 +2266,13 @@ void vtkDICOMValue::AppendValueToString(
            this->V->Type == VTK_SHORT ||
            this->V->Type == VTK_UNSIGNED_SHORT ||
            this->V->Type == VTK_INT ||
-           this->V->Type == VTK_UNSIGNED_INT)
+           this->V->Type == VTK_UNSIGNED_INT ||
+           this->V->Type == VTK_LONG_LONG ||
+           this->V->Type == VTK_UNSIGNED_LONG_LONG)
   {
     // simple code to convert an integer to a string
-    char text[16];
-    size_t ti = 16;
+    char text[20];
+    size_t ti = 20;
 
     // if d is nonzero, set u to abs(d)
     if (d > 0)
@@ -2255,7 +2296,7 @@ void vtkDICOMValue::AppendValueToString(
       text[--ti] = '-';
     }
 
-    str.append(&text[ti], &text[16]);
+    str.append(&text[ti], &text[20]);
   }
   else if (this->V->Type == VTK_DICOM_TAG)
   {
@@ -2892,6 +2933,11 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
     // OL must match exactly
     match = ValueT<unsigned int>::Compare(value.V, this->V);
   }
+  else if (vr == vtkDICOMVR::OV)
+  {
+    // OV must match exactly
+    match = ValueT<unsigned int>::Compare(value.V, this->V);
+  }
   else if (vr == vtkDICOMVR::OF)
   {
     // OF must match exactly
@@ -2912,6 +2958,11 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
     // Match if any value matches
     match = ValueT<int>::CompareEach(value.V, this->V);
   }
+  else if (type == VTK_LONG_LONG || type == VTK_UNSIGNED_LONG_LONG)
+  {
+    // Match if any value matches
+    match = ValueT<long long>::CompareEach(value.V, this->V);
+  }
   else if (type == VTK_FLOAT)
   {
     // Match if any value matches
@@ -2995,6 +3046,10 @@ bool vtkDICOMValue::operator==(const vtkDICOMValue& o) const
           case VTK_UNSIGNED_INT:
             r = ValueT<int>::Compare(a, b);
             break;
+          case VTK_LONG_LONG:
+          case VTK_UNSIGNED_LONG_LONG:
+            r = ValueT<long long>::Compare(a, b);
+            break;
           case VTK_FLOAT:
             r = ValueT<float>::Compare(a, b);
             break;
@@ -3093,6 +3148,10 @@ ostream& operator<<(ostream& os, const vtkDICOMValue& v)
   {
     os << "longwords[" << m << "]";
   }
+  else if (vr == vtkDICOMVR::OV)
+  {
+    os << "verylongwords[" << m << "]";
+  }
   else if (vr == vtkDICOMVR::OF)
   {
     os << "floats[" << m << "]";


=====================================
Source/vtkDICOMValue.h
=====================================
@@ -100,6 +100,8 @@ public:
   vtkDICOMValue(vtkDICOMVR vr, const unsigned short *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const int *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const unsigned int *data, size_t count);
+  vtkDICOMValue(vtkDICOMVR vr, const long long *data, size_t count);
+  vtkDICOMValue(vtkDICOMVR vr, const unsigned long long *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const float *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const double *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMTag *data, size_t count);
@@ -224,6 +226,8 @@ public:
   void GetValues(unsigned short *vb, size_t n, size_t i=0) const;
   void GetValues(int *vb, size_t n, size_t i=0) const;
   void GetValues(unsigned int *vb, size_t n, size_t i=0) const;
+  void GetValues(long long *vb, size_t n, size_t i=0) const;
+  void GetValues(unsigned long long *vb, size_t n, size_t i=0) const;
   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;


=====================================
Testing/TestDICOMValue.cxx
=====================================
@@ -574,7 +574,6 @@ int main(int argc, char *argv[])
   TestAssert(!v.Matches(u));
 
   // test comparison with character sets
-  std::string s;
   v = vtkDICOMValue(
     vtkDICOMVR::LO, vtkDICOMCharacterSet("ISO 2022 IR 13\\ISO 2022 IR 87"),
     "\xd4\xcf\xc0\xde^\xc0\xdb\xb3\\\x1b$B;3ED\x1b(J^\x1b$BB at O:\x1b(J");


=====================================
Utilities/nemadict.txt
=====================================
@@ -58,6 +58,48 @@ ReceivingApplicationEntityTitle
 AE
 1
 
+(0002,0031)
+RTV Meta Information Version
+RTVMetaInformationVersion
+OB
+1
+
+(0002,0032)
+RTV Communication SOP Class UID
+RTVCommunicationSOPClassUID
+UI
+1
+
+(0002,0033)
+RTV Communication SOP Instance UID
+RTVCommunicationSOPInstanceUID
+UI
+1
+
+(0002,0035)
+RTV Source Identifier
+RTVSourceIdentifier
+OB
+1
+
+(0002,0036)
+RTV Flow Identifier
+RTVFlowIdentifier
+OB
+1
+
+(0002,0037)
+RTV Flow RTP Sampling Rate
+RTVFlowRTPSamplingRate
+UL
+1
+
+(0002,0038)
+RTV Flow Actual Frame Duration
+RTVFlowActualFrameDuration
+FD
+1
+
 (0002,0100)
 Private Information Creator UID
 PrivateInformationCreatorUID
@@ -184,6 +226,12 @@ NumberOfReferences
 UL
 1
 RET
+(0006,0001)
+Current Frame Functional Groups Sequence
+CurrentFrameFunctionalGroupsSequence
+SQ
+1
+
 (0008,0001)
 Length to End
 LengthToEnd
@@ -4234,6 +4282,12 @@ UDISequence
 SQ
 1
 
+(0018,100B)
+Manufacturer's Device Class UID
+ManufacturerDeviceClassUID
+UI
+1-n
+
 (0018,1010)
 Secondary Capture Device ID
 SecondaryCaptureDeviceID
@@ -5236,6 +5290,60 @@ ShutterPresentationColorCIELabValue
 US
 3
 
+(0018,1630)
+Outline Shape Type
+OutlineShapeType
+CS
+1
+
+(0018,1631)
+Outline Left Vertical Edge
+OutlineLeftVerticalEdge
+FD
+1
+
+(0018,1632)
+Outline Right Vertical Edge
+OutlineRightVerticalEdge
+FD
+1
+
+(0018,1633)
+Outline Upper Horizontal Edge
+OutlineUpperHorizontalEdge
+FD
+1
+
+(0018,1634)
+Outline Lower Horizontal Edge
+OutlineLowerHorizontalEdge
+FD
+1
+
+(0018,1635)
+Center of Circular Outline
+CenterOfCircularOutline
+FD
+2
+
+(0018,1636)
+Diameter of Circular Outline
+DiameterOfCircularOutline
+FD
+1
+
+(0018,1637)
+Number of Polygonal Vertices
+NumberOfPolygonalVertices
+UL
+1
+
+(0018,1638)
+Vertices of the Polygonal Outline
+VerticesOfThePolygonalOutline
+OF
+1
+
 (0018,1700)
 Collimator Shape
 CollimatorShape
@@ -7403,13 +7511,13 @@ CS
 1
 
 (0018,9369)
-Source Start Date Time
+Source Start DateTime
 SourceStartDateTime
 DT
 1
 
 (0018,936A)
-Source End Date Time
+Source End DateTime
 SourceEndDateTime
 DT
 1
@@ -12952,6 +13060,78 @@ StudyComments
 LT
 1
 RET
+(0034,0001)
+Flow Identifier Sequence
+FlowIdentifierSequence
+SQ
+1
+
+(0034,0002)
+Flow Identifier
+FlowIdentifier
+OB
+1
+
+(0034,0003)
+Flow Transfer Syntax UID
+FlowTransferSyntaxUID
+UI
+1
+
+(0034,0004)
+Flow RTP Sampling Rate
+FlowRTPSamplingRate
+UL
+1
+
+(0034,0005)
+Source Identifier
+SourceIdentifier
+OB
+1
+
+(0034,0007)
+Frame Origin Timestamp
+FrameOriginTimestamp
+OB
+1
+
+(0034,0008)
+Includes Imaging Subject
+IncludesImagingSubject
+CS
+1
+
+(0034,0009)
+Frame Usefulness Group Sequence
+FrameUsefulnessGroupSequence
+SQ
+1
+
+(0034,000A)
+Real-Time Bulk Data Flow Sequence
+RealTimeBulkDataFlowSequence
+SQ
+1
+
+(0034,000B)
+Camera Position Group Sequence
+CameraPositionGroupSequence
+SQ
+1
+
+(0034,000C)
+Includes Information
+IncludesInformation
+CS
+1
+
+(0034,000D)
+Time of Frame Group Sequence
+TimeOfFrameGroupSequence
+SQ
+1
+
 (0038,0004)
 Referenced Patient Alias Sequence
 ReferencedPatientAliasSequence
@@ -22336,6 +22516,24 @@ FrameOfReferenceTransformationComment
 LO
 1
 
+(3006,00C9)
+Patient Location Coordinates Sequence
+PatientLocationCoordinatesSequence
+SQ
+1
+
+(3006,00CA)
+Patient Location Coordinates Code Sequence
+PatientLocationCoordinatesCodeSequence
+SQ
+1
+
+(3006,00CB)
+Patient Support Position Sequence
+PatientSupportPositionSequence
+SQ
+1
+
 (3008,0010)
 Measured Dose Reference Sequence
 MeasuredDoseReferenceSequence
@@ -23235,7 +23433,7 @@ Beam Dose Specification Point
 BeamDoseSpecificationPoint
 DS
 3
-
+RET
 (300A,0083)
 Referenced Dose Reference UID
 ReferencedDoseReferenceUID
@@ -25306,6 +25504,834 @@ ReferenceDoseDefinition
 CS
 1
 
+(300A,0600)
+RT Control Point Index
+RTControlPointIndex
+US
+1
+
+(300A,0601)
+Radiation Generation Mode Index
+RadiationGenerationModeIndex
+US
+1
+
+(300A,0602)
+Referenced Defined Device Index
+ReferencedDefinedDeviceIndex
+US
+1
+
+(300A,0603)
+Radiation Dose Identification Index
+RadiationDoseIdentificationIndex
+US
+1
+
+(300A,0604)
+Number of RT Control Points
+NumberOfRTControlPoints
+US
+1
+
+(300A,0605)
+Referenced Radiation Generation Mode Index
+ReferencedRadiationGenerationModeIndex
+US
+1
+
+(300A,0606)
+Treatment Position Index
+TreatmentPositionIndex
+US
+1
+
+(300A,0607)
+Referenced Device Index
+ReferencedDeviceIndex
+US
+1
+
+(300A,0608)
+Treatment Position Group Label
+TreatmentPositionGroupLabel
+LO
+1
+
+(300A,0609)
+Treatment Position Group UID
+TreatmentPositionGroupUID
+UI
+1
+
+(300A,060A)
+Treatment Position Group Sequence
+TreatmentPositionGroupSequence
+SQ
+1
+
+(300A,060B)
+Referenced Treatment Position Index
+ReferencedTreatmentPositionIndex
+US
+1
+
+(300A,060C)
+Referenced Radiation Dose Identification Index
+ReferencedRadiationDoseIdentificationIndex
+US
+1
+
+(300A,060D)
+RT Accessory Holder Water-Equivalent Thickness
+RTAccessoryHolderWaterEquivalentThickness
+FD
+1
+
+(300A,060E)
+Referenced RT Accessory Holder Device Index
+ReferencedRTAccessoryHolderDeviceIndex
+US
+1
+
+(300A,060F)
+RT Accessory Holder Slot Existence Flag
+RTAccessoryHolderSlotExistenceFlag
+CS
+1
+
+(300A,0610)
+RT Accessory Holder Slot Sequence
+RTAccessoryHolderSlotSequence
+SQ
+1
+
+(300A,0611)
+RT Accessory Holder Slot ID
+RTAccessoryHolderSlotID
+LO
+1
+
+(300A,0612)
+RT Accessory Holder Slot Distance
+RTAccessoryHolderSlotDistance
+FD
+1
+
+(300A,0613)
+RT Accessory Slot Distance
+RTAccessorySlotDistance
+FD
+1
+
+(300A,0614)
+RT Accessory Holder Definition Sequence
+RTAccessoryHolderDefinitionSequence
+SQ
+1
+
+(300A,0615)
+RT Accessory Device Slot ID
+RTAccessoryDeviceSlotID
+LO
+1
+
+(300A,0616)
+RT Radiation Sequence
+RTRadiationSequence
+SQ
+1
+
+(300A,0617)
+Radiation Dose Sequence
+RadiationDoseSequence
+SQ
+1
+
+(300A,0618)
+Radiation Dose Identification Sequence
+RadiationDoseIdentificationSequence
+SQ
+1
+
+(300A,0619)
+Radiation Dose Identification Label
+RadiationDoseIdentificationLabel
+LO
+1
+
+(300A,061A)
+Reference Dose Type
+ReferenceDoseType
+CS
+1
+
+(300A,061B)
+Primary Dose Value Indicator
+PrimaryDoseValueIndicator
+CS
+1
+
+(300A,061C)
+Dose Values Sequence
+DoseValuesSequence
+SQ
+1
+
+(300A,061D)
+Dose Value Purpose
+DoseValuePurpose
+CS
+1-n
+
+(300A,061E)
+Reference Dose Point Coordinates
+ReferenceDosePointCoordinates
+FD
+3
+
+(300A,061F)
+Radiation Dose Values Parameters Sequence
+RadiationDoseValuesParametersSequence
+SQ
+1
+
+(300A,0620)
+Meterset to Dose Mapping Sequence
+MetersetToDoseMappingSequence
+SQ
+1
+
+(300A,0621)
+Expected In-Vivo Measurement Values Sequence
+ExpectedInVivoMeasurementValuesSequence
+SQ
+1
+
+(300A,0622)
+Expected In-Vivo Measurement Value Index
+ExpectedInVivoMeasurementValueIndex
+US
+1
+
+(300A,0623)
+Radiation Dose In-Vivo Measurement Label
+RadiationDoseInVivoMeasurementLabel
+LO
+1
+
+(300A,0624)
+Radiation Dose Central Axis Displacement
+RadiationDoseCentralAxisDisplacement
+FD
+2
+
+(300A,0625)
+Radiation Dose Value
+RadiationDoseValue
+FD
+1
+
+(300A,0626)
+Radiation Dose Source to Skin Distance
+RadiationDoseSourceToSkinDistance
+FD
+1
+
+(300A,0627)
+Radiation Dose Measurement Point Coordinates
+RadiationDoseMeasurementPointCoordinates
+FD
+3
+
+(300A,0628)
+Radiation Dose Source to External Contour Distance
+RadiationDoseSourceToExternalContourDistance
+FD
+1
+
+(300A,0629)
+RT Tolerance Set Sequence
+RTToleranceSetSequence
+SQ
+1
+
+(300A,062A)
+RT Tolerance Set Label
+RTToleranceSetLabel
+LO
+1
+
+(300A,062B)
+Attribute Tolerance Values Sequence
+AttributeToleranceValuesSequence
+SQ
+1
+
+(300A,062C)
+Tolerance Value
+ToleranceValue
+FD
+1
+
+(300A,062D)
+Patient Support Position Tolerance Sequence
+PatientSupportPositionToleranceSequence
+SQ
+1
+
+(300A,062E)
+Treatment Time Limit
+TreatmentTimeLimit
+FD
+1
+
+(300A,062F)
+C-Arm Photon-Electron Control Point Sequence
+CArmPhotonElectronControlPointSequence
+SQ
+1
+
+(300A,0630)
+Referenced RT Radiation Sequence
+ReferencedRTRadiationSequence
+SQ
+1
+
+(300A,0631)
+Referenced RT Instance Sequence
+ReferencedRTInstanceSequence
+SQ
+1
+
+(300A,0632)
+Referenced RT Patient Setup Sequence
+ReferencedRTPatientSetupSequence
+SQ
+1
+
+(300A,0634)
+Source to Patient Surface Distance
+SourceToPatientSurfaceDistance
+FD
+1
+
+(300A,0635)
+Treatment Machine Special Mode Code Sequence
+TreatmentMachineSpecialModeCodeSequence
+SQ
+1
+
+(300A,0636)
+Intended Number of Fractions
+IntendedNumberOfFractions
+US
+1
+
+(300A,0637)
+RT Radiation Set Intent
+RTRadiationSetIntent
+CS
+1
+
+(300A,0638)
+RT Radiation Physical and Geometric Content Detail Flag
+RTRadiationPhysicalAndGeometricContentDetailFlag
+CS
+1
+
+(300A,0639)
+RT Record Flag
+RTRecordFlag
+CS
+1
+
+(300A,063A)
+Treatment Device Identification Sequence
+TreatmentDeviceIdentificationSequence
+SQ
+1
+
+(300A,063B)
+Referenced RT Physician Intent Sequence
+ReferencedRTPhysicianIntentSequence
+SQ
+1
+
+(300A,063C)
+Cumulative Meterset
+CumulativeMeterset
+FD
+1
+
+(300A,063D)
+Delivery Rate
+DeliveryRate
+FD
+1
+
+(300A,063E)
+Delivery Rate Unit Sequence
+DeliveryRateUnitSequence
+SQ
+1
+
+(300A,063F)
+Treatment Position Sequence
+TreatmentPositionSequence
+SQ
+1
+
+(300A,0640)
+Radiation Source-Axis Distance
+RadiationSourceAxisDistance
+FD
+1
+
+(300A,0641)
+Number of RT Beam Limiting Devices
+NumberOfRTBeamLimitingDevices
+US
+1
+
+(300A,0642)
+RT Beam Limiting Device Proximal Distance
+RTBeamLimitingDeviceProximalDistance
+FD
+1
+
+(300A,0643)
+RT Beam Limiting Device Distal Distance
+RTBeamLimitingDeviceDistalDistance
+FD
+1
+
+(300A,0644)
+Parallel RT Beam Delimiter Device Orientation Label Code Sequence
+ParallelRTBeamDelimiterDeviceOrientationLabelCodeSequence
+SQ
+1
+
+(300A,0645)
+Beam Modifier Orientation Angle
+BeamModifierOrientationAngle
+FD
+1
+
+(300A,0646)
+Fixed RT Beam Delimiter Device Sequence
+FixedRTBeamDelimiterDeviceSequence
+SQ
+1
+
+(300A,0647)
+Parallel RT Beam Delimiter Device Sequence
+ParallelRTBeamDelimiterDeviceSequence
+SQ
+1
+
+(300A,0648)
+Number of Parallel RT Beam Delimiters
+NumberOfParallelRTBeamDelimiters
+US
+1
+
+(300A,0649)
+Parallel RT Beam Delimiter Boundaries
+ParallelRTBeamDelimiterBoundaries
+FD
+2-n
+
+(300A,064A)
+Parallel RT Beam Delimiter Positions
+ParallelRTBeamDelimiterPositions
+FD
+2-n
+
+(300A,064B)
+RT Beam Limiting Device Offset
+RTBeamLimitingDeviceOffset
+FD
+2
+
+(300A,064C)
+RT Beam Delimiter Geometry Sequence
+RTBeamDelimiterGeometrySequence
+SQ
+1
+
+(300A,064D)
+RT Beam Limiting Device Definition Sequence
+RTBeamLimitingDeviceDefinitionSequence
+SQ
+1
+
+(300A,064E)
+Parallel RT Beam Delimiter Opening Mode
+ParallelRTBeamDelimiterOpeningMode
+CS
+1
+
+(300A,064F)
+Parallel RT Beam Delimiter Leaf Mounting Side
+ParallelRTBeamDelimiterLeafMountingSide
+CS
+1-n
+
+(300A,0650)
+Patient Setup UID
+PatientSetupUID
+UI
+1
+
+(300A,0651)
+Wedge Definition Sequence
+WedgeDefinitionSequence
+SQ
+1
+
+(300A,0652)
+Radiation Beam Wedge Angle
+RadiationBeamWedgeAngle
+FD
+1
+
+(300A,0653)
+Radiation Beam Wedge Thin Edge Distance
+RadiationBeamWedgeThinEdgeDistance
+FD
+1
+
+(300A,0654)
+Radiation Beam Effective Wedge Angle
+RadiationBeamEffectiveWedgeAngle
+FD
+1
+
+(300A,0655)
+Number of Wedge Positions
+NumberOfWedgePositions
+US
+1
+
+(300A,0656)
+RT Beam Limiting Device Opening Sequence
+RTBeamLimitingDeviceOpeningSequence
+SQ
+1
+
+(300A,0657)
+Number of RT Beam Limiting Device Openings
+NumberOfRTBeamLimitingDeviceOpenings
+US
+1
+
+(300A,0658)
+Radiation Dosimeter Unit Sequence
+RadiationDosimeterUnitSequence
+SQ
+1
+
+(300A,0659)
+RT Device Distance Reference Location Code Sequence
+RTDeviceDistanceReferenceLocationCodeSequence
+SQ
+1
+
+(300A,065A)
+Radiation Device Configuration and Commissioning Key Sequence
+RadiationDeviceConfigurationAndCommissioningKeySequence
+SQ
+1
+
+(300A,065B)
+Patient Support Position Parameter Sequence
+PatientSupportPositionParameterSequence
+SQ
+1
+
+(300A,065C)
+Patient Support Position Specification Method
+PatientSupportPositionSpecificationMethod
+CS
+1
+
+(300A,065D)
+Patient Support Position Device Parameter Sequence
+PatientSupportPositionDeviceParameterSequence
+SQ
+1
+
+(300A,065E)
+Device Order Index
+DeviceOrderIndex
+US
+1
+
+(300A,065F)
+Patient Support Position Parameter Order Index
+PatientSupportPositionParameterOrderIndex
+US
+1
+
+(300A,0660)
+Patient Support Position Device Tolerance Sequence
+PatientSupportPositionDeviceToleranceSequence
+SQ
+1
+
+(300A,0661)
+Patient Support Position Tolerance Order Index
+PatientSupportPositionToleranceOrderIndex
+US
+1
+
+(300A,0662)
+Compensator Definition Sequence
+CompensatorDefinitionSequence
+SQ
+1
+
+(300A,0663)
+Compensator Map Orientation
+CompensatorMapOrientation
+CS
+1
+
+(300A,0664)
+Compensator Proximal Thickness Map
+CompensatorProximalThicknessMap
+OF
+1
+
+(300A,0665)
+Compensator Distal Thickness Map
+CompensatorDistalThicknessMap
+OF
+1
+
+(300A,0666)
+Compensator Base Plane Offset
+CompensatorBasePlaneOffset
+FD
+1
+
+(300A,0667)
+Compensator Shape Fabrication Code Sequence
+CompensatorShapeFabricationCodeSequence
+SQ
+1
+
+(300A,0668)
+Compensator Shape Sequence
+CompensatorShapeSequence
+SQ
+1
+
+(300A,0669)
+Radiation Beam Compensator Milling Tool Diameter
+RadiationBeamCompensatorMillingToolDiameter
+FD
+1
+
+(300A,066A)
+Block Definition Sequence
+BlockDefinitionSequence
+SQ
+1
+
+(300A,066B)
+Block Edge Data
+BlockEdgeData
+OF
+1
+
+(300A,066C)
+Block Orientation
+BlockOrientation
+CS
+1
+
+(300A,066D)
+Radiation Beam Block Thickness
+RadiationBeamBlockThickness
+FD
+1
+
+(300A,066E)
+Radiation Beam Block Slab Thickness
+RadiationBeamBlockSlabThickness
+FD
+1
+
+(300A,066F)
+Block Edge Data Sequence
+BlockEdgeDataSequence
+SQ
+1
+
+(300A,0670)
+Number of RT Accessory Holders
+NumberOfRTAccessoryHolders
+US
+1
+
+(300A,0671)
+General Accessory Definition Sequence
+GeneralAccessoryDefinitionSequence
+SQ
+1
+
+(300A,0672)
+Number of General Accessories
+NumberOfGeneralAccessories
+US
+1
+
+(300A,0673)
+Bolus Definition Sequence
+BolusDefinitionSequence
+SQ
+1
+
+(300A,0674)
+Number of Boluses
+NumberOfBoluses
+US
+1
+
+(300A,0675)
+Equipment Frame of Reference UID
+EquipmentFrameOfReferenceUID
+UI
+1
+
+(300A,0676)
+Equipment Frame of Reference Description
+EquipmentFrameOfReferenceDescription
+ST
+1
+
+(300A,0677)
+Equipment Reference Point Coordinates Sequence
+EquipmentReferencePointCoordinatesSequence
+SQ
+1
+
+(300A,0678)
+Equipment Reference Point Code Sequence
+EquipmentReferencePointCodeSequence
+SQ
+1
+
+(300A,0679)
+RT Beam Limiting Device Angle
+RTBeamLimitingDeviceAngle
+FD
+1
+
+(300A,067A)
+Source Roll Angle
+SourceRollAngle
+FD
+1
+
+(300A,067B)
+Radiation GenerationMode Sequence
+RadiationGenerationModeSequence
+SQ
+1
+
+(300A,067C)
+Radiation GenerationMode Label
+RadiationGenerationModeLabel
+SH
+1
+
+(300A,067D)
+Radiation GenerationMode Description
+RadiationGenerationModeDescription
+ST
+1
+
+(300A,067E)
+Radiation GenerationMode Machine Code Sequence
+RadiationGenerationModeMachineCodeSequence
+SQ
+1
+
+(300A,067F)
+Radiation Type Code Sequence
+RadiationTypeCodeSequence
+SQ
+1
+
+(300A,0680)
+Nominal Energy
+NominalEnergy
+DS
+1
+
+(300A,0681)
+Minimum Nominal Energy
+MinimumNominalEnergy
+DS
+1
+
+(300A,0682)
+Maximum Nominal Energy
+MaximumNominalEnergy
+DS
+1
+
+(300A,0683)
+Radiation Fluence Modifier Code Sequence
+RadiationFluenceModifierCodeSequence
+SQ
+1
+
+(300A,0684)
+Energy Unit Code Sequence
+EnergyUnitCodeSequence
+SQ
+1
+
+(300A,0685)
+Number of Radiation GenerationModes
+NumberOfRadiationGenerationModes
+US
+1
+
+(300A,0686)
+Patient Support Devices Sequence
+PatientSupportDevicesSequence
+SQ
+1
+
+(300A,0687)
+Number of Patient Support Devices
+NumberOfPatientSupportDevices
+US
+1
+
+(300A,0688)
+RT Beam Modifier Definition Distance
+RTBeamModifierDefinitionDistance
+FD
+1
+
+(300A,0689)
+Beam Area Limit Sequence
+BeamAreaLimitSequence
+SQ
+1
+
+(300A,068A)
+Referenced RT Prescription Sequence
+ReferencedRTPrescriptionSequence
+SQ
+1
+
 (300C,0002)
 Referenced RT Plan Sequence
 ReferencedRTPlanSequence


=====================================
Utilities/nemauids.txt
=====================================
@@ -171,6 +171,18 @@ PS3.10
 XML Encoding (Retired)
 Transfer Syntax
 PS3.10
+1.2.840.10008.1.2.7.1
+SMPTE ST 2110-20 Uncompressed Progressive Active Video
+Transfer Syntax
+PS3.5
+1.2.840.10008.1.2.7.2
+SMPTE ST 2110-20 Uncompressed Interlaced Active Video
+Transfer Syntax
+PS3.5
+1.2.840.10008.1.2.7.3
+SMPTE ST 2110-30 PCM Digital Audio
+Transfer Syntax
+PS3.5
 1.2.840.10008.1.3.10
 Media Storage Directory Storage
 SOP Class
@@ -1166,6 +1178,14 @@ PS3.4
 RT Segment Annotation Storage
 SOP Class
 PS3.4
+1.2.840.10008.5.1.4.1.1.481.12
+RT Radiation Set Storage
+SOP Class
+PS3.4
+1.2.840.10008.5.1.4.1.1.481.13
+C-Arm Photon-Electron Radiation Storage
+SOP Class
+PS3.4
 1.2.840.10008.5.1.4.1.1.501.1
 DICOS CT Image Storage
 SOP Class
@@ -1474,6 +1494,22 @@ PS3.19
 DICOM Content Mapping Resource
 Mapping Resource
 PS3.16
+1.2.840.10008.10.1
+Video Endoscopic Image Real-Time Communication
+SOP Class
+PS3.22
+1.2.840.10008.10.2
+Video Photographic Image Real-Time Communication
+SOP Class
+PS3.22
+1.2.840.10008.10.3
+Audio Waveform Real-Time Communication
+SOP Class
+PS3.22
+1.2.840.10008.10.4
+Rendition Selection Document Real-Time Communication
+SOP Class
+PS3.22
 1.2.840.10008.9.1
 Imaging Report
 Document TemplateID
@@ -1791,6 +1827,9 @@ ICBM452 T1 Atlas
 1.2.840.10008.1.4.2.2
 ICBM Single Subject MRI Frame of Reference
 ICBM Single Subject MRI Anatomical Template
+1.2.840.10008.1.4.3.1
+IEC 61217 Fixed Coordinate System Frame of Reference
+Fixed coordinate system of Section C.36.12.2.1 “IEC 61217 Fixed Reference System Frame of Reference” in PS3.3
 # Context Group UID Values ================================================
 1.2.840.10008.6.1.1
 CID 2
@@ -5345,3 +5384,51 @@ Qualitative Evaluation Modifier Values
 1.2.840.10008.6.1.1287
 CID 212
 Generic Anatomic Location Modifiers
+1.2.840.10008.6.1.1288
+CID 9541
+Beam Limiting Device Types
+1.2.840.10008.6.1.1289
+CID 9542
+Compensator Device Types
+1.2.840.10008.6.1.1290
+CID 9543
+Radiotherapy Treatment Machine Modes
+1.2.840.10008.6.1.1291
+CID 9544
+Radiotherapy Distance Reference Locations
+1.2.840.10008.6.1.1292
+CID 9545
+Fixed Beam Limiting Device Types
+1.2.840.10008.6.1.1293
+CID 9546
+Radiotherapy Wedge Types
+1.2.840.10008.6.1.1294
+CID 9547
+RT Beam Limiting Device Orientation Labels
+1.2.840.10008.6.1.1295
+CID 9548
+General Accessory Device Types
+1.2.840.10008.6.1.1296
+CID 9549
+Radiation Generation Mode Types
+1.2.840.10008.6.1.1297
+CID 9550
+C-Arm Photon-Electron Delivery Rate Units
+1.2.840.10008.6.1.1298
+CID 9551
+Treatment Delivery Device Types
+1.2.840.10008.6.1.1299
+CID 9552
+C-Arm Photon-Electron Dosimeter Units
+1.2.840.10008.6.1.1300
+CID 9553
+Treatment Points
+1.2.840.10008.6.1.1301
+CID 9554
+Equipment Reference Points
+1.2.840.10008.6.1.1302
+CID 9555
+Radiotherapy Treatment Planning Person Roles
+1.2.840.10008.6.1.1303
+CID 7070
+Real Time Video Rendition Titles



View it on GitLab: https://salsa.debian.org/med-team/vtk-dicom/commit/c8b97ae1f2ddb84f05410e28e12e7694ed4b4b83

-- 
View it on GitLab: https://salsa.debian.org/med-team/vtk-dicom/commit/c8b97ae1f2ddb84f05410e28e12e7694ed4b4b83
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20191101/946f0b04/attachment-0001.html>


More information about the debian-med-commit mailing list