1
|
1 /*
|
|
2 Copyright 2009-2010 Stéphane De Mita, Mathieu Siol
|
|
3
|
|
4 This file is part of the EggLib library.
|
|
5
|
|
6 EggLib is free software: you can redistribute it and/or modify
|
|
7 it under the terms of the GNU General Public License as published by
|
|
8 the Free Software Foundation, either version 3 of the License, or
|
|
9 (at your option) any later version.
|
|
10
|
|
11 EggLib is distributed in the hope that it will be useful,
|
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14 GNU General Public License for more details.
|
|
15
|
|
16 You should have received a copy of the GNU General Public License
|
|
17 along with EggLib. If not, see <http://www.gnu.org/licenses/>.
|
|
18 */
|
|
19
|
|
20 #ifndef EGGLIB_DATAMATRIX_HPP
|
|
21 #define EGGLIB_DATAMATRIX_HPP
|
|
22
|
|
23
|
|
24 #include "CharMatrix.hpp"
|
|
25
|
|
26
|
|
27 namespace egglib {
|
|
28
|
|
29 /** \brief Data table
|
|
30 *
|
|
31 * \ingroup core
|
|
32 *
|
|
33 * Holds a data matrix representing genotype data from simulations.
|
|
34 * Data are stored as integers, to each site is associated a
|
|
35 * position, and to each sequence is associated a group index (any
|
|
36 * integer labelling, for example, a subpopulation). Supports the
|
|
37 * CharMatrix interface with the condition that allele genotype
|
|
38 * datum is >=0 and <=9.
|
|
39 *
|
|
40 */
|
|
41 class DataMatrix : public CharMatrix {
|
|
42
|
|
43 public:
|
|
44
|
|
45 /** \brief Default constructor
|
|
46 *
|
|
47 * The data table default dimensions are {0,0}
|
|
48 *
|
|
49 */
|
|
50 DataMatrix();
|
|
51
|
|
52
|
|
53 /** \brief Standard constructor
|
|
54 *
|
|
55 * The data table dimensions must be given.
|
|
56 * Each cell default default is 0, and each site position is 0..
|
|
57 *
|
|
58 * \param numberOfSequences number of lines of the data table.
|
|
59 * \param numberOfSites number of columns of the data table.
|
|
60 *
|
|
61 */
|
|
62 DataMatrix(unsigned int numberOfSequences, unsigned int numberOfSites);
|
|
63
|
|
64
|
|
65 /** \brief Copy constructor
|
|
66 *
|
|
67 */
|
|
68 DataMatrix(const DataMatrix&);
|
|
69
|
|
70
|
|
71 /** \brief Copy constructor
|
|
72 *
|
|
73 */
|
|
74 DataMatrix(const CharMatrix&);
|
|
75
|
|
76
|
|
77 /** \brief Assignment operator
|
|
78 *
|
|
79 */
|
|
80 virtual DataMatrix& operator=(const DataMatrix&);
|
|
81
|
|
82
|
|
83 /** \brief Assignment operator
|
|
84 *
|
|
85 */
|
|
86 virtual DataMatrix& operator=(const CharMatrix&);
|
|
87
|
|
88
|
|
89 /** \brief Destructor
|
|
90 *
|
|
91 */
|
|
92 virtual ~DataMatrix();
|
|
93
|
|
94
|
|
95 /** \brief Gets number of sites
|
|
96 *
|
|
97 */
|
|
98 unsigned int numberOfSites() const;
|
|
99
|
|
100
|
|
101 /** \brief Gets number of sequences
|
|
102 *
|
|
103 */
|
|
104 unsigned int numberOfSequences() const;
|
|
105
|
|
106
|
|
107 /** \brief Sets a value of the data table
|
|
108 *
|
|
109 */
|
|
110 void set(unsigned int sequence, unsigned int site, int value);
|
|
111
|
|
112
|
|
113 /** \brief Gets a value from the data table
|
|
114 *
|
|
115 */
|
|
116 int get(unsigned int sequence, unsigned int site) const;
|
|
117
|
|
118
|
|
119 /** \brief Faster and unsecure version of get
|
|
120 *
|
|
121 */
|
|
122 inline int fget(unsigned int sequence, unsigned int site) const {
|
|
123 return dataMatrix[sequence][site];
|
|
124 }
|
|
125
|
|
126
|
|
127 /** \brief Sets the position of a site
|
|
128 *
|
|
129 */
|
|
130 void sitePosition(unsigned int site, double value);
|
|
131
|
|
132
|
|
133 /** \brief Gets the position of a site
|
|
134 *
|
|
135 */
|
|
136 double sitePosition(unsigned int site) const;
|
|
137
|
|
138
|
|
139 /** \brief Sets the group label of a sequence
|
|
140 *
|
|
141 */
|
|
142 void populationLabel(unsigned int sequence, unsigned int value);
|
|
143
|
|
144
|
|
145 /** \brief Gets the group label of a sequence
|
|
146 *
|
|
147 */
|
|
148 unsigned int populationLabel(unsigned int sequence) const;
|
|
149
|
|
150
|
|
151 /** \brief Removes all information from the object
|
|
152 *
|
|
153 */
|
|
154 void clear();
|
|
155
|
|
156
|
|
157 /** \brief Resizes the data matrix
|
|
158 *
|
|
159 * \param newNumberOfSequences number of sequences (rows)
|
|
160 * \param newNumberOfSites number of sites (columns)
|
|
161 *
|
|
162 * If new values are larger, data already set is left unchanged.
|
|
163 * New data are set to zero.
|
|
164 *
|
|
165 */
|
|
166 void resize(unsigned int newNumberOfSequences, unsigned int newNumberOfSites);
|
|
167
|
|
168
|
|
169 /** \brief Shifts allele value
|
|
170 *
|
|
171 * \param minimum the minimum allele value.
|
|
172 *
|
|
173 * Shifts all alleles at all sites to ensure that alleles alleles
|
|
174 * are equal to or larger than minimum. The shifting is specific
|
|
175 * to each site.
|
|
176 *
|
|
177 */
|
|
178 void shift(int minimum);
|
|
179
|
|
180 /** \brief Gets the character at a given position
|
|
181 *
|
|
182 * An exception is generated if the allele value at this
|
|
183 * position is not >=0 and <=9. Not out-of-bound check is
|
|
184 * performed.
|
|
185 *
|
|
186 */
|
|
187 char character(unsigned int sequence, unsigned int site) const;
|
|
188
|
|
189
|
|
190
|
|
191 private:
|
|
192
|
|
193 // Initializes to default values (for empty object)
|
|
194 void init();
|
|
195
|
|
196 // Copies from a source object
|
|
197 virtual void copy(const CharMatrix&);
|
|
198
|
|
199 // Copies from a source object
|
|
200 virtual void copy(const DataMatrix&);
|
|
201
|
|
202 // Number of lines of the data matrix
|
|
203 unsigned int _numberOfSequences;
|
|
204
|
|
205 // Number of columns of the data matrix
|
|
206 unsigned int _numberOfSites;
|
|
207
|
|
208 // Data matrix
|
|
209 int **dataMatrix;
|
|
210
|
|
211 // Vector of site positions
|
|
212 double *positions;
|
|
213
|
|
214 // Vector of group indices
|
|
215 unsigned int *groups;
|
|
216 };
|
|
217 }
|
|
218
|
|
219 #endif
|