Skip to content
Commits on Source (2)
......@@ -8,7 +8,7 @@ project (plastimatch)
## The version here should be equal to the "most recent release"
set (PLM_VERSION_MAJOR "1")
set (PLM_VERSION_MINOR "7")
set (PLM_VERSION_PATCH "3")
set (PLM_VERSION_PATCH "4")
##-----------------------------------------------------------------------------
## Set up CMake defaults
......@@ -556,47 +556,6 @@ if (ITK_FOUND)
include (HandleVXL)
endif ()
##-----------------------------------------------------------------------------
## GDCM
##-----------------------------------------------------------------------------
if (NOT DCMTK_FOUND AND ITK_FOUND)
# The default case is that ITK_USE_SYSTEM_GDCM was used,
# the gdcm use file was already loaded from UseITK.cmake, and therefore
# GDCM_VERSION is already known. If this is not the case, we look
# in the ITK build dir for the header file which contains the version.
if (NOT GDCM_VERSION)
unset (GDCM_CONFIGURE_H CACHE)
find_file (GDCM_CONFIGURE_H gdcmConfigure.h PATHS ${ITK_INCLUDE_DIRS})
if (GDCM_CONFIGURE_H)
file (STRINGS "${GDCM_CONFIGURE_H}"
GDCM_VERSION
REGEX "^#define GDCM_VERSION *\"([^\"]*)\"")
string (REGEX REPLACE "[^\"]*\"([^\"]*)\".*" "\\1"
GDCM_VERSION "${GDCM_VERSION}")
endif ()
# When GDCM config file does not configure correctly, the value of
# the version might be "@GDCM_VERSION@".
if ("${GDCM_VERSION}" STREQUAL "\@GDCM_VERSION@")
set (GDCM_VERSION "2.0")
endif ()
set (GDCM_FOUND 1)
endif ()
if (GDCM_VERSION)
message (STATUS "GDCM version ${GDCM_VERSION} found")
else ()
message (FATAL_ERROR "Found ITK, but didn't find GDCM")
endif ()
if (GDCM_VERSION VERSION_LESS "2.0")
set (GDCM_VERSION_1 1)
else ()
set (GDCM_VERSION_2 1)
endif ()
else ()
# No itk? Use dcmtk instead
endif ()
##-----------------------------------------------------------------------------
## QT
##-----------------------------------------------------------------------------
......@@ -690,7 +649,19 @@ add_subdirectory (src)
if (ITK_FOUND)
set (DLL_PATTERNS "ITKCommon*.dll" "ITKIO*.dll" "ITKOptimizers*.dll" "ITKStatistics*.dll" "ITKTransform*.dll")
foreach (p ${DLL_PATTERNS})
file (GLOB DLLFILES "${ITK_DIR}/bin/release/${p}")
# .../bin/release/*.dll for build tree, .../bin/*.dll for install tree
file (GLOB DLLFILES "${ITK_DLL_DIR}/${p}")
if (DLLFILES)
install (FILES ${DLLFILES} DESTINATION bin)
endif ()
endforeach ()
endif ()
if (DCMTK_FOUND)
set (DLL_PATTERNS "oflog.dll" "ofstd.dll" "dcmdata.dll")
foreach (p ${DLL_PATTERNS})
# .../bin/release/*.dll for build tree, .../bin/*.dll for install tree
file (GLOB DLLFILES "${DCMTK_DIR}/bin/release/${p}")
if (DLLFILES)
install (FILES ${DLLFILES} DESTINATION bin)
endif ()
......@@ -783,23 +754,15 @@ if (WIN32 AND NOT CYGWIN AND NOT MINGW)
set (PLM_PLASTIMATCH_TESTING_PATH
${PLM_BINARY_DIR}/Testing/Release)
set (PLM_FFTW_PATH ${FFTW_DIR})
# At some point in time (presumably around ITK 4.1), ITK stopped
# creating the variable ITK_LIBRARY_DIRS. Therefore, we have to
# use another method to find the ITK directory needed to run tests.
if (NOT ITK_FOUND)
set (PLM_ITK_LIBRARY_PATH_HACK
-DITK_LIBRARY_PATH=${PLM_BINARY_DIR}/ITK-build/bin/Release)
elseif (${ITK_VERSION} VERSION_LESS "4.1")
set (PLM_ITK_LIBRARY_PATH_HACK
-DITK_LIBRARY_PATH=${ITK_LIBRARY_DIRS}/Release)
if (NOT "${ITK_DLL_DIR}" STREQUAL "")
set (PLM_ITK_LIBRARY_PATH_HACK -DITK_LIBRARY_PATH=${ITK_DLL_DIR})
else ()
string (REGEX REPLACE "/[^/]*$" "" ITK_LIBRARY_DIRS_41
"${ITK_CONFIG_TARGETS_FILE}")
set (PLM_ITK_LIBRARY_PATH_HACK
-DITK_LIBRARY_PATH=${ITK_LIBRARY_DIRS_41}/bin/Release)
set (PLM_ITK_LIBRARY_PATH_HACK "")
endif ()
set (PLM_PLASTIMATCH_PATH_HACK
-DPLM_PLASTIMATCH_PATH=${PLM_PLASTIMATCH_PATH})
set (PLM_DCMTK_PATH_HACK -DPLM_DCMTK_PATH=${DCMTK_DIR}/bin/Release)
set (PLM_FFTW_PATH_HACK
-DPLM_FFTW_PATH=${PLM_FFTW_PATH})
else ()
......@@ -808,6 +771,7 @@ else ()
set (PLM_FFTW_PATH "${FFTW_DIR}")
set (PLM_ITK_LIBRARY_PATH_HACK "")
set (PLM_PLASTIMATCH_PATH_HACK "")
set (PLM_DCMTK_PATH_HACK "")
set (PLM_FFTW_PATH_HACK "")
endif ()
......@@ -825,6 +789,7 @@ macro (PLM_ADD_TEST PLM_TEST_NAME PLM_TEST_COMMAND PARMS)
-DPLM_TEST_NAME=${PLM_TEST_NAME}
${PLM_ITK_LIBRARY_PATH_HACK}
${PLM_PLASTIMATCH_PATH_HACK}
${PLM_DCMTK_PATH_HACK}
${PLM_FFTW_PATH_HACK}
-DPLM_TEST_COMMAND=${PLM_TEST_COMMAND}
-DPLM_TESTING_SOURCE_DIR=${PLM_TESTING_SOURCE_DIR}
......
This diff is collapsed.
......@@ -5,8 +5,6 @@ set (FFTW_FOUND @FFTW_FOUND@)
set (ITK_VERSION "@ITK_VERSION@")
set (OPENCL_FOUND @OPENCL_FOUND@)
set (PLM_DCM_USE_DCMTK "@PLM_DCM_USE_DCMTK@")
set (PLM_DCM_USE_GDCM1 "@PLM_DCM_USE_GDCM1@")
set (PLM_DCM_USE_GDCM2 "@PLM_DCM_USE_GDCM2@")
set (PLM_PLASTIMATCH_PATH "@PLM_PLASTIMATCH_PATH@")
set (PLM_PLASTIMATCH_PATH_HACK "@PLM_PLASTIMATCH_PATH_HACK@")
set (PLM_REDUCED_TESTS @PLM_REDUCED_TESTS@)
......@@ -305,57 +303,14 @@ if (NOT PLM_DCM_USE_DCMTK)
)
endif ()
## If we only have GDCM 2, don't run these tests
if (PLM_DCM_USE_GDCM2)
set (CTEST_CUSTOM_TESTS_IGNORE
${CTEST_CUSTOM_TESTS_IGNORE}
"plm-convert-dicom-donut-a"
"plm-convert-dicom-donut-a-stats"
"plm-convert-dicom-donut-a-check"
"plm-convert-dicom-donut-b"
"plm-convert-dicom-donut-b-stats"
"plm-convert-dicom-donut-b-check"
"plm-convert-dicom-a"
"plm-convert-dicom-a-stats"
"plm-convert-dicom-a-check"
"plm-convert-dicom-b"
"plm-convert-dicom-b-stats"
"plm-convert-dicom-b-check"
"plm-convert-dicom-c"
"plm-convert-dicom-c-stats"
"plm-convert-dicom-c-check"
"plm-convert-dicom-f"
"plm-convert-cxt"
"plm-convert-cxt-stats"
"plm-convert-cxt-check"
)
endif ()
## Dose calculation not yet supported on debian
## These tests are failing
if (PLM_CONFIG_DEBIAN_BUILD)
set (CTEST_CUSTOM_TESTS_IGNORE
${CTEST_CUSTOM_TESTS_IGNORE}
"proton-dose-1"
"proton-dose-1-stats"
"proton-dose-1-check"
"proton-dose-2"
"proton-dose-2-stats"
"proton-dose-2-check"
"proton-dose-3"
"proton-dose-3-stats"
"proton-dose-3-check"
"proton-dose-5a"
"proton-dose-5a-stats"
"proton-dose-5a-check"
"proton-dose-5d"
"proton-dose-5d-stats"
"proton-dose-5d-check"
"proton-dose-5g"
"proton-dose-5g-stats"
"proton-dose-5g-check"
"proton-dose-6a"
"proton-dose-6a-stats"
"proton-dose-6a-check"
"proton-dose-7a"
"proton-dose-8d"
"proton-dose-8d-stats"
"proton-dose-8d-check"
)
endif ()
......
[GLOBAL]
fixed=@PLM_BUILD_TESTING_DIR@/rect-2.mha
moving=@PLM_BUILD_TESTING_DIR@/rect-3.mha
vf_out=@PLM_BUILD_TESTING_DIR@/plm-bsp-rect-vf.mha
vf_out=@PLM_BUILD_TESTING_DIR@/plm-bsp-rect-vf.nrrd
xform_out=@PLM_BUILD_TESTING_DIR@/plm-bsp-rect-xf.txt
img_out=@PLM_BUILD_TESTING_DIR@/plm-bsp-rect-img.mha
......
[PLAN]
patient = @PLM_BUILD_TESTING_DIR@/rect-18.mha
dose_out = @PLM_BUILD_TESTING_DIR@/proton-dose4.mha
[BEAM]
flavor = h
homo_approx = n
depth_dose_z_max = 400
source = 0 -2200 0
isocenter = 0 0 0
aperture_origin = -37.5 -37.5
aperture_offset = 1500
aperture_spacing = 7.5 7.5
aperture_resolution = 10 10
range_compensator_file_in = @PLM_BUILD_TESTING_DIR@/rgc-1.mha
source_size = 0
[PEAK]
energy=100.0000
spread=1.000000
weight=1
[PLAN]
patient = @PLM_BUILD_TESTING_DIR@/rect-17.mha
target = @PLM_BUILD_TESTING_DIR@/ptv-1.mha
dose_out = @PLM_BUILD_TESTING_DIR@/@PLM_TEST_NAME@.mha
[BEAM]
flavor = a
homo_approx = n
beam_line = passive
source = 0 -2000 0
isocenter = 0 0 0
aperture_offset = 1500
aperture_origin = -75 -75
aperture_spacing = 3.75 3.75
aperture_resolution = 41 41
aperture_smearing = 5
source_size = 0
[PLAN]
patient = @PLM_BUILD_TESTING_DIR@/rect-17.mha
target = @PLM_BUILD_TESTING_DIR@/ptv-1.mha
dose_out = @PLM_BUILD_TESTING_DIR@/@PLM_TEST_NAME@.mha
[BEAM]
flavor = d
homo_approx = n
beam_line = passive
source = 0 -2000 0
isocenter = 0 0 0
aperture_offset = 1500
aperture_origin = -75 -75
aperture_spacing = 3.75 3.75
aperture_resolution = 41 41
aperture_smearing = 5
source_size = 0
......@@ -16,3 +16,5 @@ aperture_spacing = 3.75 3.75
aperture_resolution = 41 41
aperture_smearing = 5
source_size = 0
particle_number_out = @PLM_BUILD_TESTING_DIR@/@PLM_TEST_NAME@-pn.txt
[PLAN]
patient = @PLM_BUILD_TESTING_DIR@/rect-17.mha
dose_out = @PLM_BUILD_TESTING_DIR@/@PLM_TEST_NAME@.mha
[BEAM]
flavor = d
homo_approx = n
source = 0 -2000 0
isocenter = 0 0 0
aperture_offset = 1500
aperture_origin = -75 -75
aperture_spacing = 3.75 3.75
aperture_resolution = 41 41
aperture_smearing = 5
source_size = 0
particle_number_in = @PLM_BUILD_TESTING_DIR@/proton-dose-5d-pn.txt
##---------------------------------------------------------------------------
## See COPYRIGHT.TXT and LICENSE.TXT for copyright and license information
##---------------------------------------------------------------------------
include (CheckCXXSourceCompiles)
file (READ "${PLM_SOURCE_DIR}/cmake/check_dcmtk_ec_invalidvalue.cxx"
CHECK_DCMTK_EC_INVALIDVALUE_SOURCE)
push_vars (CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_LIBRARIES)
set (CMAKE_REQUIRED_INCLUDES ${DCMTK_INCLUDE_DIRS})
set (CMAKE_REQUIRED_LIBRARIES ${DCMTK_LIBRARIES})
check_cxx_source_compiles ("${CHECK_DCMTK_EC_INVALIDVALUE_SOURCE}"
DCMTK_HAS_EC_INVALIDVALUE)
pop_vars (CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_LIBRARIES)
......@@ -23,3 +23,8 @@ endif ()
# The DCMTK 3.6.2 DCMTKConfig.cmake seems to be broken on windows
string (REPLACE "DCMTK_INCLUDE_DIRS-NOTFOUND;" "" DCMTK_INCLUDE_DIRS
"${DCMTK_INCLUDE_DIRS}")
# Additional test for compatibility across DCMTK versions
if (DCMTK_FOUND)
include (CheckDCMTK)
endif ()
......@@ -44,3 +44,36 @@ else ()
"Fatal Error. ITK version should be either 3.X or 4.X")
endif ()
message (STATUS "ITK_VERSION = ${ITK_VERSION} found")
# Find ITK DLL directory. This is used on Windows for both regression testing and packaging.
if (NOT ITK_FOUND)
set (ITK_BASE "${PLM_BINARY_DIR}/ITK-build")
elseif (${ITK_VERSION} VERSION_LESS "4.1")
set (ITK_BASE "${ITK_LIBRARY_DIRS}")
else ()
# At some point in time (presumably around ITK 4.1), ITK stopped
# creating the variable ITK_LIBRARY_DIRS. Therefore, we infer from the
# configuration filename.
# Remove filename
string (REGEX REPLACE "/[^/]*$" "" ITK_LIBRARY_DIRS_41
"${ITK_CONFIG_TARGETS_FILE}")
# If configuring against installation directory, walk up to base directory
string (REGEX REPLACE "/lib/cmake/ITK-.*]*$" "" ITK_LIBRARY_DIRS_41
"${ITK_LIBRARY_DIRS_41}")
set (ITK_BASE "${ITK_LIBRARY_DIRS_41}")
endif ()
message (STATUS "ITK_BASE = ${ITK_BASE}")
if (NOT WIN32)
set (ITK_DLL_DIR "")
elseif (IS_DIRECTORY "${ITK_BASE}/bin/Release")
set (ITK_DLL_DIR "${ITK_BASE}/bin/Release")
elseif (IS_DIRECTORY "${ITK_BASE}/Release")
set (ITK_DLL_DIR "${ITK_BASE}/Release")
elseif (IS_DIRECTORY "${ITK_BASE}/bin")
set (ITK_DLL_DIR "${ITK_BASE}/bin")
else ()
set (ITK_DLL_DIR "")
endif ()
......@@ -3,7 +3,7 @@
## Apparently this is how to make the CMake script return status
## http://www.cmake.org/Wiki/CMake/C_Plugins_for_Loadable_Commands
set (ENV{PATH} "$ENV{PATH};${ITK_LIBRARY_PATH};${PLM_PLASTIMATCH_PATH};${PLM_FFTW_PATH}")
set (ENV{PATH} "$ENV{PATH};${ITK_LIBRARY_PATH};${PLM_PLASTIMATCH_PATH};${PLM_DCMTK_PATH};${PLM_FFTW_PATH}")
message ("PLM_TEST_COMMAND is ${PLM_TEST_COMMAND}")
message ("PARMS is ${PARMS}")
......
#include "dcmtk/dcmdata/dcerror.h"
int
main (void)
{
OFCondition o = EC_InvalidValue;
return 0;
}
******************************************************************************
DRR, WED, BSTV = beam specific target volume
DRR pro
-------
Drr uses command line options
DRR con
-------
Drr does not use IEC
Wed maintains an actual wed volume
Drr does not have programmable LUT
******************************************************************************
Dose calc notes #4
Deep dive (priority 1, n/a, no test)
------------------------------------
Plan_calc::compute_beam_dose
Beam_calc::prepare_for_calc
for each energy
compute_dose_{a,b,d}
Beam_calc::prepare_for_calc
Beam_calc::compute_beam_data_from_target
Beam_calc::compute_beam_modifiers_passive_scattering_b
Beam_calc::compute_beam_modifiers
Beam_calc::compute_target_wepl_min_max
Beam_calc::apply_smearing_to_target
Rt_mebs::set_prescription_depths
Rt_mebs::update_energies_from_prescription
Rpl_volume::apply_beam_modifiers
Beam_calc::compute_beam_data_from_prescription
Rt_mebs::optimize_sobp
Beam_calc::compute_beam_data_from_manual_peaks
Rt_mebs::generate_part_num_from_weight
// compute_beam_modifiers not re-run
Deep dive (priority 5, passive target, test 4d)
-----------------------------------------------
Plan_calc::compute_beam_dose
Beam_calc::prepare_for_calc
for each energy
compute_dose_{a,b,d}
Beam_calc::prepare_for_calc
Beam_calc::compute_beam_data_from_target
Beam_calc::compute_beam_modifiers_passive_scattering_b
Beam_calc::compute_beam_modifiers
Beam_calc::compute_target_wepl_min_max
Beam_calc::apply_smearing_to_target
Rt_mebs::set_prescription_depths
Rt_mebs::update_energies_from_prescription
Rpl_volume::apply_beam_modifiers
Beam_calc::compute_beam_data_from_prescription
Rt_mebs::optimize_sobp
Beam_calc::compute_beam_data_from_manual_peaks
Rt_mebs::generate_part_num_from_weight
// compute_beam_modifiers not re-run
******************************************************************************
Dose calc notes #3
Command file
------------
Overrides for any beam model parameter
Beam model
----------
Allowed energies (min/max/res or list)
Depth dose for each energy (analytic parameters or files)
Field size
Beamlet spacing
Beamline type
Allowed spot positions
Spot sigma
Source distance
Aperture distance
Flavor/homo approx/ray step
******************************************************************************
Dose calc notes #2
(A1) Aperture
(A2) Range compensator
(B1) Allowed energies (e.g. energy res)
(B2) Energy min/max
(B3) Energy weights (passive)
(C) Target
(D1) Spot map
(D2) Beamlet map
What combinations are acceptable?
D alone
D + A
C alone
C + A
C + B
B + A
B alone
To wit:
A is a modifier, can be added to anything
D defines B
C may be used to compute A and/or B through optimization
What about manually specified energy weights?
A possible strategy
1) Evaluate which items (A-E) need computed
2) Optimize (A,B) from (C)
3) Create MEBS structure
4) Optimize (D) from (A,B,C)
******************************************************************************
Dose calc notes
Rt_mebs
- add_peak()
- Create depth dose curve (ensuring all curves have same start/stop)
- Appends to depth_dose
- Appends to depth_dose_weight
- Appends to energies
- generate() seems to add together several pristine peaks, stored in
the depth_dose array, and put the results into e_lut and f_lut.
It is only used in the sobp_main() standalone.
- add_peak() is called from:
- Beam_calc::compute_default_beam()
- Rt_parms::append_peak() -- while interpreting [PEAK] sections
- Rt_mebs::optimize_sobp()
- Rt_mebs::load_beamlet_map()
- Rt_mebs::compute_particle_number_matrix_from_target_active()
Rt_depth_dose
- lookup_energy() gets an interpolated value from the lut
Overview of beam preparation tasks
- Beam_calc::prepare_for_calc
(1) Beam_calc::compute_beam_data_from_beamlet_map
- Rt_mebs::load_beamlet_map
(2) Beam_calc::compute_beam_data_from_spot_map
- Rt_mebs::set_from_spot_map
(3) Beam_calc::compute_beam_data_from_manual_peaks
- Beam_calc::compute_beam_modifiers_active_scanning
(4) Beam_calc::compute_beam_data_from_prescription
- Beam_calc::compute_beam_modifiers_active_scanning
(5) Beam_calc::compute_beam_data_from_target
(5a) Beam_calc::compute_beam_data_from_prescription
(5b) Beam_calc::compute_beam_modifiers_active_scanning
Beam_calc::compute_beam_modifiers_core
Rt_mebs::compute_particle_number_matrix_from_target_active
(6) Beam_calc::compute_default_beam
******************************************************************************
B-spline mismatch
......
......@@ -16,7 +16,7 @@ Conformance
Plastimatch 1.X series must conform to the C++03 standard.
Supported hosts:
Microsoft Windows 7 SP1 Visual Studio 2017
Microsoft Windows 7 SP1 Visual Studio 2015 (for CUDA 8)
Ubuntu 12.04 LTS gcc 4.6.3
Debian 8 "Jessie" gcc 4.9.2
CentOS 6 gcc 4.4.7
......@@ -29,7 +29,7 @@ features available in the stock compilers provided on
a fully-updated install of the supported platforms.
Supported hosts:
Microsoft Windows 7 SP1 Visual Studio 2017
Microsoft Windows 7 SP1 Visual Studio 2015 (for CUDA 8)
Ubuntu 14.04 gcc 4.8.4; clang 3.4
Debian 9 "Stretch" gcc 6.3.0; clang 3.8.1
CentOS 7 gcc 4.8.5
......@@ -52,9 +52,8 @@ clearly identified, so that no mistake in licensing occurs.
Indentation
-----------
Indentation should be 4 spaces. Tabs are allowed, but you must set
your tab stop to 8 spaces. Note that this is not the default
for Microsoft Visual Studio compilers, so you should adjust your setting.
Indentation should be 4 spaces. Tabs are not allowed.
For Microsoft Visual Studio compilers, you should adjust your setting.
Line breaking
-------------
......@@ -122,11 +121,10 @@ Declaritors and return values go on a separate line (GNU style):
foo (int bar)
{
Use explicit "void" in the argument list if there are no arguments
is optional:
Explicit "void" in the argument list is discouraged::
void
foo (void)
foo () // rather than foo (void)
{
Horizontal whitespace
......@@ -144,6 +142,11 @@ When there are no arguments, you may omit the space:
foo();
When the return value is used with member reference, omitting space
is preferred::
foo(bar,baz)->boo().fuz
Pointers and references
-----------------------
As per linux kernel style, put the '*' adjacent to the data name or
......
.\" Man page generated from reStructuredText.
.
.TH "DRR" "1" "Jul 09, 2018" "Plastimatch 1.7.3" "Plastimatch"
.TH "DRR" "1" "Jan 08, 2019" "Plastimatch 1.7.4" "Plastimatch"
.SH NAME
drr \- create a digitally reconstructed radiograph
.
......
.\" Man page generated from reStructuredText.
.
.TH "FDK" "1" "Jul 09, 2018" "Plastimatch 1.7.3" "Plastimatch"
.TH "FDK" "1" "Jan 08, 2019" "Plastimatch 1.7.4" "Plastimatch"
.SH NAME
fdk \- cone-beam reconstruction from projections using the FDK algorithm
.
......
.\" Man page generated from reStructuredText.
.
.TH "LANDMARK_WARP" "1" "Jul 09, 2018" "Plastimatch 1.7.3" "Plastimatch"
.TH "LANDMARK_WARP" "1" "Jan 08, 2019" "Plastimatch 1.7.4" "Plastimatch"
.SH NAME
landmark_warp \- warp an image using point landmarks
.
......
.\" Man page generated from reStructuredText.
.
.TH "PLASTIMATCH" "1" "Jul 09, 2018" "Plastimatch 1.7.3" "Plastimatch"
.TH "PLASTIMATCH" "1" "Jan 08, 2019" "Plastimatch 1.7.4" "Plastimatch"
.SH NAME
plastimatch \- register, convert, warp, or manipulate images
.
......@@ -47,17 +47,17 @@ without any additional command line arguments:
.nf
.ft C
$ plastimatch
plastimatch version 1.7.3
plastimatch version 1.7.4
Usage: plastimatch command [options]
Commands:
add adjust average bbox boundary
crop compare compose convert dice
diff dmap dose dvh fill
filter gamma header jacobian mabs
mask maximum ml\-convert multiply probe
register resample scale segment stats
synth synth\-vf threshold thumbnail union
vf\-invert warp xf\-convert
diff dmap dose drr dvh
fill filter gamma header jacobian
mabs mask maximum ml\-convert multiply
probe register resample scale segment
sift stats synth synth\-vf threshold
thumbnail union warp xf\-convert xf\-invert
For detailed usage of a specific command, type:
plastimatch command
......