MorphoGraphX  2.0-1-227
PCAnalysis.hpp
Go to the documentation of this file.
1 //
2 // This file is part of MorphoGraphX - http://www.MorphoGraphX.org
3 // Copyright (C) 2012-2015 Richard S. Smith and collaborators.
4 //
5 // If you use MorphoGraphX in your work, please cite:
6 // http://dx.doi.org/10.7554/eLife.05864
7 //
8 // MorphoGraphX is free software, and is licensed under under the terms of the
9 // GNU General (GPL) Public License version 2.0, http://www.gnu.org/licenses.
10 //
11 #ifndef PCAnalysis_HPP
12 #define PCAnalysis_HPP
13 
14 #include <Process.hpp>
15 
16 #include <Information.hpp>
17 
18 #include <QRegExp>
19 #include <QString>
20 #include <QStringList>
21 
22 namespace mgx
23 {
24 
33  class mgxBase_EXPORT PCAnalysis : public Process
34  {
35  public:
36  PCAnalysis(const Process& process) : Process(process)
37  {
38  setName("Stack/Shape Analysis/PCAnalysis");
39  setDesc("Compute the principle components of the image. If the threshold is -1, then all \n"
40  "the values are used, as is. If 'Draw Result' is set to true, the current mesh \n"
41  "will be erased and replaced with shapes representing the cells fit. 'Splan Correction' \n"
42  "can be either a shape, a single value of a vector of 3 values, corresponding to the \n"
43  "correction to apply for the eigen-values on all three directions.");
44  setIcon(QIcon(":/images/PCAnalysis.png"));
45 
46  addParm("Output","File to write the output to","output.csv");
47  addParm("Span Correction","Span correction can be made using pre-computed formula for regular shapes, or a percentage of the PC.","Ellipsoid",
48  QStringList() << "Ellipsoid" << "Cuboid" << "Elliptical Cylinder" << "Maximum Span");
49  addParm("Draw Result","Shape used to display the result","No", QStringList() << "No" << "Ellipsoids" << "Cuboids" << "Cylinder");
50  addParm("Threshold","If the stack is not labeled, a single volume is considered with all voxels of intensity greater than this threshold.","100");
51  addParm("Shape Details","How finely to draw the shape (for cylinders or ellipsoids)","3");
52  }
53 
54  bool run()
55  {
56  if(!checkState().stack())
57  return false;
58  Stack* stk = currentStack();
59  Store* store = stk->currentStore();
60  QString fn = parm("Output");
61  QString correction = parm("Span Correction").trimmed();
62  Point3f correctingFactor;
63  if(correction == "Ellipsoid")
64  correctingFactor = sqrt(5);
65  else if(correction == "Cuboid")
66  correctingFactor = sqrt(3);
67  else if(correction == "Elliptical Cylinder")
68  correctingFactor = Point3f(sqrt(3), sqrt(4), sqrt(4));
69  else if(correction == "Maximum Span")
70  correctingFactor = 0;
71  else if(correction.endsWith('%')) {
72  QString cor = correction.left(correction.size() - 1);
73  bool ok;
74  float cr = cor.toFloat(&ok);
75  if(ok) {
76  correctingFactor = -cr / 100.f;
77  } else {
78  setErrorMessage(QString("Error, percentage value is not valid: '%1'").arg(cor));
79  return false;
80  }
81  } else {
82  bool ok;
83  float cr = correction.toFloat(&ok);
84  if(ok)
85  correctingFactor = cr;
86  else {
87  QStringList vs = correction.split(QRegExp("[ ,-;:-]"));
88  if(vs.size() == 3) {
89  correctingFactor.x() = vs[0].toFloat(&ok);
90  if(!ok) {
91  setErrorMessage(QString("Invalid x value for correction factor: '%1'.").arg(vs[0]));
92  return false;
93  }
94  correctingFactor.y() = vs[1].toFloat(&ok);
95  if(!ok) {
96  setErrorMessage(QString("Invalid y value for correction factor: '%1'.").arg(vs[1]));
97  return false;
98  }
99  correctingFactor.z() = vs[2].toFloat(&ok);
100  if(!ok) {
101  setErrorMessage(QString("Invalid z value for correction factor: '%1'.").arg(vs[2]));
102  return false;
103  }
104  } else {
105  setErrorMessage(QString("Invalid correction string '%1', expected one of 'Ellipsoid'"
106  ", 'Cuboid', 'Elliptical Cylinder', Maximum Span', a percentage, a single "
107  "value or three values"));
108  return false;
109  }
110  }
111  }
112  bool draw_result = false;
113  Mesh* m = mesh(stk->id());
114  bool res
115  = run(stk, store, m, fn, parm("Threshold").toInt(), parm("Draw Result"), correctingFactor,
116  parm("Shape Details").toInt(), draw_result);
117  if(res and draw_result) {
118 
119  m->setShowSurface();
120  m->setShowLabel("Label");
121  }
122  return res;
123  }
124 
139  bool run(Stack* stack, Store* store, Mesh* m, QString filename, int treshold, QString shape,
140  Point3f correctingFactor, int slices, bool& draw_result);
141  };
142 
151  class mgxBase_EXPORT PCAnalysis2D : public Process
152  {
153  public:
154  PCAnalysis2D(const Process& process) : Process(process)
155  {
156  setName("Mesh/Cell Axis/Shape Analysis/Compute Shape Analysis 2D");
157  setDesc("Compute the principle components of the image. If the threshold is -1, then all \n"
158  "the values are used, as is. If 'Draw Result' is set to true, the current mesh \n"
159  "will be erased and replaced with shapes representing the cells fit. 'Span Correction' \n"
160  "can be either a shape, a single value of a vector of 3 values, corresponding to the b\n"
161  "correction to apply for the eigen-values on all three directions.");
162  setIcon(QIcon(":/images/PDG.png"));
163 
164  addParm("Output","File to write the output to","output.csv");
165  addParm("Axis Line Scale","Amount to scale the axis lines","1.0");
166  addParm("Axis Line Width","","2.0");
167  addParm("Span Correction","Span correction can be made using pre-computed formula for regular shapes, or a percentage of the PC.",
168  "Cuboid", QStringList() << "Ellipsoid" << "Cuboid"); // 0
169  }
170 
171  bool run()
172  {
173  Mesh* m = currentMesh();
174  IntFloatAttr outputHeatMap;
175  QString outp = "None";
176 
177  Point3f correcting_factor;
178  if(parm("Span Correction") == "Ellipsoid")
179  correcting_factor = sqrt(5);
180  else if(parm("Span Correction") == "Cuboid")
181  correcting_factor = sqrt(3);
182 
183  return run(m, parm("Output"), parm("Axis Line Scale").toDouble(), parm("Axis Line Width").toDouble(), outp,
184  correcting_factor, outputHeatMap, true);
185  }
186 
187  bool run(Mesh* m, QString filename, double axisLineScale, double axisLineWidth, QString outp,
188  Point3f correcting_factor, IntFloatAttr &outputHeatMap, bool runDisplay);
189  };
190 
194  class mgxBase_EXPORT DisplayPCAOld : public Process
195  {
196  public:
197  enum ParmNames { pDisplayHeatMap, pScaleHeatMap, pRangeHeatLow, pRangeHeatHigh, pDisplayAxis,
198  pAxisColor, pAxisWidth, pAxisScale, pAxisOffset, pAspectRatioThreshold, pCustomShear, pNumParms};
199 
200  DisplayPCAOld(const Process& process) : Process(process)
201  {
202  setName("Mesh/Cell Axis/Shape Analysis/Display Shape Axis");
203  setDesc("Display the principle growth directions");
204  setIcon(QIcon(":/images/PDG.png"));
205 
206  addParm("Heatmap","Display as a color map PCA values in max or min direction, or max*min, or max/min.","Product Max*Min",
207  QStringList() << "None" << "Max" << "Min" << "Ratio Max/Min" << "Product Max*Min" << "Anisotropy Max/(Max+Min)" << "CustomX" << "CustomY");
208  addParm("ScaleHeat","Scale heat map","Auto", QStringList() << "None" << "Auto" << "Manual");
209  addParm("Heat min","High bound heat map","1");
210  addParm("Heat max","Low bound heat map","3");
211  addParm("Show Axis","Draw pca directions as vectors.","Both",
212  QStringList() << "Both" << "Max" << "Min" << "CustomX" << "CustomY" << "BothCustom" << "None"); // 4
213  addParm("Axis Color","Color used to draw pca","white", QColor::colorNames());
214  addParm("Line Width","Line Width","2.0");
215  addParm("Line Scale","Length of the vectors = Scale * Strain.","1.0");
216  addParm("Line Offset","Draw the vector ends a bit tilted up for proper display on surfaces.","0.0");
217  addParm("Threshold","Minimal value of aspect ratio (= PCAMax/PCAMin) required for drawing PCA.","0.0");
218  addParm("Create Attr Maps","Create Attr Maps","No",QStringList() << booleanChoice());
219  }
220 
221  bool initialize( QWidget* parent);
222 
223  // Process the parameters
224  void processParms();
225 
226  bool run()
227  {
228  if(!checkState().mesh(MESH_NON_EMPTY))
229  return false;
230  return run(currentMesh());
231  }
232 
233  bool run(Mesh* mesh)
234  {
235  processParms();
236  return run(mesh, DisplayHeatMap, scaleHeatMap, RangeHeat, DisplayAxis,
237  AxisColor, AxisWidth, AxisScale, AxisOffset, AspectRatioThreshold, CustomShear, CreateAttrs);
238  }
239 
240  bool run(Mesh* mesh, const QString displayHeatMap, const QString scaleHeatMap, const Point2d &rangeHeat,
241  const QString displayPCA, const QColor& axisColor, float axisLineWidth,
242  float scaleAxisLength, float axisOffset, float aspectRatioThreshold, bool customShear, bool createAttrMaps);
243 
244  private:
245  QString DisplayHeatMap;
246  QString scaleHeatMap;
247  Point2d RangeHeat;
248  QString DisplayAxis;
249  QColor AxisColor;
250  float AxisWidth;
251  float AxisScale;
252  float AxisOffset;
253  float AspectRatioThreshold;
254  bool CustomShear;
255  bool CreateAttrs;
256  };
260  class mgxBase_EXPORT DisplayPCA : public Process
261  {
262  public:
263  enum ParmNames { pDisplayHeatMap, pScaleHeatMap, pRangeHeatLow, pRangeHeatHigh, pDisplayAxis,
264  pAxisColor, pAxisWidth, pAxisScale, pAxisOffset, pAspectRatioThreshold, pCustomShear, pNumParms};
265 
266  DisplayPCA(const Process& process) : Process(process)
267  {
268  setName("Mesh/Cell Axis/Experimental/Shape Analysis/Display Shape Axis New");
269  setDesc("Display the principle growth directions");
270  setIcon(QIcon(":/images/PDG.png"));
271 
272  addParm("Heatmap","Display as a color map PCA values in max or min direction, or max*min, or max/min.","Product Max*Min",
273  QStringList() << "None" << "Max" << "Min" << "Ratio Max/Min" << "Product Max*Min" << "Anisotropy Max/(Max+Min)" << "CustomX" << "CustomY");
274  addParm("ScaleHeat","Scale heat map","Auto", QStringList() << "None" << "Auto" << "Manual");
275  addParm("Heat min","High bound heat map","1");
276  addParm("Heat max","Low bound heat map","3");
277  addParm("Show Axis","Draw pca directions as vectors.","Both",
278  QStringList() << "Both" << "Max" << "Min" << "CustomX" << "CustomY" << "BothCustom" << "None"); // 4
279  addParm("Axis Color","Color used to draw pca","white", QColor::colorNames());
280  addParm("Line Width","Line Width","2.0");
281  addParm("Line Scale","Length of the vectors = Scale * Strain.","1.0");
282  addParm("Line Offset","Draw the vector ends a bit tilted up for proper display on surfaces.","0.0");
283  addParm("Threshold","Minimal value of aspect ratio (= PCAMax/PCAMin) required for drawing PCA.","0.0");
284  addParm("Create Attr Maps","Create Attr Maps","No",QStringList() << booleanChoice());
285  }
286 
287  // Process the parameters
288  void processParms();
289 
290  bool run()
291  {
292  if(!checkState().mesh(MESH_NON_EMPTY))
293  return false;
294  return run(currentMesh());
295  }
296 
297  bool run(Mesh* mesh)
298  {
299  DisplayHeatMap = parm("Heatmap");
300  scaleHeatMap = parm("ScaleHeat");
301  RangeHeat = Point2d(parm("Heat min").toDouble(), parm("Heat max").toDouble());
302  DisplayAxis = parm("Show Axis");
303  AxisColor = parm("Axis Color");
304  AxisWidth = parm("Line Width").toFloat();
305  AxisScale = parm("Line Scale").toFloat();
306  AxisOffset = parm("Line Offset").toFloat();
307  AspectRatioThreshold = parm("Threshold").toFloat();
308  CreateAttrs = stringToBool(parm("Create Attr Maps"));
309  return run(mesh, DisplayHeatMap, scaleHeatMap, RangeHeat, DisplayAxis,
310  AxisColor, AxisWidth, AxisScale, AxisOffset, AspectRatioThreshold, CustomShear, CreateAttrs);
311  }
312 
313  bool run(Mesh* mesh, const QString displayHeatMap, const QString scaleHeatMap, const Point2d &rangeHeat,
314  const QString displayPCA, const QColor& axisColor, float axisLineWidth,
315  float scaleAxisLength, float axisOffset, float aspectRatioThreshold, bool customShear, bool createAttrMaps);
316 
317  private:
318  QString DisplayHeatMap;
319  QString scaleHeatMap;
320  Point2d RangeHeat;
321  QString DisplayAxis;
322  QColor AxisColor;
323  float AxisWidth;
324  float AxisScale;
325  float AxisOffset;
326  float AspectRatioThreshold;
327  bool CustomShear;
328  bool CreateAttrs;
329  };
331 
340  class mgxBase_EXPORT PCAnalysis3D : public Process
341  {
342  public:
343  PCAnalysis3D(const Process& process) : Process(process)
344  {
345  setName("Mesh/Cell Axis 3D/Shape Analysis/Compute Shape Analysis 3D");
346  setDesc("Compute the PCA of the cell shapes");
347  setIcon(QIcon(":/images/PDG.png"));
348 
349  addParm("Input","Input","Mesh Triangles", QStringList() << "Stack Voxels" << "Mesh Triangles"); // 0
350  addParm("Span Correction","Span correction can be made using pre-computed formula for regular shapes, or a percentage of the PC.",
351  "Ellipsoid", QStringList() << "Ellipsoid" << "Cuboid" << "Elliptical Cylinder" << "Maximum Span"); // 0
352 
353  //addParm("Weight","Weight","Area", QStringList() << "none" << "Area" << "Signal" << "Area*Signal"); // 0
354  //addParm("Normalize Directions","Normalize Directions","No", booleanChoice()); // 0
355  }
356 
357  bool run()
358  {
359  QString correction = parm("Span Correction").trimmed();
360  Point3d correctingFactor;
361  if(correction == "Ellipsoid")
362  correctingFactor = sqrt(5);
363  else if(correction == "Cuboid")
364  correctingFactor = sqrt(3);
365  else if(correction == "Elliptical Cylinder")
366  correctingFactor = Point3d(sqrt(3), sqrt(4), sqrt(4));
367  else if(correction == "Maximum Span")
368  correctingFactor = 0;
369  else if(correction.endsWith('%')) {
370  QString cor = correction.left(correction.size() - 1);
371  bool ok;
372  float cr = cor.toFloat(&ok);
373  if(ok) {
374  correctingFactor = -cr / 100.f;
375  } else {
376  setErrorMessage(QString("Error, percentage value is not valid: '%1'").arg(cor));
377  return false;
378  }
379  } else {
380  bool ok;
381  float cr = correction.toFloat(&ok);
382  if(ok)
383  correctingFactor = cr;
384  else {
385  QStringList vs = correction.split(QRegExp("[ ,-;:-]"));
386  if(vs.size() == 3) {
387  correctingFactor.x() = vs[0].toDouble(&ok);
388  if(!ok) {
389  setErrorMessage(QString("Invalid x value for correction factor: '%1'.").arg(vs[0]));
390  return false;
391  }
392  correctingFactor.y() = vs[1].toDouble(&ok);
393  if(!ok) {
394  setErrorMessage(QString("Invalid y value for correction factor: '%1'.").arg(vs[1]));
395  return false;
396  }
397  correctingFactor.z() = vs[2].toDouble(&ok);
398  if(!ok) {
399  setErrorMessage(QString("Invalid z value for correction factor: '%1'.").arg(vs[2]));
400  return false;
401  }
402  } else {
403  setErrorMessage(QString("Invalid correction string '%1', expected one of 'Ellipsoid'"
404  ", 'Cuboid', 'Elliptical Cylinder', Maximum Span', a percentage, a single "
405  "value or three values"));
406  return false;
407  }
408  }
409  }
410  bool draw_result = false;
411  Mesh* m = currentMesh();
412  bool res = run(m, correctingFactor, parm("Input"));
413  if(res and draw_result) {
414  m->setShowSurface();
415  m->setShowLabel("Label");
416  }
417  return res;
418  }
419 
420  bool run(Mesh* m, Point3d correctingFactor, QString inputMode);
421 
422  };
423 
427  class mgxBase_EXPORT DisplayPCA3D : public Process
428  {
429  public:
430  enum ParmNames { pDisplayHeatMap, pScaleHeatMap, pRangeHeatLow, pRangeHeatHigh, pDisplayAxis,
431  pAxisColor, pAxisWidth, pAxisScale, pAxisOffset, pAspectRatioThreshold, pNumParms};
432 
433  DisplayPCA3D(const Process& process) : Process(process)
434  {
435  setName("Mesh/Cell Axis 3D/Shape Analysis/Display Shape Axis 3D");
436  setDesc("Display the PCA based shape axes directions");
437  setIcon(QIcon(":/images/PDG.png"));
438 
439  addParm("Heatmap","Display shape values as a heat map. Product = Max*Mid*Min","Product",
440  QStringList() << "None" << "Max" << "Mid" << "Min" << "Elongation (Max/Mid)" << "Flatness (Mid/Min)" << "Max/Min"
441  << "Product" << "Shape Anisotropy" << "Custom X" << "Custom Y" << "Custom Z");
442  addParm("ScaleHeat","Scale heat map","Auto", QStringList() << "None" << "Auto" << "Manual");
443  addParm("Heat min","High bound heat map","1");
444  addParm("Heat max","Low bound heat map","3");
445  addParm("Show Axis","Draw pca directions as vectors.","All", QStringList()
446  << "All" << "Max" << "Mid" << "Min" << "Custom All" << "Custom X" << "Custom Y" << "Custom Z" << "None"); // 4
447  addParm("Axis Color","Color used to draw pca","white", QColor::colorNames());
448  addParm("Line Width","Line Width","2.0");
449  addParm("Line Scale","Length of the vectors = Scale * Strain.","1.0");
450  addParm("Line Offset","Draw the vector ends a bit tilted up for proper display on surfaces.","0.0");
451  addParm("Threshold","Minimal value of aspect ratio (= PCAMax/PCAMin) required for drawing PCA.","0.0");
452  addParm("Create Attr Maps","Create Attribute Maps for all heat map options","No", booleanChoice());
453  }
454 
455  // Process the parameters
456  void processParms();
457 
458  bool run()
459  {
460  if(!checkState().mesh(MESH_NON_EMPTY))
461  return false;
462  return run(currentMesh());
463  }
464 
465  bool run(Mesh* mesh)
466  {
467  processParms();
468  return run(mesh, DisplayHeatMap, ScaleHeatMap, RangeHeat, DisplayAxis,
469  AxisColor, AxisWidth, AxisScale, AxisOffset, AspectRatioThreshold, attrMaps);
470  }
471 
472  bool run(Mesh* mesh, const QString displayHeatMap, const QString scaleHeatMap, const Point2d &rangeHeat,
473  const QString displayPCA, const QColor& axisColor, float axisLineWidth,
474  float scaleAxisLength, float axisOffset, float aspectRatioThreshold, bool attrMaps);
475 
476  private:
477  QString DisplayHeatMap;
478  QString ScaleHeatMap;
479  Point2d RangeHeat;
480  QString DisplayAxis;
481  QColor AxisColor;
482  float AxisWidth;
483  float AxisScale;
484  float AxisOffset;
485  float AspectRatioThreshold;
486  bool attrMaps;
487  };
488 }
489 
490 #endif
mgx::PCAnalysis3D::PCAnalysis3D
PCAnalysis3D(const Process &process)
Definition: PCAnalysis.hpp:343
mgx::PCAnalysis2D
Definition: PCAnalysis.hpp:151
mgx::PCAnalysis3D
Definition: PCAnalysis.hpp:340
mgx::DisplayPCA3D::DisplayPCA3D
DisplayPCA3D(const Process &process)
Definition: PCAnalysis.hpp:433
Process.hpp
mgx::DisplayPCA::pScaleHeatMap
@ pScaleHeatMap
Definition: PCAnalysis.hpp:263
Information.hpp
mgx::Mesh::setShowLabel
void setShowLabel(const QString &s="", bool setView=true)
Set the surface label display.
Definition: Mesh.hpp:621
mgx::DisplayPCA::DisplayPCA
DisplayPCA(const Process &process)
Definition: PCAnalysis.hpp:266
mgx::DisplayPCA3D::ParmNames
ParmNames
Definition: PCAnalysis.hpp:430
mgx::Vector::z
CU_HOST_DEVICE void z(const T &v)
Short access to the third element.
Definition: Vector.hpp:739
mgx::Stack::currentStore
const Store * currentStore() const
Returns the current store.
Definition: Stack.hpp:120
mgx::DisplayPCAOld::DisplayPCAOld
DisplayPCAOld(const Process &process)
Definition: PCAnalysis.hpp:200
mgx::Mesh::setShowSurface
void setShowSurface(bool val=true)
Show the surface to the user.
Definition: Mesh.hpp:594
mgx::DisplayPCA::run
bool run()
Runs the process.
Definition: PCAnalysis.hpp:290
mgx::DisplayPCA3D::run
bool run()
Runs the process.
Definition: PCAnalysis.hpp:458
mgx::PCAnalysis
Definition: PCAnalysis.hpp:33
mgx::Stack
Definition: Stack.hpp:33
mgx::PCAnalysis::run
bool run()
Runs the process.
Definition: PCAnalysis.hpp:54
mgx
Distributed matrix library.
Definition: Assert.hpp:26
mgx::DisplayPCAOld
Definition: PCAnalysis.hpp:194
mgx::DisplayPCA
Definition: PCAnalysis.hpp:260
mgx::Process
Definition: Process.hpp:219
mgx::DisplayPCAOld::pScaleHeatMap
@ pScaleHeatMap
Definition: PCAnalysis.hpp:197
mgx::Point3f
Vector< 3, float > Point3f
Definition: CuttingSurface.hpp:25
mgx::stringToBool
mgx_EXPORT bool stringToBool(const QString &string)
Helper function converting a string into a boolean.
mgx::Point3d
Vector< 3, double > Point3d
Definition: Geometry.hpp:56
mgx::Vector::y
CU_HOST_DEVICE void y(const T &v)
Short access to the second element.
Definition: Vector.hpp:730
mgx::PCAnalysis::PCAnalysis
PCAnalysis(const Process &process)
Definition: PCAnalysis.hpp:36
mgx::DisplayPCA3D::pScaleHeatMap
@ pScaleHeatMap
Definition: PCAnalysis.hpp:430
mgx::DisplayPCA3D::run
bool run(Mesh *mesh)
Definition: PCAnalysis.hpp:465
mgx::DisplayPCAOld::ParmNames
ParmNames
Definition: PCAnalysis.hpp:197
mgx::DisplayPCAOld::run
bool run(Mesh *mesh)
Definition: PCAnalysis.hpp:233
mgx::Mesh
Definition: Mesh.hpp:54
mgx::Point2d
Vector< 2, double > Point2d
Definition: Geometry.hpp:55
mgx::PCAnalysis2D::PCAnalysis2D
PCAnalysis2D(const Process &process)
Definition: PCAnalysis.hpp:154
mgx::PCAnalysis3D::run
bool run()
Runs the process.
Definition: PCAnalysis.hpp:357
mgx::DisplayPCAOld::run
bool run()
Runs the process.
Definition: PCAnalysis.hpp:226
mgx::Vector< 3, float >
mgx::DisplayPCA::ParmNames
ParmNames
Definition: PCAnalysis.hpp:263
mgx::Stack::id
int id() const
Id of a stack.
Definition: Stack.hpp:57
mgx::Vector::x
CU_HOST_DEVICE void x(const T &v)
Short access to the first element.
Definition: Vector.hpp:721
mgx::PCAnalysis2D::run
bool run()
Runs the process.
Definition: PCAnalysis.hpp:171
mgx::AttrMap< int, float >
mgx::ScaleHeatMap
Clear label to parent mapping.
Definition: MeshProcessHeatMap.hpp:391
mgx::DisplayPCA3D
Definition: PCAnalysis.hpp:427
mgx::DisplayPCA::run
bool run(Mesh *mesh)
Definition: PCAnalysis.hpp:297
mgx::Store
Definition: Store.hpp:33