def __init__(self, discretization, atom_discretization): # step 1 self.discretization = discretization self.atom_discretization = atom_discretization self.grid = np.zeros(self.discretization.d, dtype=np.int64) # step 2 atomstogrid(self.grid, self.atom_discretization.discrete_positions, self.atom_discretization.atoms.radii_as_indices, self.atom_discretization.sorted_discrete_radii, [(0, 0, 0)] + self.discretization.combined_translation_vectors, self.discretization.grid) # step 3 result = start_split_and_merge_pipeline( self.grid, self.discretization.grid, self.atom_discretization.discrete_positions, self.discretization.combined_translation_vectors, self.discretization.get_translation_vector, ObjectType.DOMAIN) self.centers, translated_areas, non_translated_areas, self.surface_point_list, self.cyclic_area_indices = result print_message("Number of domains:", len(self.centers)) self.domain_volumes = [] self.critical_domains = [ ] # count of very small domains -> domains that can disappear on cutoff radius changes for domain_index in range(len(self.centers)): current_cell_sum = (self.grid == -(domain_index + 1)).sum() if current_cell_sum == 1: self.critical_domains.append(domain_index) domain_volume = current_cell_sum * (self.discretization.s_step**3) self.domain_volumes.append(domain_volume) self.characteristic_radii = [(0.75 * volume / PI)**(1.0 / 3.0) for volume in self.domain_volumes] if translated_areas: gyration_tensor_parameters = tuple( calculate_gyration_tensor_parameters(area) for area in translated_areas) (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = zip(*gyration_tensor_parameters) self.mass_centers = [ self.discretization.discrete_to_continuous( point, result_inside_volume=True) for point in self.mass_centers ] self.squared_gyration_radii = [ self.discretization.discrete_to_continuous(value, unit_exponent=2) for value in self.squared_gyration_radii ] else: (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = 5 * ([], ) self.triangles()
def __init__(self, discretization, atom_discretization): # step 1 self.discretization = discretization self.atom_discretization = atom_discretization self.grid = np.zeros(self.discretization.d, dtype=np.int64) # step 2 atomstogrid(self.grid, self.atom_discretization.discrete_positions, self.atom_discretization.atoms.radii_as_indices, self.atom_discretization.sorted_discrete_radii, [(0, 0, 0)] + self.discretization.combined_translation_vectors, self.discretization.grid) # step 3 result = start_split_and_merge_pipeline(self.grid, self.discretization.grid, self.atom_discretization.discrete_positions, self.discretization.combined_translation_vectors, self.discretization.get_translation_vector, ObjectType.DOMAIN) self.centers, translated_areas, non_translated_areas, self.surface_point_list, self.cyclic_area_indices = result print_message("Number of domains:", len(self.centers)) self.domain_volumes = [] self.critical_domains = [] # count of very small domains -> domains that can disappear on cutoff radius changes for domain_index in range(len(self.centers)): current_cell_sum = (self.grid == -(domain_index + 1)).sum() if current_cell_sum == 1: self.critical_domains.append(domain_index) domain_volume = current_cell_sum * (self.discretization.s_step ** 3) self.domain_volumes.append(domain_volume) self.characteristic_radii = [(0.75 * volume / PI)**(1.0/3.0) for volume in self.domain_volumes] if translated_areas: gyration_tensor_parameters = tuple(calculate_gyration_tensor_parameters(area) for area in translated_areas) (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = zip(*gyration_tensor_parameters) self.mass_centers = [self.discretization.discrete_to_continuous(point, result_inside_volume=True) for point in self.mass_centers] self.squared_gyration_radii = [self.discretization.discrete_to_continuous(value, unit_exponent=2) for value in self.squared_gyration_radii] else: (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = 5*([], ) self.triangles()
def __init__(self, domain_calculation, use_surface_points=True, gyration_tensor_parameters=False): self.domain_calculation = domain_calculation if use_surface_points: self.grid = self.domain_calculation.grid num_surface_points = sum( map(len, self.domain_calculation.surface_point_list)) print_message("Number of surface points:", num_surface_points) else: self.grid = None self.sg_cube_size = self.domain_calculation.atom_discretization.sorted_discrete_radii[ 0] if use_surface_points: domain_seed_point_lists = self.domain_calculation.surface_point_list else: domain_seed_point_lists = [ [center] for center in self.domain_calculation.centers ] discretization = self.domain_calculation.discretization atom_discretization = self.domain_calculation.atom_discretization # steps 1 to 5 self.grid3 = mark_cavities( self.grid, discretization.grid, discretization.d, self.sg_cube_size, atom_discretization.discrete_positions, [(0, 0, 0)] + discretization.combined_translation_vectors, domain_seed_point_lists, use_surface_points) if gyration_tensor_parameters: result = start_split_and_merge_pipeline( self.grid3, discretization.grid, atom_discretization.discrete_positions, discretization.combined_translation_vectors, discretization.get_translation_vector, ObjectType.CAVITY) translated_areas, non_translated_areas, cyclic_area_indices = result num_domains = len(self.domain_calculation.centers) grid_volume = (discretization.grid == 0).sum() self.cavity_volumes = [] for domain_index in range(num_domains): self.cavity_volumes.append( 1.0 * (self.grid3 == -(domain_index + 1)).sum() * (discretization.s_step**3)) self.characteristic_radii = [(0.75 * volume / PI)**(1.0 / 3.0) for volume in self.cavity_volumes] # step 6 intersection_table = cavity_intersections(self.grid3, num_domains) multicavities = [] cavity_to_neighbors = num_domains * [None] for domain in range(num_domains): current_neighbors = set([domain]) for neighbor in range(num_domains): if intersection_table[domain][neighbor] == 1: current_neighbors.add(neighbor) for multicavity in multicavities[:]: if any([ neighbor in multicavity for neighbor in current_neighbors ]): current_neighbors = current_neighbors | multicavity multicavities.remove(multicavity) multicavities.append(current_neighbors) for neighbor in current_neighbors: cavity_to_neighbors[neighbor] = current_neighbors self.multicavities = multicavities self.multicavity_volumes = [] for multicavity in multicavities: self.multicavity_volumes.append( sum(self.cavity_volumes[cavity_index] for cavity_index in multicavity)) print_message("Multicavity volumes:", self.multicavity_volumes) if gyration_tensor_parameters: def key_func(cavity_index): cavity_area = non_translated_areas[cavity_index] a_single_cavity_index = -self.grid3[cavity_area[0]] - 1 max_neighbor_index = max( cavity_to_neighbors[a_single_cavity_index]) return max_neighbor_index sorted_area_indices = sorted(range(len(self.multicavities)), key=key_func) sorted_translated_areas = [ translated_areas[i] for i in sorted_area_indices ] sorted_cyclic_area_indices = [ i for i, index in enumerate(sorted_area_indices) if index in cyclic_area_indices ] self.cyclic_area_indices = sorted_cyclic_area_indices if sorted_translated_areas: gyration_tensor_parameters = tuple( calculate_gyration_tensor_parameters(area) for area in sorted_translated_areas) (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = zip(*gyration_tensor_parameters) self.mass_centers = [ discretization.discrete_to_continuous( point, result_inside_volume=True) for point in self.mass_centers ] self.squared_gyration_radii = [ discretization.discrete_to_continuous(value, unit_exponent=2) for value in self.squared_gyration_radii ] else: (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = 5 * ([], ) self.triangles()
def __init__(self, domain_calculation, use_surface_points=True, gyration_tensor_parameters=False): self.domain_calculation = domain_calculation if use_surface_points: self.grid = self.domain_calculation.grid num_surface_points = sum(map(len, self.domain_calculation.surface_point_list)) print_message("Number of surface points:", num_surface_points) else: self.grid = None self.sg_cube_size = self.domain_calculation.atom_discretization.sorted_discrete_radii[0] if use_surface_points: domain_seed_point_lists = self.domain_calculation.surface_point_list else: domain_seed_point_lists = [[center] for center in self.domain_calculation.centers] discretization = self.domain_calculation.discretization atom_discretization = self.domain_calculation.atom_discretization # steps 1 to 5 self.grid3 = mark_cavities(self.grid, discretization.grid, discretization.d, self.sg_cube_size, atom_discretization.discrete_positions, [(0, 0, 0)] + discretization.combined_translation_vectors, domain_seed_point_lists, use_surface_points) if gyration_tensor_parameters: result = start_split_and_merge_pipeline(self.grid3, discretization.grid, atom_discretization.discrete_positions, discretization.combined_translation_vectors, discretization.get_translation_vector, ObjectType.CAVITY) translated_areas, non_translated_areas, cyclic_area_indices = result num_domains = len(self.domain_calculation.centers) grid_volume = (discretization.grid == 0).sum() self.cavity_volumes = [] for domain_index in range(num_domains): self.cavity_volumes.append(1.0 * (self.grid3 == -(domain_index + 1)).sum() * (discretization.s_step ** 3)) self.characteristic_radii = [(0.75 * volume / PI)**(1.0/3.0) for volume in self.cavity_volumes] # step 6 intersection_table = cavity_intersections(self.grid3, num_domains) multicavities = [] cavity_to_neighbors = num_domains * [None] for domain in range(num_domains): current_neighbors = set([domain]) for neighbor in range(num_domains): if intersection_table[domain][neighbor] == 1: current_neighbors.add(neighbor) for multicavity in multicavities[:]: if any([neighbor in multicavity for neighbor in current_neighbors]): current_neighbors = current_neighbors | multicavity multicavities.remove(multicavity) multicavities.append(current_neighbors) for neighbor in current_neighbors: cavity_to_neighbors[neighbor] = current_neighbors self.multicavities = multicavities self.multicavity_volumes = [] for multicavity in multicavities: self.multicavity_volumes.append(sum(self.cavity_volumes[cavity_index] for cavity_index in multicavity)) print_message("Multicavity volumes:", self.multicavity_volumes) if gyration_tensor_parameters: def key_func(cavity_index): cavity_area = non_translated_areas[cavity_index] a_single_cavity_index = -self.grid3[cavity_area[0]] - 1 max_neighbor_index = max(cavity_to_neighbors[a_single_cavity_index]) return max_neighbor_index sorted_area_indices = sorted(range(len(self.multicavities)), key=key_func) sorted_translated_areas = [translated_areas[i] for i in sorted_area_indices] sorted_cyclic_area_indices = [i for i, index in enumerate(sorted_area_indices) if index in cyclic_area_indices] self.cyclic_area_indices = sorted_cyclic_area_indices if sorted_translated_areas: gyration_tensor_parameters = tuple(calculate_gyration_tensor_parameters(area) for area in sorted_translated_areas) (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = zip(*gyration_tensor_parameters) self.mass_centers = [discretization.discrete_to_continuous(point, result_inside_volume=True) for point in self.mass_centers] self.squared_gyration_radii = [discretization.discrete_to_continuous(value, unit_exponent=2) for value in self.squared_gyration_radii] else: (self.mass_centers, self.squared_gyration_radii, self.asphericities, self.acylindricities, self.anisotropies) = 5*([], ) self.triangles()