Initial commit
This commit is contained in:
177
dicom_processing.py
Executable file
177
dicom_processing.py
Executable file
@@ -0,0 +1,177 @@
|
||||
import pydicom
|
||||
import os
|
||||
import file_management
|
||||
import network_utils
|
||||
import asyncio
|
||||
|
||||
def is_dicom_file(file_path):
|
||||
try:
|
||||
pydicom.dcmread(file_path, stop_before_pixels=True)
|
||||
return True
|
||||
except (pydicom.errors.InvalidDicomError, IOError, OSError, Exception):
|
||||
return False
|
||||
|
||||
def extract_patient_info(transfer_folder):
|
||||
print("Extract patient data")
|
||||
try:
|
||||
for root, dirs, files in os.walk(transfer_folder):
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
if is_dicom_file(file_path):
|
||||
try:
|
||||
ds = pydicom.dcmread(file_path)
|
||||
if 'PatientName' in ds and 'PatientBirthDate' in ds:
|
||||
name_vorname = str(ds.PatientName).strip()
|
||||
geburtsdatum = ds.PatientBirthDate
|
||||
return name_vorname, geburtsdatum
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen der DICOM-Datei {file_path}: {e}")
|
||||
continue
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen der DICOM-Dateien: {e}")
|
||||
return None, None
|
||||
return None, None
|
||||
|
||||
def extract_modality(transfer_folder):
|
||||
print("Extract modality data")
|
||||
for root, dirs, files in os.walk(transfer_folder):
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
if is_dicom_file(file_path):
|
||||
try:
|
||||
ds = pydicom.dcmread(file_path)
|
||||
# Überprüfe, ob die gewünschten DICOM-Tags vorhanden sind
|
||||
if 'StudyDate' in ds and 'StudyDescription' in ds:
|
||||
study_date = ds.StudyDate
|
||||
modality = ds.StudyDescription
|
||||
print(f"Extracted modality data from {file_path}")
|
||||
print(study_date)
|
||||
print(modality)
|
||||
return study_date, modality
|
||||
except Exception as e:
|
||||
print(f"Fehler beim Lesen der DICOM-Datei {file_path}: {e}")
|
||||
print("Keine entsprechenden DICOM-Dateien gefunden.")
|
||||
return None, None
|
||||
|
||||
def update_patient_id_in_transfer_folder(transfer_folder, new_patient_id):
|
||||
if not transfer_folder or not os.path.exists(transfer_folder):
|
||||
print(f"FEHLER: Transferordner existiert nicht: {transfer_folder}")
|
||||
return
|
||||
|
||||
if not new_patient_id:
|
||||
print("FEHLER: Keine Patienten-ID angegeben")
|
||||
return
|
||||
|
||||
for root, dirs, files in os.walk(transfer_folder):
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
if not is_dicom_file(file_path):
|
||||
try:
|
||||
os.remove(file_path)
|
||||
print(f"Datei {file_path} wurde gelöscht.")
|
||||
except OSError as e:
|
||||
print(f"Fehler beim Löschen der Datei {file_path}: {e}")
|
||||
else:
|
||||
print(f"Datei {file_path} wurde überprüft und behalten.")
|
||||
try:
|
||||
ds = pydicom.dcmread(file_path) # Lese die DICOM-Datei
|
||||
ds.PatientID = new_patient_id # Aktualisiere das PatientID-Feld
|
||||
ds.save_as(file_path) # Speichere die aktualisierte DICOM-Datei
|
||||
print(f"PatientID in {file_path} wurde zu {new_patient_id} aktualisiert.")
|
||||
except (pydicom.errors.InvalidDicomError, IOError, OSError) as e:
|
||||
print(f"Fehler beim Aktualisieren der PatientID in {file_path}: {e}")
|
||||
except Exception as e:
|
||||
print(f"Unerwarteter Fehler beim Aktualisieren der PatientID in {file_path}: {e}")
|
||||
|
||||
def update_patient_info_in_transfer_folder(transfer_folder, new_name, new_firstname, new_birthdate):
|
||||
if not transfer_folder or not os.path.exists(transfer_folder):
|
||||
print(f"FEHLER: Transferordner existiert nicht: {transfer_folder}")
|
||||
return []
|
||||
|
||||
if not new_name or not new_firstname or not new_birthdate:
|
||||
print("FEHLER: Unvollständige Patientendaten")
|
||||
return []
|
||||
|
||||
changed_files = []
|
||||
for root, dirs, files in os.walk(transfer_folder):
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
if not is_dicom_file(file_path):
|
||||
continue
|
||||
try:
|
||||
ds = pydicom.dcmread(file_path) # Lese die DICOM-Datei
|
||||
ds.PatientName = f"{new_name}^{new_firstname}" # Aktualisiere das Patientenname-Feld
|
||||
ds.PatientBirthDate = new_birthdate # Aktualisiere das Patientengeburtsdatum-Feld
|
||||
ds.save_as(file_path) # Speichere die aktualisierte DICOM-Datei
|
||||
changed_files.append(file_path)
|
||||
print(f"Patienteninformationen in {file_path} wurden aktualisiert.")
|
||||
except (pydicom.errors.InvalidDicomError, IOError, OSError) as e:
|
||||
print(f"Fehler beim Aktualisieren der Patienteninformationen in {file_path}: {e}")
|
||||
except Exception as e:
|
||||
print(f"Unerwarteter Fehler beim Aktualisieren der Patienteninformationen in {file_path}: {e}")
|
||||
|
||||
print(f"Anzahl geänderter Dateien: {len(changed_files)}")
|
||||
return changed_files
|
||||
|
||||
async def process_dicom_files(transfer_folder, gui, name, vorname, geburtsdatum, server_url, server_username, server_pw):
|
||||
print(f"TRANSFER_FOLDER: {transfer_folder}")
|
||||
print("Verarbeitung der DICOM-Dateien gestartet.") # Debugging-Ausgabe
|
||||
# Nach der ersten Datei im Transfer-Ordner suchen, die das DICOM-Attribut PatientData hat
|
||||
|
||||
patient_info = extract_patient_info(transfer_folder)
|
||||
if patient_info is not None:
|
||||
name_vorname_source, geburtsdatum_source = patient_info
|
||||
if name_vorname_source and geburtsdatum_source:
|
||||
print(f"Gefundene Patienteninformationen: {name_vorname_source}, {geburtsdatum_source}")
|
||||
# Weitere Verarbeitungsschritte
|
||||
name_source, vorname_source = file_management.format_patient_name(name_vorname_source)
|
||||
geburtsdatum_source_formatted = file_management.format_birthdate(geburtsdatum_source)
|
||||
print(f"Formatierte Patienteninformationen: {name_source}, {vorname_source}, {geburtsdatum_source_formatted}")
|
||||
geburtsdatum_formatted = file_management.format_birthdate(geburtsdatum)
|
||||
print(f"Formatierte Patienteninformationen: {name}, {vorname}, {geburtsdatum_formatted}")
|
||||
await vergleich_target_source(transfer_folder, gui, name, vorname, geburtsdatum, geburtsdatum_formatted, name_source, vorname_source, geburtsdatum_source_formatted)
|
||||
else:
|
||||
print("Keine Patienteninformationen gefunden.")
|
||||
else:
|
||||
print("Die Funktion extract_patient_info hat keine Werte zurückgegeben.")
|
||||
|
||||
async def vergleich_target_source(transfer_folder, gui, name, vorname, geburtsdatum, geburtsdatum_formatted, name_source, vorname_source, geburtsdatum_source_formatted):
|
||||
# Vergleiche die übergebenen Informationen mit den Quellinformationen
|
||||
print ("Vergleich wird gestartet")
|
||||
comparison_results = file_management.compare_patient_info(name, vorname, geburtsdatum_formatted, name_source, vorname_source, geburtsdatum_source_formatted)
|
||||
print(f"Vergleichsergebnisse: {comparison_results}")
|
||||
# Handeln basierend auf den Vergleichsergebnissen
|
||||
if comparison_results['is_complete_match']:
|
||||
print("Komplette Übereinstimmung der Patienteninformationen.")
|
||||
else:
|
||||
discrepancy_message = (
|
||||
f"{name}, {vorname}, * {geburtsdatum_formatted}\n\n"
|
||||
f"{name_source}, {vorname_source}, * {geburtsdatum_source_formatted}\n\n"
|
||||
)
|
||||
response = gui.show_discrepancy_dialog(discrepancy_message)
|
||||
if response is True:
|
||||
print("Benutzer hat Ja gewählt - Tomedo-Daten werden übernommen")
|
||||
gui.start_animation("Aktualisiere Patientendaten mit den Daten aus Tomedo")
|
||||
update_patient_info_in_transfer_folder(transfer_folder, name, vorname, geburtsdatum)
|
||||
gui.stop_animation()
|
||||
elif response is False:
|
||||
print("Benutzer hat Nein gewählt - Bestätigungsdialog wird angezeigt")
|
||||
# Zeige Bestätigungsdialog, ob wirklich Original-Daten behalten werden sollen
|
||||
confirm_response = gui.show_confirm_keep_original_dialog()
|
||||
if confirm_response is True:
|
||||
# Benutzer hat sich umentschieden - Tomedo-Daten verwenden
|
||||
print("Benutzer hat sich umentschieden - Tomedo-Daten werden übernommen")
|
||||
gui.start_animation("Aktualisiere Patientendaten mit den Daten aus Tomedo")
|
||||
update_patient_info_in_transfer_folder(transfer_folder, name, vorname, geburtsdatum)
|
||||
gui.stop_animation()
|
||||
elif confirm_response is False:
|
||||
print("Benutzer bestätigt - Original-Daten werden beibehalten")
|
||||
# Keine Änderung, Original-Daten bleiben erhalten
|
||||
else:
|
||||
print("Benutzer hat Bestätigungsdialog abgebrochen")
|
||||
# Abbruch - Transfer-Ordner wird bereits im Dialog gelöscht
|
||||
else:
|
||||
print("Benutzer hat Abbruch gewählt oder das Fenster geschlossen")
|
||||
# Abbruch - Transfer-Ordner wird bereits im Dialog gelöscht
|
||||
|
||||
|
||||
Reference in New Issue
Block a user