예제 #1
0
  def setup_domains(self):
    # scale the temperature (necessary at high pulling speeds)
    if self.temperature:
      atoms = self.soup.atoms()
      anderson_velocity_scale(atoms, self.temperature, 3*len(atoms))

    # select the atoms from the domains definition
    selection = ['CA'] if self.is_backbone_only else None
    self.atoms1 = get_atoms_of_residues(self.soup, self.domain1, selection)
    self.atoms2 = get_atoms_of_residues(self.soup, self.domain2, selection)

    # get direction vectors based on domains
    self.disp2to1 = pdbatoms.get_center(self.atoms1) \
                  - pdbatoms.get_center(self.atoms2)
    self.axis2to1 = v3.norm(self.disp2to1)

    # calculate relative velocities between domains
    self.vel2to1 = average_vel(self.atoms1) - average_vel(self.atoms2)
    self.axis_vel2to1 = v3.parallel(self.vel2to1, self.axis2to1)
    self.vel = v3.dot(self.axis_vel2to1, self.axis2to1)

    if self.is_first_domain_only:
      self.move_atoms = self.atoms1
    else:
      self.move_atoms = self.atoms1 + self.atoms2
예제 #2
0
    def setup_domains(self):
        # scale the temperature (necessary at high pulling speeds)
        if self.temperature:
            atoms = self.soup.atoms()
            anderson_velocity_scale(atoms, self.temperature, 3 * len(atoms))

        # select the atoms from the domains definition
        selection = data.backbone_atoms if self.is_backbone_only else None
        self.atoms1 = get_atoms_of_residues(self.soup, self.domain1, selection)
        self.atoms2 = get_atoms_of_residues(self.soup, self.domain2, selection)

        # get direction vectors based on domains
        self.disp2to1 = pdbatoms.get_center(self.atoms1) \
                      - pdbatoms.get_center(self.atoms2)
        self.axis2to1 = v3.norm(self.disp2to1)

        # calculate relative velocities between domains
        self.vel2to1 = average_vel(self.atoms1) - average_vel(self.atoms2)
        self.axis_vel2to1 = v3.parallel(self.vel2to1, self.axis2to1)
        self.vel = v3.dot(self.axis_vel2to1, self.axis2to1)

        if self.is_first_domain_only:
            self.move_atoms = self.atoms1
        else:
            self.move_atoms = self.atoms1 + self.atoms2
예제 #3
0
def add_vel_to_atoms(atoms, vel_diff):
    """
  Adds vel_diff to the vel vector of atoms.
  """
    for a in atoms:
        a.vel_last = a.vel
        a.vel += vel_diff
        a.work_delta = \
            v3.dot(vel_diff, a.vel) * a.mass * timestep_in_ps * \
            work_DaAngSqPerPsSq_to_pNAng
예제 #4
0
파일: force.py 프로젝트: ejjordan/pdbremix
def add_vel_to_atoms(atoms, vel_diff):
  """
  Adds vel_diff to the vel vector of atoms.
  """
  for a in atoms:
    a.vel_last = a.vel
    a.vel += vel_diff
    a.work_delta = \
        v3.dot(vel_diff, a.vel) * a.mass * timestep_in_ps * \
        work_DaAngSqPerPsSq_to_pNAng
예제 #5
0
 def change_vels(self):
     # calculate the vel diff vector to apply
     diff_vel = self.target_val * self.dt
     diff_axis_vel2to1 = v3.scale(self.axis2to1, diff_vel)
     self.vel_diff = v3.dot(diff_axis_vel2to1, self.axis2to1)
     if self.is_first_domain_only:
         add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
     else:
         # apply half of vel_diff to each domain
         diff_axis_vel2to1 = v3.scale(diff_axis_vel2to1, 0.5)
         add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
         add_vel_to_atoms(self.atoms2, -diff_axis_vel2to1)
예제 #6
0
 def change_vels(self):
   # calculate the vel diff vector to apply
   diff_vel = self.target_val * self.dt
   diff_axis_vel2to1 = v3.scale(self.axis2to1, diff_vel)
   self.vel_diff = v3.dot(diff_axis_vel2to1, self.axis2to1)
   if self.is_first_domain_only:
     add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
   else:
     # apply half of vel_diff to each domain
     diff_axis_vel2to1 = v3.scale(diff_axis_vel2to1, 0.5)
     add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
     add_vel_to_atoms(self.atoms2, -diff_axis_vel2to1)
예제 #7
0
    def change_vels(self):
        # calculate the vel diff vector
        target_axis_vel2to1 = v3.scale(self.axis2to1, self.target_val)
        diff_axis_vel2to1 = target_axis_vel2to1 - self.axis_vel2to1
        self.vel_diff = v3.dot(diff_axis_vel2to1, self.axis2to1)

        # now change velocities of movable atoms
        self.old_kinetic_energy = kinetic_energy(self.move_atoms)
        if self.is_first_domain_only:
            add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
        else:
            # apply half of vel_diff to each domain
            v3.scale(diff_axis_vel2to1, 0.5)
            add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
            add_vel_to_atoms(self.atoms2, -diff_axis_vel2to1)
        self.kinetic_energy = kinetic_energy(self.move_atoms)
예제 #8
0
파일: force.py 프로젝트: ejjordan/pdbremix
  def change_vels(self):
    # calculate the vel diff vector 
    target_axis_vel2to1 = v3.scale(self.axis2to1, self.target_val)
    diff_axis_vel2to1 = target_axis_vel2to1 - self.axis_vel2to1
    self.vel_diff = v3.dot(diff_axis_vel2to1, self.axis2to1)

    # now change velocities of movable atoms
    self.old_kinetic_energy = kinetic_energy(self.move_atoms)
    if self.is_first_domain_only:
      add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
    else:
      # apply half of vel_diff to each domain
      v3.scale(diff_axis_vel2to1, 0.5)
      add_vel_to_atoms(self.atoms1, diff_axis_vel2to1)
      add_vel_to_atoms(self.atoms2, -diff_axis_vel2to1)
    self.kinetic_energy = kinetic_energy(self.move_atoms)
예제 #9
0
def rotational_velocity(atom, axis, anchor):
    """
  Returns the rotational velocity (rad/ps) of the atom connected
  to anchor around axis.
  """
    r = atom.pos - anchor
    r_perp = v3.perpendicular(r, axis)
    vel_perp = v3.perpendicular(atom.vel, axis)
    vel_tang = v3.perpendicular(vel_perp, r_perp)
    pos_ref = v3.cross(axis, r_perp)
    if v3.dot(vel_tang, pos_ref) < 0.0:
        sign = -1.0
    else:
        sign = 1.0
    if v3.is_similar_mag(v3.mag(r_perp), 0):
        result = 0.0
    else:
        result = sign * v3.mag(vel_tang) / v3.mag(r_perp)
    return result
예제 #10
0
def rotational_velocity(atom, axis, anchor):
  """
  Returns the rotational velocity (rad/ps) of the atom connected
  to anchor around axis.
  """
  r = atom.pos - anchor
  r_perp = v3.perpendicular(r, axis)
  vel_perp = v3.perpendicular(atom.vel, axis)
  vel_tang = v3.perpendicular(vel_perp, r_perp)
  pos_ref = v3.cross(axis, r_perp)
  if v3.dot(vel_tang, pos_ref) < 0.0:
    sign = -1.0
  else:
    sign = 1.0
  if v3.is_similar_mag(v3.mag(r_perp), 0):
    result = 0.0
  else:
    result = sign * v3.mag(vel_tang) / v3.mag(r_perp)
  return result