bpp-popgen  3.0.0
Group.cpp
Go to the documentation of this file.
1 //
2 // File Group.cpp
3 // Author : Sylvain Gaillard
4 // Last modification : Thursday July 29 2004
5 //
6 
7 /*
8  Copyright or © or Copr. Bio++ Development Team, (November 17, 2004)
9 
10 
11  This software is a computer program whose purpose is to provide classes
12  for population genetics analysis.
13 
14  This software is governed by the CeCILL license under French law and
15  abiding by the rules of distribution of free software. You can use,
16  modify and/ or redistribute the software under the terms of the CeCILL
17  license as circulated by CEA, CNRS and INRIA at the following URL
18  "http://www.cecill.info".
19 
20  As a counterpart to the access to the source code and rights to copy,
21  modify and redistribute granted by the license, users are provided only
22  with a limited warranty and the software's author, the holder of the
23  economic rights, and the successive licensors have only limited
24  liability.
25 
26  In this respect, the user's attention is drawn to the risks associated
27  with loading, using, modifying and/or developing or reproducing the
28  software by the user in light of its specific status of free software,
29  that may mean that it is complicated to manipulate, and that also
30  therefore means that it is reserved for developers and experienced
31  professionals having in-depth computer knowledge. Users are therefore
32  encouraged to load and test the software's suitability as regards their
33  requirements in conditions enabling the security of their systems and/or
34  data to be ensured and, more generally, to use and operate it in the
35  same conditions as regards security.
36 
37  The fact that you are presently reading this means that you have had
38  knowledge of the CeCILL license and that you accept its terms.
39  */
40 
41 #include "Group.h"
42 
43 using namespace bpp;
44 using namespace std;
45 
46 // ** Class constructors: ******************************************************/
47 Group::Group(size_t group_id) : id_(group_id),
48  name_(""),
49  individuals_(vector<Individual*>()) {}
50 
51 Group::Group(const Group& group) : id_(group.getGroupId()),
52  name_(group.getGroupName()),
53  // individuals_(vector<Individuals*>(group.getNumberOfIndividuals()))
54  individuals_(vector<Individual*>())
55 {
56  for (size_t i = 0; i < group.getNumberOfIndividuals(); i++)
57  {
59  }
60 }
61 
62 Group::Group(const Group& group, size_t group_id) : id_(group_id),
63  name_(group.getGroupName()),
64  individuals_(vector<Individual*>())
65 {
66  for (size_t i = 0; i < group.getNumberOfIndividuals(); i++)
67  {
69  }
70 }
71 
72 // ** Class destructor: ********************************************************/
73 
75 
76 // ** Other methodes: **********************************************************/
77 
79 {
80  setGroupId(group.getGroupId());
81  for (size_t i = 0; i < group.getNumberOfIndividuals(); i++)
82  {
84  }
85  return *this;
86 }
87 
88 void Group::setGroupId(size_t group_id)
89 {
90  id_ = group_id;
91 }
92 
93 void Group::setGroupName(const std::string& group_name)
94 {
95  name_ = group_name;
96 }
97 
99 {
100  try
101  {
103  throw BadIdentifierException("Group::addIndividual: individual id already used.", ind.getId());
104  }
105  catch (BadIdentifierException& bie)
106  {}
107  individuals_.push_back(new Individual(ind));
108 }
109 
110 void Group::addEmptyIndividual(const std::string& individual_id)
111 {
112  for (size_t i = 0; i < getNumberOfIndividuals(); i++)
113  {
114  if (individuals_[i]->getId() == individual_id)
115  throw BadIdentifierException("Group::addEmptyIndividual: individual_id already in use.", individual_id);
116  }
117  individuals_.push_back(new Individual(individual_id));
118 }
119 
120 size_t Group::getIndividualPosition(const std::string& individual_id) const
121 {
122  for (size_t i = 0; i < getNumberOfIndividuals(); i++)
123  {
124  if (individuals_[i]->getId() == individual_id)
125  return i;
126  }
127  throw IndividualNotFoundException("Group::getIndividualPosition: individual_id not found.", individual_id);
128 }
129 
130 std::unique_ptr<Individual> Group::removeIndividualById(const std::string& individual_id)
131 {
132  try
133  {
134  size_t indPos = getIndividualPosition(individual_id);
135  unique_ptr<Individual> ind(individuals_[indPos]);
136  individuals_.erase(individuals_.begin() + static_cast<ptrdiff_t>(indPos));
137  return ind;
138  }
139  catch (IndividualNotFoundException& infe)
140  {
141  throw IndividualNotFoundException("Group::removeIndividualById: individual_id not found.", individual_id);
142  }
143 }
144 
145 std::unique_ptr<Individual> Group::removeIndividualAtPosition(size_t individual_position)
146 {
147  if (individual_position >= individuals_.size())
148  throw IndexOutOfBoundsException("Group::removeIndividualAtPosition.", individual_position, 0, individuals_.size());
149  unique_ptr<Individual> ind(individuals_[individual_position]);
150  individuals_.erase(individuals_.begin() + static_cast<ptrdiff_t>(individual_position));
151  return ind;
152 }
153 
154 void Group::deleteIndividualById(const std::string& individual_id)
155 {
156  try
157  {
158  removeIndividualById(individual_id);
159  }
160  catch (IndividualNotFoundException& infe)
161  {
162  throw IndividualNotFoundException("Group::deleteIndividualById: individual_id not found.", individual_id);
163  }
164 }
165 
166 void Group::deleteIndividualAtPosition(size_t individual_position)
167 {
168  try
169  {
170  removeIndividualAtPosition(individual_position);
171  }
172  catch (IndexOutOfBoundsException& ioobe)
173  {
174  throw IndexOutOfBoundsException("Group::deleteIndividualAtPosition.", individual_position, 0, getNumberOfIndividuals());
175  }
176 }
177 
179 {
180  for (size_t i = 0; i < individuals_.size(); i++)
181  {
182  delete (individuals_[i]);
183  }
184  individuals_.clear();
185 }
186 
187 const Individual& Group::getIndividualById(const std::string& individual_id) const
188 {
189  for (size_t i = 0; i < individuals_.size(); i++)
190  {
191  if (individuals_[i]->getId() == individual_id)
192  return getIndividualAtPosition(i);
193  }
194  throw IndividualNotFoundException("Group::getIndividualById: individual_id not found.", individual_id);
195 }
196 
197 const Individual& Group::getIndividualAtPosition(size_t individual_position) const
198 {
199  if (individual_position >= individuals_.size())
200  throw IndexOutOfBoundsException("Group::getIndividualAtPosition: individual_position out of bounds.", individual_position, 0, individuals_.size());
201  return *individuals_[individual_position];
202 }
203 
205 {
206  return individuals_.size();
207 }
208 
210 {
211  size_t maxnum = 0;
212  for (size_t i = 0; i < getNumberOfIndividuals(); i++)
213  {
214  vector<size_t> seqpos = individuals_[i]->getSequencesPositions();
215  for (size_t j = 0; j < seqpos.size(); j++)
216  {
217  if (maxnum < seqpos[j])
218  maxnum = seqpos[j];
219  }
220  }
221  return maxnum + 1;
222 }
223 
224 // -- Dealing with individual's properties -----------------
225 
226 void Group::setIndividualSexAtPosition(size_t individual_position, const unsigned short sex)
227 {
228  if (individual_position >= getNumberOfIndividuals())
229  throw IndexOutOfBoundsException("Group::setIndividualSexAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
230  individuals_[individual_position]->setSex(sex);
231 }
232 
233 unsigned short Group::getIndividualSexAtPosition(size_t individual_position) const
234 {
235  if (individual_position >= getNumberOfIndividuals())
236  throw IndexOutOfBoundsException("Group::getIndividualSexAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
237  return individuals_[individual_position]->getSex();
238 }
239 
240 void Group::setIndividualDateAtPosition(size_t individual_position, const Date& date)
241 {
242  if (individual_position >= getNumberOfIndividuals())
243  throw IndexOutOfBoundsException("Group::setIndividualDateAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
244  individuals_[individual_position]->setDate(date);
245 }
246 
247 const Date& Group::getIndividualDateAtPosition(size_t individual_position) const
248 {
249  if (individual_position >= getNumberOfIndividuals())
250  throw IndexOutOfBoundsException("Group::getIndividualDateAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
251  try
252  {
253  return individuals_[individual_position]->getDate();
254  }
255  catch (NullPointerException& npe)
256  {
257  throw NullPointerException("Group::getIndividualDateAtPosition: individual has no date.");
258  }
259 }
260 
261 void Group::setIndividualCoordAtPosition(size_t individual_position, const Point2D<double>& coord)
262 {
263  if (individual_position >= getNumberOfIndividuals())
264  throw IndexOutOfBoundsException("Group::setIndividualCoordAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
265  individuals_[individual_position]->setCoord(coord);
266 }
267 
268 const Point2D<double>& Group::getIndividualCoordAtPosition(size_t individual_position) const
269 {
270  if (individual_position >= getNumberOfIndividuals())
271  throw IndexOutOfBoundsException("Group::getIndividualCoordAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
272  try
273  {
274  return individuals_[individual_position]->getCoord();
275  }
276  catch (NullPointerException& npe)
277  {
278  throw NullPointerException("Group::getIndividualCoordAtPosition: individual has no coordinates.");
279  }
280 }
281 
282 void Group::setIndividualLocalityAtPosition(size_t individual_position, const Locality<double>* locality)
283 {
284  if (individual_position >= getNumberOfIndividuals())
285  throw IndexOutOfBoundsException("Group::setIndividualLocalityAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
286  individuals_[individual_position]->setLocality(locality);
287 }
288 
289 const Locality<double>& Group::getIndividualLocalityAtPosition(size_t individual_position) const
290 {
291  if (individual_position >= getNumberOfIndividuals())
292  throw IndexOutOfBoundsException("Group::getIndividualLocalityAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
293  try
294  {
295  return *individuals_[individual_position]->getLocality();
296  }
297  catch (NullPointerException& npe)
298  {
299  throw NullPointerException("Group::getIndividualLocalityAtPosition: individuals has no locality.");
300  }
301 }
302 
303 void Group::addIndividualSequenceAtPosition(size_t individual_position, size_t sequence_position, const Sequence& sequence)
304 {
305  if (individual_position >= getNumberOfIndividuals())
306  throw IndexOutOfBoundsException("Group::addIndividualSequenceAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
307  try
308  {
309  individuals_[individual_position]->addSequence(sequence_position, sequence);
310  }
311  catch (AlphabetMismatchException& ame)
312  {
313  throw AlphabetMismatchException("Group::addIndividualSequenceAtPosition: sequence's alphabet doesn't match.", ame.getAlphabets()[0], ame.getAlphabets()[1]);
314  }
315  catch (BadIdentifierException& bie)
316  {
317  throw BadIdentifierException("Group::addIndividualSequenceAtPosition: sequence's name already in use.", bie.getIdentifier());
318  }
319  catch (BadIntegerException& bie)
320  {
321  throw BadIntegerException("Group::addIndividualSequenceAtPosition: sequence_position already in use.", bie.getBadInteger());
322  }
323 }
324 
325 const Sequence& Group::getIndividualSequenceByName(size_t individual_position, const string& sequence_name) const
326 {
327  if (individual_position >= getNumberOfIndividuals())
328  throw IndexOutOfBoundsException("Group::getIndividualSequenceByName: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
329  try
330  {
331  return individuals_[individual_position]->getSequenceByName(sequence_name);
332  }
333  catch (NullPointerException& npe)
334  {
335  throw NullPointerException("Group::getIndividualSequenceByName: no sequence data in individual.");
336  }
337  catch (SequenceNotFoundException& snfe)
338  {
339  throw SequenceNotFoundException("Group::getIndividualSequenceByName: sequence_name not found.", snfe.getSequenceId());
340  }
341 }
342 
343 const Sequence& Group::getIndividualSequenceAtPosition(size_t individual_position, size_t sequence_position) const
344 {
345  if (individual_position >= getNumberOfIndividuals())
346  throw IndexOutOfBoundsException("Group::getIndividualAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
347  try
348  {
349  return individuals_[individual_position]->getSequenceAtPosition(sequence_position);
350  }
351  catch (NullPointerException& npe)
352  {
353  throw NullPointerException("Group::getIndividualSequenceAtPosition: no sequence data in individual.");
354  }
355  catch (SequenceNotFoundException& snfe)
356  {
357  throw SequenceNotFoundException("Group::getIndividualSequenceAtPosition: sequence_position not found.", snfe.getSequenceId());
358  }
359 }
360 
361 void Group::deleteIndividualSequenceByName(size_t individual_position, const string& sequence_name)
362 {
363  if (individual_position >= getNumberOfIndividuals())
364  throw IndexOutOfBoundsException("Group::deleteIndividualSequenceByName: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
365  try
366  {
367  individuals_[individual_position]->deleteSequenceByName(sequence_name);
368  }
369  catch (NullPointerException& npe)
370  {
371  throw NullPointerException("Group::deleteSequenceByName: no sequence data in individual.");
372  }
373  catch (SequenceNotFoundException& snfe)
374  {
375  throw SequenceNotFoundException("Group::deleteSequenceByName: sequence_name not found.", snfe.getSequenceId());
376  }
377 }
378 
379 void Group::deleteIndividualSequenceAtPosition(size_t individual_position, size_t sequence_position)
380 {
381  if (individual_position >= getNumberOfIndividuals())
382  throw IndexOutOfBoundsException("Group::deleteIndividualSequenceAtPosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
383  try
384  {
385  individuals_[individual_position]->deleteSequenceAtPosition(sequence_position);
386  }
387  catch (NullPointerException& npe)
388  {
389  throw NullPointerException("Group::deleteSequenceAtPosition: no sequence data in individual.");
390  }
391  catch (SequenceNotFoundException& snfe)
392  {
393  throw SequenceNotFoundException("Group::deleteSequenceAtPosition: sequence_position not found.", snfe.getSequenceId());
394  }
395 }
396 
397 bool Group::hasIndividualSequences(size_t individual_position) const
398 {
399  if (individual_position >= getNumberOfIndividuals())
400  throw IndexOutOfBoundsException("Group::hasIndividualSequences: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
401  return individuals_[individual_position]->hasSequences();
402 }
403 
404 vector<string> Group::getIndividualSequencesNames(size_t individual_position) const
405 {
406  if (individual_position >= getNumberOfIndividuals())
407  throw IndexOutOfBoundsException("Group::getIndividualSequencesNames: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
408  try
409  {
410  return individuals_[individual_position]->getSequencesNames();
411  }
412  catch (NullPointerException& npe)
413  {
414  throw NullPointerException("Group::getSequencesNames: no sequence data in individual.");
415  }
416 }
417 
418 size_t Group::getIndividualSequencePosition(size_t individual_position, const string& sequence_name) const
419 {
420  if (individual_position >= getNumberOfIndividuals())
421  throw IndexOutOfBoundsException("Group::getIndividualSequencePosition: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
422  try
423  {
424  return individuals_[individual_position]->getSequencePosition(sequence_name);
425  }
426  catch (NullPointerException& npe)
427  {
428  throw NullPointerException("Group::getSequencePosition: no sequence data in individual.");
429  }
430  catch (SequenceNotFoundException& snfe)
431  {
432  throw SequenceNotFoundException("Group::getSequencePosition: sequence_name not found.", snfe.getSequenceId());
433  }
434 }
435 
436 size_t Group::getIndividualNumberOfSequences(size_t individual_position) const
437 {
438  if (individual_position >= getNumberOfIndividuals())
439  throw IndexOutOfBoundsException("Group::getIndividualNumberOfSequences: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
440  try
441  {
442  return individuals_[individual_position]->getNumberOfSequences();
443  }
444  catch (NullPointerException& npe)
445  {
446  throw NullPointerException("Group::getIndividualNumberOfSequences: no sequence data in individual.");
447  }
448 }
449 
450 void Group::setIndividualSequences(size_t individual_position, const MapSequenceContainer& msc)
451 {
452  if (individual_position >= getNumberOfIndividuals())
453  throw IndexOutOfBoundsException("Group::setIndividualSequences: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
454  individuals_[individual_position]->setSequences(msc);
455 }
456 
457 void Group::setIndividualGenotype(size_t individual_position, const MultilocusGenotype& genotype)
458 {
459  if (individual_position >= getNumberOfIndividuals())
460  throw IndexOutOfBoundsException("Group::setIndividualGenotype: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
461  individuals_[individual_position]->setGenotype(genotype);
462 }
463 
464 void Group::initIndividualGenotype(size_t individual_position, size_t loci_number)
465 {
466  if (individual_position >= getNumberOfIndividuals())
467  throw IndexOutOfBoundsException("Group::initIndividualGenotype: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
468  try
469  {
470  individuals_[individual_position]->initGenotype(loci_number);
471  }
472  catch (BadIntegerException& bie)
473  {
474  throw BadIntegerException("Group::initIndividualGenotype: loci_number must be > 0.", bie.getBadInteger());
475  }
476  catch (Exception&)
477  {
478  throw Exception("Group::initIndividualGenotype: individual already has a genotype.");
479  }
480 }
481 
482 void Group::deleteIndividualGenotype(size_t individual_position)
483 {
484  if (individual_position >= getNumberOfIndividuals())
485  throw IndexOutOfBoundsException("Group::deleteIndividualGenotype: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
486  individuals_[individual_position]->deleteGenotype();
487 }
488 
489 bool Group::hasIndividualGenotype(size_t individual_position) const
490 {
491  if (individual_position >= getNumberOfIndividuals())
492  throw IndexOutOfBoundsException("Group::hasIndividualGenotype: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
493  return individuals_[individual_position]->hasGenotype();
494 }
495 
496 void Group::setIndividualMonolocusGenotype(size_t individual_position, size_t locus_position, const MonolocusGenotype& monogen)
497 {
498  if (individual_position >= getNumberOfIndividuals())
499  throw IndexOutOfBoundsException("Group::setIndividualMonolocusGenotype: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
500  try
501  {
502  individuals_[individual_position]->setMonolocusGenotype(locus_position, monogen);
503  }
504  catch (NullPointerException& npe)
505  {
506  throw NullPointerException("Group::setIndividualMonolocusGenotype: individual has no genotype.");
507  }
508  catch (IndexOutOfBoundsException& ioobe)
509  {
510  throw IndexOutOfBoundsException("Group::setIndividualMonolocusGenotype: locus_position excedes the number of locus.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
511  }
512 }
513 
514 void Group::setIndividualMonolocusGenotypeByAlleleKey(size_t individual_position, size_t locus_position, const std::vector<size_t>& allele_keys)
515 {
516  if (individual_position >= getNumberOfIndividuals())
517  throw IndexOutOfBoundsException("Group::setIndividualMonolocusGenotypeByAlleleKey: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
518  try
519  {
520  individuals_[individual_position]->setMonolocusGenotypeByAlleleKey(locus_position, allele_keys);
521  }
522  catch (NullPointerException& npe)
523  {
524  throw NullPointerException("Group::setIndividualMonolocusGenotypeByAlleleKey: individual has no genotype.");
525  }
526  catch (IndexOutOfBoundsException& ioobe)
527  {
528  throw IndexOutOfBoundsException("Group::setIndividualMonolocusGenotypeByAlleleKey: locus_position excedes the number of locus.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
529  }
530  catch (Exception&)
531  {
532  throw Exception("Group::setIndividualMonolocusGenotypeByAlleleKey: no key in allele_keys.");
533  }
534 }
535 
536 void Group::setIndividualMonolocusGenotypeByAlleleId(size_t individual_position, size_t locus_position, const std::vector<std::string>& allele_id, const LocusInfo& locus_info)
537 {
538  if (individual_position >= getNumberOfIndividuals())
539  throw IndexOutOfBoundsException("Group::setIndividualMonolocusGenotypeByAlleleId: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
540  try
541  {
542  individuals_[individual_position]->setMonolocusGenotypeByAlleleId(locus_position, allele_id, locus_info);
543  }
544  catch (NullPointerException& npe)
545  {
546  throw NullPointerException("Group::setIndividualMonolocusGenotypeByAlleleId: individual has no genotype.");
547  }
548  catch (IndexOutOfBoundsException& ioobe)
549  {
550  throw IndexOutOfBoundsException("Group::setIndividualMonolocusGenotypeByAlleleId: locus_position excedes the number of locus.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
551  }
552  catch (AlleleNotFoundException& anfe)
553  {
554  throw AlleleNotFoundException("Group::setIndividualMonolocusGenotypeByAlleleId: id not found.", anfe.getIdentifier());
555  }
556 }
557 
558 const MonolocusGenotype& Group::getIndividualMonolocusGenotype(size_t individual_position, size_t locus_position) const
559 {
560  if (individual_position >= getNumberOfIndividuals())
561  throw IndexOutOfBoundsException("Group::getIndividualMonolocusGenotype: individual_position out of bounds.", individual_position, 0, getNumberOfIndividuals());
562  try
563  {
564  return individuals_[individual_position]->getMonolocusGenotype(locus_position);
565  }
566  catch (NullPointerException& npe)
567  {
568  throw NullPointerException("Group::getIndividualMonolocusGenotype: individual has no genotype.");
569  }
570  catch (IndexOutOfBoundsException& ioobe)
571  {
572  throw IndexOutOfBoundsException("Group::getIndividualMonolocusGenotype: locus_position excedes the number of locus.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
573  }
574 }
575 
577 {
578  for (size_t i = 0; i < getNumberOfIndividuals(); i++)
579  {
580  if (hasIndividualSequences(i))
581  return true;
582  }
583  return false;
584 }
585 
587 {
588  for (size_t i = 0; i < getNumberOfIndividuals(); i++)
589  {
590  if (hasIndividualSequences(i))
591  return individuals_[i]->getSequenceAlphabet();
592  }
593  throw NullPointerException("Group::getAlphabet: individual has no sequence data.");
594 }
595 
596 size_t Group::getGroupSizeForLocus(size_t locus_position) const
597 {
598  size_t count = 0;
599  for (size_t i = 0; i < individuals_.size(); i++)
600  {
601  if (individuals_[i]->hasGenotype() && !individuals_[i]->getGenotype().isMonolocusGenotypeMissing(locus_position))
602  count++;
603  }
604  return count;
605 }
606 
607 size_t Group::getGroupSizeForSequence(size_t sequence_position) const
608 {
609  size_t count = 0;
610  for (size_t i = 0; i < individuals_.size(); i++)
611  {
612  if (individuals_[i]->hasSequences())
613  {
614  try
615  {
616  individuals_[i]->getSequenceAtPosition(sequence_position);
617  count++;
618  }
619  catch (...)
620  {}
621  }
622  }
623  return count;
624 }
625 
The AlleleNotFoundException class.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
std::vector< const Alphabet * > getAlphabets() const
The BadIdentifierException class.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
The Date class.
Definition: Date.h:57
The Group class.
Definition: Group.h:71
void deleteIndividualById(const std::string &individual_id)
Delete an Individual from the Group.
Definition: Group.cpp:154
void setIndividualSequences(size_t individual_position, const MapSequenceContainer &msc)
Set all the sequences by copying an OrderedSequenceContainer.
Definition: Group.cpp:450
bool hasIndividualGenotype(size_t individual_position) const
Tell if an Individual has a genotype.
Definition: Group.cpp:489
const Alphabet * getAlphabet() const
Get the alphabet used for the sequences.
Definition: Group.cpp:586
size_t getNumberOfIndividuals() const
Get the number of Individual in the Group.
Definition: Group.cpp:204
std::unique_ptr< Individual > removeIndividualAtPosition(size_t individual_position)
Remove an Individual from the Group.
Definition: Group.cpp:145
Group & operator=(const Group &group)
The assignation operator =.
Definition: Group.cpp:78
void deleteIndividualSequenceAtPosition(size_t individual_position, size_t sequence_position)
Delete a sequence of an Individual.
Definition: Group.cpp:379
void addEmptyIndividual(const std::string &individual_id)
Add an empty Individual to the Group.
Definition: Group.cpp:110
void setGroupId(size_t group_id)
Set the id of the Group.
Definition: Group.cpp:88
const Date & getIndividualDateAtPosition(size_t individual_position) const
Get the date of an Individual.
Definition: Group.cpp:247
size_t getGroupId() const
Get the id of the Group.
Definition: Group.h:134
bool hasIndividualSequences(size_t individual_position) const
Tell if the Individual has some sequences.
Definition: Group.cpp:397
void deleteIndividualSequenceByName(size_t individual_position, const std::string &sequence_name)
Delete a sequence of an Individual.
Definition: Group.cpp:361
void addIndividual(const Individual &ind)
Add an Individual.
Definition: Group.cpp:98
void setIndividualGenotype(size_t individual_position, const MultilocusGenotype &genotype)
Set the genotype of an Individual.
Definition: Group.cpp:457
void setIndividualDateAtPosition(size_t individual_position, const Date &date)
Set the date of an Individual.
Definition: Group.cpp:240
void setGroupName(const std::string &group_name)
Set the name of the Group.
Definition: Group.cpp:93
unsigned short getIndividualSexAtPosition(size_t individual_position) const
Get the sex of an Individual.
Definition: Group.cpp:233
std::vector< Individual * > individuals_
Definition: Group.h:75
bool hasSequenceData() const
Tell if at least one individual has at least one sequence.
Definition: Group.cpp:576
void setIndividualLocalityAtPosition(size_t individual_position, const Locality< double > *locality)
Set the locality of an Individual.
Definition: Group.cpp:282
void setIndividualCoordAtPosition(size_t individual_position, const Point2D< double > &coord)
Set the coordinates of an Individual.
Definition: Group.cpp:261
const Sequence & getIndividualSequenceByName(size_t individual_position, const std::string &sequence_name) const
Get a sequence of an Individual.
Definition: Group.cpp:325
void setIndividualMonolocusGenotypeByAlleleId(size_t individual_position, size_t locus_position, const std::vector< std::string > &allele_id, const LocusInfo &locus_info)
Set a MonolocusGenotype of an Individual.
Definition: Group.cpp:536
void setIndividualMonolocusGenotypeByAlleleKey(size_t individual_position, size_t locus_position, const std::vector< size_t > &allele_keys)
Set a MonolocusGenotype of an Individual.
Definition: Group.cpp:514
std::vector< std::string > getIndividualSequencesNames(size_t individual_position) const
Get the sequences' names from an Individual.
Definition: Group.cpp:404
size_t getMaxNumberOfSequences() const
Get the maximum number of sequence.
Definition: Group.cpp:209
std::string name_
Definition: Group.h:74
size_t id_
Definition: Group.h:73
const Locality< double > & getIndividualLocalityAtPosition(size_t individual_position) const
Get the locality of an Individual.
Definition: Group.cpp:289
const Individual & getIndividualAtPosition(size_t individual_position) const
Get a reference to an Individual by its position.
Definition: Group.cpp:197
void initIndividualGenotype(size_t individual_position, size_t loci_number)
Initialyze the genotype of an Individual.
Definition: Group.cpp:464
void clear()
Clear the Group.
Definition: Group.cpp:178
size_t getIndividualNumberOfSequences(size_t individual_position) const
Get the number of sequences in an Individual.
Definition: Group.cpp:436
size_t getGroupSizeForLocus(size_t locus_position) const
Get the number of individual that have a data at the specified locus.
Definition: Group.cpp:596
const Individual & getIndividualById(const std::string &individual_id) const
Get a reference to an Individual.
Definition: Group.cpp:187
const Sequence & getIndividualSequenceAtPosition(size_t individual_position, size_t sequence_position) const
Get a sequence of an Individual.
Definition: Group.cpp:343
std::unique_ptr< Individual > removeIndividualById(const std::string &individual_id)
Remove an Individual from the Group.
Definition: Group.cpp:130
void deleteIndividualAtPosition(size_t individual_position)
Delete an Individual from the Group.
Definition: Group.cpp:166
void setIndividualMonolocusGenotype(size_t individual_position, size_t locus_position, const MonolocusGenotype &monogen)
Set a MonolocusGenotype of an Individual.
Definition: Group.cpp:496
void addIndividualSequenceAtPosition(size_t individual_position, size_t sequence_position, const Sequence &sequence)
Add a sequence to an Individual.
Definition: Group.cpp:303
size_t getIndividualSequencePosition(size_t individual_position, const std::string &sequence_name) const
Get the position of a sequence in an Individual.
Definition: Group.cpp:418
size_t getGroupSizeForSequence(size_t sequence_position) const
Get the number of individual that have a sequence at the specified position.
Definition: Group.cpp:607
void deleteIndividualGenotype(size_t individual_position)
Delete the genotype of an Individual.
Definition: Group.cpp:482
const Point2D< double > & getIndividualCoordAtPosition(size_t individual_position) const
Get the coordinates of an Individual.
Definition: Group.cpp:268
size_t getIndividualPosition(const std::string &individual_id) const
Get the position of an Individual.
Definition: Group.cpp:120
void setIndividualSexAtPosition(size_t individual_position, const unsigned short sex)
Set the sex of an Individual.
Definition: Group.cpp:226
Group(size_t group_id)
Build a void new Group.
Definition: Group.cpp:47
~Group()
Destroy an Group.
Definition: Group.cpp:74
const MonolocusGenotype & getIndividualMonolocusGenotype(size_t individual_position, size_t locus_position) const
Get a MonolocusGenotype of an Individual.
Definition: Group.cpp:558
std::size_t getBadIndex() const
const std::array< std::size_t, 2 > & getBounds() const
The IndividualNotFoundException class.
The Individual class.
Definition: Individual.h:76
const std::string & getId() const
Get the id of the Individual.
Definition: Individual.h:146
The LocusInfo class.
Definition: LocusInfo.h:64
The MonolocusGenotype virtual class.
The MultilocusGenotype class.
virtual const std::string getSequenceId() const
std::size_t count(const std::string &s, const std::string &pattern)