diff --git a/.gitignore b/.gitignore index 970bdbe..8306332 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ # ... and .circleci !.circleci +# ... and .readthedocs.yaml +!.readthedocs.yaml + # Exclude Kdevelop4 files ... .kdev* @@ -23,3 +26,6 @@ tags # Ignore pyc files ... *.pyc + +# Ignore built documentation +Docs/_build/* diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000..7f01128 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,23 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version, and other tools you might need +build: + os: ubuntu-22.04 + tools: + python: "3.9" + +# Build documentation in the "Docs/" directory with Sphinx +sphinx: + configuration: Docs/conf.py + +# Optionally, but recommended, +# declare the Python requirements required to build your documentation +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: Docs/requirements.txt + diff --git a/Applications/SlicerSALTApp/CMakeLists.txt b/Applications/SlicerSALTApp/CMakeLists.txt index 07bbe08..6d40a30 100644 --- a/Applications/SlicerSALTApp/CMakeLists.txt +++ b/Applications/SlicerSALTApp/CMakeLists.txt @@ -40,14 +40,18 @@ set(APPLIB_SRCS qSlicerSALTAppMainWindow.h Widgets/qAppStyle.cxx Widgets/qAppStyle.h + Widgets/qAppAboutDialog.cxx + Widgets/qAppAboutDialog.h ) set(APPLIB_MOC_SRCS qSlicerSALTAppMainWindow.h Widgets/qAppStyle.h + Widgets/qAppAboutDialog.h ) set(APPLIB_UI_SRCS + Resources/UI/qAppAboutDialog.ui ) set(APPLIB_RESOURCES diff --git a/Applications/SlicerSALTApp/Resources/Images/SplashScreen.png b/Applications/SlicerSALTApp/Resources/Images/SplashScreen.png index 8525bc9..1200b2b 100644 Binary files a/Applications/SlicerSALTApp/Resources/Images/SplashScreen.png and b/Applications/SlicerSALTApp/Resources/Images/SplashScreen.png differ diff --git a/Applications/SlicerSALTApp/Resources/UI/qAppAboutDialog.ui b/Applications/SlicerSALTApp/Resources/UI/qAppAboutDialog.ui index defb05c..f5828b6 100644 --- a/Applications/SlicerSALTApp/Resources/UI/qAppAboutDialog.ui +++ b/Applications/SlicerSALTApp/Resources/UI/qAppAboutDialog.ui @@ -7,7 +7,7 @@ 0 0 671 - 374 + 396 @@ -432,7 +432,7 @@ - About the application + About 3D Slicer @@ -508,9 +508,6 @@ Qt::AlignCenter - - :/Logo.png - Qt::SmoothTransformation @@ -523,6 +520,25 @@ + + + + + 0 + + + 0 + + + + + QDialogButtonBox::Close + + + + + + @@ -532,9 +548,5 @@
ctkThumbnailLabel.h
- - - - diff --git a/Applications/SlicerSALTApp/Widgets/qAppAboutDialog.cxx b/Applications/SlicerSALTApp/Widgets/qAppAboutDialog.cxx new file mode 100644 index 0000000..748f7b1 --- /dev/null +++ b/Applications/SlicerSALTApp/Widgets/qAppAboutDialog.cxx @@ -0,0 +1,112 @@ +/*============================================================================== + + Program: 3D Slicer + + Copyright (c) Kitware Inc. + + See COPYRIGHT.txt + or http://www.slicer.org/copyright/copyright.txt for details. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + This file was originally developed by Julien Finet, Kitware Inc. + and was partially funded by NIH grant 3P41RR013218-12S1 + +==============================================================================*/ + +// Qt includes + +// SlicerApp includes +#include "qAppAboutDialog.h" +#include "qSlicerApplication.h" +#include "ui_qAppAboutDialog.h" + +//----------------------------------------------------------------------------- +class qAppAboutDialogPrivate: public Ui_qAppAboutDialog +{ +public: +}; + +//----------------------------------------------------------------------------- +// qAppAboutDialogPrivate methods + + +//----------------------------------------------------------------------------- +// qAppAboutDialog methods +qAppAboutDialog::qAppAboutDialog(QWidget* parentWidget) + :QDialog(parentWidget) + , d_ptr(new qAppAboutDialogPrivate) +{ + Q_D(qAppAboutDialog); + d->setupUi(this); + + qSlicerApplication* slicer = qSlicerApplication::application(); + d->CreditsTextBrowser->setFontPointSize(25); + d->CreditsTextBrowser->append(slicer->applicationName()); + d->CreditsTextBrowser->setFontPointSize(11); + d->CreditsTextBrowser->append(""); + if (!slicer->isCustomMainApplication()) + { + d->CreditsTextBrowser->append(slicer->applicationVersion() + " " + "r" + slicer->revision() + + " / " + slicer->repositoryRevision()); + d->CreditsTextBrowser->append(""); + d->CreditsTextBrowser->append(""); + d->CreditsTextBrowser->insertHtml("Download a newer version
"); + d->CreditsTextBrowser->append(""); + } + else + { + d->CreditsTextBrowser->append(slicer->applicationVersion() + " (" + slicer->mainApplicationRepositoryRevision() + ")"); + d->CreditsTextBrowser->append(""); + } + d->CreditsTextBrowser->insertHtml(this->acknowledgment()); + d->CreditsTextBrowser->insertHtml(slicer->libraries()); + d->SlicerLinksTextBrowser->insertHtml(this->copyrights()); + d->CreditsTextBrowser->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); + + connect(d->ButtonBox, SIGNAL(rejected()), this, SLOT(close())); +} + +//----------------------------------------------------------------------------- +void qAppAboutDialog::setLogo(const QPixmap& newLogo) +{ + Q_D(qAppAboutDialog); + d->SlicerLabel->setPixmap(newLogo); +} + +//----------------------------------------------------------------------------- +qAppAboutDialog::~qAppAboutDialog() = default; + +//----------------------------------------------------------------------------- +QString qAppAboutDialog::acknowledgment()const +{ + QString acknowledgmentText( + "Supported by: NIH and the Slicer Community.

" + "This work is part of the National Institute of Health grant titled " + "Shape Analysis Toolbox: From medical images to quantitative insights of anatomy.

" + "SlicerSALT is a software package for medical image segmentation's " + "shape analysis.

" + + "The SlicerSALT developers gratefully acknowledge funding for this project " + "NIH NIBIB R01EB021391 as well as the Slicer community.

" + + "Ongoing development, maintenance, distribution, and training is managed by " + "Kitware Inc., University of North Carolina, Chapel Hill, and NYU Tandon School" + "of Engineering.

"); + return acknowledgmentText; +} + +//----------------------------------------------------------------------------- +QString qAppAboutDialog::copyrights()const +{ + QString copyrightsText( + "" + "" + "" + "
Licensing InformationWebsite
"); + return copyrightsText; +} \ No newline at end of file diff --git a/Applications/SlicerSALTApp/Widgets/qAppAboutDialog.h b/Applications/SlicerSALTApp/Widgets/qAppAboutDialog.h new file mode 100644 index 0000000..bff52f8 --- /dev/null +++ b/Applications/SlicerSALTApp/Widgets/qAppAboutDialog.h @@ -0,0 +1,56 @@ +/*============================================================================== + + Program: 3D Slicer + + Copyright (c) Kitware Inc. + + See COPYRIGHT.txt + or http://www.slicer.org/copyright/copyright.txt for details. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + This file was originally developed by Julien Finet, Kitware Inc. + and was partially funded by NIH grant 3P41RR013218-12S1 + +==============================================================================*/ + +#ifndef __qAppAboutDialog_h +#define __qAppAboutDialog_h + +// Qt includes +#include + +// CTK includes +#include + +// SlicerSALT includes +#include "qSlicerSALTAppExport.h" + +class qAppAboutDialogPrivate; + +/// Pre-request that a qSlicerApplication has been instanced +class Q_SLICERSALT_APP_EXPORT qAppAboutDialog : + public QDialog +{ + Q_OBJECT +public: + qAppAboutDialog(QWidget *parentWidget = nullptr); + ~qAppAboutDialog() override; + + Q_INVOKABLE void setLogo(const QPixmap& newLogo); + +protected: + QScopedPointer d_ptr; + QString acknowledgment() const; + QString copyrights() const; + +private: + Q_DECLARE_PRIVATE(qAppAboutDialog); + Q_DISABLE_COPY(qAppAboutDialog); +}; + +#endif diff --git a/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.cxx b/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.cxx index 716a64f..0684458 100644 --- a/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.cxx +++ b/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.cxx @@ -4,12 +4,13 @@ // Qt includes #include #include +#include // CTK includes #include // Slicer includes -#include "qSlicerAboutDialog.h" +#include "Widgets/qAppAboutDialog.h" #include "qSlicerModuleSelectorToolBar.h" #include "qSlicerModulesMenu.h" #include "qSlicerModuleManager.h" @@ -59,13 +60,27 @@ void qSlicerSALTAppMainWindowPrivate::setupUi(QMainWindow * mainWindow) // successfully connect each slot with its corresponding action. this->Superclass::setupUi(mainWindow); + // Add Help Menu Action + this->HelpMenu->addAction(helpAboutSlicerAppAction); + //---------------------------------------------------------------------------- // Configure //---------------------------------------------------------------------------- mainWindow->setWindowIcon(QIcon(":/Icons/Medium/DesktopIcon.png")); - QPixmap logo(":/LogoFull.png"); - this->LogoLabel->setAlignment(Qt::AlignCenter); // XXX Synx with template ? - this->LogoLabel->setPixmap(logo); + + QLabel* logoLabel = new QLabel(); + logoLabel->setObjectName("LogoLabel"); + // QIcon stores multiple versions of the image (in different sizes) + // and uses the most suitable one (depending on DevicePixelRatio). + // QLabel cannot take a QIcon, therefore we need to get the most suitable + // QPixmap from the QIcon (base.png, base@2x, ...). + // To achieve this, we first determine the pixmap size in device independent units, + // which is the size of the base image (icon.availableSizes().first(), because for that + // DevicePixelRatio=1.0), and then we retrieve the pixmap for this size. + QIcon icon = QIcon(":/LogoFull.png"); + QPixmap logo = icon.pixmap(icon.availableSizes().first()); + logoLabel->setPixmap(logo); + this->PanelDockWidget->setTitleBarWidget(logoLabel); // To see any effect of changes over here in the application first delete the .ini file pointed by @@ -97,7 +112,7 @@ void qSlicerSALTAppMainWindowPrivate::setupUi(QMainWindow * mainWindow) qSlicerModulesMenu* modulesMenu = this->ModuleSelectorToolBar->modulesMenu(); - + modulesMenu->setTopLevelCategoryOrder( QStringList() @@ -141,21 +156,9 @@ qSlicerSALTAppMainWindow::~qSlicerSALTAppMainWindow() //----------------------------------------------------------------------------- void qSlicerSALTAppMainWindow::on_HelpAboutSlicerSALTAppAction_triggered() { - qSlicerAboutDialog about(this); - about.setLogo(QPixmap(":/Logo.png")); - - // XXX: unused, modify slicer to accept setAcknowledgmentText - QString acknowledgmentText( - "Supported by: NIH and the Slicer Community.

" - "This work is part of the National Institute of Health grant titled " - "Shape Analysis Toolbox for Medical Image Computing Projects.

" - "SlicerSALT is a software package for medical image segmentation's " - "shape analysis.

" - "Ongoing development, maintenance, distribution, and training is managed by " - "Kitware Inc., University of North Carolina, Chapel Hill, M.D. Cancer Center " - "at The University of Texas and NYU Tandon School of Engineering.

"); - - + qAppAboutDialog about(this); + about.setLogo(QPixmap(QIcon(":/Logo.png").pixmap(256, 256))); + about.setWindowTitle("About SlicerSALT"); about.exec(); } diff --git a/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.h b/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.h index f8a3bf3..612d989 100644 --- a/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.h +++ b/Applications/SlicerSALTApp/qSlicerSALTAppMainWindow.h @@ -10,6 +10,7 @@ class qSlicerSALTAppMainWindowPrivate; // Slicer includes #include "qSlicerMainWindow.h" +#include "vtkSlicerVersionConfigure.h" class Q_SLICERSALT_APP_EXPORT qSlicerSALTAppMainWindow : public qSlicerMainWindow { diff --git a/Applications/SlicerSALTApp/slicer-application-properties.cmake b/Applications/SlicerSALTApp/slicer-application-properties.cmake index 7244689..4f7b9e2 100644 --- a/Applications/SlicerSALTApp/slicer-application-properties.cmake +++ b/Applications/SlicerSALTApp/slicer-application-properties.cmake @@ -4,7 +4,7 @@ set(APPLICATION_NAME ) set(VERSION_MAJOR - 3 + 5 ) set(VERSION_MINOR 0 diff --git a/BUILD.md b/BUILD.md new file mode 100644 index 0000000..9c14fad --- /dev/null +++ b/BUILD.md @@ -0,0 +1,141 @@ +Build and Package SlicerSALT +============================ + +This document summarizes how to build and package SlicerSALT on Linux, macOS and Windows. + +SlicerSALT is a custom Slicer application. Reading the [3D Slicer Developer Documentation](https://slicer.readthedocs.io/en/latest/developer_guide/index.html) may help answer additional questions. + +The initial source files were created using [KitwareMedical/SlicerCustomAppTemplate](https://github.com/KitwareMedical/SlicerCustomAppTemplate). + + +Prerequisites +------------- + +* Review and install the `3D Slicer` prerequisites + + * [GNU/Linux systems](https://slicer.readthedocs.io/en/latest/developer_guide/build_instructions/linux.html) + * [macOS](https://slicer.readthedocs.io/en/latest/developer_guide/build_instructions/macos.html) + * [Windows](https://slicer.readthedocs.io/en/latest/developer_guide/build_instructions/windows.html) + +* Setup your git account: + + * Create a [Github](https://github.com) account. + + * Setup your SSH keys following [these](https://help.github.com/articles/generating-ssh-keys) instructions at the + exception of `step 2` where you should __NOT__ enter a passphrase. + + * Setup [your git username](https://help.github.com/articles/setting-your-username-in-git) and [your git email](https://help.github.com/articles/setting-your-email-in-git). + + +Checkout +-------- + +### GNU/Linux systems & macOS + +```bash +mkdir ~/Projects +cd ~/Projects +git clone https://github.com/Kitware/SlicerSALT.git SS +``` + +### Windows + +1. Start [Git Bash](https://help.github.com/articles/set-up-git#need-a-quick-lesson-about-terminalterminalgit-bashthe-command-line) +2. Checkout the source code into a directory `C:\W\` by typing the following commands: + +```bat +cd /c +mkdir W +cd /c/W +git clone https://github.com/Kitware/SlicerSALT.git SS +``` + +_:warning: use short source and build directory names to avoid the [maximum path length limitation](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx#maxpath)._ + + +Build +----- + +### GNU/Linux systems + +```bash +cd ~/Projects/SSR +cmake \ + -DCMAKE_BUILD_TYPE:STRING=Release \ + -DQt5_DIR:PATH=/path/to/Qt/lib/cmake/Qt5 \ + ../SS +``` + +### macOS + +```bash +mkdir ~/Projects +cd ~/Projects +cmake \ + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.13 \ + -DCMAKE_BUILD_TYPE:STRING=Release \ + -DQt5_DIR:PATH=/path/to/Qt/lib/cmake/Qt5 \ + ../SS +``` + +### Windows + +Option 1: CMake GUI and Visual Studio (Recommended) + +1. Start [CMake GUI](https://cmake.org/runningcmake/), select source directory `C:\W\SS` and set build directory to `C:\W\SSR`. +2. Add an entry `Qt5_DIR` pointing to `C:/Qt/${QT_VERSION}/${COMPILER}/lib/cmake/Qt5`. +2. Generate the project. +3. Open `C:\W\SSR\{{cookiecutter.project_name}}.sln`, select `Release` and build the project. + +Option 2: Command Line + +1. Start the [Command Line Prompt](http://windows.microsoft.com/en-us/windows/command-prompt-faq) +2. Configure and build the project in `C:\W\SSR` by typing the following commands: + +```bat +cd C:\W\ +mkdir SSR +cd SSR +cmake -G "Visual Studio 16 2019" -A x64 -DQt5_DIR:PATH=`C:/Qt/${QT_VERSION}/${COMPILER}/lib/cmake/Qt5 ..\SS +cmake --build . --config Release -- /maxcpucount:4 +``` + +Package +------- + +_:warning: Creating distributable packages is only supported for `Release` builds._ + +### GNU/Linux systems & macOS + +``` +cd ~/Projects/SSR/Slicer-build +make package +``` + +### macOS + +_:warning: SlicerSALT will only create a valid package that will run on machines other than it’s built on if Qt was built from source._ + +``` +cd ~/Projects/SSR/Slicer-build +make package +``` + +### Windows + +Install [NSIS 2](http://sourceforge.net/projects/nsis/files/) + +Option 1: CMake and Visual Studio + +1. In the `C:\W\SSR\Slicer-build` directory, open `Slicer.sln` and build the `PACKAGE` target + +Option 2: Command Line + +1. Start the [Command Line Prompt](http://windows.microsoft.com/en-us/windows/command-prompt-faq) +2. Build the `PACKAGE` target by typing the following commands: + +```bat +cd C:\W\SSR\Slicer-build +cmake --build . --config Release --target PACKAGE +``` + diff --git a/CMake/CMakeLists.txt b/CMake/CMakeLists.txt index 130e4ab..4fda217 100644 --- a/CMake/CMakeLists.txt +++ b/CMake/CMakeLists.txt @@ -10,16 +10,3 @@ else() file(DOWNLOAD ${url} ${dest_file} EXPECTED_HASH SHA256=${expected_hash}) endif() endif() - -# Download FindFortran.cmake -set(dest_file "${CMAKE_CURRENT_BINARY_DIR}/FindFortran.cmake") -set(expected_hash "fcb5e593ae9aea43697a7f02d6a0e08707b52ed71430ee7837ff11d5ed48e40f") -set(url "https://raw.githubusercontent.com/scikit-build/cmake-FindFortran/v0.5.3/FindFortran.cmake") -if(NOT EXISTS ${dest_file}) - file(DOWNLOAD ${url} ${dest_file} EXPECTED_HASH SHA256=${expected_hash}) -else() - file(SHA256 ${dest_file} current_hash) - if(NOT ${current_hash} STREQUAL ${expected_hash}) - file(DOWNLOAD ${url} ${dest_file} EXPECTED_HASH SHA256=${expected_hash}) - endif() -endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 7eaa67d..d4e4328 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,8 +1,8 @@ cmake_minimum_required(VERSION 3.13.4) -# Enable C++11 +# Enable C++17 if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD 17) endif() set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) @@ -13,7 +13,7 @@ if(NOT DEFINED slicersources_SOURCE_DIR) # Download Slicer sources and set variables slicersources_SOURCE_DIR and slicersources_BINARY_DIR FetchContent_Populate(slicersources GIT_REPOSITORY https://github.com/slicersalt/Slicer - GIT_TAG 3a4b267b5c0367cc7f3f21848232d684a251d31c # slicersalt-4.11-2020-09-30-002be180 + GIT_TAG 51a608261c1dccd296793479f72f618c51610187 #slicersalt-v5.3.0-2023-06-17-c3d74d6 GIT_PROGRESS 1 ) else() @@ -80,7 +80,7 @@ endif() # Slicer options -option(BUILD_TESTING "Build application test suite" ON) +option(BUILD_TESTING "Build application test suite" OFF) option(Slicer_BUILD_DOCUMENTATION "Build documentation (Doxygen, sphinx, ...)" OFF) if(WIN32) option(Slicer_BUILD_WIN32_CONSOLE "Build application executable as a console app" OFF) @@ -89,6 +89,7 @@ endif() option(Slicer_BUILD_DICOM_SUPPORT "Build application with DICOM support" OFF) option(Slicer_BUILD_DIFFUSION_SUPPORT "Build application with Diffusion support" OFF) option(Slicer_BUILD_EXTENSIONMANAGER_SUPPORT "Build application with ExtensionManager support" OFF) +option(Slicer_BUILD_APPLICATIONUPDATE_SUPPORT "Build Slicer with application update support" OFF) option(Slicer_BUILD_MULTIVOLUME_SUPPORT "Build application with MultiVolume support" OFF) option(Slicer_BUILD_PARAMETERSERIALIZER_SUPPORT "Build application with parameter serializer support" OFF) option(Slicer_BUILD_WEBENGINE_SUPPORT "Build application with Qt WebEngine support" OFF) @@ -158,14 +159,15 @@ if(NOT DEFINED EIGEN_BUILD_TESTING) endif() mark_as_superbuild(EIGEN_BUILD_TESTING) -# Do not add convenience blas/lapack target to avoid conflict with "lapack" project -set(EIGEN_ADD_BLAS_LAPACK_TARGETS 0) -mark_as_superbuild(EIGEN_ADD_BLAS_LAPACK_TARGETS) - # Disable Qt based test to avoid finding the wrong Qt version set(EIGEN_TEST_NOQT 1) mark_as_superbuild(EIGEN_TEST_NOQT) +# this line affects this file where EP_GIT_PROTOCOL is used. +set(EP_GIT_PROTOCOL "https") +# this line affects the rest of the slicer superbuild +set(Slicer_USE_GIT_PROTOCOL OFF) + set(extension_name "Eigen3") set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} @@ -186,8 +188,8 @@ set(extension_name "MeshToLabelMap") set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} - GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/NIRALUser/${extension_name} - GIT_TAG 9e2e199b99396c570f5f26c0ccfd5e149f6b9d34 + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} + GIT_TAG abba97578cf86a21e89a21b81be8bcc142f0e897 GIT_PROGRESS 1 QUIET ) @@ -198,24 +200,37 @@ list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) # Srep set(extension_name "SlicerSkeletalRepresentation") set(short_extension_name "SRep") # Use shorter extension name to avoid issues with too long paths on windows +set(SkeletalRepresentation_SUPERBUILD 0 CACHE INTERNAL "") +mark_as_superbuild(SkeletalRepresentation_SUPERBUILD) set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${short_extension_name}") FetchContent_Populate(${short_extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/KitwareMedical/SlicerSkeletalRepresentation.git - GIT_TAG 002244d83c44444235909f73194d7b1f3f0c8635 + GIT_TAG bdcf0278acfee929c4a9f02ef037b3aa94f6b32b # srep-pipelines 2023-jul-13 GIT_PROGRESS 1 QUIET ) list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) + #----------------------------------------------------------------------------- # GROUPS set(extension_name "GROUPS") set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") +set(RigidAlignmentModule_TITLE "SPHARM-PDM Correspondence Improvement" CACHE INTERNAL "") +mark_as_superbuild(RigidAlignmentModule_TITLE) +set(RigidAlignmentModule_CATEGORY "Shape Creation" CACHE INTERNAL "") +mark_as_superbuild(RigidAlignmentModule_CATEGORY) +set(GROUPS_BUILD_CLI_MODULE_Groups 0 CACHE INTERNAL "") +mark_as_superbuild(GROUPS_BUILD_CLI_MODULE_Groups) +set(GROUPS_BUILD_SCRIPTED_MODULE_GroupWiseRegistrationModule 0 CACHE INTERNAL "") +mark_as_superbuild(GROUPS_BUILD_SCRIPTED_MODULE_GroupWiseRegistrationModule) +set(RigidAlignment_CATEGORY "Shape Creation.Advanced" CACHE INTERNAL "") +mark_as_superbuild(VARS RigidAlignment_CATEGORY:STRING PROJECTS RigidAlignment) FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} - GIT_TAG 437c4ff6aea17c2139130ca1c7247ce8250f8863 # slicersalt-2018-11-16-15c897e + GIT_TAG 2f20e1728f06db8af4949e727c9b2adb5d232f27 # slicersalt-2023-02-08-2f20e1728 GIT_PROGRESS 1 QUIET ) @@ -254,7 +269,7 @@ set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} - GIT_TAG 9eb71073e4e782ab9a44f3ba708793735ac0c9c4 # slicersalt-2020-07-22-9eb7107 + GIT_TAG 9a48b6c5a51ba815e0f72baf732bd2b29ec6e96d # slicersalt-2022-04-04-102d832 GIT_PROGRESS 1 QUIET ) @@ -268,7 +283,7 @@ set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${short_extension_name}") FetchContent_Populate(${short_extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/ProcrustesRegistrationModule.git - GIT_TAG 549e9d9f21758a0d8a864971cbb5c725ebbc95a3 + GIT_TAG 52ece6b958904ff2199d1f4981e8d64c74f4c4bb # main GIT_PROGRESS 1 QUIET ) @@ -298,7 +313,7 @@ set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/3DMetricTools - GIT_TAG 178e0d9bbb5408a04abce6b252822d080ed3719d # slicersalt-2019-11-20-56d288a + GIT_TAG a54cb56b835b731ac3744ad6c80ece6f995f17cf # slicersalt-2021-10-29-4b4e478 GIT_PROGRESS 1 QUIET ) @@ -328,7 +343,7 @@ set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} - GIT_TAG c4d59da81db241b91c6b73885728e1281fa27821 # slicersalt-2018-09-27-e6c242627 + GIT_TAG 0c53f0a0be7144806a16ddfc13e535a145d710e8 # slicersalt-2021-10-29-215f0b6 GIT_PROGRESS 1 QUIET ) @@ -346,7 +361,7 @@ set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} - GIT_TAG 323cc5b4550a09e2999f29dbeb12ce9ff151e93b # slicersalt-2020-07-08-23d1746 + GIT_TAG 2fa7d37eb17e1214bd924e1e97fa8e0679b95db0 # slicersalt-2024-04-23-3b7c66d GIT_PROGRESS 1 QUIET ) @@ -377,12 +392,11 @@ set(SPHARM-PDM_BUILD_TESTING OFF) mark_as_superbuild(SPHARM-PDM_BUILD_TESTING:BOOL) set(extension_name "SPHARM-PDM") -set(${extension_name}_EXTERNAL_PROJECT_DEPENDENCIES LAPACK) set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} - GIT_TAG d31cbec24be78151032119653321d8ab55fa538f # slicersalt-2020-04-27-47188484c + GIT_TAG d6c718c9ea7ed2d6deb14af836014cf3e30c5e35 # slicersalt-2023-02-08-5c6dc05bf GIT_PROGRESS 1 QUIET ) @@ -398,7 +412,85 @@ set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") FetchContent_Populate(${extension_name} SOURCE_DIR ${${extension_name}_SOURCE_DIR} GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} - GIT_TAG eff0a42f999331a55448198c8f8058cb7360ebe6 + GIT_TAG c19d39d1f250a6cc11bcaf3e5d9de5e07bfb765d # master (2024-06-05) + GIT_PROGRESS 1 + QUIET + ) +list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) + +#----------------------------------------------------------------------------- +# SlicerDentalModelSeg +# +# Currently only Linux is supported +if (UNIX AND NOT APPLE) + set(SlicerDentalModelSeg_BUILD_TESTING OFF) + mark_as_superbuild(SlicerDentalModelSeg_BUILD_TESTING:BOOL) + + set(extension_name "SlicerDentalModelSeg") + set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") + FetchContent_Populate(${extension_name} + SOURCE_DIR ${${extension_name}_SOURCE_DIR} + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} + GIT_TAG 142ec756dd67d03019d5b5bec6a3fbf823011638 # slicersalt-2022-08-11-142ec756d + GIT_PROGRESS 1 + QUIET + ) + list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) +endif() + +set(SlicerDWD_BUILD_TESTING OFF) +mark_as_superbuild(SlicerDWD_BUILD_TESTING:BOOL) + +set(extension_name "SlicerDWD") +set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") +FetchContent_Populate(${extension_name} + SOURCE_DIR ${${extension_name}_SOURCE_DIR} + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} + GIT_TAG 92d0751c034a6688796795a3f9a809550d78a055 # main + GIT_PROGRESS 1 + QUIET + ) +list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) + +set(extension_name "SlicerPipelines") +set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") +FetchContent_Populate(${extension_name} + SOURCE_DIR ${${extension_name}_SOURCE_DIR} + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/KitwareMedical/${extension_name} + GIT_TAG 586c6f4062a0a4b2e6bb56a167aa91468dfe528b # main as of 2023-09-20 + GIT_PROGRESS 1 + QUIET + ) +list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) + +set(extension_name "SlicerSurfaceLearner") +set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") +FetchContent_Populate(${extension_name} + SOURCE_DIR ${${extension_name}_SOURCE_DIR} + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} + GIT_TAG 49ee4e521beec8d74a5d0eed0d62044932ce23b2 # slicersalt-2024-06-28-49ee4e5 + GIT_PROGRESS 1 + QUIET + ) +list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) + +set(extension_name "SRepHypothesisTesting") +set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") +FetchContent_Populate(${extension_name} + SOURCE_DIR ${${extension_name}_SOURCE_DIR} + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/slicersalt/${extension_name} + GIT_TAG 8c17682e6ada7b7f1128b4c5d4b9c29e49900341 # main as of 2024-10-01 + GIT_PROGRESS 1 + QUIET + ) +list(APPEND Slicer_EXTENSION_SOURCE_DIRS ${${extension_name}_SOURCE_DIR}) + +set(extension_name "HierarchicalGeodesicModeling") +set(${extension_name}_SOURCE_DIR "${CMAKE_BINARY_DIR}/${extension_name}") +FetchContent_Populate(${extension_name} + SOURCE_DIR ${${extension_name}_SOURCE_DIR} + GIT_REPOSITORY ${EP_GIT_PROTOCOL}://github.com/KitwareMedical/${extension_name} + GIT_TAG cd0e469acaca667146ce3b1e764dd40a99122f96 # main as of 2024-10-01 GIT_PROGRESS 1 QUIET ) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 92ed972..4c64ada 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -76,7 +76,7 @@ To contribute your changes to slicerSALT, you will need to follow the forking wo 2. **Style only rhymes with style** - Style changes can introduce a big number of diffs in your whole project (take a variable name change, tabulation in a whole file...). If commited as part of a commit for enhancement or bug fixes, it becomes very difficult for a reviewer to track down the changes specific to your work, and the ones specific to style changes. For that reason, prefer grouping style changes in a separate commit. + Style changes can introduce a big number of diffs in your whole project (take a variable name change, tabulation in a whole file...). If committed as part of a commit for enhancement or bug fixes, it becomes very difficult for a reviewer to track down the changes specific to your work, and the ones specific to style changes. For that reason, prefer grouping style changes in a separate commit. 3. **Push often** @@ -88,7 +88,7 @@ To contribute your changes to slicerSALT, you will need to follow the forking wo 5. **... but never the other way around!** - If your branch and the master branch diverge and are in conflicts, never resolve those by merging master into your branch. Instead, rebase your branch against master. This will allow you to adress the conflicts where they were introduced instead of commiting a patch complicated to review, and will keep the commit history clean. + If your branch and the master branch diverge and are in conflicts, never resolve those by merging master into your branch. Instead, rebase your branch against master. This will allow you to address the conflicts where they were introduced instead of committing a patch complicated to review, and will keep the commit history clean. Some of the content above was directly or partially taken from Crealytics blog : [5 reasons for keeping your git commits small](https://crealytics.com/blog/2010/07/09/5-reasons-keeping-git-commits-small/). @@ -119,7 +119,7 @@ Proper commit messages are important as they allow to speed up the review proces 5. Be specific - When making changes to multiple classes or refering to other classes than the one being modified, be specific about class methods and members by properly specifying the namespace: `Class:method()` or `Class::m_member`. + When making changes to multiple classes or referring to other classes than the one being modified, be specific about class methods and members by properly specifying the namespace: `Class:method()` or `Class::m_member`. 6. List changes @@ -153,7 +153,7 @@ This process consists of rewriting the branch history, therefore re-syncing it w ``` >TIP: >* You can also use `git gui` and click on the amend commit radio button, then unstage or remove changes from the previous commit. - >* To keep the changes staged, you can use the `--soft` flag. If you want to get rid of the commit changes alltogether, you can use the `--force`. + >* To keep the changes staged, you can use the `--soft` flag. If you want to get rid of the commit changes altogether, you can use the `--force`. >* To reset more than one commit, you can call `git reset HEAD~X` with X the number of commits to reset. Works with the flags referenced above. * **Editing older commits** @@ -193,8 +193,8 @@ This process consists of rewriting the branch history, therefore re-syncing it w * ***How do I amend some code I already wrote to a previous comment?*** You have two possibilities: - * If you have already commited that new code, you can place its line under the commit to amend in the interactive rebase, and change its command to `s` or `f` if you want to edit the initial commit message or not. - * If you haven't commited your changes, you can either commit them and follow the instructions above, or stash them: + * If you have already committed that new code, you can place its line under the commit to amend in the interactive rebase, and change its command to `s` or `f` if you want to edit the initial commit message or not. + * If you haven't committed your changes, you can either commit them and follow the instructions above, or stash them: ``` git stash diff --git a/Docs/build.md b/Docs/build.md new file mode 100644 index 0000000..62f296d --- /dev/null +++ b/Docs/build.md @@ -0,0 +1,2 @@ +```{include} ../BUILD.md +``` \ No newline at end of file diff --git a/Docs/conf.py b/Docs/conf.py new file mode 100644 index 0000000..e147e7e --- /dev/null +++ b/Docs/conf.py @@ -0,0 +1,64 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = "SlicerSALT Documentation" +copyright = "2025, Kitware, Inc." +author = "SlicerSALT Development Team" + + +# -- General configuration --------------------------------------------------- +# -- General configuration + +extensions = [ + "sphinx.ext.duration", + "sphinx.ext.doctest", + "sphinx.ext.autodoc", + "sphinx.ext.autosummary", + "sphinx.ext.intersphinx", + "myst_parser" +] + +intersphinx_mapping = { + "rtd": ("https://docs.readthedocs.io/en/stable/", None), + "python": ("https://docs.python.org/3/", None), + "sphinx": ("https://www.sphinx-doc.org/en/master/", None), +} +intersphinx_disabled_domains = ["std"] + +templates_path = ["_templates"] + +# -- Options for EPUB output +epub_show_urls = "footnote" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "sphinx_rtd_theme" + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] diff --git a/Docs/contributing.md b/Docs/contributing.md new file mode 100644 index 0000000..435d357 --- /dev/null +++ b/Docs/contributing.md @@ -0,0 +1,2 @@ +```{include} ../CONTRIBUTING.md +``` \ No newline at end of file diff --git a/Docs/index.md b/Docs/index.md new file mode 100644 index 0000000..142d6dd --- /dev/null +++ b/Docs/index.md @@ -0,0 +1,18 @@ +# Welcome to SlicerSALT's documentation! + +SlicerSALT is an open-source, free comprehensive software that will allow +biomedical scientists to precisely locate shape changes in their imaging studies. + +This software called Slicer Shape AnaLysis Toolbox (SlicerSALT), will enhance the +intuitiveness and ease of use for such studies, as well as allow researchers to +find shape changes with higher statistical power. Altogether this constitutes a +crucial resource for the imaging field that will enable many and important new +findings in biomedical imaging studies. + + +```{toctree} +:maxdepth: 2 + +modules +build +contributing diff --git a/Docs/modules.md b/Docs/modules.md new file mode 100644 index 0000000..4f76045 --- /dev/null +++ b/Docs/modules.md @@ -0,0 +1,13 @@ +# Modules + +SlicerSALT is a collection of 3D Slicer modules focused on various shape analysis tasks. Documentation for each module is below. + +```{toctree} + +modules/CovarianceTesting +modules/DentalModelSeg +modules/GROUPS +modules/Regression +modules/SPHARM-PDM +modules/Srep +modules/SVA \ No newline at end of file diff --git a/Docs/modules/CovarianceTesting.md b/Docs/modules/CovarianceTesting.md new file mode 100644 index 0000000..606b243 --- /dev/null +++ b/Docs/modules/CovarianceTesting.md @@ -0,0 +1,143 @@ +# Covariate Significance Testing User Tutorial + +Authors: Mahmoud Mostapha\, Jared Vicory\, Chao Huang\, Martin Styner\, Beatriz Paniagua + +Collaborators: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_0.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_1.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_2.png) + +## Covariate Significance Testing Description + +* This module provides the following functions: + * Model Fitting & Hypothesis Testing + * Visualize Statistical Results + +_Important note_: If you are downloading this module as part of the Slicer Extension mechanism then it will be named multivariate functional shape data analysis \(MFSDA\) + + +Covariate Significance Testing provides an interface for MFSDA \(Multivariate Functional Shape Data Analysis\) method\, which is a Python based tool for statistical shape analysis\. +A multivariate varying coefficient model is introduced to build the association between the multivariate shape measurements and demographic information and other clinical variables\. Statistical inference\, i\.e\.\, hypothesis testing\, is also included in this tool\, which can be used in investigating whether some covariates of interest are significantly associated with the shape information\. The hypothesis testing results are further used in clustering based analysis\, i\.e\.\, significant suregion detection\. + +The Covariate Significance Testing tool has of the following structure: + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_25.png) + +## Covariate Significance Testing Installation on SlicerSALT + +Download the SlicerSALT packages for your respective operating system from the [SlicerSALT website](http://salt.slicer.org/) and install it\. Covariate Significance Testing will be ready to use as a module\. + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_3.png) + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_4.png) + + +## MFSDA Installation on 3D Slicer + + Download 3D Slicer packages for your respective operating system on the _[3D Slicer website](https://www.slicer.org/)_ and install it\. + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_6.png) + + In 3D Slicer\, open the Extension Manager + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_7.png) + + + In the _Install Extension_ tab\, select _MFSDA_ under _Categories_ . Under MFSDA \, select the _Install_ button and restart Slicer when prompted + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_8.png) + +## Covariate Significance Testing Module + +In SlicerSALT\, select _Covariate Significance Testing Module _ \(in Slicer\, select MFSDA \) from the _Modules_ drop\-down menu \( _Category:_ Shape Analysis\) or on the Search bar + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_9.png) + +### Setting up Input Files + +For _Input CSV File_ _\,_ select the csv file which contains the location of input surface meshes \(\*\.vtk\) and corresponding covariates + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_10.png) + +In the CSV file the first column contains the location of input surface vtk files and each additional column represent a covariate to be tested\, which can be categorical or continuous. Below is an example of an input CSV file with one categorical covariate. + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_11.png) + +### Input Surface Meshes Visualization + +Shape Population Viewer can be used to check the input surface meshes\, where the same CSV file as its input + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_12.png) + +Setting up Input Files + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_13.png) + + +For _Input Spherical Template_ _\,_ select the vtk file which provides a common coordinates for the of input surface meshes + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_14.png) + +Below there is an example of an input spherical template file\, which can be an average surface or one of the input surfaces + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_15.png) + +### Setting up Input Files + +For _Input Shape for p\-values_ _\,_ select the vtk file which will be used to visualize the fitted model parameters and the resulted p\-values + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_16.png) + +Below there is an example of an input shape for p\-values file\, which can be an average surface or one of the input surfaces + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_17.png) + + +### Setting up Output Directory + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_18.png) + +For _Output Files Directory_ _\,_ select the folder where the module will store the output files + +### Running Covariate Significance Testing Module + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_19.png) + +Click on the _Run_ button\, to run the MFSDA\_run & MFSDA\_createShapes CLIs on the provided inputs files + + _SlicerSALT Error Log_ can also be used for debugging if the module was completed with errors\. + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_20.png) + + _SlicerSALT Error Log_ can also be used for debugging if the module was completed with errors\. + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_21.png) + +The outputs files for the Covariate Significance Testing Module are stored in the output folder specified by the user: and they include fitted model parameters, shape template with Scalars, hypothesis testing p\-values and the output files generated by running Covariate Significance Testing + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_22.png) + +### Output Shape Template Visualization + +Shape Population Viewer can be used also to visualize the output shape template with fitted model parameters and p\-values as scalars + +![](img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_23.png) + +## Acknowledgements \- Resources \- Questions + +
    +
  • The MSFDA developers gratefully acknowledge funding for this project provided by NIH NIBIB R01EB021391 (Shape Analysis Toolbox for Medical Image Computing Projects), as well as the Slicer community.
  • +
  • Github repository:
  • + +
  • Forums:
  • + +
  • For other remarks or questions, please email: beatriz.paniagua@kitware.com
  • +
diff --git a/Docs/modules/DentalModelSeg.md b/Docs/modules/DentalModelSeg.md new file mode 100644 index 0000000..cce4532 --- /dev/null +++ b/Docs/modules/DentalModelSeg.md @@ -0,0 +1,150 @@ +# SlicerDentalModelSeg User tutorial + +Authors: Mathieu Leclercq\, Juan Carlos Prieto\, Martin Styner\, Connor Bowley\, Beatriz Paniagua + +Collaborators: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_0.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_1.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_2.png) + +_Note:_ Intra\-Oral Scanners \(IOS - intra oral scanner\): A device that projects light to produce a 3D model of a lower or upper jaw. Those 3D IOS scans are the inputs of our automated teeth segmentation method + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_3.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_4.png) + +## Algorithm + +### Read 3D scan, apply random rotation and extract point features. + +Capture 2D rendering from random viewpoints on a sphere, or viewpoints following an  icosahedron subdivision. Rendering is done with Pytorch3D. + +The Pytorch3D rendering engine provides a map that relates pixels in the images to faces in the mesh and allows rapid extraction of point data (normals, curvatures, labels, etc). + +Feed the 2D views to a neural network (UNET). + +Put the information back into the 3D surface. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_5.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_6.png) + +### Teeth segmentation + +**Training** + +* Network: MONAI UNET \(Convolutional network used for medical image segmentation\) with residual connections\. +* Loss function: MONAI DiceCELoss\. Weighted sum of Dice and Cross\-Entropy loss\. +* Adam Optimizer\. Trained on approximately 1000 scans\. Use of the early\-stopping criteria to stop the training when the validation loss has stopped decreasing\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_7.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_8.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_9.png) + +## Extension Overview + +The extension consists of one module \(and its associated CLI module\): + + CrownSegmentation : GUI for dental crown segmentation\. The user has the option to use either _[Universal Numbering System](https://en.wikipedia.org/wiki/Universal_Numbering_System)_ or _[FDI notation](https://en.wikipedia.org/wiki/FDI_World_Dental_Federation_notation)_ \. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_10.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_11.png) + +## SlicerJawSegmentation Installation on SlicerSALT + +Download the SlicerSALT packages for your respective operating system from the _[SlicerSALT website ](http://salt.slicer.org)_ and install it\. The module will be ready to use then\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_12.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_13.png) + +## JawSegmentation Installation on 3D Slicer + + Download 3D Slicer packages for your respective operating system on the _[3D Slicer website ](http://www.slicer.org)_ and install it\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_15.png) + + In 3D Slicer\, open the Extension Manager + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_16.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_17.png) + +Search for SlicerJawSegmentation in the _Install Extensions_ tab\. + +Click _Install_ \. + +Slicer needs to restart after installation\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_18.png) + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_19.png) + +## CrownSegmentation Module + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_20.png) + +### Inputs + +* Input type\. IOS scan\(s\)\, either: + * \.vtk file\. + * vtkMRMLModelNode of an IOS scan\. + * Folder containing IOS scans\. +* Number of views: this sets the number of 2D views used for one prediction\. A low number takes less time to compute\, but results can be inaccurate\. Generally 45 views is good\. +* Model for segmentation: this is the path for the neural network model\. You can look for the latest version of the network on the github repo by clicking the corresponding button\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_21.png) + +### Advanced + + Resolution: This sets the resolution of the 2D views used for the prediction\. Should stay at 320 unless the selected model explicitly works with another Resolution\. + + Name of the predicted labels: The name of the VTK array that stores the labels for each vertex in the output surface file\. + + Install/Check dependencies : This forces the installation of all dependencies\. You do not need to use this button as the module will automatically install all dependencies before the first prediction\. + + Create one output file for each label : Check this box if you want one separate output file for each tooth\. + +Numbering system: Choose between _[Universal Numbering System](https://en.wikipedia.org/wiki/Universal_Numbering_System)_ and _[FDI notation](https://en.wikipedia.org/wiki/FDI_World_Dental_Federation_notation)_ \. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_22.png) + +### Outputs + +Once prediction is over\, click _open output surface _ to open the model in the scene\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_23.png) + +Go to the _Models_ module to check the output\. + +The scalar for the prediction is turned on when you click "Open output surface"\. + +You can change the Color Table \(the random colors table can be useful to better distinguish close labels\) + +You can enable the Threshold to hide some labels\. + +![](img/SlicerSALT-SlicerDentalModelSeg-Tutorial_24.png) + +## Acknowledgements \- Resources \- Questions + +
    +
  • The DentalModelSeg developers gratefully acknowledge funding for this project provided by NIH NIBIB R01EB021391 (Shape Analysis Toolbox for Medical Image Computing Projects), as well as the Slicer community.
  • +
  • Github repository:
  • + +
  • Forums:
  • + +
  • For other remarks or questions, please email: beatriz.paniagua@kitware.com
  • +
+ + diff --git a/Docs/modules/GROUPS.md b/Docs/modules/GROUPS.md new file mode 100644 index 0000000..ce016be --- /dev/null +++ b/Docs/modules/GROUPS.md @@ -0,0 +1,381 @@ +# GROUPS User Tutorial + +Authors: Mahmoud Mostapha\, Ilwoo Lyu\, Martin Styner\, Beatriz Paniagua + +Collaborators: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_0.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_1.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_2.png) + +## GROUPS Tool Description + +* Step 1: Landmark\-based Rigid Alignment +* Step 2: Group\-wise Shape Registration + +## Description of GROUPS + +Consistent shape correspondence is a prerequisite any group analysis investigating disease patterns and group variability. Group\-wise Registration For Shape Correspondence \(GROUPS\) tool is a general framework for establishing correspondence of 3D models that employs group\-wise registration in a spherical parametrization space. The inputs are spherical harmonics \(SPHARM\) point distribution models \(PDM\) in addition to user\-defined geometrical features and landmarks\. The output is SPHARM\-PDM models with optimized correspondence obtained by minimizing the entropy of the joint distribution of features and landmarks at corresponding point locations. + +The GROUPS tool consists of the following detailed steps: + +![](img/SlicerSALT-GROUPS-Tutorial_58.jpg) + +## Step 1 : Landmark\-based Rigid Alignment + +This step will improve the SPHARM\-PDM initial correspondence using a set of user placed landmarks. Landmarks are defined in terms of 3D Slicer Fiducials \(\*\.fcsv\). Minimize the landmark distance errors on the sphere in terms of rigid alignment transformation. Surfaces are Remeshed using rotated parametrization spheres. + +![](img/SlicerSALT-GROUPS-Tutorial_3.jpg) + + _Figure:_ \(a\) initial landmarks of the SPHARM\-PDM surfaces\, and \(b\) aligned landmarks after rigid transformation on the sphere + +![](img/SlicerSALT-GROUPS-Tutorial_4.png) + + _Input: _ Surface Meshes + +**RigidWrapper CLI** + +![](img/SlicerSALT-GROUPS-Tutorial_5.png) + + _Output_ : Rotated Parameterization Spheres + +![](img/SlicerSALT-GROUPS-Tutorial_6.png) + + _Output_ : Remeshed Surface + + +![](img/SlicerSALT-GROUPS-Tutorial_7.png) + + _Figure:_ : SPHARM\-PDM Meshs \(\* _SPHARM\.vtk\) with user placed fiducals \(\*\.fcsv\) for each subject_ + +![](img/SlicerSALT-GROUPS-Tutorial_8.png) + + _Figure_ : Common parametrization sphere obtained from the SPHARM\-PDM pipeline \(\* _surf\_para\.vtk\)_ + +![](img/SlicerSALT-GROUPS-Tutorial_9.png) + +![](img/SlicerSALT-GROUPS-Tutorial_10.png) + + _Figure:_ Remeshed Surface using SurfRemesh CLI \(\* aligned\.vtk\) + + _Figure:_ Rotated parametrization sphere using RigidWrapper CLI \(\* _rotSphere\.vtk\)_ + +## Step 2: Group\-wise Shape Registration + +This step will further improve correspondence using group\-wise registration in a spherical parametrization space. Optimizing landmarks \(local\) and multidimensional features \(global\) by minimizing the joint entropy. Features are pre\-computed by the user and saved in SPHARM vtk files as point data arrays. Surfaces are Remeshed using aligned SPHARM coefficients + +![](img/SlicerSALT-GROUPS-Tutorial_11.jpg) + +![](img/SlicerSALT-GROUPS-Tutorial_12.jpg) + + _Figure:_ \(a\) landmarks after rigid transformation on the sphere\, and \(b\) final landmark alignment using group\-wise shape registration + +![](img/SlicerSALT-GROUPS-Tutorial_13.png) + + _Input: _ Surface Meshs + +**SurfRemesh CLIs** + +![](img/SlicerSALT-GROUPS-Tutorial_14.png) + + _Output_ : Remeshed Surface + + _Figure:_ Examples of geometrical features generated by the user and stored in the \(\*SPHARM\.vtk\) Surfaces as point data arrays\. \(a\) Curvedness generated using the SpharmTool in the SPHARM\-PDM pipeline + +![](img/SlicerSALT-GROUPS-Tutorial_15.png) + +![](img/SlicerSALT-GROUPS-Tutorial_16.png) + + _Figure:_ Examples of geometrical features generated by the user and stored in the \(\*SPHARM\.vtk\) Surfaces as point data arrays\. \(a\) Curvedness generated using the SpharmTool in the SPHARM\-PDM pipeline\. \(b\) Partial radius \(thickness\) generated when medial mesh is generated in the SPHARM\-PDM pipeline If landmarks to be used\, the user need to save landmarks as binary array of the Vertex IDs saved as an array called “Landmarks” + +![](img/SlicerSALT-GROUPS-Tutorial_17.png) + +![](img/SlicerSALT-GROUPS-Tutorial_18.png) + + Figure : \(a\) SPHARM deformation coefficients \(\*coeff\) produced by the Groups CLI\. \(b\) The input surface is then remeshed \(\*SPHARM\.vtk\) using SurfRemesh CLI + +## Installation of GROUPS Tool + +* GROUPS tool can be used with two open\-source software platforms: + * SlicerSALT : which is the dissemination vehicle of powerful shape analysis methodology\. This software is a light\-weight\, customized version of 3D Slicer\. It contains GROUPS _as modules_ + * 3D Slicer : which is an open\-source and free software platform for medical image informatics\, image processing\, and three\-dimensional visualization\. GROUPS can be downloaded _as an extension_ + +### GROUPS Installation on SlicerSALT + +Download the SlicerSALT packages for your respective operating system from the _[SlicerSALT website](http://salt.slicer.org/)_ and install it\. + +![](img/SlicerSALT-GROUPS-Tutorial_19.png) + +![](img/SlicerSALT-GROUPS-Tutorial_20.png) + +GROUPS Installation on 3D Slicer + + Download 3D Slicer packages for your respective operating system on the _[3D Slicer website](https://www.slicer.org/)_ and install it + +![](img/SlicerSALT-GROUPS-Tutorial_22.png) + +### GROUPS Installation on 3D Slicer + + In 3D Slicer\, open the Extension Manager + +![](img/SlicerSALT-GROUPS-Tutorial_23.png) + + In the _Install Extension_ tab\, select _Shape Analysis_ under _Categories_ + + Under SPHARM\-PDM \, select the _Install_ button and restart Slicer when prompted + +![](img/SlicerSALT-GROUPS-Tutorial_24.png) + +![](img/SlicerSALT-GROUPS-Tutorial_25.png) + +For quality control\, we analyze our GROUPS outputs with Shape Population Viewer extension\. Shape Population Viewer can be installed as a 3D Slicer extension or as an external binary\. This module is included as part of the SlicerSALT package + +![](img/SlicerSALT-GROUPS-Tutorial_26.png) + + +* To install Shape Population Viewer as _a 3D Slicer extension_ : + * Open _Extension Manager_ \, in the _Install Extensions _ tab\, select ‘ _Shape Analysis’_ under _Categories_ + * Select the appropriate _Install _ button and restart 3D Slicer when prompted + + +![](img/SlicerSALT-GROUPS-Tutorial_27.png) + +* To install Shape Population Viewer as an _external binary_ : + * Download ShapePopulationViewer package for your respective operating system on _[NITRC website](https://www.nitrc.org/projects/shapepopviewer/)_ + * In 3D Slicer\, open _Application Settings _ in the _Edit _ Menu\. On the tab _Modules_ \, Add the folder where ShapePopulationViewer is stored + * Restart 3D Slicer + + +![](img/SlicerSALT-GROUPS-Tutorial_28.png) + +## Rigid Alignment Use + + * Rigid Alignment tool can be used by two different ways: + * As command\-line tool through the terminal thanks to SlicerSALT + * As a module of SlicerSALT or 3D Slicer + + +### Rigid Alignment Command\-Line Tool + +* Rigid Alignment method can be run on several cases through a terminal thanks to two files included in the SlicerSALT package: +* RigidAlignment\-parameters\.ini which allows the user to specify the inputs\, outputs and the parameters of the RigidAlignment tool +* RigidAlignment\.py python script which will apply RigidAlignment method on the given input cases with the parameters specified in the RigidAlignment\-parameters\.ini file +* _RigidAlignment\.py_ and _RigidAlignment\-parameters\.ini files location: _ + * _On Linux and Windows: share/Slicer\-4\.7/CommandLineTool_ + * _On MacOs: Open the SlicerSALT Contents _ + * _🡪 Contents/share/Slicer\-4\.7/CommandLineTool_ + + +![](img/SlicerSALT-GROUPS-Tutorial_29.png) + +* Step 1 : Modification of the _RigidAlignment\-parameters\.ini_ file by specifying the directories needed for tool CLIs +* Step 2 : Launch Rigid Alignment method with the following command\-lines: +* On Linux and Windows: + * _$cd path\-to\-the\-SlicerSALT\-package_ + * _$\./SlicerSALT \-\-no\-main\-window \-\-python\-script share/Slicer\-4\.7/CommandLineTool/RigidAlignment\.py share/Slicer\-4\.7/CommandLineTool/RigidAlignment\-parameters\.ini_ +* On MacOs: + * _$cd path\-to\-the\-SlicerSALT\-package/SlicerSALT\.app/Contents/MacOS_ + * _$\./SlicerSALT \-\-no\-main\-window \-\-python\-script \.\./share/Slicer\-4\.7/CommandLineTool/RigidAlignment\.py \.\./share/Slicer\-4\.7/CommandLineTool/RigidAlignment\-parameters\.ini_ + + +### Rigid Alignment Module + +In 3D Slicer or in SlicerSALT\, select _Rigid Alignment Module _ + +from the _Modules_ drop\-down menu \( _Category:_ Shape Analysis\) or on the Search bar + +![](img/SlicerSALT-GROUPS-Tutorial_30.png) + +**Setting up Input Directories** + +RigidAlignment tab + +For _Input Models Directory_ _\,_ select the folder which contains the input surface meshs \(\*\.vtk\) + +For _Input Fiducial Files Directory_ _\,_ select the folder where the landmarks \(fiducials\) files are stored \(\*\.fcsv\) + +For _Input Common Unit Sphere_ _\,_ select the folder where the common parametrization sphere is stored \(\*\.vtk\) + +![](img/SlicerSALT-GROUPS-Tutorial_31.png) + +**Setting up Output Directories** + + RigidAlignment tab + +For _Output Spherical Models Directory_ _\,_ select the folder where the output of the RigidWrapper CLI will be stored \(\*\.vtk\) + +For _Output Models Directory_ _\,_ select the folder where the output of the SurfRemesh CLI will be stored \(\*\.vtk\) + +![](img/SlicerSALT-GROUPS-Tutorial_32.png) + +**Running Rigid Alignment Module** + +![](img/SlicerSALT-GROUPS-Tutorial_33.png) + +Click on the + + _Run_ _RigidAlignment _ button\, to run the CLIs on the provided inputs + +Shape Population Viewer will pop up to preview the input meshes giving the user the chance to inspect the input data before running the tool + +![](img/SlicerSALT-GROUPS-Tutorial_34.jpg) + +Shape Population Viewer will pop up also after the module finished processing giving the user the chance to check the remeshed surfaces + +![](img/SlicerSALT-GROUPS-Tutorial_35.jpg) + + _3D Slicer’s Error Log_ can also be used for debugging if the module was completed with errors\. To open it\, click on the red icon at the bottom right\. + +![](img/SlicerSALT-GROUPS-Tutorial_36.png) + + _3D Slicer’s Error Log_ can also be used for debugging if the module was completed with errors\. To open it\, click on the red icon at the bottom right\. + +![](img/SlicerSALT-GROUPS-Tutorial_37.png) + +The outputs files for the two sub\-steps of Rigid Alignment Module are stored in the two folders specified by the user: + +![](img/SlicerSALT-GROUPS-Tutorial_38.png) + +![](img/SlicerSALT-GROUPS-Tutorial_39.png) + +![](img/SlicerSALT-GROUPS-Tutorial_40.png) + +### Group\-wise Registration Use + + * Group\-wise Registration tool can be used by two different ways: + * As command\-line tool through the terminal thanks to SlicerSALT + * As a module of SlicerSALT or 3DSlicer + + +**Group\-wise Registration Command\-Line Tool** + +* Group\-wise Registration method can be run on several cases through a terminal thanks to two files included in the SlicerSALT package: +* GroupWiseRegistration\-parameters\.ini which allows the user to specify the inputs\, outputs and the parameters of the Group\-wise Registration tool +* GroupWiseRegistration\.py python script which will apply GroupWiseRegistration method on the given input cases with the parameters specified in the GroupWiseRegistration \-parameters\.ini file +* _GroupWiseRegistration\.py_ and _GroupWiseRegistration \-parameters\.ini files location: _ + * _On Linux and Windows: share/Slicer\-4\.7/CommandLineTool_ + * _On MacOs: Open the SlicerSALT Contents _ + * _🡪 Contents/share/Slicer\-4\.7/CommandLineTool_ + + +![](img/SlicerSALT-GROUPS-Tutorial_41.png) + +* Step 1 : Modification of the _GroupWiseRegistration\-parameters\.ini_ file by specifying the directories and parameters needed for tool CLIs +* Step 2 : Launch Group Wise Registration method with the following command\-lines: +* On Linux and Windows: + * _$cd path\-to\-the\-SlicerSALT\-package_ + * _$\./SlicerSALT \-\-no\-main\-window \-\-python\-script share/Slicer\-4\.7/CommandLineTool/GroupWiseRegistration\.py share/Slicer\-4\.7/CommandLineTool/GroupWiseRegistration\-parameters\.ini_ +* On MacOs: + * _$cd path\-to\-the\-SlicerSALT\-package/SlicerSALT\.app/Contents/MacOS_ + * _$\./SlicerSALT \-\-no\-main\-window \-\-python\-script \.\./share/Slicer\-4\.7/CommandLineTool/GroupWiseRegistration\.py \.\./share/Slicer\-4\.7/CommandLineTool/GroupWiseRegistration\-parameters\.ini_ + +In 3D Slicer or in SlicerSALT\, select _Group\-wise Registration Module _ from the _Modules_ drop\-down menu \( _Category:_ Shape Analysis\) or on the Search bar + +![](img/SlicerSALT-GROUPS-Tutorial_42.png) + +**Setting up Input Directories** + + Groups tab + +For _Input Models Directory_ _\,_ select the folder which contains the input surface meshs \(\*SPHARM\.vtk\) + +For _Input Spherical Models Directory_ _\,_ select the folder where the spherical parametrization files are stored \(\*\_para\.vtk\) + +![](img/SlicerSALT-GROUPS-Tutorial_43.png) + +**Setting up Output Directories** + + Groups tab + +For _Output Coefficents Directory_ _\,_ select the folder where the output of the Groups CLI will be stored \(\*\.Coeff\) + +For _Output Models Directory_ _\,_ select the folder where the output of the SurfRemesh CLI will be stored \(\*\.vtk\) + +![](img/SlicerSALT-GROUPS-Tutorial_44.png) + +**Features and Parameters** + + Groups Parameters tab + +Once the user specify the input models directory\, the geometrical features/prosperities stored in the vtk files are dynamically populated into a list where the user can select what features to include \(Weight >0\) + +![](img/SlicerSALT-GROUPS-Tutorial_45.png) + + + Enable Use of Landmarks: Option for the user to select if landmarks will be included in improving the correspondence + + If enabled\, the user need to store the landmarks as a point data array called “Landmarks” indicating Vertex IDs to be selected \(Value > 0\) + +![](img/SlicerSALT-GROUPS-Tutorial_46.png) + + Figure : _Example of Landmarks stored in \*SPHARM\.vtk files _ + +![](img/SlicerSALT-GROUPS-Tutorial_47.png) + +Degree of SPHARM Decomposition: Degree value represents the degree of the spherical harmonic decomposition used to represent the computed deformation field + +Changing this value results in different levels of detail of the deformation field that will be used to transform the input SPHARM mesh + +![](img/SlicerSALT-GROUPS-Tutorial_48.png) + + +Maximum Number of Iterations: Number of iterations before the energy minimization optimization stops + + A higher number of iterations usually needed with increasing the number of subjects sin the dataset\, number of properties selected for the optimization procedure\, or with higher deformation field SPHARM degree + +![](img/SlicerSALT-GROUPS-Tutorial_49.png) + +**Running Group\-wise Registration Module ** + +![](img/SlicerSALT-GROUPS-Tutorial_50.png) + +Click on the + + _Run_ _ _ _Groups _ button\, + +to run the CLIs on the provided inputs + +Shape Population Viewer will be used again for quality control of the input meshs before running the tool\, in particular\, features planned to be included should be inspected by the user carefully + +![](img/SlicerSALT-GROUPS-Tutorial_51.jpg) + +Also\, Shape Population Viewer will be used to inspect the final correspondence established by the Group\-wise Registration tool + +![](img/SlicerSALT-GROUPS-Tutorial_52.jpg) + + _3D Slicer’s Error Log_ can also be used for debugging if the module was completed with errors\. To open it\, click on the red icon at the bottom right\. + +![](img/SlicerSALT-GROUPS-Tutorial_53.png) + +The outputs files for the two sub\-steps of Group\-wise Registration Module are stored in the two folders specified by the user: + +![](img/SlicerSALT-GROUPS-Tutorial_54.png) + +![](img/SlicerSALT-GROUPS-Tutorial_55.png) + +![](img/SlicerSALT-GROUPS-Tutorial_56.png) + + +## Acknowledgements \- Resources \- Questions + + + diff --git a/Docs/modules/Regression.md b/Docs/modules/Regression.md new file mode 100644 index 0000000..c12e559 --- /dev/null +++ b/Docs/modules/Regression.md @@ -0,0 +1,291 @@ +# Shape Regression User Tutorial + +Authors: James Fishbaugh\, Guido Gerig\, Laura Pascal\, Jared Vicory\, Beatriz Paniagua + +Collaborators: + +![](img/SlicerSALT-ShapeRegression-Tutorial_0.png) +![](img/SlicerSALT-ShapeRegression-Tutorial_1.png) + +## Outline + + 1\) Description of Shape Regression + + 2\) Installing the Software + + 3\) Shape Regression Workflow + + 4\) Debugging and Quality Control + + 5\) Acknowledgments and Resources + +## Description of Shape Regression + +![](img/SlicerSALT-ShapeRegression-Tutorial_2.png) + +Shape regression consists of estimating a continuous shape sequence which best matches a set of observed shapes. We use a growth model that represents anatomical evolution by a continuous deformation of space. + +![](img/SlicerSALT-ShapeRegression-Tutorial_3.png) + +This was done before by Thomas D'Arcy Thompson. + +![](img/SlicerSALT-ShapeRegression-Tutorial_4.jpg) + +![](img/SlicerSALT-ShapeRegression-Tutorial_5.jpg) + +### Acceleration Controlled Shape Regression + + Deformations are parameterized by a flow of deformations by acceleration vectors\, which produce velocity\, which in turn results in a change of position\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_8.png) + +We define the acceleration field $a(x(t))$ + +Where $x_i$ is the shape points carrying a point force vector $\alpha_i$ + +Where $K(x,y)$ is a kernel with standard deviation $\lambda_V$ + +![](img/SlicerSALT-ShapeRegression-Tutorial_11.png) + +The time varying deformation $\phi_t(x_i)$ is given by the equation below, with initial position $x_i(0)$ and initial velocity $\dot{x}_i(0)$ + +![](img/SlicerSALT-ShapeRegression-Tutorial_13.png) + +### Impact of Parameters + + Size of deformation kernel: The distance at which neighboring points move in correlation\. Higher values result in mostly rigid deformation\, while lower values allow points a greater degree of independent movement\. + + Size of shape matching kernel: The scale at which shape differences are considered noise\. For matching very detailed shape features\, choose a small value\. For noisy observations with spurious features\, set this value larger than the size of the features\. + + Regularity weight: A low weight on regularity results in models which closely match observed data\, tending towards interpolation \(rather than regression\) the weight goes to zero\. + +See “Model selection for spatiotemporal modeling of early childhood sub\-cortical development” SPIE Medical Imaging \(2019\) for more detail + +## Installing the Software + +### Installation of ShapeRegression Module through SlicerSALT + +Download the SlicerSALT packages for your respective operating system from the _[SlicerSALT website](http://salt.slicer.org/)_ and install it\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_16.png) + +![](img/SlicerSALT-ShapeRegression-Tutorial_17.png) + +### Installation of ShapeRegression Module through 3D Slicer + + In 3D Slicer\, open the Extension Manager + +![](img/SlicerSALT-ShapeRegression-Tutorial_20.png) + +Installation of ShapeRegression Module In 3D Slicer + + In the _Install Extension_ tab\, select _Shape Regression_ under _Categories_ + + Under ShapeRegressionExtension \, select the _Install_ button and restart Slicer when prompted + +![](img/SlicerSALT-ShapeRegression-Tutorial_21.png) + +## Shape Regression Workflow + +1\) Regression Computation – Model estimation + +2\) Regression Visualization – Visualization of estimated shape change + +### Shape Regression Model Estimation + +After installing, begin by selecting ‘ Regression Computation ’ + +![](img/SlicerSALT-ShapeRegression-Tutorial_22.png) + +Then download sample data to a directory of your choice + +![](img/SlicerSALT-ShapeRegression-Tutorial_23.png) + +Click the button to select the directory with input vtk shapes + +![](img/SlicerSALT-ShapeRegression-Tutorial_24.png) + + +Navigate to the directory containing the tutorial shapes + +![](img/SlicerSALT-ShapeRegression-Tutorial_25.png) + +**Setting Parameters** + +_Time point_ automatically populated if shape names have time\-suffix + +![](img/SlicerSALT-ShapeRegression-Tutorial_26.png) + + _Kernel width_ initialized as 50% of the smallest extent of the shape + +![](img/SlicerSALT-ShapeRegression-Tutorial_27.png) + + _Shape index_ indicates shape correspondence in multi\-objects + +![](img/SlicerSALT-ShapeRegression-Tutorial_28.png) + +_Weight_ controls the importance of each shape in model estimation + +![](img/SlicerSALT-ShapeRegression-Tutorial_29.png) + +Leave all settings at default and expand _‘Time Parameters’_ + +![](img/SlicerSALT-ShapeRegression-Tutorial_30.png) + +_Time point range_ is set using the min and max from input shapes + +![](img/SlicerSALT-ShapeRegression-Tutorial_31.png) + +Leave all settings at default and expand _‘Deformation Parameters’_ + +![](img/SlicerSALT-ShapeRegression-Tutorial_32.png) + +_The width of the deformation kernel_ lowers values result in more non\-linear changes\, higher values tend towards rigid deformation\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_33.png) + +For shape inputs with only a few hundred vertices\, chose ‘exact’\, otherwise ‘p3m’ usualy results in faster model estimation\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_34.png) + +_Regularity weight_ balances data\-matching and regularity\. Lower values favor accurate data\-matching\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_35.png) + + +Leave all settings at default and expand _‘Output Parameters’_ + +![](img/SlicerSALT-ShapeRegression-Tutorial_36.png) + + +Click to choose an output directory for the estimated model + +![](img/SlicerSALT-ShapeRegression-Tutorial_37.png) + + +Create a new folder called ‘output’ + +![](img/SlicerSALT-ShapeRegression-Tutorial_38.png) + +Leave all settings at default and expand _‘Optional Parameters’_ + +![](img/SlicerSALT-ShapeRegression-Tutorial_39.png) + + +Change the maximum number of iterations to ‘200’ + +![](img/SlicerSALT-ShapeRegression-Tutorial_40.png) + +**Model Estimation** + +Click ‘Run Shape4D’ + +![](img/SlicerSALT-ShapeRegression-Tutorial_41.png) + +Estimation may take several minutes to finish + +![](img/SlicerSALT-ShapeRegression-Tutorial_42.png) + +Estimation has converged when _‘Status: Completed’_ is displayed + +![](img/SlicerSALT-ShapeRegression-Tutorial_43.png) + +**Visualizing Shape Regression Results** + +We can now visualize the model by selecting ‘ RegressionVisualization’ + +![](img/SlicerSALT-ShapeRegression-Tutorial_44.png) + +Click to choose the directory containing the estimated model + +![](img/SlicerSALT-ShapeRegression-Tutorial_45.png) + +Choose the output directory from ‘ Regression Computation ’ + +![](img/SlicerSALT-ShapeRegression-Tutorial_46.png) + +The rootname is automatically populated if a final model is found in the directory\. Otherwise rootname has to be specified\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_47.png) + +Click ‘ _Create Sequence_ ’ button to load the model sequence + +![](img/SlicerSALT-ShapeRegression-Tutorial_48.png) + +Hold right mouse button to zoom\. Hold left button to rotate\. + +![](img/SlicerSALT-ShapeRegression-Tutorial_49.png) + +Expand ‘ _Sequence Visualization Options’_ + +![](img/SlicerSALT-ShapeRegression-Tutorial_50.png) + +Change the color map to _‘velocity’ _ to visualize speed of shape change + +![](img/SlicerSALT-ShapeRegression-Tutorial_51.png) + +The _‘Sequence Browser’_ section allows for playback of the model + +![](img/SlicerSALT-ShapeRegression-Tutorial_52.png) + +Expand ‘Regression Volume Plot’ and click the plot button + +![](img/SlicerSALT-ShapeRegression-Tutorial_53.png) + +A volume plot shows the estimated volume from shape regression along with the volume of the original shape observations + +![](img/SlicerSALT-ShapeRegression-Tutorial_54.png) + +### Shape Regression Debugging and Quality Control + +If an error occurred\, you will be presented with a notification. You can visualize error details in the Error Log under _View_ + +![](img/SlicerSALT-ShapeRegression-Tutorial_55.png) + + + +![](img/SlicerSALT-ShapeRegression-Tutorial_56.png) + + + +* If RegressionComputation experiences an error\, carefully check parameter settings\, including: + * Input shapes 'Time Point' \- make sure all time points are within the 'Time point range' + * Check the input \.vtk shapes exist at the path selected and verify all \.vtk files are valid + * In some cases\, it may be necessary to reorient the surface normals of input shapes before model estimation +* Use the RegressionVisualization module to view the estimated shape trajectory as an animation + * It is helpful to load the original observations displayed with transparency to visually assess model fit + + +![](img/SlicerSALT-ShapeRegression-Tutorial_57.png) + + + +* Use the RegressionVisualization module to view the volume measured after shape regression + * The volume plot can help to assess model fit and inform about possible overfitting + + +![](img/SlicerSALT-ShapeRegression-Tutorial_58.png) + + +## Acknowledgements \- Resources \- Questions + + diff --git a/Docs/modules/SPHARM-PDM.md b/Docs/modules/SPHARM-PDM.md new file mode 100644 index 0000000..71f15d5 --- /dev/null +++ b/Docs/modules/SPHARM-PDM.md @@ -0,0 +1,588 @@ +# SPHARM-PDM User Tutorial + +Authors: Laura Pascal\, Jonathan Perdomo\, Martin Styner\, Hina Shah\, Beatriz Paniagua + +Collaborators: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_0.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_1.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_2.png) + + +## SPHARM\-PDM Tool Description + +Shape Analysis allows to precisely locate morphological changes between healthy and pathological structures\. Spherical Harmonic Representation Point Distribution Models \(SPHARM\-PDM\) tool is used to compute densely sampled correspondent point based models that allow performing 3D structural statistical shape analysis\.< + +The inputs are _binary segmentations_ which are converted into corresponding _spherical harmonic descriptions_ \(SPHARM\) and then are sampled into _triangulated surfaces_ \(PDM\). + +The SPHARM\-PDM tool consists on three steps: + + _Step 1_ : __Preprocessing__ uses SegPostProcess CLI + +     _Input: Binary Segmentation_ + +     _Output: Binary 3D Image_ + + _Step 2_ : __Parameterization__ uses GenParaMesh CLI + +    _Input: Binary 3D Image_ + +    _Output: Surface Mesh \+ Parameterization sphere_ + + _Step 3_ : __SPHARM\-PDM__ uses ParaToSPHARMMesh CLI + +    _Input: Surface Mesh \+ Parameterization sphere_ + +    _Output: SPHARM Coefficients \+ Aligned Surface Meshes_ + +### Step 1: Post Process Segmentation + +This step will ensure spherical topology of the segmentations by filling any interior holes and by applying two smoothing operations and extract a single label or a label range + +Re\-sample the label data to ensure an isotropic resolution and a relative fine resolution + + _Input_ : Binary Segmentation + + _Output_ : Binary Segmentation File: _\*pp_ + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_3.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_4.png) + + __Figure__ : Input/Output of SegPostProcess CLI + +### Step 2: Generate Mesh Parameters + +This step will extract the surface of the input label segmentation and create an area conforming mapping of the surface mesh to a unit sphere. + + _Note_ : If this step reports bad Euler number\, it will mean that the extracted surface is not a spherical topology\. spherical topology has an Euler number of 2\. + + _Input_ : Binary 3D Image File _\*pp_ + + _Outputs_ : Parametrization sphere \+ Surface Mesh Files: _\*para\.vtk_ \+ _\*surf\.vtk_ + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_5.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_6.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_7.png) + + __Figure__ : Input/Output of GenParaMesh CLI + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_8.png) + + __Figure__ : __\*surf\.vtk__ is a surface approximation of the input file which represents the original voxel mesh: the cubes show the voxel delineation\. The surface will appear blocky because of it is the result of a marching cubes algorithm\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_9.png) + + __Figure__ : __\*para\.vtk__ is a the spherical mapping of the \*surf\.vtk file\. The sphere is an unit sphere \(diameter = 1\) + +### Step 3: Parameters to SPHARM Mesh + +This step will: +* Compute the SPHARM\-PDM representation + * Compute the spherical harmonic description + * Sample into a triangulated surface + * The two main parameters for this step are: + * The degree for SPHARM computation + * The subdivision level for the icosahedron subdivision +* Resolves issues of correspondence pose and alignment + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_10.png) + + __Figure__ : Input/Output of ParaToSPHARMMesh CLI + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_13.png) + + __Figure__ : Comparison between the surface mesh generated by the Generate Mesh Parameters step \(red\) and the SPHARM\-PDM output \* _SPHARM\.vtk_ \(blue\): + + _Note_ : This figure shows how the final correspondent PDM represents the geometry of the structure without fitting the voxel mesh obtained from the binary segmentation + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_14.png) + + __Figure__ : Visualization of \*SPHARMMedialAxis\.vtk \(red\) and \*SPHARMMedialMesh\.vtk \(blue\) + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_15.png) + + __Figure__ : __\*para\.vtk __ is a sphere with a icosahedron subdivision of 10\. + + _Note:_ The sphere has 1002 points and the triangulated surface generated will have the same number of points that this sphere\. This file includes the spherical parameters \( φ\,θ \) at each point\. + +This sphere is also a unit sphere \(diameter = 1\) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_16.png) + + __Figure__ : Visualization of _\*para\.vtk_ \(blue\) and _\*SPHARM\_Ellalign\.vtk_ \(red\) which is aligned with the \*para\.vtk sphere: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_17.png) + + __Figure__ : Spherical parameters color map files + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_18.png) + + __Figure__ : Comparison of the spherical parameters color maps containing in the _\*SPHARM\.vtk_ in ShapePopulationViewer tool: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_19.png) + + __Figure__ : Medial mesh parameter color map files + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_20.png) + + __Figure__ : Comparison of the Medial mesh parameter color maps containing in the _\*_ _SPHARMMedialMesh\.vtk_ in ShapePopulationViewer tool + +### Installation of SPHARM\-PDM Tool + +* SPHARM\-PDM tool can be used with two open\-source software platforms: + * __SlicerSALT__ : which is the dissemination vehicle of powerful shape analysis methodology\. This software is a light\-weight\, customized version of 3D Slicer\. It contains SPHARM\-PDM _as a module_ \. + * __3D Slicer__ : which is an open\-source and free software platform for medical image informatics\, image processing\, and three\-dimensional visualization\. SPHARM\-PDM can be downloaded _as an extension_ \. + + +__Installation via SlicerSALT__ + +Download the SlicerSALT packages for your respective operating system from the _[SlicerSALT website](http://salt.slicer.org/)_ and install it\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_21.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_22.png) + +__Installation on 3D Slicer__ + + Download 3D Slicer packages for your respective operating system on the _[3D Slicer website](https://www.slicer.org/)_ and install it\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_24.png) + + In 3D Slicer\, open the Extension Manager + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_25.png) + + In the _Install Extension_ tab\, select _SPHARM_ under _Categories_ + + Under __SPHARM\-PDM__ \, select the _Install_ button and restart Slicer when prompted + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_26.png) + +For quality control\, we analyze our SPHARM\-PDM outputs with __Shape Population Viewer__ extension\. Shape Population Viewer can be installed as a 3D Slicer extension or as an external binary\. This module is included as part of the SlicerSALT package\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_27.png) + +* To install __Shape Population Viewer__ as _a 3D Slicer extension_ : + * Open _Extension Manager_ \, in the _Install Extensions_ tab\, select ‘ _Shape Analysis’_ under _Categories_ + * Select the appropriate _Install_ button and restart 3D Slicer when prompted + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_28.png) + +* To install __Shape Population Viewer__ as an _external binary_ : + * Download ShapePopulationViewer package for your respective operating system on _[NITRC website](https://www.nitrc.org/projects/shapepopviewer/)_ + * In 3D Slicer\, open _Application Settings_ in the _Edit_ Menu\. On the tab _Modules_ \, __Add __ the folder where ShapePopulationViewer is stored + * Restart 3D Slicer + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_29.png) + + + + * SPHARM\-PDM tool can be used by two different ways: + * As __command\-line__ __tool__ through the terminal thanks to SlicerSALT + * As a __module__ of SlicerSALT or 3DSlicer + + +__SPHARM\-PDM Command\-Line Tool__ + +* SPHARM\-PDM method can be run on several cases through a terminal thanks to two files included in the SlicerSALT package: +* SPHARM\-PDM\-parameters\.ini which allows the user to specify the inputs\, outputs and the parameters of the SPHARM\-PDM tool +* SPHARM\-PDM\.py python script which will apply SPHARM\-PDM method on the given input cases with the parameters specified in the SPHARM\-PDM\-parameters\.ini file +* _Location of the SPHARM\-PDM\.py_ and _SPHARM\-PDM\-parameters\.ini files:_ + * _On Linux and Windows: share/Slicer\-4\.7/CommandLineTool_ + * _On MacOs: Open the SlicerSALT Contents _ + * _🡪 Contents/share/Slicer\-4\.7/CommandLineTool_ + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_30.png) + + + __Step 1__ : Modification of the _SPHARM\-PDM\-parameters\.ini_ file by specifying the __input directory path __ containing the input cases and __the output directory path __ where the SPHARM\-PDM outputs will be stored\. + +The others parameters can also be modified to apply SPHARM\-PDM to a particular case\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_31.png) + +* __Step 2__ : Launch SPHARM\-PDM method with the following command\-lines: +* On Linux and Windows: + * _$cd path\-to\-the\-SlicerSALT\-package_ + * _$\./SlicerSALT \-\-no\-main\-window \-\-python\-script share/Slicer\-4\.7/CommandLineTool/SPHARM\-PDM\.py share/Slicer\-4\.7/CommandLineTool/SPHARM\-PDM\-parameters\.ini_ +* On MacOs: + * _$cd path\-to\-the\-SlicerSALT\-package/SlicerSALT\.app/Contents/MacOS_ + * _$\./SlicerSALT \-\-no\-main\-window \-\-python\-script \.\./share/Slicer\-4\.7/CommandLineTool/SPHARM\-PDM\.py \.\./share/Slicer\-4\.7/CommandLineTool/SPHARM\-PDM\-parameters\.ini_ + + +### SPHARM\-PDM Module + +In 3D Slicer or in SlicerSALT\, select _Shape Analysis Module_ from the _Modules_ drop\-down menu \( _Category:_ SPHARM\) or on the Search bar\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_32.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_33.png) + +__Setting up Input/Output Directories__ + + _Group Project IO_ + +For _Input Directory_ _\,_ select the folder which contains the input data + +For _Output Directory_ _\,_ select the folder where the outputs of each step will be stored + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_34.png) + +__Input/Output Data__ + +* The _input directory_ contains the input data which can be: + * Label map volumes \(\.gipl\, \.gipl\.gz\, \.nii\, \.nii\.gz\, \.nrrd\, \.mgh\, \.mgh\.gz\, \.mhd\, or \.hdr\) + * Models \(\.vtk\, or \.vtp\) +* The _output directory_ will contain SPHARM output data sorted in three different folders for each of the three steps: + * _Step1\_SegPostProcess_ for the _Post Processed Segmentation_ step + * _Step2\_GenMeshPara_ for the _Generate Mesh Parameters_ step + * _Step3\_ParaToSPHARMMesh_ for the _Parameters to SPHARM Mesh_ step + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_35.png) + +### Features and Parameters + +* _Common to all_ __tabs__ +* The _Overwrite_ option: this option is available for the three steps of _Shape Analysis Module_ : +* If this option __is not selected__ for one step\, it will skip the step if the output data were previously computed and stored in the output folder of this step: + * Folder _Step1\_SegPostProcess_ for the _Post Processed Segmentation_ step + * Folder _Step2\_GenMeshPara_ for the _Generate Mesh Parameters_ step + * Folder _Step3\_ParaToSPHARMMesh_ for the _Parameters to SPHARM Mesh_ step +* If this option __is selected __ for one step\, all the files in the output folder of this step will be removed and the step won’t be skipped\. + + _Post Processed Segmentation tab_ + + _Rescale option_ : The X\, Y and Z spacing parameters \(sx/sy/sz\) determine the resolution in which the data will be processed for each axis \(in millimeters\) + + _Label Number option_ : First extraction of the specified label before to apply the post processing step + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_36.png) + + _Generate Mesh Parameters_ + + _Number of iterations_ : Higher number of iterations will improve the accuracy of the mapping of the surface mesh to a parameterization sphere + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_37.png) + +| Number of iterations | +| :-: | +| 5 | +| 1000 | + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_38.png) + + __Figure__ : _\*SPHARM\.vtk_ generated with 5 iterations \(top\) and 1000 iterations \(bottom\) + + _Note_ : Higher number of iterations will produce better representation results\. + + _Parameters to SPHARM Mesh_ + + _Subdivision Level value_ : Icosahedron subdivision allows for linear\, uniform sampling of the object by referring to its spherical parameterization\. The _SubdivLevel_ value sets the level of the subdivision factor that will be used\. Improving this value results in a SPHARM mesh with more points\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_39.png) + + _Parameters to SPHARM Mesh_ + + _Subdivision Level value_ : + + __Figure: __ _\*para\.vtk_ generated with 5 subdivision different \(left to right : 2 – 4 – 6 – 10 \- 20\) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_40.png) + +| Subdivision Level | 2 | 4 | 6 | 10 | 20 | +| :-: | :-: | :-: | :-: | :-: | :-: | +| Number of Points | 42 | 162 | 362 | 1002 | 4002 | + + _Parameters to SPHARM Mesh_ + + _Subdivision Level value_ : + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_41.png) + + __Figure__ _: \*SPHARM\.vtk_ generated with a subdivision level of 2 \(left\) and 10 \(right\) + + _Note_ : Higher subdivision level value will result in a smoother surface mesh\. + +| Subdivision Level | 2 | 10 | +| :-: | :-: | :-: | +| Number of points | 42 | 1002 | + + + + _Parameters to SPHARM Mesh_ + + _SPHARM Degree value_ represents the degree of the spherical harmonic series used on the data\. Changing this value results in different levels of detail of the object\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_42.png) + + + + _Parameters to SPHARM Mesh_ + + _SPHARM Degree_ : + +| SPHARM degree | +| :-: | +| 1 | +| 3 | +| 5 | +| 10 | +| 25 | + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_43.png) + + __Figure: __ _\*SPHARM\.vtk_ generated with different SPHARM degree \(left to right: 1 – 3 – 5 – 10 – 25\) + + _Note_ : A higher SPHARM degree value will result in a surface mesh with more details\. + + + + _Parameters to SPHARM Mesh_ + + _Build the medial mesh:_ This option will compute the mean latitude axis associated with the data if checked\. The Number of theta/phi iterations corresponds to the number of samples used in the medial mesh computation 1 \. + +1\. Paniagua B1\, Lyall A\, Berger JB\, Vachet C\, Hamer RM\, Woolson S\, Lin W\, Gilmore J\, Styner M\. \(2013\)\. Lateral ventricle morphology analysis via mean latitude axis\. Proc SPIE Int Soc Opt Eng\. 2013 Mar 29;8672\. pii: 2006846\. \ + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_44.png) + + + + _Advanced Post Processed Segmentation_ + + _Gaussian filtering_ : A Gaussian filter will be applied during the preprocessing step if this option is checked\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_45.png) + + + + _Advanced Parameters to SPHARM Mesh_ + + _Registration template Options_ : This option allows to have a rigid\-body Procrustes alignment i\.e\. the _\*SPHARM\_procalign_ mesh generated by the tool will be aligned with the registration template \(VTK file\) by applying\, if needed\, a rigid transformation \(which uses only translation and/or a rotation\)\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_46.png) + + + + _Advanced Parameters to SPHARM Mesh_ + + _Flip template Options_ : If _Use Flip Template_ is checked\, a _Flip Template_ is used to test all possible flips of the parametrization along the first order ellipsoid axis and select the one whose reconstruction has minimal distance to the flip\-template\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_47.png) + + + + _Advanced Parameters to SPHARM Mesh_ + + _Flip Options_ : This option allows an optional flipping of the parametrization specified by the user\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_48.png) + + + + _Advanced Parameters to SPHARM Mesh_ + + _Flip Options_ : To apply the same flip option for each case\, check _Same Flip for all the outputs_ \. + +Select __one flip along an axis__ or choose to apply __all the flips__ to determine the best flip\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_49.png) + + + + _Advanced Parameters to SPHARM Mesh_ + + _Flip Options_ : To apply different flip options for each case\, uncheck _Same Flip for all the outputs_ \. + +As previously\, select a flip option for each case\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_50.png) + + + + _Advanced Parameters to SPHARM Mesh_ + + _Flip Options_ : Example of an application of all the flips on one case by iterating 7 times _ParaToSPHARMMesh_ CLI\. This figure shows a comparison of different flips in _Shape Population Viewer\._ + + _Flip Along X Axis_ + + _Flip Along Y Axis_ + + _Flip Along Z Axis_ + + _Flip Along_ _X and Y Axis_ + + _Flip Along_ _X and Z Axis_ + + _Flip Along_ _Y and Z Axis_ + + _Flip Along X\, Y and Z Axis_ + + ![](img/SlicerSALT-SPHARM-PDM-Tutorial_51.png) + + __Figure__ : Visualization in ShapePopulationViewer of the different flips applied on _\*SPHARM_ model\. + +### Running SPHARM\-PDM + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_52.png) + +Click on the Run _ShapeAnalysisModule_ button\, to run the three steps on the provided inputs\. + +Progress bars will indicate when the computation is done and if the computation for each case was completed with or without error\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_53.png) + +If the module was completed with errors\, the step which was completed with errors is indicated and the errors can be displayed by clicking on the little arrows: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_54.png) + + _3D Slicer’s Error Log_ can also be used for debugging if the module was completed with errors\. To open it\, click on the red icon at the bottom right\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_55.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_56.png) + +The outputs files for each step of SPHARM\-PDM are stored in three folders in the output directory previously selected: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_57.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_58.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_59.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_60.png) + +### Quality control using ShapePopulationViewer + +If _Shape Population Viewer_ is installed\, the Visualization tab will be enabled: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_61.png) + + __Note__ : _ShapePopulationViewer_ is installed by default in SlicerSALT + + + +The selection of the SPHARM outputs which will be displayed in _Shape Population Viewer_ can be done thanks to the checkable combobox or with the checkbox corresponding to them: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_62.png) + + + +Run _Shape Population Viewer_ by clicking on the _Shape Population Viewer_ button: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_63.png) + + + +To display the selected models in _Shape Population Viewer_ \, click on _VTK Files_ and then _Ok_ : + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_64.png) + + + +To display the different color maps on the meshes\, use the comboBox Attributes: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_65.png) + + __Figure__ : Visualization in ShapePopulationViewer of two \*SPHARM models with the phi spherical parameter representation + + + + + +* Example: This view shows the phi correspondences between the files\. + * Quality control of the correspondences is performed using the color\-coded parameterization information\. + * Equally colored areas represent equal corresponding area\. + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_66.png) + +groupA\_01\_hippo\_pp\_surf\_SPHARM\.vtk + +groupA\_01\_hippo\_pp\_surf\_SPHARM\.vtk + +groupA\_01\_hippo\_pp\_surf\_SPHARM\.vtk + +groupA\_01\_hippo\_pp\_surf\_SPHARM\.vtk + + __Figure__ : Visualization in ShapePopulationViewer of multiples _\*SPHARM_ shapes displaying paraPhi color map + + + + + +* Only data sets with Procrustes alignment information are automatically aligned in _Shape Population Viewer_ \. +* For data sets without Procrustes alignment: + * Under _View Options_ \, set _Aligned_ to __On __ to align the data set using file information\. + + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_67.png) + + + +For more information about using _Shape Population Viewer_ tool\, consult the _[ShapePopulationViewer tutorial](https://www.nitrc.org/docman/view.php/759/1339/User%20Tutorial%20v1.3.2)_ by Alexis Girault\. + +### Quality control using _Models_ module + +Models can be viewed in _3D Slicer_ or _SlicerSALT_ by dragging and dropping the files or by using the _Data_ button in the toolbar to search for the file\. + +When importing the VTK file\, select the _Model_ Option : + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_68.png) + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_69.png) + + + +When the VTK file has been imported\, it will be visualized in the _Scene View_ \(or the 3D View\)\. Switch to the _Models_ Module to change the display settings of the VTK model\. + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_70.png) + + + + _Hide/show_ the model by clicking on the eye icon + +To change the display properties of the VTK file\, first _select_ the file from the _Scene window_ in the _Models_ Module + +Change the _representation_ of the model mesh\. For example\, _Wireframe_ representation will display the meshing of the model + +Change the _color_ of the mesh from the default gray color + +Change the _opacity_ of the mesh + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_71.png) + +## Acknowledgements \- Resources \- Questions + + + diff --git a/Docs/modules/SVA.md b/Docs/modules/SVA.md new file mode 100644 index 0000000..5cb91dc --- /dev/null +++ b/Docs/modules/SVA.md @@ -0,0 +1,270 @@ +# Shape Variation Analyzer User Tutorial + +Authors: Mateo lopez\, Priscille de Dumast\, Juan C\. Prieto\, Martin Styner\, Beatriz Paniagua + +Collaborators: + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_0.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_1.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_2.png) + +## ShapeVariationAnalyzer Tool Description + +Step 1: Create the different groups + +Step 2: Preview and group update + +Step 3: Generate and explore models + +Step 4: Evaluate the models + +## Description of ShapeVariationAnalyzer + + Shape Variation Analyzer \(SVA\) allows the computation of PCA decomposition of groups of shapes in order be able to represent them in a lower dimensional space\. SVA also allows the user to explore the generated PCA space and to evaluate the quality of the generated models\. + +The inputs meshes are vtk files\, they must have corresponding points to be processed by SVA\. If it is not the case\, SlicerSALT provides tools that are able to convert the data set\. + +The SVA tool consists on four steps: + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_2.png) + +### Step 1: Create the groups + +This step will generate a CSV file describing the location of each shape and their corresponding group\. To do so a folder per group should be created\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_3.png) + + Figure : Input/Output for the creation of groups + +### Step 2: Preview and Update + +This step will allow the user to visualize the groups in Shape Population Viewer\. + +He will be able modify groups before computation\, if it is necessary\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_9.png) + +### Step 3: Generate and Explore Models + +Generating the PCA representation will compute the explained variance ratio and the cumulative sum of the explained variance ratio. You can project each group on the two first component and compute a mean shape for each group\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_10.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_11.png) + +The exploration of the models allows to: + +* Generate new shapes with sliders representing each component of the PCA model +* Visualize the distance of the current shape compared to the mean shape of the group\. +* Visualize a particular member of a group\, or the mean shape of a sub\-group + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_12.png) + +Individual population shape in showing a heat map of differences compared with the mean shape in white in the figure below. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_13.png) + +### Step 4: Evaluate the models + +This step will evaluate the models by computing three values: + +* _Model compactness_: A compact model is one that has as little variance as possible and requires as few parameters as possible to define an instance\. +* _Model generalization_: The generalization ability of a model measures its capability to represent unseen instances of the object class\. This is a fundamental property as it allows a model to learn the characteristics of an object class from a limited training set\. +* _Model specificity_: A specific model should only generate instances of the object class that are similar to those in the training set\. It is useful to assess this qualitatively by generating a population of instances using the model and comparing them to the members of the training set\. + +## Installation of SVA Tool + +SVA tool can be used with two open\-source software platforms: +* SlicerSALT : which is the dissemination vehicle of powerful shape analysis methodology\. This software is a light\-weight\, customized version of 3D Slicer\. It contains SVA _as a module_ \. +* 3D Slicer : which is an open\-source and free software platform for medical image informatics\, image processing\, and three\-dimensional visualization\. SVA can be downloaded _as an extension_ \. + +### SVA Installation on SlicerSALT + +Download the SlicerSALT packages for your respective operating system from the _[SlicerSALT website](https://salt.slicer.org/)_ and install it\. SVA will be ready to use then\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_14.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_15.png) + +### SVA Installation on 3D Slicer + + Download 3D Slicer packages for your respective operating system on the _[3D Slicer website](https://www.slicer.org/)_ and install it\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_17.png) + + In 3D Slicer\, open the Extension Manager + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_18.png) + + In the _Install Extension_ tab\, select _ShapeVariationAnalyzer_ under _Categories_ + + Under ShapeVariationAnalyzer \, select the _Install_ button and restart Slicer when prompted. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_21.png) + +To visualize groups before the computation\,SVA uses Shape Population Viewer extension\. Shape Population Viewer can be installed as a 3D Slicer extension or as an external binary\. This module is included as part of the SlicerSALT package\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_22.png) + +To install Shape Population Viewer as _a 3D Slicer extension_ : +* Open _Extension Manager_ \, in the _Install Extensions _ tab\, select ‘ _Shape Analysis’_ under _Categories_ +* Select the appropriate _Install _ button and restart 3D Slicer when prompted + + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_23.png) + +To install Shape Population Viewer as an _external binary_ : +* Download ShapePopulationViewer package for your respective operating system on _NITRC website_ +* In 3D Slicer\, open _Application Settings _ in the _Edit _ Menu\. On the tab _Modules_ \, Add the folder where ShapePopulationViewer is stored +* Restart 3D Slicer + + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_24.png) + +## How to use ShapeVariationAnalyzer + +In 3D Slicer or in SlicerSALT\, select _ShapeVariationAnalyzer_ from the _Modules_ drop\-down menu \( _Category:_ Decomposition\) or on the Search bar\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_25.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_26.png) + +### Setting up the input directories + +The SVA tool process PCA models for different groups at the same time and a general model that combine all the groups\. To do so\, the input files should be organized in folders\, one folder per group\. +Remember: +* Every file must have corresponding points +* Only \.vtk files are supported + + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_27.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_28.png) + +### Create the Groups + +**Tab: Creation of CSV file** + +To add a group\, select the desired folder and click the ‘Add Group’ Button to add it\. Note that adding a group will give it a group number + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_29.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_30.png) + +Edit a group folder: To edit a group\, select the desired group number in the spin box\, two new options appears: +* Remove group: remove the current group from the list of groups +* Modify group: This option update the current group by associating it with the current selected folder + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_31.png) + +Export groups: When all the groups have been created\, use the Export button to save the CSV file describing the groups\. The path of this file is automatically passed to the other tabs of the module\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_32.png) + +**Tab: Preview/Update Group** + +To make sure that the groups are correctly defined\, SVA offers the possibility to visualize each element of a group using the Shape Population Viewer \(SPV\) module: + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_33.png) + +* Select all the shapes that you want to visualize by marking the corresponding check box +* Use the preview button to launch SPV + +If a shape is identified as being part of the wrong group\, change his group number and use the Export button to update the csv file\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_34.png) + +**Tab: Exploration** + +1\): Generate the models + +Select the desired CSV file previously generated and use the Process and Export button to generate the models and import them in the explorer\. The exploration interface will appear: + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_35.png) + + +2\): Save and load a model: +* We recommend to save your models before starting the exploration by using the save button: specify a \.json file \(ex: exploration\.json\) where the exploration should be saved\. +* The following files will be generated: + * The specified JSON file + * A VTK file per group representing the mean shape of the group + * A PYC file necessary for pca computation +* To load an existing exploration\, select a previously generated json file in the ‘JSON file’ field\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_36.png) + + +3\)Exploration: + +_Groups:_ Define colors for each groups\, navigate between groups using the group option\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_37.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_38.png) + +_Eigenvalues:_ To start exploring the PCA space\, use the eigenvalues sliders + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_39.png) + +If you want to play with more sliders\, you can use the minimum explained variance and the maximum number of eigenvalues to add more sliders + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_40.png) + +_Visualization of the distance:_ It is possible to visualize the distance between the current shape and the mean shape by changing the color mode in the SVA interface\, keep in mind that the distance is computed using the corresponding points of the shape\, not the closest point\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_41.png) + +_Plot Visualization and interaction:_ By default\, the Explained Variance Ratio plot appears when a model is generated or loaded\. It shows\, for the selected group\, the explained variance for each eigenvalue in a bar plot\, and the cumulative sum of the explained variance\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_43.png) + + +To see the projection of the group on the 2 first component of the PCA model\, select the 'PCA projection plot chart' plot using the top left menu of the plot area: + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_44.png) + +On the plot below, you can select a point\, the corresponding shape will be displayed by updating the sliders value\. If you select a group of points\, the mean shape of those points will be displayed\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_45.png) + + +4\) Evaluation: + +To make sure that the generated models are well defined\, SVA can evaluate the models by computing the compactness\, specificity and generalization and visualize them in the plot area\. + +* Parameters: + * The number of eigenvalues are determined by the number of sliders available when the evaluation is launched\. + * The number of random shapes parameter allow to choose how many shapes should be generated to compute the specificity\. + +To launch the evaluation\, use the Evaluate models button\. The evaluation is a long process\, if you want to abort it\, you can use the same button\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_46.png) + +When the evaluation is done\, you can visualize the results by selecting in the plot area menu the PCA Specificity plot chart\, the PCA Compactness plot chart or the PCA Generalization plot chart\. + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_47.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_48.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_49.png) + +![](img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_50.png) + + +## Acknowledgements \- Resources \- Questions + +
    +
  • The Shape Variation Analyzer developers gratefully acknowledge funding for this project provided by NIH NIBIB R01EB021391 (Shape Analysis Toolbox for Medical Image Computing Projects), as well as the Slicer community.
  • +
  • Github repository:
  • + +
  • Forums:
  • + +
  • For other remarks or questions, please email: beatriz.paniagua@kitware.com / Juanprietob@gmail.com
  • +
diff --git a/Docs/modules/Srep.md b/Docs/modules/Srep.md new file mode 100644 index 0000000..3ba5a88 --- /dev/null +++ b/Docs/modules/Srep.md @@ -0,0 +1,198 @@ +# Shape analysis via skeletal models User Tutorial + +Authors: Zhiyuan Liu\, Stephen M\. Pizer\, Beatriz Paniagua\, Jared Vicory\, Junpyo Hong\, Connor Bowley + +![](img/SlicerSALT-SPHARM-PDM-Tutorial_1.png) +![](img/SlicerSALT-SPHARM-PDM-Tutorial_2.png) + +## Introduction to skeletal representations + +Shape Analysis allows studying morphology in populations of anatomic structures\. A __skeletal representation \(s\-rep\) is__ used to model the structure of an object with no essential interior branches\, providing a rich geometric representation with correspondence across cases\. + +The S\-rep Extension \(short for __Skeletal Representation Extension__ \) in SlicerSALT provides utilities to visualize\, initialize and refine s\-reps of 3\-dimensional objects\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_2.png) + +Figure: Some examples have been researched via s\-rep + +Left: caudate nucleus Middle: hippocampus Right: cerebral ventricle + +## The Slabular S\-rep + +A 3D object whose length is notably larger than its width which is notably larger than its thickness is suitable for modeling by a slabular s\-rep\. + +A slabular s\-rep \(from now on just referred to as an s\-rep\) + +consists first of a folded\, two\-sided quasi\-medial sheet inside the object\. This sheet is called the “skeletal sheet”\. It is sampled into a network of skeletal positions\. + +Special skeletal samples are at positions where the sheet folds back onto itself\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_5.png) + +Figure: A skeletal model for a hippocampus\. Left: the surface mesh of hippocampus\. Right: the skeletal sheet of the s\-rep of this hippocampus + +From each sample point on the skeleton\, a vector to and approximately orthogonal to the boundary is provided as part of the s\-rep\. These vectors are called “spokes”\. The spokes emanating from the fold curve of the sheet \(yellow curve in the right figure\) meet the object surface at crest points\. The spokes can be interpolated into a finer mesh\, and the spoke endpoints can be interpolated into a implied boundary for the object\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_7.png) + +Figure: A skeletal model for a hippocampus\. Left: implied boundary of hippocampus\. Right: the s\-rep of hippocampus + +## The SlicerSkeletalRepresentations extension + +Modules Overview + + * __SRep:__ Visualization and interpolation of existing s\-reps + * __SRepCreator:__ Initialize an s\-rep by mean curvature flow of an object boundary + * __SRepRefinement:__ Refine an s\-rep to more closely fit an object boundary + +All the s\-rep modules can be found in the category _Skeleton\, topology_ + +## S\-rep MRML Nodes + +3D Slicer uses Medical Reality Modeling Language \(MRML\) nodes as the data types for its processing\. The s\-rep extension adds a new MRML data node used to describe s\-reps\. These nodes can be saved and loaded as \.srep\.json files using Slicer’s built in save and load facilities\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_9.png) + +## S\-rep modules workflow + +### S\-rep Extension in SlicerSALT + +Download the SlicerSALT packages for your respective operating system from the _[SlicerSALT website](http://salt.slicer.org/)_ and install it\. The _SlicerSkeletalRepresentation_ extension will be ready to use\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_10.png) + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_11.png) + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_12.png) + +### S\-rep Extension Installation on 3D Slicer + +Download 3D Slicer at _[https://download\.slicer\.org/](https://download.slicer.org/)_ + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_14.png) + +From 3D Slicer\, open the extension manager + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_16.png) + +Search for “SkeletalRepresentation”\, press Install\, then press Restart in the bottom right corner\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_17.png) + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_18.png) + +## SRep Module + +### SRep: Visualization + +Can visualize the SRep \(or pieces thereof\) + +Can see basic information\, such as number of spokes + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_19.png) + +### SRep: Interpolation + +Can interpolate skeletal grid and spoke points. Will increase number of spokes by 2 \(Interpolation level\) times. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_20.png) + +Both original and interpolate s\-reps displayed\. The original s\-rep was given thicker lines for visualization purposes\. + +### SRepCreator Module + +Create s\-reps from Models \(\.vtk\, \.stl\, \.ply\, etc\) in 2 steps + +Forward Flow: creates an ellipsoid that best fits the input model and creates an SRep to fit that ellipsoid\. The model is "flowed" toward an ellipsoidal shape for a number of iterations\, then a best fit ellipsoid is made on the flowed shaped\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_21.png) + +Example forward flow to ellipsoid + +Backward Flow: adjusts the SRep created from the ellipsoid to fit the original model by reversing the flow transformations made during the forward flow\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_22.png) + +Example backward flow to fit original model + +**SRepCreator Parameters** + +* S\-rep creation parameters \(also see “Help” in the module\) + * _Input Mesh: _ model to create the SRep of\. + * _Max iterations:_ the number of iterations to run in the forward flow\. + * _Step size:_ the size of step to take in during the forward flow\. + * _Smooth amount:_ the amount of smoothing that should be applied to the model while flowing toward the ellipsoidal shape\. The algorithm doesn't work well with sharp edges or points\, so smoothing can help with that\. + * _\# Fold Points:_ The number of fold \(aka crest\) points in the generated SRep\. + * _\# Steps to Fold:_ The number of steps from the spine to outer boundary of the skeletal sheet\. The point on the spine is not included in this number\. + + +**Running SRepCreator** + +Set the desired parameters and press run\. During the creation of the s\-rep you will see a progress bar\, but be unable to do anything else in Slicer\. + +After a couple minutes an SRep will be created with the name \\-srep \. + +You can then use the _Data_ or _SRep_ modules to visualize the SRep\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_23.png) + +### SRepRefinement Module + +The goal of refinement is to better fit an s\-rep’s spokes to the boundary of the model it was created from\. There are three factors we consider when defining the objective function for fit\. The distance from s\-rep implied boundary \(the ends of the spokes\) to actual model boundary\. The deviation of the spokes from being perpendicular to the model boundary\. The geometric illegality of the spokes\, i\.e\. the spokes are not allowed to cross each other\. + +**SRepRefinement Parameters** + + _Input Model:_ the model to refine the SRep to + + _Input SRep:_ the SRep to be refined + + _Output SRep:_ the SRep object to put the refined SRep into + + _Interpolation level:_ how much to interpolate between spokes\. The interpolated spokes are used to define the implied boundary used by the objective function\. Interpolated spokes are produced at 2 level times the original density\. + + _Initial region size:_ the initial value of the newuoa trust region radius\. + + _Final region size:_ the final value of the newuoa trust region radius\. Typically this is around one tenth the greatest expected change to a variable\. + + _Max iterations:_ the maximum amount of iterations to run + + _Image match weight:_ the amount of weight to place on the L0 penalty for not being on the model boundary + + _Normal match weight:_ the amount of weight to place on the L1 penalty for not being normal to the model boundary + + _Geometric illegality weight: _ the amount of weight to place on the L2 penalty for having illegally crossing spokes + +**Running SRepRefinement** + +Set the desired parameters and press run\. During the refinement of the s\-rep you will see a progress bar\, but be unable to do anything else in Slicer\. + +After a few minutes the refined s\-rep will be available in the _Output SRep_ node\. + +You can then use the _Data_ or _SRep_ modules to visualize the SRep\. + +![](img/SlicerSALT-SrepMRMLModule-Tutorial_24.png) + +## Acknowledgements \- Resources \- Questions + + + diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_0.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_0.png new file mode 100644 index 0000000..ce3ea7d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_1.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_1.png new file mode 100644 index 0000000..f6d3994 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_10.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_10.png new file mode 100644 index 0000000..697e64c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_11.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_11.png new file mode 100644 index 0000000..c456898 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_11.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_12.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_12.png new file mode 100644 index 0000000..7021cae Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_12.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_13.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_13.png new file mode 100644 index 0000000..5c07ebe Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_14.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_14.png new file mode 100644 index 0000000..9bc82cf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_15.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_15.png new file mode 100644 index 0000000..a3281d3 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_16.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_16.png new file mode 100644 index 0000000..19cdb6d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_17.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_17.png new file mode 100644 index 0000000..a3281d3 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_18.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_18.png new file mode 100644 index 0000000..efd926f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_19.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_19.png new file mode 100644 index 0000000..efd926f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_2.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_2.png new file mode 100644 index 0000000..b544a09 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_20.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_20.png new file mode 100644 index 0000000..ea9b034 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_21.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_21.png new file mode 100644 index 0000000..408ddd9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_22.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_22.png new file mode 100644 index 0000000..f226335 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_23.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_23.png new file mode 100644 index 0000000..9825b01 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_24.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_24.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_25.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_25.png new file mode 100644 index 0000000..b913537 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_3.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_3.png new file mode 100644 index 0000000..b4d1968 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_3.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_4.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_4.png new file mode 100644 index 0000000..ba3e296 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_4.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_5.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_5.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_5.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_6.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_6.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_7.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_7.png new file mode 100644 index 0000000..f95f7cb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_8.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_8.png new file mode 100644 index 0000000..e6f7c1a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_9.png b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_9.png new file mode 100644 index 0000000..b26ef28 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-CovarianceSignificanceTesting-Tutorial_9.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_0.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_0.png new file mode 100644 index 0000000..ce3ea7d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_1.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_1.png new file mode 100644 index 0000000..f6d3994 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_10.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_10.png new file mode 100644 index 0000000..985e652 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_11.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_11.jpg new file mode 100644 index 0000000..57cdce7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_11.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_12.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_12.jpg new file mode 100644 index 0000000..57cdce7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_12.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_13.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_13.png new file mode 100644 index 0000000..795f6c0 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_14.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_14.png new file mode 100644 index 0000000..792f92d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_15.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_15.png new file mode 100644 index 0000000..b49e63a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_16.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_16.png new file mode 100644 index 0000000..e3b242b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_17.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_17.png new file mode 100644 index 0000000..a5b08ad Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_18.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_18.png new file mode 100644 index 0000000..62247ff Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_19.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_19.png new file mode 100644 index 0000000..b4d1968 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_2.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_2.png new file mode 100644 index 0000000..b544a09 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_20.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_20.png new file mode 100644 index 0000000..ba3e296 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_21.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_21.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_22.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_22.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_23.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_23.png new file mode 100644 index 0000000..f95f7cb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_24.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_24.png new file mode 100644 index 0000000..e6f7c1a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_25.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_25.png new file mode 100644 index 0000000..3424008 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_26.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_26.png new file mode 100644 index 0000000..e43a8e9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_26.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_27.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_27.png new file mode 100644 index 0000000..b7a6ab7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_27.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_28.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_28.png new file mode 100644 index 0000000..f5bc29b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_28.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_29.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_29.png new file mode 100644 index 0000000..fddbbd2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_29.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_3.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_3.jpg new file mode 100644 index 0000000..57cdce7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_3.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_30.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_30.png new file mode 100644 index 0000000..180f01c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_30.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_31.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_31.png new file mode 100644 index 0000000..c83205e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_31.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_32.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_32.png new file mode 100644 index 0000000..c83205e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_32.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_33.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_33.png new file mode 100644 index 0000000..e8a8b11 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_33.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_34.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_34.jpg new file mode 100644 index 0000000..4c0d375 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_34.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_35.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_35.jpg new file mode 100644 index 0000000..26c4afe Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_35.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_36.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_36.png new file mode 100644 index 0000000..c0348aa Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_36.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_37.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_37.png new file mode 100644 index 0000000..26f1f6e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_37.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_38.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_38.png new file mode 100644 index 0000000..24f3a6f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_38.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_39.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_39.png new file mode 100644 index 0000000..ebed42a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_39.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_4.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_4.png new file mode 100644 index 0000000..3981866 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_4.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_40.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_40.png new file mode 100644 index 0000000..bafee00 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_40.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_41.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_41.png new file mode 100644 index 0000000..fddbbd2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_41.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_42.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_42.png new file mode 100644 index 0000000..ee56fdb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_42.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_43.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_43.png new file mode 100644 index 0000000..1c368c6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_43.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_44.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_44.png new file mode 100644 index 0000000..1c368c6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_44.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_45.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_45.png new file mode 100644 index 0000000..fd92a65 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_45.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_46.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_46.png new file mode 100644 index 0000000..4ed2950 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_46.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_47.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_47.png new file mode 100644 index 0000000..164d8f9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_47.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_48.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_48.png new file mode 100644 index 0000000..164d8f9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_48.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_49.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_49.png new file mode 100644 index 0000000..164d8f9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_49.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_5.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_5.png new file mode 100644 index 0000000..0fcdb37 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_5.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_50.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_50.png new file mode 100644 index 0000000..7d1f7a4 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_50.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_51.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_51.jpg new file mode 100644 index 0000000..3bccfcd Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_51.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_52.jpg b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_52.jpg new file mode 100644 index 0000000..c96db55 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_52.jpg differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_53.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_53.png new file mode 100644 index 0000000..9b98218 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_53.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_54.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_54.png new file mode 100644 index 0000000..d9cb6cf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_54.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_55.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_55.png new file mode 100644 index 0000000..969d18b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_55.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_56.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_56.png new file mode 100644 index 0000000..e886d34 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_56.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_57.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_57.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_57.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_58.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_58.png new file mode 100644 index 0000000..344f513 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_58.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_6.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_6.png new file mode 100644 index 0000000..e3b0424 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_7.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_7.png new file mode 100644 index 0000000..f0b77cc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_8.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_8.png new file mode 100644 index 0000000..985e652 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_9.png b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_9.png new file mode 100644 index 0000000..26d1275 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-GROUPS-Tutorial_9.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_0.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_0.png new file mode 100644 index 0000000..18d50f6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_1.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_1.png new file mode 100644 index 0000000..a210fef Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_10.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_10.png new file mode 100644 index 0000000..e35066a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_11.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_11.png new file mode 100644 index 0000000..cf1fefb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_11.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_12.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_12.png new file mode 100644 index 0000000..3635a6f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_12.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_13.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_13.png new file mode 100644 index 0000000..0645e13 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_14.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_14.png new file mode 100644 index 0000000..04aa489 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_15.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_15.png new file mode 100644 index 0000000..34465bf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_16.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_16.png new file mode 100644 index 0000000..bd50d14 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_17.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_17.png new file mode 100644 index 0000000..e35066a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_18.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_18.png new file mode 100644 index 0000000..70450bc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_19.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_19.png new file mode 100644 index 0000000..e35066a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_2.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_2.png new file mode 100644 index 0000000..0dbf21d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_20.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_20.png new file mode 100644 index 0000000..25deaed Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_21.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_21.png new file mode 100644 index 0000000..b4d1968 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_22.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_22.png new file mode 100644 index 0000000..ba3e296 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_23.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_23.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_24.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_24.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_25.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_25.png new file mode 100644 index 0000000..f95f7cb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_26.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_26.png new file mode 100644 index 0000000..e6f7c1a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_26.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_27.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_27.png new file mode 100644 index 0000000..e43a8e9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_27.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_28.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_28.png new file mode 100644 index 0000000..b7a6ab7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_28.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_29.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_29.png new file mode 100644 index 0000000..f5bc29b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_29.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_3.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_3.png new file mode 100644 index 0000000..97dbb4d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_3.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_30.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_30.png new file mode 100644 index 0000000..fddbbd2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_30.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_31.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_31.png new file mode 100644 index 0000000..74e1c5e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_31.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_32.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_32.png new file mode 100644 index 0000000..05ac942 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_32.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_33.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_33.png new file mode 100644 index 0000000..6ca336f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_33.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_34.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_34.png new file mode 100644 index 0000000..0a433f2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_34.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_35.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_35.png new file mode 100644 index 0000000..808e8e0 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_35.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_36.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_36.png new file mode 100644 index 0000000..bcf2c2f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_36.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_37.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_37.png new file mode 100644 index 0000000..3b6ee0c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_37.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_38.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_38.png new file mode 100644 index 0000000..abb1e3d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_38.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_39.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_39.png new file mode 100644 index 0000000..78dd6ac Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_39.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_4.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_4.png new file mode 100644 index 0000000..542a357 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_4.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_40.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_40.png new file mode 100644 index 0000000..03c8b3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_40.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_41.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_41.png new file mode 100644 index 0000000..2e8a29f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_41.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_42.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_42.png new file mode 100644 index 0000000..78dd6ac Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_42.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_43.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_43.png new file mode 100644 index 0000000..2246d62 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_43.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_44.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_44.png new file mode 100644 index 0000000..78dd6ac Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_44.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_45.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_45.png new file mode 100644 index 0000000..161acc9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_45.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_46.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_46.png new file mode 100644 index 0000000..e594edf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_46.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_47.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_47.png new file mode 100644 index 0000000..e594edf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_47.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_48.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_48.png new file mode 100644 index 0000000..e594edf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_48.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_49.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_49.png new file mode 100644 index 0000000..b02a124 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_49.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_5.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_5.png new file mode 100644 index 0000000..21cc28f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_5.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_50.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_50.png new file mode 100644 index 0000000..afd7127 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_50.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_51.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_51.png new file mode 100644 index 0000000..6c1294c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_51.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_52.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_52.png new file mode 100644 index 0000000..1fc4f6a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_52.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_53.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_53.png new file mode 100644 index 0000000..2128260 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_53.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_54.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_54.png new file mode 100644 index 0000000..9ef868e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_54.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_55.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_55.png new file mode 100644 index 0000000..c0348aa Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_55.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_56.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_56.png new file mode 100644 index 0000000..e35066a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_56.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_57.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_57.png new file mode 100644 index 0000000..808e8e0 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_57.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_58.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_58.png new file mode 100644 index 0000000..afb6455 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_58.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_59.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_59.png new file mode 100644 index 0000000..0baaf0f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_59.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_6.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_6.png new file mode 100644 index 0000000..3635a6f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_60.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_60.png new file mode 100644 index 0000000..0baaf0f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_60.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_61.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_61.png new file mode 100644 index 0000000..472fdaa Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_61.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_62.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_62.png new file mode 100644 index 0000000..5d0b31c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_62.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_63.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_63.png new file mode 100644 index 0000000..5d0b31c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_63.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_64.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_64.png new file mode 100644 index 0000000..585c026 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_64.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_65.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_65.png new file mode 100644 index 0000000..d022e16 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_65.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_66.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_66.png new file mode 100644 index 0000000..775f99a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_66.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_67.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_67.png new file mode 100644 index 0000000..e1f1362 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_67.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_68.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_68.png new file mode 100644 index 0000000..5d5b184 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_68.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_69.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_69.png new file mode 100644 index 0000000..586b9b2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_69.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_7.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_7.png new file mode 100644 index 0000000..f72e945 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_70.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_70.png new file mode 100644 index 0000000..5b97fa6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_70.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_71.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_71.png new file mode 100644 index 0000000..466efc8 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_71.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_72.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_72.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_72.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_8.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_8.png new file mode 100644 index 0000000..5b886d4 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_9.png b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_9.png new file mode 100644 index 0000000..94acb90 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SPHARM-PDM-Tutorial_9.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_0.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_0.png new file mode 100644 index 0000000..9a455a2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_1.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_1.png new file mode 100644 index 0000000..37e1419 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_10.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_10.png new file mode 100644 index 0000000..15175bf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_11.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_11.png new file mode 100644 index 0000000..623c6c7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_11.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_12.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_12.png new file mode 100644 index 0000000..91c01af Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_12.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_13.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_13.png new file mode 100644 index 0000000..f8ec7f4 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_14.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_14.png new file mode 100644 index 0000000..4c6b6ae Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_15.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_15.png new file mode 100644 index 0000000..2100b3b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_16.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_16.png new file mode 100644 index 0000000..b4d1968 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_17.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_17.png new file mode 100644 index 0000000..ba3e296 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_18.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_18.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_19.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_19.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_2.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_2.png new file mode 100644 index 0000000..30d7e77 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_20.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_20.png new file mode 100644 index 0000000..f95f7cb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_21.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_21.png new file mode 100644 index 0000000..0e41f22 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_22.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_22.png new file mode 100644 index 0000000..293b83a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_23.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_23.png new file mode 100644 index 0000000..5ae022c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_24.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_24.png new file mode 100644 index 0000000..ce81725 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_25.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_25.png new file mode 100644 index 0000000..0ddde9d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_26.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_26.png new file mode 100644 index 0000000..339afff Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_26.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_27.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_27.png new file mode 100644 index 0000000..339afff Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_27.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_28.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_28.png new file mode 100644 index 0000000..339afff Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_28.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_29.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_29.png new file mode 100644 index 0000000..339afff Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_29.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_3.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_3.png new file mode 100644 index 0000000..9db3253 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_3.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_30.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_30.png new file mode 100644 index 0000000..339afff Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_30.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_31.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_31.png new file mode 100644 index 0000000..c7a68da Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_31.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_32.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_32.png new file mode 100644 index 0000000..c7a68da Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_32.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_33.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_33.png new file mode 100644 index 0000000..bd37552 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_33.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_34.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_34.png new file mode 100644 index 0000000..bd37552 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_34.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_35.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_35.png new file mode 100644 index 0000000..bd37552 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_35.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_36.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_36.png new file mode 100644 index 0000000..bd37552 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_36.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_37.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_37.png new file mode 100644 index 0000000..47d9b0e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_37.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_38.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_38.png new file mode 100644 index 0000000..ea0b362 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_38.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_39.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_39.png new file mode 100644 index 0000000..1f41f31 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_39.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_4.jpg b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_4.jpg new file mode 100644 index 0000000..9d6195b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_4.jpg differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_40.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_40.png new file mode 100644 index 0000000..384c5a0 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_40.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_41.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_41.png new file mode 100644 index 0000000..384c5a0 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_41.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_42.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_42.png new file mode 100644 index 0000000..b13b8b9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_42.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_43.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_43.png new file mode 100644 index 0000000..4abc5fa Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_43.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_44.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_44.png new file mode 100644 index 0000000..5b9a63f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_44.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_45.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_45.png new file mode 100644 index 0000000..f435e3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_45.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_46.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_46.png new file mode 100644 index 0000000..1da62cf Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_46.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_47.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_47.png new file mode 100644 index 0000000..34c3ab6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_47.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_48.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_48.png new file mode 100644 index 0000000..34c3ab6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_48.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_49.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_49.png new file mode 100644 index 0000000..59bf650 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_49.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_5.jpg b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_5.jpg new file mode 100644 index 0000000..573a186 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_5.jpg differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_50.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_50.png new file mode 100644 index 0000000..59bf650 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_50.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_51.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_51.png new file mode 100644 index 0000000..73d3a0a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_51.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_52.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_52.png new file mode 100644 index 0000000..a2060d8 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_52.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_53.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_53.png new file mode 100644 index 0000000..b005530 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_53.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_54.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_54.png new file mode 100644 index 0000000..13f8938 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_54.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_55.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_55.png new file mode 100644 index 0000000..a77956f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_55.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_56.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_56.png new file mode 100644 index 0000000..68d1192 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_56.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_57.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_57.png new file mode 100644 index 0000000..6bd16fd Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_57.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_58.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_58.png new file mode 100644 index 0000000..4670b93 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_58.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_59.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_59.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_59.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_6.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_6.png new file mode 100644 index 0000000..ee6efa1 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_7.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_7.png new file mode 100644 index 0000000..9db3253 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_8.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_8.png new file mode 100644 index 0000000..47a4edb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_9.png b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_9.png new file mode 100644 index 0000000..af0bf81 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeRegression-Tutorial_9.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_0.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_0.png new file mode 100644 index 0000000..ce3ea7d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_1.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_1.png new file mode 100644 index 0000000..f6d3994 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_10.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_10.png new file mode 100644 index 0000000..fbaf279 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_11.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_11.png new file mode 100644 index 0000000..aa714d9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_11.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_12.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_12.png new file mode 100644 index 0000000..1e97360 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_12.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_13.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_13.png new file mode 100644 index 0000000..11a0d21 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_14.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_14.png new file mode 100644 index 0000000..b4d1968 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_15.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_15.png new file mode 100644 index 0000000..ba3e296 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_16.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_16.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_17.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_17.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_18.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_18.png new file mode 100644 index 0000000..f95f7cb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_19.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_19.png new file mode 100644 index 0000000..81fe330 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_2.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_2.png new file mode 100644 index 0000000..3fdfe92 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_20.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_20.png new file mode 100644 index 0000000..81fe330 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_21.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_21.png new file mode 100644 index 0000000..f7df7e1 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_22.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_22.png new file mode 100644 index 0000000..e43a8e9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_23.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_23.png new file mode 100644 index 0000000..b7a6ab7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_24.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_24.png new file mode 100644 index 0000000..f5bc29b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_25.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_25.png new file mode 100644 index 0000000..601d145 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_26.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_26.png new file mode 100644 index 0000000..5c2604e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_26.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_27.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_27.png new file mode 100644 index 0000000..32a4433 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_27.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_28.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_28.png new file mode 100644 index 0000000..20270d5 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_28.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_29.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_29.png new file mode 100644 index 0000000..f2e31ac Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_29.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_3.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_3.png new file mode 100644 index 0000000..d53e6fe Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_3.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_30.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_30.png new file mode 100644 index 0000000..e2dc636 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_30.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_31.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_31.png new file mode 100644 index 0000000..115e3f1 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_31.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_32.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_32.png new file mode 100644 index 0000000..e2dc636 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_32.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_33.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_33.png new file mode 100644 index 0000000..e13dd08 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_33.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_34.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_34.png new file mode 100644 index 0000000..8b10c11 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_34.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_35.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_35.png new file mode 100644 index 0000000..10a334d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_35.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_36.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_36.png new file mode 100644 index 0000000..a1368d1 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_36.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_37.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_37.png new file mode 100644 index 0000000..e47a3b8 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_37.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_38.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_38.png new file mode 100644 index 0000000..e47a3b8 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_38.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_39.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_39.png new file mode 100644 index 0000000..22d0bbb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_39.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_4.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_4.png new file mode 100644 index 0000000..13030e6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_4.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_40.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_40.png new file mode 100644 index 0000000..77ea11f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_40.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_41.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_41.png new file mode 100644 index 0000000..39c9297 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_41.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_42.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_42.png new file mode 100644 index 0000000..d042be7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_42.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_43.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_43.png new file mode 100644 index 0000000..fbaf279 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_43.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_44.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_44.png new file mode 100644 index 0000000..244ce59 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_44.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_45.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_45.png new file mode 100644 index 0000000..e26e1d9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_45.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_46.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_46.png new file mode 100644 index 0000000..77ea11f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_46.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_47.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_47.png new file mode 100644 index 0000000..46be265 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_47.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_48.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_48.png new file mode 100644 index 0000000..cc35774 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_48.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_49.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_49.png new file mode 100644 index 0000000..c9366fe Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_49.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_5.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_5.png new file mode 100644 index 0000000..32a4433 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_5.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_50.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_50.png new file mode 100644 index 0000000..09fa21c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_50.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_51.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_51.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_51.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_6.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_6.png new file mode 100644 index 0000000..efbbd21 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_7.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_7.png new file mode 100644 index 0000000..f0b1d35 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_8.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_8.png new file mode 100644 index 0000000..a22c283 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_9.png b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_9.png new file mode 100644 index 0000000..4a6ca04 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-ShapeVariationAnalyzer-Tutorial_9.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_0.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_0.png new file mode 100644 index 0000000..ce3ea7d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_1.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_1.png new file mode 100644 index 0000000..f6d3994 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_10.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_10.png new file mode 100644 index 0000000..61f64ce Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_11.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_11.png new file mode 100644 index 0000000..f319dc6 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_11.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_12.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_12.png new file mode 100644 index 0000000..b4d1968 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_12.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_13.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_13.png new file mode 100644 index 0000000..ba3e296 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_14.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_14.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_15.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_15.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_16.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_16.png new file mode 100644 index 0000000..f95f7cb Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_17.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_17.png new file mode 100644 index 0000000..2f21508 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_18.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_18.png new file mode 100644 index 0000000..81fe330 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_19.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_19.png new file mode 100644 index 0000000..81fe330 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_2.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_2.png new file mode 100644 index 0000000..b544a09 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_20.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_20.png new file mode 100644 index 0000000..95be146 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_21.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_21.png new file mode 100644 index 0000000..0d14dfa Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_22.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_22.png new file mode 100644 index 0000000..3948a8a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_23.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_23.png new file mode 100644 index 0000000..757a46a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_24.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_24.png new file mode 100644 index 0000000..de5cf43 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_25.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_25.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_3.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_3.png new file mode 100644 index 0000000..8fd95ee Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_3.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_4.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_4.png new file mode 100644 index 0000000..61f64ce Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_4.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_5.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_5.png new file mode 100644 index 0000000..b679376 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_5.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_6.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_6.png new file mode 100644 index 0000000..c44ea3f Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_7.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_7.png new file mode 100644 index 0000000..efebac1 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_8.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_8.png new file mode 100644 index 0000000..053d38b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_9.png b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_9.png new file mode 100644 index 0000000..d32a5be Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SlicerDentalModelSeg-Tutorial_9.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_0.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_0.png new file mode 100644 index 0000000..f6d3994 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_0.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_1.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_1.png new file mode 100644 index 0000000..b544a09 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_1.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_10.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_10.png new file mode 100644 index 0000000..88dfae2 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_10.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_11.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_11.png new file mode 100644 index 0000000..94b206b Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_11.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_12.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_12.png new file mode 100644 index 0000000..3223b7c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_12.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_13.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_13.png new file mode 100644 index 0000000..d208adc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_13.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_14.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_14.png new file mode 100644 index 0000000..f759c49 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_14.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_15.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_15.png new file mode 100644 index 0000000..ae76080 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_15.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_16.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_16.png new file mode 100644 index 0000000..28a09f9 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_16.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_17.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_17.png new file mode 100644 index 0000000..6fa8944 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_17.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_18.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_18.png new file mode 100644 index 0000000..8996a60 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_18.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_19.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_19.png new file mode 100644 index 0000000..fcf2c61 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_19.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_2.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_2.png new file mode 100644 index 0000000..80a992c Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_2.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_20.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_20.png new file mode 100644 index 0000000..1da7d4d Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_20.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_21.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_21.png new file mode 100644 index 0000000..3c3cac1 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_21.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_22.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_22.png new file mode 100644 index 0000000..75b1593 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_22.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_23.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_23.png new file mode 100644 index 0000000..dd59394 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_23.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_24.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_24.png new file mode 100644 index 0000000..e491ce7 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_24.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_25.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_25.png new file mode 100644 index 0000000..0b0ad3a Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_25.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_3.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_3.png new file mode 100644 index 0000000..38b5cdc Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_3.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_4.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_4.png new file mode 100644 index 0000000..374864e Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_4.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_5.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_5.png new file mode 100644 index 0000000..6254906 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_5.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_6.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_6.png new file mode 100644 index 0000000..98163c3 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_6.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_7.jpg b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_7.jpg new file mode 100644 index 0000000..d3eabcd Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_7.jpg differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_7.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_7.png new file mode 100644 index 0000000..82b6eb5 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_7.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_8.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_8.png new file mode 100644 index 0000000..19fc0da Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_8.png differ diff --git a/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_9.png b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_9.png new file mode 100644 index 0000000..20fe9c5 Binary files /dev/null and b/Docs/modules/img/SlicerSALT-SrepMRMLModule-Tutorial_9.png differ diff --git a/Docs/requirements.in b/Docs/requirements.in new file mode 100644 index 0000000..4d50b25 --- /dev/null +++ b/Docs/requirements.in @@ -0,0 +1,5 @@ +mkdocs +mkdocstrings[python] +markdown-include +myst-parser +sphinx-rtd-theme diff --git a/Docs/requirements.txt b/Docs/requirements.txt new file mode 100644 index 0000000..6d45a06 --- /dev/null +++ b/Docs/requirements.txt @@ -0,0 +1,132 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile ./Docs/requirements.in +# +alabaster==0.7.16 + # via sphinx +babel==2.17.0 + # via sphinx +certifi==2025.1.31 + # via requests +charset-normalizer==3.4.1 + # via requests +click==8.1.3 + # via mkdocs +docutils==0.21.2 + # via + # myst-parser + # sphinx + # sphinx-rtd-theme +ghp-import==2.1.0 + # via mkdocs +griffe==0.22.0 + # via mkdocstrings-python +idna==3.10 + # via requests +imagesize==1.4.1 + # via sphinx +importlib-metadata==4.12.0 + # via + # markdown + # mkdocs + # sphinx +jinja2==3.1.2 + # via + # mkdocs + # mkdocstrings + # myst-parser + # sphinx +markdown==3.3.7 + # via + # markdown-include + # mkdocs + # mkdocs-autorefs + # mkdocstrings + # pymdown-extensions +markdown-include==0.6.0 + # via -r ./Docs/requirements.in +markdown-it-py==3.0.0 + # via + # mdit-py-plugins + # myst-parser +markupsafe==2.1.1 + # via + # jinja2 + # mkdocstrings +mdit-py-plugins==0.4.2 + # via myst-parser +mdurl==0.1.2 + # via markdown-it-py +mergedeep==1.3.4 + # via mkdocs +mkdocs==1.3.0 + # via + # -r ./Docs/requirements.in + # mkdocs-autorefs + # mkdocstrings +mkdocs-autorefs==0.4.1 + # via mkdocstrings +mkdocstrings[python]==0.19.0 + # via + # -r ./Docs/requirements.in + # mkdocstrings-python +mkdocstrings-python==0.7.1 + # via mkdocstrings +myst-parser==3.0.1 + # via -r ./Docs/requirements.in +packaging==21.3 + # via + # mkdocs + # sphinx +pygments==2.19.1 + # via sphinx +pymdown-extensions==9.5 + # via mkdocstrings +pyparsing==3.0.9 + # via packaging +python-dateutil==2.8.2 + # via ghp-import +pyyaml==6.0 + # via + # mkdocs + # myst-parser + # pyyaml-env-tag +pyyaml-env-tag==0.1 + # via mkdocs +requests==2.32.3 + # via sphinx +six==1.16.0 + # via python-dateutil +snowballstemmer==2.2.0 + # via sphinx +sphinx==7.3.7 + # via + # myst-parser + # sphinx-rtd-theme + # sphinxcontrib-jquery +sphinx-rtd-theme==3.0.2 + # via -r ./Docs/requirements.in +sphinxcontrib-applehelp==2.0.0 + # via sphinx +sphinxcontrib-devhelp==2.0.0 + # via sphinx +sphinxcontrib-htmlhelp==2.1.0 + # via sphinx +sphinxcontrib-jquery==4.1 + # via sphinx-rtd-theme +sphinxcontrib-jsmath==1.0.1 + # via sphinx +sphinxcontrib-qthelp==2.0.0 + # via sphinx +sphinxcontrib-serializinghtml==2.0.0 + # via sphinx +tomli==2.2.1 + # via sphinx +urllib3==2.3.0 + # via requests +watchdog==2.1.9 + # via mkdocs +zipp==3.8.0 + # via importlib-metadata diff --git a/Modules/Scripted/Home/CMakeLists.txt b/Modules/Scripted/Home/CMakeLists.txt index 227702c..3993cf4 100644 --- a/Modules/Scripted/Home/CMakeLists.txt +++ b/Modules/Scripted/Home/CMakeLists.txt @@ -3,12 +3,15 @@ set(MODULE_NAME Home) #----------------------------------------------------------------------------- set(MODULE_PYTHON_RESOURCES + "Resources/SampleDataDescription/CrownSegmentation.json" "Resources/SampleDataDescription/DataImporterInputData.json" "Resources/SampleDataDescription/MFSDAInputData.json" - "Resources/SampleDataDescription/SPHARM-PDMTestData.json" - "Resources/SampleDataDescription/SPHARM-PDMFiducials.json" "Resources/SampleDataDescription/ShapeRegressionInputData.json" - "Resources/SampleDataDescription/SRepInitializerData.json" + "Resources/SampleDataDescription/SlicerDWDInputData.json" + "Resources/SampleDataDescription/SPHARM-PDMFiducials.json" + "Resources/SampleDataDescription/SPHARM-PDMTestData.json" + "Resources/SampleDataDescription/SRepCreatorData.json" + "Resources/SampleDataDescription/SRepHypothesisTestingData.json" "Resources/SampleDataDescription/SVAInputData.json" ) diff --git a/Modules/Scripted/Home/Home.py b/Modules/Scripted/Home/Home.py index 45fbc05..4ae24b2 100644 --- a/Modules/Scripted/Home/Home.py +++ b/Modules/Scripted/Home/Home.py @@ -57,10 +57,15 @@ def setup(self): self.tutorials = { "ShapeAnalysisModule": "https://bit.ly/2Fyn97v", # SPHARM-PDM Generator - "GroupWiseRegistrationModule": "https://bit.ly/2WsFiun", - "RegressionComputation": "http://bit.ly/2uVYche", + "RigidAlignmentModule": "https://bit.ly/2WsFiun", + "RegressionComputation": "https://bit.ly/2uVYche", "ShapeVariationAnalyzer": "https://bit.ly/2HYbHVA", # Population Analysis - "SkeletalRepresentationVisualizer": "http://bit.ly/2UKKgW2" + "SRep": "https://bit.ly/3sTEG3H", + "SRepCreator": "https://bit.ly/3sTEG3H", + "SRepRefinement": "https://bit.ly/3sTEG3H", + "SRepHypothesisTesting": "http://bit.ly/3Y94DLt", + "CrownSegmentation": "https://bit.ly/3pYgKKy", + "SlicerDWD": "https://bit.ly/3CVx46d", } # The anchor associated with each link corresponds to the name of the module to select. @@ -75,7 +80,7 @@ def setup(self):   1. Use the Data importer module to load your segmentations from FreeSurf, FSL, Autoseg, or a bunch of vtp's

  2. Use Shape Population Viewer to do a quality check on the imported data

  3. Use SPHARM-PDM Generator to do spherical harmonics based analysis

-  4. Use the Study-specific Shape Analysis module.

+  4. Use the Study-specific Shape Analysis module.

  5. Use the S-Rep Shape Analysis module to do shape analysis via skeletal representations.

  6. Use the Shape Evaluator module to compute a mean shape and see how the population varies.

  7. Use Shape Regressions module to do regression based analysis.

@@ -95,12 +100,14 @@ def setup(self): # SAMPLE DATA REGISTRATION for json_file in [ 'DataImporterInputData.json', + 'CrownSegmentation.json', 'MFSDAInputData.json', - 'ShapeRegressionInputData.json', - 'SPHARM-PDMTestData.json', 'SPHARM-PDMFiducials.json', - 'SRepInitializerData.json', - 'SVAInputData.json' + 'SPHARM-PDMTestData.json', + 'SRepCreatorData.json', + 'SVAInputData.json', + 'ShapeRegressionInputData.json', + 'SlicerDWDInputData.json', ]: with open(self.resourcePath('SampleDataDescription/%s' % json_file), 'r') as json_data: source_data = json.load(json_data) @@ -129,11 +136,14 @@ def setup(self): self.moduleNameToSampleDataCategory = { "DataImporter": "Data Importer", + "CrownSegmentation": "Crown Segmentation - FiboSeg", "MFSDA": "Covariate Significance Testing", "ShapeAnalysisModule": "SPHARM-PDM", "RegressionComputation": "Shape Regression", "ShapeVariationAnalyzer": "Population Analysis", - "SkeletalRepresentationInitializer": "Skeletal Representation Initializer" + "SRepCreator": "Skeletal Representation Creator", + "SlicerDWD": "DWD Shape Analysis", + "SRepHypothesisTesting": "SRep Hypothesis Testing" } self.sampleDataModuleTab = self.addSampleDataTab() @@ -209,6 +219,22 @@ def downloadSampleDataInFolder(source): slicer.modules.MFSDAWidget.lineEdit_csv.currentPath = os.path.join(destFolderPath,'inputFiles.csv') slicer.modules.MFSDAWidget.lineEdit_pshape.currentPath = os.path.join(destFolderPath,'g01','bump00.vtk') slicer.modules.MFSDAWidget.lineEdit_output.directory = os.path.join(destFolderPath,'out') + # CrownSegmentation is only available on some platforms right now + elif hasattr(slicer.moduleNames, "CrownSegmentation") and currModule == slicer.moduleNames.CrownSegmentation: + slicer.modules.CrownSegmentationWidget.ui.surfaceLineEdit.text = os.path.join(destFolderPath,'scan36.vtk') + slicer.modules.CrownSegmentationWidget.ui.modelLineEdit.text = os.path.join(destFolderPath, '07-21-22_val-loss0.169.pth') + outDir = os.path.join(destFolderPath,'out') + if not os.path.isdir(outDir): + os.mkdir(outDir) + slicer.modules.CrownSegmentationWidget.ui.outputLineEdit.text = outDir + slicer.modules.CrownSegmentationWidget.ui.outputFileLineEdit.text = 'output.vtk' + elif currModule == slicer.moduleNames.SlicerDWD: + slicer.modules.SlicerDWDWidget.ui.pathTrain.currentPath = os.path.join(destFolderPath, 'inputFiles.csv') + slicer.modules.SlicerDWDWidget.ui.pathMetrics.currentPath = os.path.join(destFolderPath, 'extraMetrics.csv') + slicer.modules.SlicerDWDWidget.ui.pathResults.currentPath = os.path.join(destFolderPath, 'testResults.csv') + elif currModule == slicer.moduleNames.SRepHypothesisTesting: + slicer.modules.SRepHypothesisTestingWidget.ui.inputCSV.currentPath = os.path.join(destFolderPath, 'input.csv') + slicer.modules.SRepHypothesisTestingWidget.ui.outputDirectory.directory = os.path.join(destFolderPath,'out') @staticmethod def addSampleDataTab(): diff --git a/Modules/Scripted/Home/Resources/SampleDataDescription/CrownSegmentation.json b/Modules/Scripted/Home/Resources/SampleDataDescription/CrownSegmentation.json new file mode 100644 index 0000000..57b3f9e --- /dev/null +++ b/Modules/Scripted/Home/Resources/SampleDataDescription/CrownSegmentation.json @@ -0,0 +1,16 @@ +{ + "category": "Crown Segmentation - FiboSeg", + "sampleName": "Download sample data", + "fileNames": [ + "07-21-22_val-loss0.169.pth", + "scan36.vtk" + ], + "uris": [ + "https://data.kitware.com/api/v1/file/hashsum/sha512/4943f46bb122b18591e27986e79e458e3ce264d4b5191add0595d111cf3e90cc794afe5deb472fbce26c7e456197e9dcb44af3804c02a35403de6a40f7bc56c0/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/d4a2aa9da98bd2e29433ff40d7d5dfff273b7dc302fa954184d2a5e1d5e52413235f1143116555aec7b59200195ba8b7561b4719b4dea970dbed74885f07aabe/download" + ], + "checksums": [ + "SHA512:4943f46bb122b18591e27986e79e458e3ce264d4b5191add0595d111cf3e90cc794afe5deb472fbce26c7e456197e9dcb44af3804c02a35403de6a40f7bc56c0", + "SHA512:d4a2aa9da98bd2e29433ff40d7d5dfff273b7dc302fa954184d2a5e1d5e52413235f1143116555aec7b59200195ba8b7561b4719b4dea970dbed74885f07aabe" + ] +} \ No newline at end of file diff --git a/Modules/Scripted/Home/Resources/SampleDataDescription/SRepInitializerData.json b/Modules/Scripted/Home/Resources/SampleDataDescription/SRepCreatorData.json similarity index 89% rename from Modules/Scripted/Home/Resources/SampleDataDescription/SRepInitializerData.json rename to Modules/Scripted/Home/Resources/SampleDataDescription/SRepCreatorData.json index 1d9fadd..efd7d38 100644 --- a/Modules/Scripted/Home/Resources/SampleDataDescription/SRepInitializerData.json +++ b/Modules/Scripted/Home/Resources/SampleDataDescription/SRepCreatorData.json @@ -1,5 +1,5 @@ { - "category": "Skeletal Representation Initializer", + "category": "Skeletal Representation Creator", "sampleName": "Download sample data", "fileNames": [ "sample.vtk" @@ -10,4 +10,4 @@ "checksums": [ "SHA512:8b70ab1d2f83b1e079a91b985825f2d21ab416b0d0099570fd621f34ad489a9afb8e823d55a17f7cc13a8c6d34b96531377c1dcbb01c63c659300b7c9f8efe6f" ] -} \ No newline at end of file +} diff --git a/Modules/Scripted/Home/Resources/SampleDataDescription/SRepHypothesisTestingData.json b/Modules/Scripted/Home/Resources/SampleDataDescription/SRepHypothesisTestingData.json new file mode 100644 index 0000000..9bf300f --- /dev/null +++ b/Modules/Scripted/Home/Resources/SampleDataDescription/SRepHypothesisTestingData.json @@ -0,0 +1,46 @@ +{ + "category": "SRep Hypothesis Testing", + "sampleName": "Download sample data", + "fileNames": [ + "setup.py", + "input_absolute.csv", + "bent_srep_0.srep.json", + "bent_srep_1.srep.json", + "bent_srep_2.srep.json", + "bent_srep_3.srep.json", + "bent_srep_4.srep.json", + "unbent_srep_0.srep.json", + "unbent_srep_1.srep.json", + "unbent_srep_2.srep.json", + "unbent_srep_3.srep.json", + "unbent_srep_4.srep.json" + ], + "uris": [ + "https://data.kitware.com/api/v1/file/hashsum/sha512/4ec8bd693f81723e616af76fa9e1a965d54ec78291c973e8be47fd0194140ed30630198e511cb18c037c29644c7ae1f149015c58a1e374f2ae3a24f0596f7529/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/6a5af91728942f3dad0e7dca25caa07b03f4050f98a13eac731fb730ea024ae6f533262b0d647a1a9e244c6637271e14477bd6244efe0e43759eb3c93d3226c9/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/e83daf54d432d110c6e7477078f232da0002dcb6edb18ae5fbc1dbadc14f9f50c9c62de7c34669bae29b324952372663660eeab50a500f0aa33c21e84d2ce67c/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/d9425354a1edbd106eb6fb23407b008869f00eceabac4b317c5006f4b646ab1a50f55b5406cb47577f2903ba7e3b4cced31a463d03f419590c29fb167fce42a7/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/209f1fbbc41072c69e976514107c28fd0c321a56ffcd07222d335b82c250d62759e1b20fdbbcc294aede80626fca0bd3a5ec02262b2b27effa88af0ed86732ac/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/8cbf2aebf78b28d825766d01f029eab3ad7f74dad75eff381a49479333b5ed80d2f252db0af9720f624e91fdf615d138c62d82fa88b2ad63e1ff5a203449de2b/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/23713bb1bb38818ec2a2a437315d05b933e0e572f360ebc6b1491a35774f19a271406aa65d2566611feb9067c78934e0c6a0f118f6b117309d5e0ad0c6b9f559/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/82aa261f94af1972deea275105b5c0d6dce1fe8cae144acf40752c3621b7423202c7f13edde0e4678b3e2f73a00265a1a4409d0378abc70fdf5bff9280ad2481/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/d1687cf218693ebfe1d6cae39b2b10c26d23c5b7115d457d1913e5ca9b8c21b8308619f38b877f205f0e9acd738b41948c95816c1ef2d419a96b7395affa45a2/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/3814395e1bb846f2603cb88e5fddf96b91e37fe25fd04dbda6b1d40d0430a2996dc7457b8c49cc70b9a327073bae722556d0bb8ed5f2a0546c13eb813d66b741/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/76536b470d6019cd2673f80fbdeefb41ee920fd1cd6b9ebcf92a655aba9e8e86b0b7f4e3c3f10d1f6444ea93b834cbda9412121eaedbd0228a3820b38bdf3640/download", + "https://data.kitware.com/api/v1/file/hashsum/sha512/80fe628473dd0d829ff03404c0464202e6e9db34b528f7be4cfff2404ba9e744c151dab22576fed72a4f9e1978601520a65f67fb76f120672ee237e57d790e65/download" + ], + "checksums": [ + "SHA512:4ec8bd693f81723e616af76fa9e1a965d54ec78291c973e8be47fd0194140ed30630198e511cb18c037c29644c7ae1f149015c58a1e374f2ae3a24f0596f7529", + "SHA512:6a5af91728942f3dad0e7dca25caa07b03f4050f98a13eac731fb730ea024ae6f533262b0d647a1a9e244c6637271e14477bd6244efe0e43759eb3c93d3226c9", + "SHA512:e83daf54d432d110c6e7477078f232da0002dcb6edb18ae5fbc1dbadc14f9f50c9c62de7c34669bae29b324952372663660eeab50a500f0aa33c21e84d2ce67c", + "SHA512:d9425354a1edbd106eb6fb23407b008869f00eceabac4b317c5006f4b646ab1a50f55b5406cb47577f2903ba7e3b4cced31a463d03f419590c29fb167fce42a7", + "SHA512:209f1fbbc41072c69e976514107c28fd0c321a56ffcd07222d335b82c250d62759e1b20fdbbcc294aede80626fca0bd3a5ec02262b2b27effa88af0ed86732ac", + "SHA512:8cbf2aebf78b28d825766d01f029eab3ad7f74dad75eff381a49479333b5ed80d2f252db0af9720f624e91fdf615d138c62d82fa88b2ad63e1ff5a203449de2b", + "SHA512:23713bb1bb38818ec2a2a437315d05b933e0e572f360ebc6b1491a35774f19a271406aa65d2566611feb9067c78934e0c6a0f118f6b117309d5e0ad0c6b9f559", + "SHA512:82aa261f94af1972deea275105b5c0d6dce1fe8cae144acf40752c3621b7423202c7f13edde0e4678b3e2f73a00265a1a4409d0378abc70fdf5bff9280ad2481", + "SHA512:d1687cf218693ebfe1d6cae39b2b10c26d23c5b7115d457d1913e5ca9b8c21b8308619f38b877f205f0e9acd738b41948c95816c1ef2d419a96b7395affa45a2", + "SHA512:3814395e1bb846f2603cb88e5fddf96b91e37fe25fd04dbda6b1d40d0430a2996dc7457b8c49cc70b9a327073bae722556d0bb8ed5f2a0546c13eb813d66b741", + "SHA512:76536b470d6019cd2673f80fbdeefb41ee920fd1cd6b9ebcf92a655aba9e8e86b0b7f4e3c3f10d1f6444ea93b834cbda9412121eaedbd0228a3820b38bdf3640", + "SHA512:80fe628473dd0d829ff03404c0464202e6e9db34b528f7be4cfff2404ba9e744c151dab22576fed72a4f9e1978601520a65f67fb76f120672ee237e57d790e65" + ] +} diff --git a/Modules/Scripted/Home/Resources/SampleDataDescription/SlicerDWDInputData.json b/Modules/Scripted/Home/Resources/SampleDataDescription/SlicerDWDInputData.json new file mode 100644 index 0000000..79e3dcc --- /dev/null +++ b/Modules/Scripted/Home/Resources/SampleDataDescription/SlicerDWDInputData.json @@ -0,0 +1,16 @@ +{ + "category": "DWD Shape Analysis", + "sampleName": "Download sample data", + "fileNames": [ + "DWDSampleData.zip", + "setup.py" + ], + "uris": [ +"https://data.kitware.com/api/v1/file/hashsum/sha512/5e33ebc31feb30ed11b4461dfcee68934943bc97b43d31c1044030bdf8a9d7a7ce6c1172e3bd2bf5963b132eceed56a90c71b5c73436583f537f0466a59c8001/download", +"https://data.kitware.com/api/v1/file/hashsum/sha512/34952cb8d1d9101624260142b33e5d2a9b170ea8df1800609acc4cd02826133dd55405b0215b7d35aad728e0bbb83911030fc136fa5b1e311612f05cf8422871/download" + ], + "checksums": [ + "SHA512:5e33ebc31feb30ed11b4461dfcee68934943bc97b43d31c1044030bdf8a9d7a7ce6c1172e3bd2bf5963b132eceed56a90c71b5c73436583f537f0466a59c8001", + "SHA512:34952cb8d1d9101624260142b33e5d2a9b170ea8df1800609acc4cd02826133dd55405b0215b7d35aad728e0bbb83911030fc136fa5b1e311612f05cf8422871" + ] +} diff --git a/Modules/Scripted/ShapeAnalysisToolBox/DataImporter.py b/Modules/Scripted/ShapeAnalysisToolBox/DataImporter.py index a2681aa..6bdbe4d 100644 --- a/Modules/Scripted/ShapeAnalysisToolBox/DataImporter.py +++ b/Modules/Scripted/ShapeAnalysisToolBox/DataImporter.py @@ -147,7 +147,7 @@ def importLabelMap(self, path): """ directory, fileName = os.path.split(path) - labelMapNode = slicer.util.loadLabelVolume(path, returnNode=True)[1] + labelMapNode = slicer.util.loadLabelVolume(path) if labelMapNode is None: logging.error('Failed to load ' + fileName + 'as a labelmap') # make sure each one is a labelmap @@ -236,7 +236,7 @@ def importLabelMap(self, path): logging.warning('LabelMap in path: {} has not been loaded into segmentationDict.'.format(path)) return False - # Add to the dicts only if succesful + # Add to the dicts only if successful if self.freesurfer_import == True: subject_name = os.path.split(os.path.split(directory)[0])[1] file_name = os.path.splitext(fileName)[0] @@ -260,7 +260,7 @@ def importModel(self, path): Populate segmentationDict and set labelRangeInCohort to (0,1) """ directory, fileName = os.path.split(path) - modelNode = slicer.util.loadModel(path, returnNode=True)[1] + modelNode = slicer.util.loadModel(path) if modelNode is None: logging.error('Failed to load ' + fileName + 'as a model') @@ -288,7 +288,7 @@ def importModel(self, path): logging.warning('Model in path: {} has not been loaded into segmentationDict.'.format(path)) return False - # Add to the dicts only if succesful + # Add to the dicts only if successful self.modelDict[fileName] = modelNode self.segmentationDict[fileName] = segmentationNode self.labelRangeInCohort = labelRange @@ -302,7 +302,7 @@ def importSegmentation(self, path): """ directory, fileName = os.path.split(path) - segmentationNode = slicer.util.loadSegmentation(path, returnNode=True)[1] + segmentationNode = slicer.util.loadSegmentation(path) if segmentationNode is None: logging.error('Failed to load ' + fileName + 'as a segmentation') return False @@ -314,7 +314,7 @@ def importSegmentation(self, path): logging.warning('Segmentation in path: {} has not been loaded into segmentationDict.'.format(path)) return False - # Add to the dicts only if succesful + # Add to the dicts only if successful self.segmentationDict[fileName] = segmentationNode self.labelRangeInCohort = labelRange return True @@ -346,7 +346,7 @@ def filePathsFromCSVFile(self, csvFileName): def importFiles(self, filePaths): """ - Call the appropiate import function from a heteregeneous list of file paths. + Call the appropriate import function from a heteregeneous list of file paths. Raises TypeError if not existent file or unhandled filetype by this module. Files with a different number of labels/segments than the first one loaded are ignored with a warning. Return true if success, raise error otherwise. @@ -501,8 +501,9 @@ def populateTopologyDictionary(self): # 0 label is assumed to be the background. XXX Pablo: assumed where? if segmentName == "0": continue - polydata = segmentationNode.GetClosedSurfaceRepresentation(segmentId) - if polydata is None: + polydata = vtk.vtkPolyData() + success = segmentationNode.GetClosedSurfaceRepresentation(segmentId,polydata) + if not success: logging.warning('Ignoring segment id ' + segmentName + ' for case: ' + nodeName) continue @@ -657,7 +658,7 @@ def getFreeSurferAvailableSegmentIds(self, template_path): label_ids = [] directory, fileName = os.path.split(template_path) - labelMapNode = slicer.util.loadLabelVolume(template_path, returnNode=True)[1] + labelMapNode = slicer.util.loadLabelVolume(template_path) labelMapNode.SetDisplayVisibility(False) if labelMapNode is None: @@ -1093,7 +1094,7 @@ def populateSubjectsTable(self): POST: Populate SubjectTable with the names of the files """ if not self.logic.topologyDict: - logging.error("Trying to populateSubjectsTable with non existant topologyDict.") + logging.error("Trying to populateSubjectsTable with non existent topologyDict.") return self.TemplateButtonLookup = {} @@ -1170,7 +1171,7 @@ def populateSegmentsTable(self, nameKey): POST: Populates SegmentsTable (appending) for given name. """ if not self.logic.topologyDict: - logging.error("Trying to populateSegmentsTable with non existant topologyDict.") + logging.error("Trying to populateSegmentsTable with non existent topologyDict.") return if not nameKey in self.logic.topologyDict: logging.error("Input nameKey: {} does not exist in topologyDict.".format(nameKey)) @@ -1178,7 +1179,7 @@ def populateSegmentsTable(self, nameKey): # Required to safely populate table when sorting is enabled, restored later. self.SegmentsTableWidget.setSortingEnabled(False) - # Block signals while populating programatically + # Block signals while populating programmatically self.SegmentsTableWidget.blockSignals(True) self.SegmentsTableWidget.hide() @@ -1227,7 +1228,7 @@ def populateSegmentsMultiTable(self, nameKey): """ ### TODO: Merge both populateSegmentsXTable to avoid repetition. if not self.logic.topologyDict: - logging.error("Trying to populateSegmentsMultiTable with non existant topologyDict.") + logging.error("Trying to populateSegmentsMultiTable with non existent topologyDict.") return if not nameKey in self.logic.topologyDict: logging.error("Input nameKey: {} does not exist in topologyDict.".format(nameKey)) @@ -1236,7 +1237,7 @@ def populateSegmentsMultiTable(self, nameKey): # Required to safely populate table when sorting is enabled, restored later. self.SegmentsTableWidget.setSortingEnabled(False) - # Block signals while populating programatically + # Block signals while populating programmatically self.SegmentsTableWidget.blockSignals(True) self.SegmentsTableWidget.hide() @@ -1423,7 +1424,7 @@ def resetCSVTab(self): self.InputCSVFileNameLineEdit.text = '' def resetDirectoryTab(self): - # reset directroy tab + # reset directory tab self.inputPath = '' self.FolderDirectoryButton.blockSignals(True) self.FolderDirectoryButton.directory = '/' @@ -1524,7 +1525,7 @@ def onFreeSurferHomeDirectoryChanged(self, freesurfer_home_path): self.freesurfer_home_path = freesurfer_home_path self.InputFreeSurferHomeFolderNameLineEdit.text = freesurfer_home_path - #init the correspondance labels->segment names dict + #init the correspondence labels->segment names dict self.logic.initFreeSurferLUT(LUT_path) def onFreeSurferSubjectsDirectoryChanged(self, freesurfer_subjects_path): @@ -1534,7 +1535,7 @@ def onFreeSurferSubjectsDirectoryChanged(self, freesurfer_subjects_path): that can be used in this module. """ logging.debug("onFreeSurferSubjectsDirectoryChanged: {}".format(freesurfer_subjects_path)) - # Check directory existance + # Check directory existence directory = qt.QDir(freesurfer_subjects_path) if not directory.exists(): logging.error("Directory {} does not exist.".format(directory)) @@ -1796,7 +1797,7 @@ def center3dView(self): threeDView.resetFocalPoint() def setVisibilitySegmentations(self, visibility): - """ visiblity boolean """ + """ visibility boolean """ nodes = [node for node in self.logic.segmentationDict.values()] for node in nodes: displayNode = node.GetDisplayNode() @@ -1893,7 +1894,7 @@ def setUp(self): 'sample_model.vtk', ) - # create dir if non-existant + # create dir if non-existent if not os.path.isdir(self.testDir): os.mkdir(self.testDir) diff --git a/Modules/Scripted/ShapeAnalysisToolBox/Resources/DataImporter.ui b/Modules/Scripted/ShapeAnalysisToolBox/Resources/DataImporter.ui index a3d3a1e..8a8b452 100755 --- a/Modules/Scripted/ShapeAnalysisToolBox/Resources/DataImporter.ui +++ b/Modules/Scripted/ShapeAnalysisToolBox/Resources/DataImporter.ui @@ -542,7 +542,7 @@ <html><head/><body><p>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Display the selection made on Subjects and Segment tables.&lt;/p&gt;&lt;p&gt;You can use the key shift for multi-selection.&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</p></body></html> - Generate Shape Analysis Stucture + Generate Shape Analysis Structure diff --git a/README.md b/README.md index abb1421..1814b7b 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,29 @@ +SlicerSALT +---------- - - - -Introduction ------------- -SlicerSALT is an open-source, free comprehensive software that will allow biomedical scientists to precisely locate shape changes in their imaging studies. This software called Slicer Shape AnaLysis Toolbox (SlicerSALT), will enhance the intuitiveness and ease of use for such studies, as well as allow researchers to find shape changes with higher statistical power. Altogether this constitutes a crucial resource for the imaging field that will enable many and important new findings in biomedical imaging studies. - -Prerequisites -------------- -* [Slicer Prerequisites] -* [Fortran Compiler] - -Checkout --------- -* Register [Github Access]() to create an account -* Create SSH keys associated to your account: [SSH Key Generation Instructions]. - * Recommended: keep the passphrase empty for your SSH key to let the Superbuild work without interruptions -* Add the SSH key to your Github account: [Steps to add SSH Key to Github]. -* Clone the repository and follow platform specific instructions below: - - $ git clone git://github.com/Kitware/slicerSALT.git - -Build ------ - -Make sure that you can compile Slicer OR have the Prerequisites for Slicer: [Slicer Build Instructions]. - -### Windows - -Tested Development environment: [Slicer Windows Dev Environment]. - -1. Run CMake (cmake-gui) from the Windows Start Menu - * Set the build directory `C:\slicerSALT-Debug` or `C:\slicerSALT-Release` - * Select your compiler: Visual Studio 14 2015 Win64 - * If using a newer version of Visual Studio, be sure to specify the 2015 toolset (v140) - * Configure using default options. You may get a configuration error that `QT_QMAKE_EXECUTABLE` is not set, which is normal. - * Verify that `QT_QMAKE_EXECUTABLE` is set to the QT version that was used to compile Slicer - * Click generate the close cmake-gui -2. Build (be prepared to wait for some hours!) - * Open the top-level slicerSALT.sln in the build directory - * If you're trying to build Release mode, make sure to set the active configuration to Release - * Build Solution! -3. slicerSALT executable lives in `path/to/slicerSALT-build/S-bld/Slicer-build/` +SlicerSALT is an open-source, free comprehensive software that will allow biomedical scientists to precisely locate shape changes in their imaging studies. -### Unix-like +

+ SlicerSALT banner +

-***MacOSX Note:*** Beginning XCode 7 support for OpenMP has been removed. So if you're using XCode 7 or above OpenMP will be bypassed during build process. +This software called Slicer Shape AnaLysis Toolbox (SlicerSALT), will enhance the intuitiveness and ease of use for such studies, as well as allow researchers to find shape changes with higher statistical power. Altogether this constitutes a crucial resource for the imaging field that will enable many and important new findings in biomedical imaging studies. - $ mkdir slicerSALT-build - $ cd slicerSALT-build -1. Configure CMake - * $ ccmake ../slicerSALT - * Point CMake to the QT version that was used to compile Slicer - * ___MacOSX:___ Set variable CMAKE_OSX_DEPLOYMENT_TARGET to 10.9 (Mavericks) / 10.10 (Yosemite) / 10.11 (El Capitan) -2. Build (be prepared to wait for some hours!) +## Maintainers - $ make -j4 -3. slicerSALT executable lives in `path/to/slicerSALT-build/S-bld/Slicer-build/` +* [Contributing](CONTRIBUTING.md) +* [Building](BUILD.md) -Contribute ----------- -See [CONTRIBUTING.md][] for instructions to contribute. -[CONTRIBUTING.md]: CONTRIBUTING.md +## Resources -Package -------- +To learn more about SlicerSALT and Slicer, check out the following resources. + - https://salt.slicer.org/ + - https://slicer.readthedocs.io/ -Resources ---------- -* [3D Slicer Developer Wiki](http://wiki.slicer.org/slicerWiki/index.php/Documentation/Nightly/Developers) +## License -[Fork the slicerSALT Repository]: https://help.github.com/articles/fork-a-repo/ -[Slicer Coding and Commit Style Guide]: https://www.slicer.org/wiki/Documentation/Nightly/Developers/Style_Guide -[Slicer Prerequisites]: https://www.slicer.org/wiki/Documentation/Nightly/Developers/Build_Instructions#PREREQUISITES -[Fortran Compiler]: https://www.slicer.org/wiki/Documentation/Nightly/Developers/Fortran -[Slicer Build Instructions]: https://www.slicer.org/slicerWiki/index.php/Documentation/Nightly/Developers/Build_Instructions -[SSH Key Generation Instructions]: https://gitlab.kitware.com/help/ssh/README -[Steps to add SSH Key to Github]: https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/ -[Slicer Windows Dev Environment]: https://www.slicer.org/wiki/Documentation/Nightly/Developers/Build_Instructions#Windows +This software is licensed under the terms of the [BSD 3-Clause](LICENSE). diff --git a/SuperBuild/mfsda-requirements.txt b/SuperBuild/mfsda-requirements.txt index 573bab7..236b3d7 100644 --- a/SuperBuild/mfsda-requirements.txt +++ b/SuperBuild/mfsda-requirements.txt @@ -1,2 +1,2 @@ -pandas==0.24.2 -statsmodels==0.9.0 +pandas==1.4.2 +statsmodels==0.13.2