diff --git a/alembic/versions/20250526_173512_8d1610d7c882_default_migration_message.py b/alembic/versions/20250526_173512_8d1610d7c882_default_migration_message.py new file mode 100644 index 00000000..26ab1466 --- /dev/null +++ b/alembic/versions/20250526_173512_8d1610d7c882_default_migration_message.py @@ -0,0 +1,34 @@ +"""Default migration message + +Revision ID: 8d1610d7c882 +Revises: 634224e88212 +Create Date: 2025-05-26 17:35:12.743948 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +from sqlalchemy import Text +import app.db.types + +# revision identifiers, used by Alembic. +revision: str = "8d1610d7c882" +down_revision: Union[str, None] = "634224e88212" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint("unique_person_name_1", "person", type_="unique") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_unique_constraint("unique_person_name_1", "person", ["given_name", "family_name"]) + # ### end Alembic commands ### diff --git a/alembic/versions/20250526_222351_1589bff44728_default_migration_message.py b/alembic/versions/20250526_222351_1589bff44728_default_migration_message.py new file mode 100644 index 00000000..4750c11a --- /dev/null +++ b/alembic/versions/20250526_222351_1589bff44728_default_migration_message.py @@ -0,0 +1,138 @@ +"""Default migration message + +Revision ID: 1589bff44728 +Revises: 8d1610d7c882 +Create Date: 2025-05-26 22:23:51.082630 + +""" + +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +from alembic_postgresql_enum import TableReference + +from sqlalchemy import Text +import app.db.types + +# revision identifiers, used by Alembic. +revision: str = "1589bff44728" +down_revision: Union[str, None] = "8d1610d7c882" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "memodel_calibration_result", + sa.Column("id", sa.Uuid(), nullable=False), + sa.Column("holding_current", sa.Float(), nullable=False), + sa.Column("threshold_current", sa.Float(), nullable=False), + sa.Column("rin", sa.Float(), nullable=True), + sa.Column("calibrated_entity_id", sa.Uuid(), nullable=False), + sa.ForeignKeyConstraint( + ["calibrated_entity_id"], + ["memodel.id"], + name=op.f("fk_memodel_calibration_result_calibrated_entity_id_memodel"), + ), + sa.ForeignKeyConstraint( + ["id"], ["entity.id"], name=op.f("fk_memodel_calibration_result_id_entity") + ), + sa.PrimaryKeyConstraint("id", name=op.f("pk_memodel_calibration_result")), + ) + op.create_index( + op.f("ix_memodel_calibration_result_calibrated_entity_id"), + "memodel_calibration_result", + ["calibrated_entity_id"], + unique=False, + ) + op.drop_column("memodel", "holding_current") + op.drop_column("memodel", "threshold_current") + op.sync_enum_values( + enum_schema="public", + enum_name="entitytype", + new_values=[ + "analysis_software_source_code", + "brain_atlas", + "brain_atlas_region", + "emodel", + "cell_composition", + "memodel_calibration_result", + "experimental_bouton_density", + "experimental_neuron_density", + "experimental_synapses_per_connection", + "memodel", + "mesh", + "me_type_density", + "reconstruction_morphology", + "electrical_cell_recording", + "electrical_recording_stimulus", + "single_neuron_simulation", + "single_neuron_synaptome", + "single_neuron_synaptome_simulation", + "ion_channel_model", + "subject", + "validation_result", + ], + affected_columns=[ + TableReference(table_schema="public", table_name="entity", column_name="type") + ], + enum_values_to_rename=[], + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.sync_enum_values( + enum_schema="public", + enum_name="entitytype", + new_values=[ + "analysis_software_source_code", + "brain_atlas", + "brain_atlas_region", + "emodel", + "cell_composition", + "experimental_bouton_density", + "experimental_neuron_density", + "experimental_synapses_per_connection", + "memodel", + "mesh", + "me_type_density", + "reconstruction_morphology", + "electrical_cell_recording", + "electrical_recording_stimulus", + "single_neuron_simulation", + "single_neuron_synaptome", + "single_neuron_synaptome_simulation", + "ion_channel_model", + "subject", + "validation_result", + ], + affected_columns=[ + TableReference(table_schema="public", table_name="entity", column_name="type") + ], + enum_values_to_rename=[], + ) + op.add_column( + "memodel", + sa.Column( + "threshold_current", + sa.DOUBLE_PRECISION(precision=53), + autoincrement=False, + nullable=True, + ), + ) + op.add_column( + "memodel", + sa.Column( + "holding_current", sa.DOUBLE_PRECISION(precision=53), autoincrement=False, nullable=True + ), + ) + op.drop_index( + op.f("ix_memodel_calibration_result_calibrated_entity_id"), + table_name="memodel_calibration_result", + ) + op.drop_table("memodel_calibration_result") + # ### end Alembic commands ### diff --git a/app/cli/import_data.py b/app/cli/import_data.py index 1b8e49ce..731639e4 100644 --- a/app/cli/import_data.py +++ b/app/cli/import_data.py @@ -49,6 +49,7 @@ Measurement, MeasurementAnnotation, MEModel, + MEModelCalibrationResult, METypeDensity, MTypeClass, MTypeClassification, @@ -901,13 +902,23 @@ def ingest(db, project_context, data_list, all_data_by_id, hierarchy_name: str): strain_id=morphology.strain_id, creation_date=createdAt, update_date=updatedAt, - holding_current=data.get("holding_current"), - threshold_current=data.get("threshold_current"), ) db.add(db_item) db.flush() - + db_calibration = MEModelCalibrationResult( + calibrated_entity_id=db_item.id, + holding_current=data.get("holding_current", 0), + threshold_current=data.get("threshold_current", 0), + authorized_project_id=project_context.project_id, + authorized_public=AUTHORIZED_PUBLIC, + created_by_id=created_by_id, + updated_by_id=updated_by_id, + creation_date=createdAt, + update_date=updatedAt, + ) + db.add(db_calibration) + db.flush() utils.import_contribution(data, db_item.id, db) for annotation in ensurelist(data.get("annotation", [])): diff --git a/app/db/model.py b/app/db/model.py index 9df07198..e353d37b 100644 --- a/app/db/model.py +++ b/app/db/model.py @@ -231,7 +231,6 @@ class Person(Agent): "polymorphic_identity": __tablename__, "polymorphic_load": "selectin", } - __table_args__ = (UniqueConstraint("given_name", "family_name", name="unique_person_name_1"),) class Organization(Agent): @@ -483,13 +482,17 @@ class MEModel( "ReconstructionMorphology", foreign_keys=[morphology_id], uselist=False ) - holding_current: Mapped[float | None] - threshold_current: Mapped[float | None] - emodel_id: Mapped[uuid.UUID] = mapped_column(ForeignKey(f"{EntityType.emodel}.id")) emodel = relationship("EModel", foreign_keys=[emodel_id], uselist=False) + calibration_result = relationship( + "MEModelCalibrationResult", + uselist=False, + foreign_keys="MEModelCalibrationResult.calibrated_entity_id", + lazy="joined", + ) + __mapper_args__ = {"polymorphic_identity": __tablename__} # noqa: RUF012 @@ -832,6 +835,25 @@ class ValidationResult(Entity): } +class MEModelCalibrationResult(Entity): + __tablename__ = EntityType.memodel_calibration_result.value + id: Mapped[uuid.UUID] = mapped_column(ForeignKey("entity.id"), primary_key=True) + holding_current: Mapped[float] + threshold_current: Mapped[float] + rin: Mapped[float | None] + calibrated_entity_id: Mapped[uuid.UUID] = mapped_column(ForeignKey("memodel.id"), index=True) + calibrated_entity: Mapped[Entity] = relationship( + "MEModel", + uselist=False, + foreign_keys=[calibrated_entity_id], + ) + + __mapper_args__ = { # noqa: RUF012 + "polymorphic_identity": __tablename__, + "inherit_condition": id == Entity.id, + } + + class Asset(Identifiable): """Asset table.""" diff --git a/app/db/types.py b/app/db/types.py index 1250b004..4eb0b02a 100644 --- a/app/db/types.py +++ b/app/db/types.py @@ -53,6 +53,7 @@ class EntityType(StrEnum): brain_atlas_region = auto() emodel = auto() cell_composition = auto() + memodel_calibration_result = auto() experimental_bouton_density = auto() experimental_neuron_density = auto() experimental_synapses_per_connection = auto() diff --git a/app/filters/memodel_calibration_result.py b/app/filters/memodel_calibration_result.py new file mode 100644 index 00000000..3fc62974 --- /dev/null +++ b/app/filters/memodel_calibration_result.py @@ -0,0 +1,27 @@ +import uuid +from typing import Annotated + +from fastapi_filter import FilterDepends + +from app.db.model import MEModelCalibrationResult +from app.filters.base import CustomFilter +from app.filters.common import EntityFilterMixin + + +class MEModelCalibrationResultFilter( + CustomFilter, + EntityFilterMixin, +): + passed: bool | None = None + calibrated_entity_id: uuid.UUID | None = None + + order_by: list[str] = ["calibrated_entity_id"] # noqa: RUF012 + + class Constants(CustomFilter.Constants): + model = MEModelCalibrationResult + ordering_model_fields = ["calibrated_entity_id"] # noqa: RUF012 + + +MEModelCalibrationResultFilterDep = Annotated[ + MEModelCalibrationResultFilter, FilterDepends(MEModelCalibrationResultFilter) +] diff --git a/app/routers/__init__.py b/app/routers/__init__.py index 255dd5b0..1d8d7c79 100644 --- a/app/routers/__init__.py +++ b/app/routers/__init__.py @@ -20,6 +20,7 @@ license, measurement_annotation, memodel, + memodel_calibration_result, morphology, mtype, organization, @@ -54,6 +55,7 @@ license.router, measurement_annotation.router, memodel.router, + memodel_calibration_result.router, morphology.router, mtype.router, organization.router, diff --git a/app/routers/memodel_calibration_result.py b/app/routers/memodel_calibration_result.py new file mode 100644 index 00000000..9c67f3a1 --- /dev/null +++ b/app/routers/memodel_calibration_result.py @@ -0,0 +1,11 @@ +from fastapi import APIRouter + +import app.service.memodel_calibration_result + +router = APIRouter( + prefix="/memodel-calibration-result", + tags=["memodel-calibration-result"], +) +read_many = router.get("")(app.service.memodel_calibration_result.read_many) +read_one = router.get("/{id_}")(app.service.memodel_calibration_result.read_one) +create_one = router.post("")(app.service.memodel_calibration_result.create_one) diff --git a/app/schemas/me_model.py b/app/schemas/me_model.py index f407c443..1283a3bd 100644 --- a/app/schemas/me_model.py +++ b/app/schemas/me_model.py @@ -17,6 +17,7 @@ ) from app.schemas.contribution import ContributionReadWithoutEntity from app.schemas.emodel import EModelRead +from app.schemas.memodel_calibration_result import MEModelCalibrationResultRead from app.schemas.morphology import ReconstructionMorphologyRead @@ -25,8 +26,6 @@ class MEModelBase(BaseModel): name: str description: str validation_status: ValidationStatus = ValidationStatus.created - holding_current: float | None = None - threshold_current: float | None = None # To be used by entities who reference MEModel @@ -59,3 +58,4 @@ class MEModelRead( etypes: list[ETypeClassRead] | None morphology: ReconstructionMorphologyRead emodel: EModelRead + calibration_result: MEModelCalibrationResultRead | None diff --git a/app/schemas/memodel_calibration_result.py b/app/schemas/memodel_calibration_result.py new file mode 100644 index 00000000..9c536631 --- /dev/null +++ b/app/schemas/memodel_calibration_result.py @@ -0,0 +1,28 @@ +import uuid + +from pydantic import BaseModel + +from app.schemas.agent import CreatedByUpdatedByMixin +from app.schemas.base import ( + CreationMixin, + IdentifiableMixin, +) + + +class MEModelCalibrationResultBase(BaseModel): + """Base model for MEModel calibration results.""" + + holding_current: float + threshold_current: float + rin: float | None = None + calibrated_entity_id: uuid.UUID + + +class MEModelCalibrationResultRead( + MEModelCalibrationResultBase, CreationMixin, IdentifiableMixin, CreatedByUpdatedByMixin +): + """Read model for MEModel calibration results, including entity metadata.""" + + +class MEModelCalibrationResultCreate(MEModelCalibrationResultBase): + """Create model for MEModel calibration results.""" diff --git a/app/service/memodel.py b/app/service/memodel.py index d4ee0cfd..2e45e62f 100644 --- a/app/service/memodel.py +++ b/app/service/memodel.py @@ -14,6 +14,7 @@ Contribution, EModel, MEModel, + MEModelCalibrationResult, ReconstructionMorphology, ) from app.dependencies.auth import UserContextDep, UserContextWithProjectIdDep @@ -70,6 +71,8 @@ def _load(select: Select): joinedload(MEModel.etypes), joinedload(MEModel.created_by), joinedload(MEModel.updated_by), + joinedload(MEModel.calibration_result).joinedload(MEModelCalibrationResult.created_by), + joinedload(MEModel.calibration_result).joinedload(MEModelCalibrationResult.updated_by), raiseload("*"), ) diff --git a/app/service/memodel_calibration_result.py b/app/service/memodel_calibration_result.py new file mode 100644 index 00000000..01603b1e --- /dev/null +++ b/app/service/memodel_calibration_result.py @@ -0,0 +1,85 @@ +import uuid + +import sqlalchemy as sa +from sqlalchemy.orm import joinedload + +from app.db.model import MEModelCalibrationResult, Subject +from app.dependencies.auth import UserContextDep, UserContextWithProjectIdDep +from app.dependencies.common import ( + FacetsDep, + InBrainRegionDep, + PaginationQuery, + SearchDep, +) +from app.dependencies.db import SessionDep +from app.filters.memodel_calibration_result import MEModelCalibrationResultFilterDep +from app.queries.common import router_create_one, router_read_many, router_read_one +from app.schemas.memodel_calibration_result import ( + MEModelCalibrationResultCreate, + MEModelCalibrationResultRead, +) +from app.schemas.types import ListResponse + + +def _load(query: sa.Select): + return query.options( + joinedload(Subject.species), + ) + + +def read_one( + user_context: UserContextDep, + db: SessionDep, + id_: uuid.UUID, +) -> MEModelCalibrationResultRead: + return router_read_one( + db=db, + id_=id_, + db_model_class=MEModelCalibrationResult, + authorized_project_id=user_context.project_id, + response_schema_class=MEModelCalibrationResultRead, + apply_operations=_load, + ) + + +def create_one( + user_context: UserContextWithProjectIdDep, + json_model: MEModelCalibrationResultCreate, + db: SessionDep, +) -> MEModelCalibrationResultRead: + return router_create_one( + db=db, + user_context=user_context, + db_model_class=MEModelCalibrationResult, + json_model=json_model, + response_schema_class=MEModelCalibrationResultRead, + ) + + +def read_many( + user_context: UserContextDep, + db: SessionDep, + pagination_request: PaginationQuery, + filter_model: MEModelCalibrationResultFilterDep, + with_search: SearchDep, + facets: FacetsDep, + in_brain_region: InBrainRegionDep, +) -> ListResponse[MEModelCalibrationResultRead]: + aliases = {} + name_to_facet_query_params = {} + return router_read_many( + db=db, + filter_model=filter_model, + db_model_class=MEModelCalibrationResult, + with_search=with_search, + with_in_brain_region=in_brain_region, + facets=facets, + name_to_facet_query_params=name_to_facet_query_params, + apply_filter_query_operations=None, + apply_data_query_operations=_load, + aliases=aliases, + pagination_request=pagination_request, + response_schema_class=MEModelCalibrationResultRead, + authorized_project_id=user_context.project_id, + filter_joins=None, + ) diff --git a/tests/conftest.py b/tests/conftest.py index 38173532..8c160734 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -386,6 +386,22 @@ def validation_result_id(client, morphology_id): ).json()["id"] +@pytest.fixture +def memodel_calibration_result_id(client, memodel_id): + return assert_request( + client.post, + url="/memodel-calibration-result", + json={ + "name": "test_memodel_calibration_result", + "calibrated_entity_id": str(memodel_id), + "authorized_public": False, + "threshold_current": 0.8, + "holding_current": 0.2, + "rin": 100.0, # Optional field, can be None + }, + ).json()["id"] + + CreateIds = Callable[[int], list[str]] @@ -475,8 +491,6 @@ def _create_memodel_ids(count: int): emodel_id=emodel_id, authorized_public=False, authorized_project_id=PROJECT_ID, - holding_current=0, - threshold_current=0, ), ).id @@ -654,8 +668,6 @@ def faceted_memodels(db: Session, client: TestClient, agents: tuple[Agent, Agent emodel_id=emodel_id, authorized_public=False, authorized_project_id=PROJECT_ID, - holding_current=0, - threshold_current=0, ), ) diff --git a/tests/test_memodel.py b/tests/test_memodel.py index d7a933fa..497baa05 100644 --- a/tests/test_memodel.py +++ b/tests/test_memodel.py @@ -57,8 +57,6 @@ def test_create_memodel( "name": "Test MEModel Name", "morphology_id": morphology_id, "emodel_id": emodel_id, - "holding_current": 0, - "threshold_current": 0, }, ) assert response.status_code == 200, f"Failed to create memodel: {response.text}" @@ -490,8 +488,6 @@ def test_authorization( "strain_id": strain_id, "emodel_id": emodel_id, "morphology_id": morphology_id, - "holding_current": 0, - "threshold_current": 0, } public_obj = client_user_1.post( @@ -645,8 +641,6 @@ def create_model_function(_db, name, brain_region_id): morphology_id=morphology_id, emodel_id=emodel_id, authorized_project_id=PROJECT_ID, - holding_current=0, - threshold_current=0, ) check_brain_region_filter(ROUTE, client, db, brain_region_hierarchy_id, create_model_function) diff --git a/tests/test_memodel_calibration_result.py b/tests/test_memodel_calibration_result.py new file mode 100644 index 00000000..25e3e907 --- /dev/null +++ b/tests/test_memodel_calibration_result.py @@ -0,0 +1,119 @@ +import uuid + +import pytest +from fastapi.testclient import TestClient + +from app.db.model import MEModelCalibrationResult + +from .utils import assert_request + +MODEL = MEModelCalibrationResult +ROUTE = "/memodel-calibration-result" + + +@pytest.fixture +def json_data(memodel_id): + return { + "calibrated_entity_id": str(memodel_id), + "authorized_public": False, + "threshold_current": 0.8, + "holding_current": 0.2, + "rin": 100.0, # Optional field, can be None + } + + +@pytest.fixture +def create(client, json_data): + def _create(**kwargs): + return assert_request(client.post, url=ROUTE, json=json_data | kwargs).json() + + return _create + + +def _assert_read_response(data, json_data): + assert data["threshold_current"] == json_data["threshold_current"] + assert data["holding_current"] == json_data["holding_current"] + assert data["rin"] == json_data.get("rin") + assert data["calibrated_entity_id"] == json_data["calibrated_entity_id"] + assert data["created_by"]["id"] == data["updated_by"]["id"] + assert data["creation_date"] == data["update_date"] + + +def test_read_one(client: TestClient, memodel_calibration_result_id, json_data): + data = assert_request(client.get, url=f"{ROUTE}/{memodel_calibration_result_id}").json() + _assert_read_response(data, json_data) + assert data["id"] == memodel_calibration_result_id + + +def test_create_one(client: TestClient, json_data): + data = assert_request(client.post, url=ROUTE, json=json_data).json() + _assert_read_response(data, json_data) + + data = assert_request(client.get, url=f"{ROUTE}/{data['id']}").json() + _assert_read_response(data, json_data) + + data = assert_request(client.get, url=ROUTE).json()["data"][0] + _assert_read_response(data, json_data) + + +def test_missing(client): + response = client.get(f"{ROUTE}/{uuid.uuid4()}") + assert response.status_code == 404 + + response = client.get(f"{ROUTE}/notauuid") + assert response.status_code == 422 + + +def test_filtering__one_entry(client, memodel_calibration_result_id, memodel_id, morphology_id): + # no results expected for unrelated id + data = assert_request( + client.get, + url=ROUTE, + params={"calibrated_entity_id": str(morphology_id)}, + ).json()["data"] + + assert len(data) == 0 + + data = assert_request( + client.get, + url=ROUTE, + params={"calibrated_entity_id": str(memodel_id)}, + ).json()["data"] + + assert len(data) == 1 + assert data[0]["calibrated_entity_id"] == str(memodel_id) + assert data[0]["id"] == str(memodel_calibration_result_id) + + +def test_memodel_relationship(client, memodel_id, memodel_calibration_result_id): + data = assert_request(client.get, url=f"memodel/{memodel_id}").json() + assert data["calibration_result"]["id"] == str(memodel_calibration_result_id) + assert data["calibration_result"]["calibrated_entity_id"] == str(memodel_id) + + +@pytest.fixture +def models(create, memodel_id): + return [ + create( + threshold_current=0.5, + holding_current=0.1, + calibrated_entity_id=str(memodel_id), + ), + create( + threshold_current=0.5, + holding_current=0.1, + calibrated_entity_id=str(memodel_id), + ), + ] + + +def test_filtering__many_entries(client, models, memodel_id): + data = assert_request( + client.get, + url=ROUTE, + params={"calibrated_entity_id": str(memodel_id)}, + ).json()["data"] + + assert len(data) == 2 + assert data[0]["calibrated_entity_id"] == models[0]["calibrated_entity_id"] + assert data[1]["calibrated_entity_id"] == models[1]["calibrated_entity_id"] diff --git a/tests/test_single_neuron_simulation.py b/tests/test_single_neuron_simulation.py index 769059dc..7f7bdfa0 100644 --- a/tests/test_single_neuron_simulation.py +++ b/tests/test_single_neuron_simulation.py @@ -176,8 +176,6 @@ def test_pagination(db, client, brain_region_id, emodel_id, morphology_id, speci emodel_id=emodel_id, morphology_id=morphology_id, species_id=species_id, - holding_current=0, - threshold_current=0, ), ) me_model_2 = add_db( @@ -190,8 +188,6 @@ def test_pagination(db, client, brain_region_id, emodel_id, morphology_id, speci emodel_id=emodel_id, morphology_id=morphology_id, species_id=species_id, - holding_current=0, - threshold_current=0, ), ) @@ -244,8 +240,6 @@ def faceted_ids(db, brain_region_hierarchy_id, emodel_id, morphology_id, species "emodel_id": emodel_id, "morphology_id": morphology_id, "species_id": species_id, - "holding_current": 0, - "threshold_current": 0, }, ) for i in range(2) @@ -343,8 +337,6 @@ def create_model_function(db, name, brain_region_id): "emodel_id": emodel_id, "morphology_id": morphology_id, "species_id": species_id, - "holding_current": 0, - "threshold_current": 0, }, ) ) diff --git a/tests/test_single_neuron_synaptome.py b/tests/test_single_neuron_synaptome.py index 5adf1be8..4b5c735e 100644 --- a/tests/test_single_neuron_synaptome.py +++ b/tests/test_single_neuron_synaptome.py @@ -194,8 +194,6 @@ def test_pagination(db, client, brain_region_id, emodel_id, morphology_id, speci emodel_id=emodel_id, morphology_id=morphology_id, species_id=species_id, - holding_current=0, - threshold_current=0, ), ) me_model_2 = add_db( @@ -208,8 +206,6 @@ def test_pagination(db, client, brain_region_id, emodel_id, morphology_id, speci emodel_id=emodel_id, morphology_id=morphology_id, species_id=species_id, - holding_current=0, - threshold_current=0, ), ) @@ -355,8 +351,6 @@ def create_model_function(db, name, brain_region_id): emodel_id=emodel_id, morphology_id=morphology_id, species_id=species_id, - holding_current=0, - threshold_current=0, ), ).id ) diff --git a/tests/test_single_neuron_synaptome_simulation.py b/tests/test_single_neuron_synaptome_simulation.py index 209efb19..5abf5ddc 100644 --- a/tests/test_single_neuron_synaptome_simulation.py +++ b/tests/test_single_neuron_synaptome_simulation.py @@ -383,8 +383,6 @@ def create_model_function(db, name, brain_region_id): emodel_id=emodel_id, morphology_id=morphology_id, species_id=species_id, - holding_current=0.0, - threshold_current=0.0, ), ).id )