Mercurial > repos > dereeper > sniplay
diff egglib/egglib-2.1.5/include/egglib-cpp/SitePolymorphism.hpp @ 1:420b57c3c185 draft
Uploaded
author | dereeper |
---|---|
date | Fri, 10 Jul 2015 04:39:30 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/egglib/egglib-2.1.5/include/egglib-cpp/SitePolymorphism.hpp Fri Jul 10 04:39:30 2015 -0400 @@ -0,0 +1,207 @@ +/* + Copyright 2008-2009 Stéphane De Mita, Mathieu Siol + + This file is part of the EggLib library. + + EggLib is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + EggLib is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with EggLib. If not, see <http://www.gnu.org/licenses/>. +*/ + + +#ifndef EGGLIB_SITEPOLYMORPHISM_HPP +#define EGGLIB_SITEPOLYMORPHISM_HPP + + + +namespace egglib { + + + /** \brief Implements diversity analysis at the site level + * + * \ingroup polymorphism + * + * Data are loaded along with a population index. It is necessary to + * set the number of populations prior to use. + * + * Outgroup sequence must be loaded separetedly. There can be any + * number of outgroups, but they must be all consistent otherwise the + * site will be considered as not orientable. + * + */ + class SitePolymorphism { + + public: + + /** \brief Builds an object + * + */ + SitePolymorphism(); + + + /** \brief Builds an object + * + * \param npop number of populations + * + */ + SitePolymorphism(unsigned int npop); + + + /** \brief Destroys an object + * + */ + virtual ~SitePolymorphism(); + + + /** \brief Copy constructor + * + */ + SitePolymorphism(const SitePolymorphism& source); + + + /** \brief Assignment operator + * + */ + SitePolymorphism& operator=(const SitePolymorphism& source); + + + /** \brief Sets the number of populations + * + * NOTE THAT all previous data is lost. + * + */ + void numberOfPopulations(unsigned int npop); + + + /** \brief Adds a character + * + * \param populationIndex the index of the population from + * which is sampled this character (do not use "population + * label"). + * + * \param character the character value (it is assumed it + * represents a valid character. + * + */ + void load(unsigned int populationIndex, char character); + + + /** \brief Loads outgroup state + * + * There can be any number of outgroup states. Only + * characters that are considered as valid (whatever the list + * is) should be loaded. + * + */ + void outgroup(char state); + + + /** \brief Number of different alleles + * + */ + unsigned int numberOfAlleles() const; + + + /** \brief Gets an allele (unsecure) + * + * Assumes that the index provided lies in the valid range + * + */ + char allele(unsigned int index) const; + + + /** \brief Gets a frequency (unsecure) + * + * The sum of of frequencies of the allele over populations + * is computed. Not out-of-bounds check is performed. + * + */ + unsigned int alleleFrequency(unsigned int alleleIndex) const; + + + /** \brief Gets the frequency of an allele in one pop (unsecure) + * + * The frequency of the allele in the given population is + * returned. Not out-of-bounds check is performed. + * + */ + unsigned int alleleFrequency(unsigned int popIndex, unsigned int alleleIndex) const; + + + /** \brief Sums the frequency of derived allele(s) + * + * This method assumes that the site is orientable. It will + * use as outgroup the first outgroup character entered, + * assuming at least one was entered and that all (if more + * than one) were identical. + * + */ + unsigned int derivedAlleleFrequency() const; + + + /** \brief Number of sequences that were analyzed + * + */ + unsigned int ns() const; + + + /** \brief Gets the number of analyzed sequences for a population + * + * No out-of-bound check is performed + * + */ + unsigned int ns(unsigned int popIndex) const; + + + /** \brief Checks if the site can be oriented + * + * Returns true if at least one outgroup datum has been + * loaded, if all outgroup data are identical (regardless of + * their value) and if the outgroup allele is one of the + * allele in the sample. + * + */ + bool isOrientable() const; + + bool isPolymorphic(unsigned int popIndex) const; + bool hasSpecificAllele(unsigned int popIndex, bool restrictToDerived) const; + bool haveFixedDifference(unsigned int pop1, unsigned int pop2) const; + bool haveCommonAllele(unsigned int pop1, unsigned int pop2) const; + bool haveSharedAllele(unsigned int pop1, unsigned int pop2) const; + + + + + protected: + + // helpers + void init(); + void clear(); + void copy(const SitePolymorphism& site); + + + // data + unsigned int m_numberOfPopulations; + unsigned int m_numberOfStates; + char * m_states; + unsigned int ** m_frequencies; + unsigned int m_numberOfOutgroups; + char * m_outgroups; + unsigned int m_ns; + unsigned int * m_pop_ns; + + bool m_cache_orientable; + + }; +} + +#endif