Esempio n. 1
0
 public QueuedImage(IMessageHeader header, ulong _tag, DicomFileMessage dicomFileMessage, DicomDataset dataset)
 {
     Header           = header;
     tag              = _tag;
     DicomFileMessage = dicomFileMessage;
     DicomDataset     = dataset;
 }
Esempio n. 2
0
        public void TestEquals_DicomFileMessage()
        {
            var msg1 = new DicomFileMessage();
            var msg2 = new DicomFileMessage();

            Assert.AreEqual(msg1, msg2);
            Assert.AreEqual(msg1.GetHashCode(), msg2.GetHashCode());

            msg1.NationalPACSAccessionNumber = "500";
            msg2.NationalPACSAccessionNumber = "500";

            Assert.AreEqual(msg1, msg2);
            Assert.AreEqual(msg1.GetHashCode(), msg2.GetHashCode());

            msg1.NationalPACSAccessionNumber = "999";
            Assert.AreNotEqual(msg1, msg2);
            Assert.AreNotEqual(msg1.GetHashCode(), msg2.GetHashCode());

            msg1.NationalPACSAccessionNumber = "500";

            msg1.DicomDataset = "jsonified string";
            msg2.DicomDataset = "jsonified string";

            Assert.AreEqual(msg1, msg2);
            Assert.AreEqual(msg1.GetHashCode(), msg2.GetHashCode());
        }
Esempio n. 3
0
        public void TestLargeDocumentSplitOk()
        {
            GlobalOptions options = MongoDbPopulatorTestHelper.GetNewMongoDbPopulatorOptions();

            options.MongoDbPopulatorOptions.MongoDbFlushTime = int.MaxValue / 1000;

            var adapter   = new MongoDbAdapter("ImageProcessor", options.MongoDatabases.ExtractionStoreOptions, "largeDocumentTest");
            var processor = new ImageMessageProcessor(options.MongoDbPopulatorOptions, adapter, 2, null);
            var mockModel = Mock.Of <IModel>();

            processor.Model = mockModel;

            var dataset = new DicomDataset
            {
                new DicomUnlimitedText(DicomTag.SelectorUTValue, new string('x', 15 * 1024 * 1024))
            };

            var largeMessage = new DicomFileMessage
            {
                SeriesInstanceUID           = "",
                StudyInstanceUID            = "",
                SOPInstanceUID              = "",
                NationalPACSAccessionNumber = "",
                DicomFilePath = "",
                DicomDataset  = DicomTypeTranslater.SerializeDatasetToJson(dataset)
            };

            processor.AddToWriteQueue(largeMessage, new MessageHeader(), 1);
            processor.AddToWriteQueue(largeMessage, new MessageHeader(), 2);
        }
Esempio n. 4
0
        public void SetupSuite()
        {
            Globals = GetNewMongoDbPopulatorOptions();

            _mongoTestClient = MongoClientHelpers.GetMongoClient(Globals.MongoDatabases.DicomStoreOptions, "MongoDbPopulatorTests");

            _mongoTestClient.DropDatabase(TestDbName);
            TestDatabase = _mongoTestClient.GetDatabase(TestDbName);

            Globals.MongoDbPopulatorOptions.SeriesQueueConsumerOptions = new ConsumerOptions()
            {
                QueueName        = "TEST.SeriesQueue",
                QoSPrefetchCount = 5,
                AutoAck          = false
            };

            Globals.MongoDbPopulatorOptions.ImageQueueConsumerOptions = new ConsumerOptions()
            {
                QueueName        = "TEST.MongoImageQueue",
                QoSPrefetchCount = 50,
                AutoAck          = false
            };

            var dataset = new DicomDataset
            {
                new DicomUniqueIdentifier(DicomTag.SOPInstanceUID, "1.2.3.4"),
                new DicomCodeString(DicomTag.Modality, "SR")
            };

            string serialized = DicomTypeTranslater.SerializeDatasetToJson(dataset);

            TestImageMessage = new DicomFileMessage
            {
                DicomFilePath = "Path/To/File",
                NationalPACSAccessionNumber = "123",
                SeriesInstanceUID           = "TestSeriesInstanceUID",
                StudyInstanceUID            = "TestStudyInstanceUID",
                SOPInstanceUID = "TestSOPInstanceUID",
                DicomDataset   = serialized
            };

            TestSeriesMessage = new SeriesMessage
            {
                DirectoryPath  = "Path/To/Series",
                ImagesInSeries = 123,
                NationalPACSAccessionNumber = "123",
                SeriesInstanceUID           = "TestSeriesInstanceUID",
                StudyInstanceUID            = "TestStudyInstanceUID",
                DicomDataset = serialized
            };
        }
Esempio n. 5
0
        private DicomFileMessage GetTestDicomFileMessage(Test testCase = Test.Normal, int numberOfRandomTagsPerDicom = 0)
        {
            var msg = new DicomFileMessage()
            {
                DicomFilePath = "Path/To/The/File.dcm",
                NationalPACSAccessionNumber = "1234",
                SOPInstanceUID    = "1.2.3.4",
                SeriesInstanceUID = "1.2.3.4",
                StudyInstanceUID  = "1.2.3.4",
            };

            DicomDataset ds;

            Random r = new Random(123);


            using (var generator = new DicomDataGenerator(r, null, "CT"))
                ds = generator.GenerateTestDataset(new Person(r), r);

            ds.AddOrUpdate(DicomTag.AccessionNumber, "1234");
            ds.AddOrUpdate(DicomTag.SOPInstanceUID, "1.2.3.4");
            ds.AddOrUpdate(DicomTag.SeriesInstanceUID, "1.2.3.4");
            ds.AddOrUpdate(DicomTag.StudyInstanceUID, "1.2.3.4");

            switch (testCase)
            {
            case Test.Normal:
                ds.AddOrUpdate(DicomTag.PatientID, "010101");
                break;

            case Test.NoPatientTag:
                ds.Remove(DicomTag.PatientID);
                break;

            case Test.EmptyInPatientTag:
                ds.AddOrUpdate(DicomTag.PatientID, string.Empty);
                break;

            case Test.ProperlyFormatedChi:
                ds.AddOrUpdate(DicomTag.PatientID, "0101010101");
                break;

            default:
                throw new ArgumentOutOfRangeException("testCase");
            }


            msg.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds);

            return(msg);
        }
Esempio n. 6
0
        private DicomFileMessage GetFileMessageForDataset(DicomDataset dicomDataset)
        {
            var root = TestContext.CurrentContext.TestDirectory;

            var f   = Path.GetRandomFileName();
            var msg = new DicomFileMessage(root, Path.Combine(root, f + ".dcm"));

            msg.NationalPACSAccessionNumber = "ABC";
            msg.SeriesInstanceUID           = dicomDataset.GetString(DicomTag.SeriesInstanceUID);
            msg.StudyInstanceUID            = dicomDataset.GetString(DicomTag.StudyInstanceUID);
            msg.SOPInstanceUID = dicomDataset.GetString(DicomTag.SOPInstanceUID);
            msg.DicomDataset   = DicomTypeTranslater.SerializeDatasetToJson(dicomDataset);
            return(msg);
        }
Esempio n. 7
0
        public DicomFileMessage GetDicomFileMessage(DicomDataset ds, string fileSystemRoot, string file)
        {
            var toReturn = new DicomFileMessage(fileSystemRoot, file);

            toReturn.NationalPACSAccessionNumber = "999";
            toReturn.StudyInstanceUID            = "999";
            toReturn.SeriesInstanceUID           = "999";
            toReturn.SOPInstanceUID = "999";

            ds.Remove(DicomTag.PixelData);

            toReturn.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds);

            return(toReturn);
        }
Esempio n. 8
0
        public void ProcessDocument(BsonDocument document)
        {
            string documentId = document["_id"].ToString();

            var headerDoc = document["header"] as BsonDocument;

            if (headerDoc == null)
            {
                LogUnprocessedDocument(documentId, new ApplicationException("Document did not contain a header field"));
                return;
            }

            var message = new DicomFileMessage
            {
                NationalPACSAccessionNumber = AccNoOrNull(headerDoc["NationalPACSAccessionNumber"]),
                DicomFilePath = (string)headerDoc["DicomFilePath"],
                DicomFileSize = headerDoc.Contains("DicomFileSize") ? (long)headerDoc["DicomFileSize"] : -1
            };

            try
            {
                // Rebuild the dataset from the document, then serialize it to JSON to send
                DicomDataset ds = DicomTypeTranslaterWriter.BuildDicomDataset(document);
                message.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds);

                // Add the header information
                message.StudyInstanceUID  = ds.GetValue <string>(DicomTag.StudyInstanceUID, 0);
                message.SeriesInstanceUID = ds.GetValue <string>(DicomTag.SeriesInstanceUID, 0);
                message.SOPInstanceUID    = ds.GetValue <string>(DicomTag.SOPInstanceUID, 0);
            }
            catch (Exception e)
            {
                LogUnprocessedDocument(documentId, e);
                return;
            }

            if (!message.VerifyPopulated())
            {
                LogUnprocessedDocument(documentId, new ApplicationException("Message was not valid"));
                return;
            }

            IMessageHeader header = MongoDocumentHeaders.RebuildMessageHeader(headerDoc["MessageHeader"].AsBsonDocument);

            lock (_oBufferLock)
                _messageBuffer.Add(new Tuple <DicomFileMessage, IMessageHeader>(message, header));
        }
Esempio n. 9
0
 /// <summary>
 /// Generate a header for an image document
 /// </summary>
 /// <param name="message"></param>
 /// <param name="header"></param>
 /// <returns></returns>
 public static BsonDocument ImageDocumentHeader(DicomFileMessage message, IMessageHeader header)
 {
     return(new BsonDocument
     {
         { "DicomFilePath", message.DicomFilePath },
         { "DicomFileSize", message.DicomFileSize },
         { "NationalPACSAccessionNumber", AccessionNoOrNull(message.NationalPACSAccessionNumber) },
         { "MessageHeader", new BsonDocument
           {
               { "MessageGuid", header.MessageGuid.ToString() },
               { "ProducerProcessID", header.ProducerProcessID },
               { "ProducerExecutableName", header.ProducerExecutableName },
               { "Parents", string.Join(MessageHeader.Splitter, header.Parents) },
               { "OriginalPublishTimestamp", header.OriginalPublishTimestamp }
           } }
     });
 }
Esempio n. 10
0
        public DicomFileMessage GetDicomFileMessage(string fileSystemRoot, FileInfo fi)
        {
            var toReturn = new DicomFileMessage(fileSystemRoot, fi);

            toReturn.NationalPACSAccessionNumber = "999";
            toReturn.StudyInstanceUID            = "999";
            toReturn.SeriesInstanceUID           = "999";
            toReturn.SOPInstanceUID = "999";
            toReturn.DicomFileSize  = fi.Length;

            var ds = DicomFile.Open(fi.FullName).Dataset;

            ds.Remove(DicomTag.PixelData);

            toReturn.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds);

            return(toReturn);
        }
Esempio n. 11
0
        public void TestLargeMessageNack()
        {
            GlobalOptions options = MongoDbPopulatorTestHelper.GetNewMongoDbPopulatorOptions();

            options.MongoDbPopulatorOptions.MongoDbFlushTime = int.MaxValue / 1000;

            var adapter   = new MongoDbAdapter("ImageProcessor", options.MongoDatabases.ExtractionStoreOptions, "largeDocumentTest");
            var processor = new ImageMessageProcessor(options.MongoDbPopulatorOptions, adapter, 1, null);
            var mockModel = Mock.Of <IModel>();

            processor.Model = mockModel;

            var dataset = new DicomDataset
            {
                new DicomUnlimitedText(DicomTag.SelectorUTValue, new string('x', 16 * 1024 * 1024))
            };

            string json = DicomTypeTranslater.SerializeDatasetToJson(dataset);

            var largeMessage = new DicomFileMessage
            {
                SeriesInstanceUID           = "",
                StudyInstanceUID            = "",
                SOPInstanceUID              = "",
                NationalPACSAccessionNumber = "",
                DicomFilePath = "",
                DicomDataset  = json
            };

            Assert.Throws <ApplicationException>(() => processor.AddToWriteQueue(largeMessage, new MessageHeader(), 1));

            dataset = new DicomDataset
            {
                // Should be ok, getting close to the threshold
                new DicomUnlimitedText(DicomTag.SelectorUTValue, new string('x', 15 * 1024 * 1024 + 512))
            };

            json = DicomTypeTranslater.SerializeDatasetToJson(dataset);
            largeMessage.DicomDataset = json;

            processor.AddToWriteQueue(largeMessage, new MessageHeader(), 2);
            Assert.True(processor.AckCount == 1);
        }
Esempio n. 12
0
        public void Test_DicomFileProcessor_ProcessDocument_NullAccNo()
        {
            var processor = new DicomFileProcessor(new DicomReprocessorOptions(), null, null);

            BsonDocument datasetDoc = DicomTypeTranslaterReader.BuildBsonDocument(new DicomDataset());
            var          msg        = new DicomFileMessage
            {
                DicomFilePath = "foo",
                DicomFileSize = 123,
                NationalPACSAccessionNumber = null,
            };

            datasetDoc.Add("_id", "foo");
            BsonDocument bsonHeader = MongoDocumentHeaders.ImageDocumentHeader(msg, new MessageHeader());
            BsonDocument document   = new BsonDocument()
                                      .Add("header", bsonHeader)
                                      .AddRange(datasetDoc);

            processor.ProcessDocument(document);
        }
Esempio n. 13
0
        public void ImageDocumentHeader_HasCorrectHeaders()
        {
            var msg = new DicomFileMessage
            {
                DicomFilePath = "path/to/file.dcm",
                NationalPACSAccessionNumber = "1234"
            };

            string parents = $"{Guid.NewGuid().ToString()}->{Guid.NewGuid().ToString()}";
            var    headers = new Dictionary <string, object>
            {
                { "MessageGuid", Guid.NewGuid().ToString() },
                { "ProducerProcessID", 1234 },
                { "ProducerExecutableName", "MongoDocumentHeadersTests" },
                { "Parents", parents },
                { "OriginalPublishTimestamp", MessageHeader.UnixTimeNow() }
            };

            var          header          = new MessageHeader(headers);
            BsonDocument bsonImageHeader = MongoDocumentHeaders.ImageDocumentHeader(msg, header);

            var expected = new BsonDocument
            {
                { "DicomFilePath", msg.DicomFilePath },
                { "DicomFileSize", msg.DicomFileSize },
                { "NationalPACSAccessionNumber", msg.NationalPACSAccessionNumber },
                { "MessageHeader", new BsonDocument
                  {
                      { "MessageGuid", header.MessageGuid.ToString() },
                      { "ProducerProcessID", header.ProducerProcessID },
                      { "ProducerExecutableName", header.ProducerExecutableName },
                      { "Parents", string.Join(MessageHeader.Splitter, header.Parents) },
                      { "OriginalPublishTimestamp", header.OriginalPublishTimestamp }
                  } }
            };

            Assert.AreEqual(expected, bsonImageHeader);
        }
Esempio n. 14
0
        public void ImageProcessor_FailInModalityBatch_AcksWrittenDocuments()
        {
            _testOptions.MongoDbPopulatorOptions.FailedWriteLimit = 1;
            _testOptions.MongoDbPopulatorOptions.MongoDbFlushTime = int.MaxValue / 1000;

            var testModalities = new[] { "MR", "MR", "MR", "SR", "SR" };

            var testAdapter = new MongoTestAdapter();
            var processor   = new ImageMessageProcessor(_testOptions.MongoDbPopulatorOptions, testAdapter, testModalities.Length + 1, null);

            var mockModel = new Mock <IModel>();

            mockModel.Setup(x => x.BasicAck(It.Is <ulong>(y => y == ulong.MaxValue), It.IsAny <bool>()))
            .Callback(() => throw new Exception("BasicAck called with delivery tag for CT message"));

            processor.Model = mockModel.Object;

            var ds  = new DicomDataset();
            var msg = new DicomFileMessage
            {
                DicomFilePath = "",
                NationalPACSAccessionNumber = ""
            };

            for (var i = 0; i < testModalities.Length; ++i)
            {
                string modality = testModalities[i];
                ds.AddOrUpdate(DicomTag.Modality, modality);
                msg.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds);
                processor.AddToWriteQueue(msg, null, (ulong)i);
            }

            ds.AddOrUpdate(DicomTag.Modality, "CT");
            msg.DicomDataset = DicomTypeTranslater.SerializeDatasetToJson(ds);

            Assert.Throws <ApplicationException>(() => processor.AddToWriteQueue(msg, new MessageHeader(), ulong.MaxValue));
            Assert.AreEqual(5, processor.AckCount);
        }
Esempio n. 15
0
        private static void ValidateHeader(DicomFileMessage message, MessageHeader header, BsonDocument docHeader)
        {
            Assert.AreEqual(message.DicomFilePath, docHeader["DicomFilePath"].AsString);
            Assert.AreEqual(message.NationalPACSAccessionNumber, docHeader["NationalPACSAccessionNumber"].AsString);

            BsonElement element;

            Assert.True(docHeader.TryGetElement("MessageHeader", out element));

            var messageHeaderDoc = (BsonDocument)element.Value;

            Assert.NotNull(messageHeaderDoc);

            Assert.AreEqual(header.ProducerProcessID, messageHeaderDoc["ProducerProcessID"].AsInt32);
            Assert.AreEqual(header.ProducerExecutableName, messageHeaderDoc["ProducerExecutableName"].AsString);
            Assert.AreEqual(header.OriginalPublishTimestamp, messageHeaderDoc["OriginalPublishTimestamp"].AsInt64);

            Assert.True(messageHeaderDoc.TryGetElement("Parents", out element));

            string parentsString = element.Value.AsString;

            Assert.False(string.IsNullOrWhiteSpace(parentsString));
            Assert.AreEqual(Guid.NewGuid().ToString().Length, parentsString.Length);
        }
Esempio n. 16
0
        private void Validate(DicomFileMessage message, MessageHeader header, BsonDocument document)
        {
            Assert.False(message == null || document == null);

            BsonElement element;

            Assert.True(document.TryGetElement("header", out element));

            var docHeader = (BsonDocument)element.Value;

            Assert.AreEqual(_imageMessageProps.Count - 3, docHeader.ElementCount);
            ValidateHeader(message, header, docHeader);

            DicomDataset dataset = DicomTypeTranslater.DeserializeJsonToDataset(message.DicomDataset);

            Assert.NotNull(dataset);

            BsonDocument datasetDocument = DicomTypeTranslaterReader.BuildBsonDocument(dataset);

            document.Remove("_id");
            document.Remove("header");

            Assert.AreEqual(datasetDocument, document);
        }
Esempio n. 17
0
        public void RebuildMessageHeader_HasCorrectHeaders()
        {
            var msg = new DicomFileMessage
            {
                DicomFilePath = "path/to/file.dcm",
                NationalPACSAccessionNumber = "1234"
            };

            string parents = $"{Guid.NewGuid().ToString()}->{Guid.NewGuid().ToString()}";
            var    headers = new Dictionary <string, object>
            {
                { "MessageGuid", Guid.NewGuid().ToString() },
                { "ProducerProcessID", 1234 },
                { "ProducerExecutableName", "MongoDocumentHeadersTests" },
                { "Parents", parents },
                { "OriginalPublishTimestamp", MessageHeader.UnixTimeNow() }
            };

            var            header          = new MessageHeader(headers);
            BsonDocument   bsonImageHeader = MongoDocumentHeaders.ImageDocumentHeader(msg, header);
            IMessageHeader rebuiltHeader   = MongoDocumentHeaders.RebuildMessageHeader(bsonImageHeader["MessageHeader"].AsBsonDocument);

            Assert.AreEqual(header, rebuiltHeader);
        }
Esempio n. 18
0
        private void AssertDicomFileMessageHasPatientID(DicomFileMessage msg, string patientId)
        {
            var newDs = DicomTypeTranslater.DeserializeJsonToDataset(msg.DicomDataset);

            Assert.AreEqual(newDs.GetValue <string>(DicomTag.PatientID, 0), patientId);
        }