packages feed

tlynx-0.2.1: src/TLynx/Coalesce/Options.hs

{-# LANGUAGE DeriveGeneric #-}

{- |
Module      :  TLynx.Coalesce.Options
Description :  Argument parser for @slynx coalesce@
Copyright   :  (c) Dominik Schrempf 2020
License     :  GPL-3.0-or-later

Maintainer  :  dominik.schrempf@gmail.com
Stability   :  unstable
Portability :  portable

Creation date: Fri May  3 11:51:07 2019.

-}

module TLynx.Coalesce.Options
  ( CoalesceArguments(..)
  , coalesceArguments
  , reportCoalesceArguments
  , coalesceFooter
  )
where

import           Data.List
import           Options.Applicative

import           ELynx.Tools

-- | Arguments need to simulate phylogenetic trees using the coalescent process.
data CoalesceArguments = CoalesceArguments
  { argsNTrees  :: Int            -- ^ Number of simulated trees.
  , argsNLeaves :: Int            -- ^ Number of leaves per tree.
  , argsRho     :: Maybe Double   -- ^ Perform random sub-sampling with given sampling rate.
  , argsSumStat :: Bool           -- ^ Only print summary statistics?
  , argsSeed    :: Seed           -- ^ Seed of NRG, random if 'Nothing'.
  }
  deriving (Eq, Show, Generic)

instance Reproducible CoalesceArguments where
  inFiles _ = []
  outSuffixes _ = [".tree"]
  getSeed = Just . argsSeed
  setSeed a s = a { argsSeed = Fixed s }
  parser  = coalesceArguments
  cmdName = "coalesce"
  cmdDsc =
    [ "Simulate phylogenetic trees using the coalescent processes (see also the 'simulate' command for simulations using the birth and death process)."
    ]
  cmdFtr = coalesceFooter

instance FromJSON CoalesceArguments

instance ToJSON CoalesceArguments

-- | Print useful information about the provided arguments.
reportCoalesceArguments :: CoalesceArguments -> String
reportCoalesceArguments a = intercalate
  "\n"
  [ "Number of simulated trees: " ++ show (argsNTrees a)
  , "Number of leaves per tree: " ++ show (argsNLeaves a)
  , "Sub-sampling: " ++ ssStr
  , "Summary statistics only: " ++ show (argsSumStat a)
  ]
 where
  ssStr = case argsRho a of
    Nothing -> "No"
    Just r  -> "Yes, with probability " <> show r

-- | Command line parser.
coalesceArguments :: Parser CoalesceArguments
coalesceArguments =
  CoalesceArguments
    <$> nTreeOpt
    <*> nLeavesOpt
    <*> rhoOpt
    <*> sumStatOpt
    <*> seedOpt

nTreeOpt :: Parser Int
nTreeOpt =
  option auto
    $  long "nTrees"
    <> short 't'
    <> metavar "INT"
    <> value 10
    <> showDefault
    <> help "Number of trees"

nLeavesOpt :: Parser Int
nLeavesOpt =
  option auto
    $  long "nLeaves"
    <> short 'n'
    <> metavar "INT"
    <> value 5
    <> showDefault
    <> help "Number of leaves per tree"

rhoOpt :: Parser (Maybe Double)
rhoOpt =
  optional
    $  option auto
    $  long "sub-sample"
    <> short 'r'
    <> metavar "DOUBLE"
    <> showDefault
    <> help
         "Perform random sub-sampling with sampling probability rho (see below)"

sumStatOpt :: Parser Bool
sumStatOpt =
  switch $ long "summary-statistics" <> short 's' <> showDefault <> help
    "Only output number of children for each branch"

-- | And a footer.
coalesceFooter :: [String]
coalesceFooter =
  [ "Sub-sampling: simulate one big tree with n'=round(n/rho), n'>=n, leaves, and randomly sample sub-trees with n leaves. Hence, with rho=1.0, the same tree is reported over and over again."
  , "Summary statistics: only print (NumberOfExtantChildren BranchLength) pairs for each branch of each tree. The trees are separated by a newline character."
  ]