entitysdk 0.5.1__tar.gz → 0.6.1__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 (126) hide show
  1. {entitysdk-0.5.1/src/entitysdk.egg-info → entitysdk-0.6.1}/PKG-INFO +1 -1
  2. {entitysdk-0.5.1 → entitysdk-0.6.1}/examples/01_searching.ipynb +1 -15
  3. {entitysdk-0.5.1 → entitysdk-0.6.1}/examples/02_morphology.ipynb +1 -82
  4. {entitysdk-0.5.1 → entitysdk-0.6.1}/examples/03_circuit.ipynb +88 -8
  5. entitysdk-0.6.1/examples/04_simulation_campaign.ipynb +389 -0
  6. entitysdk-0.6.1/examples/utils.py +13 -0
  7. {entitysdk-0.5.1 → entitysdk-0.6.1}/pyproject.toml +1 -0
  8. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/client.py +152 -16
  9. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/core.py +90 -9
  10. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/downloaders/emodel.py +1 -1
  11. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/downloaders/ion_channel_model.py +1 -1
  12. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/__init__.py +8 -0
  13. entitysdk-0.6.1/src/entitysdk/models/activity.py +16 -0
  14. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/asset.py +41 -1
  15. entitysdk-0.6.1/src/entitysdk/models/brain_region_hierarchy.py +19 -0
  16. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/simulation_campaign.py +2 -0
  17. entitysdk-0.6.1/src/entitysdk/models/simulation_execution.py +10 -0
  18. entitysdk-0.6.1/src/entitysdk/models/simulation_generation.py +9 -0
  19. entitysdk-0.6.1/src/entitysdk/models/simulation_result.py +10 -0
  20. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/route.py +4 -0
  21. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/serdes.py +24 -3
  22. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/types.py +10 -0
  23. {entitysdk-0.5.1 → entitysdk-0.6.1/src/entitysdk.egg-info}/PKG-INFO +1 -1
  24. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk.egg-info/SOURCES.txt +6 -0
  25. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/downloaders/test_emodel.py +1 -1
  26. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/downloaders/test_ion_channel_model.py +1 -1
  27. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/downloaders/test_memodel.py +2 -2
  28. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/ion_channel_model.json +1 -0
  29. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/reconstruction_morphology.json +2 -0
  30. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/simulation_campaign.json +1 -0
  31. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_asset.py +1 -0
  32. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_client.py +288 -3
  33. entitysdk-0.6.1/tests/unit/test_serdes.py +95 -0
  34. {entitysdk-0.5.1 → entitysdk-0.6.1}/tox.ini +1 -0
  35. entitysdk-0.5.1/examples/04_simulation_campaign.ipynb +0 -175
  36. entitysdk-0.5.1/tests/unit/test_serdes.py +0 -54
  37. {entitysdk-0.5.1 → entitysdk-0.6.1}/.github/workflows/sdist.yml +0 -0
  38. {entitysdk-0.5.1 → entitysdk-0.6.1}/.github/workflows/tox.yml +0 -0
  39. {entitysdk-0.5.1 → entitysdk-0.6.1}/.gitignore +0 -0
  40. {entitysdk-0.5.1 → entitysdk-0.6.1}/CHANGELOG.rst +0 -0
  41. {entitysdk-0.5.1 → entitysdk-0.6.1}/CONTRIBUTING.md +0 -0
  42. {entitysdk-0.5.1 → entitysdk-0.6.1}/LICENSE.txt +0 -0
  43. {entitysdk-0.5.1 → entitysdk-0.6.1}/README.md +0 -0
  44. {entitysdk-0.5.1 → entitysdk-0.6.1}/setup.cfg +0 -0
  45. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/__init__.py +0 -0
  46. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/common.py +0 -0
  47. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/config.py +0 -0
  48. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/downloaders/__init__.py +0 -0
  49. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/downloaders/memodel.py +0 -0
  50. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/downloaders/morphology.py +0 -0
  51. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/exception.py +0 -0
  52. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/mixin.py +0 -0
  53. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/agent.py +0 -0
  54. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/base.py +0 -0
  55. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/brain_location.py +0 -0
  56. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/brain_region.py +0 -0
  57. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/circuit.py +0 -0
  58. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/classification.py +0 -0
  59. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/contribution.py +0 -0
  60. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/core.py +0 -0
  61. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/electrical_cell_recording.py +0 -0
  62. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/emodel.py +0 -0
  63. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/entity.py +0 -0
  64. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/etype.py +0 -0
  65. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/ion_channel_model.py +0 -0
  66. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/license.py +0 -0
  67. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/memodel.py +0 -0
  68. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/memodelcalibrationresult.py +0 -0
  69. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/morphology.py +0 -0
  70. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/mtype.py +0 -0
  71. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/response.py +0 -0
  72. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/scientific_artifact.py +0 -0
  73. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/simulation.py +0 -0
  74. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/single_neuron_simulation.py +0 -0
  75. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/single_neuron_synaptome_simulation.py +0 -0
  76. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/subject.py +0 -0
  77. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/synaptome.py +0 -0
  78. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/taxonomy.py +0 -0
  79. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/models/validation_result.py +0 -0
  80. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/result.py +0 -0
  81. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/schemas/__init__.py +0 -0
  82. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/schemas/asset.py +0 -0
  83. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/schemas/base.py +0 -0
  84. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/schemas/memodel.py +0 -0
  85. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/token_manager.py +0 -0
  86. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/util.py +0 -0
  87. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/utils/__init__.py +0 -0
  88. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/utils/asset.py +0 -0
  89. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk/utils/filesystem.py +0 -0
  90. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk.egg-info/dependency_links.txt +0 -0
  91. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk.egg-info/requires.txt +0 -0
  92. {entitysdk-0.5.1 → entitysdk-0.6.1}/src/entitysdk.egg-info/top_level.txt +0 -0
  93. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/__init__.py +0 -0
  94. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/integration/__init__.py +0 -0
  95. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/integration/conftest.py +0 -0
  96. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/integration/test_searching.py +0 -0
  97. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/__init__.py +0 -0
  98. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/conftest.py +0 -0
  99. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/downloaders/test_morphology.py +0 -0
  100. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/__init__.py +0 -0
  101. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/.gitignore +0 -0
  102. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/circuit.json +0 -0
  103. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/electrical_cell_recording.json +0 -0
  104. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/memodel_calibration_result.json +0 -0
  105. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/data/validation_result.json +0 -0
  106. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_agent.py +0 -0
  107. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_brain_region.py +0 -0
  108. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_circuit.py +0 -0
  109. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_contribution.py +0 -0
  110. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_electrical_cell_recording.py +0 -0
  111. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_init.py +0 -0
  112. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_ion_channel_model.py +0 -0
  113. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_memodel_calibration_result.py +0 -0
  114. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_morphology.py +0 -0
  115. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_simulation_campaign.py +0 -0
  116. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/models/test_validation_result.py +0 -0
  117. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_base.py +0 -0
  118. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_common.py +0 -0
  119. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_config.py +0 -0
  120. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_result.py +0 -0
  121. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_route.py +0 -0
  122. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_token_manager.py +0 -0
  123. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/test_util.py +0 -0
  124. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/util.py +0 -0
  125. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/utils/test_asset.py +0 -0
  126. {entitysdk-0.5.1 → entitysdk-0.6.1}/tests/unit/utils/test_filesystem.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: entitysdk
3
- Version: 0.5.1
3
+ Version: 0.6.1
4
4
  Summary: Python library for interacting with the entitycore service
5
5
  Author-email: Open Brain Institute <info@openbraininstitute.org>
6
6
  Maintainer-email: Open Brain Institute <info@openbraininstitute.org>
@@ -283,22 +283,8 @@
283
283
  }
284
284
  ],
285
285
  "metadata": {
286
- "kernelspec": {
287
- "display_name": "Python 3 (ipykernel)",
288
- "language": "python",
289
- "name": "python3"
290
- },
291
286
  "language_info": {
292
- "codemirror_mode": {
293
- "name": "ipython",
294
- "version": 3
295
- },
296
- "file_extension": ".py",
297
- "mimetype": "text/x-python",
298
- "name": "python",
299
- "nbconvert_exporter": "python",
300
- "pygments_lexer": "ipython3",
301
- "version": "3.12.10"
287
+ "name": "python"
302
288
  }
303
289
  },
304
290
  "nbformat": 4,
@@ -312,16 +312,6 @@
312
312
  "fetched = client.get_entity(entity_id=registered.id, entity_type=ReconstructionMorphology)"
313
313
  ]
314
314
  },
315
- {
316
- "cell_type": "code",
317
- "execution_count": null,
318
- "id": "70271bac-cc92-49a1-9bdd-aa03bac92a73",
319
- "metadata": {},
320
- "outputs": [],
321
- "source": [
322
- "rprint(fetched)"
323
- ]
324
- },
325
315
  {
326
316
  "cell_type": "markdown",
327
317
  "id": "b00725dc-ba90-4ddf-b3ba-dea612cd7720",
@@ -382,63 +372,6 @@
382
372
  "rprint(fetched.assets)"
383
373
  ]
384
374
  },
385
- {
386
- "cell_type": "markdown",
387
- "id": "34b39d9d-2b08-4933-b3cb-3f9a9c08004b",
388
- "metadata": {},
389
- "source": [
390
- "## Update asset"
391
- ]
392
- },
393
- {
394
- "cell_type": "code",
395
- "execution_count": null,
396
- "id": "69d44c3c-b07c-46d2-978f-98b1b80b5212",
397
- "metadata": {},
398
- "outputs": [],
399
- "source": [
400
- "# update h5 asset with another file\n",
401
- "with tempfile.TemporaryDirectory() as tdir:\n",
402
- " file1 = Path(tdir, \"updated.h5\")\n",
403
- " file1.write_text(\"updated h5\")\n",
404
- " file1.touch()\n",
405
- "\n",
406
- " for asset in fetched.assets:\n",
407
- " if asset.content_type == \"application/h5\":\n",
408
- " updated_asset = client.update_asset_file(\n",
409
- " entity_id=fetched.id,\n",
410
- " entity_type=type(registered),\n",
411
- " asset_id=asset.id,\n",
412
- " file_name=asset1.path,\n",
413
- " file_path=file1,\n",
414
- " file_content_type=asset.content_type,\n",
415
- " )\n",
416
- " break\n",
417
- "\n",
418
- "\n",
419
- "# synchronize morphology with new server data\n",
420
- "fetched = client.get_entity(\n",
421
- " entity_id=registered.id, entity_type=ReconstructionMorphology, token=token\n",
422
- ")\n",
423
- "rprint(fetched.assets)\n",
424
- "\n",
425
- "\n",
426
- "# download updated file and check it was successfully updated\n",
427
- "for asset in fetched.assets:\n",
428
- " if asset.content_type == \"application/h5\":\n",
429
- " client.download_file(\n",
430
- " entity_id=fetched.id,\n",
431
- " entity_type=type(fetched),\n",
432
- " asset_id=updated_asset.id,\n",
433
- " output_path=\"./my-file.h5\",\n",
434
- " )\n",
435
- " content = client.download_content(\n",
436
- " entity_id=fetched.id, entity_type=type(fetched), asset_id=asset.id\n",
437
- " )\n",
438
- " break\n",
439
- "print(content)"
440
- ]
441
- },
442
375
  {
443
376
  "cell_type": "markdown",
444
377
  "id": "f15c808c-c454-4277-9ec4-587922ac74f3",
@@ -475,22 +408,8 @@
475
408
  }
476
409
  ],
477
410
  "metadata": {
478
- "kernelspec": {
479
- "display_name": "Python 3 (ipykernel)",
480
- "language": "python",
481
- "name": "python3"
482
- },
483
411
  "language_info": {
484
- "codemirror_mode": {
485
- "name": "ipython",
486
- "version": 3
487
- },
488
- "file_extension": ".py",
489
- "mimetype": "text/x-python",
490
- "name": "python",
491
- "nbconvert_exporter": "python",
492
- "pygments_lexer": "ipython3",
493
- "version": "3.12.10"
412
+ "name": "python"
494
413
  }
495
414
  },
496
415
  "nbformat": 4,
@@ -8,8 +8,11 @@
8
8
  "outputs": [],
9
9
  "source": [
10
10
  "import os\n",
11
+ "import tempfile\n",
12
+ "from pathlib import Path\n",
11
13
  "\n",
12
14
  "from rich import print as rprint\n",
15
+ "from utils import create_mock_circuit_dir\n",
13
16
  "\n",
14
17
  "from entitysdk import Client, ProjectContext, models\n",
15
18
  "\n",
@@ -109,39 +112,116 @@
109
112
  },
110
113
  {
111
114
  "cell_type": "markdown",
112
- "id": "8bf620b4-fafc-4476-a719-bbe6e7a821bf",
115
+ "id": "c3ff25a9-fc61-4c19-8949-140c1dd33af7",
113
116
  "metadata": {},
114
117
  "source": [
115
- "## Fetch Circuit"
118
+ "## Upload directory"
116
119
  ]
117
120
  },
118
121
  {
119
122
  "cell_type": "code",
120
123
  "execution_count": null,
121
- "id": "bed0af2c-ae46-41b0-ba77-485daef0a87b",
124
+ "id": "3dccd413-f91b-42b1-8efe-56d01f68ddd0",
122
125
  "metadata": {},
123
126
  "outputs": [],
124
127
  "source": [
125
- "fetched = client.get_entity(entity_id=registered_circuit.id, entity_type=models.Circuit)"
128
+ "with tempfile.TemporaryDirectory() as tdir:\n",
129
+ " # create a hierarchy of files to upload\n",
130
+ " create_mock_circuit_dir(tdir)\n",
131
+ "\n",
132
+ " files = {str(path.relative_to(tdir)): path for path in Path(tdir).rglob(\"*\") if path.is_file()}\n",
133
+ "\n",
134
+ " directory_asset = client.upload_directory(\n",
135
+ " entity_id=registered_circuit.id,\n",
136
+ " entity_type=models.Circuit,\n",
137
+ " name=\"circuit\",\n",
138
+ " paths=files,\n",
139
+ " )"
140
+ ]
141
+ },
142
+ {
143
+ "cell_type": "markdown",
144
+ "id": "6ad6ce94-ad74-4710-b274-1883fdeb41f5",
145
+ "metadata": {},
146
+ "source": [
147
+ "## List directory"
126
148
  ]
127
149
  },
128
150
  {
129
151
  "cell_type": "code",
130
152
  "execution_count": null,
131
- "id": "ee27c8b5-dfa5-4fa5-ac2f-6cf158057bcf",
153
+ "id": "3b0d302e-46fe-4d97-b221-99833975eede",
132
154
  "metadata": {},
133
155
  "outputs": [],
134
156
  "source": [
135
- "rprint(fetched)"
157
+ "files = client.list_directory(\n",
158
+ " entity_id=registered_circuit.id, entity_type=models.Circuit, asset_id=directory_asset.id\n",
159
+ ")"
136
160
  ]
137
161
  },
138
162
  {
139
163
  "cell_type": "code",
140
164
  "execution_count": null,
141
- "id": "f359b797-02ad-4358-bef7-ad3f3008d323",
165
+ "id": "749b85d2-dbce-455b-9ade-fec7e17f7208",
142
166
  "metadata": {},
143
167
  "outputs": [],
144
- "source": []
168
+ "source": [
169
+ "rprint(files)"
170
+ ]
171
+ },
172
+ {
173
+ "cell_type": "markdown",
174
+ "id": "aad97379-3010-42c9-9fc5-f30101163f1c",
175
+ "metadata": {},
176
+ "source": [
177
+ "## Download directory"
178
+ ]
179
+ },
180
+ {
181
+ "cell_type": "code",
182
+ "execution_count": null,
183
+ "id": "ace27230-6dfa-4bc6-8b2c-33998a22a111",
184
+ "metadata": {},
185
+ "outputs": [],
186
+ "source": [
187
+ "with tempfile.TemporaryDirectory() as tdir:\n",
188
+ " client.download_directory(\n",
189
+ " entity_id=registered_circuit.id,\n",
190
+ " entity_type=models.Circuit,\n",
191
+ " asset_id=directory_asset.id,\n",
192
+ " output_path=Path(tdir),\n",
193
+ " )\n",
194
+ " files = {str(path.relative_to(tdir)): path for path in Path(tdir).rglob(\"*\") if path.is_file()}\n",
195
+ " rprint(files)"
196
+ ]
197
+ },
198
+ {
199
+ "cell_type": "markdown",
200
+ "id": "8bf620b4-fafc-4476-a719-bbe6e7a821bf",
201
+ "metadata": {},
202
+ "source": [
203
+ "## Fetch Circuit"
204
+ ]
205
+ },
206
+ {
207
+ "cell_type": "code",
208
+ "execution_count": null,
209
+ "id": "bed0af2c-ae46-41b0-ba77-485daef0a87b",
210
+ "metadata": {},
211
+ "outputs": [],
212
+ "source": [
213
+ "fetched = client.get_entity(entity_id=registered_circuit.id, entity_type=models.Circuit)"
214
+ ]
215
+ },
216
+ {
217
+ "cell_type": "code",
218
+ "execution_count": null,
219
+ "id": "ee27c8b5-dfa5-4fa5-ac2f-6cf158057bcf",
220
+ "metadata": {},
221
+ "outputs": [],
222
+ "source": [
223
+ "rprint(fetched)"
224
+ ]
145
225
  }
146
226
  ],
147
227
  "metadata": {
@@ -0,0 +1,389 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "9bc20f94-86d5-494d-b2c7-079ea731c162",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "import os\n",
11
+ "from datetime import UTC, datetime\n",
12
+ "\n",
13
+ "from rich import print as rprint\n",
14
+ "\n",
15
+ "from entitysdk import Client, ProjectContext, models\n",
16
+ "\n",
17
+ "entitycore_api_url = \"http://127.0.0.1:8000\"\n",
18
+ "project_context = ProjectContext(\n",
19
+ " virtual_lab_id=\"a98b7abc-fc46-4700-9e3d-37137812c730\",\n",
20
+ " project_id=\"0dbced5f-cc3d-488a-8c7f-cfb8ea039dc6\",\n",
21
+ ")\n",
22
+ "token = os.getenv(\"ACCESS_TOKEN\", \"XXX\")\n",
23
+ "client = Client(api_url=entitycore_api_url, project_context=project_context, token_manager=token)"
24
+ ]
25
+ },
26
+ {
27
+ "cell_type": "markdown",
28
+ "id": "2e29f4cb-28ae-447a-8ac2-bc319f2d33b8",
29
+ "metadata": {},
30
+ "source": [
31
+ "## Register a Circuit"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "code",
36
+ "execution_count": null,
37
+ "id": "5d5d04b1-59be-44a9-a283-2856783768f0",
38
+ "metadata": {},
39
+ "outputs": [],
40
+ "source": [
41
+ "species = client.search_entity(\n",
42
+ " entity_type=models.Species, query={\"name__ilike\": \"Homo sapiens\"}\n",
43
+ ").one()\n",
44
+ "\n",
45
+ "subject = models.Subject(\n",
46
+ " name=\"my-subject\", description=\"my-subject-description\", sex=\"male\", species=species\n",
47
+ ")\n",
48
+ "subject = client.register_entity(subject)\n",
49
+ "\n",
50
+ "brain_region = client.search_entity(entity_type=models.BrainRegion, query={\"acronym\": \"CB\"}).first()\n",
51
+ "\n",
52
+ "\n",
53
+ "circuit = models.Circuit(\n",
54
+ " name=\"my-circuit\",\n",
55
+ " description=\"my-circuit\",\n",
56
+ " subject=subject,\n",
57
+ " brain_region=brain_region,\n",
58
+ " number_synapses=2,\n",
59
+ " number_neurons=5,\n",
60
+ " number_connections=10,\n",
61
+ " scale=\"microcircuit\",\n",
62
+ " build_category=\"em_reconstruction\",\n",
63
+ ")\n",
64
+ "\n",
65
+ "circuit = client.register_entity(circuit)"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "markdown",
70
+ "id": "08520e6d-1b5d-4d89-afeb-1f77feeeff6d",
71
+ "metadata": {},
72
+ "source": [
73
+ "# 1. Register the entire provenance at once\n",
74
+ "When all entities are available up front the entire provenance can be generated using the creation endpoints without any updating taking place."
75
+ ]
76
+ },
77
+ {
78
+ "cell_type": "markdown",
79
+ "id": "bb0984e9-b382-435c-b114-69b76403dcda",
80
+ "metadata": {},
81
+ "source": [
82
+ "## Register all entities"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": null,
88
+ "id": "1e7eb667-d6cf-46db-9f7c-b69ab1838cf5",
89
+ "metadata": {},
90
+ "outputs": [],
91
+ "source": [
92
+ "campaign = client.register_entity(\n",
93
+ " models.SimulationCampaign(\n",
94
+ " name=\"my-campaign\",\n",
95
+ " description=\"my-campaign-description\",\n",
96
+ " entity_id=circuit.id,\n",
97
+ " scan_parameters={\"foo\": \"bar\"},\n",
98
+ " )\n",
99
+ ")\n",
100
+ "\n",
101
+ "simulations = [\n",
102
+ " client.register_entity(\n",
103
+ " models.Simulation(\n",
104
+ " name=f\"sim-{i}\",\n",
105
+ " description=f\"sim-{i}\",\n",
106
+ " scan_parameters={\"foo\": \"bar\"},\n",
107
+ " entity_id=circuit.id,\n",
108
+ " simulation_campaign_id=campaign.id,\n",
109
+ " )\n",
110
+ " )\n",
111
+ " for i in range(5)\n",
112
+ "]\n",
113
+ "simulation_results = [\n",
114
+ " client.register_entity(models.SimulationResult(name=f\"result-{i}\", description=f\"result-{i}\"))\n",
115
+ " for i in range(5)\n",
116
+ "]"
117
+ ]
118
+ },
119
+ {
120
+ "cell_type": "markdown",
121
+ "id": "6c8b7d39-2858-4d39-8a87-01f8fd71c2af",
122
+ "metadata": {},
123
+ "source": [
124
+ "## Register activities"
125
+ ]
126
+ },
127
+ {
128
+ "cell_type": "code",
129
+ "execution_count": null,
130
+ "id": "4a13c71f-84ae-4bcf-bfbd-637b124963db",
131
+ "metadata": {},
132
+ "outputs": [],
133
+ "source": [
134
+ "simulation_generation = client.register_entity(\n",
135
+ " models.SimulationGeneration(\n",
136
+ " start_time=datetime.now(UTC),\n",
137
+ " used=[campaign],\n",
138
+ " generated=simulations,\n",
139
+ " )\n",
140
+ ")\n",
141
+ "\n",
142
+ "simulation_executions = [\n",
143
+ " client.register_entity(\n",
144
+ " models.SimulationExecution(\n",
145
+ " used=[simulations[i]],\n",
146
+ " generated=[simulation_results[i]],\n",
147
+ " start_time=datetime.now(UTC),\n",
148
+ " status=\"done\",\n",
149
+ " )\n",
150
+ " )\n",
151
+ " for i in range(5)\n",
152
+ "]"
153
+ ]
154
+ },
155
+ {
156
+ "cell_type": "code",
157
+ "execution_count": null,
158
+ "id": "085c2ae7-ca05-49d9-92a7-a14db5b52616",
159
+ "metadata": {},
160
+ "outputs": [],
161
+ "source": [
162
+ "rprint(simulation_generation)\n",
163
+ "rprint(simulation_executions)"
164
+ ]
165
+ },
166
+ {
167
+ "cell_type": "markdown",
168
+ "id": "34d071a7-47d5-4f46-ba42-269082cfc71e",
169
+ "metadata": {},
170
+ "source": [
171
+ "# 2. Register provenance gradually"
172
+ ]
173
+ },
174
+ {
175
+ "cell_type": "markdown",
176
+ "id": "eb0132f6-88e4-4700-a2b7-799bb0ee77e6",
177
+ "metadata": {},
178
+ "source": [
179
+ "## Register a SimulationCampaign"
180
+ ]
181
+ },
182
+ {
183
+ "cell_type": "code",
184
+ "execution_count": null,
185
+ "id": "ed03bf00-51da-43eb-b887-8d0502c404c6",
186
+ "metadata": {},
187
+ "outputs": [],
188
+ "source": [
189
+ "campaign = client.register_entity(\n",
190
+ " models.SimulationCampaign(\n",
191
+ " name=\"my-campaign\",\n",
192
+ " description=\"my-campaign-description\",\n",
193
+ " entity_id=circuit.id,\n",
194
+ " scan_parameters={\"foo\": \"bar\"},\n",
195
+ " )\n",
196
+ ")"
197
+ ]
198
+ },
199
+ {
200
+ "cell_type": "markdown",
201
+ "id": "379201b4-39fd-4c0c-ac51-bc6bc2a976cb",
202
+ "metadata": {},
203
+ "source": [
204
+ "## Register SimulationGeneration"
205
+ ]
206
+ },
207
+ {
208
+ "cell_type": "code",
209
+ "execution_count": null,
210
+ "id": "279f388c-968d-4a4f-bdf5-34612bce6440",
211
+ "metadata": {},
212
+ "outputs": [],
213
+ "source": [
214
+ "sim_generation = client.register_entity(\n",
215
+ " models.SimulationGeneration(\n",
216
+ " start_time=datetime.now(UTC),\n",
217
+ " used=[campaign],\n",
218
+ " )\n",
219
+ ")"
220
+ ]
221
+ },
222
+ {
223
+ "cell_type": "markdown",
224
+ "id": "d5c5fd58-3c00-4452-90ac-54ca0269e165",
225
+ "metadata": {},
226
+ "source": [
227
+ "## Register Simulations"
228
+ ]
229
+ },
230
+ {
231
+ "cell_type": "code",
232
+ "execution_count": null,
233
+ "id": "75430feb-1bf2-4152-8204-75619fe8d51e",
234
+ "metadata": {},
235
+ "outputs": [],
236
+ "source": [
237
+ "simulations = [\n",
238
+ " client.register_entity(\n",
239
+ " models.Simulation(\n",
240
+ " name=f\"sim-{i}\",\n",
241
+ " description=f\"sim-{i}\",\n",
242
+ " scan_parameters={\"foo\": \"bar\"},\n",
243
+ " entity_id=circuit.id,\n",
244
+ " simulation_campaign_id=campaign.id,\n",
245
+ " )\n",
246
+ " )\n",
247
+ " for i in range(5)\n",
248
+ "]"
249
+ ]
250
+ },
251
+ {
252
+ "cell_type": "markdown",
253
+ "id": "847511de-60a7-4c37-aeae-9eba5ee50f8a",
254
+ "metadata": {},
255
+ "source": [
256
+ "## Update SimulationGeneration with simulations"
257
+ ]
258
+ },
259
+ {
260
+ "cell_type": "code",
261
+ "execution_count": null,
262
+ "id": "6f113473-4af1-4824-9102-f64e6ddc779d",
263
+ "metadata": {},
264
+ "outputs": [],
265
+ "source": [
266
+ "data_to_update = {\n",
267
+ " \"generated_ids\": [s.id for s in simulations],\n",
268
+ " \"end_time\": datetime.now(UTC),\n",
269
+ "}\n",
270
+ "\n",
271
+ "updated_sim_generation = client.update_entity(\n",
272
+ " entity_id=sim_generation.id, entity_type=type(sim_generation), attrs_or_entity=data_to_update\n",
273
+ ")"
274
+ ]
275
+ },
276
+ {
277
+ "cell_type": "code",
278
+ "execution_count": null,
279
+ "id": "29ee7fc8-da7a-4a05-af19-5032865e7246",
280
+ "metadata": {},
281
+ "outputs": [],
282
+ "source": [
283
+ "rprint(updated_sim_generation)"
284
+ ]
285
+ },
286
+ {
287
+ "cell_type": "markdown",
288
+ "id": "027b5f7a-5191-4785-9e45-616a8c1a93da",
289
+ "metadata": {},
290
+ "source": [
291
+ "## Create simulation executions"
292
+ ]
293
+ },
294
+ {
295
+ "cell_type": "code",
296
+ "execution_count": null,
297
+ "id": "5622a11d-205d-458c-b3a9-6002cc6f9ae0",
298
+ "metadata": {},
299
+ "outputs": [],
300
+ "source": [
301
+ "executions = [\n",
302
+ " client.register_entity(\n",
303
+ " models.SimulationExecution(\n",
304
+ " used=[simulations[i]],\n",
305
+ " start_time=datetime.now(UTC),\n",
306
+ " status=\"created\",\n",
307
+ " )\n",
308
+ " )\n",
309
+ " for i in range(5)\n",
310
+ "]"
311
+ ]
312
+ },
313
+ {
314
+ "cell_type": "markdown",
315
+ "id": "9ffccf17-1429-4538-bec0-21e9cc444a95",
316
+ "metadata": {},
317
+ "source": [
318
+ "## Create simulation results"
319
+ ]
320
+ },
321
+ {
322
+ "cell_type": "code",
323
+ "execution_count": null,
324
+ "id": "b74fab6e-be66-4c0a-bd0d-da4ecdcabed3",
325
+ "metadata": {},
326
+ "outputs": [],
327
+ "source": [
328
+ "results = [\n",
329
+ " client.register_entity(models.SimulationResult(name=f\"result-{i}\", description=f\"result-{i}\"))\n",
330
+ " for i in range(5)\n",
331
+ "]"
332
+ ]
333
+ },
334
+ {
335
+ "cell_type": "markdown",
336
+ "id": "77819c3b-a111-4c62-bf07-a66a1801b69f",
337
+ "metadata": {},
338
+ "source": [
339
+ "## Update simulation executions with results"
340
+ ]
341
+ },
342
+ {
343
+ "cell_type": "code",
344
+ "execution_count": null,
345
+ "id": "6ee592a1-06a5-4593-bb00-84ea40e956e0",
346
+ "metadata": {},
347
+ "outputs": [],
348
+ "source": [
349
+ "updated_executions = [\n",
350
+ " client.update_entity(\n",
351
+ " entity_id=executions[i].id,\n",
352
+ " entity_type=models.SimulationExecution,\n",
353
+ " attrs_or_entity={\n",
354
+ " \"generated_ids\": [results[i].id],\n",
355
+ " \"end_time\": datetime.now(UTC),\n",
356
+ " \"status\": \"done\",\n",
357
+ " },\n",
358
+ " )\n",
359
+ " for i in range(5)\n",
360
+ "]"
361
+ ]
362
+ },
363
+ {
364
+ "cell_type": "code",
365
+ "execution_count": null,
366
+ "id": "98d1320a-fdcb-4d4a-ae25-faac8d7676b3",
367
+ "metadata": {},
368
+ "outputs": [],
369
+ "source": [
370
+ "rprint(updated_executions)"
371
+ ]
372
+ },
373
+ {
374
+ "cell_type": "code",
375
+ "execution_count": null,
376
+ "id": "b3260f79-5852-4e61-923f-4325e030fc71",
377
+ "metadata": {},
378
+ "outputs": [],
379
+ "source": []
380
+ }
381
+ ],
382
+ "metadata": {
383
+ "language_info": {
384
+ "name": "python"
385
+ }
386
+ },
387
+ "nbformat": 4,
388
+ "nbformat_minor": 5
389
+ }
@@ -0,0 +1,13 @@
1
+ """Helpers."""
2
+
3
+ from pathlib import Path
4
+
5
+
6
+ def create_mock_circuit_dir(output_dir: Path):
7
+ """Create a mock hierarchy that looks like a circuit."""
8
+ output_dir = Path(output_dir)
9
+ output_dir.mkdir(exist_ok=True)
10
+ (output_dir / "circuit_config.json").touch()
11
+ (output_dir / "sonata").mkdir()
12
+ (output_dir / "sonata" / "nodes.h5").touch()
13
+ (output_dir / "sonata" / "edges.h5").touch()
@@ -59,6 +59,7 @@ select = [
59
59
  "UP", # pyupgrade
60
60
  ]
61
61
  ignore = [
62
+ "S101", # allow `assert`
62
63
  ]
63
64
 
64
65
  [tool.ruff.lint.pydocstyle]