Example #1
0
    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()
Example #2
0
    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()
Example #3
0
    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()
Example #4
0
    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()