ICM Manual v.3.9
by Ruben Abagyan,Eugene Raush and Max Totrov
Copyright © 2020, Molsoft LLC
Jun 5 2024

Reference Guide
Command Line User's Guide
 ICM graphics
  Main concepts
  Crystal symmetry transformation
  Define axis
  Combine transformations
  Build helix
 PROTAC Modeling
 Chemical Conformation Generator
PrevICM Language Reference
Transformations and symmetry

[ Main concepts | Crystal symmetry transformation | Define axis | Combine transformations | Build helix ]

This section describes geometrical transformations of molecular objects and manipulations with crystallographic symmetry.

Main concepts and functions

Molecular objects and 3D density maps may contain symmetry information. This information allows one to generate symmetry related parts of the density or molecular objects.
An elementary space transformation is defined by a rarray where values {a1,a2,...,a12} define 3x3 rotation matrix and translation vector {a4,a8,a12}. The complete augmented affine 4x4 transformation matrix in direct space can be presented as:
   a1  a2  a3  | a4 
   a5  a6  a7  | a8 
   a9  a10 a11 | a12 
   0.  0.  0.  | 1. 
The related commands and functions (transformation vector will be referred to as R_tv):
Axis ( R_tv )calculates the rotation axis R_3 of the transformation. Rotation angle is returned in r_out .
Augment ( R_tv) converts 12-membered transformation vector into the augmented transformation matrix 4x4.
Cell ( os_ )returns {a,b,c,alpha,beta,gamma} of the unit cell
Rmsd ( as_1 as_2 [ exact ])returns R_tv in R_out
Rot ( R_tv )extracts the 3x3 rotation matrix
Rot ( R_center R_axis r_angle )returns rotation matrix for the rotate command
rotate ms_ M_rotationMatrixrotates selected molecules
superimpose as_1 as_2 ...returns R_tv in R_out
Symgroup ( i_spaceGroupNumber )returns a chain (R_[1:12*n]) of all n transformation vectors composing the specified space group.
Symgroup ( s_groupName )returns the i_spaceGroupNumber from which the transformations can be determined.
transform ms_ R_tv applies transformation to an object.
Trans ( R_tv )extracts the translation 3-vector which is applied after rotation

How to generate symmetry related molecules

There are three steps:
  • define symmetry
  • find elementary transformation
  • apply the transformation with the transform command.
Objects read with the read pdb or read csd commands grab the symmetry information from the files. Otherwise assign the symmetry with the set symmetry os_ s_spaceGroupName R_6cell i_NofMolecules command. This way you may define your own set of symmetry transformations. Finally, loop through all the transformations and aplly the transform command.
Example: see example in the transform command or paste the following lines into your ICM session:
 read csd "qfuran" 
 for i=2,Nof(Symgroup(Symgroup(a_)))/12 * 2 # 2 elem.cells will be filled 
   copy a_1. "a"+i 
   transform a_a$i. i-1  
 color ml a_*. 
 gcell=Grob("cell",Cell( )) 
 obl=Augment(Cell( ))          # this will work also for any oblique matrix 
 g1 = gcell + (-1)*obl[1:3,2]  # shift cell by a-vector 
 g2 = g1 + obl[1:3,3] 
 display gcell g1 g2 
 print " cell=" Cell( ) "\n Symgroup=" Symgroup(a_) \ 
       "Nof.sym.=" Nof(Symgroup(Symgroup(a_)))/12 

How to find and display rotation/screw transformation axis

  • find the transformation with the Rmsd( as_sub1 as_sub2 exact) function. It returns the transformation vector in the R_out system variable.
  • find the axis with the Axis( R_out) function. This function also return a point at the axis in R_out and the rotation angle in r_out
  • display the axis with the Grob( "arrow", R_6 ) function.

 read obj "crn"  # let us display an axis of the alpha helix 7:17 
 ds a_/7:17 
 R1=Mean(Xyz(a_/7:17/ca))  # this point will be projected onto the axis 
 show Rmsd(a_/7:16/ca a_/8:17/ca exact ) # find the transformation 
 aa=Axis(vv) # now R_out contains xyz of a point at the axis 
 print "The rotation angle is ",r_out 
 # grob + V3 translates grob by V3  
 gg=Grob("arrow",aa )*10.+ Sum((R1-R_out)*aa)*aa+R_out # projection of R1 on aa 
 display gg 
#Symmetry of an extended fragment 
 delete object 
 build string "se ala ala ala ala ala ala ala ala ala ala ala ala" 
 R1=Mean(Xyz(a_/*/ca))    # this point will be projected onto the axis 
 show Rmsd(a_/2:12/ca a_/1:11/ca exact ) 
 print "The rotation angle is ",r_out 
 gg=Grob("arrow",aa )*10.+ Sum((R1-R_out)*aa)*aa+R_out # projection of R1 on aa 
 display gg 

Now you can rotate your selection of molecules around the axis aa with the rotate command and the Rot( R_center R_axis r_angle ) function, e.g.
 for i=0,360,30 
  rotate a_1 Rot( R1 aa Real(i) ) 

How to combine several transformations

To combine several transformations simply multiply their augmented matrices.
 tv = Symgroup(19)   # 12*4 vector of the P212121 symmetry group 
 tv1 = tv[13:24]     # grab the second transformation of the symmetry group  
                     # the first is the identity transformation  
 tv2 = tv[37:48]     # grab the last transformation of the symmetry group 
 tvComb = Vector(Augment(tv1)*Augment(tv2))      # self-explanatory  
 show tvComb         # you can apply it now with the transform command  

How to build a helix from the two contacting monomers

Two steps:
  • find the transformation from the two coordinate sets
  • apply the transformation as many times as you need
The transformation may be helical or (a degenerate case) a rotational.
 read pdb s_icmhome + "chq" # download two molecules related by a rot. symmetry 
 display a_*.  
 R1=Mean(Xyz(a_/*/ca))      # this point will be projected onto the axis 
 show Rmsd( a_2 a_1 exact)  # we assume that molecules are the same 
 tv = R_out                 # this is the transformation 12-vector 
 ha = r_out                 # rotation angle  (just FYI) 
 delete a_2                 # we will regenerate the 2nd molecule anyway 
 rename a_1. "s1" 
 for i=1,4                  # build a helix with 4 new elements 
   copy a_s$i. "s"+j        # names for a new subunits: s2,s3,s4,s5,s6 
   transform a_s$j. tv      # apply tv to the last copied object  
 print "The rotation angle is ",r_out 
 g_ax=Grob("arrow",aa )*10.+ Sum((R1-R_out)*aa)*aa+R_out 
                            # projection of R1 on aa  
 display a_*. g_ax 
 color a_*. Count(Nof(a_*.)) 

Image frame by frame

Copyright© 1989-2024, Molsoft,LLC - All Rights Reserved. Copyright© 1989-2024, Molsoft,LLC - All Rights Reserved. This document contains proprietary and confidential information of Molsoft, LLC. The content of this document may not be disclosed to third parties, copied or duplicated in any form, in whole or in part, without the prior written permission from Molsoft, LLC.