Skip to content

Commit 04364d1

Browse files
author
Christian Schafmeisterr
committed
More changes to support new shape-keys
1 parent f3e2fd1 commit 04364d1

File tree

7 files changed

+85
-76
lines changed

7 files changed

+85
-76
lines changed

src/lisp/topology/assembler.lisp

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ Specialize the foldamer argument to provide methods"))
560560
(t (error "Illegal value for monomer-subset ~s - must be NIL or a hash-table"))))
561561

562562
(defun maybe-update-shape-key-cache (assembler internals)
563-
(error "How do I use internals")
563+
(error "Don't use the shape-key-cahce in the monomer-shape")
564564
(loop for oligomer-shape in (oligomer-shapes assembler)
565565
for rotamers-database = (rotamers-database oligomer-shape)
566566
for foldamer-name = (foldamer-name rotamers-database)
@@ -711,6 +711,7 @@ ENERGY-FUNCTION-FACTORY - If defined, call this with the aggregate to make the e
711711
when external-adjusts
712712
do (loop for adjust in external-adjusts
713713
do (initialize-adjustment adjust assembler))))
714+
#+(or)
714715
(unless monomer-subset
715716
(error "I don't think I want to update the internals now that there isn't built in internals")
716717
;; update the internals so we can build dihedral caches
@@ -903,47 +904,47 @@ ENERGY-FUNCTION-FACTORY - If defined, call this with the aggregate to make the e
903904

904905

905906

906-
(defun build-atom-tree-external-coordinates* (assembler coords oligomer-shape maybe-orientation)
907+
(defun build-atom-tree-external-coordinates* (assembler assembler-internals coords oligomer-shape maybe-orientation)
907908
(let* ((orientation (orientation maybe-orientation assembler))
908909
(one-oligomer (oligomer oligomer-shape))
909910
(joints (gethash one-oligomer (root-map (joint-tree assembler)))))
910911
(when (null joints)
911912
(error "Could not find oligomer ~s in root-map ~s" one-oligomer (root-map (joint-tree assembler))))
912913
(with-orientation orientation
913914
(loop for joint in joints
914-
do (update-xyz-coords assembler internals joint coords)))))
915+
do (update-xyz-coords assembler assembler-internals joint coords)))))
915916

916917

917-
(defun build-atom-tree-for-monomer-shape-external-coordinates* (assembler coords oligomer-shape monomer-shape maybe-orientation)
918+
(defun build-atom-tree-for-monomer-shape-external-coordinates* (assembler assembler-internals coords oligomer-shape monomer-shape maybe-orientation)
918919
(let* ((orientation (orientation maybe-orientation assembler))
919920
(one-oligomer (oligomer oligomer-shape))
920921
(joints (gethash one-oligomer (root-map (joint-tree assembler)))))
921922
(when (null joints)
922923
(error "Could not find oligomer ~s in root-map ~s" one-oligomer (root-map (joint-tree assembler))))
923924
(with-orientation orientation
924925
(loop for joint in joints
925-
do (update-xyz-coords assembler internals joint coords)))))
926+
do (update-xyz-coords assembler assembler-internals joint coords)))))
926927

927928

928-
(defun adjust-atom-tree-external-coordinates (assembler coords oligomer-shape)
929+
(defun adjust-atom-tree-external-coordinates (assembler assembler-internals coords oligomer-shape)
929930
(let* ((pos (position oligomer-shape (oligomer-shapes assembler)))
930931
(atmol (elt (atmolecules (ataggregate assembler)) pos)))
931932
(loop for atres across (atresidues atmol)
932933
for adjustments = (gethash atres (external-adjustments (adjustments assembler)))
933934
do (loop for adjustment in adjustments
934-
do (external-adjust adjustment assembler coords)))))
935+
do (external-adjust adjustment assembler assembler-internals coords)))))
935936

936-
(defun adjust-all-atom-tree-external-coordinates (assembler coords)
937+
(defun adjust-all-atom-tree-external-coordinates (assembler assembler-internals coords)
937938
(loop for oligomer-shape in (oligomer-shapes assembler)
938-
do (adjust-atom-tree-external-coordinates assembler coords oligomer-shape)))
939+
do (adjust-atom-tree-external-coordinates assembler assembler-internals coords oligomer-shape)))
939940

940941
(defun build-all-atom-tree-external-coordinates-and-adjust (assembler coords)
941942
(loop for oligomer-shape in (oligomer-shapes assembler)
942-
do (build-atom-tree-external-coordinates-and-adjust assembler coords oligomer-shape oligomer-shape)))
943+
do (build-atom-tree-external-coordinates-and-adjust assembler assembler-internals coords oligomer-shape oligomer-shape)))
943944

944-
(defun build-atom-tree-external-coordinates-and-adjust (assembler coords oligomer-shape maybe-orientation)
945-
(build-atom-tree-external-coordinates* assembler coords oligomer-shape maybe-orientation)
946-
(adjust-atom-tree-external-coordinates assembler coords oligomer-shape))
945+
(defun build-atom-tree-external-coordinates-and-adjust (assembler assembler-internals coords oligomer-shape maybe-orientation)
946+
(build-atom-tree-external-coordinates* assembler assembler-internals coords oligomer-shape maybe-orientation)
947+
(adjust-atom-tree-external-coordinates assembler assembler-internals coords oligomer-shape))
947948

948949
#+(or)
949950
(defun build-atresidue-atom-tree-external-coordinates (assembler atresidue coords)
@@ -1363,8 +1364,8 @@ Return the COORDS."
13631364
(let ((orientation (lookup-orientation assembler orientation)))
13641365
(when (and oligomer-shape (not orientationp))
13651366
(error "You must provide orientation when you provide oligomer-shape"))
1366-
(build-atom-tree-external-coordinates* assembler coords oligomer-shape orientation)
1367-
(adjust-atom-tree-external-coordinates assembler coords oligomer-shape)
1367+
(build-atom-tree-external-coordinates* assembler assembler-internals coords oligomer-shape orientation)
1368+
(adjust-atom-tree-external-coordinates assembler assembler-internals coords oligomer-shape)
13681369
(when (local-frame-specs orientation)
13691370
(transform-externals-to-global-frame assembler oligomer-shape orientation coords))
13701371
)
@@ -1392,4 +1393,4 @@ Return the COORDS."
13921393
(joint0 (elt joints 0)))
13931394
(with-orientation orientation
13941395
(update-xyz-coords assembler assembler-internals joint0 coords))
1395-
(adjust-atom-tree-external-coordinates assembler coords oligomer-shape)))
1396+
(adjust-atom-tree-external-coordinates assembler assembler-internals coords oligomer-shape)))

src/lisp/topology/internals.lisp

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,35 @@
55
(defparameter *-pi-s* (- (float PI 1.0s0)))
66
(defconstant +bin-size+ 10 )
77

8+
(defgeneric shape-key-for-sidechain-monomer (foldamer monomer-context oligomer-shape focus-monomer)
9+
(:documentation "Return a shape-key for the sidechain-monomer"))
10+
11+
(defun transform-string (input)
12+
"Remove parentheses and spaces; replace periods with underscores; copy other characters."
13+
(with-output-to-string (out)
14+
(loop for ch across input
15+
if (member ch '(#\Space #\( #\) #\: #\.))
16+
do (write-char #\_ out)
17+
else
18+
do (write-char ch out))))
819

9-
(defclass shape-key (cando.serialize:serializable)
10-
((parts :initarg :parts :reader parts)))
11-
12-
(defmethod print-object ((shape-key shape-key) stream)
13-
(if *print-readably*
14-
(call-next-method)
15-
(print-unreadable-object (shape-key stream :type t)
16-
(format stream "~s" (parts shape-key)))))
20+
(defun shape-key-as-pathname-part (shape-key)
21+
(format nil "shape-key-~a" (transform-string (format nil "~a" shape-key))))
1722

23+
(defun shape-key-parts (shape-key)
24+
shape-key)
1825

1926
(defun make-shape-key (&rest pparts)
20-
(make-instance 'shape-key :parts pparts))
27+
pparts)
2128

2229
(defun ensure-shape-key (shape-key)
23-
(unless (typep shape-key 'shape-key)
30+
(unless (consp shape-key)
2431
(error "The shape-key ~s must be a shape-key" shape-key))
2532
shape-key)
2633

2734

28-
(defclass shape-key-map ()
29-
((ht :initarg :ht :reader ht)))
30-
31-
(defun shape-key-map-hash (value)
32-
(sxhash (parts value)))
33-
34-
(defun shape-key-map-test (v1 v2)
35-
(equal (parts v1) (parts v2)))
36-
3735
(defmethod make-shape-key-map ()
38-
(make-hash-table :hash-function #'shape-key-map-hash :test #'shape-key-map-test))
39-
36+
(make-hash-table :test 'equal))
4037

4138

4239
(defclass dihedral-range (cando.serialize:serializable)
@@ -453,7 +450,7 @@ changing the SHAPE-KEY-CACHE."
453450

454451

455452
(defclass sidechain-rotamers (rotamers)
456-
((shape-key-to-index :initarg :shape-key-to-index :initform (make-hash-table :test 'equal) :accessor shape-key-to-index
453+
((shape-key-to-index :initarg :shape-key-to-index :initform (make-shape-key-map) :accessor shape-key-to-index
457454
:documentation "This is a cons of (phi.psi)")))
458455

459456
(defclass backbone-rotamers-base (rotamers) ())

src/lisp/topology/joint-templates.lisp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@
4141

4242
(defgeneric initialize-adjustment (adjustment assembler))
4343

44-
(defgeneric external-adjust (adjustment assembler coordinates))
45-
(defmethod external-adjust ((adjustment internal-adjustment) assembler coordinates)
44+
(defgeneric external-adjust (adjustment assembler assembler-internals coordinates))
45+
(defmethod external-adjust ((adjustment internal-adjustment) assembler assembler-internals coordinates)
4646
"default - don't do anything"
4747
nil)
4848

src/lisp/topology/manipulator.lisp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -904,18 +904,22 @@ while nesting several WITH-CPRING5 forms."
904904
do (build-internals-from-cpinternals (assembler manipulator) driver internals temp-externals cpinternals)))
905905
(call-next-method))
906906

907-
(defun fscale-frac (num &optional (bin-size 0.01))
907+
(defparameter +fscale-frac-bin-size+ 0.05) ; Bin Cremer-Pople q-values in 0.05 value bin sizes - it was 0.01 but that generates too many shape-key
908+
(defparameter +fscale-deg-bin-size+ 5) ; Bin angles in 5-degree bin sizes - it was 1-degree but that generates too many shape-key
909+
910+
(defun fscale-frac (num &optional (bin-size +fscale-frac-bin-size+))
908911
(floor (fround (/ num bin-size))))
909912

910-
(defun fscale-frac-reverse (int &optional (bin-size 0.01))
913+
(defun fscale-frac-reverse (int &optional (bin-size +fscale-frac-bin-size+))
911914
(* int bin-size))
912915

913-
(defun fscale-deg (num &optional (bin-size 1))
916+
(defun fscale-deg (num &optional (bin-size +fscale-deg-bin-size+))
914917
(floor (fround (/ (topology:rad-to-deg num) bin-size))))
915918

916-
(defun fscale-deg-reverse (int &optional (bin-size 1))
919+
(defun fscale-deg-reverse (int &optional (bin-size +fscale-deg-bin-size+))
917920
(topology:deg-to-rad (* int bin-size)))
918921

922+
919923
(defgeneric binned-shape-key (driver cpinternals))
920924
(defgeneric binned-shape-key-write (driver cpinternals shape-key))
921925

src/lisp/topology/packages.lisp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@
249249
#:foldamer
250250
#:shape-info
251251
#:shape-key
252-
#:parts
252+
#:shape-key-parts
253253
#:ensure-shape-key
254254
#:validate-shape-key
255255
#:make-shape-key-old-style
@@ -587,7 +587,11 @@
587587
#:binned-shape-key-write
588588
#:ring-joints
589589
#:ring-driver-distance-angle-arrays
590-
#:build-only-ring-externals-from-cpinternals))
590+
#:build-only-ring-externals-from-cpinternals
591+
#:shape-key-as-pathname-part
592+
#:shape-key-monomers-callback
593+
#:make-shape-key-callback
594+
#:shape-key-for-sidechain-monomer))
591595

592596
(defpackage #:topology.dag
593597
(:use #:common-lisp)

src/lisp/topology/shape.lisp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ If ORIGINAL-ROTAMER-SHAPE is defined then it must be a ROTAMER-SHAPE and we copy
8282
(molecule :initarg :molecule :reader molecule)))
8383

8484
(defclass backbone-residue-shape (residue-shape)
85-
((shape-key-cache-deg :initarg :shape-key-cache-deg
85+
(#+(or)(shape-key-cache-deg :initarg :shape-key-cache-deg
8686
:accessor shape-key-cache-deg)))
8787

8888
(defmethod copy-monomer-shape ((residue-shape residue-shape))
@@ -583,6 +583,7 @@ If UNINITIALIZED then leave them unbound."
583583

584584

585585
(defun lookup-dihedral-cache-impl (oligomer-shape monomer-shape dihedral-name &key ignore-degrees)
586+
(error "Don't use this - lookup the dihedral cache in the rotamer database")
586587
(let* ((monomer-shape-index (position monomer-shape (monomer-shape-vector oligomer-shape)))
587588
(monomer-shape-info (aref (monomer-shape-info-vector oligomer-shape) monomer-shape-index))
588589
(monomer (monomer monomer-shape-info))
@@ -664,11 +665,12 @@ If UNINITIALIZED then leave them unbound."
664665
(write-rotamers oligomer-shape ss (random-rotamers ss))
665666
(let* ((ass (make-assembler (list oligomer-shape)))
666667
(coords (make-coordinates-for-assembler ass))
668+
(internals (make-internals-for-assembler ass))
667669
)
668-
(update-internals ass :oligomer-shape oligomer-shape)
669-
(update-externals ass :oligomer-shape oligomer-shape
670-
:orientation oligomer-shape
671-
:coords coords)
670+
(update-internals ass internals :oligomer-shape oligomer-shape)
671+
(update-externals ass internals :oligomer-shape oligomer-shape
672+
:orientation oligomer-shape
673+
:coords coords)
672674
(copy-all-joint-positions-into-atoms ass coords)
673675
(aggregate ass)))))
674676

@@ -686,9 +688,10 @@ If UNINITIALIZED then leave them unbound."
686688
(defmethod aggregate ((oligomer-shape oligomer-shape))
687689
"Generate a unique aggregate for the OLIGOMER-SHAPE. This can be called multiple times and each time a new, unique aggregate will be generated."
688690
(let* ((ass (make-assembler (list oligomer-shape)))
689-
(coords (make-coordinates-for-assembler ass)))
690-
(update-internals ass :oligomer-shape oligomer-shape)
691-
(build-all-atom-tree-external-coordinates-and-adjust ass coords)
691+
(coords (make-coordinates-for-assembler ass))
692+
(internals (make-internals-for-assembler ass)))
693+
(update-internals ass internals :oligomer-shape oligomer-shape)
694+
(build-all-atom-tree-external-coordinates-and-adjust ass internals coords)
692695
(copy-all-joint-positions-into-atoms ass coords)
693696
(chem:matter-copy (aggregate ass))))
694697

src/lisp/topology/steppers.lisp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,28 @@
2727

2828
(defun calculate-allowed-rotamers (monomer-shape-index sidechain-monomer-shape sidechain-monomer-shape-info oligomer-shape shape-key-to-allowed-rotamers)
2929
(declare (ignorable monomer-shape-index))
30-
#+debug-mover
31-
(let ((*print-pretty* nil))
32-
(format t "calculate-allowed-rotamers monomer-shape-index ~a~%" monomer-shape-index))
33-
(let* ((phi-deg (topology:lookup-dihedral-cache oligomer-shape sidechain-monomer-shape :phi))
34-
(psi-deg (topology:lookup-dihedral-cache oligomer-shape sidechain-monomer-shape :psi))
35-
(shape-key nil)
36-
(result (if (and phi-deg psi-deg)
37-
(progn
38-
(setf shape-key (make-phi-psi phi-deg psi-deg))
39-
(gethash shape-key shape-key-to-allowed-rotamers))
40-
nil)))
41-
(unless result
42-
(let* ((*print-pretty* nil)
43-
(monomer (monomer sidechain-monomer-shape-info)))
44-
(error 'no-rotamers :message (format nil "Found no allowed-rotamers for ~s - phi-deg: ~s psi-deg: ~s - shape-key ~s - ~s in ~s - this shouldn't be possible if a backbone-stepper was created and applied to the oligomer-shape" monomer phi-deg psi-deg shape-key sidechain-monomer-shape oligomer-shape))))
45-
(when (= 0 (length result))
46-
(error 'no-rotamers :message (format nil "The resulting rotamers vector is empty for shape-key ~s - available keys ~s" shape-key (alexandria:hash-table-keys shape-key-to-allowed-rotamers))))
47-
#+debug-mover
48-
(let ((*print-pretty* nil))
49-
(format t " calculate-allowed-rotamers phi-deg ~d psi-deg ~d allowed-rotamers -> ~s~%" phi-deg psi-deg result))
50-
result
51-
))
30+
#+debug-mover
31+
(let ((*print-pretty* nil))
32+
(format t "calculate-allowed-rotamers monomer-shape-index ~a~%" monomer-shape-index))
33+
(let* ((foldamer (foldamer (oligomer-space oligomer-shape))))
34+
(multiple-value-bind (shape-key rotamers monomer-contexts)
35+
(shape-key-for-sidechain-monomer foldamer
36+
(monomer-context sidechain-monomer-shape-info)
37+
oligomer-shape
38+
(monomer sidechain-monomer-shape-info))
39+
(let ((result (gethash shape-key shape-key-to-allowed-rotamers)))
40+
(unless result
41+
(let* ((*print-pretty* nil)
42+
(monomer (monomer sidechain-monomer-shape-info)))
43+
(error 'no-rotamers :message (format nil "Found no allowed-rotamers for ~s~%- monomer-context: ~s~%- shape-key ~s - ~s in ~s~%- this shouldn't be possible if a backbone-stepper was created and applied to the oligomer-shape~%- backbone rotamers: ~{bb ~s~%~}- monomer-contexts: ~s" monomer (monomer-context sidechain-monomer-shape-info)
44+
shape-key sidechain-monomer-shape oligomer-shape rotamers monomer-contexts))))
45+
(when (= 0 (length result))
46+
(error 'no-rotamers :message (format nil "The resulting rotamers vector is empty for shape-key ~s - available keys ~s" shape-key (alexandria:hash-table-keys shape-key-to-allowed-rotamers))))
47+
#+debug-mover
48+
(let ((*print-pretty* nil))
49+
(format t " calculate-allowed-rotamers phi-deg ~d psi-deg ~d allowed-rotamers -> ~s~%" phi-deg psi-deg result))
50+
result
51+
))))
5252

5353
(defclass permissible-rotamer ()
5454
((monomer-shape-locus :initarg :monomer-shape-locus :reader monomer-shape-locus)

0 commit comments

Comments
 (0)