Skip to content

Commit 5268f79

Browse files
committed
Enhances CIF parsing in SampleModelFactory
1 parent d578a56 commit 5268f79

File tree

2 files changed

+17
-44
lines changed

2 files changed

+17
-44
lines changed

src/easydiffraction/io/cif/serialize.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,11 @@ def datablock_item_to_cif(datablock) -> str:
130130

131131
header = f'data_{datablock._identity.datablock_entry_name}'
132132
parts: list[str] = [header]
133+
# First categories
133134
for v in vars(datablock).values():
134135
if isinstance(v, CategoryItem):
135136
parts.append(v.as_cif)
137+
# Then collections
136138
for v in vars(datablock).values():
137139
if isinstance(v, CategoryCollection):
138140
parts.append(v.as_cif)

src/easydiffraction/sample_models/sample_model/factory.py

Lines changed: 15 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
import gemmi
1313

14+
from easydiffraction.core.category import CategoryCollection
15+
from easydiffraction.core.category import CategoryItem
1416
from easydiffraction.core.factory import FactoryBase
1517
from easydiffraction.sample_models.sample_model.base import SampleModelBase
1618

@@ -126,56 +128,25 @@ def _pick_first_structural_block(
126128
except Exception:
127129
return doc[0]
128130

129-
# TODO: Move to a common CIF utility module? io.cif.parse?
130-
@classmethod
131-
def _create_model_from_block(
132-
cls,
133-
block: gemmi.cif.Block,
134-
) -> SampleModelBase:
135-
"""Build a model instance from a single CIF block."""
136-
name = cls._extract_name_from_block(block)
137-
model = SampleModelBase(name=name)
138-
cls._set_space_group_from_cif_block(model, block)
139-
cls._set_cell_from_cif_block(model, block)
140-
cls._set_atom_sites_from_cif_block(model, block)
141-
return model
142-
143131
# TODO: Move to a common CIF utility module? io.cif.parse?
144132
@classmethod
145133
def _extract_name_from_block(cls, block: gemmi.cif.Block) -> str:
146134
"""Extract a model name from the CIF block name."""
147-
return block.name or 'model'
148-
149-
# TODO: Move to a common CIF utility module? io.cif.parse?
150-
@classmethod
151-
def _set_space_group_from_cif_block(
152-
cls,
153-
model: SampleModelBase,
154-
block: gemmi.cif.Block,
155-
) -> None:
156-
"""Populate the model's space group from a CIF block."""
157-
model.space_group.from_cif(block)
158-
159-
# TODO: Move to a common CIF utility module? io.cif.parse?
160-
@classmethod
161-
def _set_cell_from_cif_block(
162-
cls,
163-
model: SampleModelBase,
164-
block: gemmi.cif.Block,
165-
) -> None:
166-
"""Populate the model's unit cell from a CIF block."""
167-
model.cell.from_cif(block)
135+
# TODO: Need validator or normalization
136+
return block.name
168137

169138
# TODO: Move to a common CIF utility module? io.cif.parse?
170139
@classmethod
171-
def _set_atom_sites_from_cif_block(
140+
def _create_model_from_block(
172141
cls,
173-
model: SampleModelBase,
174142
block: gemmi.cif.Block,
175-
) -> None:
176-
"""Populate the model's atom sites from a CIF block."""
177-
model.atom_sites.from_cif(block)
178-
179-
# TODO: How to automatically parce and populate all categories?
180-
# for category in model.categories:
181-
# cls._set_category_from_cif_block(category, block)
143+
) -> SampleModelBase:
144+
"""Build a model instance from a single CIF block."""
145+
name = cls._extract_name_from_block(block)
146+
model = SampleModelFactory.create(name=name)
147+
# TODO: Add property categories to the DatablockItem class
148+
# Iterate over all categories and populate them from CIF
149+
for category in vars(model).values():
150+
if isinstance(category, (CategoryItem, CategoryCollection)):
151+
category.from_cif(block)
152+
return model

0 commit comments

Comments
 (0)