atomworks 2.2.0__tar.gz → 3.0.0__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 (227) hide show
  1. {atomworks-2.2.0 → atomworks-3.0.0}/.gitignore +5 -10
  2. {atomworks-2.2.0 → atomworks-3.0.0}/PKG-INFO +77 -46
  3. {atomworks-2.2.0 → atomworks-3.0.0}/README.md +24 -13
  4. {atomworks-2.2.0 → atomworks-3.0.0}/pyproject.toml +75 -36
  5. atomworks-3.0.0/src/atomworks/__init__.py +88 -0
  6. atomworks-3.0.0/src/atomworks/biotite_patch.py +427 -0
  7. atomworks-3.0.0/src/atomworks/common.py +426 -0
  8. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/constants.py +268 -26
  9. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/enums.py +97 -22
  10. atomworks-3.0.0/src/atomworks/experimental/__init__.py +1 -0
  11. atomworks-3.0.0/src/atomworks/experimental/protonation/__init__.py +19 -0
  12. atomworks-3.0.0/src/atomworks/experimental/protonation/_assign.py +731 -0
  13. atomworks-3.0.0/src/atomworks/experimental/protonation/_placement.py +829 -0
  14. atomworks-3.0.0/src/atomworks/experimental/protonation/_titration.py +329 -0
  15. atomworks-3.0.0/src/atomworks/experimental/protonation/dimorphite.py +32 -0
  16. atomworks-3.0.0/src/atomworks/experimental/protonation/external/__init__.py +1 -0
  17. atomworks-3.0.0/src/atomworks/experimental/protonation/external/dimorphite_dl/LICENSE +202 -0
  18. atomworks-3.0.0/src/atomworks/experimental/protonation/external/dimorphite_dl/__init__.py +12 -0
  19. atomworks-3.0.0/src/atomworks/experimental/protonation/external/dimorphite_dl/dimorphite_dl.py +393 -0
  20. atomworks-3.0.0/src/atomworks/experimental/protonation/external/dimorphite_dl/site_substructures.smarts +125 -0
  21. atomworks-3.0.0/src/atomworks/experimental/protonation/geometry.py +105 -0
  22. atomworks-3.0.0/src/atomworks/experimental/protonation/hydrogen_icoors.json +329 -0
  23. atomworks-3.0.0/src/atomworks/external/xyz2mol_tm/LICENSE +21 -0
  24. atomworks-3.0.0/src/atomworks/external/xyz2mol_tm/__init__.py +9 -0
  25. atomworks-3.0.0/src/atomworks/external/xyz2mol_tm/xyz2mol_local.py +1108 -0
  26. atomworks-3.0.0/src/atomworks/external/xyz2mol_tm/xyz2mol_tmc.py +611 -0
  27. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/__init__.py +12 -2
  28. atomworks-3.0.0/src/atomworks/io/_loaders.py +183 -0
  29. atomworks-3.0.0/src/atomworks/io/_pipeline.py +489 -0
  30. atomworks-3.0.0/src/atomworks/io/config.py +257 -0
  31. atomworks-3.0.0/src/atomworks/io/parser.py +411 -0
  32. atomworks-3.0.0/src/atomworks/io/template.py +608 -0
  33. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/tools/fasta.py +79 -5
  34. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/tools/inference.py +270 -176
  35. atomworks-3.0.0/src/atomworks/io/tools/posebusters.py +161 -0
  36. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/tools/rdkit.py +222 -50
  37. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/transforms/atom_array.py +307 -294
  38. atomworks-3.0.0/src/atomworks/io/transforms/atomize.py +230 -0
  39. atomworks-3.0.0/src/atomworks/io/transforms/categories.py +275 -0
  40. atomworks-3.0.0/src/atomworks/io/utils/altloc.py +436 -0
  41. {atomworks-2.2.0/atomworks/ml/conditions → atomworks-3.0.0/src/atomworks/io/utils}/annotator.py +156 -68
  42. atomworks-3.0.0/src/atomworks/io/utils/ase_conversions.py +160 -0
  43. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/assembly.py +47 -7
  44. atomworks-3.0.0/src/atomworks/io/utils/atom_array.py +242 -0
  45. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/atom_array_plus.py +420 -83
  46. atomworks-3.0.0/src/atomworks/io/utils/bonds.py +813 -0
  47. atomworks-3.0.0/src/atomworks/io/utils/catcif.py +85 -0
  48. atomworks-3.0.0/src/atomworks/io/utils/ccd.py +1563 -0
  49. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/chain.py +1 -1
  50. atomworks-3.0.0/src/atomworks/io/utils/chain_info.py +292 -0
  51. atomworks-3.0.0/src/atomworks/io/utils/compression.py +182 -0
  52. atomworks-3.0.0/src/atomworks/io/utils/extra_fields.py +303 -0
  53. atomworks-3.0.0/src/atomworks/io/utils/io_utils.py +1713 -0
  54. atomworks-3.0.0/src/atomworks/io/utils/link_chemistry.py +1239 -0
  55. atomworks-3.0.0/src/atomworks/io/utils/non_rcsb.py +152 -0
  56. atomworks-3.0.0/src/atomworks/io/utils/query.py +884 -0
  57. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/scatter.py +70 -4
  58. atomworks-3.0.0/src/atomworks/io/utils/selection.py +229 -0
  59. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/sequence.py +127 -0
  60. atomworks-3.0.0/src/atomworks/io/utils/standard_annotations/__init__.py +14 -0
  61. atomworks-3.0.0/src/atomworks/io/utils/standard_annotations/base.py +640 -0
  62. atomworks-3.0.0/src/atomworks/io/utils/standard_annotations/definitions.py +85 -0
  63. atomworks-3.0.0/src/atomworks/io/utils/standard_annotations/serialization.py +411 -0
  64. atomworks-3.0.0/src/atomworks/io/utils/standardize.py +185 -0
  65. atomworks-3.0.0/src/atomworks/io/utils/testing.py +624 -0
  66. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/visualize.py +12 -10
  67. atomworks-3.0.0/src/atomworks/ml/conditions/__init__.py +31 -0
  68. atomworks-3.0.0/src/atomworks/ml/conditions/base.py +200 -0
  69. atomworks-3.0.0/src/atomworks/ml/conditions/definitions.py +156 -0
  70. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/README.md +44 -8
  71. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/__init__.py +8 -4
  72. atomworks-3.0.0/src/atomworks/ml/datasets/ase_dataset.py +139 -0
  73. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/base.py +23 -41
  74. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/concat_dataset.py +11 -12
  75. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/file_dataset.py +2 -2
  76. atomworks-3.0.0/src/atomworks/ml/datasets/lmdb_dataset.py +151 -0
  77. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/loaders/__init__.py +8 -0
  78. atomworks-3.0.0/src/atomworks/ml/datasets/loaders/ase.py +171 -0
  79. atomworks-3.0.0/src/atomworks/ml/datasets/loaders/cif.py +404 -0
  80. atomworks-3.0.0/src/atomworks/ml/datasets/loaders/materials.py +110 -0
  81. atomworks-3.0.0/src/atomworks/ml/datasets/metadata.py +400 -0
  82. atomworks-3.0.0/src/atomworks/ml/datasets/pandas_dataset.py +146 -0
  83. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/parsers/base.py +8 -5
  84. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/parsers/default_metadata_row_parsers.py +10 -4
  85. atomworks-3.0.0/src/atomworks/ml/datasets/sharded_dataset.py +241 -0
  86. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/encoding_definitions.py +76 -71
  87. atomworks-3.0.0/src/atomworks/ml/example_id.py +91 -0
  88. atomworks-3.0.0/src/atomworks/ml/executables/dssp.py +63 -0
  89. atomworks-3.0.0/src/atomworks/ml/executables/hhblits.py +84 -0
  90. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/executables/mmseqs2.py +9 -7
  91. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/pipelines/af3.py +4 -2
  92. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/pipelines/rf2aa.py +2 -2
  93. atomworks-3.0.0/src/atomworks/ml/preprocessing/clustering/cluster.py +98 -0
  94. atomworks-3.0.0/src/atomworks/ml/preprocessing/clustering/config.py +37 -0
  95. atomworks-3.0.0/src/atomworks/ml/preprocessing/clustering/mmseqs2.py +86 -0
  96. atomworks-3.0.0/src/atomworks/ml/preprocessing/constants.py +132 -0
  97. atomworks-3.0.0/src/atomworks/ml/preprocessing/msa/colabfold_server.py +607 -0
  98. atomworks-3.0.0/src/atomworks/ml/preprocessing/msa/finding.py +528 -0
  99. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/preprocessing/msa/generating.py +505 -123
  100. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/preprocessing/msa/organizing.py +124 -1
  101. atomworks-3.0.0/src/atomworks/ml/preprocessing/msa/template_structures.py +94 -0
  102. atomworks-3.0.0/src/atomworks/ml/preprocessing/preprocess.py +712 -0
  103. atomworks-3.0.0/src/atomworks/ml/preprocessing/records.py +259 -0
  104. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/preprocessing/utils/fasta.py +4 -0
  105. atomworks-3.0.0/src/atomworks/ml/preprocessing/utils/large_assembly.py +138 -0
  106. atomworks-3.0.0/src/atomworks/ml/preprocessing/utils/structure_utils.py +366 -0
  107. atomworks-3.0.0/src/atomworks/ml/preprocessing/utils/token.py +56 -0
  108. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/samplers.py +122 -58
  109. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/_checks.py +0 -2
  110. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/atom_array.py +76 -12
  111. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/atomize.py +1 -74
  112. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/bonds.py +19 -43
  113. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/chirals.py +15 -4
  114. atomworks-3.0.0/src/atomworks/ml/transforms/covalent_modifications.py +66 -0
  115. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/crop.py +276 -66
  116. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/design_task.py +1 -1
  117. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/dna/pad_dna.py +18 -4
  118. atomworks-3.0.0/src/atomworks/ml/transforms/dssp.py +252 -0
  119. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/encoding.py +91 -36
  120. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/featurize_unresolved_residues.py +3 -0
  121. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/filters.py +40 -10
  122. atomworks-3.0.0/src/atomworks/ml/transforms/interactions.py +1473 -0
  123. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/mask_generator.py +5 -5
  124. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/mirror_transform.py +4 -2
  125. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/msa/_msa_loading_utils.py +156 -116
  126. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/msa/_msa_pairing_utils.py +0 -2
  127. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/msa/msa.py +168 -102
  128. atomworks-3.0.0/src/atomworks/ml/transforms/msa/msa_store.py +61 -0
  129. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/openbabel_utils.py +32 -14
  130. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/rdkit_utils.py +138 -103
  131. atomworks-3.0.0/src/atomworks/ml/transforms/realize_expandable_segments.py +60 -0
  132. atomworks-3.0.0/src/atomworks/ml/transforms/sasa.py +254 -0
  133. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/symmetry.py +245 -76
  134. atomworks-3.0.0/src/atomworks/ml/utils/__init__.py +10 -0
  135. atomworks-3.0.0/src/atomworks/ml/utils/annotator.py +168 -0
  136. atomworks-3.0.0/src/atomworks/ml/utils/antibody.py +243 -0
  137. atomworks-3.0.0/src/atomworks/ml/utils/blob_store.py +117 -0
  138. atomworks-3.0.0/src/atomworks/ml/utils/condition.py +68 -0
  139. atomworks-3.0.0/src/atomworks/ml/utils/expandable_segment.py +825 -0
  140. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/geometry.py +114 -24
  141. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/io.py +150 -27
  142. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/misc.py +19 -7
  143. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/rng.py +4 -5
  144. atomworks-3.0.0/src/atomworks/ml/utils/testing.py +243 -0
  145. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/token.py +42 -22
  146. atomworks-3.0.0/src/atomworks/ml/utils/visualize.py +396 -0
  147. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/__main__.py +2 -0
  148. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/ccd.py +0 -2
  149. atomworks-3.0.0/src/atomworks_cli/cluster.py +76 -0
  150. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/filter.py +0 -2
  151. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/find.py +3 -5
  152. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/generate.py +46 -22
  153. atomworks-3.0.0/src/atomworks_cli/msa.py +27 -0
  154. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/organize.py +2 -4
  155. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/pdb.py +0 -2
  156. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/setup.py +2 -5
  157. atomworks-2.2.0/atomworks/__init__.py +0 -47
  158. atomworks-2.2.0/atomworks/biotite_patch.py +0 -471
  159. atomworks-2.2.0/atomworks/common.py +0 -199
  160. atomworks-2.2.0/atomworks/io/parser.py +0 -865
  161. atomworks-2.2.0/atomworks/io/template.py +0 -536
  162. atomworks-2.2.0/atomworks/io/transforms/categories.py +0 -424
  163. atomworks-2.2.0/atomworks/io/utils/atom_array.py +0 -57
  164. atomworks-2.2.0/atomworks/io/utils/bonds.py +0 -1013
  165. atomworks-2.2.0/atomworks/io/utils/ccd.py +0 -690
  166. atomworks-2.2.0/atomworks/io/utils/compression.py +0 -177
  167. atomworks-2.2.0/atomworks/io/utils/io_utils.py +0 -1090
  168. atomworks-2.2.0/atomworks/io/utils/non_rcsb.py +0 -225
  169. atomworks-2.2.0/atomworks/io/utils/query.py +0 -394
  170. atomworks-2.2.0/atomworks/io/utils/selection.py +0 -667
  171. atomworks-2.2.0/atomworks/io/utils/testing.py +0 -399
  172. atomworks-2.2.0/atomworks/ml/conditions/__init__.py +0 -15
  173. atomworks-2.2.0/atomworks/ml/conditions/base.py +0 -526
  174. atomworks-2.2.0/atomworks/ml/conditions/conditions.py +0 -182
  175. atomworks-2.2.0/atomworks/ml/datasets/loaders/cif.py +0 -241
  176. atomworks-2.2.0/atomworks/ml/datasets/pandas_dataset.py +0 -307
  177. atomworks-2.2.0/atomworks/ml/example_id.py +0 -52
  178. atomworks-2.2.0/atomworks/ml/preprocessing/__init__.py +0 -6
  179. atomworks-2.2.0/atomworks/ml/preprocessing/constants.py +0 -130
  180. atomworks-2.2.0/atomworks/ml/preprocessing/get_pn_unit_data_from_structure.py +0 -470
  181. atomworks-2.2.0/atomworks/ml/preprocessing/msa/finding.py +0 -260
  182. atomworks-2.2.0/atomworks/ml/preprocessing/utils/structure_utils.py +0 -522
  183. atomworks-2.2.0/atomworks/ml/transforms/covalent_modifications.py +0 -114
  184. atomworks-2.2.0/atomworks/ml/transforms/sasa.py +0 -166
  185. atomworks-2.2.0/atomworks/ml/utils/__init__.py +0 -0
  186. atomworks-2.2.0/atomworks/ml/utils/condition.py +0 -335
  187. atomworks-2.2.0/atomworks/ml/utils/testing.py +0 -46
  188. atomworks-2.2.0/atomworks_cli/msa.py +0 -18
  189. {atomworks-2.2.0 → atomworks-3.0.0}/LICENSE.md +0 -0
  190. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/tools/chembl_transformations.smirks +0 -0
  191. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/__init__.py +0 -0
  192. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/io/utils/error.py +0 -0
  193. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/__init__.py +0 -0
  194. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/loaders/base.py +0 -0
  195. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/parsers/__init__.py +0 -0
  196. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/datasets/parsers/custom_metadata_row_parsers.py +0 -0
  197. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/executables/__init__.py +0 -0
  198. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/executables/hbplus.py +0 -0
  199. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/executables/hhfilter.py +0 -0
  200. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/executables/x3dna.py +0 -0
  201. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/pipelines/__init__.py +0 -0
  202. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/preprocessing/msa/filtering.py +0 -0
  203. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/af3_reference_molecule.py +0 -0
  204. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/atom_frames.py +0 -0
  205. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/atom_level_embeddings.py +0 -0
  206. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/base.py +0 -0
  207. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/bfactor_conditioned_transforms.py +0 -0
  208. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/cached_residue_data.py +0 -0
  209. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/center_random_augmentation.py +0 -0
  210. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/diffusion/batch_structures.py +0 -0
  211. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/diffusion/edm.py +0 -0
  212. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/feature_aggregation/af3.py +0 -0
  213. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/feature_aggregation/confidence.py +0 -0
  214. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/feature_aggregation/rf2aa.py +0 -0
  215. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/masks.py +0 -0
  216. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/msa/_msa_constants.py +0 -0
  217. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/msa/_msa_featurizing_utils.py +0 -0
  218. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/random_atomize_residues.py +0 -0
  219. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/rf2aa_assumptions.py +0 -0
  220. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/transforms/template.py +0 -0
  221. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/debug.py +0 -0
  222. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/error.py +0 -0
  223. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/nested_dict.py +0 -0
  224. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/numpy.py +0 -0
  225. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/ml/utils/timer.py +0 -0
  226. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks/py.typed +0 -0
  227. {atomworks-2.2.0 → atomworks-3.0.0/src}/atomworks_cli/common.py +0 -0
@@ -5,6 +5,7 @@ biotite
5
5
  # github pages
6
6
  docs/_build/*
7
7
  docs/auto_examples/*
8
+ docs/sg_execution_times.rst
8
9
 
9
10
 
10
11
  # Python files
@@ -109,15 +110,6 @@ celerybeat-schedule
109
110
  # SageMath parsed files
110
111
  *.sage.py
111
112
 
112
- # Environments
113
- .env
114
- .venv
115
- env/
116
- venv/
117
- ENV/
118
- env.bak/
119
- venv.bak/
120
-
121
113
  # github pages
122
114
  docs/_build/*
123
115
  docs/auto_examples/*
@@ -155,6 +147,7 @@ cython_debug/
155
147
  *.pkl
156
148
  *.parquet
157
149
  *.csv
150
+ *.ciflmdb-lock
158
151
 
159
152
  # Temporary test files
160
153
  tests/test_outputs
@@ -166,8 +159,10 @@ tinker/
166
159
 
167
160
  # Local scripts
168
161
  **/logs
162
+ .ipd/
169
163
 
170
164
  # AI
171
165
  **/.claude
172
- CLAUDE.md
173
166
  .github/workflows/claude*.yml
167
+
168
+ .devcontainer
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: atomworks
3
- Version: 2.2.0
3
+ Version: 3.0.0
4
4
  Summary: A research-oriented data toolkit for training biomolecular deep-learning foundation models
5
5
  Project-URL: homepage, https://rosettacommons.github.io/atomworks/latest/index.html
6
6
  Project-URL: repository, https://github.com/RosettaCommons/atomworks
@@ -46,64 +46,88 @@ Classifier: Programming Language :: Python :: 3
46
46
  Classifier: Programming Language :: Python :: Implementation :: CPython
47
47
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
48
48
  Requires-Python: >=3.11
49
- Requires-Dist: biotite==1.4.0
50
- Requires-Dist: cython<4,>=3.0.0
51
- Requires-Dist: cytoolz<1,>=0.12.3
52
- Requires-Dist: hydride<2,>=1.2.3
53
- Requires-Dist: numpy<3,>=1.25.0
54
- Requires-Dist: pandas<2.4,>=2.2
55
- Requires-Dist: py3dmol<3,>=2.2.1
56
- Requires-Dist: pyarrow==17.0.0
49
+ Requires-Dist: biotite==1.6.0
50
+ Requires-Dist: cython>=3.0.0
51
+ Requires-Dist: cytoolz>=0.12.3
52
+ Requires-Dist: idna>=3.15
53
+ Requires-Dist: jaxtyping>=0.2.17
54
+ Requires-Dist: numpy>=1.25.0
55
+ Requires-Dist: pandas>=2.2
56
+ Requires-Dist: pillow>=12.3.0
57
+ Requires-Dist: py3dmol>=2.2.1
58
+ Requires-Dist: pyarrow>=23.0.1
59
+ Requires-Dist: pygments>=2.20.0
57
60
  Requires-Dist: pymol-remote>=0.0.5
58
- Requires-Dist: rdkit<2025.9,>=2024.3.5
59
- Requires-Dist: scipy<2,>=1.13.1
60
- Requires-Dist: tqdm<5,>=4.65.0
61
- Requires-Dist: typer<1,>=0.12.5
62
- Requires-Dist: zstandard<1,>=0.21.0
61
+ Requires-Dist: python-dotenv>=1.2.2
62
+ Requires-Dist: rdkit>=2024.3.5
63
+ Requires-Dist: requests>=2.33.0
64
+ Requires-Dist: scipy>=1.13.1
65
+ Requires-Dist: tqdm>=4.66.3
66
+ Requires-Dist: typer>=0.12.5
67
+ Requires-Dist: urllib3>=2.8.0
68
+ Requires-Dist: zstandard>=0.21.0
63
69
  Provides-Extra: ase
64
- Requires-Dist: ase-db-backends<1,>=0.10.0; extra == 'ase'
65
- Requires-Dist: ase<4,>=3.22.0; extra == 'ase'
66
- Requires-Dist: lmdb<2,>=1.5.0; extra == 'ase'
70
+ Requires-Dist: ase-db-backends>=0.10.0; extra == 'ase'
71
+ Requires-Dist: ase>=3.22.0; extra == 'ase'
72
+ Requires-Dist: cryptography>=50.0.0; extra == 'ase'
73
+ Requires-Dist: lmdb>=1.5.0; extra == 'ase'
74
+ Provides-Extra: catcif
75
+ Requires-Dist: catcif-tools; extra == 'catcif'
67
76
  Provides-Extra: dev
77
+ Requires-Dist: fire>=0.5.0; extra == 'dev'
68
78
  Requires-Dist: ipykernel>=6.28.0; extra == 'dev'
69
- Requires-Dist: pytest-benchmark<6,>=5.0.0; extra == 'dev'
70
- Requires-Dist: pytest-cov<5,>=4.1.0; extra == 'dev'
71
- Requires-Dist: pytest-dotenv<1,>=0.5.2; extra == 'dev'
72
- Requires-Dist: pytest-testmon<3,>=2.1.1; extra == 'dev'
73
- Requires-Dist: pytest-xdist<4,>=3.6.1; extra == 'dev'
74
- Requires-Dist: pytest<9,>=8.2.0; extra == 'dev'
79
+ Requires-Dist: pytest-benchmark>=5.0.0; extra == 'dev'
80
+ Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
81
+ Requires-Dist: pytest-dotenv>=0.5.2; extra == 'dev'
82
+ Requires-Dist: pytest-testmon>=2.1.1; extra == 'dev'
83
+ Requires-Dist: pytest-xdist>=3.6.1; extra == 'dev'
84
+ Requires-Dist: pytest>=9.0.3; extra == 'dev'
75
85
  Requires-Dist: ruff==0.8.3; extra == 'dev'
86
+ Requires-Dist: tornado>=6.5.9; extra == 'dev'
76
87
  Provides-Extra: docs
77
- Requires-Dist: matplotlib<4,>=3.10.0; extra == 'docs'
78
- Requires-Dist: pydata-sphinx-theme<1,>=0.16.1; extra == 'docs'
79
- Requires-Dist: sphinx-gallery<1,>=0.19.0; extra == 'docs'
80
- Requires-Dist: sphinx<9,>=8.0.0; extra == 'docs'
88
+ Requires-Dist: matplotlib>=3.10.0; extra == 'docs'
89
+ Requires-Dist: myst-parser>=4.0.0; extra == 'docs'
90
+ Requires-Dist: pydata-sphinx-theme>=0.16.1; extra == 'docs'
91
+ Requires-Dist: sphinx-design>=0.6.0; extra == 'docs'
92
+ Requires-Dist: sphinx-gallery>=0.19.0; extra == 'docs'
93
+ Requires-Dist: sphinx>=8.0.0; extra == 'docs'
94
+ Requires-Dist: sphinxcontrib-typer<1,>=0.7.2; extra == 'docs'
81
95
  Provides-Extra: ml
82
- Requires-Dist: beartype<1,>=0.18.0; extra == 'ml'
83
- Requires-Dist: einops<1,>=0.7.0; extra == 'ml'
84
- Requires-Dist: jaxtyping<1,>=0.2.17; extra == 'ml'
85
- Requires-Dist: torch<2.8,>=2.2.0; extra == 'ml'
96
+ Requires-Dist: beartype>=0.18.0; extra == 'ml'
97
+ Requires-Dist: einops>=0.7.0; extra == 'ml'
98
+ Requires-Dist: filelock>=3.20.3; extra == 'ml'
99
+ Requires-Dist: numba>=0.60.0; extra == 'ml'
100
+ Requires-Dist: requests>=2.33.0; extra == 'ml'
101
+ Requires-Dist: torch>=2.2.0; extra == 'ml'
86
102
  Provides-Extra: openbabel
87
- Requires-Dist: openbabel-wheel==3.1.1.22; extra == 'openbabel'
103
+ Requires-Dist: openbabel-wheel>=3.1.1.22; extra == 'openbabel'
104
+ Provides-Extra: posebusters
105
+ Requires-Dist: posebusters>=0.6.0; extra == 'posebusters'
106
+ Provides-Extra: s3
107
+ Requires-Dist: boto3; extra == 's3'
88
108
  Description-Content-Type: text/markdown
89
109
 
90
110
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
111
+ [![CI](https://github.com/RosettaCommons/atomworks/actions/workflows/release_and_docs.yaml/badge.svg?branch=release%2Fatomworks-3-0)](https://github.com/RosettaCommons/atomworks/actions/workflows/release_and_docs.yaml)
91
112
  [![PyPI version](https://img.shields.io/pypi/v/atomworks.svg)](https://pypi.org/project/atomworks/)
92
113
  [![Python versions](https://img.shields.io/pypi/pyversions/atomworks.svg)](https://pypi.org/project/atomworks/)
93
114
  [![Documentation Status](https://img.shields.io/badge/docs-latest-brightgreen.svg)](https://rosettacommons.github.io/atomworks/latest/)
94
115
  [![License: BSD 3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
95
116
 
96
117
  <div align="center">
97
- <img src="docs/_static/atomworks_logo_color.svg" width="450" alt="atomworks logo">
118
+ <picture>
119
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/RosettaCommons/atomworks/release/atomworks-3-0/docs/_static/atomworks_logo_dark.svg">
120
+ <img src="https://raw.githubusercontent.com/RosettaCommons/atomworks/release/atomworks-3-0/docs/_static/atomworks_logo_color.svg" width="450" alt="AtomWorks logo">
121
+ </picture>
98
122
  </div>
99
123
 
100
124
  **atomworks** is an open-source platform that maximizes research velocity for biomolecular modeling tasks. Much like how [Torchvision](https://docs.pytorch.org/vision/stable/index.html) enables rapid prototyping within the vision domain, and [Torchaudio](https://docs.pytorch.org/audio/main/) within the audio domain, AtomWorks aims to accelerate development and experimentation within biomolecular modeling.
101
125
 
102
- > **⚠️ Notice:** We are currently finalizing some cleanup work within our repositories. Please expect the APIs (e.g., function and class names, inputs and outputs) to stabilize within the next one week. Thank you for your patience!
126
+ Upgrading to 3.0? See the [migration guide](https://github.com/RosettaCommons/atomworks/blob/release/atomworks-3-0/docs/migration/migration-short.md).
103
127
 
104
- If you're looking for the models themselves (e.g., RF3, MPNN) that integrate with AtomWorks rather than the underlying framework, check out [ModelForge](https://github.com/RosettaCommons/modelforge)
128
+ If you're looking for the models themselves (e.g., RF3, RFD3, MPNN) that integrate with AtomWorks rather than the underlying framework, check out [Foundry](https://github.com/RosettaCommons/foundry)
105
129
 
106
- > **💡 Note:** Not sure where to start? We've made some [examples in the AtomWorks documentation](https://rosettacommons.github.io/atomworks/latest/auto_examples/index.html) that work through several helpful scenarios; a full tutorial is under construction!
130
+ > **💡 Note:** Start with the [AtomWorks examples](https://rosettacommons.github.io/atomworks/latest/auto_examples/index.html) or the [model-building tutorial](https://github.com/RosettaCommons/atomworks/blob/release/atomworks-3-0/docs/how_to_build_a_model/index.rst).
107
131
 
108
132
  AtomWorks is composed of two symbiotic libraries:
109
133
 
@@ -118,7 +142,7 @@ AtomWorks is built atop [biotite](https://www.biotite-python.org/): We are grate
118
142
 
119
143
  ## atomworks.io
120
144
 
121
- > *A general-purpose Python toolkit for cleaning, standardizing, and manipulating with biomolecular structure files - built atop [biotite](https://www.biotite-python.org/):
145
+ > *A general-purpose Python toolkit for cleaning, standardizing, and manipulating biomolecular structure files, built on [Biotite](https://www.biotite-python.org/).*
122
146
 
123
147
  **atomworks.io** lets you:
124
148
 
@@ -140,7 +164,7 @@ We have found `atomworks.io` to be generally useful to a broad bioinformatics an
140
164
  - An extensible framework, integrated with `atomworks.io`, to write `Transforms` for arbitrary use cases
141
165
  - Pre-built datasets and samplers suitable for most model training scenarios
142
166
 
143
- Within the AtomWorks paradigm, the output of each `Transform` is not an opaque dictionary with model-specific tensors but instead an updated version of our atom-level structural representation (Biotite's `AtomArray`). Operations within – and between – pipelines thus maintain a common vocabulary of inputs and outputs.
167
+ Transforms consume and return dictionaries containing structural data, annotations and features. Biotite's `AtomArray` provides their shared atom-level representation.
144
168
 
145
169
  We have found that `atomworks.ml` **dramatically** reduces the overhead of starting, and completing, many ML projects; research topics that once took months now achieve signal within weeks if not days, accelerating the pace of innovation.
146
170
 
@@ -161,14 +185,14 @@ We have found that `atomworks.ml` **dramatically** reduces the overhead of start
161
185
  ---
162
186
 
163
187
  ## Installation
164
- > Note: AtomWorks requires Python >= 3.11 and [`dotenv`](https://pypi.org/project/python-dotenv/#file-format)
188
+ AtomWorks requires Python 3.11 or newer. Pip installs its dependencies automatically.
165
189
 
166
190
  ```shell
167
191
  pip install atomworks # base installation version without torch (for only atomworks.io)
168
192
  pip install "atomworks[ml]" # with torch and ML dependencies (for atomworks.io plus atomworks.ml)
169
193
  pip install "atomworks[dev]" # with development dependencies
170
194
  pip install "atomworks[openbabel]" # with [Open Babel](https://openbabel.org/) and its dependencies
171
- pip install "atomworks[ml,openbabel,dev]" # with all dependencies
195
+ pip install "atomworks[ml,openbabel,dev]" # ML, Open Babel, and development tools
172
196
  ```
173
197
  *Running multiple of these installations will just add to the installed dependencies and will not install multiple installations of atomworks.*
174
198
 
@@ -178,6 +202,12 @@ If you are using [uv](https://docs.astral.sh/uv/reference/policies/versioning/)
178
202
  uv pip install "atomworks[ml,openbabel,dev]"
179
203
  ```
180
204
 
205
+ To install the AtomWorks 3.0 release branch before it is published on PyPI:
206
+
207
+ ```shell
208
+ pip install "atomworks[ml] @ git+https://github.com/RosettaCommons/atomworks.git@release/atomworks-3-0"
209
+ ```
210
+
181
211
  For more advanced setup options (including how to run workflows via apptainers) see the [full documentation](https://rosettacommons.github.io/atomworks/latest/index.html).
182
212
 
183
213
  ---
@@ -192,10 +222,11 @@ To parse a pdb file (parse = load, clean, annotate relevant metadata such as ent
192
222
 
193
223
  ```python
194
224
 
195
- from atomworks.io.parser import parse
225
+ from atomworks.io import parse
226
+ from atomworks.io.config import ParseConfig
196
227
  from biotite.structure import AtomArrayStack
197
228
 
198
- result = parse(filename="3nez.cif.gz")
229
+ result = parse("3nez.cif.gz", config=ParseConfig.from_preset("rcsb"))
199
230
 
200
231
  asym_unit: AtomArrayStack = result["asym_unit"]
201
232
  assemblies: dict[str, AtomArrayStack] = result["assemblies"]
@@ -216,13 +247,13 @@ The output of `parse` includes:
216
247
  See [usage examples](https://rosettacommons.github.io/atomworks/latest/auto_examples/index.html) for more examples of the use of `parse()`. All of the provided examples make use of this method.
217
248
  See [API reference documentation](https://rosettacommons.github.io/atomworks/latest/io/parser.html) for more information on this method.
218
249
 
219
- If you just want to load a file, you can use the `load_any` function:
250
+ For minimal processing, use the same parser with the `minimal` preset:
220
251
 
221
252
  ```python
222
- from atomworks.io.utils.io_utils import load_any
253
+ from atomworks.io import parse
223
254
  from biotite.structure import AtomArray
224
255
 
225
- atom_array: AtomArray = load_any("3nez.cif.gz", model=1) # model=1 means that we want to load the model 1 (i.e. the first model) rather than a stack of all models in the file
256
+ atom_array: AtomArray = parse("3nez.cif.gz", config="minimal")["asym_unit"][0]
226
257
  ```
227
258
 
228
259
  ---
@@ -1,20 +1,24 @@
1
1
  [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
2
+ [![CI](https://github.com/RosettaCommons/atomworks/actions/workflows/release_and_docs.yaml/badge.svg?branch=release%2Fatomworks-3-0)](https://github.com/RosettaCommons/atomworks/actions/workflows/release_and_docs.yaml)
2
3
  [![PyPI version](https://img.shields.io/pypi/v/atomworks.svg)](https://pypi.org/project/atomworks/)
3
4
  [![Python versions](https://img.shields.io/pypi/pyversions/atomworks.svg)](https://pypi.org/project/atomworks/)
4
5
  [![Documentation Status](https://img.shields.io/badge/docs-latest-brightgreen.svg)](https://rosettacommons.github.io/atomworks/latest/)
5
6
  [![License: BSD 3-Clause](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
6
7
 
7
8
  <div align="center">
8
- <img src="docs/_static/atomworks_logo_color.svg" width="450" alt="atomworks logo">
9
+ <picture>
10
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/RosettaCommons/atomworks/release/atomworks-3-0/docs/_static/atomworks_logo_dark.svg">
11
+ <img src="https://raw.githubusercontent.com/RosettaCommons/atomworks/release/atomworks-3-0/docs/_static/atomworks_logo_color.svg" width="450" alt="AtomWorks logo">
12
+ </picture>
9
13
  </div>
10
14
 
11
15
  **atomworks** is an open-source platform that maximizes research velocity for biomolecular modeling tasks. Much like how [Torchvision](https://docs.pytorch.org/vision/stable/index.html) enables rapid prototyping within the vision domain, and [Torchaudio](https://docs.pytorch.org/audio/main/) within the audio domain, AtomWorks aims to accelerate development and experimentation within biomolecular modeling.
12
16
 
13
- > **⚠️ Notice:** We are currently finalizing some cleanup work within our repositories. Please expect the APIs (e.g., function and class names, inputs and outputs) to stabilize within the next one week. Thank you for your patience!
17
+ Upgrading to 3.0? See the [migration guide](https://github.com/RosettaCommons/atomworks/blob/release/atomworks-3-0/docs/migration/migration-short.md).
14
18
 
15
- If you're looking for the models themselves (e.g., RF3, MPNN) that integrate with AtomWorks rather than the underlying framework, check out [ModelForge](https://github.com/RosettaCommons/modelforge)
19
+ If you're looking for the models themselves (e.g., RF3, RFD3, MPNN) that integrate with AtomWorks rather than the underlying framework, check out [Foundry](https://github.com/RosettaCommons/foundry)
16
20
 
17
- > **💡 Note:** Not sure where to start? We've made some [examples in the AtomWorks documentation](https://rosettacommons.github.io/atomworks/latest/auto_examples/index.html) that work through several helpful scenarios; a full tutorial is under construction!
21
+ > **💡 Note:** Start with the [AtomWorks examples](https://rosettacommons.github.io/atomworks/latest/auto_examples/index.html) or the [model-building tutorial](https://github.com/RosettaCommons/atomworks/blob/release/atomworks-3-0/docs/how_to_build_a_model/index.rst).
18
22
 
19
23
  AtomWorks is composed of two symbiotic libraries:
20
24
 
@@ -29,7 +33,7 @@ AtomWorks is built atop [biotite](https://www.biotite-python.org/): We are grate
29
33
 
30
34
  ## atomworks.io
31
35
 
32
- > *A general-purpose Python toolkit for cleaning, standardizing, and manipulating with biomolecular structure files - built atop [biotite](https://www.biotite-python.org/):
36
+ > *A general-purpose Python toolkit for cleaning, standardizing, and manipulating biomolecular structure files, built on [Biotite](https://www.biotite-python.org/).*
33
37
 
34
38
  **atomworks.io** lets you:
35
39
 
@@ -51,7 +55,7 @@ We have found `atomworks.io` to be generally useful to a broad bioinformatics an
51
55
  - An extensible framework, integrated with `atomworks.io`, to write `Transforms` for arbitrary use cases
52
56
  - Pre-built datasets and samplers suitable for most model training scenarios
53
57
 
54
- Within the AtomWorks paradigm, the output of each `Transform` is not an opaque dictionary with model-specific tensors but instead an updated version of our atom-level structural representation (Biotite's `AtomArray`). Operations within – and between – pipelines thus maintain a common vocabulary of inputs and outputs.
58
+ Transforms consume and return dictionaries containing structural data, annotations and features. Biotite's `AtomArray` provides their shared atom-level representation.
55
59
 
56
60
  We have found that `atomworks.ml` **dramatically** reduces the overhead of starting, and completing, many ML projects; research topics that once took months now achieve signal within weeks if not days, accelerating the pace of innovation.
57
61
 
@@ -72,14 +76,14 @@ We have found that `atomworks.ml` **dramatically** reduces the overhead of start
72
76
  ---
73
77
 
74
78
  ## Installation
75
- > Note: AtomWorks requires Python >= 3.11 and [`dotenv`](https://pypi.org/project/python-dotenv/#file-format)
79
+ AtomWorks requires Python 3.11 or newer. Pip installs its dependencies automatically.
76
80
 
77
81
  ```shell
78
82
  pip install atomworks # base installation version without torch (for only atomworks.io)
79
83
  pip install "atomworks[ml]" # with torch and ML dependencies (for atomworks.io plus atomworks.ml)
80
84
  pip install "atomworks[dev]" # with development dependencies
81
85
  pip install "atomworks[openbabel]" # with [Open Babel](https://openbabel.org/) and its dependencies
82
- pip install "atomworks[ml,openbabel,dev]" # with all dependencies
86
+ pip install "atomworks[ml,openbabel,dev]" # ML, Open Babel, and development tools
83
87
  ```
84
88
  *Running multiple of these installations will just add to the installed dependencies and will not install multiple installations of atomworks.*
85
89
 
@@ -89,6 +93,12 @@ If you are using [uv](https://docs.astral.sh/uv/reference/policies/versioning/)
89
93
  uv pip install "atomworks[ml,openbabel,dev]"
90
94
  ```
91
95
 
96
+ To install the AtomWorks 3.0 release branch before it is published on PyPI:
97
+
98
+ ```shell
99
+ pip install "atomworks[ml] @ git+https://github.com/RosettaCommons/atomworks.git@release/atomworks-3-0"
100
+ ```
101
+
92
102
  For more advanced setup options (including how to run workflows via apptainers) see the [full documentation](https://rosettacommons.github.io/atomworks/latest/index.html).
93
103
 
94
104
  ---
@@ -103,10 +113,11 @@ To parse a pdb file (parse = load, clean, annotate relevant metadata such as ent
103
113
 
104
114
  ```python
105
115
 
106
- from atomworks.io.parser import parse
116
+ from atomworks.io import parse
117
+ from atomworks.io.config import ParseConfig
107
118
  from biotite.structure import AtomArrayStack
108
119
 
109
- result = parse(filename="3nez.cif.gz")
120
+ result = parse("3nez.cif.gz", config=ParseConfig.from_preset("rcsb"))
110
121
 
111
122
  asym_unit: AtomArrayStack = result["asym_unit"]
112
123
  assemblies: dict[str, AtomArrayStack] = result["assemblies"]
@@ -127,13 +138,13 @@ The output of `parse` includes:
127
138
  See [usage examples](https://rosettacommons.github.io/atomworks/latest/auto_examples/index.html) for more examples of the use of `parse()`. All of the provided examples make use of this method.
128
139
  See [API reference documentation](https://rosettacommons.github.io/atomworks/latest/io/parser.html) for more information on this method.
129
140
 
130
- If you just want to load a file, you can use the `load_any` function:
141
+ For minimal processing, use the same parser with the `minimal` preset:
131
142
 
132
143
  ```python
133
- from atomworks.io.utils.io_utils import load_any
144
+ from atomworks.io import parse
134
145
  from biotite.structure import AtomArray
135
146
 
136
- atom_array: AtomArray = load_any("3nez.cif.gz", model=1) # model=1 means that we want to load the model 1 (i.e. the first model) rather than a stack of all models in the file
147
+ atom_array: AtomArray = parse("3nez.cif.gz", config="minimal")["asym_unit"][0]
137
148
  ```
138
149
 
139
150
  ---
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "atomworks"
3
- version = "2.2.0"
3
+ version = "3.0.0"
4
4
  description = "A research-oriented data toolkit for training biomolecular deep-learning foundation models"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -23,76 +23,111 @@ classifiers = [
23
23
 
24
24
  dependencies = [
25
25
  # ... generic tools
26
- "cython>=3.0.0,<4", # Cython compiler for C extensions
27
- "cytoolz>=0.12.3,<1", # Cython-optimized tools for itertools and functional programming
28
- "tqdm>=4.65.0,<5", # Fast, extensible progress bar for loops and more
26
+ "cython>=3.0.0", # Cython compiler for C extensions
27
+ "cytoolz>=0.12.3", # Cython-optimized tools for itertools and functional programming
28
+ "tqdm>=4.66.3", # Fast, extensible progress bar for loops and more
29
29
  # ... CLI & config management
30
- "typer>=0.12.5,<1", # Modern CLI framework
30
+ "typer>=0.12.5", # Modern CLI framework
31
+ "python-dotenv>=1.2.2", # Environment loading for the CLI
32
+ "pygments>=2.20.0", # Traceback formatting in core IO
31
33
  # ... linear algebra, maths & ml
32
- "numpy>=1.25.0,<3",
33
- "scipy>=1.13.1,<2",
34
+ "numpy>=1.25.0",
35
+ "jaxtyping>=0.2.17", # Array annotations used by core IO
36
+ "scipy>=1.13.1",
34
37
  # ... data tools
35
- "pandas>=2.2,<2.4", # Data manipulation and analysis
36
- "pyarrow==17.0.0", # Columnar data format for efficient data storage and processing # TODO: Test later versions
38
+ "pandas>=2.2", # Data manipulation and analysis
39
+ "pyarrow>=23.0.1", # Columnar data format for efficient data storage and processing
37
40
  # ... compression
38
- "zstandard>=0.21.0,<1", # Zstandard compression for MSA files and other data
41
+ "zstandard>=0.21.0", # Zstandard compression for MSA files and other data
39
42
  # ... bioinformatics
40
- "py3Dmol>=2.2.1,<3", # Python wrapper for 3Dmol.js
43
+ "py3Dmol>=2.2.1", # Python wrapper for 3Dmol.js
41
44
  "pymol-remote>=0.0.5", # Remote access to PyMOL from Python (has no dependencies)
42
- "biotite==1.4.0", # Biotite is a Python library for bioinformatics # TODO: Test newer versions
43
- "hydride>=1.2.3,<2", # Biotite-supported tool for hydrogen addition
45
+ # Pinned exactly: atomworks monkey-patches biotite internals and ``atomworks/__init__.py``
46
+ # refuses to import against any other version. A ``>=`` floor here silently resolves to a
47
+ # newer biotite that then fails at import time.
48
+ "biotite==1.6.0", # Biotite is a Python library for bioinformatics
44
49
  # ... small molecule libraries
45
- "rdkit>=2024.3.5,<2025.9",
50
+ "rdkit>=2024.3.5",
51
+ "urllib3>=2.8.0",
52
+ "pillow>=12.3.0",
53
+ "idna>=3.15",
54
+ "requests>=2.33.0",
46
55
  ]
47
56
 
48
57
  [project.optional-dependencies]
49
58
  ml = [
50
59
  # atomworks-ml dependencies
51
- "torch>=2.2.0,<2.8",
52
- "einops>=0.7.0,<1",
53
- "jaxtyping>=0.2.17,<1",
54
- "beartype>=0.18.0,<1",
60
+ "torch>=2.2.0",
61
+ "requests>=2.33.0", # Remote MMseqs2 server client
62
+ "einops>=0.7.0",
63
+ "beartype>=0.18.0",
64
+ "numba>=0.60.0",
65
+ "filelock>=3.20.3",
66
+ ]
67
+
68
+ s3 = [
69
+ # Reading blob stores / parquet directly from ``s3://`` URLs
70
+ "boto3",
55
71
  ]
56
72
 
57
73
  ase = [
58
74
  # ASE (Atomic Simulation Environment) dataset support
59
- "ase>=3.22.0,<4", # Atomic Simulation Environment
60
- "ase-db-backends>=0.10.0,<1", # Database backends for ASE (PostgreSQL, MySQL, LMDB)
61
- "lmdb>=1.5.0,<2", # LMDB backend for ASE database support (required for .aselmdb files)
75
+ "ase>=3.22.0", # Atomic Simulation Environment
76
+ "ase-db-backends>=0.10.0", # Database backends for ASE (PostgreSQL, MySQL, LMDB)
77
+ "lmdb>=1.5.0", # LMDB backend for ASE database support (required for .aselmdb files)
78
+ "cryptography>=50.0.0",
62
79
  ]
63
80
 
64
81
  openbabel = [
65
82
  # Optional openbabel dependency
66
- "openbabel-wheel==3.1.1.22",
83
+ "openbabel-wheel>=3.1.1.22",
84
+ ]
85
+
86
+ posebusters = [
87
+ # PoseBusters: structural validity checks for docked/predicted poses
88
+ "posebusters>=0.6.0",
89
+ ]
90
+
91
+ catcif = [
92
+ # catcif: concatenated CIF archive format support
93
+ "catcif-tools",
67
94
  ]
68
95
 
69
96
  dev = [
70
97
  # Linters & formatters
71
98
  "ruff==0.8.3",
72
99
  # Testing tools
73
- "pytest>=8.2.0,<9", # testing framework
74
- "pytest-testmon>=2.1.1,<3", # run only tests related to changed code
75
- "pytest-xdist>=3.6.1,<4", # run tests in parallel
76
- "pytest-dotenv>=0.5.2,<1", # load environment variables from .env file
77
- "pytest-cov>=4.1.0,<5", # generate coverage report
78
- "pytest-benchmark>=5.0.0,<6", # benchmark tests for speed
100
+ "pytest>=9.0.3", # testing framework
101
+ "pytest-testmon>=2.1.1", # run only tests related to changed code
102
+ "pytest-xdist>=3.6.1", # run tests in parallel
103
+ "pytest-dotenv>=0.5.2", # load environment variables from .env file
104
+ "pytest-cov>=4.1.0", # generate coverage report
105
+ "pytest-benchmark>=5.0.0", # benchmark tests for speed
79
106
  # Jupyter notebooks
80
107
  "ipykernel>=6.28.0", # IPython kernel for Jupyter
108
+ "tornado>=6.5.9",
109
+ # CLI
110
+ "fire>=0.5.0", # CLI generation library
81
111
  ]
82
112
 
83
113
  docs = [
84
- "sphinx>=8.0.0,<9",
85
- "sphinx-gallery>=0.19.0,<1",
86
- "pydata-sphinx-theme>=0.16.1,<1",
87
- "matplotlib>=3.10.0,<4",
114
+ "sphinxcontrib-typer>=0.7.2,<1",
115
+ "sphinx>=8.0.0",
116
+ "sphinx-gallery>=0.19.0",
117
+ "pydata-sphinx-theme>=0.16.1",
118
+ "matplotlib>=3.10.0",
119
+ "myst-parser>=4.0.0", # Support Markdown tutorial pages
120
+ "sphinx-design>=0.6.0", # Render collapsible tutorial code examples
88
121
  ]
89
122
 
90
123
  [dependency-groups]
91
124
  # Reference optional dependencies for native uv compatability (in addition to the pip compatability)
92
125
  dev = ["atomworks[dev]"]
93
- ml = ["atomworks[ml]"]
126
+ ml = ["atomworks[ml]"]
94
127
  docs = ["atomworks[docs]"]
95
128
  openbabel = ["atomworks[openbabel]"]
129
+ posebusters = ["atomworks[posebusters]"]
130
+ catcif = ["atomworks[catcif]"]
96
131
 
97
132
  [project.urls]
98
133
  homepage = "https://rosettacommons.github.io/atomworks/latest/index.html"
@@ -105,13 +140,15 @@ aw = "atomworks_cli.__main__:main"
105
140
 
106
141
  # Build settings ----------------------------------------------------------------------
107
142
  [build-system]
108
- requires = ["hatchling", "hatch-vcs"]
143
+ requires = ["hatchling"]
109
144
  build-backend = "hatchling.build"
110
145
 
111
- [tool.hatch.build]
112
- sources = ["src"]
146
+ [tool.hatch.build.targets.wheel]
113
147
  packages = ["src/atomworks", "src/atomworks_cli"]
114
148
 
149
+ [tool.hatch.build.targets.sdist]
150
+ include = ["/src", "/README.md", "/LICENSE.md", "/pyproject.toml"]
151
+
115
152
  [tool.hatch.metadata]
116
153
  allow-direct-references = true
117
154
  dynamic = false # optional – this disables dynamic metadata guessing
@@ -220,6 +257,7 @@ convention = "google"
220
257
  "docs/**/*.py" = ["E402"] # Ignore forcing imports to be at the top of the file
221
258
  "docs/**/*.ipynb" = ["E402"] # Ignore forcing imports to be at the top of the file
222
259
  "src/atomworks_cli/*" = ["B008"] # Ignore function calls in argument defaults for Typer CLI
260
+ "src/atomworks/ml/preprocessing/msa/colabfold_server.py" = ["N803", "N806"] # Keep ColabFold's upstream variable names (ID, REDO, TIME, ...) for easy diffing
223
261
 
224
262
  # Allow one-letter variable names commonly used in scientific code.
225
263
  [tool.ruff.lint.pep8-naming]
@@ -238,6 +276,7 @@ testpaths = "tests" # Only run tests in the tests directory (speeds up collecti
238
276
  norecursedirs = "docs *.egg-info .git .tox htmlcov"
239
277
  addopts = "--import-mode=importlib"
240
278
  pythonpath = ["src/atomworks", "tests"]
279
+ env_files = ".env" # Automatically load .env file before running tests (via pytest-dotenv)
241
280
  markers = [
242
281
  "requires_internet: marks tests that require an internet connection",
243
282
  "requires_pymol_remote: marks tests that require a PyMOL remote connection to run",
@@ -0,0 +1,88 @@
1
+ """Unified package for biological data I/O and machine learning.
2
+
3
+ This package combines functionality from :mod:`atomworks.io` (I/O operations) and
4
+ :mod:`atomworks.ml` (ML utilities) into a unified interface for biological data
5
+ processing and machine learning.
6
+ """
7
+
8
+ import importlib
9
+ import importlib.metadata
10
+ import logging
11
+ import os
12
+ import warnings
13
+
14
+ try:
15
+ __version__ = importlib.metadata.version("atomworks")
16
+ except ImportError:
17
+ __version__ = "unknown"
18
+
19
+
20
+ # Hard-enforce biotite version compatibility by importing biotite directly.
21
+ # Atomworks monkey-patches several private biotite internals that are sensitive to exact version alignment
22
+ _REQUIRED_BIOTITE_VERSION = "1.6.0"
23
+ try:
24
+ import biotite as _biotite_check
25
+ except ImportError:
26
+ raise ImportError(
27
+ f"atomworks requires biotite=={_REQUIRED_BIOTITE_VERSION}, but biotite is not installed.\n"
28
+ f" pip install 'biotite=={_REQUIRED_BIOTITE_VERSION}'"
29
+ ) from None
30
+ if _biotite_check.__version__ != _REQUIRED_BIOTITE_VERSION:
31
+ raise ImportError(
32
+ f"atomworks requires biotite=={_REQUIRED_BIOTITE_VERSION}, "
33
+ f"but biotite {_biotite_check.__version__!r} is installed.\n"
34
+ f" pip install 'biotite=={_REQUIRED_BIOTITE_VERSION}'"
35
+ )
36
+ del _biotite_check
37
+
38
+ # Global logging configuration
39
+ logger = logging.getLogger("atomworks")
40
+ _log_level = os.environ.get("ATOMWORKS_LOG_LEVEL", "WARNING").upper()
41
+ logger.setLevel(_log_level)
42
+
43
+ # Ensure that deprecation warnings are not repeated
44
+ warnings.filterwarnings("once", category=DeprecationWarning)
45
+
46
+ # Enforce strict biotite version — atomworks patches biotite internals
47
+ import biotite # noqa: E402
48
+
49
+ _REQUIRED_BIOTITE_VERSION = "1.6.0"
50
+ if biotite.__version__ != _REQUIRED_BIOTITE_VERSION:
51
+ raise RuntimeError(
52
+ f"atomworks requires biotite=={_REQUIRED_BIOTITE_VERSION}, "
53
+ f"but found biotite=={biotite.__version__}. "
54
+ f"Install the correct version: pip install biotite=={_REQUIRED_BIOTITE_VERSION}"
55
+ )
56
+
57
+ # Apply monkey patching to extend AtomArray functionality
58
+ from atomworks.biotite_patch import monkey_patch_biotite # noqa: E402
59
+
60
+ monkey_patch_biotite()
61
+
62
+
63
+ # Import subpackages; also import annotators and Conditions to ensure they're registered
64
+ from atomworks.io.utils import annotator as _annotator_io # noqa: E402
65
+ from atomworks.io.utils.standard_annotations import definitions as _standard_annotation_definitions # noqa: E402
66
+
67
+ from . import io # noqa: E402
68
+
69
+ # Make atomworks.ml an optional import
70
+ try:
71
+ from atomworks.ml.conditions import definitions as _condition_definitions
72
+ from atomworks.ml.utils import annotator as _annotator_ml
73
+
74
+ from . import ml
75
+ except ImportError:
76
+ pass
77
+
78
+ # Re-export key functionality from subpackages for convenience
79
+ # This maintains backward compatibility and provides a clean top-level API
80
+ # Key I/O functionality
81
+ from .io.parser import parse # noqa: E402
82
+
83
+ __all__ = [
84
+ "__version__",
85
+ "io",
86
+ "ml",
87
+ "parse",
88
+ ]