Source code for mmtfPyspark.utils.distanceBox

#!/user/bin/env python
'''distanceBox.py:

This code is a modification from BioJava's distanceBox class

References
----------
- `BioJava distanceBox <https://github.com/biojava/biojava/blob/359dce819e7678879ae41301b11fa268f92e81d1/biojava-structure/src/main/java/org/biojava/nbio/structure/symmetry/geometry/DistanceBox.java>`_
'''

__author__ = "Mars (Shih-Cheng) Huang"
__maintainer__ = "Mars (Shih-Cheng) Huang"
__email__ = "marshuang80@gmail.com"
__version__ = "0.2.0"
__status__ = "Done"

import numpy as np
from collections import defaultdict


[docs]class DistanceBox(object): offset = [ 0 + (0 * 10000) + (0 * 1000000000), -1 + (-1 * 10000) + (-1 * 1000000000), -1 + (-1 * 10000) + (0 * 1000000000), -1 + (-1 * 10000) + (1 * 1000000000), -1 + (0 * 10000) + (-1 * 1000000000), -1 + (0 * 10000) + (0 * 1000000000), -1 + (0 * 10000) + (1 * 1000000000), -1 + (1 * 10000) + (-1 * 1000000000), -1 + (1 * 10000) + (0 * 1000000000), -1 + (1 * 10000) + (1 * 1000000000), 0 + (-1 * 10000) + (-1 * 1000000000), 0 + (-1 * 10000) + (0 * 1000000000), 0 + (-1 * 10000) + (1 * 1000000000), 0 + (0 * 10000) + (-1 * 1000000000), 0 + (0 * 10000) + (1 * 1000000000), 0 + (1 * 10000) + (-1 * 1000000000), 0 + (1 * 10000) + (0 * 1000000000), 0 + (1 * 10000) + (1 * 1000000000), 1 + (-1 * 10000) + (-1 * 1000000000), 1 + (-1 * 10000) + (0 * 1000000000), 1 + (-1 * 10000) + (1 * 1000000000), 1 + (0 * 10000) + (-1 * 1000000000), 1 + (0 * 10000) + (0 * 1000000000), 1 + (0 * 10000) + (1 * 1000000000), 1 + (1 * 10000) + (-1 * 1000000000), 1 + (1 * 10000) + (0 * 1000000000), 1 + (1 * 10000) + (1 * 1000000000) ] def __init__(self, binWidth): self.inverseBinWidth = 1.0 / binWidth self.hashMap = defaultdict(list)
[docs] def add_point(self, point, pointName): i = np.rint(float(point[0]) * self.inverseBinWidth) j = np.rint(float(point[1]) * self.inverseBinWidth) k = np.rint(float(point[2]) * self.inverseBinWidth) location = i + (j * 10000) + (k * 1000000000) self.hashMap[location].append(pointName)
[docs] def get_neighbors(self, point): i = np.rint(float(point[0]) * self.inverseBinWidth) j = np.rint(float(point[1]) * self.inverseBinWidth) k = np.rint(float(point[2]) * self.inverseBinWidth) location = i + (j * 10000) + (k * 1000000000) box = self.get_box_two(location) return box
[docs] def get_box_two(self, location): box_two = [] for off in self.offset: if (location + off) in self.hashMap: box_two += self.hashMap[location + off] return box_two
[docs] def getIntersection(self, distanceBox): intersection = [] checkedLocations = set() for location in self.hashMap.keys(): overlap = False for off in self.offset: loc = location + off if loc in distanceBox.hashMap: overlap = True break if overlap: for off in self.offset: loc = location + off if loc in checkedLocations: continue checkedLocations.add(loc) if loc in self.hashMap: intersection += self.hashMap[loc] return intersection