packages feed

hPDB-examples-0.9999: examples/StericClashCheck.hs

{-# LANGUAGE OverloadedStrings, DisambiguateRecordFields, ScopedTypeVariables  #-}

module Main where

import qualified System.Environment as Env
import qualified Data.ByteString.Char8 as BS
import qualified Data.Octree as Oct
import Bio.PDB               as PDB
import qualified Bio.PDB.Structure.Elements as Elt

-- TODO: way to hand over Atom object along with its Residue, Chain and Model
-- TODO: make it so that Show gives a "full_id" string by default, e.g. Model, chain, residue id, atom name.
clashCheck s1 s2 = filter (/= []) . Prelude.map clashes $ itfoldr (:) [] s2
  where
    clashes (at :: PDB.Atom) = Oct.withinRange ot (radius + maxRadius) (v3v $ PDB.coord at)
      where
        radius :: Double = realToFrac $ Elt.vanDerWaalsRadius . PDB.element $ at
    ot :: Oct.Octree (Int, Double)
    ot = makeOctree s1

extract :: PDB.Atom -> (Oct.Vector3, (Int, Double))
extract (PDB.Atom { coord    = cvec,
                    atSerial = ser ,
                    element  = elt }) = (v3v cvec,
                                         (ser, realToFrac vdw))
  where
    vdw    = Elt.vanDerWaalsRadius elt

makeOctree structure = Oct.fromList . Prelude.map extract . itfoldr (:) [] $ structure

-- Bio.PDB.Structure.Elements should export max bound for vdw etc.
-- or a list of known element codes.
maxRadius = 1.6

v3v = id

size ot =  length . Oct.toList $ ot

main = do [input1, input2] <- Env.getArgs
          Just structure1 <- PDB.parse input1
          Just structure2 <- PDB.parse input2
          print $ clashCheck structure1 structure2
          print "Depths:"
          print . Oct.depth . makeOctree $ structure1
          print . Oct.depth . makeOctree $ structure2
          print "Sizes:"
          print . size      . makeOctree $ structure1
          print . size      . makeOctree $ structure2