OpenMEEG
geometry.h
Go to the documentation of this file.
1 /*
2 Project Name : OpenMEEG
3 
4 © INRIA and ENPC (contributors: Geoffray ADDE, Maureen CLERC, Alexandre
5 GRAMFORT, Renaud KERIVEN, Jan KYBIC, Perrine LANDREAU, Théodore PAPADOPOULO,
6 Emmanuel OLIVI
7 Maureen.Clerc.AT.inria.fr, keriven.AT.certis.enpc.fr,
8 kybic.AT.fel.cvut.cz, papadop.AT.inria.fr)
9 
10 The OpenMEEG software is a C++ package for solving the forward/inverse
11 problems of electroencephalography and magnetoencephalography.
12 
13 This software is governed by the CeCILL-B license under French law and
14 abiding by the rules of distribution of free software. You can use,
15 modify and/ or redistribute the software under the terms of the CeCILL-B
16 license as circulated by CEA, CNRS and INRIA at the following URL
17 "http://www.cecill.info".
18 
19 As a counterpart to the access to the source code and rights to copy,
20 modify and redistribute granted by the license, users are provided only
21 with a limited warranty and the software's authors, the holders of the
22 economic rights, and the successive licensors have only limited
23 liability.
24 
25 In this respect, the user's attention is drawn to the risks associated
26 with loading, using, modifying and/or developing or reproducing the
27 software by the user in light of its specific status of free software,
28 that may mean that it is complicated to manipulate, and that also
29 therefore means that it is reserved for developers and experienced
30 professionals having in-depth computer knowledge. Users are therefore
31 encouraged to load and test the software's suitability as regards their
32 requirements in conditions enabling the security of their systems and/or
33 data to be ensured and, more generally, to use and operate it in the
34 same conditions as regards security.
35 
36 The fact that you are presently reading this means that you have had
37 knowledge of the CeCILL-B license and that you accept its terms.
38 */
39 
40 #pragma once
41 
42 #include <iterator>
43 #include <string>
44 #include <vector>
45 #include <set>
46 
47 #include <om_common.h>
48 #include <vertex.h>
49 #include <triangle.h>
50 #include <mesh.h>
51 #include <interface.h>
52 #include <domain.h>
53 #include <GeometryExceptions.H>
54 
55 namespace OpenMEEG {
56 
61  class OPENMEEG_EXPORT Geometry {
62 
63  friend class GeometryReader;
64 
65  public:
66 
67  typedef enum { UNKNOWN_VERSION=-1, VERSION10, VERSION11 } VersionId;
68 
69  VersionId version() const { return version_id; }
70 
72  typedef Meshes::iterator iterator;
73  typedef Meshes::const_iterator const_iterator;
74 
76  iterator begin() { return meshes_.begin(); }
77  const_iterator begin() const { return meshes_.begin(); }
78  iterator end() { return meshes_.end(); }
79  const_iterator end() const { return meshes_.end(); }
80  Vertices::iterator vertex_begin() { return vertices_.begin(); }
81  Vertices::const_iterator vertex_begin() const { return vertices_.begin(); }
82  Vertices::iterator vertex_end() { return vertices_.end(); }
83  Vertices::const_iterator vertex_end() const { return vertices_.end(); }
84  Domains::iterator domain_begin() { return domains_.begin(); }
85  Domains::const_iterator domain_begin() const { return domains_.begin(); }
86  Domains::iterator domain_end() { return domains_.end(); }
87  Domains::const_iterator domain_end() const { return domains_.end(); }
88 
90  Geometry(): has_cond_(false), is_nested_(false), size_(0), nb_current_barrier_triangles_(0) {}
91  Geometry(const std::string& geomFileName, const std::string& condFileName = "", const bool OLD_ORDERING = false): has_cond_(false), is_nested_(false), size_(0), nb_current_barrier_triangles_(0) { read(geomFileName, condFileName, OLD_ORDERING); }
92 
93  void info(const bool verbous = false) const;
94  const bool& has_cond() const { return has_cond_; }
95  const bool& is_nested() const { return is_nested_; }
96  bool selfCheck() const;
97  bool check(const Mesh& m) const;
98  bool check_inner(const Matrix& m) const;
99  const Vertices& vertices() const { return vertices_; }
100  const Meshes& meshes() const { return meshes_; }
101  const Domains& domains() const { return domains_; }
102  size_t size() const { return size_; }
103  size_t nb_vertices() const { return vertices_.size(); }
104  size_t nb_triangles() const { return (size_-vertices_.size()); }
105  size_t nb_domains() const { return domains_.size(); }
106  size_t nb_meshes() const { return meshes_.size(); }
107 
110 
111  const Interface& interface(const std::string& id) const;
112  const Domain& domain(const std::string& id) const;
113  const Domain& domain(const Vect3& p) const;
114 
115  void import_meshes(const Meshes& m);
116 
117  const double& sigma(const Domain& d) const { return (d.sigma()); }
118  double sigma (const Mesh& m1, const Mesh& m2) const { return funct_on_domains(m1, m2, IDENTITY); } // return the (sum) conductivity(ies) of the shared domain(s).
119  double sigma_inv (const Mesh& m1, const Mesh& m2) const { return funct_on_domains(m1, m2, INVERSE); } // return the (sum) inverse of conductivity(ies) of the shared domain(s).
120  double indicator (const Mesh& m1, const Mesh& m2) const { return funct_on_domains(m1, m2, INDICATOR); } // return the (sum) indicator function of the shared domain(s).
121  double sigma_diff(const Mesh& m) const; // return the difference of conductivities of the 2 domains.
122  double sigma (const std::string&) const;
123  int oriented(const Mesh&, const Mesh&) const;
124 
125  void read(const std::string& geomFileName, const std::string& condFileName = "", const bool OLD_ORDERING = false);
126  void load_vtp(const std::string& filename) { Matrix trash; load_vtp(filename, trash, false); }
127  void load_vtp(const std::string& filename, Matrix& data, const bool READ_DATA = true);
128  void write_vtp(const std::string& filename, const Matrix& data = Matrix()) const; // optional give a dataset
129 
131  const size_t& nb_current_barrier_triangles() const { return nb_current_barrier_triangles_; }
132  size_t& nb_current_barrier_triangles() { return nb_current_barrier_triangles_; }
133  const size_t nb_invalid_vertices() { return invalid_vertices_.size(); }
134  const std::vector<Strings>& geo_group() const { return geo_group_; }
136  const Mesh& mesh(const std::string& id) const;
137 
138  private:
139 
140  typedef enum { IDENTITY, INVERSE, INDICATOR} Function;
141 
142  Mesh& mesh(const std::string& id);
143 
149  bool has_cond_;
151  size_t size_; // total number = nb of vertices + nb of triangles
152 
153  void generate_indices(const bool);
154  const Domains common_domains(const Mesh&, const Mesh&) const;
155  double funct_on_domains(const Mesh&, const Mesh&, const Function& ) const;
156 
158  std::set<Vertex> invalid_vertices_;
160  std::vector<Strings> geo_group_;
161  };
162 }
a Domain is a vector of HalfSpace A Domain is the intersection of simple domains (of type HalfSpace).
Definition: domain.h:79
double & sigma()
The conductivity of the domain.
Definition: domain.h:96
A class to read geometry and cond file.
Geometry contains the electrophysiological model Here are stored the vertices, meshes and domains.
Definition: geometry.h:61
Vertices::const_iterator vertex_begin() const
Definition: geometry.h:81
size_t size() const
the total number of vertices + triangles
Definition: geometry.h:102
Vertices::iterator vertex_end()
Definition: geometry.h:82
size_t nb_vertices() const
Definition: geometry.h:103
const bool & is_nested() const
Definition: geometry.h:95
void generate_indices(const bool)
iterator end()
Definition: geometry.h:78
size_t nb_current_barrier_triangles_
number of triangles with 0 normal current. Including triangles of invalid meshes.
Definition: geometry.h:159
void import_meshes(const Meshes &m)
imports meshes from a list of meshes
Domains::const_iterator domain_begin() const
Definition: geometry.h:85
Vertices::const_iterator vertex_end() const
Definition: geometry.h:83
double sigma_diff(const Mesh &m) const
const Interface & interface(const std::string &id) const
returns the Interface called id
bool check(const Mesh &m) const
check if m intersect geometry meshes
Domains::iterator domain_begin()
Definition: geometry.h:84
const Interface & innermost_interface() const
returns the innermost interface (only valid for nested geometries).
Vertices::iterator vertex_begin()
Definition: geometry.h:80
size_t nb_triangles() const
Definition: geometry.h:104
VersionId version() const
Definition: geometry.h:69
double sigma_inv(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:119
Meshes::iterator iterator
Default iterator of a Geometry is an Iterator on the meshes.
Definition: geometry.h:72
const bool & has_cond() const
Definition: geometry.h:94
bool selfCheck() const
the geometry meshes intersect each other
const Domains & domains() const
returns the geometry domains
Definition: geometry.h:101
Geometry(const std::string &geomFileName, const std::string &condFileName="", const bool OLD_ORDERING=false)
Definition: geometry.h:91
Mesh & mesh(const std::string &id)
returns the Mesh called id
double funct_on_domains(const Mesh &, const Mesh &, const Function &) const
std::vector< Strings > geo_group_
Mesh names that belong to different isolated groups.
Definition: geometry.h:160
const Domain & domain(const Vect3 &p) const
returns the Domain containing the point p
const std::vector< Strings > & geo_group() const
Definition: geometry.h:134
void mark_current_barrier()
iterator begin()
Iterators.
Definition: geometry.h:76
const Vertices & vertices() const
returns the geometry vertices
Definition: geometry.h:99
const Domain & domain(const std::string &id) const
returns the Domain called id
Geometry()
Constructors.
Definition: geometry.h:90
const Mesh & mesh(const std::string &id) const
void load_vtp(const std::string &filename)
Definition: geometry.h:126
const_iterator begin() const
Definition: geometry.h:77
std::set< Vertex > invalid_vertices_
handle multiple 0 conductivity domains
Definition: geometry.h:158
int oriented(const Mesh &, const Mesh &) const
Domains::iterator domain_end()
Definition: geometry.h:86
Vertices vertices_
Definition: geometry.h:146
const Meshes & meshes() const
returns the geometry meshes
Definition: geometry.h:100
const Interface & outermost_interface() const
returns the outermost interface (only valid for nested geometries).
const Domains common_domains(const Mesh &, const Mesh &) const
bool check_inner(const Matrix &m) const
check if dipoles are outside of geometry meshes
Domains::const_iterator domain_end() const
Definition: geometry.h:87
size_t nb_meshes() const
Definition: geometry.h:106
size_t nb_domains() const
Definition: geometry.h:105
Meshes::const_iterator const_iterator
Definition: geometry.h:73
double sigma(const std::string &) const
size_t & nb_current_barrier_triangles()
Definition: geometry.h:132
const_iterator end() const
Definition: geometry.h:79
double indicator(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:120
const size_t nb_invalid_vertices()
Definition: geometry.h:133
Domains domains_
Definition: geometry.h:148
const size_t & nb_current_barrier_triangles() const
handle multiple 0 conductivity domains
Definition: geometry.h:131
double sigma(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:118
void read(const std::string &geomFileName, const std::string &condFileName="", const bool OLD_ORDERING=false)
VersionId version_id
Members.
Definition: geometry.h:145
void info(const bool verbous=false) const
Print information on the geometry.
const double & sigma(const Domain &d) const
Definition: geometry.h:117
Interface class An interface is a closed-shape composed of oriented meshes (here pointer to meshes)
Definition: interface.h:72
Matrix class.
Definition: matrix.h:61
Mesh class.
Definition: mesh.h:85
Vect3.
Definition: vect3.h:62
file containing the definition of a Domain.
std::vector< Vertex > Vertices
Definition: vertex.h:73
std::vector< Mesh > Meshes
A vector of Mesh is called Meshes.
Definition: mesh.h:309
std::vector< Domain > Domains
A vector of Domain is called Domains.
Definition: domain.h:129