def run(filename=None): assert filename is None hpdl_database = get_hpdl_database() if 0: print "HPDL" print hpdl_database for aa in sorted(hpdl_database): print " %s" % aa for key, value in sorted(hpdl_database[aa].items()): print " %s : %s" % (key, value) assert 0 # for pdb, lines in pdbs.items(): print pdb filename="hpdl_%s.pdb" % pdb f=file(filename, "wb") f.write(lines) f.close() cmd = "phenix.pdb_interpretation %s write_geo=1 hpdl=%s" % (filename, True) print cmd easy_run.call(cmd) if filename.find("his_double")>-1: key="ND1 and NE2 protonated" elif filename.find("his_nd1")>-1: key="Only ND1 protonated" elif filename.find("his_ne2")>-1: key="Only NE2 protonated" if refine_geo_parser: check_ideals("%s.geo" % filename, hpdl_database[key]) print "OK"
def update_restraints(hierarchy, geometry, # restraints_manager, current_geometry=None, # xray_structure!! sites_cart=None, esd_factor=1., log=None, verbose=False, ): # def _set_or_reset_bond_restraints(geometry, lookup, verbose=False, ): count = 0 for i_seqs, values in lookup.items(): if len(i_seqs)!=2: continue bond=geometry.bond_params_table.lookup(*list(i_seqs)) assert bond if verbose: print " i_seqs %-15s initial %12.3f %12.3f final %12.3f %12.3f" % ( i_seqs, bond.distance_ideal, bond.weight, values[0], 1/values[1]**2, ) bond.distance_ideal=values[0] bond.weight = 1/values[1]**2 count+=1 return count # def _set_or_reset_angle_restraints(geometry, lookup, verbose=False, ): count = 0 for angle_proxy in geometry.angle_proxies: if angle_proxy.i_seqs in lookup: if verbose: print " i_seqs %-15s initial %12.3f %12.3f" % ( angle_proxy.i_seqs, angle_proxy.angle_ideal, angle_proxy.weight, ), assert angle_proxy.angle_ideal<181 angle_proxy.angle_ideal = lookup[angle_proxy.i_seqs][0] angle_proxy.weight = esd_factor/lookup[angle_proxy.i_seqs][1]**2 if verbose: print "final %12.3f %12.3f" % ( #angle_proxy.i_seqs, angle_proxy.angle_ideal, angle_proxy.weight, ) count += 1 return count # t0=time.time() sites_cart = None if current_geometry: sites_cart = current_geometry.sites_cart() i_seqs_restraints = {} # def _alt_loc_atom_generator(residue_group, atom_group): atoms = [] for ag in residue_group.atom_groups(): if ag.altloc.strip()=="" or ag.altloc.strip()==atom_group.altloc.strip(): for atom in ag.atoms(): yield atom # hpdl_database = get_hpdl_database() #include_hydrogens=False) count=0 counts = {} for model in hierarchy.models(): #if verbose: print 'model: "%s"' % model.id for chain in model.chains(): #if verbose: print 'chain: "%s"' % chain.id for residue_group in chain.residue_groups(): for atom_group in residue_group.atom_groups(): if atom_group.resname!="HIS": continue protonation = get_histidine_protonation(atom_group) if verbose or 1: rc = predict_protonation(atom_group) if rc is None: s = "%s" % rc else: s = "%0.1f, %0.1f" % tuple(rc) print >> log, '%satom group "%s" has %-22s (%s)' % ( ' '*6, atom_group.id_str(), protonation, s, ) #interpret_his1_his2(*tuple(rc)) counts.setdefault(protonation, 0) if protonation is None: continue counts[protonation]+=1 count+=1 restraints = hpdl_database[protonation] for names, values in restraints.items(): i_seqs = [] for name in names: # need to test this... for atom in _alt_loc_atom_generator(residue_group, atom_group): if name.strip()==atom.name.strip(): i_seqs.append(atom.i_seq) break if len(i_seqs)!=len(names): continue i_seqs_restraints[tuple(i_seqs)] = values if len(i_seqs)!=2: i_seqs.reverse() i_seqs_restraints[tuple(i_seqs)] = values count_b = _set_or_reset_bond_restraints(geometry, i_seqs_restraints, verbose=verbose, ) count_a = _set_or_reset_angle_restraints(geometry, i_seqs_restraints, verbose=verbose, ) # print >> log, " Number of bonds, angles adjusted : %d, %d in %s HIS" % ( count_b, count_a, count, )
def update_restraints( hierarchy, geometry, # restraints_manager, current_geometry=None, # xray_structure!! sites_cart=None, esd_factor=1., log=None, verbose=False, ): # def _set_or_reset_bond_restraints( geometry, lookup, ignore_esd=True, log=None, verbose=False, ): count = 0 for i_seqs, values in lookup.items(): if len(i_seqs) != 2: continue bond = geometry.bond_params_table.lookup(*list(i_seqs)) assert bond if verbose: from math import sqrt key = list(i_seqs) key.append("names") key = tuple(key) names = lookup.get(key, "") old_bond_ideal = bond.distance_ideal old_bond_weight = bond.weight print >> log, " i_seqs %-15s %s initial %8.3f %8.3f %8.3f final %8.3f %8.3f %8.3f" % ( i_seqs, names, bond.distance_ideal, bond.weight, 1 / sqrt(bond.weight), values[0], 1 / values[1]**2, values[1], ) if bond.distance_ideal != old_bond_ideal or bond.weight != old_bond_weight: print >> log, 'RESETTING' bond.distance_ideal = values[0] if not ignore_esd: bond.weight = 1 / values[1]**2 count += 1 return count # def _set_or_reset_angle_restraints( geometry, lookup, ignore_esd=True, log=None, verbose=False, ): count = 0 for angle_proxy in geometry.angle_proxies: if angle_proxy.i_seqs in lookup: if verbose: old_angle_ideal = angle_proxy.angle_ideal old_angle_weight = angle_proxy.weight print >> log, " i_seqs %-15s initial %12.3f %12.3f" % ( angle_proxy.i_seqs, angle_proxy.angle_ideal, angle_proxy.weight, ), assert angle_proxy.angle_ideal < 181 angle_proxy.angle_ideal = lookup[angle_proxy.i_seqs][0] if not ignore_esd: angle_proxy.weight = esd_factor / lookup[ angle_proxy.i_seqs][1]**2 if verbose: print >> log, "final %12.3f %12.3f" % ( angle_proxy.angle_ideal, angle_proxy.weight, ) if old_angle_ideal != angle_proxy.angle_ideal or old_angle_weight != angle_proxy.weight: print >> log, "RESETTING" count += 1 return count # t0 = time.time() sites_cart = None if current_geometry: sites_cart = current_geometry.sites_cart() i_seqs_restraints = {} # def _alt_loc_atom_generator(residue_group, atom_group): atoms = [] for ag in residue_group.atom_groups(): if ag.altloc.strip() == "" or ag.altloc.strip( ) == atom_group.altloc.strip(): for atom in ag.atoms(): yield atom # hpdl_database = get_hpdl_database() #include_hydrogens=False) count = 0 counts = {} for model in hierarchy.models(): #if verbose: print 'model: "%s"' % model.id for chain in model.chains(): #if verbose: print 'chain: "%s"' % chain.id for residue_group in chain.residue_groups(): for atom_group in residue_group.atom_groups(): if atom_group.resname != "HIS": continue protonation = get_histidine_protonation(atom_group) if verbose or 1: rc = predict_protonation(atom_group) if rc is None: s = "%s" % rc else: s = "%0.1f, %0.1f" % tuple(rc) print >> log, '%satom group "%s" has %-22s (%s)' % ( ' ' * 6, atom_group.id_str(), protonation, s, ) #interpret_his1_his2(*tuple(rc)) counts.setdefault(protonation, 0) if protonation is None: continue counts[protonation] += 1 count += 1 restraints = hpdl_database[protonation] for names, values in restraints.items(): i_seqs = [] atoms = [] for name in names: # need to test this... for atom in _alt_loc_atom_generator( residue_group, atom_group): if name.strip() == atom.name.strip(): i_seqs.append(atom.i_seq) atoms.append(atom.name) break if len(i_seqs) != len(names): continue i_seqs_restraints[tuple(i_seqs)] = values if len(i_seqs) != 2: i_seqs.reverse() i_seqs_restraints[tuple(i_seqs)] = values if verbose: i_seqs.append("names") i_seqs_restraints[tuple(i_seqs)] = atoms count_b = _set_or_reset_bond_restraints( geometry, i_seqs_restraints, log=log, #verbose=verbose, ) count_a = _set_or_reset_angle_restraints( geometry, i_seqs_restraints, log=log, #verbose=verbose, ) # print >> log, " Number of bonds, angles adjusted : %d, %d in %s HIS" % ( count_b, count_a, count, )