コード例 #1
0
        private void ParseDicomDataset(DicomDataset dataset, ResourceReference patientReference, ResourceReference imagingStudyReference, List <Observation> observations, Identifier identifier)
        {
            var structuredReport = new DicomStructuredReport(dataset);

            try
            {
                if (ObservationConstants.IrradiationEvents.Contains(structuredReport.Code))
                {
                    observations.Add(CreateIrradiationEvent(dataset, patientReference, identifier));
                }

                if (ObservationConstants.DoseSummaryReportCodes.Contains(structuredReport.Code))
                {
                    observations.Add(CreateDoseSummary(dataset, imagingStudyReference, patientReference, identifier));
                }
            }
            catch (DicomDataException)
            {
                // Ignore, this occurs when the report has no content sequence and we attempt to access report.Code; i.e and empty report
            }
            catch (MissingMemberException)
            {
                // Occurs when a required attribute is unable to be extracted from a dataset.
                // Ignore and move onto the next one.
            }

            // Recursively iterate through every child in the document checking for nested observations.
            // Return the final aggregated list of observations.
            foreach (DicomContentItem childItem in structuredReport.Children())
            {
                ParseDicomDataset(childItem.Dataset, patientReference, imagingStudyReference, observations, identifier);
            }
        }
コード例 #2
0
        public void RadiationEventWithoutIrradiationEventUid()
        {
            var report = new DicomStructuredReport(
                ObservationConstants.IrradiationEventXRayData);

            var observations = _observationParser.Parse(
                report.Dataset,
                new ResourceReference(),
                new ResourceReference(),
                new Identifier());

            Assert.Empty(observations);
        }
コード例 #3
0
        public void DoseSummaryWithStudyInstanceUidInReport()
        {
            var report = new DicomStructuredReport(
                ObservationConstants.XRayRadiationDoseReport,
                new DicomContentItem(
                    ObservationConstants.StudyInstanceUid,
                    DicomRelationship.HasProperties,
                    new DicomUID("1.3.12.2.123.5.4.5.123123.123123", "", DicomUidType.Unknown)));

            var observations = _observationParser.Parse(
                report.Dataset,
                new ResourceReference(),
                new ResourceReference(),
                new Identifier());

            Assert.Single(observations);
        }
コード例 #4
0
        public void DoseSummaryWithStudyInstanceUidInTag()
        {
            var report = new DicomStructuredReport(
                ObservationConstants.XRayRadiationDoseReport);

            report.Dataset
            .Add(DicomTag.StudyInstanceUID, "12345")
            .Add(DicomTag.AccessionNumber, "12345");

            var observations = _observationParser.Parse(
                report.Dataset,
                new ResourceReference(),
                new ResourceReference(),
                new Identifier());

            Assert.Single(observations);
        }
コード例 #5
0
        public void RadiationEventWithAllSupportedAttributes()
        {
            const string  randomIrradiationEventUid          = "1.2.3.4.5.6.123123";
            const decimal randomDecimalNumber                = (decimal)0.10;
            var           randomRadiationMeasurementCodeItem = new DicomCodeItem("mGy", "UCUM", "mGy");
            var           report = new DicomStructuredReport(
                ObservationConstants.IrradiationEventXRayData,
                new DicomContentItem(
                    ObservationConstants.IrradiationEventUid,
                    DicomRelationship.Contains,
                    new DicomUID(randomIrradiationEventUid, "", DicomUidType.Unknown)),
                new DicomContentItem(
                    ObservationConstants.MeanCtdIvol,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.Dlp,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.CtdIwPhantomType,
                    DicomRelationship.Contains,
                    new DicomCodeItem("113691", "DCM", "IEC Body Dosimetry Phantom")));

            var observations = _observationParser.Parse(
                report.Dataset,
                new ResourceReference(),
                new ResourceReference(),
                IdentifierUtility.CreateIdentifier(randomIrradiationEventUid));

            Assert.Single(observations);

            Observation radiationEvent = observations.First();

            Assert.Single(radiationEvent.Identifier);
            Assert.Equal("urn:oid:" + randomIrradiationEventUid, radiationEvent.Identifier[0].Value);
            Assert.Equal(2,
                         radiationEvent.Component
                         .Count(component => component.Value is Quantity));
            Assert.Equal(1,
                         radiationEvent.Component
                         .Count(component => component.Value is CodeableConcept));
        }
コード例 #6
0
        public void RadiationEventWithIrradiationEventUid()
        {
            var report = new DicomStructuredReport(
                ObservationConstants.IrradiationEventXRayData,
                new DicomContentItem(
                    ObservationConstants.IrradiationEventUid,
                    DicomRelationship.Contains,
                    new DicomUID("1.3.12.2.1234.5.4.5.123123.3000000111", "foobar", DicomUidType.Unknown)
                    ));

            var observations = _observationParser.Parse(
                report.Dataset,
                new ResourceReference(),
                new ResourceReference(),
                new Identifier());

            Assert.Single(observations);
        }
コード例 #7
0
ファイル: ReportForm.cs プロジェクト: jasonhoe/fo-dicom
        protected override void OnLoad(EventArgs e)
        {
            try {
                tvReport.BeginUpdate();
                tvReport.Nodes.Clear();

                var sr   = new DicomStructuredReport(_file.Dataset);
                var node = tvReport.Nodes.Add(sr.ToString());
                foreach (var child in sr.Children())
                {
                    AddTreeNode(child, node);
                }

                tvReport.ExpandAll();
                node.EnsureVisible();
                tvReport.EndUpdate();
            } catch (Exception ex) {
                OnException(ex);
            }
        }
コード例 #8
0
        private static void ApplyDicomTransforms(Observation observation,
                                                 DicomDataset dataset,
                                                 IEnumerable <DicomCodeItem> reportCodesToParse)
        {
            var report = new DicomStructuredReport(dataset);

            foreach (DicomCodeItem item in reportCodesToParse)
            {
                if (DicomComponentMutators.TryGetValue(item,
                                                       out Action <Observation, DicomStructuredReport, DicomCodeItem> mutator))
                {
                    mutator(observation, report, item);
                }
            }

            foreach (DicomContentItem dicomContentItem in report.Children())
            {
                ApplyDicomTransforms(observation, dicomContentItem.Dataset, reportCodesToParse);
            }
        }
コード例 #9
0
        private static Observation CreateIrradiationEvent(DicomDataset dataset, ResourceReference patientRef, Identifier identifier)
        {
            var report = new DicomStructuredReport(dataset);
            // create the observation
            var observation = new Observation
            {
                Code    = ObservationConstants.IrradiationEventCodeableConcept,
                Subject = patientRef,
                Status  = ObservationStatus.Preliminary,
            };

            // try to extract the event UID
            DicomUID irradiationEventUidValue = report.Get <DicomUID>(ObservationConstants.IrradiationEventUid, null);

            if (irradiationEventUidValue == null)
            {
                throw new MissingMemberException($"unable to extract {nameof(ObservationConstants.IrradiationEventUid)} from dataset");
            }

            observation.Identifier.Add(identifier);

            DicomCodeItem bodySite = report.Get <DicomCodeItem>(ObservationConstants.TargetRegion, null);

            if (bodySite != null)
            {
                observation.BodySite = new CodeableConcept(
                    GetSystem(bodySite.Scheme),
                    bodySite.Value,
                    bodySite.Meaning);
            }

            // Extract the necessary information
            ApplyDicomTransforms(observation, report.Dataset, new List <DicomCodeItem>()
            {
                ObservationConstants.MeanCtdIvol,
                ObservationConstants.Dlp,
                ObservationConstants.CtdIwPhantomType
            });

            return(observation);
        }
コード例 #10
0
        public static StructuredReport GetStructuredReport(DicomDataset ds)
        {
            var         sr       = new DicomStructuredReport(ds);
            PatientData pd       = null;
            var         findings = new Dictionary <string, List <MeasurementGroup> >();

            foreach (var group in sr.Children())
            {
                if (group.Type == DicomValueType.Container && group.Code.Value.Equals("121070"))
                {
                    HandleFinding(findings, group);
                }
                else if (group.Type == DicomValueType.Container && group.Code.Value.Equals("121118"))
                {
                    pd = new PatientData(group);
                }
            }
            var report = new StructuredReport(pd, findings);

            return(report);
        }
コード例 #11
0
        private void btnCreateSRDicom_Click(object sender, EventArgs e)
        {
            string deviceObserverUID = "1.1.1.1.1";             // TODO (121012)
            string studyInstanceUid  = "1.1.1.1.1.1.1";
            string seriesInstanceUid = "1.1.1.1.1.1.1.2";
            string accessionNo       = "298347982347598";
            int    imageCount        = 3;

            DateTime now          = DateTime.Now;
            string   dateTagValue = DateTime.Now.ToString("yyyyMMdd", CultureInfo.InvariantCulture);
            string   timeTagValue = DateTime.Now.ToString("HHmmss", CultureInfo.InvariantCulture);

            DicomDataset seqContent = new DicomDataset();        //Content of the sequence
            DicomDataset ds         = new DicomDataset();        //Main dataset

            ds.Add(DicomTag.SpecificCharacterSet, "ISO_IR 100"); //Add some items

            ds.Add(DicomTag.PatientName, "Last^First^Middle=Last2^First2^Middle2=Last3^First3^Middle3");
            ds.Add(DicomTag.PatientID, "ID0001");
            ds.Add(DicomTag.PatientBirthDate, dateTagValue);

            ds.Add(DicomTag.PatientSex, "M");

            ds.Add(DicomTag.StudyDate, dateTagValue);
            ds.Add(DicomTag.StudyTime, timeTagValue);
            ds.Add(DicomTag.AccessionNumber, accessionNo);
            ds.Add(DicomTag.ReferringPhysicianName, "RefPhysicianName Kim");
            ds.Add(DicomTag.StudyDescription, "CHEST");
            ds.Add(DicomTag.StudyInstanceUID, studyInstanceUid);
            ds.Add(DicomTag.StudyID, "0");

            ds.Add(DicomTag.SeriesDate, dateTagValue);
            ds.Add(DicomTag.SeriesTime, timeTagValue);
            ds.Add(DicomTag.Modality, "SR");
            ds.Add(DicomTag.SeriesDescription, "Description");
            ds.Add(DicomTag.SeriesInstanceUID, seriesInstanceUid);
            ds.Add(DicomTag.SeriesNumber, "2");

            ds.Add(DicomTag.Manufacturer, "Manufacturer");
            ds.Add(DicomTag.InstitutionName, "Hospital Name");
            ds.Add(DicomTag.StationName, "Room 1");
            ds.Add(DicomTag.SoftwareVersions, "1.0.0.0");
            ds.Add(DicomTag.ContentDate, dateTagValue);
            ds.Add(DicomTag.ContentTime, timeTagValue);
            ds.Add(DicomTag.InstanceNumber, "1");

            ds.Add(DicomTag.NumberOfStudyRelatedInstances, imageCount);
            ds.Add(DicomTag.ValueType, DicomValueType.Container);

            DicomSequence conceptNameCodeSequence = new DicomSequence(DicomTag.ConceptNameCodeSequence, new DicomCodeItem("113701", "DCM", "X-Ray Radiation Dose Report", "01"));

            ds.Add(conceptNameCodeSequence);

            ds.Add(DicomTag.ContinuityOfContent, DicomContinuity.Separate);

            seqContent.Clear();
            seqContent.Add(DicomTag.AccessionNumber, accessionNo);
            seqContent.Add(DicomTag.StudyInstanceUID, studyInstanceUid);
            seqContent.Add(DicomTag.RequestedProcedureDescription, string.Empty);
            seqContent.Add(DicomTag.RequestedProcedureCodeSequence, new DicomDataset());
            seqContent.Add(DicomTag.RequestedProcedureID, string.Empty);
            seqContent.Add(DicomTag.PlacerOrderNumberImagingServiceRequest, string.Empty);
            seqContent.Add(DicomTag.FillerOrderNumberImagingServiceRequest, string.Empty);

            DicomSequence referenceRequestSequence = new DicomSequence(DicomTag.ReferencedRequestSequence, seqContent);

            ds.Add(referenceRequestSequence);

            ds.Add(DicomTag.PerformedProcedureCodeSequence, new DicomDataset());
            ds.Add(DicomTag.CompletionFlag, "COMPLETE");
            ds.Add(DicomTag.CompletionFlagDescription, "Completed on Study close");
            ds.Add(DicomTag.VerificationFlag, "UNVERIFIED");
            ds.Add(DicomTag.PreliminaryFlag, "FINAL");

            DicomDataset ContentTemplateSequenceDataset = new DicomDataset();

            ContentTemplateSequenceDataset.Add(DicomTag.MappingResource, "DCMR");
            ContentTemplateSequenceDataset.Add(DicomTag.TemplateIdentifier, "10001");
            DicomSequence contentTemplateSequence = new DicomSequence(DicomTag.ContentTemplateSequence, ContentTemplateSequenceDataset);

            ds.Add(contentTemplateSequence);

            seqContent.Clear();

            DicomStructuredReport sr = new DicomStructuredReport(ds);

            {
                DicomContentItem item = new DicomContentItem(
                    GetDcmTypeCodeItem(121058, "Procedure reported"),
                    DicomRelationship.HasConceptModifier,
                    GetDcmTypeCodeItem(113704, "Projection X-Ray"));

                item.Add(new DicomContentItem(
                             GetSrtTypeCodeItem("G-C0E8", "Has Intent"),
                             DicomRelationship.HasConceptModifier,
                             GetSrtTypeCodeItem("R-408C3", "Diagnostic Intent")));

                sr.Add(item);
            }

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121005, "Observer Type"),
                       DicomRelationship.HasObservationContext,
                       GetDcmTypeCodeItem(121007, "Device")));

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121012, "Device Observer UID"),
                       DicomRelationship.HasObservationContext,
                       DicomUID.Parse("2222222222222222")));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121013, "Device Observer Name"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "22222222222222222"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121014, "Device Observer Manufacturer"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "Rayence"));

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121015, "Device Observer Model Name"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "XMARU SERIES"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121016, "Device Observer Serial Number"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "Unknown"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(121017, "Device Observer Physical Location During Observation"),
                       DicomRelationship.HasObservationContext,
                       DicomValueType.Text,
                       "Unknown"));          // TODO : set real value

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(113876, "Device Role in Procedure"),
                       DicomRelationship.HasObservationContext,
                       GetDcmTypeCodeItem(121097, "Recording")));

            {
                DicomContentItem item = new DicomContentItem(
                    GetDcmTypeCodeItem(113705, "Scope of Accumulation"),
                    DicomRelationship.HasObservationContext,
                    GetDcmTypeCodeItem(113014, "Study"));

                item.Add(new DicomContentItem(
                             GetDcmTypeCodeItem(110180, "Study Instance UID"),
                             DicomRelationship.HasProperties,
                             DicomUID.Parse(studyInstanceUid)));

                sr.Add(item);
            }

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(113944, "X-Ray Mechanical Data Available"),
                       DicomRelationship.Contains,
                       GetSrtTypeCodeItem("R-00339", "No")));

            //-------------- TID 10002 ------------------
            {
                DicomContentItem containerItem = new DicomContentItem(
                    GetDcmTypeCodeItem(113702, "Accumulated X-Ray Dose Data"),
                    DicomRelationship.Contains,
                    DicomContinuity.Separate);

                DicomSequence sequence = new DicomSequence(DicomTag.ContentTemplateSequence);

                sequence.Items.Add(new DicomDataset()
                                   .Add(DicomTag.MappingResource, "DCMR")
                                   .Add(DicomTag.TemplateIdentifier, "10002"));

                containerItem.Dataset.Add(sequence);

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113764, "Acquisition Plane"),
                                      DicomRelationship.HasConceptModifier,
                                      GetDcmTypeCodeItem(113622, "Single Plane")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113722, "Dose Area Product Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(1.224),   // TODO : set real value
                                                             new DicomCodeItem("Gy.m2", "UCUM", "Gy.m2"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113725, "Dose (RP) Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0),   // TODO : set real value
                                                             new DicomCodeItem("Gy", "UCUM", "Gy"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113727, "Acquisition Dose Area Product Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(1.224),   // TODO : set real value
                                                             new DicomCodeItem("Gy.m2", "UCUM", "Gy.m2"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113729, "Acquisition Dose (RP) Total"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0),   // TODO : set real value
                                                             new DicomCodeItem("Gy", "UCUM", "Gy"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113855, "Total Acquisition Time"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0.672),   // TODO : set real value
                                                             new DicomCodeItem("s", "UCUM", "s"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113731, "Total Number of Radiographic Frames"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(imageCount),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113780, "Reference Point Definition"),
                                      DicomRelationship.Contains,
                                      DicomValueType.Text,
                                      "In Detector Plane"));

                DicomContentItem IrradiatingDevice = new DicomContentItem(
                    GetDcmTypeCodeItem(113876, "Device Role in Procedure"),
                    DicomRelationship.Contains,
                    GetDcmTypeCodeItem(113859, "Irradiating Device"));
                {
                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113877, "Device Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "DX3605801"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113878, "Device Manufacturer"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Manufacturer"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113879, "Device Model Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "ManufacturerModelName"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113880, "Device Serial Number"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Unknown"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(121012, "Device Observer UID"),
                                              DicomRelationship.HasProperties,
                                              DicomUID.Parse(deviceObserverUID)));
                }

                containerItem.Add(IrradiatingDevice);

                sr.Add(containerItem);
            }

            //-------------- TID 10003 ------------------



            for (int i = 0; i < imageCount; i++)
            {
                DicomContentItem containerItem = new DicomContentItem(
                    GetDcmTypeCodeItem(113706, "Irradiation Event X-Ray Data"),
                    DicomRelationship.Contains,
                    DicomContinuity.Separate);

                DicomSequence sequence = new DicomSequence(DicomTag.ContentTemplateSequence);

                sequence.Items.Add(new DicomDataset()
                                   .Add(DicomTag.MappingResource, "DCMR")
                                   .Add(DicomTag.TemplateIdentifier, "10003"));

                containerItem.Dataset.Add(sequence);

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113764, "Acquisition Plane"),
                                      DicomRelationship.HasConceptModifier,
                                      GetDcmTypeCodeItem(113622, "Single Plane")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113769, "Irradiation Event UID"),
                                      DicomRelationship.Contains,
                                      DicomUID.Parse($"{seriesInstanceUid}.{i}")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(111526, "DateTime Started"),
                                      DicomRelationship.Contains,
                                      DicomValueType.DateTime,
                                      DateTime.Now));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113721, "Irradiation Event Type"),
                                      DicomRelationship.Contains,
                                      GetDcmTypeCodeItem(113611, "Stationary Acquisition")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(125203, "Acquisition Protocol"),
                                      DicomRelationship.Contains,
                                      DicomValueType.Text,
                                      "1.1"));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(123014, "Target Region"),
                                      DicomRelationship.Contains,
                                      GetSrtTypeCodeItem("Undefin", "ed")));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(122130, "Dose Area Product"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0.25),
                                                             new DicomCodeItem("Gy.m2", "UCUM", "Gy.m2"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113845, "Exposure Index"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(500),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113846, "Target Exposure Index"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(300),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113738, "Dose (RP)"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(0),
                                                             new DicomCodeItem("Gy", "UCUM", "Gy"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113780, "Reference Point Definition"),
                                      DicomRelationship.Contains,
                                      DicomValueType.Text,
                                      "In Detector Plane"));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113768, "Number of Pulses"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(1),
                                                             new DicomCodeItem("1", "UCUM", "no units"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113733, "KVP"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(75),
                                                             new DicomCodeItem("kV", "UCUM", "kV"))));

                containerItem.Add(new DicomContentItem(
                                      GetDcmTypeCodeItem(113736, "Exposure"),
                                      DicomRelationship.Contains,
                                      new DicomMeasuredValue(new Decimal(50),
                                                             new DicomCodeItem("uA.s", "UCUM", "uA.s"))));

                DicomContentItem IrradiatingDevice = new DicomContentItem(
                    GetDcmTypeCodeItem(113876, "Device Role in Procedure"),
                    DicomRelationship.Contains,
                    GetDcmTypeCodeItem(113859, "Irradiating Device"));
                {
                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113877, "Device Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "DX3605801"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113878, "Device Manufacturer"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Manufacturer"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113879, "Device Model Name"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "ManufacturerModelName"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(113880, "Device Serial Number"),
                                              DicomRelationship.HasProperties,
                                              DicomValueType.Text,
                                              "Unknown"));

                    IrradiatingDevice.Add(new DicomContentItem(
                                              GetDcmTypeCodeItem(121012, "Device Observer UID"),
                                              DicomRelationship.HasProperties,
                                              DicomUID.Parse(deviceObserverUID)));
                }

                containerItem.Add(IrradiatingDevice);
                sr.Add(containerItem);
            }

            sr.Add(new DicomContentItem(
                       GetDcmTypeCodeItem(113854, "Source of Dose Information"),
                       DicomRelationship.Contains,
                       GetSrtTypeCodeItem("A-2C090", "Dosimeter")));

            DicomFile file = new DicomFile();

            file.FileMetaInfo.AddOrUpdate(DicomTag.MediaStorageSOPClassUID, DicomUID.Parse("1.2.840.10008.5.1.4.1.1.88.67"));
            file.FileMetaInfo.AddOrUpdate(DicomTag.MediaStorageSOPInstanceUID, DicomUID.Parse("1.2.840.10008.1.2.1"));
            file.FileMetaInfo.AddOrUpdate(DicomTag.ImplementationClassUID, "1.2.410.200067.141");
            file.FileMetaInfo.AddOrUpdate(DicomTag.SourceApplicationEntityTitle, "Rayence");

            file.Dataset.Add(ds);
            file.FileMetaInfo.TransferSyntax = DicomTransferSyntax.ImplicitVRLittleEndian;
            file.Save("SR.dcm");

            System.Diagnostics.Process.Start("SR.dcm");
        }
コード例 #12
0
        public void DoseSummaryWithAllSupportedAttributes()
        {
            const string  studyInstanceUid    = "1.3.12.2.123.5.4.5.123123.123123";
            const string  accessionNumber     = "random-accession";
            const decimal randomDecimalNumber = (decimal)0.10;
            var           randomRadiationMeasurementCodeItem = new DicomCodeItem("mGy", "UCUM", "mGy");

            var report = new DicomStructuredReport(
                ObservationConstants.RadiopharmaceuticalRadiationDoseReport,
                // identifiers
                new DicomContentItem(
                    ObservationConstants.StudyInstanceUid,
                    DicomRelationship.HasProperties,
                    new DicomUID(studyInstanceUid, "", DicomUidType.Unknown)),
                new DicomContentItem(
                    ObservationConstants.AccessionNumber,
                    DicomRelationship.HasProperties,
                    DicomValueType.Text,
                    accessionNumber),

                // attributes
                new DicomContentItem(
                    ObservationConstants.DoseRpTotal,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.AccumulatedAverageGlandularDose,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.DoseAreaProductTotal,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.FluoroDoseAreaProductTotal,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.AcquisitionDoseAreaProductTotal,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.TotalFluoroTime,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.TotalNumberOfRadiographicFrames,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(10,
                                           new DicomCodeItem("1", "UCUM", "No units"))),
                new DicomContentItem(
                    ObservationConstants.AdministeredActivity,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.CtDoseLengthProductTotal,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.TotalNumberOfIrradiationEvents,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(10,
                                           new DicomCodeItem("1", "UCUM", "No units"))),
                new DicomContentItem(
                    ObservationConstants.MeanCtdIvol,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.RadiopharmaceuticalAgent,
                    DicomRelationship.Contains,
                    DicomValueType.Text,
                    "Uranium"),
                new DicomContentItem(
                    ObservationConstants.Radionuclide,
                    DicomRelationship.Contains,
                    DicomValueType.Text,
                    "Uranium"),
                new DicomContentItem(
                    ObservationConstants.RadiopharmaceuticalVolume,
                    DicomRelationship.Contains,
                    new DicomMeasuredValue(randomDecimalNumber,
                                           randomRadiationMeasurementCodeItem)),
                new DicomContentItem(
                    ObservationConstants.RouteOfAdministration,
                    DicomRelationship.Contains,
                    new DicomCodeItem("needle", "random-scheme", "this is made up"))
                );

            var observations = _observationParser.Parse(
                report.Dataset,
                new ResourceReference(),
                new ResourceReference(),
                IdentifierUtility.CreateIdentifier(studyInstanceUid));

            Assert.Single(observations);

            Observation doseSummary = observations.First();

            Assert.Equal(2, doseSummary.Identifier.Count);
            Assert.Equal("urn:oid:" + studyInstanceUid,
                         doseSummary.Identifier[0].Value);
            Assert.Equal(accessionNumber,
                         doseSummary.Identifier[1].Value);
            Assert.Equal(10,
                         doseSummary.Component
                         .Count(component => component.Value is Quantity));
            Assert.Equal(2,
                         doseSummary.Component
                         .Count(component => component.Value is Integer));
            Assert.Equal(2,
                         doseSummary.Component
                         .Count(component => component.Value is FhirString));
            Assert.Equal(1,
                         doseSummary.Component
                         .Count(component => component.Value is CodeableConcept));
        }
コード例 #13
0
        private static Observation CreateDoseSummary(
            DicomDataset dataset,
            ResourceReference imagingStudyReference,
            ResourceReference patientReference,
            Identifier identifier)
        {
            // Create the observation
            var observation = new Observation
            {
                // Set the code.coding
                Code = ObservationConstants.RadiationExposureCodeableConcept,
                // Add Patient reference
                Subject = patientReference,
                Status  = ObservationStatus.Preliminary,
            };

            // Add ImagingStudy reference
            observation.PartOf.Add(imagingStudyReference);

            var report = new DicomStructuredReport(dataset);

            observation.Identifier.Add(identifier);

            // Try to get accession number from report first then tag; ignore if it is not present it is not a required identifier.
            string accessionNumber = report.Get(ObservationConstants.AccessionNumber, string.Empty);

            if (string.IsNullOrEmpty(accessionNumber))
            {
                dataset.TryGetSingleValue(DicomTag.AccessionNumber, out accessionNumber);
            }

            if (!string.IsNullOrEmpty(accessionNumber))
            {
                var accessionIdentifier = new Identifier
                {
                    Value = accessionNumber,
                    Type  = ObservationConstants.AccessionCodeableConcept
                };
                observation.Identifier.Add(accessionIdentifier);
            }

            // Add all structured report information
            ApplyDicomTransforms(observation, dataset, new Collection <DicomCodeItem>()
            {
                ObservationConstants.DoseRpTotal,
                ObservationConstants.AccumulatedAverageGlandularDose,
                ObservationConstants.DoseAreaProductTotal,
                ObservationConstants.FluoroDoseAreaProductTotal,
                ObservationConstants.AcquisitionDoseAreaProductTotal,
                ObservationConstants.TotalFluoroTime,
                ObservationConstants.TotalNumberOfRadiographicFrames,
                ObservationConstants.AdministeredActivity,
                ObservationConstants.CtDoseLengthProductTotal,
                ObservationConstants.TotalNumberOfIrradiationEvents,
                ObservationConstants.MeanCtdIvol,
                ObservationConstants.RadiopharmaceuticalAgent,
                ObservationConstants.RadiopharmaceuticalVolume,
                ObservationConstants.Radionuclide,
                ObservationConstants.RouteOfAdministration,
            });

            return(observation);
        }