Difference between revisions of "Documentation/Labs/Surface Toolbox update"

From Slicer Wiki
Jump to: navigation, search
(Update WIP Modules and show implemented modules)
 
(16 intermediate revisions by 4 users not shown)
Line 10: Line 10:
 
* Jared Vicory
 
* Jared Vicory
 
* Andras Lasso
 
* Andras Lasso
* TBD engineer
+
* Martin Styner
 +
* Benjamin Wilson (Kitware Summer intern 2019)
  
 
== Definitions ==
 
== Definitions ==
Line 21: Line 22:
 
** MeshScalar to MeshScalar
 
** MeshScalar to MeshScalar
 
** MeshScalar Operation
 
** MeshScalar Operation
 +
** Mutliple MeshScalar
  
 
== Initial discussions ==
 
== Initial discussions ==
  
 
We will be potentially implementing individual CLIs for each functionality in MeshMath, and those will be plugged into the Surface Toolbox.
 
We will be potentially implementing individual CLIs for each functionality in MeshMath, and those will be plugged into the Surface Toolbox.
 +
 +
We would like to add a parameter node so if you save the scene and reload then all the node and parameter selections that you have made are not lost
 +
Enclose all functionality in C++ little CLIs that can be called from the python infrastructure, so they can be used from any modules
 +
Do the same thing for the functionality in MeshMath, creating independent CLIs and modules
  
 
=== Current MeshMath functionality ===
 
=== Current MeshMath functionality ===
  
<big> subtract: Subtract mesh from inputmesh, write a KWMeshVisu readable text file</big>  
+
{| class="wikitable sortable"
 +
! Name
 +
! Description
 +
! Type
 +
! Keep
 +
! Note
 +
|-
 +
| subtract
 +
| Subtract mesh from inputmesh, write a KWMeshVisu readable text file
 +
| PairWiseMesh
 +
| {{Not Done}}
 +
| This functionality is currently available through [[Documentation/Nightly/Extensions/ModelToModelDistance|ModelToModelDistance]]
 +
|-
 +
| magnitude
 +
| Magnitude of the input metaArray file (mvh/mva) and writes a KWMeshVisu readable file
 +
| ?
 +
| {{Not Done}}
 +
| It seems this is very specific to a certain application
 +
|-
 +
| scaleMVA
 +
| Scales the input metaArray file (mvh/mva) and writes a KWMeshVisu readable file
 +
| ?
 +
| {{Not Done}}
 +
| It seems this is very specific to a certain application
 +
|-
 +
| scaleMesh
 +
| Scales the input mesh file
 +
| SingleMesh
 +
| {{Done}}
 +
| (Implemented)
 +
|-
 +
| avgMesh
 +
| Compute the average mesh from inputmesh file1, file2...
 +
| MultipleMesh
 +
| {{Done}}
 +
| (Work in Progress)
 +
|-
 +
| ave
 +
| Compute the average vector field from file1, file2... generated with -substract
 +
| MultipleMesh / ScalarMesh Operator
 +
| {{Done}}
 +
| Turn into a new MeshScalar operator. Given several Meshes with MeshScalars that are named the same way, it will allow averaging them and creating a new scalar map.
 +
|-
 +
| normave
 +
| Works as the \"-ave\" option, but the average vector are projected on the normal at each point
 +
| MultipleMesh / ScalarMesh Operator
 +
| {{Done}}
 +
| Turn into a new MeshScalar operator. Given several Meshes with MeshScalars that are named the same way, it will allow averaging them and creating a new scalar map.
 +
|-
 +
| InvVect
 +
| Invert all the vectors created with the -substract option and write a KWMeshVisu readable file
 +
| MeshScalar Operation
 +
| {{Done}}
 +
|
 +
|-
 +
| magdir
 +
| Compute the signed magnitude of each of the vector from the vector field.(+ if in the normal direction, - otherwise)
 +
| SingleMesh
 +
| {{Not Done}}
 +
| This functionality is currently available through [[Documentation/Nightly/Extensions/ModelToModelDistance|ModelToModelDistance]]
 +
|-
 +
| magNormdir
 +
| Compute the signed magnitude of the normal projection of the vector field
 +
| SingleMesh
 +
| {{Not Done}}
 +
| This functionality is currently available through [[Documentation/Nightly/Extensions/ModelToModelDistance|ModelToModelDistance]]
 +
|-
 +
| applyVec
 +
| Deforme the mesh according to the vector field specified as input
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress)
 +
|-
 +
| meshValues
 +
| Find the points and cells in a mesh. The outputfile is a textfile with the values
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Export through CSV
 +
|-
 +
| avgGaussMesh
 +
| <Meshfile1> <Meshfile2> ... -gaussMeshPara <mean>,<stdev>,<val1>,<val2>,... Compute the gaussian average for mesh files. The first parameter is the average, then the standard deviation of the Gaussian model and the rest are the values associated with the files
 +
| MultipleMesh
 +
| {{Done}}
 +
|
 +
|-
 +
| avgGaussKWM
 +
| Compute the gaussian average for KWMeshVisu files. The first parameter is the average, then the standard deviation of the Gaussian model and the rest are the values associated with the files
 +
| MeshScalar Operation
 +
| {{Done}}
 +
| See "ave"
 +
|-
 +
| alignMesh
 +
| Align all of the meshes to the inputmesh (== MeshFile0) using Procrustes alignment [-scalingOn]
 +
| MultipleMesh
 +
| {{Done}}
 +
| Fix the scaling, give an option to export the scaling factors associated with the mesh (so it can be reverted via scaleMesh)
 +
|-
 +
| alignMeshICP
 +
| Align all of the meshes to the inputmesh (== MeshFile0) using IterativeClosestPoints (no correspondence required)
 +
| MultipleMesh
 +
| {{Done}}
 +
|
 +
|-
 +
| BadTriangle
 +
| Find the bad triangles in a Mesh. The <thresh value> is the value of the threshFactor to calculate the standard deviation for the bad triangles. The output is a KWMeshVisu text file with the values of the average of the triangles of the mesh
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Probably not keep since this is the same than "Clean" in the SurfaceToolbox
 +
|-
 +
| extraction
 +
| To extract an attribute.The Input is the Mesh, the extractFilename is the attribute image and the Output is a KWMeshVisu text file with the attribute extraction [-extractClosest]: extract closest attribute [-nn]: nearest neighbor interpolation (default: linear)
 +
| MeshToVolume
 +
| {{Done}}
 +
|
 +
|-
 +
| value
 +
| Extract the 5th column from a textfile and write a KWMeshVisu file with the values obtained
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Turn into "import from file" or something similar. This new operation would import a scalar field from a csv file into a mesh
 +
|-
 +
| subKWM
 +
| Difference between 2 KWMeshVisu files
 +
| MeshScalar Operation
 +
| {{Done}}
 +
| See "ave"
 +
|-
 +
| MaxColor
 +
| Compare each point in every files, find a max for every points, keep 5% near the max, the other values will be 0
 +
| MeshScalar Operation
 +
| {{Done}}
 +
| Transform this into a Threshold scalar map
 +
|-
 +
| dist_absolute
 +
| Absolute distance map between KWMeshVisu files
 +
| MeshScalar Operation
 +
| {{Done}}
 +
| Transform this into something better, something that can operate over several scalar maps
 +
|-
 +
| dist_relative
 +
| Relative distance map between KWMeshVisu files (values between -1 & 1)
 +
| MeshScalar Operation
 +
| {{Done}}
 +
| Transform this into something better, "normalize scalar map", and give the option to set up the range
 +
|-
 +
| label
 +
| Separate every labels, find the mean...
 +
| MeshScalar Operation
 +
| {{Not Done}}
 +
| This will be changed into a different module. The module will list all the scalar fields in the Mesh
 +
|-
 +
| color -val <number_of_label>,<value_label>
 +
| To change the value of labels to see the evolution with KWMeshVisu.
 +
| MeshScalar Operation
 +
| {{Not Done}}
 +
| This will not be kept as it has legacy operations
 +
|-
 +
| first <textfile>
 +
| Convert a column file into a line file with a comma between each value.
 +
| Random
 +
| {{Not Done}}
 +
| This will not be kept as it should not be here.
 +
|-
 +
| MC2Origin
 +
| Convert a column file into a line file with a comma between each value.
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress)
 +
|-
 +
| avg/median/min/max/per1/per99OneKWM
 +
| Obtain descriptive statistics from scalar fields in a single VTK mesh
 +
| SingleMesh / ScalarMesh Operation
 +
| {{Done}}
 +
| Keep with modifications, arguments should be the scalar field name and the operation to perform. Might revisit later, most of this functionality is in MeshStatistics
 +
|-
 +
| FillHole
 +
| Fills up a hole in a open mesh.
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Slight change it should close all the open holes until there are no more
 +
|-
 +
| BordersOut
 +
| Outputs the borders of a mesh (if there)
 +
| SingleMesh
 +
| {{Done}}
 +
| (Implemented)
 +
|-
 +
| isOpen
 +
| Gives back an integer defining whether the mesh is open or not
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Probably not keep, will revisit later
 +
|-
 +
| CleanMesh
 +
| Re-mesh the input mesh and gives back a new clean mesh without degenerated triangles
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Already in the surface toolbox
 +
|-
 +
| SmoothMesh
 +
| Gives back a Laplacian smoothed surface
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Already in the surface toolbox
 +
|-
 +
| FilterNormals
 +
| Changes homogeneously normals of the polygons in a mesh
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Already in the surface toolbox
 +
|-
 +
| StatsROI
 +
| Process a KWMeshVisu file, given a ROI Mask
 +
| MeshScalar operation
 +
| {{Not Done}}
 +
| Already in Slicer through Pick and Pain and MeshStatistics
 +
|-
 +
| KWMToPolyData
 +
| Writes a KWM scalar field (N Dimensions) into a PolyData Field Data Scalar to visualize in Slicer
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Keep with modifications, the scalar field can be input in a csv, it does not need to be a KWM file
 +
|-
 +
| FSAscData
 +
| Extracts a curvature/thickness etc information from a FreeSurfer style scalar file and adds it as attribute to the vtk mesh for visualization. FS format is line-by-line, no header, with each line 'point-id vertex-x vertex-y vertex-z scalar-prop
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Needs to be replaced by a conversion tool that allows VTK/Slicer and GIFTI (the new surface standard that FS is using with their newest versions, connectome projects are using only GIFTI)
 +
|-
 +
| surfaceArea
 +
| Computes surface area in a txt file
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Keep with modifications, we should create an option to extract vtkMassProperties from a single Mesh including surface area and volume
 +
|-
 +
| variance/mean/attSTD
 +
| Compute variance across population of scalar fields
 +
| Multiple MeshScalar (multiple Mesh)
 +
| {{Done}}
 +
| Keep with modifications, we should compute variance in a scalar field given the scalar field name and a collection of meshes
 +
|-
 +
| GetCurvatures
 +
| Gets an assorted set of curvature measurements:
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Keep with modifications, embed the attributes as scalar fields in the mesh
 +
|-
 +
| particleConsistency
 +
| Generates new particle files where fliped particles does not appear
 +
| MultipleMesh
 +
| {{Not Done}}
 +
| ShapeWorks functionality, do not keep
 +
|-
 +
| GetDirectionFeatures
 +
| Generates three KWM loadable files that have directionality features with respect to X, Y and Z directions
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress)
 +
|-
 +
| closestPoint
 +
| Computes interpolated attribute file (output file) for second mesh using closest point interpolation between two input meshes
 +
| Multiple Mesh
 +
| {{Done}}
 +
| Keep with modifications. Two meshes, one target and one source with the source having the scalar field that needs to be transferred into target
 +
|-
 +
| extractVertices
 +
| Extract points and write 3 different files listing respectively X, Y and Z values
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Keep with modifications. Provide a point and a scalar field and values for that point will be output
 +
|-
 +
| cart2bary
 +
| Project each point in <vtkPointFileIn> onto the <inputmesh> and then calculate the Barycentric coordinate of the projected point, output to <OutputFileName>
 +
| SingleMesh
 +
| {{Done}}
 +
| Keep with modifications. (styner: I think this can be removed)
 +
|-
 +
| VTKtoLpts
 +
| Create a particle file out of a triangulated VTK mesh
 +
| SingleMesh
 +
| {{Not Done}}
 +
| ShapeWorks functionality, do not keep
 +
|-
 +
| relaxPolygons
 +
| Mesh relaxation based in vtkWindowedSincPolyDataFilter
 +
| SingleMesh
 +
| {{Done}}
 +
| (Implemented) Check with @lasso to see if this is already included into the Surface toolbox
 +
|-
 +
| decimateMesh
 +
| Mesh decimation, reducing the number of points. Target reduction is a value from 0..1 that indicates in what % vertices should be reduced
 +
| SingleMesh
 +
| {{Not Done}}
 +
| Do not keep, already included into the Surface toolbox
 +
|-
 +
| listPointData
 +
| lists info about all the VTK point Data in the vtk file
 +
| SingleMesh
 +
| {{Done}}
 +
| Probably keep, but functionality slightly overlaps with other functionality that will be improved when ported. Will revisit later.
 +
|-
 +
| pointDataOP
 +
| threshold or subtract data
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress)
 +
|-
 +
| translateMesh
 +
| translates a mesh for a given amount
 +
| SingleMesh
 +
| {{Done}}
 +
| (Implemented)
 +
|-
 +
| lookupPointData
 +
| substitutes scalar values in a given scalar field based on an input lookup
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress)
 +
|-
 +
| volumePolyData
 +
| provides volume count for the PolyData through the std output. NOTE: Only in closed surfaces.
 +
| SingleMesh
 +
| {{Done}}
 +
| (Work in Progress) Keep altogether with the surface area functionality described above (vtkMassProperties)
 +
|}
  
* Type: Multiple Mesh
+
=== Path forward ===
* To-do: NOT KEEP. This functionality is currently available through [[Documentation/Nightly/Extensions/ModelToModelDistance|ModelToModelDistance]]
 
  
<big> magnitude: Magnitude of the input metaArray file (mvh/mva) and writes a KWMeshVisu readable file</big>
+
==== Using vtkMRMLScriptedModuleNode ====
  
* Type: ?
+
This node is particularly useful as it helps store parameters used for computation. See [https://github.com/Slicer/Slicer/blob/master/Libs/MRML/Core/vtkMRMLScriptedModuleNode.h vtkMRMLScriptedModuleNode.h]
* To-do: NOT KEEP. It seems this is very specific to a certain application
 
  
<big> scaleMVA: Scales the input metaArray file (mvh/mva) and writes a KWMeshVisu readable file</big>
+
The main idea is to have a parameter node selector allowing to choose between different set of parameters.
  
* Type: ?
+
For an example of use in a scripted module. See [https://github.com/Slicer/Slicer/blob/22f0033f92527d4e3c22e77f89384d64f8bce66b/Modules/Scripted/SegmentStatistics/SegmentStatistics.py#L60 Modules/Scripted/SegmentStatistics/SegmentStatistics.py]
* To-do: NOT KEEP. It seems this is very specific to a certain application
 
 
 
<big> scaleMesh : Scales the input mesh file</big>
 
 
 
* Type: SingleMesh
 
* To-do: KEEP.
 
 
 
<big> avgMesh : Compute the average mesh from inputmesh file1, file2...</big>
 
 
 
* Type: Multiple Mesh
 
* To-do: KEEP.
 
 
 
<big> ave : Compute the average vector field from file1, file2... generated with -substract</big>
 
 
 
* Type: Multiple Mesh (also MeshScalar Operation)
 
* To-do: KEEP. Turn into a new MeshScalar operator. Given several Meshes with MeshScalars that are named the same way, it will allow averaging them and creating a new scalar map.
 
 
 
<big> normave : Works as the \"-ave\" option, but the average vector are projected on the normal at each point</big>
 
 
 
* Type: Multiple Mesh (also MeshScalar Operation)
 
* To-do: KEEP. Turn into a new MeshScalar operator. Given several Meshes with MeshScalars that are named the same way, it will allow averaging/projecting into normals and creating a new scalar map.
 
 
 
<big> InvVect:    Invert all the vectors created with the -substract option and write a KWMeshVisu readable file</big>
 
 
 
* Type: MeshScalar Operation
 
* To-do: KEEP.
 
 
 
magdir <VectorFile>  Compute the signed magnitude of each of the vector from the vector field.(+ if in the normal direction, - otherwise)"  << std::endl;
 
    std::cout << " -magNormDir <VectorFile> Compute the signed magnitude of the normal projection of the vector field"  << std::endl;
 
    std::cout << " -applyVec <VectorFile> Deforme the mesh according to the vector field specified as input" << std::endl;
 
    std::cout << " -meshValues                Find the points and cells in a mesh. The outputfile is a textfile with the values"<< std::endl;
 
    std::cout << " -avgGaussMesh <Meshfile1> <Meshfile2> ... -gaussMeshPara <mean>,<stdev>,<val1>,<val2>,... "<< std::endl;
 
    std::cout << "  Compute the gaussian average for mesh files." << std::endl;
 
    std::cout << "  The first parameter is the average, then the standard deviation of the Gaussian model and the rest are the values associated with the files"  << std::endl;
 
    std::cout << " -avgGaussKWM <txtfile1> <txtfile2>... -gaussKWMPara <mean>,<stdev>,<val1>,<val2>,... "
 
      << std::endl;
 
    std::cout << "  Compute the gaussian average for KWMeshVisu files." << std::endl;
 
    std::cout
 
    <<
 
    "  The first parameter is the average, then the standard deviation of the Gaussian model and the rest are the values associated with the files"
 
    << std::endl;
 
    std::cout
 
    <<
 
    " -alignMesh <Meshfile1> <Meshfile2>... Align all of the meshes to the inputmesh (== MeshFile0) using Procrustes alignment [-scalingOn] "
 
    << endl;
 
    //bp 2016
 
    std::cout
 
    <<
 
    " -alignMeshICP <Meshfile1> <Meshfile2>... Align all of the meshes to the inputmesh (== MeshFile0) using IterativeClosestPoints (no correspondence required) "
 
    << endl;
 
    //bp 2016
 
    std::cout << " -BadTriangle <thresh value> [-correctMesh correctFilename] "  << std::endl;
 
    std::cout
 
    <<
 
    "  Find the bad triangles in a Mesh. The <thresh value> is the value of the threshFactor to calculate the standard deviation for the bad triangles. The output is a KWMeshVisu text file with the values of the average of the triangles of the mesh "
 
    << std::endl;
 
    std::cout << "  To have a new Mesh with the correct triangles -correctMesh " <<  std::endl;
 
    std::cout << " -extraction extractFilename [-extractClosest] [-nn]" << std::endl;
 
    std::cout
 
    <<
 
    "  To extract an attribute.The Input is the Mesh, the extractFilename is the attribute image and the Output is a KWMeshVisu text file with the attribute extraction"
 
    << std::endl;
 
    std::cout << "  [-extractClosest]: extract closest attribute" << std::endl;
 
    std::cout << "  [-nn]: nearest neighbor interpolation (default: linear)" << std::endl;
 
    std::cout << " -value <file1> <file2>... " << std::endl;
 
    std::cout
 
    << "  Extract the 5th column from a textfile and write a KWMeshVisu file with the values obtained"
 
    <<  std::endl;
 
    std::cout << " -subKWM <textname>      Difference between 2 KWMeshVisu files" << std::endl;
 
    std::cout
 
    <<
 
    " -MaxColor <textfile>...  Compare each point in every files, find a max for every points, keep 5% near the max, the other values will be 0"
 
    << std::endl;
 
    std::cout
 
    <<
 
    " -dist_absolute <textfile>,<textfile>...  -result_absolute <textfile>,<textfile>... Absolute distance map between KWMeshVisu files"
 
    << std::endl;
 
    std::cout
 
    <<
 
    " -dist_relative <textfile>,<textfile>...  -result_relative <textfile>,<textfile>... Relative distance map between KWMeshVisu files (values between -1 & 1)"
 
    << std::endl;
 
    std::cout << " -label <textfile>      Separate every labels, find the mean..." << std::endl;
 
    std::cout
 
    << " -color -val <number_of_label>,<value_label>... -oldval <number_of_old_label>,<old_value_label>..."
 
    << std::endl;
 
    std::cout << "  To change the value of labels to see the evolution with KWMeshVisu. " <<  std::endl;
 
    std::cout << "  Value_label is when the label grow up. " <<  std::endl;
 
    std::cout << "  Old_value_label is for the label wich has already grown up." <<  std::endl;
 
    std::cout
 
    << " -first <textfile>...  Convert a column file into a line file with a comma between each value"
 
    << std::endl;
 
    // cchou MC2Origin
 
    std::cout << " -MC2Origin      Translate the Center of Mass to the Origin" << std::endl;
 
    // bp2009 StatsKWM
 
    std::cout << " -avgOneKWM      Computes the avg of an input KWMeshVisu readable file" << std::endl;
 
    std::cout << " -medianOneKWM    Computes the min of an input KWMeshVisu readable file" << std::endl;
 
    std::cout << " -minOneKWM      Computes the min of an input KWMeshVisu readable file" << std::endl;
 
    std::cout << " -maxOneKWM      Computes the max of an input KWMeshVisu readable file" << std::endl;
 
    std::cout << " -per1OneKWM      Computes the 1% percentile of an input KWMeshVisu readable file" << std::endl;
 
    std::cout << " -per99OneKWM    Computes the 99% percentile of an input KWMeshVisu readable file" << std::endl;
 
    // bp2009 StatsKWM
 
    // bp2009 FillHole
 
    std::cout << " -FillHole        Fills up a hole in a open mesh." << std::endl;
 
    std::cout << "      If more than one hole exists, this operation might have to be repeated."
 
      << std::endl;
 
    // bp2009 FillHole
 
    // bp2009 BordersOut
 
    std::cout << " -BordersOut      Outputs the borders of a mesh (if there)." << std::endl;
 
    // bp2009 BordersOut
 
    // bp2009 IsOpen
 
    std::cout << " -IsOpen          Gives back an integer defining whether the mesh is open or not" << std::endl;
 
    // bp2009 IsOpen
 
    // bp2009 CleanMesh
 
    std::cout
 
    << " -CleanMesh      Re-mesh the input mesh and gives back a new clean mesh without degenerated triangles"
 
    << std::endl;
 
    // bp2009 CleanMesh
 
    // bp2009 SmoothMesh
 
    std::cout << " -SmoothMesh iterations    Gives back a Laplacian smoothed surface" << std::endl;
 
    std::cout << "          Iterations defines how many times the Laplacian is applied."
 
      << std::endl;
 
    // bp2009 SmoothMesh
 
    // bp2009 FilterNormals
 
    std::cout
 
    <<
 
    " -FilterNormals direction <MeshFileVTK> <MeshFileVTKOut>  ... Changes homogeneously normals of the polygons in a mesh"
 
    << std::endl;
 
    std::cout
 
    <<
 
    "              direction= [1] normals outwards [-1] normals inwards"
 
    << std::endl;
 
    // bp2009 FilterNormals
 
    // bp2009 StatsROI
 
    std::cout << " -statsROI <txtROIFileIn>  Process a KWMeshVisu file, given a ROI Mask" << std::endl;
 
    std::cout << "      Outputs a new KWMeshVisu only with the info in the mask"
 
      << std::endl;
 
    // bp2009 StatsROI
 
    // bp2009 KWMtoPolyData
 
    std::cout
 
    <<
 
    " -KWMtoPolyData <txtFileIn> <nameScalarField>  Writes a KWM scalar field (N Dimensions) into a PolyData Field Data Scalar to visualize in Slicer"
 
    << std::endl;
 
    // bp2009 KWMtoPolyData
 
    std::cout
 
    <<
 
    " -FSAscData <FreeSurferASCIIfile> <nameScalarField>  Extracts a curvature/thickness etc information from a FreeSurfer style scalar file and adds it as attribute to the vtk mesh for visualization. FS format is line-by-line, no header, with each line 'point-id vertex-x vertex-y vertex-z scalar-prop' "
 
    << std::endl;
 
    // styner2015 FSAscData
 
    std::cout << " -significanceLevel <double> the min Pvalue for the Pval ColorMap " << std::endl;
 
 
 
    // bp2009 ProcessROI
 
    std::cout << " -processROI <txtROIFileIn> <MeshFileIn>  ... [TEMP - do not know where to put this]" << std::endl;
 
    std::cout << "  Gets stats for a distances ROI map" << std::endl;
 
    // bp2009 ProcessROI
 
    std::cout << " -surfaceArea <AttributeFile>  Computes surface area in a txt file" << std::endl;
 
    std::cout << " -lobarSurfaceArea <ParcellationAttributeFile>  Computes lobar surface area (output: csv file)"<<std::endl;
 
    std::cout << " -variance <AttributeFile2> <AttributeFile3>...  Compute variance across population" << std::endl;
 
    // bp2010 GetCurvatures
 
    std::cout
 
    <<
 
    " -GetCurvatures <txtFileOut_C> <txtFileOut_S> <txtFileOut_Gauss> <txtFileOut_mean>... Gets an assorted set of curvature measurements:"
 
    << std::endl;
 
    std::cout
 
    <<
 
    "  Koenderink curvature values for an input mesh (shape index = S, curvedness = C), Gaussian Curvature and Mean Curvature"
 
    << std::endl;
 
    // bp2010 GetCurvatures
 
    // bp2010 particleConsistency
 
    std::cout
 
    <<
 
    " -particleConsistency <vtkFileIn_1> <lptsFileIn_1> ... <vtkFileIn_n> <lptsFileIn_n> ... Generates new particle files where fliped particles does not appear"
 
    << std::endl;
 
    // bp2010 particleConsistency
 
    // bp2010 GetDirectionFeatures
 
    std::cout
 
    <<
 
    " -GetDirectionFeatures ... Generates three KWM loadable files that have directionality features with respect to X, Y and Z directions"
 
    << std::endl;
 
    // bp2010 GetDirectionFeatures
 
    std::cout
 
    <<
 
    " -closestPoint <InputAttributeFile1> <InputMesh2>  Computes interpolated attribute file (output file) for second mesh using closest point interpolation between two input meshes"
 
    << std::endl;
 
    std::cout << " -extractVertices <YLocationAttributeFile.txt> <ZLocationAttributeFile.txt>  Extract points and write 3 different files listing respectively X, Y and Z values"
 
    << std::endl;
 
    std::cout << " -mean <AttributeFile2> <AttributeFile3>... Compute mean scalar attribute file (assuming same number of vertices)" << std::endl;
 
    //cx2011 cart2bary
 
    std::cout << " -cart2bary <vtkPointFileIn> Project each point in <vtkPointFileIn> onto the <inputmesh> and then calculate the Barycentric coordinate of the projected point, output to <OutputFileName>" << std::endl;
 
 
 
    //bp2011
 
    std::cout << " -attSTD <attribute_file2> <attribute_file2> ...<attribute_fileN> ... Compute std for a collection of vector or scalar files" << std::endl;
 
    std::cout << " -VTKtolpts  ... Create a particle file out of a triangulated VTK mesh" << std::endl;
 
    //bp2012
 
    std::cout << " -relaxPolygons iterations... Mesh relaxation based in vtkWindowedSincPolyDataFilter" << std::endl;
 
    std::cout << " -decimateMesh <target reduction> ... Mesh decimation, reducing the number of points. Target reduction is a value from 0..1 that indicates in what % vertices should be reduced" << std::endl;
 
    //mst2013
 
    std::cout << " -listPointData    lists info about all the VTK point Data in the vtk file" << std::endl;
 
    std::cout << " -PointDataOp <name> <op> <val>  <name>: name of point data, " << std::endl
 
      << "    <op>: [threshBelow | sub] threshBelow: set to 0 all data below <value>, sub: subtract value"  << std::endl;
 
    //bp2013
 
    std::cout << " -translateMesh <tx_DimX> <tx_DimY> <tx_DimZ> ,  translates a mesh for a given amount " << std::endl;
 
    //bp2015
 
    std::cout << " -lookupPointData <csv_lookup> <scalar_field_name>,  substitutes scalar values in a given scalar field based on an input lookup " << std::endl;
 
    //bp2016
 
    std::cout << " -volumePolyData,  provides volume count for the PolyData through the std output. NOTE: Only in closed surfaces." << std::endl;
 
   
 
    std::cout << " -verbose                  Verbose output" << std::endl;
 
    return 0;
 
    }
 
 
 
=== Path forward ===
 
  
 
== Testing data ==
 
== Testing data ==
  
 
TBD
 
TBD

Latest revision as of 12:14, 30 July 2019

Home < Documentation < Labs < Surface Toolbox update


Overview

As part of the SALT project we would like to revamp some of the existing functionality in MeshMath into the SurfaceToolbox. We will be hiring a summer intern to work on this over a couple of months this summer.

Team

  • JC Fillon-Robin
  • Bea Paniagua
  • Jared Vicory
  • Andras Lasso
  • Martin Styner
  • Benjamin Wilson (Kitware Summer intern 2019)

Definitions

  • KWMeshVisu: Legacy mesh viewer from the Styner Lab.
  • Types of Mesh Operations:
    • Multiple Mesh (2+)
    • Single Mesh
    • MeshToVolume
    • MeshScalar to Mesh
    • MeshScalar to MeshScalar
    • MeshScalar Operation
    • Mutliple MeshScalar

Initial discussions

We will be potentially implementing individual CLIs for each functionality in MeshMath, and those will be plugged into the Surface Toolbox.

We would like to add a parameter node so if you save the scene and reload then all the node and parameter selections that you have made are not lost Enclose all functionality in C++ little CLIs that can be called from the python infrastructure, so they can be used from any modules Do the same thing for the functionality in MeshMath, creating independent CLIs and modules

Current MeshMath functionality

Name Description Type Keep Note
subtract Subtract mesh from inputmesh, write a KWMeshVisu readable text file PairWiseMesh X mark.png This functionality is currently available through ModelToModelDistance
magnitude Magnitude of the input metaArray file (mvh/mva) and writes a KWMeshVisu readable file ? X mark.png It seems this is very specific to a certain application
scaleMVA Scales the input metaArray file (mvh/mva) and writes a KWMeshVisu readable file ? X mark.png It seems this is very specific to a certain application
scaleMesh Scales the input mesh file SingleMesh Check.svg (Implemented)
avgMesh Compute the average mesh from inputmesh file1, file2... MultipleMesh Check.svg (Work in Progress)
ave Compute the average vector field from file1, file2... generated with -substract MultipleMesh / ScalarMesh Operator Check.svg Turn into a new MeshScalar operator. Given several Meshes with MeshScalars that are named the same way, it will allow averaging them and creating a new scalar map.
normave Works as the \"-ave\" option, but the average vector are projected on the normal at each point MultipleMesh / ScalarMesh Operator Check.svg Turn into a new MeshScalar operator. Given several Meshes with MeshScalars that are named the same way, it will allow averaging them and creating a new scalar map.
InvVect Invert all the vectors created with the -substract option and write a KWMeshVisu readable file MeshScalar Operation Check.svg
magdir Compute the signed magnitude of each of the vector from the vector field.(+ if in the normal direction, - otherwise) SingleMesh X mark.png This functionality is currently available through ModelToModelDistance
magNormdir Compute the signed magnitude of the normal projection of the vector field SingleMesh X mark.png This functionality is currently available through ModelToModelDistance
applyVec Deforme the mesh according to the vector field specified as input SingleMesh Check.svg (Work in Progress)
meshValues Find the points and cells in a mesh. The outputfile is a textfile with the values SingleMesh Check.svg (Work in Progress) Export through CSV
avgGaussMesh <Meshfile1> <Meshfile2> ... -gaussMeshPara <mean>,<stdev>,<val1>,<val2>,... Compute the gaussian average for mesh files. The first parameter is the average, then the standard deviation of the Gaussian model and the rest are the values associated with the files MultipleMesh Check.svg
avgGaussKWM Compute the gaussian average for KWMeshVisu files. The first parameter is the average, then the standard deviation of the Gaussian model and the rest are the values associated with the files MeshScalar Operation Check.svg See "ave"
alignMesh Align all of the meshes to the inputmesh (== MeshFile0) using Procrustes alignment [-scalingOn] MultipleMesh Check.svg Fix the scaling, give an option to export the scaling factors associated with the mesh (so it can be reverted via scaleMesh)
alignMeshICP Align all of the meshes to the inputmesh (== MeshFile0) using IterativeClosestPoints (no correspondence required) MultipleMesh Check.svg
BadTriangle Find the bad triangles in a Mesh. The <thresh value> is the value of the threshFactor to calculate the standard deviation for the bad triangles. The output is a KWMeshVisu text file with the values of the average of the triangles of the mesh SingleMesh X mark.png Probably not keep since this is the same than "Clean" in the SurfaceToolbox
extraction To extract an attribute.The Input is the Mesh, the extractFilename is the attribute image and the Output is a KWMeshVisu text file with the attribute extraction [-extractClosest]: extract closest attribute [-nn]: nearest neighbor interpolation (default: linear) MeshToVolume Check.svg
value Extract the 5th column from a textfile and write a KWMeshVisu file with the values obtained SingleMesh Check.svg (Work in Progress) Turn into "import from file" or something similar. This new operation would import a scalar field from a csv file into a mesh
subKWM Difference between 2 KWMeshVisu files MeshScalar Operation Check.svg See "ave"
MaxColor Compare each point in every files, find a max for every points, keep 5% near the max, the other values will be 0 MeshScalar Operation Check.svg Transform this into a Threshold scalar map
dist_absolute Absolute distance map between KWMeshVisu files MeshScalar Operation Check.svg Transform this into something better, something that can operate over several scalar maps
dist_relative Relative distance map between KWMeshVisu files (values between -1 & 1) MeshScalar Operation Check.svg Transform this into something better, "normalize scalar map", and give the option to set up the range
label Separate every labels, find the mean... MeshScalar Operation X mark.png This will be changed into a different module. The module will list all the scalar fields in the Mesh
color -val <number_of_label>,<value_label> To change the value of labels to see the evolution with KWMeshVisu. MeshScalar Operation X mark.png This will not be kept as it has legacy operations
first <textfile> Convert a column file into a line file with a comma between each value. Random X mark.png This will not be kept as it should not be here.
MC2Origin Convert a column file into a line file with a comma between each value. SingleMesh Check.svg (Work in Progress)
avg/median/min/max/per1/per99OneKWM Obtain descriptive statistics from scalar fields in a single VTK mesh SingleMesh / ScalarMesh Operation Check.svg Keep with modifications, arguments should be the scalar field name and the operation to perform. Might revisit later, most of this functionality is in MeshStatistics
FillHole Fills up a hole in a open mesh. SingleMesh Check.svg (Work in Progress) Slight change it should close all the open holes until there are no more
BordersOut Outputs the borders of a mesh (if there) SingleMesh Check.svg (Implemented)
isOpen Gives back an integer defining whether the mesh is open or not SingleMesh X mark.png Probably not keep, will revisit later
CleanMesh Re-mesh the input mesh and gives back a new clean mesh without degenerated triangles SingleMesh X mark.png Already in the surface toolbox
SmoothMesh Gives back a Laplacian smoothed surface SingleMesh X mark.png Already in the surface toolbox
FilterNormals Changes homogeneously normals of the polygons in a mesh SingleMesh X mark.png Already in the surface toolbox
StatsROI Process a KWMeshVisu file, given a ROI Mask MeshScalar operation X mark.png Already in Slicer through Pick and Pain and MeshStatistics
KWMToPolyData Writes a KWM scalar field (N Dimensions) into a PolyData Field Data Scalar to visualize in Slicer SingleMesh Check.svg (Work in Progress) Keep with modifications, the scalar field can be input in a csv, it does not need to be a KWM file
FSAscData Extracts a curvature/thickness etc information from a FreeSurfer style scalar file and adds it as attribute to the vtk mesh for visualization. FS format is line-by-line, no header, with each line 'point-id vertex-x vertex-y vertex-z scalar-prop SingleMesh X mark.png Needs to be replaced by a conversion tool that allows VTK/Slicer and GIFTI (the new surface standard that FS is using with their newest versions, connectome projects are using only GIFTI)
surfaceArea Computes surface area in a txt file SingleMesh Check.svg (Work in Progress) Keep with modifications, we should create an option to extract vtkMassProperties from a single Mesh including surface area and volume
variance/mean/attSTD Compute variance across population of scalar fields Multiple MeshScalar (multiple Mesh) Check.svg Keep with modifications, we should compute variance in a scalar field given the scalar field name and a collection of meshes
GetCurvatures Gets an assorted set of curvature measurements: SingleMesh Check.svg (Work in Progress) Keep with modifications, embed the attributes as scalar fields in the mesh
particleConsistency Generates new particle files where fliped particles does not appear MultipleMesh X mark.png ShapeWorks functionality, do not keep
GetDirectionFeatures Generates three KWM loadable files that have directionality features with respect to X, Y and Z directions SingleMesh Check.svg (Work in Progress)
closestPoint Computes interpolated attribute file (output file) for second mesh using closest point interpolation between two input meshes Multiple Mesh Check.svg Keep with modifications. Two meshes, one target and one source with the source having the scalar field that needs to be transferred into target
extractVertices Extract points and write 3 different files listing respectively X, Y and Z values SingleMesh Check.svg (Work in Progress) Keep with modifications. Provide a point and a scalar field and values for that point will be output
cart2bary Project each point in <vtkPointFileIn> onto the <inputmesh> and then calculate the Barycentric coordinate of the projected point, output to <OutputFileName> SingleMesh Check.svg Keep with modifications. (styner: I think this can be removed)
VTKtoLpts Create a particle file out of a triangulated VTK mesh SingleMesh X mark.png ShapeWorks functionality, do not keep
relaxPolygons Mesh relaxation based in vtkWindowedSincPolyDataFilter SingleMesh Check.svg (Implemented) Check with @lasso to see if this is already included into the Surface toolbox
decimateMesh Mesh decimation, reducing the number of points. Target reduction is a value from 0..1 that indicates in what % vertices should be reduced SingleMesh X mark.png Do not keep, already included into the Surface toolbox
listPointData lists info about all the VTK point Data in the vtk file SingleMesh Check.svg Probably keep, but functionality slightly overlaps with other functionality that will be improved when ported. Will revisit later.
pointDataOP threshold or subtract data SingleMesh Check.svg (Work in Progress)
translateMesh translates a mesh for a given amount SingleMesh Check.svg (Implemented)
lookupPointData substitutes scalar values in a given scalar field based on an input lookup SingleMesh Check.svg (Work in Progress)
volumePolyData provides volume count for the PolyData through the std output. NOTE: Only in closed surfaces. SingleMesh Check.svg (Work in Progress) Keep altogether with the surface area functionality described above (vtkMassProperties)

Path forward

Using vtkMRMLScriptedModuleNode

This node is particularly useful as it helps store parameters used for computation. See vtkMRMLScriptedModuleNode.h

The main idea is to have a parameter node selector allowing to choose between different set of parameters.

For an example of use in a scripted module. See Modules/Scripted/SegmentStatistics/SegmentStatistics.py

Testing data

TBD