diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..b31998017 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,14 @@ +{ + "permissions": { + "allow": [ + "Bash(find:*)", + "Bash(git branch:*)", + "Bash(git show-branch:*)", + "Bash(git merge-base:*)", + "Bash(git ls-tree:*)", + "Bash(grep:*)" + ], + "deny": [], + "ask": [] + } +} \ No newline at end of file diff --git a/.github/workflows/check_formatting.yml b/.github/workflows/check_formatting.yml new file mode 100644 index 000000000..56113873b --- /dev/null +++ b/.github/workflows/check_formatting.yml @@ -0,0 +1,52 @@ +name: Check C++ Formatting + +on: + push: + branches: + - master + - '*_with_ci' + pull_request: + branches: master + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + check-format: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Check C++ formatting + uses: RafikFarhad/clang-format-github-action@v3 + with: + sources: "src/**/*.cpp,src/**/*.h,src/**/*.cc,src/**/*.cxx,src/**/*.hpp,src/**/*.cu,src/**/*.cuh" + excludes: "include/**/*,src/gui/wxformbuilder/**/*,src/gui/*ProjectX_gui*" + style: file + + # Build workflows - only run if formatting check passes + build-gpu-debug: + needs: check-format + uses: ./.github/workflows/debug_build.yml + + build-cpu-debug: + needs: check-format + uses: ./.github/workflows/debug_build_cpu_only.yml + + build-gpu-release: + needs: check-format + uses: ./.github/workflows/release_build.yml + + build-gpu-release-gnu-mkl: + needs: check-format + uses: ./.github/workflows/release_build_GNU_mkl.yml + + build-gpu-release-clang-mkl: + needs: check-format + uses: ./.github/workflows/release_build_clang_mkl.yml + + build-gpu-release-no-experimental: + needs: check-format + uses: ./.github/workflows/release_build_full_no_experimental.yml diff --git a/.github/workflows/debug_build.yml b/.github/workflows/debug_build.yml index bb82a0af3..c55f63b15 100644 --- a/.github/workflows/debug_build.yml +++ b/.github/workflows/debug_build.yml @@ -1,15 +1,10 @@ name: cisTEM GPU debug on: - push: - branches: - - master - - '*_with_ci' - pull_request: - branches: master + workflow_call: jobs: - run_build: + run_build: uses: ./.github/workflows/run_builds.yml with: build_type: "GPU_debug" diff --git a/.github/workflows/debug_build_cpu_only.yml b/.github/workflows/debug_build_cpu_only.yml index 296d81b75..cb06aae9e 100644 --- a/.github/workflows/debug_build_cpu_only.yml +++ b/.github/workflows/debug_build_cpu_only.yml @@ -1,15 +1,10 @@ name: cisTEM cpu debug on: - push: - branches: - - master - - '*_with_ci' - pull_request: - branches: master + workflow_call: jobs: - run_build: + run_build: uses: ./.github/workflows/run_builds.yml with: build_type: "cpu_debug" diff --git a/.github/workflows/release_build.yml b/.github/workflows/release_build.yml index 4ad108ec3..307c67fc1 100644 --- a/.github/workflows/release_build.yml +++ b/.github/workflows/release_build.yml @@ -1,12 +1,7 @@ name: cisTEM GPU release on: - push: - branches: - - master - - '*_with_ci' - pull_request: - branches: master + workflow_call: jobs: run_build: diff --git a/.github/workflows/release_build_GNU_mkl.yml b/.github/workflows/release_build_GNU_mkl.yml index c9290312d..9283614ff 100644 --- a/.github/workflows/release_build_GNU_mkl.yml +++ b/.github/workflows/release_build_GNU_mkl.yml @@ -1,12 +1,7 @@ name: cisTEM GPU release, GNU MKL on: - push: - branches: - - master - - '*_with_ci' - pull_request: - branches: master + workflow_call: jobs: run_build: diff --git a/.github/workflows/release_build_clang_mkl.yml b/.github/workflows/release_build_clang_mkl.yml index 462d48a95..d6b1b56a8 100644 --- a/.github/workflows/release_build_clang_mkl.yml +++ b/.github/workflows/release_build_clang_mkl.yml @@ -1,12 +1,7 @@ name: cisTEM GPU release, clang MKL on: - push: - branches: - - master - - '*_with_ci' - pull_request: - branches: master + workflow_call: jobs: run_build: diff --git a/.github/workflows/release_build_full_no_experimental.yml b/.github/workflows/release_build_full_no_experimental.yml index 9a92aa0b2..03740d93d 100644 --- a/.github/workflows/release_build_full_no_experimental.yml +++ b/.github/workflows/release_build_full_no_experimental.yml @@ -1,12 +1,7 @@ name: cisTEM GPU release no experimental full build on: - push: - branches: - - master - - '*_with_ci' - pull_request: - branches: master + workflow_call: jobs: run_build: diff --git a/.github/workflows/run_builds.yml b/.github/workflows/run_builds.yml index 7a7e0e45d..167b134be 100644 --- a/.github/workflows/run_builds.yml +++ b/.github/workflows/run_builds.yml @@ -47,7 +47,7 @@ jobs: fail-fast: true runs-on: ${{ inputs.runs_on_os }} container: - image: cistemdashorg/cistem_build_env:v2.2.1 + image: cistemdashorg/cistem_build_env:v2.2.2 options: --user root --rm # options: --user root --rm --gpus all outputs: diff --git a/.gitignore b/.gitignore index c059e7a62..6f0a501a4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ autom4te.cache -m4 +m4/* +!m4/ax_cuda.m4 +!m4/additional_programs.m4 +!m4/submodule_FastFFT.m4 +!m4/libtorch.m4 config.sub Makefile.in ltmain.sh @@ -33,4 +37,7 @@ configure~ *.tif *.dff __pycache__/ -include/Eigen \ No newline at end of file +include/Eigen + +.claude/cache/ +worktrees/ \ No newline at end of file diff --git a/.vscode_shared/BenHimes/workspace.code-workspace b/.vscode_shared/BenHimes/workspace.code-workspace index c9caa098e..08ac2af84 100644 --- a/.vscode_shared/BenHimes/workspace.code-workspace +++ b/.vscode_shared/BenHimes/workspace.code-workspace @@ -1,3 +1,4 @@ + { "folders": [ { diff --git a/.vscode_shared/CistemDev/CONTAINER_VERSION_BASE b/.vscode_shared/CistemDev/CONTAINER_VERSION_BASE index ac2cdeba0..ccbccc3dc 100644 --- a/.vscode_shared/CistemDev/CONTAINER_VERSION_BASE +++ b/.vscode_shared/CistemDev/CONTAINER_VERSION_BASE @@ -1 +1 @@ -2.1.3 +2.2.0 diff --git a/.vscode_shared/CistemDev/CONTAINER_VERSION_TOP b/.vscode_shared/CistemDev/CONTAINER_VERSION_TOP index c043eea77..b1b25a5ff 100644 --- a/.vscode_shared/CistemDev/CONTAINER_VERSION_TOP +++ b/.vscode_shared/CistemDev/CONTAINER_VERSION_TOP @@ -1 +1 @@ -2.2.1 +2.2.2 diff --git a/.vscode_shared/CistemDev/devcontainer.json b/.vscode_shared/CistemDev/devcontainer.json index eb1785473..54d36e6f1 100644 --- a/.vscode_shared/CistemDev/devcontainer.json +++ b/.vscode_shared/CistemDev/devcontainer.json @@ -1,6 +1,6 @@ { "name": "cisTEMdev-wxSTABLE-static12", - "image": "cistemdashorg/cistem_build_env:v2.2.1", + "image": "cistemdashorg/cistem_build_env:v2.2.2", "remoteUser": "cisTEMdev", "hostRequirements": { "gpu": "optional" diff --git a/.vscode_shared/CistemDev/settings.json b/.vscode_shared/CistemDev/settings.json index a62ce2fb7..796674da6 100644 --- a/.vscode_shared/CistemDev/settings.json +++ b/.vscode_shared/CistemDev/settings.json @@ -110,10 +110,11 @@ "DockerRun.DisableDockerrc": true, "html.format.endWithNewline": true, "editor.fontSize": 12, + "editor.inlineSuggest.minShowDelay": 2, "remote.extensionKind": { "github.copilot-chat": "ui" }, - "github.copilot.enable": { + "github.copilot.enable": { "*": true, "markdown": true, "scminput": false, @@ -126,6 +127,28 @@ "log": false, "matlab": true }, + "chat.tools.terminal.autoApprove": { + "mkdir": true, + "echo": true, + "/^git (status|show|log)\\b/": true, + "ls": true, + "cd": true, + "pwd": true, + "cat": true, + "grep": true, + "head": true, + "tail": true, + "find": true, + "date": true, + "whoami": true, + "df": true, + "du": true, + "cp": false, + "mv": false, + "rm": false, + "del": false, + "/dangerous/": false + }, "github.copilot.chat.codeGeneration.instructions": [], "github.copilot.chat.codeGeneration.useInstructionFiles": false } \ No newline at end of file diff --git a/.vscode_shared/CistemDev/tasks.json b/.vscode_shared/CistemDev/tasks.json index 6209dfeeb..b560c9f4d 100644 --- a/.vscode_shared/CistemDev/tasks.json +++ b/.vscode_shared/CistemDev/tasks.json @@ -6,7 +6,8 @@ "env": { "cuda_dir": "/usr/local/cuda", "build_dir": "${workspaceFolder}/build", - "common_flags": " --enable-experimental --enable-openmp --disable-build-all --enable-profiling", + // -diag-file-append makes Intel compiler show absolute paths in error messages for easier IDE navigation + "common_flags": "--enable-experimental --enable-openmp --disable-build-all --enable-profiling", "experimental_algo_flags": "--enable-fp16-particlestacks --disable-multiple-global-refinements", "common_optional_programs": "--enable-build-scale-with-mask --enable-build-create-mask --enable-build-resample --enable-build-resize" // "common_optional_programs": "--enable-build-sharpen-map --enable-build-convert-binary-to-star --enable-build-convert-eer-to-mrc --enable-build-resize --enable-build-resample --enable-build-sum_all_mrc_files --enable-build-sum_all_tif_files --enable-build-convert_par_to_star --enable-build-quick_test" @@ -21,7 +22,19 @@ { "label": "BUILD cisTEM", "type": "shell", - "command": "cd ${build_dir}/intel-gpu-static && make -j${input:compile_cores}" + "command": "cd ${build_dir}/intel-gpu-static && make -j${input:compile_cores} 2>&1 | sed -u 's|../../../src/|${workspaceFolder}/src/|g'", + "problemMatcher": { + "owner": "icpc", + "fileLocation": "absolute", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error|remark)\\s+#?(\\d+)?:\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "code": 4, + "message": 5 + } + } }, { "label": "Configure cisTEM DEBUG build", @@ -31,8 +44,20 @@ { "label": "BUILD cisTEM DEBUG", "type": "shell", - "command": "cd ${build_dir}/intel-gpu-debug-static && make -j${input:compile_cores}" - } + "command": "cd ${build_dir}/intel-gpu-debug-static && make -j${input:compile_cores} 2>&1 | sed -u 's|../../../src/|${workspaceFolder}/src/|g'", + "problemMatcher": { + "owner": "icpc", + "fileLocation": "absolute", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error|remark)\\s+#?(\\d+)?:\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "code": 4, + "message": 5 + } + } + }, { "label": "Configure cisTEM DEBUG build TMPVALUE", "type": "shell", @@ -41,8 +66,20 @@ { "label": "BUILD cisTEM DEBUG TMPVALUE", "type": "shell", - "command": "cd ${build_dir}/intel-gpu-debug-static-tmpvalue && make -j${input:compile_cores}" - } + "command": "cd ${build_dir}/intel-gpu-debug-static-tmpvalue && make -j${input:compile_cores} 2>&1 | sed -u 's|../../../src/|${workspaceFolder}/src/|g'", + "problemMatcher": { + "owner": "icpc", + "fileLocation": "absolute", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error|remark)\\s+#?(\\d+)?:\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "code": 4, + "message": 5 + } + } + }, { "label": "Configure cisTEM DEBUG build, CPU only", "type": "shell", @@ -51,7 +88,41 @@ { "label": "BUILD cisTEM DEBUG, CPU only", "type": "shell", - "command": "cd ${build_dir}/intel-debug-static && make -j${input:compile_cores}" + "command": "cd ${build_dir}/intel-debug-static && make -j${input:compile_cores} 2>&1 | sed -u 's|../../../src/|${workspaceFolder}/src/|g'", + "problemMatcher": { + "owner": "icpc", + "fileLocation": "absolute", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error|remark)\\s+#?(\\d+)?:\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "code": 4, + "message": 5 + } + } + }, + { + "label": "Configure cisTEM DEBUG build with LibTorch", + "type": "shell", + "command": "mkdir -p ${build_dir}/intel-gpu-debug-static-libtorch && cd ${build_dir}/intel-gpu-debug-static-libtorch && CC=icc CXX=icpc ../../configure ${input:additional_compiler_flags} --enable-debugmode --enable-gpu-debug --with-wx-config=/opt/WX/icc-static/bin/wx-config --enable-staticmode --with-cuda=${cuda_dir} --enable-libtorch ${experimental_algo_flags} ${common_optional_programs} ${common_flags} " + }, + { + "label": "BUILD cisTEM DEBUG with LibTorch", + "type": "shell", + "command": "cd ${build_dir}/intel-gpu-debug-static-libtorch && make -j${input:compile_cores} 2>&1 | sed -u 's|../../../src/|${workspaceFolder}/src/|g' && mkdir -p src/lib && cp -u /opt/libtorch/lib/libtorch.so* /opt/libtorch/lib/libtorch_cpu.so* /opt/libtorch/lib/libc10.so* /opt/libtorch/lib/libgomp*.so* src/lib/ 2>/dev/null || true", + "problemMatcher": { + "owner": "icpc", + "fileLocation": "absolute", + "pattern": { + "regexp": "^(.*)\\((\\d+)\\):\\s+(warning|error|remark)\\s+#?(\\d+)?:\\s+(.*)$", + "file": 1, + "line": 2, + "severity": 3, + "code": 4, + "message": 5 + } + } }, { "label": "CONFIG GNU, gpu", diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..adbd716fa --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,150 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +**IMPORTANT: Read this entire file completely and carefully before beginning any work. Every section contains intentional, critical information for successful collaboration. Do not skim or skip any content.** + +## Claude Code Persona: Senior Graduate Student Research Assistant + +### Core Identity & Mission +You are a **senior graduate student researcher**: intellectually curious, methodologically rigorous, and deeply committed to advancing factual understanding. Your primary mission is uncovering truth about the natural world through systematic investigation and collaborative problem-solving. + +### Rule Engagement & Override Protocol +**Rules in CLAUDE.md and system guidelines are foundational safeguards, not obstacles.** You must follow them strictly, but you are encouraged to engage thoughtfully with their rationale when questions arise. + +**When you encounter a rule that seems unclear or potentially counterproductive:** +1. **Communicate explicitly**: "I'm questioning whether [specific rule] applies in this context because [specific reason]" +2. **Explain your reasoning**: Detail why an alternative approach might be more effective +3. **Request explicit permission**: "May I proceed with [alternative approach] for this specific case?" +4. **Wait for authorization** before deviating from any established guideline + +This questioning process strengthens our collaborative framework—you're not expected to blindly follow rules you don't understand, but you must never bypass them without explicit permission. + +### Collaborative Learning & Pattern Recognition +**You actively learn from our troubleshooting sessions to improve future interactions.** After complex problem-solving discussions: +- Note recurring patterns that led to breakthroughs or failures +- Identify which approaches proved most/least effective +- Document insights that could enhance the CLAUDE.md for future sessions +- Propose additions to rules based on empirical evidence from our collaboration + +This iterative learning mirrors how human research teams build institutional knowledge—each session should make the next one more efficient. + +### Absolute Standards (Non-Negotiable) +**No shortcuts or hidden problems, ever.** You never comment out failing code, suppress error messages, or bypass debug assertions to achieve expedient results. Problems must be surfaced, investigated, and documented transparently—not masked or deferred. + +**Rigorous source verification.** Most solutions already exist in technical documentation, scientific protocols, or established codebases. Always search for and cite authoritative sources rather than inventing approaches from scratch. + +### Documentation & Knowledge Sharing +Every significant decision requires clear documentation explaining your reasoning and noting any alternatives you considered. This creates a knowledge trail for both immediate debugging and long-term pattern recognition. + +### Summary +Your approach is anchored in systematic rule-following, transparent problem-solving, and continuous collaborative learning. You question thoughtfully but never deviate without permission. You document extensively to support both current success and future improvement. + +## Project Overview + +cisTEM is a scientific computing application for cryo-electron microscopy (cryo-EM) image processing and 3D reconstruction. It's written primarily in C++ with CUDA GPU acceleration support and includes both command-line programs and a wxWidgets-based GUI. + +## Build System + +cisTEM uses GNU Autotools as the primary build system with Intel MKL for optimized FFT operations. + +For detailed build instructions, see `scripts/CLAUDE.md`. + +### Quick Start + +```bash +# Initial setup +./regenerate_containers.sh +./regenerate_project.b + +# Configure and build using VS Code +# Command Palette → Tasks: Run Task → BUILD cisTEM DEBUG + +# Or manually: +mkdir -p build/debug && cd build/debug +../../configure --enable-debugmode +make -j16 +``` + +## Architecture + +### Core Components + +- **src/core/** - Core libraries and data structures (see `src/core/CLAUDE.md`) +- **src/gui/** - wxWidgets-based graphical interface (see `src/gui/CLAUDE.md`) +- **src/programs/** - Command-line executables (see `src/programs/CLAUDE.md`) +- **scripts/** - Build and utility scripts (see `scripts/CLAUDE.md`) + +### Key Dependencies + +- **Intel MKL** - Primary FFT library for optimized performance +- **wxWidgets** - GUI framework (typically 3.0.5 stable) +- **SQLite** - Database backend +- **CUDA** - GPU acceleration (optional) +- **Intel C++ Compiler (icc/icpc)** - Primary compiler for performance builds + +## Testing + +cisTEM has a multi-tiered testing approach: + +```bash +# Unit tests - Test individual methods and functions +./unit_test_runner + +# Console tests - Mid-complexity tests of single methods +./console_test + +# Functional tests - Test complete workflows and image processing tasks +./samples_functional_testing +``` + +Refer to `.github/workflows/` for CI test configurations. + +## Code Style and Standards + +- **Formatting:** Project uses `.clang-format` in the root directory for consistent code formatting +- **Type Casting:** Always use modern C++ functional cast style (`int(variable)`, `long(variable)`, `float(variable)`) instead of C-style casts (`(int)variable`, `(long)variable`, `(float)variable`) +- **wxWidgets Printf Formatting:** + - Always match format specifiers exactly to variable types (e.g., `%ld` for `long`, `%d` for `int`, `%f` for `float`) - mismatches cause segfaults in wxFormatConverterBase + - Never use Unicode characters (Å, °, etc.) in format strings as they cause segmentation faults - use ASCII equivalents instead (A, deg, etc.) +- **Temporary Debugging Changes:** All temporary debugging code (debug prints, commented-out code, test modifications) must be marked with `// revert - ` to ensure cleanup before commits. Search for "revert" to find all temporary changes. +- **Philosophy:** Incremental modernization - update and unify style as code is modified rather than wholesale changes +- **Legacy Compatibility:** Many legacy features exist; maintain compatibility while gradually improving +- **Preprocessor Defines:** All project-specific preprocessor defines should be prefixed with `cisTEM_` to avoid naming collisions (e.g., `cisTEM_ENABLE_FEATURE` not `ENABLE_FEATURE`) +- **Include Guards:** Use the full path from project root in uppercase with underscores for header file include guards (e.g., `_SRC_GUI_MYHEADER_H_` for `src/gui/MyHeader.h`, not `__MyHeader__`) +- **Temporary Files:** All temporary files (scripts, plans, documentation drafts) should be created in `.claude/cache/` directory. Create this directory if it doesn't exist. This keeps the project root clean and makes it easy to identify Claude-generated temporary content + +## Commit Best Practices + +- **Compilation Requirement:** Every commit must compile successfully without errors. This is essential for maintaining a clean git history that supports effective debugging with `git bisect` +- **Frequent Commits:** Commit work frequently, especially when completing discrete tasks or todo items. Small, focused commits are easier to review and debug +- **Clean Up Before Committing:** Remove all temporary debugging code marked with `// revert` comments before committing +- **Descriptive Messages:** Write clear, concise commit messages that explain what was changed and why +- **Test Before Commit:** Verify that changes work as expected before committing + + +## Modern C++ Best Practices + +### Container Usage + +**Use STL containers for new code.** wxWidgets legacy containers (wxArray, wxList) exist only for compatibility. + +| Use Case | Recommended | Avoid | +|----------|-------------|-------| +| Dynamic arrays | `std::vector` | wxArray, wxVector | +| Lists | `std::list`, `std::deque` | wxList | +| String lists | `std::vector` | wxArrayString | + +### Memory Management + +- **GUI objects:** Use raw pointers with parent-child ownership (see `src/gui/CLAUDE.md`) +- **Non-GUI objects:** Use smart pointers (`std::unique_ptr`, `std::shared_ptr`) +- **Large arrays:** Use `new`/`delete` for explicit control + +## IDE Configuration + +The project is designed for development with Visual Studio Code using Docker containers: + +- VS Code settings linked via `.vscode` symlink to `.vscode_shared/CistemDev` +- Container environment managed through `regenerate_containers.sh` +- Build tasks pre-configured for different compiler and configuration combinations diff --git a/additional_programs.m4 b/additional_programs.m4 deleted file mode 100644 index 30e3345b3..000000000 --- a/additional_programs.m4 +++ /dev/null @@ -1,512 +0,0 @@ -# - - -# These are programs not central to running cisTEM but that users may find helpful -AC_DEFUN([AX_ADDITIONAL_PROGRAMS], -[ -AC_MSG_NOTICE([Checking for additional programs]) - -build_all="yes" -AC_ARG_ENABLE(build-all, AS_HELP_STRING([--disable-build-all],[only build essential and requested programs])) -AS_IF([test "x$enable_build_all" = "xno"], [ - build_all="no" - AC_MSG_NOTICE([Building only essential and requested programs]) - ]) - -AC_MSG_NOTICE([Checking for additional programs 1]) - -AS_IF([test "x$build_all" = "xyes"], [build_apply_ctf="yes"], [build_apply_ctf="no"]) -AC_ARG_ENABLE(build-applyctf, AS_HELP_STRING([--enable-build-applyctf],[build applyctf [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_apply_ctf=yes - AC_MSG_NOTICE([Building applyctf]) - fi - ]) -AM_CONDITIONAL([ENABLE_APPLYCTF_AM], [test "x$build_apply_ctf" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_project3D="yes"], [build_project3D="no"]) -AC_ARG_ENABLE(build-project3D, AS_HELP_STRING([--enable-build-project3D],[build project3D [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_project3D=yes - AC_MSG_NOTICE([Building project3D]) - fi - ]) -AM_CONDITIONAL([ENABLE_PROJECT3D_AM], [test "x$build_project3D" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_calc_occ="yes"], [build_calc_occ="no"]) -AC_ARG_ENABLE(build-calc-occ, AS_HELP_STRING([--enable-build-calc-occ],[build calc_occ [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_calc_occ=yes - AC_MSG_NOTICE([Building calc_occ]) - fi - ]) -AM_CONDITIONAL([ENABLE_CALCOCC_AM], [test "x$build_calc_occ" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_remove_outlier_pixels="yes"], [build_remove_outlier_pixels="no"]) -AC_ARG_ENABLE(build-remove-outlier-pixels, AS_HELP_STRING([--enable-build-remove-outlier-pixels],[build remove_outlier_pixels [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_remove_outlier_pixels=yes - AC_MSG_NOTICE([Building remove_outlier_pixels]) - fi - ]) -AM_CONDITIONAL([ENABLE_REMOVEOUTLIERPIXELS_AM], [test "x$build_remove_outlier_pixels" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_resize="yes"], [build_resize="no"]) -AC_ARG_ENABLE(build-resize, AS_HELP_STRING([--enable-build-resize],[build resize [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_resize=yes - AC_MSG_NOTICE([Building resize]) - fi - ]) -AM_CONDITIONAL([ENABLE_RESIZE_AM], [test "x$build_resize" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_resample="yes"], [build_resample="no"]) -AC_ARG_ENABLE(build-resample, AS_HELP_STRING([--enable-build-resample],[build resample [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_resample=yes - AC_MSG_NOTICE([Building resample]) - fi - ]) -AM_CONDITIONAL([ENABLE_RESAMPLE_AM], [test "x$build_resample" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_reset_mrc_header="yes"], [build_reset_mrc_header="no"]) -AC_ARG_ENABLE(build-reset-mrc-header, AS_HELP_STRING([--enable-build-reset-mrc-header],[build reset_mrc_header [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_reset_mrc_header=yes - AC_MSG_NOTICE([Building reset_mrc_header]) - fi - ]) -AM_CONDITIONAL([ENABLE_RESETMRCHEADER_AM], [test "x$build_reset_mrc_header" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_estimate_dataset_ssnr="yes"], [build_estimate_dataset_ssnr="no"]) -AC_ARG_ENABLE(build-estimate-dataset-ssnr, AS_HELP_STRING([--enable-build-estimate-dataset-ssnr],[build estimate_dataset_ssnr [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_estimate_dataset_ssnr=yes - AC_MSG_NOTICE([Building estimate_dataset_ssnr]) - fi - ]) -AM_CONDITIONAL([ENABLE_ESTIMATEDATASETSSNR_AM], [test "x$build_estimate_dataset_ssnr" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_montage="yes"], [build_montage="no"]) -AC_ARG_ENABLE(build-montage, AS_HELP_STRING([--enable-build-montage],[build montage [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_montage=yes - AC_MSG_NOTICE([Building montage]) - fi - ]) -AM_CONDITIONAL([ENABLE_MONTAGE_AM], [test "x$build_montage" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_extract_particles="yes"], [build_extract_particles="no"]) -AC_ARG_ENABLE(build-extract-particles, AS_HELP_STRING([--enable-build-extract-particles],[build extract_particles [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_extract_particles=yes - AC_MSG_NOTICE([Building extract_particles]) - fi - ]) -AM_CONDITIONAL([ENABLE_EXTRACTPARTICLES_AM], [test "x$build_extract_particles" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_sum_all_mrc_files="yes"], [build_sum_all_mrc_files="no"]) -AC_ARG_ENABLE(build-sum-all-mrc-files, AS_HELP_STRING([--enable-build-sum-all-mrc-files],[build sum_all_mrc_files [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_sum_all_mrc_files=yes - AC_MSG_NOTICE([Building sum_all_mrc_files]) - fi - ]) -AM_CONDITIONAL([ENABLE_SUMALLMRCFILES_AM], [test "x$build_sum_all_mrc_files" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_sum_all_tif_files="yes"], [build_sum_all_tif_files="no"]) -AC_ARG_ENABLE(build-sum-all-tif-files, AS_HELP_STRING([--enable-build-sum-all-tif-files],[build sum_all_tif_files [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_sum_all_tif_files=yes - AC_MSG_NOTICE([Building sum_all_tif_files]) - fi - ]) -AM_CONDITIONAL([ENABLE_SUMALLTIFFILES_AM], [test "x$build_sum_all_tif_files" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_sum_all_eer_files="yes"], [build_sum_all_eer_files="no"]) -AC_ARG_ENABLE(build-sum-all-eer-files, AS_HELP_STRING([--enable-build-sum-all-eer-files],[build sum_all_eer_files [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_sum_all_eer_files=yes - AC_MSG_NOTICE([Building sum_all_eer_files]) - fi - ]) -AM_CONDITIONAL([ENABLE_SUMALLEERFILES_AM], [test "x$build_sum_all_eer_files" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_apply_gain_ref="yes"], [build_apply_gain_ref="no"]) -AC_ARG_ENABLE(build-apply-gain-ref, AS_HELP_STRING([--enable-build-apply-gain-ref],[build apply_gain_ref [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_apply_gain_ref=yes - AC_MSG_NOTICE([Building apply_gain_ref]) - fi - ]) -AM_CONDITIONAL([ENABLE_APPLYGAINREF_AM], [test "x$build_apply_gain_ref" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_scale_with_mask="yes"], [build_scale_with_mask="no"]) -AC_ARG_ENABLE(build-scale-with-mask, AS_HELP_STRING([--enable-build-scale-with-mask],[build scale_with_mask [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_scale_with_mask=yes - AC_MSG_NOTICE([Building scale_with_mask]) - fi - ]) -AM_CONDITIONAL([ENABLE_SCALEWITHMASK_AM], [test "x$build_scale_with_mask" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_mag_distortion_correct="yes"], [build_mag_distortion_correct="no"]) -AC_ARG_ENABLE(build-mag-distortion-correct, AS_HELP_STRING([--enable-build-mag-distortion-correct],[build mag_distortion_correct [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_mag_distortion_correct=yes - AC_MSG_NOTICE([Building mag_distortion_correct]) - fi - ]) -AM_CONDITIONAL([ENABLE_MAGDISTORTIONCORRECT_AM], [test "x$build_mag_distortion_correct" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_apply_mask="yes"], [build_apply_mask="no"]) -AC_ARG_ENABLE(build-apply-mask, AS_HELP_STRING([--enable-build-apply-mask],[build apply_mask [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_apply_mask=yes - AC_MSG_NOTICE([Building apply_mask]) - fi - ]) -AM_CONDITIONAL([ENABLE_APPLYMASK_AM], [test "x$build_apply_mask" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_convert_tif_to_mrc="yes"]) -AC_ARG_ENABLE(build-convert-tif-to-mrc, AS_HELP_STRING([--enable-build-convert-tif-to-mrc],[build convert_tif_to_mrc [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_convert_tif_to_mrc=yes - AC_MSG_NOTICE([Building convert_tif_to_mrc]) - fi - ]) -AM_CONDITIONAL([ENABLE_CONVERTTIFTOMRC_AM], [test "x$build_convert_tif_to_mrc" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_remove_inf_and_nan="yes"]) -AC_ARG_ENABLE(build-remove-inf-and-nan, AS_HELP_STRING([--enable-build-remove-inf-and-nan],[build remove_inf_and_nan [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_remove_inf_and_nan=yes - AC_MSG_NOTICE([Building remove_inf_and_nan]) - fi - ]) -AM_CONDITIONAL([ENABLE_REMOVEINFANDNAN_AM], [test "x$build_remove_inf_and_nan" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_make_orth_views="yes"]) -AC_ARG_ENABLE(build-make-orth-views, AS_HELP_STRING([--enable-build-make-orth-views],[build make_orth_views [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_make_orth_views=yes - AC_MSG_NOTICE([Building make_orth_views]) - fi - ]) -AM_CONDITIONAL([ENABLE_MAKEORTHVIEWS_AM], [test "x$build_make_orth_views" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_sharpen_map="yes"]) -AC_ARG_ENABLE(build-sharpen-map, AS_HELP_STRING([--enable-build-sharpen-map],[build sharpen_map [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_sharpen_map=yes - AC_MSG_NOTICE([Building sharpen_map]) - fi - ]) -AM_CONDITIONAL([ENABLE_SHARPENMAP_AM], [test "x$build_sharpen_map" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_calculate_fsc="yes"]) -AC_ARG_ENABLE(build-calculate-fsc, AS_HELP_STRING([--enable-build-calculate-fsc],[build calculate_fsc [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_calculate_fsc=yes - AC_MSG_NOTICE([Building calculate_fsc]) - fi - ]) -AM_CONDITIONAL([ENABLE_CALCULATEFSC_AM], [test "x$build_calculate_fsc" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_make_size_map="yes"]) -AC_ARG_ENABLE(build-make-size-map, AS_HELP_STRING([--enable-build-make-size-map],[build make_size_map [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_make_size_map=yes - AC_MSG_NOTICE([Building make_size_map]) - fi - ]) -AM_CONDITIONAL([ENABLE_MAKESIZEMAP_AM], [test "x$build_make_size_map" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_convert_par_to_star="yes"]) -AC_ARG_ENABLE(build-convert-par-to-star, AS_HELP_STRING([--enable-build-convert-par-to-star],[build convert_par_to_star [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_convert_par_to_star=yes - AC_MSG_NOTICE([Building convert_par_to_star]) - fi - ]) -AM_CONDITIONAL([ENABLE_CONVERTPARTOSTAR_AM], [test "x$build_convert_par_to_star" = "xyes"]) - - -AS_IF([test "x$build_all" = "xyes"], [build_subtract_from_stack="yes"]) -AC_ARG_ENABLE(build-subtract_from_stack, AS_HELP_STRING([--enable-build-subtract-from-stack],[build subtract-from-stack [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_subtract_from_stack=yes - AC_MSG_NOTICE([Building subtract_from_stack]) - fi - ]) -AM_CONDITIONAL([ENABLE_SUBTRACTFROMSTACK_AM], [test "x$build_subtract_from_stack" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_binarize="yes"]) -AC_ARG_ENABLE(build-binarize, AS_HELP_STRING([--enable-build-binarize],[build binarize [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_binarize=yes - AC_MSG_NOTICE([Building binarize]) - fi - ]) -AM_CONDITIONAL([ENABLE_BINARIZE_AM], [test "x$build_binarize" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_move_volume_xyz="yes"]) -AC_ARG_ENABLE(build-move-volume-xyz, AS_HELP_STRING([--enable-build-move-volume-xyz],[build move_volume_xyz [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_move_volume_xyz=yes - AC_MSG_NOTICE([Building move_volume_xyz]) - fi - ]) -AM_CONDITIONAL([ENABLE_MOVEVOLUMEXYZ_AM], [test "x$build_move_volume_xyz" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_symmetry_expand_stack_and_par="yes"]) -AC_ARG_ENABLE(build-symmetry-expand-stack-and-par, AS_HELP_STRING([--enable-build-symmetry-expand-stack-and-par],[build symmetry_expand_stack_and_par [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_symmetry_expand_stack_and_par=yes - AC_MSG_NOTICE([Building symmetry_expand_stack_and_par]) - fi - ]) -AM_CONDITIONAL([ENABLE_SYMMETRYEXPANDSTACKANDPAR_AM], [test "x$build_symmetry_expand_stack_and_par" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_subtract_two_stacks="yes"]) -AC_ARG_ENABLE(build-subtract-two-stacks, AS_HELP_STRING([--enable-build-subtract-two-stacks],[build subtract_two_stacks [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_subtract_two_stacks=yes - AC_MSG_NOTICE([Building subtract_two_stacks]) - fi - ]) -AM_CONDITIONAL([ENABLE_SUBTRACTTWOSTACKS_AM], [test "x$build_subtract_two_stacks" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_add_two_stacks="yes"]) -AC_ARG_ENABLE(build-add-two-stacks, AS_HELP_STRING([--enable-build-add-two-stacks],[build add_two_stacks [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_add_two_stacks=yes - AC_MSG_NOTICE([Building add_two_stacks]) - fi - ]) -AM_CONDITIONAL([ENABLE_ADDTWOSTACKS_AM], [test "x$build_add_two_stacks" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_multiply_two_stacks="yes"]) -AC_ARG_ENABLE(build-multiply-two-stacks, AS_HELP_STRING([--enable-build-multiply-two-stacks],[build multiply_two_stacks [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_multiply_two_stacks=yes - AC_MSG_NOTICE([Building multiply_two_stacks]) - fi - ]) -AM_CONDITIONAL([ENABLE_MULTIPLYTWOSTACKS_AM], [test "x$build_multiply_two_stacks" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_divide_two_stacks="yes"]) -AC_ARG_ENABLE(build-divide-two-stacks, AS_HELP_STRING([--enable-build-divide-two-stacks],[build divide_two_stacks [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_divide_two_stacks=yes - AC_MSG_NOTICE([Building divide_two_stacks]) - fi - ]) -AM_CONDITIONAL([ENABLE_DIVIDETWOSTACKS_AM], [test "x$build_divide_two_stacks" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_invert_stack="yes"]) -AC_ARG_ENABLE(build-invert-stack, AS_HELP_STRING([--enable-build-invert-stack],[build invert_stack [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_invert_stack=yes - AC_MSG_NOTICE([Building invert_stack]) - fi - ]) -AM_CONDITIONAL([ENABLE_INVERTSTACK_AM], [test "x$build_invert_stack" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_align_coordinates="yes"]) -AC_ARG_ENABLE(build-align-coordinates, AS_HELP_STRING([--enable-build-align-coordinates],[build align_coordinates [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_align_coordinates=yes - AC_MSG_NOTICE([Building align_coordinates]) - fi - ]) -AM_CONDITIONAL([ENABLE_ALIGNCOORDINATES_AM], [test "x$build_align_coordinates" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_align_symmetry="yes"]) -AC_ARG_ENABLE(build-align-symmetry, AS_HELP_STRING([--enable-build-align-symmetry],[build align_coordinates [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_align_symmetry=yes - AC_MSG_NOTICE([Building align_coordinates]) - fi - ]) -AM_CONDITIONAL([ENABLE_ALIGNSYMMETRY_AM], [test "x$build_align_symmetry" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_find_dqe="yes"]) -AC_ARG_ENABLE(build-find-dqe, AS_HELP_STRING([--enable-build-find-dqe],[build find_dqe [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_find_dqe=yes - AC_MSG_NOTICE([Building find_dqe]) - fi - ]) -AM_CONDITIONAL([ENABLE_FINDDQE_AM], [test "x$build_find_dqe" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_combine_via_max="yes"]) -AC_ARG_ENABLE(build-combine-via-max, AS_HELP_STRING([--enable-build-combine-via-max],[build combine_via_max [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_combine_via_max=yes - AC_MSG_NOTICE([Building combine_via_max]) - fi - ]) -AM_CONDITIONAL([ENABLE_COMBINEVIAMAX_AM], [test "x$build_combine_via_max" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_remove_relion_stripes="yes"]) -AC_ARG_ENABLE(build-remove-relion-stripes, AS_HELP_STRING([--enable-build-remove-relion-stripes],[build remove_relion_stripes [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_remove_relion_stripes=yes - AC_MSG_NOTICE([Building remove_relion_stripes]) - fi - ]) -AM_CONDITIONAL([ENABLE_REMOVERELIONSTRIPES_AM], [test "x$build_remove_relion_stripes" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_create_mask="yes"]) -AC_ARG_ENABLE(build-create-mask, AS_HELP_STRING([--enable-build-create-mask],[build create_mask [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_create_mask=yes - AC_MSG_NOTICE([Building create_mask]) - fi - ]) -AM_CONDITIONAL([ENABLE_CREATEMASK_AM], [test "x$build_create_mask" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_invert_hand="yes"]) -AC_ARG_ENABLE(build-invert-hand, AS_HELP_STRING([--enable-build-invert-hand],[build invert_hand [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_invert_hand=yes - AC_MSG_NOTICE([Building invert_hand]) - fi - ]) -AM_CONDITIONAL([ENABLE_INVERTHAND_AM], [test "x$build_invert_hand" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_append_stacks="yes"]) -AC_ARG_ENABLE(build-append-stacks, AS_HELP_STRING([--enable-build-append-stacks],[build append_stacks [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_append_stacks=yes - AC_MSG_NOTICE([Building append_stacks]) - fi - ]) -AM_CONDITIONAL([ENABLE_APPENDSTACKS_AM], [test "x$build_append_stacks" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_convert_star_to_binary="yes"]) -AC_ARG_ENABLE(build-convert-star-to-binary, AS_HELP_STRING([--enable-build-convert-star-to-binary],[build convert_star_to_binary [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_convert_star_to_binary=yes - AC_MSG_NOTICE([Building convert_star_to_binary]) - fi - ]) -AM_CONDITIONAL([ENABLE_CONVERTSTARTOBINARY_AM], [test "x$build_convert_star_to_binary" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_convert_binary_to_star="yes"]) -AC_ARG_ENABLE(build-convert-binary-to-star, AS_HELP_STRING([--enable-build-convert-binary-to-star],[build convert_binary_to_star [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_convert_binary_to_star=yes - AC_MSG_NOTICE([Building convert_binary_to_star]) - fi - ]) -AM_CONDITIONAL([ENABLE_CONVERTBINARYTOSTAR_AM], [test "x$build_convert_binary_to_star" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_convert_eer_to_mrc="yes"]) -AC_ARG_ENABLE(build-convert-eer-to-mrc, AS_HELP_STRING([--enable-build-convert-eer-to-mrc],[build convert_eer_to_mrc [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_convert_eer_to_mrc=yes - AC_MSG_NOTICE([Building convert_eer_to_mrc]) - fi - ]) -AM_CONDITIONAL([ENABLE_CONVERTEERTOMRC_AM], [test "x$build_convert_eer_to_mrc" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_azimuthal_average="yes"]) -AC_ARG_ENABLE(build-azimuthal-average, AS_HELP_STRING([--enable-build-azimuthal-average],[build azimuthal_average [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_azimuthal_average=yes - AC_MSG_NOTICE([Building azimuthal_average]) - fi - ]) -AM_CONDITIONAL([ENABLE_AZIMUTHALAVERAGE_AM], [test "x$build_azimuthal_average" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_normalize_stack="yes"]) -AC_ARG_ENABLE(build-normalize-stack, AS_HELP_STRING([--enable-build-normalize-stack],[build normalize_stack [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_normalize_stack=yes - AC_MSG_NOTICE([Building normalize_stack]) - fi - ]) -AM_CONDITIONAL([ENABLE_NORMALIZESTACK_AM], [test "x$build_normalize_stack" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_print_stack_statistics="yes"]) -AC_ARG_ENABLE(build-print-stack-statistics, AS_HELP_STRING([--enable-build-print-stack-statistics],[build print_stack_statistics [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_print_stack_statistics=yes - AC_MSG_NOTICE([Building print_stack_statistics]) - fi - ]) -AM_CONDITIONAL([ENABLE_PRINTSTACKSTATISTICS_AM], [test "x$build_print_stack_statistics" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_combine_stacks_by_star="yes"]) -AC_ARG_ENABLE(build-combine-stacks-by-star, AS_HELP_STRING([--enable-build-combine-stacks-by-star],[build combine_stacks_by_star [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_combine_stacks_by_star=yes - AC_MSG_NOTICE([Building combine_stacks_by_star]) - fi - ]) -AM_CONDITIONAL([ENABLE_COMBINESTACKSBYSTAR_AM], [test "x$build_combine_stacks_by_star" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_measure_template_bias="yes"]) -AC_ARG_ENABLE(build-measure-template-bias, AS_HELP_STRING([--enable-build-measure-template-bias],[build measure_template_bias [default="no"]]),[ - if test "x$enableval" = "xyes"; then - build_measure_template_bias=yes - AC_MSG_NOTICE([Building measure_template_bias]) - fi - ]) -AM_CONDITIONAL([ENABLE_MEASURETEMPLATEBIAS_AM], [test "x$build_measure_template_bias" = "xyes"]) - - -use_Eigen="no" -AS_IF([test "x$build_all" = "xyes"], [build_calculate_template_pvalue="yes"], [build_calculate_template_pvalue="no"]) -AC_ARG_ENABLE(build-calculate-template-pvalue, AS_HELP_STRING([--enable-build-calculate-template-pvalue],[build calculate_template_pvalue [default="no"]]),[ - if test "x$enableval" = "xyes" ; then - # Check for Eigen which is currently needed but is slated to be replaced with MKL - # The version that should be installed is 3.4.0 - AC_CHECK_FILE("$TOPSRCDIR/include/Eigen/Dense",[use_Eigen="yes"],[use_Eigen="no"]) - - fi - ], [ - AC_CHECK_FILE("$TOPSRCDIR/include/Eigen/Dense",[use_Eigen="yes"],[use_Eigen="no"]) - ]) - - if test "x$use_Eigen" = "xyes"; then - # If this is build-all then this value is already yes, other wise we need to set it - build_calculate_template_pvalue=yes - AC_MSG_NOTICE([Building calculate_template_pvalue]) - else - build_calculate_template_pvalue=no - AC_MSG_NOTICE([Eigen is required to build calculate_template_pvalue. Please install Eigen v3.4.0 or configure without --enable-calculate-template-pvalue]) - fi - -AM_CONDITIONAL([ENABLE_CALCULATETEMPLATEPVALUE_AM], [test "x$build_calculate_template_pvalue" = "xyes"]) -AS_IF([test "x$build_all" = "xyes"], [build_align_nmr_spectra="yes"]) -AC_ARG_ENABLE(build-align-nmr-spectra, AS_HELP_STRING([--enable-build-align-nmr-spectra],[build align_nmr_spectra [default="no"]]),[ - if test "$enableval" = yes; then - build_align_nmr_spectra=yes - AC_MSG_NOTICE([Building align_nmr_spectra]) - fi - ]) -AM_CONDITIONAL([ENABLE_ALIGNNMRSPECTRA_AM], [test "x$build_align_nmr_spectra" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_correlate_nmr_spectra="yes"]) -AC_ARG_ENABLE(build-correlate-nmr-spectra, AS_HELP_STRING([--enable-correlate-nmr-spectra],[build correlate_nmr_spectra [default="no"]]),[ - if test "$enableval" = yes; then - build_correlate_nmr_spectra=yes - AC_MSG_NOTICE([Building correlate_nmr_spectra]) - fi - ]) -AM_CONDITIONAL([ENABLE_CORRELATENMRSPECTRA_AM], [test "x$build_correlate_nmr_spectra" = "xyes"]) - -AS_IF([test "x$build_all" = "xyes"], [build_filter_images="yes"]) -AC_ARG_ENABLE(build-filter-images, AS_HELP_STRING([--enable-filter-images],[build filter_images [default="no"]]),[ - if test "$enableval" = yes; then - build_filter_images=yes - AC_MSG_NOTICE([Building filter_images]) - fi - ]) -AM_CONDITIONAL([ENABLE_FILTERIMAGES_AM], [test "x$build_filter_images" = "xyes"]) - -]) - diff --git a/configure.ac b/configure.ac index 396c2c5ba..d50eefb3d 100644 --- a/configure.ac +++ b/configure.ac @@ -15,8 +15,8 @@ AC_PROG_CXX([icpc g++ clang++]) AM_PROG_CC_C_O AC_PROG_INSTALL -AC_LIBTOOL_DLOPEN -AC_PROG_LIBTOOL +LT_PREREQ([2.4]) +LT_INIT([dlopen]) AC_LANG(C++) # Set this for the gpu makefile hack @@ -67,7 +67,7 @@ CPP_STANDARD=17 # --enable-build-program will add the additional program(s) # these flags have no meaning unles --disable-build-all is set # -AX_ADDITIONAL_PROGRAMS +NON_ESSENTIAL_PROGRAMS_TO_BE_COMPILED # if test "$want_cuda" = "yes" ; then # CPP_STANDARD=17 @@ -191,8 +191,9 @@ AC_ARG_ENABLE(mkl, AS_HELP_STRING([--disable-mkl],[Do not use the Intel MKL]), [ fi ]) - - +# LibTorch +# Check for LibTorch support for ML-based tools (e.g., blush regularization) +AX_LIBTORCH # wx-config @@ -216,12 +217,12 @@ AC_ARG_ENABLE(debugmode, AS_HELP_STRING([--enable-debugmode],[Compile in debug m [ if test "$enableval" = yes; then AC_DEFINE([DEBUG], [], [Define the debug flag]) - if test "x$CXX" = "xicpc"; then + if test "x$CXX" = "xicpc"; then CXXFLAGS="-O2 -debug -no-prec-div -no-prec-sqrt -fprotect-parens $WARNINGS_ON -std=c++${CPP_STANDARD} -wd1125" CPPFLAGS="-O2 -debug -no-prec-div -no-prec-sqrt -fprotect-parens $WARNINGS_ON" else - CPPFLAGS="-O2 -g $WARNINGS_ON $INPUT_CPPFLAGS" - CXXFLAGS="-O2 -g -std=c++${CPP_STANDARD} $WARNINGS_ON $INPUT_CXXFLAGS" + CPPFLAGS="-O2 -g $WARNINGS_ON" + CXXFLAGS="-O2 -g -std=c++${CPP_STANDARD} $WARNINGS_ON" fi else AC_DEFINE([NDEBUG], [], [Define the nodebug flag for either g++ or clang builds]) @@ -491,11 +492,23 @@ AC_CHECK_FILE("$MKLROOT/include/mkl.h", AC_DEFINE([MKL_ILP64], [], [Use the MKL ILP64 interface]) -# FIXME would not match next block +# Configure MKL based on threading options if test "x$CXX" = "xicpc"; then - CPPFLAGS="$CPPFLAGS -qmkl=sequential -I"${MKLROOT}/include" " - CXXFLAGS="$CXXFLAGS -qmkl=sequential -I"${MKLROOT}/include" " - LIBS="$LIBS -qmkl=sequential " + if test "x$use_mkl_threads" = "xyes"; then + CPPFLAGS="$CPPFLAGS -qmkl=parallel -I"${MKLROOT}/include" " + CXXFLAGS="$CXXFLAGS -qmkl=parallel -I"${MKLROOT}/include" " + LIBS="$LIBS -qmkl=parallel " + elif test "x$use_gnu_threads" = "xyes"; then + # Intel compiler with GNU OpenMP threads + CPPFLAGS="$CPPFLAGS -I"${MKLROOT}/include" " + CXXFLAGS="$CXXFLAGS -I"${MKLROOT}/include" " + # Let the manual linking below handle GNU threads + else + # Sequential (default) + CPPFLAGS="$CPPFLAGS -qmkl=sequential -I"${MKLROOT}/include" " + CXXFLAGS="$CXXFLAGS -qmkl=sequential -I"${MKLROOT}/include" " + LIBS="$LIBS -qmkl=sequential " + fi else CPPFLAGS="$CPPFLAGS -I"${MKLROOT}/include" " CXXFLAGS="$CXXFLAGS -I"${MKLROOT}/include" " @@ -633,7 +646,7 @@ else set_git_versioning_defaults="no" AC_CHECK_FILE("$TOPSRCDIR/.git/HEAD", [ - if test "x$GIT_CHECK" == "xyes"; then + if test "x$GIT_CHECK" = "xyes"; then # All the args require the extra double quotes to be properly formated later on. # Get the current branch, which could have multiple refs, which is why we need the awk (*) marks the active branch. @@ -703,6 +716,8 @@ AC_SUBST(CUDA_CPPFLAGS) AC_SUBST(CUDA_LIBS) AC_SUBST(libFastFFT_OBJECTS) AC_SUBST(MKL_LIBS) +AC_SUBST(LIBTORCH_LIBS) +AC_SUBST(LIBTORCH_RPATH) AC_SUBST(LIBTOOL_FLAGS) @@ -712,6 +727,7 @@ AC_SUBST(LIBTOOL_FLAGS) AC_MSG_NOTICE([WX_LIBS=$WX_LIBS]) AC_MSG_NOTICE([LIBS=$LIBS]) AC_MSG_NOTICE([MKL_LIBS=$MKL_LIBS]) + AC_MSG_NOTICE([LIBTORCH_LIBS=$LIBTORCH_LIBS]) AC_MSG_NOTICE([libFastFFT_OBJECTS=$libFastFFT_OBJECTS]) AC_CONFIG_FILES([Makefile src/Makefile]) diff --git a/include/libtorch/cistem_torch_helper.h b/include/libtorch/cistem_torch_helper.h new file mode 100644 index 000000000..59c29d391 --- /dev/null +++ b/include/libtorch/cistem_torch_helper.h @@ -0,0 +1,54 @@ +#ifndef _INCLUDE_LIBTORCH_CISTEM_TORCH_HELPER_H_ +#define _INCLUDE_LIBTORCH_CISTEM_TORCH_HELPER_H_ + +// This header provides a clean interface for including LibTorch in cisTEM code. +// It handles macro conflicts between cisTEM/wxWidgets and LibTorch headers. +// +// Usage: +// #ifdef cisTEM_USING_LIBTORCH +// #include "libtorch/cistem_torch_helper.h" +// #endif + +#ifdef cisTEM_USING_LIBTORCH + +// Save all macros that conflict with LibTorch +// N_ is from wxWidgets translation.h (i18n) +// Type macros (NONE, TEXT, INTEGER, FLOAT, BOOL, LONG, DOUBLE, CHAR) are from core/defines.h +#pragma push_macro("N_") +#pragma push_macro("NONE") +#pragma push_macro("TEXT") +#pragma push_macro("INTEGER") +#pragma push_macro("FLOAT") +#pragma push_macro("BOOL") +#pragma push_macro("LONG") +#pragma push_macro("DOUBLE") +#pragma push_macro("CHAR") + +// Undefine conflicting macros +#undef N_ +#undef NONE +#undef TEXT +#undef INTEGER +#undef FLOAT +#undef BOOL +#undef LONG +#undef DOUBLE +#undef CHAR + +// Include LibTorch headers +#include + +// Restore all macros for use in cisTEM code +#pragma pop_macro("CHAR") +#pragma pop_macro("DOUBLE") +#pragma pop_macro("LONG") +#pragma pop_macro("BOOL") +#pragma pop_macro("FLOAT") +#pragma pop_macro("INTEGER") +#pragma pop_macro("TEXT") +#pragma pop_macro("NONE") +#pragma pop_macro("N_") + +#endif // cisTEM_USING_LIBTORCH + +#endif // _INCLUDE_LIBTORCH_CISTEM_TORCH_HELPER_H_ \ No newline at end of file diff --git a/m4/additional_programs.m4 b/m4/additional_programs.m4 new file mode 100644 index 000000000..d76d52868 --- /dev/null +++ b/m4/additional_programs.m4 @@ -0,0 +1,154 @@ +# Additional programs configuration for cisTEM +# +# This file defines optional programs that can be built with cisTEM. +# By default, all programs are built unless --disable-build-all is specified. +# +# Configuration flags: +# --disable-build-all : Only build essential programs (GUI requirements) +# --enable-build- : Build specific program when --disable-build-all is set +# +# To add a new optional program: +# 1. Add a line in the main macro below: +# CISTEM_OPTIONAL_PROGRAM([program_internal_name], [ENABLE_PROGRAMNAME], [display_name]) +# 2. Add corresponding AM_CONDITIONAL block in src/Makefile.am: +# if ENABLE_PROGRAMNAME_AM +# bin_PROGRAMS += your_program +# endif +# +# Example: To add a program called "my_filter": +# 1. Add to this file: +# CISTEM_OPTIONAL_PROGRAM([my_filter], [ENABLE_MYFILTER], [my_filter]) +# 2. User can then configure with: +# ./configure --disable-build-all --enable-build-my-filter + +# Define a reusable macro for optional programs +# Usage: CISTEM_OPTIONAL_PROGRAM([program_name], [CONDITIONAL_NAME], [display_name]) +AC_DEFUN([CISTEM_OPTIONAL_PROGRAM], [ + AS_IF([test "x$build_all" = "xyes"], + [build_$1="yes"], + [build_$1="no"]) + + AC_ARG_ENABLE([build-$1], + AS_HELP_STRING([--enable-build-$1], [build $3 @<:@default="no"@:>@]), + [AS_IF([test "x$enableval" = "xyes"], + [build_$1=yes + AC_MSG_NOTICE([Building $3])])]) + + AM_CONDITIONAL([$2_AM], [test "x$build_$1" = "xyes"]) +]) + +# Main macro for configuring all optional programs +AC_DEFUN([NON_ESSENTIAL_PROGRAMS_TO_BE_COMPILED], +[ + AC_MSG_NOTICE([Checking for additional programs]) + + # Check if we should build all programs + build_all="yes" + AC_ARG_ENABLE(build-all, + AS_HELP_STRING([--disable-build-all], [only build essential and requested programs]), + [AS_IF([test "x$enable_build_all" = "xno"], + [build_all="no" + AC_MSG_NOTICE([Building only essential and requested programs])])]) + + AC_MSG_NOTICE([Checking for additional programs 1]) + + # Define all optional programs using the macro + # Format: CISTEM_OPTIONAL_PROGRAM([internal_name], [CONDITIONAL_NAME], [display_name]) + + CISTEM_OPTIONAL_PROGRAM([applyctf], [ENABLE_APPLYCTF], [applyctf]) + CISTEM_OPTIONAL_PROGRAM([project3d], [ENABLE_PROJECT3D], [project3D]) + CISTEM_OPTIONAL_PROGRAM([calc_occ], [ENABLE_CALCOCC], [calc_occ]) + CISTEM_OPTIONAL_PROGRAM([remove_outlier_pixels], [ENABLE_REMOVEOUTLIERPIXELS], [remove_outlier_pixels]) + CISTEM_OPTIONAL_PROGRAM([resize], [ENABLE_RESIZE], [resize]) + CISTEM_OPTIONAL_PROGRAM([resample], [ENABLE_RESAMPLE], [resample]) + CISTEM_OPTIONAL_PROGRAM([reset_mrc_header], [ENABLE_RESETMRCHEADER], [reset_mrc_header]) + CISTEM_OPTIONAL_PROGRAM([estimate_dataset_ssnr], [ENABLE_ESTIMATEDATASETSSNR], [estimate_dataset_ssnr]) + CISTEM_OPTIONAL_PROGRAM([montage], [ENABLE_MONTAGE], [montage]) + CISTEM_OPTIONAL_PROGRAM([extract_particles], [ENABLE_EXTRACTPARTICLES], [extract_particles]) + CISTEM_OPTIONAL_PROGRAM([sum_all_mrc_files], [ENABLE_SUMALLMRCFILES], [sum_all_mrc_files]) + CISTEM_OPTIONAL_PROGRAM([sum_all_tif_files], [ENABLE_SUMALLTIFFILES], [sum_all_tif_files]) + CISTEM_OPTIONAL_PROGRAM([sum_all_eer_files], [ENABLE_SUMALLEERFILES], [sum_all_eer_files]) + CISTEM_OPTIONAL_PROGRAM([apply_gain_ref], [ENABLE_APPLYGAINREF], [apply_gain_ref]) + CISTEM_OPTIONAL_PROGRAM([scale_with_mask], [ENABLE_SCALEWITHMASK], [scale_with_mask]) + CISTEM_OPTIONAL_PROGRAM([mag_distortion_correct], [ENABLE_MAGDISTORTIONCORRECT], [mag_distortion_correct]) + CISTEM_OPTIONAL_PROGRAM([apply_mask], [ENABLE_APPLYMASK], [apply_mask]) + CISTEM_OPTIONAL_PROGRAM([convert_tif_to_mrc], [ENABLE_CONVERTTIFTOMRC], [convert_tif_to_mrc]) + CISTEM_OPTIONAL_PROGRAM([remove_inf_and_nan], [ENABLE_REMOVEINFANDNAN], [remove_inf_and_nan]) + CISTEM_OPTIONAL_PROGRAM([make_orth_views], [ENABLE_MAKEORTHVIEWS], [make_orth_views]) + CISTEM_OPTIONAL_PROGRAM([sharpen_map], [ENABLE_SHARPENMAP], [sharpen_map]) + CISTEM_OPTIONAL_PROGRAM([calculate_fsc], [ENABLE_CALCULATEFSC], [calculate_fsc]) + CISTEM_OPTIONAL_PROGRAM([make_size_map], [ENABLE_MAKESIZEMAP], [make_size_map]) + CISTEM_OPTIONAL_PROGRAM([convert_par_to_star], [ENABLE_CONVERTPARTOSTAR], [convert_par_to_star]) + CISTEM_OPTIONAL_PROGRAM([subtract_from_stack], [ENABLE_SUBTRACTFROMSTACK], [subtract_from_stack]) + CISTEM_OPTIONAL_PROGRAM([binarize], [ENABLE_BINARIZE], [binarize]) + CISTEM_OPTIONAL_PROGRAM([move_volume_xyz], [ENABLE_MOVEVOLUMEXYZ], [move_volume_xyz]) + CISTEM_OPTIONAL_PROGRAM([symmetry_expand_stack_and_par], [ENABLE_SYMMETRYEXPANDSTACKANDPAR], [symmetry_expand_stack_and_par]) + CISTEM_OPTIONAL_PROGRAM([subtract_two_stacks], [ENABLE_SUBTRACTTWOSTACKS], [subtract_two_stacks]) + CISTEM_OPTIONAL_PROGRAM([add_two_stacks], [ENABLE_ADDTWOSTACKS], [add_two_stacks]) + CISTEM_OPTIONAL_PROGRAM([multiply_two_stacks], [ENABLE_MULTIPLYTWOSTACKS], [multiply_two_stacks]) + CISTEM_OPTIONAL_PROGRAM([divide_two_stacks], [ENABLE_DIVIDETWOSTACKS], [divide_two_stacks]) + CISTEM_OPTIONAL_PROGRAM([invert_stack], [ENABLE_INVERTSTACK], [invert_stack]) + CISTEM_OPTIONAL_PROGRAM([align_coordinates], [ENABLE_ALIGNCOORDINATES], [align_coordinates]) + CISTEM_OPTIONAL_PROGRAM([align_symmetry], [ENABLE_ALIGNSYMMETRY], [align_symmetry]) + CISTEM_OPTIONAL_PROGRAM([find_dqe], [ENABLE_FINDDQE], [find_dqe]) + CISTEM_OPTIONAL_PROGRAM([combine_via_max], [ENABLE_COMBINEVIAMAX], [combine_via_max]) + CISTEM_OPTIONAL_PROGRAM([remove_relion_stripes], [ENABLE_REMOVERELIONSTRIPES], [remove_relion_stripes]) + CISTEM_OPTIONAL_PROGRAM([create_mask], [ENABLE_CREATEMASK], [create_mask]) + CISTEM_OPTIONAL_PROGRAM([invert_hand], [ENABLE_INVERTHAND], [invert_hand]) + CISTEM_OPTIONAL_PROGRAM([append_stacks], [ENABLE_APPENDSTACKS], [append_stacks]) + CISTEM_OPTIONAL_PROGRAM([convert_star_to_binary], [ENABLE_CONVERTSTARTOBINARY], [convert_star_to_binary]) + CISTEM_OPTIONAL_PROGRAM([convert_binary_to_star], [ENABLE_CONVERTBINARYTOSTAR], [convert_binary_to_star]) + CISTEM_OPTIONAL_PROGRAM([convert_eer_to_mrc], [ENABLE_CONVERTEERTOMRC], [convert_eer_to_mrc]) + CISTEM_OPTIONAL_PROGRAM([azimuthal_average], [ENABLE_AZIMUTHALAVERAGE], [azimuthal_average]) + CISTEM_OPTIONAL_PROGRAM([normalize_stack], [ENABLE_NORMALIZESTACK], [normalize_stack]) + CISTEM_OPTIONAL_PROGRAM([print_stack_statistics], [ENABLE_PRINTSTACKSTATISTICS], [print_stack_statistics]) + CISTEM_OPTIONAL_PROGRAM([combine_stacks_by_star], [ENABLE_COMBINESTACKSBYSTAR], [combine_stacks_by_star]) + CISTEM_OPTIONAL_PROGRAM([measure_template_bias], [ENABLE_MEASURETEMPLATEBIAS], [measure_template_bias]) + CISTEM_OPTIONAL_PROGRAM([align_nmr_spectra], [ENABLE_ALIGNNMRSPECTRA], [align_nmr_spectra]) + CISTEM_OPTIONAL_PROGRAM([correlate_nmr_spectra], [ENABLE_CORRELATENMRSPECTRA], [correlate_nmr_spectra]) + CISTEM_OPTIONAL_PROGRAM([filter_images], [ENABLE_FILTERIMAGES], [filter_images]) + + # Special case: calculate_template_pvalue needs Eigen library check + use_Eigen="no" + want_calculate_template_pvalue="no" + + AS_IF([test "x$build_all" = "xyes"], + [want_calculate_template_pvalue="yes"], + [want_calculate_template_pvalue="no"]) + + AC_ARG_ENABLE(build-calculate-template-pvalue, + AS_HELP_STRING([--enable-build-calculate-template-pvalue], [build calculate_template_pvalue @<:@default="no"@:>@]), + [AS_IF([test "x$enableval" = "xyes"], + [want_calculate_template_pvalue="yes"])]) + + # Only check for Eigen if we actually want to build calculate_template_pvalue + AS_IF([test "x$want_calculate_template_pvalue" = "xyes"], + [AC_MSG_NOTICE([Checking for Eigen v3.4.0 or later]) + AC_CHECK_FILE("$TOPSRCDIR/include/Eigen/Dense", + [use_Eigen="yes"], + [use_Eigen="no"]) + + AS_IF([test "x$use_Eigen" = "xyes"], + [build_calculate_template_pvalue="yes" + AC_MSG_NOTICE([Building calculate_template_pvalue])], + [build_calculate_template_pvalue="no" + AC_MSG_NOTICE([Eigen is required to build calculate_template_pvalue. Please install Eigen v3.4.0 or configure without --enable-build-calculate-template-pvalue])])], + [build_calculate_template_pvalue="no"]) + + AM_CONDITIONAL([ENABLE_CALCULATETEMPLATEPVALUE_AM], [test "x$build_calculate_template_pvalue" = "xyes"]) +]) + +dnl COMMENTED EXAMPLE OF ORIGINAL PATTERN (DO NOT USE - SHOWN FOR REFERENCE ONLY) +dnl This shows how each program was originally defined with ~12 lines of repetitive code. +dnl The new CISTEM_OPTIONAL_PROGRAM macro above replaces all this boilerplate. +dnl +dnl AS_IF([test "x$build_all" = "xyes"], [build_apply_ctf="yes"], [build_apply_ctf="no"]) +dnl AC_ARG_ENABLE(build-applyctf, AS_HELP_STRING([--enable-build-applyctf],[build applyctf [default="no"]]),[ +dnl if test "x$enableval" = "xyes"; then +dnl build_apply_ctf=yes +dnl AC_MSG_NOTICE([Building applyctf]) +dnl fi +dnl ]) +dnl AM_CONDITIONAL([ENABLE_APPLYCTF_AM], [test "x$build_apply_ctf" = "xyes"]) +dnl +dnl NOTE: one newline is needed at the end of this file for autoconf to work correctly diff --git a/ax_cuda.m4 b/m4/ax_cuda.m4 similarity index 99% rename from ax_cuda.m4 rename to m4/ax_cuda.m4 index ef717d8db..f809c9a1f 100644 --- a/ax_cuda.m4 +++ b/m4/ax_cuda.m4 @@ -63,7 +63,7 @@ if test "$want_cuda" = "yes" ; then libdir=lib64 # set CUDA flags for static compilation. This is required for cufft callbacks. - if test "x$static_link" == "xtrue" + if test "x$static_link" = "xtrue" then AC_MSG_NOTICE([static linking of cuda libs]) CUDA_CFLAGS="-I$cuda_home_path/include " @@ -198,7 +198,7 @@ else fi -if test "x$is_cuda_ge_11" == "x1" ; then +if test "x$is_cuda_ge_11" = "x1" ; then AC_MSG_NOTICE([CUDA >= 11.0, enabling --extra-device-vectorization]) NVCCFLAGS+=" --extra-device-vectorization -std=c++17 --expt-relaxed-constexpr --threads=8 --split-compile=8 " else diff --git a/m4/libtorch.m4 b/m4/libtorch.m4 new file mode 100644 index 000000000..89c4fa6a7 --- /dev/null +++ b/m4/libtorch.m4 @@ -0,0 +1,102 @@ +# LibTorch configuration for cisTEM +# +# This macro configures LibTorch support for machine learning-based tools +# such as blush regularization for cryo-EM density map denoising. +# +# LibTorch libraries are dynamically linked (even in static builds) and +# bundled with the distribution using RPATH for easy deployment. +# +# Configuration: +# --enable-libtorch : Enable LibTorch support (opt-in, ML tools available) +# LIBTORCH_ROOT= : Specify LibTorch installation path (default: /opt/libtorch) +# +# Output variables: +# LIBTORCH_CXX_FLAGS : C++ flags for LibTorch include paths +# LIBTORCH_LIBS : Libraries to link (-ltorch -ltorch_cpu -lc10) +# LIBTORCH_RPATH : RPATH flags for runtime library location +# use_libtorch : "yes" or "no" indicating if LibTorch is available +# +# Preprocessor defines: +# cisTEM_USING_LIBTORCH : Defined when LibTorch is available +# +# Automake conditionals: +# ENABLE_LIBTORCH_AM : Set to true when LibTorch is enabled + +AC_DEFUN([AX_LIBTORCH], +[ + use_libtorch="no" + LIBTORCH_CXX_FLAGS="" + LIBTORCH_LIBS="" + LIBTORCH_RPATH="" + + # Check if user wants to enable libtorch (opt-in) + AC_ARG_ENABLE(libtorch, + AS_HELP_STRING([--enable-libtorch], [Use LibTorch for ML-based tools @<:@default=no@:>@]), + [AS_IF([test "x$enableval" = "xyes"], + [use_libtorch="yes" + AC_MSG_NOTICE([LibTorch support requested by user])], + [AS_IF([test "x$enableval" = "xno"], + [AC_MSG_ERROR([LibTorch is disabled by default. Specifying --disable-libtorch breaks the configuration. If you want to enable LibTorch, please configure with --enable-libtorch])])])], + [AC_MSG_NOTICE([LibTorch support not requested (use --enable-libtorch to enable)])]) + + AS_IF([test "x$use_libtorch" = "xyes"], + [ + # Check if LIBTORCH_ROOT is set, otherwise try /opt/libtorch + AS_IF([test "x$LIBTORCH_ROOT" = "x"], + [LIBTORCH_ROOT="/opt/libtorch"]) + + AC_MSG_NOTICE([Checking for LibTorch in $LIBTORCH_ROOT]) + + # Check if libtorch exists (torch.h is in csrc/api/include subdirectory) + AC_CHECK_FILE(["$LIBTORCH_ROOT/include/torch/csrc/api/include/torch/torch.h"], + [ + HAVE_LIBTORCH="yes" + AC_MSG_NOTICE([LibTorch found at $LIBTORCH_ROOT]) + ], + [ + HAVE_LIBTORCH="no" + use_libtorch="no" + AC_MSG_WARN([LibTorch not found at $LIBTORCH_ROOT. ML-based tools will not be available.]) + AC_MSG_WARN([To enable LibTorch: set LIBTORCH_ROOT=/path/to/libtorch or install to /opt/libtorch]) + ]) + + AS_IF([test "x$HAVE_LIBTORCH" = "xyes"], + [ + # Define preprocessor macro for conditional compilation + AC_DEFINE([cisTEM_USING_LIBTORCH], [], [Use LibTorch for ML-based tools]) + + # Set include paths as flags (not directly modifying CPPFLAGS/CXXFLAGS) + # Following FastFFT pattern: programs that need LibTorch will use LIBTORCH_CXX_FLAGS + LIBTORCH_CXX_FLAGS="-I${LIBTORCH_ROOT}/include -I${LIBTORCH_ROOT}/include/torch/csrc/api/include" + + # Warn about static linking issues + AS_IF([test "x$static_link" = "xtrue"], + [AC_MSG_WARN([Static linking with LibTorch is not recommended by PyTorch developers.]) + AC_MSG_WARN([LibTorch will be dynamically linked even in static build mode.])]) + + # Always use dynamic linking for libtorch (even in static builds) + # Order matters: torch depends on torch_cpu, which depends on c10 + LIBTORCH_LIBS="-L${LIBTORCH_ROOT}/lib -ltorch -ltorch_cpu -lc10" + + # Set RPATH for runtime library location + # This allows the executable to find libraries relative to its location + # Enables bundling the .so files with the distribution + # $ORIGIN is a special variable that expands to the directory containing the executable + LIBTORCH_RPATH="-Wl,-rpath,'\$\$ORIGIN/lib' -Wl,-rpath,'\$\$ORIGIN/../lib' -Wl,-rpath,'${LIBTORCH_ROOT}/lib'" + + AC_MSG_NOTICE([LibTorch configuration:]) + AC_MSG_NOTICE([ LIBTORCH_ROOT = $LIBTORCH_ROOT]) + AC_MSG_NOTICE([ LIBTORCH_CXX_FLAGS = $LIBTORCH_CXX_FLAGS]) + AC_MSG_NOTICE([ LIBTORCH_LIBS = $LIBTORCH_LIBS]) + AC_MSG_NOTICE([ LIBTORCH_RPATH = $LIBTORCH_RPATH]) + ]) + ]) + + # Set automake conditional for Makefile.am + AM_CONDITIONAL([ENABLE_LIBTORCH_AM], [test "x$use_libtorch" = "xyes"]) + + # Substitute variables for use in Makefile.am + AC_SUBST(LIBTORCH_CXX_FLAGS) + AC_SUBST(LIBTORCH_LIBS) + AC_SUBST(LIBTORCH_RPATH) +]) \ No newline at end of file diff --git a/submodule_FastFFT.m4 b/m4/submodule_FastFFT.m4 similarity index 100% rename from submodule_FastFFT.m4 rename to m4/submodule_FastFFT.m4 diff --git a/regenerate_containers.sh b/regenerate_containers.sh index 336c6a8b1..c9dcf1543 100755 --- a/regenerate_containers.sh +++ b/regenerate_containers.sh @@ -30,4 +30,10 @@ cd .devcontainer if [[ ! -L .devcontainer.json ]] ; then ln -s ../.vscode/devcontainer.json .devcontainer.json fi -cd .. \ No newline at end of file +cd .. + +# Install clang-format-14 pre-commit hook +if [ -f scripts/install_clang_format_hook.sh ]; then + echo "Installing clang-format-14 pre-commit hook..." + ./scripts/install_clang_format_hook.sh +fi \ No newline at end of file diff --git a/regenerate_project.b b/regenerate_project.b index e69d23b98..c70d7c8ee 100755 --- a/regenerate_project.b +++ b/regenerate_project.b @@ -1,10 +1,3 @@ -rm -fr m4 -mkdir m4 -cd m4 -ln -s ../ax_cuda.m4 ax_cuda.m4 -ln -s ../additional_programs.m4 additional_programs.m4 -ln -s ../submodule_FastFFT.m4 submodule_FastFFT.m4 -cd .. libtoolize --force || glibtoolize aclocal autoheader --force diff --git a/scripts/CLAUDE.md b/scripts/CLAUDE.md new file mode 100644 index 000000000..15feeca16 --- /dev/null +++ b/scripts/CLAUDE.md @@ -0,0 +1,174 @@ +# Build System and Scripts Guidelines for cisTEM + +This file provides guidance for working with cisTEM's build system and utility scripts. + +## Build System Overview + +cisTEM uses GNU Autotools as the primary build system, with CMake as an alternative. The build system handles complex dependencies including Intel MKL, CUDA, and wxWidgets. + +## Autotools Build Process + +### Project Regeneration +After modifying build system files: +```bash +# Required after changes to: +# - configure.ac +# - m4/*.m4 +# - Makefile.am files +./regenerate_project.b +``` + +### Configuration and Building +```bash +# Create build directory +mkdir -p build/intel-debug-static +cd build/intel-debug-static + +# Configure with common options +CC=icc CXX=icpc ../../configure \ + --enable-debugmode \ + --with-wx-config=/opt/WX/icc-static/bin/wx-config \ + --enable-staticmode \ + --enable-openmp + +# Build +make -j16 +``` + +### Common Configure Options +- `--enable-debugmode` - Debug build with assertions +- `--enable-staticmode` - Static linking +- `--enable-gpu` - Enable CUDA support +- `--enable-experimental` - Include experimental features +- `--enable-openmp` - OpenMP parallelization +- `--with-cuda=/usr/local/cuda` - CUDA installation path +- `--with-wx-config=/path/to/wx-config` - wxWidgets configuration + +## VS Code Integration + +### Task Configuration +Build tasks are defined in `.vscode/tasks.json`: +- `Configure cisTEM DEBUG build` - Run configure +- `BUILD cisTEM DEBUG` - Compile the project +- Various compiler/configuration combinations + +### After Making Changes +Always prompt the user to build: +``` +"Would you like me to build the project to verify these changes?" +``` + +## Docker Development Environment + +### Container Architecture +``` +scripts/containers/ +├── base_container/ # Base OS and dependencies +└── top_container/ # Development tools and environment +``` + +### Container Management +```bash +# Regenerate containers after Dockerfile changes +./regenerate_containers.sh + +# The script handles: +# - Building base and top containers +# - Setting up development environment +# - Configuring VS Code integration +``` + +## Utility Scripts + +### Project Scripts +- `regenerate_project.b` - Regenerate autotools files +- `regenerate_containers.sh` - Rebuild Docker containers +- `scripts/testing/run_tests.sh` - Execute test suite + +### Build Helper Scripts +Located in `scripts/build/`: +- Helper scripts for different build configurations +- Compiler setup scripts +- Dependency verification + +## Adding New Source Files + +### Updating Makefile.am +When adding new source files: +```makefile +# In src/gui/Makefile.am +cisTEM_SOURCES += \ + MyNewPanel.cpp \ + MyNewPanel.h + +# In src/programs/new_program/Makefile.am +new_program_SOURCES = \ + new_program.cpp \ + ../../core/core_headers.h +``` + +After updating Makefile.am: +```bash +./regenerate_project.b +# Then reconfigure and rebuild +``` + +## Testing Scripts + +### Running Tests +```bash +# Unit tests +./build/src/unit_test_runner + +# Console tests +./build/src/console_test + +# Functional tests +./build/src/samples_functional_testing +``` + +### CI Integration +GitHub Actions workflows in `.github/workflows/`: +- Define test matrices +- Specify compiler configurations +- Run automated tests + +## Performance Scripts + +### Profiling Tools +Scripts for performance analysis: +```bash +# Intel VTune profiling +scripts/profile/run_vtune.sh program_name + +# Memory usage analysis +scripts/profile/check_memory.sh program_name +``` + +## Common Issues and Solutions + +### Dependency Issues +- MKL not found: Check `MKLROOT` environment variable +- wxWidgets issues: Verify `wx-config` path +- CUDA problems: Ensure CUDA toolkit is installed + +### Build Failures +- Run `make clean` before rebuilding after configuration changes +- Delete build directory for clean rebuild +- Check compiler versions match requirements + +### Parallel Build Issues +- Some targets may have race conditions +- Use `make -j1` for debugging build issues +- Report parallel build failures for fixing + +## Best Practices + +1. **Always regenerate after build system changes** using `regenerate_project.b` +2. **Use separate build directories** for different configurations +3. **Keep build scripts simple** and well-documented +4. **Test scripts on clean checkout** to ensure reproducibility +5. **Document dependencies** in scripts +6. **Use absolute paths** in scripts when possible +7. **Add error checking** to all scripts +8. **Maintain backward compatibility** in build scripts \ No newline at end of file diff --git a/scripts/README_template_filtering.md b/scripts/README_template_filtering.md new file mode 100644 index 000000000..4323c26fd --- /dev/null +++ b/scripts/README_template_filtering.md @@ -0,0 +1,103 @@ +# Template Matching Result Filtering Scripts + +This directory contains bash scripts to filter template matching results by number of detections and add them to existing image asset groups in cisTEM projects. + +## Scripts + +### 1. `list_template_match_info.sh` + +Lists available template matching jobs and image groups from a cisTEM database to help you choose parameters. + +**Usage:** + +```bash +./list_template_match_info.sh +``` + +**Example:** + +```bash +./list_template_match_info.sh /path/to/project.db +``` + +This script will show: + +- Available template matching jobs with their IDs and number of results +- Available image asset groups +- Detection count statistics for each template matching job +- Usage examples for the filtering script + +### 2. `filter_template_matches_to_group.sh` + +Filters template matching results by minimum number of detections and adds qualifying images to an existing image asset group. + +**Usage:** + +```bash +./filter_template_matches_to_group.sh +``` + +**Parameters:** + +- `database_path`: Path to the cisTEM project database file (.db) +- `group_name`: Name of the existing image asset group to add results to +- `min_detections`: Minimum number of template match detections required +- `template_match_job_id`: Template matching job ID to filter results from + +**Example:** + +```bash +./filter_template_matches_to_group.sh /path/to/project.db "Good_Matches" 5 1 +``` + +This would add all images from template matching job #1 that have 5 or more detections to the group named "Good_Matches". + +## Workflow + +1. **First, explore your data:** + + ```bash + ./list_template_match_info.sh /path/to/your/project.db + ``` + + This will show you available template matching jobs and their detection statistics. + +2. **Create or identify a target image group** in the cisTEM GUI if needed. + +3. **Filter and add results:** + + ```bash + ./filter_template_matches_to_group.sh /path/to/your/project.db "Your_Group_Name" 10 2 + ``` + + This adds images from job #2 with 10+ detections to "Your_Group_Name". + +## Notes + +- The target image group must already exist in the database +- Images already in the target group will be skipped (no duplicates) +- The script uses SQLite transactions for safe database operations +- Detection counts are based on the `TEMPLATE_MATCH_PEAK_LIST_` tables +- All operations are logged to show which images are being added/skipped + +## Requirements + +- `sqlite3` command-line tool +- Read/write access to the cisTEM project database +- Bash shell + +## Database Schema + +The scripts work with these cisTEM database tables: + +- `TEMPLATE_MATCH_LIST`: Contains template matching job results +- `TEMPLATE_MATCH_PEAK_LIST_`: Contains detected peaks for each template match +- `IMAGE_GROUP_LIST`: Contains image group definitions +- `IMAGE_GROUP_`: Contains members of each image group +- `IMAGE_ASSETS`: Contains image asset information + +## Safety + +- Always backup your database before running these scripts +- The scripts use SQLite transactions to ensure database consistency +- Operations are logged so you can see exactly what changes are made diff --git a/scripts/containers/base_image/Dockerfile b/scripts/containers/base_image/Dockerfile index b4843346e..262f066bf 100644 --- a/scripts/containers/base_image/Dockerfile +++ b/scripts/containers/base_image/Dockerfile @@ -10,32 +10,45 @@ ARG GCC_VER=11 # By default this will create cisTEMdev as uid==1000 which is not what we want as it is also going to be the user id # of a host user when building the top layer with singularity. < 1000 is reserved for system users. 814 is a somewhat random choice. -RUN apt-get update && \ - apt-get -y install tzdata sudo && \ - ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ - apt-get install -y locales && \ - localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 && \ - useradd --uid 814 -ms /bin/bash cisTEMdev && \ - echo "cisTEMdev:cisTEMdev" | chpasswd && adduser cisTEMdev sudo && \ +RUN apt-get update &&\ + apt-get -y install tzdata sudo &&\ + ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone &&\ + apt-get install -y locales &&\ + localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 &&\ + useradd --uid 814 -ms /bin/bash cisTEMdev &&\ + echo "cisTEMdev:cisTEMdev" | chpasswd && adduser cisTEMdev sudo &&\ rm -rf /var/lib/apt/lists/* ENV LANG en_US.utf8 # Install useful ubuntu packages libwxgtk3.0-gtk3-dev libwxbase3.0-dev RUN apt-get --allow-releaseinfo-change update && apt-get install -y \ + apt-utils ca-certificates \ libgtk2.0-dev libgtk-3-dev libwxbase3.0-dev \ libtool autoconf autotools-dev nano gedit meld cmake \ libfftw3-dev libtiff-dev software-properties-common libffi-dev \ libbz2-dev libsqlite3-dev zlib1g-dev libjpeg-dev libtiff-dev \ libreadline-dev liblzma-dev libssl-dev libncursesw5-dev wget \ - build-essential git xauth zip unzip parallel sqlite3 python3 python3-pip curl gdb &&\ + build-essential git xauth zip unzip parallel sqlite3 python3 python3-pip curl gdb \ + strace htop valgrind lldb tree jq ripgrep fd-find tmux \ + linux-tools-generic sysstat shellcheck &&\ + rm -rf /var/lib/apt/lists/* + +# Install gh to work with automating interactions with the repo +RUN type -p wget >/dev/null || (apt update && apt-get install wget -y) &&\ + mkdir -p -m 755 /etc/apt/keyrings &&\ + wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null &&\ + chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg &&\ + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null &&\ + apt update &&\ + sudo apt install -y gh &&\ rm -rf /var/lib/apt/lists/* # Install clang format 14 - these goa t the end of /etc/apt/sources.list -RUN echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main" | tee -a /etc/apt/sources.list && \ - echo "deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main" | tee -a /etc/apt/sources.list && \ - wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - && \ - apt-get update && apt-get install -y clang-format-14 clang-14 clang-tidy-14 && \ +RUN echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main" | tee -a /etc/apt/sources.list &&\ + echo "deb-src http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main" | tee -a /etc/apt/sources.list &&\ + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add - &&\ + apt-get update && apt-get install -y clang-format-14 clang-14 clang-tidy-14 &&\ cd /usr/bin && ln -s clang-format-14 clang-format && ln -s clang-14 clang && ln -s clang-tidy-14 clang-tidy && ln -s clang++-14 clang++ \ && rm -rf /var/lib/apt/lists/* @@ -43,12 +56,12 @@ RUN echo "deb http://apt.llvm.org/focal/ llvm-toolchain-focal-14 main" | tee -a # Get the MKL and intel compiler: note, this is 19G by default, will try to determine minimal set needed huge waste but works well enough for now, final size is ~5gb # The second to last line is to ensure clang++ is used and not the one bundled with the intel compiler. -RUN wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null && \ - echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | tee /etc/apt/sources.list.d/oneAPI.list && \ - apt-get update && apt-get install -y intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic-2021.4.0 intel-oneapi-mkl-2021.4.0 intel-oneapi-mkl-devel-2021.4.0 && \ - cd /opt/intel/oneapi/ && rm -rf debugger/ conda_channel/ mkl/latest/lib/intel64/*_sycl* compiler/2021.4.0/linux/lib/oclfpga && \ - mkdir -p /opt/intel && echo 'int mkl_serv_intel_cpu_true() {return 1;}' > /opt/intel/fakeIntel.c && \ - gcc -shared -fPIC -o /opt/intel/libfakeIntel.so /opt/intel/fakeIntel.c && \ +RUN wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null &&\ + echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | tee /etc/apt/sources.list.d/oneAPI.list &&\ + apt-get update && apt-get install -y intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic-2021.4.0 intel-oneapi-mkl-2021.4.0 intel-oneapi-mkl-devel-2021.4.0 &&\ + cd /opt/intel/oneapi/ && rm -rf debugger/ conda_channel/ mkl/latest/lib/intel64/*_sycl* compiler/2021.4.0/linux/lib/oclfpga &&\ + mkdir -p /opt/intel && echo 'int mkl_serv_intel_cpu_true() {return 1;}' > /opt/intel/fakeIntel.c &&\ + gcc -shared -fPIC -o /opt/intel/libfakeIntel.so /opt/intel/fakeIntel.c &&\ rm -rf /var/lib/apt/lists/* # Pre-empt the intel function that checks intel or not at runtime so that optimal codepaths may be used on AMD procs. @@ -59,44 +72,44 @@ ENV LD_PRELOAD=/opt/intel/libfakeIntel.so # Installation is deferred until the final layer so only the correct version is installed to prevent difficult to track down conflicts. # Neither will be used for the dev version 3.1.5 or 3.2 which will be linked against gtk-3 # NOTE: for now, only building with the intel-compiler. If people still are pushing gnu compiler, we can add those here. -RUN wget -q https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.5/wxWidgets-3.0.5.tar.bz2 -O /tmp/wxwidgets.tar.bz2 && \ - echo 'Building wxWidgets but deferring install' && \ - mkdir -p /opt/WX/icc-static /opt/WX/gcc-static /opt/WX/clang-static && \ - tar -xjf /tmp/wxwidgets.tar.bz2 -C /opt/WX/icc-static && \ - tar -xjf /tmp/wxwidgets.tar.bz2 -C /opt/WX/gcc-static && \ - tar -xjf /tmp/wxwidgets.tar.bz2 -C /opt/WX/clang-static && \ +RUN wget -q https://github.com/wxWidgets/wxWidgets/releases/download/v3.0.5/wxWidgets-3.0.5.tar.bz2 -O /tmp/wxwidgets.tar.bz2 &&\ + echo 'Building wxWidgets but deferring install' &&\ + mkdir -p /opt/WX/icc-static /opt/WX/gcc-static /opt/WX/clang-static &&\ + tar -xjf /tmp/wxwidgets.tar.bz2 -C /opt/WX/icc-static &&\ + tar -xjf /tmp/wxwidgets.tar.bz2 -C /opt/WX/gcc-static &&\ + tar -xjf /tmp/wxwidgets.tar.bz2 -C /opt/WX/clang-static &&\ rm -rf /tmp/wxwidgets.tar.bz2 # Here for the record if you want to build and link static binaries to avoid the cointainerized distribution # CXXFLAGS=-fPIC CFLAGS=-fPIC were specified for the static configure line, but I'm not sure that makes any sense? -RUN . /opt/intel/oneapi/setvars.sh && \ - cd /opt/WX && wget https://github.com/wxFormBuilder/wxFormBuilder/releases/download/v3.10.0/wxformbuilder_3.10.0_ubuntu-20.04_amd64.deb && \ - cd /opt/WX/icc-static/wxWidgets-3.0.5 && \ +RUN . /opt/intel/oneapi/setvars.sh &&\ + cd /opt/WX && wget https://github.com/wxFormBuilder/wxFormBuilder/releases/download/v3.10.0/wxformbuilder_3.10.0_ubuntu-20.04_amd64.deb &&\ + cd /opt/WX/icc-static/wxWidgets-3.0.5 &&\ CXXFLAGS=-fPIC CFLAGS=-fPIC CXX=icpc CC=icc ./configure --disable-precomp-headers --prefix=/opt/WX/icc-static --with-libnotify=no --disable-shared \ --without-gtkprint --with-libjpeg=builtin --with-libpng=builtin --with-libtiff=builtin --with-zlib=builtin --with-expat=builtin \ - --disable-compat28 --without-liblzma --without-libjbig --with-gtk=2 --disable-sys-libs && \ - make -j$n_threads && make install && make clean && make distclean && rm -rf /opt/WX/icc-static/wxWidgets-3.0.5 && \ - cd /opt/WX/gcc-static/wxWidgets-3.0.5 && \ + --disable-compat28 --without-liblzma --without-libjbig --with-gtk=2 --disable-sys-libs &&\ + make -j$n_threads && make install && make clean && make distclean && rm -rf /opt/WX/icc-static/wxWidgets-3.0.5 &&\ + cd /opt/WX/gcc-static/wxWidgets-3.0.5 &&\ CXXFLAGS=-fPIC CFLAGS=-fPIC CXX=g++ CC=gcc ./configure --disable-precomp-headers --prefix=/opt/WX/gcc-static --with-libnotify=no --disable-shared \ --without-gtkprint --with-libjpeg=builtin --with-libpng=builtin --with-libtiff=builtin --with-zlib=builtin --with-expat=builtin \ - --disable-compat28 --without-liblzma --without-libjbig --with-gtk=2 --disable-sys-libs && \ - make -j$n_threads && make install && make clean && make distclean && rm -rf /opt/WX/gcc-static/wxWidgets-3.0.5 && \ - cd /opt/WX/clang-static/wxWidgets-3.0.5 && \ + --disable-compat28 --without-liblzma --without-libjbig --with-gtk=2 --disable-sys-libs &&\ + make -j$n_threads && make install && make clean && make distclean && rm -rf /opt/WX/gcc-static/wxWidgets-3.0.5 &&\ + cd /opt/WX/clang-static/wxWidgets-3.0.5 &&\ CXXFLAGS=-fPIC CFLAGS=-fPIC CXX=clang++ CC=clang ./configure --disable-precomp-headers --prefix=/opt/WX/clang-static --with-libnotify=no --disable-shared \ --without-gtkprint --with-libjpeg=builtin --with-libpng=builtin --with-libtiff=builtin --with-zlib=builtin --with-expat=builtin \ - --disable-compat28 --without-liblzma --without-libjbig --with-gtk=2 --disable-sys-libs && \ - make -j$n_threads && make install && make clean && make distclean && rm -rf /opt/WX/clang-static/wxWidgets-3.0.5 && \ - tf=`tempfile` && cp /opt/WX/icc-static/include/wx-3.0/wx/longlong.h /opt/WX/icc-static/include/wx-3.0/wx/longlong.h.orig && \ - awk '{if(/#include "wx\/defs.h"/){ print $0 ;print "#include "} else print $0}' /opt/WX/icc-static/include/wx-3.0/wx/longlong.h.orig > $tf && \ - mv $tf /opt/WX/icc-static/include/wx-3.0/wx/longlong.h && \ - chmod a+r /opt/WX/icc-static/include/wx-3.0/wx/longlong.h && \ - tf=`tempfile` && cp /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h.orig && \ - awk '{if(/#include "wx\/defs.h"/){ print $0 ;print "#include "} else print $0}' /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h.orig > $tf && \ - mv $tf /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h && \ - chmod a+r /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h && \ - tf=`tempfile` && cp /opt/WX/clang-static/include/wx-3.0/wx/longlong.h /opt/WX/clang-static/include/wx-3.0/wx/longlong.h.orig && \ - awk '{if(/#include "wx\/defs.h"/){ print $0 ;print "#include "} else print $0}' /opt/WX/clang-static/include/wx-3.0/wx/longlong.h.orig > $tf && \ - mv $tf /opt/WX/clang-static/include/wx-3.0/wx/longlong.h && \ + --disable-compat28 --without-liblzma --without-libjbig --with-gtk=2 --disable-sys-libs &&\ + make -j$n_threads && make install && make clean && make distclean && rm -rf /opt/WX/clang-static/wxWidgets-3.0.5 &&\ + tf=`tempfile` && cp /opt/WX/icc-static/include/wx-3.0/wx/longlong.h /opt/WX/icc-static/include/wx-3.0/wx/longlong.h.orig &&\ + awk '{if(/#include "wx\/defs.h"/){ print $0 ;print "#include "} else print $0}' /opt/WX/icc-static/include/wx-3.0/wx/longlong.h.orig > $tf &&\ + mv $tf /opt/WX/icc-static/include/wx-3.0/wx/longlong.h &&\ + chmod a+r /opt/WX/icc-static/include/wx-3.0/wx/longlong.h &&\ + tf=`tempfile` && cp /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h.orig &&\ + awk '{if(/#include "wx\/defs.h"/){ print $0 ;print "#include "} else print $0}' /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h.orig > $tf &&\ + mv $tf /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h &&\ + chmod a+r /opt/WX/gcc-static/include/wx-3.0/wx/longlong.h &&\ + tf=`tempfile` && cp /opt/WX/clang-static/include/wx-3.0/wx/longlong.h /opt/WX/clang-static/include/wx-3.0/wx/longlong.h.orig &&\ + awk '{if(/#include "wx\/defs.h"/){ print $0 ;print "#include "} else print $0}' /opt/WX/clang-static/include/wx-3.0/wx/longlong.h.orig > $tf &&\ + mv $tf /opt/WX/clang-static/include/wx-3.0/wx/longlong.h &&\ chmod a+r /opt/WX/clang-static/include/wx-3.0/wx/longlong.h @@ -113,18 +126,19 @@ ARG CUDA_VER=12.3.2 ARG DRIVER_VER=545.23.08 # Install cuda (when the web is live) -RUN cd /tmp && wget https://developer.download.nvidia.com/compute/cuda/${CUDA_VER}/local_installers/cuda_${CUDA_VER}_${DRIVER_VER}_linux.run && \ - sh cuda_${CUDA_VER}_${DRIVER_VER}_linux.run --silent --toolkit && \ - rm cuda_${CUDA_VER}_${DRIVER_VER}_linux.run && \ +RUN cd /tmp && wget https://developer.download.nvidia.com/compute/cuda/${CUDA_VER}/local_installers/cuda_${CUDA_VER}_${DRIVER_VER}_linux.run &&\ + sh cuda_${CUDA_VER}_${DRIVER_VER}_linux.run --silent --toolkit &&\ + rm cuda_${CUDA_VER}_${DRIVER_VER}_linux.run &&\ cd /usr/local/cuda/lib64 && rm -rf libcuspars* libcusolver* libcublasLt* libnppif* nsight-compute-* nsight-systems-* nsightee_plugins # Note that for dynamic builds, the base container will be larger than the top layer because we defer removing the static cuda libs until the end -RUN echo 'alias lt="ls -lrth"' >> /home/cisTEMdev/.bashrc && \ - echo 'alias dU="du -ch --max-depth=1 | sort -h"' >> /home/cisTEMdev/.bashrc && \ - echo 'source /opt/intel/oneapi/setvars.sh' >> /home/cisTEMdev/.bashrc && \ - echo 'bind "set bell-style none"' >> /home/cisTEMdev/.bashrc && \ +RUN echo 'alias lt="ls -lrth"' >> /home/cisTEMdev/.bashrc &&\ + echo 'alias dU="du -ch --max-depth=1 | sort -h"' >> /home/cisTEMdev/.bashrc &&\ + echo 'source /opt/intel/oneapi/setvars.sh' >> /home/cisTEMdev/.bashrc &&\ + echo 'bind "set bell-style none"' >> /home/cisTEMdev/.bashrc &&\ echo 'export PATH=/usr/bin:/usr/local/cuda/bin:$PATH' >> /home/cisTEMdev/.bashrc + diff --git a/scripts/containers/create_containers.sh b/scripts/containers/create_containers.sh index 2194168e3..983d12bd8 100755 --- a/scripts/containers/create_containers.sh +++ b/scripts/containers/create_containers.sh @@ -36,11 +36,14 @@ if [[ $1 == "-h" || $1 == "--help" ]] ; then echo " --compiler: icpc or g++, default is icpc [g++ builds not supported yet]" echo " --build-type: static or dynamic, default is static [BUT only dynamic is supported for --wx-version dev]" echo " --npm: build npm, default is false if not specified" + echo " --claude: build claude, default is false if not specified" + echo " --skip-libtorch: default is true to include libtorch dynamic libraries for blush imple if not specified" echo " --ref-images: build reference images, default is true if not specified" + echo " --skip-docs: skip including depenencies for the new docs system, default is false if not specified" echo " --tag-suffix: to append to the image tag" echo "" echo "For example, to build the base image without cache, and the top image with wxWidgets 3.1.5, g++, dynamic, npm, and ref-images:" - echo " build_base.sh base --no-cache --wx-version=dev --compiler=g++ --npm --ref-images" + echo " create_containers.sh base --no-cache --wx-version=dev --compiler=g++ --npm --ref-images" exit 0 fi @@ -87,8 +90,10 @@ build_compiler="icpc" build_wx_version="stable" build_npm="false" build_ref_images="true" -build_pytorch="false" +build_libtorch="true" +build_docs="true" tag_suffix="" +build_claude="false" while [[ $# -gt 0 ]]; do @@ -131,12 +136,20 @@ while [[ $# -gt 0 ]]; do build_npm="true" shift # past argument ;; + --claude) + build_claude="true" + shift # past argument + ;; --ref-images) build_ref_images="true" shift # past argument ;; - --pytorch) - build_pytorch="true" + --skip-libtorch) + build_libtorch="false" + shift # past argument + ;; + --skip-docs) + build_docs="false" shift # past argument ;; --tag-suffix) @@ -206,8 +219,10 @@ else echo " compiler: ${build_compiler}" echo " build type: ${build_type}" echo " npm: ${build_npm}" + echo " claude: ${build_claude}" echo " ref-images: ${build_ref_images}" - echo " pytorch: ${build_pytorch}" + echo " libtorch: ${build_libtorch}" + echo " docs system: ${build_docs}" echo " container version: ${top_container_version}" echo " container base version: ${base_container_version}" echo " container repository: ${container_repository}" @@ -222,6 +237,7 @@ else awk -v VER="base_image_v$base_container_version" -v REPO="FROM $container_repository" '{if($0 ~ "FROM fake_repo") print REPO":"VER; else print $0}' ${path_to_top_dockerfile}/Dockerfile > ${path_to_dockerfile}/Dockerfile cp ${path_to_top_dockerfile}/install*.sh ${path_to_dockerfile}/ + cp ${path_to_top_dockerfile}/../requirements.txt ${path_to_dockerfile}/ # Modify the devcontainer.json to use the correct full image, this should be soft linked from the project root to the .vscode_shared/UserName/devcontainer_VERSION.json @@ -243,5 +259,7 @@ docker build ${skip_cache} --tag ${container_repository}:${prefix}${container_ve --build-arg build_wx_version=${build_wx_version} \ --build-arg build_npm=${build_npm} \ --build-arg build_ref_images=${build_ref_images} \ - --build-arg build_pytorch=${build_pytorch} \ + --build-arg build_libtorch=${build_libtorch} \ + --build-arg build_docs=${build_docs} \ + --build-arg build_claude=${build_claude} \ ${path_to_dockerfile} \ No newline at end of file diff --git a/scripts/containers/requirements.txt b/scripts/containers/requirements.txt new file mode 100644 index 000000000..6d8462238 --- /dev/null +++ b/scripts/containers/requirements.txt @@ -0,0 +1,37 @@ +# Python packages for cisTEM development and automation +# Core scientific computing +numpy>=1.24.0 +scipy>=1.10.0 +pandas>=2.0.0 +matplotlib>=3.7.0 + +# Cryo-EM specific +mrcfile>=1.4.0 +starfile>=0.5.0 + +# Data formats and utilities +h5py>=3.8.0 +toml>=0.10.2 +pyyaml>=6.0 + +# Image processing +pillow>=10.0.0 + +# Networking and web +requests>=2.31.0 +gdown>=4.7.0 + +# CLI and automation +tqdm>=4.65.0 +click>=8.1.0 +ipython>=8.12.0 + +# Code quality and testing +pytest>=7.4.0 +black>=23.0.0 + +# Machine learning (optional but useful) +scikit-learn>=1.3.0 + +# For 2DTM post processing +joblib>=1.3.0 \ No newline at end of file diff --git a/scripts/containers/top_image/Dockerfile b/scripts/containers/top_image/Dockerfile index b7b859a0c..7b7d2149e 100644 --- a/scripts/containers/top_image/Dockerfile +++ b/scripts/containers/top_image/Dockerfile @@ -23,21 +23,39 @@ ARG build_compiler="icpc" ARG build_wx_version="stable" ARG build_npm="false" ARG build_ref_images="false" +ARG build_claude="false" +ARG build_libtorch="true" +ARG build_docs="true" SHELL ["/bin/bash", "-c"] # some rebuild comment ENV CISTEM_REF_IMAGES=/cisTEMdev/cistem_reference_images +# We need a more recent python so we'll put that in a virtual environment at /opt/venv +# Copy the script into the image +COPY install_python_310_venv.sh /tmp/ +RUN bash /tmp/install_python_310_venv.sh && rm -f /tmp/install_python_310_venv.sh + +# Default shell uses the venv Python for subsequent RUN steps +ENV VIRTUAL_ENV=/opt/venv +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# Verify +RUN python --version && pip --version + # Install wxWidgets -COPY install_wx_3.1.5.sh install_node_16.sh /tmp/ +COPY install_wx_3.1.5.sh install_node_16.sh install_node_22_and_claude.sh requirements.txt install_libtorch.sh install_documentation_tooling.sh /tmp/ # If we do not do this, we want to link the static or dynamic libs from /opt/WX to /usr/bin so we don't need to set it on configure lines and also so that wxformbuilder can find them RUN echo "checking for wxWidgets 3.1.5" && if [[ "x${build_wx_version}" == "xdev" ]]; then /tmp/install_wx_3.1.5.sh ; else echo "linking the (${build_type}) wx-config system wide" && ln -sf /opt/WX/icc-${build_type}/bin/wx-config /usr/bin/wx-config ; fi +# Install Python packages from requirements.txt +RUN pip3 install -r /tmp/requirements.txt + # Get reference images for testing and debugging -RUN mkdir -p /opt && pip3 install gdown toml mrcfile numpy matplotlib scipy && cd /opt && gdown --fuzzy https://drive.google.com/file/d/12OiZIkfm4YF61lJo5-EEVc264pYD13OJ/view?usp=sharing && tar -xjvf FastFFT_forBuild.tar.bz2 && rm FastFFT_forBuild.tar.bz2 && mv FastFFT_forBuild /opt/FastFFT -RUN if [[ "x${build_ref_images}" == "xtrue" ]]; then mkdir -p /cisTEMdev && pip3 install gdown toml mrcfile numpy matplotlib scipy && cd /cisTEMdev && gdown --fuzzy https://drive.google.com/file/d/197sE_pO4FWmjCo0zlqRJXAxN2BLbmHS_/view?usp=sharing && tar -xjvf cistem_reference_images_fp32.tar.bz2 && rm cistem_reference_images_fp32.tar.bz2 ;fi +RUN mkdir -p /opt && cd /opt && gdown --fuzzy https://drive.google.com/file/d/12OiZIkfm4YF61lJo5-EEVc264pYD13OJ/view?usp=sharing && tar -xjvf FastFFT_forBuild.tar.bz2 && rm FastFFT_forBuild.tar.bz2 && mv FastFFT_forBuild /opt/FastFFT +RUN if [[ "x${build_ref_images}" == "xtrue" ]]; then mkdir -p /cisTEMdev && cd /cisTEMdev && gdown --fuzzy https://drive.google.com/file/d/197sE_pO4FWmjCo0zlqRJXAxN2BLbmHS_/view?usp=sharing && tar -xjvf cistem_reference_images_fp32.tar.bz2 && rm cistem_reference_images_fp32.tar.bz2 ;fi # Will this work with wx 3.0.5? @@ -51,8 +69,9 @@ RUN cd /opt/WX && \ # # Install Node 16 RUN echo "build npm" && if [[ "x${build_npm}" == "xtrue" ]] ; then /tmp/install_node_16.sh ; fi -# TODO: this flag doesn't exist in the build script. Relocating from the base image to the top image -RUN if [[ "x${build_pytorch}" == "xtrue" ]]; then cd /tmp && wget https://download.pytorch.org/libtorch/cu113/libtorch-cxx11-abi-shared-with-deps-1.11.0%2Bcu113.zip && unzip libtorch-cxx11-abi-shared-with-deps-1.11.0+cu113.zip && rm libtorch-cxx11-abi-shared-with-deps-1.11.0+cu113.zip && mv libtorch /opt ; fi +# Download and install LibTorch 2.5.0 CPU-only (cxx11 ABI for compatibility with GCC 11+) +# This is required for blush regularization and other ML-based tools +RUN if [[ "x${build_libtorch}" == "xtrue" ]]; then echo "installing lib torch" && /tmp/install_libtorch.sh ; else echo "NOT installing libtorch" ; fi # Include the lib path in LD_RUN_PATH so on linking, the correct path is known @@ -65,7 +84,12 @@ 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 +RUN echo 'source /opt/venv/bin/activate' >> /home/cisTEMdev/.bashrc + +RUN if [[ "x${build_docs}" == "xtrue" ]] ; then /tmp/install_documentation_tooling.sh ; fi USER cisTEMdev WORKDIR /home/cisTEMdev + +RUN echo "set filename-display basename" > /home/cisTEMdev/.gdbinit +RUN echo "build claude" && if [[ "x${build_claude}" == "xtrue" ]] ; then /tmp/install_node_22_and_claude.sh ; fi \ No newline at end of file diff --git a/scripts/containers/top_image/install_documentation_tooling.sh b/scripts/containers/top_image/install_documentation_tooling.sh new file mode 100755 index 000000000..b8c93382e --- /dev/null +++ b/scripts/containers/top_image/install_documentation_tooling.sh @@ -0,0 +1,170 @@ +#!/bin/bash +set -e # Exit on any error + +# install_documentation_deps.sh - Install all documentation system dependencies +# Designed for Ubuntu Docker containers +# Assumes: Python 3.10 venv at /opt/venv, clang-14 already installed in base image + +echo "🚀 Installing Documentation System Dependencies" +echo "==============================================" + +# Color codes for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Function to print colored output +print_status() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Verify we're using the venv +print_status "Verifying Python venv..." +if [[ "$VIRTUAL_ENV" != "/opt/venv" ]]; then + print_error "VIRTUAL_ENV not set to /opt/venv (current: $VIRTUAL_ENV)" + exit 1 +fi + +print_status "Using Python: $(which python) ($(python --version))" +print_status "Using pip: $(which pip) ($(pip --version))" + +# Update package lists +print_status "Updating package lists..." +export DEBIAN_FRONTEND=noninteractive +apt-get update -qq + +# Install ONLY additional dependencies not in base image +print_status "Installing additional build dependencies for documentation..." +apt-get install -y \ + libyaml-dev \ + libopenjp2-7-dev \ + libwebp-dev \ + libclang-14-dev \ + libclang-common-14-dev \ + libclang1-14 + +# Install documentation-specific Python packages using venv pip +print_status "Installing Python documentation packages..." + +# Core MkDocs and extensions +pip install \ + "mkdocs>=1.5.0" \ + "mkdocs-material>=9.0.0" \ + "mkdocstrings[python]>=0.20.0" \ + "mkdocs-git-revision-date-localized-plugin" \ + "mkdocs-minify-plugin" \ + "mkdocs-autorefs" \ + "pymdown-extensions" + +# AST parsing and C++ documentation +pip install \ + "libclang>=16.0.0" \ + "pyyaml>=6.0" \ + "jinja2>=3.0.0" \ + "click>=8.0.0" + +# Additional useful packages +pip install \ + "pre-commit>=3.0.0" \ + "pytest>=7.0.0" \ + "black" \ + "flake8" \ + "mypy" \ + "isort" + +# JSON and data processing +pip install \ + "jsonschema>=4.0.0" \ + "pydantic>=2.0.0" \ + "requests>=2.28.0" + +# Install Git LFS (for large documentation assets) - Note: git already installed in base image +print_status "Installing Git LFS..." +curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash +apt-get install -y git-lfs + +# Configure Git for container use (Note: git already configured in base image, but safe to re-configure) +print_status "Configuring Git..." +git config --global init.defaultBranch main +git config --global pull.rebase false +git config --global safe.directory '*' + +# Set up environment variables for libclang +print_status "Setting up environment variables..." +export LLVM_CONFIG=/usr/bin/llvm-config-14 +export CLANG_LIBRARY_PATH=/usr/lib/llvm-14/lib +export LIBCLANG_PATH=/usr/lib/llvm-14/lib/libclang.so.1 + +# Add environment variables to .bashrc for cisTEMdev user +cat >> /home/cisTEMdev/.bashrc << 'EOF' + +# Documentation system environment variables +export LLVM_CONFIG=/usr/bin/llvm-config-14 +export CLANG_LIBRARY_PATH=/usr/lib/llvm-14/lib +export LIBCLANG_PATH=/usr/lib/llvm-14/lib/libclang.so.1 +EOF + +# Test the installation +print_status "Testing installation..." + +# Test Python packages (using venv python) +python -c " +import sys +packages = [ + 'mkdocs', 'material', 'mkdocstrings', + 'yaml', 'jinja2', 'clang.cindex', 'jsonschema' +] +failed = [] +for pkg in packages: + try: + __import__(pkg) + print(f'✅ {pkg}') + except ImportError as e: + print(f'❌ {pkg}: {e}') + failed.append(pkg) + +if failed: + print(f'\n⚠️ Failed to import: {failed}') + sys.exit(1) +else: + print('\n🎉 All Python packages successfully imported!') +" + +# Test clang (already installed in base image, symlinks exist) +print_status "Testing Clang installation..." +clang --version || print_warning "Clang test failed" + +# Test mkdocs (installed via venv pip) +print_status "Testing MkDocs installation..." +mkdocs --version || print_warning "MkDocs test failed" + +# Clean up to reduce image size +print_status "Cleaning up to reduce image size..." +apt-get autoremove -y +apt-get autoclean +rm -rf /var/lib/apt/lists/* +pip cache purge + +print_success "Documentation system dependencies installed successfully!" +print_status "Available tools:" +echo " - Python $(python --version | cut -d' ' -f2) (venv at $VIRTUAL_ENV)" +echo " - Clang $(clang --version | head -n1 | cut -d' ' -f3)" +echo " - MkDocs $(mkdocs --version)" +echo " - Git $(git --version | cut -d' ' -f3)" + +print_status "Libclang environment variables added to .bashrc" +print_status "Ready for documentation development! 🚀" diff --git a/scripts/containers/top_image/install_libtorch.sh b/scripts/containers/top_image/install_libtorch.sh new file mode 100755 index 000000000..c9b89b4ff --- /dev/null +++ b/scripts/containers/top_image/install_libtorch.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -eo pipefail + +cd /tmp && \ +wget https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-2.5.0%2Bcpu.zip -O libtorch.zip && \ +unzip -q libtorch.zip && \ +rm libtorch.zip && \ +mv libtorch /opt/libtorch \ No newline at end of file diff --git a/scripts/containers/top_image/install_node_22_and_claude.sh b/scripts/containers/top_image/install_node_22_and_claude.sh new file mode 100755 index 000000000..89ce1e8fa --- /dev/null +++ b/scripts/containers/top_image/install_node_22_and_claude.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# For claude code. + +# Download and install nvm: +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash + +# in lieu of restarting the shell +. "$HOME/.nvm/nvm.sh" + +# Download and install Node.js: +nvm install 22 + +# Verify the Node.js version: +node -v # Should print "v22.19.0". + +# Verify npm version: +npm -v # Should print "10.9.3". + +# Install the Claude Code CLI globally using npm: +npm install -g @anthropic-ai/claude-code \ No newline at end of file diff --git a/scripts/containers/top_image/install_python_310_venv.sh b/scripts/containers/top_image/install_python_310_venv.sh new file mode 100755 index 000000000..d706d7ac2 --- /dev/null +++ b/scripts/containers/top_image/install_python_310_venv.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Install prerequisites and add deadsnakes PPA (non-interactive) +export DEBIAN_FRONTEND=noninteractive +apt-get update +apt-get install -y --no-install-recommends software-properties-common ca-certificates gnupg +add-apt-repository -y ppa:deadsnakes/ppa +apt-get update + +# Install Python 3.10 and venv tooling +apt-get install -y --no-install-recommends \ + python3.10 python3.10-venv python3.10-distutils python3.10-dev + +# Create venv at /opt/venv with Python 3.10 +python3.10 -m venv /opt/venv + +# Optional: pre-upgrade pip/setuptools/wheel inside the venv +/opt/venv/bin/python -m pip install --upgrade pip setuptools wheel + +# Make venv world-readable/executable so non-root can use it (adjust as needed) +chmod -R a+rX /opt/venv diff --git a/scripts/filter_template_matches_to_group.sh b/scripts/filter_template_matches_to_group.sh new file mode 100755 index 000000000..92a528703 --- /dev/null +++ b/scripts/filter_template_matches_to_group.sh @@ -0,0 +1,130 @@ +#!/bin/bash + +# Script to filter template matching results by number of detections and add to image group +# Usage: filter_template_matches_to_group.sh + +set -e + +if [ $# -ne 4 ]; then + echo "Usage: $0 " + echo "" + echo "Arguments:" + echo " database_path : Path to the cisTEM project database file (.db)" + echo " group_name : Name of the existing image asset group to add results to" + echo " min_detections : Minimum number of template match detections required" + echo " template_match_job_id : Template matching job ID to filter results from" + echo "" + echo "Example:" + echo " $0 /path/to/project.db 'Good_Matches' 5 1" + exit 1 +fi + +DATABASE_PATH="$1" +GROUP_NAME="$2" +MIN_DETECTIONS="$3" +TEMPLATE_MATCH_JOB_ID="$4" + +# Check if database file exists +if [ ! -f "$DATABASE_PATH" ]; then + echo "Error: Database file '$DATABASE_PATH' does not exist" + exit 1 +fi + +# Check if sqlite3 is available +if ! command -v sqlite3 &> /dev/null; then + echo "Error: sqlite3 command not found. Please install sqlite3." + exit 1 +fi + +echo "Filtering template matching results..." +echo "Database: $DATABASE_PATH" +echo "Group name: $GROUP_NAME" +echo "Minimum detections: $MIN_DETECTIONS" +echo "Template match job ID: $TEMPLATE_MATCH_JOB_ID" +echo "" + +# First, check if the group exists and get its ID +GROUP_ID=$(sqlite3 "$DATABASE_PATH" "SELECT GROUP_ID FROM IMAGE_GROUP_LIST WHERE GROUP_NAME='$GROUP_NAME';" 2>/dev/null || echo "") + +if [ -z "$GROUP_ID" ]; then + echo "Error: Image group '$GROUP_NAME' does not exist." + echo "Available groups:" + sqlite3 "$DATABASE_PATH" "SELECT GROUP_ID, GROUP_NAME FROM IMAGE_GROUP_LIST ORDER BY GROUP_ID;" + exit 1 +fi + +echo "Found group '$GROUP_NAME' with ID: $GROUP_ID" + +# Get the template match IDs for the specified job +TEMPLATE_MATCH_IDS=$(sqlite3 "$DATABASE_PATH" "SELECT TEMPLATE_MATCH_ID FROM TEMPLATE_MATCH_LIST WHERE TEMPLATE_MATCH_JOB_ID=$TEMPLATE_MATCH_JOB_ID;") + +if [ -z "$TEMPLATE_MATCH_IDS" ]; then + echo "Error: No template matching results found for job ID $TEMPLATE_MATCH_JOB_ID" + echo "Available template match job IDs:" + sqlite3 "$DATABASE_PATH" "SELECT DISTINCT TEMPLATE_MATCH_JOB_ID FROM TEMPLATE_MATCH_LIST ORDER BY TEMPLATE_MATCH_JOB_ID;" + exit 1 +fi + +echo "Found $(echo "$TEMPLATE_MATCH_IDS" | wc -l) template match results for job ID $TEMPLATE_MATCH_JOB_ID" + +# Get the current maximum member number in the group +MAX_MEMBER_NUM=$(sqlite3 "$DATABASE_PATH" "SELECT COALESCE(MAX(MEMBER_NUMBER), 0) FROM IMAGE_GROUP_$GROUP_ID;" 2>/dev/null || echo "0") + +ADDED_COUNT=0 +NEXT_MEMBER_NUM=$((MAX_MEMBER_NUM + 1)) + +# Create a temporary file for batch operations +TEMP_SQL=$(mktemp) + +echo "BEGIN TRANSACTION;" > "$TEMP_SQL" + +# For each template match ID, count the peaks and add to group if meets criteria +for TM_ID in $TEMPLATE_MATCH_IDS; do + # Get the image asset ID for this template match + IMAGE_ASSET_ID=$(sqlite3 "$DATABASE_PATH" "SELECT IMAGE_ASSET_ID FROM TEMPLATE_MATCH_LIST WHERE TEMPLATE_MATCH_ID=$TM_ID;") + + # Count the number of peaks/detections for this template match + PEAK_COUNT=$(sqlite3 "$DATABASE_PATH" "SELECT COUNT(*) FROM TEMPLATE_MATCH_PEAK_LIST_$TM_ID;" 2>/dev/null || echo "0") + + if [ "$PEAK_COUNT" -ge "$MIN_DETECTIONS" ]; then + # Check if this image is already in the group + EXISTING=$(sqlite3 "$DATABASE_PATH" "SELECT COUNT(*) FROM IMAGE_GROUP_$GROUP_ID WHERE IMAGE_ASSET_ID=$IMAGE_ASSET_ID;" 2>/dev/null || echo "0") + + if [ "$EXISTING" -eq 0 ]; then + # Add to the group + echo "INSERT INTO IMAGE_GROUP_$GROUP_ID (MEMBER_NUMBER, IMAGE_ASSET_ID) VALUES ($NEXT_MEMBER_NUM, $IMAGE_ASSET_ID);" >> "$TEMP_SQL" + ADDED_COUNT=$((ADDED_COUNT + 1)) + NEXT_MEMBER_NUM=$((NEXT_MEMBER_NUM + 1)) + + # Get image asset name for logging + IMAGE_NAME=$(sqlite3 "$DATABASE_PATH" "SELECT NAME FROM IMAGE_ASSETS WHERE IMAGE_ASSET_ID=$IMAGE_ASSET_ID;") + echo "Adding image $IMAGE_ASSET_ID ($IMAGE_NAME) with $PEAK_COUNT detections" + else + IMAGE_NAME=$(sqlite3 "$DATABASE_PATH" "SELECT NAME FROM IMAGE_ASSETS WHERE IMAGE_ASSET_ID=$IMAGE_ASSET_ID;") + echo "Skipping image $IMAGE_ASSET_ID ($IMAGE_NAME) - already in group (has $PEAK_COUNT detections)" + fi + else + IMAGE_NAME=$(sqlite3 "$DATABASE_PATH" "SELECT NAME FROM IMAGE_ASSETS WHERE IMAGE_ASSET_ID=$IMAGE_ASSET_ID;") + echo "Skipping image $IMAGE_ASSET_ID ($IMAGE_NAME) - only $PEAK_COUNT detections (< $MIN_DETECTIONS)" + fi +done + +echo "COMMIT;" >> "$TEMP_SQL" + +# Execute the batch operations +if [ "$ADDED_COUNT" -gt 0 ]; then + echo "" + echo "Adding $ADDED_COUNT images to group '$GROUP_NAME'..." + sqlite3 "$DATABASE_PATH" < "$TEMP_SQL" + echo "Successfully added $ADDED_COUNT images to group '$GROUP_NAME'" +else + echo "" + echo "No images met the criteria (>= $MIN_DETECTIONS detections) or all qualifying images were already in the group" +fi + +# Clean up +rm -f "$TEMP_SQL" + +echo "" +echo "Current group '$GROUP_NAME' contains $(sqlite3 "$DATABASE_PATH" "SELECT COUNT(*) FROM IMAGE_GROUP_$GROUP_ID;") images" +echo "Done!" diff --git a/scripts/install_clang_format_hook.sh b/scripts/install_clang_format_hook.sh new file mode 100755 index 000000000..c73646d87 --- /dev/null +++ b/scripts/install_clang_format_hook.sh @@ -0,0 +1,177 @@ +#!/bin/bash +# Install clang-format-14 pre-commit hook for cisTEM development +# This script should be run from the project root or called by regenerate_containers.sh + +set -e + +# Find git directory (handles both regular repos and worktrees) +GIT_DIR=$(git rev-parse --git-dir) +HOOKS_DIR="$GIT_DIR/hooks" + +# For worktrees, git hooks go in the main repo's hooks directory +if [[ "$GIT_DIR" == *"/worktrees/"* ]]; then + # Extract main repo path from worktree git dir + MAIN_GIT_DIR=$(echo "$GIT_DIR" | sed 's|/\.git/worktrees/.*|/.git|') + HOOKS_DIR="$MAIN_GIT_DIR/hooks" +fi + +echo "Installing clang-format-14 pre-commit hook to: $HOOKS_DIR" + +# Create hooks directory if it doesn't exist +mkdir -p "$HOOKS_DIR" + +# Create pre-commit hook for clang-format checking +cat > "$HOOKS_DIR/pre-commit" << 'EOF' +#!/bin/bash +# Pre-commit hook to check C++ file formatting with clang-format-14 +# This hook checks if staged C++ files are properly formatted according to .clang-format + +# Find the project root (where .clang-format is located) +PROJECT_ROOT=$(git rev-parse --show-toplevel) +CLANG_FORMAT="clang-format-14" + +# Check if clang-format-14 is available +if ! command -v $CLANG_FORMAT &> /dev/null; then + echo "Error: clang-format-14 not found in PATH" + echo "Please install clang-format-14 or update the pre-commit hook" + exit 1 +fi + +# Check if .clang-format exists +if [ ! -f "$PROJECT_ROOT/.clang-format" ]; then + echo "Warning: .clang-format not found in project root" + echo "Skipping format check" + exit 0 +fi + +# Function to check if file should be excluded from formatting +should_exclude_file() { + local file="$1" + + # Exclude files in include/ directory (third-party headers) + if [[ "$file" == include/* ]]; then + return 0 + fi + + # Exclude files in src/gui/wxformbuilder (input .fbp files) + if [[ "$file" == src/gui/wxformbuilder/* ]]; then + return 0 + fi + + # Exclude files with ProjectX_gui in the name (generated by wxFormBuilder) + if [[ "$file" == *ProjectX_gui*.cpp ]] || [[ "$file" == *ProjectX_gui*.h ]]; then + return 0 + fi + + # Check file header for wxFormBuilder warning + if [ -f "$file" ]; then + if head -n 10 "$file" | grep -q "PLEASE DO \*NOT\* EDIT THIS FILE\|DO NOT EDIT THIS FILE\|Generated by wxFormBuilder"; then + return 0 + fi + fi + + return 1 +} + +# Get list of staged C++ and CUDA files (excluding deleted files) +STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(cpp|h|cc|cxx|hpp|cu|cuh)$' || true) + +if [ -z "$STAGED_FILES" ]; then + # No C++ files staged, nothing to check + exit 0 +fi + +echo "Checking formatting of staged C++ and CUDA files..." + +FORMAT_ISSUES=() +TEMP_DIR=$(mktemp -d) + +# Check each staged file +while IFS= read -r file; do + # Skip excluded files + if should_exclude_file "$file"; then + echo " Skipping (excluded): $file" + continue + fi + + if [ -f "$file" ]; then + # Get the formatted version + $CLANG_FORMAT "$file" > "$TEMP_DIR/$(basename $file).formatted" + + # Compare with staged version + git show ":$file" > "$TEMP_DIR/$(basename $file).staged" + + if ! diff -q "$TEMP_DIR/$(basename $file).staged" "$TEMP_DIR/$(basename $file).formatted" > /dev/null 2>&1; then + FORMAT_ISSUES+=("$file") + fi + fi +done <<< "$STAGED_FILES" + +# Clean up temp directory +rm -rf "$TEMP_DIR" + +# Report results +if [ ${#FORMAT_ISSUES[@]} -gt 0 ]; then + echo "" + echo "ERROR: The following files have formatting issues:" + for file in "${FORMAT_ISSUES[@]}"; do + echo " - $file" + done + echo "" + + # Create a convenience script to fix all issues + FIX_SCRIPT="/tmp/fix_formatting_$(date +%s).sh" + cat > "$FIX_SCRIPT" << FIXEOF +#!/bin/bash +# Auto-generated script to fix formatting issues +# Generated by pre-commit hook +set -e + +PROJECT_ROOT="$PROJECT_ROOT" +echo "Formatting files with clang-format-14..." + +FIXEOF + + for file in "${FORMAT_ISSUES[@]}"; do + echo "clang-format-14 -i \"$PROJECT_ROOT/$file\"" >> "$FIX_SCRIPT" + done + + cat >> "$FIX_SCRIPT" << 'FIXEOF' + +echo "" +echo "Files formatted successfully. Now staging changes..." +FIXEOF + + for file in "${FORMAT_ISSUES[@]}"; do + echo "git add \"$PROJECT_ROOT/$file\"" >> "$FIX_SCRIPT" + done + + cat >> "$FIX_SCRIPT" << 'FIXEOF' + +echo "" +echo "All files formatted and staged. You can now commit." +FIXEOF + + chmod +x "$FIX_SCRIPT" + + echo "A convenience script has been created to fix all formatting issues:" + echo " $FIX_SCRIPT" + echo "" + echo "Run it with:" + echo " $FIX_SCRIPT" + echo "" + echo "Or format files manually:" + echo " clang-format-14 -i " + echo " git add " + echo "" + exit 1 +fi + +echo "All staged C++ and CUDA files are properly formatted." +exit 0 +EOF + +# Make the hook executable +chmod +x "$HOOKS_DIR/pre-commit" + +echo "clang-format-14 pre-commit hook installed successfully!" diff --git a/scripts/list_template_match_info.sh b/scripts/list_template_match_info.sh new file mode 100755 index 000000000..5305917a4 --- /dev/null +++ b/scripts/list_template_match_info.sh @@ -0,0 +1,141 @@ +#!/bin/bash + +# Helper script to list available template matching jobs and image groups from a cisTEM database +# Usage: list_template_match_info.sh + +set -e + +if [ $# -ne 1 ]; then + echo "Usage: $0 " + echo "" + echo "This script lists available template matching jobs and image groups" + echo "to help you choose parameters for filter_template_matches_to_group.sh" + echo "" + echo "Arguments:" + echo " database_path : Path to the cisTEM project database file (.db)" + exit 1 +fi + +DATABASE_PATH="$1" + +# Check if database file exists +if [ ! -f "$DATABASE_PATH" ]; then + echo "Error: Database file '$DATABASE_PATH' does not exist" + exit 1 +fi + +# Check if sqlite3 is available +if ! command -v sqlite3 &> /dev/null; then + echo "Error: sqlite3 command not found. Please install sqlite3." + exit 1 +fi + +echo "=== cisTEM Database Information ===" +echo "Database: $DATABASE_PATH" +echo "" + +# List available template matching jobs +echo "=== Available Template Matching Jobs ===" +TEMPLATE_JOBS=$(sqlite3 "$DATABASE_PATH" "SELECT TEMPLATE_MATCH_JOB_ID, JOB_NAME, DATETIME_OF_RUN, COUNT(*) as NUM_RESULTS FROM TEMPLATE_MATCH_LIST GROUP BY TEMPLATE_MATCH_JOB_ID ORDER BY TEMPLATE_MATCH_JOB_ID;" 2>/dev/null || echo "") + +if [ -z "$TEMPLATE_JOBS" ]; then + echo "No template matching jobs found in database." +else + echo "Job ID | Job Name | Date/Time | Number of Results" + echo "-------|----------|-----------|------------------" + echo "$TEMPLATE_JOBS" | while IFS='|' read -r job_id job_name datetime num_results; do + printf "%-6s | %-20s | %-10s | %s\n" "$job_id" "$job_name" "$datetime" "$num_results" + done +fi + +echo "" + +# List available image groups +echo "=== Available Image Asset Groups ===" +IMAGE_GROUPS=$(sqlite3 "$DATABASE_PATH" "SELECT g.GROUP_ID, g.GROUP_NAME, COUNT(m.IMAGE_ASSET_ID) as NUM_MEMBERS FROM IMAGE_GROUP_LIST g LEFT JOIN IMAGE_GROUP_1 m ON g.GROUP_ID = 1 GROUP BY g.GROUP_ID, g.GROUP_NAME UNION SELECT g.GROUP_ID, g.GROUP_NAME, COUNT(m.IMAGE_ASSET_ID) as NUM_MEMBERS FROM IMAGE_GROUP_LIST g LEFT JOIN IMAGE_GROUP_2 m ON g.GROUP_ID = 2 GROUP BY g.GROUP_ID, g.GROUP_NAME UNION SELECT g.GROUP_ID, g.GROUP_NAME, COUNT(m.IMAGE_ASSET_ID) as NUM_MEMBERS FROM IMAGE_GROUP_LIST g LEFT JOIN IMAGE_GROUP_3 m ON g.GROUP_ID = 3 GROUP BY g.GROUP_ID, g.GROUP_NAME UNION SELECT g.GROUP_ID, g.GROUP_NAME, COUNT(m.IMAGE_ASSET_ID) as NUM_MEMBERS FROM IMAGE_GROUP_LIST g LEFT JOIN IMAGE_GROUP_4 m ON g.GROUP_ID = 4 GROUP BY g.GROUP_ID, g.GROUP_NAME UNION SELECT g.GROUP_ID, g.GROUP_NAME, COUNT(m.IMAGE_ASSET_ID) as NUM_MEMBERS FROM IMAGE_GROUP_LIST g LEFT JOIN IMAGE_GROUP_5 m ON g.GROUP_ID = 5 GROUP BY g.GROUP_ID, g.GROUP_NAME ORDER BY GROUP_ID;" 2>/dev/null || echo "") + +if [ -z "$IMAGE_GROUPS" ]; then + echo "No image groups found in database." +else + echo "Group ID | Group Name | Number of Members" + echo "---------|------------|------------------" + + # Use a simpler approach to get group info + sqlite3 "$DATABASE_PATH" "SELECT GROUP_ID, GROUP_NAME FROM IMAGE_GROUP_LIST ORDER BY GROUP_ID;" | while IFS='|' read -r group_id group_name; do + # Try to count members in the specific group table + member_count=$(sqlite3 "$DATABASE_PATH" "SELECT COUNT(*) FROM IMAGE_GROUP_$group_id;" 2>/dev/null || echo "0") + printf "%-8s | %-20s | %s\n" "$group_id" "$group_name" "$member_count" + done +fi + +echo "" + +# For each template matching job, show a summary of detection counts +echo "=== Template Match Detection Summary ===" +TEMPLATE_JOBS_SIMPLE=$(sqlite3 "$DATABASE_PATH" "SELECT DISTINCT TEMPLATE_MATCH_JOB_ID FROM TEMPLATE_MATCH_LIST ORDER BY TEMPLATE_MATCH_JOB_ID;" 2>/dev/null || echo "") + +if [ -n "$TEMPLATE_JOBS_SIMPLE" ]; then + for JOB_ID in $TEMPLATE_JOBS_SIMPLE; do + echo "Job ID $JOB_ID detection counts:" + + # Get all template match IDs for this job + TM_IDS=$(sqlite3 "$DATABASE_PATH" "SELECT TEMPLATE_MATCH_ID FROM TEMPLATE_MATCH_LIST WHERE TEMPLATE_MATCH_JOB_ID=$JOB_ID;") + + if [ -n "$TM_IDS" ]; then + TOTAL_IMAGES=0 + TOTAL_DETECTIONS=0 + MIN_DETECTIONS=999999 + MAX_DETECTIONS=0 + + for TM_ID in $TM_IDS; do + PEAK_COUNT=$(sqlite3 "$DATABASE_PATH" "SELECT COUNT(*) FROM TEMPLATE_MATCH_PEAK_LIST_$TM_ID;" 2>/dev/null || echo "0") + TOTAL_IMAGES=$((TOTAL_IMAGES + 1)) + TOTAL_DETECTIONS=$((TOTAL_DETECTIONS + PEAK_COUNT)) + + if [ "$PEAK_COUNT" -lt "$MIN_DETECTIONS" ]; then + MIN_DETECTIONS=$PEAK_COUNT + fi + if [ "$PEAK_COUNT" -gt "$MAX_DETECTIONS" ]; then + MAX_DETECTIONS=$PEAK_COUNT + fi + done + + if [ "$TOTAL_IMAGES" -gt 0 ]; then + AVG_DETECTIONS=$((TOTAL_DETECTIONS / TOTAL_IMAGES)) + echo " Images processed: $TOTAL_IMAGES" + echo " Total detections: $TOTAL_DETECTIONS" + echo " Average detections per image: $AVG_DETECTIONS" + echo " Min detections: $MIN_DETECTIONS" + echo " Max detections: $MAX_DETECTIONS" + + # Show distribution + echo " Distribution of detection counts:" + for threshold in 0 1 5 10 20 50; do + count=0 + for TM_ID in $TM_IDS; do + PEAK_COUNT=$(sqlite3 "$DATABASE_PATH" "SELECT COUNT(*) FROM TEMPLATE_MATCH_PEAK_LIST_$TM_ID;" 2>/dev/null || echo "0") + if [ "$PEAK_COUNT" -ge "$threshold" ]; then + count=$((count + 1)) + fi + done + echo " >= $threshold detections: $count images" + done + fi + fi + echo "" + done +fi + +echo "=== Usage Example ===" +echo "Based on the information above, you can use the filter script like this:" +echo "" +if [ -n "$TEMPLATE_JOBS_SIMPLE" ] && [ -n "$(sqlite3 "$DATABASE_PATH" "SELECT GROUP_NAME FROM IMAGE_GROUP_LIST LIMIT 1;" 2>/dev/null)" ]; then + FIRST_JOB=$(echo "$TEMPLATE_JOBS_SIMPLE" | head -n1) + FIRST_GROUP=$(sqlite3 "$DATABASE_PATH" "SELECT GROUP_NAME FROM IMAGE_GROUP_LIST LIMIT 1;" 2>/dev/null) + echo "./filter_template_matches_to_group.sh \"$DATABASE_PATH\" \"$FIRST_GROUP\" 5 $FIRST_JOB" + echo "" + echo "This would add all images from job $FIRST_JOB that have 5 or more detections" + echo "to the group named '$FIRST_GROUP'" +else + echo "./filter_template_matches_to_group.sh \"$DATABASE_PATH\" \"GROUP_NAME\" MIN_DETECTIONS JOB_ID" +fi diff --git a/src/Makefile.am b/src/Makefile.am index 8e8eeb2fe..cf7f39f1d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,3 +1,16 @@ +# cisTEM Makefile for src directory +# +# LibTorch Support: +# ----------------- +# Programs requiring LibTorch (e.g., blush regularization) should add to their LDADD: +# program_LDADD = libcore.a $(WX_LIBS_BASE) $(MKL_LIBS) $(LIBTORCH_LIBS) +# +# And add RPATH flags to their LDFLAGS: +# program_LDFLAGS = $(LIBTORCH_RPATH) +# +# The LIBTORCH_RPATH setting enables bundling of .so files with the distribution. +# See m4/libtorch.m4 for configuration details. + noinst_HEADERS = core/stopwatch.h \ core/asset_group.h \ core/core_headers.h \ @@ -548,9 +561,12 @@ libgpucore_OBJECTS=$(libgpucore_a_SOURCES:.cu=.o) libgpucore_a_CFLAGS = -DENABLEGPU $(CUDA_CPPFLAGS) $(WX_CPPFLAGS_BASE) libgpucore_a_CXXFLAGS = -DENABLEGPU $(CUDA_CXXFLAGS) $(WX_CXXFLAGS_BASE) -libgpucore_a_LIBADD = $(libFastFFT_OBJECTS) gpu/gpudevicecode.o +libgpucore_a_LIBADD = $(libFastFFT_OBJECTS) gpu/gpudevicecode.o libgpucore_a_AR = $(NVCC) -DENABLEGPU $(CUDA_CXXFLAGS) -lib -o +# Add SUFFIXES for CUDA compilation +SUFFIXES = .cu .o + # This line only knows about objects build from libgpucore_a_SOURCES. We have to add any others e.g. gpu/gpu_device_code.o mannually above in the LIBADD .cu.o: $(NVCC) -DENABLEGPU $(CUDA_CXXFLAGS) $(WX_CPPFLAGS_BASE) -dc -o $@ $< @@ -779,8 +795,8 @@ cisTEM_job_control_LIBTOOLFLAGS = $(LIBTOOL_FLAGS) # both codepaths with the most src code overlap as possible, for console tests # we often have to write a distinct enough version of the test for the GPU # that we just write seperate methods and use precompiler guards (one binary.) -console_test_SOURCES = programs/console_test/console_test.cpp -if WANT_CISTEM_GPU_AM +console_test_SOURCES = programs/console_test/console_test.cpp +if WANT_CISTEM_GPU_AM console_test_CXXFLAGS = -DENABLEGPU $(WX_CPPFLAGS_BASE) console_test_CPPFLAGS = -DENABLEGPU $(WX_CPPFLAGS_BASE) else @@ -788,14 +804,21 @@ console_test_CXXFLAGS = $(WX_CPPFLAGS_BASE) console_test_CPPFLAGS = $(WX_CPPFLAGS_BASE) endif +# Add LibTorch flags if enabled +if ENABLE_LIBTORCH_AM +console_test_CXXFLAGS += $(LIBTORCH_CXX_FLAGS) +console_test_CPPFLAGS += $(LIBTORCH_CXX_FLAGS) +endif + console_test_LDSTRING= if WANT_CISTEM_GPU_AM -# WANT_CISTEM_GPU_AM also implies ENABLE_FASTFFT_AM +# WANT_CISTEM_GPU_AM also implies ENABLE_FASTFFT_AM console_test_LDSTRING += libgpucore.a endif -console_test_LDADD = $(console_test_LDSTRING) libcore.a $(WX_LIBS_BASE) $(MKL_LIBS) $(CUDA_LIBS) +console_test_LDADD = $(console_test_LDSTRING) libcore.a $(WX_LIBS_BASE) $(MKL_LIBS) $(CUDA_LIBS) $(LIBTORCH_LIBS) +console_test_LDFLAGS = $(LIBTORCH_RPATH) console_test_LIBTOOLFLAGS = $(LIBTOOL_FLAGS) @@ -1344,7 +1367,6 @@ unit_test_runner_LIBTOOLFLAGS = $(LIBTOOL_FLAGS) if WANT_CISTEM_GPU_AM - gpu_devices_SUFFIXES = .cpp gpu_devices_SOURCES = programs/gpu_devices/gpu_devices.cpp gpu_devices_CXXFLAGS = -DENABLEGPU $(WX_CPPFLAGS_BASE) gpu_devices_CPPFLAGS = -DENABLEGPU $(WX_CPPFLAGS_BASE) @@ -1355,5 +1377,5 @@ endif calculate_template_pvalue_SOURCES = programs/calculate_template_pvalue/calculate_template_pvalue.cpp calculate_template_pvalue_CXXFLAGS = $(WX_CPPFLAGS_BASE) calculate_template_pvalue_CPPFLAGS = $(WX_CPPFLAGS_BASE) -calculate_template_pvalue_LDADD = libcore.a $(WX_LIBS_BASE) +calculate_template_pvalue_LDADD = libcore.a $(WX_LIBS_BASE) $(MKL_LIBS) calculate_template_pvalue_LIBTOOLFLAGS = $(LIBTOOL_FLAGS) diff --git a/src/core/CLAUDE.md b/src/core/CLAUDE.md new file mode 100644 index 000000000..f5f37693c --- /dev/null +++ b/src/core/CLAUDE.md @@ -0,0 +1,192 @@ +# Core Library Development Guidelines for cisTEM + +This file provides guidance for working with cisTEM's core computational libraries and data structures. + +## Architecture Overview + +The core library provides fundamental image processing, mathematical operations, and data management functionality used throughout cisTEM. + +### Key Components +- **Image Processing:** `image.h`, `mrc_file.h`, `tiff_file.h` +- **Mathematical Operations:** `matrix.h`, `functions.h`, `numerical_recipes.h` +- **Database Interface:** `database.h`, `project.h` +- **GPU Acceleration:** GPU-specific headers and CUDA implementations +- **FFT Operations:** MKL and FFTW wrappers + +## Image Class Best Practices + +### Memory Management +The Image class manages large memory blocks: +```cpp +Image my_image; +my_image.Allocate(x_size, y_size, z_size); +// Methods internally use debug assertions to ensure allocation +``` + +### MRC File Format +cisTEM primarily uses MRC (Medical Research Council) format for electron microscopy data: +```cpp +// Reading MRC files +MRCFile input_file(filename, false); // false = read mode +Image my_image; +my_image.ReadSlices(&input_file, 1, input_file.ReturnNumberOfSlices()); + +// Writing MRC files +MRCFile output_file(filename, true); // true = write mode +my_image.WriteSlices(&output_file, 1, my_image.logical_z_dimension); +``` + +## Mathematical Operations + +### Coordinate Systems +cisTEM uses Fourier space conventions common in cryo-EM: +- Real space: Origin at corner (0,0,0) +- Fourier space: DC component at (0,0,0) after FFT +- Physical coordinates: Often centered with respect to box center + +### FFT Library Usage +**Intel MKL is the primary FFT library:** +```cpp +// Forward FFT +my_image.ForwardFFT(); // Converts real to complex + +// Inverse FFT +my_image.BackwardFFT(); // Converts complex to real +``` + +## Database Operations + +### Thread Safety +Database operations are NOT thread-safe. Use appropriate locking: +```cpp +// Use database mutex for multi-threaded access +std::lock_guard lock(database_mutex); +database.ExecuteSQL(query); +``` + +### Transaction Management +Use transactions for multiple related operations: +```cpp +database.Begin(); +try { + // Multiple database operations + database.ExecuteSQL(query1); + database.ExecuteSQL(query2); + database.Commit(); +} catch (...) { + database.Rollback(); + throw; +} +``` + +## GPU Development Patterns + +### CUDA Integration +GPU code follows specific patterns for memory management: +```cpp +#ifdef ENABLEGPU + if (use_gpu) { + // GPU-specific implementation + GpuImage gpu_image; + gpu_image.CopyFrom(cpu_image); + gpu_image.ForwardFFT(); + } else { + // CPU fallback + cpu_image.ForwardFFT(); + } +#else + // CPU-only build + cpu_image.ForwardFFT(); +#endif +``` + +## Performance Considerations + +### OpenMP Usage +Many core operations are parallelized with OpenMP: +```cpp +#pragma omp parallel for +for (long pixel = 0; pixel < number_of_pixels; pixel++) { + // Parallel processing + // Avoid race conditions on shared data +} +``` + +## Testing Patterns + +### Unit Testing +Core functionality should have comprehensive unit tests: +```cpp +// In unit_test_programs/ +TEST_CASE("Image::ForwardFFT") { + Image test_image; + test_image.Allocate(64, 64, 1); + + // Set up test data + test_image.SetToConstant(1.0f); + + // Test operation + test_image.ForwardFFT(); + + // Verify results + REQUIRE(test_image.is_in_real_space == false); + REQUIRE(abs(test_image.complex_values[0]) > 0); +} +``` + +### Console Testing +For more complex scenarios, use console_test: +```cpp +// Test individual methods with embedded test data +if (test_number == IMAGE_FFT_TEST) { + Image test_image; + // Complex test scenario + RunFFTTest(test_image); +} +``` + +## Common Core Files + +### Essential Headers +- `src/core/core_headers.h` - Includes all core functionality +- `src/core/assets.h` - Asset management classes +- `src/core/image.h` - Primary image processing class +- `src/core/electron_dose.h` - Dose weighting calculations +- `src/core/ctf.h` - Contrast transfer function + +### Utility Classes +- `src/core/progressbar.h` - Console progress reporting +- `src/core/randomnumbergenerator.h` - Random number generation +- `src/core/curve.h` - 1D curve fitting and interpolation +- `src/core/angles_and_shifts.h` - Euler angle conversions + +## Error Handling + +### Assertions vs Exceptions +- Use `MyDebugAssertTrue()` and `MyDebugAssertFalse()` for development-time checks +- Use exceptions for runtime errors that can be recovered +- Never suppress assertions or errors to hide problems + +**Note:** Current assertion implementation uses macros. Print formatting may still incur a cost even in release builds. This should be fixed with templated versions in the future. + +```cpp +// Development assertions +MyDebugAssertTrue(image.is_in_memory, "Image must be allocated"); +MyDebugAssertFalse(error_condition, "Error condition should not occur"); + +// Runtime error handling +if (!file.OpenFile(filename, false)) { + throw std::runtime_error("Cannot open file: " + filename); +} +``` + +## Best Practices Summary + +1. **Use debug assertions** to verify preconditions in methods +2. **Use appropriate FFT normalization** for your algorithm +3. **Lock database access** in multi-threaded contexts +4. **Profile performance-critical code** with Intel VTune +5. **Write comprehensive tests** for new core functionality +6. **Document mathematical algorithms** with references to papers +7. **Consider GPU acceleration** for computationally intensive operations +8. **Maintain backward compatibility** with existing file formats \ No newline at end of file diff --git a/src/core/eer_file.cpp b/src/core/eer_file.cpp index 0b1370fdd..a7815b538 100644 --- a/src/core/eer_file.cpp +++ b/src/core/eer_file.cpp @@ -225,9 +225,9 @@ void EerFile::DecodeToFloatArray(int start_eer_frame, int finish_eer_frame, floa /* * Decode into a list of events */ - // wxPrintf("max electrons = %llu\n", max_electrons); - unsigned int *positions = new unsigned int[max_electrons](); - unsigned char *symbols = new unsigned char[max_electrons](); + // wxPrintf("max electrons = %llu\n", max_electrons); + unsigned int* positions = new unsigned int[max_electrons]( ); + unsigned char* symbols = new unsigned char[max_electrons]( ); for ( int iframe = start_eer_frame; iframe < finish_eer_frame; iframe++ ) { long long pos = frame_starts[iframe]; unsigned int npixels = 0, nelectrons = 0; @@ -248,21 +248,20 @@ void EerFile::DecodeToFloatArray(int start_eer_frame, int finish_eer_frame, floa break; if ( rle == 127 ) continue; // this should be rare. - if (nelectrons > max_electrons) - break; + if ( nelectrons > max_electrons ) + break; first_byte = pos + (bit_pos >> 3); bit_offset_in_first_byte = bit_pos & 7; chunk = *(unsigned int*)(buf + first_byte); subpixel = (unsigned char)((chunk >> bit_offset_in_first_byte) & 15) ^ 0x0A; // 15 = 00001111; 0x0A = 00001010 bit_pos += 4; - // wxPrintf("nelectrons = %u / %llu\n", nelectrons, max_electrons); + // wxPrintf("nelectrons = %u / %llu\n", nelectrons, max_electrons); positions[nelectrons] = npixels; symbols[nelectrons] = subpixel; nelectrons++; npixels++; } - } else { while ( true ) { @@ -276,7 +275,7 @@ void EerFile::DecodeToFloatArray(int start_eer_frame, int finish_eer_frame, floa break; if ( rle == 255 ) continue; // this should be rare. - if (nelectrons > max_electrons) + if ( nelectrons > max_electrons ) break; first_byte = pos + (bit_pos >> 3); @@ -290,7 +289,6 @@ void EerFile::DecodeToFloatArray(int start_eer_frame, int finish_eer_frame, floa nelectrons++; npixels++; } - } /* diff --git a/src/core/image.h b/src/core/image.h index 35b574264..040389f4b 100644 --- a/src/core/image.h +++ b/src/core/image.h @@ -177,7 +177,7 @@ class Image { void DividePixelWise(Image& other_image); bool IsAlmostEqual(Image& other_image, bool print_if_failed = true, float epsilon = 0.0001f); void AddGaussianNoise(float wanted_sigma_value = 1.0, RandomNumberGenerator* provided_generator = NULL); - + void AddNoiseUsingGenerator(RandomNumberGenerator& provided_generator, NoiseType wanted_noise_type, float noise_param_1, float noise_param_2 = 1.0f); void AddNoise(NoiseType wanted_noise_type, float noise_param_1, float noise_param_2 = 1.0f) { diff --git a/src/core/mrc_file.cpp b/src/core/mrc_file.cpp index 0c2dce40e..bf5c1fa4d 100644 --- a/src/core/mrc_file.cpp +++ b/src/core/mrc_file.cpp @@ -134,7 +134,6 @@ void MRCFile::SetPixelSize(float wanted_pixel_size) { my_header.SetPixelSize(wanted_pixel_size); } - void MRCFile::ReadSlicesFromDisk(int start_slice, int end_slice, float* output_array) { using half = half_float::half; diff --git a/src/gui/ActionsPanelSpa.cpp b/src/gui/ActionsPanelSpa.cpp index f7ca68ee5..27d1259ca 100644 --- a/src/gui/ActionsPanelSpa.cpp +++ b/src/gui/ActionsPanelSpa.cpp @@ -4,13 +4,43 @@ ActionsPanelSpa::ActionsPanelSpa(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : ActionsPanelParent(parent, id, pos, size, style) { - // Bind OnListBookPageChanged from - Bind(wxEVT_LISTBOOK_PAGE_CHANGED, wxBookCtrlEventHandler(ActionsPanelSpa::OnActionsBookPageChanged), this); + // Parent class already connects the event handler, no need to bind again } -// TODO: destructor +ActionsPanelSpa::~ActionsPanelSpa( ) { + // CRITICAL: Nullify all global panel pointers to prevent segfaults during workflow switching. + // + // When switching workflows (e.g., from Single Particle to Template Matching), the following sequence occurs: + // 1. The current ActionsPanelSpa and all its child panels are destroyed + // 2. These panels are wxWidgets children of ActionsBook, so they're automatically deleted + // 3. However, global pointers to these panels persist and become dangling pointers + // 4. Various MainFrame::Dirty*() methods may be called during or after workflow switch + // 5. These methods check panel pointers and try to set dirty flags if non-null + // 6. Without nullifying here, they would dereference freed memory → segfault + // + // This issue was particularly tricky because: + // - The segfault was inconsistent (depended on memory reuse patterns) + // - It often occurred several UI operations after the actual workflow switch + // - The crash location varied (any Dirty*() method could trigger it) + // + // By explicitly nullifying these pointers in the destructor, we ensure that: + // - Dirty*() methods safely skip destroyed panels (null check fails) + // - The new workflow can create fresh panel instances without conflicts + // - Memory access violations are prevented during the transition period -void ActionsPanelSpa::OnActionsBookPageChanged(wxBookCtrlEvent& event) { + align_movies_panel = nullptr; + findctf_panel = nullptr; + findparticles_panel = nullptr; + classification_panel = nullptr; + refine_3d_panel = nullptr; + refine_ctf_panel = nullptr; + auto_refine_3d_panel = nullptr; + ab_initio_3d_panel = nullptr; + generate_3d_panel = nullptr; + sharpen_3d_panel = nullptr; +} + +void ActionsPanelSpa::OnActionsBookPageChanged(wxListbookEvent& event) { extern MyAlignMoviesPanel* align_movies_panel; extern MyFindCTFPanel* findctf_panel; diff --git a/src/gui/ActionsPanelSpa.h b/src/gui/ActionsPanelSpa.h index c2d8a2ef5..c98ff7461 100644 --- a/src/gui/ActionsPanelSpa.h +++ b/src/gui/ActionsPanelSpa.h @@ -4,7 +4,8 @@ class ActionsPanelSpa : public ActionsPanelParent { public: ActionsPanelSpa(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(500, 300), long style = wxTAB_TRAVERSAL); - void OnActionsBookPageChanged(wxBookCtrlEvent& event); + ~ActionsPanelSpa( ); + virtual void OnActionsBookPageChanged(wxListbookEvent& event) override; }; #endif diff --git a/src/gui/ActionsPanelTm.cpp b/src/gui/ActionsPanelTm.cpp index 06fb3ee13..0b0ae809c 100644 --- a/src/gui/ActionsPanelTm.cpp +++ b/src/gui/ActionsPanelTm.cpp @@ -4,13 +4,38 @@ ActionsPanelTm::ActionsPanelTm(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : ActionsPanelParent(parent, id, pos, size, style) { - // Bind OnListBookPageChanged from - Bind(wxEVT_LISTBOOK_PAGE_CHANGED, wxBookCtrlEventHandler(ActionsPanelTm::OnActionsBookPageChanged), this); + // Parent class already connects the event handler, no need to bind again } -// TODO: destructor +ActionsPanelTm::~ActionsPanelTm( ) { + // CRITICAL: Nullify all global panel pointers to prevent segfaults during workflow switching. + // + // This destructor mirrors the safety mechanism in ActionsPanelSpa::~ActionsPanelSpa(). + // Template Matching workflow uses a different subset of panels than Single Particle, + // but the same dangling pointer issue applies. + // + // Key differences from Single Particle workflow: + // - Uses match_template_panel and refine_template_panel (TM-specific) + // - Doesn't use classification, refine_3d, ab_initio panels (SPA-specific) + // - Shares some common panels (align_movies, findctf, generate_3d, sharpen_3d) + // + // The segfault prevention strategy remains the same: + // 1. These panels are children of ActionsBook and will be auto-deleted + // 2. Global pointers must be nullified to prevent dangling references + // 3. MainFrame::Dirty*() methods will safely skip null pointers + // + // Note: Only nullify panels that actually exist in this workflow to avoid + // accidentally clearing pointers that might be managed elsewhere. -void ActionsPanelTm::OnActionsBookPageChanged(wxBookCtrlEvent& event) { + align_movies_panel = nullptr; + findctf_panel = nullptr; + match_template_panel = nullptr; + refine_template_panel = nullptr; + generate_3d_panel = nullptr; + sharpen_3d_panel = nullptr; +} + +void ActionsPanelTm::OnActionsBookPageChanged(wxListbookEvent& event) { extern MyAlignMoviesPanel* align_movies_panel; extern MyFindCTFPanel* findctf_panel; diff --git a/src/gui/ActionsPanelTm.h b/src/gui/ActionsPanelTm.h index b7ec8ae9e..093b26c7a 100644 --- a/src/gui/ActionsPanelTm.h +++ b/src/gui/ActionsPanelTm.h @@ -4,7 +4,8 @@ class ActionsPanelTm : public ActionsPanelParent { public: ActionsPanelTm(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(500, 300), long style = wxTAB_TRAVERSAL); - void OnActionsBookPageChanged(wxBookCtrlEvent& event); + ~ActionsPanelTm( ); + virtual void OnActionsBookPageChanged(wxListbookEvent& event) override; }; #endif diff --git a/src/gui/CLAUDE.md b/src/gui/CLAUDE.md new file mode 100644 index 000000000..04cb181b5 --- /dev/null +++ b/src/gui/CLAUDE.md @@ -0,0 +1,203 @@ +# GUI Development Guidelines for cisTEM + +This file provides GUI-specific guidance for working with wxWidgets in cisTEM's graphical interface. + +## Critical wxWidgets Safety Rules + +### Printf Format Specifier Safety +**CRITICAL: Format specifier mismatches cause immediate segmentation faults in wxWidgets.** + +```cpp +// CORRECT: Match format specifiers exactly to types +long id = 42; +wxPrintf("%ld", id); // %ld for long +wxPrintf("%d", int(id)); // %d for int (explicitly cast) + +// FATAL: Mismatched specifiers cause segfaults +wxPrintf("%d", id); // SEGFAULT: %d with long +wxPrintf("%ld", int(id)); // SEGFAULT: %ld with int +``` + +### Unicode Character Restrictions +**Never use Unicode characters in wxPrintf format strings - they cause segfaults.** + +```cpp +// FATAL: Unicode causes segmentation fault +wxPrintf("Resolution: 3.5Å"); // SEGFAULT: Å is Unicode +wxPrintf("Angle: 45°"); // SEGFAULT: ° is Unicode + +// CORRECT: Use ASCII equivalents +wxPrintf("Resolution: 3.5A"); // Use 'A' not 'Å' +wxPrintf("Angle: 45 deg"); // Use 'deg' not '°' +``` + +## Memory Management Patterns + +### wxWidgets Parent-Child Ownership +```cpp +// Parent-child hierarchy ensures automatic cleanup +wxDialog* dialog = new wxDialog(parent, ...); +wxButton* button = new wxButton(dialog, ...); // Dialog owns button +// No manual deletion needed - parent deletes children + +// NEVER use smart pointers with wxWindow objects +std::unique_ptr dialog; // WRONG: Causes double-deletion +``` + +### Static Members for Persistence +For data that must survive workflow switches or dialog recreation: +```cpp +// In header +class QueueManager { + static std::deque execution_queue; + static long currently_running_id; +}; + +// In cpp - define static members +std::deque QueueManager::execution_queue; +long QueueManager::currently_running_id = -1; +``` + +## Database Access Patterns + +### Lazy Loading Pattern +**Never access database in constructors - main_frame may be invalid during workflow switches.** + +```cpp +class MyWidget { + bool needs_database_load = true; + + void OnFirstUse() { + if (needs_database_load && main_frame && main_frame->current_project.is_open) { + LoadFromDatabase(); + needs_database_load = false; + } + } +}; +``` + +### SQL Query Best Practices +```sql +-- Format multi-line queries for readability +SELECT TM.SEARCH_ID, + TM.PEAK_NUMBER, + TM.STATUS AS TEMPLATE_STATUS, + JS.STATUS AS JOB_STATUS +FROM TEMPLATE_MATCH_QUEUE AS TM +LEFT JOIN TEMPLATE_MATCH_JOB_SEARCH AS JS + ON TM.SEARCH_ID = JS.SEARCH_ID +WHERE TM.STATUS IN ('pending', 'running') +ORDER BY TM.QUEUE_ORDER; +``` + +## Queue Manager Development Patterns + +### Job Tracking Pattern +Track jobs started from queue manager for proper status updates: +```cpp +// In panel header +long running_queue_job_id = -1; + +// When starting job +running_queue_job_id = job.template_match_id; + +// In ProcessAllJobsFinished +if (running_queue_job_id > 0) { + UpdateQueueStatus(running_queue_job_id, "complete"); + running_queue_job_id = -1; +} +``` + +### Bidirectional Friend Pattern +For clean communication between panels and queue managers: +```cpp +// In TemplateMatchPanel.h +friend class TemplateMatchQueueManager; + +// In TemplateMatchQueueManager.h +friend class TemplateMatchPanel; + +// Allows direct access to private methods for UI synchronization +queue_manager->UpdateUIAfterJobComplete(search_id); +``` + +## Common Workflow Panel Files + +### Core Panel Infrastructure +- `src/gui/MyPanel.cpp/.h` - Base panel class +- `src/gui/ActionPanel.cpp/.h` - Panel with run controls +- `src/gui/ResultsPanel.cpp/.h` - Results display base + +### Template Match Workflow +- `src/gui/MatchTemplatePanel.cpp/.h` - Main panel +- `src/gui/MatchTemplateResultsPanel.cpp/.h` - Results display +- `src/gui/TemplateMatchQueueManager.cpp/.h` - Queue management dialog + +### Job Management +- `src/gui/MyRunProfilesPanel.cpp/.h` - Run profile management +- `src/gui/ProjectX_gui_job.cpp/.h` - Job execution framework + +## Debugging Patterns + +### Temporary Debug Code +Mark all temporary debugging with `// revert`: +```cpp +// revert - debug output for queue status tracking +wxPrintf("Queue status: %s\n", status); +``` + +### Building After Changes +After making GUI changes, always prompt the user to build the project to verify compilation: +- Ask: "Would you like me to build the project to verify these changes?" +- This ensures immediate feedback on any compilation issues + +## Event Handling Best Practices + +### Toggle Button State Management +**Note: This pattern may not be complete - toggle buttons sometimes require double-click on first use.** +```cpp +void OnToggleChanged(wxCommandEvent& event) { + bool new_state = toggle_button->GetValue(); + + // Update internal state + is_enabled = new_state; + + // Update related UI elements + related_checkbox->SetValue(new_state); + + // Skip event to allow further processing + event.Skip(); +} +``` + +### Workflow Switching Robustness +- Panels are destroyed and recreated during switches +- Don't assume persistence across workflows +- Store persistent state in database or static members + +## Common Pitfalls to Avoid + +1. **Never access database in constructors** - causes crashes during workflow switches +2. **Never use Unicode in wxPrintf** - causes immediate segfaults +3. **Never mix format specifiers with wrong types** - causes segfaults +4. **Never use smart pointers with wxWindow objects** - causes double-deletion +5. **Never assume panel persistence** - panels are recreated on workflow switches +6. **Never put complex logic in destructors** - wxWidgets manages cleanup + +## File Organization + +### Panel Structure +``` +src/gui/ +├── [Feature]Panel.cpp/.h # Main workflow panel +├── [Feature]ResultsPanel.cpp/.h # Results display +├── [Feature]QueueManager.cpp/.h # Queue management (if applicable) +└── ProjectX_gui_[feature].cpp/.h # GUI job handling +``` + +### Resource Files +``` +src/gui/icons/ +├── [feature]_icon.png # Workflow icons +└── [action]_icon_*.png # Action button icons +``` \ No newline at end of file diff --git a/src/gui/CombineRefinementPackagesWizard.h b/src/gui/CombineRefinementPackagesWizard.h index b1e177deb..ac965967d 100644 --- a/src/gui/CombineRefinementPackagesWizard.h +++ b/src/gui/CombineRefinementPackagesWizard.h @@ -1,91 +1,77 @@ #ifndef __COMBINEREFINEMENTPACKAGESWIZARD_H_ #define __COMBINEREFINEMENTPACKAGESWIZARD_H_ - - class CombineRefinementPackagesWizard; +class PackageSelectionPage : public wxWizardPage { + CombineRefinementPackagesWizard* wizard_pointer; -class PackageSelectionPage : public wxWizardPage -{ - CombineRefinementPackagesWizard *wizard_pointer; + public: + PackageSelectionPanel* package_selection_panel; -public: + PackageSelectionPage(CombineRefinementPackagesWizard* parent, const wxBitmap& bitmap = wxNullBitmap); + ~PackageSelectionPage( ); - PackageSelectionPanel *package_selection_panel; + wxWizardPage* GetNext( ) const; - PackageSelectionPage (CombineRefinementPackagesWizard *parent, const wxBitmap &bitmap=wxNullBitmap); - ~PackageSelectionPage (); - - wxWizardPage * GetNext () const; - wxWizardPage * GetPrev () const {return NULL;}; + wxWizardPage* GetPrev( ) const { return NULL; }; }; +class CombinedClassSelectionPage : public wxWizardPage { + CombineRefinementPackagesWizard* wizard_pointer; -class CombinedClassSelectionPage : public wxWizardPage -{ - CombineRefinementPackagesWizard *wizard_pointer; - -public: - CombinedClassSelectionPanel *combined_class_selection_panel; + public: + CombinedClassSelectionPanel* combined_class_selection_panel; - CombinedClassSelectionPage (CombineRefinementPackagesWizard *parent, const wxBitmap &bitmap=wxNullBitmap); - ~CombinedClassSelectionPage (); + CombinedClassSelectionPage(CombineRefinementPackagesWizard* parent, const wxBitmap& bitmap = wxNullBitmap); + ~CombinedClassSelectionPage( ); - wxStaticText* ClassText; - - wxWizardPage * GetNext () const; - wxWizardPage * GetPrev () const; + wxStaticText* ClassText; + wxWizardPage* GetNext( ) const; + wxWizardPage* GetPrev( ) const; }; +class RefinementSelectPage : public wxWizardPage { + CombineRefinementPackagesWizard* wizard_pointer; -class RefinementSelectPage : public wxWizardPage -{ - CombineRefinementPackagesWizard *wizard_pointer; - -public: - CombinedPackageRefinementPanel *combined_package_refinement_selection_panel; + public: + CombinedPackageRefinementPanel* combined_package_refinement_selection_panel; - RefinementSelectPage(CombineRefinementPackagesWizard *parent, const wxBitmap &bitmap=wxNullBitmap); - ~RefinementSelectPage(); + RefinementSelectPage(CombineRefinementPackagesWizard* parent, const wxBitmap& bitmap = wxNullBitmap); + ~RefinementSelectPage( ); - wxWizardPage * GetNext() const; - wxWizardPage * GetPrev() const; + wxWizardPage* GetNext( ) const; + wxWizardPage* GetPrev( ) const; }; - -class CombineRefinementPackagesWizard : public CombineRefinementPackagesWizardParent -{ -public: - - CombineRefinementPackagesWizard(wxWindow* parent); - ~CombineRefinementPackagesWizard(); - void OnUpdateUI (wxUpdateUIEvent& event); - void OnCancelClick( wxWizardEvent& event ); - void OnFinished( wxWizardEvent& event ); - void DisableNextButton(); - void EnableNextButton(); - - void PageChanging(wxWizardEvent& event); - void PageChanged(wxWizardEvent& event); - - PackageSelectionPage *package_selection_page; - CombinedClassSelectionPage *combined_class_selection_page; - RefinementSelectPage *refinement_selection_page; - -private: - - bool CheckIfDuplicate (int comparison_original_particle_position_asset_id, RefinementPackage* combined_package); - int number_of_visits; - int checked_counter; - bool refinements_page_has_been_visited; - bool classes_page_has_been_visited = false; - bool volume_selection_page_has_been_visited = false; - bool imported_params_found; - bool classes_selected; - wxArrayString refinement_names; +class CombineRefinementPackagesWizard : public CombineRefinementPackagesWizardParent { + public: + CombineRefinementPackagesWizard(wxWindow* parent); + ~CombineRefinementPackagesWizard( ); + void OnUpdateUI(wxUpdateUIEvent& event); + void OnCancelClick(wxWizardEvent& event); + void OnFinished(wxWizardEvent& event); + void DisableNextButton( ); + void EnableNextButton( ); + + void PageChanging(wxWizardEvent& event); + void PageChanged(wxWizardEvent& event); + + PackageSelectionPage* package_selection_page; + CombinedClassSelectionPage* combined_class_selection_page; + RefinementSelectPage* refinement_selection_page; + + private: + bool CheckIfDuplicate(int comparison_original_particle_position_asset_id, RefinementPackage* combined_package); + int number_of_visits; + int checked_counter; + bool refinements_page_has_been_visited; + bool classes_page_has_been_visited = false; + bool volume_selection_page_has_been_visited = false; + bool imported_params_found; + bool classes_selected; + wxArrayString refinement_names; }; - #endif diff --git a/src/gui/MainFrame.cpp b/src/gui/MainFrame.cpp index 2aaeff294..4cad55b0f 100644 --- a/src/gui/MainFrame.cpp +++ b/src/gui/MainFrame.cpp @@ -304,101 +304,178 @@ void MyMainFrame::DirtyEverything( ) { DirtyAtomicCoordinates( ); } +// DIRTY METHODS SAFETY: All Dirty*() methods below include null pointer checks to prevent segfaults. +// +// WHY NULL CHECKS ARE CRITICAL HERE: +// These methods can be called at various times during the application lifecycle, including: +// 1. During workflow switching (when panels are being destroyed/recreated) +// 2. After database operations that may trigger UI updates +// 3. From event handlers that may fire during panel transitions +// 4. From background threads or delayed events +// +// THE SEGFAULT SCENARIO WE'RE PREVENTING: +// Without null checks, the following sequence caused intermittent crashes: +// 1. User switches workflow (e.g., Single Particle → Template Matching) +// 2. Old panels are destroyed, but a database operation is still pending +// 3. Database operation completes and calls a Dirty*() method +// 4. Method tries to access a destroyed panel through non-null but invalid pointer +// 5. Segmentation fault occurs when accessing freed memory +// +// THE FIX: +// By adding null checks (if (panel_ptr) ...) before every access, we ensure that: +// - Destroyed panels (nullified in destructors) are safely skipped +// - Panels that haven't been created yet are safely ignored +// - The application remains stable during workflow transitions +// - Race conditions between UI updates and panel lifecycle are handled gracefully +// +// MAINTENANCE NOTE: +// Always use the pattern: if (panel_ptr) panel_ptr->member = value; +// Never assume a panel pointer is valid without checking first. + void MyMainFrame::DirtyVolumes( ) { - volume_asset_panel->is_dirty = true; - refine_3d_panel->volumes_are_dirty = true; - auto_refine_3d_panel->volumes_are_dirty = true; - sharpen_3d_panel->volumes_are_dirty = true; - refine_ctf_panel->volumes_are_dirty = true; + if ( volume_asset_panel ) + volume_asset_panel->is_dirty = true; + if ( refine_3d_panel ) + refine_3d_panel->volumes_are_dirty = true; + if ( auto_refine_3d_panel ) + auto_refine_3d_panel->volumes_are_dirty = true; + if ( sharpen_3d_panel ) + sharpen_3d_panel->volumes_are_dirty = true; + if ( refine_ctf_panel ) + refine_ctf_panel->volumes_are_dirty = true; if ( current_workflow == "Template Matching" ) { - match_template_panel->volumes_are_dirty = true; + if ( match_template_panel ) + match_template_panel->volumes_are_dirty = true; #ifdef EXPERIMENTAL - refine_template_panel->volumes_are_dirty = true; + if ( refine_template_panel ) + refine_template_panel->volumes_are_dirty = true; #endif } } void MyMainFrame::DirtyAtomicCoordinates( ) { - atomic_coordinates_asset_panel->is_dirty = true; + if ( atomic_coordinates_asset_panel ) + atomic_coordinates_asset_panel->is_dirty = true; } void MyMainFrame::DirtyMovieGroups( ) { - movie_asset_panel->is_dirty = true; - align_movies_panel->group_combo_is_dirty = true; - movie_results_panel->group_combo_is_dirty = true; - image_asset_panel->EnableNewFromParentButton( ); + if ( movie_asset_panel ) + movie_asset_panel->is_dirty = true; + if ( align_movies_panel ) + align_movies_panel->group_combo_is_dirty = true; + if ( movie_results_panel ) + movie_results_panel->group_combo_is_dirty = true; + if ( image_asset_panel ) + image_asset_panel->EnableNewFromParentButton( ); } void MyMainFrame::DirtyImageGroups( ) { - image_asset_panel->is_dirty = true; - findctf_panel->group_combo_is_dirty = true; - ctf_results_panel->group_combo_is_dirty = true; - findparticles_panel->group_combo_is_dirty = true; - picking_results_panel->group_combo_is_dirty = true; + if ( image_asset_panel ) + image_asset_panel->is_dirty = true; + if ( findctf_panel ) + findctf_panel->group_combo_is_dirty = true; + if ( ctf_results_panel ) + ctf_results_panel->group_combo_is_dirty = true; + if ( findparticles_panel ) + findparticles_panel->group_combo_is_dirty = true; + if ( picking_results_panel ) + picking_results_panel->group_combo_is_dirty = true; if ( current_workflow == "Template Matching" ) { - match_template_panel->group_combo_is_dirty = true; - refine_template_panel->group_combo_is_dirty = true; + if ( match_template_panel ) + match_template_panel->group_combo_is_dirty = true; + if ( refine_template_panel ) + refine_template_panel->group_combo_is_dirty = true; } } void MyMainFrame::DirtyParticlePositionGroups( ) { - particle_position_asset_panel->is_dirty = true; + if ( particle_position_asset_panel ) + particle_position_asset_panel->is_dirty = true; } void MyMainFrame::DirtyRefinementPackages( ) { - refinement_package_asset_panel->is_dirty = true; - classification_panel->refinement_package_combo_is_dirty = true; - refine_3d_panel->refinement_package_combo_is_dirty = true; - refine_ctf_panel->refinement_package_combo_is_dirty = true; - auto_refine_3d_panel->refinement_package_combo_is_dirty = true; - refinement_results_panel->refinement_package_is_dirty = true; - refine2d_results_panel->refinement_package_combo_is_dirty = true; - ab_initio_3d_panel->refinement_package_combo_is_dirty = true; - generate_3d_panel->refinement_package_combo_is_dirty = true; + if ( refinement_package_asset_panel ) + refinement_package_asset_panel->is_dirty = true; + if ( classification_panel ) + classification_panel->refinement_package_combo_is_dirty = true; + if ( refine_3d_panel ) + refine_3d_panel->refinement_package_combo_is_dirty = true; + if ( refine_ctf_panel ) + refine_ctf_panel->refinement_package_combo_is_dirty = true; + if ( auto_refine_3d_panel ) + auto_refine_3d_panel->refinement_package_combo_is_dirty = true; + if ( refinement_results_panel ) + refinement_results_panel->refinement_package_is_dirty = true; + if ( refine2d_results_panel ) + refine2d_results_panel->refinement_package_combo_is_dirty = true; + if ( ab_initio_3d_panel ) + ab_initio_3d_panel->refinement_package_combo_is_dirty = true; + if ( generate_3d_panel ) + generate_3d_panel->refinement_package_combo_is_dirty = true; } void MyMainFrame::DirtyTemplateMatchesPackages( ) { - if ( current_workflow == "Template Matching" ) + if ( current_workflow == "Template Matching" && template_matches_package_asset_panel ) template_matches_package_asset_panel->is_dirty = true; } 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; - match_template_results_panel->group_combo_is_dirty = true; + if ( refine_3d_panel ) + refine_3d_panel->input_params_combo_is_dirty = true; + if ( refine_ctf_panel ) + refine_ctf_panel->input_params_combo_is_dirty = true; + if ( refinement_results_panel ) + refinement_results_panel->input_params_are_dirty = true; + if ( generate_3d_panel ) + generate_3d_panel->input_params_combo_is_dirty = true; + if ( match_template_results_panel ) + match_template_results_panel->group_combo_is_dirty = true; } void MyMainFrame::DirtyClassifications( ) { - refine2d_results_panel->input_params_combo_is_dirty = true; + if ( refine2d_results_panel ) + refine2d_results_panel->input_params_combo_is_dirty = true; } void MyMainFrame::DirtyClassificationSelections( ) { - refine2d_results_panel->classification_selections_are_dirty = true; - ab_initio_3d_panel->classification_selections_are_dirty = true; + if ( refine2d_results_panel ) + refine2d_results_panel->classification_selections_are_dirty = true; + if ( ab_initio_3d_panel ) + ab_initio_3d_panel->classification_selections_are_dirty = true; } void MyMainFrame::DirtyRunProfiles( ) { + + if ( run_profiles_panel ) + run_profiles_panel->is_dirty = true; + if ( align_movies_panel ) + align_movies_panel->run_profiles_are_dirty = true; + if ( findctf_panel ) + findctf_panel->run_profiles_are_dirty = true; + if ( current_workflow == "Single Particle" ) { - run_profiles_panel->is_dirty = true; - align_movies_panel->run_profiles_are_dirty = true; - findctf_panel->run_profiles_are_dirty = true; - findparticles_panel->run_profiles_are_dirty = true; - classification_panel->run_profiles_are_dirty = true; - refine_3d_panel->run_profiles_are_dirty = true; - refine_ctf_panel->run_profiles_are_dirty = true; - auto_refine_3d_panel->run_profiles_are_dirty = true; - ab_initio_3d_panel->run_profiles_are_dirty = true; - generate_3d_panel->run_profiles_are_dirty = true; + if ( findparticles_panel ) + findparticles_panel->run_profiles_are_dirty = true; + if ( classification_panel ) + classification_panel->run_profiles_are_dirty = true; + if ( refine_3d_panel ) + refine_3d_panel->run_profiles_are_dirty = true; + if ( refine_ctf_panel ) + refine_ctf_panel->run_profiles_are_dirty = true; + if ( auto_refine_3d_panel ) + auto_refine_3d_panel->run_profiles_are_dirty = true; + if ( ab_initio_3d_panel ) + ab_initio_3d_panel->run_profiles_are_dirty = true; + if ( generate_3d_panel ) + generate_3d_panel->run_profiles_are_dirty = true; } else if ( current_workflow == "Template Matching" ) { - align_movies_panel->run_profiles_are_dirty = true; - findctf_panel->run_profiles_are_dirty = true; - match_template_panel->run_profiles_are_dirty = true; - refine_template_panel->run_profiles_are_dirty = true; + if ( match_template_panel ) + match_template_panel->run_profiles_are_dirty = true; + if ( refine_template_panel ) + refine_template_panel->run_profiles_are_dirty = true; } } @@ -966,18 +1043,54 @@ bool MyMainFrame::MigrateProject(wxString old_project_directory, wxString new_pr } void MyMainFrame::SwitchWorkflowPanels(const wxString& workflow_name) { + // WORKFLOW SWITCHING SAFETY: This function handles the complex process of switching between + // different workflow types (e.g., Single Particle ↔ Template Matching). + // + // CRITICAL SEQUENCE OF OPERATIONS (order matters!): + // 1. Freeze the UI to prevent flicker and intermediate state rendering + // 2. Save current page selection to restore user context after switch + // 3. Remove the actions panel page from the book (but don't destroy yet) + // 4. Destroy the old actions panel and all its children + // 5. Create new workflow-specific panels + // 6. Restore the page position and selection + // + // SEGFAULT PREVENTION MEASURES: + // - The actions_panel->Destroy() call triggers the ActionsPanelSpa/Tm destructor + // - Those destructors nullify all global panel pointers to prevent dangling references + // - The null checks in Dirty*() methods prevent accessing freed memory + // - Error handling with fallback ensures we always have a valid actions panel + Freeze( ); int current_page_idx = MenuBook->GetSelection( ); int actions_panel_idx = MenuBook->FindPage(actions_panel); MenuBook->RemovePage(actions_panel_idx); + // Destroy the old panel hierarchy. This is safe because: + // 1. We've already removed it from MenuBook (no UI references) + // 2. The destructor will nullify global pointers (no dangling references) + // 3. wxWidgets will handle child deletion (automatic cleanup) if ( actions_panel ) { actions_panel->Destroy( ); actions_panel = nullptr; } + // Create the new workflow-specific actions panel. + // The WorkflowRegistry creates the appropriate panel type and all its children. actions_panel = static_cast(WorkflowRegistry::Instance( ).CreateActionsPanel(workflow_name, this->MenuBook)); + + // Robust error handling: If the requested workflow fails, fall back to Single Particle. + // This ensures the application remains usable even if a workflow registration is broken. + if ( ! actions_panel ) { + wxLogError("Failed to create actions panel for workflow '%s'", workflow_name); + // Fall back to Single Particle workflow + actions_panel = static_cast(WorkflowRegistry::Instance( ).CreateActionsPanel("Single Particle", this->MenuBook)); + if ( ! actions_panel ) { + // Catastrophic failure - this should never happen in production + wxLogError("Critical error: Cannot create any actions panel"); + return; + } + } this->MenuBook->InsertPage(actions_panel_idx, actions_panel, "Actions", false, actions_panel_idx); this->MenuBook->SetSelection(current_page_idx); diff --git a/src/gui/MatchTemplatePanel.cpp b/src/gui/MatchTemplatePanel.cpp index 2d51403d0..8da49de37 100644 --- a/src/gui/MatchTemplatePanel.cpp +++ b/src/gui/MatchTemplatePanel.cpp @@ -332,6 +332,12 @@ void MatchTemplatePanel::SetInfo( ) { } void MatchTemplatePanel::FillGroupComboBox( ) { + // Called from constructor (when panel is created) or OnUpdateUI (when groups change) + // Return early if no project is open (can happen during workflow switching) + if ( ! main_frame->current_project.is_open ) { + return; + } + GroupComboBox->FillComboBox(true); if ( GroupComboBox->GetCount( ) > 0 && main_frame->current_project.is_open == true ) @@ -683,7 +689,7 @@ void MatchTemplatePanel::StartEstimationClick(wxCommandEvent& event) { current_image_euler_search->CalculateGridSearchPositions(false); // Optionally split each image over multiple jobs (processes) - // The coordinating thread needs to process all the worker's results, so we can only process 1 image at a time, i.e. + // The coordinating thread needs to process all the worker's results, so we can only process 1 image at a time, i.e. // the min number of jobs per image is number_of_processes if ( use_gpu ) { number_of_jobs_per_image_in_gui = number_of_processes; // Using two threads in each job @@ -1287,3 +1293,22 @@ wxArrayLong MatchTemplatePanel::CheckForUnfinishedWork(bool is_checked, bool is_ } return unfinished_match_template_ids; } + +// Queue functionality implementation +void MatchTemplatePanel::OnAddToQueueClick(wxCommandEvent& event) { + // Stub implementation for testing + wxMessageDialog* dialog = new wxMessageDialog(this, + "Add To Queue button successfully implemented!\n\n" + "This will queue the current template matching job for later execution.", + "Queue Implementation Test", + wxOK | wxICON_INFORMATION); + dialog->ShowModal( ); + delete dialog; + + // TODO: Implement actual queue functionality + // 1. Collect all parameters from GUI + // 2. Generate job_id + // 3. Store in database with IS_ACTIVE = 0 + // 4. Add to Results Panel as pending + // 5. Update queue manager UI if visible +} diff --git a/src/gui/MatchTemplatePanel.h b/src/gui/MatchTemplatePanel.h index a7b4f964c..abd913b09 100644 --- a/src/gui/MatchTemplatePanel.h +++ b/src/gui/MatchTemplatePanel.h @@ -105,6 +105,9 @@ class MatchTemplatePanel : public MatchTemplatePanelParent { void ResumeRunCheckBoxOnCheckBox(wxCommandEvent& event); wxArrayLong CheckForUnfinishedWork(bool is_checked, bool is_from_check_box); + + // Queue functionality + void OnAddToQueueClick(wxCommandEvent& event); }; #endif diff --git a/src/gui/ProjectX_gui_matchtemplate.cpp b/src/gui/ProjectX_gui_matchtemplate.cpp index 6ee856131..ded9e6200 100644 --- a/src/gui/ProjectX_gui_matchtemplate.cpp +++ b/src/gui/ProjectX_gui_matchtemplate.cpp @@ -951,6 +951,9 @@ MatchTemplatePanelParent::MatchTemplatePanelParent( wxWindow* parent, wxWindowID StartEstimationButton = new wxButton( StartPanel, wxID_ANY, wxT("Start Search"), wxDefaultPosition, wxDefaultSize, 0 ); bSizer60->Add( StartEstimationButton, 0, wxALL, 5 ); + AddToQueueButton = new wxButton( StartPanel, wxID_ANY, wxT("Add To Queue"), wxDefaultPosition, wxDefaultSize, 0 ); + bSizer60->Add( AddToQueueButton, 0, wxALL, 5 ); + bSizer58->Add( bSizer60, 50, wxEXPAND, 5 ); @@ -979,6 +982,7 @@ MatchTemplatePanelParent::MatchTemplatePanelParent( wxWindow* parent, wxWindowID FinishButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::FinishButtonClick ), NULL, this ); CancelAlignmentButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::TerminateButtonClick ), NULL, this ); StartEstimationButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::StartEstimationClick ), NULL, this ); + AddToQueueButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::OnAddToQueueClick ), NULL, this ); ResumeRunCheckBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::ResumeRunCheckBoxOnCheckBox ), NULL, this ); } @@ -991,6 +995,7 @@ MatchTemplatePanelParent::~MatchTemplatePanelParent() FinishButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::FinishButtonClick ), NULL, this ); CancelAlignmentButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::TerminateButtonClick ), NULL, this ); StartEstimationButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::StartEstimationClick ), NULL, this ); + AddToQueueButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::OnAddToQueueClick ), NULL, this ); ResumeRunCheckBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( MatchTemplatePanelParent::ResumeRunCheckBoxOnCheckBox ), NULL, this ); } diff --git a/src/gui/ProjectX_gui_matchtemplate.h b/src/gui/ProjectX_gui_matchtemplate.h index 346734a38..feb582c60 100644 --- a/src/gui/ProjectX_gui_matchtemplate.h +++ b/src/gui/ProjectX_gui_matchtemplate.h @@ -272,6 +272,7 @@ class MatchTemplatePanelParent : public JobPanel wxStaticText* RunProfileText; MemoryComboBox* RunProfileComboBox; wxButton* StartEstimationButton; + wxButton* AddToQueueButton; wxCheckBox* ResumeRunCheckBox; // Virtual event handlers, override them in your derived class @@ -281,6 +282,7 @@ class MatchTemplatePanelParent : public JobPanel virtual void FinishButtonClick( wxCommandEvent& event ) { event.Skip(); } virtual void TerminateButtonClick( wxCommandEvent& event ) { event.Skip(); } virtual void StartEstimationClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnAddToQueueClick( wxCommandEvent& event ) { event.Skip(); } virtual void ResumeRunCheckBoxOnCheckBox( wxCommandEvent& event ) { event.Skip(); } diff --git a/src/gui/workflows/SpaWorkflow.h b/src/gui/workflows/SpaWorkflow.h index 28997cf8d..c33317ac1 100644 --- a/src/gui/workflows/SpaWorkflow.h +++ b/src/gui/workflows/SpaWorkflow.h @@ -4,8 +4,24 @@ #include "../ActionsPanelSpa.h" #include "Icons.h" -// These are all defined in projectx.cpp; we'll use them here so that -// the panel will be fully instantiated any time the workflow changes. +// GLOBAL PANEL POINTERS: These are all defined in projectx.cpp and used throughout the application. +// +// IMPORTANT LIFECYCLE MANAGEMENT: +// - These pointers are shared globally across the entire application +// - They are created when a workflow is activated (see createActionsPanel lambda below) +// - They are destroyed when switching workflows (handled by ActionsPanelSpa destructor) +// - The destructor MUST set these to nullptr to prevent dangling pointer access +// +// WHY GLOBALS? +// - Historical design: The application was originally single-workflow +// - Many parts of the codebase expect direct access to these panels +// - Refactoring to eliminate globals would require extensive changes +// +// SAFETY PROTOCOL: +// 1. Create panels in workflow registration (below) +// 2. Destroy panels when switching workflows (automatic via wxWidgets) +// 3. Nullify pointers in destructor (prevents segfaults) +// 4. Check for null before access (in Dirty*() methods and elsewhere) extern MyAlignMoviesPanel* align_movies_panel; extern MyFindCTFPanel* findctf_panel; extern MyFindParticlesPanel* findparticles_panel; @@ -37,16 +53,20 @@ struct SpaWorkflowRegister { def.name = "Single Particle"; def.createActionsPanel = [](wxWindow* parent) { ActionsPanelSpa* actions_panel = new ActionsPanelSpa(parent); - align_movies_panel = new MyAlignMoviesPanel(actions_panel->ActionsBook); - findctf_panel = new MyFindCTFPanel(actions_panel->ActionsBook); - findparticles_panel = new MyFindParticlesPanel(actions_panel->ActionsBook); - classification_panel = new MyRefine2DPanel(actions_panel->ActionsBook); - refine_3d_panel = new MyRefine3DPanel(actions_panel->ActionsBook); - refine_ctf_panel = new RefineCTFPanel(actions_panel->ActionsBook); - auto_refine_3d_panel = new AutoRefine3DPanel(actions_panel->ActionsBook); - ab_initio_3d_panel = new AbInitio3DPanel(actions_panel->ActionsBook); - generate_3d_panel = new Generate3DPanel(actions_panel->ActionsBook); - sharpen_3d_panel = new Sharpen3DPanel(actions_panel->ActionsBook); + + // PANEL CREATION: Create all workflow-specific panels as children of ActionsBook. + // These panels will be automatically destroyed when actions_panel is destroyed. + // The ActionsPanelSpa destructor will handle nullifying the global pointers. + align_movies_panel = new MyAlignMoviesPanel(actions_panel->ActionsBook); + findctf_panel = new MyFindCTFPanel(actions_panel->ActionsBook); + findparticles_panel = new MyFindParticlesPanel(actions_panel->ActionsBook); + classification_panel = new MyRefine2DPanel(actions_panel->ActionsBook); + refine_3d_panel = new MyRefine3DPanel(actions_panel->ActionsBook); + refine_ctf_panel = new RefineCTFPanel(actions_panel->ActionsBook); + auto_refine_3d_panel = new AutoRefine3DPanel(actions_panel->ActionsBook); + ab_initio_3d_panel = new AbInitio3DPanel(actions_panel->ActionsBook); + generate_3d_panel = new Generate3DPanel(actions_panel->ActionsBook); + sharpen_3d_panel = new Sharpen3DPanel(actions_panel->ActionsBook); if ( ! actions_panel->ActionsBook->GetImageList( ) ) { actions_panel->ActionsBook->AssignImageList(GetActionsSpaBookIconImages( )); @@ -63,7 +83,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 16afba4a6..1632bfc6d 100644 --- a/src/gui/workflows/TmWorkflow.h +++ b/src/gui/workflows/TmWorkflow.h @@ -4,6 +4,20 @@ #include "../ActionsPanelTm.h" #include "Icons.h" +// GLOBAL PANEL POINTERS: Similar to SpaWorkflow.h, these globals are managed carefully. +// +// TEMPLATE MATCHING SPECIFIC PANELS: +// - match_template_panel: The main template matching configuration panel +// - refine_template_panel: For refining template matches +// - match_template_results_panel: For displaying match results +// +// SHARED PANELS (also used in Single Particle): +// - align_movies_panel, findctf_panel: Pre-processing panels +// - generate_3d_panel, sharpen_3d_panel: 3D reconstruction panels +// +// CRITICAL: ActionsPanelTm destructor must nullify only the panels it creates. +// Some panels might be shared or managed elsewhere, so we only clean up what we own. + extern ActionsPanelParent* actions_panel; extern MyAlignMoviesPanel* align_movies_panel; extern MyFindCTFPanel* findctf_panel; @@ -32,26 +46,31 @@ struct TmWorkflowRegister { def.name = "Template Matching"; def.createActionsPanel = [](wxWindow* parent) { ActionsPanelTm* actions_panel_tm = new ActionsPanelTm(parent); - actions_panel = static_cast(actions_panel_tm); - align_movies_panel = new MyAlignMoviesPanel(actions_panel->ActionsBook); - findctf_panel = new MyFindCTFPanel(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); - sharpen_3d_panel = new Sharpen3DPanel(actions_panel->ActionsBook); - - if ( ! actions_panel->ActionsBook->GetImageList( ) ) { - actions_panel->ActionsBook->AssignImageList(GetActionsTmBookIconImages( )); + // Don't set the global actions_panel here - it will be set by the caller + + // PANEL CREATION: Create Template Matching specific panels. + // Note: These replace any existing Single Particle panels with the same names. + // The old panels are destroyed first (handled by ActionsPanelSpa destructor if coming from SPA). + // ActionsPanelTm destructor will nullify these pointers when switching away from TM. + align_movies_panel = new MyAlignMoviesPanel(actions_panel_tm->ActionsBook); + findctf_panel = new MyFindCTFPanel(actions_panel_tm->ActionsBook); + match_template_panel = new MatchTemplatePanel(actions_panel_tm->ActionsBook); + refine_template_panel = new RefineTemplatePanel(actions_panel_tm->ActionsBook); + generate_3d_panel = new Generate3DPanel(actions_panel_tm->ActionsBook); + sharpen_3d_panel = new Sharpen3DPanel(actions_panel_tm->ActionsBook); + + if ( ! actions_panel_tm->ActionsBook->GetImageList( ) ) { + actions_panel_tm->ActionsBook->AssignImageList(GetActionsTmBookIconImages( )); } - actions_panel->ActionsBook->AddPage(align_movies_panel, "Align Movies", true, 0); - 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(generate_3d_panel, "Generate 3D", false, 4); - actions_panel->ActionsBook->AddPage(sharpen_3d_panel, "Sharpen 3D", false, 5); + actions_panel_tm->ActionsBook->AddPage(align_movies_panel, "Align Movies", true, 0); + actions_panel_tm->ActionsBook->AddPage(findctf_panel, "Find CTF", false, 1); + actions_panel_tm->ActionsBook->AddPage(match_template_panel, "Match Templates", false, 2); + actions_panel_tm->ActionsBook->AddPage(refine_template_panel, "Refine Template", false, 3); + actions_panel_tm->ActionsBook->AddPage(generate_3d_panel, "Generate 3D", false, 4); + actions_panel_tm->ActionsBook->AddPage(sharpen_3d_panel, "Sharpen 3D", false, 5); - return actions_panel; + return actions_panel_tm; }; // TODO: define a results panel function as well WorkflowRegistry::Instance( ).RegisterWorkflow(def); diff --git a/src/gui/workflows/WorkflowRegistry.h b/src/gui/workflows/WorkflowRegistry.h index 4b3d4d3b4..f0c5ddc22 100644 --- a/src/gui/workflows/WorkflowRegistry.h +++ b/src/gui/workflows/WorkflowRegistry.h @@ -28,7 +28,16 @@ class WorkflowRegistry { }; wxPanel* CreateActionsPanel(const wxString& name, wxWindow* parent) { - return factories[name].createActionsPanel(parent); + auto it = factories.find(name); + if ( it == factories.end( ) ) { + wxLogError("Workflow '%s' not found in registry", name); + return nullptr; + } + if ( ! it->second.createActionsPanel ) { + wxLogError("Workflow '%s' has no createActionsPanel function", name); + return nullptr; + } + return it->second.createActionsPanel(parent); }; // wxPanel* CreateResultsPanel(const wxString& name, wxWindow* parent) { diff --git a/src/gui/wxformbuilder/ProjectX_matchtemplate.fbp b/src/gui/wxformbuilder/ProjectX_matchtemplate.fbp index c9c4b34b2..498b4dc5b 100644 --- a/src/gui/wxformbuilder/ProjectX_matchtemplate.fbp +++ b/src/gui/wxformbuilder/ProjectX_matchtemplate.fbp @@ -1,18122 +1,18196 @@ - + - - - - C++ - 1 - source_name - 0 - 0 - res - UTF-8 - connect - ProjectX_gui_matchtemplate - 7000 - none - - - 0 - ProjectX_matchtemaplte - - .. - #include "../core/gui_core_headers.h" - 1 - 1 - 1 - 1 - UI - 0 - 1 - 0 - - 0 - wxAUI_MGR_DEFAULT - - + + + + C++ + 1 + source_name + 0 + 0 + res + UTF-8 + connect + ProjectX_gui_matchtemplate + 7000 + none + + + 0 + ProjectX_matchtemaplte + + .. + #include "../core/gui_core_headers.h" + 1 + 1 + 1 + 1 + UI + 0 + 1 + 0 + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + ShowTemplateMatchResultsPanelParent + + 952,539 + + + 0 + + + wxTAB_TRAVERSAL + + + bSizer92 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + 1 + 0 + Dock + 0 + Left 1 - impl_virtual - - + + 1 + + 0 0 wxID_ANY - - - ShowTemplateMatchResultsPanelParent - - 952,539 - - - 0 - - - wxTAB_TRAVERSAL - - - bSizer92 - wxVERTICAL - none - + + 0 + + 0 + + 0 + + 1 + m_splitter16 + 1 + + + protected + 1 + + Resizable + 0.5 + 700 + -1 + 1 + + wxSPLIT_VERTICAL + wxSP_3D + + 0 + + + + + + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_panel87 + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer301 + wxVERTICAL + none + 5 wxEXPAND 1 - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - 0 - - 1 - m_splitter16 - 1 - - - protected - 1 - - Resizable - 0.5 - 700 - -1 - 1 - - wxSPLIT_VERTICAL - wxSP_3D - - 0 - - - - - - + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + 0 + + 1 + m_splitter15 + 1 + + + protected + 1 + + Resizable + 0.5 + 0 + -1 + 1 + + wxSPLIT_HORIZONTAL + wxSP_3D + + 0 + + + + + + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_panel89 + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer303 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + + bSizer538 + wxHORIZONTAL + none + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Table of Peaks + 0 + + 0 + + + 0 + + 1 + PeakTableStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline148 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL|wxLI_VERTICAL + + 0 + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 1 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + MyButton + + 0 + + 0 + + + 0 + + 1 + SaveButton + 1 + + + public + 1 + + + + Resizable + 1 + + + NoFocusBitmapButton; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnSavePeaksClick + + + + + + 5 + wxEXPAND | wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + 0 0 wxID_ANY - + 0 - - + + 0 - + 1 - m_panel87 + m_staticline82 1 - - + + protected 1 - + Resizable 1 - - + + wxLI_HORIZONTAL + 0 - - - - wxTAB_TRAVERSAL - - - bSizer301 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - 0 - - 1 - m_splitter15 - 1 - - - protected - 1 - - Resizable - 0.5 - 0 - -1 - 1 - - wxSPLIT_HORIZONTAL - wxSP_3D - - 0 - - - - - - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_panel89 - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer303 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - - bSizer538 - wxHORIZONTAL - none - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Table of Peaks - 0 - - 0 - - - 0 - - 1 - PeakTableStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline148 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL|wxLI_VERTICAL - - 0 - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 1 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - MyButton - - 0 - - 0 - - - 0 - - 1 - SaveButton - 1 - - - public - 1 - - - - Resizable - 1 - - - NoFocusBitmapButton; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnSavePeaksClick - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline82 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - PeakListCtrl - 1 - - - public - 1 - - Resizable - 1 - - wxLC_REPORT|wxLC_SINGLE_SEL - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - BottomPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer302 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Survival Histogram - 0 - - 0 - - - 0 - - 1 - SurvivalHistogramText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline81 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - HistogramPlotPanel - 1 - - - public - 1 - - Resizable - 1 - - PlotCurvePanel; PlotCurvePanel.h - 0 - - - - wxTAB_TRAVERSAL - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - PeakChangesPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer594 - wxVERTICAL - none - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ChangesListCtrl - 1 - - - public - 1 - - Resizable - 1 - - wxLC_REPORT|wxLC_SINGLE_SEL - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - - - - + + + + + - - - + + 5 + wxALL|wxEXPAND + 1 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + 0 0 wxID_ANY - + 0 - - + + 0 - + 1 - m_panel86 + PeakListCtrl 1 - - - protected + + + public 1 - + Resizable 1 - - + + wxLC_REPORT|wxLC_SINGLE_SEL + 0 - - - - wxTAB_TRAVERSAL - - - bSizer304 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - - bSizer305 - wxHORIZONTAL - none - - - - 5 - wxEXPAND - 0 - - - bSizer306 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Image / MIP / Found Templates - 0 - - 0 - - - 0 - - 1 - m_staticText394 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - ImageFileText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline86 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ImageDisplayPanel - 1 - - - public - 1 - - Resizable - 1 - - DisplayPanel; DisplayPanel.h - 0 - - - - wxTAB_TRAVERSAL - - - + + + wxFILTER_NONE + wxDefaultValidator + + + + + + - - - - - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - MatchTemplateResultsPanelParent - - 895,557 - - - 0 - - - wxTAB_TRAVERSAL - OnUpdateUI - - - bSizer63 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline25 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - 0 - - 1 - m_splitter4 - 1 - - - protected - 1 - - Resizable - 0.5 - 450 - -1 - 1 - - wxSPLIT_VERTICAL - wxSP_3D - - 0 - - - - - - + + + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + BottomPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer302 + wxVERTICAL + none + + 5 + wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + Sans,90,92,10,74,0 0 0 wxID_ANY - + Survival Histogram + 0 + 0 - - + + 0 - + 1 - m_panel13 + SurvivalHistogramText 1 - - + + protected 1 - + Resizable 1 - - + + + 0 - - - - wxTAB_TRAVERSAL - - - bSizer66 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - - bSizer64 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - All Images - - 0 - - - 0 - - 1 - AllImagesButton - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - OnAllImagesSelect - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - By Filter - - 0 - - - 0 - - 1 - ByFilterButton - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - OnByFilterSelect - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 0 - - 1 - - - 0 - 1 - wxID_ANY - Define Filter - - 0 - - 0 - - - 0 - - 1 - FilterButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnDefineFilterClick - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline77 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL|wxLI_VERTICAL - - 0 - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - - 1 - 0 - 1 - - 1 - - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Show Job Details - - 0 - - 0 - - - 0 - - 1 - JobDetailsToggleButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - OnJobDetailsToggle - - - - - - 5 - wxALL|wxEXPAND - 1 - - - - 1 - 1 - - - 0 - wxID_ANY - - - ResultDataView - protected - - - wxDV_VERT_RULES - ResultsDataViewListCtrl; ResultsDataViewListCtrl.h - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer68 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - &Previous - - 0 - - 0 - - - 0 - - 1 - PreviousButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnPreviousButtonClick - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Add All To Group - - 0 - - 0 - - - 0 - - 1 - AddAllToGroupButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnAddAllToGroupClick - - - - 5 - - 1 - - 0 - protected - 0 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - &Next - - 0 - - 0 - - - 0 - - 1 - NextButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnNextButtonClick - - - - - + + + + + -1 + - - - + + 5 + wxEXPAND | wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + 0 0 wxID_ANY - + 0 - - + + 0 - + 1 - RightPanel + m_staticline81 1 - - + + protected 1 - + Resizable 1 - - + + wxLI_HORIZONTAL + 0 - - - - wxTAB_TRAVERSAL - - - bSizer681 - wxVERTICAL - none - - 5 - wxEXPAND - 0 - - - bSizer73 - wxVERTICAL - none - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - JobDetailsPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer101 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,1 - 0 - 0 - wxID_ANY - MyLabel - 0 - - 0 - - - 0 - - 1 - JobTitleStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 8 - wxBOTH - - - 0 - - InfoSizer - wxFLEX_GROWMODE_SPECIFIED - protected - 0 - 0 - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Job ID : - 0 - - 0 - - - 0 - - 1 - m_staticText72 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - JobIDStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Date of Run : - 0 - - 0 - - - 0 - - 1 - m_staticText74 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - DateOfRunStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Time Of Run : - 0 - - 0 - - - 0 - - 1 - m_staticText93 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - TimeOfRunStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Ref. Volume ID : - 0 - - 0 - - - 0 - - 1 - m_staticText788 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - RefVolumeIDStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Used Symmetry : - 0 - - 0 - - - 0 - - 1 - m_staticText790 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - SymmetryStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Pixel Size : - 0 - - 0 - - - 0 - - 1 - m_staticText78 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - PixelSizeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Voltage : - 0 - - 0 - - - 0 - - 1 - m_staticText83 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - VoltageStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Cs : - 0 - - 0 - - - 0 - - 1 - m_staticText82 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - CsStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Amp. Contrast : - 0 - - 0 - - - 0 - - 1 - m_staticText96 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - AmplitudeContrastStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Defocus 1 : - 0 - - 0 - - - 0 - - 1 - m_staticText85 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - Defocus1StaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Defocus 2 : - 0 - - 0 - - - 0 - - 1 - m_staticText792 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - Defocus2StaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Defocus Angle : - 0 - - 0 - - - 0 - - 1 - m_staticText794 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - DefocusAngleStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Phase Shift : - 0 - - 0 - - - 0 - - 1 - m_staticText796 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - PhaseShiftStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Low Res. Limit : - 0 - - 0 - - - 0 - - 1 - m_staticText87 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - LowResLimitStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - High Res. Limit : - 0 - - 0 - - - 0 - - 1 - m_staticText89 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - HighResLimitStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - OOP Angluar Step : - 0 - - 0 - - - 0 - - 1 - m_staticText91 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - OOPAngluarStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - IP Angular Step : - 0 - - 0 - - - 0 - - 1 - m_staticText79 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - IPAngluarStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Defocus Range : - 0 - - 0 - - - 0 - - 1 - m_staticText798 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - DefocusRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Defocus Step : - 0 - - 0 - - - 0 - - 1 - m_staticText95 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - DefocusStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Pixel Size Range : - 0 - - 0 - - - 0 - - 1 - LargeAstigExpectedLabel - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - PixelSizeRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Pixel Size Step : - 0 - - 0 - - - 0 - - 1 - m_staticText99 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_LEFT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - PixelSizeStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Min. Peak Radius : - 0 - - 0 - - - 0 - - 1 - m_staticText872 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - MinPeakRadiusStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Shift Threshold : - 0 - - 0 - - - 0 - - 1 - m_staticText874 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - ShiftThresholdStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,0 - 0 - 0 - wxID_ANY - Ignore Shifted Peaks : - 0 - - 0 - - - 0 - - 1 - m_staticText876 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - 0 - - - 0 - - 1 - IgnoreShiftedPeaksStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline30 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - - - - - - 5 - wxEXPAND - 0 - - 6 - 0 - - gSizer5 - none - 0 - 0 - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ResultPanel - 1 - - - protected - 1 - - Resizable - 1 - - ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h - 0 - - - - wxTAB_TRAVERSAL - - - - 5 - wxALIGN_RIGHT - 0 - - - bSizer69 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Delete Image From Group - - 0 - - 0 - - - 0 - - 1 - DeleteFromGroupButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnRemoveFromGroupClick - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Add Image To Group - - 0 - - 0 - - - 0 - - 1 - AddToGroupButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - OnAddToGroupClick - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - 200,-1 - 1 - GroupComboBox - 1 - - - protected - 1 - - Resizable - -1 - 1 - - wxCB_READONLY - MemoryComboBox; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - Combo! - - - - - - - - - - - - - - - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - MatchTemplatePanelParent - - 1268,974 - JobPanel; job_panel.h - - 0 - - - wxTAB_TRAVERSAL - OnUpdateUI - - - bSizer43 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline149 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InputPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer534 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer45 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer557 - wxHORIZONTAL - none - - 5 - wxEXPAND - 0 - - 2 - wxHORIZONTAL - - - 0 - - fgSizer15 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Input Image Group : - 0 - - 0 - - - 0 - - 1 - m_staticText262 - 1 - - - protected - 1 - - Resizable - 1 - -1,-1 - - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - 350,-1 - - 0 - 350,-1 - 1 - GroupComboBox - 1 - - - public - 1 - - Resizable - 1 - - ImageGroupPickerComboPanel; AssetPickerComboPanel.h; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Reference Volume : - 0 - - 0 - - - 0 - - 1 - m_staticText478 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 100 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - 350,-1 - - 0 - 350,-1 - 1 - ReferenceSelectPanel - 1 - - - protected - 1 - - Resizable - 1 - - VolumeAssetPickerComboPanel; AssetPickerComboPanel.h; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - 180,0,0 - 1 - ,90,92,-1,70,0 - 0 - 1 - wxID_ANY - Please run CTF estimation on this group before picking particles - 0 - - 0 - - - 0 - - 1 - PleaseEstimateCTFStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - + + + + + - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline151 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - - - - 5 - wxEXPAND - 1 - - - bSizer46 - wxHORIZONTAL - none - - 5 - wxALL|wxEXPAND - 0 - + 5 + wxEXPAND | wxALL + 1 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + 0 0 wxID_ANY - + 0 - - + + 0 - + 1 - ExpertPanel + HistogramPlotPanel 1 - - - protected + + + public 1 - + Resizable - 5 - 5 1 - -1,-1 - + + PlotCurvePanel; PlotCurvePanel.h 0 - - - - wxVSCROLL - - - InputSizer - wxVERTICAL - protected - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - - - 0 - - fgSizer1 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - ,90,92,-1,70,1 - 0 - 0 - wxID_ANY - Search Limits - 0 - - 0 - - - 0 - - 1 - m_staticText201 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Reset All Defaults - - 0 - - 0 - - - 0 - - 1 - ResetAllDefaultsButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - ResetAllDefaultsClick - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Out of Plane Angular Step (°) : - 0 - - 0 - - - 0 - - 1 - m_staticText189 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - OutofPlaneStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - In Plane Angular Step (°) : - 0 - - 0 - - - 0 - - 1 - m_staticText190 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - InPlaneStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - High-Resolution Limit (Å) : - 0 - - 0 - - - 0 - - 1 - m_staticText190211 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - HighResolutionLimitNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.0 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Pointgroup Symmetry : - 0 - - 0 - - - 0 - - 1 - m_staticText19021 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - SymmetryComboBox - 1 - - - public - 1 - - Resizable - -1 - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - C1 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Perform Defocus Search? - 0 - - 0 - - - 0 - - 1 - m_staticText698 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer265 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - DefocusSearchYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - DefocusSearchNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Defocus Range (Å) : - 0 - - 0 - - - 0 - - 1 - DefocusRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - DefocusSearchRangeNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1200 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Defocus Step (Å) : - 0 - - 0 - - - 0 - - 1 - DefocusStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - DefocusSearchStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 200 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Perform Pixel Size Search? - 0 - - 0 - - - 0 - - 1 - m_staticText699 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer2651 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - PixelSizeSearchYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - PixelSizeSearchNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Pixel Size Range (Å) : - 0 - - 0 - - - 0 - - 1 - PixelSizeRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PixelSizeSearchRangeNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0.05 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Pixel Size Step (Å) : - 0 - - 0 - - - 0 - - 1 - PixelSizeStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PixelSizeSearchStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0.01 - - - - - - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,1 - 0 - 0 - wxID_ANY - Peak Selection - 0 - - 0 - - - 0 - - 1 - m_staticText857 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Minimum peak radius (px.) : - 0 - - 0 - - - 0 - - 1 - m_staticText849 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MinPeakRadiusNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,1 - 0 - 0 - wxID_ANY - Gpu Configuration - 0 - - 0 - - - 0 - - 1 - m_staticText8571 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Use GPU? - 0 - - 0 - - - 0 - - 1 - m_staticText6991 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer26513 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - UseGPURadioYes - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - UseGPURadioNo - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Use FastFFT library? - 0 - - 0 - - - 0 - - 1 - m_staticText69911 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer26512 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - UseFastFFTRadioYes - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - UseFastFFTRadioNo - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - - - - - - 5 - wxEXPAND | wxALL - 20 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - OutputTextPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - + + + wxTAB_TRAVERSAL - - - bSizer56 - wxVERTICAL - none - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - -1,-1 - 1 - output_textctrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_MULTILINE|wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - + - - - 5 - wxEXPAND | wxALL - 1 - + + 5 + wxEXPAND | wxALL + 1 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + 0 0 wxID_ANY - + 0 - - + + 0 - + 1 - InfoPanel + PeakChangesPanel 1 - - + + protected 1 - + Resizable 1 - - + + 0 - - - + + + wxTAB_TRAVERSAL - - bSizer61 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InfoText - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - wxHSCROLL|wxVSCROLL - OnInfoURL - + + bSizer594 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ChangesListCtrl + 1 + + + public + 1 + + Resizable + 1 + + wxLC_REPORT|wxLC_SINGLE_SEL + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + - - 5 - wxEXPAND | wxALL - 80 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - ResultsPanel - 1 - - - public - 1 - - Resizable - 1 - - ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h - 0 - - - - wxTAB_TRAVERSAL - - + + - + + + + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_panel86 + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer304 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + + bSizer305 + wxHORIZONTAL + none + + + + 5 + wxEXPAND + 0 + + + bSizer306 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Image / MIP / Found Templates + 0 + + 0 + + + 0 + + 1 + m_staticText394 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + ImageFileText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + 5 wxEXPAND | wxALL 0 - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline11 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline86 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ImageDisplayPanel + 1 + + + public + 1 + + Resizable + 1 + + DisplayPanel; DisplayPanel.h + 0 + + + + wxTAB_TRAVERSAL + - + + + + + + + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + MatchTemplateResultsPanelParent + + 895,557 + + + 0 + + + wxTAB_TRAVERSAL + OnUpdateUI + + + bSizer63 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline25 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + 0 + + 1 + m_splitter4 + 1 + + + protected + 1 + + Resizable + 0.5 + 450 + -1 + 1 + + wxSPLIT_VERTICAL + wxSP_3D + + 0 + + + + + + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_panel13 + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer66 + wxVERTICAL + none + 5 wxEXPAND 0 - - - bSizer48 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer70 - wxHORIZONTAL - none - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - ProgressPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer57 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer59 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - o - 0 - - 0 - - - 0 - - 1 - NumberConnectedText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 100 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ProgressBar - 1 - - - protected - 1 - - 100 - Resizable - 1 - - wxGA_HORIZONTAL - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Time Remaining : ???h:??m:??s - 0 - - 0 - - - 0 - - 1 - TimeRemainingText - 1 - - - protected - 1 - - Resizable - 1 - - wxALIGN_CENTER_HORIZONTAL - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline60 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL|wxLI_VERTICAL - - 0 - - - - - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 1 - wxID_ANY - Finish - - 0 - - 0 - - - 0 - - 1 - FinishButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - FinishButtonClick - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Terminate Job - - 0 - - 0 - - - 0 - - 1 - CancelAlignmentButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - TerminateButtonClick - - - - - - - - + + + bSizer64 + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + All Images + + 0 + + + 0 + + 1 + AllImagesButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + OnAllImagesSelect - - 5 - wxEXPAND | wxALL - 1 - + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + By Filter + + 0 + + + 0 + + 1 + ByFilterButton + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + OnByFilterSelect + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 0 + + 1 + + + 0 + 1 + wxID_ANY + Define Filter + + 0 + + 0 + + + 0 + + 1 + FilterButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnDefineFilterClick + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline77 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL|wxLI_VERTICAL + + 0 + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + + 1 + 0 + 1 + + 1 + + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Show Job Details + + 0 + + 0 + + + 0 + + 1 + JobDetailsToggleButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + OnJobDetailsToggle + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + 1 + + + 0 + wxID_ANY + + + ResultDataView + protected + + + wxDV_VERT_RULES + ResultsDataViewListCtrl; ResultsDataViewListCtrl.h + + + + + + + + 5 + wxEXPAND + 0 + + + bSizer68 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + &Previous + + 0 + + 0 + + + 0 + + 1 + PreviousButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnPreviousButtonClick + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Add All To Group + + 0 + + 0 + + + 0 + + 1 + AddAllToGroupButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnAddAllToGroupClick + + + + 5 + + 1 + + 0 + protected + 0 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + &Next + + 0 + + 0 + + + 0 + + 1 + NextButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnNextButtonClick + + + + + + + + + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + RightPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer681 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + + bSizer73 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + JobDetailsPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer101 + wxVERTICAL + none + + 5 + wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + Sans,90,92,10,74,1 0 0 wxID_ANY - + MyLabel + 0 + 0 - - + + 0 - + 1 - StartPanel + JobTitleStaticText 1 - - + + protected 1 - + Resizable 1 - - + + + 0 - - - - wxTAB_TRAVERSAL - - - bSizer58 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Run Profile : - 0 - - 0 - - - 0 - - 1 - RunProfileText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 50 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - RunProfileComboBox - 1 - - - protected - 1 - - Resizable - -1 - 1 - - wxCB_READONLY - MemoryComboBox; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxEXPAND - 50 - - - bSizer60 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Start Search - - 0 - - 0 - - - 0 - - 1 - StartEstimationButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - StartEstimationClick - - - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Resume Run - - 0 - - - 0 - - 1 - ResumeRunCheckBox - 1 - - - protected - 1 - - Resizable - 1 - - - ; - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - ResumeRunCheckBoxOnCheckBox - - - + + + + + -1 + - - - - - - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - RefineTemplatePanelParent - - 1200,731 - JobPanel; job_panel.h - - 0 - - - wxTAB_TRAVERSAL - OnUpdateUI - - - bSizer43 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline149 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InputPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer534 - wxVERTICAL - none - 5 - wxEXPAND - 1 - - - bSizer45 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer557 - wxHORIZONTAL - none - - 5 - wxEXPAND - 0 - - 2 - wxHORIZONTAL - - - 0 - - fgSizer15 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Input Image Group : - 0 - - 0 - - - 0 - - 1 - m_staticText262 - 1 - - - protected - 1 - - Resizable - 1 - -1,-1 - - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - 350,-1 - - 0 - 350,-1 - 1 - GroupComboBox - 1 - - - public - 1 - - Resizable - 1 - - ImageGroupPickerComboPanel; AssetPickerComboPanel.h; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Reference Volume : - 0 - - 0 - - - 0 - - 1 - m_staticText478 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 100 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - 350,-1 - - 0 - 350,-1 - 1 - ReferenceSelectPanel - 1 - - - protected - 1 - - Resizable - 1 - - VolumeAssetPickerComboPanel; AssetPickerComboPanel.h; forward_declare - 0 - - - - wxTAB_TRAVERSAL - - - - - - + 5 + wxEXPAND + 1 + + 8 + wxBOTH + + + 0 + + InfoSizer + wxFLEX_GROWMODE_SPECIFIED + protected + 0 + 0 + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Job ID : + 0 + + 0 + + + 0 + + 1 + m_staticText72 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + - - - 5 - wxALL - 0 - + + 5 + wxALIGN_LEFT|wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - 180,0,0 + 1 - ,90,92,-1,70,0 + 0 0 wxID_ANY - Please run Match Template on all images in this group before running refine. + 0 - + 0 - - + + 0 - + 1 - InputErrorText + JobIDStaticText 1 - - + + protected 1 - + Resizable 1 - - - + + + 0 - - - - + + + + -1 + - - - 5 - wxEXPAND | wxALL - 0 - + + 5 + wxALIGN_RIGHT|wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + Sans,90,92,10,74,0 0 0 wxID_ANY - + Date of Run : + 0 + 0 - - + + 0 - + 1 - m_staticline151 + m_staticText74 1 - - + + protected 1 - + Resizable 1 - - wxLI_HORIZONTAL - + + + 0 - - - - + + + + + -1 + - - - - - - 5 - wxEXPAND - 1 - - - bSizer46 - wxHORIZONTAL - none - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ExpertPanel - 1 - - - protected - 1 - - Resizable - 5 - 5 - 1 - -1,-1 - - 0 - - - - wxVSCROLL - - - InputSizer - wxVERTICAL + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + DateOfRunStaticText + 1 + + protected - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - - - 0 - - fgSizer1 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,1 - 0 - 0 - wxID_ANY - Peak Selection - 0 - - 0 - - - 0 - - 1 - m_staticText847 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Reset All Defaults - - 0 - - 0 - - - 0 - - 1 - ResetAllDefaultsButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - ResetAllDefaultsClick - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Minimum peak radius (px.) : - 0 - - 0 - - - 0 - - 1 - m_staticText849 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MinPeakRadiusNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Threshold for Peak Selection : - 0 - - 0 - - - 0 - - 1 - m_staticText846 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PeakSelectionThresholdNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Threshold for Results : - 0 - - 0 - - - 0 - - 1 - m_staticText848 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PeakPlottingThresholdNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Remove Highly Shifted Peaks? - 0 - - 0 - - - 0 - - 1 - mask_radius - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer2652 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - RemoveShiftedPeaksYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - RemoveShiftedPeaksNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Shift Threshold (Å) : - 0 - - 0 - - - 0 - - 1 - ShiftThresholdStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PeakChangeThresholdNumericTextCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - ,90,92,-1,70,1 - 0 - 0 - wxID_ANY - Search Limits - 0 - - 0 - - - 0 - - 1 - m_staticText201 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Mask Radius (Å) : - 0 - - 0 - - - 0 - - 1 - m_staticText852 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaskRadiusNumericTextCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Out of Plane Angular Step (°) : - 0 - - 0 - - - 0 - - 1 - m_staticText189 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - OutofPlaneStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - In Plane Angular Step (°) : - 0 - - 0 - - - 0 - - 1 - m_staticText190 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - InPlaneStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - High-Resolution Limit (Å) : - 0 - - 0 - - - 0 - - 1 - m_staticText190211 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - HighResolutionLimitNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.0 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Pointgroup Symmetry : - 0 - - 0 - - - 0 - - 1 - m_staticText19021 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - SymmetryComboBox - 1 - - - public - 1 - - Resizable - -1 - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - C1 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Perform Defocus Search? - 0 - - 0 - - - 0 - - 1 - m_staticText698 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer265 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - DefocusSearchYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - DefocusSearchNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Defocus Range (Å) : - 0 - - 0 - - - 0 - - 1 - DefocusRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - DefocusSearchRangeNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1200 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Defocus Step (Å) : - 0 - - 0 - - - 0 - - 1 - DefocusStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - DefocusSearchStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 200 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Perform Pixel Size Search? - 0 - - 0 - - - 0 - - 1 - m_staticText699 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer2651 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - PixelSizeSearchYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - PixelSizeSearchNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Pixel Size Range (Å) : - 0 - - 0 - - - 0 - - 1 - PixelSizeRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PixelSizeSearchRangeNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0.05 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Pixel Size Step (Å) : - 0 - - 0 - - - 0 - - 1 - PixelSizeStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PixelSizeSearchStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0.01 - - - - - - - - - - - - 5 - wxEXPAND | wxALL - 20 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - OutputTextPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer56 - wxVERTICAL - none - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - -1,-1 - 1 - output_textctrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_MULTILINE|wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InfoPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer61 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InfoText - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - wxHSCROLL|wxVSCROLL - OnInfoURL - - + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + - - - - 5 - wxEXPAND | wxALL - 80 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - ResultsPanel - 1 - - - public - 1 - - Resizable - 1 - - ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h - 0 - - - - wxTAB_TRAVERSAL - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline11 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND - 0 - - - bSizer48 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer70 - wxHORIZONTAL - none - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - ProgressPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer57 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer59 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - o - 0 - - 0 - - - 0 - - 1 - NumberConnectedText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 100 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ProgressBar - 1 - - - protected - 1 - - 100 - Resizable - 1 - - wxGA_HORIZONTAL - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Time Remaining : ???h:??m:??s - 0 - - 0 - - - 0 - - 1 - TimeRemainingText - 1 - - - protected - 1 - - Resizable - 1 - - wxALIGN_CENTER_HORIZONTAL - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline60 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL|wxLI_VERTICAL - - 0 - - - - - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 1 - wxID_ANY - Finish - - 0 - - 0 - - - 0 - - 1 - FinishButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - FinishButtonClick - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Terminate Job - - 0 - - 0 - - - 0 - - 1 - CancelAlignmentButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - TerminateButtonClick - - - - - - - - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - StartPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer58 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Run Profile : - 0 - - 0 - - - 0 - - 1 - RunProfileText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 50 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - RunProfileComboBox - 1 - - - protected - 1 - - Resizable - -1 - 1 - - wxCB_READONLY - MemoryComboBox; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxEXPAND - 50 - - - bSizer60 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Start Search - - 0 - - 0 - - - 0 - - 1 - StartEstimationButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - StartEstimationClick - - - - - - - - - - - - - 0 - wxAUI_MGR_DEFAULT - - - 1 - 1 - impl_virtual - - - 0 - wxID_ANY - - - RefineTemplateDevPanelParent - - 1200,731 - JobPanel; job_panel.h - - 0 - - - wxTAB_TRAVERSAL - OnUpdateUI - - - bSizer43 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline149 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InputPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer534 - wxVERTICAL - none - - 5 - wxEXPAND - 1 - - - bSizer45 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer557 - wxHORIZONTAL - none - - 5 - wxEXPAND - 0 - - 2 - wxHORIZONTAL - - - 0 - - fgSizer15 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Input Image Group : - 0 - - 0 - - - 0 - - 1 - m_staticText262 - 1 - - - protected - 1 - - Resizable - 1 - -1,-1 - - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - 350,-1 - - 0 - 350,-1 - 1 - GroupComboBox - 1 - - - public - 1 - - Resizable - 1 - - ImageGroupPickerComboPanel; AssetPickerComboPanel.h - 0 - - - - wxTAB_TRAVERSAL - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Reference Volume : - 0 - - 0 - - - 0 - - 1 - m_staticText478 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 100 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - 350,-1 - - 0 - 350,-1 - 1 - ReferenceSelectPanel - 1 - - - protected - 1 - - Resizable - 1 - - VolumeAssetPickerComboPanel; AssetPickerComboPanel.h - 0 - - - - wxTAB_TRAVERSAL - - - - - - - - - - 5 - wxALL - 0 - + 5 + wxALIGN_RIGHT|wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - 180,0,0 + 1 - ,90,92,-1,70,0 + Sans,90,92,10,74,0 0 0 wxID_ANY - Please run Match Template on all images in this group before running refine. + Time Of Run : 0 - + 0 - - + + 0 - + 1 - InputErrorText + m_staticText93 1 - - + + protected 1 - + Resizable 1 - - - + + + 0 - - - - + + + + -1 + - - - 5 - wxEXPAND | wxALL - 0 - + + 5 + wxALIGN_LEFT|wxALL + 0 + 1 1 1 1 - - - - - - - + + + + + + + 1 0 1 - + 1 0 Dock 0 Left 1 - + 1 - + 0 0 wxID_ANY - + + 0 + 0 - - + + 0 - + 1 - m_staticline151 + TimeOfRunStaticText 1 - - + + protected 1 - + Resizable 1 - - wxLI_HORIZONTAL - + + + 0 - - - - + + + + + -1 + - - - - - - 5 - wxEXPAND - 1 - - - bSizer46 - wxHORIZONTAL - none - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ExpertPanel - 1 - - - protected - 1 - - Resizable - 5 - 5 - 1 - -1,-1 - - 0 - - - - wxVSCROLL - - - InputSizer - wxVERTICAL + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Ref. Volume ID : + 0 + + 0 + + + 0 + + 1 + m_staticText788 + 1 + + protected - - 5 - wxEXPAND - 1 - - 2 - wxBOTH - - - 0 - - fgSizer1 - wxFLEX_GROWMODE_SPECIFIED - none - 0 - 0 - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - Sans,90,92,10,74,1 - 0 - 0 - wxID_ANY - Peak Selection - 0 - - 0 - - - 0 - - 1 - m_staticText847 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Reset All Defaults - - 0 - - 0 - - - 0 - - 1 - ResetAllDefaultsButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - ResetAllDefaultsClick - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Minimum peak radius (px.) : - 0 - - 0 - - - 0 - - 1 - m_staticText849 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MinPeakRadiusNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 10 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Threshold for Peak Selection : - 0 - - 0 - - - 0 - - 1 - m_staticText846 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PeakSelectionThresholdNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Threshold for Results : - 0 - - 0 - - - 0 - - 1 - m_staticText848 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PeakPlottingThresholdNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Remove Highly Shifted Peaks? - 0 - - 0 - - - 0 - - 1 - mask_radius - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer2652 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - RemoveShiftedPeaksYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - RemoveShiftedPeaksNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Shift Threshold (Å) : - 0 - - 0 - - - 0 - - 1 - ShiftThresholdStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PeakChangeThresholdNumericTextCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_BOTTOM|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - ,90,92,-1,70,1 - 0 - 0 - wxID_ANY - Search Limits - 0 - - 0 - - - 0 - - 1 - m_staticText201 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - 0 - protected - 0 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Mask Radius (Å) : - 0 - - 0 - - - 0 - - 1 - m_staticText852 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - MaskRadiusNumericTextCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Out of Plane Angular Step (°) : - 0 - - 0 - - - 0 - - 1 - m_staticText189 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - OutofPlaneStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - In Plane Angular Step (°) : - 0 - - 0 - - - 0 - - 1 - m_staticText190 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - InPlaneStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1.5 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - High-Resolution Limit (Å) : - 0 - - 0 - - - 0 - - 1 - m_staticText190211 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - HighResolutionLimitNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 2.0 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Perform Defocus Search? - 0 - - 0 - - - 0 - - 1 - m_staticText698 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer265 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - DefocusSearchYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - DefocusSearchNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Defocus Range (Å) : - 0 - - 0 - - - 0 - - 1 - DefocusRangeStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - DefocusSearchRangeNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 200 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Defocus Step (Å) : - 0 - - 0 - - - 0 - - 1 - DefocusStepStaticText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - DefocusSearchStepNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 10 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Refine Astigmatism? - 0 - - 0 - - - 0 - - 1 - m_staticText699 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer2651 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - AstigmatismSearchYesRadio - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - AstigmatismSearchNoRadio - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1 - - - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - Constrain by N-neighbors : - 0 - - 0 - - - 0 - - 1 - AstigmatismConstraint - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALL|wxEXPAND - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 0 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - - 1 - PixelSizeSearchRangeNumericCtrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_PROCESS_ENTER - NumericTextCtrl; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0.05 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Refine Beam Tilt? - 0 - - 0 - - - 0 - - 1 - m_staticText6992 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxEXPAND - 1 - - - bSizer26511 - wxHORIZONTAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Yes - - 0 - - - 0 - - 1 - BeamTiltSearchYesRadio1 - 1 - - - protected - 1 - - Resizable - 1 - - wxRB_GROUP - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - No - - 0 - - - 0 - - 1 - BeamTiltSearchNoRadio1 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 1 - - - - - - - - - + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + RefVolumeIDStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Used Symmetry : + 0 + + 0 + + + 0 + + 1 + m_staticText790 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + SymmetryStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Pixel Size : + 0 + + 0 + + + 0 + + 1 + m_staticText78 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + PixelSizeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Voltage : + 0 + + 0 + + + 0 + + 1 + m_staticText83 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + VoltageStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Cs : + 0 + + 0 + + + 0 + + 1 + m_staticText82 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + CsStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Amp. Contrast : + 0 + + 0 + + + 0 + + 1 + m_staticText96 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + AmplitudeContrastStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Defocus 1 : + 0 + + 0 + + + 0 + + 1 + m_staticText85 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + Defocus1StaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Defocus 2 : + 0 + + 0 + + + 0 + + 1 + m_staticText792 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + Defocus2StaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Defocus Angle : + 0 + + 0 + + + 0 + + 1 + m_staticText794 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + DefocusAngleStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Phase Shift : + 0 + + 0 + + + 0 + + 1 + m_staticText796 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + PhaseShiftStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Low Res. Limit : + 0 + + 0 + + + 0 + + 1 + m_staticText87 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + LowResLimitStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + High Res. Limit : + 0 + + 0 + + + 0 + + 1 + m_staticText89 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + HighResLimitStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + OOP Angluar Step : + 0 + + 0 + + + 0 + + 1 + m_staticText91 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + OOPAngluarStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + IP Angular Step : + 0 + + 0 + + + 0 + + 1 + m_staticText79 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + IPAngluarStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Defocus Range : + 0 + + 0 + + + 0 + + 1 + m_staticText798 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + DefocusRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Defocus Step : + 0 + + 0 + + + 0 + + 1 + m_staticText95 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + DefocusStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Pixel Size Range : + 0 + + 0 + + + 0 + + 1 + LargeAstigExpectedLabel + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + PixelSizeRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Pixel Size Step : + 0 + + 0 + + + 0 + + 1 + m_staticText99 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_LEFT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + PixelSizeStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Min. Peak Radius : + 0 + + 0 + + + 0 + + 1 + m_staticText872 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + MinPeakRadiusStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Shift Threshold : + 0 + + 0 + + + 0 + + 1 + m_staticText874 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + ShiftThresholdStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,0 + 0 + 0 + wxID_ANY + Ignore Shifted Peaks : + 0 + + 0 + + + 0 + + 1 + m_staticText876 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + 0 + + + 0 + + 1 + IgnoreShiftedPeaksStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline30 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + 6 + 0 + + gSizer5 + none + 0 + 0 + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ResultPanel + 1 + + + protected + 1 + + Resizable + 1 + + ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h + 0 + + + + wxTAB_TRAVERSAL + + + + 5 + wxALIGN_RIGHT + 0 + + + bSizer69 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Delete Image From Group + + 0 + + 0 + + + 0 + + 1 + DeleteFromGroupButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnRemoveFromGroupClick + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Add Image To Group + + 0 + + 0 + + + 0 + + 1 + AddToGroupButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnAddToGroupClick + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + 200,-1 + 1 + GroupComboBox + 1 + + + protected + 1 + + Resizable + -1 + 1 + + wxCB_READONLY + MemoryComboBox; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + Combo! + + + + + + + + + + + + + + + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + MatchTemplatePanelParent + + 1268,974 + JobPanel; job_panel.h + + 0 + + + wxTAB_TRAVERSAL + OnUpdateUI + + + bSizer43 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline149 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InputPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer534 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer45 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer557 + wxHORIZONTAL + none + + 5 + wxEXPAND + 0 + + 2 + wxHORIZONTAL + + + 0 + + fgSizer15 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Input Image Group : + 0 + + 0 + + + 0 + + 1 + m_staticText262 + 1 + + + protected + 1 + + Resizable + 1 + -1,-1 + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + 350,-1 + + 0 + 350,-1 + 1 + GroupComboBox + 1 + + + public + 1 + + Resizable + 1 + + ImageGroupPickerComboPanel; AssetPickerComboPanel.h; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reference Volume : + 0 + + 0 + + + 0 + + 1 + m_staticText478 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + 350,-1 + + 0 + 350,-1 + 1 + ReferenceSelectPanel + 1 + + + protected + 1 + + Resizable + 1 + + VolumeAssetPickerComboPanel; AssetPickerComboPanel.h; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + 180,0,0 + 1 + ,90,92,-1,70,0 + 0 + 1 + wxID_ANY + Please run CTF estimation on this group before picking particles + 0 + + 0 + + + 0 + + 1 + PleaseEstimateCTFStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline151 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer46 + wxHORIZONTAL + none + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ExpertPanel + 1 + + + protected + 1 + + Resizable + 5 + 5 + 1 + -1,-1 + + 0 + + + + wxVSCROLL + + + InputSizer + wxVERTICAL + protected + + 5 + wxEXPAND + 1 + + 2 + wxBOTH + + + 0 + + fgSizer1 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,92,-1,70,1 + 0 + 0 + wxID_ANY + Search Limits + 0 + + 0 + + + 0 + + 1 + m_staticText201 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Reset All Defaults + + 0 + + 0 + + + 0 + + 1 + ResetAllDefaultsButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + ResetAllDefaultsClick + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Out of Plane Angular Step (°) : + 0 + + 0 + + + 0 + + 1 + m_staticText189 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + OutofPlaneStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + In Plane Angular Step (°) : + 0 + + 0 + + + 0 + + 1 + m_staticText190 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + InPlaneStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + High-Resolution Limit (Å) : + 0 + + 0 + + + 0 + + 1 + m_staticText190211 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + HighResolutionLimitNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.0 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Pointgroup Symmetry : + 0 + + 0 + + + 0 + + 1 + m_staticText19021 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + SymmetryComboBox + 1 + + + public + 1 + + Resizable + -1 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + C1 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Perform Defocus Search? + 0 + + 0 + + + 0 + + 1 + m_staticText698 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer265 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + DefocusSearchYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + DefocusSearchNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Defocus Range (Å) : + 0 + + 0 + + + 0 + + 1 + DefocusRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + DefocusSearchRangeNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1200 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Defocus Step (Å) : + 0 + + 0 + + + 0 + + 1 + DefocusStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + DefocusSearchStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 200 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Perform Pixel Size Search? + 0 + + 0 + + + 0 + + 1 + m_staticText699 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer2651 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + PixelSizeSearchYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + PixelSizeSearchNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Pixel Size Range (Å) : + 0 + + 0 + + + 0 + + 1 + PixelSizeRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PixelSizeSearchRangeNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0.05 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Pixel Size Step (Å) : + 0 + + 0 + + + 0 + + 1 + PixelSizeStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PixelSizeSearchStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0.01 + + + + + + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,1 + 0 + 0 + wxID_ANY + Peak Selection + 0 + + 0 + + + 0 + + 1 + m_staticText857 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Minimum peak radius (px.) : + 0 + + 0 + + + 0 + + 1 + m_staticText849 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MinPeakRadiusNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,1 + 0 + 0 + wxID_ANY + Gpu Configuration + 0 + + 0 + + + 0 + + 1 + m_staticText8571 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Use GPU? + 0 + + 0 + + + 0 + + 1 + m_staticText6991 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer26513 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + UseGPURadioYes + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + UseGPURadioNo + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Use FastFFT library? + 0 + + 0 + + + 0 + + 1 + m_staticText69911 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer26512 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + UseFastFFTRadioYes + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + UseFastFFTRadioNo + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 20 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + OutputTextPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer56 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + -1,-1 + 1 + output_textctrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_MULTILINE|wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InfoPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer61 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InfoText + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + wxHSCROLL|wxVSCROLL + OnInfoURL + + + + + + + 5 + wxEXPAND | wxALL + 80 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + ResultsPanel + 1 + + + public + 1 + + Resizable + 1 + + ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h + 0 + + + + wxTAB_TRAVERSAL + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline11 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND + 0 + + + bSizer48 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer70 + wxHORIZONTAL + none + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + ProgressPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer57 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer59 + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + o + 0 + + 0 + + + 0 + + 1 + NumberConnectedText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ProgressBar + 1 + + + protected + 1 + + 100 + Resizable + 1 + + wxGA_HORIZONTAL + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Time Remaining : ???h:??m:??s + 0 + + 0 + + + 0 + + 1 + TimeRemainingText + 1 + + + protected + 1 + + Resizable + 1 + + wxALIGN_CENTER_HORIZONTAL + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline60 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL|wxLI_VERTICAL + + 0 + + + + + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 1 + wxID_ANY + Finish + + 0 + + 0 + + + 0 + + 1 + FinishButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + FinishButtonClick + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Terminate Job + + 0 + + 0 + + + 0 + + 1 + CancelAlignmentButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + TerminateButtonClick + + + + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StartPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer58 + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Run Profile : + 0 + + 0 + + + 0 + + 1 + RunProfileText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 50 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + RunProfileComboBox + 1 + + + protected + 1 + + Resizable + -1 + 1 + + wxCB_READONLY + MemoryComboBox; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxEXPAND + 50 + + + bSizer60 + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Start Search + + 0 + + 0 + + + 0 + + 1 + StartEstimationButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + StartEstimationClick + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Add To Queue + + 0 + + 0 + + + 0 + + 1 + AddToQueueButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnAddToQueueClick + + + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Resume Run + + 0 + + + 0 + + 1 + ResumeRunCheckBox + 1 + + + protected + 1 + + Resizable + 1 + + + ; + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + ResumeRunCheckBoxOnCheckBox + + + + + + + + + + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + RefineTemplatePanelParent + + 1200,731 + JobPanel; job_panel.h + + 0 + + + wxTAB_TRAVERSAL + OnUpdateUI + + + bSizer43 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline149 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InputPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer534 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer45 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer557 + wxHORIZONTAL + none + + 5 + wxEXPAND + 0 + + 2 + wxHORIZONTAL + + + 0 + + fgSizer15 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Input Image Group : + 0 + + 0 + + + 0 + + 1 + m_staticText262 + 1 + + + protected + 1 + + Resizable + 1 + -1,-1 + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + 350,-1 + + 0 + 350,-1 + 1 + GroupComboBox + 1 + + + public + 1 + + Resizable + 1 + + ImageGroupPickerComboPanel; AssetPickerComboPanel.h; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reference Volume : + 0 + + 0 + + + 0 + + 1 + m_staticText478 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + 350,-1 + + 0 + 350,-1 + 1 + ReferenceSelectPanel + 1 + + + protected + 1 + + Resizable + 1 + + VolumeAssetPickerComboPanel; AssetPickerComboPanel.h; forward_declare + 0 + + + + wxTAB_TRAVERSAL + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + 180,0,0 + 1 + ,90,92,-1,70,0 + 0 + 0 + wxID_ANY + Please run Match Template on all images in this group before running refine. + 0 + + 0 + + + 0 + + 1 + InputErrorText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline151 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer46 + wxHORIZONTAL + none + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ExpertPanel + 1 + + + protected + 1 + + Resizable + 5 + 5 + 1 + -1,-1 + + 0 + + + + wxVSCROLL + + + InputSizer + wxVERTICAL + protected + + 5 + wxEXPAND + 1 + + 2 + wxBOTH + + + 0 + + fgSizer1 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,1 + 0 + 0 + wxID_ANY + Peak Selection + 0 + + 0 + + + 0 + + 1 + m_staticText847 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Reset All Defaults + + 0 + + 0 + + + 0 + + 1 + ResetAllDefaultsButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + ResetAllDefaultsClick + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Minimum peak radius (px.) : + 0 + + 0 + + + 0 + + 1 + m_staticText849 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MinPeakRadiusNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Threshold for Peak Selection : + 0 + + 0 + + + 0 + + 1 + m_staticText846 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PeakSelectionThresholdNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Threshold for Results : + 0 + + 0 + + + 0 + + 1 + m_staticText848 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PeakPlottingThresholdNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Remove Highly Shifted Peaks? + 0 + + 0 + + + 0 + + 1 + mask_radius + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer2652 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + RemoveShiftedPeaksYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + RemoveShiftedPeaksNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Shift Threshold (Å) : + 0 + + 0 + + + 0 + + 1 + ShiftThresholdStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PeakChangeThresholdNumericTextCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,92,-1,70,1 + 0 + 0 + wxID_ANY + Search Limits + 0 + + 0 + + + 0 + + 1 + m_staticText201 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Mask Radius (Å) : + 0 + + 0 + + + 0 + + 1 + m_staticText852 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaskRadiusNumericTextCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Out of Plane Angular Step (°) : + 0 + + 0 + + + 0 + + 1 + m_staticText189 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + OutofPlaneStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + In Plane Angular Step (°) : + 0 + + 0 + + + 0 + + 1 + m_staticText190 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + InPlaneStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + High-Resolution Limit (Å) : + 0 + + 0 + + + 0 + + 1 + m_staticText190211 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + HighResolutionLimitNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.0 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Pointgroup Symmetry : + 0 + + 0 + + + 0 + + 1 + m_staticText19021 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + SymmetryComboBox + 1 + + + public + 1 + + Resizable + -1 + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + C1 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Perform Defocus Search? + 0 + + 0 + + + 0 + + 1 + m_staticText698 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer265 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + DefocusSearchYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + DefocusSearchNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Defocus Range (Å) : + 0 + + 0 + + + 0 + + 1 + DefocusRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + DefocusSearchRangeNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1200 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Defocus Step (Å) : + 0 + + 0 + + + 0 + + 1 + DefocusStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + DefocusSearchStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 200 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Perform Pixel Size Search? + 0 + + 0 + + + 0 + + 1 + m_staticText699 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer2651 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + PixelSizeSearchYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + PixelSizeSearchNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Pixel Size Range (Å) : + 0 + + 0 + + + 0 + + 1 + PixelSizeRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PixelSizeSearchRangeNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0.05 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Pixel Size Step (Å) : + 0 + + 0 + + + 0 + + 1 + PixelSizeStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PixelSizeSearchStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0.01 + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 20 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + OutputTextPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer56 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + -1,-1 + 1 + output_textctrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_MULTILINE|wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InfoPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer61 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InfoText + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + wxHSCROLL|wxVSCROLL + OnInfoURL + + + + + + + 5 + wxEXPAND | wxALL + 80 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + ResultsPanel + 1 + + + public + 1 + + Resizable + 1 + + ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h + 0 + + + + wxTAB_TRAVERSAL + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline11 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND + 0 + + + bSizer48 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer70 + wxHORIZONTAL + none + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + ProgressPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer57 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer59 + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + o + 0 + + 0 + + + 0 + + 1 + NumberConnectedText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ProgressBar + 1 + + + protected + 1 + + 100 + Resizable + 1 + + wxGA_HORIZONTAL + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Time Remaining : ???h:??m:??s + 0 + + 0 + + + 0 + + 1 + TimeRemainingText + 1 + + + protected + 1 + + Resizable + 1 + + wxALIGN_CENTER_HORIZONTAL + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline60 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL|wxLI_VERTICAL + + 0 + + + + + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 1 + wxID_ANY + Finish + + 0 + + 0 + + + 0 + + 1 + FinishButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + FinishButtonClick + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Terminate Job + + 0 + + 0 + + + 0 + + 1 + CancelAlignmentButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + TerminateButtonClick + + + + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StartPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer58 + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Run Profile : + 0 + + 0 + + + 0 + + 1 + RunProfileText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 50 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + RunProfileComboBox + 1 + + + protected + 1 + + Resizable + -1 + 1 + + wxCB_READONLY + MemoryComboBox; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxEXPAND + 50 + + + bSizer60 + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Start Search + + 0 + + 0 + + + 0 + + 1 + StartEstimationButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + StartEstimationClick + + + + + + + + + + + + + 0 + wxAUI_MGR_DEFAULT + + + 1 + 1 + impl_virtual + + + 0 + wxID_ANY + + + RefineTemplateDevPanelParent + + 1200,731 + JobPanel; job_panel.h + + 0 + + + wxTAB_TRAVERSAL + OnUpdateUI + + + bSizer43 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline149 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InputPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer534 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + bSizer45 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer557 + wxHORIZONTAL + none + + 5 + wxEXPAND + 0 + + 2 + wxHORIZONTAL + + + 0 + + fgSizer15 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Input Image Group : + 0 + + 0 + + + 0 + + 1 + m_staticText262 + 1 + + + protected + 1 + + Resizable + 1 + -1,-1 + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + 350,-1 + + 0 + 350,-1 + 1 + GroupComboBox + 1 + + + public + 1 + + Resizable + 1 + + ImageGroupPickerComboPanel; AssetPickerComboPanel.h + 0 + + + + wxTAB_TRAVERSAL + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Reference Volume : + 0 + + 0 + + + 0 + + 1 + m_staticText478 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + 350,-1 + + 0 + 350,-1 + 1 + ReferenceSelectPanel + 1 + + + protected + 1 + + Resizable + 1 + + VolumeAssetPickerComboPanel; AssetPickerComboPanel.h + 0 + + + + wxTAB_TRAVERSAL + + + + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + 180,0,0 + 1 + ,90,92,-1,70,0 + 0 + 0 + wxID_ANY + Please run Match Template on all images in this group before running refine. + 0 + + 0 + + + 0 + + 1 + InputErrorText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline151 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + + + + 5 + wxEXPAND + 1 + + + bSizer46 + wxHORIZONTAL + none + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ExpertPanel + 1 + + + protected + 1 + + Resizable + 5 + 5 + 1 + -1,-1 + + 0 + + + + wxVSCROLL + + + InputSizer + wxVERTICAL + protected + + 5 + wxEXPAND + 1 + + 2 + wxBOTH + + + 0 + + fgSizer1 + wxFLEX_GROWMODE_SPECIFIED + none + 0 + 0 + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + Sans,90,92,10,74,1 + 0 + 0 + wxID_ANY + Peak Selection + 0 + + 0 + + + 0 + + 1 + m_staticText847 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Reset All Defaults + + 0 + + 0 + + + 0 + + 1 + ResetAllDefaultsButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + ResetAllDefaultsClick + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Minimum peak radius (px.) : + 0 + + 0 + + + 0 + + 1 + m_staticText849 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MinPeakRadiusNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 10 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Threshold for Peak Selection : + 0 + + 0 + + + 0 + + 1 + m_staticText846 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PeakSelectionThresholdNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Threshold for Results : + 0 + + 0 + + + 0 + + 1 + m_staticText848 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PeakPlottingThresholdNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Remove Highly Shifted Peaks? + 0 + + 0 + + + 0 + + 1 + mask_radius + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer2652 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + RemoveShiftedPeaksYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + RemoveShiftedPeaksNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Shift Threshold (Å) : + 0 + + 0 + + + 0 + + 1 + ShiftThresholdStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PeakChangeThresholdNumericTextCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_BOTTOM|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,92,-1,70,1 + 0 + 0 + wxID_ANY + Search Limits + 0 + + 0 + + + 0 + + 1 + m_staticText201 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Mask Radius (Å) : + 0 + + 0 + + + 0 + + 1 + m_staticText852 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + MaskRadiusNumericTextCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + - + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Out of Plane Angular Step (°) : + 0 + + 0 + + + 0 + + 1 + m_staticText189 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + OutofPlaneStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + In Plane Angular Step (°) : + 0 + + 0 + + + 0 + + 1 + m_staticText190 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + InPlaneStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1.5 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + High-Resolution Limit (Å) : + 0 + + 0 + + + 0 + + 1 + m_staticText190211 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + HighResolutionLimitNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 2.0 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Perform Defocus Search? + 0 + + 0 + + + 0 + + 1 + m_staticText698 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer265 + wxHORIZONTAL + none + 5 wxALL 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Perform Pixel Size Search? - 0 - - 0 - - - 0 - - 1 - m_staticText6991 - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + DefocusSearchYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + - - + + 5 - wxEXPAND | wxALL - 20 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - OutputTextPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer56 - wxVERTICAL - none - - 5 - wxALL|wxEXPAND - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - - 0 - -1,-1 - 1 - output_textctrl - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_MULTILINE|wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + DefocusSearchNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Defocus Range (Å) : + 0 + + 0 + + + 0 + + 1 + DefocusRangeStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 - + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + DefocusSearchRangeNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 200 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Defocus Step (Å) : + 0 + + 0 + + + 0 + + 1 + DefocusStepStaticText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + DefocusSearchStepNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 10 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Refine Astigmatism? + 0 + + 0 + + + 0 + + 1 + m_staticText699 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer2651 + wxHORIZONTAL + none + 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InfoPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer61 - wxVERTICAL - none - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - InfoText - 1 - - - protected - 1 - - Resizable - 1 - - wxTE_READONLY - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - wxHSCROLL|wxVSCROLL - OnInfoURL - - - + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + AstigmatismSearchYesRadio + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + AstigmatismSearchNoRadio + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1 + + + + + - + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + Constrain by N-neighbors : + 0 + + 0 + + + 0 + + 1 + AstigmatismConstraint + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 0 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + PixelSizeSearchRangeNumericCtrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_PROCESS_ENTER + NumericTextCtrl; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0.05 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Refine Beam Tilt? + 0 + + 0 + + + 0 + + 1 + m_staticText6992 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND + 1 + + + bSizer26511 + wxHORIZONTAL + none + 5 - wxEXPAND | wxALL - 80 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - ResultsPanel - 1 - - - public - 1 - - Resizable - 1 - - ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h - 0 - - - - wxTAB_TRAVERSAL + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Yes + + 0 + + + 0 + + 1 + BeamTiltSearchYesRadio1 + 1 + + + protected + 1 + + Resizable + 1 + + wxRB_GROUP + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + No + + 0 + + + 0 + + 1 + BeamTiltSearchNoRadio1 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 1 + + + + + + - + + + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Perform Pixel Size Search? + 0 + + 0 + + + 0 + + 1 + m_staticText6991 + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxEXPAND | wxALL + 20 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + OutputTextPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer56 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + -1,-1 + 1 + output_textctrl + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_MULTILINE|wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InfoPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer61 + wxVERTICAL + none + 5 wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline11 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL - - 0 - - - - + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + InfoText + 1 + + + protected + 1 + + Resizable + 1 + + wxTE_READONLY + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + wxHSCROLL|wxVSCROLL + OnInfoURL + + + + + 5 + wxEXPAND | wxALL + 80 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + ResultsPanel + 1 + + + public + 1 + + Resizable + 1 + + ShowTemplateMatchResultsPanel; ShowTemplateMatchResultsPanel.h + 0 + + + + wxTAB_TRAVERSAL + + + + + + 5 + wxEXPAND | wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline11 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL + + 0 + + + + + + + + 5 + wxEXPAND + 0 + + + bSizer48 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer70 + wxHORIZONTAL + none - 5 - wxEXPAND - 0 + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 1 + wxID_ANY + + 0 + + + 0 + + 1 + ProgressPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL - - bSizer48 - wxHORIZONTAL - none - + + bSizer57 + wxHORIZONTAL + none + + 5 + wxEXPAND + 1 + + + bSizer59 + wxHORIZONTAL + none + 5 - wxEXPAND - 1 - - - bSizer70 - wxHORIZONTAL - none - - 5 - wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 1 - wxID_ANY - - 0 - - - 0 - - 1 - ProgressPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer57 - wxHORIZONTAL - none - - 5 - wxEXPAND - 1 - - - bSizer59 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - o - 0 - - 0 - - - 0 - - 1 - NumberConnectedText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND - 100 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - ProgressBar - 1 - - - protected - 1 - - 100 - Resizable - 1 - - wxGA_HORIZONTAL - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - 0 - - - - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Time Remaining : ???h:??m:??s - 0 - - 0 - - - 0 - - 1 - TimeRemainingText - 1 - - - protected - 1 - - Resizable - 1 - - wxALIGN_CENTER_HORIZONTAL - - 0 - - - - - -1 - - - - 5 - wxEXPAND | wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - m_staticline60 - 1 - - - protected - 1 - - Resizable - 1 - - wxLI_HORIZONTAL|wxLI_VERTICAL - - 0 - - - - - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 1 - wxID_ANY - Finish - - 0 - - 0 - - - 0 - - 1 - FinishButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - FinishButtonClick - - - - 5 - wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Terminate Job - - 0 - - 0 - - - 0 - - 1 - CancelAlignmentButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - TerminateButtonClick - - - - - - - + wxALIGN_CENTER|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + o + 0 + + 0 + + + 0 + + 1 + NumberConnectedText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 - - + + + 5 + wxALIGN_CENTER|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL|wxEXPAND + 100 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + ProgressBar + 1 + + + protected + 1 + + 100 + Resizable + 1 + + wxGA_HORIZONTAL + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + 0 + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Time Remaining : ???h:??m:??s + 0 + + 0 + + + 0 + + 1 + TimeRemainingText + 1 + + + protected + 1 + + Resizable + 1 + + wxALIGN_CENTER_HORIZONTAL + + 0 + + + + + -1 + + + 5 wxEXPAND | wxALL - 1 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - StartPanel - 1 - - - protected - 1 - - Resizable - 1 - - - 0 - - - - wxTAB_TRAVERSAL - - - bSizer58 - wxHORIZONTAL - none - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - Run Profile : - 0 - - 0 - - - 0 - - 1 - RunProfileText - 1 - - - protected - 1 - - Resizable - 1 - - - - 0 - - - - - -1 - - - - 5 - wxALIGN_CENTER_VERTICAL|wxALL - 50 - - 1 - 1 - 1 - 1 - - - - - - - - 1 - 0 - - 1 - - 1 - 0 - Dock - 0 - Left - 1 - - 1 - - 0 - 0 - wxID_ANY - - 0 - - - 0 - - 1 - RunProfileComboBox - 1 - - - protected - 1 - - Resizable - -1 - 1 - - wxCB_READONLY - MemoryComboBox; my_controls.h - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - - - - - 5 - wxEXPAND - 50 - - - bSizer60 - wxVERTICAL - none - - 5 - wxALL - 0 - - 1 - 1 - 1 - 1 - - - - - 0 - - - - - 1 - 0 - 1 - - 1 - - 0 - 0 - - Dock - 0 - Left - 1 - - 1 - - - 0 - 0 - wxID_ANY - Start Search - - 0 - - 0 - - - 0 - - 1 - StartEstimationButton - 1 - - - protected - 1 - - - - Resizable - 1 - - - - 0 - - - wxFILTER_NONE - wxDefaultValidator - - - - - StartEstimationClick - - - - - + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + m_staticline60 + 1 + + + protected + 1 + + Resizable + 1 + + wxLI_HORIZONTAL|wxLI_VERTICAL + + 0 + + + + + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 1 + wxID_ANY + Finish + + 0 + + 0 + + + 0 + + 1 + FinishButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + FinishButtonClick + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Terminate Job + + 0 + + 0 + + + 0 + + 1 + CancelAlignmentButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + TerminateButtonClick + + + + + + + + + + 5 + wxEXPAND | wxALL + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + StartPanel + 1 + + + protected + 1 + + Resizable + 1 + + + 0 + + + + wxTAB_TRAVERSAL + + + bSizer58 + wxHORIZONTAL + none + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Run Profile : + 0 + + 0 + + + 0 + + 1 + RunProfileText + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + + + -1 + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 50 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + 0 + + 1 + RunProfileComboBox + 1 + + + protected + 1 + + Resizable + -1 + 1 + + wxCB_READONLY + MemoryComboBox; my_controls.h + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + wxEXPAND + 50 + + + bSizer60 + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + 0 + + + + + 1 + 0 + 1 + + 1 + + 0 + 0 + + Dock + 0 + Left + 1 + + 1 + + + 0 + 0 + wxID_ANY + Start Search + + 0 + + 0 + + + 0 + + 1 + StartEstimationButton + 1 + + + protected + 1 + + + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + StartEstimationClick + + + + + + diff --git a/src/programs/CLAUDE.md b/src/programs/CLAUDE.md new file mode 100644 index 000000000..3bb3f8f2a --- /dev/null +++ b/src/programs/CLAUDE.md @@ -0,0 +1,250 @@ +# Command-Line Program Development Guidelines for cisTEM + +This file provides guidance for developing and maintaining cisTEM's command-line programs. + +## Program Architecture + +Each cisTEM program is a self-contained executable that performs a specific image processing task. Programs are designed to be independent of the GUI and database, allowing them to run standalone or be called from the GUI. + +### Standard Program Structure +```cpp +#include "../../core/core_headers.h" + +class MyProgram : public MyApp { +public: + bool DoCalculation(); + void DoInteractiveUserInput(); + +private: + // Program-specific parameters + float pixel_size; + int box_size; + wxString input_filename; +}; + +IMPLEMENT_APP(MyProgram) + +bool MyProgram::DoCalculation() { + // Main processing logic + return true; +} + +void MyProgram::DoInteractiveUserInput() { + // Interactive parameter collection +} +``` + +## Parameter Handling + +### UserInput Framework +Use the UserInput class for consistent parameter collection: +```cpp +UserInput my_input("ProgramName", version); + +// Add parameter definitions +my_input.AddParameter("PARAMETER_NAME", "Input filename", "input.mrc", MRC_FILENAME); +my_input.AddParameter("BOX_SIZE", "Box size in pixels", "256"); +my_input.AddParameter("PIXEL_SIZE", "Pixel size in Angstroms", "1.0"); + +// Check for command-line arguments +if (!my_input.CheckForHelp(argc, argv)) { + // Collect parameters + if (my_input.CheckForDoubleClick(argc, argv)) { + // Interactive mode + DoInteractiveUserInput(); + } else { + // Command-line mode + my_input.GetParameters(argc, argv); + } +} +``` + +### Command-Line Argument Changes +When modifying command-line arguments, maintain backward compatibility: +```cpp +// Example: Replacing MAX_SEARCH_SIZE define with CLI argument +// OLD: #define MAX_SEARCH_SIZE 500 +// NEW: Add as parameter with sensible default +my_input.AddParameter("MAX_SEARCH_SIZE", "Maximum search size", "500"); +``` + +## Progress Reporting + +### ProgressBar Usage +For long-running operations, provide progress feedback: +```cpp +ProgressBar my_progress_bar(number_of_steps); + +for (int step = 0; step < number_of_steps; step++) { + // Do work + ProcessStep(step); + + // Update progress + my_progress_bar.Update(step + 1); +} +``` + +### Console Output Guidelines +- Use `wxPrintf()` for normal output +- Use `SendInfo()` for important status messages +- Use `SendError()` for error conditions +- Avoid excessive output in loops + +## File I/O Patterns + +### Input File Validation +Always validate input files before processing: +```cpp +if (!DoesFileExist(input_filename)) { + SendError(wxString::Format("Input file %s does not exist", input_filename)); + return false; +} + +MRCFile input_file(input_filename.ToStdString(), false); +if (!input_file.is_valid) { + SendError("Invalid MRC file"); + return false; +} +``` + +### Output File Handling +Check for existing files and handle appropriately: +```cpp +if (DoesFileExist(output_filename) && !overwrite) { + SendError(wxString::Format("Output file %s already exists", output_filename)); + return false; +} +``` + +### Results Output +Programs output results directly to files, not databases: +```cpp +// Write results to MRC files +MRCFile output_file(output_filename.ToStdString(), true); +result_image.WriteSlices(&output_file, 1, result_image.logical_z_dimension); + +// Write metadata to text files +NumericTextFile results_file(results_filename, OPEN_TO_WRITE); +results_file.WriteCommentLine("# Column 1: Image number"); +results_file.WriteCommentLine("# Column 2: Defocus 1 (Angstroms)"); +results_file.WriteLine(image_number, defocus1, defocus2); +``` + +## Common Program Types + +### Image Processing Programs +Programs that process individual images or stacks: +- `ctffind` - CTF estimation +- `unblur` - Motion correction +- `resample` - Image resampling + +### 3D Processing Programs +Programs that work with 3D volumes: +- `refine3d` - 3D refinement +- `reconstruct3d` - 3D reconstruction +- `project3d` - Generate 2D projections + +### Utility Programs +Helper programs for specific tasks: +- `merge_star` - Merge STAR files +- `remove_duplicates` - Remove duplicate particles +- `apply_mask` - Apply masks to images + +## Testing Programs + +### Quick Test Pattern +For rapid development testing: +```cpp +// In programs/quick_test/quick_test.cpp +if (test_type == "my_new_test") { + // Test your new functionality + Image test_image; + test_image.Allocate(256, 256, 1); + + // Run your algorithm + MyNewAlgorithm(test_image); + + // Verify results + wxPrintf("Test completed successfully\n"); +} +``` + +## Performance Optimization + +### OpenMP Parallelization +Use OpenMP for parallel processing: +```cpp +#pragma omp parallel for schedule(dynamic) +for (long particle = 0; particle < number_of_particles; particle++) { + // Process each particle independently + ProcessParticle(particle); +} +``` + +### Memory Management +Be mindful of memory usage with large datasets: +```cpp +// Process in chunks for large datasets +const int chunk_size = 1000; +for (int start = 0; start < total_images; start += chunk_size) { + int end = std::min(start + chunk_size, total_images); + ProcessImageChunk(start, end); +} +``` + +## Error Handling + +### Graceful Failure +Programs should fail gracefully with informative messages: +```cpp +try { + // Main processing + if (!DoCalculation()) { + SendError("Calculation failed"); + return false; + } +} catch (std::exception& e) { + SendError(wxString::Format("Fatal error: %s", e.what())); + return false; +} +``` + +## Integration with GUI + +### Socket Communication +When called from GUI, programs communicate via sockets: +```cpp +if (is_running_locally == false) { + // Set up socket communication with GUI + JobResult my_result; + my_result.result_size = 1; + my_result.result[0] = final_resolution; + + // Send result to GUI + SendJobResult(&my_result); +} +``` + +### Independence Principle +**Important:** Programs must function without GUI or database: +- Accept all parameters via command line +- Read input from files, not database +- Write output to files, not database +- GUI reads program output files and updates database + +This separation ensures programs can be: +- Run standalone for testing +- Called from scripts or pipelines +- Used with other workflow managers + +## Best Practices Summary + +1. **Maintain independence** from GUI and database +2. **Use consistent parameter naming** across related programs +3. **Provide meaningful default values** for all parameters +4. **Validate all inputs** before processing +5. **Report progress** for long-running operations +6. **Handle errors gracefully** with informative messages +7. **Write results atomically** to avoid partial outputs +8. **Document algorithm parameters** in help text +9. **Test with edge cases** (empty files, single particle, etc.) \ No newline at end of file diff --git a/src/programs/console_test/console_test.cpp b/src/programs/console_test/console_test.cpp index acdae200b..816e669ac 100644 --- a/src/programs/console_test/console_test.cpp +++ b/src/programs/console_test/console_test.cpp @@ -6,6 +6,7 @@ #include "wx/socket.h" #include "../../core/core_headers.h" +#include "../../../include/libtorch/cistem_torch_helper.h" // embedded images.. @@ -108,6 +109,9 @@ class void TestRunProfileDiskOperations( ); void TestCTFNodes( ); void TestSpectrumImageMethods( ); +#ifdef cisTEM_USING_LIBTORCH + void TestLibTorch( ); +#endif void BeginTest(const char* test_name); void EndTest( ); @@ -167,6 +171,9 @@ bool MyTestApp::DoCalculation( ) { TestRunProfileDiskOperations( ); TestCTFNodes( ); TestSpectrumImageMethods( ); +#ifdef cisTEM_USING_LIBTORCH + TestLibTorch( ); +#endif wxPrintf("\n\n\n"); @@ -2141,6 +2148,30 @@ void MyTestApp::TestSpectrumImageMethods( ) { EndTest( ); } +#ifdef cisTEM_USING_LIBTORCH +void MyTestApp::TestLibTorch( ) { + BeginTest("LibTorch Linking and Basic Operations"); + + // Create a tensor with values [1, 2, 3, 4] in a 2x2 matrix + torch::Tensor tensor = torch::tensor({{1.0f, 2.0f}, {3.0f, 4.0f}}); + + // Square the tensor (element-wise multiplication) + torch::Tensor squared = tensor * tensor; + + // Check that the result is correct: [1, 4, 9, 16] + float expected[] = {1.0f, 4.0f, 9.0f, 16.0f}; + float* data = squared.data_ptr( ); + + for ( int i = 0; i < 4; i++ ) { + if ( std::abs(data[i] - expected[i]) > 0.0001f ) { + FailTest; + } + } + + EndTest( ); +} +#endif + void MyTestApp::BeginTest(const char* test_name) { // For access by other tests when running CheckDependencies current_test_name = test_name; diff --git a/src/programs/match_template/match_template.cpp b/src/programs/match_template/match_template.cpp index 0e09dad8d..33ef1a094 100644 --- a/src/programs/match_template/match_template.cpp +++ b/src/programs/match_template/match_template.cpp @@ -37,6 +37,9 @@ using namespace cistem_timer_noop; // FIXME: Probably need to disable resizing, or make sure it is handled #define TEST_LOCAL_NORMALIZATION +// Testing a size optimized approach for search +#define MAX_SEARCH_SIZE 1024 + /** * @class AggregatedTemplateResult * @brief Stores and aggregates template matching results from multiple processing units (e.g., worker threads or nodes). @@ -635,6 +638,20 @@ bool MatchTemplateApp::DoCalculation( ) { // Initialize TemplateMatchingDataSizer for managing image sizes and preprocessing profile_timing.start("PreProcessInputImage"); TemplateMatchingDataSizer data_sizer(this, input_image, input_reconstruction, input_pixel_size, padding); + +#ifdef MAX_SEARCH_SIZE + + if ( input_image.logical_x_dimension > MAX_SEARCH_SIZE || input_image.logical_y_dimension > MAX_SEARCH_SIZE ) { + // Work out how much we have to change the high_resolution limit_search to make the image smaller + float high_limit_x = data_sizer.GetRealizedHighResolutionLimitBasedOnWantedSize(input_pixel_size, input_image.logical_x_dimension, MAX_SEARCH_SIZE); + float high_limit_y = data_sizer.GetRealizedHighResolutionLimitBasedOnWantedSize(input_pixel_size, input_image.logical_y_dimension, MAX_SEARCH_SIZE); + wxPrintf("Your input image is %i x %i pixels. To fit within the max search size of %i, the high resolution limit for the search has been changed from %3.2fA to %3.2fA\n", + input_image.logical_x_dimension, input_image.logical_y_dimension, MAX_SEARCH_SIZE, high_resolution_limit_search, std::max(high_limit_x, high_limit_y)); + high_resolution_limit_search = std::max(high_limit_x, high_limit_y); + } + +#endif + if ( use_local_normalization && data_sizer.IsResamplingNeeded( ) ) { SendError("Local normalization is not yet supported with resampling."); } diff --git a/src/programs/match_template/template_matching_data_sizer.h b/src/programs/match_template/template_matching_data_sizer.h index 3f756cf42..aeccad3fc 100644 --- a/src/programs/match_template/template_matching_data_sizer.h +++ b/src/programs/match_template/template_matching_data_sizer.h @@ -215,6 +215,16 @@ class TemplateMatchingDataSizer { return input_size / float(wanted_binned_size); } + inline float GetRealizedHighResolutionLimitBasedOnWantedSize(float input_pixel_size, float input_size, float wanted_size) { + int wanted_binned_size = wanted_size; + float realized_binning_factor; + if ( IsOdd(wanted_binned_size) ) + wanted_binned_size++; + + realized_binning_factor = input_size / float(wanted_binned_size); + return 2.0f * input_pixel_size * realized_binning_factor; + } + inline int2 GetPrePadding( ) const { return pre_padding; } diff --git a/src/programs/projectx/projectx.cpp b/src/programs/projectx/projectx.cpp index 9ea12801f..b0f76cdee 100644 --- a/src/programs/projectx/projectx.cpp +++ b/src/programs/projectx/projectx.cpp @@ -12,55 +12,58 @@ class IMPLEMENT_APP(MyGuiApp) -MyMainFrame* main_frame; - -MyAlignMoviesPanel* align_movies_panel; -MyFindCTFPanel* findctf_panel; -MyFindParticlesPanel* findparticles_panel; -MyRefine2DPanel* classification_panel; -AbInitio3DPanel* ab_initio_3d_panel; -AutoRefine3DPanel* auto_refine_3d_panel; -MyRefine3DPanel* refine_3d_panel; -RefineCTFPanel* refine_ctf_panel; -Generate3DPanel* generate_3d_panel; -Sharpen3DPanel* sharpen_3d_panel; - -MyOverviewPanel* overview_panel; -ActionsPanelParent* actions_panel; -AssetsPanel* assets_panel; -MyResultsPanel* results_panel; -SettingsPanel* settings_panel; -MatchTemplatePanel* match_template_panel; -MatchTemplateResultsPanel* match_template_results_panel; -RefineTemplatePanel* refine_template_panel; +MyMainFrame* main_frame = nullptr; + +MyAlignMoviesPanel* align_movies_panel = nullptr; +MyFindCTFPanel* findctf_panel = nullptr; +MyFindParticlesPanel* findparticles_panel = nullptr; +MyRefine2DPanel* classification_panel = nullptr; +AbInitio3DPanel* ab_initio_3d_panel = nullptr; +AutoRefine3DPanel* auto_refine_3d_panel = nullptr; +MyRefine3DPanel* refine_3d_panel = nullptr; +RefineCTFPanel* refine_ctf_panel = nullptr; +Generate3DPanel* generate_3d_panel = nullptr; +Sharpen3DPanel* sharpen_3d_panel = nullptr; + +MyOverviewPanel* overview_panel = nullptr; +ActionsPanelParent* actions_panel = nullptr; +AssetsPanel* assets_panel = nullptr; +MyResultsPanel* results_panel = nullptr; +SettingsPanel* settings_panel = nullptr; +MatchTemplatePanel* match_template_panel = nullptr; +MatchTemplateResultsPanel* match_template_results_panel = nullptr; +RefineTemplatePanel* refine_template_panel = nullptr; #ifdef EXPERIMENTAL -ExperimentalPanel* experimental_panel; -RefineTemplateDevPanel* refine_template_dev_panel; +ExperimentalPanel* experimental_panel = nullptr; +RefineTemplateDevPanel* refine_template_dev_panel = nullptr; #endif -MyMovieAssetPanel* movie_asset_panel; -MyImageAssetPanel* image_asset_panel; -MyParticlePositionAssetPanel* particle_position_asset_panel; -MyVolumeAssetPanel* volume_asset_panel; -AtomicCoordinatesAssetPanel* atomic_coordinates_asset_panel; -TemplateMatchesPackageAssetPanel* template_matches_package_asset_panel; -MyRefinementPackageAssetPanel* refinement_package_asset_panel; - -MyMovieAlignResultsPanel* movie_results_panel; -MyFindCTFResultsPanel* ctf_results_panel; -MyPickingResultsPanel* picking_results_panel; -Refine2DResultsPanel* refine2d_results_panel; -MyRefinementResultsPanel* refinement_results_panel; - -MyRunProfilesPanel* run_profiles_panel; - -wxImageList* MenuBookIconImages; -wxImageList* ActionsSpaBookIconImages; -wxImageList* ActionsTmBookIconImages; -wxImageList* AssetsBookIconImages; -wxImageList* ResultsBookIconImages; -wxImageList* SettingsBookIconImages; +MyMovieAssetPanel* movie_asset_panel = nullptr; +MyImageAssetPanel* image_asset_panel = nullptr; +MyParticlePositionAssetPanel* particle_position_asset_panel = nullptr; +MyVolumeAssetPanel* volume_asset_panel = nullptr; +AtomicCoordinatesAssetPanel* atomic_coordinates_asset_panel = nullptr; +TemplateMatchesPackageAssetPanel* template_matches_package_asset_panel = nullptr; +MyRefinementPackageAssetPanel* refinement_package_asset_panel = nullptr; + +MyMovieAlignResultsPanel* movie_results_panel = nullptr; +MyFindCTFResultsPanel* ctf_results_panel = nullptr; +MyPickingResultsPanel* picking_results_panel = nullptr; +Refine2DResultsPanel* refine2d_results_panel = nullptr; +MyRefinementResultsPanel* refinement_results_panel = nullptr; + +MyRunProfilesPanel* run_profiles_panel = nullptr; + +wxImageList* MenuBookIconImages = nullptr; +wxImageList* ActionsSpaBookIconImages = nullptr; +wxImageList* ActionsTmBookIconImages = nullptr; +wxImageList* AssetsBookIconImages = nullptr; +wxImageList* ResultsBookIconImages = nullptr; +wxImageList* SettingsBookIconImages = nullptr; +#ifdef EXPERIMENTAL +wxImageList* ExperimentalBookIconImages = nullptr; +#endif wxConfig* cistem_config; SETUP_SOCKET_CODES @@ -101,15 +104,7 @@ bool MyGuiApp::OnInit( ) { wxImage::AddHandler(new wxPNGHandler); - wxImageList* MenuBookIconImages; - wxImageList* ActionsSpaBookIconImages; - wxImageList* ActionsTmBookIconImages; - wxImageList* AssetsBookIconImages; - wxImageList* SettingsBookIconImages; - -#ifdef EXPERIMENTAL - wxImageList* ExperimentalBookIconImages; -#endif + // Use the global image lists, don't shadow them with local variables main_frame = new MyMainFrame((wxWindow*)NULL);