docs: def align_to_other(self, other, mapping, self_root_pair, other_root_pair = None):
          '''
          root atoms are atom which all other unmapped atoms will be mapped off of
          '''
          if other_root_pair == None:
              other_root_pair = self_root_pair
  
          assert( len(self_root_pair) == len(other_root_pair) )
  
          unmoved_atom_names = []
          new_coords = [ None for x in xrange( len(self_root_pair) ) ]
          for atom in self.names:
              if atom in self_root_pair:
                  i = self_root_pair.index(atom)
                  assert( new_coords[i] == None )
                  new_coords[i] = self.get_coords_for_name(atom)
  
              if atom in mapping:
                  other_atom = mapping[atom]
                  self.set_coords_for_name( atom, other.get_coords_for_name(other_atom) )
              else:
                  unmoved_atom_names.append(atom)
  
          # Move unmoved coordinates after all other atoms have been moved (so that
          # references will have been moved already)
          if None in new_coords:
              print new_coords
              assert( None not in new_coords )
          ref_coords = [other.get_coords_for_name(x) for x in other_root_pair]
  
          # Calculate translation and rotation matrices
          U, new_centroid, ref_centroid = calc_rotation_translation_matrices( ref_coords, new_coords )
          for atom in unmoved_atom_names:
              original_coord = self.get_coords_for_name(atom)
              self.set_coords_for_name( atom, rotate_and_translate_coord(original_coord, U, new_centroid, ref_centroid) )
          self.chain = other.chain