From discussion within COMCIFS/cif_core#445 and mentioned in #6 (comment)
I posit that if a Set category (or single packet Loop) key datavalue doesn't exist in a given datablock, then it is safe to autogenerate one.
I believe that this would make most of the multiblock dictionary transparent to the end-user, as there is no requirement to give (for example) _structure.id or _space_group.id values if you're not availing yourself of their features.
James does say
I think that would be a harmless rule to have. Maybe not as useful as it looks, because somewhere else that item will be referenced, otherwise there's no point to having it identified in the first place. So then that "other place" will need to know what the ID is. For example, if a parent structure wants to reference a child structure, or a phase wants to identify what structure it has.
but in this case, you're actually using multiblock features, and so you need to define them.
.
An example of my thinking is:
data_block
_structure.id A
_space_group.IT_number 62
_cell.length_a 12.3456
_structure.id has been explicitly defined, so I must assume it could be used somewhere else. _space_group.id has not been defined, so I can give it some arbitrary value, as there is no other way to link space group information between datablocks*. This same arbitrary value is then also given to _structure.space_group_id, linking** together structure A with space group SOME_GUID_VALUE. The key of CELL is _cell.structure_id, so this takes the value A, as it is in the same block as an explicitly defined _structure.id.
* Unless there are some AUDIT_BLOCK shenanigans you could do...
** as _structure.space_group_id is literally a Link to _space_group.id.
From discussion within COMCIFS/cif_core#445 and mentioned in #6 (comment)
I posit that if a
Setcategory (or single packet Loop) key datavalue doesn't exist in a given datablock, then it is safe to autogenerate one.I believe that this would make most of the multiblock dictionary transparent to the end-user, as there is no requirement to give (for example)
_structure.idor_space_group.idvalues if you're not availing yourself of their features.James does say
but in this case, you're actually using multiblock features, and so you need to define them.
.
An example of my thinking is:
_structure.idhas been explicitly defined, so I must assume it could be used somewhere else._space_group.idhas not been defined, so I can give it some arbitrary value, as there is no other way to link space group information between datablocks*. This same arbitrary value is then also given to_structure.space_group_id, linking** together structureAwith space groupSOME_GUID_VALUE. The key ofCELLis_cell.structure_id, so this takes the valueA, as it is in the same block as an explicitly defined_structure.id.* Unless there are some
AUDIT_BLOCKshenanigans you could do...** as
_structure.space_group_idis literally aLinkto_space_group.id.