|
11 | 11 |
|
12 | 12 | import gemmi |
13 | 13 |
|
| 14 | +from easydiffraction.core.category import CategoryCollection |
| 15 | +from easydiffraction.core.category import CategoryItem |
14 | 16 | from easydiffraction.core.factory import FactoryBase |
15 | 17 | from easydiffraction.sample_models.sample_model.base import SampleModelBase |
16 | 18 |
|
@@ -126,56 +128,25 @@ def _pick_first_structural_block( |
126 | 128 | except Exception: |
127 | 129 | return doc[0] |
128 | 130 |
|
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 | | - |
143 | 131 | # TODO: Move to a common CIF utility module? io.cif.parse? |
144 | 132 | @classmethod |
145 | 133 | def _extract_name_from_block(cls, block: gemmi.cif.Block) -> str: |
146 | 134 | """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 |
168 | 137 |
|
169 | 138 | # TODO: Move to a common CIF utility module? io.cif.parse? |
170 | 139 | @classmethod |
171 | | - def _set_atom_sites_from_cif_block( |
| 140 | + def _create_model_from_block( |
172 | 141 | cls, |
173 | | - model: SampleModelBase, |
174 | 142 | 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