00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef STREETERFIBREGENERATOR_HPP_
00029 #define STREETERFIBREGENERATOR_HPP_
00030
00031 #include <vector>
00032 #include <string>
00033 #include <set>
00034 #include "DistanceMapCalculator.hpp"
00035 #include "TetrahedralMesh.hpp"
00036
00037
00038 template<unsigned SPACE_DIM>
00039 class StreeterFibreGenerator
00040 {
00041 private:
00042 TetrahedralMesh<SPACE_DIM,SPACE_DIM>& mrMesh;
00043 unsigned mNumNodes, mNumElements;
00044
00045 DistanceMapCalculator<SPACE_DIM>* mpDistanceCalculator;
00046
00047 std::string mEpiFile, mRVFile, mLVFile;
00048 bool mFilesSet;
00049
00050 std::vector<unsigned> mEpiSurface, mRVSurface, mLVSurface;
00051
00052 std::vector<double> mDistMapEpicardium, mDistMapRightVentricle, mDistMapLeftVentricle;
00053
00054 enum RegionType_
00055 {
00056 LEFT_VENTRICLE_WALL,
00057 RIGHT_VENTRICLE_WALL,
00058 LEFT_SEPTUM,
00059 RIGHT_SEPTUM,
00060 UNKNOWN
00061 };
00062
00063
00064 static const double LEFT_SEPTUM_SIZE = 2.0/3.0;
00065 static const double RIGHT_SEPTUM_SIZE = 1.0/3.0;
00066
00067
00068 inline RegionType_ GetHeartRegion (unsigned nodeIndex) const;
00069
00070 inline double GetAveragedThickness(const unsigned nodeIndex, const std::vector<double>& wallThickness) const;
00071
00072 inline void ProcessLine(const std::string& line, std::set<unsigned>& surfaceNodeIndexSet) const;
00073
00074 void GetNodesAtSurface(const std::string& surfaceFile, std::vector<unsigned>& surfaceVector) const;
00075
00076 double GetFibreMaxAngle(const c_vector<RegionType_, SPACE_DIM+1>& nodesRegion) const;
00077
00078 public:
00079 StreeterFibreGenerator(TetrahedralMesh<SPACE_DIM,SPACE_DIM>& rMesh);
00080
00081 ~StreeterFibreGenerator();
00082
00091 void SetSurfaceFiles(std::string epicardiumFile,
00092 std::string rightVentricleFile,
00093 std::string leftVentricleFile);
00094
00106 void GenerateOrthotropicFibreOrientation(std::string outputDirectory, std::string fibreOrientationFile, bool logInfo=false);
00107
00117 void CheckVentricleAlignment();
00118
00119 };
00120
00121 #endif