finalcif 162__tar.gz → 164__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. {finalcif-162 → finalcif-164}/.gitignore +4 -0
  2. {finalcif-162 → finalcif-164}/AGENTS.md +1 -1
  3. {finalcif-162 → finalcif-164}/PKG-INFO +1 -1
  4. finalcif-164/finalcif/__init__.py +3 -0
  5. {finalcif-162 → finalcif-164}/finalcif/appwindow.py +33 -7
  6. {finalcif-162 → finalcif-164}/finalcif/cif/cif_file_io.py +106 -5
  7. finalcif-164/finalcif/cif/cif_keyword_mapping.py +232 -0
  8. {finalcif-162 → finalcif-164}/finalcif/ciforder/order_ui.py +1 -0
  9. {finalcif-162 → finalcif-164}/finalcif/ciforder/order_ui.ui +3 -0
  10. {finalcif-162 → finalcif-164}/finalcif/gui/finalcif_gui_ui.py +611 -600
  11. {finalcif-162 → finalcif-164}/finalcif/gui/finalcif_gui_ui.ui +905 -879
  12. {finalcif-162 → finalcif-164}/finalcif/gui/mainstackwidget.py +11 -0
  13. finalcif-164/finalcif/gui/single_line_textedit.py +34 -0
  14. {finalcif-162 → finalcif-164}/finalcif/tools/platon.py +43 -19
  15. finalcif-164/finalcif/tools/z_from_packing.py +1189 -0
  16. {finalcif-162 → finalcif-164}/uv.lock +1 -1
  17. finalcif-164/work/compare_z_platon.py +347 -0
  18. finalcif-162/finalcif/__init__.py +0 -3
  19. finalcif-162/finalcif/tools/z_from_packing.py +0 -631
  20. {finalcif-162 → finalcif-164}/.gitattributes +0 -0
  21. {finalcif-162 → finalcif-164}/.githooks/pre-push +0 -0
  22. {finalcif-162 → finalcif-164}/.python-version +0 -0
  23. {finalcif-162 → finalcif-164}/.ruff.toml +0 -0
  24. {finalcif-162 → finalcif-164}/.run/Make Documentation MAC.run.xml +0 -0
  25. {finalcif-162 → finalcif-164}/.run/compile_ui_files.run.xml +0 -0
  26. {finalcif-162 → finalcif-164}/.run/make documentation Windows.run.xml +0 -0
  27. {finalcif-162 → finalcif-164}/CODE_OF_CONDUCT.md +0 -0
  28. {finalcif-162 → finalcif-164}/CONTRIBUTING.md +0 -0
  29. {finalcif-162 → finalcif-164}/Finalcif_installer_win.spec +0 -0
  30. {finalcif-162 → finalcif-164}/Finalcif_linux_onefile.spec +0 -0
  31. {finalcif-162 → finalcif-164}/Finalcif_mac.spec +0 -0
  32. {finalcif-162 → finalcif-164}/LICENSE +0 -0
  33. {finalcif-162 → finalcif-164}/README.md +0 -0
  34. {finalcif-162 → finalcif-164}/finalcif/app_path.py +0 -0
  35. {finalcif-162 → finalcif-164}/finalcif/cif/__init__.py +0 -0
  36. {finalcif-162 → finalcif-164}/finalcif/cif/all_cif_dicts.py +0 -0
  37. {finalcif-162 → finalcif-164}/finalcif/cif/atoms.py +0 -0
  38. {finalcif-162 → finalcif-164}/finalcif/cif/checkcif/__init__.py +0 -0
  39. {finalcif-162 → finalcif-164}/finalcif/cif/checkcif/checkcif.py +0 -0
  40. {finalcif-162 → finalcif-164}/finalcif/cif/cif_dict_foo.py +0 -0
  41. {finalcif-162 → finalcif-164}/finalcif/cif/cif_order.py +0 -0
  42. {finalcif-162 → finalcif-164}/finalcif/cif/cod/__init__.py +0 -0
  43. {finalcif-162 → finalcif-164}/finalcif/cif/cod/deposit.py +0 -0
  44. {finalcif-162 → finalcif-164}/finalcif/cif/cod/deposit_check.py +0 -0
  45. {finalcif-162 → finalcif-164}/finalcif/cif/cod/deposition_list.py +0 -0
  46. {finalcif-162 → finalcif-164}/finalcif/cif/cod/doi.py +0 -0
  47. {finalcif-162 → finalcif-164}/finalcif/cif/cod/upload.py +0 -0
  48. {finalcif-162 → finalcif-164}/finalcif/cif/cod/website_parser.py +0 -0
  49. {finalcif-162 → finalcif-164}/finalcif/cif/core_dict.py +0 -0
  50. {finalcif-162 → finalcif-164}/finalcif/cif/hkl.py +0 -0
  51. {finalcif-162 → finalcif-164}/finalcif/cif/modulation_dict.py +0 -0
  52. {finalcif-162 → finalcif-164}/finalcif/cif/powder_dict.py +0 -0
  53. {finalcif-162 → finalcif-164}/finalcif/cif/reference.py +0 -0
  54. {finalcif-162 → finalcif-164}/finalcif/cif/restraints_dict.py +0 -0
  55. {finalcif-162 → finalcif-164}/finalcif/cif/text.py +0 -0
  56. {finalcif-162 → finalcif-164}/finalcif/cif/twin_dict.py +0 -0
  57. {finalcif-162 → finalcif-164}/finalcif/cif/vrf_entry.py +0 -0
  58. {finalcif-162 → finalcif-164}/finalcif/ciforder/__init__.py +0 -0
  59. {finalcif-162 → finalcif-164}/finalcif/ciforder/order.py +0 -0
  60. {finalcif-162 → finalcif-164}/finalcif/datafiles/__init__.py +0 -0
  61. {finalcif-162 → finalcif-164}/finalcif/datafiles/bruker_data.py +0 -0
  62. {finalcif-162 → finalcif-164}/finalcif/datafiles/bruker_frame.py +0 -0
  63. {finalcif-162 → finalcif-164}/finalcif/datafiles/ccdc_mail.py +0 -0
  64. {finalcif-162 → finalcif-164}/finalcif/datafiles/data.py +0 -0
  65. {finalcif-162 → finalcif-164}/finalcif/datafiles/p4p_reader.py +0 -0
  66. {finalcif-162 → finalcif-164}/finalcif/datafiles/sadabs.py +0 -0
  67. {finalcif-162 → finalcif-164}/finalcif/datafiles/saint.py +0 -0
  68. {finalcif-162 → finalcif-164}/finalcif/datafiles/shelx_lst.py +0 -0
  69. {finalcif-162 → finalcif-164}/finalcif/datafiles/utils.py +0 -0
  70. {finalcif-162 → finalcif-164}/finalcif/displaymol/__init__.py +0 -0
  71. {finalcif-162 → finalcif-164}/finalcif/displaymol/vtk_molecule.py +0 -0
  72. {finalcif-162 → finalcif-164}/finalcif/equip_property/__init__.py +0 -0
  73. {finalcif-162 → finalcif-164}/finalcif/equip_property/author_loop_templates.py +0 -0
  74. {finalcif-162 → finalcif-164}/finalcif/equip_property/equipment.py +0 -0
  75. {finalcif-162 → finalcif-164}/finalcif/equip_property/properties.py +0 -0
  76. {finalcif-162 → finalcif-164}/finalcif/equip_property/tools.py +0 -0
  77. {finalcif-162 → finalcif-164}/finalcif/finalcif_start.py +0 -0
  78. {finalcif-162 → finalcif-164}/finalcif/gui/__init__.py +0 -0
  79. {finalcif-162 → finalcif-164}/finalcif/gui/block_combobox.py +0 -0
  80. {finalcif-162 → finalcif-164}/finalcif/gui/cif_table_model.py +0 -0
  81. {finalcif-162 → finalcif-164}/finalcif/gui/cif_table_view.py +0 -0
  82. {finalcif-162 → finalcif-164}/finalcif/gui/combobox.py +0 -0
  83. {finalcif-162 → finalcif-164}/finalcif/gui/custom_classes.py +0 -0
  84. {finalcif-162 → finalcif-164}/finalcif/gui/dialogs.py +0 -0
  85. {finalcif-162 → finalcif-164}/finalcif/gui/edit_button.py +0 -0
  86. {finalcif-162 → finalcif-164}/finalcif/gui/equipmenttable.py +0 -0
  87. {finalcif-162 → finalcif-164}/finalcif/gui/file_editor.py +0 -0
  88. {finalcif-162 → finalcif-164}/finalcif/gui/import_selector.py +0 -0
  89. {finalcif-162 → finalcif-164}/finalcif/gui/import_selector_ui.py +0 -0
  90. {finalcif-162 → finalcif-164}/finalcif/gui/import_selector_ui.ui +0 -0
  91. {finalcif-162 → finalcif-164}/finalcif/gui/loop_creator.py +0 -0
  92. {finalcif-162 → finalcif-164}/finalcif/gui/loop_creator_ui.py +0 -0
  93. {finalcif-162 → finalcif-164}/finalcif/gui/loop_creator_ui.ui +0 -0
  94. {finalcif-162 → finalcif-164}/finalcif/gui/loops.py +0 -0
  95. {finalcif-162 → finalcif-164}/finalcif/gui/mixins.py +0 -0
  96. {finalcif-162 → finalcif-164}/finalcif/gui/new_key_dialog.py +0 -0
  97. {finalcif-162 → finalcif-164}/finalcif/gui/new_key_dialog_ui.py +0 -0
  98. {finalcif-162 → finalcif-164}/finalcif/gui/new_key_dialog_ui.ui +0 -0
  99. {finalcif-162 → finalcif-164}/finalcif/gui/plaintextedit.py +0 -0
  100. {finalcif-162 → finalcif-164}/finalcif/gui/playground.py +0 -0
  101. {finalcif-162 → finalcif-164}/finalcif/gui/propertytable.py +0 -0
  102. {finalcif-162 → finalcif-164}/finalcif/gui/spell_check_edit.py +0 -0
  103. {finalcif-162 → finalcif-164}/finalcif/gui/syntax_highlighter.py +0 -0
  104. {finalcif-162 → finalcif-164}/finalcif/gui/text_templates_ui.py +0 -0
  105. {finalcif-162 → finalcif-164}/finalcif/gui/text_templates_ui.ui +0 -0
  106. {finalcif-162 → finalcif-164}/finalcif/gui/text_value_editor.py +0 -0
  107. {finalcif-162 → finalcif-164}/finalcif/gui/validators.py +0 -0
  108. {finalcif-162 → finalcif-164}/finalcif/gui/vrf_classes.py +0 -0
  109. {finalcif-162 → finalcif-164}/finalcif/gui/vzs_viewer.py +0 -0
  110. {finalcif-162 → finalcif-164}/finalcif/icon/__init__.py +0 -0
  111. {finalcif-162 → finalcif-164}/finalcif/icon/finalcif.png +0 -0
  112. {finalcif-162 → finalcif-164}/finalcif/icon/finalcif2.ico +0 -0
  113. {finalcif-162 → finalcif-164}/finalcif/icon/finalcif2.png +0 -0
  114. {finalcif-162 → finalcif-164}/finalcif/icon/multitable.ico +0 -0
  115. {finalcif-162 → finalcif-164}/finalcif/icon/multitable.png +0 -0
  116. {finalcif-162 → finalcif-164}/finalcif/icon/multitable.xcf +0 -0
  117. {finalcif-162 → finalcif-164}/finalcif/report/__init__.py +0 -0
  118. {finalcif-162 → finalcif-164}/finalcif/report/archive_report.py +0 -0
  119. {finalcif-162 → finalcif-164}/finalcif/report/gui/__init__.py +0 -0
  120. {finalcif-162 → finalcif-164}/finalcif/report/gui/mainwindow.py +0 -0
  121. {finalcif-162 → finalcif-164}/finalcif/report/gui/mainwindow.ui +0 -0
  122. {finalcif-162 → finalcif-164}/finalcif/report/mtools.py +0 -0
  123. {finalcif-162 → finalcif-164}/finalcif/report/references.py +0 -0
  124. {finalcif-162 → finalcif-164}/finalcif/report/report_text.py +0 -0
  125. {finalcif-162 → finalcif-164}/finalcif/report/symm.py +0 -0
  126. {finalcif-162 → finalcif-164}/finalcif/report/tables.py +0 -0
  127. {finalcif-162 → finalcif-164}/finalcif/report/templated_report.py +0 -0
  128. {finalcif-162 → finalcif-164}/finalcif/template/__init__.py +0 -0
  129. {finalcif-162 → finalcif-164}/finalcif/template/bootstrap/bootstrap.min.css +0 -0
  130. {finalcif-162 → finalcif-164}/finalcif/template/machines/D8_VENTURE.cif +0 -0
  131. {finalcif-162 → finalcif-164}/finalcif/template/mathml2omml.xsl +0 -0
  132. {finalcif-162 → finalcif-164}/finalcif/template/report.tex +0 -0
  133. {finalcif-162 → finalcif-164}/finalcif/template/report.tmpl +0 -0
  134. {finalcif-162 → finalcif-164}/finalcif/template/report2.tex +0 -0
  135. {finalcif-162 → finalcif-164}/finalcif/template/report_default.docx +0 -0
  136. {finalcif-162 → finalcif-164}/finalcif/template/template1.docx +0 -0
  137. {finalcif-162 → finalcif-164}/finalcif/template/template_for_multitable.docx +0 -0
  138. {finalcif-162 → finalcif-164}/finalcif/template/template_text.docx +0 -0
  139. {finalcif-162 → finalcif-164}/finalcif/template/template_without_text.docx +0 -0
  140. {finalcif-162 → finalcif-164}/finalcif/template/templates.py +0 -0
  141. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/FakeContext.py +0 -0
  142. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/FakeTokenizer.py +0 -0
  143. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/README.md +0 -0
  144. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/TokenizerPassThru.py +0 -0
  145. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/LICENSE +0 -0
  146. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/__init__.py +0 -0
  147. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/u2l.py +0 -0
  148. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/unicode-math-table.tex +0 -0
  149. {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/unicode-math-xetex.sty +0 -0
  150. {finalcif-162 → finalcif-164}/finalcif/template/xsl/convert.py +0 -0
  151. {finalcif-162 → finalcif-164}/finalcif/template/xsl/xmltohtml.xsl +0 -0
  152. {finalcif-162 → finalcif-164}/finalcif/template/xsl/xmltolatex.xsl +0 -0
  153. {finalcif-162 → finalcif-164}/finalcif/tools/__init__.py +0 -0
  154. {finalcif-162 → finalcif-164}/finalcif/tools/chemparse.py +0 -0
  155. {finalcif-162 → finalcif-164}/finalcif/tools/download.py +0 -0
  156. {finalcif-162 → finalcif-164}/finalcif/tools/dsrmath.py +0 -0
  157. {finalcif-162 → finalcif-164}/finalcif/tools/misc.py +0 -0
  158. {finalcif-162 → finalcif-164}/finalcif/tools/options.py +0 -0
  159. {finalcif-162 → finalcif-164}/finalcif/tools/pupdate.py +0 -0
  160. {finalcif-162 → finalcif-164}/finalcif/tools/settings.py +0 -0
  161. {finalcif-162 → finalcif-164}/finalcif/tools/shred.py +0 -0
  162. {finalcif-162 → finalcif-164}/finalcif/tools/space_groups.py +0 -0
  163. {finalcif-162 → finalcif-164}/finalcif/tools/spgr_format.py +0 -0
  164. {finalcif-162 → finalcif-164}/finalcif/tools/statusbar.py +0 -0
  165. {finalcif-162 → finalcif-164}/finalcif/tools/sumformula.py +0 -0
  166. {finalcif-162 → finalcif-164}/finalcif.exe +0 -0
  167. {finalcif-162 → finalcif-164}/platon/README.txt +0 -0
  168. {finalcif-162 → finalcif-164}/platon/compile_platon.bat +0 -0
  169. {finalcif-162 → finalcif-164}/platon/platon_special.exe +0 -0
  170. {finalcif-162 → finalcif-164}/platon/platon_special.f +0 -0
  171. {finalcif-162 → finalcif-164}/pylock.toml +0 -0
  172. {finalcif-162 → finalcif-164}/pyproject.toml +0 -0
  173. {finalcif-162 → finalcif-164}/run_finalcif +0 -0
  174. {finalcif-162 → finalcif-164}/run_finalcif.bat +0 -0
  175. {finalcif-162 → finalcif-164}/screenshots/finalcif_checkcif.png +0 -0
  176. {finalcif-162 → finalcif-164}/screenshots/finalcif_details.png +0 -0
  177. {finalcif-162 → finalcif-164}/screenshots/finalcif_loops.png +0 -0
  178. {finalcif-162 → finalcif-164}/screenshots/finalcif_loops2.png +0 -0
  179. {finalcif-162 → finalcif-164}/screenshots/finalcif_main.png +0 -0
  180. {finalcif-162 → finalcif-164}/screenshots/finalcif_report.png +0 -0
  181. {finalcif-162 → finalcif-164}/screenshots/finalcif_responses.png +0 -0
  182. {finalcif-162 → finalcif-164}/screenshots/loops_column_buttons.png +0 -0
  183. {finalcif-162 → finalcif-164}/update.exe +0 -0
  184. {finalcif-162 → finalcif-164}/work/diagnose_1519506.py +0 -0
  185. {finalcif-162 → finalcif-164}/work/diagnose_z.py +0 -0
  186. {finalcif-162 → finalcif-164}/work/investigate_failures.py +0 -0
  187. {finalcif-162 → finalcif-164}/work/validate_cod.py +0 -0
  188. {finalcif-162 → finalcif-164}/work/validate_zprime.py +0 -0
@@ -237,3 +237,7 @@ finalcif_keys_order.cif
237
237
  /tests/examples/work/report_cu_BruecknerJK_153F40_0m-finalcif.html
238
238
  /test-data/checkcif-DK_Zucker2_0m-finalcif.html
239
239
  /test-data/report_DK_Zucker2_0m-finalcif.html
240
+ /work/dicts/cif_core.dic
241
+ /work/dicts/cif_ms.dic
242
+ /work/dicts/cif_pow.dic
243
+ /work/dicts/ddl.dic
@@ -33,7 +33,7 @@
33
33
  - SHELX parsing via the external `shelxfile` package (used in `report/templated_report.py`); in-tree `.lst` parser in `datafiles/shelx_lst.py`.
34
34
  - **CIF Parsing:** Standardized on `gemmi` (>=0.7.5); `gemmi.set_leak_warnings(False)` is set at startup.
35
35
  - **Key Third-Party Runtime Deps:** `qtpy` + `pyside6` / `pyside6-addons`, `gemmi`, `docxtpl[subdoc]`, `python-docx`, `shelxfile`, `fastmolwidget`, `crossrefapi`, `QtAwesome` (icon fonts), `pyenchant` (spell-check), `html2text`, `lxml`, `numpy<2.4`, `chardet` / `charset-normalizer`, `requests`/`urllib3`, `packaging`, `pefile` (see `pyproject.toml`).
36
-
36
+ - Use gemmi for CIF parsinf if many files need to be processed, because it is much faster than CifContainer. CifContainer is a wrapper around gemmi.cif that provides a dict-like interface and additional features, but it is slower than using gemmi directly.
37
37
  ## Conventions
38
38
  - **UI Files:** Edit `.ui` files in Qt Designer (`scripts/designer.py`), then regenerate via `python scripts/compile_ui_files.py`. Never hand-edit generated `*_ui.py`.
39
39
  - **qtpy Imports:** `from qtpy import QtCore, QtGui, QtWebEngineWidgets, QtWidgets, compat` — `QtWebEngine` is used and requires `PySide6-Addons`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: finalcif
3
- Version: 162
3
+ Version: 164
4
4
  Summary: CIF file editor
5
5
  Project-URL: Homepage, https://dkratzert.de/finalcif.html
6
6
  Project-URL: Bug Tracker, https://github.com/dkratzert/FinalCif/issues
@@ -0,0 +1,3 @@
1
+
2
+ VERSION = 164
3
+ __version__ = VERSION
@@ -41,7 +41,7 @@ from gemmi import cif
41
41
  from finalcif import VERSION
42
42
  from finalcif.app_path import application_path
43
43
  from finalcif.cif.checkcif.checkcif import MyHTMLParser, AlertHelp, CheckCif
44
- from finalcif.cif.cif_file_io import CifContainer, GemmiError
44
+ from finalcif.cif.cif_file_io import CifContainer, GemmiError, has_cif2_header
45
45
  from finalcif.cif.cod.deposit import CODdeposit
46
46
  from finalcif.cif.text import utf8_to_str, quote
47
47
  from finalcif.datafiles.bruker_data import BrukerData
@@ -160,7 +160,9 @@ class AppWindow(QMainWindow):
160
160
  # Inject the Author Editor tab (defined in the .ui file) into LoopsPage
161
161
  self.ui.loops_page.set_author_editor_tab(self.ui.author_editor_widget)
162
162
  self.fixfont = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.SystemFont.FixedFont)
163
- self.ui.shelx_TextEdit.setFont(self.fixfont)
163
+ shelx_font = QtGui.QFont(self.fixfont)
164
+ shelx_font.setPointSize(self.fixfont.pointSize() + 1)
165
+ self.ui.shelx_TextEdit.setFont(shelx_font)
164
166
  self.ui.shelx_warn_TextEdit.setFont(self.fixfont)
165
167
  self.ui.ckf_textedit.setFont(self.fixfont)
166
168
  self.settings = FinalCifSettings()
@@ -1248,17 +1250,18 @@ class AppWindow(QMainWindow):
1248
1250
  log_widget=self.ui.CheckCifLogPlainTextEdit,
1249
1251
  output_widget=self.ui.CheckcifPlaintextEdit,
1250
1252
  cif_file=self.cif.fileobj)
1251
- if runner.platon_exe is not None and not Path(runner.platon_exe).exists():
1253
+ if not Path(runner.platon_exe).exists():
1252
1254
  self.ui.CheckCifLogPlainTextEdit.setPlainText('\nPlaton executable not found!')
1253
1255
  self.ui.CheckCifLogPlainTextEdit.appendPlainText(
1254
1256
  'You can download Platon at http://www.platonsoft.nl/platon/\n')
1257
+ self.ui.CheckcifButton.setEnabled(True)
1258
+ return None
1255
1259
  runner.tick.connect(self.append_to_ciflog_without_newline)
1256
1260
  runner.finished.connect(lambda: self.ui.CheckcifButton.setEnabled(True))
1257
1261
  runner.run_process()
1258
- runner.formula.connect(self.add_moiety_furmula)
1259
1262
  return None
1260
1263
 
1261
- def add_moiety_furmula(self, formula_moiety):
1264
+ def add_moiety_furmula(self, formula_moiety: str) -> None:
1262
1265
  moiety = self.ui.cif_main_table.getTextFromKey(key='_chemical_formula_moiety', col=Column.CIF)
1263
1266
  if formula_moiety and moiety in ['', '?'] and not self.cif.is_multi_cif:
1264
1267
  self.ui.cif_main_table.setText(key='_chemical_formula_moiety', txt=formula_moiety, column=Column.EDIT)
@@ -1612,7 +1615,10 @@ class AppWindow(QMainWindow):
1612
1615
  """
1613
1616
  imp_cif: CifContainer
1614
1617
  if not filename:
1615
- filename = cif_file_open_dialog(parent=self, filter="CIF file (*.cif *.pcf *.cif_od *.cfx *.sqf)")
1618
+ filename = cif_file_open_dialog(
1619
+ parent=self,
1620
+ filter="CIF file (*.cif *.pcf *.cif_od *.cfx *.sqf)",
1621
+ )
1616
1622
  if not filename:
1617
1623
  return
1618
1624
  try:
@@ -1859,6 +1865,12 @@ class AppWindow(QMainWindow):
1859
1865
  cif_file = self.get_file_from_dialog()
1860
1866
  if not cif_file:
1861
1867
  return
1868
+ if has_cif2_header(cif_file):
1869
+ show_general_warning(
1870
+ self,
1871
+ "This is a CIF2 file and cannot be opened directly.\n",
1872
+ )
1873
+ return
1862
1874
  cif2 = CifContainer(cif_file)
1863
1875
  if cif2.is_multi_cif:
1864
1876
  show_general_warning(self, 'Can add single data CIFs only!')
@@ -1919,6 +1931,12 @@ class AppWindow(QMainWindow):
1919
1931
  if filepath.stat().st_size == 0:
1920
1932
  show_general_warning(self, 'This file has zero byte size!')
1921
1933
  return False
1934
+ if has_cif2_header(filepath):
1935
+ show_general_warning(
1936
+ self,
1937
+ "This is a CIF2 file and cannot be opened directly.\n",
1938
+ )
1939
+ return False
1922
1940
  return True
1923
1941
 
1924
1942
  def warn_about_bad_cif(self):
@@ -2077,7 +2095,10 @@ class AppWindow(QMainWindow):
2077
2095
  self.ui.zEstimateLabel.setText('?')
2078
2096
  self.ui.zEstimateLabel2.setText('?')
2079
2097
  return
2080
- confidence_icon = {'high': '✓', 'medium': '~', 'low': '?'}[result.confidence]
2098
+ # Propagate moiety formula to the CIF table if not already filled.
2099
+ if result.moiety_formula:
2100
+ self.add_moiety_furmula(result.moiety_formula)
2101
+ confidence_icon = {'high': '✓', 'medium': '~', 'formula': '≡', 'low': '?'}[result.confidence]
2081
2102
  self.ui.zEstimateLabel.setText(f"Z = {result.z} Z′ = {result.z_prime:.3g} {confidence_icon}")
2082
2103
  self.ui.zEstimateLabel2.setText(f"Z = {result.z} Z′ = {result.z_prime:.3g} {confidence_icon}")
2083
2104
  tip_lines = [
@@ -2092,6 +2113,11 @@ class AppWindow(QMainWindow):
2092
2113
  tip_lines.append("Confidence: MEDIUM — Z′ is a non-integer crystallographic")
2093
2114
  tip_lines.append("fraction (½, ⅓, ¼, or ⅙), suggesting the molecule sits")
2094
2115
  tip_lines.append("on a special position; the true Z may be higher.")
2116
+ elif result.confidence == 'formula':
2117
+ tip_lines.append("Confidence: FORMULA — Z was derived from the chemical formula.")
2118
+ tip_lines.append("The bond-graph method is unreliable for this structure")
2119
+ tip_lines.append("(typical for coordination polymers, metal–organic frameworks,")
2120
+ tip_lines.append("or other extended inorganic networks).")
2095
2121
  else:
2096
2122
  tip_lines.append("Confidence: LOW — Z′ is not a multiple of ½.")
2097
2123
  tip_lines.append("The bond-graph estimate is likely incorrect")
@@ -23,17 +23,41 @@ from gemmi.cif import as_string, Document, Loop
23
23
  from packaging.version import Version
24
24
  from shelxfile import Shelxfile
25
25
 
26
+ from finalcif.cif.cif_keyword_mapping import CIF2_TO_CIF11_KEYWORD_TABLE
27
+
28
+ # CIF data names are case-insensitive per the CIF specification. Build a
29
+ # case-folded lookup once at import time so the translator finds aliases
30
+ # regardless of the source file's casing.
31
+ _CIF2_TO_CIF11_LOWERCASE_LOOKUP = {
32
+ key.lower(): value for key, value in CIF2_TO_CIF11_KEYWORD_TABLE.items()
33
+ }
26
34
  from finalcif.cif.cif_order import order, special_keys, essential_keys, non_centrosymm_keys
27
35
  from finalcif.cif.hkl import HKL, Limit
28
36
  from finalcif.cif.text import utf8_to_str, quote, retranslate_delimiter
29
37
  from finalcif.datafiles.utils import DSRFind
30
38
  from finalcif.tools.misc import isnumeric, grouper, strip_finalcif_of_name, _angstrom_to_x
31
39
 
40
+ # Match CIF data names at line start (pairs or loop tags), allowing common
41
+ # CIF2/mmCIF token characters (dot, hyphen, brackets, parentheses and slash variants).
42
+ CIF_KEYWORD_PATTERN = re.compile(r'^(\s*)(_[a-zA-Z][a-zA-Z0-9_.\-\[\]()/]*)(?=\s|$)')
43
+
32
44
 
33
45
  class GemmiError(Exception):
34
46
  pass
35
47
 
36
48
 
49
+ def has_cif2_header(path: Path) -> bool:
50
+ """
51
+ Detect CIF2 content by header marker independent of file suffix.
52
+ """
53
+ with suppress(OSError, UnicodeDecodeError):
54
+ with path.open('r', encoding='utf-8', errors='ignore') as file:
55
+ header = file.read(512)
56
+ header = header.lstrip('\ufeff \t\r\n')
57
+ return header.startswith('#\\#CIF_2.0')
58
+ return False
59
+
60
+
37
61
  class CifContainer:
38
62
  """
39
63
  This class holds the content of a cif file, independent of the file parser used.
@@ -164,7 +188,8 @@ class CifContainer:
164
188
  self.atomic_struct: gemmi.SmallStructure = gemmi.make_small_structure_from_block(self.block)
165
189
  # A dictionary to convert Atom names like 'C1_2' or 'Ga3' into Element names like 'C' or 'Ga'
166
190
  self._name2elements = dict(zip([x.upper() for x in self.block.find_loop('_atom_site_label')],
167
- [y.upper() for y in self.block.find_loop('_atom_site_type_symbol')], strict=False))
191
+ [y.upper() for y in self.block.find_loop('_atom_site_type_symbol')],
192
+ strict=False))
168
193
  self.check_hkl_min_max()
169
194
 
170
195
  @property
@@ -197,16 +222,92 @@ class CifContainer:
197
222
  Reads a cif file and returns a gemmi document object.
198
223
  """
199
224
  doc = gemmi.cif.Document()
225
+ suffix = path.suffix.lower()
226
+ has_cif2_header = self._has_cif2_header(path)
200
227
  # support for platon squeeze files:
201
- if path.suffix == '.sqf':
228
+ if suffix == '.sqf':
202
229
  txt = path.read_text(encoding='ascii')
203
230
  txt = 'data_justrandomlkdsadflkmcn\n' + txt
204
231
  doc.parse_string(txt)
205
232
  else:
206
233
  doc.source = str(path.resolve())
207
234
  doc.parse_file(str(path.resolve()))
235
+ if suffix == '.mmcif' or has_cif2_header:
236
+ doc = self._convert_doc_to_cif11(doc)
208
237
  return doc
209
238
 
239
+ @staticmethod
240
+ def _has_cif2_header(path: Path) -> bool:
241
+ return has_cif2_header(path)
242
+
243
+ @staticmethod
244
+ def _convert_doc_to_cif11(doc: gemmi.cif.Document) -> gemmi.cif.Document:
245
+ """
246
+ Normalizes CIF2/mmCIF input to CIF 1.1 text representation.
247
+ This keeps downstream processing compatible with code paths that assume CIF 1.1 tokens.
248
+ Conversion is done as a round-trip serialization/parsing step with stable write options.
249
+ """
250
+ options = gemmi.cif.WriteOptions()
251
+ options.prefer_pairs = False
252
+ options.compact = False
253
+ # Keep alignment settings identical to the regular CifContainer text output.
254
+ options.align_pairs = 33
255
+ options.align_loops = 15
256
+ options.misuse_hash = False
257
+ normalized_text = doc.as_string(options=options)
258
+ translated_text = CifContainer._translate_keywords_to_cif11(normalized_text)
259
+ converted = gemmi.cif.Document()
260
+ converted.source = doc.source
261
+ converted.parse_string(translated_text)
262
+ return converted
263
+
264
+ @staticmethod
265
+ def _translate_keywords_to_cif11(cif_text: str) -> str:
266
+ """
267
+ Translate CIF2/mmCIF keyword notation to CIF 1.1-compatible names.
268
+ Uses the CIVET-style legacy conversion approach for data names:
269
+ modern dotted names are converted to underscore names.
270
+ """
271
+ translated_lines: list[str] = []
272
+ in_text_block = False
273
+ for line in cif_text.split('\n'):
274
+ stripped = line.strip()
275
+ if stripped == ';':
276
+ in_text_block = not in_text_block
277
+ translated_lines.append(line)
278
+ continue
279
+ if in_text_block or stripped.startswith('#') or not stripped:
280
+ translated_lines.append(line)
281
+ continue
282
+ field_match = CIF_KEYWORD_PATTERN.match(line)
283
+ if field_match:
284
+ indent, field_name = field_match.groups()
285
+ translated_field = CifContainer._translate_keyword_to_cif11(field_name)
286
+ if translated_field != field_name:
287
+ remainder = line[field_match.end(2):]
288
+ line = f'{indent}{translated_field}{remainder}'
289
+ translated_lines.append(line)
290
+ return '\n'.join(translated_lines)
291
+
292
+ @staticmethod
293
+ def _translate_keyword_to_cif11(keyword: str) -> str:
294
+ """
295
+ Translate one CIF2/mmCIF keyword to CIF 1.1 legacy naming.
296
+
297
+ The lookup is case-insensitive (CIF data names are case-insensitive
298
+ per the CIF specification). When no explicit alias is registered in
299
+ ``CIF2_TO_CIF11_KEYWORD_TABLE``, a trivial dot-to-underscore rewrite
300
+ is applied. The mapping table is regenerated by
301
+ ``scripts/generate_keyword_mapping.py`` from the upstream DDLm
302
+ dictionaries.
303
+ """
304
+ mapped = _CIF2_TO_CIF11_LOWERCASE_LOOKUP.get(keyword.lower())
305
+ if mapped is not None:
306
+ return mapped
307
+ if '.' not in keyword:
308
+ return keyword
309
+ return keyword.replace('.', '_')
310
+
210
311
  def read_string(self, cif_string: str) -> gemmi.cif.Document:
211
312
  """
212
313
  Reads a cif file from a string and returns a gemmi cif docment.
@@ -869,9 +970,9 @@ class CifContainer:
869
970
  publ_loop = self.block.find_loop('_geom_angle_publ_flag') or len(label1) * ['?']
870
971
  angle = namedtuple('angle', ('label1', 'label2', 'label3', 'angle_val', 'symm1', 'symm2'))
871
972
  for label1, label2, label3, angle_val, symm1, symm2, publ in (
872
- zip(label1, label2, label3, angle_val, symm1, symm2, publ_loop, strict=False)):
973
+ zip(label1, label2, label3, angle_val, symm1, symm2, publ_loop, strict=False)):
873
974
  if ((without_H and (self.ishydrogen(label1) or self.ishydrogen(label2) or self.ishydrogen(label3))) or
874
- self.yes_not_set(publ)):
975
+ self.yes_not_set(publ)):
875
976
  continue
876
977
  else:
877
978
  yield angle(label1=label1, label2=label2, label3=label3, angle_val=angle_val,
@@ -945,7 +1046,7 @@ class CifContainer:
945
1046
  hydr = namedtuple('HydrogenBond', ('label_d', 'label_h', 'label_a', 'dist_dh', 'dist_ha', 'dist_da',
946
1047
  'angle_dha', 'symm'))
947
1048
  for label_d, label_h, label_a, dist_dh, dist_ha, dist_da, angle_dha, symm, publ in (
948
- zip(label_d, label_h, label_a, dist_dh, dist_ha, dist_da, angle_dha, symm, publ_loop, strict=False)):
1049
+ zip(label_d, label_h, label_a, dist_dh, dist_ha, dist_da, angle_dha, symm, publ_loop, strict=False)):
949
1050
  if self.yes_not_set(publ):
950
1051
  continue
951
1052
  if self.picometer:
@@ -0,0 +1,232 @@
1
+ # ----------------------------------------------------------------------------
2
+ # "THE BEER-WARE LICENSE" (Revision 42):
3
+ # dkratzert@gmx.de> wrote this file. As long as you retain
4
+ # this notice you can do whatever you want with this stuff. If we meet some day,
5
+ # and you think this stuff is worth it, you can buy me a beer in return.
6
+ # Dr. Daniel Kratzert
7
+ # ----------------------------------------------------------------------------
8
+
9
+ # Auto-generated by scripts/generate_keyword_mapping.py -- DO NOT EDIT BY HAND.
10
+ #
11
+ # Mapping of CIF2/DDLm dotted data names to their preferred CIF 1.1 legacy
12
+ # alias, restricted to entries where a plain ``replace('.', '_')`` would NOT
13
+ # yield the correct legacy name. Trivial cases are handled at runtime in
14
+ # CifContainer._translate_keyword_to_cif11.
15
+ #
16
+ # Source dictionaries (DDLm):
17
+ # * cif_core.dic -- https://github.com/COMCIFS/cif_core
18
+ # * cif_pow.dic -- https://github.com/COMCIFS/Powder_Dictionary
19
+ # * cif_ms.dic -- https://github.com/COMCIFS/Modulated_Structures
20
+ # * ddl.dic -- https://github.com/COMCIFS/DDLm
21
+ #
22
+ # When several legacy aliases are listed in a DDLm definition, the first
23
+ # underscore-only (non-dotted) alias is selected as the most widely used form.
24
+ # A small set of MANUAL_OVERRIDES (defined in the generator script) pins the
25
+ # historically dominant CIF 1.1 names consumed by PLATON / SHELX / CheckCIF
26
+ # / COD / CCDC even when the upstream dictionary no longer lists them as
27
+ # aliases.
28
+
29
+ CIF2_TO_CIF11_KEYWORD_TABLE = {
30
+ '_atom_scat_versus_stol.atom_type' : '_atom_type_scat_versus_stol_list',
31
+ '_atom_site.refinement_flags_posn' : '_atom_site_refinement_flags',
32
+ '_atom_site_U_Legendre.atom_site_label' : '_jana_atom_site_U_Legendre_atom_site_label',
33
+ '_atom_site_U_Legendre.coeff' : '_jana_atom_site_U_Legendre_param_coeff',
34
+ '_atom_site_U_Legendre.order' : '_jana_atom_site_U_Legendre_param_order',
35
+ '_atom_site_U_Legendre.tens_elem' : '_jana_atom_site_U_Legendre_tens_elem',
36
+ '_atom_site_U_ortho.coeff' : '_jana_atom_site_U_crenel_ortho_param_coeff',
37
+ '_atom_site_U_ortho.func_id' : '_jana_atom_site_U_crenel_ortho_id',
38
+ '_atom_site_U_ortho.tens_elem' : '_jana_atom_site_U_crenel_ortho_tens_elem',
39
+ '_atom_site_U_xharm.atom_site_label' : '_jana_atom_site_U_XHarm_atom_site_label',
40
+ '_atom_site_U_xharm.coeff' : '_jana_atom_site_U_XHarm_param_coeff',
41
+ '_atom_site_U_xharm.order' : '_jana_atom_site_U_XHarm_param_order',
42
+ '_atom_site_U_xharm.tens_elem' : '_jana_atom_site_U_XHarm_tens_elem',
43
+ '_atom_site_displace_Legendre.axis' : '_jana_atom_site_displace_Legendre_axis',
44
+ '_atom_site_displace_ortho.axis' : '_jana_atom_site_displace_crenel_ortho_axis',
45
+ '_atom_site_displace_ortho.func_id' : '_jana_atom_site_displace_crenel_ortho_id',
46
+ '_atom_site_displace_sawtooth.ax' : '_atom_site_displace_special_func_sawtooth_ax',
47
+ '_atom_site_displace_sawtooth.ay' : '_atom_site_displace_special_func_sawtooth_ay',
48
+ '_atom_site_displace_sawtooth.az' : '_atom_site_displace_special_func_sawtooth_az',
49
+ '_atom_site_displace_sawtooth.c' : '_atom_site_displace_special_func_sawtooth_c',
50
+ '_atom_site_displace_sawtooth.w' : '_atom_site_displace_special_func_sawtooth_w',
51
+ '_atom_site_displace_xharm.atom_site_label' : '_jana_atom_site_displace_XHarm_site_label',
52
+ '_atom_site_displace_xharm.axis' : '_jana_atom_site_displace_XHarm_axis',
53
+ '_atom_site_displace_xharm.coeff' : '_jana_atom_site_displace_XHarm_param_coeff',
54
+ '_atom_site_displace_xharm.order' : '_jana_atom_site_displace_XHarm_param_order',
55
+ '_atom_site_occ_Legendre.atom_site_label' : '_jana_atom_site_occ_Legendre_atom_site_label',
56
+ '_atom_site_occ_Legendre.coeff' : '_jana_atom_site_occ_Legendre_param_coeff',
57
+ '_atom_site_occ_Legendre.order' : '_jana_atom_site_occ_Legendre_param_order',
58
+ '_atom_site_occ_crenel.atom_site_label' : '_atom_site_occ_special_func_atom_site_label',
59
+ '_atom_site_occ_crenel.c' : '_atom_site_occ_special_func_crenel_c',
60
+ '_atom_site_occ_crenel.ortho_eps' : '_jana_atom_site_crenel_ortho_func_eps',
61
+ '_atom_site_occ_crenel.w' : '_atom_site_occ_special_func_crenel_w',
62
+ '_atom_site_occ_ortho.coeff' : '_jana_atom_site_occ_crenel_ortho_param_coeff',
63
+ '_atom_site_occ_ortho.func_id' : '_jana_atom_site_occ_crenel_ortho_id',
64
+ '_atom_site_occ_xharm.atom_site_label' : '_jana_atom_site_occ_XHarm_atom_site_label',
65
+ '_atom_site_occ_xharm.coeff' : '_jana_atom_site_occ_XHarm_param_coeff',
66
+ '_atom_site_occ_xharm.order' : '_jana_atom_site_occ_XHarm_param_order',
67
+ '_atom_site_rot_sawtooth.atom_site_label' : '_atom_site_rot_special_func_atom_site_label',
68
+ '_atom_site_rot_sawtooth.ax' : '_atom_site_rot_special_func_sawtooth_ax',
69
+ '_atom_site_rot_sawtooth.ay' : '_atom_site_rot_special_func_sawtooth_ay',
70
+ '_atom_site_rot_sawtooth.az' : '_atom_site_rot_special_func_sawtooth_az',
71
+ '_atom_site_rot_sawtooth.c' : '_atom_site_rot_special_func_sawtooth_c',
72
+ '_atom_site_rot_sawtooth.w' : '_atom_site_rot_special_func_sawtooth_w',
73
+ '_atom_sites_Cartn_transform.mat_11' : '_atom_sites_Cartn_tran_matrix_11',
74
+ '_atom_sites_Cartn_transform.mat_12' : '_atom_sites_Cartn_tran_matrix_12',
75
+ '_atom_sites_Cartn_transform.mat_13' : '_atom_sites_Cartn_tran_matrix_13',
76
+ '_atom_sites_Cartn_transform.mat_21' : '_atom_sites_Cartn_tran_matrix_21',
77
+ '_atom_sites_Cartn_transform.mat_22' : '_atom_sites_Cartn_tran_matrix_22',
78
+ '_atom_sites_Cartn_transform.mat_23' : '_atom_sites_Cartn_tran_matrix_23',
79
+ '_atom_sites_Cartn_transform.mat_31' : '_atom_sites_Cartn_tran_matrix_31',
80
+ '_atom_sites_Cartn_transform.mat_32' : '_atom_sites_Cartn_tran_matrix_32',
81
+ '_atom_sites_Cartn_transform.mat_33' : '_atom_sites_Cartn_tran_matrix_33',
82
+ '_atom_sites_Cartn_transform.vec_1' : '_atom_sites_Cartn_tran_vector_1',
83
+ '_atom_sites_Cartn_transform.vec_2' : '_atom_sites_Cartn_tran_vector_2',
84
+ '_atom_sites_Cartn_transform.vec_3' : '_atom_sites_Cartn_tran_vector_3',
85
+ '_atom_sites_cartn_transform.mat_11' : '_atom_sites_Cartn_tran_matrix_11',
86
+ '_atom_sites_cartn_transform.mat_12' : '_atom_sites_Cartn_tran_matrix_12',
87
+ '_atom_sites_cartn_transform.mat_13' : '_atom_sites_Cartn_tran_matrix_13',
88
+ '_atom_sites_cartn_transform.mat_21' : '_atom_sites_Cartn_tran_matrix_21',
89
+ '_atom_sites_cartn_transform.mat_22' : '_atom_sites_Cartn_tran_matrix_22',
90
+ '_atom_sites_cartn_transform.mat_23' : '_atom_sites_Cartn_tran_matrix_23',
91
+ '_atom_sites_cartn_transform.mat_31' : '_atom_sites_Cartn_tran_matrix_31',
92
+ '_atom_sites_cartn_transform.mat_32' : '_atom_sites_Cartn_tran_matrix_32',
93
+ '_atom_sites_cartn_transform.mat_33' : '_atom_sites_Cartn_tran_matrix_33',
94
+ '_atom_sites_cartn_transform.vec_1' : '_atom_sites_Cartn_tran_vector_1',
95
+ '_atom_sites_cartn_transform.vec_2' : '_atom_sites_Cartn_tran_vector_2',
96
+ '_atom_sites_cartn_transform.vec_3' : '_atom_sites_Cartn_tran_vector_3',
97
+ '_atom_sites_fract_transform.mat_11' : '_atom_sites_fract_tran_matrix_11',
98
+ '_atom_sites_fract_transform.mat_12' : '_atom_sites_fract_tran_matrix_12',
99
+ '_atom_sites_fract_transform.mat_13' : '_atom_sites_fract_tran_matrix_13',
100
+ '_atom_sites_fract_transform.mat_21' : '_atom_sites_fract_tran_matrix_21',
101
+ '_atom_sites_fract_transform.mat_22' : '_atom_sites_fract_tran_matrix_22',
102
+ '_atom_sites_fract_transform.mat_23' : '_atom_sites_fract_tran_matrix_23',
103
+ '_atom_sites_fract_transform.mat_31' : '_atom_sites_fract_tran_matrix_31',
104
+ '_atom_sites_fract_transform.mat_32' : '_atom_sites_fract_tran_matrix_32',
105
+ '_atom_sites_fract_transform.mat_33' : '_atom_sites_fract_tran_matrix_33',
106
+ '_atom_sites_fract_transform.vec_1' : '_atom_sites_fract_tran_vector_1',
107
+ '_atom_sites_fract_transform.vec_2' : '_atom_sites_fract_tran_vector_2',
108
+ '_atom_sites_fract_transform.vec_3' : '_atom_sites_fract_tran_vector_3',
109
+ '_atom_sites_ortho.func_id' : '_jana_atom_site_crenel_ortho_func_id',
110
+ '_atom_type.analytical_mass_percent' : '_atom_type_analytical_mass_%',
111
+ '_cell.commen_supercell_matrix_1_1' : '_jana_cell_commen_supercell_matrix_1_1',
112
+ '_cell.commen_supercell_matrix_1_2' : '_jana_cell_commen_supercell_matrix_1_2',
113
+ '_cell.commen_supercell_matrix_1_3' : '_jana_cell_commen_supercell_matrix_1_3',
114
+ '_cell.commen_supercell_matrix_2_1' : '_jana_cell_commen_supercell_matrix_2_1',
115
+ '_cell.commen_supercell_matrix_2_2' : '_jana_cell_commen_supercell_matrix_2_2',
116
+ '_cell.commen_supercell_matrix_2_3' : '_jana_cell_commen_supercell_matrix_2_3',
117
+ '_cell.commen_supercell_matrix_3_1' : '_jana_cell_commen_supercell_matrix_3_1',
118
+ '_cell.commen_supercell_matrix_3_2' : '_jana_cell_commen_supercell_matrix_3_2',
119
+ '_cell.commen_supercell_matrix_3_3' : '_jana_cell_commen_supercell_matrix_3_3',
120
+ '_cell_measurement.temperature_su' : '_cell_measurement_temp_su',
121
+ '_citation_editor.name' : '_citation_editor',
122
+ '_computing.diffrn_collection' : '_computing_data_collection',
123
+ '_computing.diffrn_reduction' : '_computing_data_reduction',
124
+ '_diffrn.ambient_temperature' : '_cell_measurement_temperature',
125
+ '_diffrn.ambient_temperature_details' : '_diffrn_ambient_temp_details',
126
+ '_diffrn.ambient_temperature_gt' : '_diffrn_ambient_temp_gt',
127
+ '_diffrn.ambient_temperature_lt' : '_diffrn_ambient_temp_lt',
128
+ '_diffrn_detector.description' : '_diffrn_radiation_detector',
129
+ '_diffrn_detector.make' : '_diffrn_detector_type',
130
+ '_diffrn_measurement.device_class' : '_diffrn_measurement_device',
131
+ '_diffrn_measurement.device_make' : '_diffrn_measurement_device_type',
132
+ '_diffrn_radiation_wavelength.value' : '_cell_measurement_wavelength',
133
+ '_diffrn_radiation_wavelength.value_su' : '_diffrn_radiation_wavelength_su',
134
+ '_diffrn_refln.intensity_net_su' : '_diffrn_refln_intensity_u',
135
+ '_diffrn_refln.sin_theta_over_lambda' : '_diffrn_refln_sint/lambda',
136
+ '_diffrn_reflns.av_sunetI_over_netI' : '_diffrn_reflns_av_sigmaI/netI',
137
+ '_diffrn_reflns_class.av_suI_over_I' : '_diffrn_reflns_class_av_uI_over_I',
138
+ '_diffrn_source.description' : '_diffrn_source',
139
+ '_diffrn_source.take_off_angle' : '_diffrn_source_take-off_angle',
140
+ '_diffrn_standards.decay_percent' : '_diffrn_standards_decay_%',
141
+ '_diffrn_standards.scale_su_average' : '_diffrn_standards_scale_sigma',
142
+ '_exptl_crystal_appearance.general' : '_exptl_crystal_colour_lustre',
143
+ '_exptl_crystal_appearance.hue' : '_exptl_crystal_colour_primary',
144
+ '_exptl_crystal_appearance.intensity' : '_exptl_crystal_colour_modifier',
145
+ '_geom_angle.value' : '_geom_angle',
146
+ '_geom_angle.value_av' : '_geom_angle_av',
147
+ '_geom_angle.value_max' : '_geom_angle_max',
148
+ '_geom_angle.value_min' : '_geom_angle_min',
149
+ '_geom_angle.value_su' : '_geom_angle_su',
150
+ '_geom_hbond.distance_HA_max' : '_geom_hbond_distance_max_av',
151
+ '_geom_hbond.distance_HA_min' : '_geom_hbond_distance_min_av',
152
+ '_geom_torsion.angle' : '_geom_torsion',
153
+ '_geom_torsion.angle_av' : '_geom_torsion_av',
154
+ '_geom_torsion.angle_max' : '_geom_torsion_max',
155
+ '_geom_torsion.angle_min' : '_geom_torsion_min',
156
+ '_geom_torsion.angle_su' : '_geom_torsion_su',
157
+ '_journal.validation_number' : '_journal_data_validation_number',
158
+ '_pd_instr.dist_anal_detc' : '_pd_instr_dist_anal/detc',
159
+ '_pd_instr.dist_mono_spec' : '_pd_instr_dist_mono/spec',
160
+ '_pd_instr.dist_spec_anal' : '_pd_instr_dist_spec/anal',
161
+ '_pd_instr.dist_spec_detc' : '_pd_instr_dist_spec/detc',
162
+ '_pd_instr.dist_src_mono' : '_pd_instr_dist_src/mono',
163
+ '_pd_instr.dist_src_spec' : '_pd_instr_dist_src/spec',
164
+ '_pd_instr.divg_ax_anal_detc' : '_pd_instr_divg_ax_anal/detc',
165
+ '_pd_instr.divg_ax_mono_spec' : '_pd_instr_divg_ax_mono/spec',
166
+ '_pd_instr.divg_ax_spec_anal' : '_pd_instr_divg_ax_spec/anal',
167
+ '_pd_instr.divg_ax_spec_detc' : '_pd_instr_divg_ax_spec/detc',
168
+ '_pd_instr.divg_ax_src_mono' : '_pd_instr_divg_ax_src/mono',
169
+ '_pd_instr.divg_ax_src_spec' : '_pd_instr_divg_ax_src/spec',
170
+ '_pd_instr.divg_eq_anal_detc' : '_pd_instr_divg_eq_anal/detc',
171
+ '_pd_instr.divg_eq_mono_spec' : '_pd_instr_divg_eq_mono/spec',
172
+ '_pd_instr.divg_eq_spec_anal' : '_pd_instr_divg_eq_spec/anal',
173
+ '_pd_instr.divg_eq_spec_detc' : '_pd_instr_divg_eq_spec/detc',
174
+ '_pd_instr.divg_eq_src_mono' : '_pd_instr_divg_eq_src/mono',
175
+ '_pd_instr.divg_eq_src_spec' : '_pd_instr_divg_eq_src/spec',
176
+ '_pd_instr.slit_ax_anal_detc' : '_pd_instr_slit_ax_anal/detc',
177
+ '_pd_instr.slit_ax_mono_spec' : '_pd_instr_slit_ax_mono/spec',
178
+ '_pd_instr.slit_ax_spec_anal' : '_pd_instr_slit_ax_spec/anal',
179
+ '_pd_instr.slit_ax_spec_detc' : '_pd_instr_slit_ax_spec/detc',
180
+ '_pd_instr.slit_ax_src_mono' : '_pd_instr_slit_ax_src/mono',
181
+ '_pd_instr.slit_ax_src_spec' : '_pd_instr_slit_ax_src/spec',
182
+ '_pd_instr.slit_eq_anal_detc' : '_pd_instr_slit_eq_anal/detc',
183
+ '_pd_instr.slit_eq_mono_spec' : '_pd_instr_slit_eq_mono/spec',
184
+ '_pd_instr.slit_eq_spec_anal' : '_pd_instr_slit_eq_spec/anal',
185
+ '_pd_instr.slit_eq_spec_detc' : '_pd_instr_slit_eq_spec/detc',
186
+ '_pd_instr.slit_eq_src_mono' : '_pd_instr_slit_eq_src/mono',
187
+ '_pd_instr.slit_eq_src_spec' : '_pd_instr_slit_eq_src/spec',
188
+ '_pd_instr.soller_ax_anal_detc' : '_pd_instr_soller_ax_anal/detc',
189
+ '_pd_instr.soller_ax_mono_spec' : '_pd_instr_soller_ax_mono/spec',
190
+ '_pd_instr.soller_ax_spec_anal' : '_pd_instr_soller_ax_spec/anal',
191
+ '_pd_instr.soller_ax_spec_detc' : '_pd_instr_soller_ax_spec/detc',
192
+ '_pd_instr.soller_ax_src_mono' : '_pd_instr_soller_ax_src/mono',
193
+ '_pd_instr.soller_ax_src_spec' : '_pd_instr_soller_ax_src/spec',
194
+ '_pd_instr.soller_eq_anal_detc' : '_pd_instr_soller_eq_anal/detc',
195
+ '_pd_instr.soller_eq_mono_spec' : '_pd_instr_soller_eq_mono/spec',
196
+ '_pd_instr.soller_eq_spec_anal' : '_pd_instr_soller_eq_spec/anal',
197
+ '_pd_instr.soller_eq_spec_detc' : '_pd_instr_soller_eq_spec/detc',
198
+ '_pd_instr.soller_eq_src_mono' : '_pd_instr_soller_eq_src/mono',
199
+ '_pd_instr.soller_eq_src_spec' : '_pd_instr_soller_eq_src/spec',
200
+ '_pd_phase_mass.percent' : '_pd_phase_mass_%',
201
+ '_pd_qpa_internal_std.mass_percent' : '_pd_calib_std_internal_mass_%',
202
+ '_publ_contact_author.contact_details' : '_publ_contact_author',
203
+ '_publ_contact_author.name' : '_publ_contact_author',
204
+ '_refine_ls.R_factor_gt' : '_refine_ls_R_factor_obs',
205
+ '_refine_ls.restrained_S_gt' : '_refine_ls_restrained_S_obs',
206
+ '_refine_ls.shift_over_su_max_lt' : '_refine_ls_shift/su_max_lt',
207
+ '_refine_ls.shift_over_su_mean_lt' : '_refine_ls_shift/su_mean_lt',
208
+ '_refine_ls.wR_factor_gt' : '_refine_ls_wR_factor_obs',
209
+ '_refln.F_meas_su' : '_refln_F_sigma',
210
+ '_refln.F_squared_meas_su' : '_refln_F_squared_sigma',
211
+ '_refln.sin_theta_over_lambda' : '_refln_sint/lambda',
212
+ '_reflns_class.number_gt' : '_reflns_class_number_observed',
213
+ '_reflns_shell.Rmerge_F_gt' : '_reflns_shell_Rmerge_F_obs',
214
+ '_reflns_shell.Rmerge_I_gt' : '_reflns_shell_Rmerge_I_obs',
215
+ '_reflns_shell.meanI_over_suI_all' : '_reflns_shell_meanI_over_uI_all',
216
+ '_reflns_shell.meanI_over_suI_gt' : '_reflns_shell_meanI_over_sigI_obs',
217
+ '_reflns_shell.number_measured_gt' : '_reflns_shell_number_measured_obs',
218
+ '_space_group.IT_number' : '_symmetry_Int_Tables_number',
219
+ '_space_group.crystal_system' : '_symmetry_cell_setting',
220
+ '_space_group.name_H-M_alt' : '_symmetry_space_group_name_H-M',
221
+ '_space_group.name_H-M_full' : '_symmetry_space_group_name_H-M',
222
+ '_space_group.name_Hall' : '_symmetry_space_group_name_Hall',
223
+ '_space_group_symop.id' : '_symmetry_equiv_pos_site_id',
224
+ '_space_group_symop.operation_xyz' : '_symmetry_equiv_pos_as_xyz',
225
+ '_superspace_group.IT_number' : '_space_group_ssg_IT_number',
226
+ '_superspace_group.WJJ_code' : '_space_group_ssg_WJJ_code',
227
+ '_superspace_group.name' : '_space_group_ssg_name',
228
+ '_superspace_group.name_IT' : '_space_group_ssg_name_IT',
229
+ '_superspace_group.name_WJJ' : '_space_group_ssg_name_WJJ',
230
+ '_superspace_group_symop.id' : '_space_group_symop_ssg_id',
231
+ '_superspace_group_symop.operation_algebraic': '_space_group_symop_ssg_operation_algebraic',
232
+ }
@@ -108,6 +108,7 @@ class Ui_CifOrderForm(object):
108
108
 
109
109
  self.helpTextLabel = QLabel(CifOrderForm)
110
110
  self.helpTextLabel.setObjectName(u"helpTextLabel")
111
+ self.helpTextLabel.setWordWrap(True)
111
112
 
112
113
  self.gridLayout.addWidget(self.helpTextLabel, 1, 0, 1, 2)
113
114
 
@@ -183,6 +183,9 @@
183
183
  <property name="text">
184
184
  <string>Order of CIF keys in the output file. Enabled means they will be forced to remain in the output CIF.</string>
185
185
  </property>
186
+ <property name="wordWrap">
187
+ <bool>true</bool>
188
+ </property>
186
189
  </widget>
187
190
  </item>
188
191
  </layout>