50 throw BadIntegerException(
"MultilocusGenotype::MultilocusGenotype: loci_number must be > 0.", static_cast<int>(loci_number));
53 for (
size_t i = 0; i < loci_number; i++)
61 for (
size_t i = 0; i < genotype.
size(); i++)
74 for (
size_t i = 0; i <
loci_.size(); i++)
86 if (locus_position < loci_.size())
87 loci_[locus_position] = dynamic_cast<MonolocusGenotype*>(monogen.clone());
89 throw IndexOutOfBoundsException(
"MultilocusGenotype::setMonolocusGenotype: locus_position out of bounds.",
90 locus_position, 0, loci_.size());
94 const std::vector<size_t>& allele_keys)
throw (Exception)
96 if (allele_keys.size() < 1)
97 throw Exception(
"MultilocusGenotype::setMonolocusGenotypeByAlleleKey: no key in allele_keys.");
99 if (locus_position < loci_.size())
104 throw IndexOutOfBoundsException(
"MultilocusGenotype::setMonolocusGenotype: locus_position out of bounds.",
105 locus_position, 0, loci_.size());
109 const std::vector<std::string>& allele_id,
const LocusInfo& locus_info)
throw (Exception)
111 vector<size_t> allele_keys;
112 for (
size_t i = 0; i < allele_id.size(); i++)
116 allele_keys.push_back(locus_info.getAlleleInfoKey(allele_id[i]));
125 setMonolocusGenotypeByAlleleKey(locus_position, allele_keys);
127 catch (IndexOutOfBoundsException& ioobe)
129 throw IndexOutOfBoundsException(
"MultilocusGenotype::setMonolocusGenotypeByAlleleId: locus_position out of bounds.", ioobe.getBadIndex(), ioobe.getBounds()[0], ioobe.getBounds()[1]);
135 if (locus_position >= loci_.size())
136 throw IndexOutOfBoundsException(
"MultilocusGenotype::setMonolocusGenotypeAsMissing: locus_position out of bounds.", locus_position, 0, loci_.size());
137 if (loci_[locus_position] != NULL)
138 delete loci_[locus_position];
139 loci_[locus_position] = NULL;
144 if (locus_position >= loci_.size())
145 throw IndexOutOfBoundsException(
"MultilocusGenotype::isMonolocusGenotypeMissing: locus_position out of bounds.", locus_position, 0, loci_.size());
146 return loci_[locus_position] == NULL;
151 if (locus_position >= loci_.size())
152 throw IndexOutOfBoundsException(
"MultilocusGenotype::getMonolocusGenotype: locus_position out of bounds", locus_position, 0, loci_.size());
153 return *loci_[locus_position];
164 for (
size_t i = 0; i <
loci_.size(); i++)
166 if (
loci_[i] != NULL)
175 for (
size_t i = 0; i <
loci_.size(); i++)
179 if (dynamic_cast<BiAlleleMonolocusGenotype*>(
loci_[i])->isHomozygous())
191 for (
size_t i = 0; i <
loci_.size(); i++)
195 if (!(dynamic_cast<BiAlleleMonolocusGenotype*>(
loci_[i])->isHomozygous()))
size_t countNonMissingLoci() const
Count the number of non missing MonolocusGenotype.
std::vector< MonolocusGenotype * > loci_
void setMonolocusGenotypeAsMissing(size_t locus_position)
Set a MonolocusGenotype as missing data.
const MonolocusGenotype & getMonolocusGenotype(size_t locus_position) const
Get a MonolocusGenotype.
virtual const std::string getIdentifier() const
Return the value of the identifier as a string.
The MultilocusGenotype class.
size_t countHomozygousLoci() const
Count the number of homozygous MonolocusGenotype.
bool isMonolocusGenotypeMissing(size_t locus_position) const
Tell if a MonolocusGenotype is a missing data.
void setMonolocusGenotypeByAlleleId(size_t locus_position, const std::vector< std::string > &allele_id, const LocusInfo &locus_info)
Set a MonolocusGenotype by allele id.
The AlleleNotFoundException class.
~MultilocusGenotype()
Destroy a MultilocusGenotype.
size_t countHeterozygousLoci() const
Count the number of heterozygous MonolocusGenotype.
void setMonolocusGenotypeByAlleleKey(size_t locus_position, const std::vector< size_t > &allele_keys)
Set a MonolocusGenotype by allele keys.
size_t size() const
Count the number of loci.
The MonolocusGenotype virtual class.
void setMonolocusGenotype(size_t locus_position, const MonolocusGenotype &monogen)
Set a MonolocusGenotype.
MultilocusGenotype(size_t loci_number)
Build a MultilocusGenotype linked to an AnalyzedLoci object.