Download model/Protenix-pxd/protenix/utils/geometry.py from OneScience-Group/PXDesign: direct link, hf CLI and curl.
- Browser
- Download file 2.39 kB
-
https://huggingface.co/OneScience-Group/PXDesign/resolve/main/model/Protenix-pxd/protenix/utils/geometry.py
- Command line
-
hf download hf://OneScience-Group/PXDesign/model/Protenix-pxd/protenix/utils/geometry.py
-
curl -L -o geometry.py https://huggingface.co/OneScience-Group/PXDesign/resolve/main/model/Protenix-pxd/protenix/utils/geometry.py
2.39 kB
| # Copyright 2024 ByteDance and/or its affiliates. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| import numpy as np | |
| from scipy.spatial.transform import Rotation | |
| def angle_3p(a, b, c): | |
| """ | |
| Calculate the angle between three points in a 2D space. | |
| Args: | |
| a (list or array-like): The coordinates of the first point. | |
| b (list or array-like): The coordinates of the second point. | |
| c (list or array-like): The coordinates of the third point. | |
| Returns: | |
| float: The angle in degrees (0, 180) between the vectors | |
| from point a to point b and point b to point c. | |
| """ | |
| a = np.array(a) | |
| b = np.array(b) | |
| c = np.array(c) | |
| ab = b - a | |
| bc = c - b | |
| dot_product = np.dot(ab, bc) | |
| norm_ab = np.linalg.norm(ab) | |
| norm_bc = np.linalg.norm(bc) | |
| cos_theta = np.clip(dot_product / (norm_ab * norm_bc + 1e-4), -1, 1) | |
| theta_radians = np.arccos(cos_theta) | |
| theta_degrees = np.degrees(theta_radians) | |
| return theta_degrees | |
| def random_transform( | |
| points, max_translation=1.0, apply_augmentation=False, centralize=True | |
| ) -> np.ndarray: | |
| """ | |
| Randomly transform a set of 3D points. | |
| Args: | |
| points (numpy.ndarray): The points to be transformed, shape=(N, 3) | |
| max_translation (float): The maximum translation value. Default is 1.0. | |
| apply_augmentation (bool): Whether to apply random rotation/translation on ref_pos | |
| Returns: | |
| numpy.ndarray: The transformed points. | |
| """ | |
| if centralize: | |
| points = points - points.mean(axis=0) | |
| if not apply_augmentation: | |
| return points | |
| translation = np.random.uniform(-max_translation, max_translation, size=3) | |
| R = Rotation.random().as_matrix() | |
| transformed_points = np.dot(points + translation, R.T) | |
| return transformed_points | |