diff --git a/exampleData/fourPop.histogram.txt b/exampleData/fourPop.histogram.txt index e597d0c..aa36afe 100644 --- a/exampleData/fourPop.histogram.txt +++ b/exampleData/fourPop.histogram.txt @@ -1,8 +1,7 @@ NAMES=EUR,SEA,SIB,FAM N=66,44,44,28 MAX_M=10 -0,0,0,0 2159959569 -HIGHER 3462654 +TOTAL_SITES=2170616682 1,0,0,0 1525898 0,1,0,0 1075097 0,0,1,0 818979 diff --git a/src-rarecoal/Main.hs b/src-rarecoal/Main.hs index 956252d..cd0f797 100644 --- a/src-rarecoal/Main.hs +++ b/src-rarecoal/Main.hs @@ -185,11 +185,11 @@ parseHistOpts = HistogramOptions <$> parseHistPath <*> parseMinAf <*> \square-brackets. Gives all branches (as 0-based indices) in which you \ \require at least one derived allele for the computation of the \ \likelihood. This is useful for mapping ancient samples onto a tree" <> - OP.value [] <> OP.hidden + OP.value [] <> OP.showDefault parseExcludePattern = OP.option OP.auto $ OP.long "excludePattern" <> OP.metavar "[INT,INT,...]" <> OP.help "a comma-separated list without \ \spaces and surrounded by square-brackets. Gives a pattern to exclude \ - \from fitting. Can be given multiple times" <> OP.hidden + \from fitting. Can be given multiple times" <> OP.hidden <> OP.value [] <> OP.showDefault parseMaxl :: OP.Parser Command parseMaxl = CmdMaxl <$> parseMaxlOpt diff --git a/src-rarecoal/Maxl.hs b/src-rarecoal/Maxl.hs index bfa80a0..827ff21 100644 --- a/src-rarecoal/Maxl.hs +++ b/src-rarecoal/Maxl.hs @@ -2,7 +2,7 @@ module Maxl (runMaxl, MaxlOpt(..)) where import Rarecoal.ModelTemplate (ModelTemplate(..), instantiateModel, getModelTemplate, - ModelOptions(..), ParamOptions(..), makeParameterDict, getParamNames) + ModelOptions(..), ParamOptions(..), makeParameterDict, getParamNames, fillParameterDictWithDefaults) import Rarecoal.Utils (GeneralOptions(..), HistogramOptions(..), setNrProcessors, loadHistogram) import Rarecoal.MaxUtils (penalty, minFunc, computeFrequencySpectrum, writeFullFitTable, writeSummaryFitTable, makeInitialPoint) @@ -30,7 +30,8 @@ runMaxl :: MaxlOpt -> Script () runMaxl opts = do scriptIO $ setNrProcessors (maGeneralOpts opts) modelTemplate <- getModelTemplate (maModelOpts opts) - modelParams <- scriptIO $ makeParameterDict (maParamOpts opts) + modelParams <- (scriptIO $ makeParameterDict (maParamOpts opts)) >>= + fillParameterDictWithDefaults modelTemplate _ <- tryRight $ instantiateModel (maGeneralOpts opts) modelTemplate modelParams let modelBranchNames = mtBranchNames modelTemplate hist <- loadHistogram (maHistogramOpts opts) modelBranchNames diff --git a/src-rarecoal/Mcmc.hs b/src-rarecoal/Mcmc.hs index c0856a5..97db9cb 100644 --- a/src-rarecoal/Mcmc.hs +++ b/src-rarecoal/Mcmc.hs @@ -2,7 +2,7 @@ module Mcmc (runMcmc, McmcOpt(..)) where import Rarecoal.Utils (GeneralOptions(..), HistogramOptions(..), setNrProcessors) import Rarecoal.ModelTemplate (ModelTemplate(..), ParamOptions(..), ModelOptions(..), - getModelTemplate, instantiateModel, getParamNames, makeParameterDict) + getModelTemplate, instantiateModel, getParamNames, makeParameterDict, fillParameterDictWithDefaults) import Rarecoal.Utils (loadHistogram) import Rarecoal.MaxUtils (minFunc, penalty, writeFullFitTable, writeSummaryFitTable, makeInitialPoint, computeFrequencySpectrum) @@ -49,7 +49,8 @@ runMcmc :: McmcOpt -> Script () runMcmc opts = do scriptIO $ setNrProcessors (mcGeneralOpts opts) modelTemplate <- getModelTemplate (mcModelOpts opts) - modelParams <- scriptIO $ makeParameterDict (mcParamOpts opts) + modelParams <- (scriptIO $ makeParameterDict (mcParamOpts opts)) >>= + fillParameterDictWithDefaults modelTemplate _ <- tryRight $ instantiateModel (mcGeneralOpts opts) modelTemplate modelParams let modelBranchNames = mtBranchNames modelTemplate hist <- loadHistogram (mcHistogramOpts opts) modelBranchNames diff --git a/src/Rarecoal/ModelTemplate.hs b/src/Rarecoal/ModelTemplate.hs index 9cce547..34ccf34 100644 --- a/src/Rarecoal/ModelTemplate.hs +++ b/src/Rarecoal/ModelTemplate.hs @@ -19,7 +19,6 @@ import Control.Monad.Trans.Except (throwE) import Data.Char (isAlphaNum) -- import Debug.Trace (trace) import Data.List (elemIndex, nub) -import Data.Maybe (catMaybes) import qualified Data.Text as T import qualified Data.Text.IO as T import qualified Text.Parsec as P @@ -72,7 +71,8 @@ getModelTemplate mo = do ", constraints "%w%" and parameters "%w) n e c paramNames modelTemplateP :: Parser ModelTemplate -modelTemplateP = ModelTemplate <$> parseBranchNames <*> parseEvents <*> parseConstraints +modelTemplateP = ModelTemplate <$> parseBranchNames <*> parseEvents <*> + (parseConstraints <|> pure []) parseBranchNames :: Parser [T.Text] parseBranchNames = PC.string "BRANCHES" *> PC.spaces *> PC.char '=' *> PC.spaces *> PC.char '[' *> @@ -259,17 +259,17 @@ fillParameterDictWithDefaults :: ModelTemplate -> [(T.Text, Double)] -> Script [(T.Text, Double)] fillParameterDictWithDefaults mt paramsDict = do let paramNames = getParamNames mt - fmap catMaybes . forM paramNames $ \p -> + forM paramNames $ \p -> case p `lookup` paramsDict of - Just _ -> return Nothing + Just v -> return (p, v) Nothing | T.head p == 'p' -> do scriptIO . errLn $ format ("setting parameter "%w%" = 1.0 (default)") p - return $ Just (p, 1.0) + return (p, 1.0) | T.take 3 p == "adm" -> do scriptIO . errLn $ format ("setting parameter "%w% - " = 0.05 (d efault)") p - return $ Just (p, 0.05) + " = 0.05 (default)") p + return (p, 0.05) | otherwise -> throwE $ format ("Don't know how to initialize \ \parameter "%w%". Please provide initial \ diff --git a/src/Rarecoal/ModelTemplate/Test.hs b/src/Rarecoal/ModelTemplate/Test.hs index 37ab2fc..50d6f7c 100644 --- a/src/Rarecoal/ModelTemplate/Test.hs +++ b/src/Rarecoal/ModelTemplate/Test.hs @@ -1,7 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} module Rarecoal.ModelTemplate.Test (tests) where -import Rarecoal.Utils (defaultTimes) import Rarecoal.ModelTemplate (ModelTemplate(..), MTEvent(..), MTConstraint(..), ParamSpec(..), ConstraintOperator(..), getModelTemplate, ModelOptions(..))