49 analyzedSequences_(0),
50 localities_(vector<
Locality<double>*>()),
51 groups_(vector<
Group*>()) {}
56 analyzedSequences_(0),
57 localities_(vector<
Locality<double>*>()),
58 groups_(vector<
Group*>())
70 for (
size_t i = 0; i < ds.
groups_.size(); i++)
90 for (
size_t i = 0; i < ds.
groups_.size(); i++)
121 for (
size_t i = 0; i < localities_.size(); i++)
123 if (localities_[i]->getName() == locality.getName())
133 for (
size_t i = 0; i < localities_.size(); i++)
135 if (localities_[i]->getName() == name)
145 if (locality_position >= localities_.size())
146 throw IndexOutOfBoundsException(
"DataSet::getLocalityAtPosition: locality_position out of bounds.", locality_position, 0, localities_.size());
147 return *(localities_[locality_position]);
156 return getLocalityAtPosition(getLocalityPosition(name));
168 if (locality_position >= localities_.size())
169 throw IndexOutOfBoundsException(
"DataSet::deleteLocalityAtPosition: locality_position out of bounds.", locality_position, 0, localities_.size());
170 delete localities_[locality_position];
171 localities_.erase(localities_.begin() +
static_cast<ptrdiff_t
>(locality_position));
180 deleteLocalityAtPosition(getLocalityPosition(name));
207 for (
size_t i = 0; i < groups_.size(); i++)
209 if (group.getGroupId() == groups_[i]->getGroupId())
212 groups_.push_back(
new Group(group));
219 for (
size_t i = 0; i < groups_.size(); i++)
221 if (group_id == groups_[i]->getGroupId())
224 groups_.push_back(
new Group(group_id));
231 for (
size_t i = 0; i < groups_.size(); i++)
233 if (group_id == groups_[i]->getGroupId())
234 return *(groups_[i]);
244 name = getGroupById(group_id).getGroupName();
248 return TextTools::toString(group_id);
256 for (
size_t i = 0; i < groups_.size(); i++)
258 if (group_id == groups_[i]->getGroupId())
260 groups_[i]->setGroupName(group_name);
271 for (
size_t i = 0; i < groups_.size(); i++)
273 if (group_id == groups_[i]->getGroupId())
283 if (group_position >= groups_.size())
284 throw IndexOutOfBoundsException(
"DataSet::getGroup.", group_position, 0, groups_.size());
285 return *(groups_[group_position]);
292 if (group_position >= groups_.size())
293 throw IndexOutOfBoundsException(
"DataSet::deleteGroup.", group_position, 0, groups_.size());
294 delete groups_[group_position];
295 groups_.erase(groups_.begin() +
static_cast<ptrdiff_t
>(group_position));
312 getGroupById(source_id);
320 getGroupById(target_id);
327 size_t source_pos = getGroupPosition(source_id);
328 size_t target_pos = getGroupPosition(target_id);
329 for (
size_t i = 0; i < groups_[source_pos]->getNumberOfIndividuals(); i++)
331 groups_[target_pos]->addIndividual(groups_[source_pos]->getIndividualAtPosition(i));
333 deleteGroupAtPosition(source_pos);
341 for (
size_t i = 0; i < group_ids.size(); i++)
345 getGroupById(group_ids[i]);
353 sort(group_ids.begin(), group_ids.end());
355 size_t pos_first = getGroupPosition(group_ids[0]);
356 for (
size_t i = 1; i < group_ids.size(); i++)
358 size_t pos_current = getGroupPosition(group_ids[i]);
359 for (
size_t j = 0; j < getGroupAtPosition(pos_current).getNumberOfIndividuals(); j++)
361 groups_[pos_first]->addIndividual(getGroupAtPosition(pos_current).getIndividualAtPosition(j));
363 deleteGroupAtPosition(pos_current);
374 source_pos = getGroupPosition(group_id);
380 size_t new_group_id = 0;
381 for (
size_t i = 0; i < groups_.size(); i++)
383 if (groups_[i]->getGroupId() > new_group_id)
384 new_group_id = groups_[i]->getGroupId();
387 Group new_group(new_group_id);
388 for (
size_t i = 0; i < individuals_selection.size(); i++)
390 if (individuals_selection[i] >= groups_[source_pos]->getNumberOfIndividuals())
391 throw IndexOutOfBoundsException(
"DataSet::splitGroup: individuals_selection excedes the number of individual in the group.", individuals_selection[i], 0, groups_[source_pos]->getNumberOfIndividuals());
393 for (
size_t i = 0; i < individuals_selection.size(); i++)
395 new_group.
addIndividual(*groups_[source_pos]->removeIndividualAtPosition(individuals_selection[i]));
396 groups_[source_pos]->deleteIndividualAtPosition(individuals_selection[i]);
407 if (group >= getNumberOfGroups())
408 throw IndexOutOfBoundsException(
"DataSet::addIndividualToGroup: group out of bounds.", group, 0, getNumberOfGroups());
411 groups_[group]->addIndividual(individual);
412 if (individual.hasSequences())
413 setAlphabet(individual.getSequenceAlphabet());
425 if (group >= getNumberOfGroups())
426 throw IndexOutOfBoundsException(
"DataSet::addEmptyIndividual: group out of bounds.", group, 0, getNumberOfGroups());
429 groups_[group]->addEmptyIndividual(individual_id);
441 if (group_position >= getNumberOfGroups())
442 throw IndexOutOfBoundsException(
"DataSet::getNumberOfIndividualsInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
443 return groups_[group_position]->getNumberOfIndividuals();
450 if (group_position >= getNumberOfGroups())
451 throw IndexOutOfBoundsException(
"DataSet::getIndividualPositionFromGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
454 return groups_[group_position]->getIndividualPosition(individual_id);
466 if (group_position >= getNumberOfGroups())
467 throw IndexOutOfBoundsException(
"DataSet::getIndividualAtPositionFromGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
470 return &groups_[group_position]->getIndividualAtPosition(individual_position);
472 catch (IndexOutOfBoundsException ioobe)
474 throw IndexOutOfBoundsException(
"DataSet::getIndividualAtPositionFromGroup: individual_position out of bouds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
482 if (group_position >= getNumberOfGroups())
483 throw IndexOutOfBoundsException(
"DataSet::getIndividualByIdFromGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
486 return &groups_[group_position]->getIndividualById(individual_id);
498 if (group_position >= getNumberOfGroups())
499 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualAtPositionFromGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
502 groups_[group_position]->deleteIndividualAtPosition(individual_position);
504 catch (IndexOutOfBoundsException ioobe)
506 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualAtPositionFromGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
514 if (group_position >= getNumberOfGroups())
515 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualByIdFromGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
518 groups_[group_position]->deleteIndividualById(individual_id);
530 if (group_position >= getNumberOfGroups())
531 throw IndexOutOfBoundsException(
"DataSet::setIndividualSexInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
534 groups_[group_position]->setIndividualSexAtPosition(individual_position, sex);
536 catch (IndexOutOfBoundsException& ioobe)
538 throw IndexOutOfBoundsException(
"DataSet::setIndividualSexInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
546 if (group_position >= getNumberOfGroups())
547 throw IndexOutOfBoundsException(
"DataSet::getIndividualSexInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
550 return groups_[group_position]->getIndividualSexAtPosition(individual_position);
552 catch (IndexOutOfBoundsException& ioobe)
554 throw IndexOutOfBoundsException(
"DataSet::getIndividualSexInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
562 if (group_position >= getNumberOfGroups())
563 throw IndexOutOfBoundsException(
"DataSet::setIndividualDateInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
566 groups_[group_position]->setIndividualDateAtPosition(individual_position, date);
568 catch (IndexOutOfBoundsException& ioobe)
570 throw IndexOutOfBoundsException(
"DataSet::setIndividualDateInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
578 if (group_position >= getNumberOfGroups())
579 throw IndexOutOfBoundsException(
"DataSet::getIndividualDateInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
582 return &groups_[group_position]->getIndividualDateAtPosition(individual_position);
584 catch (IndexOutOfBoundsException& ioobe)
586 throw IndexOutOfBoundsException(
"DataSet::getIndividualDateInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
588 catch (NullPointerException)
590 throw NullPointerException(
"DataSet::getIndividualDateInGroup: individual has no date.");
598 if (group_position >= getNumberOfGroups())
599 throw IndexOutOfBoundsException(
"DataSet::setIndividualCoordInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
602 groups_[group_position]->setIndividualCoordAtPosition(individual_position, coord);
604 catch (IndexOutOfBoundsException& ioobe)
606 throw IndexOutOfBoundsException(
"DataSet::setIndividualCoordInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
614 if (group_position >= getNumberOfGroups())
615 throw IndexOutOfBoundsException(
"DataSet::getIndividualCoordInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
618 return &groups_[group_position]->getIndividualCoordAtPosition(individual_position);
620 catch (IndexOutOfBoundsException& ioobe)
622 throw IndexOutOfBoundsException(
"DataSet::getIndividualCoordAtPosition: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
624 catch (NullPointerException)
626 throw NullPointerException(
"DataSet::getIndividualCoordInGroup: individual has no coordinate.");
634 if (group_position >= getNumberOfGroups())
635 throw IndexOutOfBoundsException(
"DataSet::setIndividualLocalityInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
638 groups_[group_position]->setIndividualLocalityAtPosition(individual_position, &getLocalityByName(locality_name));
640 catch (IndexOutOfBoundsException& ioobe)
642 throw IndexOutOfBoundsException(
"DataSet::setIndividualLocalityInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
654 if (group_position >= getNumberOfGroups())
655 throw IndexOutOfBoundsException(
"DataSet::getIndividualLocalityInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
658 return &groups_[group_position]->getIndividualLocalityAtPosition(individual_position);
660 catch (IndexOutOfBoundsException& ioobe)
662 throw IndexOutOfBoundsException(
"DataSet::getIndividualLocalityInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
664 catch (NullPointerException)
666 throw NullPointerException(
"DataSet::getIndividualLocalityInGroup: individual has no locality.");
674 if (group_position >= getNumberOfGroups())
675 throw IndexOutOfBoundsException(
"DataSet::addIndividualSequenceInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
678 groups_[group_position]->addIndividualSequenceAtPosition(individual_position, sequence_position, sequence);
679 setAlphabet(sequence.getAlphabet());
681 catch (IndexOutOfBoundsException& ioobe)
683 throw IndexOutOfBoundsException(
"DataSet::addIndividualSequenceInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
685 catch (AlphabetMismatchException& ame)
687 throw AlphabetMismatchException(
"DataSet::addIndividualSequenceInGroup: sequence's alphabet doesn't match.", ame.getAlphabets()[0], ame.getAlphabets()[1]);
693 catch (BadIntegerException& bie)
695 throw BadIntegerException(
"DataSet::addIndividualSequenceInGroup: sequence_position already in use.", bie.getBadInteger());
703 if (group_position >= getNumberOfGroups())
704 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequenceByNameInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
707 return groups_[group_position]->getIndividualSequenceByName(individual_position, sequence_name);
709 catch (IndexOutOfBoundsException& ioobe)
711 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequenceByNameInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
713 catch (NullPointerException)
715 throw NullPointerException(
"DataSet::getIndividualSequenceByNameInGroup: individual has no sequences.");
717 catch (SequenceNotFoundException& snfe)
719 throw SequenceNotFoundException(
"DataSet::getIndividualSequenceByNameInGroup: sequence_name not found.", snfe.getSequenceId());
727 if (group_position >= getNumberOfGroups())
728 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequenceAtPositionInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
731 return groups_[group_position]->getIndividualSequenceAtPosition(individual_position, sequence_position);
733 catch (IndexOutOfBoundsException& ioobe)
735 if (
string(ioobe.what()).find(
"individual_position") < string(ioobe.what()).size())
736 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequenceAtPositionInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
739 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequenceAtPositionInGroup: sequence_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
741 catch (NullPointerException)
743 throw NullPointerException(
"DataSet::getIndividualSequenceAtPositionInGroup: individual has no sequences.");
751 if (group_position >= getNumberOfGroups())
752 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualSequenceByNameInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
755 groups_[group_position]->deleteIndividualSequenceByName(individual_position, sequence_name);
757 catch (IndexOutOfBoundsException& ioobe)
759 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualSequenceByNameInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
761 catch (NullPointerException)
763 throw NullPointerException(
"DataSet::deleteIndividualSequenceByNameInGroup: individual has no sequences.");
765 catch (SequenceNotFoundException& snfe)
767 throw SequenceNotFoundException(
"DataSet::deleteIndividualSequenceByNameInGroup: sequence_name not found.", snfe.getSequenceId());
775 if (group_position >= getNumberOfGroups())
776 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualSequenceAtPositionInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
779 groups_[group_position]->deleteIndividualSequenceAtPosition(individual_position, sequence_position);
781 catch (IndexOutOfBoundsException& ioobe)
783 if (
string(ioobe.what()).find(
"individual_position") < string(ioobe.what()).size())
784 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualSequenceAtPositionInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
787 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualSequenceAtPositionInGroup: sequence_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
789 catch (NullPointerException)
791 throw NullPointerException(
"DataSet::deleteIndividualSequenceAtPositionInGroup: individual has no sequences.");
799 if (group_position >= getNumberOfGroups())
800 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequencesNamesInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
803 return groups_[group_position]->getIndividualSequencesNames(individual_position);
805 catch (IndexOutOfBoundsException& ioobe)
807 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequencesNamesInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
809 catch (NullPointerException)
811 throw NullPointerException(
"DataSet::getIndividualSequencesNamesInGroup: individual has no sequences.");
819 if (group_position >= getNumberOfGroups())
820 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequencePositionInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
823 return groups_[group_position]->getIndividualSequencePosition(individual_position, sequence_name);
825 catch (IndexOutOfBoundsException& ioobe)
827 throw IndexOutOfBoundsException(
"DataSet::getIndividualSequencePositionInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
829 catch (NullPointerException)
831 throw NullPointerException(
"DataSet::getIndividualSequencePositionInGroup: individual has no sequences.");
833 catch (SequenceNotFoundException& snfe)
835 throw SequenceNotFoundException(
"DataSet::getIndividualSequencePositionInGroup: sequence_name not found.", snfe.getSequenceId());
843 if (group_position >= getNumberOfGroups())
844 throw IndexOutOfBoundsException(
"DataSet::getIndividualNumberOfSequencesInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
847 return groups_[group_position]->getIndividualNumberOfSequences(individual_position);
849 catch (IndexOutOfBoundsException& ioobe)
851 throw IndexOutOfBoundsException(
"DataSet::getIndividualNumberOfSequencesInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
853 catch (NullPointerException)
855 throw NullPointerException(
"DataSet::getIndividualNumberOfSequencesInGroup: individual has no sequences.");
863 if (group_position >= getNumberOfGroups())
864 throw IndexOutOfBoundsException(
"DataSet::setIndividualGenotypeInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
867 groups_[group_position]->setIndividualGenotype(individual_position, genotype);
869 catch (IndexOutOfBoundsException& ioobe)
871 throw IndexOutOfBoundsException(
"DataSet::setIndividualGenotypeInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
879 if (group_position >= getNumberOfGroups())
880 throw IndexOutOfBoundsException(
"DataSet::initIndividualGenotypeInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
883 groups_[group_position]->initIndividualGenotype(individual_position, getNumberOfLoci());
885 catch (IndexOutOfBoundsException& ioobe)
887 throw IndexOutOfBoundsException(
"DataSet::initIndividualGenotypeInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
889 catch (BadIntegerException& bie)
891 throw BadIntegerException(
"DataSet::initIndividualGenotypeInGroup: number of loci must be > 0.", bie.getBadInteger());
893 catch (NullPointerException)
895 throw NullPointerException(
"DataSet::initIndividualGenotypeInGroup: analyzed_loci is NULL.");
899 throw Exception(
"DataSet::initIndividualGenotypeInGroup: individual already has a genotype.");
907 if (group_position >= getNumberOfGroups())
908 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualGenotypeInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
911 groups_[group_position]->deleteIndividualGenotype(individual_position);
913 catch (IndexOutOfBoundsException& ioobe)
915 throw IndexOutOfBoundsException(
"DataSet::deleteIndividualGenotypeInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
923 if (group_position >= getNumberOfGroups())
924 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
927 groups_[group_position]->setIndividualMonolocusGenotype(individual_position, locus_position, monogen);
929 catch (IndexOutOfBoundsException& ioobe)
931 if (
string(ioobe.what()).find(
"individual_position") < string(ioobe.what()).size())
932 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
935 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeInGroup: locus_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
937 catch (NullPointerException)
939 throw NullPointerException(
"DataSet::setIndividualMonolocusGenotypeInGroup: individual has no genotype.");
947 if (group_position >= getNumberOfGroups())
948 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeByAlleleKeyInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
951 groups_[group_position]->setIndividualMonolocusGenotypeByAlleleKey(individual_position, locus_position, allele_keys);
953 catch (IndexOutOfBoundsException& ioobe)
955 if (
string(ioobe.what()).find(
"individual_position") < string(ioobe.what()).size())
956 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeByAlleleKeyInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
959 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeByAlleleKeyInGroup: locus_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
961 catch (NullPointerException)
963 throw NullPointerException(
"DataSet::setIndividualMonolocusGenotypeByAlleleKeyInGroup: individual has no genotype.");
967 throw Exception(
"DataSet::setIndividualMonolocusGenotypeByAlleleKeyInGroup: no key in allele_keys.");
975 if (group_position >= getNumberOfGroups())
976 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeByAlleleIdInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
977 const LocusInfo& locus_info = getLocusInfoAtPosition(locus_position);
980 groups_[group_position]->setIndividualMonolocusGenotypeByAlleleId(individual_position, locus_position, allele_id, locus_info);
982 catch (IndexOutOfBoundsException& ioobe)
984 if (
string(ioobe.what()).find(
"individual_position") < string(ioobe.what()).size())
985 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeByAlleleIdInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
988 throw IndexOutOfBoundsException(
"DataSet::setIndividualMonolocusGenotypeByAlleleIdInGroup: locus_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
990 catch (NullPointerException)
992 throw NullPointerException(
"DataSet::setIndividualMonolocusGenotypeByAlleleIdInGroup: individual has no genotype.");
1004 if (group_position >= getNumberOfGroups())
1005 throw IndexOutOfBoundsException(
"DataSet::getIndividualMonolocusGenotypeInGroup: group_position out of bounds.", group_position, 0, getNumberOfGroups());
1008 return &groups_[group_position]->getIndividualMonolocusGenotype(individual_position, locus_position);
1010 catch (IndexOutOfBoundsException& ioobe)
1012 if (
string(ioobe.what()).find(
"individual_position") < string(ioobe.what()).size())
1013 throw IndexOutOfBoundsException(
"DataSet::getIndividualMonolocusGenotypeInGroup: individual_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
1016 throw IndexOutOfBoundsException(
"DataSet::getIndividualMonolocusGenotypeInGroup: locus_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
1018 catch (NullPointerException)
1020 throw NullPointerException(
"DataSet::getIndividualMonolocusGenotypeInGroup: individual has no genotype.");
1050 throw NullPointerException(
"DataSet::getAlphabet: no sequence data.");
1059 throw NullPointerException(
"DataSet::getAlphabetType: no sequence data.");
1068 if (analyzedLoci_ != 0)
1072 deleteAnalyzedLoci();
1074 catch (Exception& e)
1076 throw Exception (
"DataSet::setAnalyzedLoci: at least one individual has a genotype of the actual AnalyzedLoci.");
1086 if (analyzedLoci_ != 0)
1087 throw Exception(
"DataSet::initAnalyzedLoci: analyzedLoci_ already initialyzed.");
1097 throw NullPointerException(
"DataSet::getAnalyzedLoci: no loci initialized.");
1112 if (analyzedLoci_ == 0)
1113 throw NullPointerException(
"DataSet::setLocusInfo: there's no AnalyzedLoci to setup.");
1116 analyzedLoci_->setLocusInfo(locus_position, locus);
1118 catch (IndexOutOfBoundsException& ioobe)
1120 throw IndexOutOfBoundsException(
"DataSet::setLocusInfo: locus_position out of bounds.", locus_position, 0, analyzedLoci_->getNumberOfLoci());
1128 if (analyzedLoci_ == 0)
1129 throw NullPointerException(
"DataSet::getLocusInfoByName: there's no AnalyzedLoci.");
1132 return analyzedLoci_->getLocusInfoByName(locus_name);
1144 if (analyzedLoci_ == 0)
1145 throw NullPointerException(
"DataSet::getLocusInfoAtPosition: there's no AnalyzedLoci.");
1148 return analyzedLoci_->getLocusInfoAtPosition(locus_position);
1150 catch (IndexOutOfBoundsException& ioobe)
1152 throw IndexOutOfBoundsException(
"DataSet::getLocusInfoAtPosition: locus_position out of bounds.", locus_position, ioobe.getBounds()[0], ioobe.getBounds()[1]);
1154 catch (NullPointerException& npe)
1156 throw NullPointerException(
"DataSet::getLocusInfoAtPosition: no locus defined here");
1164 if (analyzedLoci_ == 0)
1165 throw NullPointerException(
"DataSet::addAlleleInfoByLocusName: there's no AnalyzedLoci.");
1168 analyzedLoci_->addAlleleInfoByLocusName(locus_name, allele);
1184 if (analyzedLoci_ == 0)
1185 throw NullPointerException(
"DataSet::addAlleleInfoByLocusPosition: there's no AnalyzedLoci.");
1188 analyzedLoci_->addAlleleInfoByLocusPosition(locus_position, allele);
1190 catch (IndexOutOfBoundsException& ioobe)
1192 throw IndexOutOfBoundsException(
"DataSet::addAlleleInfoByLocusPosition: locus_position out of bounds.", locus_position, ioobe.getBounds()[0], ioobe.getBounds()[1]);
1205 throw NullPointerException(
"DataSet::getNumberOfLoci: there's no AnalyzedLoci.");
1213 if (analyzedLoci_ == 0)
1214 throw NullPointerException(
"DataSet::getPloidyByLocusName: there's no AnalyzedLoci.");
1217 return analyzedLoci_->getPloidyByLocusName(locus_name);
1229 if (analyzedLoci_ == 0)
1230 throw NullPointerException(
"DataSet::getPloidyByLocusPosition: there's no AnalyzedLoci.");
1233 return analyzedLoci_->getPloidyByLocusPosition(locus_position);
1235 catch (IndexOutOfBoundsException& ioobe)
1237 throw IndexOutOfBoundsException(
"DataSet::getPloidyByLocusPosition: locus_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
1251 string name =
groups_[i]->getGroupName();
1271 for (map<
size_t, vector<size_t> >::const_iterator it = selection.begin(); it != selection.end(); it++)
1276 i = getGroupPosition(it->first);
1282 string name = groups_[i]->getGroupName();
1284 for (
size_t j = 0; j < it->second.size(); j++)
1289 tmp_ind = getIndividualAtPositionFromGroup(i, j);
1291 catch (IndexOutOfBoundsException& ioobe)
1310 for (map<
size_t, vector<size_t> >::const_iterator it = selection.begin(); it != selection.end(); it++)
1315 i = getGroupPosition(it->first);
1322 for (
size_t j = 0; j < it->second.size(); j++)
1327 tmp_ind = getIndividualAtPositionFromGroup(i, j);
1329 catch (IndexOutOfBoundsException& ioobe)
1338 psc->
setGroupId(tmp_seq.getName(), it->first);
size_t getLocalityPosition(const std::string &name) const
Get the position of a locality in the container.
void deleteIndividualSequenceAtPositionInGroup(size_t group_position, size_t individual_position, size_t sequence_position)
Delete a Sequence of an Individual of a Group.
void addIndividual(const Individual &ind)
Add an Individual.
std::string getAlphabetType() const
Get the alphabet type as a string.
size_t getNumberOfLoci() const
Get the number of loci.
void deleteIndividualAtPositionFromGroup(size_t group_position, size_t individual_position)
Delete an Individual from a group.
The GroupNotFoundException class.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
void deleteIndividualByIdFromGroup(size_t group_position, const std::string &individual_id)
Delete an Individual from a group.
void setIndividualMonolocusGenotypeByAlleleIdInGroup(size_t group_position, size_t individual_position, size_t locus_position, const std::vector< std::string > allele_id)
Set a MonolocusGenotype of an Individual from a group.
The AnalyzedSequences class.
void deleteIndividualGenotypeInGroup(size_t group_position, size_t individual_position)
Delete the MultilocusGenotype of an Individual from a Group.
The LocalityNotFoundException class.
unsigned short getIndividualSexInGroup(size_t group_position, size_t individual_position) const
Get the sex of an Individual in a Group.
const AnalyzedLoci * getAnalyzedLoci() const
Get the AnalyzedLoci if there is one.
const Locality< double > * getIndividualLocalityInGroup(size_t group_position, size_t individual_position) const
Get the Locality of an Individual in a Group.
bool hasLocality() const
Tell if there is at least one locality.
const Locality< double > & getLocalityByName(const std::string &name) const
Get a Locality by name.
const LocusInfo & getLocusInfoByName(const std::string &locus_name) const
Get a LocusInfo by its name.
The BadIdentifierException class.
void addAlleleInfoByLocusPosition(size_t locus_position, const AlleleInfo &allele)
Add an AlleleInfo to a LocusInfo.
void deleteIndividualSequenceByNameInGroup(size_t group_position, size_t individual_position, const std::string &sequence_name)
Delete a Sequence of an Individual of a Group.
const Group & getGroupById(size_t group_id) const
Get a group by identifier.
void deleteAnalyzedLoci()
Delete the AnalyzedLoci.
DataSet & operator=(const DataSet &ds)
The MultilocusGenotype class.
void deleteGroupAtPosition(size_t group_position)
Delete a Group from the DataSet.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
void mergeGroups(std::vector< size_t > &group_ids)
Merge some Groups in one.
const Date * getIndividualDateInGroup(size_t group_position, size_t individual_position) const
Get the Date of an Individual in a Group.
std::string getAlphabetType() const
Get the alphabet type as a string.
PolymorphismMultiGContainer * getPolymorphismMultiGContainer() const
Get a PolymorphismMultiGContainer with all allelic data of the DataSet.
void addGroup(const Group &group)
Add a Group to the DataSet.
size_t getPloidyByLocusName(const std::string &locus_name) const
Get the ploidy of a locus.
const Sequence & getIndividualSequenceByNameInGroup(size_t group_position, size_t individual_position, const std::string &sequence_name) const
Get a Sequence from an Individual of a Group.
void mergeTwoGroups(size_t source_id, size_t target_id)
Merge two groups.
void addAlleleInfoByLocusName(const std::string &locus_name, const AlleleInfo &allele)
Add an AlleleInfo to a LocusInfo.
bool hasGenotype() const
Tell if the Individual has a MultilocusGenotype.
size_t getPloidyByLocusPosition(size_t locus_position) const
Get the ploidy of a locus.
void setIndividualMonolocusGenotypeInGroup(size_t group_position, size_t individual_position, size_t locus_position, const MonolocusGenotype &monogen)
Set a MonolocusGenotype of an Individual from a group.
AnalyzedSequences * analyzedSequences_
The AlleleNotFoundException class.
size_t getNumberOfLoci() const
Get the number of loci.
void setIndividualSexInGroup(size_t group_position, size_t individual_position, const unsigned short sex)
Set the sex of an Individual in a Group.
void splitGroup(size_t group_id, std::vector< size_t > individuals_selection)
Split a group in two.
size_t getIndividualNumberOfSequencesInGroup(size_t group_position, size_t individual_position) const
Get the number of Sequences in an Individual of a Group.
const Alphabet * getAlphabet() const
Get the alphabet.
bool hasAlleleicData() const
Tell if there is alelelic data.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
void setIndividualDateInGroup(size_t group_position, size_t individual_position, const Date &date)
Set the Date of an Individual in a Group.
~DataSet()
Destroy a DataSet.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
const Group & getGroupAtPosition(size_t group_position) const
Get a group by position.
void setGroupName(size_t group_id, const std::string &group_name) const
set the name of a Group.
const LocusInfo & getLocusInfoAtPosition(size_t locus_position) const
Get a LocusInfo by its position.
void addSequenceWithFrequency(const Sequence &sequence, unsigned int frequency, bool checkName=true)
Add a sequence to the container.
void addMultilocusGenotype(const MultilocusGenotype &mg, size_t group)
Add a MultilocusGenotype to the container.
size_t getNumberOfLocalities() const
Get the number of Localities.
bool hasSequenceData() const
Tell if at least one individual has at least one sequence.
void setGroupId(size_t index, size_t group_id)
Set the group identifier of a sequence.
The IndividualNotFoundException class.
void setLocusInfo(size_t locus_position, const LocusInfo &locus)
Set a LocusInfo.
void addIndividualToGroup(size_t group_position, const Individual &individual)
Add an Individual to a Group.
size_t getGroupPosition(size_t group_id) const
Get the position of a Group.
The PolymorphismMultiGContainer class.
void setIndividualLocalityInGroupByName(size_t group_position, size_t individual_position, const std::string &locality_name)
Set the Locality of an Individual in a Group.
size_t getIndividualSequencePositionInGroup(size_t group_position, size_t individual_position, const std::string &sequence_name) const
Get the position of a Sequence in an Individual of a Group.
const Alphabet * getAlphabet() const
Get the alphabet if there is sequence data.
void deleteLocalityAtPosition(size_t locality_position)
Delete a Locality from the DataSet.
size_t getIndividualPositionInGroup(size_t group_position, const std::string &individual_id) const
Get the position of an Individual in a Group.
const Individual * getIndividualByIdFromGroup(size_t group_position, const std::string &individual_id) const
Get an Individual from a Group.
const Locality< double > & getLocalityAtPosition(size_t locality_position) const
Get a Locality by locality_position.
std::string getGroupName(size_t group_id) const
Get the name of a Group. If the name is an empty string it just returns the group_id.
void setAlphabet(const Alphabet *alpha)
Set the alphabet of the AnalyzedSequences.
bool hasSequenceAtPosition(size_t position) const
Tell if the Individual has a sequence at a given position.
size_t getNumberOfGroups() const
Get the number of Groups.
const Sequence & getSequenceAtPosition(const size_t sequence_position) const
Get a sequence by its position.
void setAnalyzedLoci(const AnalyzedLoci &analyzedLoci)
Set the AnalyzedLoci to the DataSet.
const Point2D< double > * getIndividualCoordInGroup(size_t group_position, size_t individual_position) const
Get the coordinate of an Individual in a Group.
std::vector< std::string > getIndividualSequencesNamesInGroup(size_t group_position, size_t individual_position) const
Get the Sequences' names from an Individual of a Group.
const Individual * getIndividualAtPositionFromGroup(size_t group_position, size_t individual_position) const
Get an Individual from a Group.
void addLocality(Locality< double > &locality)
Add a locality to the DataSet.
The MonolocusGenotype virtual class.
void deleteLocalityByName(const std::string &name)
Delete a Locality from the DataSet.
const Sequence & getIndividualSequenceAtPositionInGroup(size_t group_position, size_t individual_position, size_t sequence_position) const
Get a Sequence from an Individual of a Group.
The AlleleInfo interface.
const MonolocusGenotype * getIndividualMonolocusGenotypeInGroup(size_t group_position, size_t individual_position, size_t locus_position) const
Get a MonolocusGenotype from an Individual of a Group.
void setAlphabet(const Alphabet *alpha)
Set the alphabet used for the sequences.
void addEmptyIndividualToGroup(size_t group_position, const std::string &individual_id)
Add an empty Individual to a Group.
The PolymorphismSequenceContainer class.
std::vector< Group * > groups_
size_t getNumberOfIndividualsInGroup(size_t group_position) const
Get the number of Individuals in a Group.
void initAnalyzedLoci(size_t number_of_loci)
Initialize the AnalyzedLoci for number of loci.
void setIndividualGenotypeInGroup(size_t group_position, size_t individual_position, const MultilocusGenotype &genotype)
Set the MultilocusGenotype of an Individual in a Group.
PolymorphismSequenceContainer * getPolymorphismSequenceContainer(const std::map< size_t, std::vector< size_t > > &selection, size_t sequence_position) const
Get a PolymorphismSequenceContainer from a selection of groups and individuals.
const MultilocusGenotype & getGenotype() const
Get the genotype.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
std::vector< Locality< double > * > localities_
void addEmptyGroup(size_t group_id)
Add an empty Group to the DataSet.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
void addGroupName(size_t group_id, std::string name)
Inserts a name for the given group id.
AnalyzedLoci * analyzedLoci_
void setIndividualCoordInGroup(size_t group_position, size_t individual_position, const Point2D< double > &coord)
Set the coordinates of an Individual in a Group.
The LocusNotFoundException class.
DataSet()
Build a new void DataSet.
void addIndividualSequenceInGroup(size_t group_position, size_t individual_position, size_t sequence_position, const Sequence &sequence)
Add a Sequence to an Individual in a Group.
void initIndividualGenotypeInGroup(size_t group_position, size_t individual_position)
Initialyze the genotype of an Individual in a Group.
void setIndividualMonolocusGenotypeByAlleleKeyInGroup(size_t group_position, size_t individual_position, size_t locus_position, const std::vector< size_t > allele_keys)
Set a MonolocusGenotype of an Individual from a group.