private void MoveSeries(string studyInstanceUniqueId, IEnumerable<string> seriesInstanceUniqueIds, string applicationEntityDestination) { DataSet seriesCMoveDataset = new DataSet(); seriesCMoveDataset.FileMetaInfo = GenerateFileMetaInfo(UIDs.StudyRootQueryRetrieveInformationModelMOVE); seriesCMoveDataset.PutCS(Tags.QueryRetrieveLevel, "SERIES"); seriesCMoveDataset.PutUI(Tags.StudyInstanceUniqueId, studyInstanceUniqueId); seriesCMoveDataset.PutUI(Tags.SeriesInstanceUniqueId, seriesInstanceUniqueIds.Distinct().ToArray()); LogDataSetValues(seriesCMoveDataset); CMoveDataSet(seriesCMoveDataset, applicationEntityDestination); }
/// <summary> /// Send C-GET /// <param name="studyInstanceUniqueId">A study instance UniqueId</param> /// <param name="seriesInstanceUniqueId">A series instance UniqueId</param> /// <param name="sopInstanceUniqueId">A sop instance instance UniqueId</param> /// </summary> public IList<DataSet> CGet(string studyInstanceUniqueId, string seriesInstanceUniqueId, string sopInstanceUniqueId) { if ((studyInstanceUniqueId == null) && (seriesInstanceUniqueId == null) && (sopInstanceUniqueId == null)) { return null; } int pcid = _presentationContextIdStart; _presentationContextIdStart += 2; var datasets = new List<DataSet>(); IActiveAssociation active = null; try { string sopClassUniqueId = UIDs.StudyRootQueryRetrieveInformationModelGET; _aAssociateRequest.AddPresContext(_associationFactory.NewPresContext(pcid, sopClassUniqueId, DefinedTransferSyntaxes)); active = OpenAssociation(); if (active != null) { var dataset = new DataSet(); dataset.FileMetaInfo = GenerateFileMetaInfo(sopClassUniqueId); dataset.PutUI(Tags.StudyInstanceUniqueId, studyInstanceUniqueId); dataset.PutUI(Tags.SeriesInstanceUniqueId, seriesInstanceUniqueId); dataset.PutUI(Tags.SOPInstanceUniqueId, sopInstanceUniqueId); IAssociation association = active.Association; if ((association.GetAcceptedPresContext(sopClassUniqueId, TransferSyntaxUniqueId)) == null) { Logger.Error(SOP_CLASS_UNIQUEID_NOT_SUPPORTED); return null; } DicomCommand cGetDicomCommand = _dcmObjectFactory.NewCommand().InitCGetRQ(association.NextMsgID(), sopClassUniqueId, Priority.HIGH); IDimse dimseRequest = _associationFactory.NewDimse(pcid, cGetDicomCommand, dataset); FutureDimseResponse dimseResponse = active.Invoke(dimseRequest); while (!dimseResponse.IsReady()) { Thread.Sleep(0); } datasets.AddRange(dimseResponse.ListPending().Select(dimse => dimse.DataSet)); _aAssociateRequest.RemovePresentationContext(pcid); } } finally { if (active != null) { active.Release(true); } _aAssociateRequest.RemovePresentationContext(pcid); } return datasets; }
/// <summary> /// Find all the studies for a specific patient /// <param name="patientId">The id of the patient</param> /// <param name="patientName">The name of the patient</param> /// </summary> public IList<DataSet> CFindStudy(string patientId, string patientName) { string queryKey = _aAssociateRequest.ApplicationEntityTitle + _port + _hostName + patientId + patientName; if (_cacheManager.ContainsKey(queryKey)) { return _cacheManager[queryKey]; } const string sopClassUniqueId = UIDs.StudyRootQueryRetrieveInformationModelFIND; var dataset = new DataSet(); dataset.FileMetaInfo = GenerateFileMetaInfo(sopClassUniqueId); dataset.PutDA(Tags.StudyDate); dataset.PutTM(Tags.StudyTime); dataset.PutSH(Tags.AccessionNumber); dataset.PutCS(Tags.QueryRetrieveLevel, "STUDY"); dataset.PutCS(Tags.ModalitiesInStudy); dataset.PutLO(Tags.InstitutionName); dataset.PutPN(Tags.PerformingPhysicianName); dataset.PutPN(Tags.ReferringPhysicianName); dataset.PutLO(Tags.StudyDescription); dataset.PutPN(Tags.PatientName, patientName); dataset.PutLO(Tags.PatientID, patientId); dataset.PutDA(Tags.PatientBirthDate); dataset.PutCS(Tags.PatientSex); dataset.PutAS(Tags.PatientAge); dataset.PutUI(Tags.StudyInstanceUniqueId); dataset.PutSH(Tags.StudyID); List<DataSet> datasets = RetrieveDatasetsFromServiceClassProvider(dataset, sopClassUniqueId); if (datasets.Any()) { _cacheManager.Add(queryKey, datasets); } return datasets; }
/// <summary> /// Find all the studies for the studies Instance UniqueIds /// <param name="studyInstanceUniqueIds">The studies' instance UniqueIds</param> /// </summary> public IList<DataSet> CFindStudies(IEnumerable<string> studyInstanceUniqueIds) { const string sopClassUniqueId = UIDs.StudyRootQueryRetrieveInformationModelFIND; var dataset = new DataSet(); dataset.FileMetaInfo = GenerateFileMetaInfo(sopClassUniqueId); dataset.PutDA(Tags.StudyDate); dataset.PutTM(Tags.StudyTime); dataset.PutSH(Tags.AccessionNumber); dataset.PutCS(Tags.QueryRetrieveLevel, "STUDY"); dataset.PutCS(Tags.ModalitiesInStudy); dataset.PutLO(Tags.InstitutionName); dataset.PutPN(Tags.ReferringPhysicianName); dataset.PutLO(Tags.StudyDescription); dataset.PutPN(Tags.PatientName); dataset.PutLO(Tags.PatientID); dataset.PutDA(Tags.PatientBirthDate); dataset.PutCS(Tags.PatientSex); dataset.PutAS(Tags.PatientAge); dataset.PutUI(Tags.StudyInstanceUniqueId, studyInstanceUniqueIds.ToArray()); dataset.PutSH(Tags.StudyID); return studyInstanceUniqueIds.Any() ? RetrieveDatasetsFromServiceClassProvider(dataset, sopClassUniqueId) : new List<DataSet>(); }
/// <summary> /// Send C-FIND to find the series for the studies /// <param name="studiesInstanceUniqueIds">The studies' instance UniqueIds</param> /// </summary> public IList<DataSet> CFindSeriesForStudies(IEnumerable<string> studiesInstanceUniqueIds) { var dataset = new DataSet(); const string sopClassUniqueId = UIDs.StudyRootQueryRetrieveInformationModelFIND; dataset.FileMetaInfo = GenerateFileMetaInfo(sopClassUniqueId); dataset.PutCS(Tags.QueryRetrieveLevel, "SERIES"); dataset.PutCS(Tags.Modality); dataset.PutUI(Tags.StudyInstanceUniqueId, studiesInstanceUniqueIds.ToArray()); dataset.PutUI(Tags.SeriesInstanceUniqueId); dataset.PutIS(Tags.SeriesNumber); dataset.PutDA(Tags.SeriesDate); dataset.PutTM(Tags.SeriesTime); dataset.PutLO(Tags.SeriesDescription); return studiesInstanceUniqueIds != null && studiesInstanceUniqueIds.Any() ? RetrieveDatasetsFromServiceClassProvider(dataset, sopClassUniqueId) : new List<DataSet>(); }
/// <summary> /// Send C-FIND for instance /// <param name="studyInstanceUniqueIds">The studies' instance UniqueIds</param> /// <param name="seriesInstanceUniqueIds">The series' instance UniqueIds</param> /// </summary> public IList<DataSet> CFindInstance(IEnumerable<string> studyInstanceUniqueIds, IEnumerable<string> seriesInstanceUniqueIds) { const string sopClassUniqueId = UIDs.StudyRootQueryRetrieveInformationModelFIND; var datasets = new List<DataSet>(); List<string> seriesNotCached = RetrieveItemsFromTheCache(seriesInstanceUniqueIds, datasets); List<string> studiesNotCached = RetrieveItemsFromTheCache(studyInstanceUniqueIds, datasets); var dataset = new DataSet(); dataset.FileMetaInfo = GenerateFileMetaInfo(sopClassUniqueId); dataset.PutUI(Tags.SOPInstanceUniqueId); dataset.PutCS(Tags.QueryRetrieveLevel, "IMAGE"); dataset.PutUI(Tags.SeriesInstanceUniqueId, seriesNotCached.ToArray()); dataset.PutUI(Tags.StudyInstanceUniqueId, studiesNotCached.ToArray()); datasets.AddRange(RetrieveDatasetsFromServiceClassProvider(dataset, sopClassUniqueId)); return datasets; }