diff egglib/egglib-2.1.5/include/egglib-cpp/Arg.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/Arg.hpp	Fri Jul 10 04:39:30 2015 -0400
@@ -0,0 +1,300 @@
+/*
+    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_ARG_HPP
+#define EGGLIB_ARG_HPP
+
+
+#include "Current.hpp"
+#include "Edge.hpp"
+#include <string>
+
+
+/** \defgroup coalesce coalesce
+ *
+ * \brief Coalescent simulator
+ *
+ * The set of classes implements a three-scale coalescent simulator with
+ * recombination, and a flexible mutation model. The main classes are
+ * Controller (the starting point for generating genealogies), ParamSet
+ * (that centralizes parameter specification), the Change hierarchy
+ * (that implements demographic change specifications), Arg (ancestral
+ * recombination graph; the result of generation a genealogy) and
+ * Mutator (that generates genotype data from an ARG).
+ * 
+ */
+
+
+namespace egglib {
+    
+    class Random;
+
+   /** \brief Ancestral recombination graph
+    *
+    * \ingroup coalesce
+    * 
+    * This class stores the ARG (genealogical information). It is
+    * progressively built by appropriate (especially regarding to the
+    * timing) calls to coal() and recomb() methods. Then it can be
+    * used by a mutator class to generates data, or it can also
+    * generate newick trees (one tree by non-recombining segment).
+    *
+    */
+    class Arg {
+
+        public:
+        
+           /** \brief Default constructor
+            *
+            * Creates a null, useless, object.
+            *
+            */
+            Arg();
+
+            
+           /** \brief Object initialization
+            * 
+            * \param current address of the Current instance used by
+            * the simulator.
+            * 
+            * \param numberOfSegments number of recombining segments.
+            * 
+            */
+            void set(Current* current, unsigned int numberOfSegments);
+
+            
+           /** \brief Object reset method
+            * 
+            * This method doesn't reset all parameters (the number of
+            * segments and associated tables are retained, as well as
+            * the Edge object pool).
+            * 
+            * \param current address of the Current instance used by
+            * the simulator.
+            * 
+            */
+            void reset(Current* current);
+
+
+           /** \brief Standard constructor
+            * 
+            * \param current address of the Current instance used by
+            * the simulator.
+            * 
+            * \param numberOfSegments number of recombining segments
+            *
+            */
+            Arg(Current* current, unsigned int numberOfSegments);
+
+            
+           /** \brief Destructor
+            * 
+            * Clears all Edge instances referenced in the object.
+            * 
+            */
+            virtual ~Arg();
+            
+
+           /** \brief Gets the current value of the time counter
+            * 
+            */ 
+            double time() const;
+            
+
+           /** \brief Increments the time counter
+            * 
+            */
+            void addTime(double increment);
+            
+
+           /** \brief Performs a coalescence event
+            * 
+            * For this version, the two lineages to coalesce are
+            * predefined.
+            * 
+            * \param incr increment of the time counter.
+            * \param pop index of the population.
+            * \param index1 first lineage to coalesce.
+            * \param index2 second lineage to coalesce.
+            * 
+            */ 
+            void coalescence(double incr, unsigned int pop, unsigned int index1, unsigned int index2);
+
+
+           /** \brief Performs a coalescence event
+            * 
+            * For this version, the two lineages to coalesce are
+            * randomly picked in the given population
+            * 
+            * \param incr increment of the time counter.
+            * \param pop index of the population.
+            * \param random pointer to simulator's random generator
+            * instance.
+            * 
+            */ 
+            void coalescence(double incr, unsigned int pop, Random* random);
+
+
+           /** \brief Performs a recombination event
+            * 
+            * \param incr increment of the time counter.
+            * \param random pointer to simulator's random generator
+            * instance.
+            * 
+            */
+            void recombination(double incr, Random* random);
+            
+
+           /** \brief Places a mutation
+            * 
+            * \param segment index of the segment affected.
+            * 
+            * \param treePosition a random number placed on the
+            * interval defined by the tree length at this position.
+            * 
+            * \return the concerned Edge's address.
+            * 
+            * \todo why this is not encapsulated?
+            * 
+            * Another nerve-taking point: calling this method assume 
+            * that all Edge of have previously undergone a call of
+            * branchLength(position) with intervalPosition - what 
+            * should be done by the called (that is, Mutator) through
+            * my (Arg's) treeLength of something. BEWARE WHEN MODIFYING
+            * (enhancements should be directed to Edge in my view) 
+            * 
+            */
+            Edge* mute(unsigned int segment, double treePosition);
+
+            
+           /** \brief Age of the uMRCA
+            * 
+            * The uMRCA is the ultimate Most Recent Common Ancestor,
+            * that is the point where the last segment finds its most
+            * recent common ancestor. This member will have a meaningful
+            * value only if the coalescent process is completed.
+            * 
+            */
+            inline double ageUltimateMRCA() const {
+                return _time;
+            }
+            
+
+           /** \brief Age of the MRCA for a given segment
+            * 
+            * The MRCA is the Most Recent Common Ancestor, that is the
+            * point where the coalescent process is over (all lineages
+            * have coalesced). This member will have a meaningful
+            * value only if the coalescent process is completed.
+            * 
+            * Note that the value is cached; it is computed only one
+            * upon first call and no again, even if the Arg is modified<
+            * 
+            */
+            inline double ageMRCA(unsigned int segmentIndex) {
+                return _MRCA[segmentIndex]->bottom;
+            }
+
+           /** \brief  MRCA for each segment
+            * 
+            * The MRCA is the Most Recent Common Ancestor, that is the
+            * point where the coalescent process is over (all lineages
+            * have coalesced). This member will have a meaningful
+            * value only if the coalescent process is completed.
+            * 
+            * Note that the value is cached; it is computed only one
+            * upon first call and no again, even if the Arg is modified
+            * 
+            */
+            inline const Edge* MRCA(unsigned int segmentIndex) {
+                return _MRCA[segmentIndex];
+            }
+
+            /// Ultimate MRCA
+            
+            inline const Edge* uMRCA() {
+                return edges[numberOfEdges-1];
+            }
+            
+            
+            /// the number of recombining segments
+            unsigned int numberOfSegments;
+
+           /** \brief Formats the newick-formatted tree for a segment
+            * 
+            */
+            std::string newick(unsigned int segment);
+            
+
+            /// Number of initial lineages
+            unsigned int numberOfSamples;
+
+
+           /** \brief Total tree length (summed over all segments)
+            * 
+            */
+            double totalLength;
+
+           /** \brief Segment-specific tree length
+            * 
+            */
+            double* segmentLengths;
+
+            /// Current number of Edges in the tree (including the MRCA node)
+            unsigned int numberOfEdges;
+
+            /// Total number of recombination events that occurred
+            unsigned int numberOfRecombinationEvents;
+           
+            /// Set the number of actual sites in all branches
+            void set_actualNumberOfSites(unsigned int actualNumberOfSites);
+           
+            
+        private:
+        
+            /// Copy constructor not available
+            Arg(const Arg&) { }
+            
+            /// Assignment operator not available
+            Arg& operator=(const Arg&) { return *this; }
+
+            void init_stable_parameters();
+            void init_variable_parameters();
+            void clear();
+            void addEdge(Edge*);
+            std::string rnewick(Edge* edge, unsigned int segment, double cache);
+
+            Current* current;
+            double _time;
+            Edge** edges;
+            
+            void findMRCA(unsigned int segmentIndex);
+            void computeTotalLength();
+            void computeSegmentLength(unsigned int segmentIndex);
+
+            unsigned int* numberOfEdgesPerSegment;
+            Edge** _MRCA;
+            
+            EdgePool edgePool;
+    };
+
+}
+
+#endif