Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
589 changes: 441 additions & 148 deletions cx_asap/cxasap.py

Large diffs are not rendered by default.

23 changes: 15 additions & 8 deletions cx_asap/overall_pipelines/variable_position_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from data_refinement.pipelines.refine_pipeline import Refinement_Pipeline
from cif_validation.pipelines.cif_pipeline import CIF_Compile_Pipeline
from post_refinement_analysis.pipelines.rotation_pipeline import Rotation_Pipeline
from post_refinement_analysis.pipelines.centroids_pipeline import Centroids_Pipeline
from post_refinement_analysis.pipelines.points_pipeline import PointsPipeline
from post_refinement_analysis.pipelines.variable_position_analysis import (
VP_Analysis_Pipeline,
)
Expand Down Expand Up @@ -102,6 +102,7 @@ def setup(
MPLA_atoms: str,
instrument_cif_path: str,
total_angle: int,
minimum_fraction_of_indexed_spots: float,
) -> None:
"""Organises the directory tree for this experiment

Expand All @@ -128,6 +129,7 @@ def setup(
MPLA_atoms (str): Atoms for mean plane analysis
instrument_cif_path (str): full path to the instrument CIF
total_angle (int): total wedge angle per experiment
minimum_fraction_of_indexed_spots (float): minimum fraction of indexed spots threshold for XDS indexing

"""

Expand All @@ -139,7 +141,12 @@ def setup(
background_reference, instrument_parameters_path, instrument_cif_path
)
configure.flexible_setup(
max_processors, neggia_library, space_group_number, MPLA_atoms, total_angle
max_processors,
neggia_library,
space_group_number,
MPLA_atoms,
total_angle,
minimum_fraction_of_indexed_spots,
)
self.cfg, self.sys = self.config.yaml_reload()

Expand Down Expand Up @@ -523,14 +530,14 @@ def process(
)
rotation = Rotation_Pipeline()
rotation.analysis(location, reference_plane, graph_output_location)
centroids = Centroids_Pipeline()
centroids.centroid_distance_analysis(
centroids = PointsPipeline()
centroids.point_group_distance_analysis(
location,
self.cfg["centroid_1_atoms"],
self.cfg["centroid_2_atoms"],
self.cfg["point_group_1_atoms"],
self.cfg["point_group_2_atoms"],
graph_output_location,
symmetry_1=self.cfg.get("centroid_1_symmetry"),
symmetry_2=self.cfg.get("centroid_2_symmetry"),
symmetry_1=self.cfg.get("point_group_1_symmetry"),
symmetry_2=self.cfg.get("point_group_2_symmetry"),
)
cif = CIF_Compile_Pipeline()
cif.configure(
Expand Down
14 changes: 7 additions & 7 deletions cx_asap/overall_pipelines/variable_temperature_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
VT_Analysis_Pipeline,
)
from post_refinement_analysis.pipelines.rotation_pipeline import Rotation_Pipeline
from post_refinement_analysis.pipelines.centroids_pipeline import Centroids_Pipeline
from post_refinement_analysis.pipelines.points_pipeline import PointsPipeline
import yaml
import os
import logging
Expand Down Expand Up @@ -142,14 +142,14 @@ def process(
)
rotation = Rotation_Pipeline()
rotation.analysis(location, reference_plane, graph_output_location)
centroids = Centroids_Pipeline()
centroids.centroid_distance_analysis(
centroids = PointsPipeline()
centroids.point_group_distance_analysis(
location,
self.cfg["centroid_1_atoms"],
self.cfg["centroid_2_atoms"],
self.cfg["point_group_1_atoms"],
self.cfg["point_group_2_atoms"],
graph_output_location,
symmetry_1=self.cfg.get("centroid_1_symmetry"),
symmetry_2=self.cfg.get("centroid_2_symmetry"),
symmetry_1=self.cfg.get("point_group_1_symmetry"),
symmetry_2=self.cfg.get("point_group_2_symmetry"),
)

def analyse(
Expand Down
50 changes: 8 additions & 42 deletions cx_asap/post_refinement_analysis/modules/ADP_analysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,48 +211,14 @@ def analyse_data(self, csv_file: str, cell_data: str) -> None:

values_unsorted, vectors = np.linalg.eig(BG)

test = values_unsorted.tolist()

values = sorted(test)

values.reverse()

positions = {}

for i_1, i in enumerate(values_unsorted):
for i_2, j in enumerate(values):
if i == j:
positions[i_1] = i_2

vector_1 = np.array(
[
[
vectors[0][positions[0]],
vectors[1][positions[0]],
vectors[2][positions[0]],
]
]
)

vector_2 = np.array(
[
[
vectors[0][positions[1]],
vectors[1][positions[1]],
vectors[2][positions[1]],
]
]
)

vector_3 = np.array(
[
[
vectors[0][positions[2]],
vectors[1][positions[2]],
vectors[2][positions[2]],
]
]
)
# Numerical noise can produce tiny imaginary components.
# Sort by real part and coerce near-real values back to float.
order = np.argsort(np.real(values_unsorted))[::-1]
values = [float(np.real(values_unsorted[i])) for i in order]

vector_1 = np.array([np.real_if_close(vectors[:, order[0]]).astype(float)])
vector_2 = np.array([np.real_if_close(vectors[:, order[1]]).astype(float)])
vector_3 = np.array([np.real_if_close(vectors[:, order[2]]).astype(float)])

try:
principle_A.append(math.sqrt(values[0] / (2 * (math.pi**2))))
Expand Down
29 changes: 26 additions & 3 deletions cx_asap/post_refinement_analysis/modules/centroids.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ def _extract_positions(
"""Gets transformed fractional coordinates for each requested atom."""

atom_names = self._normalise_atom_names(atom_names)
symmetry = self._normalise_symmetry(symmetry)
R, t = parse_symm_op(symmetry) if symmetry else (None, None)

positions = []
Expand All @@ -126,6 +127,24 @@ def _extract_positions(

return positions

@staticmethod
def _normalise_symmetry(symmetry: "str | list | None") -> "str | None":
"""Converts placeholder symmetry values to None and normalises strings."""

if isinstance(symmetry, list):
if len(symmetry) == 0:
return None
symmetry = symmetry[0]

if symmetry is None:
return None

value = str(symmetry).strip()
if value in ["", "0", ".", "?"]:
return None

return value

def calculate_centroid(
self,
coords: dict,
Expand Down Expand Up @@ -304,9 +323,13 @@ def point_torsion(
logging.warning(__name__ + f" : {error}")
return 0.0

has_symmetry = any(
item is not None for item in [symmetry_1, symmetry_2, symmetry_3, symmetry_4]
)
symmetry_values = [
self._normalise_symmetry(symmetry_1),
self._normalise_symmetry(symmetry_2),
self._normalise_symmetry(symmetry_3),
self._normalise_symmetry(symmetry_4),
]
has_symmetry = any(item is not None for item in symmetry_values)
has_centroid_point = any(
len(item) > 1
for item in [point_1_list, point_2_list, point_3_list, point_4_list]
Expand Down
Loading
Loading