view egglib/egglib-2.1.5/include/egglib-cpp/DataMatrix.hpp @ 3:345f88a8f483 draft

Uploaded
author dereeper
date Fri, 10 Jul 2015 10:38:43 -0400
parents 420b57c3c185
children
line wrap: on
line source

/*
    Copyright 2009-2010 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_DATAMATRIX_HPP
#define EGGLIB_DATAMATRIX_HPP


#include "CharMatrix.hpp"


namespace egglib {

    /** \brief Data table
    *
    * \ingroup core
    *
    * Holds a data matrix representing genotype data from simulations.
    * Data are stored as integers, to each site is associated a
    * position, and to each sequence is associated a group index (any
    * integer labelling, for example, a subpopulation). Supports the
    * CharMatrix interface with the condition that allele genotype
    * datum is >=0 and <=9.
    * 
    */
    class DataMatrix : public CharMatrix {
    
    public:
    
        /** \brief Default constructor
         *
         * The data table default dimensions are {0,0}
         *
         */
        DataMatrix();


        /** \brief Standard constructor
         *
         * The data table dimensions must be given.
         * Each cell default default is 0, and each site position is 0..
         *
         * \param numberOfSequences number of lines of the data table.
         * \param numberOfSites number of columns of the data table.
         *
         */
        DataMatrix(unsigned int numberOfSequences, unsigned int numberOfSites);


        /** \brief Copy constructor
         * 
         */
        DataMatrix(const DataMatrix&);


        /** \brief Copy constructor
         * 
         */
        DataMatrix(const CharMatrix&);

        
        /** \brief Assignment operator
         * 
         */
        virtual DataMatrix& operator=(const DataMatrix&);
        
        
        /** \brief Assignment operator
         * 
         */
        virtual DataMatrix& operator=(const CharMatrix&);


        /** \brief Destructor
         * 
         */
        virtual ~DataMatrix();
        
        
        /** \brief Gets number of sites
         * 
         */
        unsigned int numberOfSites() const;


        /** \brief Gets number of sequences
         * 
         */
        unsigned int numberOfSequences() const;
        
        
        /** \brief Sets a value of the data table
         * 
         */
        void set(unsigned int sequence, unsigned int site, int value);


        /** \brief Gets a value from the data table
         * 
         */
        int get(unsigned int sequence, unsigned int site) const;
        
        
        /** \brief Faster and unsecure version of get
         * 
         */
        inline int fget(unsigned int sequence, unsigned int site) const {
            return dataMatrix[sequence][site];
        }


        /** \brief Sets the position of a site
         * 
         */
        void sitePosition(unsigned int site, double value);


        /** \brief Gets the position of a site
         * 
         */
        double sitePosition(unsigned int site) const;


        /** \brief Sets the group label of a sequence
         * 
         */
        void populationLabel(unsigned int sequence, unsigned int value);


        /** \brief Gets the group label of a sequence
         * 
         */
        unsigned int populationLabel(unsigned int sequence) const;


        /** \brief Removes all information from the object
         * 
         */
        void clear();


        /** \brief Resizes the data matrix
         *
         * \param newNumberOfSequences number of sequences (rows)
         * \param newNumberOfSites number of sites (columns)
         *
         * If new values are larger, data already set is left unchanged.
         * New data are set to zero.
         *
         */
        void resize(unsigned int newNumberOfSequences, unsigned int newNumberOfSites);


       /** \brief Shifts allele value
        * 
        * \param minimum the minimum allele value.
        * 
        * Shifts all alleles at all sites to ensure that alleles alleles
        * are equal to or larger than minimum. The shifting is specific
        * to each site.
        * 
        */
        void shift(int minimum);

        /** \brief Gets the character at a given position
         * 
         * An exception is generated if the allele value at this
         * position is not >=0 and <=9. Not out-of-bound check is
         * performed.
         * 
         */
        char character(unsigned int sequence, unsigned int site) const;
        


    private:
        
        // Initializes to default values (for empty object)
        void init();
        
        // Copies from a source object
        virtual void copy(const CharMatrix&);

        // Copies from a source object
        virtual void copy(const DataMatrix&);
        
        // Number of lines of the data matrix
        unsigned int _numberOfSequences;
        
        // Number of columns of the data matrix
        unsigned int _numberOfSites;
        
        // Data matrix
        int **dataMatrix;
        
        // Vector of site positions
        double *positions;
        
        // Vector of group indices
        unsigned int *groups;
    };
}

#endif