From cb66195e2597506a4e7ccf113b7de8267fc63005 Mon Sep 17 00:00:00 2001 From: himesb Date: Wed, 10 Sep 2025 11:34:17 -0400 Subject: [PATCH 1/3] - change workspace to full path (instead of code . , open with devcontainer open) - Add this to the run container to ensure GDB prints clickable paths in the devcontainer - RUN echo "set filename-display basename" > /home/cisTEMdev/.gdbinit - Fixes state tracking by forcing refresh on TM switch - Opted to do this by calling DirtyEverthing in MainFrame switch workflow method - Pros: centralized and easy - Cons: forces a refresh across the GUI, but performance not likely a problem given infrequency of swiching. - Alternative: We could make all new panels dirty their own on construction if they have their main frame pointer - When loading the project the DB select was still returning empty. - Added a warning and set default. - It would be better to figure out why this happens, but will see if there is observable behavior later - When loading the project, the TM results are not being set because we default to SPA mode - Move the TM results to the results panel and that fixes things. - Remove stale methods to Set workflows in Mainframe.h --- .../CistemDev/workspace.code-workspace | 2 +- scripts/containers/top_image/Dockerfile | 3 +- src/gui/MainFrame.cpp | 32 +++++++++++++------ src/gui/MainFrame.h | 2 -- src/gui/workflows/SpaWorkflow.h | 2 +- src/gui/workflows/TmWorkflow.h | 2 -- src/programs/projectx/projectx.cpp | 24 +++++++------- 7 files changed, 39 insertions(+), 28 deletions(-) diff --git a/.vscode_shared/CistemDev/workspace.code-workspace b/.vscode_shared/CistemDev/workspace.code-workspace index c9caa098e..101e061a0 100644 --- a/.vscode_shared/CistemDev/workspace.code-workspace +++ b/.vscode_shared/CistemDev/workspace.code-workspace @@ -1,7 +1,7 @@ { "folders": [ { - "path": "../" + "path": "/workspaces/CistemDev" } ], "settings": { diff --git a/scripts/containers/top_image/Dockerfile b/scripts/containers/top_image/Dockerfile index 4321e2761..b7b859a0c 100644 --- a/scripts/containers/top_image/Dockerfile +++ b/scripts/containers/top_image/Dockerfile @@ -65,8 +65,7 @@ RUN if [[ "x${build_type}" != "xstatic" ]]; then echo "export LD_RUN_PATH=/opt/l # RUN ls /usr/local/cuda/lib64/lib*_static.a | grep -v cufft_static.a | while read a; do rm -rf /usr/local/cuda/lib64/$(basename $a); done && \ # rm -rf /usr/local/cuda/lib64/libcufft_static_nocallback.a - +RUN echo "set filename-display basename" > /home/cisTEMdev/.gdbinit USER cisTEMdev WORKDIR /home/cisTEMdev - diff --git a/src/gui/MainFrame.cpp b/src/gui/MainFrame.cpp index 9817f6873..2aaeff294 100644 --- a/src/gui/MainFrame.cpp +++ b/src/gui/MainFrame.cpp @@ -273,6 +273,7 @@ void MyMainFrame::ResetAllPanels( ) { picking_results_panel->Clear( ); refine2d_results_panel->Clear( ); refinement_results_panel->Clear( ); + match_template_results_panel->Clear( ); align_movies_panel->Reset( ); findctf_panel->Reset( ); @@ -285,7 +286,6 @@ void MyMainFrame::ResetAllPanels( ) { generate_3d_panel->Reset( ); sharpen_3d_panel->Reset( ); match_template_panel->Reset( ); - match_template_results_panel->Clear( ); refine_template_panel->Reset( ); DirtyEverything( ); @@ -338,9 +338,8 @@ void MyMainFrame::DirtyImageGroups( ) { picking_results_panel->group_combo_is_dirty = true; if ( current_workflow == "Template Matching" ) { - match_template_panel->group_combo_is_dirty = true; - match_template_results_panel->group_combo_is_dirty = true; - refine_template_panel->group_combo_is_dirty = true; + match_template_panel->group_combo_is_dirty = true; + refine_template_panel->group_combo_is_dirty = true; } } @@ -366,10 +365,11 @@ void MyMainFrame::DirtyTemplateMatchesPackages( ) { } void MyMainFrame::DirtyRefinements( ) { - refine_3d_panel->input_params_combo_is_dirty = true; - refine_ctf_panel->input_params_combo_is_dirty = true; - refinement_results_panel->input_params_are_dirty = true; - generate_3d_panel->input_params_combo_is_dirty = true; + refine_3d_panel->input_params_combo_is_dirty = true; + refine_ctf_panel->input_params_combo_is_dirty = true; + refinement_results_panel->input_params_are_dirty = true; + generate_3d_panel->input_params_combo_is_dirty = true; + match_template_results_panel->group_combo_is_dirty = true; } void MyMainFrame::DirtyClassifications( ) { @@ -695,8 +695,10 @@ void MyMainFrame::OpenProject(wxString project_filename) { // current_project.database.AddCTFIcinessColumnIfNecessary(); my_dialog->Update(8, "Opening project (loading Match Template Results...)"); + // If this is in the if block, then by default it will never get filled as we default to Single Particle + match_template_results_panel->FillBasedOnSelectCommand("SELECT DISTINCT IMAGE_ASSET_ID FROM TEMPLATE_MATCH_LIST"); + if ( current_workflow == "Template Matching" ) { - match_template_results_panel->FillBasedOnSelectCommand("SELECT DISTINCT IMAGE_ASSET_ID FROM TEMPLATE_MATCH_LIST"); my_dialog->Update(9, "Opening project (loading atomic coordinates assets...)"); atomic_coordinates_asset_panel->ImportAllFromDatabase( ); my_dialog->Update(10, "Opening project (loading Template Matches Packages...)"); @@ -739,6 +741,12 @@ void MyMainFrame::OpenProject(wxString project_filename) { } else { current_workflow = current_project.database.ReturnSingleStringFromSelectCommand("select CURRENT_WORKFLOW from MASTER_SETTINGS"); + // FIXME: this should never execute, but if somehow current_workflow is empty, log that it was and set a default. + // This is a bandaid on something that is otherwise broken (we aren't storing the workflow somewhere properly) + if ( current_workflow.IsEmpty( ) ) { + wxLogWarning("The current workflow returned empty from the database call; returning Single Particle as default to prevent errors."); + current_workflow = "Single Particle"; + } } current_project.database.RecordCurrentWorkflowInDB(current_workflow); SwitchWorkflowPanels(current_workflow); @@ -978,6 +986,12 @@ void MyMainFrame::SwitchWorkflowPanels(const wxString& workflow_name) { actions_panel->Layout( ); MenuBook->Layout( ); Layout( ); + + // After creating the new panels, ensure they have correct dirty state + if ( current_project.is_open ) { + DirtyEverything( ); // This will set all panels to dirty state + } + Thaw( ); } diff --git a/src/gui/MainFrame.h b/src/gui/MainFrame.h index bd9c7aaca..d14420f5f 100644 --- a/src/gui/MainFrame.h +++ b/src/gui/MainFrame.h @@ -102,8 +102,6 @@ class MyMainFrame : public MainFrame, public SocketCommunicator, public UpdatePr template void UpdateWorkflow(FrameTypeFrom* input_frame, FrameTypeTo* output_frame, wxString frame_name); - void SetSingleParticleWorkflow(bool triggered_by_gui_event = false); - void SetTemplateMatchingWorkflow(bool triggered_by_gui_event = false); void SwitchWorkflowPanels(const wxString& workflow_name); inline void ManuallyUpdateWorkflowMenuCheckBox( ) { diff --git a/src/gui/workflows/SpaWorkflow.h b/src/gui/workflows/SpaWorkflow.h index 73322c2cd..28997cf8d 100644 --- a/src/gui/workflows/SpaWorkflow.h +++ b/src/gui/workflows/SpaWorkflow.h @@ -63,7 +63,7 @@ struct SpaWorkflowRegister { actions_panel->ActionsBook->AddPage(generate_3d_panel, "Generate 3D", false, 8); actions_panel->ActionsBook->AddPage(sharpen_3d_panel, "Sharpen 3D", false, 9); - return actions_panel; + return actions_panel; }; // TODO: define a results panel function as well WorkflowRegistry::Instance( ).RegisterWorkflow(def); diff --git a/src/gui/workflows/TmWorkflow.h b/src/gui/workflows/TmWorkflow.h index 25a44ea3c..16afba4a6 100644 --- a/src/gui/workflows/TmWorkflow.h +++ b/src/gui/workflows/TmWorkflow.h @@ -35,7 +35,6 @@ struct TmWorkflowRegister { actions_panel = static_cast(actions_panel_tm); align_movies_panel = new MyAlignMoviesPanel(actions_panel->ActionsBook); findctf_panel = new MyFindCTFPanel(actions_panel->ActionsBook); - match_template_results_panel = new MatchTemplateResultsPanel(actions_panel->ActionsBook); match_template_panel = new MatchTemplatePanel(actions_panel->ActionsBook); refine_template_panel = new RefineTemplatePanel(actions_panel->ActionsBook); generate_3d_panel = new Generate3DPanel(actions_panel->ActionsBook); @@ -49,7 +48,6 @@ struct TmWorkflowRegister { actions_panel->ActionsBook->AddPage(findctf_panel, "Find CTF", false, 1); actions_panel->ActionsBook->AddPage(match_template_panel, "Match Templates", false, 2); actions_panel->ActionsBook->AddPage(refine_template_panel, "Refine Template", false, 3); - actions_panel->ActionsBook->AddPage(match_template_results_panel, "MT Results", false, 2); actions_panel->ActionsBook->AddPage(generate_3d_panel, "Generate 3D", false, 4); actions_panel->ActionsBook->AddPage(sharpen_3d_panel, "Sharpen 3D", false, 5); diff --git a/src/programs/projectx/projectx.cpp b/src/programs/projectx/projectx.cpp index 250cf47d4..9ea12801f 100644 --- a/src/programs/projectx/projectx.cpp +++ b/src/programs/projectx/projectx.cpp @@ -25,8 +25,8 @@ RefineCTFPanel* refine_ctf_panel; Generate3DPanel* generate_3d_panel; Sharpen3DPanel* sharpen_3d_panel; -MyOverviewPanel* overview_panel; -ActionsPanelParent* actions_panel; +MyOverviewPanel* overview_panel; +ActionsPanelParent* actions_panel; AssetsPanel* assets_panel; MyResultsPanel* results_panel; SettingsPanel* settings_panel; @@ -141,17 +141,18 @@ bool MyGuiApp::OnInit( ) { refinement_package_asset_panel = new MyRefinementPackageAssetPanel(assets_panel->AssetsBook); - // See src/gui/workflows/SpaWorkflow.h for instantiation of the SPA workflow panels + // See src/gui/workflows/SpaWorkflow.h for instantiation of the SPA workflow panels actions_panel = static_cast(WorkflowRegistry::Instance( ).CreateActionsPanel("Single Particle", main_frame->MenuBook)); - movie_results_panel = new MyMovieAlignResultsPanel(results_panel->ResultsBook); - ctf_results_panel = new MyFindCTFResultsPanel(results_panel->ResultsBook); - picking_results_panel = new MyPickingResultsPanel(results_panel->ResultsBook); - refine2d_results_panel = new Refine2DResultsPanel(results_panel->ResultsBook); - refinement_results_panel = new MyRefinementResultsPanel(results_panel->ResultsBook); + movie_results_panel = new MyMovieAlignResultsPanel(results_panel->ResultsBook); + ctf_results_panel = new MyFindCTFResultsPanel(results_panel->ResultsBook); + picking_results_panel = new MyPickingResultsPanel(results_panel->ResultsBook); + refine2d_results_panel = new Refine2DResultsPanel(results_panel->ResultsBook); + refinement_results_panel = new MyRefinementResultsPanel(results_panel->ResultsBook); + match_template_results_panel = new MatchTemplateResultsPanel(results_panel->ResultsBook); - // See src/gui/workflows/TmWorkflow.h for instantiation of Template Matching workflow panels. + // See src/gui/workflows/TmWorkflow.h for instantiation of Template Matching workflow panels. #ifdef EXPERIMENTAL refine_template_dev_panel = new RefineTemplateDevPanel(experimental_panel->ExperimentalBook); @@ -230,7 +231,7 @@ bool MyGuiApp::OnInit( ) { SettingsBookIconImages->Add(run_profiles_icon_bmp); - // See src/gui/workflows headers for assignment of wxImageList to Actions Panel + // See src/gui/workflows headers for assignment of wxImageList to Actions Panel main_frame->MenuBook->AssignImageList(MenuBookIconImages); assets_panel->AssetsBook->AssignImageList(AssetsBookIconImages); results_panel->ResultsBook->AssignImageList(ResultsBookIconImages); @@ -259,13 +260,14 @@ bool MyGuiApp::OnInit( ) { assets_panel->AssetsBook->AddPage(volume_asset_panel, "3D Volumes", false, 3); assets_panel->AssetsBook->AddPage(refinement_package_asset_panel, "Refine Pkgs.", false, 4); assets_panel->AssetsBook->AddPage(atomic_coordinates_asset_panel, "Atomic Coordinates", false, 5); - assets_panel->AssetsBook->AddPage(template_matches_package_asset_panel, "MT Pkgs.", false, 4); + assets_panel->AssetsBook->AddPage(template_matches_package_asset_panel, "TM Pkgs.", false, 4); // re-using icon FIXME results_panel->ResultsBook->AddPage(movie_results_panel, "Align Movies", true, 0); results_panel->ResultsBook->AddPage(ctf_results_panel, "Find CTF", false, 1); results_panel->ResultsBook->AddPage(picking_results_panel, "Find Particles", false, 2); results_panel->ResultsBook->AddPage(refine2d_results_panel, "2D Classify", false, 3); results_panel->ResultsBook->AddPage(refinement_results_panel, "3D Refinement", false, 4); + results_panel->ResultsBook->AddPage(match_template_results_panel, "TM Results", false, 2); // re-using icon FIXME settings_panel->SettingsBook->AddPage(run_profiles_panel, "Run Profiles", true, 0); From bb9269c1193a18df070dfa9c3d59b57cfcdf2a7e Mon Sep 17 00:00:00 2001 From: "B.A.Himes" Date: Wed, 10 Sep 2025 12:03:16 -0400 Subject: [PATCH 2/3] Update workspace path to cisTEM typo --- .vscode_shared/CistemDev/workspace.code-workspace | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode_shared/CistemDev/workspace.code-workspace b/.vscode_shared/CistemDev/workspace.code-workspace index 101e061a0..56000043f 100644 --- a/.vscode_shared/CistemDev/workspace.code-workspace +++ b/.vscode_shared/CistemDev/workspace.code-workspace @@ -1,7 +1,7 @@ { "folders": [ { - "path": "/workspaces/CistemDev" + "path": "/workspaces/cisTEM" } ], "settings": { From 38780ddfa47d4cbb2d664bf442ada237d40290ee Mon Sep 17 00:00:00 2001 From: "B.A.Himes" Date: Thu, 11 Sep 2025 21:15:56 -0400 Subject: [PATCH 3/3] fix devcontainer folder creation in regenerate_containers (must have auto completed at some point) --- regenerate_containers.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regenerate_containers.sh b/regenerate_containers.sh index d9da1db05..336c6a8b1 100755 --- a/regenerate_containers.sh +++ b/regenerate_containers.sh @@ -25,8 +25,8 @@ fi # somewhere near vscode 1.98 the devcontainers extension stopped recognizing softlinks to .devcontainer.json # this is acknowedged as a bug (https://github.com/microsoft/vscode-remote-release/issues/10536) # As a workaround we create a softlink to .devcontainer.json in the current directory -mkdir -p .devcontainer.json -cd .devcontainer.json +mkdir -p .devcontainer +cd .devcontainer if [[ ! -L .devcontainer.json ]] ; then ln -s ../.vscode/devcontainer.json .devcontainer.json fi