symmetry-operations-symbols-0.0.1.0: src/Data/Matrix/SymmetryOperationsSymbols/SymmetryOperation.hs
module Data.Matrix.SymmetryOperationsSymbols.SymmetryOperation (
SymmetryOperation(..),
NFold(..),
Sense(..),
ABC(..),
DGN(..),
showSymmetryOperation,
)
where
import Data.Ratio
import Data.Matrix
import Data.Matrix.AsXYZ
import Data.Matrix.SymmetryOperationsSymbols.Common
data ABC = A | B | C deriving (Show,Eq)
data DGN = D | G | N deriving (Show,Eq)
data NFold = ThreeFold | FourFold | SixFold deriving (Show,Eq)
data Sense = Positive | Negative deriving (Show,Eq)
data SymmetryOperation a
= Identity
| Translation { vector :: (Ratio a,Ratio a,Ratio a) }
| Reflection { plane :: Matrix (Ratio a) }
| GlideABC { abc :: ABC, plane :: Matrix (Ratio a) }
| GlideDGN { dgn :: DGN, plane :: Matrix (Ratio a), glide :: (Ratio a,Ratio a,Ratio a) }
| TwoFoldRotation { axis :: Matrix (Ratio a) }
| TwoFoldScrew { axis :: Matrix (Ratio a), vector :: (Ratio a,Ratio a,Ratio a) }
| NFoldRotation { nFold :: NFold, sense :: Sense, axis :: Matrix (Ratio a) }
| NFoldScrew { nFold :: NFold, sense :: Sense, axis :: Matrix (Ratio a), vector :: (Ratio a,Ratio a,Ratio a) }
| Inversion { centre :: (Ratio a,Ratio a,Ratio a) }
| RotInversion { nFold :: NFold, sense :: Sense, axis :: Matrix (Ratio a), point :: (Ratio a,Ratio a,Ratio a) }
deriving (Show,Eq)
showSymbol :: NFold -> String
showSymbol ThreeFold = "3"
showSymbol FourFold = "4"
showSymbol SixFold = "6"
showSense :: Sense -> String
showSense Positive = "+"
showSense Negative = "-"
showABC :: ABC -> String
showABC A = "a"
showABC B = "b"
showABC C = "c"
showDGN :: DGN -> String
showDGN D = "d"
showDGN G = "g"
showDGN N = "n"
showSymmetryOperation :: Integral a => SymmetryOperation a -> String
showSymmetryOperation Identity = " 1 "
showSymmetryOperation val@Translation {}
= concat [" t ",tripletParen $ vector val," "]
showSymmetryOperation val@Reflection {}
= concat [" m ",prettyXYZ $ plane val]
showSymmetryOperation val@GlideABC {}
= concat [" ",showABC $ abc val," ",prettyXYZ $ plane val]
showSymmetryOperation val@GlideDGN {}
= concat [" ",showDGN $ dgn val," ",tripletParen $ glide val," ",prettyXYZ $ plane val]
showSymmetryOperation val@TwoFoldRotation {}
= concat [" 2 ",prettyXYZ $ axis val]
showSymmetryOperation val@TwoFoldScrew {}
= concat [" 2 ",tripletParen $ vector val," ",prettyXYZ $ axis val]
showSymmetryOperation val@NFoldRotation {}
= concat [" ",showSymbol (nFold val),showSense (sense val)," ",prettyXYZ $ axis val]
showSymmetryOperation val@NFoldScrew {}
= concat [" ",showSymbol (nFold val),showSense (sense val),tripletParen $ vector val," ",prettyXYZ $ axis val]
showSymmetryOperation val@Inversion {}
= concat ["-1 ",triplet $ centre val]
showSymmetryOperation val@RotInversion {}
= concat ["-",showSymbol (nFold val),showSense (sense val)," ",prettyXYZ $ axis val,"; ",triplet $ point val]