Пример #1
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (_match.Match(dataset))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _match.Tag);
         dataset.AddOrUpdate(_match.Tag, _value);
     }
 }
Пример #2
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_src))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _dst);
         dataset.AddOrUpdate(_dst, dataset.GetDicomItem <DicomElement>(_src).Buffer);
     }
 }
Пример #3
0
        public void ConstraintsTestOrder()
        {
            var o0 = new OrderedIntConstraint(Order.Never, 42, DicomTag.SeriesNumber);
            var o1 = new OrderedIntConstraint(Order.LessThan, 42, DicomTag.SeriesNumber);
            var o2 = new OrderedIntConstraint(Order.LessThanOrEqual, 42, DicomTag.SeriesNumber);
            var o3 = new OrderedIntConstraint(Order.Equal, 42, DicomTag.SeriesNumber);
            var o4 = new OrderedIntConstraint(Order.GreaterThan, 42, DicomTag.SeriesNumber);
            var o5 = new OrderedIntConstraint(Order.GreaterThanOrEqual, 42, DicomTag.SeriesNumber);
            var o6 = new OrderedIntConstraint(Order.NotEqual, 42, DicomTag.SeriesNumber);
            var o7 = new OrderedIntConstraint(Order.Always, 42, DicomTag.SeriesNumber);

            DicomDataset ds = new DicomDataset
            {
                { DicomTag.SeriesNumber, 41 },
            };

            Assert.IsFalse(o0.Check(ds).Result);
            Assert.IsTrue(o1.Check(ds).Result);
            Assert.IsTrue(o2.Check(ds).Result);
            Assert.IsFalse(o3.Check(ds).Result);
            Assert.IsFalse(o4.Check(ds).Result);
            Assert.IsFalse(o5.Check(ds).Result);
            Assert.IsTrue(o6.Check(ds).Result);
            Assert.IsTrue(o7.Check(ds).Result);

            ds.AddOrUpdate(DicomTag.SeriesNumber, 42);
            Assert.IsFalse(o0.Check(ds).Result);
            Assert.IsFalse(o1.Check(ds).Result);
            Assert.IsTrue(o2.Check(ds).Result);
            Assert.IsTrue(o3.Check(ds).Result);
            Assert.IsFalse(o4.Check(ds).Result);
            Assert.IsTrue(o5.Check(ds).Result);
            Assert.IsFalse(o6.Check(ds).Result);
            Assert.IsTrue(o7.Check(ds).Result);

            ds.AddOrUpdate(DicomTag.SeriesNumber, 43);
            Assert.IsFalse(o0.Check(ds).Result);
            Assert.IsFalse(o1.Check(ds).Result);
            Assert.IsFalse(o2.Check(ds).Result);
            Assert.IsFalse(o3.Check(ds).Result);
            Assert.IsTrue(o4.Check(ds).Result);
            Assert.IsTrue(o5.Check(ds).Result);
            Assert.IsTrue(o6.Check(ds).Result);
            Assert.IsTrue(o7.Check(ds).Result);
        }
Пример #4
0
        public void ConstraintsTime()
        {
            var o0 = new TimeOrderConstraint(Order.Never, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o1 = new TimeOrderConstraint(Order.LessThan, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o2 = new TimeOrderConstraint(Order.LessThanOrEqual, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o3 = new TimeOrderConstraint(Order.Equal, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o4 = new TimeOrderConstraint(Order.GreaterThan, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o5 = new TimeOrderConstraint(Order.GreaterThanOrEqual, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o6 = new TimeOrderConstraint(Order.NotEqual, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);
            var o7 = new TimeOrderConstraint(Order.Always, new TimeSpan(11, 11, 11), DicomTag.SeriesTime);

            DicomDataset ds = new DicomDataset
            {
                { DicomTag.SeriesTime, new DateTime(2017, 2, 14, 10, 11, 11) },
            };

            Assert.IsFalse(o0.Check(ds).Result);
            Assert.IsTrue(o1.Check(ds).Result);
            Assert.IsTrue(o2.Check(ds).Result);
            Assert.IsFalse(o3.Check(ds).Result);
            Assert.IsFalse(o4.Check(ds).Result);
            Assert.IsFalse(o5.Check(ds).Result);
            Assert.IsTrue(o6.Check(ds).Result);
            Assert.IsTrue(o7.Check(ds).Result);

            ds.AddOrUpdate(DicomTag.SeriesTime, new DateTime(2017, 2, 14, 11, 11, 11));
            Assert.IsFalse(o0.Check(ds).Result);
            Assert.IsFalse(o1.Check(ds).Result);
            Assert.IsTrue(o2.Check(ds).Result);
            Assert.IsTrue(o3.Check(ds).Result);
            Assert.IsFalse(o4.Check(ds).Result);
            Assert.IsTrue(o5.Check(ds).Result);
            Assert.IsFalse(o6.Check(ds).Result);
            Assert.IsTrue(o7.Check(ds).Result);

            ds.AddOrUpdate(DicomTag.SeriesTime, new DateTime(2017, 2, 14, 13, 11, 11));
            Assert.IsFalse(o0.Check(ds).Result);
            Assert.IsFalse(o1.Check(ds).Result);
            Assert.IsFalse(o2.Check(ds).Result);
            Assert.IsFalse(o3.Check(ds).Result);
            Assert.IsTrue(o4.Check(ds).Result);
            Assert.IsTrue(o5.Check(ds).Result);
            Assert.IsTrue(o6.Check(ds).Result);
            Assert.IsTrue(o7.Check(ds).Result);
        }
Пример #5
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.GetString(_tag);
         dataset.AddOrUpdate(_tag, value.ToLower());
     }
 }
Пример #6
0
        public void AddOrUpdate_NonDefaultEncodedStringElement_StringIsPreserved()
        {
            var          encoding = Encoding.GetEncoding("SHIFT_JIS");
            var          tag      = DicomTag.AdditionalPatientHistory;
            const string expected = "YamadaTarou山田太郎ヤマダタロウ";

            var dataset = new DicomDataset();

            dataset.AddOrUpdate(DicomTag.SpecificCharacterSet, DicomEncoding.GetCharset(encoding));
            dataset.AddOrUpdate(tag, expected);

            // simulate some kind of serialization, so that the buffer data is created correctly
            dataset.OnBeforeSerializing();

            var actual = encoding.GetString(dataset.GetDicomItem <DicomElement>(tag).Buffer.Data);

            Assert.Equal(expected, actual);
        }
        /// <summary>
        /// Post-process step for the anonymised DICOM dataset.
        /// </summary>
        /// <param name="newds">The DICOM dataset.</param>
        public void Postprocess(DicomDataset newds)
        {
            if (newds == null)
            {
                throw new ArgumentNullException(nameof(newds));
            }

            newds.TryGetValues(DicomTag.DeidentificationMethod, out string[] values);

            var dicomDatasetDeidentificationMethods = values?.ToList() ?? new List <string>();

            // The VR is LO - therefore chopping this down to 64 characters
            dicomDatasetDeidentificationMethods.Add(DeidentificationMethodString.Substring(0, Math.Min(DeidentificationMethodString.Length, 64)));

            newds.AddOrUpdate(DicomTag.DeidentificationMethod, dicomDatasetDeidentificationMethods.ToArray());
            newds.AddOrUpdate(DicomTag.PatientIdentityRemoved, "YES");
            newds.AddOrUpdate(DicomTag.LongitudinalTemporalInformationModified, "MODIFIED");
        }
Пример #8
0
        public void DicomValidation_ValidateUID()
        {
            var ds       = new DicomDataset();
            var validUid = "1.2.315.6666.0.0.0.8965.19187632.1";

            ds.Add(DicomTag.StudyInstanceUID, validUid);
            Assert.Equal(validUid, ds.GetSingleValue <string>(DicomTag.StudyInstanceUID));

            var tooLongUid = validUid + "." + validUid;
            var ex         = Assert.ThrowsAny <DicomValidationException>(() => ds.AddOrUpdate(DicomTag.StudyInstanceUID, tooLongUid));

            Assert.Contains("length", ex.Message);

            var leadingZeroUid = validUid + ".03";
            var ex2            = Assert.ThrowsAny <DicomValidationException>(() => ds.AddOrUpdate(DicomTag.SeriesInstanceUID, leadingZeroUid));

            Assert.Contains("leading zero", ex2.Message);
        }
Пример #9
0
        public void Process(DicomDataset dicomDataset, DicomItem item, Dictionary <string, object> settings = null)
        {
            if (DateShiftScope == DateShiftScope.StudyInstance)
            {
                DateShiftFunction.DateShiftKeyPrefix = dicomDataset.GetSingleValue <string>(DicomTag.StudyInstanceUID);
            }
            else if (DateShiftScope == DateShiftScope.SeriesInstance)
            {
                DateShiftFunction.DateShiftKeyPrefix = dicomDataset.GetSingleValue <string>(DicomTag.SeriesInstanceUID);
            }
            else if (DateShiftScope == DateShiftScope.SopInstance)
            {
                DateShiftFunction.DateShiftKeyPrefix = dicomDataset.GetSingleValue <string>(DicomTag.SOPInstanceUID);
            }

            if (item.ValueRepresentation == DicomVR.DA)
            {
                var values = ((DicomDate)item).Get <string[]>().Select(x => DateShiftFunction.ShiftDateTime(Utility.ParseDicomDate(x))).Where(x => !DateTimeUtility.IndicateAgeOverThreshold(x));
                dicomDataset.AddOrUpdate(item.Tag, values.Select(x => Utility.GenerateDicomDateString(x)).ToArray());
            }
            else if (item.ValueRepresentation == DicomVR.DT)
            {
                var results = new List <string>();
                var values  = ((DicomDate)item).Get <string[]>();
                foreach (var value in values)
                {
                    var dateObject = Utility.ParseDicomDateTime(value);
                    dateObject.DateValue = DateShiftFunction.ShiftDateTime(dateObject.DateValue);
                    if (!DateTimeUtility.IndicateAgeOverThreshold(dateObject.DateValue))
                    {
                        results.Add(Utility.GenerateDicomDateTimeString(dateObject));
                    }
                }

                if (results.Count != 0)
                {
                    dicomDataset.AddOrUpdate(item.Tag, results.ToArray());
                }
            }
            else
            {
                throw new Exception($"Dateshift is not supported for {item.ValueRepresentation}");
            }
        }
Пример #10
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.GetString(_tag);
         value = Regex.Replace(value, _pattern, _replacement);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #11
0
 public void OnEndFragmentSequence()
 {
     if (_fragment != null)
     {
         // only add the dicomtag if no fragment has been skipped due to SkipLargeTags
         DicomDataset ds = _datasets.Peek();
         ds.AddOrUpdate(_fragment);
     }
     _fragment = null;
 }
Пример #12
0
        public void OnBeginSequence(IByteSource source, DicomTag tag, uint length)
        {
            var sq = new DicomSequence(tag);

            _sequences.Push(sq);

            DicomDataset ds = _datasets.Peek();

            ds.AddOrUpdate(sq);
        }
Пример #13
0
        public void OnElement(IByteSource source, DicomTag tag, DicomVR vr, IByteBuffer data)
        {
            DicomElement element = vr.Code switch
            {
                "AE" => new DicomApplicationEntity(tag, data),
                "AS" => new DicomAgeString(tag, data),
                "AT" => new DicomAttributeTag(tag, data),
                "CS" => new DicomCodeString(tag, data),
                "DA" => new DicomDate(tag, data),
                "DS" => new DicomDecimalString(tag, data),
                "DT" => new DicomDateTime(tag, data),
                "FD" => new DicomFloatingPointDouble(tag, data),
                "FL" => new DicomFloatingPointSingle(tag, data),
                "IS" => new DicomIntegerString(tag, data),
                "LO" => new DicomLongString(tag, _encodings.Peek(), data),
                "LT" => new DicomLongText(tag, _encodings.Peek(), data),
                "OB" => new DicomOtherByte(tag, data),
                "OD" => new DicomOtherDouble(tag, data),
                "OF" => new DicomOtherFloat(tag, data),
                "OL" => new DicomOtherLong(tag, data),
                "OV" => new DicomOtherVeryLong(tag, data),
                "OW" => new DicomOtherWord(tag, data),
                "PN" => new DicomPersonName(tag, _encodings.Peek(), data),
                "SH" => new DicomShortString(tag, _encodings.Peek(), data),
                "SL" => new DicomSignedLong(tag, data),
                "SS" => new DicomSignedShort(tag, data),
                "ST" => new DicomShortText(tag, _encodings.Peek(), data),
                "SV" => new DicomSignedVeryLong(tag, data),
                "TM" => new DicomTime(tag, data),
                "UC" => new DicomUnlimitedCharacters(tag, _encodings.Peek(), data),
                "UI" => new DicomUniqueIdentifier(tag, data),
                "UL" => new DicomUnsignedLong(tag, data),
                "UN" => new DicomUnknown(tag, data),
                "UR" => new DicomUniversalResource(tag, _encodings.Peek(), data),
                "US" => new DicomUnsignedShort(tag, data),
                "UT" => new DicomUnlimitedText(tag, _encodings.Peek(), data),
                "UV" => new DicomUnsignedVeryLong(tag, data),
                _ => throw new DicomDataException($"Unhandled VR in DICOM parser observer: {vr.Code}"),
            };

            if (element.Tag == DicomTag.SpecificCharacterSet)
            {
                Encoding[] encodings = _encodings.Peek();
                if (element.Count > 0)
                {
                    encodings = DicomEncoding.GetEncodings(element.Get <string[]>(0));
                }
                _encodings.Pop();
                _encodings.Push(encodings);
            }

            DicomDataset ds = _datasets.Peek();

            ds.AddOrUpdate(element);
        }
Пример #14
0
        public static void WriteStudy(this DicomDataset dataset, DicomStudy study)
        {
            dataset.AddOrUpdate(DicomTag.PatientName, study.Paitent.PatientName);
            dataset.AddOrUpdate(DicomTag.PatientID, study.Paitent.PatientID);
            dataset.AddOrUpdate(DicomTag.PatientSex, study.Paitent.PatientSex);

            dataset.AddOrUpdate(DicomTag.StudyInstanceUID, study.StudyUID);
            dataset.AddOrUpdate(DicomTag.StudyID, study.StudyID);
            dataset.AddOrUpdate(DicomTag.StudyDate, study.StudyDate);
            dataset.AddOrUpdate(DicomTag.StudyTime, study.StudyTime);

            dataset.AddOrUpdate(DicomTag.NumberOfStudyRelatedInstances, study.SeriesCollection.Count.ToString());
        }
Пример #15
0
        public void Process(DicomDataset dicomDataset, DicomItem item, Dictionary <string, object> settings = null)
        {
            // var values = Utility.SplitValues(Encoding.UTF8.GetString(((DicomElement)item).Buffer.Data));

            var redactedValues = new List <string>()
            {
            };

            if (item.ValueRepresentation == DicomVR.AS)
            {
                var values = ((DicomAgeString)item).Get <string[]>();
                foreach (var value in values)
                {
                    var result = Utility.AgeToString(RedactFunction.RedactAge(Utility.ParseAge(value)));
                    if (result != null)
                    {
                        redactedValues.Add(result);
                    }
                }
            }

            if (item.ValueRepresentation == DicomVR.DA)
            {
                var values = ((DicomDate)item).Get <string[]>();
                foreach (var value in values)
                {
                    var result = RedactFunction.RedactDateTime(Utility.ParseDicomDate(value));
                    if (result != null)
                    {
                        redactedValues.Add(Utility.GenerateDicomDateString((DateTimeOffset)result));
                    }
                }
            }

            if (item.ValueRepresentation == DicomVR.DT)
            {
                var values = ((DicomDateTime)item).Get <string[]>();
                foreach (var value in values)
                {
                    var result = RedactFunction.RedactDateTime(Utility.ParseDicomDateTime(value));
                    if (result != null)
                    {
                        redactedValues.Add(Utility.GenerateDicomDateTimeString(result));
                    }
                }
            }

            dicomDataset.Remove(item.Tag);

            if (redactedValues.Count() != 0)
            {
                dicomDataset.AddOrUpdate(item.Tag, redactedValues.ToArray());
            }
        }
Пример #16
0
        public void ConstraintCodeString()
        {
            DicomDataset ds = new DicomDataset();

            ds.AddOrUpdate(DicomTag.BodyPartExamined, "PELVIS");

            var d0 = new OrderedStringConstraint(Order.NotEqual, "SKULL", DicomTag.BodyPartExamined);
            var c0 = new RequiredTagConstraint(TagRequirement.Optional, d0);

            Assert.IsTrue(c0.Check(ds).Result);
        }
Пример #17
0
        public async Task GivenDicomTagWithDifferentVR_WhenValidated_ThenShouldSkip()
        {
            var featureConfiguration = Options.Create(new FeatureConfiguration()
            {
                EnableFullDicomItemValidation = false
            });
            DicomTag     tag     = DicomTag.Date;
            DicomElement element = new DicomDateTime(tag, DateTime.Now);

            _dicomDataset.AddOrUpdate(element);

            _queryTags.Clear();
            _queryTags.Add(new QueryTag(tag.BuildExtendedQueryTagStoreEntry()));
            IDicomElementMinimumValidator validator = Substitute.For <IDicomElementMinimumValidator>();

            _dicomDatasetValidator = new DicomDatasetValidator(featureConfiguration, validator, _queryTagService);
            await _dicomDatasetValidator.ValidateAsync(_dicomDataset, requiredStudyInstanceUid : null);

            validator.DidNotReceive().Validate(Arg.Any <DicomElement>());
        }
Пример #18
0
        public void ConstraintUID()
        {
            DicomDataset ds = new DicomDataset();

            ds.AddOrUpdate(DicomTag.SOPClassUID, DicomUID.CTImageStorage);

            var s0 = new UIDStringOrderConstraint(Order.Equal, DicomUID.CTImageStorage.UID, DicomTag.SOPClassUID);
            var c0 = new RequiredTagConstraint(TagRequirement.PresentNotEmpty, s0);

            Assert.IsTrue(c0.Check(ds).Result);
        }
Пример #19
0
        public void ConstraintRegex()
        {
            var c0  = new RegexConstraint(DicomTag.SeriesDescription, @"(hog)", RegexOptions.ECMAScript);
            var c0R = new RequiredTagConstraint(TagRequirement.Optional, c0);

            DicomDataset ds = new DicomDataset();

            ds.AddOrUpdate(DicomTag.SeriesDescription, @"hog protocol v1");

            Assert.IsTrue(c0R.Check(ds).Result);
        }
Пример #20
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var      value = dataset.GetString(_tag);
         string[] parts = value.Split(_seperators);
         value = string.Format(_format, parts);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #21
0
        /// <summary>Blanks an item to value suitable for the concrete item type.</summary>
        /// <param name="dataset">Reference to the dataset</param>
        /// <param name="item">DICOM item subject to blanking.</param>
        /// <param name="nonZeroLength">Require that new value is non-zero length (dummy) value?</param>
        private static void BlankItem(DicomDataset dataset, DicomItem item, bool nonZeroLength)
        {
            var tag = item.Tag;

            if (item is DicomSequence)
            {
                dataset.AddOrUpdate <DicomDataset>(DicomVR.SQ, tag);
                return;
            }

            // Special date/time cases
            if (item is DicomDateTime)
            {
                dataset.AddOrUpdate(nonZeroLength
                    ? new DicomDateTime(tag, DateTime.MinValue)
                    : new DicomDateTime(tag, Array.Empty <string>()));
                return;
            }
            if (item is DicomDate)
            {
                dataset.AddOrUpdate(nonZeroLength
                    ? new DicomDate(tag, DateTime.MinValue)
                    : new DicomDate(tag, Array.Empty <string>()));
                return;
            }
            if (item is DicomTime)
            {
                dataset.AddOrUpdate(nonZeroLength
                    ? new DicomTime(tag, DateTime.MinValue)
                    : new DicomTime(tag, Array.Empty <string>()));
                return;
            }

            if (item is DicomStringElement stringElement)
            {
                dataset.AddOrUpdate(stringElement.ValueRepresentation, tag, string.Empty);
                return;
            }

            if (IsOtherElement(item)) // Replaces with an empty array
            {
                var ctor    = GetConstructor(item, typeof(DicomTag), typeof(IByteBuffer));
                var updated = (DicomItem)ctor.Invoke(new object[] { tag, EmptyBuffer.Value });
                dataset.AddOrUpdate(updated);
                return;
            }

            var valueType = ElementValueType(item); // Replace with the default value

            if (valueType != null)
            {
                var ctor    = GetConstructor(item, typeof(DicomTag), valueType);
                var updated = (DicomItem)ctor.Invoke(new[] { tag, Activator.CreateInstance(valueType) });
                dataset.AddOrUpdate(updated);
            }
        }
Пример #22
0
 public void CopyTo(DicomDataset dataset)
 {
     dataset.AddOrUpdate(DicomTag.PatientName, PatientName);
     dataset.AddOrUpdate(DicomTag.PatientID, PatientId);
     dataset.AddOrUpdate(DicomTag.AccessionNumber, AccessionNumber);
     dataset.AddOrUpdate(DicomTag.ModalitiesInStudy, Modality);
     dataset.AddOrUpdate(DicomTag.StudyDate, new DicomDateRange(StartDate, EndDate));
     dataset.AddOrUpdate(DicomTag.StudyDescription, Description);
     dataset.AddOrUpdate(DicomTag.NumberOfStudyRelatedInstances, "");
 }
Пример #23
0
        public void DicomValidation_ValidateDS()
        {
            var ds      = new DicomDataset();
            var validDS = "0.333333333333  "; // 16 chars

            ds.Add(DicomTag.RescaleSlope, validDS);
            Assert.Equal(validDS, ds.GetSingleValue <string>(DicomTag.RescaleSlope));

            var notValidDS = "0.333333333333   "; // 17 chars

            Assert.Throws <DicomValidationException>(() => ds.AddOrUpdate(DicomTag.RescaleSlope, notValidDS));
        }
Пример #24
0
        public void AddOrUpdatePixelData_InternalTransferSyntax_Succeeds()
        {
            var ds   = new DicomDataset();
            var data = new MemoryByteBuffer(new byte[] { 255 }); //dummy data

            ds.AddOrUpdate(DicomTag.BitsAllocated, (ushort)8);
            var pixelData = DicomPixelData.Create(ds, true);

            pixelData.AddFrame(data);

            Assert.Equal(DicomTransferSyntax.ExplicitVRLittleEndian, ds.InternalTransferSyntax);
        }
        internal void AddIfExistsInRequest <T>(DicomDataset dataset, DicomDataset request, DicomTag tag, T value)
        {
            if (request.Contains(tag))
            {
                if (value == null)
                {
                    value = default(T);
                }

                dataset.AddOrUpdate(tag, value);
            }
        }
Пример #26
0
 internal static void AddIfExistsInRequest <T>(DicomDataset result, DicomDataset request, DicomTag tag, T value)
 {
     // Only send items which have been requested
     if (request.Contains(tag))
     {
         if (value == null)
         {
             value = default(T);
         }
         result.AddOrUpdate(tag, value);
     }
 }
Пример #27
0
        private void CreateElement(string tagString, DicomDataset dicomRequest, string value)
        {
            // special include fields. Server include all by default.
            if (tagString.ToLower() == "all")
            {
                return;
            }

            uint tag = GetTagValue(tagString);

            dicomRequest.AddOrUpdate(tag, value);
        }
Пример #28
0
        public RoutedItem Dicomize(RoutedItem ri)
        {
            var routedItem = (RoutedItemEx)ri;

            try
            {
                _logger.Log(LogLevel.Information, $"Attempting to DICOMIZE {routedItem.sourceFileName}");
                DicomDataset data = new DicomDataset();
                data.AddOrUpdate(DicomTag.PatientID, routedItem.PatientID);
                data.AddOrUpdate(DicomTag.StudyInstanceUID, routedItem.Study);
                data.AddOrUpdate(DicomTag.AccessionNumber, routedItem.AccessionNumber);
                data.AddOrUpdate(DicomTag.SeriesInstanceUID, routedItem.AccessionNumber);
                data.AddOrUpdate(DicomTag.SOPInstanceUID, routedItem.Sop);
                data.AddOrUpdate(DicomTag.IssuerOfPatientID, routedItem.PatientIDIssuer);
                data.Add(DicomTag.SOPClassUID, DicomUID.EncapsulatedPDFStorage);
                byte[] fileData = _util.ReadBytesFromFile(routedItem.sourceFileName);
                if (fileData.Length > 0)
                {
                    data.Add(DicomTag.EncapsulatedDocument, fileData);

                    routedItem.sourceDicomFile = new DicomFile(data);
                    routedItem.sourceDicomFile.Save(routedItem.sourceFileName);
                }
            }
            catch (Exception e)
            {
                _logger.Log(LogLevel.Critical, $"{routedItem.sourceFileName} cannot be DICOMIZED {e.Message} {e.StackTrace}");
            }

            return(routedItem);
        }
        static internal unsafe void Start(string[] args)
        {
            const string       sourceFilePath  = "/media/nikolaev_ov/CEFE3C54FE3C36D5/DICOM/gsps.pre";
            const string       destFilePath    = "/media/nikolaev_ov/CEFE3C54FE3C36D5/DICOM/gsps2.pre";
            DicomDataset       sourceDataset   = DicomFile.Open(sourceFilePath).Dataset;
            HashSet <DicomTag> notRemovingTags = new HashSet <DicomTag>
            {
                DicomTag.StudyInstanceUID,
                DicomTag.SeriesInstanceUID,
                DicomTag.SOPInstanceUID,
                DicomTag.SOPClassUID,
                DicomTag.Modality,
                DicomTag.SpecificCharacterSet,


                DicomTag.ReferencedSeriesSequence,
                DicomTag.GraphicAnnotationSequence,
                DicomTag.GraphicLayerSequence,
                DicomTag.DisplayedAreaSelectionSequence,
                DicomTag.SoftcopyVOILUTSequence,
            };
            string          StudyInstanceUID  = sourceDataset.GetSingleValue <string>(DicomTag.StudyInstanceUID);  //1.3.6.1.4.1.14519.5.2.1.6279.6001.298806137288633453246975630178
            string          SeriesInstanceUID = sourceDataset.GetSingleValue <string>(DicomTag.SeriesInstanceUID); //1.3.6.1.4.1.14519.5.2.1.6279.6001.298806137288633453246.1.2
            string          SOPInstanceUID    = sourceDataset.GetSingleValue <string>(DicomTag.SOPInstanceUID);    //1.3.6.1.4.1.14519.5.2.1.6279.6001.179049373636438705059.1.2
            string          SOPClassUID       = sourceDataset.GetSingleValue <string>(DicomTag.SOPClassUID);       //1.2.840.10008.5.1.4.1.1.11.1
            string          Modality          = sourceDataset.GetSingleValue <string>(DicomTag.Modality);          //1.2.840.10008.5.1.4.1.1.11.1
            List <DicomTag> removingTags      = new List <DicomTag>();

            foreach (DicomItem item in sourceDataset)
            {
                if (!notRemovingTags.Contains(item.Tag))
                {
                    removingTags.Add(item.Tag);
                }
            }
            sourceDataset.Remove(removingTags.ToArray());

            sourceDataset.AddOrUpdate(DicomTag.StudyInstanceUID, new DicomUID
                                      (
                                          "1.3.6.1.4.1.14519.5.2.1.6279.6001.298806137288633453246975630178",
                                          "Study Instance UID",
                                          DicomUidType.SOPInstance
                                      ));
            sourceDataset.AddOrUpdate(DicomTag.SeriesInstanceUID, new DicomUID
                                      (
                                          "1.3.6.1.4.1.14519.5.2.1.6279.6001.298806137288633453246.1.2",
                                          "Series Instance UID",
                                          DicomUidType.SOPInstance
                                      ));
            sourceDataset.AddOrUpdate(DicomTag.SOPInstanceUID, new DicomUID
                                      (
                                          "1.3.6.1.4.1.14519.5.2.1.6279.6001.179049373636438705059.1.2",
                                          "SOP Instance UID",
                                          DicomUidType.SOPInstance
                                      ));
            sourceDataset.AddOrUpdate(DicomTag.SOPClassUID, "1.2.840.10008.5.1.4.1.1.11.1");
            sourceDataset.AddOrUpdate(DicomTag.Modality, "PR");
            sourceDataset.AddOrUpdate(DicomTag.SpecificCharacterSet, "ISO_IR 192");
            new DicomFile(sourceDataset).Save(destFilePath);
        }
        public async Task StoreJpegs(string baseUri, string bearerToken, string patientId, string studyId,
                                     string modality, string studyDate, params string[] files)
        {
            //Arrange
            Assert.True(ValidateParameters(baseUri, bearerToken, patientId, studyId));

            var httpClient = _stowRsTestFixture
                             .UseBaseUri(baseUri)
                             .UseBearerToken(bearerToken)
                             .Build();

            var dataset = new DicomDataset();

            dataset.AddOrUpdate(DicomTag.PatientID, patientId);
            dataset.AddOrUpdate(DicomTag.StudyID, studyId);

            //for JPEG you MUST define "Modality" and "StudyDate" tags
            dataset.AddOrUpdate(DicomTag.Modality, modality);
            dataset.AddOrUpdate(DicomTag.StudyDate, studyDate);

            var dataToStore = TestHelper.FillDataWithBlobDataUris(dataset, files.Select(Path.GetFullPath));

            var request = new HttpRequestMessage(HttpMethod.Post, _stowRsTestFixture.RequestUri)
            {
                Content = TestHelper.CreateMultipartContent(dataToStore)
            };

            //Act
            var result = await httpClient.SendAsync(request);

            //Assert
            if (result.IsSuccessStatusCode == false)
            {
                _output.WriteLine(result.ReasonPhrase);
                _output.WriteLine(await result.Content.ReadAsStringAsync());
            }

            Assert.Equal(HttpStatusCode.OK, result.StatusCode);
        }
Пример #31
0
        /// <summary>
        /// Regenerate all UIDs in a DICOM dataset.
        /// </summary>
        /// <param name="dataset">Dataset in which UIDs should be regenerated.</param>
        public void RegenerateAll(DicomDataset dataset)
        {
            foreach (var ui in dataset.Where(x => x.ValueRepresentation == DicomVR.UI).ToArray())
            {
                var uid = dataset.Get<DicomUID>(ui.Tag);
                if (uid.Type == DicomUidType.SOPInstance || uid.Type == DicomUidType.Unknown) dataset.AddOrUpdate(ui.Tag, this.Generate(uid));
            }

            foreach (var sq in dataset.Where(x => x.ValueRepresentation == DicomVR.SQ).Cast<DicomSequence>().ToArray())
            {
                foreach (var item in sq)
                {
                    this.RegenerateAll(item);
                }
            }
        }
Пример #32
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_src))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _dst);
         dataset.AddOrUpdate(_dst, dataset.Get<IByteBuffer>(_src));
     }
 }
Пример #33
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag) && dataset.Get<string>(_tag, -1, String.Empty) == _match)
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         dataset.AddOrUpdate(_tag, _value);
     }
 }
Пример #34
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         if (_position == DicomTrimPosition.Start || _position == DicomTrimPosition.Both) while (value.StartsWith(_trim)) value = value.Substring(_trim.Length);
         if (_position == DicomTrimPosition.End || _position == DicomTrimPosition.Both) while (value.EndsWith(_trim)) value = value.Substring(0, value.Length - _trim.Length);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #35
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         value = Regex.Replace(value, _pattern, _replacement);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #36
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         if (_totalLength < 0) value = value.PadLeft(-_totalLength, _paddingChar);
         else value = value.PadRight(_totalLength, _paddingChar);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #37
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         if (_position == DicomTrimPosition.Both)
         {
             if (_trim != null) value = value.Trim(_trim);
             else value = value.Trim();
         }
         else if (_position == DicomTrimPosition.Start)
         {
             if (_trim != null) value = value.TrimStart(_trim);
             else value = value.TrimStart();
         }
         else
         {
             if (_trim != null) value = value.TrimEnd(_trim);
             else value = value.TrimEnd();
         }
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #38
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         string[] parts = value.Split(_seperators);
         value = String.Format(_format, parts);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #39
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         string[] parts = value.Split('\\');
         for (int i = 0; i < parts.Length; i++)
         {
             if (parts[i].Length > _length) parts[i] = parts[i].Substring(0, _length);
         }
         value = String.Join("\\", parts);
         dataset.AddOrUpdate(_tag, value);
     }
 }
Пример #40
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     if (dataset.Contains(_tag))
     {
         dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
         var value = dataset.Get<string>(_tag, -1, String.Empty);
         dataset.AddOrUpdate(_tag, value.ToLower());
     }
 }
Пример #41
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
     var uid = dataset.Get<DicomUID>(_tag);
     dataset.AddOrUpdate(_tag, _generator.Generate(uid));
 }
Пример #42
0
 public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
 {
     dataset.CopyTo(modifiedAttributesSequenceItem, _tag);
     dataset.AddOrUpdate(_tag, _value);
 }
Пример #43
0
        private static void ProcessOverlays(DicomDataset input, DicomDataset output)
        {
            var overlays = DicomOverlayData.FromDataset(input.InternalTransferSyntax.IsEncapsulated ? output : input);

            foreach (var overlay in overlays)
            {
                var dataTag = new DicomTag(overlay.Group, DicomTag.OverlayData.Element);

                // Don't run conversion on non-embedded overlays.
                if (output.Contains(dataTag)) continue;

                // If embedded overlay, Overlay Bits Allocated should equal Bits Allocated (#110).
                var bitsAlloc = output.Get(DicomTag.BitsAllocated, (ushort)0);
                output.AddOrUpdate(new DicomTag(overlay.Group, DicomTag.OverlayBitsAllocated.Element), bitsAlloc);

                var data = overlay.Data;
                if (output.InternalTransferSyntax.IsExplicitVR) output.AddOrUpdate(new DicomOtherByte(dataTag, data));
                else output.AddOrUpdate(new DicomOtherWord(dataTag, data));
            }
        }
Пример #44
0
        public void Transform(DicomDataset dataset, DicomDataset modifiedAttributesSequenceItem = null)
        {
            IDbConnection connection = null;

            try
            {
                if (_dbType == DatabaseType.MsSql) connection = new SqlConnection(_connectionString);
#if !__IOS__ && !__ANDROID__ && !NETSTANDARD
                else if (_dbType == DatabaseType.Odbc) connection = new OdbcConnection(_connectionString);
#endif
                using (IDbCommand command = connection.CreateCommand())
                {
                    command.Connection = connection;
                    command.CommandText = _query;

                    for (int i = 0; i < _params.Count; i++)
                    {
                        var str = dataset.Get<string>(_params[i], -1, String.Empty);
                        SqlParameter prm = new SqlParameter(String.Format("@{0}", i), str);
                        command.Parameters.Add(prm);
                    }

                    connection.Open();

                    if (_output.Count == 0)
                    {
                        command.ExecuteNonQuery();
                    }
                    else
                    {
                        using (IDataReader reader = command.ExecuteReader())
                        {
                            if (reader.Read())
                            {
                                for (int i = 0; i < _output.Count; i++)
                                {
                                    dataset.CopyTo(modifiedAttributesSequenceItem, _output[i]);
                                    string str = reader.GetString(i);
                                    dataset.AddOrUpdate(_output[i], str);
                                }
                            }
                        }
                    }

                    connection.Close();

                    connection = null;
                }
            }
            finally
            {
                if (connection != null)
                {
                    if (connection.State == ConnectionState.Closed || connection.State == ConnectionState.Broken) connection.Close();
                    connection.Dispose();
                }
            }
        }