Update app.py
Browse files
app.py
CHANGED
|
@@ -152,6 +152,7 @@ class DicomAnalyzer:
|
|
| 152 |
except Exception as e:
|
| 153 |
print(f"Error handling keyboard input: {str(e)}")
|
| 154 |
return self.display_image
|
|
|
|
| 155 |
def analyze_roi(self, evt: gr.SelectData):
|
| 156 |
try:
|
| 157 |
if self.current_image is None:
|
|
@@ -274,7 +275,6 @@ class DicomAnalyzer:
|
|
| 274 |
except Exception as e:
|
| 275 |
print(f"Error updating display: {str(e)}")
|
| 276 |
return self.original_display
|
| 277 |
-
|
| 278 |
def save_results(self):
|
| 279 |
"""
|
| 280 |
Basic save function for raw results with improved error handling and logging
|
|
@@ -323,11 +323,13 @@ class DicomAnalyzer:
|
|
| 323 |
cell1 = ws[f"{formula_col}{row1}"]
|
| 324 |
cell1.value = formula1
|
| 325 |
cell1.font = red_font
|
|
|
|
| 326 |
|
| 327 |
formula2 = f"=({base_col}{row1}-{base_col}{row2})/{std_col}{row2}"
|
| 328 |
cell2 = ws[f"{formula_col}{row2}"]
|
| 329 |
cell2.value = formula2
|
| 330 |
cell2.font = red_font
|
|
|
|
| 331 |
|
| 332 |
logger.debug(f"Added formulas for rows {row1},{row2} in column {formula_col}")
|
| 333 |
except Exception as e:
|
|
@@ -343,9 +345,8 @@ class DicomAnalyzer:
|
|
| 343 |
red_font = openpyxl.styles.Font(color="FF0000")
|
| 344 |
center_alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 345 |
|
| 346 |
-
#Define headers
|
| 347 |
headers = ['Area', 'Mean', 'StdDev', 'Min', 'Max']
|
| 348 |
-
|
| 349 |
|
| 350 |
column_groups = [
|
| 351 |
('B', 'C', 'D', 'E', 'F'), ('H', 'I', 'J', 'K', 'L'),
|
|
@@ -356,14 +357,14 @@ class DicomAnalyzer:
|
|
| 356 |
('BJ', 'BK', 'BL', 'BM', 'BN'), ('BP', 'BQ', 'BR', 'BS', 'BT'),
|
| 357 |
('BV', 'BW', 'BX', 'BY', 'BZ')
|
| 358 |
]
|
|
|
|
| 359 |
# Add headers for each column group
|
| 360 |
for cols in column_groups:
|
| 361 |
for i, header in enumerate(headers):
|
| 362 |
cell = ws[f"{cols[i]}1"]
|
| 363 |
cell.value = header
|
| 364 |
-
cell.alignment = center_alignment
|
| 365 |
|
| 366 |
-
|
| 367 |
row_pairs = [
|
| 368 |
(2, 3), (5, 6), (8, 9), (11, 12), (14, 15),
|
| 369 |
(17, 18), (20, 21), (23, 24), (26, 27), (29, 30)
|
|
@@ -375,8 +376,8 @@ class DicomAnalyzer:
|
|
| 375 |
for i, size in enumerate(phantom_sizes):
|
| 376 |
header_cell = ws.cell(row=row_pairs[i][0]-1, column=1, value=size)
|
| 377 |
header_cell.font = red_font
|
| 378 |
-
header_cell.alignment = center_alignment
|
| 379 |
-
|
| 380 |
result_idx = 0
|
| 381 |
current_col_group = 0
|
| 382 |
current_row_pair = 0
|
|
@@ -405,12 +406,13 @@ class DicomAnalyzer:
|
|
| 405 |
current_col_group = 0
|
| 406 |
current_row_pair += 1
|
| 407 |
|
| 408 |
-
|
| 409 |
for cols in column_groups:
|
| 410 |
for col in cols:
|
| 411 |
-
for row in range(2, 31):
|
| 412 |
cell = ws[f"{col}{row}"]
|
| 413 |
-
cell.
|
|
|
|
| 414 |
|
| 415 |
wb.save(output_path)
|
| 416 |
return output_path, f"Results saved successfully ({result_idx} measurements)"
|
|
@@ -422,16 +424,20 @@ class DicomAnalyzer:
|
|
| 422 |
def _write_result_to_cells(self, ws, result, cols, row):
|
| 423 |
"""Helper method to write a single result to worksheet cells"""
|
| 424 |
center_alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
|
| 433 |
-
|
| 434 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 435 |
|
| 436 |
def format_results(self):
|
| 437 |
if not self.results:
|
|
@@ -470,7 +476,6 @@ class DicomAnalyzer:
|
|
| 470 |
self.marks.pop()
|
| 471 |
return self.update_display(), self.format_results()
|
| 472 |
|
| 473 |
-
# Interface creation and main execution will be in the next part...
|
| 474 |
def create_interface():
|
| 475 |
print("Creating interface...")
|
| 476 |
analyzer = DicomAnalyzer()
|
|
|
|
| 152 |
except Exception as e:
|
| 153 |
print(f"Error handling keyboard input: {str(e)}")
|
| 154 |
return self.display_image
|
| 155 |
+
|
| 156 |
def analyze_roi(self, evt: gr.SelectData):
|
| 157 |
try:
|
| 158 |
if self.current_image is None:
|
|
|
|
| 275 |
except Exception as e:
|
| 276 |
print(f"Error updating display: {str(e)}")
|
| 277 |
return self.original_display
|
|
|
|
| 278 |
def save_results(self):
|
| 279 |
"""
|
| 280 |
Basic save function for raw results with improved error handling and logging
|
|
|
|
| 323 |
cell1 = ws[f"{formula_col}{row1}"]
|
| 324 |
cell1.value = formula1
|
| 325 |
cell1.font = red_font
|
| 326 |
+
cell1.alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 327 |
|
| 328 |
formula2 = f"=({base_col}{row1}-{base_col}{row2})/{std_col}{row2}"
|
| 329 |
cell2 = ws[f"{formula_col}{row2}"]
|
| 330 |
cell2.value = formula2
|
| 331 |
cell2.font = red_font
|
| 332 |
+
cell2.alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 333 |
|
| 334 |
logger.debug(f"Added formulas for rows {row1},{row2} in column {formula_col}")
|
| 335 |
except Exception as e:
|
|
|
|
| 345 |
red_font = openpyxl.styles.Font(color="FF0000")
|
| 346 |
center_alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 347 |
|
| 348 |
+
# Define headers
|
| 349 |
headers = ['Area', 'Mean', 'StdDev', 'Min', 'Max']
|
|
|
|
| 350 |
|
| 351 |
column_groups = [
|
| 352 |
('B', 'C', 'D', 'E', 'F'), ('H', 'I', 'J', 'K', 'L'),
|
|
|
|
| 357 |
('BJ', 'BK', 'BL', 'BM', 'BN'), ('BP', 'BQ', 'BR', 'BS', 'BT'),
|
| 358 |
('BV', 'BW', 'BX', 'BY', 'BZ')
|
| 359 |
]
|
| 360 |
+
|
| 361 |
# Add headers for each column group
|
| 362 |
for cols in column_groups:
|
| 363 |
for i, header in enumerate(headers):
|
| 364 |
cell = ws[f"{cols[i]}1"]
|
| 365 |
cell.value = header
|
| 366 |
+
cell.alignment = center_alignment
|
| 367 |
|
|
|
|
| 368 |
row_pairs = [
|
| 369 |
(2, 3), (5, 6), (8, 9), (11, 12), (14, 15),
|
| 370 |
(17, 18), (20, 21), (23, 24), (26, 27), (29, 30)
|
|
|
|
| 376 |
for i, size in enumerate(phantom_sizes):
|
| 377 |
header_cell = ws.cell(row=row_pairs[i][0]-1, column=1, value=size)
|
| 378 |
header_cell.font = red_font
|
| 379 |
+
header_cell.alignment = center_alignment
|
| 380 |
+
|
| 381 |
result_idx = 0
|
| 382 |
current_col_group = 0
|
| 383 |
current_row_pair = 0
|
|
|
|
| 406 |
current_col_group = 0
|
| 407 |
current_row_pair += 1
|
| 408 |
|
| 409 |
+
# Center align all data cells
|
| 410 |
for cols in column_groups:
|
| 411 |
for col in cols:
|
| 412 |
+
for row in range(2, 31):
|
| 413 |
cell = ws[f"{col}{row}"]
|
| 414 |
+
if cell.value is not None:
|
| 415 |
+
cell.alignment = center_alignment
|
| 416 |
|
| 417 |
wb.save(output_path)
|
| 418 |
return output_path, f"Results saved successfully ({result_idx} measurements)"
|
|
|
|
| 424 |
def _write_result_to_cells(self, ws, result, cols, row):
|
| 425 |
"""Helper method to write a single result to worksheet cells"""
|
| 426 |
center_alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 427 |
+
|
| 428 |
+
# Map the headers to the result keys
|
| 429 |
+
value_mapping = {
|
| 430 |
+
'Area': 'Area (mm²)',
|
| 431 |
+
'Mean': 'Mean',
|
| 432 |
+
'StdDev': 'StdDev',
|
| 433 |
+
'Min': 'Min',
|
| 434 |
+
'Max': 'Max'
|
| 435 |
+
}
|
| 436 |
+
|
| 437 |
+
for i, (header, key) in enumerate(value_mapping.items()):
|
| 438 |
+
cell = ws[f"{cols[i]}{row}"]
|
| 439 |
+
cell.value = float(result[key])
|
| 440 |
+
cell.alignment = center_alignment
|
| 441 |
|
| 442 |
def format_results(self):
|
| 443 |
if not self.results:
|
|
|
|
| 476 |
self.marks.pop()
|
| 477 |
return self.update_display(), self.format_results()
|
| 478 |
|
|
|
|
| 479 |
def create_interface():
|
| 480 |
print("Creating interface...")
|
| 481 |
analyzer = DicomAnalyzer()
|