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
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
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
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)
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)
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