From e3efcb8349a7f717f82695d57b1896ba91016661 Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Fri, 27 May 2022 13:59:51 +0100 Subject: [PATCH 1/7] #530 export to python issues --- netpyne_ui/netpyne_geppetto.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netpyne_ui/netpyne_geppetto.py b/netpyne_ui/netpyne_geppetto.py index e0b04036..b43f9d71 100644 --- a/netpyne_ui/netpyne_geppetto.py +++ b/netpyne_ui/netpyne_geppetto.py @@ -950,8 +950,8 @@ def header(title, spacer='-'): with open(fname, 'w') as script: script.write("from netpyne import specs, sim\n") script.write(header("documentation")) - script.write("Script generated with NetPyNE-UI. Please visit:\n") - script.write(" - https://www.netpyne.org\n - https://github.com/MetaCell/NetPyNE-UI\n\n") + script.write("# Script generated with NetPyNE-UI. Please visit:\n") + script.write("# - https://www.netpyne.org\n# - https://github.com/MetaCell/NetPyNE-UI\n\n") script.write(header("script", spacer="=")) script.write("netParams = specs.NetParams()\n") script.write("simConfig = specs.SimConfig()\n") @@ -965,7 +965,7 @@ def header(title, spacer='-'): script.write(header("network attributes")) for param in params: for key, value in list(getattr(self.netParams, param).items()): - script.write("netParams." + param + "[" + key + "] = ") + script.write("netParams." + param + "['" + key + "'] = ") script.write(convert2bool(json.dumps(value, indent=4)) + "\n") script.write(header("network configuration")) From 57254dd230e41800a163bc59904d231d128c62bf Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Fri, 27 May 2022 14:00:42 +0100 Subject: [PATCH 2/7] #447 revisiting rxd extracellular, part 1 --- webapp/components/rxd/RxdRegion.js | 55 +++++++++++++++++++---------- webapp/components/rxd/RxdRegions.js | 4 +++ 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/webapp/components/rxd/RxdRegion.js b/webapp/components/rxd/RxdRegion.js index 88aa109b..7d343ce4 100644 --- a/webapp/components/rxd/RxdRegion.js +++ b/webapp/components/rxd/RxdRegion.js @@ -9,6 +9,7 @@ import { } from 'netpyne/components'; import MenuItem from '@material-ui/core/MenuItem'; import RxdNoData from './RxdNoData'; +import Utils from '../../Utils'; const useStyles = makeStyles((theme) => ({ root: { @@ -21,6 +22,7 @@ const useStyles = makeStyles((theme) => ({ const RxdRegion = (props) => { const classes = useStyles(); const baseTag = `netParams.rxdParams['regions']['${props.id}']`; + const extracellularTag = "netParams.rxdParams['extracellular']"; const postProcessPops = (pythonData) => { let results = []; @@ -56,6 +58,18 @@ const RxdRegion = (props) => { return results; }; + const activateExtracellular = () => { + if (props.extracellular) { + // Utils.execPythonMessage( + // "del netpyne_geppetto.netParams.rxdParams['regions']['extracellular']", + // ); + } else { + // Utils.execPythonMessage( + // "netpyne_geppetto.netParams.rxdParams['regions']['extracellular'] = {}", + // ); + } + }; + return ( <> { !props.id && ( @@ -86,29 +100,12 @@ const RxdRegion = (props) => { - - - - - - - - - { model={`${baseTag}['dx']`} /> + + +
+ + + { model={`${baseTag}['zhi']`} /> - - + + + + +
diff --git a/webapp/components/rxd/RxdRegions.js b/webapp/components/rxd/RxdRegions.js index 862bd783..4c465f67 100644 --- a/webapp/components/rxd/RxdRegions.js +++ b/webapp/components/rxd/RxdRegions.js @@ -29,6 +29,9 @@ const RxdRegions = (props) => { Utils.execPythonMessage( "netpyne_geppetto.netParams.rxdParams['regions'] = {}", ); + Utils.execPythonMessage( + "netpyne_geppetto.netParams.rxdParams['extracellular'] = {}", + ); } Utils.execPythonMessage( `netpyne_geppetto.netParams.rxdParams['regions']['${newRegion}'] = {}`, @@ -100,6 +103,7 @@ const RxdRegions = (props) => { id={props?.regions ? regions[tab] : undefined} onAddRegion={props.onAddRegion} controlledRegion={props?.regions ? props.regions[regions[tab]] : undefined} + extracellular={props?.extracellular ? props?.extracellular : undefined} /> From 0d492cb783f984bc877f1bd53218f9cbe546089f Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Fri, 27 May 2022 19:42:35 +0100 Subject: [PATCH 3/7] #524 fixing space in experiment name --- webapp/components/experiments/ExperimentEdit.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webapp/components/experiments/ExperimentEdit.js b/webapp/components/experiments/ExperimentEdit.js index 2341b7cf..5530fc62 100644 --- a/webapp/components/experiments/ExperimentEdit.js +++ b/webapp/components/experiments/ExperimentEdit.js @@ -480,8 +480,9 @@ const ExperimentEdit = (props) => { }; const setExperimentNameInfo = (val) => { - validateExperimentName(val); - setExperimentName(val); + const name = val.replace(' ', '_'); + validateExperimentName(name); + setExperimentName(name); }; return ( From b18c1c58e45d3e89379ca73d195a34b3063ba4ed Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Tue, 31 May 2022 19:37:51 +0100 Subject: [PATCH 4/7] #447 more on the rxd --- netpyne_ui/netpyne_geppetto.py | 2 +- webapp/components/rxd/Rxd.js | 1 + webapp/components/rxd/RxdConstants.js | 13 -- webapp/components/rxd/RxdRegion.js | 217 +++++++++++++++++++++++--- 4 files changed, 196 insertions(+), 37 deletions(-) diff --git a/netpyne_ui/netpyne_geppetto.py b/netpyne_ui/netpyne_geppetto.py index c70190e8..a58f3f7a 100644 --- a/netpyne_ui/netpyne_geppetto.py +++ b/netpyne_ui/netpyne_geppetto.py @@ -824,7 +824,7 @@ def getAvailableCellTypes(self): def getAvailableRxDSections(self, selectedRegion): sections = set([]) sections.add('all') - if self.netParams.rxdParams.regions[selectedRegion].get('cells'): + if selectedRegion in self.netParams.rxdParams.regions and self.netParams.rxdParams.regions[selectedRegion].get('cells'): if 'all' in self.netParams.rxdParams.regions[selectedRegion]['cells']: for cellRule in self.netParams.cellParams: for cellSect in self.netParams.cellParams[cellRule]['secs']: diff --git a/webapp/components/rxd/Rxd.js b/webapp/components/rxd/Rxd.js index f20e9bcf..82de0d09 100644 --- a/webapp/components/rxd/Rxd.js +++ b/webapp/components/rxd/Rxd.js @@ -276,6 +276,7 @@ class Rxd extends React.Component { ); } else if (value === 1) { diff --git a/webapp/components/rxd/RxdConstants.js b/webapp/components/rxd/RxdConstants.js index 4a60a9ef..aa47ad70 100644 --- a/webapp/components/rxd/RxdConstants.js +++ b/webapp/components/rxd/RxdConstants.js @@ -16,19 +16,6 @@ import AddIcon from '@material-ui/icons/Add'; import FontIcon from '@material-ui/core/Icon'; import Utils from '../../Utils'; import { - bgDarkest, - bgLight, - bgRegular, - secondaryColor, - fontColor, - radius, - primaryColor, - experimentInputColor, - experimentFieldColor, - experimentSvgColor, - experimentLabelColor, - experimentAutocompleteBorder, - errorFieldBorder, tabsTextColor, } from '../../theme'; diff --git a/webapp/components/rxd/RxdRegion.js b/webapp/components/rxd/RxdRegion.js index 7d343ce4..58e6d427 100644 --- a/webapp/components/rxd/RxdRegion.js +++ b/webapp/components/rxd/RxdRegion.js @@ -1,15 +1,28 @@ -import React from 'react'; +import React, { useState } from 'react'; import { makeStyles } from '@material-ui/core/styles'; +import { + Chip, + Button, + MenuItem, + TextField, +} from '@material-ui/core'; +import AddIcon from '@material-ui/icons/Add'; +import FontIcon from '@material-ui/core/Icon'; import { NetPyNEField, NetPyNETextField, SelectField, + ListComponent, NetPyNECheckbox, NetPyNESelectField, } from 'netpyne/components'; -import MenuItem from '@material-ui/core/MenuItem'; +import Select from 'netpyne/components/general/Select'; import RxdNoData from './RxdNoData'; import Utils from '../../Utils'; +import { geometryClasses, geometryStrings } from '../../constants'; +import { + tabsTextColor, +} from '../../theme'; const useStyles = makeStyles((theme) => ({ root: { @@ -21,8 +34,19 @@ const useStyles = makeStyles((theme) => ({ const RxdRegion = (props) => { const classes = useStyles(); + const [variable, setVariable] = useState(''); + const [parameter, setParameter] = useState(''); const baseTag = `netParams.rxdParams['regions']['${props.id}']`; const extracellularTag = "netParams.rxdParams['extracellular']"; + let updateDone = true; + let dxField = ( + + ); + let geometryExtras = (<>); const postProcessPops = (pythonData) => { let results = []; @@ -59,17 +83,150 @@ const RxdRegion = (props) => { }; const activateExtracellular = () => { - if (props.extracellular) { - // Utils.execPythonMessage( - // "del netpyne_geppetto.netParams.rxdParams['regions']['extracellular']", - // ); + if (!props?.extracellular?.extracellular) { + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['dx'] = ''`, + ); } else { - // Utils.execPythonMessage( - // "netpyne_geppetto.netParams.rxdParams['regions']['extracellular'] = {}", - // ); + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['dx'] = list()`, + ); + } + }; + + if (props?.extracellular?.extracellular === true) { + dxField = ( + + ); + } + + const addGeometryArgs = (item) => { + if (!props?.controlledRegion?.geometry?.args) { + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry']['args'] = {}`, + ); + } + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry']['args']['${parameter}'] = '${variable}'`, + ); + setVariable(''); + setParameter(''); + }; + + const handleGeometry = (value) => { + if (geometryClasses.includes(value.target.value)) { + if (props?.controlledRegion?.geometry?.class === undefined) { + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry'] = { 'class': '${value.target.value}'}`, + ); + } else if (value.target.value !== props.controlledRegion.geometry.class) { + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry']['class'] = '${value.target.value}'`, + ); + } + } else if (geometryStrings.includes(value.target.value)) { + if (value.target.value !== props.controlledRegion.geometry) { + Utils.execPythonMessage( + `netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry'] = '${value.target.value}'`, + ); + } + geometryExtras = (<>); } }; + if (typeof props.controlledRegion?.geometry === 'string' || props.controlledRegion?.geometry instanceof String) { + handleGeometry({ target: { value: props.controlledRegion?.geometry } }); + } else if (typeof props.controlledRegion?.geometry?.class === 'string' || props.controlledRegion?.geometry?.class instanceof String) { + handleGeometry({ target: { value: props.controlledRegion?.geometry.class } }); + geometryExtras = ( + <> +
+
+ setParameter(e.target.value)} + value={parameter} + /> +
+
+ setVariable(e.target.value)} + value={variable} + /> +
+
+ +
+
+ {Object?.keys(props?.controlledRegion?.geometry?.args || {}).map((item) => ( +
+
+ +
+
+ +
+
+ } + onClick={(event) => { + Utils.execPythonMessage( + `del netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry']['args']['${event.currentTarget.parentElement.id}']`, + ); + }} + onDelete={(event) => { + Utils.execPythonMessage( + `del netpyne_geppetto.netParams.rxdParams['regions']['${props.id}']['geometry']['args']['${event.currentTarget.parentElement.id}']`, + ); + }} + /> +
+
+ ))} + ); + } + + return ( <> { !props.id && ( @@ -107,15 +264,21 @@ const RxdRegion = (props) => { /> - + {dxField} - + + {geometryExtras}
@@ -127,57 +290,65 @@ const RxdRegion = (props) => {
From bdeff86dca663f438318bc351853b466a19cad97 Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Wed, 1 Jun 2022 12:39:30 +0100 Subject: [PATCH 5/7] #447 rxd finished --- webapp/components/general/List.js | 2 + webapp/components/rxd/Rxd.js | 3 +- webapp/components/rxd/RxdExtracellular.js | 107 ------------ webapp/components/rxd/RxdExtracellulars.js | 192 ++++++++++++--------- webapp/components/rxd/RxdNoData.js | 10 +- 5 files changed, 122 insertions(+), 192 deletions(-) delete mode 100644 webapp/components/rxd/RxdExtracellular.js diff --git a/webapp/components/general/List.js b/webapp/components/general/List.js index 8cc08327..136ef083 100644 --- a/webapp/components/general/List.js +++ b/webapp/components/general/List.js @@ -293,12 +293,14 @@ class ListComponent extends Component { ({ }, '& .MuiTabs-scroller': { borderBottom: `0.0625rem solid ${navShadow}`, - } + }, }, button: { @@ -325,6 +325,7 @@ class Rxd extends React.Component { tabPanelContent = ( ); diff --git a/webapp/components/rxd/RxdExtracellular.js b/webapp/components/rxd/RxdExtracellular.js deleted file mode 100644 index 0acd3dda..00000000 --- a/webapp/components/rxd/RxdExtracellular.js +++ /dev/null @@ -1,107 +0,0 @@ -import React from 'react'; -import { makeStyles } from '@material-ui/core/styles'; -import { - NetPyNEField, - NetPyNETextField, -} from 'netpyne/components'; -import RxdNoData from './RxdNoData'; - -const useStyles = makeStyles((theme) => ({ - root: { - overflow: 'hidden', - display: 'flex', - alignItems: 'stretch', - }, -})); - -const RxdExtracellular = (props) => { - const classes = useStyles(); - const baseTag = `netParams.rxdParams['extracellular']['${props.id}']`; - - return ( - <> - { !props.id && ( - <> - - - )} - { props.id && ( -
-
- - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - -
-
- )} - - ); -}; - -export default RxdExtracellular; diff --git a/webapp/components/rxd/RxdExtracellulars.js b/webapp/components/rxd/RxdExtracellulars.js index b6c7e653..c31464b4 100644 --- a/webapp/components/rxd/RxdExtracellulars.js +++ b/webapp/components/rxd/RxdExtracellulars.js @@ -1,13 +1,13 @@ import React, { useState } from 'react'; -import FontIcon from '@material-ui/core/Icon'; import { - Box, - Tabs, - Tab, - Chip, -} from '@material-ui/core'; + NetPyNEField, + ListComponent, + NetPyNECheckbox, + NetPyNETextField, +} from 'netpyne/components'; +import { makeStyles } from '@material-ui/core/styles'; +import RxdNoData from './RxdNoData'; import Utils from '../../Utils'; -import RxdExtracellular from './RxdExtracellular'; function a11yProps (index) { return { @@ -16,88 +16,118 @@ function a11yProps (index) { }; } -const RxdExtracellulars = (props) => { - const [tab, setTab] = React.useState(0); - const [extraCounter, setExtraCounter] = useState(0); +const useStyles = makeStyles((theme) => ({ + root: { + overflow: 'hidden', + display: 'flex', + alignItems: 'stretch', + }, +})); - const addSingleExtra = () => { - const newCounter = extraCounter + 1; - const newExtra = `extracellular${extraCounter}`; - if (!props.extracellular) { - Utils.execPythonMessage( - "netpyne_geppetto.netParams.rxdParams['extracellular'] = {}", - ); - } - Utils.execPythonMessage( - `netpyne_geppetto.netParams.rxdParams['extracellular']['${newExtra}'] = {}`, - ); - setExtraCounter(newCounter); - props.onAddExtracellular(newExtra); - }; +const RxdExtracellulars = (props) => { + const classes = useStyles(); + const baseTag = "netParams.rxdParams['extracellular']"; - let extras = []; - if (props.extracellular) { - extras = Object.keys(props.extracellular); + let regions = []; + if (props.regions) { + regions = Object.keys(props.regions); } return ( <> - { extras.length > 0 + { regions.length > 0 ? ( - - setTab(newTabValue)} - scrollButtons="auto" - indicatorColor="primary" - > - { - extras.map((region, index) => ( - } - onClick={(event) => { - const clickedRegion = event.currentTarget.parentElement.id; - const regionIndex = extras.indexOf(clickedRegion); - if (tab !== regionIndex) { - setTab(regionIndex); - } - }} - onDelete={(event) => { - Utils.execPythonMessage( - `del netpyne_geppetto.netParams.rxdParams['extracellular']['${event.currentTarget.parentElement.id}']`, - ); - const newRegions = Object.keys(props.extracellular).filter((item) => item !== event.currentTarget.parentElement.id); - if (newRegions.length > 0) { - setTab(newRegions.length - 1); - } else { - props.onAddExtracellular(event.currentTarget.parentElement.id); - } - }} - /> - )} - {...a11yProps(index)} - /> - )) - } - - +
+
+ + { console.log('test'); }} + /> + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + +
+
) - : <> } - - <> - - + : ( + <> + + + )} ); }; + export default RxdExtracellulars; diff --git a/webapp/components/rxd/RxdNoData.js b/webapp/components/rxd/RxdNoData.js index d2877b16..affbbdcb 100644 --- a/webapp/components/rxd/RxdNoData.js +++ b/webapp/components/rxd/RxdNoData.js @@ -37,9 +37,13 @@ const RxdNoData = (props) => { {message} - + {callback && callbackText + ? ( + + ) + : (<>)} ); }; From 4b19bc58170582cd0802e95f01d81d7c735396d8 Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Wed, 1 Jun 2022 12:39:43 +0100 Subject: [PATCH 6/7] #447 missing constants --- webapp/constants.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/webapp/constants.js b/webapp/constants.js index a742f353..d549edcb 100644 --- a/webapp/constants.js +++ b/webapp/constants.js @@ -683,3 +683,16 @@ export const LAUNCH_MODAL = { defaultResource: 'Local Machine', errorText: 'Please check the input', }; + +export const geometryClasses = [ + 'DistributedBoundary', + 'FractionalVolume', + 'FixedCrossSection', + 'ScalableBorder', + 'Shell', +]; + +export const geometryStrings = [ + 'inside', + 'membrane', +]; From 60cb2806e48f4082400c75ea02490aefae9330c6 Mon Sep 17 00:00:00 2001 From: Dario Del Piano Date: Wed, 1 Jun 2022 14:24:18 +0100 Subject: [PATCH 7/7] #527 adding ny_model to build --- Dockerfile | 3 +++ requirements.txt | 1 + 2 files changed, 4 insertions(+) diff --git a/Dockerfile b/Dockerfile index d4a3d17e..0ad89263 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,6 +32,9 @@ RUN npm install --global yarn RUN npm install --global yalc RUN python install.py ${BUILD_ARGS} --geppetto ${GEPPETTO_VERSION} +# Temp fixes for eeg plots +RUN wget -P `pip show LFPykit | grep "Location:" | awk '{print $2"/lfpykit"}'` https://www.parralab.org/nyhead/sa_nyhead.mat + WORKDIR ${INSTALLATION_FOLDER} RUN pip install -r requirements-test.txt diff --git a/requirements.txt b/requirements.txt index 6b24bda8..733a41ce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,6 +15,7 @@ defusedxml==0.6.0 Deprecated==1.2.10 entrypoints==0.3 future==0.18.2 +h5py==3.7.0 idna==2.9 ipython-genutils==0.2.0 ipywidgets==7.5.1