yu-mcal 0.1.5__tar.gz → 0.1.6__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 (71) hide show
  1. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/PKG-INFO +1 -1
  2. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/mcal/mcal.html +1 -1
  3. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/mcal/utils/cif_reader.html +43 -4
  4. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/mcal.utils.html +1 -1
  5. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/pyproject.toml +1 -1
  6. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/mcal.py +1 -1
  7. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/utils/cif_reader.py +43 -4
  8. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/uv.lock +1 -1
  9. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/.gitignore +0 -0
  10. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/.python-version +0 -0
  11. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/LICENSE +0 -0
  12. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/README.md +0 -0
  13. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/README_ja.md +0 -0
  14. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/.nojekyll +0 -0
  15. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/index.html +0 -0
  16. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/mcal/calculations/hopping_mobility_model.html +0 -0
  17. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/mcal/calculations/rcal.html +0 -0
  18. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/mcal/utils/gaus_log_reader.html +0 -0
  19. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_modules/mcal/utils/gjf_maker.html +0 -0
  20. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_sources/index.rst.txt +0 -0
  21. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_sources/mcal.calculations.rst.txt +0 -0
  22. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_sources/mcal.rst.txt +0 -0
  23. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_sources/mcal.utils.rst.txt +0 -0
  24. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_sources/modules.rst.txt +0 -0
  25. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/autodoc_pydantic.css +0 -0
  26. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/basic.css +0 -0
  27. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/debug.css +0 -0
  28. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/doctools.js +0 -0
  29. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/documentation_options.js +0 -0
  30. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/file.png +0 -0
  31. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/language_data.js +0 -0
  32. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/minus.png +0 -0
  33. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/plus.png +0 -0
  34. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/pygments.css +0 -0
  35. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/scripts/furo-extensions.js +0 -0
  36. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/scripts/furo.js +0 -0
  37. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/scripts/furo.js.LICENSE.txt +0 -0
  38. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/scripts/furo.js.map +0 -0
  39. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/searchtools.js +0 -0
  40. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/skeleton.css +0 -0
  41. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/sphinx_highlight.js +0 -0
  42. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/styles/furo-extensions.css +0 -0
  43. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/styles/furo-extensions.css.map +0 -0
  44. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/styles/furo.css +0 -0
  45. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/_static/styles/furo.css.map +0 -0
  46. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/genindex.html +0 -0
  47. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/index.html +0 -0
  48. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/mcal.calculations.html +0 -0
  49. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/mcal.html +0 -0
  50. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/modules.html +0 -0
  51. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/objects.inv +0 -0
  52. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/py-modindex.html +0 -0
  53. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/search.html +0 -0
  54. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs/searchindex.js +0 -0
  55. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/Makefile +0 -0
  56. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/make.bat +0 -0
  57. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/source/conf.py +0 -0
  58. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/source/index.rst +0 -0
  59. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/source/mcal.calculations.rst +0 -0
  60. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/source/mcal.rst +0 -0
  61. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/source/mcal.utils.rst +0 -0
  62. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/docs-src/source/modules.rst +0 -0
  63. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/requirements.txt +0 -0
  64. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/__init__.py +0 -0
  65. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/calculations/__init__.py +0 -0
  66. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/calculations/hopping_mobility_model.py +0 -0
  67. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/calculations/rcal.py +0 -0
  68. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/constants/element_properties.csv +0 -0
  69. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/utils/__init__.py +0 -0
  70. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/utils/gaus_log_reader.py +0 -0
  71. {yu_mcal-0.1.5 → yu_mcal-0.1.6}/src/mcal/utils/gjf_maker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: yu-mcal
3
- Version: 0.1.5
3
+ Version: 0.1.6
4
4
  Summary: Program for the calculation of mobility tensor for organic semiconductor crystals
5
5
  Author: Koki Ozawa
6
6
  Author-email: Hiroyuki Matsui <h-matsui@yz.yamagata-u.ac.jp>
@@ -377,7 +377,7 @@
377
377
  <span class="n">cif_path_without_ext</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">directory</span><span class="si">}</span><span class="s1">/</span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="s1">&#39;</span>
378
378
 
379
379
  <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;----------------------------------------&#39;</span><span class="p">)</span>
380
- <span class="nb">print</span><span class="p">(</span><span class="s1">&#39; mcal 0.1.5 (2026/01/28) by Matsui Lab. &#39;</span><span class="p">)</span>
380
+ <span class="nb">print</span><span class="p">(</span><span class="s1">&#39; mcal 0.1.6 (2026/01/29) by Matsui Lab. &#39;</span><span class="p">)</span>
381
381
  <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;----------------------------------------&#39;</span><span class="p">)</span>
382
382
 
383
383
  <span class="k">if</span> <span class="n">args</span><span class="o">.</span><span class="n">read_pickle</span><span class="p">:</span>
@@ -233,13 +233,14 @@
233
233
  </div>
234
234
  <article role="main" id="furo-main-content">
235
235
  <h1>Source code for mcal.utils.cif_reader</h1><div class="highlight"><pre>
236
- <span></span><span class="sd">&quot;&quot;&quot;CifReader beta (2026/01/28)&quot;&quot;&quot;</span>
236
+ <span></span><span class="sd">&quot;&quot;&quot;CifReader beta (2026/01/29)&quot;&quot;&quot;</span>
237
237
  <span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
238
238
  <span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
239
+ <span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
240
+ <span class="kn">from</span><span class="w"> </span><span class="nn">collections</span><span class="w"> </span><span class="kn">import</span> <span class="n">deque</span>
239
241
  <span class="kn">from</span><span class="w"> </span><span class="nn">itertools</span><span class="w"> </span><span class="kn">import</span> <span class="n">product</span>
240
242
  <span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
241
243
  <span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Literal</span><span class="p">,</span> <span class="n">Tuple</span>
242
- <span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
243
244
 
244
245
  <span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
245
246
  <span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span>
@@ -304,6 +305,8 @@
304
305
  <span class="bp">self</span><span class="o">.</span><span class="n">_make_adjacency_mat</span><span class="p">()</span>
305
306
  <span class="bp">self</span><span class="o">.</span><span class="n">_split_mols</span><span class="p">()</span>
306
307
  <span class="bp">self</span><span class="o">.</span><span class="n">_put_unit_cell</span><span class="p">()</span>
308
+ <span class="bp">self</span><span class="o">.</span><span class="n">_unwrap_molecules</span><span class="p">()</span>
309
+ <span class="bp">self</span><span class="o">.</span><span class="n">_put_unit_cell</span><span class="p">()</span>
307
310
  <span class="c1"># Remove duplicates again as they may occur when moving atoms into the unit cell</span>
308
311
  <span class="bp">self</span><span class="o">.</span><span class="n">sym_symbols</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove_duplicates</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sym_symbols</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">)</span>
309
312
  <span class="bp">self</span><span class="o">.</span><span class="n">_make_adjacency_mat</span><span class="p">()</span>
@@ -315,6 +318,14 @@
315
318
  <span class="sa">f</span><span class="s1">&#39;Z value is not match. Z value in cif file is </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_ref_z_value</span><span class="si">}</span><span class="s1">, but calculated Z value is </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">z_value</span><span class="si">}</span><span class="s1">.&#39;</span>
316
319
  <span class="p">)</span>
317
320
 
321
+ <span class="k">def</span><span class="w"> </span><span class="nf">_apply_minimum_image</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
322
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Apply minimum image convention.&quot;&quot;&quot;</span>
323
+ <span class="n">frac_diff</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">,</span> <span class="p">:]</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:]</span>
324
+ <span class="n">frac_diff</span> <span class="o">=</span> <span class="n">frac_diff</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">frac_diff</span><span class="p">)</span>
325
+ <span class="n">cart_diff</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">frac_diff</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lattice</span><span class="p">)</span>
326
+ <span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="n">cart_diff</span><span class="p">,</span> <span class="n">axis</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
327
+ <span class="k">return</span> <span class="n">distance</span>
328
+
318
329
  <span class="k">def</span><span class="w"> </span><span class="nf">_calc_lattice</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
319
330
  <span class="w"> </span><span class="sd">&quot;&quot;&quot;Calculate lattice.&quot;&quot;&quot;</span>
320
331
  <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">cell_lengths</span>
@@ -368,7 +379,7 @@
368
379
  <span class="n">num_atoms</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sym_symbols</span><span class="p">)</span>
369
380
  <span class="bp">self</span><span class="o">.</span><span class="n">adjacency_mat</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">num_atoms</span><span class="p">,</span> <span class="n">num_atoms</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">bool</span><span class="p">)</span>
370
381
 
371
- <span class="bp">self</span><span class="o">.</span><span class="n">cart_coords</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lattice</span><span class="p">)</span>
382
+ <span class="n">distance</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_apply_minimum_image</span><span class="p">()</span>
372
383
 
373
384
  <span class="k">try</span><span class="p">:</span>
374
385
  <span class="n">covalent_distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">COVALENT_RADII</span><span class="p">[</span><span class="n">symbol</span><span class="p">]</span> <span class="k">for</span> <span class="n">symbol</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_symbols</span><span class="p">])</span> \
@@ -376,7 +387,6 @@
376
387
  <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
377
388
  <span class="k">raise</span> <span class="n">ElementPropertiesIsNotDefinedError</span><span class="p">(</span><span class="s1">&#39;Element properties is not defined.&#39;</span><span class="p">)</span>
378
389
 
379
- <span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">norm</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cart_coords</span><span class="p">[:,</span> <span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">,</span> <span class="p">:]</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">cart_coords</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">newaxis</span><span class="p">,</span> <span class="p">:,</span> <span class="p">:],</span> <span class="n">axis</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
380
390
  <span class="bp">self</span><span class="o">.</span><span class="n">adjacency_mat</span><span class="p">[(</span><span class="n">distance</span> <span class="o">&lt;=</span> <span class="n">covalent_distance</span> <span class="o">*</span> <span class="mf">1.3</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">distance</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)]</span> <span class="o">=</span> <span class="mi">1</span>
381
391
 
382
392
  <span class="k">def</span><span class="w"> </span><span class="nf">_operate_sym</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
@@ -599,6 +609,35 @@
599
609
  <span class="n">sub_matrix</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">adjacency_mat</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">ix_</span><span class="p">(</span><span class="n">index_group</span><span class="p">,</span> <span class="n">index_group</span><span class="p">)]</span>
600
610
  <span class="bp">self</span><span class="o">.</span><span class="n">sub_matrices</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sub_matrix</span><span class="p">)</span>
601
611
 
612
+ <span class="k">def</span><span class="w"> </span><span class="nf">_unwrap_molecules</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
613
+ <span class="w"> </span><span class="sd">&quot;&quot;&quot;Unwrap molecules using the adjacency matrix based on the minimum image convention.&quot;&quot;&quot;</span>
614
+ <span class="k">for</span> <span class="n">atom_group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">bonded_atoms</span><span class="p">:</span>
615
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">atom_group</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
616
+ <span class="k">continue</span>
617
+
618
+ <span class="n">criterion_idx</span> <span class="o">=</span> <span class="n">atom_group</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
619
+
620
+ <span class="c1"># Depth-first search</span>
621
+ <span class="n">visited</span> <span class="o">=</span> <span class="p">{</span><span class="n">criterion_idx</span><span class="p">}</span>
622
+ <span class="n">stack</span> <span class="o">=</span> <span class="n">deque</span><span class="p">([</span><span class="n">criterion_idx</span><span class="p">])</span>
623
+
624
+ <span class="k">while</span> <span class="n">stack</span><span class="p">:</span>
625
+ <span class="n">current_idx</span> <span class="o">=</span> <span class="n">stack</span><span class="o">.</span><span class="n">popleft</span><span class="p">()</span>
626
+ <span class="n">current_coord</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">[</span><span class="n">current_idx</span><span class="p">]</span>
627
+
628
+ <span class="k">for</span> <span class="n">neighbor_idx</span> <span class="ow">in</span> <span class="n">atom_group</span><span class="p">:</span>
629
+ <span class="k">if</span> <span class="n">neighbor_idx</span> <span class="ow">in</span> <span class="n">visited</span><span class="p">:</span>
630
+ <span class="k">continue</span>
631
+
632
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">adjacency_mat</span><span class="p">[</span><span class="n">current_idx</span><span class="p">,</span> <span class="n">neighbor_idx</span><span class="p">]:</span>
633
+ <span class="c1"># Minimum image convention</span>
634
+ <span class="n">frac_diff</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">[</span><span class="n">neighbor_idx</span><span class="p">]</span> <span class="o">-</span> <span class="n">current_coord</span>
635
+ <span class="n">frac_diff</span> <span class="o">=</span> <span class="n">frac_diff</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">round</span><span class="p">(</span><span class="n">frac_diff</span><span class="p">)</span>
636
+ <span class="bp">self</span><span class="o">.</span><span class="n">sym_coords</span><span class="p">[</span><span class="n">neighbor_idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_coord</span> <span class="o">+</span> <span class="n">frac_diff</span>
637
+
638
+ <span class="n">visited</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">neighbor_idx</span><span class="p">)</span>
639
+ <span class="n">stack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">neighbor_idx</span><span class="p">)</span>
640
+
602
641
  <div class="viewcode-block" id="CifReader.calc_cen_of_weight">
603
642
  <a class="viewcode-back" href="../../../mcal.utils.html#mcal.utils.cif_reader.CifReader.calc_cen_of_weight">[docs]</a>
604
643
  <span class="k">def</span><span class="w"> </span><span class="nf">calc_cen_of_weight</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">coordinates</span><span class="p">:</span> <span class="n">NDArray</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">NDArray</span><span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">]:</span>
@@ -246,7 +246,7 @@
246
246
  </section>
247
247
  <section id="module-mcal.utils.cif_reader">
248
248
  <span id="mcal-utils-cif-reader-module"></span><h2>mcal.utils.cif_reader module<a class="headerlink" href="#module-mcal.utils.cif_reader" title="Link to this heading">¶</a></h2>
249
- <p>CifReader beta (2026/01/28)</p>
249
+ <p>CifReader beta (2026/01/29)</p>
250
250
  <dl class="py class">
251
251
  <dt class="sig sig-object py" id="mcal.utils.cif_reader.CifReader">
252
252
  <em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">mcal.utils.cif_reader.</span></span><span class="sig-name descname"><span class="pre">CifReader</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">cif_path</span></span><span class="p"><span class="pre">:</span></span><span class="w"> </span><span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="_modules/mcal/utils/cif_reader.html#CifReader"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#mcal.utils.cif_reader.CifReader" title="Link to this definition">¶</a></dt>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "yu-mcal"
3
- version = "0.1.5"
3
+ version = "0.1.6"
4
4
  description = "Program for the calculation of mobility tensor for organic semiconductor crystals"
5
5
  requires-python = ">=3.9"
6
6
  dependencies = [
@@ -140,7 +140,7 @@ def main():
140
140
  cif_path_without_ext = f'{directory}/{filename}'
141
141
 
142
142
  print('----------------------------------------')
143
- print(' mcal 0.1.5 (2026/01/28) by Matsui Lab. ')
143
+ print(' mcal 0.1.6 (2026/01/29) by Matsui Lab. ')
144
144
  print('----------------------------------------')
145
145
 
146
146
  if args.read_pickle:
@@ -1,10 +1,11 @@
1
- """CifReader beta (2026/01/28)"""
1
+ """CifReader beta (2026/01/29)"""
2
2
  import os
3
3
  import re
4
+ import warnings
5
+ from collections import deque
4
6
  from itertools import product
5
7
  from pathlib import Path
6
8
  from typing import Dict, List, Literal, Tuple
7
- import warnings
8
9
 
9
10
  import numpy as np
10
11
  import pandas as pd
@@ -67,6 +68,8 @@ class CifReader:
67
68
  self._make_adjacency_mat()
68
69
  self._split_mols()
69
70
  self._put_unit_cell()
71
+ self._unwrap_molecules()
72
+ self._put_unit_cell()
70
73
  # Remove duplicates again as they may occur when moving atoms into the unit cell
71
74
  self.sym_symbols, self.sym_coords = self.remove_duplicates(self.sym_symbols, self.sym_coords)
72
75
  self._make_adjacency_mat()
@@ -78,6 +81,14 @@ class CifReader:
78
81
  f'Z value is not match. Z value in cif file is {self._ref_z_value}, but calculated Z value is {self.z_value}.'
79
82
  )
80
83
 
84
+ def _apply_minimum_image(self):
85
+ """Apply minimum image convention."""
86
+ frac_diff = self.sym_coords[:, np.newaxis, :] - self.sym_coords[np.newaxis, :, :]
87
+ frac_diff = frac_diff - np.round(frac_diff)
88
+ cart_diff = np.dot(frac_diff, self.lattice)
89
+ distance = np.linalg.norm(cart_diff, axis=-1)
90
+ return distance
91
+
81
92
  def _calc_lattice(self):
82
93
  """Calculate lattice."""
83
94
  a, b, c = self.cell_lengths
@@ -131,7 +142,7 @@ class CifReader:
131
142
  num_atoms = len(self.sym_symbols)
132
143
  self.adjacency_mat = np.zeros((num_atoms, num_atoms), dtype=bool)
133
144
 
134
- self.cart_coords = np.dot(self.sym_coords, self.lattice)
145
+ distance = self._apply_minimum_image()
135
146
 
136
147
  try:
137
148
  covalent_distance = np.array([self.COVALENT_RADII[symbol] for symbol in self.sym_symbols]) \
@@ -139,7 +150,6 @@ class CifReader:
139
150
  except KeyError:
140
151
  raise ElementPropertiesIsNotDefinedError('Element properties is not defined.')
141
152
 
142
- distance = np.linalg.norm(self.cart_coords[:, np.newaxis, :] - self.cart_coords[np.newaxis, :, :], axis=-1)
143
153
  self.adjacency_mat[(distance <= covalent_distance * 1.3) & (distance != 0)] = 1
144
154
 
145
155
  def _operate_sym(self) -> None:
@@ -362,6 +372,35 @@ class CifReader:
362
372
  sub_matrix = self.adjacency_mat[np.ix_(index_group, index_group)]
363
373
  self.sub_matrices.append(sub_matrix)
364
374
 
375
+ def _unwrap_molecules(self):
376
+ """Unwrap molecules using the adjacency matrix based on the minimum image convention."""
377
+ for atom_group in self.bonded_atoms:
378
+ if len(atom_group) <= 1:
379
+ continue
380
+
381
+ criterion_idx = atom_group[0]
382
+
383
+ # Depth-first search
384
+ visited = {criterion_idx}
385
+ stack = deque([criterion_idx])
386
+
387
+ while stack:
388
+ current_idx = stack.popleft()
389
+ current_coord = self.sym_coords[current_idx]
390
+
391
+ for neighbor_idx in atom_group:
392
+ if neighbor_idx in visited:
393
+ continue
394
+
395
+ if self.adjacency_mat[current_idx, neighbor_idx]:
396
+ # Minimum image convention
397
+ frac_diff = self.sym_coords[neighbor_idx] - current_coord
398
+ frac_diff = frac_diff - np.round(frac_diff)
399
+ self.sym_coords[neighbor_idx] = current_coord + frac_diff
400
+
401
+ visited.add(neighbor_idx)
402
+ stack.append(neighbor_idx)
403
+
365
404
  def calc_cen_of_weight(self, coordinates: NDArray[np.float64]) -> NDArray[np.float64]:
366
405
  """Calculate center of weight.
367
406
 
@@ -1244,7 +1244,7 @@ wheels = [
1244
1244
 
1245
1245
  [[package]]
1246
1246
  name = "yu-mcal"
1247
- version = "0.1.5"
1247
+ version = "0.1.6"
1248
1248
  source = { editable = "." }
1249
1249
  dependencies = [
1250
1250
  { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes