in-silico-cancer-cell 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.github/workflows/main.yml +12 -1
  2. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/Cargo.lock +2 -2
  3. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/Cargo.toml +1 -1
  4. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/PKG-INFO +3 -1
  5. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/README.md +2 -0
  6. in_silico_cancer_cell-0.2.0/figures/results/data-vs-simulation.pdf +0 -0
  7. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/main.py +4 -1
  8. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/poetry.lock +43 -1
  9. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/pyproject.toml +2 -1
  10. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/python/in_silico_cancer_cell/_in_rusty_silico.pyi +2 -2
  11. in_silico_cancer_cell-0.2.0/python/in_silico_cancer_cell/plot.py +53 -0
  12. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/cell.rs +19 -27
  13. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/base.rs +5 -1
  14. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/clc2.rs +1 -1
  15. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/crac1.rs +1 -1
  16. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/kca11.rs +3 -2
  17. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/kca31.rs +2 -1
  18. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/kv13.rs +1 -1
  19. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/kv31.rs +1 -1
  20. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/kv34.rs +1 -1
  21. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/kv71.rs +1 -1
  22. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/task1.rs +1 -1
  23. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/trpc6.rs +1 -1
  24. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/trpv3.rs +3 -3
  25. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/constants.rs +5 -3
  26. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/main.rs +1 -1
  27. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/optimisation.rs +3 -4
  28. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/patchclampdata.rs +6 -2
  29. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/utils.rs +4 -1
  30. in_silico_cancer_cell-0.1.0/python/in_silico_cancer_cell/plot.py +0 -20
  31. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.editorconfig +0 -0
  32. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.github/workflows/maturin.yml +0 -0
  33. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.gitignore +0 -0
  34. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.pre-commit-config.yaml +0 -0
  35. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.rustfmt.toml +0 -0
  36. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.vscode/extensions.json +0 -0
  37. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/.vscode/launch.json +0 -0
  38. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/astro.config.mjs +0 -0
  39. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_1.mat +0 -0
  40. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_10.mat +0 -0
  41. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_11.mat +0 -0
  42. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_2.mat +0 -0
  43. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_3.mat +0 -0
  44. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_4.mat +0 -0
  45. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_5.mat +0 -0
  46. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_6.mat +0 -0
  47. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_7.mat +0 -0
  48. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_8.mat +0 -0
  49. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG0_9.mat +0 -0
  50. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG1_1.mat +0 -0
  51. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG1_2.mat +0 -0
  52. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG1_3.mat +0 -0
  53. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG1_4.mat +0 -0
  54. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/mG1_5.mat +0 -0
  55. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/patch_clamp_data.mat +0 -0
  56. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/experimental/time_vector_measure.mat +0 -0
  57. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/provision/patch_clamp_data_activation.mat +0 -0
  58. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/provision/patch_clamp_data_deactivation.mat +0 -0
  59. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/data/provision/patch_clamp_data_ramp.mat +0 -0
  60. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/literature/1998-potassium-channel.pdf +0 -0
  61. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/literature/2021-A549-model.pdf +0 -0
  62. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/literature/sources.bib +0 -0
  63. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/A549 in-silico main.m +0 -0
  64. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/CLC_2.m +0 -0
  65. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/CRAC1.m +0 -0
  66. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/KCa_1_1.m +0 -0
  67. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/KCa_3_1.m +0 -0
  68. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/Kv_1_3.m +0 -0
  69. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/Kv_3_1.m +0 -0
  70. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/Kv_3_4.m +0 -0
  71. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/Kv_7_1.m +0 -0
  72. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/P_CRAC1.m +0 -0
  73. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/TASK1.m +0 -0
  74. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/TRPV_3.m +0 -0
  75. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/load_patch_clamp_data.m +0 -0
  76. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/model_evaluation.m +0 -0
  77. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/optimization.m +0 -0
  78. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/simulate_pulse_protocol.m +0 -0
  79. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/simulate_pulse_protocol_TRPC.m +0 -0
  80. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/matlab/simulate_pulse_protocol_TRPV.m +0 -0
  81. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/package.json +0 -0
  82. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/public/favicon.svg +0 -0
  83. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/python/in_silico_cancer_cell/__init__.py +0 -0
  84. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/python/in_silico_cancer_cell/py.typed +0 -0
  85. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/python/tests/test_all.py +0 -0
  86. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/.gitignore +0 -0
  87. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/graphics/sample-figure1.png +0 -0
  88. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/logos/Open_Access.eps +0 -0
  89. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/logos/Open_Access.pdf +0 -0
  90. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/logos/by.eps +0 -0
  91. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/logos/by.pdf +0 -0
  92. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/logos/dg-degruyter.eps +0 -0
  93. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/logos/dg-degruyter.pdf +0 -0
  94. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/report.pdf +0 -0
  95. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/report/report.tex +0 -0
  96. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/rust-toolchain.toml +0 -0
  97. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/channels/mod.rs +0 -0
  98. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/lib.rs +0 -0
  99. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/src/pulseprotocol.rs +0 -0
  100. {in_silico_cancer_cell-0.1.0 → in_silico_cancer_cell-0.2.0}/yarn.lock +0 -0
@@ -1,4 +1,4 @@
1
- name: Build Main and Frontend
1
+ name: Build Main, Frontend and Deploy
2
2
  on:
3
3
  push:
4
4
  env:
@@ -28,3 +28,14 @@ jobs:
28
28
  - run: yarn run wasm-pack build frontend --release
29
29
  - run: cargo run --release --target=${{ matrix.target }} save-patch-clamp-data 225
30
30
  - run: yarn run build
31
+
32
+ # deploy
33
+ - uses: jsmrcaga/action-netlify-deploy@master
34
+ with:
35
+ NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
36
+ NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
37
+ NETLIFY_DEPLOY_MESSAGE: "Production deploy v${{ github.ref }}"
38
+ NETLIFY_DEPLOY_TO_PROD: true
39
+ install_command: "echo Skipping..."
40
+ build_command: "echo Skipping..."
41
+ build_directory: dist/
@@ -302,7 +302,7 @@ dependencies = [
302
302
 
303
303
  [[package]]
304
304
  name = "frontend"
305
- version = "0.1.0"
305
+ version = "0.2.0"
306
306
  dependencies = [
307
307
  "console_error_panic_hook",
308
308
  "futures",
@@ -443,7 +443,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
443
443
 
444
444
  [[package]]
445
445
  name = "in_silico_cancer_cell"
446
- version = "0.1.0"
446
+ version = "0.2.0"
447
447
  dependencies = [
448
448
  "argmin",
449
449
  "argmin-math",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "in_silico_cancer_cell"
3
- version = "0.1.0"
3
+ version = "0.2.0"
4
4
  edition = "2021"
5
5
 
6
6
  [lib]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: in_silico_cancer_cell
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -9,6 +9,8 @@ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
9
9
 
10
10
  # Electrophysiological Cancer Cell Model
11
11
 
12
+ ![PyPI - Version](https://img.shields.io/pypi/v/in-silico-cancer-cell)
13
+
12
14
  Attempt to model an A549 cancer cell's ion channels using an HMM (Hidden Markov Model) and simulation of voltage + current development accross the membrane of the cell.
13
15
 
14
16
  This software comes in three flavours:
@@ -1,5 +1,7 @@
1
1
  # Electrophysiological Cancer Cell Model
2
2
 
3
+ ![PyPI - Version](https://img.shields.io/pypi/v/in-silico-cancer-cell)
4
+
3
5
  Attempt to model an A549 cancer cell's ion channels using an HMM (Hidden Markov Model) and simulation of voltage + current development accross the membrane of the cell.
4
6
 
5
7
  This software comes in three flavours:
@@ -1,10 +1,13 @@
1
+ #!/usr/bin/env python
1
2
  import pathlib
2
3
 
3
4
  import in_silico_cancer_cell.plot as insilico_plot
5
+ import matplotlib.pyplot as plt
4
6
 
5
7
  RESULTS = pathlib.Path(__file__).resolve().parent / "figures" / "results"
6
8
 
7
9
 
8
10
  if __name__ == "__main__":
9
11
  insilico_plot.set_results_folder(RESULTS)
10
- insilico_plot.plot_measurement()
12
+ insilico_plot.plot_full_comparison()
13
+ plt.show()
@@ -744,6 +744,48 @@ files = [
744
744
  [package.dependencies]
745
745
  six = ">=1.5"
746
746
 
747
+ [[package]]
748
+ name = "scipy"
749
+ version = "1.13.1"
750
+ description = "Fundamental algorithms for scientific computing in Python"
751
+ optional = false
752
+ python-versions = ">=3.9"
753
+ files = [
754
+ {file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"},
755
+ {file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"},
756
+ {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"},
757
+ {file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"},
758
+ {file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"},
759
+ {file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"},
760
+ {file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"},
761
+ {file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"},
762
+ {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"},
763
+ {file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"},
764
+ {file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"},
765
+ {file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"},
766
+ {file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"},
767
+ {file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"},
768
+ {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"},
769
+ {file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"},
770
+ {file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"},
771
+ {file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"},
772
+ {file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"},
773
+ {file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"},
774
+ {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"},
775
+ {file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"},
776
+ {file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"},
777
+ {file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"},
778
+ {file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"},
779
+ ]
780
+
781
+ [package.dependencies]
782
+ numpy = ">=1.22.4,<2.3"
783
+
784
+ [package.extras]
785
+ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"]
786
+ doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"]
787
+ test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
788
+
747
789
  [[package]]
748
790
  name = "six"
749
791
  version = "1.16.0"
@@ -825,4 +867,4 @@ files = [
825
867
  [metadata]
826
868
  lock-version = "2.0"
827
869
  python-versions = "^3.10"
828
- content-hash = "fac77b09117ba9cbfde590a664a4a3f90c57adf9f1c74427c572b04b4146aa74"
870
+ content-hash = "9fe98bea4425784508fb9457af032039a3b0c241311d7a20dc44b4cb06014293"
@@ -19,7 +19,7 @@ features = ["pyo3/extension-module"]
19
19
 
20
20
  [tool.poetry]
21
21
  name = "in_silico_cancer_cell"
22
- version = "0.1.0"
22
+ version = "0.2.0"
23
23
  description = "Electrophysiological model of an A549 cancer cell"
24
24
  authors = ["MrP01 <peter@waldert.at>"]
25
25
  license = "MIT"
@@ -33,6 +33,7 @@ numpy = "^1.26.4"
33
33
  [tool.poetry.group.dev.dependencies]
34
34
  ipython = "^8.23.0"
35
35
  pytest = "^8.1.1"
36
+ scipy = "^1.13.1"
36
37
 
37
38
  [tool.ruff]
38
39
  line-length = 120
@@ -21,10 +21,8 @@ class ChannelCountsProblem:
21
21
  @staticmethod
22
22
  def new(data: PatchClampData) -> ChannelCountsProblem:
23
23
  pass
24
-
25
24
  def precompute_single_channel_currents(self):
26
25
  pass
27
-
28
26
  def get_current_basis(self) -> list[list[float]]:
29
27
  pass
30
28
 
@@ -38,6 +36,8 @@ class PatchClampData:
38
36
  @staticmethod
39
37
  def pyload(protocol: PatchClampProtocol, phase: CellPhase) -> PatchClampData:
40
38
  pass
39
+ def to_list(self) -> list[float]:
40
+ pass
41
41
 
42
42
  def find_best_fit_for(data: PatchClampData, using: InSilicoMethod) -> list[float]:
43
43
  pass
@@ -0,0 +1,53 @@
1
+ import pathlib
2
+
3
+ import matplotlib.axes
4
+ import matplotlib.pyplot as plt
5
+ import numpy as np
6
+ import scipy.optimize
7
+
8
+ from in_silico_cancer_cell import CellPhase, ChannelCountsProblem, PatchClampData, PatchClampProtocol, setup_logging
9
+
10
+ RESULTS = pathlib.Path.cwd()
11
+ setup_logging()
12
+
13
+
14
+ def plot_measurement():
15
+ fig = plt.figure()
16
+ axes: matplotlib.axes.Axes = fig.add_subplot(1, 1, 1)
17
+ axes.plot()
18
+ axes.set_xlabel("")
19
+ axes.set_ylabel("")
20
+ axes.legend()
21
+ fig.savefig(str(RESULTS / "plot.pdf"))
22
+
23
+
24
+ def plot_full_comparison(method="langthaler"):
25
+ measurements = PatchClampData.pyload(PatchClampProtocol.Activation, CellPhase.G0)
26
+ data = np.array(measurements.to_list()) + 22
27
+ problem = ChannelCountsProblem.new(measurements)
28
+ problem.precompute_single_channel_currents()
29
+ single_channels = np.array(problem.get_current_basis())
30
+ # single_channels = np.array(problem.get_current_basis())[:, (3,)]
31
+ # single_channels = np.concatenate([single_channels, np.ones((single_channels.shape[0], 1))], axis=1)
32
+ if method == "lstsq":
33
+ channel_counts, res, rank, s = np.linalg.lstsq(single_channels[: len(data), :], data, rcond=None)
34
+ elif method == "nnls":
35
+ channel_counts, rnorm = scipy.optimize.nnls(single_channels[: len(data), :], data)
36
+ elif method == "langthaler":
37
+ channel_counts = np.array([22, 78, 5, 1350, 40, 77, 19, 200, 17, 12, 13])
38
+ channel_counts = channel_counts.astype(int)
39
+ time = np.linspace(0, 9.901, single_channels.shape[0])
40
+ print(f"Best fit: {channel_counts}")
41
+
42
+ fig = plt.figure()
43
+ axes: matplotlib.axes.Axes = fig.add_subplot(1, 1, 1)
44
+ axes.plot(time[: len(data)], data)
45
+ axes.plot(time, (single_channels * channel_counts).sum(axis=1))
46
+ axes.set_xlabel("Time $t$ / s")
47
+ axes.set_ylabel("Current $I$ / nA")
48
+ fig.savefig(str(RESULTS / "data-vs-simulation.pdf"))
49
+
50
+
51
+ def set_results_folder(path: pathlib.Path):
52
+ global RESULTS
53
+ RESULTS = path
@@ -43,48 +43,48 @@ pub type ChannelCounts = [u32; N_CHANNEL_TYPES];
43
43
 
44
44
  #[cfg_attr(feature = "pyo3", pyo3::pyclass)]
45
45
  pub struct A549CancerCell {
46
- crac1_channel: channels::crac1::CRAC1IonChannelCat,
47
- trpc6_channel: channels::trpc6::TRPC6IonChannelCat,
48
- trpv3_channel: channels::trpv3::TRPV3IonChannelCat,
49
46
  kv13_channel: channels::kv13::KV13IonChannelCat,
50
47
  kv31_channel: channels::kv31::KV31IonChannelCat,
51
48
  kv34_channel: channels::kv34::KV34IonChannelCat,
52
49
  kv71_channel: channels::kv71::KV71IonChannelCat,
53
50
  kca11_channel: channels::kca11::KCa11IonChannelCat,
54
51
  kca31_channel: channels::kca31::KCa31IonChannelCat,
55
- clc2_channel: channels::clc2::CLC2IonChannelCat,
56
52
  task1_channel: channels::task1::Task1IonChannelCat,
53
+ crac1_channel: channels::crac1::CRAC1IonChannelCat,
54
+ trpc6_channel: channels::trpc6::TRPC6IonChannelCat,
55
+ trpv3_channel: channels::trpv3::TRPV3IonChannelCat,
56
+ clc2_channel: channels::clc2::CLC2IonChannelCat,
57
57
  }
58
58
 
59
59
  impl A549CancerCell {
60
60
  pub fn channels(&self) -> Vec<&dyn IsChannel> {
61
61
  vec![
62
- &self.crac1_channel,
63
- &self.trpc6_channel,
64
- &self.trpv3_channel,
65
62
  &self.kv13_channel,
66
63
  &self.kv31_channel,
67
64
  &self.kv34_channel,
68
65
  &self.kv71_channel,
69
66
  &self.kca11_channel,
70
67
  &self.kca31_channel,
71
- &self.clc2_channel,
72
68
  &self.task1_channel,
69
+ &self.crac1_channel,
70
+ &self.trpc6_channel,
71
+ &self.trpv3_channel,
72
+ &self.clc2_channel,
73
73
  ]
74
74
  }
75
75
  pub fn channels_mut(&mut self) -> Vec<&mut dyn IsChannel> {
76
76
  vec![
77
- &mut self.crac1_channel,
78
- &mut self.trpc6_channel,
79
- &mut self.trpv3_channel,
80
77
  &mut self.kv13_channel,
81
78
  &mut self.kv31_channel,
82
79
  &mut self.kv34_channel,
83
80
  &mut self.kv71_channel,
84
81
  &mut self.kca11_channel,
85
82
  &mut self.kca31_channel,
86
- &mut self.clc2_channel,
87
83
  &mut self.task1_channel,
84
+ &mut self.crac1_channel,
85
+ &mut self.trpc6_channel,
86
+ &mut self.trpv3_channel,
87
+ &mut self.clc2_channel,
88
88
  ]
89
89
  }
90
90
 
@@ -190,32 +190,24 @@ impl A549CancerCell {
190
190
  #[cfg_attr(feature = "pyo3", staticmethod)]
191
191
  pub fn new() -> A549CancerCell {
192
192
  A549CancerCell {
193
- crac1_channel: channels::crac1::CRAC1IonChannelCat::new(),
194
- trpc6_channel: channels::trpc6::TRPC6IonChannelCat::new(),
195
- trpv3_channel: channels::trpv3::TRPV3IonChannelCat::new(),
196
193
  kv13_channel: channels::kv13::KV13IonChannelCat::new(),
197
194
  kv31_channel: channels::kv31::KV31IonChannelCat::new(),
198
195
  kv34_channel: channels::kv34::KV34IonChannelCat::new(),
199
196
  kv71_channel: channels::kv71::KV71IonChannelCat::new(),
200
197
  kca11_channel: channels::kca11::KCa11IonChannelCat::new(),
201
198
  kca31_channel: channels::kca31::KCa31IonChannelCat::new(),
202
- clc2_channel: channels::clc2::CLC2IonChannelCat::new(),
203
199
  task1_channel: channels::task1::Task1IonChannelCat::new(),
200
+ crac1_channel: channels::crac1::CRAC1IonChannelCat::new(),
201
+ trpc6_channel: channels::trpc6::TRPC6IonChannelCat::new(),
202
+ trpv3_channel: channels::trpv3::TRPV3IonChannelCat::new(),
203
+ clc2_channel: channels::clc2::CLC2IonChannelCat::new(),
204
204
  }
205
205
  }
206
206
 
207
207
  pub fn set_channel_counts(&mut self, counts: ChannelCounts) {
208
- self.kv13_channel.n_channels = counts[0];
209
- self.kv31_channel.n_channels = counts[1];
210
- self.kv34_channel.n_channels = counts[2];
211
- self.kv71_channel.n_channels = counts[3];
212
- self.kca11_channel.n_channels = counts[4];
213
- self.kca31_channel.n_channels = counts[5];
214
- self.task1_channel.n_channels = counts[6];
215
- self.crac1_channel.n_channels = counts[7];
216
- self.trpc6_channel.n_channels = counts[8];
217
- self.trpv3_channel.n_channels = counts[9];
218
- self.clc2_channel.n_channels = counts[10];
208
+ for (channel, count) in self.channels_mut().iter_mut().zip(counts) {
209
+ channel.set_n_channels(count);
210
+ }
219
211
  }
220
212
 
221
213
  pub fn set_langthaler_et_al_channel_counts(&mut self, phase: CellPhase) {
@@ -21,6 +21,7 @@ pub trait IsChannel {
21
21
  fn display_name(&self) -> String;
22
22
  fn display_me(&self) -> String;
23
23
  fn metadata(&self) -> ChannelMetadata;
24
+ fn set_n_channels(&mut self, n_channels: u32);
24
25
  }
25
26
 
26
27
  #[macro_export]
@@ -71,10 +72,13 @@ macro_rules! define_ion_channel {
71
72
  fn reset_state(&mut self) {
72
73
  self.state = Self::initial_state();
73
74
  }
75
+ fn set_n_channels(&mut self, n_channels: u32) {
76
+ self.n_channels = n_channels;
77
+ }
74
78
  fn single_channel_current(&self, voltage: f64) -> f64 {
75
79
  let mut open = 0.0;
76
80
  $(open += self.state[$states_responsible_for_current];)+
77
- Self::conductance * open * (self.n_channels as f64) * (voltage - $crate::constants::reversal_potential($iontype))
81
+ Self::conductance * open * (voltage - $crate::constants::reversal_potential($iontype))
78
82
  }
79
83
  fn current(&self, voltage: f64) -> f64 {
80
84
  (self.n_channels as f64) * self.single_channel_current(voltage)
@@ -10,7 +10,7 @@ define_ion_channel!(
10
10
  "CLC2",
11
11
  12, // number of states
12
12
  IonType::Chlorine, // ion type
13
- 2.8e-3, // conductance
13
+ 2.8, // conductance (pS)
14
14
  (3, 6, 7, 9, 11) // states which count towards the current
15
15
  );
16
16
 
@@ -8,7 +8,7 @@ define_ion_channel!(
8
8
  "CRACM1",
9
9
  2, // number of states
10
10
  IonType::Calcium, // ion type
11
- 24e-6, // conductance
11
+ 24e-3, // conductance (pS)
12
12
  (1) // states which count towards the current
13
13
  );
14
14
 
@@ -6,12 +6,13 @@ use crate::{
6
6
 
7
7
  pub type Matrix10<T> = nalgebra::Matrix<T, nalgebra::U10, nalgebra::U10, nalgebra::ArrayStorage<T, 10, 10>>;
8
8
 
9
+ // TODO: channel current does not match paper
9
10
  define_ion_channel!(
10
11
  KCa11IonChannelCat,
11
12
  "KCa11",
12
13
  10, // number of states
13
14
  IonType::Kalium, // ion type
14
- 250e-3, // conductance
15
+ 250.0, // conductance (pS)
15
16
  (5, 6, 7, 8, 9) // states which count towards the current
16
17
  );
17
18
 
@@ -67,7 +68,7 @@ impl HasTransitionMatrix<10> for KCa11IonChannelCat {
67
68
 
68
69
  #[rustfmt::skip]
69
70
  return Matrix10::from_row_slice(&[
70
- 1.0-4.0 * ca_i_dt - b, kc, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, a,
71
+ 1.0 - 4.0 * ca_i_dt - b, kc, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, a,
71
72
  4.0 * ca_i_dt, 1.0- kc -3.0 * ca_i_dt - d, 2.0 * kc, 0.0, 0.0, 0.0, 0.0, 0.0, c, 0.0,
72
73
  0.0, 3.0 * ca_i_dt, 1.0-2.0 * kc -2.0 * ca_i_dt - f, 3.0 * kc, 0.0, 0.0, 0.0, e, 0.0, 0.0,
73
74
  0.0, 0.0, 2.0 * ca_i_dt, 1.0-3.0 * kc - ca_i_dt - h, 4.0 * kc, 0.0, g, 0.0, 0.0, 0.0,
@@ -6,12 +6,13 @@ use crate::{
6
6
  define_ion_channel,
7
7
  };
8
8
 
9
+ // TODO: channel current does not match paper
9
10
  define_ion_channel!(
10
11
  KCa31IonChannelCat,
11
12
  "KCa31",
12
13
  4, // number of states
13
14
  IonType::Kalium, // ion type
14
- 11e-3, // conductance
15
+ 11.0, // conductance (pS)
15
16
  (3) // states which count towards the current
16
17
  );
17
18
 
@@ -7,7 +7,7 @@ define_ion_channel!(
7
7
  "Kv13",
8
8
  7, // number of states
9
9
  IonType::Kalium, // ion type
10
- 15e-3, // conductance
10
+ 15.0, // conductance (pS)
11
11
  (5) // states which count towards the current
12
12
  );
13
13
 
@@ -8,7 +8,7 @@ define_ion_channel!(
8
8
  "Kv31",
9
9
  6, // number of states
10
10
  IonType::Kalium, // ion type
11
- 40e-3, // conductance
11
+ 40.0, // conductance (pS)
12
12
  (5) // states which count towards the current
13
13
  );
14
14
 
@@ -10,7 +10,7 @@ define_ion_channel!(
10
10
  "Kv34",
11
11
  7, // number of states
12
12
  IonType::Kalium, // ion type
13
- 14e-3, // conductance
13
+ 14.0, // conductance (pS)
14
14
  (5) // states which count towards the current
15
15
  );
16
16
 
@@ -11,7 +11,7 @@ define_ion_channel!(
11
11
  "Kv71",
12
12
  5, // number of states
13
13
  IonType::Kalium, // ion type
14
- 3.2e-3, // conductance
14
+ 3.2, // conductance (pS)
15
15
  (2, 3) // states which count towards the current
16
16
  );
17
17
 
@@ -11,7 +11,7 @@ define_ion_channel!(
11
11
  "Task1",
12
12
  3, // number of states
13
13
  IonType::Kalium, // ion type
14
- 16e-3, // conductance
14
+ 16.0, // conductance (pS)
15
15
  (2) // states which count towards the current
16
16
  );
17
17
 
@@ -8,7 +8,7 @@ define_ion_channel!(
8
8
  "TRPC6",
9
9
  1, // number of states
10
10
  IonType::Calcium, // ion type
11
- 35e-3, // conductance
11
+ 35.0, // conductance (pS)
12
12
  (0) // states which count towards the current
13
13
  );
14
14
 
@@ -6,10 +6,10 @@ use crate::{constants::IonType, define_ion_channel};
6
6
  define_ion_channel!(
7
7
  TRPV3IonChannelCat,
8
8
  "TRPV3",
9
- 1, // number of states
9
+ 1, // number of states
10
10
  IonType::Calcium, // ion type
11
- 48e-3, // conductance
12
- (0) // states which count towards the current
11
+ 48.0, // conductance (pS)
12
+ (0) // states which count towards the current
13
13
  );
14
14
 
15
15
  impl HasTransitionMatrix<1> for TRPV3IonChannelCat {
@@ -3,14 +3,15 @@
3
3
  pub const slowest_dt: f64 = 5e-7; // initial timestep
4
4
  pub const delta_tolerance: f64 = 1e-6; // how much of a change in \Delta state the system is aiming for (squared)
5
5
  pub const Ca_i: f64 = 0.0647e-6; // initial calcium concentration
6
- pub const F: f64 = 96485.3329; // As/mol
7
- pub const R: f64 = 8.3144598; // kgm^2/s^2molK
8
- pub const T: f64 = 293.0; // K, TODO: 20°C good?
6
+ pub const F: f64 = 96485.3329; // Faraday-Constant [F] = As/mol
7
+ pub const R: f64 = 8.3144598; // Gas-Constant [R] = kgm^2/s^2molK
8
+ pub const T: f64 = 293.0; // Temperature [T] = K, TODO: 20°C good?
9
9
 
10
10
  pub enum IonType {
11
11
  Kalium,
12
12
  Calcium,
13
13
  Chlorine,
14
+ Sodium,
14
15
  }
15
16
 
16
17
  pub fn reversal_potential(ion: IonType) -> f64 {
@@ -18,5 +19,6 @@ pub fn reversal_potential(ion: IonType) -> f64 {
18
19
  IonType::Kalium => -77.4e-3, // reversal potential K,
19
20
  IonType::Calcium => 95.6e-3, // reversal potential Ca,
20
21
  IonType::Chlorine => -7.9e-3, // reversal potential Cl,
22
+ IonType::Sodium => -5000.0, // TODO: reversal potential Na,
21
23
  }
22
24
  }
@@ -57,7 +57,7 @@ fn save_to_json(measurements: PatchClampData, subsampling: Option<usize>) {
57
57
  #[command(
58
58
  about = "In-Silico Cancer Cell Model Simulator",
59
59
  author = "Peter Waldert <peter@waldert.at>",
60
- version = "0.1.0"
60
+ version = "0.2.0"
61
61
  )]
62
62
  struct Cli {
63
63
  /// Turn debugging information on
@@ -96,9 +96,8 @@ impl ChannelCountsProblem {
96
96
  }
97
97
 
98
98
  #[cfg(feature = "pyo3")]
99
- fn get_current_basis(slf: pyo3::PyRef<'_, Self>) -> pyo3::PyObject {
100
- use pyo3::IntoPy;
101
- let matrix = slf.current_basis.clone().unwrap();
99
+ fn get_current_basis(&self) -> Vec<Vec<f64>> {
100
+ let matrix = self.current_basis.clone().unwrap();
102
101
  let mut list_of_lists = Vec::new();
103
102
  for row in matrix.row_iter() {
104
103
  let mut row_vector = Vec::new();
@@ -107,7 +106,7 @@ impl ChannelCountsProblem {
107
106
  }
108
107
  list_of_lists.push(row_vector);
109
108
  }
110
- list_of_lists.into_py(slf.py())
109
+ list_of_lists
111
110
  }
112
111
 
113
112
  fn solve_through_projection(&self) -> ChannelCounts {
@@ -84,9 +84,9 @@ impl PatchClampData {
84
84
  current = Some(current.unwrap() / (raw_data.len() as f64));
85
85
  match (&phase, &protocol) {
86
86
  (CellPhase::G0, PatchClampProtocol::Activation) => {
87
- let scaled = current.unwrap() * 1e11;
87
+ let scaled = current.unwrap() * 1e12; // in pico-Ampere
88
88
  current = Some(DVector::from_vec(
89
- scaled.iter().cloned().map(|x| x.max(-24.0)).collect::<Vec<f64>>(),
89
+ scaled.iter().cloned().map(|x| x.max(-240.0)).collect::<Vec<f64>>(),
90
90
  ));
91
91
  }
92
92
  _ => {}
@@ -114,6 +114,10 @@ impl PatchClampData {
114
114
  }
115
115
  }
116
116
 
117
+ pub fn to_list(&self) -> Vec<f64> {
118
+ self.current.iter().cloned().collect::<Vec<f64>>()
119
+ }
120
+
117
121
  #[cfg_attr(feature = "pyo3", staticmethod)]
118
122
  pub fn demo() -> PatchClampData {
119
123
  let mut c = DVector::zeros(100);
@@ -17,10 +17,13 @@ fn get_log_level() -> log::LevelFilter {
17
17
  #[cfg_attr(feature = "pyo3", pyo3::pyfunction)]
18
18
  pub fn setup_logging() {
19
19
  let log_level = get_log_level();
20
+ let mut config_builder = simplelog::ConfigBuilder::new();
21
+ #[cfg(target_arch = "wasm32")]
22
+ config_builder.set_time_level(simplelog::LevelFilter::Off);
20
23
  simplelog::CombinedLogger::init(vec![
21
24
  simplelog::TermLogger::new(
22
25
  log_level,
23
- simplelog::Config::default(),
26
+ config_builder.build(),
24
27
  simplelog::TerminalMode::Mixed,
25
28
  simplelog::ColorChoice::Auto,
26
29
  ),
@@ -1,20 +0,0 @@
1
- import matplotlib.axes
2
- import matplotlib.pyplot as plt
3
- import pathlib
4
-
5
- RESULTS = pathlib.Path.cwd()
6
-
7
-
8
- def plot_measurement():
9
- fig = plt.figure()
10
- axes: matplotlib.axes.Axes = fig.add_subplot(1, 1, 1)
11
- axes.plot()
12
- axes.set_xlabel("")
13
- axes.set_ylabel("")
14
- axes.legend()
15
- fig.savefig(str(RESULTS / "plot.pdf"))
16
-
17
-
18
- def set_results_folder(path: pathlib.Path):
19
- global RESULTS
20
- RESULTS = path