Update app.py
Browse files
app.py
CHANGED
|
@@ -325,8 +325,8 @@ class DicomAnalyzer:
|
|
| 325 |
cell1.font = red_font
|
| 326 |
cell1.alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 327 |
|
| 328 |
-
# CNR Formula for second row
|
| 329 |
-
formula2 = f"=IF(OR({std_col}{row2}=0,{base_col}{row1}=0,{base_col}{row2}=0),
|
| 330 |
cell2 = ws[f"{formula_col}{row2}"]
|
| 331 |
cell2.value = formula2
|
| 332 |
cell2.font = red_font
|
|
@@ -456,35 +456,34 @@ class DicomAnalyzer:
|
|
| 456 |
# Calculate CNR averages for each row pair
|
| 457 |
for i, size in enumerate(phantom_sizes):
|
| 458 |
row_number = row_pairs[i][1] # Second row for CNR
|
| 459 |
-
|
| 460 |
|
| 461 |
-
# Get all CNR formula references
|
| 462 |
for cols in column_groups:
|
| 463 |
formula_col = get_column_letter(column_index_from_string(cols[-1]) + 1)
|
| 464 |
-
|
|
|
|
| 465 |
|
| 466 |
-
# Check if the
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
| 470 |
-
stddev2 = ws[f"{cols[2]}{row_pairs[i][1]}"].value # Second row StdDev
|
| 471 |
|
| 472 |
-
# Only add to references if values are valid
|
| 473 |
if (mean1 not in [0, None, ''] and
|
| 474 |
mean2 not in [0, None, ''] and
|
| 475 |
-
|
| 476 |
-
|
| 477 |
|
| 478 |
-
|
| 479 |
-
|
| 480 |
-
|
| 481 |
-
|
| 482 |
-
|
| 483 |
-
|
| 484 |
-
|
| 485 |
-
|
|
|
|
| 486 |
avg_cell.number_format = '0.000'
|
| 487 |
-
|
| 488 |
|
| 489 |
current_row += 1
|
| 490 |
|
|
@@ -517,7 +516,7 @@ class DicomAnalyzer:
|
|
| 517 |
|
| 518 |
for i, (header, key) in enumerate(value_mapping.items()):
|
| 519 |
cell = ws[f"{cols[i]}{row}"]
|
| 520 |
-
cell.value = float(result[key])
|
| 521 |
cell.alignment = center_alignment
|
| 522 |
|
| 523 |
def format_results(self):
|
|
|
|
| 325 |
cell1.font = red_font
|
| 326 |
cell1.alignment = openpyxl.styles.Alignment(horizontal='center')
|
| 327 |
|
| 328 |
+
# CNR Formula for second row with zero handling
|
| 329 |
+
formula2 = f"=IF(OR({std_col}{row2}=0,{base_col}{row1}=0,{base_col}{row2}=0),\"\",({base_col}{row1}-{base_col}{row2})/{std_col}{row2})"
|
| 330 |
cell2 = ws[f"{formula_col}{row2}"]
|
| 331 |
cell2.value = formula2
|
| 332 |
cell2.font = red_font
|
|
|
|
| 456 |
# Calculate CNR averages for each row pair
|
| 457 |
for i, size in enumerate(phantom_sizes):
|
| 458 |
row_number = row_pairs[i][1] # Second row for CNR
|
| 459 |
+
valid_cnr_refs = []
|
| 460 |
|
|
|
|
| 461 |
for cols in column_groups:
|
| 462 |
formula_col = get_column_letter(column_index_from_string(cols[-1]) + 1)
|
| 463 |
+
mean_col = cols[1]
|
| 464 |
+
std_col = cols[2]
|
| 465 |
|
| 466 |
+
# Check if the values used in CNR calculation are valid
|
| 467 |
+
mean1 = ws[f"{mean_col}{row_pairs[i][0]}"].value
|
| 468 |
+
mean2 = ws[f"{mean_col}{row_pairs[i][1]}"].value
|
| 469 |
+
std2 = ws[f"{std_col}{row_pairs[i][1]}"].value
|
|
|
|
| 470 |
|
|
|
|
| 471 |
if (mean1 not in [0, None, ''] and
|
| 472 |
mean2 not in [0, None, ''] and
|
| 473 |
+
std2 not in [0, None, '']):
|
| 474 |
+
valid_cnr_refs.append(f"{formula_col}{row_number}")
|
| 475 |
|
| 476 |
+
# Add row to the averages table
|
| 477 |
+
size_cell = ws.cell(row=current_row, column=1, value=size)
|
| 478 |
+
size_cell.alignment = center_alignment
|
| 479 |
+
|
| 480 |
+
avg_cell = ws.cell(row=current_row, column=2)
|
| 481 |
+
if valid_cnr_refs:
|
| 482 |
+
# Create average formula that ignores blank cells
|
| 483 |
+
refs = ",".join(valid_cnr_refs)
|
| 484 |
+
avg_cell.value = f'=AVERAGE(IF(LEN({refs})>0,{refs}))'
|
| 485 |
avg_cell.number_format = '0.000'
|
| 486 |
+
avg_cell.alignment = center_alignment
|
| 487 |
|
| 488 |
current_row += 1
|
| 489 |
|
|
|
|
| 516 |
|
| 517 |
for i, (header, key) in enumerate(value_mapping.items()):
|
| 518 |
cell = ws[f"{cols[i]}{row}"]
|
| 519 |
+
cell.value = float(result[key]) if result[key] != '' else ''
|
| 520 |
cell.alignment = center_alignment
|
| 521 |
|
| 522 |
def format_results(self):
|