HeshamAI commited on
Commit
eef4896
·
verified ·
1 Parent(s): 9909975

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +58 -39
app.py CHANGED
@@ -98,7 +98,6 @@ class DicomAnalyzer:
98
  except Exception as e:
99
  print(f"Error loading DICOM file: {str(e)}")
100
  return None, f"Error loading DICOM file: {str(e)}"
101
-
102
  def normalize_image(self, image):
103
  try:
104
  normalized = cv2.normalize(
@@ -275,49 +274,14 @@ class DicomAnalyzer:
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
281
- """
282
- try:
283
- if not self.results:
284
- logger.warning("Attempted to save with no results")
285
- return None, "No results to save"
286
-
287
- df = pd.DataFrame(self.results)
288
- columns_order = ['Area (mm²)', 'Mean', 'StdDev', 'Min', 'Max', 'Point']
289
- df = df[columns_order]
290
-
291
- timestamp = time.strftime("%Y%m%d_%H%M%S")
292
- output_file = f"analysis_results_{timestamp}.xlsx"
293
-
294
- with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
295
- df.to_excel(writer, index=False, sheet_name='Results')
296
-
297
- worksheet = writer.sheets['Results']
298
- for idx, col in enumerate(df.columns):
299
- max_length = max(
300
- df[col].astype(str).apply(len).max(),
301
- len(str(col))
302
- ) + 2
303
- worksheet.column_dimensions[get_column_letter(idx + 1)].width = max_length
304
-
305
- logger.info(f"Results saved successfully to {output_file}")
306
- return output_file, f"Results saved successfully to {output_file}"
307
-
308
- except Exception as e:
309
- error_msg = f"Error saving results: {str(e)}"
310
- logger.error(error_msg)
311
- logger.error(traceback.format_exc())
312
- return None, error_msg
313
-
314
  def add_formulas_to_template(self, ws, row_pair, col_group, red_font):
315
  try:
316
- base_col = col_group[1]
317
- std_col = col_group[2]
318
 
319
  row1, row2 = row_pair
320
 
 
321
  formula1 = f"={base_col}{row1}/{std_col}{row1}"
322
  formula_col = get_column_letter(column_index_from_string(col_group[-1]) + 1)
323
  cell1 = ws[f"{formula_col}{row1}"]
@@ -325,6 +289,7 @@ class DicomAnalyzer:
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
@@ -414,6 +379,60 @@ class DicomAnalyzer:
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)"
419
 
 
98
  except Exception as e:
99
  print(f"Error loading DICOM file: {str(e)}")
100
  return None, f"Error loading DICOM file: {str(e)}"
 
101
  def normalize_image(self, image):
102
  try:
103
  normalized = cv2.normalize(
 
274
  except Exception as e:
275
  print(f"Error updating display: {str(e)}")
276
  return self.original_display
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
277
  def add_formulas_to_template(self, ws, row_pair, col_group, red_font):
278
  try:
279
+ base_col = col_group[1] # Mean column
280
+ std_col = col_group[2] # StdDev column
281
 
282
  row1, row2 = row_pair
283
 
284
+ # SNR Formula for first row
285
  formula1 = f"={base_col}{row1}/{std_col}{row1}"
286
  formula_col = get_column_letter(column_index_from_string(col_group[-1]) + 1)
287
  cell1 = ws[f"{formula_col}{row1}"]
 
289
  cell1.font = red_font
290
  cell1.alignment = openpyxl.styles.Alignment(horizontal='center')
291
 
292
+ # CNR Formula for second row
293
  formula2 = f"=({base_col}{row1}-{base_col}{row2})/{std_col}{row2}"
294
  cell2 = ws[f"{formula_col}{row2}"]
295
  cell2.value = formula2
 
379
  if cell.value is not None:
380
  cell.alignment = center_alignment
381
 
382
+ # Add space before averages tables
383
+ current_row = 32
384
+
385
+ # Headers for StdDev Averages
386
+ ws.cell(row=current_row, column=1, value="StdDev Averages").font = red_font
387
+ current_row += 1
388
+
389
+ # Calculate StdDev averages for each row pair
390
+ for i, size in enumerate(phantom_sizes):
391
+ row_number = row_pairs[i][0] # First row only
392
+ stddev_values = []
393
+
394
+ for cols in column_groups:
395
+ stddev_col = cols[2] # StdDev column
396
+ cell_value = ws[f"{stddev_col}{row_number}"].value
397
+ if cell_value not in [0, None, '']: # Ignore zeros and empty values
398
+ stddev_values.append(float(cell_value))
399
+
400
+ if stddev_values:
401
+ avg = sum(stddev_values) / len(stddev_values)
402
+ ws.cell(row=current_row, column=1, value=size)
403
+ ws.cell(row=current_row, column=2, value=avg).number_format = '0.000'
404
+ current_row += 1
405
+
406
+ current_row += 2 # Space between tables
407
+
408
+ # Headers for CNR Averages
409
+ ws.cell(row=current_row, column=1, value="CNR Averages").font = red_font
410
+ current_row += 1
411
+
412
+ # Calculate CNR averages for each row pair
413
+ for i, size in enumerate(phantom_sizes):
414
+ row_number = row_pairs[i][1] # Second row for CNR
415
+ cnr_values = []
416
+
417
+ for cols in column_groups:
418
+ formula_col = get_column_letter(column_index_from_string(cols[-1]) + 1)
419
+ cell_value = ws[f"{formula_col}{row_number}"].value
420
+ if isinstance(cell_value, str) and cell_value.startswith('='):
421
+ cnr_values.append(f"={formula_col}{row_number}")
422
+
423
+ if cnr_values:
424
+ formula = f"=AVERAGE({','.join(cnr_values)})"
425
+ ws.cell(row=current_row, column=1, value=size)
426
+ cell = ws.cell(row=current_row, column=2, value=formula)
427
+ cell.number_format = '0.000'
428
+ current_row += 1
429
+
430
+ # Format the tables
431
+ for row in range(32, current_row):
432
+ for col in range(1, 3):
433
+ cell = ws.cell(row=row, column=col)
434
+ cell.alignment = center_alignment
435
+
436
  wb.save(output_path)
437
  return output_path, f"Results saved successfully ({result_idx} measurements)"
438