# # This MMTK/Python script is used to position a set of "Lego"-block like # molecules as described in my paper for MNT6. # writtern by Peter McCluskey (pcm@rahul.net) # from mmtk import * import sys import Units import Positioner from ConfigIO import * ff = GenericForceField('mm3') world = InfiniteUniverse(ff) result = load('result.lego7.sav') def rotate3(alist, dir): if dir == 0: return alist if dir == 120: return [alist[2]] + alist[0:2] return alist[1:3] + [alist[0]] # dir is -120 world.addObject(result) obj_list = [result] poslist = [(120, 'hole2', 'knob1'),\ (-120, 'knob2', 'hole1'),\ (120, 'hole2', 'knob1'),\ (-120, 'knob2', 'hole1'),\ (120, 'hole2', 'knob1')] for (dir, end1, end2) in poslist: obj1 = obj_list[-1] molecule2 = load('result.lego7.sav') obj2 = molecule2 if end1[0:4] == 'knob': attach2 = getattr(obj2, end2) attach1 = rotate3(getattr(obj1, end1), dir) else: attach1 = getattr(obj1, end1) attach2 = rotate3(getattr(obj2, end2), dir) PositionAdjacent(obj1, attach1, obj2, attach2, [2*Units.Ang]*3) world.addObject(molecule2) obj_list.append(molecule2) save(world,'legoworld.mmtk') import RasMol ras_session = RasMol.RasMol(world, 1) ras_session.Interact() from ConfigIO import OutputFile fmt = OutputFile('PDB/legoworld.pdb', 'pdb.connect') fmt.write(world) fmt.close()