diff --git a/Makefile b/Makefile
index 2fdaaa6d3f..d7feb36e2f 100644
--- a/Makefile
+++ b/Makefile
@@ -138,6 +138,7 @@ _opam/%: _opam/opam-init/init.sh ocaml-versions/%.json
opam pin add -n --yes --switch $* base.v0.14.3 https://github.com/janestreet/base.git#v0.14.3
opam pin add -n --yes --switch $* coq-core https://github.com/ejgallego/coq/archive/refs/tags/multicore-2021-09-29.tar.gz
opam pin add -n --yes --switch $* coq-stdlib https://github.com/ejgallego/coq/archive/refs/tags/multicore-2021-09-29.tar.gz
+ opam pin add -n --yes --switch $* dune https://github.com/dra27/dune/archive/2.9.3-5.0.0.tar.gz
opam pin add -n --yes --switch $* ocamlfind https://github.com/dra27/ocamlfind/archive/lib-layout.tar.gz
override_packages/%: setup_sys_dune/%
diff --git a/benchmarks/js_of_ocaml/dune b/benchmarks/js_of_ocaml/dune
new file mode 100644
index 0000000000..ec60dd6b9a
--- /dev/null
+++ b/benchmarks/js_of_ocaml/dune
@@ -0,0 +1,3 @@
+(executable
+ (name frankenstein)
+ (modes byte))
diff --git a/benchmarks/js_of_ocaml/frankenstein.ml b/benchmarks/js_of_ocaml/frankenstein.ml
new file mode 100644
index 0000000000..b0ab1d99b3
--- /dev/null
+++ b/benchmarks/js_of_ocaml/frankenstein.ml
@@ -0,0 +1,7983 @@
+ type t =
+ { red : float
+ ; green : float
+ ; blue : float
+ }
+
+ let make r g b = { red = r; green = g; blue = b }
+
+ (*
+ let print ch c =
+ let r = truncate (c.red *. 255.) in
+ let g = truncate (c.green *. 255.) in
+ let b = truncate (c.blue *. 255.) in
+ Format.fprintf ch "rgb(%d,%d,%d)" r g b
+*)
+
+ let limit c =
+ { red =
+ (let red = c.red in
+ if red <= 0. then 0. else if red > 1.0 then 1.0 else red)
+ ; green =
+ (let green = c.green in
+ if green <= 0. then 0. else if green > 1.0 then 1.0 else green)
+ ; blue =
+ (let blue = c.blue in
+ if blue <= 0. then 0. else if blue > 1.0 then 1.0 else blue)
+ }
+
+ let add c1 c2 =
+ { red = c1.red +. c2.red; green = c1.green +. c2.green; blue = c1.blue +. c2.blue }
+
+ let add_scalar c1 s =
+ limit { red = c1.red +. s; green = c1.green +. s; blue = c1.blue +. s }
+
+
+ let multiply c1 c2 =
+ { red = c1.red *. c2.red; green = c1.green *. c2.green; blue = c1.blue *. c2.blue }
+
+ let multiply_scalar c1 s =
+ { red = c1.red *. s; green = c1.green *. s; blue = c1.blue *. s }
+
+
+ let blend c1 c2 w = add (multiply_scalar c1 (1. -. w)) (multiply_scalar c2 w)
+
+ let brightness c =
+ let r = truncate (c.red *. 255.) in
+ let g = truncate (c.green *. 255.) in
+ let b = truncate (c.blue *. 255.) in
+ ((r * 77) + (g * 150) + (b * 29)) lsr 8
+end
+
+module Vector = struct
+ type t =
+ { x : float
+ ; mutable y : float
+ ; z : float
+ }
+
+ let make x y z = { x; y; z }
+
+ (*
+ let print ch v = Format.fprintf ch "%f %f %f" v.x v.y v.z
+*)
+
+ let magnitude v = sqrt ((v.x *. v.x) +. (v.y *. v.y) +. (v.z *. v.z))
+
+ let normalize v =
+ let m = magnitude v in
+ { x = v.x /. m; y = v.y /. m; z = v.z /. m }
+
+ let cross v w =
+ { x = (v.y *. w.z) -. (v.z *. w.y)
+ ; y = (v.z *. w.x) -. (v.x *. w.z)
+ ; z = (v.x *. w.y) -. (v.y *. w.x)
+ }
+
+ let dot v w = (v.x *. w.x) +. (v.y *. w.y) +. (v.z *. w.z)
+
+ let add v w = { x = v.x +. w.x; y = v.y +. w.y; z = v.z +. w.z }
+
+ let subtract v w = { x = v.x -. w.x; y = v.y -. w.y; z = v.z -. w.z }
+
+ let multiply_scalar v w = { x = v.x *. w; y = v.y *. w; z = v.z *. w }
+end
+
+module Light = struct
+ type t =
+ { position : Vector.t
+ ; color : Color.t
+ ; intensity : float
+ }
+
+ let make p c i = { position = p; color = c; intensity = i }
+end
+
+module Ray = struct
+ type t =
+ { position : Vector.t
+ ; direction : Vector.t
+ }
+
+ let make p d = { position = p; direction = d }
+end
+
+module Intersection_info = struct
+ type 'a t =
+ { shape : 'a
+ ; distance : float
+ ; position : Vector.t
+ ; normal : Vector.t
+ ; color : Color.t
+ }
+end
+
+module Camera = struct
+ type t =
+ { position : Vector.t
+ ; look_at : Vector.t
+ ; equator : Vector.t
+ ; up : Vector.t
+ ; screen : Vector.t
+ }
+
+ let make pos look_at up =
+ { position = pos
+ ; look_at
+ ; up
+ ; equator = Vector.cross (Vector.normalize look_at) up
+ ; screen = Vector.add pos look_at
+ }
+
+ let get_ray c vx vy =
+ let pos =
+ Vector.subtract
+ c.screen
+ (Vector.subtract
+ (Vector.multiply_scalar c.equator vx)
+ (Vector.multiply_scalar c.up vy))
+ in
+ pos.Vector.y <- pos.Vector.y *. -1.;
+ let dir = Vector.subtract pos c.position in
+ Ray.make pos (Vector.normalize dir)
+end
+
+module Background = struct
+ type t =
+ { color : Color.t
+ ; ambience : float
+ }
+
+ let make c a = { color = c; ambience = a }
+end
+
+module Material = struct
+ type t =
+ { reflection : float
+ ; transparency : float
+ ; gloss : float
+ ; has_texture : bool
+ ; get_color : float -> float -> Color.t
+ }
+
+ let wrap_up t =
+ let t = mod_float t 2.0 in
+ if t < -1. then t +. 2.0 else if t >= 1. then t -. 2.0 else t
+
+ let solid color reflection transparency gloss =
+ { reflection
+ ; transparency
+ ; gloss
+ ; has_texture = false
+ ; get_color = (fun _ _ -> color)
+ }
+
+ let chessboard color_even color_odd reflection transparency gloss density =
+ { reflection
+ ; transparency
+ ; gloss
+ ; has_texture = true
+ ; get_color =
+ (fun u v ->
+ let t = wrap_up (u *. density) *. wrap_up (v *. density) in
+ if t < 0. then color_even else color_odd)
+ }
+end
+
+module Shape = struct
+ type shape =
+ | Sphere of Vector.t * float
+ | Plane of Vector.t * float
+
+ type t =
+ { shape : shape
+ ; material : Material.t
+ }
+
+ let make shape material = { shape; material }
+
+ let dummy =
+ make
+ (Sphere (Vector.make 0. 0. 0., 0.))
+ (Material.solid (Color.make 0. 0. 0.) 0. 0. 0.)
+
+ let position s =
+ match s.shape with
+ | Sphere (p, _) -> p
+ | Plane (p, _) -> p
+
+ let intersect s ray =
+ match s.shape with
+ | Sphere (position, radius) ->
+ let dst = Vector.subtract ray.Ray.position position in
+ let b = Vector.dot dst ray.Ray.direction in
+ let c = Vector.dot dst dst -. (radius *. radius) in
+ let d = (b *. b) -. c in
+ if d > 0.
+ then
+ let dist = -.b -. sqrt d in
+ let pos =
+ Vector.add ray.Ray.position (Vector.multiply_scalar ray.Ray.direction dist)
+ in
+ Some
+ { Intersection_info.shape = s
+ ; distance = dist
+ ; position = pos
+ ; normal = Vector.normalize (Vector.subtract pos position)
+ ; color = s.material.Material.get_color 0. 0.
+ }
+ else None
+ | Plane (position, d) ->
+ let vd = Vector.dot position ray.Ray.direction in
+ if vd = 0.
+ then None
+ else
+ let t = -.(Vector.dot position ray.Ray.position +. d) /. vd in
+ if t <= 0.
+ then None
+ else
+ let pos =
+ Vector.add ray.Ray.position (Vector.multiply_scalar ray.Ray.direction t)
+ in
+ Some
+ { Intersection_info.shape = s
+ ; distance = t
+ ; position = pos
+ ; normal = position
+ ; color =
+ (if s.material.Material.has_texture
+ then
+ let vu =
+ Vector.make
+ position.Vector.y
+ position.Vector.z
+ (-.position.Vector.x)
+ in
+ let vv = Vector.cross vu position in
+ let u = Vector.dot pos vu in
+ let v = Vector.dot pos vv in
+ s.material.Material.get_color u v
+ else s.material.Material.get_color 0. 0.)
+ }
+end
+
+module Scene = struct
+ type t =
+ { camera : Camera.t
+ ; shapes : Shape.t array
+ ; lights : Light.t array
+ ; background : Background.t
+ }
+
+ let make c s l b = { camera = c; shapes = s; lights = l; background = b }
+end
+
+module Engine = struct
+ type t =
+ { pixel_width : int
+ ; pixel_height : int
+ ; canvas_width : int
+ ; canvas_height : int
+ ; render_diffuse : bool
+ ; render_shadows : bool
+ ; render_highlights : bool
+ ; render_reflections : bool
+ ; ray_depth : int
+ }
+
+ let check_number = ref 0
+
+ let get_reflection_ray p n v =
+ let c1 = -.Vector.dot n v in
+ let r1 = Vector.add (Vector.multiply_scalar n (2. *. c1)) v in
+ Ray.make p r1
+
+ let rec ray_trace options info ray scene depth =
+ let old_color =
+ Color.multiply_scalar
+ info.Intersection_info.color
+ scene.Scene.background.Background.ambience
+ in
+ let color = ref old_color in
+ let shininess =
+ 10. ** (info.Intersection_info.shape.Shape.material.Material.gloss +. 1.)
+ in
+ let lights = scene.Scene.lights in
+ for i = 0 to Array.length lights - 1 do
+ let light = lights.(i) in
+ let v =
+ Vector.normalize
+ (Vector.subtract light.Light.position info.Intersection_info.position)
+ in
+ (if options.render_diffuse
+ then
+ let l = Vector.dot v info.Intersection_info.normal in
+ if l > 0.
+ then
+ color :=
+ Color.add
+ !color
+ (Color.multiply
+ info.Intersection_info.color
+ (Color.multiply_scalar light.Light.color l)));
+ (if depth <= options.ray_depth
+ then
+ if options.render_reflections
+ && info.Intersection_info.shape.Shape.material.Material.reflection > 0.
+ then
+ let reflection_ray =
+ get_reflection_ray
+ info.Intersection_info.position
+ info.Intersection_info.normal
+ ray.Ray.direction
+ in
+ let col =
+ match test_intersection reflection_ray scene info.Intersection_info.shape with
+ | Some ({ Intersection_info.distance = d; _ } as info) when d > 0. ->
+ ray_trace options info reflection_ray scene (depth + 1)
+ | _ -> scene.Scene.background.Background.color
+ in
+ color :=
+ Color.blend
+ !color
+ col
+ info.Intersection_info.shape.Shape.material.Material.reflection);
+ let shadow_info = ref None in
+ if options.render_shadows
+ then (
+ let shadow_ray = Ray.make info.Intersection_info.position v in
+ shadow_info := test_intersection shadow_ray scene info.Intersection_info.shape;
+ match !shadow_info with
+ | Some info ->
+ (*XXX This looks wrong! *)
+ let va = Color.multiply_scalar !color 0.5 in
+ let db =
+ 0.5
+ *. (info.Intersection_info.shape.Shape.material.Material.transparency ** 0.5)
+ in
+ color := Color.add_scalar va db
+ | None -> ());
+ if options.render_highlights
+ && !shadow_info <> None
+ && info.Intersection_info.shape.Shape.material.Material.gloss > 0.
+ then
+ (*XXX This looks wrong! *)
+ let shape_position = Shape.position info.Intersection_info.shape in
+ let lv = Vector.normalize (Vector.subtract shape_position light.Light.position) in
+ let e =
+ Vector.normalize
+ (Vector.subtract scene.Scene.camera.Camera.position shape_position)
+ in
+ let h = Vector.normalize (Vector.subtract e lv) in
+ let gloss_weight =
+ max (Vector.dot info.Intersection_info.normal h) 0. ** shininess
+ in
+ color := Color.add (Color.multiply_scalar light.Light.color gloss_weight) !color
+ done;
+ Color.limit !color
+
+ and test_intersection ray scene exclude =
+ let best = ref None in
+ let dist = ref 2000. in
+ let shapes = scene.Scene.shapes in
+ for i = 0 to Array.length shapes - 1 do
+ let shape = shapes.(i) in
+ if shape != exclude
+ then
+ match Shape.intersect shape ray with
+ | Some { Intersection_info.distance = d; _ } as v when d >= 0. && d < !dist ->
+ best := v;
+ dist := d
+ | _ -> ()
+ done;
+ !best
+
+ let get_pixel_color options ray scene =
+ match test_intersection ray scene Shape.dummy with
+ | Some info -> ray_trace options info ray scene 0
+ | None -> scene.Scene.background.Background.color
+
+ let set_pixel _options x y color =
+ if x == y then check_number := !check_number + Color.brightness color;
+ ( (*
+ let pxw = options.pixel_width in
+ let pxh = options.pixel_height in
+ Format.eprintf "%d %d %d %d %d %a@." (x * pxw) (y * pxh) pxw pxh !check_number Color.print color;
+*) )
+
+ let render_scene options scene _canvas =
+ check_number := 0;
+ (*XXX canvas *)
+ let canvas_height = options.canvas_height in
+ let canvas_width = options.canvas_width in
+ for y = 0 to canvas_height - 1 do
+ for x = 0 to canvas_width - 1 do
+ let yp = (float y /. float canvas_height *. 2.) -. 1. in
+ let xp = (float x /. float canvas_width *. 2.) -. 1. in
+ let ray = Camera.get_ray scene.Scene.camera xp yp in
+ let color = get_pixel_color options ray scene in
+ set_pixel options x y color
+ done
+ done;
+ assert (!check_number = 2321)
+
+ let make
+ canvas_width
+ canvas_height
+ pixel_width
+ pixel_height
+ render_diffuse
+ render_shadows
+ render_highlights
+ render_reflections
+ ray_depth =
+ { canvas_width = canvas_width / pixel_width
+ ; canvas_height = canvas_height / pixel_height
+ ; pixel_width
+ ; pixel_height
+ ; render_diffuse
+ ; render_shadows
+ ; render_highlights
+ ; render_reflections
+ ; ray_depth
+ }
+end
+
+let render_scene () =
+ let camera =
+ Camera.make
+ (Vector.make 0. 0. (-15.))
+ (Vector.make (-0.2) 0. 5.)
+ (Vector.make 0. 1. 0.)
+ in
+ let background = Background.make (Color.make 0.5 0.5 0.5) 0.4 in
+ let sphere =
+ Shape.make
+ (Shape.Sphere (Vector.make (-1.5) 1.5 2., 1.5))
+ (Material.solid (Color.make 0. 0.5 0.5) 0.3 0. 2.)
+ in
+ let sphere1 =
+ Shape.make
+ (Shape.Sphere (Vector.make 1. 0.25 1., 0.5))
+ (Material.solid (Color.make 0.9 0.9 0.9) 0.1 0. 1.5)
+ in
+ let plane =
+ Shape.make
+ (Shape.Plane (Vector.normalize (Vector.make 0.1 0.9 (-0.5)), 1.2))
+ (Material.chessboard (Color.make 1. 1. 1.) (Color.make 0. 0. 0.) 0.2 0. 1.0 0.7)
+ in
+ let light = Light.make (Vector.make 5. 10. (-1.)) (Color.make 0.8 0.8 0.8) 10. in
+ let light1 = Light.make (Vector.make (-3.) 5. (-15.)) (Color.make 0.8 0.8 0.8) 100. in
+ let scene =
+ Scene.make camera [| plane; sphere; sphere1 |] [| light; light1 |] background
+ in
+ let image_width = 100 in
+ let image_height = 100 in
+ let pixel_size = 5, 5 in
+ let render_diffuse = true in
+ let render_shadows = true in
+ let render_highlights = true in
+ let render_reflections = true in
+ let ray_depth = 2 in
+ let engine =
+ Engine.make
+ image_width
+ image_height
+ (fst pixel_size)
+ (snd pixel_size)
+ render_diffuse
+ render_shadows
+ render_highlights
+ render_reflections
+ ray_depth
+ in
+ Engine.render_scene engine scene None
+
+
+let _ =
+ for _ = 1 to 1024 * 64 do
+ render_scene ()
+ done
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+(* $Id: boyer.ml 7017 2005-08-12 09:22:04Z xleroy $ *)
+
+(* Manipulations over terms *)
+
+type term =
+ | Var of int
+ | Prop of head * term list
+
+and head =
+ { name : string
+ ; mutable props : (term * term) list
+ }
+
+let lemmas = ref ([] : head list)
+
+(* Replacement for property lists *)
+
+let get name =
+ let rec get_rec = function
+ | hd1 :: hdl -> if hd1.name = name then hd1 else get_rec hdl
+ | [] ->
+ let entry = { name; props = [] } in
+ lemmas := entry :: !lemmas;
+ entry
+ in
+ get_rec !lemmas
+
+let add_lemma = function
+ | Prop (_, [ (Prop (headl, _) as left); right ]) ->
+ headl.props <- (left, right) :: headl.props
+ | _ -> assert false
+
+(* Substitutions *)
+
+type subst = Bind of int * term
+
+let get_binding v list =
+ let rec get_rec = function
+ | [] -> failwith "unbound"
+ | Bind (w, t) :: rest -> if v = w then t else get_rec rest
+ in
+ get_rec list
+
+let apply_subst alist term =
+ let rec as_rec = function
+ | Var v -> ( try get_binding v alist with Failure _ -> term)
+ | Prop (head, argl) -> Prop (head, List.map as_rec argl)
+ in
+ as_rec term
+
+exception Unify
+
+let rec unify term1 term2 = unify1 term1 term2 []
+
+and unify1 term1 term2 unify_subst =
+ match term2 with
+ | Var v -> (
+ try if get_binding v unify_subst = term1 then unify_subst else raise Unify
+ with Failure _ -> Bind (v, term1) :: unify_subst)
+ | Prop (head2, argl2) -> (
+ match term1 with
+ | Var _ -> raise Unify
+ | Prop (head1, argl1) ->
+ if head1 == head2 then unify1_lst argl1 argl2 unify_subst else raise Unify)
+
+and unify1_lst l1 l2 unify_subst =
+ match l1, l2 with
+ | [], [] -> unify_subst
+ | h1 :: r1, h2 :: r2 -> unify1_lst r1 r2 (unify1 h1 h2 unify_subst)
+ | _ -> raise Unify
+
+let rec rewrite = function
+ | Var _ as term -> term
+ | Prop (head, argl) ->
+ rewrite_with_lemmas (Prop (head, List.map rewrite argl)) head.props
+
+and rewrite_with_lemmas term lemmas =
+ match lemmas with
+ | [] -> term
+ | (t1, t2) :: rest -> (
+ try rewrite (apply_subst (unify term t1) t2)
+ with Unify -> rewrite_with_lemmas term rest)
+
+type cterm =
+ | CVar of int
+ | CProp of string * cterm list
+
+let rec cterm_to_term = function
+ | CVar v -> Var v
+ | CProp (p, l) -> Prop (get p, List.map cterm_to_term l)
+
+let add t = add_lemma (cterm_to_term t)
+
+let _ =
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("compile", [ CVar 5 ])
+ ; CProp
+ ( "reverse"
+ , [ CProp ("codegen", [ CProp ("optimize", [ CVar 5 ]); CProp ("nil", []) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("eqp", [ CVar 23; CVar 24 ])
+ ; CProp ("equal", [ CProp ("fix", [ CVar 23 ]); CProp ("fix", [ CVar 24 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("gt", [ CVar 23; CVar 24 ]); CProp ("lt", [ CVar 24; CVar 23 ]) ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("le", [ CVar 23; CVar 24 ]); CProp ("ge", [ CVar 24; CVar 23 ]) ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("ge", [ CVar 23; CVar 24 ]); CProp ("le", [ CVar 24; CVar 23 ]) ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("boolean", [ CVar 23 ])
+ ; CProp
+ ( "or"
+ , [ CProp ("equal", [ CVar 23; CProp ("true", []) ])
+ ; CProp ("equal", [ CVar 23; CProp ("false", []) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("iff", [ CVar 23; CVar 24 ])
+ ; CProp
+ ( "and"
+ , [ CProp ("implies", [ CVar 23; CVar 24 ])
+ ; CProp ("implies", [ CVar 24; CVar 23 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("even1", [ CVar 23 ])
+ ; CProp
+ ( "if"
+ , [ CProp ("zerop", [ CVar 23 ])
+ ; CProp ("true", [])
+ ; CProp ("odd", [ CProp ("sub1", [ CVar 23 ]) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("countps_", [ CVar 11; CVar 15 ])
+ ; CProp ("countps_loop", [ CVar 11; CVar 15; CProp ("zero", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("fact_", [ CVar 8 ])
+ ; CProp ("fact_loop", [ CVar 8; CProp ("one", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("reverse_", [ CVar 23 ])
+ ; CProp ("reverse_loop", [ CVar 23; CProp ("nil", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("divides", [ CVar 23; CVar 24 ])
+ ; CProp ("zerop", [ CProp ("remainder", [ CVar 24; CVar 23 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("assume_true", [ CVar 21; CVar 0 ])
+ ; CProp ("cons", [ CProp ("cons", [ CVar 21; CProp ("true", []) ]); CVar 0 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("assume_false", [ CVar 21; CVar 0 ])
+ ; CProp ("cons", [ CProp ("cons", [ CVar 21; CProp ("false", []) ]); CVar 0 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("tautology_checker", [ CVar 23 ])
+ ; CProp ("tautologyp", [ CProp ("normalize", [ CVar 23 ]); CProp ("nil", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("falsify", [ CVar 23 ])
+ ; CProp ("falsify1", [ CProp ("normalize", [ CVar 23 ]); CProp ("nil", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("prime", [ CVar 23 ])
+ ; CProp
+ ( "and"
+ , [ CProp ("not", [ CProp ("zerop", [ CVar 23 ]) ])
+ ; CProp
+ ( "not"
+ , [ CProp ("equal", [ CVar 23; CProp ("add1", [ CProp ("zero", []) ]) ])
+ ] )
+ ; CProp ("prime1", [ CVar 23; CProp ("sub1", [ CVar 23 ]) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("and", [ CVar 15; CVar 16 ])
+ ; CProp
+ ( "if"
+ , [ CVar 15
+ ; CProp ("if", [ CVar 16; CProp ("true", []); CProp ("false", []) ])
+ ; CProp ("false", [])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("or", [ CVar 15; CVar 16 ])
+ ; CProp
+ ( "if"
+ , [ CVar 15
+ ; CProp ("true", [])
+ ; CProp ("if", [ CVar 16; CProp ("true", []); CProp ("false", []) ])
+ ; CProp ("false", [])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("not", [ CVar 15 ])
+ ; CProp ("if", [ CVar 15; CProp ("false", []); CProp ("true", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("implies", [ CVar 15; CVar 16 ])
+ ; CProp
+ ( "if"
+ , [ CVar 15
+ ; CProp ("if", [ CVar 16; CProp ("true", []); CProp ("false", []) ])
+ ; CProp ("true", [])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("fix", [ CVar 23 ])
+ ; CProp ("if", [ CProp ("numberp", [ CVar 23 ]); CVar 23; CProp ("zero", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("if", [ CProp ("if", [ CVar 0; CVar 1; CVar 2 ]); CVar 3; CVar 4 ])
+ ; CProp
+ ( "if"
+ , [ CVar 0
+ ; CProp ("if", [ CVar 1; CVar 3; CVar 4 ])
+ ; CProp ("if", [ CVar 2; CVar 3; CVar 4 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("zerop", [ CVar 23 ])
+ ; CProp
+ ( "or"
+ , [ CProp ("equal", [ CVar 23; CProp ("zero", []) ])
+ ; CProp ("not", [ CProp ("numberp", [ CVar 23 ]) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("plus", [ CProp ("plus", [ CVar 23; CVar 24 ]); CVar 25 ])
+ ; CProp ("plus", [ CVar 23; CProp ("plus", [ CVar 24; CVar 25 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CProp ("plus", [ CVar 0; CVar 1 ]); CProp ("zero", []) ])
+ ; CProp ("and", [ CProp ("zerop", [ CVar 0 ]); CProp ("zerop", [ CVar 1 ]) ])
+ ] ));
+ add
+ (CProp ("equal", [ CProp ("difference", [ CVar 23; CVar 23 ]); CProp ("zero", []) ]));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "equal"
+ , [ CProp ("plus", [ CVar 0; CVar 1 ]); CProp ("plus", [ CVar 0; CVar 2 ]) ]
+ )
+ ; CProp ("equal", [ CProp ("fix", [ CVar 1 ]); CProp ("fix", [ CVar 2 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ("equal", [ CProp ("zero", []); CProp ("difference", [ CVar 23; CVar 24 ]) ])
+ ; CProp ("not", [ CProp ("gt", [ CVar 24; CVar 23 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CVar 23; CProp ("difference", [ CVar 23; CVar 24 ]) ])
+ ; CProp
+ ( "and"
+ , [ CProp ("numberp", [ CVar 23 ])
+ ; CProp
+ ( "or"
+ , [ CProp ("equal", [ CVar 23; CProp ("zero", []) ])
+ ; CProp ("zerop", [ CVar 24 ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "meaning"
+ , [ CProp ("plus_tree", [ CProp ("append", [ CVar 23; CVar 24 ]) ]); CVar 0 ]
+ )
+ ; CProp
+ ( "plus"
+ , [ CProp ("meaning", [ CProp ("plus_tree", [ CVar 23 ]); CVar 0 ])
+ ; CProp ("meaning", [ CProp ("plus_tree", [ CVar 24 ]); CVar 0 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "meaning"
+ , [ CProp ("plus_tree", [ CProp ("plus_fringe", [ CVar 23 ]) ]); CVar 0 ] )
+ ; CProp ("fix", [ CProp ("meaning", [ CVar 23; CVar 0 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("append", [ CProp ("append", [ CVar 23; CVar 24 ]); CVar 25 ])
+ ; CProp ("append", [ CVar 23; CProp ("append", [ CVar 24; CVar 25 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("reverse", [ CProp ("append", [ CVar 0; CVar 1 ]) ])
+ ; CProp
+ ("append", [ CProp ("reverse", [ CVar 1 ]); CProp ("reverse", [ CVar 0 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("times", [ CVar 23; CProp ("plus", [ CVar 24; CVar 25 ]) ])
+ ; CProp
+ ( "plus"
+ , [ CProp ("times", [ CVar 23; CVar 24 ])
+ ; CProp ("times", [ CVar 23; CVar 25 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("times", [ CProp ("times", [ CVar 23; CVar 24 ]); CVar 25 ])
+ ; CProp ("times", [ CVar 23; CProp ("times", [ CVar 24; CVar 25 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CProp ("times", [ CVar 23; CVar 24 ]); CProp ("zero", []) ])
+ ; CProp ("or", [ CProp ("zerop", [ CVar 23 ]); CProp ("zerop", [ CVar 24 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("exec", [ CProp ("append", [ CVar 23; CVar 24 ]); CVar 15; CVar 4 ])
+ ; CProp
+ ("exec", [ CVar 24; CProp ("exec", [ CVar 23; CVar 15; CVar 4 ]); CVar 4 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("mc_flatten", [ CVar 23; CVar 24 ])
+ ; CProp ("append", [ CProp ("flatten", [ CVar 23 ]); CVar 24 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("member", [ CVar 23; CProp ("append", [ CVar 0; CVar 1 ]) ])
+ ; CProp
+ ( "or"
+ , [ CProp ("member", [ CVar 23; CVar 0 ])
+ ; CProp ("member", [ CVar 23; CVar 1 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("member", [ CVar 23; CProp ("reverse", [ CVar 24 ]) ])
+ ; CProp ("member", [ CVar 23; CVar 24 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("length", [ CProp ("reverse", [ CVar 23 ]) ])
+ ; CProp ("length", [ CVar 23 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("member", [ CVar 0; CProp ("intersect", [ CVar 1; CVar 2 ]) ])
+ ; CProp
+ ( "and"
+ , [ CProp ("member", [ CVar 0; CVar 1 ])
+ ; CProp ("member", [ CVar 0; CVar 2 ])
+ ] )
+ ] ));
+ add
+ (CProp ("equal", [ CProp ("nth", [ CProp ("zero", []); CVar 8 ]); CProp ("zero", []) ]));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("exp", [ CVar 8; CProp ("plus", [ CVar 9; CVar 10 ]) ])
+ ; CProp
+ ( "times"
+ , [ CProp ("exp", [ CVar 8; CVar 9 ]); CProp ("exp", [ CVar 8; CVar 10 ]) ]
+ )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("exp", [ CVar 8; CProp ("times", [ CVar 9; CVar 10 ]) ])
+ ; CProp ("exp", [ CProp ("exp", [ CVar 8; CVar 9 ]); CVar 10 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("reverse_loop", [ CVar 23; CVar 24 ])
+ ; CProp ("append", [ CProp ("reverse", [ CVar 23 ]); CVar 24 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("reverse_loop", [ CVar 23; CProp ("nil", []) ])
+ ; CProp ("reverse", [ CVar 23 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("count_list", [ CVar 25; CProp ("sort_lp", [ CVar 23; CVar 24 ]) ])
+ ; CProp
+ ( "plus"
+ , [ CProp ("count_list", [ CVar 25; CVar 23 ])
+ ; CProp ("count_list", [ CVar 25; CVar 24 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "equal"
+ , [ CProp ("append", [ CVar 0; CVar 1 ])
+ ; CProp ("append", [ CVar 0; CVar 2 ])
+ ] )
+ ; CProp ("equal", [ CVar 1; CVar 2 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "plus"
+ , [ CProp ("remainder", [ CVar 23; CVar 24 ])
+ ; CProp ("times", [ CVar 24; CProp ("quotient", [ CVar 23; CVar 24 ]) ])
+ ] )
+ ; CProp ("fix", [ CVar 23 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ("power_eval", [ CProp ("big_plus", [ CVar 11; CVar 8; CVar 1 ]); CVar 1 ])
+ ; CProp ("plus", [ CProp ("power_eval", [ CVar 11; CVar 1 ]); CVar 8 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "power_eval"
+ , [ CProp ("big_plus", [ CVar 23; CVar 24; CVar 8; CVar 1 ]); CVar 1 ] )
+ ; CProp
+ ( "plus"
+ , [ CVar 8
+ ; CProp
+ ( "plus"
+ , [ CProp ("power_eval", [ CVar 23; CVar 1 ])
+ ; CProp ("power_eval", [ CVar 24; CVar 1 ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("remainder", [ CVar 24; CProp ("one", []) ]); CProp ("zero", []) ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("lt", [ CProp ("remainder", [ CVar 23; CVar 24 ]); CVar 24 ])
+ ; CProp ("not", [ CProp ("zerop", [ CVar 24 ]) ])
+ ] ));
+ add (CProp ("equal", [ CProp ("remainder", [ CVar 23; CVar 23 ]); CProp ("zero", []) ]));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("lt", [ CProp ("quotient", [ CVar 8; CVar 9 ]); CVar 8 ])
+ ; CProp
+ ( "and"
+ , [ CProp ("not", [ CProp ("zerop", [ CVar 8 ]) ])
+ ; CProp
+ ( "or"
+ , [ CProp ("zerop", [ CVar 9 ])
+ ; CProp ("not", [ CProp ("equal", [ CVar 9; CProp ("one", []) ]) ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("lt", [ CProp ("remainder", [ CVar 23; CVar 24 ]); CVar 23 ])
+ ; CProp
+ ( "and"
+ , [ CProp ("not", [ CProp ("zerop", [ CVar 24 ]) ])
+ ; CProp ("not", [ CProp ("zerop", [ CVar 23 ]) ])
+ ; CProp ("not", [ CProp ("lt", [ CVar 23; CVar 24 ]) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("power_eval", [ CProp ("power_rep", [ CVar 8; CVar 1 ]); CVar 1 ])
+ ; CProp ("fix", [ CVar 8 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "power_eval"
+ , [ CProp
+ ( "big_plus"
+ , [ CProp ("power_rep", [ CVar 8; CVar 1 ])
+ ; CProp ("power_rep", [ CVar 9; CVar 1 ])
+ ; CProp ("zero", [])
+ ; CVar 1
+ ] )
+ ; CVar 1
+ ] )
+ ; CProp ("plus", [ CVar 8; CVar 9 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("gcd", [ CVar 23; CVar 24 ]); CProp ("gcd", [ CVar 24; CVar 23 ]) ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("nth", [ CProp ("append", [ CVar 0; CVar 1 ]); CVar 8 ])
+ ; CProp
+ ( "append"
+ , [ CProp ("nth", [ CVar 0; CVar 8 ])
+ ; CProp
+ ( "nth"
+ , [ CVar 1
+ ; CProp ("difference", [ CVar 8; CProp ("length", [ CVar 0 ]) ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("difference", [ CProp ("plus", [ CVar 23; CVar 24 ]); CVar 23 ])
+ ; CProp ("fix", [ CVar 24 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("difference", [ CProp ("plus", [ CVar 24; CVar 23 ]); CVar 23 ])
+ ; CProp ("fix", [ CVar 24 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "difference"
+ , [ CProp ("plus", [ CVar 23; CVar 24 ])
+ ; CProp ("plus", [ CVar 23; CVar 25 ])
+ ] )
+ ; CProp ("difference", [ CVar 24; CVar 25 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("times", [ CVar 23; CProp ("difference", [ CVar 2; CVar 22 ]) ])
+ ; CProp
+ ( "difference"
+ , [ CProp ("times", [ CVar 2; CVar 23 ])
+ ; CProp ("times", [ CVar 22; CVar 23 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("remainder", [ CProp ("times", [ CVar 23; CVar 25 ]); CVar 25 ])
+ ; CProp ("zero", [])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "difference"
+ , [ CProp ("plus", [ CVar 1; CProp ("plus", [ CVar 0; CVar 2 ]) ]); CVar 0 ]
+ )
+ ; CProp ("plus", [ CVar 1; CVar 2 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "difference"
+ , [ CProp ("add1", [ CProp ("plus", [ CVar 24; CVar 25 ]) ]); CVar 25 ] )
+ ; CProp ("add1", [ CVar 24 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "lt"
+ , [ CProp ("plus", [ CVar 23; CVar 24 ])
+ ; CProp ("plus", [ CVar 23; CVar 25 ])
+ ] )
+ ; CProp ("lt", [ CVar 24; CVar 25 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "lt"
+ , [ CProp ("times", [ CVar 23; CVar 25 ])
+ ; CProp ("times", [ CVar 24; CVar 25 ])
+ ] )
+ ; CProp
+ ( "and"
+ , [ CProp ("not", [ CProp ("zerop", [ CVar 25 ]) ])
+ ; CProp ("lt", [ CVar 23; CVar 24 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("lt", [ CVar 24; CProp ("plus", [ CVar 23; CVar 24 ]) ])
+ ; CProp ("not", [ CProp ("zerop", [ CVar 23 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "gcd"
+ , [ CProp ("times", [ CVar 23; CVar 25 ])
+ ; CProp ("times", [ CVar 24; CVar 25 ])
+ ] )
+ ; CProp ("times", [ CVar 25; CProp ("gcd", [ CVar 23; CVar 24 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("value", [ CProp ("normalize", [ CVar 23 ]); CVar 0 ])
+ ; CProp ("value", [ CVar 23; CVar 0 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "equal"
+ , [ CProp ("flatten", [ CVar 23 ])
+ ; CProp ("cons", [ CVar 24; CProp ("nil", []) ])
+ ] )
+ ; CProp
+ ( "and"
+ , [ CProp ("nlistp", [ CVar 23 ]); CProp ("equal", [ CVar 23; CVar 24 ]) ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("listp", [ CProp ("gother", [ CVar 23 ]) ])
+ ; CProp ("listp", [ CVar 23 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("samefringe", [ CVar 23; CVar 24 ])
+ ; CProp
+ ("equal", [ CProp ("flatten", [ CVar 23 ]); CProp ("flatten", [ CVar 24 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "equal"
+ , [ CProp ("greatest_factor", [ CVar 23; CVar 24 ]); CProp ("zero", []) ] )
+ ; CProp
+ ( "and"
+ , [ CProp
+ ( "or"
+ , [ CProp ("zerop", [ CVar 24 ])
+ ; CProp ("equal", [ CVar 24; CProp ("one", []) ])
+ ] )
+ ; CProp ("equal", [ CVar 23; CProp ("zero", []) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "equal"
+ , [ CProp ("greatest_factor", [ CVar 23; CVar 24 ]); CProp ("one", []) ] )
+ ; CProp ("equal", [ CVar 23; CProp ("one", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("numberp", [ CProp ("greatest_factor", [ CVar 23; CVar 24 ]) ])
+ ; CProp
+ ( "not"
+ , [ CProp
+ ( "and"
+ , [ CProp
+ ( "or"
+ , [ CProp ("zerop", [ CVar 24 ])
+ ; CProp ("equal", [ CVar 24; CProp ("one", []) ])
+ ] )
+ ; CProp ("not", [ CProp ("numberp", [ CVar 23 ]) ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("times_list", [ CProp ("append", [ CVar 23; CVar 24 ]) ])
+ ; CProp
+ ( "times"
+ , [ CProp ("times_list", [ CVar 23 ]); CProp ("times_list", [ CVar 24 ]) ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("prime_list", [ CProp ("append", [ CVar 23; CVar 24 ]) ])
+ ; CProp
+ ( "and"
+ , [ CProp ("prime_list", [ CVar 23 ]); CProp ("prime_list", [ CVar 24 ]) ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CVar 25; CProp ("times", [ CVar 22; CVar 25 ]) ])
+ ; CProp
+ ( "and"
+ , [ CProp ("numberp", [ CVar 25 ])
+ ; CProp
+ ( "or"
+ , [ CProp ("equal", [ CVar 25; CProp ("zero", []) ])
+ ; CProp ("equal", [ CVar 22; CProp ("one", []) ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("ge", [ CVar 23; CVar 24 ])
+ ; CProp ("not", [ CProp ("lt", [ CVar 23; CVar 24 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CVar 23; CProp ("times", [ CVar 23; CVar 24 ]) ])
+ ; CProp
+ ( "or"
+ , [ CProp ("equal", [ CVar 23; CProp ("zero", []) ])
+ ; CProp
+ ( "and"
+ , [ CProp ("numberp", [ CVar 23 ])
+ ; CProp ("equal", [ CVar 24; CProp ("one", []) ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("remainder", [ CProp ("times", [ CVar 24; CVar 23 ]); CVar 24 ])
+ ; CProp ("zero", [])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CProp ("times", [ CVar 0; CVar 1 ]); CProp ("one", []) ])
+ ; CProp
+ ( "and"
+ , [ CProp ("not", [ CProp ("equal", [ CVar 0; CProp ("zero", []) ]) ])
+ ; CProp ("not", [ CProp ("equal", [ CVar 1; CProp ("zero", []) ]) ])
+ ; CProp ("numberp", [ CVar 0 ])
+ ; CProp ("numberp", [ CVar 1 ])
+ ; CProp ("equal", [ CProp ("sub1", [ CVar 0 ]); CProp ("zero", []) ])
+ ; CProp ("equal", [ CProp ("sub1", [ CVar 1 ]); CProp ("zero", []) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "lt"
+ , [ CProp ("length", [ CProp ("delete", [ CVar 23; CVar 11 ]) ])
+ ; CProp ("length", [ CVar 11 ])
+ ] )
+ ; CProp ("member", [ CVar 23; CVar 11 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("sort2", [ CProp ("delete", [ CVar 23; CVar 11 ]) ])
+ ; CProp ("delete", [ CVar 23; CProp ("sort2", [ CVar 11 ]) ])
+ ] ));
+ add (CProp ("equal", [ CProp ("dsort", [ CVar 23 ]); CProp ("sort2", [ CVar 23 ]) ]));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "length"
+ , [ CProp
+ ( "cons"
+ , [ CVar 0
+ ; CProp
+ ( "cons"
+ , [ CVar 1
+ ; CProp
+ ( "cons"
+ , [ CVar 2
+ ; CProp
+ ( "cons"
+ , [ CVar 3
+ ; CProp
+ ( "cons"
+ , [ CVar 4
+ ; CProp ("cons", [ CVar 5; CVar 6 ])
+ ] )
+ ] )
+ ] )
+ ] )
+ ] )
+ ] )
+ ; CProp ("plus", [ CProp ("six", []); CProp ("length", [ CVar 6 ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "difference"
+ , [ CProp ("add1", [ CProp ("add1", [ CVar 23 ]) ]); CProp ("two", []) ] )
+ ; CProp ("fix", [ CVar 23 ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "quotient"
+ , [ CProp ("plus", [ CVar 23; CProp ("plus", [ CVar 23; CVar 24 ]) ])
+ ; CProp ("two", [])
+ ] )
+ ; CProp ("plus", [ CVar 23; CProp ("quotient", [ CVar 24; CProp ("two", []) ]) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("sigma", [ CProp ("zero", []); CVar 8 ])
+ ; CProp
+ ( "quotient"
+ , [ CProp ("times", [ CVar 8; CProp ("add1", [ CVar 8 ]) ])
+ ; CProp ("two", [])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("plus", [ CVar 23; CProp ("add1", [ CVar 24 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("numberp", [ CVar 24 ])
+ ; CProp ("add1", [ CProp ("plus", [ CVar 23; CVar 24 ]) ])
+ ; CProp ("add1", [ CVar 23 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "equal"
+ , [ CProp ("difference", [ CVar 23; CVar 24 ])
+ ; CProp ("difference", [ CVar 25; CVar 24 ])
+ ] )
+ ; CProp
+ ( "if"
+ , [ CProp ("lt", [ CVar 23; CVar 24 ])
+ ; CProp ("not", [ CProp ("lt", [ CVar 24; CVar 25 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("lt", [ CVar 25; CVar 24 ])
+ ; CProp ("not", [ CProp ("lt", [ CVar 24; CVar 23 ]) ])
+ ; CProp
+ ( "equal"
+ , [ CProp ("fix", [ CVar 23 ]); CProp ("fix", [ CVar 25 ]) ] )
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp
+ ( "meaning"
+ , [ CProp ("plus_tree", [ CProp ("delete", [ CVar 23; CVar 24 ]) ]); CVar 0 ]
+ )
+ ; CProp
+ ( "if"
+ , [ CProp ("member", [ CVar 23; CVar 24 ])
+ ; CProp
+ ( "difference"
+ , [ CProp ("meaning", [ CProp ("plus_tree", [ CVar 24 ]); CVar 0 ])
+ ; CProp ("meaning", [ CVar 23; CVar 0 ])
+ ] )
+ ; CProp ("meaning", [ CProp ("plus_tree", [ CVar 24 ]); CVar 0 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("times", [ CVar 23; CProp ("add1", [ CVar 24 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("numberp", [ CVar 24 ])
+ ; CProp
+ ( "plus"
+ , [ CVar 23
+ ; CProp ("times", [ CVar 23; CVar 24 ])
+ ; CProp ("fix", [ CVar 23 ])
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("nth", [ CProp ("nil", []); CVar 8 ])
+ ; CProp
+ ("if", [ CProp ("zerop", [ CVar 8 ]); CProp ("nil", []); CProp ("zero", []) ])
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("last", [ CProp ("append", [ CVar 0; CVar 1 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("listp", [ CVar 1 ])
+ ; CProp ("last", [ CVar 1 ])
+ ; CProp
+ ( "if"
+ , [ CProp ("listp", [ CVar 0 ])
+ ; CProp
+ ( "cons"
+ , [ CProp ("car", [ CProp ("last", [ CVar 0 ]) ]); CVar 1 ] )
+ ; CVar 1
+ ] )
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("equal", [ CProp ("lt", [ CVar 23; CVar 24 ]); CVar 25 ])
+ ; CProp
+ ( "if"
+ , [ CProp ("lt", [ CVar 23; CVar 24 ])
+ ; CProp ("equal", [ CProp ("true", []); CVar 25 ])
+ ; CProp ("equal", [ CProp ("false", []); CVar 25 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("assignment", [ CVar 23; CProp ("append", [ CVar 0; CVar 1 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("assignedp", [ CVar 23; CVar 0 ])
+ ; CProp ("assignment", [ CVar 23; CVar 0 ])
+ ; CProp ("assignment", [ CVar 23; CVar 1 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("car", [ CProp ("gother", [ CVar 23 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("listp", [ CVar 23 ])
+ ; CProp ("car", [ CProp ("flatten", [ CVar 23 ]) ])
+ ; CProp ("zero", [])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("flatten", [ CProp ("cdr", [ CProp ("gother", [ CVar 23 ]) ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("listp", [ CVar 23 ])
+ ; CProp ("cdr", [ CProp ("flatten", [ CVar 23 ]) ])
+ ; CProp ("cons", [ CProp ("zero", []); CProp ("nil", []) ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("quotient", [ CProp ("times", [ CVar 24; CVar 23 ]); CVar 24 ])
+ ; CProp
+ ( "if"
+ , [ CProp ("zerop", [ CVar 24 ])
+ ; CProp ("zero", [])
+ ; CProp ("fix", [ CVar 23 ])
+ ] )
+ ] ));
+ add
+ (CProp
+ ( "equal"
+ , [ CProp ("get", [ CVar 9; CProp ("set", [ CVar 8; CVar 21; CVar 12 ]) ])
+ ; CProp
+ ( "if"
+ , [ CProp ("eqp", [ CVar 9; CVar 8 ])
+ ; CVar 21
+ ; CProp ("get", [ CVar 9; CVar 12 ])
+ ] )
+ ] ))
+
+(* Tautology checker *)
+
+let truep x lst =
+ match x with
+ | Prop (head, _) -> head.name = "true" || List.mem x lst
+ | _ -> List.mem x lst
+
+and falsep x lst =
+ match x with
+ | Prop (head, _) -> head.name = "false" || List.mem x lst
+ | _ -> List.mem x lst
+
+let rec tautologyp x true_lst false_lst =
+ if truep x true_lst
+ then true
+ else if falsep x false_lst
+ then false
+ else
+ (*
+ print_term x; print_newline();
+*)
+ match x with
+ | Var _ -> false
+ | Prop (head, [ test; yes; no ]) ->
+ if head.name = "if"
+ then
+ if truep test true_lst
+ then tautologyp yes true_lst false_lst
+ else if falsep test false_lst
+ then tautologyp no true_lst false_lst
+ else
+ tautologyp yes (test :: true_lst) false_lst
+ && tautologyp no true_lst (test :: false_lst)
+ else false
+ | _ -> assert false
+
+let tautp x =
+ (* print_term x; print_string"\n"; *)
+ let y = rewrite x in
+ (* print_term y; print_string "\n"; *)
+ tautologyp y [] []
+
+(* the benchmark *)
+
+let subst =
+ [ Bind
+ ( 23
+ , cterm_to_term
+ (CProp
+ ( "f"
+ , [ CProp
+ ( "plus"
+ , [ CProp ("plus", [ CVar 0; CVar 1 ])
+ ; CProp ("plus", [ CVar 2; CProp ("zero", []) ])
+ ] )
+ ] )) )
+ ; Bind
+ ( 24
+ , cterm_to_term
+ (CProp
+ ( "f"
+ , [ CProp
+ ( "times"
+ , [ CProp ("times", [ CVar 0; CVar 1 ])
+ ; CProp ("plus", [ CVar 2; CVar 3 ])
+ ] )
+ ] )) )
+ ; Bind
+ ( 25
+ , cterm_to_term
+ (CProp
+ ( "f"
+ , [ CProp
+ ( "reverse"
+ , [ CProp
+ ( "append"
+ , [ CProp ("append", [ CVar 0; CVar 1 ]); CProp ("nil", []) ] )
+ ] )
+ ] )) )
+ ; Bind
+ ( 20
+ , cterm_to_term
+ (CProp
+ ( "equal"
+ , [ CProp ("plus", [ CVar 0; CVar 1 ])
+ ; CProp ("difference", [ CVar 23; CVar 24 ])
+ ] )) )
+ ; Bind
+ ( 22
+ , cterm_to_term
+ (CProp
+ ( "lt"
+ , [ CProp ("remainder", [ CVar 0; CVar 1 ])
+ ; CProp ("member", [ CVar 0; CProp ("length", [ CVar 1 ]) ])
+ ] )) )
+ ]
+
+let term =
+ cterm_to_term
+ (CProp
+ ( "implies"
+ , [ CProp
+ ( "and"
+ , [ CProp ("implies", [ CVar 23; CVar 24 ])
+ ; CProp
+ ( "and"
+ , [ CProp ("implies", [ CVar 24; CVar 25 ])
+ ; CProp
+ ( "and"
+ , [ CProp ("implies", [ CVar 25; CVar 20 ])
+ ; CProp ("implies", [ CVar 20; CVar 22 ])
+ ] )
+ ] )
+ ] )
+ ; CProp ("implies", [ CVar 23; CVar 22 ])
+ ] ))
+
+let _ =
+ let ok = ref true in
+ for _ = 1 to 50 do
+ if not (tautp (apply_subst subst term)) then ok := false
+ done;
+ assert !ok
+
+(*
+ if !ok then
+ print_string "Proved!\n"
+ else
+ print_string "Cannot prove!\n";
+ exit 0
+*)
+
+(*********
+ with
+ failure s ->
+ print_string "Exception failure("; print_string s; print_string ")\n"
+ | Unify ->
+ print_string "Exception Unify\n"
+ | match_failure(file,start,stop) ->
+ print_string "Exception match_failure(";
+ print_string file;
+ print_string ",";
+ print_int start;
+ print_string ",";
+ print_int stop;
+ print_string ")\n"
+ | _ ->
+ print_string "Exception ?\n"
+
+ **********)
+type bitstring = bool array
+type individual = { chromosome : bitstring; fitness : float }
+type fitness_function = bitstring -> float
+
+let chromosome_length = Array.length
+let population_size = Array.length
+
+let chromosome { chromosome=x; fitness=_ } = x
+let evaluate f x = { chromosome=x; fitness=(f x) }
+
+let fittest x y = if x.fitness > y.fitness then x else y
+let pop_fittest pop = Array.fold_left fittest pop.(0) pop
+let state = Random.State.make_self_init ()
+
+let random_bitstring n =
+ Array.init n (fun _ -> Random.State.bool state)
+
+let random_individual n f =
+ evaluate f (random_bitstring n)
+
+(* Onemax is a simple fitness function. *)
+let add_bit x b = if b then x +. 1.0 else x
+let onemax : fitness_function = Array.fold_left add_bit 0.0
+
+(* Choose fittest out of k uniformly sampled individuals *)
+let rec k_tournament k pop =
+ let x = pop.(Random.State.int state (population_size pop)) in
+ if k <= 1 then x
+ else
+ let y = k_tournament (k-1) pop in
+ fittest x y
+
+let flip_coin p = (Random.State.float state 1.0) < p
+
+let xor a b = if a then not b else b
+(* Naive Theta(n) implementation of mutation. *)
+let mutate chi x =
+ let n = chromosome_length x in
+ let p = chi /. (float n) in
+ Array.map (fun b -> xor b (flip_coin p)) x
+
+(* Command line arguments *)
+
+
+let runtime = 100000
+
+let chi = 0.4
+
+let lambda = 100000
+
+let k = 2
+
+let n = 100000
+
+let init n f =
+ let a = Array.init n (fun _ -> f ()) in
+ a
+
+
+let evolutionary_algorithm
+
+ runtime (* Runtime budget *)
+ lambda (* Population size *)
+ k (* Tournament size *)
+ chi (* Mutation rate *)
+ fitness (* Fitness function *)
+ n (* Problem instance size n *)
+
+ =
+
+ (* let adam = random_individual n fitness in *)
+ let init_pop = init in
+ let pop0 = init_pop lambda (fun _ -> random_individual n fitness) in
+
+
+ let rec generation time pop =
+ let next_pop =
+ init_pop lambda
+ (fun _ ->
+ (k_tournament k pop)
+ |> chromosome
+ |> (mutate chi)
+ |> (evaluate fitness))
+ in
+ if time * lambda > runtime then
+ (
+ Printf.printf "fittest: %f\n"
+ (pop_fittest next_pop).fitness)
+ else
+ generation (time+1) next_pop
+ in generation 0 pop0
+
+let ea () = evolutionary_algorithm runtime lambda k chi onemax n
+
+let () =
+ ea ()
+let n_times = 2
+let board_size = 1024
+
+(* setup board buffers; rg contains initial state *)
+let rg =
+ ref (Array.init board_size (fun _ -> Array.init board_size (fun _ -> Random.int 2)))
+let rg' =
+ ref (Array.init board_size (fun _ -> Array.make board_size 0))
+
+let get g x y =
+ try g.(x).(y)
+ with _ -> 0
+ [@@inline]
+
+let neighbourhood g x y =
+ (get g (x-1) (y-1)) +
+ (get g (x-1) (y )) +
+ (get g (x-1) (y+1)) +
+ (get g (x ) (y-1)) +
+ (get g (x ) (y+1)) +
+ (get g (x+1) (y-1)) +
+ (get g (x+1) (y )) +
+ (get g (x+1) (y+1))
+ [@@inline]
+
+let next_cell g x y =
+ let n = neighbourhood g x y in
+ match g.(x).(y), n with
+ | 1, 0 | 1, 1 -> 0 (* lonely *)
+ | 1, 4 | 1, 5 | 1, 6 | 1, 7 | 1, 8 -> 0 (* overcrowded *)
+ | 1, 2 | 1, 3 -> 1 (* lives *)
+ | 0, 3 -> 1 (* get birth *)
+ | _ (* 0, (0|1|2|4|5|6|7|8) *) -> 0 (* barren *)
+
+
+let next () =
+ let g = !rg in
+ let new_g = !rg' in
+ for x = 0 to board_size - 1 do
+ for y = 0 to board_size - 1 do
+ new_g.(x).(y) <- next_cell g x y
+ done
+ done;
+ rg := new_g;
+ rg' := g
+
+let rec repeat n =
+ match n with
+ | 0 -> ()
+ | _ -> next (); repeat (n-1)
+
+let ()=
+ (*print !rg;*)
+ repeat n_times;
+ (*print !rg*)
+(*
+ * The Computer Language Benchmarks Game
+ * https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
+ *
+ * contributed by Troestler Christophe
+ * modified by Mauricio Fernandez
+ *)
+
+
+module S = struct
+ type t = bytes
+
+ let size = 0x40000
+
+ let equal (s1:bytes) s2 = (s1 = s2)
+
+ let hash (s:bytes) =
+ let h = ref 0 in
+ for i = 0 to Bytes.length s - 1 do
+ let v = Bytes.get s i in
+ let c = Char.code v in
+ h := !h * 5 + c
+ done;
+ !h
+end
+
+module H = Hashtbl.Make(S)
+
+(* [counts k dna] fills and return the hashtable [count] of
+ k-nucleotide keys and count values for a particular reading-frame
+ of length [k] of the string [dna]. Keys point to mutable values
+ for speed (to avoid looking twice the same key to reinsert the
+ value). *)
+let count = H.create S.size
+let counts k dna =
+ H.clear count;
+ let key = Bytes.create k in
+ for i = 0 to Bytes.length dna - k do
+ Bytes.unsafe_blit dna i key 0 k;
+ try incr(H.find count key) with Not_found -> H.add count (Bytes.copy key) (ref 1)
+ done;
+ count
+
+(* [write_frequencies k dna] writes the frequencies for a
+ reading-frame of length [k] sorted by descending frequency and then
+ ascending k-nucleotide key. *)
+let compare_freq ((k1:bytes),(f1:float)) (k2, f2) =
+ if f1 > f2 then -1 else if f1 < f2 then 1 else compare k1 k2
+
+let write_frequencies k dna =
+ let cnt = counts k dna in
+ let tot = float(H.fold (fun _ n t -> !n + t) cnt 0) in
+ let frq = H.fold (fun k n l -> (k, 100. *. float !n /. tot) :: l) cnt [] in
+ let frq = List.sort compare_freq frq in
+ List.iter (fun (k,f) -> Printf.printf "%s %.3f\n" (Bytes.to_string k) f) frq;
+ print_string "\n"
+
+let write_count seq_str dna =
+ let seq = Bytes.of_string seq_str in
+ let cnt = counts (Bytes.length seq) dna in
+ Printf.printf "%d\t%s\n" (try !(H.find cnt seq) with Not_found -> 0) (Bytes.to_string seq)
+
+(* Extract DNA sequence "THREE" from knucleotide-input.txt *)
+let dna_three =
+ let kinput = open_in "input25000000.txt" in
+ let is_not_three s = try String.sub s 0 6 <> ">THREE" with _ -> true in
+ while is_not_three(input_line kinput) do () done;
+ let buf = Buffer.create 1000 in
+ (* Skip possible comment *)
+ (try while true do
+ let line = input_line kinput in
+ if line.[0] <> ';' then
+ (Buffer.add_string buf (String.uppercase_ascii line); raise Exit)
+ done with _ -> ());
+ (* Read the DNA sequence *)
+ (try while true do
+ let line = input_line kinput in
+ if line.[0] = '>' then raise End_of_file;
+ Buffer.add_string buf (String.uppercase_ascii line)
+ done with End_of_file -> ());
+ Buffer.to_bytes buf
+
+(* GC param suggestion:
+ let () = Gc.set { (Gc.get()) with Gc.minor_heap_size = 1024 * 2048 } *)
+
+let () =
+ List.iter (fun i -> write_frequencies i dna_three) [1; 2];
+ List.iter (fun k -> write_count k dna_three)
+ ["GGT"; "GGTA"; "GGTATT"; "GGTATTTTAATT"; "GGTATTTTAATTTATAGT"]
+(* nbody.ml
+ *
+ * The Great Computer Language Shootout
+ * http://shootout.alioth.debian.org/
+ *
+ * Contributed by Troestler Christophe
+ *)
+
+
+let pi = 3.141592653589793
+let solar_mass = 4. *. pi *. pi
+let days_per_year = 365.24
+
+type planet = { mutable x : float; mutable y : float; mutable z : float;
+ mutable vx: float; mutable vy: float; mutable vz: float;
+ mass : float }
+
+let advance bodies dt =
+ let n = Array.length bodies - 1 in
+ for i = 0 to Array.length bodies - 1 do
+ let b = bodies.(i) in
+ for j = i+1 to Array.length bodies - 1 do
+ let b' = bodies.(j) in
+ let dx = b.x -. b'.x and dy = b.y -. b'.y and dz = b.z -. b'.z in
+ let dist2 = dx *. dx +. dy *. dy +. dz *. dz in
+ let mag = dt /. (dist2 *. sqrt(dist2)) in
+
+ b.vx <- b.vx -. dx *. b'.mass *. mag;
+ b.vy <- b.vy -. dy *. b'.mass *. mag;
+ b.vz <- b.vz -. dz *. b'.mass *. mag;
+
+ b'.vx <- b'.vx +. dx *. b.mass *. mag;
+ b'.vy <- b'.vy +. dy *. b.mass *. mag;
+ b'.vz <- b'.vz +. dz *. b.mass *. mag;
+ done
+ done;
+ for i = 0 to n do
+ let b = bodies.(i) in
+ b.x <- b.x +. dt *. b.vx;
+ b.y <- b.y +. dt *. b.vy;
+ b.z <- b.z +. dt *. b.vz;
+ done
+
+
+let energy bodies =
+ let e = ref 0. in
+ for i = 0 to Array.length bodies - 1 do
+ let b = bodies.(i) in
+ e := !e +. 0.5 *. b.mass *. (b.vx *. b.vx +. b.vy *. b.vy +. b.vz *. b.vz);
+ for j = i+1 to Array.length bodies - 1 do
+ let b' = bodies.(j) in
+ let dx = b.x -. b'.x and dy = b.y -. b'.y and dz = b.z -. b'.z in
+ let distance = sqrt(dx *. dx +. dy *. dy +. dz *. dz) in
+ e := !e -. (b.mass *. b'.mass) /. distance
+ done
+ done;
+ !e
+
+
+let offset_momentum bodies =
+ let px = ref 0. and py = ref 0. and pz = ref 0. in
+ for i = 0 to Array.length bodies - 1 do
+ px := !px +. bodies.(i).vx *. bodies.(i).mass;
+ py := !py +. bodies.(i).vy *. bodies.(i).mass;
+ pz := !pz +. bodies.(i).vz *. bodies.(i).mass;
+ done;
+ bodies.(0).vx <- -. !px /. solar_mass;
+ bodies.(0).vy <- -. !py /. solar_mass;
+ bodies.(0).vz <- -. !pz /. solar_mass
+
+
+let jupiter = { x = 4.84143144246472090e+00;
+ y = -1.16032004402742839e+00;
+ z = -1.03622044471123109e-01;
+ vx = 1.66007664274403694e-03 *. days_per_year;
+ vy = 7.69901118419740425e-03 *. days_per_year;
+ vz = -6.90460016972063023e-05 *. days_per_year;
+ mass = 9.54791938424326609e-04 *. solar_mass; }
+
+let saturn = { x = 8.34336671824457987e+00;
+ y = 4.12479856412430479e+00;
+ z = -4.03523417114321381e-01;
+ vx = -2.76742510726862411e-03 *. days_per_year;
+ vy = 4.99852801234917238e-03 *. days_per_year;
+ vz = 2.30417297573763929e-05 *. days_per_year;
+ mass = 2.85885980666130812e-04 *. solar_mass; }
+
+let uranus = { x = 1.28943695621391310e+01;
+ y = -1.51111514016986312e+01;
+ z = -2.23307578892655734e-01;
+ vx = 2.96460137564761618e-03 *. days_per_year;
+ vy = 2.37847173959480950e-03 *. days_per_year;
+ vz = -2.96589568540237556e-05 *. days_per_year;
+ mass = 4.36624404335156298e-05 *. solar_mass; }
+
+let neptune = { x = 1.53796971148509165e+01;
+ y = -2.59193146099879641e+01;
+ z = 1.79258772950371181e-01;
+ vx = 2.68067772490389322e-03 *. days_per_year;
+ vy = 1.62824170038242295e-03 *. days_per_year;
+ vz = -9.51592254519715870e-05 *. days_per_year;
+ mass = 5.15138902046611451e-05 *. solar_mass; }
+
+let sun = { x = 0.; y = 0.; z = 0.; vx = 0.; vy = 0.; vz = 0.;
+ mass = solar_mass; }
+
+let bodies = [| sun; jupiter; saturn; uranus; neptune |]
+
+let () =
+ let n = int_of_string(Sys.argv.(1)) in
+ offset_momentum bodies;
+ Printf.printf "%.9f\n" (energy bodies);
+ for _ = 1 to n do advance bodies 0.01 done;
+ Printf.printf "%.9f\n" (energy bodies)
+(***********************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
+(* *)
+(* Copyright 1996 Institut National de Recherche en Informatique et *)
+(* en Automatique. All rights reserved. This file is distributed *)
+(* under the terms of the Q Public License version 1.0. *)
+(* *)
+(***********************************************************************)
+
+(* $Id: nucleic.ml 7017 2005-08-12 09:22:04Z xleroy $ *)
+
+[@@@ocaml.warning "-27"]
+
+(* Use floating-point arithmetic *)
+
+external ( + ) : float -> float -> float = "%addfloat"
+
+external ( - ) : float -> float -> float = "%subfloat"
+
+external ( * ) : float -> float -> float = "%mulfloat"
+
+
+(* -- POINTS ----------------------------------------------------------------*)
+
+type pt =
+ { x : float
+ ; y : float
+ ; z : float
+ }
+
+let pt_sub p1 p2 = { x = p1.x - p2.x; y = p1.y - p2.y; z = p1.z - p2.z }
+
+let pt_dist p1 p2 =
+ let dx = p1.x - p2.x and dy = p1.y - p2.y and dz = p1.z - p2.z in
+ sqrt ((dx * dx) + (dy * dy) + (dz * dz))
+
+let pt_phi p =
+ let b = atan2 p.x p.z in
+ atan2 ((cos b * p.z) + (sin b * p.x)) p.y
+
+let pt_theta p = atan2 p.x p.z
+
+(* -- COORDINATE TRANSFORMATIONS --------------------------------------------*)
+
+(*
+ The notation for the transformations follows "Paul, R.P. (1981) Robot
+ Manipulators. MIT Press." with the exception that our transformation
+ matrices don't have the perspective terms and are the transpose of
+ Paul's one. See also "M\"antyl\"a, M. (1985) An Introduction to
+ Solid Modeling, Computer Science Press" Appendix A.
+
+ The components of a transformation matrix are named like this:
+
+ a b c
+ d e f
+ g h i
+ tx ty tz
+
+ The components tx, ty, and tz are the translation vector.
+*)
+
+type tfo =
+ { a : float
+ ; b : float
+ ; c : float
+ ; d : float
+ ; e : float
+ ; f : float
+ ; g : float
+ ; h : float
+ ; i : float
+ ; tx : float
+ ; ty : float
+ ; tz : float
+ }
+
+let tfo_id =
+ { a = 1.0
+ ; b = 0.0
+ ; c = 0.0
+ ; d = 0.0
+ ; e = 1.0
+ ; f = 0.0
+ ; g = 0.0
+ ; h = 0.0
+ ; i = 1.0
+ ; tx = 0.0
+ ; ty = 0.0
+ ; tz = 0.0
+ }
+
+(*
+ The function "tfo-apply" multiplies a transformation matrix, tfo, by a
+ point vector, p. The result is a new point.
+*)
+
+let tfo_apply t p =
+ { x = (p.x * t.a) + (p.y * t.d) + (p.z * t.g) + t.tx
+ ; y = (p.x * t.b) + (p.y * t.e) + (p.z * t.h) + t.ty
+ ; z = (p.x * t.c) + (p.y * t.f) + (p.z * t.i) + t.tz
+ }
+
+(*
+ The function "tfo-combine" multiplies two transformation matrices A and B.
+ The result is a new matrix which cumulates the transformations described
+ by A and B.
+*)
+
+let tfo_combine a b =
+ (* *)
+ (* Hand elimination of common subexpressions.
+ Assumes lots of float registers (32 is perfect, 16 still OK).
+ Loses on the I386, of course. *)
+ let a_a = a.a
+ and a_b = a.b
+ and a_c = a.c
+ and a_d = a.d
+ and a_e = a.e
+ and a_f = a.f
+ and a_g = a.g
+ and a_h = a.h
+ and a_i = a.i
+ and a_tx = a.tx
+ and a_ty = a.ty
+ and a_tz = a.tz
+ and b_a = b.a
+ and b_b = b.b
+ and b_c = b.c
+ and b_d = b.d
+ and b_e = b.e
+ and b_f = b.f
+ and b_g = b.g
+ and b_h = b.h
+ and b_i = b.i
+ and b_tx = b.tx
+ and b_ty = b.ty
+ and b_tz = b.tz in
+ { a = (a_a * b_a) + (a_b * b_d) + (a_c * b_g)
+ ; b = (a_a * b_b) + (a_b * b_e) + (a_c * b_h)
+ ; c = (a_a * b_c) + (a_b * b_f) + (a_c * b_i)
+ ; d = (a_d * b_a) + (a_e * b_d) + (a_f * b_g)
+ ; e = (a_d * b_b) + (a_e * b_e) + (a_f * b_h)
+ ; f = (a_d * b_c) + (a_e * b_f) + (a_f * b_i)
+ ; g = (a_g * b_a) + (a_h * b_d) + (a_i * b_g)
+ ; h = (a_g * b_b) + (a_h * b_e) + (a_i * b_h)
+ ; i = (a_g * b_c) + (a_h * b_f) + (a_i * b_i)
+ ; tx = (a_tx * b_a) + (a_ty * b_d) + (a_tz * b_g) + b_tx
+ ; ty = (a_tx * b_b) + (a_ty * b_e) + (a_tz * b_h) + b_ty
+ ; tz = (a_tx * b_c) + (a_ty * b_f) + (a_tz * b_i) + b_tz
+ }
+
+(* *)
+(* Original without CSE *)
+(* *)
+(***
+ { a = ((a.a * b.a) + (a.b * b.d) + (a.c * b.g));
+ b = ((a.a * b.b) + (a.b * b.e) + (a.c * b.h));
+ c = ((a.a * b.c) + (a.b * b.f) + (a.c * b.i));
+ d = ((a.d * b.a) + (a.e * b.d) + (a.f * b.g));
+ e = ((a.d * b.b) + (a.e * b.e) + (a.f * b.h));
+ f = ((a.d * b.c) + (a.e * b.f) + (a.f * b.i));
+ g = ((a.g * b.a) + (a.h * b.d) + (a.i * b.g));
+ h = ((a.g * b.b) + (a.h * b.e) + (a.i * b.h));
+ i = ((a.g * b.c) + (a.h * b.f) + (a.i * b.i));
+ tx = ((a.tx * b.a) + (a.ty * b.d) + (a.tz * b.g) + b.tx);
+ ty = ((a.tx * b.b) + (a.ty * b.e) + (a.tz * b.h) + b.ty);
+ tz = ((a.tx * b.c) + (a.ty * b.f) + (a.tz * b.i) + b.tz)
+ }
+ ***)
+(* *)
+
+(*
+ The function "tfo-inv-ortho" computes the inverse of a homogeneous
+ transformation matrix.
+*)
+
+let tfo_inv_ortho t =
+ { a = t.a
+ ; b = t.d
+ ; c = t.g
+ ; d = t.b
+ ; e = t.e
+ ; f = t.h
+ ; g = t.c
+ ; h = t.f
+ ; i = t.i
+ ; tx = -.((t.a * t.tx) + (t.b * t.ty) + (t.c * t.tz))
+ ; ty = -.((t.d * t.tx) + (t.e * t.ty) + (t.f * t.tz))
+ ; tz = -.((t.g * t.tx) + (t.h * t.ty) + (t.i * t.tz))
+ }
+
+(*
+ Given three points p1, p2, and p3, the function "tfo-align" computes
+ a transformation matrix such that point p1 gets mapped to (0,0,0), p2 gets
+ mapped to the Y axis and p3 gets mapped to the YZ plane.
+*)
+
+let tfo_align p1 p2 p3 =
+ let x31 = p3.x - p1.x in
+ let y31 = p3.y - p1.y in
+ let z31 = p3.z - p1.z in
+ let rotpy = pt_sub p2 p1 in
+ let phi = pt_phi rotpy in
+ let theta = pt_theta rotpy in
+ let sinp = sin phi in
+ let sint = sin theta in
+ let cosp = cos phi in
+ let cost = cos theta in
+ let sinpsint = sinp * sint in
+ let sinpcost = sinp * cost in
+ let cospsint = cosp * sint in
+ let cospcost = cosp * cost in
+ let rotpz =
+ { x = (cost * x31) - (sint * z31)
+ ; y = (sinpsint * x31) + (cosp * y31) + (sinpcost * z31)
+ ; z = (cospsint * x31) + -.(sinp * y31) + (cospcost * z31)
+ }
+ in
+ let rho = pt_theta rotpz in
+ let cosr = cos rho in
+ let sinr = sin rho in
+ let x = -.(p1.x * cost) + (p1.z * sint) in
+ let y = -.(p1.x * sinpsint) - (p1.y * cosp) - (p1.z * sinpcost) in
+ let z = -.(p1.x * cospsint) + (p1.y * sinp) - (p1.z * cospcost) in
+ { a = (cost * cosr) - (cospsint * sinr)
+ ; b = sinpsint
+ ; c = (cost * sinr) + (cospsint * cosr)
+ ; d = sinp * sinr
+ ; e = cosp
+ ; f = -.(sinp * cosr)
+ ; g = -.(sint * cosr) - (cospcost * sinr)
+ ; h = sinpcost
+ ; i = -.(sint * sinr) + (cospcost * cosr)
+ ; tx = (x * cosr) - (z * sinr)
+ ; ty = y
+ ; tz = (x * sinr) + (z * cosr)
+ }
+
+(* -- NUCLEIC ACID CONFORMATIONS DATA BASE ----------------------------------*)
+
+(*
+ Numbering of atoms follows the paper:
+
+ IUPAC-IUB Joint Commission on Biochemical Nomenclature (JCBN)
+ (1983) Abbreviations and Symbols for the Description of
+ Conformations of Polynucleotide Chains. Eur. J. Biochem 131,
+ 9-15.
+*)
+
+(* Define remaining atoms for each nucleotide type. *)
+
+type nuc_specific =
+ | A of pt * pt * pt * pt * pt * pt * pt * pt
+ | C of pt * pt * pt * pt * pt * pt
+ | G of pt * pt * pt * pt * pt * pt * pt * pt * pt
+ | U of pt * pt * pt * pt * pt
+
+(*
+ A n6 n7 n9 c8 h2 h61 h62 h8
+ C n4 o2 h41 h42 h5 h6
+ G n2 n7 n9 c8 o6 h1 h21 h22 h8
+ U o2 o4 h3 h5 h6
+*)
+
+(* Define part common to all 4 nucleotide types. *)
+
+type nuc =
+ | N of
+ tfo
+ * tfo
+ * tfo
+ * tfo
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * pt
+ * nuc_specific
+
+(*
+ dgf_base_tfo ; defines the standard position for wc and wc_dumas
+ p_o3'_275_tfo ; defines the standard position for the connect function
+ p_o3'_180_tfo
+ p_o3'_60_tfo
+ p o1p o2p o5' c5' h5' h5'' c4' h4' o4' c1' h1' c2' h2'' o2' h2' c3'
+ h3' o3' n1 n3 c2 c4 c5 c6
+*)
+
+let is_A = function
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , A (_, _, _, _, _, _, _, _) ) -> true
+ | _ -> false
+
+let is_C = function
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , C (_, _, _, _, _, _) ) -> true
+ | _ -> false
+
+let is_G = function
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , G (_, _, _, _, _, _, _, _, _) ) -> true
+ | _ -> false
+
+let nuc_C1'
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ c1'
+
+let nuc_C2
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ c2
+
+let nuc_C3'
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ c3'
+
+let nuc_C4
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ c4
+
+let nuc_C4'
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ c4'
+
+let nuc_N1
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ n1
+
+let nuc_O3'
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ o3'
+
+let nuc_P
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ p
+
+let nuc_dgf_base_tfo
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ dgf_base_tfo
+
+let nuc_p_o3'_180_tfo
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ p_o3'_180_tfo
+
+let nuc_p_o3'_275_tfo
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ p_o3'_275_tfo
+
+let nuc_p_o3'_60_tfo
+ (N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , _ )) =
+ p_o3'_60_tfo
+
+let rA_N9 = function
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , A (n6, n7, n9, c8, h2, h61, h62, h8) ) -> n9
+ | _ -> assert false
+
+let rG_N9 = function
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , G (n2, n7, n9, c8, o6, h1, h21, h22, h8) ) -> n9
+ | _ -> assert false
+
+(* Database of nucleotide conformations: *)
+
+let rA =
+ N
+ ( { a = -0.0018
+ ; b = -0.8207
+ ; c = 0.5714
+ ; (* dgf_base_tfo *)
+ d = 0.2679
+ ; e = -0.5509
+ ; f = -0.7904
+ ; g = 0.9634
+ ; h = 0.1517
+ ; i = 0.2209
+ ; tx = 0.0073
+ ; ty = 8.4030
+ ; tz = 0.6232
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 5.4550; y = 8.2120; z = -2.8810 }
+ , (* C5' *)
+ { x = 5.4546; y = 8.8508; z = -1.9978 }
+ , (* H5' *)
+ { x = 5.7588; y = 8.6625; z = -3.8259 }
+ , (* H5'' *)
+ { x = 6.4970; y = 7.1480; z = -2.5980 }
+ , (* C4' *)
+ { x = 7.4896; y = 7.5919; z = -2.5214 }
+ , (* H4' *)
+ { x = 6.1630; y = 6.4860; z = -1.3440 }
+ , (* O4' *)
+ { x = 6.5400; y = 5.1200; z = -1.4190 }
+ , (* C1' *)
+ { x = 7.2763; y = 4.9681; z = -0.6297 }
+ , (* H1' *)
+ { x = 7.1940; y = 4.8830; z = -2.7770 }
+ , (* C2' *)
+ { x = 6.8667; y = 3.9183; z = -3.1647 }
+ , (* H2'' *)
+ { x = 8.5860; y = 5.0910; z = -2.6140 }
+ , (* O2' *)
+ { x = 8.9510; y = 4.7626; z = -1.7890 }
+ , (* H2' *)
+ { x = 6.5720; y = 6.0040; z = -3.6090 }
+ , (* C3' *)
+ { x = 5.5636; y = 5.7066; z = -3.8966 }
+ , (* H3' *)
+ { x = 7.3801; y = 6.3562; z = -4.7350 }
+ , (* O3' *)
+ { x = 4.7150; y = 0.4910; z = -0.1360 }
+ , (* N1 *)
+ { x = 6.3490; y = 2.1730; z = -0.6020 }
+ , (* N3 *)
+ { x = 5.9530; y = 0.9650; z = -0.2670 }
+ , (* C2 *)
+ { x = 5.2900; y = 2.9790; z = -0.8260 }
+ , (* C4 *)
+ { x = 3.9720; y = 2.6390; z = -0.7330 }
+ , (* C5 *)
+ { x = 3.6770; y = 1.3160; z = -0.3660 }
+ , (* C6 *)
+ A
+ ( { x = 2.4280; y = 0.8450; z = -0.2360 }
+ , (* N6 *)
+ { x = 3.1660; y = 3.7290; z = -1.0360 }
+ , (* N7 *)
+ { x = 5.3170; y = 4.2990; z = -1.1930 }
+ , (* N9 *)
+ { x = 4.0100; y = 4.6780; z = -1.2990 }
+ , (* C8 *)
+ { x = 6.6890; y = 0.1903; z = -0.0518 }
+ , (* H2 *)
+ { x = 1.6470; y = 1.4460; z = -0.4040 }
+ , (* H61 *)
+ { x = 2.2780; y = -0.1080; z = -0.0280 }
+ , (* H62 *)
+ { x = 3.4421; y = 5.5744; z = -1.5482 } ) )
+
+(* H8 *)
+
+let rA01 =
+ N
+ ( { a = -0.0043
+ ; b = -0.8175
+ ; c = 0.5759
+ ; (* dgf_base_tfo *)
+ d = 0.2617
+ ; e = -0.5567
+ ; f = -0.7884
+ ; g = 0.9651
+ ; h = 0.1473
+ ; i = 0.2164
+ ; tx = 0.0359
+ ; ty = 8.3929
+ ; tz = 0.5532
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 5.4352; y = 8.2183; z = -2.7757 }
+ , (* C5' *)
+ { x = 5.3830; y = 8.7883; z = -1.8481 }
+ , (* H5' *)
+ { x = 5.7729; y = 8.7436; z = -3.6691 }
+ , (* H5'' *)
+ { x = 6.4830; y = 7.1518; z = -2.5252 }
+ , (* C4' *)
+ { x = 7.4749; y = 7.5972; z = -2.4482 }
+ , (* H4' *)
+ { x = 6.1626; y = 6.4620; z = -1.2827 }
+ , (* O4' *)
+ { x = 6.5431; y = 5.0992; z = -1.3905 }
+ , (* C1' *)
+ { x = 7.2871; y = 4.9328; z = -0.6114 }
+ , (* H1' *)
+ { x = 7.1852; y = 4.8935; z = -2.7592 }
+ , (* C2' *)
+ { x = 6.8573; y = 3.9363; z = -3.1645 }
+ , (* H2'' *)
+ { x = 8.5780; y = 5.1025; z = -2.6046 }
+ , (* O2' *)
+ { x = 8.9516; y = 4.7577; z = -1.7902 }
+ , (* H2' *)
+ { x = 6.5522; y = 6.0300; z = -3.5612 }
+ , (* C3' *)
+ { x = 5.5420; y = 5.7356; z = -3.8459 }
+ , (* H3' *)
+ { x = 7.3487; y = 6.4089; z = -4.6867 }
+ , (* O3' *)
+ { x = 4.7442; y = 0.4514; z = -0.1390 }
+ , (* N1 *)
+ { x = 6.3687; y = 2.1459; z = -0.5926 }
+ , (* N3 *)
+ { x = 5.9795; y = 0.9335; z = -0.2657 }
+ , (* C2 *)
+ { x = 5.3052; y = 2.9471; z = -0.8125 }
+ , (* C4 *)
+ { x = 3.9891; y = 2.5987; z = -0.7230 }
+ , (* C5 *)
+ { x = 3.7016; y = 1.2717; z = -0.3647 }
+ , (* C6 *)
+ A
+ ( { x = 2.4553; y = 0.7925; z = -0.2390 }
+ , (* N6 *)
+ { x = 3.1770; y = 3.6859; z = -1.0198 }
+ , (* N7 *)
+ { x = 5.3247; y = 4.2695; z = -1.1710 }
+ , (* N9 *)
+ { x = 4.0156; y = 4.6415; z = -1.2759 }
+ , (* C8 *)
+ { x = 6.7198; y = 0.1618; z = -0.0547 }
+ , (* H2 *)
+ { x = 1.6709; y = 1.3900; z = -0.4039 }
+ , (* H61 *)
+ { x = 2.3107; y = -0.1627; z = -0.0373 }
+ , (* H62 *)
+ { x = 3.4426; y = 5.5361; z = -1.5199 } ) )
+
+(* H8 *)
+
+let rA02 =
+ N
+ ( { a = 0.5566
+ ; b = 0.0449
+ ; c = 0.8296
+ ; (* dgf_base_tfo *)
+ d = 0.5125
+ ; e = 0.7673
+ ; f = -0.3854
+ ; g = -0.6538
+ ; h = 0.6397
+ ; i = 0.4041
+ ; tx = -9.1161
+ ; ty = -3.7679
+ ; tz = -2.9968
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 4.5778; y = 6.6594; z = -4.0364 }
+ , (* C5' *)
+ { x = 4.9220; y = 7.1963; z = -4.9204 }
+ , (* H5' *)
+ { x = 3.7996; y = 5.9091; z = -4.1764 }
+ , (* H5'' *)
+ { x = 5.7873; y = 5.8869; z = -3.5482 }
+ , (* C4' *)
+ { x = 6.0405; y = 5.0875; z = -4.2446 }
+ , (* H4' *)
+ { x = 6.9135; y = 6.8036; z = -3.4310 }
+ , (* O4' *)
+ { x = 7.7293; y = 6.4084; z = -2.3392 }
+ , (* C1' *)
+ { x = 8.7078; y = 6.1815; z = -2.7624 }
+ , (* H1' *)
+ { x = 7.1305; y = 5.1418; z = -1.7347 }
+ , (* C2' *)
+ { x = 7.2040; y = 5.1982; z = -0.6486 }
+ , (* H2'' *)
+ { x = 7.7417; y = 4.0392; z = -2.3813 }
+ , (* O2' *)
+ { x = 8.6785; y = 4.1443; z = -2.5630 }
+ , (* H2' *)
+ { x = 5.6666; y = 5.2728; z = -2.1536 }
+ , (* C3' *)
+ { x = 5.1747; y = 5.9805; z = -1.4863 }
+ , (* H3' *)
+ { x = 4.9997; y = 4.0086; z = -2.1973 }
+ , (* O3' *)
+ { x = 10.3245; y = 8.5459; z = 1.5467 }
+ , (* N1 *)
+ { x = 9.8051; y = 6.9432; z = -0.1497 }
+ , (* N3 *)
+ { x = 10.5175; y = 7.4328; z = 0.8408 }
+ , (* C2 *)
+ { x = 8.7523; y = 7.7422; z = -0.4228 }
+ , (* C4 *)
+ { x = 8.4257; y = 8.9060; z = 0.2099 }
+ , (* C5 *)
+ { x = 9.2665; y = 9.3242; z = 1.2540 }
+ , (* C6 *)
+ A
+ ( { x = 9.0664; y = 10.4462; z = 1.9610 }
+ , (* N6 *)
+ { x = 7.2750; y = 9.4537; z = -0.3428 }
+ , (* N7 *)
+ { x = 7.7962; y = 7.5519; z = -1.3859 }
+ , (* N9 *)
+ { x = 6.9479; y = 8.6157; z = -1.2771 }
+ , (* C8 *)
+ { x = 11.4063; y = 6.9047; z = 1.1859 }
+ , (* H2 *)
+ { x = 8.2845; y = 11.0341; z = 1.7552 }
+ , (* H61 *)
+ { x = 9.6584; y = 10.6647; z = 2.7198 }
+ , (* H62 *)
+ { x = 6.0430; y = 8.9853; z = -1.7594 } ) )
+
+(* H8 *)
+
+let rA03 =
+ N
+ ( { a = -0.5021
+ ; b = 0.0731
+ ; c = 0.8617
+ ; (* dgf_base_tfo *)
+ d = -0.8112
+ ; e = 0.3054
+ ; f = -0.4986
+ ; g = -0.2996
+ ; h = -0.9494
+ ; i = -0.0940
+ ; tx = 6.4273
+ ; ty = -5.1944
+ ; tz = -3.7807
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 4.1214; y = 6.7116; z = -1.9049 }
+ , (* C5' *)
+ { x = 3.3465; y = 5.9610; z = -2.0607 }
+ , (* H5' *)
+ { x = 4.0789; y = 7.2928; z = -0.9837 }
+ , (* H5'' *)
+ { x = 5.4170; y = 5.9293; z = -1.8186 }
+ , (* C4' *)
+ { x = 5.4506; y = 5.3400; z = -0.9023 }
+ , (* H4' *)
+ { x = 5.5067; y = 5.0417; z = -2.9703 }
+ , (* O4' *)
+ { x = 6.8650; y = 4.9152; z = -3.3612 }
+ , (* C1' *)
+ { x = 7.1090; y = 3.8577; z = -3.2603 }
+ , (* H1' *)
+ { x = 7.7152; y = 5.7282; z = -2.3894 }
+ , (* C2' *)
+ { x = 8.5029; y = 6.2356; z = -2.9463 }
+ , (* H2'' *)
+ { x = 8.1036; y = 4.8568; z = -1.3419 }
+ , (* O2' *)
+ { x = 8.3270; y = 3.9651; z = -1.6184 }
+ , (* H2' *)
+ { x = 6.7003; y = 6.7565; z = -1.8911 }
+ , (* C3' *)
+ { x = 6.5898; y = 7.5329; z = -2.6482 }
+ , (* H3' *)
+ { x = 7.0505; y = 7.2878; z = -0.6105 }
+ , (* O3' *)
+ { x = 9.6740; y = 4.7656; z = -7.6614 }
+ , (* N1 *)
+ { x = 9.0739; y = 4.3013; z = -5.3941 }
+ , (* N3 *)
+ { x = 9.8416; y = 4.2192; z = -6.4581 }
+ , (* C2 *)
+ { x = 7.9885; y = 5.0632; z = -5.6446 }
+ , (* C4 *)
+ { x = 7.6822; y = 5.6856; z = -6.8194 }
+ , (* C5 *)
+ { x = 8.5831; y = 5.5215; z = -7.8840 }
+ , (* C6 *)
+ A
+ ( { x = 8.4084; y = 6.0747; z = -9.0933 }
+ , (* N6 *)
+ { x = 6.4857; y = 6.3816; z = -6.7035 }
+ , (* N7 *)
+ { x = 6.9740; y = 5.3703; z = -4.7760 }
+ , (* N9 *)
+ { x = 6.1133; y = 6.1613; z = -5.4808 }
+ , (* C8 *)
+ { x = 10.7627; y = 3.6375; z = -6.4220 }
+ , (* H2 *)
+ { x = 7.6031; y = 6.6390; z = -9.2733 }
+ , (* H61 *)
+ { x = 9.1004; y = 5.9708; z = -9.7893 }
+ , (* H62 *)
+ { x = 5.1705; y = 6.6830; z = -5.3167 } ) )
+
+(* H8 *)
+
+let rA04 =
+ N
+ ( { a = -0.5426
+ ; b = -0.8175
+ ; c = 0.1929
+ ; (* dgf_base_tfo *)
+ d = 0.8304
+ ; e = -0.5567
+ ; f = -0.0237
+ ; g = 0.1267
+ ; h = 0.1473
+ ; i = 0.9809
+ ; tx = -0.5075
+ ; ty = 8.3929
+ ; tz = 0.2229
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 5.4352; y = 8.2183; z = -2.7757 }
+ , (* C5' *)
+ { x = 5.3830; y = 8.7883; z = -1.8481 }
+ , (* H5' *)
+ { x = 5.7729; y = 8.7436; z = -3.6691 }
+ , (* H5'' *)
+ { x = 6.4830; y = 7.1518; z = -2.5252 }
+ , (* C4' *)
+ { x = 7.4749; y = 7.5972; z = -2.4482 }
+ , (* H4' *)
+ { x = 6.1626; y = 6.4620; z = -1.2827 }
+ , (* O4' *)
+ { x = 6.5431; y = 5.0992; z = -1.3905 }
+ , (* C1' *)
+ { x = 7.2871; y = 4.9328; z = -0.6114 }
+ , (* H1' *)
+ { x = 7.1852; y = 4.8935; z = -2.7592 }
+ , (* C2' *)
+ { x = 6.8573; y = 3.9363; z = -3.1645 }
+ , (* H2'' *)
+ { x = 8.5780; y = 5.1025; z = -2.6046 }
+ , (* O2' *)
+ { x = 8.9516; y = 4.7577; z = -1.7902 }
+ , (* H2' *)
+ { x = 6.5522; y = 6.0300; z = -3.5612 }
+ , (* C3' *)
+ { x = 5.5420; y = 5.7356; z = -3.8459 }
+ , (* H3' *)
+ { x = 7.3487; y = 6.4089; z = -4.6867 }
+ , (* O3' *)
+ { x = 3.6343; y = 2.6680; z = 2.0783 }
+ , (* N1 *)
+ { x = 5.4505; y = 3.9805; z = 1.2446 }
+ , (* N3 *)
+ { x = 4.7540; y = 3.3816; z = 2.1851 }
+ , (* C2 *)
+ { x = 4.8805; y = 3.7951; z = 0.0354 }
+ , (* C4 *)
+ { x = 3.7416; y = 3.0925; z = -0.2305 }
+ , (* C5 *)
+ { x = 3.0873; y = 2.4980; z = 0.8606 }
+ , (* C6 *)
+ A
+ ( { x = 1.9600; y = 1.7805; z = 0.7462 }
+ , (* N6 *)
+ { x = 3.4605; y = 3.1184; z = -1.5906 }
+ , (* N7 *)
+ { x = 5.3247; y = 4.2695; z = -1.1710 }
+ , (* N9 *)
+ { x = 4.4244; y = 3.8244; z = -2.0953 }
+ , (* C8 *)
+ { x = 5.0814; y = 3.4352; z = 3.2234 }
+ , (* H2 *)
+ { x = 1.5423; y = 1.6454; z = -0.1520 }
+ , (* H61 *)
+ { x = 1.5716; y = 1.3398; z = 1.5392 }
+ , (* H62 *)
+ { x = 4.2675; y = 3.8876; z = -3.1721 } ) )
+
+(* H8 *)
+
+let rA05 =
+ N
+ ( { a = -0.5891
+ ; b = 0.0449
+ ; c = 0.8068
+ ; (* dgf_base_tfo *)
+ d = 0.5375
+ ; e = 0.7673
+ ; f = 0.3498
+ ; g = -0.6034
+ ; h = 0.6397
+ ; i = -0.4762
+ ; tx = -0.3019
+ ; ty = -3.7679
+ ; tz = -9.5913
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 4.5778; y = 6.6594; z = -4.0364 }
+ , (* C5' *)
+ { x = 4.9220; y = 7.1963; z = -4.9204 }
+ , (* H5' *)
+ { x = 3.7996; y = 5.9091; z = -4.1764 }
+ , (* H5'' *)
+ { x = 5.7873; y = 5.8869; z = -3.5482 }
+ , (* C4' *)
+ { x = 6.0405; y = 5.0875; z = -4.2446 }
+ , (* H4' *)
+ { x = 6.9135; y = 6.8036; z = -3.4310 }
+ , (* O4' *)
+ { x = 7.7293; y = 6.4084; z = -2.3392 }
+ , (* C1' *)
+ { x = 8.7078; y = 6.1815; z = -2.7624 }
+ , (* H1' *)
+ { x = 7.1305; y = 5.1418; z = -1.7347 }
+ , (* C2' *)
+ { x = 7.2040; y = 5.1982; z = -0.6486 }
+ , (* H2'' *)
+ { x = 7.7417; y = 4.0392; z = -2.3813 }
+ , (* O2' *)
+ { x = 8.6785; y = 4.1443; z = -2.5630 }
+ , (* H2' *)
+ { x = 5.6666; y = 5.2728; z = -2.1536 }
+ , (* C3' *)
+ { x = 5.1747; y = 5.9805; z = -1.4863 }
+ , (* H3' *)
+ { x = 4.9997; y = 4.0086; z = -2.1973 }
+ , (* O3' *)
+ { x = 10.2594; y = 10.6774; z = -1.0056 }
+ , (* N1 *)
+ { x = 9.7528; y = 8.7080; z = -2.2631 }
+ , (* N3 *)
+ { x = 10.4471; y = 9.7876; z = -1.9791 }
+ , (* C2 *)
+ { x = 8.7271; y = 8.5575; z = -1.3991 }
+ , (* C4 *)
+ { x = 8.4100; y = 9.3803; z = -0.3580 }
+ , (* C5 *)
+ { x = 9.2294; y = 10.5030; z = -0.1574 }
+ , (* C6 *)
+ A
+ ( { x = 9.0349; y = 11.3951; z = 0.8250 }
+ , (* N6 *)
+ { x = 7.2891; y = 8.9068; z = 0.3121 }
+ , (* N7 *)
+ { x = 7.7962; y = 7.5519; z = -1.3859 }
+ , (* N9 *)
+ { x = 6.9702; y = 7.8292; z = -0.3353 }
+ , (* C8 *)
+ { x = 11.3132; y = 10.0537; z = -2.5851 }
+ , (* H2 *)
+ { x = 8.2741; y = 11.2784; z = 1.4629 }
+ , (* H61 *)
+ { x = 9.6733; y = 12.1368; z = 0.9529 }
+ , (* H62 *)
+ { x = 6.0888; y = 7.3990; z = 0.1403 } ) )
+
+(* H8 *)
+
+let rA06 =
+ N
+ ( { a = -0.9815
+ ; b = 0.0731
+ ; c = -0.1772
+ ; (* dgf_base_tfo *)
+ d = 0.1912
+ ; e = 0.3054
+ ; f = -0.9328
+ ; g = -0.0141
+ ; h = -0.9494
+ ; i = -0.3137
+ ; tx = 5.7506
+ ; ty = -5.1944
+ ; tz = 4.7470
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 4.1214; y = 6.7116; z = -1.9049 }
+ , (* C5' *)
+ { x = 3.3465; y = 5.9610; z = -2.0607 }
+ , (* H5' *)
+ { x = 4.0789; y = 7.2928; z = -0.9837 }
+ , (* H5'' *)
+ { x = 5.4170; y = 5.9293; z = -1.8186 }
+ , (* C4' *)
+ { x = 5.4506; y = 5.3400; z = -0.9023 }
+ , (* H4' *)
+ { x = 5.5067; y = 5.0417; z = -2.9703 }
+ , (* O4' *)
+ { x = 6.8650; y = 4.9152; z = -3.3612 }
+ , (* C1' *)
+ { x = 7.1090; y = 3.8577; z = -3.2603 }
+ , (* H1' *)
+ { x = 7.7152; y = 5.7282; z = -2.3894 }
+ , (* C2' *)
+ { x = 8.5029; y = 6.2356; z = -2.9463 }
+ , (* H2'' *)
+ { x = 8.1036; y = 4.8568; z = -1.3419 }
+ , (* O2' *)
+ { x = 8.3270; y = 3.9651; z = -1.6184 }
+ , (* H2' *)
+ { x = 6.7003; y = 6.7565; z = -1.8911 }
+ , (* C3' *)
+ { x = 6.5898; y = 7.5329; z = -2.6482 }
+ , (* H3' *)
+ { x = 7.0505; y = 7.2878; z = -0.6105 }
+ , (* O3' *)
+ { x = 6.6624; y = 3.5061; z = -8.2986 }
+ , (* N1 *)
+ { x = 6.5810; y = 3.2570; z = -5.9221 }
+ , (* N3 *)
+ { x = 6.5151; y = 2.8263; z = -7.1625 }
+ , (* C2 *)
+ { x = 6.8364; y = 4.5817; z = -5.8882 }
+ , (* C4 *)
+ { x = 7.0116; y = 5.4064; z = -6.9609 }
+ , (* C5 *)
+ { x = 6.9173; y = 4.8260; z = -8.2361 }
+ , (* C6 *)
+ A
+ ( { x = 7.0668; y = 5.5163; z = -9.3763 }
+ , (* N6 *)
+ { x = 7.2573; y = 6.7070; z = -6.5394 }
+ , (* N7 *)
+ { x = 6.9740; y = 5.3703; z = -4.7760 }
+ , (* N9 *)
+ { x = 7.2238; y = 6.6275; z = -5.2453 }
+ , (* C8 *)
+ { x = 6.3146; y = 1.7741; z = -7.3641 }
+ , (* H2 *)
+ { x = 7.2568; y = 6.4972; z = -9.3456 }
+ , (* H61 *)
+ { x = 7.0437; y = 5.0478; z = -10.2446 }
+ , (* H62 *)
+ { x = 7.4108; y = 7.6227; z = -4.8418 } ) )
+
+(* H8 *)
+
+let rA07 =
+ N
+ ( { a = 0.2379
+ ; b = 0.1310
+ ; c = -0.9624
+ ; (* dgf_base_tfo *)
+ d = -0.5876
+ ; e = -0.7696
+ ; f = -0.2499
+ ; g = -0.7734
+ ; h = 0.6249
+ ; i = -0.1061
+ ; tx = 30.9870
+ ; ty = -26.9344
+ ; tz = 42.6416
+ }
+ , { a = 0.7529
+ ; b = 0.1548
+ ; c = 0.6397
+ ; (* P_O3'_275_tfo *)
+ d = 0.2952
+ ; e = -0.9481
+ ; f = -0.1180
+ ; g = 0.5882
+ ; h = 0.2777
+ ; i = -0.7595
+ ; tx = -58.8919
+ ; ty = -11.3095
+ ; tz = 6.0866
+ }
+ , { a = -0.0239
+ ; b = 0.9667
+ ; c = -0.2546
+ ; (* P_O3'_180_tfo *)
+ d = 0.9731
+ ; e = -0.0359
+ ; f = -0.2275
+ ; g = -0.2290
+ ; h = -0.2532
+ ; i = -0.9399
+ ; tx = 3.5401
+ ; ty = -29.7913
+ ; tz = 52.2796
+ }
+ , { a = -0.8912
+ ; b = -0.4531
+ ; c = 0.0242
+ ; (* P_O3'_60_tfo *)
+ d = -0.1183
+ ; e = 0.1805
+ ; f = -0.9764
+ ; g = 0.4380
+ ; h = -0.8730
+ ; i = -0.2145
+ ; tx = 19.9023
+ ; ty = 54.8054
+ ; tz = 15.2799
+ }
+ , { x = 41.8210; y = 8.3880; z = 43.5890 }
+ , (* P *)
+ { x = 42.5400; y = 8.0450; z = 44.8330 }
+ , (* O1P *)
+ { x = 42.2470; y = 9.6920; z = 42.9910 }
+ , (* O2P *)
+ { x = 40.2550; y = 8.2030; z = 43.7340 }
+ , (* O5' *)
+ { x = 39.3505; y = 8.4697; z = 42.6565 }
+ , (* C5' *)
+ { x = 39.1377; y = 7.5433; z = 42.1230 }
+ , (* H5' *)
+ { x = 39.7203; y = 9.3119; z = 42.0717 }
+ , (* H5'' *)
+ { x = 38.0405; y = 8.9195; z = 43.2869 }
+ , (* C4' *)
+ { x = 37.3687; y = 9.3036; z = 42.5193 }
+ , (* H4' *)
+ { x = 37.4319; y = 7.8146; z = 43.9387 }
+ , (* O4' *)
+ { x = 37.1959; y = 8.1354; z = 45.3237 }
+ , (* C1' *)
+ { x = 36.1788; y = 8.5202; z = 45.3970 }
+ , (* H1' *)
+ { x = 38.1721; y = 9.2328; z = 45.6504 }
+ , (* C2' *)
+ { x = 39.1555; y = 8.7939; z = 45.8188 }
+ , (* H2'' *)
+ { x = 37.7862; y = 10.0617; z = 46.7013 }
+ , (* O2' *)
+ { x = 37.3087; y = 9.6229; z = 47.4092 }
+ , (* H2' *)
+ { x = 38.1844; y = 10.0268; z = 44.3367 }
+ , (* C3' *)
+ { x = 39.1578; y = 10.5054; z = 44.2289 }
+ , (* H3' *)
+ { x = 37.0547; y = 10.9127; z = 44.3441 }
+ , (* O3' *)
+ { x = 34.8811; y = 4.2072; z = 47.5784 }
+ , (* N1 *)
+ { x = 35.1084; y = 6.1336; z = 46.1818 }
+ , (* N3 *)
+ { x = 34.4108; y = 5.1360; z = 46.7207 }
+ , (* C2 *)
+ { x = 36.3908; y = 6.1224; z = 46.6053 }
+ , (* C4 *)
+ { x = 36.9819; y = 5.2334; z = 47.4697 }
+ , (* C5 *)
+ { x = 36.1786; y = 4.1985; z = 48.0035 }
+ , (* C6 *)
+ A
+ ( { x = 36.6103; y = 3.2749; z = 48.8452 }
+ , (* N6 *)
+ { x = 38.3236; y = 5.5522; z = 47.6595 }
+ , (* N7 *)
+ { x = 37.3887; y = 7.0024; z = 46.2437 }
+ , (* N9 *)
+ { x = 38.5055; y = 6.6096; z = 46.9057 }
+ , (* C8 *)
+ { x = 33.3553; y = 5.0152; z = 46.4771 }
+ , (* H2 *)
+ { x = 37.5730; y = 3.2804; z = 49.1507 }
+ , (* H61 *)
+ { x = 35.9775; y = 2.5638; z = 49.1828 }
+ , (* H62 *)
+ { x = 39.5461; y = 6.9184; z = 47.0041 } ) )
+
+(* H8 *)
+
+let rA08 =
+ N
+ ( { a = 0.1084
+ ; b = -0.0895
+ ; c = -0.9901
+ ; (* dgf_base_tfo *)
+ d = 0.9789
+ ; e = -0.1638
+ ; f = 0.1220
+ ; g = -0.1731
+ ; h = -0.9824
+ ; i = 0.0698
+ ; tx = -2.9039
+ ; ty = 47.2655
+ ; tz = 33.0094
+ }
+ , { a = 0.7529
+ ; b = 0.1548
+ ; c = 0.6397
+ ; (* P_O3'_275_tfo *)
+ d = 0.2952
+ ; e = -0.9481
+ ; f = -0.1180
+ ; g = 0.5882
+ ; h = 0.2777
+ ; i = -0.7595
+ ; tx = -58.8919
+ ; ty = -11.3095
+ ; tz = 6.0866
+ }
+ , { a = -0.0239
+ ; b = 0.9667
+ ; c = -0.2546
+ ; (* P_O3'_180_tfo *)
+ d = 0.9731
+ ; e = -0.0359
+ ; f = -0.2275
+ ; g = -0.2290
+ ; h = -0.2532
+ ; i = -0.9399
+ ; tx = 3.5401
+ ; ty = -29.7913
+ ; tz = 52.2796
+ }
+ , { a = -0.8912
+ ; b = -0.4531
+ ; c = 0.0242
+ ; (* P_O3'_60_tfo *)
+ d = -0.1183
+ ; e = 0.1805
+ ; f = -0.9764
+ ; g = 0.4380
+ ; h = -0.8730
+ ; i = -0.2145
+ ; tx = 19.9023
+ ; ty = 54.8054
+ ; tz = 15.2799
+ }
+ , { x = 41.8210; y = 8.3880; z = 43.5890 }
+ , (* P *)
+ { x = 42.5400; y = 8.0450; z = 44.8330 }
+ , (* O1P *)
+ { x = 42.2470; y = 9.6920; z = 42.9910 }
+ , (* O2P *)
+ { x = 40.2550; y = 8.2030; z = 43.7340 }
+ , (* O5' *)
+ { x = 39.4850; y = 8.9301; z = 44.6977 }
+ , (* C5' *)
+ { x = 39.0638; y = 9.8199; z = 44.2296 }
+ , (* H5' *)
+ { x = 40.0757; y = 9.0713; z = 45.6029 }
+ , (* H5'' *)
+ { x = 38.3102; y = 8.0414; z = 45.0789 }
+ , (* C4' *)
+ { x = 37.7842; y = 8.4637; z = 45.9351 }
+ , (* H4' *)
+ { x = 37.4200; y = 7.9453; z = 43.9769 }
+ , (* O4' *)
+ { x = 37.2249; y = 6.5609; z = 43.6273 }
+ , (* C1' *)
+ { x = 36.3360; y = 6.2168; z = 44.1561 }
+ , (* H1' *)
+ { x = 38.4347; y = 5.8414; z = 44.1590 }
+ , (* C2' *)
+ { x = 39.2688; y = 5.9974; z = 43.4749 }
+ , (* H2'' *)
+ { x = 38.2344; y = 4.4907; z = 44.4348 }
+ , (* O2' *)
+ { x = 37.6374; y = 4.0386; z = 43.8341 }
+ , (* H2' *)
+ { x = 38.6926; y = 6.6079; z = 45.4637 }
+ , (* C3' *)
+ { x = 39.7585; y = 6.5640; z = 45.6877 }
+ , (* H3' *)
+ { x = 37.8238; y = 6.0705; z = 46.4723 }
+ , (* O3' *)
+ { x = 33.9162; y = 6.2598; z = 39.7758 }
+ , (* N1 *)
+ { x = 34.6709; y = 6.5759; z = 42.0215 }
+ , (* N3 *)
+ { x = 33.7257; y = 6.5186; z = 41.0858 }
+ , (* C2 *)
+ { x = 35.8935; y = 6.3324; z = 41.5018 }
+ , (* C4 *)
+ { x = 36.2105; y = 6.0601; z = 40.1932 }
+ , (* C5 *)
+ { x = 35.1538; y = 6.0151; z = 39.2537 }
+ , (* C6 *)
+ A
+ ( { x = 35.3088; y = 5.7642; z = 37.9649 }
+ , (* N6 *)
+ { x = 37.5818; y = 5.8677; z = 40.0507 }
+ , (* N7 *)
+ { x = 37.0932; y = 6.3197; z = 42.1810 }
+ , (* N9 *)
+ { x = 38.0509; y = 6.0354; z = 41.2635 }
+ , (* C8 *)
+ { x = 32.6830; y = 6.6898; z = 41.3532 }
+ , (* H2 *)
+ { x = 36.2305; y = 5.5855; z = 37.5925 }
+ , (* H61 *)
+ { x = 34.5056; y = 5.7512; z = 37.3528 }
+ , (* H62 *)
+ { x = 39.1318; y = 5.8993; z = 41.2285 } ) )
+
+(* H8 *)
+
+let rA09 =
+ N
+ ( { a = 0.8467
+ ; b = 0.4166
+ ; c = -0.3311
+ ; (* dgf_base_tfo *)
+ d = -0.3962
+ ; e = 0.9089
+ ; f = 0.1303
+ ; g = 0.3552
+ ; h = 0.0209
+ ; i = 0.9346
+ ; tx = -42.7319
+ ; ty = -26.6223
+ ; tz = -29.8163
+ }
+ , { a = 0.7529
+ ; b = 0.1548
+ ; c = 0.6397
+ ; (* P_O3'_275_tfo *)
+ d = 0.2952
+ ; e = -0.9481
+ ; f = -0.1180
+ ; g = 0.5882
+ ; h = 0.2777
+ ; i = -0.7595
+ ; tx = -58.8919
+ ; ty = -11.3095
+ ; tz = 6.0866
+ }
+ , { a = -0.0239
+ ; b = 0.9667
+ ; c = -0.2546
+ ; (* P_O3'_180_tfo *)
+ d = 0.9731
+ ; e = -0.0359
+ ; f = -0.2275
+ ; g = -0.2290
+ ; h = -0.2532
+ ; i = -0.9399
+ ; tx = 3.5401
+ ; ty = -29.7913
+ ; tz = 52.2796
+ }
+ , { a = -0.8912
+ ; b = -0.4531
+ ; c = 0.0242
+ ; (* P_O3'_60_tfo *)
+ d = -0.1183
+ ; e = 0.1805
+ ; f = -0.9764
+ ; g = 0.4380
+ ; h = -0.8730
+ ; i = -0.2145
+ ; tx = 19.9023
+ ; ty = 54.8054
+ ; tz = 15.2799
+ }
+ , { x = 41.8210; y = 8.3880; z = 43.5890 }
+ , (* P *)
+ { x = 42.5400; y = 8.0450; z = 44.8330 }
+ , (* O1P *)
+ { x = 42.2470; y = 9.6920; z = 42.9910 }
+ , (* O2P *)
+ { x = 40.2550; y = 8.2030; z = 43.7340 }
+ , (* O5' *)
+ { x = 39.3505; y = 8.4697; z = 42.6565 }
+ , (* C5' *)
+ { x = 39.1377; y = 7.5433; z = 42.1230 }
+ , (* H5' *)
+ { x = 39.7203; y = 9.3119; z = 42.0717 }
+ , (* H5'' *)
+ { x = 38.0405; y = 8.9195; z = 43.2869 }
+ , (* C4' *)
+ { x = 37.6479; y = 8.1347; z = 43.9335 }
+ , (* H4' *)
+ { x = 38.2691; y = 10.0933; z = 44.0524 }
+ , (* O4' *)
+ { x = 37.3999; y = 11.1488; z = 43.5973 }
+ , (* C1' *)
+ { x = 36.5061; y = 11.1221; z = 44.2206 }
+ , (* H1' *)
+ { x = 37.0364; y = 10.7838; z = 42.1836 }
+ , (* C2' *)
+ { x = 37.8636; y = 11.0489; z = 41.5252 }
+ , (* H2'' *)
+ { x = 35.8275; y = 11.3133; z = 41.7379 }
+ , (* O2' *)
+ { x = 35.6214; y = 12.1896; z = 42.0714 }
+ , (* H2' *)
+ { x = 36.9316; y = 9.2556; z = 42.2837 }
+ , (* C3' *)
+ { x = 37.1778; y = 8.8260; z = 41.3127 }
+ , (* H3' *)
+ { x = 35.6285; y = 8.9334; z = 42.7926 }
+ , (* O3' *)
+ { x = 38.1482; y = 15.2833; z = 46.4641 }
+ , (* N1 *)
+ { x = 37.3641; y = 13.0968; z = 45.9007 }
+ , (* N3 *)
+ { x = 37.5032; y = 14.1288; z = 46.7300 }
+ , (* C2 *)
+ { x = 37.9570; y = 13.3377; z = 44.7113 }
+ , (* C4 *)
+ { x = 38.6397; y = 14.4660; z = 44.3267 }
+ , (* C5 *)
+ { x = 38.7473; y = 15.5229; z = 45.2609 }
+ , (* C6 *)
+ A
+ ( { x = 39.3720; y = 16.6649; z = 45.0297 }
+ , (* N6 *)
+ { x = 39.1079; y = 14.3351; z = 43.0223 }
+ , (* N7 *)
+ { x = 38.0132; y = 12.4868; z = 43.6280 }
+ , (* N9 *)
+ { x = 38.7058; y = 13.1402; z = 42.6620 }
+ , (* C8 *)
+ { x = 37.0731; y = 14.0857; z = 47.7306 }
+ , (* H2 *)
+ { x = 39.8113; y = 16.8281; z = 44.1350 }
+ , (* H61 *)
+ { x = 39.4100; y = 17.3741; z = 45.7478 }
+ , (* H62 *)
+ { x = 39.0412; y = 12.9660; z = 41.6397 } ) )
+
+(* H8 *)
+
+let rA10 =
+ N
+ ( { a = 0.7063
+ ; b = 0.6317
+ ; c = -0.3196
+ ; (* dgf_base_tfo *)
+ d = -0.0403
+ ; e = -0.4149
+ ; f = -0.9090
+ ; g = -0.7068
+ ; h = 0.6549
+ ; i = -0.2676
+ ; tx = 6.4402
+ ; ty = -52.1496
+ ; tz = 30.8246
+ }
+ , { a = 0.7529
+ ; b = 0.1548
+ ; c = 0.6397
+ ; (* P_O3'_275_tfo *)
+ d = 0.2952
+ ; e = -0.9481
+ ; f = -0.1180
+ ; g = 0.5882
+ ; h = 0.2777
+ ; i = -0.7595
+ ; tx = -58.8919
+ ; ty = -11.3095
+ ; tz = 6.0866
+ }
+ , { a = -0.0239
+ ; b = 0.9667
+ ; c = -0.2546
+ ; (* P_O3'_180_tfo *)
+ d = 0.9731
+ ; e = -0.0359
+ ; f = -0.2275
+ ; g = -0.2290
+ ; h = -0.2532
+ ; i = -0.9399
+ ; tx = 3.5401
+ ; ty = -29.7913
+ ; tz = 52.2796
+ }
+ , { a = -0.8912
+ ; b = -0.4531
+ ; c = 0.0242
+ ; (* P_O3'_60_tfo *)
+ d = -0.1183
+ ; e = 0.1805
+ ; f = -0.9764
+ ; g = 0.4380
+ ; h = -0.8730
+ ; i = -0.2145
+ ; tx = 19.9023
+ ; ty = 54.8054
+ ; tz = 15.2799
+ }
+ , { x = 41.8210; y = 8.3880; z = 43.5890 }
+ , (* P *)
+ { x = 42.5400; y = 8.0450; z = 44.8330 }
+ , (* O1P *)
+ { x = 42.2470; y = 9.6920; z = 42.9910 }
+ , (* O2P *)
+ { x = 40.2550; y = 8.2030; z = 43.7340 }
+ , (* O5' *)
+ { x = 39.4850; y = 8.9301; z = 44.6977 }
+ , (* C5' *)
+ { x = 39.0638; y = 9.8199; z = 44.2296 }
+ , (* H5' *)
+ { x = 40.0757; y = 9.0713; z = 45.6029 }
+ , (* H5'' *)
+ { x = 38.3102; y = 8.0414; z = 45.0789 }
+ , (* C4' *)
+ { x = 37.7099; y = 7.8166; z = 44.1973 }
+ , (* H4' *)
+ { x = 38.8012; y = 6.8321; z = 45.6380 }
+ , (* O4' *)
+ { x = 38.2431; y = 6.6413; z = 46.9529 }
+ , (* C1' *)
+ { x = 37.3505; y = 6.0262; z = 46.8385 }
+ , (* H1' *)
+ { x = 37.8484; y = 8.0156; z = 47.4214 }
+ , (* C2' *)
+ { x = 38.7381; y = 8.5406; z = 47.7690 }
+ , (* H2'' *)
+ { x = 36.8286; y = 8.0368; z = 48.3701 }
+ , (* O2' *)
+ { x = 36.8392; y = 7.3063; z = 48.9929 }
+ , (* H2' *)
+ { x = 37.3576; y = 8.6512; z = 46.1132 }
+ , (* C3' *)
+ { x = 37.5207; y = 9.7275; z = 46.1671 }
+ , (* H3' *)
+ { x = 35.9985; y = 8.2392; z = 45.9032 }
+ , (* O3' *)
+ { x = 39.9117; y = 2.2278; z = 48.8527 }
+ , (* N1 *)
+ { x = 38.6207; y = 3.6941; z = 47.4757 }
+ , (* N3 *)
+ { x = 38.9872; y = 2.4888; z = 47.9057 }
+ , (* C2 *)
+ { x = 39.2961; y = 4.6720; z = 48.1174 }
+ , (* C4 *)
+ { x = 40.2546; y = 4.5307; z = 49.0912 }
+ , (* C5 *)
+ { x = 40.5932; y = 3.2189; z = 49.4985 }
+ , (* C6 *)
+ A
+ ( { x = 41.4938; y = 2.9317; z = 50.4229 }
+ , (* N6 *)
+ { x = 40.7195; y = 5.7755; z = 49.5060 }
+ , (* N7 *)
+ { x = 39.1730; y = 6.0305; z = 47.9170 }
+ , (* N9 *)
+ { x = 40.0413; y = 6.6250; z = 48.7728 }
+ , (* C8 *)
+ { x = 38.5257; y = 1.5960; z = 47.4838 }
+ , (* H2 *)
+ { x = 41.9907; y = 3.6753; z = 50.8921 }
+ , (* H61 *)
+ { x = 41.6848; y = 1.9687; z = 50.6599 }
+ , (* H62 *)
+ { x = 40.3571; y = 7.6321; z = 49.0452 } ) )
+
+(* H8 *)
+
+let rAs = [ rA01; rA02; rA03; rA04; rA05; rA06; rA07; rA08; rA09; rA10 ]
+
+let rC =
+ N
+ ( { a = -0.0359
+ ; b = -0.8071
+ ; c = 0.5894
+ ; (* dgf_base_tfo *)
+ d = -0.2669
+ ; e = 0.5761
+ ; f = 0.7726
+ ; g = -0.9631
+ ; h = -0.1296
+ ; i = -0.2361
+ ; tx = 0.1584
+ ; ty = 8.3434
+ ; tz = 0.5434
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2430; y = -8.2420; z = 2.8260 }
+ , (* C5' *)
+ { x = 5.1974; y = -8.8497; z = 1.9223 }
+ , (* H5' *)
+ { x = 5.5548; y = -8.7348; z = 3.7469 }
+ , (* H5'' *)
+ { x = 6.3140; y = -7.2060; z = 2.5510 }
+ , (* C4' *)
+ { x = 7.2954; y = -7.6762; z = 2.4898 }
+ , (* H4' *)
+ { x = 6.0140; y = -6.5420; z = 1.2890 }
+ , (* O4' *)
+ { x = 6.4190; y = -5.1840; z = 1.3620 }
+ , (* C1' *)
+ { x = 7.1608; y = -5.0495; z = 0.5747 }
+ , (* H1' *)
+ { x = 7.0760; y = -4.9560; z = 2.7270 }
+ , (* C2' *)
+ { x = 6.7770; y = -3.9803; z = 3.1099 }
+ , (* H2'' *)
+ { x = 8.4500; y = -5.1930; z = 2.5810 }
+ , (* O2' *)
+ { x = 8.8309; y = -4.8755; z = 1.7590 }
+ , (* H2' *)
+ { x = 6.4060; y = -6.0590; z = 3.5580 }
+ , (* C3' *)
+ { x = 5.4021; y = -5.7313; z = 3.8281 }
+ , (* H3' *)
+ { x = 7.1570; y = -6.4240; z = 4.7070 }
+ , (* O3' *)
+ { x = 5.2170; y = -4.3260; z = 1.1690 }
+ , (* N1 *)
+ { x = 4.2960; y = -2.2560; z = 0.6290 }
+ , (* N3 *)
+ { x = 5.4330; y = -3.0200; z = 0.7990 }
+ , (* C2 *)
+ { x = 2.9930; y = -2.6780; z = 0.7940 }
+ , (* C4 *)
+ { x = 2.8670; y = -4.0630; z = 1.1830 }
+ , (* C5 *)
+ { x = 3.9570; y = -4.8300; z = 1.3550 }
+ , (* C6 *)
+ C
+ ( { x = 2.0187; y = -1.8047; z = 0.5874 }
+ , (* N4 *)
+ { x = 6.5470; y = -2.5560; z = 0.6290 }
+ , (* O2 *)
+ { x = 1.0684; y = -2.1236; z = 0.7109 }
+ , (* H41 *)
+ { x = 2.2344; y = -0.8560; z = 0.3162 }
+ , (* H42 *)
+ { x = 1.8797; y = -4.4972; z = 1.3404 }
+ , (* H5 *)
+ { x = 3.8479; y = -5.8742; z = 1.6480 } ) )
+
+(* H6 *)
+
+let rC01 =
+ N
+ ( { a = -0.0137
+ ; b = -0.8012
+ ; c = 0.5983
+ ; (* dgf_base_tfo *)
+ d = -0.2523
+ ; e = 0.5817
+ ; f = 0.7733
+ ; g = -0.9675
+ ; h = -0.1404
+ ; i = -0.2101
+ ; tx = 0.2031
+ ; ty = 8.3874
+ ; tz = 0.4228
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2416; y = -8.2422; z = 2.8181 }
+ , (* C5' *)
+ { x = 5.2050; y = -8.8128; z = 1.8901 }
+ , (* H5' *)
+ { x = 5.5368; y = -8.7738; z = 3.7227 }
+ , (* H5'' *)
+ { x = 6.3232; y = -7.2037; z = 2.6002 }
+ , (* C4' *)
+ { x = 7.3048; y = -7.6757; z = 2.5577 }
+ , (* H4' *)
+ { x = 6.0635; y = -6.5092; z = 1.3456 }
+ , (* O4' *)
+ { x = 6.4697; y = -5.1547; z = 1.4629 }
+ , (* C1' *)
+ { x = 7.2354; y = -5.0043; z = 0.7018 }
+ , (* H1' *)
+ { x = 7.0856; y = -4.9610; z = 2.8521 }
+ , (* C2' *)
+ { x = 6.7777; y = -3.9935; z = 3.2487 }
+ , (* H2'' *)
+ { x = 8.4627; y = -5.1992; z = 2.7423 }
+ , (* O2' *)
+ { x = 8.8693; y = -4.8638; z = 1.9399 }
+ , (* H2' *)
+ { x = 6.3877; y = -6.0809; z = 3.6362 }
+ , (* C3' *)
+ { x = 5.3770; y = -5.7562; z = 3.8834 }
+ , (* H3' *)
+ { x = 7.1024; y = -6.4754; z = 4.7985 }
+ , (* O3' *)
+ { x = 5.2764; y = -4.2883; z = 1.2538 }
+ , (* N1 *)
+ { x = 4.3777; y = -2.2062; z = 0.7229 }
+ , (* N3 *)
+ { x = 5.5069; y = -2.9779; z = 0.9088 }
+ , (* C2 *)
+ { x = 3.0693; y = -2.6246; z = 0.8500 }
+ , (* C4 *)
+ { x = 2.9279; y = -4.0146; z = 1.2149 }
+ , (* C5 *)
+ { x = 4.0101; y = -4.7892; z = 1.4017 }
+ , (* C6 *)
+ C
+ ( { x = 2.1040; y = -1.7437; z = 0.6331 }
+ , (* N4 *)
+ { x = 6.6267; y = -2.5166; z = 0.7728 }
+ , (* O2 *)
+ { x = 1.1496; y = -2.0600; z = 0.7287 }
+ , (* H41 *)
+ { x = 2.3303; y = -0.7921; z = 0.3815 }
+ , (* H42 *)
+ { x = 1.9353; y = -4.4465; z = 1.3419 }
+ , (* H5 *)
+ { x = 3.8895; y = -5.8371; z = 1.6762 } ) )
+
+(* H6 *)
+
+let rC02 =
+ N
+ ( { a = 0.5141
+ ; b = 0.0246
+ ; c = 0.8574
+ ; (* dgf_base_tfo *)
+ d = -0.5547
+ ; e = -0.7529
+ ; f = 0.3542
+ ; g = 0.6542
+ ; h = -0.6577
+ ; i = -0.3734
+ ; tx = -9.1111
+ ; ty = -3.4598
+ ; tz = -3.2939
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 4.3825; y = -6.6585; z = 4.0489 }
+ , (* C5' *)
+ { x = 4.6841; y = -7.2019; z = 4.9443 }
+ , (* H5' *)
+ { x = 3.6189; y = -5.8889; z = 4.1625 }
+ , (* H5'' *)
+ { x = 5.6255; y = -5.9175; z = 3.5998 }
+ , (* C4' *)
+ { x = 5.8732; y = -5.1228; z = 4.3034 }
+ , (* H4' *)
+ { x = 6.7337; y = -6.8605; z = 3.5222 }
+ , (* O4' *)
+ { x = 7.5932; y = -6.4923; z = 2.4548 }
+ , (* C1' *)
+ { x = 8.5661; y = -6.2983; z = 2.9064 }
+ , (* H1' *)
+ { x = 7.0527; y = -5.2012; z = 1.8322 }
+ , (* C2' *)
+ { x = 7.1627; y = -5.2525; z = 0.7490 }
+ , (* H2'' *)
+ { x = 7.6666; y = -4.1249; z = 2.4880 }
+ , (* O2' *)
+ { x = 8.5944; y = -4.2543; z = 2.6981 }
+ , (* H2' *)
+ { x = 5.5661; y = -5.3029; z = 2.2009 }
+ , (* C3' *)
+ { x = 5.0841; y = -6.0018; z = 1.5172 }
+ , (* H3' *)
+ { x = 4.9062; y = -4.0452; z = 2.2042 }
+ , (* O3' *)
+ { x = 7.6298; y = -7.6136; z = 1.4752 }
+ , (* N1 *)
+ { x = 8.6945; y = -8.7046; z = -0.2857 }
+ , (* N3 *)
+ { x = 8.6943; y = -7.6514; z = 0.6066 }
+ , (* C2 *)
+ { x = 7.7426; y = -9.6987; z = -0.3801 }
+ , (* C4 *)
+ { x = 6.6642; y = -9.5742; z = 0.5722 }
+ , (* C5 *)
+ { x = 6.6391; y = -8.5592; z = 1.4526 }
+ , (* C6 *)
+ C
+ ( { x = 7.9033; y = -10.6371; z = -1.3010 }
+ , (* N4 *)
+ { x = 9.5840; y = -6.8186; z = 0.6136 }
+ , (* O2 *)
+ { x = 7.2009; y = -11.3604; z = -1.3619 }
+ , (* H41 *)
+ { x = 8.7058; y = -10.6168; z = -1.9140 }
+ , (* H42 *)
+ { x = 5.8585; y = -10.3083; z = 0.5822 }
+ , (* H5 *)
+ { x = 5.8197; y = -8.4773; z = 2.1667 } ) )
+
+(* H6 *)
+
+let rC03 =
+ N
+ ( { a = -0.4993
+ ; b = 0.0476
+ ; c = 0.8651
+ ; (* dgf_base_tfo *)
+ d = 0.8078
+ ; e = -0.3353
+ ; f = 0.4847
+ ; g = 0.3132
+ ; h = 0.9409
+ ; i = 0.1290
+ ; tx = 6.2989
+ ; ty = -5.2303
+ ; tz = -3.8577
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 3.9938; y = -6.7042; z = 1.9023 }
+ , (* C5' *)
+ { x = 3.2332; y = -5.9343; z = 2.0319 }
+ , (* H5' *)
+ { x = 3.9666; y = -7.2863; z = 0.9812 }
+ , (* H5'' *)
+ { x = 5.3098; y = -5.9546; z = 1.8564 }
+ , (* C4' *)
+ { x = 5.3863; y = -5.3702; z = 0.9395 }
+ , (* H4' *)
+ { x = 5.3851; y = -5.0642; z = 3.0076 }
+ , (* O4' *)
+ { x = 6.7315; y = -4.9724; z = 3.4462 }
+ , (* C1' *)
+ { x = 7.0033; y = -3.9202; z = 3.3619 }
+ , (* H1' *)
+ { x = 7.5997; y = -5.8018; z = 2.4948 }
+ , (* C2' *)
+ { x = 8.3627; y = -6.3254; z = 3.0707 }
+ , (* H2'' *)
+ { x = 8.0410; y = -4.9501; z = 1.4724 }
+ , (* O2' *)
+ { x = 8.2781; y = -4.0644; z = 1.7570 }
+ , (* H2' *)
+ { x = 6.5701; y = -6.8129; z = 1.9714 }
+ , (* C3' *)
+ { x = 6.4186; y = -7.5809; z = 2.7299 }
+ , (* H3' *)
+ { x = 6.9357; y = -7.3841; z = 0.7235 }
+ , (* O3' *)
+ { x = 6.8024; y = -5.4718; z = 4.8475 }
+ , (* N1 *)
+ { x = 7.9218; y = -5.5700; z = 6.8877 }
+ , (* N3 *)
+ { x = 7.8908; y = -5.0886; z = 5.5944 }
+ , (* C2 *)
+ { x = 6.9789; y = -6.3827; z = 7.4823 }
+ , (* C4 *)
+ { x = 5.8742; y = -6.7319; z = 6.6202 }
+ , (* C5 *)
+ { x = 5.8182; y = -6.2769; z = 5.3570 }
+ , (* C6 *)
+ C
+ ( { x = 7.1702; y = -6.7511; z = 8.7402 }
+ , (* N4 *)
+ { x = 8.7747; y = -4.3728; z = 5.1568 }
+ , (* O2 *)
+ { x = 6.4741; y = -7.3461; z = 9.1662 }
+ , (* H41 *)
+ { x = 7.9889; y = -6.4396; z = 9.2429 }
+ , (* H42 *)
+ { x = 5.0736; y = -7.3713; z = 6.9922 }
+ , (* H5 *)
+ { x = 4.9784; y = -6.5473; z = 4.7170 } ) )
+
+(* H6 *)
+
+let rC04 =
+ N
+ ( { a = -0.5669
+ ; b = -0.8012
+ ; c = 0.1918
+ ; (* dgf_base_tfo *)
+ d = -0.8129
+ ; e = 0.5817
+ ; f = 0.0273
+ ; g = -0.1334
+ ; h = -0.1404
+ ; i = -0.9811
+ ; tx = -0.3279
+ ; ty = 8.3874
+ ; tz = 0.3355
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2416; y = -8.2422; z = 2.8181 }
+ , (* C5' *)
+ { x = 5.2050; y = -8.8128; z = 1.8901 }
+ , (* H5' *)
+ { x = 5.5368; y = -8.7738; z = 3.7227 }
+ , (* H5'' *)
+ { x = 6.3232; y = -7.2037; z = 2.6002 }
+ , (* C4' *)
+ { x = 7.3048; y = -7.6757; z = 2.5577 }
+ , (* H4' *)
+ { x = 6.0635; y = -6.5092; z = 1.3456 }
+ , (* O4' *)
+ { x = 6.4697; y = -5.1547; z = 1.4629 }
+ , (* C1' *)
+ { x = 7.2354; y = -5.0043; z = 0.7018 }
+ , (* H1' *)
+ { x = 7.0856; y = -4.9610; z = 2.8521 }
+ , (* C2' *)
+ { x = 6.7777; y = -3.9935; z = 3.2487 }
+ , (* H2'' *)
+ { x = 8.4627; y = -5.1992; z = 2.7423 }
+ , (* O2' *)
+ { x = 8.8693; y = -4.8638; z = 1.9399 }
+ , (* H2' *)
+ { x = 6.3877; y = -6.0809; z = 3.6362 }
+ , (* C3' *)
+ { x = 5.3770; y = -5.7562; z = 3.8834 }
+ , (* H3' *)
+ { x = 7.1024; y = -6.4754; z = 4.7985 }
+ , (* O3' *)
+ { x = 5.2764; y = -4.2883; z = 1.2538 }
+ , (* N1 *)
+ { x = 3.8961; y = -3.0896; z = -0.1893 }
+ , (* N3 *)
+ { x = 5.0095; y = -3.8907; z = -0.0346 }
+ , (* C2 *)
+ { x = 3.0480; y = -2.6632; z = 0.8116 }
+ , (* C4 *)
+ { x = 3.4093; y = -3.1310; z = 2.1292 }
+ , (* C5 *)
+ { x = 4.4878; y = -3.9124; z = 2.3088 }
+ , (* C6 *)
+ C
+ ( { x = 2.0216; y = -1.8941; z = 0.4804 }
+ , (* N4 *)
+ { x = 5.7005; y = -4.2164; z = -0.9842 }
+ , (* O2 *)
+ { x = 1.4067; y = -1.5873; z = 1.2205 }
+ , (* H41 *)
+ { x = 1.8721; y = -1.6319; z = -0.4835 }
+ , (* H42 *)
+ { x = 2.8048; y = -2.8507; z = 2.9918 }
+ , (* H5 *)
+ { x = 4.7491; y = -4.2593; z = 3.3085 } ) )
+
+(* H6 *)
+
+let rC05 =
+ N
+ ( { a = -0.6298
+ ; b = 0.0246
+ ; c = 0.7763
+ ; (* dgf_base_tfo *)
+ d = -0.5226
+ ; e = -0.7529
+ ; f = -0.4001
+ ; g = 0.5746
+ ; h = -0.6577
+ ; i = 0.4870
+ ; tx = -0.0208
+ ; ty = -3.4598
+ ; tz = -9.6882
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 4.3825; y = -6.6585; z = 4.0489 }
+ , (* C5' *)
+ { x = 4.6841; y = -7.2019; z = 4.9443 }
+ , (* H5' *)
+ { x = 3.6189; y = -5.8889; z = 4.1625 }
+ , (* H5'' *)
+ { x = 5.6255; y = -5.9175; z = 3.5998 }
+ , (* C4' *)
+ { x = 5.8732; y = -5.1228; z = 4.3034 }
+ , (* H4' *)
+ { x = 6.7337; y = -6.8605; z = 3.5222 }
+ , (* O4' *)
+ { x = 7.5932; y = -6.4923; z = 2.4548 }
+ , (* C1' *)
+ { x = 8.5661; y = -6.2983; z = 2.9064 }
+ , (* H1' *)
+ { x = 7.0527; y = -5.2012; z = 1.8322 }
+ , (* C2' *)
+ { x = 7.1627; y = -5.2525; z = 0.7490 }
+ , (* H2'' *)
+ { x = 7.6666; y = -4.1249; z = 2.4880 }
+ , (* O2' *)
+ { x = 8.5944; y = -4.2543; z = 2.6981 }
+ , (* H2' *)
+ { x = 5.5661; y = -5.3029; z = 2.2009 }
+ , (* C3' *)
+ { x = 5.0841; y = -6.0018; z = 1.5172 }
+ , (* H3' *)
+ { x = 4.9062; y = -4.0452; z = 2.2042 }
+ , (* O3' *)
+ { x = 7.6298; y = -7.6136; z = 1.4752 }
+ , (* N1 *)
+ { x = 8.5977; y = -9.5977; z = 0.7329 }
+ , (* N3 *)
+ { x = 8.5951; y = -8.5745; z = 1.6594 }
+ , (* C2 *)
+ { x = 7.7372; y = -9.7371; z = -0.3364 }
+ , (* C4 *)
+ { x = 6.7596; y = -8.6801; z = -0.4476 }
+ , (* C5 *)
+ { x = 6.7338; y = -7.6721; z = 0.4408 }
+ , (* C6 *)
+ C
+ ( { x = 7.8849; y = -10.7881; z = -1.1289 }
+ , (* N4 *)
+ { x = 9.3993; y = -8.5377; z = 2.5743 }
+ , (* O2 *)
+ { x = 7.2499; y = -10.8809; z = -1.9088 }
+ , (* H41 *)
+ { x = 8.6122; y = -11.4649; z = -0.9468 }
+ , (* H42 *)
+ { x = 6.0317; y = -8.6941; z = -1.2588 }
+ , (* H5 *)
+ { x = 5.9901; y = -6.8809; z = 0.3459 } ) )
+
+(* H6 *)
+
+let rC06 =
+ N
+ ( { a = -0.9837
+ ; b = 0.0476
+ ; c = -0.1733
+ ; (* dgf_base_tfo *)
+ d = -0.1792
+ ; e = -0.3353
+ ; f = 0.9249
+ ; g = -0.0141
+ ; h = 0.9409
+ ; i = 0.3384
+ ; tx = 5.7793
+ ; ty = -5.2303
+ ; tz = 4.5997
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 3.9938; y = -6.7042; z = 1.9023 }
+ , (* C5' *)
+ { x = 3.2332; y = -5.9343; z = 2.0319 }
+ , (* H5' *)
+ { x = 3.9666; y = -7.2863; z = 0.9812 }
+ , (* H5'' *)
+ { x = 5.3098; y = -5.9546; z = 1.8564 }
+ , (* C4' *)
+ { x = 5.3863; y = -5.3702; z = 0.9395 }
+ , (* H4' *)
+ { x = 5.3851; y = -5.0642; z = 3.0076 }
+ , (* O4' *)
+ { x = 6.7315; y = -4.9724; z = 3.4462 }
+ , (* C1' *)
+ { x = 7.0033; y = -3.9202; z = 3.3619 }
+ , (* H1' *)
+ { x = 7.5997; y = -5.8018; z = 2.4948 }
+ , (* C2' *)
+ { x = 8.3627; y = -6.3254; z = 3.0707 }
+ , (* H2'' *)
+ { x = 8.0410; y = -4.9501; z = 1.4724 }
+ , (* O2' *)
+ { x = 8.2781; y = -4.0644; z = 1.7570 }
+ , (* H2' *)
+ { x = 6.5701; y = -6.8129; z = 1.9714 }
+ , (* C3' *)
+ { x = 6.4186; y = -7.5809; z = 2.7299 }
+ , (* H3' *)
+ { x = 6.9357; y = -7.3841; z = 0.7235 }
+ , (* O3' *)
+ { x = 6.8024; y = -5.4718; z = 4.8475 }
+ , (* N1 *)
+ { x = 6.6920; y = -5.0495; z = 7.1354 }
+ , (* N3 *)
+ { x = 6.6201; y = -4.5500; z = 5.8506 }
+ , (* C2 *)
+ { x = 6.9254; y = -6.3614; z = 7.4926 }
+ , (* C4 *)
+ { x = 7.1046; y = -7.2543; z = 6.3718 }
+ , (* C5 *)
+ { x = 7.0391; y = -6.7951; z = 5.1106 }
+ , (* C6 *)
+ C
+ ( { x = 6.9614; y = -6.6648; z = 8.7815 }
+ , (* N4 *)
+ { x = 6.4083; y = -3.3696; z = 5.6340 }
+ , (* O2 *)
+ { x = 7.1329; y = -7.6280; z = 9.0324 }
+ , (* H41 *)
+ { x = 6.8204; y = -5.9469; z = 9.4777 }
+ , (* H42 *)
+ { x = 7.2954; y = -8.3135; z = 6.5440 }
+ , (* H5 *)
+ { x = 7.1753; y = -7.4798; z = 4.2735 } ) )
+
+(* H6 *)
+
+let rC07 =
+ N
+ ( { a = 0.0033
+ ; b = 0.2720
+ ; c = -0.9623
+ ; (* dgf_base_tfo *)
+ d = 0.3013
+ ; e = -0.9179
+ ; f = -0.2584
+ ; g = -0.9535
+ ; h = -0.2891
+ ; i = -0.0850
+ ; tx = 43.0403
+ ; ty = 13.7233
+ ; tz = 34.5710
+ }
+ , { a = 0.9187
+ ; b = 0.2887
+ ; c = 0.2694
+ ; (* P_O3'_275_tfo *)
+ d = 0.0302
+ ; e = -0.7316
+ ; f = 0.6811
+ ; g = 0.3938
+ ; h = -0.6176
+ ; i = -0.6808
+ ; tx = -48.4330
+ ; ty = 26.3254
+ ; tz = 13.6383
+ }
+ , { a = -0.1504
+ ; b = 0.7744
+ ; c = -0.6145
+ ; (* P_O3'_180_tfo *)
+ d = 0.7581
+ ; e = 0.4893
+ ; f = 0.4311
+ ; g = 0.6345
+ ; h = -0.4010
+ ; i = -0.6607
+ ; tx = -31.9784
+ ; ty = -13.4285
+ ; tz = 44.9650
+ }
+ , { a = -0.6236
+ ; b = -0.7810
+ ; c = -0.0337
+ ; (* P_O3'_60_tfo *)
+ d = -0.6890
+ ; e = 0.5694
+ ; f = -0.4484
+ ; g = 0.3694
+ ; h = -0.2564
+ ; i = -0.8932
+ ; tx = 12.1105
+ ; ty = 30.8774
+ ; tz = 46.0946
+ }
+ , { x = 33.3400; y = 11.0980; z = 46.1750 }
+ , (* P *)
+ { x = 34.5130; y = 10.2320; z = 46.4660 }
+ , (* O1P *)
+ { x = 33.4130; y = 12.3960; z = 46.9340 }
+ , (* O2P *)
+ { x = 31.9810; y = 10.3390; z = 46.4820 }
+ , (* O5' *)
+ { x = 30.8152; y = 11.1619; z = 46.2003 }
+ , (* C5' *)
+ { x = 30.4519; y = 10.9454; z = 45.1957 }
+ , (* H5' *)
+ { x = 31.0379; y = 12.2016; z = 46.4400 }
+ , (* H5'' *)
+ { x = 29.7081; y = 10.7448; z = 47.1428 }
+ , (* C4' *)
+ { x = 28.8710; y = 11.4416; z = 47.0982 }
+ , (* H4' *)
+ { x = 29.2550; y = 9.4394; z = 46.8162 }
+ , (* O4' *)
+ { x = 29.3907; y = 8.5625; z = 47.9460 }
+ , (* C1' *)
+ { x = 28.4416; y = 8.5669; z = 48.4819 }
+ , (* H1' *)
+ { x = 30.4468; y = 9.2031; z = 48.7952 }
+ , (* C2' *)
+ { x = 31.4222; y = 8.9651; z = 48.3709 }
+ , (* H2'' *)
+ { x = 30.3701; y = 8.9157; z = 50.1624 }
+ , (* O2' *)
+ { x = 30.0652; y = 8.0304; z = 50.3740 }
+ , (* H2' *)
+ { x = 30.1622; y = 10.6879; z = 48.6120 }
+ , (* C3' *)
+ { x = 31.0952; y = 11.2399; z = 48.7254 }
+ , (* H3' *)
+ { x = 29.1076; y = 11.1535; z = 49.4702 }
+ , (* O3' *)
+ { x = 29.7883; y = 7.2209; z = 47.5235 }
+ , (* N1 *)
+ { x = 29.1825; y = 5.0438; z = 46.8275 }
+ , (* N3 *)
+ { x = 28.8008; y = 6.2912; z = 47.2263 }
+ , (* C2 *)
+ { x = 30.4888; y = 4.6890; z = 46.7186 }
+ , (* C4 *)
+ { x = 31.5034; y = 5.6405; z = 47.0249 }
+ , (* C5 *)
+ { x = 31.1091; y = 6.8691; z = 47.4156 }
+ , (* C6 *)
+ C
+ ( { x = 30.8109; y = 3.4584; z = 46.3336 }
+ , (* N4 *)
+ { x = 27.6171; y = 6.5989; z = 47.3189 }
+ , (* O2 *)
+ { x = 31.7923; y = 3.2301; z = 46.2638 }
+ , (* H41 *)
+ { x = 30.0880; y = 2.7857; z = 46.1215 }
+ , (* H42 *)
+ { x = 32.5542; y = 5.3634; z = 46.9395 }
+ , (* H5 *)
+ { x = 31.8523; y = 7.6279; z = 47.6603 } ) )
+
+(* H6 *)
+
+let rC08 =
+ N
+ ( { a = 0.0797
+ ; b = -0.6026
+ ; c = -0.7941
+ ; (* dgf_base_tfo *)
+ d = 0.7939
+ ; e = 0.5201
+ ; f = -0.3150
+ ; g = 0.6028
+ ; h = -0.6054
+ ; i = 0.5198
+ ; tx = -36.8341
+ ; ty = 41.5293
+ ; tz = 1.6628
+ }
+ , { a = 0.9187
+ ; b = 0.2887
+ ; c = 0.2694
+ ; (* P_O3'_275_tfo *)
+ d = 0.0302
+ ; e = -0.7316
+ ; f = 0.6811
+ ; g = 0.3938
+ ; h = -0.6176
+ ; i = -0.6808
+ ; tx = -48.4330
+ ; ty = 26.3254
+ ; tz = 13.6383
+ }
+ , { a = -0.1504
+ ; b = 0.7744
+ ; c = -0.6145
+ ; (* P_O3'_180_tfo *)
+ d = 0.7581
+ ; e = 0.4893
+ ; f = 0.4311
+ ; g = 0.6345
+ ; h = -0.4010
+ ; i = -0.6607
+ ; tx = -31.9784
+ ; ty = -13.4285
+ ; tz = 44.9650
+ }
+ , { a = -0.6236
+ ; b = -0.7810
+ ; c = -0.0337
+ ; (* P_O3'_60_tfo *)
+ d = -0.6890
+ ; e = 0.5694
+ ; f = -0.4484
+ ; g = 0.3694
+ ; h = -0.2564
+ ; i = -0.8932
+ ; tx = 12.1105
+ ; ty = 30.8774
+ ; tz = 46.0946
+ }
+ , { x = 33.3400; y = 11.0980; z = 46.1750 }
+ , (* P *)
+ { x = 34.5130; y = 10.2320; z = 46.4660 }
+ , (* O1P *)
+ { x = 33.4130; y = 12.3960; z = 46.9340 }
+ , (* O2P *)
+ { x = 31.9810; y = 10.3390; z = 46.4820 }
+ , (* O5' *)
+ { x = 31.8779; y = 9.9369; z = 47.8760 }
+ , (* C5' *)
+ { x = 31.3239; y = 10.6931; z = 48.4322 }
+ , (* H5' *)
+ { x = 32.8647; y = 9.6624; z = 48.2489 }
+ , (* H5'' *)
+ { x = 31.0429; y = 8.6773; z = 47.9401 }
+ , (* C4' *)
+ { x = 31.0779; y = 8.2331; z = 48.9349 }
+ , (* H4' *)
+ { x = 29.6956; y = 8.9669; z = 47.5983 }
+ , (* O4' *)
+ { x = 29.2784; y = 8.1700; z = 46.4782 }
+ , (* C1' *)
+ { x = 28.8006; y = 7.2731; z = 46.8722 }
+ , (* H1' *)
+ { x = 30.5544; y = 7.7940; z = 45.7875 }
+ , (* C2' *)
+ { x = 30.8837; y = 8.6410; z = 45.1856 }
+ , (* H2'' *)
+ { x = 30.5100; y = 6.6007; z = 45.0582 }
+ , (* O2' *)
+ { x = 29.6694; y = 6.4168; z = 44.6326 }
+ , (* H2' *)
+ { x = 31.5146; y = 7.5954; z = 46.9527 }
+ , (* C3' *)
+ { x = 32.5255; y = 7.8261; z = 46.6166 }
+ , (* H3' *)
+ { x = 31.3876; y = 6.2951; z = 47.5516 }
+ , (* O3' *)
+ { x = 28.3976; y = 8.9302; z = 45.5933 }
+ , (* N1 *)
+ { x = 26.2155; y = 9.6135; z = 44.9910 }
+ , (* N3 *)
+ { x = 27.0281; y = 8.8961; z = 45.8192 }
+ , (* C2 *)
+ { x = 26.7044; y = 10.3489; z = 43.9595 }
+ , (* C4 *)
+ { x = 28.1088; y = 10.3837; z = 43.7247 }
+ , (* C5 *)
+ { x = 28.8978; y = 9.6708; z = 44.5535 }
+ , (* C6 *)
+ C
+ ( { x = 25.8715; y = 11.0249; z = 43.1749 }
+ , (* N4 *)
+ { x = 26.5733; y = 8.2371; z = 46.7484 }
+ , (* O2 *)
+ { x = 26.2707; y = 11.5609; z = 42.4177 }
+ , (* H41 *)
+ { x = 24.8760; y = 10.9939; z = 43.3427 }
+ , (* H42 *)
+ { x = 28.5089; y = 10.9722; z = 42.8990 }
+ , (* H5 *)
+ { x = 29.9782; y = 9.6687; z = 44.4097 } ) )
+
+(* H6 *)
+
+let rC09 =
+ N
+ ( { a = 0.8727
+ ; b = 0.4760
+ ; c = -0.1091
+ ; (* dgf_base_tfo *)
+ d = -0.4188
+ ; e = 0.6148
+ ; f = -0.6682
+ ; g = -0.2510
+ ; h = 0.6289
+ ; i = 0.7359
+ ; tx = -8.1687
+ ; ty = -52.0761
+ ; tz = -25.0726
+ }
+ , { a = 0.9187
+ ; b = 0.2887
+ ; c = 0.2694
+ ; (* P_O3'_275_tfo *)
+ d = 0.0302
+ ; e = -0.7316
+ ; f = 0.6811
+ ; g = 0.3938
+ ; h = -0.6176
+ ; i = -0.6808
+ ; tx = -48.4330
+ ; ty = 26.3254
+ ; tz = 13.6383
+ }
+ , { a = -0.1504
+ ; b = 0.7744
+ ; c = -0.6145
+ ; (* P_O3'_180_tfo *)
+ d = 0.7581
+ ; e = 0.4893
+ ; f = 0.4311
+ ; g = 0.6345
+ ; h = -0.4010
+ ; i = -0.6607
+ ; tx = -31.9784
+ ; ty = -13.4285
+ ; tz = 44.9650
+ }
+ , { a = -0.6236
+ ; b = -0.7810
+ ; c = -0.0337
+ ; (* P_O3'_60_tfo *)
+ d = -0.6890
+ ; e = 0.5694
+ ; f = -0.4484
+ ; g = 0.3694
+ ; h = -0.2564
+ ; i = -0.8932
+ ; tx = 12.1105
+ ; ty = 30.8774
+ ; tz = 46.0946
+ }
+ , { x = 33.3400; y = 11.0980; z = 46.1750 }
+ , (* P *)
+ { x = 34.5130; y = 10.2320; z = 46.4660 }
+ , (* O1P *)
+ { x = 33.4130; y = 12.3960; z = 46.9340 }
+ , (* O2P *)
+ { x = 31.9810; y = 10.3390; z = 46.4820 }
+ , (* O5' *)
+ { x = 30.8152; y = 11.1619; z = 46.2003 }
+ , (* C5' *)
+ { x = 30.4519; y = 10.9454; z = 45.1957 }
+ , (* H5' *)
+ { x = 31.0379; y = 12.2016; z = 46.4400 }
+ , (* H5'' *)
+ { x = 29.7081; y = 10.7448; z = 47.1428 }
+ , (* C4' *)
+ { x = 29.4506; y = 9.6945; z = 47.0059 }
+ , (* H4' *)
+ { x = 30.1045; y = 10.9634; z = 48.4885 }
+ , (* O4' *)
+ { x = 29.1794; y = 11.8418; z = 49.1490 }
+ , (* C1' *)
+ { x = 28.4388; y = 11.2210; z = 49.6533 }
+ , (* H1' *)
+ { x = 28.5211; y = 12.6008; z = 48.0367 }
+ , (* C2' *)
+ { x = 29.1947; y = 13.3949; z = 47.7147 }
+ , (* H2'' *)
+ { x = 27.2316; y = 13.0683; z = 48.3134 }
+ , (* O2' *)
+ { x = 27.0851; y = 13.3391; z = 49.2227 }
+ , (* H2' *)
+ { x = 28.4131; y = 11.5507; z = 46.9391 }
+ , (* C3' *)
+ { x = 28.4451; y = 12.0512; z = 45.9713 }
+ , (* H3' *)
+ { x = 27.2707; y = 10.6955; z = 47.1097 }
+ , (* O3' *)
+ { x = 29.8751; y = 12.7405; z = 50.0682 }
+ , (* N1 *)
+ { x = 30.7172; y = 13.1841; z = 52.2328 }
+ , (* N3 *)
+ { x = 30.0617; y = 12.3404; z = 51.3847 }
+ , (* C2 *)
+ { x = 31.1834; y = 14.3941; z = 51.8297 }
+ , (* C4 *)
+ { x = 30.9913; y = 14.8074; z = 50.4803 }
+ , (* C5 *)
+ { x = 30.3434; y = 13.9610; z = 49.6548 }
+ , (* C6 *)
+ C
+ ( { x = 31.8090; y = 15.1847; z = 52.6957 }
+ , (* N4 *)
+ { x = 29.6470; y = 11.2494; z = 51.7616 }
+ , (* O2 *)
+ { x = 32.1422; y = 16.0774; z = 52.3606 }
+ , (* H41 *)
+ { x = 31.9392; y = 14.8893; z = 53.6527 }
+ , (* H42 *)
+ { x = 31.3632; y = 15.7771; z = 50.1491 }
+ , (* H5 *)
+ { x = 30.1742; y = 14.2374; z = 48.6141 } ) )
+
+(* H6 *)
+
+let rC10 =
+ N
+ ( { a = 0.1549
+ ; b = 0.8710
+ ; c = -0.4663
+ ; (* dgf_base_tfo *)
+ d = 0.6768
+ ; e = -0.4374
+ ; f = -0.5921
+ ; g = -0.7197
+ ; h = -0.2239
+ ; i = -0.6572
+ ; tx = 25.2447
+ ; ty = -14.1920
+ ; tz = 50.3201
+ }
+ , { a = 0.9187
+ ; b = 0.2887
+ ; c = 0.2694
+ ; (* P_O3'_275_tfo *)
+ d = 0.0302
+ ; e = -0.7316
+ ; f = 0.6811
+ ; g = 0.3938
+ ; h = -0.6176
+ ; i = -0.6808
+ ; tx = -48.4330
+ ; ty = 26.3254
+ ; tz = 13.6383
+ }
+ , { a = -0.1504
+ ; b = 0.7744
+ ; c = -0.6145
+ ; (* P_O3'_180_tfo *)
+ d = 0.7581
+ ; e = 0.4893
+ ; f = 0.4311
+ ; g = 0.6345
+ ; h = -0.4010
+ ; i = -0.6607
+ ; tx = -31.9784
+ ; ty = -13.4285
+ ; tz = 44.9650
+ }
+ , { a = -0.6236
+ ; b = -0.7810
+ ; c = -0.0337
+ ; (* P_O3'_60_tfo *)
+ d = -0.6890
+ ; e = 0.5694
+ ; f = -0.4484
+ ; g = 0.3694
+ ; h = -0.2564
+ ; i = -0.8932
+ ; tx = 12.1105
+ ; ty = 30.8774
+ ; tz = 46.0946
+ }
+ , { x = 33.3400; y = 11.0980; z = 46.1750 }
+ , (* P *)
+ { x = 34.5130; y = 10.2320; z = 46.4660 }
+ , (* O1P *)
+ { x = 33.4130; y = 12.3960; z = 46.9340 }
+ , (* O2P *)
+ { x = 31.9810; y = 10.3390; z = 46.4820 }
+ , (* O5' *)
+ { x = 31.8779; y = 9.9369; z = 47.8760 }
+ , (* C5' *)
+ { x = 31.3239; y = 10.6931; z = 48.4322 }
+ , (* H5' *)
+ { x = 32.8647; y = 9.6624; z = 48.2489 }
+ , (* H5'' *)
+ { x = 31.0429; y = 8.6773; z = 47.9401 }
+ , (* C4' *)
+ { x = 30.0440; y = 8.8473; z = 47.5383 }
+ , (* H4' *)
+ { x = 31.6749; y = 7.6351; z = 47.2119 }
+ , (* O4' *)
+ { x = 31.9159; y = 6.5022; z = 48.0616 }
+ , (* C1' *)
+ { x = 31.0691; y = 5.8243; z = 47.9544 }
+ , (* H1' *)
+ { x = 31.9300; y = 7.0685; z = 49.4493 }
+ , (* C2' *)
+ { x = 32.9024; y = 7.5288; z = 49.6245 }
+ , (* H2'' *)
+ { x = 31.5672; y = 6.1750; z = 50.4632 }
+ , (* O2' *)
+ { x = 31.8416; y = 5.2663; z = 50.3200 }
+ , (* H2' *)
+ { x = 30.8618; y = 8.1514; z = 49.3749 }
+ , (* C3' *)
+ { x = 31.1122; y = 8.9396; z = 50.0850 }
+ , (* H3' *)
+ { x = 29.5351; y = 7.6245; z = 49.5409 }
+ , (* O3' *)
+ { x = 33.1890; y = 5.8629; z = 47.7343 }
+ , (* N1 *)
+ { x = 34.4004; y = 4.2636; z = 46.4828 }
+ , (* N3 *)
+ { x = 33.2062; y = 4.8497; z = 46.7851 }
+ , (* C2 *)
+ { x = 35.5600; y = 4.6374; z = 47.0822 }
+ , (* C4 *)
+ { x = 35.5444; y = 5.6751; z = 48.0577 }
+ , (* C5 *)
+ { x = 34.3565; y = 6.2450; z = 48.3432 }
+ , (* C6 *)
+ C
+ ( { x = 36.6977; y = 4.0305; z = 46.7598 }
+ , (* N4 *)
+ { x = 32.1661; y = 4.5034; z = 46.2348 }
+ , (* O2 *)
+ { x = 37.5405; y = 4.3347; z = 47.2259 }
+ , (* H41 *)
+ { x = 36.7033; y = 3.2923; z = 46.0706 }
+ , (* H42 *)
+ { x = 36.4713; y = 5.9811; z = 48.5428 }
+ , (* H5 *)
+ { x = 34.2986; y = 7.0426; z = 49.0839 } ) )
+
+(* H6 *)
+
+let rCs = [ rC01; rC02; rC03; rC04; rC05; rC06; rC07; rC08; rC09; rC10 ]
+
+let rG =
+ N
+ ( { a = -0.0018
+ ; b = -0.8207
+ ; c = 0.5714
+ ; (* dgf_base_tfo *)
+ d = 0.2679
+ ; e = -0.5509
+ ; f = -0.7904
+ ; g = 0.9634
+ ; h = 0.1517
+ ; i = 0.2209
+ ; tx = 0.0073
+ ; ty = 8.4030
+ ; tz = 0.6232
+ }
+ , { a = -0.8143
+ ; b = -0.5091
+ ; c = -0.2788
+ ; (* P_O3'_275_tfo *)
+ d = -0.0433
+ ; e = -0.4257
+ ; f = 0.9038
+ ; g = -0.5788
+ ; h = 0.7480
+ ; i = 0.3246
+ ; tx = 1.5227
+ ; ty = 6.9114
+ ; tz = -7.0765
+ }
+ , { a = 0.3822
+ ; b = -0.7477
+ ; c = 0.5430
+ ; (* P_O3'_180_tfo *)
+ d = 0.4552
+ ; e = 0.6637
+ ; f = 0.5935
+ ; g = -0.8042
+ ; h = 0.0203
+ ; i = 0.5941
+ ; tx = -6.9472
+ ; ty = -4.1186
+ ; tz = -5.9108
+ }
+ , { a = 0.5640
+ ; b = 0.8007
+ ; c = -0.2022
+ ; (* P_O3'_60_tfo *)
+ d = -0.8247
+ ; e = 0.5587
+ ; f = -0.0878
+ ; g = 0.0426
+ ; h = 0.2162
+ ; i = 0.9754
+ ; tx = 6.2694
+ ; ty = -7.0540
+ ; tz = 3.3316
+ }
+ , { x = 2.8930; y = 8.5380; z = -3.3280 }
+ , (* P *)
+ { x = 1.6980; y = 7.6960; z = -3.5570 }
+ , (* O1P *)
+ { x = 3.2260; y = 9.5010; z = -4.4020 }
+ , (* O2P *)
+ { x = 4.1590; y = 7.6040; z = -3.0340 }
+ , (* O5' *)
+ { x = 5.4550; y = 8.2120; z = -2.8810 }
+ , (* C5' *)
+ { x = 5.4546; y = 8.8508; z = -1.9978 }
+ , (* H5' *)
+ { x = 5.7588; y = 8.6625; z = -3.8259 }
+ , (* H5'' *)
+ { x = 6.4970; y = 7.1480; z = -2.5980 }
+ , (* C4' *)
+ { x = 7.4896; y = 7.5919; z = -2.5214 }
+ , (* H4' *)
+ { x = 6.1630; y = 6.4860; z = -1.3440 }
+ , (* O4' *)
+ { x = 6.5400; y = 5.1200; z = -1.4190 }
+ , (* C1' *)
+ { x = 7.2763; y = 4.9681; z = -0.6297 }
+ , (* H1' *)
+ { x = 7.1940; y = 4.8830; z = -2.7770 }
+ , (* C2' *)
+ { x = 6.8667; y = 3.9183; z = -3.1647 }
+ , (* H2'' *)
+ { x = 8.5860; y = 5.0910; z = -2.6140 }
+ , (* O2' *)
+ { x = 8.9510; y = 4.7626; z = -1.7890 }
+ , (* H2' *)
+ { x = 6.5720; y = 6.0040; z = -3.6090 }
+ , (* C3' *)
+ { x = 5.5636; y = 5.7066; z = -3.8966 }
+ , (* H3' *)
+ { x = 7.3801; y = 6.3562; z = -4.7350 }
+ , (* O3' *)
+ { x = 4.7150; y = 0.4910; z = -0.1360 }
+ , (* N1 *)
+ { x = 6.3490; y = 2.1730; z = -0.6020 }
+ , (* N3 *)
+ { x = 5.9530; y = 0.9650; z = -0.2670 }
+ , (* C2 *)
+ { x = 5.2900; y = 2.9790; z = -0.8260 }
+ , (* C4 *)
+ { x = 3.9720; y = 2.6390; z = -0.7330 }
+ , (* C5 *)
+ { x = 3.6770; y = 1.3160; z = -0.3660 }
+ , (* C6 *)
+ G
+ ( { x = 6.8426; y = 0.0056; z = -0.0019 }
+ , (* N2 *)
+ { x = 3.1660; y = 3.7290; z = -1.0360 }
+ , (* N7 *)
+ { x = 5.3170; y = 4.2990; z = -1.1930 }
+ , (* N9 *)
+ { x = 4.0100; y = 4.6780; z = -1.2990 }
+ , (* C8 *)
+ { x = 2.4280; y = 0.8450; z = -0.2360 }
+ , (* O6 *)
+ { x = 4.6151; y = -0.4677; z = 0.1305 }
+ , (* H1 *)
+ { x = 6.6463; y = -0.9463; z = 0.2729 }
+ , (* H21 *)
+ { x = 7.8170; y = 0.2642; z = -0.0640 }
+ , (* H22 *)
+ { x = 3.4421; y = 5.5744; z = -1.5482 } ) )
+
+(* H8 *)
+
+
+(* H8 *)
+
+(* H8 *)
+
+let rU =
+ N
+ ( { a = -0.0359
+ ; b = -0.8071
+ ; c = 0.5894
+ ; (* dgf_base_tfo *)
+ d = -0.2669
+ ; e = 0.5761
+ ; f = 0.7726
+ ; g = -0.9631
+ ; h = -0.1296
+ ; i = -0.2361
+ ; tx = 0.1584
+ ; ty = 8.3434
+ ; tz = 0.5434
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2430; y = -8.2420; z = 2.8260 }
+ , (* C5' *)
+ { x = 5.1974; y = -8.8497; z = 1.9223 }
+ , (* H5' *)
+ { x = 5.5548; y = -8.7348; z = 3.7469 }
+ , (* H5'' *)
+ { x = 6.3140; y = -7.2060; z = 2.5510 }
+ , (* C4' *)
+ { x = 7.2954; y = -7.6762; z = 2.4898 }
+ , (* H4' *)
+ { x = 6.0140; y = -6.5420; z = 1.2890 }
+ , (* O4' *)
+ { x = 6.4190; y = -5.1840; z = 1.3620 }
+ , (* C1' *)
+ { x = 7.1608; y = -5.0495; z = 0.5747 }
+ , (* H1' *)
+ { x = 7.0760; y = -4.9560; z = 2.7270 }
+ , (* C2' *)
+ { x = 6.7770; y = -3.9803; z = 3.1099 }
+ , (* H2'' *)
+ { x = 8.4500; y = -5.1930; z = 2.5810 }
+ , (* O2' *)
+ { x = 8.8309; y = -4.8755; z = 1.7590 }
+ , (* H2' *)
+ { x = 6.4060; y = -6.0590; z = 3.5580 }
+ , (* C3' *)
+ { x = 5.4021; y = -5.7313; z = 3.8281 }
+ , (* H3' *)
+ { x = 7.1570; y = -6.4240; z = 4.7070 }
+ , (* O3' *)
+ { x = 5.2170; y = -4.3260; z = 1.1690 }
+ , (* N1 *)
+ { x = 4.2960; y = -2.2560; z = 0.6290 }
+ , (* N3 *)
+ { x = 5.4330; y = -3.0200; z = 0.7990 }
+ , (* C2 *)
+ { x = 2.9930; y = -2.6780; z = 0.7940 }
+ , (* C4 *)
+ { x = 2.8670; y = -4.0630; z = 1.1830 }
+ , (* C5 *)
+ { x = 3.9570; y = -4.8300; z = 1.3550 }
+ , (* C6 *)
+ U
+ ( { x = 6.5470; y = -2.5560; z = 0.6290 }
+ , (* O2 *)
+ { x = 2.0540; y = -1.9000; z = 0.6130 }
+ , (* O4 *)
+ { x = 4.4300; y = -1.3020; z = 0.3600 }
+ , (* H3 *)
+ { x = 1.9590; y = -4.4570; z = 1.3250 }
+ , (* H5 *)
+ { x = 3.8460; y = -5.7860; z = 1.6240 } ) )
+
+(* H6 *)
+
+let rU01 =
+ N
+ ( { a = -0.0137
+ ; b = -0.8012
+ ; c = 0.5983
+ ; (* dgf_base_tfo *)
+ d = -0.2523
+ ; e = 0.5817
+ ; f = 0.7733
+ ; g = -0.9675
+ ; h = -0.1404
+ ; i = -0.2101
+ ; tx = 0.2031
+ ; ty = 8.3874
+ ; tz = 0.4228
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2416; y = -8.2422; z = 2.8181 }
+ , (* C5' *)
+ { x = 5.2050; y = -8.8128; z = 1.8901 }
+ , (* H5' *)
+ { x = 5.5368; y = -8.7738; z = 3.7227 }
+ , (* H5'' *)
+ { x = 6.3232; y = -7.2037; z = 2.6002 }
+ , (* C4' *)
+ { x = 7.3048; y = -7.6757; z = 2.5577 }
+ , (* H4' *)
+ { x = 6.0635; y = -6.5092; z = 1.3456 }
+ , (* O4' *)
+ { x = 6.4697; y = -5.1547; z = 1.4629 }
+ , (* C1' *)
+ { x = 7.2354; y = -5.0043; z = 0.7018 }
+ , (* H1' *)
+ { x = 7.0856; y = -4.9610; z = 2.8521 }
+ , (* C2' *)
+ { x = 6.7777; y = -3.9935; z = 3.2487 }
+ , (* H2'' *)
+ { x = 8.4627; y = -5.1992; z = 2.7423 }
+ , (* O2' *)
+ { x = 8.8693; y = -4.8638; z = 1.9399 }
+ , (* H2' *)
+ { x = 6.3877; y = -6.0809; z = 3.6362 }
+ , (* C3' *)
+ { x = 5.3770; y = -5.7562; z = 3.8834 }
+ , (* H3' *)
+ { x = 7.1024; y = -6.4754; z = 4.7985 }
+ , (* O3' *)
+ { x = 5.2764; y = -4.2883; z = 1.2538 }
+ , (* N1 *)
+ { x = 4.3777; y = -2.2062; z = 0.7229 }
+ , (* N3 *)
+ { x = 5.5069; y = -2.9779; z = 0.9088 }
+ , (* C2 *)
+ { x = 3.0693; y = -2.6246; z = 0.8500 }
+ , (* C4 *)
+ { x = 2.9279; y = -4.0146; z = 1.2149 }
+ , (* C5 *)
+ { x = 4.0101; y = -4.7892; z = 1.4017 }
+ , (* C6 *)
+ U
+ ( { x = 6.6267; y = -2.5166; z = 0.7728 }
+ , (* O2 *)
+ { x = 2.1383; y = -1.8396; z = 0.6581 }
+ , (* O4 *)
+ { x = 4.5223; y = -1.2489; z = 0.4716 }
+ , (* H3 *)
+ { x = 2.0151; y = -4.4065; z = 1.3290 }
+ , (* H5 *)
+ { x = 3.8886; y = -5.7486; z = 1.6535 } ) )
+
+(* H6 *)
+
+let rU02 =
+ N
+ ( { a = 0.5141
+ ; b = 0.0246
+ ; c = 0.8574
+ ; (* dgf_base_tfo *)
+ d = -0.5547
+ ; e = -0.7529
+ ; f = 0.3542
+ ; g = 0.6542
+ ; h = -0.6577
+ ; i = -0.3734
+ ; tx = -9.1111
+ ; ty = -3.4598
+ ; tz = -3.2939
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 4.3825; y = -6.6585; z = 4.0489 }
+ , (* C5' *)
+ { x = 4.6841; y = -7.2019; z = 4.9443 }
+ , (* H5' *)
+ { x = 3.6189; y = -5.8889; z = 4.1625 }
+ , (* H5'' *)
+ { x = 5.6255; y = -5.9175; z = 3.5998 }
+ , (* C4' *)
+ { x = 5.8732; y = -5.1228; z = 4.3034 }
+ , (* H4' *)
+ { x = 6.7337; y = -6.8605; z = 3.5222 }
+ , (* O4' *)
+ { x = 7.5932; y = -6.4923; z = 2.4548 }
+ , (* C1' *)
+ { x = 8.5661; y = -6.2983; z = 2.9064 }
+ , (* H1' *)
+ { x = 7.0527; y = -5.2012; z = 1.8322 }
+ , (* C2' *)
+ { x = 7.1627; y = -5.2525; z = 0.7490 }
+ , (* H2'' *)
+ { x = 7.6666; y = -4.1249; z = 2.4880 }
+ , (* O2' *)
+ { x = 8.5944; y = -4.2543; z = 2.6981 }
+ , (* H2' *)
+ { x = 5.5661; y = -5.3029; z = 2.2009 }
+ , (* C3' *)
+ { x = 5.0841; y = -6.0018; z = 1.5172 }
+ , (* H3' *)
+ { x = 4.9062; y = -4.0452; z = 2.2042 }
+ , (* O3' *)
+ { x = 7.6298; y = -7.6136; z = 1.4752 }
+ , (* N1 *)
+ { x = 8.6945; y = -8.7046; z = -0.2857 }
+ , (* N3 *)
+ { x = 8.6943; y = -7.6514; z = 0.6066 }
+ , (* C2 *)
+ { x = 7.7426; y = -9.6987; z = -0.3801 }
+ , (* C4 *)
+ { x = 6.6642; y = -9.5742; z = 0.5722 }
+ , (* C5 *)
+ { x = 6.6391; y = -8.5592; z = 1.4526 }
+ , (* C6 *)
+ U
+ ( { x = 9.5840; y = -6.8186; z = 0.6136 }
+ , (* O2 *)
+ { x = 7.8505; y = -10.5925; z = -1.2223 }
+ , (* O4 *)
+ { x = 9.4601; y = -8.7514; z = -0.9277 }
+ , (* H3 *)
+ { x = 5.9281; y = -10.2509; z = 0.5782 }
+ , (* H5 *)
+ { x = 5.8831; y = -8.4931; z = 2.1028 } ) )
+
+(* H6 *)
+
+let rU03 =
+ N
+ ( { a = -0.4993
+ ; b = 0.0476
+ ; c = 0.8651
+ ; (* dgf_base_tfo *)
+ d = 0.8078
+ ; e = -0.3353
+ ; f = 0.4847
+ ; g = 0.3132
+ ; h = 0.9409
+ ; i = 0.1290
+ ; tx = 6.2989
+ ; ty = -5.2303
+ ; tz = -3.8577
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 3.9938; y = -6.7042; z = 1.9023 }
+ , (* C5' *)
+ { x = 3.2332; y = -5.9343; z = 2.0319 }
+ , (* H5' *)
+ { x = 3.9666; y = -7.2863; z = 0.9812 }
+ , (* H5'' *)
+ { x = 5.3098; y = -5.9546; z = 1.8564 }
+ , (* C4' *)
+ { x = 5.3863; y = -5.3702; z = 0.9395 }
+ , (* H4' *)
+ { x = 5.3851; y = -5.0642; z = 3.0076 }
+ , (* O4' *)
+ { x = 6.7315; y = -4.9724; z = 3.4462 }
+ , (* C1' *)
+ { x = 7.0033; y = -3.9202; z = 3.3619 }
+ , (* H1' *)
+ { x = 7.5997; y = -5.8018; z = 2.4948 }
+ , (* C2' *)
+ { x = 8.3627; y = -6.3254; z = 3.0707 }
+ , (* H2'' *)
+ { x = 8.0410; y = -4.9501; z = 1.4724 }
+ , (* O2' *)
+ { x = 8.2781; y = -4.0644; z = 1.7570 }
+ , (* H2' *)
+ { x = 6.5701; y = -6.8129; z = 1.9714 }
+ , (* C3' *)
+ { x = 6.4186; y = -7.5809; z = 2.7299 }
+ , (* H3' *)
+ { x = 6.9357; y = -7.3841; z = 0.7235 }
+ , (* O3' *)
+ { x = 6.8024; y = -5.4718; z = 4.8475 }
+ , (* N1 *)
+ { x = 7.9218; y = -5.5700; z = 6.8877 }
+ , (* N3 *)
+ { x = 7.8908; y = -5.0886; z = 5.5944 }
+ , (* C2 *)
+ { x = 6.9789; y = -6.3827; z = 7.4823 }
+ , (* C4 *)
+ { x = 5.8742; y = -6.7319; z = 6.6202 }
+ , (* C5 *)
+ { x = 5.8182; y = -6.2769; z = 5.3570 }
+ , (* C6 *)
+ U
+ ( { x = 8.7747; y = -4.3728; z = 5.1568 }
+ , (* O2 *)
+ { x = 7.1154; y = -6.7509; z = 8.6509 }
+ , (* O4 *)
+ { x = 8.7055; y = -5.3037; z = 7.4491 }
+ , (* H3 *)
+ { x = 5.1416; y = -7.3178; z = 6.9665 }
+ , (* H5 *)
+ { x = 5.0441; y = -6.5310; z = 4.7784 } ) )
+
+(* H6 *)
+
+let rU04 =
+ N
+ ( { a = -0.5669
+ ; b = -0.8012
+ ; c = 0.1918
+ ; (* dgf_base_tfo *)
+ d = -0.8129
+ ; e = 0.5817
+ ; f = 0.0273
+ ; g = -0.1334
+ ; h = -0.1404
+ ; i = -0.9811
+ ; tx = -0.3279
+ ; ty = 8.3874
+ ; tz = 0.3355
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2416; y = -8.2422; z = 2.8181 }
+ , (* C5' *)
+ { x = 5.2050; y = -8.8128; z = 1.8901 }
+ , (* H5' *)
+ { x = 5.5368; y = -8.7738; z = 3.7227 }
+ , (* H5'' *)
+ { x = 6.3232; y = -7.2037; z = 2.6002 }
+ , (* C4' *)
+ { x = 7.3048; y = -7.6757; z = 2.5577 }
+ , (* H4' *)
+ { x = 6.0635; y = -6.5092; z = 1.3456 }
+ , (* O4' *)
+ { x = 6.4697; y = -5.1547; z = 1.4629 }
+ , (* C1' *)
+ { x = 7.2354; y = -5.0043; z = 0.7018 }
+ , (* H1' *)
+ { x = 7.0856; y = -4.9610; z = 2.8521 }
+ , (* C2' *)
+ { x = 6.7777; y = -3.9935; z = 3.2487 }
+ , (* H2'' *)
+ { x = 8.4627; y = -5.1992; z = 2.7423 }
+ , (* O2' *)
+ { x = 8.8693; y = -4.8638; z = 1.9399 }
+ , (* H2' *)
+ { x = 6.3877; y = -6.0809; z = 3.6362 }
+ , (* C3' *)
+ { x = 5.3770; y = -5.7562; z = 3.8834 }
+ , (* H3' *)
+ { x = 7.1024; y = -6.4754; z = 4.7985 }
+ , (* O3' *)
+ { x = 5.2764; y = -4.2883; z = 1.2538 }
+ , (* N1 *)
+ { x = 3.8961; y = -3.0896; z = -0.1893 }
+ , (* N3 *)
+ { x = 5.0095; y = -3.8907; z = -0.0346 }
+ , (* C2 *)
+ { x = 3.0480; y = -2.6632; z = 0.8116 }
+ , (* C4 *)
+ { x = 3.4093; y = -3.1310; z = 2.1292 }
+ , (* C5 *)
+ { x = 4.4878; y = -3.9124; z = 2.3088 }
+ , (* C6 *)
+ U
+ ( { x = 5.7005; y = -4.2164; z = -0.9842 }
+ , (* O2 *)
+ { x = 2.0800; y = -1.9458; z = 0.5503 }
+ , (* O4 *)
+ { x = 3.6834; y = -2.7882; z = -1.1190 }
+ , (* H3 *)
+ { x = 2.8508; y = -2.8721; z = 2.9172 }
+ , (* H5 *)
+ { x = 4.7188; y = -4.2247; z = 3.2295 } ) )
+
+(* H6 *)
+
+let rU05 =
+ N
+ ( { a = -0.6298
+ ; b = 0.0246
+ ; c = 0.7763
+ ; (* dgf_base_tfo *)
+ d = -0.5226
+ ; e = -0.7529
+ ; f = -0.4001
+ ; g = 0.5746
+ ; h = -0.6577
+ ; i = 0.4870
+ ; tx = -0.0208
+ ; ty = -3.4598
+ ; tz = -9.6882
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 4.3825; y = -6.6585; z = 4.0489 }
+ , (* C5' *)
+ { x = 4.6841; y = -7.2019; z = 4.9443 }
+ , (* H5' *)
+ { x = 3.6189; y = -5.8889; z = 4.1625 }
+ , (* H5'' *)
+ { x = 5.6255; y = -5.9175; z = 3.5998 }
+ , (* C4' *)
+ { x = 5.8732; y = -5.1228; z = 4.3034 }
+ , (* H4' *)
+ { x = 6.7337; y = -6.8605; z = 3.5222 }
+ , (* O4' *)
+ { x = 7.5932; y = -6.4923; z = 2.4548 }
+ , (* C1' *)
+ { x = 8.5661; y = -6.2983; z = 2.9064 }
+ , (* H1' *)
+ { x = 7.0527; y = -5.2012; z = 1.8322 }
+ , (* C2' *)
+ { x = 7.1627; y = -5.2525; z = 0.7490 }
+ , (* H2'' *)
+ { x = 7.6666; y = -4.1249; z = 2.4880 }
+ , (* O2' *)
+ { x = 8.5944; y = -4.2543; z = 2.6981 }
+ , (* H2' *)
+ { x = 5.5661; y = -5.3029; z = 2.2009 }
+ , (* C3' *)
+ { x = 5.0841; y = -6.0018; z = 1.5172 }
+ , (* H3' *)
+ { x = 4.9062; y = -4.0452; z = 2.2042 }
+ , (* O3' *)
+ { x = 7.6298; y = -7.6136; z = 1.4752 }
+ , (* N1 *)
+ { x = 8.5977; y = -9.5977; z = 0.7329 }
+ , (* N3 *)
+ { x = 8.5951; y = -8.5745; z = 1.6594 }
+ , (* C2 *)
+ { x = 7.7372; y = -9.7371; z = -0.3364 }
+ , (* C4 *)
+ { x = 6.7596; y = -8.6801; z = -0.4476 }
+ , (* C5 *)
+ { x = 6.7338; y = -7.6721; z = 0.4408 }
+ , (* C6 *)
+ U
+ ( { x = 9.3993; y = -8.5377; z = 2.5743 }
+ , (* O2 *)
+ { x = 7.8374; y = -10.6990; z = -1.1008 }
+ , (* O4 *)
+ { x = 9.2924; y = -10.3081; z = 0.8477 }
+ , (* H3 *)
+ { x = 6.0932; y = -8.6982; z = -1.1929 }
+ , (* H5 *)
+ { x = 6.0481; y = -6.9515; z = 0.3446 } ) )
+
+(* H6 *)
+
+let rU06 =
+ N
+ ( { a = -0.9837
+ ; b = 0.0476
+ ; c = -0.1733
+ ; (* dgf_base_tfo *)
+ d = -0.1792
+ ; e = -0.3353
+ ; f = 0.9249
+ ; g = -0.0141
+ ; h = 0.9409
+ ; i = 0.3384
+ ; tx = 5.7793
+ ; ty = -5.2303
+ ; tz = 4.5997
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 3.9938; y = -6.7042; z = 1.9023 }
+ , (* C5' *)
+ { x = 3.2332; y = -5.9343; z = 2.0319 }
+ , (* H5' *)
+ { x = 3.9666; y = -7.2863; z = 0.9812 }
+ , (* H5'' *)
+ { x = 5.3098; y = -5.9546; z = 1.8564 }
+ , (* C4' *)
+ { x = 5.3863; y = -5.3702; z = 0.9395 }
+ , (* H4' *)
+ { x = 5.3851; y = -5.0642; z = 3.0076 }
+ , (* O4' *)
+ { x = 6.7315; y = -4.9724; z = 3.4462 }
+ , (* C1' *)
+ { x = 7.0033; y = -3.9202; z = 3.3619 }
+ , (* H1' *)
+ { x = 7.5997; y = -5.8018; z = 2.4948 }
+ , (* C2' *)
+ { x = 8.3627; y = -6.3254; z = 3.0707 }
+ , (* H2'' *)
+ { x = 8.0410; y = -4.9501; z = 1.4724 }
+ , (* O2' *)
+ { x = 8.2781; y = -4.0644; z = 1.7570 }
+ , (* H2' *)
+ { x = 6.5701; y = -6.8129; z = 1.9714 }
+ , (* C3' *)
+ { x = 6.4186; y = -7.5809; z = 2.7299 }
+ , (* H3' *)
+ { x = 6.9357; y = -7.3841; z = 0.7235 }
+ , (* O3' *)
+ { x = 6.8024; y = -5.4718; z = 4.8475 }
+ , (* N1 *)
+ { x = 6.6920; y = -5.0495; z = 7.1354 }
+ , (* N3 *)
+ { x = 6.6201; y = -4.5500; z = 5.8506 }
+ , (* C2 *)
+ { x = 6.9254; y = -6.3614; z = 7.4926 }
+ , (* C4 *)
+ { x = 7.1046; y = -7.2543; z = 6.3718 }
+ , (* C5 *)
+ { x = 7.0391; y = -6.7951; z = 5.1106 }
+ , (* C6 *)
+ U
+ ( { x = 6.4083; y = -3.3696; z = 5.6340 }
+ , (* O2 *)
+ { x = 6.9679; y = -6.6901; z = 8.6800 }
+ , (* O4 *)
+ { x = 6.5626; y = -4.3957; z = 7.8812 }
+ , (* H3 *)
+ { x = 7.2781; y = -8.2254; z = 6.5350 }
+ , (* H5 *)
+ { x = 7.1657; y = -7.4312; z = 4.3503 } ) )
+
+(* H6 *)
+
+let rU07 =
+ N
+ ( { a = -0.9434
+ ; b = 0.3172
+ ; c = 0.0971
+ ; (* dgf_base_tfo *)
+ d = 0.2294
+ ; e = 0.4125
+ ; f = 0.8816
+ ; g = 0.2396
+ ; h = 0.8539
+ ; i = -0.4619
+ ; tx = 8.3625
+ ; ty = -52.7147
+ ; tz = 1.3745
+ }
+ , { a = 0.2765
+ ; b = -0.1121
+ ; c = -0.9545
+ ; (* P_O3'_275_tfo *)
+ d = -0.8297
+ ; e = 0.4733
+ ; f = -0.2959
+ ; g = 0.4850
+ ; h = 0.8737
+ ; i = 0.0379
+ ; tx = -14.7774
+ ; ty = -45.2464
+ ; tz = 21.9088
+ }
+ , { a = 0.1063
+ ; b = -0.6334
+ ; c = -0.7665
+ ; (* P_O3'_180_tfo *)
+ d = -0.5932
+ ; e = -0.6591
+ ; f = 0.4624
+ ; g = -0.7980
+ ; h = 0.4055
+ ; i = -0.4458
+ ; tx = 43.7634
+ ; ty = 4.3296
+ ; tz = 28.4890
+ }
+ , { a = 0.7136
+ ; b = -0.5032
+ ; c = -0.4873
+ ; (* P_O3'_60_tfo *)
+ d = 0.6803
+ ; e = 0.3317
+ ; f = 0.6536
+ ; g = -0.1673
+ ; h = -0.7979
+ ; i = 0.5791
+ ; tx = -17.1858
+ ; ty = 41.4390
+ ; tz = -27.0751
+ }
+ , { x = 21.3880; y = 15.0780; z = 45.5770 }
+ , (* P *)
+ { x = 21.9980; y = 14.5500; z = 46.8210 }
+ , (* O1P *)
+ { x = 21.1450; y = 14.0270; z = 44.5420 }
+ , (* O2P *)
+ { x = 22.1250; y = 16.3600; z = 44.9460 }
+ , (* O5' *)
+ { x = 21.5037; y = 16.8594; z = 43.7323 }
+ , (* C5' *)
+ { x = 20.8147; y = 17.6663; z = 43.9823 }
+ , (* H5' *)
+ { x = 21.1086; y = 16.0230; z = 43.1557 }
+ , (* H5'' *)
+ { x = 22.5654; y = 17.4874; z = 42.8616 }
+ , (* C4' *)
+ { x = 22.1584; y = 17.7243; z = 41.8785 }
+ , (* H4' *)
+ { x = 23.0557; y = 18.6826; z = 43.4751 }
+ , (* O4' *)
+ { x = 24.4788; y = 18.6151; z = 43.6455 }
+ , (* C1' *)
+ { x = 24.9355; y = 19.0840; z = 42.7739 }
+ , (* H1' *)
+ { x = 24.7958; y = 17.1427; z = 43.6474 }
+ , (* C2' *)
+ { x = 24.5652; y = 16.7400; z = 44.6336 }
+ , (* H2'' *)
+ { x = 26.1041; y = 16.8773; z = 43.2455 }
+ , (* O2' *)
+ { x = 26.7516; y = 17.5328; z = 43.5149 }
+ , (* H2' *)
+ { x = 23.8109; y = 16.5979; z = 42.6377 }
+ , (* C3' *)
+ { x = 23.5756; y = 15.5686; z = 42.9084 }
+ , (* H3' *)
+ { x = 24.2890; y = 16.7447; z = 41.2729 }
+ , (* O3' *)
+ { x = 24.9420; y = 19.2174; z = 44.8923 }
+ , (* N1 *)
+ { x = 25.2655; y = 20.5636; z = 44.8883 }
+ , (* N3 *)
+ { x = 25.1663; y = 21.2219; z = 43.8561 }
+ , (* C2 *)
+ { x = 25.6911; y = 21.1219; z = 46.0494 }
+ , (* C4 *)
+ { x = 25.8051; y = 20.4068; z = 47.2048 }
+ , (* C5 *)
+ { x = 26.2093; y = 20.9962; z = 48.2534 }
+ , (* C6 *)
+ U
+ ( { x = 25.4692; y = 19.0221; z = 47.2053 }
+ , (* O2 *)
+ { x = 25.0502; y = 18.4827; z = 46.0370 }
+ , (* O4 *)
+ { x = 25.9599; y = 22.1772; z = 46.0966 }
+ , (* H3 *)
+ { x = 25.5545; y = 18.4409; z = 48.1234 }
+ , (* H5 *)
+ { x = 24.7854; y = 17.4265; z = 45.9883 } ) )
+
+(* H6 *)
+
+let rU08 =
+ N
+ ( { a = -0.0080
+ ; b = -0.7928
+ ; c = 0.6094
+ ; (* dgf_base_tfo *)
+ d = -0.7512
+ ; e = 0.4071
+ ; f = 0.5197
+ ; g = -0.6601
+ ; h = -0.4536
+ ; i = -0.5988
+ ; tx = 44.1482
+ ; ty = 30.7036
+ ; tz = 2.1088
+ }
+ , { a = 0.2765
+ ; b = -0.1121
+ ; c = -0.9545
+ ; (* P_O3'_275_tfo *)
+ d = -0.8297
+ ; e = 0.4733
+ ; f = -0.2959
+ ; g = 0.4850
+ ; h = 0.8737
+ ; i = 0.0379
+ ; tx = -14.7774
+ ; ty = -45.2464
+ ; tz = 21.9088
+ }
+ , { a = 0.1063
+ ; b = -0.6334
+ ; c = -0.7665
+ ; (* P_O3'_180_tfo *)
+ d = -0.5932
+ ; e = -0.6591
+ ; f = 0.4624
+ ; g = -0.7980
+ ; h = 0.4055
+ ; i = -0.4458
+ ; tx = 43.7634
+ ; ty = 4.3296
+ ; tz = 28.4890
+ }
+ , { a = 0.7136
+ ; b = -0.5032
+ ; c = -0.4873
+ ; (* P_O3'_60_tfo *)
+ d = 0.6803
+ ; e = 0.3317
+ ; f = 0.6536
+ ; g = -0.1673
+ ; h = -0.7979
+ ; i = 0.5791
+ ; tx = -17.1858
+ ; ty = 41.4390
+ ; tz = -27.0751
+ }
+ , { x = 21.3880; y = 15.0780; z = 45.5770 }
+ , (* P *)
+ { x = 21.9980; y = 14.5500; z = 46.8210 }
+ , (* O1P *)
+ { x = 21.1450; y = 14.0270; z = 44.5420 }
+ , (* O2P *)
+ { x = 22.1250; y = 16.3600; z = 44.9460 }
+ , (* O5' *)
+ { x = 23.5096; y = 16.1227; z = 44.5783 }
+ , (* C5' *)
+ { x = 23.5649; y = 15.8588; z = 43.5222 }
+ , (* H5' *)
+ { x = 23.9621; y = 15.4341; z = 45.2919 }
+ , (* H5'' *)
+ { x = 24.2805; y = 17.4138; z = 44.7151 }
+ , (* C4' *)
+ { x = 25.3492; y = 17.2309; z = 44.6030 }
+ , (* H4' *)
+ { x = 23.8497; y = 18.3471; z = 43.7208 }
+ , (* O4' *)
+ { x = 23.4090; y = 19.5681; z = 44.3321 }
+ , (* C1' *)
+ { x = 24.2595; y = 20.2496; z = 44.3524 }
+ , (* H1' *)
+ { x = 23.0418; y = 19.1813; z = 45.7407 }
+ , (* C2' *)
+ { x = 22.0532; y = 18.7224; z = 45.7273 }
+ , (* H2'' *)
+ { x = 23.1307; y = 20.2521; z = 46.6291 }
+ , (* O2' *)
+ { x = 22.8888; y = 21.1051; z = 46.2611 }
+ , (* H2' *)
+ { x = 24.0799; y = 18.1326; z = 46.0700 }
+ , (* C3' *)
+ { x = 23.6490; y = 17.4370; z = 46.7900 }
+ , (* H3' *)
+ { x = 25.3329; y = 18.7227; z = 46.5109 }
+ , (* O3' *)
+ { x = 22.2515; y = 20.1624; z = 43.6698 }
+ , (* N1 *)
+ { x = 22.4760; y = 21.0609; z = 42.6406 }
+ , (* N3 *)
+ { x = 23.6229; y = 21.3462; z = 42.3061 }
+ , (* C2 *)
+ { x = 21.3986; y = 21.6081; z = 42.0236 }
+ , (* C4 *)
+ { x = 20.1189; y = 21.3012; z = 42.3804 }
+ , (* C5 *)
+ { x = 19.1599; y = 21.8516; z = 41.7578 }
+ , (* C6 *)
+ U
+ ( { x = 19.8919; y = 20.3745; z = 43.4387 }
+ , (* O2 *)
+ { x = 20.9790; y = 19.8423; z = 44.0440 }
+ , (* O4 *)
+ { x = 21.5235; y = 22.3222; z = 41.2097 }
+ , (* H3 *)
+ { x = 18.8732; y = 20.1200; z = 43.7312 }
+ , (* H5 *)
+ { x = 20.8545; y = 19.1313; z = 44.8608 } ) )
+
+(* H6 *)
+
+let rU09 =
+ N
+ ( { a = -0.0317
+ ; b = 0.1374
+ ; c = 0.9900
+ ; (* dgf_base_tfo *)
+ d = -0.3422
+ ; e = -0.9321
+ ; f = 0.1184
+ ; g = 0.9391
+ ; h = -0.3351
+ ; i = 0.0765
+ ; tx = -32.1929
+ ; ty = 25.8198
+ ; tz = -28.5088
+ }
+ , { a = 0.2765
+ ; b = -0.1121
+ ; c = -0.9545
+ ; (* P_O3'_275_tfo *)
+ d = -0.8297
+ ; e = 0.4733
+ ; f = -0.2959
+ ; g = 0.4850
+ ; h = 0.8737
+ ; i = 0.0379
+ ; tx = -14.7774
+ ; ty = -45.2464
+ ; tz = 21.9088
+ }
+ , { a = 0.1063
+ ; b = -0.6334
+ ; c = -0.7665
+ ; (* P_O3'_180_tfo *)
+ d = -0.5932
+ ; e = -0.6591
+ ; f = 0.4624
+ ; g = -0.7980
+ ; h = 0.4055
+ ; i = -0.4458
+ ; tx = 43.7634
+ ; ty = 4.3296
+ ; tz = 28.4890
+ }
+ , { a = 0.7136
+ ; b = -0.5032
+ ; c = -0.4873
+ ; (* P_O3'_60_tfo *)
+ d = 0.6803
+ ; e = 0.3317
+ ; f = 0.6536
+ ; g = -0.1673
+ ; h = -0.7979
+ ; i = 0.5791
+ ; tx = -17.1858
+ ; ty = 41.4390
+ ; tz = -27.0751
+ }
+ , { x = 21.3880; y = 15.0780; z = 45.5770 }
+ , (* P *)
+ { x = 21.9980; y = 14.5500; z = 46.8210 }
+ , (* O1P *)
+ { x = 21.1450; y = 14.0270; z = 44.5420 }
+ , (* O2P *)
+ { x = 22.1250; y = 16.3600; z = 44.9460 }
+ , (* O5' *)
+ { x = 21.5037; y = 16.8594; z = 43.7323 }
+ , (* C5' *)
+ { x = 20.8147; y = 17.6663; z = 43.9823 }
+ , (* H5' *)
+ { x = 21.1086; y = 16.0230; z = 43.1557 }
+ , (* H5'' *)
+ { x = 22.5654; y = 17.4874; z = 42.8616 }
+ , (* C4' *)
+ { x = 23.0565; y = 18.3036; z = 43.3915 }
+ , (* H4' *)
+ { x = 23.5375; y = 16.5054; z = 42.4925 }
+ , (* O4' *)
+ { x = 23.6574; y = 16.4257; z = 41.0649 }
+ , (* C1' *)
+ { x = 24.4701; y = 17.0882; z = 40.7671 }
+ , (* H1' *)
+ { x = 22.3525; y = 16.9643; z = 40.5396 }
+ , (* C2' *)
+ { x = 21.5993; y = 16.1799; z = 40.6133 }
+ , (* H2'' *)
+ { x = 22.4693; y = 17.4849; z = 39.2515 }
+ , (* O2' *)
+ { x = 23.0899; y = 17.0235; z = 38.6827 }
+ , (* H2' *)
+ { x = 22.0341; y = 18.0633; z = 41.5279 }
+ , (* C3' *)
+ { x = 20.9509; y = 18.1709; z = 41.5846 }
+ , (* H3' *)
+ { x = 22.7249; y = 19.3020; z = 41.2100 }
+ , (* O3' *)
+ { x = 23.8580; y = 15.0648; z = 40.5757 }
+ , (* N1 *)
+ { x = 25.1556; y = 14.5982; z = 40.4523 }
+ , (* N3 *)
+ { x = 26.1047; y = 15.3210; z = 40.7448 }
+ , (* C2 *)
+ { x = 25.3391; y = 13.3315; z = 40.0020 }
+ , (* C4 *)
+ { x = 24.2974; y = 12.5148; z = 39.6749 }
+ , (* C5 *)
+ { x = 24.5450; y = 11.3410; z = 39.2610 }
+ , (* C6 *)
+ U
+ ( { x = 22.9633; y = 12.9979; z = 39.8053 }
+ , (* O2 *)
+ { x = 22.8009; y = 14.2648; z = 40.2524 }
+ , (* O4 *)
+ { x = 26.3414; y = 12.9194; z = 39.8855 }
+ , (* H3 *)
+ { x = 22.1227; y = 12.3533; z = 39.5486 }
+ , (* H5 *)
+ { x = 21.7989; y = 14.6788; z = 40.3650 } ) )
+
+(* H6 *)
+
+let rU10 =
+ N
+ ( { a = -0.9674
+ ; b = 0.1021
+ ; c = -0.2318
+ ; (* dgf_base_tfo *)
+ d = -0.2514
+ ; e = -0.2766
+ ; f = 0.9275
+ ; g = 0.0306
+ ; h = 0.9555
+ ; i = 0.2933
+ ; tx = 27.8571
+ ; ty = -42.1305
+ ; tz = -24.4563
+ }
+ , { a = 0.2765
+ ; b = -0.1121
+ ; c = -0.9545
+ ; (* P_O3'_275_tfo *)
+ d = -0.8297
+ ; e = 0.4733
+ ; f = -0.2959
+ ; g = 0.4850
+ ; h = 0.8737
+ ; i = 0.0379
+ ; tx = -14.7774
+ ; ty = -45.2464
+ ; tz = 21.9088
+ }
+ , { a = 0.1063
+ ; b = -0.6334
+ ; c = -0.7665
+ ; (* P_O3'_180_tfo *)
+ d = -0.5932
+ ; e = -0.6591
+ ; f = 0.4624
+ ; g = -0.7980
+ ; h = 0.4055
+ ; i = -0.4458
+ ; tx = 43.7634
+ ; ty = 4.3296
+ ; tz = 28.4890
+ }
+ , { a = 0.7136
+ ; b = -0.5032
+ ; c = -0.4873
+ ; (* P_O3'_60_tfo *)
+ d = 0.6803
+ ; e = 0.3317
+ ; f = 0.6536
+ ; g = -0.1673
+ ; h = -0.7979
+ ; i = 0.5791
+ ; tx = -17.1858
+ ; ty = 41.4390
+ ; tz = -27.0751
+ }
+ , { x = 21.3880; y = 15.0780; z = 45.5770 }
+ , (* P *)
+ { x = 21.9980; y = 14.5500; z = 46.8210 }
+ , (* O1P *)
+ { x = 21.1450; y = 14.0270; z = 44.5420 }
+ , (* O2P *)
+ { x = 22.1250; y = 16.3600; z = 44.9460 }
+ , (* O5' *)
+ { x = 23.5096; y = 16.1227; z = 44.5783 }
+ , (* C5' *)
+ { x = 23.5649; y = 15.8588; z = 43.5222 }
+ , (* H5' *)
+ { x = 23.9621; y = 15.4341; z = 45.2919 }
+ , (* H5'' *)
+ { x = 24.2805; y = 17.4138; z = 44.7151 }
+ , (* C4' *)
+ { x = 23.8509; y = 18.1819; z = 44.0720 }
+ , (* H4' *)
+ { x = 24.2506; y = 17.8583; z = 46.0741 }
+ , (* O4' *)
+ { x = 25.5830; y = 18.0320; z = 46.5775 }
+ , (* C1' *)
+ { x = 25.8569; y = 19.0761; z = 46.4256 }
+ , (* H1' *)
+ { x = 26.4410; y = 17.1555; z = 45.7033 }
+ , (* C2' *)
+ { x = 26.3459; y = 16.1253; z = 46.0462 }
+ , (* H2'' *)
+ { x = 27.7649; y = 17.5888; z = 45.6478 }
+ , (* O2' *)
+ { x = 28.1004; y = 17.9719; z = 46.4616 }
+ , (* H2' *)
+ { x = 25.7796; y = 17.2997; z = 44.3513 }
+ , (* C3' *)
+ { x = 25.9478; y = 16.3824; z = 43.7871 }
+ , (* H3' *)
+ { x = 26.2154; y = 18.4984; z = 43.6541 }
+ , (* O3' *)
+ { x = 25.7321; y = 17.6281; z = 47.9726 }
+ , (* N1 *)
+ { x = 25.5136; y = 18.5779; z = 48.9560 }
+ , (* N3 *)
+ { x = 25.2079; y = 19.7276; z = 48.6503 }
+ , (* C2 *)
+ { x = 25.6482; y = 18.1987; z = 50.2518 }
+ , (* C4 *)
+ { x = 25.9847; y = 16.9266; z = 50.6092 }
+ , (* C5 *)
+ { x = 26.0918; y = 16.6439; z = 51.8416 }
+ , (* C6 *)
+ U
+ ( { x = 26.2067; y = 15.9515; z = 49.5943 }
+ , (* O2 *)
+ { x = 26.0713; y = 16.3497; z = 48.3080 }
+ , (* O4 *)
+ { x = 25.4890; y = 18.9105; z = 51.0618 }
+ , (* H3 *)
+ { x = 26.4742; y = 14.9310; z = 49.8682 }
+ , (* H5 *)
+ { x = 26.2346; y = 15.6394; z = 47.4975 } ) )
+
+(* H6 *)
+
+let rUs = [ rU01; rU02; rU03; rU04; rU05; rU06; rU07; rU08; rU09; rU10 ]
+
+let rG' =
+ N
+ ( { a = -0.2067
+ ; b = -0.0264
+ ; c = 0.9780
+ ; (* dgf_base_tfo *)
+ d = 0.9770
+ ; e = -0.0586
+ ; f = 0.2049
+ ; g = 0.0519
+ ; h = 0.9979
+ ; i = 0.0379
+ ; tx = 1.0331
+ ; ty = -46.8078
+ ; tz = -36.4742
+ }
+ , { a = -0.8644
+ ; b = -0.4956
+ ; c = -0.0851
+ ; (* P_O3'_275_tfo *)
+ d = -0.0427
+ ; e = 0.2409
+ ; f = -0.9696
+ ; g = 0.5010
+ ; h = -0.8345
+ ; i = -0.2294
+ ; tx = 4.0167
+ ; ty = 54.5377
+ ; tz = 12.4779
+ }
+ , { a = 0.3706
+ ; b = -0.6167
+ ; c = 0.6945
+ ; (* P_O3'_180_tfo *)
+ d = -0.2867
+ ; e = -0.7872
+ ; f = -0.5460
+ ; g = 0.8834
+ ; h = 0.0032
+ ; i = -0.4686
+ ; tx = -52.9020
+ ; ty = 18.6313
+ ; tz = -0.6709
+ }
+ , { a = 0.4155
+ ; b = 0.9025
+ ; c = -0.1137
+ ; (* P_O3'_60_tfo *)
+ d = 0.9040
+ ; e = -0.4236
+ ; f = -0.0582
+ ; g = -0.1007
+ ; h = -0.0786
+ ; i = -0.9918
+ ; tx = -7.6624
+ ; ty = -25.2080
+ ; tz = 49.5181
+ }
+ , { x = 31.3810; y = 0.1400; z = 47.5810 }
+ , (* P *)
+ { x = 29.9860; y = 0.6630; z = 47.6290 }
+ , (* O1P *)
+ { x = 31.7210; y = -0.6460; z = 48.8090 }
+ , (* O2P *)
+ { x = 32.4940; y = 1.2540; z = 47.2740 }
+ , (* O5' *)
+ { x = 32.1610; y = 2.2370; z = 46.2560 }
+ , (* C5' *)
+ { x = 31.2986; y = 2.8190; z = 46.5812 }
+ , (* H5' *)
+ { x = 32.0980; y = 1.7468; z = 45.2845 }
+ , (* H5'' *)
+ { x = 33.3476; y = 3.1959; z = 46.1947 }
+ , (* C4' *)
+ { x = 33.2668; y = 3.8958; z = 45.3630 }
+ , (* H4' *)
+ { x = 33.3799; y = 3.9183; z = 47.4216 }
+ , (* O4' *)
+ { x = 34.6515; y = 3.7222; z = 48.0398 }
+ , (* C1' *)
+ { x = 35.2947; y = 4.5412; z = 47.7180 }
+ , (* H1' *)
+ { x = 35.1756; y = 2.4228; z = 47.4827 }
+ , (* C2' *)
+ { x = 34.6778; y = 1.5937; z = 47.9856 }
+ , (* H2'' *)
+ { x = 36.5631; y = 2.2672; z = 47.4798 }
+ , (* O2' *)
+ { x = 37.0163; y = 2.6579; z = 48.2305 }
+ , (* H2' *)
+ { x = 34.6953; y = 2.5043; z = 46.0448 }
+ , (* C3' *)
+ { x = 34.5444; y = 1.4917; z = 45.6706 }
+ , (* H3' *)
+ { x = 35.6679; y = 3.3009; z = 45.3487 }
+ , (* O3' *)
+ { x = 37.4804; y = 4.0914; z = 52.2559 }
+ , (* N1 *)
+ { x = 36.9670; y = 4.1312; z = 49.9281 }
+ , (* N3 *)
+ { x = 37.8045; y = 4.2519; z = 50.9550 }
+ , (* C2 *)
+ { x = 35.7171; y = 3.8264; z = 50.3222 }
+ , (* C4 *)
+ { x = 35.2668; y = 3.6420; z = 51.6115 }
+ , (* C5 *)
+ { x = 36.2037; y = 3.7829; z = 52.6706 }
+ , (* C6 *)
+ G
+ ( { x = 39.0869; y = 4.5552; z = 50.7092 }
+ , (* N2 *)
+ { x = 33.9075; y = 3.3338; z = 51.6102 }
+ , (* N7 *)
+ { x = 34.6126; y = 3.6358; z = 49.5108 }
+ , (* N9 *)
+ { x = 33.5805; y = 3.3442; z = 50.3425 }
+ , (* C8 *)
+ { x = 35.9958; y = 3.6512; z = 53.8724 }
+ , (* O6 *)
+ { x = 38.2106; y = 4.2053; z = 52.9295 }
+ , (* H1 *)
+ { x = 39.8218; y = 4.6863; z = 51.3896 }
+ , (* H21 *)
+ { x = 39.3420; y = 4.6857; z = 49.7407 }
+ , (* H22 *)
+ { x = 32.5194; y = 3.1070; z = 50.2664 } ) )
+
+(* H8 *)
+
+let rU' =
+ N
+ ( { a = -0.0109
+ ; b = 0.5907
+ ; c = 0.8068
+ ; (* dgf_base_tfo *)
+ d = 0.2217
+ ; e = -0.7853
+ ; f = 0.5780
+ ; g = 0.9751
+ ; h = 0.1852
+ ; i = -0.1224
+ ; tx = -1.4225
+ ; ty = -11.0956
+ ; tz = -2.5217
+ }
+ , { a = -0.8313
+ ; b = -0.4738
+ ; c = -0.2906
+ ; (* P_O3'_275_tfo *)
+ d = 0.0649
+ ; e = 0.4366
+ ; f = -0.8973
+ ; g = 0.5521
+ ; h = -0.7648
+ ; i = -0.3322
+ ; tx = 1.6833
+ ; ty = 6.8060
+ ; tz = -7.0011
+ }
+ , { a = 0.3445
+ ; b = -0.7630
+ ; c = 0.5470
+ ; (* P_O3'_180_tfo *)
+ d = -0.4628
+ ; e = -0.6450
+ ; f = -0.6082
+ ; g = 0.8168
+ ; h = -0.0436
+ ; i = -0.5753
+ ; tx = -6.8179
+ ; ty = -3.9778
+ ; tz = -5.9887
+ }
+ , { a = 0.5855
+ ; b = 0.7931
+ ; c = -0.1682
+ ; (* P_O3'_60_tfo *)
+ d = 0.8103
+ ; e = -0.5790
+ ; f = 0.0906
+ ; g = -0.0255
+ ; h = -0.1894
+ ; i = -0.9816
+ ; tx = 6.1203
+ ; ty = -7.1051
+ ; tz = 3.1984
+ }
+ , { x = 2.6760; y = -8.4960; z = 3.2880 }
+ , (* P *)
+ { x = 1.4950; y = -7.6230; z = 3.4770 }
+ , (* O1P *)
+ { x = 2.9490; y = -9.4640; z = 4.3740 }
+ , (* O2P *)
+ { x = 3.9730; y = -7.5950; z = 3.0340 }
+ , (* O5' *)
+ { x = 5.2430; y = -8.2420; z = 2.8260 }
+ , (* C5' *)
+ { x = 5.1974; y = -8.8497; z = 1.9223 }
+ , (* H5' *)
+ { x = 5.5548; y = -8.7348; z = 3.7469 }
+ , (* H5'' *)
+ { x = 6.3140; y = -7.2060; z = 2.5510 }
+ , (* C4' *)
+ { x = 5.8744; y = -6.2116; z = 2.4731 }
+ , (* H4' *)
+ { x = 7.2798; y = -7.2260; z = 3.6420 }
+ , (* O4' *)
+ { x = 8.5733; y = -6.9410; z = 3.1329 }
+ , (* C1' *)
+ { x = 8.9047; y = -6.0374; z = 3.6446 }
+ , (* H1' *)
+ { x = 8.4429; y = -6.6596; z = 1.6327 }
+ , (* C2' *)
+ { x = 9.2880; y = -7.1071; z = 1.1096 }
+ , (* H2'' *)
+ { x = 8.2502; y = -5.2799; z = 1.4754 }
+ , (* O2' *)
+ { x = 8.7676; y = -4.7284; z = 2.0667 }
+ , (* H2' *)
+ { x = 7.1642; y = -7.4416; z = 1.3021 }
+ , (* C3' *)
+ { x = 7.4125; y = -8.5002; z = 1.2260 }
+ , (* H3' *)
+ { x = 6.5160; y = -6.9772; z = 0.1267 }
+ , (* O3' *)
+ { x = 9.4531; y = -8.1107; z = 3.4087 }
+ , (* N1 *)
+ { x = 11.5931; y = -9.0015; z = 3.6357 }
+ , (* N3 *)
+ { x = 10.8101; y = -7.8950; z = 3.3748 }
+ , (* C2 *)
+ { x = 11.1439; y = -10.2744; z = 3.9206 }
+ , (* C4 *)
+ { x = 9.7056; y = -10.4026; z = 3.9332 }
+ , (* C5 *)
+ { x = 8.9192; y = -9.3419; z = 3.6833 }
+ , (* C6 *)
+ U
+ ( { x = 11.3013; y = -6.8063; z = 3.1326 }
+ , (* O2 *)
+ { x = 11.9431; y = -11.1876; z = 4.1375 }
+ , (* O4 *)
+ { x = 12.5840; y = -8.8673; z = 3.6158 }
+ , (* H3 *)
+ { x = 9.2891; y = -11.2898; z = 4.1313 }
+ , (* H5 *)
+ { x = 7.9263; y = -9.4537; z = 3.6977 } ) )
+
+(* H6 *)
+
+(* -- PARTIAL INSTANTIATIONS ------------------------------------------------*)
+
+type variable =
+ { id : int
+ ; t : tfo
+ ; n : nuc
+ }
+
+let mk_var i t n = { id = i; t; n }
+
+let absolute_pos v p = tfo_apply v.t p
+
+let atom_pos atom v = absolute_pos v (atom v.n)
+
+let rec get_var id = function
+ | v :: lst -> if id = v.id then v else get_var id lst
+ | _ -> assert false
+
+(* -- SEARCH ----------------------------------------------------------------*)
+
+(* Sequential backtracking algorithm *)
+
+let rec search (partial_inst : variable list) l constr =
+ match l with
+ | [] -> [ partial_inst ]
+ | h :: t ->
+ let rec try_assignments = function
+ | [] -> []
+ | v :: vs ->
+ if constr v partial_inst
+ then search (v :: partial_inst) t constr @ try_assignments vs
+ else try_assignments vs
+ in
+ try_assignments (h partial_inst)
+
+(* -- DOMAINS ---------------------------------------------------------------*)
+
+(* Primary structure: strand A CUGCCACGUCUG, strand B CAGACGUGGCAG
+
+ Secondary structure: strand A CUGCCACGUCUG
+ ||||||||||||
+ GACGGUGCAGAC strand B
+
+ Tertiary structure:
+
+ 5' end of strand A C1----G12 3' end of strand B
+ U2-------A11
+ G3-------C10
+ C4-----G9
+ C5---G8
+ A6
+ G6-C7
+ C5----G8
+ A4-------U9
+ G3--------C10
+ A2-------U11
+ 5' end of strand B C1----G12 3' end of strand A
+
+ "helix", "stacked" and "connected" describe the spatial relationship
+ between two consecutive nucleotides. E.g. the nucleotides C1 and U2
+ from the strand A.
+
+ "wc" (stands for Watson-Crick and is a type of base-pairing),
+ and "wc-dumas" describe the spatial relationship between
+ nucleotides from two chains that are growing in opposite directions.
+ E.g. the nucleotides C1 from strand A and G12 from strand B.
+*)
+
+(* Dynamic Domains *)
+
+(* Given,
+ "refnuc" a nucleotide which is already positioned,
+ "nucl" the nucleotide to be placed,
+ and "tfo" a transformation matrix which expresses the desired
+ relationship between "refnuc" and "nucl",
+ the function "dgf-base" computes the transformation matrix that
+ places the nucleotide "nucl" in the given relationship to "refnuc".
+*)
+
+let dgf_base tfo v nucl =
+ let x =
+ if is_A v.n
+ then tfo_align (atom_pos nuc_C1' v) (atom_pos rA_N9 v) (atom_pos nuc_C4 v)
+ else if is_C v.n
+ then tfo_align (atom_pos nuc_C1' v) (atom_pos nuc_N1 v) (atom_pos nuc_C2 v)
+ else if is_G v.n
+ then tfo_align (atom_pos nuc_C1' v) (atom_pos rG_N9 v) (atom_pos nuc_C4 v)
+ else tfo_align (atom_pos nuc_C1' v) (atom_pos nuc_N1 v) (atom_pos nuc_C2 v)
+ in
+ tfo_combine (nuc_dgf_base_tfo nucl) (tfo_combine tfo (tfo_inv_ortho x))
+
+(* Placement of first nucleotide. *)
+
+let reference n i partial_inst = [ mk_var i tfo_id n ]
+
+(* The transformation matrix for wc is from:
+
+ Chandrasekaran R. et al (1989) A Re-Examination of the Crystal
+ Structure of A-DNA Using Fiber Diffraction Data. J. Biomol.
+ Struct. & Dynamics 6(6):1189-1202.
+*)
+
+let wc_dumas_tfo =
+ { a = -0.9737
+ ; b = -0.1834
+ ; c = 0.1352
+ ; d = -0.1779
+ ; e = 0.2417
+ ; f = -0.9539
+ ; g = 0.1422
+ ; h = -0.9529
+ ; i = -0.2679
+ ; tx = 0.4837
+ ; ty = 6.2649
+ ; tz = 8.0285
+ }
+
+let wc_dumas nucl i j partial_inst =
+ [ mk_var i (dgf_base wc_dumas_tfo (get_var j partial_inst) nucl) nucl ]
+
+let helix5'_tfo =
+ { a = 0.9886
+ ; b = -0.0961
+ ; c = 0.1156
+ ; d = 0.1424
+ ; e = 0.8452
+ ; f = -0.5152
+ ; g = -0.0482
+ ; h = 0.5258
+ ; i = 0.8492
+ ; tx = -3.8737
+ ; ty = 0.5480
+ ; tz = 3.8024
+ }
+
+let helix5' nucl i j partial_inst =
+ [ mk_var i (dgf_base helix5'_tfo (get_var j partial_inst) nucl) nucl ]
+
+let helix3'_tfo =
+ { a = 0.9886
+ ; b = 0.1424
+ ; c = -0.0482
+ ; d = -0.0961
+ ; e = 0.8452
+ ; f = 0.5258
+ ; g = 0.1156
+ ; h = -0.5152
+ ; i = 0.8492
+ ; tx = 3.4426
+ ; ty = 2.0474
+ ; tz = -3.7042
+ }
+
+let helix3' nucl i j partial_inst =
+ [ mk_var i (dgf_base helix3'_tfo (get_var j partial_inst) nucl) nucl ]
+
+let g37_a38_tfo =
+ { a = 0.9991
+ ; b = 0.0164
+ ; c = -0.0387
+ ; d = -0.0375
+ ; e = 0.7616
+ ; f = -0.6470
+ ; g = 0.0189
+ ; h = 0.6478
+ ; i = 0.7615
+ ; tx = -3.3018
+ ; ty = 0.9975
+ ; tz = 2.5585
+ }
+
+let g37_a38 nucl i j partial_inst =
+ mk_var i (dgf_base g37_a38_tfo (get_var j partial_inst) nucl) nucl
+
+let stacked5' nucl i j partial_inst =
+ g37_a38 nucl i j partial_inst :: helix5' nucl i j partial_inst
+
+let p_o3' nucls i j partial_inst =
+ let refnuc = get_var j partial_inst in
+ let align =
+ tfo_inv_ortho
+ (tfo_align
+ (atom_pos nuc_O3' refnuc)
+ (atom_pos nuc_C3' refnuc)
+ (atom_pos nuc_C4' refnuc))
+ in
+ let rec generate domains = function
+ | [] -> domains
+ | n :: ns ->
+ generate
+ (mk_var i (tfo_combine (nuc_p_o3'_60_tfo n) align) n
+ :: mk_var i (tfo_combine (nuc_p_o3'_180_tfo n) align) n
+ :: mk_var i (tfo_combine (nuc_p_o3'_275_tfo n) align) n
+ :: domains)
+ ns
+ in
+ generate [] nucls
+
+(* -- PROBLEM STATEMENT -----------------------------------------------------*)
+
+(* Define anticodon problem -- Science 253:1255 Figure 3a, 3b and 3c *)
+
+[@@ocamlformat "disable"]
+
+(* Anticodon constraint *)
+
+(* Define pseudoknot problem -- Science 253:1255 Figure 4a and 4b *)
+
+let pseudoknot_domains =
+ [ reference rA 23
+ ; wc_dumas rU 8 23
+ ; helix3' rG 22 23
+ ; wc_dumas rC 9 22
+ ; helix3' rG 21 22
+ ; wc_dumas rC 10 21
+ ; helix3' rC 20 21
+ ; wc_dumas rG 11 20
+ ; helix3' rU' 19 20 (* <-. *)
+ ; wc_dumas rA 12 19 (* | Distance *)
+ (* | Constraint *)
+ (* Helix 1 | 4.0 Angstroms *)
+ ; helix3' rC 3 19 (* | *)
+ ; wc_dumas rG 13 3 (* | *)
+ ; helix3' rC 2 3 (* | *)
+ ; wc_dumas rG 14 2 (* | *)
+ ; helix3' rC 1 2 (* | *)
+ ; wc_dumas rG' 15 1 (* | *)
+ (* | *)
+ (* L2 LOOP | *)
+ ; p_o3' rUs 16 15 (* | *)
+ ; p_o3' rCs 17 16 (* | *)
+ ; p_o3' rAs 18 17 (* <-' *)
+ (* *)
+ (* L1 LOOP *)
+ ; helix3' rU 7 8 (* <-. *)
+ ; p_o3' rCs 4 3 (* | Constraint *)
+ ; stacked5' rU 5 4 (* | 4.5 Angstroms *)
+ ; stacked5' rC 6 5 (* <-' *)
+ ]
+[@@ocamlformat "disable"]
+
+(* Pseudoknot constraint *)
+
+let pseudoknot_constraint v partial_inst =
+ let dist j =
+ let p = atom_pos nuc_P (get_var j partial_inst) in
+ let o3' = atom_pos nuc_O3' v in
+ pt_dist p o3'
+ in
+ if v.id = 18 then dist 19 <= 4.0 else if v.id = 6 then dist 7 <= 4.5 else true
+
+let pseudoknot () = search [] pseudoknot_domains pseudoknot_constraint
+
+(* -- TESTING ---------------------------------------------------------------*)
+
+let list_of_atoms = function
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , A (n6, n7, n9, c8, h2, h61, h62, h8) ) ->
+ [| p
+ ; o1p
+ ; o2p
+ ; o5'
+ ; c5'
+ ; h5'
+ ; h5''
+ ; c4'
+ ; h4'
+ ; o4'
+ ; c1'
+ ; h1'
+ ; c2'
+ ; h2''
+ ; o2'
+ ; h2'
+ ; c3'
+ ; h3'
+ ; o3'
+ ; n1
+ ; n3
+ ; c2
+ ; c4
+ ; c5
+ ; c6
+ ; n6
+ ; n7
+ ; n9
+ ; c8
+ ; h2
+ ; h61
+ ; h62
+ ; h8
+ |]
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , C (n4, o2, h41, h42, h5, h6) ) ->
+ [| p
+ ; o1p
+ ; o2p
+ ; o5'
+ ; c5'
+ ; h5'
+ ; h5''
+ ; c4'
+ ; h4'
+ ; o4'
+ ; c1'
+ ; h1'
+ ; c2'
+ ; h2''
+ ; o2'
+ ; h2'
+ ; c3'
+ ; h3'
+ ; o3'
+ ; n1
+ ; n3
+ ; c2
+ ; c4
+ ; c5
+ ; c6
+ ; n4
+ ; o2
+ ; h41
+ ; h42
+ ; h5
+ ; h6
+ |]
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , G (n2, n7, n9, c8, o6, h1, h21, h22, h8) ) ->
+ [| p
+ ; o1p
+ ; o2p
+ ; o5'
+ ; c5'
+ ; h5'
+ ; h5''
+ ; c4'
+ ; h4'
+ ; o4'
+ ; c1'
+ ; h1'
+ ; c2'
+ ; h2''
+ ; o2'
+ ; h2'
+ ; c3'
+ ; h3'
+ ; o3'
+ ; n1
+ ; n3
+ ; c2
+ ; c4
+ ; c5
+ ; c6
+ ; n2
+ ; n7
+ ; n9
+ ; c8
+ ; o6
+ ; h1
+ ; h21
+ ; h22
+ ; h8
+ |]
+ | N
+ ( dgf_base_tfo
+ , p_o3'_275_tfo
+ , p_o3'_180_tfo
+ , p_o3'_60_tfo
+ , p
+ , o1p
+ , o2p
+ , o5'
+ , c5'
+ , h5'
+ , h5''
+ , c4'
+ , h4'
+ , o4'
+ , c1'
+ , h1'
+ , c2'
+ , h2''
+ , o2'
+ , h2'
+ , c3'
+ , h3'
+ , o3'
+ , n1
+ , n3
+ , c2
+ , c4
+ , c5
+ , c6
+ , U (o2, o4, h3, h5, h6) ) ->
+ [| p
+ ; o1p
+ ; o2p
+ ; o5'
+ ; c5'
+ ; h5'
+ ; h5''
+ ; c4'
+ ; h4'
+ ; o4'
+ ; c1'
+ ; h1'
+ ; c2'
+ ; h2''
+ ; o2'
+ ; h2'
+ ; c3'
+ ; h3'
+ ; o3'
+ ; n1
+ ; n3
+ ; c2
+ ; c4
+ ; c5
+ ; c6
+ ; o2
+ ; o4
+ ; h3
+ ; h5
+ ; h6
+ |]
+
+let maximum = function
+ | x :: xs ->
+ let rec iter m = function
+ | [] -> m
+ | a :: b -> iter (if a > m then a else m) b
+ in
+ iter x xs
+ | _ -> assert false
+
+let var_most_distant_atom v =
+ let atoms = list_of_atoms v.n in
+ let max_dist = ref 0.0 in
+ for i = 0 to pred (Array.length atoms) do
+ let p = atoms.(i) in
+ let distance =
+ let pos = absolute_pos v p in
+ sqrt ((pos.x * pos.x) + (pos.y * pos.y) + (pos.z * pos.z))
+ in
+ if distance > !max_dist then max_dist := distance
+ done;
+ !max_dist
+
+let sol_most_distant_atom s = maximum (List.map var_most_distant_atom s)
+
+let most_distant_atom sols = maximum (List.map sol_most_distant_atom sols)
+
+let run () = most_distant_atom (pseudoknot ())
+
+let main () =
+ for _ = 1 to 50 do
+ ignore (run ())
+ done;
+ assert (abs_float (run () -. 33.7976) < 0.0002)
+
+(*
+ Printf.printf "%.4f" (run ()); print_newline()
+*)
+
+let _ = main ()
diff --git a/dependencies/packages/js_of_ocaml-compiler/js_of_ocaml.4.0.0.1_alpha-repo/opam b/dependencies/packages/js_of_ocaml-compiler/js_of_ocaml.4.0.0.1_alpha-repo/opam
new file mode 100644
index 0000000000..fc57d32ad3
--- /dev/null
+++ b/dependencies/packages/js_of_ocaml-compiler/js_of_ocaml.4.0.0.1_alpha-repo/opam
@@ -0,0 +1,41 @@
+opam-version: "2.0"
+synopsis: "Compiler from OCaml bytecode to JavaScript"
+description:
+ "Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it possible to run pure OCaml programs in JavaScript environment like browsers and Node.js"
+maintainer: "Ocsigen team "
+authors: "Ocsigen team "
+license:
+ "GPL-2.0-or-later AND LGPL-2.1-or-later WITH OCaml-LGPL-linking-exception"
+homepage: "https://ocsigen.org/js_of_ocaml/latest/manual/overview"
+doc: "https://ocsigen.org/js_of_ocaml/latest/manual/overview"
+bug-reports: "https://github.com/ocsigen/js_of_ocaml/issues"
+depends: [
+ "dune" {>= "2.9"}
+ "ocaml" {>= "4.04"}
+ "js_of_ocaml-compiler" {= version}
+ "ppxlib" {>= "0.15"}
+ "uchar"
+ "num" {with-test}
+ "ppx_expect" {>= "v0.14.2" & with-test}
+ "re" {>= "1.9.0" & with-test}
+ "odoc" {with-doc}
+]
+build: [
+ ["dune" "subst"] {dev}
+ [
+ "dune"
+ "build"
+ "-p"
+ name
+ "-j"
+ jobs
+ "--promote-install-files=false"
+ "@install"
+ "@doc" {with-doc}
+ ]
+ ["dune" "install" "-p" name "--create-install-files" name]
+]
+dev-repo: "git+https://github.com/ocsigen/js_of_ocaml.git"
+url {
+ src: "https://github.com/ocsigen/js_of_ocaml/archive/ocaml-5.tar.gz"
+}
diff --git a/dependencies/packages/num/num.1.4/opam b/dependencies/packages/num/num.1.4/opam
new file mode 100644
index 0000000000..97325574ce
--- /dev/null
+++ b/dependencies/packages/num/num.1.4/opam
@@ -0,0 +1,31 @@
+opam-version: "2.0"
+synopsis:
+ "The legacy Num library for arbitrary-precision integer and rational arithmetic"
+maintainer: "Xavier Leroy "
+authors: ["Valérie Ménissier-Morain" "Pierre Weis" "Xavier Leroy"]
+license: "LGPL-2.1-only WITH OCaml-LGPL-linking-exception"
+homepage: "https://github.com/ocaml/num/"
+bug-reports: "https://github.com/ocaml/num/issues"
+depends: [
+ "ocaml" {>= "4.06.0"}
+ "ocamlfind" {build & >= "1.7.3"}
+]
+conflicts: ["base-num"]
+build: make
+install: [
+ ["ocamlfind" "remove" "num"]
+ ["ocamlfind" "remove" "num-top"]
+ [
+ make
+ "install" {!ocaml:preinstalled}
+ "findlib-install" {ocaml:preinstalled}
+ ]
+]
+dev-repo: "git+https://github.com/ocaml/num.git"
+url {
+ src: "https://github.com/ocaml/num/archive/v1.4.tar.gz"
+ checksum: [
+ "md5=cda2b727e116a0b6a9c03902cc4b2415"
+ "sha512=0cc9be8ad95704bb683b4bf6698bada1ee9a40dc05924b72adc7b969685c33eeb68ccf174cc09f6a228c48c18fe94af06f28bebc086a24973a066da620db8e6f"
+ ]
+}
\ No newline at end of file
diff --git a/dependencies/packages/re/re.1.10.4/opam b/dependencies/packages/re/re.1.10.4/opam
new file mode 100644
index 0000000000..3845d91269
--- /dev/null
+++ b/dependencies/packages/re/re.1.10.4/opam
@@ -0,0 +1,46 @@
+opam-version: "2.0"
+
+maintainer: "rudi.grinberg@gmail.com"
+authors: [
+ "Jerome Vouillon"
+ "Thomas Gazagnaire"
+ "Anil Madhavapeddy"
+ "Rudi Grinberg"
+ "Gabriel Radanne"
+]
+license: "LGPL-2.0-or-later WITH OCaml-LGPL-linking-exception"
+homepage: "https://github.com/ocaml/ocaml-re"
+bug-reports: "https://github.com/ocaml/ocaml-re/issues"
+dev-repo: "git+https://github.com/ocaml/ocaml-re.git"
+
+build: [
+ ["dune" "subst"] {dev}
+ ["dune" "build" "-p" name "-j" jobs]
+ ["dune" "runtest" "-p" name "-j" jobs] {with-test}
+]
+
+depends: [
+ "ocaml" {>= "4.03"}
+ "dune" {>= "2.0"}
+ "ounit" {with-test}
+ "seq"
+]
+
+synopsis: "RE is a regular expression library for OCaml"
+description: """
+Pure OCaml regular expressions with:
+* Perl-style regular expressions (module Re.Perl)
+* Posix extended regular expressions (module Re.Posix)
+* Emacs-style regular expressions (module Re.Emacs)
+* Shell-style file globbing (module Re.Glob)
+* Compatibility layer for OCaml's built-in Str module (module Re.Str)
+"""
+url {
+ src:
+ "https://github.com/ocaml/ocaml-re/releases/download/1.10.4/re-1.10.4.tbz"
+ checksum: [
+ "sha256=83eb3e4300aa9b1dc7820749010f4362ea83524742130524d78c20ce99ca747c"
+ "sha512=92b05cf92c389fa8c753f2acca837b15dd05a4a2e8e2bec7a269d2e14c35b1a786d394258376648f80b4b99250ba1900cfe68230b8385aeac153149d9ce56099"
+ ]
+}
+x-commit-hash: "e9a4cecb8294c1839db18b1d0c30e755ec85ed5e"
\ No newline at end of file
diff --git a/ocaml-versions/5.0.0+trunk.json b/ocaml-versions/5.0.0+trunk.json
index 80aafd1814..a353cb8514 100644
--- a/ocaml-versions/5.0.0+trunk.json
+++ b/ocaml-versions/5.0.0+trunk.json
@@ -17,7 +17,6 @@
"irmin",
"irmin-layers",
"irmin-pack",
- "js_of_ocaml-compiler",
"ppx_derivers",
"ppx_deriving",
"ppx_deriving_yojson",
diff --git a/run_config.json b/run_config.json
index 4f4f1dd66c..4e42bb4f79 100644
--- a/run_config.json
+++ b/run_config.json
@@ -547,8 +547,8 @@
],
"runs": [
{
- "params": "--disable=check-magic-number %{bin:frama-c.byte}",
- "short_name": "frama-c_byte"
+ "params": "--disable=check-magic-number %{bin:frankenstein.byte}",
+ "short_name": "frankenstein_byte"
}
]
},