packages feed

sequence-formats-1.3.1: src-tests/SequenceFormats/Eigenstrat/Test.hs

{-# LANGUAGE OverloadedStrings #-}
module SequenceFormats.Eigenstrat.Test (bimReadTest, eigenstratReadTest, eigenstratWriteTest) where

import Control.Foldl (purely, list)
import Control.Monad.IO.Class (liftIO)
import Data.Vector (fromList)
import Pipes (each, runEffect, (>->))
import qualified Pipes.Prelude as P
import Pipes.Safe (runSafeT)
import SequenceFormats.Eigenstrat (readEigenstrat, writeEigenstrat, readBimFile,
    EigenstratSnpEntry(..), EigenstratIndEntry(..), GenoLine, Sex(..), GenoEntry(..))
import SequenceFormats.Utils (Chrom(..))
import Test.Tasty.HUnit (Assertion, assertEqual)

bimReadTest :: Assertion
bimReadTest = do
    let esSnpProd = readBimFile "testDat/example.bim"
    esSnpDat <- runSafeT $ purely P.fold list esSnpProd
    assertEqual "" testDatEigenstratSnp esSnpDat 

eigenstratReadTest :: Assertion
eigenstratReadTest = do
    let esSnpFile = "testDat/example.snp"
        esIndFile = "testDat/example.ind"
        esGenoFile = "testDat/example.eigenstratgeno"
    (indEntries, esProd) <- runSafeT $ readEigenstrat esGenoFile esSnpFile esIndFile
    assertEqual "eigenstratReadTest_assertIndEntries" testDatEigenstratInd indEntries
    snpGenoEntries <- runSafeT $ purely P.fold list esProd
    assertEqual "eigenstratReadTest_assertSnpEntries" testDatEigenstratSnp (map fst snpGenoEntries)
    assertEqual "eigenstratReadTest_assertGenoEntries" testDatEigenstratGeno
        (map snd snpGenoEntries)

eigenstratWriteTest :: Assertion
eigenstratWriteTest = do
    let tmpGeno = "/tmp/eigenstratWriteTest.geno"
        tmpSnp = "/tmp/eigenstratWriteTest.snp"
        tmpInd = "/tmp/eigenstratWriteTest.ind"
        testDatSnpProd = each testDatEigenstratSnp
        testDatGenoProd = each testDatEigenstratGeno
        testDatJointProd = P.zip testDatSnpProd testDatGenoProd
    liftIO . runSafeT . runEffect $
        testDatJointProd >-> writeEigenstrat tmpGeno tmpSnp tmpInd testDatEigenstratInd
    (indEntries, esProd) <- liftIO . runSafeT $ readEigenstrat tmpGeno tmpSnp tmpInd
    liftIO $ assertEqual "eigenstratWriteTest_assertIndEntries" testDatEigenstratInd indEntries
    snpGenoEntries <- liftIO . runSafeT $ purely P.fold list esProd
    liftIO $ assertEqual "eigenstratWriteTest_assertIndEntries" testDatEigenstratSnp
        (map fst snpGenoEntries)
    liftIO $ assertEqual "eigenstratWriteTest_assertIndEntries" testDatEigenstratGeno
        (map snd snpGenoEntries)

testDatEigenstratSnp :: [EigenstratSnpEntry]
testDatEigenstratSnp = [
    EigenstratSnpEntry (Chrom "11") 0      0.000000 "rs0000" 'A' 'C',
    EigenstratSnpEntry (Chrom "11") 100000 0.001000 "rs1111" 'A' 'G',
    EigenstratSnpEntry (Chrom "11") 200000 0.002000 "rs2222" 'A' 'T',
    EigenstratSnpEntry (Chrom "11") 300000 0.003000 "rs3333" 'C' 'A',
    EigenstratSnpEntry (Chrom "11") 400000 0.004000 "rs4444" 'G' 'A',
    EigenstratSnpEntry (Chrom "11") 500000 0.005000 "rs5555" 'T' 'A',
    EigenstratSnpEntry (Chrom "11") 600000 0.006000 "rs6666" 'G' 'T']


testDatEigenstratInd :: [EigenstratIndEntry]
testDatEigenstratInd = [
    EigenstratIndEntry "SAMPLE0" Female "Case",
    EigenstratIndEntry "SAMPLE1" Male "Case",
    EigenstratIndEntry "SAMPLE2" Female "Control",
    EigenstratIndEntry "SAMPLE3" Male "Control",
    EigenstratIndEntry "SAMPLE4" Female "Control"]

testDatEigenstratGeno :: [GenoLine]
testDatEigenstratGeno = [
    fromList [Het, Het, Het, HomAlt, HomAlt],
    fromList [HomAlt, Het, HomRef, Het, HomRef],
    fromList [HomRef, Het, Het, HomAlt, Het],
    fromList [HomAlt, Missing, Het, HomRef, HomRef],
    fromList [HomRef, Het, Het, HomAlt, HomAlt],
    fromList [HomAlt, HomAlt, Het, Missing, Het],
    fromList [HomRef, HomRef, Het, Missing, Missing]]