MorphoGraphX  2.0-1-227
RootCellAnalyzing.hpp
Go to the documentation of this file.
1 //
2 // This file is part of 3DCellAtlas.
3 // Copyright (C) 2015 George W. Bassel and collaborators.
4 //
5 // If you use 3DCellAtlas in your work, please cite:
6 // http://dx.doi.org/10.1105/tpc.15.00175
7 //
8 // 3DCellAtlas is an AddOn for MorphoGraphX - http://www.MorphoGraphX.org
9 // Copyright (C) 2012-2015 Richard S. Smith and collaborators.
10 //
11 // 3DCellAtlas and MorphoGraphX are free software, and are licensed under under the terms of the
12 // GNU General (GPL) Public License version 2.0, http://www.gnu.org/licenses.
13 //
14 #ifndef RootCellAnalyzing_H
15 #define RootCellAnalyzing_H
16 
17 #include <CellAtlasConfig.hpp>
18 
19 #include "RootCellProcessing.hpp"
20 #include <math.h>
21 #include "Progress.hpp"
22 #include <Triangulate.hpp>
23 
24 #define PI 3.14159265
25 
26 using namespace std;
27 
28 namespace mgx {
29 
31 {
32 public:
33 
36 
37  std::map<int,double> arclengths;
38  std::map<int,double> arclengthsUM;
39  std::map<int,double> arclengthsMinUM;
40  std::map<int,double> arclengthsMaxUM;
41  std::map<int,Point3d> diffBezInterp;
42  std::map<int,Point3d> bezInterp;
43  std::map<int,double> azimCoord, radialDis, scaledRadialDis, outsideWallArea, nrNeighbors;
44 
45  double bezLength;
46 
47  std::map<int,Point3d> cellCentroids;
48  std::vector<int> uniqueLabels;
49 
50  std::map<int,double> lengthLong, lengthRad, lengthCirc;
51  std::map<int, Point3d> dirRad, dirLong, dirCirc;
52 
56 
57  static const int radRes = 200;
58  std::map<std::pair<int,int>, double> surfaceMap; // map of binned [bezIdx,circumferential] to distance of surface
59 
60  RootCellAnalyzing(CellAtlasAttr *cellAtlasAttr, CellAtlasConfigAttr *cellAtlasConfigAttr): data(cellAtlasAttr), config(cellAtlasConfigAttr) {}
61 
62  bool analyzeCells(std::vector<int>& uniqueLabels, const vvGraph& segmentedMesh, const vvGraph& surfaceMesh, std::map<int, Point3d>& bMap,
63  std::map<int, Point3d>& diffbMap, labelVertexMap& lvMap, RootCellProcessing& rcp, int firstLabel, double minVolume);
64 
65  void analyzeBezierGrid(std::vector<int>& uniqueLabels, std::map<int,Point3d>& cellCentroids,
66  std::vector<std::vector<Point3d> >& bezier, std::map<int,Point3d>& nearestPoints, std::map<int,Point2i>& nearestIndex);
67 
68  void analyzeSurface(std::vector<int>& uniqueLabels, std::map<int,Point3d>& cellCentroids, const vvGraph& surfaceMesh,
69  std::map<int,Point3d>& nearestSurfacePoints);
70 
71 
72  bool createCartesianCoordSystem(RootCellProcessing& rcp);
73 
74  bool createLayerCoordSystem(const vvGraph& surfaceMesh, std::vector<std::vector<Point3d> >& bezier, RootCellProcessing& rcp);
75 
76  bool createRootCoordSystem(const vvGraph& surfaceMesh, std::map<int, Point3d>& bMap,
77  std::map<int, Point3d>& diffbMap, RootCellProcessing& rcp);
78 
79  // analyzes the root based on: Bezier, segmented mesh and surface mesh
80  // creates multiple outputs:
81  // cellTriangles: map of label -> unique triangles
82  // cellCentroids: center of all cells
83  bool analyzeEmbryo(std::vector<int>& uniqueLabels, const vvGraph& segmentedMesh,
84  const vvGraph& surfaceMesh, std::vector<std::vector<Point3d> >& bezGrid, std::map<int, Point3d>& bMap, std::map<int, Point3d>& diffbMap, labelVertexMap& lvMap,
85  RootCellProcessing& rootDataBox, int firstLabel, double minVolume, QString mode);
86 
87  bool generateLabelTriangleMap(int numCells, std::vector<int>& uniqueLabels, const vvGraph& segmentedMesh, labelVertexMap& lvMap, std::map<int, triVector>& cellTriangles);
88 
89  // calculates an interpolated bezier and the longitudianl ("arclengths") coordinates of the cells
90  void analyzeBezierLine(std::vector<int>& uniqueLabels, std::map<int, Point3d>& cellCentroids, std::map<int, Point3d>& bMap, std::map<int, Point3d>& diffbMap, bool flipBezier = false);
91 
92  // calc distance of each cell to surface mesh
93  bool analyzeCellCalcDisSurface(RootCellProcessing& rcp, const vvGraph& surfaceMesh, bool checkArc, std::map<int, double>& surfaceArclengths,
94  std::map<int, double>& surfaceRadialDis, std::map<int, Point3d>& bMap, bool considerOrientation = false);
95 
96  // calc centroids and volume, mark bad cells
97  bool analyzeCellCentroidsVolumes(std::map<int, triVector>& cellTriangles, RootCellProcessing& rcp, double minVolume);
98 
99  // 2D version, calc centroids and volume (now area), mark bad cells
100  bool analyzeCellCentroids2D(std::map<int, triVector>& cellTriangles, RootCellProcessing& rcp);
101 
102  void calcCircumferentialEqual(std::vector<int>& uniqueLabels, std::map<int, Point3d>& cellCentroids);
103 
104  // write data to rcp
105  void writeDataFields(RootCellProcessing& rcp);
106 
107  void calcSimpleRadial(std::vector<int>& uniqueLabels, RootCellProcessing& rcp, std::map<int, Point3d>& cellCentroids);
108 
109  void calcCoordSystemCartesian(std::vector<int>& uniqueLabels);
110 
111  void calcCoordSystem(std::vector<int>& uniqueLabels, std::map<int,Point3d>& diffBezInterp, std::map<int,Point3d>& dirRad, std::map<int,Point3d>& dirLong, std::map<int,Point3d>& dirCirc);
112 
113 
114  void createCoordSystem(std::vector<Point3d>& points, RootCellProcessing& rcp, std::map<int, Point3d>& bMap,
115  std::map<int, Point3d>& diffbMap, std::map<int, Point3d>& bMapRadRef);
116 
117  void minMaxToBezierPerCell(vvGraph& S, std::vector<int>& uniqueLabels, std::map<int, Point3d>& bMap, bool flipBezier = false);
118 
119  Point3d organToCartesianCoords(Point3d organCoords, primDataStructure& p1);//, triVector& meshTris, std::map<int, Point3d>& bMap, std::map<int, Point3d>& diffbMap,
120  // std::map<int, Point3d>& bMapRadRef);
121 
122 
123  Point3d cartesianToOrganCoords(Point3d cartesianCoords, primDataStructure p1);//std::map<int, Point3d>& bMap, std::map<int, Point3d>& diffbMap, std::map<int, Point3d>& bMapRadRef);
124 
125  bool generateMeshTriangleVector(const vvGraph& S, triVector& triVec);
126 
127  Point3d organToCartesianCoordsWithMap(Point3d organCoords, primDataStructure& p1);//triVector& meshTris, std::map<int, Point3d>& bMap,
128  // std::map<int, Point3d>& diffbMap, std::map<int, Point3d>& bMapRadRef);
129 
130 
131  void generateSurfaceMap(primDataStructure& p1);//std::map<int, Point3d>& bMap, triVector& triVec, std::map<int, Point3d>& diffbMap, std::map<int, Point3d>& bMapRadRef);
132 
133  void estimateAllCellLengths(RootCellProcessing& rcp, std::map<int, triVector>& cellTriangles);
134 
135 private:
136  std::map<int, bool> badCells;
137 };
138 
139 }
140 
141 #endif
mgx::RootCellProcessing
Definition: RootCellProcessing.hpp:408
mgx::RootCellAnalyzing
Definition: RootCellAnalyzing.hpp:30
mgx::RootCellAnalyzing::firstLabel
int firstLabel
Definition: RootCellAnalyzing.hpp:53
mgx::RootCellAnalyzing::scaledRadialDis
std::map< int, double > scaledRadialDis
Definition: RootCellAnalyzing.hpp:43
mgx::RootCellAnalyzing::data
CellAtlasAttr * data
Definition: RootCellAnalyzing.hpp:34
mgx::RootCellAnalyzing::bezInterp
std::map< int, Point3d > bezInterp
Definition: RootCellAnalyzing.hpp:42
mgx::RootCellAnalyzing::diffBezInterp
std::map< int, Point3d > diffBezInterp
Definition: RootCellAnalyzing.hpp:41
RootCellProcessing.hpp
mgx
Distributed matrix library.
Definition: Assert.hpp:26
mgx::labelVertexMap
std::map< int, std::vector< vertex > > labelVertexMap
Definition: CellAtlasUtils.hpp:16
mgx::primDataStructure
Definition: RootCellProcessing.hpp:27
mgx::RootCellAnalyzing::lengthRad
std::map< int, double > lengthRad
Definition: RootCellAnalyzing.hpp:50
Triangulate.hpp
mgx::RootCellAnalyzing::config
CellAtlasConfigAttr * config
Definition: RootCellAnalyzing.hpp:35
mgx::RootCellAnalyzing::surfaceMap
std::map< std::pair< int, int >, double > surfaceMap
Definition: RootCellAnalyzing.hpp:58
CellAtlas_EXPORT
#define CellAtlas_EXPORT
Definition: CellAtlasConfig.hpp:26
mgx::RootCellAnalyzing::bezLength
double bezLength
Definition: RootCellAnalyzing.hpp:45
mgx::RootCellAnalyzing::RootCellAnalyzing
RootCellAnalyzing(CellAtlasAttr *cellAtlasAttr, CellAtlasConfigAttr *cellAtlasConfigAttr)
Definition: RootCellAnalyzing.hpp:60
mgx::RootCellAnalyzing::arclengths
std::map< int, double > arclengths
Definition: RootCellAnalyzing.hpp:37
mgx::triVector
std::vector< Triangle > triVector
Definition: GraphUtils.hpp:23
mgx::RootCellAnalyzing::arclengthsMaxUM
std::map< int, double > arclengthsMaxUM
Definition: RootCellAnalyzing.hpp:40
mgx::RootCellAnalyzing::cellCentroids
std::map< int, Point3d > cellCentroids
Definition: RootCellAnalyzing.hpp:47
mgx::RootCellAnalyzing::firstRad
Point3d firstRad
Definition: RootCellAnalyzing.hpp:55
mgx::RootCellAnalyzing::arclengthsMinUM
std::map< int, double > arclengthsMinUM
Definition: RootCellAnalyzing.hpp:39
Progress.hpp
mgx::Vector< 3, double >
mgx::RootCellAnalyzing::arclengthsUM
std::map< int, double > arclengthsUM
Definition: RootCellAnalyzing.hpp:38
mgx::RootCellAnalyzing::dirRad
std::map< int, Point3d > dirRad
Definition: RootCellAnalyzing.hpp:51
mgx::RootCellAnalyzing::firstLong
Point3d firstLong
Definition: RootCellAnalyzing.hpp:54
CellAtlasConfig.hpp
mgx::generateLabelTriangleMap
mgx_EXPORT void generateLabelTriangleMap(const vvGraph &S, std::map< int, triVector > &cellTriangles)
goes through all triangles of the vvGraph and builds up a map from label to triangle vector
mgx::RootCellAnalyzing::uniqueLabels
std::vector< int > uniqueLabels
Definition: RootCellAnalyzing.hpp:48
mgx::VVGraph< VertexData, EdgeData >
mgx::AttrMap
Attribute map wraps std::map.
Definition: Attributes.hpp:686