packages feed

cmv-1.0.1: src/cmcv/cmcwsvtocmcv.hs

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE FlexibleContexts #-}

-- | Visualize detailed comparsions of Infernal Covariance Models
--   Datastructures and parsing of covariance models is provided by Biobase
--   Visualization is accomplished with diagrams-svg
--   For more information on Infernal consult <http://eddylab.org/infernal/>

module Main where

import Bio.CMCompareResult
import qualified Biobase.SElab.CM as CM
import Biobase.SElab.CM.Import (cmFromFile)
import System.Console.CmdArgs
import Data.Either
import System.Directory
import qualified Data.Text as T
import Paths_cmv (version)
import Data.Version (showVersion)

options :: Options
data Options = Options
  { cmcompareResultFile :: String,
    modelsFile :: String
  } deriving (Show,Data,Typeable)

options = Options
  { cmcompareResultFile = def &= name "r" &= help "Path to CMCompare result file",
    modelsFile = def &= name "m" &= help "Path to covariance model file"
  } &= summary ("cmcwstocmcv " ++ toolVersion ++ "Converts CMcompare webserver output and used model file to comparison file useable by cmcv") &= help "Florian Eggenhofer - 2017" &= verbosity

main :: IO ()
main = do
  Options{..} <- cmdArgs options
  --Validate input
  modelFileExists <- doesFileExist modelsFile
  cmcFileExists <- doesFileExist cmcompareResultFile
  if modelFileExists && cmcFileExists
     then do
       cms <- cmFromFile modelsFile
       cmcResultParsed <- getCmcompareResults cmcompareResultFile
       let comparisons = rights cmcResultParsed
       let currentModelNames = map (T.unpack . CM._name) cms
       let nameTuples = makeNameTuple currentModelNames
       let zippednameTuplesComparisons = zip nameTuples comparisons
       let namedComparisons = concatMap makeNamedComparison zippednameTuplesComparisons
       putStr namedComparisons
     else print "Input files not found\n"

makeNamedComparison :: ((String,String),CmcompareResult) -> String       
makeNamedComparison ((name1,name2),comparison) = show (comparison { model1Name = name1, model2Name = name2 })

makeNameTuple :: [String] -> [(String,String)]
makeNameTuple [] = []
makeNameTuple (mname:mnames)
  | null mnames = []
  | otherwise = ntuples ++ makeNameTuple mnames
    where ntuples = map (\a -> (mname,a)) mnames
toolVersion :: String
toolVersion = showVersion version