packages feed

hPDB-examples-0.99: examples/CleanPDB.hs

{-# LANGUAGE OverloadedStrings, FlexibleInstances, UndecidableInstances, ScopedTypeVariables, FlexibleContexts #-}

module Main where

import System.Environment
import Bio.PDB as PDB
import qualified Data.ByteString.Char8 as BS
import Data.List
import Text.Printf
import Data.Vector.V3
import Control.Monad.State(State, modify, get, runState)

type CounterM a = State Int a

counter :: CounterM Int
counter   = do r <- get
               modify (+1)
               return r

runCounterM :: CounterM a -> a
runCounterM = fst . (flip runState) 1

renumberResidues :: (Iterable s Chain) => s -> s
renumberResidues = imap (\ch -> runCounterM          .
                                imapM forEachResidue $ (ch :: Chain))
  where
    forEachResidue r = do v <- counter
                          return $ r { resSeq = v }

renumberAtoms :: (Iterable s Model) => s -> s
renumberAtoms = imap (\m -> runCounterM $
                            imapM forEachChain (m :: Model))
  where
    forEachChain :: Chain -> CounterM Chain
    forEachChain ch = do newCh <- imapM forEachAtom ch
                         counter
                         return newCh
    forEachAtom :: Atom -> CounterM Atom
    forEachAtom at  = do v <- counter
                         return $ at { atSerial = v }

main = do [inpfname, outfname] <- getArgs
          Just structure <- PDB.parse $ BS.pack inpfname
          putStrLn $ show (PDB.numAtoms structure) ++ " atoms."
          let s1 = renumberResidues $ renumberAtoms $ structure
          PDB.write s1 $ BS.pack outfname