module Bio.Protein.Algebra
    ( phi
    , psi
    , omega
    , chi
    ) where

import           Data.Monoid                    ( First (..) )
import           Control.Lens
import           Bio.Utils.Geometry             ( V3R, R, Ray (..), normalize, rotateR )

import           Bio.Protein.AminoAcid
import           Bio.Protein.Metric
import           Bio.Protein.Chain

type Dihedral m f r g h = (ChainLike m, HasN f, HasCA r, HasC g, HasAtom h, IxValue m ~ AminoAcid f r g (h V3R))

-- | Measure and rotate Psi dihedral angle
--
psi :: forall m f r g h.Dihedral m f r g h => Index m -> Traversal' m R
psi :: forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
Index m -> Traversal' m R
psi Index m
i = forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
ModifyFunction m
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Index m
-> Traversal' m R
rcd (\V3R -> V3R
rot -> (forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasC r, Functor f, Functor g) =>
Lens' (AminoAcid f g r a) a
c forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot)) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasN r, Functor f, Functor g) =>
Lens' (AminoAcid r f g a) a
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasCA r, Functor f, Functor g) =>
Lens' (AminoAcid f r g a) a
ca forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasC r, Functor f, Functor g) =>
Lens' (AminoAcid f g r a) a
c forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (forall a. Enum a => a -> a
succ Index m
i) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasN r, Functor f, Functor g) =>
Lens' (AminoAcid r f g a) a
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) Index m
i

-- | Measure and rotate Phi dihedral angle
--
phi :: forall m f r g h.Dihedral m f r g h => Index m -> Traversal' m R
phi :: forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
Index m -> Traversal' m R
phi Index m
i = forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
ModifyFunction m
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Index m
-> Traversal' m R
rcd (\V3R -> V3R
rot -> (forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasCA r, Functor f, Functor g) =>
Lens' (AminoAcid f r g a) a
ca forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot) forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasC r, Functor f, Functor g) =>
Lens' (AminoAcid f g r a) a
c forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot)) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (forall a. Enum a => a -> a
pred Index m
i) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasC r, Functor f, Functor g) =>
Lens' (AminoAcid f g r a) a
c forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasN r, Functor f, Functor g) =>
Lens' (AminoAcid r f g a) a
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasCA r, Functor f, Functor g) =>
Lens' (AminoAcid f r g a) a
ca forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasC r, Functor f, Functor g) =>
Lens' (AminoAcid f g r a) a
c forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) Index m
i

-- | Measure and rotate Omega dihedral angle
--
omega :: forall m f r g h.Dihedral m f r g h => Index m -> Traversal' m R
omega :: forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
Index m -> Traversal' m R
omega Index m
i = forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
ModifyFunction m
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Index m
-> Traversal' m R
rcd (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (forall a. Enum a => a -> a
pred Index m
i) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasCA r, Functor f, Functor g) =>
Lens' (AminoAcid f r g a) a
ca forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (forall a. Enum a => a -> a
pred Index m
i) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasC r, Functor f, Functor g) =>
Lens' (AminoAcid f g r a) a
c forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasN r, Functor f, Functor g) =>
Lens' (AminoAcid r f g a) a
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) (forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index m
i forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasCA r, Functor f, Functor g) =>
Lens' (AminoAcid f r g a) a
ca forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom) Index m
i

-- | Measure and rotate Chi (1, 2, 3, 4, 5) dihedral angles
--
chi :: forall nr cr h m.(HasN nr, Functor cr, HasAtom h, m ~ AminoAcid nr (Env Radical) cr (h V3R)) => Int -> Traversal' m R
chi :: forall (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h V3R)) =>
Int -> Traversal' m R
chi Int
i = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens m -> Maybe R
getChi m -> Maybe R -> m
setChi forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse
  where
    checkI :: Bool
    checkI :: Bool
checkI = Int
i forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
i forall a. Ord a => a -> a -> Bool
< Int
6

    getChi :: m -> Maybe R
    getChi :: m -> Maybe R
getChi | Bool
checkI    = (forall s a. s -> Getting (First a) s a -> Maybe a
^? forall m a.
Metricable m =>
Getting m a V3R
-> Getting m a V3R
-> Getting m a V3R
-> Getting m a V3R
-> Getting (ReturnMetric m) a R
dihedral @(First V3R) (forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP Int
i) (forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP (Int
i forall a. Num a => a -> a -> a
+ Int
1)) (forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP (Int
i forall a. Num a => a -> a -> a
+ Int
2)) (forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP (Int
i forall a. Num a => a -> a -> a
+ Int
3)))
           | Bool
otherwise = forall a b. a -> b -> a
const forall a. Maybe a
Nothing

    setChi :: m -> Maybe R -> m
    setChi :: m -> Maybe R -> m
setChi m
m Maybe R
Nothing              = m
m
    setChi m
m (Just R
d) | Bool
checkI    = m -> R -> m
safeSetChi m
m R
d
                      | Bool
otherwise = m
m

    safeSetChi :: m -> R -> m
    safeSetChi :: m -> R -> m
safeSetChi m
m R
d = case m -> Maybe R
getChi m
m of
                       Maybe R
Nothing  -> m
m
                       Just R
cud ->
                         let ray :: Ray V3R
ray = forall a. a -> a -> Ray a
Ray (m
m forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?! forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP (Int
i forall a. Num a => a -> a -> a
+ Int
1)) (forall a (f :: * -> *).
(Floating a, Metric f, Epsilon a) =>
f a -> f a
normalize forall a b. (a -> b) -> a -> b
$ m
m forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?! forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP (Int
i forall a. Num a => a -> a -> a
+ Int
2) forall a. Num a => a -> a -> a
- m
m forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?! forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP (Int
i forall a. Num a => a -> a -> a
+ Int
1))
                             rot :: V3R -> V3R
rot = forall a. AffineTransformable a => Ray V3R -> R -> a -> a
rotateR Ray V3R
ray (R
cud forall a. Num a => a -> a -> a
- R
d) :: V3R -> V3R
                         in  Int -> (V3R -> V3R) -> m -> m
rotateRadical Int
i V3R -> V3R
rot m
m

    rotateRadical :: Int -> (V3R -> V3R) -> m -> m
    rotateRadical :: Int -> (V3R -> V3R) -> m -> m
rotateRadical Int
j V3R -> V3R
rot m
m | Int
j forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
/= AA
PRO = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot)
                          -- Chi 2
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ASP =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
od1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
od2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
PHE =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cz  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
HIS =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nd1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ne2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ILE =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
LEU =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ASN =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
od1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nd2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
TRP =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ne1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce3 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cz2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cz3 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ch2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
TYR =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cz  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ch2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
GLU = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
MET = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
GLN = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
LYS = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
2 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ARG = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          -- Chi 3
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
3 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
GLU =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
oe1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
oe2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
3 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
MET =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
sd  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
3 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
GLN =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
oe1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ne2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
3 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
LYS = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
3 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ARG = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          -- Chi 4
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
4 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
LYS =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nz  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
4 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ARG = m -> m
rr forall a b. (a -> b) -> a -> b
$ m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ne  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          -- Chi 5
                          | Int
j forall a. Eq a => a -> a -> Bool
== Int
5 Bool -> Bool -> Bool
&& m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType forall a. Eq a => a -> a -> Bool
== AA
ARG =      m
m forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cz  forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nh1 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                                                                       forall a b. a -> (a -> b) -> b
& forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nh2 forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot
                          | Bool
otherwise                         =      m
m
      where
        rr :: m -> m
rr  = Int -> (V3R -> V3R) -> m -> m
rotateRadical (Int
j forall a. Num a => a -> a -> a
+ Int
1) V3R -> V3R
rot

-- Helper functions

-- | Chi angle point (one to eight)
--   Points 1, 2, 3 and 4 — Chi 1
--   Points 2, 3, 4 and 5 - Chi 2
--   Points 3, 4, 5 and 6 - Chi 3
--   Points 4, 5, 6 and 7 - Chi 4
--   Points 5, 6, 7 and 8 - Chi 5
--
chiP :: forall a nr cr h m.(HasN nr, Functor cr, HasAtom h, m ~ AminoAcid nr (Env Radical) cr (h a)) => Int -> Traversal' m a
chiP :: forall a (nr :: * -> *) (cr :: * -> *) (h :: * -> *) m.
(HasN nr, Functor cr, HasAtom h,
 m ~ AminoAcid nr (Env Radical) cr (h a)) =>
Int -> Traversal' m a
chiP Int
i = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens m -> Maybe a
getChiP m -> Maybe a -> m
setChiP forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse
  where
    checkI :: Bool
    checkI :: Bool
checkI = Int
i forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
i forall a. Ord a => a -> a -> Bool
< Int
9

    chiPL :: Int -> AA -> Traversal' m a
    chiPL :: Int -> AA -> Traversal' m a
chiPL Int
1 AA
_              =           forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasN r, Functor f, Functor g) =>
Lens' (AminoAcid r f g a) a
n  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
2 AA
_              =           forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasCA r, Functor f, Functor g) =>
Lens' (AminoAcid f r g a) a
ca forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
3 AA
_              = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cb  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
4 AA
aa | AA
aa forall a. Eq a => a -> a -> Bool
== AA
CYS = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
sg  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
ILE = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
SER = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
og  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
THR = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
og1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | Bool
otherwise = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cg  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
5 AA
aa | AA
aa forall a. Eq a => a -> a -> Bool
== AA
ASN = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
od1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
ASP = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
od1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
HIS = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nd1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
MET = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
sd  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
LEU = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
PHE = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
TRP = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
TYR = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | Bool
otherwise = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cd  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
6 AA
aa | AA
aa forall a. Eq a => a -> a -> Bool
== AA
ARG = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ne  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
GLN = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
oe1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | AA
aa forall a. Eq a => a -> a -> Bool
== AA
GLU = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
oe1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | Bool
otherwise = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
ce  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
7 AA
aa | AA
aa forall a. Eq a => a -> a -> Bool
== AA
LYS = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nz  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
               | Bool
otherwise = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
cz  forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
8 AA
_              = forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadical r, Functor f, Functor g) =>
Lens' (AminoAcid f (Env r) g a) (RadicalType r a)
radical forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Traversal' (Radical a) a
nh1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. HasAtom f => Lens' (f a) a
atom
    chiPL Int
_ AA
_              = forall a. HasCallStack => [Char] -> a
error [Char]
"You cannot be here, as Chi dihedrals involves only 8 points"

    getChiP :: m -> Maybe a
    getChiP :: m -> Maybe a
getChiP m
m | Bool
checkI    = m
m forall s a. s -> Getting (First a) s a -> Maybe a
^? Int -> AA -> Traversal' m a
chiPL Int
i (m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType)
              | Bool
otherwise = forall a. Maybe a
Nothing

    setChiP :: m -> Maybe a -> m
    setChiP :: m -> Maybe a -> m
setChiP m
m Maybe a
Nothing  = m
m
    setChiP m
m (Just a
v) | Bool
checkI    = forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
over (Int -> AA -> Traversal' m a
chiPL Int
i (m
m forall s a. s -> Getting a s a -> a
^. forall (r :: * -> *) (f :: * -> *) (g :: * -> *) a.
(HasRadicalType r, Functor f, Functor g) =>
Getting AA (AminoAcid f (Env r) g a) AA
radicalType)) (forall a b. a -> b -> a
const a
v) m
m
                       | Bool
otherwise = m
m

type ModifyFunction m = (V3R -> V3R) -> IxValue m -> IxValue m

-- | Rotate cannonical dihedral in backbone
--
rcd :: forall m f r g h.Dihedral m f r g h => ModifyFunction m {- modify function -} ->
                                              Traversal' m V3R {- first  point    -} ->
                                              Traversal' m V3R {- second point    -} ->
                                              Traversal' m V3R {- third  point    -} ->
                                              Traversal' m V3R {- fourth point    -} ->
                                              Index m          {- dihedral index  -} ->
                                              Traversal' m R
rcd :: forall m (f :: * -> *) (r :: * -> *) (g :: * -> *) (h :: * -> *).
Dihedral m f r g h =>
ModifyFunction m
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Traversal' m V3R
-> Index m
-> Traversal' m R
rcd ModifyFunction m
mf Traversal' m V3R
x1 Traversal' m V3R
x2 Traversal' m V3R
x3 Traversal' m V3R
x4 Index m
i = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens m -> Maybe R
getRCD m -> Maybe R -> m
setRCD forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse
  where
    getRCD :: m -> Maybe R
    getRCD :: m -> Maybe R
getRCD = (forall s a. s -> Getting (First a) s a -> Maybe a
^? forall m a.
Metricable m =>
Getting m a V3R
-> Getting m a V3R
-> Getting m a V3R
-> Getting m a V3R
-> Getting (ReturnMetric m) a R
dihedral @(First V3R) Traversal' m V3R
x1 Traversal' m V3R
x2 Traversal' m V3R
x3 Traversal' m V3R
x4)

    setRCD :: m -> Maybe R -> m
    setRCD :: m -> Maybe R -> m
setRCD m
ar Maybe R
Nothing  = m
ar
    setRCD m
ar (Just R
d) = case m -> Maybe R
getRCD m
ar of
                           Maybe R
Nothing -> m
ar
                           Just R
cud ->
                              let ray :: Ray V3R
ray = forall a. a -> a -> Ray a
Ray (m
ar forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?! Traversal' m V3R
x2) (forall a (f :: * -> *).
(Floating a, Metric f, Epsilon a) =>
f a -> f a
normalize forall a b. (a -> b) -> a -> b
$ m
ar forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?! Traversal' m V3R
x3 forall a. Num a => a -> a -> a
- m
ar forall s a. HasCallStack => s -> Getting (Endo a) s a -> a
^?! Traversal' m V3R
x2)
                                  rot :: V3R -> V3R
rot = forall a. AffineTransformable a => Ray V3R -> R -> a -> a
rotateR Ray V3R
ray (R
cud forall a. Num a => a -> a -> a
- R
d)
                                  mfy :: m -> m
mfy = forall m.
ChainLike m =>
Index m -> (IxValue m -> IxValue m) -> m -> m
modify Index m
i (ModifyFunction m
mf V3R -> V3R
rot) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall m.
ChainLike m =>
Index m -> (IxValue m -> IxValue m) -> m -> m
modifyAfter Index m
i (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V3R -> V3R
rot))
                              in  m -> m
mfy m
ar