Skip to content

Commit 37670df

Browse files
Muhammad-RebaalGeigerJ2
authored andcommitted
Fix cell_angle bug
1 parent 5e4da5b commit 37670df

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src/aiida/orm/nodes/data/structure.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,14 +1679,27 @@ def cell_angles(self):
16791679

16801680
cell = self.cell
16811681
lengths = self.cell_lengths
1682-
return [
1683-
float(numpy.arccos(x) / numpy.pi * 180)
1684-
for x in [
1685-
numpy.vdot(cell[1], cell[2]) / lengths[1] / lengths[2],
1686-
numpy.vdot(cell[0], cell[2]) / lengths[0] / lengths[2],
1687-
numpy.vdot(cell[0], cell[1]) / lengths[0] / lengths[1],
1688-
]
1689-
]
1682+
1683+
# Check for zero-length vectors
1684+
if all(length == 0.0 for length in lengths):
1685+
raise ValueError('Cannot calculate angles for a cell with all zero-length vectors')
1686+
1687+
angles = []
1688+
1689+
# Calculate angles, using None for undefined angles involving zero-length vectors
1690+
angle_indices = [(1, 2, 0), (0, 2, 1), (0, 1, 2)] # (vec1, vec2, angle_position)
1691+
1692+
for i, j, k in angle_indices:
1693+
if lengths[i] == 0.0 or lengths[j] == 0.0:
1694+
angles.append(None)
1695+
else:
1696+
dot_product = numpy.vdot(cell[i], cell[j])
1697+
cos_angle = dot_product / (lengths[i] * lengths[j])
1698+
# Handle numerical issues where |cos_angle| might slightly exceed 1
1699+
cos_angle = max(min(cos_angle, 1.0), -1.0)
1700+
angles.append(numpy.degrees(numpy.arccos(cos_angle)))
1701+
1702+
return angles
16901703

16911704
@cell_angles.setter
16921705
def cell_angles(self, value):

0 commit comments

Comments
 (0)