Exemple #1
0
        /// <summary>
        /// Loads the <see cref="Series"/> and instance mappings from the specified file.
        /// </summary>
        /// <param name="path"></param>
        public void Load(string path)
        {
            if (File.Exists(path))
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(path);

                UidMapXml copy = XmlUtils.Deserialize <UidMapXml>(doc);
                StudyUidMaps = copy.StudyUidMaps;
            }
        }
Exemple #2
0
		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);
            
            }           
        }
Exemple #3
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;
                }
            }
        }
Exemple #4
0
	    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;
            }
	    }
Exemple #5
0
        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;
        }