| 
1
 | 
     1 /*
 | 
| 
 | 
     2     Copyright 2009-2010 Stéphane De Mita, Mathieu Siol
 | 
| 
 | 
     3 
 | 
| 
 | 
     4     This file is part of the EggLib library.
 | 
| 
 | 
     5 
 | 
| 
 | 
     6     EggLib is free software: you can redistribute it and/or modify
 | 
| 
 | 
     7     it under the terms of the GNU General Public License as published by
 | 
| 
 | 
     8     the Free Software Foundation, either version 3 of the License, or
 | 
| 
 | 
     9     (at your option) any later version.
 | 
| 
 | 
    10 
 | 
| 
 | 
    11     EggLib is distributed in the hope that it will be useful,
 | 
| 
 | 
    12     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
| 
 | 
    13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
| 
 | 
    14     GNU General Public License for more details.
 | 
| 
 | 
    15 
 | 
| 
 | 
    16     You should have received a copy of the GNU General Public License
 | 
| 
 | 
    17     along with EggLib.  If not, see <http://www.gnu.org/licenses/>.
 | 
| 
 | 
    18 */
 | 
| 
 | 
    19 
 | 
| 
 | 
    20 #ifndef EGGLIB_CONTROLLER_HPP
 | 
| 
 | 
    21 #define EGGLIB_CONTROLLER_HPP
 | 
| 
 | 
    22 
 | 
| 
 | 
    23 #include "Current.hpp"
 | 
| 
 | 
    24 #include "Arg.hpp"
 | 
| 
 | 
    25 #include "ParamSet.hpp"
 | 
| 
 | 
    26 
 | 
| 
 | 
    27 namespace egglib {
 | 
| 
 | 
    28     
 | 
| 
 | 
    29     class Random;
 | 
| 
 | 
    30 
 | 
| 
 | 
    31    /** \brief Controls a coalescent simulation
 | 
| 
 | 
    32     *
 | 
| 
 | 
    33     * \ingroup coalesce
 | 
| 
 | 
    34     * 
 | 
| 
 | 
    35     * This class generates the gene genealogy, based on the parameters
 | 
| 
 | 
    36     * stocked in a ParamSet object.
 | 
| 
 | 
    37     *
 | 
| 
 | 
    38     */
 | 
| 
 | 
    39     class Controller {
 | 
| 
 | 
    40 
 | 
| 
 | 
    41         public:
 | 
| 
 | 
    42     
 | 
| 
 | 
    43            /** \brief Default constructor
 | 
| 
 | 
    44             *
 | 
| 
 | 
    45             * Uses a default ParamSet object that will not allow
 | 
| 
 | 
    46             * performing simulations.
 | 
| 
 | 
    47             *
 | 
| 
 | 
    48             */
 | 
| 
 | 
    49             Controller();
 | 
| 
 | 
    50 
 | 
| 
 | 
    51            /** \brief Destructor
 | 
| 
 | 
    52             * 
 | 
| 
 | 
    53             */
 | 
| 
 | 
    54             ~Controller();
 | 
| 
 | 
    55             
 | 
| 
 | 
    56            /** \brief Standard constructor
 | 
| 
 | 
    57             * 
 | 
| 
 | 
    58             * \param paramSet a ParamSet object containing run
 | 
| 
 | 
    59             * parameters (it is taken as a reference and stored as this
 | 
| 
 | 
    60             * so it must not be modified during simulations).
 | 
| 
 | 
    61             * 
 | 
| 
 | 
    62             * \param random the address of the random number generator.
 | 
| 
 | 
    63             *
 | 
| 
 | 
    64             */
 | 
| 
 | 
    65             Controller(const ParamSet* paramSet, Random* random);
 | 
| 
 | 
    66             
 | 
| 
 | 
    67           /** \brief Reset for a new simulation
 | 
| 
 | 
    68            * 
 | 
| 
 | 
    69            * Object is reinitiliazed for a new simulation.
 | 
| 
 | 
    70            * 
 | 
| 
 | 
    71            */
 | 
| 
 | 
    72            void reset();
 | 
| 
 | 
    73             
 | 
| 
 | 
    74            /** \brief Increments the coalescent model
 | 
| 
 | 
    75             * 
 | 
| 
 | 
    76             * \return The number of lineages.
 | 
| 
 | 
    77             *
 | 
| 
 | 
    78             */
 | 
| 
 | 
    79             unsigned int step();
 | 
| 
 | 
    80             
 | 
| 
 | 
    81            /** \brief Gets the Ancestral Recombination Graph
 | 
| 
 | 
    82             * 
 | 
| 
 | 
    83             * \return The address of the ARG contained in the object.
 | 
| 
 | 
    84             * 
 | 
| 
 | 
    85             */
 | 
| 
 | 
    86             Arg* getArg();
 | 
| 
 | 
    87 
 | 
| 
 | 
    88            /** \brief Applies a bottleneck to a given population
 | 
| 
 | 
    89             * 
 | 
| 
 | 
    90             * The bottleneck is applied following Galtier, Depaulis and
 | 
| 
 | 
    91             * Barton (Genetics, 2000): the general time counter is
 | 
| 
 | 
    92             * stopped, and coalescence events are performed during a
 | 
| 
 | 
    93             * time (of normal coalescent process) given by the parameter
 | 
| 
 | 
    94             * strength. All coalescent events are instantaneous.
 | 
| 
 | 
    95             * 
 | 
| 
 | 
    96             * \param populationIndex index of the population concerned
 | 
| 
 | 
    97             * by the event.
 | 
| 
 | 
    98             * 
 | 
| 
 | 
    99             * \param strength strength of the bottleneck given by a
 | 
| 
 | 
   100             * number of time units (2N generations times the size of
 | 
| 
 | 
   101             * the population).
 | 
| 
 | 
   102             * 
 | 
| 
 | 
   103             */
 | 
| 
 | 
   104             void bottleneck(unsigned int populationIndex, double strength);
 | 
| 
 | 
   105 
 | 
| 
 | 
   106            /** \brief Migrate a complete population
 | 
| 
 | 
   107             * 
 | 
| 
 | 
   108             * Takes all the lineages currently present in the population
 | 
| 
 | 
   109             * source to the population dest.
 | 
| 
 | 
   110             * 
 | 
| 
 | 
   111             */
 | 
| 
 | 
   112             void moveAllLineages(unsigned int source, unsigned int dest);
 | 
| 
 | 
   113             
 | 
| 
 | 
   114            /** \brief Migrate a complete population
 | 
| 
 | 
   115             * 
 | 
| 
 | 
   116             * Takes all the lineages currently present in the population
 | 
| 
 | 
   117             * source to the population dest.
 | 
| 
 | 
   118             * 
 | 
| 
 | 
   119             * \param source source population.
 | 
| 
 | 
   120             * \param dest destination population.
 | 
| 
 | 
   121             * \param probability the probability that a lineage of
 | 
| 
 | 
   122             * source migrates to dest.
 | 
| 
 | 
   123             * 
 | 
| 
 | 
   124             */
 | 
| 
 | 
   125             void moveSomeLineages(unsigned int source, unsigned int dest, double probability);
 | 
| 
 | 
   126 
 | 
| 
 | 
   127             /// Adds an empty population
 | 
| 
 | 
   128             void addPopulation();
 | 
| 
 | 
   129 
 | 
| 
 | 
   130         private:
 | 
| 
 | 
   131         
 | 
| 
 | 
   132             /// The copy constructor is disabled
 | 
| 
 | 
   133             Controller(const Controller& source) {}
 | 
| 
 | 
   134             
 | 
| 
 | 
   135             /// The assignment operator is disabled
 | 
| 
 | 
   136             Controller& operator=(const Controller& source) {return *this;}
 | 
| 
 | 
   137 
 | 
| 
 | 
   138             void diploids();
 | 
| 
 | 
   139             double getMigrationTime(double& migrationParameterDestination);
 | 
| 
 | 
   140             void getCoalescenceTime(double& destTime, unsigned int& destPopIndex);
 | 
| 
 | 
   141             double getCoalescenceTimeForPopulation(unsigned int populationIndex);
 | 
| 
 | 
   142             double getRecombinationTime() const;
 | 
| 
 | 
   143             void migrate(double migrationParameter);
 | 
| 
 | 
   144 
 | 
| 
 | 
   145             const ParamSet* initialParamSet;
 | 
| 
 | 
   146             ParamSet paramSet;
 | 
| 
 | 
   147             Current current;
 | 
| 
 | 
   148             Arg arg;
 | 
| 
 | 
   149             
 | 
| 
 | 
   150             Random* random;
 | 
| 
 | 
   151 
 | 
| 
 | 
   152     };
 | 
| 
 | 
   153 
 | 
| 
 | 
   154 }
 | 
| 
 | 
   155 
 | 
| 
 | 
   156 #endif
 |