From 37670df68bc0e9f57ca6ac13f1b0cf471a9a6432 Mon Sep 17 00:00:00 2001 From: Muhammad Rebaal <122050424+Muhammad-Rebaal@users.noreply.github.com> Date: Fri, 11 Apr 2025 23:55:34 +0500 Subject: [PATCH] Fix cell_angle bug --- src/aiida/orm/nodes/data/structure.py | 29 +++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/aiida/orm/nodes/data/structure.py b/src/aiida/orm/nodes/data/structure.py index 0e0d7e49db..032161a932 100644 --- a/src/aiida/orm/nodes/data/structure.py +++ b/src/aiida/orm/nodes/data/structure.py @@ -1679,14 +1679,27 @@ def cell_angles(self): cell = self.cell lengths = self.cell_lengths - return [ - float(numpy.arccos(x) / numpy.pi * 180) - for x in [ - numpy.vdot(cell[1], cell[2]) / lengths[1] / lengths[2], - numpy.vdot(cell[0], cell[2]) / lengths[0] / lengths[2], - numpy.vdot(cell[0], cell[1]) / lengths[0] / lengths[1], - ] - ] + + # Check for zero-length vectors + if all(length == 0.0 for length in lengths): + raise ValueError('Cannot calculate angles for a cell with all zero-length vectors') + + angles = [] + + # Calculate angles, using None for undefined angles involving zero-length vectors + angle_indices = [(1, 2, 0), (0, 2, 1), (0, 1, 2)] # (vec1, vec2, angle_position) + + for i, j, k in angle_indices: + if lengths[i] == 0.0 or lengths[j] == 0.0: + angles.append(None) + else: + dot_product = numpy.vdot(cell[i], cell[j]) + cos_angle = dot_product / (lengths[i] * lengths[j]) + # Handle numerical issues where |cos_angle| might slightly exceed 1 + cos_angle = max(min(cos_angle, 1.0), -1.0) + angles.append(numpy.degrees(numpy.arccos(cos_angle))) + + return angles @cell_angles.setter def cell_angles(self, value):