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);
        }
Example #2
0
        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");
            }
        }
Example #4
0
        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");
		}
Example #6
0
        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));
 }
Example #10
0
        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;
        }