packages feed

slynx-0.2.1: src/SLynx/SubSample/Options.hs

{-# LANGUAGE DeriveGeneric #-}

{- |
Module      :  SLynx.SubSample.Options
Description :  ELynxSeq argument parsing
Copyright   :  (c) Dominik Schrempf 2018
License     :  GPL-3.0-or-later

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

Creation date: Sun Oct  7 17:29:45 2018.

-}

module SLynx.SubSample.Options
  ( SubSampleArguments(..)
  , subSampleArguments
  , getOutSuffixes
  )
where

import           Options.Applicative
import qualified Data.Text                     as T
import qualified Data.Text.Lazy                as LT
import qualified Data.Text.Lazy.Builder        as LT
import qualified Data.Text.Lazy.Builder.Int    as LT

import           SLynx.Tools

import           ELynx.Data.Alphabet.Alphabet
import           ELynx.Tools

-- | Data structure holding the Command line arguments.
data SubSampleArguments = SubSampleArguments
    { ssAlphabet    :: Alphabet
    , ssInFile      :: FilePath
    , ssNSites      :: Int
    , ssNAlignments :: Int
    , ssMbSeed      :: Seed }
  deriving (Eq, Show, Generic)

-- | Get a given number of output file suffixes.
--
-- > getOutSuffixes 11 "fasta"
--
-- Will result in @.00.fasta@ up to @.10.fasta@.
getOutSuffixes :: Int -> String -> [String]
getOutSuffixes n suffix =
  [ "." ++ digitStr i ++ "." ++ suffix | i <- [0 .. n - 1] ]
 where
  nDigits = ceiling $ logBase (10 :: Double) (fromIntegral n)
  digitStr i = T.unpack
    $ T.justifyRight nDigits '0' (LT.toStrict $ LT.toLazyText $ LT.decimal i)


instance Reproducible SubSampleArguments where
  inFiles = pure . ssInFile
  outSuffixes a = getOutSuffixes (ssNAlignments a) "fasta"
  getSeed = Just . ssMbSeed
  setSeed a s = a { ssMbSeed = Fixed s }
  parser  = subSampleArguments
  cmdName = "sub-sample"
  cmdDsc  = ["Sub-sample columns from multi sequence alignments."]
  cmdFtr =
    [ "Create a given number of multi sequence alignments, each of which contains a given number of random sites drawn from the original multi sequence alignment."
    ]

instance FromJSON SubSampleArguments

instance ToJSON SubSampleArguments

-- | Sub command parser.
subSampleArguments :: Parser SubSampleArguments
subSampleArguments =
  SubSampleArguments
    <$> alphabetOpt
    <*> filePathArg
    <*> subSampleNSitesOpt
    <*> subSampleNAlignmentsOpt
    <*> seedOpt

subSampleNSitesOpt :: Parser Int
subSampleNSitesOpt =
  option auto $ long "number-of-sites" <> short 'n' <> metavar "INT" <> help
    "Number of sites randomly drawn with replacement"

subSampleNAlignmentsOpt :: Parser Int
subSampleNAlignmentsOpt =
  option auto
    $  long "number-of-alignments"
    <> short 'm'
    <> metavar "INT"
    <> help "Number of multi sequence alignments to be created"

filePathArg :: Parser FilePath
filePathArg =
  strArgument $ metavar "INPUT-FILE" <> help "Read sequences from INPUT-FILE"