def writeHeader(topology, file=sys.stdout, entry=None): """Write out the header for a PDBx/mmCIF file. Parameters ---------- topology : Topology The Topology defining the molecular system being written file : file=stdout A file to write the file to entry : str=None The entry ID to assign to the CIF file """ if entry is not None: print('data_%s' % entry, file=file) else: print('data_cell', file=file) print("# Created with OpenMM %s, %s" % (Platform.getOpenMMVersion(), str(date.today())), file=file) print('#', file=file) vectors = topology.getPeriodicBoxVectors() if vectors is not None: a, b, c, alpha, beta, gamma = computeLengthsAndAngles(vectors) RAD_TO_DEG = 180 / math.pi print('_cell.length_a %10.4f' % (a * 10), file=file) print('_cell.length_b %10.4f' % (b * 10), file=file) print('_cell.length_c %10.4f' % (c * 10), file=file) print('_cell.angle_alpha %10.4f' % (alpha * RAD_TO_DEG), file=file) print('_cell.angle_beta %10.4f' % (beta * RAD_TO_DEG), file=file) print('_cell.angle_gamma %10.4f' % (gamma * RAD_TO_DEG), file=file) print('##', file=file) print('loop_', file=file) print('_atom_site.group_PDB', file=file) print('_atom_site.id', file=file) print('_atom_site.type_symbol', file=file) print('_atom_site.label_atom_id', file=file) print('_atom_site.label_alt_id', file=file) print('_atom_site.label_comp_id', file=file) print('_atom_site.label_asym_id', file=file) print('_atom_site.label_entity_id', file=file) print('_atom_site.label_seq_id', file=file) print('_atom_site.pdbx_PDB_ins_code', file=file) print('_atom_site.Cartn_x', file=file) print('_atom_site.Cartn_y', file=file) print('_atom_site.Cartn_z', file=file) print('_atom_site.occupancy', file=file) print('_atom_site.B_iso_or_equiv', file=file) print('_atom_site.Cartn_x_esd', file=file) print('_atom_site.Cartn_y_esd', file=file) print('_atom_site.Cartn_z_esd', file=file) print('_atom_site.occupancy_esd', file=file) print('_atom_site.B_iso_or_equiv_esd', file=file) print('_atom_site.pdbx_formal_charge', file=file) print('_atom_site.auth_seq_id', file=file) print('_atom_site.auth_comp_id', file=file) print('_atom_site.auth_asym_id', file=file) print('_atom_site.auth_atom_id', file=file) print('_atom_site.pdbx_PDB_model_num', file=file)
def writeHeader(topology, file=sys.stdout, entry=None): """Write out the header for a PDBx/mmCIF file. Parameters ---------- topology : Topology The Topology defining the molecular system being written file : file=stdout A file to write the file to entry : str=None The entry ID to assign to the CIF file """ if entry is not None: print('data_%s' % entry, file=file) else: print('data_cell', file=file) print("# Created with OpenMM %s, %s" % (Platform.getOpenMMVersion(), str(date.today())), file=file) print('#', file=file) vectors = topology.getPeriodicBoxVectors() if vectors is not None: a, b, c, alpha, beta, gamma = computeLengthsAndAngles(vectors) RAD_TO_DEG = 180/math.pi print('_cell.length_a %10.4f' % (a*10), file=file) print('_cell.length_b %10.4f' % (b*10), file=file) print('_cell.length_c %10.4f' % (c*10), file=file) print('_cell.angle_alpha %10.4f' % (alpha*RAD_TO_DEG), file=file) print('_cell.angle_beta %10.4f' % (beta*RAD_TO_DEG), file=file) print('_cell.angle_gamma %10.4f' % (gamma*RAD_TO_DEG), file=file) print('##', file=file) print('loop_', file=file) print('_atom_site.group_PDB', file=file) print('_atom_site.id', file=file) print('_atom_site.type_symbol', file=file) print('_atom_site.label_atom_id', file=file) print('_atom_site.label_alt_id', file=file) print('_atom_site.label_comp_id', file=file) print('_atom_site.label_asym_id', file=file) print('_atom_site.label_entity_id', file=file) print('_atom_site.label_seq_id', file=file) print('_atom_site.pdbx_PDB_ins_code', file=file) print('_atom_site.Cartn_x', file=file) print('_atom_site.Cartn_y', file=file) print('_atom_site.Cartn_z', file=file) print('_atom_site.occupancy', file=file) print('_atom_site.B_iso_or_equiv', file=file) print('_atom_site.Cartn_x_esd', file=file) print('_atom_site.Cartn_y_esd', file=file) print('_atom_site.Cartn_z_esd', file=file) print('_atom_site.occupancy_esd', file=file) print('_atom_site.B_iso_or_equiv_esd', file=file) print('_atom_site.pdbx_formal_charge', file=file) print('_atom_site.auth_seq_id', file=file) print('_atom_site.auth_comp_id', file=file) print('_atom_site.auth_asym_id', file=file) print('_atom_site.auth_atom_id', file=file) print('_atom_site.pdbx_PDB_model_num', file=file)
def writeHeader(topology, file=sys.stdout): """Write out the header for a PDB file. Parameters: - topology (Topology) The Topology defining the molecular system being written - file (file=stdout) A file to write the file to """ print >>file, "REMARK 1 CREATED WITH OPENMM %s, %s" % (Platform.getOpenMMVersion(), str(date.today())) boxSize = topology.getUnitCellDimensions() if boxSize is not None: size = boxSize.value_in_unit(angstroms) print >>file, "CRYST1%9.3f%9.3f%9.3f 90.00 90.00 90.00 P 1 1 " % size
def writeHeader(topology, file=sys.stdout): """Write out the header for a PDB file. Parameters ---------- topology : Topology The Topology defining the molecular system being written file : file=stdout A file to write the file to """ print("REMARK 1 CREATED WITH OPENMM %s, %s" % (Platform.getOpenMMVersion(), str(date.today())), file=file) vectors = topology.getPeriodicBoxVectors() if vectors is not None: a, b, c, alpha, beta, gamma = computeLengthsAndAngles(vectors) RAD_TO_DEG = 180/math.pi print("CRYST1%9.3f%9.3f%9.3f%7.2f%7.2f%7.2f P 1 1 " % ( a*10, b*10, c*10, alpha*RAD_TO_DEG, beta*RAD_TO_DEG, gamma*RAD_TO_DEG), file=file)
def writeHeader(topology, file=sys.stdout): """Write out the header for a PDB file. Parameters: - topology (Topology) The Topology defining the molecular system being written - file (file=stdout) A file to write the file to """ print >> file, "REMARK 1 CREATED WITH OPENMM %s, %s" % ( Platform.getOpenMMVersion(), str(date.today())) vectors = topology.getPeriodicBoxVectors() if vectors is not None: (a, b, c) = vectors.value_in_unit(angstroms) a_length = norm(a) b_length = norm(b) c_length = norm(c) alpha = math.acos(dot(b, c) / (b_length * c_length)) * 180.0 / math.pi beta = math.acos(dot(c, a) / (c_length * a_length)) * 180.0 / math.pi gamma = math.acos(dot(a, b) / (a_length * b_length)) * 180.0 / math.pi print >> file, "CRYST1%9.3f%9.3f%9.3f%7.2f%7.2f%7.2f P 1 1 " % ( a_length, b_length, c_length, alpha, beta, gamma)
def writeHeader(topology, file=sys.stdout, entry=None, keepIds=False): """Write out the header for a PDBx/mmCIF file. Parameters ---------- topology : Topology The Topology defining the molecular system being written file : file=stdout A file to write the file to entry : str=None The entry ID to assign to the CIF file keepIds : bool=False If True, keep the residue and chain IDs specified in the Topology rather than generating new ones. Warning: It is up to the caller to make sure these are valid IDs that satisfy the requirements of the PDBx/mmCIF format. Otherwise, the output file will be invalid. """ if entry is not None: print('data_%s' % entry, file=file) else: print('data_cell', file=file) print("# Created with OpenMM %s, %s" % (Platform.getOpenMMVersion(), str(date.today())), file=file) print('#', file=file) vectors = topology.getPeriodicBoxVectors() if vectors is not None: a, b, c, alpha, beta, gamma = computeLengthsAndAngles(vectors) RAD_TO_DEG = 180/math.pi print('_cell.length_a %10.4f' % (a*10), file=file) print('_cell.length_b %10.4f' % (b*10), file=file) print('_cell.length_c %10.4f' % (c*10), file=file) print('_cell.angle_alpha %10.4f' % (alpha*RAD_TO_DEG), file=file) print('_cell.angle_beta %10.4f' % (beta*RAD_TO_DEG), file=file) print('_cell.angle_gamma %10.4f' % (gamma*RAD_TO_DEG), file=file) print('#', file=file) # Identify bonds that should be listed in the file. bonds = [] for atom1, atom2 in topology.bonds(): if atom1.residue.name not in PDBFile._standardResidues or atom2.residue.name not in PDBFile._standardResidues: bonds.append((atom1, atom2)) elif atom1.name == 'SG' and atom2.name == 'SG' and atom1.residue.name == 'CYS' and atom2.residue.name == 'CYS': bonds.append((atom1, atom2)) if len(bonds) > 0: # Write the bond information. print('loop_', file=file) print('_struct_conn.id', file=file) print('_struct_conn.conn_type_id', file=file) print('_struct_conn.ptnr1_label_asym_id', file=file) print('_struct_conn.ptnr1_label_comp_id', file=file) print('_struct_conn.ptnr1_label_seq_id', file=file) print('_struct_conn.ptnr1_label_atom_id', file=file) print('_struct_conn.ptnr2_label_asym_id', file=file) print('_struct_conn.ptnr2_label_comp_id', file=file) print('_struct_conn.ptnr2_label_seq_id', file=file) print('_struct_conn.ptnr2_label_atom_id', file=file) chainIds = {} resIds = {} if keepIds: for chain in topology.chains(): chainIds[chain] = chain.id for res in topology.residues(): resIds[res] = res.id else: for (chainIndex, chain) in enumerate(topology.chains()): chainIds[chain] = chr(ord('A')+chainIndex%26) for (resIndex, res) in enumerate(chain.residues()): resIds[res] = resIndex+1 for i, (atom1, atom2) in enumerate(bonds): if atom1.residue.name == 'CYS' and atom2.residue.name == 'CYS': bondType = 'disulf' else: bondType = 'covale' line = "bond%d %s %s %-4s %5s %-4s %s %-4s %5s %-4s" print(line % (i+1, bondType, chainIds[atom1.residue.chain], atom1.residue.name, resIds[atom1.residue], atom1.name, chainIds[atom2.residue.chain], atom2.residue.name, resIds[atom2.residue], atom2.name), file=file) print('#', file=file) # Write the header for the atom coordinates. print('loop_', file=file) print('_atom_site.group_PDB', file=file) print('_atom_site.id', file=file) print('_atom_site.type_symbol', file=file) print('_atom_site.label_atom_id', file=file) print('_atom_site.label_alt_id', file=file) print('_atom_site.label_comp_id', file=file) print('_atom_site.label_asym_id', file=file) print('_atom_site.label_entity_id', file=file) print('_atom_site.label_seq_id', file=file) print('_atom_site.pdbx_PDB_ins_code', file=file) print('_atom_site.Cartn_x', file=file) print('_atom_site.Cartn_y', file=file) print('_atom_site.Cartn_z', file=file) print('_atom_site.occupancy', file=file) print('_atom_site.B_iso_or_equiv', file=file) print('_atom_site.Cartn_x_esd', file=file) print('_atom_site.Cartn_y_esd', file=file) print('_atom_site.Cartn_z_esd', file=file) print('_atom_site.occupancy_esd', file=file) print('_atom_site.B_iso_or_equiv_esd', file=file) print('_atom_site.pdbx_formal_charge', file=file) print('_atom_site.auth_seq_id', file=file) print('_atom_site.auth_comp_id', file=file) print('_atom_site.auth_asym_id', file=file) print('_atom_site.auth_atom_id', file=file) print('_atom_site.pdbx_PDB_model_num', file=file)
def check_openmm_version(): from simtk.openmm import Platform if not Platform.getOpenMMVersion() >= '5.1': raise ValueError('MSMAccelerator requires OpenMM >= 5.1')
def writeHeader(topology, file=sys.stdout, entry=None, keepIds=False): """Write out the header for a PDBx/mmCIF file. Parameters ---------- topology : Topology The Topology defining the molecular system being written file : file=stdout A file to write the file to entry : str=None The entry ID to assign to the CIF file keepIds : bool=False If True, keep the residue and chain IDs specified in the Topology rather than generating new ones. Warning: It is up to the caller to make sure these are valid IDs that satisfy the requirements of the PDBx/mmCIF format. Otherwise, the output file will be invalid. """ if entry is not None: print('data_%s' % entry, file=file) else: print('data_cell', file=file) print("# Created with OpenMM %s, %s" % (Platform.getOpenMMVersion(), str(date.today())), file=file) print('#', file=file) vectors = topology.getPeriodicBoxVectors() if vectors is not None: a, b, c, alpha, beta, gamma = computeLengthsAndAngles(vectors) RAD_TO_DEG = 180 / math.pi print('_cell.length_a %10.4f' % (a * 10), file=file) print('_cell.length_b %10.4f' % (b * 10), file=file) print('_cell.length_c %10.4f' % (c * 10), file=file) print('_cell.angle_alpha %10.4f' % (alpha * RAD_TO_DEG), file=file) print('_cell.angle_beta %10.4f' % (beta * RAD_TO_DEG), file=file) print('_cell.angle_gamma %10.4f' % (gamma * RAD_TO_DEG), file=file) print('#', file=file) # Identify bonds that should be listed in the file. bonds = [] for atom1, atom2 in topology.bonds(): if atom1.residue.name not in PDBFile._standardResidues or atom2.residue.name not in PDBFile._standardResidues: bonds.append((atom1, atom2)) elif atom1.name == 'SG' and atom2.name == 'SG' and atom1.residue.name == 'CYS' and atom2.residue.name == 'CYS': bonds.append((atom1, atom2)) if len(bonds) > 0: # Write the bond information. print('loop_', file=file) print('_struct_conn.id', file=file) print('_struct_conn.conn_type_id', file=file) print('_struct_conn.ptnr1_label_asym_id', file=file) print('_struct_conn.ptnr1_label_comp_id', file=file) print('_struct_conn.ptnr1_label_seq_id', file=file) print('_struct_conn.ptnr1_label_atom_id', file=file) print('_struct_conn.ptnr2_label_asym_id', file=file) print('_struct_conn.ptnr2_label_comp_id', file=file) print('_struct_conn.ptnr2_label_seq_id', file=file) print('_struct_conn.ptnr2_label_atom_id', file=file) chainIds = {} resIds = {} if keepIds: for chain in topology.chains(): chainIds[chain] = chain.id for res in topology.residues(): resIds[res] = res.id else: for (chainIndex, chain) in enumerate(topology.chains()): chainIds[chain] = chr(ord('A') + chainIndex % 26) for (resIndex, res) in enumerate(chain.residues()): resIds[res] = resIndex + 1 for i, (atom1, atom2) in enumerate(bonds): if atom1.residue.name == 'CYS' and atom2.residue.name == 'CYS': bondType = 'disulf' else: bondType = 'covale' line = "bond%d %s %s %-4s %5s %-4s %s %-4s %5s %-4s" print(line % (i + 1, bondType, chainIds[atom1.residue.chain], atom1.residue.name, resIds[atom1.residue], atom1.name, chainIds[atom2.residue.chain], atom2.residue.name, resIds[atom2.residue], atom2.name), file=file) print('#', file=file) # Write the header for the atom coordinates. print('loop_', file=file) print('_atom_site.group_PDB', file=file) print('_atom_site.id', file=file) print('_atom_site.type_symbol', file=file) print('_atom_site.label_atom_id', file=file) print('_atom_site.label_alt_id', file=file) print('_atom_site.label_comp_id', file=file) print('_atom_site.label_asym_id', file=file) print('_atom_site.label_entity_id', file=file) print('_atom_site.label_seq_id', file=file) print('_atom_site.pdbx_PDB_ins_code', file=file) print('_atom_site.Cartn_x', file=file) print('_atom_site.Cartn_y', file=file) print('_atom_site.Cartn_z', file=file) print('_atom_site.occupancy', file=file) print('_atom_site.B_iso_or_equiv', file=file) print('_atom_site.Cartn_x_esd', file=file) print('_atom_site.Cartn_y_esd', file=file) print('_atom_site.Cartn_z_esd', file=file) print('_atom_site.occupancy_esd', file=file) print('_atom_site.B_iso_or_equiv_esd', file=file) print('_atom_site.pdbx_formal_charge', file=file) print('_atom_site.auth_seq_id', file=file) print('_atom_site.auth_comp_id', file=file) print('_atom_site.auth_asym_id', file=file) print('_atom_site.auth_atom_id', file=file) print('_atom_site.pdbx_PDB_model_num', file=file)