Skip to content

Commit 3a74e5f

Browse files
Working changes
1 parent 758a2b0 commit 3a74e5f

File tree

7 files changed

+92
-6
lines changed

7 files changed

+92
-6
lines changed

src/api/entitycore/types/extended-entity-type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const ExtendedEntitiesTypeDict = {
99
MEModelCircuitSimulation: 'me_model_circuit_simulation',
1010
PairedNeuronCircuitSimulation: 'paired_neuron_circuit_simulation',
1111
SmallMicrocircuitSimulation: 'small_microcircuit_simulation',
12+
IonChannelFitting: 'ion_channel_fitting',
1213
MicrocircuitSimulation: 'micro_circuit_simulation',
1314
NGVCircuit: 'ngv_circuit', // this is temporary
1415
BrainRegion: 'brain_region', // this is temporary
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
'use client';
2+
3+
import { useQuery, useSuspenseQuery } from '@tanstack/react-query';
4+
import { notFound } from 'next/navigation';
5+
import { use } from 'react';
6+
7+
import { getCircuit } from '@/api/entitycore/queries/model/circuit';
8+
import { resolveSimulationByCampaignId } from '@/entity-configuration/domain/simulation/small-microcircuit-simulation';
9+
import SimulationConfig from '@/features/small-microcircuit';
10+
import { keyBuilder } from '@/ui/use-query-keys/data';
11+
12+
import type { ServerSideComponentProp, WorkspaceContext } from '@/types/common';
13+
import type { WorkflowSimulatePanelKeys } from '@/ui/segments/workflows/simulate/single-neuron/shared/constant';
14+
import type { ExperimentStepKeys } from '@/ui/segments/workflows/simulate/single-neuron/shared/elements/menu';
15+
16+
export default function Page({
17+
searchParams,
18+
params: pathParams,
19+
}: ServerSideComponentProp<
20+
WorkspaceContext & { id: string },
21+
{
22+
step: ExperimentStepKeys;
23+
sessionId: string;
24+
panel: WorkflowSimulatePanelKeys;
25+
initialCampaignId: string;
26+
}
27+
>) {
28+
const queryParams = use(searchParams);
29+
const { initialCampaignId } = queryParams;
30+
const { virtualLabId, projectId, id: modelId } = use(pathParams);
31+
32+
let sessionId = queryParams?.sessionId;
33+
if (!sessionId) sessionId = crypto.randomUUID();
34+
35+
const { data: entity } = useSuspenseQuery({
36+
queryKey: [modelId],
37+
queryFn: () =>
38+
modelId ? getCircuit({ id: "cbeba583-c905-47c6-96b7-b7923d4fcefd", context: { virtualLabId, projectId } }) : null,
39+
});
40+
41+
const {
42+
data: campaignData,
43+
error,
44+
isLoading,
45+
} = useQuery({
46+
queryKey: keyBuilder.simCampaign({ entityId: initialCampaignId }),
47+
queryFn: async () => {
48+
if (!initialCampaignId) return null;
49+
return await resolveSimulationByCampaignId({
50+
id: initialCampaignId,
51+
context: { virtualLabId, projectId },
52+
});
53+
},
54+
});
55+
56+
if (error || !entity) {
57+
return notFound();
58+
}
59+
60+
if (
61+
!initialCampaignId ||
62+
(initialCampaignId && !isLoading && campaignData && campaignData.config.form)
63+
) {
64+
return (
65+
<div className="border-neutral-2 ml-2 h-full rounded-2xl border pt-3">
66+
<SimulationConfig
67+
modelId={entity.id}
68+
virtualLabId={virtualLabId}
69+
projectId={projectId}
70+
initialConfig={campaignData?.config.form}
71+
className="px-10 pt-2"
72+
/>
73+
</div>
74+
);
75+
}
76+
}

src/features/small-microcircuit/_components/hooks/schema.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ export function useObioneJsonSchema(
2727
const json = await res.json();
2828
const dereferenced = await $RefParser.dereference(json);
2929
const schemaName = match(modelEntityType)
30-
.with(EntityTypeDict.Circuit, () => 'IonChannelFittingScanConfig')
30+
.with(EntityTypeDict.Circuit, () => 'CircuitSimulationGenerationScanConfig')
3131
.with(EntityTypeDict.Memodel, () => 'MEModelSimulationScanConfig')
32+
.with(EntityTypeDict.IonChannelRecording, () => 'IonChannelFittingScanConfig')
3233
.otherwise(() => {
3334
throw new Error(`Unsupported entity type: ${modelEntityType}`);
3435
});
@@ -80,6 +81,7 @@ export function useObioneJsonSchema(
8081
const formCircuitType = match(modelEntityType)
8182
.with(EntityTypeDict.Circuit, () => 'CircuitFromID')
8283
.with(EntityTypeDict.Memodel, () => 'MEModelFromID')
84+
.with(EntityTypeDict.IonChannelRecording, () => 'CircuitFromID')
8385
.otherwise(() => {
8486
throw new Error(`Unsupported entity type: ${modelEntityType}`);
8587
});

src/features/small-microcircuit/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ export default function SimulationCampaignConfiguration({
132132
const apiPath = match(model.type)
133133
.with(EntityTypeDict.Circuit, () => 'circuit-simulation-scan-config-generate-grid')
134134
.with(EntityTypeDict.Memodel, () => 'me-model-simulation-scan-config-generate-grid')
135+
.with(EntityTypeDict.IonChannelModel, () => 'ion-channel-model-simulation-scan-config-generate-grid')
135136
.otherwise(() => {
136137
throw new Error(`Unsupported model type ${model.type}`);
137138
});

src/ui/segments/detail-view/overview/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export default async function Overview({
8585
if (
8686
extendedType === ExtendedEntitiesTypeDict.SmallMicrocircuitSimulation ||
8787
extendedType === ExtendedEntitiesTypeDict.PairedNeuronCircuitSimulation ||
88-
extendedType === ExtendedEntitiesTypeDict.MEModelCircuitSimulation
88+
extendedType === ExtendedEntitiesTypeDict.MEModelCircuitSimulation ||
8989
) {
9090
let config: AwaitedType<ReturnType<typeof resolveSimulationByCampaignId>>;
9191

src/ui/segments/project/activities/elements/helpers.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ export const Scales: Partial<
104104
simulate: ExtendedEntitiesTypeDict.PairedNeuronCircuitSimulation,
105105
link: 'workflows',
106106
},
107+
[ExtendedEntitiesTypeDict.IonChannelModel]: {
108+
title: 'Ion channel models',
109+
build: null,
110+
simulate: ExtendedEntitiesTypeDict.IonChannelFitting,
111+
link: 'explore',
112+
},
107113
};
108114

109115
// here the function should return the available activities for the scale as build , simulate

src/ui/segments/workflows/elements/helpers.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ export const EntityWorkflowConfiguration: Partial<
5959
}
6060
>
6161
> = {
62-
[ExtendedEntitiesTypeDict.IonChannelModel]: {
62+
[ExtendedEntitiesTypeDict.IonChannelRecording]: {
6363
group: EntityScopeDict.Subcellular,
6464
label: 'Ion channel',
6565
properties: {
6666
build: {
6767
disabled: true,
68-
type: ExtendedEntitiesTypeDict.IonChannelModel,
68+
type: ExtendedEntitiesTypeDict.IonChannelRecording,
6969
},
7070
simulate: {
71-
disabled: true,
72-
type: ExtendedEntitiesTypeDict.IonChannelModel,
71+
disabled: false,
72+
type: ExtendedEntitiesTypeDict.IonChannelFitting,
7373
},
7474
},
7575
},

0 commit comments

Comments
 (0)