Skip to content

Commit ab86af0

Browse files
authored
Merge pull request #125 from rjlopez2:remove_macrokit
Remove_macrokit
2 parents d363bb7 + 8b85efd commit ab86af0

File tree

3 files changed

+119
-101
lines changed

3 files changed

+119
-101
lines changed

setup.cfg

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ install_requires =
3636
superqt
3737
magicgui
3838
qtpy
39-
napari_macrokit
4039
opencv-python-headless
4140
sif_parser
4241
# sif_parser @ git+https://github.com/rjlopez2/sif_parser@multithreading_np_spool_open

src/napari_omaas/_widget.py

Lines changed: 92 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@
7272
optimap_mot_correction,
7373
crop_from_shape,
7474
concatenate_and_padd_with_nan_2d_arrays,
75-
macro,
7675
return_maps,
7776
apply_FIR_filt_func,
7877
gaussian_filter_nan,
@@ -1181,32 +1180,40 @@ def __init__(self, napari_viewer):
11811180

11821181
######## Macro record group ########
11831182
self._settings_layout.setAlignment(Qt.AlignTop)
1184-
self.macro_group = VHGroup('Record the scrips for analyis', orientation='G')
1185-
self._settings_layout.addWidget(self.macro_group.gbox)
1183+
self.processing_steps_group = VHGroup('Tracking analyis steps', orientation='G')
11861184

11871185
self.record_script_label = QLabel("Your current actions")
11881186
self.record_script_label.setToolTip('Display bellow the recorded set of actions of your processing pipeline.')
1189-
self.macro_group.glayout.addWidget(self.record_script_label, 1, 0, 1, 4)
1187+
self.processing_steps_group.glayout.addWidget(self.record_script_label, 1, 0, 1, 4)
11901188

1191-
self.macro_box_text = QPlainTextEdit()
1192-
self.macro_box_text.setStyleSheet("border: 1px solid black;")
1193-
self.macro_box_text.setPlaceholderText("###### Start doing operations to populate your macro ######")
1194-
self.macro_group.glayout.addWidget(self.macro_box_text, 2, 0, 1, 4)
1189+
self.processing_steps_tree = QTreeWidget()
1190+
self.processing_steps_tree.setColumnCount(2)
1191+
self.processing_steps_tree.setHeaderLabels(["Step ID", "Operation"])
1192+
# self.processing_steps_tree.setStyleSheet("border: 1px solid black;")
1193+
# self.processing_steps_tree.setPlaceholderText("###### Start doing operations to populate your macro ######")
1194+
self.processing_steps_group.glayout.addWidget(self.processing_steps_tree, 2, 0, 1, 4)
11951195

1196-
self.activate_macro_label = QLabel("Enable/disable Macro recording")
1197-
self.activate_macro_label.setToolTip('Set on if you want to keep track of the script for reproducibility or further reuse in batch processing')
1198-
self.macro_group.glayout.addWidget(self.activate_macro_label, 3, 0, 1, 1)
1196+
# self.activate_macro_label = QLabel("Enable/disable Macro recording")
1197+
# self.activate_macro_label.setToolTip('Set on if you want to keep track of the script for reproducibility or further reuse in batch processing')
1198+
# self.processing_steps_group.glayout.addWidget(self.activate_macro_label, 3, 0, 1, 1)
11991199

1200-
self.record_macro_check = QCheckBox()
1201-
self.record_macro_check.setChecked(True)
1202-
self.macro_group.glayout.addWidget(self.record_macro_check, 3, 1, 1, 1)
1200+
# self.record_macro_check = QCheckBox()
1201+
# self.record_macro_check.setChecked(True)
1202+
# self.processing_steps_group.glayout.addWidget(self.record_macro_check, 3, 1, 1, 1)
12031203

1204-
self.clear_last_step_macro_btn = QPushButton("Delete last step")
1205-
self.macro_group.glayout.addWidget(self.clear_last_step_macro_btn, 3, 2, 1, 1)
1204+
# self.clear_last_step_macro_btn = QPushButton("Delete last step")
1205+
# self.processing_steps_group.glayout.addWidget(self.clear_last_step_macro_btn, 3, 2, 1, 1)
12061206

1207-
self.clear_macro_btn = QPushButton("Clear Macro")
1208-
self.macro_group.glayout.addWidget(self.clear_macro_btn, 3, 3, 1, 1)
1207+
# self.clear_macro_btn = QPushButton("Clear Macro")
1208+
# self.processing_steps_group.glayout.addWidget(self.clear_macro_btn, 3, 3, 1, 1)
12091209

1210+
self.record_operations_label = QLabel("Record operations")
1211+
self.record_operations_label.setToolTip('Set on if you want to keep track of the processing steps and operations to be recorded and added to the meatadata.')
1212+
self.processing_steps_group.glayout.addWidget(self.record_operations_label, 3, 0, 1, 1)
1213+
1214+
self.record_metadata_check = QCheckBox()
1215+
self.record_metadata_check.setChecked(True)
1216+
self.processing_steps_group.glayout.addWidget(self.record_metadata_check, 3, 1, 1, 1)
12101217

12111218

12121219
self._APD_analysis_layout.addWidget(self.APD_plot_group.gbox)
@@ -1239,57 +1246,55 @@ def __init__(self, napari_viewer):
12391246
self.metadata_tree.setHeaderLabels(["Parameter", "Value"])
12401247
self.metadata_display_group.glayout.addWidget(self.metadata_tree, 0, 0, 1, 4)
12411248

1242-
self.record_operations_label = QLabel("Record operations")
1243-
self.record_operations_label.setToolTip('Set on if you want to keep track of the processing steps and operations to be recorded and added to the meatadata.')
1244-
self.metadata_display_group.glayout.addWidget(self.record_operations_label, 1, 0, 1, 1)
1245-
1246-
self.record_metadata_check = QCheckBox()
1247-
self.record_metadata_check.setChecked(True)
1248-
self.metadata_display_group.glayout.addWidget(self.record_metadata_check, 1, 1, 1, 1)
1249+
self.export_data_metadata_group = VHGroup('Export Data / Processing steps', orientation='G')
12491250

12501251
self.name_image_to_export_label = QLabel("Save Image as:")
1251-
self.metadata_display_group.glayout.addWidget(self.name_image_to_export_label, 2, 0, 1, 1)
1252+
self.export_data_metadata_group.glayout.addWidget(self.name_image_to_export_label, 0, 0, 1, 1)
12521253

12531254
self.name_image_to_export = QLineEdit()
12541255
self.name_image_to_export.setToolTip('Define name to save current selected image + metadata in .tiff format.')
12551256
self.name_image_to_export.setPlaceholderText("my_image")
1256-
self.metadata_display_group.glayout.addWidget(self.name_image_to_export, 2, 1, 1, 1)
1257+
self.export_data_metadata_group.glayout.addWidget(self.name_image_to_export, 0, 1, 1, 1)
12571258

1258-
self.name_procsteps_to_export_label = QLabel("Save Processing steps as:")
1259-
self.metadata_display_group.glayout.addWidget(self.name_procsteps_to_export_label, 2, 2, 1, 1)
1259+
self.name_procsteps_to_export_label = QLabel("Save Proc-steps as:")
1260+
self.export_data_metadata_group.glayout.addWidget(self.name_procsteps_to_export_label, 0, 2, 1, 1)
12601261

12611262
self.procsteps_file_name = QLineEdit()
12621263
self.procsteps_file_name.setToolTip('Define name to save processing steps of curremnt image in .yml format.')
12631264
self.procsteps_file_name.setPlaceholderText("ProcessingSteps")
1264-
self.metadata_display_group.glayout.addWidget(self.procsteps_file_name, 2, 3, 1, 1)
1265+
self.export_data_metadata_group.glayout.addWidget(self.procsteps_file_name, 0, 3, 1, 1)
12651266

1266-
1267-
1268-
1269-
self._save_img_dir_box_text_label = QLabel("To Directory")
1267+
self._save_img_dir_box_text_label = QLabel("To Directory:")
12701268
self._save_img_dir_box_text_label.setToolTip("Type the directory path or drag and drop folders here to change the current directory.")
1271-
self.metadata_display_group.glayout.addWidget(self._save_img_dir_box_text_label, 3, 0, 1, 1)
1269+
self.export_data_metadata_group.glayout.addWidget(self._save_img_dir_box_text_label, 1, 0, 1, 1)
12721270

12731271
self.save_img_dir_box_text = QLineEdit()
12741272
self.save_img_dir_box_text.installEventFilter(self)
12751273
self.save_img_dir_box_text.setAcceptDrops(True)
12761274
self.save_img_dir_box_text.setDragEnabled(True)
12771275
self.save_img_dir_box_text.setPlaceholderText(os.getcwd())
1278-
self.metadata_display_group.glayout.addWidget(self.save_img_dir_box_text, 3, 1, 1, 2)
1276+
self.export_data_metadata_group.glayout.addWidget(self.save_img_dir_box_text, 1, 1, 1, 2)
12791277

12801278
self.change_dir_to_save_img_btn = QPushButton("Change Directory")
1281-
self.metadata_display_group.glayout.addWidget(self.change_dir_to_save_img_btn, 3, 3, 1, 1)
1279+
self.export_data_metadata_group.glayout.addWidget(self.change_dir_to_save_img_btn, 1, 3, 1, 1)
12821280

12831281
self.export_image_btn = QPushButton("Export Image + metadata")
1284-
self.metadata_display_group.glayout.addWidget(self.export_image_btn, 4, 2, 1, 1)
1282+
self.export_data_metadata_group.glayout.addWidget(self.export_image_btn, 0, 4, 1, 1)
12851283

1286-
self.export_processing_steps_btn = QPushButton("Export processing steps")
1287-
self.metadata_display_group.glayout.addWidget(self.export_processing_steps_btn, 4, 3, 1, 1)
1284+
self.export_processing_steps_btn = QPushButton("Export Proc-steps")
1285+
self.export_data_metadata_group.glayout.addWidget(self.export_processing_steps_btn, 1, 4, 1, 1)
12881286
# self.layout().addWidget(self.metadata_display_group.gbox) # temporary silence hide the metadatda
12891287

12901288
# self._settings_layout.setAlignment(Qt.AlignTop)
12911289
# self.macro_group = VHGroup('Record the scrips for analyis', orientation='G')
1290+
1291+
1292+
1293+
1294+
12921295
self._settings_layout.addWidget(self.metadata_display_group.gbox)
1296+
self._settings_layout.addWidget(self.processing_steps_group.gbox)
1297+
self._settings_layout.addWidget(self.export_data_metadata_group.gbox)
12931298

12941299

12951300
######################
@@ -1391,8 +1396,6 @@ def __init__(self, napari_viewer):
13911396
self.clear_plot_APD_btn.clicked.connect(self._clear_APD_plot)
13921397
self.slider_APD_detection_threshold.valueChanged.connect(self._get_APD_thre_slider_vlaue_func)
13931398
self.slider_APD_detection_threshold_2.valueChanged.connect(self._get_APD_thre_slider_vlaue_func)
1394-
self.clear_macro_btn.clicked.connect(self._on_click_clear_macro_btn)
1395-
self.clear_last_step_macro_btn.clicked.connect(self._on_click_clear_last_step_macro_btn)
13961399
self.load_spool_dir_btn.clicked.connect(self._load_current_spool_dir_func)
13971400
self.search_spool_dir_btn.clicked.connect(self._search_and_load_spool_dir_func)
13981401
self.copy_APD_rslts_btn.clicked.connect(self._on_click_copy_APD_rslts_btn_func)
@@ -1473,7 +1476,7 @@ def _on_click_inv_data_btn(self):
14731476
)
14741477
print(f"{'*'*5} Applying '{invert_signal.__name__}' to image: '{current_selection}' {'*'*5} ")
14751478

1476-
self.add_record_fun()
1479+
14771480
else:
14781481
return warn(f"Select an Image layer to apply this function. \nThe selected layer: '{current_selection}' is of type: '{current_selection._type_string}'")
14791482
except Exception as e:
@@ -1522,7 +1525,7 @@ def _on_click_norm_data_btn(self):
15221525
parameters=parameters,
15231526
track_metadata=add_metadata,
15241527
)
1525-
self.add_record_fun()
1528+
15261529
print(f"{'*'*5} Applying normalization:'{type_of_normalization}' to image: '{current_selection}' {'*'*5} ")
15271530
except Exception as e:
15281531
raise CustomException(e, sys)
@@ -1569,7 +1572,7 @@ def _on_click_splt_chann(self):
15691572
custom_outputs=[curr_img_name + "_Ch0", curr_img_name + "_Ch1"],
15701573
parameters=params)
15711574

1572-
self.add_record_fun()
1575+
15731576
else:
15741577
warn(f"Select an Image layer to apply this function. \nThe selected layer: '{current_selection}' is of type: '{current_selection._type_string}'")
15751578

@@ -1758,7 +1761,7 @@ def _on_click_apply_spat_filt_btn(self):
17581761
"wind_size": kernel_size
17591762
}
17601763

1761-
self.add_record_fun()
1764+
17621765
self.add_result_img(result_img=results, operation_name="Saptial_filter", method_name=met_name, sufix= f"SpatFilt{filter_type[:4]}", parameters=params)
17631766
print(f"{'*'*5} Applying '{filter_type}' filter to image: '{current_selection}' {'*'*5} ")
17641767

@@ -2086,7 +2089,7 @@ def _get_ROI_selection_2_current_text(self, _): # We receive the index, but don'
20862089

20872090
# self.add_result_img(results, MotCorr_fp = foot_print, rs = radius_size, nw=n_warps)
20882091

2089-
# self.add_record_fun()
2092+
#
20902093

20912094

20922095
# else:
@@ -2146,7 +2149,7 @@ def _on_click_apply_temp_filt_btn(self):
21462149
"cutoff_freq": cutoff_freq_value,
21472150
}
21482151

2149-
self.add_record_fun()
2152+
21502153
print(f"{'*'*5} Applying '{filter_type}' filter to image: '{current_selection}' {'*'*5} ")
21512154
self.add_result_img(result_img=results, operation_name="Temporal_filter", method_name=met_name, sufix= f"TempFilt{filter_type[:4]}", parameters=params)
21522155

@@ -2246,6 +2249,25 @@ def _on_rename(name_event):
22462249
# self.viewer.layers.selection.active.metadata = self.img_metadata_dict
22472250
# self.viewer.layers.selection.active.metadata = self.viewer.layers.selection.active.metadata["shaped_metadata"][0] if "shaped_metadata" in self.viewer.layers.selection.active.metadata else self.img_metadata_dict
22482251
# self.viewer.layers.selection.active.metadata = self.img_metadata_dict["shaped_metadata"][0] if "shaped_metadata" in self.img_metadata_dict else self.img_metadata_dict
2252+
if "ProcessingSteps" in self.img_metadata_dict:
2253+
self.processing_steps_tree.clear()
2254+
# items = []
2255+
# for step in range(len(self.img_metadata_dict['ProcessingSteps'])):
2256+
# item = QTreeWidgetItem([str(step + 1), self.img_metadata_dict['ProcessingSteps'][step]['operation']])
2257+
# items.append(item)
2258+
# for key, values in self.img_metadata_dict['ProcessingSteps'][0].items():
2259+
# item = QTreeWidgetItem([key, str(values)])
2260+
# items.append(item)
2261+
# self.processing_steps_tree.insertTopLevelItems(0, items)
2262+
2263+
for item in self.img_metadata_dict['ProcessingSteps']:
2264+
parent_item = QTreeWidgetItem(self.processing_steps_tree, [str(item.get('id', 'No ID')), item.get('operation', 'No Operation')])
2265+
self.processing_steps_tree.addTopLevelItem(parent_item)
2266+
self.add_children_tree_widget(parent_item, item)
2267+
2268+
else:
2269+
self.processing_steps_tree.clear()
2270+
22492271
if "CycleTime" in self.img_metadata_dict:
22502272
# print(f"getting image: '{self.viewer.layers.selection.active.name}'")
22512273
self.metadata_tree.clear()
@@ -2285,6 +2307,7 @@ def _on_rename(name_event):
22852307
self.name_image_to_export.setText(None)
22862308
self.fps_val.setText("")
22872309
self.metadata_tree.clear()
2310+
self.processing_steps_tree.clear()
22882311
# self.x_scale_box.clear()
22892312
# self.x_scale_box.setText(f"{1}")
22902313
# self.xscale = 1
@@ -2435,7 +2458,7 @@ def _get_APD_call_back(self, event):
24352458
# self.APD_propert_table = QTableView()
24362459
self.APD_propert_table.setModel(model)
24372460

2438-
self.add_record_fun()
2461+
24392462
except Exception as e:
24402463
# warn(f"ERROR: Computing APD parameters fails witht error: {repr(e)}.")
24412464
raise CustomException(e, sys)
@@ -2489,20 +2512,6 @@ def _get_APD_thre_slider_vlaue_func(self, value):
24892512
print(CustomException(e, sys))
24902513
# print(f">>>>> this is a known error when computing peaks found while creating shapes interactively: '{e}'")
24912514

2492-
2493-
2494-
2495-
def _on_click_clear_macro_btn(self, event):
2496-
self.macro_box_text.clear()
2497-
macro.clear()
2498-
2499-
def add_record_fun(self):
2500-
self.macro_box_text.clear()
2501-
self.macro_box_text.insertPlainText(repr(macro))
2502-
2503-
def _on_click_clear_last_step_macro_btn(self):
2504-
macro.pop()
2505-
self.add_record_fun()
25062515

25072516
def _search_and_load_spool_dir_func(self, event=None):
25082517
self.spool_dir = QFileDialog.getExistingDirectory(self, "Select Spool Directory", self.dir_box_text.text())
@@ -3092,7 +3101,7 @@ def _on_click_create_average_AP_btn_func(self):
30923101
# print(f'computing "local_normal_fun" to image {current_selection}')
30933102
# results = local_normal_fun(current_selection.data)
30943103
# self.add_result_img(result_img=results, single_label_sufix="LocNor", add_to_metadata = "Local_norm_signal")
3095-
# self.add_record_fun()
3104+
#
30963105

30973106

30983107
# assert that you have content in the canvas
@@ -3126,7 +3135,7 @@ def _on_click_create_average_AP_btn_func(self):
31263135
method_name=split_AP_traces_and_ave_func.__name__,
31273136
sufix="AveAP", parameters=params)
31283137
print(f"{'*'*5} Average from image: '{current_img_selected.name,}' created {'*'*5}")
3129-
self.add_record_fun()
3138+
31303139

31313140
elif len(ini_i) == 1:
31323141
return warn(f"Only {len(ini_i)} AP detected. No average computed.")
@@ -3421,7 +3430,7 @@ def _on_click_make_maps_btn_func(self):
34213430
sufix=sufix, parameters=params)
34223431

34233432

3424-
self.add_record_fun()
3433+
34253434
print("Map generated")
34263435
# else:
34273436
# return warn("Either non or more than 1 AP detected. Please average your traces, clip 1 AP or make sure you have at least one AP detected by changing the 'Sensitivity threshold'.")
@@ -3838,7 +3847,7 @@ def _on_click_apply_segmentation_btn_fun(self, return_result_as_layer = True, re
38383847

38393848

38403849

3841-
self.add_record_fun()
3850+
38423851

38433852
except Exception as e:
38443853
raise CustomException(e, sys)
@@ -4002,7 +4011,7 @@ def _on_click_clip_trace_btn_func(self):
40024011
operation_name= "clip_image",
40034012
method_name="indexing",
40044013
sufix="Clip", parameters=params)
4005-
# self.add_record_fun()
4014+
#
40064015
self.is_range_clicked_checkbox.setChecked(False)
40074016
self.plot_profile_btn.setChecked(False)
40084017
self.listImagewidget.clearSelection()
@@ -4168,7 +4177,7 @@ def _apply_optimap_mot_corr_btn_func(self):
41684177
sufix="MotStab",
41694178
parameters=params)
41704179

4171-
self.add_record_fun()
4180+
41724181

41734182
else:
41744183

@@ -4233,7 +4242,7 @@ def _on_click_crop_from_shape_btn_func(self):
42334242

42344243
self.rotate_l_crop.setChecked(False)
42354244
self.rotate_r_crop.setChecked(False)
4236-
self.add_record_fun()
4245+
42374246
print(f"image '{img_name}' cropped")
42384247
# return
42394248

@@ -4459,6 +4468,19 @@ def _join_all_views_and_rotate_btn_func(self):
44594468
sufix="Join",
44604469
parameters=None)
44614470
print("lalala")
4471+
4472+
def add_children_tree_widget(self, parent, dictionary):
4473+
"""Recursively add children to tree items."""
4474+
if isinstance(dictionary, dict):
4475+
for key, value in dictionary.items():
4476+
child = QTreeWidgetItem(parent, [str(key), str(value) if not isinstance(value, (dict, list)) else ""])
4477+
parent.addChild(child)
4478+
self.add_children_tree_widget(child, value) # Recursive call
4479+
elif isinstance(dictionary, list):
4480+
for i, item in enumerate(dictionary):
4481+
child = QTreeWidgetItem(parent, [f"Item {i}", str(item) if not isinstance(item, (dict, list)) else ""])
4482+
parent.addChild(child)
4483+
self.add_children_tree_widget(child, item)
44624484

44634485

44644486

0 commit comments

Comments
 (0)