class plugin: def __init__(self, parent): self.parent = parent # Set up pubsub pub.subscribe(self.OnUpdatePatient, 'patient.updated.raw_data') # Load the XRC file for our gui resources xrc = os.path.join(os.path.dirname(__file__), 'scaledose.xrc') self.res = XmlResource(xrc) def OnUpdatePatient(self, msg): """Update and load the patient data.""" self.data = msg.data def pluginMenu(self, evt): """Scale DICOM RT dose data.""" dlgScaleDose = self.res.LoadDialog(self.parent, "ScaleDoseDialog") dlgScaleDose.Init(self.data['rxdose']) if dlgScaleDose.ShowModal() == wx.ID_OK: oldRxDose = dlgScaleDose.oldRxDose newRxDose = dlgScaleDose.newRxDose # Initialize and start the scale dose thread self.t = threading.Thread(target=self.ScaleDoseDataThread, args=(self.data, oldRxDose, newRxDose, self.UpdateData)) self.t.start() else: pass dlgScaleDose.Destroy() return def ScaleDoseDataThread(self, data, oldRxDose, newRxDose, finishedFunc): """Scale the DICOM RT dose data.""" dosescale = float(newRxDose) / float(oldRxDose) # Scale the Rx dose data['rxdose'] = int(data['rxdose'] * dosescale) rtdose = data['rtdose'] # Scale the Dose grid data rtdose.DoseGridScaling = rtdose.DoseGridScaling * dosescale # Scale the DVH data if "DVHs" in rtdose: for item in rtdose.DVHs: item.DVHDoseScaling = item.DVHDoseScaling * dosescale wx.CallAfter(finishedFunc, data) def UpdateData( self, data, ): """Publish the updated patient data.""" pub.sendMessage('patient.updated.raw_data', data)
class plugin: """Calculates conformality of an isodose line to a structure.""" def __init__(self, parent): self.parent = parent # Set up pubsub pub.subscribe(self.OnUpdatePatient, 'patient.updated.parsed_data') # Load the XRC file for our gui resources xrc = os.path.join(os.path.dirname(__file__), 'Conformality.xrc') self.res = XmlResource(xrc) def OnUpdatePatient(self, msg): """Update and load the patient data.""" self.data = msg.data def pluginMenu(self, evt): """Method called after the panel has been initialized.""" panelConformality = self.res.LoadDialog(self.parent, "ConformalityPanel") panelConformality.SetTitle("SRS Conformality") panelConformality.Init(self.data['structures'], self.data['dose'], self.data['plan'], self.data['dvhs']) panelConformality.ShowModal() return panelConformality
def get_progress_dialog(parent, title="Loading..."): """Function to load the progress dialog.""" # Load the XRC file for our gui resources res = XmlResource(util.GetResourcePath('guiutil.xrc')) dialogProgress = res.LoadDialog(parent, 'ProgressDialog') dialogProgress.Init(res, title) return dialogProgress
def PluginManager(parent, plugins, pluginsDisabled): """Prepare to show the plugin manager dialog.""" # Load the XRC file for our gui resources res = XmlResource(util.GetResourcePath('plugin.xrc')) dlgPluginManager = res.LoadDialog(parent, "PluginManagerDialog") dlgPluginManager.Init(plugins, pluginsDisabled) # Show the dialog dlgPluginManager.ShowModal()
def ImportDicom(parent): """Prepare to show the dialog that will Import DICOM and DICOM RT files.""" # Load the XRC file for our gui resources res = XmlResource(util.GetResourcePath('dicomgui.xrc')) dlgDicomImporter = res.LoadDialog(parent, "DicomImporterDialog") dlgDicomImporter.Init(res) # Show the dialog and return the result if (dlgDicomImporter.ShowModal() == wx.ID_OK): value = dlgDicomImporter.GetPatient() #pub.sendMessage('patient.updated.raw_data', value) else: value = {} # Block until the thread is done before destroying the dialog if dlgDicomImporter: dlgDicomImporter.t.join() dlgDicomImporter.Destroy() return value
class plugin: def __init__(self, parent): self.parent = parent # Set up pubsub pub.subscribe(self.OnUpdatePatient, 'patient.updated.raw_data') # Load the XRC file for our gui resources self.res = XmlResource(util.GetBasePluginsPath('anonymize.xrc')) def OnUpdatePatient(self, msg): """Update and load the patient data.""" self.data = msg.data def pluginMenu(self, evt): """Anonymize DICOM / DICOM RT data.""" dlgAnonymize = self.res.LoadDialog(self.parent, "AnonymizeDialog") dlgAnonymize.Init() if dlgAnonymize.ShowModal() == wx.ID_OK: path = dlgAnonymize.path name = str(dlgAnonymize.name) patientid = str(dlgAnonymize.patientid) privatetags = dlgAnonymize.privatetags # If the path doesn't exist, create it if not os.path.exists(path): os.mkdir(path) # Initialize the progress dialog dlgProgress = guiutil.get_progress_dialog( wx.GetApp().GetTopWindow(), "Anonymizing DICOM data...") # Initialize and start the anonymization thread self.t = threading.Thread(target=self.AnonymizeDataThread, args=(self.data, path, name, patientid, privatetags, dlgProgress.OnUpdateProgress)) self.t.start() # Show the progress dialog dlgProgress.ShowModal() dlgProgress.Destroy() else: pass dlgAnonymize.Destroy() return def AnonymizeDataThread(self, data, path, name, patientid, privatetags, progressFunc): """Anonmyize and save each DICOM / DICOM RT file.""" length = 0 for key in ['rtss', 'rtplan', 'rtdose']: if data.has_key(key): length = length + 1 if data.has_key('images'): length = length + len(data['images']) i = 1 if data.has_key('rtss'): rtss = data['rtss'] wx.CallAfter(progressFunc, i, length, 'Anonymizing file ' + str(i) + ' of ' + str(length)) self.updateCommonElements(rtss, name, patientid, privatetags) self.updateElement(rtss, 'SeriesDescription', 'RT Structure Set') self.updateElement(rtss, 'StructureSetDate', '19010101') self.updateElement(rtss, 'StructureSetTime', '000000') if rtss.has_key('RTROIObservations'): for item in rtss.RTROIObservations: self.updateElement(item, 'ROIInterpreter', 'anonymous') rtss.save_as(os.path.join(path, 'rtss.dcm')) i = i + 1 if data.has_key('rtplan'): rtplan = data['rtplan'] wx.CallAfter(progressFunc, i, length, 'Anonymizing file ' + str(i) + ' of ' + str(length)) self.updateCommonElements(rtplan, name, patientid, privatetags) self.updateElement(rtplan, 'SeriesDescription', 'RT Plan') self.updateElement(rtplan, 'RTPlanName', 'plan') self.updateElement(rtplan, 'RTPlanDate', '19010101') self.updateElement(rtplan, 'RTPlanTime', '000000') if rtplan.has_key('ToleranceTables'): for item in rtplan.ToleranceTables: self.updateElement(item, 'ToleranceTableLabel', 'tolerance') if rtplan.has_key('Beams'): for item in rtplan.Beams: self.updateElement(item, 'Manufacturer', 'manufacturer') self.updateElement(item, 'InstitutionName', 'institution') self.updateElement(item, 'InstitutionAddress', 'address') self.updateElement(item, 'InstitutionalDepartmentName', 'department') self.updateElement(item, 'ManufacturersModelName', 'model') self.updateElement(item, 'TreatmentMachineName', 'txmachine') if rtplan.has_key('TreatmentMachines'): for item in rtplan.TreatmentMachines: self.updateElement(item, 'Manufacturer', 'manufacturer') self.updateElement(item, 'InstitutionName', 'vendor') self.updateElement(item, 'InstitutionAddress', 'address') self.updateElement(item, 'InstitutionalDepartmentName', 'department') self.updateElement(item, 'ManufacturersModelName', 'model') self.updateElement(item, 'DeviceSerialNumber', '0') self.updateElement(item, 'TreatmentMachineName', 'txmachine') if rtplan.has_key('Sources'): for item in rtplan.Sources: self.updateElement(item, 'SourceManufacturer', 'manufacturer') self.updateElement(item, 'SourceIsotopeName', 'isotope') rtplan.save_as(os.path.join(path, 'rtplan.dcm')) i = i + 1 if data.has_key('rtdose'): rtdose = data['rtdose'] wx.CallAfter(progressFunc, i, length, 'Anonymizing file ' + str(i) + ' of ' + str(length)) self.updateCommonElements(rtdose, name, patientid, privatetags) self.updateElement(rtdose, 'SeriesDescription', 'RT Dose') rtdose.save_as(os.path.join(path, 'rtdose.dcm')) i = i + 1 if data.has_key('images'): images = data['images'] for n, image in enumerate(images): wx.CallAfter( progressFunc, i, length, 'Anonymizing file ' + str(i) + ' of ' + str(length)) self.updateCommonElements(image, name, patientid, privatetags) self.updateElement(image, 'SeriesDate', '19010101') self.updateElement(image, 'ContentDate', '19010101') self.updateElement(image, 'SeriesTime', '000000') self.updateElement(image, 'ContentTime', '000000') self.updateElement(image, 'InstitutionName', 'institution') self.updateElement(image, 'InstitutionAddress', 'address') self.updateElement(image, 'InstitutionalDepartmentName', 'department') modality = image.SOPClassUID.name.partition( ' Image Storage')[0] image.save_as( os.path.join(path, modality.lower() + '.' + str(n) + '.dcm')) i = i + 1 wx.CallAfter(progressFunc, length - 1, length, 'Done') def updateElement(self, data, element, value): """Updates the element only if it exists in the original DICOM data.""" if element in data: data.update({element: value}) def updateCommonElements(self, data, name, patientid, privatetags): """Updates the element only if it exists in the original DICOM data.""" if len(name): self.updateElement(data, 'PatientsName', name) if len(patientid): self.updateElement(data, 'PatientID', patientid) if privatetags: data.remove_private_tags() self.updateElement(data, 'OtherPatientIDs', patientid) self.updateElement(data, 'OtherPatientNames', name) self.updateElement(data, 'InstanceCreationDate', '19010101') self.updateElement(data, 'InstanceCreationTime', '000000') self.updateElement(data, 'StudyDate', '19010101') self.updateElement(data, 'StudyTime', '000000') self.updateElement(data, 'AccessionNumber', '') self.updateElement(data, 'Manufacturer', 'manufacturer') self.updateElement(data, 'ReferringPhysiciansName', 'physician') self.updateElement(data, 'StationName', 'station') self.updateElement(data, 'NameofPhysiciansReadingStudy', 'physician') self.updateElement(data, 'OperatorsName', 'operator') self.updateElement(data, 'PhysiciansofRecord', 'physician') self.updateElement(data, 'ManufacturersModelName', 'model') self.updateElement(data, 'PatientsBirthDate', '') self.updateElement(data, 'PatientsSex', 'O') self.updateElement(data, 'PatientsAge', '000Y') self.updateElement(data, 'PatientsWeight', 0) self.updateElement(data, 'PatientsSize', 0) self.updateElement(data, 'PatientsAddress', 'address') self.updateElement(data, 'AdditionalPatientHistory', '') self.updateElement(data, 'EthnicGroup', 'ethnicity') self.updateElement(data, 'StudyID', '1') self.updateElement(data, 'DeviceSerialNumber', '0') self.updateElement(data, 'SoftwareVersions', '1.0') self.updateElement(data, 'ReviewDate', '19010101') self.updateElement(data, 'ReviewTime', '000000') self.updateElement(data, 'ReviewerName', 'anonymous')
class plugin: def __init__(self, parent): self.parent = parent # Set up pubsub pub.subscribe(self.OnUpdatePatient, "patient.updated.raw_data") # Load the XRC file for our gui resources self.res = XmlResource(util.GetBasePluginsPath("anonymize.xrc")) def OnUpdatePatient(self, msg): """Update and load the patient data.""" self.data = msg def pluginMenu(self, evt): """Anonymize DICOM / DICOM RT data.""" dlgAnonymize = self.res.LoadDialog(self.parent, "AnonymizeDialog") dlgAnonymize.Init() if dlgAnonymize.ShowModal() == wx.ID_OK: path = dlgAnonymize.path name = str(dlgAnonymize.name) patientid = str(dlgAnonymize.patientid) privatetags = dlgAnonymize.privatetags # If the path doesn't exist, create it if not os.path.exists(path): os.mkdir(path) # Initialize the progress dialog dlgProgress = guiutil.get_progress_dialog( wx.GetApp().GetTopWindow(), "Anonymizing DICOM data..." ) # Initialize and start the anonymization thread self.t = threading.Thread( target=self.AnonymizeDataThread, args=( self.data, path, name, patientid, privatetags, dlgProgress.OnUpdateProgress, ), ) self.t.start() # Show the progress dialog dlgProgress.ShowModal() dlgProgress.Destroy() else: pass dlgAnonymize.Destroy() return def AnonymizeDataThread( self, data, path, name, patientid, privatetags, progressFunc ): """Anonmyize and save each DICOM / DICOM RT file.""" length = 0 for key in ["rtss", "rtplan", "rtdose"]: if key in data: length = length + 1 if "images" in data: length = length + len(data["images"]) i = 1 if "rtss" in data: rtss = data["rtss"] wx.CallAfter( progressFunc, i, length, "Anonymizing file " + str(i) + " of " + str(length), ) self.updateCommonElements(rtss, name, patientid, privatetags) self.updateElement(rtss, "SeriesDescription", "RT Structure Set") self.updateElement(rtss, "StructureSetDate", "19010101") self.updateElement(rtss, "StructureSetTime", "000000") if "RTROIObservations" in rtss: for item in rtss.RTROIObservations: self.updateElement(item, "ROIInterpreter", "anonymous") rtss.save_as(os.path.join(path, "rtss.dcm")) i = i + 1 if "rtplan" in data: rtplan = data["rtplan"] wx.CallAfter( progressFunc, i, length, "Anonymizing file " + str(i) + " of " + str(length), ) self.updateCommonElements(rtplan, name, patientid, privatetags) self.updateElement(rtplan, "SeriesDescription", "RT Plan") self.updateElement(rtplan, "RTPlanName", "plan") self.updateElement(rtplan, "RTPlanDate", "19010101") self.updateElement(rtplan, "RTPlanTime", "000000") if "ToleranceTables" in rtplan: for item in rtplan.ToleranceTables: self.updateElement(item, "ToleranceTableLabel", "tolerance") if "Beams" in rtplan: for item in rtplan.Beams: self.updateElement(item, "Manufacturer", "manufacturer") self.updateElement(item, "InstitutionName", "institution") self.updateElement(item, "InstitutionAddress", "address") self.updateElement( item, "InstitutionalDepartmentName", "department" ) self.updateElement(item, "ManufacturersModelName", "model") self.updateElement(item, "TreatmentMachineName", "txmachine") if "TreatmentMachines" in rtplan: for item in rtplan.TreatmentMachines: self.updateElement(item, "Manufacturer", "manufacturer") self.updateElement(item, "InstitutionName", "vendor") self.updateElement(item, "InstitutionAddress", "address") self.updateElement( item, "InstitutionalDepartmentName", "department" ) self.updateElement(item, "ManufacturersModelName", "model") self.updateElement(item, "DeviceSerialNumber", "0") self.updateElement(item, "TreatmentMachineName", "txmachine") if "Sources" in rtplan: for item in rtplan.Sources: self.updateElement(item, "SourceManufacturer", "manufacturer") self.updateElement(item, "SourceIsotopeName", "isotope") rtplan.save_as(os.path.join(path, "rtplan.dcm")) i = i + 1 if "rtdose" in data: rtdose = data["rtdose"] wx.CallAfter( progressFunc, i, length, "Anonymizing file " + str(i) + " of " + str(length), ) self.updateCommonElements(rtdose, name, patientid, privatetags) self.updateElement(rtdose, "SeriesDescription", "RT Dose") rtdose.save_as(os.path.join(path, "rtdose.dcm")) i = i + 1 if "images" in data: images = data["images"] for n, image in enumerate(images): wx.CallAfter( progressFunc, i, length, "Anonymizing file " + str(i) + " of " + str(length), ) self.updateCommonElements(image, name, patientid, privatetags) self.updateElement(image, "SeriesDate", "19010101") self.updateElement(image, "ContentDate", "19010101") self.updateElement(image, "SeriesTime", "000000") self.updateElement(image, "ContentTime", "000000") self.updateElement(image, "InstitutionName", "institution") self.updateElement(image, "InstitutionAddress", "address") self.updateElement(image, "InstitutionalDepartmentName", "department") modality = image.SOPClassUID.name.partition(" Image Storage")[0] image.save_as( os.path.join(path, modality.lower() + "." + str(n) + ".dcm") ) i = i + 1 wx.CallAfter(progressFunc, length - 1, length, "Done") def updateElement(self, data, element, value): """Updates the element only if it exists in the original DICOM data.""" if element in data: data.update({element: value}) def updateCommonElements(self, data, name, patientid, privatetags): """Updates the element only if it exists in the original DICOM data.""" if len(name): self.updateElement(data, "PatientsName", name) if len(patientid): self.updateElement(data, "PatientID", patientid) if privatetags: data.remove_private_tags() self.updateElement(data, "OtherPatientIDs", patientid) self.updateElement(data, "OtherPatientNames", name) self.updateElement(data, "InstanceCreationDate", "19010101") self.updateElement(data, "InstanceCreationTime", "000000") self.updateElement(data, "StudyDate", "19010101") self.updateElement(data, "StudyTime", "000000") self.updateElement(data, "AccessionNumber", "") self.updateElement(data, "Manufacturer", "manufacturer") self.updateElement(data, "ReferringPhysiciansName", "physician") self.updateElement(data, "StationName", "station") self.updateElement(data, "NameofPhysiciansReadingStudy", "physician") self.updateElement(data, "OperatorsName", "operator") self.updateElement(data, "PhysiciansofRecord", "physician") self.updateElement(data, "ManufacturersModelName", "model") self.updateElement(data, "PatientsBirthDate", "") self.updateElement(data, "PatientsSex", "O") self.updateElement(data, "PatientsAge", "000Y") self.updateElement(data, "PatientsWeight", 0) self.updateElement(data, "PatientsSize", 0) self.updateElement(data, "PatientsAddress", "address") self.updateElement(data, "AdditionalPatientHistory", "") self.updateElement(data, "EthnicGroup", "ethnicity") self.updateElement(data, "StudyID", "1") self.updateElement(data, "DeviceSerialNumber", "0") self.updateElement(data, "SoftwareVersions", "1.0") self.updateElement(data, "ReviewDate", "19010101") self.updateElement(data, "ReviewTime", "000000") self.updateElement(data, "ReviewerName", "anonymous")