packages feed

too-many-cells-3.0.1.0: src/TooManyCells/Program/Motifs.hs

{- TooManyCells.Program.Motifs
Gregory W. Schwartz

Motif entry point for command line program.
-}

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DuplicateRecordFields #-}

module TooManyCells.Program.Motifs where

-- Remote
import Control.Monad (mfilter)
import Data.Maybe (fromMaybe)
import TextShow (showt)
import qualified Data.Text as T
import qualified Turtle as TU

-- Local
import TooManyCells.File.Types
import TooManyCells.Motifs.FindMotif
import TooManyCells.Motifs.Types
import TooManyCells.Program.Options

-- | Motif path.
motifsMain :: Subcommand -> IO ()
motifsMain (MotifsCommand opts) = do
  let genome' = GenomeFile . motifGenome $ opts
      topN' = TopN . (topN :: Motifs -> Int) $ opts
      motifCommand' = MotifCommand . motifCommand $ opts
      motifGenomeCommand' = fmap MotifGenomeCommand
                          . motifGenomeCommand
                          $ opts
      diffFile' = DiffFile . TU.fromText . diffFile $ opts
      backgroundDiffFile' = fmap (BackgroundDiffFile . TU.fromText)
                          . backgroundDiffFile
                          $ opts
      outDir = OutputDirectory
             . (output :: Motifs -> String)
             $ opts

  TU.mktree . TU.fromText . T.pack . unOutputDirectory $ outDir

  TU.sh $ do
    nodes <- TU.liftIO $ getNodes diffFile'
    node <- if null nodes then pure Nothing else TU.select . fmap Just $ nodes

    let outPath = OutputPath
                $ (TU.fromText . T.pack $ unOutputDirectory outDir)
           TU.</> (maybe mempty (TU.fromText . ("node_" <>) . showt . unNode) node)

    case motifGenomeCommand' of
      Nothing -> TU.liftIO
               $ getMotif
                   diffFile'
                   backgroundDiffFile'
                   outPath
                   motifCommand'
                   genome'
                   topN'
                   node
      (Just x) -> TU.liftIO
                $ getMotifGenome
                    diffFile'
                    backgroundDiffFile'
                    outPath
                    x
                    genome'
                    topN'
                    node