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 }
OpenMEEG::Interface
Interface class An interface is a closed-shape composed of oriented meshes (here pointer to meshes)
Definition: interface.h:72
OpenMEEG::Geometry::has_cond
const bool & has_cond() const
Definition: geometry.h:94
OpenMEEG::Domains
std::vector< Domain > Domains
A vector of Domain is called Domains.
Definition: domain.h:129
OpenMEEG::Geometry::iterator
Meshes::iterator iterator
Default iterator of a Geometry is an Iterator on the meshes.
Definition: geometry.h:72
OpenMEEG::Geometry::geo_group
const std::vector< Strings > & geo_group() const
Definition: geometry.h:134
OpenMEEG::Geometry::meshes_
Meshes meshes_
Definition: geometry.h:147
OpenMEEG::Geometry::nb_current_barrier_triangles_
size_t nb_current_barrier_triangles_
number of triangles with 0 normal current. Including triangles of invalid meshes.
Definition: geometry.h:159
OpenMEEG::Geometry::domain_end
Domains::iterator domain_end()
Definition: geometry.h:86
OpenMEEG::Vertices
std::vector< Vertex > Vertices
Definition: vertex.h:73
OpenMEEG::Geometry::size
size_t size() const
the total number of vertices + triangles
Definition: geometry.h:102
OpenMEEG::Geometry::domains
const Domains & domains() const
returns the geometry domains
Definition: geometry.h:101
triangle.h
OpenMEEG::Geometry::nb_domains
size_t nb_domains() const
Definition: geometry.h:105
OpenMEEG::Geometry::nb_current_barrier_triangles
size_t & nb_current_barrier_triangles()
Definition: geometry.h:132
OpenMEEG::Geometry::sigma_diff
double sigma_diff(const Mesh &m) const
OpenMEEG::Geometry::import_meshes
void import_meshes(const Meshes &m)
imports meshes from a list of meshes
OpenMEEG::Geometry::domain_end
Domains::const_iterator domain_end() const
Definition: geometry.h:87
OpenMEEG::Geometry::is_nested_
bool is_nested_
Definition: geometry.h:150
OpenMEEG::Domain
a Domain is a vector of HalfSpace A Domain is the intersection of simple domains (of type HalfSpace).
Definition: domain.h:79
OpenMEEG::Geometry::domain
const Domain & domain(const std::string &id) const
returns the Domain called id
OpenMEEG::Geometry::mesh
const Mesh & mesh(const std::string &id) const
OpenMEEG::Geometry::VersionId
VersionId
Definition: geometry.h:67
OpenMEEG::Geometry::Geometry
Geometry(const std::string &geomFileName, const std::string &condFileName="", const bool OLD_ORDERING=false)
Definition: geometry.h:91
OpenMEEG::Geometry::sigma_inv
double sigma_inv(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:119
OpenMEEG::Geometry::oriented
int oriented(const Mesh &, const Mesh &) const
OpenMEEG::Geometry::read
void read(const std::string &geomFileName, const std::string &condFileName="", const bool OLD_ORDERING=false)
OpenMEEG::Mesh
Mesh class.
Definition: mesh.h:85
OpenMEEG::Geometry::vertices_
Vertices vertices_
Definition: geometry.h:146
OpenMEEG::Geometry::nb_current_barrier_triangles
const size_t & nb_current_barrier_triangles() const
handle multiple 0 conductivity domains
Definition: geometry.h:131
OpenMEEG::Geometry::domain_begin
Domains::iterator domain_begin()
Definition: geometry.h:84
OpenMEEG::Geometry::begin
const_iterator begin() const
Definition: geometry.h:77
OpenMEEG::Geometry::mesh
Mesh & mesh(const std::string &id)
returns the Mesh called id
OpenMEEG
Definition: analytics.h:45
OpenMEEG::Geometry::vertex_end
Vertices::const_iterator vertex_end() const
Definition: geometry.h:83
OpenMEEG::Domain::sigma
double & sigma()
The conductivity of the domain.
Definition: domain.h:96
OpenMEEG::Geometry::is_nested
const bool & is_nested() const
Definition: geometry.h:95
OpenMEEG::Vect3
Vect3.
Definition: vect3.h:62
OpenMEEG::Geometry::begin
iterator begin()
Iterators.
Definition: geometry.h:76
OpenMEEG::Geometry::sigma
double sigma(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:118
OpenMEEG::Geometry::domain
const Domain & domain(const Vect3 &p) const
returns the Domain containing the point p
OpenMEEG::Geometry::nb_meshes
size_t nb_meshes() const
Definition: geometry.h:106
OpenMEEG::Geometry::vertices
const Vertices & vertices() const
returns the geometry vertices
Definition: geometry.h:99
OpenMEEG::Geometry::invalid_vertices_
std::set< Vertex > invalid_vertices_
handle multiple 0 conductivity domains
Definition: geometry.h:158
interface.h
OpenMEEG::Geometry::const_iterator
Meshes::const_iterator const_iterator
Definition: geometry.h:73
OpenMEEG::Geometry::version
VersionId version() const
Definition: geometry.h:69
OpenMEEG::Geometry::common_domains
const Domains common_domains(const Mesh &, const Mesh &) const
OpenMEEG::Geometry::has_cond_
bool has_cond_
Definition: geometry.h:149
OpenMEEG::Geometry::domain_begin
Domains::const_iterator domain_begin() const
Definition: geometry.h:85
OpenMEEG::Geometry::Function
Function
Definition: geometry.h:140
OpenMEEG::Geometry
Geometry contains the electrophysiological model Here are stored the vertices, meshes and domains.
Definition: geometry.h:61
mesh.h
OpenMEEG::Geometry::check
bool check(const Mesh &m) const
check if m intersect geometry meshes
OpenMEEG::Geometry::vertex_end
Vertices::iterator vertex_end()
Definition: geometry.h:82
OpenMEEG::Geometry::innermost_interface
const Interface & innermost_interface() const
returns the innermost interface (only valid for nested geometries).
OpenMEEG::Geometry::version_id
VersionId version_id
Members.
Definition: geometry.h:145
vertex.h
OpenMEEG::Geometry::size_
size_t size_
Definition: geometry.h:151
om_common.h
OpenMEEG::Matrix
Matrix class.
Definition: matrix.h:61
OpenMEEG::Geometry::sigma
double sigma(const std::string &) const
domain.h
file containing the definition of a Domain.
OpenMEEG::Geometry::meshes
const Meshes & meshes() const
returns the geometry meshes
Definition: geometry.h:100
OpenMEEG::Geometry::interface
const Interface & interface(const std::string &id) const
returns the Interface called id
OpenMEEG::Geometry::selfCheck
bool selfCheck() const
the geometry meshes intersect each other
OpenMEEG::Meshes
std::vector< Mesh > Meshes
A vector of Mesh is called Meshes.
Definition: mesh.h:309
OpenMEEG::Geometry::geo_group_
std::vector< Strings > geo_group_
Mesh names that belong to different isolated groups.
Definition: geometry.h:160
OpenMEEG::Geometry::vertex_begin
Vertices::const_iterator vertex_begin() const
Definition: geometry.h:81
OpenMEEG::Geometry::load_vtp
void load_vtp(const std::string &filename)
Definition: geometry.h:126
OpenMEEG::Geometry::end
const_iterator end() const
Definition: geometry.h:79
OpenMEEG::Geometry::check_inner
bool check_inner(const Matrix &m) const
check if dipoles are outside of geometry meshes
OpenMEEG::Geometry::INVERSE
@ INVERSE
Definition: geometry.h:140
OpenMEEG::Geometry::info
void info(const bool verbous=false) const
Print information on the geometry.
OpenMEEG::Geometry::Geometry
Geometry()
Constructors.
Definition: geometry.h:90
OpenMEEG::Geometry::nb_triangles
size_t nb_triangles() const
Definition: geometry.h:104
OpenMEEG::Geometry::domains_
Domains domains_
Definition: geometry.h:148
OpenMEEG::Geometry::nb_vertices
size_t nb_vertices() const
Definition: geometry.h:103
OpenMEEG::Geometry::nb_invalid_vertices
const size_t nb_invalid_vertices()
Definition: geometry.h:133
OpenMEEG::Geometry::sigma
const double & sigma(const Domain &d) const
Definition: geometry.h:117
OpenMEEG::Geometry::generate_indices
void generate_indices(const bool)
OpenMEEG::Geometry::vertex_begin
Vertices::iterator vertex_begin()
Definition: geometry.h:80
OpenMEEG::GeometryReader
A class to read geometry and cond file.
Definition: geometry_reader.h:52
OpenMEEG::Geometry::mark_current_barrier
void mark_current_barrier()
OpenMEEG::Geometry::indicator
double indicator(const Mesh &m1, const Mesh &m2) const
Definition: geometry.h:120
OpenMEEG::Geometry::end
iterator end()
Definition: geometry.h:78
OpenMEEG::Geometry::outermost_interface
const Interface & outermost_interface() const
returns the outermost interface (only valid for nested geometries).
OpenMEEG::Geometry::funct_on_domains
double funct_on_domains(const Mesh &, const Mesh &, const Function &) const