Beispiel #1
0
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"
Beispiel #2
0
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,
    )
Beispiel #3
0
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,
    )