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() + 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();
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())
285 return *(groups_[group_position]);
292 if (group_position >= groups_.size())
294 delete groups_[group_position];
295 groups_.erase(groups_.begin() + 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())
411 groups_[group]->addIndividual(individual);
412 if (individual.hasSequences())
413 setAlphabet(individual.getSequenceAlphabet());
425 if (group >= 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);
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);
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);
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);
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);
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);
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);
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);
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));
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);
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());
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);
715 throw NullPointerException(
"DataSet::getIndividualSequenceByNameInGroup: individual has no sequences.");
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);
735 if (
string(ioobe.
what()).find(
"individual_position") < string(ioobe.
what()).size())
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);
763 throw NullPointerException(
"DataSet::deleteIndividualSequenceByNameInGroup: individual has no sequences.");
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);
783 if (
string(ioobe.
what()).find(
"individual_position") < string(ioobe.
what()).size())
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);
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);
831 throw NullPointerException(
"DataSet::getIndividualSequencePositionInGroup: individual has no sequences.");
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);
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);
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());
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);
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);
931 if (
string(ioobe.
what()).find(
"individual_position") < string(ioobe.
what()).size())
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);
955 if (
string(ioobe.
what()).find(
"individual_position") < string(ioobe.
what()).size())
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);
984 if (
string(ioobe.
what()).find(
"individual_position") < string(ioobe.
what()).size())
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);
1012 if (
string(ioobe.
what()).find(
"individual_position") < string(ioobe.
what()).size())
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();
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)
1116 analyzedLoci_->setLocusInfo(locus_position, locus);
1120 throw IndexOutOfBoundsException(
"DataSet::setLocusInfo: locus_position out of bounds.", locus_position, 0, analyzedLoci_->getNumberOfLoci());
1128 if (analyzedLoci_ == 0)
1132 return analyzedLoci_->getLocusInfoByName(locus_name);
1144 if (analyzedLoci_ == 0)
1148 return analyzedLoci_->getLocusInfoAtPosition(locus_position);
1164 if (analyzedLoci_ == 0)
1168 analyzedLoci_->addAlleleInfoByLocusName(locus_name, allele);
1184 if (analyzedLoci_ == 0)
1188 analyzedLoci_->addAlleleInfoByLocusPosition(locus_position, allele);
1205 throw NullPointerException(
"DataSet::getNumberOfLoci: there's no AnalyzedLoci.");
1213 if (analyzedLoci_ == 0)
1217 return analyzedLoci_->getPloidyByLocusName(locus_name);
1229 if (analyzedLoci_ == 0)
1233 return analyzedLoci_->getPloidyByLocusPosition(locus_position);
1251 string name =
groups_[i]->getGroupName();
1271 for (map<
size_t, vector<size_t> >::const_iterator it = selection.begin(); it != selection.end(); it++)
1282 string name =
groups_[i]->getGroupName();
1284 for (
size_t j = 0; j < it->second.size(); j++)
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);