private uWs.PACS.Model.File InsertFile(PacsContext context, Instance instance, Series dbSeries, Study dbStudy, Patient dbPatient) { var partition = context.ServerPartitions.First(p => p.Id == _context.Partition.Id); string fsDir = partition.FileSystem.DirPath; var filepath = Path.Combine(fsDir, dbPatient.PatientId, dbStudy.StudyUid, dbSeries.SeriesUid, instance.SopInstanceUid); var dbFile = context.Files.FirstOrDefault(f => f.InstanceFk.Equals(instance.Id)); if (dbFile == null) { dbFile = new uWs.PACS.Model.File { CreateTime = DateTime.Now }; context.Files.Add(dbFile); } dbFile.InstanceFk = instance.Id; dbFile.FilePath = filepath; dbFile.FileSystemFk = partition.FileSystem.Id; return dbFile; }
public bool Import(DicomMessage dicomMessage) { if (dicomMessage.DataSet == null) { throw new ArgumentException(); } var patient = new Patient { PatientId = dicomMessage.DataSet[DicomTags.PatientId].GetString(0, string.Empty), PatientName = dicomMessage.DataSet[DicomTags.PatientsName].GetString(0, string.Empty), PatientBirthDate = dicomMessage.DataSet[DicomTags.PatientsBirthDate].GetString(0, string.Empty), Issuer = dicomMessage.DataSet[DicomTags.IssuerOfPatientId].GetString(0, string.Empty), }; var study = new Study() { StudyId = dicomMessage.DataSet[DicomTags.StudyId].GetString(0, string.Empty), StudyUid = dicomMessage.DataSet[DicomTags.StudyInstanceUid].GetString(0, string.Empty), AccessionNumber = dicomMessage.DataSet[DicomTags.AccessionNumber].GetString(0, string.Empty), StudyDate = dicomMessage.DataSet[DicomTags.StudyDate].GetString(0, string.Empty), StudyTime = dicomMessage.DataSet[DicomTags.StudyTime].GetString(0, string.Empty), RefPhysician = dicomMessage.DataSet[DicomTags.ReferringPhysiciansName].GetString(0, string.Empty), StudyDescription = dicomMessage.DataSet[DicomTags.StudyDescription].GetString(0, string.Empty), PatientId = patient.PatientId, PatientName = patient.PatientName, PatientBirthday = patient.PatientBirthDate, PatientAge = dicomMessage.DataSet[DicomTags.PatientsAge].GetString(0, string.Empty), PatientSize = dicomMessage.DataSet[DicomTags.PatientsSize].GetString(0, string.Empty), PatientWeight = dicomMessage.DataSet[DicomTags.PatientsWeight].GetString(0, string.Empty), PatientSex = dicomMessage.DataSet[DicomTags.PatientsSex].GetString(0, string.Empty) }; var series = new Series() { SeriesUid = dicomMessage.DataSet[DicomTags.SeriesInstanceUid].GetString(0, string.Empty), SeriesNumber = dicomMessage.DataSet[DicomTags.SeriesNumber].GetString(0, string.Empty), Modality = dicomMessage.DataSet[DicomTags.Modality].GetString(0, string.Empty), BodyPart = dicomMessage.DataSet[DicomTags.BodyPartExamined].GetString(0, string.Empty), Institution = dicomMessage.DataSet[DicomTags.InstitutionName].GetString(0, string.Empty), StationName = dicomMessage.DataSet[DicomTags.StationName].GetString(0, string.Empty), Department = dicomMessage.DataSet[DicomTags.InstitutionalDepartmentName].GetString(0, string.Empty), PerfPhysician = dicomMessage.DataSet[DicomTags.PerformingPhysiciansName].GetString(0, string.Empty), SeriesDate = dicomMessage.DataSet[DicomTags.SeriesDate].GetString(0, string.Empty), SeriesTime = dicomMessage.DataSet[DicomTags.SeriesTime].GetString(0, string.Empty), SeriesDescription = dicomMessage.DataSet[DicomTags.SeriesDescription].GetString(0, string.Empty), PerformedProcedureStepStartDate = dicomMessage.DataSet[DicomTags.PerformedProcedureStepStartDate].GetString(0, string.Empty), PerformedProcedureStepStartTime = dicomMessage.DataSet[DicomTags.PerformedProcedureStepStartTime].GetString(0, string.Empty), }; var instance = new Instance() { SopInstanceUid = dicomMessage.DataSet[DicomTags.SopInstanceUid].GetString(0, string.Empty), SopClassUid = dicomMessage.DataSet[DicomTags.SopClassUid].GetString(0, string.Empty), InstanceNumber = dicomMessage.DataSet[DicomTags.InstanceNumber].GetString(0, string.Empty), ContentDate = dicomMessage.DataSet[DicomTags.ContentDate].GetString(0, string.Empty), ContentTime = dicomMessage.DataSet[DicomTags.ContentTime].GetString(0, string.Empty) }; if (string.IsNullOrEmpty(study.StudyUid) || string.IsNullOrEmpty(series.SeriesUid) || string.IsNullOrEmpty(instance.SopInstanceUid)) { throw new ArgumentException(); } // Get Patient Db Object using (var context = new PacsContext()) { Patient dbPatient = null; var dbStudy = InsertStudy(context, study, patient, out dbPatient); // Patient and study is exist in db now var dbSeries = InsertSeries(context, series, dbStudy, dbPatient); // insert instance var dbInstance = InsertImage(context, instance, dbSeries, dbStudy, dbPatient); var dbFile = InsertFile(context, dbInstance, dbSeries, dbStudy, dbPatient); var dicomFile = new DicomFile(dicomMessage, dbFile.FilePath); if (!Directory.Exists(Path.GetDirectoryName(dbFile.FilePath))) { Directory.CreateDirectory(Path.GetDirectoryName(dbFile.FilePath)); } dicomFile.Save(); context.SaveChanges(); } return true; }
private Instance InsertImage(PacsContext context, Instance instance, Series dbSeries, Study dbStudy, Patient dbPatient) { var dbInstance = context.Instances.FirstOrDefault(i => i.SopInstanceUid.Equals(instance.SopInstanceUid)); if (dbInstance == null) { dbInstance = instance; dbInstance.SeriesForeignKey = dbSeries.Id; dbInstance.LastUpdateTime = DateTime.Now; dbInstance.InsertTime = DateTime.Now; context.Instances.Add(dbInstance); dbSeries.NumberOfRelatedImage += 1; dbStudy.NumberOfRelatedImage += 1; dbPatient.NumberOfRelatedInstances += 1; } dbInstance.LastUpdateTime = DateTime.Now; dbSeries.LastUpdateTime = DateTime.Now; dbStudy.LastUpdateTime = DateTime.Now; dbPatient.LastUpdateTime = DateTime.Now; return dbInstance; }
private Series InsertSeries(PacsContext context, Series series, Study dbStudy, Patient dbPatient) { var dbSeries = context.Series.FirstOrDefault(s => s.SeriesUid.Equals(series.SeriesUid)); if (dbSeries == null) { dbSeries = series; dbSeries.StudyForeignKey = dbStudy.Id; dbSeries.InsertTime = DateTime.Now; context.Series.Add(dbSeries); dbStudy.NumberOfRelatedSeries += 1; dbPatient.NumberOfRelatedSeries += 1; } return dbSeries; }
private Study InsertStudy(PacsContext context, Study study, Patient patient, out Patient dbPatient) { var dbStudy = context.Studies.FirstOrDefault(s => s.StudyUid.Equals(study.StudyUid)); if (dbStudy == null) { // check is patient exist by patient id, patient name and so on. var tempResult = (context.Patients.Where(p => p.PatientId.Equals(patient.PatientId))).ToList(); // TODO Patient strategy dbPatient = tempResult.FirstOrDefault(); if (dbPatient == null) { patient.LastUpdateTime = DateTime.Now; patient.InsertTime = DateTime.Now; context.Patients.Add(patient); dbPatient = patient; } // Insert Study info dbStudy = study; dbStudy.PatientForeignKey = dbPatient.Id; dbStudy.InsertTime = DateTime.Now; context.Studies.Add(dbStudy); dbPatient.NumberOfRelatedStudies += 1; } else { dbPatient = dbStudy.Patient; } return dbStudy; }
public void Insert(DicomMessageBase dicomMessage) { if (dicomMessage.DataSet == null) { throw new ArgumentException(); } var patient = new Patient { PatientId = dicomMessage.DataSet[DicomTags.PatientId].GetString(0, string.Empty), PatientName = dicomMessage.DataSet[DicomTags.PatientsName].GetString(0, string.Empty), PatientBirthDate = dicomMessage.DataSet[DicomTags.PatientsBirthDate].GetString(0, string.Empty), Issuer = dicomMessage.DataSet[DicomTags.IssuerOfPatientId].GetString(0, string.Empty), }; var study = new Study() { StudyId = dicomMessage.DataSet[DicomTags.StudyId].GetString(0, string.Empty), StudyUid = dicomMessage.DataSet[DicomTags.SopInstanceUid].GetString(0, string.Empty), AccessionNumber = dicomMessage.DataSet[DicomTags.AccessionNumber].GetString(0, string.Empty), StudyDate = dicomMessage.DataSet[DicomTags.StudyDate].GetString(0, string.Empty), StudyTime = dicomMessage.DataSet[DicomTags.StudyTime].GetString(0, string.Empty), RefPhysician = dicomMessage.DataSet[DicomTags.ReferringPhysiciansName].GetString(0, string.Empty), StudyDescription = dicomMessage.DataSet[DicomTags.StudyDescription].GetString(0, string.Empty), PatientAge = dicomMessage.DataSet[DicomTags.PatientsAge].GetString(0, string.Empty), PatientSize = dicomMessage.DataSet[DicomTags.PatientsSize].GetString(0, string.Empty), PatientWeight = dicomMessage.DataSet[DicomTags.PatientsWeight].GetString(0, string.Empty), PatientSex = dicomMessage.DataSet[DicomTags.PatientsSex].GetString(0, string.Empty) }; var series = new Series() { SeriesUid = dicomMessage.DataSet[DicomTags.SeriesInstanceUid].GetString(0, string.Empty), SeriesNumber = dicomMessage.DataSet[DicomTags.SeriesNumber].GetString(0, string.Empty), Modality = dicomMessage.DataSet[DicomTags.Modality].GetString(0, string.Empty), BodyPart = dicomMessage.DataSet[DicomTags.BodyPartExamined].GetString(0, string.Empty), Institution = dicomMessage.DataSet[DicomTags.InstitutionName].GetString(0, string.Empty), StationName = dicomMessage.DataSet[DicomTags.StationName].GetString(0, string.Empty), Department = dicomMessage.DataSet[DicomTags.InstitutionalDepartmentName].GetString(0, string.Empty), PerfPhysician = dicomMessage.DataSet[DicomTags.PerformingPhysiciansName].GetString(0, string.Empty), SeriesDate = dicomMessage.DataSet[DicomTags.SeriesDate].GetString(0, string.Empty), SeriesTime = dicomMessage.DataSet[DicomTags.SeriesTime].GetString(0, string.Empty), SeriesDescription = dicomMessage.DataSet[DicomTags.SeriesDescription].GetString(0, string.Empty), PerformedProcedureStepStartDate = dicomMessage.DataSet[DicomTags.PerformedProcedureStepStartDate].GetString(0, string.Empty), PerformedProcedureStepStartTime = dicomMessage.DataSet[DicomTags.PerformedProcedureStepStartTime].GetString(0, string.Empty), }; var instance = new Instance() { SopInstanceUid = dicomMessage.DataSet[DicomTags.SopInstanceUid].GetString(0, string.Empty), SopClassUid = dicomMessage.DataSet[DicomTags.SopClassUid].GetString(0, string.Empty), InstanceNumber = dicomMessage.DataSet[DicomTags.InstanceNumber].GetString(0, string.Empty), ContentDate = dicomMessage.DataSet[DicomTags.ContentDate].GetString(0, string.Empty), ContentTime = dicomMessage.DataSet[DicomTags.ContentTime].GetString(0, string.Empty) }; if ( string.IsNullOrEmpty(study.StudyUid) || string.IsNullOrEmpty(series.SeriesUid) || string.IsNullOrEmpty(instance.SopInstanceUid)) { throw new ArgumentException(); } // Get Patient Db Object }
/// <summary> /// Populate data from a <see cref="Patient"/> entity into a DICOM C-FIND-RSP message /// </summary> /// <param name="response"></param> /// <param name="tagList"></param> /// <param name="row"></param> private void PopulatePatient(DicomMessage response, IEnumerable<DicomTag> tagList, Patient row) { DicomAttributeCollection dataset = response.DataSet; dataset[DicomTags.RetrieveAeTitle].SetStringValue(base.Partition.AeTitle); // character set var characterSet = GetPreferredCharacterSet(); if (!string.IsNullOrEmpty(characterSet)) { dataset[DicomTags.SpecificCharacterSet].SetStringValue(characterSet); dataset.SpecificCharacterSet = characterSet; } var relatedStudies = row.Studies; Study study = null; if (relatedStudies.Count > 0) study = relatedStudies.First(); foreach (DicomTag tag in tagList) { try { switch (tag.TagValue) { case DicomTags.PatientsName: dataset[DicomTags.PatientsName].SetStringValue(row.PatientName); break; case DicomTags.PatientId: dataset[DicomTags.PatientId].SetStringValue(row.PatientId); break; case DicomTags.IssuerOfPatientId: dataset[DicomTags.IssuerOfPatientId].SetStringValue(row.Issuer); break; case DicomTags.NumberOfPatientRelatedStudies: dataset[DicomTags.NumberOfPatientRelatedStudies].AppendInt32(row.NumberOfRelatedStudies); break; case DicomTags.NumberOfPatientRelatedSeries: dataset[DicomTags.NumberOfPatientRelatedSeries].AppendInt32(row.NumberOfRelatedSeries); break; case DicomTags.NumberOfPatientRelatedInstances: dataset[DicomTags.NumberOfPatientRelatedInstances].AppendInt32(row.NumberOfRelatedInstances); break; case DicomTags.QueryRetrieveLevel: dataset[DicomTags.QueryRetrieveLevel].SetStringValue("PATIENT"); break; case DicomTags.PatientsSex: if (study != null) { dataset[DicomTags.PatientsSex].SetStringValue(study.PatientSex); } else { dataset[DicomTags.PatientsSex].SetNullValue(); } break; case DicomTags.PatientsBirthDate: dataset[DicomTags.PatientsBirthDate].SetStringValue(row.PatientBirthDate); break; // Meta tags that should have not been in the RQ, but we've already set case DicomTags.RetrieveAeTitle: case DicomTags.InstanceAvailability: case DicomTags.SpecificCharacterSet: break; default: if (!tag.IsPrivate) dataset[tag].SetNullValue(); // extension ? break; } } catch (Exception e) { Platform.Log(LogLevel.Warn, e, "Unexpected error setting tag {0} in C-FIND-RSP", dataset[tag].Tag.ToString()); if (!tag.IsPrivate) dataset[tag].SetNullValue(); } } }