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.
- {finalcif-162 → finalcif-164}/.gitignore +4 -0
- {finalcif-162 → finalcif-164}/AGENTS.md +1 -1
- {finalcif-162 → finalcif-164}/PKG-INFO +1 -1
- finalcif-164/finalcif/__init__.py +3 -0
- {finalcif-162 → finalcif-164}/finalcif/appwindow.py +33 -7
- {finalcif-162 → finalcif-164}/finalcif/cif/cif_file_io.py +106 -5
- finalcif-164/finalcif/cif/cif_keyword_mapping.py +232 -0
- {finalcif-162 → finalcif-164}/finalcif/ciforder/order_ui.py +1 -0
- {finalcif-162 → finalcif-164}/finalcif/ciforder/order_ui.ui +3 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/finalcif_gui_ui.py +611 -600
- {finalcif-162 → finalcif-164}/finalcif/gui/finalcif_gui_ui.ui +905 -879
- {finalcif-162 → finalcif-164}/finalcif/gui/mainstackwidget.py +11 -0
- finalcif-164/finalcif/gui/single_line_textedit.py +34 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/platon.py +43 -19
- finalcif-164/finalcif/tools/z_from_packing.py +1189 -0
- {finalcif-162 → finalcif-164}/uv.lock +1 -1
- finalcif-164/work/compare_z_platon.py +347 -0
- finalcif-162/finalcif/__init__.py +0 -3
- finalcif-162/finalcif/tools/z_from_packing.py +0 -631
- {finalcif-162 → finalcif-164}/.gitattributes +0 -0
- {finalcif-162 → finalcif-164}/.githooks/pre-push +0 -0
- {finalcif-162 → finalcif-164}/.python-version +0 -0
- {finalcif-162 → finalcif-164}/.ruff.toml +0 -0
- {finalcif-162 → finalcif-164}/.run/Make Documentation MAC.run.xml +0 -0
- {finalcif-162 → finalcif-164}/.run/compile_ui_files.run.xml +0 -0
- {finalcif-162 → finalcif-164}/.run/make documentation Windows.run.xml +0 -0
- {finalcif-162 → finalcif-164}/CODE_OF_CONDUCT.md +0 -0
- {finalcif-162 → finalcif-164}/CONTRIBUTING.md +0 -0
- {finalcif-162 → finalcif-164}/Finalcif_installer_win.spec +0 -0
- {finalcif-162 → finalcif-164}/Finalcif_linux_onefile.spec +0 -0
- {finalcif-162 → finalcif-164}/Finalcif_mac.spec +0 -0
- {finalcif-162 → finalcif-164}/LICENSE +0 -0
- {finalcif-162 → finalcif-164}/README.md +0 -0
- {finalcif-162 → finalcif-164}/finalcif/app_path.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/all_cif_dicts.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/atoms.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/checkcif/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/checkcif/checkcif.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cif_dict_foo.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cif_order.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/deposit.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/deposit_check.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/deposition_list.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/doi.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/upload.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/cod/website_parser.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/core_dict.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/hkl.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/modulation_dict.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/powder_dict.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/reference.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/restraints_dict.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/text.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/twin_dict.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/cif/vrf_entry.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/ciforder/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/ciforder/order.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/bruker_data.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/bruker_frame.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/ccdc_mail.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/data.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/p4p_reader.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/sadabs.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/saint.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/shelx_lst.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/datafiles/utils.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/displaymol/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/displaymol/vtk_molecule.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/equip_property/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/equip_property/author_loop_templates.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/equip_property/equipment.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/equip_property/properties.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/equip_property/tools.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/finalcif_start.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/block_combobox.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/cif_table_model.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/cif_table_view.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/combobox.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/custom_classes.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/dialogs.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/edit_button.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/equipmenttable.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/file_editor.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/import_selector.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/import_selector_ui.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/import_selector_ui.ui +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/loop_creator.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/loop_creator_ui.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/loop_creator_ui.ui +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/loops.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/mixins.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/new_key_dialog.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/new_key_dialog_ui.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/new_key_dialog_ui.ui +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/plaintextedit.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/playground.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/propertytable.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/spell_check_edit.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/syntax_highlighter.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/text_templates_ui.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/text_templates_ui.ui +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/text_value_editor.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/validators.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/vrf_classes.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/gui/vzs_viewer.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/finalcif.png +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/finalcif2.ico +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/finalcif2.png +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/multitable.ico +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/multitable.png +0 -0
- {finalcif-162 → finalcif-164}/finalcif/icon/multitable.xcf +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/archive_report.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/gui/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/gui/mainwindow.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/gui/mainwindow.ui +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/mtools.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/references.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/report_text.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/symm.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/tables.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/report/templated_report.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/bootstrap/bootstrap.min.css +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/machines/D8_VENTURE.cif +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/mathml2omml.xsl +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/report.tex +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/report.tmpl +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/report2.tex +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/report_default.docx +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/template1.docx +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/template_for_multitable.docx +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/template_text.docx +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/template_without_text.docx +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/templates.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/FakeContext.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/FakeTokenizer.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/README.md +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/FakePlasTeX/TokenizerPassThru.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/LICENSE +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/u2l.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/unicode-math-table.tex +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/unicode2latex/unicode-math-xetex.sty +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/xsl/convert.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/xsl/xmltohtml.xsl +0 -0
- {finalcif-162 → finalcif-164}/finalcif/template/xsl/xmltolatex.xsl +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/__init__.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/chemparse.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/download.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/dsrmath.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/misc.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/options.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/pupdate.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/settings.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/shred.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/space_groups.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/spgr_format.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/statusbar.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif/tools/sumformula.py +0 -0
- {finalcif-162 → finalcif-164}/finalcif.exe +0 -0
- {finalcif-162 → finalcif-164}/platon/README.txt +0 -0
- {finalcif-162 → finalcif-164}/platon/compile_platon.bat +0 -0
- {finalcif-162 → finalcif-164}/platon/platon_special.exe +0 -0
- {finalcif-162 → finalcif-164}/platon/platon_special.f +0 -0
- {finalcif-162 → finalcif-164}/pylock.toml +0 -0
- {finalcif-162 → finalcif-164}/pyproject.toml +0 -0
- {finalcif-162 → finalcif-164}/run_finalcif +0 -0
- {finalcif-162 → finalcif-164}/run_finalcif.bat +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_checkcif.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_details.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_loops.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_loops2.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_main.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_report.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/finalcif_responses.png +0 -0
- {finalcif-162 → finalcif-164}/screenshots/loops_column_buttons.png +0 -0
- {finalcif-162 → finalcif-164}/update.exe +0 -0
- {finalcif-162 → finalcif-164}/work/diagnose_1519506.py +0 -0
- {finalcif-162 → finalcif-164}/work/diagnose_z.py +0 -0
- {finalcif-162 → finalcif-164}/work/investigate_failures.py +0 -0
- {finalcif-162 → finalcif-164}/work/validate_cod.py +0 -0
- {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`.
|
|
@@ -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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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')],
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|
|
@@ -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>
|