#ifndef __DISTPLUSINV #define __DISTPLUSINV /************************************************************ This class describes a combination of a predefined dsitrubtion , with an additional invariant category of probability _Pinv This category is always the last rate category (i.e., rate(categories()) == 0) ************************************************************/ #include "definitions.h" #include "distribution.h" class distributionPlusInvariant : public distribution { public: explicit distributionPlusInvariant( distribution* pDist, const MDOUBLE pInv, const MDOUBLE globalRate=1, MDOUBLE rateInvariantVal=1e-10); explicit distributionPlusInvariant(); distributionPlusInvariant(const distributionPlusInvariant& other): _pBaseDist(NULL){(*this) = other;} virtual distributionPlusInvariant& operator=(const distributionPlusInvariant& other); distributionPlusInvariant* clone() const {return new distributionPlusInvariant(*this);} virtual ~distributionPlusInvariant(); distribution* getBaseDistribution(){return _pBaseDist;} //get/set the parameters of the mixture const int categories() const; void setGlobalRate(const MDOUBLE r) {_globalRate = r;} MDOUBLE getGlobalRate() const {return _globalRate;} virtual void setInvProb(const MDOUBLE p) {_Pinv = p;} const MDOUBLE getInvProb() const {return _Pinv;} //get distribution statistics virtual const MDOUBLE getCumulativeProb(const MDOUBLE x) const; virtual const MDOUBLE rates(const int category) const; virtual const MDOUBLE ratesProb(const int i) const; protected: MDOUBLE _globalRate; MDOUBLE _Pinv; MDOUBLE _rateInvariantVal; distribution* _pBaseDist; }; #endif