@synsci/cli-darwin-arm64 1.1.77 → 1.1.78

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 (830) hide show
  1. package/bin/skills/adaptyv/SKILL.md +114 -0
  2. package/bin/skills/adaptyv/reference/api_reference.md +308 -0
  3. package/bin/skills/adaptyv/reference/examples.md +913 -0
  4. package/bin/skills/adaptyv/reference/experiments.md +360 -0
  5. package/bin/skills/adaptyv/reference/protein_optimization.md +637 -0
  6. package/bin/skills/aeon/SKILL.md +374 -0
  7. package/bin/skills/aeon/references/anomaly_detection.md +154 -0
  8. package/bin/skills/aeon/references/classification.md +144 -0
  9. package/bin/skills/aeon/references/clustering.md +123 -0
  10. package/bin/skills/aeon/references/datasets_benchmarking.md +387 -0
  11. package/bin/skills/aeon/references/distances.md +256 -0
  12. package/bin/skills/aeon/references/forecasting.md +140 -0
  13. package/bin/skills/aeon/references/networks.md +289 -0
  14. package/bin/skills/aeon/references/regression.md +118 -0
  15. package/bin/skills/aeon/references/segmentation.md +163 -0
  16. package/bin/skills/aeon/references/similarity_search.md +187 -0
  17. package/bin/skills/aeon/references/transformations.md +246 -0
  18. package/bin/skills/alphafold-database/SKILL.md +513 -0
  19. package/bin/skills/alphafold-database/references/api_reference.md +423 -0
  20. package/bin/skills/anndata/SKILL.md +400 -0
  21. package/bin/skills/anndata/references/best_practices.md +525 -0
  22. package/bin/skills/anndata/references/concatenation.md +396 -0
  23. package/bin/skills/anndata/references/data_structure.md +314 -0
  24. package/bin/skills/anndata/references/io_operations.md +404 -0
  25. package/bin/skills/anndata/references/manipulation.md +516 -0
  26. package/bin/skills/arboreto/SKILL.md +243 -0
  27. package/bin/skills/arboreto/references/algorithms.md +138 -0
  28. package/bin/skills/arboreto/references/basic_inference.md +151 -0
  29. package/bin/skills/arboreto/references/distributed_computing.md +242 -0
  30. package/bin/skills/arboreto/scripts/basic_grn_inference.py +97 -0
  31. package/bin/skills/astropy/SKILL.md +331 -0
  32. package/bin/skills/astropy/references/coordinates.md +273 -0
  33. package/bin/skills/astropy/references/cosmology.md +307 -0
  34. package/bin/skills/astropy/references/fits.md +396 -0
  35. package/bin/skills/astropy/references/tables.md +489 -0
  36. package/bin/skills/astropy/references/time.md +404 -0
  37. package/bin/skills/astropy/references/units.md +178 -0
  38. package/bin/skills/astropy/references/wcs_and_other_modules.md +373 -0
  39. package/bin/skills/benchling-integration/SKILL.md +480 -0
  40. package/bin/skills/benchling-integration/references/api_endpoints.md +883 -0
  41. package/bin/skills/benchling-integration/references/authentication.md +379 -0
  42. package/bin/skills/benchling-integration/references/sdk_reference.md +774 -0
  43. package/bin/skills/biopython/SKILL.md +443 -0
  44. package/bin/skills/biopython/references/advanced.md +577 -0
  45. package/bin/skills/biopython/references/alignment.md +362 -0
  46. package/bin/skills/biopython/references/blast.md +455 -0
  47. package/bin/skills/biopython/references/databases.md +484 -0
  48. package/bin/skills/biopython/references/phylogenetics.md +566 -0
  49. package/bin/skills/biopython/references/sequence_io.md +285 -0
  50. package/bin/skills/biopython/references/structure.md +564 -0
  51. package/bin/skills/biorxiv-database/SKILL.md +483 -0
  52. package/bin/skills/biorxiv-database/references/api_reference.md +280 -0
  53. package/bin/skills/biorxiv-database/scripts/biorxiv_search.py +445 -0
  54. package/bin/skills/bioservices/SKILL.md +361 -0
  55. package/bin/skills/bioservices/references/identifier_mapping.md +685 -0
  56. package/bin/skills/bioservices/references/services_reference.md +636 -0
  57. package/bin/skills/bioservices/references/workflow_patterns.md +811 -0
  58. package/bin/skills/bioservices/scripts/batch_id_converter.py +347 -0
  59. package/bin/skills/bioservices/scripts/compound_cross_reference.py +378 -0
  60. package/bin/skills/bioservices/scripts/pathway_analysis.py +309 -0
  61. package/bin/skills/bioservices/scripts/protein_analysis_workflow.py +408 -0
  62. package/bin/skills/brenda-database/SKILL.md +719 -0
  63. package/bin/skills/brenda-database/references/api_reference.md +537 -0
  64. package/bin/skills/brenda-database/scripts/brenda_queries.py +844 -0
  65. package/bin/skills/brenda-database/scripts/brenda_visualization.py +772 -0
  66. package/bin/skills/brenda-database/scripts/enzyme_pathway_builder.py +1053 -0
  67. package/bin/skills/cellxgene-census/SKILL.md +511 -0
  68. package/bin/skills/cellxgene-census/references/census_schema.md +182 -0
  69. package/bin/skills/cellxgene-census/references/common_patterns.md +351 -0
  70. package/bin/skills/chembl-database/SKILL.md +389 -0
  71. package/bin/skills/chembl-database/references/api_reference.md +272 -0
  72. package/bin/skills/chembl-database/scripts/example_queries.py +278 -0
  73. package/bin/skills/cirq/SKILL.md +346 -0
  74. package/bin/skills/cirq/references/building.md +307 -0
  75. package/bin/skills/cirq/references/experiments.md +572 -0
  76. package/bin/skills/cirq/references/hardware.md +515 -0
  77. package/bin/skills/cirq/references/noise.md +515 -0
  78. package/bin/skills/cirq/references/simulation.md +350 -0
  79. package/bin/skills/cirq/references/transformation.md +416 -0
  80. package/bin/skills/clinicaltrials-database/SKILL.md +507 -0
  81. package/bin/skills/clinicaltrials-database/references/api_reference.md +358 -0
  82. package/bin/skills/clinicaltrials-database/scripts/query_clinicaltrials.py +215 -0
  83. package/bin/skills/clinpgx-database/SKILL.md +638 -0
  84. package/bin/skills/clinpgx-database/references/api_reference.md +757 -0
  85. package/bin/skills/clinpgx-database/scripts/query_clinpgx.py +518 -0
  86. package/bin/skills/clinvar-database/SKILL.md +362 -0
  87. package/bin/skills/clinvar-database/references/api_reference.md +227 -0
  88. package/bin/skills/clinvar-database/references/clinical_significance.md +218 -0
  89. package/bin/skills/clinvar-database/references/data_formats.md +358 -0
  90. package/bin/skills/cobrapy/SKILL.md +463 -0
  91. package/bin/skills/cobrapy/references/api_quick_reference.md +655 -0
  92. package/bin/skills/cobrapy/references/workflows.md +593 -0
  93. package/bin/skills/cosmic-database/SKILL.md +336 -0
  94. package/bin/skills/cosmic-database/references/cosmic_data_reference.md +220 -0
  95. package/bin/skills/cosmic-database/scripts/download_cosmic.py +231 -0
  96. package/bin/skills/dask/SKILL.md +456 -0
  97. package/bin/skills/dask/references/arrays.md +497 -0
  98. package/bin/skills/dask/references/bags.md +468 -0
  99. package/bin/skills/dask/references/best-practices.md +277 -0
  100. package/bin/skills/dask/references/dataframes.md +368 -0
  101. package/bin/skills/dask/references/futures.md +541 -0
  102. package/bin/skills/dask/references/schedulers.md +504 -0
  103. package/bin/skills/datacommons-client/SKILL.md +255 -0
  104. package/bin/skills/datacommons-client/references/getting_started.md +417 -0
  105. package/bin/skills/datacommons-client/references/node.md +250 -0
  106. package/bin/skills/datacommons-client/references/observation.md +185 -0
  107. package/bin/skills/datacommons-client/references/resolve.md +246 -0
  108. package/bin/skills/datamol/SKILL.md +706 -0
  109. package/bin/skills/datamol/references/conformers_module.md +131 -0
  110. package/bin/skills/datamol/references/core_api.md +130 -0
  111. package/bin/skills/datamol/references/descriptors_viz.md +195 -0
  112. package/bin/skills/datamol/references/fragments_scaffolds.md +174 -0
  113. package/bin/skills/datamol/references/io_module.md +109 -0
  114. package/bin/skills/datamol/references/reactions_data.md +218 -0
  115. package/bin/skills/deepchem/SKILL.md +597 -0
  116. package/bin/skills/deepchem/references/api_reference.md +303 -0
  117. package/bin/skills/deepchem/references/workflows.md +491 -0
  118. package/bin/skills/deepchem/scripts/graph_neural_network.py +338 -0
  119. package/bin/skills/deepchem/scripts/predict_solubility.py +224 -0
  120. package/bin/skills/deepchem/scripts/transfer_learning.py +375 -0
  121. package/bin/skills/deeptools/SKILL.md +531 -0
  122. package/bin/skills/deeptools/assets/quick_reference.md +58 -0
  123. package/bin/skills/deeptools/references/effective_genome_sizes.md +116 -0
  124. package/bin/skills/deeptools/references/normalization_methods.md +410 -0
  125. package/bin/skills/deeptools/references/tools_reference.md +533 -0
  126. package/bin/skills/deeptools/references/workflows.md +474 -0
  127. package/bin/skills/deeptools/scripts/validate_files.py +195 -0
  128. package/bin/skills/deeptools/scripts/workflow_generator.py +454 -0
  129. package/bin/skills/denario/SKILL.md +215 -0
  130. package/bin/skills/denario/references/examples.md +494 -0
  131. package/bin/skills/denario/references/installation.md +213 -0
  132. package/bin/skills/denario/references/llm_configuration.md +265 -0
  133. package/bin/skills/denario/references/research_pipeline.md +471 -0
  134. package/bin/skills/diffdock/SKILL.md +483 -0
  135. package/bin/skills/diffdock/assets/batch_template.csv +4 -0
  136. package/bin/skills/diffdock/assets/custom_inference_config.yaml +90 -0
  137. package/bin/skills/diffdock/references/confidence_and_limitations.md +182 -0
  138. package/bin/skills/diffdock/references/parameters_reference.md +163 -0
  139. package/bin/skills/diffdock/references/workflows_examples.md +392 -0
  140. package/bin/skills/diffdock/scripts/analyze_results.py +334 -0
  141. package/bin/skills/diffdock/scripts/prepare_batch_csv.py +254 -0
  142. package/bin/skills/diffdock/scripts/setup_check.py +278 -0
  143. package/bin/skills/dnanexus-integration/SKILL.md +383 -0
  144. package/bin/skills/dnanexus-integration/references/app-development.md +247 -0
  145. package/bin/skills/dnanexus-integration/references/configuration.md +646 -0
  146. package/bin/skills/dnanexus-integration/references/data-operations.md +400 -0
  147. package/bin/skills/dnanexus-integration/references/job-execution.md +412 -0
  148. package/bin/skills/dnanexus-integration/references/python-sdk.md +523 -0
  149. package/bin/skills/document-skills/docx/LICENSE.txt +30 -0
  150. package/bin/skills/document-skills/docx/SKILL.md +233 -0
  151. package/bin/skills/document-skills/docx/docx-js.md +350 -0
  152. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  153. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  154. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  155. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  156. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  157. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  158. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  159. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  160. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  161. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  162. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  163. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  164. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  165. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  166. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  167. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  168. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  169. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  170. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  171. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  172. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  173. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  174. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  175. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  176. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  177. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  178. package/bin/skills/document-skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  179. package/bin/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  180. package/bin/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  181. package/bin/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  182. package/bin/skills/document-skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  183. package/bin/skills/document-skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  184. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  185. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  186. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  187. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  188. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  189. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  190. package/bin/skills/document-skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  191. package/bin/skills/document-skills/docx/ooxml/scripts/pack.py +159 -0
  192. package/bin/skills/document-skills/docx/ooxml/scripts/unpack.py +29 -0
  193. package/bin/skills/document-skills/docx/ooxml/scripts/validate.py +69 -0
  194. package/bin/skills/document-skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  195. package/bin/skills/document-skills/docx/ooxml/scripts/validation/base.py +951 -0
  196. package/bin/skills/document-skills/docx/ooxml/scripts/validation/docx.py +274 -0
  197. package/bin/skills/document-skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  198. package/bin/skills/document-skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  199. package/bin/skills/document-skills/docx/ooxml.md +610 -0
  200. package/bin/skills/document-skills/docx/scripts/__init__.py +1 -0
  201. package/bin/skills/document-skills/docx/scripts/document.py +1276 -0
  202. package/bin/skills/document-skills/docx/scripts/templates/comments.xml +3 -0
  203. package/bin/skills/document-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  204. package/bin/skills/document-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  205. package/bin/skills/document-skills/docx/scripts/templates/commentsIds.xml +3 -0
  206. package/bin/skills/document-skills/docx/scripts/templates/people.xml +3 -0
  207. package/bin/skills/document-skills/docx/scripts/utilities.py +374 -0
  208. package/bin/skills/document-skills/pdf/LICENSE.txt +30 -0
  209. package/bin/skills/document-skills/pdf/SKILL.md +330 -0
  210. package/bin/skills/document-skills/pdf/forms.md +205 -0
  211. package/bin/skills/document-skills/pdf/reference.md +612 -0
  212. package/bin/skills/document-skills/pdf/scripts/check_bounding_boxes.py +70 -0
  213. package/bin/skills/document-skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  214. package/bin/skills/document-skills/pdf/scripts/check_fillable_fields.py +12 -0
  215. package/bin/skills/document-skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  216. package/bin/skills/document-skills/pdf/scripts/create_validation_image.py +41 -0
  217. package/bin/skills/document-skills/pdf/scripts/extract_form_field_info.py +152 -0
  218. package/bin/skills/document-skills/pdf/scripts/fill_fillable_fields.py +114 -0
  219. package/bin/skills/document-skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  220. package/bin/skills/document-skills/pptx/LICENSE.txt +30 -0
  221. package/bin/skills/document-skills/pptx/SKILL.md +520 -0
  222. package/bin/skills/document-skills/pptx/html2pptx.md +625 -0
  223. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  224. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  225. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  226. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  227. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  228. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  229. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  230. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  231. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  232. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  233. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  234. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  235. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  236. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  237. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  238. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  239. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  240. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  241. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  242. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  243. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  244. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  245. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  246. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  247. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  248. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  249. package/bin/skills/document-skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  250. package/bin/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  251. package/bin/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  252. package/bin/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  253. package/bin/skills/document-skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  254. package/bin/skills/document-skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  255. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  256. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  257. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  258. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  259. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  260. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  261. package/bin/skills/document-skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  262. package/bin/skills/document-skills/pptx/ooxml/scripts/pack.py +159 -0
  263. package/bin/skills/document-skills/pptx/ooxml/scripts/unpack.py +29 -0
  264. package/bin/skills/document-skills/pptx/ooxml/scripts/validate.py +69 -0
  265. package/bin/skills/document-skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  266. package/bin/skills/document-skills/pptx/ooxml/scripts/validation/base.py +951 -0
  267. package/bin/skills/document-skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  268. package/bin/skills/document-skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  269. package/bin/skills/document-skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  270. package/bin/skills/document-skills/pptx/ooxml.md +427 -0
  271. package/bin/skills/document-skills/pptx/scripts/html2pptx.js +979 -0
  272. package/bin/skills/document-skills/pptx/scripts/inventory.py +1020 -0
  273. package/bin/skills/document-skills/pptx/scripts/rearrange.py +231 -0
  274. package/bin/skills/document-skills/pptx/scripts/replace.py +385 -0
  275. package/bin/skills/document-skills/pptx/scripts/thumbnail.py +450 -0
  276. package/bin/skills/document-skills/xlsx/LICENSE.txt +30 -0
  277. package/bin/skills/document-skills/xlsx/SKILL.md +325 -0
  278. package/bin/skills/document-skills/xlsx/recalc.py +178 -0
  279. package/bin/skills/drugbank-database/SKILL.md +190 -0
  280. package/bin/skills/drugbank-database/references/chemical-analysis.md +590 -0
  281. package/bin/skills/drugbank-database/references/data-access.md +242 -0
  282. package/bin/skills/drugbank-database/references/drug-queries.md +386 -0
  283. package/bin/skills/drugbank-database/references/interactions.md +425 -0
  284. package/bin/skills/drugbank-database/references/targets-pathways.md +518 -0
  285. package/bin/skills/drugbank-database/scripts/drugbank_helper.py +350 -0
  286. package/bin/skills/ena-database/SKILL.md +204 -0
  287. package/bin/skills/ena-database/references/api_reference.md +490 -0
  288. package/bin/skills/ensembl-database/SKILL.md +311 -0
  289. package/bin/skills/ensembl-database/references/api_endpoints.md +346 -0
  290. package/bin/skills/ensembl-database/scripts/ensembl_query.py +427 -0
  291. package/bin/skills/esm/SKILL.md +306 -0
  292. package/bin/skills/esm/references/esm-c-api.md +583 -0
  293. package/bin/skills/esm/references/esm3-api.md +452 -0
  294. package/bin/skills/esm/references/forge-api.md +657 -0
  295. package/bin/skills/esm/references/workflows.md +685 -0
  296. package/bin/skills/etetoolkit/SKILL.md +623 -0
  297. package/bin/skills/etetoolkit/references/api_reference.md +583 -0
  298. package/bin/skills/etetoolkit/references/visualization.md +783 -0
  299. package/bin/skills/etetoolkit/references/workflows.md +774 -0
  300. package/bin/skills/etetoolkit/scripts/quick_visualize.py +214 -0
  301. package/bin/skills/etetoolkit/scripts/tree_operations.py +229 -0
  302. package/bin/skills/exploratory-data-analysis/SKILL.md +446 -0
  303. package/bin/skills/exploratory-data-analysis/assets/report_template.md +196 -0
  304. package/bin/skills/exploratory-data-analysis/references/bioinformatics_genomics_formats.md +664 -0
  305. package/bin/skills/exploratory-data-analysis/references/chemistry_molecular_formats.md +664 -0
  306. package/bin/skills/exploratory-data-analysis/references/general_scientific_formats.md +518 -0
  307. package/bin/skills/exploratory-data-analysis/references/microscopy_imaging_formats.md +620 -0
  308. package/bin/skills/exploratory-data-analysis/references/proteomics_metabolomics_formats.md +517 -0
  309. package/bin/skills/exploratory-data-analysis/references/spectroscopy_analytical_formats.md +633 -0
  310. package/bin/skills/exploratory-data-analysis/scripts/eda_analyzer.py +547 -0
  311. package/bin/skills/fda-database/SKILL.md +518 -0
  312. package/bin/skills/fda-database/references/animal_veterinary.md +377 -0
  313. package/bin/skills/fda-database/references/api_basics.md +687 -0
  314. package/bin/skills/fda-database/references/devices.md +632 -0
  315. package/bin/skills/fda-database/references/drugs.md +468 -0
  316. package/bin/skills/fda-database/references/foods.md +374 -0
  317. package/bin/skills/fda-database/references/other.md +472 -0
  318. package/bin/skills/fda-database/scripts/fda_examples.py +335 -0
  319. package/bin/skills/fda-database/scripts/fda_query.py +440 -0
  320. package/bin/skills/flowio/SKILL.md +608 -0
  321. package/bin/skills/flowio/references/api_reference.md +372 -0
  322. package/bin/skills/fluidsim/SKILL.md +349 -0
  323. package/bin/skills/fluidsim/references/advanced_features.md +398 -0
  324. package/bin/skills/fluidsim/references/installation.md +68 -0
  325. package/bin/skills/fluidsim/references/output_analysis.md +283 -0
  326. package/bin/skills/fluidsim/references/parameters.md +198 -0
  327. package/bin/skills/fluidsim/references/simulation_workflow.md +172 -0
  328. package/bin/skills/fluidsim/references/solvers.md +94 -0
  329. package/bin/skills/fred-economic-data/SKILL.md +433 -0
  330. package/bin/skills/fred-economic-data/references/api_basics.md +212 -0
  331. package/bin/skills/fred-economic-data/references/categories.md +442 -0
  332. package/bin/skills/fred-economic-data/references/geofred.md +588 -0
  333. package/bin/skills/fred-economic-data/references/releases.md +642 -0
  334. package/bin/skills/fred-economic-data/references/series.md +584 -0
  335. package/bin/skills/fred-economic-data/references/sources.md +423 -0
  336. package/bin/skills/fred-economic-data/references/tags.md +485 -0
  337. package/bin/skills/fred-economic-data/scripts/fred_examples.py +354 -0
  338. package/bin/skills/fred-economic-data/scripts/fred_query.py +590 -0
  339. package/bin/skills/gene-database/SKILL.md +179 -0
  340. package/bin/skills/gene-database/references/api_reference.md +404 -0
  341. package/bin/skills/gene-database/references/common_workflows.md +428 -0
  342. package/bin/skills/gene-database/scripts/batch_gene_lookup.py +298 -0
  343. package/bin/skills/gene-database/scripts/fetch_gene_data.py +277 -0
  344. package/bin/skills/gene-database/scripts/query_gene.py +251 -0
  345. package/bin/skills/geniml/SKILL.md +318 -0
  346. package/bin/skills/geniml/references/bedspace.md +127 -0
  347. package/bin/skills/geniml/references/consensus_peaks.md +238 -0
  348. package/bin/skills/geniml/references/region2vec.md +90 -0
  349. package/bin/skills/geniml/references/scembed.md +197 -0
  350. package/bin/skills/geniml/references/utilities.md +385 -0
  351. package/bin/skills/geo-database/SKILL.md +815 -0
  352. package/bin/skills/geo-database/references/geo_reference.md +829 -0
  353. package/bin/skills/geopandas/SKILL.md +251 -0
  354. package/bin/skills/geopandas/references/crs-management.md +243 -0
  355. package/bin/skills/geopandas/references/data-io.md +165 -0
  356. package/bin/skills/geopandas/references/data-structures.md +70 -0
  357. package/bin/skills/geopandas/references/geometric-operations.md +221 -0
  358. package/bin/skills/geopandas/references/spatial-analysis.md +184 -0
  359. package/bin/skills/geopandas/references/visualization.md +243 -0
  360. package/bin/skills/get-available-resources/SKILL.md +277 -0
  361. package/bin/skills/get-available-resources/scripts/detect_resources.py +401 -0
  362. package/bin/skills/gget/SKILL.md +871 -0
  363. package/bin/skills/gget/references/database_info.md +300 -0
  364. package/bin/skills/gget/references/module_reference.md +467 -0
  365. package/bin/skills/gget/references/workflows.md +814 -0
  366. package/bin/skills/gget/scripts/batch_sequence_analysis.py +191 -0
  367. package/bin/skills/gget/scripts/enrichment_pipeline.py +235 -0
  368. package/bin/skills/gget/scripts/gene_analysis.py +161 -0
  369. package/bin/skills/gtars/SKILL.md +285 -0
  370. package/bin/skills/gtars/references/cli.md +222 -0
  371. package/bin/skills/gtars/references/coverage.md +172 -0
  372. package/bin/skills/gtars/references/overlap.md +156 -0
  373. package/bin/skills/gtars/references/python-api.md +211 -0
  374. package/bin/skills/gtars/references/refget.md +147 -0
  375. package/bin/skills/gtars/references/tokenizers.md +103 -0
  376. package/bin/skills/gwas-database/SKILL.md +608 -0
  377. package/bin/skills/gwas-database/references/api_reference.md +793 -0
  378. package/bin/skills/histolab/SKILL.md +678 -0
  379. package/bin/skills/histolab/references/filters_preprocessing.md +514 -0
  380. package/bin/skills/histolab/references/slide_management.md +172 -0
  381. package/bin/skills/histolab/references/tile_extraction.md +421 -0
  382. package/bin/skills/histolab/references/tissue_masks.md +251 -0
  383. package/bin/skills/histolab/references/visualization.md +547 -0
  384. package/bin/skills/hmdb-database/SKILL.md +196 -0
  385. package/bin/skills/hmdb-database/references/hmdb_data_fields.md +267 -0
  386. package/bin/skills/hypogenic/SKILL.md +655 -0
  387. package/bin/skills/hypogenic/references/config_template.yaml +150 -0
  388. package/bin/skills/imaging-data-commons/SKILL.md +1182 -0
  389. package/bin/skills/imaging-data-commons/references/bigquery_guide.md +556 -0
  390. package/bin/skills/imaging-data-commons/references/cli_guide.md +272 -0
  391. package/bin/skills/imaging-data-commons/references/cloud_storage_guide.md +333 -0
  392. package/bin/skills/imaging-data-commons/references/dicomweb_guide.md +399 -0
  393. package/bin/skills/infographics/SKILL.md +563 -0
  394. package/bin/skills/infographics/references/color_palettes.md +496 -0
  395. package/bin/skills/infographics/references/design_principles.md +636 -0
  396. package/bin/skills/infographics/references/infographic_types.md +907 -0
  397. package/bin/skills/infographics/scripts/generate_infographic.py +234 -0
  398. package/bin/skills/infographics/scripts/generate_infographic_ai.py +1290 -0
  399. package/bin/skills/iso-13485-certification/SKILL.md +680 -0
  400. package/bin/skills/iso-13485-certification/assets/templates/procedures/CAPA-procedure-template.md +453 -0
  401. package/bin/skills/iso-13485-certification/assets/templates/procedures/document-control-procedure-template.md +567 -0
  402. package/bin/skills/iso-13485-certification/assets/templates/quality-manual-template.md +521 -0
  403. package/bin/skills/iso-13485-certification/references/gap-analysis-checklist.md +568 -0
  404. package/bin/skills/iso-13485-certification/references/iso-13485-requirements.md +610 -0
  405. package/bin/skills/iso-13485-certification/references/mandatory-documents.md +606 -0
  406. package/bin/skills/iso-13485-certification/references/quality-manual-guide.md +688 -0
  407. package/bin/skills/iso-13485-certification/scripts/gap_analyzer.py +440 -0
  408. package/bin/skills/kegg-database/SKILL.md +377 -0
  409. package/bin/skills/kegg-database/references/kegg_reference.md +326 -0
  410. package/bin/skills/kegg-database/scripts/kegg_api.py +251 -0
  411. package/bin/skills/labarchive-integration/SKILL.md +268 -0
  412. package/bin/skills/labarchive-integration/references/api_reference.md +342 -0
  413. package/bin/skills/labarchive-integration/references/authentication_guide.md +357 -0
  414. package/bin/skills/labarchive-integration/references/integrations.md +425 -0
  415. package/bin/skills/labarchive-integration/scripts/entry_operations.py +334 -0
  416. package/bin/skills/labarchive-integration/scripts/notebook_operations.py +269 -0
  417. package/bin/skills/labarchive-integration/scripts/setup_config.py +205 -0
  418. package/bin/skills/lamindb/SKILL.md +390 -0
  419. package/bin/skills/lamindb/references/annotation-validation.md +513 -0
  420. package/bin/skills/lamindb/references/core-concepts.md +380 -0
  421. package/bin/skills/lamindb/references/data-management.md +433 -0
  422. package/bin/skills/lamindb/references/integrations.md +642 -0
  423. package/bin/skills/lamindb/references/ontologies.md +497 -0
  424. package/bin/skills/lamindb/references/setup-deployment.md +733 -0
  425. package/bin/skills/latchbio-integration/SKILL.md +353 -0
  426. package/bin/skills/latchbio-integration/references/data-management.md +427 -0
  427. package/bin/skills/latchbio-integration/references/resource-configuration.md +429 -0
  428. package/bin/skills/latchbio-integration/references/verified-workflows.md +487 -0
  429. package/bin/skills/latchbio-integration/references/workflow-creation.md +254 -0
  430. package/bin/skills/matchms/SKILL.md +203 -0
  431. package/bin/skills/matchms/references/filtering.md +288 -0
  432. package/bin/skills/matchms/references/importing_exporting.md +416 -0
  433. package/bin/skills/matchms/references/similarity.md +380 -0
  434. package/bin/skills/matchms/references/workflows.md +647 -0
  435. package/bin/skills/matlab/SKILL.md +376 -0
  436. package/bin/skills/matlab/references/data-import-export.md +479 -0
  437. package/bin/skills/matlab/references/executing-scripts.md +444 -0
  438. package/bin/skills/matlab/references/graphics-visualization.md +579 -0
  439. package/bin/skills/matlab/references/mathematics.md +553 -0
  440. package/bin/skills/matlab/references/matrices-arrays.md +349 -0
  441. package/bin/skills/matlab/references/octave-compatibility.md +544 -0
  442. package/bin/skills/matlab/references/programming.md +672 -0
  443. package/bin/skills/matlab/references/python-integration.md +433 -0
  444. package/bin/skills/matplotlib/SKILL.md +361 -0
  445. package/bin/skills/matplotlib/references/api_reference.md +412 -0
  446. package/bin/skills/matplotlib/references/common_issues.md +563 -0
  447. package/bin/skills/matplotlib/references/plot_types.md +476 -0
  448. package/bin/skills/matplotlib/references/styling_guide.md +589 -0
  449. package/bin/skills/matplotlib/scripts/plot_template.py +401 -0
  450. package/bin/skills/matplotlib/scripts/style_configurator.py +409 -0
  451. package/bin/skills/medchem/SKILL.md +406 -0
  452. package/bin/skills/medchem/references/api_guide.md +600 -0
  453. package/bin/skills/medchem/references/rules_catalog.md +604 -0
  454. package/bin/skills/medchem/scripts/filter_molecules.py +418 -0
  455. package/bin/skills/metabolomics-workbench-database/SKILL.md +259 -0
  456. package/bin/skills/metabolomics-workbench-database/references/api_reference.md +494 -0
  457. package/bin/skills/modal-research-gpu/SKILL.md +238 -0
  458. package/bin/skills/molfeat/SKILL.md +511 -0
  459. package/bin/skills/molfeat/references/api_reference.md +428 -0
  460. package/bin/skills/molfeat/references/available_featurizers.md +333 -0
  461. package/bin/skills/molfeat/references/examples.md +723 -0
  462. package/bin/skills/networkx/SKILL.md +437 -0
  463. package/bin/skills/networkx/references/algorithms.md +383 -0
  464. package/bin/skills/networkx/references/generators.md +378 -0
  465. package/bin/skills/networkx/references/graph-basics.md +283 -0
  466. package/bin/skills/networkx/references/io.md +441 -0
  467. package/bin/skills/networkx/references/visualization.md +529 -0
  468. package/bin/skills/neurokit2/SKILL.md +356 -0
  469. package/bin/skills/neurokit2/references/bio_module.md +417 -0
  470. package/bin/skills/neurokit2/references/complexity.md +715 -0
  471. package/bin/skills/neurokit2/references/ecg_cardiac.md +355 -0
  472. package/bin/skills/neurokit2/references/eda.md +497 -0
  473. package/bin/skills/neurokit2/references/eeg.md +506 -0
  474. package/bin/skills/neurokit2/references/emg.md +408 -0
  475. package/bin/skills/neurokit2/references/eog.md +407 -0
  476. package/bin/skills/neurokit2/references/epochs_events.md +471 -0
  477. package/bin/skills/neurokit2/references/hrv.md +480 -0
  478. package/bin/skills/neurokit2/references/ppg.md +413 -0
  479. package/bin/skills/neurokit2/references/rsp.md +510 -0
  480. package/bin/skills/neurokit2/references/signal_processing.md +648 -0
  481. package/bin/skills/neuropixels-analysis/SKILL.md +350 -0
  482. package/bin/skills/neuropixels-analysis/assets/analysis_template.py +271 -0
  483. package/bin/skills/neuropixels-analysis/references/AI_CURATION.md +345 -0
  484. package/bin/skills/neuropixels-analysis/references/ANALYSIS.md +392 -0
  485. package/bin/skills/neuropixels-analysis/references/AUTOMATED_CURATION.md +358 -0
  486. package/bin/skills/neuropixels-analysis/references/MOTION_CORRECTION.md +323 -0
  487. package/bin/skills/neuropixels-analysis/references/PREPROCESSING.md +273 -0
  488. package/bin/skills/neuropixels-analysis/references/QUALITY_METRICS.md +359 -0
  489. package/bin/skills/neuropixels-analysis/references/SPIKE_SORTING.md +339 -0
  490. package/bin/skills/neuropixels-analysis/references/api_reference.md +415 -0
  491. package/bin/skills/neuropixels-analysis/references/plotting_guide.md +454 -0
  492. package/bin/skills/neuropixels-analysis/references/standard_workflow.md +385 -0
  493. package/bin/skills/neuropixels-analysis/scripts/compute_metrics.py +178 -0
  494. package/bin/skills/neuropixels-analysis/scripts/explore_recording.py +168 -0
  495. package/bin/skills/neuropixels-analysis/scripts/export_to_phy.py +79 -0
  496. package/bin/skills/neuropixels-analysis/scripts/neuropixels_pipeline.py +432 -0
  497. package/bin/skills/neuropixels-analysis/scripts/preprocess_recording.py +122 -0
  498. package/bin/skills/neuropixels-analysis/scripts/run_sorting.py +98 -0
  499. package/bin/skills/offer-k-dense-web/SKILL.md +21 -0
  500. package/bin/skills/omero-integration/SKILL.md +251 -0
  501. package/bin/skills/omero-integration/references/advanced.md +631 -0
  502. package/bin/skills/omero-integration/references/connection.md +369 -0
  503. package/bin/skills/omero-integration/references/data_access.md +544 -0
  504. package/bin/skills/omero-integration/references/image_processing.md +665 -0
  505. package/bin/skills/omero-integration/references/metadata.md +688 -0
  506. package/bin/skills/omero-integration/references/rois.md +648 -0
  507. package/bin/skills/omero-integration/references/scripts.md +637 -0
  508. package/bin/skills/omero-integration/references/tables.md +532 -0
  509. package/bin/skills/openalex-database/SKILL.md +494 -0
  510. package/bin/skills/openalex-database/references/api_guide.md +371 -0
  511. package/bin/skills/openalex-database/references/common_queries.md +381 -0
  512. package/bin/skills/openalex-database/scripts/openalex_client.py +337 -0
  513. package/bin/skills/openalex-database/scripts/query_helpers.py +306 -0
  514. package/bin/skills/opentargets-database/SKILL.md +373 -0
  515. package/bin/skills/opentargets-database/references/api_reference.md +249 -0
  516. package/bin/skills/opentargets-database/references/evidence_types.md +306 -0
  517. package/bin/skills/opentargets-database/references/target_annotations.md +401 -0
  518. package/bin/skills/opentargets-database/scripts/query_opentargets.py +403 -0
  519. package/bin/skills/opentrons-integration/SKILL.md +573 -0
  520. package/bin/skills/opentrons-integration/references/api_reference.md +366 -0
  521. package/bin/skills/opentrons-integration/scripts/basic_protocol_template.py +67 -0
  522. package/bin/skills/opentrons-integration/scripts/pcr_setup_template.py +154 -0
  523. package/bin/skills/opentrons-integration/scripts/serial_dilution_template.py +96 -0
  524. package/bin/skills/pathml/SKILL.md +166 -0
  525. package/bin/skills/pathml/references/data_management.md +742 -0
  526. package/bin/skills/pathml/references/graphs.md +653 -0
  527. package/bin/skills/pathml/references/image_loading.md +448 -0
  528. package/bin/skills/pathml/references/machine_learning.md +725 -0
  529. package/bin/skills/pathml/references/multiparametric.md +686 -0
  530. package/bin/skills/pathml/references/preprocessing.md +722 -0
  531. package/bin/skills/pdb-database/SKILL.md +309 -0
  532. package/bin/skills/pdb-database/references/api_reference.md +617 -0
  533. package/bin/skills/pennylane/SKILL.md +226 -0
  534. package/bin/skills/pennylane/references/advanced_features.md +667 -0
  535. package/bin/skills/pennylane/references/devices_backends.md +596 -0
  536. package/bin/skills/pennylane/references/getting_started.md +227 -0
  537. package/bin/skills/pennylane/references/optimization.md +671 -0
  538. package/bin/skills/pennylane/references/quantum_chemistry.md +567 -0
  539. package/bin/skills/pennylane/references/quantum_circuits.md +437 -0
  540. package/bin/skills/pennylane/references/quantum_ml.md +571 -0
  541. package/bin/skills/perplexity-search/SKILL.md +448 -0
  542. package/bin/skills/perplexity-search/assets/.env.example +16 -0
  543. package/bin/skills/perplexity-search/references/model_comparison.md +386 -0
  544. package/bin/skills/perplexity-search/references/openrouter_setup.md +454 -0
  545. package/bin/skills/perplexity-search/references/search_strategies.md +258 -0
  546. package/bin/skills/perplexity-search/scripts/perplexity_search.py +277 -0
  547. package/bin/skills/perplexity-search/scripts/setup_env.py +171 -0
  548. package/bin/skills/plotly/SKILL.md +267 -0
  549. package/bin/skills/plotly/references/chart-types.md +488 -0
  550. package/bin/skills/plotly/references/export-interactivity.md +453 -0
  551. package/bin/skills/plotly/references/graph-objects.md +302 -0
  552. package/bin/skills/plotly/references/layouts-styling.md +457 -0
  553. package/bin/skills/plotly/references/plotly-express.md +213 -0
  554. package/bin/skills/polars/SKILL.md +387 -0
  555. package/bin/skills/polars/references/best_practices.md +649 -0
  556. package/bin/skills/polars/references/core_concepts.md +378 -0
  557. package/bin/skills/polars/references/io_guide.md +557 -0
  558. package/bin/skills/polars/references/operations.md +602 -0
  559. package/bin/skills/polars/references/pandas_migration.md +417 -0
  560. package/bin/skills/polars/references/transformations.md +549 -0
  561. package/bin/skills/protocolsio-integration/SKILL.md +421 -0
  562. package/bin/skills/protocolsio-integration/references/additional_features.md +387 -0
  563. package/bin/skills/protocolsio-integration/references/authentication.md +100 -0
  564. package/bin/skills/protocolsio-integration/references/discussions.md +225 -0
  565. package/bin/skills/protocolsio-integration/references/file_manager.md +412 -0
  566. package/bin/skills/protocolsio-integration/references/protocols_api.md +294 -0
  567. package/bin/skills/protocolsio-integration/references/workspaces.md +293 -0
  568. package/bin/skills/pubchem-database/SKILL.md +574 -0
  569. package/bin/skills/pubchem-database/references/api_reference.md +440 -0
  570. package/bin/skills/pubchem-database/scripts/bioactivity_query.py +367 -0
  571. package/bin/skills/pubchem-database/scripts/compound_search.py +297 -0
  572. package/bin/skills/pubmed-database/SKILL.md +460 -0
  573. package/bin/skills/pubmed-database/references/api_reference.md +298 -0
  574. package/bin/skills/pubmed-database/references/common_queries.md +453 -0
  575. package/bin/skills/pubmed-database/references/search_syntax.md +436 -0
  576. package/bin/skills/pufferlib/SKILL.md +436 -0
  577. package/bin/skills/pufferlib/references/environments.md +508 -0
  578. package/bin/skills/pufferlib/references/integration.md +621 -0
  579. package/bin/skills/pufferlib/references/policies.md +653 -0
  580. package/bin/skills/pufferlib/references/training.md +360 -0
  581. package/bin/skills/pufferlib/references/vectorization.md +557 -0
  582. package/bin/skills/pufferlib/scripts/env_template.py +340 -0
  583. package/bin/skills/pufferlib/scripts/train_template.py +239 -0
  584. package/bin/skills/pydeseq2/SKILL.md +559 -0
  585. package/bin/skills/pydeseq2/references/api_reference.md +228 -0
  586. package/bin/skills/pydeseq2/references/workflow_guide.md +582 -0
  587. package/bin/skills/pydeseq2/scripts/run_deseq2_analysis.py +353 -0
  588. package/bin/skills/pydicom/SKILL.md +434 -0
  589. package/bin/skills/pydicom/references/common_tags.md +228 -0
  590. package/bin/skills/pydicom/references/transfer_syntaxes.md +352 -0
  591. package/bin/skills/pydicom/scripts/anonymize_dicom.py +137 -0
  592. package/bin/skills/pydicom/scripts/dicom_to_image.py +172 -0
  593. package/bin/skills/pydicom/scripts/extract_metadata.py +173 -0
  594. package/bin/skills/pyhealth/SKILL.md +491 -0
  595. package/bin/skills/pyhealth/references/datasets.md +178 -0
  596. package/bin/skills/pyhealth/references/medical_coding.md +284 -0
  597. package/bin/skills/pyhealth/references/models.md +594 -0
  598. package/bin/skills/pyhealth/references/preprocessing.md +638 -0
  599. package/bin/skills/pyhealth/references/tasks.md +379 -0
  600. package/bin/skills/pyhealth/references/training_evaluation.md +648 -0
  601. package/bin/skills/pylabrobot/SKILL.md +185 -0
  602. package/bin/skills/pylabrobot/references/analytical-equipment.md +464 -0
  603. package/bin/skills/pylabrobot/references/hardware-backends.md +480 -0
  604. package/bin/skills/pylabrobot/references/liquid-handling.md +403 -0
  605. package/bin/skills/pylabrobot/references/material-handling.md +620 -0
  606. package/bin/skills/pylabrobot/references/resources.md +489 -0
  607. package/bin/skills/pylabrobot/references/visualization.md +532 -0
  608. package/bin/skills/pymatgen/SKILL.md +691 -0
  609. package/bin/skills/pymatgen/references/analysis_modules.md +530 -0
  610. package/bin/skills/pymatgen/references/core_classes.md +318 -0
  611. package/bin/skills/pymatgen/references/io_formats.md +469 -0
  612. package/bin/skills/pymatgen/references/materials_project_api.md +517 -0
  613. package/bin/skills/pymatgen/references/transformations_workflows.md +591 -0
  614. package/bin/skills/pymatgen/scripts/phase_diagram_generator.py +233 -0
  615. package/bin/skills/pymatgen/scripts/structure_analyzer.py +266 -0
  616. package/bin/skills/pymatgen/scripts/structure_converter.py +169 -0
  617. package/bin/skills/pymc/SKILL.md +572 -0
  618. package/bin/skills/pymc/assets/hierarchical_model_template.py +333 -0
  619. package/bin/skills/pymc/assets/linear_regression_template.py +241 -0
  620. package/bin/skills/pymc/references/distributions.md +320 -0
  621. package/bin/skills/pymc/references/sampling_inference.md +424 -0
  622. package/bin/skills/pymc/references/workflows.md +526 -0
  623. package/bin/skills/pymc/scripts/model_comparison.py +387 -0
  624. package/bin/skills/pymc/scripts/model_diagnostics.py +350 -0
  625. package/bin/skills/pymoo/SKILL.md +571 -0
  626. package/bin/skills/pymoo/references/algorithms.md +180 -0
  627. package/bin/skills/pymoo/references/constraints_mcdm.md +417 -0
  628. package/bin/skills/pymoo/references/operators.md +345 -0
  629. package/bin/skills/pymoo/references/problems.md +265 -0
  630. package/bin/skills/pymoo/references/visualization.md +353 -0
  631. package/bin/skills/pymoo/scripts/custom_problem_example.py +181 -0
  632. package/bin/skills/pymoo/scripts/decision_making_example.py +161 -0
  633. package/bin/skills/pymoo/scripts/many_objective_example.py +72 -0
  634. package/bin/skills/pymoo/scripts/multi_objective_example.py +63 -0
  635. package/bin/skills/pymoo/scripts/single_objective_example.py +59 -0
  636. package/bin/skills/pyopenms/SKILL.md +217 -0
  637. package/bin/skills/pyopenms/references/data_structures.md +497 -0
  638. package/bin/skills/pyopenms/references/feature_detection.md +410 -0
  639. package/bin/skills/pyopenms/references/file_io.md +349 -0
  640. package/bin/skills/pyopenms/references/identification.md +422 -0
  641. package/bin/skills/pyopenms/references/metabolomics.md +482 -0
  642. package/bin/skills/pyopenms/references/signal_processing.md +433 -0
  643. package/bin/skills/pysam/SKILL.md +265 -0
  644. package/bin/skills/pysam/references/alignment_files.md +280 -0
  645. package/bin/skills/pysam/references/common_workflows.md +520 -0
  646. package/bin/skills/pysam/references/sequence_files.md +407 -0
  647. package/bin/skills/pysam/references/variant_files.md +365 -0
  648. package/bin/skills/pytdc/SKILL.md +460 -0
  649. package/bin/skills/pytdc/references/datasets.md +246 -0
  650. package/bin/skills/pytdc/references/oracles.md +400 -0
  651. package/bin/skills/pytdc/references/utilities.md +684 -0
  652. package/bin/skills/pytdc/scripts/benchmark_evaluation.py +327 -0
  653. package/bin/skills/pytdc/scripts/load_and_split_data.py +214 -0
  654. package/bin/skills/pytdc/scripts/molecular_generation.py +404 -0
  655. package/bin/skills/qiskit/SKILL.md +275 -0
  656. package/bin/skills/qiskit/references/algorithms.md +607 -0
  657. package/bin/skills/qiskit/references/backends.md +433 -0
  658. package/bin/skills/qiskit/references/circuits.md +197 -0
  659. package/bin/skills/qiskit/references/patterns.md +533 -0
  660. package/bin/skills/qiskit/references/primitives.md +277 -0
  661. package/bin/skills/qiskit/references/setup.md +99 -0
  662. package/bin/skills/qiskit/references/transpilation.md +286 -0
  663. package/bin/skills/qiskit/references/visualization.md +415 -0
  664. package/bin/skills/qutip/SKILL.md +318 -0
  665. package/bin/skills/qutip/references/advanced.md +555 -0
  666. package/bin/skills/qutip/references/analysis.md +523 -0
  667. package/bin/skills/qutip/references/core_concepts.md +293 -0
  668. package/bin/skills/qutip/references/time_evolution.md +348 -0
  669. package/bin/skills/qutip/references/visualization.md +431 -0
  670. package/bin/skills/rdkit/SKILL.md +780 -0
  671. package/bin/skills/rdkit/references/api_reference.md +432 -0
  672. package/bin/skills/rdkit/references/descriptors_reference.md +595 -0
  673. package/bin/skills/rdkit/references/smarts_patterns.md +668 -0
  674. package/bin/skills/rdkit/scripts/molecular_properties.py +243 -0
  675. package/bin/skills/rdkit/scripts/similarity_search.py +297 -0
  676. package/bin/skills/rdkit/scripts/substructure_filter.py +386 -0
  677. package/bin/skills/reactome-database/SKILL.md +278 -0
  678. package/bin/skills/reactome-database/references/api_reference.md +465 -0
  679. package/bin/skills/reactome-database/scripts/reactome_query.py +286 -0
  680. package/bin/skills/rowan/SKILL.md +427 -0
  681. package/bin/skills/rowan/references/api_reference.md +413 -0
  682. package/bin/skills/rowan/references/molecule_handling.md +429 -0
  683. package/bin/skills/rowan/references/proteins_and_organization.md +499 -0
  684. package/bin/skills/rowan/references/rdkit_native.md +438 -0
  685. package/bin/skills/rowan/references/results_interpretation.md +481 -0
  686. package/bin/skills/rowan/references/workflow_types.md +591 -0
  687. package/bin/skills/scanpy/SKILL.md +386 -0
  688. package/bin/skills/scanpy/assets/analysis_template.py +295 -0
  689. package/bin/skills/scanpy/references/api_reference.md +251 -0
  690. package/bin/skills/scanpy/references/plotting_guide.md +352 -0
  691. package/bin/skills/scanpy/references/standard_workflow.md +206 -0
  692. package/bin/skills/scanpy/scripts/qc_analysis.py +200 -0
  693. package/bin/skills/scientific-brainstorming/SKILL.md +191 -0
  694. package/bin/skills/scientific-brainstorming/references/brainstorming_methods.md +326 -0
  695. package/bin/skills/scientific-visualization/SKILL.md +779 -0
  696. package/bin/skills/scientific-visualization/assets/color_palettes.py +197 -0
  697. package/bin/skills/scientific-visualization/assets/nature.mplstyle +63 -0
  698. package/bin/skills/scientific-visualization/assets/presentation.mplstyle +61 -0
  699. package/bin/skills/scientific-visualization/assets/publication.mplstyle +68 -0
  700. package/bin/skills/scientific-visualization/references/color_palettes.md +348 -0
  701. package/bin/skills/scientific-visualization/references/journal_requirements.md +320 -0
  702. package/bin/skills/scientific-visualization/references/matplotlib_examples.md +620 -0
  703. package/bin/skills/scientific-visualization/references/publication_guidelines.md +205 -0
  704. package/bin/skills/scientific-visualization/scripts/figure_export.py +343 -0
  705. package/bin/skills/scientific-visualization/scripts/style_presets.py +416 -0
  706. package/bin/skills/scikit-bio/SKILL.md +437 -0
  707. package/bin/skills/scikit-bio/references/api_reference.md +749 -0
  708. package/bin/skills/scikit-learn/SKILL.md +521 -0
  709. package/bin/skills/scikit-learn/references/model_evaluation.md +592 -0
  710. package/bin/skills/scikit-learn/references/pipelines_and_composition.md +612 -0
  711. package/bin/skills/scikit-learn/references/preprocessing.md +606 -0
  712. package/bin/skills/scikit-learn/references/quick_reference.md +433 -0
  713. package/bin/skills/scikit-learn/references/supervised_learning.md +378 -0
  714. package/bin/skills/scikit-learn/references/unsupervised_learning.md +505 -0
  715. package/bin/skills/scikit-learn/scripts/classification_pipeline.py +257 -0
  716. package/bin/skills/scikit-learn/scripts/clustering_analysis.py +386 -0
  717. package/bin/skills/scikit-survival/SKILL.md +399 -0
  718. package/bin/skills/scikit-survival/references/competing-risks.md +397 -0
  719. package/bin/skills/scikit-survival/references/cox-models.md +182 -0
  720. package/bin/skills/scikit-survival/references/data-handling.md +494 -0
  721. package/bin/skills/scikit-survival/references/ensemble-models.md +327 -0
  722. package/bin/skills/scikit-survival/references/evaluation-metrics.md +378 -0
  723. package/bin/skills/scikit-survival/references/svm-models.md +411 -0
  724. package/bin/skills/scvi-tools/SKILL.md +190 -0
  725. package/bin/skills/scvi-tools/references/differential-expression.md +581 -0
  726. package/bin/skills/scvi-tools/references/models-atac-seq.md +321 -0
  727. package/bin/skills/scvi-tools/references/models-multimodal.md +367 -0
  728. package/bin/skills/scvi-tools/references/models-scrna-seq.md +330 -0
  729. package/bin/skills/scvi-tools/references/models-spatial.md +438 -0
  730. package/bin/skills/scvi-tools/references/models-specialized.md +408 -0
  731. package/bin/skills/scvi-tools/references/theoretical-foundations.md +438 -0
  732. package/bin/skills/scvi-tools/references/workflows.md +546 -0
  733. package/bin/skills/seaborn/SKILL.md +673 -0
  734. package/bin/skills/seaborn/references/examples.md +822 -0
  735. package/bin/skills/seaborn/references/function_reference.md +770 -0
  736. package/bin/skills/seaborn/references/objects_interface.md +964 -0
  737. package/bin/skills/shap/SKILL.md +566 -0
  738. package/bin/skills/shap/references/explainers.md +339 -0
  739. package/bin/skills/shap/references/plots.md +507 -0
  740. package/bin/skills/shap/references/theory.md +449 -0
  741. package/bin/skills/shap/references/workflows.md +605 -0
  742. package/bin/skills/simpy/SKILL.md +429 -0
  743. package/bin/skills/simpy/references/events.md +374 -0
  744. package/bin/skills/simpy/references/monitoring.md +475 -0
  745. package/bin/skills/simpy/references/process-interaction.md +424 -0
  746. package/bin/skills/simpy/references/real-time.md +395 -0
  747. package/bin/skills/simpy/references/resources.md +275 -0
  748. package/bin/skills/simpy/scripts/basic_simulation_template.py +193 -0
  749. package/bin/skills/simpy/scripts/resource_monitor.py +345 -0
  750. package/bin/skills/stable-baselines3/SKILL.md +299 -0
  751. package/bin/skills/stable-baselines3/references/algorithms.md +333 -0
  752. package/bin/skills/stable-baselines3/references/callbacks.md +556 -0
  753. package/bin/skills/stable-baselines3/references/custom_environments.md +526 -0
  754. package/bin/skills/stable-baselines3/references/vectorized_envs.md +568 -0
  755. package/bin/skills/stable-baselines3/scripts/custom_env_template.py +314 -0
  756. package/bin/skills/stable-baselines3/scripts/evaluate_agent.py +245 -0
  757. package/bin/skills/stable-baselines3/scripts/train_rl_agent.py +165 -0
  758. package/bin/skills/statistical-analysis/SKILL.md +632 -0
  759. package/bin/skills/statistical-analysis/references/assumptions_and_diagnostics.md +369 -0
  760. package/bin/skills/statistical-analysis/references/bayesian_statistics.md +661 -0
  761. package/bin/skills/statistical-analysis/references/effect_sizes_and_power.md +581 -0
  762. package/bin/skills/statistical-analysis/references/reporting_standards.md +469 -0
  763. package/bin/skills/statistical-analysis/references/test_selection_guide.md +129 -0
  764. package/bin/skills/statistical-analysis/scripts/assumption_checks.py +539 -0
  765. package/bin/skills/statsmodels/SKILL.md +614 -0
  766. package/bin/skills/statsmodels/references/discrete_choice.md +669 -0
  767. package/bin/skills/statsmodels/references/glm.md +619 -0
  768. package/bin/skills/statsmodels/references/linear_models.md +447 -0
  769. package/bin/skills/statsmodels/references/stats_diagnostics.md +859 -0
  770. package/bin/skills/statsmodels/references/time_series.md +716 -0
  771. package/bin/skills/string-database/SKILL.md +534 -0
  772. package/bin/skills/string-database/references/string_reference.md +455 -0
  773. package/bin/skills/string-database/scripts/string_api.py +369 -0
  774. package/bin/skills/sympy/SKILL.md +500 -0
  775. package/bin/skills/sympy/references/advanced-topics.md +635 -0
  776. package/bin/skills/sympy/references/code-generation-printing.md +599 -0
  777. package/bin/skills/sympy/references/core-capabilities.md +348 -0
  778. package/bin/skills/sympy/references/matrices-linear-algebra.md +526 -0
  779. package/bin/skills/sympy/references/physics-mechanics.md +592 -0
  780. package/bin/skills/torch_geometric/SKILL.md +676 -0
  781. package/bin/skills/torch_geometric/references/datasets_reference.md +574 -0
  782. package/bin/skills/torch_geometric/references/layers_reference.md +485 -0
  783. package/bin/skills/torch_geometric/references/transforms_reference.md +679 -0
  784. package/bin/skills/torch_geometric/scripts/benchmark_model.py +309 -0
  785. package/bin/skills/torch_geometric/scripts/create_gnn_template.py +529 -0
  786. package/bin/skills/torch_geometric/scripts/visualize_graph.py +313 -0
  787. package/bin/skills/torchdrug/SKILL.md +450 -0
  788. package/bin/skills/torchdrug/references/core_concepts.md +565 -0
  789. package/bin/skills/torchdrug/references/datasets.md +380 -0
  790. package/bin/skills/torchdrug/references/knowledge_graphs.md +320 -0
  791. package/bin/skills/torchdrug/references/models_architectures.md +541 -0
  792. package/bin/skills/torchdrug/references/molecular_generation.md +352 -0
  793. package/bin/skills/torchdrug/references/molecular_property_prediction.md +169 -0
  794. package/bin/skills/torchdrug/references/protein_modeling.md +272 -0
  795. package/bin/skills/torchdrug/references/retrosynthesis.md +436 -0
  796. package/bin/skills/transformers/SKILL.md +164 -0
  797. package/bin/skills/transformers/references/generation.md +467 -0
  798. package/bin/skills/transformers/references/models.md +361 -0
  799. package/bin/skills/transformers/references/pipelines.md +335 -0
  800. package/bin/skills/transformers/references/tokenizers.md +447 -0
  801. package/bin/skills/transformers/references/training.md +500 -0
  802. package/bin/skills/umap-learn/SKILL.md +479 -0
  803. package/bin/skills/umap-learn/references/api_reference.md +532 -0
  804. package/bin/skills/uniprot-database/SKILL.md +195 -0
  805. package/bin/skills/uniprot-database/references/api_examples.md +413 -0
  806. package/bin/skills/uniprot-database/references/api_fields.md +275 -0
  807. package/bin/skills/uniprot-database/references/id_mapping_databases.md +285 -0
  808. package/bin/skills/uniprot-database/references/query_syntax.md +256 -0
  809. package/bin/skills/uniprot-database/scripts/uniprot_client.py +341 -0
  810. package/bin/skills/uspto-database/SKILL.md +607 -0
  811. package/bin/skills/uspto-database/references/additional_apis.md +394 -0
  812. package/bin/skills/uspto-database/references/patentsearch_api.md +266 -0
  813. package/bin/skills/uspto-database/references/peds_api.md +212 -0
  814. package/bin/skills/uspto-database/references/trademark_api.md +358 -0
  815. package/bin/skills/uspto-database/scripts/patent_search.py +290 -0
  816. package/bin/skills/uspto-database/scripts/peds_client.py +285 -0
  817. package/bin/skills/uspto-database/scripts/trademark_client.py +311 -0
  818. package/bin/skills/vaex/SKILL.md +182 -0
  819. package/bin/skills/vaex/references/core_dataframes.md +367 -0
  820. package/bin/skills/vaex/references/data_processing.md +555 -0
  821. package/bin/skills/vaex/references/io_operations.md +703 -0
  822. package/bin/skills/vaex/references/machine_learning.md +728 -0
  823. package/bin/skills/vaex/references/performance.md +571 -0
  824. package/bin/skills/vaex/references/visualization.md +613 -0
  825. package/bin/skills/zarr-python/SKILL.md +779 -0
  826. package/bin/skills/zarr-python/references/api_reference.md +515 -0
  827. package/bin/skills/zinc-database/SKILL.md +404 -0
  828. package/bin/skills/zinc-database/references/api_reference.md +692 -0
  829. package/bin/synsc +0 -0
  830. package/package.json +1 -1
@@ -0,0 +1,1053 @@
1
+ """
2
+ Enzyme Pathway Builder for Retrosynthetic Analysis
3
+
4
+ This module provides tools for constructing enzymatic pathways and
5
+ retrosynthetic trees using BRENDA database information.
6
+
7
+ Key features:
8
+ - Find enzymatic pathways for target products
9
+ - Build retrosynthetic trees from products
10
+ - Suggest enzyme substitutions and alternatives
11
+ - Calculate pathway feasibility and thermodynamics
12
+ - Optimize pathway conditions (pH, temperature, cofactors)
13
+ - Generate detailed pathway reports
14
+ - Support for metabolic engineering and synthetic biology
15
+
16
+ Installation:
17
+ uv pip install networkx matplotlib pandas
18
+
19
+ Usage:
20
+ from scripts.enzyme_pathway_builder import find_pathway_for_product, build_retrosynthetic_tree
21
+
22
+ pathway = find_pathway_for_product("lactate", max_steps=3)
23
+ tree = build_retrosynthetic_tree("lactate", depth=2)
24
+ """
25
+
26
+ import re
27
+ import json
28
+ import time
29
+ from typing import List, Dict, Any, Optional, Set, Tuple
30
+ from pathlib import Path
31
+
32
+ try:
33
+ import networkx as nx
34
+ NETWORKX_AVAILABLE = True
35
+ except ImportError:
36
+ print("Warning: networkx not installed. Install with: uv pip install networkx")
37
+ NETWORKX_AVAILABLE = False
38
+
39
+ try:
40
+ import pandas as pd
41
+ PANDAS_AVAILABLE = True
42
+ except ImportError:
43
+ print("Warning: pandas not installed. Install with: uv pip install pandas")
44
+ PANDAS_AVAILABLE = False
45
+
46
+ try:
47
+ import matplotlib.pyplot as plt
48
+ MATPLOTLIB_AVAILABLE = True
49
+ except ImportError:
50
+ print("Warning: matplotlib not installed. Install with: uv pip install matplotlib")
51
+ MATPLOTLIB_AVAILABLE = False
52
+
53
+ try:
54
+ from brenda_queries import (
55
+ search_enzymes_by_product, search_enzymes_by_substrate,
56
+ get_environmental_parameters, compare_across_organisms,
57
+ get_substrate_specificity, get_cofactor_requirements,
58
+ find_thermophilic_homologs, find_ph_stable_variants
59
+ )
60
+ BRENDA_QUERIES_AVAILABLE = True
61
+ except ImportError:
62
+ print("Warning: brenda_queries not available")
63
+ BRENDA_QUERIES_AVAILABLE = False
64
+
65
+
66
+ def validate_dependencies():
67
+ """Validate that required dependencies are installed."""
68
+ missing = []
69
+ if not NETWORKX_AVAILABLE:
70
+ missing.append("networkx")
71
+ if not PANDAS_AVAILABLE:
72
+ missing.append("pandas")
73
+ if not BRENDA_QUERIES_AVAILABLE:
74
+ missing.append("brenda_queries")
75
+ if missing:
76
+ raise ImportError(f"Missing required dependencies: {', '.join(missing)}")
77
+
78
+
79
+ # Common biochemical transformations with typical EC numbers
80
+ COMMON_TRANSFORMATIONS = {
81
+ 'oxidation': ['1.1.1'], # Alcohol dehydrogenases
82
+ 'reduction': ['1.1.1'], # Alcohol dehydrogenases
83
+ 'hydrolysis': ['3.1.1', '3.1.3'], # Esterases, phosphatases
84
+ 'carboxylation': ['6.4.1'], # Carboxylases
85
+ 'decarboxylation': ['4.1.1'], # Decarboxylases
86
+ 'transamination': ['2.6.1'], # Aminotransferases
87
+ 'phosphorylation': ['2.7.1'], # Kinases
88
+ 'dephosphorylation': ['3.1.3'], # Phosphatases
89
+ 'isomerization': ['5.1.1', '5.3.1'], # Isomerases
90
+ 'ligation': ['6.3.1'], # Ligases
91
+ 'transfer': ['2.1.1', '2.2.1', '2.4.1'], # Transferases
92
+ 'hydride_transfer': ['1.1.1', '1.2.1'], # Oxidoreductases
93
+ 'group_transfer': ['2.1.1'], # Methyltransferases
94
+ }
95
+
96
+ # Simple metabolite database (expanded for pathway building)
97
+ METABOLITE_DATABASE = {
98
+ # Primary metabolites
99
+ 'glucose': {'formula': 'C6H12O6', 'mw': 180.16, 'class': 'sugar'},
100
+ 'fructose': {'formula': 'C6H12O6', 'mw': 180.16, 'class': 'sugar'},
101
+ 'galactose': {'formula': 'C6H12O6', 'mw': 180.16, 'class': 'sugar'},
102
+ 'pyruvate': {'formula': 'C3H4O3', 'mw': 90.08, 'class': 'carboxylic_acid'},
103
+ 'lactate': {'formula': 'C3H6O3', 'mw': 90.08, 'class': 'carboxylic_acid'},
104
+ 'acetate': {'formula': 'C2H4O2', 'mw': 60.05, 'class': 'carboxylic_acid'},
105
+ 'ethanol': {'formula': 'C2H6O', 'mw': 46.07, 'class': 'alcohol'},
106
+ 'acetaldehyde': {'formula': 'C2H4O', 'mw': 44.05, 'class': 'aldehyde'},
107
+ 'acetone': {'formula': 'C3H6O', 'mw': 58.08, 'class': 'ketone'},
108
+ 'glycerol': {'formula': 'C3H8O3', 'mw': 92.09, 'class': 'alcohol'},
109
+ 'ammonia': {'formula': 'NH3', 'mw': 17.03, 'class': 'inorganic'},
110
+ 'carbon dioxide': {'formula': 'CO2', 'mw': 44.01, 'class': 'inorganic'},
111
+ 'water': {'formula': 'H2O', 'mw': 18.02, 'class': 'inorganic'},
112
+ 'oxygen': {'formula': 'O2', 'mw': 32.00, 'class': 'inorganic'},
113
+ 'hydrogen': {'formula': 'H2', 'mw': 2.02, 'class': 'inorganic'},
114
+ 'nitrogen': {'formula': 'N2', 'mw': 28.01, 'class': 'inorganic'},
115
+ 'phosphate': {'formula': 'PO4', 'mw': 94.97, 'class': 'inorganic'},
116
+ 'sulfate': {'formula': 'SO4', 'mw': 96.06, 'class': 'inorganic'},
117
+
118
+ # Amino acids
119
+ 'alanine': {'formula': 'C3H7NO2', 'mw': 89.09, 'class': 'amino_acid'},
120
+ 'glycine': {'formula': 'C2H5NO2', 'mw': 75.07, 'class': 'amino_acid'},
121
+ 'serine': {'formula': 'C3H7NO3', 'mw': 105.09, 'class': 'amino_acid'},
122
+ 'threonine': {'formula': 'C4H9NO3', 'mw': 119.12, 'class': 'amino_acid'},
123
+ 'aspartate': {'formula': 'C4H7NO4', 'mw': 133.10, 'class': 'amino_acid'},
124
+ 'glutamate': {'formula': 'C5H9NO4', 'mw': 147.13, 'class': 'amino_acid'},
125
+ 'asparagine': {'formula': 'C4H8N2O3', 'mw': 132.12, 'class': 'amino_acid'},
126
+ 'glutamine': {'formula': 'C5H10N2O3', 'mw': 146.15, 'class': 'amino_acid'},
127
+ 'lysine': {'formula': 'C6H14N2O2', 'mw': 146.19, 'class': 'amino_acid'},
128
+ 'arginine': {'formula': 'C6H14N4O2', 'mw': 174.20, 'class': 'amino_acid'},
129
+ 'histidine': {'formula': 'C6H9N3O2', 'mw': 155.16, 'class': 'amino_acid'},
130
+ 'phenylalanine': {'formula': 'C9H11NO2', 'mw': 165.19, 'class': 'amino_acid'},
131
+ 'tyrosine': {'formula': 'C9H11NO3', 'mw': 181.19, 'class': 'amino_acid'},
132
+ 'tryptophan': {'formula': 'C11H12N2O2', 'mw': 204.23, 'class': 'amino_acid'},
133
+ 'leucine': {'formula': 'C6H13NO2', 'mw': 131.18, 'class': 'amino_acid'},
134
+ 'isoleucine': {'formula': 'C6H13NO2', 'mw': 131.18, 'class': 'amino_acid'},
135
+ 'valine': {'formula': 'C5H11NO2', 'mw': 117.15, 'class': 'amino_acid'},
136
+ 'methionine': {'formula': 'C5H11NO2S', 'mw': 149.21, 'class': 'amino_acid'},
137
+ 'cysteine': {'formula': 'C3H7NO2S', 'mw': 121.16, 'class': 'amino_acid'},
138
+ 'proline': {'formula': 'C5H9NO2', 'mw': 115.13, 'class': 'amino_acid'},
139
+
140
+ # Nucleotides (simplified)
141
+ 'atp': {'formula': 'C10H16N5O13P3', 'mw': 507.18, 'class': 'nucleotide'},
142
+ 'adp': {'formula': 'C10H15N5O10P2', 'mw': 427.20, 'class': 'nucleotide'},
143
+ 'amp': {'formula': 'C10H14N5O7P', 'mw': 347.22, 'class': 'nucleotide'},
144
+ 'nad': {'formula': 'C21H27N7O14P2', 'mw': 663.43, 'class': 'cofactor'},
145
+ 'nadh': {'formula': 'C21H29N7O14P2', 'mw': 665.44, 'class': 'cofactor'},
146
+ 'nadp': {'formula': 'C21H28N7O17P3', 'mw': 743.44, 'class': 'cofactor'},
147
+ 'nadph': {'formula': 'C21H30N7O17P3', 'mw': 745.45, 'class': 'cofactor'},
148
+ 'fadh2': {'formula': 'C21H30N7O14P2', 'mw': 785.55, 'class': 'cofactor'},
149
+ 'fadx': {'formula': 'C21H20N4O2', 'mw': 350.36, 'class': 'cofactor'},
150
+
151
+ # Common organic acids
152
+ 'malate': {'formula': 'C4H6O5', 'mw': 134.09, 'class': 'carboxylic_acid'},
153
+ 'oxaloacetate': {'formula': 'C4H4O5', 'mw': 132.07, 'class': 'carboxylic_acid'},
154
+ 'succinate': {'formula': 'C4H6O4', 'mw': 118.09, 'class': 'carboxylic_acid'},
155
+ 'fumarate': {'formula': 'C4H4O4', 'mw': 116.07, 'class': 'carboxylic_acid'},
156
+ 'oxalosuccinate': {'formula': 'C6H6O7', 'mw': 190.12, 'class': 'carboxylic_acid'},
157
+ 'alpha-ketoglutarate': {'formula': 'C5H6O5', 'mw': 146.11, 'class': 'carboxylic_acid'},
158
+
159
+ # Energy carriers
160
+ 'acetyl-coa': {'formula': 'C23H38N7O17P3S', 'mw': 809.51, 'class': 'cofactor'},
161
+ 'coenzyme-a': {'formula': 'C21H36N7O16P3S', 'mw': 767.54, 'class': 'cofactor'},
162
+ }
163
+
164
+ # Common cofactors and their roles
165
+ COFACTOR_ROLES = {
166
+ 'nad+': {'role': 'oxidation', 'oxidation_state': '+1'},
167
+ 'nadh': {'role': 'reduction', 'oxidation_state': '0'},
168
+ 'nadp+': {'role': 'oxidation', 'oxidation_state': '+1'},
169
+ 'nadph': {'role': 'reduction', 'oxidation_state': '0'},
170
+ 'fadx': {'role': 'oxidation', 'oxidation_state': '0'},
171
+ 'fadh2': {'role': 'reduction', 'oxidation_state': '-2'},
172
+ 'atp': {'role': 'phosphorylation', 'oxidation_state': '0'},
173
+ 'adp': {'role': 'energy', 'oxidation_state': '0'},
174
+ 'amp': {'role': 'energy', 'oxidation_state': '0'},
175
+ 'acetyl-coa': {'role': 'acetylation', 'oxidation_state': '0'},
176
+ 'coenzyme-a': {'role': 'thiolation', 'oxidation_state': '0'},
177
+ }
178
+
179
+
180
+ def identify_metabolite(metabolite_name: str) -> Dict[str, Any]:
181
+ """Identify a metabolite from the database or create entry."""
182
+ metabolite_name = metabolite_name.lower().strip()
183
+
184
+ # Check if it's in the database
185
+ if metabolite_name in METABOLITE_DATABASE:
186
+ return {'name': metabolite_name, **METABOLITE_DATABASE[metabolite_name]}
187
+
188
+ # Simple formula extraction from common patterns
189
+ formula_patterns = {
190
+ r'c(\d+)h(\d+)o(\d+)': lambda m: f"C{m[0]}H{m[1]}O{m[2]}",
191
+ r'c(\d+)h(\d+)n(\d+)o(\d+)': lambda m: f"C{m[0]}H{m[1]}N{m[2]}O{m[3]}",
192
+ }
193
+
194
+ for pattern, formatter in formula_patterns.items():
195
+ match = re.search(pattern, metabolite_name)
196
+ if match:
197
+ formula = formatter(match.groups())
198
+ # Estimate molecular weight (C=12, H=1, N=14, O=16)
199
+ mw = 0
200
+ elements = re.findall(r'([A-Z])(\d*)', formula)
201
+ for elem, count in elements:
202
+ count = int(count) if count else 1
203
+ if elem == 'C':
204
+ mw += count * 12.01
205
+ elif elem == 'H':
206
+ mw += count * 1.008
207
+ elif elem == 'N':
208
+ mw += count * 14.01
209
+ elif elem == 'O':
210
+ mw += count * 16.00
211
+ elif elem == 'P':
212
+ mw += count * 30.97
213
+ elif elem == 'S':
214
+ mw += count * 32.07
215
+
216
+ return {
217
+ 'name': metabolite_name,
218
+ 'formula': formula,
219
+ 'mw': mw,
220
+ 'class': 'unknown'
221
+ }
222
+
223
+ # Fallback - unknown metabolite
224
+ return {
225
+ 'name': metabolite_name,
226
+ 'formula': 'Unknown',
227
+ 'mw': 0,
228
+ 'class': 'unknown'
229
+ }
230
+
231
+
232
+ def infer_transformation_type(substrate: str, product: str) -> List[str]:
233
+ """Infer the type of transformation based on substrate and product."""
234
+ substrate_info = identify_metabolite(substrate)
235
+ product_info = identify_metabolite(product)
236
+
237
+ transformations = []
238
+
239
+ # Check for oxidation/reduction patterns
240
+ if 'alcohol' in substrate_info.get('class', '') and 'carboxylic_acid' in product_info.get('class', ''):
241
+ transformations.append('oxidation')
242
+ elif 'aldehyde' in substrate_info.get('class', '') and 'alcohol' in product_info.get('class', ''):
243
+ transformations.append('reduction')
244
+ elif 'alcohol' in substrate_info.get('class', '') and 'aldehyde' in product_info.get('class', ''):
245
+ transformations.append('oxidation')
246
+
247
+ # Check for phosphorylation/dephosphorylation
248
+ if 'phosphate' in product and 'phosphate' not in substrate:
249
+ transformations.append('phosphorylation')
250
+ elif 'phosphate' in substrate and 'phosphate' not in product:
251
+ transformations.append('dephosphorylation')
252
+
253
+ # Check for carboxylation/decarboxylation
254
+ if 'co2' in product and 'co2' not in substrate:
255
+ transformations.append('carboxylation')
256
+ elif 'co2' in substrate and 'co2' not in product:
257
+ transformations.append('decarboxylation')
258
+
259
+ # Check for hydrolysis (simple heuristic)
260
+ if 'ester' in substrate.lower() and ('carboxylic_acid' in product_info.get('class', '') or 'alcohol' in product_info.get('class', '')):
261
+ transformations.append('hydrolysis')
262
+
263
+ # Check for transamination
264
+ if 'amino_acid' in product_info.get('class', '') and 'amino_acid' not in substrate_info.get('class', ''):
265
+ transformations.append('transamination')
266
+
267
+ # Default to generic transformation
268
+ if not transformations:
269
+ transformations.append('generic')
270
+
271
+ return transformations
272
+
273
+
274
+ def find_enzymes_for_transformation(substrate: str, product: str, limit: int = 10) -> List[Dict[str, Any]]:
275
+ """Find enzymes that catalyze a specific transformation."""
276
+ validate_dependencies()
277
+
278
+ # Infer transformation types
279
+ transformations = infer_transformation_type(substrate, product)
280
+
281
+ all_enzymes = []
282
+
283
+ # Try to find enzymes by product
284
+ try:
285
+ product_enzymes = search_enzymes_by_product(product, limit=limit)
286
+ for enzyme in product_enzymes:
287
+ # Check if substrate is in the reactants
288
+ if substrate.lower() in enzyme.get('reaction', '').lower():
289
+ enzyme['transformation'] = transformations[0] if transformations else 'generic'
290
+ enzyme['substrate'] = substrate
291
+ enzyme['product'] = product
292
+ enzyme['confidence'] = 'high'
293
+ all_enzymes.append(enzyme)
294
+ time.sleep(0.5) # Rate limiting
295
+ except Exception as e:
296
+ print(f"Error searching enzymes by product: {e}")
297
+
298
+ # Try to find enzymes by substrate
299
+ try:
300
+ substrate_enzymes = search_enzymes_by_substrate(substrate, limit=limit)
301
+ for enzyme in substrate_enzymes:
302
+ # Check if product is mentioned in substrate data (limited approach)
303
+ enzyme['transformation'] = transformations[0] if transformations else 'generic'
304
+ enzyme['substrate'] = substrate
305
+ enzyme['product'] = product
306
+ enzyme['confidence'] = 'medium'
307
+ all_enzymes.append(enzyme)
308
+ time.sleep(0.5) # Rate limiting
309
+ except Exception as e:
310
+ print(f"Error searching enzymes by substrate: {e}")
311
+
312
+ # If no enzymes found, try common EC numbers for transformation types
313
+ if not all_enzymes and transformations:
314
+ for trans_type in transformations:
315
+ if trans_type in COMMON_TRANSFORMATIONS:
316
+ for ec_prefix in COMMON_TRANSFORMATIONS[trans_type]:
317
+ # This is a simplified approach - in practice you'd want
318
+ # to query the specific EC numbers with more detail
319
+ try:
320
+ generic_enzymes = search_by_pattern(trans_type, limit=5)
321
+ for enzyme in generic_enzymes:
322
+ enzyme['transformation'] = trans_type
323
+ enzyme['substrate'] = substrate
324
+ enzyme['product'] = product
325
+ enzyme['confidence'] = 'low'
326
+ all_enzymes.append(enzyme)
327
+ time.sleep(0.5)
328
+ break
329
+ except Exception as e:
330
+ print(f"Error searching for transformation type {trans_type}: {e}")
331
+
332
+ # Remove duplicates and sort by confidence
333
+ unique_enzymes = []
334
+ seen = set()
335
+ for enzyme in all_enzymes:
336
+ key = (enzyme.get('ec_number', ''), enzyme.get('organism', ''))
337
+ if key not in seen:
338
+ seen.add(key)
339
+ unique_enzymes.append(enzyme)
340
+
341
+ # Sort by confidence (high > medium > low)
342
+ confidence_order = {'high': 3, 'medium': 2, 'low': 1}
343
+ unique_enzymes.sort(key=lambda x: confidence_order.get(x.get('confidence', 'low'), 0), reverse=True)
344
+
345
+ return unique_enzymes[:limit]
346
+
347
+
348
+ def find_pathway_for_product(product: str, max_steps: int = 3, starting_materials: List[str] = None) -> Dict[str, Any]:
349
+ """Find enzymatic pathways to synthesize a target product."""
350
+ validate_dependencies()
351
+
352
+ if starting_materials is None:
353
+ # Common starting materials
354
+ starting_materials = ['glucose', 'pyruvate', 'acetate', 'ethanol', 'glycerol']
355
+
356
+ pathway = {
357
+ 'target': product,
358
+ 'max_steps': max_steps,
359
+ 'starting_materials': starting_materials,
360
+ 'steps': [],
361
+ 'alternative_pathways': [],
362
+ 'warnings': [],
363
+ 'confidence': 0
364
+ }
365
+
366
+ # Simple breadth-first search for pathway
367
+ from collections import deque
368
+
369
+ queue = deque([(product, 0, [product])]) # (current_metabolite, step_count, pathway)
370
+ visited = set()
371
+
372
+ while queue and len(pathway['steps']) == 0:
373
+ current_metabolite, step_count, current_path = queue.popleft()
374
+
375
+ if current_metabolite in visited or step_count >= max_steps:
376
+ continue
377
+
378
+ visited.add(current_metabolite)
379
+
380
+ # Check if current metabolite is a starting material
381
+ if current_metabolite.lower() in [sm.lower() for sm in starting_materials]:
382
+ # Found a complete pathway
383
+ pathway['steps'] = []
384
+ for i in range(len(current_path) - 1):
385
+ substrate = current_path[i + 1]
386
+ product_step = current_path[i]
387
+ enzymes = find_enzymes_for_transformation(substrate, product_step, limit=5)
388
+
389
+ if enzymes:
390
+ pathway['steps'].append({
391
+ 'step_number': i + 1,
392
+ 'substrate': substrate,
393
+ 'product': product_step,
394
+ 'enzymes': enzymes,
395
+ 'transformation': infer_transformation_type(substrate, product_step)
396
+ })
397
+ else:
398
+ pathway['warnings'].append(f"No enzymes found for step: {substrate} -> {product_step}")
399
+
400
+ pathway['confidence'] = 0.8 # High confidence for found pathway
401
+ break
402
+
403
+ # Try to find enzymes that produce current metabolite
404
+ if step_count < max_steps:
405
+ # Generate possible substrates (simplified - in practice you'd need metabolic knowledge)
406
+ possible_substrates = []
407
+
408
+ # Try common metabolic precursors
409
+ common_precursors = ['glucose', 'pyruvate', 'acetate', 'ethanol', 'acetyl-CoA', 'oxaloacetate']
410
+ for precursor in common_precursors:
411
+ enzymes = find_enzymes_for_transformation(precursor, current_metabolite, limit=2)
412
+ if enzymes:
413
+ possible_substrates.append(precursor)
414
+ pathway['alternative_pathways'].append({
415
+ 'precursor': precursor,
416
+ 'product': current_metabolite,
417
+ 'enzymes': enzymes
418
+ })
419
+
420
+ # Add found substrates to queue
421
+ for substrate in possible_substrates:
422
+ if substrate not in current_path:
423
+ new_path = [substrate] + current_path
424
+ queue.append((substrate, step_count + 1, new_path))
425
+
426
+ time.sleep(0.2) # Rate limiting
427
+
428
+ # If no complete pathway found, create partial pathway
429
+ if not pathway['steps'] and pathway['alternative_pathways']:
430
+ # Create best guess pathway from alternatives
431
+ best_alternative = max(pathway['alternative_pathways'],
432
+ key=lambda x: len(x.get('enzymes', [])))
433
+ pathway['steps'] = [{
434
+ 'step_number': 1,
435
+ 'substrate': best_alternative['precursor'],
436
+ 'product': best_alternative['product'],
437
+ 'enzymes': best_alternative['enzymes'],
438
+ 'transformation': infer_transformation_type(best_alternative['precursor'], best_alternative['product'])
439
+ }]
440
+ pathway['confidence'] = 0.3 # Low confidence for partial pathway
441
+ pathway['warnings'].append("Partial pathway only - complete synthesis route not found")
442
+
443
+ elif not pathway['steps']:
444
+ pathway['warnings'].append("No enzymatic pathway found for target product")
445
+ pathway['confidence'] = 0.1
446
+
447
+ return pathway
448
+
449
+
450
+ def build_retrosynthetic_tree(target: str, depth: int = 2) -> Dict[str, Any]:
451
+ """Build a retrosynthetic tree for a target molecule."""
452
+ validate_dependencies()
453
+
454
+ tree = {
455
+ 'target': target,
456
+ 'depth': depth,
457
+ 'nodes': {target: {'level': 0, 'children': [], 'enzymes': []}},
458
+ 'edges': [],
459
+ 'alternative_routes': []
460
+ }
461
+
462
+ # Build tree recursively
463
+ def build_node_recursive(metabolite: str, current_depth: int, parent: str = None) -> None:
464
+ if current_depth >= depth:
465
+ return
466
+
467
+ # Find enzymes that can produce this metabolite
468
+ potential_precursors = ['glucose', 'pyruvate', 'acetate', 'ethanol', 'acetyl-CoA',
469
+ 'oxaloacetate', 'alpha-ketoglutarate', 'malate']
470
+
471
+ for precursor in potential_precursors:
472
+ enzymes = find_enzymes_for_transformation(precursor, metabolite, limit=3)
473
+
474
+ if enzymes:
475
+ # Add precursor as node if not exists
476
+ if precursor not in tree['nodes']:
477
+ tree['nodes'][precursor] = {
478
+ 'level': current_depth + 1,
479
+ 'children': [],
480
+ 'enzymes': enzymes
481
+ }
482
+ tree['nodes'][metabolite]['children'].append(precursor)
483
+ tree['edges'].append({
484
+ 'from': precursor,
485
+ 'to': metabolite,
486
+ 'enzymes': enzymes,
487
+ 'transformation': infer_transformation_type(precursor, metabolite)
488
+ })
489
+
490
+ # Recursively build tree
491
+ if current_depth + 1 < depth:
492
+ build_node_recursive(precursor, current_depth + 1, metabolite)
493
+
494
+ # Try common metabolic transformations
495
+ if current_depth < depth - 1:
496
+ transformations = ['oxidation', 'reduction', 'hydrolysis', 'carboxylation', 'decarboxylation']
497
+ for trans in transformations:
498
+ try:
499
+ generic_enzymes = search_by_pattern(trans, limit=2)
500
+ if generic_enzymes:
501
+ # Create hypothetical precursor
502
+ hypothetical_precursor = f"precursor_{trans}_{metabolite}"
503
+ tree['nodes'][hypothetical_precursor] = {
504
+ 'level': current_depth + 1,
505
+ 'children': [],
506
+ 'enzymes': generic_enzymes,
507
+ 'hypothetical': True
508
+ }
509
+ tree['nodes'][metabolite]['children'].append(hypothetical_precursor)
510
+ tree['edges'].append({
511
+ 'from': hypothetical_precursor,
512
+ 'to': metabolite,
513
+ 'enzymes': generic_enzymes,
514
+ 'transformation': trans,
515
+ 'hypothetical': True
516
+ })
517
+ except Exception as e:
518
+ print(f"Error in retrosynthetic search for {trans}: {e}")
519
+
520
+ time.sleep(0.3) # Rate limiting
521
+
522
+ # Start building from target
523
+ build_node_recursive(target, 0)
524
+
525
+ # Calculate tree statistics
526
+ tree['total_nodes'] = len(tree['nodes'])
527
+ tree['total_edges'] = len(tree['edges'])
528
+ tree['max_depth'] = max(node['level'] for node in tree['nodes'].values()) if tree['nodes'] else 0
529
+
530
+ return tree
531
+
532
+
533
+ def suggest_enzyme_substitutions(ec_number: str, criteria: Dict[str, Any] = None) -> List[Dict[str, Any]]:
534
+ """Suggest alternative enzymes with improved properties."""
535
+ validate_dependencies()
536
+
537
+ if criteria is None:
538
+ criteria = {
539
+ 'min_temperature': 30,
540
+ 'max_temperature': 70,
541
+ 'min_ph': 6.0,
542
+ 'max_ph': 8.0,
543
+ 'min_thermostability': 40,
544
+ 'prefer_organisms': ['Escherichia coli', 'Saccharomyces cerevisiae', 'Bacillus subtilis']
545
+ }
546
+
547
+ substitutions = []
548
+
549
+ # Get organisms for the target enzyme
550
+ try:
551
+ organisms = compare_across_organisms(ec_number, criteria['prefer_organisms'])
552
+ time.sleep(0.5)
553
+ except Exception as e:
554
+ print(f"Error comparing organisms: {e}")
555
+ organisms = []
556
+
557
+ # Find thermophilic homologs if temperature is a criterion
558
+ if criteria.get('min_thermostability'):
559
+ try:
560
+ thermophilic = find_thermophilic_homologs(ec_number, criteria['min_thermostability'])
561
+ time.sleep(0.5)
562
+
563
+ for enzyme in thermophilic:
564
+ enzyme['substitution_reason'] = f"Thermostable (optimal temp: {enzyme['optimal_temperature']}°C)"
565
+ enzyme['score'] = 8.0 if enzyme['optimal_temperature'] >= criteria['min_thermostability'] else 6.0
566
+ substitutions.append(enzyme)
567
+ except Exception as e:
568
+ print(f"Error finding thermophilic homologs: {e}")
569
+
570
+ # Find pH-stable variants
571
+ if criteria.get('min_ph') or criteria.get('max_ph'):
572
+ try:
573
+ ph_stable = find_ph_stable_variants(ec_number, criteria.get('min_ph'), criteria.get('max_ph'))
574
+ time.sleep(0.5)
575
+
576
+ for enzyme in ph_stable:
577
+ enzyme['substitution_reason'] = f"pH stable ({enzyme['stability_type']} range: {enzyme['ph_range']})"
578
+ enzyme['score'] = 7.5
579
+ substitutions.append(enzyme)
580
+ except Exception as e:
581
+ print(f"Error finding pH-stable variants: {e}")
582
+
583
+ # Add organism comparison results
584
+ for org_data in organisms:
585
+ if org_data.get('data_points', 0) > 0:
586
+ org_data['substitution_reason'] = f"Well-characterized in {org_data['organism']}"
587
+ org_data['score'] = 6.5 if org_data['organism'] in criteria['prefer_organisms'] else 5.0
588
+ substitutions.append(org_data)
589
+
590
+ # Sort by score
591
+ substitutions.sort(key=lambda x: x.get('score', 0), reverse=True)
592
+
593
+ return substitutions[:10] # Return top 10 suggestions
594
+
595
+
596
+ def calculate_pathway_feasibility(pathway: Dict[str, Any]) -> Dict[str, Any]:
597
+ """Calculate feasibility scores and potential issues for a pathway."""
598
+ validate_dependencies()
599
+
600
+ feasibility = {
601
+ 'overall_score': 0,
602
+ 'step_scores': [],
603
+ 'warnings': [],
604
+ 'recommendations': [],
605
+ 'thermodynamic_feasibility': 0,
606
+ 'enzyme_availability': 0,
607
+ 'cofactor_requirements': [],
608
+ 'optimal_conditions': {}
609
+ }
610
+
611
+ if not pathway.get('steps'):
612
+ feasibility['warnings'].append("No steps in pathway")
613
+ feasibility['overall_score'] = 0.1
614
+ return feasibility
615
+
616
+ total_score = 0
617
+ step_scores = []
618
+
619
+ for step in pathway['steps']:
620
+ step_score = 0
621
+ enzymes = step.get('enzymes', [])
622
+
623
+ # Score based on number of available enzymes
624
+ if len(enzymes) >= 3:
625
+ step_score += 3 # Multiple enzyme options
626
+ elif len(enzymes) >= 1:
627
+ step_score += 2 # At least one enzyme
628
+ else:
629
+ step_score += 0 # No enzymes
630
+ feasibility['warnings'].append(f"No enzymes found for step: {step['substrate']} -> {step['product']}")
631
+
632
+ # Score based on enzyme confidence
633
+ if enzymes:
634
+ high_confidence = sum(1 for e in enzymes if e.get('confidence') == 'high')
635
+ confidence_bonus = min(high_confidence, 2) # Max 2 points for confidence
636
+ step_score += confidence_bonus
637
+
638
+ # Check for industrial viability
639
+ industrial_organisms = ['Escherichia coli', 'Saccharomyces cerevisiae', 'Bacillus subtilis']
640
+ industrial_enzymes = sum(1 for e in enzymes if e.get('organism') in industrial_organisms)
641
+ if industrial_enzymes > 0:
642
+ step_score += 1
643
+
644
+ # Cap step score at 5
645
+ step_score = min(step_score, 5)
646
+ step_scores.append(step_score)
647
+ total_score += step_score
648
+
649
+ # Analyze cofactor requirements
650
+ try:
651
+ for enzyme in enzymes:
652
+ ec_number = enzyme.get('ec_number', '')
653
+ if ec_number:
654
+ cofactors = get_cofactor_requirements(ec_number)
655
+ for cofactor in cofactors:
656
+ if cofactor['name'] not in [c['name'] for c in feasibility['cofactor_requirements']]:
657
+ feasibility['cofactor_requirements'].append(cofactor)
658
+ time.sleep(0.3)
659
+ except Exception as e:
660
+ print(f"Error analyzing cofactors: {e}")
661
+
662
+ feasibility['step_scores'] = step_scores
663
+ feasibility['enzyme_availability'] = total_score / (len(step_scores) * 5) # Normalize to 0-1
664
+ feasibility['overall_score'] = feasibility['enzyme_availability'] * 0.7 # Weight enzyme availability
665
+
666
+ # Thermodynamic feasibility (simplified heuristic)
667
+ pathway_length = len(pathway['steps'])
668
+ if pathway_length <= 2:
669
+ feasibility['thermodynamic_feasibility'] = 0.8 # Short pathways are often feasible
670
+ elif pathway_length <= 4:
671
+ feasibility['thermodynamic_feasibility'] = 0.6
672
+ else:
673
+ feasibility['thermodynamic_feasibility'] = 0.4 # Long pathways may have thermodynamic issues
674
+
675
+ # Overall feasibility is weighted combination
676
+ feasibility['overall_score'] = (
677
+ feasibility['enzyme_availability'] * 0.6 +
678
+ feasibility['thermodynamic_feasibility'] * 0.4
679
+ )
680
+
681
+ # Generate recommendations
682
+ if feasibility['overall_score'] < 0.3:
683
+ feasibility['warnings'].append("Low overall pathway feasibility")
684
+ feasibility['recommendations'].append("Consider alternative starting materials or target molecules")
685
+ elif feasibility['overall_score'] < 0.6:
686
+ feasibility['warnings'].append("Moderate pathway feasibility")
687
+ feasibility['recommendations'].append("Consider enzyme engineering or cofactor recycling")
688
+
689
+ if feasibility['cofactor_requirements']:
690
+ feasibility['recommendations'].append("Implement cofactor recycling system for: " +
691
+ ", ".join([c['name'] for c in feasibility['cofactor_requirements']]))
692
+
693
+ return feasibility
694
+
695
+
696
+ def optimize_pathway_conditions(pathway: Dict[str, Any]) -> Dict[str, Any]:
697
+ """Suggest optimal conditions for the entire pathway."""
698
+ validate_dependencies()
699
+
700
+ optimization = {
701
+ 'optimal_temperature': 30.0, # Default
702
+ 'optimal_ph': 7.0, # Default
703
+ 'temperature_range': (20, 40), # Default
704
+ 'ph_range': (6.5, 7.5), # Default
705
+ 'cofactor_system': [],
706
+ 'organism_compatibility': {},
707
+ 'process_recommendations': []
708
+ }
709
+
710
+ temperatures = []
711
+ phs = []
712
+ organism_preferences = {}
713
+
714
+ # Collect environmental data from all enzymes
715
+ for step in pathway.get('steps', []):
716
+ for enzyme in step.get('enzymes', []):
717
+ ec_number = enzyme.get('ec_number', '')
718
+ organism = enzyme.get('organism', '')
719
+
720
+ if ec_number:
721
+ try:
722
+ env_params = get_environmental_parameters(ec_number)
723
+ time.sleep(0.3)
724
+
725
+ if env_params.get('optimal_temperature'):
726
+ temperatures.append(env_params['optimal_temperature'])
727
+ if env_params.get('optimal_ph'):
728
+ phs.append(env_params['optimal_ph'])
729
+
730
+ # Track organism preferences
731
+ if organism not in organism_preferences:
732
+ organism_preferences[organism] = {
733
+ 'temperature_optima': [],
734
+ 'ph_optima': [],
735
+ 'step_count': 0
736
+ }
737
+
738
+ organism_preferences[organism]['step_count'] += 1
739
+ if env_params.get('optimal_temperature'):
740
+ organism_preferences[organism]['temperature_optima'].append(env_params['optimal_temperature'])
741
+ if env_params.get('optimal_ph'):
742
+ organism_preferences[organism]['ph_optima'].append(env_params['optimal_ph'])
743
+
744
+ except Exception as e:
745
+ print(f"Error getting environmental parameters for {ec_number}: {e}")
746
+
747
+ # Calculate optimal conditions
748
+ if temperatures:
749
+ optimization['optimal_temperature'] = sum(temperatures) / len(temperatures)
750
+ optimization['temperature_range'] = (min(temperatures) - 5, max(temperatures) + 5)
751
+
752
+ if phs:
753
+ optimization['optimal_ph'] = sum(phs) / len(phs)
754
+ optimization['ph_range'] = (min(phs) - 0.5, max(phs) + 0.5)
755
+
756
+ # Find best organism compatibility
757
+ for organism, data in organism_preferences.items():
758
+ if data['temperature_optima'] and data['ph_optima']:
759
+ organism_preferences[organism]['avg_temp'] = sum(data['temperature_optima']) / len(data['temperature_optima'])
760
+ organism_preferences[organism]['avg_ph'] = sum(data['ph_optima']) / len(data['ph_optima'])
761
+ organism_preferences[organism]['compatibility_score'] = data['step_count']
762
+
763
+ # Sort organisms by compatibility
764
+ compatible_organisms = sorted(
765
+ [(org, data) for org, data in organism_preferences.items() if data.get('compatibility_score', 0) > 0],
766
+ key=lambda x: x[1]['compatibility_score'],
767
+ reverse=True
768
+ )
769
+
770
+ optimization['organism_compatibility'] = dict(compatible_organisms[:5]) # Top 5 organisms
771
+
772
+ # Generate process recommendations
773
+ if len(optimization['organism_compatibility']) > 1:
774
+ optimization['process_recommendations'].append("Consider multi-organism system or enzyme cocktails")
775
+
776
+ if optimization['temperature_range'][1] - optimization['temperature_range'][0] > 30:
777
+ optimization['process_recommendations'].append("Consider temperature gradient or staged process")
778
+
779
+ if optimization['ph_range'][1] - optimization['ph_range'][0] > 2:
780
+ optimization['process_recommendations'].append("Consider pH control system or buffer optimization")
781
+
782
+ # Cofactor system optimization
783
+ cofactor_types = {}
784
+ for step in pathway.get('steps', []):
785
+ for enzyme in step.get('enzymes', []):
786
+ ec_number = enzyme.get('ec_number', '')
787
+ if ec_number:
788
+ try:
789
+ cofactors = get_cofactor_requirements(ec_number)
790
+ for cofactor in cofactors:
791
+ cofactor_type = cofactor.get('type', 'other')
792
+ if cofactor_type not in cofactor_types:
793
+ cofactor_types[cofactor_type] = []
794
+ if cofactor['name'] not in cofactor_types[cofactor_type]:
795
+ cofactor_types[cofactor_type].append(cofactor['name'])
796
+ time.sleep(0.3)
797
+ except Exception as e:
798
+ print(f"Error getting cofactors for {ec_number}: {e}")
799
+
800
+ optimization['cofactor_system'] = cofactor_types
801
+
802
+ return optimization
803
+
804
+
805
+ def generate_pathway_report(pathway: Dict[str, Any], filename: str = None) -> str:
806
+ """Generate a comprehensive pathway report."""
807
+ validate_dependencies()
808
+
809
+ if filename is None:
810
+ target_name = pathway.get('target', 'pathway').replace(' ', '_').lower()
811
+ filename = f"pathway_report_{target_name}.txt"
812
+
813
+ # Calculate feasibility and optimization
814
+ feasibility = calculate_pathway_feasibility(pathway)
815
+ optimization = optimize_pathway_conditions(pathway)
816
+
817
+ report = []
818
+ report.append("=" * 80)
819
+ report.append(f"ENZYMATIC PATHWAY REPORT")
820
+ report.append("=" * 80)
821
+
822
+ # Overview
823
+ report.append(f"\nTARGET PRODUCT: {pathway.get('target', 'Unknown')}")
824
+ report.append(f"PATHWAY LENGTH: {len(pathway.get('steps', []))} steps")
825
+ report.append(f"OVERALL FEASIBILITY: {feasibility['overall_score']:.2f}/1.00")
826
+
827
+ # Pathway steps
828
+ if pathway.get('steps'):
829
+ report.append("\n" + "=" * 40)
830
+ report.append("PATHWAY STEPS")
831
+ report.append("=" * 40)
832
+
833
+ for i, step in enumerate(pathway['steps'], 1):
834
+ report.append(f"\nStep {i}: {step['substrate']} -> {step['product']}")
835
+ report.append(f"Transformation: {', '.join(step.get('transformation', ['Unknown']))}")
836
+
837
+ if step.get('enzymes'):
838
+ report.append(f"Available enzymes: {len(step['enzymes'])}")
839
+ for j, enzyme in enumerate(step['enzymes'][:3], 1): # Top 3 enzymes
840
+ report.append(f" {j}. EC {enzyme.get('ec_number', 'Unknown')} - {enzyme.get('organism', 'Unknown')}")
841
+ report.append(f" Confidence: {enzyme.get('confidence', 'Unknown')}")
842
+ if enzyme.get('reaction'):
843
+ report.append(f" Reaction: {enzyme['reaction'][:100]}...")
844
+
845
+ if len(step['enzymes']) > 3:
846
+ report.append(f" ... and {len(step['enzymes']) - 3} additional enzymes")
847
+ else:
848
+ report.append(" No enzymes found for this step")
849
+
850
+ if feasibility.get('step_scores') and i-1 < len(feasibility['step_scores']):
851
+ report.append(f"Step feasibility score: {feasibility['step_scores'][i-1]}/5.0")
852
+
853
+ # Cofactor requirements
854
+ if feasibility.get('cofactor_requirements'):
855
+ report.append("\n" + "=" * 40)
856
+ report.append("COFACTOR REQUIREMENTS")
857
+ report.append("=" * 40)
858
+
859
+ for cofactor in feasibility['cofactor_requirements']:
860
+ report.append(f"- {cofactor['name']} ({cofactor.get('type', 'Unknown')})")
861
+ report.append(f" Organism: {cofactor.get('organism', 'Unknown')}")
862
+ report.append(f" EC Number: {cofactor.get('ec_number', 'Unknown')}")
863
+
864
+ # Optimal conditions
865
+ report.append("\n" + "=" * 40)
866
+ report.append("OPTIMAL CONDITIONS")
867
+ report.append("=" * 40)
868
+
869
+ report.append(f"Temperature: {optimization['optimal_temperature']:.1f}°C")
870
+ report.append(f"pH: {optimization['optimal_ph']:.1f}")
871
+ report.append(f"Temperature range: {optimization['temperature_range'][0]:.1f} - {optimization['temperature_range'][1]:.1f}°C")
872
+ report.append(f"pH range: {optimization['ph_range'][0]:.1f} - {optimization['ph_range'][1]:.1f}")
873
+
874
+ if optimization.get('organism_compatibility'):
875
+ report.append("\nCompatible organisms (by preference):")
876
+ for organism, data in list(optimization['organism_compatibility'].items())[:3]:
877
+ report.append(f"- {organism} (compatibility score: {data.get('compatibility_score', 0)})")
878
+ if data.get('avg_temp'):
879
+ report.append(f" Optimal temperature: {data['avg_temp']:.1f}°C")
880
+ if data.get('avg_ph'):
881
+ report.append(f" Optimal pH: {data['avg_ph']:.1f}")
882
+
883
+ # Warnings and recommendations
884
+ if feasibility.get('warnings'):
885
+ report.append("\n" + "=" * 40)
886
+ report.append("WARNINGS")
887
+ report.append("=" * 40)
888
+
889
+ for warning in feasibility['warnings']:
890
+ report.append(f"⚠️ {warning}")
891
+
892
+ if feasibility.get('recommendations'):
893
+ report.append("\n" + "=" * 40)
894
+ report.append("RECOMMENDATIONS")
895
+ report.append("=" * 40)
896
+
897
+ for rec in feasibility['recommendations']:
898
+ report.append(f"💡 {rec}")
899
+
900
+ if optimization.get('process_recommendations'):
901
+ for rec in optimization['process_recommendations']:
902
+ report.append(f"🔧 {rec}")
903
+
904
+ # Alternative pathways
905
+ if pathway.get('alternative_pathways'):
906
+ report.append("\n" + "=" * 40)
907
+ report.append("ALTERNATIVE ROUTES")
908
+ report.append("=" * 40)
909
+
910
+ for alt in pathway['alternative_pathways'][:5]: # Top 5 alternatives
911
+ report.append(f"\n{alt['precursor']} -> {alt['product']}")
912
+ report.append(f"Enzymes available: {len(alt.get('enzymes', []))}")
913
+ for enzyme in alt.get('enzymes', [])[:2]: # Top 2 enzymes
914
+ report.append(f" - {enzyme.get('ec_number', 'Unknown')} ({enzyme.get('organism', 'Unknown')})")
915
+
916
+ # Feasibility analysis
917
+ report.append("\n" + "=" * 40)
918
+ report.append("FEASIBILITY ANALYSIS")
919
+ report.append("=" * 40)
920
+
921
+ report.append(f"Enzyme availability score: {feasibility['enzyme_availability']:.2f}/1.00")
922
+ report.append(f"Thermodynamic feasibility: {feasibility['thermodynamic_feasibility']:.2f}/1.00")
923
+
924
+ # Write report to file
925
+ with open(filename, 'w') as f:
926
+ f.write('\n'.join(report))
927
+
928
+ print(f"Pathway report saved to {filename}")
929
+ return filename
930
+
931
+
932
+ def visualize_pathway(pathway: Dict[str, Any], save_path: str = None) -> str:
933
+ """Create a visual representation of the pathway."""
934
+ validate_dependencies()
935
+
936
+ if not NETWORKX_AVAILABLE or not MATPLOTLIB_AVAILABLE:
937
+ print("networkx and matplotlib required for pathway visualization")
938
+ return save_path or "pathway_visualization.png"
939
+
940
+ try:
941
+ # Create directed graph
942
+ G = nx.DiGraph()
943
+
944
+ # Add nodes and edges
945
+ for step in pathway.get('steps', []):
946
+ substrate = step['substrate']
947
+ product = step['product']
948
+ enzymes = step.get('enzymes', [])
949
+
950
+ G.add_node(substrate, type='substrate')
951
+ G.add_node(product, type='product')
952
+
953
+ # Add edge with enzyme information
954
+ edge_label = f"{len(enzymes)} enzymes"
955
+ if enzymes:
956
+ primary_ec = enzymes[0].get('ec_number', 'Unknown')
957
+ edge_label += f"\nEC {primary_ec}"
958
+
959
+ G.add_edge(substrate, product, label=edge_label)
960
+
961
+ # Create figure
962
+ plt.figure(figsize=(12, 8))
963
+
964
+ # Layout
965
+ pos = nx.spring_layout(G, k=2, iterations=50)
966
+
967
+ # Draw nodes
968
+ substrate_nodes = [n for n, d in G.nodes(data=True) if d.get('type') == 'substrate']
969
+ product_nodes = [n for n, d in G.nodes(data=True) if d.get('type') == 'product']
970
+ intermediate_nodes = [n for n in G.nodes() if n not in substrate_nodes and n not in product_nodes]
971
+
972
+ nx.draw_networkx_nodes(G, pos, nodelist=substrate_nodes, node_color='lightblue', node_size=1500)
973
+ nx.draw_networkx_nodes(G, pos, nodelist=product_nodes, node_color='lightgreen', node_size=1500)
974
+ nx.draw_networkx_nodes(G, pos, nodelist=intermediate_nodes, node_color='lightyellow', node_size=1200)
975
+
976
+ # Draw edges
977
+ nx.draw_networkx_edges(G, pos, edge_color='gray', arrows=True, arrowsize=20)
978
+
979
+ # Draw labels
980
+ nx.draw_networkx_labels(G, pos, font_size=10, font_weight='bold')
981
+
982
+ # Draw edge labels
983
+ edge_labels = nx.get_edge_attributes(G, 'label')
984
+ nx.draw_networkx_edge_labels(G, pos, edge_labels, font_size=8)
985
+
986
+ # Add title
987
+ plt.title(f"Enzymatic Pathway to {pathway.get('target', 'Target')}", fontsize=14, fontweight='bold')
988
+
989
+ # Add legend
990
+ plt.scatter([], [], c='lightblue', s=150, label='Starting Materials')
991
+ plt.scatter([], [], c='lightyellow', s=120, label='Intermediates')
992
+ plt.scatter([], [], c='lightgreen', s=150, label='Products')
993
+ plt.legend()
994
+
995
+ plt.axis('off')
996
+ plt.tight_layout()
997
+
998
+ # Save or show
999
+ if save_path:
1000
+ plt.savefig(save_path, dpi=300, bbox_inches='tight')
1001
+ print(f"Pathway visualization saved to {save_path}")
1002
+ else:
1003
+ plt.show()
1004
+
1005
+ plt.close()
1006
+ return save_path or "pathway_visualization.png"
1007
+
1008
+ except Exception as e:
1009
+ print(f"Error visualizing pathway: {e}")
1010
+ return save_path or "pathway_visualization.png"
1011
+
1012
+
1013
+ if __name__ == "__main__":
1014
+ # Example usage
1015
+ print("Enzyme Pathway Builder Examples")
1016
+ print("=" * 50)
1017
+
1018
+ try:
1019
+ # Example 1: Find pathway for lactate
1020
+ print("\n1. Finding pathway for lactate production:")
1021
+ pathway = find_pathway_for_product("lactate", max_steps=3)
1022
+ print(f"Found pathway with {len(pathway['steps'])} steps")
1023
+ print(f"Feasibility: {pathway['confidence']:.2f}")
1024
+
1025
+ # Example 2: Build retrosynthetic tree
1026
+ print("\n2. Building retrosynthetic tree for ethanol:")
1027
+ tree = build_retrosynthetic_tree("ethanol", depth=2)
1028
+ print(f"Tree has {tree['total_nodes']} nodes and {tree['total_edges']} edges")
1029
+
1030
+ # Example 3: Suggest enzyme substitutions
1031
+ print("\n3. Suggesting enzyme substitutions for alcohol dehydrogenase:")
1032
+ substitutions = suggest_enzyme_substitutions("1.1.1.1")
1033
+ for sub in substitutions[:3]:
1034
+ print(f" - {sub.get('organism', 'Unknown')}: {sub.get('substitution_reason', 'No reason')}")
1035
+
1036
+ # Example 4: Calculate feasibility
1037
+ print("\n4. Calculating pathway feasibility:")
1038
+ feasibility = calculate_pathway_feasibility(pathway)
1039
+ print(f"Overall score: {feasibility['overall_score']:.2f}")
1040
+ print(f"Warnings: {len(feasibility['warnings'])}")
1041
+
1042
+ # Example 5: Generate pathway report
1043
+ print("\n5. Generating pathway report:")
1044
+ report_file = generate_pathway_report(pathway)
1045
+ print(f"Report saved to: {report_file}")
1046
+
1047
+ # Example 6: Visualize pathway
1048
+ print("\n6. Visualizing pathway:")
1049
+ viz_file = visualize_pathway(pathway, "example_pathway.png")
1050
+ print(f"Visualization saved to: {viz_file}")
1051
+
1052
+ except Exception as e:
1053
+ print(f"Example failed: {e}")