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));
        }
        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);
        }
Example #3
0
 public DicomStructuredReport(DicomCodeItem code, params DicomContentItem[] items)
     : base(code, DicomRelationship.Contains, DicomContinuity.Separate, items)
 {
     // relationship type is not needed for root element
     Dataset.Remove(DicomTag.RelationshipType);
 }
Example #4
0
 public DicomMeasuredValue(decimal value, DicomCodeItem units)
 {
     Add(DicomTag.NumericValue, value);
     Add(new DicomSequence(DicomTag.MeasurementUnitsCodeSequence, units));
 }
        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));
        }