Beispiel #1
0
        protected void CreateOrLoadUidMappings()
        {
            // Load the mapping for the study
            if (_destinationStudyStorage != null)
            {
                var xml = new UidMapXml();
                xml.Load(_destinationStudyStorage);
                UidMapper = new UidMapper(xml);
            }
            else
            {
                UidMapper = new UidMapper();
            }

            UidMapper.SeriesMapUpdated += UidMapper_SeriesMapUpdated;
        }
Beispiel #2
0
        protected void LoadUidMappings()
        {
            // Load the mapping for the study
            if (_destinationStudyStorage != null)
            {
                string path = Path.Combine(_destinationStudyStorage.GetStudyPath(), "UidMap.xml");
                if (File.Exists(path))
                {
                    UidMapXml xml = new UidMapXml();
                    xml.Load(_destinationStudyStorage);
                    UidMapper = new UidMapper(xml);

                    UidMapper.SeriesMapUpdated += UidMapper_SeriesMapUpdated;
                }
            }
        }
        public UidMapper(UidMapXml xml)
        {
            foreach (StudyUidMap studyMap in xml.StudyUidMaps)
            {
                _studyMap.Add(studyMap.Source, studyMap.Target);

                foreach (Map seriesMap in studyMap.Series)
                {
                    _seriesMap.Add(seriesMap.Source,
                                   new SeriesMapping {
                        OriginalSeriesUid = seriesMap.Source, NewSeriesUid = seriesMap.Target
                    });
                }

                foreach (Map sopMap in studyMap.Instances)
                {
                    _sopMap.Add(sopMap.Source, sopMap.Target);
                }
            }
        }
        public void Save(string path)
        {
            lock (_sync)
            {
                UidMapXml xml = new UidMapXml();
                xml.StudyUidMaps = new List <StudyUidMap>();

                foreach (var entry in _studyMap)
                {
                    StudyUidMap studyMap = new StudyUidMap {
                        Source = entry.Key, Target = entry.Value
                    };
                    xml.StudyUidMaps.Add(studyMap);

                    studyMap.Series = new List <Map>();
                    foreach (SeriesMapping seriesMap in _seriesMap.Values)
                    {
                        studyMap.Series.Add(new Map {
                            Source = seriesMap.OriginalSeriesUid, Target = seriesMap.NewSeriesUid
                        });
                    }

                    studyMap.Instances = new List <Map>();
                    foreach (var sop in _sopMap)
                    {
                        studyMap.Instances.Add(new Map {
                            Source = sop.Key, Target = sop.Value
                        });
                    }
                }

                XmlDocument doc = XmlUtils.SerializeAsXmlDoc(xml);
                doc.Save(path);

                Dirty = false;
            }
        }
        private AutoReconcilerResult MergeImage(StudyReconcileAction action, DicomFile file, StudyHistory lastHistory)
        {
            string originalSeriesUid = file.DataSet[DicomTags.SeriesInstanceUid].ToString();
            string originalSopUid    = file.DataSet[DicomTags.SopInstanceUid].ToString();

            AutoReconcilerResult preProcessingResult = null;
            StudyStorageLocation destStudy;
            UidMapper            uidMapper = null;

            if (lastHistory.DestStudyStorageKey != null)
            {
                StudyStorage destinationStudy = StudyStorage.Load(lastHistory.DestStudyStorageKey);

                //Load the destination.  An exception will be thrown if any issues are encountered.
                FilesystemMonitor.Instance.GetWritableStudyStorageLocation(destinationStudy.ServerPartitionKey,
                                                                           destinationStudy.StudyInstanceUid,
                                                                           StudyRestore.True, StudyCache.True,
                                                                           out destStudy);

                EnsureStudyCanBeUpdated(destStudy);

                bool belongsToAnotherStudy = !destStudy.Equals(StorageLocation);

                ImageUpdateCommandBuilder           commandBuilder = new ImageUpdateCommandBuilder();
                IList <BaseImageLevelUpdateCommand> commands       = commandBuilder.BuildCommands <StudyMatchingMap>(destStudy);
                if (belongsToAnotherStudy)
                {
                    Platform.Log(LogLevel.Info, "AUTO-RECONCILE: Move SOP {0} to Study {1}, A#: {2}, Patient {3}", originalSopUid, destStudy.StudyInstanceUid, destStudy.Study.AccessionNumber, destStudy.Study.PatientsName);

                    // Load the Uid Map, either from cache or from disk
                    if (!_uidMapCache.TryGetValue(destStudy.Key, out uidMapper))
                    {
                        UidMapXml mapXml = new UidMapXml();
                        mapXml.Load(destStudy);
                        uidMapper = new UidMapper(mapXml);

                        _uidMapCache.Add(destStudy.Key, uidMapper);
                    }

                    try
                    {
                        commands.Add(GetUidMappingCommand(StorageLocation, destStudy, uidMapper, originalSopUid, originalSeriesUid));
                    }
                    catch (InstanceAlreadyExistsException ex)
                    {
                        Platform.Log(LogLevel.Info, "An instance already exists with the SOP Instance Uid {0}", ex.SopInstanceUid);
                        preProcessingResult = new AutoReconcilerResult(StudyReconcileAction.Discard)
                        {
                            DiscardImage = true
                        };

                        return(preProcessingResult);
                    }
                }


                preProcessingResult = new AutoReconcilerResult(action)
                {
                    Changes = GetUpdateList(file, commands)
                };

                UpdateImage(file, commands);

                // First, must update the map
                if (uidMapper != null && uidMapper.Dirty)
                {
                    UpdateUidMap(destStudy, uidMapper);
                }

                if (belongsToAnotherStudy)
                {
                    SopInstanceImporterContext importContext = new SopInstanceImporterContext(_contextID, file.SourceApplicationEntityTitle, destStudy.ServerPartition);
                    SopInstanceImporter        importer      = new SopInstanceImporter(importContext);
                    DicomProcessingResult      result        = importer.Import(file);

                    if (!result.Successful)
                    {
                        throw new ApplicationException(result.ErrorMessage);
                    }
                }
            }
            return(preProcessingResult);
        }