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.
Files changed (356) hide show
  1. pynanomatbuilder-0.10.3/ChangeLog.md +893 -0
  2. pynanomatbuilder-0.10.3/LICENSE +674 -0
  3. pynanomatbuilder-0.10.3/MANIFEST.in +32 -0
  4. pynanomatbuilder-0.10.3/PKG-INFO +118 -0
  5. pynanomatbuilder-0.10.3/README.md +74 -0
  6. pynanomatbuilder-0.10.3/docs/.ipynb_checkpoints/make-checkpoint.bat +35 -0
  7. pynanomatbuilder-0.10.3/docs/Makefile +20 -0
  8. pynanomatbuilder-0.10.3/docs/build/doctrees/environment.pickle +0 -0
  9. pynanomatbuilder-0.10.3/docs/build/doctrees/index.doctree +0 -0
  10. pynanomatbuilder-0.10.3/docs/build/doctrees/modules.doctree +0 -0
  11. pynanomatbuilder-0.10.3/docs/build/doctrees/theoryDocs/intro.doctree +0 -0
  12. pynanomatbuilder-0.10.3/docs/build/doctrees/theoryDocs/polydispersity.doctree +0 -0
  13. pynanomatbuilder-0.10.3/docs/build/html/.buildinfo +4 -0
  14. pynanomatbuilder-0.10.3/docs/build/html/.nojekyll +0 -0
  15. pynanomatbuilder-0.10.3/docs/build/html/CNAME +1 -0
  16. pynanomatbuilder-0.10.3/docs/build/html/_images/pyNanoMatBuilder_banner.svg +162 -0
  17. pynanomatbuilder-0.10.3/docs/build/html/_sources/index.rst.txt +32 -0
  18. pynanomatbuilder-0.10.3/docs/build/html/_sources/modules.rst.txt +117 -0
  19. pynanomatbuilder-0.10.3/docs/build/html/_sources/theoryDocs/intro.md.txt +3 -0
  20. pynanomatbuilder-0.10.3/docs/build/html/_sources/theoryDocs/polydispersity.md.txt +32 -0
  21. pynanomatbuilder-0.10.3/docs/build/html/_static/_sphinx_javascript_frameworks_compat.js +123 -0
  22. pynanomatbuilder-0.10.3/docs/build/html/_static/base-stemmer.js +476 -0
  23. pynanomatbuilder-0.10.3/docs/build/html/_static/basic.css +906 -0
  24. pynanomatbuilder-0.10.3/docs/build/html/_static/check-solid.svg +4 -0
  25. pynanomatbuilder-0.10.3/docs/build/html/_static/clipboard.min.js +7 -0
  26. pynanomatbuilder-0.10.3/docs/build/html/_static/copy-button.svg +5 -0
  27. pynanomatbuilder-0.10.3/docs/build/html/_static/copybutton.css +94 -0
  28. pynanomatbuilder-0.10.3/docs/build/html/_static/copybutton.js +248 -0
  29. pynanomatbuilder-0.10.3/docs/build/html/_static/copybutton_funcs.js +73 -0
  30. pynanomatbuilder-0.10.3/docs/build/html/_static/css/badge_only.css +1 -0
  31. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  32. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  33. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  34. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  35. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  36. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.svg +2671 -0
  37. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  38. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  39. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  40. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  41. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  42. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold.woff +0 -0
  43. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  44. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  45. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  46. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal.woff +0 -0
  47. pynanomatbuilder-0.10.3/docs/build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  48. pynanomatbuilder-0.10.3/docs/build/html/_static/css/theme.css +4 -0
  49. pynanomatbuilder-0.10.3/docs/build/html/_static/doctools.js +150 -0
  50. pynanomatbuilder-0.10.3/docs/build/html/_static/documentation_options.js +13 -0
  51. pynanomatbuilder-0.10.3/docs/build/html/_static/english-stemmer.js +1066 -0
  52. pynanomatbuilder-0.10.3/docs/build/html/_static/file.png +0 -0
  53. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  54. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  55. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  56. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  57. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  58. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  59. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  60. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  61. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  62. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  63. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  64. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  65. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  66. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  67. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  68. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  69. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  70. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  71. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  72. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  73. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  74. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  75. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  76. pynanomatbuilder-0.10.3/docs/build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  77. pynanomatbuilder-0.10.3/docs/build/html/_static/jquery.js +2 -0
  78. pynanomatbuilder-0.10.3/docs/build/html/_static/js/badge_only.js +1 -0
  79. pynanomatbuilder-0.10.3/docs/build/html/_static/js/theme.js +1 -0
  80. pynanomatbuilder-0.10.3/docs/build/html/_static/js/versions.js +228 -0
  81. pynanomatbuilder-0.10.3/docs/build/html/_static/language_data.js +13 -0
  82. pynanomatbuilder-0.10.3/docs/build/html/_static/minus.png +0 -0
  83. pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-broken-thumbnail.svg +9 -0
  84. pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-code-cells.css +259 -0
  85. pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-gallery.css +31 -0
  86. pynanomatbuilder-0.10.3/docs/build/html/_static/nbsphinx-no-thumbnail.svg +9 -0
  87. pynanomatbuilder-0.10.3/docs/build/html/_static/plus.png +0 -0
  88. pynanomatbuilder-0.10.3/docs/build/html/_static/pyNanoMatBuilder_banner.svg +162 -0
  89. pynanomatbuilder-0.10.3/docs/build/html/_static/pygments.css +75 -0
  90. pynanomatbuilder-0.10.3/docs/build/html/_static/searchtools.js +693 -0
  91. pynanomatbuilder-0.10.3/docs/build/html/_static/sphinx_highlight.js +159 -0
  92. pynanomatbuilder-0.10.3/docs/build/html/_static/visualID.css +274 -0
  93. pynanomatbuilder-0.10.3/docs/build/html/genindex.html +2498 -0
  94. pynanomatbuilder-0.10.3/docs/build/html/index.html +881 -0
  95. pynanomatbuilder-0.10.3/docs/build/html/modules.html +8512 -0
  96. pynanomatbuilder-0.10.3/docs/build/html/objects.inv +0 -0
  97. pynanomatbuilder-0.10.3/docs/build/html/py-modindex.html +915 -0
  98. pynanomatbuilder-0.10.3/docs/build/html/search.html +845 -0
  99. pynanomatbuilder-0.10.3/docs/build/html/searchindex.js +1 -0
  100. pynanomatbuilder-0.10.3/docs/build/html/theoryDocs/intro.html +834 -0
  101. pynanomatbuilder-0.10.3/docs/build/html/theoryDocs/polydispersity.html +869 -0
  102. pynanomatbuilder-0.10.3/docs/make.bat +35 -0
  103. pynanomatbuilder-0.10.3/docs/source/.ipynb_checkpoints/conf-checkpoint.py +93 -0
  104. pynanomatbuilder-0.10.3/docs/source/.ipynb_checkpoints/index-checkpoint.rst +32 -0
  105. pynanomatbuilder-0.10.3/docs/source/_static/pyNanoMatBuilder_banner.svg +162 -0
  106. pynanomatbuilder-0.10.3/docs/source/_static/visualID.css +274 -0
  107. pynanomatbuilder-0.10.3/docs/source/conf.py +104 -0
  108. pynanomatbuilder-0.10.3/docs/source/index.rst +32 -0
  109. pynanomatbuilder-0.10.3/docs/source/modules.rst +117 -0
  110. pynanomatbuilder-0.10.3/docs/source/theoryDocs/.ipynb_checkpoints/intro-checkpoint.md +2 -0
  111. pynanomatbuilder-0.10.3/docs/source/theoryDocs/.ipynb_checkpoints/polydispersity-checkpoint.md +32 -0
  112. pynanomatbuilder-0.10.3/docs/source/theoryDocs/intro.md +3 -0
  113. pynanomatbuilder-0.10.3/docs/source/theoryDocs/polydispersity.md +32 -0
  114. pynanomatbuilder-0.10.3/pyNMB-examples.ipynb +7973 -0
  115. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/TEM_creator-checkpoint.py +1361 -0
  116. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/__init__-checkpoint.py +32 -0
  117. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/archimedeanNPs-checkpoint.py +1301 -0
  118. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/catalanNPs-checkpoint.py +776 -0
  119. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/crystalNPs-checkpoint.py +1263 -0
  120. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/data-checkpoint.py +204 -0
  121. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/johnsonNPs-checkpoint.py +876 -0
  122. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/make_files_remastered-checkpoint.py +2204 -0
  123. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/otherNPs-checkpoint.py +258 -0
  124. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/platonicNPs-checkpoint.py +2250 -0
  125. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/pyNMBcore-checkpoint.py +93 -0
  126. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/utils-checkpoint.py +3573 -0
  127. pynanomatbuilder-0.10.3/pyNanoMatBuilder/.ipynb_checkpoints/visualID-checkpoint.py +196 -0
  128. pynanomatbuilder-0.10.3/pyNanoMatBuilder/README +1 -0
  129. pynanomatbuilder-0.10.3/pyNanoMatBuilder/__init__.py +32 -0
  130. pynanomatbuilder-0.10.3/pyNanoMatBuilder/archimedeanNPs.py +1225 -0
  131. pynanomatbuilder-0.10.3/pyNanoMatBuilder/catalanNPs.py +733 -0
  132. pynanomatbuilder-0.10.3/pyNanoMatBuilder/crystalNPs.py +1216 -0
  133. pynanomatbuilder-0.10.3/pyNanoMatBuilder/data.py +205 -0
  134. pynanomatbuilder-0.10.3/pyNanoMatBuilder/johnsonNPs.py +835 -0
  135. pynanomatbuilder-0.10.3/pyNanoMatBuilder/otherNPs.py +257 -0
  136. pynanomatbuilder-0.10.3/pyNanoMatBuilder/platonicNPs.py +2255 -0
  137. pynanomatbuilder-0.10.3/pyNanoMatBuilder/pyNMBcore.py +98 -0
  138. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/.ipynb_checkpoints/tools4pyPC-checkpoint.py +44 -0
  139. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/.ipynb_checkpoints/visualID-checkpoint.py +101 -0
  140. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/.ipynb_checkpoints/visualID_Eng-checkpoint.py +140 -0
  141. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/__init__.py +0 -0
  142. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/.ipynb_checkpoints/cod1000041-NaCl-checkpoint.cif +259 -0
  143. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/CsPbBr3_cubic_231023.cif +112 -0
  144. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/CsPbBr3_ortho_14608.cif +93 -0
  145. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/__init__.py +0 -0
  146. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/amorphousC/__init__.py +0 -0
  147. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/amorphousC/aC_relax_10x10.xyz.gz +0 -0
  148. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/amorphousC/aC_relax_5x5.xyz.gz +0 -0
  149. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod1000041-NaCl.cif +259 -0
  150. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod1539039-Fe_beta.cif +79 -0
  151. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod1539039-Mn_beta.cif +79 -0
  152. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod5000217-Fe_bcc.cif +168 -0
  153. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008459-Ag_fcc.cif +252 -0
  154. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008463-Au_fcc.cif +259 -0
  155. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008466-Co_fcc.cif +254 -0
  156. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008492-Co_hcp.cif +86 -0
  157. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9008513-Ru_hcp.cif +84 -0
  158. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9011068-Mn_alpha.cif +118 -0
  159. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9012884-Co_epsilon.cif +82 -0
  160. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9012957-Pt_fcc.cif +263 -0
  161. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9015662-TiO2-rutile.cif +65 -0
  162. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/cif_database/cod9015929-TiO2-anatase.cif +90 -0
  163. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/.directory +4 -0
  164. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf-120x139.base64 +1 -0
  165. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf-120x139.png +0 -0
  166. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf.base64 +8231 -0
  167. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf.png +0 -0
  168. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/BrainHalfHalf.svg +289 -0
  169. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/css/visualID.css +274 -0
  170. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/.directory +6 -0
  171. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/.ipynb_checkpoints/bccrdd-C-checkpoint.png +0 -0
  172. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD-C.png +0 -0
  173. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD.base64 +1 -0
  174. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD.png +0 -0
  175. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/InoD.xyz +310 -0
  176. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD-C.png +0 -0
  177. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD.base64 +1 -0
  178. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD.png +0 -0
  179. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/MarksD.xyz +51 -0
  180. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS-C.png +0 -0
  181. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS.png +0 -0
  182. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS.script +1 -0
  183. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/OhWS.xyz +87 -0
  184. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS-C.png +0 -0
  185. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS.png +0 -0
  186. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS.script +1 -0
  187. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/WS.xyz +607 -0
  188. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/__init__.py +0 -0
  189. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/at.xyz +3 -0
  190. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS-C.png +0 -0
  191. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS.png +0 -0
  192. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS.script +1 -0
  193. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrDDWS.xyz +67 -0
  194. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd-C.png +0 -0
  195. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd.base64 +1 -0
  196. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd.png +0 -0
  197. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrdd.xyz +16 -0
  198. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrddWS.png +0 -0
  199. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrddWS.script +1 -0
  200. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/bccrddWS.xyz +67 -0
  201. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube-C.png +0 -0
  202. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube.base64 +1 -0
  203. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube.png +0 -0
  204. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cube.xyz +11 -0
  205. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS-C.png +0 -0
  206. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS.png +0 -0
  207. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS.script +1 -0
  208. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubeWS.xyz +367 -0
  209. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo-C.png +0 -0
  210. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo.base64 +1 -0
  211. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo.png +0 -0
  212. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cubo.xyz +14 -0
  213. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS-C.png +0 -0
  214. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS.png +0 -0
  215. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS.script +1 -0
  216. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/cuboWS.xyz +311 -0
  217. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS-C.png +0 -0
  218. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS.png +0 -0
  219. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS.script +1 -0
  220. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/dicoTdWS.xyz +4749 -0
  221. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ellipsoid-C.png +0 -0
  222. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ellipsoid.base64 +1 -0
  223. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ellipsoid.png +0 -0
  224. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh-C.png +0 -0
  225. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh.base64 +1 -0
  226. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh.png +0 -0
  227. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccOh.xyz +8 -0
  228. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd-C.png +0 -0
  229. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd.base64 +1 -0
  230. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd.png +0 -0
  231. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccTd.xyz +6 -0
  232. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccdrdd.png +0 -0
  233. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccdrdd.xyz +16 -0
  234. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd-C.png +0 -0
  235. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd.base64 +1 -0
  236. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd.png +0 -0
  237. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/fccrdd.xyz +16 -0
  238. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS-C.png +0 -0
  239. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS.png +0 -0
  240. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS.script +1 -0
  241. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph1WS.xyz +410 -0
  242. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS-C.png +0 -0
  243. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS.png +0 -0
  244. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS.script +1 -0
  245. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/hcpsph2WS.xyz +344 -0
  246. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico-C.png +0 -0
  247. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico.base64 +1 -0
  248. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico.png +0 -0
  249. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ico.xyz +14 -0
  250. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy-C.png +0 -0
  251. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy.base64 +1 -0
  252. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy.png +0 -0
  253. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pbpy.xyz +9 -0
  254. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pnmbAvailableStructures.png +0 -0
  255. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/pnmbAvailableStructures.svg +1037 -0
  256. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD-C.png +0 -0
  257. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD.base64 +1 -0
  258. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD.png +0 -0
  259. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rDD.xyz +22 -0
  260. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS-C.png +0 -0
  261. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS.png +0 -0
  262. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS.script +1 -0
  263. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/rhcuboWS.xyz +333 -0
  264. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/script-facettes-345PtLight.spt +77 -0
  265. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/sphere-C.png +0 -0
  266. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/sphere.base64 +1 -0
  267. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/sphere.png +0 -0
  268. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp-C.png +0 -0
  269. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp.base64 +1 -0
  270. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp.png +0 -0
  271. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tbp.xyz +22 -0
  272. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt-C.png +0 -0
  273. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt.base64 +1 -0
  274. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt.png +0 -0
  275. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/tpt.xyz +150 -0
  276. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh-C.png +0 -0
  277. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh.base64 +1 -0
  278. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh.png +0 -0
  279. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOh.xyz +40 -0
  280. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS-C.png +0 -0
  281. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS.png +0 -0
  282. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS.script +1 -0
  283. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trOhWS.xyz +57 -0
  284. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd-C.png +0 -0
  285. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd.base64 +1 -0
  286. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd.png +0 -0
  287. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trTd.xyz +14 -0
  288. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS-C.png +0 -0
  289. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS.png +0 -0
  290. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS.script +1 -0
  291. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrDDWS.xyz +371 -0
  292. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrddWS.png +0 -0
  293. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrddWS.script +1 -0
  294. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trbccrddWS.xyz +371 -0
  295. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS-C.png +0 -0
  296. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS.png +0 -0
  297. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS.script +1 -0
  298. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/trcubeWS.xyz +359 -0
  299. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS-C.png +0 -0
  300. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS.png +0 -0
  301. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS.script +1 -0
  302. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrDDWS.xyz +61 -0
  303. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrddWS.png +0 -0
  304. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrddWS.script +1 -0
  305. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/ttrbccrddWS.xyz +61 -0
  306. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/underConstruction-C.png +0 -0
  307. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/underConstruction.png +0 -0
  308. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/figs/underConstruction.svg +259 -0
  309. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/Logo-Universite-Toulouse-n-2023.png +0 -0
  310. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/Logo-institutionnel-couleur-Uonly.svg +64 -0
  311. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/Python_logo_and_wordmark.svg.png +0 -0
  312. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/__init__.py +0 -0
  313. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/bccrdd.spt +288 -0
  314. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/bccrdd.xyz +17 -0
  315. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo-C.png +0 -0
  316. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo.png +0 -0
  317. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo2-C.png +0 -0
  318. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo2.png +0 -0
  319. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo3-C.png +0 -0
  320. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo3.png +0 -0
  321. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logoEnd.svg +94 -0
  322. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/logo_lpcno_300_dpi_notexttransparent.png +0 -0
  323. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_banner.png +0 -0
  324. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_banner.svg +162 -0
  325. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_logo.png +0 -0
  326. pynanomatbuilder-0.10.3/pyNanoMatBuilder/resources/svg/pyNanoMatBuilder_logo.svg +123 -0
  327. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/__init__-checkpoint.py +12 -0
  328. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/core-checkpoint.py +750 -0
  329. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/crystals-checkpoint.py +375 -0
  330. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/energy-checkpoint.py +215 -0
  331. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/external_pgm-checkpoint.py +156 -0
  332. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/geometry-checkpoint.py +1340 -0
  333. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/io-checkpoint.py +587 -0
  334. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/polydispersity-checkpoint.py +837 -0
  335. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/prop-checkpoint.py +864 -0
  336. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/.ipynb_checkpoints/symmetry-checkpoint.py +135 -0
  337. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/__init__.py +12 -0
  338. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/core.py +751 -0
  339. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/crystals.py +375 -0
  340. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/energy.py +215 -0
  341. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/external_pgm.py +156 -0
  342. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/geometry.py +1340 -0
  343. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/io.py +587 -0
  344. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/polydispersity.py +837 -0
  345. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/prop.py +864 -0
  346. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/symmetry.py +135 -0
  347. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/utils.py.org +3573 -0
  348. pynanomatbuilder-0.10.3/pyNanoMatBuilder/utils/utils.py.tmp +75 -0
  349. pynanomatbuilder-0.10.3/pyNanoMatBuilder/visualID.py +123 -0
  350. pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/PKG-INFO +118 -0
  351. pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/SOURCES.txt +354 -0
  352. pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/dependency_links.txt +1 -0
  353. pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/requires.txt +32 -0
  354. pynanomatbuilder-0.10.3/pyNanoMatBuilder.egg-info/top_level.txt +1 -0
  355. pynanomatbuilder-0.10.3/pyproject.toml +70 -0
  356. 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 &#128533; (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>