private static IList <StudyHistory> FindReconcileHistories(StudyStorageLocation storageLocation, DicomMessageBase file) { ImageSetDescriptor fileDesc = new ImageSetDescriptor(file.DataSet); List <StudyHistory> studyHistoryList = new List <StudyHistory>( ServerHelper.FindStudyHistories(storageLocation.StudyStorage, new[] { StudyHistoryTypeEnum.StudyReconciled })); IList <StudyHistory> reconcileHistories = studyHistoryList.FindAll( delegate(StudyHistory item) { ImageSetDescriptor desc = XmlUtils.Deserialize <ImageSetDescriptor>(item.StudyData.DocumentElement); return(desc.Equals(fileDesc)); }); if (reconcileHistories.Count == 0) { // no history found in cache... reload the list and search again one more time studyHistoryList = new List <StudyHistory>( ServerHelper.FindStudyHistories(storageLocation.StudyStorage, new[] { StudyHistoryTypeEnum.StudyReconciled })); reconcileHistories = studyHistoryList.FindAll( delegate(StudyHistory item) { ImageSetDescriptor desc = XmlUtils.Deserialize <ImageSetDescriptor>(item.StudyData.DocumentElement); return(desc.Equals(fileDesc)); }); } return(reconcileHistories); }
protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext) { string seriesUid = _file.DataSet[DicomTags.SeriesInstanceUid].GetString(0, String.Empty); string sopUid = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String.Empty); ImageSetDescriptor imageSet = new ImageSetDescriptor(_file.DataSet); ReconcileStudyQueueDescription queueDesc = GetQueueEntryDescription(_storageLocation, _file); ReconcileStudyWorkQueueData detailsData = new ReconcileStudyWorkQueueData { StoragePath = _reconcileImageStorage.GetFolderPath(), Details = new ImageSetDetails(_file.DataSet) }; detailsData.Details.InsertFile(_file); IInsertStudyIntegrityQueue broker = updateContext.GetBroker <IInsertStudyIntegrityQueue>(); InsertStudyIntegrityQueueParameters parameters = new InsertStudyIntegrityQueueParameters { Description = queueDesc.ToString(), StudyInstanceUid = _storageLocation.StudyInstanceUid, ServerPartitionKey = _storageLocation.ServerPartition.Key, StudyStorageKey = _storageLocation.Key, StudyIntegrityReasonEnum = _reason, SeriesInstanceUid = seriesUid, SeriesDescription = sopUid, SopInstanceUid = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String . Empty), StudyData = XmlUtils.SerializeAsXmlDoc(imageSet), Details = XmlUtils.SerializeAsXmlDoc(detailsData), GroupID = _uidGroup, UidRelativePath = _reconcileImageStorage.GetSopRelativePath( _file.DataSet[DicomTags.SopInstanceUid].ToString()) }; StudyIntegrityQueue item = broker.FindOne(parameters); if (item == null) { throw new ApplicationException("Unable to update reconcile queue"); } _siqItem = item; if (!parameters.Inserted) { // Need to re-use the path that's already assigned for this entry ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details); data.Details.InsertFile(_file); XmlDocument updatedQueueDataXml = XmlUtils.SerializeAsXmlDoc(data); IStudyIntegrityQueueEntityBroker updateBroker = updateContext.GetBroker <IStudyIntegrityQueueEntityBroker>(); StudyIntegrityQueueUpdateColumns columns = new StudyIntegrityQueueUpdateColumns { Details = updatedQueueDataXml }; updateBroker.Update(item.GetKey(), columns); } }
protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext) { var broker = updateContext.GetBroker <IInsertDuplicateSopReceivedQueue>(); var parms = new InsertDuplicateSopReceivedQueueParameters { GroupID = _groupId, ServerPartitionKey = _studyLocation.ServerPartitionKey, StudyStorageKey = _studyLocation.Key, StudyInstanceUid = _file.DataSet[DicomTags.StudyInstanceUid].ToString(), SeriesDescription = _file.DataSet[DicomTags.SeriesDescription].ToString(), SeriesInstanceUid = _file.DataSet[DicomTags.SeriesInstanceUid].ToString(), SopInstanceUid = _file.MediaStorageSopInstanceUid }; ReconcileStudyQueueDescription queueDesc = CreateQueueEntryDescription(_file); parms.Description = queueDesc != null?queueDesc.ToString() : String.Empty; var queueData = new DuplicateSIQQueueData { StoragePath = _duplicateStoragePath, Details = new ImageSetDetails(_file.DataSet), TimeStamp = Platform.Time }; if (_reasons != null && _reasons.Count > 0) { queueData.ComparisonResults = _reasons; } var imageSet = new ImageSetDescriptor(_file.DataSet); parms.StudyData = XmlUtils.SerializeAsXmlDoc(imageSet); parms.Details = XmlUtils.SerializeAsXmlDoc(queueData); parms.UidRelativePath = _relativePath; IList <DuplicateSopReceivedQueue> entries = broker.Find(parms); Platform.CheckForNullReference(entries, "entries"); Platform.CheckTrue(entries.Count == 1, "entries.Count==1"); DuplicateSopReceivedQueue queueEntry = entries[0]; var data = XmlUtils.Deserialize <DuplicateSIQQueueData>(queueEntry.Details); data.Details.InsertFile(_file); queueEntry.Details = XmlUtils.SerializeAsXmlDoc(data); var siqBroker = updateContext.GetBroker <IStudyIntegrityQueueEntityBroker>(); if (!siqBroker.Update(queueEntry)) { throw new ApplicationException("Unable to update duplicate queue entry"); } }
public InconsistentDataSIQRecord(StudyIntegrityQueue queue) { _queueItem = queue; ReconcileStudyWorkQueueData data = XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(queue.Details); _conflictingImageDetails = data.Details; _conflictingImageDescriptor = XmlUtils.Deserialize <ImageSetDescriptor>(queue.StudyData); StudyStorage storage = StudyStorage.Load(HttpContextData.Current.ReadContext, queue.StudyStorageKey); Study study = storage.LoadStudy(HttpContextData.Current.ReadContext); _existingStudyInfo = new StudyInformation(new ServerEntityAttributeProvider(study)); }
protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext) { var broker = updateContext.GetBroker<IInsertDuplicateSopReceivedQueue>(); var parms = new InsertDuplicateSopReceivedQueueParameters { GroupID = _groupId, ServerPartitionKey = _studyLocation.ServerPartitionKey, StudyStorageKey = _studyLocation.Key, StudyInstanceUid = _file.DataSet[DicomTags.StudyInstanceUid].ToString(), SeriesDescription = _file.DataSet[DicomTags.SeriesDescription].ToString(), SeriesInstanceUid = _file.DataSet[DicomTags.SeriesInstanceUid].ToString(), SopInstanceUid = _file.MediaStorageSopInstanceUid }; ReconcileStudyQueueDescription queueDesc = CreateQueueEntryDescription(_file); parms.Description = queueDesc != null ? queueDesc.ToString() : String.Empty; var queueData = new DuplicateSIQQueueData { StoragePath = _duplicateStoragePath, Details = new ImageSetDetails(_file.DataSet), TimeStamp = Platform.Time }; if (_reasons != null && _reasons.Count>0) { queueData.ComparisonResults = _reasons; } var imageSet = new ImageSetDescriptor(_file.DataSet); parms.StudyData = XmlUtils.SerializeAsXmlDoc(imageSet); parms.Details = XmlUtils.SerializeAsXmlDoc(queueData); parms.UidRelativePath = _relativePath; IList<DuplicateSopReceivedQueue> entries = broker.Find(parms); Platform.CheckForNullReference(entries, "entries"); Platform.CheckTrue(entries.Count == 1, "entries.Count==1"); DuplicateSopReceivedQueue queueEntry = entries[0]; var data = XmlUtils.Deserialize<DuplicateSIQQueueData>(queueEntry.Details); data.Details.InsertFile(_file); queueEntry.Details = XmlUtils.SerializeAsXmlDoc(data); var siqBroker = updateContext.GetBroker<IStudyIntegrityQueueEntityBroker>(); if (!siqBroker.Update(queueEntry)) throw new ApplicationException("Unable to update duplicate queue entry"); }
protected override void OnExecute(CommandProcessor theProcessor, IUpdateContext updateContext) { string seriesUid = _file.DataSet[DicomTags.SeriesInstanceUid].GetString(0, String.Empty); string sopUid = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String.Empty); ImageSetDescriptor imageSet = new ImageSetDescriptor(_file.DataSet); ReconcileStudyQueueDescription queueDesc = GetQueueEntryDescription(_storageLocation, _file); ReconcileStudyWorkQueueData detailsData = new ReconcileStudyWorkQueueData { StoragePath = _reconcileImageStorage.GetFolderPath(), Details = new ImageSetDetails(_file.DataSet) }; detailsData.Details.InsertFile(_file); IInsertStudyIntegrityQueue broker = updateContext.GetBroker<IInsertStudyIntegrityQueue>(); InsertStudyIntegrityQueueParameters parameters = new InsertStudyIntegrityQueueParameters { Description = queueDesc.ToString(), StudyInstanceUid = _storageLocation.StudyInstanceUid, ServerPartitionKey = _storageLocation.ServerPartition.Key, StudyStorageKey = _storageLocation.Key, StudyIntegrityReasonEnum = _reason, SeriesInstanceUid = seriesUid, SeriesDescription = sopUid, SopInstanceUid = _file.DataSet[DicomTags.SopInstanceUid].GetString(0, String . Empty), StudyData = XmlUtils.SerializeAsXmlDoc(imageSet), Details = XmlUtils.SerializeAsXmlDoc(detailsData), GroupID = _uidGroup, UidRelativePath = _reconcileImageStorage.GetSopRelativePath( _file.DataSet[DicomTags.SopInstanceUid].ToString()) }; StudyIntegrityQueue item = broker.FindOne(parameters); if (item == null) { throw new ApplicationException("Unable to update reconcile queue"); } _siqItem = item; if (!parameters.Inserted) { // Need to re-use the path that's already assigned for this entry ReconcileStudyWorkQueueData data = XmlUtils.Deserialize<ReconcileStudyWorkQueueData>(item.Details); data.Details.InsertFile(_file); XmlDocument updatedQueueDataXml = XmlUtils.SerializeAsXmlDoc(data); IStudyIntegrityQueueEntityBroker updateBroker = updateContext.GetBroker<IStudyIntegrityQueueEntityBroker>(); StudyIntegrityQueueUpdateColumns columns = new StudyIntegrityQueueUpdateColumns {Details = updatedQueueDataXml}; updateBroker.Update(item.GetKey(), columns); } }
public static ReconcileDetails CreateReconcileDetails(StudyIntegrityQueueSummary item) { ReconcileDetails details = item.TheStudyIntegrityQueueItem.StudyIntegrityReasonEnum.Equals( StudyIntegrityReasonEnum.InconsistentData) ? new ReconcileDetails(item.TheStudyIntegrityQueueItem) : new DuplicateEntryDetails(item.TheStudyIntegrityQueueItem); Study study = item.StudySummary.TheStudy; details.StudyInstanceUid = study.StudyInstanceUid; //Set the demographic details of the Existing Patient details.ExistingStudy = new ReconcileDetails.StudyInfo(); details.ExistingStudy.StudyInstanceUid = item.StudySummary.StudyInstanceUid; details.ExistingStudy.AccessionNumber = item.StudySummary.AccessionNumber; details.ExistingStudy.StudyDate = item.StudySummary.StudyDate; details.ExistingStudy.Patient.PatientID = item.StudySummary.PatientId; details.ExistingStudy.Patient.Name = item.StudySummary.PatientsName; details.ExistingStudy.Patient.Sex = study.PatientsSex; details.ExistingStudy.Patient.IssuerOfPatientID = study.IssuerOfPatientId; details.ExistingStudy.Patient.BirthDate = study.PatientsBirthDate; details.ExistingStudy.Series = CollectionUtils.Map( study.Series.Values, delegate(Series theSeries) { var seriesDetails = new ReconcileDetails.SeriesDetails { Description = theSeries.SeriesDescription, SeriesInstanceUid = theSeries.SeriesInstanceUid, Modality = theSeries.Modality, NumberOfInstances = theSeries.NumberOfSeriesRelatedInstances, SeriesNumber = theSeries.SeriesNumber }; return(seriesDetails); }); details.ConflictingImageSet = item.QueueData.Details; details.ConflictingStudyInfo = new ReconcileDetails.StudyInfo(); if (item.QueueData.Details != null) { // extract the conflicting study info from Details details.ConflictingStudyInfo.AccessionNumber = item.QueueData.Details.StudyInfo.AccessionNumber; details.ConflictingStudyInfo.StudyDate = item.QueueData.Details.StudyInfo.StudyDate; details.ConflictingStudyInfo.StudyInstanceUid = item.QueueData.Details.StudyInfo.StudyInstanceUid; details.ConflictingStudyInfo.StudyDate = item.QueueData.Details.StudyInfo.StudyDate; details.ConflictingStudyInfo.Patient = new ReconcileDetails.PatientInfo { BirthDate = item.QueueData.Details.StudyInfo.PatientInfo. PatientsBirthdate, IssuerOfPatientID = item.QueueData.Details.StudyInfo.PatientInfo. IssuerOfPatientId, Name = item.QueueData.Details.StudyInfo.PatientInfo.Name, PatientID = item.QueueData.Details.StudyInfo.PatientInfo. PatientId, Sex = item.QueueData.Details.StudyInfo.PatientInfo.Sex }; details.ConflictingStudyInfo.Series = CollectionUtils.Map( item.QueueData.Details.StudyInfo.Series, delegate(SeriesInformation input) { var seriesDetails = new ReconcileDetails.SeriesDetails { Description = input.SeriesDescription, Modality = input.Modality, SeriesInstanceUid = input.SeriesInstanceUid, NumberOfInstances = input.NumberOfInstances }; return(seriesDetails); }); } else { // Extract the conflicting study info from StudyData // Note: Not all fields are available. ImageSetDescriptor desc = ImageSetDescriptor.Parse(item.TheStudyIntegrityQueueItem.StudyData.DocumentElement); string value; if (desc.TryGetValue(DicomTags.AccessionNumber, out value)) { details.ConflictingStudyInfo.AccessionNumber = value; } if (desc.TryGetValue(DicomTags.StudyDate, out value)) { details.ConflictingStudyInfo.StudyDate = value; } if (desc.TryGetValue(DicomTags.StudyInstanceUid, out value)) { details.ConflictingStudyInfo.StudyInstanceUid = value; } details.ConflictingStudyInfo.Patient = new ReconcileDetails.PatientInfo(); if (desc.TryGetValue(DicomTags.PatientsBirthDate, out value)) { details.ConflictingStudyInfo.Patient.BirthDate = value; } if (desc.TryGetValue(DicomTags.IssuerOfPatientId, out value)) { details.ConflictingStudyInfo.Patient.IssuerOfPatientID = value; } if (desc.TryGetValue(DicomTags.PatientsName, out value)) { details.ConflictingStudyInfo.Patient.Name = value; } if (desc.TryGetValue(DicomTags.PatientId, out value)) { details.ConflictingStudyInfo.Patient.PatientID = value; } if (desc.TryGetValue(DicomTags.PatientsSex, out value)) { details.ConflictingStudyInfo.Patient.Sex = value; } var series = new List <ReconcileDetails.SeriesDetails>(); details.ConflictingStudyInfo.Series = series; var uidBroker = HttpContextData.Current.ReadContext.GetBroker <IStudyIntegrityQueueUidEntityBroker>(); var criteria = new StudyIntegrityQueueUidSelectCriteria(); criteria.StudyIntegrityQueueKey.EqualTo(item.TheStudyIntegrityQueueItem.GetKey()); IList <StudyIntegrityQueueUid> uids = uidBroker.Find(criteria); Dictionary <string, List <StudyIntegrityQueueUid> > seriesGroups = CollectionUtils.GroupBy(uids, uid => uid. SeriesInstanceUid); foreach (string seriesUid in seriesGroups.Keys) { var seriesDetails = new ReconcileDetails.SeriesDetails { SeriesInstanceUid = seriesUid, Description = seriesGroups[seriesUid][0].SeriesDescription, NumberOfInstances = seriesGroups[seriesUid].Count }; //seriesDetails.Modality = "N/A"; series.Add(seriesDetails); } } return(details); }
/// <summary> /// Constructs an instance of <see cref="WorkQueue"/> based on a <see cref="WorkQueueSummary"/> object. /// </summary> /// <param name="item"></param> /// <returns></returns> /// <remark> /// /// </remark> private StudyIntegrityQueueSummary CreateStudyIntegrityQueueSummary(StudyIntegrityQueue item) { var summary = new StudyIntegrityQueueSummary(); var ssAdaptor = new StudyStorageAdaptor(); var storages = ssAdaptor.Get(HttpContext.Current.GetSharedPersistentContext(), item.StudyStorageKey); try { summary.Reason = item.StudyIntegrityReasonEnum; summary.TheStudyIntegrityQueueItem = item; summary.ThePartition = Partition; var queueDescription = new ReconcileStudyQueueDescription(); queueDescription.Parse(item.Description); summary.QueueData = item.StudyIntegrityReasonEnum.Equals(StudyIntegrityReasonEnum.InconsistentData) ? XmlUtils.Deserialize <ReconcileStudyWorkQueueData>(item.Details) : XmlUtils.Deserialize <DuplicateSIQQueueData>(item.Details); ImageSetDescriptor studyData = ImageSetDescriptor.Parse(item.StudyData.DocumentElement); // These fields only exists in Enterprise version if (summary.QueueData.Details != null && summary.QueueData.Details.StudyInfo != null) { summary.ReceivedTime = item.InsertTime; summary.ConflictingPatientId = summary.QueueData.Details.StudyInfo.PatientInfo.PatientId; summary.ConflictingPatientName = summary.QueueData.Details.StudyInfo.PatientInfo.Name; summary.ConflictingAccessionNumber = summary.QueueData.Details.StudyInfo.AccessionNumber; summary.ConflictingStudyDate = summary.QueueData.Details.StudyInfo.StudyDate; summary.ConflictingStudyDescription = summary.QueueData.Details.StudyInfo.StudyDescription; var modalities = new List <string>(); List <SeriesInformation> seriesList = summary.QueueData.Details.StudyInfo.Series; foreach (SeriesInformation series in seriesList) { if (!modalities.Contains(series.Modality)) { modalities.Add(series.Modality); } } summary.ConflictingModalities = modalities.ToArray(); } else { string value; if (studyData.TryGetValue(DicomTags.PatientId, out value)) { summary.ConflictingPatientId = value; } if (studyData.TryGetValue(DicomTags.PatientsName, out value)) { summary.ConflictingPatientName = value; } if (studyData.TryGetValue(DicomTags.AccessionNumber, out value)) { summary.ConflictingAccessionNumber = value; } if (studyData.TryGetValue(DicomTags.StudyDate, out value)) { summary.ConflictingStudyDate = value; } if (studyData.TryGetValue(DicomTags.StudyDescription, out value)) { summary.ConflictingStudyDescription = value; } // no modality info } // Fetch existing study info. Note: this is done last because the study may not exist. Study study = storages.LoadStudy(HttpContext.Current.GetSharedPersistentContext()); summary.StudySummary = StudySummaryAssembler.CreateStudySummary(HttpContext.Current.GetSharedPersistentContext(), study); if (summary.StudySummary != null) { summary.StudyInstanceUid = summary.StudySummary.StudyInstanceUid; summary.ExistingPatientName = summary.StudySummary.PatientsName; summary.ExistingPatientId = summary.StudySummary.PatientId; summary.ExistingAccessionNumber = summary.StudySummary.AccessionNumber; } } catch (StudyNotFoundException) { // Study record may not exist. For eg, duplicate arrives but the existing study hasn't been processed. } return(summary); }
public InconsistentDataSIQRecord(StudyIntegrityQueue queue) { _queueItem = queue; ReconcileStudyWorkQueueData data = XmlUtils.Deserialize<ReconcileStudyWorkQueueData>(queue.Details); _conflictingImageDetails = data.Details; _conflictingImageDescriptor = XmlUtils.Deserialize<ImageSetDescriptor>(queue.StudyData); StudyStorage storage = StudyStorage.Load(HttpContextData.Current.ReadContext, queue.StudyStorageKey); Study study = storage.LoadStudy(HttpContextData.Current.ReadContext); _existingStudyInfo = new StudyInformation(new ServerEntityAttributeProvider(study)); }
private static IList<StudyHistory> FindReconcileHistories(StudyStorageLocation storageLocation, DicomMessageBase file) { ImageSetDescriptor fileDesc = new ImageSetDescriptor(file.DataSet); List<StudyHistory> studyHistoryList = new List<StudyHistory>( ServerHelper.FindStudyHistories(storageLocation.StudyStorage, new[] { StudyHistoryTypeEnum.StudyReconciled })); IList<StudyHistory> reconcileHistories = studyHistoryList.FindAll( delegate(StudyHistory item) { ImageSetDescriptor desc = XmlUtils.Deserialize<ImageSetDescriptor>(item.StudyData.DocumentElement); return desc.Equals(fileDesc); }); if (reconcileHistories.Count == 0) { // no history found in cache... reload the list and search again one more time studyHistoryList = new List<StudyHistory>( ServerHelper.FindStudyHistories(storageLocation.StudyStorage, new[] { StudyHistoryTypeEnum.StudyReconciled })); reconcileHistories = studyHistoryList.FindAll( delegate(StudyHistory item) { ImageSetDescriptor desc = XmlUtils.Deserialize<ImageSetDescriptor>(item.StudyData.DocumentElement); return desc.Equals(fileDesc); }); } return reconcileHistories; }