pyNanoMatBuilder 0.10.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pynanomatbuilder-0.10.3/ChangeLog.md +893 -0
- pynanomatbuilder-0.10.3/LICENSE +674 -0
- pynanomatbuilder-0.10.3/MANIFEST.in +32 -0
- pynanomatbuilder-0.10.3/PKG-INFO +118 -0
- pynanomatbuilder-0.10.3/README.md +74 -0
- pynanomatbuilder-0.10.3/docs/.ipynb_checkpoints/make-checkpoint.bat +35 -0
- pynanomatbuilder-0.10.3/docs/Makefile +20 -0
- pynanomatbuilder-0.10.3/docs/build/doctrees/environment.pickle +0 -0
- pynanomatbuilder-0.10.3/docs/build/doctrees/index.doctree +0 -0
- pynanomatbuilder-0.10.3/docs/build/doctrees/modules.doctree +0 -0
- pynanomatbuilder-0.10.3/docs/build/doctrees/theoryDocs/intro.doctree +0 -0
- pynanomatbuilder-0.10.3/docs/build/doctrees/theoryDocs/polydispersity.doctree +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/.buildinfo +4 -0
- pynanomatbuilder-0.10.3/docs/build/html/.nojekyll +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/CNAME +1 -0
- pynanomatbuilder-0.10.3/docs/build/html/_images/pyNanoMatBuilder_banner.svg +162 -0
- pynanomatbuilder-0.10.3/docs/build/html/_sources/index.rst.txt +32 -0
- pynanomatbuilder-0.10.3/docs/build/html/_sources/modules.rst.txt +117 -0
- pynanomatbuilder-0.10.3/docs/build/html/_sources/theoryDocs/intro.md.txt +3 -0
- pynanomatbuilder-0.10.3/docs/build/html/_sources/theoryDocs/polydispersity.md.txt +32 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/base-stemmer.js +476 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/basic.css +906 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/check-solid.svg +4 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/clipboard.min.js +7 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/copy-button.svg +5 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/copybutton.css +94 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/copybutton.js +248 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/copybutton_funcs.js +73 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/badge_only.css +1 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/css/theme.css +4 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/doctools.js +150 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/documentation_options.js +13 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/english-stemmer.js +1066 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/file.png +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/jquery.js +2 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/js/badge_only.js +1 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/js/theme.js +1 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/js/versions.js +228 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/language_data.js +13 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/minus.png +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-broken-thumbnail.svg +9 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-code-cells.css +259 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-gallery.css +31 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-no-thumbnail.svg +9 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/plus.png +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/pyNanoMatBuilder_banner.svg +162 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/pygments.css +75 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/searchtools.js +693 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/sphinx_highlight.js +159 -0
- pynanomatbuilder-0.10.3/docs/build/html/_static/visualID.css +274 -0
- pynanomatbuilder-0.10.3/docs/build/html/genindex.html +2498 -0
- pynanomatbuilder-0.10.3/docs/build/html/index.html +881 -0
- pynanomatbuilder-0.10.3/docs/build/html/modules.html +8512 -0
- pynanomatbuilder-0.10.3/docs/build/html/objects.inv +0 -0
- pynanomatbuilder-0.10.3/docs/build/html/py-modindex.html +915 -0
- pynanomatbuilder-0.10.3/docs/build/html/search.html +845 -0
- pynanomatbuilder-0.10.3/docs/build/html/searchindex.js +1 -0
- pynanomatbuilder-0.10.3/docs/build/html/theoryDocs/intro.html +834 -0
- pynanomatbuilder-0.10.3/docs/build/html/theoryDocs/polydispersity.html +869 -0
- pynanomatbuilder-0.10.3/docs/make.bat +35 -0
- pynanomatbuilder-0.10.3/docs/source/.ipynb_checkpoints/conf-checkpoint.py +93 -0
- pynanomatbuilder-0.10.3/docs/source/.ipynb_checkpoints/index-checkpoint.rst +32 -0
- pynanomatbuilder-0.10.3/docs/source/_static/pyNanoMatBuilder_banner.svg +162 -0
- pynanomatbuilder-0.10.3/docs/source/_static/visualID.css +274 -0
- pynanomatbuilder-0.10.3/docs/source/conf.py +104 -0
- pynanomatbuilder-0.10.3/docs/source/index.rst +32 -0
- pynanomatbuilder-0.10.3/docs/source/modules.rst +117 -0
- pynanomatbuilder-0.10.3/docs/source/theoryDocs/.ipynb_checkpoints/intro-checkpoint.md +2 -0
- pynanomatbuilder-0.10.3/docs/source/theoryDocs/.ipynb_checkpoints/polydispersity-checkpoint.md +32 -0
- pynanomatbuilder-0.10.3/docs/source/theoryDocs/intro.md +3 -0
- pynanomatbuilder-0.10.3/docs/source/theoryDocs/polydispersity.md +32 -0
- pynanomatbuilder-0.10.3/pyNMB-examples.ipynb +7973 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/TEM_creator-checkpoint.py +1361 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/__init__-checkpoint.py +32 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/archimedeanNPs-checkpoint.py +1301 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/catalanNPs-checkpoint.py +776 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/crystalNPs-checkpoint.py +1263 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/data-checkpoint.py +204 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/johnsonNPs-checkpoint.py +876 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/make_files_remastered-checkpoint.py +2204 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/otherNPs-checkpoint.py +258 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/platonicNPs-checkpoint.py +2250 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/pyNMBcore-checkpoint.py +93 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/utils-checkpoint.py +3573 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/visualID-checkpoint.py +196 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/README +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/__init__.py +32 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/archimedeanNPs.py +1225 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/catalanNPs.py +733 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/crystalNPs.py +1216 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/data.py +205 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/johnsonNPs.py +835 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/otherNPs.py +257 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/platonicNPs.py +2255 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/pyNMBcore.py +98 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/.ipynb_checkpoints/tools4pyPC-checkpoint.py +44 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/.ipynb_checkpoints/visualID-checkpoint.py +101 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/.ipynb_checkpoints/visualID_Eng-checkpoint.py +140 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/__init__.py +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/.ipynb_checkpoints/cod1000041-NaCl-checkpoint.cif +259 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/CsPbBr3_cubic_231023.cif +112 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/CsPbBr3_ortho_14608.cif +93 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/__init__.py +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/amorphousC/__init__.py +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/amorphousC/aC_relax_10x10.xyz.gz +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/amorphousC/aC_relax_5x5.xyz.gz +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod1000041-NaCl.cif +259 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod1539039-Fe_beta.cif +79 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod1539039-Mn_beta.cif +79 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod5000217-Fe_bcc.cif +168 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008459-Ag_fcc.cif +252 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008463-Au_fcc.cif +259 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008466-Co_fcc.cif +254 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008492-Co_hcp.cif +86 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008513-Ru_hcp.cif +84 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9011068-Mn_alpha.cif +118 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9012884-Co_epsilon.cif +82 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9012957-Pt_fcc.cif +263 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9015662-TiO2-rutile.cif +65 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9015929-TiO2-anatase.cif +90 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/.directory +4 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf-120x139.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf-120x139.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf.base64 +8231 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf.svg +289 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/visualID.css +274 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/.directory +6 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/.ipynb_checkpoints/bccrdd-C-checkpoint.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD.xyz +310 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD.xyz +51 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS.xyz +87 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS.xyz +607 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/__init__.py +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/at.xyz +3 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS.xyz +67 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd.xyz +16 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrddWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrddWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrddWS.xyz +67 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube.xyz +11 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS.xyz +367 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo.xyz +14 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS.xyz +311 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS.xyz +4749 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ellipsoid-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ellipsoid.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ellipsoid.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh.xyz +8 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd.xyz +6 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccdrdd.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccdrdd.xyz +16 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd.xyz +16 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS.xyz +410 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS.xyz +344 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico.xyz +14 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy.xyz +9 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pnmbAvailableStructures.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pnmbAvailableStructures.svg +1037 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD.xyz +22 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS.xyz +333 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/script-facettes-345PtLight.spt +77 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/sphere-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/sphere.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/sphere.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp.xyz +22 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt.xyz +150 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh.xyz +40 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS.xyz +57 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd.base64 +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd.xyz +14 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS.xyz +371 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrddWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrddWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrddWS.xyz +371 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS.xyz +359 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS.xyz +61 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrddWS.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrddWS.script +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrddWS.xyz +61 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/underConstruction-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/underConstruction.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/underConstruction.svg +259 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/Logo-Universite-Toulouse-n-2023.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/Logo-institutionnel-couleur-Uonly.svg +64 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/Python_logo_and_wordmark.svg.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/__init__.py +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/bccrdd.spt +288 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/bccrdd.xyz +17 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo2-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo2.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo3-C.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo3.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logoEnd.svg +94 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo_lpcno_300_dpi_notexttransparent.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_banner.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_banner.svg +162 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_logo.png +0 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_logo.svg +123 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/__init__-checkpoint.py +12 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/core-checkpoint.py +750 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/crystals-checkpoint.py +375 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/energy-checkpoint.py +215 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/external_pgm-checkpoint.py +156 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/geometry-checkpoint.py +1340 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/io-checkpoint.py +587 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/polydispersity-checkpoint.py +837 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/prop-checkpoint.py +864 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/symmetry-checkpoint.py +135 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/__init__.py +12 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/core.py +751 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/crystals.py +375 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/energy.py +215 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/external_pgm.py +156 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/geometry.py +1340 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/io.py +587 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/polydispersity.py +837 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/prop.py +864 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/symmetry.py +135 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/utils.py.org +3573 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/utils.py.tmp +75 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder/visualID.py +123 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/PKG-INFO +118 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/SOURCES.txt +354 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/dependency_links.txt +1 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/requires.txt +32 -0
- pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/top_level.txt +1 -0
- pynanomatbuilder-0.10.3/pyproject.toml +70 -0
- pynanomatbuilder-0.10.3/setup.cfg +4 -0
|
@@ -0,0 +1,893 @@
|
|
|
1
|
+
* [Semantic Versioning](#semvers)
|
|
2
|
+
* [Historical Development](#dev-history)
|
|
3
|
+
* [end of the ChangeLog.md file](#firststeps)
|
|
4
|
+
|
|
5
|
+
<a id="semvers"></a>
|
|
6
|
+
# Semantic Versioning ([SemVer](https://semver.org/))
|
|
7
|
+
|
|
8
|
+
## [0.10.2] - 2026-04-07 "surfaceAtoms"
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- new `surfaceAtoms` boolean array attribute created in `propPostMake()`
|
|
12
|
+
|
|
13
|
+
## [unreleased version] - 2026-04-02
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- Unification of `propPostMake()` function in `utils.prop`
|
|
17
|
+
- **Unification and Fixes**: Ensured proper inheritance from `pyNMBcore` by:
|
|
18
|
+
- Adding missing `**kwargs` to child class methods.
|
|
19
|
+
- Removing redundant variables already defined in the parent class.
|
|
20
|
+
- **Fix**: Updated `make_sphere()` in `crystalNPs.py` to correct the computation of the measured diameter, ensuring accuracy.
|
|
21
|
+
- **Documentation**: Updated the documentation of the geometry optimization part of the `pyNMB-examples.ipynb` notebook.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- **New Core Methods in `pyNMBcore` (`pyNMBcore.py`)**:
|
|
25
|
+
- `Inscribed_circumscribed_spheres()`: Computes updated inscribed and circumscribed sphere diameters after optimization or peeling.
|
|
26
|
+
- `_update_sasview_dims_from_spheres()`: Calculates updated specific SASView dimensions for the nanoparticle after optimization or peeling. The calculations are based on the inscribed and circumscribed sphere diameters and include:
|
|
27
|
+
- Sphere: Diameter.
|
|
28
|
+
- Cylinder/Wire: Radius and length.
|
|
29
|
+
- Octahedron: Truncation ratio and semi-axis.
|
|
30
|
+
- Both functions can be called individually or as part of `propPostMake()` for a comprehensive global analysis.
|
|
31
|
+
|
|
32
|
+
## [0.10.0] - 2026-03-30 "pyNMBcore"
|
|
33
|
+
|
|
34
|
+
**<div style="color:blue">This is major architecture change, already started in version 0.9.9</div>**
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- **Key Sanitization**: Internal dictionary keys for analysis now consistently replace spaces with underscores (e.g., `initial_structure`, `optimized_structure`).
|
|
39
|
+
- **Unification**: Standardized `propPostMake()` across all builder classes via `pyNMBcore` inheritance.
|
|
40
|
+
- Moved logic to `utils.prop` to ensure all NPs share the same analysis pipeline.
|
|
41
|
+
- Integrated safe-checks for specialized geometries (Hollow shapes, Helices, ...).
|
|
42
|
+
- *<div style="color:red">**work in progress.** Has only been done for platonicNPs, so far.</div>*
|
|
43
|
+
- Optimization section in `pyNMB-examples.ipynb` adapted to the new object-oriented logic
|
|
44
|
+
- Context-Aware Property Mapping: Standardized `propPostMake()` to dynamically route analysis metadata (moi, surface atoms, symmetry) to either base or `_opt` attributes using a boolean toggle, ensuring consistent characterization of both raw and relaxed structures
|
|
45
|
+
|
|
46
|
+
### Added
|
|
47
|
+
- **New Core Methods called in `pyNMBcore` (`pyNMBcore.py`)**:
|
|
48
|
+
- **`utils.prop.get_ellipsoid_analysis(noOutput=False)`**:
|
|
49
|
+
- Implements **Principal Component Analysis (PCA)** on Convex Hull vertices to fit a circumscribed ellipsoid.
|
|
50
|
+
- Features **Major/Intermediate/Minor diameter** ($D_1, D_2, D_3$) calculation.
|
|
51
|
+
- Includes **adaptive scaling** to match maximum radial distance (e.g., matching the 1.63 nm shell-based diameter for icosahedra).
|
|
52
|
+
- Calculates Volume and Surface Area (Knud Thomsen approximation).
|
|
53
|
+
- Generates a **Jmol-ready command** using `ellipsoid AXES CENTER` for precise 3D orientation.
|
|
54
|
+
- **`utils.geometry.peel_by_coordination(threshold_peeling=6, Rmax=2.9, noOutput=False)`**:
|
|
55
|
+
- Structural modifier simulating surface truncation or incomplete shell growth.
|
|
56
|
+
- Uses a high-performance **KDTree neighbor search** (via `utils.prop.kDTreeCN`) to identify weakly bonded atoms.
|
|
57
|
+
- Enables targeted removal of specific features (e.g., `threshold=6` specifically targets icosahedral vertices).
|
|
58
|
+
- **`utils.geometry.peel_by_shifted_ellipsoid(shift_dist=2.5, noOutput=False)`**:
|
|
59
|
+
- Advanced truncation method simulating **asymmetric growth/dissolution**.
|
|
60
|
+
- **Shape-Aware Logic**: Projects coordinates into the PCA local frame, ensuring truncation respects the particle's eccentricity (crucial for nanorods/cylinders).
|
|
61
|
+
- Useful for modeling "intermediate" diameters observed in experimental HRTEM samples.
|
|
62
|
+
- **Cache Invalidation**: **`utils.core._flush_stale_data()`** proactively deletes stale analysis attributes (`ellipsoid`, `moi`, `vertices`, `NPopt`...) to force fresh, accurate calculations.
|
|
63
|
+
- All structural "peeling" methods update `self.NP` in-place and explicitly reset `self.is_optimized` to `False` (deleting `self.NPopt`) to ensure consistency for subsequent optimizations
|
|
64
|
+
- Complete list:
|
|
65
|
+
- `optimize(self, calculator='EMT', optimizer='QN', fthreshold=0.1)`
|
|
66
|
+
- `Inscribed_circumscribed_spheres(self, noOutput=None)`
|
|
67
|
+
- `get_ellipsoid_analysis(self, noOutput=None)`
|
|
68
|
+
- `peel_by_coordination(self, threshold_peeling=6, Rmax=2.9, noOutput=None)`
|
|
69
|
+
- `peel_by_shifted_ellipsoid(self, shift_dist=2.5, noOutput=None)`
|
|
70
|
+
- `_flush_stale_data(self, shape_update=None)`
|
|
71
|
+
- `propPostMake(self, skipSymmetryAnalyzis=None, thresholdCoreSurface=None, noOutput=None, is_optimized=None)`
|
|
72
|
+
|
|
73
|
+
## [0.9.9] - 2026-03-27 "pyNMBcore 0"
|
|
74
|
+
|
|
75
|
+
### Changed
|
|
76
|
+
- **Architecture**: Introduced in the new `pyNMBcore.py` file a `pyNMBcore` base class to centralize common attributes methods across all nanoparticle types, *i.e.* all classes.
|
|
77
|
+
|
|
78
|
+
- This **core parent class** thus provides a standardized set of attributes and methods to all nanoparticle builder classes (Platonic, Catalan, Crystals, etc.).
|
|
79
|
+
- **`pyNMBcore` is a high-level API Wrapper**. The class methods now use lazy-loading (imports within methods) to delegate heavy computational logic to the utils/ sub-package (`utils.prop`, `utils.geometry`, `utils.energy`)
|
|
80
|
+
- <div style="color:blue">It is an <b>Object-Oriented API</b>: transitions from functional calls to internalized methods, e.g. <code>ico.optimize()</code> instead of <code>optimize(ico.NP)</code></div>
|
|
81
|
+
- **Shared State Management**: All builders now inherit a consistent internal state (e.g., `nAtoms`, `cog`, `is_optimized`, `ellipsoid`) ensuring predictable behavior across different geometries.
|
|
82
|
+
- List of common arguments:
|
|
83
|
+
- `postAnalyzis: bool = True`,
|
|
84
|
+
- `aseView: bool = False`,
|
|
85
|
+
- `thresholdCoreSurface: float = 1.`,
|
|
86
|
+
- `skipSymmetryAnalyzis: bool = False`,
|
|
87
|
+
- `jmolCrystalShape: bool = True`,
|
|
88
|
+
- `noOutput: bool = False`,
|
|
89
|
+
- `calcPropOnly: bool = False`
|
|
90
|
+
|
|
91
|
+
**<div style="color:red">All particle classes now inherit from pyNMBcore</div>**
|
|
92
|
+
|
|
93
|
+
- **Optimization**:
|
|
94
|
+
|
|
95
|
+
- Renamed the geometry optimization `energy.optimizeEMT()` function as `energy.optimize()`, EMT energy and Quasi-Newton optimizer being now parameters of the function
|
|
96
|
+
- `optimize()` available to the `pyNMBcore` level, enabling the `energy.optimize()` method on all NPs.
|
|
97
|
+
|
|
98
|
+
## [0.9.5-0.9.8] - 2026-03-24 "polydispersity II"
|
|
99
|
+
|
|
100
|
+
### Added
|
|
101
|
+
- **Pseudo-Histogram Generation**: `get_binned_statistics` now populates `self.sizes` and `self.counts` with theoretical bin data when no experimental data is present.
|
|
102
|
+
- **Symmetrical Binning Logic with gaussian distribution**: Implemented class-level and instance-level `bin_width_nm` to ensure theoretical bin bars are perfectly centered on the mean ($\mu$) in the `plot` method.
|
|
103
|
+
- **Vectorized Proportions**: Added `get_proportions` and `print_specific_proportions` to handle multiple diameter targets without external loops, including a new **Norm. (1)** column. And add it to the plot, if available
|
|
104
|
+
|
|
105
|
+
## [0.9.4] - 2026-03-23 "polydispersity"
|
|
106
|
+
|
|
107
|
+
### Added
|
|
108
|
+
- new `utils.polydispersity.py` sub-package, with the `NanoparticleDistribution` class that has migrated from the `pyphyschemtools` project to the `pyNanoMatBuilder` project
|
|
109
|
+
- new embryonic `polydispersity.md` documentation
|
|
110
|
+
|
|
111
|
+
## [0.9.1-0.9.3] - 2026-03-18 "tests pyPi"
|
|
112
|
+
|
|
113
|
+
### Fixed
|
|
114
|
+
- various minor bug fixes and correction of typos
|
|
115
|
+
|
|
116
|
+
### Changed
|
|
117
|
+
- some packages, that will be part of a future 2.0 release, have bee removed
|
|
118
|
+
|
|
119
|
+
### Added
|
|
120
|
+
- update of the `git_psuh` utility, with new automatic "tag and/or release" commands
|
|
121
|
+
|
|
122
|
+
## [0.9.0] - 2026-03-15 "misc"
|
|
123
|
+
|
|
124
|
+
### Added
|
|
125
|
+
* **Metadata Expansion**: Added a direct "Try on Colab" link to `pyproject.toml` URLs to facilitate immediate library testing.
|
|
126
|
+
|
|
127
|
+
### Architectural Changes (Major Refactoring)
|
|
128
|
+
Modularization of utils: Split the monolithic `utils.py` into a structured sub-package pyNanoMatBuilder `.utils/`:
|
|
129
|
+
|
|
130
|
+
- `core.py`
|
|
131
|
+
- `crystals.py`
|
|
132
|
+
- `energy.py`
|
|
133
|
+
- `external_pgm.py`
|
|
134
|
+
- `geometry.py`
|
|
135
|
+
- `io.py`
|
|
136
|
+
- `prop.py`
|
|
137
|
+
- `symmetry.py`
|
|
138
|
+
|
|
139
|
+
## [0.8.0] - 2026-03-15 "first 1.0 beta release"
|
|
140
|
+
|
|
141
|
+
- **Adopted Semantic Versioning**: Transitions the project to the `[Major.Minor.Patch]` format to improve release transparency and dependency reliability.
|
|
142
|
+
- Major ($x$): Incremented when incompatible API changes are made. If a user's old code will break when they update to this version, the Major number must be bumped (e.g., $1.0.0 \rightarrow 2.0.0$).
|
|
143
|
+
- Minor ($y$): Incremented when a new functionality is added in a backwards-compatible manner. New builders, new tools, or new parameters that don't break existing scripts go here (e.g., $1.1.0 \rightarrow 1.2.0$).
|
|
144
|
+
- Patch ($z$): Incremented for backwards-compatible bug fixes. This is exactly what has been doing with the recent path fixes and dependency cleanups (e.g., $1.1.1 \rightarrow 1.1.2$).
|
|
145
|
+
|
|
146
|
+
<a id="dev-history"></a>
|
|
147
|
+
# Development of a pre-release version -> date-based versioning
|
|
148
|
+
|
|
149
|
+
## 20260310-20260315 "*En route* to a pyNanoMatBuilder library"
|
|
150
|
+
|
|
151
|
+
### Documentation & UX
|
|
152
|
+
* **New "Workflow Guides"**: Added a comprehensive "How To?" section at the beginning of the tutorial notebook, providing a clear step-by-step path for new users.
|
|
153
|
+
* **PyPI Compatibility**: Conducted intensive testing and adapted the tutorial notebooks to ensure seamless performance with the version of `pyNanoMatBuilder` installed via pip/PyPI.
|
|
154
|
+
|
|
155
|
+
### Added
|
|
156
|
+
- **Unified `write()` function** in `utils.py`:
|
|
157
|
+
- A "smart" entry point that handles `.xyz`, `.cif`, `.script`, and `.spt` files automatically.
|
|
158
|
+
- **Automatic Directory Creation**: All write operations now use `pathlib` to ensure parent folders (like `coords/` or `figs/`) are created if missing, preventing `FileNotFoundError`.
|
|
159
|
+
- **Timer Class**: Refactored the timing logic into an Object-Oriented `timer` class in `utils.py` for independent performance monitoring of different functions.
|
|
160
|
+
- **Centralized Resource Management**: Moved all non-code assets (`.css`, `.svg`, `.cif`, `.spt`) into a dedicated `resources/` directory within the package.
|
|
161
|
+
- **Optional Dependencies**: Structured `pyproject.toml` with "extras" (`debye`, `tem`) to allow lightweight core installation.
|
|
162
|
+
- **Mocking**: Added `autodoc_mock_imports` for heavy dependencies (`abtem`, `debyecalculator`) to ensure documentation builds successfully in restricted environments.
|
|
163
|
+
- **Internal Resource Management**: Implemented `get_resource_path` across the entire library. This ensures that internal data files (CIFs, templates, etc.) are correctly located regardless of the user's operating system or installation path.
|
|
164
|
+
|
|
165
|
+
### Changed
|
|
166
|
+
- **Package Architecture (Namespace Flattening)**: Key tools (`init`, `end`, colors) are now accessible directly via `pyNMB.<tool>` instead of the full submodule path.
|
|
167
|
+
- **API Sanitization**: Removed external dependencies (`np`, `os`, `sys`) from the top-level `__init__.py` to improve auto-completion and prevent namespace pollution.
|
|
168
|
+
- **Internal Namespace Protection**: Standardized internal imports as `import ase.io as ase_io` to prevent name shadowing with our custom `write()` function.
|
|
169
|
+
- **Refined `writexyz()`**: Added support for the `wa` (Write/Append) parameter to enable multi-frame XYZ generation.
|
|
170
|
+
- **Export Control**: Implemented `__all__` in `__init__.py` to explicitly define the public user API.
|
|
171
|
+
- **Directory Structural Overhaul**: Reorganized the project into a "src-layout" style, placing the core logic inside a `pyNanoMatBuilder/` subdirectory to comply with modern Python packaging standards.
|
|
172
|
+
- **Metadata Standardization**: Synchronized versioning and author information across `__init__.py` and packaging configuration files.
|
|
173
|
+
- **PyPI Distribution Readiness**: Created `pyproject.toml` and `MANIFEST.in` to handle project metadata, entry points, and the inclusion of non-Python files (CSS, SVG, CIF) in the distribution.
|
|
174
|
+
- **Documentation Framework**: Established the `docs/` directory structure with Sphinx configuration to support future deployment on **ReadTheDocs**.
|
|
175
|
+
- **Entry Point Optimization**: Streamlined the library initialization process. Users can now trigger the full environment setup (CSS injection, banner display, and metadata logging) with a single, intuitive command: `pyNMB.init()`.
|
|
176
|
+
- **Top-Level Namespace Branding**: Elevated the branding and initialization logic to the package root, reinforcing the library's identity upon import.
|
|
177
|
+
- **Custom Visual Identity**: Developed a unique CSS theme specifically for **pyNMB**. This distinguishes the library's notebook outputs from other group tools through a tailored color palette and improved typography.
|
|
178
|
+
- **Branding Consistency**: Synchronized the CSS colors with the new SVG banner and terminal output colors (`fg`, `bg`, `hl`) to provide a coherent visual experience across all user interfaces.
|
|
179
|
+
- **Symmetry Analysis Upgrade in `utils.py`**:
|
|
180
|
+
- replaced **deprecated `ase.spacegroup.get_spacegroup`** with `pymatgen.symmetry.analyzer.SpacegroupAnalyzer`. This fixes accuracy issues with non-standard crystal settings and removes `FutureWarning` logs.
|
|
181
|
+
- **Symmetry Object Refactoring**: Transitioned from ASE-specific `Spacegroup` objects to explicit `ucSG_number` and `ucSG_symbol` attributes sourced from Pymatgen. Updated all display and classification functions (`print_ase_unitcell`, `get_crystal_type`) to support these new data types.
|
|
182
|
+
- **New Symmetry Utility**: Introduced `get_equivalent_miller_indices()`, which replaces the ASE `equivalent_lattice_points()` function. (*Polymorphic Support*: The function is "smart"—it accepts either a full `Crystal` system object or a standard Space Group integer (e.g., 225), making it compatible with both the library core and user toy-scripts).
|
|
183
|
+
- `./figs` and `./cif_database` folders moved to `pyNnaoMatBuilder/resources/`. All paths to `figs` and `./cif_database` in `utils.py` changed accordingly
|
|
184
|
+
- **Updated `MANIFEST.in`**: Revised recursive inclusion rules to align with the new directory structure, ensuring that `docs`, `cif_database`, and `resources` are bundled into the source distribution.
|
|
185
|
+
- **Refined `pyproject.toml`**:
|
|
186
|
+
* Updated `[tool.setuptools.package-data]` to explicitly map new resource locations.
|
|
187
|
+
* Ensured all critical assets (`.cif`, `.spt`, `.xyz`, `.png`) are recognized as package data for seamless installation via PyPI.
|
|
188
|
+
* Synchronized project metadata and dependencies to support the latest modular architecture.
|
|
189
|
+
|
|
190
|
+
### Fixed
|
|
191
|
+
- Fixed a **critical `NameError`** caused by missing `from pathlib import Path` in submodules.
|
|
192
|
+
- Fixed a **path error** in `visualID.end()` where the logo path was duplicated.
|
|
193
|
+
- Fixed some docstrings to **Google/Napoleon style** across all packages
|
|
194
|
+
|
|
195
|
+
## 20260309
|
|
196
|
+
### changed
|
|
197
|
+
Today is commit day ! I just renamed `make_xyz_files_remastered.py` as
|
|
198
|
+
and `MakeNPsDatabase.py` and `pyNMB-exmaples-sanspbcolonnes.ipynb` as `pyNMB-exmaples.ipynb`. I deleted a bunch of local folders and files. Also I removed UtilsDC.py and the corresponding notebook because it was not that useful ? To discuss ... (I think redemonstrating the use of an other library can be redundant and make it more heavy for nothing). Instead make a small doc??
|
|
199
|
+
|
|
200
|
+
-`TEM_creator.py`: substrate size is automatically found now, also the second index in the name file only changes if the imaging parameters change.
|
|
201
|
+
|
|
202
|
+
**TO DO AFTER THIS VERSION**:
|
|
203
|
+
- fix this error
|
|
204
|
+
"/home/sara/Python3/Debye_calc/lib/python3.11/site-packages/ase/io/cif.py:408: UserWarning: crystal system 'tetragonal' is not interpreted for space group Spacegroup(141, setting=1). This may result in wrong setting!
|
|
205
|
+
warnings.warn(
|
|
206
|
+
/home/sara/Python3/Debye_calc/lib/python3.11/site-packages/ase/io/cif.py:408: UserWarning: crystal system 'cubic' is not interpreted for space group Spacegroup(229, setting=1). This may result in wrong setting!
|
|
207
|
+
warnings.warn("
|
|
208
|
+
- I skipped the making of the files NaCl and TiO2, should add it.
|
|
209
|
+
- Fix the last shapes (bccrDD, double ico and pyramid of tetrahedons size measurements, fcctpbp total number of atoms, size measurement when "abc")
|
|
210
|
+
- for `TEM_creator.py` allow to pick specific shapes instead of forcing the user to do all of them.
|
|
211
|
+
|
|
212
|
+
## 20260308
|
|
213
|
+
### changed
|
|
214
|
+
-`TEM_creator.py`: New doc + big changes in the parameters (some werent even existing) + delete hcp making icosahedron (ive seen weird images). Also changed the final dataframes. Now the metadata should be more intersting and also accurate.
|
|
215
|
+
|
|
216
|
+
**TO DO**: PEP8 maybe, the doc seems good.
|
|
217
|
+
|
|
218
|
+
**TO DO**: verify the parameters and effect on the images (quality), verify the position of the NP on the carbon substrate (seems not good for 10x10nm and for 5x5nm always in the same spot, add function to rotate the images maybe?). + HRTEM_params notebook should be reworked probably.
|
|
219
|
+
|
|
220
|
+
## 20260304
|
|
221
|
+
### changed
|
|
222
|
+
-`TEM_creator.py` et `HRTEM_class.py`: changing the name of the files (too long) and making a final clean dataframe
|
|
223
|
+
|
|
224
|
+
**TO DO**: reg ico can be hcp right now, put the condition of lattice == "fcc" for reg ico. Verify the content of the metadata: espcially the size !!!! (what is size index ? ) Final dataframe works but verify its content ! Make a nice doc for the notebook ! either add the other shapes, or precise that it is Wulff + ico only right now + rename all the notebook and class and path and position in the folder (HRTEM not TEM), and work on HRTEM_params notebook
|
|
225
|
+
|
|
226
|
+
-`make_xyz_files_remastered.py`: lot of changes, mostly for code redability (avoiding redundency) , optimization + no more writing the npz iq and gr files in the metadata since their ID is already given in "id" = was useless
|
|
227
|
+
|
|
228
|
+
-`Make_xyz_files-remastered.ipynb`: cleaned the notebook + more documentation + now show how to create the dataframe and import it as csv
|
|
229
|
+
|
|
230
|
+
**TO DO**: fcctpbp : number of atoms still wrong !
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
## 20260302
|
|
234
|
+
### changed
|
|
235
|
+
-`make_xyz_files_remastered.py`: cleaning the module (adding parent class for crystal for example to avoid redundancy). I only did crystals class today.
|
|
236
|
+
|
|
237
|
+
-`Make_xyz_files-remastered.ipynb`,`pyNMB-exmaples-sanspbcolonnes.ipynb` : put a new markdown to explain better,
|
|
238
|
+
|
|
239
|
+
**TO DO**: verify I didn't give a wrong explanation of nLayer, nShell, and nOrder and verify the content of the sasview files !
|
|
240
|
+
|
|
241
|
+
-`platonics.py`, `utils.py`: using the old method to construct the fcc and bcc cube, the issue was in the magic numbers formulas !! for both bcc and fcc i ** 2 instead of i * 2 and adding + 1 for the bcc. Correcting the formula in magicNumbers()
|
|
242
|
+
|
|
243
|
+
-`johnsonNPs.py`: fixed doc + PEP8 + fixed some dimensions and added some new for epbpyM :
|
|
244
|
+
- height is now correct for each cases (i changed the formula from : self.heightOfPyramidF*self.Rnn*(2+self.nAtomsPerEdgeOfPC) to n (self.heightOfPyramidF * self.Rnn * self.nAtomsPerEdgeOfPC * 2 - 2.84, 2.84 being dAu-Au along the height.
|
|
245
|
+
- new pentagonal edge length and elongation edge length after Marks truncation
|
|
246
|
+
- in the notebook i print all of them (edge before and after truncating)
|
|
247
|
+
|
|
248
|
+
## 20260227
|
|
249
|
+
|
|
250
|
+
-`utils.py`: reflection() was changed and RotationMol() also (back to old cause ive made mistakes)
|
|
251
|
+
|
|
252
|
+
**To do**: fix the johnson class totally (partially fixed ! just observing smaller interatomic distances along the height for big NPs = the hieght is not well measured in all the cases, however the edges are well measured) + make the doc/pep8, the catalans class (bccrDD, romuald is looking for it also), the platonic class and archimedeans based on it (cube). The rest should be working fine, still some optimizations that could be done and minor fixes (jmol script still printing, dims of new shapes = helix and double ico not accurate).
|
|
253
|
+
|
|
254
|
+
## 20260226
|
|
255
|
+
### changed
|
|
256
|
+
-`otherNPs.py`: fixed the printing of the dimensions and updated the documentation (I think it was a bit confusing, made it clearer). Also applied syntax + doc fixes (pep8). Code should be good.
|
|
257
|
+
|
|
258
|
+
-`johnsonNPs.py`: for fcctbp class: some dimensions were false, I fixed self.heightOfBiPyramid and edgeLength().
|
|
259
|
+
|
|
260
|
+
**TO DO URGENT**: epbpyM issues, the atoms are on each other ...
|
|
261
|
+
|
|
262
|
+
-`catalans.py`: syntax + doc + restructuration (main class called CatalanNP() that is the base class for the shapes.
|
|
263
|
+
|
|
264
|
+
**TO DO URGENT**: issue with bccrDD ! (weird structure and the number of shells is not respect, one more).
|
|
265
|
+
I forced a good number of shells but the structure is still odd.
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
## 20260225
|
|
269
|
+
### changed
|
|
270
|
+
-`archimedeans.py`, `utils.py`, : for the function calculateTruncationPlanesFromVertices(), the issue was that the last layer wasn't being removed when truncating the tetrahedron leading to a not stable tetrahedron. This was only happening to the truncated tetrahedron, the others shapes did not have this problem, even though they're all using this function in the same way. To fix it I tried robust methods that did not work, instead I just put an eps of 0.1 for cutAtVertex (quite a big eps) that makes the right truncature for every sizes (at least until 50 nm). So it's not robust, but it seems to be working fine. May need to find a most robust way.
|
|
271
|
+
The documentation and syntax were fixed. Also trCube doesn't work since it's calling the cube class from the platonic module. More optimizations should be done, example using boolean masks ?
|
|
272
|
+
|
|
273
|
+
-`platonics.py`: I tried to fix the truncated cube using the same method that the other shapes in the class: total failure.
|
|
274
|
+
|
|
275
|
+
**TO DO URGENT** : **fix the cubes and actually use the magic numbers structures** (Creating a cube without it is super easy via ASE).
|
|
276
|
+
|
|
277
|
+
## 20260224
|
|
278
|
+
### changed
|
|
279
|
+
-`archimedeans.py`: restructuration : I put a main class called ArchimedeanNP() that is a base class for the other classes to put in them commun utilities = makes the code lighter. Also changed nAtomsPerShellAnalytic(): cumulative sum now (optimization), for the truncated tetrahedron I added the inscribed sphere diameter using the general function from utilities.py. Issue: truncated tetrahedron is not truncated well (not 1/3, smaller truncature).
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
## 20260223
|
|
283
|
+
### changed
|
|
284
|
+
-`platonics.py`: restructuration : I put a main class called PlatonicNP() that is a base class for the other classes (regfccOh, regIco etc) to put in them commun utilities = makes the code lighter and would be good to do it for all the modules. Functions: nAtomsPerShellAnalytic(): cumulative sum now (optimization), regIco class: added the possibility to do the double icosahedron. fccregTd(): added the possibility to make an helix of tetrahedrons (and changed the input). Also changed the documentation and syntax (google format + PEP8) **TO DO**: **change the dimensions computations in these cases (radiuses, volume are wrong now). Also see if we keep sasview_dims, maybe new optimizations ? (for coords vectorization)**
|
|
285
|
+
-`utils.py`: planeFittingLSF(): added the possibility to use many points (3D array) in entry, instead of one point to allow vectorization.
|
|
286
|
+
ISSUE: sometimes the JMOL script is printed even though there is not printing ... still couldn't figure that out
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
## 20260220
|
|
290
|
+
### changed
|
|
291
|
+
- `pyNMB-examples-sanspbcolonnes.ipynb`: notebook of examples: clearer explanations. TO DO: verify the english syntax, rename it wihtout sanspbcolonnes, verify if its always calling writexyz and not the old function that is not working
|
|
292
|
+
- `crystals.py and utils.py`:documentation changed in general, for example, i put "Target sizes"(the entries of the user) and "Measured sizes" (the final sizes) for less confusions. I also added the google format for the docstring and applied PEP8.
|
|
293
|
+
-`crystals.py`: MakeCylinder(): used to not work well, now should be working for any size and growth direction, MakeSpehre(): added the hollow sphere : new parameter = hollow_sphere_diameter (in nm), MakeParallelepiped(): measured sizes are only right when buildPPD = "xyz", need to the same for "abc" !! MakeEllipsoid(): vectorization for delAtom, and in propPostMake() calling defCrystalShapeForJMol() with noOutput = True because too noisy, let's just keep the script (half done since it's still printed sometimes for a reason I ignore)
|
|
294
|
+
So for this class, **TO DO URGENT**: dealing with "abc", see if we keep "sasview_dims"
|
|
295
|
+
- `data.py`: added the tetrahedron (surface planes, energies etc) + some cif files 'Ag fcc': 'cod9008459-Ag_fcc.cif', 'CsPbBr3 ortho' : 'CsPbBr3_ortho_14608.cif', 'CsPbBr3 cubic' : 'CsPbBr3_cubic_231023.cif' (maybe gonna delete the last ones)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
## 20260219
|
|
300
|
+
### changed
|
|
301
|
+
-`utils.py`: findNeighbours(), truncateAboveEachPlane(), truncateAbovePlanes(), returnPointsThatLieInPlanes(), Pt2planeSignedDistance(),
|
|
302
|
+
centerofgravity(), calculateCN(), delAtomsWithCN(), sortVCW = all optimization using numpy (vectorization) or scipy, rdf() = using query ball tree instead of query ball point from scipy (in comments right now, not sure about it), planeAtVertices() = using einsum from numpy but nore sure about it too (keep it as comments), findNeighbours() = using pdist and squareform from sicpy(needs to be verified), reflection_tetra(), Rx(), Ry(), Rz() = np instead of math.
|
|
303
|
+
Also the imports of numpy inside the functions were removed, now it's only in the beginning of the module.
|
|
304
|
+
writexyz() = using counter for the dict
|
|
305
|
+
The documentation and writing were also fixed (PEP8 + google style docstring)
|
|
306
|
+
|
|
307
|
+
## 20260218
|
|
308
|
+
*Notes: A lot of changes have been made and not committed since. Therefore, the following changes will be dense. They will mainly be on the src files and the example notebook + the HRTEM notebook.*
|
|
309
|
+
### changed
|
|
310
|
+
-`utils.py`: inscribed_circumscribed_spheres (maybe to change again, sasview dims seems weird). Chnages to many functions :
|
|
311
|
+
RAB(), RBetween2points(), vector(), vectorBetween2points(), normofV(), normV(), centerOgGravity(), center2cog(), centerToVertices(), planeFittingLSF() and get_moments_of_inertia_for_size() were changed for **optimization** (basically loops transformed into vectorizations), should still work because of the new checks (if they are np arrays) and be way faster.
|
|
312
|
+
reflection() was modified : new condition with eps
|
|
313
|
+
### added
|
|
314
|
+
-`utils.py`:
|
|
315
|
+
full_diagnostics() a diagnostic function for ASE EMT computations (which can fail in certain cases, try to find out why exactly).
|
|
316
|
+
rotation_around_axis_through_point() to be used in the module TEM_creator.py (when creating the structure = NP on the carbon substrate in the HRTEM images).
|
|
317
|
+
reflection_tetra() function for the helix of tetrahedrons
|
|
318
|
+
### deleted
|
|
319
|
+
MOI_shapes(): removed cause not working that well (working for certain shapes but not others, I will work on it locally), writexyz_generalized(name of the class)(): the functions to automatize the creation of files: are now in a new module (make_files.py)
|
|
320
|
+
|
|
321
|
+
## 20260115
|
|
322
|
+
in the pyNMB-examples :To do : make sure to always use pyNmbu.writexyz and not just write (because there is an extra column)
|
|
323
|
+
|
|
324
|
+
## 20250310
|
|
325
|
+
### changed
|
|
326
|
+
For every NPs classes: changed the position of the function defCrystalShapeForJMol(), it is now in propPostMake() and is done by default (also added the attributes if it was missing).
|
|
327
|
+
|
|
328
|
+
## 20250307
|
|
329
|
+
### changed
|
|
330
|
+
Documentation for each NPs classes and their functions
|
|
331
|
+
|
|
332
|
+
## 20250305
|
|
333
|
+
### added
|
|
334
|
+
- `Create_otherNPs_database.ipynb`: class that creates nps + cif/xyz files
|
|
335
|
+
- `Create_johnson_database.ipynb`: class that creates nps + cif/xyz files
|
|
336
|
+
- `Create_catalan_database.ipynb`: class that creates nps + cif/xyz files
|
|
337
|
+
- `johnsonNPs.py`: `nAtomsPerEdgeOfPC_after_truncation()` and `edgeLength_after_truncation(whichEdge)` to be specified in dictionnary in the files
|
|
338
|
+
### changed
|
|
339
|
+
-`utils.py`: all the files writing functions were changed, now the main dimensions are the radius of the insphere and cicumscribed sphere (the MOI dim used to be the main dim but some of them are not accurate), secondary dims are added (specific lengths and the number of atoms they're containing), and the truncature was also added (True or False)
|
|
340
|
+
## 20250227
|
|
341
|
+
### changed
|
|
342
|
+
-`archimedeanNPs.py`: changed MOI formulas, also added self.shape for each classes.
|
|
343
|
+
|
|
344
|
+
### added
|
|
345
|
+
-`Create_archimedean_database.ipynb`: class that creates archimedean nps + cif/xyz files, some conditions are made for the bravais lattice (only fcc). NB: not possible to make multi elements nps and trcubes aren't added for now
|
|
346
|
+
-`utils.py`: `writexyz_generalized_archimedean()`: function that writes archimedean nps cif/xyz files
|
|
347
|
+
|
|
348
|
+
## 20250225
|
|
349
|
+
### changed
|
|
350
|
+
-`Create_crystals_database.ipynb`: when creating multiple NPs (and their files), their sizes depend on dhkl, it allows to have the minimum size step while never having twice the same size. The sizes are now chosen using multiple of dhkl, example for a sphere: size=[2*dhkl],[3*dhkl], etc. Also "max_size" was added in order to choose a maximum size when creating the NPs, it corresponds to the diameter of the circumscribed sphere.
|
|
351
|
+
-`Create_platonic_dataset.ipynb` : Same changes adapted for the Platonic Class
|
|
352
|
+
`utils.py`: `writexyz_generalized_platonic()`: function that writes platonic nps cif/xyz files
|
|
353
|
+
|
|
354
|
+
## 20250219
|
|
355
|
+
### changed
|
|
356
|
+
|
|
357
|
+
-`Create_crystals_database.ipynb`: nRot is now written in the name of the wires files (and the size indicator restart at 0 when nRot changes)
|
|
358
|
+
-`platonicNPs` : nShell, nLayer and nOrder restored, they do not mean the same thing !
|
|
359
|
+
-`Create_platonic_dataset.ipynb` : was adapted with dynamic variables for the intanciation of the class : nShell, nLayer, nOrder based on the form. Even if nLayer=nOrder or nShell+1, the files size indicator increases the same way no matter the form (ex : Co_fcc_regIco_0000001 = 1 bond by edge, Co_fcc_regIco_0000002 = 2 ..etc and same for other forms)
|
|
360
|
+
|
|
361
|
+
## 20250218
|
|
362
|
+
### added
|
|
363
|
+
|
|
364
|
+
-`utils.py`:`create_data_csv()` : creates csv files containing only the dictionnary of the xyz files (or Iq csv files)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
## 20250214
|
|
368
|
+
|
|
369
|
+
### changed
|
|
370
|
+
-`platonicNPs` : same name for number of shells = 'nOrdet' for all the classes to ease the generalization !MISTAKE!
|
|
371
|
+
### added
|
|
372
|
+
-`Create_platonic_dataset.ipynb` : class that creates Platonics nps + cif/xyz files, some conditions are made for the bravais lattice. NB: not possible to make multi elements nps and hollow cubes aren't added for now
|
|
373
|
+
|
|
374
|
+
## 20250212
|
|
375
|
+
### changed
|
|
376
|
+
- `Create_crystals_database.ipynb` : sizes can be defined by np.arange(initial,final,step)
|
|
377
|
+
- `crystalNPS.py` : all the shapes are now created from a given diameter (used to be diameter for some shapes and radius for other shapes, same descriptor is better : less confusing for user but also easier for creating multiple files)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
## 20250211
|
|
381
|
+
### added
|
|
382
|
+
- 3 classes in `Create_crystals_database.ipynb`, a notebook made to create a database of xyz/cif files of Crystal nps :
|
|
383
|
+
- `Crystals_ellipsoids_parallepipeds`: finished
|
|
384
|
+
- `Crystals_spheres`: finished
|
|
385
|
+
- `Crystals_wires`: ongoing work (how to defined the planes of the wire depending on the element used)
|
|
386
|
+
- `utils.py` : functions `get_crystal_type` (to find the Bravais lattice based on the n° space group), `extract_cif_info`(cif name and crystal type), `load_cif` for the 3 classes in `Create_crystals_database.ipynb`
|
|
387
|
+
### changed
|
|
388
|
+
- `crystalNPS.py` : in `loadExternalCif(self)`: a condition was added (if hasattr(self, 'cif'):return) to not load the structures from the cif files twice if they were already loaded in the classes `Crystals_ellipsoids_parallepipeds`, `Crystals_spheres` or `Crystals_wires` (gain of time)
|
|
389
|
+
|
|
390
|
+
## 20250207
|
|
391
|
+
### changed
|
|
392
|
+
- `crystalNPS.py` : issue with MOI fixed for wulff forms that aren't predifined
|
|
393
|
+
### added
|
|
394
|
+
- `utils.py` : `writexyz_generalized_crystals` : noOutput added
|
|
395
|
+
- `utilsDC.py` : `create_iqfiles_from_xyzfiles` : noOutput added
|
|
396
|
+
- `Create_crystals_database` : `class PredifinedWulffFiles` : noOutput added
|
|
397
|
+
Usefull when we will create a lot of files
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
## 20250204
|
|
401
|
+
### changed
|
|
402
|
+
- `utils.py` : new function `Inscribed_circumscribed_spheres(self,noOutput)` that calculates the inscribed/circumscribed spheres radius that can be call for each classes (instead of re writing it everytime)
|
|
403
|
+
- `johnsonNPS` : calling the function `Inscribed_circumscribed_spheres(self,noOutput)`
|
|
404
|
+
- `UtilsDC.ipynb` : change of the functions of the graphs (mistakes were made)
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
## 20250203
|
|
408
|
+
### added
|
|
409
|
+
- `utils.py` : new size/MOI formula for the wires that work for any nRot and both wires from crystals and predefined wulff forms, gives the height of the wire and the edge of the pentagon
|
|
410
|
+
- `size_test_MOI_real.ipynb`: verification of the sizes (height and edge) given by the new formula
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
## 20250131
|
|
414
|
+
### added
|
|
415
|
+
- `cif_to_xyz.ipynb` : possibility to create files (xyz,cif,iq) of a specific form given by the user from cif files in data.py
|
|
416
|
+
|
|
417
|
+
## 20250127
|
|
418
|
+
### added
|
|
419
|
+
The idea is to calculate the size from the MOI for each nps in the crystals class taking into consideration the truncated ones that need to be approximated. Also, using a function in utils to do it.
|
|
420
|
+
|
|
421
|
+
- `utlis.py`: def MOI_shapes(class_shape) function that calculates the size from the MOI (used to be in crystals)
|
|
422
|
+
- `data.py` : in class WulffShapes : 'MOI for size' : truncated shapes are approximated as shapes with knowns formulas for the MOI/size
|
|
423
|
+
- `crystalNPS.py` : in `predefinedParameters4WulffShapes` : self.MOIshape=data.WulffShapes.WSdf['MOI for size'].loc[self.WulffShape] and in `propPostMake()` : calling the function self.pyNMBu.MOI_shapes()
|
|
424
|
+
- `utils.py` : writexyz_generalized_crystals to create the files for predefined wulff shapes in a good format
|
|
425
|
+
|
|
426
|
+
## 20250111
|
|
427
|
+
- `platonicNPs.py`: the call to `pyNMBu.defCrystalShapeForJMol` is now made in `propPostMake()` (moved from `__init__`, it was obviously wrong)
|
|
428
|
+
- `utils.py`: in the function `reduceHullFacets()`, `HalfspaceIntersection()` <as called with the option `qhull_options="QJ"` (joggles each input coordinate), which was not working in most cases
|
|
429
|
+
|
|
430
|
+
## 20240106
|
|
431
|
+
### added
|
|
432
|
+
- `crystalNPs.py` : in def prop(self,noOutput): if "Wulff" in self.shape : compute the inscribed sphere and circumscribed sphere (for pre deffined wulff form)
|
|
433
|
+
- `cif_to_xyz.py` : create all the files (xyz,cif,iq) of all the wulff forms from cif files in data.py
|
|
434
|
+
|
|
435
|
+
## 20241220
|
|
436
|
+
### added
|
|
437
|
+
- in every class of NPS (for every shapes except hollow shapes): MOI mass normalized (m of each atoms=1) : self.moisize=np.array(pyNMBu.moi_size(self.NP, noOutput))`
|
|
438
|
+
- `crystalNPs.py`: main dimensions calculated from MOI normalized (in an array [d1,d2,d3] with d1>d2>d3) for : sphere, ellipsoid, cylinder, wire (for nRot=4 and nRot=6), parallepiped
|
|
439
|
+
- `platonicNPs.py`: main dimensions calculated from MOI normalized for : regfccOh regIco regfccTd regDD cube (not working with hollow cube)
|
|
440
|
+
### changed
|
|
441
|
+
- `utils.py`:
|
|
442
|
+
- `writexyz_generalized()`: updated function that writes xyz files (with dictionnaries and good file names with numerotation), inputs : path and instance of a class. Example of use in 2.2.6 `pyNMB-examples-sanspbcolonnes` with the use of loops
|
|
443
|
+
|
|
444
|
+
### changed
|
|
445
|
+
- `platonicNPs.py`:
|
|
446
|
+
- `class regfccOh` : `radiusCircumscribedSphere(self)` error in the formula, changed and working now
|
|
447
|
+
|
|
448
|
+
## 20241218
|
|
449
|
+
### added
|
|
450
|
+
- `utils.py`:
|
|
451
|
+
- `get_moments_of_inertia_for_size(self, vectors=False)` : Get the moments of inertia along the principal axes with
|
|
452
|
+
mass normalisation. Units of the moments of inertia are angstrom**2
|
|
453
|
+
- `moi_size(model: Atoms,noOutput: bool=False,)` : Returns the 3 moments of inertia along the principal axes with mass normalization to get acces to size informations
|
|
454
|
+
### changed
|
|
455
|
+
- `propPostMake(self,skipSymmetryAnalyzis, thresholdCoreSurface, noOutput)`: the size of the crystals are calculated using the pNMBu.moi_size() function
|
|
456
|
+
|
|
457
|
+
## 20241211
|
|
458
|
+
### added
|
|
459
|
+
- `utils.py`:
|
|
460
|
+
- `writexyz_generalized()`: function that writes xyz files (with dictionnaries and good file names), inputs : path and instance of a class.
|
|
461
|
+
Possibility to create multiple files if the instanciation of the class is in a loop (loop on the size of atoms for example), cf `pyNMB-examples-sanspbcolonnes`.
|
|
462
|
+
### changed
|
|
463
|
+
- `utilsDC.py`:
|
|
464
|
+
- `create_iqfiles_from_xyzfiles(self, path_of_xyzfiles, path_of_csvfiles)`: dictionnaries are added in the csv files
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
## 20241206
|
|
468
|
+
### added
|
|
469
|
+
- `utilsDC.py`:
|
|
470
|
+
- imports for Debye calculations
|
|
471
|
+
- functions that plot I=f(q), S=f(q), F=f(q), G=f(r)
|
|
472
|
+
- functions that create multiple csv files containing scattering data calculated from xyx/cif files/ ASE object
|
|
473
|
+
|
|
474
|
+
- `DebyeTest.ipynb` : tests the new utilities from utilsDC.py
|
|
475
|
+
|
|
476
|
+
- `coords_test_debye` : new repository containing xyz and cif files to use as examples in DebyeTest.ipynb
|
|
477
|
+
|
|
478
|
+
- `csv_files` : new repository that will contain csv files created by user when they will try DebyeTest.ipynb
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
## 20240630
|
|
483
|
+
### added
|
|
484
|
+
- `utils.py`:
|
|
485
|
+
- very basic rdf calculator `rdf()` for finite size compounds, *i.e.* without PBC
|
|
486
|
+
- `createDir()` utility
|
|
487
|
+
- `SandBox-doNotDelete-dev.ipynb`: **RDF profiles** section, made to create rdf profiles for a machine learning tutorial, which will soon be added to the [pyPhysChem github repository](https://github.com/rpoteau/pyPhysChem)
|
|
488
|
+
|
|
489
|
+
## 20240629
|
|
490
|
+
### added
|
|
491
|
+
- `utils.py`: `noOutput` added in
|
|
492
|
+
- `calculateTruncationPlanesFromVertices()`
|
|
493
|
+
- `truncateAboveEachPlane()`
|
|
494
|
+
|
|
495
|
+
### changed
|
|
496
|
+
- `aseView` set to `False` by default
|
|
497
|
+
- `noOutput` and `aseView` chase continued in:
|
|
498
|
+
- `platonicNPs.py`
|
|
499
|
+
- `archimedeanNPs.py`
|
|
500
|
+
- `catalanNPs.py`
|
|
501
|
+
- `johnsonNPs.py`
|
|
502
|
+
- `otherNPs.py`
|
|
503
|
+
|
|
504
|
+
## 20240628
|
|
505
|
+
### added
|
|
506
|
+
- `data.py`:
|
|
507
|
+
- new `pyNMBimg.IMGdf` dataframe, that contains an information necessary to define `self.imageFile`
|
|
508
|
+
- `setdAsNegative(planes)`: returns each plane [a b c d] of the `planes` array as [-a -b -c -d] if d is positive
|
|
509
|
+
- `data.WulffShapes`: new `hcpsph2` (Nørskov *et al*, [10.1126/science.1106435](https://dx.doi.org/10.1126/science.1106435))
|
|
510
|
+
- `crystalNPs.py`:
|
|
511
|
+
- `self.WulffShape` now defined from `self.shape` in `__init__` instead of `makeWulff()`
|
|
512
|
+
- `self.trPlanes` initialized to `None` in `__init__`
|
|
513
|
+
|
|
514
|
+
### changed
|
|
515
|
+
- graphical documentation updated with a general Wulff structure
|
|
516
|
+
|
|
517
|
+
### fixed
|
|
518
|
+
- `utils.py`:
|
|
519
|
+
- `defCrystalShapeForJMol()` returns a jMol command if `trPlanes` is not `None`
|
|
520
|
+
- several functions were recently modified to accept`noOutput` as argument; the `aseView` argument is now taken into account here and there (#12). Also added:
|
|
521
|
+
- `printN = not noOutput` and `printV = not noOutput` as argument to `normal2MillerPlane()` & `lattice_cart()` in `crystalNPs.py` > `makeWire()` and `makeParallelepiped()`
|
|
522
|
+
- `noOutput` added as argument of `planeRotation()`
|
|
523
|
+
|
|
524
|
+
## 20240626
|
|
525
|
+
### changed
|
|
526
|
+
- `data.py`:
|
|
527
|
+
- `bccrdd`, `trbccrdd`, `ttrbccrdd`, `cub`, `trcub` and `dicotd` predifined Wulff shapes renamed `bccrDD`, `trbccrDD`, `ttrbccrDD`, `cube`, `trcube` and `dicoTd`
|
|
528
|
+
- graphical documentation updated with the pre-defined Wulff structures
|
|
529
|
+
|
|
530
|
+
## 20240625
|
|
531
|
+
### added
|
|
532
|
+
- `utils.py`:
|
|
533
|
+
- `saveCoords_DrawJmol()`:
|
|
534
|
+
- `boundaries` option (default: `False`). If Wulff shapes or any other boundary-defined structure (such as wires), facet plots with the time-consuming `./figs/script-facettes-345PtLight.spt` jmol script is useless. Set as `False` to unactivate it, as well as the bonds and atoms drawing, since they are defined in the `jMolCS` script
|
|
535
|
+
- `noOutput=True` option
|
|
536
|
+
- `path2Jmol` defined locally in `saveCoords_DrawJmol()` is now defined in the `pyNMBvar` class of `data.py`
|
|
537
|
+
|
|
538
|
+
### fixed
|
|
539
|
+
*doing and undoing... is is still work?*
|
|
540
|
+
- `crystalNPs.py`: in `makeSuperCell()`
|
|
541
|
+
```
|
|
542
|
+
sc.translate(-V[0]/2)
|
|
543
|
+
sc.translate(-V[1]/2)
|
|
544
|
+
sc.translate(-V[2]/2)
|
|
545
|
+
```
|
|
546
|
+
is back...
|
|
547
|
+
|
|
548
|
+
## 20240623
|
|
549
|
+
### fixed
|
|
550
|
+
- `crystalNPs.py`: in `makeSuperCell()`, `sc.center(about=(0.0,0.0,0.0))` replaces:
|
|
551
|
+
|
|
552
|
+
```
|
|
553
|
+
sc.translate(-V[0]/2)
|
|
554
|
+
sc.translate(-V[1]/2)
|
|
555
|
+
sc.translate(-V[2]/2)
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
Check in all examples that everything is consistent with this centering
|
|
559
|
+
|
|
560
|
+
## 20240622
|
|
561
|
+
### added
|
|
562
|
+
- `utils.py`:
|
|
563
|
+
- `scaleUnitCell()`: scales the unit cell size so that the nearest NN distance is scaled to the `scaleDmin2` input parameter (see `scaleDmin2` variable of the `Crystal` class)
|
|
564
|
+
- `saveCN4JMol()`: saves coordination numbers in a CN.dat file, and print the jmol command to link atom colors and atom CNs
|
|
565
|
+
- `plotPalette()`: plots a 1D palette colors, with names
|
|
566
|
+
- `rgb2hex()`: converts rgb numbers to #hex code, under the form [xAABBCC] - this is for jMol
|
|
567
|
+
- `crystalNPs.py`:
|
|
568
|
+
- new `setSymbols2` variable (array). Can be associated to `scaleDmin2` in order to start from a given cif file and change the atom(s) as new ones. The number of chemical symbols must fit the number of atoms of the reference unit cell
|
|
569
|
+
|
|
570
|
+
### changed
|
|
571
|
+
- `crystalNPs.py`:
|
|
572
|
+
- `noOutput` variable now also effective whith `chrono` calls and various print commands in `makeWulff()`
|
|
573
|
+
- new `scaledR` variable is now effective
|
|
574
|
+
- `utils.py`:
|
|
575
|
+
- point group returned as `pg` property of `aseobject: Atoms` object
|
|
576
|
+
- `noOutput` variable now also effective whith `chrono` calls and various `print` commands in `MolSym()`, `moi()`, `returnPointsThatLieInPlanes()`, `defCrystalShapeForJMol()`, `reduceHullFacets()`, ` kDTreeCN()`, `truncateAbovePlanes()`
|
|
577
|
+
- `pyNanoMatBuilder.ipynb` renamed as `pyNMB-examples.ipynb
|
|
578
|
+
- `pNNBu`, `pNMBdata`, `pNMBvar`, `pNMBcif` shortcuts renamed as `pyNMBu`, `pyNMBvar`, `pyNMBdata`, `pyNMBcif`
|
|
579
|
+
|
|
580
|
+
## 20240619
|
|
581
|
+
### added
|
|
582
|
+
- `utils.py`:
|
|
583
|
+
- new `kDTreeCN()` function, that returns the list (`nn`) and number (`CN`) of nearest neighbours of each atom; distances are returned as well if returnD is `True` (based on the very efficient `KDtree()` function of scikit-learn)
|
|
584
|
+
- `crystalNPs.py`:
|
|
585
|
+
- new `scaleDmin2` variable: if not `None`, all coordinates are scaled so that the nearest neighbour distance in the crystal becomes scaleDmin2 (**under development**)
|
|
586
|
+
|
|
587
|
+
## 20240609
|
|
588
|
+
### added
|
|
589
|
+
- `SandBox-doNotDelete-dev.ipynb`:
|
|
590
|
+
- test of the `KDTree` algorithm for the nearest neighbour search
|
|
591
|
+
|
|
592
|
+
## 20240609
|
|
593
|
+
### added
|
|
594
|
+
- `pyNanoMatBuilder.ipynb`:
|
|
595
|
+
- *Find all symmetry-equivalent planes* subsection in the *Miscellaneous* section, aka use of the `ase.spacegroup.Spacegroup` tools
|
|
596
|
+
|
|
597
|
+
## 20240608
|
|
598
|
+
### added
|
|
599
|
+
- `crystalNPs.py`
|
|
600
|
+
- new `jmolCrystalShape` boolean variable (default: `False`)
|
|
601
|
+
- `utils.py`
|
|
602
|
+
- `coreSurface()`
|
|
603
|
+
- receives `Crystal` instance as parameter instead of the coordinates, so that now it is possible to use or return associated properties (`Crystal.trPlanes`, `Crystal.jMolCS`, `Crystal.NP.get_positions()`)
|
|
604
|
+
- now also calls `defCrystalShapeForJMol(Crystal)`
|
|
605
|
+
|
|
606
|
+
### changed
|
|
607
|
+
- `utils.py`
|
|
608
|
+
- `defWulffShapeForJMol()` renamed as `defCrystalShapeForJMol()`
|
|
609
|
+
- reduction of Hull facets (simplices) that was part of `defWulffShapeForJMol()` is now an external `reduceHullFacets()` function
|
|
610
|
+
- `crystalNPs.py`
|
|
611
|
+
- `defCrystalShapeForJMol()` is called at the end of `makeNP()` if `jmolCrystalShape` is True and the jmol command is returned as `self.jmolCS`
|
|
612
|
+
- `platonicNPs.py`, `cube` class: coordinates centered in [0,0,0] (was made necessary for the crystal shape calculation)
|
|
613
|
+
```
|
|
614
|
+
coords = sc.get_positions()
|
|
615
|
+
oldcog = sc.get_center_of_mass()
|
|
616
|
+
coords = coords - oldcog
|
|
617
|
+
sc.set_positions(coords)
|
|
618
|
+
```
|
|
619
|
+
- `platonicNPs.py`, `archimedeanNPs.py`, `catalanNPs.py`
|
|
620
|
+
- in `propPostMake()`, `self` is passed as an argument to `pNMBu.coreSurface()`, instead of the array of atomic coordinates
|
|
621
|
+
- `self.cog = self.NP.get_center_of_mass()` added at the end of the `coords()` functions
|
|
622
|
+
|
|
623
|
+
### fixed
|
|
624
|
+
- `utils.py`
|
|
625
|
+
- in very borderline cases `linalg.eig` returned complex numbers in `planeFittingLSF()`, the complex part being 0j => returned variable is now `np.array([u,v,w,h]).real`
|
|
626
|
+
|
|
627
|
+
## 20240607
|
|
628
|
+
### changed
|
|
629
|
+
- `pyNanoMatBuilder.ipynb`:
|
|
630
|
+
- two main parts, namely *Crystal structure-based shapes* and *Magic number clusters and nanoparticles*
|
|
631
|
+
|
|
632
|
+
### added
|
|
633
|
+
- `pyNanoMatBuilder.ipynb`:
|
|
634
|
+
- all predefined Wulff crystals are displayed in a *List of the pre-defined Wulff shapes in the `data.WulffShapes.WSdf` pandas dataframe* section, at the end of the notebook
|
|
635
|
+
- `crystalNPs.py`
|
|
636
|
+
- in `predefinedParameters4WulffShapes`, a warning is displayed if the expected lattice system of the Wulff shape is not the same as that of the Bravais lattice system of the cif file
|
|
637
|
+
|
|
638
|
+
### fixed
|
|
639
|
+
- `signedAngleBetweenVV()` function in `utils.py`: was using an arbitrary normal vector. It is now calculated in `defWulffShapeForJMol()` and passed as an argument of `signedAngleBetweenVV()`
|
|
640
|
+
|
|
641
|
+
## 20240606
|
|
642
|
+
### added
|
|
643
|
+
- `data.py`
|
|
644
|
+
- declaration of a `WSdf` pandas dataframe in a new `WulffShapes` class: contains the energy and plane parameters of some remarkable Wulff structures, as well as the lattice system and Bravais lattice(s) consistent with each Wulff shape
|
|
645
|
+
- `crystalNPs.py`
|
|
646
|
+
- `predefinedParameters4WulffShapes()` function in the `Crystal` class, called if `Crystal.shape` contains `Wulff` followed by the ":" separator and a shortcut associated to a given shape (list in the `WulffShapes.WSdf` dataframe - see index of `WSdf`). Reads the `WSdf` pandas dataframe and initializes `self.eSurfacesWulff` and `elf.surfacesWulff` if the user-defined shortcut is found in the `WSdf` dataframe. Otherwise an error message is returned and `pyNanoMatBuilder` stops
|
|
647
|
+
|
|
648
|
+
### changed
|
|
649
|
+
- names of cif files and shortcut top address them are now also stored as a `CIFdf` pandas dataframe in a new `pNMBcif` class, created in `data.py`. Shortcuts are declared as the index of the dataframe, whilst cif filenames are available in the `cif file` column of `CIFdf`. `pyNanoMatBuilder` stops if the shortcut (case-independent) is not found in `CIFdf`
|
|
650
|
+
|
|
651
|
+
## 20240605
|
|
652
|
+
### added
|
|
653
|
+
- abstract in README.md
|
|
654
|
+
- `defWulffShapeForJMol()` function in `utils.py`: return the jmol command to plot the Wulff shape
|
|
655
|
+
- `signedAngleBetweenVV()` function in `utils.py`, introduced for `defWulffShapeForJMol()`: calculates the signe angle between two vectors. Useful to reorder the vertices of a polygon
|
|
656
|
+
|
|
657
|
+
### changed
|
|
658
|
+
- `crystalNPs.py`
|
|
659
|
+
- `normal2MillerPlane()` called before `pNMBu.lattice_cart()` in `crystal.makeWulff()` & in `crystal.makeParallelepiped()`, and before `pNMBu.planeRotation()` in `crystal.makeWire()`
|
|
660
|
+
|
|
661
|
+
## 20240603
|
|
662
|
+
### added
|
|
663
|
+
- `utils.py`
|
|
664
|
+
- `normal2MillerPlane()` function: returns the the normal direction (*n*1, *n2*, *n*3) to the plane defined by *h*,*k*,*l* Miller indices (calculated as [n1 n2 n3] = (hkl) x G*, where G* is the reciprocal metric tensor). (*n*1, *n2*, *n*3) are returned as the closest integers to the float numbers calculated by this equation. This calculation is mandatory for non-orthogonal basis sets
|
|
665
|
+
|
|
666
|
+
### changed
|
|
667
|
+
- `return_unitcell()` function moved from `CrystalNPs.py` to `utils.py` and renamed `returnUnitcellData()`. Now associates unitcell variables to a `Crystal` class instance:
|
|
668
|
+
- Bravais lattice, as `ucBL`
|
|
669
|
+
- space group calculated by `ase`, as `ucSG`
|
|
670
|
+
- unitcell, as `ucUnitcell`
|
|
671
|
+
- a,b,c = f(x,y,z) vectors, as `ucV`
|
|
672
|
+
- volume as, `ucVolume`
|
|
673
|
+
- reciprocal lattice, as `ucReciprocal`
|
|
674
|
+
- chemical formula as, `ucFormula`
|
|
675
|
+
|
|
676
|
+
## 20240603
|
|
677
|
+
### added
|
|
678
|
+
- `pNMBvar` dataclass in `data.py`. So far, defines only `dbFolder = 'cif_database'`
|
|
679
|
+
- new `symWulff` instance boolean variable of the `Crystal` class (default `True`). If `True` all symmetry operations of the crystal space group are applied to all `surfaceWulff` truncation planes
|
|
680
|
+
|
|
681
|
+
### changed
|
|
682
|
+
- the listing of all cif files contained in the `dbFolder`, with the symmetry properties and unit cell values has been transformed as a `listCifsOfTheDatabase()` function, available in `utils.py`
|
|
683
|
+
|
|
684
|
+
## 20240602
|
|
685
|
+
### added
|
|
686
|
+
- in the `Crystal` class:
|
|
687
|
+
- **new `makeWulff()` function**, with its associated variables: `surfacesWulff`, `eSurfacesWulff`, `sizesWulff`. *This is a basic implementation, still a lot of work to do to account for symmetry*
|
|
688
|
+
- `ase.spacegroup.get_spacegroup(ase_Atoms_object,symprec=1e-4)` added in the `bulk()` function
|
|
689
|
+
- `sg` instance object is available, it is a Spacegroup object of ase
|
|
690
|
+
- the space group number and Hermann-Mauguin symbol are printed by `print_unitcell()`
|
|
691
|
+
- new `aseSymPrec` instantiation variable, set to 1e-4 by default
|
|
692
|
+
- in `pyNanoMatBuilder.ipynb` notebook: new *List all cif files available in the database* section, that prints basic crystal info, and compares the ase symmetry analyzis with the space group info available in the cif files. A warning is triggered if they differ
|
|
693
|
+
- and regarding crystal symmetries, `ase.spacegroup.get_spacegroup(ase_Atoms_object)` tested in the sandbox notebook. Interesting, but does not find the right group for Ru hcp. Can be fixed by setting up `symprec` as 1e-4 instead of the 1e-5 default). Finally it will probably do the job to generate all symmetry equivalent planes of a given crystal
|
|
694
|
+
|
|
695
|
+
### changed
|
|
696
|
+
- on the graphical documentation, a distinction is made between *atomically precise* NPs and NP *shapes*
|
|
697
|
+
- `print_unitcell()` of the `Crystal` class renamed as `print_ase_unitcell()` and moved in `utils.py`
|
|
698
|
+
|
|
699
|
+
## 20240601
|
|
700
|
+
### added
|
|
701
|
+
- cif coordinates for TiO2 rutile, TiO2 anatase, NaCl
|
|
702
|
+
- in the `Crystal` class, it is now possible to load a cif file that does not belong to the database, using the new `userDefCif` keyword. The `loadExternalCif()` function is called if `userDefCif` is not `None`, *i.e.* it contains the path to a cif file
|
|
703
|
+
- `alignV1WithV2_returnR()` and `rotateMoltoAlignItWithAxis()` functions in `utils.py`. See example of application in the sandbox notebook, section *Calculate rotation matrix to align two vectors in 3D space*. Could for example be useful to align wires along the *c* direction
|
|
704
|
+
- **new `makeParallelepiped()` function in the `Crystal` class** (called by `makeNP()`). Associated keywords:
|
|
705
|
+
- `directionsPPD` variable, used to build new parallelepiped 3D structures. Default is [[0,0,1],[0,1,0],[0,0,1]]
|
|
706
|
+
- completed with `buildPPD`: if `buildPPD="xyz"` (default), `directionsPPD` are applied in the cartesian coordinate system, otherwise if `buildPPD="abc"`, `directionsPPD` are applied in the Bravais coordinate system
|
|
707
|
+
|
|
708
|
+
### changed
|
|
709
|
+
- `noOutput` and `calcPropOnly` variables introduced for Platonic, Archimedean, Catalan and Johnson NPs also introduced in the `Crystal` class of `crystalNPs.py`
|
|
710
|
+
- `silent` variable renamed as `noOutput` in all classes
|
|
711
|
+
- in `crystalNPs.py`, `direction`, `nRot` and `refPlane` renamed `directionWire`, `nRotWire` and `refPlaneWire`
|
|
712
|
+
|
|
713
|
+
## 20240531
|
|
714
|
+
### changed
|
|
715
|
+
- changes previously done to the `Crystal` class in the **20240529** version applied to the classes of:
|
|
716
|
+
- `otherNPs.py`
|
|
717
|
+
|
|
718
|
+
## 20240530
|
|
719
|
+
### added
|
|
720
|
+
- because classes of `platonicNPs.py` can be used as generators for other polyhedra (truncated NPs, etc), new keywords are introduced:
|
|
721
|
+
- `silent`: does not print anything
|
|
722
|
+
- `calcPropOnly`: does not calculate the coordinates
|
|
723
|
+
|
|
724
|
+
### changed
|
|
725
|
+
- changes previously done to the `Crystal` class in the **20240529** version applied to the classes of:
|
|
726
|
+
- `platonicNPs.py`
|
|
727
|
+
- `archimedeanNPs.py`
|
|
728
|
+
- `catalanNPs.py`
|
|
729
|
+
- `johnsonNPs.py`
|
|
730
|
+
|
|
731
|
+
## 20240529
|
|
732
|
+
### added
|
|
733
|
+
- new *Convert the images to base64 code* section in the notebook. The intent is to embed images of nanoparticles in the log of the GUI that is under development. Base64 encoding of the `~/figs/*-C.png` files are now available in the same folder (*embedding not implemented yet*)
|
|
734
|
+
- in `utils.py`
|
|
735
|
+
- `findNeighbours()` and `printNeighbours()`. <span style='color:red'>for several thousand atoms molecules, this python implementation is time-consuming. Use with caution... or don't be surprised if your builder seems frozen</span>
|
|
736
|
+
- `coreSurface()`: does the convex Hull analysis available in `scipy.spatial`. Returns the `[hull.vertices,hull.simplices,hull.neighbors,hull.equations]`, as well as a `SurfaceOrCoreAtom` array of booleans
|
|
737
|
+
- `returnPointsThatLieInPlanes`
|
|
738
|
+
- in the `Crystal` class, used as a test, and before generalization to the other classes
|
|
739
|
+
- a new `propPostMake()` function is now called in `__init__`, to give some specifics properties of the final nano-object, **including a core/surface analyzis** based on the `scipy.spatial` convex Hull analysis. <span style='color:red'>Mind that such strategy does not apply to stepped surfaces</span>... in principle. A possible way to bypass this limitation is to define a threshold, so that all atoms lying "*just below*" the simplices are surface atoms. This is the intent of the new `thresholdCoreSurface` variable
|
|
740
|
+
- the final call to `propPostMake()` can be skipped if the instance is created with `postAnalyzis=False` (default is `True`)
|
|
741
|
+
- the symmetry analyzis is skipped if `skipSymmetryAnalyzis` is `True` (default is `False`)
|
|
742
|
+
|
|
743
|
+
### changed
|
|
744
|
+
- in the `Crystal` class, used as a test, and before generalization to the other classes
|
|
745
|
+
- `makeNP()` & `prop()` calls are now direcly made when an NP instance is created
|
|
746
|
+
- `vID.centerTitle(general title)` now introduced in the `__init__` call of each class
|
|
747
|
+
- all properties/objects associated are now associated to the created instance, let's call it `object`
|
|
748
|
+
- `object.cif` returns the cif info of the crystal that serves as shape generator as an `ase` `Atoms` object
|
|
749
|
+
- `object.sc` returns the supercell as an `ase` `Atoms` object
|
|
750
|
+
- `object.NP` returns the nano-object as an `ase` `Atoms` object
|
|
751
|
+
- `object.NPcs` returns the nano-object as an `ase` `Atoms` object, with core atoms labeled as "No", the Nobelium element. Why No? Because it has a nice <span style='color:#be1088'>**magenta**</span> color in jmol
|
|
752
|
+
- calls to the ase viewer are made only if a `aseView` variable is `True` (default)
|
|
753
|
+
- in `utils.py`, the `vID.centertxt()` style of sub-subprocesses is changed as black fg on grey bg and font size 12 (example: `vID.centertxt(f"Convex Hull analyzis",bgc='#cbcbcb',size='12',fgc='b',weight='bold')`)
|
|
754
|
+
|
|
755
|
+
## 20240528
|
|
756
|
+
### added
|
|
757
|
+
- `ImagePathway()` and `plotImageInPropFunction()` in `utils.py`: their purpose is to draw the schematic representation of the NPs, as they appear in the documentation
|
|
758
|
+
- `prop()` function in the `Crystal` class of `crystalNPs.py`
|
|
759
|
+
|
|
760
|
+
### changed
|
|
761
|
+
- `ImagePathway()` and `plotImageInPropFunction()` functions are now used in all `__init__` and `prop()` functions of
|
|
762
|
+
- `platonicNPs.py`
|
|
763
|
+
- `crystalNPs.py` (*spheres* and *ellipsoids* only... so far)
|
|
764
|
+
- `archimedeanNPs.py`
|
|
765
|
+
- `catalanNPs.py`
|
|
766
|
+
- `johnsonNPs.py`
|
|
767
|
+
- `otherNPs`
|
|
768
|
+
- `crystalNPs`:
|
|
769
|
+
- call to `self.bulk()`, *i.e.* cif loading, moved to `__init__`
|
|
770
|
+
- call to `self.print_unitcell()` moved to `prop()`
|
|
771
|
+
- `johnsonNPs.py`: now `nLayer` is the number of layers per trigonal pyramid (*i.e.* the total number of layer is 2xnLayer+the twinning plane)
|
|
772
|
+
|
|
773
|
+
## 20240527
|
|
774
|
+
### changed
|
|
775
|
+
- new `threshold` instance variable (option) in the `Crystall class`. It is the atom-to-plane signed distance threshold used under the `eps` name in `utils.truncateAbovePlanes` (default: 1e-3)
|
|
776
|
+
|
|
777
|
+
## 20240526
|
|
778
|
+
### added
|
|
779
|
+
- **new `makeWire()` function in the `Crystal` class of `CrystalNP.py`** (called by `makeNP()`). This is a first version that must be *thoroughly tested* and *optimized*. It builds a facetted nanowire along a given direction. Only one facet must be defined, as well as a rotation factor to automatically calculate the other facets. Associated keywords:
|
|
780
|
+
- `direction` is the growth direction of the wire (default=[0,0,1])
|
|
781
|
+
- `refPlane` is the reference facet (default=[1,0,0])
|
|
782
|
+
- `nRot`
|
|
783
|
+
- `pbc` (default = False). Specifies whether periodic boundary conditions mut be considered or not.
|
|
784
|
+
- if `pbc` is False, a finite-size wire is generated by truncating its extremities by planes normal to its main axis, and its length = size[1]
|
|
785
|
+
- an infinite wire is generated otherwise
|
|
786
|
+
- new `planeRotation()` function in `utils.py`: returns an array with planes obtained by an nth-order rotation of a reference plane around an input axis
|
|
787
|
+
|
|
788
|
+
<span style="color:red">!! **pbc** only works if all atoms lie along the growth, main axis, pass through a unique plane of the unitcell 😕 (part of the nanowire is not generated) !!</span>
|
|
789
|
+
|
|
790
|
+
### changed
|
|
791
|
+
- `makeSuperCell` section, supercell calculation defined for wires (extra space is added if length > width)
|
|
792
|
+
|
|
793
|
+
## 20240524
|
|
794
|
+
### added
|
|
795
|
+
- new functions in `utils.py`, that will be useful as basic tools for the automatic generation of wires: `returnPlaneParallel2Line()`, `AngleBetweenVV()`, `isPlaneParrallel2Line()`, `isPlaneOrthogonal2Line()`, `areDirectionsOrthogonal()`, `areDirectionsParallel()`
|
|
796
|
+
|
|
797
|
+
## 20240523
|
|
798
|
+
### added
|
|
799
|
+
- basic tests on the orthogonality between vectors and planes ([*sandbox notebook*](./SandBox-doNotDelete-dev.ipynb), section *Planes parallel to a line*)
|
|
800
|
+
|
|
801
|
+
## 20240522
|
|
802
|
+
### changed
|
|
803
|
+
- *Change of basis* section in the [*sandbox notebook*](./SandBox-doNotDelete-dev.ipynb): `lattice_cart()` validated in the hcp case
|
|
804
|
+
|
|
805
|
+
### fixed
|
|
806
|
+
- `lattice_cart()` function in `utils.py`: now does the right projection (`vectors@Vuc` instead of `Vuc@vectors`, ahah)
|
|
807
|
+
|
|
808
|
+
## 20240521
|
|
809
|
+
### added
|
|
810
|
+
- `lattice_cart()` function in `utils.py`: project vectors from/to the Bravais axis system to/from the cartesian coordinate system. The unitcell definition is given under the form of an ase `Atoms` object with periodic boundary conditions (see basic example in the [*sandbox notebook*](./SandBox-doNotDelete-dev.ipynb), *Change of basis* section)
|
|
811
|
+
|
|
812
|
+
### changed
|
|
813
|
+
- `Crystal` class of `CrystalNP.py` module: cif and cifname variables are now variables of the instance created by this class (i.e. `self.cif` and `self.cifname`). Was necessary to directly address some `Crystal` functions, without using the `makeNP(self)` "macro"
|
|
814
|
+
|
|
815
|
+
## 20240520
|
|
816
|
+
### added
|
|
817
|
+
- pentagonal bipyramids, Ino and Marks decahedra added on the introductory figure - with the help of the corresponding code of the main notebook
|
|
818
|
+
- class names added in the introductory figure
|
|
819
|
+
- new `data.py` module, with the `pNMBdata` class, that contains the list of clusters defined in pNMB (so far)
|
|
820
|
+
- `magicNumbers` function in `utils.py`,as well as new Magic Numbers section in the `pyNanoMatBuilder` notebook
|
|
821
|
+
|
|
822
|
+
### changed
|
|
823
|
+
- `prop` function in the `epbpyM` class
|
|
824
|
+
|
|
825
|
+
### fixed
|
|
826
|
+
- `magicEdgeNumberOfOh2MakeATrOh` in `fccTrOh` class of `archimedeanNPs` module now starts at 3 (previously 9. Oups)
|
|
827
|
+
- magic numbers of the `fccdrDD` class were wrong (formula was that of `bccrDD`)
|
|
828
|
+
|
|
829
|
+
## 20240516-19
|
|
830
|
+
### added
|
|
831
|
+
- strategy for **pentagonal bipyramids, Ino decahedra and Marks decahedra** implemented in the `epbpyM` class (elongated - aka Ino - pentagonal bipyramid and Marks decahedra) of `johnsonNPs.py`
|
|
832
|
+
- docstring of `utils.truncateAbovePlanes`
|
|
833
|
+
|
|
834
|
+
## 20240515
|
|
835
|
+
### added
|
|
836
|
+
- `utils.truncateAbovePlanes`: intends to be a generalization of `utils.truncateAboveEachPlane` (see also the *Decahedron, Ino & Marks decahedra* section in [`SandBox-doNotDelete-dev.ipynb`](./SandBox-doNotDelete-dev.ipynb)). Returns an array of booleans that tells which atoms fulfill the input conditions (above/below each/all input plane(s))
|
|
837
|
+
- `deleteElementsOfAList`: delete all items of a list (or array) specified by a list (or array) of booleans (returns a list)
|
|
838
|
+
|
|
839
|
+
## 20240514 (NRR)
|
|
840
|
+
### added
|
|
841
|
+
- function to compute I(q) from a xyz file. Needs to be optimized (cython?) and implemented in the library
|
|
842
|
+
### deleted
|
|
843
|
+
- doublons
|
|
844
|
+
- obsolete functions
|
|
845
|
+
|
|
846
|
+
## 20240512
|
|
847
|
+
### added
|
|
848
|
+
- strategy for pentagonal bipyramids, Ino decahedra and Marks decahedra evaluated in [`SandBox-doNotDelete-dev.ipynb`](./SandBox-doNotDelete-dev.ipynb)
|
|
849
|
+
- truncated cube sub-section in the Archimidean solids section of `pyNanoMatBuilder.ipynb` and in `archimedeanNPs.py`. <span style='color:red'>Development in progress (magic numbers inconsitent with those of Kaatz2019)</span>
|
|
850
|
+
|
|
851
|
+
### changed
|
|
852
|
+
- trigonal bipyramid class (`fcctbp`) and pentagonal bipyramid code in `pyNanoMatBuilder.ipynb` moved to newly created `johnsonNPs.py`
|
|
853
|
+
|
|
854
|
+
## 20240510
|
|
855
|
+
### added
|
|
856
|
+
- new **fcc truncated octahedron, aka `fccTrOh` class in `archimedeanNPs` module** & added in the introductory figure
|
|
857
|
+
- pentagonal bipyramid <span style='color:red'>under development</span> in the main notebook
|
|
858
|
+
|
|
859
|
+
## 20240509
|
|
860
|
+
### added
|
|
861
|
+
- trigonal platelet added on the introductory figure - with the help of the corresponding code of the main notebook
|
|
862
|
+
|
|
863
|
+
### changed
|
|
864
|
+
- `calculateTruncationPlanesFromVertices`, developed for truncated tetrahedra (under the name `calculateTruncationPlanes`) has been moved to `utils.py`. And from now on the *relative* position of the trucation plane is given as a parameter, `cutFromVertexAt` (for example, `cutFromVertexAt=1/3` -> remove atoms that lie above the plane defined by (edge length)/3 from the vertices)
|
|
865
|
+
|
|
866
|
+
## 20240508
|
|
867
|
+
### added
|
|
868
|
+
- new `timer` class in utils.py, now used in `utils.MolSym()` and `utils.optimizeEMT()` functions, in the `coords()` functions of each class as well as in the `makeNP()` function of the `crystalNP` module
|
|
869
|
+
- docstring of `utils.truncateAboveEachPlane`
|
|
870
|
+
- new **fcc trigonal platelet, aka `fcctpt` class in `otherNPs` module**
|
|
871
|
+
|
|
872
|
+
### changed
|
|
873
|
+
- `utils.truncateAboveEachPlane`:
|
|
874
|
+
- the `fractionOfEdgeDeleted` and `numberOfAtomsPerEdge` input variables were just given for printing purposes. Removed and now the message must be printed before calling `truncateAboveEachPlane`, if needed (this is for example the case in the `fcctrtd` class)
|
|
875
|
+
- `AtomsAbovePlanes` variable renamed `delAtoms`
|
|
876
|
+
- input simplified to a truncation plane and to the input coordinates (all other parameters were specific to the truncated tetrahedron. Now externalized in the `fcctrtd` class, using the new `calculateTruncationPlanes` function)
|
|
877
|
+
|
|
878
|
+
### fixed
|
|
879
|
+
- `regfccTd` class of the `platonicNPs` module: wrong `interLayerDistance`. It revealed some issues. Now edge length of the reference Td = 1 (instead of 2sqrt(2), and all changes have been made accordingly (mainly coord vertices = f(c = 1/(2*np.sqrt(2))) and scale = `self.radiusCircumscribedSphere()`)
|
|
880
|
+
- `fccTrTd` class of the `archimedeanNPs` module: `nAtomsAnalytic(self)` was calculated as a function of the number of edge atoms of the initial tetrahedron instead of the number of edge atoms of the resulting truncated Td
|
|
881
|
+
- `fcctbp` class of the `otherNPs` module: `heightOfBiPyramid` was wrong
|
|
882
|
+
|
|
883
|
+
## 20240507
|
|
884
|
+
### added
|
|
885
|
+
- new rotation tools in `utils.py`
|
|
886
|
+
- `Rx(a)`, `Ry(a)`, `Rz(a)` return rotation matrices around x, y and z
|
|
887
|
+
- `EulerRotationMatrix()` returns a 3x3 Euler matrix (order of x/y/z rotations can be specified)
|
|
888
|
+
- `RotationMatrixFromAxisAngle()` returns an [axis-angle rotation matrix](https://en.wikipedia.org/wiki/Rotation_matrix#Rotation_matrix_from_axis_and_angle)
|
|
889
|
+
|
|
890
|
+
## 202404 - 202405
|
|
891
|
+
**Basic architecure of `pyNanoMatBuilder`, overall strategy defined (vertices, edges and planes for basic polyhedra), and first "easy" polyhedra implemented**
|
|
892
|
+
|
|
893
|
+
<a id="firststeps"></a>
|