Full Code of qzhu2017/PyXtal for AI

master 344f658bf108 cached
610 files
28.5 MB
7.5M tokens
1555 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (29,989K chars total). Download the full file to get everything.
Repository: qzhu2017/PyXtal
Branch: master
Commit: 344f658bf108
Files: 610
Total size: 28.5 MB

Directory structure:
gitextract_ogx3exmn/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── python-publish.yml
│       └── tests.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── SECURITY.md
├── _config.yml
├── doc/
│   ├── Algorithm.rst
│   ├── Background.rst
│   ├── COMMAND_MODE.rst
│   ├── Installation.rst
│   ├── Makefile
│   ├── README.txt
│   ├── Settings.rst
│   ├── Symmetry_representation.rst
│   ├── Usage.rst
│   ├── conf.py
│   ├── files/
│   │   └── all.cif
│   ├── index.rst
│   ├── make.bat
│   ├── modules.rst
│   ├── pyxtal.XRD.rst
│   ├── pyxtal.block_crystal.rst
│   ├── pyxtal.constants.rst
│   ├── pyxtal.crystal.rst
│   ├── pyxtal.database.cifs.rst
│   ├── pyxtal.database.collection.rst
│   ├── pyxtal.database.element.rst
│   ├── pyxtal.database.rst
│   ├── pyxtal.db.rst
│   ├── pyxtal.descriptor.rst
│   ├── pyxtal.elasticity.rst
│   ├── pyxtal.interface.LJ.rst
│   ├── pyxtal.interface.ase_opt.rst
│   ├── pyxtal.interface.charmm.rst
│   ├── pyxtal.interface.dftb.rst
│   ├── pyxtal.interface.gulp.rst
│   ├── pyxtal.interface.lammpslib.rst
│   ├── pyxtal.interface.rst
│   ├── pyxtal.interface.vasp.rst
│   ├── pyxtal.io.rst
│   ├── pyxtal.lattice.rst
│   ├── pyxtal.lego.SO3.rst
│   ├── pyxtal.lego.basinhopping.rst
│   ├── pyxtal.lego.builder.rst
│   ├── pyxtal.lego.rst
│   ├── pyxtal.molecular_crystal.rst
│   ├── pyxtal.molecule.rst
│   ├── pyxtal.msg.rst
│   ├── pyxtal.operations.rst
│   ├── pyxtal.optimize.DFS.rst
│   ├── pyxtal.optimize.QRS.rst
│   ├── pyxtal.optimize.WFS.rst
│   ├── pyxtal.optimize.base.rst
│   ├── pyxtal.optimize.benchmark.rst
│   ├── pyxtal.optimize.common.rst
│   ├── pyxtal.optimize.rst
│   ├── pyxtal.plane.rst
│   ├── pyxtal.potentials.LJ_cluster.rst
│   ├── pyxtal.potentials.rst
│   ├── pyxtal.representation.rst
│   ├── pyxtal.rst
│   ├── pyxtal.supergroup.rst
│   ├── pyxtal.symmetry.rst
│   ├── pyxtal.tolerance.rst
│   ├── pyxtal.util.rst
│   ├── pyxtal.version.rst
│   ├── pyxtal.viz.rst
│   ├── pyxtal.wyckoff_site.rst
│   ├── pyxtal.wyckoff_split.rst
│   └── requirements.txt
├── examples/
│   ├── README.md
│   ├── example_00_LJ_simple.py
│   ├── example_01_3D_VASP.py
│   ├── example_02_LJ_cluster.py
│   ├── example_03_LJ_optalg.py
│   ├── example_04_LJ_38.py
│   ├── example_05_LJ_4D.py
│   ├── example_06_C_2D_lammps.py
│   ├── example_07_3D_ICE_lammps.py
│   ├── test_installation.py
│   └── tutorials_notebook/
│       ├── 01_atomic_crystals.ipynb
│       ├── 02_molecular_crystals.ipynb
│       ├── 03_pxrd.ipynb
│       ├── 04_box.ipynb
│       ├── 05-crystal-packing.ipynb
│       ├── ABAVUW.cif
│       ├── aspirin.cif
│       └── lt_quartz.cif
├── flask/
│   ├── .flaskenv
│   ├── README.md
│   ├── app/
│   │   ├── __init__.py
│   │   ├── errors.py
│   │   ├── forms.py
│   │   ├── routes.py
│   │   ├── static/
│   │   │   ├── css/
│   │   │   │   └── custom.css
│   │   │   └── jsmol.js
│   │   └── templates/
│   │       ├── 404.html
│   │       ├── 500.html
│   │       ├── _formhelpers.html
│   │       ├── base.html
│   │       ├── comparison.html
│   │       ├── index.html
│   │       ├── individual.html
│   │       └── scratch.html
│   ├── config.py
│   ├── instance/
│   │   └── uploads/
│   │       ├── C1-POSCAR
│   │       ├── NaCl-POSCAR
│   │       ├── NaCl.cif
│   │       ├── R3c-POSCAR
│   │       └── fail_test.txt
│   ├── requirements.txt
│   └── vxrd.py
├── images/
│   └── Logo license.txt
├── pyproject.toml
├── pyxtal/
│   ├── XRD.py
│   ├── XRD_indexer.py
│   ├── __init__.py
│   ├── asu_constraints.py
│   ├── block_crystal.py
│   ├── constants.py
│   ├── crystal.py
│   ├── database/
│   │   ├── HM_Full.csv
│   │   ├── __init__.py
│   │   ├── asymmetric_unit.txt
│   │   ├── atomic_scattering_params.json
│   │   ├── bonds.json
│   │   ├── bug.json
│   │   ├── cifs/
│   │   │   ├── 0-G62.cif
│   │   │   ├── 1-G59.cif
│   │   │   ├── 191.vasp
│   │   │   ├── 2-G71.cif
│   │   │   ├── 3-G139.cif
│   │   │   ├── 4-G225.cif
│   │   │   ├── ACBNZA01.cif
│   │   │   ├── AXOSOW01.cif
│   │   │   ├── Al2SiO5_mp-4753_symmetrized.cif
│   │   │   ├── BTO-Amm2.cif
│   │   │   ├── BTO.cif
│   │   │   ├── FAU.cif
│   │   │   ├── Fd3.cif
│   │   │   ├── Fd3.vasp
│   │   │   ├── Fd3m.cif
│   │   │   ├── GUMMUW.cif
│   │   │   ├── GeF2.cif
│   │   │   ├── HAHCOI.cif
│   │   │   ├── I41amd.vasp
│   │   │   ├── I4_132.cif
│   │   │   ├── JAPWIH.cif
│   │   │   ├── JVASP-119184.cif
│   │   │   ├── JVASP-119739.cif
│   │   │   ├── JVASP-141590.cif
│   │   │   ├── JVASP-25063.cif
│   │   │   ├── JVASP-28565.cif
│   │   │   ├── JVASP-28634.cif
│   │   │   ├── JVASP-36885.cif
│   │   │   ├── JVASP-37583.cif
│   │   │   ├── JVASP-42300.cif
│   │   │   ├── JVASP-43424.cif
│   │   │   ├── JVASP-45907.cif
│   │   │   ├── JVASP-47532.cif
│   │   │   ├── JVASP-50935.cif
│   │   │   ├── JVASP-59313.cif
│   │   │   ├── JVASP-62168.cif
│   │   │   ├── JVASP-85365.cif
│   │   │   ├── JVASP-86205.cif
│   │   │   ├── JVASP-97915.cif
│   │   │   ├── JVASP-98225.cif
│   │   │   ├── LAGNAL.cif
│   │   │   ├── LUFHAW.cif
│   │   │   ├── LiCs.cif
│   │   │   ├── MERQIM.cif
│   │   │   ├── MPWO.cif
│   │   │   ├── NaCl.cif
│   │   │   ├── NaSb3F10.cif
│   │   │   ├── NbO2.cif
│   │   │   ├── NiS-Cm.cif
│   │   │   ├── P3_112.cif
│   │   │   ├── P4_332.cif
│   │   │   ├── P4nmm.vasp
│   │   │   ├── P6_422.cif
│   │   │   ├── PAHYON01.cif
│   │   │   ├── PPO.cif
│   │   │   ├── PVO.cif
│   │   │   ├── Pm3.cif
│   │   │   ├── Pmmn.vasp
│   │   │   ├── Pn3.vasp
│   │   │   ├── Pn3m.vasp
│   │   │   ├── R-3.cif
│   │   │   ├── R-3c.cif
│   │   │   ├── R32.cif
│   │   │   ├── TMPPIO03.cif
│   │   │   ├── WEXBOS.cif
│   │   │   ├── YICMOP.cif
│   │   │   ├── __init__.py
│   │   │   ├── anthracene.cif
│   │   │   ├── aspirin-c.cif
│   │   │   ├── aspirin.cif
│   │   │   ├── benzene.cif
│   │   │   ├── bug.vasp
│   │   │   ├── c_bug.vasp
│   │   │   ├── c_bug2.vasp
│   │   │   ├── coumarin.cif
│   │   │   ├── dist_6_0.cif
│   │   │   ├── dist_6_1.cif
│   │   │   ├── gdh.cif
│   │   │   ├── ht_KNbBO.cif
│   │   │   ├── ht_cristobalite.cif
│   │   │   ├── ht_quartz.cif
│   │   │   ├── ice.cif
│   │   │   ├── lt_KNbBO.cif
│   │   │   ├── lt_cristobalite.cif
│   │   │   ├── lt_quartz.cif
│   │   │   ├── naphthalene.cif
│   │   │   ├── resorcinol.cif
│   │   │   ├── sim-0.vasp
│   │   │   ├── sim-1.vasp
│   │   │   └── xxvi.cif
│   │   ├── clusters.json
│   │   ├── collection.py
│   │   ├── element.py
│   │   ├── k_subgroup.json
│   │   ├── layer.csv
│   │   ├── layer_generators.csv
│   │   ├── layer_symmetry.csv
│   │   ├── molecules.json
│   │   ├── packing-analysis/
│   │   │   ├── ACETYL02.cif
│   │   │   ├── ADAMAN08.cif
│   │   │   ├── CONGRS.cif
│   │   │   ├── DNNAPH.cif
│   │   │   ├── HCCYHB.cif
│   │   │   ├── HCLBNZ.cif
│   │   │   ├── HXMTAM.cif
│   │   │   ├── PNDMAM10.cif
│   │   │   └── ZZZWOU01.cif
│   │   ├── point.csv
│   │   ├── point_generators.csv
│   │   ├── point_symmetry.csv
│   │   ├── rod.csv
│   │   ├── rod_generators.csv
│   │   ├── rod_symmetry.csv
│   │   ├── spg_num_wps_aug.csv
│   │   ├── spg_num_wps_mp.csv
│   │   ├── spg_num_wps_raw.csv
│   │   ├── symbols.json
│   │   ├── t_subgroup.json
│   │   ├── test.cif
│   │   ├── wyckoff_generators.csv
│   │   ├── wyckoff_list.csv
│   │   ├── wyckoff_sets.json
│   │   └── wyckoff_symmetry.csv
│   ├── db.py
│   ├── descriptor.py
│   ├── elasticity.py
│   ├── interface/
│   │   ├── Installation.md
│   │   ├── LATTE_templates/
│   │   │   ├── MDcontroller
│   │   │   ├── TBparam/
│   │   │   │   ├── bondints.nonortho
│   │   │   │   ├── control.in
│   │   │   │   ├── control.in.bak
│   │   │   │   ├── ppots.nonortho
│   │   │   │   └── ppotsplusD.nonortho
│   │   │   ├── alpha_match.cif
│   │   │   ├── latte_calc.py
│   │   │   └── test.py
│   │   ├── LJ.py
│   │   ├── __init__.py
│   │   ├── ase_opt.py
│   │   ├── ase_opt2.py
│   │   ├── charmm.py
│   │   ├── dftb.py
│   │   ├── gulp.py
│   │   ├── lammpslib.py
│   │   ├── latte_calculator.py
│   │   └── vasp.py
│   ├── io.py
│   ├── lattice.py
│   ├── lego/
│   │   ├── SO3.py
│   │   ├── __init__.py
│   │   ├── basinhopping.py
│   │   ├── builder.py
│   │   └── util.py
│   ├── miscellaneous/
│   │   ├── 2datomic.py
│   │   ├── 2dmolecular.py
│   │   ├── LJ_bug.py
│   │   ├── RECP/
│   │   │   ├── dia.py
│   │   │   ├── test0.py
│   │   │   └── test1.py
│   │   ├── Random_vasp_ase.py
│   │   ├── bug_2_components.py
│   │   ├── bug_spglib.py
│   │   ├── bugs/
│   │   │   ├── bug.py
│   │   │   └── bug.vasp
│   │   ├── c60.py
│   │   ├── check_cluster_distances.py
│   │   ├── check_rotation.py
│   │   ├── check_wyckoff_generators.py
│   │   ├── cifs/
│   │   │   ├── A2=a.cif
│   │   │   ├── A2=m.cif
│   │   │   ├── Aa.cif
│   │   │   ├── Aba2.cif
│   │   │   ├── Abmm.cif
│   │   │   ├── Acam.cif
│   │   │   ├── Acmm-1.cif
│   │   │   ├── Acmm.cif
│   │   │   ├── Ama2.cif
│   │   │   ├── Amam.cif
│   │   │   ├── Amm2.cif
│   │   │   ├── Amma.cif
│   │   │   ├── B2=b.cif
│   │   │   ├── B2_1=d.cif
│   │   │   ├── Bb2_1m.cif
│   │   │   ├── Bbmm.cif
│   │   │   ├── Bmab.cif
│   │   │   ├── Bmmb.cif
│   │   │   ├── C-1.cif
│   │   │   ├── C-42b.cif
│   │   │   ├── C2.cif
│   │   │   ├── C222.cif
│   │   │   ├── C222_1.cif
│   │   │   ├── C2=c.cif
│   │   │   ├── C2=m.cif
│   │   │   ├── Cc.cif
│   │   │   ├── Ccca.cif
│   │   │   ├── Cccm.cif
│   │   │   ├── Ccm2_1.cif
│   │   │   ├── Ccmb.cif
│   │   │   ├── Ccmm.cif
│   │   │   ├── Cm.cif
│   │   │   ├── Cmc2_1.cif
│   │   │   ├── Cmca.cif
│   │   │   ├── Cmcm.cif
│   │   │   ├── Cmm2.cif
│   │   │   ├── Cmma.cif
│   │   │   ├── Cmmm.cif
│   │   │   ├── F-43m.cif
│   │   │   ├── F1.cif
│   │   │   ├── F2.cif
│   │   │   ├── Fd-3m.cif
│   │   │   ├── Fd.cif
│   │   │   ├── Fdd2.cif
│   │   │   ├── Fddd.cif
│   │   │   ├── Fm-3m.cif
│   │   │   ├── Fm3m.cif
│   │   │   ├── Fmmm.cif
│   │   │   ├── I-4.cif
│   │   │   ├── I-42d.cif
│   │   │   ├── I-42m.cif
│   │   │   ├── I-43m.cif
│   │   │   ├── I-4c2.cif
│   │   │   ├── I-4m2.cif
│   │   │   ├── I2=a.cif
│   │   │   ├── I2=b.cif
│   │   │   ├── I2=c.cif
│   │   │   ├── I2=m.cif
│   │   │   ├── I2_12_12_1.cif
│   │   │   ├── I2_13.cif
│   │   │   ├── I2_1=a-3.cif
│   │   │   ├── I2cm.cif
│   │   │   ├── I2mb.cif
│   │   │   ├── I4=m.cif
│   │   │   ├── I4=mcm.cif
│   │   │   ├── I4=mmm.cif
│   │   │   ├── I4_122.cif
│   │   │   ├── I4_1=a.cif
│   │   │   ├── I4_1=amd.cif
│   │   │   ├── Ia-3d.cif
│   │   │   ├── Ia3.cif
│   │   │   ├── Ia3d.cif
│   │   │   ├── Iba2.cif
│   │   │   ├── Ibam.cif
│   │   │   ├── Im-3m.cif
│   │   │   ├── Im.cif
│   │   │   ├── Im2m.cif
│   │   │   ├── Im3.cif
│   │   │   ├── Ima2.cif
│   │   │   ├── Imam.cif
│   │   │   ├── Imm2.cif
│   │   │   ├── Imma.cif
│   │   │   ├── Immm.cif
│   │   │   ├── P-3.cif
│   │   │   ├── P-31c.cif
│   │   │   ├── P-31m.cif
│   │   │   ├── P-3c1.cif
│   │   │   ├── P-3m1.cif
│   │   │   ├── P-4.cif
│   │   │   ├── P-42_1c.cif
│   │   │   ├── P-42_1m.cif
│   │   │   ├── P-42c.cif
│   │   │   ├── P-42m.cif
│   │   │   ├── P-43m.cif
│   │   │   ├── P-43n.cif
│   │   │   ├── P-4b2.cif
│   │   │   ├── P-4m2.cif
│   │   │   ├── P-4n2.cif
│   │   │   ├── P-6.cif
│   │   │   ├── P-62c.cif
│   │   │   ├── P-62m.cif
│   │   │   ├── P-6c2.cif
│   │   │   ├── P-6m2.cif
│   │   │   ├── P23.cif
│   │   │   ├── P2=a.cif
│   │   │   ├── P2=b.cif
│   │   │   ├── P2=c.cif
│   │   │   ├── P2=m.cif
│   │   │   ├── P2_1.cif
│   │   │   ├── P2_122_1.cif
│   │   │   ├── P2_12_12.cif
│   │   │   ├── P2_12_12_1.cif
│   │   │   ├── P2_13.cif
│   │   │   ├── P2_1ca.cif
│   │   │   ├── P2_1cn.cif
│   │   │   ├── P2_1nm.cif
│   │   │   ├── P312.cif
│   │   │   ├── P31c.cif
│   │   │   ├── P31m.cif
│   │   │   ├── P321.cif
│   │   │   ├── P3_121.cif
│   │   │   ├── P3_221.cif
│   │   │   ├── P4.cif
│   │   │   ├── P42_12.cif
│   │   │   ├── P4=mbm.cif
│   │   │   ├── P4=mmm.cif
│   │   │   ├── P4=mnc.cif
│   │   │   ├── P4=n.cif
│   │   │   ├── P4=ncc.cif
│   │   │   ├── P4=nmm.cif
│   │   │   ├── P4=nnc.cif
│   │   │   ├── P4_122.cif
│   │   │   ├── P4_132.cif
│   │   │   ├── P4_232.cif
│   │   │   ├── P4_2=m.cif
│   │   │   ├── P4_2=mbc.cif
│   │   │   ├── P4_2=mnm.cif
│   │   │   ├── P4_2=n.cif
│   │   │   ├── P4_2=ncm.cif
│   │   │   ├── P4_2=nmc.cif
│   │   │   ├── P4_2=nnm.cif
│   │   │   ├── P4_2nm.cif
│   │   │   ├── P4_322.cif
│   │   │   ├── P4_32_12.cif
│   │   │   ├── P4bm.cif
│   │   │   ├── P4mm.cif
│   │   │   ├── P622.cif
│   │   │   ├── P6=mcc.cif
│   │   │   ├── P6=mmm.cif
│   │   │   ├── P6_222.cif
│   │   │   ├── P6_3.cif
│   │   │   ├── P6_322.cif
│   │   │   ├── P6_3=m.cif
│   │   │   ├── P6_3=mcm.cif
│   │   │   ├── P6_3=mmc.cif
│   │   │   ├── P6_3cm.cif
│   │   │   ├── P6_3mc.cif
│   │   │   ├── Pa3.cif
│   │   │   ├── Pbam.cif
│   │   │   ├── Pban.cif
│   │   │   ├── Pbc2_1.cif
│   │   │   ├── Pbca.cif
│   │   │   ├── Pbcm.cif
│   │   │   ├── Pbcn.cif
│   │   │   ├── Pbma.cif
│   │   │   ├── Pbmn.cif
│   │   │   ├── Pbn2_1.cif
│   │   │   ├── Pbnm.cif
│   │   │   ├── Pbnn.cif
│   │   │   ├── Pca2_1.cif
│   │   │   ├── Pcab.cif
│   │   │   ├── Pcam.cif
│   │   │   ├── Pcca.cif
│   │   │   ├── Pccn.cif
│   │   │   ├── Pcmb.cif
│   │   │   ├── Pcmn.cif
│   │   │   ├── Pcnb.cif
│   │   │   ├── Pm.cif
│   │   │   ├── Pm3m.cif
│   │   │   ├── Pm3n.cif
│   │   │   ├── Pma2.cif
│   │   │   ├── Pmab.cif
│   │   │   ├── Pman.cif
│   │   │   ├── Pmc2_1.cif
│   │   │   ├── Pmcn.cif
│   │   │   ├── Pmm2.cif
│   │   │   ├── Pmma.cif
│   │   │   ├── Pmmm.cif
│   │   │   ├── Pmmn.cif
│   │   │   ├── Pmn2_1.cif
│   │   │   ├── Pmna.cif
│   │   │   ├── Pmnb.cif
│   │   │   ├── Pmnm.cif
│   │   │   ├── Pmnn.cif
│   │   │   ├── Pn2_1m.cif
│   │   │   ├── Pn3m.cif
│   │   │   ├── Pna2_1.cif
│   │   │   ├── Pnam.cif
│   │   │   ├── Pnca.cif
│   │   │   ├── Pncn.cif
│   │   │   ├── Pnm2_1.cif
│   │   │   ├── Pnma.cif
│   │   │   ├── Pnmn.cif
│   │   │   ├── Pnn2.cif
│   │   │   ├── Pnna.cif
│   │   │   ├── R-3m.cif
│   │   │   ├── R3.cif
│   │   │   ├── R3c.cif
│   │   │   └── R3m.cif
│   │   ├── compatibility.py
│   │   ├── create_generators.py
│   │   ├── debug_charmm.py
│   │   ├── distance_bug.py
│   │   ├── extra_test.py
│   │   ├── flow.py
│   │   ├── from_ase_molecule.py
│   │   ├── generate_mol_symm.py
│   │   ├── generate_site_symm.py
│   │   ├── get_lj_cluster.py
│   │   ├── get_molecule_from_pubchem.py
│   │   ├── grid.py
│   │   ├── gulp_c.py
│   │   ├── heavy_check.py
│   │   ├── mol.py
│   │   ├── regen_wyckoffs_list.py
│   │   ├── search_csd_from_pubchem.py
│   │   ├── speed.py
│   │   ├── subgroup_data.py
│   │   ├── test.py
│   │   ├── test_1d_rep.py
│   │   ├── test_3D_molecule.py
│   │   ├── test_CSD.py
│   │   ├── test_all.py
│   │   ├── test_atom_mole.py
│   │   ├── test_db.py
│   │   ├── test_euclidean.py
│   │   ├── test_generators.py
│   │   ├── test_get_csd.py
│   │   ├── test_matrix.py
│   │   ├── test_read.py
│   │   ├── test_site_symm.py
│   │   ├── test_smile.py
│   │   ├── test_spgs.py
│   │   ├── test_subgroup.py
│   │   ├── test_subgroup2.py
│   │   ├── test_supergroup.py
│   │   ├── test_symmetry_rep.py
│   │   ├── test_torsion.py
│   │   ├── test_wp.py
│   │   ├── test_wyckoff_check.py
│   │   ├── test_xrd.py
│   │   ├── web_scalping_script/
│   │   │   ├── README.md
│   │   │   ├── pubchem_import.py
│   │   │   └── requirements.txt
│   │   ├── xrd.py
│   │   └── xrd_comp.py
│   ├── molecular_crystal.py
│   ├── molecule.py
│   ├── msg.py
│   ├── operations.py
│   ├── optimize/
│   │   ├── DFS.py
│   │   ├── QRS.py
│   │   ├── WFS.py
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── benchmark.py
│   │   └── common.py
│   ├── plane.py
│   ├── potentials/
│   │   ├── CuAg.eam.alloy
│   │   ├── LJ_cluster.py
│   │   ├── Si.tersoff
│   │   ├── SiCGe.tersoff
│   │   └── __init__.py
│   ├── reciprocal.py
│   ├── representation.py
│   ├── supergroup.py
│   ├── symmetry.py
│   ├── symmetry_sampler.py
│   ├── tolerance.py
│   ├── util.py
│   ├── version.py
│   ├── viz.py
│   ├── wyckoff_site.py
│   └── wyckoff_split.py
├── requirements.txt
├── scripts/
│   ├── match.py
│   ├── pyxtal_csp_match.py
│   ├── pyxtal_csp_plot.py
│   ├── pyxtal_csp_rank.py
│   ├── pyxtal_main.py
│   ├── pyxtal_symmetry.py
│   └── rank.py
├── setup.cfg
├── setup.py
└── tests/
    ├── test_SO3.py
    ├── test_all.py
    ├── test_crystal.py
    ├── test_ff.py
    ├── test_group.py
    ├── test_jl.py
    ├── test_lattice.py
    ├── test_lego.py
    ├── test_mem.py
    ├── test_molecule.py
    ├── test_oc_relax.py
    ├── test_site_symm.py
    ├── test_supergroup.py
    ├── test_symmetry.py
    ├── test_wyckoff.py
    └── test_xrd.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
doc/* linguist-documentation


================================================
FILE: .github/workflows/python-publish.yml
================================================
# This workflow will upload a Python Package using Twine when a release is created
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Upload Python Package

on:
  release:
    types: [published]

permissions:
  contents: read

jobs:
  deploy:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install build
    - name: Build package
      run: python -m build
    - name: Publish package
      uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
      with:
        user: __token__
        password: ${{ secrets.PYPI_API_TOKEN }}


================================================
FILE: .github/workflows/tests.yml
================================================
name: tests

on:
  push:
    paths:
      - '**.py' # only run workflow when source files changed
  pull_request:
    branches:
      - master
    paths:
      - '**.py'

jobs:
  tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.9", "3.10"]

    steps:
      - name: Check out repo
        uses: actions/checkout@v4

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install uv
        run: pip install uv

      - name: Install dependencies
        run: uv pip install .[test] --system

      - name: Test_general
        run: pytest tests/test_all.py

      - name: Test_crystal
        run: pytest tests/test_crystal.py

      - name: Test_lattice
        run: pytest tests/test_lattice.py

      - name: Test_molecule
        run: pytest tests/test_molecule.py

      - name: Test_wyckoff
        run: pytest tests/test_wyckoff.py

      - name: Test_symmetry
        run: pytest tests/test_symmetry.py

      - name: Test_group
        run: pytest tests/test_group.py

      - name: Test_lego
        run: pytest tests/test_lego.py 

      - name: Test_supergroup
        run: pytest tests/test_supergroup.py

      - name: Test_so3
        run: pytest tests/test_SO3.py

      #- name: Test_xrd
      #  run: pytest tests/test_xrd.py






================================================
FILE: .gitignore
================================================
*.py[cod]

# Packages
*.egg
*.egg-info
dist
build
eggs
.eggs/*
parts
bin
var
sdist
develop-eggs
.installed.cfg
lib
lib64

# output files
test_summary.txt
out

# JSmol files for flask app (VXRD)
flask/app/static/jsmol/

# VS Code
*.code-workspace


================================================
FILE: .pre-commit-config.yaml
================================================
# Install these hooks with `pre-commit install`.

ci:
  autoupdate_schedule: quarterly

repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.5.0
    hooks:
      - id: ruff
        args: [--fix]
      - id: ruff-format

  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.6.0
    hooks:
      - id: check-case-conflict
      - id: check-symlinks
      - id: check-yaml
      - id: destroyed-symlinks
      - id: end-of-file-fixer
      - id: mixed-line-ending
      - id: trailing-whitespace


================================================
FILE: .readthedocs.yaml
================================================
# Read the Docs configuration file for Sphinx projects
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details

# Required
version: 2

# Set the OS, Python version and other tools you might need
build:
  os: ubuntu-22.04
  tools:
    python: "3.9"
    # You can also specify other tool versions:
    # nodejs: "19"
    # rust: "1.64"
    # golang: "1.19"

# Build documentation in the "docs/" directory with Sphinx
sphinx:
   configuration: doc/conf.py

# Optionally build your docs in additional formats such as PDF and ePub
# formats:
#    - pdf
#    - epub

# Optional but recommended, declare the Python requirements required
# to build your documentation
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
python:
   install:
   - requirements: doc/requirements.txt


================================================
FILE: LICENSE.txt
================================================
MIT License

Copyright 2018 Scott Fredericks, Qiang Zhu

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: MANIFEST.in
================================================
include /*.py
include database/*.py
include database/*.csv
include database/*.json


================================================
FILE: README.md
================================================
<img src="https://raw.githubusercontent.com/MaterSim/PyXtal/master/images/512px_type1.png" alt="PyXtal" width="300"/>

[![Documentation Status](https://readthedocs.org/projects/pyxtal/badge/?version=latest)](https://pyxtal.readthedocs.io/en/latest/?badge=latest)
[![Test Status](https://github.com/MaterSim/PyXtal/workflows/tests/badge.svg)](https://github.com/MaterSim/PyXtal/actions)
[![Download Status](https://img.shields.io/pypi/pyversions/pyxtal)](https://pypi.org/project/pyxtal/)
[![Download Status](https://img.shields.io/pypi/v/pyxtal)](https://pypi.org/project/pyxtal/)
[![Downloads](https://pepy.tech/badge/pyxtal)](https://pepy.tech/project/pyxtal)
[![DOI](https://zenodo.org/badge/128165891.svg)](https://zenodo.org/badge/latestdoi/128165891)
[![Gitter](https://badges.gitter.im/PyXtal/community.svg)](https://gitter.im/PyXtal/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
<img align="right" width="450" src="https://raw.githubusercontent.com/MaterSim/PyXtal/master/images/water.gif">


## Table of content
- [Introduction](#introduction)
- [Quick Start](#quick-start)
- [Current Features](#current-features)
- [Installation](#installation)
- [Citation](#citation)
- [How to contribute?](#how-to-contribute)


## Introduction

PyXtal is an open source Python package which was initiated by [Qiang Zhu](http://qzhu2017.github.io) and Scott Fredericks. The goal of PyXtal is to develop a fundamental library to allow one to design the material structure with a certain symmetry constraint. These structures can exported to various structural formats for further study. See the [documentation](https://pyxtal.readthedocs.io/en/latest/) for more information.

To contribute to this project, please check [How to contribute?](#how-to-contribute).

## Quick Start

- [Atomic crystal](https://nbviewer.jupyter.org/github/MaterSim/PyXtal/blob/master/examples/tutorials_notebook/01_atomic_crystals.ipynb)
- [Molecular crystal](https://nbviewer.jupyter.org/github/MaterSim/PyXtal/blob/master/examples/tutorials_notebook/02_molecular_crystals.ipynb)
- [XRD](https://nbviewer.jupyter.org/github/MaterSim/PyXtal/blob/master/examples/tutorials_notebook/03_pxrd.ipynb)
- [Molecular Packing](https://nbviewer.org/github/MaterSim/PyXtal/blob/master/examples/tutorials_notebook/05-crystal-packing.ipynb)

## Current Features

- Generation of atomic structures for a given symmetry and stoichiometry (0-3D)
- Generation of molecular crystals (1-3D) with the support of special Wyckoff positions.
- Structure manipulation via subgroup/supergroup symmetry relation
- Geometry optimization from built-in and external optimization methods.
- Internal support of ``cif`` file and many other formats via ``pymatgen`` or ``ASE``.
- Easy access to symmetry information (e.g., Wyckoff, site symmetry and international symbols).
- X-ray diffraction analysis and [its online application](https://vxrd.physics.unlv.edu)

## Installation

To install the code, one just needs to do

```sh
pip install pyxtal
```

or

```sh
pip install --upgrade git+https://github.com/MaterSim/PyXtal.git@master
```

If you want to add the Julia package install (required by the use of `pyxtal.lego` module), please use

```sh
export INSTALL_JULIA=1 && pip install pyxtal 
```

To check if the installation is successful, run the following script,
```python

from juliacall import Main as jl
jl.seval("using CrystalNets")
print("Success")
```

## Citation

### General PyXtal

Fredericks S, Parrish K, Sayre D, Zhu Q\*(2020)
[PyXtal: a Python Library for Crystal Structure Generation and Symmetry Analysis](https://www.sciencedirect.com/science/article/pii/S0010465520304057).
\[[arXiv link](https://arxiv.org/pdf/1911.11123.pdf)\]

```bib
@article{pyxtal,
title = "PyXtal: A Python library for crystal structure generation and symmetry analysis",
journal = "Computer Physics Communications",
volume = "261",
pages = "107810",
year = "2021",
issn = "0010-4655",
doi = "https://doi.org/10.1016/j.cpc.2020.107810",
url = "http://www.sciencedirect.com/science/article/pii/S0010465520304057",
author = "Scott Fredericks and Kevin Parrish and Dean Sayre and Qiang Zhu",
}
```

### Site Symmetry Representation
Levy D, Panigrahi S-S, Kaba S-O, Zhu Q, Galkin M, Miret S, Ravanbakhsh S. (2024) 
[SymmCD: Symmetry-Preserving Crystal Generation with Diffusion Models AI for Accelerated Materials Design](https://openreview.net/forum?id=V7x2KZQn2v)
NeurIPS 2024, 

```bib
@inproceedings{
levy2024symmcd,
title={Symm{CD}: Symmetry-Preserving Crystal Generation with Diffusion Models},
author={Daniel Levy and Siba Smarak Panigrahi and S{\'e}kou-Oumar Kaba and Qiang Zhu and Mikhail Galkin and Santiago Miret and Siamak Ravanbakhsh},
booktitle={AI for Accelerated Materials Design - NeurIPS 2024},
year={2024},
url={https://openreview.net/forum?id=V7x2KZQn2v}
}
```


### Symmetry relation
Zhu Q, Kang B, Parrish K (2022). 
[Symmetry Relation Database and Its Application to Ferroelectric Materials Discovery](https://link.springer.com/article/10.1557/s43579-022-00268-4)

```bib
@article{zhu2022symmetry,
  title="Symmetry relation database and its application to ferroelectric materials discovery",
  author="Zhu, Qiang and Kang, Byungkyun and Parrish, Kevin",
  journal="MRS Communications",
  volume="12",
  number="5",
  pages="686--691",
  year="2022",
  doi="https://doi.org/10.1557/s43579-022-00268-4",
```

### Organic crystal packing motif
Zhu Q, Tang W-L, Hattori S. (2022). 
[Quantification of Crystal Packing Similarity from Spherical Harmonic Transform](https://pubs.acs.org/doi/10.1021/acs.cgd.2c00933)

```bib
@article{zhu2022quantification,
  title="Quantification of Crystal Packing Similarity from Spherical Harmonic Transform",
  author="Zhu, Qiang and Tang, Weilun and Hattori, Shinnosuke",
  journal="Crystal Growth \& Design",
  volume="22",
  number="12",
  pages="7308--7316",
  year="2022",
  doi="https://doi.org/10.1021/acs.cgd.2c00933",
}
```

## How to contribute?

This is an open-source project. Its growth depends on the community. To contribute to PyXtal, you don't necessarily have to write the code. Any contributions from the following list will be helpful.

- [![Star on GitHub](https://img.shields.io/github/stars/qzhu2017/pyxtal.svg?style=social)](https://github.com/MaterSim/pyxtal/stargazers)
 the PyXtal project and recommend it to your colleagues/friends
- Open an [![GitHub issues](https://img.shields.io/github/issues/qzhu2017/pyxtal.svg)](https://GitHub.com/MaterSim/pyxtal/issues/) to report the bug or address your wishlist or improve our documentation
- [![GitHub forks](https://img.shields.io/github/forks/qzhu2017/pyxtal?style=social)](https://github.com/MaterSim/PyXtal/network/members) the repository and send us the pull request


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Supported Versions

Use this section to tell people about which versions of your project are
currently being supported with security updates.

| Version | Supported          |
| ------- | ------------------ |
| 5.1.x   | :white_check_mark: |
| 5.0.x   | :x:                |
| 4.0.x   | :white_check_mark: |
| < 4.0   | :x:                |

## Reporting a Vulnerability

Use this section to tell people how to report a vulnerability.

Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.


================================================
FILE: _config.yml
================================================
markdown: GFM


================================================
FILE: doc/Algorithm.rst
================================================
How PyXtal Works
================

PyXtal is a free, open source Python package intended to aid with crystal structure prediction and other purposes of crystal symmetry analysis. It is our aim to make our tools and theory freely available, in order to expand the knowledge and utilization of crystallographic symmetry. To this end, we outline the basic algorithms used by PyXtal. For more general information about crystallography, see the `Background and Theory <Background.html>`_ page.

Overview
--------

In order to generate random symmetrical crystals, PyXtal uses space groups and their Wyckoff positions as templates, then **inserts atoms (or molecules) one Wyckoff position at a time, until the desired stoichiometry is reached**. This ensures that the correct symmetry will be obtained, without the need to adjust atomic positions. Along the way, it checks that the atoms are sufficiently far apart. To generate a single random crystal, PyXtal performs roughly seven steps:

.. figure:: ../images/Flowchart.png
   :height: 450 px
   :width: 300 px
   :scale: 100 %
   :align: center

   PyXtal Structure Generation Flowchart. 


1) Get the input parameters from the user. 


2) Check the compatibility of the stoichiometry with the space group. 

.. Because atoms lie in Wyckoff positions, and these can only have specific numbers of atoms in them, not every number of atoms will be able to fit into a unit cell without breaking the symmetry. To check this, we consider the full number of each type of atom, then reduce this number by the size of a Wyckoff position, beginning with the largest (general) position. If the number goes to exactly zero for each atom type, we say the stoichiometry is compatible with the space group. Additionally, we check the degrees of freedom of each Wyckoff position, so as to avoid placing multiple atoms in the same location. For molecular crystals, we also check whether the molecules can be symmetrically oriented into each Wyckoff position.

3) Generate a random lattice consistent with the space group. 

.. The cell parameters are based on both the crystal class (which determines the latice angles) and the stoichiometry (which determines the volume). Where there is some leeway for the lattice parameters, a value will be randomly chosen, with preference for more symmetrical values. If the user has defined a lattice, that will be used instead. For randomly generated lattices, we also check that the atoms or molecules can fit into the unit cell without extending outside of it.

4) Begin placing atoms into Wyckoff positions, one atomic specie at a time. 

.. First we check the multiplicity of the general Wyckoff position. If at least this number of atoms still needs to be added, then we place the atoms into the general position. If fewer atoms are needed, we instead place the atoms into a special Wyckoff position, beginning with the largest, then decreasing in multiplicity as needed. We choose a random vector between [0,0,0] and (1,1,1), and use this as the generating point for the atoms in the Wyckoff position.

5) Check that the atoms in the single Wyckoff position are not too close together. If the minimum distance is smaller than some tolerance (based on the atomic species), then we merge the Wyckoff position into a smaller special position. 

.. To do this, we first group atoms together based on the shortest distances between them, then replace the clusters with single atoms at the clusters' geometric centers. We check the Wyckoff position of the resulting cluster, then continue to merge as needed until the atoms are sufficiently far apart.

6) Check the inter-atomic distance between the newly generated Wyckoff position and the previously generated positions. If the distances are too close, we choose a new generating point within the same original Wyckoff position. For molecular crystals, we also attempt to reorient the molecule, so as to reduce the distance between atoms.


7) Continue to place Wyckoff positions and species into the crystal, until the proper stoichiometry is reached. If any step between 3-6 fails, we repeat it, up to a pre-determined maximum number of attempts. 

.. If this still fails, we go to the previous step and retry, up to a different maximum number of attempts. If we succeed, we store the information within the random_crystal class and set random_crystal.valid to True. If we fail after the maximum number of attempts, we output an error message and set random_crystal.valid to False.

If the generation succeeds, the resulting crystal can be (energetically) optimized and compared with other possible structures. After many attempts, the lowest-energy structure will be the one most likely to exist at the specified conditions. This can be used, for example, to determine the phase diagram of a solid without the need to perform any experiments.

Next, we explain the steps listed above in greater detail.

User Input
----------
This includes the crystal's stoichiometry, space group, and volume factor. Optionally, the desired lattice and allowed inter-atomic distances can also be defined (which is useful for testing at higher pressures). Otherwise, these parameters will be chosen automatically.


Checking Compatibility
----------------------
Before attempting to generate a structure, PyXtal must make sure it is possible to do so. The WP's in different space groups have different multiplicities. As a result, not every number of atoms is compatible with every space group. For example, consider the space group ``Pn-3n (222)``. 

::

    $ pyxtal_symmetry -s 222

    -- Space group # 222 (Pn-3n)--
    48i site symm: 1
    ...
    ...
    ...
    6b site symm: 42 . 2
      3/4, 1/4, 1/4
      1/4, 3/4, 1/4
      1/4, 1/4, 3/4
      1/4, 3/4, 3/4
      3/4, 1/4, 3/4
      3/4, 3/4, 1/4
    2a site symm: 4 3 2
      1/4, 1/4, 1/4
      3/4, 3/4, 3/4

The smallest Wyckoff position is ``2a``, with the next smallest being ``6b``. It is impossible to create a crystal with 4 atoms in the unit cell for this symmetry group, because no combination of Wyckoff positions adds up to 4. The position ``2a`` cannot be repeated, because it falls on the exact coordinates ``(1/4, 1/4, 1/4)`` and ``(3/4, 3/4, 3/4)``. A second set of atoms in the 2a position would overlap the atoms in the first position, but this is not physically possible.

Thus, it is necessary to check the input stoichiometry against the Wyckoff positions of the desired space group. To accomplish this, PyXtal iterates through all possible Wyckoff position combinations within the confines of the stoichiometry. As soon as one valid combination is found, the check returns ``True``. If no valid combination is found, the check returns ``False``, and the generation attempt fails with a warning.

Some space groups allow valid combinations of WP's, but may not give many degrees of freedom for generation. It may also be the case that the allowed combinations result in atoms which are too close together. In these cases, PyXtal will attempt generation as usual: until the maximum limit is reached, or until a successful generation occurs. If generation repeatedly fails for a given combination of space group and stoichiometry, the user should make note and avoid the combination going forward.

Lattice Generation
------------------
The first step in PyXtal's structure generation is the choice of unit cell. Depending on the symmetry group, a specific type of lattice must be generated. For all crystals, the conventional cell choice is used to avoid ambiguity. The most general case is the triclinic cell, from which other cell types can be obtained by applying various constraints.

To generate a triclinic cell, 3 real numbers are randomly chosen (using a Gaussian distribution centered at 0) as the off-diagonal values for a 3x3 shear matrix. Treating this matrix as a cell matrix, one obtains 3 lattice angles. For the lattice vector lengths, a random 3-vector between (0, 0, 0) and (1, 1, 1) is chosen (using a Gaussian distribution centered at (0.5, 0.5, 0.5)). The relative values of the x, y, and z coordinates are used for a, b, and c respectively, and scaled based on the required volume.

For other cell types, any free parameters are obtained using the same methods as for the triclinic case, along with any necessary constraints. In the tetragonal case, for example, all angles must be 90 degrees. Thus, only a random vector is needed to generate the lattice constants.

For molecular crystals, the issue of generating the lattice is also dependent on molecular orientation. Thus, the lattice must be checked for every molecule in the crystal. To do this, the atoms in the original molecule are checked against the atoms in periodically translated copies of the molecule. Here, standard atom-atom distance checking is used.


Generation of Wyckoff Positions
-------------------------------
The central building block for crystals in PyXtal is the Wyckoff position (WP). Once a space group and lattice are chosen, WP's are inserted one at a time to add structure.

PyXtal starts with the largest available WP, which is the general position of the space group. If the number of atoms required is equal to or greater than the size of the general position, the algorithm proceeds. If fewer atoms are needed, the next largest WP (or set of WP's) is chosen, in order of descending multiplicity. This is done to ensure that larger positions are preferred over smaller ones; this reflects the greater prevalence of larger multiplicities both statistically and in nature.

Checking Inter-atomic Distances
-------------------------------
To produce structures with realistic bonds and bond lengths, the generated atoms should not be too close together. In PyXtal this means that by default, two atoms should be no closer than the covalent bond length between them. However, for a given application the user may decide that shorter or longer cutoff distances are appropriate. For this reason, PyXtal has a custom tolerance matrix class which allows the user to define the distances allowed between any two types of atoms.

Because crystals have periodic symmetry, any point in a crystal actually corresponds to an infinite lattice of points. Likewise, any separation vector between two points actually corresponds to an infinite number of separation vectors. For the purposes of distance checking, only the shortest of these vectors are relevant. When a lattice is non-Euclidean, the problem of finding shortest distances with periodic boundary conditions is non-trivial, and the general solution can be computationally expensive \cite{LatticeProblem}. So instead, an approximate solution is used based on assumptions about the lattice geometry:

For any two given points, PyXtal first considers only the separation vector which lies within the ``central`` unit cell spanning between (0, 0, 0) and (1, 1, 1). For example, if the original two (fractional) points are (-8.1, 5.2, -4.8) and (2.7, -7.4, 9.3), one can directly obtain the separation vector (-10.8, 12.6, -14.1). This is then translated to the vector (0.2, 0.6, 0.9), which lies within the central unit cell. PyXtal also considers those vectors lying within a 3x3x3 supercell centered on the first vector. These would include (1.2, 1.6, 1.9), (-0.8, -0.4, -0.1), (-0.8, 1.6, 0.9), etc. This gives a total of 27 separation vectors to consider. After converting to absolute coordinates, one can calculate the Euclidean length of each of these vectors and thus find the shortest distance.

Note that this does not work for certain vectors within some highly distorted lattices. Often the shortest Euclidean distance is accompanied by the shortest fractional distance, but whether this is the case or not depends on how distorted the lattice is. However, because all lattices are required to have no angles smaller than 30 degrees or larger than 150 degrees, this is not an issue.

.. figure:: ../images/skew.png
   :height: 700 px
   :width: 800 px
   :scale: 50 %
   :align: center

   Distorted Unit Cell. Due to the cell's high level of distortion, the closest neighbors for a single point lie more than two unit cells away. In this case, the closest point to the central point is located two cells to the left and one cell diagonal-up. To find this point using PyXtal's distance checking method, a 5x5x5 unit cell would be needed. For this reason, a limit is placed on the distortion of randomly generated lattices.

For two given sets of atoms (for example, when cross-checking two WP's in the same crystal), one can calculate the shortest inter-atomic distances by applying the above procedure for each unique pair of atoms. This only works if it has already been established that both sets on their own satisfy the needed distance requirements.

Thanks to symmetry, it is not necessary to calculate every atomic pair between two Wyckoff positions. For two Wyckoff positions A and B, one need only calculate either the separations between one atom in A and all atoms in B, or one atom in B and all atoms in A. This is because the symmetry operations which duplicate a point in a Wyckoff position also duplicate the separation vectors associated with that point. This is also true for a single Wyckoff position; for example, in a Wyckoff position with 16 points, only 16 calculations are needed, as opposed to 256. This can significantly speed up the calculation for larger Wyckoff positions.

For a single WP, it is necessary to calculate the distances for each unique atom-atom pair, but also for the lattice vectors for each atom by itself. Since the lattice is the same for all atoms in the crystal, this check only needs to be performed on a single atom of each specie. For atomic crystals, this just means ensuring that the generated lattice is sufficiently large.



For molecules, the process is slightly more complicated. Depending on the molecule's orientation within the lattice, the inter-atomic distances can change. Additionally, one must calculate the distances not just between molecular centers, but between every unique atom-atom pair. This increases the number of needed calculations, in rough proportion to the square of size of the molecules. As a result, this is typically the largest time cost for generation of molecular crystals.


Merging and Checking Wyckoff Positions
--------------------------------------
Once a WP is chosen, a random 3-vector between (0, 0, 0) and (1, 1, 1) is created. This acts as the generating point. Projecting this vector into the WP, one obtains a set of coordinates in real space. Then, the distances between these coordinates are checked. If the atom-atom distances are all greater than a pre-defined limit, the WP is kept and the algorithm continues. If any of the distances are too small, it is an indication that the WP would not occur with that generating point. In this case, the coordinates are merged together into a smaller WP, if possible. This merging continues until the atoms are no longer too close together (see below).

.. figure:: ../images/merge.png
   :height: 700 px
   :width: 800 px
   :scale: 80 %
   :align: center

   Wyckoff Position Merging Example. Shown are possible mergings of the general position 8c of the 2D point group 4mm. Moving from 8c to 4b (along the solid arrows) requires a smaller translation than for 4a (along the dashed arrows). Thus, if the atoms in 8c were too close together, PyXtal would merge them into 4b instead of 4a. The atoms could be further merged into position 1o by following the arrows shown in the bottom right image.



To merge into a smaller position, the original generating point is projected into each of the remaining WP's. The WP with the smallest translation between the original point and the transformed point is chosen, so long as the new WP is a subset of the original one, and so long as the new points are not too close together. If the atoms are still too close together, the WP is discarded and another attempt is made.

Once a satisfactory WP has been filled, the inter-atomic distances between the current WP and the already-added WP's are checked. If all distances are acceptable, the algorithm continues. More WP's are then added as needed until the desired number of atoms has been reached. At this point, either a satisfactory structure has been generated, or the generation has failed. If the generation fails, then either smaller distances tolerances or a larger volume factor might increase the chances of success. However, altering these quantities too drastically may result in less realistic crystals. Common sense and system-specific intuition should be applied when adjusting these parameters.

Finding Valid Molecular Orientations
------------------------------------
In crystallography, atoms are typically assumed to be point particles with no well-defined orientation. Since the object occupying a crystallographic Wyckoff position is usually an atom, it is further assumed that the object's symmetry group contains the Wyckoff position's site symmetry as a subgroup. If this is the case, the only remaining condition for occupation of a Wyckoff position is the location within the unit cell. However, if the object is instead a molecule, then the Wyckoff position compatibility is also determined by orientation and shape.

To handle the general case, one must ensure that the object 1) is sufficiently symmetric, and 2) is oriented such that its symmetry operations are aligned with the Wyckoff site symmetry. The result is that different point group symmetries are compatible with only certain Wyckoff positions. For a given molecule and Wyckoff position, one can find all valid orientations as follows:

1. Determine the molecule's point group and point group operations. This is currently handled by Pymatgen's build-in `PointGroupAnalyzer class <https://pymatgen.org/pymatgen.symmetry.analyzer.html#pymatgen.symmetry.analyzer.PointGroupAnalyzer>`_, which produces a list of symmetry operations for the molecule.

2. Associate an axis to every symmetry operation. For now, it can be assumed that the axis is centered at the origin. For a rotation or improper rotation, use the *rotational axis*. For a mirror plane, use *an axis perpendicular to the plane*. Note that inversional symmetry does not add any constraints, since the inversion center is always located at the molecule's center of mass.

3. Find up to two non-collinear axes in the site symmetry and calculate the angle between them. Find all conjugate operations (with the same order and type) in the molecular point symmetry with the same angle between the axes, and store the rotation which maps the pairs of axes onto each other. For example, if the site symmetry were ``mmm``, then choose two reflectional axes, say the x and y axes or the y and z axes. Then, look for two reflection operations in the molecular symmetry group. If the angle between these two operation axes is 90 degrees, store the rotation which maps the two molecular axes onto the Wyckoff axes for every pair of reflections with 90 degrees separating them.

4. For a given pair of axes, there are two rotations which can map one onto the other, with opposite directions of the molecular axis. Depending on the molecular symmetry, these two rotations may produce the same molecular orientation. Using the list of rotations calculated in step 3, remove redundant orientations which are equivalent to each other.

5. For each found orientation, check that the rotated molecule is symmetric under the Wyckoff site symmetry. To do this, simply check the site symmetry operations one at a time by transforming the molecule and checking for equivalence with the untransformed molecule.

6. For the remaining valid rotations, store the rotation matrix and the number of degrees of freedom. If two axes were used to constrain the molecule, then there are no degrees of freedom. If one axis is used, then there is one rotational degree of freedom, and store the axis about which the molecule may rotate. If no axes are used (because there are only point operations in the site symmetry), there are three (stored internally as two) degrees of freedom, meaning the molecule can be rotated freely in 3 dimensions.

PyXtal performs these steps for every Wyckoff position in the symmetry group and stores the nested list of valid orientations. When a molecule must be inserted into a Wyckoff position, an allowed orientation is randomly chosen from the list. This forces the overall symmetry group to be preserved, because symmetry-breaking positions are not allowed.

It is worth noting that the general position of any symmetry group always has site symmetry group 1. This means that any molecule can always be inserted into the general position with any orientation. However, many real crystals have molecules located in special positions, and thus this method alone is insufficient for generating realistic structures [1]_.

Another important consideration is whether a symmetry group will produce inverted copies of the constituent molecules. In many cases, a chiral molecule's mirror image will possess different chemical or biological properties \cite{chirality}. For pharmaceutical applications in particular, one may not want to consider crystals containing mirror molecules. By default, PyXtal does not generate crystals with mirror copies of chiral molecules. The user can choose to allow inversion if desired.


.. [1] U. M. ller, “3.2.4. molecular symmetry,”International Tables for Crystallography, vol. A, p.72776, 2016.


================================================
FILE: doc/Background.rst
================================================
Background and Theory
=====================
This is a pedagogical introduction to crystallography and basic group theory.
For information about how PyXtal works specifically, see the
`Algorithm <Algorithm.html>`_ page.


Crystals and Structures
-----------------------
When studying solids, it is often useful to describe a material's structure at
the atomic level. From this description one can (in theory) determine the
material's physical properties, including mechanical strength, electrical and
thermal conductivity, melting point, etc. Due to the near-infinite number of
possible materials and atomic geometries, it is necessary to have a consistent
mathematical framework. This is described by *crystallography*.

For an atomic structure, we could describe the geometry by specifying the type
and position of every atom. This works alright for molecules, and is in fact how
computers typically encode molecules. But for an ideal crystal, which is
infinitely large, it is impossible to describe where each individual atom lies.
Fortunately, because crystals are symmetrical, we can specify one part of the
crystal, and then use the symmetry operations to *generate* the rest of the
crystal. This creates a perfectly symmetrical structure which is infinitely
large in size. Such objects do not exist in nature, but they are nevertheless
useful for understanding small parts of real, imperfect crystals. So, we call
this infinite and symmetrical object an *ideal crystal*.

Most inorganic materials are formed by many small (nearly) ideal crystals called
*grains*. These grains may have different shapes, sizes, and orientations, but
each grain has the same crystal structure at the inter-atomic scale. If we can
determine this crystal structure, it becomes possible to predict the way that
the grains form and interact with each other. From this, we can go on to predict
properties at larger and larger scales, and determine how useful a material will
behave in different physical situations. Therefore, determining a material's
small-scale crystal structure is absolutely essential for modern materials
science and engineering.

At different pressures and temperatures, a material may go through a solid
*phase transition*, and take on a different crystal structure. So, one job of
crystallographers is to determine how a system will change under different
conditions. Often, new structures will form at high pressure, and sometimes
these structures have vastly superior properties (think diamond .v.s graphite).
Thus, high pressure physics forms an active branch of physics and chemistry,
and is a potential avenue for finding high temperature superconductors.

Periodicity, Lattices, and Unit Cells
-------------------------------------

Formally, an ideal crystal is an atomic structure that is periodic in three
dimensions. This means that when we translate the structure by a certain amount
(in any one of 3 directions unique to the crystal), the crystal will look the
same. This can be pictured in a few simple steps:

1. Define a small parallelepiped-shaped box.
2. Put atoms into the box (You can put as few or as many atoms as you like.

.. image:: ../images/unit_cell1.png
   :height: 444 px
   :width: 576 px
   :scale: 35 %
   :alt: single unit cell
   :align: center

3. Make a copy of the box and place it adjacent to the original box.

.. image:: ../images/unit_cell2.png
   :height: 763 px
   :width: 995 px
   :scale: 35 %
   :alt: repeated unit cell
   :align: center

4. Make a copy of the copy, and place that adjacent to the previous one, but
along a different axis.

.. image:: ../images/unit_cell3.png
   :height: 763 px
   :width: 983 px
   :scale: 35 %
   :alt: repeated unit cell
   :align: center

5. Repeat step 4 until you have filled all of space.

.. image:: ../images/unit_cell4.png
   :height: 763 px
   :width: 1095 px
   :scale: 35 %
   :alt: full crystal
   :align: center

We say that the resulting object has *translational symmetry*, or that it is
*periodic*. We can be more specific by defining the vectors of translational
symmetry. For a given crystal, there are 3 such linearly independent vectors.
These 3 vectors, placed into a matrix, define what is called the unit cell.
Alternatively, we can define the unit cell using the lengths of each side of the
box (usually called a, b, c), along with the angles between them (usually called
:math:`alpha, beta, gamma`). These 6 values are called the cell parameters. The
unit cell is any parallepiped-shaped part of the crystal which can be used to
generate the rest of the crystal through translations alone. Any unit cell which
has the smallest possible volume is called a *primitive cell*.

Note: a given crystal can have multiple ways to define a primitive cell, and
there is not always a clearly preferred choice. Consider a 2-dimensional square
lattice. You could just as well define the lattice using parallelograms which
run along the diagonal lines:

.. image:: ../images/equivalent_lattices.png
   :height: 488 px
   :width: 1604 px
   :scale: 35 %
   :alt: equivalent lattices
   :align: center

To avoid this confusion, there is a set of standards (defined in the
`International Tables of Crystallography <https://it.iucr.org/>`_) which is
typically used. A cell based on these standards is called the *conventional cell*.
In many cases, the conventional cell is not actually a primitive cell. Instead,
the conventional cell may have extra atoms which exist in specific locations
within the cell. So the cell type is determined both by the cell parameters,
and by any additional atomic sites within the cell.

Different cell parameters lead to different rotational symmetries of the unit
cell (we will discuss this more below). Based on these symmetries, unit cells
can be divided into seven different ``crystal classes``. Each crystal class has
a different range of allowable cell parameters; triclinic is the general class,
requiring no symmetry. Combining these restrictions with possible extra lattice
positions, we get 14 possible types of lattices, called the *Bravais lattices*.
We list these here:

.. list-table::

    * - .. figure:: ../images/triclinic.png
            :scale: 80% %
            :figclass: align-center

            Triclinic

      - .. figure:: ../images/monoclinic_P.png
            :scale: 80% %
            :figclass: align-center

            P-monoclinic

      - .. figure:: ../images/monoclinic_C.png
            :scale: 80 %
            :figclass: align-center

            C-monoclinic

      - .. figure:: ../images/orthorhombic_P.png
            :scale: 80 %
            :figclass: align-center

            P-orthorhombic

    * - .. figure:: ../images/orthorhombic_C.png
            :scale: 80 %
            :figclass: align-center

            C-orthorhombic

      - .. figure:: ../images/orthorhombic_I.png
            :scale: 80 %
            :figclass: align-center

            B-orthorhombic

      - .. figure:: ../images/orthorhombic_F.png
            :scale: 80 %
            :figclass: align-center

            F-orthorhombic

      - .. figure:: ../images/tetragonal_P.png
            :scale: 80 %
            :figclass: align-center

            P-tetragonal

.. list-table::

    * - .. figure:: ../images/tetragonal_I.png
            :scale: 100 %
            :figclass: align-center

            B-tetragonal

      - .. figure:: ../images/hexagonal.png
            :scale: 100 %
            :figclass: align-center

            Hexagonal

      - .. figure:: ../images/rhombohedral.png
            :scale: 100 %
            :figclass: align-center

            Rhombohedral

    * - .. figure:: ../images/cubic_P.png
            :scale: 100 %
            :figclass: align-center

            R-cubic

      - .. figure:: ../images/cubic_I.png
            :scale: 100 %
            :figclass: align-center

            Body-centered cubic

      - .. figure:: ../images/cubic_F.png
           :scale: 100 %
           :figclass: align-center

           Face-centered cubic [#]_

Much like squares can be considered a special case of rectangles, all unit cells
can be thought of as special cases of triclinic cells. Cubic cells are a subset
of tetragonal cells, tetragonal cells are a subset of orthorhombic cells, and so
on. The hexagonal and trigonal lattices are somewhat special cases. They can be
generated using either trigonal/hexagonal prisms, or using the standard
parallelepiped shape. For consistency, the parallelepiped is always used. Note
that despite using a parallelepiped, this is still called a hexagonal cell choice.
Some lattices can be generated using a rhombohedral unit cell. Such space groups
begin with an ``R``, and always have trigonal symmetry. For these cases, we
again use the hexagonal cell.

Whenever possible, PyXtal uses the same choices of unit cell as the Bilbao
Crystallographic Server, which in turn uses the standard conventional cell.
For a complete list of the cell choices used by PyXtal, see the
`Group Settings <html/Settings.html>`_ page.

Typically, to describe coordinates within a crystal, we use what are called
*fractional coordinates*. Fractional coordinates use the lattice vectors as the
basis, as opposed to *absolute coordinates*, which use Euclidean space as the
basis. This makes it easier to describe two similar structures that differ only
in their lattice values. Unless otherwise specified, any listed coordinates are
fractional coordinates.

.. image:: ../images/fractional.png
   :height: 351 px
   :width: 481 px
   :scale: 100 %
   :alt: fractional vs absolute coordinates

It is important to note that when periodicity is present, multiple coordinates
can actually correspond to the same point, at least in notation. It is common
practice to convert all coordintaes to lie within the range [0, 1) for periodic
axes. So, for example, if we have a point at ``(1.4,-0.3,0.6)``, it will usually
be written as ``(0.4,0.7,0.6)``. This is because it is assumed that each unit
cell is the same. In other words, an atom located at ``(1.4,-0.3,0.6)`` implies
that another atom is located at ``(0.4,0.7,0.6)``. So, it is more convenient to
only consider the unit cell which lies between ``(0,0,0)`` and ``(1,1,1)``.

Symmetry Operations
-------------------

Translations are just one kind of transformation operation. More generally, we
can perform any 3-dimensional transformation which preserves the lengths and
angles between atoms. This means we can also apply rotations, reflections, and
inversions, as well as any combination of these. Note that successive operations
do not generally commute. That is, the order of operations determines the final
outcome.

A symmetry operation is any transformation which leaves the original structure
unchanged. In other words, if the structure looks the same before and after a
transformation, then that transformation is a symmetry operation of the object.
This includes the identity operation (doing nothing to the object), which means
that every object has at least a trivial symmetry.

We can artificially split a transformation into two parts: the rotational and
inversional part (given by a 3x3 matrix), and the translational part (given by a
3D vector, specifically a 3x1 column matrix). Often, we denote this as a
matrix-column pair ``(P,p)`` or ``(P|p)``, where the capital letter *P* represents
the rotation matrix, and the lowercase letter *p* represents the translation vector.

We can define the 3x3 rotation matrix by using 3 orthogonal unit vectors as the
columns. The resulting matrix is orthogonal, meaning the determinant is either
+1 or -1. If only a rotation is applied, then the determinant is +1, and if an
inversion is applied, the determinant is -1. If an object has no symmetry
operations with determinant -1, it is said to be **chiral**. In this case, the
object's mirror image is different from the original, and cannot be rotated to
match its **twin**. This is especially important for molecules with biochemical
applications, since the mirror molecule may have a different effect.

Now, we can define how one operation is applied to another. We consider two
operations: ``(P,p)`` and ``(Q,q)``. If we first apply ``(P,p)``, followed by
``(Q,q)``, then we get a new operation, which we will call ``(R,r): (Q,q)(P,p) = (R,r)``.
Note that we apply operations from the left. Then, the relationships are:

``R = Q*P``

``r = Q*p + q``

where * denotes standard matrix multiplication. From this definition, we see that
the rotation is always applied first, followed by the translation. This rule
applies for multiple operations as well; with 3 operations ``(R,r)(Q,q)(P,p)``,
we first apply ``(P,p)``, then ``(Q,q)``, then ``(R,r)``.

Alternatively, the matrix-column pair can be **combined** into a single 4x4
matrix. We simply place the vector to the right of the rotation matrix, place
0's on the bottom row, and place a 1 in the lower right-hand corner:

.. image:: ../images/matrix4x4.png
   :height: 343 px
   :width: 828 px
   :scale: 50%
   :alt: fractional vs absolute coordinates

This matrix is called an ``affine transformation matrix``. With it, we can apply
operations using a single matrix multiplication operation. Although this may
seem like just a mathematical trick, the affine matrix notation highlights the
group structure of the transformations, as it allows translations and rotations
to be placed on equal footing. Furthermore, we can use the additional dimension
to represent time: the '1' value can be thought of as a single step forward in
time, and thus we can define both rotational and translational reference frames
(and equivalently, torques and forces) with a single 4x4 matrix. Objects which
are (periodically) symmetric in time are called time crystals. Such objects have
only recently been synthesized in the lab, and there is likely more research to
be done. However, for most applications in crystallography, time is not a factor,
and we consider only spatial symmetries.

Sometimes crystallographers express an affine transformation as a list of letters
and numbers, separated by commas (for example, ``x,y,z``). In this notation, the
first, second, and third positions denote what happens to the unit x, y, and z
axes, respectively. So if we want to perform an inversion, we replace each axis
with its opposite. Then, ``x,y,z`` becomes ``-x,-y,-z``. So, you can use
``-x,-y,-z`` to represent an inversion. Similarly, ``y,-x,z`` would represent a
90 degree rotation about the z axis (using the right hand rule). You can also
map to a linear combination of axes, or add a constant value. So, you might see
something like ``x-y,x,z+1/2``. Here, we just follow the same procedure: x, which
is the vector (1,0,0) is mapped onto ``x-y``, which is the vector ``(1,-1,0)``.
``y (0,1,0)`` is mapped onto ``x (1,0,0)``, and ``z (0,0,1)`` is mapped onto
``z+1/2 (0,0,1)``, or in the 4x4 notation, ``(0,0,1,.5)``. To express the
addition of a constant (in this case 1/2 for the z-axis), the right-hand side of
the 4x4 matrix is used. So, we would write ``x-y,x,z+1/2`` as:

.. image:: ../images/affine_matrix.png
   :height: 126 px
   :width: 174 px
   :scale: 100%
   :alt: [[1,-1,0,0],[1,0,0,0],[0,0,1,0.5],[0,0,0,1]]


Note that the mapped vectors are written as rows, NOT columns. So, ``x-y`` is
written on the first row as ``(1,-1,0,0)``. Again, the bottom row is always
``(0,0,0,1)``, so that matrix multiplication is preserved.

Groups
------

Symmetry operations have several nice properties, and this allows certain sets
of them to be classified as a mathematical object called a group. There are
several simple and intuitive examples of groups, which we will discuss below.
Formally, a group G is a set of mathematical objects (called elements) with 4
properties:

1) There is a binary operation which maps any two elements in the set onto a
third element which is also in the set: ``A*B = C``. The operation must be
defined for every possible pair on the set, and must map onto an element which
is inside of the set.

2) There must be exactly one identity element ``I`` which maps every element of
the set onto itself: ``A*I = I*A = A`` for every A in G.

3) Every element ``A`` must have an inverse ``A^-1``, such that multiplication
by the inverse gives the identity: ``A*A^-1 = A^-1*A = I``.

4) The operation * must be associative. That is, ``(A*B)*C = A*(B*C)``.

Note that commutativity is not a requirement for groups, but associativity is.
Anticommutativity has important implications for describing rotations and angular
momentum in 3 dimensions, which are beyond the scope of this study.

One of the simplest examples of a group is the additive group of real integers
``(Z,+)``. Here, the set is that of the integers ``(-1, 0, 1, ...)``, and the
operation is addition. Here, the inverse of a number is just its negative.
For example, the inverse of -2 is 2. One can easily verify that the 4 properties
listed above hold true for this group. Similarly, we can consider the additive
group of real numbers ``(R,+)``, or the additive group of complex numbers ``(C,+)``.

However, if we replace addition with multiplication, then we no longer have a
group, because the element 0 does not have a multiplicitive inverse: any number
multiplied by 0 is 0, but any number divided by 0 is undefined. We can fix this
by considering the multiplicative group of all numbers except for 0. Or,
equivalently, we can consider the multiplicitave group exp(x), where x is any
complex number. Then, the inverse is defined as exp(-x), and the identity
element is exp(0) = 1.

Interestingly, the  real numbers are a subset of the complex numbers, and yet
both the complex numbers and the real numbers form groups in their own right.
In this case, we call the real numbers a subgroup of the complex numbers.
Likewise, we call the complex numbers a supergroup of the real numbers. More
specifically, we say that the real numbers are a proper subgroup of the complex
numbers, because there are fewer real numbers than complex numbers. Likewise,
the complex numbers form a proper supergroup of the real numbers. So, a group is
always both a subgroup and a supergroup of itself, but is never a proper
subgroup or proper supergroup of itself.

These are so far all examples of infinite groups, since there are infinitely
many points on the number line. However, there also exist finite groups. For
example, consider the permutation group of 3 objects (we'll call them ``a``,
``b``, and ``c``). Our group elements are:

::

    1: (a,b,c)
    2: (a,c,b)
    3: (b,a,c)
    4: (b,c,a)
    5: (c,a,b)
    6: (c,b,a)

As you can see, there are only 6 elements in this group. Element (1) is the
identity, as it represents keeping ``a``, ``b``, and ``c`` in their original
order. Element (2) represents swapping ``b`` and ``c``, element (3) represents
swapping ``a`` and ``b``, and so on.

In general, we call the number of elements in a group the order of that group.
In the example above, the order is 6. If there are an infinite number of elements
in a group (for example, the additive group of real numbers), we say the group
has infinite order. A group of order 1 is called a trivial group, because it has
only one element, and this must be the identity element. Furthermore, because
every group has an identity element, every group also contains a trivial group
as a subgroup.

Sometimes, it is inconvenient to list every member of a group. Instead, it is
often possible to list only a few elements, which can be used to determine, or
**generate** the other elements. These chosen elements are called generators.
For example, consider elements (2) and (3) in the permutation group shown above.
We can define the remaining elements (1, 4, 5, and 6) starting with only (2) and
(3) (with operations acting from the left):

::

    2 * 2 = 1 : (a,c,b) * (a,c,b) = (a,b,c)
    2 * 3 = 4 : (a,c,b) * (b,a,c) = (b,c,a)
    3 * 4 = 6 : (b,a,c) * (b,c,a) = (c,b,a)
    6 * 2 = 5 : (c,b,a) * (a,c,b) = (c,a,b)

Thus, we say that (2) and (3) are generators of the group. Typically, there is
not a single **best** choice of generators for a group. We could just as easily
have chosen (2) and (6), or (4) and (3), or some other subset as our generators.

Symmetry Groups
---------------

One can verify that the four properties of groups listed above also hold for our
4x4 transformation matrices. Thus the set of all 3D transformations (with 4x4
matrix multiplication as our operation) forms a group. Because of this, the tools
of group theory become available.

When we want to define the symmetry of an object, we specify the object's
symmetry group. A symmetry group is just the set of all of the object's symmetry
operations (described above). It turns out, the set of all symmetry operations
for an object always forms a group. The group properties (2-4) hold because we
are using 4x4 transformation matrices, which are already a group. Property (1)
holds because a symmetry group is always a closed set. This is because performing
any symmetry operations always brings us back to our original state, and
therefore combining multiple symmetry operations also brings us back to the
original state. Thus, combinations of symmetry operations are themselves symmetry
operations, and are therefore elements of the object's symmetry group.

The simplest 3D symmetry group is the trivial group (called "1"). This group has
only the identity transformation I, which means that it corresponds to a
completely asymmetrical object. For such an object, there is no transformation
(besides the identity) which brings the object back to its original state. Most
molecules have at least some rotational symmetry, and crystals always have at
least translational symmetry, so we will not encounter this group very often.

On the other hand, we can consider empty 3D space, which is perfectly symmetrical
(note: this does not apply to actual empty space, which contain gravitational
and quantum fields). The symmetry group of empty space includes not only
rotations and translations, but also scaling and shearing, since **nothing** will
always be mapped back onto **nothing**.


Note that only empty space, or other idealized objects (including some fractals)
can have scaling symmetry. For atomic structures, we will never encounter this.
However, shear symmetry is possible for lattices. As an example, consider the
different choices for the primitive cell shown in the section above. These
different primitive cells can be mapped onto each other using shear
transformations. It is important to note that in general only simple lattices
have this shearing symmetry; if there are atoms inside of the lattice, they may
not map onto other atoms in the crystal.

We can also define symmetry groups for objects of arbitrary dimension. A simple
example is the equilateral triangle, which has a 3-fold rotational symmetry, as
well as 3 reflectional symmetries. A slightly more complex example is the regular
hexagon, which has all of the symmetries of the triangle, but also 6-fold and
2-fold rotational symmetry, and additional reflectional symmetries. Combining
rotation and reflection, the hexagon also has the inversion symmetry:

.. list-table::

    * - .. figure:: ../images/triangle.png
            :scale: 75% %
            :figclass: align-center

            triangular symmetry

      - .. figure:: ../images/hexagon.png
            :scale: 40% %
            :figclass: align-center

            hexagonal symmetry




It takes practice to develop an intuition for finding symmetries, but the results
can be very rewarding. Often, a symmetry can be utilized to lessen the work
needed to solve a problem, sometimes even reducing the problem to a trivial
identity. This is a core concept in mathematics and physics, and deserves reflection.

Point Groups
~~~~~~~~~~~~

In order for an object to be translationally symmetric, it must be periodic along
one or more axes. This means that most objects (excluding crystals and certain
idealized chain molecules) can only have rotational/inversional symmetry. A 3D
symmetry group without translational symmetry is called a point group. This is
because the transformations leave at least one point of space unmoved. This
includes rotations, reflections, inversions, and combinations of the three. Note
that we can either use rotations and reflections, or rotations and inversions,
to generate the remaining point transformations. In PyXtal and the documentation,
we use rotations and inversions as the basic transformations, meaning reflections
are treated as rotoinversions.

A point group can contain rotations, reflections, and possibly inversion. There
are several conventions for naming point groups, but PyXtal uses the Schoenflies
notation. Here, point groups have one or two letters to describe the type(s) of
transformations present, and a number to describe the order. For detailed
information, see the Wikipedia page. Below are a few examples of point groups
found in crystallography and chemistry.

- :math:`H_2O`: point group C2v (2-fold rotation axis, and two mirror planes) [#]_
- Hypothetical Pmmm crystal: point group mmm (3 mirror planes)
- Buckminsterfullerene: point group Ih (Full icosahedral symmetry) [#]_

.. list-table::

    * - .. figure:: ../images/water_symmetry_1.gif
            :height: 720 px
            :width: 1024 px
            :scale: 25%
            :figclass: align-center

            :math:`H_2O` molecule (``C2v``)

      - .. figure:: ../images/Pmmm.png
            :height: 720 px
            :width: 1024 px
            :scale: 25%
            :figclass: align-center

            Hypothetical crystal (``mmm``)

      - .. figure:: ../images/Bucky.png
            :height: 720 px
            :width: 1024 px
            :scale: 25%
            :figclass: align-center

            Buckminsterfullerene (``Ih``)



Space Groups
~~~~~~~~~~~~

For crystals, we need to describe both the translational (lattice) and rotational
(point group) symmetry. A 3D symmetry group containing both of these is called a
space group, and is one of the main tools used by crystallographers. We can
separate a space group into its point group and its lattice group. Thus, space
groups can be neatly divided into the seven different crystal classes.
Mathematically, the two different types of symmetry are connected; thus, certain
kinds of translational symmetry (lattice types) can only have certain kinds of
rotational symmetry (point groups). This is apparent from the names of the space
groups; certain symbols are only found in certain lattice systems. A list of
space groups and their symmetries is provided by the
`Bilbao utility WYCKPOS <http://www.cryst.ehu.es/cryst/get_wp.html>`_. Note that
for space groups, we use the `Hermann-Mauguin (H-M) notation <https://en.wikipedia.org/wiki/Hermann%E2%80%93Mauguin_notation>`_.
This means a space group can be specified by a number between 1 and 230. However,
a space group symbol should always be provided, as the numbers are not used as
commonly. The numbers are more useful for computer applications like PyXtal or
Pymatgen, or in conjunction with references like the Bilbao server or the
International Tables.

Technically speaking, two crystals with the same lattice type and point group,
but with different cell parameters, have different space groups. The space group
is the set of all symmetry operations, and in this case the translational
symmetry operations would be different. But typically when someone says space
group, they actually mean the set of all space groups with the same lattice type
and point group. In this sense, we say that there are 230 different space groups.
This is the meaning of space group which we will use from now on, unless
otherwise specified. This is useful, since we don't need to define a new space
group every time we shrink or stretch a crystal by some small amount.

Not every rotational symmetry is compatible with a 3D lattice. Specifically, only
rotations of order 2, 3, 4, or 6 are found in real crystals (Note: pseudo-crystals
may have different local symmetries, but lack long-range periodicity). As a result,
only 32 point groups are found as subgroups of space groups. These are called the
crystallographic point groups. So, by choosing such a point group, along with a
**compatible lattice**, we define a space group. By **compatible lattice**, we
mean any lattice which maps onto itself under the symmetry operations of the
chosen point group. Because of this compatibility condition, the presence of a
particular symmetry can tell you what kind of lattice is present. For example, a
6-fold rotation always belongs to a hexagonal lattice. A 3-fold rotation about
one of the primary axes belongs to a trigonal axis, whereas a 3-fold rotation
about the diagonal belongs to a cubic lattice. In this way, the lattice type can
be determined from the Hermann-Mauguin symbol.

In reality, a crystal is often distorted slightly from its ideal symmetrical
state. As a result, two researchers may label the same crystal with different
space groups. This phenomenon is called pseudosymmetry; it is when a crystal is
close to possessing a certain space group, but is only slightly off. This is a
real problem for computational crystallography, since numerical accuracy makes
determining symmetry an imprecise business. For example, if an atom is located
at ``(0,1/3,0)``, it will be encoded as something like ``(0,.33333,0)`` due to
rounding. As a result, it will be slightly off from the expected location, and
the computer may not recognize the 3-fold symmetry. So, whenever you work with
crystal symmetry, it is a good idea to allow some numerical **tolerance**
(roughly somewhere between ``.001`` and ``.03`` Angstroms), so as to correctly
assess the symmetry. On the flip side, if a provided crystal is labeled as
having P1 symmetry (which means no rotational symmetry was found), it is likely
that some symmetry is actually present, but was not found due to numerical issues.

Wyckoff Positions
-----------------

Because symmetry operations can be thought of as making *copies* of parts of an
object, we can usually only describe part of a structure, and let symmetry
generate the rest. This small part of the structure used to generate the rest is
called the asymmetric unit. However, not all points in the asymmetric unit are
generated the same. If an atom lies within certain regions - planes, lines, or
points - then the atom may not be "copied" as many times as other atoms within
the asymmetric unit. A familiar example is in the creation of a paper snowflake.
We start with a hexagon, then fold it into a single triangle 6 sheets thick.
Then, if we cut out a mark somewhere in the middle of the triangle, the mark is
copied 6-fold. However, if we instead cut out a mark alonng the triangle's edge,
or at the tip, the marks will only have 3 or 1 copies:

.. image:: ../images/PaperSnowflake.png
   :height: 256 px
   :width: 256 px
   :scale: 100%
   :alt: Paper snowflake

These different regions are called Wyckoff positions, and the number of copies
is called the multiplicity of the *Wyckoff position*. So, if an atom lies in a
Wyckoff position with multiplicity greater than 1, then that Wyckoff position
actually corresponds to multiple atoms. However, thanks to symmetry, we can refer
to all of the copies (for that particular atom) as a single Wyckoff position.
This makes describing a crystal much easier, since we no longer need to specify
the exact location of most of the atoms. Instead, we need only list the space
group, the lattice, and the location and type of one atom from each Wyckoff
position. This is exactly how the cif file format encodes crystal data (more
info below). Just keep in mind that in this format, a single atomic entry may
correspond to multiple atoms in the unit cell.

The largest Wyckoff position, which makes a copy for every symmetry operation,
is called the general Wyckoff position, or just the general position. In the
snowflake example, this was the large inner region of the triangle. In general,
the general position will consist of every location which does not lie along
some special symmetry axis, plane, or point. For this reason, the other Wyckoff
positions are called the special Wyckoff positions.

The number and type of Wyckoff positions are different for every space group; a
list of them can be found using the
`Bilbao utility WYCKPOS <http://www.cryst.ehu.es/cryst/get_wp.html>`_. In the
utility, Wyckoff positions are described using the ``x,y,z`` notation, where
each operation shows how the original ``(x,y,z)`` point is transformed/copied.
In other words, if we choose a single set of coordinates, then plugging these
coordinates into the Wyckoff position will generate the remaining coordinates.
As an example, consider the general position of space group ``P222 (#16)``,
which consists of the points ``(x,y,z), (-x,-y,z), (-x,y,-z), and (x,-y,-z)``.
If we choose a random point, say ``(0.321,0.457,0.892)``, we can determine the
remaining points:

::

    (x,y,z)->(0.321,0.457,0.892)
    (-x,-y,z)->(0.679,0.543,0.892)
    (-x,y,-z)->(0.679,0.457,0.108)
    (x,-y,-z)->(0.321,0.543,0.108)

Here a negative value is equal to 1 minus that value (-0.321 = 1 - 0.321 = 0.679).

To denote Wyckoff positions, a combination of number and letter is used. The
number gives the multiplicity of the Wyckoff position, while the letter
differentiates between positions with the same multiplicity. The letter 'a' is
always given to the smallest Wyckoff position (usually located at the origin or
z axis), and the letter increases for positions with higher multiplicity. So,
for example, the space group ``I4mm (#107)`` has 5 different Wyckoff positions:
``2a``, ``4b``, ``8c``, ``8d``, and ``16e``. Here, ``16e`` is the general
position, since it has the largest multiplicity and last letter alphabetically.

Note that for space groups with non-simple lattices (those which begin with a
letter other than 'P'), the Wyckoff positions also contain fractional translations.
Take for example the space group ``I4mm (#107)``. The Bilbao entry can be found
at the `url <http://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-wp-list?gnum=107>`_.
Each listed Wyckoff position coordinate has a copy which is translated by
``(0.5,0.5,0.5)``. It is inconvenient to list each of these translated copies
for every Wyckoff position, so instead a note is placed at the top. This is why
Wyckoff position ``16e`` has only 8 points listed. In this case, to generate the
full crystal, one could apply the 8 operations listed, then make a copy of the
resulting structure by translating it by the vector ``(0.5,0.5,0.5)``. Note that
in space groups beginning with letters other than P, the smallest Wyckoff
position will never have a multiplicity of 1.

In addition to the generating operations, the site symmetry of each Wyckoff
position is listed. The site symmetry is just the point group which leaves the
Wyckoff position invariant. So, if a Wyckoff position consists of an axis, then
the site symmetry might be a rotation about that axis. The general position
always has site symmetry 1, since it corresponds to choosing any arbitrary
structure or location can be made symmetrical by copying it and applying all of
the operations in the space group.

Finally, since crystals are infinitely periodic, a Wyckoff position refers not
only to the atoms inside a unit cell, but every periodic copy of those atoms in
the other unit cells. Thus, the Wyckoff position ``x,y,z`` is the same as the
position ``x+1,y+1,z``, and so on. This is usually a minor detail, but it must
be taken into account for certain computational tasks.

Molecular Wyckoff Positions
---------------------------

In most cases, it is assumed that the objects occupying Wyckoff positions will
be atoms. Because atoms are spherically symmetrical, they will always possess
the site symmetry associated with a given Wyckoff position. However, this is not
always the case for molecules, which have their own point group symmetry. Because
of this, a given molecule may or may not fit into a given Wyckoff position,
depending on its symmetry and orientation.

In order for a molecule to fit within a Wyckoff position, its point group must
be a supergroup of the position's site symmetry. In other words, the molecule
must be at least as symmetrical as the region of the Wyckoff position itself
(with reference to the operations of the space group as a whole). Furthermore,
the molecule must be oriented in such a way that its symmetry axes line up with
the symmetry axes of the Wyckoff position. As an example, consider a Wyckoff
position with site symmetry 2. This is an axis with 2-fold symmetry. Now consider
a water molecule lying on this axis. In order to truly occupy the Wyckoff
position, the water molecule's 2-fold axis must line up with the Wyckoff
position's (See the water molecule image above).

For larger site symmetry groups, it is more complicated to check if a molecule
will fit or not. The algorithm used by PyXtal for doing this is detailed in the
`How PyXtal Works <Algorithm.html>`_ page.


Crystal File Formats
--------------------

There are two main file formats used for storing crystal structures: cif and
POSCAR. Each of these has standard definitions.
`Here <https://www.iucr.org/resources/cif/spec/version1.1/cifsyntax>`_ is the
cif file definition (given by the International Tables), and
`here <https://cms.mpi.univie.ac.at/vasp/vasp/POSCAR_file.html>`_ is the POSCAR
file definition (given by Vasp).

Cif uses the space group symmetry to compress the data. The core information
consists of the space group, the lattice, and the location and type of a single
atom from each Wyckoff position. So, for high symmetry space groups, a cif file
can be much smaller than a POSCAR file. As with any type of compression, the cif
file has the downside that the program using it must be able to work with
symmetry operations. Specifically, each Wyckoff position's generating atom must
be copied using the symmetry operations, so that the entire unit cell can be known.

In contrast, a POSCAR file does not provide the symmetry information, but instead
specifies the type and location of every atom in the unit cell, including those
which are symmetrical copies of each other. This results in a larger file, but
one that is easier to read, since no symmetry operations need to be applied. The
downside is that if one wishes to know the space group, it must either be
calculated, or given by some external source.

Each format has advantages and disadvantages. A computational crystallographer
should be familiar with both, and understand the differences. If you provide a
POSCAR file for a structure, you should also provide the symmetry group.
Likewise, if you provide a cif file, you should be certain that the symmetry
information is correct, and that you are using the correct space group setting.

.. [#] Images from https://en.wikipedia.org/wiki/Crystal_structure

.. [#] Image from "Molecular Orbitals for Water (H2O)"http://www1.lsbu.ac.uk/php-cgiwrap/water/pfp.php3?page=http://www1.lsbu.ac.uk/water/h2o_orbitals.html)

.. [#] Image from https://en.wikipedia.org/wiki/Buckminsterfullerene#/media/File:Buckminsterfullerene-perspective-3D-balls.png


================================================
FILE: doc/COMMAND_MODE.rst
================================================
Run PyXtal executables
======================

Currently, we provide several utilities to the users so that they can run the
code from command line with Python scripting.
They include:

- ``Pyxtal_main.py``: a tool to generate atomic/molecular crystals
- ``Pyxtal_symmetry.py``: a tool to access the symmetry information

After a successfull `installation <Installation.html>`_, all of them can be
accessed by invoking the ``-h`` command:

::

    $ pyxtal_main.py -h
                 ______       _    _          _
                (_____ \     \ \  / /        | |
                 _____) )   _ \ \/ / |_  ____| |
                |  ____/ | | | )  (|  _)/ _  | |
                | |    | |_| |/ /\ \ |_( (_| | |___
                |_|     \__  /_/  \_\___)__|_|_____)
                       (____/


    ----------------------(version 0.1.4 )----------------------

    A Python package for random crystal generation
    The source code is available at https://github.com/MaterSim/pyxtal
    Developed by Zhu's group at University of Nevada Las Vegas


    usage: pyxtal_main.py [-h] [-s sg] [-e element] [-n numIons] [-f factor]
                          [-a attempts] [-o outdir] [-d dimension] [-t thickness]
                          [-m]

    optional arguments:
      -h, --help            show this help message and exit
      -s sg, --symmetry sg  desired symmetry, number or string, e.g., 36, Pbca, Ih
      -e element, --element element
                            desired elements: e.g., Li
      -n numIons, --numIons numIons/numMols
                            desired numbers of atoms: 16
      -f factor, --factor factor
                            volume factor: default 1.0
      -a attempts, --attempts attempts
                            number of crystals to generate: default 1
      -o outdir, --outdir outdir
                            Directory for storing output cif files: default 'out'
      -d dimension, --dimension dimension
                            desired dimension: (3, 2, 1, 0): default 3
      -t thickness, --thickness thickness
                            Thickness of a 2D crystal, or area of a 1D crystal,
                            None generates a value automatically: default None
      -m, --molecular       molecular? default: False



PyXtal_symmetry utility
------------------------
``PyXtal_symmetry.py`` is a utility to handle the generation of moelcular crystals.

- `-d`, the dimension, e.g., ``3``, ``2``, ``1``, ``0``. The defult is ``3``.
- `-s`: the target symmetry, either by *string* (e.g., ``Ih``, ``Pbca``) and *integer* (``61``).

::

    $ pyxtal_symmetry.py -s 36

    -- Space group # 36 (Cmc2_1)--
    8b site symm: 1
      x, y, z
      -x, -y, z+1/2
      x, -y, z+1/2
      -x, y, z
      x+1/2, y+1/2, z
      -x+1/2, -y+1/2, z+1/2
      x+1/2, -y+1/2, z+1/2
      -x+1/2, y+1/2, z
    4a site symm: m..
      0, y, z
      0, -y, z+1/2
      1/2, y+1/2, z
      1/2, -y+1/2, z+1/2

::

    $ pyxtal_symmetry.py -s 20 -d 2

    -- Layer group # 20 (p2_122)--
    4d site symm: 1
      x, y, z
      x+1/2, -y, -z
      -x+1/2, y, -z
      -x, -y, z
    2c site symm: .2.
      1/4, y, 0
      3/4, -y, 0
    2b site symm: ..2
      0, 1/2, z
      1/2, 1/2, -z
    2a site symm: ..2
      0, 0, z
      1/2, 0, -z

if the ``-s`` tag is not given, it will output the list of all possible symmetry
groups for the given dimension.

::

    $ pyxtal_symmetry.py -d 3
        space_group
    1            P1
    2           P-1
    3            P2
    4          P2_1
    5            C2
    6            Pm
    7            Pc
    8            Cm
    9            Cc
    10         P2/m
    11       P2_1/m
    12         C2/m
    13         P2/c
    14       P2_1/c
    15         C2/c
    16         P222
    17       P222_1
    18     P2_12_12
    19   P2_12_12_1
    20       C222_1
    ...
    ...
    212       P4332
    213      P4_132
    214      I4_132
    215       P-43m
    216       F-43m
    217       I-43m
    218       P-43n
    219       F-43c
    220       I-43d
    221       Pm-3m
    222       Pn-3n
    223       Pm-3n
    224       Pn-3m
    225       Fm-3m
    226       Fm-3c
    227       Fd-3m
    228       Fd-3c
    229       Im-3m
    230       Ia-3d

PyXtal_main utility
--------------------
``PyXtal_main.py`` is a utility to handle the generation of atomic crystals.
Typically, four arguments are requried to describe the target structure:

- `-d`, the dimension, e.g., ``3``, ``2``, ``1``, ``0``.
- `-s`: the target symmetry (*space*, *layer*, *rod*, *point* group information), either by *string* (e.g., ``Ih``, ``Pbca``) and *integer* (``61``).
- `-e`: the list of elements, e.g., ``Si``, ``Si, O``
- `-n`: the number of atoms in the target primitive unit cell, e.g., ``12``, ``4, 8``. The size should be consistent with the ``-e`` tag.

For **group setting**, please refer to the `Group Setting page <Settings.html>`_.
**To our knowledge, PyXtal is perhaps the only open source code which can handle
the crystal symmetry generation from 0 to 3 dimensional systems.**
Below we will introduce its capability in detail.

A quick example of C60
~~~~~~~~~~~~~~~~~~~~~~

Below is a quick example to generate a random ``C60`` clusters with icosahedral
(``Ih``) symmetry.

::

    $ pyxtal_main.py -e C -n 60 -d 0 -s Ih

    Symmetry requested: 56(Ih), generated: Ih
    Output to out/C60.xyz


As described in the screen output, the run will generate a file called
``out/C60.xyz`` which stores the structural information about C60.
One can thus visualize via different third-party packages. For instance,
below is the output from `VESTA <https://jp-minerals.org/vesta/en/>`_.

.. image:: ../images/C60.png
   :height: 763 px
   :width: 995 px
   :scale: 25 %
   :align: center

Note that this is a random process. So each time the structure is different.


3D crystals
~~~~~~~~~~~~~~~~~~~~~~
By default, ``-d`` tag is 3, which means to generate 3D crystal. Below is a
quick example to generate a diamond like crystals for carbon.

::

    $ pyxtal_main.py -e C -n 8 -s 227

    Symmetry requested: 227(Fd-3m), generated: Fd-3m
    Output to out/C8.cif


.. image:: ../images/C8-diamond.png
   :height: 763 px
   :width: 763 px
   :scale: 30 %
   :align: center

It is important to note that we specified ``8`` for ``-n`` tag, which means 8
carbon atoms in the conventional unit cell.

2D and 1D crystals
~~~~~~~~~~~~~~~~~~~~~~
2D and 1D crystals need one more argument to specify the confinement. For 2D
crystal, the ``thickness`` needs to be provided through ``-t`` tag in Angstrom.
Below is an example fo generating a 2D MoS2 crystal.

::

    $ pyxtal_main.py -e Mo,S -n 1,2 -s 77 -d 2 -t 2.4

    Symmetry requested: 77(p6mm), generated: P6mm
    Output to out/Mo1S2.cif


.. image:: ../images/MoS2.png
   :height: 763 px
   :width: 1263 px
   :scale: 30 %
   :align: center


Molecular crystals occupying general Wyckoff positions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Below is an example to generate of random crystal for a famous drug molecule ROY.

::

    $ pyxtal_main.py -m -e ROY -n 4 -s P2_12_12_1

    Symmetry requested: 19 (P2_12_12_1), generated: P2_12_12_1, vol: 2895.37 A^3
    Output to out/S4O8N12C48H36.cif

.. image:: ../images/ROY.png
   :height: 763 px
   :width: 963 px
   :scale: 30 %
   :align: center

Molecular crystals occupying special Wyckoff positions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
An import feature of PyXtal is that the program can automatically generate
molecular crystals occupying special Wyckoff positions. This is very useful for
molecules with high internal symmetry. During crystallization, these molecule
can occupy some special Wyckoff positions as long as the site symmetry is
compatible with the molecular symmetry. For instance, the space group ``Cmc_21``
has 4 symmetry operations (``mm2``) in its primitive cell. However, we can still
generate a structure with 2 molecules for C60 by placing them to the special
Wyckoff position. This will be automatically processed by our
`internal algorithm <Algorithm.html#finding-valid-molecular-orientations>`_.

::

    $ pyxtal_main.py -m -e C60 -n 2 -s 36


.. image:: ../images/C60-x.png
   :height: 703 px
   :width: 683 px
   :scale: 50 %
   :align: center

How to define the molecules?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Please ref to the section of `Molecule <Usage.html#molecule-in-pyxtal>`_.


================================================
FILE: doc/Installation.rst
================================================
Installation and Setup
======================

Dependencies
------------

Versions indicated are those used during development. Other versions may be
compatible, but have not yet been tested.

  * `SciPy 1.0.1 <https://www.scipy.org/install.html>`_
  * `NumPy 1.14.3 <https://www.scipy.org/scipylib/download.html>`_
  * `Pandas 0.20.3 <https://pandas.pydata.org/getpandas.html>`_
  * `Pymatgen 2017.9.3 <http://pymatgen.org/#getting-pymatgen>`_
  * `SpgLib for Python 1.9.9.44 <https://atztogo.github.io/spglib/python-spglib.html#installation>`_
  * `Openbabel 2.4.1 <http://openbabel.org/wiki/Category:Installation>`_
  * `Networkx 2.3 <https://networkx.github.io>`_

Openbabel is not necessary, and only adds additional file format support for
importing molecules. You must install the C++ pacakge before installing the
Python bindings. For Debian based systems, your distribution may already have
installable packages:

::

    $ sudo apt-get install openbabel
    $ pip install openbabel

Also note that the openbabel Python bindings require swig to install:

::

    $ sudo apt-get install swig

Older version of swig (before 2.0) will not work. For other systems, you must
compile the openbabel Python bindings yourself. There are tutorials for this on
the `openbabel website
<https://openbabel.org/docs/dev/UseTheLibrary/PythonInstall.html>`_, as well as
in the `pymatgen documentation
<http://pymatgen.org/installation.html#openbabel-mac-os-x-tested-on-v2-3-2>`_.

Installation
------------

To install PxXtal, one can simply type

::

    $ pip install pyxtal

or make a copy of the source code, and then install it manually.

::

    $ git clone https://github.com/MaterSim/pyxtal
    $ cd pyxtal
    $ pip install .


or update the code to our developing version

::

    $ pip install --upgrade git+https://github.com/MaterSim/PyXtal.git@master


This will install the module. You can check the installation of the code by a
simple test run as follows,

::

    $ pyxtal_test.py

You expect to see the following output.

::

                ______       _    _          _
                (_____ \     \ \  / /        | |
                 _____) )   _ \ \/ / |_  ____| |
                |  ____/ | | | )  (|  _)/ _  | |
                | |    | |_| |/ /\ \ |_( ( | | |___
                |_|     \__  /_/  \_\___)_||_|_(___
                       (____/


    ----------------------(version 0.0.1 )----------------------

    A Python package for random crystal generation
    The source code is available at https://github.com/MaterSim/pyxtal
    Developed by Zhu's group at University of Nevada Las Vegas


    ====== Testing functionality for pyXtal version 0.1dev ======
    Importing sys...
    Success!
    Importing numpy...
    Success!
    Importing pymatgen...
    Success!
    Importing pandas...
    Success!
    ...
    ...
    	223	|	223	|	223	|	1.12 s ~
    	224	|	224	|	224	|	0.30 s
    	225	|	225	|	225	|	0.54 s
    	226	|	226	|	226	|	0.45 s
    	227	|	227	|	227	|	0.47 s
    	228	|	228	|	228	|	1.42 s ~
    	229	|	229	|	229	|	0.19 s
    	230	|	230	|	230	|	0.18 s
    TEST COMPLETE

    Total time elapsed: 34.15 s

More extensive test can be invoked by running

::

    $ pyxtal_test.py -m all

Ideally, one should see the completion of all modules in the end.


================================================
FILE: doc/Makefile
================================================
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
SPHINXPROJ    = PyXtal
SOURCEDIR     = .
BUILDDIR      = _build

# Put it first so that "make" without argument is like "make help".
help:
	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

================================================
FILE: doc/README.txt
================================================
This is the documentation folder for PyXtal. We use Sphinx to automatically generate documentation.

The following command will update the rst files to include any new python files:
`sphinx-apidoc -o . ../pyxtal -e -M -f`
Once the rst files are satisfactory, or if no new Python files have been added/deleted, you can build the html by running:
`make html`
The html files will be output to /doc/_build/html .


================================================
FILE: doc/Settings.rst
================================================
Group Settings
==============

For the output 3D structures, PyXtal uses the conventional standard cell (same
as `Bilbao <http://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-def-choice>`_).
Below are the links for each set.

- `Space group <http://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-table>`_
- `Layer group <http://www.cryst.ehu.es/cgi-bin/subperiodic/programs/nph-sub_gen?subtype=layer&from=table>`_
- `Rod group <http://www.cryst.ehu.es/cgi-bin/subperiodic/programs/nph-sub_gen?subtype=rod&from=table>`_

One can conveniently access the list of crystallographic point groups, 1D
rod, 2D layer groups and 3D space groups by changing the ``dim`` flag.

.. code-block:: Python

    >>> from pyxtal.symmetry import Group
    >>> g=Group.list_groups(dim=0)
    point_group
    1           C1
    2           Ci
    3           C2
    ...
    56          Ih
    57          C*
    58         C*h

Space Group
-----------

By default, pyxtal follows the standard according to the Volume A of
International Tables for Crystallography.
They are defined as: unique axis b setting,
cell choice 1 for monoclinic groups, hexagonal axes setting for rhombohedral
groups, and origin choice 2 (origin in -1) for the centrosymmetric groups listed
with respect to two origins. The relation between the standard space group
and hall numbers are shown as follows,

.. code-block:: Python

	pyxtal_hall_numbers = [
	1,   2,   3,   6,   9,   18,  21,  30,  39,  57,  60,  63,  72,  81,  90,
	108, 109, 112, 115, 116, 119, 122, 123, 124, 125, 128, 134, 137, 143, 149,
	155, 161, 164, 170, 173, 176, 182, 185, 191, 197, 203, 209, 212, 215, 218,
	221, 227, 229, 230, 234, 239, 245, 251, 257, 263, 266, 269, 275, 279, 284,
	290, 292, 298, 304, 310, 313, 316, 323, 334, 336, 337, 338, 341, 343, 349,
	350, 351, 352, 353, 354, 355, 356, 357, 358, 360, 362, 363, 365, 366, 367,
	368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382,
	383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397,
	398, 399, 400, 401, 403, 405, 406, 407, 409, 411, 412, 413, 415, 417, 418,
	419, 421, 423, 424, 425, 427, 429, 430, 431, 432, 433, 435, 436, 438, 439,
	440, 441, 442, 443, 444, 446, 447, 448, 449, 450, 452, 454, 455, 456, 457,
	458, 460, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474,
	475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489,
	490, 491, 492, 493, 494, 496, 497, 499, 500, 501, 502, 503, 504, 505, 506,
	507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 519, 520, 522, 523,
	524, 526, 528, 529, 530]


However, in some programs like Spglib, when converting from space group to Hall
numbers, the first description of the space-group type in International Tables
for Crystallography) is chosen. In this case, the Hall number ``525`` (instead
of ``526``) will be chosen for the space group ``227``.

.. code-block:: Python

	spglib_hall_numbers = [
	1,   2,   3,   6,   9,   18,  21,  30,  39,  57,  60,  63,  72,  81,  90,
	108, 109, 112, 115, 116, 119, 122, 123, 124, 125, 128, 134, 137, 143, 149,
	155, 161, 164, 170, 173, 176, 182, 185, 191, 197, 203, 209, 212, 215, 218,
	221, 227, 228, 230, 233, 239, 245, 251, 257, 263, 266, 269, 275, 278, 284,
	290, 292, 298, 304, 310, 313, 316, 322, 334, 335, 337, 338, 341, 343, 349,
	350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 361, 363, 364, 366, 367,
	368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382,
	383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397,
	398, 399, 400, 401, 402, 404, 406, 407, 408, 410, 412, 413, 414, 416, 418,
	419, 420, 422, 424, 425, 426, 428, 430, 431, 432, 433, 435, 436, 438, 439,
	440, 441, 442, 443, 444, 446, 447, 448, 449, 450, 452, 454, 455, 456, 457,
	458, 460, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474,
	475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489,
	490, 491, 492, 493, 494, 495, 497, 498, 500, 501, 502, 503, 504, 505, 506,
	507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 520, 521, 523,
	524, 525, 527, 529, 530]


Layer Group
-----------

For 2D structures, we use unique axis c for monoclinic layer groups 3-7, and
unique axis a for layer groups 8-18. When two origin choices are available,
we use origin choice 1. We always choose c as the non-periodic axis.

Rod Group
---------

For 1D structures, we use unique axis a for monoclinic Rod groups 3-7, and
unique axis c for Rod groups 8-12. When two settings are available for a group,
we use the 1st setting. We always choose c as the periodic axis.


Point Group
-----------

For point group structures, we use unique axis c for all groups except the
polyhedral groups ``T, Th, O, Td, Oh, I, and Ih``. For all of these groups,
we place the 2-fold rotation about the z axis and a 3-fold rotation about the
(x,x,x) axis. For ``I`` and ``Ih``, we use a 5-fold rotation about the axis (1,
:math:`\tau`, 0), where :math:`\tau` is the golden ratio 1.618.

All supported point groups, listed by number:

+------------+------------+-----------+-----------+
| 1: C1      | 2: Ci      | 3: C2     | 4: Cs     |
+------------+------------+-----------+-----------+
| 5: C2h     | 6: D2      | 7: C2v    | 8: D2h    |
+------------+------------+-----------+-----------+
| 9: C4      | 10: S4     | 11: C4h   | 12: D4    |
+------------+------------+-----------+-----------+
| 13: C4v    | 14: D2d    | 15: D4h   | 16: C3    |
+------------+------------+-----------+-----------+
| 17: C3i    | 18: D3     | 19: C3v   | 20: D3d   |
+------------+------------+-----------+-----------+
| 21: C6     | 22: C3h    | 23: C6h   | 24: D6    |
+------------+------------+-----------+-----------+
| 25: C6v    | 26: D3h    | 27: D6h   | 28: T     |
+------------+------------+-----------+-----------+
| 29: Th     | 30: O      | 31: Td    | 32: Oh    |
+------------+------------+-----------+-----------+
| 33: C5     | 34: C7     | 35: C8    | 36: D5    |
+------------+------------+-----------+-----------+
| 37: D7     | 38: D8     | 39: C5v   | 40: C7v   |
+------------+------------+-----------+-----------+
| 41: C8v    | 42: C5h    | 43: D5h   | 44: D7h   |
+------------+------------+-----------+-----------+
| 45: D8h    | 46: D4d    | 47: D5d   | 48: D6d   |
+------------+------------+-----------+-----------+
| 49: D7d    | 50: D8d    | 51: S6    | 52: S8    |
+------------+------------+-----------+-----------+
| 53: S10    | 54: S12    | 55: I     | 56: Ih    |
+------------+------------+-----------+-----------+
| 57: C*     | 58: C*h    |           |           |
+------------+------------+-----------+-----------+

In addition to the 32 crystallographic point group , we add the following finite
non-crystallographic point groups:

``Cn, Cnh, Cnv, Sn, Cni, Dn, Dnh, Dnd.``

where n should be replaced by an integer. I and Ih, which are the icosahedral
and full icosahedral groups, are particularly useful (Buckminsterfullerene,
for example has point group symmetry ``Ih``). Finally, the infinite rotational
and dihedral point groups ``C*`` and ``C*h`` can be used for generating linear
structures. ``C*h`` will have mirror symmetry, while ``C*`` will not.


================================================
FILE: doc/Symmetry_representation.rst
================================================
Symmetry Representation
=======================

Space Group Symmetry
--------------------
In crystallography, the Hermann-Mauguin notation is used to represent the symmetry of a crystal structure. Using this notation, the symmetry of a crystal structure can be described by a space group symbol, which is a combination of letters and numbers that represent the symmetry operations that can be applied to the structure. A full Hermann-Mauguin notation can be broken down into four parts:

1. A single letter (``P, A, B, C, I, R``) indicating the type of lattice
2. A symbol denoting the symmetry for the primary direction.
3. A symbol denoting the symmetry for the secondary direction.
4. A symbol denoting the symmetry for the tertiary direction. 

.. list-table:: Symmetry definitions in the Hermann-Mauguin notation.
  :header-rows: 1
  :widths: 7 7 7 7 30
  :align: left 

  * - System
    - Primary  
    - Secondary
    - Tertiary
    - Possible Symmetry Elements
  * - Triclinic
    - —
    - —
    - —
    - 1, -1.
  * - Monoclinic
    - [010]
    - —
    - —
    - 2, 2₁, m, c, 2/m, 2/c, 2₁/c.
  * - Orthorhombic
    - [100]
    - [010]
    - [001]
    - 2, 2₁, m, a, b, c, n, d.
  * - Tetragonal
    - [001]
    - [100]/[010]
    - [110]/[101]/...
    - 4ₙ(/m) @ [001].
  * - Tri/Hexagonal
    - [001]
    - [100]/[010]
    - [110]/[101]/..
    - 3ₙ/6ₙ, -3, -6 @ [001]
  * - Cubic
    - [100]/...
    - [111]/[1̄11]/...
    - [110]/[101]/...
    - 4ₙ @ [100], 3ₙ @ [111], 2ₙ @ [110]


For example, the space group 227 has a symbol of ``Fd-3m`` or ``F 4₁/d -3 2/m`` in the full Hermann-Mauguin notation. This means it has 

1. a face centered unit cell
2. a ``4₁/d`` (including ``1, -1, 2₁, d, 4₁, -4``) symmetry in the [100] family direction.
3. a ``-3`` (including ``1, -1, 3``) symmetry in the [111] family directions.
4. a ``2/m`` (including ``1, -1, 2, m``) symmetry in the [110] family directions.

In most cases, the short Hermann-Mauguin notation is used to describe the symmetry of a crystal structure. For the case of ``F 4₁/d -3 2/m``, it can be simplified to ``Fd-3m`` by removing the redundant information due to the following reasons:

- ``4₁/d`` is reduced to ``d`` since the primary direction must have the 4-fold, 
- ``2/m`` is reduced to ``m`` since the tertiary direction must have the 2-fold symmetry. 

Similarly, the space group 61 ``P 2₁/b 2₁/c 2₁/a`` can be simplified to ``Pbca`` since the ``2₁`` must be present in that particular setting. However, the full Hermann-Mauguin notation is more informative and can be used to describe the symmetry of a crystal structure in more detail.

Below shows the symmetry element analysis of the space group ``Fd-3m`` on the 15 high symmetry crystallographic axes.

.. list-table:: Symmetry analysis of space group 227 (Fd-3m)
    :widths: 10 20 30 20
    :header-rows: 1

    * - Index 
      - Direction
      - Symmetry elements
      - Symbol  
    * - 0
      - (1, 0, 0)
      - 1, -1, 2₁, d, 4₁, -4
      - 4₁/d
    * - 1
      - (0, 1, 0)
      - 1, -1, 2₁, d, 4₁, -4
      - 4₁/d
    * - 2
      - (0, 0, 1)
      - 1, -1, 2₁, d, 4₁, -4
      - 4₁/d
    * - 3
      - (1, 1, 1)
      - 1, -1, 3
      - -3
    * - 4
      - (1, -1, -1)
      - 1, -1, 3
      - -3
    * - 5
      - (-1, 1, -1)
      - 1, -1, 3
      - -3
    * - 6
      - (-1, -1, 1)
      - 1, -1, 3
      - -3
    * - 7
      - (1, -1, 0)
      - 1, -1, 2, m
      - 2/m
    * - 8
      - (1, 1, 0)
      - 1, -1, 2, d
      - 2/d
    * - 9
      - (0, 1, -1)
      - 1, -1, 2, m
      - 2/m
    * - 10
      - (0, 1, 1)
      - 1, -1, 2, d
      - 2/d
    * - 11
      - (-1, 0, 1)
      - 1, -1, 2, m
      - 2/m
    * - 12
      - (1, 0, 1)
      - 1, -1, 2, d
      - 2/d
    * - 13
      - (1, -2, 0)
      - 1, -1
      - -1
    * - 14
      - (2, -1, 0)
      - 1, -1
      - -1


One can easily verify this via PyXtal as follows.

.. code-block:: python

    from pyxtal.symmetry import Group
    spg = Group(227)
    ss = spg.get_spg_symmetry_object()
    ss.to_beautiful_matrix_representation(skip=False)

>>> Order Axis   1  -1 2  2_1 m  a  b  c  n  d  3  3_1 3_2 4  4_1 4_2 4_3 -4   
  0 ( 1  0  0):  1  1  0  1   0  0  0  0  0  1  0  0   0   0  1   0   0   1  # 4_1/d
  0 ( 0  1  0):  1  1  0  1   0  0  0  0  0  1  0  0   0   0  1   0   0   1  # 4_1/d
  0 ( 0  0  1):  1  1  0  1   0  0  0  0  0  1  0  0   0   0  1   0   0   1  # 4_1/d
  1 ( 1  1  1):  1  1  0  0   0  0  0  0  0  0  1  0   0   0  0   0   0   0  # -3
  1 ( 1 -1 -1):  1  1  0  0   0  0  0  0  0  0  1  0   0   0  0   0   0   0  # -3
  1 (-1  1 -1):  1  1  0  0   0  0  0  0  0  0  1  0   0   0  0   0   0   0  # -3
  1 (-1 -1  1):  1  1  0  0   0  0  0  0  0  0  1  0   0   0  0   0   0   0  # -3
  2 ( 1 -1  0):  1  1  1  0   1  0  0  0  0  0  0  0   0   0  0   0   0   0  # 2/m
  2 ( 1  1  0):  1  1  1  0   1  0  0  0  0  0  0  0   0   0  0   0   0   0  # 2/m
  2 ( 0  1 -1):  1  1  1  0   1  0  0  0  0  0  0  0   0   0  0   0   0   0  # 2/m
  2 ( 0  1  1):  1  1  1  0   1  0  0  0  0  0  0  0   0   0  0   0   0   0  # 2/m
  2 (-1  0  1):  1  1  1  0   1  0  0  0  0  0  0  0   0   0  0   0   0   0  # 2/m
  2 ( 1  0  1):  1  1  1  0   1  0  0  0  0  0  0  0   0   0  0   0   0   0  # 2/m

In the above output, we use a 1D 18-length array to represent the symmetry elements (``1, -1, 2, 2₁, m, a, b, c, n, d, 3, 3₁, 3₂, 4, 4₁, 4₂, 4₃, -4``). 

Space Group Symmetry's Digital Representation
---------------------------------------------

For the application of deep learning, the space group symmetry can be represented as a **14 lattice indices** + **15x18 matrix**. 

For the lattice index, we divde it into 16 possible cases (0-15) as shown below:

.. list-table::
    :widths: 15 35
    :header-rows: 1

    * - ID
      - Lattice Type
    * - 0 
      - Triclinic Primitive
    * - 1
      - Monoclinic Primitive 
    * - 2
      - Monoclinic C-Base Centered
    * - 3
      - Orthorhombic Primitive
    * - 4
      - Orthorhombic A-base Centered
    * - 5
      - Orthorhombic B-base Centered
    * - 6
      - Orthorhombic C-base Centered
    * - 7
      - Orthorhombic Body Centered
    * - 8
      - Orthorhombic Face Centered
    * - 9
      - Tetragonal Primitive
    * - 10
      - Tetragonal Body Centered
    * - 11
      - Hexagonal Primitive
    * - 12
      - Hexagonal Rhombehedral 
    * - 13
      - Cubic Primitive
    * - 14
      - Cubic Body Centered
    * - 15
      - Cubic Face Centered

For the matrix, the rows represent 15 directions, including

    .. list-table::
        :widths: 15 35
        :header-rows: 1

        * - Index
          - Direction
        * - 0
          - (1, 0, 0)
        * - 1
          - (0, 1, 0)
        * - 2
          - (0, 0, 1)
        * - 3
          - (1, 1, 1)
        * - 4
          - (1, -1, -1)
        * - 5
          - (-1, 1, -1)
        * - 6
          - (-1, -1, 1)
        * - 7
          - (1, -1, 0)
        * - 8
          - (1, 1, 0)
        * - 9
          - (0, 1, -1)
        * - 10
          - (0, 1, 1)
        * - 11
          - (-1, 0, 1)
        * - 12
          - (1, 0, 1)
        * - 13
          - (1, 2, 0)
        * - 14
          - (2, 1, 0)


Ant the columns represent 18 symmetry elements. The value of each element in the matrix indicates the presence (1) or absence (0) of a symmetry operation. There exist a total of 48 combinational symmetries, 

.. list-table:: 
    :widths: 10 20 10
    :header-rows: 1

    * - Index
      - Symmetry elements  
      - Symbol
    * - 0
      - 1
      - 1
    * - 1  
      - 1, -1
      - ̄1
    * - 2
      - 1, 2
      - 2
    * - 3
      - 1, 2₁
      - 2₁
    * - 4
      - 1, m
      - m
    * - 5
      - 1, a
      - a
    * - 6
      - 1, b
      - b
    * - 7
      - 1, c
      - c
    * - 8
      - 1, n
      - n
    * - 9
      - 1, d
      - d
    * - 10
      - 1, 3
      - 3
    * - 11
      - 1, 3₁
      - 3₁
    * - 12
      - 1, 3₂
      - 3₂
    * - 13
      - 1, -1, 2, m
      - 2/m
    * - 14
      - 1, -1, 2, a
      - 2/a
    * - 15
      - 1, -1, 2, b
      - 2/b
    * - 16
      - 1, -1, 2, c
      - 2/c
    * - 17
      - 1, -1, 2, n
      - 2/n
    * - 18
      - 1, -1, 2, d
      - 2/d
    * - 19
      - 1, -1, 2₁, m
      - 2₁/m
    * - 20
      - 1, -1, 2₁, a
      - 2₁/a
    * - 21
      - 1, -1, 2₁, b
      - 2₁/b
    * - 22
      - 1, -1, 2₁, c
      - 2₁/c
    * - 23
      - 1, -1, 2₁, n
      - 2₁/n
    * - 24
      - 1, -1, 2₁, d
      - 2₁/d
    * - 25
      - 1, 2, 4
      - 4
    * - 26
      - 1, 2₁, 4₁
      - 4₁
    * - 27
      - 1, 2, 4₂
      - 4₂
    * - 28
      - 1, 2₁, 4₃
      - 4₃
    * - 29
      - 1, 2, -4
      - -4
    * - 30
      - 1, -1, 3
      - -3
    * - 31
      - 1, 2, 3
      - 6
    * - 32
      - 1, 2₁, 3₁
      - 6₁
    * - 33
      - 1, 2₁, 3₂
      - 6₅
    * - 34
      - 1, 2, 3₂
      - 6₂
    * - 35
      - 1, 2, 3₁
      - 6₄
    * - 36
      - 1, 2₁, 3
      - 6₃
    * - 37
      - 1, m, 3
      - -6
    * - 38
      - 1, -1, 2, m, 4, -4
      - 4/m
    * - 39
      - 1, -1, 2, n, 4, -4
      - 4/n
    * - 40
      - 1, -1, 2₁, a, 4₁, -4
      - 4₁/a
    * - 41
      - 1, -1, 2₁, b, 4₁, -4
      - 4₁/b
    * - 42
      - 1, -1, 2₁, c, 4₁, -4
      - 4₁/c
    * - 43
      - 1, -1, 2₁, d, 4₁, -4
      - 4₁/d
    * - 44
      - 1, -1, 2, m, 4₂, -4
      - 4₂/m
    * - 45
      - 1, -1, 2, m, 4₂, -4
      - 4₂/n
    * - 46
      - 1, -1, 2, m, 3
      - 6/m
    * - 47
      - 1, -1, 2₁, m, 3
      - 6₃/m


In PyXtal, this representation can be easily obtained via the ``get_spg_representation()`` method. The first element of the output is the lattice index, and the second element is a 15x48 matrix representing the symmetry elements.

.. code-block:: Python

    from pyxtal.symmetry import Group
    spg = Group(227)
    id, matrix = spg.get_spg_representation() 
    print(id)
    print(matrix)

    >>> 13 # lattice id
    >>> # one-hot encoding of 15*48 matrix to represent the space group Fd-3m
    [[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]])
 


Wyckoff Site Symmetry
---------------------
For each space group, the Wyckoff positions are defined by the symmetry of the site. The Wyckoff positions are labeled with a letter and a number, where the letter indicates the type of site and the number indicates the multiplicity of that site. Below, we show the Wyckoff site symmetry for the space group 227 (``Fd-3m``) as an example. 

.. code-block:: python

    from pyxtal.symmetry import Group
    spg = Group(227)
    print(spg)
    wp = spg[-1]   # Get the last Wyckoff position 8a
    ss.to_beautiful_matrix_representation() # List symmetry elements

>>> -- Spacegroup --# 227 (Fd-3m)--
192i  site symm: 1
96h	  site symm: ..2
96g	  site symm: ..m
48f	  site symm: 2.mm
32e	  site symm: .3m
16d	  site symm: .-3m
16c	  site symm: .-3m
8b	  site symm: -43m
8a	  site symm: -43m
  
>>> Order Axis     1    -1   2    m    3    4    -4   -3   6    -6   
  0 ( 1  0  0):    1    0    1    0    0    0    1    0    0    0     -4
  0 ( 0  1  0):    1    0    1    0    0    0    1    0    0    0     -4
  0 ( 0  0  1):    1    0    1    0    0    0    1    0    0    0     -4
  1 ( 1  1  1):    1    0    0    0    1    0    0    0    0    0      3
  1 ( 1 -1 -1):    1    0    0    0    1    0    0    0    0    0      3
  1 (-1  1 -1):    1    0    0    0    1    0    0    0    0    0      3
  1 (-1 -1  1):    1    0    0    0    1    0    0    0    0    0      3
  2 ( 1 -1  0):    1    0    0    1    0    0    0    0    0    0      m
  2 ( 1  1  0):    1    0    0    1    0    0    0    0    0    0      m
  2 ( 0  1 -1):    1    0    0    1    0    0    0    0    0    0      m
  2 ( 0  1  1):    1    0    0    1    0    0    0    0    0    0      m
  2 (-1  0  1):    1    0    0    1    0    0    0    0    0    0      m
  2 ( 1  0  1):    1    0    0    1    0    0    0    0    0    0      m

In space group 227, the Wyckoff position ``8a`` indicates that there are 8 equivalent sites in the unit cell, with a site symmetry of ``-43m``. Unlike the Hermann-Mauguin notation, the site symmetry does not count the translation symmetry. Hence, it does not include the screw axis (e.g., ``2₁, 3₁, 4₁, 6₁``) or glide plane symmetry (``a, b, c, n, d``). There are 7 fundamental point group symmetries (``1, -1, 2, m, 3, 4, 6, -6``) and 5 additional compound group symmetries (``-3, 6, 2/m, 4/m, 6/m``). For ``8a`` in space group 227, its site symmetry ``-43m`` includes

1. 4-fold rotation axis (``-4``) @ [100] family directions,
2. 3-fold rotation axis (``3``) @ [111] family directions,
3. 2-fold rotation axis (``m``) @ [110] family directions.

Site Symmetry's Digital Representation
---------------------------------------------

For the application of deep learning, the Wyckoff site symmetry can be represented as a 15x7 matrix, where the rows and columns represent the symmetry elements. The value of each element in the matrix indicates the presence or absence of a symmetry operation. For example, a value of 1 indicates that the symmetry operation is present, while a value of 0 indicates that it is absent. Given that there exist a total of 13 site symmetries (``1, -1, 2, m, 3, 4, 6, -6, -3, 6, 2/m, 4/m, 6/m``), it can be further converted to an one-hot encoding format of (15x13) matrix via PyXtal as follows:

.. code-block:: python

    from pyxtal.symmetry import Group
    spg = Group(227)
    rep = wp.get_site_symmetry_object().to_one_hot()

>>> # one-hot encoding of the 8a site symmetry of space group 227
[[1 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 0]
 [1 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 0 0 0 0 0 0 0 0 0 0 0 0]]


Complete list of Wyckoff Site Symmetry Table
--------------------------------------------

Using PyXtal, you can easily access the Wyckoff site symmetry for all 230 space groups as follows:

.. code-block:: python

    from pyxtal.symmetry import Group
    for g in range(1, 231):
        spg = Group(g)
        for wp in spg:
            wp.get_site_symmetry()
            print(spg.number, spg.symbol, wp.get_label(), wp.site_symm)

The following table lists the space group number, symbol, Wyckoff label, and site symmetry for all 230 space groups.

.. list-table::
   :header-rows: 1
   :widths: 10 20 10 20

   * - Space Group Number
     - Space Group Symbol
     - Wyckoff Label
     - Site Symmetry
   * - 1
     - P1
     - 1a
     - 1
   * - 2
     - P-1
     - 2i
     - 1
   * - 2
     - P-1
     - 1h
     - -1
   * - 2
     - P-1
     - 1g
     - -1
   * - 2
     - P-1
     - 1f
     - -1
   * - 2
     - P-1
     - 1e
     - -1
   * - 2
     - P-1
     - 1d
     - -1
   * - 2
     - P-1
     - 1c
     - -1
   * - 2
     - P-1
     - 1b
     - -1
   * - 2
     - P-1
     - 1a
     - -1
   * - 3
     - P2
     - 2e
     - 1
   * - 3
     - P2
     - 1d
     - 2
   * - 3
     - P2
     - 1c
     - 2
   * - 3
     - P2
     - 1b
     - 2
   * - 3
     - P2
     - 1a
     - 2
   * - 4
     - P21
     - 2a
     - 1
   * - 5
     - C2
     - 4c
     - 1
   * - 5
     - C2
     - 2b
     - 2
   * - 5
     - C2
     - 2a
     - 2
   * - 6
     - Pm
     - 2c
     - 1
   * - 6
     - Pm
     - 1b
     - m
   * - 6
     - Pm
     - 1a
     - m
   * - 7
     - Pc
     - 2a
     - 1
   * - 8
     - Cm
     - 4b
     - 1
   * - 8
     - Cm
     - 2a
     - m
   * - 9
     - Cc
     - 4a
     - 1
   * - 10
     - P2/m
     - 4o
     - 1
   * - 10
     - P2/m
     - 2n
     - m
   * - 10
     - P2/m
     - 2m
     - m
   * - 10
     - P2/m
     - 2l
     - 2
   * - 10
     - P2/m
     - 2k
     - 2
   * - 10
     - P2/m
     - 2j
     - 2
   * - 10
     - P2/m
     - 2i
     - 2
   * - 10
     - P2/m
     - 1h
     - 2/m
   * - 10
     - P2/m
     - 1g
     - 2/m
   * - 10
     - P2/m
     - 1f
     - 2/m
   * - 10
     - P2/m
     - 1e
     - 2/m
   * - 10
     - P2/m
     - 1d
     - 2/m
   * - 10
     - P2/m
     - 1c
     - 2/m
   * - 10
     - P2/m
     - 1b
     - 2/m
   * - 10
     - P2/m
     - 1a
     - 2/m
   * - 11
     - P21/m
     - 4f
     - 1
   * - 11
     - P21/m
     - 2e
     - m
   * - 11
     - P21/m
     - 2d
     - -1
   * - 11
     - P21/m
     - 2c
     - -1
   * - 11
     - P21/m
     - 2b
     - -1
   * - 11
     - P21/m
     - 2a
     - -1
   * - 12
     - C2/m
     - 8j
     - 1
   * - 12
     - C2/m
     - 4i
     - m
   * - 12
     - C2/m
     - 4h
     - 2
   * - 12
     - C2/m
     - 4g
     - 2
   * - 12
     - C2/m
     - 4f
     - -1
   * - 12
     - C2/m
     - 4e
     - -1
   * - 12
     - C2/m
     - 2d
     - 2/m
   * - 12
     - C2/m
     - 2c
     - 2/m
   * - 12
     - C2/m
     - 2b
     - 2/m
   * - 12
     - C2/m
     - 2a
     - 2/m
   * - 13
     - P2/c
     - 4g
     - 1
   * - 13
     - P2/c
     - 2f
     - 2
   * - 13
     - P2/c
     - 2e
     - 2
   * - 13
     - P2/c
     - 2d
     - -1
   * - 13
     - P2/c
     - 2c
     - -1
   * - 13
     - P2/c
     - 2b
     - -1
   * - 13
     - P2/c
     - 2a
     - -1
   * - 14
     - P21/c
     - 4e
     - 1
   * - 14
     - P21/c
     - 2d
     - -1
   * - 14
     - P21/c
     - 2c
     - -1
   * - 14
     - P21/c
     - 2b
     - -1
   * - 14
     - P21/c
     - 2a
     - -1
   * - 15
     - C2/c
     - 8f
     - 1
   * - 15
     - C2/c
     - 4e
     - 2
   * - 15
     - C2/c
     - 4d
     - -1
   * - 15
     - C2/c
     - 4c
     - -1
   * - 15
     - C2/c
     - 4b
     - -1
   * - 15
     - C2/c
     - 4a
     - -1
   * - 16
     - P222
     - 4u
     - 1
   * - 16
     - P222
     - 2t
     - ..2
   * - 16
     - P222
     - 2s
     - ..2
   * - 16
     - P222
     - 2r
     - ..2
   * - 16
     - P222
     - 2q
     - ..2
   * - 16
     - P222
     - 2p
     - .2.
   * - 16
     - P222
     - 2o
     - .2.
   * - 16
     - P222
     - 2n
     - .2.
   * - 16
     - P222
     - 2m
     - .2.
   * - 16
     - P222
     - 2l
     - 2..
   * - 16
     - P222
     - 2k
     - 2..
   * - 16
     - P222
     - 2j
     - 2..
   * - 16
     - P222
     - 2i
     - 2..
   * - 16
     - P222
     - 1h
     - 222
   * - 16
     - P222
     - 1g
     - 222
   * - 16
     - P222
     - 1f
     - 222
   * - 16
     - P222
     - 1e
     - 222
   * - 16
     - P222
     - 1d
     - 222
   * - 16
     - P222
     - 1c
     - 222
   * - 16
     - P222
     - 1b
     - 222
   * - 16
     - P222
     - 1a
     - 222
   * - 17
     - P2221
     - 4e
     - 1
   * - 17
     - P2221
     - 2d
     - .2.
   * - 17
     - P2221
     - 2c
     - .2.
   * - 17
     - P2221
     - 2b
     - 2..
   * - 17
     - P2221
     - 2a
     - 2..
   * - 18
     - P21212
     - 4c
     - 1
   * - 18
     - P21212
     - 2b
     - ..2
   * - 18
     - P21212
     - 2a
     - ..2
   * - 19
     - P212121
     - 4a
     - 1
   * - 20
     - C2221
     - 8c
     - 1
   * - 20
     - C2221
     - 4b
     - .2.
   * - 20
     - C2221
     - 4a
     - 2..
   * - 21
     - C222
     - 8l
     - 1
   * - 21
     - C222
     - 4k
     - ..2
   * - 21
     - C222
     - 4j
     - ..2
   * - 21
     - C222
     - 4i
     - ..2
   * - 21
     - C222
     - 4h
     - .2.
   * - 21
     - C222
     - 4g
     - .2.
   * - 21
     - C222
     - 4f
     - 2..
   * - 21
     - C222
     - 4e
     - 2..
   * - 21
     - C222
     - 2d
     - 222
   * - 21
     - C222
     - 2c
     - 222
   * - 21
     - C222
     - 2b
     - 222
   * - 21
     - C222
     - 2a
     - 222
   * - 22
     - F222
     - 16k
     - 1
   * - 22
     - F222
     - 8j
     - 2..
   * - 22
     - F222
     - 8i
     - .2.
   * - 22
     - F222
     - 8h
     - ..2
   * - 22
     - F222
     - 8g
     - ..2
   * - 22
     - F222
     - 8f
     - .2.
   * - 22
     - F222
     - 8e
     - 2..
   * - 22
     - F222
     - 4d
     - 222
   * - 22
     - F222
     - 4c
     - 222
   * - 22
     - F222
     - 4b
     - 222
   * - 22
     - F222
     - 4a
     - 222
   * - 23
     - I222
     - 8k
     - 1
   * - 23
     - I222
     - 4j
     - ..2
   * - 23
     - I222
     - 4i
     - ..2
   * - 23
     - I222
     - 4h
     - .2.
   * - 23
     - I222
     - 4g
     - .2.
   * - 23
     - I222
     - 4f
     - 2..
   * - 23
     - I222
     - 4e
     - 2..
   * - 23
     - I222
     - 2d
     - 222
   * - 23
     - I222
     - 2c
     - 222
   * - 23
     - I222
     - 2b
     - 222
   * - 23
     - I222
     - 2a
     - 222
   * - 24
     - I212121
     - 8d
     - 1
   * - 24
     - I212121
     - 4c
     - ..2
   * - 24
     - I212121
     - 4b
     - .2.
   * - 24
     - I212121
     - 4a
     - 2..
   * - 25
     - Pmm2
     - 4i
     - 1
   * - 25
     - Pmm2
     - 2h
     - m..
   * - 25
     - Pmm2
     - 2g
     - m..
   * - 25
     - Pmm2
     - 2f
     - .m.
   * - 25
     - Pmm2
     - 2e
     - .m.
   * - 25
     - Pmm2
     - 1d
     - mm2
   * - 25
     - Pmm2
     - 1c
     - mm2
   * - 25
     - Pmm2
     - 1b
     - mm2
   * - 25
     - Pmm2
     - 1a
     - mm2
   * - 26
     - Pmc21
     - 4c
     - 1
   * - 26
     - Pmc21
     - 2b
     - m..
   * - 26
     - Pmc21
     - 2a
     - m..
   * - 27
     - Pcc2
     - 4e
     - 1
   * - 27
     - Pcc2
     - 2d
     - ..2
   * - 27
     - Pcc2
     - 2c
     - ..2
   * - 27
     - Pcc2
     - 2b
     - ..2
   * - 27
     - Pcc2
     - 2a
     - ..2
   * - 28
     - Pma2
     - 4d
     - 1
   * - 28
     - Pma2
     - 2c
     - m..
   * - 28
     - Pma2
     - 2b
     - ..2
   * - 28
     - Pma2
     - 2a
     - ..2
   * - 29
     - Pca21
     - 4a
     - 1
   * - 30
     - Pnc2
     - 4c
     - 1
   * - 30
     - Pnc2
     - 2b
     - ..2
   * - 30
     - Pnc2
     - 2a
     - ..2
   * - 31
     - Pmn21
     - 4b
     - 1
   * - 31
     - Pmn21
     - 2a
     - m..
   * - 32
     - Pba2
     - 4c
     - 1
   * - 32
     - Pba2
     - 2b
     - ..2
   * - 32
     - Pba2
     - 2a
     - ..2
   * - 33
     - Pna21
     - 4a
     - 1
   * - 34
     - Pnn2
     - 4c
     - 1
   * - 34
     - Pnn2
     - 2b
     - ..2
   * - 34
     - Pnn2
     - 2a
     - ..2
   * - 35
     - Cmm2
     - 8f
     - 1
   * - 35
     - Cmm2
     - 4e
     - m..
   * - 35
     - Cmm2
     - 4d
     - .m.
   * - 35
     - Cmm2
     - 4c
     - ..2
   * - 35
     - Cmm2
     - 2b
     - mm2
   * - 35
     - Cmm2
     - 2a
     - mm2
   * - 36
     - Cmc21
     - 8b
     - 1
   * - 36
     - Cmc21
     - 4a
     - m..
   * - 37
     - Ccc2
     - 8d
     - 1
   * - 37
     - Ccc2
     - 4c
     - ..2
   * - 37
     - Ccc2
     - 4b
     - ..2
   * - 37
     - Ccc2
     - 4a
     - ..2
   * - 38
     - Amm2
     - 8f
     - 1
   * - 38
     - Amm2
     - 4e
     - m..
   * - 38
     - Amm2
     - 4d
     - m..
   * - 38
     - Amm2
     - 4c
     - .m.
   * - 38
     - Amm2
     - 2b
     - mm2
   * - 38
     - Amm2
     - 2a
     - mm2
   * - 39
     - Aem2
     - 8d
     - 1
   * - 39
     - Aem2
     - 4c
     - .m.
   * - 39
     - Aem2
     - 4b
     - ..2
   * - 39
     - Aem2
     - 4a
     - ..2
   * - 40
     - Ama2
     - 8c
     - 1
   * - 40
     - Ama2
     - 4b
     - m..
   * - 40
     - Ama2
     - 4a
     - ..2
   * - 41
     - Aea2
     - 8b
     - 1
   * - 41
     - Aea2
     - 4a
     - ..2
   * - 42
     - Fmm2
     - 16e
     - 1
   * - 42
     - Fmm2
     - 8d
     - .m.
   * - 42
     - Fmm2
     - 8c
     - m..
   * - 42
     - Fmm2
     - 8b
     - ..2
   * - 42
     - Fmm2
     - 4a
     - mm2
   * - 43
     - Fdd2
     - 16b
     - 1
   * - 43
     - Fdd2
     - 8a
     - ..2
   * - 44
     - Imm2
     - 8e
     - 1
   * - 44
     - Imm2
     - 4d
     - m..
   * - 44
     - Imm2
     - 4c
     - .m.
   * - 44
     - Imm2
     - 2b
     - mm2
   * - 44
     - Imm2
     - 2a
     - mm2
   * - 45
     - Iba2
     - 8c
     - 1
   * - 45
     - Iba2
     - 4b
     - ..2
   * - 45
     - Iba2
     - 4a
     - ..2
   * - 46
     - Ima2
     - 8c
     - 1
   * - 46
     - Ima2
     - 4b
     - m..
   * - 46
     - Ima2
     - 4a
     - ..2
   * - 47
     - Pmmm
     - 8A
     - 1
   * - 47
     - Pmmm
     - 4z
     - ..m
   * - 47
     - Pmmm
     - 4y
     - ..m
   * - 47
     - Pmmm
     - 4x
     - .m.
   * - 47
     - Pmmm
     - 4w
     - .m.
   * - 47
     - Pmmm
     - 4v
     - m..
   * - 47
     - Pmmm
     - 4u
     - m..
   * - 47
     - Pmmm
     - 2t
     - mm2
   * - 47
     - Pmmm
     - 2s
     - mm2
   * - 47
     - Pmmm
     - 2r
     - mm2
   * - 47
     - Pmmm
     - 2q
     - mm2
   * - 47
     - Pmmm
     - 2p
     - m2m
   * - 47
     - Pmmm
     - 2o
     - m2m
   * - 47
     - Pmmm
     - 2n
     - m2m
   * - 47
     - Pmmm
     - 2m
     - m2m
   * - 47
     - Pmmm
     - 2l
     - 2mm
   * - 47
     - Pmmm
     - 2k
     - 2mm
   * - 47
     - Pmmm
     - 2j
     - 2mm
   * - 47
     - Pmmm
     - 2i
     - 2mm
   * - 47
     - Pmmm
     - 1h
     - mmm
   * - 47
     - Pmmm
     - 1g
     - mmm
   * - 47
     - Pmmm
     - 1f
     - mmm
   * - 47
     - Pmmm
     - 1e
     - mmm
   * - 47
     - Pmmm
     - 1d
     - mmm
   * - 47
     - Pmmm
     - 1c
     - mmm
   * - 47
     - Pmmm
     - 1b
     - mmm
   * - 47
     - Pmmm
     - 1a
     - mmm
   * - 48
     - Pnnn
     - 8m
     - 1
   * - 48
     - Pnnn
     - 4l
     - ..2
   * - 48
     - Pnnn
     - 4k
     - ..2
   * - 48
     - Pnnn
     - 4j
     - .2.
   * - 48
     - Pnnn
     - 4i
     - .2.
   * - 48
     - Pnnn
     - 4h
     - 2..
   * - 48
     - Pnnn
     - 4g
     - 2..
   * - 48
     - Pnnn
     - 4f
     - -1
   * - 48
     - Pnnn
     - 4e
     - -1
   * - 48
     - Pnnn
     - 2d
     - 222
   * - 48
     - Pnnn
     - 2c
     - 222
   * - 48
     - Pnnn
     - 2b
     - 222
   * - 48
     - Pnnn
     - 2a
     - 222
   * - 49
     - Pccm
     - 8r
     - 1
   * - 49
     - Pccm
     - 4q
     - ..m
   * - 49
     - Pccm
     - 4p
     - ..2
   * - 49
     - Pccm
     - 4o
     - ..2
   * - 49
     - Pccm
     - 4n
     - ..2
   * - 49
     - Pccm
     - 4m
     - ..2
   * - 49
     - Pccm
     - 4l
     - .2.
   * - 49
     - Pccm
     - 4k
     - .2.
   * - 49
     - Pccm
     - 4j
     - 2..
   * - 49
     - Pccm
     - 4i
     - 2..
   * - 49
     - Pccm
     - 2h
     - 222
   * - 49
     - Pccm
     - 2g
     - 222
   * - 49
     - Pccm
     - 2f
     - 222
   * - 49
     - Pccm
     - 2e
     - 222
   * - 49
     - Pccm
     - 2d
     - ..2/m
   * - 49
     - Pccm
     - 2c
     - ..2/m
   * - 49
     - Pccm
     - 2b
     - ..2/m
   * - 49
     - Pccm
     - 2a
     - ..2/m
   * - 50
     - Pban
     - 8m
     - 1
   * - 50
     - Pban
     - 4l
     - ..2
   * - 50
     - Pban
     - 4k
     - ..2
   * - 50
     - Pban
     - 4j
     - .2.
   * - 50
     - Pban
     - 4i
     - .2.
   * - 50
     - Pban
     - 4h
     - 2..
   * - 50
     - Pban
     - 4g
     - 2..
   * - 50
     - Pban
     - 4f
     - -1
   * - 50
     - Pban
     - 4e
     - -1
   * - 50
     - Pban
     - 2d
     - 222
   * - 50
     - Pban
     - 2c
     - 222
   * - 50
     - Pban
     - 2b
     - 222
   * - 50
     - Pban
     - 2a
     - 222
   * - 51
     - Pmma
     - 8l
     - 1
   * - 51
     - Pmma
     - 4k
     - m..
   * - 51
     - Pmma
     - 4j
     - .m.
   * - 51
     - Pmma
     - 4i
     - .m.
   * - 51
     - Pmma
     - 4h
     - .2.
   * - 51
     - Pmma
     - 4g
     - .2.
   * - 51
     - Pmma
     - 2f
     - mm2
   * - 51
     - Pmma
     - 2e
     - mm2
   * - 51
     - Pmma
     - 2d
     - .2/m.
   * - 51
     - Pmma
     - 2c
     - .2/m.
   * - 51
     - Pmma
     - 2b
     - .2/m.
   * - 51
     - Pmma
     - 2a
     - .2/m.
   * - 52
     - Pnna
     - 8e
     - 1
   * - 52
     - Pnna
     - 4d
     - 2..
   * - 52
     - Pnna
     - 4c
     - ..2
   * - 52
     - Pnna
     - 4b
     - -1
   * - 52
     - Pnna
     - 4a
     - -1
   * - 53
     - Pmna
     - 8i
     - 1
   * - 53
     - Pmna
     - 4h
     - m..
   * - 53
     - Pmna
     - 4g
     - .2.
   * - 53
     - Pmna
     - 4f
     - 2..
   * - 53
     - Pmna
     - 4e
     - 2..
   * - 53
     - Pmna
     - 2d
     - 2/m..
   * - 53
     - Pmna
     - 2c
     - 2/m..
   * - 53
     - Pmna
     - 2b
     - 2/m..
   * - 53
     - Pmna
     - 2a
     - 2/m..
   * - 54
     - Pcca
     - 8f
     - 1
   * - 54
     - Pcca
     - 4e
     - ..2
   * - 54
     - Pcca
     - 4d
     - ..2
   * - 54
     - Pcca
     - 4c
     - .2.
   * - 54
     - Pcca
     - 4b
     - -1
   * - 54
     - Pcca
     - 4a
     - -1
   * - 55
     - Pbam
     - 8i
     - 1
   * - 55
     - Pbam
     - 4h
     - ..m
   * - 55
     - Pbam
     - 4g
     - ..m
   * - 55
     - Pbam
     - 4f
     - ..2
   * - 55
     - Pbam
     - 4e
     - ..2
   * - 55
     - Pbam
     - 2d
     - ..2/m
   * - 55
     - Pbam
     - 2c
     - ..2/m
   * - 55
     - Pbam
     - 2b
     - ..2/m
   * - 55
     - Pbam
     - 2a
     - ..2/m
   * - 56
     - Pccn
     - 8e
     - 1
   * - 56
     - Pccn
     - 4d
     - ..2
   * - 56
     - Pccn
     - 4c
     - ..2
   * - 56
     - Pccn
     - 4b
     - -1
   * - 56
     - Pccn
     - 4a
     - -1
   * - 57
     - Pbcm
     - 8e
     - 1
   * - 57
     - Pbcm
     - 4d
     - ..m
   * - 57
     - Pbcm
     - 4c
     - 2..
   * - 57
     - Pbcm
     - 4b
     - -1
   * - 57
     - Pbcm
     - 4a
     - -1
   * - 58
     - Pnnm
     - 8h
     - 1
   * - 58
     - Pnnm
     - 4g
     - ..m
   * - 58
     - Pnnm
     - 4f
     - ..2
   * - 58
     - Pnnm
     - 4e
     - ..2
   * - 58
     - Pnnm
     - 2d
     - ..2/m
   * - 58
     - Pnnm
     - 2c
     - ..2/m
   * - 58
     - Pnnm
     - 2b
     - ..2/m
   * - 58
     - Pnnm
     - 2a
     - ..2/m
   * - 59
     - Pmmn
     - 8g
     - 1
   * - 59
     - Pmmn
     - 4f
     - .m.
   * - 59
     - Pmmn
     - 4e
     - m..
   * - 59
     - Pmmn
     - 4d
     - -1
   * - 59
     - Pmmn
     - 4c
     - -1
   * - 59
     - Pmmn
     - 2b
     - mm2
   * - 59
     - Pmmn
     - 2a
     - mm2
   * - 60
     - Pbcn
     - 8d
     - 1
   * - 60
     - Pbcn
     - 4c
     - .2.
   * - 60
     - Pbcn
     - 4b
     - -1
   * - 60
     - Pbcn
     - 4a
     - -1
   * - 61
     - Pbca
     - 8c
     - 1
   * - 61
     - Pbca
     - 4b
     - -1
   * - 61
     - Pbca
     - 4a
     - -1
   * - 62
     - Pnma
     - 8d
     - 1
   * - 62
     - Pnma
     - 4c
     - .m.
   * - 62
     - Pnma
     - 4b
     - -1
   * - 62
     - Pnma
     - 4a
     - -1
   * - 63
     - Cmcm
     - 16h
     - 1
   * - 63
     - Cmcm
     - 8g
     - ..m
   * - 63
     - Cmcm
     - 8f
     - m..
   * - 63
     - Cmcm
     - 8e
     - 2..
   * - 63
     - Cmcm
     - 8d
     - -1
   * - 63
     - Cmcm
     - 4c
     - m2m
   * - 63
     - Cmcm
     - 4b
     - 2/m..
   * - 63
     - Cmcm
     - 4a
     - 2/m..
   * - 64
     - Cmce
     - 16g
     - 1
   * - 64
     - Cmce
     - 8f
     - m..
   * - 64
     - Cmce
     - 8e
     - .2.
   * - 64
     - Cmce
     - 8d
     - 2..
   * - 64
     - Cmce
     - 8c
     - -1
   * - 64
     - Cmce
     - 4b
     - 2/m..
   * - 64
     - Cmce
     - 4a
     - 2/m..
   * - 65
     - Cmmm
     - 16r
     - 1
   * - 65
     - Cmmm
     - 8q
     - ..m
   * - 65
     - Cmmm
     - 8p
     - ..m
   * - 65
     - Cmmm
     - 8o
     - .m.
   * - 65
     - Cmmm
     - 8n
     - m..
   * - 65
     - Cmmm
     - 8m
     - ..2
   * - 65
     - Cmmm
     - 4l
     - mm2
   * - 65
     - Cmmm
     - 4k
     - mm2
   * - 65
     - Cmmm
     - 4j
     - m2m
   * - 65
     - Cmmm
     - 4i
     - m2m
   * - 65
     - Cmmm
     - 4h
     - 2mm
   * - 65
     - Cmmm
     - 4g
     - 2mm
   * - 65
     - Cmmm
     - 4f
     - ..2/m
   * - 65
     - Cmmm
     - 4e
     - ..2/m
   * - 65
     - Cmmm
     - 2d
     - mmm
   * - 65
     - Cmmm
     - 2c
     - mmm
   * - 65
     - Cmmm
     - 2b
     - mmm
   * - 65
     - Cmmm
     - 2a
     - mmm
   * - 66
     - Cccm
     - 16m
     - 1
   * - 66
     - Cccm
     - 8l
     - ..m
   * - 66
     - Cccm
     - 8k
     - ..2
   * - 66
     - Cccm
     - 8j
     - ..2
   * - 66
     - Cccm
     - 8i
     - ..2
   * - 66
     - Cccm
     - 8h
     - .2.
   * - 66
     - Cccm
     - 8g
     - 2..
   * - 66
     - Cccm
     - 4f
     - ..2/m
   * - 66
     - Cccm
     - 4e
     - ..2/m
   * - 66
     - Cccm
     - 4d
     - ..2/m
   * - 66
     - Cccm
     - 4c
     - ..2/m
   * - 66
     - Cccm
     - 4b
     - 222
   * - 66
     - Cccm
     - 4a
     - 222
   * - 67
     - Cmme
     - 16o
     - 1
   * - 67
     - Cmme
     - 8n
     - .m.
   * - 67
     - Cmme
     - 8m
     - m..
   * - 67
     - Cmme
     - 8l
     - ..2
   * - 67
     - Cmme
     - 8k
     - .2.
   * - 67
     - Cmme
     - 8j
     - .2.
   * - 67
     - Cmme
     - 8i
     - 2..
   * - 67
     - Cmme
     - 8h
     - 2..
   * - 67
     - Cmme
     - 4g
     - mm2
   * - 67
     - Cmme
     - 4f
     - .2/m.
   * - 67
     - Cmme
     - 4e
     - .2/m.
   * - 67
     - Cmme
     - 4d
     - 2/m..
   * - 67
     - Cmme
     - 4c
     - 2/m..
   * - 67
     - Cmme
     - 4b
     - 222
   * - 67
     - Cmme
     - 4a
     - 222
   * - 68
     - Ccce
     - 16i
     - 1
   * - 68
     - Ccce
     - 8h
     - ..2
   * - 68
     - Ccce
     - 8g
     - ..2
   * - 68
     - Ccce
     - 8f
     - .2.
   * - 68
     - Ccce
     - 8e
     - 2..
   * - 68
     - Ccce
     - 8d
     - -1
   * - 68
     - Ccce
     - 8c
     - -1
   * - 68
     - Ccce
     - 4b
     - 222
   * - 68
     - Ccce
     - 4a
     - 222
   * - 69
     - Fmmm
     - 32p
     - 1
   * - 69
     - Fmmm
     - 16o
     - ..m
   * - 69
     - Fmmm
     - 16n
     - .m.
   * - 69
     - Fmmm
     - 16m
     - m..
   * - 69
     - Fmmm
     - 16l
     - 2..
   * - 69
     - Fmmm
     - 16k
     - .2.
   * - 69
     - Fmmm
     - 16j
     - ..2
   * - 69
     - Fmmm
     - 8i
     - mm2
   * - 69
     - Fmmm
     - 8h
     - m2m
   * - 69
     - Fmmm
     - 8g
     - 2mm
   * - 69
     - Fmmm
     - 8f
     - 222
   * - 69
     - Fmmm
     - 8e
     - ..2/m
   * - 69
     - Fmmm
     - 8d
     - .2/m.
   * - 69
     - Fmmm
     - 8c
     - 2/m..
   * - 69
     - Fmmm
     - 4b
     - mmm
   * - 69
     - Fmmm
     - 4a
     - mmm
   * - 70
     - Fddd
     - 32h
     - 1
   * - 70
     - Fddd
     - 16g
     - ..2
   * - 70
     - Fddd
     - 16f
     - .2.
   * - 70
     - Fddd
     - 16e
     - 2..
   * - 70
     - Fddd
     - 16d
     - -1
   * - 70
     - Fddd
     - 16c
     - -1
   * - 70
     - Fddd
     - 8b
     - 222
   * - 70
     - Fddd
     - 8a
     - 222
   * - 71
     - Immm
     - 16o
     - 1
   * - 71
     - Immm
     - 8n
     - ..m
   * - 71
     - Immm
     - 8m
     - .m.
   * - 71
     - Immm
     - 8l
     - m..
   * - 71
     - Immm
     - 8k
     - -1
   * - 71
     - Immm
     - 4j
     - mm2
   * - 71
     - Immm
     - 4i
     - mm2
   * - 71
     - Immm
     - 4h
     - m2m
   * - 71
     - Immm
     - 4g
     - m2m
   * - 71
     - Immm
     - 4f
     - 2mm
   * - 71
     - Immm
     - 4e
     - 2mm
   * - 71
     - Immm
     - 2d
     - mmm
   * - 71
     - Immm
     - 2c
     - mmm
   * - 71
     - Immm
     - 2b
     - mmm
   * - 71
     - Immm
     - 2a
     - mmm
   * - 72
     - Ibam
     - 16k
     - 1
   * - 72
     - Ibam
     - 8j
     - ..m
   * - 72
     - Ibam
     - 8i
     - ..2
   * - 72
     - Ibam
     - 8h
     - ..2
   * - 72
     - Ibam
     - 8g
     - .2.
   * - 72
     - Ibam
     - 8f
     - 2..
   * - 72
     - Ibam
     - 8e
     - -1
   * - 72
     - Ibam
     - 4d
     - ..2/m
   * - 72
     - Ibam
     - 4c
     - ..2/m
   * - 72
     - Ibam
     - 4b
     - 222
   * - 72
     - Ibam
     - 4a
     - 222
   * - 73
     - Ibca
     - 16f
     - 1
   * - 73
     - Ibca
     - 8e
     - ..2
   * - 73
     - Ibca
     - 8d
     - .2.
   * - 73
     - Ibca
     - 8c
     - 2..
   * - 73
     - Ibca
     - 8b
     - -1
   * - 73
     - Ibca
     - 8a
     - -1
   * - 74
     - Imma
     - 16j
     - 1
   * - 74
     - Imma
     - 8i
     - .m.
   * - 74
     - Imma
     - 8h
     - m..
   * - 74
     - Imma
     - 8g
     - .2.
   * - 74
     - Imma
     - 8f
     - 2..
   * - 74
     - Imma
     - 4e
     - mm2
   * - 74
     - Imma
     - 4d
     - .2/m.
   * - 74
     - Imma
     - 4c
     - .2/m.
   * - 74
     - Imma
     - 4b
     - 2/m..
   * - 74
     - Imma
     - 4a
     - 2/m..
   * - 75
     - P4
     - 4d
     - 1
   * - 75
     - P4
     - 2c
     - 2..
   * - 75
     - P4
     - 1b
     - 4..
   * - 75
     - P4
     - 1a
     - 4..
   * - 76
     - P41
     - 4a
     - 1
   * - 77
     - P42
     - 4d
     - 1
   * - 77
     - P42
     - 2c
     - 2..
   * - 77
     - P42
     - 2b
     - 2..
   * - 77
     - P42
     - 2a
     - 2..
   * - 78
     - P43
     - 4a
     - 1
   * - 79
     - I4
     - 8c
     - 1
   * - 79
     - I4
     - 4b
     - 2..
   * - 79
     - I4
     - 2a
     - 4..
   * - 80
     - I41
     - 8b
     - 1
   * - 80
     - I41
     - 4a
     - 2..
   * - 81
     - P-4
     - 4h
     - 1
   * - 81
     - P-4
     - 2g
     - 2..
   * - 81
     - P-4
     - 2f
     - 2..
   * - 81
     - P-4
     - 2e
     - 2..
   * - 81
     - P-4
     - 1d
     - -4..
   * - 81
     - P-4
     - 1c
     - -4..
   * - 81
     - P-4
     - 1b
     - -4..
   * - 81
     - P-4
     - 1a
     - -4..
   * - 82
     - I-4
     - 8g
     - 1
   * - 82
     - I-4
     - 4f
     - 2..
   * - 82
     - I-4
     - 4e
     - 2..
   * - 82
     - I-4
     - 2d
     - -4..
   * - 82
     - I-4
     - 2c
     - -4..
   * - 82
     - I-4
     - 2b
     - -4..
   * - 82
     - I-4
     - 2a
     - -4..
   * - 83
     - P4/m
     - 8l
     - 1
   * - 83
     - P4/m
     - 4k
     - m..
   * - 83
     - P4/m
     - 4j
     - m..
   * - 83
     - P4/m
     - 4i
     - 2..
   * - 83
     - P4/m
     - 2h
     - 4..
   * - 83
     - P4/m
     - 2g
     - 4..
   * - 83
     - P4/m
     - 2f
     - 2/m..
   * - 83
     - P4/m
     - 2e
     - 2/m..
   * - 83
     - P4/m
     - 1d
     - 4/m..
   * - 83
     - P4/m
     - 1c
     - 4/m..
   * - 83
     - P4/m
     - 1b
     - 4/m..
   * - 83
     - P4/m
     - 1a
     - 4/m..
   * - 84
     - P42/m
     - 8k
     - 1
   * - 84
     - P42/m
     - 4j
     - m..
   * - 84
     - P42/m
     - 4i
     - 2..
   * - 84
     - P42/m
     - 4h
     - 2..
   * - 84
     - P42/m
     - 4g
     - 2..
   * - 84
     - P42/m
     - 2f
     - -4..
   * - 84
     - P42/m
     - 2e
     - -4..
   * - 84
     - P42/m
     - 2d
     - 2/m..
   * - 84
     - P42/m
     - 2c
     - 2/m..
   * - 84
     - P42/m
     - 2b
     - 2/m..
   * - 84
     - P42/m
     - 2a
     - 2/m..
   * - 85
     - P4/n
     - 8g
     - 1
   * - 85
     - P4/n
     - 4f
     - 2..
   * - 85
     - P4/n
     - 4e
     - -1
   * - 85
     - P4/n
     - 4d
     - -1
   * - 85
     - P4/n
     - 2c
     - 4..
   * - 85
     - P4/n
     - 2b
     - -4..
   * - 85
     - P4/n
     - 2a
     - -4..
   * - 86
     - P42/n
     - 8g
     - 1
   * - 86
     - P42/n
     - 4f
     - 2..
   * - 86
     - P42/n
     - 4e
     - 2..
   * - 86
     - P42/n
     - 4d
     - -1
   * - 86
     - P42/n
     - 4c
     - -1
   * - 86
     - P42/n
     - 2b
     - -4..
   * - 86
     - P42/n
     - 2a
     - -4..
   * - 87
     - I4/m
     - 16i
     - 1
   * - 87
     - I4/m
     - 8h
     - m..
   * - 87
     - I4/m
     - 8g
     - 2..
   * - 87
     - I4/m
     - 8f
     - -1
   * - 87
     - I4/m
     - 4e
     - 4..
   * - 87
     - I4/m
     - 4d
     - -4..
   * - 87
     - I4/m
     - 4c
     - 2/m..
   * - 87
     - I4/m
     - 2b
     - 4/m..
   * - 87
     - I4/m
     - 2a
     - 4/m..
   * - 88
     - I41/a
     - 16f
     - 1
   * - 88
     - I41/a
     - 8e
     - 2..
   * - 88
     - I41/a
     - 8d
     - -1
   * - 88
     - I41/a
     - 8c
     - -1
   * - 88
     - I41/a
     - 4b
     - -4..
   * - 88
     - I41/a
     - 4a
     - -4..
   * - 89
     - P422
     - 8p
     - 1
   * - 89
     - P422
     - 4o
     - .2.
   * - 89
     - P422
     - 4n
     - .2.
   * - 89
     - P422
     - 4m
     - .2.
   * - 89
     - P422
     - 4l
     - .2.
   * - 89
     - P422
     - 4k
     - ..2
   * - 89
     - P422
     - 4j
     - ..2
   * - 89
     - P422
     - 4i
     - 2..
   * - 89
     - P422
     - 2h
     - 4..
   * - 89
     - P422
     - 2g
     - 4..
   * - 89
     - P422
     - 2f
     - 222.\
   * - 89
     - P422
     - 2e
     - 222.\
   * - 89
     - P422
     - 1d
     - 422
   * - 89
     - P422
     - 1c
     - 422
   * - 89
     - P422
     - 1b
     - 422
   * - 89
     - P422
     - 1a
     - 422
   * - 90
     - P4212
     - 8g
     - 1
   * - 90
     - P4212
     - 4f
     - ..2
   * - 90
     - P4212
     - 4e
     - ..2
   * - 90
     - P4212
     - 4d
     - 2..
   * - 90
     - P4212
     - 2c
     - 4..
   * - 90
     - P4212
     - 2b
     - 2.22
   * - 90
     - P4212
     - 2a
     - 2.22
   * - 91
     - P4122
     - 8d
     - 1
   * - 91
     - P4122
     - 4c
     - ..2
   * - 91
     - P4122
     - 4b
     - .2.
   * - 91
     - P4122
     - 4a
     - .2.
   * - 92
     - P41212
     - 8b
     - 1
   * - 92
     - P41212
     - 4a
     - ..2
   * - 93
     - P4222
     - 8p
     - 1
   * - 93
     - P4222
     - 4o
     - ..2
   * - 93
     - P4222
     - 4n
     - ..2
   * - 93
     - P4222
     - 4m
     - .2.
   * - 93
     - P4222
     - 4l
     - .2.
   * - 93
     - P4222
     - 4k
     - .2.
   * - 93
     - P4222
     - 4j
     - .2.
   * - 93
     - P4222
     - 4i
     - 2..
   * - 93
     - P4222
     - 4h
     - 2..
   * - 93
     - P4222
     - 4g
     - 2..
   * - 93
     - P4222
     - 2f
     - 2.22
   * - 93
     - P4222
     - 2e
     - 2.22
   * - 93
     - P4222
     - 2d
     - 222.\
   * - 93
     - P4222
     - 2c
     - 222.\
   * - 93
     - P4222
     - 2b
     - 222.\
   * - 93
     - P4222
     - 2a
     - 222.\
   * - 94
     - P42212
     - 8g
     - 1
   * - 94
     - P42212
     - 4f
     - ..2
   * - 94
     - P42212
     - 4e
     - ..2
   * - 94
     - P42212
     - 4d
     - 2..
   * - 94
     - P42212
     - 4c
     - 2..
   * - 94
     - P42212
     - 2b
     - 2.22
   * - 94
     - P42212
     - 2a
     - 2.22
   * - 95
     - P4322
     - 8d
     - 1
   * - 95
     - P4322
     - 4c
     - ..2
   * - 95
     - P4322
     - 4b
     - .2.
   * - 95
     - P4322
     - 4a
     - .2.
   * - 96
     - P43212
     - 8b
     - 1
   * - 96
     - P43212
     - 4a
     - ..2
   * - 97
     - I422
     - 16k
     - 1
   * - 97
     - I422
     - 8j
     - ..2
   * - 97
     - I422
     - 8i
     - .2.
   * - 97
     - I422
     - 8h
     - .2.
   * - 97
     - I422
     - 8g
     - ..2
   * - 97
     - I422
     - 8f
     - 2..
   * - 97
     - I422
     - 4e
     - 4..
   * - 97
     - I422
     - 4d
     - 2.22
   * - 97
     - I422
     - 4c
     - 222.\
   * - 97
     - I422
     - 2b
     - 422
   * - 97
     - I422
     - 2a
     - 422
   * - 98
     - I4122
     - 16g
     - 1
   * - 98
     - I4122
     - 8f
     - .2.
   * - 98
     - I4122
     - 8e
     - ..2
   * - 98
     - I4122
     - 8d
     - ..2
   * - 98
     - I4122
     - 8c
     - 2..
   * - 98
     - I4122
     - 4b
     - 2.22
   * - 98
     - I4122
     - 4a
     - 2.22
   * - 99
     - P4mm
     - 8g
     - 1
   * - 99
     - P4mm
     - 4f
     - .m.
   * - 99
     - P4mm
     - 4e
     - .m.
   * - 99
     - P4mm
     - 4d
     - ..m
   * - 99
     - P4mm
     - 2c
     - 2mm.
   * - 99
     - P4mm
     - 1b
     - 4mm
   * - 99
     - P4mm
     - 1a
     - 4mm
   * - 100
     - P4bm
     - 8d
     - 1
   * - 100
     - P4bm
     - 4c
     - ..m
   * - 100
     - P4bm
     - 2b
     - 2.mm
   * - 100
     - P4bm
     - 2a
     - 4..
   * - 101
     - P42cm
     - 8e
     - 1
   * - 101
     - P42cm
     - 4d
     - ..m
   * - 101
     - P42cm
     - 4c
     - 2..
   * - 101
     - P42cm
     - 2b
     - 2.mm
   * - 101
     - P42cm
     - 2a
     - 2.mm
   * - 102
     - P42nm
     - 8d
     - 1
   * - 102
     - P42nm
     - 4c
     - ..m
   * - 102
     - P42nm
     - 4b
     - 2..
   * - 102
     - P42nm
     - 2a
     - 2.mm
   * - 103
     - P4cc
     - 8d
     - 1
   * - 103
     - P4cc
     - 4c
     - 2..
   * - 103
     - P4cc
     - 2b
     - 4..
   * - 103
     - P4cc
     - 2a
     - 4..
   * - 104
     - P4nc
     - 8c
     - 1
   * - 104
     - P4nc
     - 4b
     - 2..
   * - 104
     - P4nc
     - 2a
     - 4..
   * - 105
     - P42mc
     - 8f
     - 1
   * - 105
     - P42mc
     - 4e
     - .m.
   * - 105
     - P42mc
     - 4d
     - .m.
   * - 105
     - P42mc
     - 2c
     - 2mm.
   * - 105
     - P42mc
     - 2b
     - 2mm.
   * - 105
     - P42mc
     - 2a
     - 2mm.
   * - 106
     - P42bc
     - 8c
     - 1
   * - 106
     - P42bc
     - 4b
     - 2..
   * - 106
     - P42bc
     - 4a
     - 2..
   * - 107
     - I4mm
     - 16e
     - 1
   * - 107
     - I4mm
     - 8d
     - .m.
   * - 107
     - I4mm
     - 8c
     - ..m
   * - 107
     - I4mm
     - 4b
     - 2mm.
   * - 107
     - I4mm
     - 2a
     - 4mm
   * - 108
     - I4cm
     - 16d
     - 1
   * - 108
     - I4cm
     - 8c
     - ..m
   * - 108
     - I4cm
     - 4b
     - 2.mm
   * - 108
     - I4cm
     - 4a
     - 4..
   * - 109
     - I41md
     - 16c
     - 1
   * - 109
     - I41md
     - 8b
     - .m.
   * - 109
     - I41md
     - 4a
     - 2mm.
   * - 110
     - I41cd
     - 16b
     - 1
   * - 110
     - I41cd
     - 8a
     - 2..
   * - 111
     - P-42m
     - 8o
     - 1
   * - 111
     - P-42m
     - 4n
     - ..m
   * - 111
     - P-42m
     - 4m
     - 2..
   * - 111
     - P-42m
     - 4l
     - .2.
   * - 111
     - P-42m
     - 4k
     - .2.
   * - 111
     - P-42m
     - 4j
     - .2.
   * - 111
     - P-42m
     - 4i
     - .2.
   * - 111
     - P-42m
     - 2h
     - 2.mm
   * - 111
     - P-42m
     - 2g
     - 2.mm
   * - 111
     - P-42m
     - 2f
     - 222.\
   * - 111
     - P-42m
     - 2e
     - 222.\
   * - 111
     - P-42m
     - 1d
     - -42m
   * - 111
     - P-42m
     - 1c
     - -42m
   * - 111
     - P-42m
     - 1b
     - -42m
   * - 111
     - P-42m
     - 1a
     - -42m
   * - 112
     - P-42c
     - 8n
     - 1
   * - 112
     - P-42c
     - 4m
     - 2..
   * - 112
     - P-42c
     - 4l
     - 2..
   * - 112
     - P-42c
     - 4k
     - 2..
   * - 112
     - P-42c
     - 4j
     - .2.
   * - 112
     - P-42c
     - 4i
     - .2.
   * - 112
     - P-42c
     - 4h
     - .2.
   * - 112
     - P-42c
     - 4g
     - .2.
   * - 112
     - P-42c
     - 2f
     - -4..
   * - 112
     - P-42c
     - 2e
     - -4..
   * - 112
     - P-42c
     - 2d
     - 222.\
   * - 112
     - P-42c
     - 2c
     - 222.\
   * - 112
     - P-42c
     - 2b
     - 222.\
   * - 112
     - P-42c
     - 2a
     - 222.\
   * - 113
     - P-421m
     - 8f
     - 1
   * - 113
     - P-421m
     - 4e
     - ..m
   * - 113
     - P-421m
     - 4d
     - 2..
   * - 113
     - P-421m
     - 2c
     - 2.mm
   * - 113
     - P-421m
     - 2b
     - -4..
   * - 113
     - P-421m
     - 2a
     - -4..
   * - 114
     - P-421c
     - 8e
     - 1
   * - 114
     - P-421c
     - 4d
     - 2..
   * - 114
     - P-421c
     - 4c
     - 2..
   * - 114
     - P-421c
     - 2b
     - -4..
   * - 114
     - P-421c
     - 2a
     - -4..
   * - 115
     - P-4m2
     - 8l
     - 1
   * - 115
     - P-4m2
     - 4k
     - .m.
   * - 115
     - P-4m2
     - 4j
     - .m.
   * - 115
     - P-4m2
     - 4i
     - ..2
   * - 115
     - P-4m2
     - 4h
     - ..2
   * - 115
     - P-4m2
     - 2g
     - 2mm.
   * - 115
     - P-4m2
     - 2f
     - 2mm.
   * - 115
     - P-4m2
     - 2e
     - 2mm.
   * - 115
     - P-4m2
     - 1d
     - -4m2
   * - 115
     - P-4m2
     - 1c
     - -4m2
   * - 115
     - P-4m2
     - 1b
     - -4m2
   * - 115
     - P-4m2
     - 1a
     - -4m2
   * - 116
     - P-4c2
     - 8j
     - 1
   * - 116
     - P-4c2
     - 4i
     - 2..
   * - 116
     - P-4c2
     - 4h
     - 2..
   * - 116
     - P-4c2
     - 4g
     - 2..
   * - 116
     - P-4c2
     - 4f
     - ..2
   * - 116
     - P-4c2
     - 4e
     - ..2
   * - 116
     - P-4c2
     - 2d
     - -4..
   * - 116
     - P-4c2
     - 2c
     - -4..
   * - 116
     - P-4c2
     - 2b
     - 2.22
   * - 116
     - P-4c2
     - 2a
     - 2.22
   * - 117
     - P-4b2
     - 8i
     - 1
   * - 117
     - P-4b2
     - 4h
     - ..2
   * - 117
     - P-4b2
     - 4g
     - ..2
   * - 117
     - P-4b2
     - 4f
     - 2..
   * - 117
     - P-4b2
     - 4e
     - 2..
   * - 117
     - P-4b2
     - 2d
     - 2.22
   * - 117
     - P-4b2
     - 2c
     - 2.22
   * - 117
     - P-4b2
     - 2b
     - -4..
   * - 117
     - P-4b2
     - 2a
     - -4..
   * - 118
     - P-4n2
     - 8i
     - 1
   * - 118
     - P-4n2
     - 4h
     - 2..
   * - 118
     - P-4n2
     - 4g
     - ..2
   * - 118
     - P-4n2
     - 4f
     - ..2
   * - 118
     - P-4n2
     - 4e
     - 2..
   * - 118
     - P-4n2
     - 2d
     - 2.22
   * - 118
     - P-4n2
     - 2c
     - 2.22
   * - 118
     - P-4n2
     - 2b
     - -4..
   * - 118
     - P-4n2
     - 2a
     - -4..
   * - 119
     - I-4m2
     - 16j
     - 1
   * - 119
     - I-4m2
     - 8i
     - .m.
   * - 119
     - I-4m2
     - 8h
     - ..2
   * - 119
     - I-4m2
     - 8g
     - ..2
   * - 119
     - I-4m2
     - 4f
     - 2mm.
   * - 119
     - I-4m2
     - 4e
     - 2mm.
   * - 119
     - I-4m2
     - 2d
     - -4m2
   * - 119
     - I-4m2
     - 2c
     - -4m2
   * - 119
     - I-4m2
     - 2b
     - -4m2
   * - 119
     - I-4m2
     - 2a
     - -4m2
   * - 120
     - I-4c2
     - 16i
     - 1
   * - 120
     - I-4c2
     - 8h
     - ..2
   * - 120
     - I-4c2
     - 8g
     - 2..
   * - 120
     - I-4c2
     - 8f
     - 2..
   * - 120
     - I-4c2
     - 8e
     - ..2
   * - 120
     - I-4c2
     - 4d
     - 2.22
   * - 120
     - I-4c2
     - 4c
     - -4..
   * - 120
     - I-4c2
     - 4b
     - -4..
   * - 120
     - I-4c2
     - 4a
     - 2.22
   * - 121
     - I-42m
     - 16j
     - 1
   * - 121
     - I-42m
     - 8i
     - ..m
   * - 121
     - I-42m
     - 8h
     - 2..
   * - 121
     - I-42m
     - 8g
     - .2.
   * - 121
     - I-42m
     - 8f
     - .2.
   * - 121
     - I-42m
     - 4e
     - 2.mm
   * - 121
     - I-42m
     - 4d
     - -4..
   * - 121
     - I-42m
     - 4c
     - 222.\
   * - 121
     - I-42m
     - 2b
     - -42m
   * - 121
     - I-42m
     - 2a
     - -42m
   * - 122
     - I-42d
     - 16e
     - 1
   * - 122
     - I-42d
     - 8d
     - .2.
   * - 122
     - I-42d
     - 8c
     - 2..
   * - 122
     - I-42d
     - 4b
     - -4..
   * - 122
     - I-42d
     - 4a
     - -4..
   * - 123
     - P4/mmm
     - 16u
     - 1
   * - 123
     - P4/mmm
     - 8t
     - .m.
   * - 123
     - P4/mmm
     - 8s
     - .m.
   * - 123
     - P4/mmm
     - 8r
     - ..m
   * - 123
     - P4/mmm
     - 8q
     - m..
   * - 123
     - P4/mmm
     - 8p
     - m..
   * - 123
     - P4/mmm
     - 4o
     - m2m.
   * - 123
     - P4/mmm
     - 4n
     - m2m.
   * - 123
     - P4/mmm
     - 4m
     - m2m.
   * - 123
     - P4/mmm
     - 4l
     - m2m.
   * - 123
     - P4/mmm
     - 4k
     - m.2m
   * - 123
     - P4/mmm
     - 4j
     - m.2m
   * - 123
     - P4/mmm
     - 4i
     - 2mm.
   * - 123
     - P4/mmm
     - 2h
     - 4mm
   * - 123
     - P4/mmm
     - 2g
     - 4mm
   * - 123
     - P4/mmm
     - 2f
     - mmm.\
   * - 123
     - P4/mmm
     - 2e
     - mmm.\
   * - 123
     - P4/mmm
     - 1d
     - 4/mmm
   * - 123
     - P4/mmm
     - 1c
     - 4/mmm
   * - 123
     - P4/mmm
     - 1b
     - 4/mmm
   * - 123
     - P4/mmm
     - 1a
     - 4/mmm
   * - 124
     - P4/mcc
     - 16n
     - 1
   * - 124
     - P4/mcc
     - 8m
     - m..
   * - 124
     - P4/mcc
     - 8l
     - .2.
   * - 124
     - P4/mcc
     - 8k
     - .2.
   * - 124
     - P4/mcc
     - 8j
     - ..2
   * - 124
     - P4/mcc
     - 8i
     - 2..
   * - 124
     - P4/mcc
     - 4h
     - 4..
   * - 124
     - P4/mcc
     - 4g
     - 4..
   * - 124
     - P4/mcc
     - 4f
     - 222.\
   * - 124
     - P4/mcc
     - 4e
     - 2/m..
   * - 124
     - P4/mcc
     - 2d
     - 4/m..
   * - 124
     - P4/mcc
     - 2c
     - 422
   * - 124
     - P4/mcc
     - 2b
     - 4/m..
   * - 124
     - P4/mcc
     - 2a
     - 422
   * - 125
     - P4/nbm
     - 16n
     - 1
   * - 125
     - P4/nbm
     - 8m
     - ..m
   * - 125
     - P4/nbm
     - 8l
     - .2.
   * - 125
     - P4/nbm
     - 8k
     - .2.
   * - 125
     - P4/nbm
     - 8j
     - ..2
   * - 125
     - P4/nbm
     - 8i
     - ..2
   * - 125
     - P4/nbm
     - 4h
     - 2.mm
   * - 125
     - P4/nbm
     - 4g
     - 4..
   * - 125
     - P4/nbm
     - 4f
     - ..2/m
   * - 125
     - P4/nbm
     - 4e
     - ..2/m
   * - 125
     - P4/nbm
     - 2d
     - -42m
   * - 125
     - P4/nbm
     - 2c
     - -42m
   * - 125
     - P4/nbm
     - 2b
     - 422
   * - 125
     - P4/nbm
     - 2a
     - 422
   * - 126
     - P4/nnc
     - 16k
     - 1
   * - 126
     - P4/nnc
     - 8j
     - .2.
   * - 126
     - P4/nnc
     - 8i
     - .2.
   * - 126
     - P4/nnc
     - 8h
     - ..2
   * - 126
     - P4/nnc
     - 8g
     - 2..
   * - 126
     - P4/nnc
     - 8f
     - -1
   * - 126
     - P4/nnc
     - 4e
     - 4..
   * - 126
     - P4/nnc
     - 4d
     - -4..
   * - 126
     - P4/nnc
     - 4c
     - 222.\
   * - 126
     - P4/nnc
     - 2b
     - 422
   * - 126
     - P4/nnc
     - 2a
     - 422
   * - 127
     - P4/mbm
     - 16l
     - 1
   * - 127
     - P4/mbm
     - 8k
     - ..m
   * - 127
     - P4/mbm
     - 8j
     - m..
   * - 127
     - P4/mbm
     - 8i
     - m..
   * - 127
     - P4/mbm
     - 4h
     - m.2m
   * - 127
     - P4/mbm
     - 4g
     - m.2m
   * - 127
     - P4/mbm
     - 4f
     - 2.mm
   * - 127
     - P4/mbm
     - 4e
     - 4..
   * - 127
     - P4/mbm
     - 2d
     - m.mm
   * - 127
     - P4/mbm
     - 2c
     - m.mm
   * - 127
     - P4/mbm
     - 2b
     - 4/m..
   * - 127
     - P4/mbm
     - 2a
     - 4/m..
   * - 128
     - P4/mnc
     - 16i
     - 1
   * - 128
     - P4/mnc
     - 8h
     - m..
   * - 128
     - P4/mnc
     - 8g
     - ..2
   * - 128
     - P4/mnc
     - 8f
     - 2..
   * - 128
     - P4/mnc
     - 4e
     - 4..
   * - 128
     - P4/mnc
     - 4d
     - 2.22
   * - 128
     - P4/mnc
     - 4c
     - 2/m..
   * - 128
     - P4/mnc
     - 2b
     - 4/m..
   * - 128
     - P4/mnc
     - 2a
     - 4/m..
   * - 129
     - P4/nmm
     - 16k
     - 1
   * - 129
     - P4/nmm
     - 8j
     - ..m
   * - 129
     - P4/nmm
     - 8i
     - .m.
   * - 129
     - P4/nmm
     - 8h
     - ..2
   * - 129
     - P4/nmm
     - 8g
     - ..2
   * - 129
     - P4/nmm
     - 4f
     - 2mm.
   * - 129
     - P4/nmm
     - 4e
     - ..2/m
   * - 129
     - P4/nmm
     - 4d
     - ..2/m
   * - 129
     - P4/nmm
     - 2c
     - 4mm
   * - 129
     - P4/nmm
     - 2b
     - -4m2
   * - 129
     - P4/nmm
     - 2a
     - -4m2
   * - 130
     - P4/ncc
     - 16g
     - 1
   * - 130
     - P4/ncc
     - 8f
     - ..2
   * - 130
     - P4/ncc
     - 8e
     - 2..
   * - 130
     - P4/ncc
     - 8d
     - -1
   * - 130
     - P4/ncc
     - 4c
     - 4..
   * - 130
     - P4/ncc
     - 4b
     - -4..
   * - 130
     - P4/ncc
     - 4a
     - 2.22
   * - 131
     - P42/mmc
     - 16r
     - 1
   * - 131
     - P42/mmc
     - 8q
     - m..
   * - 131
     - P42/mmc
     - 8p
     - .m.
   * - 131
     - P42/mmc
     - 8o
     - .m.
   * - 131
     - P42/mmc
     - 8n
     - ..2
   * - 131
     - P42/mmc
     - 4m
     - m2m.
   * - 131
     - P42/mmc
     - 4l
     - m2m.
   * - 131
     - P42/mmc
     - 4k
     - m2m.
   * - 131
     - P42/mmc
     - 4j
     - m2m.
   * - 131
     - P42/mmc
     - 4i
     - 2mm.
   * - 131
     - P42/mmc
     - 4h
     - 2mm.
   * - 131
     - P42/mmc
     - 4g
     - 2mm.
   * - 131
     - P42/mmc
     - 2f
     - -4m2
   * - 131
     - P42/mmc
     - 2e
     - -4m2
   * - 131
     - P42/mmc
     - 2d
     - mmm.\
   * - 131
     - P42/mmc
     - 2c
     - mmm.\
   * - 131
     - P42/mmc
     - 2b
     - mmm.\
   * - 131
     - P42/mmc
     - 2a
     - mmm.\
   * - 132
     - P42/mcm
     - 16p
     - 1
   * - 132
     - P42/mcm
     - 8o
     - ..m
   * - 132
     - P42/mcm
     - 8n
     - m..
   * - 132
     - P42/mcm
     - 8m
     - .2.
   * - 132
     - P42/mcm
     - 8l
     - .2.
   * - 132
     - P42/mcm
     - 8k
     - 2..
   * - 132
     - P42/mcm
     - 4j
     - m.2m
   * - 132
     - P42/mcm
     - 4i
     - m.2m
   * - 132
     - P42/mcm
     - 4h
     - 2.mm
   * - 132
     - P42/mcm
     - 4g
     - 2.mm
   * - 132
     - P42/mcm
     - 4f
     - 2/m..
   * - 132
     - P42/mcm
     - 4e
     - 222.\
   * - 132
     - P42/mcm
     - 2d
     - -42m
   * - 132
     - P42/mcm
     - 2c
     - m.mm
   * - 132
     - P42/mcm
     - 2b
     - -42m
   * - 132
     - P42/mcm
     - 2a
     - m.mm
   * - 133
     - P42/nbc
     - 16k
     - 1
   * - 133
     - P42/nbc
     - 8j
     - ..2
   * - 133
     - P42/nbc
     - 8i
     - .2.
   * - 133
     - P42/nbc
     - 8h
     - .2.
   * - 133
     - P42/nbc
     - 8g
     - 2..
   * - 133
     - P42/nbc
     - 8f
     - 2..
   * - 133
     - P42/nbc
     - 8e
     - -1
   * - 133
     - P42/nbc
     - 4d
     - -4..
   * - 133
     - P42/nbc
     - 4c
     - 2.22
   * - 133
     - P42/nbc
     - 4b
     - 222.\
   * - 133
     - P42/nbc
     - 4a
     - 222.\
   * - 134
     - P42/nnm
     - 16n
     - 1
   * - 134
     - P42/nnm
     - 8m
     - ..m
   * - 134
     - P42/nnm
     - 8l
     - ..2
   * - 134
     - P42/nnm
     - 8k
     - ..2
   * - 134
     - P42/nnm
     - 8j
     - .2.
   * - 134
     - P42/nnm
     - 8i
     - .2.
   * - 134
     - P42/nnm
     - 8h
     - 2..
   * - 134
     - P42/nnm
     - 4g
     - 2.mm
   * - 134
     - P42/nnm
     - 4f
     - ..2/m
   * - 134
     - P42/nnm
     - 4e
     - ..2/m
   * - 134
     - P42/nnm
     - 4d
     - 2.22
   * - 134
     - P42/nnm
     - 4c
     - 222.\
   * - 134
     - P42/nnm
     - 2b
     - -42m
   * - 134
     - P42/nnm
     - 2a
     - -42m
   * - 135
     - P42/mbc
     - 16i
     - 1
   * - 135
     - P42/mbc
     - 8h
     - m..
   * - 135
     - P42/mbc
     - 8g
     - ..2
   * - 135
     - P42/mbc
     - 8f
     - 2..
   * - 135
     - P42/mbc
     - 8e
     - 2..
   * - 135
     - P42/mbc
     - 4d
     - 2.22
   * - 135
     - P42/mbc
     - 4c
     - 2/m..
   * - 135
     - P42/mbc
     - 4b
     - -4..
   * - 135
     - P42/mbc
     - 4a
     - 2/m..
   * - 136
     - P42/mnm
     - 16k
     - 1
   * - 136
     - P42/mnm
     - 8j
     - ..m
   * - 136
     - P42/mnm
     - 8i
     - m..
   * - 136
     - P42/mnm
     - 8h
     - 2..
   * - 136
     - P42/mnm
     - 4g
     - m.2m
   * - 136
     - P42/mnm
     - 4f
     - m.2m
   * - 136
     - P42/mnm
     - 4e
     - 2.mm
   * - 136
     - P42/mnm
     - 4d
     - -4..
   * - 136
     - P42/mnm
     - 4c
     - 2/m..
   * - 136
     - P42/mnm
     - 2b
     - m.mm
   * - 136
     - P42/mnm
     - 2a
     - m.mm
   * - 137
     - P42/nmc
     - 16h
     - 1
   * - 137
     - P42/nmc
     - 8g
     - .m.
   * - 137
     - P42/nmc
     - 8f
     - ..2
   * - 137
     - P42/nmc
     - 8e
     - -1
   * - 137
     - P42/nmc
     - 4d
     - 2mm.
   * - 137
     - P42/nmc
     - 4c
     - 2mm.
   * - 137
     - P42/nmc
     - 2b
     - -4m2
   * - 137
     - P42/nmc
     - 2a
     - -4m2
   * - 138
     - P42/ncm
     - 16j
     - 1
   * - 138
     - P42/ncm
     - 8i
     - ..m
   * - 138
     - P42/ncm
     - 8h
     - ..2
   * - 138
     - P42/ncm
     - 8g
     - ..2
   * - 138
     - P42/ncm
     - 8f
     - 2..
   * - 138
     - P42/ncm
     - 4e
     - 2.mm
   * - 138
     - P42/ncm
     - 4d
     - ..2/m
   * - 138
     - P42/ncm
     - 4c
     - ..2/m
   * - 138
     - P42/ncm
     - 4b
     - -4..
   * - 138
     - P42/ncm
     - 4a
     - 2.22
   * - 139
     - I4/mmm
     - 32o
     - 1
   * - 139
     - I4/mmm
     - 16n
     - .m.
   * - 139
     - I4/mmm
     - 16m
     - ..m
   * - 139
     - I4/mmm
     - 16l
     - m..
   * - 139
     - I4/mmm
     - 16k
     - ..2
   * - 139
     - I4/mmm
     - 8j
     - m2m.
   * - 139
     - I4/mmm
     - 8i
     - m2m.
   * - 139
     - I4/mmm
     - 8h
     - m.2m
   * - 139
     - I4/mmm
     - 8g
     - 2mm.
   * - 139
     - I4/mmm
     - 8f
     - ..2/m
   * - 139
     - I4/mmm
     - 4e
     - 4mm
   * - 139
     - I4/mmm
     - 4d
     - -4m2
   * - 139
     - I4/mmm
     - 4c
     - mmm.\
   * - 139
     - I4/mmm
     - 2b
     - 4/mmm
   * - 139
     - I4/mmm
     - 2a
     - 4/mmm
   * - 140
     - I4/mcm
     - 32m
     - 1
   * - 140
     - I4/mcm
     - 16l
     - ..m
   * - 140
     - I4/mcm
     - 16k
     - m..
   * - 140
     - I4/mcm
     - 16j
     - .2.
   * - 140
     - I4/mcm
     - 16i
     - ..2
   * - 140
     - I4/mcm
     - 8h
     - m.2m
   * - 140
     - I4/mcm
     - 8g
     - 2.mm
   * - 140
     - I4/mcm
     - 8f
     - 4..
   * - 140
     - I4/mcm
     - 8e
     - ..2/m
   * - 140
     - I4/mcm
     - 4d
     - m.mm
   * - 140
     - I4/mcm
     - 4c
     - 4/m..
   * - 140
     - I4/mcm
     - 4b
     - -42m
   * - 140
     - I4/mcm
     - 4a
     - 422
   * - 141
     - I41/amd
     - 32i
     - 1
   * - 141
     - I41/amd
     - 16h
     - .m.
   * - 141
     - I41/amd
     - 16g
     - ..2
   * - 141
     - I41/amd
     - 16f
     - .2.
   * - 141
     - I41/amd
     - 8e
     - 2mm.
   * - 141
     - I41/amd
     - 8d
     - .2/m.
   * - 141
     - I41/amd
     - 8c
     - .2/m.
   * - 141
     - I41/amd
     - 4b
     - -4m2
   * - 141
     - I41/amd
     - 4a
     - -4m2
   * - 142
     - I41/acd
     - 32g
     - 1
   * - 142
     - I41/acd
     - 16f
     - ..2
   * - 142
     - I41/acd
     - 16e
     - .2.
   * - 142
     - I41/acd
     - 16d
     - 2..
   * - 142
     - I41/acd
     - 16c
     - -1
   * - 142
     - I41/acd
     - 8b
     - 2.22
   * - 142
     - I41/acd
     - 8a
     - -4..
   * - 143
     - P3
     - 3d
     - 1
   * - 143
     - P3
     - 1c
     - 3..
   * - 143
     - P3
     - 1b
     - 3..
   * - 143
     - P3
     - 1a
     - 3..
   * - 144
     - P31
     - 3a
     - 1
   * - 145
     - P32
     - 3a
     - 1
   * - 146
     - R3
     - 9b
     - 1
   * - 146
     - R3
     - 3a
     - 3.\
   * - 147
     - P-3
     - 6g
     - 1
   * - 147
     - P-3
     - 3f
     - -1
   * - 147
     - P-3
     - 3e
     - -1
   * - 147
     - P-3
     - 2d
     - 3..
   * - 147
     - P-3
     - 2c
     - 3..
   * - 147
     - P-3
     - 1b
     - -3..
   * - 147
     - P-3
     - 1a
     - -3..
   * - 148
     - R-3
     - 18f
     - 1
   * - 148
     - R-3
     - 9e
     - -1
   * - 148
     - R-3
     - 9d
     - -1
   * - 148
     - R-3
     - 6c
     - 3.\
   * - 148
     - R-3
     - 3b
     - -3.
   * - 148
     - R-3
     - 3a
     - -3.
   * - 149
     - P312
     - 6l
     - 1
   * - 149
     - P312
     - 3k
     - ..2
   * - 149
     - P312
     - 3j
     - ..2
   * - 149
     - P312
     - 2i
     - 3..
   * - 149
     - P312
     - 2h
     - 3..
   * - 149
     - P312
     - 2g
     - 3..
   * - 149
     - P312
     - 1f
     - 3.2
   * - 149
     - P312
     - 1e
     - 3.2
   * - 149
     - P312
     - 1d
     - 3.2
   * - 149
     - P312
     - 1c
     - 3.2
   * - 149
     - P312
     - 1b
     - 3.2
   * - 149
     - P312
     - 1a
     - 3.2
   * - 150
     - P321
     - 6g
     - 1
   * - 150
     - P321
     - 3f
     - .2.
   * - 150
     - P321
     - 3e
     - .2.
   * - 150
     - P321
     - 2d
     - 3..
   * - 150
     - P321
     - 2c
     - 3..
   * - 150
     - P321
     - 1b
     - 32.\
   * - 150
     - P321
     - 1a
     - 32.\
   * - 151
     - P3112
     - 6c
     - 1
   * - 151
     - P3112
     - 3b
     - ..2
   * - 151
     - P3112
     - 3a
     - ..2
   * - 152
     - P3121
     - 6c
     - 1
   * - 152
     - P3121
     - 3b
     - .2.
   * - 152
     - P3121
     - 3a
     - .2.
   * - 153
     - P3212
     - 6c
     - 1
   * - 153
     - P3212
     - 3b
     - ..2
   * - 153
     - P3212
     - 3a
     - ..2
   * - 154
     - P3221
     - 6c
     - 1
   * - 154
     - P3221
     - 3b
     - .2.
   * - 154
     - P3221
     - 3a
     - .2.
   * - 155
     - R32
     - 18f
     - 1
   * - 155
     - R32
     - 9e
     - .2
   * - 155
     - R32
     - 9d
     - .2
   * - 155
     - R32
     - 6c
     - 3.\
   * - 155
     - R32
     - 3b
     - 32
   * - 155
     - R32
     - 3a
     - 32
   * - 156
     - P3m1
     - 6e
     - 1
   * - 156
     - P3m1
     - 3d
     - .m.
   * - 156
     - P3m1
     - 1c
     - 3m.
   * - 156
     - P3m1
     - 1b
     - 3m.
   * - 156
     - P3m1
     - 1a
     - 3m.
   * - 157
     - P31m
     - 6d
     - 1
   * - 157
     - P31m
     - 3c
     - ..m
   * - 157
     - P31m
     - 2b
     - 3..
   * - 157
     - P31m
     - 1a
     - 3.m
   * - 158
     - P3c1
     - 6d
     - 1
   * - 158
     - P3c1
     - 2c
     - 3..
   * - 158
     - P3c1
     - 2b
     - 3..
   * - 158
     - P3c1
     - 2a
     - 3..
   * - 159
     - P31c
     - 6c
     - 1
   * - 159
     - P31c
     - 2b
     - 3..
   * - 159
     - P31c
     - 2a
     - 3..
   * - 160
     - R3m
     - 18c
     - 1
   * - 160
     - R3m
     - 9b
     - .m
   * - 160
     - R3m
     - 3a
     - 3m
   * - 161
     - R3c
     - 18b
     - 1
   * - 161
     - R3c
     - 6a
     - 3.\
   * - 162
     - P-31m
     - 12l
     - 1
   * - 162
     - P-31m
     - 6k
     - ..m
   * - 162
     - P-31m
     - 6j
     - ..2
   * - 162
     - P-31m
     - 6i
     - ..2
   * - 162
     - P-31m
     - 4h
     - 3..
   * - 162
     - P-31m
     - 3g
     - ..2/m
   * - 162
     - P-31m
     - 3f
     - ..2/m
   * - 162
     - P-31m
     - 2e
     - 3.m
   * - 162
     - P-31m
     - 2d
     - 3.2
   * - 162
     - P-31m
     - 2c
     - 3.2
   * - 162
     - P-31m
     - 1b
     - -3.m
   * - 162
     - P-31m
     - 1a
     - -3.m
   * - 163
     - P-31c
     - 12i
     - 1
   * - 163
     - P-31c
     - 6h
     - ..2
   * - 163
     - P-31c
     - 6g
     - -1
   * - 163
     - P-31c
     - 4f
     - 3..
   * - 163
     - P-31c
     - 4e
     - 3..
   * - 163
     - P-31c
     - 2d
     - 3.2
   * - 163
     - P-31c
     - 2c
     - 3.2
   * - 163
     - P-31c
     - 2b
     - -3..
   * - 163
     - P-31c
     - 2a
     - 3.2
   * - 164
     - P-3m1
     - 12j
     - 1
   * - 164
     - P-3m1
     - 6i
     - .m.
   * - 164
     - P-3m1
     - 6h
     - .2.
   * - 164
     - P-3m1
     - 6g
     - .2.
   * - 164
     - P-3m1
     - 3f
     - .2/m.
   * - 164
     - P-3m1
     - 3e
     - .2/m.
   * - 164
     - P-3m1
     - 2d
     - 3m.
   * - 164
     - P-3m1
     - 2c
     - 3m.
   * - 164
     - P-3m1
     - 1b
     - -3m.
   * - 164
     - P-3m1
     - 1a
     - -3m.
   * - 165
     - P-3c1
     - 12g
     - 1
   * - 165
     - P-3c1
     - 6f
     - .2.
   * - 165
     - P-3c1
     - 6e
     - -1
   * - 165
     - P-3c1
     - 4d
     - 3..
   * - 165
     - P-3c1
     - 4c
     - 3..
   * - 165
     - P-3c1
     - 2b
     - -3..
   * - 165
     - P-3c1
     - 2a
     - 32.\
   * - 166
     - R-3m
     - 36i
     - 1
   * - 166
     - R-3m
     - 18h
     - .m
   * - 166
     - R-3m
     - 18g
     - .2
   * - 166
     - R-3m
     - 18f
     - .2
   * - 166
     - R-3m
     - 9e
     - .2/m
   * - 166
     - R-3m
     - 9d
     - .2/m
   * - 166
     - R-3m
     - 6c
     - 3m
   * - 166
     - R-3m
     - 3b
     - -3m
   * - 166
     - R-3m
     - 3a
     - -3m
   * - 167
     - R-3c
     - 36f
     - 1
   * - 167
     - R-3c
     - 18e
     - .2
   * - 167
     - R-3c
     - 18d
     - -1
   * - 167
     - R-3c
     - 12c
     - 3.\
   * - 167
     - R-3c
     - 6b
     - -3.
   * - 167
     - R-3c
     - 6a
     - 32
   * - 168
     - P6
     - 6d
     - 1
   * - 168
     - P6
     - 3c
     - 2..
   * - 168
     - P6
     - 2b
     - 3..
   * - 168
     - P6
     - 1a
     - 6..
   * - 169
     - P61
     - 6a
     - 1
   * - 170
     - P65
     - 6a
     - 1
   * - 171
     - P62
     - 6c
     - 1
   * - 171
     - P62
     - 3b
     - 2..
   * - 171
     - P62
     - 3a
     - 2..
   * - 172
     - P64
     - 6c
     - 1
   * - 172
     - P64
     - 3b
     - 2..
   * - 172
     - P64
     - 3a
     - 2..
   * - 173
     - P63
     - 6c
     - 1
   * - 173
     - P63
     - 2b
     - 3..
   * - 173
     - P63
     - 2a
     - 3..
   * - 174
     - P-6
     - 6l
     - 1
   * - 174
     - P-6
     - 3k
     - m..
   * - 174
     - P-6
     - 3j
     - m..
   * - 174
     - P-6
     - 2i
     - 3..
   * - 174
     - P-6
     - 2h
     - 3..
   * - 174
     - P-6
     - 2g
     - 3..
   * - 174
     - P-6
     - 1f
     - -6..
   * - 174
     - P-6
     - 1e
     - -6..
   * - 174
     - P-6
     - 1d
     - -6..
   * - 174
     - P-6
     - 1c
     - -6..
   * - 174
     - P-6
     - 1b
     - -6..
   * - 174
     - P-6
     - 1a
     - -6..
   * - 175
     - P6/m
     - 12l
     - 1
   * - 175
     - P6/m
     - 6k
     - m..
   * - 175
     - P6/m
     - 6j
     - m..
   * - 175
     - P6/m
     - 6i
     - 2..
   * - 175
     - P6/m
     - 4h
     - 3..
   * - 175
     - P6/m
     - 3g
     - 2/m..
   * - 175
     - P6/m
     - 3f
     - 2/m..
   * - 175
     - P6/m
     - 2e
     - 6..
   * - 175
     - P6/m
     - 2d
     - -6..
   * - 175
     - P6/m
     - 2c
     - -6..
   * - 175
     - P6/m
     - 1b
     - 6/m..
   * - 175
     - P6/m
     - 1a
     - 6/m..
   * - 176
     - P63/m
     - 12i
     - 1
   * - 176
     - P63/m
     - 6h
     - m..
   * - 176
     - P63/m
     - 6g
     - -1
   * - 176
     - P63/m
     - 4f
     - 3..
   * - 176
     - P63/m
     - 4e
     - 3..
   * - 176
     - P63/m
     - 2d
     - -6..
   * - 176
     - P63/m
     - 2c
     - -6..
   * - 176
     - P63/m
     - 2b
     - -3..
   * - 176
     - P63/m
     - 2a
     - -6..
   * - 177
     - P622
     - 12n
     - 1
   * - 177
     - P622
     - 6m
     - ..2
   * - 177
     - P622
     - 6l
     - ..2
   * - 177
     - P622
     - 6k
     - .2.
   * - 177
     - P622
     - 6j
     - .2.
   * - 177
     - P622
     - 6i
     - 2..
   * - 177
     - P622
     - 4h
     - 3..
   * - 177
     - P622
     - 3g
     - 222
   * - 177
     - P622
     - 3f
     - 222
   * - 177
     - P622
     - 2e
     - 6..
   * - 177
     - P622
     - 2d
     - 3.2
   * - 177
     - P622
     - 2c
     - 3.2
   * - 177
     - P622
     - 1b
     - 622
   * - 177
     - P622
     - 1a
     - 622
   * - 178
     - P6122
     - 12c
     - 1
   * - 178
     - P6122
     - 6b
     - ..2
   * - 178
     - P6122
     - 6a
     - .2.
   * - 179
     - P6522
     - 12c
     - 1
   * - 179
     - P6522
     - 6b
     - ..2
   * - 179
     - P6522
     - 6a
     - .2.
   * - 180
     - P6222
     - 12k
     - 1
   * - 180
     - P6222
     - 6j
     - ..2
   * - 180
     - P6222
     - 6i
     - ..2
   * - 180
     - P6222
     - 6h
     - .2.
   * - 180
     - P6222
     - 6g
     - .2.
   * - 180
     - P6222
     - 6f
     - 2..
   * - 180
     - P6222
     - 6e
     - 2..
   * - 180
     - P6222
     - 3d
     - 222
   * - 180
     - P6222
     - 3c
     - 222
   * - 180
     - P6222
     - 3b
     - 222
   * - 180
     - P6222
     - 3a
     - 222
   * - 181
     - P6422
     - 12k
     - 1
   * - 181
     - P6422
     - 6j
     - ..2
   * - 181
     - P6422
     - 6i
     - ..2
   * - 181
     - P6422
     - 6h
     - .2.
   * - 181
     - P6422
     - 6g
     - .2.
   * - 181
     - P6422
     - 6f
     - 2..
   * - 181
     - P6422
     - 6e
     - 2..
   * - 181
     - P6422
     - 3d
     - 222
   * - 181
     - P6422
     - 3c
     - 222
   * - 181
     - P6422
     - 3b
     - 222
   * - 181
     - P6422
     - 3a
     - 222
   * - 182
     - P6322
     - 12i
     - 1
   * - 182
     - P6322
     - 6h
     - ..2
   * - 182
     - P6322
     - 6g
     - .2.
   * - 182
     - P6322
     - 4f
     - 3..
   * - 182
     - P6322
     - 4e
     - 3..
   * - 182
     - P6322
     - 2d
     - 3.2
   * - 182
     - P6322
     - 2c
     - 3.2
   * - 182
     - P6322
     - 2b
     - 3.2
   * - 182
     - P6322
     - 2a
     - 32.\
   * - 183
     - P6mm
     - 12f
     - 1
   * - 183
     - P6mm
     - 6e
     - .m.
   * - 183
     - P6mm
     - 6d
     - ..m
   * - 183
     - P6mm
     - 3c
     - 2mm
   * - 183
     - P6mm
     - 2b
     - 3m.
   * - 183
     - P6mm
     - 1a
     - 6mm
   * - 184
     - P6cc
     - 12d
     - 1
   * - 184
     - P6cc
     - 6c
     - 2..
   * - 184
     - P6cc
     - 4b
     - 3..
   * - 184
     - P6cc
     - 2a
     - 6..
   * - 185
     - P63cm
     - 12d
     - 1
   * - 185
     - P63cm
     - 6c
     - ..m
   * - 185
     - P63cm
     - 4b
     - 3..
   * - 185
     - P63cm
     - 2a
     - 3.m
   * - 186
     - P63mc
     - 12d
     - 1
   * - 186
     - P63mc
     - 6c
     - .m.
   * - 186
     - P63mc
     - 2b
     - 3m.
   * - 186
     - P63mc
     - 2a
     - 3m.
   * - 187
     - P-6m2
     - 12o
     - 1
   * - 187
     - P-6m2
     - 6n
     - .m.
   * - 187
     - P-6m2
     - 6m
     - m..
   * - 187
     - P-6m2
     - 6l
     - m..
   * - 187
     - P-6m2
     - 3k
     - mm2
   * - 187
     - P-6m2
     - 3j
     - mm2
   * - 187
     - P-6m2
     - 2i
     - 3m.
   * - 187
     - P-6m2
     - 2h
     - 3m.
   * - 187
     - P-6m2
     - 2g
     - 3m.
   * - 187
     - P-6m2
     - 1f
     - -6m2
   * - 187
     - P-6m2
     - 1e
     - -6m2
   * - 187
     - P-6m2
     - 1d
     - -6m2
   * - 187
     - P-6m2
     - 1c
     - -6m2
   * - 187
     - P-6m2
     - 1b
     - -6m2
   * - 187
     - P-6m2
     - 1a
     - -6m2
   * - 188
     - P-6c2
     - 12l
     - 1
   * - 188
     - P-6c2
     - 6k
     - m..
   * - 188
     - P-6c2
     - 6j
     - ..2
   * - 188
     - P-6c2
     - 4i
     - 3..
   * - 188
     - P-6c2
     - 4h
     - 3..
   * - 188
     - P-6c2
     - 4g
     - 3..
   * - 188
     - P-6c2
     - 2f
     - -6..
   * - 188
     - P-6c2
     - 2e
     - 3.2
   * - 188
     - P-6c2
     - 2d
     - -6..
   * - 188
     - P-6c2
     - 2c
     - 3.2
   * - 188
     - P-6c2
     - 2b
     - -6..
   * - 188
     - P-6c2
     - 2a
     - 3.2
   * - 189
     - P-62m
     - 12l
     - 1
   * - 189
     - P-62m
     - 6k
     - m..
   * - 189
     - P-62m
     - 6j
     - m..
   * - 189
     - P-62m
     - 6i
     - ..m
   * - 189
     - P-62m
     - 4h
     - 3..
   * - 189
     - P-62m
     - 3g
     - m2m
   * - 189
     - P-62m
     - 3f
     - m2m
   * - 189
     - P-62m
     - 2e
     - 3.m
   * - 189
     - P-62m
     - 2d
     - -6..
   * - 189
     - P-62m
     - 2c
     - -6..
   * - 189
     - P-62m
     - 1b
     - -62m
   * - 189
     - P-62m
     - 1a
     - -62m
   * - 190
     - P-62c
     - 12i
     - 1
   * - 190
     - P-62c
     - 6h
     - m..
   * - 190
     - P-62c
     - 6g
     - .2.
   * - 190
     - P-62c
     - 4f
     - 3..
   * - 190
     - P-62c
     - 4e
     - 3..
   * - 190
     - P-62c
     - 2d
     - -6..
   * - 190
     - P-62c
     - 2c
     - -6..
   * - 190
     - P-62c
     - 2b
     - -6..
   * - 190
     - P-62c
     - 2a
     - 32.\
   * - 191
     - P6/mmm
     - 24r
     - 1
   * - 191
     - P6/mmm
     - 12q
     - m..
   * - 191
     - P6/mmm
     - 12p
     - m..
   * - 191
     - P6/mmm
     - 12o
     - .m.
   * - 191
     - P6/mmm
     - 12n
     - ..m
   * - 191
     - P6/mmm
     - 6m
     - mm2
   * - 191
     - P6/mmm
     - 6l
     - mm2
   * - 191
     - P6/mmm
     - 6k
     - m2m
   * - 191
     - P6/mmm
     - 6j
     - m2m
   * - 191
     - P6/mmm
     - 6i
     - 2mm
   * - 191
     - P6/mmm
     - 4h
     - 3m.
   * - 191
     - P6/mmm
     - 3g
     - mmm
   * - 191
     - P6/mmm
     - 3f
     - mmm
   * - 191
     - P6/mmm
     - 2e
     - 6mm
   * - 191
     - P6/mmm
     - 2d
     - -6m2
   * - 191
     - P6/mmm
     - 2c
     - -6m2
   * - 191
     - P6/mmm
     - 1b
     - 6/mmm
   * - 191
     - P6/mmm
     - 1a
     - 6/mmm
   * - 192
     - P6/mcc
     - 24m
     - 1
   * - 192
     - P6/mcc
     - 12l
     - m..
   * - 192
     - P6/mcc
     - 12k
     - ..2
   * - 192
     - P6/mcc
     - 12j
     - .2.
   * - 192
     - P6/mcc
     - 12i
     - 2..
   * - 192
     - P6/mcc
     - 8h
     - 3..
   * - 192
     - P6/mcc
     - 6g
     - 2/m..
   * - 192
     - P6/mcc
     - 6f
     - 222
   * - 192
     - P6/mcc
     - 4e
     - 6..
   * - 192
     - P6/mcc
     - 4d
     - -6..
   * - 192
     - P6/mcc
     - 4c
     - 3.2
   * - 192
     - P6/mcc
     - 2b
     - 6/m..
   * - 192
     - P6/mcc
     - 2a
     - 622
   * - 193
     - P63/mcm
     - 24l
     - 1
   * - 193
     - P63/mcm
     - 12k
     - ..m
   * - 193
     - P63/mcm
     - 12j
     - m..
   * - 193
     - P63/mcm
     - 12i
     - ..2
   * - 193
     - P63/mcm
     - 8h
     - 3..
   * - 193
     - P63/mcm
     - 6g
     - m2m
   * - 193
     - P63/mcm
     - 6f
     - ..2/m
   * - 193
     - P63/mcm
     - 4e
     - 3.m
   * - 193
     - P63/mcm
     - 4d
     - 3.2
   * - 193
     - P63/mcm
     - 4c
     - -6..
   * - 193
     - P63/mcm
     - 2b
     - -3.m
   * - 193
     - P63/mcm
     - 2a
     - -62m
   * - 194
     - P63/mmc
     - 24l
     - 1
   * - 194
     - P63/mmc
     - 12k
     - .m.
   * - 194
     - P63/mmc
     - 12j
     - m..
   * - 194
     - P63/mmc
     - 12i
     - .2.
   * - 194
     - P63/mmc
     - 6h
     - mm2
   * - 194
     - P63/mmc
     - 6g
     - .2/m.
   * - 194
     - P63/mmc
     - 4f
     - 3m.
   * - 194
     - P63/mmc
     - 4e
     - 3m.
   * - 194
     - P63/mmc
     - 2d
     - -6m2
   * - 194
     - P63/mmc
     - 2c
     - -6m2
   * - 194
     - P63/mmc
     - 2b
     - -6m2
   * - 194
     - P63/mmc
     - 2a
     - -3m.
   * - 195
     - P23
     - 12j
     - 1
   * - 195
     - P23
     - 6i
     - 2..
   * - 195
     - P23
     - 6h
     - 2..
   * - 195
     - P23
     - 6g
     - 2..
   * - 195
     - P23
     - 6f
     - 2..
   * - 195
     - P23
     - 4e
     - .3.
   * - 195
     - P23
     - 3d
     - 222..
   * - 195
     - P23
     - 3c
     - 222..
   * - 195
     - P23
     - 1b
     - 23.\
   * - 195
     - P23
     - 1a
     - 23.\
   * - 196
     - F23
     - 48h
     - 1
   * - 196
     - F23
     - 24g
     - 2..
   * - 196
     - F23
     - 24f
     - 2..
   * - 196
     - F23
     - 16e
     - .3.
   * - 196
     - F23
     - 4d
     - 23.\
   * - 196
     - F23
     - 4c
     - 23.\
   * - 196
     - F23
     - 4b
     - 23.\
   * - 196
     - F23
     - 4a
     - 23.\
   * - 197
     - I23
     - 24f
     - 1
   * - 197
     - I23
     - 12e
     - 2..
   * - 197
     - I23
     - 12d
     - 2..
   * - 197
     - I23
     - 8c
     - .3.
   * - 197
     - I23
     - 6b
     - 222..
   * - 197
     - I23
     - 2a
     - 23.\
   * - 198
     - P213
     - 12b
     - 1
   * - 198
     - P213
     - 4a
     - .3.
   * - 199
     - I213
     - 24c
     - 1
   * - 199
     - I213
     - 12b
     - 2..
   * - 199
     - I213
     - 8a
     - .3.
   * - 200
     - Pm-3
     - 24l
     - 1
   * - 200
     - Pm-3
     - 12k
     - m..
   * - 200
     - Pm-3
     - 12j
     - m..
   * - 200
     - Pm-3
     - 8i
     - .3.
   * - 200
     - Pm-3
     - 6h
     - mm2..
   * - 200
     - Pm-3
     - 6g
     - mm2..
   * - 200
     - Pm-3
     - 6f
     - mm2..
   * - 200
     - Pm-3
     - 6e
     - mm2..
   * - 200
     - Pm-3
     - 3d
     - mmm..
   * - 200
     - Pm-3
     - 3c
     - mmm..
   * - 200
     - Pm-3
     - 1b
     - m-3.
   * - 200
     - Pm-3
     - 1a
     - m-3.
   * - 201
     - Pn-3
     - 24h
     - 1
   * - 201
     - Pn-3
     - 12g
     - 2..
   * - 201
     - Pn-3
     - 12f
     - 2..
   * - 201
     - Pn-3
     - 8e
     - .3.
   * - 201
     - Pn-3
     - 6d
     - 222..
   * - 201
     - Pn-3
     - 4c
     - .-3.
   * - 201
     - Pn-3
     - 4b
     - .-3.
   * - 201
     - Pn-3
     - 2a
     - 23.\
   * - 202
     - Fm-3
     - 96i
     - 1
   * - 202
     - Fm-3
     - 48h
     - m..
   * - 202
     - Fm-3
     - 48g
     - 2..
   * - 202
     - Fm-3
     - 32f
     - .3.
   * - 202
     - Fm-3
     - 24e
     - mm2..
   * - 202
     - Fm-3
     - 24d
     - 2/m..
   * - 202
     - Fm-3
     - 8c
     - 23.\
   * - 202
     - Fm-3
     - 4b
     - m-3.
   * - 202
     - Fm-3
     - 4a
     - m-3.
   * - 203
     - Fd-3
     - 96g
     - 1
   * - 203
     - Fd-3
     - 48f
     - 2..
   * - 203
     - Fd-3
     - 32e
     - .3.
   * - 203
     - Fd-3
     - 16d
     - .-3.
   * - 203
     - Fd-3
     - 16c
     - .-3.
   * - 203
     - Fd-3
     - 8b
     - 23.\
   * - 203
     - Fd-3
     - 8a
     - 23.\
   * - 204
     - Im-3
     - 48h
     - 1
   * - 204
     - Im-3
     - 24g
     - m..
   * - 204
     - Im-3
     - 16f
     - .3.
   * - 204
     - Im-3
     - 12e
     - mm2..
   * - 204
     - Im-3
     - 12d
     - mm2..
   * - 204
     - Im-3
     - 8c
     - .-3.
   * - 204
     - Im-3
     - 6b
     - mmm..
   * - 204
     - Im-3
     - 2a
     - m-3.
   * - 205
     - Pa-3
     - 24d
     - 1
   * - 205
     - Pa-3
     - 8c
     - .3.
   * - 205
     - Pa-3
     - 4b
     - .-3.
   * - 205
     - Pa-3
     - 4a
     - .-3.
   * - 206
     - Ia-3
     - 48e
     - 1
   * - 206
     - Ia-3
     - 24d
     - 2..
   * - 206
     - Ia-3
     - 16c
     - .3.
   * - 206
     - Ia-3
     - 8b
     - .-3.
   * - 206
     - Ia-3
     - 8a
     - .-3.
   * - 207
     - P432
     - 24k
     - 1
   * - 207
     - P432
     - 12j
     - ..2
   * - 207
     - P432
     - 12i
     - ..2
   * - 207
     - P432
     - 12h
     - 2..
   * - 207
     - P432
     - 8g
     - .3.
   * - 207
     - P432
     - 6f
     - 4..
   * - 207
     - P432
     - 6e
     - 4..
   * - 207
     - P432
     - 3d
     - 42.2
   * - 207
     - P432
     - 3c
     - 42.2
   * - 207
     - P432
     - 1b
     - 432
   * - 207
     - P432
     - 1a
     - 432
   * - 208
     - P4232
     - 24m
     - 1
   * - 208
     - P4232
     - 12l
     - ..2
   * - 208
     - P4232
     - 12k
     - ..2
   * - 208
     - P4232
     - 12j
     - 2..
   * - 208
     - P4232
     - 12i
     - 2..
   * - 208
     - P4232
     - 12h
     - 2..
   * - 208
     - P4232
     - 8g
     - .3.
   * - 208
     - P4232
     - 6f
     - 2.22
   * - 208
     - P4232
     - 6e
     - 2.22
   * - 208
     - P4232
     - 6d
     - 222..
   * - 208
     - P4232
     - 4c
     - .32
   * - 208
     - P4232
     - 4b
     - .32
   * - 208
     - P4232
     - 2a
     - 23.\
   * - 209
     - F432
     - 96j
     - 1
   * - 209
     - F432
     - 48i
     - 2..
   * - 209
     - F432
     - 48h
     - ..2
   * - 209
     - F432
     - 48g
     - ..2
   * - 209
     - F432
     - 32f
     - .3.
   * - 209
     - F432
     - 24e
     - 4..
   * - 209
     - F432
     - 24d
     - 2.22
   * - 209
     - F432
     - 8c
     - 23.\
   * - 209
     - F432
     - 4b
     - 432
   * - 209
     - F432
     - 4a
     - 432
   * - 210
     - F4132
     - 96h
     - 1
   * - 210
     - F4132
     - 48g
     - ..2
   * - 210
     - F4132
     - 48f
     - 2..
   * - 210
     - F4132
     - 32e
     - .3.
   * - 210
     - F4132
     - 16d
     - .32
   * - 210
     - F4132
     - 16c
     - .32
   * - 210
     - F4132
     - 8b
     - 23.\
   * - 210
     - F4132
     - 8a
     - 23.\
   * - 211
     - I432
     - 48j
     - 1
   * - 211
     - I432
     - 24i
     - ..2
   * - 211
     - I432
     - 24h
     - ..2
   * - 211
     - I432
     - 24g
     - 2..
   * - 211
     - I432
     - 16f
     - .3.
   * - 211
     - I432
     - 12e
     - 4..
   * - 211
     - I432
     - 12d
     - 2.22
   * - 211
     - I432
     - 8c
     - .32
   * - 211
     - I432
     - 6b
     - 42.2
   * - 211
     - I432
     - 2a
     - 432
   * - 212
     - P4332
     - 24e
     - 1
   * - 212
     - P4332
     - 12d
     - ..2
   * - 212
     - P4332
     - 8c
     - .3.
   * - 212
     - P4332
     - 4b
     - .32
   * - 212
     - P4332
     - 4a
     - .32
   * - 213
     - P4132
     - 24e
     - 1
   * - 213
     - P4132
     - 12d
     - ..2
   * - 213
     - P4132
     - 8c
     - .3.
   * - 213
     - P4132
     - 4b
     - .32
   * - 213
     - P4132
     - 4a
     - .32
   * - 214
     - I4132
     - 48i
     - 1
   * - 214
     - I4132
     - 24h
     - ..2
   * - 214
     - I4132
     - 24g
     - ..2
   * - 214
     - I4132
     - 24f
     - 2..
   * - 214
     - I4132
     - 16e
     - .3.
   * - 214
     - I4132
     - 12d
     - 2.22
   * - 214
     - I4132
     - 12c
     - 2.22
   * - 214
     - I4132
     - 8b
     - .32
   * - 214
     - I4132
     - 8a
     - .32
   * - 215
     - P-43m
     - 24j
     - 1
   * - 215
     - P-43m
     - 12i
     - ..m
   * - 215
     - P-43m
     - 12h
     - 2..
   * - 215
     - P-43m
     - 6g
     - 2.mm
   * - 215
     - P-43m
     - 6f
     - 2.mm
   * - 215
     - P-43m
     - 4e
     - .3m
   * - 215
     - P-43m
     - 3d
     - -42.m
   * - 215
     - P-43m
     - 3c
     - -42.m
   * - 215
     - P-43m
     - 1b
     - -43m
   * - 215
     - P-43m
     - 1a
     - -43m
   * - 216
     - F-43m
     - 96i
     - 1
   * - 216
     - F-43m
     - 48h
     - ..m
   * - 216
     - F-43m
     - 24g
     - 2.mm
   * - 216
     - F-43m
     - 24f
     - 2.mm
   * - 216
     - F-43m
     - 16e
     - .3m
   * - 216
     - F-43m
     - 4d
     - -43m
   * - 216
     - F-43m
     - 4c
     - -43m
   * - 216
     - F-43m
     - 4b
     - -43m
   * - 216
     - F-43m
     - 4a
     - -43m
   * - 217
     - I-43m
     - 48h
     - 1
   * - 217
     - I-43m
     - 24g
     - ..m
   * - 217
     - I-43m
     - 24f
     - 2..
   * - 217
     - I-43m
     - 12e
     - 2.mm
   * - 217
     - I-43m
     - 12d
     - -4..
   * - 217
     - I-43m
     - 8c
     - .3m
   * - 217
     - I-43m
     - 6b
     - -42.m
   * - 217
     - I-43m
     - 2a
     - -43m
   * - 218
     - P-43n
     - 24i
     - 1
   * - 218
     - P-43n
     - 12h
     - 2..
   * - 218
     - P-43n
     - 12g
     - 2..
   * - 218
     - P-43n
     - 12f
     - 2..
   * - 218
     - P-43n
     - 8e
     - .3.
   * - 218
     - P-43n
     - 6d
     - -4..
   * - 218
     - P-43n
     - 6c
     - -4..
   * - 218
     - P-43n
     - 6b
     - 222..
   * - 218
     - P-43n
     - 2a
     - 23.\
   * - 219
     - F-43c
     - 96h
     - 1
   * - 219
     - F-43c
     - 48g
     - 2..
   * - 219
     - F-43c
     - 48f
     - 2..
   * - 219
     - F-43c
     - 32e
     - .3.
   * - 219
     - F-43c
     - 24d
     - -4..
   * - 219
     - F-43c
     - 24c
     - -4..
   * - 219
     - F-43c
     - 8b
     - 23.\
   * - 219
     - F-43c
     - 8a
     - 23.\
   * - 220
     - I-43d
     - 48e
     - 1
   * - 220
     - I-43d
     - 24d
     - 2..
   * - 220
     - I-43d
     - 16c
     - .3.
   * - 220
     - I-43d
     - 12b
     - -4..
   * - 220
     - I-43d
     - 12a
     - -4..
   * - 221
     - Pm-3m
     - 48n
     - 1
   * - 221
     - Pm-3m
     - 24m
     - ..m
   * - 221
     - Pm-3m
     - 24l
     - m..
   * - 221
     - Pm-3m
     - 24k
     - m..
   * - 221
     - Pm-3m
     - 12j
     - m.m2
   * - 221
     - Pm-3m
     - 12i
     - m.m2
   * - 221
     - Pm-3m
     - 12h
     - mm2..
   * - 221
     - Pm-3m
     - 8g
     - .3m
   * - 221
     - Pm-3m
     - 6f
     - 4m.m
   * - 221
     - Pm-3m
     - 6e
     - 4m.m
   * - 221
     - Pm-3m
     - 3d
     - 4/mm.m
   * - 221
     - Pm-3m
     - 3c
     - 4/mm.m
   * - 221
     - Pm-3m
     - 1b
     - m-3m
   * - 221
     - Pm-3m
     - 1a
     - m-3m
   * - 222
     - Pn-3n
     - 48i
     - 1
   * - 222
     - Pn-3n
     - 24h
     - ..2
   * - 222
     - Pn-3n
     - 24g
     - 2..
   * - 222
     - Pn-3n
     - 16f
     - .3.
   * - 222
     - Pn-3n
     - 12e
     - 4..
   * - 222
     - Pn-3n
     - 12d
     - -4..
   * - 222
     - Pn-3n
     - 8c
     - .-3.
   * - 222
     - Pn-3n
     - 6b
     - 42.2
   * - 222
     - Pn-3n
     - 2a
     - 432
   * - 223
     - Pm-3n
     - 48l
     - 1
   * - 223
     - Pm-3n
     - 24k
     - m..
   * - 223
     - Pm-3n
     - 24j
     - ..2
   * - 223
     - Pm-3n
     - 16i
     - .3.
   * - 223
     - Pm-3n
     - 12h
     - mm2..
   * - 223
     - Pm-3n
     - 12g
     - mm2..
   * - 223
     - Pm-3n
     - 12f
     - mm2..
   * - 223
     - Pm-3n
     - 8e
     - .32
   * - 223
     - Pm-3n
     - 6d
     - -4m.2
   * - 223
     - Pm-3n
     - 6c
     - -4m.2
   * - 223
     - Pm-3n
     - 6b
     - mmm..
   * - 223
     - Pm-3n
     - 2a
     - m-3.
   * - 224
     - Pn-3m
     - 48l
     - 1
   * - 224
     - Pn-3m
     - 24k
     - ..m
   * - 224
     - Pn-3m
     - 24j
     - ..2
   * - 224
     - Pn-3m
     - 24i
     - ..2
   * - 224
     - Pn-3m
     - 24h
     - 2..
   * - 224
     - Pn-3m
     - 12g
     - 2.mm
   * - 224
     - Pn-3m
     - 12f
     - 2.22
   * - 224
     - Pn-3m
     - 8e
     - .3m
   * - 224
     - Pn-3m
     - 6d
     - -42.m
   * - 224
     - Pn-3m
     - 4c
     - .-3m
   * - 224
     - Pn-3m
     - 4b
     - .-3m
   * - 224
     - Pn-3m
     - 2a
     - -43m
   * - 225
     - Fm-3m
     - 192l
     - 1
   * - 225
     - Fm-3m
     - 96k
     - ..m
   * - 225
     - Fm-3m
     - 96j
     - m..
   * - 225
     - Fm-3m
     - 48i
     - m.m2
   * - 225
     - Fm-3m
     - 48h
     - m.m2
   * - 225
     - Fm-3m
     - 48g
     - 2.mm
   * - 225
     - Fm-3m
     - 32f
     - .3m
   * - 225
     - Fm-3m
     - 24e
     - 4m.m
   * - 225
     - Fm-3m
     - 24d
     - m.mm
   * - 225
     - Fm-3m
     - 8c
     - -43m
   * - 225
     - Fm-3m
     - 4b
     - m-3m
   * - 225
     - Fm-3m
     - 4a
     - m-3m
   * - 226
     - Fm-3c
     - 192j
     - 1
   * - 226
     - Fm-3c
     - 96i
     - m..
   * - 226
     - Fm-3c
     - 96h
     - ..2
   * - 226
     - Fm-3c
     - 64g
     - .3.
   * - 226
     - Fm-3c
     - 48f
     - 4..
   * - 226
     - Fm-3c
     - 48e
     - mm2..
   * - 226
     - Fm-3c
     - 24d
     - 4/m..
   * - 226
     - Fm-3c
     - 24c
     - -4m.2
   * - 226
     - Fm-3c
     - 8b
     - m-3.
   * - 226
     - Fm-3c
     - 8a
     - 432
   * - 227
     - Fd-3m
     - 192i
     - 1
   * - 227
     - Fd-3m
     - 96h
     - ..2
   * - 227
     - Fd-3m
     - 96g
     - ..m
   * - 227
     - Fd-3m
     - 48f
     - 2.mm
   * - 227
     - Fd-3m
     - 32e
     - .3m
   * - 227
     - Fd-3m
     - 16d
     - .-3m
   * - 227
     - Fd-3m
     - 16c
     - .-3m
   * - 227
     - Fd-3m
     - 8b
     - -43m
   * - 227
     - Fd-3m
     - 8a
     - -43m
   * - 228
     - Fd-3c
     - 192h
     - 1
   * - 228
     - Fd-3c
     - 96g
     - ..2
   * - 228
     - Fd-3c
     - 96f
     - 2..
   * - 228
     - Fd-3c
     - 64e
     - .3.
   * - 228
     - Fd-3c
     - 48d
     - -4..
   * - 228
     - Fd-3c
     - 32c
     - .-3.
   * - 228
     - Fd-3c
     - 32b
     - .32
   * - 228
     - Fd-3c
     - 16a
     - 23.\
   * - 229
     - Im-3m
     - 96l
     - 1
   * - 229
     - Im-3m
     - 48k
     - ..m
   * - 229
     - Im-3m
     - 48j
     - m..
   * - 229
     - Im-3m
     - 48i
     - ..2
   * - 229
     - Im-3m
     - 24h
     - m.m2
   * - 229
     - Im-3m
     - 24g
     - mm2..
   * - 229
     - Im-3m
     - 16f
     - .3m
   * - 229
     - Im-3m
     - 12e
     - 4m.m
   * - 229
     - Im-3m
     - 12d
     - -4m.2
   * - 229
     - Im-3m
     - 8c
     - .-3m
   * - 229
     - Im-3m
     - 6b
     - 4/mm.m
   * - 229
     - Im-3m
     - 2a
     - m-3m
   * - 230
     - Ia-3d
     - 96h
     - 1
   * - 230
     - Ia-3d
     - 48g
     - ..2
   * - 230
     - Ia-3d
     - 48f
     - 2..
   * - 230
     - Ia-3d
     - 32e
     - .3.
   * - 230
     - Ia-3d
     - 24d
     - -4..
   * - 230
     - Ia-3d
     - 24c
     - 2.22
   * - 230
     - Ia-3d
     - 16b
     - .32
   * - 230
     - Ia-3d
     - 16a
     - .-3.

References
----------

For the use of this function, please cite the following paper.

::

    @inproceedings{levy2024symmcd,
    title={Symm{CD}: Symmetry-Preserving Crystal Generation with Diffusion Models},
    author={Daniel Levy and Siba Smarak Panigrahi and S{\'e}kou-Oumar Kaba and Qiang Zhu and Mikhail Galkin and Santiago Miret and Siamak Ravanbakhsh},
    booktitle={AI for Accelerated Materials Design - NeurIPS 2024},
    year={2024},
    url={https://openreview.net/forum?id=V7x2KZQn2v}
    }


================================================
FILE: doc/Usage.rst
================================================
PyXtal as a library
===================

While the PyXtal can be used in the command mode, it can become much more
powerful with Python scripting. Here we describe the basic functionality of
PyXtal as a Python Library. This tutorial aims to cover the following contents:

- Built-in PyXtal tools
- Crystal structure generation
- Crystal structure manipulation


Available Tools in PyXtal
-------------------------

PyXtal includes the following functions:

- `Group <pyxtal.symmetry.html#pyxtal.symmetry.Group>`_
- `Wyckoff_position <pyxtal.symmetry.html#pyxtal.symmetry.Wyckoff_position>`_
- `pyxtal_molecule <pyxtal.molecule.html#pyxtal.molecule.pyxtal_molecule>`_
- `Lattice <pyxtal.lattice.html#pyxtal.lattice.Lattice>`_
- `Tol_matrix <pyxtal.tolerance.html#pyxtal.tolerance.Tol_matrix>`_

pyxtal.symmetry.Group
~~~~~~~~~~~~~~~~~~~~~

The Group package makes working with symmetry groups simple. Useful information
can be accessed directly as follows:

.. code-block:: Python

    >>> from pyxtal.symmetry import Group
    >>> g = Group(45)
    >>> g
    -- Space group # 45 --
      8c	site symm: 1
      4b	site symm: ..2
      4a	site symm: ..2
    >>> g.chiral   # check if the space group is enantiomorphic
    False
    >>> g.inversion #check if it has inversion symmetry
    False
    >>> g.polar #check if it is polar
    True


It is important to note that one space group may have multiple settings (see the
`Settings <Settings.html>`_ page for details). To avoid the ambiguity, Hall
introduced the explicit-origin space group notation. Following the Hall notation,
there exist 530 Concise space groups. The full list is available
`online <http://cci.lbl.gov/sginfo/itvb_2001_table_a1427_hall_symbols.html>`_.
In PyXtal, we also the initialization of space group according to Hall number.
Below shows an example to create the Group object of ``Fd-3m (227)``
with the choice 1 of origin.

.. code-block:: Python

    >>> g = Group(525, use_hall=True)
    >>> g.symbol
    'F d -3 m:1'
    >>> g[-1]
    Wyckoff position 8a in space group 227 with site symmetry -4 33 mm
    1/4, 1/4, 1/4
    ...
    1/2, 0, 1/2

For a comparison, we also show ``Fd-3m (227)`` in the standard setting of
with the choice 2 of origin. These two notations only differ in
which symmetry point is placed at (0,0,0).

.. code-block:: Python

    >>> g = Group(526, use_hall=True)
    >>> g.symbol
    'F d -3 m:2'
    >>> g[-1]
    Wyckoff position 8a in space group 227 with site symmetry -4 33 mm
    1/8, 1/8, 1/8
    ...
    3/8, 7/8, 3/8


If one wants to follow the spglib style to initialize the Group object, the
following way should work,

.. code-block:: Python

    >>> g = Group(227, style='spglib')
    >>> g.hall_number
    525


Layer, rod, and point groups can be accessed by passing the parameter ```dim=2``,
``dim=1``, or ``dim=0``, respectively.

.. code-block:: Python

    >>> Group(5, dim=2)
    -- Layer group # 5 --
      2a	site symm: 1
    >>> Group(5, dim=1)
    -- Rod group # 5 --
      2a	site symm: 1
    >>> Group(5, dim=0)
    -- Point group 5 --
      4d	site symm: 1
      2c	site symm: m . .
      2b	site symm: 2 . .
      1a	site symm: 2/m . .

A Group instance contains the Wyckoff positions, site symmetry, and generators
for the group. In addition, the Group class stores the lattice type
(``lattice_type``), international number (``number``), symbol (``symbol``),
and the periodic boundary conditions (``PBC``). Each group is divided into
Wyckoff positions, which are sets of points which possess some subset of the
complete group symmetry.


pyxtal.symmetry.Wyckoff_position
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

A Wyckoff position is typically denoted with a number-letter combination,
depending on its multiplicity. For example, for space group ``Iba2 (45)``,
the general Wyckoff position is called ``8c``. This means the position has
a multiplicity of 8. The letters ``a`` and ``b`` are used by special Wyckoff
positions. Note that the name convention is different for point groups; a point
group may have the special Wyckoff position ``1o``, which corresponds to the point
(0,0,0). This is in contrast to the default name ``1a``. Each Wyckoff position
is further separated into individual operations
``('-x,-y,z', '1,1/2,z+1/2', etc.)``.

When a ``Group`` is defined, its ``Wyckoff_position`` can be accessed
with either a numerical index or letter.

.. code-block:: Python

    >>> g[0]
    Wyckoff position 8c in space group 45 with site symmetry 1
    x, y, z
    -x, -y, z
    ...
    x+1, -y+1, z+1/2
    -x+1, y+1, z+1/2
    >>> g['b']
    Wyckoff position 4b in space group 45 with site symmetry ..2
    0, 1/2, z
    ...
    1, 1/2, z+1/2

As displayed in the example above, the Wyckoff position ``4b`` has site symmetry
``..2``. In this example, ``.`` denotes no symmetry about the x and y axes, and
``2`` denotes a 2-fold rotation about the z axis in Hermann-Mauguin notation.
In each WP, the symmetry operations are stored as
`SymmOp <http://pymatgen.org/pymatgen.core.operations.html>`_ objects. These
symmetry operations can be applied to 3d vectors using ``op.operate``, or can be
composed together via multiplication: ``op3 = op1 * op2``. Each ``SymmOp``
consists of a rotation matrix (``op.rotation_matrix``) and a translation vector
(``op.translation_vector``), and is represented by a 4 x 4 affine
matrix (``op.affine_matrix``).

Alternatively, the WP can be initialized by itself.

.. code-block:: Python

    >>> from pyxtal.symmetry import Wyckoff_position as wp
    >>> wp.from_group_and_index(19, 0)
    Wyckoff position 4a in space group 19 with site symmetry 1
    x, y, z
    -x+1/2, -y, z+1/2
    -x, y+1/2, -z+1/2
    x+1/2, -y+1/2, -z




pyxtal.molecule.pyxtal_molecule
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

There are three options for defining molecules within Pyxtal. First, you need to
import the ``pyxtal_molecule`` class,

.. code-block:: Python

    from pyxtal.molecule import pyxtal_molecule


1) From a pre-defined string for the chemical composition

.. code-block:: Python

    mol = pyxtal_molecule('H2O')

The list of supported molecules are accessible via:

.. code-block:: Python

    >>> pyxtal_molecule.list_molecules()
    >>> ['C60', 'Glycine-z', 'xxvi', 'xxv', 'BIPHEN', 'ANULEN',
    'QUPHEN', 'DBPERY', 'TBZPER', 'TBZPYR', 'YICMOP', 'MERQIM',
    'H2O', 'CH4', 'NH3', 'benzene', 'naphthalene', 'anthracene',
    'tetracene', 'Pentacene', 'coumarin', 'resorcinol', 'benzamide',
    'aspirin', 'ddt', 'lindane', 'Glycine', 'Glucose', 'ROY', 'LEFCIK',
    'OFIXUX', 'HAHCOI', 'JAPWIH', 'WEXBOS', 'LAGNAL', 'LUFHAW',
    'PAHYON01', 'AXOSOW01']


2) From a `Molecule <http://pymatgen.org/pymatgen.core.structure.html>`_ object.

.. code-block:: Python

    from pymatgen.core import Molecule

    xyz="""3
    Water molecule
    O          0.00000        0.00000        0.11779
    H          0.00000        0.75545       -0.47116
    H          0.00000       -0.75545       -0.47116
    """

    m = Molecule.from_str(xyz, fmt='xyz')
    mol = pyxtal_molecule(m)


    # Alternatively, one can load a xyz molecule file.
    # It will be converted to pymatgen.molecule and then passed to pyxtal.
    mol = pyxtal_molecule('h2o.xyz')


3) a smile string representing the molecule. For example, ``C1=CC=CC=C1.smi``
means a benzene molecule. Note that the `.smi` suffix must be included to
indicate that this is a smile string. In this case, **RDKit must be installed
to use this function.**. One can install RDKit by simply typing

``$ conda install -c conda-forge rdkit==2021.09.2``.

Note that the current code is designed for version no later than ``2021.09.2``.

.. code-block:: Python

    mol = pyxtal_molecule('CC(=O)NC1=CC=CC=C1C(=O)N.smi')


After the molecule is defined, its point group will also be parsed:

.. code-block:: Python

    mol = pyxtal_molecule('H2O')
    print(mol.pg)

::

    -- Pointgroup --# 7 (C2v)--
    4d	site symm: 1
    2c	site symm: m . .
    2b	site symm: m . .
    1a	site symm: mm2 . .


pyxtal.lattice.Lattice
~~~~~~~~~~~~~~~~~~~~~~

It is possible to supply your own unit cell lattice for a random crystal,
via the `pyxtal.lattice.Lattice <pyxtal.lattice.html>`_ class. You can define a lattice using
either a 3 x 3 matrix, or 6 cell parameters:

.. code-block:: Python

    from pyxtal.lattice import Lattice
    l1 = Lattice.from_matrix([[4.08,0,0],[0,9.13,0],[0,0,5.50]])
    l2 = Lattice.from_para(4.08, 9.13, 5.50, 90, 90, 90)

Here, both ``l1`` and ``l2`` describe the same lattice.
In this case, it is an orthorhombic cell with lengths 4.08, 9.13, and 5.50 Å,
which is the unit cell for common water ice. The lattice parameters are,
in order: (a, b, c, :math:`\alpha, \beta, \gamma`).
a, b, and c are the lengths of the lattice vectors;
:math:`\alpha, \beta, \gamma` are the angles in degrees between these vectors.


pyxtal.tolerance.Tol_matrix
~~~~~~~~~~~~~~~~~~~~~~~~~~~

When generating random crystals, PyXtal performs inter-atomic distances checks
to make sure the atoms are not too close together. By default, the covalent
radius is used as a basis. However, the user may also define their own criteria
using the `pyxtal.tolerance.Tol_matrix <pyxtal.tolerance.html>`_ class.
To do this, initialize a ``Tol_matrix`` object using one of the built-in methods.

.. code-block:: Python

    from pyxtal.tolerance import Tol_matrix
    tol_m_1 = Tol_matrix(prototype="molecular", factor=2.0)
    tol_m_2 = Tol_matrix.from_radii(some_custom_list_of_atomic_radii)
    tol_m_3 = Tol_matrix.from_matrix(some_custom_2D_tolerance_matrix)



Crystal structure generation
----------------------------
PyXtal allows one to generate the crystal from either the existing structure or
from the scratch. First, One can always load an existing crystal from a given
file path. More importantly, PyXtal can generate the trial structure according
to the customized factors such as space group, cell parameters, partial
occupation. It also supports on handling different systems from atomic to
molecular, and from 1D to 3D.

Loading the existing structures
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Assuming there is a file in either cif or VASP POSCAR format, one can just
load the structure by the ``from_seed`` function.

.. code-block:: Python

    from pyxtal import pyxtal
    my_crystal = pyxtal()

    my_crystal.from_seed(seed=struc_file, style='pyxtal')
    
Download .txt
gitextract_ogx3exmn/

├── .gitattributes
├── .github/
│   └── workflows/
│       ├── python-publish.yml
│       └── tests.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .readthedocs.yaml
├── LICENSE.txt
├── MANIFEST.in
├── README.md
├── SECURITY.md
├── _config.yml
├── doc/
│   ├── Algorithm.rst
│   ├── Background.rst
│   ├── COMMAND_MODE.rst
│   ├── Installation.rst
│   ├── Makefile
│   ├── README.txt
│   ├── Settings.rst
│   ├── Symmetry_representation.rst
│   ├── Usage.rst
│   ├── conf.py
│   ├── files/
│   │   └── all.cif
│   ├── index.rst
│   ├── make.bat
│   ├── modules.rst
│   ├── pyxtal.XRD.rst
│   ├── pyxtal.block_crystal.rst
│   ├── pyxtal.constants.rst
│   ├── pyxtal.crystal.rst
│   ├── pyxtal.database.cifs.rst
│   ├── pyxtal.database.collection.rst
│   ├── pyxtal.database.element.rst
│   ├── pyxtal.database.rst
│   ├── pyxtal.db.rst
│   ├── pyxtal.descriptor.rst
│   ├── pyxtal.elasticity.rst
│   ├── pyxtal.interface.LJ.rst
│   ├── pyxtal.interface.ase_opt.rst
│   ├── pyxtal.interface.charmm.rst
│   ├── pyxtal.interface.dftb.rst
│   ├── pyxtal.interface.gulp.rst
│   ├── pyxtal.interface.lammpslib.rst
│   ├── pyxtal.interface.rst
│   ├── pyxtal.interface.vasp.rst
│   ├── pyxtal.io.rst
│   ├── pyxtal.lattice.rst
│   ├── pyxtal.lego.SO3.rst
│   ├── pyxtal.lego.basinhopping.rst
│   ├── pyxtal.lego.builder.rst
│   ├── pyxtal.lego.rst
│   ├── pyxtal.molecular_crystal.rst
│   ├── pyxtal.molecule.rst
│   ├── pyxtal.msg.rst
│   ├── pyxtal.operations.rst
│   ├── pyxtal.optimize.DFS.rst
│   ├── pyxtal.optimize.QRS.rst
│   ├── pyxtal.optimize.WFS.rst
│   ├── pyxtal.optimize.base.rst
│   ├── pyxtal.optimize.benchmark.rst
│   ├── pyxtal.optimize.common.rst
│   ├── pyxtal.optimize.rst
│   ├── pyxtal.plane.rst
│   ├── pyxtal.potentials.LJ_cluster.rst
│   ├── pyxtal.potentials.rst
│   ├── pyxtal.representation.rst
│   ├── pyxtal.rst
│   ├── pyxtal.supergroup.rst
│   ├── pyxtal.symmetry.rst
│   ├── pyxtal.tolerance.rst
│   ├── pyxtal.util.rst
│   ├── pyxtal.version.rst
│   ├── pyxtal.viz.rst
│   ├── pyxtal.wyckoff_site.rst
│   ├── pyxtal.wyckoff_split.rst
│   └── requirements.txt
├── examples/
│   ├── README.md
│   ├── example_00_LJ_simple.py
│   ├── example_01_3D_VASP.py
│   ├── example_02_LJ_cluster.py
│   ├── example_03_LJ_optalg.py
│   ├── example_04_LJ_38.py
│   ├── example_05_LJ_4D.py
│   ├── example_06_C_2D_lammps.py
│   ├── example_07_3D_ICE_lammps.py
│   ├── test_installation.py
│   └── tutorials_notebook/
│       ├── 01_atomic_crystals.ipynb
│       ├── 02_molecular_crystals.ipynb
│       ├── 03_pxrd.ipynb
│       ├── 04_box.ipynb
│       ├── 05-crystal-packing.ipynb
│       ├── ABAVUW.cif
│       ├── aspirin.cif
│       └── lt_quartz.cif
├── flask/
│   ├── .flaskenv
│   ├── README.md
│   ├── app/
│   │   ├── __init__.py
│   │   ├── errors.py
│   │   ├── forms.py
│   │   ├── routes.py
│   │   ├── static/
│   │   │   ├── css/
│   │   │   │   └── custom.css
│   │   │   └── jsmol.js
│   │   └── templates/
│   │       ├── 404.html
│   │       ├── 500.html
│   │       ├── _formhelpers.html
│   │       ├── base.html
│   │       ├── comparison.html
│   │       ├── index.html
│   │       ├── individual.html
│   │       └── scratch.html
│   ├── config.py
│   ├── instance/
│   │   └── uploads/
│   │       ├── C1-POSCAR
│   │       ├── NaCl-POSCAR
│   │       ├── NaCl.cif
│   │       ├── R3c-POSCAR
│   │       └── fail_test.txt
│   ├── requirements.txt
│   └── vxrd.py
├── images/
│   └── Logo license.txt
├── pyproject.toml
├── pyxtal/
│   ├── XRD.py
│   ├── XRD_indexer.py
│   ├── __init__.py
│   ├── asu_constraints.py
│   ├── block_crystal.py
│   ├── constants.py
│   ├── crystal.py
│   ├── database/
│   │   ├── HM_Full.csv
│   │   ├── __init__.py
│   │   ├── asymmetric_unit.txt
│   │   ├── atomic_scattering_params.json
│   │   ├── bonds.json
│   │   ├── bug.json
│   │   ├── cifs/
│   │   │   ├── 0-G62.cif
│   │   │   ├── 1-G59.cif
│   │   │   ├── 191.vasp
│   │   │   ├── 2-G71.cif
│   │   │   ├── 3-G139.cif
│   │   │   ├── 4-G225.cif
│   │   │   ├── ACBNZA01.cif
│   │   │   ├── AXOSOW01.cif
│   │   │   ├── Al2SiO5_mp-4753_symmetrized.cif
│   │   │   ├── BTO-Amm2.cif
│   │   │   ├── BTO.cif
│   │   │   ├── FAU.cif
│   │   │   ├── Fd3.cif
│   │   │   ├── Fd3.vasp
│   │   │   ├── Fd3m.cif
│   │   │   ├── GUMMUW.cif
│   │   │   ├── GeF2.cif
│   │   │   ├── HAHCOI.cif
│   │   │   ├── I41amd.vasp
│   │   │   ├── I4_132.cif
│   │   │   ├── JAPWIH.cif
│   │   │   ├── JVASP-119184.cif
│   │   │   ├── JVASP-119739.cif
│   │   │   ├── JVASP-141590.cif
│   │   │   ├── JVASP-25063.cif
│   │   │   ├── JVASP-28565.cif
│   │   │   ├── JVASP-28634.cif
│   │   │   ├── JVASP-36885.cif
│   │   │   ├── JVASP-37583.cif
│   │   │   ├── JVASP-42300.cif
│   │   │   ├── JVASP-43424.cif
│   │   │   ├── JVASP-45907.cif
│   │   │   ├── JVASP-47532.cif
│   │   │   ├── JVASP-50935.cif
│   │   │   ├── JVASP-59313.cif
│   │   │   ├── JVASP-62168.cif
│   │   │   ├── JVASP-85365.cif
│   │   │   ├── JVASP-86205.cif
│   │   │   ├── JVASP-97915.cif
│   │   │   ├── JVASP-98225.cif
│   │   │   ├── LAGNAL.cif
│   │   │   ├── LUFHAW.cif
│   │   │   ├── LiCs.cif
│   │   │   ├── MERQIM.cif
│   │   │   ├── MPWO.cif
│   │   │   ├── NaCl.cif
│   │   │   ├── NaSb3F10.cif
│   │   │   ├── NbO2.cif
│   │   │   ├── NiS-Cm.cif
│   │   │   ├── P3_112.cif
│   │   │   ├── P4_332.cif
│   │   │   ├── P4nmm.vasp
│   │   │   ├── P6_422.cif
│   │   │   ├── PAHYON01.cif
│   │   │   ├── PPO.cif
│   │   │   ├── PVO.cif
│   │   │   ├── Pm3.cif
│   │   │   ├── Pmmn.vasp
│   │   │   ├── Pn3.vasp
│   │   │   ├── Pn3m.vasp
│   │   │   ├── R-3.cif
│   │   │   ├── R-3c.cif
│   │   │   ├── R32.cif
│   │   │   ├── TMPPIO03.cif
│   │   │   ├── WEXBOS.cif
│   │   │   ├── YICMOP.cif
│   │   │   ├── __init__.py
│   │   │   ├── anthracene.cif
│   │   │   ├── aspirin-c.cif
│   │   │   ├── aspirin.cif
│   │   │   ├── benzene.cif
│   │   │   ├── bug.vasp
│   │   │   ├── c_bug.vasp
│   │   │   ├── c_bug2.vasp
│   │   │   ├── coumarin.cif
│   │   │   ├── dist_6_0.cif
│   │   │   ├── dist_6_1.cif
│   │   │   ├── gdh.cif
│   │   │   ├── ht_KNbBO.cif
│   │   │   ├── ht_cristobalite.cif
│   │   │   ├── ht_quartz.cif
│   │   │   ├── ice.cif
│   │   │   ├── lt_KNbBO.cif
│   │   │   ├── lt_cristobalite.cif
│   │   │   ├── lt_quartz.cif
│   │   │   ├── naphthalene.cif
│   │   │   ├── resorcinol.cif
│   │   │   ├── sim-0.vasp
│   │   │   ├── sim-1.vasp
│   │   │   └── xxvi.cif
│   │   ├── clusters.json
│   │   ├── collection.py
│   │   ├── element.py
│   │   ├── k_subgroup.json
│   │   ├── layer.csv
│   │   ├── layer_generators.csv
│   │   ├── layer_symmetry.csv
│   │   ├── molecules.json
│   │   ├── packing-analysis/
│   │   │   ├── ACETYL02.cif
│   │   │   ├── ADAMAN08.cif
│   │   │   ├── CONGRS.cif
│   │   │   ├── DNNAPH.cif
│   │   │   ├── HCCYHB.cif
│   │   │   ├── HCLBNZ.cif
│   │   │   ├── HXMTAM.cif
│   │   │   ├── PNDMAM10.cif
│   │   │   └── ZZZWOU01.cif
│   │   ├── point.csv
│   │   ├── point_generators.csv
│   │   ├── point_symmetry.csv
│   │   ├── rod.csv
│   │   ├── rod_generators.csv
│   │   ├── rod_symmetry.csv
│   │   ├── spg_num_wps_aug.csv
│   │   ├── spg_num_wps_mp.csv
│   │   ├── spg_num_wps_raw.csv
│   │   ├── symbols.json
│   │   ├── t_subgroup.json
│   │   ├── test.cif
│   │   ├── wyckoff_generators.csv
│   │   ├── wyckoff_list.csv
│   │   ├── wyckoff_sets.json
│   │   └── wyckoff_symmetry.csv
│   ├── db.py
│   ├── descriptor.py
│   ├── elasticity.py
│   ├── interface/
│   │   ├── Installation.md
│   │   ├── LATTE_templates/
│   │   │   ├── MDcontroller
│   │   │   ├── TBparam/
│   │   │   │   ├── bondints.nonortho
│   │   │   │   ├── control.in
│   │   │   │   ├── control.in.bak
│   │   │   │   ├── ppots.nonortho
│   │   │   │   └── ppotsplusD.nonortho
│   │   │   ├── alpha_match.cif
│   │   │   ├── latte_calc.py
│   │   │   └── test.py
│   │   ├── LJ.py
│   │   ├── __init__.py
│   │   ├── ase_opt.py
│   │   ├── ase_opt2.py
│   │   ├── charmm.py
│   │   ├── dftb.py
│   │   ├── gulp.py
│   │   ├── lammpslib.py
│   │   ├── latte_calculator.py
│   │   └── vasp.py
│   ├── io.py
│   ├── lattice.py
│   ├── lego/
│   │   ├── SO3.py
│   │   ├── __init__.py
│   │   ├── basinhopping.py
│   │   ├── builder.py
│   │   └── util.py
│   ├── miscellaneous/
│   │   ├── 2datomic.py
│   │   ├── 2dmolecular.py
│   │   ├── LJ_bug.py
│   │   ├── RECP/
│   │   │   ├── dia.py
│   │   │   ├── test0.py
│   │   │   └── test1.py
│   │   ├── Random_vasp_ase.py
│   │   ├── bug_2_components.py
│   │   ├── bug_spglib.py
│   │   ├── bugs/
│   │   │   ├── bug.py
│   │   │   └── bug.vasp
│   │   ├── c60.py
│   │   ├── check_cluster_distances.py
│   │   ├── check_rotation.py
│   │   ├── check_wyckoff_generators.py
│   │   ├── cifs/
│   │   │   ├── A2=a.cif
│   │   │   ├── A2=m.cif
│   │   │   ├── Aa.cif
│   │   │   ├── Aba2.cif
│   │   │   ├── Abmm.cif
│   │   │   ├── Acam.cif
│   │   │   ├── Acmm-1.cif
│   │   │   ├── Acmm.cif
│   │   │   ├── Ama2.cif
│   │   │   ├── Amam.cif
│   │   │   ├── Amm2.cif
│   │   │   ├── Amma.cif
│   │   │   ├── B2=b.cif
│   │   │   ├── B2_1=d.cif
│   │   │   ├── Bb2_1m.cif
│   │   │   ├── Bbmm.cif
│   │   │   ├── Bmab.cif
│   │   │   ├── Bmmb.cif
│   │   │   ├── C-1.cif
│   │   │   ├── C-42b.cif
│   │   │   ├── C2.cif
│   │   │   ├── C222.cif
│   │   │   ├── C222_1.cif
│   │   │   ├── C2=c.cif
│   │   │   ├── C2=m.cif
│   │   │   ├── Cc.cif
│   │   │   ├── Ccca.cif
│   │   │   ├── Cccm.cif
│   │   │   ├── Ccm2_1.cif
│   │   │   ├── Ccmb.cif
│   │   │   ├── Ccmm.cif
│   │   │   ├── Cm.cif
│   │   │   ├── Cmc2_1.cif
│   │   │   ├── Cmca.cif
│   │   │   ├── Cmcm.cif
│   │   │   ├── Cmm2.cif
│   │   │   ├── Cmma.cif
│   │   │   ├── Cmmm.cif
│   │   │   ├── F-43m.cif
│   │   │   ├── F1.cif
│   │   │   ├── F2.cif
│   │   │   ├── Fd-3m.cif
│   │   │   ├── Fd.cif
│   │   │   ├── Fdd2.cif
│   │   │   ├── Fddd.cif
│   │   │   ├── Fm-3m.cif
│   │   │   ├── Fm3m.cif
│   │   │   ├── Fmmm.cif
│   │   │   ├── I-4.cif
│   │   │   ├── I-42d.cif
│   │   │   ├── I-42m.cif
│   │   │   ├── I-43m.cif
│   │   │   ├── I-4c2.cif
│   │   │   ├── I-4m2.cif
│   │   │   ├── I2=a.cif
│   │   │   ├── I2=b.cif
│   │   │   ├── I2=c.cif
│   │   │   ├── I2=m.cif
│   │   │   ├── I2_12_12_1.cif
│   │   │   ├── I2_13.cif
│   │   │   ├── I2_1=a-3.cif
│   │   │   ├── I2cm.cif
│   │   │   ├── I2mb.cif
│   │   │   ├── I4=m.cif
│   │   │   ├── I4=mcm.cif
│   │   │   ├── I4=mmm.cif
│   │   │   ├── I4_122.cif
│   │   │   ├── I4_1=a.cif
│   │   │   ├── I4_1=amd.cif
│   │   │   ├── Ia-3d.cif
│   │   │   ├── Ia3.cif
│   │   │   ├── Ia3d.cif
│   │   │   ├── Iba2.cif
│   │   │   ├── Ibam.cif
│   │   │   ├── Im-3m.cif
│   │   │   ├── Im.cif
│   │   │   ├── Im2m.cif
│   │   │   ├── Im3.cif
│   │   │   ├── Ima2.cif
│   │   │   ├── Imam.cif
│   │   │   ├── Imm2.cif
│   │   │   ├── Imma.cif
│   │   │   ├── Immm.cif
│   │   │   ├── P-3.cif
│   │   │   ├── P-31c.cif
│   │   │   ├── P-31m.cif
│   │   │   ├── P-3c1.cif
│   │   │   ├── P-3m1.cif
│   │   │   ├── P-4.cif
│   │   │   ├── P-42_1c.cif
│   │   │   ├── P-42_1m.cif
│   │   │   ├── P-42c.cif
│   │   │   ├── P-42m.cif
│   │   │   ├── P-43m.cif
│   │   │   ├── P-43n.cif
│   │   │   ├── P-4b2.cif
│   │   │   ├── P-4m2.cif
│   │   │   ├── P-4n2.cif
│   │   │   ├── P-6.cif
│   │   │   ├── P-62c.cif
│   │   │   ├── P-62m.cif
│   │   │   ├── P-6c2.cif
│   │   │   ├── P-6m2.cif
│   │   │   ├── P23.cif
│   │   │   ├── P2=a.cif
│   │   │   ├── P2=b.cif
│   │   │   ├── P2=c.cif
│   │   │   ├── P2=m.cif
│   │   │   ├── P2_1.cif
│   │   │   ├── P2_122_1.cif
│   │   │   ├── P2_12_12.cif
│   │   │   ├── P2_12_12_1.cif
│   │   │   ├── P2_13.cif
│   │   │   ├── P2_1ca.cif
│   │   │   ├── P2_1cn.cif
│   │   │   ├── P2_1nm.cif
│   │   │   ├── P312.cif
│   │   │   ├── P31c.cif
│   │   │   ├── P31m.cif
│   │   │   ├── P321.cif
│   │   │   ├── P3_121.cif
│   │   │   ├── P3_221.cif
│   │   │   ├── P4.cif
│   │   │   ├── P42_12.cif
│   │   │   ├── P4=mbm.cif
│   │   │   ├── P4=mmm.cif
│   │   │   ├── P4=mnc.cif
│   │   │   ├── P4=n.cif
│   │   │   ├── P4=ncc.cif
│   │   │   ├── P4=nmm.cif
│   │   │   ├── P4=nnc.cif
│   │   │   ├── P4_122.cif
│   │   │   ├── P4_132.cif
│   │   │   ├── P4_232.cif
│   │   │   ├── P4_2=m.cif
│   │   │   ├── P4_2=mbc.cif
│   │   │   ├── P4_2=mnm.cif
│   │   │   ├── P4_2=n.cif
│   │   │   ├── P4_2=ncm.cif
│   │   │   ├── P4_2=nmc.cif
│   │   │   ├── P4_2=nnm.cif
│   │   │   ├── P4_2nm.cif
│   │   │   ├── P4_322.cif
│   │   │   ├── P4_32_12.cif
│   │   │   ├── P4bm.cif
│   │   │   ├── P4mm.cif
│   │   │   ├── P622.cif
│   │   │   ├── P6=mcc.cif
│   │   │   ├── P6=mmm.cif
│   │   │   ├── P6_222.cif
│   │   │   ├── P6_3.cif
│   │   │   ├── P6_322.cif
│   │   │   ├── P6_3=m.cif
│   │   │   ├── P6_3=mcm.cif
│   │   │   ├── P6_3=mmc.cif
│   │   │   ├── P6_3cm.cif
│   │   │   ├── P6_3mc.cif
│   │   │   ├── Pa3.cif
│   │   │   ├── Pbam.cif
│   │   │   ├── Pban.cif
│   │   │   ├── Pbc2_1.cif
│   │   │   ├── Pbca.cif
│   │   │   ├── Pbcm.cif
│   │   │   ├── Pbcn.cif
│   │   │   ├── Pbma.cif
│   │   │   ├── Pbmn.cif
│   │   │   ├── Pbn2_1.cif
│   │   │   ├── Pbnm.cif
│   │   │   ├── Pbnn.cif
│   │   │   ├── Pca2_1.cif
│   │   │   ├── Pcab.cif
│   │   │   ├── Pcam.cif
│   │   │   ├── Pcca.cif
│   │   │   ├── Pccn.cif
│   │   │   ├── Pcmb.cif
│   │   │   ├── Pcmn.cif
│   │   │   ├── Pcnb.cif
│   │   │   ├── Pm.cif
│   │   │   ├── Pm3m.cif
│   │   │   ├── Pm3n.cif
│   │   │   ├── Pma2.cif
│   │   │   ├── Pmab.cif
│   │   │   ├── Pman.cif
│   │   │   ├── Pmc2_1.cif
│   │   │   ├── Pmcn.cif
│   │   │   ├── Pmm2.cif
│   │   │   ├── Pmma.cif
│   │   │   ├── Pmmm.cif
│   │   │   ├── Pmmn.cif
│   │   │   ├── Pmn2_1.cif
│   │   │   ├── Pmna.cif
│   │   │   ├── Pmnb.cif
│   │   │   ├── Pmnm.cif
│   │   │   ├── Pmnn.cif
│   │   │   ├── Pn2_1m.cif
│   │   │   ├── Pn3m.cif
│   │   │   ├── Pna2_1.cif
│   │   │   ├── Pnam.cif
│   │   │   ├── Pnca.cif
│   │   │   ├── Pncn.cif
│   │   │   ├── Pnm2_1.cif
│   │   │   ├── Pnma.cif
│   │   │   ├── Pnmn.cif
│   │   │   ├── Pnn2.cif
│   │   │   ├── Pnna.cif
│   │   │   ├── R-3m.cif
│   │   │   ├── R3.cif
│   │   │   ├── R3c.cif
│   │   │   └── R3m.cif
│   │   ├── compatibility.py
│   │   ├── create_generators.py
│   │   ├── debug_charmm.py
│   │   ├── distance_bug.py
│   │   ├── extra_test.py
│   │   ├── flow.py
│   │   ├── from_ase_molecule.py
│   │   ├── generate_mol_symm.py
│   │   ├── generate_site_symm.py
│   │   ├── get_lj_cluster.py
│   │   ├── get_molecule_from_pubchem.py
│   │   ├── grid.py
│   │   ├── gulp_c.py
│   │   ├── heavy_check.py
│   │   ├── mol.py
│   │   ├── regen_wyckoffs_list.py
│   │   ├── search_csd_from_pubchem.py
│   │   ├── speed.py
│   │   ├── subgroup_data.py
│   │   ├── test.py
│   │   ├── test_1d_rep.py
│   │   ├── test_3D_molecule.py
│   │   ├── test_CSD.py
│   │   ├── test_all.py
│   │   ├── test_atom_mole.py
│   │   ├── test_db.py
│   │   ├── test_euclidean.py
│   │   ├── test_generators.py
│   │   ├── test_get_csd.py
│   │   ├── test_matrix.py
│   │   ├── test_read.py
│   │   ├── test_site_symm.py
│   │   ├── test_smile.py
│   │   ├── test_spgs.py
│   │   ├── test_subgroup.py
│   │   ├── test_subgroup2.py
│   │   ├── test_supergroup.py
│   │   ├── test_symmetry_rep.py
│   │   ├── test_torsion.py
│   │   ├── test_wp.py
│   │   ├── test_wyckoff_check.py
│   │   ├── test_xrd.py
│   │   ├── web_scalping_script/
│   │   │   ├── README.md
│   │   │   ├── pubchem_import.py
│   │   │   └── requirements.txt
│   │   ├── xrd.py
│   │   └── xrd_comp.py
│   ├── molecular_crystal.py
│   ├── molecule.py
│   ├── msg.py
│   ├── operations.py
│   ├── optimize/
│   │   ├── DFS.py
│   │   ├── QRS.py
│   │   ├── WFS.py
│   │   ├── __init__.py
│   │   ├── base.py
│   │   ├── benchmark.py
│   │   └── common.py
│   ├── plane.py
│   ├── potentials/
│   │   ├── CuAg.eam.alloy
│   │   ├── LJ_cluster.py
│   │   ├── Si.tersoff
│   │   ├── SiCGe.tersoff
│   │   └── __init__.py
│   ├── reciprocal.py
│   ├── representation.py
│   ├── supergroup.py
│   ├── symmetry.py
│   ├── symmetry_sampler.py
│   ├── tolerance.py
│   ├── util.py
│   ├── version.py
│   ├── viz.py
│   ├── wyckoff_site.py
│   └── wyckoff_split.py
├── requirements.txt
├── scripts/
│   ├── match.py
│   ├── pyxtal_csp_match.py
│   ├── pyxtal_csp_plot.py
│   ├── pyxtal_csp_rank.py
│   ├── pyxtal_main.py
│   ├── pyxtal_symmetry.py
│   └── rank.py
├── setup.cfg
├── setup.py
└── tests/
    ├── test_SO3.py
    ├── test_all.py
    ├── test_crystal.py
    ├── test_ff.py
    ├── test_group.py
    ├── test_jl.py
    ├── test_lattice.py
    ├── test_lego.py
    ├── test_mem.py
    ├── test_molecule.py
    ├── test_oc_relax.py
    ├── test_site_symm.py
    ├── test_supergroup.py
    ├── test_symmetry.py
    ├── test_wyckoff.py
    └── test_xrd.py
Download .txt
SYMBOL INDEX (1555 symbols across 97 files)

FILE: doc/conf.py
  class Mock (line 22) | class Mock(MagicMock):
    method __getattr__ (line 24) | def __getattr__(cls, name):

FILE: examples/example_00_LJ_simple.py
  function lennard_jones_potential (line 13) | def lennard_jones_potential(pos, dim=3):
  function lennard_jones_force (line 32) | def lennard_jones_force(pos, dim=3):
  function optimize_cluster (line 58) | def optimize_cluster(pos):

FILE: examples/example_01_3D_VASP.py
  function generate_random_crystal (line 35) | def generate_random_crystal() -> pyxtal:
  function optimize_and_save (line 59) | def optimize_and_save(crystal: pyxtal, index: int) -> None:
  function main (line 81) | def main() -> None:

FILE: examples/example_02_LJ_cluster.py
  function single_optimize (line 26) | def single_optimize(pos, dim=3, kt=0.5, mu=0.1, beta=1.001, shift=False,...
  class LJ_prediction (line 60) | class LJ_prediction:
    method __init__ (line 63) | def __init__(self, numIons):
    method generate_cluster (line 71) | def generate_cluster(self, pgs: tuple[int, int], cluster_factor=0.6, s...
    method predict (line 83) | def predict(self, maxN: int = 100, ncpu: int = 2, pgs: tuple[int, int]...
    method relaxation (line 100) | def relaxation(self, pgs: tuple[int, int], **kwargs):

FILE: examples/example_03_LJ_optalg.py
  function LJ (line 30) | def LJ(pos, dim, mu=0.1):
  function LJ_force (line 59) | def LJ_force(pos, dim, mu=0.1):
  function single_optimize (line 81) | def single_optimize(pos, dim=3, kt=0.5, mu=0.1, method="CG", seed=None):
  function parse_symmetry (line 113) | def parse_symmetry(pos):
  class LJ_prediction (line 123) | class LJ_prediction:
    method __init__ (line 126) | def __init__(self, numIons):
    method generate_cluster (line 134) | def generate_cluster(self, pgs, cluster_factor=0.7, seed=None):
    method predict (line 146) | def predict(self, dim=3, maxN=100, ncpu=2, pgs=(2, 33), method="CG"):
    method relaxation (line 171) | def relaxation(self, dim, pgs, method, ind):

FILE: examples/example_04_LJ_38.py
  function LJ (line 26) | def LJ(pos, dim, mu=0.1):
  function LJ_force (line 55) | def LJ_force(pos, dim, mu=0.1):
  function single_optimize (line 77) | def single_optimize(pos, dim=3, kt=0.5, mu=0.1, seed=None):
  function parse_symmetry (line 108) | def parse_symmetry(pos):
  class LJ_prediction (line 118) | class LJ_prediction:
    method __init__ (line 121) | def __init__(self, numIons):
    method generate_cluster (line 129) | def generate_cluster(self, pgs, cluster_factor=1.0, seed=None):
    method predict (line 141) | def predict(self, dim=3, maxN=100, ncpu=2, pgs=(2, 33)):
    method relaxation (line 166) | def relaxation(self, dim, pgs, ind):

FILE: examples/example_05_LJ_4D.py
  function LJ (line 26) | def LJ(pos, dim, mu=0.1):
  function LJ_force (line 55) | def LJ_force(pos, dim, mu=0.1):
  function single_optimize (line 77) | def single_optimize(pos, dim=3, kt=0.5, mu=0.1):
  function parse_symmetry (line 106) | def parse_symmetry(pos):
  class LJ_prediction (line 116) | class LJ_prediction:
    method __init__ (line 119) | def __init__(self, numIons):
    method generate_cluster (line 127) | def generate_cluster(self, pgs, cluster_factor=0.6, seed=None):
    method predict (line 139) | def predict(self, dim=3, maxN=100, ncpu=2, pgs=(2, 33)):
    method relaxation (line 164) | def relaxation(self, dim, pgs, ind):

FILE: examples/example_06_C_2D_lammps.py
  function new_struc (line 16) | def new_struc(db, s, eng):

FILE: flask/app/errors.py
  function not_found_error (line 6) | def not_found_error(error):
  function internal_error (line 11) | def internal_error(error):

FILE: flask/app/forms.py
  class MainForm (line 7) | class MainForm(FlaskForm):

FILE: flask/app/routes.py
  function index (line 16) | def index():
  function individual (line 21) | def individual():
  function comparison (line 50) | def comparison():
  function structure (line 81) | def structure(type: str):
  function structure2 (line 97) | def structure2(type: str):
  function process_upload (line 112) | def process_upload(form, comp=False):
  function process_form (line 155) | def process_form(form, comp=True):
  function plot (line 194) | def plot():
  function compare (line 228) | def compare():
  function read (line 290) | def read(savepath):

FILE: flask/app/static/jsmol.js
  function repeatCell (line 30) | function repeatCell(n1, n2, n3, num) {

FILE: flask/config.py
  class Config (line 4) | class Config:

FILE: pyxtal/XRD.py
  class XRD (line 21) | class XRD:
    method __init__ (line 38) | def __init__(
    method save (line 72) | def save(self, filename):
    method load (line 79) | def load(self, filename):
    method __str__ (line 102) | def __str__(self):
    method __repr__ (line 105) | def __repr__(self):
    method by_hkl (line 108) | def by_hkl(self, hkl=None, N_max=None):
    method all_dhkl (line 137) | def all_dhkl(self, crystal):
    method intensity (line 177) | def intensity(self, crystal):
    method pxrdf (line 331) | def pxrdf(self):
    method get_unique_families (line 361) | def get_unique_families(self, hkls, verbose=False):
    method draw_hkl (line 387) | def draw_hkl(hkl):
    method plot_pxrd (line 403) | def plot_pxrd(
    method plotly_pxrd (line 476) | def plotly_pxrd(
    method get_profile (line 537) | def get_profile(self, method="gaussian", res=0.01, user_kwargs=None):
    method get_plot (line 549) | def get_plot(self, grainsize=20, orientation=0.1, thermo=0.1,
  function add_peak (line 635) | def add_peak(twotheta, mu, gamma, sigma2, L, H, S, step=0.02, width=0.1,...
  function axial_div_bak (line 700) | def axial_div_bak(x, mu, L, H, S):
  function axial_div (line 728) | def axial_div(x, mu, L, H, S):
  function map_intensity (line 770) | def map_intensity(peak, x, twotheta):
  function _map_int_nearest_neighbor (line 809) | def _map_int_nearest_neighbor(peak, x, twotheta):
  class Profile (line 833) | class Profile:
    method __init__ (line 844) | def __init__(self, method="mod_pseudo-voigt", res=0.02, user_kwargs=No...
    method get_profile (line 873) | def get_profile(self, two_thetas, intensities, min2theta, max2theta):
  class Similarity (line 944) | class Similarity:
    method __init__ (line 945) | def __init__(self, f, g, N=None, x_range=None, l=2.0, weight="cosine"):
    method __str__ (line 1001) | def __str__(self):
    method __repr__ (line 1004) | def __repr__(self):
    method triangleFunction (line 1007) | def triangleFunction(self):
    method cosineFunction (line 1017) | def cosineFunction(self):
    method show (line 1028) | def show(self, filename=None, fontsize=None, labels=None):
  function mod_pseudo_voigt (line 1064) | def mod_pseudo_voigt(x, fwhm, A, eta_h, eta_l, N):
  function gaussian (line 1100) | def gaussian(theta2, alpha, fwhm):
  function lorentzian (line 1109) | def lorentzian(theta2, alpha, fwhm):
  function pseudo_voigt (line 1118) | def pseudo_voigt(theta2, alpha, fwhm, eta):
  function similarity_calculate (line 1129) | def similarity_calculate(r, w, d, Npts, fy, gy):
  function create_index (line 1151) | def create_index(imax=1, jmax=1, kmax=1):
  function get_intensity (line 1165) | def get_intensity(positions, hkl, s2, coeffs, z):
  function get_all_intensity (line 1195) | def get_all_intensity(N_cycles, N_atom, per_N, positions, hkls, s2s, coe...
  function get_all_intensity_par (line 1208) | def get_all_intensity_par(cpu, queue, cycles, Start, End, hkl_per_proc, ...
  function gaussian_integrated (line 1219) | def gaussian_integrated(bin_left, bin_right, center, fwhm):
  function pxrd_refine (line 1225) | def pxrd_refine(xtal, ref_pxrd, thetas, steps=50):
  function check_pxrd_match (line 1266) | def check_pxrd_match(xtal, ref_pxrd, s_tol=0.8, top_n=3, peak_tol=0.1, a...
  function is_multiple (line 1323) | def is_multiple(hkl, ref_hkl):
  function get_para_from_pxrd (line 1344) | def get_para_from_pxrd(ref_pxd, spg, wave_length=1.5406):

FILE: pyxtal/XRD_indexer.py
  function find_wp_assignments (line 12) | def find_wp_assignments(comp, ids, nums):
  function get_cell_params (line 107) | def get_cell_params(bravais, hkls, two_thetas, wave_length=1.54184):
  function get_d_hkl_from_cell (line 239) | def get_d_hkl_from_cell(bravais, cells, h, k, l):
  function calc_two_theta_from_cell (line 271) | def calc_two_theta_from_cell(bravais, hkls, cells, wave_length=1.54184):
  function get_seeds (line 311) | def get_seeds(bravais, hkls, two_thetas):
  function get_unique_thetas (line 395) | def get_unique_thetas(xrd, bravais):
  function get_cell_from_multi_hkls (line 434) | def get_cell_from_multi_hkls(bravais, hkls, two_thetas, long_thetas=None...
  function get_cell_from_thetas (line 538) | def get_cell_from_thetas(spg, long_thetas, N_add=5, max_mismatch=20, the...
  class XtalManager (line 619) | class XtalManager:
    method __init__ (line 620) | def __init__(self, spg, species, numIons, cell, WPs):
    method generate_structure (line 644) | def generate_structure(self):
  class WPManager (line 653) | class WPManager:
    method __init__ (line 654) | def __init__(self, spg, cell, composition={'Si': 1, 'O': 2}, max_wp=8,...
    method get_wyckoff_positions_bak (line 692) | def get_wyckoff_positions_bak(self):
    method get_wyckoff_positions (line 727) | def get_wyckoff_positions(self):
  class CellManager (line 771) | class CellManager:
    method __init__ (line 772) | def __init__(self, spg, params, missing):
    method is_supercell_of (line 784) | def is_supercell_of(self, other, tol=0.05):
    method is_similar_to (line 795) | def is_similar_to(self, other, tol=0.04):
    method __repr__ (line 800) | def __repr__(self):
    method consolidate (line 804) | def consolidate(cls, raw_data, merge_tol=0.04, supercell_tol=0.05, max...

FILE: pyxtal/__init__.py
  function print_logo (line 39) | def print_logo():
  class pyxtal (line 61) | class pyxtal:
    method __init__ (line 179) | def __init__(self, molecular=False, random_state=None):
    method __str__ (line 201) | def __str__(self):
    method __repr__ (line 229) | def __repr__(self):
    method get_dof (line 232) | def get_dof(self):
    method get_bounds (line 243) | def get_bounds(self, vec=(2.0, 50.0), ang=(30, 150)):
    method get_site_labels (line 253) | def get_site_labels(self):
    method from_random (line 273) | def from_random(
    method from_seed (line 410) | def from_seed(
    method _from_pymatgen (line 490) | def _from_pymatgen(self, struc, tol=1e-3, a_tol=5.0, style="pyxtal", h...
    method are_valid_numIons (line 561) | def are_valid_numIons(self):
    method check_H_coordination (line 574) | def check_H_coordination(self, r=1.12):
    method check_short_distances (line 595) | def check_short_distances(self, r=0.7, exclude_H=True):
    method check_short_distances_by_dict (line 620) | def check_short_distances_by_dict(self, dicts):
    method to_file (line 652) | def to_file(
    method supergroup (line 696) | def supergroup(self, G=None, d_tol=1.0):
    method supergroups (line 714) | def supergroups(self, G=None, d_tol=1.0):
    method subgroup (line 731) | def subgroup(
    method subgroup_by_path (line 823) | def subgroup_by_path(self, gtypes, ids, eps=0, mut_lat=False):
    method subgroup_once (line 853) | def subgroup_once(
    method _apply_substitution (line 960) | def _apply_substitution(self, splitter, perms):
    method _get_subgroup_ids (line 1000) | def _get_subgroup_ids(self, H, group_type, idx, max_cell, min_cell):
    method _subgroup_by_splitter (line 1067) | def _subgroup_by_splitter(self, splitter, eps=0.05, mut_lat=False):
    method apply_perturbation (line 1181) | def apply_perturbation(self, d_lat=0.05, d_coor=0.05, d_rot=1):
    method copy (line 1203) | def copy(self):
    method _get_coords_and_species (line 1209) | def _get_coords_and_species(self, absolute=False, unitcell=True):
    method _get_formula (line 1244) | def _get_formula(self):
    method get_reduced_composition (line 1277) | def get_reduced_composition(self):
    method get_min_values (line 1284) | def get_min_values(self):
    method get_zprime (line 1296) | def get_zprime(self, integer=False):
    method get_1D_comp (line 1306) | def get_1D_comp(self):
    method get_num_torsions (line 1320) | def get_num_torsions(self):
    method to_ase (line 1329) | def to_ase(self, resort=True, center_only=False, add_vaccum=True):
    method to_pymatgen (line 1385) | def to_pymatgen(self, resort=True):
    method to_pyxtal_center (line 1421) | def to_pyxtal_center(self):
    method get_XRD (line 1459) | def get_XRD(self, **kwargs):
    method optimize_lattice (line 1477) | def optimize_lattice(self, iterations=5, force=False, standard=False):
    method update_wyckoffs (line 1531) | def update_wyckoffs(self):
    method get_std_representation (line 1541) | def get_std_representation(self, trans):
    method get_1D_representation (line 1548) | def get_1D_representation(self, standard=False):
    method transform (line 1558) | def transform(self, trans, lattice=None):
    method to_json (line 1617) | def to_json(self, filename="pyxtal.json"):
    method from_json (line 1627) | def from_json(self, filename):
    method save_dict (line 1636) | def save_dict(self):
    method load_dict (line 1660) | def load_dict(self, dict0):
    method build (line 1689) | def build(self, group, species, numIons, lattice, sites, tol=1e-2, dim...
    method get_alternatives (line 1795) | def get_alternatives(self, include_self=True, same_letters=False, ref_...
    method to_standard_setting (line 1835) | def to_standard_setting(self):
    method resort_species (line 1843) | def resort_species(self, species):
    method resort (line 1867) | def resort(self):
    method _get_alternative (line 1886) | def _get_alternative(self, wyc_sets, index, ref_lat=None, d_tol=2.0, f...
    method _get_alternative_back (line 1947) | def _get_alternative_back(self, index):
    method check_distance (line 1994) | def check_distance(self):
    method get_density (line 2002) | def get_density(self):
    method has_special_site (line 2008) | def has_special_site(self, species=None):
    method to_subgroup_zp2 (line 2029) | def to_subgroup_zp2(self):
    method to_subgroup (line 2052) | def to_subgroup(self, path=None, t_only=True, iterate=False, species=N...
    method show (line 2106) | def show(self, **kwargs):
    method get_free_axis (line 2115) | def get_free_axis(self):
    method find_matched_lattice (line 2130) | def find_matched_lattice(self, ref_struc, d_tol=2.0, f_tol=0.15):
    method check_mapping (line 2179) | def check_mapping(self, ref_struc):
    method get_disps_single (line 2205) | def get_disps_single(self, ref_struc, trans, d_tol=1.2):
    method get_disps_optim (line 2270) | def get_disps_optim(self, ref_struc, trans, d_tol):
    method get_init_translations (line 2302) | def get_init_translations(self, ref_struc, tol=0.75):
    method is_duplicate (line 2346) | def is_duplicate(self, ref_strucs):
    method get_disps_sets (line 2366) | def get_disps_sets(self, ref_struc, d_tol, d_tol2=0.3, ld_tol=2.0, fd_...
    method _get_elements_and_sites (line 2447) | def _get_elements_and_sites(self):
    method sort_sites_by_mult (line 2469) | def sort_sites_by_mult(self):
    method sort_sites_by_numIons (line 2474) | def sort_sites_by_numIons(self, seq=None):
    method get_transition (line 2481) | def get_transition(self, ref_struc, d_tol=1.0, d_tol2=0.3, N_images=2,...
    method get_transition_by_path (line 2570) | def get_transition_by_path(self, ref_struc, path, d_tol, d_tol2=0.5, N...
    method translate (line 2699) | def translate(self, trans, reset_wp=False):
    method make_transitions (line 2713) | def make_transitions(self, disps, lattice=None, translation=None, N_im...
    method get_intermolecular_energy (line 2757) | def get_intermolecular_energy(self, factor=2.0, max_d=10.0):
    method get_neighboring_molecules (line 2780) | def get_neighboring_molecules(self, site_id=0, factor=1.5, max_d=5.0, ...
    method get_spherical_images (line 2829) | def get_spherical_images(self, **kwargs):
    method get_neighboring_dists (line 2845) | def get_neighboring_dists(self, site_id=0, factor=1.5, max_d=5.0):
    method show_mol_cluster (line 2878) | def show_mol_cluster(
    method substitute_1_2 (line 2940) | def substitute_1_2(
    method _substitute_1_2 (line 3022) | def _substitute_1_2(self, dicts, ratio=None):
    method substitute (line 3113) | def substitute(self, dicts):
    method remove_species (line 3131) | def remove_species(self, species):
    method substitute_linear (line 3160) | def substitute_linear(self, dicts):
    method remove_water (line 3225) | def remove_water(self):
    method substitute_molecules (line 3253) | def substitute_molecules(self, smiles):
    method set_cutoff (line 3270) | def set_cutoff(self, exclude_ii=False, value=None):
    method set_site_coordination (line 3296) | def set_site_coordination(self, cutoff=None, verbose=False, exclude_ii...
    method get_dimensionality (line 3322) | def get_dimensionality(self, cutoff=None):
    method from_CSD (line 3337) | def from_CSD(self, csd_code):
    method get_structure_factor (line 3473) | def get_structure_factor(self, hkl, coeffs=None):
    method to_molecular_xtal (line 3488) | def to_molecular_xtal(self, molecules, oris=None, reflects=None):
    method to_atomic_xtal (line 3513) | def to_atomic_xtal(self):
    method get_forcefield (line 3532) | def get_forcefield(self, ff_style="openff", code="lammps", chargemetho...
    method update_from_1d_rep (line 3617) | def update_from_1d_rep(self, x):
    method get_1d_rep_x (line 3654) | def get_1d_rep_x(self):
    method from_spg_wps_rep (line 3674) | def from_spg_wps_rep(self, spg, wps, x, elements=None):
    method from_1d_rep (line 3712) | def from_1d_rep(self, x, sites, dim=3):
    method check_validity (line 3764) | def check_validity(self, criteria, verbose=False):
    method get_xtal_string (line 3838) | def get_xtal_string(self, dicts=None, header=None):
    method get_tabular_representations (line 3878) | def get_tabular_representations(
    method get_tabular_representation (line 3935) | def get_tabular_representation(
    method from_tabular_representation (line 4022) | def from_tabular_representation(
    method get_Pearson_Symbol (line 4150) | def get_Pearson_Symbol(self):
    method resymmetrize (line 4176) | def resymmetrize(self, tol=1e-3):
    method from_prototype (line 4193) | def from_prototype(self, prototype):
    method optimize_orientation_by_energy (line 4284) | def optimize_orientation_by_energy(self, max_iter=20, verbose=False):
    method get_orientation_energy (line 4290) | def get_orientation_energy(self):
    method get_separations (line 4297) | def get_separations(self, hkls=[[1, 0, 0], [0, 1, 0], [0, 0, 1]]):
    method cut_lattice (line 4312) | def cut_lattice(self, max_separation=3.0, verbose=False):
    method optimize_lattice_and_rotation (line 4328) | def optimize_lattice_and_rotation(self, iterations=3, verbose=False):
    method get_rms_dist (line 4342) | def get_rms_dist(self, xtal1, ltol=0.3, stol=0.3, angle_tol=5.0, scale...

FILE: pyxtal/asu_constraints.py
  class ASUCondition (line 22) | class ASUCondition:
    method __init__ (line 32) | def __init__(self, condition: Callable, description: str):
    method check (line 43) | def check(self, coords: np.ndarray) -> bool:
    method __repr__ (line 55) | def __repr__(self):
  class ASU (line 59) | class ASU:
    method __init__ (line 65) | def __init__(self,
    method x_min (line 83) | def x_min(self): return self.bounds[0]
    method x_max (line 86) | def x_max(self): return self.bounds[1]
    method y_min (line 89) | def y_min(self): return self.bounds[2]
    method y_max (line 92) | def y_max(self): return self.bounds[3]
    method z_min (line 95) | def z_min(self): return self.bounds[4]
    method z_max (line 98) | def z_max(self): return self.bounds[5]
    method check_box_bounds (line 100) | def check_box_bounds(self, coords: np.ndarray) -> np.ndarray:
    method check_conditions (line 121) | def check_conditions(self, coords: np.ndarray) -> np.ndarray:
    method is_valid (line 142) | def is_valid(self, coords: np.ndarray) -> np.ndarray:
    method generate_random_points (line 154) | def generate_random_points(self, n: int, max_attempts: int = 10000) ->...
    method project_to_asu (line 186) | def project_to_asu(self, coords: np.ndarray, method: str = 'clamp') ->...
    method __repr__ (line 236) | def __repr__(self):
  function create_asu_for_space_group (line 251) | def create_asu_for_space_group(space_group: int) -> ASU:
  function parse_fraction (line 336) | def parse_fraction(frac_str: str) -> float:
  function test_asu_implementation (line 344) | def test_asu_implementation():

FILE: pyxtal/block_crystal.py
  function block_crystal (line 16) | def block_crystal(

FILE: pyxtal/constants.py
  function get_additional_asu_conditions (line 483) | def get_additional_asu_conditions(space_group: int):

FILE: pyxtal/crystal.py
  class random_crystal (line 28) | class random_crystal:
    method __init__ (line 49) | def __init__(
    method __str__ (line 130) | def __str__(self):
    method __repr__ (line 143) | def __repr__(self):
    method set_sites (line 146) | def set_sites(self, sites):
    method set_elemental_volumes (line 183) | def set_elemental_volumes(self):
    method set_volume (line 193) | def set_volume(self):
    method set_lattice (line 218) | def set_lattice(self, lattice):
    method set_crystal (line 282) | def set_crystal(self):
    method _set_coords (line 318) | def _set_coords(self):
    method _set_ion_wyckoffs (line 337) | def _set_ion_wyckoffs(self, numIon, specie, cell, wyks):
    method check_wp (line 433) | def check_wp(self, wyckoff_sites_tmp, wyks, cell, new_site, tol):
    method _check_consistency (line 440) | def _check_consistency(self, site, numIon):

FILE: pyxtal/database/collection.py
  class Collection (line 7) | class Collection:
    method __init__ (line 27) | def __init__(self, name="molecules"):
    method __getitem__ (line 51) | def __getitem__(self, name):
    method __iter__ (line 64) | def __iter__(self):
    method _read (line 68) | def _read(self, name):
    method show_names (line 83) | def show_names(self):

FILE: pyxtal/database/element.py
  class Element (line 6) | class Element:
    method __init__ (line 14) | def __init__(self, input_value):
    method get_all (line 281) | def get_all(self, pos):
    method get_sf (line 296) | def get_sf(self, pos):
    method all_z (line 311) | def all_z(self):
    method all_short_names (line 314) | def all_short_names(self):
    method all_long_names (line 317) | def all_long_names(self):
    method all_masses (line 320) | def all_masses(self):
    method all_valences (line 323) | def all_valences(self):
    method all_valence_electrons (line 326) | def all_valence_electrons(self):
    method all_covalent_radii (line 329) | def all_covalent_radii(self):
    method all_vdw_radii (line 332) | def all_vdw_radii(self):
    method all_metallic_radii (line 335) | def all_metallic_radii(self):
    method get_sf (line 338) | def get_sf(self):
    method number_from_specie (line 341) | def number_from_specie(specie):

FILE: pyxtal/db.py
  function setup_worker_logger (line 17) | def setup_worker_logger(log_file):
  function call_opt_single (line 26) | def call_opt_single(p):
  function opt_single (line 51) | def opt_single(id, xtal, calc, *args):
  function dftb_opt_single (line 83) | def dftb_opt_single(id, xtal, skf_dir, steps, symmetrize, criteria, kres...
  function vasp_opt_single (line 157) | def vasp_opt_single(id, xtal, path, cmd, criteria):
  function gulp_opt_single (line 184) | def gulp_opt_single(id, xtal, ff_lib, path, criteria):
  function mace_opt_single (line 231) | def mace_opt_single(id, xtal, step, fmax, criteria):
  function process_xtal (line 275) | def process_xtal(id, xtal, eng, criteria):
  function make_entry_from_pyxtal (line 285) | def make_entry_from_pyxtal(xtal):
  function make_entry_from_CSD_web (line 358) | def make_entry_from_CSD_web(code, number, smiles, name=None):
  function make_entry_from_CSD (line 375) | def make_entry_from_CSD(code):
  function make_db_from_CSD (line 394) | def make_db_from_CSD(dbname, codes):
  class database (line 414) | class database:
    method __init__ (line 422) | def __init__(self, db_name):
    method vacuum (line 450) | def vacuum(self):
    method get_all_codes (line 453) | def get_all_codes(self, group=None):
    method add (line 471) | def add(self, entry):
    method add_from_code (line 478) | def add_from_code(self, code):
    method process_kvp (line 485) | def process_kvp(self, kvp):
    method check_status (line 495) | def check_status(self, show=False):
    method copy (line 510) | def copy(self, db_name, csd_codes):
    method view (line 526) | def view(self, row_info):
    method get_row_info (line 559) | def get_row_info(self, id=None, code=None):
    method get_row (line 586) | def get_row(self, code):
    method get_pyxtal (line 592) | def get_pyxtal(self, code):
    method compute (line 613) | def compute(self, row, work_dir, skf_dir):
  class database_topology (line 629) | class database_topology:
    method __init__ (line 643) | def __init__(self, db_name, rank=0, size=1, ltol=0.05, stol=0.05, atol=3,
    method vacuum (line 681) | def vacuum(self):
    method print_memory_usage (line 684) | def print_memory_usage(self):
    method get_pyxtal (line 691) | def get_pyxtal(self, id, use_relaxed=None, tol=1e-4):
    method get_all_xtals (line 738) | def get_all_xtals(self, include_energy=False):
    method add_xtal (line 751) | def add_xtal(self, xtal, kvp={}):
    method add_strucs_from_db (line 770) | def add_strucs_from_db(self, db_file, check=False,
    method check_new_structure (line 866) | def check_new_structure(self, xtal, eng=None, same_group=False,
    method clean_structures_spg_topology (line 920) | def clean_structures_spg_topology(self, dim=None):
    method get_row (line 977) | def get_row(self, id):
    method clean_structures (line 982) | def clean_structures(self, ids=(None, None), dtol=2e-3, etol=1e-3, cri...
    method clean_structures_pmg (line 1096) | def clean_structures_pmg(self, ids=(None, None), min_id=None, dtol=5e-...
    method get_max_id (line 1223) | def get_max_id(self):
    method select_xtals (line 1233) | def select_xtals(self, ids, N_atoms=(None, None), overwrite=False, att...
    method select_xtal (line 1267) | def select_xtal(self, ids, N_atoms=(None, None), overwrite=False, attr...
    method update_row_energy (line 1303) | def update_row_energy(
    method update_row_energy_serial (line 1385) | def update_row_energy_serial(self, generator, write_freq, args, args_up):
    method update_row_energy_mproc (line 1418) | def update_row_energy_mproc(self, ncpu, generator, args, args_up):
    method _update_db (line 1499) | def _update_db(self, results, calc, *args):
    method update_row_topology (line 1535) | def update_row_topology(self, StructureType="Auto", overwrite=True, pr...
    method update_db_description (line 1768) | def update_db_description(self):
    method export_structures (line 1804) | def export_structures(
    method get_label (line 1955) | def get_label(self, i):
    method get_db_unique (line 1964) | def get_db_unique(self, db_name=None, prec=3, key='ff_energy', max_N_a...
    method get_db_unique_topology (line 2039) | def get_db_unique_topology(self, db_name=None, prec=3, update_topology...
    method check_overlap (line 2102) | def check_overlap(self, reference_db, etol=2e-3, verbose=True):
    method print_info (line 2167) | def print_info(self, excluded_ids=None, cutoff=100):
    method plot_histogram (line 2200) | def plot_histogram(self, prop, ax=None, filename=None, xlim=None, nbin...
    method get_properties (line 2243) | def get_properties(self, prop):

FILE: pyxtal/descriptor.py
  function _qlm (line 12) | def _qlm(dists, l=4):
  function correlation (line 57) | def correlation(coef1, coef2, angle=None, s=0):
  function correlation_opt (line 77) | def correlation_opt(coef1, coef2, angle, s=0):
  function correlation_go (line 105) | def correlation_go(coef1, coef2, M=6, s=0, d_cut=0.92):
  function fibonacci_sphere (line 135) | def fibonacci_sphere(N=1000):
  function cart2sph (line 158) | def cart2sph(x, y, z):
  function sph2cart (line 177) | def sph2cart(phi, theta, r):
  function xyz2sph (line 196) | def xyz2sph(xyzs, radian=True):
  function expand_sph (line 235) | def expand_sph(pts, l_max, norm=4, csphase=-1):
  function get_alignment (line 279) | def get_alignment(pts, degrees=True):
  class spherical_image (line 328) | class spherical_image:
    method __init__ (line 343) | def __init__(self, xtal, model="molecule", max_d=10, factor=2.2, lmax=...
    method calculate_density (line 373) | def calculate_density(self, pt, xyzs):
    method get_molecules (line 385) | def get_molecules(self):
    method get_contacts (line 409) | def get_contacts(self):
    method plot_sph_images (line 425) | def plot_sph_images(self, lmax=None, figname=None, molecule=False):
    method plot_real_image (line 488) | def plot_real_image(self, id=0):
    method align (line 494) | def align(self, M=6):
    method rotate (line 512) | def rotate(self, alpha=0, beta=0, gamma=0):
    method get_similarity (line 524) | def get_similarity(self, sph2, M=6, cutoff=0.95):
  class orientation_order (line 543) | class orientation_order:
    method __init__ (line 553) | def __init__(self, xtal, max_CN=14):
    method get_neighbors (line 558) | def get_neighbors(self):
    method get_parameters (line 579) | def get_parameters(self, ls=None):

FILE: pyxtal/elasticity.py
  function full_3x3_to_Voigt_6_index (line 46) | def full_3x3_to_Voigt_6_index(i, j):
  function Voigt_6_to_full_3x3_strain (line 55) | def Voigt_6_to_full_3x3_strain(strain_vector):
  function Voigt_6_to_full_3x3_stress (line 69) | def Voigt_6_to_full_3x3_stress(stress_vector):
  function full_3x3_to_Voigt_6_strain (line 77) | def full_3x3_to_Voigt_6_strain(strain_matrix):
  function full_3x3_to_Voigt_6_stress (line 94) | def full_3x3_to_Voigt_6_stress(stress_matrix):
  function Voigt_6x6_to_full_3x3x3x3 (line 111) | def Voigt_6x6_to_full_3x3x3x3(C):
  function full_3x3x3x3_to_Voigt_6x6 (line 136) | def full_3x3x3x3_to_Voigt_6x6(C):
  function Voigt_6x6_to_cubic (line 189) | def Voigt_6x6_to_cubic(C):
  function cubic_to_Voigt_6x6 (line 217) | def cubic_to_Voigt_6x6(C11, C12, C44):
  function _invariants (line 230) | def _invariants(
  function invariants (line 279) | def invariants(
  function rotate_cubic_elastic_constants (line 308) | def rotate_cubic_elastic_constants(C11, C12, C44, A, tol=1e-6):
  function rotate_elastic_constants (line 359) | def rotate_elastic_constants(C, A, tol=1e-6):
  class CubicElasticModuli (line 390) | class CubicElasticModuli:
    method __init__ (line 393) | def __init__(self, C11, C12, C44):
    method rotate (line 410) | def rotate(self, A):
    method _rotate_explicit (line 438) | def _rotate_explicit(self, A):
    method stiffness (line 474) | def stiffness(self):
    method compliance (line 481) | def compliance(self):
  function measure_triclinic_elastic_constants (line 492) | def measure_triclinic_elastic_constants(a, delta=0.001, optimizer=None, ...
  function _dec (line 635) | def _dec(pattern):
  function generate_strained_configs (line 729) | def generate_strained_configs(at0, symmetry="triclinic", N_steps=5, delt...
  function fit_elastic_constants (line 802) | def fit_elastic_constants(
  function youngs_modulus (line 1096) | def youngs_modulus(C, l):
  function poisson_ratio (line 1136) | def poisson_ratio(C, l, m):
  function elastic_moduli (line 1174) | def elastic_moduli(C, l=np.array([1, 0, 0]), R=None, tol=1e-6):
  function elastic_properties (line 1281) | def elastic_properties(C):

FILE: pyxtal/interface/LATTE_templates/latte_calc.py
  class LATTECalc (line 11) | class LATTECalc:
    method __init__ (line 24) | def __init__(
    method run (line 75) | def run(self):
    method to_ase (line 88) | def to_ase(self):
    method to_pyxtal (line 96) | def to_pyxtal(self):
    method _write_inputblock (line 110) | def _write_inputblock(self):
    method _apply_control_overrides (line 131) | def _apply_control_overrides(self):
    method _read_relax_from_control (line 205) | def _read_relax_from_control(self):
    method _execute (line 224) | def _execute(self):
    method _read_output (line 250) | def _read_output(self):
    method _read_restart_geometry (line 281) | def _read_restart_geometry(self):
  function latte_single_optimize (line 293) | def latte_single_optimize(

FILE: pyxtal/interface/LJ.py
  function get_neighbors (line 18) | def get_neighbors(struc, i, rcut):
  class LJ (line 33) | class LJ:
    method __init__ (line 38) | def __init__(self, epsilon=1.0, sigma=1.0, rcut=8.0):
    method calc (line 50) | def calc(self, struc, press=1e-4):
  class FIRE (line 80) | class FIRE:
    method __init__ (line 85) | def __init__(
    method initialize (line 125) | def initialize(self):
    method update (line 134) | def update(self, freq=50):
    method step (line 142) | def step(self):
    method run (line 198) | def run(self, max_steps=1000):
    method check_convergence (line 210) | def check_convergence(self):
    method symmetrized_coords (line 223) | def symmetrized_coords(self, coords):
    method symmetrized_force (line 256) | def symmetrized_force(self, coords):
    method symmetrized_stress (line 287) | def symmetrized_stress(self, stress):

FILE: pyxtal/interface/ase_opt.py
  function get_calculator (line 18) | def get_calculator(calculator):
  function ASE_relax (line 64) | def ASE_relax(

FILE: pyxtal/interface/ase_opt2.py
  function get_calculator (line 26) | def get_calculator(calculator):
  class ASE_optimizer (line 59) | class ASE_optimizer:
    method __init__ (line 71) | def __init__(self, struc, calculator="FAIRChem", opt_lat=True, logfile...
    method run (line 83) | def run(self, fmax_target=0.01):

FILE: pyxtal/interface/charmm.py
  class CHARMM (line 7) | class CHARMM:
    method __init__ (line 28) | def __init__(
    method run (line 106) | def run(self, clean=True):
    method execute (line 126) | def execute(self):
    method clean (line 154) | def clean(self):
    method write (line 161) | def write(self, cutoff=14.0):
    method read (line 280) | def read(self):
    method FFTGrid (line 353) | def FFTGrid(self, ABC):
  function check_prm (line 424) | def check_prm(path):
  class RTF (line 504) | class RTF:
    method __init__ (line 509) | def __init__(self, input):
    method parse (line 530) | def parse(self, rtf):
    method to_string (line 572) | def to_string(self):
    method to_file (line 598) | def to_file(self, filename="test.rtf"):
    method parse_mass (line 607) | def parse_mass(self, mass):
    method merge (line 615) | def merge(self, rtf1=None, single=None):
  class PRM (line 705) | class PRM:
    method __init__ (line 710) | def __init__(self, input):
    method parse (line 722) | def parse(self, prm):
    method to_string (line 782) | def to_string(self):
    method to_file (line 802) | def to_file(self, filename="test.prm"):
    method merge (line 811) | def merge(self, prm1=None, single=None):

FILE: pyxtal/interface/dftb.py
  function make_Hamiltonian (line 18) | def make_Hamiltonian(
  function DFTB_relax (line 174) | def DFTB_relax(
  function DFTB_SCF (line 240) | def DFTB_SCF(struc, skf_dir, kresol=0.10, folder="tmp", disp=None, filen...
  class DFTB (line 280) | class DFTB:
    method __init__ (line 294) | def __init__(
    method get_calculator (line 321) | def get_calculator(self, mode, step=500, ftol=1e-3, FixAngles=False, e...
    method run (line 405) | def run(self, mode, step=500, ftol=1e-3, FixAngles=False, md_params=No...
  class Dftb (line 435) | class Dftb(FileIOCalculator):
    method __init__ (line 450) | def __init__(
    method write_dftb_in (line 597) | def write_dftb_in(self, outfile):
    method check_state (line 640) | def check_state(self, atoms):
    method write_input (line 647) | def write_input(self, atoms, properties=None, system_changes=None):
    method read_results (line 659) | def read_results(self):
    method read_energy (line 696) | def read_energy(self):
    method read_forces (line 720) | def read_forces(self):
    method read_eigenvalues (line 742) | def read_eigenvalues(self):
    method read_fermi_levels (line 771) | def read_fermi_levels(self):
    method read_electrons (line 796) | def read_electrons(self):

FILE: pyxtal/interface/gulp.py
  class GULP (line 100) | class GULP:
    method __init__ (line 114) | def __init__(
    method set_catlow (line 172) | def set_catlow(self):
    method run (line 180) | def run(self, clean=True):
    method execute (line 193) | def execute(self):
    method clean (line 209) | def clean(self):
    method to_ase (line 219) | def to_ase(self):
    method to_pymatgen (line 222) | def to_pymatgen(self):
    method to_pyxtal (line 227) | def to_pyxtal(self):
    method write (line 240) | def write(self):
    method read (line 302) | def read(self):
  class GULP_OC (line 435) | class GULP_OC:
    method __init__ (line 452) | def __init__(
    method run (line 494) | def run(self, clean=True, pause=False):
    method execute (line 509) | def execute(self):
    method clean (line 520) | def clean(self):
    method write (line 524) | def write(self):
    method read (line 606) | def read(self):
  function single_optimize (line 686) | def single_optimize(
  function optimize (line 721) | def optimize(

FILE: pyxtal/interface/lammpslib.py
  function opt_lammpslib (line 16) | def opt_lammpslib(
  function run_lammpslib (line 75) | def run_lammpslib(
  function is_upper_triangular (line 149) | def is_upper_triangular(arr, atol=1e-8):
  function convert_cell (line 157) | def convert_cell(ase_cell):
  class LAMMPSlib (line 187) | class LAMMPSlib(Calculator):
    method __init__ (line 188) | def __init__(
    method calculate (line 222) | def calculate(self, atoms):
    method write_lammps_in (line 312) | def write_lammps_in(self):
    method write_lammps_data (line 362) | def write_lammps_data(self, atoms):
    method write_lammps_data_water (line 385) | def write_lammps_data_water(self, atoms):
    method update (line 451) | def update(self, atoms):
    method get_potential_energy (line 455) | def get_potential_energy(self, atoms, force_consistent=False):
    method get_forces (line 462) | def get_forces(self, atoms):
    method get_stress (line 466) | def get_stress(self, atoms):
  class LAMMPS_collections (line 471) | class LAMMPS_collections:
    method __init__ (line 476) | def __init__(self, temp=500):

FILE: pyxtal/interface/latte_calculator.py
  class LATTECalculator (line 15) | class LATTECalculator(Calculator):
    method __init__ (line 33) | def __init__(self, exe="./LATTE_DOUBLE", workdir=".", timeout=3600, **...
    method calculation_required (line 41) | def calculation_required(self, atoms, properties):
    method calculate (line 44) | def calculate(self, atoms=None, properties=("energy",), system_changes...
    method _write_inputblock (line 70) | def _write_inputblock(self, atoms):
    method _set_single_point_mode (line 87) | def _set_single_point_mode(self):
    method _run_latte (line 110) | def _run_latte(self):
    method _read_energy_from_log (line 120) | def _read_energy_from_log(self):
    method _read_stress_from_log (line 133) | def _read_stress_from_log(self):
    method _read_forces_from_cfg (line 153) | def _read_forces_from_cfg(self):
  function reorder_cif_and_fix_formula (line 205) | def reorder_cif_and_fix_formula(infile, outfile, desired_order=("O", "H"...
  function log_stress (line 263) | def log_stress(atoms, filename="stress_log.txt"):

FILE: pyxtal/interface/vasp.py
  class VASP (line 17) | class VASP:
    method __init__ (line 29) | def __init__(self, struc, path="tmp", cmd="mpirun -np 16 vasp_std"):
    method set_vasp (line 50) | def set_vasp(self, level=0, pstress=0.0000, setup=None):
    method read_OUTCAR (line 113) | def read_OUTCAR(self, path="OUTCAR"):
    method read_OSZICAR (line 125) | def read_OSZICAR(self, path="OSZICAR"):
    method read_bandgap (line 133) | def read_bandgap(self, path="vasprun.xml"):
    method run (line 139) | def run(self, setup=None, pstress=0, level=0, clean=True, read_gap=Fal...
    method clean (line 178) | def clean(self):
    method to_pymatgen (line 191) | def to_pymatgen(self):
    method to_pyxtal (line 196) | def to_pyxtal(self):
  function single_optimize (line 202) | def single_optimize(
  function single_point (line 242) | def single_point(struc, setup=None, path=None, clean=True):
  function optimize (line 261) | def optimize(
  function VASP_relax (line 299) | def VASP_relax(struc, opt_cell=False, step=100, kspacing=0.25, pstress=0...

FILE: pyxtal/io.py
  function in_merged_coords (line 24) | def in_merged_coords(wp, pt, pts, cell):
  function get_cif_str_for_pyxtal (line 46) | def get_cif_str_for_pyxtal(struc, header: str = "", sym_num=None, style:...
  function write_cif (line 179) | def write_cif(struc, filename=None, header="", permission="w", sym_num=N...
  function read_cif (line 203) | def read_cif(filename):
  class structure_from_ext (line 262) | class structure_from_ext:
    method __init__ (line 263) | def __init__(self, struc, ref_mols, tol=0.2, ignore_HH=False, add_H=Fa...
    method resort (line 317) | def resort(self, molecules):
    method add_Hydrogens (line 417) | def add_Hydrogens(self, smile, xyz):
    method make_mol_sites (line 458) | def make_mol_sites(self):
    method align (line 476) | def align(self):
    method show (line 503) | def show(self, overlay=True):
  function search_molecules_in_crystal (line 512) | def search_molecules_in_crystal(struc, tol=0.2, once=False, ignore_HH=Tr...

FILE: pyxtal/lattice.py
  class Lattice (line 13) | class Lattice:
    method __init__ (line 51) | def __init__(
    method _get_dof (line 150) | def _get_dof(self):
    method get_bounds (line 165) | def get_bounds(self, min_vec=2.0, max_vec=50.0, min_ang=30, max_ang=150):
    method get_dofs (line 184) | def get_dofs(self, ltype):
    method copy (line 202) | def copy(self):
    method get_lengths (line 210) | def get_lengths(self):
    method scale (line 215) | def scale(self, factor=1.1):
    method get_permutation_matrices (line 220) | def get_permutation_matrices(self):
    method get_transformation_matrices (line 243) | def get_transformation_matrices(self):
    method search_transformations (line 287) | def search_transformations(self, lat_ref, d_tol=1.0, f_tol=0.1):
    method search_transformation (line 337) | def search_transformation(self, lat_ref, d_tol=1.0, f_tol=0.1):
    method optimize_once (line 404) | def optimize_once(self, reset=False):
    method get_worst_angle (line 428) | def get_worst_angle(self):
    method optimize_multi (line 434) | def optimize_multi(self, iterations=5):
    method standardize (line 455) | def standardize(self):
    method transform (line 479) | def transform(self, trans_mat=None, reset=False):
    method transform_multi (line 493) | def transform_multi(self, trans, reset=True):
    method encode (line 502) | def encode(self):
    method from_1d_representation (line 516) | def from_1d_representation(self, v, ltype):
    method update_from_1d_representation (line 535) | def update_from_1d_representation(self, v):
    method mutate (line 560) | def mutate(self, degree=0.10, frozen=False):
    method generate_para (line 599) | def generate_para(self):
    method generate_matrix (line 610) | def generate_matrix(self):
    method get_matrix (line 621) | def get_matrix(self, shape="upper"):
    method get_para (line 627) | def get_para(self, degree=False):
    method set_matrix (line 643) | def set_matrix(self, matrix=None):
    method set_para (line 666) | def set_para(self, para=None, radians=False):
    method update_para (line 676) | def update_para(self, id, change):
    method reset_matrix (line 681) | def reset_matrix(self, shape="upper"):
    method set_volume (line 707) | def set_volume(self, volume):
    method swap_axis (line 711) | def swap_axis(self, random=False, ids=None):
    method swap_angle (line 765) | def swap_angle(self, random=True, ids=None):
    method add_vacuum (line 798) | def add_vacuum(self, coor, frac=True, vacuum=15, PBC=None):
    method generate_point (line 825) | def generate_point(self):
    method from_para (line 846) | def from_para(
    method from_matrix (line 932) | def from_matrix(
    method is_valid_matrix (line 1014) | def is_valid_matrix(self):
    method is_valid_lattice (line 1026) | def is_valid_lattice(self, tol=1e-3):
    method check_mismatch (line 1057) | def check_mismatch(self, trans, l_type, tol=1.0, a_tol=10):
    method get_diff (line 1081) | def get_diff(self, l_ref):
    method __str__ (line 1102) | def __str__(self, fmt='8.4f', ltype=True):
    method __repr__ (line 1108) | def __repr__(self):
    method find_transition_to_orthoslab (line 1111) | def find_transition_to_orthoslab(self, c=(0, 0, 1), a=(1, 0, 0), m=5):
    method apply_transformation (line 1180) | def apply_transformation(self, trans):
  function generate_cellpara (line 1188) | def generate_cellpara(
  function generate_cellpara_2D (line 1352) | def generate_cellpara_2D(
  function generate_cellpara_1D (line 1558) | def generate_cellpara_1D(
  function generate_cellpara_0D (line 1767) | def generate_cellpara_0D(
  function matrix2para (line 1828) | def matrix2para(matrix, radians=True):
  function para2matrix (line 1868) | def para2matrix(cell_para, radians=True, format="upper"):
  function gaussian_random_variable (line 1940) | def gaussian_random_variable(min, max, sigma=3.0, random_state: None | i...
  function random_vector (line 1971) | def random_vector(minvec=None, maxvec=None, width=0.35, unit=False, rand...
  function random_shear_matrix (line 2006) | def random_shear_matrix(width=1.0, unitary=False, random_state: None | i...

FILE: pyxtal/lego/SO3.py
  class SO3 (line 7) | class SO3:
    method __init__ (line 21) | def __init__(self, nmax=3, lmax=3, rcut=3.5, alpha=2.0,
    method __str__ (line 40) | def __str__(self):
    method __repr__ (line 45) | def __repr__(self):
    method load_from_dict (line 48) | def load_from_dict(self, dict0):
    method save_dict (line 55) | def save_dict(self):
    method nmax (line 69) | def nmax(self):
    method nmax (line 73) | def nmax(self, nmax):
    method lmax (line 84) | def lmax(self):
    method lmax (line 88) | def lmax(self, lmax):
    method rcut (line 99) | def rcut(self):
    method rcut (line 103) | def rcut(self, rcut):
    method alpha (line 112) | def alpha(self):
    method alpha (line 116) | def alpha(self, alpha):
    method cutoff_function (line 125) | def cutoff_function(self):
    method cutoff_function (line 129) | def cutoff_function(self, cutoff_function):
    method clear_memory (line 132) | def clear_memory(self):
    method init_atoms (line 142) | def init_atoms(self, atoms, atom_ids=None):
    method compute_p (line 150) | def compute_p(self, atoms, atom_ids=None, return_rdf=False, CN_max=12,...
    method dist2rdf (line 192) | def dist2rdf(self, dists, num_bins=20, sigma=0.5):
    method compute_dpdr (line 227) | def compute_dpdr(self, atoms, atom_ids=None):
    method compute_dpdr_5d (line 290) | def compute_dpdr_5d(self, atoms, atom_ids=None):
    method calculate (line 349) | def calculate(self, atoms, atom_ids=None, derivative=False):
    method build_neighbor_list (line 373) | def build_neighbor_list(self, atom_ids=None):
  function Cosine (line 454) | def Cosine(Rij, Rc, derivative=False):
  function W (line 462) | def W(nmax):
  function phi (line 477) | def phi(r, alpha, rcut):
  function g (line 483) | def g(r, n, nmax, rcut, w):
  function GaussChebyshevQuadrature (line 491) | def GaussChebyshevQuadrature(nmax, lmax):
  function compute_cs (line 500) | def compute_cs(pos, nmax, lmax, rcut, alpha, cutoff):
  function compute_dcs (line 575) | def compute_dcs(pos, nmax, lmax, rcut, alpha, cutoff):

FILE: pyxtal/lego/basinhopping.py
  class Storage (line 19) | class Storage:
    method __init__ (line 23) | def __init__(self, minres):
    method _add (line 26) | def _add(self, minres):
    method update (line 30) | def update(self, minres):
    method get_lowest (line 39) | def get_lowest(self):
  class BasinHoppingRunner (line 43) | class BasinHoppingRunner:
    method __init__ (line 66) | def __init__(self, x0, minimizer, step_taking, accept_tests, disp=False):
    method _monte_carlo_step (line 105) | def _monte_carlo_step(self):
    method one_cycle (line 165) | def one_cycle(self):
    method print_report (line 196) | def print_report(self, energy_trial, accept):
  class AdaptiveStepsize (line 204) | class AdaptiveStepsize:
    method __init__ (line 227) | def __init__(self, takestep, accept_rate=0.5, interval=50, factor=0.9,
    method __call__ (line 239) | def __call__(self, x):
    method _adjust_step_size (line 242) | def _adjust_step_size(self):
    method take_step (line 258) | def take_step(self, x):
    method report (line 265) | def report(self, accept, **kwargs):
  class RandomDisplacement (line 271) | class RandomDisplacement:
    method __init__ (line 292) | def __init__(self, stepsize=0.5, random_gen=None):
    method __call__ (line 296) | def __call__(self, x):
  class MinimizerWrapper (line 301) | class MinimizerWrapper:
    method __init__ (line 306) | def __init__(self, minimizer, func=None, **kwargs):
    method __call__ (line 311) | def __call__(self, x0):
  class Metropolis (line 333) | class Metropolis:
    method __init__ (line 353) | def __init__(self, T, random_gen=None):
    method accept_reject (line 360) | def accept_reject(self, res_new, res_old):
    method __call__ (line 383) | def __call__(self, *, res_new, res_old):
  function basinhopping (line 390) | def basinhopping(func, x0, niter=100, T=1.0, stepsize=0.5,

FILE: pyxtal/lego/builder.py
  function generate_wp_lib_par (line 42) | def generate_wp_lib_par(spgs, composition, num_wp, num_fu, num_dof):
  function generate_xtal_par (line 54) | def generate_xtal_par(wp_libs, niter, dim, elements, calculator, ref_env...
  function minimize_from_x_par (line 70) | def minimize_from_x_par(*args):
  function generate_xtal (line 89) | def generate_xtal(dim, spg, wps, niter, elements, calculator,
  function minimize_from_x (line 137) | def minimize_from_x(x, dim, spg, wps, elements, calculator, ref_environm...
  class builder (line 352) | class builder(object):
    method __init__ (line 372) | def __init__(self, elements, composition, dim=3, prefix='mof',
    method __str__ (line 405) | def __str__(self):
    method __repr__ (line 423) | def __repr__(self):
    method print_memory_usage (line 426) | def print_memory_usage(self):
    method set_descriptor_calculator (line 433) | def set_descriptor_calculator(self, dtype='SO3', mykwargs={}):
    method set_reference_enviroments (line 452) | def set_reference_enviroments(self, cif_file, substitute=None):
    method set_criteria (line 487) | def set_criteria(self, CN=None, dimension=None, min_density=None, excl...
    method get_input_from_letters (line 510) | def get_input_from_letters(self, spg, wps):
    method get_input_from_ref_xtal (line 520) | def get_input_from_ref_xtal(self, xtal, substitute=None):
    method get_similarity (line 550) | def get_similarity(self, xtal):
    method process_xtals (line 565) | def process_xtals(self, xtals, xs, add_db, symmetrize):
    method optimize_xtals (line 586) | def optimize_xtals(self, xtals, ncpu=1, opt_type='local',
    method optimize_xtals_serial (line 606) | def optimize_xtals_serial(self, xtals, args):
    method optimize_xtals_mproc (line 622) | def optimize_xtals_mproc(self, xtals, ncpu, args):
    method optimize_reps (line 682) | def optimize_reps(self, reps, ncpu=1, opt_type='local',
    method optimize_reps_serial (line 701) | def optimize_reps_serial(self, reps, args, N_grids):
    method optimize_reps_mproc (line 729) | def optimize_reps_mproc(self, reps, ncpu, args, N_grids):
    method optimize_xtal (line 799) | def optimize_xtal(self, xtal, count=0, opt_type='local',
    method generate_xtal (line 860) | def generate_xtal(self, spg, wps, niter, T=0.2, N_max=5,
    method generate_xtals_from_wp_libs (line 892) | def generate_xtals_from_wp_libs(self, wp_libs, N_max=5, ncpu=1,
    method get_wp_libs_from_spglist (line 948) | def get_wp_libs_from_spglist(self, spg_list,
    method get_wp_libs_from_xtals (line 1025) | def get_wp_libs_from_xtals(self, db_file=None,
    method import_structures (line 1073) | def import_structures(self, db_file, ids=(None, None),
    method process_xtal (line 1131) | def process_xtal(self, xtal, sim, count=0, xs=None, energy=None,
  class RandomDispBounds (line 1180) | class RandomDispBounds(object):
    method __init__ (line 1186) | def __init__(self, xmin, xmax, id1, id2, stepsize=0.1, dumpfile=None):
    method __call__ (line 1194) | def __call__(self, x):

FILE: pyxtal/lego/util.py
  function get_input_from_letters (line 5) | def get_input_from_letters(spg, sites, dim=3):
  function create_trajectory (line 32) | def create_trajectory(dumpfile, trjfile, modes=['Init', 'Iter'], dim=3):
  function calculate_dSdx (line 96) | def calculate_dSdx(x, xtal, des_ref, f, eps=1e-4, symmetry=True, verbose...
  function calculate_S (line 151) | def calculate_S(x, xtal, des_ref, f, return_rdf=False):

FILE: pyxtal/miscellaneous/LJ_bug.py
  function LJ (line 27) | def LJ(pos, dim, method=1, mu=0.1):
  function LJ_force (line 53) | def LJ_force(pos, dim, method=1, mu=0.1):
  function single_optimize (line 76) | def single_optimize(pos, dim=3, method=1, mu=0.1):
  function hyper_optimize (line 105) | def hyper_optimize(pos, dim, method=1, mu=0.1):
  function parse_symmetry (line 129) | def parse_symmetry(pos):
  class LJ_prediction (line 138) | class LJ_prediction:
    method __init__ (line 147) | def __init__(self, numIons, seed=None):
    method generate_cluster (line 155) | def generate_cluster(self, pgs=(2, 33)):
    method predict (line 164) | def predict(self, dim=3, maxN=100, ncpu=2, pgs=(2, 33), method=1):
    method relaxation (line 188) | def relaxation(self, dim, pgs, method, ind):

FILE: pyxtal/miscellaneous/Random_vasp_ase.py
  function pymatgen2ase (line 32) | def pymatgen2ase(struc):
  function ase2pymatgen (line 38) | def ase2pymatgen(struc):
  function symmetrize_cell (line 45) | def symmetrize_cell(struc, mode="C"):
  function set_vasp (line 59) | def set_vasp(level=0, pstress=0.0000, setup=None):
  function read_OUTCAR (line 124) | def read_OUTCAR(path="OUTCAR"):
  function good_lattice (line 137) | def good_lattice(struc):
  function optimize (line 142) | def optimize(struc, dir1):

FILE: pyxtal/miscellaneous/check_cluster_distances.py
  function check_cluster_distances (line 4) | def check_cluster_distances(cluster, tol):

FILE: pyxtal/miscellaneous/compatibility.py
  function get_ase_mol (line 11) | def get_ase_mol(molname):

FILE: pyxtal/miscellaneous/create_generators.py
  function rounded (line 9) | def rounded(op):

FILE: pyxtal/miscellaneous/debug_charmm.py
  function parse_input (line 1) | def parse_input(input_file):
  function parse_crd (line 24) | def parse_crd(crd_file):
  function parse_pdb (line 44) | def parse_pdb(pdb_file):
  function write_cif (line 65) | def write_cif(atoms, cell_params, symops, spgnum, outfile):

FILE: pyxtal/miscellaneous/distance_bug.py
  function find_short (line 6) | def find_short(dm):

FILE: pyxtal/miscellaneous/from_ase_molecule.py
  function get_ase_mol (line 11) | def get_ase_mol(molname):

FILE: pyxtal/miscellaneous/get_lj_cluster.py
  function parse_symmetry (line 23) | def parse_symmetry(pos):
  function get_lj_from_url (line 29) | def get_lj_from_url(N, address="http://doye.chem.ox.ac.uk/jon/structures...
  function parse_url_text (line 46) | def parse_url_text(data_str):
  function LJ (line 54) | def LJ(pos):

FILE: pyxtal/miscellaneous/get_molecule_from_pubchem.py
  class NumpyEncoder (line 12) | class NumpyEncoder(json.JSONEncoder):
    method default (line 13) | def default(self, obj):
  function read_molecule (line 19) | def read_molecule(mol, name):

FILE: pyxtal/miscellaneous/grid.py
  function op1 (line 18) | def op1(p): return p                           # (x, y)
  function op2 (line 19) | def op2(p): return np.array([-p[1], p[0] - p[1]])  # (-y, x-y)
  function op3 (line 20) | def op3(p): return np.array([-p[0] + p[1], -p[0]])  # (-x+y, -x)
  function op4 (line 21) | def op4(p): return -p                          # (-x, -y)
  function op5 (line 22) | def op5(p): return np.array([p[1], -p[0] + p[1]])   # (y, -x+y)
  function op6 (line 23) | def op6(p): return np.array([p[0] - p[1], p[0]])    # (x-y, x)
  function op7 (line 24) | def op7(p): return np.array([-p[1], -p[0]])         # (-y, -x)
  function op8 (line 25) | def op8(p): return np.array([-p[0] + p[1], p[1]])   # (-x+y, y)
  function op9 (line 26) | def op9(p): return np.array([p[0], p[0] - p[1]])    # (x, x-y)
  function op10 (line 27) | def op10(p): return np.array([p[1], p[0]])          # (y, x)
  function op11 (line 28) | def op11(p): return np.array([p[0] - p[1], -p[1]])   # (x-y, -y)
  function op12 (line 29) | def op12(p): return np.array([-p[0], -p[0] + p[1]])  # (-x, -x+y)
  function frac_to_cart (line 31) | def frac_to_cart(f):

FILE: pyxtal/miscellaneous/regen_wyckoffs_list.py
  function so (line 4) | def so(string):
  function extras (line 8) | def extras(sg):

FILE: pyxtal/miscellaneous/search_csd_from_pubchem.py
  function get_similar_cids (line 8) | def get_similar_cids(base, MaxRecords):
  function check_for_ccdc_structures (line 39) | def check_for_ccdc_structures(cid):

FILE: pyxtal/miscellaneous/test_all.py
  function newprint (line 11) | def newprint(text):
  class Logger (line 29) | class Logger:
    method __init__ (line 30) | def __init__(self):
    method write (line 34) | def write(self, message):
    method flush (line 38) | def flush(self):
  function compare_wyckoffs (line 48) | def compare_wyckoffs(num1, num2, dim=3):
  function check_struct_group (line 92) | def check_struct_group(crystal, group, dim=3, tol=1e-2):
  function passed (line 179) | def passed():
  function reset (line 186) | def reset():
  function fail (line 194) | def fail(*argv):
  function check (line 213) | def check():
  function end (line 221) | def end(condition=1):
  function test_atomic (line 234) | def test_atomic():
  function test_molecular (line 322) | def test_molecular():
  function test_atomic_2D (line 411) | def test_atomic_2D():
  function test_molecular_2D (line 467) | def test_molecular_2D():
  function test_atomic_1D (line 523) | def test_atomic_1D():
  function test_molecular_1D (line 597) | def test_molecular_1D():
  function test_cluster (line 671) | def test_cluster():
  function test_modules (line 726) | def test_modules():

FILE: pyxtal/miscellaneous/test_db.py
  function get_wyckoffs (line 32) | def get_wyckoffs(sg):

FILE: pyxtal/miscellaneous/test_euclidean.py
  function test (line 7) | def test(spg, pt, cell):

FILE: pyxtal/miscellaneous/test_matrix.py
  function mat_a (line 14) | def mat_a(a):
  function mat_b (line 18) | def mat_b(b):
  function mat_c (line 22) | def mat_c(c):
  function strain_matrix (line 26) | def strain_matrix(a, b, c):
  function shear_matrix (line 34) | def shear_matrix(a, b, c):
  function random_strain (line 38) | def random_strain():
  function random_matrix (line 46) | def random_matrix(width=1.0, unitary=False):

FILE: pyxtal/miscellaneous/web_scalping_script/pubchem_import.py
  function get_similar_cids (line 9) | def get_similar_cids(base, MaxRecords):
  function check_for_ccdc_structures (line 26) | def check_for_ccdc_structures(cids):
  function ccdcid_scalper (line 63) | def ccdcid_scalper(cids):

FILE: pyxtal/molecular_crystal.py
  class molecular_crystal (line 20) | class molecular_crystal:
    method __init__ (line 49) | def __init__(
    method __str__ (line 135) | def __str__(self):
    method __repr__ (line 148) | def __repr__(self):
    method set_sites (line 151) | def set_sites(self, sites):
    method set_molecules (line 183) | def set_molecules(self, molecules, torsions):
    method set_orientations (line 221) | def set_orientations(self):
    method set_volume (line 251) | def set_volume(self):
    method set_lattice (line 260) | def set_lattice(self, lattice):
    method set_crystal (line 318) | def set_crystal(self):
    method _set_coords (line 352) | def _set_coords(self):
    method _set_mol_wyckoffs (line 372) | def _set_mol_wyckoffs(self, id, numMol, pyxtal_mol, valid_ori, mol_wyks):
    method _set_orientation (line 457) | def _set_orientation(self, pyxtal_mol, pt, oris, wp):
    method _check_consistency (line 491) | def _check_consistency(self, site, numMol):

FILE: pyxtal/molecule.py
  function find_rotor_from_smile (line 34) | def find_rotor_from_smile(smile):
  function has_non_aromatic_ring (line 130) | def has_non_aromatic_ring(smiles):
  function generate_molecules (line 159) | def generate_molecules(smile, wps=None, N_iter=5, N_conf=10, tol=0.5, us...
  class pyxtal_molecule (line 234) | class pyxtal_molecule:
    method list_molecules (line 266) | def list_molecules():
    method __init__ (line 272) | def __init__(
    method __str__ (line 365) | def __str__(self):
    method save_str (line 368) | def save_str(self):
    method load_str (line 375) | def load_str(cls, string):
    method copy (line 382) | def copy(self):
    method swap_axis (line 388) | def swap_axis(self, ax):
    method get_box (line 397) | def get_box(self, padding=None):
    method get_lengths (line 425) | def get_lengths(self):
    method get_max_length (line 430) | def get_max_length(self):
    method get_box_coordinates (line 434) | def get_box_coordinates(self, xyz, padding=0, resolution=1.0):
    method get_radius (line 504) | def get_radius(self):
    method get_symbols (line 520) | def get_symbols(self):
    method get_tols_matrix (line 523) | def get_tols_matrix(self, mol2=None, tm=None):
    method set_labels (line 559) | def set_labels(self):
    method get_coefs_matrix (line 675) | def get_coefs_matrix(self, mol2=None, ignore_error=True):
    method show (line 815) | def show(self):
    method show_box (line 823) | def show_box(self):
    method rdkit_mol (line 831) | def rdkit_mol(self, N_confs=1):
    method rdkit_mol_init (line 844) | def rdkit_mol_init(self, smile, fix, torsions):
    method perturb_torsion (line 919) | def perturb_torsion(self, xyz):
    method align (line 929) | def align(self, conf, reflect=False, torsionlist=None):
    method get_center (line 967) | def get_center(self, xyz, geometry=False):
    method get_principle_axes (line 1006) | def get_principle_axes(self, xyz, rdmt=True):
    method get_torsion_angles (line 1025) | def get_torsion_angles(self, xyz=None, torsionlist=None):
    method set_torsion_angles (line 1060) | def set_torsion_angles(self, conf, angles, reflect=False, torsionlist=...
    method relax (line 1074) | def relax(self, xyz, align=False):
    method get_rmsd2 (line 1103) | def get_rmsd2(self, xyz0, xyz1):
    method get_rmsd (line 1134) | def get_rmsd(self, xyz, debug=False):
    method get_orientation (line 1186) | def get_orientation(self, xyz, rtol=0.15):
    method to_ase (line 1258) | def to_ase(self):
    method reset_positions (line 1264) | def reset_positions(self, coors):
    method apply_inversion (line 1278) | def apply_inversion(self):
    method get_symmetry (line 1289) | def get_symmetry(self, xyz=None, symmetrize=False, rtol=0.30):
    method get_orientations_in_wps (line 1359) | def get_orientations_in_wps(self, wps=None, rtol=1e-2):
    method get_orientations_in_wp (line 1380) | def get_orientations_in_wp(self, wp, rtol=1e-2):
    method get_energy (line 1577) | def get_energy(self, xyz1, xyz2):
  class Box (line 1584) | class Box:
    method __init__ (line 1592) | def __init__(self, dims):
    method __str__ (line 1598) | def __str__(self):
    method operate (line 1601) | def operate(self, rot=np.eye(3), center=np.zeros(3)):
  class Orientation (line 1612) | class Orientation:
    method __init__ (line 1632) | def __init__(self, matrix=None, degrees=2, axis=None, random_state=None):
    method __str__ (line 1651) | def __str__(self):
    method reset_matrix (line 1663) | def reset_matrix(self, matrix):
    method __repr__ (line 1667) | def __repr__(self):
    method copy (line 1670) | def copy(self):
    method save_dict (line 1673) | def save_dict(self):
    method load_dict (line 1677) | def load_dict(cls, dicts):
    method change_orientation (line 1683) | def change_orientation(self, angle="random", flip=False, update=True):
    method set_axis (line 1729) | def set_axis(self):
    method rotate_by_matrix (line 1736) | def rotate_by_matrix(self, matrix, ignore_constraint=True):
    method get_matrix (line 1759) | def get_matrix(self, angle="random"):
    method get_op (line 1791) | def get_op(self):  # , angle=None):
    method random_orientation (line 1810) | def random_orientation(self):
    method get_Euler_angles (line 1822) | def get_Euler_angles(self):
  function get_inertia_tensor (line 1829) | def get_inertia_tensor(coords, weights=None):
  function reoriented_molecule (line 1853) | def reoriented_molecule(mol):
  function is_compatible_symmetry (line 1880) | def is_compatible_symmetry(mol, wp):
  function make_graph (line 1895) | def make_graph(mol, tol=0.2, ignore_HH=False):
  function compare_mol_connectivity (line 1932) | def compare_mol_connectivity(mol1, mol2, ignore_name=False, ignore_HH=Fa...

FILE: pyxtal/msg.py
  function printx (line 6) | def printx(text, priority=1):
  class Error (line 29) | class Error(Exception):
  class ConformerError (line 33) | class ConformerError(Error):
    method __init__ (line 41) | def __init__(self, message):
  class Symm_CompatibilityError (line 45) | class Symm_CompatibilityError(Error):
    method __init__ (line 53) | def __init__(self, message):
  class Comp_CompatibilityError (line 57) | class Comp_CompatibilityError(Error):
    method __init__ (line 65) | def __init__(self, message):
  class ReadSeedError (line 69) | class ReadSeedError(Error):
    method __init__ (line 77) | def __init__(self, message):
  class VolumeError (line 81) | class VolumeError(Error):
    method __init__ (line 89) | def __init__(self, message):
  class CSDError (line 93) | class CSDError(Error):
    method __init__ (line 101) | def __init__(self, message):
  class AtomTypeError (line 105) | class AtomTypeError(Error):
    method __init__ (line 113) | def __init__(self, message):

FILE: pyxtal/operations.py
  function check_distance (line 24) | def check_distance(
  function verify_distances (line 78) | def verify_distances(coordinates, species, lattice, factor=1.0, PBC=None):
  function check_images (line 111) | def check_images(
  function distance (line 174) | def distance(xyz, lattice, PBC=None):
  function distance_matrix (line 200) | def distance_matrix(pts1, pts2, lattice, PBC=None, single=False, metric=...
  function distance_matrix_no_PBC (line 245) | def distance_matrix_no_PBC(pts1, pts2, lattice, single=False, metric="eu...
  function create_matrix (line 271) | def create_matrix(PBC=None, omit=False):
  function filtered_coords (line 300) | def filtered_coords(coords, PBC=None):
  function filtered_coords_euclidean (line 328) | def filtered_coords_euclidean(coords, PBC=None):
  function get_inverse (line 358) | def get_inverse(op):
  function get_inverse_ops (line 416) | def get_inverse_ops(ops):
  function apply_ops (line 435) | def apply_ops(coord, ops):
  function apply_ops_diagonal (line 453) | def apply_ops_diagonal(coords, ops):
  function angle (line 470) | def angle(v1, v2, radians=True):
  function is_orthogonal (line 499) | def is_orthogonal(m, tol=0.001):
  function aa2matrix (line 516) | def aa2matrix(axis, angle, radians=True, random=False):
  function rotate_vector (line 564) | def rotate_vector(v1, v2, rtol=1e-4):
  function are_equal (line 598) | def are_equal(op1, op2, PBC=None, rtol=1e-3, atol=1e-3):
  class OperationAnalyzer (line 637) | class OperationAnalyzer(SymmOp):
    method get_order (line 659) | def get_order(angle, rotoinversion=False, tol=1e-2):
    method __init__ (line 681) | def __init__(self, op, parse_trans=False, hexagonal=False):
    method parse_screw_symmetry (line 806) | def parse_screw_symmetry(self, tol=1e-2):
    method parse_glide_symmetry (line 865) | def parse_glide_symmetry(self, tol=1e-2):
    method parse_axis (line 913) | def parse_axis(self):
    method __str__ (line 928) | def __str__(self):
    method is_conjugate (line 948) | def is_conjugate(self, op2):
    method are_conjugate (line 987) | def are_conjugate(op1, op2):
  function find_ids (line 1006) | def find_ids(coords, ref, tol=1e-3):
  function get_best_match (line 1024) | def get_best_match(positions, ref, cell):

FILE: pyxtal/optimize/DFS.py
  class DFS (line 18) | class DFS(GlobalOptimize):
    method __init__ (line 53) | def __init__(
    method full_str (line 151) | def full_str(self):
    method _run (line 159) | def _run(self, pool=None):
    method load (line 271) | def load(cls, filename):

FILE: pyxtal/optimize/QRS.py
  function generate_qrs_cell (line 19) | def generate_qrs_cell(sampler, cell_bounds, ref_volume, ltype):
  function generate_qrs_xtals (line 38) | def generate_qrs_xtals(cell, wp_bounds, N_pop, smiles, comp, sampler_wp=...
  class QRS (line 85) | class QRS(GlobalOptimize):
    method __init__ (line 119) | def __init__(
    method full_str (line 205) | def full_str(self):
    method _run (line 212) | def _run(self, pool=None):

FILE: pyxtal/optimize/WFS.py
  class WFS (line 18) | class WFS(GlobalOptimize):
    method __init__ (line 55) | def __init__(
    method full_str (line 160) | def full_str(self):
    method _run (line 168) | def _run(self, pool=None):
    method _selTournament (line 260) | def _selTournament(self, fitness, factor=0.35):
    method load (line 272) | def load(cls, filename):

FILE: pyxtal/optimize/base.py
  function setup_worker_logger (line 34) | def setup_worker_logger(log_file):
  function run_optimizer_with_timeout (line 44) | def run_optimizer_with_timeout(args, logger):
  function process_task (line 74) | def process_task(args):
  class GlobalOptimize (line 85) | class GlobalOptimize:
    method __init__ (line 118) | def __init__(
    method print (line 323) | def print(self, *args, **kwargs):
    method __str__ (line 328) | def __str__(self):
    method __repr__ (line 362) | def __repr__(self):
    method new_struc (line 365) | def new_struc(self, xtal, xtals):
    method run (line 368) | def run(self, ref_pmg=None, ref_pxrd=None):
    method select_xtals (line 410) | def select_xtals(self, ref_xtals, ids, N_max):
    method count_pxrd_match (line 424) | def count_pxrd_match(self, xtals, matches):
    method success_count (line 447) | def success_count(self, xtals, matches):
    method early_termination (line 482) | def early_termination(self, success_rate):
    method export_references (line 501) | def export_references(self, xtals, engs, N_min=50, dE=2.5, FMSE=2.5):
    method _prep_chm_info (line 575) | def _prep_chm_info(self, params0, params1=None, folder="calc", suffix=...
    method get_label (line 610) | def get_label(self, i, label='cpu'):
    method print_matches (line 619) | def print_matches(self, header=None):
    method _print_match (line 667) | def _print_match(self, xtal, ref_pmg):
    method _apply_gaussian (line 688) | def _apply_gaussian(self, reps, engs, h1=0.1, h2=0.1, w1=0.2, w2=3):
    method check_ref (line 745) | def check_ref(self, reps=None, reference=None, filename="pyxtal.cif"):
    method _get_local_optimization_args (line 800) | def _get_local_optimization_args(self):
    method local_optimization (line 830) | def local_optimization(self, xtals, qrs=False, pool=None):
    method local_optimization_serial (line 846) | def local_optimization_serial(self, xtals, qrs=False):
    method local_optimization_mpi (line 872) | def local_optimization_mpi(self, xtals, qrs, pool):
    method local_optimization_mproc (line 920) | def local_optimization_mproc(self, xtals, ncpu, ids=None, qrs=False, p...
    method gen_summary (line 966) | def gen_summary(self, t0, gen_results, xtals):
    method plot_results (line 1060) | def plot_results(self, save=True, figsize=(8.0, 5.0), figname=None, yl...
    method save (line 1146) | def save(self, filename):
  function load_xml (line 1192) | def load_xml(filename, tag='GO'):
  function text_to_list (line 1247) | def text_to_list(text, dtype=float):
  function text_to_arr (line 1258) | def text_to_arr(text, dtype=float):
  function text_to_2darr (line 1268) | def text_to_2darr(text, dtype=float):
  function text_to_float (line 1278) | def text_to_float(text):
  function text_to_bool (line 1287) | def text_to_bool(text):
  function arr_to_text (line 1296) | def arr_to_text(arr):

FILE: pyxtal/optimize/benchmark.py
  class benchmark (line 13) | class benchmark:
    method __init__ (line 23) | def __init__(self, struc, smiles, clean=True, work_dir="tmp", **kwargs):
    method calc (line 90) | def calc(self, calculator, show=True):
    method dftb (line 114) | def dftb(self, disp, show=True, logfile="ase.log"):
    method vasp (line 143) | def vasp(self, show=True):
    method ani (line 163) | def ani(self, show=True, logfile="ase-ani.log"):
    method charmm (line 191) | def charmm(self, show=True, steps=None):
    method gulp (line 216) | def gulp(self, show=True, step=None, stepmx=None):
    method charmm_md (line 263) | def charmm_md(self):
    method summary (line 266) | def summary(self, calc=None):

FILE: pyxtal/optimize/common.py
  function get_rmsd_with_timeout (line 25) | def get_rmsd_with_timeout(matcher, ref_pmg, structure, timeout=10):
  function sweep (line 45) | def sweep(xtal, comp, c_info, w_dir, job_tag, mlp, skip_mlp, optimizer, ...
  function check_stable_structure (line 110) | def check_stable_structure(xtal, c_info, w_dir, job_tag, mlp, skip_mlp, ...
  function mutator (line 153) | def mutator(xtal, smiles, opt_lat, ref_pxrd=None, dr=0.125, random_state...
  function randomizer (line 227) | def randomizer(
  function optimizer (line 311) | def optimizer(
  function optimizer_par (line 470) | def optimizer_par(
  function optimizer_single (line 543) | def optimizer_single(
  function refine_struc (line 665) | def refine_struc(xtal, smiles, calculator, mlp):
  function compute_par (line 686) | def compute_par(row, pmg, work_dir, skf_dir, queue, compute):
  function compute (line 698) | def compute(row, pmg, work_dir, skf_dir, info=None):
  function load_reference_from_db (line 760) | def load_reference_from_db(db_name, code=None):

FILE: pyxtal/plane.py
  function has_reduction (line 9) | def has_reduction(hkl):
  function reduced_hkl (line 20) | def reduced_hkl(hkl):
  function structure_factor (line 28) | def structure_factor(pos, hkl, total=True):
  function get_dspacing (line 36) | def get_dspacing(inv_matrix, hkl):
  class planes (line 39) | class planes:
    method __init__ (line 53) | def __init__(self, extent=6, d_min=1.5, cp_factor=0.5):
    method set_xtal (line 60) | def set_xtal(self, xtal):
    method set_planes (line 65) | def set_planes(self):
    method get_cp_factor (line 72) | def get_cp_factor(self, hkl):
    method search_close_packing_planes (line 87) | def search_close_packing_planes(self, N_max=10):
    method get_structure_factor (line 114) | def get_structure_factor(self, hkl):
    method get_separation (line 117) | def get_separation(self, hkl):
    method group_slabs (line 165) | def group_slabs(self, slabs, tol):
    method find_unique_separations (line 204) | def find_unique_separations(self, groups, d):
    method gather (line 213) | def gather(self, planes, tol=-0.1):
  class plane (line 229) | class plane:
    method __init__ (line 234) | def __init__(self, hkl, cell_reciprocal, separation=None):
    method __str__ (line 241) | def __str__(self):

FILE: pyxtal/potentials/LJ_cluster.py
  function LJ (line 9) | def LJ(pos, dim, mu=0.1, shift=False):
  function LJ_force (line 35) | def LJ_force(pos, dim, mu=0.1, shift=False):

FILE: pyxtal/reciprocal.py
  function bessel_basis (line 17) | def bessel_basis(r, nmax=6, r_cut=0.24):
  function gto_basis (line 35) | def gto_basis(r, nmax=6, r_cut=0.24):
  function chebyshev_basis (line 64) | def chebyshev_basis(r, nmax=6, r_cut=0.24):
  class RECP (line 84) | class RECP:
    method __init__ (line 95) | def __init__(self, dmax=6.0, nmax=4, lmax=4, rbasis='chebyshev', res=0...
    method __str__ (line 106) | def __str__(self):
    method __repr__ (line 111) | def __repr__(self):
    method build_reciprocal (line 114) | def build_reciprocal(self, atoms):
    method compute (line 184) | def compute(self, atoms, norm=False):
    method compute_rdf (line 197) | def compute_rdf(self, ds, vals):
    method compute_sph_torch (line 210) | def compute_sph_torch(self, xyz, v, norm=False):
    method plot (line 274) | def plot(self, data, filename='reciprocal.png'):
    method reconstruction (line 307) | def reconstruction(self, spg, wps, elements, rep0, P_ref, rdf_ref, ver...
    method loss (line 354) | def loss(self, spg, wps, elements, P_ref, RDF_ref):

FILE: pyxtal/representation.py
  class representation_atom (line 8) | class representation_atom:
    method __init__ (line 17) | def __init__(self, x):
    method __str__ (line 20) | def __str__(self):
    method from_pyxtal (line 24) | def from_pyxtal(cls, struc, standard=True):
    method to_standard_setting (line 41) | def to_standard_setting(self):
    method to_pyxtal (line 45) | def to_pyxtal(self):
    method to_array (line 114) | def to_array(self):
    method to_string (line 124) | def to_string(self, time=None, eng=None, tag=None):
  class representation (line 169) | class representation:
    method __init__ (line 179) | def __init__(self, x, smiles=None):
    method __str__ (line 190) | def __str__(self):
    method from_pyxtal (line 194) | def from_pyxtal(cls, struc, standard=False):
    method from_string (line 217) | def from_string(cls, inputs, smiles, composition=None):
    method to_standard_setting (line 269) | def to_standard_setting(self):
    method to_pyxtal (line 275) | def to_pyxtal(self, smiles=None, composition=None):
    method to_string (line 375) | def to_string(self, time=None, eng=None, tag=None):
    method same_smiles (line 421) | def same_smiles(self, smiles):
    method get_dist (line 427) | def get_dist(self, rep):
    method update_smiles (line 478) | def update_smiles(self, smiles):

FILE: pyxtal/supergroup.py
  function write_poscars (line 35) | def write_poscars(H_struc, G_struc, mappings, splitters, wyc_sets, N_ima...
  function new_structure (line 56) | def new_structure(struc, refs):
  function new_path (line 71) | def new_path(path, paths):
  function find_mapping_per_element (line 78) | def find_mapping_per_element(sites1, sites2):
  function find_mapping (line 119) | def find_mapping(atom_sites, splitter):
  function search_G1 (line 175) | def search_G1(G, rot, tran, pos, wp1, op):
  function search_G2 (line 216) | def search_G2(rot, tran, pos1, pos2, cell=None):
  function find_xyz (line 261) | def find_xyz(G2_op, coord, quadrant=None):
  class supergroup (line 330) | class supergroup:
    method __init__ (line 339) | def __init__(self, struc, G, random_state=None):
    method search_supergroup (line 365) | def search_supergroup(self, d_tol=0.9, max_per_G=2500, max_solutions=N...
    method make_supergroup (line 400) | def make_supergroup(self, solutions, show_detail=False):
    method calc_disps (line 427) | def calc_disps(self, split_id, solution, d_tol):
    method get_initial_mask (line 493) | def get_initial_mask(self, splitter):
    method get_coord_H (line 503) | def get_coord_H(self, splitter, id, atom_sites_H, mapping):
    method symmetrize_dist (line 525) | def symmetrize_dist(self, splitter, mapping, mask, translation=None, d...
    method symmetrize (line 577) | def symmetrize(self, splitter, mapping, translation):
    method print_wp (line 627) | def print_wp(self, sp, id):
    method symmetrize_site_single (line 637) | def symmetrize_site_single(self, splitter, id, base, translation, run_...
    method symmetrize_site_double_k (line 705) | def symmetrize_site_double_k(self, splitter, id, coord_H, translation,...
    method symmetrize_site_double_t (line 767) | def symmetrize_site_double_t(self, splitter, id, coord_H, translation,...
    method symmetrize_site_multi (line 831) | def symmetrize_site_multi(self, splitter, id, coord_H, translation, ru...
    method print_detail (line 926) | def print_detail(self, solution, coords_H, coords_G, elements):
    method sort_solutions (line 955) | def sort_solutions(self, solutions):
    method make_pyxtals_in_subgroup (line 961) | def make_pyxtals_in_subgroup(self, solution, N_images=5):
    method make_pyxtal_in_supergroup (line 1000) | def make_pyxtal_in_supergroup(self, solution):
    method _make_pyxtal (line 1018) | def _make_pyxtal(self, sp, coords, elements=None, run_type=0, check=Tr...
  class supergroups (line 1101) | class supergroups:
    method __init__ (line 1125) | def __init__(
    method __str__ (line 1170) | def __str__(self):
    method __repr__ (line 1183) | def __repr__(self):
    method print_solutions (line 1186) | def print_solutions(self):
    method get_transformation (line 1204) | def get_transformation(self, N_images=2):
    method struc_along_path (line 1235) | def struc_along_path(self, path):
    method write_cifs (line 1284) | def write_cifs(self):

FILE: pyxtal/symmetry.py
  function rf (line 38) | def rf(package_name, resource_path):
  class SymmetryData (line 46) | class SymmetryData:
    method __init__ (line 51) | def __init__(self):
    method get_t_subgroup (line 69) | def get_t_subgroup(cls):
    method get_k_subgroup (line 75) | def get_k_subgroup(cls):
    method get_wyckoff_sg (line 80) | def get_wyckoff_sg(self):
    method get_wyckoff_lg (line 85) | def get_wyckoff_lg(self):
    method get_wyckoff_rg (line 90) | def get_wyckoff_rg(self):
    method get_wyckoff_pg (line 95) | def get_wyckoff_pg(self):
    method get_symmetry_sg (line 100) | def get_symmetry_sg(self):
    method get_symmetry_lg (line 105) | def get_symmetry_lg(self):
    method get_symmetry_rg (line 110) | def get_symmetry_rg(self):
    method get_symmetry_pg (line 115) | def get_symmetry_pg(self):
    method get_generator_sg (line 120) | def get_generator_sg(self):
    method get_generator_lg (line 125) | def get_generator_lg(self):
    method get_generator_rg (line 130) | def get_generator_rg(self):
    method get_generator_pg (line 135) | def get_generator_pg(self):
    method get_hall_table (line 140) | def get_hall_table(self):
  class Hall (line 258) | class Hall:
    method __init__ (line 269) | def __init__(self, spgnum, style="pyxtal", permutation=False):
  class Group (line 295) | class Group:
    method __init__ (line 383) | def __init__(self, group, dim=3, use_hall=False, style="pyxtal", quick...
    method _initialize_hall_data (line 408) | def _initialize_hall_data(self, group, use_hall, style, dim):
    method _initialize_wyckoff_data (line 423) | def _initialize_wyckoff_data(self, dim):
    method __str__ (line 464) | def __str__(self):
    method __repr__ (line 480) | def __repr__(self):
    method __iter__ (line 483) | def __iter__(self):
    method __getitem__ (line 486) | def __getitem__(self, index):
    method __len__ (line 489) | def __len__(self):
    method get_ferroelectric_groups (line 492) | def get_ferroelectric_groups(self):
    method get_site_dof (line 498) | def get_site_dof(self, sites):
    method get_orders (line 517) | def get_orders(self):
    method get_spg_representation (line 530) | def get_spg_representation(self):
    method get_subgroup_composition (line 541) | def get_subgroup_composition(self, ids, g_types=['t', 'k'], max_atoms=...
    method get_lattice_id (line 597) | def get_lattice_id(self):
    method get_ASU (line 660) | def get_ASU(self):
    method get_ASU_instance (line 669) | def get_ASU_instance(self):
    method get_lattice_dof (line 678) | def get_lattice_dof(self):
    method is_valid_hkl (line 695) | def is_valid_hkl(self, h, k, l):
    method get_reflection_conditions (line 711) | def get_reflection_conditions(self):
    method generate_possible_hkls (line 769) | def generate_possible_hkls(self, h_max, k_max=None, l_max=None, max_sq...
    method generate_hkl_guesses (line 861) | def generate_hkl_guesses(self, h_max=2, k_max=None, l_max=None, max_sq...
    method reduce_hkl_guesses (line 958) | def reduce_hkl_guesses(self, hkls):
    method check_hkl_in_list (line 1054) | def check_hkl_in_list(self, hkl, hkl_list):
    method is_valid_combination (line 1067) | def is_valid_combination(self, sites):
    method list_wyckoff_combinations (line 1091) | def list_wyckoff_combinations(self, numIons, quick=False, numWp=(None,...
    method get_spg_symmetry_object (line 1246) | def get_spg_symmetry_object(self):
    method get_wyckoff_position (line 1268) | def get_wyckoff_position(self, index):
    method get_wyckoff_position_from_xyz (line 1286) | def get_wyckoff_position_from_xyz(self, xyz, decimals=4):
    method get_alternatives (line 1308) | def get_alternatives(self):
    method _get_max_k_subgroup (line 1320) | def _get_max_k_subgroup(cls, number=None):
    method _get_max_t_subgroup (line 1330) | def _get_max_t_subgroup(cls, number=None):
    method get_max_k_subgroup (line 1339) | def get_max_k_subgroup(self):
    method get_max_t_subgroup (line 1342) | def get_max_t_subgroup(self):
    method get_max_subgroup (line 1345) | def get_max_subgroup(self, H):
    method get_wp_list (line 1362) | def get_wp_list(self, reverse=False):
    method get_splitters_from_structure (line 1372) | def get_splitters_from_structure(self, struc, group_type="t"):
    method get_splitters_from_relation (line 1403) | def get_splitters_from_relation(self, struc, relation):
    method get_min_supergroup (line 1479) | def get_min_supergroup(self, group_type="t", G=None):
    method _get_max_subgroup_numbers (line 1516) | def _get_max_subgroup_numbers(cls, number, max_cell=9):
    method get_max_subgroup_numbers (line 1533) | def get_max_subgroup_numbers(self, max_cell=9):
    method check_compatible (line 1554) | def check_compatible(self, numIons, verbose=False):
    method _get_base_and_upper_bounds (line 1589) | def _get_base_and_upper_bounds(self):
    method search_supergroup_paths (line 1619) | def search_supergroup_paths(self, H, max_layer=5):
    method path_to_subgroup (line 1680) | def path_to_subgroup(self, H):
    method search_subgroup_paths (line 1707) | def search_subgroup_paths(self, G, max_layer=5):
    method add_k_transitions (line 1728) | def add_k_transitions(self, path, n=1):
    method path_to_general_wp (line 1764) | def path_to_general_wp(self, index=1, max_steps=1):
    method path_to_zp2 (line 1831) | def path_to_zp2(self):
    method short_path_to_general_wp (line 1852) | def short_path_to_general_wp(self, index=1, t_only=False):
    method get_valid_solutions (line 1870) | def get_valid_solutions(self, solutions):
    method cellsize (line 1890) | def cellsize(self):
    method get_free_axis (line 1916) | def get_free_axis(self):
    method list_groups (line 1965) | def list_groups(cls, dim=3):
    method get_index_by_letter (line 1989) | def get_index_by_letter(self, letter):
    method get_wp_by_letter (line 1998) | def get_wp_by_letter(self, letter):
    method get_symmetry_directions (line 2004) | def get_symmetry_directions(self):
  class Wyckoff_position (line 2016) | class Wyckoff_position:
    method from_dict (line 2033) | def from_dict(cls, dictionary):
    method from_group_and_letter (line 2049) | def from_group_and_letter(cls, group, letter, dim=3, style="pyxtal", h...
    method from_group_and_index (line 2076) | def from_group_and_index(cls, group, index, dim=3, use_hall=False, sty...
    method from_symops_wo_group (line 2140) | def from_symops_wo_group(cls, ops):
    method from_symops (line 2162) | def from_symops(cls, ops, G):
    method from_index_quick (line 2189) | def from_index_quick(self, wyckoffs, index, P=None, P1=None):
    method __str__ (line 2219) | def __str__(self, supress=False):
    method __repr__ (line 2244) | def __repr__(self):
    method __iter__ (line 2247) | def __iter__(self):
    method __getitem__ (line 2250) | def __getitem__(self, index):
    method __len__ (line 2253) | def __len__(self):
    method copy (line 2256) | def copy(self):
    method save_dict (line 2262) | def save_dict(self):
    method load_dict (line 2271) | def load_dict(cls, dicts):
    method set_ops (line 2278) | def set_ops(self):
    method get_ops_from_transformation (line 2281) | def get_ops_from_transformation(self):
    method update (line 2306) | def update(self):
    method update_hall (line 2322) | def update_hall(self, hall_numbers=None):
    method update_index (line 2371) | def update_index(self):
    method transform_from_matrices (line 2391) | def transform_from_matrices(self, trans):
    method transform_from_matrix (line 2399) | def transform_from_matrix(self, trans=None, reset=True, update=False):
    method process_ops (line 2427) | def process_ops(self):
    method equivalent_set (line 2448) | def equivalent_set(self, index):
    method get_site_symm_wo_translation (line 2468) | def get_site_symm_wo_translation(self):
    method get_site_symmetry_object (line 2471) | def get_site_symmetry_object(self, idx=0):
    method get_site_symmetry (line 2475) | def get_site_symmetry(self, idx=0):
    method get_site_symm_ops (line 2480) | def get_site_symm_ops(self, idx=0):
    method get_hm_number (line 2483) | def get_hm_number(self, tol=1e-5):
    method get_hm_symbol (line 2490) | def get_hm_symbol(self):
    method get_dof (line 2496) | def get_dof(self):
    method get_label (line 2502) | def get_label(self):
    method get_frozen_axis (line 2508) | def get_frozen_axis(self):
    method get_euclidean_symmetries (line 2538) | def get_euclidean_symmetries(self, idx=0):
    method get_euclidean_ops (line 2554) | def get_euclidean_ops(self):
    method get_euclidean_generator (line 2571) | def get_euclidean_generator(self, cell, idx=0):
    method get_free_xyzs (line 2592) | def get_free_xyzs(self, pos, perturb=False, eps=0.1, random_state: int...
    method get_position_from_free_xyzs (line 2617) | def get_position_from_free_xyzs(self, xyz):
    method get_all_positions (line 2632) | def get_all_positions(self, pos):
    method is_standard_setting (line 2661) | def is_standard_setting(self):
    method has_equivalent_ops (line 2675) | def has_equivalent_ops(self, wp2, tol=1e-3):
    method is_pure_translation (line 2697) | def is_pure_translation(self, id):
    method swap_axis (line 2709) | def swap_axis(self, swap_id):
    method print_ops (line 2744) | def print_ops(self, ops=None):
    method gen_pos (line 2750) | def gen_pos(self):
    method are_equivalent_pts (line 2756) | def are_equivalent_pts(self, pt1, pt2, cell=None, tol=0.05):
    method distance_check (line 2781) | def distance_check(self, pt, lattice, tol):
    method short_distances (line 2797) | def short_distances(self, pt, lattice, tol):
    method merge (line 2819) | def merge(self, pt, lattice, tol, orientations=None, group=None):
    method set_generators (line 2911) | def set_generators(self):
    method set_euclidean (line 2922) | def set_euclidean(self):
    method search_generator_dist (line 2937) | def search_generator_dist(self, pt, lattice=None, group=None):
    method search_generator (line 2974) | def search_generator(self, pos, ops=None, tol=1e-2, symmetrize=False):
    method search_all_generators (line 3012) | def search_all_generators(self, pos, ops=None, tol=1e-2):
    method apply_ops (line 3040) | def apply_ops(self, pt):
    method project (line 3046) | def project(self, point, cell=None, PBC=None, id=0):
    method to_discrete_grid (line 3108) | def to_discrete_grid(self, xyz, N_grids=50):
    method from_discrete_grid (line 3118) | def from_discrete_grid(self, xyz, N_grids=50):
  function choose_wyckoff (line 3129) | def choose_wyckoff(G, number=None, site=None, dim=3, random_state: int |...
  function choose_wyckoff_mol (line 3176) | def choose_wyckoff_mol(
  function swap_xyz_string (line 3240) | def swap_xyz_string(xyzs, permutation):
  function swap_xyz_ops (line 3279) | def swap_xyz_ops(ops, permutation):
  function op_transform (line 3305) | def op_transform(ops, affine_matrix):
  function op_translation (line 3323) | def op_translation(op, tran):
  function are_equivalent_ops (line 3356) | def are_equivalent_ops(op1, op2, tol=1e-2):
  function letter_from_index (line 3365) | def letter_from_index(index, group, dim=3):
  function index_from_letter (line 3390) | def index_from_letter(letter, group, dim=3):
  function jk_from_i (line 3414) | def jk_from_i(i, olist):
  class site_symmetry (line 3440) | class site_symmetry:
    method __init__ (line 3461) | def __init__(self, ops, lattice_type, Bravis, number, wp_id=0, parse_t...
    method to_one_hot (line 3488) | def to_one_hot(self, verbose=False):
    method to_matrix_representation (line 3498) | def to_matrix_representation(self, verbose=False):
    method set_table (line 3582) | def set_table(self, skip=False):
    method set_full_hm_symbols (line 3613) | def set_full_hm_symbols(self, tables):
    method unique_symmetry (line 3638) | def unique_symmetry(self, symbols, symmetry):
    method ref_symmetry (line 3641) | def ref_symmetry(self, symbols, reference):
    method set_short_symbols (line 3644) | def set_short_symbols(self):
    method get_name (line 3817) | def get_name(self):
    method to_beautiful_matrix_representation (line 3830) | def to_beautiful_matrix_representation(self, skip=True):
    method get_highest_symmetry (line 3843) | def get_highest_symmetry(self, row):
    method correct_matrix (line 3926) | def correct_matrix(self, matrix):
  function organized_wyckoffs (line 3976) | def organized_wyckoffs(group):
  function symmetry_element_from_axis (line 4000) | def symmetry_element_from_axis(axis):
  function get_wyckoffs (line 4029) | def get_wyckoffs(num, organized=False, dim=3):
  function _get_wyckoffs_cached (line 4076) | def _get_wyckoffs_cached(num, dim):
  function get_wyckoff_symmetry (line 4097) | def get_wyckoff_symmetry(num, dim=3):
  function _get_wyckoff_symmetry_cached (line 4116) | def _get_wyckoff_symmetry_cached(num, dim):
  function get_generators (line 4139) | def get_generators(num, dim=3):
  function _get_generators_cached (line 4162) | def _get_generators_cached(num, dim):
  function site_symm (line 4183) | def site_symm(point, gen_pos, tol=1e-3, lattice=None, PBC=None):
  function check_wyckoff_position (line 4249) | def check_wyckoff_position(points, group, tol=1e-3):
  function get_symbol_and_number (line 4325) | def get_symbol_and_number(input_group, dim=3):
  function check_symmetry_and_dim (line 4365) | def check_symmetry_and_dim(number, dim=3):
  function get_pbc_and_lattice (line 4388) | def get_pbc_and_lattice(number, dim):
  function search_cloest_wp (line 4437) | def search_cloest_wp(G, wp, op, pos):
  function get_point_group (line 4494) | def get_point_group(number):
  function get_close_packed_groups (line 4585) | def get_close_packed_groups(pg):
  function para2ferro (line 4611) | def para2ferro(pg):
  function get_all_polar_space_groups (line 4701) | def get_all_polar_space_groups():
  function abc2matrix (line 4712) | def abc2matrix(abc):
  function get_symmetry_from_ops (line 4763) | def get_symmetry_from_ops(ops, tol=1e-5):
  function identity_ops (line 4782) | def identity_ops(op):
  function transform_ops (line 4790) | def transform_ops(ops, P, P1):
  function trim_ops (line 4824) | def trim_ops(ops):
  function find_axis_order (line 4873) | def find_axis_order(axis, directions):
  function get_symmetry_directions (line 4881) | def get_symmetry_directions(lattice_type, symbol="P", unique_axis="b"):
  function is_hkl_allowed (line 4916) | def is_hkl_allowed(h, k, l, spg):
  function get_canonical_hkl (line 5057) | def get_canonical_hkl(h, k, l, spg):
  function get_canonical_hkl_series (line 5100) | def get_canonical_hkl_series(hkl_series, spg):
  function get_bravais_lattice (line 5233) | def get_bravais_lattice(spg):
  function get_lattice_type (line 5287) | def get_lattice_type(bravais):
  function is_hkl_allowed_by_bravais (line 5304) | def is_hkl_allowed_by_bravais(h, k, l, bravais):
  function generate_possible_hkls (line 5340) | def generate_possible_hkls(bravais, h_max=50, k_max=50, l_max=50):

FILE: pyxtal/symmetry_sampler.py
  class Sampler (line 5) | class Sampler:
    method __init__ (line 11) | def __init__(self, composition=[1, 2], max_atoms=100, max_wp=20, verbo...
    method generate_combinations (line 29) | def generate_combinations(self):
    method augment_data (line 66) | def augment_data(self, train_data, weight=10):
    method add_composition (line 89) | def add_composition(self, data, multiplier=1):
    method get_top_combinations (line 109) | def get_top_combinations(self, top_n=10):
    method sample (line 122) | def sample(self, N=1):

FILE: pyxtal/tolerance.py
  class Tol_matrix (line 5) | class Tol_matrix:
    method __init__ (line 23) | def __init__(self, *tuples, prototype="atomic", factor=1.0):
    method get_tol (line 79) | def get_tol(self, specie1, specie2):
    method set_tol (line 99) | def set_tol(self, specie1, specie2, value):
    method from_matrix (line 125) | def from_matrix(self, matrix, prototype="atomic", factor=1.0, begin_wi...
    method from_radii (line 155) | def from_radii(self, radius_list, prototype="atomic", factor=1.0, begi...
    method from_single_value (line 183) | def from_single_value(self, value):
    method __getitem__ (line 201) | def __getitem__(self, index):
    method __str__ (line 205) | def __str__(self):
    method to_file (line 223) | def to_file(self, filename=None):
    method from_file (line 254) | def from_file(self, filename):

FILE: pyxtal/util.py
  function find_dir (line 19) | def find_dir(dirs):
  function listToString (line 29) | def listToString(s):
  function pymatgen2ase (line 37) | def pymatgen2ase(struc):
  function ase2pymatgen (line 47) | def ase2pymatgen(struc):
  function symmetrize_cell (line 57) | def symmetrize_cell(struc, mode="C"):
  function good_lattice (line 74) | def good_lattice(struc, maxvec=50.0, minvec=1.2, maxang=150, minang=30):
  function symmetrize (line 86) | def symmetrize(pmg, tol=1e-3, a_tol=5.0, style="pyxtal", hn=None):
  function get_symmetrized_pmg (line 115) | def get_symmetrized_pmg(pmg, tol=1e-3, a_tol=5.0, style="pyxtal", hn=None):
  function extract_ase_db (line 143) | def extract_ase_db(db_file, id):
  function parse_cif (line 166) | def parse_cif(filename, header=False, spg=False, eng=False, csd=False, s...
  function process_csd_cif (line 236) | def process_csd_cif(cif, remove_H=False):
  function get_similar_cids_from_pubchem (line 261) | def get_similar_cids_from_pubchem(base, MaxRecords):
  function search_csd_code_by_pubchem (line 292) | def search_csd_code_by_pubchem(cid):
  function search_csd_entries_by_code (line 334) | def search_csd_entries_by_code(code):
  function get_struc_from__parser (line 370) | def get_struc_from__parser(p):
  function Kgrid (line 438) | def Kgrid(struc, Kresol=0.10, dimension=3):
  function sort_by_dimer (line 461) | def sort_by_dimer(atoms, N_mols, id=10, tol=4.0):
  function generate_wp_lib (line 515) | def generate_wp_lib(
  function reset_lammps_cell (line 583) | def reset_lammps_cell(atoms0):
  function new_struc (line 598) | def new_struc(xtal, xtals):
  function new_struc_wo_energy (line 633) | def new_struc_wo_energy(xtal, xtals, ltol=0.2, stol=0.3, angle_tol=5.0, ...
  function split_list_by_ratio (line 670) | def split_list_by_ratio(nums, ratio):
  function prettify (line 709) | def prettify(elem):
  function get_pmg_dist (line 720) | def get_pmg_dist(pmg1, pmg2, ltol=0.3, stol=0.3, angle_tol=5.0, scale=Tr...
  function get_wyc_from_comp (line 733) | def get_wyc_from_comp(composition: int,
  function check_upper_bounds (line 784) | def check_upper_bounds(solutions: List[Tuple[int]], upper_bounds: List[i...

FILE: pyxtal/viz.py
  function addBox (line 6) | def addBox(view, vecs, viewer=None):
  function addlines (line 70) | def addlines(view, orig, axes, viewer=None):
  function display_atomic (line 90) | def display_atomic(struc, size=(600, 300), scale=0.25, radius=0.10, supe...
  function display_molecular (line 129) | def display_molecular(
  function display_molecular_site (line 187) | def display_molecular_site(site, id=None, size=(400, 300), axis=True, ax...
  function display_molecules (line 235) | def display_molecules(molecules, size=(400, 300), animation=False, cente...
  function display_molecule (line 266) | def display_molecule(molecule, center, cell, size=(400, 300)):
  function display_mol_crystals (line 304) | def display_mol_crystals(
  function display_crystals (line 350) | def display_crystals(strucs, size=(600, 300), supercell=(1, 1, 1), label...
  function display_cluster (line 379) | def display_cluster(molecules, cell, Ps, cmap="YlGn", s_opacity=0.5, siz...

FILE: pyxtal/wyckoff_site.py
  class atom_site (line 27) | class atom_site:
    method __init__ (line 38) | def __init__(self, wp=None, coordinate=None, specie=1, search=False):
    method __str__ (line 53) | def __str__(self):
    method __repr__ (line 65) | def __repr__(self):
    method copy (line 68) | def copy(self):
    method save_dict (line 75) | def save_dict(self):
    method _get_dof (line 82) | def _get_dof(self):
    method get_bounds (line 89) | def get_bounds(self):
    method load_dict (line 99) | def load_dict(cls, dicts):
    method perturbate (line 115) | def perturbate(self, lattice, magnitude=0.1):
    method search_position (line 129) | def search_position(self, tol=1e-3):
    method encode (line 154) | def encode(self):
    method shift_by_swap (line 165) | def shift_by_swap(self, swap_id):
    method equivalent_set (line 183) | def equivalent_set(self, tran, indices):
    method update (line 199) | def update(self, pos=None, reset_wp=False):
    method get_translations (line 211) | def get_translations(self, pos, axis):
    method get_disp (line 229) | def get_disp(self, pos, lattice, translation):
    method check_with_ws2 (line 250) | def check_with_ws2(self, ws2, lattice, tol, same_group=True):
    method substitute_with_single (line 291) | def substitute_with_single(self, ele):
    method substitute_with_linear (line 301) | def substitute_with_linear(self, eles, direction, lattice):
    method to_mol_site (line 324) | def to_mol_site(self, lattice, molecule, ori=None, reflect=False, type...
  class mol_site (line 350) | class mol_site:
    method __init__ (line 384) | def __init__(self, mol, position, orientation, wp, lattice=None, stype...
    method update_molecule (line 404) | def update_molecule(self, mol):
    method update_orientation (line 411) | def update_orientation(self, angles):
    method get_min_dist (line 416) | def get_min_dist(self, angle=None):
    method optimize_orientation_by_dist (line 435) | def optimize_orientation_by_dist(self, ori_attempts=10, verbose=False):
    method get_energy (line 476) | def get_energy(self, angle=None, wps=[], k1=1.0, r1=1.0, k2=2.0, k3=1....
    method get_dist_angle_AD (line 551) | def get_dist_angle_AD(self, d_total, ids_total, A_id, D_ids, H_ids, rA):
    method get_dist_angle_DA (line 610) | def get_dist_angle_DA(self, d_total, ids_total, D_id, A_ids, rD, rH):
    method optimize_orientation_by_energy (line 640) | def optimize_orientation_by_energy(self, wps=[], max_ax=20, max_ori=5,...
    method cut_lattice (line 683) | def cut_lattice(self, ax, cut):
    method __str__ (line 703) | def __str__(self):
    method __repr__ (line 718) | def __repr__(self):
    method _get_dof (line 721) | def _get_dof(self):
    method get_bounds (line 730) | def get_bounds(self):
    method save_dict (line 746) | def save_dict(self):
    method load_dict (line 763) | def load_dict(cls, dicts):
    method encode (line 778) | def encode(self):
    method to_1D_dicts (line 792) | def to_1D_dicts(self):
    method from_1D_dicts (line 820) | def from_1D_dicts(cls, dicts):
    method show (line 860) | def show(self, id=None, **kwargs):
    method _get_coords_and_species (line 868) | def _get_coords_and_species(self, absolute=False, PBC=False,
    method get_coords_and_species (line 930) | def get_coords_and_species(self, absolute=False, PBC=False, unitcell=F...
    method perturbate (line 947) | def perturbate(self, lattice, trans=0.1, rot=5):
    method translate (line 965) | def translate(self, disp=np.zeros(3), absolute=False):
    method rotate (line 975) | def rotate(self, ax_id=0, ax_vector=None, angle=180):
    method is_valid_orientation (line 1010) | def is_valid_orientation(self):
    method get_mol_object (line 1013) | def get_mol_object(self, id=0):
    method show_molecule_in_box (line 1050) | def show_molecule_in_box(self, id=0):
    method update (line 1064) | def update(self, coords=None, lattice=None, absolute=False, update_mol...
    method _create_matrix (line 1136) | def _create_matrix(self, center=False, ignore=False):
    method get_distances (line 1179) | def get_distances(self, coord1, coord2, m2=None, center=True, ignore=F...
    method get_dists_auto (line 1217) | def get_dists_auto(self, matrix=None, ignore=False, cutoff=None):
    method extract_short_distances (line 1238) | def extract_short_distances(self, ds, coords, cutoff, label1, label2):
    method get_dists_WP (line 1251) | def get_dists_WP(self, matrix=None, ignore=False, idx=None, cutoff=None):
    method get_dists_WP2 (line 1272) | def get_dists_WP2(self, wp2, matrix=None, ignore=False, cutoff=None):
    method short_dist (line 1288) | def short_dist(self):
    method short_dist_with_wp2 (line 1312) | def short_dist_with_wp2(self, wp2, tm=Tol_matrix(prototype="molecular")):
    method get_neighbors_auto (line 1354) | def get_neighbors_auto(self, factor=1.1, max_d=4.0, ignore_E=True, det...
    method get_neighbors_wp2 (line 1508) | def get_neighbors_wp2(self, wp2, factor=1.1, max_d=4.0, ignore_E=True,...
    method get_ijk_lists (line 1572) | def get_ijk_lists(self, value=None):
    method to_atom_site (line 1598) | def to_atom_site(self, specie=1):

FILE: pyxtal/wyckoff_split.py
  class wyckoff_split (line 10) | class wyckoff_split:
    method __init__ (line 25) | def __init__(self, G=197, idx=None, wp1=None, group_type="t",
    method sort (line 94) | def sort(self):
    method parse_wp2 (line 108) | def parse_wp2(self, idx):
    method split_t (line 140) | def split_t(self, wp1, wp2_lists, quadrant=None):
    method split_k (line 319) | def split_k(self, wp1, wp2_lists, tol=1e-5):
    method translation_generator (line 416) | def translation_generator(self):
    method check_orbits (line 479) | def check_orbits(self, g1_orbits, wp2, wp2_lists):
    method __str__ (line 492) | def __str__(self):
    method __repr__ (line 509) | def __repr__(self):
  function in_lists (line 513) | def in_lists(mat1, mat2, eps=1e-2, PBC=True):

FILE: scripts/pyxtal_csp_rank.py
  function new_struc (line 11) | def new_struc(xtal, xtals, max_num=100):

FILE: scripts/rank.py
  function new_struc (line 11) | def new_struc(xtal, xtals, max_num=100):

FILE: setup.py
  class CustomInstallCommand (line 5) | class CustomInstallCommand(install):
    method run (line 6) | def run(self):

FILE: tests/test_SO3.py
  function calculate_S (line 9) | def calculate_S(atoms, P_ref):
  function numerical_dSdx (line 15) | def numerical_dSdx(x, xtal,  P_ref, eps=1e-4):
  function calculate_dSdx_supercell (line 39) | def calculate_dSdx_supercell(x, xtal, P_ref, eps=1e-4):
  function get_rotated_cluster (line 78) | def get_rotated_cluster(struc, angle=0, axis='x'):
  function get_perturbed_cluster (line 85) | def get_perturbed_cluster(struc, p0, p1, eps):
  function get_perturbed_xtal (line 93) | def get_perturbed_xtal(struc, p0, p1, eps):
  function get_dPdR_xtal (line 100) | def get_dPdR_xtal(xtal, eps):
  class TestCluster (line 135) | class TestCluster(unittest.TestCase):
    method test_SO3_rotation_variance (line 141) | def test_SO3_rotation_variance(self):
    method test_dPdR_vs_numerical (line 146) | def test_dPdR_vs_numerical(self):
  class TestXtal (line 157) | class TestXtal(unittest.TestCase):
    method test_dPdR_diamond (line 159) | def test_dPdR_diamond(self):
    method test_dPdR_graphite (line 164) | def test_dPdR_graphite(self):
    method test_dPdR_random (line 169) | def test_dPdR_random(self):
    method test_dPdR_random_P (line 175) | def test_dPdR_random_P(self):
  class TestSimilarity (line 186) | class TestSimilarity(unittest.TestCase):
    method test_sim_diamond (line 188) | def test_sim_diamond(self):
    method test_dPdR_random (line 199) | def test_dPdR_random(self):

FILE: tests/test_all.py
  function resource_filename (line 18) | def resource_filename(package_name, resource_path):
  class TestNeighbour (line 30) | class TestNeighbour(unittest.TestCase):
    method test_packing (line 31) | def test_packing(self):
  class TestSubgroup (line 56) | class TestSubgroup(unittest.TestCase):
    method test_cubic_cubic (line 57) | def test_cubic_cubic(self):
    method test_from_seed (line 80) | def test_from_seed(self):
    method test_molecules (line 91) | def test_molecules(self):
    method test_hydrate (line 119) | def test_hydrate(self):
    method test_special (line 128) | def test_special(self):
  class TestLoad (line 136) | class TestLoad(unittest.TestCase):
    method test_atomic (line 137) | def test_atomic(self):
    method test_molecular (line 146) | def test_molecular(self):
  class TestPartial (line 156) | class TestPartial(unittest.TestCase):
    method test_Al2SiO5 (line 157) | def test_Al2SiO5(self):
  class Test_resort (line 189) | class Test_resort(unittest.TestCase):
    method test_molecule (line 190) | def test_molecule(self):
    method test_atom (line 204) | def test_atom(self):
  class Test_operations (line 263) | class Test_operations(unittest.TestCase):
    method test_inverse (line 264) | def test_inverse(self):
    method test_swap_wp (line 314) | def test_swap_wp(self):
    method test_alternative (line 325) | def test_alternative(self):
    method test_wyc_sets (line 335) | def test_wyc_sets(self):
    method test_trans (line 339) | def test_trans(self):
    class TestSubstitution (line 367) | class TestSubstitution(unittest.TestCase):
      method test_substitute_1_2 (line 368) | def test_substitute_1_2(self):
      method test_criteria (line 385) | def test_criteria(self):

FILE: tests/test_crystal.py
  function resource_filename (line 14) | def resource_filename(package_name, resource_path):
  class TestDof (line 26) | class TestDof(unittest.TestCase):
    method test_atomic (line 27) | def test_atomic(self):
  class TestAtomic3D (line 35) | class TestAtomic3D(unittest.TestCase):
    method test_partial (line 37) | def test_partial(self):
    method test_single_specie (line 54) | def test_single_specie(self):
    method test_mutiple_species (line 62) | def test_mutiple_species(self):
    method test_preassigned_sites (line 70) | def test_preassigned_sites(self):
    method test_read (line 86) | def test_read(self):
    method test_read_spglib (line 96) | def test_read_spglib(self):
    method test_read_by_HN (line 114) | def test_read_by_HN(self):
    method test_from_tabular (line 124) | def test_from_tabular(self):
  class TestAtomic2D (line 150) | class TestAtomic2D(unittest.TestCase):
    method test_single_specie (line 151) | def test_single_specie(self):
    method test_mutiple_species (line 158) | def test_mutiple_species(self):
  class TestAtomic1D (line 164) | class TestAtomic1D(unittest.TestCase):
    method test_single_specie (line 165) | def test_single_specie(self):
    method test_mutiple_species (line 172) | def test_mutiple_species(self):
  class TestCluster (line 178) | class TestCluster(unittest.TestCase):
    method test_multi_sites (line 179) | def test_multi_sites(self):
    method test_single_specie (line 188) | def test_single_specie(self):
    method test_mutiple_species (line 193) | def test_mutiple_species(self):

FILE: tests/test_group.py
  function resource_filename (line 12) | def resource_filename(package_name, resource_path):
  class TestGroup (line 24) | class TestGroup(unittest.TestCase):
    method test_generate_wp_lib (line 25) | def test_generate_wp_lib(self):
    method test_list_wyckoff_combinations (line 31) | def test_list_wyckoff_combinations(self):
    method test_print_group_and_dof (line 38) | def test_print_group_and_dof(self):
    method test_get_spg_symmetry_object (line 45) | def test_get_spg_symmetry_object(self):
    method test_short_path (line 54) | def test_short_path(self):
    method test_spg_symmetry (line 59) | def test_spg_symmetry(self):
    method test_ferroelectric (line 74) | def test_ferroelectric(self):
    method test_check_compatible (line 80) | def test_check_compatible(self):
    method test_subgroup_composition (line 88) | def test_subgroup_composition(self):
    method test_search_supergroup_paths (line 97) | def test_search_supergroup_paths(self):
    method test_get_splitters (line 101) | def test_get_splitters(self):
    method test_add_k_transitions (line 108) | def test_add_k_transitions(self):
    method test_to_subgroup (line 123) | def test_to_subgroup(self):
    method test_get_wyckoff_position_from_xyz (line 129) | def test_get_wyckoff_position_from_xyz(self):
    method test_short_path_to_general_wp (line 148) | def test_short_path_to_general_wp(self):

FILE: tests/test_lattice.py
  function resource_filename (line 15) | def resource_filename(package_name, resource_path):
  class TestLattice (line 27) | class TestLattice(unittest.TestCase):
    method test_para_matrix (line 28) | def test_para_matrix(self):
    method test_swap (line 31) | def test_swap(self):
    method test_optimize_once (line 36) | def test_optimize_once(self):
    method test_optimize_multi (line 41) | def test_optimize_multi(self):
    method test_setpara (line 46) | def test_setpara(self):
    method test_search_transformation (line 51) | def test_search_transformation(self):
    method test_is_valid_lattice (line 59) | def test_is_valid_lattice(self):
    method test_from_1d_representation (line 67) | def test_from_1d_representation(self):
  class TestOptimizeLattice (line 74) | class TestOptimizeLattice(unittest.TestCase):
    method test_atomic (line 75) | def test_atomic(self):
    method test_molecular_from_seed (line 94) | def test_molecular_from_seed(self):
    method test_molecular_trans (line 106) | def test_molecular_trans(self):
    method test_molecular_nonstd (line 117) | def test_molecular_nonstd(self):
    method test_molecular_from_random (line 132) | def test_molecular_from_random(self):
    method test_transform (line 145) | def test_transform(self):
    method test_build (line 161) | def test_build(self):
    method test_build_1D (line 185) | def test_build_1D(self):
    method test_build_2D (line 197) | def test_build_2D(self):
    method test_transforms (line 211) | def test_transforms(self):
    method test_optlat_setting (line 242) | def test_optlat_setting(self):

FILE: tests/test_lego.py
  class TestBuilder (line 24) | class TestBuilder(unittest.TestCase):
    method test_opt_xtal (line 36) | def test_opt_xtal(self):
    method test_opt_xtal2 (line 49) | def test_opt_xtal2(self):
    method test_opt_xtals (line 58) | def test_opt_xtals(self):
    method test_opt_diamond (line 73) | def test_opt_diamond(self):
    method test_diamond (line 90) | def test_diamond(self):

FILE: tests/test_mem.py
  function print_memory_usage (line 4) | def print_memory_usage():

FILE: tests/test_molecule.py
  function resource_filename (line 16) | def resource_filename(package_name, resource_path):
  class TestMolecule (line 28) | class TestMolecule(unittest.TestCase):
    method test_get_orientations_in_wp (line 29) | def test_get_orientations_in_wp(self):
  class TestMolecular (line 37) | class TestMolecular(unittest.TestCase):
    method test_single_specie (line 38) | def test_single_specie(self):
    method test_sites (line 60) | def test_sites(self):
    method test_sites_xyz (line 73) | def test_sites_xyz(self):
    method test_read (line 80) | def test_read(self):
    method test_big_molecule (line 92) | def test_big_molecule(self):
    method test_from_random_site (line 105) | def test_from_random_site(self):
    method test_c60 (line 113) | def test_c60(self):
    method test_mutiple_species (line 118) | def test_mutiple_species(self):
    method test_distance (line 135) | def test_distance(self):
    method test_molecular_2d (line 168) | def test_molecular_2d(self):
    method test_molecular_1d (line 174) | def test_molecular_1d(self):
    method test_preassigned_sites (line 179) | def test_preassigned_sites(self):
    method test_special_sites (line 185) | def test_special_sites(self):

FILE: tests/test_site_symm.py
  function csv_to_rst (line 4) | def csv_to_rst(csv_path, rst_path):

FILE: tests/test_supergroup.py
  function resource_filename (line 14) | def resource_filename(package_name, resource_path):
  class TestSupergroup (line 26) | class TestSupergroup(unittest.TestCase):
    method test_supergroup (line 27) | def test_supergroup(self):
    method test_make_pyxtal (line 41) | def test_make_pyxtal(self):
    method test_by_group (line 62) | def test_by_group(self):
    method test_by_path (line 75) | def test_by_path(self):
    method test_long (line 85) | def test_long(self):
    method test_long2 (line 115) | def test_long2(self):
    method test_multi (line 152) | def test_multi(self):
    method test_similarity (line 177) | def test_similarity(self):
    method test_get_disp_sets (line 204) | def test_get_disp_sets(self):

FILE: tests/test_symmetry.py
  function resource_filename (line 9) | def resource_filename(package_name, resource_path):
  class TestSymmetry (line 20) | class TestSymmetry(unittest.TestCase):
    method test_hexagonal_canonical_hkl_equivalence (line 21) | def test_hexagonal_canonical_hkl_equivalence(self):
    method test_hexagonal_canonical_hkl_series_equivalence (line 35) | def test_hexagonal_canonical_hkl_series_equivalence(self):
    method test_from_symops_wo_grou (line 46) | def test_from_symops_wo_grou(self):
    method test_from_symops (line 59) | def test_from_symops(self):
    method test_reflections (line 72) | def test_reflections(self):
    method test_site_symms (line 110) | def test_site_symms(self):

FILE: tests/test_wyckoff.py
  function resource_filename (line 13) | def resource_filename(package_name, resource_path):
  class TestWP (line 25) | class TestWP(unittest.TestCase):
    method test_wp_check_translation (line 26) | def test_wp_check_translation(self):
    method test_wp_site_symm_obj (line 29) | def test_wp_site_symm_obj(self):
    method test_wp_site_symm (line 37) | def test_wp_site_symm(self):
    method test_wp_dof (line 61) | def test_wp_dof(self):
    method test_wp_label (line 68) | def test_wp_label(self):
    method test_merge (line 74) | def test_merge(self):
    method test_search_generator (line 94) | def test_search_generator(self):
    method test_get_wyckoff (line 100) | def test_get_wyckoff(self):
    method test_setting (line 105) | def test_setting(self):
    method test_standarize (line 110) | def test_standarize(self):
    method test_is_equivalent (line 113) | def test_is_equivalent(self):
    method test_project (line 131) | def test_project(self):
    method test_euclidean (line 139) | def test_euclidean(self):
  class Test_wyckoff_site (line 188) | class Test_wyckoff_site(unittest.TestCase):
    method test_atom_site (line 189) | def test_atom_site(self):

FILE: tests/test_xrd.py
  function resource_filename (line 9) | def resource_filename(package_name, resource_path):
  class TestPXRD (line 15) | class TestPXRD(unittest.TestCase):
    method test_similarity (line 16) | def test_similarity(self):
    method test_match (line 33) | def test_match(self):
Copy disabled (too large) Download .json
Condensed preview — 610 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (32,336K chars).
[
  {
    "path": ".gitattributes",
    "chars": 29,
    "preview": "doc/* linguist-documentation\n"
  },
  {
    "path": ".github/workflows/python-publish.yml",
    "chars": 1084,
    "preview": "# This workflow will upload a Python Package using Twine when a release is created\n# For more information see: https://d"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 1413,
    "preview": "name: tests\n\non:\n  push:\n    paths:\n      - '**.py' # only run workflow when source files changed\n  pull_request:\n    br"
  },
  {
    "path": ".gitignore",
    "chars": 246,
    "preview": "*.py[cod]\n\n# Packages\n*.egg\n*.egg-info\ndist\nbuild\neggs\n.eggs/*\nparts\nbin\nvar\nsdist\ndevelop-eggs\n.installed.cfg\nlib\nlib64"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 530,
    "preview": "# Install these hooks with `pre-commit install`.\n\nci:\n  autoupdate_schedule: quarterly\n\nrepos:\n  - repo: https://github."
  },
  {
    "path": ".readthedocs.yaml",
    "chars": 816,
    "preview": "# Read the Docs configuration file for Sphinx projects\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1080,
    "preview": "MIT License\n\nCopyright 2018 Scott Fredericks, Qiang Zhu\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "MANIFEST.in",
    "chars": 83,
    "preview": "include /*.py\ninclude database/*.py\ninclude database/*.csv\ninclude database/*.json\n"
  },
  {
    "path": "README.md",
    "chars": 6756,
    "preview": "<img src=\"https://raw.githubusercontent.com/MaterSim/PyXtal/master/images/512px_type1.png\" alt=\"PyXtal\" width=\"300\"/>\n\n["
  },
  {
    "path": "SECURITY.md",
    "chars": 619,
    "preview": "# Security Policy\n\n## Supported Versions\n\nUse this section to tell people about which versions of your project are\ncurre"
  },
  {
    "path": "_config.yml",
    "chars": 14,
    "preview": "markdown: GFM\n"
  },
  {
    "path": "doc/Algorithm.rst",
    "chars": 21579,
    "preview": "How PyXtal Works\n================\n\nPyXtal is a free, open source Python package intended to aid with crystal structure p"
  },
  {
    "path": "doc/Background.rst",
    "chars": 39338,
    "preview": "Background and Theory\n=====================\nThis is a pedagogical introduction to crystallography and basic group theory"
  },
  {
    "path": "doc/COMMAND_MODE.rst",
    "chars": 8429,
    "preview": "Run PyXtal executables\n======================\n\nCurrently, we provide several utilities to the users so that they can run"
  },
  {
    "path": "doc/Installation.rst",
    "chars": 3290,
    "preview": "Installation and Setup\n======================\n\nDependencies\n------------\n\nVersions indicated are those used during devel"
  },
  {
    "path": "doc/Makefile",
    "chars": 603,
    "preview": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHI"
  },
  {
    "path": "doc/README.txt",
    "chars": 409,
    "preview": "This is the documentation folder for PyXtal. We use Sphinx to automatically generate documentation.\n\nThe following comma"
  },
  {
    "path": "doc/Settings.rst",
    "chars": 7172,
    "preview": "Group Settings\n==============\n\nFor the output 3D structures, PyXtal uses the conventional standard cell (same\nas `Bilbao"
  },
  {
    "path": "doc/Symmetry_representation.rst",
    "chars": 93666,
    "preview": "Symmetry Representation\n=======================\n\nSpace Group Symmetry\n--------------------\nIn crystallography, the Herma"
  },
  {
    "path": "doc/Usage.rst",
    "chars": 45023,
    "preview": "PyXtal as a library\n===================\n\nWhile the PyXtal can be used in the command mode, it can become much more\npower"
  },
  {
    "path": "doc/conf.py",
    "chars": 6257,
    "preview": "#\n# Configuration file for the Sphinx documentation builder.\n#\n# This file does only contain a selection of the most com"
  },
  {
    "path": "doc/files/all.cif",
    "chars": 468209,
    "preview": "\r\n#######################################################################\r\n#\r\n#                 Cambridge Crystallograph"
  },
  {
    "path": "doc/index.rst",
    "chars": 2621,
    "preview": ".. PyXtal documentation master file, created by\n   sphinx-quickstart on Mon Aug 27 10:19:01 2018.\n   You can adapt this "
  },
  {
    "path": "doc/make.bat",
    "chars": 810,
    "preview": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sp"
  },
  {
    "path": "doc/modules.rst",
    "chars": 55,
    "preview": "pyxtal\n======\n\n.. toctree::\n   :maxdepth: 4\n\n   pyxtal\n"
  },
  {
    "path": "doc/pyxtal.XRD.rst",
    "chars": 118,
    "preview": "pyxtal.XRD module\n=================\n\n.. automodule:: pyxtal.XRD\n   :members:\n   :undoc-members:\n   :show-inheritance:\n"
  },
  {
    "path": "doc/pyxtal.block_crystal.rst",
    "chars": 150,
    "preview": "pyxtal.block\\_crystal module\n============================\n\n.. automodule:: pyxtal.block_crystal\n   :members:\n   :undoc-m"
  },
  {
    "path": "doc/pyxtal.constants.rst",
    "chars": 136,
    "preview": "pyxtal.constants module\n=======================\n\n.. automodule:: pyxtal.constants\n   :members:\n   :undoc-members:\n   :sh"
  },
  {
    "path": "doc/pyxtal.crystal.rst",
    "chars": 130,
    "preview": "pyxtal.crystal module\n=====================\n\n.. automodule:: pyxtal.crystal\n   :members:\n   :undoc-members:\n   :show-inh"
  },
  {
    "path": "doc/pyxtal.database.cifs.rst",
    "chars": 150,
    "preview": "pyxtal.database.cifs package\n============================\n\n.. automodule:: pyxtal.database.cifs\n   :members:\n   :undoc-m"
  },
  {
    "path": "doc/pyxtal.database.collection.rst",
    "chars": 166,
    "preview": "pyxtal.database.collection module\n=================================\n\n.. automodule:: pyxtal.database.collection\n   :memb"
  },
  {
    "path": "doc/pyxtal.database.element.rst",
    "chars": 157,
    "preview": "pyxtal.database.element module\n==============================\n\n.. automodule:: pyxtal.database.element\n   :members:\n   :"
  },
  {
    "path": "doc/pyxtal.database.rst",
    "chars": 326,
    "preview": "pyxtal.database package\n=======================\n\n.. automodule:: pyxtal.database\n   :members:\n   :undoc-members:\n   :sho"
  },
  {
    "path": "doc/pyxtal.db.rst",
    "chars": 115,
    "preview": "pyxtal.db module\n================\n\n.. automodule:: pyxtal.db\n   :members:\n   :undoc-members:\n   :show-inheritance:\n"
  },
  {
    "path": "doc/pyxtal.descriptor.rst",
    "chars": 139,
    "preview": "pyxtal.descriptor module\n========================\n\n.. automodule:: pyxtal.descriptor\n   :members:\n   :undoc-members:\n   "
  },
  {
    "path": "doc/pyxtal.elasticity.rst",
    "chars": 139,
    "preview": "pyxtal.elasticity module\n========================\n\n.. automodule:: pyxtal.elasticity\n   :members:\n   :undoc-members:\n   "
  },
  {
    "path": "doc/pyxtal.interface.LJ.rst",
    "chars": 145,
    "preview": "pyxtal.interface.LJ module\n==========================\n\n.. automodule:: pyxtal.interface.LJ\n   :members:\n   :undoc-member"
  },
  {
    "path": "doc/pyxtal.interface.ase_opt.rst",
    "chars": 160,
    "preview": "pyxtal.interface.ase_opt module\n===============================\n\n.. automodule:: pyxtal.interface.ase_opt\n   :members:\n "
  },
  {
    "path": "doc/pyxtal.interface.charmm.rst",
    "chars": 157,
    "preview": "pyxtal.interface.charmm module\n==============================\n\n.. automodule:: pyxtal.interface.charmm\n   :members:\n   :"
  },
  {
    "path": "doc/pyxtal.interface.dftb.rst",
    "chars": 151,
    "preview": "pyxtal.interface.dftb module\n============================\n\n.. automodule:: pyxtal.interface.dftb\n   :members:\n   :undoc-"
  },
  {
    "path": "doc/pyxtal.interface.gulp.rst",
    "chars": 151,
    "preview": "pyxtal.interface.gulp module\n============================\n\n.. automodule:: pyxtal.interface.gulp\n   :members:\n   :undoc-"
  },
  {
    "path": "doc/pyxtal.interface.lammpslib.rst",
    "chars": 166,
    "preview": "pyxtal.interface.lammpslib module\n=================================\n\n.. automodule:: pyxtal.interface.lammpslib\n   :memb"
  },
  {
    "path": "doc/pyxtal.interface.rst",
    "chars": 375,
    "preview": "pyxtal.interface package\n========================\n\n.. automodule:: pyxtal.interface\n   :members:\n   :undoc-members:\n   :"
  },
  {
    "path": "doc/pyxtal.interface.vasp.rst",
    "chars": 151,
    "preview": "pyxtal.interface.vasp module\n============================\n\n.. automodule:: pyxtal.interface.vasp\n   :members:\n   :undoc-"
  },
  {
    "path": "doc/pyxtal.io.rst",
    "chars": 115,
    "preview": "pyxtal.io module\n================\n\n.. automodule:: pyxtal.io\n   :members:\n   :undoc-members:\n   :show-inheritance:\n"
  },
  {
    "path": "doc/pyxtal.lattice.rst",
    "chars": 130,
    "preview": "pyxtal.lattice module\n=====================\n\n.. automodule:: pyxtal.lattice\n   :members:\n   :undoc-members:\n   :show-inh"
  },
  {
    "path": "doc/pyxtal.lego.SO3.rst",
    "chars": 137,
    "preview": "pyxtal.lego.SO3 module\n==========================\n\n.. automodule:: pyxtal.lego.SO3\n   :members:\n   :undoc-members:\n   :s"
  },
  {
    "path": "doc/pyxtal.lego.basinhopping.rst",
    "chars": 160,
    "preview": "pyxtal.lego.basinhopping module\n===============================\n\n.. automodule:: pyxtal.lego.basinhopping\n   :members:\n "
  },
  {
    "path": "doc/pyxtal.lego.builder.rst",
    "chars": 145,
    "preview": "pyxtal.lego.builder module\n==========================\n\n.. automodule:: pyxtal.lego.builder\n   :members:\n   :undoc-member"
  },
  {
    "path": "doc/pyxtal.lego.rst",
    "chars": 247,
    "preview": "pyxtal.lego package\n===================\n\n.. automodule:: pyxtal.lego\n   :members:\n   :undoc-members:\n   :show-inheritanc"
  },
  {
    "path": "doc/pyxtal.molecular_crystal.rst",
    "chars": 162,
    "preview": "pyxtal.molecular\\_crystal module\n================================\n\n.. automodule:: pyxtal.molecular_crystal\n   :members:"
  },
  {
    "path": "doc/pyxtal.molecule.rst",
    "chars": 133,
    "preview": "pyxtal.molecule module\n======================\n\n.. automodule:: pyxtal.molecule\n   :members:\n   :undoc-members:\n   :show-"
  },
  {
    "path": "doc/pyxtal.msg.rst",
    "chars": 118,
    "preview": "pyxtal.msg module\n=================\n\n.. automodule:: pyxtal.msg\n   :members:\n   :undoc-members:\n   :show-inheritance:\n"
  },
  {
    "path": "doc/pyxtal.operations.rst",
    "chars": 139,
    "preview": "pyxtal.operations module\n========================\n\n.. automodule:: pyxtal.operations\n   :members:\n   :undoc-members:\n   "
  },
  {
    "path": "doc/pyxtal.optimize.DFS.rst",
    "chars": 145,
    "preview": "pyxtal.optimize.DFS module\n==========================\n\n.. automodule:: pyxtal.optimize.DFS\n   :members:\n   :undoc-member"
  },
  {
    "path": "doc/pyxtal.optimize.QRS.rst",
    "chars": 145,
    "preview": "pyxtal.optimize.QRS module\n==========================\n\n.. automodule:: pyxtal.optimize.QRS\n   :members:\n   :undoc-member"
  },
  {
    "path": "doc/pyxtal.optimize.WFS.rst",
    "chars": 145,
    "preview": "pyxtal.optimize.WFS module\n==========================\n\n.. automodule:: pyxtal.optimize.WFS\n   :members:\n   :undoc-member"
  },
  {
    "path": "doc/pyxtal.optimize.base.rst",
    "chars": 148,
    "preview": "pyxtal.optimize.base module\n===========================\n\n.. automodule:: pyxtal.optimize.base\n   :members:\n   :undoc-mem"
  },
  {
    "path": "doc/pyxtal.optimize.benchmark.rst",
    "chars": 163,
    "preview": "pyxtal.optimize.benchmark module\n================================\n\n.. automodule:: pyxtal.optimize.benchmark\n   :members"
  },
  {
    "path": "doc/pyxtal.optimize.common.rst",
    "chars": 154,
    "preview": "pyxtal.optimize.common module\n=============================\n\n.. automodule:: pyxtal.optimize.common\n   :members:\n   :und"
  },
  {
    "path": "doc/pyxtal.optimize.rst",
    "chars": 337,
    "preview": "pyxtal.optimize package\n=======================\n\n.. automodule:: pyxtal.optimize\n   :members:\n   :undoc-members:\n   :sho"
  },
  {
    "path": "doc/pyxtal.plane.rst",
    "chars": 124,
    "preview": "pyxtal.plane module\n===================\n\n.. automodule:: pyxtal.plane\n   :members:\n   :undoc-members:\n   :show-inheritan"
  },
  {
    "path": "doc/pyxtal.potentials.LJ_cluster.rst",
    "chars": 174,
    "preview": "pyxtal.potentials.LJ\\_cluster module\n====================================\n\n.. automodule:: pyxtal.potentials.LJ_cluster\n"
  },
  {
    "path": "doc/pyxtal.potentials.rst",
    "chars": 227,
    "preview": "pyxtal.potentials package\n=========================\n\n.. automodule:: pyxtal.potentials\n   :members:\n   :undoc-members:\n "
  },
  {
    "path": "doc/pyxtal.representation.rst",
    "chars": 151,
    "preview": "pyxtal.representation module\n============================\n\n.. automodule:: pyxtal.representation\n   :members:\n   :undoc-"
  },
  {
    "path": "doc/pyxtal.rst",
    "chars": 751,
    "preview": "pyxtal package\n==============\n\n.. automodule:: pyxtal\n   :members:\n   :undoc-members:\n   :show-inheritance:\n\nSubpackages"
  },
  {
    "path": "doc/pyxtal.supergroup.rst",
    "chars": 139,
    "preview": "pyxtal.supergroup module\n========================\n\n.. automodule:: pyxtal.supergroup\n   :members:\n   :undoc-members:\n   "
  },
  {
    "path": "doc/pyxtal.symmetry.rst",
    "chars": 133,
    "preview": "pyxtal.symmetry module\n======================\n\n.. automodule:: pyxtal.symmetry\n   :members:\n   :undoc-members:\n   :show-"
  },
  {
    "path": "doc/pyxtal.tolerance.rst",
    "chars": 136,
    "preview": "pyxtal.tolerance module\n=======================\n\n.. automodule:: pyxtal.tolerance\n   :members:\n   :undoc-members:\n   :sh"
  },
  {
    "path": "doc/pyxtal.util.rst",
    "chars": 121,
    "preview": "pyxtal.util module\n==================\n\n.. automodule:: pyxtal.util\n   :members:\n   :undoc-members:\n   :show-inheritance:"
  },
  {
    "path": "doc/pyxtal.version.rst",
    "chars": 130,
    "preview": "pyxtal.version module\n=====================\n\n.. automodule:: pyxtal.version\n   :members:\n   :undoc-members:\n   :show-inh"
  },
  {
    "path": "doc/pyxtal.viz.rst",
    "chars": 118,
    "preview": "pyxtal.viz module\n=================\n\n.. automodule:: pyxtal.viz\n   :members:\n   :undoc-members:\n   :show-inheritance:\n"
  },
  {
    "path": "doc/pyxtal.wyckoff_site.rst",
    "chars": 147,
    "preview": "pyxtal.wyckoff\\_site module\n===========================\n\n.. automodule:: pyxtal.wyckoff_site\n   :members:\n   :undoc-memb"
  },
  {
    "path": "doc/pyxtal.wyckoff_split.rst",
    "chars": 150,
    "preview": "pyxtal.wyckoff\\_split module\n============================\n\n.. automodule:: pyxtal.wyckoff_split\n   :members:\n   :undoc-m"
  },
  {
    "path": "doc/requirements.txt",
    "chars": 167,
    "preview": "pyxtal>=1.0.0\nspglib>=1.10.4\npymatgen>=2023.2.28\npandas>=2.0.2\nnetworkx>=2.3\nscipy>=1.7.3\nimportlib_metadata>=1.4\nase>=3"
  },
  {
    "path": "examples/README.md",
    "chars": 1801,
    "preview": "# This is a collections of examples and tutorials to demonstrate how to use PyXtal\n```\n├── README.md\n├── example_01_3D_V"
  },
  {
    "path": "examples/example_00_LJ_simple.py",
    "chars": 2292,
    "preview": "\"\"\"This script:\n1. Generates random clusters\n2. Performs optimization using the Lennard-Jones potential\n\"\"\"\n\nfrom time i"
  },
  {
    "path": "examples/example_01_3D_VASP.py",
    "chars": 2495,
    "preview": "\"\"\"\nThis script:\n1. Generates random crystal structures\n2. Performs multiple steps of optimization with ASE-VASP\n\nRequir"
  },
  {
    "path": "examples/example_02_LJ_cluster.py",
    "chars": 7228,
    "preview": "\"\"\"This is a script to:\n1, generate random clusters.\n2, perform optimization.\n3, compare the efficiency of different alg"
  },
  {
    "path": "examples/example_03_LJ_optalg.py",
    "chars": 9474,
    "preview": "\"\"\"This is a script to:\n1, generate random clusters.\n2, perform optimization.\n3, compare the efficiency of different alg"
  },
  {
    "path": "examples/example_04_LJ_38.py",
    "chars": 11800,
    "preview": "\"\"\"This is a script to:\n1, generate random clusters.\n2, perform optimization.\n\"\"\"\n\nimport json\nimport warnings\nfrom copy"
  },
  {
    "path": "examples/example_05_LJ_4D.py",
    "chars": 8654,
    "preview": "import warnings\nfrom copy import deepcopy\nfrom optparse import OptionParser\nfrom time import time\n\nimport matplotlib.pyp"
  },
  {
    "path": "examples/example_06_C_2D_lammps.py",
    "chars": 3808,
    "preview": "import logging\nimport os\n\nimport numpy as np\nimport pymatgen.analysis.structure_matcher as sm\nfrom ase.db import connect"
  },
  {
    "path": "examples/example_07_3D_ICE_lammps.py",
    "chars": 2952,
    "preview": "import logging\nimport os\n\nimport numpy as np\nfrom ase.db import connect\nfrom lammps import lammps\nfrom spglib import get"
  },
  {
    "path": "examples/test_installation.py",
    "chars": 1493,
    "preview": "# %%\nimport os\n\nimport ase\nfrom lammps import lammps\n\nfrom pyxtal import __version__ as pyxtal_version\nfrom pyxtal impor"
  },
  {
    "path": "examples/tutorials_notebook/01_atomic_crystals.ipynb",
    "chars": 95785,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial 1: Atomic crystal module"
  },
  {
    "path": "examples/tutorials_notebook/02_molecular_crystals.ipynb",
    "chars": 351137,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial 2: Molecular crystal mod"
  },
  {
    "path": "examples/tutorials_notebook/03_pxrd.ipynb",
    "chars": 3892024,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial 3: PXRD module in PyXtal"
  },
  {
    "path": "examples/tutorials_notebook/04_box.ipynb",
    "chars": 3787449,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"7fb27b941602401d91542211134fc71a\",\n   \"metadata\": {},\n   \"source"
  },
  {
    "path": "examples/tutorials_notebook/05-crystal-packing.ipynb",
    "chars": 172922,
    "preview": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial 5: Molecular crystal pac"
  },
  {
    "path": "examples/tutorials_notebook/ABAVUW.cif",
    "chars": 14782,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "examples/tutorials_notebook/aspirin.cif",
    "chars": 12951,
    "preview": "####################################################################### \n# \n# This file contains crystal structure data "
  },
  {
    "path": "examples/tutorials_notebook/lt_quartz.cif",
    "chars": 866,
    "preview": "# generated using pymatgen\ndata_SiO2\n_symmetry_space_group_name_H-M   P3_221\n_cell_length_a   5.02778205\n_cell_length_b "
  },
  {
    "path": "flask/.flaskenv",
    "chars": 31,
    "preview": "FLASK_APP=vxrd.py\nFLASK_DEBUG=1"
  },
  {
    "path": "flask/README.md",
    "chars": 1183,
    "preview": "# VXRD: Virtual X-Ray Diffraction\nVXRD is a web interface to visualize PyXtal's [PXRD](https://nbviewer.jupyter.org/gith"
  },
  {
    "path": "flask/app/__init__.py",
    "chars": 1557,
    "preview": "import logging\nimport os\nfrom flask import Flask\nfrom config import Config\nfrom flask_bootstrap import Bootstrap\nfrom fl"
  },
  {
    "path": "flask/app/errors.py",
    "chars": 247,
    "preview": "from flask import render_template\nfrom app import app\n\n\n@app.errorhandler(404)\ndef not_found_error(error):\n    return re"
  },
  {
    "path": "flask/app/forms.py",
    "chars": 4154,
    "preview": "from flask_wtf import FlaskForm\nfrom flask_wtf.file import FileField, FileRequired, FileAllowed\nfrom wtforms import Floa"
  },
  {
    "path": "flask/app/routes.py",
    "chars": 9370,
    "preview": "import io\nimport os\nimport plotly.graph_objects as go\nfrom flask import render_template, flash, session, Markup\nfrom app"
  },
  {
    "path": "flask/app/static/css/custom.css",
    "chars": 1550,
    "preview": "::selection {\n  background:#b10202;\n  color:#fff;\n}\n.navbar {\n  min-height: 65px;\n  margin-bottom: 0px;\n}\n.navbar-nav {\n"
  },
  {
    "path": "flask/app/static/jsmol.js",
    "chars": 1028,
    "preview": "var jmol;\nvar Info = {\n  color: \"0xFFFFFF\",\n  height: 400,\n  width: 550,\n  use: \"HTML5\",\n  allowJavaScript: false,\n  j2s"
  },
  {
    "path": "flask/app/templates/404.html",
    "chars": 146,
    "preview": "{% extends \"base.html\" %}\n\n{% block app_content %}\n    <h1>File not found</h1>\n    <p><a href=\"{{ url_for('index') }}\">B"
  },
  {
    "path": "flask/app/templates/500.html",
    "chars": 248,
    "preview": "{% extends \"base.html\" %}\n\n{% block app_content %}\n    <h1>An unexpected error has occurred</h1>\n    <p>An administrator"
  },
  {
    "path": "flask/app/templates/_formhelpers.html",
    "chars": 1002,
    "preview": "{% macro render_field(field, class) %}\n  {% if field.errors %}\n    <div class=\"form-group  {{ class }}  has-error requir"
  },
  {
    "path": "flask/app/templates/base.html",
    "chars": 3909,
    "preview": "<head>\n  <link rel=\"shortcut icon\"\n    href=\"{{ url_for('static', filename='img/favicon.ico') }}\">\n</head>\n{% extends 'b"
  },
  {
    "path": "flask/app/templates/comparison.html",
    "chars": 1883,
    "preview": "{% extends \"base.html\" %}\n{% import 'bootstrap/wtf.html' as wtf %}\n{% from \"_formhelpers.html\" import render_field, stru"
  },
  {
    "path": "flask/app/templates/index.html",
    "chars": 843,
    "preview": "{% extends \"base.html\" %}\n{% import 'bootstrap/wtf.html' as wtf %}\n\n{% block splash %}\n<div class=\"jumbotron\" title=\"Ima"
  },
  {
    "path": "flask/app/templates/individual.html",
    "chars": 1696,
    "preview": "{% extends \"base.html\" %}\n{% import 'bootstrap/wtf.html' as wtf %}\n{% from \"_formhelpers.html\" import render_field, stru"
  },
  {
    "path": "flask/app/templates/scratch.html",
    "chars": 3818,
    "preview": "<link rel=\"shortcut icon\"\nhref=\"{{ url_for('static', filename='img/navlogo.ico') }}\">\n\n.navbar {\n  min-height: 50px;\n}\n\n"
  },
  {
    "path": "flask/config.py",
    "chars": 379,
    "preview": "import os\n\n\nclass Config:\n    SECRET_KEY = os.environ.get(\"SECRET_KEY\")\n\n    MAIL_SERVER = os.environ.get(\"MAIL_SERVER\")"
  },
  {
    "path": "flask/instance/uploads/C1-POSCAR",
    "chars": 884,
    "preview": "Al4 Si4 O18\n1.0\n4.982933 0.000000 -1.322318\n-0.041668 8.940766 -0.265359\n0.000000 0.000000 7.404800\nAl Si O\n4 4 18\ndirec"
  },
  {
    "path": "flask/instance/uploads/NaCl-POSCAR",
    "chars": 350,
    "preview": "Na4 Cl4\n1.0\n5.691694 0.000000 0.000000\n0.000000 5.691694 0.000000\n0.000000 0.000000 5.691694\nNa Cl\n4 4\ndirect\n0.000000 0"
  },
  {
    "path": "flask/instance/uploads/NaCl.cif",
    "chars": 4577,
    "preview": "#------------------------------------------------------------------------------\n#$Date: 2015-01-27 21:58:39 +0200 (Tue, "
  },
  {
    "path": "flask/instance/uploads/R3c-POSCAR",
    "chars": 342,
    "preview": "Fe2 O6\n1.0\n4.463163 0.000000 3.092746\n1.619599 4.158933 3.092746\n0.000000 0.000000 5.430000\nFe O\n2 6\ndirect\n0.105000 0.1"
  },
  {
    "path": "flask/instance/uploads/fail_test.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "flask/requirements.txt",
    "chars": 210,
    "preview": "click==7.1.2\nFlask==3.1.3\nFlask-Bootstrap==3.3.7.1\nFlask-Uploads==0.2.1\nFlask-WTF==0.15.1\nitsdangerous==1.1.0\nJinja2==3."
  },
  {
    "path": "flask/vxrd.py",
    "chars": 20,
    "preview": "from app import app\n"
  },
  {
    "path": "images/Logo license.txt",
    "chars": 181,
    "preview": "This logo design created by Dee-y (https://github.com/dee-y) is licensed under a Creative Commons Attribution 4.0 Intern"
  },
  {
    "path": "pyproject.toml",
    "chars": 1516,
    "preview": "[tool.mypy]\nno_implicit_optional = false\n\n[tool.ruff]\ntarget-version = \"py39\"\nline-length = 120\ninclude = [\"**/pyproject"
  },
  {
    "path": "pyxtal/XRD.py",
    "chars": 53963,
    "preview": "\"\"\"\nModule for XRD simulation\n\"\"\"\n\nimport collections\nimport importlib.resources\nimport os\n\nimport numpy as np\nfrom mont"
  },
  {
    "path": "pyxtal/XRD_indexer.py",
    "chars": 45293,
    "preview": "\"\"\"\nModule for PXRD indexing and lattice parameter estimation.\n\"\"\"\nfrom pyxtal import pyxtal\nfrom pyxtal.lattice import "
  },
  {
    "path": "pyxtal/__init__.py",
    "chars": 163395,
    "preview": "\"\"\"\nPyXtal: A Python library for crystal structure generation and manipulation.\n\nThis module initializes the pyxtal pack"
  },
  {
    "path": "pyxtal/asu_constraints.py",
    "chars": 13615,
    "preview": "\"\"\"\nModule for handling Asymmetric Unit (ASU) constraints with complex conditions.\n\nThis module provides tools to:\n1. De"
  },
  {
    "path": "pyxtal/block_crystal.py",
    "chars": 5437,
    "preview": "\"\"\"\nModule for generating crystals based on building blocks\n\"\"\"\n# Standard Libraries\nimport numpy as np\n\n# External Libr"
  },
  {
    "path": "pyxtal/constants.py",
    "chars": 28220,
    "preview": "\"\"\"\nModule to store the constants\n\"\"\"\n\nimport numpy as np\nfrom pyxtal.version import __version__\n\n# Constants\n# --------"
  },
  {
    "path": "pyxtal/crystal.py",
    "chars": 17231,
    "preview": "\"\"\"\nModule for generating atomic crystals\n\"\"\"\n\n# Standard Libraries\nfrom __future__ import annotations\n\nfrom copy import"
  },
  {
    "path": "pyxtal/database/HM_Full.csv",
    "chars": 22285,
    "preview": "Hall,Spg_num,Spg_full,Symbol,P,P^-1,Permutation\n1,1,1,P 1,\"a,b,c\",\"a,b,c\",0\n2,2,2,P -1,\"a,b,c\",\"a,b,c\",0\n3,3,3:b,P 1 2 1"
  },
  {
    "path": "pyxtal/database/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pyxtal/database/asymmetric_unit.txt",
    "chars": 18515,
    "preview": "1    :           0   ≤ x ≤   1    ;      0   ≤ y ≤   1   ;       0   ≤ z ≤   1\n2    :           0   ≤ x ≤   1/2  ;      "
  },
  {
    "path": "pyxtal/database/atomic_scattering_params.json",
    "chars": 6824,
    "preview": "{\"Ru\": [[4.358, 27.881], [3.298, 5.179], [1.323, 0.594], [0, 0]], \"Re\": [[5.695, 28.968], [4.74, 5.156], [2.064, 0.575],"
  },
  {
    "path": "pyxtal/database/bonds.json",
    "chars": 2120,
    "preview": "{\n    \"C-C\": 1.89,\n    \"C-H\": 1.32,\n    \"C-O\": 1.60,\n    \"C-N\": 1.80,\n    \"C-S\": 2.00,\n    \"C-P\": 1.95,\n    \"C-Si\": 2.00"
  },
  {
    "path": "pyxtal/database/bug.json",
    "chars": 2950,
    "preview": "{\"lattice\": {\"@module\": \"numpy\", \"@class\": \"array\", \"dtype\": \"float64\", \"data\": [[3.7328477709688332, 2.297987170935623e"
  },
  {
    "path": "pyxtal/database/cifs/0-G62.cif",
    "chars": 2051,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/1-G59.cif",
    "chars": 1921,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/191.vasp",
    "chars": 367,
    "preview": " C \n 1.0000000000000000\n     2.5297212763435866    0.0000000000000000    0.0000000000000000\n    -1.2648606381717933    2"
  },
  {
    "path": "pyxtal/database/cifs/2-G71.cif",
    "chars": 2043,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/3-G139.cif",
    "chars": 2373,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/4-G225.cif",
    "chars": 5688,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/ACBNZA01.cif",
    "chars": 2940,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/AXOSOW01.cif",
    "chars": 9863,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/Al2SiO5_mp-4753_symmetrized.cif",
    "chars": 1184,
    "preview": "# generated using pymatgen\ndata_Al2SiO5\n_symmetry_space_group_name_H-M   Pnnm\n_cell_length_a   7.87578500\n_cell_length_b"
  },
  {
    "path": "pyxtal/database/cifs/BTO-Amm2.cif",
    "chars": 1009,
    "preview": "# generated using pymatgen\ndata_BaTiO3\n_symmetry_space_group_name_H-M   Amm2\n_cell_length_a   3.98753100\n_cell_length_b "
  },
  {
    "path": "pyxtal/database/cifs/BTO.cif",
    "chars": 1323,
    "preview": "\n#======================================================================\n# CRYSTAL DATA\n#-------------------------------"
  },
  {
    "path": "pyxtal/database/cifs/FAU.cif",
    "chars": 4636,
    "preview": "data_FAU\n#**************************************************************************\n#\n# CIF taken from the IZA-SC Datab"
  },
  {
    "path": "pyxtal/database/cifs/Fd3.cif",
    "chars": 3542,
    "preview": "data_global\r\n_chemical_name_mineral 'Northupite'\r\nloop_\r\n_publ_author_name\r\n'Dal Negro A'\r\n'Giuseppetti G'\r\n'Tadini C'\r\n"
  },
  {
    "path": "pyxtal/database/cifs/Fd3.vasp",
    "chars": 6258,
    "preview": "Na48 Mg16 C32 Cl16 O96\n1.0\n14.069000 0.000000 0.000000\n0.000000 14.069000 0.000000\n0.000000 0.000000 14.069000\nNa Mg C C"
  },
  {
    "path": "pyxtal/database/cifs/Fd3m.cif",
    "chars": 4992,
    "preview": "data_global\r\n_chemical_name_mineral 'Ahrensite'\r\nloop_\r\n_publ_author_name\r\n'Finger L W'\r\n'Hazen R M'\r\n'Yagi T'\r\n_journal"
  },
  {
    "path": "pyxtal/database/cifs/GUMMUW.cif",
    "chars": 9559,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/GeF2.cif",
    "chars": 885,
    "preview": "# generated using pymatgen\ndata_GeF2\n_symmetry_space_group_name_H-M   P2_12_12_1\n_cell_length_a   4.97134300\n_cell_lengt"
  },
  {
    "path": "pyxtal/database/cifs/HAHCOI.cif",
    "chars": 2946,
    "preview": "\r\n#######################################################################\r\n#\r\n#                 Cambridge Crystallograph"
  },
  {
    "path": "pyxtal/database/cifs/I41amd.vasp",
    "chars": 221,
    "preview": "Sn4\n1.0\n5.819700 0.000000 0.000000\n0.000000 5.819700 0.000000\n0.000000 0.000000 3.174880\nSn\n4\ndirect\n0.000000 0.000000 0"
  },
  {
    "path": "pyxtal/database/cifs/I4_132.cif",
    "chars": 1836,
    "preview": "data_global\r\n_chemical_name_mineral 'Petzite'\r\nloop_\r\n_publ_author_name\r\n'Frueh A J'\r\n_journal_name_full 'American Miner"
  },
  {
    "path": "pyxtal/database/cifs/JAPWIH.cif",
    "chars": 10505,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/JVASP-119184.cif",
    "chars": 2960,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-119739.cif",
    "chars": 1979,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-141590.cif",
    "chars": 2916,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-25063.cif",
    "chars": 1637,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-28565.cif",
    "chars": 2017,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-28634.cif",
    "chars": 2188,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-36885.cif",
    "chars": 1748,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-37583.cif",
    "chars": 5632,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-42300.cif",
    "chars": 2304,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-43424.cif",
    "chars": 1938,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-45907.cif",
    "chars": 2916,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-47532.cif",
    "chars": 1950,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-50935.cif",
    "chars": 1862,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-59313.cif",
    "chars": 3988,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-62168.cif",
    "chars": 1881,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-85365.cif",
    "chars": 2064,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-86205.cif",
    "chars": 2586,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-97915.cif",
    "chars": 5803,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/JVASP-98225.cif",
    "chars": 1967,
    "preview": "#############################################################\n#             ______       _    _          _              "
  },
  {
    "path": "pyxtal/database/cifs/LAGNAL.cif",
    "chars": 441469,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/LUFHAW.cif",
    "chars": 7132,
    "preview": "####################################################################### \n# \n# This file contains crystal structure data "
  },
  {
    "path": "pyxtal/database/cifs/LiCs.cif",
    "chars": 2001,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/MERQIM.cif",
    "chars": 12413,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/MPWO.cif",
    "chars": 1238,
    "preview": "# generated using pymatgen\ndata_MgPb2WO6\n_symmetry_space_group_name_H-M   Pnma\n_cell_length_a   11.60754700\n_cell_length"
  },
  {
    "path": "pyxtal/database/cifs/NaCl.cif",
    "chars": 4577,
    "preview": "#------------------------------------------------------------------------------\n#$Date: 2015-01-27 21:58:39 +0200 (Tue, "
  },
  {
    "path": "pyxtal/database/cifs/NaSb3F10.cif",
    "chars": 1416,
    "preview": "#======================================================================\n\n# CRYSTAL DATA\n\n#------------------------------"
  },
  {
    "path": "pyxtal/database/cifs/NbO2.cif",
    "chars": 1180,
    "preview": "# generated using pymatgen\ndata_NbO2\n_symmetry_space_group_name_H-M   I4_1/a\n_cell_length_a   9.80017200\n_cell_length_b "
  },
  {
    "path": "pyxtal/database/cifs/NiS-Cm.cif",
    "chars": 1696,
    "preview": "#############################################################\n#             ______       _    _          _   \t          "
  },
  {
    "path": "pyxtal/database/cifs/P3_112.cif",
    "chars": 1134,
    "preview": "data_global\r\n_amcsd_formula_title 'Ag2 H O4 P'\r\nloop_\r\n_publ_author_name\r\n'Tordjman I'\r\n'Boudjada A'\r\n'Guitel J'\r\n'Masse"
  },
  {
    "path": "pyxtal/database/cifs/P4_332.cif",
    "chars": 1498,
    "preview": "data_global\r\n_amcsd_formula_title 'Ge3 O8 Zn2'\r\nloop_\r\n_publ_author_name\r\n'Joubert J'\r\n'Durif A'\r\n_journal_name_full 'Co"
  },
  {
    "path": "pyxtal/database/cifs/P4nmm.vasp",
    "chars": 226,
    "preview": "Sn2 O2\n1.0\n3.802900 0.000000 0.000000\n0.000000 3.802900 0.000000\n0.000000 0.000000 4.838200\nSn O\n2 2\ndirect\n0.500000 0.0"
  },
  {
    "path": "pyxtal/database/cifs/P6_422.cif",
    "chars": 1205,
    "preview": "data_global\r\n_chemical_name_mineral 'Eucryptite'\r\nloop_\r\n_publ_author_name\r\n'Pillars W W'\r\n'Peacor D R'\r\n_journal_name_f"
  },
  {
    "path": "pyxtal/database/cifs/PAHYON01.cif",
    "chars": 6482,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/PPO.cif",
    "chars": 1184,
    "preview": "# generated using pymatgen\ndata_P2Pb3O8\n_symmetry_space_group_name_H-M   C2/c\n_cell_length_a   11.17927600\n_cell_length_"
  },
  {
    "path": "pyxtal/database/cifs/PVO.cif",
    "chars": 1086,
    "preview": "# generated using pymatgen\ndata_V2Pb3O8\n_symmetry_space_group_name_H-M   P2_1/c\n_cell_length_a   7.50825400\n_cell_length"
  },
  {
    "path": "pyxtal/database/cifs/Pm3.cif",
    "chars": 1222,
    "preview": "data_global\r\n_amcsd_formula_title 'Hg N3 O6 Rb'\r\nloop_\r\n_publ_author_name\r\n'Ferrari A'\r\n'Colla C'\r\n_journal_name_full 'G"
  },
  {
    "path": "pyxtal/database/cifs/Pmmn.vasp",
    "chars": 230,
    "preview": "Cu2 Te2\n1.0\n3.100000 0.000000 0.000000\n0.000000 4.020000 0.000000\n0.000000 0.000000 6.860000\nCu Te\n2 2\ndirect\n0.000000 0"
  },
  {
    "path": "pyxtal/database/cifs/Pn3.vasp",
    "chars": 286,
    "preview": "Cu4 O2\n1.0\n4.269600 0.000000 0.000000\n0.000000 4.269600 0.000000\n0.000000 0.000000 4.269600\nCu O\n4 2\ndirect\n0.250000 0.2"
  },
  {
    "path": "pyxtal/database/cifs/Pn3m.vasp",
    "chars": 286,
    "preview": "Cu4 O2\n1.0\n4.268500 0.000000 0.000000\n0.000000 4.268500 0.000000\n0.000000 0.000000 4.268500\nCu O\n4 2\ndirect\n0.250000 0.2"
  },
  {
    "path": "pyxtal/database/cifs/R-3.cif",
    "chars": 1605,
    "preview": "data_global\r\n_chemical_name_mineral 'Akimotoite'\r\nloop_\r\n_publ_author_name\r\n'Horiuchi H'\r\n'Hirano M'\r\n'Ito E'\r\n'Matsui Y"
  },
  {
    "path": "pyxtal/database/cifs/R-3c.cif",
    "chars": 1933,
    "preview": "data_global\r\n_chemical_name_mineral 'Hematite'\r\nloop_\r\n_publ_author_name\r\n'Blake R L'\r\n'Hessevick R E'\r\n'Zoltai T'\r\n'Fin"
  },
  {
    "path": "pyxtal/database/cifs/R32.cif",
    "chars": 986,
    "preview": "data_global\r\n_chemical_name_mineral 'Heazlewoodite'\r\nloop_\r\n_publ_author_name\r\n'Fleet M E'\r\n_journal_name_full 'American"
  },
  {
    "path": "pyxtal/database/cifs/TMPPIO03.cif",
    "chars": 3542,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/WEXBOS.cif",
    "chars": 13289,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/YICMOP.cif",
    "chars": 177150,
    "preview": "####################################################################### \r\n# \r\n# This file contains crystal structure dat"
  },
  {
    "path": "pyxtal/database/cifs/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "pyxtal/database/cifs/anthracene.cif",
    "chars": 2546,
    "preview": "\n#######################################################################\n#\n#                 Cambridge Crystallographic "
  }
]

// ... and 410 more files (download for full content)

About this extraction

This page contains the full source code of the qzhu2017/PyXtal GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 610 files (28.5 MB), approximately 7.5M tokens, and a symbol index with 1555 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!