molcrafts-molpy 0.2.2__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 (165) hide show
  1. molcrafts_molpy-0.2.2/LICENSE +28 -0
  2. molcrafts_molpy-0.2.2/MANIFEST.in +2 -0
  3. molcrafts_molpy-0.2.2/PKG-INFO +137 -0
  4. molcrafts_molpy-0.2.2/README.md +84 -0
  5. molcrafts_molpy-0.2.2/pyproject.toml +132 -0
  6. molcrafts_molpy-0.2.2/setup.cfg +4 -0
  7. molcrafts_molpy-0.2.2/src/molcrafts_molpy.egg-info/PKG-INFO +137 -0
  8. molcrafts_molpy-0.2.2/src/molcrafts_molpy.egg-info/SOURCES.txt +163 -0
  9. molcrafts_molpy-0.2.2/src/molcrafts_molpy.egg-info/dependency_links.txt +1 -0
  10. molcrafts_molpy-0.2.2/src/molcrafts_molpy.egg-info/requires.txt +23 -0
  11. molcrafts_molpy-0.2.2/src/molcrafts_molpy.egg-info/top_level.txt +1 -0
  12. molcrafts_molpy-0.2.2/src/molpy/__init__.py +47 -0
  13. molcrafts_molpy-0.2.2/src/molpy/adapter/__init__.py +25 -0
  14. molcrafts_molpy-0.2.2/src/molpy/adapter/base.py +136 -0
  15. molcrafts_molpy-0.2.2/src/molpy/adapter/rdkit.py +609 -0
  16. molcrafts_molpy-0.2.2/src/molpy/adapter/utils.py +8 -0
  17. molcrafts_molpy-0.2.2/src/molpy/builder/__init__.py +17 -0
  18. molcrafts_molpy-0.2.2/src/molpy/builder/crystal.py +682 -0
  19. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/__init__.py +80 -0
  20. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/connectors.py +578 -0
  21. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/errors.py +65 -0
  22. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/growth_kernel.py +142 -0
  23. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/placer.py +527 -0
  24. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/polymer_builder.py +584 -0
  25. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/port_utils.py +235 -0
  26. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/sequence_generator.py +168 -0
  27. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/stochastic_generator.py +196 -0
  28. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/system.py +901 -0
  29. molcrafts_molpy-0.2.2/src/molpy/builder/polymer/types.py +170 -0
  30. molcrafts_molpy-0.2.2/src/molpy/compute/__init__.py +52 -0
  31. molcrafts_molpy-0.2.2/src/molpy/compute/base.py +96 -0
  32. molcrafts_molpy-0.2.2/src/molpy/compute/mcd.py +233 -0
  33. molcrafts_molpy-0.2.2/src/molpy/compute/pmsd.py +186 -0
  34. molcrafts_molpy-0.2.2/src/molpy/compute/rdkit.py +378 -0
  35. molcrafts_molpy-0.2.2/src/molpy/compute/result.py +62 -0
  36. molcrafts_molpy-0.2.2/src/molpy/compute/time_series.py +271 -0
  37. molcrafts_molpy-0.2.2/src/molpy/core/__init__.py +25 -0
  38. molcrafts_molpy-0.2.2/src/molpy/core/atomistic.py +861 -0
  39. molcrafts_molpy-0.2.2/src/molpy/core/box.py +931 -0
  40. molcrafts_molpy-0.2.2/src/molpy/core/cg.py +14 -0
  41. molcrafts_molpy-0.2.2/src/molpy/core/config.py +180 -0
  42. molcrafts_molpy-0.2.2/src/molpy/core/element.py +241 -0
  43. molcrafts_molpy-0.2.2/src/molpy/core/entity.py +799 -0
  44. molcrafts_molpy-0.2.2/src/molpy/core/forcefield.py +894 -0
  45. molcrafts_molpy-0.2.2/src/molpy/core/frame.py +862 -0
  46. molcrafts_molpy-0.2.2/src/molpy/core/logger.py +35 -0
  47. molcrafts_molpy-0.2.2/src/molpy/core/ops/__init__.py +0 -0
  48. molcrafts_molpy-0.2.2/src/molpy/core/ops/geometry.py +139 -0
  49. molcrafts_molpy-0.2.2/src/molpy/core/region.py +272 -0
  50. molcrafts_molpy-0.2.2/src/molpy/core/script.py +547 -0
  51. molcrafts_molpy-0.2.2/src/molpy/core/selector.py +242 -0
  52. molcrafts_molpy-0.2.2/src/molpy/core/topology.py +157 -0
  53. molcrafts_molpy-0.2.2/src/molpy/core/trajectory.py +518 -0
  54. molcrafts_molpy-0.2.2/src/molpy/core/units.py +506 -0
  55. molcrafts_molpy-0.2.2/src/molpy/core/utils.py +200 -0
  56. molcrafts_molpy-0.2.2/src/molpy/data/__init__.py +217 -0
  57. molcrafts_molpy-0.2.2/src/molpy/data/__pycache__/__init__.cpython-312.pyc +0 -0
  58. molcrafts_molpy-0.2.2/src/molpy/data/forcefield/__init__.py +49 -0
  59. molcrafts_molpy-0.2.2/src/molpy/data/forcefield/__pycache__/__init__.cpython-312.pyc +0 -0
  60. molcrafts_molpy-0.2.2/src/molpy/data/forcefield/oplsaa.xml +4061 -0
  61. molcrafts_molpy-0.2.2/src/molpy/data/forcefield/tip3p.xml +26 -0
  62. molcrafts_molpy-0.2.2/src/molpy/engine/__init__.py +36 -0
  63. molcrafts_molpy-0.2.2/src/molpy/engine/base.py +299 -0
  64. molcrafts_molpy-0.2.2/src/molpy/engine/cp2k.py +124 -0
  65. molcrafts_molpy-0.2.2/src/molpy/engine/lammps.py +118 -0
  66. molcrafts_molpy-0.2.2/src/molpy/io/__init__.py +196 -0
  67. molcrafts_molpy-0.2.2/src/molpy/io/data/__init__.py +13 -0
  68. molcrafts_molpy-0.2.2/src/molpy/io/data/ac.py +125 -0
  69. molcrafts_molpy-0.2.2/src/molpy/io/data/amber.py +104 -0
  70. molcrafts_molpy-0.2.2/src/molpy/io/data/base.py +99 -0
  71. molcrafts_molpy-0.2.2/src/molpy/io/data/gro.py +442 -0
  72. molcrafts_molpy-0.2.2/src/molpy/io/data/h5.py +504 -0
  73. molcrafts_molpy-0.2.2/src/molpy/io/data/lammps.py +1213 -0
  74. molcrafts_molpy-0.2.2/src/molpy/io/data/lammps_molecule.py +1020 -0
  75. molcrafts_molpy-0.2.2/src/molpy/io/data/mol2.py +271 -0
  76. molcrafts_molpy-0.2.2/src/molpy/io/data/pdb.py +617 -0
  77. molcrafts_molpy-0.2.2/src/molpy/io/data/top.py +426 -0
  78. molcrafts_molpy-0.2.2/src/molpy/io/data/xsf.py +269 -0
  79. molcrafts_molpy-0.2.2/src/molpy/io/data/xyz.py +110 -0
  80. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/__init__.py +18 -0
  81. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/amber.py +589 -0
  82. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/base.py +57 -0
  83. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/lammps.py +1049 -0
  84. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/moltemplate.py +649 -0
  85. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/top.py +384 -0
  86. molcrafts_molpy-0.2.2/src/molpy/io/forcefield/xml.py +916 -0
  87. molcrafts_molpy-0.2.2/src/molpy/io/log/lammps.py +72 -0
  88. molcrafts_molpy-0.2.2/src/molpy/io/readers.py +357 -0
  89. molcrafts_molpy-0.2.2/src/molpy/io/trajectory/__init__.py +21 -0
  90. molcrafts_molpy-0.2.2/src/molpy/io/trajectory/base.py +358 -0
  91. molcrafts_molpy-0.2.2/src/molpy/io/trajectory/h5.py +312 -0
  92. molcrafts_molpy-0.2.2/src/molpy/io/trajectory/lammps.py +290 -0
  93. molcrafts_molpy-0.2.2/src/molpy/io/trajectory/xyz.py +202 -0
  94. molcrafts_molpy-0.2.2/src/molpy/io/utils.py +44 -0
  95. molcrafts_molpy-0.2.2/src/molpy/io/writers.py +261 -0
  96. molcrafts_molpy-0.2.2/src/molpy/op/__init__.py +1 -0
  97. molcrafts_molpy-0.2.2/src/molpy/op/geometry.py +102 -0
  98. molcrafts_molpy-0.2.2/src/molpy/optimize/__init__.py +6 -0
  99. molcrafts_molpy-0.2.2/src/molpy/optimize/base.py +253 -0
  100. molcrafts_molpy-0.2.2/src/molpy/optimize/lbfgs.py +218 -0
  101. molcrafts_molpy-0.2.2/src/molpy/optimize/potential_wrappers.py +82 -0
  102. molcrafts_molpy-0.2.2/src/molpy/pack/__init__.py +28 -0
  103. molcrafts_molpy-0.2.2/src/molpy/pack/constraint.py +182 -0
  104. molcrafts_molpy-0.2.2/src/molpy/pack/molpack.py +79 -0
  105. molcrafts_molpy-0.2.2/src/molpy/pack/packer/__init__.py +22 -0
  106. molcrafts_molpy-0.2.2/src/molpy/pack/packer/base.py +99 -0
  107. molcrafts_molpy-0.2.2/src/molpy/pack/packer/packmol.py +630 -0
  108. molcrafts_molpy-0.2.2/src/molpy/pack/target.py +76 -0
  109. molcrafts_molpy-0.2.2/src/molpy/parser/__init__.py +2 -0
  110. molcrafts_molpy-0.2.2/src/molpy/parser/base.py +90 -0
  111. molcrafts_molpy-0.2.2/src/molpy/parser/grammar/smarts.lark +55 -0
  112. molcrafts_molpy-0.2.2/src/molpy/parser/smarts.py +693 -0
  113. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/__init__.py +171 -0
  114. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/bigsmiles_ir.py +101 -0
  115. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/bigsmiles_parser.py +850 -0
  116. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/cgsmiles_ir.py +122 -0
  117. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/cgsmiles_parser.py +441 -0
  118. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/converter.py +575 -0
  119. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/gbigsmiles_ir.py +62 -0
  120. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/gbigsmiles_parser.py +175 -0
  121. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/grammars/base.lark +52 -0
  122. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/grammars/bigsmiles.lark +133 -0
  123. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/grammars/cgsmiles.lark +65 -0
  124. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/grammars/gbigsmiles.lark +142 -0
  125. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/grammars/gbigsmiles_new.lark +385 -0
  126. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/grammars/smiles.lark +36 -0
  127. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/smiles_ir.py +94 -0
  128. molcrafts_molpy-0.2.2/src/molpy/parser/smiles/smiles_parser.py +390 -0
  129. molcrafts_molpy-0.2.2/src/molpy/potential/__init__.py +17 -0
  130. molcrafts_molpy-0.2.2/src/molpy/potential/angle/__init__.py +2 -0
  131. molcrafts_molpy-0.2.2/src/molpy/potential/angle/base.py +11 -0
  132. molcrafts_molpy-0.2.2/src/molpy/potential/angle/harmonic.py +214 -0
  133. molcrafts_molpy-0.2.2/src/molpy/potential/base.py +156 -0
  134. molcrafts_molpy-0.2.2/src/molpy/potential/bond/__init__.py +2 -0
  135. molcrafts_molpy-0.2.2/src/molpy/potential/bond/base.py +11 -0
  136. molcrafts_molpy-0.2.2/src/molpy/potential/bond/harmonic.py +151 -0
  137. molcrafts_molpy-0.2.2/src/molpy/potential/dihedral/__init__.py +5 -0
  138. molcrafts_molpy-0.2.2/src/molpy/potential/dihedral/opls.py +268 -0
  139. molcrafts_molpy-0.2.2/src/molpy/potential/pair/__init__.py +23 -0
  140. molcrafts_molpy-0.2.2/src/molpy/potential/pair/base.py +11 -0
  141. molcrafts_molpy-0.2.2/src/molpy/potential/pair/coul.py +192 -0
  142. molcrafts_molpy-0.2.2/src/molpy/potential/pair/lj.py +518 -0
  143. molcrafts_molpy-0.2.2/src/molpy/potential/pair_params.py +184 -0
  144. molcrafts_molpy-0.2.2/src/molpy/potential/utils.py +374 -0
  145. molcrafts_molpy-0.2.2/src/molpy/reacter/__init__.py +130 -0
  146. molcrafts_molpy-0.2.2/src/molpy/reacter/base.py +663 -0
  147. molcrafts_molpy-0.2.2/src/molpy/reacter/connector.py +202 -0
  148. molcrafts_molpy-0.2.2/src/molpy/reacter/selectors.py +375 -0
  149. molcrafts_molpy-0.2.2/src/molpy/reacter/template.py +629 -0
  150. molcrafts_molpy-0.2.2/src/molpy/reacter/topology_detector.py +464 -0
  151. molcrafts_molpy-0.2.2/src/molpy/reacter/transformers.py +229 -0
  152. molcrafts_molpy-0.2.2/src/molpy/reacter/utils.py +203 -0
  153. molcrafts_molpy-0.2.2/src/molpy/typifier/__init__.py +3 -0
  154. molcrafts_molpy-0.2.2/src/molpy/typifier/adapter.py +309 -0
  155. molcrafts_molpy-0.2.2/src/molpy/typifier/atomistic.py +633 -0
  156. molcrafts_molpy-0.2.2/src/molpy/typifier/dependency_analyzer.py +172 -0
  157. molcrafts_molpy-0.2.2/src/molpy/typifier/graph.py +620 -0
  158. molcrafts_molpy-0.2.2/src/molpy/typifier/layered_engine.py +225 -0
  159. molcrafts_molpy-0.2.2/src/molpy/typifier/matcher.py +323 -0
  160. molcrafts_molpy-0.2.2/src/molpy/version.py +25 -0
  161. molcrafts_molpy-0.2.2/src/molpy/wrapper/__init__.py +13 -0
  162. molcrafts_molpy-0.2.2/src/molpy/wrapper/antechamber.py +98 -0
  163. molcrafts_molpy-0.2.2/src/molpy/wrapper/base.py +260 -0
  164. molcrafts_molpy-0.2.2/src/molpy/wrapper/prepgen.py +27 -0
  165. molcrafts_molpy-0.2.2/src/molpy/wrapper/tleap.py +53 -0
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2024-2025, Roy Kid
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,2 @@
1
+ recursive-include src/molpy/parser *.lark
2
+ recursive-include src/molpy/data *
@@ -0,0 +1,137 @@
1
+ Metadata-Version: 2.4
2
+ Name: molcrafts-molpy
3
+ Version: 0.2.2
4
+ Summary: Modern Python framework for molecular simulation and analysis
5
+ Author-email: Roy Kid <lijichen365@gmail.com>
6
+ Maintainer-email: Roy Kid <lijichen365@gmail.com>
7
+ License: BSD-3-Clause
8
+ Project-URL: Homepage, https://github.com/MolCrafts/molpy
9
+ Project-URL: Documentation, https://molcrafts.github.io/molpy
10
+ Project-URL: Repository, https://github.com/MolCrafts/molpy.git
11
+ Project-URL: Issues, https://github.com/MolCrafts/molpy/issues
12
+ Project-URL: Changelog, https://molcrafts.github.io/molpy/changelog/
13
+ Keywords: molecular-simulation,computational-chemistry,molecular-dynamics,force-fields,scientific-computing
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: License :: OSI Approved :: BSD License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Topic :: Scientific/Engineering
25
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
26
+ Classifier: Topic :: Scientific/Engineering :: Physics
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Classifier: Typing :: Typed
29
+ Requires-Python: >=3.12
30
+ Description-Content-Type: text/markdown
31
+ License-File: LICENSE
32
+ Requires-Dist: numpy>=2.0
33
+ Requires-Dist: python-igraph>=1.0.0
34
+ Requires-Dist: lark>=1.3.1
35
+ Requires-Dist: h5py>=3.0.0
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest>=6.0.0; extra == "dev"
38
+ Requires-Dist: pytest-cov>=3.0.0; extra == "dev"
39
+ Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
40
+ Requires-Dist: pre-commit>=4.0.0; extra == "dev"
41
+ Provides-Extra: doc
42
+ Requires-Dist: mkdocs>=1.4.0; extra == "doc"
43
+ Requires-Dist: mkdocs-material>=9.7.0; extra == "doc"
44
+ Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "doc"
45
+ Requires-Dist: mkdocs-jupyter==0.24.7; extra == "doc"
46
+ Requires-Dist: packmol; extra == "doc"
47
+ Requires-Dist: rdkit; extra == "doc"
48
+ Requires-Dist: matplotlib; extra == "doc"
49
+ Requires-Dist: scienceplots; extra == "doc"
50
+ Provides-Extra: all
51
+ Requires-Dist: molcrafts-molpy[dev,doc]; extra == "all"
52
+ Dynamic: license-file
53
+
54
+ # 🚀 MolPy — A fast, clean, and composable toolkit for molecular modeling
55
+
56
+ [![Python](https://img.shields.io/badge/python-3.12+-blue)](https://www.python.org/downloads/)
57
+ [![License](https://img.shields.io/badge/license-BSD--3--Clause-green)](./LICENSE)
58
+ [![Docs](https://img.shields.io/badge/docs-online-blue)](https://molcrafts.github.io/molpy)
59
+ [![CI](https://github.com/MolCrafts/molpy/workflows/CI/badge.svg)](https://github.com/MolCrafts/molpy/actions)
60
+
61
+ > **⚠️ MolPy is under active development.**
62
+ > The API is evolving rapidly and may change between minor versions.
63
+
64
+ **MolPy** is a modern, strongly typed, and extensible toolkit for molecular modeling.
65
+ It provides a clean data model, flexible builders, explicit force-field typing, and lightweight analysis — a foundation designed for reproducible workflows and AI-assisted development.
66
+
67
+ ## 🚀 Installation
68
+
69
+ ```bash
70
+ pip install molcrafts-molpy
71
+ ```
72
+
73
+ For development:
74
+
75
+ ```bash
76
+ git clone https://github.com/MolCrafts/molpy.git
77
+ cd molpy
78
+ pip install -e ".[dev]"
79
+ ```
80
+
81
+ ---
82
+
83
+ ## ✨ Features
84
+
85
+ - **Unified Data Model** — `Frame` / `Block` / `Box` for molecular structures
86
+ - **Explicit Topology** — `Atom`, `Bond`, `Angle`, `Dihedral` with typed metadata
87
+ - **Force-Field Typing** — rule-based, engine-agnostic typifiers (OPLS-AA, custom SMARTS/SMIRKS)
88
+ - **Polymer Builders** — automatic polymer assembly from BigSMILES/GBigSMILES/CGSmiles
89
+ - Linear, branched, and cyclic topologies
90
+ - Polydisperse systems with Schulz-Zimm, Poisson, Uniform, Flory-Schulz distributions
91
+ - Reaction-based crosslinking and network formation
92
+ - **Chemistry Parsers** — SMILES, BigSMILES, GBigSMILES, and CGSmiles support
93
+ - **Adapter System** — seamless integration with RDKit, LAMMPS, OpenMM, Packmol
94
+ - **Reaction Framework** — explicit chemical reactions with leaving groups
95
+ - **Lightweight Analysis** — composable compute operators
96
+ - **Robust I/O** — PDB, XYZ, LAMMPS DATA, JSON-based formats
97
+ - **AI-Friendly APIs** — predictable, strongly typed, minimal magic
98
+
99
+ ---
100
+
101
+ ## 📚 Documentation
102
+
103
+ Full documentation: **[https://molcrafts.github.io/molpy](https://molcrafts.github.io/molpy)**
104
+
105
+ ---
106
+
107
+ ## 🌌 MolCrafts Ecosystem
108
+
109
+ ### **MolVis** — Interactive Molecular Visualization
110
+
111
+ WebGL-based visualization and editing.
112
+
113
+ ### **MolRS** — High-Performance Rust Backend
114
+
115
+ Typed array structures, compute kernels, and fast builders (native + WASM).
116
+
117
+ ---
118
+
119
+ ## 🤝 Contributing
120
+
121
+ ```bash
122
+ pip install -e ".[dev]"
123
+ pre-commit install
124
+ pytest -q
125
+ ```
126
+
127
+ We welcome issues and pull requests.
128
+
129
+ ---
130
+
131
+ ## 📄 License
132
+
133
+ BSD-3-Clause — see [LICENSE](LICENSE).
134
+
135
+ ---
136
+
137
+ **Built with ❤️ by MolCrafts.**
@@ -0,0 +1,84 @@
1
+ # 🚀 MolPy — A fast, clean, and composable toolkit for molecular modeling
2
+
3
+ [![Python](https://img.shields.io/badge/python-3.12+-blue)](https://www.python.org/downloads/)
4
+ [![License](https://img.shields.io/badge/license-BSD--3--Clause-green)](./LICENSE)
5
+ [![Docs](https://img.shields.io/badge/docs-online-blue)](https://molcrafts.github.io/molpy)
6
+ [![CI](https://github.com/MolCrafts/molpy/workflows/CI/badge.svg)](https://github.com/MolCrafts/molpy/actions)
7
+
8
+ > **⚠️ MolPy is under active development.**
9
+ > The API is evolving rapidly and may change between minor versions.
10
+
11
+ **MolPy** is a modern, strongly typed, and extensible toolkit for molecular modeling.
12
+ It provides a clean data model, flexible builders, explicit force-field typing, and lightweight analysis — a foundation designed for reproducible workflows and AI-assisted development.
13
+
14
+ ## 🚀 Installation
15
+
16
+ ```bash
17
+ pip install molcrafts-molpy
18
+ ```
19
+
20
+ For development:
21
+
22
+ ```bash
23
+ git clone https://github.com/MolCrafts/molpy.git
24
+ cd molpy
25
+ pip install -e ".[dev]"
26
+ ```
27
+
28
+ ---
29
+
30
+ ## ✨ Features
31
+
32
+ - **Unified Data Model** — `Frame` / `Block` / `Box` for molecular structures
33
+ - **Explicit Topology** — `Atom`, `Bond`, `Angle`, `Dihedral` with typed metadata
34
+ - **Force-Field Typing** — rule-based, engine-agnostic typifiers (OPLS-AA, custom SMARTS/SMIRKS)
35
+ - **Polymer Builders** — automatic polymer assembly from BigSMILES/GBigSMILES/CGSmiles
36
+ - Linear, branched, and cyclic topologies
37
+ - Polydisperse systems with Schulz-Zimm, Poisson, Uniform, Flory-Schulz distributions
38
+ - Reaction-based crosslinking and network formation
39
+ - **Chemistry Parsers** — SMILES, BigSMILES, GBigSMILES, and CGSmiles support
40
+ - **Adapter System** — seamless integration with RDKit, LAMMPS, OpenMM, Packmol
41
+ - **Reaction Framework** — explicit chemical reactions with leaving groups
42
+ - **Lightweight Analysis** — composable compute operators
43
+ - **Robust I/O** — PDB, XYZ, LAMMPS DATA, JSON-based formats
44
+ - **AI-Friendly APIs** — predictable, strongly typed, minimal magic
45
+
46
+ ---
47
+
48
+ ## 📚 Documentation
49
+
50
+ Full documentation: **[https://molcrafts.github.io/molpy](https://molcrafts.github.io/molpy)**
51
+
52
+ ---
53
+
54
+ ## 🌌 MolCrafts Ecosystem
55
+
56
+ ### **MolVis** — Interactive Molecular Visualization
57
+
58
+ WebGL-based visualization and editing.
59
+
60
+ ### **MolRS** — High-Performance Rust Backend
61
+
62
+ Typed array structures, compute kernels, and fast builders (native + WASM).
63
+
64
+ ---
65
+
66
+ ## 🤝 Contributing
67
+
68
+ ```bash
69
+ pip install -e ".[dev]"
70
+ pre-commit install
71
+ pytest -q
72
+ ```
73
+
74
+ We welcome issues and pull requests.
75
+
76
+ ---
77
+
78
+ ## 📄 License
79
+
80
+ BSD-3-Clause — see [LICENSE](LICENSE).
81
+
82
+ ---
83
+
84
+ **Built with ❤️ by MolCrafts.**
@@ -0,0 +1,132 @@
1
+ [project]
2
+ name = "molcrafts-molpy"
3
+ dynamic = ["version"]
4
+ description = "Modern Python framework for molecular simulation and analysis"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ license = {text = "BSD-3-Clause"}
8
+
9
+ authors = [
10
+ { name = "Roy Kid", email = "lijichen365@gmail.com" }
11
+ ]
12
+
13
+ maintainers = [
14
+ { name = "Roy Kid", email = "lijichen365@gmail.com" }
15
+ ]
16
+
17
+ keywords = [
18
+ "molecular-simulation",
19
+ "computational-chemistry",
20
+ "molecular-dynamics",
21
+ "force-fields",
22
+ "scientific-computing"
23
+ ]
24
+
25
+ classifiers = [
26
+ "Development Status :: 4 - Beta",
27
+ "Intended Audience :: Science/Research",
28
+ "Intended Audience :: Developers",
29
+ "License :: OSI Approved :: BSD License",
30
+ "Operating System :: OS Independent",
31
+ "Programming Language :: Python",
32
+ "Programming Language :: Python :: 3",
33
+ "Programming Language :: Python :: 3.12",
34
+ "Programming Language :: Python :: 3 :: Only",
35
+ "Programming Language :: Python :: Implementation :: CPython",
36
+ "Topic :: Scientific/Engineering",
37
+ "Topic :: Scientific/Engineering :: Chemistry",
38
+ "Topic :: Scientific/Engineering :: Physics",
39
+ "Topic :: Software Development :: Libraries :: Python Modules",
40
+ "Typing :: Typed",
41
+ ]
42
+
43
+ dependencies = [
44
+ "numpy>=2.0",
45
+ "python-igraph>=1.0.0",
46
+ "lark>=1.3.1",
47
+ "h5py>=3.0.0"
48
+ ]
49
+
50
+ [tool.setuptools.dynamic]
51
+ version = { attr = "molpy.version.version" }
52
+
53
+ [project.optional-dependencies]
54
+ dev = [
55
+ "pytest>=6.0.0",
56
+ "pytest-cov>=3.0.0",
57
+ "pytest-mock>=3.10.0",
58
+ "pre-commit>=4.0.0"
59
+ ]
60
+ doc = [
61
+ "mkdocs>=1.4.0",
62
+ "mkdocs-material>=9.7.0",
63
+ "mkdocstrings[python]>=0.24.0",
64
+ "mkdocs-jupyter==0.24.7",
65
+ "packmol",
66
+ "rdkit",
67
+ "matplotlib",
68
+ "scienceplots",
69
+ ]
70
+ all = [
71
+ "molcrafts-molpy[dev,doc]"
72
+ ]
73
+
74
+ [project.urls]
75
+ Homepage = "https://github.com/MolCrafts/molpy"
76
+ Documentation = "https://molcrafts.github.io/molpy"
77
+ Repository = "https://github.com/MolCrafts/molpy.git"
78
+ Issues = "https://github.com/MolCrafts/molpy/issues"
79
+ Changelog = "https://molcrafts.github.io/molpy/changelog/"
80
+
81
+ [build-system]
82
+ requires = [
83
+ "setuptools>=42",
84
+ "wheel",
85
+ "ninja",
86
+ "numpy",
87
+ ]
88
+ build-backend = "setuptools.build_meta"
89
+
90
+ [tool.setuptools]
91
+ package-dir = {"" = "src"}
92
+
93
+ [tool.setuptools.packages.find]
94
+ where = ["src"]
95
+
96
+ [tool.setuptools.package-data]
97
+ "molpy.parser" = ["grammar/*.lark"]
98
+ "molpy.parser.smiles" = ["grammars/*.lark"]
99
+ "molpy.data" = ["README.md"]
100
+ "molpy.data.forcefield" = ["*.xml"]
101
+
102
+ [tool.black]
103
+ line-length = 88
104
+ target-version = ['py312']
105
+ include = '\.pyi?$'
106
+ extend-exclude = '''
107
+ /(
108
+ # directories
109
+ \.eggs
110
+ | \.git
111
+ | \.hg
112
+ | \.mypy_cache
113
+ | \.tox
114
+ | \.venv
115
+ | build
116
+ | dist
117
+ )/
118
+ '''
119
+
120
+ [tool.isort]
121
+ profile = "black"
122
+ line_length = 88
123
+ multi_line_output = 3
124
+ include_trailing_comma = true
125
+ force_grid_wrap = 0
126
+ use_parentheses = true
127
+ ensure_newline_before_comments = true
128
+
129
+ [tool.pytest.ini_options]
130
+ markers = [
131
+ "external: tests requiring external network/resources or executables",
132
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,137 @@
1
+ Metadata-Version: 2.4
2
+ Name: molcrafts-molpy
3
+ Version: 0.2.2
4
+ Summary: Modern Python framework for molecular simulation and analysis
5
+ Author-email: Roy Kid <lijichen365@gmail.com>
6
+ Maintainer-email: Roy Kid <lijichen365@gmail.com>
7
+ License: BSD-3-Clause
8
+ Project-URL: Homepage, https://github.com/MolCrafts/molpy
9
+ Project-URL: Documentation, https://molcrafts.github.io/molpy
10
+ Project-URL: Repository, https://github.com/MolCrafts/molpy.git
11
+ Project-URL: Issues, https://github.com/MolCrafts/molpy/issues
12
+ Project-URL: Changelog, https://molcrafts.github.io/molpy/changelog/
13
+ Keywords: molecular-simulation,computational-chemistry,molecular-dynamics,force-fields,scientific-computing
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: License :: OSI Approved :: BSD License
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3 :: Only
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Topic :: Scientific/Engineering
25
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
26
+ Classifier: Topic :: Scientific/Engineering :: Physics
27
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
28
+ Classifier: Typing :: Typed
29
+ Requires-Python: >=3.12
30
+ Description-Content-Type: text/markdown
31
+ License-File: LICENSE
32
+ Requires-Dist: numpy>=2.0
33
+ Requires-Dist: python-igraph>=1.0.0
34
+ Requires-Dist: lark>=1.3.1
35
+ Requires-Dist: h5py>=3.0.0
36
+ Provides-Extra: dev
37
+ Requires-Dist: pytest>=6.0.0; extra == "dev"
38
+ Requires-Dist: pytest-cov>=3.0.0; extra == "dev"
39
+ Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
40
+ Requires-Dist: pre-commit>=4.0.0; extra == "dev"
41
+ Provides-Extra: doc
42
+ Requires-Dist: mkdocs>=1.4.0; extra == "doc"
43
+ Requires-Dist: mkdocs-material>=9.7.0; extra == "doc"
44
+ Requires-Dist: mkdocstrings[python]>=0.24.0; extra == "doc"
45
+ Requires-Dist: mkdocs-jupyter==0.24.7; extra == "doc"
46
+ Requires-Dist: packmol; extra == "doc"
47
+ Requires-Dist: rdkit; extra == "doc"
48
+ Requires-Dist: matplotlib; extra == "doc"
49
+ Requires-Dist: scienceplots; extra == "doc"
50
+ Provides-Extra: all
51
+ Requires-Dist: molcrafts-molpy[dev,doc]; extra == "all"
52
+ Dynamic: license-file
53
+
54
+ # 🚀 MolPy — A fast, clean, and composable toolkit for molecular modeling
55
+
56
+ [![Python](https://img.shields.io/badge/python-3.12+-blue)](https://www.python.org/downloads/)
57
+ [![License](https://img.shields.io/badge/license-BSD--3--Clause-green)](./LICENSE)
58
+ [![Docs](https://img.shields.io/badge/docs-online-blue)](https://molcrafts.github.io/molpy)
59
+ [![CI](https://github.com/MolCrafts/molpy/workflows/CI/badge.svg)](https://github.com/MolCrafts/molpy/actions)
60
+
61
+ > **⚠️ MolPy is under active development.**
62
+ > The API is evolving rapidly and may change between minor versions.
63
+
64
+ **MolPy** is a modern, strongly typed, and extensible toolkit for molecular modeling.
65
+ It provides a clean data model, flexible builders, explicit force-field typing, and lightweight analysis — a foundation designed for reproducible workflows and AI-assisted development.
66
+
67
+ ## 🚀 Installation
68
+
69
+ ```bash
70
+ pip install molcrafts-molpy
71
+ ```
72
+
73
+ For development:
74
+
75
+ ```bash
76
+ git clone https://github.com/MolCrafts/molpy.git
77
+ cd molpy
78
+ pip install -e ".[dev]"
79
+ ```
80
+
81
+ ---
82
+
83
+ ## ✨ Features
84
+
85
+ - **Unified Data Model** — `Frame` / `Block` / `Box` for molecular structures
86
+ - **Explicit Topology** — `Atom`, `Bond`, `Angle`, `Dihedral` with typed metadata
87
+ - **Force-Field Typing** — rule-based, engine-agnostic typifiers (OPLS-AA, custom SMARTS/SMIRKS)
88
+ - **Polymer Builders** — automatic polymer assembly from BigSMILES/GBigSMILES/CGSmiles
89
+ - Linear, branched, and cyclic topologies
90
+ - Polydisperse systems with Schulz-Zimm, Poisson, Uniform, Flory-Schulz distributions
91
+ - Reaction-based crosslinking and network formation
92
+ - **Chemistry Parsers** — SMILES, BigSMILES, GBigSMILES, and CGSmiles support
93
+ - **Adapter System** — seamless integration with RDKit, LAMMPS, OpenMM, Packmol
94
+ - **Reaction Framework** — explicit chemical reactions with leaving groups
95
+ - **Lightweight Analysis** — composable compute operators
96
+ - **Robust I/O** — PDB, XYZ, LAMMPS DATA, JSON-based formats
97
+ - **AI-Friendly APIs** — predictable, strongly typed, minimal magic
98
+
99
+ ---
100
+
101
+ ## 📚 Documentation
102
+
103
+ Full documentation: **[https://molcrafts.github.io/molpy](https://molcrafts.github.io/molpy)**
104
+
105
+ ---
106
+
107
+ ## 🌌 MolCrafts Ecosystem
108
+
109
+ ### **MolVis** — Interactive Molecular Visualization
110
+
111
+ WebGL-based visualization and editing.
112
+
113
+ ### **MolRS** — High-Performance Rust Backend
114
+
115
+ Typed array structures, compute kernels, and fast builders (native + WASM).
116
+
117
+ ---
118
+
119
+ ## 🤝 Contributing
120
+
121
+ ```bash
122
+ pip install -e ".[dev]"
123
+ pre-commit install
124
+ pytest -q
125
+ ```
126
+
127
+ We welcome issues and pull requests.
128
+
129
+ ---
130
+
131
+ ## 📄 License
132
+
133
+ BSD-3-Clause — see [LICENSE](LICENSE).
134
+
135
+ ---
136
+
137
+ **Built with ❤️ by MolCrafts.**
@@ -0,0 +1,163 @@
1
+ LICENSE
2
+ MANIFEST.in
3
+ README.md
4
+ pyproject.toml
5
+ src/molcrafts_molpy.egg-info/PKG-INFO
6
+ src/molcrafts_molpy.egg-info/SOURCES.txt
7
+ src/molcrafts_molpy.egg-info/dependency_links.txt
8
+ src/molcrafts_molpy.egg-info/requires.txt
9
+ src/molcrafts_molpy.egg-info/top_level.txt
10
+ src/molpy/__init__.py
11
+ src/molpy/version.py
12
+ src/molpy/adapter/__init__.py
13
+ src/molpy/adapter/base.py
14
+ src/molpy/adapter/rdkit.py
15
+ src/molpy/adapter/utils.py
16
+ src/molpy/builder/__init__.py
17
+ src/molpy/builder/crystal.py
18
+ src/molpy/builder/polymer/__init__.py
19
+ src/molpy/builder/polymer/connectors.py
20
+ src/molpy/builder/polymer/errors.py
21
+ src/molpy/builder/polymer/growth_kernel.py
22
+ src/molpy/builder/polymer/placer.py
23
+ src/molpy/builder/polymer/polymer_builder.py
24
+ src/molpy/builder/polymer/port_utils.py
25
+ src/molpy/builder/polymer/sequence_generator.py
26
+ src/molpy/builder/polymer/stochastic_generator.py
27
+ src/molpy/builder/polymer/system.py
28
+ src/molpy/builder/polymer/types.py
29
+ src/molpy/compute/__init__.py
30
+ src/molpy/compute/base.py
31
+ src/molpy/compute/mcd.py
32
+ src/molpy/compute/pmsd.py
33
+ src/molpy/compute/rdkit.py
34
+ src/molpy/compute/result.py
35
+ src/molpy/compute/time_series.py
36
+ src/molpy/core/__init__.py
37
+ src/molpy/core/atomistic.py
38
+ src/molpy/core/box.py
39
+ src/molpy/core/cg.py
40
+ src/molpy/core/config.py
41
+ src/molpy/core/element.py
42
+ src/molpy/core/entity.py
43
+ src/molpy/core/forcefield.py
44
+ src/molpy/core/frame.py
45
+ src/molpy/core/logger.py
46
+ src/molpy/core/region.py
47
+ src/molpy/core/script.py
48
+ src/molpy/core/selector.py
49
+ src/molpy/core/topology.py
50
+ src/molpy/core/trajectory.py
51
+ src/molpy/core/units.py
52
+ src/molpy/core/utils.py
53
+ src/molpy/core/ops/__init__.py
54
+ src/molpy/core/ops/geometry.py
55
+ src/molpy/data/__init__.py
56
+ src/molpy/data/__pycache__/__init__.cpython-312.pyc
57
+ src/molpy/data/forcefield/__init__.py
58
+ src/molpy/data/forcefield/oplsaa.xml
59
+ src/molpy/data/forcefield/tip3p.xml
60
+ src/molpy/data/forcefield/__pycache__/__init__.cpython-312.pyc
61
+ src/molpy/engine/__init__.py
62
+ src/molpy/engine/base.py
63
+ src/molpy/engine/cp2k.py
64
+ src/molpy/engine/lammps.py
65
+ src/molpy/io/__init__.py
66
+ src/molpy/io/readers.py
67
+ src/molpy/io/utils.py
68
+ src/molpy/io/writers.py
69
+ src/molpy/io/data/__init__.py
70
+ src/molpy/io/data/ac.py
71
+ src/molpy/io/data/amber.py
72
+ src/molpy/io/data/base.py
73
+ src/molpy/io/data/gro.py
74
+ src/molpy/io/data/h5.py
75
+ src/molpy/io/data/lammps.py
76
+ src/molpy/io/data/lammps_molecule.py
77
+ src/molpy/io/data/mol2.py
78
+ src/molpy/io/data/pdb.py
79
+ src/molpy/io/data/top.py
80
+ src/molpy/io/data/xsf.py
81
+ src/molpy/io/data/xyz.py
82
+ src/molpy/io/forcefield/__init__.py
83
+ src/molpy/io/forcefield/amber.py
84
+ src/molpy/io/forcefield/base.py
85
+ src/molpy/io/forcefield/lammps.py
86
+ src/molpy/io/forcefield/moltemplate.py
87
+ src/molpy/io/forcefield/top.py
88
+ src/molpy/io/forcefield/xml.py
89
+ src/molpy/io/log/lammps.py
90
+ src/molpy/io/trajectory/__init__.py
91
+ src/molpy/io/trajectory/base.py
92
+ src/molpy/io/trajectory/h5.py
93
+ src/molpy/io/trajectory/lammps.py
94
+ src/molpy/io/trajectory/xyz.py
95
+ src/molpy/op/__init__.py
96
+ src/molpy/op/geometry.py
97
+ src/molpy/optimize/__init__.py
98
+ src/molpy/optimize/base.py
99
+ src/molpy/optimize/lbfgs.py
100
+ src/molpy/optimize/potential_wrappers.py
101
+ src/molpy/pack/__init__.py
102
+ src/molpy/pack/constraint.py
103
+ src/molpy/pack/molpack.py
104
+ src/molpy/pack/target.py
105
+ src/molpy/pack/packer/__init__.py
106
+ src/molpy/pack/packer/base.py
107
+ src/molpy/pack/packer/packmol.py
108
+ src/molpy/parser/__init__.py
109
+ src/molpy/parser/base.py
110
+ src/molpy/parser/smarts.py
111
+ src/molpy/parser/grammar/smarts.lark
112
+ src/molpy/parser/smiles/__init__.py
113
+ src/molpy/parser/smiles/bigsmiles_ir.py
114
+ src/molpy/parser/smiles/bigsmiles_parser.py
115
+ src/molpy/parser/smiles/cgsmiles_ir.py
116
+ src/molpy/parser/smiles/cgsmiles_parser.py
117
+ src/molpy/parser/smiles/converter.py
118
+ src/molpy/parser/smiles/gbigsmiles_ir.py
119
+ src/molpy/parser/smiles/gbigsmiles_parser.py
120
+ src/molpy/parser/smiles/smiles_ir.py
121
+ src/molpy/parser/smiles/smiles_parser.py
122
+ src/molpy/parser/smiles/grammars/base.lark
123
+ src/molpy/parser/smiles/grammars/bigsmiles.lark
124
+ src/molpy/parser/smiles/grammars/cgsmiles.lark
125
+ src/molpy/parser/smiles/grammars/gbigsmiles.lark
126
+ src/molpy/parser/smiles/grammars/gbigsmiles_new.lark
127
+ src/molpy/parser/smiles/grammars/smiles.lark
128
+ src/molpy/potential/__init__.py
129
+ src/molpy/potential/base.py
130
+ src/molpy/potential/pair_params.py
131
+ src/molpy/potential/utils.py
132
+ src/molpy/potential/angle/__init__.py
133
+ src/molpy/potential/angle/base.py
134
+ src/molpy/potential/angle/harmonic.py
135
+ src/molpy/potential/bond/__init__.py
136
+ src/molpy/potential/bond/base.py
137
+ src/molpy/potential/bond/harmonic.py
138
+ src/molpy/potential/dihedral/__init__.py
139
+ src/molpy/potential/dihedral/opls.py
140
+ src/molpy/potential/pair/__init__.py
141
+ src/molpy/potential/pair/base.py
142
+ src/molpy/potential/pair/coul.py
143
+ src/molpy/potential/pair/lj.py
144
+ src/molpy/reacter/__init__.py
145
+ src/molpy/reacter/base.py
146
+ src/molpy/reacter/connector.py
147
+ src/molpy/reacter/selectors.py
148
+ src/molpy/reacter/template.py
149
+ src/molpy/reacter/topology_detector.py
150
+ src/molpy/reacter/transformers.py
151
+ src/molpy/reacter/utils.py
152
+ src/molpy/typifier/__init__.py
153
+ src/molpy/typifier/adapter.py
154
+ src/molpy/typifier/atomistic.py
155
+ src/molpy/typifier/dependency_analyzer.py
156
+ src/molpy/typifier/graph.py
157
+ src/molpy/typifier/layered_engine.py
158
+ src/molpy/typifier/matcher.py
159
+ src/molpy/wrapper/__init__.py
160
+ src/molpy/wrapper/antechamber.py
161
+ src/molpy/wrapper/base.py
162
+ src/molpy/wrapper/prepgen.py
163
+ src/molpy/wrapper/tleap.py